ruby-lint 0.9.1 → 1.0.0.pre.preview1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -1
  3. data/CONTRIBUTING.md +9 -11
  4. data/Gemfile +6 -3
  5. data/MANIFEST +7 -1
  6. data/README.md +15 -24
  7. data/benchmark/bootup.rb +13 -0
  8. data/checksum/ruby-lint-0.9.1.gem.sha512 +1 -0
  9. data/doc/code_analysis.md +20 -0
  10. data/doc/css/common.css +1 -0
  11. data/doc/images/flow.png +0 -0
  12. data/lib/ruby-lint.rb +1 -3
  13. data/lib/ruby-lint/analysis/base.rb +12 -2
  14. data/lib/ruby-lint/analysis/undefined_variables.rb +3 -2
  15. data/lib/ruby-lint/analysis/unused_variables.rb +3 -2
  16. data/lib/ruby-lint/ast/node.rb +1 -1
  17. data/lib/ruby-lint/benchmark/average.rb +115 -0
  18. data/lib/ruby-lint/cli/analyze.rb +19 -1
  19. data/lib/ruby-lint/constant_loader.rb +1 -3
  20. data/lib/ruby-lint/constant_path.rb +112 -0
  21. data/lib/ruby-lint/definition_builder/base.rb +0 -2
  22. data/lib/ruby-lint/definition_builder/ruby_module.rb +1 -1
  23. data/lib/ruby-lint/definitions/core/array.rb +304 -73
  24. data/lib/ruby-lint/definitions/core/fixnum.rb +575 -19
  25. data/lib/ruby-lint/definitions/core/float.rb +2650 -95
  26. data/lib/ruby-lint/definitions/core/hash.rb +926 -85
  27. data/lib/ruby-lint/definitions/core/ruby_copyright.rb +3 -1
  28. data/lib/ruby-lint/definitions/core/ruby_description.rb +3 -1
  29. data/lib/ruby-lint/definitions/core/ruby_engine.rb +3 -1
  30. data/lib/ruby-lint/definitions/core/ruby_patchlevel.rb +3 -1
  31. data/lib/ruby-lint/definitions/core/ruby_platform.rb +3 -1
  32. data/lib/ruby-lint/definitions/core/ruby_release_date.rb +3 -1
  33. data/lib/ruby-lint/definitions/core/ruby_version.rb +3 -1
  34. data/lib/ruby-lint/definitions/core/string.rb +847 -134
  35. data/lib/ruby-lint/definitions/core/string_io.rb +370 -25
  36. data/lib/ruby-lint/definitions/core/struct.rb +611 -146
  37. data/lib/ruby-lint/file_loader.rb +5 -6
  38. data/lib/ruby-lint/file_scanner.rb +44 -11
  39. data/lib/ruby-lint/inspector.rb +12 -2
  40. data/lib/ruby-lint/runner.rb +6 -2
  41. data/lib/ruby-lint/version.rb +1 -1
  42. data/lib/ruby-lint/virtual_machine.rb +19 -5
  43. data/ruby-lint.gemspec +1 -3
  44. data/spec/ruby-lint/analysis/argument_amount_spec.rb +5 -5
  45. data/spec/ruby-lint/analysis/base_spec.rb +4 -0
  46. data/spec/ruby-lint/analysis/shadowing_variables_spec.rb +4 -4
  47. data/spec/ruby-lint/analysis/undefined_methods_spec.rb +6 -6
  48. data/spec/ruby-lint/analysis/undefined_variables_spec.rb +5 -5
  49. data/spec/ruby-lint/analysis/unused_variables_spec.rb +12 -12
  50. data/spec/ruby-lint/cli/analyze_spec.rb +10 -0
  51. data/spec/ruby-lint/constant_path.rb +63 -0
  52. data/spec/ruby-lint/definition/ruby_object_spec.rb +2 -2
  53. data/spec/ruby-lint/report_spec.rb +2 -2
  54. data/spec/ruby-lint/runner_spec.rb +17 -0
  55. data/spec/ruby-lint/virtual_machine/assignments/assignment_arguments_spec.rb +14 -0
  56. data/spec/ruby-lint/virtual_machine/assignments/constants_spec.rb +23 -0
  57. data/spec/ruby-lint/virtual_machine/location_spec.rb +4 -4
  58. data/spec/ruby-lint/virtual_machine/method_call_tracking_spec.rb +4 -4
  59. data/task/build.rake +2 -7
  60. data/task/doc.rake +3 -1
  61. data/task/generate.rake +3 -0
  62. metadata +20 -36
  63. checksums.yaml.gz.asc +0 -17
  64. data.tar.gz.asc +0 -17
  65. data/lib/ruby-lint/helper/constant_paths.rb +0 -50
  66. metadata.gz.asc +0 -17
