Aks.Autorest/custom/Install-AzAksCliTool.ps1
|
# ---------------------------------------------------------------------------------- # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Code generated by Microsoft (R) AutoRest Code Generator.Changes may cause incorrect behavior and will be lost if the code # is regenerated. # ---------------------------------------------------------------------------------- <# .Synopsis Download and install kubectl and kubelogin. .Description Download and install kubectl and kubelogin. #> function Install-AzAksCliTool { [OutputType([System.Boolean])] [CmdletBinding(PositionalBinding=$false, SupportsShouldProcess, ConfirmImpact='Medium')] param( [Alias("KubectlInstallDestination")] [Parameter()] [System.String] # Path at which to install kubectl. Default to install into ~/.azure-kubectl/ ${Destination}, [Alias("KubectlInstallVersion")] [Parameter()] [System.String] # Version of kubectl to install, e.g. 'v1.17.2'. Default value: Latest. ${Version}, [Alias("KubectlDownloadFromMirror")] [Parameter()] [System.Management.Automation.SwitchParameter] # Download from mirror site : https://mirror.azure.cn/kubernetes/kubectl/ ${DownloadFromMirror}, [Parameter()] [System.String] # Path at which to install kubectl. Default to install into ~/.azure-kubelogin/ ${KubeloginInstallDestination}, [Parameter()] [System.String] # Version of kubectl to install, e.g. 'v0.0.20'. Default value: Latest ${KubeloginInstallVersion}, [Parameter()] [System.Management.Automation.SwitchParameter] # Download from mirror site : https://mirror.azure.cn/kubernetes/kubelogin ${KubeloginDownloadFromMirror}, [Parameter()] [System.Management.Automation.SwitchParameter] # Wait for .NET debugger to attach ${PassThru}, [Parameter()] [System.Management.Automation.SwitchParameter] # Run cmdlet in the background ${AsJob}, [Parameter()] [System.Management.Automation.SwitchParameter] # Overwrite existing kubectl and kubelogin without prompt ${Force} ) process { #Region Install kubectl $KubectlParams = @{} If ($PSBoundParameters.ContainsKey("Destination")) { $KubectlParams["Destination"] = $PSBoundParameters["Destination"] } If ($PSBoundParameters.ContainsKey("Version")) { $KubectlParams["Version"] = $PSBoundParameters["Version"] } If ($PSBoundParameters.ContainsKey("DownloadFromMirror")) { $KubectlParams["DownloadFromMirror"] = $PSBoundParameters["DownloadFromMirror"] } If ($PSBoundParameters.ContainsKey("Force")) { $KubectlParams["Force"] = $PSBoundParameters["Force"] } Install-Kubectl @KubectlParams #EndRegion #Region Install kubelogin $KubeloginParams = @{} If ($PSBoundParameters.ContainsKey("KubeloginInstallDestination")) { $KubeloginParams["Destination"] = $PSBoundParameters["KubeloginInstallDestination"] } If ($PSBoundParameters.ContainsKey("KubeloginInstallVersion")) { $KubeloginParams["Version"] = $PSBoundParameters["KubeloginInstallVersion"] } If ($PSBoundParameters.ContainsKey("KubeloginDownloadFromMirror")) { $KubeloginParams["DownloadFromMirror"] = $PSBoundParameters["KubeloginDownloadFromMirror"] } If ($PSBoundParameters.ContainsKey("Force")) { $KubeloginParams["Force"] = $PSBoundParameters["Force"] } Install-Kubelogin @KubeloginParams #EndRegion } } function IsWindows { [Microsoft.Azure.PowerShell.Cmdlets.Aks.DoNotExportAttribute()] param( ) process { return (Get-OSName).contains("Windows") } } function Get-OSName { [Microsoft.Azure.PowerShell.Cmdlets.Aks.DoNotExportAttribute()] param( ) process { if ($PSVersionTable.PSEdition.Contains("Core")) { $OSPlatform = $PSVersionTable.OS } else { $OSPlatform = $env:OS } return $OSPlatform } } Function Install-Kubectl { [Microsoft.Azure.PowerShell.Cmdlets.Aks.DoNotExportAttribute()] [CmdletBinding(PositionalBinding=$false, SupportsShouldProcess, ConfirmImpact='Medium')] param( [Parameter()] [System.String] ${Destination}, [Parameter()] [System.String] ${Version}, [Parameter()] [System.Management.Automation.SwitchParameter] ${DownloadFromMirror}, [Parameter()] [System.Management.Automation.SwitchParameter] ${Force} ) Process { $baseUrl = "https://storage.googleapis.com/kubernetes-release/release" If ($DownloadFromMirror) { $baseUrl = "https://mirror.azure.cn/kubernetes/kubectl" } If (($Null -Eq $Destination) -or ("" -Eq $Destination)) { $Destination = [System.IO.Path]::Combine($env:USERPROFILE, ".azure-kubectl") } If (-not (Test-Path -Path $Destination)) { New-Item -Path $Destination -ItemType Directory } $Destination = Resolve-Path -Path $Destination If (($Null -Eq $Version) -or ("" -Eq $Version)) { $url = "$baseUrl/stable.txt" $Version = (Invoke-WebRequest -Uri $url).Content.Trim() } If (IsWindows) { $destFilePath = [System.IO.Path]::Combine($Destination, "kubectl.exe") $downloadFileUrl = "$baseUrl/$Version/bin/windows/amd64/kubectl.exe" } ElseIf ($IsLinux) { $destFilePath = [System.IO.Path]::Combine($Destination, "kubectl") $downloadFileUrl = "$baseUrl/$Version/bin/linux/amd64/kubectl" } ElseIf ($IsMacOS) { $destFilePath = [System.IO.Path]::Combine($Destination, "kubectl") $downloadFileUrl = "$baseUrl/$Version/bin/darwin/amd64/kubectl" } Else { $message = "Sorry, this cmdlet is not supported in current OS." $ex = [System.PlatformNotSupportedException]::New($message) $ex.Data[[Microsoft.Azure.Commands.Common.AzurePSErrorDataKeys]::ErrorKindKey] = [Microsoft.Azure.Commands.Common.ErrorKind]::UserError $ex.Data[[Microsoft.Azure.Commands.Common.AzurePSErrorDataKeys]::DesensitizedErrorMessageKey] = $message throw $ex } #region download and install If ($PSCmdlet.ShouldProcess("Downloading kubectl from internet.", $destFilePath)) { If (Test-Path -Path $destFilePath) { If ($Force -Or $PSCmdlet.ShouldContinue("File $destFilePath exist, are you want to replace it?", "Replace file")) { $tmpFilePath = "$destFilePath.tmp" Write-Verbose "Downloading from $downloadFileUrl to local: $tmpFilePath" Invoke-WebRequest -Uri $downloadFileUrl -OutFile $tmpFilePath Write-Verbose "Deleting $destFilePath" Remove-Item -Path $destFilePath Write-Verbose "Moving $tmpFilePath to $destFilePath" Move-Item -Path $tmpFilePath -Destination $destFilePath } } Else { Write-Verbose "Downloading from $downloadFileUrl to local: $destFilePath" Invoke-WebRequest -Uri $downloadFileUrl -OutFile $destFilePath } } #endregion } } Function Install-Kubelogin { [Microsoft.Azure.PowerShell.Cmdlets.Aks.DoNotExportAttribute()] [CmdletBinding(PositionalBinding=$false, SupportsShouldProcess, ConfirmImpact='Medium')] param( [Parameter()] [System.String] ${Destination}, [Parameter()] [System.String] ${Version}, [Parameter()] [System.Management.Automation.SwitchParameter] ${DownloadFromMirror}, [Parameter()] [System.Management.Automation.SwitchParameter] ${Force} ) Process { $baseDownloadUrl = "https://github.com/Azure/kubelogin/releases/download" $latestReleaseUrl = "https://api.github.com/repos/Azure/kubelogin/releases/latest" If ($DownloadFromMirror) { $baseDownloadUrl = "https://mirror.azure.cn/kubernetes/kubelogin" $latestReleaseUrl = "https://mirror.azure.cn/kubernetes/kubelogin/latest" } If (($Null -Eq $Destination) -or ("" -Eq $Destination)) { $Destination = [System.IO.Path]::Combine($env:USERPROFILE, ".azure-kubelogin") } If (-not (Test-Path -Path $Destination)) { New-Item -Path $Destination -ItemType Directory } $Destination = Resolve-Path -Path $Destination If (($Null -Eq $Version) -or ("" -Eq $Version)) { $latestVersionInfo = (Invoke-WebRequest -Uri $latestReleaseUrl).Content | ConvertFrom-Json $Version = $latestVersionInfo.tag_name.Trim() } $downloadFileUrl = "$baseDownloadUrl/$Version/kubelogin.zip" If (IsWindows) { $subDir = "windows_amd64" $binaryName = "kubelogin.exe" $destFilePath = [System.IO.Path]::Combine($Destination, "kubelogin.exe") } ElseIf ($IsLinux) { $subDir = "linux_amd64" $binaryName = "kubelogin" $destFilePath = [System.IO.Path]::Combine($Destination, "kubelogin") } ElseIf ($IsMacOS) { If ($Env:PROCESSOR_ARCHITECTURE -Eq "AMD64") { $subDir = "darwin_amd64" } Else { $subDir = "darwin_arm64" } $binaryName = "kubelogin" $destFilePath = [System.IO.Path]::Combine($Destination, "kubelogin") } Else { $message = "Sorry, this cmdlet is not supported in current OS." $ex = [System.PlatformNotSupportedException]::New($message) $ex.Data[[Microsoft.Azure.Commands.Common.AzurePSErrorDataKeys]::ErrorKindKey] = [Microsoft.Azure.Commands.Common.ErrorKind]::UserError $ex.Data[[Microsoft.Azure.Commands.Common.AzurePSErrorDataKeys]::DesensitizedErrorMessageKey] = $message throw $ex } #region download and install If ($PSCmdlet.ShouldProcess("Downloading kubelogin from internet.", $destFilePath)) { $downloadFilePath = [System.IO.Path]::Combine($Destination, "kubelogin.zip") $uncompressFolderPath = [System.IO.Path]::Combine($Destination, "kubelogin-folder") $binFilePath = [System.IO.Path]::Combine($uncompressFolderPath, "bin", $subDir, $binaryName) $shouldDownload = $true If (Test-Path -Path $destFilePath) { If ($Force -Or $PSCmdlet.ShouldContinue("File $destFilePath exist, are you want to replace it?", "Replace file")) { Write-Verbose "Deleting $destFilePath" Remove-Item -Path $destFilePath } Else { $shouldDownload = $false } } If ($shouldDownload) { Write-Verbose "Downloading from $downloadFileUrl to local: $downloadFilePath" Invoke-WebRequest -Uri $downloadFileUrl -OutFile $downloadFilePath Expand-Archive $downloadFilePath -DestinationPath $uncompressFolderPath -Force Write-Verbose "Deleting $destFilePath" Move-Item -Path $binFilePath -Destination $destFilePath Write-Verbose "Deleting $downloadFilePath" Remove-Item $downloadFilePath Write-Verbose "Deleting $uncompressFolderPath" Remove-Item $uncompressFolderPath -Recurse } } #endregion } } # SIG # Begin signature block # MIInbQYJKoZIhvcNAQcCoIInXjCCJ1oCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCA442MKWqPKoI7z # 19Uv47rzRJ8/QAZnDIpaF+6hiHx7hKCCDMkwggYEMIID7KADAgECAhMzAAACHPrN # xZvoL37EAAAAAAIcMA0GCSqGSIb3DQEBCwUAMFcxCzAJBgNVBAYTAlVTMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBD # b2RlIFNpZ25pbmcgUENBIDIwMjQwHhcNMjYwNDE2MTg1OTQxWhcNMjcwNDE1MTg1 # OTQxWjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE # BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYD # VQQDExVNaWNyb3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IB # DwAwggEKAoIBAQDVsZfgOKmM31HPfoWOoNEiw0SlCiIxUMC0I9NMWbucKOw/e9lP # oAoehQVu6SG65V4EPzrYsnBnFPNoi4/HoOdjhz1qkrEt4I6tEcxXU6oOeY9zGveC # /3iBeuhLYxM3M/PkcUoebF+Nednm8OkdSPoDu8imViHPQq/8CQUu0WRR4rE+dMRf # rpVqfmNi2qWCX94T4MsepijGVkwE//tJg0ryAiYdHT34LSnlG/RSBZmQRGWZ5g8j # qnKjRParSqMft1gvjuUTVgtWNZfgcLFSK5Wa0myrq8OPcgTGGsRgun+tnSS+IxDT # xVsAPH1OzvPjwomguByhUe/OcvUN0D5Wmp7xAgMBAAGjggGqMIIBpjAOBgNVHQ8B # Af8EBAMCB4AwHwYDVR0lBBgwFgYKKwYBBAGCN0wIAQYIKwYBBQUHAwMwHQYDVR0O # BBYEFNoH7a2YDjOSwpkp6DHcmUS7J+0yMFQGA1UdEQRNMEukSTBHMS0wKwYDVQQL # EyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxFjAUBgNVBAUT # DTIzMDAxMis1MDc1NjkwHwYDVR0jBBgwFoAUf1k/VCHarU/vBeXmo9ctBpQSCDEw # YAYDVR0fBFkwVzBVoFOgUYZPaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9w # cy9jcmwvTWljcm9zb2Z0JTIwQ29kZSUyMFNpZ25pbmclMjBQQ0ElMjAyMDI0LmNy # bDBtBggrBgEFBQcBAQRhMF8wXQYIKwYBBQUHMAKGUWh0dHA6Ly93d3cubWljcm9z # b2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwQ29kZSUyMFNpZ25pbmcl # MjBQQ0ElMjAyMDI0LmNydDAMBgNVHRMBAf8EAjAAMA0GCSqGSIb3DQEBCwUAA4IC # AQAUnEqhaRXe0T3hIJjvdQErEkrA/7bByjn6t5IArODkkRjzkYwtKMc2yYj2quaN # rLutWw2YZcngKPy1b71YyDJQTy4NDRwaSh9Tw5thrk3NmcPrAHia5vtcBJ1CgtKK # 7mQbIcQ22d/N3813ayCDDFewu1+jsZmX+r/aTEqaOM4TVxVtRSkuCy8nAXKuChOK # Li/zA4XuH8iEYqIsj2YoNaeSxVmeGiERXpKdo3dDmYi0kO5w2D8VS4c3+9h6gElY # BaAAg/dYErBg27qT3vv0zRDJhJufvCNylA8S7/+8H5E/PV5cng6na9VV/w9OV3qu # uND6zdGa2EX38Glp50F9AIQk3p2xXmcvorDeM4XJ7UlWYBi6g80J1SSOQnInCYFE # msfUNn3+1AaTJKSJL83quKArTac2pKhu0Yzzzrzo6HrsRiQKzpnRBb1/dMa6P3hz # 75XbMRBctNsFhZC07WCmjExdLg2eHW5uV0TY8D5+6wozJf7vF3+WHkYPO85Z+BC6 # U4FkNbYNycZ9cE4j1tXRdyDCfml6c0HWPHjNVDObrv9lKt3qUqFpX38VCqVCyNOO # 1UcXfQiVjJw32U2WUKZjt/neJKHEBsm9kFsLuWzkQ53+qcaSaytmsCnk2gOglrlD # 5d3kKyvvAw+rzm0lT8K38P6PLxfZQHhu4W8dV7Av8N2ZmDCCBr0wggSloAMCAQIC # EzMAAAA5O7Y3Gb8GHWcAAAAAADkwDQYJKoZIhvcNAQEMBQAwgYgxCzAJBgNVBAYT # AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBS # b290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDExMB4XDTI0MDgwODIwNTQxOFoX # DTM2MDMyMjIyMTMwNFowVzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29m # dCBDb3Jwb3JhdGlvbjEoMCYGA1UEAxMfTWljcm9zb2Z0IENvZGUgU2lnbmluZyBQ # Q0EgMjAyNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANgBnB7jOMeq # lRYHNa265v4IY9fH8TKhemHfPINe1gpLaV3dhg324WwH06LcHbpnsBukCDNitryo # 0dtS/EW6I/yEL/bLSY8hKpbfQuWusBPr9qazYcDxCW/qnjb5JsI1s8bNOg3bVATv # QVL4tcf03aTycsz8QeCdM0l/yHRObJ9QqazM1r6VPEOJ7LL+uEEb73w6QCuhs89a # 1uv1zerOYMnsneRRwCbpyW11IcggU0cRKDDq1pjVJzIbIF6+oiXXbReOsgeI8zu1 # FyQfK0fVkaya8SmVHQ/tOf23mZ4W9k0Ri22QW9p3UgSC5OUDktKxxcCmGL6tXLfO # GSWHIIV4YrTJTT6PNty5REojHJuZHArkF9VnHTERWoTjAzfI3kP+5b4alUdhgAZ7 # ttOu1bVnXfHaqPYl2rPs20ji03LOVWsh/radgE17es5hL+t6lV0eVHrVhsssROWJ # uz2MXMCt7iw7lFPG9LXKGjsmonn2gotGdHIuEg5JnJMJVmixd5LRlkmgYRZKzhxS # CwyoGIq0PhaA7Y+VPct5pCHkijcIIDm0nlkK+0KyepolcqGm0T/GYQRMhHJlGOOm # VQop36wUVUYklUy++vDWeEgEo4s7hxN6mIbf2MSIQ/iIfMZgJxC69oukMUXCrOC3 # SkE/xIkgpfl22MM1itkZ35nNXkMolU1lAgMBAAGjggFOMIIBSjAOBgNVHQ8BAf8E # BAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFH9ZP1Qh2q1P7wXl5qPX # LQaUEggxMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMA8GA1UdEwEB/wQFMAMB # Af8wHwYDVR0jBBgwFoAUci06AjGQQ7kUBU7h6qfHMdEjiTQwWgYDVR0fBFMwUTBP # oE2gS4ZJaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMv # TWljUm9vQ2VyQXV0MjAxMV8yMDExXzAzXzIyLmNybDBeBggrBgEFBQcBAQRSMFAw # TgYIKwYBBQUHMAKGQmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMv # TWljUm9vQ2VyQXV0MjAxMV8yMDExXzAzXzIyLmNydDANBgkqhkiG9w0BAQwFAAOC # AgEAFJQfOChP7onn6fLIMKrSlN1WYKwDFgAddymOUO3FrM8d7B/W/iQ6DxXsDn7D # 5W4wMwYeLystcEqfkjz4NURRgazyMu5yRzQh4LqjA4tStTcJh1opExo7nn5PuPBY # nbu0+THSuVHTe0VTTPVhily/piFrDo3axQ9P4C+Ol5yet+2gTfekICS5xS+cYfSI # vgn0JksVBVMYVI5QFu/qhnLhsEFEUzG8fvv0hjgkO+lkpV9ty6GkN4vdnd7ya6Q6 # aR9y34aiM1qmxaxBi6OUnyNl6fkuun/diTFnYDLTppOkr/mg5WSfCiDVMNCxtj4w # PKC5OmHm1DQIt/MNokbbH3UGsFP1QbzsLocuSqLCvH09Io3fDPTmscR9Y75G4qX7 # RTX8AdBPo0I6OEojf39zuFZt0qOHm65YWQE69cZM2ueE1MB05dNNgHK9gTE7zKvK # /fg8B2qjW88MT/WF5V5uvZGtqa9FSL2RazArA+rDPuf6JGYz4HpgMZHB4S6szWSK # YBv0VisCzfxgeU+dquXW9bd0auYlOB58DPcOYKdc3Se94g+xL4pcEhbB54JOgAkw # YTu/9dLeH2pDqeJZAABVDWRQCaXfO5LgyKwKCLYXpigrZYCjUSBcr+Ve8PFWMhVT # Ql0v4q8J/AUmQN5W4n101cY2L4A7GTQG1h32HHAvfQESWP0xghn6MIIZ9gIBATBu # MFcxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x # KDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMjQCEzMAAAIc # +s3Fm+gvfsQAAAAAAhwwDQYJYIZIAWUDBAIBBQCgga4wGQYJKoZIhvcNAQkDMQwG # CisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZI # hvcNAQkEMSIEIALRgLG8wnY9O5zgHSunIqpYzEJAIHGdyUeQo37Bts9oMEIGCisG # AQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8AcwBvAGYAdKEagBhodHRwOi8vd3d3 # Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEBBQAEggEASt1Y6rGJE0tVVynBLeaS # AKBkuDAos5nukueJ5X5vB+m74ViclPrysmzkqb3AzsQypRywy8Zyoj31VUth/Fi3 # Nds0dQuzV817Tl7uMy7Mh1FA53fKpuzQ5oDkMxmXwz+9CZj/QWDDTksnhU1PhxBh # XS5f/vhR1bblp5yxPzl26WegF/H5zehigFTu6m7wTy5btQY6TyhipwvvR31hCFjG # MCU9FCOJmAPWqPg0pk47/R5uJypA/tM036bL7gO36CSrrxttcS7PFiUkWGKafvsw # Wlc04184Ou1rAZEN94wSUY5T2DmHH/obSkjMkvI0mb2o+0W6tFnYWaEjegNHQ8KZ # eaGCF6wwgheoBgorBgEEAYI3AwMBMYIXmDCCF5QGCSqGSIb3DQEHAqCCF4UwgheB # AgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFZBgsqhkiG9w0BCRABBKCCAUgEggFEMIIB # QAIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFlAwQCAQUABCDc/jdjFVnMYY84O0ob # 1UaBefqEBwDQKs3+stn8Mq6OCAIGahBgyAZtGBIyMDI2MDUyNzEwMjU0My4xOFow # BIACAfSggdmkgdYwgdMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u # MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp # b24xLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRl # ZDEnMCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjM2MDUtMDVFMC1EOTQ3MSUwIwYD # VQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloIIR+zCCBygwggUQoAMC # AQICEzMAAAITsEM1Zs+vlegAAQAAAhMwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE # BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc # BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0 # IFRpbWUtU3RhbXAgUENBIDIwMTAwHhcNMjUwODE0MTg0ODE3WhcNMjYxMTEzMTg0 # ODE3WjCB0zELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV # BAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEtMCsG # A1UECxMkTWljcm9zb2Z0IElyZWxhbmQgT3BlcmF0aW9ucyBMaW1pdGVkMScwJQYD # VQQLEx5uU2hpZWxkIFRTUyBFU046MzYwNS0wNUUwLUQ5NDcxJTAjBgNVBAMTHE1p # Y3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggIiMA0GCSqGSIb3DQEBAQUAA4IC # DwAwggIKAoICAQD0mXrguhnEMg1IWDP70pLk7O/mbnjx49XNz1FdZ7hPj8ymV+Br # h6rXZEZ2nlxW+eN17m/F+rZrH+Oe7u9Rbitk3iY5Sbm+H6RxixCVhDncXCAgHecS # NxAeiasbeZl7+jOMVICvoluCUq0h4DJI/MBwXPIB6vmUs1QcES9AwzwE6MzJqkK+ # HTGyDjEoVxUQlAsoR8IYF98xkj9qa60cVvcJRNntpWkbYocQVQ2VnW/Awq/FdM9E # OdvA8bPLKoknOd+ws0dDi9e3a21LU94KgYjSE3U96rzIawhcz2ihzALToMY1Iz/g # sDHa4q/CZSfo3AtzT62a+fLrDbytkt6OyRF+dVah8S/WZZjSMdScevBIYFLyBU/2 # BwGzo/mDQ6kk8x/F1SQddGRww89bSEg/w1tbxblK6nwe7CdIpuOnICUYFR0z9Xmt # lvSxmaSfvXivpQsYr5wssA3pHcWFfo3SePrgXbstMrYFtLSkllpeOjR4M3PVBzF4 # gUtSAX5EGwtgOfwTxwKR7Erw2W3caL3Ml/nnDpR9Nn6TBMzEyoXGHv5N/Hv5oE5t # n6fH3rUC2KoDLvNVXr2j8tZF0o9l29mf0RLIZtOc9+OQERG/bamtKUROVHDM/puY # RU4pYtZXDG7CHttRZS5RvVyP3fO+21BgZBq3kT0Assk2aW8soKyQHutouwIDAQAB # o4IBSTCCAUUwHQYDVR0OBBYEFBOeEErH4WvKmFBYxGKkfj2wwUA6MB8GA1UdIwQY # MBaAFJ+nFV0AXmJdg/Tl0mWnG1M1GelyMF8GA1UdHwRYMFYwVKBSoFCGTmh0dHA6 # Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMFRpbWUt # U3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNybDBsBggrBgEFBQcBAQRgMF4wXAYIKwYB # BQUHMAKGUGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWlj # cm9zb2Z0JTIwVGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3J0MAwGA1UdEwEB # /wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwDgYDVR0PAQH/BAQDAgeAMA0G # CSqGSIb3DQEBCwUAA4ICAQCCbFomsapDYPpQmFnpCXZJkU5o24ZtbcvMH4RL6XYE # HUwm0FFIV2L+FVjfc2nGwlCFDlMtWnQNdg6Qig9BzXusf4hWF6Y7yMK35TojVMjD # pxHtz60Sj8mOnoSoRTVzj+atoyOAeFD6toL85QCb3wDWvhsg8e2wGYtE4aZ4Tlcs # gVoEhlYe+HYI5chMo5tdV3nAa0nV1ll3BocAJcXnTqO1r66hR3LMB642VM8tOtny # fKHEbCT1WHp6INDsJAxZJJrwMlL09ReN6iL29N1Ltkxeq762/pDPfG2gEXn5gUri # 4T6aIaz3QXGbRUraVauYWGORGXnPKgc53Abuyk1iQOiYI81Yi51RCZBgqm38eyyl # 9xv7GmdYgNB0zOATymPW+nAuBYScfsu1Ph1kJ6gOj08rjRHEEPyQonvr2eCQTB/A # IPYRf8xCTv14i86GmcfXYa5UHK9opmTldm+q08403Cvyr+oDfzvsi5bBaCdp5f6m # unDR1n9Au1sYZWuA/5NFCO37Z1xkDk/dfgvAA2GI+zLQ6XhcJ2Ps7EEsW87OwI8M # 9pWeSn518MUb404GKvtqpMnrzrbanKaDVX7qBz/VG/EL/CC9jIbTfd5wmq/Q6fRl # E1iv6L86TCADcc/VosPRoesSnDqW3TbreJGQK+tx1w5bzDeMLxMm5oZbILZL2MSP # ODCCB3EwggVZoAMCAQICEzMAAAAVxedrngKbSZkAAAAAABUwDQYJKoZIhvcNAQEL # BQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH # EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNV # BAMTKU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDEwMB4X # DTIxMDkzMDE4MjIyNVoXDTMwMDkzMDE4MzIyNVowfDELMAkGA1UEBhMCVVMxEzAR # BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1p # Y3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3Rh # bXAgUENBIDIwMTAwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDk4aZM # 57RyIQt5osvXJHm9DtWC0/3unAcH0qlsTnXIyjVX9gF/bErg4r25PhdgM/9cT8dm # 95VTcVrifkpa/rg2Z4VGIwy1jRPPdzLAEBjoYH1qUoNEt6aORmsHFPPFdvWGUNzB # RMhxXFExN6AKOG6N7dcP2CZTfDlhAnrEqv1yaa8dq6z2Nr41JmTamDu6GnszrYBb # fowQHJ1S/rboYiXcag/PXfT+jlPP1uyFVk3v3byNpOORj7I5LFGc6XBpDco2LXCO # Mcg1KL3jtIckw+DJj361VI/c+gVVmG1oO5pGve2krnopN6zL64NF50ZuyjLVwIYw # XE8s4mKyzbnijYjklqwBSru+cakXW2dg3viSkR4dPf0gz3N9QZpGdc3EXzTdEonW # /aUgfX782Z5F37ZyL9t9X4C626p+Nuw2TPYrbqgSUei/BQOj0XOmTTd0lBw0gg/w # EPK3Rxjtp+iZfD9M269ewvPV2HM9Q07BMzlMjgK8QmguEOqEUUbi0b1qGFphAXPK # Z6Je1yh2AuIzGHLXpyDwwvoSCtdjbwzJNmSLW6CmgyFdXzB0kZSU2LlQ+QuJYfM2 # BjUYhEfb3BvR/bLUHMVr9lxSUV0S2yW6r1AFemzFER1y7435UsSFF5PAPBXbGjfH # CBUYP3irRbb1Hode2o+eFnJpxq57t7c+auIurQIDAQABo4IB3TCCAdkwEgYJKwYB # BAGCNxUBBAUCAwEAATAjBgkrBgEEAYI3FQIEFgQUKqdS/mTEmr6CkTxGNSnPEP8v # BO4wHQYDVR0OBBYEFJ+nFV0AXmJdg/Tl0mWnG1M1GelyMFwGA1UdIARVMFMwUQYM # KwYBBAGCN0yDfQEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0 # LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTATBgNVHSUEDDAKBggrBgEF # BQcDCDAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD # VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTV9lbLj+iiXGJo0T2UkFvXzpoYxDBW # BgNVHR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny # bC9wcm9kdWN0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcmwwWgYIKwYBBQUH # AQEETjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtp # L2NlcnRzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNydDANBgkqhkiG9w0BAQsF # AAOCAgEAnVV9/Cqt4SwfZwExJFvhnnJL/Klv6lwUtj5OR2R4sQaTlz0xM7U518Jx # Nj/aZGx80HU5bbsPMeTCj/ts0aGUGCLu6WZnOlNN3Zi6th542DYunKmCVgADsAW+ # iehp4LoJ7nvfam++Kctu2D9IdQHZGN5tggz1bSNU5HhTdSRXud2f8449xvNo32X2 # pFaq95W2KFUn0CS9QKC/GbYSEhFdPSfgQJY4rPf5KYnDvBewVIVCs/wMnosZiefw # C2qBwoEZQhlSdYo2wh3DYXMuLGt7bj8sCXgU6ZGyqVvfSaN0DLzskYDSPeZKPmY7 # T7uG+jIa2Zb0j/aRAfbOxnT99kxybxCrdTDFNLB62FD+CljdQDzHVG2dY3RILLFO # Ry3BFARxv2T5JL5zbcqOCb2zAVdJVGTZc9d/HltEAY5aGZFrDZ+kKNxnGSgkujhL # mm77IVRrakURR6nxt67I6IleT53S0Ex2tVdUCbFpAUR+fKFhbHP+CrvsQWY9af3L # wUFJfn6Tvsv4O+S3Fb+0zj6lMVGEvL8CwYKiexcdFYmNcP7ntdAoGokLjzbaukz5 # m/8K6TT4JDVnK+ANuOaMmdbhIurwJ0I9JZTmdHRbatGePu1+oDEzfbzL6Xu/OHBE # 0ZDxyKs6ijoIYn/ZcGNTTY3ugm2lBRDBcQZqELQdVTNYs6FwZvKhggNWMIICPgIB # ATCCAQGhgdmkgdYwgdMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u # MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp # b24xLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRl # ZDEnMCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjM2MDUtMDVFMC1EOTQ3MSUwIwYD # VQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloiMKAQEwBwYFKw4DAhoD # FQCYETxIKPGCNpybLz9UR2Ts3GlHpqCBgzCBgKR+MHwxCzAJBgNVBAYTAlVTMRMw # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN # aWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0 # YW1wIFBDQSAyMDEwMA0GCSqGSIb3DQEBCwUAAgUA7cDNoTAiGA8yMDI2MDUyNzAx # NTU0NVoYDzIwMjYwNTI4MDE1NTQ1WjB0MDoGCisGAQQBhFkKBAExLDAqMAoCBQDt # wM2hAgEAMAcCAQACAg2/MAcCAQACAhekMAoCBQDtwh8hAgEAMDYGCisGAQQBhFkK # BAIxKDAmMAwGCisGAQQBhFkKAwKgCjAIAgEAAgMHoSChCjAIAgEAAgMBhqAwDQYJ # KoZIhvcNAQELBQADggEBALXXbPNcRAmwqXzeOPQoTYZiszOOtgBgCCGKkeQg1Gjd # mC5tU8YuhXjHRJh1asfLhHxef884YDXyYaVYsq+EnL5iiEHZZVrYtJ7sFh11bZwk # jktdIEDJuy4CTYAzBetOEt85NayUzcfivGZVeUX1BzBSppDlv1CprE3iZHwIB4RQ # jcU7RTLbaKNmFoD6Jc6gRaxai5sIEgrpVxFa/bsRmvuSyjIm3fTbx28/Jcj7vM8m # YsySHME0vsoRWi4FtMccRdtyZTQB9Do9vQzHA9zJzAZg5lcxFMMzW+8kH4U274gA # o2hxshdsGX1niKD7Ivhg5P88LEYoD38+SSK+u2eFu1AxggQNMIIECQIBATCBkzB8 # MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk # bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1N # aWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAhOwQzVmz6+V6AABAAAC # EzANBglghkgBZQMEAgEFAKCCAUowGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEE # MC8GCSqGSIb3DQEJBDEiBCBtt3SIbttnA68y0Vcii2QIcny75lYGZbSpLGQxQQCo # ezCB+gYLKoZIhvcNAQkQAi8xgeowgecwgeQwgb0EIMzhCW0UhTPwngOMDM/idWh1 # m9DFgaV5Qh+nzo5rnFhoMIGYMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgT # Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m # dCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENB # IDIwMTACEzMAAAITsEM1Zs+vlegAAQAAAhMwIgQghyd5sbAc91jUGN3/nZfKYl0e # N8UvnQp6oITm7zaC+AYwDQYJKoZIhvcNAQELBQAEggIAxxX9XNrQS0v6MDlSRj3K # bvqMwmGQhFtLxc0fCpLvqVNozvKcwOjT4ujolyigv2Hy+ChPiCISBLGHuqmSQSSD # vhiSPA7TIuuFL2+Ov26TbEyrt2bpz9Xf1ZOJltDN3Ua6jGOcArD4d2GJR0OZsr8x # KF4E6plia35Z7YNeIImGSssvok5hAGq3ex+h5XXJnKJpCedaQMEQ7WaJu9G2YNnj # cCLCVBhG2BqKG+eQSQeAKcCgmU+5PEp6ka0zt2CanBTwn2g0ITJHIIveCvrl7Inb # 9tuAfi0GY1hwu/8nSUKqoecKf2XI0pOzAsFkU/6recJEp/d7Y8H3o2uzxenZ10O3 # tLeUZBq+xIDb3CX1p8aeF2sxv1qssF8GEQWFZNtzcPb/t60s+XXFTlFOrw110LXN # Ot5rarOhmFujGqJ4XHu3inVRX6WDP2VLUk8MVDUpjfDFvUOnucOGAY8DARkxUIsq # 0El2cXenHnbUej6R2t9nzA+F95G0bU5k7ey1uSTUXdH89vy9qIC4ohSFAgWjou0a # xqua012653M5DrVnQZmcFFwhcZN6MpiLBr5CDbQ4V4514sqqoYBxWM8qJxYViFsW # pQPOOsw2LcoM/daJGSZcr4coi7jl+A1lphcIoNFWFWgUh03O8LnXsnBKZOFHgb/G # /SM4hVswRTJQ8fg6sVYIxW8= # SIG # End signature block |