Private/Invoke-GkGraphRequest.ps1
|
function Invoke-GkGraphRequest { <# .SYNOPSIS Single internal chokepoint for all Microsoft Graph traffic in PSGraphKit. .DESCRIPTION Centralizes, on top of the Invoke-GkRawGraphCall seam: * Base-URL/version prefixing (relative URIs) and passthrough of absolute nextLinks. * Automatic pagination: follows @odata.nextLink to completion, re-injecting custom headers (e.g. ConsistencyLevel) on every page since Graph does not carry them over. * 429/503 throttling: honors Retry-After, else bounded exponential backoff with jitter. * Curated error translation for permission (403), auth (401), and query (400) failures, enriched with the caller's active roles, while preserving the raw Graph error/request-id. * Optional one-shot beta fallback (opt-in, off by default; unused in Phase 1). Not exported. Public functions call this, never Invoke-MgGraphRequest directly. .OUTPUTS By default, the flattened array of collection items (all pages). With -Raw, the raw first-page body (Hashtable, or a scalar for /$count). #> [CmdletBinding()] param( [Parameter(Mandatory)] [string] $Uri, [ValidateSet('GET', 'POST', 'PATCH', 'DELETE')] [string] $Method = 'GET', [hashtable] $Body, [hashtable] $Headers, [ValidateSet('v1.0', 'beta')] [string] $ApiVersion = 'v1.0', [switch] $BetaFallback, # Return the raw first-page body instead of accumulating/unwrapping 'value'. # Used for single-entity reads and /$count endpoints. [switch] $Raw, [ValidateRange(0, 10)] [int] $MaxRetry = 5, # Cap the number of collection items returned (0 = unlimited): stop following @odata.nextLink # once this many have accumulated, then trim to exactly this count. For "N most-recent" reads # over time-ordered logs (Graph returns them newest-first). [ValidateRange(0, 500000)] [int] $MaxResult = 0, # Name of the public function on whose behalf this runs; drives role hints in 403 messages. [string] $CallerFunction, # Set by Get-GkCurrentUserRole to prevent recursive role enrichment on its own 403. [switch] $SuppressRoleEnrichment ) # --- Build the initial URI ------------------------------------------------------------- if ($Uri -match '^https?://') { $current = $Uri } else { $current = '{0}/{1}/{2}' -f $script:GkGraphBaseUri, $ApiVersion, $Uri.TrimStart('/') } $doPaging = (-not $Raw) -and ($Method -eq 'GET') # only GET collections paginate $triedBeta = $false $items = [System.Collections.Generic.List[object]]::new() $attempt = 0 while ($true) { $requestParams = @{ Method = $Method; Uri = $current } if ($Headers) { $requestParams['Headers'] = $Headers } # re-passed every page on purpose if ($Body) { $requestParams['Body'] = $Body } try { $callResult = Invoke-GkRawGraphCall -RequestParams $requestParams } catch { # Transport-level failure (DNS, TLS, no connectivity) — no HTTP status available. $ex = [System.Exception]::new( "PSGraphKit could not reach Microsoft Graph at '$current': $($_.Exception.Message)", $_.Exception) $er = [System.Management.Automation.ErrorRecord]::new( $ex, 'GkGraph_TransportFailure', [System.Management.Automation.ErrorCategory]::ConnectionError, $current) $PSCmdlet.ThrowTerminatingError($er) } $sc = $callResult.StatusCode $rh = $callResult.Headers $response = $callResult.Body # --- Success ---------------------------------------------------------------------- if ($sc -ge 200 -and $sc -lt 300) { $attempt = 0 if ($Raw) { return $response } if ($response -is [System.Collections.IDictionary] -and $response.Contains('value')) { foreach ($v in @($response['value'])) { $items.Add($v) } if ($MaxResult -gt 0 -and $items.Count -ge $MaxResult) { return , @($items.ToArray() | Select-Object -First $MaxResult) # cap reached; stop paging } $next = if ($response.Contains('@odata.nextLink')) { $response['@odata.nextLink'] } else { $null } if ($doPaging -and $next) { $current = [string]$next continue } return , $items.ToArray() } # Single entity or scalar response — nothing to page. return $response } # --- Throttling / transient (429, 503) -------------------------------------------- if ($sc -eq 429 -or $sc -eq 503) { $attempt++ if ($attempt -gt $MaxRetry) { $ex = [System.Exception]::new( "Microsoft Graph is throttling PSGraphKit (HTTP $sc) and did not recover after $MaxRetry retries calling '$current'. Try again later or narrow the query.") $er = [System.Management.Automation.ErrorRecord]::new( $ex, "GkGraph_Throttled_$sc", [System.Management.Automation.ErrorCategory]::LimitsExceeded, $current) $PSCmdlet.ThrowTerminatingError($er) } $retryAfter = Get-GkResponseHeader $rh 'Retry-After' [int] $ra = 0 if ($retryAfter -and [int]::TryParse($retryAfter, [ref] $ra) -and $ra -gt 0) { $delay = [double] $ra } else { $delay = [Math]::Min([Math]::Pow(2, $attempt), 60) + (Get-Random -Minimum 0 -Maximum 1000) / 1000.0 } Write-Verbose ("PSGraphKit: HTTP {0} on attempt {1}/{2}; backing off {3:N1}s." -f $sc, $attempt, $MaxRetry, $delay) Start-Sleep -Seconds $delay continue } # --- One-shot beta fallback (opt-in, off by default; unused in Phase 1) ----------- if ($BetaFallback -and -not $triedBeta -and ($sc -eq 404 -or $sc -eq 400) -and $current -match '/v1\.0/') { $triedBeta = $true $current = $current -replace '/v1\.0/', '/beta/' Write-Verbose "PSGraphKit: v1.0 returned $sc; retrying once against beta ($current)." continue } # --- Curated error translation (401 / 403 / 400 / 404 / other) -------------------- $code = $null; $gmsg = $null; $reqId = $null if ($response -is [System.Collections.IDictionary] -and $response.Contains('error')) { $errObj = $response['error'] if ($errObj -is [System.Collections.IDictionary]) { if ($errObj.Contains('code')) { $code = [string]$errObj['code'] } if ($errObj.Contains('message')) { $gmsg = [string]$errObj['message'] } if ($errObj.Contains('innerError') -and $errObj['innerError'] -is [System.Collections.IDictionary]) { $inner = $errObj['innerError'] foreach ($k in 'request-id', 'client-request-id') { if ($inner.Contains($k)) { $reqId = [string]$inner[$k]; break } } } } } $ctx = Get-MgContext switch ($sc) { 401 { $message = "Microsoft Graph returned 401 Unauthorized calling '$current': your session is expired or invalid. Run Connect-MgGraph again." $category = [System.Management.Automation.ErrorCategory]::AuthenticationError } 403 { $roleLine = '' if (-not $SuppressRoleEnrichment) { if ($ctx -and $ctx.AuthType -eq 'Delegated') { $roles = Get-GkCurrentUserRole if ($roles) { $roleLine = "You currently hold active directory role(s): $($roles -join ', '). " } else { $roleLine = 'Could not read your active roles (a required role may be PIM-eligible but not activated). ' } } elseif ($ctx -and $ctx.AuthType -eq 'AppOnly') { $roleLine = 'This is an app-only session; effective access is the set of application permissions granted to the service principal. ' } if ($CallerFunction -and $script:GkScopeMap.ContainsKey($CallerFunction)) { $entry = $script:GkScopeMap[$CallerFunction] if ($entry.DelegatedOnly -and $ctx -and $ctx.AuthType -eq 'AppOnly') { $roleLine += "$CallerFunction relies on a delegated-only Graph API; reconnect with an interactive/delegated session. " } if ($entry.RoleHints -and $entry.RoleHints.Count -gt 0) { $roleLine += "This operation typically needs one of these roles: $($entry.RoleHints -join ', ') (or a custom role granting the equivalent action). " } } } $message = "Microsoft Graph denied access (403) calling '$current'. Your token has the scope, but access was refused. ${roleLine}Underlying Graph error: $code - $gmsg." $category = [System.Management.Automation.ErrorCategory]::PermissionDenied } 404 { $message = "Microsoft Graph returned 404 Not Found calling '$current': $code - $gmsg." $category = [System.Management.Automation.ErrorCategory]::ObjectNotFound } 400 { $message = "Microsoft Graph rejected the request (400) calling '$current': $code - $gmsg. If this is an advanced query, it should include ConsistencyLevel:eventual and `$count=true." $category = [System.Management.Automation.ErrorCategory]::InvalidArgument } default { $message = "Microsoft Graph request failed (HTTP $sc) calling '$current': $code - $gmsg." $category = [System.Management.Automation.ErrorCategory]::InvalidOperation } } if ($reqId) { $message += " (request-id: $reqId)" } $ex = [System.Exception]::new($message) $er = [System.Management.Automation.ErrorRecord]::new( $ex, "GkGraph_$($sc)_$($code)", $category, $current) $er.ErrorDetails = [System.Management.Automation.ErrorDetails]::new($message) $PSCmdlet.ThrowTerminatingError($er) } } # SIG # Begin signature block # MII9OgYJKoZIhvcNAQcCoII9KzCCPScCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDnpGu2DSJvQUOm # xZye3qIUhUrGx/0C7WOBXk9xX3tiHaCCIgAwggXMMIIDtKADAgECAhBUmNLR1FsZ # lUgTecgRwIeZMA0GCSqGSIb3DQEBDAUAMHcxCzAJBgNVBAYTAlVTMR4wHAYDVQQK # ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBGBgNVBAMTP01pY3Jvc29mdCBJZGVu # dGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAy # MDAeFw0yMDA0MTYxODM2MTZaFw00NTA0MTYxODQ0NDBaMHcxCzAJBgNVBAYTAlVT # MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBGBgNVBAMTP01pY3Jv # c29mdCBJZGVudGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRo # b3JpdHkgMjAyMDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALORKgeD # Bmf9np3gx8C3pOZCBH8Ppttf+9Va10Wg+3cL8IDzpm1aTXlT2KCGhFdFIMeiVPvH # or+Kx24186IVxC9O40qFlkkN/76Z2BT2vCcH7kKbK/ULkgbk/WkTZaiRcvKYhOuD # PQ7k13ESSCHLDe32R0m3m/nJxxe2hE//uKya13NnSYXjhr03QNAlhtTetcJtYmrV # qXi8LW9J+eVsFBT9FMfTZRY33stuvF4pjf1imxUs1gXmuYkyM6Nix9fWUmcIxC70 # ViueC4fM7Ke0pqrrBc0ZV6U6CwQnHJFnni1iLS8evtrAIMsEGcoz+4m+mOJyoHI1 # vnnhnINv5G0Xb5DzPQCGdTiO0OBJmrvb0/gwytVXiGhNctO/bX9x2P29Da6SZEi3 # W295JrXNm5UhhNHvDzI9e1eM80UHTHzgXhgONXaLbZ7LNnSrBfjgc10yVpRnlyUK # xjU9lJfnwUSLgP3B+PR0GeUw9gb7IVc+BhyLaxWGJ0l7gpPKWeh1R+g/OPTHU3mg # trTiXFHvvV84wRPmeAyVWi7FQFkozA8kwOy6CXcjmTimthzax7ogttc32H83rwjj # O3HbbnMbfZlysOSGM1l0tRYAe1BtxoYT2v3EOYI9JACaYNq6lMAFUSw0rFCZE4e7 # swWAsk0wAly4JoNdtGNz764jlU9gKL431VulAgMBAAGjVDBSMA4GA1UdDwEB/wQE # AwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIftJqhSobyhmYBAcnz1AQ # T2ioojAQBgkrBgEEAYI3FQEEAwIBADANBgkqhkiG9w0BAQwFAAOCAgEAr2rd5hnn # LZRDGU7L6VCVZKUDkQKL4jaAOxWiUsIWGbZqWl10QzD0m/9gdAmxIR6QFm3FJI9c # Zohj9E/MffISTEAQiwGf2qnIrvKVG8+dBetJPnSgaFvlVixlHIJ+U9pW2UYXeZJF # xBA2CFIpF8svpvJ+1Gkkih6PsHMNzBxKq7Kq7aeRYwFkIqgyuH4yKLNncy2RtNwx # AQv3Rwqm8ddK7VZgxCwIo3tAsLx0J1KH1r6I3TeKiW5niB31yV2g/rarOoDXGpc8 # FzYiQR6sTdWD5jw4vU8w6VSp07YEwzJ2YbuwGMUrGLPAgNW3lbBeUU0i/OxYqujY # lLSlLu2S3ucYfCFX3VVj979tzR/SpncocMfiWzpbCNJbTsgAlrPhgzavhgplXHT2 # 6ux6anSg8Evu75SjrFDyh+3XOjCDyft9V77l4/hByuVkrrOj7FjshZrM77nq81YY # uVxzmq/FdxeDWds3GhhyVKVB0rYjdaNDmuV3fJZ5t0GNv+zcgKCf0Xd1WF81E+Al # GmcLfc4l+gcK5GEh2NQc5QfGNpn0ltDGFf5Ozdeui53bFv0ExpK91IjmqaOqu/dk # ODtfzAzQNb50GQOmxapMomE2gj4d8yu8l13bS3g7LfU772Aj6PXsCyM2la+YZr9T # 03u4aUoqlmZpxJTG9F9urJh4iIAGXKKy7aIwggatMIIElaADAgECAhMzAAY/ql7c # GpaWP1cwAAAABj+qMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ # RCBWZXJpZmllZCBDUyBBT0MgQ0EgMDQwHhcNMjYwOTEwMDgxMDQzWhcNMjYwOTEz # MDgxMDQzWjBuMQswCQYDVQQGEwJTRTEZMBcGA1UEBx4QAEEAbABpAG4AZwBzAOUA # czEhMB8GA1UECh4YAE0AYQByAHQAaQBuACAAVwBlAGwA6QBuMSEwHwYDVQQDHhgA # TQBhAHIAdABpAG4AIABXAGUAbADpAG4wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAw # ggGKAoIBgQCOf2X4mAwZCDDs9ldzN6GHtTfpErreyX8iUp2TtpnjEzwsWqaWlDzW # jaVdvquiVDo4SgAr2FcVbf4spBTiYdVW3iiBVNOe8TqSsyVihb1qkHyrezT2j4Xf # qj21VgRgZftb92vbiL6lioo0xdbAtBq4EXACuBwgeVzbdlepMQXTAlXNTR2fe6FS # gNcpFWg6ShKcyglNSwdrxGO7//CwwTDTq5bFoC5GAqwRlofG4WAh7nRmMmGQvg/E # H//hR28kZVm1rZkRUzW/CGj5cH+hiE7dCnR/S+Teym+CPJow2rxNgfItcJPJXW1t # 8xqJYafDkFXop7yzcvknjebKAtty/qIcjbycytF6JCDFE2GEuS3wBRmuLfdgM70D # 9Heuirp9KvCjz3uyXG5lRwr41WvDHDHFV06LePV1PYQCq/RZVSx2JSjuaWYRkSTs # 7i/D6uwQ6V2+sNwayTLtfm4rox0Ewo3K0bnOZWYA69xKl/zmU0udERgApUCTsE7Y # pkuRIJeWstECAwEAAaOCAdYwggHSMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQD # AgeAMD0GA1UdJQQ2MDQGCisGAQQBgjdhAQAGCCsGAQUFBwMDBhwrBgEEAYI3YYGe # +ocMgpSG9A6C9avbSIKgs+syMB0GA1UdDgQWBBR7k8EuOHb3b58Yqt5KxLk+fFqI # njAfBgNVHSMEGDAWgBRrJUHe+2t8/RiACi1/j3ZdqnM9uDBnBgNVHR8EYDBeMFyg # WqBYhlZodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3Nv # ZnQlMjBJRCUyMFZlcmlmaWVkJTIwQ1MlMjBBT0MlMjBDQSUyMDA0LmNybDB0Bggr # BgEFBQcBAQRoMGYwZAYIKwYBBQUHMAKGWGh0dHA6Ly93d3cubWljcm9zb2Z0LmNv # bS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwSUQlMjBWZXJpZmllZCUyMENTJTIw # QU9DJTIwQ0ElMjAwNC5jcnQwVAYDVR0gBE0wSzBJBgRVHSAAMEEwPwYIKwYBBQUH # AgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0 # b3J5Lmh0bTANBgkqhkiG9w0BAQwFAAOCAgEAUToEOZwImtilHCGbITBoG7Hf0PfC # RAmbuNIWmRq/XfIbCZTE+OY4m5fe7lp6cqIGOtR9yd7n7RSlxO6viN6xxD1pvBqA # RvHPOvcH66QD44bGxzIT81WLu/K2iMpFXIFrm3eJili5DvhiuPSnxWG0h4js/yIa # LymXMQ1VglbX8Zln4fcpPXtJlBDHhQa5zTa2vhJmicMrE9fHgySA8oDKFSP9Mqs4 # Z5OcoGjpw4/8FUIXHFQVnAOKUOvjTgJohqEsx0q56l+nX7BTlS6NXW3hazN6cmOE # vNNS8Yu6dI5O6EZ7OgSWMrtlAcus6tUvpIf3Nj2KD2OjN7gUIuRjl9UKNI81XxZS # Yn0dW6VXRF37KK0/+LPtdPWPHDVsY5IoOYo0KQDZ0zHduJugANreNV8ZYxJ0oaxg # gDvnhtfV2KvwsuUurO85fRWJ+8+3w2toUzc3ysCNH7epF3NbU/4rpVc4yZzxpCjL # +KkTgSFrdnb6+RcWNymyp2tI+skPs3FWv0kkswPkfBOSFBHpXgToeAMJ2zmvq0Zu # uCL6KVgdeCHGJGcS1g60KeaSteuDigV3jJ58jZWxW46c50RNJ10bgZPApUFNM1tD # Ou3CHHDPn5VRSo94APOj+W9llPFW+hxbYB+vSJDait5W4R4dGYMjTS0ArFqzE9hB # JYlfJRd7OAqvgOMwggatMIIElaADAgECAhMzAAY/ql7cGpaWP1cwAAAABj+qMA0G # CSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQg # Q29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJRCBWZXJpZmllZCBDUyBB # T0MgQ0EgMDQwHhcNMjYwOTEwMDgxMDQzWhcNMjYwOTEzMDgxMDQzWjBuMQswCQYD # VQQGEwJTRTEZMBcGA1UEBx4QAEEAbABpAG4AZwBzAOUAczEhMB8GA1UECh4YAE0A # YQByAHQAaQBuACAAVwBlAGwA6QBuMSEwHwYDVQQDHhgATQBhAHIAdABpAG4AIABX # AGUAbADpAG4wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCOf2X4mAwZ # CDDs9ldzN6GHtTfpErreyX8iUp2TtpnjEzwsWqaWlDzWjaVdvquiVDo4SgAr2FcV # bf4spBTiYdVW3iiBVNOe8TqSsyVihb1qkHyrezT2j4Xfqj21VgRgZftb92vbiL6l # ioo0xdbAtBq4EXACuBwgeVzbdlepMQXTAlXNTR2fe6FSgNcpFWg6ShKcyglNSwdr # xGO7//CwwTDTq5bFoC5GAqwRlofG4WAh7nRmMmGQvg/EH//hR28kZVm1rZkRUzW/ # CGj5cH+hiE7dCnR/S+Teym+CPJow2rxNgfItcJPJXW1t8xqJYafDkFXop7yzcvkn # jebKAtty/qIcjbycytF6JCDFE2GEuS3wBRmuLfdgM70D9Heuirp9KvCjz3uyXG5l # Rwr41WvDHDHFV06LePV1PYQCq/RZVSx2JSjuaWYRkSTs7i/D6uwQ6V2+sNwayTLt # fm4rox0Ewo3K0bnOZWYA69xKl/zmU0udERgApUCTsE7YpkuRIJeWstECAwEAAaOC # AdYwggHSMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMD0GA1UdJQQ2MDQG # CisGAQQBgjdhAQAGCCsGAQUFBwMDBhwrBgEEAYI3YYGe+ocMgpSG9A6C9avbSIKg # s+syMB0GA1UdDgQWBBR7k8EuOHb3b58Yqt5KxLk+fFqInjAfBgNVHSMEGDAWgBRr # JUHe+2t8/RiACi1/j3ZdqnM9uDBnBgNVHR8EYDBeMFygWqBYhlZodHRwOi8vd3d3 # Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBJRCUyMFZlcmlm # aWVkJTIwQ1MlMjBBT0MlMjBDQSUyMDA0LmNybDB0BggrBgEFBQcBAQRoMGYwZAYI # KwYBBQUHMAKGWGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMv # TWljcm9zb2Z0JTIwSUQlMjBWZXJpZmllZCUyMENTJTIwQU9DJTIwQ0ElMjAwNC5j # cnQwVAYDVR0gBE0wSzBJBgRVHSAAMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cu # bWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTANBgkqhkiG # 9w0BAQwFAAOCAgEAUToEOZwImtilHCGbITBoG7Hf0PfCRAmbuNIWmRq/XfIbCZTE # +OY4m5fe7lp6cqIGOtR9yd7n7RSlxO6viN6xxD1pvBqARvHPOvcH66QD44bGxzIT # 81WLu/K2iMpFXIFrm3eJili5DvhiuPSnxWG0h4js/yIaLymXMQ1VglbX8Zln4fcp # PXtJlBDHhQa5zTa2vhJmicMrE9fHgySA8oDKFSP9Mqs4Z5OcoGjpw4/8FUIXHFQV # nAOKUOvjTgJohqEsx0q56l+nX7BTlS6NXW3hazN6cmOEvNNS8Yu6dI5O6EZ7OgSW # MrtlAcus6tUvpIf3Nj2KD2OjN7gUIuRjl9UKNI81XxZSYn0dW6VXRF37KK0/+LPt # dPWPHDVsY5IoOYo0KQDZ0zHduJugANreNV8ZYxJ0oaxggDvnhtfV2KvwsuUurO85 # fRWJ+8+3w2toUzc3ysCNH7epF3NbU/4rpVc4yZzxpCjL+KkTgSFrdnb6+RcWNymy # p2tI+skPs3FWv0kkswPkfBOSFBHpXgToeAMJ2zmvq0ZuuCL6KVgdeCHGJGcS1g60 # KeaSteuDigV3jJ58jZWxW46c50RNJ10bgZPApUFNM1tDOu3CHHDPn5VRSo94APOj # +W9llPFW+hxbYB+vSJDait5W4R4dGYMjTS0ArFqzE9hBJYlfJRd7OAqvgOMwggco # MIIFEKADAgECAhMzAAAAFjGSjZICZXuaAAAAAAAWMA0GCSqGSIb3DQEBDAUAMGMx # CzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xNDAy # BgNVBAMTK01pY3Jvc29mdCBJRCBWZXJpZmllZCBDb2RlIFNpZ25pbmcgUENBIDIw # MjEwHhcNMjYwMzI2MTgxMTI5WhcNMzEwMzI2MTgxMTI5WjBaMQswCQYDVQQGEwJV # UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSswKQYDVQQDEyJNaWNy # b3NvZnQgSUQgVmVyaWZpZWQgQ1MgQU9DIENBIDA0MIICIjANBgkqhkiG9w0BAQEF # AAOCAg8AMIICCgKCAgEAylX6yNvoCTDP9G0OTlSjXbzgEsy21FDL17n/lZe2BrqH # z2mR1aN4DBxeYp0/hjEqSHHyGfarV1NVBuvK8vLzW0LTi+DZt9In16aiNfgcogFi # ztWE9Fp8xu1zzrqE3nlrDWb+RZo8QrEXgWb8s8swsl2W7tREHycVkx+Hm1MLQIlv # a6jH/Xg4/8GIYhHzbXiVd2RXomw9s7Qh6/SYRXXfe125wh4EKEyKnNNl+cZUSrVB # gWvvjrRwQY4if7sAZ805KruBY6WY0Hiba5nWvrq9Qk9o35ViAf8qZ+7u1fbb1vcC # WyWLfx9hLSdBjjVsSWe0xLvI1j4p3Tjt5czz+1Lc0v5lQ1feB7nFmpbZrK2us0hv # AaBCfOyDPEEm+735vzuNRYWJFL/PViI+REtjuJMcojEn3veQjIrwrmK0T9oSr8e3 # oDzK1oAwwZMTC4KymTvYUTVDJvL5N8OW/UqIBzsiVYcchZvGhV3yMYKgxeEtIOG4 # W4Z85Y5kpQi5bpjGXFxRg46RdrTaALt1RhRmLR7U0jVSr2aYAd2+Mp2qA5Gz3/lo # OOdt47eFZ3mrAYGYQtbK2SNjQpwgQX4Iy6tOKahCgFhKIcltitvSkpJB77eVWhNW # nN2LfqMojszEue7V8EAySxry4PzlxTtFTb3Mw53XyH12BMQf2m9j7jEsHeVSATsC # AwEAAaOCAdwwggHYMA4GA1UdDwEB/wQEAwIBhjAQBgkrBgEEAYI3FQEEAwIBADAd # BgNVHQ4EFgQUayVB3vtrfP0YgAotf492XapzPbgwVAYDVR0gBE0wSzBJBgRVHSAA # MEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMv # RG9jcy9SZXBvc2l0b3J5Lmh0bTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTAS # BgNVHRMBAf8ECDAGAQH/AgEAMB8GA1UdIwQYMBaAFNlBKbAPD2Ns72nX9c0pnqRI # ajDmMHAGA1UdHwRpMGcwZaBjoGGGX2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w # a2lvcHMvY3JsL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDb2RlJTIwU2ln # bmluZyUyMFBDQSUyMDIwMjEuY3JsMH0GCCsGAQUFBwEBBHEwbzBtBggrBgEFBQcw # AoZhaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3Nv # ZnQlMjBJRCUyMFZlcmlmaWVkJTIwQ29kZSUyMFNpZ25pbmclMjBQQ0ElMjAyMDIx # LmNydDANBgkqhkiG9w0BAQwFAAOCAgEABtVQXlR01UQZY5XGQ9yIjMcD8jI0MizW # hJ1buZjg5toUQSXx/BrASwE5qxwHPBeO45pOQp6VD4iILgm8OmfylY+A7KIqttvD # UizC3sBXxjK4u7sDRiyEguXHKfL1HQAwxCLEtnRPkCPTsJA6b917lA+3foQIHC1X # DDpdQLHxGbbGXp4Rr0mFK5vxbi6tAahBi/RlzOXPh6PavKPlZ/0vhlkDdsvoJETt # ebNJCNOZ1Kav3Tg+K4va4FbOrYqRHdGGahoA/gmTYmmVqw0zkGzT53HdhfajrFGt # tJomK7qE+T8CQGiPkEIkxNmSXjCTpDqc4U1IKlTGcGYnRFGSgqrnWnkANPFsJ5ED # Hysh82lPI+PFC3FOIVMLzLL+30rqznvRgHUUAj7xfFnEiuaAx3vFVSTOLb+iigpv # dR6i8fSWpgYESOkdkn2N57tuhBs57tKwoP++vc/MVpuD1XAtmWi+lZSlahadTbDf # GKjMn+bfm2xlW9PZ6BSnCRv1MMhpcUZkAZX3gVEMef8rZc2c7BJ4ayRfX0wH43vI # 9znV+ZRJ3j0xUC0Zb82RQalF5yHkCr93x0IwvZtn6P2dNQyCP6qd3fC4RlVFtAQh # tOH0cByTR/Iqqghv6qHzL/pMptgMQQ5x8zYEYy+tCThYgYIrq7y4WEDYQfeSlqIx # QOrIUJ4IJDEwggeeMIIFhqADAgECAhMzAAAAB4ejNKN7pY4cAAAAAAAHMA0GCSqG # SIb3DQEBDAUAMHcxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y # cG9yYXRpb24xSDBGBgNVBAMTP01pY3Jvc29mdCBJZGVudGl0eSBWZXJpZmljYXRp # b24gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAyMDAeFw0yMTA0MDEyMDA1 # MjBaFw0zNjA0MDEyMDE1MjBaMGMxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xNDAyBgNVBAMTK01pY3Jvc29mdCBJRCBWZXJpZmll # ZCBDb2RlIFNpZ25pbmcgUENBIDIwMjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw # ggIKAoICAQCy8MCvGYgo4t1UekxJbGkIVQm0Uv96SvjB6yUo92cXdylN65Xy96q2 # YpWCiTas7QPTkGnK9QMKDXB2ygS27EAIQZyAd+M8X+dmw6SDtzSZXyGkxP8a8Hi6 # EO9Zcwh5A+wOALNQbNO+iLvpgOnEM7GGB/wm5dYnMEOguua1OFfTUITVMIK8faxk # P/4fPdEPCXYyy8NJ1fmskNhW5HduNqPZB/NkWbB9xxMqowAeWvPgHtpzyD3PLGVO # mRO4ka0WcsEZqyg6efk3JiV/TEX39uNVGjgbODZhzspHvKFNU2K5MYfmHh4H1qOb # U4JKEjKGsqqA6RziybPqhvE74fEp4n1tiY9/ootdU0vPxRp4BGjQFq28nzawuvaC # qUUF2PWxh+o5/TRCb/cHhcYU8Mr8fTiS15kRmwFFzdVPZ3+JV3s5MulIf3II5FXe # ghlAH9CvicPhhP+VaSFW3Da/azROdEm5sv+EUwhBrzqtxoYyE2wmuHKws00x4GGI # x7NTWznOm6x/niqVi7a/mxnnMvQq8EMse0vwX2CfqM7Le/smbRtsEeOtbnJBbtLf # oAsC3TdAOnBbUkbUfG78VRclsE7YDDBUbgWt75lDk53yi7C3n0WkHFU4EZ83i83a # bd9nHWCqfnYa9qIHPqjOiuAgSOf4+FRcguEBXlD9mAInS7b6V0UaNwIDAQABo4IC # NTCCAjEwDgYDVR0PAQH/BAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQW # BBTZQSmwDw9jbO9p1/XNKZ6kSGow5jBUBgNVHSAETTBLMEkGBFUdIAAwQTA/Bggr # BgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1Jl # cG9zaXRvcnkuaHRtMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMA8GA1UdEwEB # /wQFMAMBAf8wHwYDVR0jBBgwFoAUyH7SaoUqG8oZmAQHJ89QEE9oqKIwgYQGA1Ud # HwR9MHsweaB3oHWGc2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3Js # L01pY3Jvc29mdCUyMElkZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUyMENl # cnRpZmljYXRlJTIwQXV0aG9yaXR5JTIwMjAyMC5jcmwwgcMGCCsGAQUFBwEBBIG2 # MIGzMIGBBggrBgEFBQcwAoZ1aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9w # cy9jZXJ0cy9NaWNyb3NvZnQlMjBJZGVudGl0eSUyMFZlcmlmaWNhdGlvbiUyMFJv # b3QlMjBDZXJ0aWZpY2F0ZSUyMEF1dGhvcml0eSUyMDIwMjAuY3J0MC0GCCsGAQUF # BzABhiFodHRwOi8vb25lb2NzcC5taWNyb3NvZnQuY29tL29jc3AwDQYJKoZIhvcN # AQEMBQADggIBAH8lKp7+1Kvq3WYK21cjTLpebJDjW4ZbOX3HD5ZiG84vjsFXT0OB # +eb+1TiJ55ns0BHluC6itMI2vnwc5wDW1ywdCq3TAmx0KWy7xulAP179qX6VSBNQ # kRXzReFyjvF2BGt6FvKFR/imR4CEESMAG8hSkPYso+GjlngM8JPn/ROUrTaeU/BR # u/1RFESFVgK2wMz7fU4VTd8NXwGZBe/mFPZG6tWwkdmA/jLbp0kNUX7elxu2+HtH # o0QO5gdiKF+YTYd1BGrmNG8sTURvn09jAhIUJfYNotn7OlThtfQjXqe0qrimgY4V # poq2MgDW9ESUi1o4pzC1zTgIGtdJ/IvY6nqa80jFOTg5qzAiRNdsUvzVkoYP7bi4 # wLCj+ks2GftUct+fGUxXMdBUv5sdr0qFPLPB0b8vq516slCfRwaktAxK1S40MCvF # bbAXXpAZnU20FaAoDwqq/jwzwd8Wo2J83r7O3onQbDO9TyDStgaBNlHzMMQgl95n # HBYMelLEHkUnVVVTUsgC0Huj09duNfMaJ9ogxhPNThgq3i8w3DAGZ61AMeF0C1M+ # mU5eucj1Ijod5O2MMPeJQ3/vKBtqGZg4eTtUHt/BPjN74SsJsyHqAdXVS5c+ItyK # Wg3Eforhox9k3WgtWTpgV4gkSiS4+A09roSdOI4vrRw+p+fL4WrxSK5nMYIakDCC # GowCAQEwcTBaMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv # cmF0aW9uMSswKQYDVQQDEyJNaWNyb3NvZnQgSUQgVmVyaWZpZWQgQ1MgQU9DIENB # IDA0AhMzAAY/ql7cGpaWP1cwAAAABj+qMA0GCWCGSAFlAwQCAQUAoF4wEAYKKwYB # BAGCNwIBDDECMAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwLwYJKoZIhvcN # AQkEMSIEIBnt6dmLTE8raHzQtZ65Ep3xw9SC559Ij/SwunDb+Ge8MA0GCSqGSIb3 # DQEBAQUABIIBgDLwqQw26C3Ov8PTIOotUl3hIFFyhScQTU2KH+L5ixdd1bNV219g # tw8ycyBVWghhZC+WqKg1JC9FJTTnMNSpSnHKiF7VEEBX6omvvw9ogMBL4eaDoI1c # S4fnhMekpVtk30fLOl8U7GDQ3ozr3MLTx2szZOlPprpbTW2vLY/LOyFWEFqVSIrL # jjdzz/i7fP6aGkdoLD2Wzh3GlNsFltDe2ymbhkO+ch0J5s1ejt5cK5vrFYF+ZCl3 # mrPfH87So0mSl2brD6H/2mNvVKIS1zF3SRk9z/R/OsBHnaESCVwAy+uybD+VT3xA # QScSKjbZITGW6odwfyo4Gie0HnKKoKmg+McjUi54CB8EqN3XtTzQlycEYwrsTffb # Wu7hriN5Q7m1JQU3LWHzAnZ9/RoLyv2CefEvqQpe68UyiAV4QlK+XFb1rHjVdk5y # Iym6I6NzyrwVzpbGkmA5Qc/dDAbeR5PXJ3KtZWOXP465KeyZ0f1M9+bbnul4LFQ7 # 4INhY5fTeT81MqGCGBAwghgMBgorBgEEAYI3AwMBMYIX/DCCF/gGCSqGSIb3DQEH # AqCCF+kwghflAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFhBgsqhkiG9w0BCRABBKCC # AVAEggFMMIIBSAIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFlAwQCAQUABCDryEo3 # UnjpX+5lxlNr2cSjBs6tvKLPCnXtC7xgNSmr5QIGaoRsNid1GBIyMDI2MDkxMDE0 # NTgxNi44N1owBIACAfSggeGkgd4wgdsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX # YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg # Q29ycG9yYXRpb24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlv # bnMxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo3QTAwLTA1RTAtRDk0NzE1MDMG # A1UEAxMsTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZSBTdGFtcGluZyBBdXRob3Jp # dHmggg8hMIIHgjCCBWqgAwIBAgITMwAAAAXlzw//Zi7JhwAAAAAABTANBgkqhkiG # 9w0BAQwFADB3MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv # cmF0aW9uMUgwRgYDVQQDEz9NaWNyb3NvZnQgSWRlbnRpdHkgVmVyaWZpY2F0aW9u # IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMjAwHhcNMjAxMTE5MjAzMjMx # WhcNMzUxMTE5MjA0MjMxWjBhMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9z # b2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBU # aW1lc3RhbXBpbmcgQ0EgMjAyMDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC # ggIBAJ5851Jj/eDFnwV9Y7UGIqMcHtfnlzPREwW9ZUZHd5HBXXBvf7KrQ5cMSqFS # HGqg2/qJhYqOQxwuEQXG8kB41wsDJP5d0zmLYKAY8Zxv3lYkuLDsfMuIEqvGYOPU # RAH+Ybl4SJEESnt0MbPEoKdNihwM5xGv0rGofJ1qOYSTNcc55EbBT7uq3wx3mXht # VmtcCEr5ZKTkKKE1CxZvNPWdGWJUPC6e4uRfWHIhZcgCsJ+sozf5EeH5KrlFnxpj # KKTavwfFP6XaGZGWUG8TZaiTogRoAlqcevbiqioUz1Yt4FRK53P6ovnUfANjIgM9 # JDdJ4e0qiDRm5sOTiEQtBLGd9Vhd1MadxoGcHrRCsS5rO9yhv2fjJHrmlQ0EIXmp # 4DhDBieKUGR+eZ4CNE3ctW4uvSDQVeSp9h1SaPV8UWEfyTxgGjOsRpeexIveR1MP # TVf7gt8hY64XNPO6iyUGsEgt8c2PxF87E+CO7A28TpjNq5eLiiunhKbq0XbjkNoU # 5JhtYUrlmAbpxRjb9tSreDdtACpm3rkpxp7AQndnI0Shu/fk1/rE3oWsDqMX3jjv # 40e8KN5YsJBnczyWB4JyeeFMW3JBfdeAKhzohFe8U5w9WuvcP1E8cIxLoKSDzCCB # Ou0hWdjzKNu8Y5SwB1lt5dQhABYyzR3dxEO/T1K/BVF3rV69AgMBAAGjggIbMIIC # FzAOBgNVHQ8BAf8EBAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFGtp # KDo1L0hjQM972K9J6T7ZPdshMFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUF # BwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3Np # dG9yeS5odG0wEwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJKwYBBAGCNxQCBAweCgBT # AHUAYgBDAEEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTIftJqhSobyhmY # BAcnz1AQT2ioojCBhAYDVR0fBH0wezB5oHegdYZzaHR0cDovL3d3dy5taWNyb3Nv # ZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSWRlbnRpdHklMjBWZXJpZmlj # YXRpb24lMjBSb290JTIwQ2VydGlmaWNhdGUlMjBBdXRob3JpdHklMjAyMDIwLmNy # bDCBlAYIKwYBBQUHAQEEgYcwgYQwgYEGCCsGAQUFBzAChnVodHRwOi8vd3d3Lm1p # Y3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMElkZW50aXR5JTIw # VmVyaWZpY2F0aW9uJTIwUm9vdCUyMENlcnRpZmljYXRlJTIwQXV0aG9yaXR5JTIw # MjAyMC5jcnQwDQYJKoZIhvcNAQEMBQADggIBAF+Idsd+bbVaFXXnTHho+k7h2ESZ # JRWluLE0Oa/pO+4ge/XEizXvhs0Y7+KVYyb4nHlugBesnFqBGEdC2IWmtKMyS1OW # IviwpnK3aL5JedwzbeBF7POyg6IGG/XhhJ3UqWeWTO+Czb1c2NP5zyEh89F72u9U # Iw+IfvM9lzDmc2O2END7MPnrcjWdQnrLn1Ntday7JSyrDvBdmgbNnCKNZPmhzoa8 # PccOiQljjTW6GePe5sGFuRHzdFt8y+bN2neF7Zu8hTO1I64XNGqst8S+w+RUdie8 # fXC1jKu3m9KGIqF4aldrYBamyh3g4nJPj/LR2CBaLyD+2BuGZCVmoNR/dSpRCxlo # t0i79dKOChmoONqbMI8m04uLaEHAv4qwKHQ1vBzbV/nG89LDKbRSSvijmwJwxRxL # LpMQ/u4xXxFfR4f/gksSkbJp7oqLwliDm/h+w0aJ/U5ccnYhYb7vPKNMN+SZDWyc # U5ODIRfyoGl59BsXR/HpRGtiJquOYGmvA/pk5vC1lcnbeMrcWD/26ozePQ/TWfNX # KBOmkFpvPE8CH+EeGGWzqTCjdAsno2jzTeNSxlx3glDGJgcdz5D/AAxw9Sdgq/+r # Y7jjgs7X6fqPTXPmaCAJKVHAP19oEjJIBwD1LyHbaEgBxFCogYSOiUIr0Xqcr1nJ # fiWG2GwYe6ZoAF1bMIIHlzCCBX+gAwIBAgITMwAAAFhlzes/odf80gAAAAAAWDAN # BgkqhkiG9w0BAQwFADBhMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0 # IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1l # c3RhbXBpbmcgQ0EgMjAyMDAeFw0yNTEwMjMyMDQ2NTVaFw0yNjEwMjIyMDQ2NTVa # MIHbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH # UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQL # ExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25zMScwJQYDVQQLEx5uU2hpZWxk # IFRTUyBFU046N0EwMC0wNUUwLUQ5NDcxNTAzBgNVBAMTLE1pY3Jvc29mdCBQdWJs # aWMgUlNBIFRpbWUgU3RhbXBpbmcgQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF # AAOCAg8AMIICCgKCAgEAnXg0pHaQ7PVAlln+HZZrJFcLoKbekhW1yL+QNBUgFFUs # jZIKaqqN4oIJsJM3ps0rJNSO7ndCNRuZDX2Wgur3Ak77eXrloBXqZmO6ZVXeDNRC # LldW4A0/NfjzJ7XXkdEhjr81ghXEpR7zC+wbaNN+sPSxzLAZBeibDFP7Xws5wX0Z # tIsN1a2+Xq5bvWp3kRMytwskTjunRgeLZL/tBp237JVdRPFAQ9jYRKpCqUBo/v1x # jBLRCV3PalKjnGfb3MN4U7jVyqifFHShcnW5CERRoBmUa6sygDzFSr8e3g93TPNL # FUivUE0GmLfbX5ceD1Gt1FcZ6x/JLVATzk5+BWHbMxwJIVkVPTqSSMjQ6KTKdcnq # 3pH0c4AFJp/glvcpq0U9fzZIjJGGvdpishlRl77RQtUhSjxHvCn3LC/xqQQwOHSQ # DsGh6NX2D0RfsSyEtTAByAae+2w1HByTDTcmlTNLEuQLeCj1gNBdIWj0WOYyDtjj # Q/8iTWY6ey1vb9qHljIj5HgIndT5P9MYk2Vg2e7hKUZNBNbA/hsgBsuoZ+IX89Wv # jEN9abF91S4OJVuinmKsLO/MLbnl7ikuD0dN6oA0YewyDQncs12sM9HOtu72QA/T # ZlefvW8r9xtMXAYoQlcGjsk8W4Uc7cfqVqbIPjdoc8ZxBzLcXcVyP4p5cyLwvkMC # AwEAAaOCAcswggHHMB0GA1UdDgQWBBRyjU3Fer4VxXJ+hjPcRJnxnRIJsDAfBgNV # HSMEGDAWgBRraSg6NS9IY0DPe9ivSek+2T3bITBsBgNVHR8EZTBjMGGgX6Bdhlto # dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBQ # dWJsaWMlMjBSU0ElMjBUaW1lc3RhbXBpbmclMjBDQSUyMDIwMjAuY3JsMHkGCCsG # AQUFBwEBBG0wazBpBggrBgEFBQcwAoZdaHR0cDovL3d3dy5taWNyb3NvZnQuY29t # L3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBQdWJsaWMlMjBSU0ElMjBUaW1lc3Rh # bXBpbmclMjBDQSUyMDIwMjAuY3J0MAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAww # CgYIKwYBBQUHAwgwDgYDVR0PAQH/BAQDAgeAMGYGA1UdIARfMF0wUQYMKwYBBAGC # N0yDfQEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w # a2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTAIBgZngQwBBAIwDQYJKoZIhvcNAQEM # BQADggIBAHvrxIiVF1iHcXvxrJTCD8eOtbPUbK9x+Lz70iYehh+G0UoOMcMf04QD # 6tQPTeZ5HhGETkcn0raDJ5NpfbRBuKEH31rxbZK97o12KRDNJ3Nu4ePaUIpH/TcW # z8PLVOCECywSxbEgEG20kyydGc46c591tXzpfkJDckjoYrypaerdeQLRQH9LaoTY # ZfdAzMo+Dy0O1DzFJkF5YnsmAM8lt9r1NtXdFjdbFMCbV5dau64mV22s186A8Umi # +l239+Ue0cbJQIykWhIlhhWhxQgoksqHz7kp2GFZAAeySTmIOQOWyXOA8JA8TISJ # yn3JDOgStv583P3V0QSALT6JXDCW26FV208VGJMzkv0S22iOTZJ/oamTpk8RzD8o # WT8pfbe1q/k/bxPiXYRbzps96a5YOko7n0Vdo61DOJhL/mhk01Y348gq6vhG/VTc # dGHh1rCkwOM05B35AZZq9AtPpfRzJinrHzzGRx+r6fD3ccYMPMMX/Nwd2irzrph1 # 72fQcSf1fMwvwIhmfH4GWJJ+mf1HA6uXoAOVByckguXvlj8gPi7T2ES6RU8+Qssf # qTNTJKjsBheWKWv2W4ESVen2L7lCz7i79FhA+0kp0yXJnYwdzWS0ovTINULINmzV # yMcSUm5WuVf8YZ33cAud2Opr6N1+RuLZDavDvjiehlI5dH+GEy56MYIHQzCCBz8C # AQEweDBhMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 # aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcg # Q0EgMjAyMAITMwAAAFhlzes/odf80gAAAAAAWDANBglghkgBZQMEAgEFAKCCBJww # EQYLKoZIhvcNAQkQAg8xAgUAMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAc # BgkqhkiG9w0BCQUxDxcNMjYwOTEwMTQ1ODE2WjAvBgkqhkiG9w0BCQQxIgQgpPFK # zHCCBhFescwvTSsKG2T/7bbBtsa9x+sb4fx4vFIwgbkGCyqGSIb3DQEJEAIvMYGp # MIGmMIGjMIGgBCDFIlS7sgfQ+wAo1cWbWz+WN69VBds58hbran919aLocTB8MGWk # YzBhMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u # MTIwMAYDVQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0Eg # MjAyMAITMwAAAFhlzes/odf80gAAAAAAWDCCA14GCyqGSIb3DQEJEAISMYIDTTCC # A0mhggNFMIIDQTCCAikCAQEwggEJoYHhpIHeMIHbMQswCQYDVQQGEwJVUzETMBEG # A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj # cm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBP # cGVyYXRpb25zMScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046N0EwMC0wNUUwLUQ5 # NDcxNTAzBgNVBAMTLE1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWUgU3RhbXBpbmcg # QXV0aG9yaXR5oiMKAQEwBwYFKw4DAhoDFQCdZHkb26ercF2O62vCdZUfUSvEXKBn # MGWkYzBhMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 # aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcg # Q0EgMjAyMDANBgkqhkiG9w0BAQsFAAIFAO5NPQkwIhgPMjAyNjA5MTAxNDI4MjVa # GA8yMDI2MDkxMTE0MjgyNVowdDA6BgorBgEEAYRZCgQBMSwwKjAKAgUA7k09CQIB # ADAHAgEAAgIGijAHAgEAAgISXjAKAgUA7k6OiQIBADA2BgorBgEEAYRZCgQCMSgw # JjAMBgorBgEEAYRZCgMCoAowCAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3 # DQEBCwUAA4IBAQB5y1yTlQHREdu0r0CVyWvjYwQc47tNnEGKFpLRQglID2vbx8k1 # vFYql2yuOqLqWaglYhF51+yPup/6IQUgzHVZyvpcf36kT9kTUnhdGglLOLuXd1v2 # 7CGwIy5Ee3QzTTYU9CdKZcX3e36gkGjCBzEpUyB7Bzj4Yr67K2M+Hkl1MN1ojZFx # qqlwj1NEGvpJD5v4DfdypFOfpdFRZNzvYzz+9Lk2jeB6p/znIZDPLacDueiJSkrG # lushjy7yzWubgemxbUXDvEMTq7y/mBhTWnzMkZb2Utg5YMgtECYzWAuyt6Fy7kau # YRikSSAjGwiIHMTm++Ee7O+pSJ+64/QfM4jZMA0GCSqGSIb3DQEBAQUABIICAEc2 # IzsQ18uD6k2JGnmAIOKsPKal37EoqA5l/OUrsfkn8Z0SWEO8ged32fXqxTCsMERb # iWo/yRmw9RxSPLPt9eSsgytsggwyDSjKmGVWkoTx0Ak4VIbkFWP50c3FLtelgflU # oFBiiQM/gzz1pYDrjHZqSAyg6eelM3/AzWIqdXIf4EBLdrM972h2p5X8sHdeI3P1 # +OU663lfDtokt29+9Waboo4gm9brk8N4MMIyi9xyhAjJ61DXTe1IPXZO1r6+hs7U # pQb6i16uWY3xdftOrnoIADlCDKvY24CYr9imSOh2TJES/ilYi4seq4wRQ1yKNTJC # oagy7p3hd4+ims52rwlzCZ59PlNb+s2hUKZN8PvCvIkQ6jqm68NlULMesIpMLZ4o # QD3CA+JfYn2tVyjMz5mfoqbAWnXse03o2/lX0e2YPtdr4N6NqLzBUZMTWHhB79wS # sxh6Fbq4RDMkiUE5FQLt81r28Da0vRRpUfSJe62M36Xm1T4CQGxMYj/xx05DOMTn # aHRKeJ7wistM/Xh7NNj3RAlbP/wPXIaXF9f1gW/iTkwx1ZaMy1UR4/c6vI4KUL9G # ZVUnWm4HFOhDLjcGs+iAwd8wxN1rddjgTtcBsJjdvK6o1Qo009EavE4USI5bzg5W # fEaUcX/N6uRl7wguK7PgBAl/4HwIDUGkaxhPNune # SIG # End signature block |