texrack 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MmE1MTFhNzg2NzBkMTRkNmYyYjMzZmM0MWM5NmMxN2RlNTRiYzM3ZA==
4
+ NGIyZDVhOGRjYzc0MzQ5ZGQwMzlhMmE0MTdkYWE4MDZmODRlMTUwYw==
5
5
  data.tar.gz: !binary |-
6
- NmI3OTA3YjRhNDhlN2ExZmFmOWJiYmVjOGQyYmZmZmFkMTBkOTU5Yw==
6
+ NTkwNWQ1MTI3ZjkzZTljMGI1NjU0ZmU3MGMwMTE2NTljM2EyNjE2Nw==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- ZmI3ZDQ2MjcwYWVlYjQzNTJhNWEwYmYxYWQ0Y2I5YWZjYmQwYzI2ZTdlYzNl
10
- ZjFhODc2ZDI2NjNmYTIxYWI4NjBlNjRiYzI1OGVkMDU0ODc1ZmJmMGFlYzEy
11
- OGZlMzdlMmRkOGU0MDg2NDc1YmE0OWViMjk3ZTg2NTI5MDJlZTg=
9
+ M2Q2NTQ0ZDRjMTg3NjE5OTM5MmExM2U5ZmM2MzdhMDg4ZDQxNDczZmI0YTcz
10
+ OTY1MzQ1ZGU0ZTZiOGU5MjIyNTgwNzMwOGEwZmNjMTI0Mjc2N2UxN2RjZmNl
11
+ MDU0NjBlZTFkN2Q2NTIzYmI4MTM5YzNlZmY0NDM0NWExODQ5ZWQ=
12
12
  data.tar.gz: !binary |-
13
- NDE1YmZkYjY5ZTE4MDUwZDkyYTBiOTZjOTI0OWFmYmJkMWY4N2I0YjA4ZmI3
14
- OGExOTUzYTQ2MDM0NGRhZGNmMmI1YzA0MzI3ZGE2MjIxODA5NGNjMGU1MWY2
15
- MzZhMjc2YzNkNDJhN2M0ZGM2OWM4NDRjZmI0MGZhNTk2NmVmNjM=
13
+ OTIyYzU4NTA2YmIyMzViODEwMDQ5NjNlNTFhZjFjNjVhMGVhYTdmMGE5YWQ5
14
+ NDFkYWFkMTJmYTAxNmQwYWZlMDU5MWMxZWMyMzI4ZGQ1NDAzNGVhODdjNWQz
15
+ NTMwMTAwMjZjMDcwZDY2MTE2ZGU0YjQ1OGJmNzM0OGY0MWZjMDI=
@@ -2,17 +2,17 @@
2
2
  Version: GnuPG/MacGPG2 v2.0.20 (Darwin)
3
3
  Comment: GPGTools - http://gpgtools.org
4
4
 
