mirror of
https://github.com/pbatard/Fido.git
synced 2025-09-16 14:18:02 +02:00

* Drop Korean exception, since Microsoft no longer serves Korean specific images, and simplify Chinese exceptions. * Drop Windows 7 ISO handling, since Microsoft no longer serves Windows 7 ISOs. * Update Firefox user agent version. * Add a new -Debug switch to dump responses, and simplify verbosity handling.
1308 lines
52 KiB
PowerShell
1308 lines
52 KiB
PowerShell
#
|
||
# Fido v1.60 - Feature ISO Downloader, for retail Windows images and UEFI Shell
|
||
# Copyright © 2019-2024 Pete Batard <pete@akeo.ie>
|
||
# Command line support: Copyright © 2021 flx5
|
||
# ConvertTo-ImageSource: Copyright © 2016 Chris Carter
|
||
#
|
||
# This program is free software: you can redistribute it and/or modify
|
||
# it under the terms of the GNU General Public License as published by
|
||
# the Free Software Foundation, either version 3 of the License, or
|
||
# (at your option) any later version.
|
||
#
|
||
# This program is distributed in the hope that it will be useful,
|
||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
# GNU General Public License for more details.
|
||
#
|
||
# You should have received a copy of the GNU General Public License
|
||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
#
|
||
|
||
# NB: You must have a BOM on your .ps1 if you want Powershell to actually
|
||
# realise it should use Unicode for the UI rather than ISO-8859-1.
|
||
|
||
#region Parameters
|
||
param(
|
||
# (Optional) The title to display on the application window.
|
||
[string]$AppTitle = "Fido - Feature ISO Downloader",
|
||
# (Optional) '|' separated UI localization strings.
|
||
[string]$LocData,
|
||
# (Optional) Forced locale
|
||
[string]$Locale = "en-US",
|
||
# (Optional) Path to a file that should be used for the UI icon.
|
||
[string]$Icon,
|
||
# (Optional) Name of a pipe the download URL should be sent to.
|
||
# If not provided, a browser window is opened instead.
|
||
[string]$PipeName,
|
||
# (Optional) Specify Windows version (e.g. "Windows 10") [Toggles commandline mode]
|
||
[string]$Win,
|
||
# (Optional) Specify Windows release (e.g. "21H1") [Toggles commandline mode]
|
||
[string]$Rel,
|
||
# (Optional) Specify Windows edition (e.g. "Pro") [Toggles commandline mode]
|
||
[string]$Ed,
|
||
# (Optional) Specify Windows language [Toggles commandline mode]
|
||
[string]$Lang,
|
||
# (Optional) Specify Windows architecture [Toggles commandline mode]
|
||
[string]$Arch,
|
||
# (Optional) Only display the download URL [Toggles commandline mode]
|
||
[switch]$GetUrl = $false,
|
||
# (Optional) Increase verbosity
|
||
[switch]$Verbose = $false,
|
||
# (Optional) Produce debugging information
|
||
[switch]$Debug = $false
|
||
)
|
||
#endregion
|
||
|
||
try {
|
||
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
||
} catch {}
|
||
|
||
$Cmd = $false
|
||
if ($Win -or $Rel -or $Ed -or $Lang -or $Arch -or $GetUrl) {
|
||
$Cmd = $true
|
||
}
|
||
|
||
# Return a decimal Windows version that we can then check for platform support.
|
||
# Note that because we don't want to have to support this script on anything
|
||
# other than Windows, this call returns 0.0 for PowerShell running on Linux/Mac.
|
||
function Get-Platform-Version()
|
||
{
|
||
$version = 0.0
|
||
$platform = [string][System.Environment]::OSVersion.Platform
|
||
# This will filter out non Windows platforms
|
||
if ($platform.StartsWith("Win")) {
|
||
# Craft a decimal numeric version of Windows
|
||
$version = [System.Environment]::OSVersion.Version.Major * 1.0 + [System.Environment]::OSVersion.Version.Minor * 0.1
|
||
}
|
||
return $version
|
||
}
|
||
|
||
$winver = Get-Platform-Version
|
||
|
||
# The default TLS for Windows 8.x doesn't work with Microsoft's servers so we must force it
|
||
if ($winver -lt 10.0) {
|
||
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls12
|
||
}
|
||
|
||
#region Assembly Types
|
||
$Drawing_Assembly = "System.Drawing"
|
||
# PowerShell 7 altered the name of the Drawing assembly...
|
||
if ($host.version -ge "7.0") {
|
||
$Drawing_Assembly += ".Common"
|
||
}
|
||
|
||
$Signature = @{
|
||
Namespace = "WinAPI"
|
||
Name = "Utils"
|
||
Language = "CSharp"
|
||
UsingNamespace = "System.Runtime", "System.IO", "System.Text", "System.Drawing", "System.Globalization"
|
||
ReferencedAssemblies = $Drawing_Assembly
|
||
ErrorAction = "Stop"
|
||
WarningAction = "Ignore"
|
||
IgnoreWarnings = $true
|
||
MemberDefinition = @"
|
||
[DllImport("shell32.dll", CharSet = CharSet.Auto, SetLastError = true, BestFitMapping = false, ThrowOnUnmappableChar = true)]
|
||
internal static extern int ExtractIconEx(string sFile, int iIndex, out IntPtr piLargeVersion, out IntPtr piSmallVersion, int amountIcons);
|
||
|
||
[DllImport("user32.dll")]
|
||
public static extern bool ShowWindow(IntPtr handle, int state);
|
||
// Extract an icon from a DLL
|
||
public static Icon ExtractIcon(string file, int number, bool largeIcon) {
|
||
IntPtr large, small;
|
||
ExtractIconEx(file, number, out large, out small, 1);
|
||
try {
|
||
return Icon.FromHandle(largeIcon ? large : small);
|
||
} catch {
|
||
return null;
|
||
}
|
||
}
|
||
"@
|
||
}
|
||
|
||
if (!$Cmd) {
|
||
Write-Host Please Wait...
|
||
|
||
if (!("WinAPI.Utils" -as [type]))
|
||
{
|
||
Add-Type @Signature
|
||
}
|
||
Add-Type -AssemblyName PresentationFramework
|
||
|
||
# Hide the powershell window: https://stackoverflow.com/a/27992426/1069307
|
||
[WinAPI.Utils]::ShowWindow(([System.Diagnostics.Process]::GetCurrentProcess() | Get-Process).MainWindowHandle, 0) | Out-Null
|
||
}
|
||
#endregion
|
||
|
||
#region Data
|
||
$WindowsVersions = @(
|
||
@(
|
||
@("Windows 11", "windows11"),
|
||
@(
|
||
"24H2 (Build 26100.1742 - 2024.10)",
|
||
@("Windows 11 Home/Pro/Edu", 3113),
|
||
@("Windows 11 Home China ", ($zh + 3115))
|
||
@("Windows 11 Pro China ", ($zh + 3114))
|
||
)
|
||
),
|
||
@(
|
||
@("Windows 10", "Windows10ISO"),
|
||
@(
|
||
"22H2 v1 (Build 19045.2965 - 2023.05)",
|
||
@("Windows 10 Home/Pro/Edu", 2618),
|
||
@("Windows 10 Home China ", ($zh + 2378))
|
||
)
|
||
)
|
||
@(
|
||
@("UEFI Shell 2.2", "UEFI_SHELL 2.2"),
|
||
@(
|
||
"24H1 (edk2-stable202405)",
|
||
@("Release", 0),
|
||
@("Debug", 1)
|
||
),
|
||
@(
|
||
"23H2 (edk2-stable202311)",
|
||
@("Release", 0),
|
||
@("Debug", 1)
|
||
),
|
||
@(
|
||
"23H1 (edk2-stable202305)",
|
||
@("Release", 0),
|
||
@("Debug", 1)
|
||
),
|
||
@(
|
||
"22H2 (edk2-stable202211)",
|
||
@("Release", 0),
|
||
@("Debug", 1)
|
||
),
|
||
@(
|
||
"22H1 (edk2-stable202205)",
|
||
@("Release", 0),
|
||
@("Debug", 1)
|
||
),
|
||
@(
|
||
"21H2 (edk2-stable202108)",
|
||
@("Release", 0),
|
||
@("Debug", 1)
|
||
),
|
||
@(
|
||
"21H1 (edk2-stable202105)",
|
||
@("Release", 0),
|
||
@("Debug", 1)
|
||
),
|
||
@(
|
||
"20H2 (edk2-stable202011)",
|
||
@("Release", 0),
|
||
@("Debug", 1)
|
||
)
|
||
),
|
||
@(
|
||
@("UEFI Shell 2.0", "UEFI_SHELL 2.0"),
|
||
@(
|
||
"4.632 [20100426]",
|
||
@("Release", 0)
|
||
)
|
||
)
|
||
)
|
||
#endregion
|
||
|
||
#region Functions
|
||
function Select-Language([string]$LangName)
|
||
{
|
||
# Use the system locale to try select the most appropriate language
|
||
[string]$SysLocale = [System.Globalization.CultureInfo]::CurrentUICulture.Name
|
||
if (($SysLocale.StartsWith("ar") -and $LangName -like "*Arabic*") -or `
|
||
($SysLocale -eq "pt-BR" -and $LangName -like "*Brazil*") -or `
|
||
($SysLocale.StartsWith("ar") -and $LangName -like "*Bulgar*") -or `
|
||
($SysLocale -eq "zh-CN" -and $LangName -like "*Chinese*" -and $LangName -like "*simp*") -or `
|
||
($SysLocale -eq "zh-TW" -and $LangName -like "*Chinese*" -and $LangName -like "*trad*") -or `
|
||
($SysLocale.StartsWith("hr") -and $LangName -like "*Croat*") -or `
|
||
($SysLocale.StartsWith("cz") -and $LangName -like "*Czech*") -or `
|
||
($SysLocale.StartsWith("da") -and $LangName -like "*Danish*") -or `
|
||
($SysLocale.StartsWith("nl") -and $LangName -like "*Dutch*") -or `
|
||
($SysLocale -eq "en-US" -and $LangName -eq "English") -or `
|
||
($SysLocale.StartsWith("en") -and $LangName -like "*English*" -and ($LangName -like "*inter*" -or $LangName -like "*ingdom*")) -or `
|
||
($SysLocale.StartsWith("et") -and $LangName -like "*Eston*") -or `
|
||
($SysLocale.StartsWith("fi") -and $LangName -like "*Finn*") -or `
|
||
($SysLocale -eq "fr-CA" -and $LangName -like "*French*" -and $LangName -like "*Canad*") -or `
|
||
($SysLocale.StartsWith("fr") -and $LangName -eq "French") -or `
|
||
($SysLocale.StartsWith("de") -and $LangName -like "*German*") -or `
|
||
($SysLocale.StartsWith("el") -and $LangName -like "*Greek*") -or `
|
||
($SysLocale.StartsWith("he") -and $LangName -like "*Hebrew*") -or `
|
||
($SysLocale.StartsWith("hu") -and $LangName -like "*Hungar*") -or `
|
||
($SysLocale.StartsWith("id") -and $LangName -like "*Indones*") -or `
|
||
($SysLocale.StartsWith("it") -and $LangName -like "*Italia*") -or `
|
||
($SysLocale.StartsWith("ja") -and $LangName -like "*Japan*") -or `
|
||
($SysLocale.StartsWith("ko") -and $LangName -like "*Korea*") -or `
|
||
($SysLocale.StartsWith("lv") -and $LangName -like "*Latvia*") -or `
|
||
($SysLocale.StartsWith("lt") -and $LangName -like "*Lithuania*") -or `
|
||
($SysLocale.StartsWith("ms") -and $LangName -like "*Malay*") -or `
|
||
($SysLocale.StartsWith("nb") -and $LangName -like "*Norw*") -or `
|
||
($SysLocale.StartsWith("fa") -and $LangName -like "*Persia*") -or `
|
||
($SysLocale.StartsWith("pl") -and $LangName -like "*Polish*") -or `
|
||
($SysLocale -eq "pt-PT" -and $LangName -eq "Portuguese") -or `
|
||
($SysLocale.StartsWith("ro") -and $LangName -like "*Romania*") -or `
|
||
($SysLocale.StartsWith("ru") -and $LangName -like "*Russia*") -or `
|
||
($SysLocale.StartsWith("sr") -and $LangName -like "*Serbia*") -or `
|
||
($SysLocale.StartsWith("sk") -and $LangName -like "*Slovak*") -or `
|
||
($SysLocale.StartsWith("sl") -and $LangName -like "*Slovenia*") -or `
|
||
($SysLocale -eq "es-ES" -and $LangName -eq "Spanish") -or `
|
||
($SysLocale.StartsWith("es") -and $Locale -ne "es-ES" -and $LangName -like "*Spanish*") -or `
|
||
($SysLocale.StartsWith("sv") -and $LangName -like "*Swed*") -or `
|
||
($SysLocale.StartsWith("th") -and $LangName -like "*Thai*") -or `
|
||
($SysLocale.StartsWith("tr") -and $LangName -like "*Turk*") -or `
|
||
($SysLocale.StartsWith("uk") -and $LangName -like "*Ukrain*") -or `
|
||
($SysLocale.StartsWith("vi") -and $LangName -like "*Vietnam*")) {
|
||
return $true
|
||
}
|
||
return $false
|
||
}
|
||
|
||
function Add-Entry([int]$pos, [string]$Name, [array]$Items, [string]$DisplayName)
|
||
{
|
||
$Title = New-Object System.Windows.Controls.TextBlock
|
||
$Title.FontSize = $WindowsVersionTitle.FontSize
|
||
$Title.Height = $WindowsVersionTitle.Height;
|
||
$Title.Width = $WindowsVersionTitle.Width;
|
||
$Title.HorizontalAlignment = "Left"
|
||
$Title.VerticalAlignment = "Top"
|
||
$Margin = $WindowsVersionTitle.Margin
|
||
$Margin.Top += $pos * $dh
|
||
$Title.Margin = $Margin
|
||
$Title.Text = Get-Translation($Name)
|
||
$XMLGrid.Children.Insert(2 * $Stage + 2, $Title)
|
||
|
||
$Combo = New-Object System.Windows.Controls.ComboBox
|
||
$Combo.FontSize = $WindowsVersion.FontSize
|
||
$Combo.Height = $WindowsVersion.Height;
|
||
$Combo.Width = $WindowsVersion.Width;
|
||
$Combo.HorizontalAlignment = "Left"
|
||
$Combo.VerticalAlignment = "Top"
|
||
$Margin = $WindowsVersion.Margin
|
||
$Margin.Top += $pos * $script:dh
|
||
$Combo.Margin = $Margin
|
||
$Combo.SelectedIndex = 0
|
||
if ($Items) {
|
||
$Combo.ItemsSource = $Items
|
||
if ($DisplayName) {
|
||
$Combo.DisplayMemberPath = $DisplayName
|
||
} else {
|
||
$Combo.DisplayMemberPath = $Name
|
||
}
|
||
}
|
||
$XMLGrid.Children.Insert(2 * $Stage + 3, $Combo)
|
||
|
||
$XMLForm.Height += $dh;
|
||
$Margin = $Continue.Margin
|
||
$Margin.Top += $dh
|
||
$Continue.Margin = $Margin
|
||
$Margin = $Back.Margin
|
||
$Margin.Top += $dh
|
||
$Back.Margin = $Margin
|
||
|
||
return $Combo
|
||
}
|
||
|
||
function Refresh-Control([object]$Control)
|
||
{
|
||
$Control.Dispatcher.Invoke("Render", [Windows.Input.InputEventHandler] { $Continue.UpdateLayout() }, $null, $null) | Out-Null
|
||
}
|
||
|
||
function Send-Message([string]$PipeName, [string]$Message)
|
||
{
|
||
[System.Text.Encoding]$Encoding = [System.Text.Encoding]::UTF8
|
||
$Pipe = New-Object -TypeName System.IO.Pipes.NamedPipeClientStream -ArgumentList ".", $PipeName, ([System.IO.Pipes.PipeDirection]::Out), ([System.IO.Pipes.PipeOptions]::None), ([System.Security.Principal.TokenImpersonationLevel]::Impersonation)
|
||
try {
|
||
$Pipe.Connect(1000)
|
||
} catch {
|
||
Write-Host $_.Exception.Message
|
||
}
|
||
$bRequest = $Encoding.GetBytes($Message)
|
||
$cbRequest = $bRequest.Length;
|
||
$Pipe.Write($bRequest, 0, $cbRequest);
|
||
$Pipe.Dispose()
|
||
}
|
||
|
||
# From https://www.powershellgallery.com/packages/IconForGUI/1.5.2
|
||
# Copyright © 2016 Chris Carter. All rights reserved.
|
||
# License: https://creativecommons.org/licenses/by-sa/4.0/
|
||
function ConvertTo-ImageSource
|
||
{
|
||
[CmdletBinding()]
|
||
Param(
|
||
[Parameter(Mandatory=$true,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
|
||
[System.Drawing.Icon]$Icon
|
||
)
|
||
|
||
Process {
|
||
foreach ($i in $Icon) {
|
||
[System.Windows.Interop.Imaging]::CreateBitmapSourceFromHIcon(
|
||
$i.Handle,
|
||
(New-Object System.Windows.Int32Rect -Args 0,0,$i.Width, $i.Height),
|
||
[System.Windows.Media.Imaging.BitmapSizeOptions]::FromEmptyOptions()
|
||
)
|
||
}
|
||
}
|
||
}
|
||
|
||
function Throw-Error([object]$Req, [string]$Alt)
|
||
{
|
||
$Err = $(GetElementById -Request $Req -Id "errorModalMessage").innerText -replace "<[^>]+>" -replace "\s+", " "
|
||
if (!$Err) {
|
||
$Err = $Alt
|
||
} else {
|
||
$Err = [System.Text.Encoding]::UTF8.GetString([byte[]][char[]]$Err)
|
||
}
|
||
throw $Err
|
||
}
|
||
|
||
# Translate a message string
|
||
function Get-Translation([string]$Text)
|
||
{
|
||
if (!($English -contains $Text)) {
|
||
Write-Host "Error: '$Text' is not a translatable string"
|
||
return "(Untranslated)"
|
||
}
|
||
if ($Localized) {
|
||
if ($Localized.Length -ne $English.Length) {
|
||
Write-Host "Error: '$Text' is not a translatable string"
|
||
}
|
||
for ($i = 0; $i -lt $English.Length; $i++) {
|
||
if ($English[$i] -eq $Text) {
|
||
if ($Localized[$i]) {
|
||
return $Localized[$i]
|
||
} else {
|
||
return $Text
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return $Text
|
||
}
|
||
|
||
# Some PowerShells don't have Microsoft.mshtml assembly (comes with MS Office?)
|
||
# so we can't use ParsedHtml or IHTMLDocument[2|3] features there...
|
||
function GetElementById([object]$Request, [string]$Id)
|
||
{
|
||
try {
|
||
return $Request.ParsedHtml.IHTMLDocument3_GetElementByID($Id)
|
||
} catch {
|
||
return $Request.AllElements | ? {$_.id -eq $Id}
|
||
}
|
||
}
|
||
|
||
function Error([string]$ErrorMessage)
|
||
{
|
||
Write-Host Error: $ErrorMessage
|
||
if (!$Cmd) {
|
||
$XMLForm.Title = $(Get-Translation("Error")) + ": " + $ErrorMessage
|
||
Refresh-Control($XMLForm)
|
||
$XMLGrid.Children[2 * $script:Stage + 1].IsEnabled = $true
|
||
$UserInput = [System.Windows.MessageBox]::Show($XMLForm.Title, $(Get-Translation("Error")), "OK", "Error")
|
||
$script:ExitCode = $script:Stage--
|
||
} else {
|
||
$script:ExitCode = 2
|
||
}
|
||
}
|
||
|
||
function Get-RandomDate()
|
||
{
|
||
[DateTime]$Min = "1/1/2008"
|
||
[DateTime]$Max = [DateTime]::Now
|
||
|
||
$RandomGen = new-object random
|
||
$RandomTicks = [Convert]::ToInt64( ($Max.ticks * 1.0 - $Min.Ticks * 1.0 ) * $RandomGen.NextDouble() + $Min.Ticks * 1.0 )
|
||
$Date = new-object DateTime($RandomTicks)
|
||
return $Date.ToString("yyyyMMdd")
|
||
}
|
||
#endregion
|
||
|
||
#region Form
|
||
[xml]$XAML = @"
|
||
<Window xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" Height = "162" Width = "384" ResizeMode = "NoResize">
|
||
<Grid Name = "XMLGrid">
|
||
<Button Name = "Continue" FontSize = "16" Height = "26" Width = "160" HorizontalAlignment = "Left" VerticalAlignment = "Top" Margin = "14,78,0,0"/>
|
||
<Button Name = "Back" FontSize = "16" Height = "26" Width = "160" HorizontalAlignment = "Left" VerticalAlignment = "Top" Margin = "194,78,0,0"/>
|
||
<TextBlock Name = "WindowsVersionTitle" FontSize = "16" Width="340" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="16,8,0,0"/>
|
||
<ComboBox Name = "WindowsVersion" FontSize = "14" Height = "24" Width = "340" HorizontalAlignment = "Left" VerticalAlignment="Top" Margin = "14,34,0,0" SelectedIndex = "0"/>
|
||
<CheckBox Name = "Check" FontSize = "14" Width = "340" HorizontalAlignment = "Left" VerticalAlignment="Top" Margin = "14,0,0,0" Visibility="Collapsed" />
|
||
</Grid>
|
||
</Window>
|
||
"@
|
||
#endregion
|
||
|
||
#region Globals
|
||
$ErrorActionPreference = "Stop"
|
||
$DefaultTimeout = 30
|
||
$dh = 58
|
||
$Stage = 0
|
||
$SelectedIndex = 0
|
||
$ltrm = ""
|
||
if ($Cmd) {
|
||
$ltrm = ""
|
||
}
|
||
$MaxStage = 4
|
||
$SessionId = [guid]::NewGuid()
|
||
$ExitCode = 100
|
||
$Locale = $Locale
|
||
$RequestData = @{}
|
||
# This GUID applies to all visitors, regardless of their locale
|
||
$RequestData["GetLangs"] = @("a8f8f489-4c7f-463a-9ca6-5cff94d8d041", "getskuinformationbyproductedition" )
|
||
# This GUID applies to visitors of the en-US download page. Other locales may get a different GUID.
|
||
$RequestData["GetLinks"] = @("6e2a1789-ef16-4f27-a296-74ef7ef5d96b", "GetProductDownloadLinksBySku" )
|
||
# Create a semi-random Linux User-Agent string
|
||
$FirefoxVersion = Get-Random -Minimum 110 -Maximum 135
|
||
$FirefoxDate = Get-RandomDate
|
||
$UserAgent = "Mozilla/5.0 (X11; Linux i586; rv:$FirefoxVersion.0) Gecko/$FirefoxDate Firefox/$FirefoxVersion.0"
|
||
$Verbosity = 1
|
||
if ($Debug) {
|
||
$Verbosity = 5
|
||
} elseif ($Verbose) {
|
||
$Verbosity = 2
|
||
} elseif ($Cmd -and $GetUrl) {
|
||
$Verbosity = 0
|
||
}
|
||
#endregion
|
||
|
||
# Localization
|
||
$EnglishMessages = "en-US|Version|Release|Edition|Language|Architecture|Download|Continue|Back|Close|Cancel|Error|Please wait...|" +
|
||
"Download using a browser|Download of Windows ISOs is unavailable due to Microsoft having altered their website to prevent it.|" +
|
||
"PowerShell 3.0 or later is required to run this script.|Do you want to go online and download it?|" +
|
||
"This feature is not available on this platform."
|
||
[string[]]$English = $EnglishMessages.Split('|')
|
||
[string[]]$Localized = $null
|
||
if ($LocData -and !$LocData.StartsWith("en-US")) {
|
||
$Localized = $LocData.Split('|')
|
||
# Adjust the $Localized array if we have more or fewer strings than in $EnglishMessages
|
||
if ($Localized.Length -lt $English.Length) {
|
||
while ($Localized.Length -ne $English.Length) {
|
||
$Localized += $English[$Localized.Length]
|
||
}
|
||
} elseif ($Localized.Length -gt $English.Length) {
|
||
$Localized = $LocData.Split('|')[0..($English.Length - 1)]
|
||
}
|
||
$Locale = $Localized[0]
|
||
}
|
||
$QueryLocale = $Locale
|
||
|
||
# Convert a size in bytes to a human readable string
|
||
function Size-To-Human-Readable([uint64]$size)
|
||
{
|
||
$suffix = "bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"
|
||
$i = 0
|
||
while ($size -gt 1kb) {
|
||
$size = $size / 1kb
|
||
$i++
|
||
}
|
||
"{0:N1} {1}" -f $size, $suffix[$i]
|
||
}
|
||
|
||
# Check if the locale we want is available - Fall back to en-US otherwise
|
||
function Check-Locale
|
||
{
|
||
try {
|
||
$url = "https://www.microsoft.com/" + $QueryLocale + "/software-download/"
|
||
if ($Verbosity -ge 2) {
|
||
Write-Host Querying $url
|
||
}
|
||
# Looks Microsoft are filtering our script according to the first query it performs with the spoofed user agent.
|
||
# So, to continue this pointless cat and mouse game, we simply add an extra first query with the default user agent.
|
||
# Also: "Hi Microsoft. You sure have A LOT OF RESOURCES TO WASTE to have assigned folks of yours to cripple scripts
|
||
# that merely exist because you have chosen to make the user experience from your download website utterly subpar.
|
||
# And while I am glad senpai noticed me (UwU), I feel compelled to ask: Don't you guys have better things to do?"
|
||
Invoke-WebRequest -UseBasicParsing -TimeoutSec $DefaultTimeout -MaximumRedirection 0 $url | Out-Null
|
||
Invoke-WebRequest -UseBasicParsing -TimeoutSec $DefaultTimeout -MaximumRedirection 0 -UserAgent $UserAgent $url | Out-Null
|
||
} catch {
|
||
# Of course PowerShell 7 had to BREAK $_.Exception.Status on timeouts...
|
||
if ($_.Exception.Status -eq "Timeout" -or $_.Exception.GetType().Name -eq "TaskCanceledException") {
|
||
Write-Host Operation Timed out
|
||
}
|
||
$script:QueryLocale = "en-US"
|
||
}
|
||
}
|
||
|
||
# Return an array of releases (e.g. 20H2, 21H1, ...) for the selected Windows version
|
||
function Get-Windows-Releases([int]$SelectedVersion)
|
||
{
|
||
$i = 0
|
||
$releases = @()
|
||
foreach ($version in $WindowsVersions[$SelectedVersion]) {
|
||
if (($i -ne 0) -and ($version -is [array])) {
|
||
$releases += @(New-Object PsObject -Property @{ Release = $ltrm + $version[0].Replace(")", ")" + $ltrm); Index = $i })
|
||
}
|
||
$i++
|
||
}
|
||
return $releases
|
||
}
|
||
|
||
# Return an array of editions (e.g. Home, Pro, etc) for the selected Windows release
|
||
function Get-Windows-Editions([int]$SelectedVersion, [int]$SelectedRelease)
|
||
{
|
||
$editions = @()
|
||
foreach ($release in $WindowsVersions[$SelectedVersion][$SelectedRelease])
|
||
{
|
||
if ($release -is [array]) {
|
||
if (!($release[0].Contains("China")) -or ($Locale.StartsWith("zh"))) {
|
||
$editions += @(New-Object PsObject -Property @{ Edition = $release[0]; Id = $release[1] })
|
||
}
|
||
}
|
||
}
|
||
return $editions
|
||
}
|
||
|
||
# Return an array of languages for the selected edition
|
||
function Get-Windows-Languages([int]$SelectedVersion, [int]$SelectedEdition)
|
||
{
|
||
$languages = @()
|
||
$i = 0;
|
||
if ($WindowsVersions[$SelectedVersion][0][1].StartsWith("UEFI_SHELL")) {
|
||
$languages += @(New-Object PsObject -Property @{ DisplayLanguage = "English (US)"; Language = "en-us"; Id = 0 })
|
||
} else {
|
||
# Microsoft download protection now requires the sessionId to be whitelisted through vlscppe.microsoft.com/tags
|
||
$url = "https://vlscppe.microsoft.com/tags?org_id=y6jn8c31&session_id=" + $SessionId
|
||
if ($Verbosity -ge 2) {
|
||
Write-Host Querying $url
|
||
}
|
||
try {
|
||
Invoke-WebRequest -UseBasicParsing -TimeoutSec $DefaultTimeout -MaximumRedirection 0 -UserAgent $UserAgent $url | Out-Null
|
||
} catch {
|
||
Error($_.Exception.Message)
|
||
return @()
|
||
}
|
||
$url = "https://www.microsoft.com/" + $QueryLocale + "/api/controls/contentinclude/html"
|
||
$url += "?pageId=" + $RequestData["GetLangs"][0]
|
||
$url += "&host=www.microsoft.com"
|
||
$url += "&segments=software-download," + $WindowsVersions[$SelectedVersion][0][1]
|
||
$url += "&query=&action=" + $RequestData["GetLangs"][1]
|
||
$url += "&sessionId=" + $SessionId
|
||
$url += "&productEditionId=" + $SelectedEdition
|
||
$url += "&sdVersion=2"
|
||
if ($Verbosity -ge 2) {
|
||
Write-Host Querying $url
|
||
}
|
||
|
||
$script:SelectedIndex = 0
|
||
try {
|
||
$r = Invoke-WebRequest -Method Post -UseBasicParsing -TimeoutSec $DefaultTimeout -UserAgent $UserAgent -SessionVariable "Session" $url
|
||
if ($Verbosity -ge 5) {
|
||
Write-Host "=============================================================================="
|
||
Write-Host $r
|
||
Write-Host "=============================================================================="
|
||
}
|
||
if ($r -match "errorModalMessage") {
|
||
Throw-Error -Req $r -Alt "Could not retrieve languages from server"
|
||
}
|
||
$r = $r -replace "`n" -replace "`r"
|
||
$pattern = '.*<select id="product-languages"[^>]*>(.*)</select>.*'
|
||
$html = [regex]::Match($r, $pattern).Groups[1].Value
|
||
# Go through an XML conversion to keep all PowerShells happy...
|
||
$html = $html.Replace("selected value", "value")
|
||
$html = "<options>" + $html + "</options>"
|
||
$xml = [xml]$html
|
||
foreach ($var in $xml.options.option) {
|
||
$json = $var.value | ConvertFrom-Json;
|
||
if ($json) {
|
||
$languages += @(New-Object PsObject -Property @{ DisplayLanguage = $var.InnerText; Language = $json.language; Id = $json.id })
|
||
if (Select-Language($json.language)) {
|
||
$script:SelectedIndex = $i
|
||
}
|
||
$i++
|
||
}
|
||
}
|
||
if ($languages.Length -eq 0) {
|
||
Throw-Error -Req $r -Alt "Could not parse languages"
|
||
}
|
||
} catch {
|
||
Error($_.Exception.Message)
|
||
return @()
|
||
}
|
||
}
|
||
return $languages
|
||
}
|
||
|
||
# Return an array of download links for each supported arch
|
||
function Get-Windows-Download-Links([int]$SelectedVersion, [int]$SelectedRelease, [int]$SelectedEdition, [string]$SkuId, [string]$LanguageName)
|
||
{
|
||
$links = @()
|
||
if ($WindowsVersions[$SelectedVersion][0][1].StartsWith("UEFI_SHELL")) {
|
||
$tag = $WindowsVersions[$SelectedVersion][$SelectedRelease][0].Split(' ')[0]
|
||
$shell_version = $WindowsVersions[$SelectedVersion][0][1].Split(' ')[1]
|
||
$url = "https://github.com/pbatard/UEFI-Shell/releases/download/" + $tag
|
||
$link = $url + "/UEFI-Shell-" + $shell_version + "-" + $tag
|
||
if ($SelectedEdition -eq 0) {
|
||
$link += "-RELEASE.iso"
|
||
} else {
|
||
$link += "-DEBUG.iso"
|
||
}
|
||
try {
|
||
# Read the supported archs from the release URL
|
||
$url += "/Version.xml"
|
||
$xml = New-Object System.Xml.XmlDocument
|
||
if ($Verbosity -ge 2) {
|
||
Write-Host Querying $url
|
||
}
|
||
$xml.Load($url)
|
||
$sep = ""
|
||
$archs = ""
|
||
foreach($arch in $xml.release.supported_archs.arch) {
|
||
$archs += $sep + $arch
|
||
$sep = ", "
|
||
}
|
||
$links += @(New-Object PsObject -Property @{ Type = $archs; Link = $link })
|
||
} catch {
|
||
Error($_.Exception.Message)
|
||
return @()
|
||
}
|
||
} else {
|
||
$url = "https://www.microsoft.com/" + $QueryLocale + "/api/controls/contentinclude/html"
|
||
$url += "?pageId=" + $RequestData["GetLinks"][0]
|
||
$url += "&host=www.microsoft.com"
|
||
$url += "&segments=software-download," + $WindowsVersions[$SelectedVersion][0][1]
|
||
$url += "&query=&action=" + $RequestData["GetLinks"][1]
|
||
$url += "&sessionId=" + $SessionId
|
||
$url += "&skuId=" + $SkuId
|
||
$url += "&language=" + $LanguageName
|
||
$url += "&sdVersion=2"
|
||
if ($Verbosity -ge 2) {
|
||
Write-Host Querying $url
|
||
}
|
||
|
||
$i = 0
|
||
$script:SelectedIndex = 0
|
||
|
||
try {
|
||
$Is64 = [Environment]::Is64BitOperatingSystem
|
||
# Must add a referer for this request, else Microsoft's servers will deny it
|
||
$ref = "https://www.microsoft.com/software-download/windows11"
|
||
$r = Invoke-WebRequest -Method Post -Headers @{ "Referer" = $ref } -UseBasicParsing -TimeoutSec $DefaultTimeout -UserAgent $UserAgent -WebSession $Session $url
|
||
if ($Verbosity -ge 5) {
|
||
Write-Host "=============================================================================="
|
||
Write-Host $r
|
||
Write-Host "=============================================================================="
|
||
}
|
||
if ($r -match "errorModalMessage") {
|
||
$Alt = [regex]::Match($r.Content, '<p id="errorModalMessage">(.+?)<\/p>').Groups[1].Value -replace "<[^>]+>" -replace "\s+", " " -replace "\?\?\?", "-"
|
||
$Alt = [System.Text.Encoding]::UTF8.GetString([byte[]][char[]]$Alt)
|
||
if (!$Alt) {
|
||
$Alt = "Could not retrieve architectures from server"
|
||
} elseif ($Alt -match "715-123130") {
|
||
$Alt += " " + $SessionId + "."
|
||
}
|
||
Throw-Error -Req $r -Alt $Alt
|
||
}
|
||
$pattern = '(?s)(<input.*?></input>)'
|
||
ForEach-Object { [regex]::Matches($r, $pattern) } | ForEach-Object { $html += $_.Groups[1].value }
|
||
# Need to fix the HTML and JSON data so that it is well-formed
|
||
$html = $html.Replace("class=product-download-hidden", "")
|
||
$html = $html.Replace("type=hidden", "")
|
||
$html = $html.Replace(" ", " ")
|
||
$html = $html.Replace("IsoX86", ""x86"")
|
||
$html = $html.Replace("IsoX64", ""x64"")
|
||
$html = "<inputs>" + $html + "</inputs>"
|
||
$xml = [xml]$html
|
||
foreach ($var in $xml.inputs.input) {
|
||
$json = $var.value | ConvertFrom-Json;
|
||
if ($json) {
|
||
if (($Is64 -and $json.DownloadType -eq "x64") -or (!$Is64 -and $json.DownloadType -eq "x86")) {
|
||
$script:SelectedIndex = $i
|
||
}
|
||
$links += @(New-Object PsObject -Property @{ Type = $json.DownloadType; Link = $json.Uri })
|
||
$i++
|
||
}
|
||
}
|
||
if ($links.Length -eq 0) {
|
||
Throw-Error -Req $r -Alt "Could not retrieve ISO download links"
|
||
}
|
||
} catch {
|
||
Error($_.Exception.Message)
|
||
return @()
|
||
}
|
||
}
|
||
return $links
|
||
}
|
||
|
||
# Process the download URL by either sending it through the pipe or by opening the browser
|
||
function Process-Download-Link([string]$Url)
|
||
{
|
||
try {
|
||
if ($PipeName -and !$Check.IsChecked) {
|
||
Send-Message -PipeName $PipeName -Message $Url
|
||
} else {
|
||
if ($Cmd) {
|
||
$pattern = '.*\/(.*\.iso).*'
|
||
$File = [regex]::Match($Url, $pattern).Groups[1].Value
|
||
# PowerShell implicit conversions are iffy, so we need to force them...
|
||
$str_size = (Invoke-WebRequest -UseBasicParsing -TimeoutSec $DefaultTimeout -Uri $Url -Method Head).Headers.'Content-Length'
|
||
$tmp_size = [uint64]::Parse($str_size)
|
||
$Size = Size-To-Human-Readable $tmp_size
|
||
Write-Host "Downloading '$File' ($Size)..."
|
||
Start-BitsTransfer -Source $Url -Destination $File
|
||
} else {
|
||
Write-Host Download Link: $Url
|
||
Start-Process -FilePath $Url
|
||
}
|
||
}
|
||
} catch {
|
||
Error($_.Exception.Message)
|
||
return 404
|
||
}
|
||
return 0
|
||
}
|
||
|
||
if ($Cmd) {
|
||
$winVersionId = $null
|
||
$winReleaseId = $null
|
||
$winEditionId = $null
|
||
$winLanguageId = $null
|
||
$winLanguageName = $null
|
||
$winLink = $null
|
||
|
||
# Windows 7 and non Windows platforms are too much of a liability
|
||
if ($winver -le 6.1) {
|
||
Error(Get-Translation("This feature is not available on this platform."))
|
||
exit 403
|
||
}
|
||
|
||
$i = 0
|
||
$Selected = ""
|
||
if ($Win -eq "List") {
|
||
Write-Host "Please select a Windows Version (-Win):"
|
||
}
|
||
foreach($version in $WindowsVersions) {
|
||
if ($Win -eq "List") {
|
||
Write-Host " -" $version[0][0]
|
||
} elseif ($version[0][0] -match $Win) {
|
||
$Selected += $version[0][0]
|
||
$winVersionId = $i
|
||
break;
|
||
}
|
||
$i++
|
||
}
|
||
if ($winVersionId -eq $null) {
|
||
if ($Win -ne "List") {
|
||
Write-Host "Invalid Windows version provided."
|
||
Write-Host "Use '-Win List' for a list of available Windows versions."
|
||
}
|
||
exit 1
|
||
}
|
||
|
||
# Windows Version selection
|
||
$releases = Get-Windows-Releases $winVersionId
|
||
if ($Rel -eq "List") {
|
||
Write-Host "Please select a Windows Release (-Rel) for ${Selected} (or use 'Latest' for most recent):"
|
||
}
|
||
foreach ($release in $releases) {
|
||
if ($Rel -eq "List") {
|
||
Write-Host " -" $release.Release
|
||
} elseif (!$Rel -or $release.Release.StartsWith($Rel) -or $Rel -eq "Latest") {
|
||
if (!$Rel -and $Verbosity -ge 1) {
|
||
Write-Host "No release specified (-Rel). Defaulting to '$($release.Release)'."
|
||
}
|
||
$Selected += " " + $release.Release
|
||
$winReleaseId = $release.Index
|
||
break;
|
||
}
|
||
}
|
||
if ($winReleaseId -eq $null) {
|
||
if ($Rel -ne "List") {
|
||
Write-Host "Invalid Windows release provided."
|
||
Write-Host "Use '-Rel List' for a list of available $Selected releases or '-Rel Latest' for latest."
|
||
}
|
||
exit 1
|
||
}
|
||
|
||
# Windows Release selection => Populate Product Edition
|
||
$editions = Get-Windows-Editions $winVersionId $winReleaseId
|
||
if ($Ed -eq "List") {
|
||
Write-Host "Please select a Windows Edition (-Ed) for ${Selected}:"
|
||
}
|
||
foreach($edition in $editions) {
|
||
if ($Ed -eq "List") {
|
||
Write-Host " -" $edition.Edition
|
||
} elseif (!$Ed -or $edition.Edition -match $Ed) {
|
||
if (!$Ed -and $Verbosity -ge 1) {
|
||
Write-Host "No edition specified (-Ed). Defaulting to '$($edition.Edition)'."
|
||
}
|
||
$Selected += "," + $edition.Edition -replace "Windows [0-9\.]*"
|
||
$winEditionId = $edition.Id
|
||
break;
|
||
}
|
||
}
|
||
if ($winEditionId -eq $null) {
|
||
if ($Ed -ne "List") {
|
||
Write-Host "Invalid Windows edition provided."
|
||
Write-Host "Use '-Ed List' for a list of available editions or remove the -Ed parameter to use default."
|
||
}
|
||
exit 1
|
||
}
|
||
|
||
# Product Edition selection => Request and populate Languages
|
||
$languages = Get-Windows-Languages $winVersionId $winEditionId
|
||
if (!$languages) {
|
||
exit 3
|
||
}
|
||
if ($Lang -eq "List") {
|
||
Write-Host "Please select a Language (-Lang) for ${Selected}:"
|
||
} elseif ($Lang) {
|
||
# Escape parentheses so that they aren't interpreted as regex
|
||
$Lang = $Lang.replace('(', '\(')
|
||
$Lang = $Lang.replace(')', '\)')
|
||
}
|
||
$i = 0
|
||
foreach ($language in $languages) {
|
||
if ($Lang -eq "List") {
|
||
Write-Host " -" $language.Language
|
||
} elseif ((!$Lang -and $script:SelectedIndex -eq $i) -or ($Lang -and $language.Language -match $Lang)) {
|
||
if (!$Lang -and $Verbosity -ge 1) {
|
||
Write-Host "No language specified (-Lang). Defaulting to '$($language.Language)'."
|
||
}
|
||
$Selected += ", " + $language.Language
|
||
$winLanguageId = $language.Id
|
||
$winLanguageName = $language.Language
|
||
break;
|
||
}
|
||
$i++
|
||
}
|
||
if (!$winLanguageId -or !$winLanguageName) {
|
||
if ($Lang -ne "List") {
|
||
Write-Host "Invalid Windows language provided."
|
||
Write-Host "Use '-Lang List' for a list of available languages or remove the option to use system default."
|
||
}
|
||
exit 1
|
||
}
|
||
|
||
# Language selection => Request and populate Arch download links
|
||
$links = Get-Windows-Download-Links $winVersionId $winReleaseId $winEditionId $winLanguageId $winLanguageName
|
||
if (!$links) {
|
||
exit 3
|
||
}
|
||
if ($Arch -eq "List") {
|
||
Write-Host "Please select an Architecture (-Arch) for ${Selected}:"
|
||
}
|
||
$i = 0
|
||
foreach ($link in $links) {
|
||
if ($Arch -eq "List") {
|
||
Write-Host " -" $link.Type
|
||
} elseif ((!$Arch -and $script:SelectedIndex -eq $i) -or ($Arch -and $link.Type -match $Arch)) {
|
||
if (!$Arch -and $Verbosity -ge 1) {
|
||
Write-Host "No architecture specified (-Arch). Defaulting to '$($link.Type)'."
|
||
}
|
||
$Selected += ", [" + $link.Type + "]"
|
||
$winLink = $link
|
||
break;
|
||
}
|
||
$i++
|
||
}
|
||
if ($winLink -eq $null) {
|
||
if ($Arch -ne "List") {
|
||
Write-Host "Invalid Windows architecture provided."
|
||
Write-Host "Use '-Arch List' for a list of available architectures or remove the option to use system default."
|
||
}
|
||
exit 1
|
||
}
|
||
|
||
# Arch selection => Return selected download link
|
||
if ($GetUrl) {
|
||
Return $winLink.Link
|
||
$ExitCode = 0
|
||
} else {
|
||
Write-Host "Selected: $Selected"
|
||
$ExitCode = Process-Download-Link $winLink.Link
|
||
}
|
||
|
||
# Clean up & exit
|
||
exit $ExitCode
|
||
}
|
||
|
||
# Form creation
|
||
$XMLForm = [Windows.Markup.XamlReader]::Load((New-Object System.Xml.XmlNodeReader $XAML))
|
||
$XAML.SelectNodes("//*[@Name]") | ForEach-Object { Set-Variable -Name ($_.Name) -Value $XMLForm.FindName($_.Name) -Scope Script }
|
||
$XMLForm.Title = $AppTitle
|
||
if ($Icon) {
|
||
$XMLForm.Icon = $Icon
|
||
} else {
|
||
$XMLForm.Icon = [WinAPI.Utils]::ExtractIcon("imageres.dll", -5205, $true) | ConvertTo-ImageSource
|
||
}
|
||
if ($Locale.StartsWith("ar") -or $Locale.StartsWith("fa") -or $Locale.StartsWith("he")) {
|
||
$XMLForm.FlowDirection = "RightToLeft"
|
||
}
|
||
$WindowsVersionTitle.Text = Get-Translation("Version")
|
||
$Continue.Content = Get-Translation("Continue")
|
||
$Back.Content = Get-Translation("Close")
|
||
|
||
# Windows 7 and non Windows platforms are too much of a liability
|
||
if ($winver -le 6.1) {
|
||
Error(Get-Translation("This feature is not available on this platform."))
|
||
exit 403
|
||
}
|
||
|
||
# Populate the Windows versions
|
||
$i = 0
|
||
$versions = @()
|
||
foreach($version in $WindowsVersions) {
|
||
$versions += @(New-Object PsObject -Property @{ Version = $version[0][0]; PageType = $version[0][1]; Index = $i })
|
||
$i++
|
||
}
|
||
$WindowsVersion.ItemsSource = $versions
|
||
$WindowsVersion.DisplayMemberPath = "Version"
|
||
|
||
# Button Action
|
||
$Continue.add_click({
|
||
$script:Stage++
|
||
$XMLGrid.Children[2 * $Stage + 1].IsEnabled = $false
|
||
$Continue.IsEnabled = $false
|
||
$Back.IsEnabled = $false
|
||
Refresh-Control($Continue)
|
||
Refresh-Control($Back)
|
||
|
||
switch ($Stage) {
|
||
|
||
1 { # Windows Version selection
|
||
$XMLForm.Title = Get-Translation($English[12])
|
||
Refresh-Control($XMLForm)
|
||
if ($WindowsVersion.SelectedValue.Version.StartsWith("Windows")) {
|
||
Check-Locale
|
||
}
|
||
$releases = Get-Windows-Releases $WindowsVersion.SelectedValue.Index
|
||
$script:WindowsRelease = Add-Entry $Stage "Release" $releases
|
||
$Back.Content = Get-Translation($English[8])
|
||
$XMLForm.Title = $AppTitle
|
||
}
|
||
|
||
2 { # Windows Release selection => Populate Product Edition
|
||
$editions = Get-Windows-Editions $WindowsVersion.SelectedValue.Index $WindowsRelease.SelectedValue.Index
|
||
$script:ProductEdition = Add-Entry $Stage "Edition" $editions
|
||
}
|
||
|
||
3 { # Product Edition selection => Request and populate languages
|
||
$XMLForm.Title = Get-Translation($English[12])
|
||
Refresh-Control($XMLForm)
|
||
$languages = Get-Windows-Languages $WindowsVersion.SelectedValue.Index $ProductEdition.SelectedValue.Id
|
||
if ($languages.Length -eq 0) {
|
||
break
|
||
}
|
||
$script:Language = Add-Entry $Stage "Language" $languages "DisplayLanguage"
|
||
$Language.SelectedIndex = $script:SelectedIndex
|
||
$XMLForm.Title = $AppTitle
|
||
}
|
||
|
||
4 { # Language selection => Request and populate Arch download links
|
||
$XMLForm.Title = Get-Translation($English[12])
|
||
Refresh-Control($XMLForm)
|
||
$links = Get-Windows-Download-Links $WindowsVersion.SelectedValue.Index $WindowsRelease.SelectedValue.Index $ProductEdition.SelectedValue.Id $Language.SelectedValue.Id $Language.SelectedValue.Language
|
||
if ($links.Length -eq 0) {
|
||
break
|
||
}
|
||
$script:Architecture = Add-Entry $Stage "Architecture" $links "Type"
|
||
if ($PipeName) {
|
||
$XMLForm.Height += $dh / 2;
|
||
$Margin = $Continue.Margin
|
||
$top = $Margin.Top
|
||
$Margin.Top += $dh /2
|
||
$Continue.Margin = $Margin
|
||
$Margin = $Back.Margin
|
||
$Margin.Top += $dh / 2
|
||
$Back.Margin = $Margin
|
||
$Margin = $Check.Margin
|
||
$Margin.Top = $top - 2
|
||
$Check.Margin = $Margin
|
||
$Check.Content = Get-Translation($English[13])
|
||
$Check.Visibility = "Visible"
|
||
}
|
||
$Architecture.SelectedIndex = $script:SelectedIndex
|
||
$Continue.Content = Get-Translation("Download")
|
||
$XMLForm.Title = $AppTitle
|
||
}
|
||
|
||
5 { # Arch selection => Return selected download link
|
||
$script:ExitCode = Process-Download-Link $Architecture.SelectedValue.Link
|
||
$XMLForm.Close()
|
||
}
|
||
}
|
||
$Continue.IsEnabled = $true
|
||
if ($Stage -ge 0) {
|
||
$Back.IsEnabled = $true
|
||
}
|
||
})
|
||
|
||
$Back.add_click({
|
||
if ($Stage -eq 0) {
|
||
$XMLForm.Close()
|
||
} else {
|
||
$XMLGrid.Children.RemoveAt(2 * $Stage + 3)
|
||
$XMLGrid.Children.RemoveAt(2 * $Stage + 2)
|
||
$XMLGrid.Children[2 * $Stage + 1].IsEnabled = $true
|
||
$dh2 = $dh
|
||
if ($Stage -eq 4 -and $PipeName) {
|
||
$Check.Visibility = "Collapsed"
|
||
$dh2 += $dh / 2
|
||
}
|
||
$XMLForm.Height -= $dh2;
|
||
$Margin = $Continue.Margin
|
||
$Margin.Top -= $dh2
|
||
$Continue.Margin = $Margin
|
||
$Margin = $Back.Margin
|
||
$Margin.Top -= $dh2
|
||
$Back.Margin = $Margin
|
||
$script:Stage = $Stage - 1
|
||
$XMLForm.Title = $AppTitle
|
||
if ($Stage -eq 0) {
|
||
$Back.Content = Get-Translation("Close")
|
||
} else {
|
||
$Continue.Content = Get-Translation("Continue")
|
||
Refresh-Control($Continue)
|
||
}
|
||
}
|
||
})
|
||
|
||
# Display the dialog
|
||
$XMLForm.Add_Loaded({$XMLForm.Activate()})
|
||
$XMLForm.ShowDialog() | Out-Null
|
||
|
||
# Clean up & exit
|
||
exit $ExitCode
|
||
|
||
# SIG # Begin signature block
|
||
# MIItOwYJKoZIhvcNAQcCoIItLDCCLSgCAQExDzANBglghkgBZQMEAgEFADB5Bgor
|
||
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
|
||
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCxrIeJlOBDALvk
|
||
# 3mpyUKDwXkqnbzHDj+/a4VP9siXsDKCCEkAwggVvMIIEV6ADAgECAhBI/JO0YFWU
|
||
# jTanyYqJ1pQWMA0GCSqGSIb3DQEBDAUAMHsxCzAJBgNVBAYTAkdCMRswGQYDVQQI
|
||
# DBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoM
|
||
# EUNvbW9kbyBDQSBMaW1pdGVkMSEwHwYDVQQDDBhBQUEgQ2VydGlmaWNhdGUgU2Vy
|
||
# dmljZXMwHhcNMjEwNTI1MDAwMDAwWhcNMjgxMjMxMjM1OTU5WjBWMQswCQYDVQQG
|
||
# EwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMS0wKwYDVQQDEyRTZWN0aWdv
|
||
# IFB1YmxpYyBDb2RlIFNpZ25pbmcgUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEBAQUA
|
||
# A4ICDwAwggIKAoICAQCN55QSIgQkdC7/FiMCkoq2rjaFrEfUI5ErPtx94jGgUW+s
|
||
# hJHjUoq14pbe0IdjJImK/+8Skzt9u7aKvb0Ffyeba2XTpQxpsbxJOZrxbW6q5KCD
|
||
# J9qaDStQ6Utbs7hkNqR+Sj2pcaths3OzPAsM79szV+W+NDfjlxtd/R8SPYIDdub7
|
||
# P2bSlDFp+m2zNKzBenjcklDyZMeqLQSrw2rq4C+np9xu1+j/2iGrQL+57g2extme
|
||
# me/G3h+pDHazJyCh1rr9gOcB0u/rgimVcI3/uxXP/tEPNqIuTzKQdEZrRzUTdwUz
|
||
# T2MuuC3hv2WnBGsY2HH6zAjybYmZELGt2z4s5KoYsMYHAXVn3m3pY2MeNn9pib6q
|
||
# RT5uWl+PoVvLnTCGMOgDs0DGDQ84zWeoU4j6uDBl+m/H5x2xg3RpPqzEaDux5mcz
|
||
# mrYI4IAFSEDu9oJkRqj1c7AGlfJsZZ+/VVscnFcax3hGfHCqlBuCF6yH6bbJDoEc
|
||
# QNYWFyn8XJwYK+pF9e+91WdPKF4F7pBMeufG9ND8+s0+MkYTIDaKBOq3qgdGnA2T
|
||
# OglmmVhcKaO5DKYwODzQRjY1fJy67sPV+Qp2+n4FG0DKkjXp1XrRtX8ArqmQqsV/
|
||
# AZwQsRb8zG4Y3G9i/qZQp7h7uJ0VP/4gDHXIIloTlRmQAOka1cKG8eOO7F/05QID
|
||
# AQABo4IBEjCCAQ4wHwYDVR0jBBgwFoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYD
|
||
# VR0OBBYEFDLrkpr/NZZILyhAQnAgNpFcF4XmMA4GA1UdDwEB/wQEAwIBhjAPBgNV
|
||
# HRMBAf8EBTADAQH/MBMGA1UdJQQMMAoGCCsGAQUFBwMDMBsGA1UdIAQUMBIwBgYE
|
||
# VR0gADAIBgZngQwBBAEwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybC5jb21v
|
||
# ZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNAYIKwYBBQUHAQEE
|
||
# KDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJKoZI
|
||
# hvcNAQEMBQADggEBABK/oe+LdJqYRLhpRrWrJAoMpIpnuDqBv0WKfVIHqI0fTiGF
|
||
# OaNrXi0ghr8QuK55O1PNtPvYRL4G2VxjZ9RAFodEhnIq1jIV9RKDwvnhXRFAZ/ZC
|
||
# J3LFI+ICOBpMIOLbAffNRk8monxmwFE2tokCVMf8WPtsAO7+mKYulaEMUykfb9gZ
|
||
# pk+e96wJ6l2CxouvgKe9gUhShDHaMuwV5KZMPWw5c9QLhTkg4IUaaOGnSDip0TYl
|
||
# d8GNGRbFiExmfS9jzpjoad+sPKhdnckcW67Y8y90z7h+9teDnRGWYpquRRPaf9xH
|
||
# +9/DUp/mBlXpnYzyOmJRvOwkDynUWICE5EV7WtgwggYcMIIEBKADAgECAhAz1wio
|
||
# kUBTGeKlu9M5ua1uMA0GCSqGSIb3DQEBDAUAMFYxCzAJBgNVBAYTAkdCMRgwFgYD
|
||
# VQQKEw9TZWN0aWdvIExpbWl0ZWQxLTArBgNVBAMTJFNlY3RpZ28gUHVibGljIENv
|
||
# ZGUgU2lnbmluZyBSb290IFI0NjAeFw0yMTAzMjIwMDAwMDBaFw0zNjAzMjEyMzU5
|
||
# NTlaMFcxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxLjAs
|
||
# BgNVBAMTJVNlY3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBDQSBFViBSMzYwggGi
|
||
# MA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQC70f4et0JbePWQp64sg/GNIdMw
|
||
# hoV739PN2RZLrIXFuwHP4owoEXIEdiyBxasSekBKxRDogRQ5G19PB/YwMDB/NSXl
|
||
# wHM9QAmU6Kj46zkLVdW2DIseJ/jePiLBv+9l7nPuZd0o3bsffZsyf7eZVReqskmo
|
||
# PBBqOsMhspmoQ9c7gqgZYbU+alpduLyeE9AKnvVbj2k4aOqlH1vKI+4L7bzQHkND
|
||
# brBTjMJzKkQxbr6PuMYC9ruCBBV5DFIg6JgncWHvL+T4AvszWbX0w1Xn3/YIIq62
|
||
# 0QlZ7AGfc4m3Q0/V8tm9VlkJ3bcX9sR0gLqHRqwG29sEDdVOuu6MCTQZlRvmcBME
|
||
# Jd+PuNeEM4xspgzraLqVT3xE6NRpjSV5wyHxNXf4T7YSVZXQVugYAtXueciGoWnx
|
||
# G06UE2oHYvDQa5mll1CeHDOhHu5hiwVoHI717iaQg9b+cYWnmvINFD42tRKtd3V6
|
||
# zOdGNmqQU8vGlHHeBzoh+dYyZ+CcblSGoGSgg8sCAwEAAaOCAWMwggFfMB8GA1Ud
|
||
# IwQYMBaAFDLrkpr/NZZILyhAQnAgNpFcF4XmMB0GA1UdDgQWBBSBMpJBKyjNRsjE
|
||
# osYqORLsSKk/FDAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADAT
|
||
# BgNVHSUEDDAKBggrBgEFBQcDAzAaBgNVHSAEEzARMAYGBFUdIAAwBwYFZ4EMAQMw
|
||
# SwYDVR0fBEQwQjBAoD6gPIY6aHR0cDovL2NybC5zZWN0aWdvLmNvbS9TZWN0aWdv
|
||
# UHVibGljQ29kZVNpZ25pbmdSb290UjQ2LmNybDB7BggrBgEFBQcBAQRvMG0wRgYI
|
||
# KwYBBQUHMAKGOmh0dHA6Ly9jcnQuc2VjdGlnby5jb20vU2VjdGlnb1B1YmxpY0Nv
|
||
# ZGVTaWduaW5nUm9vdFI0Ni5wN2MwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLnNl
|
||
# Y3RpZ28uY29tMA0GCSqGSIb3DQEBDAUAA4ICAQBfNqz7+fZyWhS38Asd3tj9lwHS
|
||
# /QHumS2G6Pa38Dn/1oFKWqdCSgotFZ3mlP3FaUqy10vxFhJM9r6QZmWLLXTUqwj3
|
||
# ahEDCHd8vmnhsNufJIkD1t5cpOCy1rTP4zjVuW3MJ9bOZBHoEHJ20/ng6SyJ6UnT
|
||
# s5eWBgrh9grIQZqRXYHYNneYyoBBl6j4kT9jn6rNVFRLgOr1F2bTlHH9nv1HMePp
|
||
# GoYd074g0j+xUl+yk72MlQmYco+VAfSYQ6VK+xQmqp02v3Kw/Ny9hA3s7TSoXpUr
|
||
# OBZjBXXZ9jEuFWvilLIq0nQ1tZiao/74Ky+2F0snbFrmuXZe2obdq2TWauqDGIgb
|
||
# MYL1iLOUJcAhLwhpAuNMu0wqETDrgXkG4UGVKtQg9guT5Hx2DJ0dJmtfhAH2KpnN
|
||
# r97H8OQYok6bLyoMZqaSdSa+2UA1E2+upjcaeuitHFFjBypWBmztfhj24+xkc6Zt
|
||
# CDaLrw+ZrnVrFyvCTWrDUUZBVumPwo3/E3Gb2u2e05+r5UWmEsUUWlJBl6MGAAjF
|
||
# 5hzqJ4I8O9vmRsTvLQA1E802fZ3lqicIBczOwDYOSxlP0GOabb/FKVMxItt1UHeG
|
||
# 0PL4au5rBhs+hSMrl8h+eplBDN1Yfw6owxI9OjWb4J0sjBeBVESoeh2YnZZ/WVim
|
||
# VGX/UUIL+Efrz/jlvzCCBqkwggURoAMCAQICEDfFCjwdoANxxw3HxiaQL+UwDQYJ
|
||
# KoZIhvcNAQELBQAwVzELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1NlY3RpZ28gTGlt
|
||
# aXRlZDEuMCwGA1UEAxMlU2VjdGlnbyBQdWJsaWMgQ29kZSBTaWduaW5nIENBIEVW
|
||
# IFIzNjAeFw0yNDA4MjgwMDAwMDBaFw0yNzA4MjgyMzU5NTlaMIGTMQ8wDQYDVQQF
|
||
# EwY0MDc5NTAxEzARBgsrBgEEAYI3PAIBAxMCSUUxGDAWBgNVBA8TD0J1c2luZXNz
|
||
# IEVudGl0eTELMAkGA1UEBhMCSUUxEDAOBgNVBAgMB0RvbmVnYWwxGDAWBgNVBAoM
|
||
# D0FrZW8gQ29uc3VsdGluZzEYMBYGA1UEAwwPQWtlbyBDb25zdWx0aW5nMIICIjAN
|
||
# BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAqpN7vevPy6Ir46imPS9uMM86vroQ
|
||
# e9gcAMNYKW+RXzSJfi79vZOzABoVPZ72rSwODApd89w95Z5FqGjwhaIu04lCHt6H
|
||
# mOL+TR9xdo2WWFWXGh7yC5jmvMofk54A6h7klEd2u3f4aTjy9sVr1uUmjA9KA1o8
|
||
# HBgid5+HL57I9XprTRXGtTHAzHJyX1FEEGGKv9CtxEUaIr1/mIFpsNLZN2NfOoIu
|
||
# PPpxMypcXISDecJApvKxhqBte5SMhKa5zlI5omyizesQJZoRGjVfe83Ntb7kykFS
|
||
# Du1hmJMbtV0mM8yrhoUy+QAKp2ZhctkbPmWDNVLDK51GnfOgfmgaMQvm9RZQeh1N
|
||
# OT+fbUxHakG14kdARprNWJbBsJX5kLvzzTL4xbz+hPRT4jUkRZgQ9eDz1+a5Qa4Q
|
||
# FJtosRbwaJNuX9YQyrda1Jy2yJEVXanaRS8R0WM6wcYL47KMmxhz37HGr5zek9I+
|
||
# rfQ+/Qt+imZ/q1cYEuvx9owSVbpZAV1/g5z3AwH4ue+msMlY3bxwBfeEPHFnNdxh
|
||
# Dg7jlggohX79KL5e85FQs3iQpwXvGDlUjvS6KG+Rv3DokvZS9WSWB4REHmC/Cywu
|
||
# LQh3VF1Ezko3HMOG+nQptBNJ2Vk9JRq8mh317Tzv9dsoVWS6Vv1O2nyGbWZfjkn3
|
||
# ayT+S5SopUo/PcECAwEAAaOCAbIwggGuMB8GA1UdIwQYMBaAFIEykkErKM1GyMSi
|
||
# xio5EuxIqT8UMB0GA1UdDgQWBBRU0FFbeE+nxVuayZAwm7BZrYKDHzAOBgNVHQ8B
|
||
# Af8EBAMCB4AwDAYDVR0TAQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcDAzBJBgNV
|
||
# HSAEQjBAMDUGDCsGAQQBsjEBAgEGATAlMCMGCCsGAQUFBwIBFhdodHRwczovL3Nl
|
||
# Y3RpZ28uY29tL0NQUzAHBgVngQwBAzBLBgNVHR8ERDBCMECgPqA8hjpodHRwOi8v
|
||
# Y3JsLnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2RlU2lnbmluZ0NBRVZSMzYu
|
||
# Y3JsMHsGCCsGAQUFBwEBBG8wbTBGBggrBgEFBQcwAoY6aHR0cDovL2NydC5zZWN0
|
||
# aWdvLmNvbS9TZWN0aWdvUHVibGljQ29kZVNpZ25pbmdDQUVWUjM2LmNydDAjBggr
|
||
# BgEFBQcwAYYXaHR0cDovL29jc3Auc2VjdGlnby5jb20wJAYDVR0RBB0wG6AZBggr
|
||
# BgEFBQcIA6ANMAsMCUlFLTQwNzk1MDANBgkqhkiG9w0BAQsFAAOCAYEAs2WyIJRC
|
||
# l+lgha7wuLYXCdbZbx4K02SyteLCXXRYuQ/+o7kX2P3BQuqNZXBQ4y+xbuOTqNOY
|
||
# R6VK7QrLvYaiMJky5qZY3lQfdsvuGkZmg1XvY1BPXre6B1/HkatGmnqtFUcBBeW4
|
||
# wtHOglq96eLHXzXCvS+1xO9wvv7GGB53i+7ePq7ROr717p/V1OUntl5y8nzxyhRI
|
||
# ucs6gBX0gbBQljLC16DwZ20NlNhYfi1SF7pSfnWZH/bojOPta3fCmIx7r8tjDu5m
|
||
# 4a6KRpYwLMYE9/ZBEBP7JpfiMt42q+QF6fyS8xauGiOGBOZW4ch7Wh+GBoe3JZUu
|
||
# UPC4wZDC9LeRKz/otodtloaTEnW9YE9gPmfRttMWaNsQTg6y5sc74qLoVY0RSqcW
|
||
# B2KScXAjuVHVkJJcOoPSuLoTjOhK3Ug4XbQmRypdteoizdTSnONGmW84RJyXquzi
|
||
# rIjw9CnLTggrZiYi9EZTo7URWNaARqLbSFpu0VMkdOBpWdXq5F6x6jslMYIaUTCC
|
||
# Gk0CAQEwazBXMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVk
|
||
# MS4wLAYDVQQDEyVTZWN0aWdvIFB1YmxpYyBDb2RlIFNpZ25pbmcgQ0EgRVYgUjM2
|
||
# AhA3xQo8HaADcccNx8YmkC/lMA0GCWCGSAFlAwQCAQUAoHwwEAYKKwYBBAGCNwIB
|
||
# DDECMAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO
|
||
# MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIGM46kb2X7Tta6EzBf5sFOHn
|
||
# kZs8JXPQ6S7zslesaMtyMA0GCSqGSIb3DQEBAQUABIICAAt+Ha2rXBbfAqyffw3X
|
||
# wTE7ArUyfP5/LZRKlG0AqHePIargfwWoW7fkEWj/iEs1b5zmq4ayO+1/GC48+9wc
|
||
# 4dIjVFDygrkBV9fSIox3LJRdqUsX0GaljEZOsxRaoPGDPF12eD3C9XfHzoGOuqYp
|
||
# PJ+mXUHZKV8cUMluW6ftd1dB1WbHzOXPjmGjhArRcBtY+zduq0rXtgntHKQI4q1S
|
||
# IYjjzeOjJ6KPxHe1ofFqFoIHlAd6vlHY5yqKeRouJm9HQ78eHlkUbHF+O5510KhE
|
||
# p/a78zkAp2msVZRgA760ToCcn6UOkRxpdcopGqK1DAjGDBVmigO/y+HfMO8ghDB0
|
||
# giFiudslRaGjsqkxAg1AGKFYGX9dT8jeEHixq5Z2YsihbGRVB0h5UDXqPrXCpAdt
|
||
# isGIzV1fsRytVmVZilJiCDsDKyr5DmpGLZdVQ1IHTP+9mjgHRw4nFXxpZ20PeoVU
|
||
# vVmZbvfbqYW7ZQOU0eiALrbYwElmVlqichZAPPRGXXofWhSUsb8yL9r+Mq7hNLqJ
|
||
# pLT1CkYC5ZQ4x/WMXA5s33AvnDXaysMV1F9pb4FxlXTvjpEgMtTq9P2H/8hPw69S
|
||
# S0y40VUc1ezRq2ymYp5ImwF5tkICdaOsUnAWKOpjLuV1v36D6FDPtTvzOGjF7HB0
|
||
# j/Nl7galy6DGGQFU+yxT4Lk/oYIXOTCCFzUGCisGAQQBgjcDAwExghclMIIXIQYJ
|
||
# KoZIhvcNAQcCoIIXEjCCFw4CAQMxDzANBglghkgBZQMEAgEFADB3BgsqhkiG9w0B
|
||
# CRABBKBoBGYwZAIBAQYJYIZIAYb9bAcBMDEwDQYJYIZIAWUDBAIBBQAEIJZKXGyr
|
||
# x8k7rMykpOPNslGoDQ1m4jNDs4aiAGaOGTwdAhB+ALXJmrWFN+0UCzQDCtR3GA8y
|
||
# MDI0MTExNTEzMTMzNFqgghMDMIIGvDCCBKSgAwIBAgIQC65mvFq6f5WHxvnpBOMz
|
||
# BDANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNl
|
||
# cnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBT
|
||
# SEEyNTYgVGltZVN0YW1waW5nIENBMB4XDTI0MDkyNjAwMDAwMFoXDTM1MTEyNTIz
|
||
# NTk1OVowQjELMAkGA1UEBhMCVVMxETAPBgNVBAoTCERpZ2lDZXJ0MSAwHgYDVQQD
|
||
# ExdEaWdpQ2VydCBUaW1lc3RhbXAgMjAyNDCCAiIwDQYJKoZIhvcNAQEBBQADggIP
|
||
# ADCCAgoCggIBAL5qc5/2lSGrljC6W23mWaO16P2RHxjEiDtqmeOlwf0KMCBDEr4I
|
||
# xHRGd7+L660x5XltSVhhK64zi9CeC9B6lUdXM0s71EOcRe8+CEJp+3R2O8oo76EO
|
||
# 7o5tLuslxdr9Qq82aKcpA9O//X6QE+AcaU/byaCagLD/GLoUb35SfWHh43rOH3bp
|
||
# LEx7pZ7avVnpUVmPvkxT8c2a2yC0WMp8hMu60tZR0ChaV76Nhnj37DEYTX9ReNZ8
|
||
# hIOYe4jl7/r419CvEYVIrH6sN00yx49boUuumF9i2T8UuKGn9966fR5X6kgXj3o5
|
||
# WHhHVO+NBikDO0mlUh902wS/Eeh8F/UFaRp1z5SnROHwSJ+QQRZ1fisD8UTVDSup
|
||
# WJNstVkiqLq+ISTdEjJKGjVfIcsgA4l9cbk8Smlzddh4EfvFrpVNnes4c16Jidj5
|
||
# XiPVdsn5n10jxmGpxoMc6iPkoaDhi6JjHd5ibfdp5uzIXp4P0wXkgNs+CO/CacBq
|
||
# U0R4k+8h6gYldp4FCMgrXdKWfM4N0u25OEAuEa3JyidxW48jwBqIJqImd93NRxvd
|
||
# 1aepSeNeREXAu2xUDEW8aqzFQDYmr9ZONuc2MhTMizchNULpUEoA6Vva7b1XCB+1
|
||
# rxvbKmLqfY/M/SdV6mwWTyeVy5Z/JkvMFpnQy5wR14GJcv6dQ4aEKOX5AgMBAAGj
|
||
# ggGLMIIBhzAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIwADAWBgNVHSUBAf8E
|
||
# DDAKBggrBgEFBQcDCDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEw
|
||
# HwYDVR0jBBgwFoAUuhbZbU2FL3MpdpovdYxqII+eyG8wHQYDVR0OBBYEFJ9XLAN3
|
||
# DigVkGalY17uT5IfdqBbMFoGA1UdHwRTMFEwT6BNoEuGSWh0dHA6Ly9jcmwzLmRp
|
||
# Z2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFJTQTQwOTZTSEEyNTZUaW1lU3Rh
|
||
# bXBpbmdDQS5jcmwwgZAGCCsGAQUFBwEBBIGDMIGAMCQGCCsGAQUFBzABhhhodHRw
|
||
# Oi8vb2NzcC5kaWdpY2VydC5jb20wWAYIKwYBBQUHMAKGTGh0dHA6Ly9jYWNlcnRz
|
||
# LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFJTQTQwOTZTSEEyNTZUaW1l
|
||
# U3RhbXBpbmdDQS5jcnQwDQYJKoZIhvcNAQELBQADggIBAD2tHh92mVvjOIQSR9lD
|
||
# kfYR25tOCB3RKE/P09x7gUsmXqt40ouRl3lj+8QioVYq3igpwrPvBmZdrlWBb0Hv
|
||
# qT00nFSXgmUrDKNSQqGTdpjHsPy+LaalTW0qVjvUBhcHzBMutB6HzeledbDCzFzU
|
||
# y34VarPnvIWrqVogK0qM8gJhh/+qDEAIdO/KkYesLyTVOoJ4eTq7gj9UFAL1UruJ
|
||
# KlTnCVaM2UeUUW/8z3fvjxhN6hdT98Vr2FYlCS7Mbb4Hv5swO+aAXxWUm3WpByXt
|
||
# gVQxiBlTVYzqfLDbe9PpBKDBfk+rabTFDZXoUke7zPgtd7/fvWTlCs30VAGEsshJ
|
||
# mLbJ6ZbQ/xll/HjO9JbNVekBv2Tgem+mLptR7yIrpaidRJXrI+UzB6vAlk/8a1u7
|
||
# cIqV0yef4uaZFORNekUgQHTqddmsPCEIYQP7xGxZBIhdmm4bhYsVA6G2WgNFYagL
|
||
# DBzpmk9104WQzYuVNsxyoVLObhx3RugaEGru+SojW4dHPoWrUhftNpFC5H7QEY7M
|
||
# hKRyrBe7ucykW7eaCuWBsBb4HOKRFVDcrZgdwaSIqMDiCLg4D+TPVgKx2EgEdeoH
|
||
# NHT9l3ZDBD+XgbF+23/zBjeCtxz+dL/9NWR6P2eZRi7zcEO1xwcdcqJsyz/JceEN
|
||
# c2Sg8h3KeFUCS7tpFk7CrDqkMIIGrjCCBJagAwIBAgIQBzY3tyRUfNhHrP0oZipe
|
||
# WzANBgkqhkiG9w0BAQsFADBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNl
|
||
# cnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdp
|
||
# Q2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMjIwMzIzMDAwMDAwWhcNMzcwMzIyMjM1
|
||
# OTU5WjBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5
|
||
# BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0
|
||
# YW1waW5nIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxoY1Bkmz
|
||
# wT1ySVFVxyUDxPKRN6mXUaHW0oPRnkyibaCwzIP5WvYRoUQVQl+kiPNo+n3znIkL
|
||
# f50fng8zH1ATCyZzlm34V6gCff1DtITaEfFzsbPuK4CEiiIY3+vaPcQXf6sZKz5C
|
||
# 3GeO6lE98NZW1OcoLevTsbV15x8GZY2UKdPZ7Gnf2ZCHRgB720RBidx8ald68Dd5
|
||
# n12sy+iEZLRS8nZH92GDGd1ftFQLIWhuNyG7QKxfst5Kfc71ORJn7w6lY2zkpsUd
|
||
# zTYNXNXmG6jBZHRAp8ByxbpOH7G1WE15/tePc5OsLDnipUjW8LAxE6lXKZYnLvWH
|
||
# po9OdhVVJnCYJn+gGkcgQ+NDY4B7dW4nJZCYOjgRs/b2nuY7W+yB3iIU2YIqx5K/
|
||
# oN7jPqJz+ucfWmyU8lKVEStYdEAoq3NDzt9KoRxrOMUp88qqlnNCaJ+2RrOdOqPV
|
||
# A+C/8KI8ykLcGEh/FDTP0kyr75s9/g64ZCr6dSgkQe1CvwWcZklSUPRR8zZJTYsg
|
||
# 0ixXNXkrqPNFYLwjjVj33GHek/45wPmyMKVM1+mYSlg+0wOI/rOP015LdhJRk8mM
|
||
# DDtbiiKowSYI+RQQEgN9XyO7ZONj4KbhPvbCdLI/Hgl27KtdRnXiYKNYCQEoAA6E
|
||
# VO7O6V3IXjASvUaetdN2udIOa5kM0jO0zbECAwEAAaOCAV0wggFZMBIGA1UdEwEB
|
||
# /wQIMAYBAf8CAQAwHQYDVR0OBBYEFLoW2W1NhS9zKXaaL3WMaiCPnshvMB8GA1Ud
|
||
# IwQYMBaAFOzX44LScV1kTN8uZz/nupiuHA9PMA4GA1UdDwEB/wQEAwIBhjATBgNV
|
||
# HSUEDDAKBggrBgEFBQcDCDB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUHMAGGGGh0
|
||
# dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDovL2NhY2Vy
|
||
# dHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcnQwQwYDVR0f
|
||
# BDwwOjA4oDagNIYyaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1
|
||
# c3RlZFJvb3RHNC5jcmwwIAYDVR0gBBkwFzAIBgZngQwBBAIwCwYJYIZIAYb9bAcB
|
||
# MA0GCSqGSIb3DQEBCwUAA4ICAQB9WY7Ak7ZvmKlEIgF+ZtbYIULhsBguEE0TzzBT
|
||
# zr8Y+8dQXeJLKftwig2qKWn8acHPHQfpPmDI2AvlXFvXbYf6hCAlNDFnzbYSlm/E
|
||
# UExiHQwIgqgWvalWzxVzjQEiJc6VaT9Hd/tydBTX/6tPiix6q4XNQ1/tYLaqT5Fm
|
||
# niye4Iqs5f2MvGQmh2ySvZ180HAKfO+ovHVPulr3qRCyXen/KFSJ8NWKcXZl2szw
|
||
# cqMj+sAngkSumScbqyQeJsG33irr9p6xeZmBo1aGqwpFyd/EjaDnmPv7pp1yr8TH
|
||
# wcFqcdnGE4AJxLafzYeHJLtPo0m5d2aR8XKc6UsCUqc3fpNTrDsdCEkPlM05et3/
|
||
# JWOZJyw9P2un8WbDQc1PtkCbISFA0LcTJM3cHXg65J6t5TRxktcma+Q4c6umAU+9
|
||
# Pzt4rUyt+8SVe+0KXzM5h0F4ejjpnOHdI/0dKNPH+ejxmF/7K9h+8kaddSweJywm
|
||
# 228Vex4Ziza4k9Tm8heZWcpw8De/mADfIBZPJ/tgZxahZrrdVcA6KYawmKAr7ZVB
|
||
# tzrVFZgxtGIJDwq9gdkT/r+k0fNX2bwE+oLeMt8EifAAzV3C+dAjfwAL5HYCJtnw
|
||
# ZXZCpimHCUcr5n8apIUP/JiW9lVUKx+A+sDyDivl1vupL0QVSucTDh3bNzgaoSv2
|
||
# 7dZ8/DCCBY0wggR1oAMCAQICEA6bGI750C3n79tQ4ghAGFowDQYJKoZIhvcNAQEM
|
||
# BQAwZTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UE
|
||
# CxMQd3d3LmRpZ2ljZXJ0LmNvbTEkMCIGA1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJ
|
||
# RCBSb290IENBMB4XDTIyMDgwMTAwMDAwMFoXDTMxMTEwOTIzNTk1OVowYjELMAkG
|
||
# A1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRp
|
||
# Z2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0MIIC
|
||
# IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAv+aQc2jeu+RdSjwwIjBpM+zC
|
||
# pyUuySE98orYWcLhKac9WKt2ms2uexuEDcQwH/MbpDgW61bGl20dq7J58soR0uRf
|
||
# 1gU8Ug9SH8aeFaV+vp+pVxZZVXKvaJNwwrK6dZlqczKU0RBEEC7fgvMHhOZ0O21x
|
||
# 4i0MG+4g1ckgHWMpLc7sXk7Ik/ghYZs06wXGXuxbGrzryc/NrDRAX7F6Zu53yEio
|
||
# ZldXn1RYjgwrt0+nMNlW7sp7XeOtyU9e5TXnMcvak17cjo+A2raRmECQecN4x7ax
|
||
# xLVqGDgDEI3Y1DekLgV9iPWCPhCRcKtVgkEy19sEcypukQF8IUzUvK4bA3VdeGbZ
|
||
# OjFEmjNAvwjXWkmkwuapoGfdpCe8oU85tRFYF/ckXEaPZPfBaYh2mHY9WV1CdoeJ
|
||
# l2l6SPDgohIbZpp0yt5LHucOY67m1O+SkjqePdwA5EUlibaaRBkrfsCUtNJhbesz
|
||
# 2cXfSwQAzH0clcOP9yGyshG3u3/y1YxwLEFgqrFjGESVGnZifvaAsPvoZKYz0YkH
|
||
# 4b235kOkGLimdwHhD5QMIR2yVCkliWzlDlJRR3S+Jqy2QXXeeqxfjT/JvNNBERJb
|
||
# 5RBQ6zHFynIWIgnffEx1P2PsIV/EIFFrb7GrhotPwtZFX50g/KEexcCPorF+CiaZ
|
||
# 9eRpL5gdLfXZqbId5RsCAwEAAaOCATowggE2MA8GA1UdEwEB/wQFMAMBAf8wHQYD
|
||
# VR0OBBYEFOzX44LScV1kTN8uZz/nupiuHA9PMB8GA1UdIwQYMBaAFEXroq/0ksuC
|
||
# MS1Ri6enIZ3zbcgPMA4GA1UdDwEB/wQEAwIBhjB5BggrBgEFBQcBAQRtMGswJAYI
|
||
# KwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEFBQcwAoY3
|
||
# aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9v
|
||
# dENBLmNydDBFBgNVHR8EPjA8MDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5j
|
||
# b20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMBEGA1UdIAQKMAgwBgYEVR0g
|
||
# ADANBgkqhkiG9w0BAQwFAAOCAQEAcKC/Q1xV5zhfoKN0Gz22Ftf3v1cHvZqsoYcs
|
||
# 7IVeqRq7IviHGmlUIu2kiHdtvRoU9BNKei8ttzjv9P+Aufih9/Jy3iS8UgPITtAq
|
||
# 3votVs/59PesMHqai7Je1M/RQ0SbQyHrlnKhSLSZy51PpwYDE3cnRNTnf+hZqPC/
|
||
# Lwum6fI0POz3A8eHqNJMQBk1RmppVLC4oVaO7KTVPeix3P0c2PR3WlxUjG/voVA9
|
||
# /HYJaISfb8rbII01YBwCA8sgsKxYoA5AY8WYIsGyWfVVa88nq2x2zm8jLfR+cWoj
|
||
# ayL/ErhULSd+2DrZ8LaHlv1b0VysGMNNn3O3AamfV6peKOK5lDGCA3YwggNyAgEB
|
||
# MHcwYzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYD
|
||
# VQQDEzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRpbWVTdGFt
|
||
# cGluZyBDQQIQC65mvFq6f5WHxvnpBOMzBDANBglghkgBZQMEAgEFAKCB0TAaBgkq
|
||
# hkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTI0MTExNTEz
|
||
# MTMzNFowKwYLKoZIhvcNAQkQAgwxHDAaMBgwFgQU29OF7mLb0j575PZxSFCHJNWG
|
||
# W0UwLwYJKoZIhvcNAQkEMSIEIEp8wJYcdX+4C6pMRGe+IgumC+P6yUHm121Xwwtw
|
||
# HUdsMDcGCyqGSIb3DQEJEAIvMSgwJjAkMCIEIHZ2n6jyYy8fQws6IzCu1lZ1/tdz
|
||
# 2wXWZbkFk5hDj5rbMA0GCSqGSIb3DQEBAQUABIICAJXIKpaFGYjeGkGRhLpj3rKG
|
||
# cKF9OLC/AQ5ybsAvMeTQuGotmpyKH5VVv7xHrPuwNb2UlCof7wqhGWN3MCB8Om3X
|
||
# 5qRc2H8JOUbawtI8qLQX8b3cLVwvnTiH8uxv5Fd8uNiPzv+obqG1PoQp2bmHy5AE
|
||
# 6c7z9v4sSlaLfdr2XPK60z+KU9LgGIHnNVP07v1cg/QFqdiPD5U4kevr+bQXZjeX
|
||
# O+PR8GKDzNbH3i8qDbJ+MQ9rvlEiBNMlI2v2BbwlZj4Ajz8O3k3HSIMv9ReiyVC2
|
||
# mOcOlWzIr6p2fRVvd7O0Xa0ArCj5+/Q2zdNQC/9/ZbDje/ZEJvIv5pVAf9QaPvi2
|
||
# yt/PePYJ7fmJ5itd/OszLhTJjplbTXdMkSTkAD4VGBKZRucHL8mGUjbQ4AVoJzeV
|
||
# Z9gqwY3bCbN/J6LnMANu16T/RyoVYOnL5P+EmIl20J7nyqZoCzdfP19DVnSjia65
|
||
# 48WGxVvYsgiurqfyVjXBH1gVpIml7mkfDo0NXFeID02JN7tCzUPMgmIpfxH+ZvgQ
|
||
# aO+kPFPJ0oKQCQRtnyPagneYbrZbedDezKKNMqyPuK1Rnxbil5PEBHEWnh/ghPfS
|
||
# eHtry/VSE1phH/254RZ/ionM+eI0XXtttS/ujKaDWwhzrN3Bj4AjiWqEi+PbG4+j
|
||
# tvxNDpiIMwpWtzF0tT1E
|
||
# SIG # End signature block
|