Apps/Convert-BCDevAppsToRuntimePackages.ps1
<#
.Synopsis Preview function for Converting BC Apps to Runtime Packages .Description Preview function for Converting BC Apps to Runtime Packages .Parameter showMyCode Include this switch if you want to include the app's source code in the runtime package. .Parameter includeSourceInPackageFile Include this switch if you want to include source code in the runtime package. .Parameter skipFailingApps If set, a failing app (compiler error or anything else) does not stop the whole process but continues with the next app. .Parameter afterEachRuntimeCreation A script block to be executed after an app has been converted to a runtime package. The parameters are 'appFile', containing the source path and 'runtimeFile' containing the path to the newly extracted runtime file or $null if the process has failed and skipFailingApps has been set. #> function Convert-BCDevAppsToRuntimePackages { Param( [string] $containerName = $bcContainerHelperConfig.defaultContainerName, [Parameter(Mandatory = $false)] [string] $imageName = "my", [Parameter(Mandatory = $true)] $artifactUrl, [Parameter(Mandatory = $false)] [string] $licenseFile = "", [Parameter(Mandatory = $false)] [string] $addinsFolder, [Parameter(Mandatory = $false)] $publishApps = "", [Parameter(Mandatory = $true)] $apps, [Parameter(Mandatory = $false)] $destinationFolder = "", [bool] $includeSourceInPackageFile, [bool] $showMyCode, [switch] $skipVerification, [switch] $skipFailingApps, [scriptblock] $afterEachRuntimeCreation = {} ) try { $appsFolder = Join-Path ([System.IO.Path]::GetTempPath()) ([Guid]::NewGuid().ToString()) try { $apps = @(Sort-AppFilesByDependencies -appFiles (Copy-AppFilesToFolder -appFiles $apps -folder $appsFolder) -WarningAction SilentlyContinue) if ($apps.Count -eq 0) { throw "No apps specified" } if ($publishApps) { $publishApps = Copy-AppFilesToFolder -appFiles $publishApps -folder $appsFolder } if (!($destinationFolder)) { $destinationFolder = Join-Path ([System.IO.Path]::GetTempPath()) ([Guid]::NewGuid().ToString()) New-Item -Path $destinationFolder -ItemType Directory | Out-Null } elseif (Test-Path $destinationFolder) { if (Get-ChildItem -Path $destinationFolder) { throw "Destination folder is not empty" } } else { New-Item -Path $destinationFolder -ItemType Directory | Out-Null } $password = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("$containerName")) $credential = (New-Object pscredential 'admin', (ConvertTo-SecureString -String $password -AsPlainText -Force)) $additionalParameters = @( "--volume ""$($appsFolder):c:\apps""" "--volume ""$($destinationFolder):c:\dest""" "--env WebClient=N" "--env httpSite=N" ) if ($addinsFolder) { $additionalParameters += @( "--volume ""$($addInsFolder):c:\run\add-ins""" ) } New-BcContainer ` -containerName $containerName ` -imageName $imageName ` -accept_eula ` -accept_insiderEula ` -shortcuts None ` -artifactUrl $artifactUrl ` -auth UserPassword ` -multitenant:$false ` -Credential $credential ` -licenseFile $licenseFile ` -additionalParameters $additionalParameters $bcVersion = (Get-BcContainerNavVersion -containerOrImageName $containerName).ToLowerInvariant() if ($publishApps) { $publishApps = Sort-AppFilesByDependencies -containerName $containerName -appFiles $publishApps -WarningAction SilentlyContinue $publishApps | ForEach-Object { Invoke-ScriptInBcContainer -containerName $containerName -scriptblock { Param($appFile, $skipVerification) Write-Host "Publishing $([System.IO.Path]::GetFileName($appFile))" Publish-NavApp -ServerInstance $serverInstance -path $appFile -skipVerification:$skipVerification -packageType Extension } -argumentList (Get-BcContainerPath -containerName $containerName -path $_), $skipVerification } } $apps | ForEach-Object { $appFile = $_ try { $afterEachRuntimeCreationParameters = @{ 'appFile' = $appFile } $runtimeFileName = Invoke-ScriptInBcContainer -containerName $containerName -scriptblock { Param($appFile, $destinationFolder, $bcVersion, $skipVerification, $showMyCode, $isShowMyCodePresent, $includeSourceInPackageFile, $isIncludeSourceInPackageFilePresent) Write-Host "Publishing $([System.IO.Path]::GetFileName($appFile))" Publish-NavApp -ServerInstance $serverInstance -path $appFile -skipVerification:$skipVerification -packageType Extension $navAppInfo = Get-NAVAppInfo -Path $appFile $appPublisher = $navAppInfo.Publisher $appName = $navAppInfo.Name $appVersion = $navAppInfo.Version $appFileName = "$($appPublisher)_$($appName)_$($appVersion).runtime-$($bcVersion).app".Split([System.IO.Path]::GetInvalidFileNameChars()) -join '' $params = @{ "ServerInstance" = $serverInstance "appName" = $appName "appPublisher" = $appPublisher "appVersion" = $appVersion "path" = (Join-Path $destinationFolder $appFileName) } if ($isShowMyCodePresent) { $params += @{ "showMyCode" = $showMyCode } } if ($isIncludeSourceInPackageFilePresent) { $params += @{ "includeSourceInPackageFile" = $includeSourceInPackageFile } } Write-Host "Creating Runtime Package $([System.IO.Path]::GetFileName($appFileName))" Get-NavAppRuntimePackage @params return $appFileName } -argumentList (Get-BcContainerPath -containerName $containerName -path $appFile), (Get-BcContainerPath -containerName $containerName -path $destinationFolder), $bcVersion, $skipVerification, $showMyCode, $PSBoundParameters.ContainsKey('ShowMyCode'), $includeSourceInPackageFile, $PSBoundParameters.ContainsKey('includeSourceInPackageFile') $afterEachRuntimeCreationParameters += @{ 'runtimeFile' = (Join-Path -Path $destinationFolder -ChildPath $runtimeFileName) } } catch { if (!$skipFailingApps.IsPresent) { throw } Write-Warning -Message "Failed creating Runtime Package for $($appFile)." $afterEachRuntimeCreationParameters += @{ 'runtimeFile' = $null } } $afterEachRuntimeCreation.Invoke($afterEachRuntimeCreationParameters) } $destinationFolder } finally { Remove-BcContainer -containerName $containerName if (Test-Path $appsFolder) { Remove-Item $appsFolder -Recurse -Force -ErrorAction SilentlyContinue } } } catch { throw } } Export-ModuleMember -Function Convert-BCDevAppsToRuntimePackages # SIG # Begin signature block # MIInpAYJKoZIhvcNAQcCoIInlTCCJ5ECAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCA53q5/8YbKqyQs # MYk8P2kL/uCxnei4VT7NMoEAlSg+66CCILswggWNMIIEdaADAgECAhAOmxiO+dAt # 5+/bUOIIQBhaMA0GCSqGSIb3DQEBDAUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQK # EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNV # BAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0yMjA4MDEwMDAwMDBa # Fw0zMTExMDkyMzU5NTlaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2Vy # dCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lD # ZXJ0IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC # ggIBAL/mkHNo3rvkXUo8MCIwaTPswqclLskhPfKK2FnC4SmnPVirdprNrnsbhA3E # MB/zG6Q4FutWxpdtHauyefLKEdLkX9YFPFIPUh/GnhWlfr6fqVcWWVVyr2iTcMKy # unWZanMylNEQRBAu34LzB4TmdDttceItDBvuINXJIB1jKS3O7F5OyJP4IWGbNOsF # xl7sWxq868nPzaw0QF+xembud8hIqGZXV59UWI4MK7dPpzDZVu7Ke13jrclPXuU1 # 5zHL2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4AxCN2NQ3pC4FfYj1gj4QkXCrVYJB # MtfbBHMqbpEBfCFM1LyuGwN1XXhm2ToxRJozQL8I11pJpMLmqaBn3aQnvKFPObUR # WBf3JFxGj2T3wWmIdph2PVldQnaHiZdpekjw4KISG2aadMreSx7nDmOu5tTvkpI6 # nj3cAORFJYm2mkQZK37AlLTSYW3rM9nF30sEAMx9HJXDj/chsrIRt7t/8tWMcCxB # YKqxYxhElRp2Yn72gLD76GSmM9GJB+G9t+ZDpBi4pncB4Q+UDCEdslQpJYls5Q5S # UUd0viastkF13nqsX40/ybzTQRESW+UQUOsxxcpyFiIJ33xMdT9j7CFfxCBRa2+x # q4aLT8LWRV+dIPyhHsXAj6KxfgommfXkaS+YHS312amyHeUbAgMBAAGjggE6MIIB # NjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTs1+OC0nFdZEzfLmc/57qYrhwP # TzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzAOBgNVHQ8BAf8EBAMC # AYYweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp # Y2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNv # bS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwRQYDVR0fBD4wPDA6oDigNoY0 # aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENB # LmNybDARBgNVHSAECjAIMAYGBFUdIAAwDQYJKoZIhvcNAQEMBQADggEBAHCgv0Nc # Vec4X6CjdBs9thbX979XB72arKGHLOyFXqkauyL4hxppVCLtpIh3bb0aFPQTSnov # Lbc47/T/gLn4offyct4kvFIDyE7QKt76LVbP+fT3rDB6mouyXtTP0UNEm0Mh65Zy # oUi0mcudT6cGAxN3J0TU53/oWajwvy8LpunyNDzs9wPHh6jSTEAZNUZqaVSwuKFW # juyk1T3osdz9HNj0d1pcVIxv76FQPfx2CWiEn2/K2yCNNWAcAgPLILCsWKAOQGPF # mCLBsln1VWvPJ6tsds5vIy30fnFqI2si/xK4VC0nftg62fC2h5b9W9FcrBjDTZ9z # twGpn1eqXijiuZQwggauMIIElqADAgECAhAHNje3JFR82Ees/ShmKl5bMA0GCSqG # SIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMx # GTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRy # dXN0ZWQgUm9vdCBHNDAeFw0yMjAzMjMwMDAwMDBaFw0zNzAzMjIyMzU5NTlaMGMx # CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMy # RGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBpbmcg # Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDGhjUGSbPBPXJJUVXH # JQPE8pE3qZdRodbSg9GeTKJtoLDMg/la9hGhRBVCX6SI82j6ffOciQt/nR+eDzMf # UBMLJnOWbfhXqAJ9/UO0hNoR8XOxs+4rgISKIhjf69o9xBd/qxkrPkLcZ47qUT3w # 1lbU5ygt69OxtXXnHwZljZQp09nsad/ZkIdGAHvbREGJ3HxqV3rwN3mfXazL6IRk # tFLydkf3YYMZ3V+0VAshaG43IbtArF+y3kp9zvU5EmfvDqVjbOSmxR3NNg1c1eYb # qMFkdECnwHLFuk4fsbVYTXn+149zk6wsOeKlSNbwsDETqVcplicu9Yemj052FVUm # cJgmf6AaRyBD40NjgHt1biclkJg6OBGz9vae5jtb7IHeIhTZgirHkr+g3uM+onP6 # 5x9abJTyUpURK1h0QCirc0PO30qhHGs4xSnzyqqWc0Jon7ZGs506o9UD4L/wojzK # QtwYSH8UNM/STKvvmz3+DrhkKvp1KCRB7UK/BZxmSVJQ9FHzNklNiyDSLFc1eSuo # 80VgvCONWPfcYd6T/jnA+bIwpUzX6ZhKWD7TA4j+s4/TXkt2ElGTyYwMO1uKIqjB # Jgj5FBASA31fI7tk42PgpuE+9sJ0sj8eCXbsq11GdeJgo1gJASgADoRU7s7pXche # MBK9Rp6103a50g5rmQzSM7TNsQIDAQABo4IBXTCCAVkwEgYDVR0TAQH/BAgwBgEB # /wIBADAdBgNVHQ4EFgQUuhbZbU2FL3MpdpovdYxqII+eyG8wHwYDVR0jBBgwFoAU # 7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoG # CCsGAQUFBwMIMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29j # c3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdp # Y2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6MDig # NqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9v # dEc0LmNybDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwDQYJKoZI # hvcNAQELBQADggIBAH1ZjsCTtm+YqUQiAX5m1tghQuGwGC4QTRPPMFPOvxj7x1Bd # 4ksp+3CKDaopafxpwc8dB+k+YMjYC+VcW9dth/qEICU0MWfNthKWb8RQTGIdDAiC # qBa9qVbPFXONASIlzpVpP0d3+3J0FNf/q0+KLHqrhc1DX+1gtqpPkWaeLJ7giqzl # /Yy8ZCaHbJK9nXzQcAp876i8dU+6WvepELJd6f8oVInw1YpxdmXazPByoyP6wCeC # RK6ZJxurJB4mwbfeKuv2nrF5mYGjVoarCkXJ38SNoOeY+/umnXKvxMfBwWpx2cYT # gAnEtp/Nh4cku0+jSbl3ZpHxcpzpSwJSpzd+k1OsOx0ISQ+UzTl63f8lY5knLD0/ # a6fxZsNBzU+2QJshIUDQtxMkzdwdeDrknq3lNHGS1yZr5Dhzq6YBT70/O3itTK37 # xJV77QpfMzmHQXh6OOmc4d0j/R0o08f56PGYX/sr2H7yRp11LB4nLCbbbxV7HhmL # NriT1ObyF5lZynDwN7+YAN8gFk8n+2BnFqFmut1VwDophrCYoCvtlUG3OtUVmDG0 # YgkPCr2B2RP+v6TR81fZvAT6gt4y3wSJ8ADNXcL50CN/AAvkdgIm2fBldkKmKYcJ # RyvmfxqkhQ/8mJb2VVQrH4D6wPIOK+XW+6kvRBVK5xMOHds3OBqhK/bt1nz8MIIG # vzCCBKegAwIBAgIRAIFOQhehKX/tWszUF/iRrXUwDQYJKoZIhvcNAQELBQAwUzEL # MAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExKTAnBgNVBAMT # IEdsb2JhbFNpZ24gQ29kZSBTaWduaW5nIFJvb3QgUjQ1MB4XDTI0MDYxOTAzMjUx # MVoXDTM4MDcyODAwMDAwMFowWTELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2Jh # bFNpZ24gbnYtc2ExLzAtBgNVBAMTJkdsb2JhbFNpZ24gR0NDIFI0NSBDb2RlU2ln # bmluZyBDQSAyMDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA1kJN # +eNPxiP0bB2BpjD3SD3P0OWN5SAilgdENV0Gzw8dcGDmJlT6UyNgAqhfAgL3jslu # Pal4Bb2O9U8ZJJl8zxEWmx97a9Kje2hld6vYsSw/03IGMlxbrFBnLCVNVgY2/MFi # TH19hhaVml1UulDQsH+iRBnp1m5sPhPCnxHUXzRbUWgxYwr4W9DeullfMa+JaDhA # PgjoU2dOY7Yhju/djYVBVZ4cvDfclaDEcacfG6VJbgogWX6Jo1gVlwAlad/ewmpQ # ZU5T+2uhnxgeig5fVF694FvP8gwE0t4IoRAm97Lzei7CjpbBP86l2vRZKIw3ZaEx # lguOpHZ3FUmEZoIl50MKd1KxmVFC/6Gy3ZzS3BjZwYapQB1Bl2KGvKj/osdjFwb9 # Zno2lAEgiXgfkPR7qVJOak9UBiqAr57HUEL6ZQrjAfSxbqwOqOOBGag4yJ4DKIak # dKdHlX5yWip7FWocxGnmsL5AGZnL0n1VTiKcEOChW8OzLnqLxN7xSx+MKHkwRX9s # E7Y9LP8tSooq7CgPLcrUnJiKSm1aNiwv37rL4kFKCHcYiK01YZQS86Ry6+42nqdR # J5E896IazPyH5ZfhUYdp6SLMg8C3D0VsB+FDT9SMSs7PY7G1pBB6+Q0MKLBrNP4h # aCdv7Pj6JoRbdULNiSZ5WZ1rq2NxYpAlDQgg8f8CAwEAAaOCAYYwggGCMA4GA1Ud # DwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEFBQcDAzASBgNVHRMBAf8ECDAGAQH/ # AgEAMB0GA1UdDgQWBBTas43AJJCja3fTDKBZ3SFnZHYLeDAfBgNVHSMEGDAWgBQf # AL9GgAr8eDm3pbRD2VZQu86WOzCBkwYIKwYBBQUHAQEEgYYwgYMwOQYIKwYBBQUH # MAGGLWh0dHA6Ly9vY3NwLmdsb2JhbHNpZ24uY29tL2NvZGVzaWduaW5ncm9vdHI0 # NTBGBggrBgEFBQcwAoY6aHR0cDovL3NlY3VyZS5nbG9iYWxzaWduLmNvbS9jYWNl # cnQvY29kZXNpZ25pbmdyb290cjQ1LmNydDBBBgNVHR8EOjA4MDagNKAyhjBodHRw # Oi8vY3JsLmdsb2JhbHNpZ24uY29tL2NvZGVzaWduaW5ncm9vdHI0NS5jcmwwLgYD # VR0gBCcwJTAIBgZngQwBBAEwCwYJKwYBBAGgMgEyMAwGCisGAQQBoDIKBAIwDQYJ # KoZIhvcNAQELBQADggIBADIQ5LwXpYMQQJ3Tqf0nz0VyqcUfSzNZbywyMXlxhNY2 # Z9WrdPzU8gY6brXWy/FCg5a9fd6VLBrtauNBHKbIiTHCWWyJvCojA1lQR0n9b1MO # KijMSFTv8yMYW5I2TryjY9TD+wAPgNEgwsrllrrwmluqpCV6Gdv623tTT/m2o9lj # 1XVfAaUo27YYKRRleZzbtOuImBRTUGAxDGazUeNuySkmZPAU0XN4xISNPhSlklmr # eUFG6jTPgXZGOpF4GXO+/gb118GEOaBwTAo1AF7YKjAkHzJ3tuF837NGQeH6bY3j # 4wufL0DZpToNZMm+jNEayWUgOuIA+k56ITdBcJmdUB+Ze3WQdHNNRaVOWH/ddmqQ # WIlmk2Sj/lT3Tarr5SDuddeIsh0MPLyhkqBW5Ef8Zw/qeCnfj6PH2eMxeKcLKZRr # HCddISeH4qPvyECQLlwXKCXTAUQXq4DafJSoWyP8IJ6bkaGQ/7MN5XJELEcV89SR # cib58gXjAWf3abXeBbb+KJCMf6EpO7cs2mQiaZbE9NNXDSqFxrtoaKyL8VJLZG6q # uLfsTRQc+qgUOM7sJevkYt01+bh7B10bQ2cCCGs9vyUjg4GWcwfu/lhaPDfaoNtf # 0pw6RpKcxCYcCTDaJeQOHZBz1B6HTmmEgZHNZX7nNfqDgGrTNB1Gp3gIpngyJWZ6 # MIIGwjCCBKqgAwIBAgIQBUSv85SdCDmmv9s/X+VhFjANBgkqhkiG9w0BAQsFADBj # MQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMT # MkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5n # IENBMB4XDTIzMDcxNDAwMDAwMFoXDTM0MTAxMzIzNTk1OVowSDELMAkGA1UEBhMC # VVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMSAwHgYDVQQDExdEaWdpQ2VydCBU # aW1lc3RhbXAgMjAyMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKNT # RYcdg45brD5UsyPgz5/X5dLnXaEOCdwvSKOXejsqnGfcYhVYwamTEafNqrJq3RAp # ih5iY2nTWJw1cb86l+uUUI8cIOrHmjsvlmbjaedp/lvD1isgHMGXlLSlUIHyz8sH # pjBoyoNC2vx/CSSUpIIa2mq62DvKXd4ZGIX7ReoNYWyd/nFexAaaPPDFLnkPG2ZS # 48jWPl/aQ9OE9dDH9kgtXkV1lnX+3RChG4PBuOZSlbVH13gpOWvgeFmX40QrStWV # zu8IF+qCZE3/I+PKhu60pCFkcOvV5aDaY7Mu6QXuqvYk9R28mxyyt1/f8O52fTGZ # ZUdVnUokL6wrl76f5P17cz4y7lI0+9S769SgLDSb495uZBkHNwGRDxy1Uc2qTGaD # iGhiu7xBG3gZbeTZD+BYQfvYsSzhUa+0rRUGFOpiCBPTaR58ZE2dD9/O0V6MqqtQ # FcmzyrzXxDtoRKOlO0L9c33u3Qr/eTQQfqZcClhMAD6FaXXHg2TWdc2PEnZWpST6 # 18RrIbroHzSYLzrqawGw9/sqhux7UjipmAmhcbJsca8+uG+W1eEQE/5hRwqM/vC2 # x9XH3mwk8L9CgsqgcT2ckpMEtGlwJw1Pt7U20clfCKRwo+wK8REuZODLIivK8SgT # IUlRfgZm0zu++uuRONhRB8qUt+JQofM604qDy0B7AgMBAAGjggGLMIIBhzAOBgNV # HQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcD # CDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwHwYDVR0jBBgwFoAU # uhbZbU2FL3MpdpovdYxqII+eyG8wHQYDVR0OBBYEFKW27xPn783QZKHVVqllMaPe # 1eNJMFoGA1UdHwRTMFEwT6BNoEuGSWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9E # aWdpQ2VydFRydXN0ZWRHNFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcmww # gZAGCCsGAQUFBwEBBIGDMIGAMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp # Y2VydC5jb20wWAYIKwYBBQUHMAKGTGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNv # bS9EaWdpQ2VydFRydXN0ZWRHNFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5j # cnQwDQYJKoZIhvcNAQELBQADggIBAIEa1t6gqbWYF7xwjU+KPGic2CX/yyzkzepd # IpLsjCICqbjPgKjZ5+PF7SaCinEvGN1Ott5s1+FgnCvt7T1IjrhrunxdvcJhN2hJ # d6PrkKoS1yeF844ektrCQDifXcigLiV4JZ0qBXqEKZi2V3mP2yZWK7Dzp703DNiY # dk9WuVLCtp04qYHnbUFcjGnRuSvExnvPnPp44pMadqJpddNQ5EQSviANnqlE0Pjl # SXcIWiHFtM+YlRpUurm8wWkZus8W8oM3NG6wQSbd3lqXTzON1I13fXVFoaVYJmoD # Rd7ZULVQjK9WvUzF4UbFKNOt50MAcN7MmJ4ZiQPq1JE3701S88lgIcRWR+3aEUuM # MsOI5ljitts++V+wQtaP4xeR0arAVeOGv6wnLEHQmjNKqDbUuXKWfpd5OEhfysLc # PTLfddY2Z1qJ+Panx+VPNTwAvb6cKmx5AdzaROY63jg7B145WPR8czFVoIARyxQM # fq68/qTreWWqaNYiyjvrmoI1VygWy2nyMpqy0tg6uLFGhmu6F/3Ed2wVbK6rr3M6 # 6ElGt9V/zLY4wNjsHPW2obhDLN9OTH0eaHDAdwrUAuBcYLso/zjlUlrWrBciI070 # 7NMX+1Br/wd3H3GXREHJuEbTbDJ8WC9nR2XlG3O2mflrLAZG70Ee8PBf4NvZrZCA # RK+AEEGKMIIG6zCCBNOgAwIBAgIMfDeOzfSMBpXQEWmrMA0GCSqGSIb3DQEBCwUA # MFkxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMS8wLQYD # VQQDEyZHbG9iYWxTaWduIEdDQyBSNDUgQ29kZVNpZ25pbmcgQ0EgMjAyMDAeFw0y # NDA5MTkxMjE3MjJaFw0yNTEwMjcwODE1NTlaMFkxCzAJBgNVBAYTAkZSMREwDwYD # VQQIEwhNb3JiaWhhbjEPMA0GA1UEBxMGVmFubmVzMRIwEAYDVQQKEwlCUklDS0xF # QUQxEjAQBgNVBAMTCUJSSUNLTEVBRDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC # AgoCggIBANysgL1dmPiIH07tM4uKTz5r2+xZ0EHWijxeWhGiJAb0DvOSfJX08pqk # b3Q8MMcmSgTIggnzr68GzO8oU9JqM8+uHFJUVsAWMptAa8FxaUI0q9/8MdVKOoTk # RmyDGBMKbgDdYf+YVbLeYmsE267LQeOF1koiSmK7WRkytnjwbOZMFr/qObysIL6D # nMiM802AC4dFP1Z6hDKJuAu1mOmSZpqgBQZ4atM2TiOBw2qApZHbbur+bM2fEah2 # j46TIjTiQZ/YD7Sznuv2feHDB9h3on8MMWff8POZURkZRFbJRn8EUk/S4+3xRLE2 # ylNuYIg6gFW1QJaaUEU90ay1hLdfFJLF5WMnRyFaTaJwX3cYjP8khR/vbA966bQ4 # l0lHMbf2tLUpeMShi0vr5f1vOqSZ10qR3hzYyYMLSmj/dIHFR3ngprG5QTcjfIwF # Sdro8Aij0HYmN1tQ6HC8rV4yUJ8pDzKayQy5JDIKVYfq9jwaD45KGLUUtrot1lCP # I9Zm0Hf6lMjGBLpM16MKK8U9E8ZXz5gseqUaMJg4g34vl+gbEObOPdGtbEVicEqi # p1mSHseRHrDIOzTNA8IzI9F10csChBOlVfGZZYLZTN2DJQyhYdm6gEFzrNmBE48r # H+Fzdcf4J1VvRgDrxSAdtpVLqbe5iR996zpfb/50JtGrc3e59YmxAgMBAAGjggGx # MIIBrTAOBgNVHQ8BAf8EBAMCB4AwgZsGCCsGAQUFBwEBBIGOMIGLMEoGCCsGAQUF # BzAChj5odHRwOi8vc2VjdXJlLmdsb2JhbHNpZ24uY29tL2NhY2VydC9nc2djY3I0 # NWNvZGVzaWduY2EyMDIwLmNydDA9BggrBgEFBQcwAYYxaHR0cDovL29jc3AuZ2xv # YmFsc2lnbi5jb20vZ3NnY2NyNDVjb2Rlc2lnbmNhMjAyMDBWBgNVHSAETzBNMEEG # CSsGAQQBoDIBMjA0MDIGCCsGAQUFBwIBFiZodHRwczovL3d3dy5nbG9iYWxzaWdu # LmNvbS9yZXBvc2l0b3J5LzAIBgZngQwBBAEwCQYDVR0TBAIwADBFBgNVHR8EPjA8 # MDqgOKA2hjRodHRwOi8vY3JsLmdsb2JhbHNpZ24uY29tL2dzZ2NjcjQ1Y29kZXNp # Z25jYTIwMjAuY3JsMBMGA1UdJQQMMAoGCCsGAQUFBwMDMB8GA1UdIwQYMBaAFNqz # jcAkkKNrd9MMoFndIWdkdgt4MB0GA1UdDgQWBBT6laBcJjcU8FGox8y/wQdZCLUf # 2zANBgkqhkiG9w0BAQsFAAOCAgEAaJ+rcBMAnoJ+aDWDFOBe363c6HTqXcC5Rf4R # IJt/mbzGNBYDf6S2y+oA1q4mHJ/8TByYTKIvHKCQHFTvN1tl2zsulY7FtaeXC6PI # CPxXI5YujeYTAO6b9GMjCbxQ/IdJex6KJXuwHViTXP86G6ZwKAfczYXAmqRoC5cm # lt+XQy9bZNC5+GpKc6qvbVON1h7lWl1Y5Mm9rTvEzWNC06CRwZbhPeeFMRXs2/z9 # VtunN+S9k+uXLR/vaC2ptuZkZjacAK9GjX9Pbw+TJ1dxR8/0wq5eIXQfgEe/Q8ZR # 3LWUudZBsRWRIswUBsNjyfTI02B0vuG4tv8kuS+i45mtOPGZ5KZRquIGLjrhsOop # mbAFNOh+iBLCq1ouWoNqkqOMZq81PN3fYb4rTdKX9OogYQn0AQ4UXFsAChqEC4B1 # XhXy/TW7fRWWxZRA8HXbyvid8n/9XX7p56PFipX/HJDG85PVLg+h8CJmsjrNw6qq # 0M3949guYO79tylNhDEdI6eC5roGS4qReRsjvwYd+xUNM98oSCA8rXjMkLEZufRm # JVfJt+OiqEst933qbVeUyfN/tqbd1vpxwm1Owm5Dl0ap0GuAo01DEzlm8602Rw+Y # 7h53dsMMnQRrK4YLB6L1My2rUikqdtvzx7uUogzLDLAVR5hkpjF5DA6AeXNfpTJF # tbyN51kxggY/MIIGOwIBATBpMFkxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i # YWxTaWduIG52LXNhMS8wLQYDVQQDEyZHbG9iYWxTaWduIEdDQyBSNDUgQ29kZVNp # Z25pbmcgQ0EgMjAyMAIMfDeOzfSMBpXQEWmrMA0GCWCGSAFlAwQCAQUAoIGEMBgG # CisGAQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcC # AQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIE # IHZkTYLOQ/5f5gmcF+nciFscO9lb8AVBRihzkptPinGkMA0GCSqGSIb3DQEBAQUA # BIICAHNM43K1MYPVDJhlvX655kQ8AunO/cgjwK/i66ydP4ury+uSwQzJfguwGOk2 # dhpNrW2XhdrzupKY9rPkqKN2dbpWfrQ+DM4xuxMgGuqAWa6jemeuRYM0nMYLnkEg # fZHMlaHVsc5WFBwYJc/ppwwkWSBI9l1LQZz82JCicCrbrc0YgnERVAz6Acag1mdm # djOLw0iLIYfv3HGvM94n5UsbJtGCT1vy9lK4VWUCX6SszyF4rweBe0MVkFliATQz # kNPgYGudce6ijXbKxwhF/j5RIaCS2atY9i9bgrSrianOyBbqr7i/8h+pLR3vjFwg # bBDz2r6pcW/6DBzf8/1G5i5WBwH5is1tpHn+3SiuGtnYCZreeh5WBTFdUDg16eh6 # BYSEGQy1oAaMRQVl68u1UeALfAqTJXJF0flwsunpOiyBNpUPkAXy8coGsvTkYAM3 # 5OUA1VNa/grwmWcskeGwUMuZr+/XpOijlDJoH0vNXMqepygWV0vV+IVgq2z2eLS1 # nkhuWfGt3dMUufVc+EuutB8zjjNrPGN2QGcJN9Ls6nx9N6vEZfkJSYwAX6Y36FLo # bernkOxW/d6L0bskg/pUTf+sbbaIE17Jep6GGbQkT89qNXB9frJIIekWoepGdOZK # /hDSIviTWSxE6cXOZY+21PQboJa9BydoRQUx9HHnRrg56bUboYIDIDCCAxwGCSqG # SIb3DQEJBjGCAw0wggMJAgEBMHcwYzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRp # Z2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQw # OTYgU0hBMjU2IFRpbWVTdGFtcGluZyBDQQIQBUSv85SdCDmmv9s/X+VhFjANBglg # hkgBZQMEAgEFAKBpMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcN # AQkFMQ8XDTI0MTAwMjExNTYyNFowLwYJKoZIhvcNAQkEMSIEII/DkhTRhuC9fjK0 # //sMOL9ZxAM8r+1SEQ0GWMFK+ixpMA0GCSqGSIb3DQEBAQUABIICAGcSG/J016uc # dPYc9rtEUb0CzW0PO65LCz0ZDyTnNyp+GpioOIl7Cn+N0kOgWIL9B9prcOIaxzxh # lGb6DOGO5hkPTamZwcVtP04E6jTI9pZ49j744cohDqq1lPU9mcGrGYQmn+TyQvn+ # lgO4clMoSuGG1VCLLlXWbJMBziDArzRc8IkP81HWSRB261lEPF++a1wuGJDU/DsQ # hdczXUQEJOauDr3Z1xiHGdVs7GKiZEDFtBDpk+bbPZLRjDNoEbRxzIDTHICCclwe # uudAkgf/VuwjCFZayv71QX2SCWcYupp/Q+npCC1eVt/+PA/oCTmwk3aaCivAMFF3 # v4BNSiYDIO2KHOcIsUwiGuy09QZxmnBnHVTyNRSdF+NW4IW/nN+FU/+TFwZs917D # EHZefwDbSOz5C55cXmgsDLoo9lHv9PdbU2RWLN1vxamEpphGabLBtkpMNyBOo9JC # xGu5jEauzceQtD8N56fHeaO85fjrpvOiOfvASBKMelv6/ebz1W4JGndmrnG31Rhm # wSJ0sAFQ3to0K+iNFeO3AeRPnD6l+ss3Nx/lC0IuHgwCYKL5rwdqms9zLSP/40AP # HzFskOkm5rN8daYlNboqULW0iETzjmD7T8KpPpo/AKf3MmBw4XG6bpSE50b0xxps # pqXG3FELAz47wbj4OWr+j8jiyyc6ln3z # SIG # End signature block |