platforms-yammer 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +157 -0
- data/Rakefile +18 -0
- data/lib/generators/platforms/yammer/install/USAGE +11 -0
- data/lib/generators/platforms/yammer/install/install_generator.rb +29 -0
- data/lib/generators/platforms/yammer/install/templates/platforms_yammer.rb +4 -0
- data/lib/platforms/yammer.rb +15 -0
- data/lib/platforms/yammer/api.rb +39 -0
- data/lib/platforms/yammer/api/base.rb +20 -0
- data/lib/platforms/yammer/api/group_memberships.rb +35 -0
- data/lib/platforms/yammer/api/groups.rb +22 -0
- data/lib/platforms/yammer/api/invitations.rb +23 -0
- data/lib/platforms/yammer/api/messages.rb +165 -0
- data/lib/platforms/yammer/api/networks.rb +22 -0
- data/lib/platforms/yammer/api/oauth.rb +28 -0
- data/lib/platforms/yammer/api/open_graph_objects.rb +29 -0
- data/lib/platforms/yammer/api/pending_attachments.rb +34 -0
- data/lib/platforms/yammer/api/relationships.rb +39 -0
- data/lib/platforms/yammer/api/search.rb +22 -0
- data/lib/platforms/yammer/api/streams.rb +21 -0
- data/lib/platforms/yammer/api/subscriptions.rb +53 -0
- data/lib/platforms/yammer/api/suggestions.rb +31 -0
- data/lib/platforms/yammer/api/supervisor_mode.rb +22 -0
- data/lib/platforms/yammer/api/threads.rb +23 -0
- data/lib/platforms/yammer/api/topics.rb +23 -0
- data/lib/platforms/yammer/api/uploaded_files.rb +22 -0
- data/lib/platforms/yammer/api/users.rb +109 -0
- data/lib/platforms/yammer/authentication.rb +233 -0
- data/lib/platforms/yammer/client.rb +228 -0
- data/lib/platforms/yammer/configuration.rb +76 -0
- data/lib/platforms/yammer/engine.rb +27 -0
- data/lib/platforms/yammer/omni_auth_setup.rb +31 -0
- data/lib/platforms/yammer/railtie.rb +19 -0
- data/lib/platforms/yammer/version.rb +7 -0
- data/lib/tasks/platforms/yammer_tasks.rake +4 -0
- metadata +280 -0
@@ -0,0 +1,22 @@
|
|
1
|
+
module Platforms
|
2
|
+
module Yammer
|
3
|
+
module Api
|
4
|
+
# Networks on Yammer
|
5
|
+
# @author Benjamin Elias
|
6
|
+
# @since 0.1.0
|
7
|
+
class Networks < Base
|
8
|
+
|
9
|
+
# Get the user's current Network
|
10
|
+
# @param options [Hash] Options for the request
|
11
|
+
# @param headers [Hash] Additional headers to send with the request
|
12
|
+
# @return [Faraday::Response] the API response
|
13
|
+
# @see https://developer.yammer.com/docs/networkscurrentjson
|
14
|
+
def current options={}, headers={}
|
15
|
+
@connection.get 'networks/current.json', options, headers
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Platforms
|
2
|
+
module Yammer
|
3
|
+
module Api
|
4
|
+
# OAuth2 tokens in Yammer, useful for verified admins to impoersonate
|
5
|
+
# other users, or to switch networks.
|
6
|
+
#
|
7
|
+
# @note This class is called Oauth and not OAuth (or OAuth2), because
|
8
|
+
# of the syntax of the Yammer API path.
|
9
|
+
# There is no underscore between the O and A.
|
10
|
+
#
|
11
|
+
# @author Benjamin Elias
|
12
|
+
# @since 0.1.0
|
13
|
+
class Oauth < Base
|
14
|
+
|
15
|
+
# Get tokens
|
16
|
+
# @param options [Hash] Options for the request
|
17
|
+
# @param headers [Hash] Additional headers to send with the request
|
18
|
+
# @return [Faraday::Response] the API response
|
19
|
+
# @see https://developer.yammer.com/docs/impersonation
|
20
|
+
def tokens options={}, headers={}
|
21
|
+
@connection.get "oauth/tokens.json", options, headers
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Platforms
|
2
|
+
module Yammer
|
3
|
+
module Api
|
4
|
+
# Open Graph Objects in Yammer
|
5
|
+
#
|
6
|
+
# This is read-only through the API.
|
7
|
+
#
|
8
|
+
# @author Benjamin Elias
|
9
|
+
# @since 0.1.0
|
10
|
+
class OpenGraphObjects < Base
|
11
|
+
|
12
|
+
# Get open graph obects
|
13
|
+
# URL is actually a required parameter so require that when
|
14
|
+
# calling this function.
|
15
|
+
# @param url [#to_s] URL of the OG item to get
|
16
|
+
# @param options [Hash] Options for the request
|
17
|
+
# @param headers [Hash] Additional headers to send with the request
|
18
|
+
# @return [Faraday::Response] the API response
|
19
|
+
# @see https://developer.yammer.com/docs/open_graph_objects
|
20
|
+
def get url, options={}, headers={}
|
21
|
+
params = options.merge({url: url})
|
22
|
+
@connection.get 'open_graph_objects.json', params, headers
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Platforms
|
2
|
+
module Yammer
|
3
|
+
module Api
|
4
|
+
# Pending attachments in Yammer
|
5
|
+
# @author Benjamin Elias
|
6
|
+
# @since 0.1.0
|
7
|
+
class PendingAttachments < Base
|
8
|
+
|
9
|
+
# Add a pending attachment
|
10
|
+
# @param upload_io [Faraday::UploadIO] The file payload
|
11
|
+
# @param options [Hash] Additional options for the request
|
12
|
+
# @param headers [Hash] Additional headers to send with the request
|
13
|
+
# @return [Faraday::Response] the API response
|
14
|
+
# @see https://developer.yammer.com/docs/pending_attachments
|
15
|
+
# @see https://stackoverflow.com/questions/16725195/upload-files-using-faraday
|
16
|
+
def post upload_io, options={}, headers={}
|
17
|
+
body = { file: upload_io }.reverse_merge(options)
|
18
|
+
@connection.post 'pending_attachments.json', body, headers
|
19
|
+
end
|
20
|
+
|
21
|
+
# Delete a pending attachment
|
22
|
+
# @param id [#to_s] ID of pending attachment to delete
|
23
|
+
# @param options [Hash] Options for the request
|
24
|
+
# @param headers [Hash] Additional headers to send with the request
|
25
|
+
# @return [Faraday::Response] the API response
|
26
|
+
# @see https://developer.yammer.com/docs/pending_attachmentsid
|
27
|
+
def delete id, options={}, headers={}
|
28
|
+
@connection.delete "pending_attachments/#{id}.json", options, headers
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Platforms
|
2
|
+
module Yammer
|
3
|
+
module Api
|
4
|
+
# Relationships in Yammer
|
5
|
+
# @todo confirm documentation, which currently (2020-03-25) is confused
|
6
|
+
# around parameters and mentions updating relationships as part of a
|
7
|
+
# GET request
|
8
|
+
#
|
9
|
+
# @author Benjamin Elias
|
10
|
+
# @since 0.1.0
|
11
|
+
class Relationships < Base
|
12
|
+
|
13
|
+
# Get relationships
|
14
|
+
# @param options [Hash] Options for the request
|
15
|
+
# @param headers [Hash] Additional headers to send with the request
|
16
|
+
# @return [Faraday::Response] the API response
|
17
|
+
# @see https://developer.yammer.com/docs/relationshipsjson
|
18
|
+
def get options={}, headers={}
|
19
|
+
@connection.get 'relationships.json', options, headers
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
# Update relationships
|
24
|
+
#
|
25
|
+
# It is unclear how exactly this works with subordinates, and "all
|
26
|
+
# three can be passed in one request".
|
27
|
+
#
|
28
|
+
# @param options [Hash] Options for the request body
|
29
|
+
# @param headers [Hash] Additional headers to send with the request
|
30
|
+
# @return [Faraday::Response] the API response
|
31
|
+
# @see https://developer.yammer.com/docs/relationshipsjson-1
|
32
|
+
def post options={}, headers={}
|
33
|
+
@connection.post 'relationships.json', options, headers
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Platforms
|
2
|
+
module Yammer
|
3
|
+
module Api
|
4
|
+
# Search within Yammer
|
5
|
+
# @author Benjamin Elias
|
6
|
+
# @since 0.1.0
|
7
|
+
class Search < Base
|
8
|
+
|
9
|
+
# Get search results
|
10
|
+
# @param options [Hash] Options for the request
|
11
|
+
# @param headers [Hash] Additional headers to send with the request
|
12
|
+
# @return [Faraday::Response] the API response
|
13
|
+
# @see https://developer.yammer.com/docs/searchjson
|
14
|
+
def get options={}, headers={}
|
15
|
+
@connection.get 'search.json', options, headers
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Platforms
|
2
|
+
module Yammer
|
3
|
+
module Api
|
4
|
+
# The notification stream in Yammer
|
5
|
+
# @author Benjamin Elias
|
6
|
+
# @since 0.1.0
|
7
|
+
class Streams < Base
|
8
|
+
|
9
|
+
# Get the notifications stream for the current user
|
10
|
+
# @param options [Hash] Options for the request
|
11
|
+
# @param headers [Hash] Additional headers to send with the request
|
12
|
+
# @return [Faraday::Response] the API response
|
13
|
+
# @see https://developer.yammer.com/docs/streamsnotificationsjson
|
14
|
+
def notifications options={}, headers={}
|
15
|
+
@connection.get "streams/notifications.json", options, headers
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Platforms
|
2
|
+
module Yammer
|
3
|
+
module Api
|
4
|
+
# Yammer's subscription (following) management
|
5
|
+
# @author Benjamin Elias
|
6
|
+
# @since 0.1.0
|
7
|
+
class Subscriptions < Base
|
8
|
+
|
9
|
+
# Check if the current user is subscribed to (following) another user
|
10
|
+
# @param id [#to_s] The ID of the User
|
11
|
+
# @param options [Hash] Options for the request
|
12
|
+
# @param headers [Hash] Additional headers to send with the request
|
13
|
+
# @return [Faraday::Response] the API response
|
14
|
+
# @see https://developer.yammer.com/docs/subscriptionsto_useridjson
|
15
|
+
def to_user id, options={}, headers={}
|
16
|
+
@connection.get "subscriptions/to_user/#{id}.json", options, headers
|
17
|
+
end
|
18
|
+
|
19
|
+
# Check if the current user is subscribed to (following) a topic (hashtag)
|
20
|
+
# @param id [#to_s] The ID of the User
|
21
|
+
# @param options [Hash] Options for the request
|
22
|
+
# @param headers [Hash] Additional headers to send with the request
|
23
|
+
# @return [Faraday::Response] the API response
|
24
|
+
# @see https://developer.yammer.com/docs/subscriptionsto_topicidjson
|
25
|
+
def to_topic id, options={}, headers={}
|
26
|
+
@connection.get "subscriptions/to_topic/#{id}.json", options, headers
|
27
|
+
end
|
28
|
+
|
29
|
+
# Subscribe to a user or topic.
|
30
|
+
# This usually involves setting target_id and target_type in the JSON body.
|
31
|
+
# @param body [#to_s] Body of the request
|
32
|
+
# @param headers [Hash] Additional headers to send with the request
|
33
|
+
# @return [Faraday::Response] the API response
|
34
|
+
# @see https://developer.yammer.com/docs/subscriptions-1
|
35
|
+
def post body=nil, headers={}
|
36
|
+
@connection.post "subscriptions.json", body, headers
|
37
|
+
end
|
38
|
+
|
39
|
+
# Unsubscribe from a user or topic.
|
40
|
+
# This usually involves setting target_id and target_type in the options hash.
|
41
|
+
# @param options [Hash] Options for the request
|
42
|
+
# @param headers [Hash] Additional headers to send with the request
|
43
|
+
# @return [Faraday::Response] the API response
|
44
|
+
# @see https://developer.yammer.com/docs/subscriptions-1
|
45
|
+
def delete options={}, headers={}
|
46
|
+
@connection.delete "subscriptions.json", options, headers
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Platforms
|
2
|
+
module Yammer
|
3
|
+
module Api
|
4
|
+
# Yammer's suggestions for Users to follow
|
5
|
+
# @author Benjamin Elias
|
6
|
+
# @since 0.1.0
|
7
|
+
class Suggestions < Base
|
8
|
+
|
9
|
+
# Get suggested users to follow for the current user
|
10
|
+
# @param options [Hash] Options for the request
|
11
|
+
# @param headers [Hash] Additional headers to send with the request
|
12
|
+
# @return [Faraday::Response] the API response
|
13
|
+
# @see https://developer.yammer.com/docs/suggestionsjson
|
14
|
+
def get options={}, headers={}
|
15
|
+
@connection.get "suggestions.json", options, headers
|
16
|
+
end
|
17
|
+
|
18
|
+
# Decline a suggested user to follow
|
19
|
+
# @param options [Hash] Options for the request
|
20
|
+
# @param headers [Hash] Additional headers to send with the request
|
21
|
+
# @return [Faraday::Response] the API response
|
22
|
+
# @see https://developer.yammer.com/docs/suggestionsidjson
|
23
|
+
def delete suggestion_id, options={}, headers={}
|
24
|
+
@connection.delete "suggestions/#{suggestion_id}.json", options, headers
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Platforms
|
2
|
+
module Yammer
|
3
|
+
module Api
|
4
|
+
# Set supervisor mode in Yammer
|
5
|
+
# @author Benjamin Elias
|
6
|
+
# @since 0.1.0
|
7
|
+
class SupervisorMode < Base
|
8
|
+
|
9
|
+
# Toggle supervisor mode
|
10
|
+
# @param options [Hash] Options for the request
|
11
|
+
# @param headers [Hash] Additional headers to send with the request
|
12
|
+
# @return [Faraday::Response] the API response
|
13
|
+
# @see https://developer.yammer.com/docs/api-requests
|
14
|
+
def toggle options={}, headers={}
|
15
|
+
@connection.post "supervisor_mode/toggle.json", options, headers
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Platforms
|
2
|
+
module Yammer
|
3
|
+
module Api
|
4
|
+
# Threads in Yammer
|
5
|
+
# @author Benjamin Elias
|
6
|
+
# @since 0.1.0
|
7
|
+
class Threads < Base
|
8
|
+
|
9
|
+
# Get information about a thread
|
10
|
+
# @param id [#to_s] The thread ID
|
11
|
+
# @param options [Hash] Options for the request
|
12
|
+
# @param headers [Hash] Additional headers to send with the request
|
13
|
+
# @return [Faraday::Response] the API response
|
14
|
+
# @see https://developer.yammer.com/docs/threadsidjson
|
15
|
+
def get id, options={}, headers={}
|
16
|
+
@connection.get "threads/#{id}.json", options, headers
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Platforms
|
2
|
+
module Yammer
|
3
|
+
module Api
|
4
|
+
# Topics in Yammer
|
5
|
+
# @author Benjamin Elias
|
6
|
+
# @since 0.1.0
|
7
|
+
class Topics < Base
|
8
|
+
|
9
|
+
# Get information about a topic (hashtag)
|
10
|
+
# @param id [#to_s] The topic ID
|
11
|
+
# @param options [Hash] Options for the request
|
12
|
+
# @param headers [Hash] Additional headers to send with the request
|
13
|
+
# @return [Faraday::Response] the API response
|
14
|
+
# @see https://developer.yammer.com/docs/topicsidjson
|
15
|
+
def get id, options={}, headers={}
|
16
|
+
@connection.get "topics/#{id}.json", options, headers
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Platforms
|
2
|
+
module Yammer
|
3
|
+
module Api
|
4
|
+
# Uploaded file in Yammer
|
5
|
+
# @author Benjamin Elias
|
6
|
+
# @since 0.1.0
|
7
|
+
class UploadedFiles < Base
|
8
|
+
|
9
|
+
# Delete an uploaded file
|
10
|
+
# @param id [#to_s] ID of file to delete
|
11
|
+
# @param options [Hash] Options for the request
|
12
|
+
# @param headers [Hash] Additional headers to send with the request
|
13
|
+
# @return [Faraday::Response] the API response
|
14
|
+
# @see https://developer.yammer.com/docs/uploaded_filesid
|
15
|
+
def delete id, options={}, headers={}
|
16
|
+
@connection.delete "uploaded_files/#{id}.json", options, headers
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
module Platforms
|
2
|
+
module Yammer
|
3
|
+
module Api
|
4
|
+
# Users in Yammer
|
5
|
+
# @author Benjamin Elias
|
6
|
+
# @since 0.1.0
|
7
|
+
class Users < Base
|
8
|
+
|
9
|
+
# Get Users
|
10
|
+
#
|
11
|
+
# @note Called #get_users because of the potential confusion with
|
12
|
+
# GET /users/[:id].json
|
13
|
+
#
|
14
|
+
# @param options [Hash] Options for the request
|
15
|
+
# @param headers [Hash] Additional headers to send with the request
|
16
|
+
# @return [Faraday::Response] the API response
|
17
|
+
# @see https://developer.yammer.com/docs/usersjson
|
18
|
+
def get_users options={}, headers={}
|
19
|
+
@connection.get "users.json", options, headers
|
20
|
+
end
|
21
|
+
|
22
|
+
# Get current User
|
23
|
+
# @param options [Hash] Options for the request
|
24
|
+
# @param headers [Hash] Additional headers to send with the request
|
25
|
+
# @return [Faraday::Response] the API response
|
26
|
+
# @see https://developer.yammer.com/docs/userscurrentjson
|
27
|
+
def current options={}, headers={}
|
28
|
+
@connection.get "users/current.json", options, headers
|
29
|
+
end
|
30
|
+
|
31
|
+
# Get a User by id
|
32
|
+
#
|
33
|
+
# @note Called #get_user because of the potential confusion with
|
34
|
+
# GET /users.json
|
35
|
+
#
|
36
|
+
# @param id [#to_s] id of the User
|
37
|
+
# @param options [Hash] Options for the request
|
38
|
+
# @param headers [Hash] Additional headers to send with the request
|
39
|
+
# @return [Faraday::Response] the API response
|
40
|
+
# @see https://developer.yammer.com/docs/usersidjson
|
41
|
+
def get_user id, options={}, headers={}
|
42
|
+
@connection.get "users/#{id}.json", options, headers
|
43
|
+
end
|
44
|
+
|
45
|
+
# Get a User by email
|
46
|
+
# @param address [#to_s] email of the User
|
47
|
+
# @param options [Hash] Options for the request
|
48
|
+
# @param headers [Hash] Additional headers to send with the request
|
49
|
+
# @return [Faraday::Response] the API response
|
50
|
+
# @see https://developer.yammer.com/docs/usersby_emailjsonemailuserdomaincom
|
51
|
+
def by_email address, options={}, headers={}
|
52
|
+
params = options.merge({ email: address })
|
53
|
+
@connection.get "users/by_email.json", params, headers
|
54
|
+
end
|
55
|
+
|
56
|
+
# Get a Users in a Group
|
57
|
+
# @param group_id [#to_s] id of the Group
|
58
|
+
# @param options [Hash] Options for the request
|
59
|
+
# @param headers [Hash] Additional headers to send with the request
|
60
|
+
# @return [Faraday::Response] the API response
|
61
|
+
# @see https://developer.yammer.com/docs/usersin_groupidjson
|
62
|
+
def in_group group_id, options={}, headers={}
|
63
|
+
@connection.get "users/in_group/#{group_id}.json", options, headers
|
64
|
+
end
|
65
|
+
|
66
|
+
# Get Users who have liked a Message
|
67
|
+
# @param message_id [#to_s] id of the Message
|
68
|
+
# @param options [Hash] Options for the request
|
69
|
+
# @param headers [Hash] Additional headers to send with the request
|
70
|
+
# @return [Faraday::Response] the API response
|
71
|
+
# @see https://developer.yammer.com/docs/usersliked_messagemessage_idjson
|
72
|
+
def liked_message message_id, options={}, headers={}
|
73
|
+
@connection.get "users/liked_message/#{message_id}.json", options, headers
|
74
|
+
end
|
75
|
+
|
76
|
+
# Create a new User (verified admins only)
|
77
|
+
# @param body [Hash] Options for the request
|
78
|
+
# @param headers [Hash] Additional headers to send with the request
|
79
|
+
# @return [Faraday::Response] the API response
|
80
|
+
# @see https://developer.yammer.com/docs/usersjson-1
|
81
|
+
def post body=nil, headers={}
|
82
|
+
@connection.post "users.json", body, headers
|
83
|
+
end
|
84
|
+
|
85
|
+
# Update an existing User (verified admins only)
|
86
|
+
# @param user_id [#to_s] the id of the User to update
|
87
|
+
# @param options [Hash] Options for the request
|
88
|
+
# @param headers [Hash] Additional headers to send with the request
|
89
|
+
# @return [Faraday::Response] the API response
|
90
|
+
# @see https://developer.yammer.com/docs/usersidjson-1
|
91
|
+
def put user_id, options={}, headers={}
|
92
|
+
@connection.put "users/#{user_id}.json", options, headers
|
93
|
+
end
|
94
|
+
|
95
|
+
# Delete an existing User (admins and verified admins only)
|
96
|
+
# @param user_id [#to_s] the id of the User to update
|
97
|
+
# @param options [Hash] Options for the request
|
98
|
+
# @param headers [Hash] Additional headers to send with the request
|
99
|
+
# @return [Faraday::Response] the API response
|
100
|
+
# @see https://developer.yammer.com/docs/usersidjson-2
|
101
|
+
def delete user_id, options={}, headers={}
|
102
|
+
@connection.delete "users/#{user_id}.json", options, headers
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|