5
- iQIcBAABAgAGBQJSbpGjAAoJEH1ncb0Txu7XVnoP/1lZdSrAUwVvNYSrb/bpggKa
6
- 2C4VKplgsB204dKV8HoLgLEThqaq7ljengC8bS/YHPAKS8DTclesPN9zZ7UzvLmF
7
- IvLYasZnTDC6zAgMUHdhAz3Y+epUOdMPjTid25i1C/Zs19ZQaD2E9SizsoqUf6rm
8
- 2M4bBioMoYhxK8VzZvaehl84iXAg9fkWmkBYBITPf4Sr+luMoyXPBVeQMMXXneuE
9
- TfBWAYLH0C1dYk8/6Ys/ZIBVdNYkMO4iz9icE/mTBhTKHPt4BtEjas8/gt4Pvjkj
10
- Qqme7XKXMBdwp0Y95HWsfKrCVfM08S7RcbxsgNV6xuBHZQy9k9LU2i6z4aZD08fz
11
- kujdSnfOc7fO/GqukiYLHzHXiYJ6/BtHPRFQpo9O7sM1GlOktuIckyOlDsAKzfH8
12
- Bp6YcApw39QmoH+NBkXgQQOg3TSBhlzXapjLInRv4dtAsDFNVMkQQa9YXtdKOKik
13
- g9H7Q6grwx3ZRv8BypDFqhUoQnD1DY7dQu0A0+1QRAo4dJcECjSWLM5oyywVVKO3
14
- ctYvj4nD9Ma9QxNR2oL25pogjaRbx+CUMQaZYD2lnbpVt+BoEgO27AIkGVYYzsC1
15
- elN9CvkxDCrJhgRygz8NHDQ2Rfm6vYCx7gnJrp7+JpesDQRs+uTExurEEAlkSLFW
16
- zOzAeMo2w49TQcgl1cFW
17
- =1Kx8
5
+ iQIcBAABAgAGBQJSc3n3AAoJEH1ncb0Txu7XuZMQAJKfYU5XwxxT6Nw2aNhVVCoZ
6
+ Q34Lt43zPcQpHHF8LK5bP/FNHD4GQK+WWiMPComX5VmnTIxLbQX2DNEWmeiMpyjw
7
+ ydYzURm8aZGheI1ejFuE9Py50m8WeTAituN/x2ey5WnwGIEsvVVQ+NYXdknz2jNl
8
+ nvbaiH3/F8UZe7oqeCKFTPB5XPaIDQQMdk3pwGqiIPtSXnIig51LP7dvKPQ06Yca
9
+ TiZYxjsQjRIJviHFO5nbww7322eNDlySqGdndlRJxAJjcLcrhruf0kdWOcev4ZF4
10
+ rChy909T/r+5aJ7P58lgNQWI0MA+4LuLlKNyQhN+dbnGvdEioF88gfaQPhBm4sTC
11
+ AAIPvp4suFWKerwmOveG607KvK7178V+5svrSZDrnxfhu3K+8+42coh1Gsyh4EeL
12
+ c7xSXLMqycmqQxTtXlVkFk2IoQytieaXD/BnjKqLKkjQGXTQlVD+1hXxNcMheda+
13
+ IKO08yma6uEiocJxZjvb9nVhDbicLfO428bdjihGYYs/cF7nhlojVJFxp9r2Kf7Z
14
+ xv9zQkVsDhL6Ucr266G3DKN0mzSBeZZB78axkzjZJRVkxyc8oL2/IMutLCZIYHfR
15
+ JmmalIU9ZoGdRoUXmr8A9MwDIQKu2rlogaFSkaM/ZKjYovfIwyYgFi+PVOX9wa8l
16
+ FzBRzW44gnLsWCjrSieU
17
+ =LOQB
18
18
  -----END PGP SIGNATURE-----
data.tar.gz.asc CHANGED
@@ -2,17 +2,17 @@
2
2
  Version: GnuPG/MacGPG2 v2.0.20 (Darwin)
3
3
  Comment: GPGTools - http://gpgtools.org
4
4
 
5
- iQIcBAABAgAGBQJSbpGiAAoJEH1ncb0Txu7XPisP/R45LFwRbSbSsqUgfE4hTNda
6
- 3XZhBDwrno1Rc/i3i29klT3/YmxhMSzNosDQReqrJA2rhC7eu/1lq8Ndt2gih/Pu
7
- 9f0nOVauXAz1LwQgAn5M3jelqCt9PSUZfJVxsV1k48zFh0Vbl+oogZ25VRqcurN7
8
- bfMb3QdtXv3iIi9s1x5OwjVtpHqzMFVI4JpvAUTAOXacnaN1tnlTaUY9avoDrZc1
9
- Av0pk8Pu0w+G1IPEb3GRicXdq4Bl8dD/qlgSIXO/KWvgmVHqjoJTWHBnF92Ehist
10
- 0SsZvEwY6VTZ19hYhCWKRpIbh37wR18e3rcRRia91d3iU1ggCJCSX8pBqkxsozFN
11
- h34jKTR45bIZOSEVV87Gdksea2PlgtG5uw1qBFXCEDkAQoMfKIom8bLvpssTNczf
12
- hg9wazU0CmJHddFqFA6SqtWf6BwZoJ0O/GXOso7MeBJ6y2Pl5IWyr8tBbqZf5NpF
13
- FIP7uPKLMO7KE28DYtrmcEKvA2jXmnQtK5ddztJkIUlZwie4zvS3WVSwKBjxOhFs
14
- XzYPV1q9bxiuVES2AGWA0yq/m4RBpKfJT+N47jm5zXMgvphJiQpHbPO3EA5RE+dQ
15
- TLmGAqZ1lM77WnN3qDCvfHNm+ovh2H9KixfOwnlahVL1WEhWA+XEki3sFemx1BB0
16
- OWV9BKLJ6NO1SAw/Tb5l
17
- =Vq2I
5
+ iQIcBAABAgAGBQJSc3n3AAoJEH1ncb0Txu7XMcwP/1S6Ixhnzw6oKq/8hiJ6T1bA
6
+ tHf5Ip8nB0BZP2vIioAeEOJxZDr3YnbRJ+d4nJy4MltqlYZtE4ZV64umNKqRnSHT
7
+ JtwHK7my38kA9H7pM6GKJq19VojZU7RxDAmp/RHkLbZfh9pC8su09lshOX7EX09f
8
+ jIIo1PhZUT9yhXiuPczNHa6fI/z4c942a8KCAIftrF3xDCA9ahY63QeYarr3LVrf
9
+ 0QwvAORKQ9tv16M/BxArhF36mnVF64wFYa7mkqrczCkXXGwWlBXH0D1fv/GEvvZz
10
+ OQzWGCsOEdH8IKup8bwKtAnXxuZlvLkct1DQgiCv7N8PDhTdcu73JJW9XPXBDL81
11
+ eI7bSAJMGYbBNaU3g22tFVV8kf7rS6YoscUMiugC+1swv8EBltgR0B9U/dHtt7yQ
12
+ UtdSw8ZdlMPat+lJH+vXeY8z5IZp3GaR8arIrIFt8JWECut1vN2zx3GJmEhGo+ip
13
+ 1jJg196cqkeP1T2lxSWnG+qTjSL0WXo5tg3KKzaltyUrYVgJONm9gAy0I85Jqavm
14
+ fk7XBNyBTpCs1+qrDiEcoN8Pe1+7xIT9MFfgV5g9wabyu7URE9oJvwnFW5A1Z+b7
15
+ tm0Ap7yKpJDK07WWOv38CdFaEn1bczneKq98sJV++94VWCt4d9Cgi+KZdqtpVf4X
16
+ lyxazvcPqMp5oPiQY+nl
17
+ =dGL3
18
18
  -----END PGP SIGNATURE-----
data/README.md CHANGED
@@ -5,8 +5,7 @@ Simple Rack middleware to render LaTeX to PNGs on the fly.
5
5
  ## Requirements
6
6
 
7
7
  * `pdflatex` must exist in `$PATH`
8
- * RMagick does the conversion from PDF to PNG, so `ImageMagick` must be
9
- installed and available.
8
+ * `convert` (from ImageMagick) must exist in `$PATH`
10
9
 
11
10
  ## Configuration
12
11
 
data/config.ru CHANGED
@@ -1,4 +1,4 @@
1
1
  $:.unshift 'lib'
2
2
  require 'texrack'
3
3
 
4
- run Texrack::Endpoint
4
+ run Texrack::Endpoint.new
@@ -2,3 +2,9 @@ require 'texrack/version'
2
2
  require 'texrack/latex_to_pdf'
3
3
  require 'texrack/pdf_to_png'
4
4
  require 'texrack/endpoint'
5
+
6
+ module Texrack
7
+ class LatexNotFoundError < StandardError; end
8
+ class ConvertNotFoundError < StandardError; end
9
+ class LatexFailedError < StandardError; end
10
+ end
@@ -4,6 +4,7 @@ require 'erb'
4
4
  module Texrack
5
5
  class Endpoint < Sinatra::Base
6
6
  enable :logging
7
+ set :public_folder, File.dirname(__FILE__) + '/static'
7
8
 
8
9
  get '/' do
9
10
  if params[:data].to_s.strip != ""
@@ -19,12 +20,33 @@ module Texrack
19
20
 
20
21
  def render_png(source)
21
22
  content_type 'image/png'
22
- @data = source
23
- pdf_source = erb :latex
24
- pdf = Texrack::LatexToPdf.new(pdf_source, logger).generate_pdf
25
- tmp = Tempfile.new(["texrack-output", ".png"])
26
- png = Texrack::PdfToPng.new(pdf).to_file(tmp)
27
- png
23
+ begin
24
+ @data = source
25
+ output = Tempfile.new(["texrack-output", ".png"])
26
+ pdf_source = erb :latex
27
+ pdf = Texrack::LatexToPdf.new(pdf_source, logger).generate_pdf
28
+ png = Texrack::PdfToPng.new(pdf, logger).to_file(output)
29
+ send_file png, {
30
+ disposition: :inline
31
+ }
32
+ rescue Texrack::LatexFailedError
33
+ send_file File.join(settings.public_folder, "latex-failed.png"), {
34
+ disposition: :inline,
35
+ status: 500
36
+ }
37
+ rescue Texrack::LatexNotFoundError
38
+ logger.error "Could not find pdflatex in #{ENV['PATH']}"
39
+ send_file File.join(settings.public_folder, "missing-pdflatex.png"), {
40
+ disposition: :inline,
41
+ status: 500
42
+ }
43
+ rescue Texrack::ConvertNotFoundError
44
+ logger.error "Could not find convert (ImageMagick) in #{ENV['PATH']}"
45
+ send_file File.join(settings.public_folder, "missing-convert.png"), {
46
+ disposition: :inline,
47
+ status: 500
48
+ }
49
+ end
28
50
  end
29
51
 
30
52
  helpers do
@@ -32,6 +54,10 @@ module Texrack
32
54
  params[:math] != "0"
33
55
  end
34
56
 
57
+ def root_path
58
+ "#{env['SCRIPT_NAME']}/"
59
+ end
60
+
35
61
  def packages
36
62
  found = {}
37
63
  params[:packages].to_s.split("|").each do |package|
@@ -15,6 +15,8 @@ class Texrack::LatexToPdf
15
15
  #
16
16
  # pdflatex is used to convert the file.
17
17
  def generate_pdf
18
+ raise Texrack::LatexNotFoundError unless has_pdflatex?
19
+
18
20
  logger.debug "Generating PDF from #{latex}"
19
21
  input = Tempfile.new(["texrack-input", ".tex"])
20
22
  input.binmode
@@ -41,15 +43,21 @@ class Texrack::LatexToPdf
41
43
  end
42
44
  end)
43
45
 
44
- output = input.path.sub(/\.tex$/, '.pdf')
45
- if File.exist?(output)
46
- result = File.read(output)
47
- else
48
- logger.warn "Unable to find file #{output}"
49
- raise "pdflatex failed"
46
+ output = input.path.sub(/\.tex$/, '.pdf')
47
+ logfile = input.path.sub(/\.tex$/, '.log')
48
+ if !File.exist?(output)
49
+ loglines = File.read(logfile)
50
+ logger.error "Unable to find file #{output}"
51
+ logger.error "LaTeX output: #{loglines}"
52
+ raise Texrack::LatexFailedError
50
53
  end
51
54
 
52
55
  input.close
53
- result
56
+ output
57
+ end
58
+
59
+ def has_pdflatex?
60
+ ENV["PATH"].split(':').any? {|x| FileTest.executable? "#{x}/pdflatex" }
54
61
  end
62
+ private :has_pdflatex?
55
63
  end
@@ -1,15 +1,19 @@
1
- require 'RMagick'
1
+ require 'cocaine'
2
2
 
3
3
  class Texrack::PdfToPng
4
- def initialize(blob)
5
- @img = Magick::Image.from_blob(blob) do |info|
6
- info.density = "300x300"
7
- info.quality = 90
8
- end[0]
4
+ attr_reader :pdf_path, :logger, :line
5
+
6
+ def initialize(pdf_path, logger)
7
+ @pdf_path = pdf_path
8
+ @logger = logger
9
+ @line = Cocaine::CommandLine.new("convert",
10
+ "-density 300x300 -quality 90 :in :out", logger: logger)
9
11
  end
10
12
 
11
13
  def to_file(file)
12
- @img.write('png:' + file.path)
13
- file
14
+ line.run(in: pdf_path, out: file.path)
15
+ file.path
16
+ rescue Cocaine::CommandNotFoundError => e
17
+ raise Texrack::ConvertNotFoundError
14
18
  end
15
19
  end
