release-tool.ps1 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656
  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. -SignCert Specify the App Signing Certificate
  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. [X509Certificate] $SignCert,
  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) {
  98. Get-Command gpg | Out-Null
  99. }
  100. }
  101. function Test-VersionInFiles {
  102. # Check CMakeLists.txt
  103. $Major, $Minor, $Patch = $Version.split(".", 3)
  104. if (!(Select-String "$SourceDir\CMakeLists.txt" -pattern "KEEPASSXC_VERSION_MAJOR `"$Major`"" -Quiet) `
  105. -or !(Select-String "$SourceDir\CMakeLists.txt" -pattern "KEEPASSXC_VERSION_MINOR `"$Minor`"" -Quiet) `
  106. -or !(Select-String "$SourceDir\CMakeLists.txt" -pattern "KEEPASSXC_VERSION_PATCH `"$Patch`"" -Quiet)) {
  107. throw "CMakeLists.txt has not been updated to $Version."
  108. }
  109. # Check Changelog
  110. if (!(Select-String "$SourceDir\CHANGELOG.md" -pattern "^## $Version \(\d{4}-\d{2}-\d{2}\)$" -Quiet)) {
  111. throw "CHANGELOG.md does not contain a section for $Version."
  112. }
  113. # Check AppStreamInfo
  114. if (!(Select-String "$SourceDir\share\linux\org.keepassxc.KeePassXC.appdata.xml" `
  115. -pattern "<release version=`"$Version`" date=`"\d{4}-\d{2}-\d{2}`">" -Quiet)) {
  116. throw "share/linux/org.keepassxc.KeePassXC.appdata.xml does not contain a section for $Version."
  117. }
  118. }
  119. function Test-WorkingTreeClean {
  120. & git diff-index --quiet HEAD --
  121. if ($LASTEXITCODE) {
  122. throw "Current working tree is not clean! Please commit or unstage any changes."
  123. }
  124. }
  125. function Invoke-VSToolchain([String] $Toolchain, [String] $Path, [String] $Arch) {
  126. # Find Visual Studio installations
  127. $vs = Get-CimInstance MSFT_VSInstance -Namespace root/cimv2/vs
  128. if ($vs.count -eq 0) {
  129. $err = "No Visual Studio installations found, download one from https://visualstudio.com/downloads."
  130. $err = "$err`nIf Visual Studio is installed, you may need to repair the install then restart."
  131. throw $err
  132. }
  133. $VSBaseDir = $vs[0].InstallLocation
  134. if ($Toolchain) {
  135. # Try to find the specified toolchain by name
  136. foreach ($_ in $vs) {
  137. if ($_.Name -eq $Toolchain) {
  138. $VSBaseDir = $_.InstallLocation
  139. break
  140. }
  141. }
  142. } elseif ($vs.count -gt 1) {
  143. # Ask the user which install to use
  144. $i = 0
  145. foreach ($_ in $vs) {
  146. $i = $i + 1
  147. $i.ToString() + ") " + $_.Name | Write-Host
  148. }
  149. $i = Read-Host -Prompt "Which Visual Studio installation do you want to use?"
  150. $i = [Convert]::ToInt32($i, 10) - 1
  151. if ($i -lt 0 -or $i -ge $vs.count) {
  152. throw "Invalid selection made"
  153. }
  154. $VSBaseDir = $vs[$i].InstallLocation
  155. }
  156. # Bootstrap the specified VS Toolchain
  157. Import-Module "$VSBaseDir\Common7\Tools\Microsoft.VisualStudio.DevShell.dll"
  158. Enter-VsDevShell -VsInstallPath $VSBaseDir -Arch $Arch -StartInPath $Path | Write-Host
  159. Write-Host # Newline after command output
  160. }
  161. function Invoke-Cmd([string] $command, [string[]] $options = @(), [switch] $maskargs, [switch] $quiet) {
  162. $call = ('{0} {1}' -f $command, ($options -Join ' '))
  163. if ($maskargs) {
  164. Write-Host "$command <masked>" -ForegroundColor DarkGray
  165. }
  166. else {
  167. Write-Host $call -ForegroundColor DarkGray
  168. }
  169. if ($quiet) {
  170. Invoke-Expression $call > $null
  171. } else {
  172. Invoke-Expression $call
  173. }
  174. if ($LASTEXITCODE -ne 0) {
  175. throw "Failed to run command: {0}" -f $command
  176. }
  177. Write-Host #insert newline after command output
  178. }
  179. function Find-SignCert() {
  180. $certs = Get-ChildItem Cert:\CurrentUser\My -codesign
  181. if ($certs.Count -eq 0) {
  182. throw "No code signing certificate found in User certificate store"
  183. } elseif ($certs.Count -gt 1) {
  184. # Ask the user which to use
  185. $i = 0
  186. foreach ($_ in $certs) {
  187. $i = $i + 1
  188. $i.ToString() + ") $($_.Thumbprint) - $($_.NotAfter)" | Write-Host
  189. }
  190. $i = Read-Host -Prompt "Which certificate do you want to use?"
  191. $i = [Convert]::ToInt32($i, 10) - 1
  192. if ($i -lt 0 -or $i -ge $certs.count) {
  193. throw "Invalid selection made"
  194. }
  195. return $certs[$i]
  196. } else {
  197. Write-Host "Found signing certificate: $($certs[0].Subject) ($($certs[0].Thumbprint))" -ForegroundColor Cyan
  198. Write-Host
  199. return $certs[0]
  200. }
  201. }
  202. function Invoke-SignFiles([string[]] $files, [X509Certificate] $cert, [string] $time) {
  203. if ($files.Length -eq 0) {
  204. return
  205. }
  206. Write-Host "Signing files using $($cert.Subject) ($($cert.Thumbprint))" -ForegroundColor Cyan
  207. foreach ($_ in $files) {
  208. Write-Host "Signing file '$_'"
  209. $tmp = Set-AuthenticodeSignature -Certificate $cert -FilePath "$_" -TimestampServer "$Timestamp" -HashAlgorithm "SHA256"
  210. }
  211. }
  212. function Invoke-GpgSignFiles([string[]] $files, [string] $key) {
  213. if ($files.Length -eq 0) {
  214. return
  215. }
  216. Write-Host "Signing files using GPG key $key" -ForegroundColor Cyan
  217. foreach ($_ in $files) {
  218. Write-Host "Signing file '$_' and creating DIGEST..."
  219. if (Test-Path "$_.sig") {
  220. Remove-Item "$_.sig"
  221. }
  222. Invoke-Cmd "gpg" "--output `"$_.sig`" --armor --local-user `"$key`" --detach-sig `"$_`""
  223. $FileName = (Get-Item $_).Name
  224. (Get-FileHash "$_" SHA256).Hash + " *$FileName" | Out-File "$_.DIGEST" -NoNewline
  225. }
  226. }
  227. # Handle errors and restore state
  228. $OrigDir = (Get-Location).Path
  229. $OrigBranch = & git rev-parse --abbrev-ref HEAD
  230. $ErrorActionPreference = 'Stop'
  231. trap {
  232. Write-Host "Restoring state..." -ForegroundColor Yellow
  233. & git checkout $OrigBranch
  234. Set-Location "$OrigDir"
  235. }
  236. Write-Host "KeePassXC Release Preparation Helper" -ForegroundColor Green
  237. Write-Host "Copyright (C) 2022 KeePassXC Team <https://keepassxc.org/>`n" -ForegroundColor Green
  238. # Prepend extra PATH locations as specified
  239. if ($ExtraPath) {
  240. $env:Path = "$ExtraPath;$env:Path"
  241. }
  242. # Resolve absolute directory for paths
  243. $SourceDir = (Resolve-Path $SourceDir).Path
  244. $OutDir = (Resolve-Path $OutDir).Path
  245. # Check format of -Version
  246. if ($Version -notmatch "^\d+\.\d+\.\d+(-Beta\d*)?$") {
  247. throw "Invalid format for -Version input"
  248. }
  249. # Check platform
  250. if (!$IsWindows) {
  251. throw "The PowerShell release tool is not available for Linux or macOS at this time."
  252. }
  253. if ($Merge) {
  254. Test-RequiredPrograms
  255. # Change to SourceDir
  256. Set-Location "$SourceDir"
  257. Test-VersionInFiles
  258. Test-WorkingTreeClean
  259. if (!$SourceBranch.Length) {
  260. $SourceBranch = & git branch --show-current
  261. }
  262. if ($SourceBranch -notmatch "^release/.*$") {
  263. throw "Must be on a release/* branch to continue."
  264. }
  265. # Update translation files
  266. Write-Host "Updating source translation file..."
  267. Invoke-Cmd "lupdate" "-no-ui-lines -disable-heuristic similartext -locations none", `
  268. "-extensions c,cpp,h,js,mm,qrc,ui -no-obsolete ./src -ts share/translations/keepassxc_en.ts"
  269. Write-Host "Pulling updated translations from Transifex..."
  270. Invoke-Cmd "tx" "pull -af --minimum-perc=60 -r keepassxc.share-translations-keepassxc-en-ts--develop"
  271. # Only commit if there are changes
  272. $changes = & git status --porcelain
  273. if ($changes.Length -gt 0) {
  274. Write-Host "Committing translation updates..."
  275. Invoke-Cmd "git" "add -A ./share/translations/" -quiet
  276. Invoke-Cmd "git" "commit -m `"Update translations`"" -quiet
  277. }
  278. # Read the version release notes from CHANGELOG
  279. $Changelog = ""
  280. $ReadLine = $false
  281. Get-Content "CHANGELOG.md" | ForEach-Object {
  282. if ($ReadLine) {
  283. if ($_ -match "^## ") {
  284. $ReadLine = $false
  285. } else {
  286. $Changelog += $_ + "`n"
  287. }
  288. } elseif ($_ -match "$Version \(\d{4}-\d{2}-\d{2}\)") {
  289. $ReadLine = $true
  290. }
  291. }
  292. Write-Host "Creating tag for '$Version'..."
  293. $tmp = New-TemporaryFile
  294. "Release $Version`n$Changelog" | Out-File $tmp.FullName
  295. Invoke-Cmd "git" "tag -a `"$Version`" -F `"$tmp`" -s" -quiet
  296. Remove-Item $tmp.FullName -Force
  297. Write-Host "Moving latest tag..."
  298. Invoke-Cmd "git" "tag -f -a `"latest`" -m `"Latest stable release`" -s" -quiet
  299. Write-Host "All done!"
  300. Write-Host "Please merge the release branch back into the develop branch now and then push your changes."
  301. Write-Host "Don't forget to also push the tags using 'git push --tags'."
  302. } elseif ($Build) {
  303. $Vcpkg = (Resolve-Path "$Vcpkg/scripts/buildsystems/vcpkg.cmake").Path
  304. # Find Visual Studio and establish build environment
  305. Invoke-VSToolchain $VSToolChain $SourceDir -Arch "amd64"
  306. if ($SignBuild && !$SignCert) {
  307. $SignCert = Find-SignCert
  308. }
  309. Test-RequiredPrograms
  310. if ($Snapshot) {
  311. $Tag = "HEAD"
  312. $SourceBranch = & git rev-parse --abbrev-ref HEAD
  313. $ReleaseName = "$Version-snapshot"
  314. $CMakeOptions = "-DKEEPASSXC_BUILD_TYPE=Snapshot -DOVERRIDE_VERSION=`"$ReleaseName`" $CMakeOptions"
  315. Write-Host "Using current branch '$SourceBranch' to build." -ForegroundColor Cyan
  316. } else {
  317. Test-WorkingTreeClean
  318. # Clear output directory
  319. if (Test-Path $OutDir) {
  320. Remove-Item $OutDir -Recurse
  321. }
  322. if ($Version -match "-beta\d*$") {
  323. $CMakeOptions = "-DKEEPASSXC_BUILD_TYPE=PreRelease $CMakeOptions"
  324. } else {
  325. $CMakeOptions = "-DKEEPASSXC_BUILD_TYPE=Release $CMakeOptions"
  326. }
  327. # Setup Tag if not defined then checkout tag
  328. if ($Tag -eq "" -or $Tag -eq $null) {
  329. $Tag = $Version
  330. }
  331. Write-Host "Checking out tag 'tags/$Tag' to build." -ForegroundColor Cyan
  332. Invoke-Cmd "git" "checkout `"tags/$Tag`""
  333. }
  334. # Create directories
  335. New-Item "$OutDir" -ItemType Directory -Force | Out-Null
  336. $OutDir = (Resolve-Path $OutDir).Path
  337. $BuildDir = "$OutDir\build-release"
  338. New-Item "$BuildDir" -ItemType Directory -Force | Out-Null
  339. # Enter build directory
  340. Set-Location "$BuildDir"
  341. # Setup CMake options
  342. $CMakeOptions = "-DWITH_XC_ALL=ON -DWITH_TESTS=OFF -DCMAKE_BUILD_TYPE=Release $CMakeOptions"
  343. $CMakeOptions = "-DCMAKE_TOOLCHAIN_FILE:FILEPATH=`"$Vcpkg`" -DX_VCPKG_APPLOCAL_DEPS_INSTALL=ON $CMakeOptions"
  344. Write-Host "Configuring build..." -ForegroundColor Cyan
  345. Invoke-Cmd "cmake" "-G `"$CMakeGenerator`" $CMakeOptions `"$SourceDir`""
  346. Write-Host "Compiling sources..." -ForegroundColor Cyan
  347. Invoke-Cmd "cmake" "--build . --config Release -- $MakeOptions"
  348. if ($SignBuild) {
  349. $VcpkgDir = $BuildDir + "\vcpkg_installed\"
  350. if (Test-Path $VcpkgDir) {
  351. $files = Get-ChildItem $VcpkgDir -Filter "*.dll" -Recurse -File |
  352. Where-Object {$_.FullName -notlike "$VcpkgDir*debug\*" -and $_.FullName -notlike "$VcpkgDir*tools\*"} |
  353. ForEach-Object {$_.FullName}
  354. }
  355. $files += Get-ChildItem "$BuildDir\src" -Include "*keepassxc*.exe", "*keepassxc*.dll" -Recurse -File | ForEach-Object { $_.FullName }
  356. Invoke-SignFiles $files $SignCert $Timestamp
  357. }
  358. Write-Host "Create deployment packages..." -ForegroundColor Cyan
  359. Invoke-Cmd "cpack" "-G `"$CPackGenerators`""
  360. Move-Item "$BuildDir\keepassxc-*" -Destination "$OutDir" -Force
  361. if ($SignBuild) {
  362. # Enter output directory
  363. Set-Location -Path "$OutDir"
  364. # Sign MSI files using AppSign key
  365. $files = Get-ChildItem $OutDir -Include "*.msi" -Name
  366. Invoke-SignFiles $files $SignCert $Timestamp
  367. # Sign all output files using the GPG key then hash them
  368. $files = Get-ChildItem $OutDir -Include "*.msi", "*.zip" -Name
  369. Invoke-GpgSignFiles $files $GpgKey
  370. }
  371. # Restore state
  372. Invoke-Command {git checkout $OrigBranch}
  373. Set-Location "$OrigDir"
  374. } elseif ($Sign) {
  375. Test-RequiredPrograms
  376. if (!$SignCert) {
  377. $SignCert = Find-SignCert
  378. }
  379. # Resolve wildcard paths
  380. $ResolvedFiles = @()
  381. foreach ($_ in $SignFiles) {
  382. $ResolvedFiles += (Get-ChildItem $_ -File | ForEach-Object { $_.FullName })
  383. }
  384. $AppSignFiles = $ResolvedFiles.Where({ $_ -match "\.(msi|exe|dll)$" })
  385. Invoke-SignFiles $AppSignFiles $SignCert $Timestamp
  386. $GpgSignFiles = $ResolvedFiles.Where({ $_ -match "\.(msi|zip|gz|xz|dmg|appimage)$" })
  387. Invoke-GpgSignFiles $GpgSignFiles $GpgKey
  388. }
  389. # SIG # Begin signature block
  390. # MIIk4QYJKoZIhvcNAQcCoIIk0jCCJM4CAQExDzANBglghkgBZQMEAgEFADB5Bgor
  391. # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
  392. # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCccYNZIS81XLXj
  393. # I4u2xwAAZSxeq/ghk/Li/aWf6Pd9dKCCHqUwggU6MIIEIqADAgECAhBYotctjMD9
  394. # icz/IeDU7cdKMA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAkdCMRswGQYDVQQI
  395. # ExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGDAWBgNVBAoT
  396. # D1NlY3RpZ28gTGltaXRlZDEkMCIGA1UEAxMbU2VjdGlnbyBSU0EgQ29kZSBTaWdu
  397. # aW5nIENBMB4XDTIxMDMxNTAwMDAwMFoXDTI0MDMxNDIzNTk1OVowgaExCzAJBgNV
  398. # BAYTAlVTMQ4wDAYDVQQRDAUyMjMxNTERMA8GA1UECAwIVmlyZ2luaWExEjAQBgNV
  399. # BAcMCUZyYW5jb25pYTEbMBkGA1UECQwSNjY1MyBBdWRyZXkgS2F5IEN0MR4wHAYD
  400. # VQQKDBVEcm9pZE1vbmtleSBBcHBzLCBMTEMxHjAcBgNVBAMMFURyb2lkTW9ua2V5
  401. # IEFwcHMsIExMQzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALAH0v/7
  402. # XOVxc5Auhi92tgBZL0Hm6L7sT1xcKfrBwHg12ZpFs0zeR1ZzyduM44d45y3aNXNW
  403. # 7+klHVJqAj5XVHUF/OB/O5bnljKIeupdAZ8v3GGokBZK91BGKe+WRn5ZjdDGc6HN
  404. # xCT4FMth1TCrTg7eMy/u+cfp+4ur8dcSyAM5tkLsTIoS1VtZWjiepjS1RO+Ile9E
  405. # j+wUM3wO9Qt5/BlYi8XsbXU0V4oi3bj6EMLO9UEq0SfsM2YUY7UIkAHtLPiMV7BX
  406. # gw/WC+IwB8ZtIGpq/JEME4bt51pJVvVmrjzbKgc0Cz6akhArZIa9QooAkrbAINvO
  407. # Cm+7mx/PBK2lzSECAwEAAaOCAZAwggGMMB8GA1UdIwQYMBaAFA7hOqhTOjHVir7B
  408. # u61nGgOFrTQOMB0GA1UdDgQWBBTu7ZZnt+omJoze71KXMDAYGGhYfTAOBgNVHQ8B
  409. # Af8EBAMCB4AwDAYDVR0TAQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcDAzARBglg
  410. # hkgBhvhCAQEEBAMCBBAwSgYDVR0gBEMwQTA1BgwrBgEEAbIxAQIBAwIwJTAjBggr
  411. # BgEFBQcCARYXaHR0cHM6Ly9zZWN0aWdvLmNvbS9DUFMwCAYGZ4EMAQQBMEMGA1Ud
  412. # HwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuc2VjdGlnby5jb20vU2VjdGlnb1JTQUNv
  413. # ZGVTaWduaW5nQ0EuY3JsMHMGCCsGAQUFBwEBBGcwZTA+BggrBgEFBQcwAoYyaHR0
  414. # cDovL2NydC5zZWN0aWdvLmNvbS9TZWN0aWdvUlNBQ29kZVNpZ25pbmdDQS5jcnQw
  415. # IwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLnNlY3RpZ28uY29tMA0GCSqGSIb3DQEB
  416. # CwUAA4IBAQAPbD9O3krI9tfYz6FZXCCqkqbjaeTpo3Ye9Kn4paWsHa37OIv7UhFf
  417. # CrtLRXunZ7Vkry5cvMGNQNUaMFy6CHmEYb3kwZWW3EImuv9uTUd7rYvszBXF8flv
  418. # kysT+8L9wdxLEQHUBnBnFgqMM99HzVuINVyH75d4qa9TF9PhcajsxwmpPgr9NwvC
  419. # KNJv8BaxdH6vYFcQCqCygbfuST99s8qKaknTuHF39E1hWkTfcT3fMJDVONzW0/cN
  420. # ourxylLqMZRjk007NGCnaYZwYfKW/pD/F/jmo28eKoVVy129j2h/RAWODl5gOvis
  421. # sNr6aSz1/Ul3xoNYpyx8IGeWiFMoh99tMIIFgTCCBGmgAwIBAgIQOXJEOvkit1HX
  422. # 02wQ3TE1lTANBgkqhkiG9w0BAQwFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
  423. # R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFD
  424. # b21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZp
  425. # Y2VzMB4XDTE5MDMxMjAwMDAwMFoXDTI4MTIzMTIzNTk1OVowgYgxCzAJBgNVBAYT
  426. # AlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtKZXJzZXkgQ2l0eTEe
  427. # MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYDVQQDEyVVU0VSVHJ1
  428. # c3QgUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF
  429. # AAOCAg8AMIICCgKCAgEAgBJlFzYOw9sIs9CsVw127c0n00ytUINh4qogTQktZAnc
  430. # zomfzD2p7PbPwdzx07HWezcoEStH2jnGvDoZtF+mvX2do2NCtnbyqTsrkfjib9Ds
  431. # FiCQCT7i6HTJGLSR1GJk23+jBvGIGGqQIjy8/hPwhxR79uQfjtTkUcYRZ0YIUcuG
  432. # FFQ/vDP+fmyc/xadGL1RjjWmp2bIcmfbIWax1Jt4A8BQOujM8Ny8nkz+rwWWNR9X
  433. # Wrf/zvk9tyy29lTdyOcSOk2uTIq3XJq0tyA9yn8iNK5+O2hmAUTnAU5GU5szYPeU
  434. # vlM3kHND8zLDU+/bqv50TmnHa4xgk97Exwzf4TKuzJM7UXiVZ4vuPVb+DNBpDxsP
  435. # 8yUmazNt925H+nND5X4OpWaxKXwyhGNVicQNwZNUMBkTrNN9N6frXTpsNVzbQdcS
  436. # 2qlJC9/YgIoJk2KOtWbPJYjNhLixP6Q5D9kCnusSTJV882sFqV4Wg8y4Z+LoE53M
  437. # W4LTTLPtW//e5XOsIzstAL81VXQJSdhJWBp/kjbmUZIO8yZ9HE0XvMnsQybQv0Ff
  438. # QKlERPSZ51eHnlAfV1SoPv10Yy+xUGUJ5lhCLkMaTLTwJUdZ+gQek9QmRkpQgbLe
  439. # vni3/GcV4clXhB4PY9bpYrrWX1Uu6lzGKAgEJTm4Diup8kyXHAc/DVL17e8vgg8C
  440. # AwEAAaOB8jCB7zAfBgNVHSMEGDAWgBSgEQojPpbxB+zirynvgqV/0DCktDAdBgNV
  441. # HQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgGGMA8GA1Ud
  442. # EwEB/wQFMAMBAf8wEQYDVR0gBAowCDAGBgRVHSAAMEMGA1UdHwQ8MDowOKA2oDSG
  443. # Mmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0FBQUNlcnRpZmljYXRlU2VydmljZXMu
  444. # Y3JsMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuY29t
  445. # b2RvY2EuY29tMA0GCSqGSIb3DQEBDAUAA4IBAQAYh1HcdCE9nIrgJ7cz0C7M7PDm
  446. # y14R3iJvm3WOnnL+5Nb+qh+cli3vA0p+rvSNb3I8QzvAP+u431yqqcau8vzY7qN7
  447. # Q/aGNnwU4M309z/+3ri0ivCRlv79Q2R+/czSAaF9ffgZGclCKxO/WIu6pKJmBHaI
  448. # kU4MiRTOok3JMrO66BQavHHxW/BBC5gACiIDEOUMsfnNkjcZ7Tvx5Dq2+UUTJnWv
  449. # u6rvP3t3O9LEApE9GQDTF1w52z97GA1FzZOFli9d31kWTz9RvdVFGD/tSo7oBmF0
  450. # Ixa1DVBzJ0RHfxBdiSprhTEUxOipakyAvGp4z7h/jnZymQyd/teRCBaho1+VMIIF
  451. # 9TCCA92gAwIBAgIQHaJIMG+bJhjQguCWfTPTajANBgkqhkiG9w0BAQwFADCBiDEL
  452. # MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl
  453. # eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT
  454. # JVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTgxMTAy
  455. # MDAwMDAwWhcNMzAxMjMxMjM1OTU5WjB8MQswCQYDVQQGEwJHQjEbMBkGA1UECBMS
  456. # R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRgwFgYDVQQKEw9T
  457. # ZWN0aWdvIExpbWl0ZWQxJDAiBgNVBAMTG1NlY3RpZ28gUlNBIENvZGUgU2lnbmlu
  458. # ZyBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAIYijTKFehifSfCW
  459. # L2MIHi3cfJ8Uz+MmtiVmKUCGVEZ0MWLFEO2yhyemmcuVMMBW9aR1xqkOUGKlUZEQ
  460. # auBLYq798PgYrKf/7i4zIPoMGYmobHutAMNhodxpZW0fbieW15dRhqb0J+V8aouV
  461. # Hltg1X7XFpKcAC9o95ftanK+ODtj3o+/bkxBXRIgCFnoOc2P0tbPBrRXBbZOoT5X
  462. # ax+YvMRi1hsLjcdmG0qfnYHEckC14l/vC0X/o84Xpi1VsLewvFRqnbyNVlPG8Lp5
  463. # UEks9wO5/i9lNfIi6iwHr0bZ+UYc3Ix8cSjz/qfGFN1VkW6KEQ3fBiSVfQ+noXw6
  464. # 2oY1YdMCAwEAAaOCAWQwggFgMB8GA1UdIwQYMBaAFFN5v1qqK0rPVIDh2JvAnfKy
  465. # A2bLMB0GA1UdDgQWBBQO4TqoUzox1Yq+wbutZxoDha00DjAOBgNVHQ8BAf8EBAMC
  466. # AYYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHSUEFjAUBggrBgEFBQcDAwYIKwYB
  467. # BQUHAwgwEQYDVR0gBAowCDAGBgRVHSAAMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6
  468. # Ly9jcmwudXNlcnRydXN0LmNvbS9VU0VSVHJ1c3RSU0FDZXJ0aWZpY2F0aW9uQXV0
  469. # aG9yaXR5LmNybDB2BggrBgEFBQcBAQRqMGgwPwYIKwYBBQUHMAKGM2h0dHA6Ly9j
  470. # cnQudXNlcnRydXN0LmNvbS9VU0VSVHJ1c3RSU0FBZGRUcnVzdENBLmNydDAlBggr
  471. # BgEFBQcwAYYZaHR0cDovL29jc3AudXNlcnRydXN0LmNvbTANBgkqhkiG9w0BAQwF
  472. # AAOCAgEATWNQ7Uc0SmGk295qKoyb8QAAHh1iezrXMsL2s+Bjs/thAIiaG20QBwRP
  473. # vrjqiXgi6w9G7PNGXkBGiRL0C3danCpBOvzW9Ovn9xWVM8Ohgyi33i/klPeFM4Mt
  474. # SkBIv5rCT0qxjyT0s4E307dksKYjalloUkJf/wTr4XRleQj1qZPea3FAmZa6ePG5
  475. # yOLDCBaxq2NayBWAbXReSnV+pbjDbLXP30p5h1zHQE1jNfYw08+1Cg4LBH+gS667
  476. # o6XQhACTPlNdNKUANWlsvp8gJRANGftQkGG+OY96jk32nw4e/gdREmaDJhlIlc5K
  477. # ycF/8zoFm/lv34h/wCOe0h5DekUxwZxNqfBZslkZ6GqNKQQCd3xLS81wvjqyVVp4
  478. # Pry7bwMQJXcVNIr5NsxDkuS6T/FikyglVyn7URnHoSVAaoRXxrKdsbwcCtp8Z359
  479. # LukoTBh+xHsxQXGaSynsCz1XUNLK3f2eBVHlRHjdAd6xdZgNVCT98E7j4viDvXK6
  480. # yz067vBeF5Jobchh+abxKgoLpbn0nu6YMgWFnuv5gynTxix9vTp3Los3QqBqgu07
  481. # SqqUEKThDfgXxbZaeTMYkuO1dfih6Y4KJR7kHvGfWocj/5+kUZ77OYARzdu1xKeo
  482. # gG/lU9Tg46LC0lsa+jImLWpXcBw8pFguo/NbSwfcMlnzh6cabVgwggbsMIIE1KAD
  483. # AgECAhAwD2+s3WaYdHypRjaneC25MA0GCSqGSIb3DQEBDAUAMIGIMQswCQYDVQQG
  484. # EwJVUzETMBEGA1UECBMKTmV3IEplcnNleTEUMBIGA1UEBxMLSmVyc2V5IENpdHkx
  485. # HjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEuMCwGA1UEAxMlVVNFUlRy
  486. # dXN0IFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xOTA1MDIwMDAwMDBa
  487. # Fw0zODAxMTgyMzU5NTlaMH0xCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVy
  488. # IE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGDAWBgNVBAoTD1NlY3RpZ28g
  489. # TGltaXRlZDElMCMGA1UEAxMcU2VjdGlnbyBSU0EgVGltZSBTdGFtcGluZyBDQTCC
  490. # AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMgbAa/ZLH6ImX0BmD8gkL2c
  491. # gCFUk7nPoD5T77NawHbWGgSlzkeDtevEzEk0y/NFZbn5p2QWJgn71TJSeS7JY8IT
  492. # m7aGPwEFkmZvIavVcRB5h/RGKs3EWsnb111JTXJWD9zJ41OYOioe/M5YSdO/8zm7
  493. # uaQjQqzQFcN/nqJc1zjxFrJw06PE37PFcqwuCnf8DZRSt/wflXMkPQEovA8NT7OR
  494. # AY5unSd1VdEXOzQhe5cBlK9/gM/REQpXhMl/VuC9RpyCvpSdv7QgsGB+uE31DT/b
  495. # 0OqFjIpWcdEtlEzIjDzTFKKcvSb/01Mgx2Bpm1gKVPQF5/0xrPnIhRfHuCkZpCkv
  496. # RuPd25Ffnz82Pg4wZytGtzWvlr7aTGDMqLufDRTUGMQwmHSCIc9iVrUhcxIe/arK
  497. # CFiHd6QV6xlV/9A5VC0m7kUaOm/N14Tw1/AoxU9kgwLU++Le8bwCKPRt2ieKBtKW
  498. # h97oaw7wW33pdmmTIBxKlyx3GSuTlZicl57rjsF4VsZEJd8GEpoGLZ8DXv2DolNn
  499. # yrH6jaFkyYiSWcuoRsDJ8qb/fVfbEnb6ikEk1Bv8cqUUotStQxykSYtBORQDHin6
  500. # G6UirqXDTYLQjdprt9v3GEBXc/Bxo/tKfUU2wfeNgvq5yQ1TgH36tjlYMu9vGFCJ
  501. # 10+dM70atZ2h3pVBeqeDAgMBAAGjggFaMIIBVjAfBgNVHSMEGDAWgBRTeb9aqitK
  502. # z1SA4dibwJ3ysgNmyzAdBgNVHQ4EFgQUGqH4YRkgD8NBd0UojtE1XwYSBFUwDgYD
  503. # VR0PAQH/BAQDAgGGMBIGA1UdEwEB/wQIMAYBAf8CAQAwEwYDVR0lBAwwCgYIKwYB
  504. # BQUHAwgwEQYDVR0gBAowCDAGBgRVHSAAMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6
  505. # Ly9jcmwudXNlcnRydXN0LmNvbS9VU0VSVHJ1c3RSU0FDZXJ0aWZpY2F0aW9uQXV0
  506. # aG9yaXR5LmNybDB2BggrBgEFBQcBAQRqMGgwPwYIKwYBBQUHMAKGM2h0dHA6Ly9j
  507. # cnQudXNlcnRydXN0LmNvbS9VU0VSVHJ1c3RSU0FBZGRUcnVzdENBLmNydDAlBggr
  508. # BgEFBQcwAYYZaHR0cDovL29jc3AudXNlcnRydXN0LmNvbTANBgkqhkiG9w0BAQwF
  509. # AAOCAgEAbVSBpTNdFuG1U4GRdd8DejILLSWEEbKw2yp9KgX1vDsn9FqguUlZkCls
  510. # Ycu1UNviffmfAO9Aw63T4uRW+VhBz/FC5RB9/7B0H4/GXAn5M17qoBwmWFzztBEP
  511. # 1dXD4rzVWHi/SHbhRGdtj7BDEA+N5Pk4Yr8TAcWFo0zFzLJTMJWk1vSWVgi4zVx/
  512. # AZa+clJqO0I3fBZ4OZOTlJux3LJtQW1nzclvkD1/RXLBGyPWwlWEZuSzxWYG9vPW
  513. # S16toytCiiGS/qhvWiVwYoFzY16gu9jc10rTPa+DBjgSHSSHLeT8AtY+dwS8BDa1
  514. # 53fLnC6NIxi5o8JHHfBd1qFzVwVomqfJN2Udvuq82EKDQwWli6YJ/9GhlKZOqj0J
  515. # 9QVst9JkWtgqIsJLnfE5XkzeSD2bNJaaCV+O/fexUpHOP4n2HKG1qXUfcb9bQ11l
  516. # PVCBbqvw0NP8srMftpmWJvQ8eYtcZMzN7iea5aDADHKHwW5NWtMe6vBE5jJvHOsX
  517. # TpTDeGUgOw9Bqh/poUGd/rG4oGUqNODeqPk85sEwu8CgYyz8XBYAqNDEf+oRnR4G
  518. # xqZtMl20OAkrSQeq/eww2vGnL8+3/frQo4TZJ577AWZ3uVYQ4SBuxq6x+ba6yDVd
  519. # M3aO8XwgDCp3rrWiAoa6Ke60WgCxjKvj+QrJVF3UuWp0nr1Irpgwggb1MIIE3aAD
  520. # AgECAhA5TCXhfKBtJ6hl4jvZHSLUMA0GCSqGSIb3DQEBDAUAMH0xCzAJBgNVBAYT
  521. # AkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZv
  522. # cmQxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDElMCMGA1UEAxMcU2VjdGlnbyBS
  523. # U0EgVGltZSBTdGFtcGluZyBDQTAeFw0yMzA1MDMwMDAwMDBaFw0zNDA4MDIyMzU5
  524. # NTlaMGoxCzAJBgNVBAYTAkdCMRMwEQYDVQQIEwpNYW5jaGVzdGVyMRgwFgYDVQQK
  525. # Ew9TZWN0aWdvIExpbWl0ZWQxLDAqBgNVBAMMI1NlY3RpZ28gUlNBIFRpbWUgU3Rh
  526. # bXBpbmcgU2lnbmVyICM0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA
  527. # pJMoUkvPJ4d2pCkcmTjA5w7U0RzsaMsBZOSKzXewcWWCvJ/8i7u7lZj7JRGOWogJ
  528. # ZhEUWLK6Ilvm9jLxXS3AeqIO4OBWZO2h5YEgciBkQWzHwwj6831d7yGawn7XLMO6
  529. # EZge/NMgCEKzX79/iFgyqzCz2Ix6lkoZE1ys/Oer6RwWLrCwOJVKz4VQq2cDJaG7
  530. # OOkPb6lampEoEzW5H/M94STIa7GZ6A3vu03lPYxUA5HQ/C3PVTM4egkcB9Ei4GOG
  531. # p7790oNzEhSbmkwJRr00vOFLUHty4Fv9GbsfPGoZe267LUQqvjxMzKyKBJPGV4ag
  532. # czYrgZf6G5t+iIfYUnmJ/m53N9e7UJ/6GCVPE/JefKmxIFopq6NCh3fg9EwCSN1Y
  533. # pVOmo6DtGZZlFSnF7TMwJeaWg4Ga9mBmkFgHgM1Cdaz7tJHQxd0BQGq2qBDu9o16
  534. # t551r9OlSxihDJ9XsF4lR5F0zXUS0Zxv5F4Nm+x1Ju7+0/WSL1KF6NpEUSqizADK
  535. # h2ZDoxsA76K1lp1irScL8htKycOUQjeIIISoh67DuiNye/hU7/hrJ7CF9adDhdgr
  536. # OXTbWncC0aT69c2cPcwfrlHQe2zYHS0RQlNxdMLlNaotUhLZJc/w09CRQxLXMn2Y
  537. # bON3Qcj/HyRU726txj5Ve/Fchzpk8WBLBU/vuS/sCRMCAwEAAaOCAYIwggF+MB8G
  538. # A1UdIwQYMBaAFBqh+GEZIA/DQXdFKI7RNV8GEgRVMB0GA1UdDgQWBBQDDzHIkSqT
  539. # vWPz0V1NpDQP0pUBGDAOBgNVHQ8BAf8EBAMCBsAwDAYDVR0TAQH/BAIwADAWBgNV
  540. # HSUBAf8EDDAKBggrBgEFBQcDCDBKBgNVHSAEQzBBMDUGDCsGAQQBsjEBAgEDCDAl
  541. # MCMGCCsGAQUFBwIBFhdodHRwczovL3NlY3RpZ28uY29tL0NQUzAIBgZngQwBBAIw
  542. # RAYDVR0fBD0wOzA5oDegNYYzaHR0cDovL2NybC5zZWN0aWdvLmNvbS9TZWN0aWdv
  543. # UlNBVGltZVN0YW1waW5nQ0EuY3JsMHQGCCsGAQUFBwEBBGgwZjA/BggrBgEFBQcw
  544. # AoYzaHR0cDovL2NydC5zZWN0aWdvLmNvbS9TZWN0aWdvUlNBVGltZVN0YW1waW5n
  545. # Q0EuY3J0MCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0aWdvLmNvbTANBgkq
  546. # hkiG9w0BAQwFAAOCAgEATJtlWPrgec/vFcMybd4zket3WOLrvctKPHXefpRtwyLH
  547. # BJXfZWlhEwz2DJ71iSBewYfHAyTKx6XwJt/4+DFlDeDrbVFXpoyEUghGHCrC3vLa
  548. # ikXzvvf2LsR+7fjtaL96VkjpYeWaOXe8vrqRZIh1/12FFjQn0inL/+0t2v++kwzs
  549. # baINzMPxbr0hkRojAFKtl9RieCqEeajXPawhj3DDJHk6l/ENo6NbU9irALpY+zWA
  550. # T18ocWwZXsKDcpCu4MbY8pn76rSSZXwHfDVEHa1YGGti+95sxAqpbNMhRnDcL411
  551. # TCPCQdB6ljvDS93NkiZ0dlw3oJoknk5fTtOPD+UTT1lEZUtDZM9I+GdnuU2/zA2x
  552. # OjDQoT1IrXpl5Ozf4AHwsypKOazBpPmpfTXQMkCgsRkqGCGyyH0FcRpLJzaq4Jgc
  553. # g3Xnx35LhEPNQ/uQl3YqEqxAwXBbmQpA+oBtlGF7yG65yGdnJFxQjQEg3gf3AdT4
  554. # LhHNnYPl+MolHEQ9J+WwhkcqCxuEdn17aE+Nt/cTtO2gLe5zD9kQup2ZLHzXdR+P
  555. # EMSU5n4k5ZVKiIwn1oVmHfmuZHaR6Ej+yFUK7SnDH944psAU+zI9+KmDYjbIw74A
  556. # hxyr+kpCHIkD3PVcfHDZXXhO7p9eIOYJanwrCKNI9RX8BE/fzSEceuX1jhrUuUAx
  557. # ggWSMIIFjgIBATCBkDB8MQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBN
  558. # YW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRgwFgYDVQQKEw9TZWN0aWdvIExp
  559. # bWl0ZWQxJDAiBgNVBAMTG1NlY3RpZ28gUlNBIENvZGUgU2lnbmluZyBDQQIQWKLX
  560. # LYzA/YnM/yHg1O3HSjANBglghkgBZQMEAgEFAKCBhDAYBgorBgEEAYI3AgEMMQow
  561. # CKACgAChAoAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcC
  562. # AQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCClTHkKOG5BeIXQuZeR
  563. # qwwE8AAIAc5Ygaq8ElaHav3yZDANBgkqhkiG9w0BAQEFAASCAQBDfc08YhR0CGst
  564. # QY87ZyIwWXCkS5no07miWZo806Rhl28AqeNlIsYm4RHxtXTTLfENz3Wkc8h/2fnQ
  565. # +3MAif0m8CAXd5bQUHXXK01wI0ksKMpYNVZEjEeqjFuO22kT4RbUhTwI437Xa/iG
  566. # j+OZB1bWYdsClMY15vTkrGLyGZGxK7nGVyYcAzFL9oZNg5izhA7z3X8B4tP/VIZ6
  567. # vhZTOw75gTiOoS4pJX+0lGBMj1URs6Hh1/oXI10hTaopD2DGGTljQME2B495LhN4
  568. # WRQ2WTZLhEBHLHe5bNBA/F7rWhzKZ8qpwQfLdG2CeYyCPn2zAb3Se/tW4xsKFPbV
  569. # nXCrfarsoYIDSzCCA0cGCSqGSIb3DQEJBjGCAzgwggM0AgEBMIGRMH0xCzAJBgNV
  570. # BAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1Nh
  571. # bGZvcmQxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDElMCMGA1UEAxMcU2VjdGln
  572. # byBSU0EgVGltZSBTdGFtcGluZyBDQQIQOUwl4XygbSeoZeI72R0i1DANBglghkgB
  573. # ZQMEAgIFAKB5MBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkF
  574. # MQ8XDTI0MDMwOTIxMjE1OVowPwYJKoZIhvcNAQkEMTIEMFC4yhLWLtNfpFox+egv
  575. # RCh29BdkBTGJcqIcz8DJK2RcrmfQu5cDRW2Sgeh0PMRvRTANBgkqhkiG9w0BAQEF
  576. # AASCAgCWWrib6aQ86zx7NB0PetoKZkzv9q76m7auuJiM83uFrpke3UlUf8DgxwTC
  577. # RZEV9pwnCDjZ3VU0CGwC1eVr2tgZx3ylYvHSfE8xFtYLKQjk5O2Y/d+SyYGgyHs9
  578. # rLNMhZmK5Qj5JP6KJhNkLi3zZYbyP6xCnwv72nHKdl76xOAulJnb7G24wm/WRqQH
  579. # 9AhQ0ZVdGcWYYYpOa1eWCe6wdvFlgfCLQwZWU3a54I28pa02jFaRaX9ZSlf9kr2T
  580. # MBbcylZYvyVc0bDgIyIjVQAj/rQjvRiwpnxlruhm24/HfY3B3M0GdSbGB0E1z69h
  581. # uiyDjBhRHCPWbATs5ruM6pY/csGTvB7kl6+qfym0sg3t1aOd1LzYBD2/O+FxuDlM
  582. # cjBp8h2CTGs7R+moephhASSjVRte8sr0GRMRLRVFiUK4W/QzWRc3e371NmMeADsr
  583. # 4PCfiOfyzpkl6Bf5rXyEvRPnnSjQ5jaVVbSfh66++6o81mJF3ZehVlBUVdV8qvLm
  584. # YmRe6kjhhh0xXu8uaC1YA3uyXNPJCB0su9mZrou8gIBF9xcexQnEd9HPF9uydJHj
  585. # d5xTor+6XVzpiEJHDYPfOIiA4ojrT++q5WVd3TZue/XiQUGnYlvWAzUdMi7cO+Ek
  586. # SMuWviD9lMHkfhtLzBKdcC4DDcEPYRQ7NCwL6mLO4bZi748S8Q==
  587. # SIG # End signature block