public/New-AppVentiXRegistryUserSetting.ps1

<#
.SYNOPSIS
    Creates an AppVentiX UserSetting XML file for a Group Policy configuration.
.DESCRIPTION
    Builds and saves an AppVentiX UserSetting XML file that defines a Group Policy configuration,
    including configured policies, elements, and registry entries. Supports two input modes:
 
    - AppVentiXParams mode (AppVentiXParamsFile / AppVentiXParamsContent): accepts pre-structured
      policy data from Get-IvantiWCPolicy -ExportFor AppVentiX, which includes policy metadata,
      element values, and registry entries ready for direct use.
 
    - Legacy RegistryEntries mode (AdmxFile / AdmxContent): accepts a flat array of hashtables
      describing individual registry entries; the function looks up matching ADMX policy definitions
      to build the policy structure.
 
    The ADMX and ADML files are saved alongside the XML if they do not already exist at the target path.
.PARAMETER FriendlyName
    Display name for the AppVentiX UserSetting.
.PARAMETER Description
    Optional description for the UserSetting.
.PARAMETER ExecutionOrder
    Execution order for the UserSetting. Defaults to 0.
.PARAMETER ProcessAtLogin
    Whether the policy is applied at login. Defaults to $true.
.PARAMETER ProcessAtRefresh
    Whether the policy is applied at refresh. Defaults to $true.
.PARAMETER ProcessAtReconnectAndUnlock
    Whether the policy is applied at reconnect and unlock. Defaults to $false.
.PARAMETER MachineGroupFriendlyName
    One or more machine group friendly names to apply the setting to. Defaults to 'All Machine Groups'.
.PARAMETER RegistryEntries
    Array of hashtables describing registry entries. Each entry must contain: RootKey, KeyPath
    Optional keys: ValueName, ValueData, ValueType, Action, DeleteKey.
.NOTES
    Function : New-AppVentiXRegistryUserSetting
    Author : John Billekens
    Copyright : (c) John Billekens Consultancy & AppVentiX
    Version : 2026.312.2000
#>

