modules/SdnDiag.Health.Config.psd1

# Copyright='© Microsoft Corporation. All rights reserved.'
# Licensed under the MIT License.

@{
    HealthValidations = @{

        # COMMON TESTS

        'Test-SdnDiagnosticsCleanupTaskEnabled' = @{
            Description = "Scheduled task is not enabled on the SDN infrastructure node(s)."
            Impact = "Unconstrained log files may grow and consume disk space."
            PublicDocUrl = ""
        }
        'Test-SdnNetworkControllerApiNameResolution' = @{
            Description = "Network Controller URL is not resolvable."
            Impact = "Calls to Network Controller NB API will fail resulting in policy configuration failures and unable to manage SDN resources."
            PublicDocUrl = ""
        }
        'Test-SdnNonSelfSignedCertificateInTrustedRootStore' = @{
            Description = "Non Root Cert exist in Host Trusted Root CA Store"
            Impact = "Network Controller will have issues communicating Host's TCP 6640 and 443 port with certificate error."
            PublicDocUrl = ""
        }
        'Test-SdnServiceState' = @{
            Description = "Identified service(s) are not running on the SDN infrastructure node(s)."
            Impact = "SDN services and functionality will be impacted without the service running."
            PublicDocUrl = ""
        }

        # GATEWAY TESTS


        # LOAD BALANCER MUX TESTS

        'Test-SdnMuxConnectionStateToRouter' = @{
            Description = "One or more Load Balancer Muxes do not have an active BGP connection via TCP port 179 to the switch."
            Impact = "Public IP addresses may not be routable as Load Balancer Muxes are not advertising the public IP addresses to the switch."
            PublicDocUrl = "https://learn.microsoft.com/en-us/azure-stack/hci/manage/troubleshoot-software-load-balancer"
        }
        'Test-SdnMuxConnectionStateToSlbManager' = @{
            Description = "SLB Manager does not have connectivity established to Mux(es) via TCP 8560."
            Impact = "SLB Manager will not be able to program VIP:DIP mappings to the Load Balancer Mux(es) which will impact routing of Virtual IPs."
            PublicDocUrl = "https://learn.microsoft.com/en-us/azure-stack/hci/manage/troubleshoot-software-load-balancer"
        }

        # NETWORK CONTROLLER TESTS

        'Test-SdnNetworkControllerNodeRestInterface' = @{
            Description = "Network Controller node(s) are missing the Network Adapter that is required for the REST interface."
            Impact = "Failover of the NB API will not occur if the Network Controller node(s) are missing the Network Adapter that is required for the REST interface."
            PublicDocUrl = "https://learn.microsoft.com/en-us/powershell/module/networkcontroller/set-networkcontrollernode"
        }
        'Test-SdnServiceFabricApplicationHealth' = @{
            Description = "Network Controller application with Service Fabric is not healthy."
            Impact = "Network Controller services and functionality may be impacted."
            PublicDocUrl = ""
        }
        'Test-SdnServiceFabricClusterHealth' = @{
            Description = "Service Fabric cluster for Network Controller is not healthy."
            Impact = "Network Controller services and functionality may be impacted."
            PublicDocUrl = ""
        }
        'Test-SdnServiceFabricNodeStatus' = @{
            Description = "Service Fabric node(s) are offline and not participating in the cluster."
            Impact = "Minimum amount of nodes are required to maintain quorum and cluster availability. Services will be in read-only state if quorum is lost and may result in data loss."
            PublicDocUrl = "https://learn.microsoft.com/en-us/azure/service-fabric/service-fabric-disaster-recovery"
        }
        'Test-ResourceConfigurationState' = @{
            Description = "Infrastructure resource configuration is not Succeeded."
            Impact = "SDN services and functionality may be impacted."
            PublicDocUrl = "https://learn.microsoft.com/en-us/windows-server/networking/sdn/troubleshoot/troubleshoot-windows-server-software-defined-networking-stack#hoster-validate-system-health"
        }
        'Test-ResourceProvisioningState' = @{
            Description = "Infrastructure resource provisioning is not Succeeded."
            Impact = "SDN services and functionality may be impacted."
            PublicDocUrl = "https://learn.microsoft.com/en-us/windows-server/networking/sdn/troubleshoot/troubleshoot-windows-server-software-defined-networking-stack#hoster-validate-system-health"
        }
        'Test-NetworkInterfaceAPIDuplicateMacAddress' = @{
            Description = "Duplicate MAC address detected within the API."
            Impact = "Policy configuration failures may be reported by Network Controller when applying policies to the Hyper-v host. Network Interfaces reporting configurationState failure will not be routable."
            PublicDocUrl = ""
        }

        # SERVER TESTS

        'Test-SdnEncapOverhead' = @{
            Description = "EncapOverhead/JumboPacket is not configured properly on the Hyper-V Hosts"
            Impact = "Intermittent packet loss may occur under certain conditions when routing traffic within the logical network."
            PublicDocUrl = "https://learn.microsoft.com/en-us/windows-server/networking/sdn/troubleshoot/troubleshoot-windows-server-software-defined-networking-stack#check-mtu-and-jumbo-frame-support-on-hnv-provider-logical-network"
        }
        'Test-SdnHostAgentConnectionStateToApiService' = @{
            Description = "Network Controller Host Agent is not connected to the Network Controller API Service."
            Impact = "Policy configuration may not be pushed to the Hyper-V host(s) if no southbound connectivity is available."
            PublicDocUrl = ""
        }
        'Test-SdnProviderNetwork' = @{
            Description = "Logical network does not support VXLAN or NVGRE encapsulated traffic"
            Impact = "Intermittent packet loss may occur under certain conditions when routing traffic within the logical network."
            PublicDocUrl = "https://learn.microsoft.com/en-us/windows-server/networking/sdn/troubleshoot/troubleshoot-windows-server-software-defined-networking-stack#check-mtu-and-jumbo-frame-support-on-hnv-provider-logical-network"
        }
        'Test-VfpDuplicateMacAddress' = @{
            Description = "Duplicate MAC address detected within Virtual Filtering Platform (VFP)."
            Impact = "Policy configuration failures may be reported by Network Controller when applying policies to the Hyper-v host. In addition, network traffic may be impacted."
            PublicDocUrl = ""
        }
        'Test-SdnVfpEnabledVMSwitch'= @{
            Description = "Multiple VFP enabled virtual switches detected on the Hyper-V host(s)."
            Impact = "Policy configuration failures may be reported by Network Controller when applying policies to the Hyper-v host."
            PublicDocUrl = ""
        }
        'Test-VMNetAdapterDuplicateMacAddress' = @{
            Description = "Duplicate MAC address detected with the data plane on the Hyper-V host(s)."
            Impact = "Policy configuration failures may be reported by Network Controller when applying policies to the Hyper-v host. In addition, network traffic may be impacted for the interfaces that are duplicated."
            PublicDocUrl = ""
        }
        'Test-ServerHostId' = @{
            Description = "HostID is not configured properly on the Hyper-V Hosts"
            Impact = "Mismatch of HostId between Hyper-V host(s) and Network Controller will result in policy configuration failures."
            PublicDocUrl = "https://learn.microsoft.com/en-us/windows-server/networking/sdn/troubleshoot/troubleshoot-windows-server-software-defined-networking-stack#check-for-corresponding-hostids-and-certificates-between-network-controller-and-each-hyper-v-host"
        }
    }
    ConfigurationStateErrorCodes = @{
        'Unknown' = @{
            Message = 'Unknown error'
            Action = 'Collect the logs and contact Microsoft Support'
        }
        'HostUnreachable' = @{
            Message = 'The host machine is not reachable'
            Action = 'Check the Management network connectivity between Network Controller and Host'
        }
        'PAIpAddressExhausted' = @{
            Message = 'The PA Ip addresses exhausted'
            Action = 'Increase the HNV Provider logical subnet''s IP Pool Size'
        }
        'PAMacAddressExhausted' = @{
            Message = 'The PA Mac addresses exhausted'
            Action = 'Increase the Mac Pool Range'
        }
        'PAAddressConfigurationFailure' = @{
            Message = 'Failed to plumb PA addresses to the host'
            Action = 'Check the management network connectivity between Network Controller and Host.'
        }
        'CertificateNotTrusted' = @{
            Message = 'Certificate is not trusted'
            Action = 'Fix the certificates used for communication with the host.'
        }
        'CertificateNotAuthorized' = @{
            Message = 'Certificate not authorized'
            Action = 'Fix the certificates used for communication with the host.'
        }
        'PolicyConfigurationFailureOnVfp' = @{
            Message = 'Failure in configuring VFP policies'
            Action = 'This is a runtime failure. No definite workarounds. Collect logs.'
        }
        'HostNotConnectedToController' = @{
            Message = 'The Host is not yet connected to the Network Controller'
            Action = 'Validate that Host is online and operational, NCHostAgent service is started and HostID registry key matches the Instance ID of the server resource'
        }
        'MultipleVfpEnabledSwitches' = @{
            Message = 'There are multiple VFp enabled Switches on the host'
            Action = 'Delete one of the switches, since Network Controller Host Agent only supports one vSwitch with the VFP extension enabled'
        }
        'PolicyConfigurationFailure' = @{
            Message = 'Failed to push policies (vSwitch, vNet, ACL) for a VmNic due to certificate errors or connectivity errors'
            Action = 'Check if proper certificates have been deployed (Certificate subject name must match FQDN of host). Also verify the host connectivity with the Network Controller'
        }
        'DistributedRouterConfigurationFailure' = @{
            Message = 'Failed to configure the Distributed router settings on the host vNic'
            Action = 'TCPIP stack error. May require cleaning up the PA and DR Host vNICs on the server on which this error was reported'
        }
        'DhcpAddressAllocationFailure' = @{
            Message = 'DHCP address allocation failed for a VMNic'
            Action = 'Check if the static IP address attribute is configured on the NIC resource'
        }
        'CertificateNotTrusted CertificateNotAuthorized' = @{
            Message = 'Failed to connect to Mux due to network or cert errors'
            Action = 'Check the numeric code provided in the error message code: this corresponds to the winsock error code. Certificate errors are granular (for example, cert cannot be verified, cert not authorized, etc.)'
        }
        'PortBlocked' = @{
            Message = 'The VFP port is blocked, due to lack of VNET / ACL policies'
            Action = 'Check if there are any other errors, which might cause the policies to be not configured.'
        }
        'Overloaded' = @{
            Message = 'Loadbalancer MUX is overloaded'
            Action = 'Performance issue with MUX'
        }
        'RoutePublicationFailure' = @{
            Message = 'Loadbalancer MUX is not connected to a BGP router'
            Action = 'Check if the MUX has connectivity with the BGP routers and that BGP peering is setup correctly'
        }
        'VirtualServerUnreachable' = @{
            Message = 'Loadbalancer MUX is not connected to SLB manager'
            Action = 'Check connectivity between SLBM and MUX'
        }
        'QosConfigurationFailure' = @{
            Message = 'Failed to configure QOS policies'
            Action = 'See if sufficient bandwidth is available for all VM''s if QOS reservation is used'
        }
    }

    HealthFaultEnabled = $false
    HealthFaultSupportedBuilds = @(
        '23H2' # Build Number 25398
        '24H2' # Build Number 26100
    )
    HealthFaultSupportedProducts = @(
        'Azure Stack HCI'
        'Windows Server 2025 Datacenter'
    )
}

