7-ZipSetupManager.psm1

<#
    ===========================================================================
     Created with: SAPIEN Technologies, Inc., PowerShell Studio 2023 v5.8.219
     Created on: 26.3.2023. 00:58
     Created by: chxus
     Organization: CHXOFT
     Filename: 7-ZipSetupManager.psm1
    -------------------------------------------------------------------------
     Module Name: 7-ZipSetupManager
    ===========================================================================
#>


<#
    .EXTERNALHELP 7-ZipSetupManager.psm1-Help.xml
#>

function Get-7ZipDownloadLink
{
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory = $false,
                   Position = 1,
                   HelpMessage = 'Get 32bit installer.')]
        [switch]$x86,
        [Parameter(Mandatory = $false,
                   Position = 2)]
        [switch]$GetFileNameOnly
    )
    $7zipDownloadWebpage = (Invoke-WebRequest https://7-zip.org/download.html).AllElements
    if (-not ($x86))
    {
        $setup = $7zipDownloadWebpage.href -like "*7z*-x64.exe"
        if ($setup.Count -gt 1)
        {
            $setup = $setup.Split([Environment]::NewLine) | Select-Object -First 1
        }
    }
    else
    {
        $setup = $7zipDownloadWebpage.href -like "*7z*.exe" -cnotlike "*x64*"
        if ($setup.Count -gt 1)
        {
            $setup = $setup.Split([Environment]::NewLine) | Select-Object -First 1
        }
    }
    $name = $setup.Split('/')
    $name = $name[1]
    $DownloadLink = "https://7-zip.org/$setup"
    if ($GetFileNameOnly)
    {
        return $name
    }
    else
    {
        return $DownloadLink
    }
}

<#
    .EXTERNALHELP 7-ZipSetupManager.psm1-Help.xml
#>

function Get-7ZipInstallationPath
{
    [CmdletBinding()]
    param
    (
        [switch]$GetVersionOnly,
        [switch]$Property,
        [switch]$CheckAll
    )
    $GetPath = Microsoft.PowerShell.Management\Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\7-Zip*
    if (-not ($GetPath))
    {
        $GetPath = Microsoft.PowerShell.Management\Get-ChildItem HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\7-Zip*
    }
    if ($GetPath)
    {
        $GetPath = Microsoft.PowerShell.Management\Get-ItemProperty $GetPath.PsPath
        $InstallPath = $GetPath.InstallLocation
        $Version = $GetPath.DisplayVersion
        if ($CheckAll)
        {
            if ($GetPath.DisplayName -like '*x64*')
            {
                $Pathx86 = Microsoft.PowerShell.Management\Get-ChildItem HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\7-Zip*
                if ($Pathx86)
                {
                    $Pathx86 = Microsoft.PowerShell.Management\Get-ItemProperty $Pathx86.PsPath
                    $InstallPathx86 = $Pathx86.InstallLocation
                    $InstallPath = $InstallPath + "`n" + $InstallPathx86
                }
            }
        }
        if ($Property)
        {
            return $GetPath
        }
        elseif ($GetVersionOnly)
        {
            return $Version
        }
        else
        {
            return $InstallPath
        }
    }
    else
    {
        return $false
    }
}

<#
    .EXTERNALHELP 7-ZipSetupManager.psm1-Help.xml
#>

