Skip to content

Instantly share code, notes, and snippets.

@derekschauland
Last active August 24, 2016 17:32
Show Gist options
  • Save derekschauland/ddd618525c716c92486f456ee2aaad8e to your computer and use it in GitHub Desktop.
Save derekschauland/ddd618525c716c92486f456ee2aaad8e to your computer and use it in GitHub Desktop.
Script to install chocolatey packages using choco or PowerShell. The next two files are ouputs of verbose runs of the script output-posh.txt does not use choco.exe and output-choco.txt does.
# .ExternalHelp configure-vm.ps1-help.xml
[cmdletbinding()]
param (
[Parameter(Valuefrompipeline = $true)]
[string[]]$packages,
[Parameter(Mandatory = $true)]
[switch]$choco,
[switch]$test
)
begin
{
$steve = $false
$usegui = $false
$computer = $env:COMPUTERNAME
if (Test-Path "c:\logs")
{
#continue;
}
else
{
mkdir "c:\logs" | out-null
}
$logdir = "c:\logs"
$logname = "choco_vm_config_$(get-date -format "yyyy-MM-dd HH_mm_ss")_log.log"
$logpath = $logdir + "\" + $logname
function line-num
{
([string]$MyInvocation.ScriptLineNumber).PadLeft(4, '0')
}
if (Get-Module -Name pslogging)
{
start-log -logpath $logdir -logname $logname -scriptversion "0.0.1" | out-null
}
else
{
install-module pslogging -force -confirm:$false
start-log -logpath $logdir -logname $logname -scriptversion "0.0.1" | out-null
}
$myWindowsID = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$myWindowsPrincipal = new-object System.Security.Principal.WindowsPrincipal($myWindowsID)
$adminRole = [System.Security.Principal.WindowsBuiltInRole]::Administrator
if ($myWindowsPrincipal.IsInRole($adminRole))
{
}
else
{
Write-Host "`nScript Cannot Execute!`n"
Write-Host "========================================================="
Write-Host "Please run this script in an elevated PowerShell session."
Write-Host "========================================================="
write-logwarning -logpath $logpath -message "[$(Get-Date -format "yyyy-MM-dd hh:mm:ss")] Cannot execute script - Powershell is not elevated!"
write-logwarning -logpath $logpath -message "[$(Get-Date -format "yyyy-MM-dd hh:mm:ss")] Please run PowerShell as an Administrator then re-run the script!"
if ($usegui)
{
$elevatedno = @"
Script cannot execute!
=========================================================
Please run this script in an elevated PowerShell session.
=========================================================
"@
}
stop-log -logpath $logpath
}
#$haschoco
if ((Test-Path "c:\ProgramData\chocolatey\choco.exe") -or (get-packagesource -name chocolatey -erroraction silentlycontinue))
{
#choco is already installed
Write-verbose "[Line: $(line-num)] Chocolatey Already Installed - Moving on!"
write-loginfo -logpath $logpath -message "[$(Get-Date -format "yyyy-MM-dd hh:mm:ss")] [Environment] [Line: $(line-num)] Chocolatey Already Installed!"
write-loginfo -logpath $logpath -message "[$(Get-Date -format "yyyy-MM-dd hh:mm:ss")] [Environment] [Line: $(line-num)] Chocolatey Powershell Modules installed!"
if ($usegui)
{
$guitext = @"
[Line: $(line-num)] Chocolatey Already Installed
"@
}
}
else
{
Write-verbose "[Line: $(line-num)] Up next I'll get Chocolatey setup to get this going - it will install chocolatey. Once done, run this again and we will proceed."
write-loginfo -logpath $logpath -message "[$(Get-Date -format "yyyy-MM-dd hh:mm:ss")] [Environment] [Line: $(line-num)] Installing Chocolatey"
if ($usegui)
{
$guitext = @"
[Line: $(line-num)][$(Get-Date -Format "yyyy-MM-dd hh:mm:ss")] Installing $app
"@
}
Invoke-WebRequest https://chocolatey.org/install.ps1 -UseBasicParsing | Invoke-Expression -continue
get-packageprovider chocolatey
Write-verbose "[Line: $(line-num)] Chocolately install completed - check just in case"
write-loginfo -logpath $logpath -message "[$(Get-Date -format "yyyy-MM-dd hh:mm:ss")] [Environemnt Configuration] [Line: $(line-num)] Chocolatey Install Completed - retest existence of Chocolatey"
$nowhaschoco = choco
if ($nowhaschoco -like "Chocolatey*")
{
Write-verbose "[Line: $(line-num)] Success!! $nowhaschoco installed!"
write-loginfo -logpath $logpath -message "[$(Get-Date -format "yyyy-MM-dd hh:mm:ss")] [Environment] [Line: $(line-num)] $nowhaschoco installed Successfully!"
}
}
#
##$appsloaded = find-install
##find list of things to load and pass them in for install
#$packages
}
process
{
if ($choco)
{
Write-verbose "Chocolatey (choco.exe) will install following applications:"
#Write-Host "Chocolatey (choco.exe) will install the following applications:"
if ($packages -like "*.txt")
{
$appsin = Get-Content $packages
}
else
{
$appsin = $packages
}
$appshere = choco list -localonly
$notmatched = $appsin | where { $_ -notmatch $appshere }
Write-Verbose "The apps here were not matched $notmatched"
for ($i = 1; $i -le $notmatched.count; $i++)
{
foreach ($app in $notmatched)
{
#Write-Progress -Activity "[Working on $app Install:]" -Status "Working - Please do not close this Window:" -PercentComplete ($i/$notmatched.count * 100)
Write-verbose "[Application] $app"
Write-host "$app"
$installlog = "c:\logs\$app-install-log.log"
write-loginfo -logpath $logpath -message "[$(Get-Date -format "yyyy-MM-dd hh:mm:ss")] [Choco] [Line: $(line-num)] $app Installing - see details when completed: $installlog"
#choco install $app -y -r
$install = choco install $app -y -r
start-log -logpath "c:\logs" -logname "$app-install-log.log" -scriptversion 0.0.1 | out-null
write-loginfo -logpath $installlog -message "$install"
stop-log -logpath $installlog -noexit
Write-verbose "$app install completed - details in $installlog"
write-loginfo -logpath $logpath -message "[$(Get-Date -format "yyyy-MM-dd hh:mm:ss")] [Choco] [Line: $(line-num)] $app installed"
}
Start-Sleep 1
}
$matched = $appsin | where { $_ -match $appshere }
foreach ($item in $matched)
{
Write-Verbose "$item not installed - skipped"
write-loginfo -logpath $logpath -message "[$(Get-Date -Format "yyyy-MM-dd hh:mm:ss")] [Choco] [Line: $(line-num)] $item skipped"
}
}
elseif ($steve = $true)
{
Write-verbose "[Line: $(line-num)] Powershell will install the following applications:"
write-loginfo -logpath $logpath -message "[$(Get-Date -format "yyyy-MM-dd hh:mm:ss")] [Powershell] [Line: $(line-num)] Installing Applications:"
if ($test)
{
$packages = "sysinternals"
}
if ((Test-Path $packages -ErrorAction SilentlyContinue) -and ($packages -eq $null))
{
Write-Verbose "[Line: $(line-num)] Bad Path to file - please enter valid path or a value for applications"
write-logerror -logpath $logpath -message "[$(Get-Date -format "yyyy-MM-dd hh:mm:ss")] [Line: $(line-num)] The path to the file $packages is not correct - please use a valid path or applications is null"
break;
}
#elseif((Test-Path $packages -ErrorAction SilentlyContinue) -or ($packages -eq $null)){
#}
else
{
Write-Verbose "[Line: $(line-num)] Path or variable is valid - moving on!"
write-loginfo -logpath $logpath -message "[$(Get-Date -format "yyyy-MM-dd hh:mm:ss")] [PowerShell] [Line: $(line-num)] Path to file or variable $packages is all set - moving on"
#break;
}
if ($packages -like "*.csv")
{
Write-Host "Currently CSV files are not supported - try txt - coming soon!"
write-loginfo -logpath $logpath -message "[$(Get-Date -format "yyyy-MM-dd hh:mm:ss")] [PowerShell] [Line: $(line-num)] User attempted to use a CSV file - not supported"
#$apps = Import-Csv $packages
#$apps
break;
}
elseif ($packages -like "*.txt")
{
$apps = Get-Content $packages
}
else
{
$apps = $packages
}
if ($test)
{
#$apps = "sysinternals"
foreach ($app in $apps)
{
Write-Verbose "$app"
write-loginfo -logpath $logpath -message "[$(Get-Date -format "yyyy-MM-dd hh:mm:ss")] [Powershell] [Line: $(line-num)] Wiii install $app"
$apptoload = get-package $app -erroraction silentlycontinue
if (!$apptoload)
{
install-package $app -force | out-null
write-loginfo -logpath $logpath -message "[$(Get-Date -format "yyyy-MM-dd hh:mm:ss")] [PowerShell] [Line: $(line-num)] Installed $app"
}
else
{
write-loginfo -logpath $logpath -message "[$(Get-Date -format "yyyy-MM-dd hh:mm:ss")] [PowerShell] [Line: $(line-num)] Package $app already installed!"
}
}
if (get-package $app -erroraction silentlycontinue)
{
Write-Verbose "[Line: $(line-num)] $app found - will remove"
write-loginfo -logpath $logpath -message "[$(Get-Date -format "yyyy-MM-dd hh:mm:ss")] [Powershell] [Line: $(line-num)] Installed $app and checked for installation - $app will be removed"
uninstall-package $app | out-null
write-loginfo -logpath $logpath -message "[$(Get-Date -format "yyyy-MM-dd hh:mm:ss")] [PowerShell] [Line: $(line-num)] $app removed successfully"
}
}
else
{
foreach ($app in $apps)
{
Write-Verbose "$app"
write-loginfo -logpath $logpath -message "[$(Get-Date -format "yyyy-MM-dd hh:mm:ss")] [Powershell] [Line: $(line-num)] Will Install $app"
$apptoload = get-package $app -erroraction silentlycontinue
write-loginfo -logpath $logpath -message "[$(Get-Date -format "yyyy-MM-dd hh:mm:ss")] [PowerShell] [Line: $(line-num)] The apptoload variable has value: $apptoload"
write-loginfo -logpath $logpath -message "[$(Get-Date -format "yyyy-MM-dd hh:mm:ss")] [PowerShell] [Line: $(line-num)] The app variable has value: $app"
if (!$apptoload)
{
write-loginfo -logpath $logpath -message "[$(Get-Date -format "yyyy-MM-dd hh:mm:ss")] [Powershell] [Line: $(line-num)] $app not found - Installing "
install-package $app -force
write-loginfo -logpath $logpath -message "[$(Get-Date -format "yyyy-MM-dd hh:mm:ss")] [PowerShell] [Line: $(line-num)] Installed $app"
}
else
{
write-loginfo -logpath $logpath -message "[$(Get-Date -format "yyyy-MM-dd hh:mm:ss")] [Line: $(line-num)] Package $app already installed - No Action taken!"
}
}
}
}
else
{
write-loginfo -logpath $logpath -message "[$(Get-Date -format "yyyy-MM-dd hh:mm:ss")] [Environment] [Line: $(line-num)] Chocolatey and the Choclatey Modules Configured"
Write-verbose "Script Run completed - Chocolatey is all set"
}
}
end
{
Write-Verbose "[Line: $(line-num)] Processing completed!"
write-loginfo -logpath $logpath -message "[$(Get-Date -format "yyyy-MM-dd hh:mm:ss")] [Environmrnt Configuration] [Line: $(line-num)] Execution of Chocolatey install for Applications completed!"
$WMI_OS = Get-WmiObject -Class Win32_OperatingSystem -Property BuildNumber, CSName -ComputerName $Computer -Authentication PacketPrivacy -Impersonation Impersonate
$RegCon = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]"LocalMachine", $Computer)
If ($WMI_OS.BuildNumber -ge 6001)
{
$RegSubKeysCBS = $RegCon.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\").GetSubKeyNames()
$CBSRebootPend = $RegSubKeysCBS -contains "RebootPending"
$anykey = Read-Host "Please type 'restart' and press enter to restart this computer after application install"
}
# else
# {
# $CBSRebootPend = $false
# }
if (($CBSRebootPend -eq $true) -and $anykey -eq "restart")
{
#Restart-Computer
Write-Verbose "Please restart your computer - It has a pending restart."
Write-Verbose "You may need to re-run the script after restart."
}
}
# SIG # Begin signature block
# MIIcUAYJKoZIhvcNAQcCoIIcQTCCHD0CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU2AhDWFMBJ41yB5rmDzKVBtX6
# ccygghb0MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0B
# AQUFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD
# VQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVk
# IElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQsw
# CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
# ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg
# Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg
# +XESpa7cJpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lT
# XDGEKvYPmDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5
# a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g
# 0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1
# roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
# GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0G
# A1UdDgQWBBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLL
# gjEtUYunpyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3
# cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmr
# EthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+
# fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5Q
# Z7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu
# 838fYxAe+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw
# 8jCCBBQwggL8oAMCAQICCwQAAAAAAS9O4VLXMA0GCSqGSIb3DQEBBQUAMFcxCzAJ
# BgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdS
# b290IENBMRswGQYDVQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwHhcNMTEwNDEzMTAw
# MDAwWhcNMjgwMTI4MTIwMDAwWjBSMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xv
# YmFsU2lnbiBudi1zYTEoMCYGA1UEAxMfR2xvYmFsU2lnbiBUaW1lc3RhbXBpbmcg
# Q0EgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJTvZfi1V5+g
# Uw00BusJH7dHGGrL8Fvk/yelNNH3iRq/nrHNEkFuZtSBoIWLZFpGL5mgjXex4rxc
# 3SLXamfQu+jKdN6LTw2wUuWQW+tHDvHnn5wLkGU+F5YwRXJtOaEXNsq5oIwbTwgZ
# 9oExrWEWpGLmtECew/z7lfb7tS6VgZjg78Xr2AJZeHf3quNSa1CRKcX8982TZdJg
# YSLyBvsy3RZR+g79ijDwFwmnu/MErquQ52zfeqn078RiJ19vmW04dKoRi9rfxxRM
# 6YWy7MJ9SiaP51a6puDPklOAdPQD7GiyYLyEIACDG6HutHQFwSmOYtBHsfrwU8wY
# +S47+XB+tCUCAwEAAaOB5TCB4jAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgw
# BgEB/wIBADAdBgNVHQ4EFgQURtg+/9zjvv+D5vSFm7DdatYUqcEwRwYDVR0gBEAw
# PjA8BgRVHSAAMDQwMgYIKwYBBQUHAgEWJmh0dHBzOi8vd3d3Lmdsb2JhbHNpZ24u
# Y29tL3JlcG9zaXRvcnkvMDMGA1UdHwQsMCowKKAmoCSGImh0dHA6Ly9jcmwuZ2xv
# YmFsc2lnbi5uZXQvcm9vdC5jcmwwHwYDVR0jBBgwFoAUYHtmGkUNl8qJUC99BM00
# qP/8/UswDQYJKoZIhvcNAQEFBQADggEBAE5eVpAeRrTZSTHzuxc5KBvCFt39QdwJ
# BQSbb7KimtaZLkCZAFW16j+lIHbThjTUF8xVOseC7u+ourzYBp8VUN/NFntSOgLX
# GRr9r/B4XOBLxRjfOiQe2qy4qVgEAgcw27ASXv4xvvAESPTwcPg6XlaDzz37Dbz0
# xe2XnbnU26UnhOM4m4unNYZEIKQ7baRqC6GD/Sjr2u8o9syIXfsKOwCr4CHr4i81
# bA+ONEWX66L3mTM1fsuairtFTec/n8LZivplsm7HfmX/6JLhLDGi97AnNkiPJm87
# 7k12H3nD5X+WNbwtDswBsI5//1GAgKeS1LNERmSMh08WYwcxS2Ow3/MwggSfMIID
# h6ADAgECAhIRIdaZp2SXPvH4Qn7pGcxTQRQwDQYJKoZIhvcNAQEFBQAwUjELMAkG
# A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExKDAmBgNVBAMTH0ds
# b2JhbFNpZ24gVGltZXN0YW1waW5nIENBIC0gRzIwHhcNMTYwNTI0MDAwMDAwWhcN
# MjcwNjI0MDAwMDAwWjBgMQswCQYDVQQGEwJTRzEfMB0GA1UEChMWR01PIEdsb2Jh
# bFNpZ24gUHRlIEx0ZDEwMC4GA1UEAxMnR2xvYmFsU2lnbiBUU0EgZm9yIE1TIEF1
# dGhlbnRpY29kZSAtIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
# sBeuotO2BDBWHlgPse1VpNZUy9j2czrsXV6rJf02pfqEw2FAxUa1WVI7QqIuXxNi
# EKlb5nPWkiWxfSPjBrOHOg5D8NcAiVOiETFSKG5dQHI88gl3p0mSl9RskKB2p/24
# 3LOd8gdgLE9YmABr0xVU4Prd/4AsXximmP/Uq+yhRVmyLm9iXeDZGayLV5yoJivZ
# F6UQ0kcIGnAsM4t/aIAqtaFda92NAgIpA6p8N7u7KU49U5OzpvqP0liTFUy5LauA
# o6Ml+6/3CGSwekQPXBDXX2E3qk5r09JTJZ2Cc/os+XKwqRk5KlD6qdA8OsroW+/1
# X1H0+QrZlzXeaoXmIwRCrwIDAQABo4IBXzCCAVswDgYDVR0PAQH/BAQDAgeAMEwG
# A1UdIARFMEMwQQYJKwYBBAGgMgEeMDQwMgYIKwYBBQUHAgEWJmh0dHBzOi8vd3d3
# Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRvcnkvMAkGA1UdEwQCMAAwFgYDVR0lAQH/
# BAwwCgYIKwYBBQUHAwgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybC5nbG9i
# YWxzaWduLmNvbS9ncy9nc3RpbWVzdGFtcGluZ2cyLmNybDBUBggrBgEFBQcBAQRI
# MEYwRAYIKwYBBQUHMAKGOGh0dHA6Ly9zZWN1cmUuZ2xvYmFsc2lnbi5jb20vY2Fj
# ZXJ0L2dzdGltZXN0YW1waW5nZzIuY3J0MB0GA1UdDgQWBBTUooRKOFoYf7pPMFC9
# ndV6h9YJ9zAfBgNVHSMEGDAWgBRG2D7/3OO+/4Pm9IWbsN1q1hSpwTANBgkqhkiG
# 9w0BAQUFAAOCAQEAj6kakW0EpjcgDoOW3iPTa24fbt1kPWghIrX4RzZpjuGlRcck
# oiK3KQnMVFquxrzNY46zPVBI5bTMrs2SjZ4oixNKEaq9o+/Tsjb8tKFyv22XY3mM
# RLxwL37zvN2CU6sa9uv6HJe8tjecpBwwvKu8LUc235IgA+hxxlj2dQWaNPALWVqC
# RDSqgOQvhPZHXZbJtsrKnbemuuRQ09Q3uLogDtDTkipbxFm7oW3bPM5EncE4Kq3j
# jb3NCXcaEL5nCgI2ZIi5sxsm7ueeYMRGqLxhM2zPTrmcuWrwnzf+tT1PmtNN/94g
# jk6Xpv2fCbxNyhh2ybBNhVDygNIdBvVYBAexGDCCBTAwggQYoAMCAQICEAQJGBtf
# 1btmdVNDtW+VUAgwDQYJKoZIhvcNAQELBQAwZTELMAkGA1UEBhMCVVMxFTATBgNV
# BAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEkMCIG
# A1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBMB4XDTEzMTAyMjEyMDAw
# MFoXDTI4MTAyMjEyMDAwMFowcjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lD
# ZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTExMC8GA1UEAxMoRGln
# aUNlcnQgU0hBMiBBc3N1cmVkIElEIENvZGUgU2lnbmluZyBDQTCCASIwDQYJKoZI
# hvcNAQEBBQADggEPADCCAQoCggEBAPjTsxx/DhGvZ3cH0wsxSRnP0PtFmbE620T1
# f+Wondsy13Hqdp0FLreP+pJDwKX5idQ3Gde2qvCchqXYJawOeSg6funRZ9PG+ykn
# x9N7I5TkkSOWkHeC+aGEI2YSVDNQdLEoJrskacLCUvIUZ4qJRdQtoaPpiCwgla4c
# SocI3wz14k1gGL6qxLKucDFmM3E+rHCiq85/6XzLkqHlOzEcz+ryCuRXu0q16XTm
# K/5sy350OTYNkO/ktU6kqepqCquE86xnTrXE94zRICUj6whkPlKWwfIPEvTFjg/B
# ougsUfdzvL2FsWKDc0GCB+Q4i2pzINAPZHM8np+mM6n9Gd8lk9ECAwEAAaOCAc0w
# ggHJMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQM
# MAoGCCsGAQUFBwMDMHkGCCsGAQUFBwEBBG0wazAkBggrBgEFBQcwAYYYaHR0cDov
# L29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRwOi8vY2FjZXJ0cy5k
# aWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3J0MIGBBgNVHR8E
# ejB4MDqgOKA2hjRodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1
# cmVkSURSb290Q0EuY3JsMDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5jb20v
# RGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsME8GA1UdIARIMEYwOAYKYIZIAYb9
# bAACBDAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BT
# MAoGCGCGSAGG/WwDMB0GA1UdDgQWBBRaxLl7KgqjpepxA8Bg+S32ZXUOWDAfBgNV
# HSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkqhkiG9w0BAQsFAAOCAQEA
# PuwNWiSz8yLRFcgsfCUpdqgdXRwtOhrE7zBh134LYP3DPQ/Er4v97yrfIFU3sOH2
# 0ZJ1D1G0bqWOWuJeJIFOEKTuP3GOYw4TS63XX0R58zYUBor3nEZOXP+QsRsHDpEV
# +7qvtVHCjSSuJMbHJyqhKSgaOnEoAjwukaPAJRHinBRHoXpoaK+bp1wgXNlxsQyP
# u6j4xRJon89Ay0BEpRPw5mQMJQhCMrI2iiQC/i9yfhzXSUWW6Fkd6fp0ZGuy62ZD
# 2rOwjNXpDd32ASDOmTFjPQgaGLOBm0/GkxAG/AeB+ova+YJJ92JuoVP6EpQYhS6S
# kepobEQysmah5xikmmRR7zCCBUYwggQuoAMCAQICEA9+wa2FUoqh8czdonhpeA4w
# DQYJKoZIhvcNAQELBQAwcjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0
# IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTExMC8GA1UEAxMoRGlnaUNl
# cnQgU0hBMiBBc3N1cmVkIElEIENvZGUgU2lnbmluZyBDQTAeFw0xNjA3MjYwMDAw
# MDBaFw0xNzA3MzExMjAwMDBaMIGCMQswCQYDVQQGEwJVUzESMBAGA1UECBMJV2lz
# Y29uc2luMRMwEQYDVQQHEwpHcmVlbnZpbGxlMSQwIgYDVQQKExtEZXJlayBDaHJp
# c3RvcGhlciBTY2hhdWxhbmQxJDAiBgNVBAMTG0RlcmVrIENocmlzdG9waGVyIFNj
# aGF1bGFuZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALwtaTYLrleW
# /bfL3r7H5VwMYWdYY5zj2i9G+7my62h+pgug8MUuyUXLBc5lyvoUUIxuHpTULq9t
# /R+XFpcF1brBGorrk1zBfIQD+y3s4Bhx1OzFO+AKrad+GvkA+2aUlxFdIp5VAI+z
# v/yFjxnvRkMTow7hgcdCfFsbbRyx0irK2V9kd5x2tOee1mpjTS5CUDi3+ohpB51j
# ExfG6CI8eAks6JIAITH5zQgXWiwaZb/7EnwGZNGQQTsev/ih/8MQV+pkexqEmZGo
# AhXBR43wKYqbhQ7BgeqTQoVvQqk6haZVgrpkYSuVPSASnNxQCskiS5547NDWxG6C
# MvAOBJj+8g0CAwEAAaOCAcUwggHBMB8GA1UdIwQYMBaAFFrEuXsqCqOl6nEDwGD5
# LfZldQ5YMB0GA1UdDgQWBBRhisRcarYm7six78jxP3gJ2ZN4azAOBgNVHQ8BAf8E
# BAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwdwYDVR0fBHAwbjA1oDOgMYYvaHR0
# cDovL2NybDMuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJlZC1jcy1nMS5jcmwwNaAz
# oDGGL2h0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9zaGEyLWFzc3VyZWQtY3MtZzEu
# Y3JsMEwGA1UdIARFMEMwNwYJYIZIAYb9bAMBMCowKAYIKwYBBQUHAgEWHGh0dHBz
# Oi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCAYGZ4EMAQQBMIGEBggrBgEFBQcBAQR4
# MHYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBOBggrBgEF
# BQcwAoZCaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0U0hBMkFz
# c3VyZWRJRENvZGVTaWduaW5nQ0EuY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcN
# AQELBQADggEBAF/7h2gCcY4wPNgwA50fMf3v0btNZQ8ujdCphui4tPQxiNhfjRvf
# nvkCsYI3U97HpfsIwHpDXaaJUS/viUVZ28VL6y+v9+9h4JbUTWLbqqJG7efO7kSe
# iBybagiPHG87Zi7K/ORKxbjGs1p2PoMmO9NMDnfCFT7F9yKEvCyQ0zlpt5FWU7uN
# glP88RV9/lYu3CNIKTXOZDEniXgEcYTIvJREkHPm5249vSniAT9YYB37GctIdWSI
# CQpvIwBW7Wm55fofC7WshsEIDLkj2n6vXhvv67WSy2jEaQy9H+FUPGpTCpoCbwpe
# mxKC1Foquh1uPwGXf3SOqf1eO4ZZwFno82gxggTGMIIEwgIBATCBhjByMQswCQYD
# VQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGln
# aWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFzc3VyZWQgSUQgQ29k
# ZSBTaWduaW5nIENBAhAPfsGthVKKofHM3aJ4aXgOMAkGBSsOAwIaBQCgcDAQBgor
# BgEEAYI3AgEMMQIwADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEE
# AYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUGuQXRyICnUZb
# 55RWVokG1AXjs5EwDQYJKoZIhvcNAQEBBQAEggEAfe1xKp7zfuNKQ5OjSUKUDhG7
# xi9rG94d6UMTN/MFdkYSEcmBVxPXnY9yiAkSCjaBpRUEJ4Y9KEp37XPDm4THTmcd
# s9w3Vqwa0eGTxx4kkk1dI+pfaIscBJUzaHbOAy22QlbNd5aJi9yECy6J9Ilm/nl1
# jvxMguwcug4TsNo9/vB24kbZjKqoksetx9W1gKOSQP45z+LAy7y2kZ4dnWgsPd1b
# ccK+of90khKUiCJ84Ggre98PsuGD3W6Mtz/ajDGCHqSK6sjaNt+jQCYfdI03Sl3w
# o0uIcJwQreMLxFp9y2dHN6JOph5WxQsAUhO9azS78eHffL/1KJ9NKCVZeGHaB6GC
# AqIwggKeBgkqhkiG9w0BCQYxggKPMIICiwIBATBoMFIxCzAJBgNVBAYTAkJFMRkw
# FwYDVQQKExBHbG9iYWxTaWduIG52LXNhMSgwJgYDVQQDEx9HbG9iYWxTaWduIFRp
# bWVzdGFtcGluZyBDQSAtIEcyAhIRIdaZp2SXPvH4Qn7pGcxTQRQwCQYFKw4DAhoF
# AKCB/TAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0x
# NjA3MjYyMjM4NThaMCMGCSqGSIb3DQEJBDEWBBQp9HCn4RrxMxBCu2j1Z2W6sinq
# kzCBnQYLKoZIhvcNAQkQAgwxgY0wgYowgYcwgYQEFGO4L6th9YOQlpUFCwAknFAp
# M+x5MGwwVqRUMFIxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52
# LXNhMSgwJgYDVQQDEx9HbG9iYWxTaWduIFRpbWVzdGFtcGluZyBDQSAtIEcyAhIR
# IdaZp2SXPvH4Qn7pGcxTQRQwDQYJKoZIhvcNAQEBBQAEggEAaan7RGLWPgdCYCte
# Zqv20MO6gO67jCha/gmgWUoqE2kfHQrLpxTl5U9HJXOc2eIUzz0E2coLV7aLRYxW
# y/8aScluPuHVu3eq0RMiBWZkVPStkVUQbd3y0JY2byobPoxnJzGXiiG3w5wqd3Qe
# /9bK7U5+oRh8sskdPbLKTcZKtvMyc2i9DrTd1sQQYpuyW00tdWLa6T0MpcLT/yWB
# 2mHi5bUT7FABjMWFCKUEHlo+gsqfShP78aGAmeypkNq1nLL+t1RyBJ88BYfhZumi
# qkWtNitORh6jBPqyrB6pxXYmPKWeKmg4PFXxOKcvN9kpleKP2ZlXId4iyJfYGc+6
# bqrYZQ==
# SIG # End signature block
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment