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 # MII9JQYJKoZIhvcNAQcCoII9FjCCPRICAQExDzANBglghkgBZQMEAgEFADB5Bgor # 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 # 03u4aUoqlmZpxJTG9F9urJh4iIAGXKKy7aIwggajMIIEi6ADAgECAhMzAAbGfXzU # a/1I5WGiAAAABsZ9MA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ # RCBWZXJpZmllZCBDUyBFT0MgQ0EgMDMwHhcNMjYwOTIzMDcxNzAwWhcNMjYwOTI2 # MDcxNzAwWjBnMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjERMA8G # A1UEBxMISXNzYXF1YWgxFzAVBgNVBAoTDkRhbWlhbiBFZHdhcmRzMRcwFQYDVQQD # Ew5EYW1pYW4gRWR3YXJkczCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGB # AKaYeanVPgf4YNEbTUMESBv8dy4YdU3G5xRp5v+PjIZldxEpUp9pCggXXtxLiWEA # Kg3wV20SwP4yYLvyXgV6l3ck+8lMFRcCOTypprLYzhCb1GI+7yhN99YmNpZeEXa7 # zuOtcDeMuESQMFd1tOuMoaqaPRJqeffbsGTeMMJ7s26J79T9qlhKhYNRBkz/nA7C # 9ghH0lcyJi4sS05lJ2svut4hutvjosZjzo1vNpwvbm4odqynFJi3O8VKlM2lg3bA # zz+MDF0C1mrxGMdGv1rcmbapNu83lTt4LYUbz5/m73QgCbHeQbJojKzdKtmZyhQY # TIFH5p9dtSETLXj0+jNlDCeP9fSzI2jEIcIq8Pk6bx4OeB2INYZ7RtNRQXRMY9Do # h55Uf1CRILZvKrnAUM7wSVm5PPBglT5vSFFGtNcWZeXMiV+EnQPKsXd9XSeRu0jw # MVXlt2dbRYEbdK+M/RlFZ3Q0atJPn6odM0rGZuVabXMMzPp4GxMIKrLfKg5ROns1 # HQIDAQABo4IB0zCCAc8wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCB4AwOgYD # VR0lBDMwMQYKKwYBBAGCN2EBAAYIKwYBBQUHAwMGGSsGAQQBgjdh8PiHLKGwwBPl # htEVg5ShoiEwHQYDVR0OBBYEFMW3TrLRqeh49nU+GPNyNUgU+9D9MB8GA1UdIwQY # MBaAFGtepTTDBcViSiFajqtzYGLUrGOFMGcGA1UdHwRgMF4wXKBaoFiGVmh0dHA6 # Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMElEJTIw # VmVyaWZpZWQlMjBDUyUyMEVPQyUyMENBJTIwMDMuY3JsMHQGCCsGAQUFBwEBBGgw # ZjBkBggrBgEFBQcwAoZYaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9j # ZXJ0cy9NaWNyb3NvZnQlMjBJRCUyMFZlcmlmaWVkJTIwQ1MlMjBFT0MlMjBDQSUy # MDAzLmNydDBUBgNVHSAETTBLMEkGBFUdIAAwQTA/BggrBgEFBQcCARYzaHR0cDov # L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMA0G # CSqGSIb3DQEBDAUAA4ICAQBBOh3LeUTPZzfMxsVll3DcSHl6k2i2j9YM24fUNx3B # rEereGW9bTncJqU8uLNV6x710962keG4vVJNGstWhtpBSviagx4E7LghO3R9JVgl # 58PUt8EXE45ZPrQsqvGGO9O+3cf4r97jBaxhKRlrydC1/EJUiiprbRP/rk5zv5+L # kMgQawE+3ntxmpDJc2voY+k7ey5rr8TQXOijvh8mecMf6ar3XoVmllcTIWssxtV4 # acJA7zu+XqE9vMBinJLPqy/vleI2A1iO2PyB8wTVogPmfZQF0J/058FivRrRxoln # dASOd86YjQLPWsATVaF9xf1zNHx+VNqg51AEo5ei9lQpyFUEXGOPEZ8TH3/pBwsV # k8SHyr/3vlaJTLlO8wWPVlURyFItfM6dtgookzJBEqtjsxPGmUmNTLu6dxXkd0jY # ewGdTI8nSo2e5rxFkSthH7gjwbj6sieQCz0i2I1gu4O4WSMHEVFYxbtnNaHU8Oa8 # JGJkp2i8xU5fvfDHJvjN3HYvOUBP5kllgwNHUdKwVcPVB7Hrd/ZsOt/n7y+LP88s # uKAWzKkTGxIAt8vbhCowGMP5Xd5zhwAXCyvF1HNajb20RDTcyvlzQ+pcYYO7Jmml # 6xcA/HYLcon3CzsQbtl4SU52TaIVoIzfG8fi6kFuttXZQYx2Ie5Xm6xEygvjSp5m # 9jCCBqMwggSLoAMCAQICEzMABsZ9fNRr/UjlYaIAAAAGxn0wDQYJKoZIhvcNAQEM # BQAwWjELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv # bjErMCkGA1UEAxMiTWljcm9zb2Z0IElEIFZlcmlmaWVkIENTIEVPQyBDQSAwMzAe # Fw0yNjA5MjMwNzE3MDBaFw0yNjA5MjYwNzE3MDBaMGcxCzAJBgNVBAYTAlVTMRMw # EQYDVQQIEwpXYXNoaW5ndG9uMREwDwYDVQQHEwhJc3NhcXVhaDEXMBUGA1UEChMO # RGFtaWFuIEVkd2FyZHMxFzAVBgNVBAMTDkRhbWlhbiBFZHdhcmRzMIIBojANBgkq # hkiG9w0BAQEFAAOCAY8AMIIBigKCAYEApph5qdU+B/hg0RtNQwRIG/x3Lhh1Tcbn # FGnm/4+MhmV3ESlSn2kKCBde3EuJYQAqDfBXbRLA/jJgu/JeBXqXdyT7yUwVFwI5 # PKmmstjOEJvUYj7vKE331iY2ll4RdrvO461wN4y4RJAwV3W064yhqpo9Emp599uw # ZN4wwnuzbonv1P2qWEqFg1EGTP+cDsL2CEfSVzImLixLTmUnay+63iG62+OixmPO # jW82nC9ubih2rKcUmLc7xUqUzaWDdsDPP4wMXQLWavEYx0a/WtyZtqk27zeVO3gt # hRvPn+bvdCAJsd5BsmiMrN0q2ZnKFBhMgUfmn121IRMtePT6M2UMJ4/19LMjaMQh # wirw+TpvHg54HYg1hntG01FBdExj0OiHnlR/UJEgtm8qucBQzvBJWbk88GCVPm9I # UUa01xZl5cyJX4SdA8qxd31dJ5G7SPAxVeW3Z1tFgRt0r4z9GUVndDRq0k+fqh0z # SsZm5VptcwzM+ngbEwgqst8qDlE6ezUdAgMBAAGjggHTMIIBzzAMBgNVHRMBAf8E # AjAAMA4GA1UdDwEB/wQEAwIHgDA6BgNVHSUEMzAxBgorBgEEAYI3YQEABggrBgEF # BQcDAwYZKwYBBAGCN2Hw+IcsobDAE+WG0RWDlKGiITAdBgNVHQ4EFgQUxbdOstGp # 6Hj2dT4Y83I1SBT70P0wHwYDVR0jBBgwFoAUa16lNMMFxWJKIVqOq3NgYtSsY4Uw # ZwYDVR0fBGAwXjBcoFqgWIZWaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9w # cy9jcmwvTWljcm9zb2Z0JTIwSUQlMjBWZXJpZmllZCUyMENTJTIwRU9DJTIwQ0El # MjAwMy5jcmwwdAYIKwYBBQUHAQEEaDBmMGQGCCsGAQUFBzAChlhodHRwOi8vd3d3 # Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMElEJTIwVmVy # aWZpZWQlMjBDUyUyMEVPQyUyMENBJTIwMDMuY3J0MFQGA1UdIARNMEswSQYEVR0g # ADBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz # L0RvY3MvUmVwb3NpdG9yeS5odG0wDQYJKoZIhvcNAQEMBQADggIBAEE6Hct5RM9n # N8zGxWWXcNxIeXqTaLaP1gzbh9Q3HcGsR6t4Zb1tOdwmpTy4s1XrHvXT3raR4bi9 # Uk0ay1aG2kFK+JqDHgTsuCE7dH0lWCXnw9S3wRcTjlk+tCyq8YY7077dx/iv3uMF # rGEpGWvJ0LX8QlSKKmttE/+uTnO/n4uQyBBrAT7ee3GakMlza+hj6Tt7LmuvxNBc # 6KO+HyZ5wx/pqvdehWaWVxMhayzG1XhpwkDvO75eoT28wGKcks+rL++V4jYDWI7Y # /IHzBNWiA+Z9lAXQn/TnwWK9GtHGiWd0BI53zpiNAs9awBNVoX3F/XM0fH5U2qDn # UASjl6L2VCnIVQRcY48RnxMff+kHCxWTxIfKv/e+VolMuU7zBY9WVRHIUi18zp22 # CiiTMkESq2OzE8aZSY1Mu7p3FeR3SNh7AZ1MjydKjZ7mvEWRK2EfuCPBuPqyJ5AL # PSLYjWC7g7hZIwcRUVjFu2c1odTw5rwkYmSnaLzFTl+98Mcm+M3cdi85QE/mSWWD # A0dR0rBVw9UHset39mw63+fvL4s/zyy4oBbMqRMbEgC3y9uEKjAYw/ld3nOHABcL # K8XUc1qNvbRENNzK+XND6lxhg7smaaXrFwD8dgtyifcLOxBu2XhJTnZNohWgjN8b # x+LqQW621dlBjHYh7lebrETKC+NKnmb2MIIHKDCCBRCgAwIBAgITMwAAABUFPm4Z # 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+Fq8UiuZzGCGo8wghqLAgEBMHEwWjELMAkGA1UEBhMC # VVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjErMCkGA1UEAxMiTWlj # cm9zb2Z0IElEIFZlcmlmaWVkIENTIEVPQyBDQSAwMwITMwAGxn181Gv9SOVhogAA # AAbGfTANBglghkgBZQMEAgEFAKBeMBAGCisGAQQBgjcCAQwxAjAAMBkGCSqGSIb3 # DQEJAzEMBgorBgEEAYI3AgEEMC8GCSqGSIb3DQEJBDEiBCDqb08WlYBmR9r0dWml # yTpmv28SoXut1A3RzBdpip2gtTANBgkqhkiG9w0BAQEFAASCAYApRVgIPisDbfY9 # vjP+MjtYHOjc3R3NQ8V12qC7ZNzlbDZtq1nMQMTTMiZ+dtbZSW+sifk+xTWuixW/ # aQ8oUc2ylZ8MXslMZ6PRt1ZzpRsYaort27DKHCaja4X5helGrCDnez9651q2CaPd # ZwnWgYiRTDxMs67vzEPIKa/pr1xQMPXGQbE/vbmSux0+0KhX3Y0KJ1G79JZLO1G0 # rwtWLxgc+3J/S2M7oj88g8vsVDzu+N/g084HKKpWr2R37SZ8VknlS/roS/wtF9PX # qIX4ks2cZJDs7QTt7skl/nEVXa8oDjTSwoFeUWM9fIQj2ZSpkdFZW5BV8vcmKTPJ # DBtLaiy8M1UqCINAlS1A40++TjzrGkuvAIJ5EOqt3BdbFe6T29ZjiuxydsQMJ8aO # A1m5hFd2dPu0DoYlbkzNLZmyqYOTtlvAL5nW38sXbhAGh6RXgOuzwfg7hDWze3cO # 4SX2J6G9dnkAUZfKDq9AfjchSDUw6gZxTaDPbRlCLIhNC95iN6uhghgPMIIYCwYK # KwYBBAGCNwMDATGCF/swghf3BgkqhkiG9w0BBwKgghfoMIIX5AIBAzEPMA0GCWCG # SAFlAwQCAQUAMIIBYAYLKoZIhvcNAQkQAQSgggFPBIIBSzCCAUcCAQEGCisGAQQB # hFkKAwEwMTANBglghkgBZQMEAgEFAAQgZg2N6ZGCP964XEaNUFnzzwYka5wpsdlD # dhwbds09jmMCBmqpSyIuZRgRMjAyNjA5MjQyMTQ0MjcuMlowBIACAfSggeGkgd4w # gdsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS # ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJTAjBgNVBAsT # HE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMxJzAlBgNVBAsTHm5TaGllbGQg # VFNTIEVTTjo3QTAwLTA1RTAtRDk0NzE1MDMGA1UEAxMsTWljcm9zb2Z0IFB1Ymxp # YyBSU0EgVGltZSBTdGFtcGluZyBBdXRob3JpdHmggg8hMIIHgjCCBWqgAwIBAgIT # MwAAAAXlzw//Zi7JhwAAAAAABTANBgkqhkiG9w0BAQwFADB3MQswCQYDVQQGEwJV # UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMUgwRgYDVQQDEz9NaWNy # b3NvZnQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIFJvb3QgQ2VydGlmaWNhdGUgQXV0 # aG9yaXR5IDIwMjAwHhcNMjAxMTE5MjAzMjMxWhcNMzUxMTE5MjA0MjMxWjBhMQsw # CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYD # VQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMDCC # AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJ5851Jj/eDFnwV9Y7UGIqMc # HtfnlzPREwW9ZUZHd5HBXXBvf7KrQ5cMSqFSHGqg2/qJhYqOQxwuEQXG8kB41wsD # JP5d0zmLYKAY8Zxv3lYkuLDsfMuIEqvGYOPURAH+Ybl4SJEESnt0MbPEoKdNihwM # 5xGv0rGofJ1qOYSTNcc55EbBT7uq3wx3mXhtVmtcCEr5ZKTkKKE1CxZvNPWdGWJU # PC6e4uRfWHIhZcgCsJ+sozf5EeH5KrlFnxpjKKTavwfFP6XaGZGWUG8TZaiTogRo # AlqcevbiqioUz1Yt4FRK53P6ovnUfANjIgM9JDdJ4e0qiDRm5sOTiEQtBLGd9Vhd # 1MadxoGcHrRCsS5rO9yhv2fjJHrmlQ0EIXmp4DhDBieKUGR+eZ4CNE3ctW4uvSDQ # VeSp9h1SaPV8UWEfyTxgGjOsRpeexIveR1MPTVf7gt8hY64XNPO6iyUGsEgt8c2P # xF87E+CO7A28TpjNq5eLiiunhKbq0XbjkNoU5JhtYUrlmAbpxRjb9tSreDdtACpm # 3rkpxp7AQndnI0Shu/fk1/rE3oWsDqMX3jjv40e8KN5YsJBnczyWB4JyeeFMW3JB # fdeAKhzohFe8U5w9WuvcP1E8cIxLoKSDzCCBOu0hWdjzKNu8Y5SwB1lt5dQhABYy # zR3dxEO/T1K/BVF3rV69AgMBAAGjggIbMIICFzAOBgNVHQ8BAf8EBAMCAYYwEAYJ # KwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFGtpKDo1L0hjQM972K9J6T7ZPdshMFQG # A1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jv # c29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wEwYDVR0lBAwwCgYI # KwYBBQUHAwgwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwDwYDVR0TAQH/BAUw # AwEB/zAfBgNVHSMEGDAWgBTIftJqhSobyhmYBAcnz1AQT2ioojCBhAYDVR0fBH0w # ezB5oHegdYZzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWlj # cm9zb2Z0JTIwSWRlbnRpdHklMjBWZXJpZmljYXRpb24lMjBSb290JTIwQ2VydGlm # aWNhdGUlMjBBdXRob3JpdHklMjAyMDIwLmNybDCBlAYIKwYBBQUHAQEEgYcwgYQw # gYEGCCsGAQUFBzAChnVodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2Nl # cnRzL01pY3Jvc29mdCUyMElkZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUy # MENlcnRpZmljYXRlJTIwQXV0aG9yaXR5JTIwMjAyMC5jcnQwDQYJKoZIhvcNAQEM # BQADggIBAF+Idsd+bbVaFXXnTHho+k7h2ESZJRWluLE0Oa/pO+4ge/XEizXvhs0Y # 7+KVYyb4nHlugBesnFqBGEdC2IWmtKMyS1OWIviwpnK3aL5JedwzbeBF7POyg6IG # G/XhhJ3UqWeWTO+Czb1c2NP5zyEh89F72u9UIw+IfvM9lzDmc2O2END7MPnrcjWd # QnrLn1Ntday7JSyrDvBdmgbNnCKNZPmhzoa8PccOiQljjTW6GePe5sGFuRHzdFt8 # y+bN2neF7Zu8hTO1I64XNGqst8S+w+RUdie8fXC1jKu3m9KGIqF4aldrYBamyh3g # 4nJPj/LR2CBaLyD+2BuGZCVmoNR/dSpRCxlot0i79dKOChmoONqbMI8m04uLaEHA # v4qwKHQ1vBzbV/nG89LDKbRSSvijmwJwxRxLLpMQ/u4xXxFfR4f/gksSkbJp7oqL # wliDm/h+w0aJ/U5ccnYhYb7vPKNMN+SZDWycU5ODIRfyoGl59BsXR/HpRGtiJquO # YGmvA/pk5vC1lcnbeMrcWD/26ozePQ/TWfNXKBOmkFpvPE8CH+EeGGWzqTCjdAsn # o2jzTeNSxlx3glDGJgcdz5D/AAxw9Sdgq/+rY7jjgs7X6fqPTXPmaCAJKVHAP19o # EjJIBwD1LyHbaEgBxFCogYSOiUIr0Xqcr1nJfiWG2GwYe6ZoAF1bMIIHlzCCBX+g # AwIBAgITMwAAAFhlzes/odf80gAAAAAAWDANBgkqhkiG9w0BAQwFADBhMQswCQYD # VQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQD # EylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMDAeFw0y # NTEwMjMyMDQ2NTVaFw0yNjEwMjIyMDQ2NTVaMIHbMQswCQYDVQQGEwJVUzETMBEG # A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj # cm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBP # cGVyYXRpb25zMScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046N0EwMC0wNUUwLUQ5 # NDcxNTAzBgNVBAMTLE1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWUgU3RhbXBpbmcg # QXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnXg0pHaQ # 7PVAlln+HZZrJFcLoKbekhW1yL+QNBUgFFUsjZIKaqqN4oIJsJM3ps0rJNSO7ndC # NRuZDX2Wgur3Ak77eXrloBXqZmO6ZVXeDNRCLldW4A0/NfjzJ7XXkdEhjr81ghXE # pR7zC+wbaNN+sPSxzLAZBeibDFP7Xws5wX0ZtIsN1a2+Xq5bvWp3kRMytwskTjun # RgeLZL/tBp237JVdRPFAQ9jYRKpCqUBo/v1xjBLRCV3PalKjnGfb3MN4U7jVyqif # FHShcnW5CERRoBmUa6sygDzFSr8e3g93TPNLFUivUE0GmLfbX5ceD1Gt1FcZ6x/J # LVATzk5+BWHbMxwJIVkVPTqSSMjQ6KTKdcnq3pH0c4AFJp/glvcpq0U9fzZIjJGG # vdpishlRl77RQtUhSjxHvCn3LC/xqQQwOHSQDsGh6NX2D0RfsSyEtTAByAae+2w1 # HByTDTcmlTNLEuQLeCj1gNBdIWj0WOYyDtjjQ/8iTWY6ey1vb9qHljIj5HgIndT5 # P9MYk2Vg2e7hKUZNBNbA/hsgBsuoZ+IX89WvjEN9abF91S4OJVuinmKsLO/MLbnl # 7ikuD0dN6oA0YewyDQncs12sM9HOtu72QA/TZlefvW8r9xtMXAYoQlcGjsk8W4Uc # 7cfqVqbIPjdoc8ZxBzLcXcVyP4p5cyLwvkMCAwEAAaOCAcswggHHMB0GA1UdDgQW # BBRyjU3Fer4VxXJ+hjPcRJnxnRIJsDAfBgNVHSMEGDAWgBRraSg6NS9IY0DPe9iv # Sek+2T3bITBsBgNVHR8EZTBjMGGgX6BdhltodHRwOi8vd3d3Lm1pY3Jvc29mdC5j # b20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBQdWJsaWMlMjBSU0ElMjBUaW1lc3Rh # bXBpbmclMjBDQSUyMDIwMjAuY3JsMHkGCCsGAQUFBwEBBG0wazBpBggrBgEFBQcw # AoZdaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3Nv # ZnQlMjBQdWJsaWMlMjBSU0ElMjBUaW1lc3RhbXBpbmclMjBDQSUyMDIwMjAuY3J0 # MAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwDgYDVR0PAQH/ # BAQDAgeAMGYGA1UdIARfMF0wUQYMKwYBBAGCN0yDfQEBMEEwPwYIKwYBBQUHAgEW # M2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5 # Lmh0bTAIBgZngQwBBAIwDQYJKoZIhvcNAQEMBQADggIBAHvrxIiVF1iHcXvxrJTC # D8eOtbPUbK9x+Lz70iYehh+G0UoOMcMf04QD6tQPTeZ5HhGETkcn0raDJ5NpfbRB # uKEH31rxbZK97o12KRDNJ3Nu4ePaUIpH/TcWz8PLVOCECywSxbEgEG20kyydGc46 # c591tXzpfkJDckjoYrypaerdeQLRQH9LaoTYZfdAzMo+Dy0O1DzFJkF5YnsmAM8l # t9r1NtXdFjdbFMCbV5dau64mV22s186A8Umi+l239+Ue0cbJQIykWhIlhhWhxQgo # ksqHz7kp2GFZAAeySTmIOQOWyXOA8JA8TISJyn3JDOgStv583P3V0QSALT6JXDCW # 26FV208VGJMzkv0S22iOTZJ/oamTpk8RzD8oWT8pfbe1q/k/bxPiXYRbzps96a5Y # Oko7n0Vdo61DOJhL/mhk01Y348gq6vhG/VTcdGHh1rCkwOM05B35AZZq9AtPpfRz # JinrHzzGRx+r6fD3ccYMPMMX/Nwd2irzrph172fQcSf1fMwvwIhmfH4GWJJ+mf1H # A6uXoAOVByckguXvlj8gPi7T2ES6RU8+QssfqTNTJKjsBheWKWv2W4ESVen2L7lC # z7i79FhA+0kp0yXJnYwdzWS0ovTINULINmzVyMcSUm5WuVf8YZ33cAud2Opr6N1+ # RuLZDavDvjiehlI5dH+GEy56MYIHQzCCBz8CAQEweDBhMQswCQYDVQQGEwJVUzEe # MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3Nv # ZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMAITMwAAAFhlzes/odf8 # 0gAAAAAAWDANBglghkgBZQMEAgEFAKCCBJwwEQYLKoZIhvcNAQkQAg8xAgUAMBoG # CSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjYwOTI0 # MjE0NDI3WjAvBgkqhkiG9w0BCQQxIgQgUa5sl+lh+TybHVc7XxMk3oQzE29BfNbU # OrXGqTY8wB8wgbkGCyqGSIb3DQEJEAIvMYGpMIGmMIGjMIGgBCDFIlS7sgfQ+wAo # 1cWbWz+WN69VBds58hbran919aLocTB8MGWkYzBhMQswCQYDVQQGEwJVUzEeMBwG # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQg # UHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMAITMwAAAFhlzes/odf80gAA # AAAAWDCCA14GCyqGSIb3DQEJEAISMYIDTTCCA0mhggNFMIIDQTCCAikCAQEwggEJ # oYHhpIHeMIHbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G # A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSUw # IwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25zMScwJQYDVQQLEx5u # U2hpZWxkIFRTUyBFU046N0EwMC0wNUUwLUQ5NDcxNTAzBgNVBAMTLE1pY3Jvc29m # dCBQdWJsaWMgUlNBIFRpbWUgU3RhbXBpbmcgQXV0aG9yaXR5oiMKAQEwBwYFKw4D # AhoDFQCdZHkb26ercF2O62vCdZUfUSvEXKBnMGWkYzBhMQswCQYDVQQGEwJVUzEe # MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3Nv # ZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMDANBgkqhkiG9w0BAQsF # AAIFAO5fpw8wIhgPMjAyNjA5MjQxMzQxMzVaGA8yMDI2MDkyNTEzNDEzNVowdDA6 # BgorBgEEAYRZCgQBMSwwKjAKAgUA7l+nDwIBADAHAgEAAgIhuzAHAgEAAgIS1jAK # AgUA7mD4jwIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZCgMCoAowCAIB # AAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEBCwUAA4IBAQBlYhPTbqIZaI6N # vPy+quV6id5YvclkPJVY9o12f9cMgcRaZD9bsC80lPY2bKSM3a+YFlwNETtYgipq # uW0XwFJJwnTjltKZfSNSkwitK+831HAOqXqNRYEGQJf5bRH+7rewqo11N1Qg5kg6 # BjZMMfxVYJjM8cl4XoOX0LnRdZ4LrIR67v9IE8aMqprmLreTuJnU/QQTeQK4QI0z # RTeBR/+qymzCPN8O1+U31hfoVj9EVfJkKJn5si64XOJpycV24MGirjb0a8GoMB5Q # jmMHTmV3XSz7cm/i0aHP2klRCQx/Hia/aV6k2SIxDk09ML3mzwH7P3ZIVo5wStJ3 # xKmyCCi8MA0GCSqGSIb3DQEBAQUABIICAGOSOzeTQhP3ZCD3Pxqi73flL3IXOza5 # jqZ+i55JK+UxT+B9SiGzxr9HoWJ6P1gT/RwaozgyF892S7w67KLJ3Hhk7yhZYqBs # 0Ffg36zF5NAqN/H7HThSGQlB0sxy+iVQKfLR7nngAhvMgyWzOmlsM09Jd9a3R9Sm # okfGiBVqvsWWHC7dit0xd+8iHrVwfipAkAtJGVEI3VTTfn5lrx/+FdHJa3lOPSnZ # 4Ktd6jnklKfc24mQCgj8M3Fb3RBCYzv6EvjnyOleaDYuYXDYp5hWYfYq4OUF6jGh # k//O9zKezPn/U+AKUB6AdxS12D49kA86/ifo9VhbbCM2PR4jrpo8Maz6MDwrIH11 # PbF7x0JsflAIHzOMqJzqtr5IPvcPZkML6flmbeKWvgd9zESnrFa2eERBmOITQ0wP # QFrSEI/cI0nnCS4No/lK/za6o4tWAWkIa7WL1dAQ+vS7+C+qnIs4hasjTItgGbLi # 0Gpy8GQ9GQHd/Yf4FcM2fuV0YW+dqcv0ng30FrlMFDkg3xxIm5F/IrqQY7Bx8yCN # 1NH2aP9diQIKMQF15bdFRjji45TjaXzrayqzrqP/mJPo9begR0B2o8yFWUszrdk2 # 3FGXQuqgZHwKCjRV/TsVsmM4KXq+Djoy3EfjPtyeeH6a/FJ96haVV9iX0vaZxQ8T # OdDlrXl4bUYr # SIG # End signature block |