functions/Set-WUGDeviceProperties.ps1

<#
.SYNOPSIS
Sets properties of one or more devices in WhatsUp Gold.
 
.SYNTAX
Set-WUGDeviceProperties [-DeviceID] <array> [[-DisplayName] <string>] [[-isWireless] <boolean>] [[-collectWireless] <boolean>] [[-keepDetailsCurrent] <boolean>] [[-note] <string>] [[-snmpOid] <string>] [[-actionPolicy] <array>]
 
.DESCRIPTION
The Set-WUGDeviceProperties function allows you to set properties for one or more devices in WhatsUp Gold. You can specify the device ID(s) using the -DeviceID parameter. If you do not specify this parameter, you will be prompted to enter the device ID(s). Other parameters allow you to specify various properties to set for the devices.
 
.PARAMETER DeviceID <array>
Specifies the device ID(s) of the device(s) for which you want to set properties. This parameter is mandatory.
 
.PARAMETER DisplayName <string>
Specifies the display name of the device. Default is null.
 
.PARAMETER isWireless <boolean>
Specifies whether the device is a wireless device. Default is null.
 
.PARAMETER collectWireless <boolean>
Specifies whether wireless information should be collected for the device. Default is null.
 
.PARAMETER keepDetailsCurrent <boolean>
Specifies whether details should be kept current for the device. Default is null.
 
.PARAMETER note <string>
Specifies notes for the device. Default is null.
 
.PARAMETER snmpOid <string>
Specifies the SNMP OID for the device. Default is null.
 
.PARAMETER actionPolicyName <string>
Specifies the action policy name to assign to the device. Default is null.
 
.PARAMETER actionPolicyId <string>
Specifies the action policy ID to assign to the device. Default is null.
 
.EXAMPLE
    Set-WUGDeviceProperties -DeviceId 42 -DisplayName "Web Server 01"
 
    Sets the display name of device 42 to "Web Server 01".
 
.EXAMPLE
    Set-WUGDeviceProperties -DeviceId 42 -note "Production server" -keepDetailsCurrent $true
 
    Sets the note and enables keeping details current for device 42.
 
.EXAMPLE
    Set-WUGDeviceProperties -DeviceId 1,2,3 -DisplayName "Batch Update"
 
    Updates the display name for devices 1, 2, and 3 in a batch PATCH request.
 
.NOTES
    Author: Jason Alberino (jason@wug.ninja) 2023-03-24
    Last modified: 2024-03-15
    Reference: https://docs.ipswitch.com/NM/WhatsUpGold2024/02_Guides/rest_api/#tag/Device-Properties
#>

