public/New-AppVentiXPublishingTask.ps1
<#
.SYNOPSIS Creates a new AppVentiX publishing task. .DESCRIPTION The New-AppVentiXPublishingTask function creates a new publishing task for AppVentiX. It allows you to specify various parameters such as the type of package, machine group, priority, name, version, group, path, and more. The function also checks if the package exists and if AppVentiX is licensed before creating the publishing task. .PARAMETER Type Specifies the type of package. Valid values are 'MSIX', 'APPV', and 'Sharedcontainer'. .PARAMETER MachineGroupFriendlyname Specifies the friendly name of the machine group. .PARAMETER Priority Specifies the priority of the publishing task. Default value is 100. .PARAMETER Group Specifies the group of the publishing task. Example: 'contoso.com\group1' .PARAMETER Path Specifies the path to the package file. .PARAMETER AlwaysPublish Indicates whether the package should always be published. .PARAMETER WhenNotExist Specifies the action to take when the package does not exist. Valid values are 'Add' and 'Skip'. .PARAMETER DynamicUserConfigurationPath Specifies the path to the dynamic user configuration file. .PARAMETER ReturnPublishCommand Indicates whether to return the publish command. .PARAMETER AutoLaunch Indicates whether to autolaunch the package. .PARAMETER ConfigShare Specifies the path to the AppVentiX configuration share. You can ommit this parameter if Set-AppVentiXConfigShare has been called. .EXAMPLE New-AppVentiXPublishingTask -Type 'MSIX' -MachineGroupFriendlyname 'Group1' -Priority 50 -Group 'Group1' -Path 'C:\Packages\Package1.msix' Creates a new publishing task with the specified parameters, returns the ID of the new task. .EXAMPLE New-AppVentiXPublishingTask -Type 'APPV' -MachineGroupFriendlyname 'Group1' -Priority 100 -Group 'Group1' -Path 'C:\Packages\Package1.appattach' Creates a new publishing task with the specified parameters, returns the ID of the new task. .EXAMPLE $params = @{ Type = 'MSIX' MachineGroupFriendlyname = 'Group1' Priority = 50 Group = 'Group1' Path = 'C:\Packages\Package1.msix' } $newTask = New-AppVentiXPublishingTask @params Creates a new publishing task with the specified parameters, returns the ID of the new task. We can use the output to publish the task. .NOTES Function : New-AppVentiXPublishingTask Author : John Billekens Consultancy Copyright: Copyright (c) AppVentiX Version : 1.6 Requires : Valid AppVentiX license #> function New-AppVentiXPublishingTask { [CmdletBinding(DefaultParameterSetName = 'AutoLaunch', SupportsShouldProcess, ConfirmImpact = 'Low')] Param( [Parameter(ParameterSetName = 'PublishSeamless')] [Parameter(ParameterSetName = 'AutoLaunch')] [String]$MachineGroupFriendlyname = 'All Machine Groups', [Parameter(ParameterSetName = 'PublishSeamless')] [Parameter(ParameterSetName = 'AutoLaunch')] [int]$Priority = 100, [Parameter(ParameterSetName = 'PublishSeamless', Mandatory)] [Parameter(ParameterSetName = 'AutoLaunch', Mandatory)] [ValidatePattern('^.*\.*$')] [String]$Group, [Parameter(ParameterSetName = 'PublishSeamless', Mandatory)] [Parameter(ParameterSetName = 'AutoLaunch', Mandatory)] [System.IO.FileInfo]$Path, [Parameter(ParameterSetName = 'PublishSeamless')] [Parameter(ParameterSetName = 'AutoLaunch')] [Switch]$AlwaysPublish, [Parameter(ParameterSetName = 'PublishSeamless')] [Parameter(ParameterSetName = 'AutoLaunch')] [ValidateSet('Add', 'Skip')] [String]$WhenNotExist = "Add", [Parameter(ParameterSetName = 'AutoLaunch')] [Switch]$AutoLaunch, [Parameter(ParameterSetName = 'PublishSeamless')] [Parameter(ParameterSetName = 'AutoLaunch')] [String]$DynamicUserConfigurationPath, [Parameter(ParameterSetName = 'PublishSeamless')] [Switch]$ReturnPublishCommand, [Parameter(DontShow, ParameterSetName = 'PublishSeamless')] [Parameter(DontShow, ParameterSetName = 'AutoLaunch')] [ValidateNotNullOrEmpty()] [String]$ConfigShare = $Script:AppVentix.ConfigShare ) if (Test-AppVentiXIsLicensed -ConfigShare $ConfigShare) { if (-Not ($Path.Exists)) { Throw [System.Management.Automation.ItemNotFoundException] "Package not found: `"$Path`"" } $isAppAttach = $false if ($Path -like "*.appattach") { $isAppAttach = $true $Type = 'MSIX' Write-Verbose "The publishing task is an AppAttach task." } elseif ($Path -like "*.msix") { $Type = 'MSIX' Write-Verbose "The publishing task is an MSIX task." } elseif ($Path -like "*.appv") { $Type = 'APPV' Write-Verbose "The publishing task is an APPV task." } elseif ($Path -like "*.msixbundle") { $Type = 'Sharedcontainer' Write-Verbose "The publishing task is a Sharedcontainer task." } else { Throw "The file type of `"$Path`" is not supported! Must be .appv, .msix, .msixbundle or .appattach" } if ($Type -ieq 'APPV' -and $isAppAttach) { Throw "The type 'APPV' is not valid for an AppAttach file! AppAttach files are always of type 'MSIX'" } $publishingTasksFullname = Join-Path -Path $ConfigShare -ChildPath $Script:AppVentiX.PublishingTasksFilename Write-Verbose "Reading data from $($publishingTasksFullname)" $publishingTasksXml = New-Object -TypeName System.Xml.XmlDocument try { $publishingTasksXml.Load($publishingTasksFullname) } catch { Write-Verbose "Could not load the Publishing Tasks file, $($_.Exception.Message)" if (Test-Path -Path $publishingTasksFullname) { Write-Warning "The Publishing Tasks file exists but is not accessible!" Throw "The Publishing Tasks file exists but is not accessible!" } else { Write-Warning "The Publishing Tasks file does not yet exists, creating a new file!" } } $publishingTasksXml = Format-AppVentiXPublishingTasksXml -XmlDocument $publishingTasksXml Write-Verbose "Checking the machine group `"$MachineGroupFriendlyname`"" if (([String]::IsNullOrEmpty($MachineGroupFriendlyname)) -or ($MachineGroupFriendlyname -like 'All Machine Groups')) { $MachineGroupFriendlyname = 'All Machine Groups' $machineGroup = 'All' } else { try { $machineGroupData = Get-AppVentiXMachineGroup -Name $MachineGroupFriendlyname -ConfigShare $ConfigShare if ($null -eq $machineGroupData.FriendlyName -or $machineGroupData.FriendlyName -notlike $MachineGroupFriendlyname) { Throw "Machine group `"$MachineGroupFriendlyname`" not found!" } } catch { Write-Error $_ Throw "Machine group `"$MachineGroupFriendlyname`" not found!" } $MachineGroupFriendlyname = $machineGroupData.FriendlyName $machineGroup = $machineGroupData.GroupName } $Action = 'Publish' Write-Verbose "Generating a new GUID for the task" $Id = [GUID]::NewGuid() if ($ReturnPublishCommand) { $output = [PSCustomObject]@{ Id = $Id AppsToPublish = @() } } else { $output = [PSCustomObject]@{ Id = $Id } } if ($Group -notlike '*\*') { Write-Warning "The parameter -Group should contain the domain name and the groupname, e.g. `"DOMAIN.LOCAL\GROUP`"" Write-Warning "Falling back on default (user dns) value: `"$($env:USERDOMAIN)\$Group`"" $Group = "$($env:USERDOMAIN)\$Group" } $packageDetails = Get-ManifestDetail -Filename $Path if ($packageDetails.Type -like 'APPV') { Write-Verbose "Package type is APPV" $name = $packageDetails.DisplayName if ([String]::IsNullOrEmpty($DynamicUserConfigurationPath)) { $DynamicUserConfigurationPath = 'None' } } else { Write-Verbose "Package type is MSIX" $Name = $packageDetails.Name if (-Not [String]::IsNullOrEmpty($DynamicUserConfigurationPath)) { Write-Warning "The parameter -DynamicUserConfigurationPath is not used for MSIX files, ignoring the parameter" $DynamicUserConfigurationPath = $null } } $Version = $packageDetails.Version $PackageFullName = $packageDetails.PackageFullName Write-Verbose "Creating a new task element in the XML file" $ptUserPackagesElement = $publishingTasksXml.SelectSingleNode("//UserPublishingTasks/Packages") $ptTaskElement = $ptUserPackagesElement.AppendChild($publishingTasksXml.CreateElement("Task")) $null = $($ptTaskElement.AppendChild($publishingTasksXml.CreateElement("Type"))).AppendChild($publishingTasksXml.CreateTextNode($Type)) $null = $($ptTaskElement.AppendChild($publishingTasksXml.CreateElement("MachineGroup"))).AppendChild($publishingTasksXml.CreateTextNode($machineGroup)) $null = $($ptTaskElement.AppendChild($publishingTasksXml.CreateElement("MachineGroupFriendlyname"))).AppendChild($publishingTasksXml.CreateTextNode($MachineGroupFriendlyname)) $null = $($ptTaskElement.AppendChild($publishingTasksXml.CreateElement("Priority"))).AppendChild($publishingTasksXml.CreateTextNode($Priority)) $null = $($ptTaskElement.AppendChild($publishingTasksXml.CreateElement("Id"))).AppendChild($publishingTasksXml.CreateTextNode($Id)) $null = $($ptTaskElement.AppendChild($publishingTasksXml.CreateElement("Action"))).AppendChild($publishingTasksXml.CreateTextNode($Action)) $null = $($ptTaskElement.AppendChild($publishingTasksXml.CreateElement("Name"))).AppendChild($publishingTasksXml.CreateTextNode($Name)) $null = $($ptTaskElement.AppendChild($publishingTasksXml.CreateElement("Version"))).AppendChild($publishingTasksXml.CreateTextNode($Version)) $null = $($ptTaskElement.AppendChild($publishingTasksXml.CreateElement("Group"))).AppendChild($publishingTasksXml.CreateTextNode($Group)) try { Write-Verbose "Retrieving the SID for group `"$Group`"" $groupSID = Get-GroupSID -GroupName $Group -ErrorAction Stop $null = $($ptTaskElement.AppendChild($publishingTasksXml.CreateElement("ADGroupSID"))).AppendChild($publishingTasksXml.CreateTextNode($groupSID)) } catch { Write-Verbose "Could not retrieve the SID for group `"$Group`", $($_.Exception.Message)" } $null = $($ptTaskElement.AppendChild($publishingTasksXml.CreateElement("Path"))).AppendChild($publishingTasksXml.CreateTextNode($Path)) $null = $($ptTaskElement.AppendChild($publishingTasksXml.CreateElement("AlwaysPublish"))).AppendChild($publishingTasksXml.CreateTextNode($AlwaysPublish.ToString())) $null = $($ptTaskElement.AppendChild($publishingTasksXml.CreateElement("Whennotexist"))).AppendChild($publishingTasksXml.CreateTextNode($WhenNotExist)) if ($packageDetails.Type -like 'APPV') { Write-Verbose "Adding APPV specific elements" $null = $($ptTaskElement.AppendChild($publishingTasksXml.CreateElement("PackageId"))).AppendChild($publishingTasksXml.CreateTextNode($packageDetails.PackageId.ToString())) $null = $($ptTaskElement.AppendChild($publishingTasksXml.CreateElement("VersionId"))).AppendChild($publishingTasksXml.CreateTextNode($packageDetails.VersionId.ToString())) $null = $($ptTaskElement.AppendChild($publishingTasksXml.CreateElement("DynamicUserConfigurationPath"))).AppendChild($publishingTasksXml.CreateTextNode($DynamicUserConfigurationPath)) $null = $($ptTaskElement.AppendChild($publishingTasksXml.CreateElement("GlobalPublishForUser"))).AppendChild($publishingTasksXml.CreateTextNode('False')) } elseif ($packageDetails.Type -like 'MSIX' -and $isAppAttach -eq $false) { Write-Verbose "Adding MSIX specific elements" $null = $($ptTaskElement.AppendChild($publishingTasksXml.CreateElement("UseAppAttach"))).AppendChild($publishingTasksXml.CreateTextNode('False')) $null = $($ptTaskElement.AppendChild($publishingTasksXml.CreateElement("PackageFullName"))).AppendChild($publishingTasksXml.CreateTextNode($PackageFullName)) $null = $($ptTaskElement.AppendChild($publishingTasksXml.CreateElement("ForceApplicationShutdownWhenUpgrade"))).AppendChild($publishingTasksXml.CreateTextNode('False')) } elseif ($packageDetails.Type -like 'MSIX' -and $isAppAttach -eq $true) { Write-Verbose "Adding MSIX specific elements for AppAttach" $null = $($ptTaskElement.AppendChild($publishingTasksXml.CreateElement("UseAppAttach"))).AppendChild($publishingTasksXml.CreateTextNode('True')) $null = $($ptTaskElement.AppendChild($publishingTasksXml.CreateElement("PackageFullName"))).AppendChild($publishingTasksXml.CreateTextNode($PackageFullName)) $null = $($ptTaskElement.AppendChild($publishingTasksXml.CreateElement("ForceApplicationShutdownWhenUpgrade"))).AppendChild($publishingTasksXml.CreateTextNode('False')) } if ($ReturnPublishCommand.ToBool() -eq $true) { Write-Verbose "Adding PublishSeamless element, set to False" $null = $($ptTaskElement.AppendChild($publishingTasksXml.CreateElement("PublishSeamless"))).AppendChild($publishingTasksXml.CreateTextNode('False')) Write-Verbose "Adding EnableAutoLaunch element, set to False" $null = $($ptTaskElement.AppendChild($publishingTasksXml.CreateElement("EnableAutoLaunch"))).AppendChild($publishingTasksXml.CreateTextNode('False')) Write-Verbose "Adding Seamless elements" $ptSeamlessElement = $ptTaskElement.AppendChild($publishingTasksXml.CreateElement("Seamless")) $seamlessAppCounter = 0 ForEach ($app in $packageDetails.Applications) { Write-Verbose "Adding SeamlessApplication element for `"$($app.FriendlyName)`" / `"$($app.Description)`"" if ($ReturnPublishCommand) { $output.AppsToPublish += $([PSCustomObject]@{ Order = $seamlessAppCounter Name = $app.FriendlyName Description = $app.Description Executable = "C:\Program Files\AppVentiX\AppVentiX Agent\AppVentiX Wrapper.exe" Argument = '{0}#{1}' -f $Id, $seamlessAppCounter IconPath = "$($app.IconWindowsPath)" FriendlyName = $app.FriendlyName } ) } $seamlessAppCounter++ } } elseif ($AutoLaunch.ToBool() -eq $true) { Write-Verbose "Adding PublishSeamless element, set to False" $null = $($ptTaskElement.AppendChild($publishingTasksXml.CreateElement("PublishSeamless"))).AppendChild($publishingTasksXml.CreateTextNode('False')) Write-Verbose "Adding EnableAutoLaunch element, set to True" $null = $($ptTaskElement.AppendChild($publishingTasksXml.CreateElement("EnableAutoLaunch"))).AppendChild($publishingTasksXml.CreateTextNode('True')) Write-Verbose "Adding AutoLaunch elements" $ptAutoLaunchElement = $ptTaskElement.AppendChild($publishingTasksXml.CreateElement("AutoLaunch")) $autoLaunchAppCounter = 0 #$publishedApps = @() ForEach ($app in $packageDetails.Applications) { Write-Verbose "Adding AutoLaunchApplication element for `"$($app.FriendlyName)`" / `"$($app.Description)`"" $ptAutoLaunchApplicationElement = $ptAutoLaunchElement.AppendChild($publishingTasksXml.CreateElement("AutoLaunchApplication")) $null = $($ptAutoLaunchApplicationElement.AppendChild($publishingTasksXml.CreateElement("AutoLaunchApplicationNumber"))).AppendChild($publishingTasksXml.CreateTextNode($autoLaunchAppCounter.ToString())) $null = $($ptAutoLaunchApplicationElement.AppendChild($publishingTasksXml.CreateElement("AutoLaunchApplicationExecutable"))).AppendChild($publishingTasksXml.CreateTextNode($app.Executable)) $null = $($ptAutoLaunchApplicationElement.AppendChild($publishingTasksXml.CreateElement("AutoLaunchApplicationArgument"))).AppendChild($publishingTasksXml.CreateTextNode("")) $null = $($ptAutoLaunchApplicationElement.AppendChild($publishingTasksXml.CreateElement("AutoLaunchApplicationRunVirtual"))).AppendChild($publishingTasksXml.CreateTextNode("False")) } } else { Write-Verbose "Adding PublishSeamless element, set to False" $null = $($ptTaskElement.AppendChild($publishingTasksXml.CreateElement("PublishSeamless"))).AppendChild($publishingTasksXml.CreateTextNode('False')) Write-Verbose "Adding EnableAutoLaunch element, set to False" $null = $($ptTaskElement.AppendChild($publishingTasksXml.CreateElement("EnableAutoLaunch"))).AppendChild($publishingTasksXml.CreateTextNode('False')) Write-Verbose "No Seamless elements added" } if ($PSCmdlet.ShouldProcess("$($Script:AppVentiX.PublishingTasksFilename)")) { try { $publishingTasksXml.Save($publishingTasksFullname) } catch { Write-Warning "Could not save the file `"$($publishingTasksFullname)`"! No changes made." } } Write-Verbose "Publishing task created with ID `"$Id`", returning the output" return $output } else { Write-Warning 'AppVentiX is not licensed!' } } # SIG # Begin signature block # MIInZQYJKoZIhvcNAQcCoIInVjCCJ1ICAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDziGt9BpqALUT3 # potVthh61QMHIzCCOym5N0Rg05cii6CCIBcwggXJMIIEsaADAgECAhAbtY8lKt8j # AEkoya49fu0nMA0GCSqGSIb3DQEBDAUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK # ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2Vy # dGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5l # dHdvcmsgQ0EwHhcNMjEwNTMxMDY0MzA2WhcNMjkwOTE3MDY0MzA2WjCBgDELMAkG # A1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAl # BgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMb # Q2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMIICIjANBgkqhkiG9w0BAQEFAAOC # Ag8AMIICCgKCAgEAvfl4+ObVgAxknYYblmRnPyI6HnUBfe/7XGeMycxca6mR5rlC # 5SBLm9qbe7mZXdmbgEvXhEArJ9PoujC7Pgkap0mV7ytAJMKXx6fumyXvqAoAl4Va # qp3cKcniNQfrcE1K1sGzVrihQTib0fsxf4/gX+GxPw+OFklg1waNGPmqJhCrKtPQ # 0WeNG0a+RzDVLnLRxWPa52N5RH5LYySJhi40PylMUosqp8DikSiJucBb+R3Z5yet # /5oCl8HGUJKbAiy9qbk0WQq/hEr/3/6zn+vZnuCYI+yma3cWKtvMrTscpIfcRnNe # GWJoRVfkkIJCu0LW8GHgwaM9ZqNd9BjuiMmNF0UpmTJ1AjHuKSbIawLmtWJFfzcV # WiNoidQ+3k4nsPBADLxNF8tNorMe0AZa3faTz1d1mfX6hhpneLO/lv403L3nUlbl # s+V1e9dBkQXcXWnjlQ1DufyDljmVe2yAWk8TcsbXfSl6RLpSpCrVQUYJIP4ioLZb # MI28iQzV13D4h1L92u+sUS4Hs07+0AnacO+Y+lbmbdu1V0vc5SwlFcieLnhO+Nqc # noYsylfzGuXIkosagpZ6w7xQEmnYDlpGizrrJvojybawgb5CAKT41v4wLsfSRvbl # jnX98sy50IdbzAYQYLuDNbdeZ95H7JlI8aShFf6tjGKOOVVPORa5sWOd/7cCAwEA # AaOCAT4wggE6MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFLahVDkCw6A/joq8 # +tT4HKbROg79MB8GA1UdIwQYMBaAFAh2zcsH/yT2xc3tu5C84oQ3RnX3MA4GA1Ud # DwEB/wQEAwIBBjAvBgNVHR8EKDAmMCSgIqAghh5odHRwOi8vY3JsLmNlcnR1bS5w # bC9jdG5jYS5jcmwwawYIKwYBBQUHAQEEXzBdMCgGCCsGAQUFBzABhhxodHRwOi8v # c3ViY2Eub2NzcC1jZXJ0dW0uY29tMDEGCCsGAQUFBzAChiVodHRwOi8vcmVwb3Np # dG9yeS5jZXJ0dW0ucGwvY3RuY2EuY2VyMDkGA1UdIAQyMDAwLgYEVR0gADAmMCQG # CCsGAQUFBwIBFhhodHRwOi8vd3d3LmNlcnR1bS5wbC9DUFMwDQYJKoZIhvcNAQEM # BQADggEBAFHCoVgWIhCL/IYx1MIy01z4S6Ivaj5N+KsIHu3V6PrnCA3st8YeDrJ1 # BXqxC/rXdGoABh+kzqrya33YEcARCNQOTWHFOqj6seHjmOriY/1B9ZN9DbxdkjuR # mmW60F9MvkyNaAMQFtXx0ASKhTP5N+dbLiZpQjy6zbzUeulNndrnQ/tjUoCFBMQl # lVXwfqefAcVbKPjgzoZwpic7Ofs4LphTZSJ1Ldf23SIikZbr3WjtP6MZl9M7JYjs # NhI9qX7OAo0FmpKnJ25FspxihjcNpDOO16hO0EoXQ0zF8ads0h5YbBRRfopUofbv # n3l6XYGaFpAP4bvxSgD5+d2+7arszgowggZFMIIELaADAgECAhAIMk+dt9qRb2Pk # 8qM8Xl1RMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNVBAYTAlBMMSEwHwYDVQQKExhB # c3NlY28gRGF0YSBTeXN0ZW1zIFMuQS4xJDAiBgNVBAMTG0NlcnR1bSBDb2RlIFNp # Z25pbmcgMjAyMSBDQTAeFw0yNDA0MDQxNDA0MjRaFw0yNzA0MDQxNDA0MjNaMGsx # CzAJBgNVBAYTAk5MMRIwEAYDVQQHDAlTY2hpam5kZWwxIzAhBgNVBAoMGkpvaG4g # QmlsbGVrZW5zIENvbnN1bHRhbmN5MSMwIQYDVQQDDBpKb2huIEJpbGxla2VucyBD # b25zdWx0YW5jeTCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAMslntDb # SQwHZXwFhmibivbnd0Qfn6sqe/6fos3pKzKxEsR907RkDMet2x6RRg3eJkiIr3TF # PwqBooyXXgK3zxxpyhGOcuIqyM9J28DVf4kUyZHsjGO/8HFjrr3K1hABNUszP0o7 # H3o6J31eqV1UmCXYhQlNoW9FOmRC1amlquBmh7w4EKYEytqdmdOBavAD5Xq4vLPx # NP6kyA+B2YTtk/xM27TghtbwFGKnu9Vwnm7dFcpLxans4ONt2OxDQOMA5NwgcUv/ # YTpjhq9qoz6ivG55NRJGNvUXsM3w2o7dR6Xh4MuEGrTSrOWGg2A5EcLH1XqQtkF5 # cZnAPM8W/9HUp8ggornWnFVQ9/6Mga+ermy5wy5XrmQpN+x3u6tit7xlHk1Hc+4X # Y4a4ie3BPXG2PhJhmZAn4ebNSBwNHh8z7WTT9X9OFERepGSytZVeEP7hgyptSLcu # hpwWeR4QdBb7dV++4p3PsAUQVHFpwkSbrRTv4EiJ0Lcz9P1HPGFoHiFAQQIDAQAB # o4IBeDCCAXQwDAYDVR0TAQH/BAIwADA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8v # Y2NzY2EyMDIxLmNybC5jZXJ0dW0ucGwvY2NzY2EyMDIxLmNybDBzBggrBgEFBQcB # AQRnMGUwLAYIKwYBBQUHMAGGIGh0dHA6Ly9jY3NjYTIwMjEub2NzcC1jZXJ0dW0u # Y29tMDUGCCsGAQUFBzAChilodHRwOi8vcmVwb3NpdG9yeS5jZXJ0dW0ucGwvY2Nz # Y2EyMDIxLmNlcjAfBgNVHSMEGDAWgBTddF1MANt7n6B0yrFu9zzAMsBwzTAdBgNV # HQ4EFgQUO6KtBpOBgmrlANVAnyiQC6W6lJwwSwYDVR0gBEQwQjAIBgZngQwBBAEw # NgYLKoRoAYb2dwIFAQQwJzAlBggrBgEFBQcCARYZaHR0cHM6Ly93d3cuY2VydHVt # LnBsL0NQUzATBgNVHSUEDDAKBggrBgEFBQcDAzAOBgNVHQ8BAf8EBAMCB4AwDQYJ # KoZIhvcNAQELBQADggIBAEQsN8wgPMdWVkwHPPTN+jKpdns5AKVFjcn00psf2NGV # VgWWNQBIQc9lEuTBWb54IK6Ga3hxQRZfnPNo5HGl73YLmFgdFQrFzZ1lnaMdIcyh # 8LTWv6+XNWfoyCM9wCp4zMIDPOs8LKSMQqA/wRgqiACWnOS4a6fyd5GUIAm4Cuap # tpFYr90l4Dn/wAdXOdY32UhgzmSuxpUbhD8gVJUaBNVmQaRqeU8y49MxiVrUKJXd # e1BCrtR9awXbqembc7Nqvmi60tYKlD27hlpKtj6eGPjkht0hHEsgzU0Fxw7ZJghY # G2wXfpF2ziN893ak9Mi/1dmCNmorGOnybKYfT6ff6YTCDDNkod4egcMZdOSv+/Qv # +HAeIgEvrxE9QsGlzTwbRtbm6gwYYcVBs/SsVUdBn/TSB35MMxRhHE5iC3aUTkDb # ceo/XP3uFhVL4g2JZHpFfCSu2TQrrzRn2sn07jfMvzeHArCOJgBW1gPqR3WrJ4hU # xL06Rbg1gs9tU5HGGz9KNQMfQFQ70Wz7UIhezGcFcRfkIfSkMmQYYpsc7rfzj+z0 # ThfDVzzJr2dMOFsMlfj1T6l22GBq9XQx0A4lcc5Fl9pRxbOuHHWFqIBD/BCEhwni # OCySzqENd2N+oz8znKooSISStnkNaYXt6xblJF2dx9Dn89FK7d1IquNxOwt0tI5d # MIIGgzCCBGugAwIBAgIRAJ6cBPZVqLSnAm1JjGx4jaowDQYJKoZIhvcNAQEMBQAw # VjELMAkGA1UEBhMCUEwxITAfBgNVBAoTGEFzc2VjbyBEYXRhIFN5c3RlbXMgUy5B # LjEkMCIGA1UEAxMbQ2VydHVtIFRpbWVzdGFtcGluZyAyMDIxIENBMB4XDTI1MDEw # OTA4NDA0M1oXDTM2MDEwNzA4NDA0M1owUDELMAkGA1UEBhMCUEwxITAfBgNVBAoM # GEFzc2VjbyBEYXRhIFN5c3RlbXMgUy5BLjEeMBwGA1UEAwwVQ2VydHVtIFRpbWVz # dGFtcCAyMDI1MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxylfZ/is # K92QReVAi1jkPzXW25QL0HhjI3wov24m0+9YT5MCleFL0LdTLjsKGlAmLbC4cPI6 # 5jpqM9h6ByisxKYktwNawN7LF1GTJ0q24olaQ4/uTLZ210lRCSm3HLh25sHI5d/T # eFu9s3HKAv53igLsDtQyfvUjvmJB53EYlfeYnVocUQHA2L+O4XPRhBWbUxcUFy26 # y+DezfdAai5Xt2ss583HBD0PhOh+qdNMxPR1Kfvt22UxeD38j0Zygi3OXswMxKqm # 21ORf57o8evU9ZptNo5bZRV50zBdb5WpHkF1mKRiI7a0e1j+7SDGZ5O/J62En3gK # fJXvv1v+fqq+7akGbn1vYp77EU3H5Oz/ppyoyS7km8KoMXpbwga8s/a+dW09OetW # kdnPo6BcoKlu5+BTwpzCzo+NF+KLe8D9rvJC0Q1R24bB6uUhi6q/A2xateMLNgC0 # t7WGthhogO8F+/a0uaAzJ0mP8ZiTuXLqbkr6qcpczu483CzsFoqgq6tOQF6edUka # 4/cUbfCnWVqQ3VoVphPDBYhbZkNAKjgyyQZ9YUAMdxbw/6bXuqRNQYpdATlQtkp2 # 3qv9zcpQ8Lw3QIP9AmUSbECGsnR7MCcMmAZWFA8mkCtslEue4aG52Mf70rTL0wfe # oouIxld1JGYdxr8HQwrGZGyV2lPAExf8+g8CAwEAAaOCAVAwggFMMHUGCCsGAQUF # BwEBBGkwZzA7BggrBgEFBQcwAoYvaHR0cDovL3N1YmNhLnJlcG9zaXRvcnkuY2Vy # dHVtLnBsL2N0c2NhMjAyMS5jZXIwKAYIKwYBBQUHMAGGHGh0dHA6Ly9zdWJjYS5v # Y3NwLWNlcnR1bS5jb20wHwYDVR0jBBgwFoAUvlQCL79AbHNDzqwJJU6eQ0Qa7uAw # DAYDVR0TAQH/BAIwADA5BgNVHR8EMjAwMC6gLKAqhihodHRwOi8vc3ViY2EuY3Js # LmNlcnR1bS5wbC9jdHNjYTIwMjEuY3JsMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMI # MA4GA1UdDwEB/wQEAwIHgDAiBgNVHSAEGzAZMAgGBmeBDAEEAjANBgsqhGgBhvZ3 # AgUBCzAdBgNVHQ4EFgQUgYwGoChT/AA/236eSsEfIuyyEokwDQYJKoZIhvcNAQEM # BQADggIBAJkPGQwb6wVD52i/OwGHOCZZnx9WT+creuTLc2LvH25rC93d3L2LPhJ2 # 7X7vX9sDHoc0sr3nd0XOfWtODvDTe6ZcOD14O9cH0hODERTNRLqi+t86vbk45v/b # QO969WgnVppKayqdGi6GaJVDdKhnL6/fkBvFSCVTHLkqhXhL0ayxCitsVZDEnU02 # w4bHlIyOLzfga15uc+ORAN2g6UomULqDXeERZw83XW4H3AkD2mNlMl6szQY57s+g # Mh5xcyrTZQnr5DAYIeHSA7f9AxhgzmkxAFmbVBKiuQJR3dDwZ3eNC56IOFAE1Nwb # ehh33g5lhBxU4xyrJp/UPMIho/dOm1YC/N+bXxB/RIGA5JaqzlMVsQ39XDgO3bP6 # /KSHNr4y0PbTkpJvVl1W503ixt0Oe3604Ar0zm3f6n91MxPe50zTlO7zjGRKONQI # JobhGxrMkCAzP1enyUF9UZ88yTaKn005FM1KD9rZTR5zbIxaNmFfucmXKGmsJjVp # ke08sFFxtv7xYCWhtG3xKKHXnl6ewOCOB2gw6X0Wu8qYCRD3k8B7gUSaY/Tftcba # 4vugcxz8LAAL1CZufDxqFbLXhwF8L6YODVYL1JNwSm5e8RbpVlNSh6h/7JO09AhQ # UOaIbij5hX9aKgD+ADvWt2INsATMBINczzoesW1F7JM7PYkmvchsMIIGuTCCBKGg # AwIBAgIRAJmjgAomVTtlq9xuhKaz6jkwDQYJKoZIhvcNAQEMBQAwgYAxCzAJBgNV # BAYTAlBMMSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYD # VQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJDAiBgNVBAMTG0Nl # cnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EgMjAeFw0yMTA1MTkwNTMyMThaFw0zNjA1 # MTgwNTMyMThaMFYxCzAJBgNVBAYTAlBMMSEwHwYDVQQKExhBc3NlY28gRGF0YSBT # eXN0ZW1zIFMuQS4xJDAiBgNVBAMTG0NlcnR1bSBDb2RlIFNpZ25pbmcgMjAyMSBD # QTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJ0jzwQwIzvBRiznM3M+ # Y116dbq+XE26vest+L7k5n5TeJkgH4Cyk74IL9uP61olRsxsU/WBAElTMNQI/HsE # 0uCJ3VPLO1UufnY0qDHG7yCnJOvoSNbIbMpT+Cci75scCx7UsKK1fcJo4TXetu4d # u2vEXa09Tx/bndCBfp47zJNsamzUyD7J1rcNxOw5g6FJg0ImIv7nCeNn3B6gZG28 # WAwe0mDqLrvU49chyKIc7gvCjan3GH+2eP4mYJASflBTQ3HOs6JGdriSMVoD1lzB # JobtYDF4L/GhlLEXWgrVQ9m0pW37KuwYqpY42grp/kSYE4BUQrbLgBMNKRvfhQPs # kDfZ/5GbTCyvlqPN+0OEDmYGKlVkOMenDO/xtMrMINRJS5SY+jWCi8PRHAVxO0xd # x8m2bWL4/ZQ1dp0/JhUpHEpABMc3eKax8GI1F03mSJVV6o/nmmKqDE6TK34eTAgD # iBuZJzeEPyR7rq30yOVw2DvetlmWssewAhX+cnSaaBKMEj9O2GgYkPJ16Q5Da1AP # YO6n/6wpCm1qUOW6Ln1J6tVImDyAB5Xs3+JriasaiJ7P5KpXeiVV/HIsW3ej85A6 # cGaOEpQA2gotiUqZSkoQUjQ9+hPxDVb/Lqz0tMjp6RuLSKARsVQgETwoNQZ8jCeK # wSQHDkpwFndfCceZ/OfCUqjxAgMBAAGjggFVMIIBUTAPBgNVHRMBAf8EBTADAQH/ # MB0GA1UdDgQWBBTddF1MANt7n6B0yrFu9zzAMsBwzTAfBgNVHSMEGDAWgBS2oVQ5 # AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwEwYDVR0lBAwwCgYIKwYB # BQUHAwMwMAYDVR0fBCkwJzAloCOgIYYfaHR0cDovL2NybC5jZXJ0dW0ucGwvY3Ru # Y2EyLmNybDBsBggrBgEFBQcBAQRgMF4wKAYIKwYBBQUHMAGGHGh0dHA6Ly9zdWJj # YS5vY3NwLWNlcnR1bS5jb20wMgYIKwYBBQUHMAKGJmh0dHA6Ly9yZXBvc2l0b3J5 # LmNlcnR1bS5wbC9jdG5jYTIuY2VyMDkGA1UdIAQyMDAwLgYEVR0gADAmMCQGCCsG # AQUFBwIBFhhodHRwOi8vd3d3LmNlcnR1bS5wbC9DUFMwDQYJKoZIhvcNAQEMBQAD # ggIBAHWIWA/lj1AomlOfEOxD/PQ7bcmahmJ9l0Q4SZC+j/v09CD2csX8Yl7pmJQE # TIMEcy0VErSZePdC/eAvSxhd7488x/Cat4ke+AUZZDtfCd8yHZgikGuS8mePCHyA # iU2VSXgoQ1MrkMuqxg8S1FALDtHqnizYS1bIMOv8znyJjZQESp9RT+6NH024/IqT # RsRwSLrYkbFq4VjNn/KV3Xd8dpmyQiirZdrONoPSlCRxCIi54vQcqKiFLpeBm5S0 # IoDtLoIe21kSw5tAnWPazS6sgN2oXvFpcVVpMcq0C4x/CLSNe0XckmmGsl9z4UUg # uAJtf+5gE8GVsEg/ge3jHGTYaZ/MyfujE8hOmKBAUkVa7NMxRSB1EdPFpNIpEn/p # SHuSL+kWN/2xQBJaDFPr1AX0qLgkXmcEi6PFnaw5T17UdIInA58rTu3mefNuzUts # e4AgYmxEmJDodf8NbVcU6VdjWtz0e58WFZT7tST6EWQmx/OoHPelE77lojq7lpsj # hDCzhhp4kfsfszxf9g2hoCtltXhCX6NqsqwTT7xe8LgMkH4hVy8L1h2pqGLT2aNC # x7h/F95/QvsTeGGjY7dssMzq/rSshFQKLZ8lPb8hFTmiGDJNyHga5hZ59IGynk08 # mHhBFM/0MLeBzlAQq1utNjQprztZ5vv/NJy8ua9AGbwkMWkOMIIGuTCCBKGgAwIB # AgIRAOf/acc7Nc5LkSbYdHxopYcwDQYJKoZIhvcNAQEMBQAwgYAxCzAJBgNVBAYT # AlBMMSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQL # Ex5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJDAiBgNVBAMTG0NlcnR1 # bSBUcnVzdGVkIE5ldHdvcmsgQ0EgMjAeFw0yMTA1MTkwNTMyMDdaFw0zNjA1MTgw # NTMyMDdaMFYxCzAJBgNVBAYTAlBMMSEwHwYDVQQKExhBc3NlY28gRGF0YSBTeXN0 # ZW1zIFMuQS4xJDAiBgNVBAMTG0NlcnR1bSBUaW1lc3RhbXBpbmcgMjAyMSBDQTCC # AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAOkSHwQ17bldesWmlUG+imV/ # TnfRbSV102aO2/hhKH9/t4NAoVoipzu0ePujH67y8iwlmWuhqRR4xLeLdPxolEL5 # 5CzgUXQaq+Qzr5Zk7ySbNl/GZloFiYwuzwWS2AVgLPLCZd5DV8QTF+V57Y6lsdWT # rrl5dEeMfsxhkjM2eOXabwfLy6UH2ZHzAv9bS/SmMo1PobSx+vHWST7c4aiwVRvv # JY2dWRYpTipLEu/XqQnqhUngFJtnjExqTokt4HyzOsr2/AYOm8YOcoJQxgvc26+L # AfXHiBkbQkBdTfHak4DP3UlYolICZHL+XSzSXlsRgqiWD4MypWGU4A13xiHmaRBZ # owS8FET+QAbMiqBaHDM3Y6wohW07yZ/mw9ZKu/KmVIAEBhrXesxifPB+DTyeWNke # CGq4IlgJr/Ecr1px6/1QPtj66yvXl3uauzPPGEXUk6vUym6nZyE1IGXI45uGVI7X # qvCt99WuD9LNop9Kd1LmzBGGvxucOo0lj1M3IRi8FimAX3krunSDguC5HgD75nWc # UgdZVjm/R81VmaDPEP25Wj+C1reicY5CPckLGBjHQqsJe7jJz1CJXBMUtZs10cVK # MEK3n/xD2ku5GFWhx0K6eFwe50xLUIZD9GfT7s/5/MyBZ1Ep8Q6H+GMuudDwF0mJ # itk3G8g6EzZprfMQMc3DAgMBAAGjggFVMIIBUTAPBgNVHRMBAf8EBTADAQH/MB0G # A1UdDgQWBBS+VAIvv0Bsc0POrAklTp5DRBru4DAfBgNVHSMEGDAWgBS2oVQ5AsOg # P46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwEwYDVR0lBAwwCgYIKwYBBQUH # AwgwMAYDVR0fBCkwJzAloCOgIYYfaHR0cDovL2NybC5jZXJ0dW0ucGwvY3RuY2Ey # LmNybDBsBggrBgEFBQcBAQRgMF4wKAYIKwYBBQUHMAGGHGh0dHA6Ly9zdWJjYS5v # Y3NwLWNlcnR1bS5jb20wMgYIKwYBBQUHMAKGJmh0dHA6Ly9yZXBvc2l0b3J5LmNl # cnR1bS5wbC9jdG5jYTIuY2VyMDkGA1UdIAQyMDAwLgYEVR0gADAmMCQGCCsGAQUF # BwIBFhhodHRwOi8vd3d3LmNlcnR1bS5wbC9DUFMwDQYJKoZIhvcNAQEMBQADggIB # ALiTWXfJTBX9lAcIoKd6oCzwQZOfARQkt0OmiQ390yEqMrStHmpfycggfPGlBHdM # DDYhHDVTGyvY+WIbdsIWpJ1BNRt9pOrpXe8HMR5sOu71AWOqUqfEIXaHWOEs0UWm # Vs8mJb4lKclOHV8oSoR0p3GCX2tVO+XF8Qnt7E6fbkwZt3/AY/C5KYzFElU7TCeq # BLuSagmM0X3Op56EVIMM/xlWRaDgRna0hLQze5mYHJGv7UuTCOO3wC1bzeZWdlPJ # Ow5v4U1/AljsNLgWZaGRFuBwdF62t6hOKs86v+jPIMqFPwxNJN/ou22DqzpP+7Ty # YNbDocrThlEN9D2xvvtBXyYqA7jhYY/fW9edUqhZUmkUGM++Mvz9lyT/nBdfaKqM # 5otK0U5H8hCSL4SGfjOVyBWbbZlUIE8X6XycDBRRKEK0q5JTsaZksoKabFAyRKJY # gtObwS1UPoDGcmGirwSeGMQTJSh+WR5EXZaEWJVA6ZZPBlGvjgjFYaQ0kLq1Oitb # muXZmX7Z70ks9h/elK0A8wOg8oiNVd3o1bb59ms1QF4OjZ45rkWfsGuz8ctB9/le # CuKzkx5Rt1WAOsXy7E7pws+9k+jrePrZKw2DnmlNaT19QgX2I+hFtvhC6uOhj/Cg # jVEA4q1i1OJzpoAmre7zdEg+kZcFIkrDHgokA5mcIMK1MYIGpDCCBqACAQEwajBW # MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEu # MSQwIgYDVQQDExtDZXJ0dW0gQ29kZSBTaWduaW5nIDIwMjEgQ0ECEAgyT5232pFv # Y+TyozxeXVEwDQYJYIZIAWUDBAIBBQCggYQwGAYKKwYBBAGCNwIBDDEKMAigAoAA # oQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4w # DAYKKwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQgTRsfHYGRpunXiQszCwQU7jhI # Aliw+6DnV+qhx1bYuTwwDQYJKoZIhvcNAQEBBQAEggGANry08TX9a/MVA4PQoGZG # 6XmvhOEQkbCs/t14IPuF95SggzWBbiO4dPDm3gbCnSsc2CTAqm+gCC1XJdFZaIiz # Xqsgs4avYaZwMz9fYfwQ+Ji7IZmpoAhxqgfaBp9+Ob6H/lzLOayflxFsSZA/zVZa # X3d7IsicodBa+v0V4c86+zgXbow+9dUfbUVvg9kiRdI8B2/y4CAvi3yZMnFRMmpp # MR3tNz63cZIyr1CPPnCSWTo9Yh+TrP5AbKM0RRDnjjley0tuZCl17M6gnNQKtXXk # HSjqMKuHzROUjcDgQrOm8VqiDsX+RdRxD3D/+sz11grN8YNIxIvFaXZ5AsAM/aju # Q9cnNQleExPQL8WCPmPL9WFbxWKpAp4cVNzAsQ5LvzC9RowILMNJeeJLhFDKsMWD # bxAMqLvgnTRlLNkYSwsu4FT0mM0gNkNIzya2B5RX6eTBBbkpCsnqG9JZI1mYI/W6 # dfFQTa4VLxcXfsTmiVYBbPrCR22oz8p/wjzmQIceBEaYoYIEBDCCBAAGCSqGSIb3 # DQEJBjGCA/EwggPtAgEBMGswVjELMAkGA1UEBhMCUEwxITAfBgNVBAoTGEFzc2Vj # byBEYXRhIFN5c3RlbXMgUy5BLjEkMCIGA1UEAxMbQ2VydHVtIFRpbWVzdGFtcGlu # ZyAyMDIxIENBAhEAnpwE9lWotKcCbUmMbHiNqjANBglghkgBZQMEAgIFAKCCAVcw # GgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMBwGCSqGSIb3DQEJBTEPFw0yNTAz # MTEyMTE3MTZaMDcGCyqGSIb3DQEJEAIvMSgwJjAkMCIEIM+h3DWd7SvDy4kPojDl # 2vd7VA8abisj3c8XVOGM+qDVMD8GCSqGSIb3DQEJBDEyBDC+WmJT2RUnd2QNxa87 # TJbIw3S7O2mMQSjwlal5CdiIXOMXlt67B2XovCToYULAFQwwgaAGCyqGSIb3DQEJ # EAIMMYGQMIGNMIGKMIGHBBTDJbibF/zFAmBhzitxe0UH3ZxqajBvMFqkWDBWMQsw # CQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMSQw # IgYDVQQDExtDZXJ0dW0gVGltZXN0YW1waW5nIDIwMjEgQ0ECEQCenAT2Vai0pwJt # SYxseI2qMA0GCSqGSIb3DQEBAQUABIICABjkTC1Ib1B005UdqrkxzIAjbl/KQ7uW # 1UFwqGPqFw7Vm4YRx5mkw9EV2/GsEx6nRIo6FTkzSqg0pBr34dcFpwUITK3vWHYR # y4sns75PxFuXxWC4LHApSSfnoVp+zI9V53exNlTxb3gDCvbY8iydVr9nM82c49RD # MRgv+IHv0tkp9JXnMzcJyZkk7CEt4+xg3fdMU4H4wyca7N5JVhJ+AMULuR7zapYW # jTmPSMp9Dpn+Zu5dmkgTeKM6i2HUj70goJMdHdg0TY2cbNRfpATATvFRdPehP96S # CadULpu/Xrfxpz+ChwKJ50dvXty54EWhKQnsRAtczA4DvmkZ+Hg9tfVwwqTs3uq2 # 6QyDPx/2hRbQ6rHT6P1vyxaf9KJxfSqIW4AEnmt9Zy5FGUE+qibBT98PTSdEgu1P # nVl1KecqC2u1RqKtBfXPE2MWFCSh7B8mM7dB+yesrbbF2ZodWmAt+ZhzJfpe4jeE # BQPgKJu25GeSSm2EgQTrp/PnRRFp8AMbJzVj6/hnrmrBTOtATRRvq9Lhna+9i+OX # 5GqbNXR92Z6ykBEINlZ4Mhlfe+pAUnTz0RgKJW1bk2F79L2I04aVrHeaRtF6RUHr # 3oV28QxEfqpVMs13itQwwxjZncemAQxXldYhzq8sGyG0U2H0oK5H0VTfJd6+atQ0 # MMGNimqPy84Z # SIG # End signature block |