Public/Test-PSDeveloperReady.ps1
function Test-PSDeveloperReady { [CmdletBinding()] [OutputType([String])] param ( ) $ESC = [char]0x1b #region 1. (Windows) PowerShell Version switch -Wildcard ($PSVersionTable.PSVersion) { '5.1.*' { "1. $ESC[32mWindows PowerShell Version OK$ESC[!p - Die Windows PowerShell Version $ESC[35m$($PSVersionTable.PSVersion)$ESC[!p ist aktuell aber nicht mehr Stand der Technik steigen Sie besser auf PowerShell 7 um." } '7.*' { "1. $ESC[32mPowerShell Version OK$ESC[!p - Die PowerShell Version $ESC[35m$($PSVersionTable.PSVersion)$ESC[!p entspricht dem aktuellem Standard." } Default { "1. $ESC[31mPowerSell Version NICHT OK$ESC[!p - Die PowerShell Version $ESC[35m$($PSVersionTable.PSVersion)$ESC[!p entspricht nicht mehr dem aktuellem Standard. Aktualisieren Sie auf PowerShell 7 oder höher." } } #endregion #region 2. Execution Policy RemoteSinged if ((Get-ExecutionPolicy) -eq [Microsoft.PowerShell.ExecutionPolicy]::RemoteSigned) { "2. $ESC[32mAusführungsrichtlinien OK$ESC[!p - Die aktuellen Ausführungsrichtlinien $ESC[35m$(Get-ExecutionPolicy)$ESC[!p sind eine gesunde Mischung zwischen Sicherheit und Produktivität auf einem PowerShell-Entwicklungs-PC." } else { "2. $ESC[31mAusführungsrichtlinien NICHT OK$ESC[!p - Die aktuellen Ausführungsrichtlinien $ESC[35m$(Get-ExecutionPolicy)$ESC[!p sollten auf RemoteSigned gestellt werden, um eine gesunde Mischung zwischen Sicherheit und Produktivität auf einem PowerShell-Entwicklungs-PC einzustellen. (Anmerkung: Visual Studio Code stellt aktuell den Scope Process auf ByPass.)" } #endregion #region 3. PowerShell Hilfe-Dateien if ($PSEdition -eq 'Desktop') { $CountNewHelpFiles = Get-ChildItem -Path "$env:windir\System32\WindowsPowerShell\v1.0\en-US" -File -Force -ErrorAction 'Ignore' | Measure-Object | Select-Object -ExpandProperty 'Count' if ($CountNewHelpFiles -gt 140) { "3. $ESC[32mWindows PowerShell Hilfe OK$ESC[!p - Die Windows PowerShell-Hilfe-Dateien ($ESC[35m$CountNewHelpFiles St.$ESC[!p) scheinen offline zur Verfügung stehen." } else { "3. $ESC[31mWindows PowerShell Hilfe NICHT OK$ESC[!p - Die Windows PowerShell-Hilfe-Dateien sollten offline zur Verfügung stehen. Aktualisieren Sie (Admin-Rechte nötig) diese über: $ESC[35mUpdate-Help -Module * -UICulture en-US -Force$ESC[!p" } } if ($PSEdition -eq 'Core') { $CountNewHelpFiles = Get-ChildItem -Path "$([System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::MyDocuments))\PowerShell\Help\en-US" -File -Force -ErrorAction 'Ignore' | Measure-Object | Select-Object -ExpandProperty 'Count' if ($CountNewHelpFiles -gt 0) { "3. $ESC[32mPowerShell Hilfe OK$ESC[!p - Die PowerShell-Hilfe-Dateien ($ESC[35m$CountNewHelpFiles St.$ESC[!p) scheinen offline zur Verfügung stehen." } else { "3. $ESC[31mPowerShell Hilfe NICHT OK$ESC[!p - PowerShell-Hilfe-Dateien sollten offline zur Verfügung stehen. Aktualisieren Sie diese über: Update-Help -Module * -UICulture en-US -Scope CurrentUser -Force" } } #endregion #region 4. VSCode als aktuelle Version installiert $VSCodePath = "$([System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::UserProfile))\AppData\Local\Programs\Microsoft VS Code" if (-not (Test-Path -Path $VSCodePath)) { $VSCodePath = 'C:\Program Files\Microsoft VS Code' } if (-not (Test-Path -Path $VSCodePath)) { $VSCodePath = Get-ChildItem -Path "$env:SystemDrive\" -Recurse -File -ErrorAction 'Ignore' | Where-Object -Property 'Name' -EQ -Value 'code.exe' | Select-Object -First 1 -ExpandProperty 'DirectoryName' } $VSCodeProductVersion = Get-Item -Path "$VSCodePath\code.exe" -ErrorAction 'Ignore' | Select-Object -ExpandProperty 'VersionInfo' | Select-Object -ExpandProperty 'ProductVersion' if ($VSCodeProductVersion -gt [Version]::new(1, 71, 0, 0)) { "4. $ESC[32mVSCode Version OK$ESC[!p - Ihr Visual Studio Code ($ESC[35m$VSCodePath$ESC[!p) ist auf einem aktuellen Stand ($VSCodeProductVersion)." } else { "4. $ESC[31mVSCode Version NICHT OK$ESC[!p - Visual Studio Code ist auf Ihrem System nicht vorhanden oder die Version $ESC[35m$VSCodeProductVersion$ESC[!p ist veraltet." } #endregion #region 5. Visual Studio Code Erweiterungen installiert $VSCodePSExtensionFounded = $false if (Test-Path "$VSCodePath\data\extensions\ms-vscode.powershell-*") { $VSCodePSExtensionFounded = $true "5. $ESC[32mVSCode-PS-Erweiterung OK$ESC[!p - Es wurde Visual Studio Code auf dem aktuellen PC gefunden dessen Programm-Ordner enthält die PowerShell-Erweiterung ($ESC[35m$VSCodePath\data\extensions\ms-vscode.powershell-*$ESC[!p) für Visual Studio Code. Es wird davon ausgegangen das Visual Studio Code als TO-GO-Variante korrekt installiert und konfiguriert wurde." } if (Test-Path -Path "$([System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::UserProfile))\.vscode\extensions\ms-vscode.powershell-*") { $VSCodePSExtensionFounded = $true "5. $ESC[32mVSCode-PS-Erweiterung OK$ESC[!p - Der PC enthält im aktuellen Benutzer-Profil ($ESC[35m$([System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::UserProfile))$ESC[!p) die PowerShell-Erweiterung für Visual Studio Code. Es wird davon ausgegangen das Visual Studio Code auf diesem System korrekt installiert und konfiguriert wurde." } if (-not $VSCodePSExtensionFounded) { "5. $ESC[31mVSCode-PS-Erweiterung NICHT OK$ESC[!p - Zur Visual Studio Code-Installation wurde die PowerShell-Erweiterung nicht gefunden. Dies kann über $ESC[35mhttps://marketplace.visualstudio.com/items?itemName=ms-vscode.PowerShell$ESC[!p installiert werden." } #endregion #region Wichtige Infos aufzeigen $CurrentWindowsPrincipal = [Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent() $IsElevatedAdminRights = $CurrentWindowsPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]'Administrator') [PSCustomObject]@{ Name = 'Admin Rechte aktiv' ; Value = $IsElevatedAdminRights } [PSCustomObject]@{ Name = 'PowerShell Edition' ; Value = $PSEdition } [PSCustomObject]@{ Name = 'PowerShell Version' ; Value = $PSVersionTable.PSVersion } [PSCustomObject]@{ Name = 'PowerShell Execution Policy' ; Value = Get-ExecutionPolicy } foreach ($path in ($env:PSModulePath -split ';')) { [PSCustomObject]@{ Name = 'PowerShell Module Path' ; Value = $path } } #endregion } # SIG # Begin signature block # MIIcZAYJKoZIhvcNAQcCoIIcVTCCHFECAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBCp40iyQp5kWzR # xY93mSaemon6hN6Pu3sXyWyZJpZofaCCFn8wggNyMIICWqADAgECAhA8emkJ82H0 # pEx+itPRny0WMA0GCSqGSIb3DQEBDQUAMFExIzAhBgkqhkiG9w0BCQEWFGluZm9A # YXR0aWxha3JpY2suY29tMSowKAYDVQQDDCFBdHRpbGEgS3JpY2sgKFNvZnR3YXJl # IERldmVsb3BlcikwHhcNMjIxMDE2MTg1MTA3WhcNMzIxMDE2MTkwMTA3WjBRMSMw # IQYJKoZIhvcNAQkBFhRpbmZvQGF0dGlsYWtyaWNrLmNvbTEqMCgGA1UEAwwhQXR0 # aWxhIEtyaWNrIChTb2Z0d2FyZSBEZXZlbG9wZXIpMIIBIjANBgkqhkiG9w0BAQEF # AAOCAQ8AMIIBCgKCAQEAvbn3JNw62vDI7mnX6gD+V/MyDkvFSzclaqC3Kfn+wDxj # xkmgwho343N/JCxAUjHoBjNDpx4W3KTVv3X7PYrPHxoz/134JTIBdV+yIyL/VkCS # Mnp9exMhMPxa1RvX3p/zphPMosv7xGgRPF3QVKxoBBUtifql80/pDHvOCPtROZ+9 # xSfXJ6P9jXGH4YSlNJxAKv53AXV0avihpa1BWL6ohyS1Bnjdbcw/hq0TIf4as1Dy # 7IbrU6Fneaqm/XIEEs11I0BrDNwgXnmB8PSojsm/DOtQY5Ps8eGJzwiXP2Vdvk0j # OsqDaJe3cxiOCXk6dz2zylB6rfP+Kph97bjaQoNI2QIDAQABo0YwRDAOBgNVHQ8B # Af8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwHQYDVR0OBBYEFKrSiXRUaupI # 5orXIniIR5sTcWwIMA0GCSqGSIb3DQEBDQUAA4IBAQAQ+6LPLF6Ua7JCC9LuwOCG # UlWwawgV/D5wK+FU8PQ+/onwBx9ZBqXnZw4f7NQtqaiR1bwm7sRTZeaIcif57zHM # /WBicYjB9dwZoGylfeCW6LRNQaoBvjuavOTsQw3lYF//ylJV8QyUKloJd9W6CVtm # tBSJEYopjygAm/9E9CxRFPSXxX/G+Af0+G+VeeBjSpaYKO688dVXa7pqMOm6hq9P # Ww6jgiCL3aRk0qbWwl2mt1POcfdRk/rdvt66BcO91cLDKhSCOIp7coJZ8Cf2xHDP # 99NcZ8ct02Cco6qjtlUkrCBRYNsuUAcToTvqQLiSSkywj+jTI4gm0vcjSiVXwnyy # MIIFjTCCBHWgAwIBAgIQDpsYjvnQLefv21DiCEAYWjANBgkqhkiG9w0BAQwFADBl # MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 # d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv # b3QgQ0EwHhcNMjIwODAxMDAwMDAwWhcNMzExMTA5MjM1OTU5WjBiMQswCQYDVQQG # EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl # cnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G # CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7J # IT3yithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxS # D1Ifxp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb # 7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1ef # VFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoY # OAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSa # M0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI # 8OCiEhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9L # BADMfRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfm # Q6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDr # McXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15Gkv # mB0t9dmpsh3lGwIDAQABo4IBOjCCATYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E # FgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wHwYDVR0jBBgwFoAUReuir/SSy4IxLVGL # p6chnfNtyA8wDgYDVR0PAQH/BAQDAgGGMHkGCCsGAQUFBwEBBG0wazAkBggrBgEF # BQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRw # Oi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0Eu # Y3J0MEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9E # aWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwEQYDVR0gBAowCDAGBgRVHSAAMA0G # CSqGSIb3DQEBDAUAA4IBAQBwoL9DXFXnOF+go3QbPbYW1/e/Vwe9mqyhhyzshV6p # Grsi+IcaaVQi7aSId229GhT0E0p6Ly23OO/0/4C5+KH38nLeJLxSA8hO0Cre+i1W # z/n096wwepqLsl7Uz9FDRJtDIeuWcqFItJnLnU+nBgMTdydE1Od/6Fmo8L8vC6bp # 8jQ87PcDx4eo0kxAGTVGamlUsLihVo7spNU96LHc/RzY9HdaXFSMb++hUD38dglo # hJ9vytsgjTVgHAIDyyCwrFigDkBjxZgiwbJZ9VVrzyerbHbObyMt9H5xaiNrIv8S # uFQtJ37YOtnwtoeW/VvRXKwYw02fc7cBqZ9Xql4o4rmUMIIGrjCCBJagAwIBAgIQ # BzY3tyRUfNhHrP0oZipeWzANBgkqhkiG9w0BAQsFADBiMQswCQYDVQQGEwJVUzEV # MBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29t # MSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMjIwMzIzMDAw # MDAwWhcNMzcwMzIyMjM1OTU5WjBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGln # aUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5 # NiBTSEEyNTYgVGltZVN0YW1waW5nIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A # MIICCgKCAgEAxoY1BkmzwT1ySVFVxyUDxPKRN6mXUaHW0oPRnkyibaCwzIP5WvYR # oUQVQl+kiPNo+n3znIkLf50fng8zH1ATCyZzlm34V6gCff1DtITaEfFzsbPuK4CE # iiIY3+vaPcQXf6sZKz5C3GeO6lE98NZW1OcoLevTsbV15x8GZY2UKdPZ7Gnf2ZCH # RgB720RBidx8ald68Dd5n12sy+iEZLRS8nZH92GDGd1ftFQLIWhuNyG7QKxfst5K # fc71ORJn7w6lY2zkpsUdzTYNXNXmG6jBZHRAp8ByxbpOH7G1WE15/tePc5OsLDni # pUjW8LAxE6lXKZYnLvWHpo9OdhVVJnCYJn+gGkcgQ+NDY4B7dW4nJZCYOjgRs/b2 # nuY7W+yB3iIU2YIqx5K/oN7jPqJz+ucfWmyU8lKVEStYdEAoq3NDzt9KoRxrOMUp # 88qqlnNCaJ+2RrOdOqPVA+C/8KI8ykLcGEh/FDTP0kyr75s9/g64ZCr6dSgkQe1C # vwWcZklSUPRR8zZJTYsg0ixXNXkrqPNFYLwjjVj33GHek/45wPmyMKVM1+mYSlg+ # 0wOI/rOP015LdhJRk8mMDDtbiiKowSYI+RQQEgN9XyO7ZONj4KbhPvbCdLI/Hgl2 # 7KtdRnXiYKNYCQEoAA6EVO7O6V3IXjASvUaetdN2udIOa5kM0jO0zbECAwEAAaOC # AV0wggFZMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFLoW2W1NhS9zKXaa # L3WMaiCPnshvMB8GA1UdIwQYMBaAFOzX44LScV1kTN8uZz/nupiuHA9PMA4GA1Ud # DwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEFBQcDCDB3BggrBgEFBQcBAQRrMGkw # JAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBBBggrBgEFBQcw # AoY1aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJv # b3RHNC5jcnQwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybDMuZGlnaWNlcnQu # Y29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcmwwIAYDVR0gBBkwFzAIBgZngQwB # BAIwCwYJYIZIAYb9bAcBMA0GCSqGSIb3DQEBCwUAA4ICAQB9WY7Ak7ZvmKlEIgF+ # ZtbYIULhsBguEE0TzzBTzr8Y+8dQXeJLKftwig2qKWn8acHPHQfpPmDI2AvlXFvX # bYf6hCAlNDFnzbYSlm/EUExiHQwIgqgWvalWzxVzjQEiJc6VaT9Hd/tydBTX/6tP # iix6q4XNQ1/tYLaqT5Fmniye4Iqs5f2MvGQmh2ySvZ180HAKfO+ovHVPulr3qRCy # Xen/KFSJ8NWKcXZl2szwcqMj+sAngkSumScbqyQeJsG33irr9p6xeZmBo1aGqwpF # yd/EjaDnmPv7pp1yr8THwcFqcdnGE4AJxLafzYeHJLtPo0m5d2aR8XKc6UsCUqc3 # fpNTrDsdCEkPlM05et3/JWOZJyw9P2un8WbDQc1PtkCbISFA0LcTJM3cHXg65J6t # 5TRxktcma+Q4c6umAU+9Pzt4rUyt+8SVe+0KXzM5h0F4ejjpnOHdI/0dKNPH+ejx # mF/7K9h+8kaddSweJywm228Vex4Ziza4k9Tm8heZWcpw8De/mADfIBZPJ/tgZxah # ZrrdVcA6KYawmKAr7ZVBtzrVFZgxtGIJDwq9gdkT/r+k0fNX2bwE+oLeMt8EifAA # zV3C+dAjfwAL5HYCJtnwZXZCpimHCUcr5n8apIUP/JiW9lVUKx+A+sDyDivl1vup # L0QVSucTDh3bNzgaoSv27dZ8/DCCBsIwggSqoAMCAQICEAVEr/OUnQg5pr/bP1/l # YRYwDQYJKoZIhvcNAQELBQAwYzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lD # ZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQwOTYg # U0hBMjU2IFRpbWVTdGFtcGluZyBDQTAeFw0yMzA3MTQwMDAwMDBaFw0zNDEwMTMy # MzU5NTlaMEgxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjEg # MB4GA1UEAxMXRGlnaUNlcnQgVGltZXN0YW1wIDIwMjMwggIiMA0GCSqGSIb3DQEB # AQUAA4ICDwAwggIKAoICAQCjU0WHHYOOW6w+VLMj4M+f1+XS512hDgncL0ijl3o7 # Kpxn3GIVWMGpkxGnzaqyat0QKYoeYmNp01icNXG/OpfrlFCPHCDqx5o7L5Zm42nn # af5bw9YrIBzBl5S0pVCB8s/LB6YwaMqDQtr8fwkklKSCGtpqutg7yl3eGRiF+0Xq # DWFsnf5xXsQGmjzwxS55DxtmUuPI1j5f2kPThPXQx/ZILV5FdZZ1/t0QoRuDwbjm # UpW1R9d4KTlr4HhZl+NEK0rVlc7vCBfqgmRN/yPjyobutKQhZHDr1eWg2mOzLukF # 7qr2JPUdvJscsrdf3/Dudn0xmWVHVZ1KJC+sK5e+n+T9e3M+Mu5SNPvUu+vUoCw0 # m+PebmQZBzcBkQ8ctVHNqkxmg4hoYru8QRt4GW3k2Q/gWEH72LEs4VGvtK0VBhTq # YggT02kefGRNnQ/fztFejKqrUBXJs8q818Q7aESjpTtC/XN97t0K/3k0EH6mXApY # TAA+hWl1x4Nk1nXNjxJ2VqUk+tfEayG66B80mC866msBsPf7Kobse1I4qZgJoXGy # bHGvPrhvltXhEBP+YUcKjP7wtsfVx95sJPC/QoLKoHE9nJKTBLRpcCcNT7e1NtHJ # XwikcKPsCvERLmTgyyIryvEoEyFJUX4GZtM7vvrrkTjYUQfKlLfiUKHzOtOKg8tA # ewIDAQABo4IBizCCAYcwDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwFgYD # VR0lAQH/BAwwCgYIKwYBBQUHAwgwIAYDVR0gBBkwFzAIBgZngQwBBAIwCwYJYIZI # AYb9bAcBMB8GA1UdIwQYMBaAFLoW2W1NhS9zKXaaL3WMaiCPnshvMB0GA1UdDgQW # BBSltu8T5+/N0GSh1VapZTGj3tXjSTBaBgNVHR8EUzBRME+gTaBLhklodHRwOi8v # Y3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRSU0E0MDk2U0hBMjU2 # VGltZVN0YW1waW5nQ0EuY3JsMIGQBggrBgEFBQcBAQSBgzCBgDAkBggrBgEFBQcw # AYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMFgGCCsGAQUFBzAChkxodHRwOi8v # Y2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRSU0E0MDk2U0hB # MjU2VGltZVN0YW1waW5nQ0EuY3J0MA0GCSqGSIb3DQEBCwUAA4ICAQCBGtbeoKm1 # mBe8cI1PijxonNgl/8ss5M3qXSKS7IwiAqm4z4Co2efjxe0mgopxLxjdTrbebNfh # YJwr7e09SI64a7p8Xb3CYTdoSXej65CqEtcnhfOOHpLawkA4n13IoC4leCWdKgV6 # hCmYtld5j9smViuw86e9NwzYmHZPVrlSwradOKmB521BXIxp0bkrxMZ7z5z6eOKT # GnaiaXXTUOREEr4gDZ6pRND45Ul3CFohxbTPmJUaVLq5vMFpGbrPFvKDNzRusEEm # 3d5al08zjdSNd311RaGlWCZqA0Xe2VC1UIyvVr1MxeFGxSjTredDAHDezJieGYkD # 6tSRN+9NUvPJYCHEVkft2hFLjDLDiOZY4rbbPvlfsELWj+MXkdGqwFXjhr+sJyxB # 0JozSqg21Llyln6XeThIX8rC3D0y33XWNmdaifj2p8flTzU8AL2+nCpseQHc2kTm # Ot44OwdeOVj0fHMxVaCAEcsUDH6uvP6k63llqmjWIso765qCNVcoFstp8jKastLY # OrixRoZruhf9xHdsFWyuq69zOuhJRrfVf8y2OMDY7Bz1tqG4QyzfTkx9HmhwwHcK # 1ALgXGC7KP845VJa1qwXIiNO9OzTF/tQa/8Hdx9xl0RBybhG02wyfFgvZ0dl5Rtz # tpn5aywGRu9BHvDwX+Db2a2QgESvgBBBijGCBTswggU3AgEBMGUwUTEjMCEGCSqG # SIb3DQEJARYUaW5mb0BhdHRpbGFrcmljay5jb20xKjAoBgNVBAMMIUF0dGlsYSBL # cmljayAoU29mdHdhcmUgRGV2ZWxvcGVyKQIQPHppCfNh9KRMforT0Z8tFjANBglg # hkgBZQMEAgEFAKCBhDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3 # DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEV # MC8GCSqGSIb3DQEJBDEiBCB5Jy13Py7YvOTlc3MZbeHWRdPMSOUuAmkV7etdRzyr # BDANBgkqhkiG9w0BAQEFAASCAQCCnqPbiB1JvvBZL4J/QySeyL5EaSh5JZucOJcJ # PeWd0geCNOkrjfzOjlQhpXyut8ka2zB/1Gd8cCSc83xb4qQ6MUZSzoNk95hCKNAG # gIoiPCjeVbzTsS9u5DW8z5NcwFvYdCzwZF370ofzxyTEncJchqmpqGktc1/XBGro # 1mEJDI661qjO+STHftyJg8Ihgwz9fhgJqsXiJekzVVH+SjJSHB0XI7swKVn+VH47 # nDbxj5pMims1548yRplUX12nWg/XFrEf4sd3HDvWj52i+iN/tnCymOHSfD/85yTU # bDO4ouYjxO1CuRrjXDBXTAw4aEXfI+86zT2mp1XNP/ulsb1VoYIDIDCCAxwGCSqG # SIb3DQEJBjGCAw0wggMJAgEBMHcwYzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRp # Z2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQw # OTYgU0hBMjU2IFRpbWVTdGFtcGluZyBDQQIQBUSv85SdCDmmv9s/X+VhFjANBglg # hkgBZQMEAgEFAKBpMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcN # AQkFMQ8XDTI0MDMwNTIwMTczMVowLwYJKoZIhvcNAQkEMSIEIOG5EA08P1FHe3LJ # RjllsqOAOYj0X07JMUG4bph10JsYMA0GCSqGSIb3DQEBAQUABIICAGSmYjJ7LDJH # /8fyxw1wZU6zdGmB7Tt9jnz/oQcotVTQsyvSpIFEhdhx3qlpfgn0BOrylC+Q3fgl # gkByGgoTGDY10fhrBEBuBf0LSQ5G48/9wJgrRUZY/MiBXUghZmGXvXRQQHTRF3yD # NzbwpJuYC9sie1jXG3RfEUMQHTsU0HMkRYNjMsUyqAYT0f23dnUoQpfcLAejk1Dn # a6DZbLW+5y5j+35+5jW3QCCN9p1ACkdjcoMmzV34dsN1s+AkGh4NnpQCYhdWSzkk # 5uDcDZIIaU/2ZDEIU98f5j1iuTEFBx0t0jdIEc9u2o37FaA+EVnBObawsFleFArs # 4yVCXXMmTXZnKm50SeTEJwRQy+IAkc51DH+eRAXJlvr62uxYWp/Ps9JeEUVpHkX2 # qfQFORuAGvMo64Xi0qu+EQtjld+m2QVZgvKnfNzgOJTHohlx9ps7jpeYTKibHmtj # psJstKo9s5f8+V9taxQVbt/XmwdYj2+bx6GVG9nstanUzCPOfM5mjfhxL3rsDssQ # Zf1SlLQwDytfUMfyhWUsZ623BByQ29j1+K6nv0Lbb4oyhPtYwVvAnZa5WT0yNidc # lnH0/qyh1Q18g5ZIotTpg1xMRUeyoahKeKuO96q3UJwZ3GM7+SjR1c9Genw9w1ox # Dm1tVlMY4rooFagEtHrJ+eReHZnqbJ7c # SIG # End signature block |