Private/Wissen/C_Advance/C10_UserModules.ps1

<#
 
# User Module
 
Eigene Module erstellen
 
- **Hashtags** Module Repository Deployment PowerShellGallery
- **Version** 2020.03.13
 
#>


#region Vorbereitung

# 1. Name des Module
$moduleName = "ABC"

# 2. Installationsort des Moduls festlegen (möglich sind: $env:PSModulePath -split ";")
$destinationModulePath = Join-Path -Path $env:USERPROFILE -ChildPath "\Documents\WindowsPowerShell\Modules"

# 3. OPTIONAL Ein Zertifikat zum signieren auswählen
$cert = Get-ChildItem -Path "C:\Temp\MyCodeSigningCert.pfx" | Get-PfxCertificate

# 4. Test-Cmdlet erzeugen
@'
function Get-Hello {
    param ([string]$Name = "Du")
    "Hello $Name!" | Write-Output
}
'@
 | Set-Content -Path "C:\temp\Get-Hello.ps1"
Set-AuthenticodeSignature -FilePath "C:\temp\Get-Hello.ps1" -Certificate $cert

#endregion

#region Module erstellen

# ! 1. Für das neue Module den Modul-Ordner erstellen
$destinationModulePath = Join-Path -Path $destinationModulePath -ChildPath $moduleName
New-Item -Path $destinationModulePath -ItemType Directory -Force
Set-Location -Path $destinationModulePath

New-Item -Path $destinationModulePath -Name "Public"  -ItemType Directory # ! Öffentlicher Teil des Module
New-Item -Path $destinationModulePath -Name "Private" -ItemType Directory # ! Interner Teil des Module, z.B. Hilfs-Funktion
New-Item -Path $destinationModulePath -Name "de-DE"   -ItemType Directory # ! Sprach-Land-Bezogene Inhalte

# ! 2. Eigene Cmdlets in den Modulordner kopieren
Copy-Item -Path "C:\temp\*-*.ps1" -Destination ".\Public\" -Force -Verbose

# ! 3. .PSM1-Datei erstellen
# ! Der darin enthaltene Code wird ausgeführt, wenn das Modul importiert wird.
New-Item -Path .\$moduleName.psm1 -ItemType File -Force
@'
Get-ChildItem "$PSScriptRoot\Public\*.ps1" | ForEach-Object {
    . $_.FullName
}
'@
 | Add-Content .\$moduleName.psm1

# ! OPTIONAL: Fügen Sie folgenden Code der .PSM1-Datei hinzu, um einen Ereignis-Handler für das
# ! Entladen des Moduls hinzuzufügen.
@'
$MyInvocation.MyCommand.ScriptBlock.Module.OnRemove = {
    "Module wurde entladen." | Write-Output
}
'@
 | Add-Content -Path .\$moduleName.psm1

# ! OPTIONAL: PSM1-Datei signieren
Set-AuthenticodeSignature -FilePath .\$moduleName.psm1 -Certificate $cert # OPTIONAL

# ? Inhalt der .PSM1-Datei anzeigen
Start-Process -FilePath .\$moduleName.psm1 # TODO Inhalt korrekt bzw. ergänzen

# ! 4. .PSD1-Datei erstellen (Manifest-Informationen über das neue Modul)
$params = @{
    Path            = ".\$moduleName.psd1"
    RootModule      = $moduleName
    Guid            = "38ed2cd7-d6ae-44fe-bb28-7a8a21247dfe" # Eine eindeutig GUID die das Modul ein lebenlang behält # TODO eine neue GUID erzeugen über: New-Guid
    Author          = "VORNAME NACHNAME"
    CompanyName     = "DIE FIRMA"
    Copyright       = "(c) 2019 by DIE FIRMA"
    Description     = "Test-Module aus der PowerShell-Schulung - Aufbaukurs"
    ModuleVersion   = [Version]::new(2020, 1, 30, 1109) # ! major.minor.build.revision => major.minor (Neue Feature), build (Bugfixing), revision (Ausroll-Varianten)
    CmdletsToExport = Get-ChildItem -Path .\Public\*-*.ps1 | Select-Object -ExpandProperty BaseName
}
New-ModuleManifest @params
# TODO Die .psd1-Datei kann auch komfortabel per TXT-Editor bearbeitet werden:
Start-Process -FilePath .\$moduleName.psd1 -Wait # TODO Inhalt korrekt bzw. ergänzen

#endregion

#region Erstelltes Module testen

# ? Wird das Module in der Liste der installierten Module angezeigt:
Get-Module -Name $moduleName -ListAvailable

# ? Wird das Modul importiert?
Remove-Module -Name $moduleName -Force -ErrorAction Ignore
Import-Module -Name $moduleName -Verbose -Force
Get-Module -Name $moduleName

# ? Wird das Modul endladen?
Remove-Module -Name $moduleName
Get-Module -Name $moduleName

# ? Werden alle Cmdlets, Aliase, Funktionen etc. aufgelistet?
Get-Command -Module $moduleName -All

# ? Können die Modul-Features genutzt werden?
Get-Hello -Name "Attila"

# ? ABC-Module in Show-Command nutzbar?
Show-Command -NoCommonParameter -ErrorPopup

#region Pester-UTest zum Module ABC

