Private/AvailableReleases.ps1
|
function Assert-DotNetStewardPlatform { if ($env:OS -ne 'Windows_NT') { throw 'DotNetSteward manages official Windows EXE installers and can only run on Windows.' } if ($PSVersionTable.PSVersion -lt [version] '5.1') { throw 'PowerShell 5.1 or later is required.' } } function Get-NativeDotNetArchitecture { $architecture = $env:PROCESSOR_ARCHITEW6432 if ([string]::IsNullOrWhiteSpace($architecture)) { $architecture = $env:PROCESSOR_ARCHITECTURE } switch -Regex ($architecture) { '^(?i:AMD64)$' { return 'x64' } '^(?i:ARM64)$' { return 'arm64' } '^(?i:X86)$' { return 'x86' } default { throw "The native Windows architecture '$architecture' is not supported." } } } function Assert-DotNetChannels { param( [Parameter(Mandatory = $true)] [string[]] $Channels ) foreach ($channel in $Channels) { if ($channel -notmatch '^\d+\.\d+$') { throw "Invalid .NET channel '$channel'. Use a major/minor channel such as 8.0." } } } function Assert-SdkFeatureBands { param( [Parameter(Mandatory = $true)] [string[]] $VersionBands ) foreach ($versionBand in $VersionBands) { if ($versionBand -notmatch '^\d+\.\d+\.\d+xx$') { throw "Invalid SDK feature band '$versionBand'. Use a feature band such as 8.0.4xx." } } } function Assert-ExactDotNetVersions { param( [Parameter(Mandatory = $true)] [string[]] $Versions ) foreach ($version in $Versions) { [void] (New-SdkVersionInfo -Text $version) } } function Get-RequestedChannels { param( [string[]] $Channels, [string[]] $VersionBands, [string[]] $Versions ) $requested = New-Object System.Collections.Generic.List[string] foreach ($channel in @($Channels)) { if ([string]::IsNullOrWhiteSpace($channel)) { continue } if (-not $requested.Contains($channel)) { $requested.Add($channel) } } foreach ($versionBand in @($VersionBands)) { if ([string]::IsNullOrWhiteSpace($versionBand)) { continue } $versionInfo = New-SdkVersionInfo -Text ( $versionBand.Substring(0, $versionBand.Length - 2) + '00' ) if (-not $requested.Contains($versionInfo.Channel)) { $requested.Add($versionInfo.Channel) } } foreach ($version in @($Versions)) { if ([string]::IsNullOrWhiteSpace($version)) { continue } $versionInfo = New-SdkVersionInfo -Text $version if (-not $requested.Contains($versionInfo.Channel)) { $requested.Add($versionInfo.Channel) } if ($versionInfo.Major -eq 1 -and $versionInfo.Minor -eq 0 -and -not $requested.Contains('1.1')) { $requested.Add('1.1') } } return $requested.ToArray() } function New-AvailableRelease { param( [Parameter(Mandatory = $true)] [object] $Installer, [Parameter(Mandatory = $true)] [object] $ChannelEntry, [Parameter(Mandatory = $true)] [string] $Architecture, [Parameter(Mandatory = $true)] [ValidateSet('Sdk', 'Runtime', 'AspNetCoreRuntime', 'WindowsDesktopRuntime')] [string] $ProductType ) [pscustomobject] @{ PSTypeName = 'DotNetSteward.AvailableRelease' ProductType = $ProductType ProductLabel = Get-DotNetProductLabel -ProductType $ProductType Version = $Installer.Version VersionInfo = $Installer.VersionInfo Channel = [string] $ChannelEntry.PSObject.Properties[ 'channel-version' ].Value FeatureBand = if ($ProductType -eq 'Sdk') { $Installer.VersionInfo.FeatureBandKey } else { $null } Architecture = $Architecture Rid = $Installer.Rid IsPrerelease = -not $Installer.VersionInfo.IsStable SupportPhase = Get-SupportPhase -ChannelEntry $ChannelEntry ReleaseType = Get-ReleaseType -ChannelEntry $ChannelEntry Url = $Installer.Url Hash = $Installer.Hash HashAlgorithm = $Installer.HashAlgorithm } } function Sort-AvailableReleases { param( [Parameter(Mandatory = $true)] [AllowEmptyCollection()] [object[]] $Releases ) $sorted = New-Object System.Collections.Generic.List[object] foreach ($release in $Releases) { $insertAt = $sorted.Count for ($index = 0; $index -lt $sorted.Count; $index++) { $comparison = Compare-SdkVersion -Left $release.VersionInfo ` -Right $sorted[$index].VersionInfo if ($comparison -gt 0) { $insertAt = $index break } if ($comparison -eq 0) { $productComparison = [string]::CompareOrdinal( $release.ProductType, $sorted[$index].ProductType ) if ($productComparison -lt 0 -or ($productComparison -eq 0 -and [string]::CompareOrdinal( $release.Architecture, $sorted[$index].Architecture ) -lt 0)) { $insertAt = $index break } } } $sorted.Insert($insertAt, $release) } return $sorted.ToArray() } function Select-AvailableReleases { param( [Parameter(Mandatory = $true)] [AllowEmptyCollection()] [object[]] $Releases, [string[]] $VersionBands, [string[]] $Versions, [Parameter(Mandatory = $true)] [bool] $IncludePreview, [Parameter(Mandatory = $true)] [bool] $AllVersions ) $selected = @($Releases) $requestedVersions = @($Versions | Where-Object { -not [string]::IsNullOrWhiteSpace($_) }) $requestedVersionBands = @($VersionBands | Where-Object { -not [string]::IsNullOrWhiteSpace($_) }) if ($requestedVersions.Count -gt 0) { $selected = @($selected | Where-Object { $requestedVersions -contains $_.Version }) } elseif ($requestedVersionBands.Count -gt 0) { $selected = @($selected | Where-Object { $requestedVersionBands -contains $_.VersionInfo.FeatureBandKey }) } if ($requestedVersions.Count -eq 0 -and -not $IncludePreview) { $selected = @($selected | Where-Object { -not $_.IsPrerelease }) } $unique = @{} foreach ($release in $selected) { $keyParts = @( $release.ProductType $release.Version $release.Rid ) if ($requestedVersions.Count -eq 0) { $keyParts += $release.Channel } $key = $keyParts -join '|' if (-not $unique.ContainsKey($key)) { $unique[$key] = $release } } $selected = @($unique.Values) if ($AllVersions -or $requestedVersions.Count -gt 0) { return Sort-AvailableReleases -Releases $selected } $latestByGroup = @{} foreach ($release in $selected) { $groupParts = @( $release.ProductType $release.Channel $release.Rid ) if ($requestedVersionBands.Count -gt 0) { $groupParts += $release.FeatureBand } $groupKey = $groupParts -join '|' if (-not $latestByGroup.ContainsKey($groupKey) -or (Compare-SdkVersion -Left $release.VersionInfo ` -Right $latestByGroup[$groupKey].VersionInfo) -gt 0) { $latestByGroup[$groupKey] = $release } } return Sort-AvailableReleases -Releases @($latestByGroup.Values) } function Get-AvailableSdkReleases { param( [Parameter(Mandatory = $true)] [object[]] $ReleaseIndex, [Parameter(Mandatory = $true)] [string[]] $Architectures, [string[]] $Channels, [string[]] $VersionBands, [string[]] $Versions, [Parameter(Mandatory = $true)] [bool] $IncludePreview, [Parameter(Mandatory = $true)] [bool] $AllVersions ) $requestedChannels = @(Get-RequestedChannels -Channels $Channels ` -VersionBands $VersionBands -Versions $Versions) $metadataCache = @{} $available = New-Object System.Collections.Generic.List[object] foreach ($channelEntry in $ReleaseIndex) { $channelProperty = $channelEntry.PSObject.Properties['channel-version'] if ($null -eq $channelProperty) { continue } $channel = [string] $channelProperty.Value if ($requestedChannels.Count -gt 0 -and $requestedChannels -notcontains $channel) { continue } foreach ($architecture in $Architectures) { $installers = @(Get-ChannelSdkInstallers -ChannelEntry $channelEntry ` -Rid "win-$architecture" -MetadataCache $metadataCache) foreach ($installer in $installers) { $available.Add((New-AvailableRelease -Installer $installer ` -ChannelEntry $channelEntry -Architecture $architecture ` -ProductType Sdk)) } } } return Select-AvailableReleases -Releases $available.ToArray() ` -VersionBands $VersionBands -Versions $Versions ` -IncludePreview $IncludePreview -AllVersions $AllVersions } function Get-AvailableRuntimeReleases { param( [Parameter(Mandatory = $true)] [object[]] $ReleaseIndex, [Parameter(Mandatory = $true)] [ValidateSet('Runtime', 'AspNetCoreRuntime', 'WindowsDesktopRuntime')] [string[]] $ProductTypes, [Parameter(Mandatory = $true)] [string[]] $Architectures, [string[]] $Channels, [string[]] $Versions, [Parameter(Mandatory = $true)] [bool] $IncludePreview, [Parameter(Mandatory = $true)] [bool] $AllVersions ) $requestedChannels = @(Get-RequestedChannels -Channels $Channels ` -Versions $Versions) $metadataCache = @{} $available = New-Object System.Collections.Generic.List[object] foreach ($channelEntry in $ReleaseIndex) { $channelProperty = $channelEntry.PSObject.Properties['channel-version'] if ($null -eq $channelProperty) { continue } $channel = [string] $channelProperty.Value if ($requestedChannels.Count -gt 0 -and $requestedChannels -notcontains $channel) { continue } foreach ($architecture in $Architectures) { foreach ($productType in $ProductTypes) { $installers = @(Get-ChannelRuntimeInstallers ` -ChannelEntry $channelEntry -Rid "win-$architecture" ` -ProductType $productType -MetadataCache $metadataCache) foreach ($installer in $installers) { $available.Add((New-AvailableRelease -Installer $installer ` -ChannelEntry $channelEntry -Architecture $architecture ` -ProductType $productType)) } } } } return Select-AvailableReleases -Releases $available.ToArray() ` -Versions $Versions -IncludePreview $IncludePreview ` -AllVersions $AllVersions } function ConvertTo-DotNetInstallCandidates { param( [Parameter(Mandatory = $true)] [object[]] $Releases ) foreach ($release in $Releases) { [pscustomobject] @{ ProductType = $release.ProductType ProductLabel = $release.ProductLabel Architecture = $release.Architecture Band = if ($release.ProductType -eq 'Sdk') { $release.FeatureBand } else { $release.Channel } CurrentVersion = $null InstalledVersions = @() TargetVersion = $release.Version TargetVersionInfo = $release.VersionInfo Channel = $release.Channel SupportPhase = $release.SupportPhase Url = $release.Url Hash = $release.Hash HashAlgorithm = $release.HashAlgorithm Rid = $release.Rid } } } function Assert-RequestedReleasesResolved { param( [Parameter(Mandatory = $true)] [AllowEmptyCollection()] [object[]] $Releases, [Parameter(Mandatory = $true)] [ValidateSet('Channel', 'VersionBand', 'Version')] [string] $SelectorKind, [Parameter(Mandatory = $true)] [string[]] $Selectors, [Parameter(Mandatory = $true)] [string[]] $Architectures, [Parameter(Mandatory = $true)] [string[]] $ProductTypes ) foreach ($productType in $ProductTypes) { foreach ($architecture in $Architectures) { foreach ($selector in $Selectors) { $match = @($Releases | Where-Object { $release = $_ if ($release.ProductType -ne $productType -or $release.Architecture -ne $architecture) { return $false } switch ($SelectorKind) { 'Channel' { return $release.Channel -eq $selector } 'VersionBand' { return $release.FeatureBand -eq $selector } 'Version' { return $release.Version -eq $selector } } }) if ($match.Count -eq 0) { $label = Get-DotNetProductLabel -ProductType $productType throw "No official $architecture $label EXE installer was found for $SelectorKind '$selector'." } } } } } # SIG # Begin signature block # MII9JwYJKoZIhvcNAQcCoII9GDCCPRQCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDFs5hNrwnQMfrS # gqN3xNWDR+FZ964bZ74AU32anqLF46CCIewwggXMMIIDtKADAgECAhBUmNLR1FsZ # 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 # 03u4aUoqlmZpxJTG9F9urJh4iIAGXKKy7aIwggajMIIEi6ADAgECAhMzAAXqputR # 09VeyKgIAAAABeqmMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ # RCBWZXJpZmllZCBDUyBFT0MgQ0EgMDMwHhcNMjYwOTExMDc1MTUyWhcNMjYwOTE0 # MDc1MTUyWjBnMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjERMA8G # A1UEBxMISXNzYXF1YWgxFzAVBgNVBAoTDkRhbWlhbiBFZHdhcmRzMRcwFQYDVQQD # Ew5EYW1pYW4gRWR3YXJkczCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGB # ALeWYSi+ijB+0AAxCKCLGfewFg3rfmQQu86KqkhU9JldpGt2t0UYmaNS7OgfEOsf # s9vc6Uf5OPNBQaaHsB9wDikmV7Fi4LtgdZlnJ/5S7CKFZSyxG0jCbSOfkYyFXhxp # hR65f1g/5g+TX1vXAJDh2na6ZTpjgNx1AlpUvNjqY76ISdW46Bc7gdkY5AW0pgt7 # 6WsTJODKSA/5dWOcjTnygaqA+TsadMSDIybP5k0MIc2l9CJz3xQMEaMioPpP441u # Dn1sevP9nntDB7yvN20aIzWCeseXbjaojN3SJtu9GQ5BMRuvmiIAJbFA43/2kCpJ # TtIqErI/5shFjowbQ1saOGoL0Qgs0cojzr4sZjj7AZ4/7NKJ5Bt81W8NT/M44fep # 8cdDhAsVIIa03LEOQf5a1RsV3iuO8PU1oM19wl8qFa8shJHHjwQo9nB6y9eBZufB # zY0TrzxttQU2csiqwc6Z7GEFbMs1iEWU4G9T7Rzmnt/fBTCRRpalrnN9O9+pj2v5 # 3QIDAQABo4IB0zCCAc8wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCB4AwOgYD # VR0lBDMwMQYKKwYBBAGCN2EBAAYIKwYBBQUHAwMGGSsGAQQBgjdh8PiHLKGwwBPl # htEVg5ShoiEwHQYDVR0OBBYEFIvUho9MMDRBmqIyY+0vyblyNHrEMB8GA1UdIwQY # MBaAFGtepTTDBcViSiFajqtzYGLUrGOFMGcGA1UdHwRgMF4wXKBaoFiGVmh0dHA6 # Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMElEJTIw # VmVyaWZpZWQlMjBDUyUyMEVPQyUyMENBJTIwMDMuY3JsMHQGCCsGAQUFBwEBBGgw # ZjBkBggrBgEFBQcwAoZYaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9j # ZXJ0cy9NaWNyb3NvZnQlMjBJRCUyMFZlcmlmaWVkJTIwQ1MlMjBFT0MlMjBDQSUy # MDAzLmNydDBUBgNVHSAETTBLMEkGBFUdIAAwQTA/BggrBgEFBQcCARYzaHR0cDov # L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMA0G # CSqGSIb3DQEBDAUAA4ICAQBZp2EM9/KFEj3OHOKf3Wfr9O6QnqzleZCA3kQHhbe/ # 6JkSyqrbJjU3W9CibqFAOpUplhIS2JF7Lv4Zqpl/BT83XTru5CVhoe5BqtP7Rjci # 2OSm4pB2nKNIN7okWThz1AxRQJoyZA4iVykzFF8QNmZGo5d4nWWaU2amdk0h+W7a # 3kU+XRD8fPMLrXFJL1Kr9qwIDq/6jh5vR2xFWCKNdzPwupD4gdvpGbF7CV/GWW3B # u/kQmy2TDIv7/0gctNEg9NnG8XrYVYxBdPmwnqTAEdIf5fnx2e5KKyrvqXHA8hj/ # 7/i6cJMDFvPCsIAQHT/XWISyTWr6+zkSriXBClAs4Cx+EawmzETk+N9Ew1HCMLC7 # x9ICMa5P4XZ3kKDSZdNielDL9qdnvIbHL3eAb9UvmGVhilvAcUjBTRD4V4Rp2gYz # u/x/+f/gxtGy5g/cP7+ILfs/7G6Dl+8xL3NtxaLPdIjnDCKx+SbLNXV8FSKZ82C2 # qPT8zD2DQvQMcD5YFf8pbKNFukl6i5uhHY2KDD/cs6EFrYknkRMGpc7zKH+bvEBh # ZS3dkpfnoOwDRgZboxBiYTyfylXo1s+LBiwyDF/Uwq2PJTrAWsxJSh7RgVx3IVN0 # BHA2FxVMOoD6CwUUhugyklQI6/NnSI646O82mT1F6kzaNlxJzj8YsenuToDc3PVQ # JTCCBqMwggSLoAMCAQICEzMABeqm61HT1V7IqAgAAAAF6qYwDQYJKoZIhvcNAQEM # BQAwWjELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv # bjErMCkGA1UEAxMiTWljcm9zb2Z0IElEIFZlcmlmaWVkIENTIEVPQyBDQSAwMzAe # Fw0yNjA5MTEwNzUxNTJaFw0yNjA5MTQwNzUxNTJaMGcxCzAJBgNVBAYTAlVTMRMw # EQYDVQQIEwpXYXNoaW5ndG9uMREwDwYDVQQHEwhJc3NhcXVhaDEXMBUGA1UEChMO # RGFtaWFuIEVkd2FyZHMxFzAVBgNVBAMTDkRhbWlhbiBFZHdhcmRzMIIBojANBgkq # hkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAt5ZhKL6KMH7QADEIoIsZ97AWDet+ZBC7 # zoqqSFT0mV2ka3a3RRiZo1Ls6B8Q6x+z29zpR/k480FBpoewH3AOKSZXsWLgu2B1 # mWcn/lLsIoVlLLEbSMJtI5+RjIVeHGmFHrl/WD/mD5NfW9cAkOHadrplOmOA3HUC # WlS82OpjvohJ1bjoFzuB2RjkBbSmC3vpaxMk4MpID/l1Y5yNOfKBqoD5Oxp0xIMj # Js/mTQwhzaX0InPfFAwRoyKg+k/jjW4OfWx68/2ee0MHvK83bRojNYJ6x5duNqiM # 3dIm270ZDkExG6+aIgAlsUDjf/aQKklO0ioSsj/myEWOjBtDWxo4agvRCCzRyiPO # vixmOPsBnj/s0onkG3zVbw1P8zjh96nxx0OECxUghrTcsQ5B/lrVGxXeK47w9TWg # zX3CXyoVryyEkcePBCj2cHrL14Fm58HNjROvPG21BTZyyKrBzpnsYQVsyzWIRZTg # b1PtHOae398FMJFGlqWuc30736mPa/ndAgMBAAGjggHTMIIBzzAMBgNVHRMBAf8E # AjAAMA4GA1UdDwEB/wQEAwIHgDA6BgNVHSUEMzAxBgorBgEEAYI3YQEABggrBgEF # BQcDAwYZKwYBBAGCN2Hw+IcsobDAE+WG0RWDlKGiITAdBgNVHQ4EFgQUi9SGj0ww # NEGaojJj7S/JuXI0esQwHwYDVR0jBBgwFoAUa16lNMMFxWJKIVqOq3NgYtSsY4Uw # ZwYDVR0fBGAwXjBcoFqgWIZWaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9w # cy9jcmwvTWljcm9zb2Z0JTIwSUQlMjBWZXJpZmllZCUyMENTJTIwRU9DJTIwQ0El # MjAwMy5jcmwwdAYIKwYBBQUHAQEEaDBmMGQGCCsGAQUFBzAChlhodHRwOi8vd3d3 # Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMElEJTIwVmVy # aWZpZWQlMjBDUyUyMEVPQyUyMENBJTIwMDMuY3J0MFQGA1UdIARNMEswSQYEVR0g # ADBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz # L0RvY3MvUmVwb3NpdG9yeS5odG0wDQYJKoZIhvcNAQEMBQADggIBAFmnYQz38oUS # Pc4c4p/dZ+v07pCerOV5kIDeRAeFt7/omRLKqtsmNTdb0KJuoUA6lSmWEhLYkXsu # /hmqmX8FPzddOu7kJWGh7kGq0/tGNyLY5KbikHaco0g3uiRZOHPUDFFAmjJkDiJX # KTMUXxA2Zkajl3idZZpTZqZ2TSH5btreRT5dEPx88wutcUkvUqv2rAgOr/qOHm9H # bEVYIo13M/C6kPiB2+kZsXsJX8ZZbcG7+RCbLZMMi/v/SBy00SD02cbxethVjEF0 # +bCepMAR0h/l+fHZ7korKu+pccDyGP/v+LpwkwMW88KwgBAdP9dYhLJNavr7ORKu # JcEKUCzgLH4RrCbMROT430TDUcIwsLvH0gIxrk/hdneQoNJl02J6UMv2p2e8hscv # d4Bv1S+YZWGKW8BxSMFNEPhXhGnaBjO7/H/5/+DG0bLmD9w/v4gt+z/sboOX7zEv # c23Fos90iOcMIrH5Jss1dXwVIpnzYLao9PzMPYNC9AxwPlgV/ylso0W6SXqLm6Ed # jYoMP9yzoQWtiSeREwalzvMof5u8QGFlLd2Sl+eg7ANGBlujEGJhPJ/KVejWz4sG # LDIMX9TCrY8lOsBazElKHtGBXHchU3QEcDYXFUw6gPoLBRSG6DKSVAjr82dIjrjo # 7zaZPUXqTNo2XEnOPxix6e5OgNzc9VAlMIIHKDCCBRCgAwIBAgITMwAAABUFPm4Z # jpMp2QAAAAAAFTANBgkqhkiG9w0BAQwFADBjMQswCQYDVQQGEwJVUzEeMBwGA1UE # ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTQwMgYDVQQDEytNaWNyb3NvZnQgSUQg # VmVyaWZpZWQgQ29kZSBTaWduaW5nIFBDQSAyMDIxMB4XDTI2MDMyNjE4MTEyOFoX # DTMxMDMyNjE4MTEyOFowWjELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29m # dCBDb3Jwb3JhdGlvbjErMCkGA1UEAxMiTWljcm9zb2Z0IElEIFZlcmlmaWVkIENT # IEVPQyBDQSAwMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAOD0yz0C # qi8Ocx4+8w574rJuEJ3z6WiTNg5GVLeQFVex55xvIbAFyx6eWblsu0wY+OIgUvMF # AX6CGVVX9Tb2rkZx14QQEIdNMaEvaSgistzhSuWIxFxu/2Y4y1H+Xv/ECa/QXHgE # kefV0e3ft++sGpeYqMp8Z/kOnI7/6GdXtMSt4y1LX2I75uNn/0eemDc8KTR7thJt # FMWTH3sVnBFakLizc16lF9FdCH9YwCPsmaxh5VmiGLhMXnJbYkyslmrAdzLMlli0 # PYeWejlkQmR2JlwRrEc6hubA7TpnUn1zbemz08YiEZqrWwosQDP0OhzmsuRhYa14 # OuxwqECnaQhz+hiUf0iPoGQ6qqBYg0SQS0Lxk0bUxqT6HejrlqPSJAqZ3Fbshloc # 7ly7KgyL4q1h9d4giDexUhtLYQvyRS2wMZ0So2oCr+KypOLWNeot7qIqnWeLVI92 # 89b0bTcJOxgXrxv/K4hBHBt2gEJd6Yw0kJLR2isJFjhvZYADLieDtIA1wSCsGBl/ # nfn5B8tTmEbOsqMilsxptq5ZvkUpZQqQyw9xcWRdFY7iego+bgpaUXKmo6lsn8o4 # 1VF4iXEdBF6AA4HMiFEHuCv0gNDWxzYyA6BD7FUZbiirgcPSZ8CLCLIuyRmuRpDs # mhqdiME1xH1FLbpjEBVtwG0uK0VPMIgSDll1AgMBAAGjggHcMIIB2DAOBgNVHQ8B # Af8EBAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFGtepTTDBcViSiFa # jqtzYGLUrGOFMFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRw # Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0w # GQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwEgYDVR0TAQH/BAgwBgEB/wIBADAf # BgNVHSMEGDAWgBTZQSmwDw9jbO9p1/XNKZ6kSGow5jBwBgNVHR8EaTBnMGWgY6Bh # hl9odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQl # MjBJRCUyMFZlcmlmaWVkJTIwQ29kZSUyMFNpZ25pbmclMjBQQ0ElMjAyMDIxLmNy # bDB9BggrBgEFBQcBAQRxMG8wbQYIKwYBBQUHMAKGYWh0dHA6Ly93d3cubWljcm9z # b2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwSUQlMjBWZXJpZmllZCUy # MENvZGUlMjBTaWduaW5nJTIwUENBJTIwMjAyMS5jcnQwDQYJKoZIhvcNAQEMBQAD # ggIBAF1uIjzPBctfyCUkSH/xDbZQwJSFYE7jpn0U+HA5HeZ2WpFUuRg6if8xzNTC # uMOHHdf31I8fk9J+WQahO+c71lYczlgVVik7s1i4H6Z9VIYAZnCIY4BJaTSLYHu+ # f2cSUkmaiJfG6B8flh0GytSBO3QAU1eTOapOCT5LUfFvW7/QcKoQdVk+TYD/p4ld # hu2lEzkVzPTSOKxSX0FFmBJ5s4NXzlsHM696rILd/Q+ccLFEk2ExvzE/+wH9Ujul # /auF5JXvOpRK/y+f98gxuVd5pUiWmqirxI/0EkyMT8KhVcnGeRlBEzUVruQ33LO2 # 9F46HFKA+ClnH9eX+OTDIQVUlMF8GnexOB8hz+maq/Z6G1qQvYASPvwSY49CiHEl # PfDJf4/vwYDbm0ukC/OPdEwwd3zPXxm65WL7rQwDMak4BIfUvw2Wvd9lFmdA76nL # J7YMK9iYdoh91SBgmqfuejHEZW/z35FoROHW2AIO/A2kUJIbu+XkDhqSj7Z/HjT2 # v1NaNcLs6J/UhDlknMHhF/wa8GIdiO8yYemV52nUUZEt1JEVWkLf84qlljpq8ipm # nv7yk/9ZA/3TcN2Cu8BPpbjE84HFc9ri0aSw3dK6olqIVgdI3J4G5+fyKx66Nbgh # sFJscPgE+psXepn7ucb13938bb8vHiQf1wKYF+axl1KQea6QMIIHnjCCBYagAwIB # AgITMwAAAAeHozSje6WOHAAAAAAABzANBgkqhkiG9w0BAQwFADB3MQswCQYDVQQG # EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMUgwRgYDVQQDEz9N # aWNyb3NvZnQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIFJvb3QgQ2VydGlmaWNhdGUg # QXV0aG9yaXR5IDIwMjAwHhcNMjEwNDAxMjAwNTIwWhcNMzYwNDAxMjAxNTIwWjBj # MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTQw # MgYDVQQDEytNaWNyb3NvZnQgSUQgVmVyaWZpZWQgQ29kZSBTaWduaW5nIFBDQSAy # MDIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsvDArxmIKOLdVHpM # SWxpCFUJtFL/ekr4weslKPdnF3cpTeuV8veqtmKVgok2rO0D05BpyvUDCg1wdsoE # tuxACEGcgHfjPF/nZsOkg7c0mV8hpMT/GvB4uhDvWXMIeQPsDgCzUGzTvoi76YDp # xDOxhgf8JuXWJzBDoLrmtThX01CE1TCCvH2sZD/+Hz3RDwl2MsvDSdX5rJDYVuR3 # bjaj2QfzZFmwfccTKqMAHlrz4B7ac8g9zyxlTpkTuJGtFnLBGasoOnn5NyYlf0xF # 9/bjVRo4Gzg2Yc7KR7yhTVNiuTGH5h4eB9ajm1OCShIyhrKqgOkc4smz6obxO+Hx # KeJ9bYmPf6KLXVNLz8UaeARo0BatvJ82sLr2gqlFBdj1sYfqOf00Qm/3B4XGFPDK # /H04kteZEZsBRc3VT2d/iVd7OTLpSH9yCORV3oIZQB/Qr4nD4YT/lWkhVtw2v2s0 # TnRJubL/hFMIQa86rcaGMhNsJrhysLNNMeBhiMezU1s5zpusf54qlYu2v5sZ5zL0 # KvBDLHtL8F9gn6jOy3v7Jm0bbBHjrW5yQW7S36ALAt03QDpwW1JG1Hxu/FUXJbBO # 2AwwVG4Fre+ZQ5Od8ouwt59FpBxVOBGfN4vN2m3fZx1gqn52GvaiBz6ozorgIEjn # +PhUXILhAV5Q/ZgCJ0u2+ldFGjcCAwEAAaOCAjUwggIxMA4GA1UdDwEB/wQEAwIB # hjAQBgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQU2UEpsA8PY2zvadf1zSmepEhq # MOYwVAYDVR0gBE0wSzBJBgRVHSAAMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cu # bWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTAZBgkrBgEE # AYI3FAIEDB4KAFMAdQBiAEMAQTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaA # FMh+0mqFKhvKGZgEByfPUBBPaKiiMIGEBgNVHR8EfTB7MHmgd6B1hnNodHRwOi8v # d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBJZGVudGl0 # eSUyMFZlcmlmaWNhdGlvbiUyMFJvb3QlMjBDZXJ0aWZpY2F0ZSUyMEF1dGhvcml0 # eSUyMDIwMjAuY3JsMIHDBggrBgEFBQcBAQSBtjCBszCBgQYIKwYBBQUHMAKGdWh0 # dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIw # SWRlbnRpdHklMjBWZXJpZmljYXRpb24lMjBSb290JTIwQ2VydGlmaWNhdGUlMjBB # dXRob3JpdHklMjAyMDIwLmNydDAtBggrBgEFBQcwAYYhaHR0cDovL29uZW9jc3Au # bWljcm9zb2Z0LmNvbS9vY3NwMA0GCSqGSIb3DQEBDAUAA4ICAQB/JSqe/tSr6t1m # CttXI0y6XmyQ41uGWzl9xw+WYhvOL47BV09Dgfnm/tU4ieeZ7NAR5bguorTCNr58 # HOcA1tcsHQqt0wJsdClsu8bpQD9e/al+lUgTUJEV80Xhco7xdgRrehbyhUf4pkeA # hBEjABvIUpD2LKPho5Z4DPCT5/0TlK02nlPwUbv9URREhVYCtsDM+31OFU3fDV8B # mQXv5hT2RurVsJHZgP4y26dJDVF+3pcbtvh7R6NEDuYHYihfmE2HdQRq5jRvLE1E # b59PYwISFCX2DaLZ+zpU4bX0I16ntKq4poGOFaaKtjIA1vRElItaOKcwtc04CBrX # SfyL2Op6mvNIxTk4OaswIkTXbFL81ZKGD+24uMCwo/pLNhn7VHLfnxlMVzHQVL+b # Ha9KhTyzwdG/L6uderJQn0cGpLQMStUuNDArxW2wF16QGZ1NtBWgKA8Kqv48M8Hf # FqNifN6+zt6J0GwzvU8g0rYGgTZR8zDEIJfeZxwWDHpSxB5FJ1VVU1LIAtB7o9PX # bjXzGifaIMYTzU4YKt4vMNwwBmetQDHhdAtTPplOXrnI9SI6HeTtjDD3iUN/7ygb # ahmYOHk7VB7fwT4ze+ErCbMh6gHV1UuXPiLciloNxH6K4aMfZN1oLVk6YFeIJEok # uPgNPa6EnTiOL60cPqfny+Fq8UiuZzGCGpEwghqNAgEBMHEwWjELMAkGA1UEBhMC # VVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjErMCkGA1UEAxMiTWlj # cm9zb2Z0IElEIFZlcmlmaWVkIENTIEVPQyBDQSAwMwITMwAF6qbrUdPVXsioCAAA # AAXqpjANBglghkgBZQMEAgEFAKBeMBAGCisGAQQBgjcCAQwxAjAAMBkGCSqGSIb3 # DQEJAzEMBgorBgEEAYI3AgEEMC8GCSqGSIb3DQEJBDEiBCDqb08WlYBmR9r0dWml # yTpmv28SoXut1A3RzBdpip2gtTANBgkqhkiG9w0BAQEFAASCAYAZcfu2lEUxgizk # EOOtH2neKu5NssfCz7fbmmd4c4zp3YSQgdK3RmsK2v0Xhdcvp1wdTJZdmpYpM4oN # fHZt/2qSKVVsDwzyGo9+ipfDfYWS1+YmwD2bwQSNF04QrUyt+OEk3WxAvWxGcLzK # gc3UszvTslPHjulomopq/dQGm//loVEuRT1Kz7aJR3aLkeU7oY48gvj9EqbeWoBv # hV0/TvC65nZ3+9SXhHFBgmqrc4LZuSa2ONKxWBbhc68sZWqf339rPRiFZg0cWvyw # +BaoKh5DaY9Qpq8YT49UMfdvHcyv1ErzZbyXmrSgVklMCDkIiOEXFETPe2xfmY+Z # 21WaempVHHmcKOXYf4j7bFpMSFLbeGpoEk1sf36GI1PTWIbj92GuUVyj6Xi4OHMS # /NfHgBukdqeg70bN2/xjUQDu7yBsowp9Fc4lRHYQoUtfuW7XqLuVB7nwJGrx9tWs # Qagv3iSjQurSBBst/6R/ssKIAGYye1i41/iEwtkU27IYvF7TzYGhghgRMIIYDQYK # KwYBBAGCNwMDATGCF/0wghf5BgkqhkiG9w0BBwKgghfqMIIX5gIBAzEPMA0GCWCG # SAFlAwQCAQUAMIIBYgYLKoZIhvcNAQkQAQSgggFRBIIBTTCCAUkCAQEGCisGAQQB # hFkKAwEwMTANBglghkgBZQMEAgEFAAQgf4CmDdFL0Nk/sCVivhaynHqeOpM2/Ck3 # hSBcHo8SENYCBmqkED1tuhgTMjAyNjA5MTMwNTMzMjIuMzczWjAEgAIB9KCB4aSB # 3jCB2zELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT # B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjElMCMGA1UE # CxMcTWljcm9zb2Z0IEFtZXJpY2EgT3BlcmF0aW9uczEnMCUGA1UECxMeblNoaWVs # ZCBUU1MgRVNOOjdBMDAtMDVFMC1EOTQ3MTUwMwYDVQQDEyxNaWNyb3NvZnQgUHVi # bGljIFJTQSBUaW1lIFN0YW1waW5nIEF1dGhvcml0eaCCDyEwggeCMIIFaqADAgEC # AhMzAAAABeXPD/9mLsmHAAAAAAAFMA0GCSqGSIb3DQEBDAUAMHcxCzAJBgNVBAYT # AlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBGBgNVBAMTP01p # Y3Jvc29mdCBJZGVudGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0aWZpY2F0ZSBB # dXRob3JpdHkgMjAyMDAeFw0yMDExMTkyMDMyMzFaFw0zNTExMTkyMDQyMzFaMGEx # CzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAw # BgNVBAMTKU1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWVzdGFtcGluZyBDQSAyMDIw # MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnnznUmP94MWfBX1jtQYi # oxwe1+eXM9ETBb1lRkd3kcFdcG9/sqtDlwxKoVIcaqDb+omFio5DHC4RBcbyQHjX # CwMk/l3TOYtgoBjxnG/eViS4sOx8y4gSq8Zg49REAf5huXhIkQRKe3Qxs8Sgp02K # HAznEa/Ssah8nWo5hJM1xznkRsFPu6rfDHeZeG1Wa1wISvlkpOQooTULFm809Z0Z # YlQ8Lp7i5F9YciFlyAKwn6yjN/kR4fkquUWfGmMopNq/B8U/pdoZkZZQbxNlqJOi # BGgCWpx69uKqKhTPVi3gVErnc/qi+dR8A2MiAz0kN0nh7SqINGbmw5OIRC0EsZ31 # WF3Uxp3GgZwetEKxLms73KG/Z+MkeuaVDQQheangOEMGJ4pQZH55ngI0Tdy1bi69 # INBV5Kn2HVJo9XxRYR/JPGAaM6xGl57Ei95HUw9NV/uC3yFjrhc087qLJQawSC3x # zY/EXzsT4I7sDbxOmM2rl4uKK6eEpurRduOQ2hTkmG1hSuWYBunFGNv21Kt4N20A # KmbeuSnGnsBCd2cjRKG79+TX+sTehawOoxfeOO/jR7wo3liwkGdzPJYHgnJ54Uxb # ckF914AqHOiEV7xTnD1a69w/UTxwjEugpIPMIIE67SFZ2PMo27xjlLAHWW3l1CEA # FjLNHd3EQ79PUr8FUXetXr0CAwEAAaOCAhswggIXMA4GA1UdDwEB/wQEAwIBhjAQ # BgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQUa2koOjUvSGNAz3vYr0npPtk92yEw # VAYDVR0gBE0wSzBJBgRVHSAAMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWlj # cm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTATBgNVHSUEDDAK # BggrBgEFBQcDCDAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTAPBgNVHRMBAf8E # BTADAQH/MB8GA1UdIwQYMBaAFMh+0mqFKhvKGZgEByfPUBBPaKiiMIGEBgNVHR8E # fTB7MHmgd6B1hnNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9N # aWNyb3NvZnQlMjBJZGVudGl0eSUyMFZlcmlmaWNhdGlvbiUyMFJvb3QlMjBDZXJ0 # aWZpY2F0ZSUyMEF1dGhvcml0eSUyMDIwMjAuY3JsMIGUBggrBgEFBQcBAQSBhzCB # hDCBgQYIKwYBBQUHMAKGdWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMv # Y2VydHMvTWljcm9zb2Z0JTIwSWRlbnRpdHklMjBWZXJpZmljYXRpb24lMjBSb290 # JTIwQ2VydGlmaWNhdGUlMjBBdXRob3JpdHklMjAyMDIwLmNydDANBgkqhkiG9w0B # AQwFAAOCAgEAX4h2x35ttVoVdedMeGj6TuHYRJklFaW4sTQ5r+k77iB79cSLNe+G # zRjv4pVjJviceW6AF6ycWoEYR0LYhaa0ozJLU5Yi+LCmcrdovkl53DNt4EXs87KD # ogYb9eGEndSpZ5ZM74LNvVzY0/nPISHz0Xva71QjD4h+8z2XMOZzY7YQ0Psw+ety # NZ1CesufU211rLslLKsO8F2aBs2cIo1k+aHOhrw9xw6JCWONNboZ497mwYW5EfN0 # W3zL5s3ad4Xtm7yFM7Ujrhc0aqy3xL7D5FR2J7x9cLWMq7eb0oYioXhqV2tgFqbK # HeDick+P8tHYIFovIP7YG4ZkJWag1H91KlELGWi3SLv10o4KGag42pswjybTi4to # QcC/irAodDW8HNtX+cbz0sMptFJK+KObAnDFHEsukxD+7jFfEV9Hh/+CSxKRsmnu # iovCWIOb+H7DRon9TlxydiFhvu88o0w35JkNbJxTk4MhF/KgaXn0GxdH8elEa2Im # q45gaa8D+mTm8LWVydt4ytxYP/bqjN49D9NZ81coE6aQWm88TwIf4R4YZbOpMKN0 # CyejaPNN41LGXHeCUMYmBx3PkP8ADHD1J2Cr/6tjuOOCztfp+o9Nc+ZoIAkpUcA/ # X2gSMkgHAPUvIdtoSAHEUKiBhI6JQivRepyvWcl+JYbYbBh7pmgAXVswggeXMIIF # f6ADAgECAhMzAAAAWGXN6z+h1/zSAAAAAABYMA0GCSqGSIb3DQEBDAUAMGExCzAJ # BgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNV # BAMTKU1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWVzdGFtcGluZyBDQSAyMDIwMB4X # DTI1MTAyMzIwNDY1NVoXDTI2MTAyMjIwNDY1NVowgdsxCzAJBgNVBAYTAlVTMRMw # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN # aWNyb3NvZnQgQ29ycG9yYXRpb24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNh # IE9wZXJhdGlvbnMxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo3QTAwLTA1RTAt # RDk0NzE1MDMGA1UEAxMsTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZSBTdGFtcGlu # ZyBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCdeDSk # dpDs9UCWWf4dlmskVwugpt6SFbXIv5A0FSAUVSyNkgpqqo3iggmwkzemzSsk1I7u # d0I1G5kNfZaC6vcCTvt5euWgFepmY7plVd4M1EIuV1bgDT81+PMntdeR0SGOvzWC # FcSlHvML7Bto036w9LHMsBkF6JsMU/tfCznBfRm0iw3Vrb5erlu9aneREzK3CyRO # O6dGB4tkv+0GnbfslV1E8UBD2NhEqkKpQGj+/XGMEtEJXc9qUqOcZ9vcw3hTuNXK # qJ8UdKFydbkIRFGgGZRrqzKAPMVKvx7eD3dM80sVSK9QTQaYt9tflx4PUa3UVxnr # H8ktUBPOTn4FYdszHAkhWRU9OpJIyNDopMp1yerekfRzgAUmn+CW9ymrRT1/NkiM # kYa92mKyGVGXvtFC1SFKPEe8KfcsL/GpBDA4dJAOwaHo1fYPRF+xLIS1MAHIBp77 # bDUcHJMNNyaVM0sS5At4KPWA0F0haPRY5jIO2OND/yJNZjp7LW9v2oeWMiPkeAid # 1Pk/0xiTZWDZ7uEpRk0E1sD+GyAGy6hn4hfz1a+MQ31psX3VLg4lW6KeYqws78wt # ueXuKS4PR03qgDRh7DINCdyzXawz0c627vZAD9NmV5+9byv3G0xcBihCVwaOyTxb # hRztx+pWpsg+N2hzxnEHMtxdxXI/inlzIvC+QwIDAQABo4IByzCCAccwHQYDVR0O # BBYEFHKNTcV6vhXFcn6GM9xEmfGdEgmwMB8GA1UdIwQYMBaAFGtpKDo1L0hjQM97 # 2K9J6T7ZPdshMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHA6Ly93d3cubWljcm9zb2Z0 # LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMFB1YmxpYyUyMFJTQSUyMFRpbWVz # dGFtcGluZyUyMENBJTIwMjAyMC5jcmwweQYIKwYBBQUHAQEEbTBrMGkGCCsGAQUF # BzAChl1odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jv # c29mdCUyMFB1YmxpYyUyMFJTQSUyMFRpbWVzdGFtcGluZyUyMENBJTIwMjAyMC5j # cnQwDAYDVR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAOBgNVHQ8B # Af8EBAMCB4AwZgYDVR0gBF8wXTBRBgwrBgEEAYI3TIN9AQEwQTA/BggrBgEFBQcC # ARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRv # cnkuaHRtMAgGBmeBDAEEAjANBgkqhkiG9w0BAQwFAAOCAgEAe+vEiJUXWIdxe/Gs # lMIPx461s9Rsr3H4vPvSJh6GH4bRSg4xwx/ThAPq1A9N5nkeEYRORyfStoMnk2l9 # tEG4oQffWvFtkr3ujXYpEM0nc27h49pQikf9NxbPw8tU4IQLLBLFsSAQbbSTLJ0Z # zjpzn3W1fOl+QkNySOhivKlp6t15AtFAf0tqhNhl90DMyj4PLQ7UPMUmQXlieyYA # zyW32vU21d0WN1sUwJtXl1q7riZXbazXzoDxSaL6Xbf35R7RxslAjKRaEiWGFaHF # CCiSyofPuSnYYVkAB7JJOYg5A5bJc4DwkDxMhInKfckM6BK2/nzc/dXRBIAtPolc # MJbboVXbTxUYkzOS/RLbaI5Nkn+hqZOmTxHMPyhZPyl9t7Wr+T9vE+JdhFvOmz3p # rlg6SjufRV2jrUM4mEv+aGTTVjfjyCrq+Eb9VNx0YeHWsKTA4zTkHfkBlmr0C0+l # 9HMmKesfPMZHH6vp8Pdxxgw8wxf83B3aKvOumHXvZ9BxJ/V8zC/AiGZ8fgZYkn6Z # /UcDq5egA5UHJySC5e+WPyA+LtPYRLpFTz5Cyx+pM1MkqOwGF5Ypa/ZbgRJV6fYv # uULPuLv0WED7SSnTJcmdjB3NZLSi9Mg1Qsg2bNXIxxJSbla5V/xhnfdwC53Y6mvo # 3X5G4tkNq8O+OJ6GUjl0f4YTLnoxggdDMIIHPwIBATB4MGExCzAJBgNVBAYTAlVT # MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jv # c29mdCBQdWJsaWMgUlNBIFRpbWVzdGFtcGluZyBDQSAyMDIwAhMzAAAAWGXN6z+h # 1/zSAAAAAABYMA0GCWCGSAFlAwQCAQUAoIIEnDARBgsqhkiG9w0BCRACDzECBQAw # GgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMBwGCSqGSIb3DQEJBTEPFw0yNjA5 # MTMwNTMzMjJaMC8GCSqGSIb3DQEJBDEiBCBSCDB+/RfZ1EoJRD5/WExXDL2oEkg1 # KkDOXzrpiNT9bDCBuQYLKoZIhvcNAQkQAi8xgakwgaYwgaMwgaAEIMUiVLuyB9D7 # ACjVxZtbP5Y3r1UF2znyFutqf3X1ouhxMHwwZaRjMGExCzAJBgNVBAYTAlVTMR4w # HAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29m # dCBQdWJsaWMgUlNBIFRpbWVzdGFtcGluZyBDQSAyMDIwAhMzAAAAWGXN6z+h1/zS # AAAAAABYMIIDXgYLKoZIhvcNAQkQAhIxggNNMIIDSaGCA0UwggNBMIICKQIBATCC # AQmhgeGkgd4wgdsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAw # DgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x # JTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMxJzAlBgNVBAsT # Hm5TaGllbGQgVFNTIEVTTjo3QTAwLTA1RTAtRDk0NzE1MDMGA1UEAxMsTWljcm9z # b2Z0IFB1YmxpYyBSU0EgVGltZSBTdGFtcGluZyBBdXRob3JpdHmiIwoBATAHBgUr # DgMCGgMVAJ1keRvbp6twXY7ra8J1lR9RK8RcoGcwZaRjMGExCzAJBgNVBAYTAlVT # MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jv # c29mdCBQdWJsaWMgUlNBIFRpbWVzdGFtcGluZyBDQSAyMDIwMA0GCSqGSIb3DQEB # CwUAAgUA7lCJATAiGA8yMDI2MDkxMzAyMjkyMVoYDzIwMjYwOTE0MDIyOTIxWjB0 # MDoGCisGAQQBhFkKBAExLDAqMAoCBQDuUIkBAgEAMAcCAQACAgOcMAcCAQACAg0p # MAoCBQDuUdqBAgEAMDYGCisGAQQBhFkKBAIxKDAmMAwGCisGAQQBhFkKAwKgCjAI # AgEAAgMHoSChCjAIAgEAAgMBhqAwDQYJKoZIhvcNAQELBQADggEBABlAp6S9aYyn # PIH5IfkcatIPT5rxspe6DaPO7KYwLYEI4DBUFqNDmlRhK4kXYbYqPRx3IIIXgrY4 # uJIcA98wGZBeYB9j4F6rotfFk5lXTAtf2Grp4TBXX1C6xDD6AU3fyfsjqvfL9NB0 # 3peT0VHN2Mn3BvOTeODw5V9FRUGc3aJqrIGX3GcXV7LMXm1uY+hJzerHc1hQL545 # i7TjNnSTUd8cAawUlhS4EXepLB9/zn1VUFqpkppAZEaOOc4OBDQ+FHLakfERMacP # 2w3c9pwEkB84Vw3xPtuwPsh0CTFEPW+6J7HtpU+nfD7CxWBwvFNkaAkfVVHUGTLi # WXfItTQsAkswDQYJKoZIhvcNAQEBBQAEggIAZAA1JuNsDehgxns8xUfDbtvUbsXB # F+glJog+rUL14JnB93Zxdqa4sqXbIgrb3g0le58N4UmhzHg2JukFDsAxkJEBIps+ # tM7HZH+GUkhLTTIZ+ELqQKa5B0BTmh/SijrTEo1Wyoazhuzv1dI7sTqVv2y2GxOh # EBQQTLFgy7ftxmdAh4/YVJ9mTI3he2aOtM/Gc1+T4L9nsn4Oa8DW1VIoyoAD/Hec # 7wJWZOP1lB342ClG5Y60PRmMv8Al0vMnDBqM47upGmg5WgvCnJyC8aN7LpyZCLux # k3s4dMPl90+1zBVLC4pCKFYvdZWRLGmt6z2KJtY6hxPnczmlNWrxAJ/GDnzQ08uQ # rM3O4Hto62SgPl7ZAg65gMOOfrg4q+xhcUKNBATIYIdS4rEc0UPgL8UdgVDsjzuC # Do5m9VjIb+toMxj/3EpHzhYZ0VyMQwIWk9Oc9F/1zMBu8G/kuwk+GMG8vI4DhV0g # aGL8riq978wJiOZQrR0UGkL+/Tgivpw9to4nkA25XmXedw+9HMFxCIUTYZAHP6dY # 8vEwF2R4mi++ZJW5+t1hVYSyE4kRMuWjtzvhClkH1dYyMiP8ePptzj2FDDEOVi6K # VGKGm/pFmPpkHx5VRsWPzN/lcnRjQVpwh7Al/B4sJF/B/AwX7K+uUfJVx1hA7wFk # aII1wleYkCv1QTE= # SIG # End signature block |