Public/ps1/Configuration/General/Get-ApprxrInfo.ps1

<#
.SYNOPSIS
    Returns a consolidated overview of the local Apprxr setup.
 
.DESCRIPTION
    Collects service, version, file watcher, and nginx proxy information.
    By default this command returns a structured object.
    Use -AsJson for remote processing and -UserFriendly for readable console output.
 
.PARAMETER AsJson
    Returns the collected information as a JSON string.
 
.PARAMETER UserFriendly
    Prints a readable summary to the console and also returns the structured object.
 
.EXAMPLE
    Get-ApprxrInfo
 
.EXAMPLE
    Get-ApprxrInfo -AsJson
 
.EXAMPLE
    Get-ApprxrInfo -UserFriendly
#>

function Get-ApprxrInfo {
    [CmdletBinding()]
    param(
        [switch]$AsJson,
        [switch]$UserFriendly
    )

    if ($AsJson -and $UserFriendly) {
        throw 'Use either -AsJson or -UserFriendly, not both.'
    }

    $moduleVersion = 'Unknown'
    try {
        $loadedModule = Get-Module Apprxr -ErrorAction Stop
        if ($loadedModule -and $loadedModule.Version) {
            $moduleVersion = $loadedModule.Version.ToString()
        }
    } catch {
        try {
            $moduleManifestPath = Join-Path $PSScriptRoot '..\..\..\..\Apprxr.psd1'
            $moduleManifest = Test-ModuleManifest -Path $moduleManifestPath -ErrorAction Stop
            if ($moduleManifest -and $moduleManifest.Version) {
                $moduleVersion = $moduleManifest.Version.ToString()
            }
        } catch {}
    }

    $configFolder = Get-ApprxrConfigurationFolder
    $configFilePath = Join-Path $configFolder 'config.json'
    $configFileExists = Test-Path -LiteralPath $configFilePath

    $serviceNameExtension = [string](@(Get-ApprxrConfigurationValue -name 'ServiceNameExtension')[0])
    $serviceExtension = [string](@(Get-ApprxrConfigurationValue -name 'ServiceExtension')[0])

    $configuredExtensions = @()
    if ($serviceNameExtension) { $configuredExtensions += $serviceNameExtension }
    if ($serviceExtension -and ($configuredExtensions -notcontains $serviceExtension)) {
        $configuredExtensions += $serviceExtension
    }

    $configuredServiceNames = @('ApprxrService')
    foreach ($extension in $configuredExtensions) {
        $configuredServiceNames += "ApprxrService$extension"
        $configuredServiceNames += "ApprxrService_$extension"
    }
    $configuredServiceNames = @($configuredServiceNames | Select-Object -Unique)

    $services = @()
    try {
        $services = @(Get-CimInstance -ClassName Win32_Service -Filter "Name LIKE 'ApprxrService%'" -ErrorAction Stop |
            Sort-Object Name |
            ForEach-Object {
                [pscustomobject]@{
                    Name      = $_.Name
                    State     = $_.State
                    StartMode = $_.StartMode
                    StartName = $_.StartName
                    PathName  = $_.PathName
                }
            })
    } catch {
        $services = @(Get-Service -Name 'ApprxrService*' -ErrorAction SilentlyContinue |
            Sort-Object Name |
            ForEach-Object {
                [pscustomobject]@{
                    Name      = $_.Name
                    State     = $_.Status.ToString()
                    StartMode = $null
                    StartName = $null
                    PathName  = $null
                }
            })
    }

    $serviceUsers = @($services |
        Select-Object -ExpandProperty StartName -Unique -ErrorAction SilentlyContinue |
        Where-Object { $_ })

    $nginxDirRaw = @(Get-ApprxrConfigurationValue -name NginxProxyDir)[0]
    $nginxDir = if ($null -eq $nginxDirRaw) { '' } else { [string]$nginxDirRaw }
    $nginxDir = $nginxDir.Trim()
    $nginxPortRaw = @(Get-ApprxrConfigurationValue -name NginxProxyPort)[0]
    $nginxPort = $null
    if ($null -ne $nginxPortRaw -and "$nginxPortRaw" -ne '') {
        $nginxPort = [int]$nginxPortRaw
    }
    $nginxEnabled = [bool](@(Get-ApprxrConfigurationValue -name NginxProxyEnabled)[0])
    $nginxExePath = if ($nginxDir) { Join-Path $nginxDir 'nginx.exe' } else { $null }
    $nginxConfigPath = if ($nginxDir) { Join-Path $nginxDir 'conf\nginx.conf' } else { $null }
    $nginxExeExists = [bool]($nginxExePath -and (Test-Path -LiteralPath $nginxExePath))
    $nginxConfigExists = [bool]($nginxConfigPath -and (Test-Path -LiteralPath $nginxConfigPath))
    # Scope to processes whose exe path matches this installation directory AND is
    # under the current user's LOCALAPPDATA so that multiple service-account deployments
    # (e.g. acc + production) don't see each other.
    $nginxProcesses = @(Get-Process -Name 'nginx' -ErrorAction SilentlyContinue |
        Where-Object { try { $_.MainModule.FileName -ieq $nginxExePath -and
                             $_.MainModule.FileName -ilike "$env:LOCALAPPDATA\*" } catch { $false } })

    $nginxUpstreamHost = $null
    if ($nginxConfigExists) {
        try {
            $proxyPassLine = Get-Content -LiteralPath $nginxConfigPath | Where-Object { $_ -match 'proxy_pass\s+https?://([^;]+);' } | Select-Object -First 1
            if ($proxyPassLine) {
                $match = [regex]::Match($proxyPassLine, 'proxy_pass\s+https?://([^;]+);')
                if ($match.Success) {
                    $nginxUpstreamHost = $match.Groups[1].Value
                }
            }
        } catch {}
    }

    $rawFileWatcher = Get-ApprxrConfigurationValue -name 'FileWatcher'
    $fileWatcherLocations = @()
    if ($rawFileWatcher) {
        try {
            $fileWatcherObject = $rawFileWatcher
            if ($rawFileWatcher -is [string]) {
                $fileWatcherObject = $rawFileWatcher | ConvertFrom-Json -ErrorAction Stop
            }

            if ($fileWatcherObject -and $fileWatcherObject.PSObject -and $fileWatcherObject.PSObject.Properties) {
                foreach ($property in $fileWatcherObject.PSObject.Properties) {
                    $locationName = $property.Name
                    $locationConfig = $property.Value

                    $filters = @()
                    if ($locationConfig -and $locationConfig.PSObject -and $locationConfig.PSObject.Properties['Filter']) {
                        if ($locationConfig.Filter -is [System.Array]) {
                            $filters = @($locationConfig.Filter)
                        } elseif ($null -ne $locationConfig.Filter) {
                            $filters = @($locationConfig.Filter)
                        }
                    }

                    $fileWatcherLocations += [pscustomobject]@{
                        Name             = $locationName
                        InputFolder      = if ($locationConfig) { $locationConfig.InputFolder } else { $null }
                        InProgressFolder = if ($locationConfig) { $locationConfig.InProgressFolder } else { $null }
                        VdbName          = if ($locationConfig) { $locationConfig.VdbName } else { $null }
                        Filter           = $filters
                    }
                }
            }
        } catch {}
    }

    $pipelineNames = @(Get-ApprxrPipelines)
    $pipelineDetails = @()
    foreach ($pipelineName in $pipelineNames) {
        $pSleep = Get-ApprxrConfigurationValue -Section "Pipelines.$pipelineName" -name 'Sleep' -defaultValue $null
        if ($null -eq $pSleep) {
            $pSleep = Get-ApprxrConfigurationValue -name ($pipelineName + 'Sleep') -defaultValue 10
        }
        $pDirect = Get-ApprxrConfigurationValue -Section "Pipelines.$pipelineName" -name 'DirectProcessing' -defaultValue $null
        if ($null -eq $pDirect) {
            $pDirect = Get-ApprxrConfigurationValue -name ($pipelineName + 'DirectProcessing') -defaultValue $false
        }
        $pWindow = Get-ApprxrConfigurationValue -Section "Pipelines.$pipelineName" -name 'WindowSize' -defaultValue 10
        $pMaxTP = Get-ApprxrConfigurationValue -Section "Pipelines.$pipelineName" -name 'MaxThroughput' -defaultValue 5
        $pipelineDetails += [pscustomobject]@{
            Name             = $pipelineName
            Sleep            = $pSleep
            DirectProcessing = $pDirect
            WindowSize       = $pWindow
            MaxThroughput    = $pMaxTP
        }
    }

    $runningPipelineJobs = @(Get-Job -ErrorAction SilentlyContinue |
        Where-Object { $_.Name -like 'Apprxr*' -and $_.State -eq 'Running' -and $_.Name -notlike '*FileWatcher*' } |
        Select-Object -ExpandProperty Name)

    $runningWatcherJobs = @(Get-Job -ErrorAction SilentlyContinue |
        Where-Object { $_.Name -like 'Apprxr*' -and $_.State -eq 'Running' } |
        Select-Object -ExpandProperty Name)

    $watcherStateFolder = if ($null -ne $LogManagement -and $LogManagement.LogFolder) {
        Join-Path (Split-Path $LogManagement.LogFolder -Parent) 'watcher-state'
    } else {
        Join-Path $env:TEMP 'Apprxr\watcher-state'
    }

    $watcherStateFileCount = 0
    if (Test-Path -LiteralPath $watcherStateFolder) {
        $watcherStateFileCount = @(Get-ChildItem -Path $watcherStateFolder -Filter '*.json' -ErrorAction SilentlyContinue).Count
    }

    # --- Printing subsystem snapshot ---
    # Operators using the PRINT pipeline want a single answer to "is this
    # host print-ready?". Surface: spooler health, configured/installed
    # SumatraPDF, the count of printers visible to Get-Printer vs raw CIM
    # (mismatch usually means a per-user/WSD printer is invisible to the
    # PrintManagement module), and which other PDF print tools are detected.
    $spoolerStatus = $null
    try {
        $spoolerSvc = Get-Service -Name 'Spooler' -ErrorAction Stop
        $spoolerStatus = "$($spoolerSvc.Status)"
    } catch {
        $spoolerStatus = 'Unknown'
    }

    $sumatraConfigured = $null
    try {
        $sumatraConfigured = @(Get-ApprxrConfigurationValue -Name 'SumatraPDFPath' -defaultValue $null)[0]
    } catch {}
    $sumatraDefault = Join-Path $env:LOCALAPPDATA 'SumatraPDF\SumatraPDF.exe'
    $sumatraResolved = $null
    if ($sumatraConfigured -and (Test-Path $sumatraConfigured)) {
        $sumatraResolved = $sumatraConfigured
    } elseif (Test-Path $sumatraDefault) {
        $sumatraResolved = $sumatraDefault
    } else {
        $onPath = Get-Command 'SumatraPDF.exe' -ErrorAction SilentlyContinue | Select-Object -First 1
        if ($onPath) { $sumatraResolved = $onPath.Source }
    }
    $sumatraVersion = $null
    if ($sumatraResolved) {
        try {
            $sumatraVersion = ([System.Diagnostics.FileVersionInfo]::GetVersionInfo($sumatraResolved)).ProductVersion
        } catch {}
    }

    # Other PDF print tools (priority chain after SumatraPDF)
    $adobePath = $null
    foreach ($candidate in @(
        "${env:ProgramFiles(x86)}\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe",
        "${env:ProgramFiles}\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe",
        "${env:ProgramFiles(x86)}\Adobe\Acrobat DC\Acrobat\Acrobat.exe",
        "${env:ProgramFiles}\Adobe\Acrobat DC\Acrobat\Acrobat.exe"
    )) { if ($candidate -and (Test-Path $candidate)) { $adobePath = $candidate; break } }

    $foxitPath = $null
    foreach ($candidate in @(
        "${env:ProgramFiles(x86)}\Foxit Software\Foxit Reader\FoxitReader.exe",
        "${env:ProgramFiles}\Foxit Software\Foxit Reader\FoxitReader.exe",
        "${env:ProgramFiles(x86)}\Foxit Software\Foxit PDF Reader\FoxitPDFReader.exe",
        "${env:ProgramFiles}\Foxit Software\Foxit PDF Reader\FoxitPDFReader.exe"
    )) { if ($candidate -and (Test-Path $candidate)) { $foxitPath = $candidate; break } }

    $edgePath = $null
    foreach ($candidate in @(
        "${env:ProgramFiles(x86)}\Microsoft\Edge\Application\msedge.exe",
        "${env:ProgramFiles}\Microsoft\Edge\Application\msedge.exe"
    )) { if ($candidate -and (Test-Path $candidate)) { $edgePath = $candidate; break } }

    $printerNames        = @()
    $cimPrinterCount     = 0
    $cimOnlyPrinterNames = @()
    try {
        $printerNames = @(Get-ApprxrPrinters | Select-Object -ExpandProperty Name)
    } catch {}
    try {
        $cimList = @(Get-CimInstance -ClassName Win32_Printer -ErrorAction Stop)
        $cimPrinterCount = $cimList.Count
        $cimOnlyPrinterNames = @($cimList | Select-Object -ExpandProperty Name | Where-Object { $_ -notin $printerNames })
    } catch {}

    # Effective PDF mechanism that PRINT would pick (matches the priority
    # chain in Start-ApprxrJobPrint).
    $effectiveMechanism = if     ($sumatraResolved) { 'SumatraPDF' }
                          elseif ($adobePath)       { 'Adobe' }
                          elseif ($foxitPath)       { 'Foxit' }
                          elseif ($edgePath)        { 'Edge' }
                          else                      { 'PrintTo verb (last resort)' }

    $result = [pscustomobject]@{
        GeneratedAt   = (Get-Date).ToString('yyyy-MM-ddTHH:mm:ss')
        Version       = $moduleVersion
        Configuration = [pscustomobject]@{
            Folder         = $configFolder
            ConfigFilePath = $configFilePath
            ConfigFileExists = $configFileExists
        }
        Service       = [pscustomobject]@{
            IsConfigured         = ($services.Count -gt 0 -or $configuredExtensions.Count -gt 0)
            ConfiguredExtensions = $configuredExtensions
            ConfiguredNames      = $configuredServiceNames
            Services             = $services
            Users                = $serviceUsers
        }
        Pipelines     = [pscustomobject]@{
            Count           = $pipelineDetails.Count
            Pipelines       = $pipelineDetails
            RunningJobNames = $runningPipelineJobs
        }
        FileWatcher   = [pscustomobject]@{
            LocationCount   = $fileWatcherLocations.Count
            Locations       = $fileWatcherLocations
            RunningJobNames = $runningWatcherJobs
            StateFolder     = $watcherStateFolder
            StateFileCount  = $watcherStateFileCount
        }
        Nginx         = [pscustomobject]@{
            Enabled      = $nginxEnabled
            Port         = $nginxPort
            Directory    = $nginxDir
            ExePath      = $nginxExePath
            ExeExists    = $nginxExeExists
            ConfigPath   = $nginxConfigPath
            ConfigExists = $nginxConfigExists
            UpstreamHost = $nginxUpstreamHost
            Running      = ($nginxProcesses.Count -gt 0)
            Pids         = @($nginxProcesses | Select-Object -ExpandProperty Id)
        }
        Printing      = [pscustomobject]@{
            SpoolerStatus       = $spoolerStatus
            PrinterCount        = $printerNames.Count
            PrinterNames        = $printerNames
            CimPrinterCount     = $cimPrinterCount
            CimOnlyPrinterNames = $cimOnlyPrinterNames
            SumatraPDF          = [pscustomobject]@{
                Installed         = [bool]$sumatraResolved
                Path              = $sumatraResolved
                Version           = $sumatraVersion
                ConfiguredPath    = $sumatraConfigured
                DefaultPath       = $sumatraDefault
            }
            AlternativePdfTools = [pscustomobject]@{
                Adobe = $adobePath
                Foxit = $foxitPath
                Edge  = $edgePath
            }
            EffectivePdfMechanism = $effectiveMechanism
        }
    }

    if ($AsJson) {
        return ($result | ConvertTo-Json -Depth 10)
    }

    if ($UserFriendly) {
        Write-Host ''
        Write-Host '=== Apprxr Information ===' -ForegroundColor Cyan
        Write-Host ("Version : {0}" -f $result.Version)
        Write-Host ("Config file : {0}" -f $result.Configuration.ConfigFilePath)
        Write-Host ("Config file exists : {0}" -f $result.Configuration.ConfigFileExists)

        Write-Host ''
        Write-Host 'Service' -ForegroundColor Cyan
        Write-Host ("Configured : {0}" -f $result.Service.IsConfigured)
        Write-Host ("Configured names : {0}" -f (($result.Service.ConfiguredNames -join ', ')))
        if ($result.Service.Services.Count -eq 0) {
            Write-Host 'Installed services : none'
        } else {
            foreach ($service in $result.Service.Services) {
                Write-Host ("- {0} | State={1} | User={2}" -f $service.Name, $service.State, $service.StartName)
            }
        }

        Write-Host ''
        Write-Host 'Pipelines' -ForegroundColor Cyan
        Write-Host ("Configured pipelines : {0}" -f $result.Pipelines.Count)
        if ($result.Pipelines.Pipelines.Count -gt 0) {
            foreach ($p in $result.Pipelines.Pipelines) {
                Write-Host ("- {0} | Sleep={1} | Direct={2} | Window={3} | MaxTP={4}" -f $p.Name, $p.Sleep, $p.DirectProcessing, $p.WindowSize, $p.MaxThroughput)
            }
        }
        Write-Host ("Running pipeline jobs : {0}" -f (@($result.Pipelines.RunningJobNames).Count))

        Write-Host ''
        Write-Host 'FileWatcher' -ForegroundColor Cyan
        Write-Host ("Configured locations : {0}" -f $result.FileWatcher.LocationCount)
        if ($result.FileWatcher.Locations.Count -gt 0) {
            foreach ($location in $result.FileWatcher.Locations) {
                Write-Host ("- {0} | Input={1} | VDB={2}" -f $location.Name, $location.InputFolder, $location.VdbName)
            }
        }
        Write-Host ("Running jobs : {0}" -f (@($result.FileWatcher.RunningJobNames).Count))

        Write-Host ''
        Write-Host 'Nginx' -ForegroundColor Cyan
        Write-Host ("Enabled : {0}" -f $result.Nginx.Enabled)
        Write-Host ("Running : {0}" -f $result.Nginx.Running)
        Write-Host ("Port : {0}" -f $result.Nginx.Port)
        Write-Host ("Config : {0}" -f $result.Nginx.ConfigPath)
        Write-Host ("Upstream : {0}" -f $result.Nginx.UpstreamHost)

        Write-Host ''
        Write-Host 'Printing' -ForegroundColor Cyan
        Write-Host ("Spooler service : {0}" -f $result.Printing.SpoolerStatus)
        Write-Host ("Printers (Get-Printer) : {0}" -f $result.Printing.PrinterCount)
        if ($result.Printing.PrinterNames.Count -gt 0) {
            foreach ($n in $result.Printing.PrinterNames) { Write-Host (" - {0}" -f $n) }
        }
        Write-Host ("Printers (Win32 CIM) : {0}" -f $result.Printing.CimPrinterCount)
        if ($result.Printing.CimOnlyPrinterNames.Count -gt 0) {
            Write-Host ("CIM-only (not in Get-Printer): {0}" -f ($result.Printing.CimOnlyPrinterNames -join ', ')) -ForegroundColor Yellow
        }
        Write-Host ("SumatraPDF installed : {0}" -f $result.Printing.SumatraPDF.Installed)
        if ($result.Printing.SumatraPDF.Installed) {
            Write-Host (" Path : {0}" -f $result.Printing.SumatraPDF.Path)
            Write-Host (" Version : {0}" -f $result.Printing.SumatraPDF.Version)
            Write-Host (" Configured in config : {0}" -f $result.Printing.SumatraPDF.ConfiguredPath)
        } else {
            Write-Host ' Run Install-ApprxrSumatra (or send INSTALL_SUMATRAPDF) to provision it.' -ForegroundColor Yellow
        }
        Write-Host ("Alternative PDF tools : Adobe={0} | Foxit={1} | Edge={2}" -f `
            $(if ($result.Printing.AlternativePdfTools.Adobe) { 'yes' } else { 'no' }),
            $(if ($result.Printing.AlternativePdfTools.Foxit) { 'yes' } else { 'no' }),
            $(if ($result.Printing.AlternativePdfTools.Edge)  { 'yes' } else { 'no' }))
        Write-Host ("Effective PDF mechanism: {0}" -f $result.Printing.EffectivePdfMechanism)
        Write-Host ''
    }

    return $result
}
# SIG # Begin signature block
# MIInKgYJKoZIhvcNAQcCoIInGzCCJxcCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCC/N/dVeS21w1wS
# mMhnULrbrhQQoVsuYk2eiTDUIzhZFKCCIKYwggWNMIIEdaADAgECAhAOmxiO+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
# twGpn1eqXijiuZQwggaXMIIEf6ADAgECAhAfsijAKebq6quDMIHCRvIfMA0GCSqG
# SIb3DQEBCwUAMGoxCzAJBgNVBAYTAlBMMSEwHwYDVQQKExhBc3NlY28gRGF0YSBT
# eXN0ZW1zIFMuQS4xODA2BgNVBAMTL0NlcnR1bSBFeHRlbmRlZCBWYWxpZGF0aW9u
# IENvZGUgU2lnbmluZyAyMDIxIENBMB4XDTI2MDIwMzEzNTE0NFoXDTI4MDIwMzEz
# NTE0M1owgaExHTAbBgNVBA8TFFByaXZhdGUgT3JnYW5pemF0aW9uMRMwEQYLKwYB
# BAGCNzwCAQMTAk5MMREwDwYDVQQFEwg5NjMyNDU2MjELMAkGA1UEBhMCTkwxEDAO
# BgNVBAgMB1V0cmVjaHQxEzARBgNVBAcMCkFtZXJzZm9vcnQxETAPBgNVBAoMCEFQ
# UFJYIEJWMREwDwYDVQQDDAhBUFBSWCBCVjCCAaIwDQYJKoZIhvcNAQEBBQADggGP
# ADCCAYoCggGBAOF+mHloTjmkknba8mOejw0Gq3Aczy1dtatfdLM70ken0n07zIlY
# 2jNmyTv5I5RixXAt3LJUwWnUQH8okGFJYvnLZRPyjpCxnEqq8GL6puhKjIIcTs8W
# VhoADX+mFtLXygLrfk1j6A+dnNXjoCQMsVSEYppSGrpMpKsPQONb1mmFRx66vqro
# HcP93qWYTm/f3TpRzlscIxcQ/3Ab+KLeW0sHgC/a8MVHLicbdUe/pka4jMM98Djj
# BtkBc18dI6ECtrDfB2FXXFomvgm5UyPaf2sYxMPL+X/iCNhaQevoT3vttxMvKzAD
# JxJK7VsV2nrCvxfTaP4cVd9FfoxUqjCE0eA/IH3qrKqAv3eONjMrRzoO9jJumusi
# t91wYT1dwTe/o2FAwfmZ7qxofCXTlO008weUDY5UBw8d+BavVvnDNR08eEcCJN37
# wBJn1hhjFZZD6OxVcMEoyhIG5tJqvmBPyR5A1oYeGSL+/xBbLpAQR0oAhAivxvn4
# POX2r4M/wXGJewIDAQABo4IBfzCCAXswDAYDVR0TAQH/BAIwADBBBgNVHR8EOjA4
# MDagNKAyhjBodHRwOi8vY2V2Y3NjYTIwMjEuY3JsLmNlcnR1bS5wbC9jZXZjc2Nh
# MjAyMS5jcmwwdwYIKwYBBQUHAQEEazBpMC4GCCsGAQUFBzABhiJodHRwOi8vY2V2
# Y3NjYTIwMjEub2NzcC1jZXJ0dW0uY29tMDcGCCsGAQUFBzAChitodHRwOi8vcmVw
# b3NpdG9yeS5jZXJ0dW0ucGwvY2V2Y3NjYTIwMjEuY2VyMB8GA1UdIwQYMBaAFKxX
# yggW3D/FMRwKTdv78d6ZJy00MB0GA1UdDgQWBBSEZ5pbrzKazBz6ZCRYAbuQVlDy
# pDBKBgNVHSAEQzBBMAcGBWeBDAEDMDYGCyqEaAGG9ncCBQEHMCcwJQYIKwYBBQUH
# AgEWGWh0dHBzOi8vd3d3LmNlcnR1bS5wbC9DUFMwEwYDVR0lBAwwCgYIKwYBBQUH
# AwMwDgYDVR0PAQH/BAQDAgeAMA0GCSqGSIb3DQEBCwUAA4ICAQARtX2dHRUVP9uH
# 5FuVIvj22UsNMW2gsexnRxeL/xKxY4BXv6UkQmcgABKbYlWGH0wodaKRhrT9NyK1
# tt0P1C53zAkaiwNU7gSge7s/OPk2yA7g++iVBUDXRelZVCWi31V8yRVV+zXAFEkK
# timx00QcEhLFu1DAyjABmKouChHJyqF4dHWytvQZQHw1dfG1OSh6F82thRipW/q1
# ggWzm91QdieGlaSBZy9N881+h4V23R7oJVyWcCUtar19rBJH+/TaZHMo3VDVazhr
# CYUKMf/f6RA+iuSsPcpwMi7BZzTxawQtEe/1vG3RLVP94bWl69gY8LiTe0OU23tp
# 1PuTiHFLEXjTIb9WnBljH2PvUpJVaxQAMZrunKZvuafYSAvcEfSiRvgFg3r1UH9I
# nLjJVxsjfxjnbg5y/5SChh+OBbld7+NdvWVoFUGwqK2IuALD0O2/gtQBS/+UZuiB
# GsWpTv9PWI9/C2kPjEcBjC3sZedZOjkEJNSb8siUDItoswA+ddZRBBLdkNJCIKX4
# +lrKAAXdOqGu1QSu57G/OOLyjeUHEWx73XzoPMdgGfkcbdSBQoWBevDbC2xLzqr6
# EQZhplxGR39HZ4M4GyNFcpL4Xhuw1Gma8ldGTeuNw5ktP5Jmf9zvrjP5epHgMl6r
# jO0VG4wGU+R4e/FPQClKsyxI/cTJMjCCBrQwggScoAMCAQICEA3HrFcF/yGZLkBD
# Igw6SYYwDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERp
# Z2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMY
# RGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0MB4XDTI1MDUwNzAwMDAwMFoXDTM4MDEx
# NDIzNTk1OVowaTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMu
# MUEwPwYDVQQDEzhEaWdpQ2VydCBUcnVzdGVkIEc0IFRpbWVTdGFtcGluZyBSU0E0
# MDk2IFNIQTI1NiAyMDI1IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
# ggIBALR4MdMKmEFyvjxGwBysddujRmh0tFEXnU2tjQ2UtZmWgyxU7UNqEY81FzJs
# Qqr5G7A6c+Gh/qm8Xi4aPCOo2N8S9SLrC6Kbltqn7SWCWgzbNfiR+2fkHUiljNOq
# nIVD/gG3SYDEAd4dg2dDGpeZGKe+42DFUF0mR/vtLa4+gKPsYfwEu7EEbkC9+0F2
# w4QJLVSTEG8yAR2CQWIM1iI5PHg62IVwxKSpO0XaF9DPfNBKS7Zazch8NF5vp7ea
# Z2CVNxpqumzTCNSOxm+SAWSuIr21Qomb+zzQWKhxKTVVgtmUPAW35xUUFREmDrMx
# SNlr/NsJyUXzdtFUUt4aS4CEeIY8y9IaaGBpPNXKFifinT7zL2gdFpBP9qh8SdLn
# Eut/GcalNeJQ55IuwnKCgs+nrpuQNfVmUB5KlCX3ZA4x5HHKS+rqBvKWxdCyQEEG
# cbLe1b8Aw4wJkhU1JrPsFfxW1gaou30yZ46t4Y9F20HHfIY4/6vHespYMQmUiote
# 8ladjS/nJ0+k6MvqzfpzPDOy5y6gqztiT96Fv/9bH7mQyogxG9QEPHrPV6/7umw0
# 52AkyiLA6tQbZl1KhBtTasySkuJDpsZGKdlsjg4u70EwgWbVRSX1Wd4+zoFpp4Ra
# +MlKM2baoD6x0VR4RjSpWM8o5a6D8bpfm4CLKczsG7ZrIGNTAgMBAAGjggFdMIIB
# WTASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBTvb1NK6eQGfHrK4pBW9i/U
# SezLTjAfBgNVHSMEGDAWgBTs1+OC0nFdZEzfLmc/57qYrhwPTzAOBgNVHQ8BAf8E
# BAMCAYYwEwYDVR0lBAwwCgYIKwYBBQUHAwgwdwYIKwYBBQUHAQEEazBpMCQGCCsG
# AQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQQYIKwYBBQUHMAKGNWh0
# dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRSb290RzQu
# Y3J0MEMGA1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9E
# aWdpQ2VydFRydXN0ZWRSb290RzQuY3JsMCAGA1UdIAQZMBcwCAYGZ4EMAQQCMAsG
# CWCGSAGG/WwHATANBgkqhkiG9w0BAQsFAAOCAgEAF877FoAc/gc9EXZxML2+C8i1
# NKZ/zdCHxYgaMH9Pw5tcBnPw6O6FTGNpoV2V4wzSUGvI9NAzaoQk97frPBtIj+ZL
# zdp+yXdhOP4hCFATuNT+ReOPK0mCefSG+tXqGpYZ3essBS3q8nL2UwM+NMvEuBd/
# 2vmdYxDCvwzJv2sRUoKEfJ+nN57mQfQXwcAEGCvRR2qKtntujB71WPYAgwPyWLKu
# 6RnaID/B0ba2H3LUiwDRAXx1Neq9ydOal95CHfmTnM4I+ZI2rVQfjXQA1WSjjf4J
# 2a7jLzWGNqNX+DF0SQzHU0pTi4dBwp9nEC8EAqoxW6q17r0z0noDjs6+BFo+z7bK
# SBwZXTRNivYuve3L2oiKNqetRHdqfMTCW/NmKLJ9M+MtucVGyOxiDf06VXxyKkOi
# rv6o02OoXN4bFzK0vlNMsvhlqgF2puE6FndlENSmE+9JGYxOGLS/D284NHNboDGc
# mWXfwXRy4kbu4QFhOm0xJuF2EZAOk5eCkhSxZON3rGlHqhpB/8MluDezooIs8CVn
# rpHMiD2wL40mm53+/j7tFaxYKIqL0Q4ssd8xHZnIn/7GELH3IdvG2XlM9q7WP/Uw
# gOkw/HQtyRN62JK4S1C8uw3PdBunvAZapsiI5YKdvlarEvf8EA+8hcpSM9LHJmyr
# xaFtoza2zNaQ9k+5t1wwggbNMIIEtaADAgECAhEAu/DMtbe4Mf0hrjJ3iuQMiTAN
# BgkqhkiG9w0BAQwFADCBgDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8g
# VGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9u
# IEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAy
# MB4XDTIxMDUxOTA1MzIxM1oXDTM2MDUxODA1MzIxM1owajELMAkGA1UEBhMCUEwx
# ITAfBgNVBAoTGEFzc2VjbyBEYXRhIFN5c3RlbXMgUy5BLjE4MDYGA1UEAxMvQ2Vy
# dHVtIEV4dGVuZGVkIFZhbGlkYXRpb24gQ29kZSBTaWduaW5nIDIwMjEgQ0EwggIi
# MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCUvvjwlqjf9eedRTK+NoavZlVx
# mQTPIN1nK5XQRUQWyPWwHD54wa2aD2kRDrAjBf71/T0XN9Oqms5ML/Jolgryv3JW
# 7/yahp7lg/wn3PDnNwzC1BlFMyCdEktQmUXMmE4mmxSutRY1OGGagENWPjbQ1R/x
# 4HuTByWbG+TUV7dIPxE7TMy9Npco4f09DN6QFRXdk7bZTu58kxu6MFH6mzQkC3IX
# vExfo0c/CT4/hTZD2XknHjXLzi9jzInSHS9GQqeXd6nWbkwEu7znKpNEcSElorDS
# EcRhc1OSOLjUK0x0cOw8whzQ0fWGkPoqgCslbjZoko7U7kj/Fn4TWQ8s75LHjhVa
# o+w2SWMP0ELWYIkq1ComGq3wqBD7VU6rtCDoUf237HkgRBxLXFjwp444oKWnchYM
# Z7epWX8jqntSr4QHeidL72c6XswQIIZsFglV4BO28jO02yS7w4iyY0c6PQs34GZ7
# SWphsN1DaiX9ysc6hovVYoVA94t+3p4TI1RtK9Ayh0atmfYPJqtBfk5kJ1h4nNax
# 0lZmJL9chJjZQb+7XW8MQgstiQdsegaz2QL6Edm+94N8IW6TYaalyO9LeR35A9Mo
# TLo79rdB04naTqWdPTBKh7DpS53ZAQn5dYs2per+m7ZeIxnEWaNcG+PbRh+ZslFb
# 6M75JgN43szB+/VYVQIDAQABo4IBVTCCAVEwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
# HQ4EFgQUrFfKCBbcP8UxHApN2/vx3pknLTQwHwYDVR0jBBgwFoAUtqFUOQLDoD+O
# irz61PgcptE6Dv0wDgYDVR0PAQH/BAQDAgEGMBMGA1UdJQQMMAoGCCsGAQUFBwMD
# MDAGA1UdHwQpMCcwJaAjoCGGH2h0dHA6Ly9jcmwuY2VydHVtLnBsL2N0bmNhMi5j
# cmwwbAYIKwYBBQUHAQEEYDBeMCgGCCsGAQUFBzABhhxodHRwOi8vc3ViY2Eub2Nz
# cC1jZXJ0dW0uY29tMDIGCCsGAQUFBzAChiZodHRwOi8vcmVwb3NpdG9yeS5jZXJ0
# dW0ucGwvY3RuY2EyLmNlcjA5BgNVHSAEMjAwMC4GBFUdIAAwJjAkBggrBgEFBQcC
# ARYYaHR0cDovL3d3dy5jZXJ0dW0ucGwvQ1BTMA0GCSqGSIb3DQEBDAUAA4ICAQC7
# khlZjFbU+gsRdcraFFJKj1PL63MVudnm/AILuNaxm7LIZOYtrZaRWEpR0qd3uhSp
# UEI29fMBZvuu3CHXJsM58hbJFo4YoHnyDJgTkeVmc10fd1NI//cI3nRD1/Alx09y
# WhPZlze0A/Bvwc3LcZtTywfsL5tD3QAL8ZqelrHt1Eb8AnDEnAzKNbm1mwYmD/5d
# y1XkIKfsM1pmRM2ZDcJ4qpwVewE7g+4e+Y+iq42LuaHPvNAkwq0daA9Hp3qemk0c
# RFfM5257MvEsu+6w8+44mpQUOgpASVIjY3l2vdf6BUfBJfsd3pcp/2hfDnXaql9A
# oB7ps7eCZb9VXKm/u2lTRMf5esOcZFy4udsnGBaOwSSUe0chYusfJ9IjsmpoMl4C
# W5E0R/U55Bz6TpDo+gaXQJL4i/zv0UR5papGsDguBASp9g/OfnvGTeWrS9l5orEk
# tu9ExrFfPvAKxZK+4AO9bapPhMATraKo6kx6K51pS1ZO2pf1r3B+lXN5bTLgp8g/
# dygUZm2cmauBAzJA5v/iHOb0b4b4Muqc8dxgcX1jZRLtLvxnAWxkKIMfj7A4M0Jr
# N4rLBUpPFM0+Bp2sR7rtFqNZW56huaDkxO75eNRN2z4A959R5GBRnFWtgE65+B1R
# HAQQ/TOF4mU0Y3oIhVQr3rUh4tdSvIxr8QpsDKIvsDCCBu0wggTVoAMCAQICEAqA
# 7xhLjfEFgtHEdqeVdGgwDQYJKoZIhvcNAQELBQAwaTELMAkGA1UEBhMCVVMxFzAV
# BgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQDEzhEaWdpQ2VydCBUcnVzdGVk
# IEc0IFRpbWVTdGFtcGluZyBSU0E0MDk2IFNIQTI1NiAyMDI1IENBMTAeFw0yNTA2
# MDQwMDAwMDBaFw0zNjA5MDMyMzU5NTlaMGMxCzAJBgNVBAYTAlVTMRcwFQYDVQQK
# Ew5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgU0hBMjU2IFJTQTQw
# OTYgVGltZXN0YW1wIFJlc3BvbmRlciAyMDI1IDEwggIiMA0GCSqGSIb3DQEBAQUA
# A4ICDwAwggIKAoICAQDQRqwtEsae0OquYFazK1e6b1H/hnAKAd/KN8wZQjBjMqiZ
# 3xTWcfsLwOvRxUwXcGx8AUjni6bz52fGTfr6PHRNv6T7zsf1Y/E3IU8kgNkeECqV
# Q+3bzWYesFtkepErvUSbf+EIYLkrLKd6qJnuzK8Vcn0DvbDMemQFoxQ2Dsw4vEjo
# T1FpS54dNApZfKY61HAldytxNM89PZXUP/5wWWURK+IfxiOg8W9lKMqzdIo7VA1R
# 0V3Zp3DjjANwqAf4lEkTlCDQ0/fKJLKLkzGBTpx6EYevvOi7XOc4zyh1uSqgr6Un
# bksIcFJqLbkIXIPbcNmA98Oskkkrvt6lPAw/p4oDSRZreiwB7x9ykrjS6GS3NR39
# iTTFS+ENTqW8m6THuOmHHjQNC3zbJ6nJ6SXiLSvw4Smz8U07hqF+8CTXaETkVWz0
# dVVZw7knh1WZXOLHgDvundrAtuvz0D3T+dYaNcwafsVCGZKUhQPL1naFKBy1p6ll
# N3QgshRta6Eq4B40h5avMcpi54wm0i2ePZD5pPIssoszQyF4//3DoK2O65Uck5Wg
# gn8O2klETsJ7u8xEehGifgJYi+6I03UuT1j7FnrqVrOzaQoVJOeeStPeldYRNMmS
# F3voIgMFtNGh86w3ISHNm0IaadCKCkUe2LnwJKa8TIlwCUNVwppwn4D3/Pt5pwID
# AQABo4IBlTCCAZEwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQU5Dv88jHt/f3X85Fx
# YxlQQ89hjOgwHwYDVR0jBBgwFoAU729TSunkBnx6yuKQVvYv1Ensy04wDgYDVR0P
# AQH/BAQDAgeAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMIGVBggrBgEFBQcBAQSB
# iDCBhTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMF0GCCsG
# AQUFBzAChlFodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVz
# dGVkRzRUaW1lU3RhbXBpbmdSU0E0MDk2U0hBMjU2MjAyNUNBMS5jcnQwXwYDVR0f
# BFgwVjBUoFKgUIZOaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1
# c3RlZEc0VGltZVN0YW1waW5nUlNBNDA5NlNIQTI1NjIwMjVDQTEuY3JsMCAGA1Ud
# IAQZMBcwCAYGZ4EMAQQCMAsGCWCGSAGG/WwHATANBgkqhkiG9w0BAQsFAAOCAgEA
# ZSqt8RwnBLmuYEHs0QhEnmNAciH45PYiT9s1i6UKtW+FERp8FgXRGQ/YAavXzWjZ
# hY+hIfP2JkQ38U+wtJPBVBajYfrbIYG+Dui4I4PCvHpQuPqFgqp1PzC/ZRX4pvP/
# ciZmUnthfAEP1HShTrY+2DE5qjzvZs7JIIgt0GCFD9ktx0LxxtRQ7vllKluHWiKk
# 6FxRPyUPxAAYH2Vy1lNM4kzekd8oEARzFAWgeW3az2xejEWLNN4eKGxDJ8WDl/FQ
# USntbjZ80FU3i54tpx5F/0Kr15zW/mJAxZMVBrTE2oi0fcI8VMbtoRAmaaslNXdC
# G1+lqvP4FbrQ6IwSBXkZagHLhFU9HCrG/syTRLLhAezu/3Lr00GrJzPQFnCEH1Y5
# 8678IgmfORBPC1JKkYaEt2OdDh4GmO0/5cHelAK2/gTlQJINqDr6JfwyYHXSd+V0
# 8X1JUPvB4ILfJdmL+66Gp3CSBXG6IwXMZUXBhtCyIaehr0XkBoDIGMUG1dUtwq1q
# mcwbdUfcSYCn+OwncVUXf53VJUNOaMWMts0VlRYxe5nK+At+DI96HAlXHAL5SlfY
# xJ7La54i71McVWRP66bW+yERNpbJCjyCYG2j+bdpxo/1Cy4uPcU3AWVPGrbn5PhD
# Bf3Froguzzhk++ami+r3Qrx5bIbY3TVzgiFI7Gq3zWcxggXaMIIF1gIBATB+MGox
# CzAJBgNVBAYTAlBMMSEwHwYDVQQKExhBc3NlY28gRGF0YSBTeXN0ZW1zIFMuQS4x
# ODA2BgNVBAMTL0NlcnR1bSBFeHRlbmRlZCBWYWxpZGF0aW9uIENvZGUgU2lnbmlu
# ZyAyMDIxIENBAhAfsijAKebq6quDMIHCRvIfMA0GCWCGSAFlAwQCAQUAoIGEMBgG
# CisGAQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcC
# AQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIE
# IBqmEKt4D5E/eXhaNuOQlC2bzbw8PJgFGFO+NyvHzyUCMA0GCSqGSIb3DQEBAQUA
# BIIBgIq6xPtSeIV/wIUJQOO03RT+UEPHU36Lw6CSMYI8OzujZfXeur3vwQ7f47+G
# pjEKBM1fYBEPJXs7UKTmow60rIMhqVm4sqvKgAJIidz3SAbTy6+DyNkUdgMDaRw2
# fvq92Mvg6+p9riJciw9/ucqMtqGedtFrAWHTWYr2Rmc8yiYEMeFyG+U700tTNIqV
# Kb/S3B3Q3Dw2rExETfhXKHvkL7DEn60L1G8s17ztUGuPuwCUqqULQwgeXlS1LDJi
# GdsUqqlDxKMI1Eu5F13K3u+WpoNgYAXpCXmr9q41+NPT7mLLnfIaNWj/Pif14tTr
# sFN2FydJgMjl3azeUVNHlDroKC0d4V3uVO+ic9i6c9I4DxRdxbTpgDmwV81DiSwf
# YEonwS59nE4SL7QuPIa47X6poOh+OWlMMHKS5T7jxxLLHjNIgFlzE/CeqASM4k6s
# 1IGBKztCKWNJe0IqpRsUvrrkvS4TTs58zgnR2SMVw+MeoHA29lP10O0C8G0SPSLl
# 4F9lLqGCAyYwggMiBgkqhkiG9w0BCQYxggMTMIIDDwIBATB9MGkxCzAJBgNVBAYT
# AlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQg
# VHJ1c3RlZCBHNCBUaW1lU3RhbXBpbmcgUlNBNDA5NiBTSEEyNTYgMjAyNSBDQTEC
# EAqA7xhLjfEFgtHEdqeVdGgwDQYJYIZIAWUDBAIBBQCgaTAYBgkqhkiG9w0BCQMx
# CwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0yNjA1MDQxMTA5MzBaMC8GCSqG
# SIb3DQEJBDEiBCBDCHhqSWFcuo+Od87KC5JDa9W7mQ+RG5nAVdA08JYbrTANBgkq
# hkiG9w0BAQEFAASCAgBENr9j8j4eRhLfFdeeF16jgCuq/BaZCGI2zu+Kn1YTa1dl
# rqJenIQ+MAT7TmmiDV9L+Ds8JsjjYpi8zqJ8ZtA/CwXjH3wi2HA5PyyjcpqMbwrc
# OEWZT5BMwR2HZf8w5YjKzQ72hfGUXYDljPDJyF9oRhXCbMujb/mwHecz+ELBOciz
# tyUrRGinA3bdNTChMy2y59DCjaIonAQ2lQuEhIow6bkQ3sF7kA7/WA8pTadK4Ky7
# hAzm/WPkvRUHl2Sft5U2D9AZdpOAZvBwLZ1dWpynVa+gEOEEloWT1T5O2VUgHWrJ
# UGB7/QH5423uZihkmINuInexfMq3jcd/cyvZ1V2p1yf2LzTxZb+K4iYmhCGwk/an
# xTnwKM96ICxa6lLp9sA9zHuadxiqslkF7d9OrhvzmO6/i8I8fAo0AfJa0hZ9X4WN
# BX38XAOW1FUrSYhhSj5KVKsojmnWg63TWJhhH9Z4coSto+uWiNPPAW9WIfIplyUP
# 6ROLFENjRsphLZfVT1+ji92nYofhfvttMhMlk9ETlGNzK+TJgItoeiZAr6nahAIm
# qzJFPhKuY9I5YSAqm2/7OZwjEMjarICl9f8iHGkP9ungEuPbsVc5pKGIj1Bt2FC1
# Ht8N5VuUsG0Jz0E73OlRSycpDRvFM/nU9mQmFF5IpBnmjjQghyilP8Znn44Zpg==
# SIG # End signature block