sendgrid-ruby 4.3.3 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +3 -1
- data/CHANGELOG.md +20 -1
- data/README.md +4 -4
- data/USE_CASES.md +5 -5
- data/examples/helpers/mail/example.rb +37 -37
- data/lib/sendgrid-ruby.rb +20 -0
- data/lib/sendgrid/helpers/mail/asm.rb +33 -0
- data/lib/sendgrid/helpers/mail/attachment.rb +63 -0
- data/lib/sendgrid/helpers/mail/bcc_settings.rb +33 -0
- data/lib/sendgrid/helpers/mail/bypass_list_management.rb +43 -0
- data/lib/sendgrid/helpers/mail/category.rb +28 -0
- data/lib/sendgrid/helpers/mail/click_tracking.rb +33 -0
- data/lib/sendgrid/helpers/mail/content.rb +33 -0
- data/lib/sendgrid/helpers/mail/custom_arg.rb +24 -0
- data/lib/sendgrid/helpers/mail/email.rb +33 -0
- data/lib/sendgrid/helpers/mail/footer.rb +43 -0
- data/lib/sendgrid/helpers/mail/ganalytics.rb +74 -0
- data/lib/sendgrid/helpers/mail/header.rb +24 -0
- data/lib/sendgrid/helpers/mail/mail.rb +30 -857
- data/lib/sendgrid/helpers/mail/mail_settings.rb +63 -0
- data/lib/sendgrid/helpers/mail/open_tracking.rb +33 -0
- data/lib/sendgrid/helpers/mail/personalization.rb +75 -0
- data/lib/sendgrid/helpers/mail/section.rb +24 -0
- data/lib/sendgrid/helpers/mail/spam_check.rb +43 -0
- data/lib/sendgrid/helpers/mail/subscription_tracking.rb +53 -0
- data/lib/sendgrid/helpers/mail/substitution.rb +24 -0
- data/lib/sendgrid/helpers/mail/tracking_settings.rb +53 -0
- data/lib/sendgrid/version.rb +1 -1
- data/test/sendgrid/helpers/mail/test_category.rb +27 -0
- data/test/sendgrid/helpers/mail/test_mail.rb +170 -52
- data/test/sendgrid/helpers/mail/test_personalizations.rb +146 -0
- data/test/sendgrid/test_sendgrid-ruby.rb +1 -1
- metadata +27 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a23133f8c4095f9f190145c808636a48bfd7307c
|
4
|
+
data.tar.gz: 0066b643ab7820a2444a8463e2817a9c76826522
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9a493f33a268e47cbbeacb127f8a85fca38dd63da8a4b65522595e8eb44767c93f62711d7d90a52d5289555394e37cf0d261de6bbfeab2dae6df49a4889c0a3d
|
7
|
+
data.tar.gz: c23996c075c861b7aaac71e324c381f05fe5921dc1b07f41f03ac3538a48e0ce34d671ff38e8036a152afe90c0c8e9cbb2332c5856b24267b722b712123e8c6c
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,25 @@
|
|
1
1
|
# Change Log
|
2
2
|
All notable changes to this project will be documented in this file.
|
3
3
|
|
4
|
+
## [5.0.0] - 2017-05-27
|
5
|
+
### BREAKING CHANGE
|
6
|
+
- #108 Fix unexpected `Mail` `#categories`, `#categories=` behavior
|
7
|
+
- Fixed Issue #95 Refactor Mail Helper Array Assignments
|
8
|
+
- `personalization.to` becomes `personalization.add_to()`
|
9
|
+
- `personalization.cc` becomes `personalization.add_cc()`
|
10
|
+
- `personalization.bcc` becomes `personalization.add_bcc()`
|
11
|
+
- `personalization.headers` becomes `personalization.add_header()`
|
12
|
+
- `personalization.substitutions` becomes `personalization.add_substitution()`
|
13
|
+
- `personalization.custom_args` becomes `personalization.add_custom_arg()`
|
14
|
+
- `mail.personalizations` becomes `mail.add_personalization()`
|
15
|
+
- `mail.contents` becomes `mail.add_content()`
|
16
|
+
- `mail.attachments` becomes `mail.attachment()`
|
17
|
+
- `mail.sections` becomes `mail.add_section()`
|
18
|
+
- `mail.headers` becomes `mail.add_header()`
|
19
|
+
- `mail.categories` becomes `mail.add_category()`
|
20
|
+
- `mail.custom_args` becomes `mail.custom_args()`
|
21
|
+
- For a full example of usage, please [see here](https://github.com/sendgrid/sendgrid-ruby/blob/master/examples/helpers/mail/example.rb#L21).
|
22
|
+
|
4
23
|
## [4.3.3] - 2017-5-2
|
5
24
|
### Update
|
6
25
|
- #157: Specify required ruby version as '>= 2.2'
|
@@ -32,7 +51,7 @@ All notable changes to this project will be documented in this file.
|
|
32
51
|
|
33
52
|
## [4.2.0] - 2017-4-10 ##
|
34
53
|
### Added
|
35
|
-
- #148: Set api_key to empty string
|
54
|
+
- #148: Set api_key to empty string
|
36
55
|
- This makes creating an API key for a SendGrid subuser who does not have an API key easier. See #146 for details
|
37
56
|
- Thanks to [Adam Beck](https://github.com/Gwash3189) for the pull request!
|
38
57
|
|
data/README.md
CHANGED
@@ -81,9 +81,9 @@ require 'sendgrid-ruby'
|
|
81
81
|
include SendGrid
|
82
82
|
|
83
83
|
from = Email.new(email: 'test@example.com')
|
84
|
-
subject = 'Hello World from the SendGrid Ruby Library!'
|
85
84
|
to = Email.new(email: 'test@example.com')
|
86
|
-
|
85
|
+
subject = 'Sending with SendGrid is Fun'
|
86
|
+
content = Content.new(type: 'text/plain', value: 'and easy to do anywhere, even with Ruby')
|
87
87
|
mail = Mail.new(from, subject, to, content)
|
88
88
|
|
89
89
|
sg = SendGrid::API.new(api_key: ENV['SENDGRID_API_KEY'])
|
@@ -111,7 +111,7 @@ data = JSON.parse('{
|
|
111
111
|
"email": "test@example.com"
|
112
112
|
}
|
113
113
|
],
|
114
|
-
"subject": "
|
114
|
+
"subject": "Sending with SendGrid is Fun"
|
115
115
|
}
|
116
116
|
],
|
117
117
|
"from": {
|
@@ -120,7 +120,7 @@ data = JSON.parse('{
|
|
120
120
|
"content": [
|
121
121
|
{
|
122
122
|
"type": "text/plain",
|
123
|
-
"value": "
|
123
|
+
"value": "and easy to do anywhere, even with Ruby"
|
124
124
|
}
|
125
125
|
]
|
126
126
|
}')
|
data/USE_CASES.md
CHANGED
@@ -51,11 +51,11 @@ mail = Mail.new
|
|
51
51
|
mail.from = Email.new(email: 'test@example.com')
|
52
52
|
mail.subject = 'I\'m replacing the subject tag'
|
53
53
|
personalization = Personalization.new
|
54
|
-
personalization.
|
55
|
-
personalization.
|
56
|
-
personalization.
|
57
|
-
mail.
|
58
|
-
mail.
|
54
|
+
personalization.add_to(Email.new(email: 'test@example.com'))
|
55
|
+
personalization.add_substitution(Substitution.new(key: '-name-', value: 'Example User'))
|
56
|
+
personalization.add_substitution(Substitution.new(key: '-city-', value: 'Denver'))
|
57
|
+
mail.add_personalization(personalization)
|
58
|
+
mail.add_content(Content.new(type: 'text/html', value: 'I\'m replacing the <strong>body tag</strong>'))
|
59
59
|
mail.template_id = '13b8f94f-bcae-4ec6-b752-70d6cb59f932'
|
60
60
|
|
61
61
|
sg = SendGrid::API.new(api_key: ENV['SENDGRID_API_KEY'])
|
@@ -23,41 +23,41 @@ def kitchen_sink
|
|
23
23
|
mail.from = Email.new(email: 'test@example.com')
|
24
24
|
mail.subject = 'Hello World from the SendGrid Ruby Library'
|
25
25
|
personalization = Personalization.new
|
26
|
-
personalization.
|
27
|
-
personalization.
|
28
|
-
personalization.
|
29
|
-
personalization.
|
30
|
-
personalization.
|
31
|
-
personalization.
|
26
|
+
personalization.add_to(Email.new(email: 'test1@example.com', name: 'Example User'))
|
27
|
+
personalization.add_to(Email.new(email: 'test2@example.com', name: 'Example User'))
|
28
|
+
personalization.add_cc(Email.new(email: 'test3@example.com', name: 'Example User'))
|
29
|
+
personalization.add_cc(Email.new(email: 'test4@example.com', name: 'Example User'))
|
30
|
+
personalization.add_bcc(Email.new(email: 'test5@example.com', name: 'Example User'))
|
31
|
+
personalization.add_bcc(Email.new(email: 'test6@example.com', name: 'Example User'))
|
32
32
|
personalization.subject = 'Hello World from the Personalized SendGrid Ruby Library'
|
33
|
-
personalization.
|
34
|
-
personalization.
|
35
|
-
personalization.
|
36
|
-
personalization.
|
37
|
-
personalization.
|
38
|
-
personalization.
|
33
|
+
personalization.add_header(Header.new(key: 'X-Test', value: 'True'))
|
34
|
+
personalization.add_header(Header.new(key: 'X-Mock', value: 'False'))
|
35
|
+
personalization.add_substitution(Substitution.new(key: '%name%', value: 'Example User'))
|
36
|
+
personalization.add_substitution(Substitution.new(key: '%city%', value: 'Denver'))
|
37
|
+
personalization.add_custom_arg(CustomArg.new(key: 'user_id', value: '343'))
|
38
|
+
personalization.add_custom_arg(CustomArg.new(key: 'type', value: 'marketing'))
|
39
39
|
personalization.send_at = 1443636843
|
40
|
-
mail.
|
40
|
+
mail.add_personalization(personalization)
|
41
41
|
|
42
42
|
personalization2 = Personalization.new
|
43
|
-
personalization2.
|
44
|
-
personalization2.
|
45
|
-
personalization2.
|
46
|
-
personalization2.
|
47
|
-
personalization2.
|
48
|
-
personalization2.
|
43
|
+
personalization2.add_to(Email.new(email: 'test1@example.com', name: 'Example User'))
|
44
|
+
personalization2.add_to(Email.new(email: 'test2@example.com', name: 'Example User'))
|
45
|
+
personalization2.add_cc(Email.new(email: 'test3@example.com', name: 'Example User'))
|
46
|
+
personalization2.add_cc(Email.new(email: 'test4@example.com', name: 'Example User'))
|
47
|
+
personalization2.add_bcc(Email.new(email: 'test5@example.com', name: 'Example User'))
|
48
|
+
personalization2.add_bcc(Email.new(email: 'test6@example.com', name: 'Example User'))
|
49
49
|
personalization2.subject = 'Hello World from the Personalized SendGrid Ruby Library'
|
50
|
-
personalization2.
|
51
|
-
personalization2.
|
52
|
-
personalization2.
|
53
|
-
personalization2.
|
54
|
-
personalization2.
|
55
|
-
personalization2.
|
50
|
+
personalization2.add_header(Header.new(key: 'X-Test', value: 'True'))
|
51
|
+
personalization2.add_header(Header.new(key: 'X-Mock', value: 'False'))
|
52
|
+
personalization2.add_substitution(Substitution.new(key: '%name%', value: 'Example User'))
|
53
|
+
personalization2.add_substitution(Substitution.new(key: '%city%', value: 'Denver'))
|
54
|
+
personalization2.add_custom_arg(CustomArg.new(key: 'user_id', value: '343'))
|
55
|
+
personalization2.add_custom_arg(CustomArg.new(key: 'type', value: 'marketing'))
|
56
56
|
personalization2.send_at = 1443636843
|
57
57
|
mail.personalizations = personalization2
|
58
58
|
|
59
|
-
mail.
|
60
|
-
mail.
|
59
|
+
mail.add_content(Content.new(type: 'text/plain', value: 'some text here'))
|
60
|
+
mail.add_content(Content.new(type: 'text/html', value: '<html><body>some text here</body></html>'))
|
61
61
|
|
62
62
|
attachment = Attachment.new
|
63
63
|
attachment.content = 'TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4gQ3JhcyBwdW12'
|
@@ -66,7 +66,7 @@ def kitchen_sink
|
|
66
66
|
attachment.disposition = 'attachment'
|
67
67
|
attachment.content_id = 'Balance Sheet'
|
68
68
|
|
69
|
-
mail.
|
69
|
+
mail.add_attachment(attachment)
|
70
70
|
|
71
71
|
attachment2 = Attachment.new
|
72
72
|
attachment2.content = 'BwdW'
|
@@ -74,21 +74,21 @@ def kitchen_sink
|
|
74
74
|
attachment2.filename = 'banner.png'
|
75
75
|
attachment2.disposition = 'inline'
|
76
76
|
attachment2.content_id = 'Banner'
|
77
|
-
mail.
|
77
|
+
mail.add_attachment(attachment2)
|
78
78
|
|
79
79
|
mail.template_id = '13b8f94f-bcae-4ec6-b752-70d6cb59f932'
|
80
80
|
|
81
|
-
mail.
|
82
|
-
mail.
|
81
|
+
mail.add_section(Section.new(key: '%section1%', value: 'Substitution Text for Section 1'))
|
82
|
+
mail.add_section(Section.new(key: '%section2%', value: 'Substitution Text for Section 2'))
|
83
83
|
|
84
|
-
mail.
|
85
|
-
mail.
|
84
|
+
mail.add_header(Header.new(key: 'X-Test3', value: 'test3'))
|
85
|
+
mail.add_header(Header.new(key: 'X-Test4', value: 'test4'))
|
86
86
|
|
87
|
-
mail.
|
88
|
-
mail.
|
87
|
+
mail.add_category(Category.new(name: 'May'))
|
88
|
+
mail.add_category(Category.new(name: '2016'))
|
89
89
|
|
90
|
-
mail.
|
91
|
-
mail.
|
90
|
+
mail.add_custom_arg(CustomArg.new(key: 'campaign', value: 'welcome'))
|
91
|
+
mail.add_custom_arg(CustomArg.new(key: 'weekday', value: 'morning'))
|
92
92
|
|
93
93
|
mail.send_at = 1443636842
|
94
94
|
|
data/lib/sendgrid-ruby.rb
CHANGED
@@ -1,4 +1,24 @@
|
|
1
1
|
require_relative 'sendgrid/client'
|
2
2
|
require_relative 'sendgrid/version'
|
3
|
+
require_relative 'sendgrid/helpers/mail/asm'
|
4
|
+
require_relative 'sendgrid/helpers/mail/attachment'
|
5
|
+
require_relative 'sendgrid/helpers/mail/bcc_settings'
|
6
|
+
require_relative 'sendgrid/helpers/mail/bypass_list_management'
|
7
|
+
require_relative 'sendgrid/helpers/mail/category'
|
8
|
+
require_relative 'sendgrid/helpers/mail/click_tracking'
|
9
|
+
require_relative 'sendgrid/helpers/mail/content'
|
10
|
+
require_relative 'sendgrid/helpers/mail/custom_arg'
|
11
|
+
require_relative 'sendgrid/helpers/mail/email'
|
12
|
+
require_relative 'sendgrid/helpers/mail/footer'
|
13
|
+
require_relative 'sendgrid/helpers/mail/ganalytics'
|
14
|
+
require_relative 'sendgrid/helpers/mail/header'
|
3
15
|
require_relative 'sendgrid/helpers/mail/mail'
|
16
|
+
require_relative 'sendgrid/helpers/mail/mail_settings'
|
17
|
+
require_relative 'sendgrid/helpers/mail/open_tracking'
|
18
|
+
require_relative 'sendgrid/helpers/mail/personalization'
|
19
|
+
require_relative 'sendgrid/helpers/mail/section'
|
20
|
+
require_relative 'sendgrid/helpers/mail/spam_check'
|
21
|
+
require_relative 'sendgrid/helpers/mail/subscription_tracking'
|
22
|
+
require_relative 'sendgrid/helpers/mail/substitution'
|
23
|
+
require_relative 'sendgrid/helpers/mail/tracking_settings'
|
4
24
|
require_relative 'sendgrid/helpers/settings/settings'
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module SendGrid
|
4
|
+
class ASM
|
5
|
+
def initialize(group_id: nil, groups_to_display: nil)
|
6
|
+
@group_id = group_id
|
7
|
+
@groups_to_display = groups_to_display
|
8
|
+
end
|
9
|
+
|
10
|
+
def group_id=(group_id)
|
11
|
+
@group_id = group_id
|
12
|
+
end
|
13
|
+
|
14
|
+
def group_id
|
15
|
+
@group_id
|
16
|
+
end
|
17
|
+
|
18
|
+
def groups_to_display=(groups_to_display)
|
19
|
+
@groups_to_display = groups_to_display
|
20
|
+
end
|
21
|
+
|
22
|
+
def groups_to_display
|
23
|
+
@groups_to_display
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_json(*)
|
27
|
+
{
|
28
|
+
'group_id' => self.group_id,
|
29
|
+
'groups_to_display' => self.groups_to_display
|
30
|
+
}.delete_if { |_, value| value.to_s.strip == '' }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module SendGrid
|
4
|
+
class Attachment
|
5
|
+
def initialize
|
6
|
+
@content = nil
|
7
|
+
@type = nil
|
8
|
+
@filename = nil
|
9
|
+
@disposition = nil
|
10
|
+
@content_id = nil
|
11
|
+
end
|
12
|
+
|
13
|
+
def content=(content)
|
14
|
+
@content = content
|
15
|
+
end
|
16
|
+
|
17
|
+
def content
|
18
|
+
@content
|
19
|
+
end
|
20
|
+
|
21
|
+
def type=(type)
|
22
|
+
@type = type
|
23
|
+
end
|
24
|
+
|
25
|
+
def type
|
26
|
+
@type
|
27
|
+
end
|
28
|
+
|
29
|
+
def filename=(filename)
|
30
|
+
@filename = filename
|
31
|
+
end
|
32
|
+
|
33
|
+
def filename
|
34
|
+
@filename
|
35
|
+
end
|
36
|
+
|
37
|
+
def disposition=(disposition)
|
38
|
+
@disposition = disposition
|
39
|
+
end
|
40
|
+
|
41
|
+
def disposition
|
42
|
+
@disposition
|
43
|
+
end
|
44
|
+
|
45
|
+
def content_id=(content_id)
|
46
|
+
@content_id = content_id
|
47
|
+
end
|
48
|
+
|
49
|
+
def content_id
|
50
|
+
@content_id
|
51
|
+
end
|
52
|
+
|
53
|
+
def to_json(*)
|
54
|
+
{
|
55
|
+
'content' => self.content,
|
56
|
+
'type' => self.type,
|
57
|
+
'filename' => self.filename,
|
58
|
+
'disposition' => self.disposition,
|
59
|
+
'content_id' => self.content_id
|
60
|
+
}.delete_if { |_, value| value.to_s.strip == '' }
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module SendGrid
|
4
|
+
class BccSettings
|
5
|
+
def initialize(enable: nil, email: nil)
|
6
|
+
@enable = enable
|
7
|
+
@email = email
|
8
|
+
end
|
9
|
+
|
10
|
+
def enable=(enable)
|
11
|
+
@enable = enable
|
12
|
+
end
|
13
|
+
|
14
|
+
def enable
|
15
|
+
@enable
|
16
|
+
end
|
17
|
+
|
18
|
+
def email=(email)
|
19
|
+
@email = email
|
20
|
+
end
|
21
|
+
|
22
|
+
def email
|
23
|
+
@email
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_json(*)
|
27
|
+
{
|
28
|
+
'enable' => self.enable,
|
29
|
+
'email' => self.email
|
30
|
+
}.delete_if { |_, value| value.to_s.strip == '' }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module SendGrid
|
4
|
+
class BypassListManagement
|
5
|
+
def initialize(enable: nil)
|
6
|
+
@enable = enable
|
7
|
+
end
|
8
|
+
|
9
|
+
def enable=(enable)
|
10
|
+
@enable = enable
|
11
|
+
end
|
12
|
+
|
13
|
+
def enable
|
14
|
+
@enable
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_json(*)
|
18
|
+
{
|
19
|
+
'enable' => self.enable
|
20
|
+
}.delete_if { |_, value| value.to_s.strip == '' }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class SandBoxMode
|
25
|
+
def initialize(enable: nil)
|
26
|
+
@enable = enable
|
27
|
+
end
|
28
|
+
|
29
|
+
def enable=(enable)
|
30
|
+
@enable = enable
|
31
|
+
end
|
32
|
+
|
33
|
+
def enable
|
34
|
+
@enable
|
35
|
+
end
|
36
|
+
|
37
|
+
def to_json(*)
|
38
|
+
{
|
39
|
+
'enable' => self.enable
|
40
|
+
}.delete_if { |_, value| value.to_s.strip == '' }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module SendGrid
|
4
|
+
class Category
|
5
|
+
attr_accessor :name
|
6
|
+
|
7
|
+
def initialize(name: nil)
|
8
|
+
@name = name
|
9
|
+
end
|
10
|
+
|
11
|
+
def name=(name)
|
12
|
+
@name = name
|
13
|
+
end
|
14
|
+
|
15
|
+
def name
|
16
|
+
@name
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_json(*)
|
20
|
+
{
|
21
|
+
'category' => name
|
22
|
+
}.delete_if { |_, value| value.to_s.strip == '' }
|
23
|
+
end
|
24
|
+
|
25
|
+
alias :category :name
|
26
|
+
alias :category= :name=
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module SendGrid
|
4
|
+
class ClickTracking
|
5
|
+
def initialize(enable: nil, enable_text: nil)
|
6
|
+
@enable = enable
|
7
|
+
@enable_text = enable_text
|
8
|
+
end
|
9
|
+
|
10
|
+
def enable=(enable)
|
11
|
+
@enable = enable
|
12
|
+
end
|
13
|
+
|
14
|
+
def enable
|
15
|
+
@enable
|
16
|
+
end
|
17
|
+
|
18
|
+
def enable_text=(enable_text)
|
19
|
+
@enable_text = enable_text
|
20
|
+
end
|
21
|
+
|
22
|
+
def enable_text
|
23
|
+
@enable_text
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_json(*)
|
27
|
+
{
|
28
|
+
'enable' => self.enable,
|
29
|
+
'enable_text' => self.enable_text
|
30
|
+
}.delete_if { |_, value| value.to_s.strip == '' }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|