ruby-lint 0.9.1 → 1.0.0.pre.preview1

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.
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-----