Internal/Helper/Format-MarkdownTableTableStyle.ps1
<#
.SYNOPSIS Formats the output as a Format-Table style markdown table. .DESCRIPTION The Format-MarkdownTableTableStyle cmdlet formats the output of a command as a Format-Table style markdown table which each property is displayed on a separate row. Markdown text will be copied to the clipboard. .PARAMETER InputObject Specifies the objects to be formatted. Enter a variable that contains the objects or type a command or expression that gets the objects. .PARAMETER HideStandardOutput Indicates that the cmdlet hides the standard Format-Table style output. .PARAMETER ShowMarkdown Indicates that the cmdlet outputs the markdown text to the console. .PARAMETER DoNotCopyToClipboard Indicates the the cmdlet does not copy the markdown text to the clipboard. .PARAMETER Property Specifies the object properties that appear in the display and the order in which they appear. Wildcards are permitted. If you omit this parameter, the properties that appear in the display depend on the object being displayed. The parameter name "Property" is optional. .EXAMPLE Get-Process notepad | Format-MarkdownTableTableStyle .EXAMPLE Get-Process notepad | fmt Name,Path .NOTES You can also refer to Format-MarkdownTableTableStyle by its built-in alias, FMT. # Copyright (c) Microsoft Corporation. # Licensed under the MIT license. See LICENSE file in the project root for full license information. # https://github.com/microsoft/FormatPowerShellToMarkdownTable #> function Format-MarkdownTableTableStyle { [CmdletBinding()] [Alias("fmt")] param ( [Parameter(Mandatory = $true, ValueFromPipeline = $true)] [object] $InputObject, [Parameter(Mandatory = $false, ValueFromPipeline = $false)] [switch] $HideStandardOutput, [Parameter(Mandatory = $false, ValueFromPipeline = $false)] [switch] $ShowMarkdown, [Parameter(Mandatory = $false, ValueFromPipeline = $false)] [switch] $DoNotCopyToClipboard, [Parameter(Mandatory = $false, Position = 0, ValueFromPipeline = $false)] [string[]] $Property = @() ) Begin { ## Internal Function function UseAllProperty([object]$InputObject) { try { if ($null -eq $InputObject) { return $true } $DataType = ($InputObject | Get-Member)[0].TypeName if ($DataType.StartsWith("Selected.")) { return $true } elseif ($DataType.StartsWith("Deserialized.")) { $DataType = $DataType.Remove(0, 13) } $FormatData = Get-FormatData -TypeName $DataType -ErrorAction SilentlyContinue if ($null -eq $FormatData) { return $true } return $false } catch { return $true } } if ($null -ne $InputObject -and $InputObject.GetType().BaseType -eq [System.Array]) { Write-Error "InputObject must not be System.Array. Don't use InputObject, but use the pipeline to pass the array object." $NeedToReturn = $true return } $LastCommandLine = (Get-PSCallStack)[1].Position.Text $Result = "" $HeadersForFormatTableStyle = New-Object System.Collections.Generic.List[string] $ContentsForFormatTableStyle = New-Object System.Collections.Generic.List[object] $TempOutputList = New-Object System.Collections.Generic.List[object] } Process { if ($NeedToReturn) { return } $CurrentObject = $null if ($_ -eq $null) { $CurrentObject = $InputObject } else { $CurrentObject = $_ } if ($CurrentObject.GetType().Name.ToLower() -eq "string") { # CurrentObject is a simple String object $Props = @("") } elseif (($Property.Length -eq 0) -or ($Property.Length -eq 1 -and $Property[0] -eq "")) { if (UseAllProperty($CurrentObject)) { $Property = @("*") $CurrentObject = $CurrentObject | Select-Object -Property $Property $Props = $CurrentObject | Get-Member -Name $Property -MemberType Property, NoteProperty } else { $DataType = ($CurrentObject | Get-Member)[0].TypeName if ($DataType.StartsWith("Deserialized.")) { $DataType = $DataType.Remove(0, 13) } $FormatData = Get-FormatData -TypeName $DataType -ErrorAction SilentlyContinue $TempPSObject = New-Object PSCustomObject $TempHeaderList = New-Object System.Collections.Generic.List[string] if ($FormatData.FormatViewDefinition.Control.Headers) { for ($i = 0; $i -lt $FormatData.FormatViewDefinition.Control.Headers.Count; $i++) { $HeaderName = $FormatData.FormatViewDefinition.Control.Headers[$i].Label if ($null -eq $HeaderName -or $HeaderName -eq "") { $HeaderName = $FormatData.FormatViewDefinition.Control.Rows.Columns[$i].DisplayEntry.Value } $TempSelectedObject = $null if ($FormatData.FormatViewDefinition.Control.Rows.Columns[$i].DisplayEntry.ValueType -eq "ScriptBlock") { $TempSelectedObject = $CurrentObject | Select-Object @{ n = $HeaderName; e = ([scriptblock]::Create($FormatData.FormatViewDefinition.Control.Rows.Columns[$i].DisplayEntry.Value)) } } else { $PropertyName = $FormatData.FormatViewDefinition.Control.Rows.Columns[$i].DisplayEntry.Value $TempSelectedObject = $CurrentObject | Select-Object @{ n = $HeaderName; e = {$_.$($PropertyName)} } } $Value = $TempSelectedObject.$($HeaderName) $TempPSObject | Add-Member -MemberType NoteProperty $HeaderName -Value $Value $TempHeaderList.Add($HeaderName) } } else { for ($i = 0; $i -lt $FormatData.FormatViewDefinition.Control.Entries.Items.Count; $i++) { $HeaderName = $FormatData.FormatViewDefinition.Control.Entries.Items[$i].DisplayEntry.Value $TempSelectedObject = $null $TempSelectedObject = $CurrentObject | Select-Object @{ n = $HeaderName; e = {$_.$($HeaderName)} } $Value = $TempSelectedObject.$($HeaderName) $TempPSObject | Add-Member -MemberType NoteProperty $HeaderName -Value $Value $TempHeaderList.Add($HeaderName) } } $CurrentObject = $TempPSObject | Select-Object -Property $TempHeaderList $Props = $CurrentObject | Get-Member -Name $TempHeaderList -MemberType Property, NoteProperty } } else { $CurrentObject = $CurrentObject | Select-Object -Property $Property -ErrorAction SilentlyContinue $Props = $CurrentObject | Get-Member -Name $Property -MemberType Property, NoteProperty } foreach ($Prop in $Props) { if ($HeadersForFormatTableStyle.Contains($Prop.Name) -eq $false) { $HeadersForFormatTableStyle.Add($Prop.Name) } } $ContentsForFormatTableStyle.Add($CurrentObject) } End { if ($NeedToReturn) { return } $HeaderRow = "|" $SeparatorRow = "|" $ContentRow = "" foreach ($Prop in $HeadersForFormatTableStyle) { $HeaderRow += "$(Invoke-EscapeMarkdown($Prop))|" $SeparatorRow += ":--|" } foreach ($Content in $ContentsForFormatTableStyle) { $TempOutput = New-Object PSCustomObject $ContentRow += "|" if ($HeadersForFormatTableStyle.Count -eq "1" -and $HeadersForFormatTableStyle[0] -eq "") { # Content is an array of simple data type, like String. $ContentRow += "$(Invoke-EscapeMarkdown($Content))|" $TempOutput = $null $TempOutput = $Content } else { foreach ($Prop in $HeadersForFormatTableStyle) { $ContentRow += "$(Invoke-EscapeMarkdown($Content.($($Prop))))|" $TempOutput | Add-Member -MemberType NoteProperty $Prop -Value $Content.($($Prop)) } } $ContentRow += "`r`n" $TempOutputList.Add($TempOutput) } $Result = $HeaderRow + "`r`n" + $SeparatorRow + "`r`n" + $ContentRow $ResultForConsole = $Result $Result = "**" + (Invoke-EscapeMarkdown($LastCommandLine)) + "**`r`n`r`n" + $Result if ($HideStandardOutput.IsPresent -eq $false) { $TempOutputList | Format-Table * -AutoSize } if ($ShowMarkdown.IsPresent) { Write-Output $ResultForConsole } if ($DoNotCopyToClipboard.IsPresent -eq $false) { Set-Clipboard $Result Write-Warning "Markdown text has been copied to the clipboard." } } } # SIG # Begin signature block # MIIjYwYJKoZIhvcNAQcCoIIjVDCCI1ACAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUZ5600033m6i5Ar5reOiLSI9W # xiGggh2BMIIFMDCCBBigAwIBAgIQBAkYG1/Vu2Z1U0O1b5VQCDANBgkqhkiG9w0B # AQsFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD # VQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVk # IElEIFJvb3QgQ0EwHhcNMTMxMDIyMTIwMDAwWhcNMjgxMDIyMTIwMDAwWjByMQsw # CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu # ZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFzc3VyZWQgSUQg # Q29kZSBTaWduaW5nIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA # +NOzHH8OEa9ndwfTCzFJGc/Q+0WZsTrbRPV/5aid2zLXcep2nQUut4/6kkPApfmJ # 1DcZ17aq8JyGpdglrA55KDp+6dFn08b7KSfH03sjlOSRI5aQd4L5oYQjZhJUM1B0 # sSgmuyRpwsJS8hRniolF1C2ho+mILCCVrhxKhwjfDPXiTWAYvqrEsq5wMWYzcT6s # cKKrzn/pfMuSoeU7MRzP6vIK5Fe7SrXpdOYr/mzLfnQ5Ng2Q7+S1TqSp6moKq4Tz # rGdOtcT3jNEgJSPrCGQ+UpbB8g8S9MWOD8Gi6CxR93O8vYWxYoNzQYIH5DiLanMg # 0A9kczyen6Yzqf0Z3yWT0QIDAQABo4IBzTCCAckwEgYDVR0TAQH/BAgwBgEB/wIB # ADAOBgNVHQ8BAf8EBAMCAYYwEwYDVR0lBAwwCgYIKwYBBQUHAwMweQYIKwYBBQUH # AQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQwYI # KwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFz # c3VyZWRJRFJvb3RDQS5jcnQwgYEGA1UdHwR6MHgwOqA4oDaGNGh0dHA6Ly9jcmw0 # LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwOqA4oDaG # NGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RD # QS5jcmwwTwYDVR0gBEgwRjA4BgpghkgBhv1sAAIEMCowKAYIKwYBBQUHAgEWHGh0 # dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCgYIYIZIAYb9bAMwHQYDVR0OBBYE # FFrEuXsqCqOl6nEDwGD5LfZldQ5YMB8GA1UdIwQYMBaAFEXroq/0ksuCMS1Ri6en # IZ3zbcgPMA0GCSqGSIb3DQEBCwUAA4IBAQA+7A1aJLPzItEVyCx8JSl2qB1dHC06 # GsTvMGHXfgtg/cM9D8Svi/3vKt8gVTew4fbRknUPUbRupY5a4l4kgU4QpO4/cY5j # DhNLrddfRHnzNhQGivecRk5c/5CxGwcOkRX7uq+1UcKNJK4kxscnKqEpKBo6cSgC # PC6Ro8AlEeKcFEehemhor5unXCBc2XGxDI+7qPjFEmifz0DLQESlE/DmZAwlCEIy # sjaKJAL+L3J+HNdJRZboWR3p+nRka7LrZkPas7CM1ekN3fYBIM6ZMWM9CBoYs4Gb # T8aTEAb8B4H6i9r5gkn3Ym6hU/oSlBiFLpKR6mhsRDKyZqHnGKSaZFHvMIIFQjCC # BCqgAwIBAgIQA/0ggFQEDhseOlG0BHuf0TANBgkqhkiG9w0BAQsFADByMQswCQYD # VQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGln # aWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFzc3VyZWQgSUQgQ29k # ZSBTaWduaW5nIENBMB4XDTIwMTExNzAwMDAwMFoXDTIzMTEyMTIzNTk1OVowfzEL # MAkGA1UEBhMCQ0gxEjAQBgNVBAgTCVNvbG90aHVybjERMA8GA1UEBwwIRMOkbmlr # ZW4xFjAUBgNVBAoTDWJhc2VWSVNJT04gQUcxGTAXBgNVBAsTEEludGVybmFsIFNj # cmlwdHMxFjAUBgNVBAMTDWJhc2VWSVNJT04gQUcwggEiMA0GCSqGSIb3DQEBAQUA # A4IBDwAwggEKAoIBAQDqZTpY3kwE9qEek50BKNM79X1Wkc5gOBynXJHmUBReFEzO # 1pLqHwxFfvuvRl0fiyJKuTPLuIyszMoXtD7RWDKR9N/3u6LgtUhm/izh2u0UncDZ # 4bouw36VnD17Xn3Ox07SRzBp9UVinpN69t2t1S/PNMlNLSHDnFA6tPp4X9jHETL0 # 1q3nkduweYOAjBmShGwA3+MdWTUrW8bpDiQRH80xwJKBNtBjpyr7kIDDal+8Ai9A # /zwez6IA1lOJI5E4pqSPmzJOrz1kxNbxBl5OEG/2J+LulY221Oa3m68BPRa+0KMG # 89wyK/WLpa3t2mgpZnG8EUdbQYah1H2TOjSgp295AgMBAAGjggHFMIIBwTAfBgNV # HSMEGDAWgBRaxLl7KgqjpepxA8Bg+S32ZXUOWDAdBgNVHQ4EFgQUgO/Fbqz1/e4B # i63rBg2M3Uehu6AwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMD # MHcGA1UdHwRwMG4wNaAzoDGGL2h0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9zaGEy # LWFzc3VyZWQtY3MtZzEuY3JsMDWgM6Axhi9odHRwOi8vY3JsNC5kaWdpY2VydC5j # b20vc2hhMi1hc3N1cmVkLWNzLWcxLmNybDBMBgNVHSAERTBDMDcGCWCGSAGG/WwD # ATAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BTMAgG # BmeBDAEEATCBhAYIKwYBBQUHAQEEeDB2MCQGCCsGAQUFBzABhhhodHRwOi8vb2Nz # cC5kaWdpY2VydC5jb20wTgYIKwYBBQUHMAKGQmh0dHA6Ly9jYWNlcnRzLmRpZ2lj # ZXJ0LmNvbS9EaWdpQ2VydFNIQTJBc3N1cmVkSURDb2RlU2lnbmluZ0NBLmNydDAM # BgNVHRMBAf8EAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCSEe3CT6FTD/U/1eFY+b6h # dh3i/CS/1+c9tY55Ygkb95H6EtyODxelck1giAEJDAC7Aqqlnm3KQSwDmJoJHvD0 # Y49h2SML4AmFZGJxsfcRRIdNiijDKbjexA0cGBA09uvh6JD3Y/BbNYf6Va+YbtAE # 7V8kdRbIewwxD8NcKXggCrS28wzLsNNF8BgsgPQXhiYp1WMvS8oPm5c5kyOwNoxm # wh5EJ1/07xuPUovgfwOWUKTpChu/aiqFCXRrSLY43CJlB9KrcP02PUC1kJXBl469 # j+De4PpS2ySLbiHL3CGB0mhADeTTt3a1EE4hbYJfosA5D57fllEHJdkq/yfckcsN # 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/DCCBsAwggSooAMCAQICEAxNaXJLlPo8Kko9KQeA # PVowDQYJKoZIhvcNAQELBQAwYzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lD # ZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQwOTYg # U0hBMjU2IFRpbWVTdGFtcGluZyBDQTAeFw0yMjA5MjEwMDAwMDBaFw0zMzExMjEy # MzU5NTlaMEYxCzAJBgNVBAYTAlVTMREwDwYDVQQKEwhEaWdpQ2VydDEkMCIGA1UE # AxMbRGlnaUNlcnQgVGltZXN0YW1wIDIwMjIgLSAyMIICIjANBgkqhkiG9w0BAQEF # AAOCAg8AMIICCgKCAgEAz+ylJjrGqfJru43BDZrboegUhXQzGias0BxVHh42bbyS # VQxh9J0Jdz0Vlggva2Sk/QaDFteRkjgcMQKW+3KxlzpVrzPsYYrppijbkGNcvYlT # 4DotjIdCriak5Lt4eLl6FuFWxsC6ZFO7KhbnUEi7iGkMiMbxvuAvfTuxylONQIMe # 58tySSgeTIAehVbnhe3yYbyqOgd99qtu5Wbd4lz1L+2N1E2VhGjjgMtqedHSEJFG # Kes+JvK0jM1MuWbIu6pQOA3ljJRdGVq/9XtAbm8WqJqclUeGhXk+DF5mjBoKJL6c # qtKctvdPbnjEKD+jHA9QBje6CNk1prUe2nhYHTno+EyREJZ+TeHdwq2lfvgtGx/s # K0YYoxn2Off1wU9xLokDEaJLu5i/+k/kezbvBkTkVf826uV8MefzwlLE5hZ7Wn6l # JXPbwGqZIS1j5Vn1TS+QHye30qsU5Thmh1EIa/tTQznQZPpWz+D0CuYUbWR4u5j9 # lMNzIfMvwi4g14Gs0/EH1OG92V1LbjGUKYvmQaRllMBY5eUuKZCmt2Fk+tkgbBhR # YLqmgQ8JJVPxvzvpqwcOagc5YhnJ1oV/E9mNec9ixezhe7nMZxMHmsF47caIyLBu # MnnHC1mDjcbu9Sx8e47LZInxscS451NeX1XSfRkpWQNO+l3qRXMchH7XzuLUOncC # AwEAAaOCAYswggGHMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMBYGA1Ud # JQEB/wQMMAoGCCsGAQUFBwMIMCAGA1UdIAQZMBcwCAYGZ4EMAQQCMAsGCWCGSAGG # /WwHATAfBgNVHSMEGDAWgBS6FtltTYUvcyl2mi91jGogj57IbzAdBgNVHQ4EFgQU # Yore0GH8jzEU7ZcLzT0qlBTfUpwwWgYDVR0fBFMwUTBPoE2gS4ZJaHR0cDovL2Ny # bDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0UlNBNDA5NlNIQTI1NlRp # bWVTdGFtcGluZ0NBLmNybDCBkAYIKwYBBQUHAQEEgYMwgYAwJAYIKwYBBQUHMAGG # GGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBYBggrBgEFBQcwAoZMaHR0cDovL2Nh # Y2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0UlNBNDA5NlNIQTI1 # NlRpbWVTdGFtcGluZ0NBLmNydDANBgkqhkiG9w0BAQsFAAOCAgEAVaoqGvNG83hX # NzD8deNP1oUj8fz5lTmbJeb3coqYw3fUZPwV+zbCSVEseIhjVQlGOQD8adTKmyn7 # oz/AyQCbEx2wmIncePLNfIXNU52vYuJhZqMUKkWHSphCK1D8G7WeCDAJ+uQt1wmJ # efkJ5ojOfRu4aqKbwVNgCeijuJ3XrR8cuOyYQfD2DoD75P/fnRCn6wC6X0qPGjpS # tOq/CUkVNTZZmg9U0rIbf35eCa12VIp0bcrSBWcrduv/mLImlTgZiEQU5QpZomvn # Ij5EIdI/HMCb7XxIstiSDJFPPGaUr10CU+ue4p7k0x+GAWScAMLpWnR1DT3heYi/ # HAGXyRkjgNc2Wl+WFrFjDMZGQDvOXTXUWT5Dmhiuw8nLw/ubE19qtcfg8wXDWd8n # YiveQclTuf80EGf2JjKYe/5cQpSBlIKdrAqLxksVStOYkEVgM4DgI974A6T2RUfl # zrgDQkfoQTZxd639ouiXdE4u2h4djFrIHprVwvDGIqhPm73YHJpRxC+a9l+nJ5e6 # li6FV8Bg53hWf2rvwpWaSxECyIKcyRoFfLpxtU56mWz06J7UWpjIn7+NuxhcQ/XQ # KujiYu54BNu90ftbCqhwfvCXhHjjCANdRyxjqCU4lwHSPzra5eX25pvcfizM/xdM # TQCi2NYBDriL7ubgclWJLCcZYfZ3AYwxggVMMIIFSAIBATCBhjByMQswCQYDVQQG # EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl # cnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFzc3VyZWQgSUQgQ29kZSBT # aWduaW5nIENBAhAD/SCAVAQOGx46UbQEe5/RMAkGBSsOAwIaBQCgeDAYBgorBgEE # AYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwG # CisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMCMGCSqGSIb3DQEJBDEWBBQrzYyU # 4jn7S/y2PGFh4FlqJWNoiDANBgkqhkiG9w0BAQEFAASCAQBc+Z5Aq5FiemyEnf+G # 3DzArf0ldC0DepqvVFjDyvNzZ1/tG2KpdvNQVd3kuCfhym+Q+nSj6vZdTdnbxipS # 7dXlPyTUcIrCqKXyTTV6fYRaojjGwjnaugIZ3V8AIfoEJnkFdWi9m47lgSe7ELS9 # VmDy90cHT2JPZvJ/dEOocVufy6ZkofAWvQAmG9iPneE776F3CvLoeMN/z60iSu+f # R/HT5a8N+Kh86QeqOp3EuFZ9WXXqA/RaepTOUM9MbLWAbvdCr8gSE+jxl5qcfRlr # +0stsHCI7EHJQ1gm/8WgVWy8Lwhm6U7c6UFb/Whw5MeGWPq0N6LBv/fyiT3Qm4Tk # ++KToYIDIDCCAxwGCSqGSIb3DQEJBjGCAw0wggMJAgEBMHcwYzELMAkGA1UEBhMC # VVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2VydCBU # cnVzdGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRpbWVTdGFtcGluZyBDQQIQDE1pckuU # +jwqSj0pB4A9WjANBglghkgBZQMEAgEFAKBpMBgGCSqGSIb3DQEJAzELBgkqhkiG # 9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTIzMDcyMjE4NDUwN1owLwYJKoZIhvcNAQkE # MSIEIFBLi8wN3GEf0GoUyp0i3tf6U8KMDIl1iJJ0v2h+0oS8MA0GCSqGSIb3DQEB # AQUABIICAJYFhr+FJpWhlD6QF++fjfaSUG4SF4XUGDzjdi3liWsll3PURNvNAfhD # EfQyVih8vyMGKOQo0ObCzNNl3bwo755x9zl7DFBuXnFSzgKrkNviWMTQRTPgg+ZH # dpD9DyoFWwQ+gwYy7npOWQK1k9mY4o02wDW9k705y/hPyOtgTYk3nVAQ29Sca8S2 # XAjZodoB1x46FA0iG17aXhdrpQ8dFjxC0YV+WmqKyjJgsykxJ/ySVIJKOuHuRk+s # Hnq5OBn7PlTShjhSaK6M4mkqIC3e39Wq6nwq5Rc2/xEaZZtly+KYuNFhYjCXBtFQ # toTo0B3nPlx/ujUNEzDPeEn+7YYyPJlzkKMndhqa2tbi22r6w/JBAb5fkCBWwQzH # 4VCXb34CeBKy5x9TvSq2BJ97AY67NBjjAk3jnAMCqft+umP+aawWyC1tUlnw1Fma # srVCmQ2dQF3r9/ggH6x+G80wC8UwEyGjhhzFExTaceui+m4OMp4dTMZiwE4+BN8S # dgHL+0hcvIcUXYvoWBi3M5LyCYli8cfpbyUng0hJo38YuCGM58YZJpDP08hgSEY7 # LdhS0Ekqs18Icv1m/EP2YRabXlKFXfhMU1vKaFDLpMYk3FZCX/w53a/3yXWw71Bp # fmR8xTUcfXBqOBcQEduoxcjQPXo4OHKEneBsoRZVD7qTwt7/HCwl # SIG # End signature block |