DSCResources/DCPP_SystemConfiguration/DCPP_SystemConfiguration.psm1

# Import the helper functions

Import-Module $PSScriptRoot\..\..\Misc\helper.psm1 -Verbose:$false

function Get-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Collections.Hashtable])]
    param
    (
        [parameter(Mandatory = $true)]
        [System.String]
        $Category
    )

    #Write-Verbose "Use this cmdlet to deliver information about command processing."

    #Write-Debug "Use this cmdlet to write debug information while troubleshooting."


    <#
    $returnValue = @{
        Category = [System.String]
        MultiCoreSupport = [System.String]
        IntelSpeedStep = [System.String]
        CStates = [System.String]
        IntelTurboBoost = [System.String]
        HyperThreadControl = [System.String]
        Password = [System.String]
        SecurePassword = [System.String]
        PathToKey = [System.String]
    }
 
    $returnValue
    #>

    
                   # Check if module DellBIOSprovider is already loaded. If not, load it.
   try{
    $bool = Confirm-DellPSDrive -verbose
    }
    catch 
    {
        write-Verbose $_
        $msg = "Get-TargetResource: $($_.Exception.Message)"
        Write-DellEventLog -Message $msg -EventID 1 -EntryType 'Error'
        write-Verbose "Exiting Get-TargetResource"
        return
    }
    if ($bool) {                      
        Write-Verbose "Dell PS-Drive DellSmbios is found."
    }
    else{
        $Message = “Get-TargetResource: Module DellBiosProvider was imported correctly."
        Write-DellEventLog -Message $Message -EventID 2 
    }

    $Get = get-childitem -path @("DellSmbios:\" + $Category)
     # Removing Verbose and Debug from output
    $PSBoundParameters.Remove("Verbose") | out-null
    $PSBoundParameters.Remove("Debug") | out-null

  
    $out = @{}   
    $Get | foreach-Object {$out.Add($_.Attribute, $_.CurrentValue)}
    $out.add('Category', $Category )
    $out

}