@@ -38,5 +38,15 @@ describe RubyLint::CLI do
38
38
  output.should =~ /Execution time:/
39
39
  output.should =~ /Memory usage:/
40
40
  end
41
+
42
+ example 'run analysis on an entire directory' do
43
+ @command.parse([fixture_path('deeply')])
44
+
45
+ @output.rewind
46
+
47
+ output = @output.read
48
+
49
+ output.should =~ /undefined method foobar/
50
+ end
41
51
  end
42
52
  end
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+
3
+ describe RubyLint::ConstantPath do
4
+ context 'resolving definitions' do
5
+ before :all do
6
+ @scope = ruby_object.new(:type => :const, :name => 'Example')
7
+ @foo = @scope.define_constant('Foo')
8
+ @bar = @foo.define_constant('Bar')
9
+
10
+ lvar = ruby_object.new(
11
+ :type => :lvar,
12
+ :name => 'example',
13
+ :value => @foo
14
+ )
15
+
16
+ @scope.add_definition(lvar)
17
+ end
18
+
19
+ example 'resolve a path of purely constants' do
20
+ node = s(:const, s(:const, nil, :Foo), :Bar)
21
+ defs = RubyLint::ConstantPath.new(node).resolve(@scope)
22
+
23
+ defs.is_a?(ruby_object).should == true
24
+
25
+ defs.name.should == 'Bar'
26
+ defs.type.should == :const
27
+ end
28
+
29
+ example 'resolve a path containing a variable' do
30
+ node = s(:const, s(:lvar, :example), :Bar)
31
+ defs = RubyLint::ConstantPath.new(node).resolve(@scope)
32
+
33
+ defs.is_a?(ruby_object).should == true
34
+
35
+ defs.name.should == 'Bar'
36
+ defs.type.should == :const
37
+ end
38
+
39
+ example 'resolve a path for a constant assignment' do
40
+ node = s(:casgn, s(:const, nil, :Foo), :Bar, s(:int, 10))
41
+ defs = RubyLint::ConstantPath.new(node).resolve(@scope)
42
+
43
+ defs.is_a?(ruby_object).should == true
44
+
45
+ defs.name.should == 'Bar'
46
+ defs.type.should == :const
47
+ end
48
+ end
49
+
50
+ example 'return the root node of a constant path' do
51
+ node = s(:const, s(:const, nil, :Foo), :Bar)
52
+ root = RubyLint::ConstantPath.new(node).root_node
53
+
54
+ root.should == [:const, 'Foo']
55
+ end
56
+
57
+ example 'generate the name of a constant path' do
58
+ node = s(:const, s(:const, nil, :Foo), :Bar)
59
+ name = RubyLint::ConstantPath.new(node).to_s
60
+
61
+ name.should == 'Foo::Bar'
62
+ end
63
+ end
@@ -196,10 +196,10 @@ describe ruby_object do
196
196
  end
197
197
 
198
198
  example 'storing location information in a definition' do
199
- obj = ruby_object.new(:line => 10, :column => 2, :file => '(ruby-lint)')
199
+ obj = ruby_object.new(:line => 10, :column => 3, :file => '(ruby-lint)')
200
200
 
201
201
  obj.line.should == 10
202
- obj.column.should == 2
202
+ obj.column.should == 3
203
203
  obj.file.should == '(ruby-lint)'
204
204
  end
205
205
 
@@ -8,7 +8,7 @@ describe 'RubyLint::Report' do
8
8
  :level => :info,