function New-AppVentiXRegistryUserSetting {
    [CmdletBinding()]
    [Alias("New-AppVentiXRegistry")]
    param (
        [Parameter(Mandatory = $true, ParameterSetName = "RegistryEntries")]
        [Parameter(Mandatory = $false, ParameterSetName = "InputObject")]
        [string]$FriendlyName,

        [Parameter(Mandatory = $false, ParameterSetName = "RegistryEntries")]
        [Parameter(Mandatory = $false, ParameterSetName = "InputObject")]
        [string]$Description,

        [Parameter(Mandatory = $false, ParameterSetName = "RegistryEntries")]
        [Parameter(Mandatory = $false, ParameterSetName = "InputObject")]
        [int]$ExecutionOrder = 0,

        [Parameter(Mandatory = $false, ParameterSetName = "RegistryEntries")]
        [Parameter(Mandatory = $false, ParameterSetName = "InputObject")]
        [bool]$ProcessAtLogin = $true,

        [Parameter(Mandatory = $false, ParameterSetName = "RegistryEntries")]
        [Parameter(Mandatory = $false, ParameterSetName = "InputObject")]
        [bool]$ProcessAtRefresh = $true,

        [Parameter(Mandatory = $false, ParameterSetName = "RegistryEntries")]
        [Parameter(Mandatory = $false, ParameterSetName = "InputObject")]
        [bool]$ProcessAtReconnectAndUnlock = $false,

        [Parameter(Mandatory = $false, ParameterSetName = "RegistryEntries")]
        [Parameter(Mandatory = $false, ParameterSetName = "InputObject")]
        [string[]]$MachineGroupFriendlyName = @("All Machine Groups"),

        [Parameter(Mandatory = $true, ParameterSetName = "RegistryEntries")]
        [hashtable[]]$RegistryEntries = @(),

        [Parameter(Mandatory = $true, ParameterSetName = "InputObject")]
        [PSCustomObject]$InputObject,

        [Parameter(DontShow)]
        [ValidateNotNullOrEmpty()]
        [string]$ConfigShare = $Script:AppVentix.ConfigShare
    )

    #region functions

    function New-RegistryUserSettingXml {
        <#
    .SYNOPSIS
        Builds and returns the UserSetting XML document object.
 
    .NOTES
        Function : New-RegistryUserSettingXml
        Author : John Billekens
        Copyright : Copyright (c) John Billekens Consultancy
        Version : 2026.0227.1200
    #>

        [CmdletBinding()]
        param ()

        $XmlDoc = New-Object System.Xml.XmlDocument

        # Root element
        $Root = $XmlDoc.CreateElement("UserSetting")
        [void]$XmlDoc.AppendChild($Root)

        # Helper: append a simple text element
        function Add-TextElement {
            param (
                [System.Xml.XmlElement]$Parent,
                [string]$Name,
                [string]$Text
            )
            $Element = $XmlDoc.CreateElement($Name)
            $Element.InnerText = $Text
            [void]$Parent.AppendChild($Element)
            return $Element
        }

        # Basic metadata
        [void](Add-TextElement -Parent $Root -Name "Id" -Text $SettingId)
        [void](Add-TextElement -Parent $Root -Name "FriendlyName" -Text $FriendlyName)
        [void](Add-TextElement -Parent $Root -Name "Description" -Text $Description)
        [void](Add-TextElement -Parent $Root -Name "Type" -Text $Type)
        [void](Add-TextElement -Parent $Root -Name "ExecutionOrder" -Text $ExecutionOrder)
        [void](Add-TextElement -Parent $Root -Name "CreatedDate" -Text $CreatedDate)
        [void](Add-TextElement -Parent $Root -Name "LastModifiedDate" -Text $LastModifiedDate)
        [void](Add-TextElement -Parent $Root -Name "ProcessAtLogin" -Text (ConvertTo-BooleanString -Value $ProcessAtLogin))
        [void](Add-TextElement -Parent $Root -Name "ProcessAtRefresh" -Text (ConvertTo-BooleanString -Value $ProcessAtRefresh))
        [void](Add-TextElement -Parent $Root -Name "ProcessAtReconnectAndUnlock" -Text (ConvertTo-BooleanString -Value $ProcessAtReconnectAndUnlock))

        $MachineGroupsElement = $XmlDoc.CreateElement("MachineGroups")
        foreach ($Group in $MachineGroups) {
            [void](Add-TextElement -Parent $MachineGroupsElement -Name "MachineGroup" -Text $Group)
        }
        [void]$Root.AppendChild($MachineGroupsElement)

        $MachineGroupFriendlyNamesElement = $XmlDoc.CreateElement("MachineGroupFriendlyNames")
        foreach ($GroupFriendlyName in $MachineGroupFriendlyNames) {
            [void](Add-TextElement -Parent $MachineGroupFriendlyNamesElement -Name "FriendlyName" -Text $GroupFriendlyName)
        }
        [void]$Root.AppendChild($MachineGroupFriendlyNamesElement)

        $RegistryEntriesElement = $XmlDoc.CreateElement("RegistryEntries")
        foreach ($EntryData in $NewRegistryEntries) {
            $RegistryEntryElement = $XmlDoc.CreateElement("RegistryEntry")
            [void](Add-TextElement -Parent $RegistryEntryElement -Name "RootKey" -Text $EntryData.RootKey)
            [void](Add-TextElement -Parent $RegistryEntryElement -Name "KeyPath" -Text $EntryData.KeyPath)
            [void](Add-TextElement -Parent $RegistryEntryElement -Name "ValueName" -Text $EntryData.ValueName)
            [void](Add-TextElement -Parent $RegistryEntryElement -Name "ValueData" -Text $EntryData.ValueData)
            [void](Add-TextElement -Parent $RegistryEntryElement -Name "ValueType" -Text $EntryData.ValueType)
            [void](Add-TextElement -Parent $RegistryEntryElement -Name "Action" -Text $EntryData.Action)
            [void](Add-TextElement -Parent $RegistryEntryElement -Name "DeleteKey" -Text (ConvertTo-BooleanString -Value ([bool]$EntryData.DeleteKey)))
            [void]$RegistryEntriesElement.AppendChild($RegistryEntryElement)
        }

        [void]$Root.AppendChild($RegistryEntriesElement)

        return $XmlDoc
    }

    #endregion functions

    if (Test-AppVentiXIsLicensed -ConfigShare $ConfigShare) {
        # region Basics

        $SettingId = [guid]::NewGuid().ToString()
        $Type = "RegistrySettings"

        # endregion Basics
        $userSettingsPath = Join-Path -Path $ConfigShare -ChildPath $Script:AppVentix.UserSettingsPath

        #Process the inputObject if provided
        if ($PSBoundParameters.ContainsKey("InputObject")) {
            Write-Verbose "Processing InputObject parameter..."
            if (-not [string]::IsNullOrEmpty($InputObject.FriendlyName)) {
                $FriendlyName = $InputObject.FriendlyName
            }
            if (-not [string]::IsNullOrEmpty($InputObject.Description)) {
                $Description = $InputObject.Description
            }
            $FriendlyName = $InputObject.FriendlyName
            $Description = $InputObject.Description
            $RegistryEntries = @($InputObject.RegistryEntries | ConvertTo-HashTable)
        }

        # Only first MachineGroup is used
        if ($MachineGroupFriendlyName.Count -gt 0) {
            if ($MachineGroup -notcontains "All Machine Groups" -and $MachineGroup -notcontains "All" -and $MachineGroup.Count -gt 0) {
                $AvailableGroups = Get-AppVentiXMachineGroup
                $MachineGroups = @()
                $MachineGroupFriendlyNames = @()
                foreach ($Group in $MachineGroupFriendlyName) {
                    $selectedGroup = $AvailableGroups | Where-Object { $_.FriendlyName -ieq $Group }
                    if ($selectedGroup) {
                        $MachineGroups += $selectedGroup.GroupName.ToString()
                        $MachineGroupFriendlyNames += $selectedGroup.FriendlyName.ToString()
                    }
                }
            } else {
                $MachineGroups = @("All")
                $MachineGroupFriendlyNames = @("All Machine Groups")
            }
        } else {
            $MachineGroups = @("All")
            $MachineGroupFriendlyNames = @("All Machine Groups")
        }

        #region --- Build $NewRegistryEntries ---

        #Check That the $RegistryEntries parameter is an array of hashtables with the required keys
        $NewRegistryEntries = @()

        foreach ($entry in $RegistryEntries) {
            if (-not ($entry.ContainsKey("RootKey") -and $entry.ContainsKey("KeyPath"))) {
                Write-Error "Each registry entry must be a hashtable containing at least the keys: RootKey, KeyPath"
                return
            }
            $NewRegistryEntry = [ordered]@{
                RootKey   = "$($entry.RootKey)"
                KeyPath   = "$($entry.KeyPath)"
                ValueName = "$($entry.ValueName)"
                ValueData = "$($entry.ValueData)"
                ValueType = "$($entry.ValueType)"
                Action    = "$($entry.Action)"
                DeleteKey = $($entry.DeleteKey)
            }
            if ([string]::IsNullOrEmpty($NewRegistryEntry.Action)) {
                $NewRegistryEntry.Action = "Set"
            }
            if ([string]::IsNullOrEmpty($NewRegistryEntry.DeleteKey)) {
                $NewRegistryEntry.DeleteKey = $false
            }

            #check and normalize the rootkey values
            Write-Verbose "Checking RootKey value: $($NewRegistryEntry.RootKey)"
            switch -CaseSensitive ($NewRegistryEntry.RootKey) {
                "HKLM" { $NewRegistryEntry.RootKey = "HKEY_LOCAL_MACHINE" }
                "HKCU" { $NewRegistryEntry.RootKey = "HKEY_CURRENT_USER" }
                "Machine" { $NewRegistryEntry.RootKey = "HKEY_LOCAL_MACHINE" }
                "User" { $NewRegistryEntry.RootKey = "HKEY_CURRENT_USER" }
                "HKEY_LOCAL_MACHINE" { }
                "HKEY_CURRENT_USER" { }
                default {
                    Write-Error "Invalid RootKey value: $($NewRegistryEntry.RootKey). Valid values are: HKEY_LOCAL_MACHINE (alias: HKLM, Machine), HKEY_CURRENT_USER (alias: HKCU, User)"
                    return
                }
            }
            $NewRegistryEntry.RootKey = $NewRegistryEntry.RootKey.ToUpper()
            if ($NewRegistryEntry.RootKey -notin @("HKEY_LOCAL_MACHINE", "HKEY_CURRENT_USER")) {
                Write-Error "Invalid RootKey value: $($NewRegistryEntry.RootKey). Valid values are: HKEY_LOCAL_MACHINE (alias: HKLM, Machine), HKEY_CURRENT_USER (alias: HKCU, User)"
                return
            }
            Write-Verbose "Continuing with normalized RootKey: $($NewRegistryEntry.RootKey)"
            Write-Verbose "Checking ValueType value: $($NewRegistryEntry.ValueType)"
            switch ($NewRegistryEntry.ValueType) {
                "String" { $NewRegistryEntry.ValueType = "REG_SZ" }
                "DWord" { $NewRegistryEntry.ValueType = "REG_DWORD" }
                "Binary" { $NewRegistryEntry.ValueType = "REG_BINARY" }
                "MultiString" { $NewRegistryEntry.ValueType = "REG_MULTI_SZ" }
                "ExpandString" { $NewRegistryEntry.ValueType = "REG_EXPAND_SZ" }
            }
            $NewRegistryEntry.ValueType = $NewRegistryEntry.ValueType.ToUpper()
            if ([string]::IsNullOrEmpty($NewRegistryEntry.ValueType)) {
                $NewRegistryEntry.ValueType = "REG_SZ"
                Write-Verbose "ValueType not specified. Defaulting to REG_SZ."
            }
            if ($NewRegistryEntry.ValueType -notin @("REG_SZ", "REG_DWORD", "REG_BINARY", "REG_MULTI_SZ", "REG_EXPAND_SZ")) {
                Write-Error "Invalid ValueType: $($NewRegistryEntry.ValueType). Valid values are: REG_SZ (alias: String), REG_DWORD (alias: DWord), REG_BINARY (alias: Binary), REG_MULTI_SZ (alias: MultiString), REG_EXPAND_SZ (alias: ExpandString)"
                return
            }
            Write-Verbose "Continuing with normalized ValueType: $($NewRegistryEntry.ValueType)"
            Write-Verbose "Checking DeleteKey value: $($NewRegistryEntry.DeleteKey)"
            $deleteKey = $false
            switch ($($NewRegistryEntry.DeleteKey)) {
                "True" { $deleteKey = $true }
                "False" { $deleteKey = $false }
                "1" { $deleteKey = $true }
                "0" { $deleteKey = $false }
                $true { $deleteKey = $true }
                $false { $deleteKey = $false }
                default {
                    Write-Error "Invalid DeleteKey value: $($NewRegistryEntry.DeleteKey). Valid values are: True (alias: 1), False (alias: 0)"
                    return
                }
            }
            $NewRegistryEntry.DeleteKey = $deleteKey
            if ($NewRegistryEntry.Action -ieq "Remove" -and [string]::IsNullOrEmpty($NewRegistryEntry.ValueName)) {
                $NewRegistryEntry.DeleteKey = $true
                Write-Verbose "Action is Remove and ValueName is empty. Setting DeleteKey to True."
            }
            Write-Verbose "Continuing with normalized DeleteKey: $($NewRegistryEntry.DeleteKey)"
            $NewRegistryEntries += $NewRegistryEntry
        }

        #endregion --- Build $NewRegistryEntries ---


        $policyFilename = "$($Type)-$($SettingId).xml"
        $policyFullname = Join-Path -Path $userSettingsPath -ChildPath $policyFilename

        $CreatedDate = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss")
        $LastModifiedDate = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss")

        #region --- Main ---
        if ([string]::IsNullOrEmpty($FriendlyName)) {
            Write-Error "FriendlyName is required. Please provide a value for the FriendlyName parameter or include it in the InputObject."
            return
        }

        try {
            Write-Verbose "Building UserSetting XML..."

            $XmlDocument = New-RegistryUserSettingXml

            $XmlWriterSettings = New-Object System.Xml.XmlWriterSettings
            $XmlWriterSettings.Indent = $true
            $XmlWriterSettings.IndentChars = " "
            $XmlWriterSettings.Encoding = [System.Text.Encoding]::UTF8
            $XmlWriterSettings.OmitXmlDeclaration = $true

            Write-Verbose "Saving UserSetting XML to $policyFullname"
            $XmlWriter = [System.Xml.XmlWriter]::Create($policyFullname, $XmlWriterSettings)

            $XmlDocument.Save($XmlWriter)
            Write-AppVentiXLogEntry -Feature UserSettings -Action $($MyInvocation.MyCommand.Name) -Details "New Registry User Setting '$FriendlyName' added with $($NewRegistryEntries.Count) setting(s)."
            $XmlWriter.Close()

            Write-Output ( [PSCustomObject]@{
                    Id           = $SettingId
                    FriendlyName = $FriendlyName
                    FileName     = $policyFilename
                }
            )
        } catch {
            Write-Error "Failed to generate XML: $($_.Exception.Message)"
        }
    } else {
        Write-Warning 'AppVentiX is not licensed!'
    }
}

