google-apis-rapidmigrationassessment_v1 0.1.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.
@@ -0,0 +1,612 @@
1
+ # Copyright 2020 Google LLC
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
+ require 'date'
16
+ require 'google/apis/core/base_service'
17
+ require 'google/apis/core/json_representation'
18
+ require 'google/apis/core/hashable'
19
+ require 'google/apis/errors'
20
+
21
+ module Google
22
+ module Apis
23
+ module RapidmigrationassessmentV1
24
+
25
+ # Message describing an Annotation
26
+ class Annotation
27
+ include Google::Apis::Core::Hashable
28
+
29
+ # Output only. Create time stamp.
30
+ # Corresponds to the JSON property `createTime`
31
+ # @return [String]
32
+ attr_accessor :create_time
33
+
34
+ # Labels as key value pairs.
35
+ # Corresponds to the JSON property `labels`
36
+ # @return [Hash<String,String>]
37
+ attr_accessor :labels
38
+
39
+ # name of resource.
40
+ # Corresponds to the JSON property `name`
41
+ # @return [String]
42
+ attr_accessor :name
43
+
44
+ # Type of an annotation.
45
+ # Corresponds to the JSON property `type`
46
+ # @return [String]
47
+ attr_accessor :type
48
+
49
+ # Output only. Update time stamp.
50
+ # Corresponds to the JSON property `updateTime`
51
+ # @return [String]
52
+ attr_accessor :update_time
53
+
54
+ def initialize(**args)
55
+ update!(**args)
56
+ end
57
+
58
+ # Update properties of this object
59
+ def update!(**args)
60
+ @create_time = args[:create_time] if args.key?(:create_time)
61
+ @labels = args[:labels] if args.key?(:labels)
62
+ @name = args[:name] if args.key?(:name)
63
+ @type = args[:type] if args.key?(:type)
64
+ @update_time = args[:update_time] if args.key?(:update_time)
65
+ end
66
+ end
67
+
68
+ # The request message for Operations.CancelOperation.
69
+ class CancelOperationRequest
70
+ include Google::Apis::Core::Hashable
71
+
72
+ def initialize(**args)
73
+ update!(**args)
74
+ end
75
+
76
+ # Update properties of this object
77
+ def update!(**args)
78
+ end
79
+ end
80
+
81
+ # Message describing Collector object.
82
+ class Collector
83
+ include Google::Apis::Core::Hashable
84
+
85
+ # Output only. Store cloud storage bucket name (which is a guid) created with
86
+ # this Collector.
87
+ # Corresponds to the JSON property `bucket`
88
+ # @return [String]
89
+ attr_accessor :bucket
90
+
91
+ # Output only. Client version.
92
+ # Corresponds to the JSON property `clientVersion`
93
+ # @return [String]
94
+ attr_accessor :client_version
95
+
96
+ # How many days to collect data.
97
+ # Corresponds to the JSON property `collectionDays`
98
+ # @return [Fixnum]
99
+ attr_accessor :collection_days
100
+
101
+ # Output only. Create time stamp.
102
+ # Corresponds to the JSON property `createTime`
103
+ # @return [String]
104
+ attr_accessor :create_time
105
+
106
+ # User specified description of the Collector.
107
+ # Corresponds to the JSON property `description`
108
+ # @return [String]
109
+ attr_accessor :description
110
+
111
+ # User specified name of the Collector.
112
+ # Corresponds to the JSON property `displayName`
113
+ # @return [String]
114
+ attr_accessor :display_name
115
+
116
+ # Uri for EULA (End User License Agreement) from customer.
117
+ # Corresponds to the JSON property `eulaUri`
118
+ # @return [String]
119
+ attr_accessor :eula_uri
120
+
121
+ # User specified expected asset count.
122
+ # Corresponds to the JSON property `expectedAssetCount`
123
+ # @return [Fixnum]
124
+ attr_accessor :expected_asset_count
125
+
126
+ # Message describing a MC Source of type Guest OS Scan.
127
+ # Corresponds to the JSON property `guestOsScan`
128
+ # @return [Google::Apis::RapidmigrationassessmentV1::GuestOsScan]
129
+ attr_accessor :guest_os_scan
130
+
131
+ # Labels as key value pairs.
132
+ # Corresponds to the JSON property `labels`
133
+ # @return [Hash<String,String>]
134
+ attr_accessor :labels
135
+
136
+ # name of resource.
137
+ # Corresponds to the JSON property `name`
138
+ # @return [String]
139
+ attr_accessor :name
140
+
141
+ # Service Account email used to ingest data to this Collector.
142
+ # Corresponds to the JSON property `serviceAccount`
143
+ # @return [String]
144
+ attr_accessor :service_account
145
+
146
+ # Output only. State of the Collector.
147
+ # Corresponds to the JSON property `state`
148
+ # @return [String]
149
+ attr_accessor :state
150
+
151
+ # Output only. Update time stamp.
152
+ # Corresponds to the JSON property `updateTime`
153
+ # @return [String]
154
+ attr_accessor :update_time
155
+
156
+ # Message describing a MC Source of type VSphere Scan.
157
+ # Corresponds to the JSON property `vsphereScan`
158
+ # @return [Google::Apis::RapidmigrationassessmentV1::VSphereScan]
159
+ attr_accessor :vsphere_scan
160
+
161
+ def initialize(**args)
162
+ update!(**args)
163
+ end
164
+
165
+ # Update properties of this object
166
+ def update!(**args)
167
+ @bucket = args[:bucket] if args.key?(:bucket)
168
+ @client_version = args[:client_version] if args.key?(:client_version)
169
+ @collection_days = args[:collection_days] if args.key?(:collection_days)
170
+ @create_time = args[:create_time] if args.key?(:create_time)
171
+ @description = args[:description] if args.key?(:description)
172
+ @display_name = args[:display_name] if args.key?(:display_name)
173
+ @eula_uri = args[:eula_uri] if args.key?(:eula_uri)
174
+ @expected_asset_count = args[:expected_asset_count] if args.key?(:expected_asset_count)
175
+ @guest_os_scan = args[:guest_os_scan] if args.key?(:guest_os_scan)
176
+ @labels = args[:labels] if args.key?(:labels)
177
+ @name = args[:name] if args.key?(:name)
178
+ @service_account = args[:service_account] if args.key?(:service_account)
179
+ @state = args[:state] if args.key?(:state)
180
+ @update_time = args[:update_time] if args.key?(:update_time)
181
+ @vsphere_scan = args[:vsphere_scan] if args.key?(:vsphere_scan)
182
+ end
183
+ end
184
+
185
+ # A generic empty message that you can re-use to avoid defining duplicated empty
186
+ # messages in your APIs. A typical example is to use it as the request or the
187
+ # response type of an API method. For instance: service Foo ` rpc Bar(google.
188
+ # protobuf.Empty) returns (google.protobuf.Empty); `
189
+ class Empty
190
+ include Google::Apis::Core::Hashable
191
+
192
+ def initialize(**args)
193
+ update!(**args)
194
+ end
195
+
196
+ # Update properties of this object
197
+ def update!(**args)
198
+ end
199
+ end
200
+
201
+ # Message describing a MC Source of type Guest OS Scan.
202
+ class GuestOsScan
203
+ include Google::Apis::Core::Hashable
204
+
205
+ # reference to the corresponding Guest OS Scan in MC Source.
206
+ # Corresponds to the JSON property `coreSource`
207
+ # @return [String]
208
+ attr_accessor :core_source
209
+
210
+ def initialize(**args)
211
+ update!(**args)
212
+ end
213
+
214
+ # Update properties of this object
215
+ def update!(**args)
216
+ @core_source = args[:core_source] if args.key?(:core_source)
217
+ end
218
+ end
219
+
220
+ # Message for response to listing Collectors.
221
+ class ListCollectorsResponse
222
+ include Google::Apis::Core::Hashable
223
+
224
+ # The list of Collectors.
225
+ # Corresponds to the JSON property `collectors`
226
+ # @return [Array<Google::Apis::RapidmigrationassessmentV1::Collector>]
227
+ attr_accessor :collectors
228
+
229
+ # A token identifying a page of results the server should return.
230
+ # Corresponds to the JSON property `nextPageToken`
231
+ # @return [String]
232
+ attr_accessor :next_page_token
233
+
234
+ # Locations that could not be reached.
235
+ # Corresponds to the JSON property `unreachable`
236
+ # @return [Array<String>]
237
+ attr_accessor :unreachable
238
+
239
+ def initialize(**args)
240
+ update!(**args)
241
+ end
242
+
243
+ # Update properties of this object
244
+ def update!(**args)
245
+ @collectors = args[:collectors] if args.key?(:collectors)
246
+ @next_page_token = args[:next_page_token] if args.key?(:next_page_token)
247
+ @unreachable = args[:unreachable] if args.key?(:unreachable)
248
+ end
249
+ end
250
+
251
+ # The response message for Locations.ListLocations.
252
+ class ListLocationsResponse
253
+ include Google::Apis::Core::Hashable
254
+
255
+ # A list of locations that matches the specified filter in the request.
256
+ # Corresponds to the JSON property `locations`
257
+ # @return [Array<Google::Apis::RapidmigrationassessmentV1::Location>]
258
+ attr_accessor :locations
259
+
260
+ # The standard List next-page token.
261
+ # Corresponds to the JSON property `nextPageToken`
262
+ # @return [String]
263
+ attr_accessor :next_page_token
264
+
265
+ def initialize(**args)
266
+ update!(**args)
267
+ end
268
+
269
+ # Update properties of this object
270
+ def update!(**args)
271
+ @locations = args[:locations] if args.key?(:locations)
272
+ @next_page_token = args[:next_page_token] if args.key?(:next_page_token)
273
+ end
274
+ end
275
+
276
+ # The response message for Operations.ListOperations.
277
+ class ListOperationsResponse
278
+ include Google::Apis::Core::Hashable
279
+
280
+ # The standard List next-page token.
281
+ # Corresponds to the JSON property `nextPageToken`
282
+ # @return [String]
283
+ attr_accessor :next_page_token
284
+
285
+ # A list of operations that matches the specified filter in the request.
286
+ # Corresponds to the JSON property `operations`
287
+ # @return [Array<Google::Apis::RapidmigrationassessmentV1::Operation>]
288
+ attr_accessor :operations
289
+
290
+ def initialize(**args)
291
+ update!(**args)
292
+ end
293
+
294
+ # Update properties of this object
295
+ def update!(**args)
296
+ @next_page_token = args[:next_page_token] if args.key?(:next_page_token)
297
+ @operations = args[:operations] if args.key?(:operations)
298
+ end
299
+ end
300
+
301
+ # A resource that represents a Google Cloud location.
302
+ class Location
303
+ include Google::Apis::Core::Hashable
304
+
305
+ # The friendly name for this location, typically a nearby city name. For example,
306
+ # "Tokyo".
307
+ # Corresponds to the JSON property `displayName`
308
+ # @return [String]
309
+ attr_accessor :display_name
310
+
311
+ # Cross-service attributes for the location. For example `"cloud.googleapis.com/
312
+ # region": "us-east1"`
313
+ # Corresponds to the JSON property `labels`
314
+ # @return [Hash<String,String>]
315
+ attr_accessor :labels
316
+
317
+ # The canonical id for this location. For example: `"us-east1"`.
318
+ # Corresponds to the JSON property `locationId`
319
+ # @return [String]
320
+ attr_accessor :location_id
321
+
322
+ # Service-specific metadata. For example the available capacity at the given
323
+ # location.
324
+ # Corresponds to the JSON property `metadata`
325
+ # @return [Hash<String,Object>]
326
+ attr_accessor :metadata
327
+
328
+ # Resource name for the location, which may vary between implementations. For
329
+ # example: `"projects/example-project/locations/us-east1"`
330
+ # Corresponds to the JSON property `name`
331
+ # @return [String]
332
+ attr_accessor :name
333
+
334
+ def initialize(**args)
335
+ update!(**args)
336
+ end
337
+
338
+ # Update properties of this object
339
+ def update!(**args)
340
+ @display_name = args[:display_name] if args.key?(:display_name)
341
+ @labels = args[:labels] if args.key?(:labels)
342
+ @location_id = args[:location_id] if args.key?(:location_id)
343
+ @metadata = args[:metadata] if args.key?(:metadata)
344
+ @name = args[:name] if args.key?(:name)
345
+ end
346
+ end
347
+
348
+ # This resource represents a long-running operation that is the result of a
349
+ # network API call.
350
+ class Operation
351
+ include Google::Apis::Core::Hashable
352
+
353
+ # If the value is `false`, it means the operation is still in progress. If `true`
354
+ # , the operation is completed, and either `error` or `response` is available.
355
+ # Corresponds to the JSON property `done`
356
+ # @return [Boolean]
357
+ attr_accessor :done
358
+ alias_method :done?, :done
359
+
360
+ # The `Status` type defines a logical error model that is suitable for different
361
+ # programming environments, including REST APIs and RPC APIs. It is used by [
362
+ # gRPC](https://github.com/grpc). Each `Status` message contains three pieces of
363
+ # data: error code, error message, and error details. You can find out more
364
+ # about this error model and how to work with it in the [API Design Guide](https:
365
+ # //cloud.google.com/apis/design/errors).
366
+ # Corresponds to the JSON property `error`
367
+ # @return [Google::Apis::RapidmigrationassessmentV1::Status]
368
+ attr_accessor :error
369
+
370
+ # Service-specific metadata associated with the operation. It typically contains
371
+ # progress information and common metadata such as create time. Some services
372
+ # might not provide such metadata. Any method that returns a long-running
373
+ # operation should document the metadata type, if any.
374
+ # Corresponds to the JSON property `metadata`
375
+ # @return [Hash<String,Object>]
376
+ attr_accessor :metadata
377
+
378
+ # The server-assigned name, which is only unique within the same service that
379
+ # originally returns it. If you use the default HTTP mapping, the `name` should
380
+ # be a resource name ending with `operations/`unique_id``.
381
+ # Corresponds to the JSON property `name`
382
+ # @return [String]
383
+ attr_accessor :name
384
+
385
+ # The normal, successful response of the operation. If the original method
386
+ # returns no data on success, such as `Delete`, the response is `google.protobuf.
387
+ # Empty`. If the original method is standard `Get`/`Create`/`Update`, the
388
+ # response should be the resource. For other methods, the response should have
389
+ # the type `XxxResponse`, where `Xxx` is the original method name. For example,
390
+ # if the original method name is `TakeSnapshot()`, the inferred response type is
391
+ # `TakeSnapshotResponse`.
392
+ # Corresponds to the JSON property `response`
393
+ # @return [Hash<String,Object>]
394
+ attr_accessor :response
395
+
396
+ def initialize(**args)
397
+ update!(**args)
398
+ end
399
+
400
+ # Update properties of this object
401
+ def update!(**args)
402
+ @done = args[:done] if args.key?(:done)
403
+ @error = args[:error] if args.key?(:error)
404
+ @metadata = args[:metadata] if args.key?(:metadata)
405
+ @name = args[:name] if args.key?(:name)
406
+ @response = args[:response] if args.key?(:response)
407
+ end
408
+ end
409
+
410
+ # Represents the metadata of the long-running operation.
411
+ class OperationMetadata
412
+ include Google::Apis::Core::Hashable
413
+
414
+ # Output only. API version used to start the operation.
415
+ # Corresponds to the JSON property `apiVersion`
416
+ # @return [String]
417
+ attr_accessor :api_version
418
+
419
+ # Output only. The time the operation was created.
420
+ # Corresponds to the JSON property `createTime`
421
+ # @return [String]
422
+ attr_accessor :create_time
423
+
424
+ # Output only. The time the operation finished running.
425
+ # Corresponds to the JSON property `endTime`
426
+ # @return [String]
427
+ attr_accessor :end_time
428
+
429
+ # Output only. Identifies whether the user has requested cancellation of the
430
+ # operation. Operations that have successfully been cancelled have Operation.
431
+ # error value with a google.rpc.Status.code of 1, corresponding to `Code.
432
+ # CANCELLED`.
433
+ # Corresponds to the JSON property `requestedCancellation`
434
+ # @return [Boolean]
435
+ attr_accessor :requested_cancellation
436
+ alias_method :requested_cancellation?, :requested_cancellation
437
+
438
+ # Output only. Human-readable status of the operation, if any.
439
+ # Corresponds to the JSON property `statusMessage`
440
+ # @return [String]
441
+ attr_accessor :status_message
442
+
443
+ # Output only. Server-defined resource path for the target of the operation.
444
+ # Corresponds to the JSON property `target`
445
+ # @return [String]
446
+ attr_accessor :target
447
+
448
+ # Output only. Name of the verb executed by the operation.
449
+ # Corresponds to the JSON property `verb`
450
+ # @return [String]
451
+ attr_accessor :verb
452
+
453
+ def initialize(**args)
454
+ update!(**args)
455
+ end
456
+
457
+ # Update properties of this object
458
+ def update!(**args)
459
+ @api_version = args[:api_version] if args.key?(:api_version)
460
+ @create_time = args[:create_time] if args.key?(:create_time)
461
+ @end_time = args[:end_time] if args.key?(:end_time)
462
+ @requested_cancellation = args[:requested_cancellation] if args.key?(:requested_cancellation)
463
+ @status_message = args[:status_message] if args.key?(:status_message)
464
+ @target = args[:target] if args.key?(:target)
465
+ @verb = args[:verb] if args.key?(:verb)
466
+ end
467
+ end
468
+
469
+ # Message for pausing a Collector.
470
+ class PauseCollectorRequest
471
+ include Google::Apis::Core::Hashable
472
+
473
+ # Optional. An optional request ID to identify requests. Specify a unique
474
+ # request ID so that if you must retry your request, the server will know to
475
+ # ignore the request if it has already been completed. The server will guarantee
476
+ # that for at least 60 minutes after the first request. For example, consider a
477
+ # situation where you make an initial request and the request times out. If you
478
+ # make the request again with the same request ID, the server can check if
479
+ # original operation with the same request ID was received, and if so, will
480
+ # ignore the second request. This prevents clients from accidentally creating
481
+ # duplicate commitments. The request ID must be a valid UUID with the exception
482
+ # that zero UUID is not supported (00000000-0000-0000-0000-000000000000).
483
+ # Corresponds to the JSON property `requestId`
484
+ # @return [String]
485
+ attr_accessor :request_id
486
+
487
+ def initialize(**args)
488
+ update!(**args)
489
+ end
490
+
491
+ # Update properties of this object
492
+ def update!(**args)
493
+ @request_id = args[:request_id] if args.key?(:request_id)
494
+ end
495
+ end
496
+
497
+ # Message for registering a Collector.
498
+ class RegisterCollectorRequest
499
+ include Google::Apis::Core::Hashable
500
+
501
+ # Optional. An optional request ID to identify requests. Specify a unique
502
+ # request ID so that if you must retry your request, the server will know to
503
+ # ignore the request if it has already been completed. The server will guarantee
504
+ # that for at least 60 minutes after the first request. For example, consider a
505
+ # situation where you make an initial request and the request times out. If you
506
+ # make the request again with the same request ID, the server can check if
507
+ # original operation with the same request ID was received, and if so, will
508
+ # ignore the second request. This prevents clients from accidentally creating
509
+ # duplicate commitments. The request ID must be a valid UUID with the exception
510
+ # that zero UUID is not supported (00000000-0000-0000-0000-000000000000).
511
+ # Corresponds to the JSON property `requestId`
512
+ # @return [String]
513
+ attr_accessor :request_id
514
+
515
+ def initialize(**args)
516
+ update!(**args)
517
+ end
518
+
519
+ # Update properties of this object
520
+ def update!(**args)
521
+ @request_id = args[:request_id] if args.key?(:request_id)
522
+ end
523
+ end
524
+
525
+ # Message for resuming a Collector.
526
+ class ResumeCollectorRequest
527
+ include Google::Apis::Core::Hashable
528
+
529
+ # Optional. An optional request ID to identify requests. Specify a unique
530
+ # request ID so that if you must retry your request, the server will know to
531
+ # ignore the request if it has already been completed. The server will guarantee
532
+ # that for at least 60 minutes after the first request. For example, consider a
533
+ # situation where you make an initial request and the request times out. If you
534
+ # make the request again with the same request ID, the server can check if
535
+ # original operation with the same request ID was received, and if so, will
536
+ # ignore the second request. This prevents clients from accidentally creating
537
+ # duplicate commitments. The request ID must be a valid UUID with the exception
538
+ # that zero UUID is not supported (00000000-0000-0000-0000-000000000000).
539
+ # Corresponds to the JSON property `requestId`
540
+ # @return [String]
541
+ attr_accessor :request_id
542
+
543
+ def initialize(**args)
544
+ update!(**args)
545
+ end
546
+
547
+ # Update properties of this object
548
+ def update!(**args)
549
+ @request_id = args[:request_id] if args.key?(:request_id)
550
+ end
551
+ end
552
+
553
+ # The `Status` type defines a logical error model that is suitable for different
554
+ # programming environments, including REST APIs and RPC APIs. It is used by [
555
+ # gRPC](https://github.com/grpc). Each `Status` message contains three pieces of
556
+ # data: error code, error message, and error details. You can find out more
557
+ # about this error model and how to work with it in the [API Design Guide](https:
558
+ # //cloud.google.com/apis/design/errors).
559
+ class Status
560
+ include Google::Apis::Core::Hashable
561
+
562
+ # The status code, which should be an enum value of google.rpc.Code.
563
+ # Corresponds to the JSON property `code`
564
+ # @return [Fixnum]
565
+ attr_accessor :code
566
+
567
+ # A list of messages that carry the error details. There is a common set of
568
+ # message types for APIs to use.
569
+ # Corresponds to the JSON property `details`
570
+ # @return [Array<Hash<String,Object>>]
571
+ attr_accessor :details
572
+
573
+ # A developer-facing error message, which should be in English. Any user-facing
574
+ # error message should be localized and sent in the google.rpc.Status.details
575
+ # field, or localized by the client.
576
+ # Corresponds to the JSON property `message`
577
+ # @return [String]
578
+ attr_accessor :message
579
+
580
+ def initialize(**args)
581
+ update!(**args)
582
+ end
583
+
584
+ # Update properties of this object
585
+ def update!(**args)
586
+ @code = args[:code] if args.key?(:code)
587
+ @details = args[:details] if args.key?(:details)
588
+ @message = args[:message] if args.key?(:message)
589
+ end
590
+ end
591
+
592
+ # Message describing a MC Source of type VSphere Scan.
593
+ class VSphereScan
594
+ include Google::Apis::Core::Hashable
595
+
596
+ # reference to the corresponding VSphere Scan in MC Source.
597
+ # Corresponds to the JSON property `coreSource`
598
+ # @return [String]
599
+ attr_accessor :core_source
600
+
601
+ def initialize(**args)
602
+ update!(**args)
603
+ end
604
+
605
+ # Update properties of this object
606
+ def update!(**args)
607
+ @core_source = args[:core_source] if args.key?(:core_source)
608
+ end
609
+ end
610
+ end
611
+ end
612
+ end
@@ -0,0 +1,28 @@
1
+ # Copyright 2020 Google LLC
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
+ module Google
16
+ module Apis
17
+ module RapidmigrationassessmentV1
18
+ # Version of the google-apis-rapidmigrationassessment_v1 gem
19
+ GEM_VERSION = "0.1.0"
20
+
21
+ # Version of the code generator used to generate this client
22
+ GENERATOR_VERSION = "0.12.0"
23
+
24
+ # Revision of the discovery document this client was generated from
25
+ REVISION = "20230824"
26
+ end
27
+ end
28
+ end