@@ -1,3 +1,3 @@
1
1
  module Texrack
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -1,38 +1,38 @@
1
1
  <!DOCTYPE html>
2
2
  <html>
3
3
  <head>
4
- <title>Texrack</title>
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css">
4
+ <title>Texrack</title>
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css">
7
7
  </head>
8
8
  <body>
9
- <div class="container">
10
- <h1 class="page-header">Render <img src="/?data=\LaTeX&math=0" alt="LaTeX"> as a PNG</h1>
9
+ <div class="container">
10
+ <h1 class="page-header">Render <img src="<%= root_path %>?data=\LaTeX&math=0" alt="LaTeX"> as a PNG</h1>
11
11
 
12
- <form role="form" action="/" method="POST">
13
- <div class="form-group">
14
- <label for="data">LaTeX to render</label>
15
- <textarea class="form-control" id="data" name="data" rows="5"></textarea>
16
- </div>
17
- <div class="checkbox">
18
- <label>
19
- <input type="hidden" name="math" value="0">
20
- <input type="checkbox" checked name="math" value="1"> Render in math mode?
21
- </label>
22
- </div>
23
- <div class="form-group">
24
- <label for="packages">Extra packages to include</label>
25
- <input type="text" class="form-control" id="packages" name="packages">
26
- <p class="help-block">
27
- Separate packages with a pipe (|).
28
- Arguments are also supported. Example: "[english]babel|amsmath"
29
- </p>
30
- </div>
12
+ <form role="form" action="<%= root_path %>" method="POST">
13
+ <div class="form-group">
14
+ <label for="data">LaTeX to render</label>
15
+ <textarea class="form-control" id="data" name="data" rows="5"></textarea>
16
+ </div>
17
+ <div class="checkbox">
18
+ <label>
19
+ <input type="hidden" name="math" value="0">
20
+ <input type="checkbox" checked name="math" value="1"> Render in math mode?
21
+ </label>
22
+ </div>
23
+ <div class="form-group">
24
+ <label for="packages">Extra packages to include</label>
25
+ <input type="text" class="form-control" id="packages" name="packages">
26
+ <p class="help-block">
27
+ Separate packages with a pipe (|).
28
+ Arguments are also supported. Example: "[english]babel|amsmath"
29
+ </p>
30
+ </div>
31
31
 
32
- <div class="form-actions">
33
- <input type="submit" class="btn btn-primary" value="Render PNG">
32
+ <div class="form-actions">
33
+ <input type="submit" class="btn btn-primary" value="Render PNG">
34
+ </div>
35
+ </form>
34
36
  </div>
35
- </form>
36
- </div>
37
37
  </body>
38
38
  </html>
@@ -24,5 +24,5 @@ Gem::Specification.new do |s|
24
24
  ]
25
25
 
26
26
  s.add_dependency 'sinatra', '~> 1.4.4'
27
- s.add_dependency 'rmagick', '~> 2.13.2'
27
+ s.add_dependency 'cocaine', '~> 0.5.3'
28
28
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: texrack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Per Christian B. Viken
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-28 00:00:00.000000000 Z
11
+ date: 2013-11-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -29,15 +29,15 @@ dependencies:
29
29
  requirements:
30
30
  - - ~>
31
31
  - !ruby/object:Gem::Version
32
- version: 2.13.2
32
+ version: 0.5.3
33
33
  version_requirements: !ruby/object:Gem::Requirement
34
34
  requirements:
35
35
  - - ~>
36
36
  - !ruby/object:Gem::Version
37
- version: 2.13.2
37
+ version: 0.5.3
38
38
  type: :runtime
39
39
  prerelease: false
40
- name: rmagick
40
+ name: cocaine
41
41
  description: texrack is a microservice that renders LaTeX as PNG files. Can be mounted
42
42
  in a Rack app
43
43
  email:
@@ -55,6 +55,9 @@ files:
55
55
  - lib/texrack/endpoint.rb
56
56
  - lib/texrack/latex_to_pdf.rb
57
57
  - lib/texrack/pdf_to_png.rb
58
+ - lib/texrack/static/latex-failed.png
59
+ - lib/texrack/static/missing-convert.png
60
+ - lib/texrack/static/missing-pdflatex.png
58
61
  - lib/texrack/version.rb
