google-cloud-firestore-admin-v1 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +12 -0
  3. data/AUTHENTICATION.md +169 -0
  4. data/LICENSE.md +203 -0
  5. data/README.md +75 -0
  6. data/lib/google-cloud-firestore-admin-v1.rb +21 -0
  7. data/lib/google/cloud/firestore/admin/v1.rb +37 -0
  8. data/lib/google/cloud/firestore/admin/v1/firestore_admin.rb +53 -0
  9. data/lib/google/cloud/firestore/admin/v1/firestore_admin/client.rb +1105 -0
  10. data/lib/google/cloud/firestore/admin/v1/firestore_admin/credentials.rb +54 -0
  11. data/lib/google/cloud/firestore/admin/v1/firestore_admin/operations.rb +572 -0
  12. data/lib/google/cloud/firestore/admin/v1/firestore_admin/paths.rb +113 -0
  13. data/lib/google/cloud/firestore/admin/v1/version.rb +30 -0
  14. data/lib/google/firestore/admin/v1/field_pb.rb +35 -0
  15. data/lib/google/firestore/admin/v1/firestore_admin_pb.rb +87 -0
  16. data/lib/google/firestore/admin/v1/firestore_admin_services_pb.rb +95 -0
  17. data/lib/google/firestore/admin/v1/index_pb.rb +61 -0
  18. data/lib/google/firestore/admin/v1/location_pb.rb +25 -0
  19. data/lib/google/firestore/admin/v1/operation_pb.rb +93 -0
  20. data/proto_docs/README.md +4 -0
  21. data/proto_docs/google/api/field_behavior.rb +59 -0
  22. data/proto_docs/google/api/resource.rb +247 -0
  23. data/proto_docs/google/firestore/admin/v1/field.rb +98 -0
  24. data/proto_docs/google/firestore/admin/v1/firestore_admin.rb +200 -0
  25. data/proto_docs/google/firestore/admin/v1/index.rb +154 -0
  26. data/proto_docs/google/firestore/admin/v1/location.rb +34 -0
  27. data/proto_docs/google/firestore/admin/v1/operation.rb +222 -0
  28. data/proto_docs/google/longrunning/operations.rb +150 -0
  29. data/proto_docs/google/protobuf/any.rb +138 -0
  30. data/proto_docs/google/protobuf/empty.rb +36 -0
  31. data/proto_docs/google/protobuf/field_mask.rb +229 -0
  32. data/proto_docs/google/protobuf/timestamp.rb +120 -0
  33. data/proto_docs/google/rpc/status.rb +46 -0
  34. data/proto_docs/google/type/latlng.rb +38 -0
  35. metadata +216 -0
