release-tool.ps1 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628
  1. <#
  2. .SYNOPSIS
  3. KeePassXC Release Tool
  4. .DESCRIPTION
  5. Commands:
  6. merge Merge release branch into main branch and create release tags
  7. build Build and package binary release from sources
  8. sign Sign previously compiled release packages
  9. .NOTES
  10. The following are descriptions of certain parameters:
  11. -Vcpkg Specify VCPKG toolchain location (example: C:\vcpkg)
  12. -Tag Release tag to check out (defaults to version number)
  13. -Snapshot Build current HEAD without checkout out Tag
  14. -CMakeGenerator Override the default CMake generator
  15. -CMakeOptions Additional CMake options for compiling the sources
  16. -CPackGenerators Set CPack generators (default: WIX;ZIP)
  17. -Compiler Compiler to use (example: g++, clang, msbuild)
  18. -MakeOptions Options to pass to the make program
  19. -SignBuild Perform platform specific App Signing before packaging
  20. -SignKey Specify the App Signing Key/Identity
  21. -TimeStamp Explicitly set the timestamp server to use for appsign
  22. -SourceBranch Source branch to merge from (default: 'release/$Version')
  23. -TargetBranch Target branch to merge to (default: master)
  24. -VSToolChain Specify Visual Studio Toolchain by name if more than one is available
  25. #>
  26. param(
  27. [Parameter(ParameterSetName = "merge", Mandatory, Position = 0)]
  28. [switch] $Merge,
  29. [Parameter(ParameterSetName = "build", Mandatory, Position = 0)]
  30. [switch] $Build,
  31. [Parameter(ParameterSetName = "sign", Mandatory, Position = 0)]
  32. [switch] $Sign,
  33. [Parameter(ParameterSetName = "merge", Mandatory, Position = 1)]
  34. [Parameter(ParameterSetName = "build", Mandatory, Position = 1)]
  35. [Parameter(ParameterSetName = "sign", Mandatory, Position = 1)]
  36. [string] $Version,
  37. [Parameter(ParameterSetName = "build", Mandatory)]
  38. [string] $Vcpkg,
  39. [Parameter(ParameterSetName = "sign", Mandatory)]
  40. [SupportsWildcards()]
  41. [string[]] $SignFiles,
  42. # [Parameter(ParameterSetName = "build")]
  43. # [switch] $DryRun,
  44. [Parameter(ParameterSetName = "build")]
  45. [switch] $Snapshot,
  46. [Parameter(ParameterSetName = "build")]
  47. [switch] $SignBuild,
  48. [Parameter(ParameterSetName = "build")]
  49. [string] $CMakeGenerator = "Ninja",
  50. [Parameter(ParameterSetName = "build")]
  51. [string] $CMakeOptions,
  52. [Parameter(ParameterSetName = "build")]
  53. [string] $CPackGenerators = "WIX;ZIP",
  54. [Parameter(ParameterSetName = "build")]
  55. [string] $Compiler,
  56. [Parameter(ParameterSetName = "build")]
  57. [string] $MakeOptions,
  58. [Parameter(ParameterSetName = "build")]
  59. [Parameter(ParameterSetName = "sign")]
  60. [string] $SignKey,
  61. [Parameter(ParameterSetName = "build")]
  62. [Parameter(ParameterSetName = "sign")]
  63. [string] $Timestamp = "http://timestamp.sectigo.com",
  64. [Parameter(ParameterSetName = "merge")]
  65. [Parameter(ParameterSetName = "build")]
  66. [Parameter(ParameterSetName = "sign")]
  67. [string] $GpgKey = "CFB4C2166397D0D2",
  68. [Parameter(ParameterSetName = "merge")]
  69. [Parameter(ParameterSetName = "build")]
  70. [string] $SourceDir = ".",
  71. [Parameter(ParameterSetName = "build")]
  72. [string] $OutDir = ".\release",
  73. [Parameter(ParameterSetName = "merge")]
  74. [Parameter(ParameterSetName = "build")]
  75. [string] $Tag,
  76. [Parameter(ParameterSetName = "merge")]
  77. [string] $SourceBranch,
  78. [Parameter(ParameterSetName = "build")]
  79. [string] $VSToolChain,
  80. [Parameter(ParameterSetName = "merge")]
  81. [Parameter(ParameterSetName = "build")]
  82. [Parameter(ParameterSetName = "sign")]
  83. [string] $ExtraPath
  84. )
  85. # Helper function definitions
  86. function Test-RequiredPrograms {
  87. # If any of these fail they will throw an exception terminating the script
  88. if ($Build) {
  89. Get-Command git | Out-Null
  90. Get-Command cmake | Out-Null
  91. }
  92. if ($Merge) {
  93. Get-Command git | Out-Null
  94. Get-Command tx | Out-Null
  95. Get-Command lupdate | Out-Null
  96. }
  97. if ($Sign -or $SignBuild) {
  98. if ($SignKey.Length) {
  99. Get-Command signtool | Out-Null
  100. }
  101. Get-Command gpg | Out-Null
  102. }
  103. }
  104. function Test-VersionInFiles {
  105. # Check CMakeLists.txt
  106. $Major, $Minor, $Patch = $Version.split(".", 3)
  107. if (!(Select-String "$SourceDir\CMakeLists.txt" -pattern "KEEPASSXC_VERSION_MAJOR `"$Major`"" -Quiet) `
  108. -or !(Select-String "$SourceDir\CMakeLists.txt" -pattern "KEEPASSXC_VERSION_MINOR `"$Minor`"" -Quiet) `
  109. -or !(Select-String "$SourceDir\CMakeLists.txt" -pattern "KEEPASSXC_VERSION_PATCH `"$Patch`"" -Quiet)) {
  110. throw "CMakeLists.txt has not been updated to $Version."
  111. }
  112. # Check Changelog
  113. if (!(Select-String "$SourceDir\CHANGELOG.md" -pattern "^## $Version \(\d{4}-\d{2}-\d{2}\)$" -Quiet)) {
  114. throw "CHANGELOG.md does not contain a section for $Version."
  115. }
  116. # Check AppStreamInfo
  117. if (!(Select-String "$SourceDir\share\linux\org.keepassxc.KeePassXC.appdata.xml" `
  118. -pattern "<release version=`"$Version`" date=`"\d{4}-\d{2}-\d{2}`">" -Quiet)) {
  119. throw "share/linux/org.keepassxc.KeePassXC.appdata.xml does not contain a section for $Version."
  120. }
  121. }
  122. function Test-WorkingTreeClean {
  123. & git diff-index --quiet HEAD --
  124. if ($LASTEXITCODE) {
  125. throw "Current working tree is not clean! Please commit or unstage any changes."
  126. }
  127. }
  128. function Invoke-VSToolchain([String] $Toolchain, [String] $Path, [String] $Arch) {
  129. # Find Visual Studio installations
  130. $vs = Get-CimInstance MSFT_VSInstance
  131. if ($vs.count -eq 0) {
  132. $err = "No Visual Studio installations found, download one from https://visualstudio.com/downloads."
  133. $err = "$err`nIf Visual Studio is installed, you may need to repair the install then restart."
  134. throw $err
  135. }
  136. $VSBaseDir = $vs[0].InstallLocation
  137. if ($Toolchain) {
  138. # Try to find the specified toolchain by name
  139. foreach ($_ in $vs) {
  140. if ($_.Name -eq $Toolchain) {
  141. $VSBaseDir = $_.InstallLocation
  142. break
  143. }
  144. }
  145. } elseif ($vs.count -gt 1) {
  146. # Ask the user which install to use
  147. $i = 0
  148. foreach ($_ in $vs) {
  149. $i = $i + 1
  150. $i.ToString() + ") " + $_.Name | Write-Host
  151. }
  152. $i = Read-Host -Prompt "Which Visual Studio installation do you want to use?"
  153. $i = [Convert]::ToInt32($i, 10) - 1
  154. if ($i -lt 0 -or $i -ge $vs.count) {
  155. throw "Invalid selection made"
  156. }
  157. $VSBaseDir = $vs[$i].InstallLocation
  158. }
  159. # Bootstrap the specified VS Toolchain
  160. Import-Module "$VSBaseDir\Common7\Tools\Microsoft.VisualStudio.DevShell.dll"
  161. Enter-VsDevShell -VsInstallPath $VSBaseDir -Arch $Arch -StartInPath $Path | Write-Host
  162. Write-Host # Newline after command output
  163. }
  164. function Invoke-Cmd([string] $command, [string[]] $options = @(), [switch] $maskargs, [switch] $quiet) {
  165. $call = ('{0} {1}' -f $command, ($options -Join ' '))
  166. if ($maskargs) {
  167. Write-Host "$command <masked>" -ForegroundColor DarkGray
  168. }
  169. else {
  170. Write-Host $call -ForegroundColor DarkGray
  171. }
  172. if ($quiet) {
  173. Invoke-Expression $call > $null
  174. } else {
  175. Invoke-Expression $call
  176. }
  177. if ($LASTEXITCODE -ne 0) {
  178. throw "Failed to run command: {0}" -f $command
  179. }
  180. Write-Host #insert newline after command output
  181. }
  182. function Invoke-SignFiles([string[]] $files, [string] $key, [string] $time) {
  183. if (!(Test-Path -Path "$key" -PathType leaf)) {
  184. throw "Appsign key file was not found! ($key)"
  185. }
  186. if ($files.Length -eq 0) {
  187. return
  188. }
  189. Write-Host "Signing files using $key" -ForegroundColor Cyan
  190. $KeyPassword = Read-Host "Key password: " -MaskInput
  191. foreach ($_ in $files) {
  192. Write-Host "Signing file '$_' using Microsoft signtool..."
  193. Invoke-Cmd "signtool" "sign -f `"$key`" -p `"$KeyPassword`" -d `"KeePassXC`" -td sha256 -fd sha256 -tr `"$time`" `"$_`"" -maskargs
  194. }
  195. }
  196. function Invoke-GpgSignFiles([string[]] $files, [string] $key) {
  197. if ($files.Length -eq 0) {
  198. return
  199. }
  200. Write-Host "Signing files using GPG key $key" -ForegroundColor Cyan
  201. foreach ($_ in $files) {
  202. Write-Host "Signing file '$_' and creating DIGEST..."
  203. if (Test-Path "$_.sig") {
  204. Remove-Item "$_.sig"
  205. }
  206. Invoke-Cmd "gpg" "--output `"$_.sig`" --armor --local-user `"$key`" --detach-sig `"$_`""
  207. $FileName = (Get-Item $_).Name
  208. (Get-FileHash "$_" SHA256).Hash + " *$FileName" | Out-File "$_.DIGEST" -NoNewline
  209. }
  210. }
  211. # Handle errors and restore state
  212. $OrigDir = (Get-Location).Path
  213. $OrigBranch = & git rev-parse --abbrev-ref HEAD
  214. $ErrorActionPreference = 'Stop'
  215. trap {
  216. Write-Host "Restoring state..." -ForegroundColor Yellow
  217. & git checkout $OrigBranch
  218. Set-Location "$OrigDir"
  219. }
  220. Write-Host "KeePassXC Release Preparation Helper" -ForegroundColor Green
  221. Write-Host "Copyright (C) 2022 KeePassXC Team <https://keepassxc.org/>`n" -ForegroundColor Green
  222. # Prepend extra PATH locations as specified
  223. if ($ExtraPath) {
  224. $env:Path = "$ExtraPath;$env:Path"
  225. }
  226. # Resolve absolute directory for paths
  227. $SourceDir = (Resolve-Path $SourceDir).Path
  228. # Check format of -Version
  229. if ($Version -notmatch "^\d+\.\d+\.\d+(-Beta\d*)?$") {
  230. throw "Invalid format for -Version input"
  231. }
  232. # Check platform
  233. if (!$IsWindows) {
  234. throw "The PowerShell release tool is not available for Linux or macOS at this time."
  235. }
  236. if ($Merge) {
  237. Test-RequiredPrograms
  238. # Change to SourceDir
  239. Set-Location "$SourceDir"
  240. Test-VersionInFiles
  241. Test-WorkingTreeClean
  242. if (!$SourceBranch.Length) {
  243. $SourceBranch = & git branch --show-current
  244. }
  245. if ($SourceBranch -notmatch "^release/.*$") {
  246. throw "Must be on a release/* branch to continue."
  247. }
  248. # Update translation files
  249. Write-Host "Updating source translation file..."
  250. Invoke-Cmd "lupdate" "-no-ui-lines -disable-heuristic similartext -locations none", `
  251. "-no-obsolete ./src -ts share/translations/keepassxc_en.ts"
  252. Write-Host "Pulling updated translations from Transifex..."
  253. Invoke-Cmd "tx" "pull -af --minimum-perc=60 --parallel -r keepassxc.share-translations-keepassxc-en-ts--develop"
  254. # Only commit if there are changes
  255. $changes = & git status --porcelain
  256. if ($changes.Length -gt 0) {
  257. Write-Host "Committing translation updates..."
  258. Invoke-Cmd "git" "add -A ./share/translations/" -quiet
  259. Invoke-Cmd "git" "commit -m `"Update translations`"" -quiet
  260. }
  261. # Read the version release notes from CHANGELOG
  262. $Changelog = ""
  263. $ReadLine = $false
  264. Get-Content "CHANGELOG.md" | ForEach-Object {
  265. if ($ReadLine) {
  266. if ($_ -match "^## ") {
  267. $ReadLine = $false
  268. } else {
  269. $Changelog += $_ + "`n"
  270. }
  271. } elseif ($_ -match "$Version \(\d{4}-\d{2}-\d{2}\)") {
  272. $ReadLine = $true
  273. }
  274. }
  275. Write-Host "Creating tag for '$Version'..."
  276. $tmp = New-TemporaryFile
  277. "Release $Version`n$Changelog" | Out-File $tmp.FullName
  278. Invoke-Cmd "git" "tag -a `"$Version`" -F `"$tmp`" -s" -quiet
  279. Remove-Item $tmp.FullName -Force
  280. Write-Host "Moving latest tag..."
  281. Invoke-Cmd "git" "tag -f -a `"latest`" -m `"Latest stable release`" -s" -quiet
  282. Write-Host "All done!"
  283. Write-Host "Please merge the release branch back into the develop branch now and then push your changes."
  284. Write-Host "Don't forget to also push the tags using 'git push --tags'."
  285. } elseif ($Build) {
  286. $Vcpkg = (Resolve-Path "$Vcpkg/scripts/buildsystems/vcpkg.cmake").Path
  287. # Find Visual Studio and establish build environment
  288. Invoke-VSToolchain $VSToolChain $SourceDir -Arch "amd64"
  289. Test-RequiredPrograms
  290. if ($Snapshot) {
  291. $Tag = "HEAD"
  292. $SourceBranch = & git rev-parse --abbrev-ref HEAD
  293. $ReleaseName = "$Version-snapshot"
  294. $CMakeOptions = "-DKEEPASSXC_BUILD_TYPE=Snapshot -DOVERRIDE_VERSION=`"$ReleaseName`" $CMakeOptions"
  295. Write-Host "Using current branch '$SourceBranch' to build." -ForegroundColor Cyan
  296. } else {
  297. Test-WorkingTreeClean
  298. # Clear output directory
  299. if (Test-Path $OutDir) {
  300. Remove-Item $OutDir -Recurse
  301. }
  302. if ($Version -match "-beta\d*$") {
  303. $CMakeOptions = "-DKEEPASSXC_BUILD_TYPE=PreRelease $CMakeOptions"
  304. } else {
  305. $CMakeOptions = "-DKEEPASSXC_BUILD_TYPE=Release $CMakeOptions"
  306. }
  307. # Setup Tag if not defined then checkout tag
  308. if ($Tag -eq "" -or $Tag -eq $null) {
  309. $Tag = $Version
  310. }
  311. Write-Host "Checking out tag 'tags/$Tag' to build." -ForegroundColor Cyan
  312. Invoke-Cmd "git" "checkout `"tags/$Tag`""
  313. }
  314. # Create directories
  315. New-Item "$OutDir" -ItemType Directory -Force | Out-Null
  316. $OutDir = (Resolve-Path $OutDir).Path
  317. $BuildDir = "$OutDir\build-release"
  318. New-Item "$BuildDir" -ItemType Directory -Force | Out-Null
  319. # Enter build directory
  320. Set-Location "$BuildDir"
  321. # Setup CMake options
  322. $CMakeOptions = "-DWITH_XC_ALL=ON -DWITH_TESTS=OFF -DCMAKE_BUILD_TYPE=Release $CMakeOptions"
  323. $CMakeOptions = "-DCMAKE_TOOLCHAIN_FILE:FILEPATH=`"$Vcpkg`" -DX_VCPKG_APPLOCAL_DEPS_INSTALL=ON $CMakeOptions"
  324. Write-Host "Configuring build..." -ForegroundColor Cyan
  325. Invoke-Cmd "cmake" "-G `"$CMakeGenerator`" $CMakeOptions `"$SourceDir`""
  326. Write-Host "Compiling sources..." -ForegroundColor Cyan
  327. Invoke-Cmd "cmake" "--build . --config Release -- $MakeOptions"
  328. if ($SignBuild) {
  329. $files = Get-ChildItem "$BuildDir\src" -Include "*keepassxc*.exe", "*keepassxc*.dll" -Recurse -File | ForEach-Object { $_.FullName }
  330. Invoke-SignFiles $files $SignKey $Timestamp
  331. }
  332. Write-Host "Create deployment packages..." -ForegroundColor Cyan
  333. Invoke-Cmd "cpack" "-G `"$CPackGenerators`""
  334. Move-Item "$BuildDir\keepassxc-*" -Destination "$OutDir" -Force
  335. if ($SignBuild) {
  336. # Enter output directory
  337. Set-Location -Path "$OutDir"
  338. # Sign MSI files using AppSign key
  339. $files = Get-ChildItem $OutDir -Include "*.msi" -Name
  340. Invoke-SignFiles $files $SignKey $Timestamp
  341. # Sign all output files using the GPG key then hash them
  342. $files = Get-ChildItem $OutDir -Include "*.msi", "*.zip" -Name
  343. Invoke-GpgSignFiles $files $GpgKey
  344. }
  345. # Restore state
  346. Invoke-Command {git checkout $OrigBranch}
  347. Set-Location "$OrigDir"
  348. } elseif ($Sign) {
  349. if (Test-Path $SignKey) {
  350. # Need to include path to signtool program
  351. Invoke-VSToolchain $VSToolChain $SourceDir -Arch "amd64"
  352. }
  353. Test-RequiredPrograms
  354. # Resolve wildcard paths
  355. $ResolvedFiles = @()
  356. foreach ($_ in $SignFiles) {
  357. $ResolvedFiles += (Get-ChildItem $_ -File | ForEach-Object { $_.FullName })
  358. }
  359. $AppSignFiles = $ResolvedFiles.Where({ $_ -match "\.(msi|exe|dll)$" })
  360. Invoke-SignFiles $AppSignFiles $SignKey $Timestamp
  361. $GpgSignFiles = $ResolvedFiles.Where({ $_ -match "\.(msi|zip|gz|xz|dmg|appimage)$" })
  362. Invoke-GpgSignFiles $GpgSignFiles $GpgKey
  363. }
  364. # SIG # Begin signature block
  365. # MIIkvgYJKoZIhvcNAQcCoIIkrzCCJKsCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
  366. # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
  367. # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUccSicCrmJ6HTiKZr9ZV5mT6i
  368. # 9sqggh6mMIIFOjCCBCKgAwIBAgIQWKLXLYzA/YnM/yHg1O3HSjANBgkqhkiG9w0B
  369. # AQsFADB8MQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVy
  370. # MRAwDgYDVQQHEwdTYWxmb3JkMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxJDAi
  371. # BgNVBAMTG1NlY3RpZ28gUlNBIENvZGUgU2lnbmluZyBDQTAeFw0yMTAzMTUwMDAw
  372. # MDBaFw0yNDAzMTQyMzU5NTlaMIGhMQswCQYDVQQGEwJVUzEOMAwGA1UEEQwFMjIz
  373. # MTUxETAPBgNVBAgMCFZpcmdpbmlhMRIwEAYDVQQHDAlGcmFuY29uaWExGzAZBgNV
  374. # BAkMEjY2NTMgQXVkcmV5IEtheSBDdDEeMBwGA1UECgwVRHJvaWRNb25rZXkgQXBw
  375. # cywgTExDMR4wHAYDVQQDDBVEcm9pZE1vbmtleSBBcHBzLCBMTEMwggEiMA0GCSqG
  376. # SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCwB9L/+1zlcXOQLoYvdrYAWS9B5ui+7E9c
  377. # XCn6wcB4NdmaRbNM3kdWc8nbjOOHeOct2jVzVu/pJR1SagI+V1R1BfzgfzuW55Yy
  378. # iHrqXQGfL9xhqJAWSvdQRinvlkZ+WY3QxnOhzcQk+BTLYdUwq04O3jMv7vnH6fuL
  379. # q/HXEsgDObZC7EyKEtVbWVo4nqY0tUTviJXvRI/sFDN8DvULefwZWIvF7G11NFeK
  380. # It24+hDCzvVBKtEn7DNmFGO1CJAB7Sz4jFewV4MP1gviMAfGbSBqavyRDBOG7eda
  381. # SVb1Zq482yoHNAs+mpIQK2SGvUKKAJK2wCDbzgpvu5sfzwStpc0hAgMBAAGjggGQ
  382. # MIIBjDAfBgNVHSMEGDAWgBQO4TqoUzox1Yq+wbutZxoDha00DjAdBgNVHQ4EFgQU
  383. # 7u2WZ7fqJiaM3u9SlzAwGBhoWH0wDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQC
  384. # MAAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwEQYJYIZIAYb4QgEBBAQDAgQQMEoGA1Ud
  385. # IARDMEEwNQYMKwYBBAGyMQECAQMCMCUwIwYIKwYBBQUHAgEWF2h0dHBzOi8vc2Vj
  386. # dGlnby5jb20vQ1BTMAgGBmeBDAEEATBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8v
  387. # Y3JsLnNlY3RpZ28uY29tL1NlY3RpZ29SU0FDb2RlU2lnbmluZ0NBLmNybDBzBggr
  388. # BgEFBQcBAQRnMGUwPgYIKwYBBQUHMAKGMmh0dHA6Ly9jcnQuc2VjdGlnby5jb20v
  389. # U2VjdGlnb1JTQUNvZGVTaWduaW5nQ0EuY3J0MCMGCCsGAQUFBzABhhdodHRwOi8v
  390. # b2NzcC5zZWN0aWdvLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAD2w/Tt5KyPbX2M+h
  391. # WVwgqpKm42nk6aN2HvSp+KWlrB2t+ziL+1IRXwq7S0V7p2e1ZK8uXLzBjUDVGjBc
  392. # ugh5hGG95MGVltxCJrr/bk1He62L7MwVxfH5b5MrE/vC/cHcSxEB1AZwZxYKjDPf
  393. # R81biDVch++XeKmvUxfT4XGo7McJqT4K/TcLwijSb/AWsXR+r2BXEAqgsoG37kk/
  394. # fbPKimpJ07hxd/RNYVpE33E93zCQ1Tjc1tP3DaLq8cpS6jGUY5NNOzRgp2mGcGHy
  395. # lv6Q/xf45qNvHiqFVctdvY9of0QFjg5eYDr4rLDa+mks9f1Jd8aDWKcsfCBnlohT
  396. # KIffbTCCBYEwggRpoAMCAQICEDlyRDr5IrdR19NsEN0xNZUwDQYJKoZIhvcNAQEM
  397. # BQAwezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQ
  398. # MA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAf
  399. # BgNVBAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0xOTAzMTIwMDAwMDBa
  400. # Fw0yODEyMzEyMzU5NTlaMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKTmV3IEpl
  401. # cnNleTEUMBIGA1UEBxMLSmVyc2V5IENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJV
  402. # U1QgTmV0d29yazEuMCwGA1UEAxMlVVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9u
  403. # IEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIASZRc2
  404. # DsPbCLPQrFcNdu3NJ9NMrVCDYeKqIE0JLWQJ3M6Jn8w9qez2z8Hc8dOx1ns3KBEr
  405. # R9o5xrw6GbRfpr19naNjQrZ28qk7K5H44m/Q7BYgkAk+4uh0yRi0kdRiZNt/owbx
  406. # iBhqkCI8vP4T8IcUe/bkH47U5FHGEWdGCFHLhhRUP7wz/n5snP8WnRi9UY41pqdm
  407. # yHJn2yFmsdSbeAPAUDrozPDcvJ5M/q8FljUfV1q3/875PbcstvZU3cjnEjpNrkyK
  408. # t1yatLcgPcp/IjSufjtoZgFE5wFORlObM2D3lL5TN5BzQ/Myw1Pv26r+dE5px2uM
  409. # YJPexMcM3+EyrsyTO1F4lWeL7j1W/gzQaQ8bD/MlJmszbfduR/pzQ+V+DqVmsSl8
  410. # MoRjVYnEDcGTVDAZE6zTfTen6106bDVc20HXEtqpSQvf2ICKCZNijrVmzyWIzYS4
  411. # sT+kOQ/ZAp7rEkyVfPNrBaleFoPMuGfi6BOdzFuC00yz7Vv/3uVzrCM7LQC/NVV0
  412. # CUnYSVgaf5I25lGSDvMmfRxNF7zJ7EMm0L9BX0CpRET0medXh55QH1dUqD79dGMv
  413. # sVBlCeZYQi5DGky08CVHWfoEHpPUJkZKUIGy3r54t/xnFeHJV4QeD2PW6WK61l9V
  414. # LupcxigIBCU5uA4rqfJMlxwHPw1S9e3vL4IPAgMBAAGjgfIwge8wHwYDVR0jBBgw
  415. # FoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYDVR0OBBYEFFN5v1qqK0rPVIDh2JvA
  416. # nfKyA2bLMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MBEGA1UdIAQK
  417. # MAgwBgYEVR0gADBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsLmNvbW9kb2Nh
  418. # LmNvbS9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDA0BggrBgEFBQcBAQQoMCYw
  419. # JAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNvbTANBgkqhkiG9w0B
  420. # AQwFAAOCAQEAGIdR3HQhPZyK4Ce3M9AuzOzw5steEd4ib5t1jp5y/uTW/qofnJYt
  421. # 7wNKfq70jW9yPEM7wD/ruN9cqqnGrvL82O6je0P2hjZ8FODN9Pc//t64tIrwkZb+
  422. # /UNkfv3M0gGhfX34GRnJQisTv1iLuqSiZgR2iJFODIkUzqJNyTKzuugUGrxx8Vvw
  423. # QQuYAAoiAxDlDLH5zZI3Ge078eQ6tvlFEyZ1r7uq7z97dzvSxAKRPRkA0xdcOds/
  424. # exgNRc2ThZYvXd9ZFk8/Ub3VRRg/7UqO6AZhdCMWtQ1QcydER38QXYkqa4UxFMTo
  425. # qWpMgLxqeM+4f452cpkMnf7XkQgWoaNflTCCBfUwggPdoAMCAQICEB2iSDBvmyYY
  426. # 0ILgln0z02owDQYJKoZIhvcNAQEMBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQI
  427. # EwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtKZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhl
  428. # IFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYDVQQDEyVVU0VSVHJ1c3QgUlNBIENlcnRp
  429. # ZmljYXRpb24gQXV0aG9yaXR5MB4XDTE4MTEwMjAwMDAwMFoXDTMwMTIzMTIzNTk1
  430. # OVowfDELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQ
  431. # MA4GA1UEBxMHU2FsZm9yZDEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSQwIgYD
  432. # VQQDExtTZWN0aWdvIFJTQSBDb2RlIFNpZ25pbmcgQ0EwggEiMA0GCSqGSIb3DQEB
  433. # AQUAA4IBDwAwggEKAoIBAQCGIo0yhXoYn0nwli9jCB4t3HyfFM/jJrYlZilAhlRG
  434. # dDFixRDtsocnppnLlTDAVvWkdcapDlBipVGREGrgS2Ku/fD4GKyn/+4uMyD6DBmJ
  435. # qGx7rQDDYaHcaWVtH24nlteXUYam9CflfGqLlR5bYNV+1xaSnAAvaPeX7Wpyvjg7
  436. # Y96Pv25MQV0SIAhZ6DnNj9LWzwa0VwW2TqE+V2sfmLzEYtYbC43HZhtKn52BxHJA
  437. # teJf7wtF/6POF6YtVbC3sLxUap28jVZTxvC6eVBJLPcDuf4vZTXyIuosB69G2flG
  438. # HNyMfHEo8/6nxhTdVZFuihEN3wYklX0Pp6F8OtqGNWHTAgMBAAGjggFkMIIBYDAf
  439. # BgNVHSMEGDAWgBRTeb9aqitKz1SA4dibwJ3ysgNmyzAdBgNVHQ4EFgQUDuE6qFM6
  440. # MdWKvsG7rWcaA4WtNA4wDgYDVR0PAQH/BAQDAgGGMBIGA1UdEwEB/wQIMAYBAf8C
  441. # AQAwHQYDVR0lBBYwFAYIKwYBBQUHAwMGCCsGAQUFBwMIMBEGA1UdIAQKMAgwBgYE
  442. # VR0gADBQBgNVHR8ESTBHMEWgQ6BBhj9odHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20v
  443. # VVNFUlRydXN0UlNBQ2VydGlmaWNhdGlvbkF1dGhvcml0eS5jcmwwdgYIKwYBBQUH
  444. # AQEEajBoMD8GCCsGAQUFBzAChjNodHRwOi8vY3J0LnVzZXJ0cnVzdC5jb20vVVNF
  445. # UlRydXN0UlNBQWRkVHJ1c3RDQS5jcnQwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3Nw
  446. # LnVzZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEMBQADggIBAE1jUO1HNEphpNveaiqM
  447. # m/EAAB4dYns61zLC9rPgY7P7YQCImhttEAcET7646ol4IusPRuzzRl5ARokS9At3
  448. # WpwqQTr81vTr5/cVlTPDoYMot94v5JT3hTODLUpASL+awk9KsY8k9LOBN9O3ZLCm
  449. # I2pZaFJCX/8E6+F0ZXkI9amT3mtxQJmWunjxucjiwwgWsatjWsgVgG10Xkp1fqW4
  450. # w2y1z99KeYdcx0BNYzX2MNPPtQoOCwR/oEuuu6Ol0IQAkz5TXTSlADVpbL6fICUQ
  451. # DRn7UJBhvjmPeo5N9p8OHv4HURJmgyYZSJXOSsnBf/M6BZv5b9+If8AjntIeQ3pF
  452. # McGcTanwWbJZGehqjSkEAnd8S0vNcL46slVaeD68u28DECV3FTSK+TbMQ5Lkuk/x
  453. # YpMoJVcp+1EZx6ElQGqEV8aynbG8HArafGd+fS7pKEwYfsR7MUFxmksp7As9V1DS
  454. # yt39ngVR5UR43QHesXWYDVQk/fBO4+L4g71yuss9Ou7wXheSaG3IYfmm8SoKC6W5
  455. # 9J7umDIFhZ7r+YMp08Ysfb06dy6LN0KgaoLtO0qqlBCk4Q34F8W2WnkzGJLjtXX4
  456. # oemOCiUe5B7xn1qHI/+fpFGe+zmAEc3btcSnqIBv5VPU4OOiwtJbGvoyJi1qV3Ac
  457. # PKRYLqPzW0sH3DJZ84enGm1YMIIG7DCCBNSgAwIBAgIQMA9vrN1mmHR8qUY2p3gt
  458. # uTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBK
  459. # ZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRS
  460. # VVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlv
  461. # biBBdXRob3JpdHkwHhcNMTkwNTAyMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjB9MQsw
  462. # CQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQH
  463. # EwdTYWxmb3JkMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxJTAjBgNVBAMTHFNl
  464. # Y3RpZ28gUlNBIFRpbWUgU3RhbXBpbmcgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC
  465. # DwAwggIKAoICAQDIGwGv2Sx+iJl9AZg/IJC9nIAhVJO5z6A+U++zWsB21hoEpc5H
  466. # g7XrxMxJNMvzRWW5+adkFiYJ+9UyUnkuyWPCE5u2hj8BBZJmbyGr1XEQeYf0RirN
  467. # xFrJ29ddSU1yVg/cyeNTmDoqHvzOWEnTv/M5u7mkI0Ks0BXDf56iXNc48RaycNOj
  468. # xN+zxXKsLgp3/A2UUrf8H5VzJD0BKLwPDU+zkQGObp0ndVXRFzs0IXuXAZSvf4DP
  469. # 0REKV4TJf1bgvUacgr6Unb+0ILBgfrhN9Q0/29DqhYyKVnHRLZRMyIw80xSinL0m
  470. # /9NTIMdgaZtYClT0Bef9Maz5yIUXx7gpGaQpL0bj3duRX58/Nj4OMGcrRrc1r5a+
  471. # 2kxgzKi7nw0U1BjEMJh0giHPYla1IXMSHv2qyghYh3ekFesZVf/QOVQtJu5FGjpv
  472. # zdeE8NfwKMVPZIMC1Pvi3vG8Aij0bdonigbSlofe6GsO8Ft96XZpkyAcSpcsdxkr
  473. # k5WYnJee647BeFbGRCXfBhKaBi2fA179g6JTZ8qx+o2hZMmIklnLqEbAyfKm/31X
  474. # 2xJ2+opBJNQb/HKlFKLUrUMcpEmLQTkUAx4p+hulIq6lw02C0I3aa7fb9xhAV3Pw
  475. # caP7Sn1FNsH3jYL6uckNU4B9+rY5WDLvbxhQiddPnTO9GrWdod6VQXqngwIDAQAB
  476. # o4IBWjCCAVYwHwYDVR0jBBgwFoAUU3m/WqorSs9UgOHYm8Cd8rIDZsswHQYDVR0O
  477. # BBYEFBqh+GEZIA/DQXdFKI7RNV8GEgRVMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMB
  478. # Af8ECDAGAQH/AgEAMBMGA1UdJQQMMAoGCCsGAQUFBwMIMBEGA1UdIAQKMAgwBgYE
  479. # VR0gADBQBgNVHR8ESTBHMEWgQ6BBhj9odHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20v
  480. # VVNFUlRydXN0UlNBQ2VydGlmaWNhdGlvbkF1dGhvcml0eS5jcmwwdgYIKwYBBQUH
  481. # AQEEajBoMD8GCCsGAQUFBzAChjNodHRwOi8vY3J0LnVzZXJ0cnVzdC5jb20vVVNF
  482. # UlRydXN0UlNBQWRkVHJ1c3RDQS5jcnQwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3Nw
  483. # LnVzZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEMBQADggIBAG1UgaUzXRbhtVOBkXXf
  484. # A3oyCy0lhBGysNsqfSoF9bw7J/RaoLlJWZApbGHLtVDb4n35nwDvQMOt0+LkVvlY
  485. # Qc/xQuUQff+wdB+PxlwJ+TNe6qAcJlhc87QRD9XVw+K81Vh4v0h24URnbY+wQxAP
  486. # jeT5OGK/EwHFhaNMxcyyUzCVpNb0llYIuM1cfwGWvnJSajtCN3wWeDmTk5Sbsdyy
  487. # bUFtZ83Jb5A9f0VywRsj1sJVhGbks8VmBvbz1kteraMrQoohkv6ob1olcGKBc2Ne
  488. # oLvY3NdK0z2vgwY4Eh0khy3k/ALWPncEvAQ2ted3y5wujSMYuaPCRx3wXdahc1cF
  489. # aJqnyTdlHb7qvNhCg0MFpYumCf/RoZSmTqo9CfUFbLfSZFrYKiLCS53xOV5M3kg9
  490. # mzSWmglfjv33sVKRzj+J9hyhtal1H3G/W0NdZT1QgW6r8NDT/LKzH7aZlib0PHmL
  491. # XGTMze4nmuWgwAxyh8FuTVrTHurwROYybxzrF06Uw3hlIDsPQaof6aFBnf6xuKBl
  492. # KjTg3qj5PObBMLvAoGMs/FwWAKjQxH/qEZ0eBsambTJdtDgJK0kHqv3sMNrxpy/P
  493. # t/360KOE2See+wFmd7lWEOEgbsausfm2usg1XTN2jvF8IAwqd661ogKGuinutFoA
  494. # sYyr4/kKyVRd1LlqdJ69SK6YMIIG9jCCBN6gAwIBAgIRAJA5f5rSSjoT8r2RXwg4
  495. # qUMwDQYJKoZIhvcNAQEMBQAwfTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0
  496. # ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEYMBYGA1UEChMPU2VjdGln
  497. # byBMaW1pdGVkMSUwIwYDVQQDExxTZWN0aWdvIFJTQSBUaW1lIFN0YW1waW5nIENB
  498. # MB4XDTIyMDUxMTAwMDAwMFoXDTMzMDgxMDIzNTk1OVowajELMAkGA1UEBhMCR0Ix
  499. # EzARBgNVBAgTCk1hbmNoZXN0ZXIxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDEs
  500. # MCoGA1UEAwwjU2VjdGlnbyBSU0EgVGltZSBTdGFtcGluZyBTaWduZXIgIzMwggIi
  501. # MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCQsnE/eeHUuYoXzMOXwpCUcu1a
  502. # Om8BQ39zWiifJHygNUAG+pSvCqGDthPkSxUGXmqKIDRxe7slrT9bCqQfL2x9LmFR
  503. # 0IxZNz6mXfEeXYC22B9g480Saogfxv4Yy5NDVnrHzgPWAGQoViKxSxnS8JbJRB85
  504. # XZywlu1aSY1+cuRDa3/JoD9sSq3VAE+9CriDxb2YLAd2AXBF3sPwQmnq/ybMA0Qf
  505. # FijhanS2nEX6tjrOlNEfvYxlqv38wzzoDZw4ZtX8fR6bWYyRWkJXVVAWDUt0cu6g
  506. # KjH8JgI0+WQbWf3jOtTouEEpdAE/DeATdysRPPs9zdDn4ZdbVfcqA23VzWLazpwe
  507. # /OpwfeZ9S2jOWilh06BcJbOlJ2ijWP31LWvKX2THaygM2qx4Qd6S7w/F7KvfLW8a
  508. # VFFsM7ONWWDn3+gXIqN5QWLP/Hvzktqu4DxPD1rMbt8fvCKvtzgQmjSnC//+HV6k
  509. # 8+4WOCs/rHaUQZ1kHfqA/QDh/vg61MNeu2lNcpnl8TItUfphrU3qJo5t/KlImD7y
  510. # Rg1psbdu9AXbQQXGGMBQ5Pit/qxjYUeRvEa1RlNsxfThhieThDlsdeAdDHpZiy7L
  511. # 9GQsQkf0VFiFN+XHaafSJYuWv8at4L2xN/cf30J7qusc6es9Wt340pDVSZo6HYMa
  512. # V38cAcLOHH3M+5YVxQIDAQABo4IBgjCCAX4wHwYDVR0jBBgwFoAUGqH4YRkgD8NB
  513. # d0UojtE1XwYSBFUwHQYDVR0OBBYEFCUuaDxrmiskFKkfot8mOs8UpvHgMA4GA1Ud
  514. # DwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMI
  515. # MEoGA1UdIARDMEEwNQYMKwYBBAGyMQECAQMIMCUwIwYIKwYBBQUHAgEWF2h0dHBz
  516. # Oi8vc2VjdGlnby5jb20vQ1BTMAgGBmeBDAEEAjBEBgNVHR8EPTA7MDmgN6A1hjNo
  517. # dHRwOi8vY3JsLnNlY3RpZ28uY29tL1NlY3RpZ29SU0FUaW1lU3RhbXBpbmdDQS5j
  518. # cmwwdAYIKwYBBQUHAQEEaDBmMD8GCCsGAQUFBzAChjNodHRwOi8vY3J0LnNlY3Rp
  519. # Z28uY29tL1NlY3RpZ29SU0FUaW1lU3RhbXBpbmdDQS5jcnQwIwYIKwYBBQUHMAGG
  520. # F2h0dHA6Ly9vY3NwLnNlY3RpZ28uY29tMA0GCSqGSIb3DQEBDAUAA4ICAQBz2u1o
  521. # csvCuUChMbu0A6MtFHsk57RbFX2o6f2t0ZINfD02oGnZ85ow2qxp1nRXJD9+DzzZ
  522. # 9cN5JWwm6I1ok87xd4k5f6gEBdo0wxTqnwhUq//EfpZsK9OU67Rs4EVNLLL3Ozta
  523. # tcH714l1bZhycvb3Byjz07LQ6xm+FSx4781FoADk+AR2u1fFkL53VJB0ngtPTcSq
  524. # E4+XrwE1K8ubEXjp8vmJBDxO44ISYuu0RAx1QcIPNLiIncgi8RNq2xgvbnitxAW0
  525. # 6IQIkwf5fYP+aJg05Hflsc6MlGzbA20oBUd+my7wZPvbpAMxEHwa+zwZgNELcLlV
  526. # X0e+OWTOt9ojVDLjRrIy2NIphskVXYCVrwL7tNEunTh8NeAPHO0bR0icImpVgtny
  527. # ughlA+XxKfNIigkBTKZ58qK2GpmU65co4b59G6F87VaApvQiM5DkhFP8KvrAp5eo
  528. # 6rWNes7k4EuhM6sLdqDVaRa3jma/X/ofxKh/p6FIFJENgvy9TZntyeZsNv53Q5m4
  529. # aS18YS/to7BJ/lu+aSSR/5P8V2mSS9kFP22GctOi0MBk0jpCwRoD+9DtmiG4P6+m
  530. # slFU1UzFyh8SjVfGOe1c/+yfJnatZGZn6Kow4NKtt32xakEnbgOKo3TgigmCbr/j
  531. # 9re8ngspGGiBoZw/bhZZSxQJCZrmrr9gFd2G9TGCBYIwggV+AgEBMIGQMHwxCzAJ
  532. # BgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcT
  533. # B1NhbGZvcmQxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDEkMCIGA1UEAxMbU2Vj
  534. # dGlnbyBSU0EgQ29kZSBTaWduaW5nIENBAhBYotctjMD9icz/IeDU7cdKMAkGBSsO
  535. # AwIaBQCgeDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEM
  536. # BgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMCMGCSqG
  537. # SIb3DQEJBDEWBBQyqMslxaPRHhE8POQX8uLV4mnwLjANBgkqhkiG9w0BAQEFAASC
  538. # AQBhQUgt7fRTbF1rGUv7z9sdfZzNQiLWg2LYMURLZAWcZRFBW6RoP6rTSbpquyRZ
  539. # Bs4BlK7JkxCHBXrCeYl5qMx7b6N7twsgyz8OR+EPnYIkEoaKafeqO6B/Q0NhhdOW
  540. # vd0wK2YsD5Sb7135a0trAQtS+fnhRr9y9LgMHePBq3iJAo8BWtcUYF5eBbLmJjZU
  541. # yzu6aUlXgVakBm8fso0NqLNAVn0vQizJHqsnK610+zCVlzPQ/2HflRpwLgF4X1kQ
  542. # Jewj42T2kjzn1Worzcsj3v7WJgbuqThnVR1NIhi+bhfpkrCr4iC/+4QIZZLkzUHl
  543. # cS3DhzvxAQ62whQsUAB9z2HBoYIDTDCCA0gGCSqGSIb3DQEJBjGCAzkwggM1AgEB
  544. # MIGSMH0xCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIx
  545. # EDAOBgNVBAcTB1NhbGZvcmQxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDElMCMG
  546. # A1UEAxMcU2VjdGlnbyBSU0EgVGltZSBTdGFtcGluZyBDQQIRAJA5f5rSSjoT8r2R
  547. # Xwg4qUMwDQYJYIZIAWUDBAICBQCgeTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcB
  548. # MBwGCSqGSIb3DQEJBTEPFw0yMjEwMjMxMzE4MTZaMD8GCSqGSIb3DQEJBDEyBDAi
  549. # pcegfL2b7n0V2o/qV4vNL3exKvlIIxuSCCqMkqibj2h04kPtwOkjhJ064uMHSwcw
  550. # DQYJKoZIhvcNAQEBBQAEggIAWMkT++gXvrUNBmS62Sw9TekX6fEKJIOFwLHO5wzh
  551. # AdBv/NavsMLB+PNrKizKLL02+Q9v+kyKaeFFlReWa50S+meM2L+wW5YRMGggBKRB
  552. # Xhos4qL0ZffKPDbrjmCW0+HdRj408yyNCNB5aPSS6ZLjPpSa6mqVyySfnSdZnyaC
  553. # zXYQ2Y4qD3JGSk1MbRvCYB+jCaMM4unyJAS4IA6nWQ97184KLm5U2ktn9ygeWLlG
  554. # ujQ2plQ7HuHD+/rMSqesQT6OcwGtERYyfDs+hndpONjKBIulbJJDM1mN6uLQpkfZ
  555. # f/TPTZQBDx6EA1oUZ3Evx4cReQFZJjnVlsAJBnKmu3mHheisdlxuFv1DZfu2OD/M
  556. # nqY2DeCCgmeC212fosI8ZHUupaKRXVjfcVNElt34lK+3FMzYSKr6rCxiFEXbjq8u
  557. # WTG45ZMmcLzs7l9Yaz0eTc642SyBa+5OoTTXs3t9G5z9lVbGonOhfGVbJM+l8JNc
  558. # txM+CnQt/OOcjTMDKcjOwG9gcxHjYQhpK8PKiXmPmgpaGYn5vCL5fLvR+s+vTsm4
  559. # DJjUTHY87VVXt2IwOu45n1+RBJynewLeaXkwo+79R+/Dn/xoqVVGLRRU6c3yCIiW
  560. # qKmsdlIziAr/Fou7jzKcaPFhVJ/NMsI/2c8bkfi6Baoh+go3j39nA3/oDtb4vHWk
  561. # Y2E=
  562. # SIG # End signature block