function Set-WUGDeviceProperties {
    [CmdletBinding(SupportsShouldProcess = $true)]
    param (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)][Alias('id')][int[]]$DeviceId,
        [Parameter()] [string] $DisplayName,
        [Parameter()] [boolean] $isWireless,
        [Parameter()] [boolean] $collectWireless,
        [Parameter()] [boolean] $keepDetailsCurrent,
        [Parameter()] [string] $note,
        [Parameter()] [string] $snmpOid,
        [Parameter()] [string] $actionPolicyName,
        [Parameter()] [string] $actionPolicyId
    )
    # TBD using call from Get-WUGDeviceTemplate or Get-WUGDeviceProperties
    $finalresult = @()
    if (-not $PSCmdlet.ShouldProcess("Device(s) $($DeviceID -join ', ')", 'Set device properties')) { return }
    if ($DeviceID.Count -eq 1) {
        $uri = $global:WhatsUpServerBaseURI + "/api/v1/devices/$($DeviceID[0])/properties"
        $method = "PUT"
        $body = @{}
        if ($DisplayName) { $body.displayname = $DisplayName }
        if ($PSBoundParameters.ContainsKey('isWireless')) { $body.iswireless = $isWireless }
        if ($PSBoundParameters.ContainsKey('collectWireless')) { $body.collectwireless = $collectWireless }
        if ($PSBoundParameters.ContainsKey('keepDetailsCurrent')) { $body.keepdetailscurrent = $keepDetailsCurrent }
        if ($note) { $body.note = $note }
        if ($snmpOid) { $body.snmpoid = $snmpOid }
        if ($actionPolicyId -or $actionPolicyName) {
            $actionPolicy = @{}
            if ($body.actionpolicy) {
                $actionPolicy = $body.actionpolicy
            }
            if ($actionPolicyId) {
                $actionPolicy += @{
                    id = "${actionPolicyId}"
                }
            }
            if ($actionPolicyName) {
                $actionPolicy += @{
                    name = "${actionPolicyName}"
                }
            }
            $body.actionpolicy = $actionPolicy
        }
        else {
            $actionPolicy = @{}
            $body.actionpolicy = $actionPolicy
        }
        $jsonBody = $body | ConvertTo-Json -Depth 5
        try {
            $result = Get-WUGAPIResponse -uri $uri -method $method -body $jsonBody
            Write-Information $jsonBody
            return $result.data
        }
        catch {
            Write-Error "Error setting device properties: $($_)"
        }
    }
    else {
        $uri = $global:WhatsUpServerBaseURI + "/api/v1/devices/-/properties"
        $method = "PATCH"
        $batchSize = 201
        for ($i = 0; $i -lt $DeviceID.Count; $i += $batchSize) {
            $currentBatch = $DeviceID[$i..($i + $batchSize - 1)]
            $body = @{
                devices = $currentBatch
            }
            if ($PSBoundParameters.ContainsKey('isWireless')) { $body.iswireless = $isWireless }
            if ($PSBoundParameters.ContainsKey('collectWireless')) { $body.collectwireless = $collectWireless }
            if ($PSBoundParameters.ContainsKey('keepDetailsCurrent')) { $body.keepdetailscurrent = $keepDetailsCurrent }
            if ($note) { $body.note = $note }
            if ($snmpOid) { $body.snmpoid = $snmpOid }
            if ($actionPolicyId -or $actionPolicyName) {
                $actionPolicy = @{}
                if ($body.actionpolicy) {
                    $actionPolicy = $body.actionpolicy
                }
                if ($actionPolicyId) {
                    $actionPolicy += @{
                        id = "${actionPolicyId}"
                    }
                }
                if ($actionPolicyName) {
                    $actionPolicy += @{
                        name = "${actionPolicyName}"
                    }
                }
                $body.actionpolicy = $actionPolicy
            }
            else {
                $actionPolicy = @{}
                $body.actionpolicy = $actionPolicy
            }
            $jsonBody = $body | ConvertTo-Json -Depth 5
            Write-Information "Current batch of ${batchSize} is being processed."
            Write-Debug "Get-WUGAPIResponse -uri ${uri} -method ${method} -body ${jsonBody}"
            try {
                $result = Get-WUGAPIResponse -uri $uri -method $method -body $jsonBody
                $finalresult += $result.data
            }
            catch {
                Write-Error $jsonBody
                Write-Error "Error setting device properties: $_"
                $errorMessage = "Error setting device properties: $($_.Exception.Message)`nStackTrace: $($_.ScriptStackTrace)"
                Write-Error $errorMessage
            }
        }
        return $finalresult
    }
}
# End of Set-WUGDeviceProperties function
# End of script
#------------------------------------------------------------------
# This script is part of the WhatsUpGoldPS PowerShell module.
# It is designed to interact with the WhatsUp Gold API for network monitoring.
# The script is provided as-is and is not officially supported by WhatsUp Gold.
# Use at your own risk.
#------------------------------------------------------------------
# SIG # Begin signature block
# MIIVlwYJKoZIhvcNAQcCoIIViDCCFYQCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBl2+cr09Psmw0I
# qcPvLdysW84xd0ZFIzYpJr9frbs5wKCCEdMwggVvMIIEV6ADAgECAhBI/JO0YFWU
# jTanyYqJ1pQWMA0GCSqGSIb3DQEBDAUAMHsxCzAJBgNVBAYTAkdCMRswGQYDVQQI
# DBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoM
# EUNvbW9kbyBDQSBMaW1pdGVkMSEwHwYDVQQDDBhBQUEgQ2VydGlmaWNhdGUgU2Vy
# dmljZXMwHhcNMjEwNTI1MDAwMDAwWhcNMjgxMjMxMjM1OTU5WjBWMQswCQYDVQQG
# EwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMS0wKwYDVQQDEyRTZWN0aWdv
# IFB1YmxpYyBDb2RlIFNpZ25pbmcgUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEBAQUA
# A4ICDwAwggIKAoICAQCN55QSIgQkdC7/FiMCkoq2rjaFrEfUI5ErPtx94jGgUW+s
# hJHjUoq14pbe0IdjJImK/+8Skzt9u7aKvb0Ffyeba2XTpQxpsbxJOZrxbW6q5KCD
# J9qaDStQ6Utbs7hkNqR+Sj2pcaths3OzPAsM79szV+W+NDfjlxtd/R8SPYIDdub7
# P2bSlDFp+m2zNKzBenjcklDyZMeqLQSrw2rq4C+np9xu1+j/2iGrQL+57g2extme
# me/G3h+pDHazJyCh1rr9gOcB0u/rgimVcI3/uxXP/tEPNqIuTzKQdEZrRzUTdwUz
# T2MuuC3hv2WnBGsY2HH6zAjybYmZELGt2z4s5KoYsMYHAXVn3m3pY2MeNn9pib6q
# RT5uWl+PoVvLnTCGMOgDs0DGDQ84zWeoU4j6uDBl+m/H5x2xg3RpPqzEaDux5mcz
# mrYI4IAFSEDu9oJkRqj1c7AGlfJsZZ+/VVscnFcax3hGfHCqlBuCF6yH6bbJDoEc
# QNYWFyn8XJwYK+pF9e+91WdPKF4F7pBMeufG9ND8+s0+MkYTIDaKBOq3qgdGnA2T
# OglmmVhcKaO5DKYwODzQRjY1fJy67sPV+Qp2+n4FG0DKkjXp1XrRtX8ArqmQqsV/
# AZwQsRb8zG4Y3G9i/qZQp7h7uJ0VP/4gDHXIIloTlRmQAOka1cKG8eOO7F/05QID
# AQABo4IBEjCCAQ4wHwYDVR0jBBgwFoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYD
# VR0OBBYEFDLrkpr/NZZILyhAQnAgNpFcF4XmMA4GA1UdDwEB/wQEAwIBhjAPBgNV
# HRMBAf8EBTADAQH/MBMGA1UdJQQMMAoGCCsGAQUFBwMDMBsGA1UdIAQUMBIwBgYE
# VR0gADAIBgZngQwBBAEwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybC5jb21v
# ZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNAYIKwYBBQUHAQEE
# KDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJKoZI
# hvcNAQEMBQADggEBABK/oe+LdJqYRLhpRrWrJAoMpIpnuDqBv0WKfVIHqI0fTiGF
# OaNrXi0ghr8QuK55O1PNtPvYRL4G2VxjZ9RAFodEhnIq1jIV9RKDwvnhXRFAZ/ZC
# J3LFI+ICOBpMIOLbAffNRk8monxmwFE2tokCVMf8WPtsAO7+mKYulaEMUykfb9gZ
# pk+e96wJ6l2CxouvgKe9gUhShDHaMuwV5KZMPWw5c9QLhTkg4IUaaOGnSDip0TYl
# d8GNGRbFiExmfS9jzpjoad+sPKhdnckcW67Y8y90z7h+9teDnRGWYpquRRPaf9xH
# +9/DUp/mBlXpnYzyOmJRvOwkDynUWICE5EV7WtgwggYaMIIEAqADAgECAhBiHW0M
# UgGeO5B5FSCJIRwKMA0GCSqGSIb3DQEBDAUAMFYxCzAJBgNVBAYTAkdCMRgwFgYD
# VQQKEw9TZWN0aWdvIExpbWl0ZWQxLTArBgNVBAMTJFNlY3RpZ28gUHVibGljIENv
# ZGUgU2lnbmluZyBSb290IFI0NjAeFw0yMTAzMjIwMDAwMDBaFw0zNjAzMjEyMzU5
# NTlaMFQxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxKzAp
# BgNVBAMTIlNlY3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYwggGiMA0G
# CSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCbK51T+jU/jmAGQ2rAz/V/9shTUxjI
# ztNsfvxYB5UXeWUzCxEeAEZGbEN4QMgCsJLZUKhWThj/yPqy0iSZhXkZ6Pg2A2NV
# DgFigOMYzB2OKhdqfWGVoYW3haT29PSTahYkwmMv0b/83nbeECbiMXhSOtbam+/3
# 6F09fy1tsB8je/RV0mIk8XL/tfCK6cPuYHE215wzrK0h1SWHTxPbPuYkRdkP05Zw
# mRmTnAO5/arnY83jeNzhP06ShdnRqtZlV59+8yv+KIhE5ILMqgOZYAENHNX9SJDm
# +qxp4VqpB3MV/h53yl41aHU5pledi9lCBbH9JeIkNFICiVHNkRmq4TpxtwfvjsUe
# dyz8rNyfQJy/aOs5b4s+ac7IH60B+Ja7TVM+EKv1WuTGwcLmoU3FpOFMbmPj8pz4
# 4MPZ1f9+YEQIQty/NQd/2yGgW+ufflcZ/ZE9o1M7a5Jnqf2i2/uMSWymR8r2oQBM
# dlyh2n5HirY4jKnFH/9gRvd+QOfdRrJZb1sCAwEAAaOCAWQwggFgMB8GA1UdIwQY
# MBaAFDLrkpr/NZZILyhAQnAgNpFcF4XmMB0GA1UdDgQWBBQPKssghyi47G9IritU
# pimqF6TNDDAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADATBgNV
# HSUEDDAKBggrBgEFBQcDAzAbBgNVHSAEFDASMAYGBFUdIAAwCAYGZ4EMAQQBMEsG
# A1UdHwREMEIwQKA+oDyGOmh0dHA6Ly9jcmwuc2VjdGlnby5jb20vU2VjdGlnb1B1
# YmxpY0NvZGVTaWduaW5nUm9vdFI0Ni5jcmwwewYIKwYBBQUHAQEEbzBtMEYGCCsG
# AQUFBzAChjpodHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2Rl
# U2lnbmluZ1Jvb3RSNDYucDdjMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0
# aWdvLmNvbTANBgkqhkiG9w0BAQwFAAOCAgEABv+C4XdjNm57oRUgmxP/BP6YdURh
# w1aVcdGRP4Wh60BAscjW4HL9hcpkOTz5jUug2oeunbYAowbFC2AKK+cMcXIBD0Zd
# OaWTsyNyBBsMLHqafvIhrCymlaS98+QpoBCyKppP0OcxYEdU0hpsaqBBIZOtBajj
# cw5+w/KeFvPYfLF/ldYpmlG+vd0xqlqd099iChnyIMvY5HexjO2AmtsbpVn0OhNc
# WbWDRF/3sBp6fWXhz7DcML4iTAWS+MVXeNLj1lJziVKEoroGs9Mlizg0bUMbOalO
# hOfCipnx8CaLZeVme5yELg09Jlo8BMe80jO37PU8ejfkP9/uPak7VLwELKxAMcJs
# zkyeiaerlphwoKx1uHRzNyE6bxuSKcutisqmKL5OTunAvtONEoteSiabkPVSZ2z7
# 6mKnzAfZxCl/3dq3dUNw4rg3sTCggkHSRqTqlLMS7gjrhTqBmzu1L90Y1KWN/Y5J
# KdGvspbOrTfOXyXvmPL6E52z1NZJ6ctuMFBQZH3pwWvqURR8AgQdULUvrxjUYbHH
# j95Ejza63zdrEcxWLDX6xWls/GDnVNueKjWUH3fTv1Y8Wdho698YADR7TNx8X8z2
# Bev6SivBBOHY+uqiirZtg0y9ShQoPzmCcn63Syatatvx157YK9hlcPmVoa1oDE5/
# L9Uo2bC5a4CH2RwwggY+MIIEpqADAgECAhAHnODk0RR/hc05c892LTfrMA0GCSqG
# SIb3DQEBDAUAMFQxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0
# ZWQxKzApBgNVBAMTIlNlY3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYw
# HhcNMjYwMjA5MDAwMDAwWhcNMjkwNDIxMjM1OTU5WjBVMQswCQYDVQQGEwJVUzEU
# MBIGA1UECAwLQ29ubmVjdGljdXQxFzAVBgNVBAoMDkphc29uIEFsYmVyaW5vMRcw
# FQYDVQQDDA5KYXNvbiBBbGJlcmlubzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
# AgoCggIBAPN6aN4B1yYWkI5b5TBj3I0VV/peETrHb6EY4BHGxt8Ap+eT+WpEpJyE
# tRYPxEmNJL3A38Bkg7mwzPE3/1NK570ZBCuBjSAn4mSDIgIuXZnvyBO9W1OQs5d6
# 7MlJLUAEufl18tOr3ST1DeO9gSjQSAE5Nql0QDxPnm93OZBon+Fz3CmE+z3MwAe2
# h4KdtRAnCqwM+/V7iBdbw+JOxolpx+7RVjGyProTENIG3pe/hKvPb501lf8uBAAD
# LdjZr5ip8vIWbf857Yw1Bu10nVI7HW3eE8Cl5//d1ribHlzTzQLfttW+k+DaFsKZ
# BBL56l4YAlIVRsrOiE1kdHYYx6IGrEA809R7+TZA9DzGqyFiv9qmJAbL4fDwetDe
# yIq+Oztz1LvEdy8Rcd0JBY+J4S0eDEFIA3X0N8VcLeAwabKb9AjulKXwUeqCJLvN
# 79CJ90UTZb2+I+tamj0dn+IKMEsJ4v4Ggx72sxFr9+6XziodtTg5Luf2xd6+Phha
# mOxF2px9LObhBLLEMyRsCHZIzVZOFKu9BpHQH7ufGB+Sa80Tli0/6LEyn9+bMYWi
# 2ttn6lLOPThXMiQaooRUq6q2u3+F4SaPlxVFLI7OJVMhar6nW6joBvELTJPmANSM
# jDSRFDfHRCdGbZsL/keELJNy+jZctF6VvxQEjFM8/bazu6qYhrA7AgMBAAGjggGJ
# MIIBhTAfBgNVHSMEGDAWgBQPKssghyi47G9IritUpimqF6TNDDAdBgNVHQ4EFgQU
# 6YF0o0D5AVhKHbVocr8GaSIBibAwDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQC
# MAAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwSgYDVR0gBEMwQTA1BgwrBgEEAbIxAQIB
# AwIwJTAjBggrBgEFBQcCARYXaHR0cHM6Ly9zZWN0aWdvLmNvbS9DUFMwCAYGZ4EM
# AQQBMEkGA1UdHwRCMEAwPqA8oDqGOGh0dHA6Ly9jcmwuc2VjdGlnby5jb20vU2Vj
# dGlnb1B1YmxpY0NvZGVTaWduaW5nQ0FSMzYuY3JsMHkGCCsGAQUFBwEBBG0wazBE
# BggrBgEFBQcwAoY4aHR0cDovL2NydC5zZWN0aWdvLmNvbS9TZWN0aWdvUHVibGlj
# Q29kZVNpZ25pbmdDQVIzNi5jcnQwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLnNl
# Y3RpZ28uY29tMA0GCSqGSIb3DQEBDAUAA4IBgQAEIsm4xnOd/tZMVrKwi3doAXvC
# wOA/RYQnFJD7R/bSQRu3wXEK4o9SIefye18B/q4fhBkhNAJuEvTQAGfqbbpxow03
# J5PrDTp1WPCWbXKX8Oz9vGWJFyJxRGftkdzZ57JE00synEMS8XCwLO9P32MyR9Z9
# URrpiLPJ9rQjfHMb1BUdvaNayomm7aWLAnD+X7jm6o8sNT5An1cwEAob7obWDM6s
# X93wphwJNBJAstH9Ozs6LwISOX6sKS7CKm9N3Kp8hOUue0ZHAtZdFl6o5u12wy+z
# zieGEI50fKnN77FfNKFOWKlS6OJwlArcbFegB5K89LcE5iNSmaM3VMB2ADV1FEcj
# GSHw4lTg1Wx+WMAMdl/7nbvfFxJ9uu5tNiT54B0s+lZO/HztwXYQUczdsFon3pjs
# Nrsk9ZlalBi5SHkIu+F6g7tWiEv3rtVApmJRnLkUr2Xq2a4nbslUCt4jKs5UX4V1
# nSX8OM++AXoyVGO+iTj7z+pl6XE9Gw/Td6WKKKsxggMaMIIDFgIBATBoMFQxCzAJ
# BgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxKzApBgNVBAMTIlNl
# Y3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYCEAec4OTRFH+FzTlzz3Yt
# N+swDQYJYIZIAWUDBAIBBQCggYQwGAYKKwYBBAGCNwIBDDEKMAigAoAAoQKAADAZ
# BgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYB
# BAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQgH0T8A4Oz3YhL3F5tbZfKPeMo/9Dachhn
# mMHOm0jPqKUwDQYJKoZIhvcNAQEBBQAEggIAbt+e13r7B5NJXyQ480xY++NJcOVt
# Ve/PNevNEvH37j54dKytQxA7AeExBW+vl0oAtfoxv8yQcmWd0yKDssUHum4aOt51
# 9Y8TLFAfIZBKL249p+A8vURu3g8NOBhXpeIFsQ4uMwOO3+5kyZQZsdSBGorzfePa
# bmqay3GaIR6KXyxmNcBnJ7yHP+eLtWo6LvyeincH0WUEh+vZXotNZu8FwS0y6XtI
# mOearZr+O0i3UL60IuBG9D97XpGUxdkIbkj8SCHEjnUB7wZpuqn/7wrjM7+pIkH5
# EX/T0lyXkA6+U1Yb9yzVfCvMjruhhNggB/dyx7XNyqpwMNPxKufQNzl+AnCzPIpw
# ducEOcK2TRTWIGYS+S2kX5AILhgdw33QA3FC/Sryw3OgNa1UJ81mXzKh7uphUjtL
# /dVHm5XBZAfGg1En6aoTrLNWu9AgIGuGQY7DORi+3nb6uk+oXWavD/NOCilUU4qe
# vjjtSJB5+RSIjULRA9XLqIfaH4HFjBE4bhxI2X3qSSnuv1dJksKyXdaj8beLEaxl
# vN4Pl1clAUTyyRDHz4EfvuQOJjZ5H6fYv/YAyPAEitCwvsKCGOqUcE4oUY+9zQRW
# foru7MfV2/0Y3hrQz+eUgvadH76VMW1GVsyhqqlKdOhHMEn24abLR+/YhvZJLxH0
# iSKsbeA20r5eMkc=
# SIG # End signature block