public/Update-AppVentiXPublishingTaskPath.ps1

<#
    .SYNOPSIS
        Adds the Content Share relative path to the publishing tasks.
 
    .DESCRIPTION
        The Update-AppVentiXPublishingTaskPath function adds a RelativePath element to every
        publishing task in AppVentiX-PublishingTasks.xml, next to the existing Path element.
 
        A publishing task stores the full package path, for example
        "\\lab.local\appventix\content\App_1.0.1.0_x64\App_1.0.1.0_x64.msix". The leading part of
        that path is already configured per Machine Group, so the remainder
        "App_1.0.1.0_x64\App_1.0.1.0_x64.msix" is stored as well. The AppVentiX Agent decides which
        of the two it uses, so a task keeps working on Agent versions that do not know the
        RelativePath element yet.
 
        The Path element keeps the full path. The one exception is a task that already holds a
        relative path in Path, from before the RelativePath element existed: that path is resolved
        back to a full path and stored in both elements, so the task works on every Agent version.
 
        All Task elements are handled: the tasks under Packages, ConnectionGroups and
        SharedContainers, in both GlobalPublishingTasks and UserPublishingTasks.
 
        The function is safe to run more than once. A RelativePath that is already correct is left
        alone, one that no longer matches the Path is refreshed, and a package that is not located in
        any configured Content Share is reported and keeps its full path only. A timestamped backup
        of AppVentiX-PublishingTasks.xml is written before any change is saved.
 
    .PARAMETER PassThru
        Returns a result object per publishing task, describing the full path, the relative path and
        the resulting status.
 
    .PARAMETER ConfigShare
        Specifies the path to the AppVentiX configuration share.
        You can omit this parameter if the configuration store was already set with Set-AppVentiXConfigShare,
        or when it can be detected automatically (for example on a machine where AppVentiX Central View is installed and configured).
 
    .EXAMPLE
        Update-AppVentiXPublishingTaskPath -WhatIf
        Shows which publishing tasks would get a relative path, without changing anything.
 
    .EXAMPLE
        Update-AppVentiXPublishingTaskPath
        Adds the Content Share relative path to all publishing tasks.
 
    .EXAMPLE
        Update-AppVentiXPublishingTaskPath -PassThru | Format-Table Name, Status, Path, RelativePath
        Adds the relative paths and returns a per task overview of the result.
 
    .LINK
        Get-AppVentiXPublishingTask
 
    .LINK
        New-AppVentiXPublishingTask
 
    .LINK
        Get-AppVentiXMachineGroup
 
    .NOTES
        Function : Update-AppVentiXPublishingTaskPath
        Author : John Billekens
        Copyright: (c) John Billekens Consultancy & AppVentiX
        Version : 1.0
        Requires : Valid AppVentiX license
#>

