google-cloud-speech 0.23.0 → 0.24.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -14,7 +14,7 @@
14
14
  #
15
15
  # EDITING INSTRUCTIONS
16
16
  # This file was generated from the file
17
- # https://github.com/googleapis/googleapis/blob/master/google/cloud/speech/v1beta1/cloud_speech.proto,
17
+ # https://github.com/googleapis/googleapis/blob/master/google/cloud/speech/v1/cloud_speech.proto,
18
18
  # and updates to that file get reflected here through a refresh process.
19
19
  # For the short term, the refresh process will only be runnable by Google
20
20
  # engineers.
@@ -29,16 +29,16 @@ require "google/gax"
29
29
  require "google/gax/operation"
30
30
  require "google/longrunning/operations_client"
31
31
 
32
- require "google/cloud/speech/v1beta1/cloud_speech_pb"
32
+ require "google/cloud/speech/v1/cloud_speech_pb"
33
33
 
34
34
  module Google
35
35
  module Cloud
36
36
  module Speech
37
- module V1beta1
37
+ module V1
38
38
  # Service that implements Google Cloud Speech API.
39
39
  #
40
40
  # @!attribute [r] speech_stub
41
- # @return [Google::Cloud::Speech::V1beta1::Speech::Stub]
41
+ # @return [Google::Cloud::Speech::V1::Speech::Stub]
42
42
  class SpeechClient
43
43
  attr_reader :speech_stub
44
44
 
@@ -64,6 +64,12 @@ module Google
64
64
  # A Channel object through which to make calls.
65
65
  # @param chan_creds [Grpc::ChannelCredentials]
66
66
  # A ChannelCredentials for the setting up the RPC client.
67
+ # @param updater_proc [Proc]
68
+ # A function that transforms the metadata for requests, e.g., to give
69
+ # OAuth credentials.
70
+ # @param scopes [Array<String>]
71
+ # The OAuth scopes for this service. This parameter is ignored if
72
+ # an updater_proc is supplied.
67
73
  # @param client_config[Hash]
68
74
  # A Hash for call options for each method. See
69
75
  # Google::Gax#construct_settings for the structure of
@@ -76,6 +82,7 @@ module Google
76
82
  port: DEFAULT_SERVICE_PORT,
77
83
  channel: nil,
78
84
  chan_creds: nil,
85
+ updater_proc: nil,
79
86
  scopes: ALL_SCOPES,
80
87
  client_config: {},
81
88
  timeout: DEFAULT_TIMEOUT,
@@ -87,13 +94,14 @@ module Google
87
94
  # the gRPC module only when it's required.
88
95
  # See https://github.com/googleapis/toolkit/issues/446
89
96
  require "google/gax/grpc"
90
- require "google/cloud/speech/v1beta1/cloud_speech_services_pb"
97
+ require "google/cloud/speech/v1/cloud_speech_services_pb"
91
98
 
92
99
  @operations_client = Google::Longrunning::OperationsClient.new(
93
100
  service_path: service_path,
94
101
  port: port,
95
102
  channel: channel,
96
103
  chan_creds: chan_creds,
104
+ updater_proc: updater_proc,
97
105
  scopes: scopes,
98
106
  client_config: client_config,
99
107
  timeout: timeout,
@@ -119,7 +127,7 @@ module Google
119
127
  )
120
128
  defaults = client_config_file.open do |f|
121
129
  Google::Gax.construct_settings(
122
- "google.cloud.speech.v1beta1.Speech",
130
+ "google.cloud.speech.v1.Speech",
123
131
  JSON.parse(f.read),
124
132
  client_config,
125
133
  Google::Gax::Grpc::STATUS_CODE_NAMES,
@@ -133,17 +141,18 @@ module Google
133
141
  port,
134
142
  chan_creds: chan_creds,
135
143
  channel: channel,
144
+ updater_proc: updater_proc,
136
145
  scopes: scopes,
137
- &Google::Cloud::Speech::V1beta1::Speech::Stub.method(:new)
146
+ &Google::Cloud::Speech::V1::Speech::Stub.method(:new)
138
147
  )
