CompilerFolderHandling/Compile-AppWithBcCompilerFolder.ps1
<#
.Synopsis Compile app without docker (used by Run-AlPipeline to compile apps without docker) .Description .Parameter compilerFolder Folder in which compiler and dlls can be found (created by New-BcCompilerFolder) .Parameter appProjectFolder Location of the project. This folder (or any of its parents) needs to be shared with the container. .Parameter appOutputFolder Folder in which the output will be placed. This folder (or any of its parents) needs to be shared with the container. Default is $appProjectFolder\output. .Parameter appSymbolsFolder Folder in which the symbols of dependent apps will be placed. This folder (or any of its parents) needs to be shared with the container. Default is $appProjectFolder\symbols. .Parameter appName File name of the app. Default is to compose the file name from publisher_appname_version from app.json. .Parameter basePath Base Path of the files in the ALC output, to convert file paths to relative paths. This folder (or any of its parents) needs to be shared with the container. .Parameter UpdateDependencies Update the dependency version numbers to the actual version number used during compilation .Parameter CopyAppToSymbolsFolder Add this switch to copy the compiled app to the appSymbolsFolder. .Parameter GenerateReportLayout Add this switch to invoke report layout generation during compile. Default is default alc.exe behavior, which is to generate report layout .Parameter AzureDevOps Add this switch to convert the output to Azure DevOps Build Pipeline compatible output .Parameter gitHubActions Include this switch to convert the output to GitHub Actions compatible output .Parameter EnableCodeCop Add this switch to Enable CodeCop to run .Parameter EnableAppSourceCop Add this switch to Enable AppSourceCop to run .Parameter EnablePerTenantExtensionCop Add this switch to Enable PerTenantExtensionCop to run .Parameter EnableUICop Add this switch to Enable UICop to run .Parameter RulesetFile Specify a ruleset file for the compiler .Parameter enableExternalRulesets Add this switch to Enable External Rulesets .Parameter CustomCodeCops Add custom AL code Cops when compiling apps. .Parameter Failon Specify if you want Compilation to fail on Error or Warning .Parameter nowarn Specify a nowarn parameter for the compiler .Parameter preProcessorSymbols PreProcessorSymbols to set when compiling the app. .Parameter generatecrossreferences Include this flag to generate cross references when compiling .Parameter reportSuppressedDiagnostics Set reportSuppressedDiagnostics flag on ALC when compiling to ignore pragma warning disables .Parameter assemblyProbingPaths Specify a comma separated list of paths to include in the search for dotnet assemblies for the compiler .Parameter SourceRepositoryUrl Repository holding the source code for the app. Will be stamped into the app manifest. .Parameter SourceCommit The commit identifier for the source code for the app. Will be stamped into the app manifest. .Parameter BuildBy Information about which product built the app. Will be stamped into the app manifest. .Parameter BuildUrl The URL for the build job, which built the app. Will be stamped into the app manifest. .Parameter OutputTo Compiler output is sent to this scriptblock for output. Default value for the scriptblock is: { Param($line) Write-Host $line } .Example Compile-AppWithBcCompilerFolder -containerName test -credential $credential -appProjectFolder "C:\Users\freddyk\Documents\AL\Project1\Test" .Example Compile-AppWithBcCompilerFolder -containerName test -appProjectFolder "C:\Users\freddyk\Documents\AL\Test" .Example Compile-AppWithBcCompilerFolder -containerName test -appProjectFolder "C:\Users\freddyk\Documents\AL\Test" -outputTo { Param($line) if ($line -notlike "*sourcepath=C:\Users\freddyk\Documents\AL\Test\Org\*") { Write-Host $line } } #> function Compile-AppWithBcCompilerFolder { Param ( [Parameter(Mandatory=$true)] [string] $compilerFolder, [Parameter(Mandatory=$true)] [string] $appProjectFolder, [Parameter(Mandatory=$false)] [string] $appOutputFolder = (Join-Path $appProjectFolder "output"), [Parameter(Mandatory=$false)] [string] $appSymbolsFolder = (Join-Path $appProjectFolder ".alpackages"), [Parameter(Mandatory=$false)] [string] $appName = "", [string] $basePath = "", [switch] $UpdateDependencies, [switch] $CopyAppToSymbolsFolder, [ValidateSet('Yes','No','NotSpecified')] [string] $GenerateReportLayout = 'NotSpecified', [switch] $AzureDevOps = $bcContainerHelperConfig.IsAzureDevOps, [switch] $gitHubActions = $bcContainerHelperConfig.IsGitHubActions, [switch] $EnableCodeCop, [switch] $EnableAppSourceCop, [switch] $EnablePerTenantExtensionCop, [switch] $EnableUICop, [ValidateSet('none','error','warning')] [string] $FailOn = 'none', [Parameter(Mandatory=$false)] [string] $rulesetFile, [switch] $generateErrorLog, [switch] $enableExternalRulesets, [string[]] $CustomCodeCops = @(), [Parameter(Mandatory=$false)] [string] $nowarn, [string[]] $preProcessorSymbols = @(), [switch] $GenerateCrossReferences, [switch] $ReportSuppressedDiagnostics, [Parameter(Mandatory=$false)] [string] $assemblyProbingPaths, [Parameter(Mandatory=$false)] [ValidateSet('ExcludeGeneratedTranslations','GenerateCaptions','GenerateLockedTranslations','NoImplicitWith','TranslationFile','LcgTranslationFile')] [string[]] $features = @(), [string[]] $treatWarningsAsErrors = $bcContainerHelperConfig.TreatWarningsAsErrors, [string] $sourceRepositoryUrl = '', [string] $sourceCommit = '', [string] $buildBy = "BcContainerHelper,$BcContainerHelperVersion", [string] $buildUrl = '', [scriptblock] $outputTo = { Param($line) Write-Host $line } ) $telemetryScope = InitTelemetryScope -name $MyInvocation.InvocationName -parameterValues $PSBoundParameters -includeParameters @() try { $startTime = [DateTime]::Now if (!(Test-Path $compilerFolder)) { throw "CompilerFolder doesn't exist" } $dllsPath = Join-Path $compilerFolder 'dlls' $symbolsPath = Join-Path $compilerFolder 'symbols' $appJsonFile = Join-Path $appProjectFolder 'app.json' $appJsonObject = [System.IO.File]::ReadAllLines($appJsonFile) | ConvertFrom-Json if ("$appName" -eq "") { $appName = "$($appJsonObject.Publisher)_$($appJsonObject.Name)_$($appJsonObject.Version).app".Split([System.IO.Path]::GetInvalidFileNameChars()) -join '' } if ([bool]($appJsonObject.PSobject.Properties.name -eq "id")) { AddTelemetryProperty -telemetryScope $telemetryScope -key "id" -value $appJsonObject.id } elseif ([bool]($appJsonObject.PSobject.Properties.name -eq "appid")) { AddTelemetryProperty -telemetryScope $telemetryScope -key "id" -value $appJsonObject.appid } AddTelemetryProperty -telemetryScope $telemetryScope -key "publisher" -value $appJsonObject.Publisher AddTelemetryProperty -telemetryScope $telemetryScope -key "name" -value $appJsonObject.Name AddTelemetryProperty -telemetryScope $telemetryScope -key "version" -value $appJsonObject.Version AddTelemetryProperty -telemetryScope $telemetryScope -key "appname" -value $appName if (!(Test-Path $appOutputFolder -PathType Container)) { New-Item $appOutputFolder -ItemType Directory | Out-Null } Write-Host "Using Symbols Folder: $appSymbolsFolder" if (!(Test-Path -Path $appSymbolsFolder -PathType Container)) { New-Item -Path $appSymbolsFolder -ItemType Directory | Out-Null } $dependencies = @() if (([bool]($appJsonObject.PSobject.Properties.name -eq "application")) -and $appJsonObject.application) { AddTelemetryProperty -telemetryScope $telemetryScope -key "application" -value $appJsonObject.application $dependencies += @{"publisher" = "Microsoft"; "name" = "Application"; "appId" = ''; "version" = $appJsonObject.application } } if (([bool]($appJsonObject.PSobject.Properties.name -eq "platform")) -and $appJsonObject.platform) { AddTelemetryProperty -telemetryScope $telemetryScope -key "platform" -value $appJsonObject.platform $dependencies += @{"publisher" = "Microsoft"; "name" = "System"; "appId" = ''; "version" = $appJsonObject.platform } } if (([bool]($appJsonObject.PSobject.Properties.name -eq "dependencies")) -and $appJsonObject.dependencies) { $appJsonObject.dependencies | ForEach-Object { $dep = $_ try { $appId = $dep.id } catch { $appId = $dep.appId } $dependencies += @{ "publisher" = $dep.publisher; "name" = $dep.name; "appId" = $appId; "version" = $dep.version } } } Write-Host "Enumerating Apps in CompilerFolder $symbolsPath" $compilerFolderAppFiles = @(Get-ChildItem -Path (Join-Path $symbolsPath '*.app') | Select-Object -ExpandProperty FullName) $compilerFolderApps = @(GetAppInfo -AppFiles $compilerFolderAppFiles -compilerFolder $compilerFolder -cacheAppinfoPath (Join-Path $symbolsPath 'cache_AppInfo.json')) Write-Host "Enumerating Apps in Symbols Folder $appSymbolsFolder" $existingAppFiles = @(Get-ChildItem -Path (Join-Path $appSymbolsFolder '*.app') | Select-Object -ExpandProperty FullName) $existingApps = @(GetAppInfo -AppFiles $existingAppFiles -compilerFolder $compilerFolder -cacheAppinfoPath (Join-Path $appSymbolsFolder 'cache_AppInfo.json')) $depidx = 0 while ($depidx -lt $dependencies.Count) { $dependency = $dependencies[$depidx] Write-Host "Processing dependency $($dependency.Publisher)_$($dependency.Name)_$($dependency.Version) ($($dependency.AppId))" $existingApp = $existingApps | Where-Object { ((($dependency.appId -ne '' -and $_.AppId -eq $dependency.appId) -or ($dependency.appId -eq '' -and $_.Name -eq $dependency.Name)) -and ([System.Version]$_.Version -ge [System.Version]$dependency.version)) } if ($existingApp) { Write-Host "Dependency App exists" } else { Write-Host "Dependency App not found" $copyCompilerFolderApps = @($compilerFolderApps | Where-Object { ((($dependency.appId -ne '' -and $_.AppId -eq $dependency.appId) -or ($dependency.appId -eq '' -and $_.Name -eq $dependency.Name)) -and ([System.Version]$_.Version -ge [System.Version]$dependency.version)) }) $copyCompilerFolderApps | ForEach-Object { $copyCompilerFolderApp = $_ $existingApps += $copyCompilerFolderApp Write-Host "Copying $($copyCompilerFolderApp.path) to $appSymbolsFolder" Copy-Item -Path $copyCompilerFolderApp.path -Destination $appSymbolsFolder -Force if ($copyCompilerFolderApp.Application) { if (!($dependencies | where-Object { $_.Name -eq 'Application'})) { $dependencies += @{"publisher" = "Microsoft"; "name" = "Application"; "appId" = ''; "version" = $copyCompilerFolderApp.Application } } } if (!($dependencies | where-Object { $_.Name -eq 'System'})) { $dependencies += @{"publisher" = "Microsoft"; "name" = "System"; "appId" = ''; "version" = $copyCompilerFolderApp.Platform } } $copyCompilerFolderApp.Dependencies | ForEach-Object { $addDependency = $_ try { $appId = $addDependency.id } catch { $appId = $addDependency.appid } $dependencyExists = $dependencies | Where-Object { $_.appId -eq $appId } if (-not $dependencyExists) { Write-Host "Adding dependency to $($addDependency.Name) from $($addDependency.Publisher)" $dependencies += @($compilerFolderApps | Where-Object { $_.appId -eq $appId }) } } } } $depidx++ } $systemSymbolsApp = @($existingApps | Where-Object { $_.Name -eq "System" }) if ($systemSymbolsApp.Count -ne 1) { throw "Unable to locate system symbols" } $platformversion = $systemSymbolsApp.Version Write-Host "Platform version: $platformversion" $GenerateReportLayoutParam = "" if (($GenerateReportLayout -ne "NotSpecified") -and ($platformversion.Major -ge 14)) { if ($GenerateReportLayout -eq "Yes") { $GenerateReportLayoutParam = "/GenerateReportLayout+" } else { $GenerateReportLayoutParam = "/GenerateReportLayout-" } } if ($updateDependencies) { $appJsonFile = Join-Path $appProjectFolder 'app.json' $appJsonObject = [System.IO.File]::ReadAllLines($appJsonFile) | ConvertFrom-Json $changes = $false Write-Host "Modifying Dependencies" if (([bool]($appJsonObject.PSobject.Properties.name -eq "dependencies")) -and $appJsonObject.dependencies) { $appJsonObject.dependencies = @($appJsonObject.dependencies | ForEach-Object { $dependency = $_ $dependencyAppId = "$(if ($dependency.PSObject.Properties.name -eq 'AppId') { $dependency.AppId } else { $dependency.Id })" Write-Host "Dependency: Id=$dependencyAppId, Publisher=$($dependency.Publisher), Name=$($dependency.Name), Version=$($dependency.Version)" $existingApps | Where-Object { $_.AppId -eq [System.Guid]$dependencyAppId -and $_.Version -gt [System.Version]$dependency.Version } | ForEach-Object { $dependency.Version = "$($_.Version)" Write-Host "- Set dependency version to $($_.Version)" $changes = $true } $dependency }) } if (([bool]($appJsonObject.PSobject.Properties.name -eq "application")) -and $appJsonObject.application) { Write-Host "Application Dependency $($appJsonObject.application)" $existingApps | Where-Object { $_.Name -eq "Application" -and $_.Version -gt [System.Version]$appJsonObject.application } | ForEach-Object { $appJsonObject.Application = "$($_.Version)" Write-Host "- Set Application dependency to $($_.Version)" $changes = $true } } if (([bool]($appJsonObject.PSobject.Properties.name -eq "platform")) -and $appJsonObject.platform) { Write-Host "Platform Dependency $($appJsonObject.platform)" $existingApps | Where-Object { $_.Name -eq "System" -and $_.Version -gt [System.Version]$appJsonObject.platform } | ForEach-Object { $appJsonObject.platform = "$($_.Version)" Write-Host "- Set Platform dependency to $($_.Version)" $changes = $true } } if ($changes) { Write-Host "Updating app.json" $appJsonObject | ConvertTo-Json -depth 99 | Set-Content $appJsonFile -encoding UTF8 } } $probingPaths = @() if ($assemblyProbingPaths) { $probingPaths += @($assemblyProbingPaths) } $netpackagesPath = Join-Path $appProjectFolder ".netpackages" if (Test-Path $netpackagesPath) { $probingPaths += @($netpackagesPath) } if (Test-Path $dllsPath) { $probingPaths += @((Join-Path $dllsPath "Service"),(Join-Path $dllsPath "Mock Assemblies")) } $sharedFolder = Join-Path $dllsPath "shared" if (Test-Path $sharedFolder) { $probingPaths = @((Join-Path $dllsPath "OpenXML"), $sharedFolder) + $probingPaths } elseif ($isLinux) { $probingPaths = @((Join-Path $dllsPath "OpenXML")) + $probingPaths } elseif ($platformversion.Major -ge 22) { if ($dotNetRuntimeVersionInstalled -ge [System.Version]$bcContainerHelperConfig.MinimumDotNetRuntimeVersionStr) { $probingPaths = @((Join-Path $dllsPath "OpenXML"), "C:\Program Files\dotnet\shared\Microsoft.NETCore.App\$dotNetRuntimeVersionInstalled", "C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App\$dotNetRuntimeVersionInstalled") + $probingPaths } else { $probingPaths = @((Join-Path $dllsPath "OpenXML")) + $probingPaths } } else { $probingPaths = @((Join-Path $dllsPath "OpenXML"), 'C:\Windows\Microsoft.NET\Assembly') + $probingPaths } $assemblyProbingPaths = $probingPaths -join ',' $appOutputFile = Join-Path $appOutputFolder $appName if (Test-Path -Path $appOutputFile -PathType Leaf) { Remove-Item -Path $appOutputFile -Force } Write-Host "Compiling..." $alcParameters = @() $binPath = Join-Path $compilerFolder 'compiler/extension/bin' $alcPath = Join-Path $binPath 'win32' $alcExe = 'alc.exe' $alcCmd = ".\$alcExe" if (-not (Test-Path $alcPath)) { $alcPath = $binPath } if ($isLinux) { $linuxPath = Join-Path $binPath 'linux' if (Test-Path $linuxPath) { $alcPath = $linuxPath $alcExe = 'alc' $alcCmd = "./$alcExe" } else { $alcCmd = "dotnet" $alcExe = 'alc.dll' $alcParameters += @((Join-Path $alcPath $alcExe)) Write-Host "No Linux version of alc found. Using dotnet to run alc.dll." } } $alcItem = Get-Item -Path (Join-Path $alcPath $alcExe) [System.Version]$alcVersion = $alcItem.VersionInfo.FileVersion $alcParameters += @("/project:""$($appProjectFolder.TrimEnd('/\'))""", "/packagecachepath:""$($appSymbolsFolder.TrimEnd('/\'))""", "/out:""$appOutputFile""") if ($GenerateReportLayoutParam) { $alcParameters += @($GenerateReportLayoutParam) } if ($EnableCodeCop) { $alcParameters += @("/analyzer:$(Join-Path $binPath 'Analyzers\Microsoft.Dynamics.Nav.CodeCop.dll')") } if ($EnableAppSourceCop) { $alcParameters += @("/analyzer:$(Join-Path $binPath 'Analyzers\Microsoft.Dynamics.Nav.AppSourceCop.dll')") } if ($EnablePerTenantExtensionCop) { $alcParameters += @("/analyzer:$(Join-Path $binPath 'Analyzers\Microsoft.Dynamics.Nav.PerTenantExtensionCop.dll')") } if ($EnableUICop) { $alcParameters += @("/analyzer:$(Join-Path $binPath 'Analyzers\Microsoft.Dynamics.Nav.UICop.dll')") } if ($CustomCodeCops.Count -gt 0) { $CustomCodeCops | ForEach-Object { $analyzerFileName = $_ if ($_ -like 'https://*') { $analyzerFileName = Join-Path $binPath "Analyzers/$(Split-Path $_ -Leaf)" Download-File -SourceUrl $_ -destinationFile $analyzerFileName } $alcParameters += @("/analyzer:$analyzerFileName") } } if ($rulesetFile) { $alcParameters += @("/ruleset:$rulesetfile") } if ($enableExternalRulesets) { $alcParameters += @("/enableexternalrulesets") } if ($nowarn) { $alcParameters += @("/nowarn:$nowarn") } if ($generateErrorLog) { $errorLogFilePath = $appOutputFile -replace '.app$', '.errorLog.json' $alcParameters += @("/errorLog:""$errorLogFilePath""") } if ($GenerateCrossReferences -and $platformversion.Major -ge 18) { $alcParameters += @("/generatecrossreferences") } if ($ReportSuppressedDiagnostics) { if ($alcVersion -ge [System.Version]"9.1.0.0") { $alcParameters += @("/reportsuppresseddiagnostics") } else { Write-Host -ForegroundColor Yellow "ReportSuppressedDiagnostics was specified, but the version of the AL Language Extension does not support this. Get-LatestAlLanguageExtensionUrl returns a location for the latest AL Language Extension" } } if ($alcVersion -ge [System.Version]"12.0.12.41479") { if ($sourceRepositoryUrl) { $alcParameters += @("/SourceRepositoryUrl:""$sourceRepositoryUrl""") } if ($sourceCommit) { $alcParameters += @("/SourceCommit:""$sourceCommit""") } if ($buildBy) { $alcParameters += @("/BuildBy:""$buildBy""") } if ($buildUrl) { $alcParameters += @("/BuildUrl:""$buildUrl""") } } if ($assemblyProbingPaths) { $alcParameters += @("/assemblyprobingpaths:$assemblyProbingPaths") } if ($features) { $alcParameters +=@("/features:$($features -join ',')") } $preprocessorSymbols | where-Object { $_ } | ForEach-Object { $alcParameters += @("/D:$_") } Push-Location -Path $alcPath try { Write-Host "$alcCmd $([string]::Join(' ', $alcParameters))" $result = & $alcCmd $alcParameters } finally { Pop-Location } if ($lastexitcode -ne 0 -and $lastexitcode -ne -1073740791) { "App generation failed with exit code $lastexitcode" } if ($treatWarningsAsErrors) { $regexp = ($treatWarningsAsErrors | ForEach-Object { if ($_ -eq '*') { ".*" } else { $_ } }) -join '|' $result = $result | ForEach-Object { $_ -replace "^(.*)warning ($regexp):(.*)`$", '$1error $2:$3' } } $devOpsResult = "" if ($result) { $Parameters = @{ "FailOn" = $FailOn "AlcOutput" = $result "DoNotWriteToHost" = $true } if ($gitHubActions) { $Parameters += @{ "gitHubActions" = $true } if (-not $basePath) { $basePath = $ENV:GITHUB_WORKSPACE } } if ($basePath) { $Parameters += @{ "basePath" = $basePath } } $devOpsResult = Convert-ALCOutputToAzureDevOps @Parameters } if ($AzureDevOps -or $gitHubActions) { $devOpsResult | ForEach-Object { $outputTo.Invoke($_) } } else { $result | ForEach-Object { $outputTo.Invoke($_) } if ($devOpsResult -like "*task.complete result=Failed*") { throw "App generation failed" } } $result | Where-Object { $_ -like "App generation failed*" } | ForEach-Object { throw $_ } $timespend = [Math]::Round([DateTime]::Now.Subtract($startTime).Totalseconds) $appFile = Join-Path $appOutputFolder $appName if (Test-Path -Path $appFile) { Write-Host "$appFile successfully created in $timespend seconds" if ($CopyAppToSymbolsFolder) { Copy-Item -Path $appFile -Destination $appSymbolsFolder -ErrorAction SilentlyContinue } } else { throw "App generation failed" } $appFile } catch { TrackException -telemetryScope $telemetryScope -errorRecord $_ throw } finally { TrackTrace -telemetryScope $telemetryScope } } Export-ModuleMember -Function Compile-AppWithBcCompilerFolder # SIG # Begin signature block # MIImbAYJKoZIhvcNAQcCoIImXTCCJlkCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCLHJU99zM49gHT # fA4D61z3RQCF++a1+NU65nP7YaG8GKCCH4QwggWNMIIEdaADAgECAhAOmxiO+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 # twGpn1eqXijiuZQwggYaMIIEAqADAgECAhBiHW0MUgGeO5B5FSCJIRwKMA0GCSqG # SIb3DQEBDAUAMFYxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0 # ZWQxLTArBgNVBAMTJFNlY3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBSb290IFI0 # NjAeFw0yMTAzMjIwMDAwMDBaFw0zNjAzMjEyMzU5NTlaMFQxCzAJBgNVBAYTAkdC # MRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxKzApBgNVBAMTIlNlY3RpZ28gUHVi # bGljIENvZGUgU2lnbmluZyBDQSBSMzYwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAw # ggGKAoIBgQCbK51T+jU/jmAGQ2rAz/V/9shTUxjIztNsfvxYB5UXeWUzCxEeAEZG # bEN4QMgCsJLZUKhWThj/yPqy0iSZhXkZ6Pg2A2NVDgFigOMYzB2OKhdqfWGVoYW3 # haT29PSTahYkwmMv0b/83nbeECbiMXhSOtbam+/36F09fy1tsB8je/RV0mIk8XL/ # tfCK6cPuYHE215wzrK0h1SWHTxPbPuYkRdkP05ZwmRmTnAO5/arnY83jeNzhP06S # hdnRqtZlV59+8yv+KIhE5ILMqgOZYAENHNX9SJDm+qxp4VqpB3MV/h53yl41aHU5 # pledi9lCBbH9JeIkNFICiVHNkRmq4TpxtwfvjsUedyz8rNyfQJy/aOs5b4s+ac7I # H60B+Ja7TVM+EKv1WuTGwcLmoU3FpOFMbmPj8pz44MPZ1f9+YEQIQty/NQd/2yGg # W+ufflcZ/ZE9o1M7a5Jnqf2i2/uMSWymR8r2oQBMdlyh2n5HirY4jKnFH/9gRvd+ # QOfdRrJZb1sCAwEAAaOCAWQwggFgMB8GA1UdIwQYMBaAFDLrkpr/NZZILyhAQnAg # NpFcF4XmMB0GA1UdDgQWBBQPKssghyi47G9IritUpimqF6TNDDAOBgNVHQ8BAf8E # BAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADATBgNVHSUEDDAKBggrBgEFBQcDAzAb # BgNVHSAEFDASMAYGBFUdIAAwCAYGZ4EMAQQBMEsGA1UdHwREMEIwQKA+oDyGOmh0 # dHA6Ly9jcmwuc2VjdGlnby5jb20vU2VjdGlnb1B1YmxpY0NvZGVTaWduaW5nUm9v # dFI0Ni5jcmwwewYIKwYBBQUHAQEEbzBtMEYGCCsGAQUFBzAChjpodHRwOi8vY3J0 # LnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2RlU2lnbmluZ1Jvb3RSNDYucDdj # MCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0aWdvLmNvbTANBgkqhkiG9w0B # AQwFAAOCAgEABv+C4XdjNm57oRUgmxP/BP6YdURhw1aVcdGRP4Wh60BAscjW4HL9 # hcpkOTz5jUug2oeunbYAowbFC2AKK+cMcXIBD0ZdOaWTsyNyBBsMLHqafvIhrCym # laS98+QpoBCyKppP0OcxYEdU0hpsaqBBIZOtBajjcw5+w/KeFvPYfLF/ldYpmlG+ # vd0xqlqd099iChnyIMvY5HexjO2AmtsbpVn0OhNcWbWDRF/3sBp6fWXhz7DcML4i # TAWS+MVXeNLj1lJziVKEoroGs9Mlizg0bUMbOalOhOfCipnx8CaLZeVme5yELg09 # Jlo8BMe80jO37PU8ejfkP9/uPak7VLwELKxAMcJszkyeiaerlphwoKx1uHRzNyE6 # bxuSKcutisqmKL5OTunAvtONEoteSiabkPVSZ2z76mKnzAfZxCl/3dq3dUNw4rg3 # sTCggkHSRqTqlLMS7gjrhTqBmzu1L90Y1KWN/Y5JKdGvspbOrTfOXyXvmPL6E52z # 1NZJ6ctuMFBQZH3pwWvqURR8AgQdULUvrxjUYbHHj95Ejza63zdrEcxWLDX6xWls # /GDnVNueKjWUH3fTv1Y8Wdho698YADR7TNx8X8z2Bev6SivBBOHY+uqiirZtg0y9 # ShQoPzmCcn63Syatatvx157YK9hlcPmVoa1oDE5/L9Uo2bC5a4CH2RwwggZZMIIE # waADAgECAhANIM3qwHRbWKHw+Zq6JhzlMA0GCSqGSIb3DQEBDAUAMFQxCzAJBgNV # BAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxKzApBgNVBAMTIlNlY3Rp # Z28gUHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYwHhcNMjExMDIyMDAwMDAwWhcN # MjQxMDIxMjM1OTU5WjBdMQswCQYDVQQGEwJESzEUMBIGA1UECAwLSG92ZWRzdGFk # ZW4xGzAZBgNVBAoMEkZyZWRkeSBLcmlzdGlhbnNlbjEbMBkGA1UEAwwSRnJlZGR5 # IEtyaXN0aWFuc2VuMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAgYC5 # tlg+VRktRRkahxxaV8+DAd6vHoDpcO6w7yT24lnSoMuA6nR7kgy90Y/sHIwKE9Ww # t/px/GAY8eBePWjJrFpG8fBtJbXadRTVd/470Hs/q9t+kh6A/0ELj7wYsKSNOyuF # Poy4rtClOv9ZmrRpoDVnh8Epwg2DpklX2BNzykzBQxIbkpp+xVo2mhPNWDIesntc # 4/BnSebLGw1Vkxmu2acKkIjYrne/7lsuyL9ue0vk8TGk9JBPNPbGKJvHu9szP9oG # oH36fU1sEZ+AacXrp+onsyPf/hkkpAMHAhzQHl+5Ikvcus/cDm06twm7VywmZcas # 2rFAV5MyE6WMEaYAolwAHiPz9WAs2GDhFtZZg1tzbRjJIIgPpR+doTIcpcDBcHnN # dSdgWKrTkr2f339oT5bnJfo7oVzc/2HGWvb8Fom6LQAqSC11vWmznHYsCm72g+fo # TKqW8lLDfLF0+aFvToLosrtW9l6Z+l+RQ8MtJ9EHOm2Ny8cFLzZCDZYw32BydwcL # V5rKdy4Ica9on5xZvyMOLiFwuL4v2V4pjEgKJaGSS/IVSMEGjrM9DHT6YS4/oq9q # 20rQUmMZZQmGmEyyKQ8t11si8VHtScN5m0Li8peoWfCU9mRFxSESwTWow8d462+o # 9/SzmDxCACdFwzvfKx4JqDMm55cL+beunIvc0NsCAwEAAaOCAZwwggGYMB8GA1Ud # IwQYMBaAFA8qyyCHKLjsb0iuK1SmKaoXpM0MMB0GA1UdDgQWBBTZD6uy9ZWIIqQh # 3srYu1FlUhdM0TAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIwADATBgNVHSUE # DDAKBggrBgEFBQcDAzARBglghkgBhvhCAQEEBAMCBBAwSgYDVR0gBEMwQTA1Bgwr # BgEEAbIxAQIBAwIwJTAjBggrBgEFBQcCARYXaHR0cHM6Ly9zZWN0aWdvLmNvbS9D # UFMwCAYGZ4EMAQQBMEkGA1UdHwRCMEAwPqA8oDqGOGh0dHA6Ly9jcmwuc2VjdGln # by5jb20vU2VjdGlnb1B1YmxpY0NvZGVTaWduaW5nQ0FSMzYuY3JsMHkGCCsGAQUF # BwEBBG0wazBEBggrBgEFBQcwAoY4aHR0cDovL2NydC5zZWN0aWdvLmNvbS9TZWN0 # aWdvUHVibGljQ29kZVNpZ25pbmdDQVIzNi5jcnQwIwYIKwYBBQUHMAGGF2h0dHA6 # Ly9vY3NwLnNlY3RpZ28uY29tMA0GCSqGSIb3DQEBDAUAA4IBgQASEbZACurQeQN8 # WDTR+YyNpoQ29YAbbdBRhhzHkT/1ao7LE0QIOgGR4GwKRzufCAwu8pCBiMOUTDHT # ezkh0rQrG6khxBX2nSTBL5i4LwKMR08HgZBsbECciABy15yexYWoB/D0H8WuGe63 # PhGWueR4IFPbIz+jEVxfW0Nyyr7bXTecpKd1iprm+TOmzc2E6ab95dkcXdJVx6Zy # s++QrrOfQ+a57qEXkS/wnjjbN9hukL0zg+g8L4DHLKTodzfiQOampvV8QzbnB7Y8 # YjNcxR9s/nptnlQH3jorNFhktiBXvD62jc8pAIg6wyH6NxSMjtTsn7QhkIp2kusw # IQwD8hN/fZ/m6gkXZhRJWFr2WRZOz+edZ62Jf25C/NYWscwfBwn2hzRZf1HgyxkX # Al88dvvUA3kw1T6uo8aAB9IcL6Owiy7q4T+RLRF7oqx0vcw0193Yhq/gPOaUFlqz # ExP6TQ5TR9XWVPQk+a1B1ATKMLi1JShO6KWTmNkFkgkgpkW69BEwggauMIIElqAD # AgECAhAHNje3JFR82Ees/ShmKl5bMA0GCSqGSIb3DQEBCwUAMGIxCzAJBgNVBAYT # AlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2Vy # dC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yMjAz # MjMwMDAwMDBaFw0zNzAzMjIyMzU5NTlaMGMxCzAJBgNVBAYTAlVTMRcwFQYDVQQK # Ew5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgVHJ1c3RlZCBHNCBS # U0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBpbmcgQ0EwggIiMA0GCSqGSIb3DQEBAQUA # A4ICDwAwggIKAoICAQDGhjUGSbPBPXJJUVXHJQPE8pE3qZdRodbSg9GeTKJtoLDM # g/la9hGhRBVCX6SI82j6ffOciQt/nR+eDzMfUBMLJnOWbfhXqAJ9/UO0hNoR8XOx # s+4rgISKIhjf69o9xBd/qxkrPkLcZ47qUT3w1lbU5ygt69OxtXXnHwZljZQp09ns # ad/ZkIdGAHvbREGJ3HxqV3rwN3mfXazL6IRktFLydkf3YYMZ3V+0VAshaG43IbtA # rF+y3kp9zvU5EmfvDqVjbOSmxR3NNg1c1eYbqMFkdECnwHLFuk4fsbVYTXn+149z # k6wsOeKlSNbwsDETqVcplicu9Yemj052FVUmcJgmf6AaRyBD40NjgHt1biclkJg6 # OBGz9vae5jtb7IHeIhTZgirHkr+g3uM+onP65x9abJTyUpURK1h0QCirc0PO30qh # HGs4xSnzyqqWc0Jon7ZGs506o9UD4L/wojzKQtwYSH8UNM/STKvvmz3+DrhkKvp1 # KCRB7UK/BZxmSVJQ9FHzNklNiyDSLFc1eSuo80VgvCONWPfcYd6T/jnA+bIwpUzX # 6ZhKWD7TA4j+s4/TXkt2ElGTyYwMO1uKIqjBJgj5FBASA31fI7tk42PgpuE+9sJ0 # sj8eCXbsq11GdeJgo1gJASgADoRU7s7pXcheMBK9Rp6103a50g5rmQzSM7TNsQID # AQABo4IBXTCCAVkwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUuhbZbU2F # L3MpdpovdYxqII+eyG8wHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08w # DgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMIMHcGCCsGAQUFBwEB # BGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsG # AQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVz # dGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdp # Y2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAgBgNVHSAEGTAXMAgG # BmeBDAEEAjALBglghkgBhv1sBwEwDQYJKoZIhvcNAQELBQADggIBAH1ZjsCTtm+Y # qUQiAX5m1tghQuGwGC4QTRPPMFPOvxj7x1Bd4ksp+3CKDaopafxpwc8dB+k+YMjY # C+VcW9dth/qEICU0MWfNthKWb8RQTGIdDAiCqBa9qVbPFXONASIlzpVpP0d3+3J0 # FNf/q0+KLHqrhc1DX+1gtqpPkWaeLJ7giqzl/Yy8ZCaHbJK9nXzQcAp876i8dU+6 # WvepELJd6f8oVInw1YpxdmXazPByoyP6wCeCRK6ZJxurJB4mwbfeKuv2nrF5mYGj # VoarCkXJ38SNoOeY+/umnXKvxMfBwWpx2cYTgAnEtp/Nh4cku0+jSbl3ZpHxcpzp # SwJSpzd+k1OsOx0ISQ+UzTl63f8lY5knLD0/a6fxZsNBzU+2QJshIUDQtxMkzdwd # eDrknq3lNHGS1yZr5Dhzq6YBT70/O3itTK37xJV77QpfMzmHQXh6OOmc4d0j/R0o # 08f56PGYX/sr2H7yRp11LB4nLCbbbxV7HhmLNriT1ObyF5lZynDwN7+YAN8gFk8n # +2BnFqFmut1VwDophrCYoCvtlUG3OtUVmDG0YgkPCr2B2RP+v6TR81fZvAT6gt4y # 3wSJ8ADNXcL50CN/AAvkdgIm2fBldkKmKYcJRyvmfxqkhQ/8mJb2VVQrH4D6wPIO # K+XW+6kvRBVK5xMOHds3OBqhK/bt1nz8MIIGwjCCBKqgAwIBAgIQBUSv85SdCDmm # v9s/X+VhFjANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMO # RGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNB # NDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENBMB4XDTIzMDcxNDAwMDAwMFoXDTM0 # MTAxMzIzNTk1OVowSDELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJ # bmMuMSAwHgYDVQQDExdEaWdpQ2VydCBUaW1lc3RhbXAgMjAyMzCCAiIwDQYJKoZI # hvcNAQEBBQADggIPADCCAgoCggIBAKNTRYcdg45brD5UsyPgz5/X5dLnXaEOCdwv # SKOXejsqnGfcYhVYwamTEafNqrJq3RApih5iY2nTWJw1cb86l+uUUI8cIOrHmjsv # lmbjaedp/lvD1isgHMGXlLSlUIHyz8sHpjBoyoNC2vx/CSSUpIIa2mq62DvKXd4Z # GIX7ReoNYWyd/nFexAaaPPDFLnkPG2ZS48jWPl/aQ9OE9dDH9kgtXkV1lnX+3RCh # G4PBuOZSlbVH13gpOWvgeFmX40QrStWVzu8IF+qCZE3/I+PKhu60pCFkcOvV5aDa # Y7Mu6QXuqvYk9R28mxyyt1/f8O52fTGZZUdVnUokL6wrl76f5P17cz4y7lI0+9S7 # 69SgLDSb495uZBkHNwGRDxy1Uc2qTGaDiGhiu7xBG3gZbeTZD+BYQfvYsSzhUa+0 # rRUGFOpiCBPTaR58ZE2dD9/O0V6MqqtQFcmzyrzXxDtoRKOlO0L9c33u3Qr/eTQQ # fqZcClhMAD6FaXXHg2TWdc2PEnZWpST618RrIbroHzSYLzrqawGw9/sqhux7Ujip # mAmhcbJsca8+uG+W1eEQE/5hRwqM/vC2x9XH3mwk8L9CgsqgcT2ckpMEtGlwJw1P # t7U20clfCKRwo+wK8REuZODLIivK8SgTIUlRfgZm0zu++uuRONhRB8qUt+JQofM6 # 04qDy0B7AgMBAAGjggGLMIIBhzAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIw # ADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAgBgNVHSAEGTAXMAgGBmeBDAEEAjAL # BglghkgBhv1sBwEwHwYDVR0jBBgwFoAUuhbZbU2FL3MpdpovdYxqII+eyG8wHQYD # VR0OBBYEFKW27xPn783QZKHVVqllMaPe1eNJMFoGA1UdHwRTMFEwT6BNoEuGSWh0 # dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFJTQTQwOTZT # SEEyNTZUaW1lU3RhbXBpbmdDQS5jcmwwgZAGCCsGAQUFBwEBBIGDMIGAMCQGCCsG # AQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wWAYIKwYBBQUHMAKGTGh0 # dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFJTQTQw # OTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcnQwDQYJKoZIhvcNAQELBQADggIBAIEa # 1t6gqbWYF7xwjU+KPGic2CX/yyzkzepdIpLsjCICqbjPgKjZ5+PF7SaCinEvGN1O # tt5s1+FgnCvt7T1IjrhrunxdvcJhN2hJd6PrkKoS1yeF844ektrCQDifXcigLiV4 # JZ0qBXqEKZi2V3mP2yZWK7Dzp703DNiYdk9WuVLCtp04qYHnbUFcjGnRuSvExnvP # nPp44pMadqJpddNQ5EQSviANnqlE0PjlSXcIWiHFtM+YlRpUurm8wWkZus8W8oM3 # NG6wQSbd3lqXTzON1I13fXVFoaVYJmoDRd7ZULVQjK9WvUzF4UbFKNOt50MAcN7M # mJ4ZiQPq1JE3701S88lgIcRWR+3aEUuMMsOI5ljitts++V+wQtaP4xeR0arAVeOG # v6wnLEHQmjNKqDbUuXKWfpd5OEhfysLcPTLfddY2Z1qJ+Panx+VPNTwAvb6cKmx5 # AdzaROY63jg7B145WPR8czFVoIARyxQMfq68/qTreWWqaNYiyjvrmoI1VygWy2ny # Mpqy0tg6uLFGhmu6F/3Ed2wVbK6rr3M66ElGt9V/zLY4wNjsHPW2obhDLN9OTH0e # aHDAdwrUAuBcYLso/zjlUlrWrBciI0707NMX+1Br/wd3H3GXREHJuEbTbDJ8WC9n # R2XlG3O2mflrLAZG70Ee8PBf4NvZrZCARK+AEEGKMYIGPjCCBjoCAQEwaDBUMQsw # CQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSswKQYDVQQDEyJT # ZWN0aWdvIFB1YmxpYyBDb2RlIFNpZ25pbmcgQ0EgUjM2AhANIM3qwHRbWKHw+Zq6 # JhzlMA0GCWCGSAFlAwQCAQUAoIGEMBgGCisGAQQBgjcCAQwxCjAIoAKAAKECgAAw # GQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisG # AQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIK7xBh5INcH+Ii4GMuO7vfGnI/bqupKf # E6hqIFXXRHmaMA0GCSqGSIb3DQEBAQUABIICAGj0Oc/COSc3txfHol2AaWKZEgdP # dA+sBJOxEdCEgeUl++qY5dS2w89zHpRkUmUn0bcfXGW6wS/GJuTPJsKjlvEM5i0y # 3oIEiyeEEsG0VEmVMKmErHzoevmMteiTyPTw4RXx2gb9NXDeUoCKKGzBkQ2ksWTA # 3SQrgBGAHo+pXk69FpebIhxfM4dIOHukyslqb/7N4n282SK7TITQruroSkEyADiL # zzGELwFTdpNCOxKuZW30bDa5/qEmAdhglSkgDKWutyCA6R+AZ8mR7cXi2ONZje9L # Xh2XP/8TLkpCKwe/fwu7biN39DTK/IjrYHa3gv7fLzIrAc0yRXex4IYLqkvD26O0 # hzxeglntiT2tzRyOqS3+U5+W6HYy9cMxuKL8ehRjidcYca1b9U3NHaqwizgirSaz # AhEnSJDAkzX2ssBt9zrqiFt8uGSMsSyCBX4BT3tvXaoUMDji4wvLVkN6TeopLVBF # t2yYIkjVYKuaxYBeIM50/nvpwzeIket/Fh28uHn/OG9tpAIoZKsvBsqFJGEOhj/i # 7BA+GSfq66OSAlC4mZC6up0TAYHVRuy7m6d7J7ZYnfSOjV0JuiddjqNaENqPfoVj # r8vJTbMj+D69qgboCP5gZry3h6S9JPiieAZHQOsyeQnhRcc0mLY9RORIXYkH4ykk # C8eaj2mQBUxtg1ttoYIDIDCCAxwGCSqGSIb3DQEJBjGCAw0wggMJAgEBMHcwYzEL # MAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJE # aWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRpbWVTdGFtcGluZyBD # QQIQBUSv85SdCDmmv9s/X+VhFjANBglghkgBZQMEAgEFAKBpMBgGCSqGSIb3DQEJ # AzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTI0MDkyMzA2MDk0MVowLwYJ # KoZIhvcNAQkEMSIEIKKPl1A2o7AIMHUooWuwCJVvDdglOgFgL+bgFtaybefLMA0G # CSqGSIb3DQEBAQUABIICAJwiqNpTRubq/K6Lh1z3iSHEWSgM9lJMvTE9uBOYo2xC # IqtkaIQpB45Em0j+GUuNzn4P9TvcWxkfO+9UeBDDrmCKmuLB0C6BMmdaJHH26TcU # AfQDizduwjFAdOArpY+s3R8E1H3eTf/9nM9lTw/njz+R0g6MoKNE5BR8Y/io1N+Q # XYraGGi2jHfcZKqf4lHaIsRIcSLDDm34J0rIi6d9WA0XrfOw0Axcq2Dm2hL8Vk+d # KJT16yqx9rC99QA4jEGJGH9nHOYv7c73P56D3bgMZTlLnzN3RDizPgO/TW5eva+A # zEfgppL7Enjp/7q4e+MXpNUJo91ZnGm739wg/0kFF6JTBKgvtpk7FOvPD0fPvhRp # TlX/UoDPWd+rBPtGHwqkkfucbZmqdEO1azs/ZkozvB0qGfaPiWJ/On09+lNfCeZ5 # LcFI2sWSCoTyyziJXDzrQiyPZ30qEhyPNUwGSPdvasuRZ+nhsKFFky848WCEaATc # CShG6y+hzzrklwsTvPBRu7XY7tUS8PQaACxfE3GWa2EQgmXBzcfJY7J+8PtRCoz5 # G64IxwODV1mkmiBIdFRlg13tP04oWMmusxrL9nHZY7WJLyk5Ses4mqeUeDxyvp1a # 6OvZy/C8RFCQpwcrOADX4DzSaAiFH2cm/rp0S2GeWWZ08IX5DP/aOCaTurj3N/Qm # SIG # End signature block |