function Update-AppVentiXPublishingTaskPath {
    [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')]
    [OutputType([PSCustomObject])]
    param (
        [Switch]$PassThru,

        [Alias('Config', 'Share', 'AppVentixConfigShare')]
        [Parameter(DontShow)]
        [ValidateNotNullOrEmpty()]
        [String]$ConfigShare = $Script:AppVentix.ConfigShare
    )
    if (-not (Test-AppVentiXIsLicensed -ConfigShare $ConfigShare)) {
        Write-Warning 'AppVentiX is not licensed!'
        return
    }

    $publishingTasksFullname = Join-Path -Path $ConfigShare -ChildPath $Script:AppVentiX.PublishingTasksFilename
    Write-Verbose "Reading data from $($publishingTasksFullname)"
    if (-not (Test-Path -Path $publishingTasksFullname)) {
        Write-Error "The Publishing Tasks file was not found: `"$publishingTasksFullname`"" -ErrorAction Stop
    }
    $publishingTasksXml = New-Object -TypeName System.Xml.XmlDocument
    try {
        $publishingTasksXml.Load($publishingTasksFullname)
    } catch {
        Write-Error "The Publishing Tasks file exists but is not accessible! $($_.Exception.Message)" -ErrorAction Stop
    }

    $taskElements = @($publishingTasksXml.SelectNodes("//Task[Path]"))
    Write-Verbose "Found $($taskElements.Count) publishing task(s) with a Path element"
    if ($taskElements.Count -eq 0) {
        Write-Warning "No publishing tasks with a package path were found."
        return
    }

    $results = @()
    $changedCount = 0
    foreach ($taskElement in $taskElements) {
        $fullPath = "$($taskElement.Path)"
        $currentRelativePath = "$($taskElement.RelativePath)"
        $machineGroupFriendlyname = "$($taskElement.MachineGroupFriendlyname)"
        if ([String]::IsNullOrEmpty($machineGroupFriendlyname)) {
            $machineGroupFriendlyname = 'All Machine Groups'
        }
        $result = [PSCustomObject]@{
            Id           = "$($taskElement.Id)"
            Name         = "$($taskElement.Name)"
            MachineGroup = $machineGroupFriendlyname
            Path         = $fullPath
            RelativePath = $currentRelativePath
            Status       = 'Unchanged'
        }

        # A Path that is already relative predates the RelativePath element.
        if (-not (Test-AppVentiXPathIsAbsolute -Path $fullPath)) {
            $repairedPath = Resolve-AppVentiXPackagePath -Path $fullPath -MachineGroupFriendlyname $machineGroupFriendlyname -ConfigShare $ConfigShare
            if ([String]::IsNullOrEmpty($repairedPath)) {
                Write-Warning "Publishing task `"$($taskElement.Id)`" (`"$($taskElement.Name)`") holds the relative path `"$fullPath`", which could not be resolved to a full path. Skipping."
                $result.Status = 'PathNotResolvable'
                $results += $result
                continue
            }
            if ($PSCmdlet.ShouldProcess("Publishing task `"$($taskElement.Name)`" ($($taskElement.Id))", "Restore full path `"$repairedPath`" and set relative path `"$fullPath`"")) {
                $taskElement.Path = $repairedPath
                Set-AppVentiXRelativePathElement -TaskElement $taskElement -RelativePath $fullPath -Confirm:$false
                $changedCount++
            }
            $result.Path = $repairedPath
            $result.RelativePath = $fullPath
            $result.Status = 'Repaired'
            $results += $result
            continue
        }

        $relativePath = ConvertTo-AppVentiXRelativePackagePath -Path $fullPath -ConfigShare $ConfigShare
        if ($relativePath -ieq $fullPath) {
            # No content share matched, ConvertTo-AppVentiXRelativePackagePath already warned.
            Write-Warning "Publishing task `"$($taskElement.Id)`" (`"$($taskElement.Name)`") keeps its full path only."
            $result.Status = 'NoContentShareMatch'
            $results += $result
            continue
        }

        if ($currentRelativePath -ceq $relativePath) {
            Write-Verbose "Publishing task `"$($taskElement.Id)`" already holds the correct relative path"
            $result.Status = 'AlreadyPresent'
            $results += $result
            continue
        }

        if (-not (Test-Path -Path $fullPath -ErrorAction SilentlyContinue)) {
            if (Test-Path -Path ([System.IO.Path]::GetPathRoot($fullPath)) -ErrorAction SilentlyContinue) {
                Write-Warning "The package of publishing task `"$($taskElement.Id)`" (`"$($taskElement.Name)`") was not found at `"$fullPath`". The relative path is added anyway."
            } else {
                Write-Warning "The location of publishing task `"$($taskElement.Id)`" (`"$($taskElement.Name)`") cannot be reached, so `"$fullPath`" could not be verified. The relative path is added anyway."
            }
        }

        $action = if ([String]::IsNullOrEmpty($currentRelativePath)) { 'Add' } else { 'Update' }
        if ($PSCmdlet.ShouldProcess("Publishing task `"$($taskElement.Name)`" ($($taskElement.Id))", "$action relative path `"$relativePath`"")) {
            Set-AppVentiXRelativePathElement -TaskElement $taskElement -RelativePath $relativePath -Confirm:$false
            $changedCount++
        }
        $result.RelativePath = $relativePath
        $result.Status = if ($action -eq 'Add') { 'Added' } else { 'Updated' }
        $results += $result
    }

    if ($changedCount -gt 0) {
        $backupFullname = "$($publishingTasksFullname).$([datetime]::Now.ToString('yyyyMMdd-HHmmss')).bak"
        Write-Verbose "Creating a backup of the Publishing Tasks file: `"$backupFullname`""
        try {
            Copy-Item -Path $publishingTasksFullname -Destination $backupFullname -ErrorAction Stop
        } catch {
            Write-Error "Could not create a backup of the Publishing Tasks file, no changes were saved. $($_.Exception.Message)" -ErrorAction Stop
        }
        Write-Verbose "Saving $($changedCount) updated publishing task(s) to `"$publishingTasksFullname`""
        try {
            $publishingTasksXml.Save($publishingTasksFullname)
        } catch {
            Write-Error "Could not save the Publishing Tasks file. A backup is available at `"$backupFullname`". $($_.Exception.Message)" -ErrorAction Stop
        }
        Write-AppVentiXLogEntry -Feature Application -Action $($MyInvocation.MyCommand.Name) -Details "Added or updated the relative path of $($changedCount) publishing task(s), backup: `"$backupFullname`"" -ConfigShare $ConfigShare
    } else {
        Write-Verbose "No publishing task paths were changed, the Publishing Tasks file is unchanged"
    }

    if ($PassThru) {
        Write-Output $results
    }
}

# SIG # Begin signature block
# MII5zAYJKoZIhvcNAQcCoII5vTCCObkCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCC7n9LZFjyZk/nw
# EGYD44H/GZ6C/zGwRLnD0/qt8FXDsqCCIfAwggXMMIIDtKADAgECAhBUmNLR1FsZ
# 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
# 03u4aUoqlmZpxJTG9F9urJh4iIAGXKKy7aIwggalMIIEjaADAgECAhMzAARMPmfq
# aSg6w6caAAAABEw+MA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ
# RCBWZXJpZmllZCBDUyBBT0MgQ0EgMDMwHhcNMjYwODA1MTQyMTUyWhcNMjYwODA4
# MTQyMTUyWjBoMQswCQYDVQQGEwJOTDEWMBQGA1UECBMNTm9vcmQtSG9sbGFuZDEP
# MA0GA1UEBxMGSGVpbG9vMRcwFQYDVQQKEw5BcHBWZW50aVggQi5WLjEXMBUGA1UE
# AxMOQXBwVmVudGlYIEIuVi4wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIB
# gQC3MkD6rXjKM5qmyvZ0cPvNWQWhnN+XfxSiAC42MJoclF2U1um+TjcWk2H54VLj
# ZYu6cGHVXW2DZMEswIbSGiGm5ogn7TzZtPIJ73lZnp7J3HD4PwMpbB4GDCw9epH2
# IkOeSweKYD0HQpecIzxmGF5j9/8bIWJZbYwTB/76rzi/+63HkCnubYD6CcrxQ8qT
# Jo1wrTIUKaPouKIhFAO+y7nMnldIECa+9lhWAOY2r8epK6IzbLNc9Id9b34KrCaU
# VHbZXN7GtPktzMF5g/jve2Pjli0/M6goIDOh0/nt2UpshvObNU1dfdaK/vbgtnXc
# LG6qDI76JIdzsXma3f6edo9/oj+Cq6ECXez5Ie4PZj0Zlvj8YC296kcQIQNR4EmJ
# 1dOCFM/GhpExxnI+633wyeqVDz30K6Qgn5E9THPsFX5pn8hrZrym247PPf+qfy/k
# NW9iz6Z/tSGEGajj64gbRMAJ4BMggOV4HizFAkKCwr9giIpkf6PvZI5KJh6K6Xvc
# fsUCAwEAAaOCAdQwggHQMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMDsG
# A1UdJQQ0MDIGCisGAQQBgjdhAQAGCCsGAQUFBwMDBhorBgEEAYI3YaL8yC6uh9F6
# gZ2lyVCBwcKCJzAdBgNVHQ4EFgQUB0cGX1gt721eztA0RMr/pjOFwhowHwYDVR0j
# BBgwFoAUpEMMf3ZapYXnPo0oDwwXokVpcMYwZwYDVR0fBGAwXjBcoFqgWIZWaHR0
# cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSUQl
# MjBWZXJpZmllZCUyMENTJTIwQU9DJTIwQ0ElMjAwMy5jcmwwdAYIKwYBBQUHAQEE
# aDBmMGQGCCsGAQUFBzAChlhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz
# L2NlcnRzL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEFPQyUyMENB
# JTIwMDMuY3J0MFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRw
# Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0w
# DQYJKoZIhvcNAQEMBQADggIBAGDG9X6XuMGtOGO7Eu5QLHtNHaNnOxa7XuFZMn0l
# 79+g6tLURxq64Ta9roFKDYZJnfrbff4oJX9+T3cGaoEKLoYScPRuKJSkA3PY19GL
# tTwvz6MVBpFv8AGBtUOGCrvmSfoOunI9XY3V6yPgvTE8UH8OYZGgQ1EcLWdaabDf
# b2YZr2SsPtSTn8icC1bc+slByHsJPD4tcEIJCOZNTML87uE/Cq9tVQcEe3NAho+p
# GcKX38UNUtQ16Z55r7FPt54TXon+7Dko1sf+nbIUELeQVnufEvoJYVhu6+dhIKMF
# RlPhwwbu/v5tnJyLk/TTc1IUVHi2MFXkeNTHdkDeOTwzqxgxrSd6Q3RUiaQq9HVy
# B3WiWOHAemiwyD58C/VDLbudXtnZ9tMkf5qq3tIJvHz4L/M9pqPBE3sOmFsHcjWP
# P+2FqJKgp5+U/IGkjSK760UPUAA7RoiGXdMR3J7Zu/74Pv9nOveVkE59AilgmDQv
# jzZ3z2WlmiXM0oiagxfAsnFiT9pEAwpbGnLxuhn/czMuZ4Ec8iB7eQ/k4zrEYzSR
# 31vOHto080ygXqlCxeMILxHVH6SQmlG2ErsC5Uk+evBQ8MT3E+cifFod0bxIAv7u
# EY72aEcLdpx/S6BFQh8T00rmlMcL4NngBv1ojOWX7+pIjZ2hwFnUKKDW7WmlQhns
# 3vWEMIIGpTCCBI2gAwIBAgITMwAETD5n6mkoOsOnGgAAAARMPjANBgkqhkiG9w0B
# AQwFADBaMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0
# aW9uMSswKQYDVQQDEyJNaWNyb3NvZnQgSUQgVmVyaWZpZWQgQ1MgQU9DIENBIDAz
# MB4XDTI2MDgwNTE0MjE1MloXDTI2MDgwODE0MjE1MlowaDELMAkGA1UEBhMCTkwx
# FjAUBgNVBAgTDU5vb3JkLUhvbGxhbmQxDzANBgNVBAcTBkhlaWxvbzEXMBUGA1UE
# ChMOQXBwVmVudGlYIEIuVi4xFzAVBgNVBAMTDkFwcFZlbnRpWCBCLlYuMIIBojAN
# BgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAtzJA+q14yjOapsr2dHD7zVkFoZzf
# l38UogAuNjCaHJRdlNbpvk43FpNh+eFS42WLunBh1V1tg2TBLMCG0hohpuaIJ+08
# 2bTyCe95WZ6eydxw+D8DKWweBgwsPXqR9iJDnksHimA9B0KXnCM8ZhheY/f/GyFi
# WW2MEwf++q84v/utx5Ap7m2A+gnK8UPKkyaNcK0yFCmj6LiiIRQDvsu5zJ5XSBAm
# vvZYVgDmNq/HqSuiM2yzXPSHfW9+CqwmlFR22VzexrT5LczBeYP473tj45YtPzOo
# KCAzodP57dlKbIbzmzVNXX3Wiv724LZ13CxuqgyO+iSHc7F5mt3+nnaPf6I/gquh
# Al3s+SHuD2Y9GZb4/GAtvepHECEDUeBJidXTghTPxoaRMcZyPut98MnqlQ899Cuk
# IJ+RPUxz7BV+aZ/Ia2a8ptuOzz3/qn8v5DVvYs+mf7UhhBmo4+uIG0TACeATIIDl
# eB4sxQJCgsK/YIiKZH+j72SOSiYeiul73H7FAgMBAAGjggHUMIIB0DAMBgNVHRMB
# Af8EAjAAMA4GA1UdDwEB/wQEAwIHgDA7BgNVHSUENDAyBgorBgEEAYI3YQEABggr
# BgEFBQcDAwYaKwYBBAGCN2Gi/MgurofReoGdpclQgcHCgicwHQYDVR0OBBYEFAdH
# Bl9YLe9tXs7QNETK/6YzhcIaMB8GA1UdIwQYMBaAFKRDDH92WqWF5z6NKA8MF6JF
# aXDGMGcGA1UdHwRgMF4wXKBaoFiGVmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w
# a2lvcHMvY3JsL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEFPQyUy
# MENBJTIwMDMuY3JsMHQGCCsGAQUFBwEBBGgwZjBkBggrBgEFBQcwAoZYaHR0cDov
# L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBJRCUy
# MFZlcmlmaWVkJTIwQ1MlMjBBT0MlMjBDQSUyMDAzLmNydDBUBgNVHSAETTBLMEkG
# BFUdIAAwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Br
# aW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMA0GCSqGSIb3DQEBDAUAA4ICAQBgxvV+
# l7jBrThjuxLuUCx7TR2jZzsWu17hWTJ9Je/foOrS1EcauuE2va6BSg2GSZ36233+
# KCV/fk93BmqBCi6GEnD0biiUpANz2NfRi7U8L8+jFQaRb/ABgbVDhgq75kn6Drpy
# PV2N1esj4L0xPFB/DmGRoENRHC1nWmmw329mGa9krD7Uk5/InAtW3PrJQch7CTw+
# LXBCCQjmTUzC/O7hPwqvbVUHBHtzQIaPqRnCl9/FDVLUNemeea+xT7eeE16J/uw5
# KNbH/p2yFBC3kFZ7nxL6CWFYbuvnYSCjBUZT4cMG7v7+bZyci5P003NSFFR4tjBV
# 5HjUx3ZA3jk8M6sYMa0nekN0VImkKvR1cgd1oljhwHposMg+fAv1Qy27nV7Z2fbT
# JH+aqt7SCbx8+C/zPaajwRN7DphbB3I1jz/thaiSoKeflPyBpI0iu+tFD1AAO0aI
# hl3TEdye2bv++D7/Zzr3lZBOfQIpYJg0L482d89lpZolzNKImoMXwLJxYk/aRAMK
# Wxpy8boZ/3MzLmeBHPIge3kP5OM6xGM0kd9bzh7aNPNMoF6pQsXjCC8R1R+kkJpR
# thK7AuVJPnrwUPDE9xPnInxaHdG8SAL+7hGO9mhHC3acf0ugRUIfE9NK5pTHC+DZ
# 4Ab9aIzll+/qSI2docBZ1Cig1u1ppUIZ7N71hDCCBygwggUQoAMCAQICEzMAAAAY
# DeuRVamKAJgAAAAAABgwDQYJKoZIhvcNAQEMBQAwYzELMAkGA1UEBhMCVVMxHjAc
# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjE0MDIGA1UEAxMrTWljcm9zb2Z0
# IElEIFZlcmlmaWVkIENvZGUgU2lnbmluZyBQQ0EgMjAyMTAeFw0yNjAzMjYxODEx
# MzJaFw0zMTAzMjYxODExMzJaMFoxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJRCBWZXJpZmll
# ZCBDUyBBT0MgQ0EgMDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDI
# gNpgNFaiif2VWeWP5I6PnFXxJ/lB37fJR55GCvR7GLZBMkBijbiKVwgpBI3xM5nf
# 484znH/qncJ+OCq6y3jgnQW+R8Zd7U+7LjlrmcskalzSQ0ghMxEpnBW8/HHs2V8Z
# JzQk6HP+SDsbvsL7LdlH/eO2l4mknhDBwr0Z/Q966TvEth5b8kCxj1vqiV4YNthL
# GRqZR9u2fK/yBMWu83p6O4uo2Edg++gEew5IL7vnnnKFqmSh/R9vPJy3WF1YcZew
# AUx8sXZNUnx3ZhVg59l2LpitPiwzE6FMqIsqaEvVe3MzuFd2a/uWDZH6VbDyUiRK
# 78mIg1DQYA9zDEyyBFcNI+nxVSzglvL6u7PRuNqgcV3sf6ELxw89ysQM/Z4R1hRF
# WXRpyOWKKAKtfBHTk0UnNiPcxmLMMYs8jeUjOidfVPjTIry/UVwnwxdlkK85cZfB
# EMYZ/DBNOwdomP459Y1n8izKkbhsa+p4lw+cQVxATBFx9ggR79HhryT7HDmpPLvk
# JvBZ4wW4CW32UT2SMyDe28nIOU3m+hfHlVeKcLBQcym5VoRDjIcCVI7uqgGW2PNM
# E0cfei8zCwCy6HCsssJWFS7eg/YbFhnATJcyWfMrkNuAbMfMN8Npg8crS6jVVowy
# D0GG5zdgi+uQVcSK/638mA1xEYK3pnIoQgO09uuDBwIDAQABo4IB3DCCAdgwDgYD
# VR0PAQH/BAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBSkQwx/dlql
# hec+jSgPDBeiRWlwxjBUBgNVHSAETTBLMEkGBFUdIAAwQTA/BggrBgEFBQcCARYz
# aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnku
# aHRtMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMBIGA1UdEwEB/wQIMAYBAf8C
# AQAwHwYDVR0jBBgwFoAU2UEpsA8PY2zvadf1zSmepEhqMOYwcAYDVR0fBGkwZzBl
# oGOgYYZfaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9z
# b2Z0JTIwSUQlMjBWZXJpZmllZCUyMENvZGUlMjBTaWduaW5nJTIwUENBJTIwMjAy
# MS5jcmwwfQYIKwYBBQUHAQEEcTBvMG0GCCsGAQUFBzAChmFodHRwOi8vd3d3Lm1p
# Y3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMElEJTIwVmVyaWZp
# ZWQlMjBDb2RlJTIwU2lnbmluZyUyMFBDQSUyMDIwMjEuY3J0MA0GCSqGSIb3DQEB
# DAUAA4ICAQBxxyBW+X6mhdRiSwD9PMMWcGUAnx5/QUwnNvZdFGEX+4DRDIr9WCh4
# C87wHtw+lg1D3uzK10DstPX0LFLBFAC3vWMYX4ImXwoLhoR0xlN8mUdorJ3bgnpC
# JWuI1531Z1rCwPuUrSkBxfOIGDk3p2ECb3Ho/xHi5PRSR/OUrWuQHwXiaXMTuXu3
# IRLezwVkZpFmNwYRD57R9Nx2F/yM7tzOY0Hh0hGCaYEK38/6FrS0SXadXWyDUCfn
# 5XOGACRjUCnHx+JQUG0f4SHD+iblpAI0gl+ZHnVmdXXxHTZeTa0CYCIhFxKP2922
# s0g6zLmeiV13LWUmtt/UF7TrWXpMi2/0UNniaDoH7rnPGRV5xVX8uXy4sZii4asw
# zqPM7Y7+mzcranqZ8EjZk5gjLhQ3A2sZaprlOu8CaRmyfcIiVH7zVfgAvm81MWXF
# ziAf7my7QOvnyEFPGddq8MSfPtfRyw/Uq3uH6KpoaJNIfPYH6fceZSi53Rat1A9g
# rExq3ROjhhSpTcchuBItAMNVPxoKNbUm+iR/X3XkL+9WQginjyHe+hXLclY8vAGX
# FD1p40PqMIpAYsmEJBFKW9df4//1N5oQDr/FY9IBJl/oSS979i5rtT7NZz9KvYra
# CPRBGs0QCy+sWvgQa0coM70QJVLeVwmSxUO/0od0w9Qry7bSLrxGoDCCB54wggWG
# oAMCAQICEzMAAAAHh6M0o3uljhwAAAAAAAcwDQYJKoZIhvcNAQEMBQAwdzELMAkG
# A1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjFIMEYGA1UE
# AxM/TWljcm9zb2Z0IElkZW50aXR5IFZlcmlmaWNhdGlvbiBSb290IENlcnRpZmlj
# YXRlIEF1dGhvcml0eSAyMDIwMB4XDTIxMDQwMTIwMDUyMFoXDTM2MDQwMTIwMTUy
# MFowYzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
# bjE0MDIGA1UEAxMrTWljcm9zb2Z0IElEIFZlcmlmaWVkIENvZGUgU2lnbmluZyBQ
# Q0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALLwwK8ZiCji
# 3VR6TElsaQhVCbRS/3pK+MHrJSj3Zxd3KU3rlfL3qrZilYKJNqztA9OQacr1AwoN
# cHbKBLbsQAhBnIB34zxf52bDpIO3NJlfIaTE/xrweLoQ71lzCHkD7A4As1Bs076I
# u+mA6cQzsYYH/Cbl1icwQ6C65rU4V9NQhNUwgrx9rGQ//h890Q8JdjLLw0nV+ayQ
# 2Fbkd242o9kH82RZsH3HEyqjAB5a8+Ae2nPIPc8sZU6ZE7iRrRZywRmrKDp5+Tcm
# JX9MRff241UaOBs4NmHOyke8oU1TYrkxh+YeHgfWo5tTgkoSMoayqoDpHOLJs+qG
# 8Tvh8SnifW2Jj3+ii11TS8/FGngEaNAWrbyfNrC69oKpRQXY9bGH6jn9NEJv9weF
# xhTwyvx9OJLXmRGbAUXN1U9nf4lXezky6Uh/cgjkVd6CGUAf0K+Jw+GE/5VpIVbc
# Nr9rNE50Sbmy/4RTCEGvOq3GhjITbCa4crCzTTHgYYjHs1NbOc6brH+eKpWLtr+b
# Gecy9CrwQyx7S/BfYJ+ozst7+yZtG2wR461uckFu0t+gCwLdN0A6cFtSRtR8bvxV
# FyWwTtgMMFRuBa3vmUOTnfKLsLefRaQcVTgRnzeLzdpt32cdYKp+dhr2ogc+qM6K
# 4CBI5/j4VFyC4QFeUP2YAidLtvpXRRo3AgMBAAGjggI1MIICMTAOBgNVHQ8BAf8E
# BAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFNlBKbAPD2Ns72nX9c0p
# nqRIajDmMFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRwOi8v
# d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wGQYJ
# KwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSME
# GDAWgBTIftJqhSobyhmYBAcnz1AQT2ioojCBhAYDVR0fBH0wezB5oHegdYZzaHR0
# cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSWRl
# bnRpdHklMjBWZXJpZmljYXRpb24lMjBSb290JTIwQ2VydGlmaWNhdGUlMjBBdXRo
# b3JpdHklMjAyMDIwLmNybDCBwwYIKwYBBQUHAQEEgbYwgbMwgYEGCCsGAQUFBzAC
# hnVodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29m
# dCUyMElkZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUyMENlcnRpZmljYXRl
# JTIwQXV0aG9yaXR5JTIwMjAyMC5jcnQwLQYIKwYBBQUHMAGGIWh0dHA6Ly9vbmVv
# Y3NwLm1pY3Jvc29mdC5jb20vb2NzcDANBgkqhkiG9w0BAQwFAAOCAgEAfyUqnv7U
# q+rdZgrbVyNMul5skONbhls5fccPlmIbzi+OwVdPQ4H55v7VOInnmezQEeW4LqK0
# wja+fBznANbXLB0KrdMCbHQpbLvG6UA/Xv2pfpVIE1CRFfNF4XKO8XYEa3oW8oVH
# +KZHgIQRIwAbyFKQ9iyj4aOWeAzwk+f9E5StNp5T8FG7/VEURIVWArbAzPt9ThVN
# 3w1fAZkF7+YU9kbq1bCR2YD+MtunSQ1Rft6XG7b4e0ejRA7mB2IoX5hNh3UEauY0
# byxNRG+fT2MCEhQl9g2i2fs6VOG19CNep7SquKaBjhWmirYyANb0RJSLWjinMLXN
# OAga10n8i9jqeprzSMU5ODmrMCJE12xS/NWShg/tuLjAsKP6SzYZ+1Ry358ZTFcx
# 0FS/mx2vSoU8s8HRvy+rnXqyUJ9HBqS0DErVLjQwK8VtsBdekBmdTbQVoCgPCqr+
# PDPB3xajYnzevs7eidBsM71PINK2BoE2UfMwxCCX3mccFgx6UsQeRSdVVVNSyALQ
# e6PT12418xon2iDGE81OGCreLzDcMAZnrUAx4XQLUz6ZTl65yPUiOh3k7Yww94lD
# f+8oG2oZmDh5O1Qe38E+M3vhKwmzIeoB1dVLlz4i3IpaDcR+iuGjH2TdaC1ZOmBX
# iCRKJLj4DT2uhJ04ji+tHD6n58vhavFIrmcxghcyMIIXLgIBATBxMFoxCzAJBgNV
# BAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMT
# Ik1pY3Jvc29mdCBJRCBWZXJpZmllZCBDUyBBT0MgQ0EgMDMCEzMABEw+Z+ppKDrD
# pxoAAAAETD4wDQYJYIZIAWUDBAIBBQCgXjAQBgorBgEEAYI3AgEMMQIwADAZBgkq
# hkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAvBgkqhkiG9w0BCQQxIgQgttR7J98AFe0/
# ZVcNV4JWh9bRnD2L55gIw48UB9EIN+0wDQYJKoZIhvcNAQEBBQAEggGAj/6Alabk
# 2YKDjevPdQHr0GgtDERtpmBu2rDG/+9OVacZJxTRsAv8enHQFfN8ZNROECpKIKYW
# ZjZ+oh1cf0lizr2Gd6bxUSP0k4S8o7pyi5krWMfVUOWzSh0etYEpZ23LRqrsWYGW
# Wq0fVe7l2mwKzT1/Z8XCqGnwwT8/Oix5LmZY483vRewrWrGva9Cmd2+LuiM/fMxG
# KhyuunfQjkMYhXHaaTyqLyJV3Z9QD7fo5EF4hmKPX9tmxIRreXoF0U8Yh0JWbvjb
# /dvyiQ4+fCJNLJjL8JEyR/TqHZlGhoLf7dEs9q1hIeyc2EJ8cy1EsfSQJ2V+cWMH
# HOw+mKKRbizasybJM4swfo4Qtu1yhaDJhPOwyX8LWH8+m4kHUa+uTsWj2AftWXXH
# jZPGV3t1dlJ5KzodwC38yL2kutFKXxlbfmcNCFcgzM1YD0UIrENWovkVnyw22dW/
# UtS4hLzA8vkV0nhK0nANrftJdejHEnhSIlsfGuMU81PWfTEXIuzcDVqWoYIUsjCC
# FK4GCisGAQQBgjcDAwExghSeMIIUmgYJKoZIhvcNAQcCoIIUizCCFIcCAQMxDzAN
# BglghkgBZQMEAgEFADCCAWoGCyqGSIb3DQEJEAEEoIIBWQSCAVUwggFRAgEBBgor
# BgEEAYRZCgMBMDEwDQYJYIZIAWUDBAIBBQAEINa69Y0VrouILFZko7TpjH9te19+
# NM2hPC9iWT5KTIxqAgZqcNO9nOUYEzIwMjYwODA2MTgyNjI2LjU0OFowBIACAfSg
# gemkgeYwgeMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD
# VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTAr
# BgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUG
# A1UECxMeblNoaWVsZCBUU1MgRVNOOjdCMUEtMDVFMC1EOTQ3MTUwMwYDVQQDEyxN
# aWNyb3NvZnQgUHVibGljIFJTQSBUaW1lIFN0YW1waW5nIEF1dGhvcml0eaCCDykw
# ggeCMIIFaqADAgECAhMzAAAABeXPD/9mLsmHAAAAAAAFMA0GCSqGSIb3DQEBDAUA
# MHcxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x
# SDBGBgNVBAMTP01pY3Jvc29mdCBJZGVudGl0eSBWZXJpZmljYXRpb24gUm9vdCBD
# ZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAyMDAeFw0yMDExMTkyMDMyMzFaFw0zNTEx
# MTkyMDQyMzFaMGExCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y
# cG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWVzdGFt
# cGluZyBDQSAyMDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnnzn
# UmP94MWfBX1jtQYioxwe1+eXM9ETBb1lRkd3kcFdcG9/sqtDlwxKoVIcaqDb+omF
# io5DHC4RBcbyQHjXCwMk/l3TOYtgoBjxnG/eViS4sOx8y4gSq8Zg49REAf5huXhI
# kQRKe3Qxs8Sgp02KHAznEa/Ssah8nWo5hJM1xznkRsFPu6rfDHeZeG1Wa1wISvlk
# pOQooTULFm809Z0ZYlQ8Lp7i5F9YciFlyAKwn6yjN/kR4fkquUWfGmMopNq/B8U/
# pdoZkZZQbxNlqJOiBGgCWpx69uKqKhTPVi3gVErnc/qi+dR8A2MiAz0kN0nh7SqI
# NGbmw5OIRC0EsZ31WF3Uxp3GgZwetEKxLms73KG/Z+MkeuaVDQQheangOEMGJ4pQ
# ZH55ngI0Tdy1bi69INBV5Kn2HVJo9XxRYR/JPGAaM6xGl57Ei95HUw9NV/uC3yFj
# rhc087qLJQawSC3xzY/EXzsT4I7sDbxOmM2rl4uKK6eEpurRduOQ2hTkmG1hSuWY
# BunFGNv21Kt4N20AKmbeuSnGnsBCd2cjRKG79+TX+sTehawOoxfeOO/jR7wo3liw
# kGdzPJYHgnJ54UxbckF914AqHOiEV7xTnD1a69w/UTxwjEugpIPMIIE67SFZ2PMo
# 27xjlLAHWW3l1CEAFjLNHd3EQ79PUr8FUXetXr0CAwEAAaOCAhswggIXMA4GA1Ud
# DwEB/wQEAwIBhjAQBgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQUa2koOjUvSGNA
# z3vYr0npPtk92yEwVAYDVR0gBE0wSzBJBgRVHSAAMEEwPwYIKwYBBQUHAgEWM2h0
# dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0
# bTATBgNVHSUEDDAKBggrBgEFBQcDCDAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMA
# QTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFMh+0mqFKhvKGZgEByfPUBBP
# aKiiMIGEBgNVHR8EfTB7MHmgd6B1hnNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20v
# cGtpb3BzL2NybC9NaWNyb3NvZnQlMjBJZGVudGl0eSUyMFZlcmlmaWNhdGlvbiUy
# MFJvb3QlMjBDZXJ0aWZpY2F0ZSUyMEF1dGhvcml0eSUyMDIwMjAuY3JsMIGUBggr
# BgEFBQcBAQSBhzCBhDCBgQYIKwYBBQUHMAKGdWh0dHA6Ly93d3cubWljcm9zb2Z0
# LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwSWRlbnRpdHklMjBWZXJpZmlj
# YXRpb24lMjBSb290JTIwQ2VydGlmaWNhdGUlMjBBdXRob3JpdHklMjAyMDIwLmNy
# dDANBgkqhkiG9w0BAQwFAAOCAgEAX4h2x35ttVoVdedMeGj6TuHYRJklFaW4sTQ5
# r+k77iB79cSLNe+GzRjv4pVjJviceW6AF6ycWoEYR0LYhaa0ozJLU5Yi+LCmcrdo
# vkl53DNt4EXs87KDogYb9eGEndSpZ5ZM74LNvVzY0/nPISHz0Xva71QjD4h+8z2X
# MOZzY7YQ0Psw+etyNZ1CesufU211rLslLKsO8F2aBs2cIo1k+aHOhrw9xw6JCWON
# NboZ497mwYW5EfN0W3zL5s3ad4Xtm7yFM7Ujrhc0aqy3xL7D5FR2J7x9cLWMq7eb
# 0oYioXhqV2tgFqbKHeDick+P8tHYIFovIP7YG4ZkJWag1H91KlELGWi3SLv10o4K
# Gag42pswjybTi4toQcC/irAodDW8HNtX+cbz0sMptFJK+KObAnDFHEsukxD+7jFf
# EV9Hh/+CSxKRsmnuiovCWIOb+H7DRon9TlxydiFhvu88o0w35JkNbJxTk4MhF/Kg
# aXn0GxdH8elEa2Imq45gaa8D+mTm8LWVydt4ytxYP/bqjN49D9NZ81coE6aQWm88
# TwIf4R4YZbOpMKN0CyejaPNN41LGXHeCUMYmBx3PkP8ADHD1J2Cr/6tjuOOCztfp
# +o9Nc+ZoIAkpUcA/X2gSMkgHAPUvIdtoSAHEUKiBhI6JQivRepyvWcl+JYbYbBh7
# pmgAXVswggefMIIFh6ADAgECAhMzAAAAWXzacemNXvXAAAAAAABZMA0GCSqGSIb3
# DQEBDAUAMGExCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y
# YXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWVzdGFtcGlu
# ZyBDQSAyMDIwMB4XDTI2MDEwODE4NTkwMVoXDTI3MDEwNzE4NTkwMVowgeMxCzAJ
# BgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25k
# MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jv
# c29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UECxMeblNoaWVs
# ZCBUU1MgRVNOOjdCMUEtMDVFMC1EOTQ3MTUwMwYDVQQDEyxNaWNyb3NvZnQgUHVi
# bGljIFJTQSBUaW1lIFN0YW1waW5nIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEB
# BQADggIPADCCAgoCggIBAKYu5/40eEX+hT+5jFa146bid3dA4LnXYntvkP3CGw4L
# GARFhnvLMSJ/VtsubzDaeFnm7yb2KSM70WmHQprdCVqpvUH7l0uB4jNw7urLoAR9
# kKHLE0VlMlDStDSxUBI3qwsdrjvdmvV0k+9/njuDEiSlzJTf7Dowd1K3bO4beRya
# FhR+Y8tymECOqlOAffYrG2wZdVM51+QSBSe+PEykr8C6OnnqSipuF8fZvCb6/huk
# 0Zm6ZwsaixSHIAT2IEGvS7c63Im8jV3a8R0K6i2yiw0NNlnTSpwy/Zfv7iwsLBwh
# fbjBTn+XOl6mPzDXQQ3V+SRP9xXbGKOsBTxzGid7aKAHw3o4Ahl9UGWLH9kNP3VU
# okE6JYkjlfpuUGZ6gQyqDewfxD4VoYIlopt4HZ0xQvqajuJx+cr8LR/IZ56gLLmw
# yMzde5+vtjBoilry/gSZwVGwgkvkIgpKPBQHGsSB0y3szr7Y7wEb6v0yZal1XUvW
# nnz3inTaSWsCFrLPVwVmXy3ncY5/d25VpOkht+m697GWNbvsNOhAOHRaftE9j/hh
# koM6RsyJfBLnhqMcA/wcavf5oj5NeyRQdGZeLKcls9csKS3sBUzPidxx2iiNH9CP
# aDq/bLJEOXasYohXMnRinu+fUk81s8VO7DQSF6ffn5oqSHoV8lf1Ax6u+kdShb8B
# AgMBAAGjggHLMIIBxzAdBgNVHQ4EFgQUj5bnC18D0vlnSRhCOiODGGuXNnYwHwYD
# VR0jBBgwFoAUa2koOjUvSGNAz3vYr0npPtk92yEwbAYDVR0fBGUwYzBhoF+gXYZb
# aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIw
# UHVibGljJTIwUlNBJTIwVGltZXN0YW1waW5nJTIwQ0ElMjAyMDIwLmNybDB5Bggr
# BgEFBQcBAQRtMGswaQYIKwYBBQUHMAKGXWh0dHA6Ly93d3cubWljcm9zb2Z0LmNv
# bS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwUHVibGljJTIwUlNBJTIwVGltZXN0
# YW1waW5nJTIwQ0ElMjAyMDIwLmNydDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQM
# MAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDBmBgNVHSAEXzBdMFEGDCsGAQQB
# gjdMg30BATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20v
# cGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wCAYGZ4EMAQQCMA0GCSqGSIb3DQEB
# DAUAA4ICAQBEMhzC/ZcjpG/zURE7z2Yp5vrUxUjsE5Xa3t/2RGvESwvbmsk3bLHh
# SFAajgo2XQ8xoGDP3sUhKCLPeICSbkVv6V8sSp8fJ8Jos6yrawf2YVis8tcV+OO7
# U9S6JGPQzpmPncfzQc4ne1fqZ4+HiKabIDEoFdddQT2Egkk9fzxCY/EZ52avJ27d
# SfrI/IDmyn9V10O3iQpg2F+C9vNTrk7nVgoDoHa9+Q3pYr0IHGnSmt5irgGT436z
# o5WnXP8FxMhswH1aiyiSZiVzhor10C9C52cP3C8/PEoMKUXstLjoPO0TMkeW/1Fr
# 186KXD45QRgBo0xImgtWTdzWFnlD+p7+iDBIuSrNcRXDRYuq/aYZaDhWSI0SYdPI
# WVh5XvXuWA31a8oQ0SO+oPa3Nk80k0864wiiyJ1KsbSnaaefg9vspeghrpY8ljCw
# xfCUtx5HQRNgAJOI8IKACK4d014Mk0hlRO0lQVRHegqIg29K6Xqkc360W2ZJGUcs
# tlKokkVj6KAHjGyrLRPzepYfiZUJq4gXyxbpvKb1XJ2FN2682aUoNXo9RyRK1ch0
# f66k6+yj88kzvuC7+vJWtNDs/UpIM6Hhm0kU64JUJ7MMEQcAc7kpft7Gm7YeRK+o
# KgqUgYXCfmzbX8nJXJZnPa8ADWVsIqsuNAxCI0CZXkULofqo5Be6zzGCA9QwggPQ
# AgEBMHgwYTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh
# dGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZXN0YW1waW5n
# IENBIDIwMjACEzMAAABZfNpx6Y1e9cAAAAAAAFkwDQYJYIZIAWUDBAIBBQCgggEt
# MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQgxjR4
# e0NDySHPDE8j787rrYSYQFSXQ0Qtw/N2nT4IkREwgd0GCyqGSIb3DQEJEAIvMYHN
# MIHKMIHHMIGgBCDLRbqx24bpscXEJ+Hjj9xrcUVw7R8OyyMfSB2YGK3+vDB8MGWk
# YzBhMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
# MTIwMAYDVQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0Eg
# MjAyMAITMwAAAFl82nHpjV71wAAAAAAAWTAiBCB1aX40x4EirkYBwb/Wmi2daEK/
# eiVzxDo2pRHu17MaFjANBgkqhkiG9w0BAQsFAASCAgBIhn83zaYtyx9ArxbhdWve
# 9I7hlcuAceA68b/bsfWBCbw4o4SIyhhCS19qbX62dJRbNm4B3hVV1P/O2c2KJ0mZ
# H0pJqohn9w1G2Mu4L8xKeuIvzPsry0n+ZHzBunmmFNgbk0ElNr554SDZBrBNnCAq
# raVR7qW5CREJzTzC+6YoHhcgBcXZzYBCoNnS8g+7Qkq9bFpOes+np1MTwQpa143h
# AAaPE7jF+y6cyqIAB/ck2Dtpo9IJvoCZXGrEs+RYRiyITvnFV+3MvtU6F9UyxPDD
# ARhe+rIeZNUO+pJSLy0U+GEgP8W0Z58w10YeaZdaGXanr451oKgUBr6+/QsA8XyR
# 5Nkhcf9lMByeObNIoRaJ5WztrwBYAowJDex7zc2yAaRZsncB9drsyOUaTbHc7RbP
# n6PB+FGxfqM84ANULAUGE8Q2PwzG3ECpvhKXNthm1p4pCE+NX+Shc2aWOJMosZJt
# XXh4BVqppc2vXAYmVLkH/IHcdEKQv6Vcgya4LaRL/km4a58Ijs0appG2zEDakyHq
# WPrpHOitwQUumIrhWQZLJfEcub8+qSpFkwoo8ZRbVK8cRYROqtq0hz3gD2EThEFn
# NkUbvpl0mP/bCRD4FJNV71dqwxIgDufc129xsDQeZ9lO4p/pX00w6zMjrOKWOGRU
# iozoIdXopi6SjhpT03JF+g==
# SIG # End signature block