Describe "Modul ABC Test" {
    
    Context "Ordner- und Datei-Struktur testen" {
        It "Modul-Ordner heißt ABC und ist vorhanden" { Test-Path -Path .\..\$moduleName       | Should be $true }
        It ".PSD1-Dateiname heißt ABC.psd1"           { Test-Path -Path .\$moduleName.psd1     | Should be $true }
        It ".PSM1-Dateiname heißt ABC.psd1"           { Test-Path -Path .\$moduleName.psm1     | Should be $true }
    }
   
    Context "Enthaltene Cmdlets testen" {
        It "Das Module ABC enthält das Skript Get-Hello.ps1"    { Test-Path -Path ".\Public\Get-Hello.ps1" | Should be $true   }
        It "Das Module ABC enthält das Skript Get-BigFile.ps1"  { Test-Path -Path ".\Public\Get-BigFile.ps1" | Should be $true }
    }
    
    Context "Modul-Manifest-Datei validieren" {
        It 'Manifest frei von Exceptions' {
            { $Script:Manifest = Test-ModuleManifest -Path ".\$moduleName.psd1" -ErrorAction "Stop" -WarningAction "SilentlyContinue" } | Should Not Throw
        }
        It 'Manifest Name ist ABC'                  { $Script:Manifest.Name                  | Should be "ABC"                                  }
        It 'Manifest Version ist vom Typ [Version]' { $Script:Manifest.Version -as [Version] | Should Not BeNullOrEmpty                         }
        It 'Manifest Beschreibung gesetzt'          { $Script:Manifest.Description           | Should Not BeNullOrEmpty                         }
        It 'Manifest Root-Name ist ABC'             { $Script:Manifest.RootModule            | Should Be "ABC"                                  }
        It 'Manifest GUID korrekt'                  { $Script:Manifest.Guid                  | Should be "38ed2cd7-d6ae-44fe-bb28-7a8a21247dfe" }
        It 'No Format File'                         { $Script:Manifest.ExportedFormatFiles   | Should BeNullOrEmpty                             }
    }

    Context "Funktionstest" {
        It "Modul in der Liste der installierten Module enthalten" { Get-Module -Name $moduleName -ListAvailable | Should Not BeNullOrEmpty}
    }
}

#endregion

#endregion

#region Ein privates Repository einrichten

# ! Denkbar über bereits vorhandene Repositories wie z.B. Artefactory, Nexus, etc.)
# ! Oder über eine Dateifreigabe (Modul-Autoren R/W-, Nutzer R-Rechte):

# ? Repository erstellen
New-Item -Path 'C:\Temp' -Name 'AbcGallery' -ItemType 'Directory'
New-SmbShare -Name 'AbcGallery' -Path 'c:\temp\AbcGallery' -ReadAccess 'Benutzer' -FullAccess 'Administratoren'
Register-PSRepository -Name 'AbcGallery' -SourceLocation '\\localhost\AbcGallery' -InstallationPolicy 'Trusted' -Verbose # TODO per GPO verteilen
Get-PSRepository

# ? Modul veröffentlichen
Publish-Module -Name '..\ABC' -Repository 'AbcGallery' -Verbose

# ? Modul installieren
Find-Module -Name '*' -Repository 'AbcGallery'
Install-Module -Name 'ABC' -Repository 'AbcGallery'

# ? Repository wieder löschen
Unregister-PSRepository -Name 'AbcGallery'
Remove-SmbShare -Name 'AbcGallery' -Force
Remove-Item -Path 'c:\temp\AbcGallery' -Recurse -Force

#endregion

#region Ein eigenes Module in die https://www.powershellgallery.com veröffentlichen

# ! 1. Folgende Pakete, Module und Dateien aktualisieren (ADMIN-Rechte):
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Force
Invoke-WebRequest -Uri https://dist.nuget.org/win-x86-commandline/latest/nuget.exe -OutFile "$env:LocalAppData\Microsoft\Windows\PowerShell\PowerShellGet\NuGet.exe"
Unblock-File -Path "$env:LocalAppData\Microsoft\Windows\PowerShell\PowerShellGet\NuGet.exe"
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force
Install-Module –Name PowerShellGet –Force
Update-Module –Name PowerShellGet
Remove-Module -Name * -Force

# ! 2. Den Deploy-Vorgang zuerst in einem privaten Repository testen
New-Item -Path 'C:\Temp' -Name 'AbcRepository' -ItemType 'Directory'
New-SmbShare -Name 'AbcRepository' -Path 'c:\temp\AbcRepository' -ReadAccess 'Benutzer' -FullAccess 'Administratoren'
Register-PSRepository -Name 'AbcRepository' -SourceLocation '\\localhost\AbcRepository' -InstallationPolicy 'Trusted' -Verbose
Publish-Module -Name '.\AKPT' -Repository 'AbcRepository' -Verbose
Find-Module -Name 'AKPT' -Repository 'AbcRepository' | Select-Object -Property Name, Version, Description, Author, CompanyName, Copyright, ProjectUri, Tags, Dependencies, ReleaseNotes
Install-Module -Name 'ABC' -Repository 'AbcRepository' -Scope CurrentUser
Uninstall-Module -Name 'ABC' -Force
Remove-SmbShare -Name 'AbcRepository' -Force
Remove-Item -Path 'c:\temp\AbcRepository' -Recurse -Force

# ! 3. Module in der PowerShellGallery veröffentlichen
Publish-Module -Name '.\AKPT' -NuGetApiKey "oy2anf2bblbjxtyj6geqw6pa52essnae3nrbtc5dbn6tli" -Verbose

#endregion

#region Übungen