# SIG # Begin signature block
# MII6wAYJKoZIhvcNAQcCoII6sTCCOq0CAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCVgiJJsBcj4H00
# Cjwp1UYpY+wGqB+I2cg/HO9bjNNhAKCCIuQwggXMMIIDtKADAgECAhBUmNLR1FsZ
# lUgTecgRwIeZMA0GCSqGSIb3DQEBDAUAMHcxCzAJBgNVBAYTAlVTMR4wHAYDVQQK
# ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBGBgNVBAMTP01pY3Jvc29mdCBJZGVu
# dGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAy
# MDAeFw0yMDA0MTYxODM2MTZaFw00NTA0MTYxODQ0NDBaMHcxCzAJBgNVBAYTAlVT
# MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBGBgNVBAMTP01pY3Jv
# c29mdCBJZGVudGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRo
# b3JpdHkgMjAyMDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALORKgeD
# Bmf9np3gx8C3pOZCBH8Ppttf+9Va10Wg+3cL8IDzpm1aTXlT2KCGhFdFIMeiVPvH
# or+Kx24186IVxC9O40qFlkkN/76Z2BT2vCcH7kKbK/ULkgbk/WkTZaiRcvKYhOuD
# PQ7k13ESSCHLDe32R0m3m/nJxxe2hE//uKya13NnSYXjhr03QNAlhtTetcJtYmrV
# qXi8LW9J+eVsFBT9FMfTZRY33stuvF4pjf1imxUs1gXmuYkyM6Nix9fWUmcIxC70
# ViueC4fM7Ke0pqrrBc0ZV6U6CwQnHJFnni1iLS8evtrAIMsEGcoz+4m+mOJyoHI1
# vnnhnINv5G0Xb5DzPQCGdTiO0OBJmrvb0/gwytVXiGhNctO/bX9x2P29Da6SZEi3
# W295JrXNm5UhhNHvDzI9e1eM80UHTHzgXhgONXaLbZ7LNnSrBfjgc10yVpRnlyUK
# xjU9lJfnwUSLgP3B+PR0GeUw9gb7IVc+BhyLaxWGJ0l7gpPKWeh1R+g/OPTHU3mg
# trTiXFHvvV84wRPmeAyVWi7FQFkozA8kwOy6CXcjmTimthzax7ogttc32H83rwjj
# O3HbbnMbfZlysOSGM1l0tRYAe1BtxoYT2v3EOYI9JACaYNq6lMAFUSw0rFCZE4e7
# swWAsk0wAly4JoNdtGNz764jlU9gKL431VulAgMBAAGjVDBSMA4GA1UdDwEB/wQE
# AwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIftJqhSobyhmYBAcnz1AQ
# T2ioojAQBgkrBgEEAYI3FQEEAwIBADANBgkqhkiG9w0BAQwFAAOCAgEAr2rd5hnn
# LZRDGU7L6VCVZKUDkQKL4jaAOxWiUsIWGbZqWl10QzD0m/9gdAmxIR6QFm3FJI9c
# Zohj9E/MffISTEAQiwGf2qnIrvKVG8+dBetJPnSgaFvlVixlHIJ+U9pW2UYXeZJF
# xBA2CFIpF8svpvJ+1Gkkih6PsHMNzBxKq7Kq7aeRYwFkIqgyuH4yKLNncy2RtNwx
# AQv3Rwqm8ddK7VZgxCwIo3tAsLx0J1KH1r6I3TeKiW5niB31yV2g/rarOoDXGpc8
# FzYiQR6sTdWD5jw4vU8w6VSp07YEwzJ2YbuwGMUrGLPAgNW3lbBeUU0i/OxYqujY
# lLSlLu2S3ucYfCFX3VVj979tzR/SpncocMfiWzpbCNJbTsgAlrPhgzavhgplXHT2
# 6ux6anSg8Evu75SjrFDyh+3XOjCDyft9V77l4/hByuVkrrOj7FjshZrM77nq81YY
# uVxzmq/FdxeDWds3GhhyVKVB0rYjdaNDmuV3fJZ5t0GNv+zcgKCf0Xd1WF81E+Al
# GmcLfc4l+gcK5GEh2NQc5QfGNpn0ltDGFf5Ozdeui53bFv0ExpK91IjmqaOqu/dk
# ODtfzAzQNb50GQOmxapMomE2gj4d8yu8l13bS3g7LfU772Aj6PXsCyM2la+YZr9T
# 03u4aUoqlmZpxJTG9F9urJh4iIAGXKKy7aIwggcGMIIE7qADAgECAhMzAAfM8rDv
# Jyd7QZv4AAAAB8zyMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ
# RCBWZXJpZmllZCBDUyBFT0MgQ0EgMDIwHhcNMjYwNDAyMjE0MTIwWhcNMjYwNDA1
# MjE0MTIwWjCBgzELMAkGA1UEBhMCTkwxFjAUBgNVBAgTDU5vb3JkLUJyYWJhbnQx
# EjAQBgNVBAcTCVNjaGlqbmRlbDEjMCEGA1UEChMaSm9obiBCaWxsZWtlbnMgQ29u
# c3VsdGFuY3kxIzAhBgNVBAMTGkpvaG4gQmlsbGVrZW5zIENvbnN1bHRhbmN5MIIB
# ojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAql2zC5qD+WbLZzawVOEM6hmw
# E525pZhueIRBk85Br6ZG8FoUZl7WzaPQV6JlW6kukWABJbvNbIKzQnLhu+SmCtBF
# 5OA+rjaAREtoajEbtuL+N7rmNVrPTe7POYz2lgLn3VL/0l+xTMI402gfo/Vvha2H
# ItsKRA93A7FHmWxnnhyA7p2ucpLfJNdNoCK1XsB22sNdhTqV8/TWRTuGzYP+FvTp
# jhdcq/xyy16jKdwIgNOXCCAU9U4EO1TLR1WTTmxQNOWy5dNdP48HYLiACx/d9Gf1
# EVytoAgxmsNon12TmLU/FW1KUddP91DcbCmvEg0Zmab/UBPg0bRRufv8oGeJqnb9
# bcCUxCH99cPAvIe0MLg4qCtRM80fA36yz4/dfIC7xowKEUxhR7/kWUfg+3mKA2nJ
# F6qSv3+llYtt7O6GRPWD40Rk9LGbSQD3+uCuAIBUNqh4Sokq1q+j+8jjU4yBNFBc
# tL1HsI6KXgTLWBO81v+mX+Fs62Euo8AfRByW7HhRAgMBAAGjggIZMIICFTAMBgNV
# HRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIHgDA8BgNVHSUENTAzBgorBgEEAYI3YQEA
# BggrBgEFBQcDAwYbKwYBBAGCN2G789NTgYr4ukmC0/31KIOytcN0MB0GA1UdDgQW
# BBQKkf4WVoYJs/qIk34nGHoMkkbjSzAfBgNVHSMEGDAWgBRln1HOhWh/L4pFiKrd
# pzG7Hg0AXjBnBgNVHR8EYDBeMFygWqBYhlZodHRwOi8vd3d3Lm1pY3Jvc29mdC5j
# b20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBJRCUyMFZlcmlmaWVkJTIwQ1MlMjBF
# T0MlMjBDQSUyMDAyLmNybDCBpQYIKwYBBQUHAQEEgZgwgZUwZAYIKwYBBQUHMAKG
# WGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0
# JTIwSUQlMjBWZXJpZmllZCUyMENTJTIwRU9DJTIwQ0ElMjAwMi5jcnQwLQYIKwYB
# BQUHMAGGIWh0dHA6Ly9vbmVvY3NwLm1pY3Jvc29mdC5jb20vb2NzcDBmBgNVHSAE
# XzBdMFEGDCsGAQQBgjdMg30BATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1p
# Y3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wCAYGZ4EMAQQB
# MA0GCSqGSIb3DQEBDAUAA4ICAQC74nf6TvL5WCfrJh27QL0oRpanrcasjQ1NTjWc
# SfyFdOv0IxPLaTcDfmin4wwOwgESPhnSPNWDwFf7tatAOG6pTL4MG2Op+izJPbGa
# ap0Hht3E0qTTsgaoxC2CEgnfeInM2SCKIbf7ymTd76TfqQSDUQdz25Z343yKOPLT
# 5WI/krGe4zCQh+ObMqhTfRTi31YQa+k9fRCALCGcVuu6nrfEC36y5zh8OmxbmawY
# L/CgWg2V5OYx5EA3WXgFnJbgrt3YpL6rxNKcFTvqmqEkc5X1g6CucGXLkAH1x2CC
# HoPQ/D5212vdFoPXLhHjASEbIi5VyzA77rFJF1ahcWO+pHI5YyQ4pvVrPCQ2im1D
# vsihP12hTrlHxdSQnB57pBvKHPRyZdKIxl0eurYdsNIqdspSi0VuWbLB+xUwJhZf
# cSmFBg9uIGVrQrt9MHAKzmcSAJQJn70BmaMmOgR5JbYsDOU4TIRg0p7h5XKWTvso
# 1wGR/Ondg7CdFb68kfjNhUAZtCUNd4HdxcgVqkeaLV6teIpNChYu2EUuzOAG7P1V
# hdz3fhn6WoKU6Yaj6mkIPOcBBJzM3ecoriYrrg2GQePxgWJltU6+zwA2PRrqzUzJ
# Brkln75enYK+/KjaCrNE98LiX2/aHHkFDCxd2fwl47iSkdSR57klynfkL+28Lf2e
# WhjDFzCCBwYwggTuoAMCAQICEzMAB8zysO8nJ3tBm/gAAAAHzPIwDQYJKoZIhvcN
# AQEMBQAwWjELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh
# dGlvbjErMCkGA1UEAxMiTWljcm9zb2Z0IElEIFZlcmlmaWVkIENTIEVPQyBDQSAw
# MjAeFw0yNjA0MDIyMTQxMjBaFw0yNjA0MDUyMTQxMjBaMIGDMQswCQYDVQQGEwJO
# TDEWMBQGA1UECBMNTm9vcmQtQnJhYmFudDESMBAGA1UEBxMJU2NoaWpuZGVsMSMw
# IQYDVQQKExpKb2huIEJpbGxla2VucyBDb25zdWx0YW5jeTEjMCEGA1UEAxMaSm9o
# biBCaWxsZWtlbnMgQ29uc3VsdGFuY3kwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAw
# ggGKAoIBgQCqXbMLmoP5ZstnNrBU4QzqGbATnbmlmG54hEGTzkGvpkbwWhRmXtbN
# o9BXomVbqS6RYAElu81sgrNCcuG75KYK0EXk4D6uNoBES2hqMRu24v43uuY1Ws9N
# 7s85jPaWAufdUv/SX7FMwjjTaB+j9W+FrYci2wpED3cDsUeZbGeeHIDuna5ykt8k
# 102gIrVewHbaw12FOpXz9NZFO4bNg/4W9OmOF1yr/HLLXqMp3AiA05cIIBT1TgQ7
# VMtHVZNObFA05bLl010/jwdguIALH930Z/URXK2gCDGaw2ifXZOYtT8VbUpR10/3
# UNxsKa8SDRmZpv9QE+DRtFG5+/ygZ4mqdv1twJTEIf31w8C8h7QwuDioK1EzzR8D
# frLPj918gLvGjAoRTGFHv+RZR+D7eYoDackXqpK/f6WVi23s7oZE9YPjRGT0sZtJ
# APf64K4AgFQ2qHhKiSrWr6P7yONTjIE0UFy0vUewjopeBMtYE7zW/6Zf4WzrYS6j
# wB9EHJbseFECAwEAAaOCAhkwggIVMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQD
# AgeAMDwGA1UdJQQ1MDMGCisGAQQBgjdhAQAGCCsGAQUFBwMDBhsrBgEEAYI3Ybvz
# 01OBivi6SYLT/fUog7K1w3QwHQYDVR0OBBYEFAqR/hZWhgmz+oiTficYegySRuNL
# MB8GA1UdIwQYMBaAFGWfUc6FaH8vikWIqt2nMbseDQBeMGcGA1UdHwRgMF4wXKBa
# oFiGVmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29m
# dCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEVPQyUyMENBJTIwMDIuY3JsMIGlBggr
# BgEFBQcBAQSBmDCBlTBkBggrBgEFBQcwAoZYaHR0cDovL3d3dy5taWNyb3NvZnQu
# Y29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBJRCUyMFZlcmlmaWVkJTIwQ1Ml
# MjBFT0MlMjBDQSUyMDAyLmNydDAtBggrBgEFBQcwAYYhaHR0cDovL29uZW9jc3Au
# bWljcm9zb2Z0LmNvbS9vY3NwMGYGA1UdIARfMF0wUQYMKwYBBAGCN0yDfQEBMEEw
# PwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9j
# cy9SZXBvc2l0b3J5Lmh0bTAIBgZngQwBBAEwDQYJKoZIhvcNAQEMBQADggIBALvi
# d/pO8vlYJ+smHbtAvShGlqetxqyNDU1ONZxJ/IV06/QjE8tpNwN+aKfjDA7CARI+
# GdI81YPAV/u1q0A4bqlMvgwbY6n6LMk9sZpqnQeG3cTSpNOyBqjELYISCd94iczZ
# IIoht/vKZN3vpN+pBINRB3PblnfjfIo48tPlYj+SsZ7jMJCH45syqFN9FOLfVhBr
# 6T19EIAsIZxW67qet8QLfrLnOHw6bFuZrBgv8KBaDZXk5jHkQDdZeAWcluCu3dik
# vqvE0pwVO+qaoSRzlfWDoK5wZcuQAfXHYIIeg9D8PnbXa90Wg9cuEeMBIRsiLlXL
# MDvusUkXVqFxY76kcjljJDim9Ws8JDaKbUO+yKE/XaFOuUfF1JCcHnukG8oc9HJl
# 0ojGXR66th2w0ip2ylKLRW5ZssH7FTAmFl9xKYUGD24gZWtCu30wcArOZxIAlAmf
# vQGZoyY6BHkltiwM5ThMhGDSnuHlcpZO+yjXAZH86d2DsJ0VvryR+M2FQBm0JQ13
# gd3FyBWqR5otXq14ik0KFi7YRS7M4Abs/VWF3Pd+GfpagpTphqPqaQg85wEEnMzd
# 5yiuJiuuDYZB4/GBYmW1Tr7PADY9GurNTMkGuSWfvl6dgr78qNoKs0T3wuJfb9oc
# eQUMLF3Z/CXjuJKR1JHnuSXKd+Qv7bwt/Z5aGMMXMIIHWjCCBUKgAwIBAgITMwAA
# AAX7elwyE2HfXQAAAAAABTANBgkqhkiG9w0BAQwFADBjMQswCQYDVQQGEwJVUzEe
# MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTQwMgYDVQQDEytNaWNyb3Nv
# ZnQgSUQgVmVyaWZpZWQgQ29kZSBTaWduaW5nIFBDQSAyMDIxMB4XDTIxMDQxMzE3
# MzE1M1oXDTI2MDQxMzE3MzE1M1owWjELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1p
# Y3Jvc29mdCBDb3Jwb3JhdGlvbjErMCkGA1UEAxMiTWljcm9zb2Z0IElEIFZlcmlm
# aWVkIENTIEVPQyBDQSAwMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
# ANIamXw/MpCkwOgg21r7IZgaQ6AX+y79d9kVbkqlcEDt2gCy5LkZ50yKEZjBqNHy
# DEK7cEelBwdOsXajpAH6gensbm10x7uOPnbh1AnROJ4IxCwUMpbjLkjpx2hHb3iG
# 7d9ToTBF/+J0JKYePgIdHkeB9rE0a1Spiq5TqEJYYmu90INnR6IrXF9bk9b1typ6
# bfTLe+h+2R2yzbKTGS5FgWmyjJegXWlmV2KTxnUvqmPNIA2jQrxatHddFDLu8R3r
# CKl6Uw090NwHjsUspUk3P++D96IPY9zrnphBWrhcy+ebdTL6WnRIUJg/LhTMRb/4
# mTo8L3HWNc4Wp1Sy8qZc9d/zc0qFN0I4T3agBoUSMIf2A86N4wnVSYFkEa1vNz96
# lhRZMTYjBNojuCLmII+0cLHhsL+yPXMTsmh4oSjHU/TXqEo6Ujc1ZyihnGDLTnTL
# ShaqFewoptpvOBpiGGUwaK0fz6PYsJWrE2ChaRmanVismJyTthVfKDJlpCCtYmoC
# y4BLemWkdK5P9Y1GLLMk4kalq/OELN1y/1eSlARLVBEH0P+EbZyNPbhRVCBiWVfZ
# g/8TlJLFqHRqwkEnpuh8tutcTCQB6k6jLgyoMIvMZP5n5a+8oVzy+90jlC5rtQKr
# uCOxqXukMDVtk7UAcTN77Uk5nT1uqyuctIBA+dUY7MitAgMBAAGjggIOMIICCjAO
# BgNVHQ8BAf8EBAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFGWfUc6F
# aH8vikWIqt2nMbseDQBeMFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIB
# FjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9y
# eS5odG0wGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwEgYDVR0TAQH/BAgwBgEB
# /wIBADAfBgNVHSMEGDAWgBTZQSmwDw9jbO9p1/XNKZ6kSGow5jBwBgNVHR8EaTBn
# MGWgY6Bhhl9odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNy
# b3NvZnQlMjBJRCUyMFZlcmlmaWVkJTIwQ29kZSUyMFNpZ25pbmclMjBQQ0ElMjAy
# MDIxLmNybDCBrgYIKwYBBQUHAQEEgaEwgZ4wbQYIKwYBBQUHMAKGYWh0dHA6Ly93
# d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwSUQlMjBW
# ZXJpZmllZCUyMENvZGUlMjBTaWduaW5nJTIwUENBJTIwMjAyMS5jcnQwLQYIKwYB
# BQUHMAGGIWh0dHA6Ly9vbmVvY3NwLm1pY3Jvc29mdC5jb20vb2NzcDANBgkqhkiG
# 9w0BAQwFAAOCAgEARUlg1HdPF+IOR871X6wdUolfKZOlzx0/Yz5Apr1P7rwc5mUQ
# I2JNoCmEd6V6ErUSWif5YYwuQ6v9kez9WEWRwg2MitM70kTHROmELYBo5rHYcw9J
# wkuoVVXIH5jULHDydVh8W7xuREIGENGRA9RTdDDj0M1ntc2x+VWtHUsbZ6HQVUY5
# 8g2BJu7DRHLyR0xt3l8wMndNBOSgwrBJeM+TtJr16sGh9j0tNtNBOj+Fqi8ILPzZ
# lLufgGvC8P9hJ9lZCFuz5Iq+FJ9YxuvrY/3obqoBclDzwoepG575OPG4rIv8z4wF
# ZI+6hK6+30mCAgsyeLOGFDVVR4HaBZ9sW1u2XwU90APc34avbuBMV261Q+a8V0kx
# RFINoM0KvSR8bHR8jH3AiixUDlzg0s3GHi6Qnfq+hnKAwU6Mj3SnHIwupgKuvv4Y
# jA56bylCB6cmBM1lHmrbcil7TH/kKyXkPp8uYwS/sanTjjxM93YO6p/P6Ka1K1Gx
# iwb/X1ptfH1l3QL9TwrSy/2nDC7R6MnklTCkGKgx290JtLkPjUNGBOJFMUkGvlv3
# As2ACN9rjdJ2/TODK9aY+GyWYnTZDOCcmKns6ISC8WJIB226CUCEq0Fq5uUWHcoS
# gaabSfSSZ9Gety43Z85TlMY5bAG0Iq9lps/ziRO9NwWx5kGUcMz8db7u0ucwggee
# MIIFhqADAgECAhMzAAAAB4ejNKN7pY4cAAAAAAAHMA0GCSqGSIb3DQEBDAUAMHcx
# CzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBG
# BgNVBAMTP01pY3Jvc29mdCBJZGVudGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0
# aWZpY2F0ZSBBdXRob3JpdHkgMjAyMDAeFw0yMTA0MDEyMDA1MjBaFw0zNjA0MDEy
# MDE1MjBaMGMxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y
# YXRpb24xNDAyBgNVBAMTK01pY3Jvc29mdCBJRCBWZXJpZmllZCBDb2RlIFNpZ25p
# bmcgUENBIDIwMjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCy8MCv
# GYgo4t1UekxJbGkIVQm0Uv96SvjB6yUo92cXdylN65Xy96q2YpWCiTas7QPTkGnK
# 9QMKDXB2ygS27EAIQZyAd+M8X+dmw6SDtzSZXyGkxP8a8Hi6EO9Zcwh5A+wOALNQ
# bNO+iLvpgOnEM7GGB/wm5dYnMEOguua1OFfTUITVMIK8faxkP/4fPdEPCXYyy8NJ
# 1fmskNhW5HduNqPZB/NkWbB9xxMqowAeWvPgHtpzyD3PLGVOmRO4ka0WcsEZqyg6
# efk3JiV/TEX39uNVGjgbODZhzspHvKFNU2K5MYfmHh4H1qObU4JKEjKGsqqA6Rzi
# ybPqhvE74fEp4n1tiY9/ootdU0vPxRp4BGjQFq28nzawuvaCqUUF2PWxh+o5/TRC
# b/cHhcYU8Mr8fTiS15kRmwFFzdVPZ3+JV3s5MulIf3II5FXeghlAH9CvicPhhP+V
# aSFW3Da/azROdEm5sv+EUwhBrzqtxoYyE2wmuHKws00x4GGIx7NTWznOm6x/niqV
# i7a/mxnnMvQq8EMse0vwX2CfqM7Le/smbRtsEeOtbnJBbtLfoAsC3TdAOnBbUkbU
# fG78VRclsE7YDDBUbgWt75lDk53yi7C3n0WkHFU4EZ83i83abd9nHWCqfnYa9qIH
# PqjOiuAgSOf4+FRcguEBXlD9mAInS7b6V0UaNwIDAQABo4ICNTCCAjEwDgYDVR0P
# AQH/BAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBTZQSmwDw9jbO9p
# 1/XNKZ6kSGow5jBUBgNVHSAETTBLMEkGBFUdIAAwQTA/BggrBgEFBQcCARYzaHR0
# cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRt
# MBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMA8GA1UdEwEB/wQFMAMBAf8wHwYD
# VR0jBBgwFoAUyH7SaoUqG8oZmAQHJ89QEE9oqKIwgYQGA1UdHwR9MHsweaB3oHWG
# c2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUy
# MElkZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUyMENlcnRpZmljYXRlJTIw
# QXV0aG9yaXR5JTIwMjAyMC5jcmwwgcMGCCsGAQUFBwEBBIG2MIGzMIGBBggrBgEF
# BQcwAoZ1aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNy
# b3NvZnQlMjBJZGVudGl0eSUyMFZlcmlmaWNhdGlvbiUyMFJvb3QlMjBDZXJ0aWZp
# Y2F0ZSUyMEF1dGhvcml0eSUyMDIwMjAuY3J0MC0GCCsGAQUFBzABhiFodHRwOi8v
# b25lb2NzcC5taWNyb3NvZnQuY29tL29jc3AwDQYJKoZIhvcNAQEMBQADggIBAH8l
# Kp7+1Kvq3WYK21cjTLpebJDjW4ZbOX3HD5ZiG84vjsFXT0OB+eb+1TiJ55ns0BHl
# uC6itMI2vnwc5wDW1ywdCq3TAmx0KWy7xulAP179qX6VSBNQkRXzReFyjvF2BGt6
# FvKFR/imR4CEESMAG8hSkPYso+GjlngM8JPn/ROUrTaeU/BRu/1RFESFVgK2wMz7
# fU4VTd8NXwGZBe/mFPZG6tWwkdmA/jLbp0kNUX7elxu2+HtHo0QO5gdiKF+YTYd1
# BGrmNG8sTURvn09jAhIUJfYNotn7OlThtfQjXqe0qrimgY4Vpoq2MgDW9ESUi1o4
# pzC1zTgIGtdJ/IvY6nqa80jFOTg5qzAiRNdsUvzVkoYP7bi4wLCj+ks2GftUct+f
# GUxXMdBUv5sdr0qFPLPB0b8vq516slCfRwaktAxK1S40MCvFbbAXXpAZnU20FaAo
# Dwqq/jwzwd8Wo2J83r7O3onQbDO9TyDStgaBNlHzMMQgl95nHBYMelLEHkUnVVVT
# UsgC0Huj09duNfMaJ9ogxhPNThgq3i8w3DAGZ61AMeF0C1M+mU5eucj1Ijod5O2M
# MPeJQ3/vKBtqGZg4eTtUHt/BPjN74SsJsyHqAdXVS5c+ItyKWg3Eforhox9k3Wgt
# WTpgV4gkSiS4+A09roSdOI4vrRw+p+fL4WrxSK5nMYIXMjCCFy4CAQEwcTBaMQsw
# CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSswKQYD
# VQQDEyJNaWNyb3NvZnQgSUQgVmVyaWZpZWQgQ1MgRU9DIENBIDAyAhMzAAfM8rDv
# Jyd7QZv4AAAAB8zyMA0GCWCGSAFlAwQCAQUAoF4wEAYKKwYBBAGCNwIBDDECMAAw
# GQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwLwYJKoZIhvcNAQkEMSIEIDozI3MD
# o13D0AEdb7OZVjStJV23vVVvLUpdU1oREx60MA0GCSqGSIb3DQEBAQUABIIBgASr
# O3QQYQDKGjmCxs1VFZI69UFq/GdT5W5mchhLKEF2s37F8s0bJhxkN1bhiLpSw+Lb
# rvPlh/mPVJcF5b5atwyzvbasUfqEvDwJsg5F6SAykJ6ofHxY2MqnZYx+r7GYBW5j
# 4GXuUpzUbLKKiQ7Cjpyxq+YfHrJKIeRUbnGRo3RUViE9XduBXbG5kYPfwVO7isaZ
# n0gou+RZuhtKmNqg+/P5GBeK/TYZMaBAw7GhVzS3vp7AhmtwBv8XzNVladj1o0qv
# oPArkNxU2+XUtfUHArhelWJ+8NBT6p1wU3Wqns1A2ghD6OYILeTswrDhyphzsXKb
# Z1eVkh22VTmc15yAFhX2r+ZvD6h2VKUW38VKlSpv+kwvxZck3yrNimHz3NZrpSRb
# YFQwSsMY+e9BpNT0ZzM7BiVaH4+HYxJLHiyPddnFupVL9BAUeuNbKKYNmgnn7qDX
# WDwnyvcg7dyEZ79vDPaJ6KPjuirt7VlqnXxC3HY3LDVLERMJQVEoVTSqhH9lcaGC
# FLIwghSuBgorBgEEAYI3AwMBMYIUnjCCFJoGCSqGSIb3DQEHAqCCFIswghSHAgED
# MQ8wDQYJYIZIAWUDBAIBBQAwggFqBgsqhkiG9w0BCRABBKCCAVkEggFVMIIBUQIB
# AQYKKwYBBAGEWQoDATAxMA0GCWCGSAFlAwQCAQUABCDAI2jmAfq+XQfvA6N6G4Bh
# jSRgsNy2lRGQqr6oZOgWkgIGacZn/6hyGBMyMDI2MDQwMzE0MzMyMC4wNjJaMASA
# AgH0oIHppIHmMIHjMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ
# MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
# MS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQx
# JzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo3QjFBLTA1RTAtRDk0NzE1MDMGA1UE
# AxMsTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZSBTdGFtcGluZyBBdXRob3JpdHmg
# gg8pMIIHgjCCBWqgAwIBAgITMwAAAAXlzw//Zi7JhwAAAAAABTANBgkqhkiG9w0B
# AQwFADB3MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0
# aW9uMUgwRgYDVQQDEz9NaWNyb3NvZnQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIFJv
# b3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMjAwHhcNMjAxMTE5MjAzMjMxWhcN
# MzUxMTE5MjA0MjMxWjBhMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0
# IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1l
# c3RhbXBpbmcgQ0EgMjAyMDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
# AJ5851Jj/eDFnwV9Y7UGIqMcHtfnlzPREwW9ZUZHd5HBXXBvf7KrQ5cMSqFSHGqg
# 2/qJhYqOQxwuEQXG8kB41wsDJP5d0zmLYKAY8Zxv3lYkuLDsfMuIEqvGYOPURAH+
# Ybl4SJEESnt0MbPEoKdNihwM5xGv0rGofJ1qOYSTNcc55EbBT7uq3wx3mXhtVmtc
# CEr5ZKTkKKE1CxZvNPWdGWJUPC6e4uRfWHIhZcgCsJ+sozf5EeH5KrlFnxpjKKTa
# vwfFP6XaGZGWUG8TZaiTogRoAlqcevbiqioUz1Yt4FRK53P6ovnUfANjIgM9JDdJ
# 4e0qiDRm5sOTiEQtBLGd9Vhd1MadxoGcHrRCsS5rO9yhv2fjJHrmlQ0EIXmp4DhD
# BieKUGR+eZ4CNE3ctW4uvSDQVeSp9h1SaPV8UWEfyTxgGjOsRpeexIveR1MPTVf7
# gt8hY64XNPO6iyUGsEgt8c2PxF87E+CO7A28TpjNq5eLiiunhKbq0XbjkNoU5Jht
# YUrlmAbpxRjb9tSreDdtACpm3rkpxp7AQndnI0Shu/fk1/rE3oWsDqMX3jjv40e8
# KN5YsJBnczyWB4JyeeFMW3JBfdeAKhzohFe8U5w9WuvcP1E8cIxLoKSDzCCBOu0h
# WdjzKNu8Y5SwB1lt5dQhABYyzR3dxEO/T1K/BVF3rV69AgMBAAGjggIbMIICFzAO
# BgNVHQ8BAf8EBAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFGtpKDo1
# L0hjQM972K9J6T7ZPdshMFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIB
# FjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9y
# eS5odG0wEwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJKwYBBAGCNxQCBAweCgBTAHUA
# YgBDAEEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTIftJqhSobyhmYBAcn
# z1AQT2ioojCBhAYDVR0fBH0wezB5oHegdYZzaHR0cDovL3d3dy5taWNyb3NvZnQu
# Y29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSWRlbnRpdHklMjBWZXJpZmljYXRp
# b24lMjBSb290JTIwQ2VydGlmaWNhdGUlMjBBdXRob3JpdHklMjAyMDIwLmNybDCB
# lAYIKwYBBQUHAQEEgYcwgYQwgYEGCCsGAQUFBzAChnVodHRwOi8vd3d3Lm1pY3Jv
# c29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMElkZW50aXR5JTIwVmVy
# aWZpY2F0aW9uJTIwUm9vdCUyMENlcnRpZmljYXRlJTIwQXV0aG9yaXR5JTIwMjAy
# MC5jcnQwDQYJKoZIhvcNAQEMBQADggIBAF+Idsd+bbVaFXXnTHho+k7h2ESZJRWl
# uLE0Oa/pO+4ge/XEizXvhs0Y7+KVYyb4nHlugBesnFqBGEdC2IWmtKMyS1OWIviw
# pnK3aL5JedwzbeBF7POyg6IGG/XhhJ3UqWeWTO+Czb1c2NP5zyEh89F72u9UIw+I
# fvM9lzDmc2O2END7MPnrcjWdQnrLn1Ntday7JSyrDvBdmgbNnCKNZPmhzoa8PccO
# iQljjTW6GePe5sGFuRHzdFt8y+bN2neF7Zu8hTO1I64XNGqst8S+w+RUdie8fXC1
# jKu3m9KGIqF4aldrYBamyh3g4nJPj/LR2CBaLyD+2BuGZCVmoNR/dSpRCxlot0i7
# 9dKOChmoONqbMI8m04uLaEHAv4qwKHQ1vBzbV/nG89LDKbRSSvijmwJwxRxLLpMQ
# /u4xXxFfR4f/gksSkbJp7oqLwliDm/h+w0aJ/U5ccnYhYb7vPKNMN+SZDWycU5OD
# IRfyoGl59BsXR/HpRGtiJquOYGmvA/pk5vC1lcnbeMrcWD/26ozePQ/TWfNXKBOm
# kFpvPE8CH+EeGGWzqTCjdAsno2jzTeNSxlx3glDGJgcdz5D/AAxw9Sdgq/+rY7jj
# gs7X6fqPTXPmaCAJKVHAP19oEjJIBwD1LyHbaEgBxFCogYSOiUIr0Xqcr1nJfiWG
# 2GwYe6ZoAF1bMIIHnzCCBYegAwIBAgITMwAAAFl82nHpjV71wAAAAAAAWTANBgkq
# hkiG9w0BAQwFADBhMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENv
# cnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3Rh
# bXBpbmcgQ0EgMjAyMDAeFw0yNjAxMDgxODU5MDFaFw0yNzAxMDcxODU5MDFaMIHj
# MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk
# bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRN
# aWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNVBAsTHm5T
# aGllbGQgVFNTIEVTTjo3QjFBLTA1RTAtRDk0NzE1MDMGA1UEAxMsTWljcm9zb2Z0
# IFB1YmxpYyBSU0EgVGltZSBTdGFtcGluZyBBdXRob3JpdHkwggIiMA0GCSqGSIb3
# DQEBAQUAA4ICDwAwggIKAoICAQCmLuf+NHhF/oU/uYxWteOm4nd3QOC512J7b5D9
# whsOCxgERYZ7yzEif1bbLm8w2nhZ5u8m9ikjO9Fph0Ka3Qlaqb1B+5dLgeIzcO7q
# y6AEfZChyxNFZTJQ0rQ0sVASN6sLHa473Zr1dJPvf547gxIkpcyU3+w6MHdSt2zu
# G3kcmhYUfmPLcphAjqpTgH32KxtsGXVTOdfkEgUnvjxMpK/Aujp56koqbhfH2bwm
# +v4bpNGZumcLGosUhyAE9iBBr0u3OtyJvI1d2vEdCuotsosNDTZZ00qcMv2X7+4s
# LCwcIX24wU5/lzpepj8w10EN1fkkT/cV2xijrAU8cxone2igB8N6OAIZfVBlix/Z
# DT91VKJBOiWJI5X6blBmeoEMqg3sH8Q+FaGCJaKbeB2dMUL6mo7icfnK/C0fyGee
# oCy5sMjM3Xufr7YwaIpa8v4EmcFRsIJL5CIKSjwUBxrEgdMt7M6+2O8BG+r9MmWp
# dV1L1p5894p02klrAhayz1cFZl8t53GOf3duVaTpIbfpuvexljW77DToQDh0Wn7R
# PY/4YZKDOkbMiXwS54ajHAP8HGr3+aI+TXskUHRmXiynJbPXLCkt7AVMz4nccdoo
# jR/Qj2g6v2yyRDl2rGKIVzJ0Yp7vn1JPNbPFTuw0Ehen35+aKkh6FfJX9QMervpH
# UoW/AQIDAQABo4IByzCCAccwHQYDVR0OBBYEFI+W5wtfA9L5Z0kYQjojgxhrlzZ2
# MB8GA1UdIwQYMBaAFGtpKDo1L0hjQM972K9J6T7ZPdshMGwGA1UdHwRlMGMwYaBf
# oF2GW2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29m
# dCUyMFB1YmxpYyUyMFJTQSUyMFRpbWVzdGFtcGluZyUyMENBJTIwMjAyMC5jcmww
# eQYIKwYBBQUHAQEEbTBrMGkGCCsGAQUFBzAChl1odHRwOi8vd3d3Lm1pY3Jvc29m
# dC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMFB1YmxpYyUyMFJTQSUyMFRp
# bWVzdGFtcGluZyUyMENBJTIwMjAyMC5jcnQwDAYDVR0TAQH/BAIwADAWBgNVHSUB
# Af8EDDAKBggrBgEFBQcDCDAOBgNVHQ8BAf8EBAMCB4AwZgYDVR0gBF8wXTBRBgwr
# BgEEAYI3TIN9AQEwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQu
# Y29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMAgGBmeBDAEEAjANBgkqhkiG
# 9w0BAQwFAAOCAgEARDIcwv2XI6Rv81ERO89mKeb61MVI7BOV2t7f9kRrxEsL25rJ
# N2yx4UhQGo4KNl0PMaBgz97FISgiz3iAkm5Fb+lfLEqfHyfCaLOsq2sH9mFYrPLX
# Ffjju1PUuiRj0M6Zj53H80HOJ3tX6mePh4immyAxKBXXXUE9hIJJPX88QmPxGedm
# rydu3Un6yPyA5sp/VddDt4kKYNhfgvbzU65O51YKA6B2vfkN6WK9CBxp0preYq4B
# k+N+s6OVp1z/BcTIbMB9WosokmYlc4aK9dAvQudnD9wvPzxKDClF7LS46DztEzJH
# lv9Ra9fOilw+OUEYAaNMSJoLVk3c1hZ5Q/qe/ogwSLkqzXEVw0WLqv2mGWg4VkiN
# EmHTyFlYeV717lgN9WvKENEjvqD2tzZPNJNPOuMIosidSrG0p2mnn4Pb7KXoIa6W
# PJYwsMXwlLceR0ETYACTiPCCgAiuHdNeDJNIZUTtJUFUR3oKiINvSul6pHN+tFtm
# SRlHLLZSqJJFY+igB4xsqy0T83qWH4mVCauIF8sW6bym9VydhTduvNmlKDV6PUck
# StXIdH+upOvso/PJM77gu/ryVrTQ7P1KSDOh4ZtJFOuCVCezDBEHAHO5KX7expu2
# HkSvqCoKlIGFwn5s21/JyVyWZz2vAA1lbCKrLjQMQiNAmV5FC6H6qOQXus8xggPU
# MIID0AIBATB4MGExCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y
# cG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWVzdGFt
# cGluZyBDQSAyMDIwAhMzAAAAWXzacemNXvXAAAAAAABZMA0GCWCGSAFlAwQCAQUA
# oIIBLTAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwLwYJKoZIhvcNAQkEMSIE
# IDiRBAy7aVZMY24fzfnd86xHrg0jYxYLbJf1DQqW4bCCMIHdBgsqhkiG9w0BCRAC
# LzGBzTCByjCBxzCBoAQgy0W6sduG6bHFxCfh44/ca3FFcO0fDssjH0gdmBit/rww
# fDBlpGMwYTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh
# dGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZXN0YW1waW5n
# IENBIDIwMjACEzMAAABZfNpx6Y1e9cAAAAAAAFkwIgQg2aGPSyfgTKIPOuZi5+OG
# GZRzPS8sYF6XQTw2/IPxIA8wDQYJKoZIhvcNAQELBQAEggIAFWL15lKpwe3gAEVJ
# 3Dv6GEXdKaQteo5I19biph0o4/1QggI/OpZpZuT5tWqsFgNcKk2YCyPSxmgNpdr6
# d9LOAOYFGJ/QlgrGJBr+QSGwH28RIqZfT4J95t6DI10rnoZszHCS+es6LfNQiIzr
# JJsD9LWsdqhkDj5B1OVtj/rehKxCp/ddSQFkqFAyH3Kf7P6eN+Rrs3ABnAzrYcxf
# 25NyqJB4S3fGoMztcYy67nA+bc9cG3u5fK//zYQ+JV4WNFS3fhI+itAyB8IJC/04
# im74PoLn86unj60hFRpQ1eBvs2KKNrjBYfR0neSHXgILN8vLL6/Y4wOQomEZI/Oc
# MTxq/XqIRva+NqLe3a83eLDZEOtEyfNIEcom204abGO3NzmQLGceplCl9eqrUc2S
# aYm/vsezKrumu791Ejdk1uQWCkaVnn7aosytkbltu4ZnDGd6CAwoo3mpxHP07PLz
# qU+N4k/zVJLgJR40Zhpu/2FdxJhsWyfGeYJ5cNkC2+qzZn8D+M8mdbSFGvpVB4pn
# WhhOE4MQguvp5/CkZXaA/Tqqrp6X7yd4Ug/dEdNGHe2DAm943NQx1wGpiCw4/7uv
# NOxo7rdmKV2FuDoSoEQgNZuQ4+8YWxB1FFYM6z5PbJAOqGFklNeuXh4+uPqhsZey
# QCA5JwkfdX7Me2yjEUoo6Uqiacc=
# SIG # End signature block