function Get-7ZipSetup
{
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory = $false,
                   Position = 1,
                   HelpMessage = 'Enter valid path to download.',
                   HelpMessageBaseName = 'Download path')]
        [AllowEmptyString()]
        [string]$Path,
        [Parameter(Position = 2)]
        [switch]$x86,
        [Parameter(Position = 3)]
        [switch]$AndStartInstallation,
        [Parameter(Mandatory = $false,
                   Position = 4,
                   DontShow = $true)]
        [switch]$Silent
    )
    
    # Get-7ZipDownloadLink
    if ($x86)
    {
        $DownloadLink = Get-7ZipDownloadLink -x86
        $FileName = Get-7ZipDownloadLink -GetFileNameOnly
    }
    else
    {
        $DownloadLink = Get-7ZipDownloadLink
        $FileName = Get-7ZipDownloadLink -GetFileNameOnly
    }
    $DownloadPath = (Microsoft.PowerShell.Management\Get-Location).Path + "\$FileName"
    if ($path)
    {
        if (Microsoft.PowerShell.Management\Resolve-Path -Path "$Path" -ErrorAction SilentlyContinue)
        {
            $DownloadPath = $Path + $FileName
        }
        else
        {
            return 'Path does not exist.'
        }
    }
    Microsoft.PowerShell.Utility\Invoke-WebRequest -Uri $DownloadLink -OutFile $DownloadPath -ErrorAction Stop
    if ($AndStartInstallation)
    {
        if (-not ($Silent))
        {
            Microsoft.PowerShell.Management\Start-Process -FilePath $DownloadPath -Wait
        }
        else
        {
            Microsoft.PowerShell.Management\Start-Process -FilePath $DownloadPath -ArgumentList "/S" -Wait
        }
        return 'Installation complete.'
    }
    else
    {
        return "Downloaded to: $DownloadPath"
    }
}

<#
    .EXTERNALHELP 7-ZipSetupManager.psm1-Help.xml
#>

function Uninstall-7Zip
{
    [CmdletBinding()]
    param
    (
        [switch]$Silent
    )
    # Get-7ZipInstallationPath
    $path = Get-7ZipInstallationPath -CheckAll
    if (-not ($path))
    {
        return '7-Zip is not installed.'
    }
    else
    {
        $check = $path | Microsoft.PowerShell.Utility\Measure-Object -Line
        if ($check.Lines -eq 2)
        {
            Microsoft.PowerShell.Utility\Write-Warning 'Found both 64bit and 32bit installations, removing 64bit first, to remove the 32bit also run this command again.'
        }
        $uninstall = Get-7ZipInstallationPath -Property
        $uninstall = $uninstall.UninstallString
        if ($Silent)
        {
            Microsoft.PowerShell.Management\Start-Process -FilePath $uninstall -ArgumentList "/S" -Wait -ErrorAction Stop
        }
        else
        {
            Microsoft.PowerShell.Management\Start-Process -FilePath $uninstall -Wait -ErrorAction Stop
        }
        $path = Get-7ZipInstallationPath -CheckAll
        if (-not ($path))
        {
            return '7-Zip for Windows uninstalled completely.'
        }
        else
        {
            $check = $path | Microsoft.PowerShell.Utility\Measure-Object -Line
            if ($check.Lines -eq 2)
            {
                return 'Uninstall canceled or error occured, both versions present 64 and 32 bit.'
            }
            else
            {
                return 'Uninstall canceled or there is 32bit version left to uninstall.'
            }
        }
    }
}