<# TODO ÜBUNG UserModule A
    ! VERTIEFUNG: Eine Module managen
    ? 1. Fügen Sie das Cmdlet 'Get-EuroExchange' ({Current_Workspace}\Modules\AKPT\Get-EuroExchange.ps1) in das o.a. Modul 'ABC' ein.
    ? 2. Testen Sie das so angepasst Modul 'ABC' auf tauglichkeit bzgl. dem Cmdlet 'Get-EuroExchange'.
    TIPPS: 'Get-EuroExchange.ps1' signiert
            'ABC' enthält 'Get-EuroExchange.ps1'
            'ABC.psm1' anpassen !?
            'ABC.psd1' anpassen !?
    * LÖSUNG 76492d1116743f0423413b16050a5345MgB8AEYAZwBHAGgAVQAvAGgAagBsAGIAaABxAEIAcQBxAHIAdgA3AEYAcQBrAEEAPQA9AHwAMgAwAGIAZgAwAGEAMwBiADkAMwA4ADgANAAzADgAZAA5ADIAZAAzADgAYQAyADcAZAAwADgAMQA4ADcAOAA0ADgAMAAxAGUAMgBkADIAOABlADQAMgAyADkAYwBiADIAZgA2AGYAYwA0ADMANQA5ADIAMAAzADcAMAAwAGQAZgAyADUAYgA0AGQAYgA5AGUAMgBkADAANgBlAGUAOQA4ADkAOQAzAGMANABjADgAYgA4ADAANQA3ADUAMgAxAGQANQA0AGYAZQBjAGUAYQA5AGMAYQBhADUAMwBjADcAZgBkAGMAYgA3ADAANAA4AGUANQBkADYAOAA0ADQAYQBiADcAZQAwAGYANwBjADcANQAwADEANQAyAGUAZAA5AGMANgA0ADcANwBlADQAZAA2AGIANAA3AGMANwA1ADMAZgA3ADQAMQBlAGEAMgAxADMAZgBkADkAOABlAGEAYwA3ADQAMAA2AGYAYgA0AGMAYQA0AGEAYwAxADIAOABlADIANQAzAGUAMQA5AGIANgBhAGYANwA3ADkAYwBiAGMAOAA2ADkAZAAwAGYAMgBjAGYANgA3ADMAMAA5ADUAYQBjADEAOQAzAGYAYQA1AGUAMgAyADcANgA0ADQANABiAGEAMwA4ADAANgA2ADgAYwBjADcAZQA4AGEAZgBmAGQANABjAGQAZQA2ADgANgBhADIAYwA1ADQAZABkADkAZQA4AGUAMQAwAGQANAAwADIAMgBlADIAZAA3ADEANAA5ADcAMwA1ADcAMwA1ADMANwBiAGYAZgA2AGQAZABjADgAOQAwADYAZgAwAGMANAAwADAAZgA1ADMAZgBlAGIANgBlADAAMwAxADQANQAzADAANwA1ADIANQBkADEANgA0ADkANAA5AGQAYQA4ADQAOQBiADMANgA2ADYAZQBkAGMAYgA0ADkAYwA3ADgANgA5ADAAMQA1ADEAMAAzAGIAMAAzADkAYwA0AGEAMwAxADMANQAxADEANQA5ADYAYgBhADIAOQAwAGEAMgBmADMANABkADcAOAAxADYAZQBjAGMAYQA4ADcANgA1AGEAYQA2ADUAZABkAGYANwBjADIAMgBlADAAMwBiADkAOQA1ADcAZQAwADQAYwAxADQAMAAxADcAOAA5ADIAMwA5AGQAYgA0AGQAMAAyADUAZgA2ADUAZQA4ADUAYgA2ADkANwA4ADYAYwAxADMAYQA3AGYAYQAxADMAYQBhADIANgA4AGQANwBmADcAOQAwAGYANQBlADAAMgA4AGMAYwBjAGYAMAA2AGEAYQAxADgAMQA5ADcAMgBkADgAMAAyAGQANQAyADkAMwBmADgANAA1AGQAYgBlADAAOQA0ADkAOQA4ADIAYwA3ADMANQBkADgAZABhADEANAAzADMANAAxAGYAMwBkAGMAMQA1ADEAZgAyAGQAOAAxADMAYgBlADkAOABiAGEAZQAxADQANgAzAGMANgBlADcAMwAxAGEAZgA4AGMAZQA1ADkANgA1ADcANwAxAGQAZAA5ADMAOAAyAGEAYwBiADMAZgBkAGQAMQA3ADkAYQAyAGMAMwBmAGMANwBjAGIAMABiADkAZAAxADIAZgA1ADYAMABjADUANgAyADcAOAAzAGMAOQBlAGMAYgBjADQAOAAwADcAMwBhAGIAZgBlADMAYQA3AGYANgA1ADIAYgBmADMAMwBkAGIAYgAzADAAYgA2AGQAZAAyAGYAZQAwADcANgAyADgAMQBjADIAZgBkADUAOQA3AGEAOAAyADUAOQBiADIAZgA0ADEAZgA2AGUANAA1AGIAOQBkADEANwAyAGEAMQA4ADMAMwA4ADEANwA2AGYAMgA3AGMAYgBiADEANgBlADkANQA5AGEAZQAyAGUAMAAzAGMAZgA5ADYANwA3ADcANAA1ADEAMgAyADIAOQA0AGEAZgA0ADQAZAA3ADEANgAwAGEANQBiADkAZgBkADgAMwAzADQAOQA0ADMAMwA0ADgAZAA1ADcANgAwADEANABhADQANwA4ADQAMABiADUAZQA5ADAAYgBhAGIANQA1AGUAZQA1ADMAMwA0AGEAYQAxADgAOQBiADIANwAxADcAMQBiAGUAYQAyAGUAYQBjADAAMABhADcAOABjAGMAYQBhADAAYgA0ADEAMwBjAGIANwBkADEAMwAyADQANgBlADgANQA5AGMAMgA5AGMANwBhAGMANQBjAGEANgA4ADEAMgBjAGEANgAyADAAMwA0AGQAZQBhAGMANQAwADgAYQA5ADcANwAwAGYAOAAwAGQANABmADIAZABiADMAOAAwADkAYgA5ADcAZgA2ADIAMABmAGMAMQBiAGQANAA5AGUANwBlADMAZQBkADkANQAwADEAMgA4ADEAOABkADUAOQAxADUAOQAxAGIAMgAwADYAOAAwAGQANwAwAGEAOQA0ADMAYwAwADQAZgBiAGIAOABmADQAMQA3AGQAMQAxAGEAZgA5ADkAYgA1AGQANAA5ADMANwBmAGYAYgA2AGQAOQA1ADgAOQBkADkANgAyAGEAYwBkADQAMgBjAGUANgAwAGMAZAAyAGYANwAyADkANAA0AGUAZQAzADQANgAxADYANQAxADgAYQAzADMAYgBiAGIAMQBjADMAMAA3ADcAZQBmADMAMgA2ADgAYQBmAGUANABiAGQAYQBjADYAMQAyADAANgBkADcANwA0ADEAYgA2AGQANABjAGQAMwAzADcAYgA4ADEAZgBhAGUAZQBkADMAYwA3AGIAOAA2ADIANAAxAGEANABhADcAZgAyADEANgBlADEAZAAyADcAYgA0ADAAZgA2ADMANgA1ADAAMQA4AGQAMgA1ADAAMwBhADcAOAAwAGYANQAzAGEAOAAxADgAZQAyAGIANgBkAGUAOQBhAGUANwA1ADQAZgBkAGMAYgBjADAANgAwADYAOQBlAGEAZAA0ADgAMgA5AGUAZgBlADgANQA5ADAANQAwAGYAMgBjADgAMQBkAGUAMQAzAGQAOAA4AGEAOQA4ADYAZAA1ADAAZQA3ADkANwAzADIAOQA2ADkAYQBhADEANQAxADMANgBlADIAYwBlAGEAMQA4ADMAYQBhAGQAZQA3AGEAZQA2AGQANwAxADcAMwBiADcAZgBjADkAYQAyADMANwA2ADIAYgBkADIAYQAyAGIAZAA4AGIAZAA2ADYAMAA2ADkAMgA4AGYANwA1ADIANwA2ADcAOAA4AGUAOABjADMANwA1AGQAYgBmADgANABmAGMAZQBkAGYAOQAyAGYAZgA0AGMAYgA5ADAANwA5AGUAZQAwAGMAMgBjAGEAZQA1AGYAMABkADAAYgA2AGUAZABiADMAZAA4AGEANABmADAANABmAGYAMgAxAGEAOQA3ADgANAA0ADMAMgBjADcANgA5ADIAYgBlAGQAOABmAGIAYwAyAGIAMQA2AGQAMABkADUAYQBmADkAYwAwADMANQBkADYANQAzADEAMQBjAGEANABjADUANgBlAGUAZQA5ADkAZABjAGQANQA5AGEAMwA3AGUAMgBkADUAYgA3ADYAZAAxADkAZgA0ADAANgA1ADIAZgBlADYAMAA1AGMAZAA2ADAAZABiAGYAMgBiADMAMQA0ADkAMgBlAGEANAA2ADUAYgAyAGMAZgBhAGEANwBhADMANQBhAGIANgA5AGEAMwAyAGYAZABkADkAMQBlADEAZQBlADcAYgBiAGEANwA2ADcANQA5AGQAZQAzADEAMAA0AGIAMABlADIANwBhADEANgA3ADEAZgBlADAANwA1ADIAZgA4ADIAOAAxADAAZAAzAGMANQA3AGUANgBiADIAMQBiADMANgBjADEAOQA1ADcAYgAyADUANABlAGYAYQBmADUAZQA5AGEANQBkADgAMwBlAGEANgBkAGYAYQBhADMAZAAyAGYAMQAwAGIANwBjADIANwBkADQAMgBhADYANQA2ADEAMgBjAGYAYQBhADMAMQBjAGIANABiADUAYgBmADkAZAAwADgAYQBhADYANwBlAGIAMgBmAGIAMQA2ADYANgBmADIANQA3AGQAYQBiAGQAZgA4ADYAZQAyADUAMwAyADYAZQA5ADAANABlADAAMQBmAGYAMgBlAGUAYgA3ADAAMQAzADAAOQA0ADIAYwBjADkAYgAxADAAMQA0AGQAYgAzAGMANwA1ADIAYgA1ADEAZgBjAGIAZQBmADAAMQA2ADIAOABiAGMAYwA0ADQAYwBkADkAOQBhADAAOAAwAGYAOABmAGQAZQBiAGMAMAA1AGQAZQA3ADYAYQAxAGIAYQBlADkAYwBlAGIANgBlAGEANgA0AGIAYgA1ADgAMQAyADkAYQBhAGQAYgBlADQAZgA3ADcAOQA4ADUAZAA0AGIANwBmAGEAMgA2ADAAZgAxAGIANwA1ADMAOAAwADkANQBlADkAOQA5ADUAYQAzADcANQAyADEANwAyAGQANgBlAGMAOQBmADEAZAA0ADgAZABlADcAZAA5ADAAMQA4ADQAZAAyAGUANgA1AGUAMABlADMANgA2AGEAYgA1AGIAMgA5ADMAZAA2ADcANwAxADMANQA5ADUAZgAyADUAMQAzADIANABiADEAZgBmADgAYwA0ADYAMwAyAGEAZgBkAGMAYwAxADkAMgAzADkAYwBkADAAMQBlADMAYwAxADIAMgBlADcAYQA0ADAAZQA2ADcAMAA5ADkAZgA4AGUAOQBjADcAZAA3ADMAMAA1ADgANQA5ADMAMgA5ADYAYwBlADUANwA3ADQAYQBhAGEAMQA2AGQANgAzAGUAZAA4ADYAZAA4ADEAZgBlADcAZQA1ADgAZQA1ADAAMwA3ADQAZQBlADkANABlAGQAZgBjADcAYQAzADIANABjADcAYwAzADAAZgA5ADkAZQA2ADMANQAwAGQANwBmAGMANwAxADYAOAAwADMAYgBlAGYANAA5ADIAMgA0ADEAMAA0AGMAZABlAGEAZQBjADQAMQA3AGQANQBmADIAOQAxADcAMQBmAGEAOAAyAGMAYwA0ADcANgAwAGYAZQA2ADkAOQBlADEAOABiADgAZQBkADkAMQBmADEAOAAzADgAMwAxADMANQBiAGMAOAA1AGUAYgA2AGUAMABiAGUAZQA4AGIAMwBlAGEANAA5ADYAZQBhADIAZQAxAGYAOAA0ADAAYwAzAGMAOABhAGUAZgA2AGEAYwBhAGYAMwAwAGQANwA1ADUANgAwAGQAMQAwAGUANABiADQANAA5AGIANwBlAGIANQA5ADcAMQA3ADkAZQBhAGEANgBlADQAOQBkADUAMQBmAGMAZgBmADUAZQAyAGIANgA0ADEAMgBjAGEAMQA5AGQAYQBmADMAMABlADAAZAAxAGMANAA1ADYANQA4ADgANwBlAGEANABhADkAMQBhADkANAA4AGMANwAwAGYANwBhADQAZQBjAGIANgBhADYANAAyAGUAZAAxAGYAYgA3AGQANQA0ADgAZgA1ADQANwBhAGEANwA0ADUAMQA5AGYAMgA3ADMAOAAxADAAYQBkADAAMgAyADQAZAA2ADkAOQAxADUAOQBjAGEAMAA2ADQANAA0ADQAYQBiADYANgAxAGIAZQAyADcAMgBjADgAMQA5ADEANwAzADAAOQBhAGEAZgBjAGYAYwAyADkAOQAzAGEAZQA4ADgAYgBlAGYAYgBhADUAOQBmADUANAA3ADAANwA2ADQAMgBkADYAZgBmAGYANgA2ADcAYwAzADYAYQA2AGQAOAAyAGEAYwBkAGUAYQA4AGIAMgBmADUANQBjADkAMwBmADEAMQA4ADEANQA5ADUANABlADkAOQBhADkAYQA0ADkAYgBkADgANQA1ADcAYwBlADkAMgA1AGMAZAA0ADMANgBiAGIANQBkAGEANwBhAGMANwA5AGQANgA3ADAAZABmADQANAA2ADYAMQA5ADYAYwA5ADkAMQBiADEAMQA3AGQAOQA1ADMAMAAxADcANAA4AGMAMABkAGYAMQA1ADcAZQBlADQAYQAxADEAOAAzADIAOABhADQAMABmAGEANAA0AGIAZQBmAGQAYwBiAGYAMgAyAGEAMwA2ADkANQA5AGIANwBlADgAOQBhADIAYQA4ADcAZAAzADkAOAAxAGIAYQBmAGQAMwA1ADIANABhAGMAMAAwADgANQA5ADcAYQBmAGQANwBkAGMAYQA2ADYAYgBkAGUAOAA2ADgAYwBlAGYANgA2AGYANQBjAGEANgBhADcAZABmADEAYwAzADQANgA1ADIAZQA3ADYAYQBjAGEAMQBjADIAOQA5AGEAOAA2ADkAYwBmADIAZQA5ADUAZQBiAGQANwBjAGMANgBkAGEANwA5AGMAMAA0ADYANAA0ADAANgAzADAAOQA0ADQANAAwADEAYQA4AGYAMQAzAGQAYQBlADgAYgBkADEAMgBiADkAZgA3ADIANwA4ADAANwA4ADAAMgAyADEAMgBlADEAMgBjADAAMgA3ADcAOAAyADAANgA5AGMANgAzADgAZgBiAGUAYwBhADQANwBjAGIAOQA5AGMAYQBhADQAZgBmAGEAMQAyADgAYwBhAGIAOAA3ADYANgA4ADIAZABhADQANQAwADMANwA5AGYAYgA0ADQANAA0ADcAMgA0AGMAYgBhAGYAZQA4ADcAZABmAGEANQBlADMAOABmADUAMQA4ADEAMQAwADIAMQA1AGQAMgA3ADkANQBlADYAMQA0ADQAMgAwADgAOAAyADcANAAzADMANwA0ADUAZABkAGQAMwA3AGEAMwA2ADgAOQBiADYAOABiADkAZgBkAGQAZABjADQAMAA3AGYANwA2ADcANgA0ADMAYwA4ADQAMABlADgAZQAxADMAYwBmAGUAMQA0ADUAOAA1ADMANQAxAGEANQA5ADcAMgA2ADEAMAA2AGUAOABhADMAZgA2ADMAOAA0ADQAZQBjADYANABjADcAYwAyADAANABlADUAOQAwADcAZQA4ADcAMQBlADEANQA5ADgAZAA0ADMAMwA0ADgAOAAzADIAZABjAGUAMwA3ADEANAAwADcAYgBlADgANwA2ADEANwA5ADMAMgA3ADgAMAA2AGEAMgBlADUAYwBhADgAMgBhADcAOABkADAAMQAzAGYAZgA1ADQAMgBjAGIANgBiAGIANwBlADgAZABhADQAMAA3ADMAZABjAGYAOQAzAGYAMwAyADgAYwAxADIAZQA1AGIANwBiAGUAYQAwAGUAMQAzADAAMQA3ADUAOABhAGMANgBiADAAMwBiADAAMABhAGUAMQAxAGQANABjADQAOAA5ADYAMgA5ADAAZAA4ADgAZgBiADkAMgBlAGMAMABjAGYAYQAyAGEANgBkADMAYwA4ADcAOAAzADYAYwA3AGMANwBhADMAZAA3ADYAMQAyADkAYwA2AGMAOQA1ADUAYQA2AGEAOABkADMAOABiAGYAMwBmADMAMQA0AGQAOAAxADUAYwBhADQAYgBhADkAYgAyADkANgBkAGUAMQAzADAAMQA3ADUAYwA4AGUANABhAGIAMAAzADYAYQA1AGIAZgAxADcAOABjAGMAOAAzAGEAOQBmADIAZgBlAGEAOQBmADAAMABjADgAMQA3ADUANQA4ADEAYQA3ADYANgBkAGUANgA3ADMAZgBjAGEAOABkADcAYgAwAGQAOAA0ADMAMgBkADEAYQBkADgANAA5AGIAMQA2ADQAZAA2ADUAZgAxAGYAMwBjADAAMgBjADIAMgA1AGYAMQBmADAAMgBmADQAYgAzADgANwBlAGQAYQA5ADEAMgA3ADkAOQA2AGUAOQAzADUANAA1ADgAZgA2ADYANAAxADQANwA3ADkAMgBlADIAYwBiADIAYgBlADIAZgA0ADAAZgA2ADkAMAA5ADEANABjADcAZQBmADEANwA4AGEAMwBhADUAMgA4AGEAZgA0AGIANQBkADkANAAwADYAOAAzADgAMgBiADkAZABjADQAMQA0AGMAOAA0ADgAMgA2AGIAMAA4ADIAZgBiAGYAMAA1ADQAYgAyADAAOAA4AGQAMgAxAGQANQAxADcANgBiADkAMAAwAGEANABjADMAMgBmADkAZAA3ADYAMgA4ADUAYQAxADgAMgBjADAAZQBjADQAMAA2ADIANQA4ADQAZQA4AGIAMwAxADQAOABkADgAOAAyADgAMAA0AGMAYwAyAGQAZABiADkAYQA2AGMAYQA5ADYANgBmADMANwAzAGYANQBiADkAMAA4AGUAYwBhADQAYwA0AGEANABjADMAYgBjAGYAZAAyADUAMwBkADIANQA5AGUAMgBlADgAOABlADUANAAzADQAMwA5AGYAOQAxADcAZgBiADkAZgBjAGMAYwBjADUANgAyADQAZgA4ADYANwA5ADkAMwA2AGEANAA0ADMAOABhAGIANgA5AGEANwA5AGYANwAzADIANgAyADMAMAAzAGYAZQAxADAAZgBkADcAYwBlADIAOABhADgAMQBkADkAOAAyADMANQBhADUAZQA0AGIAMABlADEAMABhADcAYQBkAGUAZAA2ADYANgBkADUAYwA1AGUAZAA2ADAANwBiADcANABlADkAOQA0ADEAOAAxADkAZgAzADEAMgA1ADAANwA3ADQAMwA5ADkAMgA2ADIAZQAyADYAZAA4AGYANgBkADUAYQBiADMAMAA5ADgANwAzAGIAMgBiAGUAYgBmADIAYQA1AGQAZgA1ADEAZAA4ADgAOABmADQAMgBjAGIAYwAxAGQAMwA0ADkAYwA1ADAAMAAyAGEAZABiADgAZAAzADUAYQBmAGQANQA4ADAAYQBmAGYAZQBlADMANgBkADIAOQBmADAANwBmADIANAA1ADEAMAA5ADcAMABmAGQAZgA2ADYAYwA2ADQAMQAzADcAYQA2AGEAMQBmADMAZgBhAGIAZgAxADQANAAzADYANgA5AGYAOQAxAGYANQBjADMAYgAyAGUANgBkAGIAMQBmADkANwA2ADUAMgBlAGQAYQBmADUAZgA4ADEANgBjAGMANwBjAGMAZgAwAGIAMgA4ADkANwBlAGEAZgAyAGEAYgA3ADgAYQA2AGUAYwA2AGMAZAA5AGIANQA1AGMAMAAyAGUAYwA4AGMAYgAzAGIANwA5ADEANAA4ADYAMgBkADcAZAA5ADAAZQAyADMAZQAzADYANQAwADIAOAA1ADEAOAAyADEAMQBlADcANQA3ADEAMwBjADAANgA4ADgAYgBiAGYAYgBkADcAOQA2ADkAOABmADUAOQA5ADUAMAA2ADQAYwBiADEAZQA5ADgAZQAyAGEANAA4ADYAYQA2AGEAMQAyAGQANwBhADYAYQA4AGMAZQBhAGYAYQA1ADEANABkADgAZgA2ADgAYQAxADEAMgBmADMAOAA1ADEAZgBiAGYANwBhAGIAMwA3AGIAYwA4ADEAYQA3ADkAZQBiADYAZAA0AGQAYQAyAGUANQAxAGUAYQAyAGYAMgA3ADYAMwAzADIAZgBmADkAMQA2ADEAMAA4AGMAZQBiAGEANwA2AGEANQAyADAAOQA2ADAANwAwAGIANgBlADAANQBmADAAZgA1ADkAYgBiADAAMgAwAGEAZAA3AGYAZQA5ADQANgBiAGEAZgBhADgAZQA0AGYAMgBkADIAYgBlADAAYgBkAGQAZgAwADkAZABiAGEAOABiADMAMgBmAGUAOQBlADQAMwBlADUANwA3AGQANAA2AGYAYgBhADcAZAA5AGEAMgBhADMAMQAyADMAMgBhAGEAMgBjAGIAZQBlADIAOQA2AGEANgBlAGMANwAyAGEAZQA2AGYAOAA0ADEAMABlAGQANQA2AGUAOAA2AGYAOABmADgAZABhADMANwA4ADIAMwA5ADQAYwAzADMAYgA0AGYANQA1ADYAZQBkAGQAOQA3AGMANwBkAGUAOQAyAGIANgBjAGYANwAzADkAZABjADcAMwA0AGIAZQBjADMAMwBmADMAOQA5ADkAMAAyADcANQA1AGQAYwBjADgAOQBjADMANQBhAGUAZgBiADUAYQBhADAANgAxADUAYwBiAGIANAA5ADEAMwBlADUANgA2AGMANAA5ADYANQAyAGYAZAA3ADEAZABjADgANQBiAGQAYwAxADQAYgBmAGMAYgBiADUANABkAGIAZAAzAGEAZQA5ADMAYwBhADkANAAwAGQAZgBkADEAYgAzAGEANgBlADAANAAyAGMANAAzADAANQBkADUAYgBhAGEAYwAwADUANgBmADYAYgBlADAAMwAwADUAMgA0ADQAMwBhADcAZABjADgAZQBiADYAZQBhAGQAMQA5ADEAZQA4AGUAZAAwAGQANABhAGQAMAA1AGUAZQBmADMANABjADkAMwBhADQAMAA0ADkANgA5AGEANwA5ADIAMQA1AGQAZgA2ADkAOAAzADYAYwBiAGQAZgA2AGUAMwBhADMAMABhADgAYQBlAGUAZQAwADkAZgAxAGYAYQA2ADIANAA3ADkAYwBmADUANwAyAGUAMAA5ADIAMAA5ADcAZAAzADAAYwA2ADEANABlAGQANAAxAGIAZQBjAGIANgAwAGYAMwA4ADMAOQBhADYANgA0AGMAMwBjADEAMQA3AGQAYwAyADcANwBmAGIANgBhAGMAZAA3ADEANABmADEANQA3AGYAZgA5ADkAMwA1ADgANQBhADkANAA5ADAAMABhADgAZQAzADIAOAAzADUAZgA0ADMAMQA0ADMAZQA1ADQAMAA1AGUANQA5ADkAMwBhAGYAOQA3ADYANQBiADIAMAA5ADIANwBlADQAZAA4ADEAZQAzADgAZQA2AGQAZABjAGEANQBlAGMAZQBlAGMAZgA1AGQAOAA3AGYAZgAzAGUAZAA0ADUAOQA3AGYAMAA1ADQAYgA4ADYAZgA3AGQAOAA3ADIAYwBkADYAZgA5ADAANgA1ADEAZABhADcAYQBmAGEAMwAyADEANAA1ADQANwA1ADgAYQAzADEAOQBiAGMANwA5AGEANwA4ADUAOABmAGUAOAAyADgAMAA1ADMAMABiAGQANwBjADUAMgBlADAAYwA3ADUAMgA5AGUANgAwADMANgAwADgANAAzAGEAYgA4ADcAOAA0ADgANwBmADkAOQBmADcAZAA0AGQANwBhADEANgBlADcAZAAzAGUAMwA4ADAAOABlADQANwA2AGYAMAA4AGYAYwA1AGIAMABiAGYAZgBiAGIAYwA2AGIANwBhADkAYQBlADUANQAzADQAMgBmADkANwAyADYAYgAxADYAZABjADQAMgA4ADkAYgA0AGYAZQAzADIAOAAxAGYAYgAwAGMAZAA3AGMANgA0ADEAMgAyADYAMgA2ADgAOQAxADIANwA3ADIANQAwAGEAMwBiADgAYgA5ADEAMwBjADAAZgA1AGEAYgA3ADcAZQA1AGMAOAA1ADMAYQBmADUAOQA5AGQAOABkAGYAMAA4ADkAYQA4ADcAYwAxADYANQAzADAAOAA4AGQAYgA3AGYANQBlADgANABkADgAMgA0ADcAOQAyAGUAMgBhAGIAMAAzADYAMAA4ADkAOQBmAGIAMwAzADEANgBlADgAMABlADIAZgA0ADgAZQAxAGUAZABhAGMAZgBmADAAMgAwADEAMgA3AGYANQBiADQAMgA2ADUAMAAwAGQANwA3ADQANABhADEANwA5AGMANAAwAGIAZQA3ADkAOABmAGEANQBiAGQANAA5ADkAOQA5ADIAOABmAGYANwBkAGIAMQBlADYAYwBlADIAMwA1ADYAOAAwADYAYQA1ADQAOABmAGUAZAA5ADQAYgAyADEAYwBkAGQANgBkAGUAZgA4ADIAZgAxADYANgBiAGYAOAA1ADkAYQBkADUANgBiADQAOQA2ADIANQAyADEAMgBlADEANAA2AGYAMABmAGEANQA2ADIAYwBhAGQAMgBjAGYANQAwAGYANgA4ADcAYQA4ADUAMwBmADEANwA2ADMAYQA2ADUAZQBlADkAOQAwADAANwBjAGQAOABjADUAOQA5AGQAMgAzADMAZQBkADMAYQA0AGQAYQBkADMANAA3ADkAYQBjAGQAMwBjADMAMgAzAGEANABhADAAMwA2ADAAOABmAGEAMQBjADQANAA4AGQANgA0ADAAMwA0ADkAMgA2AGYAZgAyADYAZQAzADkAOQBiAGQAYQBmADMANgBjADQAZQBjADcAZAAyAGUAMwA4ADAAZABkADQAMwBkAGQANAA1ADAANgBmAGUAYQBjADcAZQBiADMAYgBjAGMAOAA2ADgANQAyADIAYwBmAGIAOQBmAGYAMQAxADMANQAxADgAYwAyAGUAMwA0ADUANgBlAGMAMAAzAGYAYwA1AGMAMAAzAGIAMwA2AGYANgBmADAAYgA1ADcANAAwADcANQBkADkAMAA3AGYAZABmAGIAOQA3AGIAMgA3ADAAZABmADYANwBkADgANgA4ADIAMgBjADYAZQA3ADUAMABjADMAOQBiADIAMgA3ADUANAA1ADQAYgBjADYAZQBhAGUAOABjADAAOAAwADYANwBlADgAZABiAGUAMAA4ADkAZgBhAGUAMwBlADEAYQA3AGIAYwA4ADcAOAAwAGUAOQA4ADMAZABmAGUAMQBiAGIANgBlAGEAYQAwAGQAOAA3AGIAOAA4ADQAYQAyADIAMwBkADEAMwBkADgAMwBkADIANQBhADIAZQBlAGMAOABhAGUAMgA2ADIANABjADkAOAAxADEAOAAzADIAYwAxAGEAMQBlADkAZAA5AGIAYwA4ADYAZABjAGIANAAzAGYAZgA0AGQANgBmADMAZAA1ADQAOAAxADQANgAwADYANQA2ADAAOQAwAGYANwA4AGUANQBhADEAYwA5ADIAYwA5ADkAYQAzAGQAYgAzADEAMAAyAGEAZABlAGYAMABjADkAOQA3AGIAYQA2ADIAOABmADAAMAA1ADYAZgA3ADUAMABiADgAYgAwAGQANwA5AGEAZgAxADcAOAA1ADkAMAA4AGIAZQAzADEAYwA0ADMAYQAzAGIAMgBkAGEAZgA5ADkAYQBlADgAMQBiAGQAZAA5AGIAZQA0ADUAMAA5ADAAMQAwADEANgA0ADAAZgBiADYANwBmAGIAYQA1AGYANwBhADkAMQAyADQAMgBmADkAMAA2ADQAMwAyAGEANwBkAGYAOAA2AGEANABjADgAMwAzAGYAZAAyADcAZQBjADUAMQA2ADkAZAA1ADYAMQBlAGMAYQBiAGMAZgA3ADIANAAyADEAOAA0AGQANQA1AGIAMwBkAGEAYgBkAGQAYwA4AGIAZQBjADYAOQBjADUAMgBhAGYANQAxADIANAAxADQANwA2AGUANwA2AGMANAA0AGEANwA5ADQAOAA4AGEAOQA1AGIANwA5ADAAOQA5ADEAYwBlADMAZQAxADkAZQAzAGYAOQA2AGYAZgBmADMAMgA0AGUAZQBlADYAMQBiADYAYwA4ADEAYQAxADYAZABjAGMAMwAxADEAMgBiADMANgBiAGIANAAyAGIAOABiADAAZABkAGUAOQA4ADAAYgAwADYAMgA3AGUAMQA2AGYAMgBjADMAYwAxADkAYgAwADEAYwBkAGUAZAA0ADkAZABmAGMANwBjAGQAYwBlAGEAOAA1AGQAMgBiADIAZQBlADAAMQA5ADgAZQAwADUAZABjADMAOQBmADUAZgA2ADIAMwA3ADAAMwA5AGEAOAAwAGEAZgBjADgAOABjAGMAYQA3AGUAOAA1AGUAZQBjADUAYgBkADkAMgBhADcANQBiAGEAYwAwADMAYwA5AGUAZgAyAGMAMAA2AGIAYwBlADQAZAA3AGQANABkAGEAYwBkADUANwA1AGQAMAA0AGYAZgAyAGYAZQA4ADIAYQAxADEAZQA2ADQANgA3ADQAOAA2AGEANwBhAGUAMAAyADUAMwA3ADUAZgBhADcANwBmADMAZAA4AGYAZAA4AGMAMgAxAGQANABkAGMAMwAyADEANgBlAGUAZABlADMAMQBlAGUAZQBjAGEANQAzAGUAMAA0ADMAMAAxADgAYgA2ADMAYQA4AGUAYQAzADMAYwAxADgAZQBiAGMAMwAzAGEANwAyADQAMgA2ADcAOQAzADUAYwBkAGEAOAAyAGUANQA2ADgAYQAwADgAMAA4ADAAZQA4AGUANgA0ADcANgA0AGEAMABiADcANgA5AGMAZgA1ADQAOABmADQAMQA4ADQAOQBjADgANQA5AGUAOQA2ADgANQBkADEANQAyADgAOQAxADEAMQA4ADEAZgAxADQAMQA0AGQANwAyADYANAA1ADEAMQA3ADYAZgBjADMANQA3ADIAMgAwADUAMgA4AGQAZAA1AGEAOAAzAGUAYwBmADMANwBiADQAMQA3ADMANwA0ADcAMgA3ADgAMgBlADQAOQA0ADQAYwAzADgAZQA3AGIAYwA4AGYAYgBiADcANAA0AGUAOQA1ADgAYgA1AGUAZgAxADIANgA1ADQAMgAyADkANQAzAGQAOAA3ADgAMAA3ADkAMwAwADQAMQA1AGYANwA4ADAAYQA2ADAANQA2AGIAZgBmADQANwA1ADUAYgBlADMAMgA4AGUAMwA2ADAAYQAyAGIAZgAwADcAYQA3AGMANwA5AGIAMQA0ADgAYgA2AGYAYwA1AGYAYQA1AGUAYwBkADgAZQA2AGEAMwA3ADYANgBiADgAOABiAGEAMgBjADMAMwBmADMAMQBhADQANgBkADgANAAyADUAYgA3ADgAOQAzADkAZgA5AGEANwAyADMAMQBhAGIAMwAzADEAMQAyADEAMgAxAGUAOAA5ADYAMgBlAGYANgA3ADkAYgBkADkAMAAzAGUAZgA2ADAAYQAzADcAOAAxAGEAYgA5ADIAMQAxAGYAZgBiADIAYQA5ADQAMQA1ADcANwBkAGQAYgBjADgAOABiADkAMgBmAGYAOQA4ADgAYQA1ADMAMQAyADkAYgAzADUAMQAyADgANgAxADUAOQBhADUANAAwADUAMABiAGQAZQA4AGUAOABhADYANgBhAGEANQBkADYANwAxADcANwAwADUAMQBmAGEAZgA3ADEANwAzADgAZQA1ADAAYgBlADIAZQBkADAAMQA5AGUAYQA2ADkAMgAwAGMAZgBlADkAZQBlADQAOAA4AGMAYgA2AGMAMgAwADgANgBhADIAMABlAGUANgBkAGMAMwAxADgAZABhADMAZAA5ADkAZABjADAANwA5ADcAYgAxADIAMQBmAGUAYgBiAGQAYwA0AGMANgAzAGIANgA1ADYAYgAzAGIAOABjADkANwBlAGUAYgBiAGUAYwAyADIAMAA1ADcAZgAzADIAYQAxADQAMgA4ADkANgBiAGYAOAA2ADIANgBjADgAZgBjADcAZAAxAGEAMwAzAGEAYgBkADcAMAAwADMANQA5ADkAZQA2AGEAOAA1ADQANwA2ADAAMwA5ADgANwBhADEAMgBiAGYANwAwADgAMABlADcAYQA2ADAAMgBmADcAMgA5ADIANQAyADkANAAzAGIAOAAyAGIANwAxAGUAMQAwAGQAOABlADQAYgAyAGQAMAA4AGYANwBkADIANABiAGEANwAyADcAOQAzADcAOQA1ADYAYQAwADMAMgBlADEAMgBkAGMAYgBmAGMAZABmAGEAYgBhADUANgA3ADgAMgBlADcAYwBkAGUAMwAwADcAZQBkAGIANgA2ADMAMQBmADcANgBlAGQANAA1ADgANgBlADMANQBjADEAMQBkADcANgBhAGUAMgAzADQAMwBjAGQAZQBlADcAOQBlADEAYQBhADcAZgA5AGUANwAxADgAZQAyAGQAYgBkADcAZgBjADMANAA0AGEAMQAzADYAOABhADIAZQBlADYAZQBiADgAMABhADMANgBhAGMAMwBjADUAMwA1ADQANABiADQANgAzADYANAA1AGYAMwBiADkANwAyAGYAMwBjADgAYgAxAGMAMgA5ADAAYQA4ADcAMwAxADcAYwA2AGMAOQA5ADQAOAA2AGQAZQAwAGMAOABhADcANAA0ADQAZAAzADMANQBkADIANgAwAGUAZQA5AGUANQAwADUANAAwADkAMQA3ADMAMwBlADIAYQA0ADUAMAAxADUAZQA5ADYAZABlADEANABmADMANgAyAGEAZgAzADAAMAAwADcAZAA3ADUAYwBiADQAYwAwADAANQA3ADkAMAAwAGYANQBjADgAMwAwAGMANAAwADQAOAA3ADIANQBhAGYANABkADkANwA0ADYANAA1AGQAOQA0AGYAMAA1AGEAZgA4AGEAMgAxAGQAYgBjAGIAMwAzAGYANgA3AGMAMQBmADEAMAA1ADMAZQAxADEANABiAGMANwBjADUAYgBhADEAYgAzADMAMwAwADEAOQAyAGEANQAzAGIAMwBiADIAMgAwAGIANgAyADMAYwAzAGUAMQBkAGEAOQBiADIANgAyAGYAZAAzAGEANAA2ADEAOAA1AGIAZgAzADkAMQA1ADYAYgA2ADUANQBiADQAMABiAGQAMAA1AGUAZQBkADEAOQAzAGUANQBlADYANQA5ADMAMgAxAGUAMwA2ADAAMQBiAGYAMAA1ADQAYgBiAGUAYgBlAGQAZQA2ADYAMgBhADAAMAA4AGYAZQA3AGUAZgAzADIANABkADIAMwA2AGEAZABjAGUAZgAwAGUAOQA1ADgAZgAxAGEAYQBhADkAZQAyAGEAMwA5ADgAMwA0AGUA
#>


#endregion