Private/UpdateEnvironmentPath.psm1

###########################################################################
# #
# Copyright (c) Microsoft Corporation. All rights reserved. #
# #
# This code is licensed under the MIT License (MIT). #
# #
###########################################################################

function Update-EnvironmentPath {
    [CmdletBinding(
        SupportsShouldProcess = $true
    )]
    param (
        [parameter(HelpMessage = "Name of the tool add or remove from env path")]
        [string] $Tool,

        [parameter(HelpMessage = "Path of the tool to add or remove from env path")]
        [string] $Path,

        [ValidateSet("System", "User")]
        [parameter(HelpMessage = "Path to change: System or User")]
        [string]$PathType,

        [ValidateSet("Add", "Remove")]
        [parameter(HelpMessage = "Action: Add or Remove the feature path from the environment")]
        [string] $Action
    )

    process {
        if ($PSCmdlet.ShouldProcess($env:COMPUTERNAME, "$path will be added to environment path")) {
            # Get current environment path
            $parsedPathString = switch ($PathType) {
                "System" {
                    $pathVariable = [System.Environment]::GetEnvironmentVariable("Path", "Machine")
                    ParsePathString -PathString $pathVariable
                }
                "User" {
                    ParsePathString -PathString $env:Path
                }
                Default { throw "Invalid PathType: $PathType" }
            }

            # Check if the path needs to be changed
            $pathFound = "$Path" -in ($parsedPathString -split ";")
            switch ($Action) {
                "Add" {
                    $pathChanged = (-not $pathFound)
                    $toAction = $Path
                    $ActionVerb = "Adding"
                }
                "Remove" {
                    $pathChanged = $pathFound
                    $toAction = $Tool
                    $ActionVerb = "Removing"
                }
                Default { throw "Invalid PathType: $PathType" }
            }

            if ($pathChanged) {
                Write-Information -InformationAction Continue -MessageData "$ActionVerb $toAction in $PathType Environment Path"

                # Get the updated path
                $updatedPath = switch ($Action) {
                    "Add" { AddFeatureToPath -PathString $parsedPathString -ToolPath $Path }
                    "Remove" { RemoveFeatureFromPath -PathString $parsedPathString -Tool $Tool }
                    Default { throw "Invalid Action: $Action" }
                }

                # For tests, we do not want to update the environment path
                if ($env:pester) {
                    Write-Debug "Skipping environment path update for tests"
                    return $updatedPath
                }

                # Update the environment path
                switch ($PathType) {
                    "System" {
                        [System.Environment]::SetEnvironmentVariable("Path", "$updatedPath", [System.EnvironmentVariableTarget]::Machine)
                    }
                    "User" {
                        $env:Path = $updatedPath
                    }
                    Default {
                        throw"Invalid PathType: $PathType"
                    }
                }
            }
        }
        else {
            # Code that should be processed if doing a WhatIf operation
            # Must NOT change anything outside of the function / script
            return
        }
    }
}

