custom/Approve-ZNOutboundAllowRuleReview.ps1

<#
.Synopsis
Approve a "pending review" rule with or without changes
.Description
Approve a "pending review" rule with or without changes

.Link
https://github.com/zeronetworks/zero-powershell/Approve-ZNOutboundAllowRuleReview
#>

function Approve-ZNOutboundAllowRuleReview {
    [OutputType([ZeroNetworks.PowerShell.Cmdlets.Api.Models.Any])]
    [CmdletBinding(DefaultParameterSetName = 'ApproveExpanded', PositionalBinding = $false, SupportsShouldProcess, ConfirmImpact = 'Medium')]
    param(
        [Parameter(ParameterSetName = 'ApproveExpanded', Mandatory)]
        [Parameter(ParameterSetName = 'ApproveWithChangesExpanded', Mandatory)]
        [ZeroNetworks.PowerShell.Cmdlets.Api.Category('Path')]
        [System.String]
        # rule Id
        ${RuleId},

        [Parameter(ParameterSetName = 'ApproveWithChangesExpanded')]
        [ZeroNetworks.PowerShell.Cmdlets.Api.Category('Body')]
        [System.String]
        # Comments
        ${Details},
        
        [Parameter(ParameterSetName = 'ApproveWithChangesExpanded', Mandatory)]
        [ZeroNetworks.PowerShell.Cmdlets.Api.Category('Body')]
        [ValidateSet('HumanTrafficCoveredByMFA', 'TightenRuleScope', 'MissingPortOrProcess', 'AffectedEntitiesContainedInAnExisitingGroup', 'RedundantRule', 'TrafficShouldBeBlocked', 'Other')]
        # Review Reason int32
        ${Reason},
        
        [Parameter(ParameterSetName = 'ApproveWithChangesExpanded')]
        [ZeroNetworks.PowerShell.Cmdlets.Api.Category('Body')]
        [System.String]
        # the rule description.
        ${Description},
        #[-RuleInfoDescription <String>]
        
        [Parameter(ParameterSetName = 'ApproveWithChangesExpanded')]
        [ZeroNetworks.PowerShell.Cmdlets.Api.Category('Body')]
        [string[]]
        # excluded destination asset(s).
        ${ExcludedLocalIdsList},
        #[-RuleInfoExcludedLocalIdsList <String[]>]
        
        [Parameter(ParameterSetName = 'ApproveWithChangesExpanded')]
        [ZeroNetworks.PowerShell.Cmdlets.Api.Category('Body')]
        [Int64]
        # when the rule should expiry.
        ${ExpiresAt},
        #[-RuleInfoExpiresAt <Int64>]

        [Parameter(ParameterSetName = 'ApproveWithChangesExpanded')]
        [ZeroNetworks.PowerShell.Cmdlets.Api.Category('Body')]
        [System.String]
        # The Destination asset(s).
        ${LocalEntityId},
        #[-RuleInfoLocalEntityId <String>]

        [Parameter(ParameterSetName = 'ApproveWithChangesExpanded')]
        [ZeroNetworks.PowerShell.Cmdlets.Api.Category('Body')]
        [System.String[]]
        # the destination process paths.
        ${LocalProcessesList},
        #[-RuleInfoLocalProcessesList <String[]>]
        
        [Parameter(ParameterSetName = 'ApproveWithChangesExpanded')]
        [ZeroNetworks.PowerShell.Cmdlets.Api.Category('Body')]
        [ZeroNetworks.PowerShell.Cmdlets.Api.Models.IPortsListItem[]]
        # the destination ports and protocols.
        ${PortsList},
        #[-RuleInfoPortsList <IPortsListItem[]>]
         
        [Parameter(ParameterSetName = 'ApproveWithChangesExpanded')]
        [ZeroNetworks.PowerShell.Cmdlets.Api.Category('Body')]
        [string[]]
        # the source asset(s).
        ${RemoteEntityIdsList},
        #[-RuleInfoRemoteEntityIdsList <String[]>]
         
        [Parameter(ParameterSetName = 'ApproveWithChangesExpanded')]
        [ZeroNetworks.PowerShell.Cmdlets.Api.Category('Body')]
        [int32]
        # the rule state.
        ${State},

        [Parameter()]
        [ZeroNetworks.PowerShell.Cmdlets.Api.Category('Runtime')]
        [System.Management.Automation.SwitchParameter]
        # Run the command as a job
        ${AsJob},

        [Parameter(DontShow)]
        [ZeroNetworks.PowerShell.Cmdlets.Api.Category('Runtime')]
        [System.Management.Automation.SwitchParameter]
        # Wait for .NET debugger to attach
        ${Break},

        [Parameter(DontShow)]
        [ValidateNotNull()]
        [ZeroNetworks.PowerShell.Cmdlets.Api.Category('Runtime')]
        [ZeroNetworks.PowerShell.Cmdlets.Api.Runtime.SendAsyncStep[]]
        # SendAsync Pipeline Steps to be appended to the front of the pipeline
        ${HttpPipelineAppend},

        [Parameter(DontShow)]
        [ValidateNotNull()]
        [ZeroNetworks.PowerShell.Cmdlets.Api.Category('Runtime')]
        [ZeroNetworks.PowerShell.Cmdlets.Api.Runtime.SendAsyncStep[]]
        # SendAsync Pipeline Steps to be prepended to the front of the pipeline
        ${HttpPipelinePrepend},

        [Parameter()]
        [ZeroNetworks.PowerShell.Cmdlets.Api.Category('Runtime')]
        [System.Management.Automation.SwitchParameter]
        # Run the command asynchronously
        ${NoWait},

        [Parameter(DontShow)]
        [ZeroNetworks.PowerShell.Cmdlets.Api.Category('Runtime')]
        [System.Uri]
        # The URI for the proxy server to use
        ${Proxy},

        [Parameter(DontShow)]
        [ValidateNotNull()]
        [ZeroNetworks.PowerShell.Cmdlets.Api.Category('Runtime')]
        [System.Management.Automation.PSCredential]
        # Credentials for a proxy server to use for the remote call
        ${ProxyCredential},

        [Parameter(DontShow)]
        [ZeroNetworks.PowerShell.Cmdlets.Api.Category('Runtime')]
        [System.Management.Automation.SwitchParameter]
        # Use the default credentials for the proxy
        ${ProxyUseDefaultCredentials}
    )

    process {
        try {
            #handle based on paramtersetname
            switch ($PsCmdlet.ParameterSetName) {
                "ApproveExpanded" {
                    ZeroNetworks.internal\Approve-ZNOutboundAllowRulesReview @PSBoundParameters
                }
                "ApproveWithChangesExpanded" {
                    #Handle Get
                    $ruleId = $PSBoundParameters['RuleId'].ToString()
                    $rule = ZeroNetworks\Get-ZNOutboundAllowRule -RuleId $ruleId
                    $rule = $rule.Item
                    
                    $ruleReview = [ZeroNetworks.PowerShell.Cmdlets.Api.Models.RuleReviewApproveWithChanges]::new()

                    if ($PSBoundParameters['Reason']) {
                        if ($PSBoundParameters['Reason'] -eq 'Other') {
                            if (!$PSBoundParameters['Details']) {
                                Write-Error "You must provide Details if Reason is Other"
                            }
                        }
                        switch ($PSBoundParameters['Reason']) {
                            'HumanTrafficCoveredByMFA' { $intReason = 1 }
                            'TightenRuleScope' { $intReason = 2 }
                            'MissingPortOrProcess' { $intReason = 3 }
                            'AffectedEntitiesContainedInAnExisitingGroup' { $intReason = 4 }
                            'RedundantRule' { $intReason = 5 }
                            'TrafficShouldBeBlocked' { $intReason = 6 }
                            "Other" { $intReason = 7 }
                        }
                        $ruleReview.ReviewReason = $intReason
                        $null = $PSBoundParameters.Remove('Reason')
                    }

                    if ($PSBoundParameters['Details']) {
                        $ruleReview.ReviewDetails = $PSBoundParameters['Details']
                        $null = $PSBoundParameters.Remove('Details')
                    }

                    $ruleReview.RuleInfoAction = 1
                    $ruleReview.RuleInfoDirection = 2

                    if ($PSBoundParameters['Description']) {
                        $ruleReview.RuleInfoDescription = $PSBoundParameters['Description']
                        $null = $PSBoundParameters.Remove('Description')
                    }
                    else {
                        $ruleReview.RuleInfoDescription = $rule.Description
                        $null = $PSBoundParameters.Remove('Description')
                    }

                    if ($PSBoundParameters['ExcludedLocalIdsList']) {
                        $ruleReview.RuleInfoExcludedLocalIdsList = $PSBoundParameters['ExcludedLocalIdsList']
                        $null = $PSBoundParameters.Remove('ExcludedLocalIdsList')
                    }
                    else {
                        $ruleReview.RuleInfoExcludedLocalIdsList = $rule.ExcludedLocalIdsList
                        $null = $PSBoundParameters.Remove('ExcludedLocalIdsList')
                    }

                    if ($PSBoundParameters['ExpiresAt']) {
                        $ruleReview.RuleInfoExpiresAt = $PSBoundParameters['ExpiresAt']
                        $null = $PSBoundParameters.Remove('ExpiresAt')
                    }
                    else {
                        $ruleReview.RuleInfoExpiresAt = $rule.ExpiresAt
                        $null = $PSBoundParameters.Remove('ExpiresAt')
                    }
                    
                    if ($PSBoundParameters['LocalEntityId']) {
                        $ruleReview.RuleInfoLocalEntityId = $PSBoundParameters['LocalEntityId']
                        $null = $PSBoundParameters.Remove('LocalEntityId')
                    }
                    else {
                        $ruleReview.RuleInfoLocalEntityId = $rule.LocalEntityId
                        $null = $PSBoundParameters.Remove('LocalEntityId')
                    }
                    
                    if ($PSBoundParameters['LocalProcessesList']) {
                        $ruleReview.RuleInfoLocalProcessesList = $PSBoundParameters['LocalProcessesList']
                        $null = $PSBoundParameters.Remove('LocalProcessesList')
                    }
                    else {
                        $ruleReview.RuleInfoLocalProcessesList = $rule.LocalProcessesList
                        $null = $PSBoundParameters.Remove('LocalProcessesList')
                    }

                    if ($PSBoundParameters['PortsList']) {
                        $ruleReview.RuleInfoPortsList = $PSBoundParameters['PortsList']
                        $null = $PSBoundParameters.Remove('PortsList')
                    }
                    else {
                        $ruleReview.RuleInfoPortsList = $rule.PortsList
                        $null = $PSBoundParameters.Remove('PortsList')
                    }
                    
                    if ($PSBoundParameters['RemoteEntityIdsList']) {
                        $ruleReview.RuleInfoRemoteEntityIdsList = $PSBoundParameters['RemoteEntityIdsList']
                        $null = $PSBoundParameters.Remove('RemoteEntityIdsList')
                    }
                    else {
                        $ruleReview.RuleInfoRemoteEntityIdsList = $rule.RemoteEntityIdsList
                        $null = $PSBoundParameters.Remove('RemoteEntityIdsList')
                    }
                    
                    if ($PSBoundParameters['State']) {
                        $ruleReview.RuleInfoState = $PSBoundParameters['State']
                        $null = $PSBoundParameters.Remove('State')
                    }
                    else {
                        $ruleReview.RuleInfoState = 1
                        $null = $PSBoundParameters.Remove('State')
                    }

                    $null = $PSBoundParameters.Add('Body', $ruleReview)
                    ZeroNetworks.internal\Approve-ZNOutboundAllowRulesReview @PSBoundParameters
                }
            }
        }
        catch {
            throw
        }
    }
}
# SIG # Begin signature block
# MIIk6wYJKoZIhvcNAQcCoIIk3DCCJNgCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU+Regkmr5Z0Vz0GZMuXhWd5ev
# ENGggh7wMIIFjTCCBHWgAwIBAgIQDpsYjvnQLefv21DiCEAYWjANBgkqhkiG9w0B
# AQwFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD
# VQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVk
# IElEIFJvb3QgQ0EwHhcNMjIwODAxMDAwMDAwWhcNMzExMTA5MjM1OTU5WjBiMQsw
# CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
# ZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQw
# ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz
# 7MKnJS7JIT3yithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS
# 5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7
# bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfI
# SKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jH
# trHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14
# Ztk6MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2
# h4mXaXpI8OCiEhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt
# 6zPZxd9LBADMfRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPR
# iQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ER
# ElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4K
# Jpn15GkvmB0t9dmpsh3lGwIDAQABo4IBOjCCATYwDwYDVR0TAQH/BAUwAwEB/zAd
# BgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wHwYDVR0jBBgwFoAUReuir/SS
# y4IxLVGLp6chnfNtyA8wDgYDVR0PAQH/BAQDAgGGMHkGCCsGAQUFBwEBBG0wazAk
# BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAC
# hjdodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURS
# b290Q0EuY3J0MEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0
# LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwEQYDVR0gBAowCDAGBgRV
# HSAAMA0GCSqGSIb3DQEBDAUAA4IBAQBwoL9DXFXnOF+go3QbPbYW1/e/Vwe9mqyh
# hyzshV6pGrsi+IcaaVQi7aSId229GhT0E0p6Ly23OO/0/4C5+KH38nLeJLxSA8hO
# 0Cre+i1Wz/n096wwepqLsl7Uz9FDRJtDIeuWcqFItJnLnU+nBgMTdydE1Od/6Fmo
# 8L8vC6bp8jQ87PcDx4eo0kxAGTVGamlUsLihVo7spNU96LHc/RzY9HdaXFSMb++h
# UD38dglohJ9vytsgjTVgHAIDyyCwrFigDkBjxZgiwbJZ9VVrzyerbHbObyMt9H5x
# aiNrIv8SuFQtJ37YOtnwtoeW/VvRXKwYw02fc7cBqZ9Xql4o4rmUMIIFvTCCBKWg
# AwIBAgIRAKVrLshF28LU6jgQ695aLeswDQYJKoZIhvcNAQELBQAwgZExCzAJBgNV
# BAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1Nh
# bGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMTcwNQYDVQQDEy5DT01P
# RE8gUlNBIEV4dGVuZGVkIFZhbGlkYXRpb24gQ29kZSBTaWduaW5nIENBMB4XDTIx
# MDUwMzAwMDAwMFoXDTI0MDUwMjIzNTk1OVowgaYxEjAQBgNVBAUTCTUxNjAxNjE1
# MTETMBEGCysGAQQBgjc8AgEDEwJJTDEdMBsGA1UEDxMUUHJpdmF0ZSBPcmdhbml6
# YXRpb24xCzAJBgNVBAYTAklMMRcwFQYDVQQHDA5UZWwgQXZpdiBKYWZmYTEaMBgG
# A1UECgwRWkVSTyBORVRXT1JLUyBMVEQxGjAYBgNVBAMMEVpFUk8gTkVUV09SS1Mg
# TFREMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw0YQg9iPdpEEAIdi
# yzXHNEIZsMnTpshRJEzhU7sdJDO63FJSZ5LbaEhMAyPHQdpzonS+H2gD4WNkU6T3
# rqNqgHKL/LJ5nbIYDHfp7nQarW8z5NTCv9KU3yL98nGUiU1YffxApTSH5G14URuh
# owWQ1AqUr8L2rnsTNI+CpQqYtNmTOQz8PlpXMl+lj8VQOG8PWbXRWVq3Ul+7XVs1
# et7h4/DFJql+22Ke2Mw15Cl+GpW5Mbq1TQppUOtWG5BRkhHV59xkoiATIPRYm8i+
# TOvmMXyqIMmZAKEK/UEy3zgnWltUTpJm1t3HzSCTzYicCMWA13JjyJ7N4ekUVMEl
# mxzOTQIDAQABo4IB9zCCAfMwHwYDVR0jBBgwFoAU34/zIAzpyqYE2FtYNyo9q0bc
# g0kwHQYDVR0OBBYEFIuSUX5+e/XI2sryOvgN2dkucdfNMA4GA1UdDwEB/wQEAwIH
# gDAMBgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMBEGCWCGSAGG+EIB
# AQQEAwIEEDBJBgNVHSAEQjBAMDUGDCsGAQQBsjEBAgEGATAlMCMGCCsGAQUFBwIB
# FhdodHRwczovL3NlY3RpZ28uY29tL0NQUzAHBgVngQwBAzBVBgNVHR8ETjBMMEqg
# SKBGhkRodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9SU0FFeHRlbmRlZFZh
# bGlkYXRpb25Db2RlU2lnbmluZ0NBLmNybDCBhgYIKwYBBQUHAQEEejB4MFAGCCsG
# AQUFBzAChkRodHRwOi8vY3J0LmNvbW9kb2NhLmNvbS9DT01PRE9SU0FFeHRlbmRl
# ZFZhbGlkYXRpb25Db2RlU2lnbmluZ0NBLmNydDAkBggrBgEFBQcwAYYYaHR0cDov
# L29jc3AuY29tb2RvY2EuY29tMEAGA1UdEQQ5MDegHAYIKwYBBQUHCAOgEDAODAxJ
# TC01MTYwMTYxNTGBF2Rldm9wc0B6ZXJvbmV0d29ya3MuY29tMA0GCSqGSIb3DQEB
# CwUAA4IBAQBz7cosu+mtqpM5yyJ8AF6MLxs9l3FsQXwucpOK0oXJGUymgV7eghNT
# zL1XT71/AAHHGK1/y43A0Yqqeptb5oYaABvor1M9TnytA0XWl67pi+5C4YZAY/mG
# pH4aiL8fsLbaaTVFuz+a5g7wHgE2U6yN2lEbqs/xJgD9ytMSG7bp30Zf5W2tmCSd
# qiSiSME/l/ta9YICeiDvz89K0heaKrmUmYYoHbqZOz8taGn00bREz6SG5uJ7YJdg
# 5ZTjzicIxJT1lwpsRJjcR80H8oL4S8fFkZgLcrCamZ0hVF77RJ3voODYwym/Zee4
# k8+C1wGQ8Gcjrq0QG5iN7uMAEDQD3+cKMIIGIjCCBAqgAwIBAgIQbdRy6wKuBAbj
# 3YQ/X+FF4TANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT
# EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
# Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh
# dGlvbiBBdXRob3JpdHkwHhcNMTQxMjAzMDAwMDAwWhcNMjkxMjAyMjM1OTU5WjCB
# kTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
# A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxNzA1BgNV
# BAMTLkNPTU9ETyBSU0EgRXh0ZW5kZWQgVmFsaWRhdGlvbiBDb2RlIFNpZ25pbmcg
# Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCK/b1D8D3IVR/zWYrw
# WrTck9FkFUqKhKUtyyb44EU4o7kBxU8TCFnQMVTKzZBhoz4s8k0VXNTuw2oil0jR
# BkM0CZnJzzDEn0T9VpzuzOeDuYHNyNoLHBJI/2+i7MR1ywlwz1Hlu4ufqr14Bn2V
# 1mGB9tpTx6ydswC6HtS+QGIJmYM9Rd1NZZUEzPz6x1t64i4MPVU1VzVIiYnyuVal
# S1AbHN6YkL3zLtyIqfF1m6g+ogXZQbXvd60XwFr1o9tNn9HEsXuDte4QlCsucq6+
# 75UpnFJixSxtIvd9RHoQX2OTaU3ZfbKasU61Wb//hfu9rOzhK6bjLCzo2W7bX00X
# eMtTAgMBAAGjggF+MIIBejAfBgNVHSMEGDAWgBS7r34CPfqm8TyEjq3uOJjs2TIy
# 1DAdBgNVHQ4EFgQU34/zIAzpyqYE2FtYNyo9q0bcg0kwDgYDVR0PAQH/BAQDAgGG
# MBIGA1UdEwEB/wQIMAYBAf8CAQAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwPgYDVR0g
# BDcwNTAzBgRVHSAAMCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9k
# by5jb20vQ1BTMEwGA1UdHwRFMEMwQaA/oD2GO2h0dHA6Ly9jcmwuY29tb2RvY2Eu
# Y29tL0NPTU9ET1JTQUNlcnRpZmljYXRpb25BdXRob3JpdHkuY3JsMHEGCCsGAQUF
# BwEBBGUwYzA7BggrBgEFBQcwAoYvaHR0cDovL2NydC5jb21vZG9jYS5jb20vQ09N
# T0RPUlNBQWRkVHJ1c3RDQS5jcnQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNv
# bW9kb2NhLmNvbTANBgkqhkiG9w0BAQwFAAOCAgEAZk7stxZ3bxHoG11qTtnyi2yx
# VihAi8AxxJlIIz34DuiAl+9tIAsfE8SG+xc0FeGOVPfCuABzFeAo2dq6+oJUwvfr
# v8M20DCf5aEclN/vfOj2LHiirM8mahWhFTHWMTSYvVNPxISDo8SWXD3Y/tb5VP9n
# k234PitrLKIIfFZIgTIYsm6skMHb5N45i4blxxhAWaTflke6sn+x+FcPhYB0OA46
# WGIe/lLj5q5TCYb+j5vbVlbMB7CJwQTxUwtsb3fssh/s9ltAQ2APG6sYVLQQBI74
# DunLg7F68jROalRM6YMq6bAwJRzOYo4O64XmKf6xSuPyrjyR9UyhvsgXDly7Qk3j
# GoqSzT4gft3pdbHqH3RcnlTClDeyYd0HFll/loAW4Jm10m6wySMGFazRI/Qzi851
# 8MGG0//hLvqQT/5G+bvbT7u3/tENKwTx0tGVhSyKLriFVvLDhFKh6TOx61DIobCf
# 48OLOoee51XT0200FzANaCIL1bntczVyw+2nN83jQ65FzTS/KMqHYu1DpK/6yzHL
# IVhhRl62xnqmHlMqqPhcUR86WhAPKMDkdIt0xgSq+EsmKAoyidudKmBxasOWTha5
# Y79hlWeMSy67sE6D6U0x5Y4nIvU8JntEkdPUWvDTfPQ4vhSamQ6LsVvq5IsPEZ13
# QoIcXDrU2quIL41XMFQwggauMIIElqADAgECAhAHNje3JFR82Ees/ShmKl5bMA0G
# CSqGSIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJ
# bmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0
# IFRydXN0ZWQgUm9vdCBHNDAeFw0yMjAzMjMwMDAwMDBaFw0zNzAzMjIyMzU5NTla
# MGMxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UE
# AxMyRGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBp
# bmcgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDGhjUGSbPBPXJJ
# UVXHJQPE8pE3qZdRodbSg9GeTKJtoLDMg/la9hGhRBVCX6SI82j6ffOciQt/nR+e
# DzMfUBMLJnOWbfhXqAJ9/UO0hNoR8XOxs+4rgISKIhjf69o9xBd/qxkrPkLcZ47q
# UT3w1lbU5ygt69OxtXXnHwZljZQp09nsad/ZkIdGAHvbREGJ3HxqV3rwN3mfXazL
# 6IRktFLydkf3YYMZ3V+0VAshaG43IbtArF+y3kp9zvU5EmfvDqVjbOSmxR3NNg1c
# 1eYbqMFkdECnwHLFuk4fsbVYTXn+149zk6wsOeKlSNbwsDETqVcplicu9Yemj052
# FVUmcJgmf6AaRyBD40NjgHt1biclkJg6OBGz9vae5jtb7IHeIhTZgirHkr+g3uM+
# onP65x9abJTyUpURK1h0QCirc0PO30qhHGs4xSnzyqqWc0Jon7ZGs506o9UD4L/w
# ojzKQtwYSH8UNM/STKvvmz3+DrhkKvp1KCRB7UK/BZxmSVJQ9FHzNklNiyDSLFc1
# eSuo80VgvCONWPfcYd6T/jnA+bIwpUzX6ZhKWD7TA4j+s4/TXkt2ElGTyYwMO1uK
# IqjBJgj5FBASA31fI7tk42PgpuE+9sJ0sj8eCXbsq11GdeJgo1gJASgADoRU7s7p
# XcheMBK9Rp6103a50g5rmQzSM7TNsQIDAQABo4IBXTCCAVkwEgYDVR0TAQH/BAgw
# BgEB/wIBADAdBgNVHQ4EFgQUuhbZbU2FL3MpdpovdYxqII+eyG8wHwYDVR0jBBgw
# FoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQM
# MAoGCCsGAQUFBwMIMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYYaHR0cDov
# L29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0cy5k
# aWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6
# MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVk
# Um9vdEc0LmNybDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwDQYJ
# KoZIhvcNAQELBQADggIBAH1ZjsCTtm+YqUQiAX5m1tghQuGwGC4QTRPPMFPOvxj7
# x1Bd4ksp+3CKDaopafxpwc8dB+k+YMjYC+VcW9dth/qEICU0MWfNthKWb8RQTGId
# DAiCqBa9qVbPFXONASIlzpVpP0d3+3J0FNf/q0+KLHqrhc1DX+1gtqpPkWaeLJ7g
# iqzl/Yy8ZCaHbJK9nXzQcAp876i8dU+6WvepELJd6f8oVInw1YpxdmXazPByoyP6
# wCeCRK6ZJxurJB4mwbfeKuv2nrF5mYGjVoarCkXJ38SNoOeY+/umnXKvxMfBwWpx
# 2cYTgAnEtp/Nh4cku0+jSbl3ZpHxcpzpSwJSpzd+k1OsOx0ISQ+UzTl63f8lY5kn
# LD0/a6fxZsNBzU+2QJshIUDQtxMkzdwdeDrknq3lNHGS1yZr5Dhzq6YBT70/O3it
# TK37xJV77QpfMzmHQXh6OOmc4d0j/R0o08f56PGYX/sr2H7yRp11LB4nLCbbbxV7
# HhmLNriT1ObyF5lZynDwN7+YAN8gFk8n+2BnFqFmut1VwDophrCYoCvtlUG3OtUV
# mDG0YgkPCr2B2RP+v6TR81fZvAT6gt4y3wSJ8ADNXcL50CN/AAvkdgIm2fBldkKm
# KYcJRyvmfxqkhQ/8mJb2VVQrH4D6wPIOK+XW+6kvRBVK5xMOHds3OBqhK/bt1nz8
# MIIGwjCCBKqgAwIBAgIQBUSv85SdCDmmv9s/X+VhFjANBgkqhkiG9w0BAQsFADBj
# MQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMT
# MkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5n
# IENBMB4XDTIzMDcxNDAwMDAwMFoXDTM0MTAxMzIzNTk1OVowSDELMAkGA1UEBhMC
# VVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMSAwHgYDVQQDExdEaWdpQ2VydCBU
# aW1lc3RhbXAgMjAyMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKNT
# RYcdg45brD5UsyPgz5/X5dLnXaEOCdwvSKOXejsqnGfcYhVYwamTEafNqrJq3RAp
# ih5iY2nTWJw1cb86l+uUUI8cIOrHmjsvlmbjaedp/lvD1isgHMGXlLSlUIHyz8sH
# pjBoyoNC2vx/CSSUpIIa2mq62DvKXd4ZGIX7ReoNYWyd/nFexAaaPPDFLnkPG2ZS
# 48jWPl/aQ9OE9dDH9kgtXkV1lnX+3RChG4PBuOZSlbVH13gpOWvgeFmX40QrStWV
# zu8IF+qCZE3/I+PKhu60pCFkcOvV5aDaY7Mu6QXuqvYk9R28mxyyt1/f8O52fTGZ
# ZUdVnUokL6wrl76f5P17cz4y7lI0+9S769SgLDSb495uZBkHNwGRDxy1Uc2qTGaD
# iGhiu7xBG3gZbeTZD+BYQfvYsSzhUa+0rRUGFOpiCBPTaR58ZE2dD9/O0V6MqqtQ
# FcmzyrzXxDtoRKOlO0L9c33u3Qr/eTQQfqZcClhMAD6FaXXHg2TWdc2PEnZWpST6
# 18RrIbroHzSYLzrqawGw9/sqhux7UjipmAmhcbJsca8+uG+W1eEQE/5hRwqM/vC2
# x9XH3mwk8L9CgsqgcT2ckpMEtGlwJw1Pt7U20clfCKRwo+wK8REuZODLIivK8SgT
# IUlRfgZm0zu++uuRONhRB8qUt+JQofM604qDy0B7AgMBAAGjggGLMIIBhzAOBgNV
# HQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcD
# CDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwHwYDVR0jBBgwFoAU
# uhbZbU2FL3MpdpovdYxqII+eyG8wHQYDVR0OBBYEFKW27xPn783QZKHVVqllMaPe
# 1eNJMFoGA1UdHwRTMFEwT6BNoEuGSWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9E
# aWdpQ2VydFRydXN0ZWRHNFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcmww
# gZAGCCsGAQUFBwEBBIGDMIGAMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp
# Y2VydC5jb20wWAYIKwYBBQUHMAKGTGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNv
# bS9EaWdpQ2VydFRydXN0ZWRHNFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5j
# cnQwDQYJKoZIhvcNAQELBQADggIBAIEa1t6gqbWYF7xwjU+KPGic2CX/yyzkzepd
# IpLsjCICqbjPgKjZ5+PF7SaCinEvGN1Ott5s1+FgnCvt7T1IjrhrunxdvcJhN2hJ
# d6PrkKoS1yeF844ektrCQDifXcigLiV4JZ0qBXqEKZi2V3mP2yZWK7Dzp703DNiY
# dk9WuVLCtp04qYHnbUFcjGnRuSvExnvPnPp44pMadqJpddNQ5EQSviANnqlE0Pjl
# SXcIWiHFtM+YlRpUurm8wWkZus8W8oM3NG6wQSbd3lqXTzON1I13fXVFoaVYJmoD
# Rd7ZULVQjK9WvUzF4UbFKNOt50MAcN7MmJ4ZiQPq1JE3701S88lgIcRWR+3aEUuM
# MsOI5ljitts++V+wQtaP4xeR0arAVeOGv6wnLEHQmjNKqDbUuXKWfpd5OEhfysLc
# PTLfddY2Z1qJ+Panx+VPNTwAvb6cKmx5AdzaROY63jg7B145WPR8czFVoIARyxQM
# fq68/qTreWWqaNYiyjvrmoI1VygWy2nyMpqy0tg6uLFGhmu6F/3Ed2wVbK6rr3M6
# 6ElGt9V/zLY4wNjsHPW2obhDLN9OTH0eaHDAdwrUAuBcYLso/zjlUlrWrBciI070
# 7NMX+1Br/wd3H3GXREHJuEbTbDJ8WC9nR2XlG3O2mflrLAZG70Ee8PBf4NvZrZCA
# RK+AEEGKMYIFZTCCBWECAQEwgacwgZExCzAJBgNVBAYTAkdCMRswGQYDVQQIExJH
# cmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNP
# TU9ETyBDQSBMaW1pdGVkMTcwNQYDVQQDEy5DT01PRE8gUlNBIEV4dGVuZGVkIFZh
# bGlkYXRpb24gQ29kZSBTaWduaW5nIENBAhEApWsuyEXbwtTqOBDr3lot6zAJBgUr
# DgMCGgUAoHAwEAYKKwYBBAGCNwIBDDECMAAwGQYJKoZIhvcNAQkDMQwGCisGAQQB
# gjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkE
# MRYEFFNR0HiyYOa5sebLxWBheVoKCVG9MA0GCSqGSIb3DQEBAQUABIIBAABOdDqG
# 7v8RaoGRKYJ7xPx4g8kI5RPW/Gyhgi5kSoBSsr4lcu0BYiMZGnVjr4PIYyEkSuKR
# C4/bmD/V18B5yio6QIDjhpAsVCjra382TocxTm3HbtKMYwmDc/oHsT6OBaGVXGfC
# TAENKqMNqMgAMsWt5mDat+N5siZu9/w39/TXyOC8K7xesDsBBnyZj1+QTqPqykb6
# 9Hye52QbJIvPi8S/IWRFRboZO/eRNvkyaGxiBB8nnBGZk2OptNQt3wtMm0pT92xf
# /aK25HPgQxXeX48eWVVTAvltrrhu1GcDQenf7+voTzfOYBvKtK0BpzTbXwYiny3P
# msYauNLBcVkr3i2hggMgMIIDHAYJKoZIhvcNAQkGMYIDDTCCAwkCAQEwdzBjMQsw
# CQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRp
# Z2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENB
# AhAFRK/zlJ0IOaa/2z9f5WEWMA0GCWCGSAFlAwQCAQUAoGkwGAYJKoZIhvcNAQkD
# MQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMjQwMzE3MDk0MzI0WjAvBgkq
# hkiG9w0BCQQxIgQg8rOm2HjZDhaGbtgRCCgKHMfq7A3WaxfiziQyzQvUVJQwDQYJ
# KoZIhvcNAQEBBQAEggIAJddN/qtFPJGcoW5bx1FCrO8RXoeNaIVA9M86g8KXIgFA
# dUCtcNBLNPUonLlNOmF6q8mZ0DSIcOYGCSZKNEVZ5iDJqtEF97PsQPU17rQwagp9
# I5jNDqoaIZy5x5zUXSDWpqJOdWfjoclaYI067NXSEwyF9vfC3nNXpvuZ5Ms0rbny
# vygC8y/sRUy1huRhRYJaRWB5Kn/bN4pzUA/wMcAC6cbz623jIgnEof5sxjX1X1Wb
# EnUo7OgX6uwXkYG5ukP5jiPQYSccnPGs5uyfPD8E529d81263EHkYNTLqZezkeGE
# aalsfTRXcjQpOavPJnWUqyX26yjS1/SqJ2GlKB8z8lNP3Qz6DrbRAF+C+RgCWC6G
# jmGPTWQmu0eEbj25pc0ogXHQ0ztRYvwpmO6j6mETfpzJvIFfmrDbY7zZA3Pa8tth
# Xivh6DrWbRSMPVA77amm7qFN64UujHn0hesNziBTHXIBYC1lyYZykiz0tCBy0Qxc
# nej6PPq3tWJwJCwvcNQxB7woYEElGfmZJ5BPbH2IgByHpzx3560vQncksjtE7G0J
# GsoxiySMIGNNWhRqrUw/dZH+t43W7Be5tenCkcxP2baMv+GT2aZk28Zwx/tHe3LT
# FQR7spXojfRvhUGN6PVBbDZzYQV3UsVkuCwJNh+qQHZRhULV28N1zdl01mdhmN8=
# SIG # End signature block