functions/Get-Sensor.ps1

<#
    .SYNOPSIS
    Get sensor details.
     
    .DESCRIPTION
    List all sensor for a specific sensorhub or get details for a specific sensor.
     
    .PARAMETER Filter
    You can filter the sensors based on the name of the sensor.
 
    .PARAMETER SensorhubId
    The id of the senorhub for wich you want to list the sensors.
 
    .PARAMETER SenorId
    The id of a specifc senor. Only this sensor will be show.
     
    .PARAMETER AuthToken
    Either a session or an API key. If no AuthToken is provided the global Server-Eye session will be used if available.
#>

function Get-Sensor {
    [CmdletBinding(DefaultParameterSetName = "bySensorhub")]
    Param(
        [Parameter(Mandatory = $false, ParameterSetName = "bySensorhub", Position = 0)]
        [string]$Filter,
        [parameter(ValueFromPipelineByPropertyName, ParameterSetName = "bySensorhub")]
        $SensorhubId,
        [parameter(ValueFromPipelineByPropertyName, ParameterSetName = "bySensor")]
        $SensorId,
        [parameter(Mandatory = $false, ValueFromPipelineByPropertyName, ParameterSetName = "bySensorType")]
        $SensorType,
        [parameter(Mandatory = $false, ValueFromPipelineByPropertyName, ParameterSetName = "bySensor")]
        [parameter(Mandatory = $false, ValueFromPipelineByPropertyName, ParameterSetName = "bySensorhub")]
        [parameter(Mandatory = $false, ValueFromPipelineByPropertyName, ParameterSetName = "bySensorType")]
        [switch]$ShowFree,
        [Parameter(Mandatory = $false, ParameterSetName = "bySensor")]
        [Parameter(Mandatory = $false, ParameterSetName = "bySensorhub")]
        [parameter(Mandatory = $false, ValueFromPipelineByPropertyName, ParameterSetName = "bySensorType")]
        $AuthToken,
        [parameter(Mandatory = $false, ValueFromPipelineByPropertyName)]
        [Alias("LineFilter")]
        [string[]]$script:MsgLineFilter,
        [parameter(Mandatory = $false, ValueFromPipelineByPropertyName)]
        [Alias("SpaceFilter")]
        [string[]]$script:MsgSpaceFilter
    )

    Begin {
        $AuthToken = Test-SEAuth -AuthToken $AuthToken
        $agentList = Get-SeApiMyNodesList -Filter agent -AuthToken $AuthToken
        if (!$Global:ServerEyeAgents) {
            $Global:ServerEyeAgents = @()
        }
    }
    
    Process {
        if ($SensorhubId) {
            Write-Debug "SensorhubID will be used $SensorhubId"
            getSensorBySensorhub -sensorhubId $SensorhubId -filter $Filter -auth $AuthToken
        }
        elseif ($SensorId) {
            Write-Debug "SensorID will be used $SensorId"
            getSensorById -sensorId $SensorId -auth $AuthToken
        }
        elseif ($Sensortype) {
            Write-Debug "SensorType will be used $Sensortype"
            $agents = $agentList | Where-Object { $_.agentType -eq $SensorType }
            foreach ($agent in $agents) {
                formatSensorByType -auth $authtoken -agent $agent
            }
        } 
        else {
            Write-Error "Please provide a SensorhubId or a SensorId."
        }
    }

    End {

    }
}

function getSensorBySensorhub ($sensorhubId, $filter, $auth) {
    $agents = Get-SeApiContainerAgentList -AuthToken $auth -CId $sensorhubId 
    $sensorhub = Get-CachedContainer -ContainerID $sensorhubID -AuthToken $auth
    foreach ($sensor in $agents) {
        if ((-not $filter) -or ($sensor.name -like $filter) -or ($sensor.subtype -like $filter)) {
            $sensor = Get-CachedAgent -AgentID $sensor.id -AuthToken $auth
            formatSensor -sensor $sensor -auth $auth -sensorhub $sensorhub -agentList $agentList
        }
    }
}
function getSensorById ($sensorId, $auth) {
    $sensor = Get-CachedAgent -AgentID $sensorId -AuthToken $auth
    $sensorhub = Get-CachedContainer -ContainerID $sensor.parentId -AuthToken $auth
    formatSensor -sensor $sensor -auth $auth -sensorhub $sensorhub -agentList $agentList
}
function formatSensor($sensor, $sensorhub, $agentlist, $auth) {
    $Global:ServerEyeAgents += $sensor
    $type = $Global:ServerEyeSensorTypes.Get_Item($sensor.type)
    $notification = $agentList | Where-Object { $_.id -eq $sensor.aId }
    $MAC = Get-CachedContainer -AuthToken $auth -ContainerID $sensorhub.parentID
    $customer = Get-CachedCustomer -AuthToken $auth -CustomerId $sensorhub.CustomerId
    $SESensor = [PSCustomObject]@{
        Name            = $sensor.name
        SensorType      = $type.defaultName
        SensorTypeID    = $type.agentType
        SensorId        = $sensor.aId
        Interval        = $sensor.interval
        Error           = $notification.state
        HasNotification = If (!$notification) { "Your are not a Manager of this customer, so we can't show that." }else { $notification.hasNotification }
        Sensorhub       = $sensorhub.name
        'OCC-Connector' = $MAC.Name
        Customer        = $customer.Companyname
        Message         = filterMSG($notification.message)
    }
    if ($ShowFree) {
        Add-Member -MemberType NoteProperty -Name forFree -Value $type.forFree -InputObject $SESensor
    }
    Return $SESensor
}