9
9
  :message => 'info message',
10
10
  :line => 1,
11
- :column => 1,
11
+ :column => 2,
12
12
  :file => 'file.rb'
13
13
  )
14
14
 
@@ -19,7 +19,7 @@ describe 'RubyLint::Report' do
19
19
  entry.level.should == :info
20
20
  entry.message.should == 'info message'
21
21
  entry.line.should == 1
22
- entry.column.should == 1
22
+ entry.column.should == 2
23
23
  entry.file.should == 'file.rb'
24
24
  end
25
25
 
@@ -54,4 +54,21 @@ describe RubyLint::Runner do
54
54
 
55
55
  output.empty?.should == true
56
56
  end
57
+
58
+ example 'conditionally disable analysis classes' do
59
+ # This analysis class triggers the "undefined method foobar..." error.
60
+ RubyLint::Analysis::UndefinedMethods.stub(:analyze?) do |ast, vm|
61
+ # This ensures that the passed arguments are passed in the right order
62
+ # and of the right type.
63
+ !(ast.is_a?(RubyLint::AST::Node) && vm.is_a?(RubyLint::VirtualMachine))
64
+ end
65
+
66
+ files = [fixture_path('uses_external_invalid.rb')]
67
+ dirs = [fixture_path('file_scanner/rails')]
68
+ config = RubyLint::Configuration.new(:directories => dirs)
69
+ runner = RubyLint::Runner.new(config)
70
+ output = runner.analyze(files)
71
+
72
+ output.empty?.should == true
73
+ end
57
74
  end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ describe RubyLint::VirtualMachine do
4
+ context 'variable assignments as method arguments' do
5
+ example 'assign a local variable in a method argument' do
6
+ code = 'puts(number = 10)'
7
+ defs = build_definitions(code)
8
+ value = defs.lookup(:lvar, 'number').value
9
+
10
+ value.type.should == :int
11
+ value.value.should == 10
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe RubyLint::VirtualMachine do
4
+ context 'constants and local variables' do
5
+ # https://github.com/YorickPeterse/ruby-lint/issues/60
6
+ example 'access a constant path using a local variable' do
7
+ code = <<-CODE
8
+ module Example
9
+ NUMBER = 10
10
+ end
11
+
12
+ const = Example
13
+ string = const::NUMBER
14
+ CODE
15
+
16
+ defs = build_definitions(code)
17
+ value = defs.lookup(:lvar, 'string').value
18
+
19
+ value.type.should == :int
20
+ value.value.should == 10
21
+ end
22
+ end
23
+ end
@@ -13,7 +13,7 @@ end
13
13
  obj = defs.lookup(:const, 'Example')
14
14
 
15
15
  obj.line.should == 2
16
- obj.column.should == 0
16
+ obj.column.should == 1
17
17
  obj.file.should == '(ruby-lint)'
18
18
  end
19
19
 
@@ -28,7 +28,7 @@ end
28
28
  obj = defs.lookup(:const, 'Example')
29
29
 
30
30
  obj.line.should == 2
31
- obj.column.should == 0
31
+ obj.column.should == 1
32
32
  obj.file.should == '(ruby-lint)'
33
33
  end
34
34
 
@@ -43,7 +43,7 @@ end
43
43
  obj = defs.lookup(:instance_method, 'example')
44
44
 
45
45
  obj.line.should == 2
46
- obj.column.should == 0
46
+ obj.column.should == 1
47
47
  obj.file.should == '(ruby-lint)'
48
48
  end
49
49
 
@@ -57,7 +57,7 @@ number = 10
57
57
  obj = defs.lookup(:lvar, 'number')
58
58
 
59
59
  obj.line.should == 2
60
- obj.column.should == 0
60
+ obj.column.should == 1
61
61
  obj.file.should == '(ruby-lint)'
62
62
  end
63
63
  end
@@ -30,10 +30,10 @@ end
30
30
 
31
31
  example 'track call location information' do
32
32
  @third.calls[0].line.should == 8
33
- @third.calls[0].column.should == 2
33
+ @third.calls[0].column.should == 3
34
34
 
35
35
  @third.calls[1].line.should == 9