139
148
 
140
- @sync_recognize = Google::Gax.create_api_call(
141
- @speech_stub.method(:sync_recognize),
142
- defaults["sync_recognize"]
149
+ @recognize = Google::Gax.create_api_call(
150
+ @speech_stub.method(:recognize),
151
+ defaults["recognize"]
143
152
  )
144
- @async_recognize = Google::Gax.create_api_call(
145
- @speech_stub.method(:async_recognize),
146
- defaults["async_recognize"]
153
+ @long_running_recognize = Google::Gax.create_api_call(
154
+ @speech_stub.method(:long_running_recognize),
155
+ defaults["long_running_recognize"]
147
156
  )
148
157
  @streaming_recognize = Google::Gax.create_api_call(
149
158
  @speech_stub.method(:streaming_recognize),
@@ -153,84 +162,88 @@ module Google
153
162
 
154
163
  # Service calls
155
164
 
156
- # Perform synchronous speech-recognition: receive results after all audio
165
+ # Performs synchronous speech recognition: receive results after all audio
157
166
  # has been sent and processed.
158
167
  #
159
- # @param config [Google::Cloud::Speech::V1beta1::RecognitionConfig]
160
- # [Required] The +config+ message provides information to the recognizer
161
- # that specifies how to process the request.
162
- # @param audio [Google::Cloud::Speech::V1beta1::RecognitionAudio]
163
- # [Required] The audio data to be recognized.
168
+ # @param config [Google::Cloud::Speech::V1::RecognitionConfig]
169
+ # *Required* Provides information to the recognizer that specifies how to
170
+ # process the request.
171
+ # @param audio [Google::Cloud::Speech::V1::RecognitionAudio]
172
+ # *Required* The audio data to be recognized.
164
173
  # @param options [Google::Gax::CallOptions]
165
174
  # Overrides the default settings for this call, e.g, timeout,
166
175
  # retries, etc.
167
- # @return [Google::Cloud::Speech::V1beta1::SyncRecognizeResponse]
176
+ # @return [Google::Cloud::Speech::V1::RecognizeResponse]
168
177
  # @raise [Google::Gax::GaxError] if the RPC is aborted.
169
178
  # @example
170
- # require "google/cloud/speech/v1beta1/speech_client"
179
+ # require "google/cloud/speech/v1"
171
180
  #
172
- # AudioEncoding = Google::Cloud::Speech::V1beta1::RecognitionConfig::AudioEncoding
173
- # RecognitionAudio = Google::Cloud::Speech::V1beta1::RecognitionAudio
174
- # RecognitionConfig = Google::Cloud::Speech::V1beta1::RecognitionConfig
175
- # SpeechClient = Google::Cloud::Speech::V1beta1::SpeechClient
181
+ # AudioEncoding = Google::Cloud::Speech::V1::RecognitionConfig::AudioEncoding
182
+ # RecognitionAudio = Google::Cloud::Speech::V1::RecognitionAudio
183
+ # RecognitionConfig = Google::Cloud::Speech::V1::RecognitionConfig
184
+ # SpeechClient = Google::Cloud::Speech::V1::SpeechClient
176
185
  #
177
186
  # speech_client = SpeechClient.new
178
187
  # encoding = AudioEncoding::FLAC
179
- # sample_rate = 44100
188
+ # sample_rate_hertz = 44100
189
+ # language_code = "en-US"
180
190
  # config = RecognitionConfig.new
181
191
  # config.encoding = encoding
182
- # config.sample_rate = sample_rate
192
+ # config.sample_rate_hertz = sample_rate_hertz
193
+ # config.language_code = language_code
183
194
  # uri = "gs://bucket_name/file_name.flac"
184
195
  # audio = RecognitionAudio.new
185
196
  # audio.uri = uri
186
- # response = speech_client.sync_recognize(config, audio)
197
+ # response = speech_client.recognize(config, audio)
187
198
 
188
- def sync_recognize \
199
+ def recognize \
189
200
  config,
190
201
  audio,
191
202
  options: nil
192
- req = Google::Cloud::Speech::V1beta1::SyncRecognizeRequest.new({
203
+ req = Google::Cloud::Speech::V1::RecognizeRequest.new({
193
204
  config: config,
194
205
  audio: audio
195
206
  }.delete_if { |_, v| v.nil? })
196
- @sync_recognize.call(req, options)
207
+ @recognize.call(req, options)
197
208
  end
198
209
 
199
- # Perform asynchronous speech-recognition: receive results via the
210
+ # Performs asynchronous speech recognition: receive results via the
200
211
  # google.longrunning.Operations interface. Returns either an
201
212
  # +Operation.error+ or an +Operation.response+ which contains
202
- # an +AsyncRecognizeResponse+ message.
213
+ # a +LongRunningRecognizeResponse+ message.
203
214
  #
204
- # @param config [Google::Cloud::Speech::V1beta1::RecognitionConfig]
205
- # [Required] The +config+ message provides information to the recognizer
206
- # that specifies how to process the request.
207
- # @param audio [Google::Cloud::Speech::V1beta1::RecognitionAudio]
208
- # [Required] The audio data to be recognized.
215
+ # @param config [Google::Cloud::Speech::V1::RecognitionConfig]
216
+ # *Required* Provides information to the recognizer that specifies how to
217
+ # process the request.
218
+ # @param audio [Google::Cloud::Speech::V1::RecognitionAudio]
219
+ # *Required* The audio data to be recognized.
209
220
  # @param options [Google::Gax::CallOptions]
210
221
  # Overrides the default settings for this call, e.g, timeout,
211
222
  # retries, etc.
212
223
  # @return [Google::Gax::Operation]
213
224
  # @raise [Google::Gax::GaxError] if the RPC is aborted.
214
225
  # @example
215
- # require "google/cloud/speech/v1beta1/speech_client"
226
+ # require "google/cloud/speech/v1"
216
227
  #
217
- # AudioEncoding = Google::Cloud::Speech::V1beta1::RecognitionConfig::AudioEncoding
218
- # RecognitionAudio = Google::Cloud::Speech::V1beta1::RecognitionAudio
219
- # RecognitionConfig = Google::Cloud::Speech::V1beta1::RecognitionConfig
220
- # SpeechClient = Google::Cloud::Speech::V1beta1::SpeechClient
228
+ # AudioEncoding = Google::Cloud::Speech::V1::RecognitionConfig::AudioEncoding
229
+ # RecognitionAudio = Google::Cloud::Speech::V1::RecognitionAudio
230
+ # RecognitionConfig = Google::Cloud::Speech::V1::RecognitionConfig
231
+ # SpeechClient = Google::Cloud::Speech::V1::SpeechClient
221
232
  #
222
233
  # speech_client = SpeechClient.new
223
234
  # encoding = AudioEncoding::FLAC
224
- # sample_rate = 44100
235
+ # sample_rate_hertz = 44100
236
+ # language_code = "en-US"
225
237
  # config = RecognitionConfig.new
226
238
  # config.encoding = encoding
227
- # config.sample_rate = sample_rate
239
+ # config.sample_rate_hertz = sample_rate_hertz
240
+ # config.language_code = language_code
228
241
  # uri = "gs://bucket_name/file_name.flac"
229
242
  # audio = RecognitionAudio.new
230
243
  # audio.uri = uri
231
244
  #
232
245
  # # Register a callback during the method call.
233
- # operation = speech_client.async_recognize(config, audio) do |op|
246
+ # operation = speech_client.long_running_recognize(config, audio) do |op|
234
247
  # raise op.results.message if op.error?
235
248
  # op_results = op.results
236
249
  # # Process the results.
@@ -256,35 +269,35 @@ module Google
256
269
  # # completion.
257
270
  # operation.wait_until_done!
258
271
 
259
- def async_recognize \
272
+ def long_running_recognize \
260
273
  config,
261
274
  audio,
262
275
  options: nil
263
- req = Google::Cloud::Speech::V1beta1::AsyncRecognizeRequest.new({
276
+ req = Google::Cloud::Speech::V1::LongRunningRecognizeRequest.new({
264
277
  config: config,
265
278
  audio: audio
266
279
  }.delete_if { |_, v| v.nil? })
267
280
  operation = Google::Gax::Operation.new(
268
- @async_recognize.call(req, options),
281
+ @long_running_recognize.call(req, options),
269
282
  @operations_client,
270
- Google::Cloud::Speech::V1beta1::AsyncRecognizeResponse,
271
- Google::Cloud::Speech::V1beta1::AsyncRecognizeMetadata,
283
+ Google::Cloud::Speech::V1::LongRunningRecognizeResponse,
284
+ Google::Cloud::Speech::V1::LongRunningRecognizeMetadata,
272
285
  call_options: options
273
286
  )
274
287
  operation.on_done { |operation| yield(operation) } if block_given?
275
288
  operation
276
289
  end
277
290
 
278
- # Perform bidirectional streaming speech-recognition: receive results while
291
+ # Performs bidirectional streaming speech recognition: receive results while
279
292
  # sending audio. This method is only available via the gRPC API (not REST).
280
293
  #
281
- # @param reqs [Enumerable<Google::Cloud::Speech::V1beta1::StreamingRecognizeRequest>]
294
+ # @param reqs [Enumerable<Google::Cloud::Speech::V1::StreamingRecognizeRequest>]
282
295
  # The input requests.
283
296
  # @param options [Google::Gax::CallOptions]
284
297
  # Overrides the default settings for this call, e.g, timeout,
285
298
  # retries, etc.
286
- # @return [Enumerable<Google::Cloud::Speech::V1beta1::StreamingRecognizeResponse>]
287
- # An enumerable of Google::Cloud::Speech::V1beta1::StreamingRecognizeResponse instances.
299
+ # @return [Enumerable<Google::Cloud::Speech::V1::StreamingRecognizeResponse>]
300
+ # An enumerable of Google::Cloud::Speech::V1::StreamingRecognizeResponse instances.
288
301
  #
289
302
  # @raise [Google::Gax::GaxError] if the RPC is aborted.
290
303
  #
@@ -294,10 +307,10 @@ module Google
294
307
  # This method interface might change in the future.
295
308
  #
296
309
  # @example
297
- # require "google/cloud/speech/v1beta1/speech_client"
310
+ # require "google/cloud/speech/v1"
298
311
  #
299
- # SpeechClient = Google::Cloud::Speech::V1beta1::SpeechClient
300
- # StreamingRecognizeRequest = Google::Cloud::Speech::V1beta1::StreamingRecognizeRequest
312
+ # SpeechClient = Google::Cloud::Speech::V1::SpeechClient
313
+ # StreamingRecognizeRequest = Google::Cloud::Speech::V1::StreamingRecognizeRequest
301
314
  #
302
315
  # speech_client = SpeechClient.new
303
316
  # request = StreamingRecognizeRequest.new
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "interfaces": {
3
- "google.cloud.speech.v1beta1.Speech": {
3
+ "google.cloud.speech.v1.Speech": {
4
4
  "retry_codes": {
5
5
  "idempotent": [
6
6
  "DEADLINE_EXCEEDED",
@@ -15,26 +15,26 @@
15
15
  "initial_retry_delay_millis": 100,
16
16
  "retry_delay_multiplier": 1.3,
17
17
  "max_retry_delay_millis": 60000,
18
- "initial_rpc_timeout_millis": 60000,
18
+ "initial_rpc_timeout_millis": 190000,
19
19
  "rpc_timeout_multiplier": 1.0,
20
- "max_rpc_timeout_millis": 60000,
20
+ "max_rpc_timeout_millis": 190000,
21
21
  "total_timeout_millis": 600000
22
22
  }
23
23
  },
24
24
  "methods": {
25
- "SyncRecognize": {
26
- "timeout_millis": 60000,
25
+ "Recognize": {
26
+ "timeout_millis": 190000,
27
27
  "retry_codes_name": "idempotent",
28
28
  "retry_params_name": "default"
29
29
  },
30
- "AsyncRecognize": {
30
+ "LongRunningRecognize": {
31
31
  "timeout_millis": 60000,
32
- "retry_codes_name": "idempotent",
32
+ "retry_codes_name": "non_idempotent",
33
33
  "retry_params_name": "default"
34
34
  },
35
35
  "StreamingRecognize": {
36
36
  "timeout_millis": 190000,
37
- "retry_codes_name": "non_idempotent",
37
+ "retry_codes_name": "idempotent",
38
38
  "retry_params_name": "default"
39
39
  }
40
40
  }
@@ -16,7 +16,7 @@
16
16
  module Google
17
17
  module Cloud
18
18
  module Speech
19
- VERSION = "0.23.0"
19
+ VERSION = "0.24.0"
20
20
  end
21
21
  end
22
22
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: google-cloud-speech
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.23.0
4
+ version: 0.24.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Moore
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-04-01 00:00:00.000000000 Z
12
+ date: 2017-04-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: google-cloud-core
@@ -31,14 +31,14 @@ dependencies:
31
31
  requirements:
32
32
  - - "~>"
33
33
  - !ruby/object:Gem::Version
34
- version: 0.8.1
34
+ version: 0.8.2
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - "~>"
40
40
  - !ruby/object:Gem::Version
41
- version: 0.8.1
41
+ version: 0.8.2
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: minitest
44
44
  requirement: !ruby/object:Gem::Requirement
@@ -180,19 +180,19 @@ files:
180
180
  - lib/google/cloud/speech.rb
181
181
  - lib/google/cloud/speech/audio.rb
182
182
  - lib/google/cloud/speech/credentials.rb
183
- - lib/google/cloud/speech/job.rb
183
+ - lib/google/cloud/speech/operation.rb
184
184
  - lib/google/cloud/speech/project.rb
185
185
  - lib/google/cloud/speech/result.rb
186
186
  - lib/google/cloud/speech/service.rb
187
187
  - lib/google/cloud/speech/stream.rb
188
- - lib/google/cloud/speech/v1beta1.rb
189
- - lib/google/cloud/speech/v1beta1/cloud_speech_pb.rb
190
- - lib/google/cloud/speech/v1beta1/cloud_speech_services_pb.rb
191
- - lib/google/cloud/speech/v1beta1/doc/google/cloud/speech/v1beta1/cloud_speech.rb
192
- - lib/google/cloud/speech/v1beta1/doc/google/protobuf/any.rb
193
- - lib/google/cloud/speech/v1beta1/doc/google/rpc/status.rb
194
- - lib/google/cloud/speech/v1beta1/speech_client.rb
195
- - lib/google/cloud/speech/v1beta1/speech_client_config.json
188
+ - lib/google/cloud/speech/v1.rb
189
+ - lib/google/cloud/speech/v1/cloud_speech_pb.rb
190
+ - lib/google/cloud/speech/v1/cloud_speech_services_pb.rb
191
+ - lib/google/cloud/speech/v1/doc/google/cloud/speech/v1/cloud_speech.rb
192
+ - lib/google/cloud/speech/v1/doc/google/protobuf/any.rb
193
+ - lib/google/cloud/speech/v1/doc/google/rpc/status.rb
194
+ - lib/google/cloud/speech/v1/speech_client.rb
195
+ - lib/google/cloud/speech/v1/speech_client_config.json
196
196
  - lib/google/cloud/speech/version.rb
197
197
  homepage: http://googlecloudplatform.github.io/google-cloud-ruby/
198
198
  licenses:
@@ -1,159 +0,0 @@
1
- # Copyright 2016 Google Inc. All rights reserved.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
-
16
- require "google/cloud/speech/v1beta1"
17
-
18
- module Google
19
- module Cloud
20
- module Speech
21
- ##
22
- # # Job
23
- #
24
- # A resource represents the long-running, asynchronous processing of a
25
- # speech-recognition operation. The job can be refreshed to retrieve
26
- # recognition results once the audio data has been processed.
27
- #
28
- # See {Project#recognize_job} and {Audio#recognize_job}.
29
- #
30
- # @see https://cloud.google.com/speech/docs/basics#async-responses
31
- # Asynchronous Speech API Responses
32
- # @see https://cloud.google.com/speech/reference/rpc/google.longrunning#google.longrunning.Operations
33
- # Long-running Operation
34
- #
35
- # @example
36
- # require "google/cloud/speech"
37
- #
38
- # speech = Google::Cloud::Speech.new
39
- #
40
- # job = speech.recognize_job "path/to/audio.raw",
41
- # encoding: :raw, sample_rate: 16000
42
- #
43
- # job.done? #=> false
44
- # job.reload! # API call
45
- # job.done? #=> true
46
- # results = job.results
47
- #
48
- class Job
49
- ##
50
- # @private The Google::Gax::Operation gRPC object.
51
- attr_accessor :grpc
52
-
53
- ##
54
- # @private Creates a new Job instance.
55
- def initialize
56
- @grpc = nil
57
- end
58
-
59
- ##
60
- # A speech recognition result corresponding to a portion of the audio.
61
- #
62
- # @return [Array<Result>] The transcribed text of audio recognized. If
63
- # the job is not done this will return `nil`.
64
- #
65
- # @example
66
- # require "google/cloud/speech"
67
- #
68
- # speech = Google::Cloud::Speech.new
69
- #
70
- # job = speech.recognize_job "path/to/audio.raw",
71
- # encoding: :raw, sample_rate: 16000
72
- #
73
- # job.done? #=> true
74
- # results = job.results
75
- #
76
- def results
77
- return nil unless @grpc.response?
78
- @grpc.response.results.map do |result_grpc|
79
- Result.from_grpc result_grpc
80
- end
81
- # TODO: Ensure we are raising the proper error
82
- # TODO: Ensure GRPC behavior here, is an error already raised?
83
- # raise @grpc.error
84
- end
85
-
86
- ##
87
- # Checks if the speech-recognition processing of the audio data is
88
- # complete.
89
- #
90
- # @return [boolean] `true` when complete, `false` otherwise.
91
- #
92
- # @example
93
- # require "google/cloud/speech"
94
- #
95
- # speech = Google::Cloud::Speech.new
96
- #
97
- # job = speech.recognize_job "path/to/audio.raw",
98
- # encoding: :raw, sample_rate: 16000
99
- #
100
- # job.done? #=> false
101
- #
102
- def done?
103
- @grpc.done?
104
- end
105
-
106
- ##
107
- # Reloads the job with current data from the long-running, asynchronous
108
- # processing of a speech-recognition operation.
109
- #
110
- # @example
111
- # require "google/cloud/speech"
112
- #
113
- # speech = Google::Cloud::Speech.new
114
- #
115
- # job = speech.recognize_job "path/to/audio.raw",
116
- # encoding: :raw, sample_rate: 16000
117
- #
118
- # job.done? #=> false
119
- # job.reload! # API call
120
- # job.done? #=> true
121
- #
122
- def reload!
123
- @grpc.reload!
124
- self
125
- end
126
- alias_method :refresh!, :reload!
127
-
128
- ##
129
- # Reloads the job until the operation is complete. The delay between
130
- # reloads will incrementally increase.
131
- #
132
- # @example
133
- # require "google/cloud/speech"
134
- #
135
- # speech = Google::Cloud::Speech.new
136
- #
137
- # job = speech.recognize_job "path/to/audio.raw",
138
- # encoding: :raw, sample_rate: 16000
139
- #
140
- # job.done? #=> false
141
- # job.wait_until_done!
142
- # job.done? #=> true
143
- #
144
- def wait_until_done!
145
- @grpc.wait_until_done!
146
- end
147
-
148
- ##
149
- # @private New Result::Job from a Google::Longrunning::Operation
150
- # object.
151
- def self.from_grpc grpc
152
- new.tap do |job|
153
- job.instance_variable_set :@grpc, grpc
154
- end
155
- end
156
- end
157
- end
158
- end
159
- end