File: C:/DefenderUpdateWinImage.ps1
<#PSScriptInfo
.VERSION 1.0
.GUID 6ae58a11-4c1a-47ee-ab8e-76e9ed385055
.AUTHOR [email protected]
.COMPANYNAME Microsoft Corporation
.COPYRIGHT 2020 Microsoft Corporation. All rights reserved.
.TAGS
.LICENSEURI
.PROJECTURI
.ICONURI
.EXTERNALMODULEDEPENDENCIES
.REQUIREDSCRIPTS
.EXTERNALSCRIPTDEPENDENCIES
.RELEASENOTES
#>
<#
.SYNOPSIS
Performs Defender update servicing of Windows Install image.
.DESCRIPTION
Script to update Windows install image(WIM or VHD) with input Defender update package.
It can add or remove the update or display the details of patched Defender package.
Note: For Server images, the Windows-Defender feature gets automatically enabled if not already.
Note: Supported Architectures amd64 & x86
.PARAMETER WorkingDirectory
Specifies a local empty folder as working directory, to place the temporarily
generated files and a mount point to for OS install image to mount. Items in
this directory are deleted after each operation. Note: This directory should
be local, network shares are not supported.
.PARAMETER Action
Specifies the servicing action to be performed. The supported actions are
'AddUpdate','RemoveUpdate','ShowUpdate'.
AddUpdate - Adds the input Defender update package to Image.
RemoveUpdate - Removes the last updated Defender package present in the image.
ShowUpdate - Displays the details of Defender update package applied on the image.
.PARAMETER ImagePath
Specifies the Windows install image path to be updated.
.PARAMETER ImageIndex
Specifies the index of image in a WIM or VHD file to update. Default assumed as 1.
For a VHD file, the index must be 1.
.PARAMETER Package
Specifies the path to Windows Defender update package to be added into windows
install image.
.PARAMETER LogPath
Specifies the path to log file where actions are logged.
.INPUTS
None. You cannot pipe objects to DefenderUpdateWinImage.ps1.
.OUTPUTS
None. Update-Month.ps1 does not generate any output.
.EXAMPLE
PS> .\DefenderUpdateWinImage.ps1 -WorkingDirectory "D:\TempDir" -Action AddUpdate -ImagePath "C:\imagestore\install.wim" -Package "C:\packages\Defender-Dism-x86fre.cab"
This command updates the image install.wim present at C:\imagestore with package C:\packages\Defender-Dism-x86fre.cab.
For this operation it uses D:\Tempdir as a temporary working directory.
.EXAMPLE
PS> .\DefenderUpdateWinImage.ps1 -WorkingDirectory "D:\TempDir" -Action RemoveUpdate -ImagePath "C:\vhds\Windows10_client_en-US.vhd"
This command removes the Defender update package applied on VHD image C:\vhds\Windows10_client_en-US.vhd.
.EXAMPLE
PS> .\DefenderUpdateWinImage.ps1 -WorkingDirectory "D:\TempDir" -Action ShowUpdate -ImagePath "C:\vhds\Windows2016_server_serverdatacenter_en-us.vhd"
This command displays the details of Defender update package applied on the VHD image C:\vhds\Windows2016_server_serverdatacenter_en-us.vhd
#>
#Requires -Version 5.1
#Requires -RunAsAdministrator
#Requires -Modules Microsoft.PowerShell.Security, Dism
[CmdletBinding()]
param (
# The temporary location where the Windows image is mounted for servicing.
# TODO: If not specified, shall use the \Windows\%Temp%\DefenderDism-<randomHex> directory.
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string] $WorkingDirectory,
# Image Servicing Action (AddUpdate | RemoveUpdate | ShowUpdate)
[Parameter(Mandatory=$true)]
[ValidateSet('AddUpdate','RemoveUpdate','ShowUpdate')]
[string] $Action,
# Path to OS Image to be serviced
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string] $ImagePath,
# Index of the image to be serviced. Default value is 1.
[Parameter(Mandatory=$false)]
[ValidateNotNullOrEmpty()]
[string] $ImageIndex = 1,
# Specifies the path to Windows Defender Update Package to be added into windows Install image.
[Parameter(Mandatory=$false)]
[string] $Package,
# Specifies the full path and file name to log to. If not set, the default is %WINDIR%\Logs\Dism\dism.log
[Parameter(Mandatory=$false)]
[string] $LogPath
)
$ErrorActionPreference = "Stop"
Set-Variable S_OK -option Constant -value 0
Set-Variable E_FAIL -option Constant -value 1
Set-Variable E_INVALIDINPUT -option Constant -value 2
Set-Variable E_INVALIDOPERATION -option Constant -value 3
Set-Variable E_INVALIDPATH -option Constant -value 4
Set-Variable E_INVALIDPACKAGE -option Constant -value 5
Set-Variable E_ABORT -option Constant -value 6
Set-Variable E_ACCESSDENIED -option Constant -value 7
Set-Variable E_COMMANDMISSING -option Constant -value 8
Set-Variable E_UNSUPPORTED -option Constant -value 9
$ProgramDataDefender = "ProgramData\Microsoft\Windows Defender"
$ProgramFilesDefender = "Program Files\Windows Defender"
$ProgramFilesX86Defender = "Program Files (x86)\Windows Defender"
$DefinitionsUpdatesLocation = Join-Path -Path $ProgramDataDefender -ChildPath "Definition Updates\Updates"
$PlatformLocation = Join-Path -Path $ProgramDataDefender -ChildPath "Platform"
$WindowsTemp = "Windows\Temp"
$PackageXml = "package-defender.xml"
enum ArchitectureTypes { # Source Dism.Format.ps1xml
x86 = 0
arm = 5
ia64 = 6
x64 = 9
arm64 = 12 #As observed value of DismImageInfo.Architecture returned explicitly.
}
enum InstallationTypes {
Client
Server
}
$messages =
@{
#error messages
ERR_INVALID_SIGNATURE = "Update package ({0}) does not have a valid signature. Redownload the package.";
ERR_UNSUPPORTED_OS_VERSION = "Unsupported Windows OS image (version={0}). Windows 10 {1} or later versions are supported.";
ERR_UNSUPPORTED_OS_UPDATE = "Unsupported Windows 10 version. For Windows 10 RS (Redstone) images, apply the September 2018, or later, update and retry.";
ERR_UNSUPPORTED_ARC_PACKAGE = "Wrong OS architecture for this package. This package supports {0}.";
ERR_UNSUPPORTED_OS_ARC = "Unsupported architecture of OS Image to service.";
ERR_ADD_UPDATE = "Failed to add the Defender update.";
ERR_REMOVE_UPDATE = "Failed to remove the Defender update.";
ERR_NO_UPDATE_TO_REMOVE = "There's no Defender update in this image.";
ERR_SHOW_UPDATE = "ShowUpdate failed";
ERR_COMMAND_MISSING = "Critical command `"{0}`" is missing. Install the required module and try again.";
ERR_WORKINGDIR_NOT_EMPTY = "The input working directory ({0}) is not empty. Clear it or select an empty directory and retry.";
ERR_UPDATE_ALREADY_EXISTS = "This image already contains another Defender update (version={0}). Run RemoveUpdate to clear it and try again";
ERR_FAILED_ENABLE_DEFENDER = "Failed to enable Defender in image ({1}) due to error ({0})."
#info messages
INFO_SERVER_ENABLE_DEFENDER = "Enabling Windows-Defender on the server image.";
INFO_UPDATE_ENGINE_SIGN = "Updating security intelligence and antimalware engine.";
INFO_UPDATE_CAMP = "Updating platform.";
INFO_HANDLELING_LOCALIZATION = "Handling localization for {0}";
INFO_PACKAGE_DETAILS = "Details of Defender update applied to the image are:`n`tDefender package version: {0}`n`tSecurity intelligence version: {1}`n`tEngine version: {2}`n`tPlatform version: {3}";
INFO_DISCARD_IMAGE_UPDATE = "Discarding the changes and returning the OS image to its original state.";
INFO_ADD_UPDATE_SUCCESS = "Successfully updated Defender.";
INFO_REMOVE_UPDATE_SUCCESS = "Successfully removed the Defender update.";
INFO_NO_UPDATE_IN_IMAGE = "This image doesn't have a Defender update applied.";
INFO_IMAGE_UPDATE_DETAILS = "Details of the Defender update package in this image:"
#warnings
}
function ValidateCodeSign([string]$PackageFile)
{
$signInfo = Get-AuthenticodeSignature $PackageFile
if ($signInfo."Status" -ne "Valid") {
Write-Host ($messages.ERR_INVALID_SIGNATURE -f $PackageFile) -ForegroundColor Red
$signInfo | Format-List
$global:LASTEXITCODE = $E_INVALIDPACKAGE
throw ($messages.ERR_INVALID_SIGNATURE -f $PackageFile)
}
}
function IsWindows10RSWith9CorAbove([version]$OsImageVersion)
{
#parse for version fields.
$majorStr,$minorStr,$buildStr,$qfeStr = $OsImageVersion -split "\."
$major = [int]$majorStr
$minor = [int]$minorStr
$build = [int]$buildStr
$qfe = [int]$qfeStr
<#
#Camp update needs Win10 images updated with September security update.
#https://microsoft.visualstudio.com/Windows%20Defender/_git/WD.Client?path=%2Famcore%2FAntimalware%2FSource%2FService%2Fmpupdate%2Fdllmain.cpp&version=GBofficial%2Favmain&line=58&lineEnd=59&lineStartColumn=1&lineEndColumn=1&lineStyle=plain
#>
if (($major -gt 10) -or <#Future #>
(($major -eq 10) -and ($minor -gt 0)) -or <#Future #>
(($major -eq 10) -and ($minor -eq 0) -and ($build -ge 17763)) -or <#RS5 and greater #>
(($major -eq 10) -and ($minor -eq 0) -and ($build -eq 17134) -and ($qfe -ge 320)) -or <#RS4: 17134.320 - https://support.microsoft.com/en-us/help/4458469 #>
(($major -eq 10) -and ($minor -eq 0) -and ($build -eq 16299) -and ($qfe -ge 699)) -or <#RS3: 16299.699 - https://support.microsoft.com/en-us/help/4457136 #>
(($major -eq 10) -and ($minor -eq 0) -and ($build -eq 15063) -and ($qfe -ge 1356)) -or <#RS2: 15063.1356 - https://support.microsoft.com/en-us/help/4457141 #>
(($major -eq 10) -and ($minor -eq 0) -and ($build -eq 14393) -and ($qfe -ge 2515)) <#RS1: 14393.2515 https://support.microsoft.com/en-us/help/4457127 #>
){
return $true
}
return $false
}
function Get-PackageDetailsFromXml([string]$XmlPath)
{
if (!(Test-Path -Path $XmlPath)) {
$global:LASTEXITCODE = $E_INVALIDPATH
throw "Invalid path $XmlPath"
}
[xml]$xmlDoc = Get-Content -Path $XmlPath
$pkgDetails = @{Architecture = $xmlDoc.packageinfo.arch;
PackageVersion = $xmlDoc.packageinfo.versions.defender;
CampVersion = $xmlDoc.packageinfo.versions.platform;
EngineVersion = $xmlDoc.packageinfo.versions.engine;
SignatureVersion = $xmlDoc.packageinfo.versions.signatures}
return $pkgDetails
}
function ValidateCompatibility([version]$OsVersion, [string]$OsArchitecture, [string]$PackageRoot)
{
# Architecture Check
$pkgXmlPath = Join-Path -Path $PackageRoot -ChildPath $PackageXml
$pkgDetails = Get-PackageDetailsFromXml -XmlPath $pkgXmlPath
$pkgArc = $pkgDetails.Architecture
if ($pkgArc -notmatch $OsArchitecture) {
$global:LASTEXITCODE = $E_INVALIDINPUT
throw ($messages.ERR_UNSUPPORTED_ARC_PACKAGE -f $pkgArc)
}
# Win10 RS1 and later are only supported.
# parse for version fields & compare.
$major,$minor,$build,$qfe = $OsVersion -split "\."
if (!(($major -eq 10) -and ($minor -eq 0) -and ([int]$build -ge 14393))) { #Win10 RS1 or later.
$global:LASTEXITCODE = $E_UNSUPPORTED
throw ($messages.ERR_UNSUPPORTED_OS_VERSION -f $OsVersion, "RS1")
}
# Win10 RS 9c check.
if (!(IsWindows10RSWith9CorAbove($OsVersion))) {
$global:LASTEXITCODE = $E_UNSUPPORTED
throw ($messages.ERR_UNSUPPORTED_OS_UPDATE -f $OsVersion)
}
# All checks passed.
return $S_OK
}
function Add-Update([string]$WorkingDir, [string]$Image, [string]$PkgFile)
{
# Validate DISM package Code signing information
ValidateCodeSign -PackageFile $PkgFile
# Validate Working Directory
if (Test-Path -path $WorkingDir) {
if (!(Get-ChildItem $WorkingDir | Measure-Object).Count -eq 0) {
$global:LASTEXITCODE = $E_INVALIDINPUT
throw ($messages.ERR_WORKINGDIR_NOT_EMPTY -f $WorkingDir)
}
}
# Get Windows Image Metadata object & refer its properties.
$imageInfo = Get-WindowsImage -ImagePath $Image -Index $ImageIndex
$osVersion = $imageInfo.Version
$installationType = $imageInfo.InstallationType
$languages = $imageInfo.Languages
$arch = ""
if ($imageInfo.Architecture -eq [ArchitectureTypes]::x64) {
$arch = "amd64"
}
elseif ($imageInfo.Architecture -eq [ArchitectureTypes]::x86) {
$arch = "x86"
}
elseif ($imageInfo.Architecture -eq [ArchitectureTypes]::arm64) {
$arch = "arm64"
}
else
{
Write-Host $messages.ERR_UNSUPPORTED_OS_ARC -ForegroundColor Red
$global:LASTEXITCODE = $E_UNSUPPORTED
throw $messages.ERR_UNSUPPORTED_OS_ARC
}
$mountPoint = Join-Path -Path $WorkingDir -ChildPath "os"
New-Item -itemtype directory -path $mountPoint | Out-Null
try {
# Extract Cab
$cabContent = Join-Path -Path $WorkingDir -ChildPath "cab"
New-Item -itemtype directory -path $cabContent | Out-Null
expand $PkgFile -F:* $cabContent
ValidateCompatibility -OsVersion $osVersion -OsArchitecture $arch -PackageRoot $cabContent
} catch {
Write-Host $messages.ERR_ADD_UPDATE -ForegroundColor Red
Write-Host $_ -ForegroundColor Yellow
Write-Host $_.ScriptStackTrace -ForegroundColor Yellow
Remove-Item -Path "$WorkingDir\*" -Recurse
throw
}
try {
Mount-WindowsImage -ImagePath $Image -Index $ImageIndex -Path $mountPoint | Out-Null
# Check if there exists any update already applied.
$installedPkgXml = Join-Path -Path $mountPoint -ChildPath $WindowsTemp | Join-Path -ChildPath $PackageXml
if (Test-Path -Path $installedPkgXml) {
# Get package details
$pkgDetails = Get-PackageDetailsFromXml -XmlPath $installedPkgXml
$global:LASTEXITCODE = $E_INVALIDINPUT
throw ($messages.ERR_UPDATE_ALREADY_EXISTS -f $pkgDetails.PackageVersion)
}
# Server images need explicit enablement of defender feature.
if ($installationType -eq [InstallationTypes]::Server) {
$defenderFeatureState = Get-WindowsOptionalFeature -FeatureName "Windows-Defender" -Path $mountPoint
if ($defenderFeatureState.State -ne "Enabled") {
Write-Host ($messages.INFO_SERVER_ENABLE_DEFENDER) -ForegroundColor Yellow
Enable-WindowsOptionalFeature -Path $mountPoint -FeatureName "Windows-Defender"
if ($LASTEXITCODE -ne 0) {
$global:LASTEXITCODE = $E_FAIL
throw ($messages.ERR_FAILED_ENABLE_DEFENDER -f $LASTEXITCODE, $PkgFile)
}
}
}
# Definition updates
Write-Host ($messages.INFO_UPDATE_ENGINE_SIGN) -ForegroundColor Yellow
$defSrc = Join-Path -Path $cabContent -ChildPath "Definition Updates\Updates"
$defTarget = Join-Path -Path $mountPoint -ChildPath $DefinitionsUpdatesLocation
if (!(Test-Path -Path $defTarget)) { New-Item -itemtype directory -path $defTarget | Out-Null }
Copy-Item -Path "$defSrc\*" -Destination $defTarget -Recurse
# Platform updates
Write-Host ($messages.INFO_UPDATE_CAMP) -ForegroundColor Yellow
$campSrc = Join-Path -Path $cabContent -ChildPath "Platform"
$campTarget = Join-Path -Path $mountPoint -ChildPath $PlatformLocation
if (!(Test-Path -Path $campTarget)) { New-Item -itemtype directory -path $campTarget | Out-Null }
Copy-Item -Path "$campSrc\*" -Destination $campTarget -Recurse
$campVersionFolder = Join-Path -Path $cabContent -ChildPath "Platform"
$campVersionFolder = Get-ChildItem -Path $campVersionFolder -Directory -Name
# Add Package Xml to Windows\Temp.
$temp = Join-Path -Path $mountPoint -ChildPath $WindowsTemp
$pkgXmlPath = Join-Path -Path $cabContent -ChildPath $PackageXml
Copy-Item -Path $pkgXmlPath -Destination $temp
# UnMount Image
Dismount-WindowsImage -Path $mountPoint -Save | Out-Null
Write-Host ($messages.INFO_ADD_UPDATE_SUCCESS) -ForegroundColor Green
# Get package details to display
$pkgDetails = Get-PackageDetailsFromXml -XmlPath $pkgXmlPath
Write-Host ($messages.INFO_PACKAGE_DETAILS -f $pkgDetails.PackageVersion, $pkgDetails.SignatureVersion, $pkgDetails.EngineVersion, $pkgDetails.CampVersion) -ForegroundColor Yellow
$global:LASTEXITCODE = $S_OK
} catch {
Write-Host ($messages.ERR_ADD_UPDATE) -ForegroundColor Red
Write-Host $_ -ForegroundColor Yellow
Write-Host $_.ScriptStackTrace -ForegroundColor Yellow
Write-Host ($messages.INFO_DISCARD_IMAGE_UPDATE)
Dismount-WindowsImage -Path $mountPoint -Discard | Out-Null
throw
} finally {
Remove-Item -Path "$WorkingDir\*" -Recurse
}
}
function Remove-Update([string]$WorkingDir, [string]$Image)
{
try {
# Validate Working Directory
if (Test-Path -path $WorkingDir) {
if (!(Get-ChildItem $WorkingDir | Measure-Object).Count -eq 0) {
$global:LASTEXITCODE = $E_INVALIDINPUT
throw ($messages.ERR_WORKINGDIR_NOT_EMPTY -f $WorkingDir)
}
}
$mountPoint = Join-Path -Path $WorkingDir -ChildPath "os"
New-Item -itemtype directory -path $mountPoint | Out-Null
Mount-WindowsImage -ImagePath $Image -Index $ImageIndex -Path $mountPoint | Out-Null
# Check if there exists any update already applied.
$installedPkgXml = Join-Path -Path $mountPoint -ChildPath $WindowsTemp | Join-Path -ChildPath $PackageXml
if (!(Test-Path -Path $installedPkgXml)) {
$global:LASTEXITCODE = $E_INVALIDINPUT
throw $messages.ERR_NO_UPDATE_TO_REMOVE
}
# Clear Definition Updates\Updates folder contents
$defTarget = Join-Path -Path $mountPoint -ChildPath $DefinitionsUpdatesLocation
Remove-Item -Path "$defTarget\*" -Recurse
# Clear the camp (Platform) folder content.
$campTarget = Join-Path -Path $mountPoint -ChildPath $PlatformLocation
Remove-Item -Path "$campTarget\*" -Recurse
# Remove Package Xml
Remove-Item -Path $installedPkgXml
# UnMount Image
Dismount-WindowsImage -Path $mountPoint -Save | Out-Null
Write-Host ($messages.INFO_REMOVE_UPDATE_SUCCESS) -ForegroundColor Green
$global:LASTEXITCODE = $S_OK
} catch {
Write-Host ($messages.ERR_REMOVE_UPDATE) -ForegroundColor Red
Write-Host $_ -ForegroundColor Yellow
Write-Host $_.ScriptStackTrace -ForegroundColor Yellow
Write-Host ($messages.INFO_DISCARD_IMAGE_UPDATE)
Dismount-WindowsImage -Path $mountPoint -Discard | Out-Null
throw
} finally {
Remove-Item -Path "$WorkingDir\*" -Recurse
}
}
function Show-Update([string]$WorkingDir, [string]$Image)
{
try {
# Validate Working Directory
if (Test-Path -path $WorkingDir) {
if (!(Get-ChildItem $WorkingDir | Measure-Object).Count -eq 0) {
$global:LASTEXITCODE = $E_INVALIDINPUT
throw ($messages.ERR_WORKINGDIR_NOT_EMPTY -f $WorkingDir)
}
}
$mountPoint = Join-Path -Path $WorkingDir -ChildPath "os"
New-Item -itemtype directory -path $mountPoint | Out-Null
Mount-WindowsImage -ImagePath $Image -Index $ImageIndex -Path $mountPoint | Out-Null
# Check if there exists any update already applied.
$installedPkgXml = Join-Path -Path $mountPoint -ChildPath $WindowsTemp | Join-Path -ChildPath $PackageXml
if (!(Test-Path -Path $installedPkgXml)) {
Write-Host ($messages.INFO_NO_UPDATE_IN_IMAGE) -ForegroundColor Yellow
} else {
# Get package details to output.
$pkgDetails = Get-PackageDetailsFromXml -XmlPath $installedPkgXml
Write-Host ($messages.INFO_PACKAGE_DETAILS -f $pkgDetails.PackageVersion, $pkgDetails.SignatureVersion, $pkgDetails.EngineVersion, $pkgDetails.CampVersion) -ForegroundColor Yellow
}
# UnMount Image
Dismount-WindowsImage -Path $mountPoint -Discard | Out-Null
$global:LASTEXITCODE = $S_OK
} catch {
Write-Host ($messages.ERR_SHOW_UPDATE) -ForegroundColor Red
Write-Host $_ -ForegroundColor Yellow
Write-Host $_.ScriptStackTrace -ForegroundColor Yellow
Write-Host ($messages.INFO_DISCARD_IMAGE_UPDATE)
Dismount-WindowsImage -Path $mountPoint -Discard | Out-Null
$global:LASTEXITCODE = $E_FAIL
throw
} finally {
Remove-Item -Path "$WorkingDir\*" -Recurse
}
}
# Check for presense of expand command.
try {
Get-Command expand | Out-Null
} catch {
Write-Host ($messages.ERR_COMMAND_MISSING -f "expand") -ForegroundColor Red
$global:LASTEXITCODE = $E_COMMANDMISSING
exit
}
Write-Host "Os Image Path : $ImagePath" -ForegroundColor Gray
Write-Host "Working Directory : $WorkingDirectory" -ForegroundColor Gray
Write-Host "Action : $Action" -ForegroundColor Gray
switch ($Action) {
"AddUpdate" {
if ([string]::IsNullOrEmpty($Package)) {
$global:LASTEXITCODE = $E_INVALIDINPUT
throw "Invalid input: Package"
}
Add-Update -WorkingDir $WorkingDirectory -Image $ImagePath -PkgFile $Package
}
"RemoveUpdate" {
Remove-Update -WorkingDir $WorkingDirectory -Image $ImagePath
}
"ShowUpdate" {
Show-Update -WorkingDir $WorkingDirectory -Image $ImagePath
}
Default {
$global:LASTEXITCODE = $E_INVALIDOPERATION
throw "Invalid Action requested."
}
}
# SIG # Begin signature block
# MIImewYJKoZIhvcNAQcCoIImbDCCJmgCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBuB3LvQZq4RXf7
# RQgWg6elhDtwUlPlQMW3v0srO3WM+6CCC2cwggTvMIID16ADAgECAhMzAAAFo/Gd
# RD8zE11OAAAAAAWjMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p
# bmcgUENBIDIwMTAwHhcNMjQwODIyMTkyNTU0WhcNMjUwNzA1MTkyNTU0WjB0MQsw
# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
# AQC1cDDecW3JNN1Gif6PC6VFWoXn2rznwhA4fPd16YBOerR0sRpoUfOctESE0bmf
# mXl/wkxMFlcQhpH8EjfVzb5VIDOysiR8uC4hIZ52wN7iqDcdyal7FavUc/WgxdJl
# T4pEvQbunrVU5RYOCAklLcsS8Aw0VuMe7AVqkUvNRmyDS8/+TfjIKTOh31ItgwHT
# hb7aXXp18bRC2xDYq19dFmd4OELCWyNLz1UrJfiveRrvxtlaX2l3/oAXyvsoNA99
# xdogGPqcd22ovkXAuD/dZ3yyJfVCg7guFmtS3xzegJauqigwdQ7g9Qdmmj9cNa1T
# oK7f1B4k7BBWDp0larpvOgYzAgMBAAGjggFuMIIBajAfBgNVHSUEGDAWBgorBgEE
# AYI3CgMVBggrBgEFBQcDAzAdBgNVHQ4EFgQUS+mEzSyidPYsop8Mq5cLkiHygDcw
# RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW
# MBQGA1UEBRMNMjI5ODYxKzUwMjc4ODAfBgNVHSMEGDAWgBTm/F97uyIAWORyTrX0
# IXQjMubvrDBWBgNVHR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5j
# b20vcGtpL2NybC9wcm9kdWN0cy9NaWNDb2RTaWdQQ0FfMjAxMC0wNy0wNi5jcmww
# WgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29m
# dC5jb20vcGtpL2NlcnRzL01pY0NvZFNpZ1BDQV8yMDEwLTA3LTA2LmNydDAMBgNV
# HRMBAf8EAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQB4A/zCKXXJzW6/0Do56PTFNyyV
# d2tHkRjTPSaQCqzTpjTX8cKGYsvXpmgxdQJ8Ey2upxOOLxT2bOH4MQKJf0cTUfSx
# CoIGGnHPfrXNFQVPOGmMOAWq0fGRfXmVyVVfd6hOY0Fg6bV9BR3hyjx/gUzfdYxL
# mPG/3jw4GD4wQkokVskQXPOqlMbkbn9Mt3vdNEMNitPISxHTrbTb7N2EJ7eiE4Hg
# +lzn+jxe6y0xMIEm6hBxuvfjr0KOspMFLsstBqNxEH5FF+CgGiPwQtbb5QFZ8pLl
# ivddZRABtbcJez3a2FL+kAYnzQ+3pL4G45jelG12YTJvJ9EcVt2xr9QMqeTdMIIG
# cDCCBFigAwIBAgIKYQxSTAAAAAAAAzANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UE
# BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc
# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0
# IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTAwHhcNMTAwNzA2MjA0MDE3
# WhcNMjUwNzA2MjA1MDE3WjB+MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu
# Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv
# cmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQgQ29kZSBTaWduaW5nIFBDQSAyMDEw
# MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6Q5kUHlntcTj/QkATJ6U
# rPdWaOpE2M/FWE+ppXZ8bUW60zmStKQe+fllguQX0o/9RJwI6GWTzixVhL99COMu
# K6hBKxi3oktuSUxrFQfe0dLCiR5xlM21f0u0rwjYzIjWaxeUOpPOJj/s5v40mFfV
# HV1J9rIqLtWFu1k/+JC0K4N0yiuzO0bj8EZJwRdmVMkcvR3EVWJXcvhnuSUgNN5d
# pqWVXqsogM3Vsp7lA7Vj07IUyMHIiiYKWX8H7P8O7YASNUwSpr5SW/Wm2uCLC0h3
# 1oVH1RC5xuiq7otqLQVcYMa0KlucIxxfReMaFB5vN8sZM4BqiU2jamZjeJPVMM+V
# HwIDAQABo4IB4zCCAd8wEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFOb8X3u7
# IgBY5HJOtfQhdCMy5u+sMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1Ud
# DwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNX2VsuP6KJcYmjR
# PZSQW9fOmhjEMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwubWljcm9zb2Z0
# LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNy
# bDBaBggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93d3cubWljcm9z
# b2Z0LmNvbS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3J0MIGd
# BgNVHSAEgZUwgZIwgY8GCSsGAQQBgjcuAzCBgTA9BggrBgEFBQcCARYxaHR0cDov
# L3d3dy5taWNyb3NvZnQuY29tL1BLSS9kb2NzL0NQUy9kZWZhdWx0Lmh0bTBABggr
# BgEFBQcCAjA0HjIgHQBMAGUAZwBhAGwAXwBQAG8AbABpAGMAeQBfAFMAdABhAHQA
# ZQBtAGUAbgB0AC4gHTANBgkqhkiG9w0BAQsFAAOCAgEAGnTvV08pe8QWhXi4UNMi
# /AmdrIKX+DT/KiyXlRLl5L/Pv5PI4zSp24G43B4AvtI1b6/lf3mVd+UC1PHr2M1O
# HhthosJaIxrwjKhiUUVnCOM/PB6T+DCFF8g5QKbXDrMhKeWloWmMIpPMdJjnoUdD
# 8lOswA8waX/+0iUgbW9h098H1dlyACxphnY9UdumOUjJN2FtB91TGcun1mHCv+KD
# qw/ga5uV1n0oUbCJSlGkmmzItx9KGg5pqdfcwX7RSXCqtq27ckdjF/qm1qKmhuyo
# EESbY7ayaYkGx0aGehg/6MUdIdV7+QIjLcVBy78dTMgW77Gcf/wiS0mKbhXjpn92
# W9FTeZGFndXS2z1zNfM8rlSyUkdqwKoTldKOEdqZZ14yjPs3hdHcdYWch8ZaV4XC
# v90Nj4ybLeu07s8n07VeafqkFgQBpyRnc89NT7beBVaXevfpUk30dwVPhcbYC/GO
# 7UIJ0Q124yNWeCImNr7KsYxuqh3khdpHM2KPpMmRM19xHkCvmGXJIuhCISWKHC1g
# 2TeJQYkqFg/XYTyUaGBS79ZHmaCAQO4VgXc+nOBTGBpQHTiVmx5mMxMnORd4hzbO
# TsNfsvU9R1O24OXbC2E9KteSLM43Wj5AQjGkHxAIwlacvyRdUQKdannSF9PawZSO
# B3slcUSrBmrm1MbfI5qWdcUxghpqMIIaZgIBATCBlTB+MQswCQYDVQQGEwJVUzET
# MBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMV
# TWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQgQ29kZSBT
# aWduaW5nIFBDQSAyMDEwAhMzAAAFo/GdRD8zE11OAAAAAAWjMA0GCWCGSAFlAwQC
# AQUAoIH1MBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsx
# DjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCAqecfT/lGWXG4zoN2QkwKH
# GSmLEoj9k/xtS1uNSdRNCzCBiAYKKwYBBAGCNwIBDDF6MHigWoBYAE0AaQBjAHIA
# bwBzAG8AZgB0ACAAKABSACkAIABBAG4AdABpAC0ATQBhAGwAdwBhAHIAZQAgAFMA
# aQBnAG4AYQB0AHUAcgBlACAAUABhAGMAawBhAGcAZaEagBhodHRwOi8vd3d3Lm1p
# Y3Jvc29mdC5jb20wDQYJKoZIhvcNAQEBBQAEggEAALat/n3kFxd4NEzlx+NcgWe5
# FfKX5xnsvGGRGh6D8tPxinZ+x9dH9C1YLFv6p9vUV6bLS0NcExP8001b9BEP1In2
# J9l67DG2SRbpzWCVsEJMyvrEP1Pn+cGXY9hiVoDL6MKZSe7IIIpBPVUC7D8cTNvr
# Qm5wwh1QKwi8iU0PHBFy8DhD1A/g6HmcBaD+AiBSmHAWgrGbR/HZaLgOY4roEA9J
# 95ss6c4MdcxtAivCrUX078l15Hl1OJhlRtGolCa/DSwlM852vK7yvY4SKDlfD5/L
# QMphtVkHD0gSOYGQetUT2nJOll0nNPhMOa6YrMK7lkqi30hWXGWwOp0PmGAnWaGC
# F60wghepBgorBgEEAYI3AwMBMYIXmTCCF5UGCSqGSIb3DQEHAqCCF4YwgheCAgED
# MQ8wDQYJYIZIAWUDBAIBBQAwggFaBgsqhkiG9w0BCRABBKCCAUkEggFFMIIBQQIB
# AQYKKwYBBAGEWQoDATAxMA0GCWCGSAFlAwQCAQUABCAzdaieVUllztR7SZgFV5xo
# yL2GXckgRVH13LZoFZTK5AIGZ7+/vNE3GBMyMDI1MDMwODAwMDQzNy45MTJaMASA
# AgH0oIHZpIHWMIHTMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ
# MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
# MS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQx
# JzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo2NTFBLTA1RTAtRDk0NzElMCMGA1UE
# AxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaCCEfswggcoMIIFEKADAgEC
# AhMzAAAB9ZkJlLzxxlCMAAEAAAH1MA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYT
# AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBU
# aW1lLVN0YW1wIFBDQSAyMDEwMB4XDTI0MDcyNTE4MzEwMVoXDTI1MTAyMjE4MzEw
# MVowgdMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH
# EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNV
# BAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UE
# CxMeblNoaWVsZCBUU1MgRVNOOjY1MUEtMDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNy
# b3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
# MIICCgKCAgEAzO90cFQTWd/WP84IT7JMIW1fQL61sdfgmhlfT0nvYEb2kvkNF073
# ZwjveuSWot387LjE0TCiG93e6I0HzIFQBnbxGP/WPBUirFq7WE5RAsuhNfYUL+PI
# b9jJq3CwWxICfw5t/pTyIOHjKvo1lQOTWZypir/psZwEE7y2uWAPbZJTFrKen5R7
# 3x2Hbxy4eW1DcmXjym2wFWv10sBH40ajJfe+OkwcTdoYrY3KkpN/RQSjeycK0bhj
# o0CGYIYa+ZMAao0SNR/R1J1Y6sLkiCJO3aQrbS1Sz7l+/qJgy8fyEZMND5Ms7C0s
# EaOvoBHiWSpTM4vc0xDLCmc6PGv03CtWu2KiyqrL8BAB1EYyOShI3IT79arDIDrL
# +de91FfjmSbBY5j+HvS0l3dXkjP3Hon8b74lWwikF0rzErF0n3khVAusx7Sm1oGG
# +06hz9XAy3Wou+T6Se6oa5LDiQgPTfWR/j9FNk8Ju06oSfTh6c03V0ulla0Iwy+H
# zUl+WmYxFLU0PiaXsmgudNwVqn51zr+Bi3XPJ85wWuy6GGT7nBDmXNzTNkzK98DB
# QjTOabQXUZ884Yb9DFNcigmeVTYkyUXZ6hscd8Nyq45A3D3bk+nXnsogK1Z7zZj6
# XbGft7xgOYvveU6p0+frthbF7MXv+i5qcD9HfFmOq4VYHevVesYb6P0CAwEAAaOC
# AUkwggFFMB0GA1UdDgQWBBRV4Hxb9Uo0oHDwJZJe22ixe2B1ATAfBgNVHSMEGDAW
# gBSfpxVdAF5iXYP05dJlpxtTNRnpcjBfBgNVHR8EWDBWMFSgUqBQhk5odHRwOi8v
# d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBUaW1lLVN0
# YW1wJTIwUENBJTIwMjAxMCgxKS5jcmwwbAYIKwYBBQUHAQEEYDBeMFwGCCsGAQUF
# BzAChlBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jv
# c29mdCUyMFRpbWUtU3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNydDAMBgNVHRMBAf8E
# AjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDANBgkq
# hkiG9w0BAQsFAAOCAgEAcwxmVPaA9xHffuom0TOSp2hspuf1G0cHW/KXHAuhnpW8
# /Svlq5j9aKI/8/G6fGIQMr0zlpau8jy83I4zclGdJjl5S02SxDlUKawtWvgf7ida
# 06PgjeQM1eX4Lut4bbPfT0FEp77G76hhysXxTJNHv5y+fwThUeiiclihZwqcZMpa
# 46m+oV6igTU6I0EnneotMqFs0Q3zHgVVr4WXjnG2Bcnkip42edyg/9iXczqTBrEk
# vTz0UlltpFGaQnLzq+No8VEgq0UG7W1ELZGhmmxFmHABwTT6sPJFV68DfLoC0iB9
# Qbb9VZ8mvbTV5JtISBklTuVAlEkzXi9LIjNmx+kndBfKP8dxG/xbRXptQDQDaCsS
# 6ogLkwLgH6zSs+ul9WmzI0F8zImbhnZhUziIHheFo4H+ZoojPYcgTK6/3bkSbOab
# mQFf95B8B6e5WqXbS5s9OdMdUlW1gTI1r5u+WAwH2KG7dxneoTbf/jYl3TUtP7AH
# pyck2c0nun/Q0Cycpa9QUH/Dy01k6tQomNXGjivg2/BGcgZJ0Hw8C6KVelEJ31xL
# oE21m9+NEgSKCRoFE1Lkma31SyIaynbdYEb8sOlZynMdm8yPldDwuF54vJiEArjr
# cDNXe6BobZUiTWSKvv1DJadR1SUCO/Od21GgU+hZqu+dKgjKAYdeTIvi9R2rtLYw
# ggdxMIIFWaADAgECAhMzAAAAFcXna54Cm0mZAAAAAAAVMA0GCSqGSIb3DQEBCwUA
# MIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH
# UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQD
# EylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAxMDAeFw0y
# MTA5MzAxODIyMjVaFw0zMDA5MzAxODMyMjVaMHwxCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1w
# IFBDQSAyMDEwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA5OGmTOe0
# ciELeaLL1yR5vQ7VgtP97pwHB9KpbE51yMo1V/YBf2xK4OK9uT4XYDP/XE/HZveV
# U3Fa4n5KWv64NmeFRiMMtY0Tz3cywBAY6GB9alKDRLemjkZrBxTzxXb1hlDcwUTI
# cVxRMTegCjhuje3XD9gmU3w5YQJ6xKr9cmmvHaus9ja+NSZk2pg7uhp7M62AW36M
# EBydUv626GIl3GoPz130/o5Tz9bshVZN7928jaTjkY+yOSxRnOlwaQ3KNi1wjjHI
# NSi947SHJMPgyY9+tVSP3PoFVZhtaDuaRr3tpK56KTesy+uDRedGbsoy1cCGMFxP
# LOJiss254o2I5JasAUq7vnGpF1tnYN74kpEeHT39IM9zfUGaRnXNxF803RKJ1v2l
# IH1+/NmeRd+2ci/bfV+AutuqfjbsNkz2K26oElHovwUDo9Fzpk03dJQcNIIP8BDy
# t0cY7afomXw/TNuvXsLz1dhzPUNOwTM5TI4CvEJoLhDqhFFG4tG9ahhaYQFzymei
# XtcodgLiMxhy16cg8ML6EgrXY28MyTZki1ugpoMhXV8wdJGUlNi5UPkLiWHzNgY1
# GIRH29wb0f2y1BzFa/ZcUlFdEtsluq9QBXpsxREdcu+N+VLEhReTwDwV2xo3xwgV
# GD94q0W29R6HXtqPnhZyacaue7e3PmriLq0CAwEAAaOCAd0wggHZMBIGCSsGAQQB
# gjcVAQQFAgMBAAEwIwYJKwYBBAGCNxUCBBYEFCqnUv5kxJq+gpE8RjUpzxD/LwTu
# MB0GA1UdDgQWBBSfpxVdAF5iXYP05dJlpxtTNRnpcjBcBgNVHSAEVTBTMFEGDCsG
# AQQBgjdMg30BATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j
# b20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wEwYDVR0lBAwwCgYIKwYBBQUH
# AwgwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
# EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYD
# VR0fBE8wTTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwv
# cHJvZHVjdHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEB
# BE4wTDBKBggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9j
# ZXJ0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwDQYJKoZIhvcNAQELBQAD
# ggIBAJ1VffwqreEsH2cBMSRb4Z5yS/ypb+pcFLY+TkdkeLEGk5c9MTO1OdfCcTY/
# 2mRsfNB1OW27DzHkwo/7bNGhlBgi7ulmZzpTTd2YurYeeNg2LpypglYAA7AFvono
# aeC6Ce5732pvvinLbtg/SHUB2RjebYIM9W0jVOR4U3UkV7ndn/OOPcbzaN9l9qRW
# qveVtihVJ9AkvUCgvxm2EhIRXT0n4ECWOKz3+SmJw7wXsFSFQrP8DJ6LGYnn8Atq
# gcKBGUIZUnWKNsIdw2FzLixre24/LAl4FOmRsqlb30mjdAy87JGA0j3mSj5mO0+7
# hvoyGtmW9I/2kQH2zsZ0/fZMcm8Qq3UwxTSwethQ/gpY3UA8x1RtnWN0SCyxTkct
# wRQEcb9k+SS+c23Kjgm9swFXSVRk2XPXfx5bRAGOWhmRaw2fpCjcZxkoJLo4S5pu
# +yFUa2pFEUep8beuyOiJXk+d0tBMdrVXVAmxaQFEfnyhYWxz/gq77EFmPWn9y8FB
# SX5+k77L+DvktxW/tM4+pTFRhLy/AsGConsXHRWJjXD+57XQKBqJC4822rpM+Zv/
# Cuk0+CQ1ZyvgDbjmjJnW4SLq8CdCPSWU5nR0W2rRnj7tfqAxM328y+l7vzhwRNGQ
# 8cirOoo6CGJ/2XBjU02N7oJtpQUQwXEGahC0HVUzWLOhcGbyoYIDVjCCAj4CAQEw
# ggEBoYHZpIHWMIHTMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ
# MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
# MS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQx
# JzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo2NTFBLTA1RTAtRDk0NzElMCMGA1UE
# AxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaIjCgEBMAcGBSsOAwIaAxUA
# JsAKu48NbR5YRg3WSBQCyjzdkvaggYMwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEG
# A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj
# cm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFt
# cCBQQ0EgMjAxMDANBgkqhkiG9w0BAQsFAAIFAOt1cj0wIhgPMjAyNTAzMDcxMzI1
# MTdaGA8yMDI1MDMwODEzMjUxN1owdDA6BgorBgEEAYRZCgQBMSwwKjAKAgUA63Vy
# PQIBADAHAgEAAgIF8DAHAgEAAgITZDAKAgUA63bDvQIBADA2BgorBgEEAYRZCgQC
# MSgwJjAMBgorBgEEAYRZCgMCoAowCAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqG
# SIb3DQEBCwUAA4IBAQCZ7bvvqL684p88hSUxGNaeEv2MbyjxLIQKUPnxyR0Z7ye7
# oKgwgXDWrYIc+MiVPmNW4p3krKMOlh3l874p1G6z0vll0THnK5fwizpd2QxjB21A
# H3sMbRxveThUry0mqETbGlYQkKOElCJgwGd2wWSjLs/7U8sgfRRgDDPyNPZWkLSk
# vnuS6R3KIRZOMyD0KBcHUqVdSOl8rx7EsKTcsyjZb04UZsvqXYfQyL5yV8Ud41MY
# CxX3mGNKU/hDjyQwQWtTmanKOtRLWNUtOwc+Q9EWqe4oXGPwZlFC02Ji/MO55Wsc
# o015DDQjokdpueC1qWDydjGlUfk0fluLhPdZF0HKMYIEDTCCBAkCAQEwgZMwfDEL
# MAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1v
# bmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWlj
# cm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAAH1mQmUvPHGUIwAAQAAAfUw
# DQYJYIZIAWUDBAIBBQCgggFKMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAv
# BgkqhkiG9w0BCQQxIgQgL7TKNEM1CtBGH5sWUhuW7qF9WXCkZMzi7c+kAvhh8mcw
# gfoGCyqGSIb3DQEJEAIvMYHqMIHnMIHkMIG9BCDB1vLSFwh09ISu4kdEv4/tg9eR
# 1Yk8w5x7j5GThqaPNTCBmDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX
# YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg
# Q29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAy
# MDEwAhMzAAAB9ZkJlLzxxlCMAAEAAAH1MCIEIM+j+PuV8Za2KhCMG1QyAmlzy3QL
# gMaNl//HvTqG8NyZMA0GCSqGSIb3DQEBCwUABIICADWDlkhkvyvV9FklwoZ0YyW+
# DUcnrMSw1HFWnKaLVbO2By/PpLTB8fGFq6e7ZpDy5z3c1Ou7KT9p5Dk44o7Npabx
# LJJlxxK9ry/Zkk3JtNiYERKAZS0gaCSR8aAQubXx46H5t9pOzQDIJ8iZrnD993v1
# J4QaREBUdHgD4Ia7xlMcFOan5dpZ5awV7rqlPYcu+NTRX1lV4M8mHs08Pzn+TFeA
# ZIL9QsActF0TCX+523+3WnlcLERg/c/fOcJerswz9FThwy9taEBV9MYUJ3QM0IBQ
# x8rLef5pjH4K/Tl6jLGW3JHULmD8xmwi+6zF0BThxYedzbZWdrKpxRnZKmOzBZ7s
# jDEb2CcgmPmCTmUDq6HCxMz37awKGEgAXj0LpfiCIsGau0j/5Wmk6iG5OLuSS77D
# A4muqjwwThzGgZLGgqkIDhv7liHpFgvMAq8kb48lZ3LMy4TOlFjkPuCW1g3IHvmY
# FZLVe7drTGRHjZIMYAEMad67B+6DP0KIObiSKC/Boq5K4Xh7GI2JC30+ki3VQ0Uo
# Msg7OEH6hRxrrQO2ueEv3PTZ1VX4WfMcTdD+WItv0/KRiFi65hVGijn+ZZVqTKQH
# D6JPHZc7+skHdyx0GG+qKPyAfUYD6XsE1jdZ9HJw6+Xyy1e/1sSDp12nekjVd1bs
# o/XLPa/S8T217xh/IMbI
# SIG # End signature block