blockscore 4.0.0 → 4.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +58 -0
  3. data/.hound.yml +217 -0
  4. data/Gemfile +19 -7
  5. data/LICENSE +21 -0
  6. data/README.md +37 -33
  7. data/Rakefile +1 -15
  8. data/blockscore.gemspec +30 -81
  9. data/circle.yml +13 -0
  10. data/lib/blockscore.rb +43 -4
  11. data/lib/blockscore/actions/all.rb +27 -0
  12. data/lib/blockscore/actions/create.rb +34 -0
  13. data/lib/blockscore/actions/delete.rb +31 -0
  14. data/lib/blockscore/actions/retrieve.rb +24 -0
  15. data/lib/blockscore/actions/update.rb +46 -0
  16. data/lib/blockscore/base.rb +117 -0
  17. data/lib/blockscore/candidate.rb +32 -0
  18. data/lib/blockscore/collection.rb +12 -0
  19. data/lib/blockscore/company.rb +7 -0
  20. data/lib/blockscore/connection.rb +65 -0
  21. data/lib/blockscore/dispatch.rb +26 -0
  22. data/lib/blockscore/errors/api_connection_error.rb +6 -0
  23. data/lib/blockscore/errors/api_error.rb +33 -0
  24. data/lib/blockscore/errors/authentication_error.rb +4 -0
  25. data/lib/blockscore/errors/error.rb +4 -0
  26. data/lib/blockscore/errors/invalid_request_error.rb +29 -0
  27. data/lib/blockscore/errors/no_api_key_error.rb +4 -0
  28. data/lib/blockscore/errors/not_found_error.rb +4 -0
  29. data/lib/blockscore/fingerprint.rb +46 -0
  30. data/lib/blockscore/person.rb +14 -0
  31. data/lib/blockscore/question_set.rb +26 -0
  32. data/lib/blockscore/response.rb +29 -0
  33. data/lib/blockscore/util.rb +80 -0
  34. data/lib/blockscore/version.rb +3 -0
  35. data/lib/blockscore/watchlist_hit.rb +4 -0
  36. metadata +82 -48
  37. data/LICENSE.txt +0 -20
  38. data/VERSION +0 -1
  39. data/blockscore-ruby.sublime-project +0 -21
  40. data/lib/blockscore/candidates.rb +0 -49
  41. data/lib/blockscore/client.rb +0 -81
  42. data/lib/blockscore/companies.rb +0 -36
  43. data/lib/blockscore/error/authorization_error.rb +0 -13
  44. data/lib/blockscore/error/blockscore_error.rb +0 -26
  45. data/lib/blockscore/error/error_handler.rb +0 -141
  46. data/lib/blockscore/error/internal_server_error.rb +0 -19
  47. data/lib/blockscore/error/not_found_error.rb +0 -12
  48. data/lib/blockscore/error/parameter_error.rb +0 -12
  49. data/lib/blockscore/error/validation_error.rb +0 -28
  50. data/lib/blockscore/errors.rb +0 -3
  51. data/lib/blockscore/people.rb +0 -37
  52. data/lib/blockscore/question_sets.rb +0 -49
  53. data/lib/blockscore/watchlists.rb +0 -18
  54. data/test/helper.rb +0 -37
  55. data/test/test_blockscore.rb +0 -226
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e88b157232ca06038bc84c1ac5b2a396faa9653f
4
- data.tar.gz: 3a3298c56a4aeccead937ab406797257e057a4b0
3
+ metadata.gz: 05cc2f4bb7d4097bb8e2ec1cf9206a9d7445eb25
4
+ data.tar.gz: 995dbf9d743ebce299876212bbe76b602f795377
5
5
  SHA512:
6
- metadata.gz: 059eeb15b132025b08fe50e95ecf554af98f2fd781025123eb7c1fb654493028037ea96886f3ac2e76895e8135c32bba03b11ae65d29e02c72466d82e4a4ca93
7
- data.tar.gz: f20a55a0e6a8d49819398d0bbcc6c83ddf65052fb61f58a6fb5a0442bf74e9a73e11d2725d549ca56e1124555fefbf6ae61fe0c84948b5e1b8c28d69b53e6df5
6
+ metadata.gz: 24ad5442fc429636b6aa1664efa88644486065112676cf3d0cbe198a4c4c3a01fa17df0dcc8170e288e79077e84b7b86eb9e1ccf1f52713f45d48129ffa705e9
7
+ data.tar.gz: 0af307d785861b7be81e4558492568a9ed42a915cfe2ccf1a78e122f25b10fe5269c0add3b1ca58fddb611bfd9725063742a73b8544b321ae444eff9ea566230
@@ -0,0 +1,58 @@
1
+ # rcov generated
2
+ coverage
3
+ coverage.data
4
+
5
+ # rdoc generated
6
+ rdoc
7
+
8
+ # yard generated
9
+ doc
10
+ .yardoc
11
+
12
+ # bundler
13
+ .bundle
14
+
15
+ # jeweler generated
16
+ pkg
17
+
18
+ # Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
19
+ #
20
+ # * Create a file at ~/.gitignore
21
+ # * Include files you want ignored
22
+ # * Run: git config --global core.excludesfile ~/.gitignore
23
+ #
24
+ # After doing this, these files will be ignored in all your git projects,
25
+ # saving you from having to 'pollute' every project you touch with them
26
+ #
27
+ # Not sure what to needs to be ignored for particular editors/OSes? Here's some ideas to get you started. (Remember, remove the leading # of the line)
28
+ #
29
+ # For MacOS:
30
+ #
31
+ #.DS_Store
32
+
33
+ # For TextMate
34
+ #*.tmproj
35
+ #tmtags
36
+
37
+ # For emacs:
38
+ #*~
39
+ #\#*
40
+ #.\#*
41
+
42
+ # For vim:
43
+ #*.swp
44
+
45
+ # For redcar:
46
+ #.redcar
47
+
48
+ # For rubinius:
49
+ #*.rbc
50
+
51
+ *.sublime-workspace
52
+ *.sublime-project
53
+
54
+ *.DS_Store
55
+
56
+ blockscore-*.gem
57
+
58
+ Gemfile.lock
@@ -0,0 +1,217 @@
1
+ AllCops:
2
+ Include:
3
+ - "**/*.rake"
4
+ - "**/Gemfile"
5
+ - "**/Rakefile"
6
+ Exclude:
7
+ - "vendor/**/*"
8
+ - "db/**/*"
9
+ DisplayCopNames: true
10
+ RunRailsCops: true
11
+ Style/HashSyntax:
12
+ Description: Use hash rockets for backwards compatibility syntax { :a => 1, :b => 2 }.
13
+ Enabled: true
14
+ EnforcedStyle: hash_rockets
15
+ SupportedStyles:
16
+ - ruby19
17
+ - hash_rockets
18
+ TrailingWhitespace:
19
+ Enabled: false
20
+ Style/TrailingBlankLines:
21
+ Enabled: false
22
+ Style/ExtraSpacing:
23
+ Enabled: false
24
+ StringLiterals:
25
+ EnforcedStyle: single_quotes
26
+ Metrics/LineLength:
27
+ Max: 100
28
+ Style/DotPosition:
29
+ EnforcedStyle: leading
30
+ Style/CommentAnnotation:
31
+ Description: Checks formatting of special comments (TODO, FIXME, OPTIMIZE, HACK,
32
+ REVIEW).
33
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#annotate-keywords
34
+ Enabled: true
35
+ Rails/Delegate:
36
+ Description: Prefer delegate method for delegations.
37
+ Enabled: true
38
+ Style/FileName:
39
+ Enabled: true
40
+ Style/GlobalVars:
41
+ Enabled: true
42
+ Style/IfUnlessModifier:
43
+ Description: Favor modifier if/unless usage when you have a single-line body.
44
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#if-as-a-modifier
45
+ Enabled: true
46
+ MaxLineLength: 100
47
+ Style/Next:
48
+ Description: Use `next` to skip iteration instead of a condition at the end.
49
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-nested-conditionals
50
+ Enabled: true
51
+ EnforcedStyle: always
52
+ SupportedStyles:
53
+ - skip_modifier_ifs
54
+ - always
55
+ Style/NumericLiterals:
56
+ Description: Add underscores to large numeric literals to improve their readability.
57
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#underscores-in-numerics
58
+ Enabled: true
59
+ MinDigits: 5
60
+ Style/PercentLiteralDelimiters:
61
+ Description: Use `%`-literal delimiters consistently
62
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#percent-literal-braces
63
+ Enabled: true
64
+ PreferredDelimiters:
65
+ "%": "()"
66
+ "%i": "()"
67
+ "%q": "()"
68
+ "%Q": "()"
69
+ "%r": "()"
70
+ "%s": "()"
71
+ "%w": "()"
72
+ "%W": "()"
73
+ "%x": "()"
74
+ Style/RegexpLiteral:
75
+ Description: Use %r for regular expressions matching more than `MaxSlashes` '/'
76
+ characters. Use %r only for regular expressions matching more than `MaxSlashes`
77
+ '/' character.
78
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#percent-r
79
+ Enabled: true
80
+ MaxSlashes: 1
81
+ Style/SignalException:
82
+ Description: Checks for proper usage of fail and raise.
83
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#fail-method
84
+ Enabled: true
85
+ Style/SingleLineMethods:
86
+ Description: Avoid single-line methods.
87
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-single-line-methods
88
+ Enabled: true
89
+ AllowIfMethodIsEmpty: true
90
+ Style/TrivialAccessors:
91
+ Enabled: true
92
+ ExactNameMatch: false
93
+ AllowPredicates: false
94
+ AllowDSLWriters: false
95
+ IgnoreClassMethods: false
96
+ Whitelist:
97
+ - to_ary
98
+ - to_a
99
+ - to_c
100
+ - to_enum
101
+ - to_h
102
+ - to_hash
103
+ - to_i
104
+ - to_int
105
+ - to_io
106
+ - to_open
107
+ - to_path
108
+ - to_proc
109
+ - to_r
110
+ - to_regexp
111
+ - to_str
112
+ - to_s
113
+ - to_sym
114
+ Style/WordArray:
115
+ Description: Use %w or %W for arrays of words.
116
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#percent-w
117
+ Enabled: true
118
+ MinSize: 0
119
+ WordRegex: !ruby/regexp /\A[\p{Word}]+\z/
120
+ Metrics/ClassLength:
121
+ Description: Avoid classes longer than 250 lines of code.
122
+ Enabled: true
123
+ CountComments: false
124
+ Max: 250
125
+ Style/MethodCalledOnDoEndBlock:
126
+ Description: Avoid chaining a method call on a do...end block.
127
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#single-line-blocks
128
+ Enabled: true
129
+ Style/SymbolArray:
130
+ Description: Use %i or %I for arrays of symbols.
131
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#percent-i
132
+ Enabled: true
133
+ Style/AccessorMethodName:
134
+ Description: Check the naming of accessor methods for get_/set_.
135
+ Enabled: true
136
+ Style/CharacterLiteral:
137
+ Description: Checks for uses of character literals.
138
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-character-literals
139
+ Enabled: true
140
+ Style/ClassVars:
141
+ Description: Avoid the use of class variables.
142
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-class-vars
143
+ Enabled: true
144
+ Style/ColonMethodCall:
145
+ Description: 'Do not use :: for method call.'
146
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#double-colons
147
+ Enabled: true
148
+ Style/DeprecatedHashMethods:
149
+ Description: Checks for use of deprecated Hash methods.
150
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#hash-key
151
+ Enabled: true
152
+ Style/Documentation:
153
+ Description: Document classes and non-namespace modules.
154
+ Enabled: true
155
+ Style/DoubleNegation:
156
+ Description: Checks for uses of double negation (!!).
157
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-bang-bang
158
+ Enabled: true
159
+ Style/EachWithObject:
160
+ Description: Prefer `each_with_object` over `inject` or `reduce`.
161
+ Enabled: true
162
+ Style/EmptyLiteral:
163
+ Description: Prefer literals to Array.new/Hash.new/String.new.
164
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#literal-array-hash
165
+ Enabled: true
166
+ Style/IfWithSemicolon:
167
+ Description: Do not use if x; .... Use the ternary operator instead.
168
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-semicolon-ifs
169
+ Enabled: true
170
+ Style/Lambda:
171
+ Description: Use the new lambda literal syntax for single-line blocks.
172
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#lambda-multi-line
173
+ Enabled: true
174
+ Style/LineEndConcatenation:
175
+ Description: Use \ instead of + or << to concatenate two string literals at line
176
+ end.
177
+ Enabled: true
178
+ Style/ModuleFunction:
179
+ Description: Checks for usage of `extend self` in modules.
180
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#module-function
181
+ Enabled: true
182
+ Style/NegatedIf:
183
+ Description: Favor unless over if for negative conditions (or control flow or).
184
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#unless-for-negatives
185
+ Enabled: true
186
+ Style/NegatedWhile:
187
+ Description: Favor until over while for negative conditions.
188
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#until-for-negatives
189
+ Enabled: true
190
+ Style/NilComparison:
191
+ Description: Prefer x.nil? to x == nil.
192
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#predicate-methods
193
+ Enabled: true
194
+ Style/SelfAssignment:
195
+ Description: Checks for places where self-assignment shorthand should have been
196
+ used.
197
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#self-assignment
198
+ Enabled: true
199
+ Style/StructInheritance:
200
+ Description: Checks for inheritance from Struct.new.
201
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-extend-struct-new
202
+ Enabled: true
203
+ Style/VariableInterpolation:
204
+ Description: Don't interpolate global, instance and class variables directly in
205
+ strings.
206
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#curlies-interpolate
207
+ Enabled: true
208
+ Lint/UnderscorePrefixedVariableName:
209
+ Description: Do not use prefix `_` for a variable that is used.
210
+ Enabled: true
211
+ Style/MultilineOperationIndentation:
212
+ Description: Checks indentation of binary operations that span more than one line.
213
+ Enabled: true
214
+ EnforcedStyle: aligned
215
+ SupportedStyles:
216
+ - aligned
217
+ - indented
data/Gemfile CHANGED
@@ -5,11 +5,23 @@ gem 'httparty', '~> 0.11'
5
5
  # Add dependencies to develop your gem here.
