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