@@ -0,0 +1,113 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2020 Google LLC
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # https://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ # Auto-generated by gapic-generator-ruby. DO NOT EDIT!
18
+
19
+
20
+ module Google
21
+ module Cloud
22
+ module Firestore
23
+ module Admin
24
+ module V1
25
+ module FirestoreAdmin
26
+ # Path helper methods for the FirestoreAdmin API.
27
+ module Paths
28
+ ##
29
+ # Create a fully-qualified CollectionGroup resource string.
30
+ #
31
+ # The resource will be in the following format:
32
+ #
33
+ # `projects/{project}/databases/{database}/collectionGroups/{collection}`
34
+ #
35
+ # @param project [String]
36
+ # @param database [String]
37
+ # @param collection [String]
38
+ #
39
+ # @return [::String]
40
+ def collection_group_path project:, database:, collection:
41
+ raise ::ArgumentError, "project cannot contain /" if project.to_s.include? "/"
42
+ raise ::ArgumentError, "database cannot contain /" if database.to_s.include? "/"
43
+
44
+ "projects/#{project}/databases/#{database}/collectionGroups/#{collection}"
45
+ end
46
+
47
+ ##
48
+ # Create a fully-qualified Database resource string.
49
+ #
50
+ # The resource will be in the following format:
51
+ #
52
+ # `projects/{project}/databases/{database}`
53
+ #
54
+ # @param project [String]
55
+ # @param database [String]
56
+ #
57
+ # @return [::String]
58
+ def database_path project:, database:
59
+ raise ::ArgumentError, "project cannot contain /" if project.to_s.include? "/"
60
+
61
+ "projects/#{project}/databases/#{database}"
62
+ end
63
+
64
+ ##
65
+ # Create a fully-qualified Field resource string.
66
+ #
67
+ # The resource will be in the following format:
68
+ #
69
+ # `projects/{project}/databases/{database}/collectionGroups/{collection}/fields/{field}`
70
+ #
71
+ # @param project [String]
72
+ # @param database [String]
73
+ # @param collection [String]
74
+ # @param field [String]
75
+ #
76
+ # @return [::String]
77
+ def field_path project:, database:, collection:, field:
78
+ raise ::ArgumentError, "project cannot contain /" if project.to_s.include? "/"
79
+ raise ::ArgumentError, "database cannot contain /" if database.to_s.include? "/"
80
+ raise ::ArgumentError, "collection cannot contain /" if collection.to_s.include? "/"
81
+
82
+ "projects/#{project}/databases/#{database}/collectionGroups/#{collection}/fields/#{field}"
83
+ end
84
+
85
+ ##
86
+ # Create a fully-qualified Index resource string.
87
+ #
88
+ # The resource will be in the following format:
89
+ #
90
+ # `projects/{project}/databases/{database}/collectionGroups/{collection}/indexes/{index}`
91
+ #
92
+ # @param project [String]
93
+ # @param database [String]
94
+ # @param collection [String]
95
+ # @param index [String]
96
+ #
97
+ # @return [::String]
98
+ def index_path project:, database:, collection:, index:
99
+ raise ::ArgumentError, "project cannot contain /" if project.to_s.include? "/"
100
+ raise ::ArgumentError, "database cannot contain /" if database.to_s.include? "/"
101
+ raise ::ArgumentError, "collection cannot contain /" if collection.to_s.include? "/"
102
+
103
+ "projects/#{project}/databases/#{database}/collectionGroups/#{collection}/indexes/#{index}"
104
+ end
105
+
106
+ extend self
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2020 Google LLC
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # https://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ # Auto-generated by gapic-generator-ruby. DO NOT EDIT!
18
+
19
+
20
+ module Google
21
+ module Cloud
22
+ module Firestore
23
+ module Admin
24
+ module V1
25
+ VERSION = "0.1.0"
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,35 @@
1
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
2
+ # source: google/firestore/admin/v1/field.proto
3
+
4
+ require 'google/protobuf'
5
+
6
+ require 'google/api/resource_pb'
7
+ require 'google/firestore/admin/v1/index_pb'
8
+ require 'google/api/annotations_pb'
9
+ Google::Protobuf::DescriptorPool.generated_pool.build do
10
+ add_file("google/firestore/admin/v1/field.proto", :syntax => :proto3) do
11
+ add_message "google.firestore.admin.v1.Field" do
12
+ optional :name, :string, 1
13
+ optional :index_config, :message, 2, "google.firestore.admin.v1.Field.IndexConfig"
14
+ end
15
+ add_message "google.firestore.admin.v1.Field.IndexConfig" do
16
+ repeated :indexes, :message, 1, "google.firestore.admin.v1.Index"
17
+ optional :uses_ancestor_config, :bool, 2
18
+ optional :ancestor_field, :string, 3
19
+ optional :reverting, :bool, 4
20
+ end
21
+ end
22
+ end
23
+
24
+ module Google
25
+ module Cloud
26
+ module Firestore
27
+ module Admin
28
+ module V1
29
+ Field = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("google.firestore.admin.v1.Field").msgclass
30
+ Field::IndexConfig = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("google.firestore.admin.v1.Field.IndexConfig").msgclass
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,87 @@
1
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
2
+ # source: google/firestore/admin/v1/firestore_admin.proto
3
+
4
+ require 'google/protobuf'
5
+
6
+ require 'google/api/annotations_pb'
7
+ require 'google/api/client_pb'
8
+ require 'google/api/field_behavior_pb'
9
+ require 'google/api/resource_pb'
10
+ require 'google/firestore/admin/v1/field_pb'
11
+ require 'google/firestore/admin/v1/index_pb'
12
+ require 'google/longrunning/operations_pb'
13
+ require 'google/protobuf/empty_pb'
14
+ require 'google/protobuf/field_mask_pb'
15
+ Google::Protobuf::DescriptorPool.generated_pool.build do
16
+ add_file("google/firestore/admin/v1/firestore_admin.proto", :syntax => :proto3) do
17
+ add_message "google.firestore.admin.v1.CreateIndexRequest" do
18
+ optional :parent, :string, 1
19
+ optional :index, :message, 2, "google.firestore.admin.v1.Index"
20
+ end
21
+ add_message "google.firestore.admin.v1.ListIndexesRequest" do
22
+ optional :parent, :string, 1
23
+ optional :filter, :string, 2
24
+ optional :page_size, :int32, 3
25
+ optional :page_token, :string, 4
26
+ end
27
+ add_message "google.firestore.admin.v1.ListIndexesResponse" do
28
+ repeated :indexes, :message, 1, "google.firestore.admin.v1.Index"
29
+ optional :next_page_token, :string, 2
30
+ end
31
+ add_message "google.firestore.admin.v1.GetIndexRequest" do
32
+ optional :name, :string, 1
33
+ end
34
+ add_message "google.firestore.admin.v1.DeleteIndexRequest" do
35
+ optional :name, :string, 1
36
+ end
37
+ add_message "google.firestore.admin.v1.UpdateFieldRequest" do
38
+ optional :field, :message, 1, "google.firestore.admin.v1.Field"
39
+ optional :update_mask, :message, 2, "google.protobuf.FieldMask"
40
+ end
41
+ add_message "google.firestore.admin.v1.GetFieldRequest" do
42
+ optional :name, :string, 1
43
+ end
44
+ add_message "google.firestore.admin.v1.ListFieldsRequest" do
45
+ optional :parent, :string, 1
46
+ optional :filter, :string, 2
47
+ optional :page_size, :int32, 3
48
+ optional :page_token, :string, 4
49
+ end
50
+ add_message "google.firestore.admin.v1.ListFieldsResponse" do
51
+ repeated :fields, :message, 1, "google.firestore.admin.v1.Field"
52
+ optional :next_page_token, :string, 2
53
+ end
54
+ add_message "google.firestore.admin.v1.ExportDocumentsRequest" do
55
+ optional :name, :string, 1
56
+ repeated :collection_ids, :string, 2
57
+ optional :output_uri_prefix, :string, 3
58
+ end
59
+ add_message "google.firestore.admin.v1.ImportDocumentsRequest" do
60
+ optional :name, :string, 1
61
+ repeated :collection_ids, :string, 2
62
+ optional :input_uri_prefix, :string, 3
63
+ end
64
+ end
65
+ end
66
+
67
+ module Google
68
+ module Cloud
69
+ module Firestore
70
+ module Admin
71
+ module V1
72
+ CreateIndexRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("google.firestore.admin.v1.CreateIndexRequest").msgclass
73
+ ListIndexesRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("google.firestore.admin.v1.ListIndexesRequest").msgclass
74
+ ListIndexesResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("google.firestore.admin.v1.ListIndexesResponse").msgclass
75
+ GetIndexRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("google.firestore.admin.v1.GetIndexRequest").msgclass
76
+ DeleteIndexRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("google.firestore.admin.v1.DeleteIndexRequest").msgclass
77
+ UpdateFieldRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("google.firestore.admin.v1.UpdateFieldRequest").msgclass
78
+ GetFieldRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("google.firestore.admin.v1.GetFieldRequest").msgclass
79
+ ListFieldsRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("google.firestore.admin.v1.ListFieldsRequest").msgclass
80
+ ListFieldsResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("google.firestore.admin.v1.ListFieldsResponse").msgclass
81
+ ExportDocumentsRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("google.firestore.admin.v1.ExportDocumentsRequest").msgclass
82
+ ImportDocumentsRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("google.firestore.admin.v1.ImportDocumentsRequest").msgclass
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,95 @@
1
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
2
+ # Source: google/firestore/admin/v1/firestore_admin.proto for package 'Google.Cloud.Firestore.Admin.V1'
3
+ # Original file comments:
4
+ # Copyright 2019 Google LLC.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+ #
19
+
20
+ require 'grpc'
21
+ require 'google/firestore/admin/v1/firestore_admin_pb'
22
+
23
+ module Google
24
+ module Cloud
25
+ module Firestore
26
+ module Admin
27
+ module V1
28
+ module FirestoreAdmin
29
+ # Operations are created by service `FirestoreAdmin`, but are accessed via
30
+ # service `google.longrunning.Operations`.
31
+ class Service
32
+
33
+ include GRPC::GenericService
34
+
35
+ self.marshal_class_method = :encode
36
+ self.unmarshal_class_method = :decode
37
+ self.service_name = 'google.firestore.admin.v1.FirestoreAdmin'
38
+
39
+ # Creates a composite index. This returns a [google.longrunning.Operation][google.longrunning.Operation]
40
+ # which may be used to track the status of the creation. The metadata for
41
+ # the operation will be the type [IndexOperationMetadata][google.firestore.admin.v1.IndexOperationMetadata].
42
+ rpc :CreateIndex, Google::Cloud::Firestore::Admin::V1::CreateIndexRequest, Google::Longrunning::Operation
43
+ # Lists composite indexes.
44
+ rpc :ListIndexes, Google::Cloud::Firestore::Admin::V1::ListIndexesRequest, Google::Cloud::Firestore::Admin::V1::ListIndexesResponse
45
+ # Gets a composite index.
46
+ rpc :GetIndex, Google::Cloud::Firestore::Admin::V1::GetIndexRequest, Google::Cloud::Firestore::Admin::V1::Index
47
+ # Deletes a composite index.
48
+ rpc :DeleteIndex, Google::Cloud::Firestore::Admin::V1::DeleteIndexRequest, Google::Protobuf::Empty
49
+ # Gets the metadata and configuration for a Field.
50
+ rpc :GetField, Google::Cloud::Firestore::Admin::V1::GetFieldRequest, Google::Cloud::Firestore::Admin::V1::Field
51
+ # Updates a field configuration. Currently, field updates apply only to
52
+ # single field index configuration. However, calls to
53
+ # [FirestoreAdmin.UpdateField][google.firestore.admin.v1.FirestoreAdmin.UpdateField] should provide a field mask to avoid
54
+ # changing any configuration that the caller isn't aware of. The field mask
55
+ # should be specified as: `{ paths: "index_config" }`.
56
+ #
57
+ # This call returns a [google.longrunning.Operation][google.longrunning.Operation] which may be used to
58
+ # track the status of the field update. The metadata for
59
+ # the operation will be the type [FieldOperationMetadata][google.firestore.admin.v1.FieldOperationMetadata].
60
+ #
61
+ # To configure the default field settings for the database, use
62
+ # the special `Field` with resource name:
63
+ # `projects/{project_id}/databases/{database_id}/collectionGroups/__default__/fields/*`.
64
+ rpc :UpdateField, Google::Cloud::Firestore::Admin::V1::UpdateFieldRequest, Google::Longrunning::Operation
65
+ # Lists the field configuration and metadata for this database.
66
+ #
67
+ # Currently, [FirestoreAdmin.ListFields][google.firestore.admin.v1.FirestoreAdmin.ListFields] only supports listing fields
68
+ # that have been explicitly overridden. To issue this query, call
69
+ # [FirestoreAdmin.ListFields][google.firestore.admin.v1.FirestoreAdmin.ListFields] with the filter set to
70
+ # `indexConfig.usesAncestorConfig:false`.
71
+ rpc :ListFields, Google::Cloud::Firestore::Admin::V1::ListFieldsRequest, Google::Cloud::Firestore::Admin::V1::ListFieldsResponse
72
+ # Exports a copy of all or a subset of documents from Google Cloud Firestore
73
+ # to another storage system, such as Google Cloud Storage. Recent updates to
74
+ # documents may not be reflected in the export. The export occurs in the
75
+ # background and its progress can be monitored and managed via the
76
+ # Operation resource that is created. The output of an export may only be
77
+ # used once the associated operation is done. If an export operation is
78
+ # cancelled before completion it may leave partial data behind in Google
79
+ # Cloud Storage.
80
+ rpc :ExportDocuments, Google::Cloud::Firestore::Admin::V1::ExportDocumentsRequest, Google::Longrunning::Operation
81
+ # Imports documents into Google Cloud Firestore. Existing documents with the
82
+ # same name are overwritten. The import occurs in the background and its
83
+ # progress can be monitored and managed via the Operation resource that is
84
+ # created. If an ImportDocuments operation is cancelled, it is possible
85
+ # that a subset of the data has already been imported to Cloud Firestore.
86
+ rpc :ImportDocuments, Google::Cloud::Firestore::Admin::V1::ImportDocumentsRequest, Google::Longrunning::Operation
87
+ end
88
+
89
+ Stub = Service.rpc_stub_class
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,61 @@
1
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
2
+ # source: google/firestore/admin/v1/index.proto
3
+
4
+ require 'google/protobuf'
5
+
6
+ require 'google/api/resource_pb'
7
+ require 'google/api/annotations_pb'
8
+ Google::Protobuf::DescriptorPool.generated_pool.build do
9
+ add_file("google/firestore/admin/v1/index.proto", :syntax => :proto3) do
10
+ add_message "google.firestore.admin.v1.Index" do
11
+ optional :name, :string, 1
12
+ optional :query_scope, :enum, 2, "google.firestore.admin.v1.Index.QueryScope"
13
+ repeated :fields, :message, 3, "google.firestore.admin.v1.Index.IndexField"
14
+ optional :state, :enum, 4, "google.firestore.admin.v1.Index.State"
15
+ end
16
+ add_message "google.firestore.admin.v1.Index.IndexField" do
17
+ optional :field_path, :string, 1
18
+ oneof :value_mode do
19
+ optional :order, :enum, 2, "google.firestore.admin.v1.Index.IndexField.Order"
20
+ optional :array_config, :enum, 3, "google.firestore.admin.v1.Index.IndexField.ArrayConfig"
21
+ end
22
+ end
23
+ add_enum "google.firestore.admin.v1.Index.IndexField.Order" do
24
+ value :ORDER_UNSPECIFIED, 0
25
+ value :ASCENDING, 1
26
+ value :DESCENDING, 2
27
+ end
28
+ add_enum "google.firestore.admin.v1.Index.IndexField.ArrayConfig" do
29
+ value :ARRAY_CONFIG_UNSPECIFIED, 0
30
+ value :CONTAINS, 1
31
+ end
32
+ add_enum "google.firestore.admin.v1.Index.QueryScope" do
33
+ value :QUERY_SCOPE_UNSPECIFIED, 0
34
+ value :COLLECTION, 1
35
+ value :COLLECTION_GROUP, 2
36
+ end
37
+ add_enum "google.firestore.admin.v1.Index.State" do
38
+ value :STATE_UNSPECIFIED, 0
39
+ value :CREATING, 1
40
+ value :READY, 2
41
+ value :NEEDS_REPAIR, 3
42
+ end
43
+ end
44
+ end
45
+
46
+ module Google
47
+ module Cloud
48
+ module Firestore
49
+ module Admin
50
+ module V1
51
+ Index = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("google.firestore.admin.v1.Index").msgclass
52
+ Index::IndexField = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("google.firestore.admin.v1.Index.IndexField").msgclass
53
+ Index::IndexField::Order = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("google.firestore.admin.v1.Index.IndexField.Order").enummodule
54
+ Index::IndexField::ArrayConfig = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("google.firestore.admin.v1.Index.IndexField.ArrayConfig").enummodule
55
+ Index::QueryScope = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("google.firestore.admin.v1.Index.QueryScope").enummodule
56
+ Index::State = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("google.firestore.admin.v1.Index.State").enummodule
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,25 @@
1
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
2
+ # source: google/firestore/admin/v1/location.proto
3
+
4
+ require 'google/protobuf'
5
+
6
+ require 'google/type/latlng_pb'
7
+ require 'google/api/annotations_pb'
8
+ Google::Protobuf::DescriptorPool.generated_pool.build do
9
+ add_file("google/firestore/admin/v1/location.proto", :syntax => :proto3) do
10
+ add_message "google.firestore.admin.v1.LocationMetadata" do
11
+ end
12
+ end
13
+ end
14
+
15
+ module Google
16
+ module Cloud
17
+ module Firestore
18
+ module Admin
19
+ module V1
20
+ LocationMetadata = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("google.firestore.admin.v1.LocationMetadata").msgclass
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end