36
- @third.calls[1].column.should == 2
36
+ @third.calls[1].column.should == 3
37
37
  end
38
38
 
39
39
  example 'track the call definitions' do
@@ -43,10 +43,10 @@ end
43
43
 
44
44
  example 'track call location information in inverse direction' do
45
45
  @first.callers[0].line.should == 8
46
- @first.callers[0].column.should == 2
46
+ @first.callers[0].column.should == 3
47
47
 
48
48
  @second.callers[0].line.should == 9
49
- @second.callers[0].column.should == 2
49
+ @second.callers[0].column.should == 3
50
50
  end
51
51
 
52
52
  example 'track method calls in inverse direction' do
@@ -1,9 +1,4 @@
1
- desc 'Builds and signs a new Gem'
2
- task :signed_build => [:build] do
3
- name = "#{GEMSPEC.name}-#{GEMSPEC.version}.gem"
4
- path = File.join(File.expand_path('../../pkg', __FILE__), name)
5
-
6
- sh("gem sign #{path}")
7
-
1
+ desc 'Builds a new Gem and its checksum'
2
+ task :signed_build do
8
3
  Rake::Task['checksum'].invoke
9
4
  end
@@ -10,5 +10,7 @@ task :upload_doc => :doc do
10
10
  version_dir = File.join(root_dir, RubyLint::VERSION)
11
11
 
12
12
  sh "scp -r yardoc europa:#{version_dir}"
13
- sh "ssh europa ln -s #{version_dir} #{root_dir}/latest"
13
+
14
+ sh "ssh europa 'rm -f #{root_dir}/latest " \
15
+ "&& ln -s #{version_dir} #{root_dir}/latest'"
14
16
  end
@@ -17,6 +17,9 @@ namespace :generate do
17
17
  task :everything, :overwrite do |task, args|
18
18
  args.with_defaults(:overwrite => false)
19
19
 
