release-tool.ps1 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669
  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. $sig = Get-AuthenticodeSignature -FilePath "$_" -ErrorAction SilentlyContinue
  209. if ($sig.Status -ne "Valid") {
  210. Write-Host "Signing file '$_'"
  211. $tmp = Set-AuthenticodeSignature -Certificate $cert -FilePath "$_" -TimestampServer "$Timestamp" -HashAlgorithm "SHA256"
  212. }
  213. }
  214. }
  215. function Invoke-GpgSignFiles([string[]] $files, [string] $key) {
  216. if ($files.Length -eq 0) {
  217. return
  218. }
  219. Write-Host "Signing files using GPG key $key" -ForegroundColor Cyan
  220. foreach ($_ in $files) {
  221. Write-Host "Signing file '$_' and creating DIGEST..."
  222. if (Test-Path "$_.sig") {
  223. Remove-Item "$_.sig"
  224. }
  225. Invoke-Cmd "gpg" "--output `"$_.sig`" --armor --local-user `"$key`" --detach-sig `"$_`""
  226. $FileName = (Get-Item $_).Name
  227. (Get-FileHash "$_" SHA256).Hash + " *$FileName" | Out-File "$_.DIGEST" -NoNewline
  228. }
  229. }
  230. # Handle errors and restore state
  231. $OrigDir = (Get-Location).Path
  232. $OrigBranch = & git rev-parse --abbrev-ref HEAD
  233. $ErrorActionPreference = 'Stop'
  234. trap {
  235. Write-Host "Restoring state..." -ForegroundColor Yellow
  236. & git checkout $OrigBranch
  237. Set-Location "$OrigDir"
  238. }
  239. Write-Host "KeePassXC Release Preparation Helper" -ForegroundColor Green
  240. Write-Host "Copyright (C) 2022 KeePassXC Team <https://keepassxc.org/>`n" -ForegroundColor Green
  241. # Prepend extra PATH locations as specified
  242. if ($ExtraPath) {
  243. $env:Path = "$ExtraPath;$env:Path"
  244. }
  245. # Resolve absolute directory for paths
  246. $SourceDir = (Resolve-Path $SourceDir).Path
  247. # Check format of -Version
  248. if ($Version -notmatch "^\d+\.\d+\.\d+(-Beta\d*)?$") {
  249. throw "Invalid format for -Version input"
  250. }
  251. # Check platform
  252. if (!$IsWindows) {
  253. throw "The PowerShell release tool is not available for Linux or macOS at this time."
  254. }
  255. if ($Merge) {
  256. Test-RequiredPrograms
  257. # Change to SourceDir
  258. Set-Location "$SourceDir"
  259. Test-VersionInFiles
  260. Test-WorkingTreeClean
  261. if (!$SourceBranch.Length) {
  262. $SourceBranch = & git branch --show-current
  263. }
  264. if ($SourceBranch -notmatch "^release/.*$") {
  265. throw "Must be on a release/* branch to continue."
  266. }
  267. # Update translation files
  268. Write-Host "Updating source translation file..."
  269. Invoke-Cmd "lupdate" "-no-ui-lines -disable-heuristic similartext -locations none", `
  270. "-extensions c,cpp,h,js,mm,qrc,ui -no-obsolete ./src -ts share/translations/keepassxc_en.ts"
  271. Write-Host "Pulling updated translations from Transifex..."
  272. Invoke-Cmd "tx" "pull -af --minimum-perc=60 -r keepassxc.share-translations-keepassxc-en-ts--develop"
  273. # Only commit if there are changes
  274. $changes = & git status --porcelain
  275. if ($changes.Length -gt 0) {
  276. Write-Host "Committing translation updates..."
  277. Invoke-Cmd "git" "add -A ./share/translations/" -quiet
  278. Invoke-Cmd "git" "commit -m `"Update translations`"" -quiet
  279. }
  280. # Read the version release notes from CHANGELOG
  281. $Changelog = ""
  282. $ReadLine = $false
  283. Get-Content "CHANGELOG.md" | ForEach-Object {
  284. if ($ReadLine) {
  285. if ($_ -match "^## ") {
  286. $ReadLine = $false
  287. } else {
  288. $Changelog += $_ + "`n"
  289. }
  290. } elseif ($_ -match "$Version \(\d{4}-\d{2}-\d{2}\)") {
  291. $ReadLine = $true
  292. }
  293. }
  294. Write-Host "Creating tag for '$Version'..."
  295. $tmp = New-TemporaryFile
  296. "Release $Version`n$Changelog" | Out-File $tmp.FullName
  297. Invoke-Cmd "git" "tag -a `"$Version`" -F `"$tmp`" -s" -quiet
  298. Remove-Item $tmp.FullName -Force
  299. Write-Host "Moving latest tag..."
  300. Invoke-Cmd "git" "tag -f -a `"latest`" -m `"Latest stable release`" -s" -quiet
  301. Write-Host "All done!"
  302. Write-Host "Please merge the release branch back into the develop branch now and then push your changes."
  303. Write-Host "Don't forget to also push the tags using 'git push --tags'."
  304. } elseif ($Build) {
  305. $Vcpkg = (Resolve-Path "$Vcpkg/scripts/buildsystems/vcpkg.cmake").Path
  306. # Find Visual Studio and establish build environment
  307. Invoke-VSToolchain $VSToolChain $SourceDir -Arch "amd64"
  308. if ($SignBuild && !$SignCert) {
  309. $SignCert = Find-SignCert
  310. }
  311. Test-RequiredPrograms
  312. if ($Snapshot) {
  313. $Tag = "HEAD"
  314. $SourceBranch = & git rev-parse --abbrev-ref HEAD
  315. $ReleaseName = "$Version-snapshot"
  316. $CMakeOptions = "-DKEEPASSXC_BUILD_TYPE=Snapshot -DOVERRIDE_VERSION=`"$ReleaseName`" $CMakeOptions"
  317. Write-Host "Using current branch '$SourceBranch' to build." -ForegroundColor Cyan
  318. } else {
  319. Test-WorkingTreeClean
  320. # Clear output directory
  321. if (Test-Path $OutDir) {
  322. Remove-Item $OutDir -Recurse
  323. }
  324. if ($Version -match "-beta\d*$") {
  325. $CMakeOptions = "-DKEEPASSXC_BUILD_TYPE=PreRelease $CMakeOptions"
  326. } else {
  327. $CMakeOptions = "-DKEEPASSXC_BUILD_TYPE=Release $CMakeOptions"
  328. }
  329. # Setup Tag if not defined then checkout tag
  330. if ($Tag -eq "" -or $Tag -eq $null) {
  331. $Tag = $Version
  332. }
  333. Write-Host "Checking out tag 'tags/$Tag' to build." -ForegroundColor Cyan
  334. Invoke-Cmd "git" "checkout `"tags/$Tag`""
  335. }
  336. # Create directories
  337. New-Item "$OutDir" -ItemType Directory -Force | Out-Null
  338. $OutDir = (Resolve-Path $OutDir).Path
  339. $BuildDir = "$OutDir\build-release"
  340. New-Item "$BuildDir" -ItemType Directory -Force | Out-Null
  341. # Enter build directory
  342. Set-Location "$BuildDir"
  343. # Setup CMake options
  344. $CMakeOptions = "-DWITH_XC_ALL=ON -DWITH_TESTS=OFF -DCMAKE_BUILD_TYPE=Release $CMakeOptions"
  345. $CMakeOptions = "-DCMAKE_TOOLCHAIN_FILE:FILEPATH=`"$Vcpkg`" -DX_VCPKG_APPLOCAL_DEPS_INSTALL=ON $CMakeOptions"
  346. Write-Host "Configuring build..." -ForegroundColor Cyan
  347. Invoke-Cmd "cmake" "-G `"$CMakeGenerator`" $CMakeOptions `"$SourceDir`""
  348. Write-Host "Compiling sources..." -ForegroundColor Cyan
  349. Invoke-Cmd "cmake" "--build . --config Release -- $MakeOptions"
  350. if ($SignBuild) {
  351. $VcpkgDir = $BuildDir + "\vcpkg_installed\"
  352. if (Test-Path $VcpkgDir) {
  353. $files = Get-ChildItem $VcpkgDir -Filter "*.dll" -Recurse -File |
  354. Where-Object {$_.FullName -notlike "$VcpkgDir*debug\*" -and $_.FullName -notlike "$VcpkgDir*tools\*"} |
  355. ForEach-Object {$_.FullName}
  356. }
  357. $files += Get-ChildItem "$BuildDir\src" -Include "*keepassxc*.exe", "*keepassxc*.dll" -Recurse -File | ForEach-Object { $_.FullName }
  358. Invoke-SignFiles $files $SignCert $Timestamp
  359. }
  360. Write-Host "Create deployment packages..." -ForegroundColor Cyan
  361. Invoke-Cmd "cpack" "-G `"$CPackGenerators`""
  362. Move-Item "$BuildDir\keepassxc-*" -Destination "$OutDir" -Force
  363. if ($SignBuild) {
  364. # Enter output directory
  365. Set-Location -Path "$OutDir"
  366. # Sign MSI files using AppSign key
  367. $files = Get-ChildItem $OutDir -Include "*.msi" -Name
  368. Invoke-SignFiles $files $SignCert $Timestamp
  369. # Sign all output files using the GPG key then hash them
  370. $files = Get-ChildItem $OutDir -Include "*.msi", "*.zip" -Name
  371. Invoke-GpgSignFiles $files $GpgKey
  372. }
  373. # Restore state
  374. Invoke-Command {git checkout $OrigBranch}
  375. Set-Location "$OrigDir"
  376. } elseif ($Sign) {
  377. Test-RequiredPrograms
  378. if (!$SignCert) {
  379. $SignCert = Find-SignCert
  380. }
  381. # Resolve wildcard paths
  382. $ResolvedFiles = @()
  383. foreach ($_ in $SignFiles) {
  384. $ResolvedFiles += (Get-ChildItem $_ -File | ForEach-Object { $_.FullName })
  385. }
  386. $AppSignFiles = $ResolvedFiles.Where({ $_ -match "\.(msi|exe|dll)$" })
  387. Invoke-SignFiles $AppSignFiles $SignCert $Timestamp
  388. $GpgSignFiles = $ResolvedFiles.Where({ $_ -match "\.(msi|zip|gz|xz|dmg|appimage)$" })
  389. Invoke-GpgSignFiles $GpgSignFiles $GpgKey
  390. }
  391. # SIG # Begin signature block
  392. # MIIm2gYJKoZIhvcNAQcCoIImyzCCJscCAQExDzANBglghkgBZQMEAgEFADB5Bgor
  393. # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
  394. # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDuejql+mhHrYzE
  395. # MGUrjGMbUzkTkzwhj8dkNuT2x9j8+KCCH8cwggVvMIIEV6ADAgECAhBI/JO0YFWU
  396. # jTanyYqJ1pQWMA0GCSqGSIb3DQEBDAUAMHsxCzAJBgNVBAYTAkdCMRswGQYDVQQI
  397. # DBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoM
  398. # EUNvbW9kbyBDQSBMaW1pdGVkMSEwHwYDVQQDDBhBQUEgQ2VydGlmaWNhdGUgU2Vy
  399. # dmljZXMwHhcNMjEwNTI1MDAwMDAwWhcNMjgxMjMxMjM1OTU5WjBWMQswCQYDVQQG
  400. # EwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMS0wKwYDVQQDEyRTZWN0aWdv
  401. # IFB1YmxpYyBDb2RlIFNpZ25pbmcgUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEBAQUA
  402. # A4ICDwAwggIKAoICAQCN55QSIgQkdC7/FiMCkoq2rjaFrEfUI5ErPtx94jGgUW+s
  403. # hJHjUoq14pbe0IdjJImK/+8Skzt9u7aKvb0Ffyeba2XTpQxpsbxJOZrxbW6q5KCD
  404. # J9qaDStQ6Utbs7hkNqR+Sj2pcaths3OzPAsM79szV+W+NDfjlxtd/R8SPYIDdub7
  405. # P2bSlDFp+m2zNKzBenjcklDyZMeqLQSrw2rq4C+np9xu1+j/2iGrQL+57g2extme
  406. # me/G3h+pDHazJyCh1rr9gOcB0u/rgimVcI3/uxXP/tEPNqIuTzKQdEZrRzUTdwUz
  407. # T2MuuC3hv2WnBGsY2HH6zAjybYmZELGt2z4s5KoYsMYHAXVn3m3pY2MeNn9pib6q
  408. # RT5uWl+PoVvLnTCGMOgDs0DGDQ84zWeoU4j6uDBl+m/H5x2xg3RpPqzEaDux5mcz
  409. # mrYI4IAFSEDu9oJkRqj1c7AGlfJsZZ+/VVscnFcax3hGfHCqlBuCF6yH6bbJDoEc
  410. # QNYWFyn8XJwYK+pF9e+91WdPKF4F7pBMeufG9ND8+s0+MkYTIDaKBOq3qgdGnA2T
  411. # OglmmVhcKaO5DKYwODzQRjY1fJy67sPV+Qp2+n4FG0DKkjXp1XrRtX8ArqmQqsV/
  412. # AZwQsRb8zG4Y3G9i/qZQp7h7uJ0VP/4gDHXIIloTlRmQAOka1cKG8eOO7F/05QID
  413. # AQABo4IBEjCCAQ4wHwYDVR0jBBgwFoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYD
  414. # VR0OBBYEFDLrkpr/NZZILyhAQnAgNpFcF4XmMA4GA1UdDwEB/wQEAwIBhjAPBgNV
  415. # HRMBAf8EBTADAQH/MBMGA1UdJQQMMAoGCCsGAQUFBwMDMBsGA1UdIAQUMBIwBgYE
  416. # VR0gADAIBgZngQwBBAEwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybC5jb21v
  417. # ZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNAYIKwYBBQUHAQEE
  418. # KDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJKoZI
  419. # hvcNAQEMBQADggEBABK/oe+LdJqYRLhpRrWrJAoMpIpnuDqBv0WKfVIHqI0fTiGF
  420. # OaNrXi0ghr8QuK55O1PNtPvYRL4G2VxjZ9RAFodEhnIq1jIV9RKDwvnhXRFAZ/ZC
  421. # J3LFI+ICOBpMIOLbAffNRk8monxmwFE2tokCVMf8WPtsAO7+mKYulaEMUykfb9gZ
  422. # pk+e96wJ6l2CxouvgKe9gUhShDHaMuwV5KZMPWw5c9QLhTkg4IUaaOGnSDip0TYl
  423. # d8GNGRbFiExmfS9jzpjoad+sPKhdnckcW67Y8y90z7h+9teDnRGWYpquRRPaf9xH
  424. # +9/DUp/mBlXpnYzyOmJRvOwkDynUWICE5EV7WtgwggYaMIIEAqADAgECAhBiHW0M
  425. # UgGeO5B5FSCJIRwKMA0GCSqGSIb3DQEBDAUAMFYxCzAJBgNVBAYTAkdCMRgwFgYD
  426. # VQQKEw9TZWN0aWdvIExpbWl0ZWQxLTArBgNVBAMTJFNlY3RpZ28gUHVibGljIENv
  427. # ZGUgU2lnbmluZyBSb290IFI0NjAeFw0yMTAzMjIwMDAwMDBaFw0zNjAzMjEyMzU5
  428. # NTlaMFQxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxKzAp
  429. # BgNVBAMTIlNlY3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYwggGiMA0G
  430. # CSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCbK51T+jU/jmAGQ2rAz/V/9shTUxjI
  431. # ztNsfvxYB5UXeWUzCxEeAEZGbEN4QMgCsJLZUKhWThj/yPqy0iSZhXkZ6Pg2A2NV
  432. # DgFigOMYzB2OKhdqfWGVoYW3haT29PSTahYkwmMv0b/83nbeECbiMXhSOtbam+/3
  433. # 6F09fy1tsB8je/RV0mIk8XL/tfCK6cPuYHE215wzrK0h1SWHTxPbPuYkRdkP05Zw
  434. # mRmTnAO5/arnY83jeNzhP06ShdnRqtZlV59+8yv+KIhE5ILMqgOZYAENHNX9SJDm
  435. # +qxp4VqpB3MV/h53yl41aHU5pledi9lCBbH9JeIkNFICiVHNkRmq4TpxtwfvjsUe
  436. # dyz8rNyfQJy/aOs5b4s+ac7IH60B+Ja7TVM+EKv1WuTGwcLmoU3FpOFMbmPj8pz4
  437. # 4MPZ1f9+YEQIQty/NQd/2yGgW+ufflcZ/ZE9o1M7a5Jnqf2i2/uMSWymR8r2oQBM
  438. # dlyh2n5HirY4jKnFH/9gRvd+QOfdRrJZb1sCAwEAAaOCAWQwggFgMB8GA1UdIwQY
  439. # MBaAFDLrkpr/NZZILyhAQnAgNpFcF4XmMB0GA1UdDgQWBBQPKssghyi47G9IritU
  440. # pimqF6TNDDAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADATBgNV
  441. # HSUEDDAKBggrBgEFBQcDAzAbBgNVHSAEFDASMAYGBFUdIAAwCAYGZ4EMAQQBMEsG
  442. # A1UdHwREMEIwQKA+oDyGOmh0dHA6Ly9jcmwuc2VjdGlnby5jb20vU2VjdGlnb1B1
  443. # YmxpY0NvZGVTaWduaW5nUm9vdFI0Ni5jcmwwewYIKwYBBQUHAQEEbzBtMEYGCCsG
  444. # AQUFBzAChjpodHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2Rl
  445. # U2lnbmluZ1Jvb3RSNDYucDdjMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0
  446. # aWdvLmNvbTANBgkqhkiG9w0BAQwFAAOCAgEABv+C4XdjNm57oRUgmxP/BP6YdURh
  447. # w1aVcdGRP4Wh60BAscjW4HL9hcpkOTz5jUug2oeunbYAowbFC2AKK+cMcXIBD0Zd
  448. # OaWTsyNyBBsMLHqafvIhrCymlaS98+QpoBCyKppP0OcxYEdU0hpsaqBBIZOtBajj
  449. # cw5+w/KeFvPYfLF/ldYpmlG+vd0xqlqd099iChnyIMvY5HexjO2AmtsbpVn0OhNc
  450. # WbWDRF/3sBp6fWXhz7DcML4iTAWS+MVXeNLj1lJziVKEoroGs9Mlizg0bUMbOalO
  451. # hOfCipnx8CaLZeVme5yELg09Jlo8BMe80jO37PU8ejfkP9/uPak7VLwELKxAMcJs
  452. # zkyeiaerlphwoKx1uHRzNyE6bxuSKcutisqmKL5OTunAvtONEoteSiabkPVSZ2z7
  453. # 6mKnzAfZxCl/3dq3dUNw4rg3sTCggkHSRqTqlLMS7gjrhTqBmzu1L90Y1KWN/Y5J
  454. # KdGvspbOrTfOXyXvmPL6E52z1NZJ6ctuMFBQZH3pwWvqURR8AgQdULUvrxjUYbHH
  455. # j95Ejza63zdrEcxWLDX6xWls/GDnVNueKjWUH3fTv1Y8Wdho698YADR7TNx8X8z2
  456. # Bev6SivBBOHY+uqiirZtg0y9ShQoPzmCcn63Syatatvx157YK9hlcPmVoa1oDE5/
  457. # L9Uo2bC5a4CH2RwwggZJMIIEsaADAgECAhAGQz/MzOQzqJLMF7dGpYxlMA0GCSqG
  458. # SIb3DQEBDAUAMFQxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0
  459. # ZWQxKzApBgNVBAMTIlNlY3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYw
  460. # HhcNMjQwMjIzMDAwMDAwWhcNMjcwMjIyMjM1OTU5WjBgMQswCQYDVQQGEwJVUzER
  461. # MA8GA1UECAwIVmlyZ2luaWExHjAcBgNVBAoMFURyb2lkTW9ua2V5IEFwcHMsIExM
  462. # QzEeMBwGA1UEAwwVRHJvaWRNb25rZXkgQXBwcywgTExDMIICIjANBgkqhkiG9w0B
  463. # AQEFAAOCAg8AMIICCgKCAgEAuJtEjRyetghx6Abi1cpMT88uT6nIcTe3AyUvdSkj
  464. # CtUM8Gat0YJfqTxokb9dBzJa7j8YWOUU1Yc4EDXoYYtVRE+1UkdPAcXNMf2hNXGI
  465. # 45iZVwhBPQZBU4QfKltzYqrjAZgDvxeYd68qImjzUfrCY3uZHwEIuCewmNMPpEgb
  466. # djuSXDyBAKKBtaO2iqyaJpqcC39QnDKlXMicDPqqH5fI7wK7Lg9f4BwOsaO4P68I
  467. # 3pOv7L/6E5GR9+hTj6txhxFz/yCbDxN1PUvDsGaXjMmVeP2M95fkwOFwut5yBESD
  468. # IwAGEWUFsTJ32hSmE74+xG6rVqtueayV7U9cGURznSk9ZlTUqQOW9Z4K+pu29gTZ
  469. # 9zVWlONIsQR7QXfGKZWF+Xik6rTujSRTTsK7QNMYzBI6b9v0nD2pEWuGZDXIO5o5
  470. # N2HzXEFlwxCFY483yWSObHNBp9PFtiDueqv+8vrN+lsirZlDFCxI6hW+F8oYp3Xx
  471. # HdSqxsMRTqbO6dUjH2Tyd0G5fbyT8Rid7DbP6p/apzIrdFOM0kdcKLmppYBp7BIn
  472. # TdjbWJYhtuORIUZQbUOSM71vYCUHj7xkckiYYmkUf0XH8xx8jqgVWseBW63gCEow
  473. # hCEYxaWt0QGyXJ6UrlV4WTUCWzxm45I5OQoofymUvdutKgr9bR3nJ5yS/c+E3Knq
  474. # JhkCAwEAAaOCAYkwggGFMB8GA1UdIwQYMBaAFA8qyyCHKLjsb0iuK1SmKaoXpM0M
  475. # MB0GA1UdDgQWBBQta729krTac3CUndU0S0DdDscjHTAOBgNVHQ8BAf8EBAMCB4Aw
  476. # DAYDVR0TAQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcDAzBKBgNVHSAEQzBBMDUG
  477. # DCsGAQQBsjEBAgEDAjAlMCMGCCsGAQUFBwIBFhdodHRwczovL3NlY3RpZ28uY29t
  478. # L0NQUzAIBgZngQwBBAEwSQYDVR0fBEIwQDA+oDygOoY4aHR0cDovL2NybC5zZWN0
  479. # aWdvLmNvbS9TZWN0aWdvUHVibGljQ29kZVNpZ25pbmdDQVIzNi5jcmwweQYIKwYB
  480. # BQUHAQEEbTBrMEQGCCsGAQUFBzAChjhodHRwOi8vY3J0LnNlY3RpZ28uY29tL1Nl
  481. # Y3RpZ29QdWJsaWNDb2RlU2lnbmluZ0NBUjM2LmNydDAjBggrBgEFBQcwAYYXaHR0
  482. # cDovL29jc3Auc2VjdGlnby5jb20wDQYJKoZIhvcNAQEMBQADggGBAJSy5YPCbh9Z
  483. # suDCKgDuzOWZzNza4/FrA+kT7EitDezYN3S/P0EVc0tPbgYAKfNqY+ihAMyjZHdg
  484. # ybfBWhGzUTDo+HEipcnZ2pgwPadsw23jJ8MN1tdms9iKDakIQ2MVsB7cGFRU8QjL
  485. # ovkPdZkyLcjuYbkiZRoNoKlhmrOOf6n1oCwXVJ9ONJijc+Lr3+4EIqZ39ET2+uI9
  486. # Wg9Bfd9XrDZfYFEcRJjNzRpCtHb26aIzV/XiMWasHRPaII34SzD0BmaPbsLeGW1U
  487. # GvW3tQcgVNdT/uajegmShVb+c5J5ktRSJ0cqyxmTAYaeMuA6IxG1f6kui1SAFQs2
  488. # lzlGyEgxgiNGo7cHHN2KidhrBL3U2bGr9Tkdp3gmV+Gj3esCdQzJE4aqmUZvIvHp
  489. # krair4qbLFZRNozAZJn2SIeQa5u2U0ZmvcAr1C7S3JVLP3t9LKE0mlFkV9pbIU97
  490. # ND3iH3tO0Zb3SvCK/XjO1PZVb8EXsi67wbfMSWAwi2CETDonb7+gBjCCBuwwggTU
  491. # oAMCAQICEDAPb6zdZph0fKlGNqd4LbkwDQYJKoZIhvcNAQEMBQAwgYgxCzAJBgNV
  492. # BAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtKZXJzZXkgQ2l0
  493. # eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYDVQQDEyVVU0VS
  494. # VHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTE5MDUwMjAwMDAw
  495. # MFoXDTM4MDExODIzNTk1OVowfTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0
  496. # ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEYMBYGA1UEChMPU2VjdGln
  497. # byBMaW1pdGVkMSUwIwYDVQQDExxTZWN0aWdvIFJTQSBUaW1lIFN0YW1waW5nIENB
  498. # MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAyBsBr9ksfoiZfQGYPyCQ
  499. # vZyAIVSTuc+gPlPvs1rAdtYaBKXOR4O168TMSTTL80VlufmnZBYmCfvVMlJ5Lslj
  500. # whObtoY/AQWSZm8hq9VxEHmH9EYqzcRaydvXXUlNclYP3MnjU5g6Kh78zlhJ07/z
  501. # Obu5pCNCrNAVw3+eolzXOPEWsnDTo8Tfs8VyrC4Kd/wNlFK3/B+VcyQ9ASi8Dw1P
  502. # s5EBjm6dJ3VV0Rc7NCF7lwGUr3+Az9ERCleEyX9W4L1GnIK+lJ2/tCCwYH64TfUN
  503. # P9vQ6oWMilZx0S2UTMiMPNMUopy9Jv/TUyDHYGmbWApU9AXn/TGs+ciFF8e4KRmk
  504. # KS9G493bkV+fPzY+DjBnK0a3Na+WvtpMYMyou58NFNQYxDCYdIIhz2JWtSFzEh79
  505. # qsoIWId3pBXrGVX/0DlULSbuRRo6b83XhPDX8CjFT2SDAtT74t7xvAIo9G3aJ4oG
  506. # 0paH3uhrDvBbfel2aZMgHEqXLHcZK5OVmJyXnuuOwXhWxkQl3wYSmgYtnwNe/YOi
  507. # U2fKsfqNoWTJiJJZy6hGwMnypv99V9sSdvqKQSTUG/xypRSi1K1DHKRJi0E5FAMe
  508. # KfobpSKupcNNgtCN2mu32/cYQFdz8HGj+0p9RTbB942C+rnJDVOAffq2OVgy728Y
  509. # UInXT50zvRq1naHelUF6p4MCAwEAAaOCAVowggFWMB8GA1UdIwQYMBaAFFN5v1qq
  510. # K0rPVIDh2JvAnfKyA2bLMB0GA1UdDgQWBBQaofhhGSAPw0F3RSiO0TVfBhIEVTAO
  511. # BgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADATBgNVHSUEDDAKBggr
  512. # BgEFBQcDCDARBgNVHSAECjAIMAYGBFUdIAAwUAYDVR0fBEkwRzBFoEOgQYY/aHR0
  513. # cDovL2NybC51c2VydHJ1c3QuY29tL1VTRVJUcnVzdFJTQUNlcnRpZmljYXRpb25B
  514. # dXRob3JpdHkuY3JsMHYGCCsGAQUFBwEBBGowaDA/BggrBgEFBQcwAoYzaHR0cDov
  515. # L2NydC51c2VydHJ1c3QuY29tL1VTRVJUcnVzdFJTQUFkZFRydXN0Q0EuY3J0MCUG
  516. # CCsGAQUFBzABhhlodHRwOi8vb2NzcC51c2VydHJ1c3QuY29tMA0GCSqGSIb3DQEB
  517. # DAUAA4ICAQBtVIGlM10W4bVTgZF13wN6MgstJYQRsrDbKn0qBfW8Oyf0WqC5SVmQ
  518. # KWxhy7VQ2+J9+Z8A70DDrdPi5Fb5WEHP8ULlEH3/sHQfj8ZcCfkzXuqgHCZYXPO0
  519. # EQ/V1cPivNVYeL9IduFEZ22PsEMQD43k+ThivxMBxYWjTMXMslMwlaTW9JZWCLjN
  520. # XH8Blr5yUmo7Qjd8Fng5k5OUm7Hcsm1BbWfNyW+QPX9FcsEbI9bCVYRm5LPFZgb2
  521. # 89ZLXq2jK0KKIZL+qG9aJXBigXNjXqC72NzXStM9r4MGOBIdJIct5PwC1j53BLwE
  522. # NrXnd8ucLo0jGLmjwkcd8F3WoXNXBWiap8k3ZR2+6rzYQoNDBaWLpgn/0aGUpk6q
  523. # PQn1BWy30mRa2Coiwkud8TleTN5IPZs0lpoJX47997FSkc4/ifYcobWpdR9xv1tD
  524. # XWU9UIFuq/DQ0/yysx+2mZYm9Dx5i1xkzM3uJ5rloMAMcofBbk1a0x7q8ETmMm8c
  525. # 6xdOlMN4ZSA7D0GqH+mhQZ3+sbigZSo04N6o+TzmwTC7wKBjLPxcFgCo0MR/6hGd
  526. # HgbGpm0yXbQ4CStJB6r97DDa8acvz7f9+tCjhNknnvsBZne5VhDhIG7GrrH5trrI
  527. # NV0zdo7xfCAMKneutaIChrop7rRaALGMq+P5CslUXdS5anSevUiumDCCBvUwggTd
  528. # oAMCAQICEDlMJeF8oG0nqGXiO9kdItQwDQYJKoZIhvcNAQEMBQAwfTELMAkGA1UE
  529. # BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2Fs
  530. # Zm9yZDEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSUwIwYDVQQDExxTZWN0aWdv
  531. # IFJTQSBUaW1lIFN0YW1waW5nIENBMB4XDTIzMDUwMzAwMDAwMFoXDTM0MDgwMjIz
  532. # NTk1OVowajELMAkGA1UEBhMCR0IxEzARBgNVBAgTCk1hbmNoZXN0ZXIxGDAWBgNV
  533. # BAoTD1NlY3RpZ28gTGltaXRlZDEsMCoGA1UEAwwjU2VjdGlnbyBSU0EgVGltZSBT
  534. # dGFtcGluZyBTaWduZXIgIzQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
  535. # AQCkkyhSS88nh3akKRyZOMDnDtTRHOxoywFk5IrNd7BxZYK8n/yLu7uVmPslEY5a
  536. # iAlmERRYsroiW+b2MvFdLcB6og7g4FZk7aHlgSByIGRBbMfDCPrzfV3vIZrCftcs
  537. # w7oRmB780yAIQrNfv3+IWDKrMLPYjHqWShkTXKz856vpHBYusLA4lUrPhVCrZwMl
  538. # obs46Q9vqVqakSgTNbkf8z3hJMhrsZnoDe+7TeU9jFQDkdD8Lc9VMzh6CRwH0SLg
  539. # Y4anvv3Sg3MSFJuaTAlGvTS84UtQe3LgW/0Zux88ahl7brstRCq+PEzMrIoEk8ZX
  540. # hqBzNiuBl/obm36Ih9hSeYn+bnc317tQn/oYJU8T8l58qbEgWimro0KHd+D0TAJI
  541. # 3VilU6ajoO0ZlmUVKcXtMzAl5paDgZr2YGaQWAeAzUJ1rPu0kdDF3QFAaraoEO72
  542. # jXq3nnWv06VLGKEMn1ewXiVHkXTNdRLRnG/kXg2b7HUm7v7T9ZIvUoXo2kRRKqLM
  543. # AMqHZkOjGwDvorWWnWKtJwvyG0rJw5RCN4gghKiHrsO6I3J7+FTv+GsnsIX1p0OF
  544. # 2Cs5dNtadwLRpPr1zZw9zB+uUdB7bNgdLRFCU3F0wuU1qi1SEtklz/DT0JFDEtcy
  545. # fZhs43dByP8fJFTvbq3GPlV78VyHOmTxYEsFT++5L+wJEwIDAQABo4IBgjCCAX4w
  546. # HwYDVR0jBBgwFoAUGqH4YRkgD8NBd0UojtE1XwYSBFUwHQYDVR0OBBYEFAMPMciR
  547. # KpO9Y/PRXU2kNA/SlQEYMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMBYG
  548. # A1UdJQEB/wQMMAoGCCsGAQUFBwMIMEoGA1UdIARDMEEwNQYMKwYBBAGyMQECAQMI
  549. # MCUwIwYIKwYBBQUHAgEWF2h0dHBzOi8vc2VjdGlnby5jb20vQ1BTMAgGBmeBDAEE
  550. # AjBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vY3JsLnNlY3RpZ28uY29tL1NlY3Rp
  551. # Z29SU0FUaW1lU3RhbXBpbmdDQS5jcmwwdAYIKwYBBQUHAQEEaDBmMD8GCCsGAQUF
  552. # BzAChjNodHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29SU0FUaW1lU3RhbXBp
  553. # bmdDQS5jcnQwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLnNlY3RpZ28uY29tMA0G
  554. # CSqGSIb3DQEBDAUAA4ICAQBMm2VY+uB5z+8VwzJt3jOR63dY4uu9y0o8dd5+lG3D
  555. # IscEld9laWETDPYMnvWJIF7Bh8cDJMrHpfAm3/j4MWUN4OttUVemjIRSCEYcKsLe
  556. # 8tqKRfO+9/YuxH7t+O1ov3pWSOlh5Zo5d7y+upFkiHX/XYUWNCfSKcv/7S3a/76T
  557. # DOxtog3Mw/FuvSGRGiMAUq2X1GJ4KoR5qNc9rCGPcMMkeTqX8Q2jo1tT2KsAulj7
  558. # NYBPXyhxbBlewoNykK7gxtjymfvqtJJlfAd8NUQdrVgYa2L73mzECqls0yFGcNwv
  559. # jXVMI8JB0HqWO8NL3c2SJnR2XDegmiSeTl9O048P5RNPWURlS0Nkz0j4Z2e5Tb/M
  560. # DbE6MNChPUitemXk7N/gAfCzKko5rMGk+al9NdAyQKCxGSoYIbLIfQVxGksnNqrg
  561. # mByDdefHfkuEQ81D+5CXdioSrEDBcFuZCkD6gG2UYXvIbrnIZ2ckXFCNASDeB/cB
  562. # 1PguEc2dg+X4yiUcRD0n5bCGRyoLG4R2fXtoT4239xO07aAt7nMP2RC6nZksfNd1
  563. # H48QxJTmfiTllUqIjCfWhWYd+a5kdpHoSP7IVQrtKcMf3jimwBT7Mj34qYNiNsjD
  564. # vgCHHKv6SkIciQPc9Vx8cNldeE7un14g5glqfCsIo0j1FfwET9/NIRx65fWOGtS5
  565. # QDGCBmkwggZlAgEBMGgwVDELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1NlY3RpZ28g
  566. # TGltaXRlZDErMCkGA1UEAxMiU2VjdGlnbyBQdWJsaWMgQ29kZSBTaWduaW5nIENB
  567. # IFIzNgIQBkM/zMzkM6iSzBe3RqWMZTANBglghkgBZQMEAgEFAKCBhDAYBgorBgEE
  568. # AYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwG
  569. # CisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCCn5BDd
  570. # F+7Q6LMoJuJxenFHgWAZjm1CET9oBKnlZKClzjANBgkqhkiG9w0BAQEFAASCAgAS
  571. # ypiTBQb39I43fGdH6t2OYAl53TSbJfPG99/11OYS+6nMTKhy7dHtzzgMFxBQmL/L
  572. # P4eJJMqh1yIYEjrjhNLLddRhVP2lfsuQ1OkLVx5lS8M32I3SzpskOe+SywMLDYJy
  573. # sYHEcZkyQX0Q2J/RGzF8/tDcltZodYEdZrQdaAKo7bGv1JcYpW7B6JZnNjquE90d
  574. # WVNAsQ6Mc3kzkjbs2qDaRAdkOmX5uENWbNf1GgTRpud7Ic5hMyb4v9qfWAptlFuO
  575. # pLHyuINNsBuTfzD/cGVR9qecDPIE90UnHQHZWws9U+m84CzAmqpptp4VhrAWc7Hc
  576. # bHsbmg4tGA41ythKyERpW9YlwID6fJYMigEVmJihXdM/qRGO2XdfbPAr0C0AMPIV
  577. # re8r86BJw1lxJJYL2gsS/ttgrnW2C8aFq+IxxXWnv/7maPG69K/jmRLQGZuLIZCl
  578. # 7rT6hob37zZMsdnqDZ0DjJb/FGonJr7GpyeMEWPy8eVwZydMbC9hBl8HNgQ04sp7
  579. # ouskM1nCco9DV+d1Y6Oyje6IylZjD+xgX7VfsDa2O3Lw27cfyxJBW359meYHytkJ
  580. # oYqh4Y4fC9YlYTD3913ryqTbPaWtWjvFV+GR8biHxDoTmTRuNaeN6RDyyZJkdON7
  581. # CnR/8X8y4C9BXdesvjfIdhHZsGwLJcZ87cnYGb7oYqGCA0swggNHBgkqhkiG9w0B
  582. # CQYxggM4MIIDNAIBATCBkTB9MQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRl
  583. # ciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRgwFgYDVQQKEw9TZWN0aWdv
  584. # IExpbWl0ZWQxJTAjBgNVBAMTHFNlY3RpZ28gUlNBIFRpbWUgU3RhbXBpbmcgQ0EC
  585. # EDlMJeF8oG0nqGXiO9kdItQwDQYJYIZIAWUDBAICBQCgeTAYBgkqhkiG9w0BCQMx
  586. # CwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0yNDA0MjgyMjE0MzdaMD8GCSqG
  587. # SIb3DQEJBDEyBDARWlO4ZY7Qij7x/efLB7SJrHgfXJwezYW7sskwZhfhnoQ8JQ8Q
  588. # HfefvIk4nF1+1PkwDQYJKoZIhvcNAQEBBQAEggIAWpBgtEaYVRayRmCTjyOoKg0b
  589. # 2vXn3dqpcpckspX4t58xHLbhapGm3Akg9N6C0xZWm9qQ9vhjoOeuLZ0Z+017JRUe
  590. # YExYYIYcyNGlxyt/uXiBst8KiAFFzn6RwIjycQcsnOsGRBAz2E9/k7wGtdg8kqBI
  591. # Q71cDl+seRjWVcTR4JgthphZuRTKS1Jxn3tjDNJuK+LFo4jL38ojxhhdOnb3xzZ0
  592. # M1AQ+l2YuDxBX4H9aZsbiTfdI1mxvmPgmZbq4fjV28TUCiBhD1UYuHUPN3Ff9Fwo
  593. # 9BMbTLvKqED8Mm9A25S4M8kVZsGt8j3EAt0AJaWbdHLpLC0l0ykDAcSiwZNYsdMu
  594. # vN0q6z5knfhKv4M8FXQ2wu8pbPww7/4kBqqy9L8VMI8UIazG9Z/R7yhkZjEz3jgc
  595. # a/VZMcsDn41B79/9eSx4wED7NYtc0T6DB8WFH1a2CqlORSHnRolnms+VjWerfmZP
  596. # a9lV7Sk1gGZ+MePsWwXj7liURI/ubTtPtxWElWuYookkQMmrOJYj+IZCW4RvV3I3
  597. # utzHUwfbBaON3Mq46ADayLxKP2SE9j3JXpl4mZeWXdYUrywt2TgQktCXT7iZOinl
  598. # dbx1tso5uDAj1DQDiTm4Nps+UWjyo2bZB/g1ONMqxPDIuY75HryfmJDlvCMp80Tk
  599. # cJchA5s/dVwNSWKti4Q=
  600. # SIG # End signature block