function ParsePathString($PathString) {
    $parsedString = $PathString -split ";" | `
        ForEach-Object { $_.TrimEnd("\") } | `
        Select-Object -Unique | `
        Where-Object { ![string]::IsNullOrWhiteSpace($_) }

    if ($null -eq $parsedString) {
        Throw 'Env path cannot be null or an empty string'
    }
    return $parsedString -join ";"
}

function AddFeatureToPath ($PathString, $ToolPath) {
    if (!$PathString) {
        Throw 'Env path cannot be null or an empty string'
    }
    return (ParsePathString -PathString "$ToolPath;$PathString")
}

function RemoveFeatureFromPath ($PathString, $Tool) {
    $pathString = ParsePathString -PathString $pathString
    $parsedString = $pathString -split ";" |  Where-Object { ($_ -notlike "*$tool*") }

    if (!$parsedString) {
        Throw 'Env path cannot be null or an empty string'
    }
    return $parsedString -join ";"
}


Export-ModuleMember -Function Update-EnvironmentPath

# SIG # Begin signature block
# MIIoXQYJKoZIhvcNAQcCoIIoTjCCKEoCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDqxI2UU8cluP9e
# /xloGJcG+D4JOOclUtZu3S4GAWR5HqCCDYswggYJMIID8aADAgECAhMzAAAD9LjE
# XeFOcLZ+AAAAAAP0MA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p
# bmcgUENBIDIwMTEwHhcNMjQwNzE3MjEwMjM1WhcNMjUwOTE1MjEwMjM1WjCBiDEL
# MAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1v
# bmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWlj
# cm9zb2Z0IDNyZCBQYXJ0eSBBcHBsaWNhdGlvbiBDb21wb25lbnQwggEiMA0GCSqG
# SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCv3P8bL08GKolFW7QNDVOF0aM4iqMxVvAW
# VM124/82xbjAraJkKxieMrQa1Fc95LVGgxmJIi5R6QKMz2MO9bnwC7kSkPqoZJil
# 26bRLY6jinjbwPpK3TzbW7z9bXfWw5bPFlt72NVIdXJ3xtHoYa+AOi++CF2Ry7+7
# o1AzvotJwG6lQSiCMKeMt8apqEF1f+QkDFEUv5tezw9748DeHW9orvo4IPzWa7vW
# QgljB08LKSnzTN9/Jot2coWpFv4YuEoJZmR2ofPJMnDUUruDORTXnxwhfvd/wUmI
# SoEysSqobkNV+qFuUmSShYrx8R1zHm7P6G/iRMIKYmSrIYBKUvndAgMBAAGjggFz
# MIIBbzAfBgNVHSUEGDAWBgorBgEEAYI3TBEBBggrBgEFBQcDAzAdBgNVHQ4EFgQU
# Dz4uMjS8YCSZaU0449GJYQ1ufyowRQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1p
# Y3Jvc29mdCBDb3Jwb3JhdGlvbjEWMBQGA1UEBRMNMjMxNTIyKzUwMjUxODAfBgNV
# HSMEGDAWgBRIbmTlUAXTgqoXNzcitW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNo
# dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0Ey
# MDExXzIwMTEtMDctMDguY3JsMGEGCCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZF
# aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQ
# Q0EyMDExXzIwMTEtMDctMDguY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQEL
# BQADggIBABUCAiEn4g8i5T3VCP8160IY4ERdvZi5QZ2pSnBPW1dswVhLxkNTiCTV
# XKDjTQ4EwDBNSZZGJePz4+t86pKhlBON3S7wswf5fCovJLlIiKbw+E4TZeY6xAxd
# +5zV7Q2lsQhPHxiOY0PIGUE0KJfv/DQUulD8DrE0rru7yOO+DJI0muoK0BbHhRfd
# mAJhp2gbYRkarEIkhML9m3gR12mCBb69Vocm4IyOBivUPMjjvQMkERF7cR07k2uP
# 6dmpR8wtof9la0/K0wgiP5XuQUsAqgzhXrljH7dK7nqGrBDjJtrRdYfvVL+Rcz9i
# YZO280g2uNtac5em3HOEsactAL7XKqZ4o7s9sRyp/bTNLLRmhFMB729IL+Hi0YM7
# C8th3HZ5nP+77L46KUGip6QgRIJs+EO0YNW+AwgMxPfKpTx/Ggh8Z85kP7HLDZJk
# ZdPO/3cgVOTO4ax21vO2yMPCdfoGGr2ZLZw4SjEbGuOZJ22iGMV7tBvHk8nWAt3q
# +j/icAq99GA1nIPnw3jK3K9OwGqwA9eiWsO8/bHMm6s50UKIFupMKm6qObosaVBy
# R58rf8Cxumka7hPy1eSJSzQyA4UqYNTWuChsTfqgRLmLomS6yAu7t4r/bM4mGl+2
# Ki+avhQ4COm3jWWd0V6UGIP3T4zaKNs2GWFBIYsb/6XVvvi7pz/JMIIHejCCBWKg
# AwIBAgIKYQ6Q0gAAAAAAAzANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMx
# EzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoT
# FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3Qg
# Q2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYw
# NzA4MjEwOTA5WjB+MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ
# MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
# MSgwJgYDVQQDEx9NaWNyb3NvZnQgQ29kZSBTaWduaW5nIFBDQSAyMDExMIICIjAN
# BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGf
# Qhsqa+laUKq4BjgaBEm6f8MMHt03a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRg
# JGyvnkmc6Whe0t+bU7IKLMOv2akrrnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NE
# t13YxC4Ddato88tt8zpcoRb0RrrgOGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnn
# Db6gE3e+lD3v++MrWhAfTVYoonpy4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+E
# GvKhL1nkkDstrjNYxbc+/jLTswM9sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+t
# GSOEy/S6A4aN91/w0FK/jJSHvMAhdCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxh
# H2rhKEmdX4jiJV3TIUs+UsS1Vz8kA/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AV
# s70b1FVL5zmhD+kjSbwYuER8ReTBw3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f
# 7Fufr/zdsGbiwZeBe+3W7UvnSSmnEyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3D
# KI8sj0A3T8HhhUSJxAlMxdSlQy90lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9Jaw
# vEagbJjS4NaIjAsCAwEAAaOCAe0wggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1Ud
# DgQWBBRIbmTlUAXTgqoXNzcitW2oynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBi
# AEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRy
# LToCMZBDuRQFTuHqp8cx0SOJNDBaBgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3Js
# Lm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDEx
# XzIwMTFfMDNfMjIuY3JsMF4GCCsGAQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0
# cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDEx
# XzIwMTFfMDNfMjIuY3J0MIGfBgNVHSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/
# BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2Nz
# L3ByaW1hcnljcHMuaHRtMEAGCCsGAQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAA
# bwBsAGkAYwB5AF8AcwB0AGEAdABlAG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUA
# A4ICAQBn8oalmOBUeRou09h0ZyKbC5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+
# vj/oCso7v0epo/Np22O/IjWll11lhJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4H
# Limb5j0bpdS1HXeUOeLpZMlEPXh6I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6
# aC6VoCo/KmtYSWMfCWluWpiW5IP0wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiX
# mE0OPQvyCInWH8MyGOLwxS3OW560STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn
# +N4sOiBpmLJZiWhub6e3dMNABQamASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAq
# ZaPDXVJihsMdYzaXht/a8/jyFqGaJ+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5h
# YbXw3MYbBL7fQccOKO7eZS/sl/ahXJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/
# RXceNcbSoqKfenoi+kiVH6v7RyOA9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXm
# r/r8i+sLgOppO6/8MO0ETI7f33VtY5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMyk
# XcGhiJtXcVZOSEXAQsmbdlsKgEhr/Xmfwb1tbWrJUnMTDXpQzTGCGigwghokAgEB
# MIGVMH4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH
# EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNV
# BAMTH01pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTECEzMAAAP0uMRd4U5w
# tn4AAAAAA/QwDQYJYIZIAWUDBAIBBQCggbAwGQYJKoZIhvcNAQkDMQwGCisGAQQB
# gjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkE
# MSIEIELZeaTrlyn+D1rJuQqATl7Iu0JcGyo5iY78+3WpNiLsMEQGCisGAQQBgjcC
# AQwxNjA0oBSAEgBNAGkAYwByAG8AcwBvAGYAdKEcgBpodHRwczovL3d3dy5taWNy
# b3NvZnQuY29tIDANBgkqhkiG9w0BAQEFAASCAQCubeJ0Ig3PZHkiBzycJt+Ymbcs
# x+t/buRZsMuZmHIULLgWrB8Z8Taf7lHzN8WdhXlAP1jpJ2wh2NcrimFNyUKPaa+P
# 19xdzwzlITR5/IAh74WdJyxUZhOozmIABrbySoU+jMWaH6XjDZTrOIDug8PWpT1v
# L7v7Rgc6OWURHLfA85bA9oyCEjpPOHNegP1hPrx9JiVF0RWBWpLHxL2Qo3y1Lv/r
# k0k/mQ/tSDT7Z7PrZ77O3F9wk+3EXiZURwv/CjGVP3+ntv3XuKRkQPfM8slrtP0Q
# OYaNtM4e3YBqeAv1Vsjb4LcGzhySEjHu9OIvSBMdDIp54Xtzu6iHX0RRBCBKoYIX
# sDCCF6wGCisGAQQBgjcDAwExghecMIIXmAYJKoZIhvcNAQcCoIIXiTCCF4UCAQMx
# DzANBglghkgBZQMEAgEFADCCAVoGCyqGSIb3DQEJEAEEoIIBSQSCAUUwggFBAgEB
# BgorBgEEAYRZCgMBMDEwDQYJYIZIAWUDBAIBBQAEIHZbWYCuPtFOLLk0NIM/iCZu
# gchUYOCZ6UCsjzB93LiCAgZoEseI748YEzIwMjUwNTE1MTYxOTQ4LjY4NlowBIAC
# AfSggdmkgdYwgdMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAw
# DgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x
# LTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEn
# MCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjU5MUEtMDVFMC1EOTQ3MSUwIwYDVQQD
# ExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloIIR/jCCBygwggUQoAMCAQIC
# EzMAAAH0F0aFwMs/OeUAAQAAAfQwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMC
# VVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNV
# BAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRp
# bWUtU3RhbXAgUENBIDIwMTAwHhcNMjQwNzI1MTgzMDU5WhcNMjUxMDIyMTgzMDU5
# WjCB0zELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT
# B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEtMCsGA1UE
# CxMkTWljcm9zb2Z0IElyZWxhbmQgT3BlcmF0aW9ucyBMaW1pdGVkMScwJQYDVQQL
# Ex5uU2hpZWxkIFRTUyBFU046NTkxQS0wNUUwLUQ5NDcxJTAjBgNVBAMTHE1pY3Jv
# c29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
# ggIKAoICAQCnCE4TptCAL2qriMkZfYDXKg5t+TSp61DySSP7mbftYHEOWxnmgmeN
# /Meymo+I4RXNnbLbKAaA1nf/F1lA3t/0DVanUB2HmoddlmHdIFfwAG5zr1Nvdwnk
# oJlxcOy5/CZd4KPzUTMkQhmq5V1XxJOVC54H9vUwhi3lEqKze7DN2V9KXRyQdsbO
# g73VhMqDogTGopiiMat4KimcgrE6+SvlVmyPZ/3kFvUsYS+6EEib8LsnKy8m8FlY
# 22uynPJdWe6j6QMTJnCmSmGxHxm92L6z+lCKh+Z1tbVSrNaWpdBWChhdtpiQTJpK
# H+F4G3CPW2574ty45wcA+BvBm9AuSwporjqiS2t6A5Hh7SJywaIBZH0gv6fLiaUJ
# Q0DzgXsYQRY4S+JuKDvCytNrplvO4yzJOLYDPio9XdBGQWDFJunhHg4QqeKfwnPh
# csjXBeEGEikwZ8DcFPznSepqbNKIPkvmnH5W18KLQwlNLYsMXU9pVnCXJVkhWNUc
# ryiHYdgb1PboWNH38jzmLkTHGaEenEzZn5SEl5kDovPjnab/7GsDjGt1hqzlybsV
# SHLbis8tUf4XL5nLAcCn1z2hZOu2N8gqosi9i2AlzjVDxbFtk9HsHW5+3wEWy/PZ
# 05IuTE8MtxdbLXoA3Lve/SKkLEDBQQL2GyyLQt0HxOGI1//gD5FnywIDAQABo4IB
# STCCAUUwHQYDVR0OBBYEFCt0ZaEK0Sw+J3UsnOxNotMpBt+bMB8GA1UdIwQYMBaA
# FJ+nFV0AXmJdg/Tl0mWnG1M1GelyMF8GA1UdHwRYMFYwVKBSoFCGTmh0dHA6Ly93
# d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMFRpbWUtU3Rh
# bXAlMjBQQ0ElMjAyMDEwKDEpLmNybDBsBggrBgEFBQcBAQRgMF4wXAYIKwYBBQUH
# MAKGUGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9z
# b2Z0JTIwVGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3J0MAwGA1UdEwEB/wQC
# MAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwDgYDVR0PAQH/BAQDAgeAMA0GCSqG
# SIb3DQEBCwUAA4ICAQDdwdIPEkpQOyBpwh9FfrS6A4NKGwGrC0RRFRtRd4OZhhJr
# mgWPfhG6NbeA54K385sM7jm9+mdgbk5LlijDCwXDX2CIIjolX5xwb+qozTyfEBJv
# PBa2q2ivNCImH26mwThNVl4pheZvLHtY3211tUisJ6VWPs/qJ8wdNIu3oGbKhLbG
# ULZx+Ao88DXe9Ld66pSXrPB7sYCGN+M1eMqUThI1Ym92qCu/QZREqOqZqY2+GZIl
# qd7pNjOl0MJ6Crxp2UYfzkjURYqZ8RFvWXMrLk4w7Z70iQCW/J2lS6fQLew0S2nR
# 6GWJPRKtqryNxhUMfgDYL8xssEjCKSPCIUZDhKUUtPZOBvga++lxZXMHHAOj0hEH
# CnOeBvLNuGH3lRU6tAvattYescNITd2B0vbK5odGBjsdhguzku2zfTBT066Hw3nh
# FS1roYVkXHkDi4hODIlxV1ZVo3SqOzR4SPATI1S/RxEu4dYkF6OQx7epECG8KOeG
# ujsMZFZoiV3J/NmqWfoWyctDduX5m9UlZNgm4v4hksjZKLcishF+Nxyfb1fYFf+/
# PYpxi5siMrpd9i+tlA3hcpue9KoE0DAg9jbEl4Hij08MQUjatw9otTLPkhXsk/cl
# GmCDfGxSq8UeVIbq4whaPAfQZAgjCsLbNHL6U1mw4qeu7LIcxBM/uPLlT3aoQTCC
# B3EwggVZoAMCAQICEzMAAAAVxedrngKbSZkAAAAAABUwDQYJKoZIhvcNAQELBQAw
# gYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS
# ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMT
# KU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDEwMB4XDTIx
# MDkzMDE4MjIyNVoXDTMwMDkzMDE4MzIyNVowfDELMAkGA1UEBhMCVVMxEzARBgNV
# BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv
# c29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAg
# UENBIDIwMTAwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDk4aZM57Ry
# IQt5osvXJHm9DtWC0/3unAcH0qlsTnXIyjVX9gF/bErg4r25PhdgM/9cT8dm95VT
# cVrifkpa/rg2Z4VGIwy1jRPPdzLAEBjoYH1qUoNEt6aORmsHFPPFdvWGUNzBRMhx
# XFExN6AKOG6N7dcP2CZTfDlhAnrEqv1yaa8dq6z2Nr41JmTamDu6GnszrYBbfowQ
# HJ1S/rboYiXcag/PXfT+jlPP1uyFVk3v3byNpOORj7I5LFGc6XBpDco2LXCOMcg1
# KL3jtIckw+DJj361VI/c+gVVmG1oO5pGve2krnopN6zL64NF50ZuyjLVwIYwXE8s
# 4mKyzbnijYjklqwBSru+cakXW2dg3viSkR4dPf0gz3N9QZpGdc3EXzTdEonW/aUg
# fX782Z5F37ZyL9t9X4C626p+Nuw2TPYrbqgSUei/BQOj0XOmTTd0lBw0gg/wEPK3
# Rxjtp+iZfD9M269ewvPV2HM9Q07BMzlMjgK8QmguEOqEUUbi0b1qGFphAXPKZ6Je
# 1yh2AuIzGHLXpyDwwvoSCtdjbwzJNmSLW6CmgyFdXzB0kZSU2LlQ+QuJYfM2BjUY
# hEfb3BvR/bLUHMVr9lxSUV0S2yW6r1AFemzFER1y7435UsSFF5PAPBXbGjfHCBUY
# P3irRbb1Hode2o+eFnJpxq57t7c+auIurQIDAQABo4IB3TCCAdkwEgYJKwYBBAGC
# NxUBBAUCAwEAATAjBgkrBgEEAYI3FQIEFgQUKqdS/mTEmr6CkTxGNSnPEP8vBO4w
# HQYDVR0OBBYEFJ+nFV0AXmJdg/Tl0mWnG1M1GelyMFwGA1UdIARVMFMwUQYMKwYB
# BAGCN0yDfQEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNv
# bS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTATBgNVHSUEDDAKBggrBgEFBQcD
# CDAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0T
# AQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTV9lbLj+iiXGJo0T2UkFvXzpoYxDBWBgNV
# HR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9w
# cm9kdWN0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcmwwWgYIKwYBBQUHAQEE
# TjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2Nl
# cnRzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNydDANBgkqhkiG9w0BAQsFAAOC
# AgEAnVV9/Cqt4SwfZwExJFvhnnJL/Klv6lwUtj5OR2R4sQaTlz0xM7U518JxNj/a
# ZGx80HU5bbsPMeTCj/ts0aGUGCLu6WZnOlNN3Zi6th542DYunKmCVgADsAW+iehp
# 4LoJ7nvfam++Kctu2D9IdQHZGN5tggz1bSNU5HhTdSRXud2f8449xvNo32X2pFaq
# 95W2KFUn0CS9QKC/GbYSEhFdPSfgQJY4rPf5KYnDvBewVIVCs/wMnosZiefwC2qB
# woEZQhlSdYo2wh3DYXMuLGt7bj8sCXgU6ZGyqVvfSaN0DLzskYDSPeZKPmY7T7uG
# +jIa2Zb0j/aRAfbOxnT99kxybxCrdTDFNLB62FD+CljdQDzHVG2dY3RILLFORy3B
# FARxv2T5JL5zbcqOCb2zAVdJVGTZc9d/HltEAY5aGZFrDZ+kKNxnGSgkujhLmm77
# IVRrakURR6nxt67I6IleT53S0Ex2tVdUCbFpAUR+fKFhbHP+CrvsQWY9af3LwUFJ
# fn6Tvsv4O+S3Fb+0zj6lMVGEvL8CwYKiexcdFYmNcP7ntdAoGokLjzbaukz5m/8K
# 6TT4JDVnK+ANuOaMmdbhIurwJ0I9JZTmdHRbatGePu1+oDEzfbzL6Xu/OHBE0ZDx
# yKs6ijoIYn/ZcGNTTY3ugm2lBRDBcQZqELQdVTNYs6FwZvKhggNZMIICQQIBATCC
# AQGhgdmkgdYwgdMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAw
# DgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x
# LTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEn
# MCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjU5MUEtMDVFMC1EOTQ3MSUwIwYDVQQD
# ExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloiMKAQEwBwYFKw4DAhoDFQC/
# 4tn9WDSzXtd6TiIb1H1z/v4AjqCBgzCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1w
# IFBDQSAyMDEwMA0GCSqGSIb3DQEBCwUAAgUA69Bi2TAiGA8yMDI1MDUxNTEyNTU1
# M1oYDzIwMjUwNTE2MTI1NTUzWjB3MD0GCisGAQQBhFkKBAExLzAtMAoCBQDr0GLZ
# AgEAMAoCAQACAgrUAgH/MAcCAQACAhL0MAoCBQDr0bRZAgEAMDYGCisGAQQBhFkK
# BAIxKDAmMAwGCisGAQQBhFkKAwKgCjAIAgEAAgMHoSChCjAIAgEAAgMBhqAwDQYJ
# KoZIhvcNAQELBQADggEBAK5p2m/WvOVvmzBl+JMKhNx7+ohrQODplFEvCvx8Hn9R
# 8LkO3Qlbr31C9NE1fsDvY3s1pLt6xgdjj9zm4OPED+n0jRfqL5OM1vw/a2+bo/0C
# hotPewd32M3yosGMsOImef4ItB7qFISxVZVNaoTV+dMeX/KnM4sVdsGxeHq0ygoq
# nCw+ym5jNEtv9fK4hPSLtpJpNQQJsoFtco0DmWuL+19E3nYYfcfyXZ4cRHLUCKrF
# 4dPkLSf7RAGgZpaUzKR4v9tKoRWn8PRJrLvFMA3VFc5oxWfWxN0EAhYeGNdCPitF
# MWw4i3aepaNhOEGf4QHXL+A1ReUDWgYsUpaljplipakxggQNMIIECQIBATCBkzB8
# MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk
# bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1N
# aWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAfQXRoXAyz855QABAAAB
# 9DANBglghkgBZQMEAgEFAKCCAUowGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEE
# MC8GCSqGSIb3DQEJBDEiBCD26lfpf8gzQMX9NTSuXJD+H4M9r7kdvVsuYkZ+Y/RB
# OTCB+gYLKoZIhvcNAQkQAi8xgeowgecwgeQwgb0EID9YwnxuJpPqeO+SScHxDuFJ
# AiLzKzq8gG9mDrREGNZrMIGYMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgT
# Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m
# dCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENB
# IDIwMTACEzMAAAH0F0aFwMs/OeUAAQAAAfQwIgQgeG7BdLwwS55pwbAsC43/p3Jx
# ceZCo/rwOZjexXlD/TMwDQYJKoZIhvcNAQELBQAEggIAfCbulNghQ+POaiaqZuN2
# 9QL0jDBrE7YzOz/xdwrgnDyHjfGXLbs03WxxBZkkh5eEQp4yCdZrO2R5xCRSsazc
# tGHN1VNLPV+6DPg7PA6KOHxLkUH7fYCBDz5XIGrorILZUlEc9MYsZyKLpLV3ytg9
# JELr5xPi957GaKuG9R/qim8sWkwKA22R+0LbZ0VoL9OxWFbf+HOyJbAd69JBNY5J
# hk2jK3sQ6+kHyQykxPdoXQLLUyIJ/05PC5dXFLgTwi312WizytHRaqRRyoUhXJCx
# YC8a/dcEtxwBot5V0l82ndK4gV0TdClmHb+kDWUUVVoKWuknM369pgBR+rdJUaYB
# LoYmI1yBFxKCDLGFdpY1hk6y4yar85Bm00KHUfcBdYHRC0L8pMgBKHAUk9/iQN8J
# EPLPdcNVtjhdCQfO4goKPVP/o82m1DU+h6xwf5gYOQCiHxmcgjJJ62EzAvm+rJSX
# hoCKi0hIqUxt4G1SNOILg5sxUURhrufR/Hc4udczsctgOB+oefj6fqKo/L20KXB/
# HZ8kc1FWBPSa/BI5j7qvxXtMrQvFgjgzPdp9ZoSejbVQfQUGu3f/9zuAYrxn+YLD
# twfgqu+F4gE0a6roXcbC+b8/s3imRPUf8nvlzQ2Im6UqW5MvbcMUkW6NW56iZrUw
# HkRTLbEfM3859V7OmPfd1I0=
# SIG # End signature block