function Set-TargetResource
{
    [CmdletBinding()]
    param
    (
        [parameter(Mandatory = $true)]
        [System.String]
        $Category,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $WatchdogTimer,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $MEMSSensors,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $KeyboardBacklightOnAc,
        
        [ValidateSet("Enabled","Disabled","Auto")]
        [System.String]
        $IntegratedAudio,
        
        [ValidateSet("Enabled","Disabled","Low","Medium","High")]
        [System.String]
        $InternalSpeaker,
        
        [ValidateSet("Enabled","Disabled","EnabledPxe","OnWithImageServerBoot","EnabledwithRPLBoot","EnabledwithISCSIBoot")]
        [System.String]
        $EmbNic1,
        
        [ValidateSet("Off","25","50","75","100","Auto")]
        [System.String]
        $KeyboardIllumination,
        
        [ValidateSet("Ata","Disabled","Ahci","Raid")]
        [System.String]
        $EmbSataRaid,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $PowerButton,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $OnboardSoundDevice,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $IoModule,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $CanBus,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UefiNwStack,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata0,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata1,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata2,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata3,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata4,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata5,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata6,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata7,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Minisas0,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Minisas1,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Minisas2,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Minisas3,
        
        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel1,

        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel2,

        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel3,

        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel4,

        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel5,

        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel6,

        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel7,

        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel8,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $SmartErrors,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $DisOsdBtn,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Hdd1FanEnable,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Hdd2FanEnable,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Hdd3FanEnable,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $LiquidCooler1,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $LiquidCooler2,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPowerShare,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Microphone,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $DockSupportOnBattery,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UnobtrusiveMode,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Touchscreen,        

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $M2PcieSsd0,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $M2PcieSsd1,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $MmioAbove4Gb,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $IntegratedSas,        
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $OptionalBootSequence,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $NearFieldComputing,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $ForcePxeNextBoot,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $ForcePXEasFirstBootDevice,
                
        [ValidateSet("Auto","Disabled")]
        [System.String]
        $VmdPcieSlot,
                        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $VmdNvmePcie0,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $VmdNvmePcie1,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $VmdNvmePcie0Cpu1,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $VmdNvmePcie1Cpu1,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata8,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $EMMCDevice,
        
        [System.String]
        $Password,

        [System.String]
        $SecurePassword,

        [System.String]
        $PathToKey
    )

    if (-not(CheckModuleLoaded)) {
        Write-Verbose -Message 'Required module DellBiosProvider does not exist. Exiting.'
        return $true
    }

    $DellPSDrive = get-psdrive -name Dellsmbios
    if ( !$DellPSDrive)
    {
        $Message = "Drive DellSmbios is not found. Exiting."
        Write-Verbose $Message
        Write-DellEventLog -Message $Message -EventID 3 -EntryType "Error"
        return $true
    }
    $attributes_desired = $PSBoundParameters
    $atts = $attributes_desired

    $pathToCategory = $DellPSDrive.Name + ':\' + $atts["Category"]
    
    Dir $pathToCategory -verbose

    $atts.Remove("Verbose") | out-null
    $atts.Remove("Category") | out-null
    $atts.Remove("Debug") | out-null
    $securePwd=$atts["SecurePassword"]
    $passwordSet=$atts["Password"]
    $atts.Remove("Password") | Out-Null
    $atts.Remove("SecurePassword") | Out-Null
    $pathToKey=$atts["PathToKey"]
    if(-Not [string]::IsNullOrEmpty($pathToKey))
    {  
        if(Test-Path $pathToKey)
        {
        $key=Get-Content $pathToKey
        }
        else
        {
        $key=""
        }
    }
    $atts.Remove("PathToKey") | Out-Null
    
    #foreach($a in Import-Csv((Get-DellBIOSEncryptionKey)))
    #{
   # $key+=$a
   # }
    $atts.Keys | foreach-object { 
                   # $atts[$_]
                    $path = $pathToCategory + '\' + $($_)
                    $value = $atts[$_]
            if(-Not [string]::IsNullOrEmpty($securePwd))
            {                
            $pasvar=ConvertTo-SecureString $securePwd.ToString() -Key $key
            Set-Item  -path $path -value $value -verbose -ErrorVariable ev -ErrorAction SilentlyContinue -PasswordSecure $pasvar
            }

            elseif(-Not [string]::IsNullOrEmpty($passwordSet))
            {
            Set-Item  -path $path -value $value -verbose -ErrorVariable ev -ErrorAction SilentlyContinue -Password $passwordSet
            }

            else
            {
            Set-Item  -path $path -value $value -verbose -ErrorVariable ev -ErrorAction SilentlyContinue
            }
                    if ( $ev) { 
                        $cmdline = $ExecutionContext.InvokeCommand.ExpandString($ev.InvocationInfo.Line)
                        $Message = "An error occured in executing " + $cmdline + "`nError message: $($ev.ErrorDetails)"
                        Write-Verbose $Message
                        Write-DellEventLog -Message $Message -EventID 5 -EntryType "Error"
                    }
                    
                 }



}