20
+ # Require the entire stdlib so we can generate the definitions for it.
21
+ require_relative '../misc/stdlib'
22
+
20
23
  directory = File.expand_path(
21
24
  '../../lib/ruby-lint/definitions/core/',
22
25
  __FILE__
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-lint
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 1.0.0.pre.preview1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yorick Peterse
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-21 00:00:00.000000000 Z
11
+ date: 2013-11-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parser
@@ -24,34 +24,26 @@ dependencies:
24
24
  - - '>='
25
25
  - !ruby/object:Gem::Version
26
26
  version: 2.0.0
27
- - !ruby/object:Gem::Dependency
28
- name: racc
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - '>='
32
- - !ruby/object:Gem::Version
33
- version: 1.4.10
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - '>='
39
- - !ruby/object:Gem::Version
40
- version: 1.4.10
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: slop
43
29
  requirement: !ruby/object:Gem::Requirement
44
30
  requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '3.4'
45
34
  - - '>='
46
35
  - !ruby/object:Gem::Version
47
- version: '0'
36
+ version: 3.4.7
48
37
  type: :runtime
49
38
  prerelease: false
50
39
  version_requirements: !ruby/object:Gem::Requirement
51
40
  requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: '3.4'
52
44
  - - '>='
53
45
  - !ruby/object:Gem::Version
54
- version: '0'
46
+ version: 3.4.7
55
47
  - !ruby/object:Gem::Dependency
56
48
  name: rake
57
49
  requirement: !ruby/object:Gem::Requirement
@@ -122,20 +114,6 @@ dependencies:
122
114
  - - '>='
123
115
  - !ruby/object:Gem::Version
124
116
  version: '0'
125
- - !ruby/object:Gem::Dependency
126
- name: rubygems-openpgp
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - '>='
130
- - !ruby/object:Gem::Version
131
- version: '0'
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - '>='
137
- - !ruby/object:Gem::Version
138
- version: '0'
139
117
  - !ruby/object:Gem::Dependency
140
118
  name: coveralls
141
119
  requirement: !ruby/object:Gem::Requirement
@@ -223,6 +201,7 @@ files:
223
201
  - MANIFEST
224
202
  - README.md
225
203
  - Rakefile
204
+ - benchmark/bootup.rb
226
205
  - benchmark/virtual_machine.rb
227
206
  - bin/ruby-lint
228
207
  - checksum/.gitkeep
@@ -230,6 +209,7 @@ files:
230
209
  - checksum/ruby-lint-0.0.4.gem.sha512
231
210
  - checksum/ruby-lint-0.0.5.gem.sha512
232
211
  - checksum/ruby-lint-0.9.0.gem.sha512
212
+ - checksum/ruby-lint-0.9.1.gem.sha512
233
213
  - doc/.gitkeep
234
214
  - doc/DCO.md
235
215
  - doc/architecture.md
@@ -251,6 +231,7 @@ files:
251
231
  - lib/ruby-lint/analysis/unused_variables.rb
252
232
  - lib/ruby-lint/ast/builder.rb
253
233
  - lib/ruby-lint/ast/node.rb
234
+ - lib/ruby-lint/benchmark/average.rb
254
235
  - lib/ruby-lint/cache.rb
255
236
  - lib/ruby-lint/cache_entry.rb
256
237
  - lib/ruby-lint/cli.rb
@@ -260,6 +241,7 @@ files:
260
241
  - lib/ruby-lint/cli/plot.rb
261
242
  - lib/ruby-lint/configuration.rb
262
243
  - lib/ruby-lint/constant_loader.rb
244
+ - lib/ruby-lint/constant_path.rb
263
245
  - lib/ruby-lint/default_names.rb
264
246
  - lib/ruby-lint/definition/constant_proxy.rb
265
247
  - lib/ruby-lint/definition/ruby_method.rb
@@ -433,7 +415,6 @@ files:
433
415
  - lib/ruby-lint/file_scanner.rb
434
416
  - lib/ruby-lint/generated_constant.rb
435
417
  - lib/ruby-lint/global_scope.rb
436
- - lib/ruby-lint/helper/constant_paths.rb
437
418
  - lib/ruby-lint/inspector.rb
438
419
  - lib/ruby-lint/iterator.rb
439
420
  - lib/ruby-lint/method_call/alias.rb
@@ -493,6 +474,7 @@ files:
493
474
  - spec/ruby-lint/cli/analyze_spec.rb
494
475
  - spec/ruby-lint/cli/ast_spec.rb
495
476
  - spec/ruby-lint/configuration_spec.rb
477
+ - spec/ruby-lint/constant_path.rb
496
478
  - spec/ruby-lint/definition/constant_proxy_spec.rb
497
479
  - spec/ruby-lint/definition/dsl_spec.rb
498
480
  - spec/ruby-lint/definition/ruby_method_spec.rb
@@ -520,6 +502,8 @@ files:
520
502
  - spec/ruby-lint/runner_spec.rb
521
503
  - spec/ruby-lint/virtual_machine/alias_spec.rb
522
504
  - spec/ruby-lint/virtual_machine/assignments/arrays_spec.rb
505
+ - spec/ruby-lint/virtual_machine/assignments/assignment_arguments_spec.rb
506
+ - spec/ruby-lint/virtual_machine/assignments/constants_spec.rb
523
507
  - spec/ruby-lint/virtual_machine/assignments/hashes_spec.rb
524
508
  - spec/ruby-lint/virtual_machine/assignments/optional_spec.rb
525
509
  - spec/ruby-lint/virtual_machine/assignments/return_values_spec.rb
@@ -598,12 +582,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
598
582
  version: 1.9.3
599
583
  required_rubygems_version: !ruby/object:Gem::Requirement
600
584
  requirements:
601
- - - '>='
585
+ - - '>'
602
586
  - !ruby/object:Gem::Version
603
- version: '0'
587
+ version: 1.3.1
604
588
  requirements: []
605
589
  rubyforge_project:
606
- rubygems_version: 2.0.6
590
+ rubygems_version: 2.1.11
607
591
  signing_key:
608
592
  specification_version: 4
609
593
  summary: A linter and static code analysis tool for Ruby.
@@ -1,17 +0,0 @@
1
- -----BEGIN PGP SIGNATURE-----
2
- Version: GnuPG v2.0.22 (GNU/Linux)
3
-
4
- iQIcBAABAgAGBQJSZaGYAAoJEPMbESk2SfRE2+cP/RopiS2DlcZsvLj9GGnAgE3P
5
- g+qKKUC0Uhkuy9h5x6n/0vSGHOkObbIyyMS+nSkU5gilfeyCnABJSJ2bjdhw7FIj
6
- WkO17SZea38vWq+96i/XogikLQGa91wB0H000S/cPSCqMRzAejd7wEatboeUO/vv
7
- DHTtMNAB/zRLpK09f+0jfKykpyCs/IYnf0ksgj3vjM6KWhpPJgbfTs4U9RLDLNmi
8
- ZNkWoukKeMnm/t2ZBIbd99HnJ2k1TDo/eWSg0nLf+VXxdJSCCwPPS6yJMAdOm/s/
9
- gn1i+TtEI3ChwDUx+ayIDIRNtHLZvYX06WA+hmyFc7N5uv9EWxzg54dRzcZtT4FT
10
- XI0ffAAi9AdPp1GY9Rpswj5ZxD7bg4kTFSXp+ZViUR0kv9K21G6MnohRLQfD2tUR
11
- k/PidGMVtZj6/NZGXcWVSgSneCSa7GUFSDOqW3FxJP1JqREAgiKWmltX+y4GUoLp
12
- QnqGdG1ny0kK02a8T0MrYcS6+nCyK+V2VkPrXXn7Vjh8gapK41XqCz9z1YeNEFVt
13
- zW12bBnn9S6mZTbeseTiXwAimY/6SPKgDOhcCePvvWJpnLUW1lDTZquVjcZ0C4fZ
14
- 68lh3NG0ou2sXvSZrDoHtLo/Ee0tZ9aoaxu2U7PQFMYRymP2ra1MtKzyeO+khlk7
15
- ob8exXEmfBbQGIo5r31v
16
- =jpFY
17
- -----END PGP SIGNATURE-----
data.tar.gz.asc DELETED
@@ -1,17 +0,0 @@
1
- -----BEGIN PGP SIGNATURE-----
2
- Version: GnuPG v2.0.22 (GNU/Linux)
3
-
4
- iQIcBAABAgAGBQJSZaGYAAoJEPMbESk2SfRECJIP/2L6stRY1E8JXvwIahm88gbf
5
- SXnmSsAEmJhpDs0OpItM6XWG+Or3L1Eu8F0g2FIS3u1nidaYXMCyrXXZqfyeMtC3
6
- zpimnnYL/NDMDqsAuLJFc5fidg2gEAHIY8ujTKH1LOJjsvVim5Cxhzz+BSu9mxAK
7
- WulazfRLEk76dmuSKANkciD1DWXySnGHU7wNITvPtlRzJgVs54wDQtlzhgQQu8sG
8
- Xq9nTLiJRFpquCrUsnAWxSJ8NWtXMgV8+i+50hJ/zI+wqt8VvZNX92XUfgTheUgG
9
- v9qMfa/+Bo7OBieZSv5sOuAaEywyRFsfe6b+D7NlZmfGeS71fX7tW0zG7jyFZZ0V
10
- vnQgyrTQYfEl8E8Htr3nGtSZ9LbrBkQIkQ2R1oP64ATm/NXz1kLhMJSB0Q/Gpco5
11
- 9PXyiGHNylCOw8JrVW5wihKMO3Vo0R6B4tM/C4zkjOxpGhUCbRNOUlqyWLGSC0Af
12
- Gl/vF8ptxHAW0CuCwIIeWjwIv1NTi08zc/+ay380QcHulmlexBeY+h+CaWYT3ONt
13
- 64JXR3VNgspjNYbdFHitDA1eHH9dc3b2n+pzvQNU3QoK1FCwt4uH4HCGYbcdH82F
14
- oRzPnb73MVuPUFEBz7jf3RX/gK0BRC7XDzqqREuyTN78Rxf6IcNEVYO6snj/EmkL
15
- GJw1BUlOMnbV54Y2rwBj
16
- =AnGR
17
- -----END PGP SIGNATURE-----