6
6
  # Include everything needed to run rake, tests, features, etc.
7
7
  group :development do
8
- gem "shoulda", "~> 3.5.0"
9
- gem "rdoc", "~> 3.12"
10
- gem "bundler", "~> 1.0"
11
- gem "jeweler", "~> 2.0.1"
12
- gem "simplecov", ">= 0"
13
- gem "minitest", "~> 4.0"
14
- gem 'shoulda-context', '~> 1.2'
8
+ gem 'rdoc', '~> 3.12'
9
+ gem 'bundler', '~> 1.0'
10
+ gem 'simplecov', '>= 0'
11
+ end
12
+
13
+ group :development, :test do
14
+ gem 'test-unit', '~> 3.0'
15
+ gem 'test-unit-activesupport', '~> 1.0'
16
+ gem 'activesupport', '4.1.0.rc1'
17
+ gem 'mutant', github: 'kbrock/mutant', branch: 'minitest'
18
+ gem 'mutant-minitest', github: 'kbrock/mutant', branch: 'minitest'
19
+ gem 'minitest', '~> 5.3'
20
+ gem 'minitest-rg', github: 'blowmage/minitest-rg', branch: 'master'
21
+ end
22
+
23
+ group :test do
24
+ gem 'webmock', '~> 1.21'
25
+ gem 'factory_girl', '~> 4.1.0'
26
+ gem 'faker', '~> 1.4.3'
15
27
  end
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2013-2015 BlockScore
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
- # blockscore-ruby
1
+ # blockscore-ruby [![Circle CI](https://circleci.com/gh/BlockScore/blockscore-ruby/tree/master.svg?style=shield)](https://circleci.com/gh/BlockScore/blockscore-ruby/tree/4.1.0) [![Test Coverage](https://codeclimate.com/github/BlockScore/blockscore-ruby/badges/coverage.svg)](https://codeclimate.com/github/BlockScore/blockscore-ruby/coverage) [![Dependency Status](https://gemnasium.com/BlockScore/blockscore-ruby.svg)](https://gemnasium.com/BlockScore/blockscore-ruby)
2
2
 