59
62
  - lib/texrack/views/form.erb
60
63
  - lib/texrack/views/latex.erb
metadata.gz.asc CHANGED
@@ -2,17 +2,17 @@
2
2
  Version: GnuPG/MacGPG2 v2.0.20 (Darwin)
3
3
  Comment: GPGTools - http://gpgtools.org
4
4
 
5
- iQIcBAABAgAGBQJSbpGiAAoJEH1ncb0Txu7X2UwP/1PwVQwNgtK6Q9fSQOiyDuyK
6
- teRGNeHN+AzddQ5z0YeA++fa8xUPRHbkc5VScZspypHoRVzrzbLsmrNHjRf95qNF
7
- ZcIoOXePuYSpUNLsVekUruB9EUC6LuXbgBxSuDkwP/pCpUnXARADP6qCVXDDJCwr
8
- xzwzvIQRkM3WkrxwaNDx8GKkwCuRu+bTPFg98XDHdqM4eK8faQKozzchFfFgGutB
9
- 73VISK3SZFf9ciXH9HfeTi21SoyW3bQFO/Nzx+rFtOI/6A9XFvQ3yL6AWuBOnru3
10
- 2J657sWu3N59spiuepU3V6b6esUiS6Oe1sJPIiUgVk5UFsWQ252baz6jIXaIBs7M
11
- E8eC/OUp2zGFUYv+gpr0wWQ9rnSG4KmHD7YSVQ2E+DrFKI+aNekVvrKvGkp+6qwa
12
- lReG7URHF7x6OXdC4WIZMYBPWzkpUF9TFdTGUyRYguItsOO0Gk0r1Amyl7E+SN1v
13
- wkaQ8GFO4pM3UxrEbtzKaSd0utGB1GeuHEnXfPeuEWG2vfRoGNJMB6y4GzpB3uLf
14
- jprL4cmUQgCMZz5+MPopneP5y1UK1i0fZLUCn0dcMoNpPa4Ga0zP+3y5VibzfsYW
15
- CHMkXPDstJAzmXjNngYz/CtlePt2X2nZSrfnocq0rr7/U2icqyMi78HaNLTF1bkC
16
- syu+g/0vyVyWXNEI84Uf
17
- =c1X7
5
+ iQIcBAABAgAGBQJSc3n2AAoJEH1ncb0Txu7XDdsP/3N7Sfl6Xfm3hwSaNxeOxGwb
6
+ QOhc54Ri2o52AP0eUzQptpbkgonfTrk1rOH2Tvekj6PqfoJtv9mk6GZ8bCumcYtB
7
+ +06IjudEtI78SF2O6/r0QEtXnIqOnqmqFPn9r8OY4FmMqCNkabN+DF+5LkJqM0tQ
8
+ PnlDl3eY/3sBn5n4V5ujRLWXcRIhcXH8OC7TrESazF1gB4OdqDWDQkoSGco1qoCV
9
+ 8aY6DemL8v15x7pOpW+BpaAuUTxZe0Hnar4RRlBqrVMbqfTav4flVJxA5wy0bQkY
10
+ SciH/jTs20PjWDYZMnCb2tug+hSieB/draHlb0zurWUWtqolcyZMcsXKpDq94/8j
11
+ JE3A0DJnnmOpyWfI6B84gYkyK1lm/8SgVLze4CEtnAUwajKw+vKvxCLqvZs/NK5L
12
+ 4HrgDqjUUdxaVlPVUHBMfP4NoAw+DZSPRY2LXqmMYyvLHcA6Oa1AkAyliesnUVG8
13
+ aZpMff3zQeZ4dullgXszgD5p868Mhaefp/ObPkRFWOhUMq7imkwuQE89sCrYnmp9
14
+ 0skxN8LNnFDNNqCZRkDRTWcodxgy7Rxb5wqZ5CdcMDQvq4tXEEjHIEC1IkD4OGJq
15
+ Wm6xoQXhA9KKe3gqFN4xBnXa4vFuR9m7OgnRXywb9U0g939B5sLq77aC51jlhrId
16
+ SaxeCrGbAqj0yjr41kUF
17
+ =K/3E
18
18
  -----END PGP SIGNATURE-----