# SIG # Begin signature block
# MIIbRwYJKoZIhvcNAQcCoIIbODCCGzQCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCB4Bw+FFzxoNNs0
# aCPZma7ILY8+jg8+dfAyCSuY1N2SDaCCFYYwggMyMIICGqADAgECAhCuC7oCPbvl
# rEJ4JzUZnfD8MA0GCSqGSIb3DQEBCwUAMBoxGDAWBgNVBAMTD0NNYWtlIFRlc3Qg
# Q2VydDAgFw0xNDAxMDEwNzAwMDBaGA8yMTAwMDEwMTA3MDAwMFowGjEYMBYGA1UE
# AxMPQ01ha2UgVGVzdCBDZXJ0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
# AQEAy/GcWKj93HO+1SylOUMgS6KhJLQrTvn2Qscmm6XzRcZhUTxPWMJ/q6YvN3uY
# m7qIvfQw6nBPfCvZIEjkmGECRZPdCZc0v1KLhvhLYSxIpxHpYIFW9+mxEj0fJEOL
# PI1UeVgQnZCutFBPNEjCLhiR2v+pnF03tbuFO9P2q2ksYUhkapw5Y7Z7nOQVKgNC
# np5bDj4ONVIw4SBcqDukQZzcOHc0IEHleCP9R0BuBdT6LWqovYWD5F0AVPnmm7G1
# DpYKzAl+IwS2eCBGH2Q5H2UODEXa24R5XEWFl70CODl+wPzvpkID2UXRxrKpnxk/
# pUOhPq7Ia2jjepEU+aX5lKZlzQIDAQABo3IwcDAMBgNVHRMBAf8EAjAAMBMGA1Ud
# JQQMMAoGCCsGAQUFBwMDMEsGA1UdAQREMEKAEHT4UyF9dmOb2B+yY+KJZQOhHDAa
# MRgwFgYDVQQDEw9DTWFrZSBUZXN0IENlcnSCEK4LugI9u+WsQngnNRmd8PwwDQYJ
# KoZIhvcNAQELBQADggEBADf+AAZY1XexFIR6aLecXEFk2J9UjmL5WD2m6VNpgJd4
# 1SFesljqNTwu6qpOJ16qrK9ikHjbTpQBtxOEVrZz3XlbrgbC6jvDNegkm2eOD8NQ
# toEozzgu/Aj8cGSDK7vXv314ViZ5j10Dl+chKwhr7sipLQO317/eaWOTmAkvHQ+n
# tvVi81K87UlYtiPtKZz6haNqfRYM9DkJM5lzLl/wyyXf1UAP+uQSEHfizwYwUUNe
# MCfaGMuvYZqecACaETQBWCaKfe7/cwDcOiO0WEz9e4utvSVxgZfoICb1BXFmF1Fc
# xN6Z4mq4RxrdcRswl37IHYaU2p+oebwf7xGPHqXebkYwggWDMIIDa6ADAgECAg5F
# 5rsDgzPDhWVI5v9FUTANBgkqhkiG9w0BAQwFADBMMSAwHgYDVQQLExdHbG9iYWxT
# aWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMK
# R2xvYmFsU2lnbjAeFw0xNDEyMTAwMDAwMDBaFw0zNDEyMTAwMDAwMDBaMEwxIDAe
# BgNVBAsTF0dsb2JhbFNpZ24gUm9vdCBDQSAtIFI2MRMwEQYDVQQKEwpHbG9iYWxT
# aWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
# MIICCgKCAgEAlQfoc8pm+ewUyns89w0I8bRFCyyCtEjG61s8roO4QZIzFKRvf+kq
# zMawiGvFtonRxrL/FM5RFCHsSt0bWsbWh+5NOhUG7WRmC5KAykTec5RO86eJf094
# YwjIElBtQmYvTbl5KE1SGooagLcZgQ5+xIq8ZEwhHENo1z08isWyZtWQmrcxBsW+
# 4m0yBqYe+bnrqqO4v76CY1DQ8BiJ3+QPefXqoh8q0nAue+e8k7ttU+JIfIwQBzj/
# ZrJ3YX7g6ow8qrSk9vOVShIHbf2MsonP0KBhd8hYdLDUIzr3XTrKotudCd5dRC2Q
# 8YHNV5L6frxQBGM032uTGL5rNrI55KwkNrfw77YcE1eTtt6y+OKFt3OiuDWqRfLg
# nTahb1SK8XJWbi6IxVFCRBWU7qPFOJabTk5aC0fzBjZJdzC8cTflpuwhCHX85mEW
# P3fV2ZGXhAps1AJNdMAU7f05+4PyXhShBLAL6f7uj+FuC7IIs2FmCWqxBjplllnA
# 8DX9ydoojRoRh3CBCqiadR2eOoYFAJ7bgNYl+dwFnidZTHY5W+r5paHYgw/R/98w
# EfmFzzNI9cptZBQselhP00sIScWVZBpjDnk99bOMylitnEJFeW4OhxlcVLFltr+M
# m9wT6Q1vuC7cZ27JixG1hBSKABlwg3mRl5HUGie/Nx4yB9gUYzwoTK8CAwEAAaNj
# MGEwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFK5s
# BaOTE+Ki5+LXHNbH8H/IZ1OgMB8GA1UdIwQYMBaAFK5sBaOTE+Ki5+LXHNbH8H/I
# Z1OgMA0GCSqGSIb3DQEBDAUAA4ICAQCDJe3o0f2VUs2ewASgkWnmXNCE3tytok/o
# R3jWZZipW6g8h3wCitFutxZz5l/AVJjVdL7BzeIRka0jGD3d4XJElrSVXsB7jpl4
# FkMTVlezorM7tXfcQHKso+ubNT6xCCGh58RDN3kyvrXnnCxMvEMpmY4w06wh4OMd
# +tgHM3ZUACIquU0gLnBo2uVT/INc053y/0QMRGby0uO9RgAabQK6JV2NoTFR3VRG
# HE3bmZbvGhwEXKYV73jgef5d2z6qTFX9mhWpb+Gm+99wMOnD7kJG7cKTBYn6fWN7
# P9BxgXwA6JiuDng0wyX7rwqfIGvdOxOPEoziQRpIenOgd2nHtlx/gsge/lgbKCuo
# bK1ebcAF0nu364D+JTf+AptorEJdw+71zNzwUHXSNmmc5nsE324GabbeCglIWYfr
# exRgemSqaUPvkcdM7BjdbO9TLYyZ4V7ycj7PVMi9Z+ykD0xF/9O5MCMHTI8Qv4aW
# 2ZlatJlXHKTMuxWJU7osBQ/kxJ4ZsRg01Uyduu33H68klQR4qAO77oHl2l98i0qh
# kHQlp7M+S8gsVr3HyO844lyS8Hn3nIS6dC1hASB+ftHyTwdZX4stQ1LrRgyU4fVm
# R3l31VRbH60kN8tFWk6gREjI2LCZxRWECfbWSUnAZbjmGnFuoKjxguhFPmzWAtcK
# Z4MFWsmkEDCCBlkwggRBoAMCAQICDQHsHJJA3v0uQF18R3QwDQYJKoZIhvcNAQEM
# BQAwTDEgMB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoT
# Ckdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTgwNjIwMDAwMDAw
# WhcNMzQxMjEwMDAwMDAwWjBbMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFs
# U2lnbiBudi1zYTExMC8GA1UEAxMoR2xvYmFsU2lnbiBUaW1lc3RhbXBpbmcgQ0Eg
# LSBTSEEzODQgLSBHNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPAC
# 4jAj+uAb4Zp0s691g1+pR1LHYTpjfDkjeW10/DHkdBIZlvrOJ2JbrgeKJ+5Xo8Q1
# 7bM0x6zDDOuAZm3RKErBLLu5cPJyroz3mVpddq6/RKh8QSSOj7rFT/82QaunLf14
# TkOI/pMZF9nuMc+8ijtuasSI8O6X9tzzGKBLmRwOh6cm4YjJoOWZ4p70nEw/XVvs
# tu/SZc9FC1Q9sVRTB4uZbrhUmYqoMZI78np9/A5Y34Fq4bBsHmWCKtQhx5T+QpY7
# 8Quxf39GmA6HPXpl69FWqS69+1g9tYX6U5lNW3TtckuiDYI3GQzQq+pawe8P1Zm5
# P/RPNfGcD9M3E1LZJTTtlu/4Z+oIvo9Jev+QsdT3KRXX+Q1d1odDHnTEcCi0gHu9
# Kpu7hOEOrG8NubX2bVb+ih0JPiQOZybH/LINoJSwspTMe+Zn/qZYstTYQRLBVf1u
# kcW7sUwIS57UQgZvGxjVNupkrs799QXm4mbQDgUhrLERBiMZ5PsFNETqCK6dSWcR
# i4LlrVqGp2b9MwMB3pkl+XFu6ZxdAkxgPM8CjwH9cu6S8acS3kISTeypJuV3AqwO
# VwwJ0WGeJoj8yLJN22TwRZ+6wT9Uo9h2ApVsao3KIlz2DATjKfpLsBzTN3SE2R1m
# qzRzjx59fF6W1j0ZsJfqjFCRba9Xhn4QNx1rGhTfAgMBAAGjggEpMIIBJTAOBgNV
# HQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU6hbGaefj
# y1dFOTOk8EC+0MO9ZZYwHwYDVR0jBBgwFoAUrmwFo5MT4qLn4tcc1sfwf8hnU6Aw
# PgYIKwYBBQUHAQEEMjAwMC4GCCsGAQUFBzABhiJodHRwOi8vb2NzcDIuZ2xvYmFs
# c2lnbi5jb20vcm9vdHI2MDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwuZ2xv
# YmFsc2lnbi5jb20vcm9vdC1yNi5jcmwwRwYDVR0gBEAwPjA8BgRVHSAAMDQwMgYI
# KwYBBQUHAgEWJmh0dHBzOi8vd3d3Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRvcnkv
# MA0GCSqGSIb3DQEBDAUAA4ICAQB/4ojZV2crQl+BpwkLusS7KBhW1ky/2xsHcMb7
# CwmtADpgMx85xhZrGUBJJQge5Jv31qQNjx6W8oaiF95Bv0/hvKvN7sAjjMaF/ksV
# JPkYROwfwqSs0LLP7MJWZR29f/begsi3n2HTtUZImJcCZ3oWlUrbYsbQswLMNEhF
# Vd3s6UqfXhTtchBxdnDSD5bz6jdXlJEYr9yNmTgZWMKpoX6ibhUm6rT5fyrn50hk
# aS/SmqFy9vckS3RafXKGNbMCVx+LnPy7rEze+t5TTIP9ErG2SVVPdZ2sb0rILmq5
# yojDEjBOsghzn16h1pnO6X1LlizMFmsYzeRZN4YJLOJF1rLNboJ1pdqNHrdbL4gu
# PX3x8pEwBZzOe3ygxayvUQbwEccdMMVRVmDofJU9IuPVCiRTJ5eA+kiJJyx54jzl
# mx7jqoSCiT7ASvUh/mIQ7R0w/PbM6kgnfIt1Qn9ry/Ola5UfBFg0ContglDk0Xuo
# yea+SKorVdmNtyUgDhtRoNRjqoPqbHJhSsn6Q8TGV8Wdtjywi7C5HDHvve8U2BRA
# bCAdwi3oC8aNbYy2ce1SIf4+9p+fORqurNIveiCx9KyqHeItFJ36lmodxjzK89kc
# v1NNpEdZfJXEQ0H5JeIsEH6B+Q2Up33ytQn12GByQFCVINRDRL76oJXnIFm2eMak
# aqoimzCCBmgwggRQoAMCAQICEAFIkD3CirynoRlNDBxXuCkwDQYJKoZIhvcNAQEL
# BQAwWzELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExMTAv
# BgNVBAMTKEdsb2JhbFNpZ24gVGltZXN0YW1waW5nIENBIC0gU0hBMzg0IC0gRzQw
# HhcNMjIwNDA2MDc0MTU4WhcNMzMwNTA4MDc0MTU4WjBjMQswCQYDVQQGEwJCRTEZ
# MBcGA1UECgwQR2xvYmFsU2lnbiBudi1zYTE5MDcGA1UEAwwwR2xvYmFsc2lnbiBU
# U0EgZm9yIE1TIEF1dGhlbnRpY29kZSBBZHZhbmNlZCAtIEc0MIIBojANBgkqhkiG
# 9w0BAQEFAAOCAY8AMIIBigKCAYEAwsncA7YbUPoqDeicpCHbKKcd9YC1EnQj/l4v
# wxpdlrIgGRlQX3YjJjXGIeyU77WiOsWQgZsh7wsnpOMXZDvak9RWLzzXWPltrMAv
# kHgjScD4wY9wE9Rr3yaIWnZ7SPfhpKbvCxrzJVQPgJ4jEhIT0bD3AuMrDf9APgBC
# Q94a70z0h6nynjzQBufiY9LrTFvdXViU0+WlOSiqB152IzD8/H+YDcVlbRvVdEU6
# RrCiFnXeosIqcHy2drzZG666XZz2h5XOqqjitaOxk25ApZsQiHYWTjSh/J7x4RpU
# 0cgkV5R2rcLH7KOjlnXixihrAgXoS7m14FIreAGMKjEsTOgF5W+fD4QmLmhs+stN
# GXwYwf9qGqnLvqN1+OnIGLLM3S9BQCAcz4gLF8mwikPL4muTUfERvkK8+FHy2gAC
# vggYKAUnxNw7XXcpHhnUQSpmfbRSc1xCpZDTjcWjqjfOcwGUJBlCQ9GUj0t+3ctt
# vBtOe/mqCyJLSYBJcBstT940YD69AgMBAAGjggGeMIIBmjAOBgNVHQ8BAf8EBAMC
# B4AwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwHQYDVR0OBBYEFFtre/RwdAjBDSrI
# 7/HEuUDSSsb9MEwGA1UdIARFMEMwQQYJKwYBBAGgMgEeMDQwMgYIKwYBBQUHAgEW
# Jmh0dHBzOi8vd3d3Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRvcnkvMAwGA1UdEwEB
# /wQCMAAwgZAGCCsGAQUFBwEBBIGDMIGAMDkGCCsGAQUFBzABhi1odHRwOi8vb2Nz
# cC5nbG9iYWxzaWduLmNvbS9jYS9nc3RzYWNhc2hhMzg0ZzQwQwYIKwYBBQUHMAKG
# N2h0dHA6Ly9zZWN1cmUuZ2xvYmFsc2lnbi5jb20vY2FjZXJ0L2dzdHNhY2FzaGEz
# ODRnNC5jcnQwHwYDVR0jBBgwFoAU6hbGaefjy1dFOTOk8EC+0MO9ZZYwQQYDVR0f
# BDowODA2oDSgMoYwaHR0cDovL2NybC5nbG9iYWxzaWduLmNvbS9jYS9nc3RzYWNh
# c2hhMzg0ZzQuY3JsMA0GCSqGSIb3DQEBCwUAA4ICAQAuaz6Pf7CwYNnxnYTclbbf
# Xw2/JFHjGgaqVQTLYcHvZXGuC/2UJFcAx+T2DLwYlX0vGWpgM6a+0AhVVgS24/4e
# u+UQdlQ7q1whXio1TUbLpky6BEBgYCzb0/ad3soyEAx4sLtWxQdLcLynD6tyvI3L
# 6+7BTGvZ+pihdD7pqMh5fHZ3SP3P4/ANwenDkuAHDBMvP2t/NdnVt+5vfFjA8T8M
# GbICo0lMnATD8LSXp+BNaiW6NBZiZsh4vGlzql9yojVYHibrvzIUqhJ66/SWa39y
# rOqnOQgzATY+YSR+EZ0RHnYiVONAuy6GDHaeadLEHD2iC4yIBANU3ukbF/4sK57Z
# 1lsiOPxkQIbNF3/hqZ+5v5JBqG8mavQPKLBAkZAvTrZ2ULxNI9l/T2uTKads59Aw
# PqmTH8JQKznFsvhNJyTR/XbYvvmT9KlUCtV2WNE8nuoa6CTE+zbxL1nTksPsy2BS
# HhxGJQj/ftmTrhSVqIaKBy5Ui3NMNxU4UFaH8U+uHI/JoWwvC/y7HG8tvaq262gj
# 8O2UJxRjy6z0Z4osgdMUEhgBP4R6ruxHYD9oWJnJSsKhmRUFwq3eou/Xp1V8vIQb
# TZS7jkqFRNmBPaqjJVVfpGvNNmwA+f9y3lrs/8mgQZYaQGqFkRyvdWOoy1oztZQz
# frKND3O+h/yvOnMfeyDbcjGCBRcwggUTAgEBMC4wGjEYMBYGA1UEAxMPQ01ha2Ug
# VGVzdCBDZXJ0AhCuC7oCPbvlrEJ4JzUZnfD8MA0GCWCGSAFlAwQCAQUAoEwwGQYJ
# KoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwLwYJKoZIhvcNAQkEMSIEIPzv5yQ5PZW/
# lMMZ+4SxbboaB7c3xcIJCftE9XCIRTAqMA0GCSqGSIb3DQEBAQUABIIBALSnXm8g
# 2bBiv3dKOLsPVcwF+X4MG8PFYxoXpmBM82gfn9i6xMfKeMtN9wzPRvn//+lJBwPB
# 9C9zYdRdsxYAAOmW3iCsg8ygyfAg57Zc3JUhbDzFn2CdmKsgUQ+0KTOpSaPnhpOv
# ycXDjF3TO3syDcaIZ23qsbyLCJfpvFGlilvHkHLa8qbPuPTNYeRTk/z4V2wcdQqX
# wwgtZ06ADepqomUzqZq2m+BT8MjzUsIoZxFEfZjHER3rnY8S9sfeC0AZHaSFdj+D
# Of8C4XTGFpZRonwmWq+lf7aDb9nT84yXbGie7086G/R0LJi6UnqVrDMmWDQ9F0GE
# HTxrFP/JORi36VyhggNsMIIDaAYJKoZIhvcNAQkGMYIDWTCCA1UCAQEwbzBbMQsw
# CQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTExMC8GA1UEAxMo
# R2xvYmFsU2lnbiBUaW1lc3RhbXBpbmcgQ0EgLSBTSEEzODQgLSBHNAIQAUiQPcKK
# vKehGU0MHFe4KTALBglghkgBZQMEAgGgggE9MBgGCSqGSIb3DQEJAzELBgkqhkiG
# 9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTIzMDMyNjA5NDAxN1owKwYJKoZIhvcNAQk0
# MR4wHDALBglghkgBZQMEAgGhDQYJKoZIhvcNAQELBQAwLwYJKoZIhvcNAQkEMSIE
# IBFsxtUHDCTMBMrAfNebv6zHf5/pDFeTf2yYpCHsjhEJMIGkBgsqhkiG9w0BCRAC
# DDGBlDCBkTCBjjCBiwQUMQMOF2qkWS6rLIut6DKZ/LVYXc8wczBfpF0wWzELMAkG
# A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExMTAvBgNVBAMTKEds
# b2JhbFNpZ24gVGltZXN0YW1waW5nIENBIC0gU0hBMzg0IC0gRzQCEAFIkD3Ciryn
# oRlNDBxXuCkwDQYJKoZIhvcNAQELBQAEggGAwPggAuo23t9o4yuVzN1nXALyh/CE
# Z77gYI/UiP91luBfXNMyuIDso3moLwgzFIVmfmfZGMsI6Dl7WV6AgUvTGZlwIYcD
# 3CZnvBRr7K39PzG+Y/XaQAmTcaaguy94oeSC4g4lT+QQcdiMgMpvjTmRaFbUNeR7
# 9o/hk8biwkfS1sBEFGZMOPKlOaEGAvJVcbLPp0mpMm5XSESaewsPniYEFbmy0XzY
# 3ZJP8dcsrm4K+yovPHerfaf6RLH6cr5PMEe+PjYDZONAc8Nv1i+gfIh6MLECX+rB
# k7+nOCImnrvDBBs/OzfnbnCFcaflInINpsUYuN1yGdOalBYpiXZOFfsiq1BCLtFE
# AuDDLKFzh7u3xi/eBPCTVRUyFKI44ipqqpSpNW1H87iOFjhrLOpMR0y1PJwtcWox
# QKZEpNZphxm8nZSuyIfSrMjlwQVb4UXotkoFiWs9qHVKdjiIRzziKF5nWIMyhsp7
# EuytGqm8XoH0pcQHwQc8ey5W7xDWLV7X1qhS
# SIG # End signature block