function formatSensorByType($auth, $agent) {
    $type = $Global:ServerEyeSensorTypes.Get_Item($agent.agentType)
    $sensorhub = Get-CachedContainer -ContainerID $agent.parentId -AuthToken $auth
    $MAC = Get-CachedContainer -AuthToken $auth -ContainerID $sensorhub.parentID
    $customer = Get-CachedCustomer -AuthToken $auth -CustomerId $sensorhub.CustomerId
    $SESensor = [PSCustomObject]@{
        Name            = $agent.name
        SensorType      = $type.defaultName
        SensorTypeID    = $type.agentType
        SensorId        = $agent.Id
        Error           = $agent.state
        HasNotification = $agent.hasNotification
        Sensorhub       = $sensorhub.name
        'OCC-Connector' = $MAC.Name
        Customer        = $customer.Companyname
        Message         = filterMSG($agent.message)
    }
    if ($ShowFree) {
        Add-Member -MemberType NoteProperty -Name forFree -Value $type.forFree -InputObject $SESensor
    }
    Return $SESensor
}

function filterMSG($message){
    $result = "";
    if(($script:MsgLineFilter) -and ($script:MsgSpaceFilter)){
        Write-Error "Only one message filter type can be used at a time."
    } elseif ($script:MsgLineFilter){
        foreach ($line in $($message -split "`n"))
            {
                foreach ($lineFilter in $script:MsgLineFilter){
                    if($line -match [regex]::escape($lineFilter)){
                        $result += $line +"`n";
                        break;
                    }
                }
            }
        return $result
    } elseif ($script:MsgSpaceFilter){
        if($script:MsgSpaceFilter.count -ne 2){
            Write-Error "The space filter type only accepts two strings.(-MsgSpaceFilter `"Filter Start`", `"Filter End`")"
        }else{
            $expression = '^' + $script:MsgSpaceFilter[0] + '.$([\s\S]*?)^' + $script:MsgSpaceFilter[1] + '.$'
            
            $matches = [Regex]::Matches($message, $expression, "Multiline");
            if($matches.groups.count -ge 1){
                return $matches.groups[1].value
            }
        }
    } else{
        return $message
    }
}
# SIG # Begin signature block
# MIIu4gYJKoZIhvcNAQcCoIIu0zCCLs8CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU9pbrnUI1I5Hd57qMPFu9cRJU
# hpKggiicMIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQG
# EwJHQjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxm
# b3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENl
# cnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1
# OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQ
# MA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAf
# BgNVBAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB
# BQADggEPADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686td
# UIoWMQuaBtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJ
# VfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCo
# kcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4
# qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
# Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNV
# HQ4EFgQUoBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud
# EwEB/wQFMAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9j
# YS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9j
# cmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG
# 9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3s
# Ag9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2
# LX1rzNLzRt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8
# tqtlbgT2G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs
# 1OUIJqsil2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XX
# vi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbjCCBW8wggRXoAMCAQICEEj8k7Rg
# VZSNNqfJionWlBYwDQYJKoZIhvcNAQEMBQAwezELMAkGA1UEBhMCR0IxGzAZBgNV
# BAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UE
# CgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMMGEFBQSBDZXJ0aWZpY2F0ZSBT
# ZXJ2aWNlczAeFw0yMTA1MjUwMDAwMDBaFw0yODEyMzEyMzU5NTlaMFYxCzAJBgNV
# BAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxLTArBgNVBAMTJFNlY3Rp
# Z28gUHVibGljIENvZGUgU2lnbmluZyBSb290IFI0NjCCAiIwDQYJKoZIhvcNAQEB
# BQADggIPADCCAgoCggIBAI3nlBIiBCR0Lv8WIwKSirauNoWsR9QjkSs+3H3iMaBR
# b6yEkeNSirXilt7Qh2MkiYr/7xKTO327toq9vQV/J5trZdOlDGmxvEk5mvFtbqrk
# oIMn2poNK1DpS1uzuGQ2pH5KPalxq2Gzc7M8Cwzv2zNX5b40N+OXG139HxI9ggN2
# 5vs/ZtKUMWn6bbM0rMF6eNySUPJkx6otBKvDaurgL6en3G7X6P/aIatAv7nuDZ7G
# 2Z6Z78beH6kMdrMnIKHWuv2A5wHS7+uCKZVwjf+7Fc/+0Q82oi5PMpB0RmtHNRN3
# BTNPYy64LeG/ZacEaxjYcfrMCPJtiZkQsa3bPizkqhiwxgcBdWfebeljYx42f2mJ
# vqpFPm5aX4+hW8udMIYw6AOzQMYNDzjNZ6hTiPq4MGX6b8fnHbGDdGk+rMRoO7Hm
# ZzOatgjggAVIQO72gmRGqPVzsAaV8mxln79VWxycVxrHeEZ8cKqUG4IXrIfptskO
# gRxA1hYXKfxcnBgr6kX1773VZ08oXgXukEx658b00Pz6zT4yRhMgNooE6reqB0ac
# DZM6CWaZWFwpo7kMpjA4PNBGNjV8nLruw9X5Cnb6fgUbQMqSNenVetG1fwCuqZCq
# xX8BnBCxFvzMbhjcb2L+plCnuHu4nRU//iAMdcgiWhOVGZAA6RrVwobx447sX/Tl
# AgMBAAGjggESMIIBDjAfBgNVHSMEGDAWgBSgEQojPpbxB+zirynvgqV/0DCktDAd
# BgNVHQ4EFgQUMuuSmv81lkgvKEBCcCA2kVwXheYwDgYDVR0PAQH/BAQDAgGGMA8G
# A1UdEwEB/wQFMAMBAf8wEwYDVR0lBAwwCgYIKwYBBQUHAwMwGwYDVR0gBBQwEjAG
# BgRVHSAAMAgGBmeBDAEEATBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsLmNv
# bW9kb2NhLmNvbS9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDA0BggrBgEFBQcB
# AQQoMCYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNvbTANBgkq
# hkiG9w0BAQwFAAOCAQEAEr+h74t0mphEuGlGtaskCgykime4OoG/RYp9UgeojR9O
# IYU5o2teLSCGvxC4rnk7U820+9hEvgbZXGNn1EAWh0SGcirWMhX1EoPC+eFdEUBn
# 9kIncsUj4gI4Gkwg4tsB981GTyaifGbAUTa2iQJUx/xY+2wA7v6Ypi6VoQxTKR9v
# 2BmmT573rAnqXYLGi6+Ap72BSFKEMdoy7BXkpkw9bDlz1AuFOSDghRpo4adIOKnR
# NiV3wY0ZFsWITGZ9L2POmOhp36w8qF2dyRxbrtjzL3TPuH7214OdEZZimq5FE9p/
# 3Ef738NSn+YGVemdjPI6YlG87CQPKdRYgITkRXta2DCCBdIwggQ6oAMCAQICEQC3
# hK8bsDEjswfwAlUoGMUIMA0GCSqGSIb3DQEBDAUAMFQxCzAJBgNVBAYTAkdCMRgw
# FgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxKzApBgNVBAMTIlNlY3RpZ28gUHVibGlj
# IENvZGUgU2lnbmluZyBDQSBSMzYwHhcNMjMwMzIxMDAwMDAwWhcNMjUwMzIwMjM1
# OTU5WjBoMQswCQYDVQQGEwJERTERMA8GA1UECAwIU2FhcmxhbmQxIjAgBgNVBAoM
# GUtyw6RtZXIgSVQgU29sdXRpb25zIEdtYkgxIjAgBgNVBAMMGUtyw6RtZXIgSVQg
# U29sdXRpb25zIEdtYkgwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDT
# H/TMSn4rSnHOZjwUP2kGzD93pkzF6qxtBuqHIXHRVyo6+T1mhFrGD35pzjDmGaqj
# a7heZan1yQF5Y9D/m9ckfJFzbeS1f+sGKkU1ZV/YEUsicOgKHKQ6SQBRWOjMmZft
# PnVkQiGmtDd/zy7MBYmdFCJHMvWqKQQfuDWFJO3nCPfSQ1wNWG6FTfywqIFaJNN1
# ytGb1idiL039QhXXnFD3iLCSog+imaZ6Wj9HLAOyCQ9w72C/eHN1iWhVnh1oFkNi
# g9b0EGObHgxYmg8cly6Jntqc6uhptVxzLMehmbhJ+jw92NoohAG9XrFlbtN8Fc7x
# e1rUt4XgvZnVfa4dEiWolgbJhDRsqtE1wsnhXY2prFE1AqhDykfT8aEx3byuv3a2
# IpxF7x0wzpoj3WRe492K9Pn2gIEDTJg1YINaOf41WA8Z8kWv+//Kp/Hqyc0lGb1b
# UM7gkVX0YowM7y8lWouqOV73VUI+wd94ETGrlxYb/UOuex+ZoJzmelhege8Lc7kC
# AwEAAaOCAYkwggGFMB8GA1UdIwQYMBaAFA8qyyCHKLjsb0iuK1SmKaoXpM0MMB0G
# A1UdDgQWBBQl9gPVw/AoEEo6c51A3Y77YrisfjAOBgNVHQ8BAf8EBAMCB4AwDAYD
# VR0TAQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcDAzBKBgNVHSAEQzBBMDUGDCsG
# AQQBsjEBAgEDAjAlMCMGCCsGAQUFBwIBFhdodHRwczovL3NlY3RpZ28uY29tL0NQ
# UzAIBgZngQwBBAEwSQYDVR0fBEIwQDA+oDygOoY4aHR0cDovL2NybC5zZWN0aWdv
# LmNvbS9TZWN0aWdvUHVibGljQ29kZVNpZ25pbmdDQVIzNi5jcmwweQYIKwYBBQUH
# AQEEbTBrMEQGCCsGAQUFBzAChjhodHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3Rp
# Z29QdWJsaWNDb2RlU2lnbmluZ0NBUjM2LmNydDAjBggrBgEFBQcwAYYXaHR0cDov
# L29jc3Auc2VjdGlnby5jb20wDQYJKoZIhvcNAQEMBQADggGBAFPJOJKmNMi/Lo5U
# OPXXjgQ7PVcBwRKTNiqScDJo8rU3/meYIjat/LRexYEWi7szclq4I01t+MSdgJYU
# oXlp2SAwvTp2oxMEeuUgv4OgxEpWB8e5EOYzJjYJDdGHKzTZ6Ay8dFn6/+WPjDzL
# VZDUqsbdbiho/oKjmYOFw3qhLt4M5znbeaHgGRRwqxu8kQUio1CroT4dTyqYpeHo
# ePICW2zEsYl9h2LJ0jXWPzPv7qXf47bjW/Envgop5Zpf7U9dLpwT6TqombyypwOJ
# zDGbvbxFt0lDZN89L/HPyCxftzf3+V6YARV32wY10U88eMyy8hhvl53bsF3BCPHn
# fEHit5LzS/4oD58E9pShIgO3+zVEMNOIhFKE29DF1HwcKrdzXmpJamsZnSK8LOLn
# ZSuqYiMOl/IwN9fhZqdszCruK4UvYpz0ynrHNeA7VhaRaqH10fmqPe2MSPXL7Zbt
# JDK4TPOtwJQyT6LCUktfl3naE2vcecgz0oG6U+Vh5JCumNVoDzCCBhQwggP8oAMC
# AQICEHojrtpTaZYPkcg+XPTH4z8wDQYJKoZIhvcNAQEMBQAwVzELMAkGA1UEBhMC
# R0IxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDEuMCwGA1UEAxMlU2VjdGlnbyBQ
# dWJsaWMgVGltZSBTdGFtcGluZyBSb290IFI0NjAeFw0yMTAzMjIwMDAwMDBaFw0z
# NjAzMjEyMzU5NTlaMFUxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExp
# bWl0ZWQxLDAqBgNVBAMTI1NlY3RpZ28gUHVibGljIFRpbWUgU3RhbXBpbmcgQ0Eg
# UjM2MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAzZjYQ0GrboIr7PYz
# fiY05ImM0+8iEoBUPu8mr4wOgYPjoiIz5vzf7d5wu8GFK1JWN5hciN9rdqOhbdxL
# cSVwnOTJmUGfAMQm4eXOls3iQwfapEFWuOsYmBKXPNSpwZAFoLGl5y1EaGGc5LBy
# M8wjcbSF52/Z42YaJRsPXY545E3QAPN2mxDh0OLozhiGgYT1xtjXVfEzYBVmfQaI
# 5QL35cTTAjsJAp85R+KAsOfuL9Z7LFnjdcuPkZWjssMETFIueH69rxbFOUD64G+r
# Uo7xFIdRAuDNvWBsv0iGDPGaR2nZlY24tz5fISYk1sPY4gir99aXAGnoo0vX3Oke
# w4MsiyBn5ZnUDMKzUcQrpVavGacrIkmDYu/bcOUR1mVBIZ0X7P4bKf38JF7Mp7tY
# 3LFF/h7hvBS2tgTYXlD7TnIMPrxyXCfB5yQq3FFoXRXM3/DvqQ4shoVWF/mwwz9x
# oRku05iphp22fTfjKRIVpm4gFT24JKspEpM8mFa9eTgKWWCvAgMBAAGjggFcMIIB
# WDAfBgNVHSMEGDAWgBT2d2rdP/0BE/8WoWyCAi/QCj0UJTAdBgNVHQ4EFgQUX1jt
# TDF6omFCjVKAurNhlxmiMpswDgYDVR0PAQH/BAQDAgGGMBIGA1UdEwEB/wQIMAYB
# Af8CAQAwEwYDVR0lBAwwCgYIKwYBBQUHAwgwEQYDVR0gBAowCDAGBgRVHSAAMEwG
# A1UdHwRFMEMwQaA/oD2GO2h0dHA6Ly9jcmwuc2VjdGlnby5jb20vU2VjdGlnb1B1
# YmxpY1RpbWVTdGFtcGluZ1Jvb3RSNDYuY3JsMHwGCCsGAQUFBwEBBHAwbjBHBggr
# BgEFBQcwAoY7aHR0cDovL2NydC5zZWN0aWdvLmNvbS9TZWN0aWdvUHVibGljVGlt
# ZVN0YW1waW5nUm9vdFI0Ni5wN2MwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLnNl
# Y3RpZ28uY29tMA0GCSqGSIb3DQEBDAUAA4ICAQAS13sgrQ41WAyegR0lWP1MLWd0
# r8diJiH2VVRpxqFGhnZbaF+IQ7JATGceTWOS+kgnMAzGYRzpm8jIcjlSQ8Jtcqym
# Khgx1s6cFZBSfvfeoyigF8iCGlH+SVSo3HHr98NepjSFJTU5KSRKK+3nVSWYkSVQ
# gJlgGh3MPcz9IWN4I/n1qfDGzqHCPWZ+/Mb5vVyhgaeqxLPbBIqv6cM74Nvyo1xN
# sllECJJrOvsrJQkajVz4xJwZ8blAdX5umzwFfk7K/0K3fpjgiXpqNOpXaJ+KSRW0
# HdE0FSDC7+ZKJJSJx78mn+rwEyT+A3z7Ss0gT5CpTrcmhUwIw9jbvnYuYRKxFVWj
# KklW3z83epDVzoWJttxFpujdrNmRwh1YZVIB2guAAjEQoF42H0BA7WBCueHVMDyV
# 1e4nM9K4As7PVSNvQ8LI1WRaTuGSFUd9y8F8jw22BZC6mJoB40d7SlZIYfaildlg
# pgbgtu6SDsek2L8qomG57Yp5qTqof0DwJ4Q4HsShvRl/59T4IJBovRwmqWafH0cI
# PEX7cEttS5+tXrgRtMjjTOp6A9l0D6xcKZtxnLqiTH9KPCy6xZEi0UDcMTww5Fl4
# VvoGbMG2oonuX3f1tsoHLaO/Fwkj3xVr3lDkmeUqivebQTvGkx5hGuJaSVQ+x60x
# J/Y29RBr8Tm9XJ59AjCCBhowggQCoAMCAQICEGIdbQxSAZ47kHkVIIkhHAowDQYJ
# KoZIhvcNAQEMBQAwVjELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1NlY3RpZ28gTGlt
# aXRlZDEtMCsGA1UEAxMkU2VjdGlnbyBQdWJsaWMgQ29kZSBTaWduaW5nIFJvb3Qg
# UjQ2MB4XDTIxMDMyMjAwMDAwMFoXDTM2MDMyMTIzNTk1OVowVDELMAkGA1UEBhMC
# R0IxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDErMCkGA1UEAxMiU2VjdGlnbyBQ
# dWJsaWMgQ29kZSBTaWduaW5nIENBIFIzNjCCAaIwDQYJKoZIhvcNAQEBBQADggGP
# ADCCAYoCggGBAJsrnVP6NT+OYAZDasDP9X/2yFNTGMjO02x+/FgHlRd5ZTMLER4A
# RkZsQ3hAyAKwktlQqFZOGP/I+rLSJJmFeRno+DYDY1UOAWKA4xjMHY4qF2p9YZWh
# hbeFpPb09JNqFiTCYy/Rv/zedt4QJuIxeFI61tqb7/foXT1/LW2wHyN79FXSYiTx
# cv+18Irpw+5gcTbXnDOsrSHVJYdPE9s+5iRF2Q/TlnCZGZOcA7n9qudjzeN43OE/
# TpKF2dGq1mVXn37zK/4oiETkgsyqA5lgAQ0c1f1IkOb6rGnhWqkHcxX+HnfKXjVo
# dTmmV52L2UIFsf0l4iQ0UgKJUc2RGarhOnG3B++OxR53LPys3J9AnL9o6zlviz5p
# zsgfrQH4lrtNUz4Qq/Va5MbBwuahTcWk4UxuY+PynPjgw9nV/35gRAhC3L81B3/b
# IaBb659+Vxn9kT2jUztrkmep/aLb+4xJbKZHyvahAEx2XKHafkeKtjiMqcUf/2BG
# 935A591GsllvWwIDAQABo4IBZDCCAWAwHwYDVR0jBBgwFoAUMuuSmv81lkgvKEBC
# cCA2kVwXheYwHQYDVR0OBBYEFA8qyyCHKLjsb0iuK1SmKaoXpM0MMA4GA1UdDwEB
# /wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/AgEAMBMGA1UdJQQMMAoGCCsGAQUFBwMD
# MBsGA1UdIAQUMBIwBgYEVR0gADAIBgZngQwBBAEwSwYDVR0fBEQwQjBAoD6gPIY6
# aHR0cDovL2NybC5zZWN0aWdvLmNvbS9TZWN0aWdvUHVibGljQ29kZVNpZ25pbmdS
# b290UjQ2LmNybDB7BggrBgEFBQcBAQRvMG0wRgYIKwYBBQUHMAKGOmh0dHA6Ly9j
# cnQuc2VjdGlnby5jb20vU2VjdGlnb1B1YmxpY0NvZGVTaWduaW5nUm9vdFI0Ni5w
# N2MwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLnNlY3RpZ28uY29tMA0GCSqGSIb3
# DQEBDAUAA4ICAQAG/4Lhd2M2bnuhFSCbE/8E/ph1RGHDVpVx0ZE/haHrQECxyNbg
# cv2FymQ5PPmNS6Dah66dtgCjBsULYAor5wxxcgEPRl05pZOzI3IEGwwsepp+8iGs
# LKaVpL3z5CmgELIqmk/Q5zFgR1TSGmxqoEEhk60FqONzDn7D8p4W89h8sX+V1ima
# Ub693TGqWp3T32IKGfIgy9jkd7GM7YCa2xulWfQ6E1xZtYNEX/ewGnp9ZeHPsNww
# viJMBZL4xVd40uPWUnOJUoSiugaz0yWLODRtQxs5qU6E58KKmfHwJotl5WZ7nIQu
# DT0mWjwEx7zSM7fs9Tx6N+Q/3+49qTtUvAQsrEAxwmzOTJ6Jp6uWmHCgrHW4dHM3
# ITpvG5Ipy62KyqYovk5O6cC+040Si15KJpuQ9VJnbPvqYqfMB9nEKX/d2rd1Q3Di
# uDexMKCCQdJGpOqUsxLuCOuFOoGbO7Uv3RjUpY39jkkp0a+yls6tN85fJe+Y8voT
# nbPU1knpy24wUFBkfenBa+pRFHwCBB1QtS+vGNRhsceP3kSPNrrfN2sRzFYsNfrF
# aWz8YOdU254qNZQfd9O/VjxZ2Gjr3xgANHtM3HxfzPYF6/pKK8EE4dj66qKKtm2D
# TL1KFCg/OYJyfrdLJq1q2/HXntgr2GVw+ZWhrWgMTn8v1SjZsLlrgIfZHDCCBl0w
# ggTFoAMCAQICEDpSaiyEzlXmHWX8zBLY6YkwDQYJKoZIhvcNAQEMBQAwVTELMAkG
# A1UEBhMCR0IxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDEsMCoGA1UEAxMjU2Vj
# dGlnbyBQdWJsaWMgVGltZSBTdGFtcGluZyBDQSBSMzYwHhcNMjQwMTE1MDAwMDAw
# WhcNMzUwNDE0MjM1OTU5WjBuMQswCQYDVQQGEwJHQjETMBEGA1UECBMKTWFuY2hl
# c3RlcjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTAwLgYDVQQDEydTZWN0aWdv
# IFB1YmxpYyBUaW1lIFN0YW1waW5nIFNpZ25lciBSMzUwggIiMA0GCSqGSIb3DQEB
# AQUAA4ICDwAwggIKAoICAQCN0Wf0wUibvf04STpNYYGbw9jcRaVhBDaNBp7jmJaA
# 9dQZW5ighrXGNMYjK7Dey5RIHMqLIbT9z9if753mYbojJrKWO4ZP0N5dBT2TwZZa
# Pb8E+hqaDZ8Vy2c+x1NiEwbEzTrPX4W3QFq/zJvDDbWKL99qLL42GJQzX3n5wWo6
# 0KklfFn+Wb22mOZWYSqkCVGl8aYuE12SqIS4MVO4PUaxXeO+4+48YpQlNqbc/ndT
# gszRQLF4MjxDPjRDD1M9qvpLTZcTGVzxfViyIToRNxPP6DUiZDU6oXARrGwyP9ag
# lPXwYbkqI2dLuf9fiIzBugCDciOly8TPDgBkJmjAfILNiGcVEzg+40xUdhxNcaC+
# 6r0juPiR7bzXHh7v/3RnlZuT3ZGstxLfmE7fRMAFwbHdDz5gtHLqjSTXDiNF58Ix
# PtvmZPG2rlc+Yq+2B8+5pY+QZn+1vEifI0MDtiA6BxxQuOnj4PnqDaK7NEKwtD1p
# zoA3jJFuoJiwbatwhDkg1PIjYnMDbDW+wAc9FtRN6pUsO405jaBgigoFZCw9hWjL
# NqgFVTo7lMb5rVjJ9aSBVVL2dcqzyFW2LdWk5Xdp65oeeOALod7YIIMv1pbqC15R
# 7QCYLxcK1bCl4/HpBbdE5mjy9JR70BHuYx27n4XNOZbwrXcG3wZf9gEUk7stbPAo
# BQIDAQABo4IBjjCCAYowHwYDVR0jBBgwFoAUX1jtTDF6omFCjVKAurNhlxmiMpsw
# HQYDVR0OBBYEFGjvpDJJabZSOB3qQzks9BRqngyFMA4GA1UdDwEB/wQEAwIGwDAM
# BgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMEoGA1UdIARDMEEw
# NQYMKwYBBAGyMQECAQMIMCUwIwYIKwYBBQUHAgEWF2h0dHBzOi8vc2VjdGlnby5j
# b20vQ1BTMAgGBmeBDAEEAjBKBgNVHR8EQzBBMD+gPaA7hjlodHRwOi8vY3JsLnNl
# Y3RpZ28uY29tL1NlY3RpZ29QdWJsaWNUaW1lU3RhbXBpbmdDQVIzNi5jcmwwegYI
# KwYBBQUHAQEEbjBsMEUGCCsGAQUFBzAChjlodHRwOi8vY3J0LnNlY3RpZ28uY29t
# L1NlY3RpZ29QdWJsaWNUaW1lU3RhbXBpbmdDQVIzNi5jcnQwIwYIKwYBBQUHMAGG
# F2h0dHA6Ly9vY3NwLnNlY3RpZ28uY29tMA0GCSqGSIb3DQEBDAUAA4IBgQCw3C7J
# +k82TIov9slP1e8YTx+fDsa//hJ62Y6SMr2E89rv82y/n8we5W6z5pfBEWozlW7n
# Wp+sdPCdUTFw/YQcqvshH6b9Rvs9qZp5Z+V7nHwPTH8yzKwgKzTTG1I1XEXLAK9f
# HnmXpaDeVeI8K6Lw3iznWZdLQe3zl+Rejdq5l2jU7iUfMkthfhFmi+VVYPkR/BXp
# V7Ub1QyyWebqkjSHJHRmv3lBYbQyk08/S7TlIeOr9iQ+UN57fJg4QI0yqdn6Pyie
# hS1nSgLwKRs46T8A6hXiSn/pCXaASnds0LsM5OVoKYfbgOOlWCvKfwUySWoSgrhn
# cihSBXxH2pAuDV2vr8GOCEaePZc0Dy6O1rYnKjGmqm/IRNkJghSMizr1iIOPN+23
# futBXAhmx8Ji/4NTmyH9K0UvXHiuA2Pa3wZxxR9r9XeIUVb2V8glZay+2ULlc445
# CzCvVSZV01ZB6bgvCuUuBx079gCcepjnZDCcEuIC5Se4F6yFaZ8RvmiJ4hgwggaC
# MIIEaqADAgECAhA2wrC9fBs656Oz3TbLyXVoMA0GCSqGSIb3DQEBDAUAMIGIMQsw
# CQYDVQQGEwJVUzETMBEGA1UECBMKTmV3IEplcnNleTEUMBIGA1UEBxMLSmVyc2V5
# IENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEuMCwGA1UEAxMl
# VVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0yMTAzMjIw
# MDAwMDBaFw0zODAxMTgyMzU5NTlaMFcxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9T
# ZWN0aWdvIExpbWl0ZWQxLjAsBgNVBAMTJVNlY3RpZ28gUHVibGljIFRpbWUgU3Rh
# bXBpbmcgUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCI
# ndi5RWedHd3ouSaBmlRUwHxJBZvMWhUP2ZQQRLRBQIF3FJmp1OR2LMgIU14g0JIl
# L6VXWKmdbmKGRDILRxEtZdQnOh2qmcxGzjqemIk8et8sE6J+N+Gl1cnZocew8eCA
# awKLu4TRrCoqCAT8uRjDeypoGJrruH/drCio28aqIVEn45NZiZQI7YYBex48eL78
# lQ0BrHeSmqy1uXe9xN04aG0pKG9ki+PC6VEfzutu6Q3IcZZfm00r9YAEp/4aeiLh
# yaKxLuhKKaAdQjRaf/h6U13jQEV1JnUTCm511n5avv4N+jSVwd+Wb8UMOs4netap
# q5Q/yGyiQOgjsP/JRUj0MAT9YrcmXcLgsrAimfWY3MzKm1HCxcquinTqbs1Q0d2V
# MMQyi9cAgMYC9jKc+3mW62/yVl4jnDcw6ULJsBkOkrcPLUwqj7poS0T2+2JMzPP+
# jZ1h90/QpZnBkhdtixMiWDVgh60KmLmzXiqJc6lGwqoUqpq/1HVHm+Pc2B6+wCy/
# GwCcjw5rmzajLbmqGygEgaj/OLoanEWP6Y52Hflef3XLvYnhEY4kSirMQhtberRv
# aI+5YsD3XVxHGBjlIli5u+NrLedIxsE88WzKXqZjj9Zi5ybJL2WjeXuOTbswB7Xj
# kZbErg7ebeAQUQiS/uRGZ58NHs57ZPUfECcgJC+v2wIDAQABo4IBFjCCARIwHwYD
# VR0jBBgwFoAUU3m/WqorSs9UgOHYm8Cd8rIDZsswHQYDVR0OBBYEFPZ3at0//QET
# /xahbIICL9AKPRQlMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MBMG
# A1UdJQQMMAoGCCsGAQUFBwMIMBEGA1UdIAQKMAgwBgYEVR0gADBQBgNVHR8ESTBH
# MEWgQ6BBhj9odHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVNFUlRydXN0UlNBQ2Vy
# dGlmaWNhdGlvbkF1dGhvcml0eS5jcmwwNQYIKwYBBQUHAQEEKTAnMCUGCCsGAQUF
# BzABhhlodHRwOi8vb2NzcC51c2VydHJ1c3QuY29tMA0GCSqGSIb3DQEBDAUAA4IC
# AQAOvmVB7WhEuOWhxdQRh+S3OyWM637ayBeR7djxQ8SihTnLf2sABFoB0DFR6JfW
# S0snf6WDG2gtCGflwVvcYXZJJlFfym1Doi+4PfDP8s0cqlDmdfyGOwMtGGzJ4iIm
# yaz3IBae91g50QyrVbrUoT0mUGQHbRcF57olpfHhQEStz5i6hJvVLFV/ueQ21SM9
# 9zG4W2tB1ExGL98idX8ChsTwbD/zIExAopoe3l6JrzJtPxj8V9rocAnLP2C8Q5wX
# VVZcbw4x4ztXLsGzqZIiRh5i111TW7HV1AtsQa6vXy633vCAbAOIaKcLAo/IU7sC
# lyZUk62XD0VUnHD+YvVNvIGezjM6CRpcWed/ODiptK+evDKPU2K6synimYBaNH49
# v9Ih24+eYXNtI38byt5kIvh+8aW88WThRpv8lUJKaPn37+YHYafob9Rg7LyTrSYp
# yZoBmwRWSE4W6iPjB7wJjJpH29308ZkpKKdpkiS9WNsf/eeUtvRrtIEiSJHN899L
# 1P4l6zKVsdrUu1FX1T/ubSrsxrYJD+3f3aKg6yxdbugot06YwGXXiy5UUGZvOu3l
# XlxA+fC13dQ5OlL2gIb5lmF6Ii8+CQOYDwXM+yd9dbmocQsHjcRPsccUd5E9Fisw
# EqORvz8g3s+jR3SFCgXhN4wz7NgAnOgpCdUo4uDyllU9PzGCBbAwggWsAgEBMGkw
# VDELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDErMCkGA1UE
# AxMiU2VjdGlnbyBQdWJsaWMgQ29kZSBTaWduaW5nIENBIFIzNgIRALeErxuwMSOz
# B/ACVSgYxQgwCQYFKw4DAhoFAKB4MBgGCisGAQQBgjcCAQwxCjAIoAKAAKECgAAw
# GQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisG
# AQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFIMcOCMJdy82TDzElUOUO0qYLRF8MA0G
# CSqGSIb3DQEBAQUABIIBgIUFdbtUYPYjZeet/p9B1YlLQ6x4X2NWwK3SiAASYvQ0
# +j1BE+MdcvKGpYlGuPScWkAtW9MO15WLgDdFRn7fgg5cO6fRyLgQFC08bKYNPMsC
# aj8J0y3oO1aIrOD524FzCPHQMXxJAfVduFcC/RrvAcJcq51H831fyPHdtK0mIOdJ
# gSJGk0Df3CZhhALH9CGgAl1STJYUbOKnWi2yIUFkgdYiadveNIlhzSchOoyHfHwK
# ICn6w9dj2hhgeFbdNB7zmzo7dZPUy61GlBnD0WbxgS/hcS1qMUPrFd9v1Cz/CTee
# O4OIwKI4kFCgzAMrXyBeD7VFM97Qv60TnmhzKKKkSpy3Vg0V1xe/OPYecwz7OryI
# tLEoy4gEtmsCMuRSE1Y4Fe1ywt6tgKSEPYNMlPCGycXNz4IDoB47n6Seqv1Acn52
# PTL3jOHGwnFsr3NTzWtuucXQJA90tIFXQL8v7qIsPTs5IUKICuDIlUyYKU9hVyYz
# 5rWxKXaJWdXO8HOURerOHKGCAyIwggMeBgkqhkiG9w0BCQYxggMPMIIDCwIBATBp
# MFUxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxLDAqBgNV
# BAMTI1NlY3RpZ28gUHVibGljIFRpbWUgU3RhbXBpbmcgQ0EgUjM2AhA6UmoshM5V
# 5h1l/MwS2OmJMA0GCWCGSAFlAwQCAgUAoHkwGAYJKoZIhvcNAQkDMQsGCSqGSIb3
# DQEHATAcBgkqhkiG9w0BCQUxDxcNMjQwOTMwMTM1NTU5WjA/BgkqhkiG9w0BCQQx
# MgQwvdDs15zBUjpE5s3oNEJMGhX45faxdWSYZ5KpdAVoLwvTOHqmI+PNU1OuY2GV
# kA4pMA0GCSqGSIb3DQEBAQUABIICABl52y7lKBUKPQROviPTXSGV/ZV0/c1M1u/6
# nDToNMj6r51KoEvHdpML3ANMbsls/m5wHy5ioLfZUICT+x60mHwhGjWakW+U0y67
# iM9axSJ6Bu6NJ5/bvTpXVXi6FWHjzJzfrO8h8ZMuG3Txh6xvb5HA9adm357vdV9v
# X3ntjeQT7Mb4kt3vDLI7M24eiPoVP6zQ6z7OTA+mr3tK1cWjNTZ+Qs5/t1SbLxDz
# YytprA4w8KQFTO4bOjYDrgjU0ijWia59Da2e84zgFhdqPT0PF+fZlrIWRpzeLiOE
# gjPLU4Yue/QjKHbMH2fxkhYdfXJWoX5MH0KM19dTIbsjtl06vkuHQ1IYiV/aQuTO
# cgmkQnxDsG5Mk86t3Oj8uqmwVQeIpHssSFhiE2p4NaniOQjuoBnrlqr69/93xrAp
# TmYH6yvAozEOLHT+aRC+RIqRX7eNrN1+pp+rS6nVxvTe2D3s06uCSFm3wkEefQiy
# vWjhW1lwvzRialbVPhvJtc1j74+XNgZufLcOH0TqHxmgAGxVAYoCTVgu1A6CNuWU
# vJJ7TiG/ArH26pZwGBNojJOpDbo7ev64VdhJuyIOKEYyFhKwQr/guyQt5eZDCZMT
# lCNHFk7mkENjirABsP1Wc4sopkPLnd21OFtr6udyzBxPqvVqg6SZ4yEEJDwe/kur
# JZAHdi7b
# SIG # End signature block