public/Get-IvantiWCRegistry.ps1
|
<#
.SYNOPSIS Reads and parses Ivanti Workspace Control registry sets from a Building Block XML file or a standalone .reg file. .DESCRIPTION Accepts either: - An Ivanti Workspace Control Building Block XML file: extracts every <registry type="registry"> node, decodes the hex-encoded registryfile, and parses it. Name and description are taken from the <name> and <description> XML elements. - A standalone .reg file: parses it directly. Name and description are read from the ;<PFNAME> and ;<PFDESC> comment tags if present. Each value entry is returned as a structured object with its registry hive, key, value name, value data, value type, and an optional per-value description captured from the ;<PF>...</PF> comment tag that may follow the value line. Supports all standard .reg value types: - REG_SZ (quoted string or hex(1):) - REG_EXPAND_SZ (hex(2):) - REG_BINARY (hex: / hex(3):) - REG_DWORD (dword: / hex(4):) - REG_MULTI_SZ (hex(7):) - REG_QWORD (qword: / hex(b):) .PARAMETER Path Path to an Ivanti Workspace Control Building Block XML file or a standalone .reg file. .PARAMETER ExportFor Target export format. 'AppVentiX' adds the AppVentiXParams property to each output object. .EXAMPLE # From a Building Block XML Get-IvantiWCRegistry -Path 'C:\temp\LAB-BB.xml' .EXAMPLE # From a standalone .reg file, exported for AppVentiX Get-IvantiWCRegistry -Path 'C:\temp\registry.reg' -ExportFor AppVentiX .LINK Import-IvantiWCRegistry .NOTES Function : Get-IvantiWCRegistry Author : John Billekens Copyright : (c) John Billekens Consultancy & AppVentiX Version : 2026.0825.1200 #> function Get-IvantiWCRegistry { [CmdletBinding()] param( [Parameter(Mandatory = $true)] [ValidateScript({ Test-Path $_ -PathType Leaf })] [string]$Path, [ValidateSet('AppVentiX', 'WEM')] [string]$ExportFor = 'AppVentiX' ) #region Internal helpers function Convert-HexToString { param([string]$HexString) if ([string]::IsNullOrEmpty($HexString)) { return '' } $bytes = for ($i = 0; $i -lt $HexString.Length; $i += 2) { [System.Convert]::ToByte($HexString.Substring($i, 2), 16) } return [System.Text.Encoding]::GetEncoding(1252).GetString($bytes) } function Convert-RegEscapedString { # .reg string values escape a backslash as \\ and a quote as \". Without this a path # such as "%userprofile%\\Documents" keeps its doubled separators. param([string]$Value) return $Value -replace '\\([\\"])', '$1' } function Convert-RegistryHexToValue { param([string]$hexString, [string]$type) $hexData = $hexString -replace '^hex\(\w+\):', '' -replace '[,\s]', '' if ([string]::IsNullOrEmpty($hexData)) { return $null } try { $bytes = for ($i = 0; $i -lt $hexData.Length; $i += 2) { [System.Convert]::ToByte($hexData.Substring($i, 2), 16) } switch ($type) { 'REG_SZ' { return [System.Text.Encoding]::Unicode.GetString($bytes).TrimEnd([char]0) } 'REG_EXPAND_SZ' { return [System.Text.Encoding]::Unicode.GetString($bytes).TrimEnd([char]0) } 'REG_BINARY' { return [System.BitConverter]::ToString($bytes) } 'REG_DWORD' { if ($bytes.Count -eq 4) { return [System.BitConverter]::ToUInt32($bytes, 0) } return $null } 'REG_MULTI_SZ' { $fullString = [System.Text.Encoding]::Unicode.GetString($bytes) return ($fullString -split '\0' | Where-Object { $_ }) } 'REG_QWORD' { if ($bytes.Count -eq 8) { return [System.BitConverter]::ToUInt64($bytes, 0) } return $null } default { return [System.BitConverter]::ToString($bytes) } } } catch { Write-Warning "Could not decode hex value for type $type. Error: $_" return $hexString } } function ConvertTo-RegistryEntries { param( [string]$Name, [string]$Description, [string]$RegContent, [string]$SourceFile, [bool]$Enabled = $true, [bool]$RunOnce = $false, [string]$ExportFor = 'WEM', [PSCustomObject[]]$Assignments = @() ) $lines = $RegContent.Split([string[]]@("`r`n", "`n", "`r"), [StringSplitOptions]::None) # If name/description not provided, fall back to PFNAME/PFDESC tags in the content $resolvedName = $Name $resolvedDescription = $Description if ([string]::IsNullOrEmpty($resolvedName) -or [string]::IsNullOrEmpty($resolvedDescription)) { foreach ($line in $lines) { if ([string]::IsNullOrEmpty($resolvedName) -and $line -match ';<PFNAME>(.+)</PFNAME>') { $resolvedName = $Matches[1].Trim() } if ([string]::IsNullOrEmpty($resolvedDescription) -and $line -match ';<PFDESC>(.+)</PFDESC>') { $resolvedDescription = $Matches[1].Trim() } if (-not [string]::IsNullOrEmpty($resolvedName) -and -not [string]::IsNullOrEmpty($resolvedDescription)) { break } } } Write-Verbose "Registry set: '$resolvedName' | Description: '$resolvedDescription' | Enabled: '$Enabled' | RunOnce: '$RunOnce'" $entries = [System.Collections.Generic.List[PSCustomObject]]::new() $currentHive = '' $currentKey = '' for ($i = 0; $i -lt $lines.Length; $i++) { $line = $lines[$i] # Section header: [HKEY_...] or ![HKEY_...] (delete entire key) if ($line -match '^(!?)\[((HKEY_[^\\]+)(\\(.+))?)\]$') { $isKeyDeletion = $Matches[1] -eq '!' $sectionHive = $Matches[3] $sectionKey = if ($Matches[5]) { $Matches[5] } else { '' } if ($isKeyDeletion) { # Emit a key-deletion entry; do not update current section context Write-Verbose " Delete key: $sectionHive\$sectionKey" $entries.Add([PSCustomObject]([ordered]@{ RegistryHive = $sectionHive RegistryKey = $sectionKey RegistryKeyPath = if ([string]::IsNullOrEmpty($sectionKey)) { $sectionHive } else { "$sectionHive\$sectionKey" } RegistryValueName = $null Value = $null ValueType = $null Description = '' Delete = $true })) } else { $currentHive = $sectionHive $currentKey = $sectionKey Write-Verbose " Section: $currentHive\$currentKey" } continue } # Skip comments, blank lines, and the editor header if ([string]::IsNullOrWhiteSpace($line) -or $line.StartsWith(';') -or $line.StartsWith('Windows Registry Editor')) { continue } # Skip structural placeholder default values (@="") on keys with no meaningful path # These are Ivanti reg file artifacts — empty-string default values on intermediate keys if ($line -match '^@=""$' -and [string]::IsNullOrEmpty($currentKey)) { continue } # Deletion marker on value: !"ValueName"=... $isDeletion = $false $parsedLine = $line if ($parsedLine.TrimStart().StartsWith('!"')) { $isDeletion = $true $parsedLine = $parsedLine.TrimStart().Substring(1) } $valueName = $null $rawValue = $null if ($parsedLine -match '^"([^"]*)"=(.+)') { $valueName = $Matches[1] $rawValue = $Matches[2].Trim() } elseif ($parsedLine -match '^@=(.+)') { $valueName = '' $rawValue = $Matches[1].Trim() } else { continue } # Skip empty-string default values on intermediate keys (structural artifacts) if ($valueName -eq '' -and $rawValue -eq '""') { continue } # Peek at next line for optional ;<PF>...</PF> per-value description $valueDescription = '' if (($i + 1) -lt $lines.Length -and $lines[$i + 1] -match ';<PF>(.+)</PF>') { $valueDescription = $Matches[1].Trim() } # Decode value data and determine type $registryValue = $null $registryValueType = 'Unknown' if ($rawValue.StartsWith('dword:')) { $registryValueType = 'REG_DWORD' try { $registryValue = [uint64]("0x" + $rawValue.Substring(6)) } catch { $registryValue = $rawValue; $registryValueType = 'Unknown' } } elseif ($rawValue.StartsWith('qword:')) { $registryValueType = 'REG_QWORD' try { $registryValue = [uint64]("0x" + $rawValue.Substring(6)) } catch { $registryValue = $rawValue; $registryValueType = 'Unknown' } } elseif ($rawValue.StartsWith('"') -and $rawValue.EndsWith('"')) { $registryValueType = 'REG_SZ' $registryValue = Convert-RegEscapedString -Value $rawValue.Substring(1, $rawValue.Length - 2) } elseif ($rawValue.StartsWith('hex(1):')) { $registryValueType = 'REG_SZ' $registryValue = Convert-RegistryHexToValue -hexString $rawValue -type 'REG_SZ' } elseif ($rawValue.StartsWith('hex(2):')) { $registryValueType = 'REG_EXPAND_SZ' $registryValue = Convert-RegistryHexToValue -hexString $rawValue -type 'REG_EXPAND_SZ' } elseif ($rawValue.StartsWith('hex(3):') -or $rawValue.StartsWith('hex:')) { $registryValueType = 'REG_BINARY' $registryValue = Convert-RegistryHexToValue -hexString $rawValue -type 'REG_BINARY' } elseif ($rawValue.StartsWith('hex(4):')) { $registryValueType = 'REG_DWORD' $registryValue = Convert-RegistryHexToValue -hexString $rawValue -type 'REG_DWORD' } elseif ($rawValue.StartsWith('hex(7):')) { $registryValueType = 'REG_MULTI_SZ' $registryValue = Convert-RegistryHexToValue -hexString $rawValue -type 'REG_MULTI_SZ' } elseif ($rawValue.StartsWith('hex(b):')) { $registryValueType = 'REG_QWORD' $registryValue = Convert-RegistryHexToValue -hexString $rawValue -type 'REG_QWORD' } else { $registryValueType = 'REG_SZ' $registryValue = $rawValue } $entries.Add( [PSCustomObject]( [PSCustomObject]@{ RegistryHive = $currentHive RegistryKey = $currentKey RegistryKeyPath = if ([string]::IsNullOrEmpty($currentKey)) { $currentHive } else { "$currentHive\$currentKey" } RegistryValueName = $valueName Value = $registryValue ValueType = $registryValueType Description = $valueDescription Delete = $isDeletion } ) ) } Write-Verbose " Parsed $($entries.Count) registry value(s)" $output = [ordered]@{ Name = $resolvedName Description = $resolvedDescription Enabled = $Enabled RunOnce = $RunOnce Entries = $entries.ToArray() SourceFile = $SourceFile } if ($ExportFor -eq 'AppVentiX') { $registryEntries = @( foreach ($entry in $entries) { $deleteKey = $false if ($entry.Delete -eq $true -and [string]::IsNullOrEmpty($entry.RegistryValueName)) { $deleteKey = $true } $valueType = $entry.ValueType if ([string]::IsNullOrEmpty(($valueType))) { $valueType = 'REG_SZ' } [PSCustomObject]@{ RootKey = $entry.RegistryHive KeyPath = $entry.RegistryKey ValueName = $entry.RegistryValueName ValueData = $entry.Value ValueType = $valueType Action = if ($entry.Delete) { 'Remove' } else { 'Set' } DeleteKey = $deleteKey } } ) $output.AppVentiXAssignments = @($Assignments | Select-Object Sid, Name, Type, DomainFQDN) $output.AppVentiXParams = ( [ordered]@{ FriendlyName = $resolvedName Description = $resolvedDescription RegistryEntries = @($registryEntries) } ) } elseif ($ExportFor -eq 'WEM') { Write-Warning "WEM export format is not implemented yet for registry sets!" } [PSCustomObject]$output } #endregion $absolutePath = (Resolve-Path -LiteralPath $Path).Path $extension = [System.IO.Path]::GetExtension($absolutePath).ToLower() if ($extension -eq '.xml') { # Building Block XML — extract all <registry type="registry"> nodes Write-Verbose "Loading Building Block XML: $absolutePath" try { # ConvertFrom-IvantiBB strips <webtop> sections, these contain nested XML declarations that XmlDocument rejects $xmlContent = ConvertFrom-IvantiBB -XmlFilePath $absolutePath } catch { $PSCmdlet.ThrowTerminatingError( [System.Management.Automation.ErrorRecord]::new( [System.Xml.XmlException]::new("Failed to parse XML file '$absolutePath': $($_.Exception.Message)"), 'XmlParseError', [System.Management.Automation.ErrorCategory]::InvalidData, $absolutePath ) ) } $registryNodes = @($xmlContent.GetElementsByTagName('registry') | Where-Object { $_.type -eq 'registry' }) Write-Verbose "Found $($registryNodes.Count) registry set node(s)" if ($registryNodes.Count -eq 0) { Write-Warning "No <registry type='registry'> nodes found in '$absolutePath'" return } foreach ($node in $registryNodes) { $nodeName = $node.name $nodeDescription = $node.description $decodedContent = (Convert-HexToString -HexString $node.registryfile).TrimStart([char]0xFEFF) if ($node.enabled -ieq "yes") { $enabled = $true } else { $enabled = $false } if ($node.runonce -ieq "yes") { $runOnce = $true } else { $runOnce = $false } Write-Verbose "Processing registry set: '$nodeName'" $Assignments = @(ConvertFrom-IvantiAccessControl -AccessControl $node.accesscontrol -IWCComponentName $nodeName -IWCComponent "Policy") ConvertTo-RegistryEntries -Name $nodeName -Description $nodeDescription -RunOnce $runOnce -RegContent $decodedContent -SourceFile $absolutePath -ExportFor $ExportFor -Assignments $Assignments } } else { # Standalone .reg file Write-Verbose "Loading .reg file: $absolutePath" try { $rawContent = Get-Content -LiteralPath $absolutePath -Raw -ErrorAction Stop } catch { $PSCmdlet.ThrowTerminatingError( [System.Management.Automation.ErrorRecord]::new( [System.IO.IOException]::new("Failed to read file '$absolutePath': $($_.Exception.Message)"), 'RegFileReadError', [System.Management.Automation.ErrorCategory]::ReadError, $absolutePath ) ) } ConvertTo-RegistryEntries -Name '' -Description '' -RegContent $rawContent -SourceFile $absolutePath -ExportFor $ExportFor } } # SIG # Begin signature block # MII5ywYJKoZIhvcNAQcCoII5vDCCObgCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBWIpSc9GrdoCqQ # BCQoiTvobBUld9z8TqbbJoAV39nC/aCCIfAwggXMMIIDtKADAgECAhBUmNLR1FsZ # 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 # 03u4aUoqlmZpxJTG9F9urJh4iIAGXKKy7aIwggalMIIEjaADAgECAhMzAAVFa+Mx # nPl8dnBSAAAABUVrMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ # RCBWZXJpZmllZCBDUyBBT0MgQ0EgMDMwHhcNMjYwODIzMTUwNzQwWhcNMjYwODI2 # MTUwNzQwWjBoMQswCQYDVQQGEwJOTDEWMBQGA1UECBMNTm9vcmQtSG9sbGFuZDEP # MA0GA1UEBxMGSGVpbG9vMRcwFQYDVQQKEw5BcHBWZW50aVggQi5WLjEXMBUGA1UE # AxMOQXBwVmVudGlYIEIuVi4wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIB # gQCoadbs6imFdxUR/W4zTGNMajYt0uhSP6siFelP12UeMcqpLnM+jzrWbBkXnpvV # C3CJ75gTbLEbjkqJq9neO1rwbTFkres7QfaG/tj7Lo+Ba0QoDewim3jcL8gxoV4U # vgOoM7CBs5mhDAeOxIcGSx9RfJjM0/e/zo9JjamFYutQJ2Z+fs40huxp9eVz/QwV # xUMoWbMYlpehR3uqUOAsRV5yyUFKSYJGjQp58oEY65F0LOhrGV0PigEOEJLlWuZY # xdCuc0gPIc+AEfMFJi7/khSvi1+hjVqmzlcw+EOFcNDZogZp56kDonPdE+LTJOT6 # DRYxgs7QimSRnEpbczQIF+mBKJZQFUG8Hv7q71FmvphE7vmM+paEQf0tE1sRjbc/ # n6v8SvzczlUAjmuNzXhsVVnfTc6ASL4srCuAYY32MlpCqdPpyMkmehVmT/41MiO0 # lDzIH1icdEL8LlxaMOxlBmUujf0FimNGa9HEAJahVnJlmBB5CjW1DBjtsHnrvbNA # h3kCAwEAAaOCAdQwggHQMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMDsG # A1UdJQQ0MDIGCisGAQQBgjdhAQAGCCsGAQUFBwMDBhorBgEEAYI3YaL8yC6uh9F6 # gZ2lyVCBwcKCJzAdBgNVHQ4EFgQUhiOKuVKC578YpMALM2rV7N0KgIswHwYDVR0j # BBgwFoAUpEMMf3ZapYXnPo0oDwwXokVpcMYwZwYDVR0fBGAwXjBcoFqgWIZWaHR0 # cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSUQl # MjBWZXJpZmllZCUyMENTJTIwQU9DJTIwQ0ElMjAwMy5jcmwwdAYIKwYBBQUHAQEE # aDBmMGQGCCsGAQUFBzAChlhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz # L2NlcnRzL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEFPQyUyMENB # JTIwMDMuY3J0MFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRw # Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0w # DQYJKoZIhvcNAQEMBQADggIBADilFl3qUVaak/QuSR/cBpymNfS8S+cj7D/FqE5Y # Jm7ZmMW5YafPfLzOWv7Jc6hepqk6ianoLwzrjMWVueMEO6skW3pnbGe7WyT/UmM5 # 3Xefaidp0OLnyDx2NpTiLw/Py5G9vF1qfPosOv+nxRxx4taC2JzmvThJ6FitcQ87 # VU6CBv6kfp80LFcoFN8RCEGURnOPwA/enDoWK1m+fvu0u4mT03uYzLJfJgkL8kqc # jUk0NnSmn+KJeJjAd1CI2vQov2ceH+D5HyTeS6TkAYmswiU0trf8VKEwGbe1GT95 # Lnr1WlVk5ZRmlZC+yzY261qIpv+dtUKb3+blW7nVKpPyIQHAyv4PPpkmq9MdW1Ia # b/BpwpL1Adok/zmdE9sheJB1FPYoexiI6iiBlxn7WFG9UiUChFxJn3DRGDEfVorN # qEwpbPLablTHphbkb0NhqWKfC0xt/Ut8kf1e1SA8CuLRGWa82nc0D0vGokLetE+w # FJMW0cREjPLCgXWzSgfCTCc7U93MIit6qjZWBIQgSetwphCkxzLPebpKKklmpyrK # wDXHFsBSakXECtX3iRJJduhXydnkbWY+gR0fWn0b5gW3VuFZZt/7bfahN/g1yiYJ # v7yaYtKcIk5jtDdnBP6OB3g5arFO61x3P56uP9GCnjVwmRHj0jo+oWfof57UI9bU # NvzoMIIGpTCCBI2gAwIBAgITMwAFRWvjMZz5fHZwUgAAAAVFazANBgkqhkiG9w0B # AQwFADBaMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 # aW9uMSswKQYDVQQDEyJNaWNyb3NvZnQgSUQgVmVyaWZpZWQgQ1MgQU9DIENBIDAz # MB4XDTI2MDgyMzE1MDc0MFoXDTI2MDgyNjE1MDc0MFowaDELMAkGA1UEBhMCTkwx # FjAUBgNVBAgTDU5vb3JkLUhvbGxhbmQxDzANBgNVBAcTBkhlaWxvbzEXMBUGA1UE # ChMOQXBwVmVudGlYIEIuVi4xFzAVBgNVBAMTDkFwcFZlbnRpWCBCLlYuMIIBojAN # BgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAqGnW7OophXcVEf1uM0xjTGo2LdLo # Uj+rIhXpT9dlHjHKqS5zPo861mwZF56b1Qtwie+YE2yxG45KiavZ3jta8G0xZK3r # O0H2hv7Y+y6PgWtEKA3sIpt43C/IMaFeFL4DqDOwgbOZoQwHjsSHBksfUXyYzNP3 # v86PSY2phWLrUCdmfn7ONIbsafXlc/0MFcVDKFmzGJaXoUd7qlDgLEVecslBSkmC # Ro0KefKBGOuRdCzoaxldD4oBDhCS5VrmWMXQrnNIDyHPgBHzBSYu/5IUr4tfoY1a # ps5XMPhDhXDQ2aIGaeepA6Jz3RPi0yTk+g0WMYLO0IpkkZxKW3M0CBfpgSiWUBVB # vB7+6u9RZr6YRO75jPqWhEH9LRNbEY23P5+r/Er83M5VAI5rjc14bFVZ303OgEi+ # LKwrgGGN9jJaQqnT6cjJJnoVZk/+NTIjtJQ8yB9YnHRC/C5cWjDsZQZlLo39BYpj # RmvRxACWoVZyZZgQeQo1tQwY7bB5672zQId5AgMBAAGjggHUMIIB0DAMBgNVHRMB # Af8EAjAAMA4GA1UdDwEB/wQEAwIHgDA7BgNVHSUENDAyBgorBgEEAYI3YQEABggr # BgEFBQcDAwYaKwYBBAGCN2Gi/MgurofReoGdpclQgcHCgicwHQYDVR0OBBYEFIYj # irlSgue/GKTACzNq1ezdCoCLMB8GA1UdIwQYMBaAFKRDDH92WqWF5z6NKA8MF6JF # aXDGMGcGA1UdHwRgMF4wXKBaoFiGVmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w # a2lvcHMvY3JsL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEFPQyUy # MENBJTIwMDMuY3JsMHQGCCsGAQUFBwEBBGgwZjBkBggrBgEFBQcwAoZYaHR0cDov # L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBJRCUy # MFZlcmlmaWVkJTIwQ1MlMjBBT0MlMjBDQSUyMDAzLmNydDBUBgNVHSAETTBLMEkG # BFUdIAAwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Br # aW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMA0GCSqGSIb3DQEBDAUAA4ICAQA4pRZd # 6lFWmpP0Lkkf3AacpjX0vEvnI+w/xahOWCZu2ZjFuWGnz3y8zlr+yXOoXqapOomp # 6C8M64zFlbnjBDurJFt6Z2xnu1sk/1JjOd13n2onadDi58g8djaU4i8Pz8uRvbxd # anz6LDr/p8UcceLWgtic5r04SehYrXEPO1VOggb+pH6fNCxXKBTfEQhBlEZzj8AP # 3pw6FitZvn77tLuJk9N7mMyyXyYJC/JKnI1JNDZ0pp/iiXiYwHdQiNr0KL9nHh/g # +R8k3kuk5AGJrMIlNLa3/FShMBm3tRk/eS569VpVZOWUZpWQvss2NutaiKb/nbVC # m9/m5Vu51SqT8iEBwMr+Dz6ZJqvTHVtSGm/wacKS9QHaJP85nRPbIXiQdRT2KHsY # iOoogZcZ+1hRvVIlAoRcSZ9w0RgxH1aKzahMKWzy2m5Ux6YW5G9DYalinwtMbf1L # fJH9XtUgPAri0RlmvNp3NA9LxqJC3rRPsBSTFtHERIzywoF1s0oHwkwnO1PdzCIr # eqo2VgSEIEnrcKYQpMcyz3m6SipJZqcqysA1xxbAUmpFxArV94kSSXboV8nZ5G1m # PoEdH1p9G+YFt1bhWWbf+232oTf4NcomCb+8mmLSnCJOY7Q3ZwT+jgd4OWqxTutc # dz+erj/Rgp41cJkR49I6PqFn6H+e1CPW1Db86DCCBygwggUQoAMCAQICEzMAAAAY # 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+tHD6n58vhavFIrmcxghcxMIIXLQIBATBxMFoxCzAJBgNV # BAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMT # Ik1pY3Jvc29mdCBJRCBWZXJpZmllZCBDUyBBT0MgQ0EgMDMCEzMABUVr4zGc+Xx2 # cFIAAAAFRWswDQYJYIZIAWUDBAIBBQCgXjAQBgorBgEEAYI3AgEMMQIwADAZBgkq # hkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAvBgkqhkiG9w0BCQQxIgQgQ9YL/mTJOY4v # o+mvm7KwDJI3evI9Irij+IeNRN8mUlIwDQYJKoZIhvcNAQEBBQAEggGAQ9m93Umr # tY944g4UtW5EJjxmuOyo/qGpdKlHg5tHDRS0/FgRJ1VF/OUvw/qOftOak6dCM+z/ # BuXE65WO+6IeZkAhKiEPJfsPEvgIoOoZ+wXP0itQARmvBDt+S+dmq9efB8eqcwRX # 2dXQgIWh9zfJMkx+OBRqU3Ss/PPBinuWqp2yFhaBUkh05WLoDGZaiBX4UhN6jcK4 # 901LAas+LGCwhWYnUZol/y0xYCVpo06fblON2xMz4ZebGi2m4gsAEjmHSbGBGOr2 # VzjUWxFRq+qCC6iXjDt2APIrRHo98AFD+giZFPR4qUaTxdPBkaVjijrriVoSyFi9 # UrdUk0jiqobm/P5bJQpJm9WsjTpnina9cGfiUL398ZgULJpDW/0Mrg1ayJFDy9Vf # R69kI2hqAOJZyzONFn3PtUhvEu6W1vD0XPBz/oX9jRlPcARXrGBQgJk1AsdXtvy7 # 7M+C+8dXed1wekI+RD5hKhMDs7UrUeuDn5QP9V+j4TfKKL9h5vtLBB5EoYIUsTCC # FK0GCisGAQQBgjcDAwExghSdMIIUmQYJKoZIhvcNAQcCoIIUijCCFIYCAQMxDzAN # BglghkgBZQMEAgEFADCCAWkGCyqGSIb3DQEJEAEEoIIBWASCAVQwggFQAgEBBgor # BgEEAYRZCgMBMDEwDQYJYIZIAWUDBAIBBQAEIACoSaKZ5+qI25xmNKjmYlFP5LOB # ATdw/kmBpJw0Kr9VAgZqdgn3h0kYEjIwMjYwODI1MTQwOTAxLjEyWjAEgAIB9KCB # 6aSB5jCB4zELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV # BAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEtMCsG # A1UECxMkTWljcm9zb2Z0IElyZWxhbmQgT3BlcmF0aW9ucyBMaW1pdGVkMScwJQYD # VQQLEx5uU2hpZWxkIFRTUyBFU046N0IxQS0wNUUwLUQ5NDcxNTAzBgNVBAMTLE1p # Y3Jvc29mdCBQdWJsaWMgUlNBIFRpbWUgU3RhbXBpbmcgQXV0aG9yaXR5oIIPKTCC # B4IwggVqoAMCAQICEzMAAAAF5c8P/2YuyYcAAAAAAAUwDQYJKoZIhvcNAQEMBQAw # dzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjFI # MEYGA1UEAxM/TWljcm9zb2Z0IElkZW50aXR5IFZlcmlmaWNhdGlvbiBSb290IENl # cnRpZmljYXRlIEF1dGhvcml0eSAyMDIwMB4XDTIwMTExOTIwMzIzMVoXDTM1MTEx # OTIwNDIzMVowYTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw # b3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZXN0YW1w # aW5nIENBIDIwMjAwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCefOdS # Y/3gxZ8FfWO1BiKjHB7X55cz0RMFvWVGR3eRwV1wb3+yq0OXDEqhUhxqoNv6iYWK # jkMcLhEFxvJAeNcLAyT+XdM5i2CgGPGcb95WJLiw7HzLiBKrxmDj1EQB/mG5eEiR # BEp7dDGzxKCnTYocDOcRr9KxqHydajmEkzXHOeRGwU+7qt8Md5l4bVZrXAhK+WSk # 5CihNQsWbzT1nRliVDwunuLkX1hyIWXIArCfrKM3+RHh+Sq5RZ8aYyik2r8HxT+l # 2hmRllBvE2Wok6IEaAJanHr24qoqFM9WLeBUSudz+qL51HwDYyIDPSQ3SeHtKog0 # ZubDk4hELQSxnfVYXdTGncaBnB60QrEuazvcob9n4yR65pUNBCF5qeA4QwYnilBk # fnmeAjRN3LVuLr0g0FXkqfYdUmj1fFFhH8k8YBozrEaXnsSL3kdTD01X+4LfIWOu # FzTzuoslBrBILfHNj8RfOxPgjuwNvE6YzauXi4orp4Sm6tF245DaFOSYbWFK5ZgG # 6cUY2/bUq3g3bQAqZt65KcaewEJ3ZyNEobv35Nf6xN6FrA6jF9447+NHvCjeWLCQ # Z3M8lgeCcnnhTFtyQX3XgCoc6IRXvFOcPVrr3D9RPHCMS6Ckg8wggTrtIVnY8yjb # vGOUsAdZbeXUIQAWMs0d3cRDv09SvwVRd61evQIDAQABo4ICGzCCAhcwDgYDVR0P # AQH/BAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRraSg6NS9IY0DP # e9ivSek+2T3bITBUBgNVHSAETTBLMEkGBFUdIAAwQTA/BggrBgEFBQcCARYzaHR0 # cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRt # MBMGA1UdJQQMMAoGCCsGAQUFBwMIMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBB # MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUyH7SaoUqG8oZmAQHJ89QEE9o # qKIwgYQGA1UdHwR9MHsweaB3oHWGc2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w # a2lvcHMvY3JsL01pY3Jvc29mdCUyMElkZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIw # Um9vdCUyMENlcnRpZmljYXRlJTIwQXV0aG9yaXR5JTIwMjAyMC5jcmwwgZQGCCsG # AQUFBwEBBIGHMIGEMIGBBggrBgEFBQcwAoZ1aHR0cDovL3d3dy5taWNyb3NvZnQu # Y29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBJZGVudGl0eSUyMFZlcmlmaWNh # dGlvbiUyMFJvb3QlMjBDZXJ0aWZpY2F0ZSUyMEF1dGhvcml0eSUyMDIwMjAuY3J0 # MA0GCSqGSIb3DQEBDAUAA4ICAQBfiHbHfm21WhV150x4aPpO4dhEmSUVpbixNDmv # 6TvuIHv1xIs174bNGO/ilWMm+Jx5boAXrJxagRhHQtiFprSjMktTliL4sKZyt2i+ # SXncM23gRezzsoOiBhv14YSd1Klnlkzvgs29XNjT+c8hIfPRe9rvVCMPiH7zPZcw # 5nNjthDQ+zD563I1nUJ6y59TbXWsuyUsqw7wXZoGzZwijWT5oc6GvD3HDokJY401 # uhnj3ubBhbkR83RbfMvmzdp3he2bvIUztSOuFzRqrLfEvsPkVHYnvH1wtYyrt5vS # hiKheGpXa2AWpsod4OJyT4/y0dggWi8g/tgbhmQlZqDUf3UqUQsZaLdIu/XSjgoZ # qDjamzCPJtOLi2hBwL+KsCh0Nbwc21f5xvPSwym0Ukr4o5sCcMUcSy6TEP7uMV8R # X0eH/4JLEpGyae6Ki8JYg5v4fsNGif1OXHJ2IWG+7zyjTDfkmQ1snFOTgyEX8qBp # efQbF0fx6URrYiarjmBprwP6ZObwtZXJ23jK3Fg/9uqM3j0P01nzVygTppBabzxP # Ah/hHhhls6kwo3QLJ6No803jUsZcd4JQxiYHHc+Q/wAMcPUnYKv/q2O444LO1+n6 # j01z5mggCSlRwD9faBIySAcA9S8h22hIAcRQqIGEjolCK9F6nK9ZyX4lhthsGHum # aABdWzCCB58wggWHoAMCAQICEzMAAABZfNpx6Y1e9cAAAAAAAFkwDQYJKoZIhvcN # AQEMBQAwYTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh # dGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZXN0YW1waW5n # IENBIDIwMjAwHhcNMjYwMTA4MTg1OTAxWhcNMjcwMTA3MTg1OTAxWjCB4zELMAkG # A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx # HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEtMCsGA1UECxMkTWljcm9z # b2Z0IElyZWxhbmQgT3BlcmF0aW9ucyBMaW1pdGVkMScwJQYDVQQLEx5uU2hpZWxk # IFRTUyBFU046N0IxQS0wNUUwLUQ5NDcxNTAzBgNVBAMTLE1pY3Jvc29mdCBQdWJs # aWMgUlNBIFRpbWUgU3RhbXBpbmcgQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF # AAOCAg8AMIICCgKCAgEApi7n/jR4Rf6FP7mMVrXjpuJ3d0Dguddie2+Q/cIbDgsY # BEWGe8sxIn9W2y5vMNp4WebvJvYpIzvRaYdCmt0JWqm9QfuXS4HiM3Du6sugBH2Q # ocsTRWUyUNK0NLFQEjerCx2uO92a9XST73+eO4MSJKXMlN/sOjB3Urds7ht5HJoW # FH5jy3KYQI6qU4B99isbbBl1UznX5BIFJ748TKSvwLo6eepKKm4Xx9m8Jvr+G6TR # mbpnCxqLFIcgBPYgQa9LtzrcibyNXdrxHQrqLbKLDQ02WdNKnDL9l+/uLCwsHCF9 # uMFOf5c6XqY/MNdBDdX5JE/3FdsYo6wFPHMaJ3tooAfDejgCGX1QZYsf2Q0/dVSi # QToliSOV+m5QZnqBDKoN7B/EPhWhgiWim3gdnTFC+pqO4nH5yvwtH8hnnqAsubDI # zN17n6+2MGiKWvL+BJnBUbCCS+QiCko8FAcaxIHTLezOvtjvARvq/TJlqXVdS9ae # fPeKdNpJawIWss9XBWZfLedxjn93blWk6SG36br3sZY1u+w06EA4dFp+0T2P+GGS # gzpGzIl8EueGoxwD/Bxq9/miPk17JFB0Zl4spyWz1ywpLewFTM+J3HHaKI0f0I9o # Or9sskQ5dqxiiFcydGKe759STzWzxU7sNBIXp9+fmipIehXyV/UDHq76R1KFvwEC # AwEAAaOCAcswggHHMB0GA1UdDgQWBBSPlucLXwPS+WdJGEI6I4MYa5c2djAfBgNV # HSMEGDAWgBRraSg6NS9IY0DPe9ivSek+2T3bITBsBgNVHR8EZTBjMGGgX6Bdhlto # dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBQ # dWJsaWMlMjBSU0ElMjBUaW1lc3RhbXBpbmclMjBDQSUyMDIwMjAuY3JsMHkGCCsG # AQUFBwEBBG0wazBpBggrBgEFBQcwAoZdaHR0cDovL3d3dy5taWNyb3NvZnQuY29t # L3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBQdWJsaWMlMjBSU0ElMjBUaW1lc3Rh # bXBpbmclMjBDQSUyMDIwMjAuY3J0MAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAww # CgYIKwYBBQUHAwgwDgYDVR0PAQH/BAQDAgeAMGYGA1UdIARfMF0wUQYMKwYBBAGC # N0yDfQEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w # a2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTAIBgZngQwBBAIwDQYJKoZIhvcNAQEM # BQADggIBAEQyHML9lyOkb/NRETvPZinm+tTFSOwTldre3/ZEa8RLC9uayTdsseFI # UBqOCjZdDzGgYM/exSEoIs94gJJuRW/pXyxKnx8nwmizrKtrB/ZhWKzy1xX447tT # 1LokY9DOmY+dx/NBzid7V+pnj4eIppsgMSgV111BPYSCST1/PEJj8RnnZq8nbt1J # +sj8gObKf1XXQ7eJCmDYX4L281OuTudWCgOgdr35DelivQgcadKa3mKuAZPjfrOj # ladc/wXEyGzAfVqLKJJmJXOGivXQL0LnZw/cLz88SgwpRey0uOg87RMyR5b/UWvX # zopcPjlBGAGjTEiaC1ZN3NYWeUP6nv6IMEi5Ks1xFcNFi6r9phloOFZIjRJh08hZ # WHle9e5YDfVryhDRI76g9rc2TzSTTzrjCKLInUqxtKdpp5+D2+yl6CGuljyWMLDF # 8JS3HkdBE2AAk4jwgoAIrh3TXgyTSGVE7SVBVEd6CoiDb0rpeqRzfrRbZkkZRyy2 # UqiSRWPooAeMbKstE/N6lh+JlQmriBfLFum8pvVcnYU3brzZpSg1ej1HJErVyHR/ # rqTr7KPzyTO+4Lv68la00Oz9SkgzoeGbSRTrglQnswwRBwBzuSl+3sabth5Er6gq # CpSBhcJ+bNtfyclclmc9rwANZWwiqy40DEIjQJleRQuh+qjkF7rPMYID1DCCA9AC # AQEweDBhMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 # aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcg # Q0EgMjAyMAITMwAAAFl82nHpjV71wAAAAAAAWTANBglghkgBZQMEAgEFAKCCAS0w # GgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMC8GCSqGSIb3DQEJBDEiBCDqvimc # Qfkc/Yv4sUdKkN7pD78Av5e3G51YNb7oSlfDsTCB3QYLKoZIhvcNAQkQAi8xgc0w # gcowgccwgaAEIMtFurHbhumxxcQn4eOP3GtxRXDtHw7LIx9IHZgYrf68MHwwZaRj # MGExCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x # MjAwBgNVBAMTKU1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWVzdGFtcGluZyBDQSAy # MDIwAhMzAAAAWXzacemNXvXAAAAAAABZMCIEIE0zHI0yCEjO1QvF/ja+OgqRDxfx # wJZE98FZgky1e4exMA0GCSqGSIb3DQEBCwUABIICAILIuQh5EohW5F9gWwnlYTGC # EKkDSy+ZeVrGu01KXm/cKd5wlLbYWZYgeO9JoqzKHcFLrIowGHbfVmBWdmj41/rZ # 1ubSCJj6wjtW5p2HmvPCbtddOq7vE5uAqP9A9CI414PR6KomvfAtcEu24P+i6Mng # DJw9IjFxQ1TqiMlwW03ACxB6JgA48zDeq+Vwsaq5Tr6ca4TDDZUhKd7SvFdLYacp # 9OH0FNIvrYSN+I7SmBKcKh4Y+zLwbaZU+gmhuY0+4Mi9ASXYSRhmcVnjk6qXUEcC # BgFbok0/JE6ZTeem3ayFbqlx5TNfpyo+gZIcj8BHAZow9BN7SFWLr4SDAzlZszBZ # q67FQPVo4UvwS/xzyzdS93qs/AUYhLEOaJrH8dO7nTeAMTwanX88g+7TF7TyuD9P # brVghwxWDc81zDDX3+wLKdjWrj+LbTyfZSyKgecC+3YrVdlMSxOSP1qk76JC4Rkw # cQp1dlHdbSKjvgEy+78hCcGK4J9RNhtwrjZPXzHg4lhTjktDRWO0jp4n7mMO65rs # c4rVYwgQMuHDNgqNJLlNDeADHD4pgvUkNuiqQMjrMSb1pgx6nZuDE4A4gY2vveuq # w+AYOzS10xs357DyqQoGb9qsETWYsLOTwxCo1jxR6ZTshqx890AILEVoZVL2qMpe # fL1dLJ2mG+KMVHElZys8 # SIG # End signature block |