# SIG # Begin signature block
# MIIoGwYJKoZIhvcNAQcCoIIoDDCCKAgCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCB0GKajoRPUp5HA
# r9FKUzqpJ8txhjuXAcT6WX+9pieNo6CCDYUwggYDMIID66ADAgECAhMzAAAEA73V
# lV0POxitAAAAAAQDMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p
# bmcgUENBIDIwMTEwHhcNMjQwOTEyMjAxMTEzWhcNMjUwOTExMjAxMTEzWjB0MQsw
# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
# AQCfdGddwIOnbRYUyg03O3iz19XXZPmuhEmW/5uyEN+8mgxl+HJGeLGBR8YButGV
# LVK38RxcVcPYyFGQXcKcxgih4w4y4zJi3GvawLYHlsNExQwz+v0jgY/aejBS2EJY
# oUhLVE+UzRihV8ooxoftsmKLb2xb7BoFS6UAo3Zz4afnOdqI7FGoi7g4vx/0MIdi
# kwTn5N56TdIv3mwfkZCFmrsKpN0zR8HD8WYsvH3xKkG7u/xdqmhPPqMmnI2jOFw/
# /n2aL8W7i1Pasja8PnRXH/QaVH0M1nanL+LI9TsMb/enWfXOW65Gne5cqMN9Uofv
# ENtdwwEmJ3bZrcI9u4LZAkujAgMBAAGjggGCMIIBfjAfBgNVHSUEGDAWBgorBgEE
# AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQU6m4qAkpz4641iK2irF8eWsSBcBkw
# VAYDVR0RBE0wS6RJMEcxLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJh
# dGlvbnMgTGltaXRlZDEWMBQGA1UEBRMNMjMwMDEyKzUwMjkyNjAfBgNVHSMEGDAW
# gBRIbmTlUAXTgqoXNzcitW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8v
# d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIw
# MTEtMDctMDguY3JsMGEGCCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDov
# L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDEx
# XzIwMTEtMDctMDguY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIB
# AFFo/6E4LX51IqFuoKvUsi80QytGI5ASQ9zsPpBa0z78hutiJd6w154JkcIx/f7r
# EBK4NhD4DIFNfRiVdI7EacEs7OAS6QHF7Nt+eFRNOTtgHb9PExRy4EI/jnMwzQJV
# NokTxu2WgHr/fBsWs6G9AcIgvHjWNN3qRSrhsgEdqHc0bRDUf8UILAdEZOMBvKLC
# rmf+kJPEvPldgK7hFO/L9kmcVe67BnKejDKO73Sa56AJOhM7CkeATrJFxO9GLXos
# oKvrwBvynxAg18W+pagTAkJefzneuWSmniTurPCUE2JnvW7DalvONDOtG01sIVAB
# +ahO2wcUPa2Zm9AiDVBWTMz9XUoKMcvngi2oqbsDLhbK+pYrRUgRpNt0y1sxZsXO
# raGRF8lM2cWvtEkV5UL+TQM1ppv5unDHkW8JS+QnfPbB8dZVRyRmMQ4aY/tx5x5+
# sX6semJ//FbiclSMxSI+zINu1jYerdUwuCi+P6p7SmQmClhDM+6Q+btE2FtpsU0W
# +r6RdYFf/P+nK6j2otl9Nvr3tWLu+WXmz8MGM+18ynJ+lYbSmFWcAj7SYziAfT0s
# IwlQRFkyC71tsIZUhBHtxPliGUu362lIO0Lpe0DOrg8lspnEWOkHnCT5JEnWCbzu
# iVt8RX1IV07uIveNZuOBWLVCzWJjEGa+HhaEtavjy6i7MIIHejCCBWKgAwIBAgIK
# YQ6Q0gAAAAAAAzANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNV
# BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv
# c29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlm
# aWNhdGUgQXV0aG9yaXR5IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEw
# OTA5WjB+MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE
# BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYD
# VQQDEx9NaWNyb3NvZnQgQ29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG
# 9w0BAQEFAAOCAg8AMIICCgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+la
# UKq4BjgaBEm6f8MMHt03a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc
# 6Whe0t+bU7IKLMOv2akrrnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4D
# dato88tt8zpcoRb0RrrgOGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+
# lD3v++MrWhAfTVYoonpy4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nk
# kDstrjNYxbc+/jLTswM9sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6
# A4aN91/w0FK/jJSHvMAhdCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmd
# X4jiJV3TIUs+UsS1Vz8kA/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL
# 5zmhD+kjSbwYuER8ReTBw3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zd
# sGbiwZeBe+3W7UvnSSmnEyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3
# T8HhhUSJxAlMxdSlQy90lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS
# 4NaIjAsCAwEAAaOCAe0wggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRI
# bmTlUAXTgqoXNzcitW2oynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTAL
# BgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBD
# uRQFTuHqp8cx0SOJNDBaBgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jv
# c29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFf
# MDNfMjIuY3JsMF4GCCsGAQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3
# dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFf
# MDNfMjIuY3J0MIGfBgNVHSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEF
# BQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1h
# cnljcHMuaHRtMEAGCCsGAQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkA
# YwB5AF8AcwB0AGEAdABlAG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn
# 8oalmOBUeRou09h0ZyKbC5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7
# v0epo/Np22O/IjWll11lhJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0b
# pdS1HXeUOeLpZMlEPXh6I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/
# KmtYSWMfCWluWpiW5IP0wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvy
# CInWH8MyGOLwxS3OW560STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBp
# mLJZiWhub6e3dMNABQamASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJi
# hsMdYzaXht/a8/jyFqGaJ+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYb
# BL7fQccOKO7eZS/sl/ahXJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbS
# oqKfenoi+kiVH6v7RyOA9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sL
# gOppO6/8MO0ETI7f33VtY5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtX
# cVZOSEXAQsmbdlsKgEhr/Xmfwb1tbWrJUnMTDXpQzTGCGewwghnoAgEBMIGVMH4x
# CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt
# b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01p
# Y3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTECEzMAAAQDvdWVXQ87GK0AAAAA
# BAMwDQYJYIZIAWUDBAIBBQCggZAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQw
# LwYJKoZIhvcNAQkEMSIEILeV7Aiwz4DiPwglb1cJeDSet87fD4088Csi0UjRIXvY
# MEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8AcwBvAGYAdKEagBhodHRw
# Oi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEBBQAEggEAfOOSe2HNnvso
# IaN0qXAV/xHwVY5MZe6OinXbKOW4i95GNgVVbZXZSyKM5aAtE9DpuPhycZNP85r/
# LgJlFgG05q4RYQHtO8yjx9IzUYd2e3d6xPcva0xWgDMAKUDMpQ1DXqEMU5bJkOEY
# bLcVgdSoKmxp+NyjB65/Cg8rVt6TXnCKM8XpstzG+mGRaXByOQvNr+yfTzSc85XF
# QuNVdIchWF5Uw2yDaFD9nDPDZRoT/QPGmcnp2KK5Uw5R/cHnG4covjCJ4eSYFmsf
# e5fnnl7ANxTU7si7kZ6/OpXprYnPclJR2NrkPLEH0g1itV4YCbxXsaVT/TbtdTc+
# NfQ6zh0qBaGCF5QwgheQBgorBgEEAYI3AwMBMYIXgDCCF3wGCSqGSIb3DQEHAqCC
# F20wghdpAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFSBgsqhkiG9w0BCRABBKCCAUEE
# ggE9MIIBOQIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFlAwQCAQUABCAmF32fGNSp
# 5fjYCbzf4KZaOWQqAFzjDkvYXzJMdkmuCgIGZ9v+Z9GvGBMyMDI1MDQwMTIxMjAy
# MS40ODJaMASAAgH0oIHRpIHOMIHLMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2Fz
# aGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENv
# cnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25z
# MScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046QTQwMC0wNUUwLUQ5NDcxJTAjBgNV
# BAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2WgghHqMIIHIDCCBQigAwIB
# AgITMwAAAgJ5UHQhFH24oQABAAACAjANBgkqhkiG9w0BAQsFADB8MQswCQYDVQQG
# EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG
# A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQg
# VGltZS1TdGFtcCBQQ0EgMjAxMDAeFw0yNTAxMzAxOTQyNDRaFw0yNjA0MjIxOTQy
# NDRaMIHLMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE
# BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYD
# VQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25zMScwJQYDVQQLEx5uU2hp
# ZWxkIFRTUyBFU046QTQwMC0wNUUwLUQ5NDcxJTAjBgNVBAMTHE1pY3Jvc29mdCBU
# aW1lLVN0YW1wIFNlcnZpY2UwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
# AQC3eSp6cucUGOkcPg4vKWKJfEQeshK2ZBsYU1tDWvQu6L9lp+dnqrajIdNeH1HN
# 3oz3iiGoJWuN2HVNZkcOt38aWGebM0gUUOtPjuLhuO5d67YpQsHBJAWhcve/MVdo
# QPj1njiAjSiOrL8xFarFLI46RH8NeDhAPXcJpWn7AIzCyIjZOaJ2DWA+6QwNzwqj
# BgIpf1hWFwqHvPEedy0notXbtWfT9vCSL9sdDK6K/HH9HsaY5wLmUUB7SfuLGo1O
# WEm6MJyG2jixqi9NyRoypdF8dRyjWxKRl2JxwvbetlDTio66XliTOckq2RgM+Zoc
# ZEb6EoOdtd0XKh3Lzx29AhHxlk+6eIwavlHYuOLZDKodPOVN6j1IJ9brolY6mZbo
# Q51Oqe5nEM5h/WJX28GLZioEkJN8qOe5P5P2Yx9HoOqLugX00qCzxq4BDm8xH85H
# KxvKCO5KikopaRGGtQlXjDyusMWlrHcySt56DhL4dcVnn7dFvL50zvQlFZMhVoeh
# WSQkkWuUlCCqIOrTe7RbmnbdJosH+7lC+n53gnKy4OoZzuUeqzCnSB1JNXPKnJoj
# P3De5xwspi5tUvQFNflfGTsjZgQAgDBdg/DO0TGgLRDKvZQCZ5qIuXpQRyg37yc5
# 1e95z8U2mysU0XnSpWeigHqkyOAtDfcIpq5Gv7HV+da2RwIDAQABo4IBSTCCAUUw
# HQYDVR0OBBYEFNoGubUPjP2f8ifkIKvwy1rlSHTZMB8GA1UdIwQYMBaAFJ+nFV0A
# XmJdg/Tl0mWnG1M1GelyMF8GA1UdHwRYMFYwVKBSoFCGTmh0dHA6Ly93d3cubWlj
# cm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMFRpbWUtU3RhbXAlMjBQ
# Q0ElMjAyMDEwKDEpLmNybDBsBggrBgEFBQcBAQRgMF4wXAYIKwYBBQUHMAKGUGh0
# dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIw
# VGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3J0MAwGA1UdEwEB/wQCMAAwFgYD
# VR0lAQH/BAwwCgYIKwYBBQUHAwgwDgYDVR0PAQH/BAQDAgeAMA0GCSqGSIb3DQEB
# CwUAA4ICAQCD83aFQUxN37HkOoJDM1maHFZVUGcqTQcPnOD6UoYRMmDKv0GabHlE
# 82AYgLPuVlukn7HtJPF2z0jnTgAfRMn26JFLPG7O/XbKK25hrBPJ30lBuwjATVt5
# 8UA1BWo7lsmnyrur/6h8AFzrXyrXtlvzQYqaRYY9k0UFY5GM+n9YaEEK2D268e+a
# +HDmWe+tYL2H+9O4Q1MQLag+ciNwLkj/+QlxpXiWou9KvAP0tIk+fH8F3ww5VOTi
# 9aZ9+qPjszw31H4ndtivBZaH5s5boJmH2JbtMuf2y7hSdJdE0UW2B0FEZPLImeml
# KhslJNVqEO7RPgl7c81QuVSO58ffpmbwtSxhYrES3VsPglXn9ODF7DqmPMG/GysB
# 4o/QkpNUq+wS7bORTNzqHMtH+ord2YSma+1byWBr/izIKggOCdEzaZDfym12GM6a
# 4S+Iy6AUIp7/KIpAmfWfXrcMK7V7EBzxoezkLREEWI4XtPwpEBntOa1oDH3Z/+dR
# xsxL0vgya7jNfrO7oizTAln/2ZBYB9ioUeobj5AGL45m2mcKSk7HE5zUReVkILpY
# KBQ5+X/8jFO1/pZyqzQeI1/oJ/RLoic1SieLXfET9EWZIBjZMZ846mDbp1ynK9Ub
# NiCjSwmTF509Yn9M47VQsxsv1olQu51rVVHkSNm+rTrLwK1tvhv0mTCCB3EwggVZ
# oAMCAQICEzMAAAAVxedrngKbSZkAAAAAABUwDQYJKoZIhvcNAQELBQAwgYgxCzAJ
# BgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25k
# MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jv
# c29mdCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDEwMB4XDTIxMDkzMDE4
# MjIyNVoXDTMwMDkzMDE4MzIyNVowfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldh
# c2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBD
# b3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIw
# MTAwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDk4aZM57RyIQt5osvX
# JHm9DtWC0/3unAcH0qlsTnXIyjVX9gF/bErg4r25PhdgM/9cT8dm95VTcVrifkpa
# /rg2Z4VGIwy1jRPPdzLAEBjoYH1qUoNEt6aORmsHFPPFdvWGUNzBRMhxXFExN6AK
# OG6N7dcP2CZTfDlhAnrEqv1yaa8dq6z2Nr41JmTamDu6GnszrYBbfowQHJ1S/rbo
# YiXcag/PXfT+jlPP1uyFVk3v3byNpOORj7I5LFGc6XBpDco2LXCOMcg1KL3jtIck
# w+DJj361VI/c+gVVmG1oO5pGve2krnopN6zL64NF50ZuyjLVwIYwXE8s4mKyzbni
# jYjklqwBSru+cakXW2dg3viSkR4dPf0gz3N9QZpGdc3EXzTdEonW/aUgfX782Z5F
# 37ZyL9t9X4C626p+Nuw2TPYrbqgSUei/BQOj0XOmTTd0lBw0gg/wEPK3Rxjtp+iZ
# fD9M269ewvPV2HM9Q07BMzlMjgK8QmguEOqEUUbi0b1qGFphAXPKZ6Je1yh2AuIz
# GHLXpyDwwvoSCtdjbwzJNmSLW6CmgyFdXzB0kZSU2LlQ+QuJYfM2BjUYhEfb3BvR
# /bLUHMVr9lxSUV0S2yW6r1AFemzFER1y7435UsSFF5PAPBXbGjfHCBUYP3irRbb1
# Hode2o+eFnJpxq57t7c+auIurQIDAQABo4IB3TCCAdkwEgYJKwYBBAGCNxUBBAUC
# AwEAATAjBgkrBgEEAYI3FQIEFgQUKqdS/mTEmr6CkTxGNSnPEP8vBO4wHQYDVR0O
# BBYEFJ+nFV0AXmJdg/Tl0mWnG1M1GelyMFwGA1UdIARVMFMwUQYMKwYBBAGCN0yD
# fQEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lv
# cHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTATBgNVHSUEDDAKBggrBgEFBQcDCDAZBgkr
# BgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
# AwEB/zAfBgNVHSMEGDAWgBTV9lbLj+iiXGJo0T2UkFvXzpoYxDBWBgNVHR8ETzBN
# MEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0
# cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcmwwWgYIKwYBBQUHAQEETjBMMEoG
# CCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01p
# Y1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNydDANBgkqhkiG9w0BAQsFAAOCAgEAnVV9
# /Cqt4SwfZwExJFvhnnJL/Klv6lwUtj5OR2R4sQaTlz0xM7U518JxNj/aZGx80HU5
# bbsPMeTCj/ts0aGUGCLu6WZnOlNN3Zi6th542DYunKmCVgADsAW+iehp4LoJ7nvf
# am++Kctu2D9IdQHZGN5tggz1bSNU5HhTdSRXud2f8449xvNo32X2pFaq95W2KFUn
# 0CS9QKC/GbYSEhFdPSfgQJY4rPf5KYnDvBewVIVCs/wMnosZiefwC2qBwoEZQhlS
# dYo2wh3DYXMuLGt7bj8sCXgU6ZGyqVvfSaN0DLzskYDSPeZKPmY7T7uG+jIa2Zb0
# j/aRAfbOxnT99kxybxCrdTDFNLB62FD+CljdQDzHVG2dY3RILLFORy3BFARxv2T5
# JL5zbcqOCb2zAVdJVGTZc9d/HltEAY5aGZFrDZ+kKNxnGSgkujhLmm77IVRrakUR
# R6nxt67I6IleT53S0Ex2tVdUCbFpAUR+fKFhbHP+CrvsQWY9af3LwUFJfn6Tvsv4
# O+S3Fb+0zj6lMVGEvL8CwYKiexcdFYmNcP7ntdAoGokLjzbaukz5m/8K6TT4JDVn
# K+ANuOaMmdbhIurwJ0I9JZTmdHRbatGePu1+oDEzfbzL6Xu/OHBE0ZDxyKs6ijoI
# Yn/ZcGNTTY3ugm2lBRDBcQZqELQdVTNYs6FwZvKhggNNMIICNQIBATCB+aGB0aSB
# zjCByzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT
# B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjElMCMGA1UE
# CxMcTWljcm9zb2Z0IEFtZXJpY2EgT3BlcmF0aW9uczEnMCUGA1UECxMeblNoaWVs
# ZCBUU1MgRVNOOkE0MDAtMDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGlt
# ZS1TdGFtcCBTZXJ2aWNloiMKAQEwBwYFKw4DAhoDFQBJiUhpCWA/3X/jZyIy0ye6
# RJwLzqCBgzCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u
# MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp
# b24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMA0GCSqG
# SIb3DQEBCwUAAgUA65ZN0jAiGA8yMDI1MDQwMTExMzQ0MloYDzIwMjUwNDAyMTEz
# NDQyWjB0MDoGCisGAQQBhFkKBAExLDAqMAoCBQDrlk3SAgEAMAcCAQACAgvqMAcC
# AQACAhNHMAoCBQDrl59SAgEAMDYGCisGAQQBhFkKBAIxKDAmMAwGCisGAQQBhFkK
# AwKgCjAIAgEAAgMHoSChCjAIAgEAAgMBhqAwDQYJKoZIhvcNAQELBQADggEBAJEW
# I/N3sXvXRlU8IfpK+ADk7KVmrZuDQJ93bCWJA0gA3iLh7RHQ4wP+7OF5w4yQ9Q9U
# jNjAyO6wFFJB3rvVQWS7yAZQgWoQuNfpsrzdt+BmXDMdgxLQ4JwdsNzX8cjf+m5K
# mKDVp8U6nqgh5gTE/veG7Wld+G1HrNG0aweJrXaC1Kr/hbJDqUYNtRGUkRLDp/W1
# virm1JvPVRrv3pFmgqBK0rKBbbTt/9YxX51Hirkct+JcNY274cXXrrLbi8JIChRw
# /iPkcuAOAge1XaI12f+voc0ExG393YjSh9OlMBi1uvhhleRqXSAwZ288p+TgIdyX
# XrHLvvjYeeSwEDDy1lQxggQNMIIECQIBATCBkzB8MQswCQYDVQQGEwJVUzETMBEG
# A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj
# cm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFt
# cCBQQ0EgMjAxMAITMwAAAgJ5UHQhFH24oQABAAACAjANBglghkgBZQMEAgEFAKCC
# AUowGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMC8GCSqGSIb3DQEJBDEiBCDE
# wcPjNoM2oAfOwrrqyhwBcA6slqpblITrryTLofgFGzCB+gYLKoZIhvcNAQkQAi8x
# geowgecwgeQwgb0EIPON6gEYB5bLzXLWuUmL8Zd8xXAsqXksedFyolfMlF/sMIGY
# MIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV
# BAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQG
# A1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAAICeVB0IRR9
# uKEAAQAAAgIwIgQgog92knBfnfTalAJ99s2f70lk2twulAENwrQOiCEGqE8wDQYJ
# KoZIhvcNAQELBQAEggIAcOkpwnF8lXTFy+/kFP/iCwvC8Hb9qmPP0S9ll8tpapet
# phMVpbMEA+6v73YG5g7NNbGsU6wTksssxqZkx/NI97rkuAsfN5uFncmZtWOHy4aX
# 7QZyO8wZOhwgY64Cgpv/gKdvL3C32Z5CVBUWwGvpAftv4r1RVEKsOnKbx61US1Lj
# qWr+v7/kj6yxe1xfwVhUmKMUWdcPypoT2n1TkIVoVa3+xtXHNPDdlQwWsF+ryJvL
# wrId/BCK+m4ijg7Kem5AbGNGFaQTeVH/cO2zBxJWOfxPjXluNOKT/jbINmsOk0Pz
# glemfuG0n4z2gI0wBUTZMvEhH7z/tWUYAw2I//8COInhKD56ZTpWbtiqW9Lqi+eh
# lI0EIYf3Cik4fH9gQhuXlgZT2QYjmP617BkwUqH1pvINGFFeaMUv2JtLQDqWFIAl
# 5PVyTasHeL1Bx05V4zUlCZ2MzkjLP1imDapUVWTpC+/CxZSaz0Oa1nC0yEHBIyrz
# LeARfiJynNP3aQt0Ne09Q5mtmPgy1L1twhsmYR85udNU0b+F0ah5pdpdHLPFV11W
# aDSibrMuohegMqqlPkJxXXc7SgBW4I1DhjrPrR5/LVOCKQHz+mY7Lc0jlYG7ZMCl
# SEAmmDQXqhGR7PpSrlY/wtimzVR70noFDpmRPkz5M0T3DEE23B9zgHEXGFEiq4o=
# SIG # End signature block