function Test-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Boolean])]
    param
    (
        [parameter(Mandatory = $true)]
        [System.String]
        $Category,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $WatchdogTimer,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $MEMSSensors,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $KeyboardBacklightOnAc,
        
        [ValidateSet("Enabled","Disabled","Auto")]
        [System.String]
        $IntegratedAudio,
        
        [ValidateSet("Enabled","Disabled","Low","Medium","High")]
        [System.String]
        $InternalSpeaker,
        
        [ValidateSet("Enabled","Disabled","EnabledPxe","OnWithImageServerBoot","EnabledwithRPLBoot","EnabledwithISCSIBoot")]
        [System.String]
        $EmbNic1,
        
        [ValidateSet("Ata","Disabled","Ahci","Raid")]
        [System.String]
        $EmbSataRaid,
        
        [ValidateSet("Off","25","50","75","100","Auto")]
        [System.String]
        $KeyboardIllumination,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $PowerButton,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $OnboardSoundDevice,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $IoModule,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $CanBus,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UefiNwStack,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata0,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata1,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata2,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata3,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata4,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata5,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata6,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata7,
                
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Minisas0,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Minisas1,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Minisas2,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Minisas3,
        
        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel1,

        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel2,

        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel3,

        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel4,

        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel5,

        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel6,

        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel7,

        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel8,        
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $SmartErrors,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $DisOsdBtn,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Hdd1FanEnable,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Hdd2FanEnable,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Hdd3FanEnable,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $LiquidCooler1,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $LiquidCooler2,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPowerShare,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Microphone,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $DockSupportOnBattery,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UnobtrusiveMode,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Touchscreen,        

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $M2PcieSsd0,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $M2PcieSsd1,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $MmioAbove4Gb,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $IntegratedSas,        
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $OptionalBootSequence,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $NearFieldComputing,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $ForcePxeNextBoot,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $ForcePXEasFirstBootDevice,
        
        [ValidateSet("Auto","Disabled")]
        [System.String]
        $VmdPcieSlot,
                        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $VmdNvmePcie0,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $VmdNvmePcie1,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $VmdNvmePcie0Cpu1,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $VmdNvmePcie1Cpu1,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata8,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $EMMCDevice,

        [System.String]
        $Password,

        [System.String]
        $SecurePassword,

        [System.String]
        $PathToKey
    )

    $Get = Get-TargetResource $PSBoundParameters['Category'] -verbose

    New-DellEventLog
 
    $PSBoundParameters.Remove("Verbose") | out-null
    $PSBoundParameters.Remove("Debug") | out-null
    $PSBoundParameters.Remove("Category") | out-null
    $PSBoundParameters.Remove("Password") | out-null
    $PSBoundParameters.Remove("SecurePassword") | out-null

    $attributes_desired = $PSBoundParameters

    $bool = $true

    foreach ($config_att in  $PSBoundParameters.GetEnumerator())
    {
        if ($Get.ContainsKey($config_att.Key)) {
            $currentvalue = $Get[$config_att.Key]
            $currentvalue_nospace = $currentvalue -replace " ", ""
            if ($config_att.Value -ne $currentvalue_nospace){
                $bool = $false
                $drift  = "`nCurrentValue: $currentvalue_nospace`nDesiredValue: $($config_att.value)"
                $message = "Configuration is drifted in category $Category for $($config_att.Key). $drift"
                write-verbose $message
                Write-DellEventLog -Message $message -EventID 4 -EntryType Warning
            
            }
            else {
                write-Debug "Configuration is same for $config_att."
            }
    }
    else
    {
        $message = "Unsupported attribute $($config_att)"
        Write-Verbose $message
    }
   }
   return $bool

}


Export-ModuleMember -Function *-TargetResource