3
- This is the official library for Ruby clients of the BlockScore API. [Click here to read the full documentation including code examples](http://docs.blockscore.com/v4.0/ruby/).
3
+ This is the official library for Ruby clients of the BlockScore API. [Click here to read the full documentation including code examples](http://docs.blockscore.com/ruby/).
4
4
 
5
5
  ## Install
6
6
 
@@ -13,7 +13,7 @@ gem install blockscore
13
13
  If you are using Rails, add the following to your `Gemfile`:
14
14
 
15
15
  ```ruby
16
- gem 'blockscore', '~> 4.0.0'
16
+ gem 'blockscore', '~> 4.1.0'
17
17
  ```
18
18
 
19
19
  ## Getting Started
@@ -21,40 +21,44 @@ gem 'blockscore', '~> 4.0.0'
21
21
  To get started, you can initialize the library with one line:
22
22
 
23
23
  ```ruby
24
- client = BlockScore::Client.new('your-api-key')
24
+ BlockScore.api_key = 'your-api-key'
25
25
  ```
26
26
 
27
- To see the list of calls you can make, please visit out [full Ruby API reference](http://docs.blockscore.com/4.0/ruby).
27
+ To verify a person:
28
28
 
29
- ## Exceptions and Errors
30
-
31
- ### Error Description
32
-
33
- * The generic error class is BlockscoreError. All other types of errors are derived from BlockscoreError.
34
- * Errors contain information such as the HTTP response code, a short message describing the error, the type of error, and if applicable, the parameter and error code at issue.
35
- * Also available in the error object is the full JSON text representation of the data.
36
-
37
- ### Error Types
38
-
39
- * BlockscoreError (Generic error, base class)
40
- * AuthenticationError (401 : Invalid API Key)
41
- * ValidationError (400 : Input could not be validated)
42
- * ParameterError (400 : Missing parameter)
43
- * NotFoundError (404 : Attempting to reference nonexistent endpoint)
44
- * InternalServerError (500 : Error on the Blockscore API)
29
+ ```ruby
30
+ person = BlockScore::Person.create(
31
+ birth_day: '23',
32
+ birth_month: '8',
33
+ birth_year: '1980',
34
+ document_type: 'ssn',
35
+ document_value: '0000',
36
+ name_first: 'John',
37
+ name_middle: 'Pearce',
38
+ name_last: 'Doe',
39
+ address_street1: '1 Infinite Loop',
40
+ address_street2: 'Apt 6',
41
+ address_city: 'Cupertino',
42
+ address_state: 'CA',
43
+ address_postal_code: '95014',
44
+ address_country_code: 'US'
45
+ )
46
+
47
+ # Check the validation status of the Person
48
+ person.status
49
+ # => 'valid'
50
+
51
+ # Or view some of the other attributes
52
+ person.details.address
53
+ # => 'mismatch'
54
+ ```
45
55
 
46
- ## Contributing to BlockScore
47
-
48
- * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
49
- * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
50
- * Fork the project.
51
- * Start a feature/bugfix branch.
52
- * Commit and push until you are happy with your contribution.
53
- * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
54
- * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
56
+ To see the list of calls you can make, please visit our [full Ruby API reference](http://docs.blockscore.com/ruby/).
55
57
 
56
- ## Copyright
58
+ ## Testing
57
59
 
58
- Copyright (c) 2014 BlockScore. See LICENSE.txt for
59
- further details.
60
+ The test suite uses a public BlockScore API key that was created specifically to ease the testing and contribution processes. **Please do not enter personal details for tests.** In order to run the test suite:
60
61
 
62
+ ```shell
63
+ $ rake test
64
+ ```
data/Rakefile CHANGED
@@ -11,24 +11,10 @@ rescue Bundler::BundlerError => e
11
11
  end
12
12
  require 'rake'
13
13
 
14
- require 'jeweler'
15
- Jeweler::Tasks.new do |gem|
16
- # gem is a Gem::Specification... see http://guides.rubygems.org/specification-reference/ for more options
17
- gem.name = "blockscore"
18
- gem.homepage = "http://github.com/blockscore/blockscore-ruby"
19
- gem.license = "MIT"
20
- gem.summary = %Q{A ruby client library for the BlockScore API.}
21
- gem.description = %Q{A ruby client library for the BlockScore API.}
22
- gem.email = "alain@blockscore.com"
23
- gem.authors = ["Alain Meier"]
24
- # dependencies defined in Gemfile
25
- end
26
- Jeweler::RubygemsDotOrgTasks.new
27
-
28
14
  require 'rake/testtask'
29
15
  Rake::TestTask.new(:test) do |test|
30
16
  test.libs << 'lib' << 'test'
31
- test.pattern = 'test/**/test_*.rb'
17
+ test.pattern = 'test/*_test.rb'
32
18
  test.verbose = true
33
19
  end
34
20