# SIG # Begin signature block
# MIIcOQYJKoZIhvcNAQcCoIIcKjCCHCYCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAutvu2XJ+Y3i6x
# ciaLSDjNeo4h80R6JdS8+EOqCXlDw6CCCscwggUyMIIEGqADAgECAg0Ah4JSYAAA
# AABR03PZMA0GCSqGSIb3DQEBCwUAMIG+MQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
# RW50cnVzdCwgSW5jLjEoMCYGA1UECxMfU2VlIHd3dy5lbnRydXN0Lm5ldC9sZWdh
# bC10ZXJtczE5MDcGA1UECxMwKGMpIDIwMDkgRW50cnVzdCwgSW5jLiAtIGZvciBh
# dXRob3JpemVkIHVzZSBvbmx5MTIwMAYDVQQDEylFbnRydXN0IFJvb3QgQ2VydGlm
# aWNhdGlvbiBBdXRob3JpdHkgLSBHMjAeFw0xNTA2MTAxMzQyNDlaFw0zMDExMTAx
# NDEyNDlaMIHIMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNRW50cnVzdCwgSW5jLjEo
# MCYGA1UECxMfU2VlIHd3dy5lbnRydXN0Lm5ldC9sZWdhbC10ZXJtczE5MDcGA1UE
# CxMwKGMpIDIwMTUgRW50cnVzdCwgSW5jLiAtIGZvciBhdXRob3JpemVkIHVzZSBv
# bmx5MTwwOgYDVQQDEzNFbnRydXN0IEV4dGVuZGVkIFZhbGlkYXRpb24gQ29kZSBT
# aWduaW5nIENBIC0gRVZDUzEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
# AQDCvTcBUALFjaAu6GYnHZUIy25XB1LW0LrF3euJF8ImXC9xK37LNqRREEd4nmoZ
# NOgdYyPieuOhKrZqae5SsMpnwyjY83cwTpCAZJm/6m9nZRIi25xuAw2oUGH4WMSd
# fTrwgSX/8yoS4WvlTZVFysFX9yAtx4EUgbqYLygPSULr/C9rwM298YzqPvw/sXx9
# d7y4YmgyA7Bj8irPXErEQl+bgis4/tlGm0xfY7c0rFT7mcQBI/vJCZTjO59K4oow
# 56ScK63Cb212E4I7GHJpewOYBUpLm9St3OjXvWjuY96yz/c841SAD/sjrLUyXE5A
# PfhMspUyThqkyEbw3weHuJrvAgMBAAGjggEhMIIBHTAOBgNVHQ8BAf8EBAMCAQYw
# EwYDVR0lBAwwCgYIKwYBBQUHAwMwEgYDVR0TAQH/BAgwBgEB/wIBADAzBggrBgEF
# BQcBAQQnMCUwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLmVudHJ1c3QubmV0MDAG
# A1UdHwQpMCcwJaAjoCGGH2h0dHA6Ly9jcmwuZW50cnVzdC5uZXQvZzJjYS5jcmww
# OwYDVR0gBDQwMjAwBgRVHSAAMCgwJgYIKwYBBQUHAgEWGmh0dHA6Ly93d3cuZW50
# cnVzdC5uZXQvcnBhMB0GA1UdDgQWBBQqCm8yLCkgIXZqsayMPK+Tjg5rojAfBgNV
# HSMEGDAWgBRqciZ60B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEA
# KdkNr2dFXRsJb63MiBD1qi4mF+2Ih6zA+B1TuRAPZTIzazJPXdYdD3h8CVS1WhKH
# X6Q2SwdH0Gdsoipgwl0I3SNgPXkqoBX09XVdIVfA8nFDB6k+YMUZA/l8ub6ARctY
# xthqVO7Or7jUjpA5E3EEXbj8h9UMLM5w7wUcdBAteXZKeFU7SOPId1AdefnWSD/n
# bqvfvZLnJyfAWLO+Q5VvpPzZNgBa+8mM9DieRiaIvILQX30SeuWbL9TEU+XBKdyQ
# +P/h8jqHo+/edtNuajulxlIwHmOrwAlA8cnC8sw41jqy2hVo/IyXdSpYCSziidmE
# CU2X7RYuZTGuuPUtJcF5dDCCBY0wggR1oAMCAQICEHBxdTqSJ2A9AAAAAFVlpdkw
# DQYJKoZIhvcNAQELBQAwgcgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0
# LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1z
# MTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6
# ZWQgdXNlIG9ubHkxPDA6BgNVBAMTM0VudHJ1c3QgRXh0ZW5kZWQgVmFsaWRhdGlv
# biBDb2RlIFNpZ25pbmcgQ0EgLSBFVkNTMTAeFw0xOTEwMTYxOTE5MzhaFw0yMDEy
# MTIxOTQ5MjhaMIHYMQswCQYDVQQGEwJVUzEOMAwGA1UECBMFVGV4YXMxEzARBgNV
# BAcTClJvdW5kIFJvY2sxEzARBgsrBgEEAYI3PAIBAxMCVVMxGTAXBgsrBgEEAYI3
# PAIBAhMIRGVsYXdhcmUxETAPBgNVBAoTCERlbGwgSW5jMR0wGwYDVQQPExRQcml2
# YXRlIE9yZ2FuaXphdGlvbjEdMBsGA1UECxMUQ2xpZW50IFByb2R1Y3QgR3JvdXAx
# EDAOBgNVBAUTBzIxNDE1NDExETAPBgNVBAMTCERlbGwgSW5jMIIBIjANBgkqhkiG
# 9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxzH4/Uk7SrrIRybkbZYYU8fiPfIL3ekXg2cQ
# mVhptYD7QNfVbte+R+e8owQqoiBlgkauoRIU3V2aK7FJCgXok0Fl09xMFNmB23Mc
# Hlrsjm6NdjtiocVpd+P8yMjuJt9R5SUrRWr3HWlLyDnK0YiURCTpHOaN6/bb55wT
# eiJItYOgwDblltVN38b1iNN+rrae81ZaA06ofx998NF4Ofoq5NGc3pC3Wk0wCksS
# QpA+koBuuoRrvJkxKDQfGoBmJxexQhziRnDll6DxyQ550fsxmsVcY4LTvgt7pMUF
# xQ4JXAL9QTWLihzgUaW/WIesCmS8dezRP2X5uCL5t9d3w6ERKwIDAQABo4IBXzCC
# AVswDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMGoGCCsGAQUF
# BwEBBF4wXDAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZW50cnVzdC5uZXQwNQYI
# KwYBBQUHMAKGKWh0dHA6Ly9haWEuZW50cnVzdC5uZXQvZXZjczEtY2hhaW4yNTYu
# Y2VyMDEGA1UdHwQqMCgwJqAkoCKGIGh0dHA6Ly9jcmwuZW50cnVzdC5uZXQvZXZj
# czEuY3JsMEoGA1UdIARDMEEwNgYKYIZIAYb6bAoBAjAoMCYGCCsGAQUFBwIBFhpo
# dHRwOi8vd3d3LmVudHJ1c3QubmV0L3JwYTAHBgVngQwBAzAfBgNVHSMEGDAWgBQq
# Cm8yLCkgIXZqsayMPK+Tjg5rojAdBgNVHQ4EFgQU7+AIvIOh/qMSwsaU6b8HBj+6
# NVYwCQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEAPNM/JRouTEuEpxSM/Ihu
# YSFwcj3NmlA2T/9VDre41akRDaAmWEHK19EWN3wb4MPFK1I0f/NjDL+jiX2UZNZj
# A69NCmw7FCaKBPmuVZihPvb4BF1jVuDNQj5GWj5nW3wgIPzduSe6aLzIBO4xsKKb
# Cw0lOtRLzF/UEdqbMx11ns4BMAZeADsT5oKBTjQdJ26njRKZmJA4uc8F649mFqkA
# x0x6PM0alM/+O4xCJ3wXay63Jurr7CiTFXytE+K9jzfPZ6iI2elmx1Eoj4QkcCwX
# ho9KDdn4psSO6kznVjezKdUZU7yEbs4273R0Vr7bWgEqMOfMS7oUpaxJ7OKheVEE
# rjGCEMgwghDEAgEBMIHdMIHIMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNRW50cnVz
# dCwgSW5jLjEoMCYGA1UECxMfU2VlIHd3dy5lbnRydXN0Lm5ldC9sZWdhbC10ZXJt
# czE5MDcGA1UECxMwKGMpIDIwMTUgRW50cnVzdCwgSW5jLiAtIGZvciBhdXRob3Jp
# emVkIHVzZSBvbmx5MTwwOgYDVQQDEzNFbnRydXN0IEV4dGVuZGVkIFZhbGlkYXRp
# b24gQ29kZSBTaWduaW5nIENBIC0gRVZDUzECEHBxdTqSJ2A9AAAAAFVlpdkwDQYJ
# YIZIAWUDBAIBBQCgfDAQBgorBgEEAYI3AgEMMQIwADAZBgkqhkiG9w0BCQMxDAYK
# KwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG
# 9w0BCQQxIgQgEr6gnccbSlBOuVcTNKafc+/sFfHGft5xqggxZNsEQaQwDQYJKoZI
# hvcNAQEBBQAEggEAVrw1AP+ZQWTaGAiJ53aAC47tmAwZRM4x/ufiv+lJ2S8zG3jO
# EBCGHfqR+x1xyz3En+CbvDH90J81yrouMvs5ydkAo/Asg1UYCg95ljiBxUYBbAvB
# 20qbSp22qO1xJg+TMBAjDGTu4W2OWD70HV+XsYW58n5h11p+LXJE6vn8KA5/Hx7v
# /R/S880UquSoRbAyIrBNS9v2CcnwQw+Vo76FPXlNwWMXk3CcscKIs/b5CxNMNBp/
# HQLco8KWyG/kYwZGfnA09OpP9Jn5yOTtUK+Og5AIeluL1ONUhuMGnoCjTbp9uNaJ
# 3U9ROuzgv+8IR0TThn0mUFxkdckqZGvPwYPqYqGCDj0wgg45BgorBgEEAYI3AwMB
# MYIOKTCCDiUGCSqGSIb3DQEHAqCCDhYwgg4SAgEDMQ0wCwYJYIZIAWUDBAIBMIIB
# DwYLKoZIhvcNAQkQAQSggf8EgfwwgfkCAQEGC2CGSAGG+EUBBxcDMDEwDQYJYIZI
# AWUDBAIBBQAEIOxIP0Bfl5sTSQH8EPHR6UiAho27H7iaCapOu4bGfo7TAhUAmKkV
# GPsWYzDtZHQNh0Qi6ax7cM8YDzIwMjAwMzIwMTAwODQ3WjADAgEeoIGGpIGDMIGA
# MQswCQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAd
# BgNVBAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxMTAvBgNVBAMTKFN5bWFudGVj
# IFNIQTI1NiBUaW1lU3RhbXBpbmcgU2lnbmVyIC0gRzOgggqLMIIFODCCBCCgAwIB
# AgIQewWx1EloUUT3yYnSnBmdEjANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UEBhMC
# VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
# cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAt
# IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2
# ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNjAxMTIwMDAw
# MDBaFw0zMTAxMTEyMzU5NTlaMHcxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRTeW1h
# bnRlYyBDb3Jwb3JhdGlvbjEfMB0GA1UECxMWU3ltYW50ZWMgVHJ1c3QgTmV0d29y
# azEoMCYGA1UEAxMfU3ltYW50ZWMgU0hBMjU2IFRpbWVTdGFtcGluZyBDQTCCASIw
# DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALtZnVlVT52Mcl0agaLrVfOwAa08
# cawyjwVrhponADKXak3JZBRLKbvC2Sm5Luxjs+HPPwtWkPhiG37rpgfi3n9ebUA4
# 1JEG50F8eRzLy60bv9iVkfPw7mz4rZY5Ln/BJ7h4OcWEpe3tr4eOzo3HberSmLU6
# Hx45ncP0mqj0hOHE0XxxxgYptD/kgw0mw3sIPk35CrczSf/KO9T1sptL4YiZGvXA
# 6TMU1t/HgNuR7v68kldyd/TNqMz+CfWTN76ViGrF3PSxS9TO6AmRX7WEeTWKeKwZ
# Mo8jwTJBG1kOqT6xzPnWK++32OTVHW0ROpL2k8mc40juu1MO1DaXhnjFoTcCAwEA
# AaOCAXcwggFzMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMGYG
# A1UdIARfMF0wWwYLYIZIAYb4RQEHFwMwTDAjBggrBgEFBQcCARYXaHR0cHM6Ly9k
# LnN5bWNiLmNvbS9jcHMwJQYIKwYBBQUHAgIwGRoXaHR0cHM6Ly9kLnN5bWNiLmNv
# bS9ycGEwLgYIKwYBBQUHAQEEIjAgMB4GCCsGAQUFBzABhhJodHRwOi8vcy5zeW1j
# ZC5jb20wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL3Muc3ltY2IuY29tL3VuaXZl
# cnNhbC1yb290LmNybDATBgNVHSUEDDAKBggrBgEFBQcDCDAoBgNVHREEITAfpB0w
# GzEZMBcGA1UEAxMQVGltZVN0YW1wLTIwNDgtMzAdBgNVHQ4EFgQUr2PWyqNOhXLg
# p7xB8ymiOH+AdWIwHwYDVR0jBBgwFoAUtnf6aUhHn1MS1cLqBzJ2B9GXBxkwDQYJ
# KoZIhvcNAQELBQADggEBAHXqsC3VNBlcMkX+DuHUT6Z4wW/X6t3cT/OhyIGI96eP
# FeZAKa3mXfSi2VZkhHEwKt0eYRdmIFYGmBmNXXHy+Je8Cf0ckUfJ4uiNA/vMkC/W
# CmxOM+zWtJPITJBjSDlAIcTd1m6JmDy1mJfoqQa3CcmPU1dBkC/hHk1O3MoQeGxC
# bvC2xfhhXFL1TvZrjfdKer7zzf0D19n2A6gP41P3CnXsxnUuqmaFBJm3+AZX4cYO
# 9uiv2uybGB+queM6AL/OipTLAduexzi7D1Kr0eOUA2AKTaD+J20UMvw/l0Dhv5mJ
# 2+Q5FL3a5NPD6itas5VYVQR9x5rsIwONhSrS/66pYYEwggVLMIIEM6ADAgECAhB7
# 1OWvuswHP6EBIwQiQU0SMA0GCSqGSIb3DQEBCwUAMHcxCzAJBgNVBAYTAlVTMR0w
# GwYDVQQKExRTeW1hbnRlYyBDb3Jwb3JhdGlvbjEfMB0GA1UECxMWU3ltYW50ZWMg
# VHJ1c3QgTmV0d29yazEoMCYGA1UEAxMfU3ltYW50ZWMgU0hBMjU2IFRpbWVTdGFt
# cGluZyBDQTAeFw0xNzEyMjMwMDAwMDBaFw0yOTAzMjIyMzU5NTlaMIGAMQswCQYD
# VQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAdBgNVBAsT
# FlN5bWFudGVjIFRydXN0IE5ldHdvcmsxMTAvBgNVBAMTKFN5bWFudGVjIFNIQTI1
# NiBUaW1lU3RhbXBpbmcgU2lnbmVyIC0gRzMwggEiMA0GCSqGSIb3DQEBAQUAA4IB
# DwAwggEKAoIBAQCvDoqq+Ny/aXtUF3FHCb2NPIH4dBV3Z5Cc/d5OAp5LdvblNj5l
# 1SQgbTD53R2D6T8nSjNObRaK5I1AjSKqvqcLG9IHtjy1GiQo+BtyUT3ICYgmCDr5
# +kMjdUdwDLNfW48IHXJIV2VNrwI8QPf03TI4kz/lLKbzWSPLgN4TTfkQyaoKGGxV
# YVfR8QIsxLWr8mwj0p8NDxlsrYViaf1OhcGKUjGrW9jJdFLjV2wiv1V/b8oGqz9K
# tyJ2ZezsNvKWlYEmLP27mKoBONOvJUCbCVPwKVeFWF7qhUhBIYfl3rTTJrJ7QFNY
# eY5SMQZNlANFxM48A+y3API6IsW0b+XvsIqbAgMBAAGjggHHMIIBwzAMBgNVHRMB
# Af8EAjAAMGYGA1UdIARfMF0wWwYLYIZIAYb4RQEHFwMwTDAjBggrBgEFBQcCARYX
# aHR0cHM6Ly9kLnN5bWNiLmNvbS9jcHMwJQYIKwYBBQUHAgIwGRoXaHR0cHM6Ly9k
# LnN5bWNiLmNvbS9ycGEwQAYDVR0fBDkwNzA1oDOgMYYvaHR0cDovL3RzLWNybC53
# cy5zeW1hbnRlYy5jb20vc2hhMjU2LXRzcy1jYS5jcmwwFgYDVR0lAQH/BAwwCgYI
# KwYBBQUHAwgwDgYDVR0PAQH/BAQDAgeAMHcGCCsGAQUFBwEBBGswaTAqBggrBgEF
# BQcwAYYeaHR0cDovL3RzLW9jc3Aud3Muc3ltYW50ZWMuY29tMDsGCCsGAQUFBzAC
# hi9odHRwOi8vdHMtYWlhLndzLnN5bWFudGVjLmNvbS9zaGEyNTYtdHNzLWNhLmNl
# cjAoBgNVHREEITAfpB0wGzEZMBcGA1UEAxMQVGltZVN0YW1wLTIwNDgtNjAdBgNV
# HQ4EFgQUpRMBqZ+FzBtuFh5fOzGqeTYAex0wHwYDVR0jBBgwFoAUr2PWyqNOhXLg
# p7xB8ymiOH+AdWIwDQYJKoZIhvcNAQELBQADggEBAEaer/C4ol+imUjPqCdLIc2y
# uaZycGMv41UpezlGTud+ZQZYi7xXipINCNgQujYk+gp7+zvTYr9KlBXmgtuKVG3/
# KP5nz3E/5jMJ2aJZEPQeSv5lzN7Ua+NSKXUASiulzMub6KlN97QXWZJBw7c/hub2
# wH9EPEZcF1rjpDvVaSbVIX3hgGd+Yqy3Ti4VmuWcI69bEepxqUH5DXk4qaENz7Sx
# 2j6aescixXTN30cJhsT8kSWyG5bphQjo3ep0YG5gpVZ6DchEWNzm+UgUnuW/3gC9
# d7GYFHIUJN/HESwfAD/DSxTGZxzMHgajkF9cVIs+4zNbgg/Ft4YCTnGf6WZFP3Yx
# ggJaMIICVgIBATCBizB3MQswCQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMg
# Q29ycG9yYXRpb24xHzAdBgNVBAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxKDAm
# BgNVBAMTH1N5bWFudGVjIFNIQTI1NiBUaW1lU3RhbXBpbmcgQ0ECEHvU5a+6zAc/
# oQEjBCJBTRIwCwYJYIZIAWUDBAIBoIGkMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0B
# CRABBDAcBgkqhkiG9w0BCQUxDxcNMjAwMzIwMTAwODQ3WjAvBgkqhkiG9w0BCQQx
# IgQgFPw8yZJFFKrokh2brmdYJYmNSWLxIzJSG8E+cx9KlMEwNwYLKoZIhvcNAQkQ
# Ai8xKDAmMCQwIgQgxHTOdgB9AjlODaXk3nwUxoD54oIBPP72U+9dtx/fYfgwCwYJ
# KoZIhvcNAQEBBIIBAF84r5bvMoFktW5voUWNCEhL3YZGWfzL8o2JnAbb+lJcKaNi
# ZBcr86VSbFsn7fROBckPBljeg9NMWGuBldjF2FIkukcWbyHp1WRsIGDHiqLDDgF0
# R5N7LLlZ26OvKPqxK+ogfpQu2Vwo3gjH+I5ep7y/lcrt4H0jUWY9h/9llTmqj0/B
# R6n5F0N2f4U2u/87l94ja6nRNZtrS8ntEIcjGraStbzrss7xixbbAIZY+zBm2bDU
# EU6cKnYq6wxKGVHHONn0dDCacjZkBad+pRd6Ud/TM7nu7Bx5wKb0fvXdqAPd9bq/
# vwtqBFBpyeokuQ5qQYk6B4h9YgUoUCl9kb66onc=
# SIG # End signature block