@appconda/nextjs 1.0.115 → 1.0.116
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.
- package/dist/actions/actionClient.d.ts +10 -0
- package/dist/actions/actionClient.js +41 -0
- package/dist/actions/auth.d.ts +1 -0
- package/dist/actions/auth.js +7 -0
- package/dist/actions/authOptions.d.ts +5 -0
- package/dist/actions/authOptions.js +235 -0
- package/dist/actions/index.d.ts +3 -0
- package/dist/actions/index.js +4 -0
- package/dist/actions/nextAuthHandler.d.ts +1 -0
- package/dist/actions/nextAuthHandler.js +6 -0
- package/dist/client.d.ts +141 -0
- package/dist/client.js +335 -0
- package/dist/decorators/Cache.d.ts +1 -0
- package/dist/decorators/Cache.js +79 -0
- package/dist/decorators/CacheKey.d.ts +1 -0
- package/dist/decorators/CacheKey.js +9 -0
- package/dist/decorators/Invalidate.d.ts +1 -0
- package/dist/decorators/Invalidate.js +47 -0
- package/dist/enums/api-service.d.ts +13 -0
- package/dist/enums/api-service.js +15 -0
- package/dist/enums/api.d.ts +5 -0
- package/dist/enums/api.js +7 -0
- package/dist/enums/auth-method.d.ts +9 -0
- package/dist/enums/auth-method.js +11 -0
- package/dist/enums/browser.d.ts +16 -0
- package/dist/enums/browser.js +18 -0
- package/dist/enums/compression.d.ts +5 -0
- package/dist/enums/compression.js +7 -0
- package/dist/enums/credit-card.d.ts +18 -0
- package/dist/enums/credit-card.js +20 -0
- package/dist/enums/database-usage-range.d.ts +5 -0
- package/dist/enums/database-usage-range.js +7 -0
- package/dist/enums/email-template-locale.d.ts +133 -0
- package/dist/enums/email-template-locale.js +135 -0
- package/dist/enums/email-template-type.d.ts +9 -0
- package/dist/enums/email-template-type.js +11 -0
- package/dist/enums/entities/EntityLimitType.d.ts +4 -0
- package/dist/enums/entities/EntityLimitType.js +6 -0
- package/dist/enums/entities/PropertyAttributeName.d.ts +27 -0
- package/dist/enums/entities/PropertyAttributeName.js +29 -0
- package/dist/enums/entities/PropertyCondition.d.ts +7 -0
- package/dist/enums/entities/PropertyCondition.js +10 -0
- package/dist/enums/entities/PropertyType.d.ts +12 -0
- package/dist/enums/entities/PropertyType.js +18 -0
- package/dist/enums/entities/PropertyValueType.d.ts +6 -0
- package/dist/enums/entities/PropertyValueType.js +8 -0
- package/dist/enums/entities/RowAccess.d.ts +2 -0
- package/dist/enums/entities/RowAccess.js +2 -0
- package/dist/enums/entities/ViewFilterCondition.d.ts +12 -0
- package/dist/enums/entities/ViewFilterCondition.js +14 -0
- package/dist/enums/execution-method.d.ts +8 -0
- package/dist/enums/execution-method.js +10 -0
- package/dist/enums/flag.d.ts +197 -0
- package/dist/enums/flag.js +199 -0
- package/dist/enums/function-usage-range.d.ts +5 -0
- package/dist/enums/function-usage-range.js +7 -0
- package/dist/enums/image-format.d.ts +7 -0
- package/dist/enums/image-format.js +9 -0
- package/dist/enums/image-gravity.d.ts +11 -0
- package/dist/enums/image-gravity.js +13 -0
- package/dist/enums/index-type.d.ts +5 -0
- package/dist/enums/index-type.js +7 -0
- package/dist/enums/messaging-provider-type.d.ts +5 -0
- package/dist/enums/messaging-provider-type.js +7 -0
- package/dist/enums/name.d.ts +14 -0
- package/dist/enums/name.js +16 -0
- package/dist/enums/o-auth-provider copy.d.ts +41 -0
- package/dist/enums/o-auth-provider copy.js +43 -0
- package/dist/enums/password-hash.d.ts +13 -0
- package/dist/enums/password-hash.js +15 -0
- package/dist/enums/platform-type.d.ts +17 -0
- package/dist/enums/platform-type.js +19 -0
- package/dist/enums/project-usage-range.d.ts +4 -0
- package/dist/enums/project-usage-range.js +6 -0
- package/dist/enums/region.d.ts +4 -0
- package/dist/enums/region.js +6 -0
- package/dist/enums/relation-mutate.d.ts +5 -0
- package/dist/enums/relation-mutate.js +7 -0
- package/dist/enums/relationship-type.d.ts +6 -0
- package/dist/enums/relationship-type.js +8 -0
- package/dist/enums/resource-type.d.ts +4 -0
- package/dist/enums/resource-type.js +6 -0
- package/dist/enums/runtime.d.ts +48 -0
- package/dist/enums/runtime.js +50 -0
- package/dist/enums/s-m-t-p-secure.d.ts +3 -0
- package/dist/enums/s-m-t-p-secure.js +5 -0
- package/dist/enums/shared/ApplicationLayout.d.ts +4 -0
- package/dist/enums/shared/ApplicationLayout.js +6 -0
- package/dist/enums/shared/Colors.d.ts +24 -0
- package/dist/enums/shared/Colors.js +26 -0
- package/dist/enums/shared/InputType.d.ts +6 -0
- package/dist/enums/shared/InputType.js +8 -0
- package/dist/enums/shared/Periodicity.d.ts +7 -0
- package/dist/enums/shared/Periodicity.js +9 -0
- package/dist/enums/shared/SvgIcon.d.ts +37 -0
- package/dist/enums/shared/SvgIcon.js +39 -0
- package/dist/enums/shared/Theme.d.ts +4 -0
- package/dist/enums/shared/Theme.js +6 -0
- package/dist/enums/sms-template-locale.d.ts +133 -0
- package/dist/enums/sms-template-locale.js +135 -0
- package/dist/enums/sms-template-type.d.ts +6 -0
- package/dist/enums/sms-template-type.js +8 -0
- package/dist/enums/smtp-encryption.d.ts +5 -0
- package/dist/enums/smtp-encryption.js +7 -0
- package/dist/enums/storage-usage-range.d.ts +5 -0
- package/dist/enums/storage-usage-range.js +7 -0
- package/dist/enums/subscriptions/PricingModel.d.ts +11 -0
- package/dist/enums/subscriptions/PricingModel.js +12 -0
- package/dist/enums/subscriptions/SubscriptionBillingPeriod.d.ts +10 -0
- package/dist/enums/subscriptions/SubscriptionBillingPeriod.js +11 -0
- package/dist/enums/subscriptions/SubscriptionFeatureLimitType.d.ts +10 -0
- package/dist/enums/subscriptions/SubscriptionFeatureLimitType.js +13 -0
- package/dist/enums/subscriptions/SubscriptionPriceType.d.ts +7 -0
- package/dist/enums/subscriptions/SubscriptionPriceType.js +8 -0
- package/dist/enums/tenants/LinkedAccountStatus.d.ts +5 -0
- package/dist/enums/tenants/LinkedAccountStatus.js +7 -0
- package/dist/enums/tenants/TenantUserJoined.d.ts +6 -0
- package/dist/enums/tenants/TenantUserJoined.js +8 -0
- package/dist/enums/tenants/TenantUserStatus.d.ts +6 -0
- package/dist/enums/tenants/TenantUserStatus.js +8 -0
- package/dist/enums/tenants/TenantUserType.d.ts +5 -0
- package/dist/enums/tenants/TenantUserType.js +7 -0
- package/dist/enums/user-usage-range.d.ts +5 -0
- package/dist/enums/user-usage-range.js +7 -0
- package/dist/getAppcondaClient.d.ts +2 -0
- package/dist/getAppcondaClient.js +44 -0
- package/dist/getSDKForCurrentUser.d.ts +43 -0
- package/dist/getSDKForCurrentUser.js +76 -0
- package/dist/getSDKForService.d.ts +6 -0
- package/dist/getSDKForService.js +51 -0
- package/dist/getSDKForTenant.d.ts +20 -0
- package/dist/getSDKForTenant.js +44 -0
- package/dist/id.d.ts +20 -0
- package/dist/id.js +45 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.js +42 -0
- package/dist/inputFile.d.ts +6 -0
- package/dist/inputFile.js +17 -0
- package/dist/lib/Cache/Adapter.d.ts +10 -0
- package/dist/lib/Cache/Adapter.js +2 -0
- package/dist/lib/Cache/Adapters/Filesystem.d.ts +16 -0
- package/dist/lib/Cache/Adapters/Filesystem.js +103 -0
- package/dist/lib/Cache/Adapters/Memory.d.ts +18 -0
- package/dist/lib/Cache/Adapters/Memory.js +47 -0
- package/dist/lib/Cache/Adapters/None.d.ts +12 -0
- package/dist/lib/Cache/Adapters/None.js +28 -0
- package/dist/lib/Cache/Adapters/Sharding.d.ts +17 -0
- package/dist/lib/Cache/Adapters/Sharding.js +73 -0
- package/dist/lib/Cache/Cache.d.ts +16 -0
- package/dist/lib/Cache/Cache.js +52 -0
- package/dist/lib/Cache/index.d.ts +4 -0
- package/dist/lib/Cache/index.js +5 -0
- package/dist/lib/Cache/test.d.ts +0 -0
- package/dist/lib/Cache/test.js +1 -0
- package/dist/lib/Registry/Registry.d.ts +38 -0
- package/dist/lib/Registry/Registry.js +56 -0
- package/dist/lib/Registry/index.d.ts +1 -0
- package/dist/lib/Registry/index.js +2 -0
- package/dist/lib/Services.d.ts +6 -0
- package/dist/lib/Services.js +14 -0
- package/dist/lib/crypto.d.ts +23 -0
- package/dist/lib/crypto.js +78 -0
- package/dist/lib/env.d.ts +1 -0
- package/dist/lib/env.js +137 -0
- package/dist/lib/errors.d.ts +70 -0
- package/dist/lib/errors.js +76 -0
- package/dist/lib/index.d.ts +2 -0
- package/dist/lib/index.js +3 -0
- package/dist/lib/jwt.d.ts +12 -0
- package/dist/lib/jwt.js +103 -0
- package/dist/models.d.ts +3272 -0
- package/dist/models.js +2 -0
- package/dist/modules/account/actions.d.ts +31 -0
- package/dist/modules/account/actions.js +18 -0
- package/dist/modules/account/enums/authentication-factor.d.ts +6 -0
- package/dist/modules/account/enums/authentication-factor.js +8 -0
- package/dist/modules/account/enums/authenticator-type.d.ts +3 -0
- package/dist/modules/account/enums/authenticator-type.js +5 -0
- package/dist/modules/account/enums/o-auth-provider.d.ts +41 -0
- package/dist/modules/account/enums/o-auth-provider.js +43 -0
- package/dist/modules/account/index.d.ts +3 -0
- package/dist/modules/account/index.js +4 -0
- package/dist/modules/account/schema.d.ts +17 -0
- package/dist/modules/account/schema.js +8 -0
- package/dist/modules/account/service.d.ts +530 -0
- package/dist/modules/account/service.js +1260 -0
- package/dist/modules/account/types.d.ts +411 -0
- package/dist/modules/account/types.js +2 -0
- package/dist/modules/acl/service.d.ts +26 -0
- package/dist/modules/acl/service.js +27 -0
- package/dist/modules/agent/action.d.ts +57 -0
- package/dist/modules/agent/action.js +64 -0
- package/dist/modules/agent/index.d.ts +4 -0
- package/dist/modules/agent/index.js +5 -0
- package/dist/modules/agent/schema.d.ts +48 -0
- package/dist/modules/agent/schema.js +21 -0
- package/dist/modules/agent/service.d.ts +12 -0
- package/dist/modules/agent/service.js +22 -0
- package/dist/modules/agent/types.d.ts +11 -0
- package/dist/modules/agent/types.js +2 -0
- package/dist/modules/ai/index.d.ts +1 -0
- package/dist/modules/ai/index.js +2 -0
- package/dist/modules/ai/node/actions.d.ts +4 -0
- package/dist/modules/ai/node/actions.js +16 -0
- package/dist/modules/ai/node/index.d.ts +2 -0
- package/dist/modules/ai/node/index.js +3 -0
- package/dist/modules/ai/node/service.d.ts +5 -0
- package/dist/modules/ai/node/service.js +12 -0
- package/dist/modules/index.d.ts +6 -0
- package/dist/modules/index.js +7 -0
- package/dist/modules/task/action.d.ts +201 -0
- package/dist/modules/task/action.js +147 -0
- package/dist/modules/task/index.d.ts +4 -0
- package/dist/modules/task/index.js +5 -0
- package/dist/modules/task/schema.d.ts +107 -0
- package/dist/modules/task/schema.js +44 -0
- package/dist/modules/task/service.d.ts +19 -0
- package/dist/modules/task/service.js +43 -0
- package/dist/modules/task/types.d.ts +84 -0
- package/dist/modules/task/types.js +2 -0
- package/dist/modules/tenant/actions.d.ts +49 -0
- package/dist/modules/tenant/actions.js +38 -0
- package/dist/modules/tenant/index.d.ts +3 -0
- package/dist/modules/tenant/index.js +4 -0
- package/dist/modules/tenant/tenant.d.ts +32 -0
- package/dist/modules/tenant/tenant.js +125 -0
- package/dist/modules/tenant/types.d.ts +11 -0
- package/dist/modules/tenant/types.js +2 -0
- package/dist/modules/waitlist/action.d.ts +71 -0
- package/dist/modules/waitlist/action.js +78 -0
- package/dist/modules/waitlist/index.d.ts +4 -0
- package/dist/modules/waitlist/index.js +5 -0
- package/dist/modules/waitlist/schema.d.ts +39 -0
- package/dist/modules/waitlist/schema.js +18 -0
- package/dist/modules/waitlist/service.d.ts +13 -0
- package/dist/modules/waitlist/service.js +28 -0
- package/dist/modules/waitlist/types.d.ts +14 -0
- package/dist/modules/waitlist/types.js +2 -0
- package/dist/permission.d.ts +43 -0
- package/dist/permission.js +54 -0
- package/dist/query.d.ts +194 -0
- package/dist/query.js +204 -0
- package/dist/role.d.ts +70 -0
- package/dist/role.js +94 -0
- package/dist/schemas/nodes.d.ts +0 -0
- package/dist/schemas/nodes.js +1 -0
- package/dist/service-client.d.ts +7 -0
- package/dist/service-client.js +14 -0
- package/dist/service.d.ts +11 -0
- package/dist/service.js +23 -0
- package/dist/services/applets.d.ts +9 -0
- package/dist/services/applets.js +40 -0
- package/dist/services/avatars.d.ts +115 -0
- package/dist/services/avatars.js +251 -0
- package/dist/services/chat-flow.d.ts +7 -0
- package/dist/services/chat-flow.js +26 -0
- package/dist/services/community.d.ts +19 -0
- package/dist/services/community.js +69 -0
- package/dist/services/configuration.d.ts +5 -0
- package/dist/services/configuration.js +11 -0
- package/dist/services/databases.d.ts +613 -0
- package/dist/services/databases.js +1736 -0
- package/dist/services/functions.d.ts +319 -0
- package/dist/services/functions.js +810 -0
- package/dist/services/graphql.d.ts +25 -0
- package/dist/services/graphql.js +57 -0
- package/dist/services/health.d.ts +231 -0
- package/dist/services/health.js +463 -0
- package/dist/services/locale.d.ts +80 -0
- package/dist/services/locale.js +144 -0
- package/dist/services/messaging.d.ts +685 -0
- package/dist/services/messaging.js +1920 -0
- package/dist/services/permissions.d.ts +20 -0
- package/dist/services/permissions.js +90 -0
- package/dist/services/pricing.d.ts +15 -0
- package/dist/services/pricing.js +21 -0
- package/dist/services/projects.d.ts +542 -0
- package/dist/services/projects.js +1526 -0
- package/dist/services/roles.d.ts +19 -0
- package/dist/services/roles.js +72 -0
- package/dist/services/schema.d.ts +17 -0
- package/dist/services/schema.js +48 -0
- package/dist/services/storage.d.ts +189 -0
- package/dist/services/storage.js +474 -0
- package/dist/services/subscription.d.ts +15 -0
- package/dist/services/subscription.js +30 -0
- package/dist/services/teams.d.ts +167 -0
- package/dist/services/teams.js +395 -0
- package/dist/services/tenant-subscription.d.ts +12 -0
- package/dist/services/tenant-subscription.js +52 -0
- package/dist/services/users.d.ts +499 -0
- package/dist/services/users.js +1283 -0
- package/package.json +3 -3
@@ -0,0 +1,1920 @@
|
|
1
|
+
import { AppcondaException } from '../client';
|
2
|
+
export class Messaging {
|
3
|
+
constructor(client) {
|
4
|
+
this.client = client;
|
5
|
+
}
|
6
|
+
/**
|
7
|
+
* List messages
|
8
|
+
*
|
9
|
+
* Get a list of all messages from the current Appconda project.
|
10
|
+
*
|
11
|
+
* @param {string[]} queries
|
12
|
+
* @param {string} search
|
13
|
+
* @throws {AppcondaException}
|
14
|
+
* @returns {Promise<Models.MessageList>}
|
15
|
+
*/
|
16
|
+
async listMessages(queries, search) {
|
17
|
+
const apiPath = '/messaging/messages';
|
18
|
+
const payload = {};
|
19
|
+
if (typeof queries !== 'undefined') {
|
20
|
+
payload['queries'] = queries;
|
21
|
+
}
|
22
|
+
if (typeof search !== 'undefined') {
|
23
|
+
payload['search'] = search;
|
24
|
+
}
|
25
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
26
|
+
const apiHeaders = {
|
27
|
+
'content-type': 'application/json',
|
28
|
+
};
|
29
|
+
return await this.client.call('get', uri, apiHeaders, payload);
|
30
|
+
}
|
31
|
+
/**
|
32
|
+
* Create email
|
33
|
+
*
|
34
|
+
* Create a new email message.
|
35
|
+
*
|
36
|
+
* @param {string} messageId
|
37
|
+
* @param {string} subject
|
38
|
+
* @param {string} content
|
39
|
+
* @param {string[]} topics
|
40
|
+
* @param {string[]} users
|
41
|
+
* @param {string[]} targets
|
42
|
+
* @param {string[]} cc
|
43
|
+
* @param {string[]} bcc
|
44
|
+
* @param {string[]} attachments
|
45
|
+
* @param {boolean} draft
|
46
|
+
* @param {boolean} html
|
47
|
+
* @param {string} scheduledAt
|
48
|
+
* @throws {AppcondaException}
|
49
|
+
* @returns {Promise<Models.Message>}
|
50
|
+
*/
|
51
|
+
async createEmail(messageId, subject, content, topics, users, targets, cc, bcc, attachments, draft, html, scheduledAt) {
|
52
|
+
if (typeof messageId === 'undefined') {
|
53
|
+
throw new AppcondaException('Missing required parameter: "messageId"');
|
54
|
+
}
|
55
|
+
if (typeof subject === 'undefined') {
|
56
|
+
throw new AppcondaException('Missing required parameter: "subject"');
|
57
|
+
}
|
58
|
+
if (typeof content === 'undefined') {
|
59
|
+
throw new AppcondaException('Missing required parameter: "content"');
|
60
|
+
}
|
61
|
+
const apiPath = '/messaging/messages/email';
|
62
|
+
const payload = {};
|
63
|
+
if (typeof messageId !== 'undefined') {
|
64
|
+
payload['messageId'] = messageId;
|
65
|
+
}
|
66
|
+
if (typeof subject !== 'undefined') {
|
67
|
+
payload['subject'] = subject;
|
68
|
+
}
|
69
|
+
if (typeof content !== 'undefined') {
|
70
|
+
payload['content'] = content;
|
71
|
+
}
|
72
|
+
if (typeof topics !== 'undefined') {
|
73
|
+
payload['topics'] = topics;
|
74
|
+
}
|
75
|
+
if (typeof users !== 'undefined') {
|
76
|
+
payload['users'] = users;
|
77
|
+
}
|
78
|
+
if (typeof targets !== 'undefined') {
|
79
|
+
payload['targets'] = targets;
|
80
|
+
}
|
81
|
+
if (typeof cc !== 'undefined') {
|
82
|
+
payload['cc'] = cc;
|
83
|
+
}
|
84
|
+
if (typeof bcc !== 'undefined') {
|
85
|
+
payload['bcc'] = bcc;
|
86
|
+
}
|
87
|
+
if (typeof attachments !== 'undefined') {
|
88
|
+
payload['attachments'] = attachments;
|
89
|
+
}
|
90
|
+
if (typeof draft !== 'undefined') {
|
91
|
+
payload['draft'] = draft;
|
92
|
+
}
|
93
|
+
if (typeof html !== 'undefined') {
|
94
|
+
payload['html'] = html;
|
95
|
+
}
|
96
|
+
if (typeof scheduledAt !== 'undefined') {
|
97
|
+
payload['scheduledAt'] = scheduledAt;
|
98
|
+
}
|
99
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
100
|
+
const apiHeaders = {
|
101
|
+
'content-type': 'application/json',
|
102
|
+
};
|
103
|
+
return await this.client.call('post', uri, apiHeaders, payload);
|
104
|
+
}
|
105
|
+
/**
|
106
|
+
* Update email
|
107
|
+
*
|
108
|
+
* Update an email message by its unique ID.
|
109
|
+
|
110
|
+
*
|
111
|
+
* @param {string} messageId
|
112
|
+
* @param {string[]} topics
|
113
|
+
* @param {string[]} users
|
114
|
+
* @param {string[]} targets
|
115
|
+
* @param {string} subject
|
116
|
+
* @param {string} content
|
117
|
+
* @param {boolean} draft
|
118
|
+
* @param {boolean} html
|
119
|
+
* @param {string[]} cc
|
120
|
+
* @param {string[]} bcc
|
121
|
+
* @param {string} scheduledAt
|
122
|
+
* @param {string[]} attachments
|
123
|
+
* @throws {AppcondaException}
|
124
|
+
* @returns {Promise<Models.Message>}
|
125
|
+
*/
|
126
|
+
async updateEmail(messageId, topics, users, targets, subject, content, draft, html, cc, bcc, scheduledAt, attachments) {
|
127
|
+
if (typeof messageId === 'undefined') {
|
128
|
+
throw new AppcondaException('Missing required parameter: "messageId"');
|
129
|
+
}
|
130
|
+
const apiPath = '/messaging/messages/email/{messageId}'.replace('{messageId}', messageId);
|
131
|
+
const payload = {};
|
132
|
+
if (typeof topics !== 'undefined') {
|
133
|
+
payload['topics'] = topics;
|
134
|
+
}
|
135
|
+
if (typeof users !== 'undefined') {
|
136
|
+
payload['users'] = users;
|
137
|
+
}
|
138
|
+
if (typeof targets !== 'undefined') {
|
139
|
+
payload['targets'] = targets;
|
140
|
+
}
|
141
|
+
if (typeof subject !== 'undefined') {
|
142
|
+
payload['subject'] = subject;
|
143
|
+
}
|
144
|
+
if (typeof content !== 'undefined') {
|
145
|
+
payload['content'] = content;
|
146
|
+
}
|
147
|
+
if (typeof draft !== 'undefined') {
|
148
|
+
payload['draft'] = draft;
|
149
|
+
}
|
150
|
+
if (typeof html !== 'undefined') {
|
151
|
+
payload['html'] = html;
|
152
|
+
}
|
153
|
+
if (typeof cc !== 'undefined') {
|
154
|
+
payload['cc'] = cc;
|
155
|
+
}
|
156
|
+
if (typeof bcc !== 'undefined') {
|
157
|
+
payload['bcc'] = bcc;
|
158
|
+
}
|
159
|
+
if (typeof scheduledAt !== 'undefined') {
|
160
|
+
payload['scheduledAt'] = scheduledAt;
|
161
|
+
}
|
162
|
+
if (typeof attachments !== 'undefined') {
|
163
|
+
payload['attachments'] = attachments;
|
164
|
+
}
|
165
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
166
|
+
const apiHeaders = {
|
167
|
+
'content-type': 'application/json',
|
168
|
+
};
|
169
|
+
return await this.client.call('patch', uri, apiHeaders, payload);
|
170
|
+
}
|
171
|
+
/**
|
172
|
+
* Create push notification
|
173
|
+
*
|
174
|
+
* Create a new push notification.
|
175
|
+
*
|
176
|
+
* @param {string} messageId
|
177
|
+
* @param {string} title
|
178
|
+
* @param {string} body
|
179
|
+
* @param {string[]} topics
|
180
|
+
* @param {string[]} users
|
181
|
+
* @param {string[]} targets
|
182
|
+
* @param {object} data
|
183
|
+
* @param {string} action
|
184
|
+
* @param {string} image
|
185
|
+
* @param {string} icon
|
186
|
+
* @param {string} sound
|
187
|
+
* @param {string} color
|
188
|
+
* @param {string} tag
|
189
|
+
* @param {string} badge
|
190
|
+
* @param {boolean} draft
|
191
|
+
* @param {string} scheduledAt
|
192
|
+
* @throws {AppcondaException}
|
193
|
+
* @returns {Promise<Models.Message>}
|
194
|
+
*/
|
195
|
+
async createPush(messageId, title, body, topics, users, targets, data, action, image, icon, sound, color, tag, badge, draft, scheduledAt) {
|
196
|
+
if (typeof messageId === 'undefined') {
|
197
|
+
throw new AppcondaException('Missing required parameter: "messageId"');
|
198
|
+
}
|
199
|
+
if (typeof title === 'undefined') {
|
200
|
+
throw new AppcondaException('Missing required parameter: "title"');
|
201
|
+
}
|
202
|
+
if (typeof body === 'undefined') {
|
203
|
+
throw new AppcondaException('Missing required parameter: "body"');
|
204
|
+
}
|
205
|
+
const apiPath = '/messaging/messages/push';
|
206
|
+
const payload = {};
|
207
|
+
if (typeof messageId !== 'undefined') {
|
208
|
+
payload['messageId'] = messageId;
|
209
|
+
}
|
210
|
+
if (typeof title !== 'undefined') {
|
211
|
+
payload['title'] = title;
|
212
|
+
}
|
213
|
+
if (typeof body !== 'undefined') {
|
214
|
+
payload['body'] = body;
|
215
|
+
}
|
216
|
+
if (typeof topics !== 'undefined') {
|
217
|
+
payload['topics'] = topics;
|
218
|
+
}
|
219
|
+
if (typeof users !== 'undefined') {
|
220
|
+
payload['users'] = users;
|
221
|
+
}
|
222
|
+
if (typeof targets !== 'undefined') {
|
223
|
+
payload['targets'] = targets;
|
224
|
+
}
|
225
|
+
if (typeof data !== 'undefined') {
|
226
|
+
payload['data'] = data;
|
227
|
+
}
|
228
|
+
if (typeof action !== 'undefined') {
|
229
|
+
payload['action'] = action;
|
230
|
+
}
|
231
|
+
if (typeof image !== 'undefined') {
|
232
|
+
payload['image'] = image;
|
233
|
+
}
|
234
|
+
if (typeof icon !== 'undefined') {
|
235
|
+
payload['icon'] = icon;
|
236
|
+
}
|
237
|
+
if (typeof sound !== 'undefined') {
|
238
|
+
payload['sound'] = sound;
|
239
|
+
}
|
240
|
+
if (typeof color !== 'undefined') {
|
241
|
+
payload['color'] = color;
|
242
|
+
}
|
243
|
+
if (typeof tag !== 'undefined') {
|
244
|
+
payload['tag'] = tag;
|
245
|
+
}
|
246
|
+
if (typeof badge !== 'undefined') {
|
247
|
+
payload['badge'] = badge;
|
248
|
+
}
|
249
|
+
if (typeof draft !== 'undefined') {
|
250
|
+
payload['draft'] = draft;
|
251
|
+
}
|
252
|
+
if (typeof scheduledAt !== 'undefined') {
|
253
|
+
payload['scheduledAt'] = scheduledAt;
|
254
|
+
}
|
255
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
256
|
+
const apiHeaders = {
|
257
|
+
'content-type': 'application/json',
|
258
|
+
};
|
259
|
+
return await this.client.call('post', uri, apiHeaders, payload);
|
260
|
+
}
|
261
|
+
/**
|
262
|
+
* Update push notification
|
263
|
+
*
|
264
|
+
* Update a push notification by its unique ID.
|
265
|
+
|
266
|
+
*
|
267
|
+
* @param {string} messageId
|
268
|
+
* @param {string[]} topics
|
269
|
+
* @param {string[]} users
|
270
|
+
* @param {string[]} targets
|
271
|
+
* @param {string} title
|
272
|
+
* @param {string} body
|
273
|
+
* @param {object} data
|
274
|
+
* @param {string} action
|
275
|
+
* @param {string} image
|
276
|
+
* @param {string} icon
|
277
|
+
* @param {string} sound
|
278
|
+
* @param {string} color
|
279
|
+
* @param {string} tag
|
280
|
+
* @param {number} badge
|
281
|
+
* @param {boolean} draft
|
282
|
+
* @param {string} scheduledAt
|
283
|
+
* @throws {AppcondaException}
|
284
|
+
* @returns {Promise<Models.Message>}
|
285
|
+
*/
|
286
|
+
async updatePush(messageId, topics, users, targets, title, body, data, action, image, icon, sound, color, tag, badge, draft, scheduledAt) {
|
287
|
+
if (typeof messageId === 'undefined') {
|
288
|
+
throw new AppcondaException('Missing required parameter: "messageId"');
|
289
|
+
}
|
290
|
+
const apiPath = '/messaging/messages/push/{messageId}'.replace('{messageId}', messageId);
|
291
|
+
const payload = {};
|
292
|
+
if (typeof topics !== 'undefined') {
|
293
|
+
payload['topics'] = topics;
|
294
|
+
}
|
295
|
+
if (typeof users !== 'undefined') {
|
296
|
+
payload['users'] = users;
|
297
|
+
}
|
298
|
+
if (typeof targets !== 'undefined') {
|
299
|
+
payload['targets'] = targets;
|
300
|
+
}
|
301
|
+
if (typeof title !== 'undefined') {
|
302
|
+
payload['title'] = title;
|
303
|
+
}
|
304
|
+
if (typeof body !== 'undefined') {
|
305
|
+
payload['body'] = body;
|
306
|
+
}
|
307
|
+
if (typeof data !== 'undefined') {
|
308
|
+
payload['data'] = data;
|
309
|
+
}
|
310
|
+
if (typeof action !== 'undefined') {
|
311
|
+
payload['action'] = action;
|
312
|
+
}
|
313
|
+
if (typeof image !== 'undefined') {
|
314
|
+
payload['image'] = image;
|
315
|
+
}
|
316
|
+
if (typeof icon !== 'undefined') {
|
317
|
+
payload['icon'] = icon;
|
318
|
+
}
|
319
|
+
if (typeof sound !== 'undefined') {
|
320
|
+
payload['sound'] = sound;
|
321
|
+
}
|
322
|
+
if (typeof color !== 'undefined') {
|
323
|
+
payload['color'] = color;
|
324
|
+
}
|
325
|
+
if (typeof tag !== 'undefined') {
|
326
|
+
payload['tag'] = tag;
|
327
|
+
}
|
328
|
+
if (typeof badge !== 'undefined') {
|
329
|
+
payload['badge'] = badge;
|
330
|
+
}
|
331
|
+
if (typeof draft !== 'undefined') {
|
332
|
+
payload['draft'] = draft;
|
333
|
+
}
|
334
|
+
if (typeof scheduledAt !== 'undefined') {
|
335
|
+
payload['scheduledAt'] = scheduledAt;
|
336
|
+
}
|
337
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
338
|
+
const apiHeaders = {
|
339
|
+
'content-type': 'application/json',
|
340
|
+
};
|
341
|
+
return await this.client.call('patch', uri, apiHeaders, payload);
|
342
|
+
}
|
343
|
+
/**
|
344
|
+
* Create SMS
|
345
|
+
*
|
346
|
+
* Create a new SMS message.
|
347
|
+
*
|
348
|
+
* @param {string} messageId
|
349
|
+
* @param {string} content
|
350
|
+
* @param {string[]} topics
|
351
|
+
* @param {string[]} users
|
352
|
+
* @param {string[]} targets
|
353
|
+
* @param {boolean} draft
|
354
|
+
* @param {string} scheduledAt
|
355
|
+
* @throws {AppcondaException}
|
356
|
+
* @returns {Promise<Models.Message>}
|
357
|
+
*/
|
358
|
+
async createSms(messageId, content, topics, users, targets, draft, scheduledAt) {
|
359
|
+
if (typeof messageId === 'undefined') {
|
360
|
+
throw new AppcondaException('Missing required parameter: "messageId"');
|
361
|
+
}
|
362
|
+
if (typeof content === 'undefined') {
|
363
|
+
throw new AppcondaException('Missing required parameter: "content"');
|
364
|
+
}
|
365
|
+
const apiPath = '/messaging/messages/sms';
|
366
|
+
const payload = {};
|
367
|
+
if (typeof messageId !== 'undefined') {
|
368
|
+
payload['messageId'] = messageId;
|
369
|
+
}
|
370
|
+
if (typeof content !== 'undefined') {
|
371
|
+
payload['content'] = content;
|
372
|
+
}
|
373
|
+
if (typeof topics !== 'undefined') {
|
374
|
+
payload['topics'] = topics;
|
375
|
+
}
|
376
|
+
if (typeof users !== 'undefined') {
|
377
|
+
payload['users'] = users;
|
378
|
+
}
|
379
|
+
if (typeof targets !== 'undefined') {
|
380
|
+
payload['targets'] = targets;
|
381
|
+
}
|
382
|
+
if (typeof draft !== 'undefined') {
|
383
|
+
payload['draft'] = draft;
|
384
|
+
}
|
385
|
+
if (typeof scheduledAt !== 'undefined') {
|
386
|
+
payload['scheduledAt'] = scheduledAt;
|
387
|
+
}
|
388
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
389
|
+
const apiHeaders = {
|
390
|
+
'content-type': 'application/json',
|
391
|
+
};
|
392
|
+
return await this.client.call('post', uri, apiHeaders, payload);
|
393
|
+
}
|
394
|
+
/**
|
395
|
+
* Update SMS
|
396
|
+
*
|
397
|
+
* Update an email message by its unique ID.
|
398
|
+
|
399
|
+
*
|
400
|
+
* @param {string} messageId
|
401
|
+
* @param {string[]} topics
|
402
|
+
* @param {string[]} users
|
403
|
+
* @param {string[]} targets
|
404
|
+
* @param {string} content
|
405
|
+
* @param {boolean} draft
|
406
|
+
* @param {string} scheduledAt
|
407
|
+
* @throws {AppcondaException}
|
408
|
+
* @returns {Promise<Models.Message>}
|
409
|
+
*/
|
410
|
+
async updateSms(messageId, topics, users, targets, content, draft, scheduledAt) {
|
411
|
+
if (typeof messageId === 'undefined') {
|
412
|
+
throw new AppcondaException('Missing required parameter: "messageId"');
|
413
|
+
}
|
414
|
+
const apiPath = '/messaging/messages/sms/{messageId}'.replace('{messageId}', messageId);
|
415
|
+
const payload = {};
|
416
|
+
if (typeof topics !== 'undefined') {
|
417
|
+
payload['topics'] = topics;
|
418
|
+
}
|
419
|
+
if (typeof users !== 'undefined') {
|
420
|
+
payload['users'] = users;
|
421
|
+
}
|
422
|
+
if (typeof targets !== 'undefined') {
|
423
|
+
payload['targets'] = targets;
|
424
|
+
}
|
425
|
+
if (typeof content !== 'undefined') {
|
426
|
+
payload['content'] = content;
|
427
|
+
}
|
428
|
+
if (typeof draft !== 'undefined') {
|
429
|
+
payload['draft'] = draft;
|
430
|
+
}
|
431
|
+
if (typeof scheduledAt !== 'undefined') {
|
432
|
+
payload['scheduledAt'] = scheduledAt;
|
433
|
+
}
|
434
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
435
|
+
const apiHeaders = {
|
436
|
+
'content-type': 'application/json',
|
437
|
+
};
|
438
|
+
return await this.client.call('patch', uri, apiHeaders, payload);
|
439
|
+
}
|
440
|
+
/**
|
441
|
+
* Get message
|
442
|
+
*
|
443
|
+
* Get a message by its unique ID.
|
444
|
+
|
445
|
+
*
|
446
|
+
* @param {string} messageId
|
447
|
+
* @throws {AppcondaException}
|
448
|
+
* @returns {Promise<Models.Message>}
|
449
|
+
*/
|
450
|
+
async getMessage(messageId) {
|
451
|
+
if (typeof messageId === 'undefined') {
|
452
|
+
throw new AppcondaException('Missing required parameter: "messageId"');
|
453
|
+
}
|
454
|
+
const apiPath = '/messaging/messages/{messageId}'.replace('{messageId}', messageId);
|
455
|
+
const payload = {};
|
456
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
457
|
+
const apiHeaders = {
|
458
|
+
'content-type': 'application/json',
|
459
|
+
};
|
460
|
+
return await this.client.call('get', uri, apiHeaders, payload);
|
461
|
+
}
|
462
|
+
/**
|
463
|
+
* Delete message
|
464
|
+
*
|
465
|
+
* Delete a message. If the message is not a draft or scheduled, but has been sent, this will not recall the message.
|
466
|
+
*
|
467
|
+
* @param {string} messageId
|
468
|
+
* @throws {AppcondaException}
|
469
|
+
* @returns {Promise<{}>}
|
470
|
+
*/
|
471
|
+
async delete(messageId) {
|
472
|
+
if (typeof messageId === 'undefined') {
|
473
|
+
throw new AppcondaException('Missing required parameter: "messageId"');
|
474
|
+
}
|
475
|
+
const apiPath = '/messaging/messages/{messageId}'.replace('{messageId}', messageId);
|
476
|
+
const payload = {};
|
477
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
478
|
+
const apiHeaders = {
|
479
|
+
'content-type': 'application/json',
|
480
|
+
};
|
481
|
+
return await this.client.call('delete', uri, apiHeaders, payload);
|
482
|
+
}
|
483
|
+
/**
|
484
|
+
* List message logs
|
485
|
+
*
|
486
|
+
* Get the message activity logs listed by its unique ID.
|
487
|
+
*
|
488
|
+
* @param {string} messageId
|
489
|
+
* @param {string[]} queries
|
490
|
+
* @throws {AppcondaException}
|
491
|
+
* @returns {Promise<Models.LogList>}
|
492
|
+
*/
|
493
|
+
async listMessageLogs(messageId, queries) {
|
494
|
+
if (typeof messageId === 'undefined') {
|
495
|
+
throw new AppcondaException('Missing required parameter: "messageId"');
|
496
|
+
}
|
497
|
+
const apiPath = '/messaging/messages/{messageId}/logs'.replace('{messageId}', messageId);
|
498
|
+
const payload = {};
|
499
|
+
if (typeof queries !== 'undefined') {
|
500
|
+
payload['queries'] = queries;
|
501
|
+
}
|
502
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
503
|
+
const apiHeaders = {
|
504
|
+
'content-type': 'application/json',
|
505
|
+
};
|
506
|
+
return await this.client.call('get', uri, apiHeaders, payload);
|
507
|
+
}
|
508
|
+
/**
|
509
|
+
* List message targets
|
510
|
+
*
|
511
|
+
* Get a list of the targets associated with a message.
|
512
|
+
*
|
513
|
+
* @param {string} messageId
|
514
|
+
* @param {string[]} queries
|
515
|
+
* @throws {AppcondaException}
|
516
|
+
* @returns {Promise<Models.TargetList>}
|
517
|
+
*/
|
518
|
+
async listTargets(messageId, queries) {
|
519
|
+
if (typeof messageId === 'undefined') {
|
520
|
+
throw new AppcondaException('Missing required parameter: "messageId"');
|
521
|
+
}
|
522
|
+
const apiPath = '/messaging/messages/{messageId}/targets'.replace('{messageId}', messageId);
|
523
|
+
const payload = {};
|
524
|
+
if (typeof queries !== 'undefined') {
|
525
|
+
payload['queries'] = queries;
|
526
|
+
}
|
527
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
528
|
+
const apiHeaders = {
|
529
|
+
'content-type': 'application/json',
|
530
|
+
};
|
531
|
+
return await this.client.call('get', uri, apiHeaders, payload);
|
532
|
+
}
|
533
|
+
/**
|
534
|
+
* List providers
|
535
|
+
*
|
536
|
+
* Get a list of all providers from the current Appconda project.
|
537
|
+
*
|
538
|
+
* @param {string[]} queries
|
539
|
+
* @param {string} search
|
540
|
+
* @throws {AppcondaException}
|
541
|
+
* @returns {Promise<Models.ProviderList>}
|
542
|
+
*/
|
543
|
+
async listProviders(queries, search) {
|
544
|
+
const apiPath = '/messaging/providers';
|
545
|
+
const payload = {};
|
546
|
+
if (typeof queries !== 'undefined') {
|
547
|
+
payload['queries'] = queries;
|
548
|
+
}
|
549
|
+
if (typeof search !== 'undefined') {
|
550
|
+
payload['search'] = search;
|
551
|
+
}
|
552
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
553
|
+
const apiHeaders = {
|
554
|
+
'content-type': 'application/json',
|
555
|
+
};
|
556
|
+
return await this.client.call('get', uri, apiHeaders, payload);
|
557
|
+
}
|
558
|
+
/**
|
559
|
+
* Create APNS provider
|
560
|
+
*
|
561
|
+
* Create a new Apple Push Notification service provider.
|
562
|
+
*
|
563
|
+
* @param {string} providerId
|
564
|
+
* @param {string} name
|
565
|
+
* @param {string} authKey
|
566
|
+
* @param {string} authKeyId
|
567
|
+
* @param {string} teamId
|
568
|
+
* @param {string} bundleId
|
569
|
+
* @param {boolean} sandbox
|
570
|
+
* @param {boolean} enabled
|
571
|
+
* @throws {AppcondaException}
|
572
|
+
* @returns {Promise<Models.Provider>}
|
573
|
+
*/
|
574
|
+
async createApnsProvider(providerId, name, authKey, authKeyId, teamId, bundleId, sandbox, enabled) {
|
575
|
+
if (typeof providerId === 'undefined') {
|
576
|
+
throw new AppcondaException('Missing required parameter: "providerId"');
|
577
|
+
}
|
578
|
+
if (typeof name === 'undefined') {
|
579
|
+
throw new AppcondaException('Missing required parameter: "name"');
|
580
|
+
}
|
581
|
+
const apiPath = '/messaging/providers/apns';
|
582
|
+
const payload = {};
|
583
|
+
if (typeof providerId !== 'undefined') {
|
584
|
+
payload['providerId'] = providerId;
|
585
|
+
}
|
586
|
+
if (typeof name !== 'undefined') {
|
587
|
+
payload['name'] = name;
|
588
|
+
}
|
589
|
+
if (typeof authKey !== 'undefined') {
|
590
|
+
payload['authKey'] = authKey;
|
591
|
+
}
|
592
|
+
if (typeof authKeyId !== 'undefined') {
|
593
|
+
payload['authKeyId'] = authKeyId;
|
594
|
+
}
|
595
|
+
if (typeof teamId !== 'undefined') {
|
596
|
+
payload['teamId'] = teamId;
|
597
|
+
}
|
598
|
+
if (typeof bundleId !== 'undefined') {
|
599
|
+
payload['bundleId'] = bundleId;
|
600
|
+
}
|
601
|
+
if (typeof sandbox !== 'undefined') {
|
602
|
+
payload['sandbox'] = sandbox;
|
603
|
+
}
|
604
|
+
if (typeof enabled !== 'undefined') {
|
605
|
+
payload['enabled'] = enabled;
|
606
|
+
}
|
607
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
608
|
+
const apiHeaders = {
|
609
|
+
'content-type': 'application/json',
|
610
|
+
};
|
611
|
+
return await this.client.call('post', uri, apiHeaders, payload);
|
612
|
+
}
|
613
|
+
/**
|
614
|
+
* Update APNS provider
|
615
|
+
*
|
616
|
+
* Update a Apple Push Notification service provider by its unique ID.
|
617
|
+
*
|
618
|
+
* @param {string} providerId
|
619
|
+
* @param {string} name
|
620
|
+
* @param {boolean} enabled
|
621
|
+
* @param {string} authKey
|
622
|
+
* @param {string} authKeyId
|
623
|
+
* @param {string} teamId
|
624
|
+
* @param {string} bundleId
|
625
|
+
* @param {boolean} sandbox
|
626
|
+
* @throws {AppcondaException}
|
627
|
+
* @returns {Promise<Models.Provider>}
|
628
|
+
*/
|
629
|
+
async updateApnsProvider(providerId, name, enabled, authKey, authKeyId, teamId, bundleId, sandbox) {
|
630
|
+
if (typeof providerId === 'undefined') {
|
631
|
+
throw new AppcondaException('Missing required parameter: "providerId"');
|
632
|
+
}
|
633
|
+
const apiPath = '/messaging/providers/apns/{providerId}'.replace('{providerId}', providerId);
|
634
|
+
const payload = {};
|
635
|
+
if (typeof name !== 'undefined') {
|
636
|
+
payload['name'] = name;
|
637
|
+
}
|
638
|
+
if (typeof enabled !== 'undefined') {
|
639
|
+
payload['enabled'] = enabled;
|
640
|
+
}
|
641
|
+
if (typeof authKey !== 'undefined') {
|
642
|
+
payload['authKey'] = authKey;
|
643
|
+
}
|
644
|
+
if (typeof authKeyId !== 'undefined') {
|
645
|
+
payload['authKeyId'] = authKeyId;
|
646
|
+
}
|
647
|
+
if (typeof teamId !== 'undefined') {
|
648
|
+
payload['teamId'] = teamId;
|
649
|
+
}
|
650
|
+
if (typeof bundleId !== 'undefined') {
|
651
|
+
payload['bundleId'] = bundleId;
|
652
|
+
}
|
653
|
+
if (typeof sandbox !== 'undefined') {
|
654
|
+
payload['sandbox'] = sandbox;
|
655
|
+
}
|
656
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
657
|
+
const apiHeaders = {
|
658
|
+
'content-type': 'application/json',
|
659
|
+
};
|
660
|
+
return await this.client.call('patch', uri, apiHeaders, payload);
|
661
|
+
}
|
662
|
+
/**
|
663
|
+
* Create FCM provider
|
664
|
+
*
|
665
|
+
* Create a new Firebase Cloud Messaging provider.
|
666
|
+
*
|
667
|
+
* @param {string} providerId
|
668
|
+
* @param {string} name
|
669
|
+
* @param {object} serviceAccountJSON
|
670
|
+
* @param {boolean} enabled
|
671
|
+
* @throws {AppcondaException}
|
672
|
+
* @returns {Promise<Models.Provider>}
|
673
|
+
*/
|
674
|
+
async createFcmProvider(providerId, name, serviceAccountJSON, enabled) {
|
675
|
+
if (typeof providerId === 'undefined') {
|
676
|
+
throw new AppcondaException('Missing required parameter: "providerId"');
|
677
|
+
}
|
678
|
+
if (typeof name === 'undefined') {
|
679
|
+
throw new AppcondaException('Missing required parameter: "name"');
|
680
|
+
}
|
681
|
+
const apiPath = '/messaging/providers/fcm';
|
682
|
+
const payload = {};
|
683
|
+
if (typeof providerId !== 'undefined') {
|
684
|
+
payload['providerId'] = providerId;
|
685
|
+
}
|
686
|
+
if (typeof name !== 'undefined') {
|
687
|
+
payload['name'] = name;
|
688
|
+
}
|
689
|
+
if (typeof serviceAccountJSON !== 'undefined') {
|
690
|
+
payload['serviceAccountJSON'] = serviceAccountJSON;
|
691
|
+
}
|
692
|
+
if (typeof enabled !== 'undefined') {
|
693
|
+
payload['enabled'] = enabled;
|
694
|
+
}
|
695
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
696
|
+
const apiHeaders = {
|
697
|
+
'content-type': 'application/json',
|
698
|
+
};
|
699
|
+
return await this.client.call('post', uri, apiHeaders, payload);
|
700
|
+
}
|
701
|
+
/**
|
702
|
+
* Update FCM provider
|
703
|
+
*
|
704
|
+
* Update a Firebase Cloud Messaging provider by its unique ID.
|
705
|
+
*
|
706
|
+
* @param {string} providerId
|
707
|
+
* @param {string} name
|
708
|
+
* @param {boolean} enabled
|
709
|
+
* @param {object} serviceAccountJSON
|
710
|
+
* @throws {AppcondaException}
|
711
|
+
* @returns {Promise<Models.Provider>}
|
712
|
+
*/
|
713
|
+
async updateFcmProvider(providerId, name, enabled, serviceAccountJSON) {
|
714
|
+
if (typeof providerId === 'undefined') {
|
715
|
+
throw new AppcondaException('Missing required parameter: "providerId"');
|
716
|
+
}
|
717
|
+
const apiPath = '/messaging/providers/fcm/{providerId}'.replace('{providerId}', providerId);
|
718
|
+
const payload = {};
|
719
|
+
if (typeof name !== 'undefined') {
|
720
|
+
payload['name'] = name;
|
721
|
+
}
|
722
|
+
if (typeof enabled !== 'undefined') {
|
723
|
+
payload['enabled'] = enabled;
|
724
|
+
}
|
725
|
+
if (typeof serviceAccountJSON !== 'undefined') {
|
726
|
+
payload['serviceAccountJSON'] = serviceAccountJSON;
|
727
|
+
}
|
728
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
729
|
+
const apiHeaders = {
|
730
|
+
'content-type': 'application/json',
|
731
|
+
};
|
732
|
+
return await this.client.call('patch', uri, apiHeaders, payload);
|
733
|
+
}
|
734
|
+
/**
|
735
|
+
* Create Mailgun provider
|
736
|
+
*
|
737
|
+
* Create a new Mailgun provider.
|
738
|
+
*
|
739
|
+
* @param {string} providerId
|
740
|
+
* @param {string} name
|
741
|
+
* @param {string} apiKey
|
742
|
+
* @param {string} domain
|
743
|
+
* @param {boolean} isEuRegion
|
744
|
+
* @param {string} fromName
|
745
|
+
* @param {string} fromEmail
|
746
|
+
* @param {string} replyToName
|
747
|
+
* @param {string} replyToEmail
|
748
|
+
* @param {boolean} enabled
|
749
|
+
* @throws {AppcondaException}
|
750
|
+
* @returns {Promise<Models.Provider>}
|
751
|
+
*/
|
752
|
+
async createMailgunProvider(providerId, name, apiKey, domain, isEuRegion, fromName, fromEmail, replyToName, replyToEmail, enabled) {
|
753
|
+
if (typeof providerId === 'undefined') {
|
754
|
+
throw new AppcondaException('Missing required parameter: "providerId"');
|
755
|
+
}
|
756
|
+
if (typeof name === 'undefined') {
|
757
|
+
throw new AppcondaException('Missing required parameter: "name"');
|
758
|
+
}
|
759
|
+
const apiPath = '/messaging/providers/mailgun';
|
760
|
+
const payload = {};
|
761
|
+
if (typeof providerId !== 'undefined') {
|
762
|
+
payload['providerId'] = providerId;
|
763
|
+
}
|
764
|
+
if (typeof name !== 'undefined') {
|
765
|
+
payload['name'] = name;
|
766
|
+
}
|
767
|
+
if (typeof apiKey !== 'undefined') {
|
768
|
+
payload['apiKey'] = apiKey;
|
769
|
+
}
|
770
|
+
if (typeof domain !== 'undefined') {
|
771
|
+
payload['domain'] = domain;
|
772
|
+
}
|
773
|
+
if (typeof isEuRegion !== 'undefined') {
|
774
|
+
payload['isEuRegion'] = isEuRegion;
|
775
|
+
}
|
776
|
+
if (typeof fromName !== 'undefined') {
|
777
|
+
payload['fromName'] = fromName;
|
778
|
+
}
|
779
|
+
if (typeof fromEmail !== 'undefined') {
|
780
|
+
payload['fromEmail'] = fromEmail;
|
781
|
+
}
|
782
|
+
if (typeof replyToName !== 'undefined') {
|
783
|
+
payload['replyToName'] = replyToName;
|
784
|
+
}
|
785
|
+
if (typeof replyToEmail !== 'undefined') {
|
786
|
+
payload['replyToEmail'] = replyToEmail;
|
787
|
+
}
|
788
|
+
if (typeof enabled !== 'undefined') {
|
789
|
+
payload['enabled'] = enabled;
|
790
|
+
}
|
791
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
792
|
+
const apiHeaders = {
|
793
|
+
'content-type': 'application/json',
|
794
|
+
};
|
795
|
+
return await this.client.call('post', uri, apiHeaders, payload);
|
796
|
+
}
|
797
|
+
/**
|
798
|
+
* Update Mailgun provider
|
799
|
+
*
|
800
|
+
* Update a Mailgun provider by its unique ID.
|
801
|
+
*
|
802
|
+
* @param {string} providerId
|
803
|
+
* @param {string} name
|
804
|
+
* @param {string} apiKey
|
805
|
+
* @param {string} domain
|
806
|
+
* @param {boolean} isEuRegion
|
807
|
+
* @param {boolean} enabled
|
808
|
+
* @param {string} fromName
|
809
|
+
* @param {string} fromEmail
|
810
|
+
* @param {string} replyToName
|
811
|
+
* @param {string} replyToEmail
|
812
|
+
* @throws {AppcondaException}
|
813
|
+
* @returns {Promise<Models.Provider>}
|
814
|
+
*/
|
815
|
+
async updateMailgunProvider(providerId, name, apiKey, domain, isEuRegion, enabled, fromName, fromEmail, replyToName, replyToEmail) {
|
816
|
+
if (typeof providerId === 'undefined') {
|
817
|
+
throw new AppcondaException('Missing required parameter: "providerId"');
|
818
|
+
}
|
819
|
+
const apiPath = '/messaging/providers/mailgun/{providerId}'.replace('{providerId}', providerId);
|
820
|
+
const payload = {};
|
821
|
+
if (typeof name !== 'undefined') {
|
822
|
+
payload['name'] = name;
|
823
|
+
}
|
824
|
+
if (typeof apiKey !== 'undefined') {
|
825
|
+
payload['apiKey'] = apiKey;
|
826
|
+
}
|
827
|
+
if (typeof domain !== 'undefined') {
|
828
|
+
payload['domain'] = domain;
|
829
|
+
}
|
830
|
+
if (typeof isEuRegion !== 'undefined') {
|
831
|
+
payload['isEuRegion'] = isEuRegion;
|
832
|
+
}
|
833
|
+
if (typeof enabled !== 'undefined') {
|
834
|
+
payload['enabled'] = enabled;
|
835
|
+
}
|
836
|
+
if (typeof fromName !== 'undefined') {
|
837
|
+
payload['fromName'] = fromName;
|
838
|
+
}
|
839
|
+
if (typeof fromEmail !== 'undefined') {
|
840
|
+
payload['fromEmail'] = fromEmail;
|
841
|
+
}
|
842
|
+
if (typeof replyToName !== 'undefined') {
|
843
|
+
payload['replyToName'] = replyToName;
|
844
|
+
}
|
845
|
+
if (typeof replyToEmail !== 'undefined') {
|
846
|
+
payload['replyToEmail'] = replyToEmail;
|
847
|
+
}
|
848
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
849
|
+
const apiHeaders = {
|
850
|
+
'content-type': 'application/json',
|
851
|
+
};
|
852
|
+
return await this.client.call('patch', uri, apiHeaders, payload);
|
853
|
+
}
|
854
|
+
/**
|
855
|
+
* Create Msg91 provider
|
856
|
+
*
|
857
|
+
* Create a new MSG91 provider.
|
858
|
+
*
|
859
|
+
* @param {string} providerId
|
860
|
+
* @param {string} name
|
861
|
+
* @param {string} templateId
|
862
|
+
* @param {string} senderId
|
863
|
+
* @param {string} authKey
|
864
|
+
* @param {boolean} enabled
|
865
|
+
* @throws {AppcondaException}
|
866
|
+
* @returns {Promise<Models.Provider>}
|
867
|
+
*/
|
868
|
+
async createMsg91Provider(providerId, name, templateId, senderId, authKey, enabled) {
|
869
|
+
if (typeof providerId === 'undefined') {
|
870
|
+
throw new AppcondaException('Missing required parameter: "providerId"');
|
871
|
+
}
|
872
|
+
if (typeof name === 'undefined') {
|
873
|
+
throw new AppcondaException('Missing required parameter: "name"');
|
874
|
+
}
|
875
|
+
const apiPath = '/messaging/providers/msg91';
|
876
|
+
const payload = {};
|
877
|
+
if (typeof providerId !== 'undefined') {
|
878
|
+
payload['providerId'] = providerId;
|
879
|
+
}
|
880
|
+
if (typeof name !== 'undefined') {
|
881
|
+
payload['name'] = name;
|
882
|
+
}
|
883
|
+
if (typeof templateId !== 'undefined') {
|
884
|
+
payload['templateId'] = templateId;
|
885
|
+
}
|
886
|
+
if (typeof senderId !== 'undefined') {
|
887
|
+
payload['senderId'] = senderId;
|
888
|
+
}
|
889
|
+
if (typeof authKey !== 'undefined') {
|
890
|
+
payload['authKey'] = authKey;
|
891
|
+
}
|
892
|
+
if (typeof enabled !== 'undefined') {
|
893
|
+
payload['enabled'] = enabled;
|
894
|
+
}
|
895
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
896
|
+
const apiHeaders = {
|
897
|
+
'content-type': 'application/json',
|
898
|
+
};
|
899
|
+
return await this.client.call('post', uri, apiHeaders, payload);
|
900
|
+
}
|
901
|
+
/**
|
902
|
+
* Update Msg91 provider
|
903
|
+
*
|
904
|
+
* Update a MSG91 provider by its unique ID.
|
905
|
+
*
|
906
|
+
* @param {string} providerId
|
907
|
+
* @param {string} name
|
908
|
+
* @param {boolean} enabled
|
909
|
+
* @param {string} templateId
|
910
|
+
* @param {string} senderId
|
911
|
+
* @param {string} authKey
|
912
|
+
* @throws {AppcondaException}
|
913
|
+
* @returns {Promise<Models.Provider>}
|
914
|
+
*/
|
915
|
+
async updateMsg91Provider(providerId, name, enabled, templateId, senderId, authKey) {
|
916
|
+
if (typeof providerId === 'undefined') {
|
917
|
+
throw new AppcondaException('Missing required parameter: "providerId"');
|
918
|
+
}
|
919
|
+
const apiPath = '/messaging/providers/msg91/{providerId}'.replace('{providerId}', providerId);
|
920
|
+
const payload = {};
|
921
|
+
if (typeof name !== 'undefined') {
|
922
|
+
payload['name'] = name;
|
923
|
+
}
|
924
|
+
if (typeof enabled !== 'undefined') {
|
925
|
+
payload['enabled'] = enabled;
|
926
|
+
}
|
927
|
+
if (typeof templateId !== 'undefined') {
|
928
|
+
payload['templateId'] = templateId;
|
929
|
+
}
|
930
|
+
if (typeof senderId !== 'undefined') {
|
931
|
+
payload['senderId'] = senderId;
|
932
|
+
}
|
933
|
+
if (typeof authKey !== 'undefined') {
|
934
|
+
payload['authKey'] = authKey;
|
935
|
+
}
|
936
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
937
|
+
const apiHeaders = {
|
938
|
+
'content-type': 'application/json',
|
939
|
+
};
|
940
|
+
return await this.client.call('patch', uri, apiHeaders, payload);
|
941
|
+
}
|
942
|
+
/**
|
943
|
+
* Create Sendgrid provider
|
944
|
+
*
|
945
|
+
* Create a new Sendgrid provider.
|
946
|
+
*
|
947
|
+
* @param {string} providerId
|
948
|
+
* @param {string} name
|
949
|
+
* @param {string} apiKey
|
950
|
+
* @param {string} fromName
|
951
|
+
* @param {string} fromEmail
|
952
|
+
* @param {string} replyToName
|
953
|
+
* @param {string} replyToEmail
|
954
|
+
* @param {boolean} enabled
|
955
|
+
* @throws {AppcondaException}
|
956
|
+
* @returns {Promise<Models.Provider>}
|
957
|
+
*/
|
958
|
+
async createSendgridProvider(providerId, name, apiKey, fromName, fromEmail, replyToName, replyToEmail, enabled) {
|
959
|
+
if (typeof providerId === 'undefined') {
|
960
|
+
throw new AppcondaException('Missing required parameter: "providerId"');
|
961
|
+
}
|
962
|
+
if (typeof name === 'undefined') {
|
963
|
+
throw new AppcondaException('Missing required parameter: "name"');
|
964
|
+
}
|
965
|
+
const apiPath = '/messaging/providers/sendgrid';
|
966
|
+
const payload = {};
|
967
|
+
if (typeof providerId !== 'undefined') {
|
968
|
+
payload['providerId'] = providerId;
|
969
|
+
}
|
970
|
+
if (typeof name !== 'undefined') {
|
971
|
+
payload['name'] = name;
|
972
|
+
}
|
973
|
+
if (typeof apiKey !== 'undefined') {
|
974
|
+
payload['apiKey'] = apiKey;
|
975
|
+
}
|
976
|
+
if (typeof fromName !== 'undefined') {
|
977
|
+
payload['fromName'] = fromName;
|
978
|
+
}
|
979
|
+
if (typeof fromEmail !== 'undefined') {
|
980
|
+
payload['fromEmail'] = fromEmail;
|
981
|
+
}
|
982
|
+
if (typeof replyToName !== 'undefined') {
|
983
|
+
payload['replyToName'] = replyToName;
|
984
|
+
}
|
985
|
+
if (typeof replyToEmail !== 'undefined') {
|
986
|
+
payload['replyToEmail'] = replyToEmail;
|
987
|
+
}
|
988
|
+
if (typeof enabled !== 'undefined') {
|
989
|
+
payload['enabled'] = enabled;
|
990
|
+
}
|
991
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
992
|
+
const apiHeaders = {
|
993
|
+
'content-type': 'application/json',
|
994
|
+
};
|
995
|
+
return await this.client.call('post', uri, apiHeaders, payload);
|
996
|
+
}
|
997
|
+
/**
|
998
|
+
* Update Sendgrid provider
|
999
|
+
*
|
1000
|
+
* Update a Sendgrid provider by its unique ID.
|
1001
|
+
*
|
1002
|
+
* @param {string} providerId
|
1003
|
+
* @param {string} name
|
1004
|
+
* @param {boolean} enabled
|
1005
|
+
* @param {string} apiKey
|
1006
|
+
* @param {string} fromName
|
1007
|
+
* @param {string} fromEmail
|
1008
|
+
* @param {string} replyToName
|
1009
|
+
* @param {string} replyToEmail
|
1010
|
+
* @throws {AppcondaException}
|
1011
|
+
* @returns {Promise<Models.Provider>}
|
1012
|
+
*/
|
1013
|
+
async updateSendgridProvider(providerId, name, enabled, apiKey, fromName, fromEmail, replyToName, replyToEmail) {
|
1014
|
+
if (typeof providerId === 'undefined') {
|
1015
|
+
throw new AppcondaException('Missing required parameter: "providerId"');
|
1016
|
+
}
|
1017
|
+
const apiPath = '/messaging/providers/sendgrid/{providerId}'.replace('{providerId}', providerId);
|
1018
|
+
const payload = {};
|
1019
|
+
if (typeof name !== 'undefined') {
|
1020
|
+
payload['name'] = name;
|
1021
|
+
}
|
1022
|
+
if (typeof enabled !== 'undefined') {
|
1023
|
+
payload['enabled'] = enabled;
|
1024
|
+
}
|
1025
|
+
if (typeof apiKey !== 'undefined') {
|
1026
|
+
payload['apiKey'] = apiKey;
|
1027
|
+
}
|
1028
|
+
if (typeof fromName !== 'undefined') {
|
1029
|
+
payload['fromName'] = fromName;
|
1030
|
+
}
|
1031
|
+
if (typeof fromEmail !== 'undefined') {
|
1032
|
+
payload['fromEmail'] = fromEmail;
|
1033
|
+
}
|
1034
|
+
if (typeof replyToName !== 'undefined') {
|
1035
|
+
payload['replyToName'] = replyToName;
|
1036
|
+
}
|
1037
|
+
if (typeof replyToEmail !== 'undefined') {
|
1038
|
+
payload['replyToEmail'] = replyToEmail;
|
1039
|
+
}
|
1040
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
1041
|
+
const apiHeaders = {
|
1042
|
+
'content-type': 'application/json',
|
1043
|
+
};
|
1044
|
+
return await this.client.call('patch', uri, apiHeaders, payload);
|
1045
|
+
}
|
1046
|
+
/**
|
1047
|
+
* Create SMTP provider
|
1048
|
+
*
|
1049
|
+
* Create a new SMTP provider.
|
1050
|
+
*
|
1051
|
+
* @param {string} providerId
|
1052
|
+
* @param {string} name
|
1053
|
+
* @param {string} host
|
1054
|
+
* @param {number} port
|
1055
|
+
* @param {string} username
|
1056
|
+
* @param {string} password
|
1057
|
+
* @param {SmtpEncryption} encryption
|
1058
|
+
* @param {boolean} autoTLS
|
1059
|
+
* @param {string} mailer
|
1060
|
+
* @param {string} fromName
|
1061
|
+
* @param {string} fromEmail
|
1062
|
+
* @param {string} replyToName
|
1063
|
+
* @param {string} replyToEmail
|
1064
|
+
* @param {boolean} enabled
|
1065
|
+
* @throws {AppcondaException}
|
1066
|
+
* @returns {Promise<Models.Provider>}
|
1067
|
+
*/
|
1068
|
+
async createSmtpProvider(providerId, name, host, port, username, password, encryption, autoTLS, mailer, fromName, fromEmail, replyToName, replyToEmail, enabled) {
|
1069
|
+
if (typeof providerId === 'undefined') {
|
1070
|
+
throw new AppcondaException('Missing required parameter: "providerId"');
|
1071
|
+
}
|
1072
|
+
if (typeof name === 'undefined') {
|
1073
|
+
throw new AppcondaException('Missing required parameter: "name"');
|
1074
|
+
}
|
1075
|
+
if (typeof host === 'undefined') {
|
1076
|
+
throw new AppcondaException('Missing required parameter: "host"');
|
1077
|
+
}
|
1078
|
+
const apiPath = '/messaging/providers/smtp';
|
1079
|
+
const payload = {};
|
1080
|
+
if (typeof providerId !== 'undefined') {
|
1081
|
+
payload['providerId'] = providerId;
|
1082
|
+
}
|
1083
|
+
if (typeof name !== 'undefined') {
|
1084
|
+
payload['name'] = name;
|
1085
|
+
}
|
1086
|
+
if (typeof host !== 'undefined') {
|
1087
|
+
payload['host'] = host;
|
1088
|
+
}
|
1089
|
+
if (typeof port !== 'undefined') {
|
1090
|
+
payload['port'] = port;
|
1091
|
+
}
|
1092
|
+
if (typeof username !== 'undefined') {
|
1093
|
+
payload['username'] = username;
|
1094
|
+
}
|
1095
|
+
if (typeof password !== 'undefined') {
|
1096
|
+
payload['password'] = password;
|
1097
|
+
}
|
1098
|
+
if (typeof encryption !== 'undefined') {
|
1099
|
+
payload['encryption'] = encryption;
|
1100
|
+
}
|
1101
|
+
if (typeof autoTLS !== 'undefined') {
|
1102
|
+
payload['autoTLS'] = autoTLS;
|
1103
|
+
}
|
1104
|
+
if (typeof mailer !== 'undefined') {
|
1105
|
+
payload['mailer'] = mailer;
|
1106
|
+
}
|
1107
|
+
if (typeof fromName !== 'undefined') {
|
1108
|
+
payload['fromName'] = fromName;
|
1109
|
+
}
|
1110
|
+
if (typeof fromEmail !== 'undefined') {
|
1111
|
+
payload['fromEmail'] = fromEmail;
|
1112
|
+
}
|
1113
|
+
if (typeof replyToName !== 'undefined') {
|
1114
|
+
payload['replyToName'] = replyToName;
|
1115
|
+
}
|
1116
|
+
if (typeof replyToEmail !== 'undefined') {
|
1117
|
+
payload['replyToEmail'] = replyToEmail;
|
1118
|
+
}
|
1119
|
+
if (typeof enabled !== 'undefined') {
|
1120
|
+
payload['enabled'] = enabled;
|
1121
|
+
}
|
1122
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
1123
|
+
const apiHeaders = {
|
1124
|
+
'content-type': 'application/json',
|
1125
|
+
};
|
1126
|
+
return await this.client.call('post', uri, apiHeaders, payload);
|
1127
|
+
}
|
1128
|
+
/**
|
1129
|
+
* Update SMTP provider
|
1130
|
+
*
|
1131
|
+
* Update a SMTP provider by its unique ID.
|
1132
|
+
*
|
1133
|
+
* @param {string} providerId
|
1134
|
+
* @param {string} name
|
1135
|
+
* @param {string} host
|
1136
|
+
* @param {number} port
|
1137
|
+
* @param {string} username
|
1138
|
+
* @param {string} password
|
1139
|
+
* @param {SmtpEncryption} encryption
|
1140
|
+
* @param {boolean} autoTLS
|
1141
|
+
* @param {string} mailer
|
1142
|
+
* @param {string} fromName
|
1143
|
+
* @param {string} fromEmail
|
1144
|
+
* @param {string} replyToName
|
1145
|
+
* @param {string} replyToEmail
|
1146
|
+
* @param {boolean} enabled
|
1147
|
+
* @throws {AppcondaException}
|
1148
|
+
* @returns {Promise<Models.Provider>}
|
1149
|
+
*/
|
1150
|
+
async updateSmtpProvider(providerId, name, host, port, username, password, encryption, autoTLS, mailer, fromName, fromEmail, replyToName, replyToEmail, enabled) {
|
1151
|
+
if (typeof providerId === 'undefined') {
|
1152
|
+
throw new AppcondaException('Missing required parameter: "providerId"');
|
1153
|
+
}
|
1154
|
+
const apiPath = '/messaging/providers/smtp/{providerId}'.replace('{providerId}', providerId);
|
1155
|
+
const payload = {};
|
1156
|
+
if (typeof name !== 'undefined') {
|
1157
|
+
payload['name'] = name;
|
1158
|
+
}
|
1159
|
+
if (typeof host !== 'undefined') {
|
1160
|
+
payload['host'] = host;
|
1161
|
+
}
|
1162
|
+
if (typeof port !== 'undefined') {
|
1163
|
+
payload['port'] = port;
|
1164
|
+
}
|
1165
|
+
if (typeof username !== 'undefined') {
|
1166
|
+
payload['username'] = username;
|
1167
|
+
}
|
1168
|
+
if (typeof password !== 'undefined') {
|
1169
|
+
payload['password'] = password;
|
1170
|
+
}
|
1171
|
+
if (typeof encryption !== 'undefined') {
|
1172
|
+
payload['encryption'] = encryption;
|
1173
|
+
}
|
1174
|
+
if (typeof autoTLS !== 'undefined') {
|
1175
|
+
payload['autoTLS'] = autoTLS;
|
1176
|
+
}
|
1177
|
+
if (typeof mailer !== 'undefined') {
|
1178
|
+
payload['mailer'] = mailer;
|
1179
|
+
}
|
1180
|
+
if (typeof fromName !== 'undefined') {
|
1181
|
+
payload['fromName'] = fromName;
|
1182
|
+
}
|
1183
|
+
if (typeof fromEmail !== 'undefined') {
|
1184
|
+
payload['fromEmail'] = fromEmail;
|
1185
|
+
}
|
1186
|
+
if (typeof replyToName !== 'undefined') {
|
1187
|
+
payload['replyToName'] = replyToName;
|
1188
|
+
}
|
1189
|
+
if (typeof replyToEmail !== 'undefined') {
|
1190
|
+
payload['replyToEmail'] = replyToEmail;
|
1191
|
+
}
|
1192
|
+
if (typeof enabled !== 'undefined') {
|
1193
|
+
payload['enabled'] = enabled;
|
1194
|
+
}
|
1195
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
1196
|
+
const apiHeaders = {
|
1197
|
+
'content-type': 'application/json',
|
1198
|
+
};
|
1199
|
+
return await this.client.call('patch', uri, apiHeaders, payload);
|
1200
|
+
}
|
1201
|
+
/**
|
1202
|
+
* Create Telesign provider
|
1203
|
+
*
|
1204
|
+
* Create a new Telesign provider.
|
1205
|
+
*
|
1206
|
+
* @param {string} providerId
|
1207
|
+
* @param {string} name
|
1208
|
+
* @param {string} from
|
1209
|
+
* @param {string} customerId
|
1210
|
+
* @param {string} apiKey
|
1211
|
+
* @param {boolean} enabled
|
1212
|
+
* @throws {AppcondaException}
|
1213
|
+
* @returns {Promise<Models.Provider>}
|
1214
|
+
*/
|
1215
|
+
async createTelesignProvider(providerId, name, from, customerId, apiKey, enabled) {
|
1216
|
+
if (typeof providerId === 'undefined') {
|
1217
|
+
throw new AppcondaException('Missing required parameter: "providerId"');
|
1218
|
+
}
|
1219
|
+
if (typeof name === 'undefined') {
|
1220
|
+
throw new AppcondaException('Missing required parameter: "name"');
|
1221
|
+
}
|
1222
|
+
const apiPath = '/messaging/providers/telesign';
|
1223
|
+
const payload = {};
|
1224
|
+
if (typeof providerId !== 'undefined') {
|
1225
|
+
payload['providerId'] = providerId;
|
1226
|
+
}
|
1227
|
+
if (typeof name !== 'undefined') {
|
1228
|
+
payload['name'] = name;
|
1229
|
+
}
|
1230
|
+
if (typeof from !== 'undefined') {
|
1231
|
+
payload['from'] = from;
|
1232
|
+
}
|
1233
|
+
if (typeof customerId !== 'undefined') {
|
1234
|
+
payload['customerId'] = customerId;
|
1235
|
+
}
|
1236
|
+
if (typeof apiKey !== 'undefined') {
|
1237
|
+
payload['apiKey'] = apiKey;
|
1238
|
+
}
|
1239
|
+
if (typeof enabled !== 'undefined') {
|
1240
|
+
payload['enabled'] = enabled;
|
1241
|
+
}
|
1242
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
1243
|
+
const apiHeaders = {
|
1244
|
+
'content-type': 'application/json',
|
1245
|
+
};
|
1246
|
+
return await this.client.call('post', uri, apiHeaders, payload);
|
1247
|
+
}
|
1248
|
+
/**
|
1249
|
+
* Update Telesign provider
|
1250
|
+
*
|
1251
|
+
* Update a Telesign provider by its unique ID.
|
1252
|
+
*
|
1253
|
+
* @param {string} providerId
|
1254
|
+
* @param {string} name
|
1255
|
+
* @param {boolean} enabled
|
1256
|
+
* @param {string} customerId
|
1257
|
+
* @param {string} apiKey
|
1258
|
+
* @param {string} from
|
1259
|
+
* @throws {AppcondaException}
|
1260
|
+
* @returns {Promise<Models.Provider>}
|
1261
|
+
*/
|
1262
|
+
async updateTelesignProvider(providerId, name, enabled, customerId, apiKey, from) {
|
1263
|
+
if (typeof providerId === 'undefined') {
|
1264
|
+
throw new AppcondaException('Missing required parameter: "providerId"');
|
1265
|
+
}
|
1266
|
+
const apiPath = '/messaging/providers/telesign/{providerId}'.replace('{providerId}', providerId);
|
1267
|
+
const payload = {};
|
1268
|
+
if (typeof name !== 'undefined') {
|
1269
|
+
payload['name'] = name;
|
1270
|
+
}
|
1271
|
+
if (typeof enabled !== 'undefined') {
|
1272
|
+
payload['enabled'] = enabled;
|
1273
|
+
}
|
1274
|
+
if (typeof customerId !== 'undefined') {
|
1275
|
+
payload['customerId'] = customerId;
|
1276
|
+
}
|
1277
|
+
if (typeof apiKey !== 'undefined') {
|
1278
|
+
payload['apiKey'] = apiKey;
|
1279
|
+
}
|
1280
|
+
if (typeof from !== 'undefined') {
|
1281
|
+
payload['from'] = from;
|
1282
|
+
}
|
1283
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
1284
|
+
const apiHeaders = {
|
1285
|
+
'content-type': 'application/json',
|
1286
|
+
};
|
1287
|
+
return await this.client.call('patch', uri, apiHeaders, payload);
|
1288
|
+
}
|
1289
|
+
/**
|
1290
|
+
* Create Textmagic provider
|
1291
|
+
*
|
1292
|
+
* Create a new Textmagic provider.
|
1293
|
+
*
|
1294
|
+
* @param {string} providerId
|
1295
|
+
* @param {string} name
|
1296
|
+
* @param {string} from
|
1297
|
+
* @param {string} username
|
1298
|
+
* @param {string} apiKey
|
1299
|
+
* @param {boolean} enabled
|
1300
|
+
* @throws {AppcondaException}
|
1301
|
+
* @returns {Promise<Models.Provider>}
|
1302
|
+
*/
|
1303
|
+
async createTextmagicProvider(providerId, name, from, username, apiKey, enabled) {
|
1304
|
+
if (typeof providerId === 'undefined') {
|
1305
|
+
throw new AppcondaException('Missing required parameter: "providerId"');
|
1306
|
+
}
|
1307
|
+
if (typeof name === 'undefined') {
|
1308
|
+
throw new AppcondaException('Missing required parameter: "name"');
|
1309
|
+
}
|
1310
|
+
const apiPath = '/messaging/providers/textmagic';
|
1311
|
+
const payload = {};
|
1312
|
+
if (typeof providerId !== 'undefined') {
|
1313
|
+
payload['providerId'] = providerId;
|
1314
|
+
}
|
1315
|
+
if (typeof name !== 'undefined') {
|
1316
|
+
payload['name'] = name;
|
1317
|
+
}
|
1318
|
+
if (typeof from !== 'undefined') {
|
1319
|
+
payload['from'] = from;
|
1320
|
+
}
|
1321
|
+
if (typeof username !== 'undefined') {
|
1322
|
+
payload['username'] = username;
|
1323
|
+
}
|
1324
|
+
if (typeof apiKey !== 'undefined') {
|
1325
|
+
payload['apiKey'] = apiKey;
|
1326
|
+
}
|
1327
|
+
if (typeof enabled !== 'undefined') {
|
1328
|
+
payload['enabled'] = enabled;
|
1329
|
+
}
|
1330
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
1331
|
+
const apiHeaders = {
|
1332
|
+
'content-type': 'application/json',
|
1333
|
+
};
|
1334
|
+
return await this.client.call('post', uri, apiHeaders, payload);
|
1335
|
+
}
|
1336
|
+
/**
|
1337
|
+
* Update Textmagic provider
|
1338
|
+
*
|
1339
|
+
* Update a Textmagic provider by its unique ID.
|
1340
|
+
*
|
1341
|
+
* @param {string} providerId
|
1342
|
+
* @param {string} name
|
1343
|
+
* @param {boolean} enabled
|
1344
|
+
* @param {string} username
|
1345
|
+
* @param {string} apiKey
|
1346
|
+
* @param {string} from
|
1347
|
+
* @throws {AppcondaException}
|
1348
|
+
* @returns {Promise<Models.Provider>}
|
1349
|
+
*/
|
1350
|
+
async updateTextmagicProvider(providerId, name, enabled, username, apiKey, from) {
|
1351
|
+
if (typeof providerId === 'undefined') {
|
1352
|
+
throw new AppcondaException('Missing required parameter: "providerId"');
|
1353
|
+
}
|
1354
|
+
const apiPath = '/messaging/providers/textmagic/{providerId}'.replace('{providerId}', providerId);
|
1355
|
+
const payload = {};
|
1356
|
+
if (typeof name !== 'undefined') {
|
1357
|
+
payload['name'] = name;
|
1358
|
+
}
|
1359
|
+
if (typeof enabled !== 'undefined') {
|
1360
|
+
payload['enabled'] = enabled;
|
1361
|
+
}
|
1362
|
+
if (typeof username !== 'undefined') {
|
1363
|
+
payload['username'] = username;
|
1364
|
+
}
|
1365
|
+
if (typeof apiKey !== 'undefined') {
|
1366
|
+
payload['apiKey'] = apiKey;
|
1367
|
+
}
|
1368
|
+
if (typeof from !== 'undefined') {
|
1369
|
+
payload['from'] = from;
|
1370
|
+
}
|
1371
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
1372
|
+
const apiHeaders = {
|
1373
|
+
'content-type': 'application/json',
|
1374
|
+
};
|
1375
|
+
return await this.client.call('patch', uri, apiHeaders, payload);
|
1376
|
+
}
|
1377
|
+
/**
|
1378
|
+
* Create Twilio provider
|
1379
|
+
*
|
1380
|
+
* Create a new Twilio provider.
|
1381
|
+
*
|
1382
|
+
* @param {string} providerId
|
1383
|
+
* @param {string} name
|
1384
|
+
* @param {string} from
|
1385
|
+
* @param {string} accountSid
|
1386
|
+
* @param {string} authToken
|
1387
|
+
* @param {boolean} enabled
|
1388
|
+
* @throws {AppcondaException}
|
1389
|
+
* @returns {Promise<Models.Provider>}
|
1390
|
+
*/
|
1391
|
+
async createTwilioProvider(providerId, name, from, accountSid, authToken, enabled) {
|
1392
|
+
if (typeof providerId === 'undefined') {
|
1393
|
+
throw new AppcondaException('Missing required parameter: "providerId"');
|
1394
|
+
}
|
1395
|
+
if (typeof name === 'undefined') {
|
1396
|
+
throw new AppcondaException('Missing required parameter: "name"');
|
1397
|
+
}
|
1398
|
+
const apiPath = '/messaging/providers/twilio';
|
1399
|
+
const payload = {};
|
1400
|
+
if (typeof providerId !== 'undefined') {
|
1401
|
+
payload['providerId'] = providerId;
|
1402
|
+
}
|
1403
|
+
if (typeof name !== 'undefined') {
|
1404
|
+
payload['name'] = name;
|
1405
|
+
}
|
1406
|
+
if (typeof from !== 'undefined') {
|
1407
|
+
payload['from'] = from;
|
1408
|
+
}
|
1409
|
+
if (typeof accountSid !== 'undefined') {
|
1410
|
+
payload['accountSid'] = accountSid;
|
1411
|
+
}
|
1412
|
+
if (typeof authToken !== 'undefined') {
|
1413
|
+
payload['authToken'] = authToken;
|
1414
|
+
}
|
1415
|
+
if (typeof enabled !== 'undefined') {
|
1416
|
+
payload['enabled'] = enabled;
|
1417
|
+
}
|
1418
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
1419
|
+
const apiHeaders = {
|
1420
|
+
'content-type': 'application/json',
|
1421
|
+
};
|
1422
|
+
return await this.client.call('post', uri, apiHeaders, payload);
|
1423
|
+
}
|
1424
|
+
/**
|
1425
|
+
* Update Twilio provider
|
1426
|
+
*
|
1427
|
+
* Update a Twilio provider by its unique ID.
|
1428
|
+
*
|
1429
|
+
* @param {string} providerId
|
1430
|
+
* @param {string} name
|
1431
|
+
* @param {boolean} enabled
|
1432
|
+
* @param {string} accountSid
|
1433
|
+
* @param {string} authToken
|
1434
|
+
* @param {string} from
|
1435
|
+
* @throws {AppcondaException}
|
1436
|
+
* @returns {Promise<Models.Provider>}
|
1437
|
+
*/
|
1438
|
+
async updateTwilioProvider(providerId, name, enabled, accountSid, authToken, from) {
|
1439
|
+
if (typeof providerId === 'undefined') {
|
1440
|
+
throw new AppcondaException('Missing required parameter: "providerId"');
|
1441
|
+
}
|
1442
|
+
const apiPath = '/messaging/providers/twilio/{providerId}'.replace('{providerId}', providerId);
|
1443
|
+
const payload = {};
|
1444
|
+
if (typeof name !== 'undefined') {
|
1445
|
+
payload['name'] = name;
|
1446
|
+
}
|
1447
|
+
if (typeof enabled !== 'undefined') {
|
1448
|
+
payload['enabled'] = enabled;
|
1449
|
+
}
|
1450
|
+
if (typeof accountSid !== 'undefined') {
|
1451
|
+
payload['accountSid'] = accountSid;
|
1452
|
+
}
|
1453
|
+
if (typeof authToken !== 'undefined') {
|
1454
|
+
payload['authToken'] = authToken;
|
1455
|
+
}
|
1456
|
+
if (typeof from !== 'undefined') {
|
1457
|
+
payload['from'] = from;
|
1458
|
+
}
|
1459
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
1460
|
+
const apiHeaders = {
|
1461
|
+
'content-type': 'application/json',
|
1462
|
+
};
|
1463
|
+
return await this.client.call('patch', uri, apiHeaders, payload);
|
1464
|
+
}
|
1465
|
+
/**
|
1466
|
+
* Create Vonage provider
|
1467
|
+
*
|
1468
|
+
* Create a new Vonage provider.
|
1469
|
+
*
|
1470
|
+
* @param {string} providerId
|
1471
|
+
* @param {string} name
|
1472
|
+
* @param {string} from
|
1473
|
+
* @param {string} apiKey
|
1474
|
+
* @param {string} apiSecret
|
1475
|
+
* @param {boolean} enabled
|
1476
|
+
* @throws {AppcondaException}
|
1477
|
+
* @returns {Promise<Models.Provider>}
|
1478
|
+
*/
|
1479
|
+
async createVonageProvider(providerId, name, from, apiKey, apiSecret, enabled) {
|
1480
|
+
if (typeof providerId === 'undefined') {
|
1481
|
+
throw new AppcondaException('Missing required parameter: "providerId"');
|
1482
|
+
}
|
1483
|
+
if (typeof name === 'undefined') {
|
1484
|
+
throw new AppcondaException('Missing required parameter: "name"');
|
1485
|
+
}
|
1486
|
+
const apiPath = '/messaging/providers/vonage';
|
1487
|
+
const payload = {};
|
1488
|
+
if (typeof providerId !== 'undefined') {
|
1489
|
+
payload['providerId'] = providerId;
|
1490
|
+
}
|
1491
|
+
if (typeof name !== 'undefined') {
|
1492
|
+
payload['name'] = name;
|
1493
|
+
}
|
1494
|
+
if (typeof from !== 'undefined') {
|
1495
|
+
payload['from'] = from;
|
1496
|
+
}
|
1497
|
+
if (typeof apiKey !== 'undefined') {
|
1498
|
+
payload['apiKey'] = apiKey;
|
1499
|
+
}
|
1500
|
+
if (typeof apiSecret !== 'undefined') {
|
1501
|
+
payload['apiSecret'] = apiSecret;
|
1502
|
+
}
|
1503
|
+
if (typeof enabled !== 'undefined') {
|
1504
|
+
payload['enabled'] = enabled;
|
1505
|
+
}
|
1506
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
1507
|
+
const apiHeaders = {
|
1508
|
+
'content-type': 'application/json',
|
1509
|
+
};
|
1510
|
+
return await this.client.call('post', uri, apiHeaders, payload);
|
1511
|
+
}
|
1512
|
+
/**
|
1513
|
+
* Update Vonage provider
|
1514
|
+
*
|
1515
|
+
* Update a Vonage provider by its unique ID.
|
1516
|
+
*
|
1517
|
+
* @param {string} providerId
|
1518
|
+
* @param {string} name
|
1519
|
+
* @param {boolean} enabled
|
1520
|
+
* @param {string} apiKey
|
1521
|
+
* @param {string} apiSecret
|
1522
|
+
* @param {string} from
|
1523
|
+
* @throws {AppcondaException}
|
1524
|
+
* @returns {Promise<Models.Provider>}
|
1525
|
+
*/
|
1526
|
+
async updateVonageProvider(providerId, name, enabled, apiKey, apiSecret, from) {
|
1527
|
+
if (typeof providerId === 'undefined') {
|
1528
|
+
throw new AppcondaException('Missing required parameter: "providerId"');
|
1529
|
+
}
|
1530
|
+
const apiPath = '/messaging/providers/vonage/{providerId}'.replace('{providerId}', providerId);
|
1531
|
+
const payload = {};
|
1532
|
+
if (typeof name !== 'undefined') {
|
1533
|
+
payload['name'] = name;
|
1534
|
+
}
|
1535
|
+
if (typeof enabled !== 'undefined') {
|
1536
|
+
payload['enabled'] = enabled;
|
1537
|
+
}
|
1538
|
+
if (typeof apiKey !== 'undefined') {
|
1539
|
+
payload['apiKey'] = apiKey;
|
1540
|
+
}
|
1541
|
+
if (typeof apiSecret !== 'undefined') {
|
1542
|
+
payload['apiSecret'] = apiSecret;
|
1543
|
+
}
|
1544
|
+
if (typeof from !== 'undefined') {
|
1545
|
+
payload['from'] = from;
|
1546
|
+
}
|
1547
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
1548
|
+
const apiHeaders = {
|
1549
|
+
'content-type': 'application/json',
|
1550
|
+
};
|
1551
|
+
return await this.client.call('patch', uri, apiHeaders, payload);
|
1552
|
+
}
|
1553
|
+
/**
|
1554
|
+
* Get provider
|
1555
|
+
*
|
1556
|
+
* Get a provider by its unique ID.
|
1557
|
+
|
1558
|
+
*
|
1559
|
+
* @param {string} providerId
|
1560
|
+
* @throws {AppcondaException}
|
1561
|
+
* @returns {Promise<Models.Provider>}
|
1562
|
+
*/
|
1563
|
+
async getProvider(providerId) {
|
1564
|
+
if (typeof providerId === 'undefined') {
|
1565
|
+
throw new AppcondaException('Missing required parameter: "providerId"');
|
1566
|
+
}
|
1567
|
+
const apiPath = '/messaging/providers/{providerId}'.replace('{providerId}', providerId);
|
1568
|
+
const payload = {};
|
1569
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
1570
|
+
const apiHeaders = {
|
1571
|
+
'content-type': 'application/json',
|
1572
|
+
};
|
1573
|
+
return await this.client.call('get', uri, apiHeaders, payload);
|
1574
|
+
}
|
1575
|
+
/**
|
1576
|
+
* Delete provider
|
1577
|
+
*
|
1578
|
+
* Delete a provider by its unique ID.
|
1579
|
+
*
|
1580
|
+
* @param {string} providerId
|
1581
|
+
* @throws {AppcondaException}
|
1582
|
+
* @returns {Promise<{}>}
|
1583
|
+
*/
|
1584
|
+
async deleteProvider(providerId) {
|
1585
|
+
if (typeof providerId === 'undefined') {
|
1586
|
+
throw new AppcondaException('Missing required parameter: "providerId"');
|
1587
|
+
}
|
1588
|
+
const apiPath = '/messaging/providers/{providerId}'.replace('{providerId}', providerId);
|
1589
|
+
const payload = {};
|
1590
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
1591
|
+
const apiHeaders = {
|
1592
|
+
'content-type': 'application/json',
|
1593
|
+
};
|
1594
|
+
return await this.client.call('delete', uri, apiHeaders, payload);
|
1595
|
+
}
|
1596
|
+
/**
|
1597
|
+
* List provider logs
|
1598
|
+
*
|
1599
|
+
* Get the provider activity logs listed by its unique ID.
|
1600
|
+
*
|
1601
|
+
* @param {string} providerId
|
1602
|
+
* @param {string[]} queries
|
1603
|
+
* @throws {AppcondaException}
|
1604
|
+
* @returns {Promise<Models.LogList>}
|
1605
|
+
*/
|
1606
|
+
async listProviderLogs(providerId, queries) {
|
1607
|
+
if (typeof providerId === 'undefined') {
|
1608
|
+
throw new AppcondaException('Missing required parameter: "providerId"');
|
1609
|
+
}
|
1610
|
+
const apiPath = '/messaging/providers/{providerId}/logs'.replace('{providerId}', providerId);
|
1611
|
+
const payload = {};
|
1612
|
+
if (typeof queries !== 'undefined') {
|
1613
|
+
payload['queries'] = queries;
|
1614
|
+
}
|
1615
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
1616
|
+
const apiHeaders = {
|
1617
|
+
'content-type': 'application/json',
|
1618
|
+
};
|
1619
|
+
return await this.client.call('get', uri, apiHeaders, payload);
|
1620
|
+
}
|
1621
|
+
/**
|
1622
|
+
* List subscriber logs
|
1623
|
+
*
|
1624
|
+
* Get the subscriber activity logs listed by its unique ID.
|
1625
|
+
*
|
1626
|
+
* @param {string} subscriberId
|
1627
|
+
* @param {string[]} queries
|
1628
|
+
* @throws {AppcondaException}
|
1629
|
+
* @returns {Promise<Models.LogList>}
|
1630
|
+
*/
|
1631
|
+
async listSubscriberLogs(subscriberId, queries) {
|
1632
|
+
if (typeof subscriberId === 'undefined') {
|
1633
|
+
throw new AppcondaException('Missing required parameter: "subscriberId"');
|
1634
|
+
}
|
1635
|
+
const apiPath = '/messaging/subscribers/{subscriberId}/logs'.replace('{subscriberId}', subscriberId);
|
1636
|
+
const payload = {};
|
1637
|
+
if (typeof queries !== 'undefined') {
|
1638
|
+
payload['queries'] = queries;
|
1639
|
+
}
|
1640
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
1641
|
+
const apiHeaders = {
|
1642
|
+
'content-type': 'application/json',
|
1643
|
+
};
|
1644
|
+
return await this.client.call('get', uri, apiHeaders, payload);
|
1645
|
+
}
|
1646
|
+
/**
|
1647
|
+
* List topics
|
1648
|
+
*
|
1649
|
+
* Get a list of all topics from the current Appconda project.
|
1650
|
+
*
|
1651
|
+
* @param {string[]} queries
|
1652
|
+
* @param {string} search
|
1653
|
+
* @throws {AppcondaException}
|
1654
|
+
* @returns {Promise<Models.TopicList>}
|
1655
|
+
*/
|
1656
|
+
async listTopics(queries, search) {
|
1657
|
+
const apiPath = '/messaging/topics';
|
1658
|
+
const payload = {};
|
1659
|
+
if (typeof queries !== 'undefined') {
|
1660
|
+
payload['queries'] = queries;
|
1661
|
+
}
|
1662
|
+
if (typeof search !== 'undefined') {
|
1663
|
+
payload['search'] = search;
|
1664
|
+
}
|
1665
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
1666
|
+
const apiHeaders = {
|
1667
|
+
'content-type': 'application/json',
|
1668
|
+
};
|
1669
|
+
return await this.client.call('get', uri, apiHeaders, payload);
|
1670
|
+
}
|
1671
|
+
/**
|
1672
|
+
* Create topic
|
1673
|
+
*
|
1674
|
+
* Create a new topic.
|
1675
|
+
*
|
1676
|
+
* @param {string} topicId
|
1677
|
+
* @param {string} name
|
1678
|
+
* @param {string[]} subscribe
|
1679
|
+
* @throws {AppcondaException}
|
1680
|
+
* @returns {Promise<Models.Topic>}
|
1681
|
+
*/
|
1682
|
+
async createTopic(topicId, name, subscribe) {
|
1683
|
+
if (typeof topicId === 'undefined') {
|
1684
|
+
throw new AppcondaException('Missing required parameter: "topicId"');
|
1685
|
+
}
|
1686
|
+
if (typeof name === 'undefined') {
|
1687
|
+
throw new AppcondaException('Missing required parameter: "name"');
|
1688
|
+
}
|
1689
|
+
const apiPath = '/messaging/topics';
|
1690
|
+
const payload = {};
|
1691
|
+
if (typeof topicId !== 'undefined') {
|
1692
|
+
payload['topicId'] = topicId;
|
1693
|
+
}
|
1694
|
+
if (typeof name !== 'undefined') {
|
1695
|
+
payload['name'] = name;
|
1696
|
+
}
|
1697
|
+
if (typeof subscribe !== 'undefined') {
|
1698
|
+
payload['subscribe'] = subscribe;
|
1699
|
+
}
|
1700
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
1701
|
+
const apiHeaders = {
|
1702
|
+
'content-type': 'application/json',
|
1703
|
+
};
|
1704
|
+
return await this.client.call('post', uri, apiHeaders, payload);
|
1705
|
+
}
|
1706
|
+
/**
|
1707
|
+
* Get topic
|
1708
|
+
*
|
1709
|
+
* Get a topic by its unique ID.
|
1710
|
+
|
1711
|
+
*
|
1712
|
+
* @param {string} topicId
|
1713
|
+
* @throws {AppcondaException}
|
1714
|
+
* @returns {Promise<Models.Topic>}
|
1715
|
+
*/
|
1716
|
+
async getTopic(topicId) {
|
1717
|
+
if (typeof topicId === 'undefined') {
|
1718
|
+
throw new AppcondaException('Missing required parameter: "topicId"');
|
1719
|
+
}
|
1720
|
+
const apiPath = '/messaging/topics/{topicId}'.replace('{topicId}', topicId);
|
1721
|
+
const payload = {};
|
1722
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
1723
|
+
const apiHeaders = {
|
1724
|
+
'content-type': 'application/json',
|
1725
|
+
};
|
1726
|
+
return await this.client.call('get', uri, apiHeaders, payload);
|
1727
|
+
}
|
1728
|
+
/**
|
1729
|
+
* Update topic
|
1730
|
+
*
|
1731
|
+
* Update a topic by its unique ID.
|
1732
|
+
|
1733
|
+
*
|
1734
|
+
* @param {string} topicId
|
1735
|
+
* @param {string} name
|
1736
|
+
* @param {string[]} subscribe
|
1737
|
+
* @throws {AppcondaException}
|
1738
|
+
* @returns {Promise<Models.Topic>}
|
1739
|
+
*/
|
1740
|
+
async updateTopic(topicId, name, subscribe) {
|
1741
|
+
if (typeof topicId === 'undefined') {
|
1742
|
+
throw new AppcondaException('Missing required parameter: "topicId"');
|
1743
|
+
}
|
1744
|
+
const apiPath = '/messaging/topics/{topicId}'.replace('{topicId}', topicId);
|
1745
|
+
const payload = {};
|
1746
|
+
if (typeof name !== 'undefined') {
|
1747
|
+
payload['name'] = name;
|
1748
|
+
}
|
1749
|
+
if (typeof subscribe !== 'undefined') {
|
1750
|
+
payload['subscribe'] = subscribe;
|
1751
|
+
}
|
1752
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
1753
|
+
const apiHeaders = {
|
1754
|
+
'content-type': 'application/json',
|
1755
|
+
};
|
1756
|
+
return await this.client.call('patch', uri, apiHeaders, payload);
|
1757
|
+
}
|
1758
|
+
/**
|
1759
|
+
* Delete topic
|
1760
|
+
*
|
1761
|
+
* Delete a topic by its unique ID.
|
1762
|
+
*
|
1763
|
+
* @param {string} topicId
|
1764
|
+
* @throws {AppcondaException}
|
1765
|
+
* @returns {Promise<{}>}
|
1766
|
+
*/
|
1767
|
+
async deleteTopic(topicId) {
|
1768
|
+
if (typeof topicId === 'undefined') {
|
1769
|
+
throw new AppcondaException('Missing required parameter: "topicId"');
|
1770
|
+
}
|
1771
|
+
const apiPath = '/messaging/topics/{topicId}'.replace('{topicId}', topicId);
|
1772
|
+
const payload = {};
|
1773
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
1774
|
+
const apiHeaders = {
|
1775
|
+
'content-type': 'application/json',
|
1776
|
+
};
|
1777
|
+
return await this.client.call('delete', uri, apiHeaders, payload);
|
1778
|
+
}
|
1779
|
+
/**
|
1780
|
+
* List topic logs
|
1781
|
+
*
|
1782
|
+
* Get the topic activity logs listed by its unique ID.
|
1783
|
+
*
|
1784
|
+
* @param {string} topicId
|
1785
|
+
* @param {string[]} queries
|
1786
|
+
* @throws {AppcondaException}
|
1787
|
+
* @returns {Promise<Models.LogList>}
|
1788
|
+
*/
|
1789
|
+
async listTopicLogs(topicId, queries) {
|
1790
|
+
if (typeof topicId === 'undefined') {
|
1791
|
+
throw new AppcondaException('Missing required parameter: "topicId"');
|
1792
|
+
}
|
1793
|
+
const apiPath = '/messaging/topics/{topicId}/logs'.replace('{topicId}', topicId);
|
1794
|
+
const payload = {};
|
1795
|
+
if (typeof queries !== 'undefined') {
|
1796
|
+
payload['queries'] = queries;
|
1797
|
+
}
|
1798
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
1799
|
+
const apiHeaders = {
|
1800
|
+
'content-type': 'application/json',
|
1801
|
+
};
|
1802
|
+
return await this.client.call('get', uri, apiHeaders, payload);
|
1803
|
+
}
|
1804
|
+
/**
|
1805
|
+
* List subscribers
|
1806
|
+
*
|
1807
|
+
* Get a list of all subscribers from the current Appconda project.
|
1808
|
+
*
|
1809
|
+
* @param {string} topicId
|
1810
|
+
* @param {string[]} queries
|
1811
|
+
* @param {string} search
|
1812
|
+
* @throws {AppcondaException}
|
1813
|
+
* @returns {Promise<Models.SubscriberList>}
|
1814
|
+
*/
|
1815
|
+
async listSubscribers(topicId, queries, search) {
|
1816
|
+
if (typeof topicId === 'undefined') {
|
1817
|
+
throw new AppcondaException('Missing required parameter: "topicId"');
|
1818
|
+
}
|
1819
|
+
const apiPath = '/messaging/topics/{topicId}/subscribers'.replace('{topicId}', topicId);
|
1820
|
+
const payload = {};
|
1821
|
+
if (typeof queries !== 'undefined') {
|
1822
|
+
payload['queries'] = queries;
|
1823
|
+
}
|
1824
|
+
if (typeof search !== 'undefined') {
|
1825
|
+
payload['search'] = search;
|
1826
|
+
}
|
1827
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
1828
|
+
const apiHeaders = {
|
1829
|
+
'content-type': 'application/json',
|
1830
|
+
};
|
1831
|
+
return await this.client.call('get', uri, apiHeaders, payload);
|
1832
|
+
}
|
1833
|
+
/**
|
1834
|
+
* Create subscriber
|
1835
|
+
*
|
1836
|
+
* Create a new subscriber.
|
1837
|
+
*
|
1838
|
+
* @param {string} topicId
|
1839
|
+
* @param {string} subscriberId
|
1840
|
+
* @param {string} targetId
|
1841
|
+
* @throws {AppcondaException}
|
1842
|
+
* @returns {Promise<Models.Subscriber>}
|
1843
|
+
*/
|
1844
|
+
async createSubscriber(topicId, subscriberId, targetId) {
|
1845
|
+
if (typeof topicId === 'undefined') {
|
1846
|
+
throw new AppcondaException('Missing required parameter: "topicId"');
|
1847
|
+
}
|
1848
|
+
if (typeof subscriberId === 'undefined') {
|
1849
|
+
throw new AppcondaException('Missing required parameter: "subscriberId"');
|
1850
|
+
}
|
1851
|
+
if (typeof targetId === 'undefined') {
|
1852
|
+
throw new AppcondaException('Missing required parameter: "targetId"');
|
1853
|
+
}
|
1854
|
+
const apiPath = '/messaging/topics/{topicId}/subscribers'.replace('{topicId}', topicId);
|
1855
|
+
const payload = {};
|
1856
|
+
if (typeof subscriberId !== 'undefined') {
|
1857
|
+
payload['subscriberId'] = subscriberId;
|
1858
|
+
}
|
1859
|
+
if (typeof targetId !== 'undefined') {
|
1860
|
+
payload['targetId'] = targetId;
|
1861
|
+
}
|
1862
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
1863
|
+
const apiHeaders = {
|
1864
|
+
'content-type': 'application/json',
|
1865
|
+
};
|
1866
|
+
return await this.client.call('post', uri, apiHeaders, payload);
|
1867
|
+
}
|
1868
|
+
/**
|
1869
|
+
* Get subscriber
|
1870
|
+
*
|
1871
|
+
* Get a subscriber by its unique ID.
|
1872
|
+
|
1873
|
+
*
|
1874
|
+
* @param {string} topicId
|
1875
|
+
* @param {string} subscriberId
|
1876
|
+
* @throws {AppcondaException}
|
1877
|
+
* @returns {Promise<Models.Subscriber>}
|
1878
|
+
*/
|
1879
|
+
async getSubscriber(topicId, subscriberId) {
|
1880
|
+
if (typeof topicId === 'undefined') {
|
1881
|
+
throw new AppcondaException('Missing required parameter: "topicId"');
|
1882
|
+
}
|
1883
|
+
if (typeof subscriberId === 'undefined') {
|
1884
|
+
throw new AppcondaException('Missing required parameter: "subscriberId"');
|
1885
|
+
}
|
1886
|
+
const apiPath = '/messaging/topics/{topicId}/subscribers/{subscriberId}'.replace('{topicId}', topicId).replace('{subscriberId}', subscriberId);
|
1887
|
+
const payload = {};
|
1888
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
1889
|
+
const apiHeaders = {
|
1890
|
+
'content-type': 'application/json',
|
1891
|
+
};
|
1892
|
+
return await this.client.call('get', uri, apiHeaders, payload);
|
1893
|
+
}
|
1894
|
+
/**
|
1895
|
+
* Delete subscriber
|
1896
|
+
*
|
1897
|
+
* Delete a subscriber by its unique ID.
|
1898
|
+
*
|
1899
|
+
* @param {string} topicId
|
1900
|
+
* @param {string} subscriberId
|
1901
|
+
* @throws {AppcondaException}
|
1902
|
+
* @returns {Promise<{}>}
|
1903
|
+
*/
|
1904
|
+
async deleteSubscriber(topicId, subscriberId) {
|
1905
|
+
if (typeof topicId === 'undefined') {
|
1906
|
+
throw new AppcondaException('Missing required parameter: "topicId"');
|
1907
|
+
}
|
1908
|
+
if (typeof subscriberId === 'undefined') {
|
1909
|
+
throw new AppcondaException('Missing required parameter: "subscriberId"');
|
1910
|
+
}
|
1911
|
+
const apiPath = '/messaging/topics/{topicId}/subscribers/{subscriberId}'.replace('{topicId}', topicId).replace('{subscriberId}', subscriberId);
|
1912
|
+
const payload = {};
|
1913
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
1914
|
+
const apiHeaders = {
|
1915
|
+
'content-type': 'application/json',
|
1916
|
+
};
|
1917
|
+
return await this.client.call('delete', uri, apiHeaders, payload);
|
1918
|
+
}
|
1919
|
+
}
|
1920
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL21lc3NhZ2luZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQXdDLE1BQU0sV0FBVyxDQUFDO0FBSXBGLE1BQU0sT0FBTyxTQUFTO0lBR2xCLFlBQVksTUFBYztRQUN0QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFrQixFQUFFLE1BQWU7UUFDbEQsTUFBTSxPQUFPLEdBQUcscUJBQXFCLENBQUM7UUFDdEMsTUFBTSxPQUFPLEdBQVksRUFBRSxDQUFDO1FBQzVCLElBQUksT0FBTyxPQUFPLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDakMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUNqQyxDQUFDO1FBQ0QsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNoQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQy9CLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFFM0QsTUFBTSxVQUFVLEdBQWlDO1lBQzdDLGNBQWMsRUFBRSxrQkFBa0I7U0FDckMsQ0FBQTtRQUVELE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDekIsS0FBSyxFQUNMLEdBQUcsRUFDSCxVQUFVLEVBQ1YsT0FBTyxDQUNWLENBQUM7SUFDTixDQUFDO0lBQ0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FtQkc7SUFDSCxLQUFLLENBQUMsV0FBVyxDQUFDLFNBQWlCLEVBQUUsT0FBZSxFQUFFLE9BQWUsRUFBRSxNQUFpQixFQUFFLEtB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QUM7WUFDdEMsTUFBTSxJQUFJLGlCQUFpQixDQUFDLDRDQUE0QyxDQUFDLENBQUM7UUFDOUUsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLHdEQUF3RCxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQy9JLE1BQU0sT0FBTyxHQUFZLEVBQUUsQ0FBQztRQUM1QixNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFFM0QsTUFBTSxVQUFVLEdBQWlDO1lBQzdDLGNBQWMsRUFBRSxrQkFBa0I7U0FDckMsQ0FBQTtRQUVELE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDekIsUUFBUSxFQUNSLEdBQUcsRUFDSCxVQUFVLEVBQ1YsT0FBTyxDQUNWLENBQUM7SUFDTixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcHBjb25kYUV4Y2VwdGlvbiwgQ2xpZW50LCB0eXBlIFBheWxvYWQsIFVwbG9hZFByb2dyZXNzIH0gZnJvbSAnLi4vY2xpZW50JztcbmltcG9ydCB0eXBlIHsgTW9kZWxzIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IFNtdHBFbmNyeXB0aW9uIH0gZnJvbSAnLi4vZW51bXMvc210cC1lbmNyeXB0aW9uJztcblxuZXhwb3J0IGNsYXNzIE1lc3NhZ2luZyB7XG4gICAgY2xpZW50OiBDbGllbnQ7XG5cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCkge1xuICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG1lc3NhZ2VzXG4gICAgICpcbiAgICAgKiBHZXQgYSBsaXN0IG9mIGFsbCBtZXNzYWdlcyBmcm9tIHRoZSBjdXJyZW50IEFwcGNvbmRhIHByb2plY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBxdWVyaWVzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlYXJjaFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5NZXNzYWdlTGlzdD59XG4gICAgICovXG4gICAgYXN5bmMgbGlzdE1lc3NhZ2VzKHF1ZXJpZXM/OiBzdHJpbmdbXSwgc2VhcmNoPzogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuTWVzc2FnZUxpc3Q+IHtcbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvbWVzc2FnaW5nL21lc3NhZ2VzJztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHF1ZXJpZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydxdWVyaWVzJ10gPSBxdWVyaWVzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2VhcmNoICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc2VhcmNoJ10gPSBzZWFyY2g7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGVtYWlsXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSBuZXcgZW1haWwgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3ViamVjdFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50XG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9waWNzXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gdXNlcnNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0YXJnZXRzXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gY2NcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBiY2NcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBhdHRhY2htZW50c1xuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZHJhZnRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGh0bWxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2NoZWR1bGVkQXRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuTWVzc2FnZT59XG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlRW1haWwobWVzc2FnZUlkOiBzdHJpbmcsIHN1YmplY3Q6IHN0cmluZywgY29udGVudDogc3RyaW5nLCB0b3BpY3M/OiBzdHJpbmdbXSwgdXNlcnM/OiBzdHJpbmdbXSwgdGFyZ2V0cz86IHN0cmluZ1tdLCBjYz86IHN0cmluZ1tdLCBiY2M/OiBzdHJpbmdbXSwgYXR0YWNobWVudHM/OiBzdHJpbmdbXSwgZHJhZnQ/OiBib29sZWFuLCBodG1sPzogYm9vbGVhbiwgc2NoZWR1bGVkQXQ/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5NZXNzYWdlPiB7XG4gICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZUlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJtZXNzYWdlSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc3ViamVjdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwic3ViamVjdFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJjb250ZW50XCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvbWVzc2FnZXMvZW1haWwnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZUlkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbWVzc2FnZUlkJ10gPSBtZXNzYWdlSWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzdWJqZWN0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc3ViamVjdCddID0gc3ViamVjdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydjb250ZW50J10gPSBjb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdG9waWNzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndG9waWNzJ10gPSB0b3BpY3M7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB1c2VycyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3VzZXJzJ10gPSB1c2VycztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRhcmdldHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd0YXJnZXRzJ10gPSB0YXJnZXRzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY2MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydjYyddID0gY2M7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBiY2MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydiY2MnXSA9IGJjYztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGF0dGFjaG1lbnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnYXR0YWNobWVudHMnXSA9IGF0dGFjaG1lbnRzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZHJhZnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydkcmFmdCddID0gZHJhZnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBodG1sICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnaHRtbCddID0gaHRtbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNjaGVkdWxlZEF0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc2NoZWR1bGVkQXQnXSA9IHNjaGVkdWxlZEF0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwb3N0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgZW1haWxcbiAgICAgKlxuICAgICAqIFVwZGF0ZSBhbiBlbWFpbCBtZXNzYWdlIGJ5IGl0cyB1bmlxdWUgSUQuXG5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b3BpY3NcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB1c2Vyc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHRhcmdldHNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3ViamVjdFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50XG4gICAgICogQHBhcmFtIHtib29sZWFufSBkcmFmdFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaHRtbFxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IGNjXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gYmNjXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNjaGVkdWxlZEF0XG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gYXR0YWNobWVudHNcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuTWVzc2FnZT59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlRW1haWwobWVzc2FnZUlkOiBzdHJpbmcsIHRvcGljcz86IHN0cmluZ1tdLCB1c2Vycz86IHN0cmluZ1tdLCB0YXJnZXRzPzogc3RyaW5nW10sIHN1YmplY3Q/OiBzdHJpbmcsIGNvbnRlbnQ/OiBzdHJpbmcsIGRyYWZ0PzogYm9vbGVhbiwgaHRtbD86IGJvb2xlYW4sIGNjPzogc3RyaW5nW10sIGJjYz86IHN0cmluZ1tdLCBzY2hlZHVsZWRBdD86IHN0cmluZywgYXR0YWNobWVudHM/OiBzdHJpbmdbXSk6IFByb21pc2U8TW9kZWxzLk1lc3NhZ2U+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcIm1lc3NhZ2VJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvbWVzc2FnaW5nL21lc3NhZ2VzL2VtYWlsL3ttZXNzYWdlSWR9Jy5yZXBsYWNlKCd7bWVzc2FnZUlkfScsIG1lc3NhZ2VJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiB0b3BpY3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd0b3BpY3MnXSA9IHRvcGljcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHVzZXJzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndXNlcnMnXSA9IHVzZXJzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3RhcmdldHMnXSA9IHRhcmdldHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzdWJqZWN0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc3ViamVjdCddID0gc3ViamVjdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydjb250ZW50J10gPSBjb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZHJhZnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydkcmFmdCddID0gZHJhZnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBodG1sICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnaHRtbCddID0gaHRtbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNjICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnY2MnXSA9IGNjO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYmNjICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnYmNjJ10gPSBiY2M7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzY2hlZHVsZWRBdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3NjaGVkdWxlZEF0J10gPSBzY2hlZHVsZWRBdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGF0dGFjaG1lbnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnYXR0YWNobWVudHMnXSA9IGF0dGFjaG1lbnRzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHB1c2ggbm90aWZpY2F0aW9uXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSBuZXcgcHVzaCBub3RpZmljYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZUlkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGJvZHlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b3BpY3NcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB1c2Vyc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHRhcmdldHNcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaW1hZ2VcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWNvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VuZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xvclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFkZ2VcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGRyYWZ0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNjaGVkdWxlZEF0XG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLk1lc3NhZ2U+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZVB1c2gobWVzc2FnZUlkOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIGJvZHk6IHN0cmluZywgdG9waWNzPzogc3RyaW5nW10sIHVzZXJzPzogc3RyaW5nW10sIHRhcmdldHM/OiBzdHJpbmdbXSwgZGF0YT86IG9iamVjdCwgYWN0aW9uPzogc3RyaW5nLCBpbWFnZT86IHN0cmluZywgaWNvbj86IHN0cmluZywgc291bmQ/OiBzdHJpbmcsIGNvbG9yPzogc3RyaW5nLCB0YWc/OiBzdHJpbmcsIGJhZGdlPzogc3RyaW5nLCBkcmFmdD86IGJvb2xlYW4sIHNjaGVkdWxlZEF0Pzogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuTWVzc2FnZT4ge1xuICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2VJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwibWVzc2FnZUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRpdGxlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJ0aXRsZVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBib2R5ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJib2R5XCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvbWVzc2FnZXMvcHVzaCc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlSWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydtZXNzYWdlSWQnXSA9IG1lc3NhZ2VJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRpdGxlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndGl0bGUnXSA9IHRpdGxlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYm9keSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2JvZHknXSA9IGJvZHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0b3BpY3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd0b3BpY3MnXSA9IHRvcGljcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHVzZXJzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndXNlcnMnXSA9IHVzZXJzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3RhcmdldHMnXSA9IHRhcmdldHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZGF0YSddID0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2FjdGlvbiddID0gYWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgaW1hZ2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydpbWFnZSddID0gaW1hZ2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBpY29uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnaWNvbiddID0gaWNvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNvdW5kICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc291bmQnXSA9IHNvdW5kO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY29sb3IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydjb2xvciddID0gY29sb3I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0YWcgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd0YWcnXSA9IHRhZztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGJhZGdlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnYmFkZ2UnXSA9IGJhZGdlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZHJhZnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydkcmFmdCddID0gZHJhZnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzY2hlZHVsZWRBdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3NjaGVkdWxlZEF0J10gPSBzY2hlZHVsZWRBdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncG9zdCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHB1c2ggbm90aWZpY2F0aW9uXG4gICAgICpcbiAgICAgKiBVcGRhdGUgYSBwdXNoIG5vdGlmaWNhdGlvbiBieSBpdHMgdW5pcXVlIElELlxuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZUlkXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9waWNzXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gdXNlcnNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0YXJnZXRzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGJvZHlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaW1hZ2VcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWNvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VuZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xvclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYmFkZ2VcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGRyYWZ0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNjaGVkdWxlZEF0XG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLk1lc3NhZ2U+fVxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZVB1c2gobWVzc2FnZUlkOiBzdHJpbmcsIHRvcGljcz86IHN0cmluZ1tdLCB1c2Vycz86IHN0cmluZ1tdLCB0YXJnZXRzPzogc3RyaW5nW10sIHRpdGxlPzogc3RyaW5nLCBib2R5Pzogc3RyaW5nLCBkYXRhPzogb2JqZWN0LCBhY3Rpb24/OiBzdHJpbmcsIGltYWdlPzogc3RyaW5nLCBpY29uPzogc3RyaW5nLCBzb3VuZD86IHN0cmluZywgY29sb3I/OiBzdHJpbmcsIHRhZz86IHN0cmluZywgYmFkZ2U/OiBudW1iZXIsIGRyYWZ0PzogYm9vbGVhbiwgc2NoZWR1bGVkQXQ/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5NZXNzYWdlPiB7XG4gICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZUlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJtZXNzYWdlSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL21lc3NhZ2luZy9tZXNzYWdlcy9wdXNoL3ttZXNzYWdlSWR9Jy5yZXBsYWNlKCd7bWVzc2FnZUlkfScsIG1lc3NhZ2VJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiB0b3BpY3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd0b3BpY3MnXSA9IHRvcGljcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHVzZXJzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndXNlcnMnXSA9IHVzZXJzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3RhcmdldHMnXSA9IHRhcmdldHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0aXRsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3RpdGxlJ10gPSB0aXRsZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGJvZHkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydib2R5J10gPSBib2R5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2RhdGEnXSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydhY3Rpb24nXSA9IGFjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGltYWdlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnaW1hZ2UnXSA9IGltYWdlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgaWNvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2ljb24nXSA9IGljb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzb3VuZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3NvdW5kJ10gPSBzb3VuZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNvbG9yICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnY29sb3InXSA9IGNvbG9yO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFnICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndGFnJ10gPSB0YWc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBiYWRnZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2JhZGdlJ10gPSBiYWRnZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRyYWZ0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZHJhZnQnXSA9IGRyYWZ0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2NoZWR1bGVkQXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzY2hlZHVsZWRBdCddID0gc2NoZWR1bGVkQXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3BhdGNoJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgU01TXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSBuZXcgU01TIG1lc3NhZ2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZUlkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b3BpY3NcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB1c2Vyc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHRhcmdldHNcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGRyYWZ0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNjaGVkdWxlZEF0XG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLk1lc3NhZ2U+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZVNtcyhtZXNzYWdlSWQ6IHN0cmluZywgY29udGVudDogc3RyaW5nLCB0b3BpY3M/OiBzdHJpbmdbXSwgdXNlcnM/OiBzdHJpbmdbXSwgdGFyZ2V0cz86IHN0cmluZ1tdLCBkcmFmdD86IGJvb2xlYW4sIHNjaGVkdWxlZEF0Pzogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuTWVzc2FnZT4ge1xuICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2VJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwibWVzc2FnZUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImNvbnRlbnRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL21lc3NhZ2luZy9tZXNzYWdlcy9zbXMnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZUlkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbWVzc2FnZUlkJ10gPSBtZXNzYWdlSWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBjb250ZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnY29udGVudCddID0gY29udGVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRvcGljcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3RvcGljcyddID0gdG9waWNzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdXNlcnMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd1c2VycyddID0gdXNlcnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndGFyZ2V0cyddID0gdGFyZ2V0cztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRyYWZ0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZHJhZnQnXSA9IGRyYWZ0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2NoZWR1bGVkQXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzY2hlZHVsZWRBdCddID0gc2NoZWR1bGVkQXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBTTVNcbiAgICAgKlxuICAgICAqIFVwZGF0ZSBhbiBlbWFpbCBtZXNzYWdlIGJ5IGl0cyB1bmlxdWUgSUQuXG5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b3BpY3NcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB1c2Vyc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHRhcmdldHNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZHJhZnRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2NoZWR1bGVkQXRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuTWVzc2FnZT59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlU21zKG1lc3NhZ2VJZDogc3RyaW5nLCB0b3BpY3M/OiBzdHJpbmdbXSwgdXNlcnM/OiBzdHJpbmdbXSwgdGFyZ2V0cz86IHN0cmluZ1tdLCBjb250ZW50Pzogc3RyaW5nLCBkcmFmdD86IGJvb2xlYW4sIHNjaGVkdWxlZEF0Pzogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuTWVzc2FnZT4ge1xuICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2VJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwibWVzc2FnZUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvbWVzc2FnZXMvc21zL3ttZXNzYWdlSWR9Jy5yZXBsYWNlKCd7bWVzc2FnZUlkfScsIG1lc3NhZ2VJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiB0b3BpY3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd0b3BpY3MnXSA9IHRvcGljcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHVzZXJzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndXNlcnMnXSA9IHVzZXJzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3RhcmdldHMnXSA9IHRhcmdldHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBjb250ZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnY29udGVudCddID0gY29udGVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRyYWZ0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZHJhZnQnXSA9IGRyYWZ0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2NoZWR1bGVkQXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzY2hlZHVsZWRBdCddID0gc2NoZWR1bGVkQXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3BhdGNoJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgbWVzc2FnZVxuICAgICAqXG4gICAgICogR2V0IGEgbWVzc2FnZSBieSBpdHMgdW5pcXVlIElELlxuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZUlkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLk1lc3NhZ2U+fVxuICAgICAqL1xuICAgIGFzeW5jIGdldE1lc3NhZ2UobWVzc2FnZUlkOiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5NZXNzYWdlPiB7XG4gICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZUlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJtZXNzYWdlSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL21lc3NhZ2luZy9tZXNzYWdlcy97bWVzc2FnZUlkfScucmVwbGFjZSgne21lc3NhZ2VJZH0nLCBtZXNzYWdlSWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBtZXNzYWdlXG4gICAgICpcbiAgICAgKiBEZWxldGUgYSBtZXNzYWdlLiBJZiB0aGUgbWVzc2FnZSBpcyBub3QgYSBkcmFmdCBvciBzY2hlZHVsZWQsIGJ1dCBoYXMgYmVlbiBzZW50LCB0aGlzIHdpbGwgbm90IHJlY2FsbCB0aGUgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlSWRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7fT59XG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlKG1lc3NhZ2VJZDogc3RyaW5nKTogUHJvbWlzZTx7fT4ge1xuICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2VJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwibWVzc2FnZUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvbWVzc2FnZXMve21lc3NhZ2VJZH0nLnJlcGxhY2UoJ3ttZXNzYWdlSWR9JywgbWVzc2FnZUlkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZGVsZXRlJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMaXN0IG1lc3NhZ2UgbG9nc1xuICAgICAqXG4gICAgICogR2V0IHRoZSBtZXNzYWdlIGFjdGl2aXR5IGxvZ3MgbGlzdGVkIGJ5IGl0cyB1bmlxdWUgSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZUlkXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcXVlcmllc1xuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Mb2dMaXN0Pn1cbiAgICAgKi9cbiAgICBhc3luYyBsaXN0TWVzc2FnZUxvZ3MobWVzc2FnZUlkOiBzdHJpbmcsIHF1ZXJpZXM/OiBzdHJpbmdbXSk6IFByb21pc2U8TW9kZWxzLkxvZ0xpc3Q+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcIm1lc3NhZ2VJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvbWVzc2FnaW5nL21lc3NhZ2VzL3ttZXNzYWdlSWR9L2xvZ3MnLnJlcGxhY2UoJ3ttZXNzYWdlSWR9JywgbWVzc2FnZUlkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHF1ZXJpZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydxdWVyaWVzJ10gPSBxdWVyaWVzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExpc3QgbWVzc2FnZSB0YXJnZXRzXG4gICAgICpcbiAgICAgKiBHZXQgYSBsaXN0IG9mIHRoZSB0YXJnZXRzIGFzc29jaWF0ZWQgd2l0aCBhIG1lc3NhZ2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZUlkXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcXVlcmllc1xuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5UYXJnZXRMaXN0Pn1cbiAgICAgKi9cbiAgICBhc3luYyBsaXN0VGFyZ2V0cyhtZXNzYWdlSWQ6IHN0cmluZywgcXVlcmllcz86IHN0cmluZ1tdKTogUHJvbWlzZTxNb2RlbHMuVGFyZ2V0TGlzdD4ge1xuICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2VJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwibWVzc2FnZUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvbWVzc2FnZXMve21lc3NhZ2VJZH0vdGFyZ2V0cycucmVwbGFjZSgne21lc3NhZ2VJZH0nLCBtZXNzYWdlSWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgcXVlcmllcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3F1ZXJpZXMnXSA9IHF1ZXJpZXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTGlzdCBwcm92aWRlcnNcbiAgICAgKlxuICAgICAqIEdldCBhIGxpc3Qgb2YgYWxsIHByb3ZpZGVycyBmcm9tIHRoZSBjdXJyZW50IEFwcGNvbmRhIHByb2plY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBxdWVyaWVzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlYXJjaFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Qcm92aWRlckxpc3Q+fVxuICAgICAqL1xuICAgIGFzeW5jIGxpc3RQcm92aWRlcnMocXVlcmllcz86IHN0cmluZ1tdLCBzZWFyY2g/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5Qcm92aWRlckxpc3Q+IHtcbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvbWVzc2FnaW5nL3Byb3ZpZGVycyc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBxdWVyaWVzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncXVlcmllcyddID0gcXVlcmllcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlYXJjaCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3NlYXJjaCddID0gc2VhcmNoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBBUE5TIHByb3ZpZGVyXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSBuZXcgQXBwbGUgUHVzaCBOb3RpZmljYXRpb24gc2VydmljZSBwcm92aWRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm92aWRlcklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXV0aEtleVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdXRoS2V5SWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGVhbUlkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGJ1bmRsZUlkXG4gICAgICogQHBhcmFtIHtib29sZWFufSBzYW5kYm94XG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlByb3ZpZGVyPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVBcG5zUHJvdmlkZXIocHJvdmlkZXJJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGF1dGhLZXk/OiBzdHJpbmcsIGF1dGhLZXlJZD86IHN0cmluZywgdGVhbUlkPzogc3RyaW5nLCBidW5kbGVJZD86IHN0cmluZywgc2FuZGJveD86IGJvb2xlYW4sIGVuYWJsZWQ/OiBib29sZWFuKTogUHJvbWlzZTxNb2RlbHMuUHJvdmlkZXI+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlcklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm92aWRlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcIm5hbWVcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL21lc3NhZ2luZy9wcm92aWRlcnMvYXBucyc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlcklkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncHJvdmlkZXJJZCddID0gcHJvdmlkZXJJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyduYW1lJ10gPSBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYXV0aEtleSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2F1dGhLZXknXSA9IGF1dGhLZXk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhdXRoS2V5SWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydhdXRoS2V5SWQnXSA9IGF1dGhLZXlJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRlYW1JZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3RlYW1JZCddID0gdGVhbUlkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYnVuZGxlSWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydidW5kbGVJZCddID0gYnVuZGxlSWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzYW5kYm94ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc2FuZGJveCddID0gc2FuZGJveDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVuYWJsZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbmFibGVkJ10gPSBlbmFibGVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwb3N0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgQVBOUyBwcm92aWRlclxuICAgICAqXG4gICAgICogVXBkYXRlIGEgQXBwbGUgUHVzaCBOb3RpZmljYXRpb24gc2VydmljZSBwcm92aWRlciBieSBpdHMgdW5pcXVlIElELlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVySWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZW5hYmxlZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdXRoS2V5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGF1dGhLZXlJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZWFtSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYnVuZGxlSWRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNhbmRib3hcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuUHJvdmlkZXI+fVxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZUFwbnNQcm92aWRlcihwcm92aWRlcklkOiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcsIGVuYWJsZWQ/OiBib29sZWFuLCBhdXRoS2V5Pzogc3RyaW5nLCBhdXRoS2V5SWQ/OiBzdHJpbmcsIHRlYW1JZD86IHN0cmluZywgYnVuZGxlSWQ/OiBzdHJpbmcsIHNhbmRib3g/OiBib29sZWFuKTogUHJvbWlzZTxNb2RlbHMuUHJvdmlkZXI+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlcklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm92aWRlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvcHJvdmlkZXJzL2FwbnMve3Byb3ZpZGVySWR9Jy5yZXBsYWNlKCd7cHJvdmlkZXJJZH0nLCBwcm92aWRlcklkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyduYW1lJ10gPSBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW5hYmxlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2VuYWJsZWQnXSA9IGVuYWJsZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhdXRoS2V5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnYXV0aEtleSddID0gYXV0aEtleTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGF1dGhLZXlJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2F1dGhLZXlJZCddID0gYXV0aEtleUlkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGVhbUlkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndGVhbUlkJ10gPSB0ZWFtSWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBidW5kbGVJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2J1bmRsZUlkJ10gPSBidW5kbGVJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNhbmRib3ggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzYW5kYm94J10gPSBzYW5kYm94O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIEZDTSBwcm92aWRlclxuICAgICAqXG4gICAgICogQ3JlYXRlIGEgbmV3IEZpcmViYXNlIENsb3VkIE1lc3NhZ2luZyBwcm92aWRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm92aWRlcklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gc2VydmljZUFjY291bnRKU09OXG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlByb3ZpZGVyPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVGY21Qcm92aWRlcihwcm92aWRlcklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgc2VydmljZUFjY291bnRKU09OPzogb2JqZWN0LCBlbmFibGVkPzogYm9vbGVhbik6IFByb21pc2U8TW9kZWxzLlByb3ZpZGVyPiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdmlkZXJJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicHJvdmlkZXJJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJuYW1lXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvcHJvdmlkZXJzL2ZjbSc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlcklkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncHJvdmlkZXJJZCddID0gcHJvdmlkZXJJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyduYW1lJ10gPSBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2VydmljZUFjY291bnRKU09OICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc2VydmljZUFjY291bnRKU09OJ10gPSBzZXJ2aWNlQWNjb3VudEpTT047XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBlbmFibGVkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZW5hYmxlZCddID0gZW5hYmxlZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncG9zdCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIEZDTSBwcm92aWRlclxuICAgICAqXG4gICAgICogVXBkYXRlIGEgRmlyZWJhc2UgQ2xvdWQgTWVzc2FnaW5nIHByb3ZpZGVyIGJ5IGl0cyB1bmlxdWUgSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvdmlkZXJJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IHNlcnZpY2VBY2NvdW50SlNPTlxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Qcm92aWRlcj59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlRmNtUHJvdmlkZXIocHJvdmlkZXJJZDogc3RyaW5nLCBuYW1lPzogc3RyaW5nLCBlbmFibGVkPzogYm9vbGVhbiwgc2VydmljZUFjY291bnRKU09OPzogb2JqZWN0KTogUHJvbWlzZTxNb2RlbHMuUHJvdmlkZXI+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlcklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm92aWRlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvcHJvdmlkZXJzL2ZjbS97cHJvdmlkZXJJZH0nLnJlcGxhY2UoJ3twcm92aWRlcklkfScsIHByb3ZpZGVySWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ25hbWUnXSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBlbmFibGVkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZW5hYmxlZCddID0gZW5hYmxlZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlcnZpY2VBY2NvdW50SlNPTiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3NlcnZpY2VBY2NvdW50SlNPTiddID0gc2VydmljZUFjY291bnRKU09OO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIE1haWxndW4gcHJvdmlkZXJcbiAgICAgKlxuICAgICAqIENyZWF0ZSBhIG5ldyBNYWlsZ3VuIHByb3ZpZGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVySWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhcGlLZXlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZG9tYWluXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc0V1UmVnaW9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZyb21OYW1lXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZyb21FbWFpbFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZXBseVRvTmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZXBseVRvRW1haWxcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuUHJvdmlkZXI+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZU1haWxndW5Qcm92aWRlcihwcm92aWRlcklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgYXBpS2V5Pzogc3RyaW5nLCBkb21haW4/OiBzdHJpbmcsIGlzRXVSZWdpb24/OiBib29sZWFuLCBmcm9tTmFtZT86IHN0cmluZywgZnJvbUVtYWlsPzogc3RyaW5nLCByZXBseVRvTmFtZT86IHN0cmluZywgcmVwbHlUb0VtYWlsPzogc3RyaW5nLCBlbmFibGVkPzogYm9vbGVhbik6IFByb21pc2U8TW9kZWxzLlByb3ZpZGVyPiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdmlkZXJJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicHJvdmlkZXJJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJuYW1lXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvcHJvdmlkZXJzL21haWxndW4nO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdmlkZXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3Byb3ZpZGVySWQnXSA9IHByb3ZpZGVySWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmFtZSddID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGFwaUtleSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2FwaUtleSddID0gYXBpS2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZG9tYWluICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZG9tYWluJ10gPSBkb21haW47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBpc0V1UmVnaW9uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnaXNFdVJlZ2lvbiddID0gaXNFdVJlZ2lvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGZyb21OYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZnJvbU5hbWUnXSA9IGZyb21OYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbUVtYWlsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZnJvbUVtYWlsJ10gPSBmcm9tRW1haWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXBseVRvTmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3JlcGx5VG9OYW1lJ10gPSByZXBseVRvTmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlcGx5VG9FbWFpbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3JlcGx5VG9FbWFpbCddID0gcmVwbHlUb0VtYWlsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW5hYmxlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2VuYWJsZWQnXSA9IGVuYWJsZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBNYWlsZ3VuIHByb3ZpZGVyXG4gICAgICpcbiAgICAgKiBVcGRhdGUgYSBNYWlsZ3VuIHByb3ZpZGVyIGJ5IGl0cyB1bmlxdWUgSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvdmlkZXJJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGFwaUtleVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkb21haW5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzRXVSZWdpb25cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnJvbU5hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnJvbUVtYWlsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHJlcGx5VG9OYW1lXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHJlcGx5VG9FbWFpbFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Qcm92aWRlcj59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlTWFpbGd1blByb3ZpZGVyKHByb3ZpZGVySWQ6IHN0cmluZywgbmFtZT86IHN0cmluZywgYXBpS2V5Pzogc3RyaW5nLCBkb21haW4/OiBzdHJpbmcsIGlzRXVSZWdpb24/OiBib29sZWFuLCBlbmFibGVkPzogYm9vbGVhbiwgZnJvbU5hbWU/OiBzdHJpbmcsIGZyb21FbWFpbD86IHN0cmluZywgcmVwbHlUb05hbWU/OiBzdHJpbmcsIHJlcGx5VG9FbWFpbD86IHN0cmluZyk6IFByb21pc2U8TW9kZWxzLlByb3ZpZGVyPiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdmlkZXJJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicHJvdmlkZXJJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvbWVzc2FnaW5nL3Byb3ZpZGVycy9tYWlsZ3VuL3twcm92aWRlcklkfScucmVwbGFjZSgne3Byb3ZpZGVySWR9JywgcHJvdmlkZXJJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmFtZSddID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGFwaUtleSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2FwaUtleSddID0gYXBpS2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZG9tYWluICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZG9tYWluJ10gPSBkb21haW47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBpc0V1UmVnaW9uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnaXNFdVJlZ2lvbiddID0gaXNFdVJlZ2lvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVuYWJsZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbmFibGVkJ10gPSBlbmFibGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbU5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydmcm9tTmFtZSddID0gZnJvbU5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBmcm9tRW1haWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydmcm9tRW1haWwnXSA9IGZyb21FbWFpbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlcGx5VG9OYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncmVwbHlUb05hbWUnXSA9IHJlcGx5VG9OYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcmVwbHlUb0VtYWlsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncmVwbHlUb0VtYWlsJ10gPSByZXBseVRvRW1haWw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3BhdGNoJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgTXNnOTEgcHJvdmlkZXJcbiAgICAgKlxuICAgICAqIENyZWF0ZSBhIG5ldyBNU0c5MSBwcm92aWRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm92aWRlcklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGVtcGxhdGVJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZW5kZXJJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdXRoS2V5XG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlByb3ZpZGVyPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVNc2c5MVByb3ZpZGVyKHByb3ZpZGVySWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCB0ZW1wbGF0ZUlkPzogc3RyaW5nLCBzZW5kZXJJZD86IHN0cmluZywgYXV0aEtleT86IHN0cmluZywgZW5hYmxlZD86IGJvb2xlYW4pOiBQcm9taXNlPE1vZGVscy5Qcm92aWRlcj4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb3ZpZGVySWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInByb3ZpZGVySWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwibmFtZVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvbWVzc2FnaW5nL3Byb3ZpZGVycy9tc2c5MSc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlcklkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncHJvdmlkZXJJZCddID0gcHJvdmlkZXJJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyduYW1lJ10gPSBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGVJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3RlbXBsYXRlSWQnXSA9IHRlbXBsYXRlSWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzZW5kZXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3NlbmRlcklkJ10gPSBzZW5kZXJJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGF1dGhLZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydhdXRoS2V5J10gPSBhdXRoS2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW5hYmxlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2VuYWJsZWQnXSA9IGVuYWJsZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBNc2c5MSBwcm92aWRlclxuICAgICAqXG4gICAgICogVXBkYXRlIGEgTVNHOTEgcHJvdmlkZXIgYnkgaXRzIHVuaXF1ZSBJRC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm92aWRlcklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGVtcGxhdGVJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZW5kZXJJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdXRoS2V5XG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlByb3ZpZGVyPn1cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVNc2c5MVByb3ZpZGVyKHByb3ZpZGVySWQ6IHN0cmluZywgbmFtZT86IHN0cmluZywgZW5hYmxlZD86IGJvb2xlYW4sIHRlbXBsYXRlSWQ/OiBzdHJpbmcsIHNlbmRlcklkPzogc3RyaW5nLCBhdXRoS2V5Pzogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuUHJvdmlkZXI+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlcklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm92aWRlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvcHJvdmlkZXJzL21zZzkxL3twcm92aWRlcklkfScucmVwbGFjZSgne3Byb3ZpZGVySWR9JywgcHJvdmlkZXJJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmFtZSddID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVuYWJsZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbmFibGVkJ10gPSBlbmFibGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGVJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3RlbXBsYXRlSWQnXSA9IHRlbXBsYXRlSWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzZW5kZXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3NlbmRlcklkJ10gPSBzZW5kZXJJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGF1dGhLZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydhdXRoS2V5J10gPSBhdXRoS2V5O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIFNlbmRncmlkIHByb3ZpZGVyXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSBuZXcgU2VuZGdyaWQgcHJvdmlkZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvdmlkZXJJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGFwaUtleVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tTmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tRW1haWxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVwbHlUb05hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVwbHlUb0VtYWlsXG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlByb3ZpZGVyPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVTZW5kZ3JpZFByb3ZpZGVyKHByb3ZpZGVySWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCBhcGlLZXk/OiBzdHJpbmcsIGZyb21OYW1lPzogc3RyaW5nLCBmcm9tRW1haWw/OiBzdHJpbmcsIHJlcGx5VG9OYW1lPzogc3RyaW5nLCByZXBseVRvRW1haWw/OiBzdHJpbmcsIGVuYWJsZWQ/OiBib29sZWFuKTogUHJvbWlzZTxNb2RlbHMuUHJvdmlkZXI+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlcklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm92aWRlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcIm5hbWVcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL21lc3NhZ2luZy9wcm92aWRlcnMvc2VuZGdyaWQnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdmlkZXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3Byb3ZpZGVySWQnXSA9IHByb3ZpZGVySWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmFtZSddID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGFwaUtleSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2FwaUtleSddID0gYXBpS2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbU5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydmcm9tTmFtZSddID0gZnJvbU5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBmcm9tRW1haWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydmcm9tRW1haWwnXSA9IGZyb21FbWFpbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlcGx5VG9OYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncmVwbHlUb05hbWUnXSA9IHJlcGx5VG9OYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcmVwbHlUb0VtYWlsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncmVwbHlUb0VtYWlsJ10gPSByZXBseVRvRW1haWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBlbmFibGVkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZW5hYmxlZCddID0gZW5hYmxlZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncG9zdCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIFNlbmRncmlkIHByb3ZpZGVyXG4gICAgICpcbiAgICAgKiBVcGRhdGUgYSBTZW5kZ3JpZCBwcm92aWRlciBieSBpdHMgdW5pcXVlIElELlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVySWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZW5hYmxlZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhcGlLZXlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnJvbU5hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnJvbUVtYWlsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHJlcGx5VG9OYW1lXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHJlcGx5VG9FbWFpbFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Qcm92aWRlcj59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlU2VuZGdyaWRQcm92aWRlcihwcm92aWRlcklkOiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcsIGVuYWJsZWQ/OiBib29sZWFuLCBhcGlLZXk/OiBzdHJpbmcsIGZyb21OYW1lPzogc3RyaW5nLCBmcm9tRW1haWw/OiBzdHJpbmcsIHJlcGx5VG9OYW1lPzogc3RyaW5nLCByZXBseVRvRW1haWw/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5Qcm92aWRlcj4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb3ZpZGVySWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInByb3ZpZGVySWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL21lc3NhZ2luZy9wcm92aWRlcnMvc2VuZGdyaWQve3Byb3ZpZGVySWR9Jy5yZXBsYWNlKCd7cHJvdmlkZXJJZH0nLCBwcm92aWRlcklkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyduYW1lJ10gPSBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW5hYmxlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2VuYWJsZWQnXSA9IGVuYWJsZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhcGlLZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydhcGlLZXknXSA9IGFwaUtleTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGZyb21OYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZnJvbU5hbWUnXSA9IGZyb21OYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbUVtYWlsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZnJvbUVtYWlsJ10gPSBmcm9tRW1haWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXBseVRvTmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3JlcGx5VG9OYW1lJ10gPSByZXBseVRvTmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlcGx5VG9FbWFpbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3JlcGx5VG9FbWFpbCddID0gcmVwbHlUb0VtYWlsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIFNNVFAgcHJvdmlkZXJcbiAgICAgKlxuICAgICAqIENyZWF0ZSBhIG5ldyBTTVRQIHByb3ZpZGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVySWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBob3N0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBvcnRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcm5hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFzc3dvcmRcbiAgICAgKiBAcGFyYW0ge1NtdHBFbmNyeXB0aW9ufSBlbmNyeXB0aW9uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBhdXRvVExTXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1haWxlclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tTmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tRW1haWxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVwbHlUb05hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVwbHlUb0VtYWlsXG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlByb3ZpZGVyPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVTbXRwUHJvdmlkZXIocHJvdmlkZXJJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGhvc3Q6IHN0cmluZywgcG9ydD86IG51bWJlciwgdXNlcm5hbWU/OiBzdHJpbmcsIHBhc3N3b3JkPzogc3RyaW5nLCBlbmNyeXB0aW9uPzogU210cEVuY3J5cHRpb24sIGF1dG9UTFM/OiBib29sZWFuLCBtYWlsZXI/OiBzdHJpbmcsIGZyb21OYW1lPzogc3RyaW5nLCBmcm9tRW1haWw/OiBzdHJpbmcsIHJlcGx5VG9OYW1lPzogc3RyaW5nLCByZXBseVRvRW1haWw/OiBzdHJpbmcsIGVuYWJsZWQ/OiBib29sZWFuKTogUHJvbWlzZTxNb2RlbHMuUHJvdmlkZXI+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlcklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm92aWRlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcIm5hbWVcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgaG9zdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiaG9zdFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvbWVzc2FnaW5nL3Byb3ZpZGVycy9zbXRwJztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHByb3ZpZGVySWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydwcm92aWRlcklkJ10gPSBwcm92aWRlcklkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ25hbWUnXSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBob3N0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnaG9zdCddID0gaG9zdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBvcnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydwb3J0J10gPSBwb3J0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdXNlcm5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd1c2VybmFtZSddID0gdXNlcm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwYXNzd29yZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3Bhc3N3b3JkJ10gPSBwYXNzd29yZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVuY3J5cHRpb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbmNyeXB0aW9uJ10gPSBlbmNyeXB0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYXV0b1RMUyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2F1dG9UTFMnXSA9IGF1dG9UTFM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBtYWlsZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydtYWlsZXInXSA9IG1haWxlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGZyb21OYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZnJvbU5hbWUnXSA9IGZyb21OYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbUVtYWlsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZnJvbUVtYWlsJ10gPSBmcm9tRW1haWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXBseVRvTmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3JlcGx5VG9OYW1lJ10gPSByZXBseVRvTmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlcGx5VG9FbWFpbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3JlcGx5VG9FbWFpbCddID0gcmVwbHlUb0VtYWlsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW5hYmxlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2VuYWJsZWQnXSA9IGVuYWJsZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBTTVRQIHByb3ZpZGVyXG4gICAgICpcbiAgICAgKiBVcGRhdGUgYSBTTVRQIHByb3ZpZGVyIGJ5IGl0cyB1bmlxdWUgSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvdmlkZXJJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGhvc3RcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcG9ydFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VybmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZFxuICAgICAqIEBwYXJhbSB7U210cEVuY3J5cHRpb259IGVuY3J5cHRpb25cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGF1dG9UTFNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWFpbGVyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZyb21OYW1lXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZyb21FbWFpbFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZXBseVRvTmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZXBseVRvRW1haWxcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuUHJvdmlkZXI+fVxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZVNtdHBQcm92aWRlcihwcm92aWRlcklkOiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcsIGhvc3Q/OiBzdHJpbmcsIHBvcnQ/OiBudW1iZXIsIHVzZXJuYW1lPzogc3RyaW5nLCBwYXNzd29yZD86IHN0cmluZywgZW5jcnlwdGlvbj86IFNtdHBFbmNyeXB0aW9uLCBhdXRvVExTPzogYm9vbGVhbiwgbWFpbGVyPzogc3RyaW5nLCBmcm9tTmFtZT86IHN0cmluZywgZnJvbUVtYWlsPzogc3RyaW5nLCByZXBseVRvTmFtZT86IHN0cmluZywgcmVwbHlUb0VtYWlsPzogc3RyaW5nLCBlbmFibGVkPzogYm9vbGVhbik6IFByb21pc2U8TW9kZWxzLlByb3ZpZGVyPiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdmlkZXJJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicHJvdmlkZXJJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvbWVzc2FnaW5nL3Byb3ZpZGVycy9zbXRwL3twcm92aWRlcklkfScucmVwbGFjZSgne3Byb3ZpZGVySWR9JywgcHJvdmlkZXJJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmFtZSddID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGhvc3QgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydob3N0J10gPSBob3N0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcG9ydCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3BvcnQnXSA9IHBvcnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB1c2VybmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3VzZXJuYW1lJ10gPSB1c2VybmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBhc3N3b3JkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncGFzc3dvcmQnXSA9IHBhc3N3b3JkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW5jcnlwdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2VuY3J5cHRpb24nXSA9IGVuY3J5cHRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhdXRvVExTICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnYXV0b1RMUyddID0gYXV0b1RMUztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG1haWxlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ21haWxlciddID0gbWFpbGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbU5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydmcm9tTmFtZSddID0gZnJvbU5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBmcm9tRW1haWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydmcm9tRW1haWwnXSA9IGZyb21FbWFpbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlcGx5VG9OYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncmVwbHlUb05hbWUnXSA9IHJlcGx5VG9OYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcmVwbHlUb0VtYWlsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncmVwbHlUb0VtYWlsJ10gPSByZXBseVRvRW1haWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBlbmFibGVkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZW5hYmxlZCddID0gZW5hYmxlZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncGF0Y2gnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBUZWxlc2lnbiBwcm92aWRlclxuICAgICAqXG4gICAgICogQ3JlYXRlIGEgbmV3IFRlbGVzaWduIHByb3ZpZGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVySWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGN1c3RvbWVySWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXBpS2V5XG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlByb3ZpZGVyPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVUZWxlc2lnblByb3ZpZGVyKHByb3ZpZGVySWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCBmcm9tPzogc3RyaW5nLCBjdXN0b21lcklkPzogc3RyaW5nLCBhcGlLZXk/OiBzdHJpbmcsIGVuYWJsZWQ/OiBib29sZWFuKTogUHJvbWlzZTxNb2RlbHMuUHJvdmlkZXI+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlcklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm92aWRlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcIm5hbWVcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL21lc3NhZ2luZy9wcm92aWRlcnMvdGVsZXNpZ24nO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdmlkZXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3Byb3ZpZGVySWQnXSA9IHByb3ZpZGVySWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmFtZSddID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGZyb20gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydmcm9tJ10gPSBmcm9tO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY3VzdG9tZXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2N1c3RvbWVySWQnXSA9IGN1c3RvbWVySWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhcGlLZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydhcGlLZXknXSA9IGFwaUtleTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVuYWJsZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbmFibGVkJ10gPSBlbmFibGVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwb3N0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgVGVsZXNpZ24gcHJvdmlkZXJcbiAgICAgKlxuICAgICAqIFVwZGF0ZSBhIFRlbGVzaWduIHByb3ZpZGVyIGJ5IGl0cyB1bmlxdWUgSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvdmlkZXJJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGN1c3RvbWVySWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXBpS2V5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZyb21cbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuUHJvdmlkZXI+fVxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZVRlbGVzaWduUHJvdmlkZXIocHJvdmlkZXJJZDogc3RyaW5nLCBuYW1lPzogc3RyaW5nLCBlbmFibGVkPzogYm9vbGVhbiwgY3VzdG9tZXJJZD86IHN0cmluZywgYXBpS2V5Pzogc3RyaW5nLCBmcm9tPzogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuUHJvdmlkZXI+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlcklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm92aWRlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvcHJvdmlkZXJzL3RlbGVzaWduL3twcm92aWRlcklkfScucmVwbGFjZSgne3Byb3ZpZGVySWR9JywgcHJvdmlkZXJJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmFtZSddID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVuYWJsZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbmFibGVkJ10gPSBlbmFibGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY3VzdG9tZXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2N1c3RvbWVySWQnXSA9IGN1c3RvbWVySWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhcGlLZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydhcGlLZXknXSA9IGFwaUtleTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGZyb20gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydmcm9tJ10gPSBmcm9tO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIFRleHRtYWdpYyBwcm92aWRlclxuICAgICAqXG4gICAgICogQ3JlYXRlIGEgbmV3IFRleHRtYWdpYyBwcm92aWRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm92aWRlcklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnJvbVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VybmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhcGlLZXlcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuUHJvdmlkZXI+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZVRleHRtYWdpY1Byb3ZpZGVyKHByb3ZpZGVySWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCBmcm9tPzogc3RyaW5nLCB1c2VybmFtZT86IHN0cmluZywgYXBpS2V5Pzogc3RyaW5nLCBlbmFibGVkPzogYm9vbGVhbik6IFByb21pc2U8TW9kZWxzLlByb3ZpZGVyPiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdmlkZXJJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicHJvdmlkZXJJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJuYW1lXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvcHJvdmlkZXJzL3RleHRtYWdpYyc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlcklkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncHJvdmlkZXJJZCddID0gcHJvdmlkZXJJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyduYW1lJ10gPSBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2Zyb20nXSA9IGZyb207XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB1c2VybmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3VzZXJuYW1lJ10gPSB1c2VybmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGFwaUtleSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2FwaUtleSddID0gYXBpS2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW5hYmxlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2VuYWJsZWQnXSA9IGVuYWJsZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBUZXh0bWFnaWMgcHJvdmlkZXJcbiAgICAgKlxuICAgICAqIFVwZGF0ZSBhIFRleHRtYWdpYyBwcm92aWRlciBieSBpdHMgdW5pcXVlIElELlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVySWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZW5hYmxlZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VybmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhcGlLZXlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnJvbVxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Qcm92aWRlcj59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlVGV4dG1hZ2ljUHJvdmlkZXIocHJvdmlkZXJJZDogc3RyaW5nLCBuYW1lPzogc3RyaW5nLCBlbmFibGVkPzogYm9vbGVhbiwgdXNlcm5hbWU/OiBzdHJpbmcsIGFwaUtleT86IHN0cmluZywgZnJvbT86IHN0cmluZyk6IFByb21pc2U8TW9kZWxzLlByb3ZpZGVyPiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdmlkZXJJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicHJvdmlkZXJJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvbWVzc2FnaW5nL3Byb3ZpZGVycy90ZXh0bWFnaWMve3Byb3ZpZGVySWR9Jy5yZXBsYWNlKCd7cHJvdmlkZXJJZH0nLCBwcm92aWRlcklkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyduYW1lJ10gPSBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW5hYmxlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2VuYWJsZWQnXSA9IGVuYWJsZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB1c2VybmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3VzZXJuYW1lJ10gPSB1c2VybmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGFwaUtleSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2FwaUtleSddID0gYXBpS2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2Zyb20nXSA9IGZyb207XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3BhdGNoJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgVHdpbGlvIHByb3ZpZGVyXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSBuZXcgVHdpbGlvIHByb3ZpZGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVySWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGFjY291bnRTaWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXV0aFRva2VuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlByb3ZpZGVyPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVUd2lsaW9Qcm92aWRlcihwcm92aWRlcklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZnJvbT86IHN0cmluZywgYWNjb3VudFNpZD86IHN0cmluZywgYXV0aFRva2VuPzogc3RyaW5nLCBlbmFibGVkPzogYm9vbGVhbik6IFByb21pc2U8TW9kZWxzLlByb3ZpZGVyPiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdmlkZXJJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicHJvdmlkZXJJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJuYW1lXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvcHJvdmlkZXJzL3R3aWxpbyc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlcklkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncHJvdmlkZXJJZCddID0gcHJvdmlkZXJJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyduYW1lJ10gPSBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2Zyb20nXSA9IGZyb207XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhY2NvdW50U2lkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnYWNjb3VudFNpZCddID0gYWNjb3VudFNpZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGF1dGhUb2tlbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2F1dGhUb2tlbiddID0gYXV0aFRva2VuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW5hYmxlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2VuYWJsZWQnXSA9IGVuYWJsZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBUd2lsaW8gcHJvdmlkZXJcbiAgICAgKlxuICAgICAqIFVwZGF0ZSBhIFR3aWxpbyBwcm92aWRlciBieSBpdHMgdW5pcXVlIElELlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVySWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZW5hYmxlZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhY2NvdW50U2lkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGF1dGhUb2tlblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlByb3ZpZGVyPn1cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVUd2lsaW9Qcm92aWRlcihwcm92aWRlcklkOiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcsIGVuYWJsZWQ/OiBib29sZWFuLCBhY2NvdW50U2lkPzogc3RyaW5nLCBhdXRoVG9rZW4/OiBzdHJpbmcsIGZyb20/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5Qcm92aWRlcj4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb3ZpZGVySWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInByb3ZpZGVySWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL21lc3NhZ2luZy9wcm92aWRlcnMvdHdpbGlvL3twcm92aWRlcklkfScucmVwbGFjZSgne3Byb3ZpZGVySWR9JywgcHJvdmlkZXJJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmFtZSddID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVuYWJsZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbmFibGVkJ10gPSBlbmFibGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYWNjb3VudFNpZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2FjY291bnRTaWQnXSA9IGFjY291bnRTaWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhdXRoVG9rZW4gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydhdXRoVG9rZW4nXSA9IGF1dGhUb2tlbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGZyb20gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydmcm9tJ10gPSBmcm9tO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIFZvbmFnZSBwcm92aWRlclxuICAgICAqXG4gICAgICogQ3JlYXRlIGEgbmV3IFZvbmFnZSBwcm92aWRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm92aWRlcklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnJvbVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhcGlLZXlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXBpU2VjcmV0XG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlByb3ZpZGVyPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVWb25hZ2VQcm92aWRlcihwcm92aWRlcklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZnJvbT86IHN0cmluZywgYXBpS2V5Pzogc3RyaW5nLCBhcGlTZWNyZXQ/OiBzdHJpbmcsIGVuYWJsZWQ/OiBib29sZWFuKTogUHJvbWlzZTxNb2RlbHMuUHJvdmlkZXI+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlcklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm92aWRlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcIm5hbWVcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL21lc3NhZ2luZy9wcm92aWRlcnMvdm9uYWdlJztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHByb3ZpZGVySWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydwcm92aWRlcklkJ10gPSBwcm92aWRlcklkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ25hbWUnXSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBmcm9tICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZnJvbSddID0gZnJvbTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGFwaUtleSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2FwaUtleSddID0gYXBpS2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYXBpU2VjcmV0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnYXBpU2VjcmV0J10gPSBhcGlTZWNyZXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBlbmFibGVkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZW5hYmxlZCddID0gZW5hYmxlZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncG9zdCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIFZvbmFnZSBwcm92aWRlclxuICAgICAqXG4gICAgICogVXBkYXRlIGEgVm9uYWdlIHByb3ZpZGVyIGJ5IGl0cyB1bmlxdWUgSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvdmlkZXJJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGFwaUtleVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhcGlTZWNyZXRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnJvbVxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Qcm92aWRlcj59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlVm9uYWdlUHJvdmlkZXIocHJvdmlkZXJJZDogc3RyaW5nLCBuYW1lPzogc3RyaW5nLCBlbmFibGVkPzogYm9vbGVhbiwgYXBpS2V5Pzogc3RyaW5nLCBhcGlTZWNyZXQ/OiBzdHJpbmcsIGZyb20/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5Qcm92aWRlcj4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb3ZpZGVySWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInByb3ZpZGVySWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL21lc3NhZ2luZy9wcm92aWRlcnMvdm9uYWdlL3twcm92aWRlcklkfScucmVwbGFjZSgne3Byb3ZpZGVySWR9JywgcHJvdmlkZXJJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmFtZSddID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVuYWJsZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbmFibGVkJ10gPSBlbmFibGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYXBpS2V5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnYXBpS2V5J10gPSBhcGlLZXk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhcGlTZWNyZXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydhcGlTZWNyZXQnXSA9IGFwaVNlY3JldDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGZyb20gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydmcm9tJ10gPSBmcm9tO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHByb3ZpZGVyXG4gICAgICpcbiAgICAgKiBHZXQgYSBwcm92aWRlciBieSBpdHMgdW5pcXVlIElELlxuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvdmlkZXJJZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Qcm92aWRlcj59XG4gICAgICovXG4gICAgYXN5bmMgZ2V0UHJvdmlkZXIocHJvdmlkZXJJZDogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuUHJvdmlkZXI+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlcklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm92aWRlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvcHJvdmlkZXJzL3twcm92aWRlcklkfScucmVwbGFjZSgne3Byb3ZpZGVySWR9JywgcHJvdmlkZXJJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVsZXRlIHByb3ZpZGVyXG4gICAgICpcbiAgICAgKiBEZWxldGUgYSBwcm92aWRlciBieSBpdHMgdW5pcXVlIElELlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVySWRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7fT59XG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlUHJvdmlkZXIocHJvdmlkZXJJZDogc3RyaW5nKTogUHJvbWlzZTx7fT4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb3ZpZGVySWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInByb3ZpZGVySWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL21lc3NhZ2luZy9wcm92aWRlcnMve3Byb3ZpZGVySWR9Jy5yZXBsYWNlKCd7cHJvdmlkZXJJZH0nLCBwcm92aWRlcklkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZGVsZXRlJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMaXN0IHByb3ZpZGVyIGxvZ3NcbiAgICAgKlxuICAgICAqIEdldCB0aGUgcHJvdmlkZXIgYWN0aXZpdHkgbG9ncyBsaXN0ZWQgYnkgaXRzIHVuaXF1ZSBJRC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm92aWRlcklkXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcXVlcmllc1xuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Mb2dMaXN0Pn1cbiAgICAgKi9cbiAgICBhc3luYyBsaXN0UHJvdmlkZXJMb2dzKHByb3ZpZGVySWQ6IHN0cmluZywgcXVlcmllcz86IHN0cmluZ1tdKTogUHJvbWlzZTxNb2RlbHMuTG9nTGlzdD4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb3ZpZGVySWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInByb3ZpZGVySWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL21lc3NhZ2luZy9wcm92aWRlcnMve3Byb3ZpZGVySWR9L2xvZ3MnLnJlcGxhY2UoJ3twcm92aWRlcklkfScsIHByb3ZpZGVySWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgcXVlcmllcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3F1ZXJpZXMnXSA9IHF1ZXJpZXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTGlzdCBzdWJzY3JpYmVyIGxvZ3NcbiAgICAgKlxuICAgICAqIEdldCB0aGUgc3Vic2NyaWJlciBhY3Rpdml0eSBsb2dzIGxpc3RlZCBieSBpdHMgdW5pcXVlIElELlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN1YnNjcmliZXJJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHF1ZXJpZXNcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuTG9nTGlzdD59XG4gICAgICovXG4gICAgYXN5bmMgbGlzdFN1YnNjcmliZXJMb2dzKHN1YnNjcmliZXJJZDogc3RyaW5nLCBxdWVyaWVzPzogc3RyaW5nW10pOiBQcm9taXNlPE1vZGVscy5Mb2dMaXN0PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygc3Vic2NyaWJlcklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJzdWJzY3JpYmVySWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL21lc3NhZ2luZy9zdWJzY3JpYmVycy97c3Vic2NyaWJlcklkfS9sb2dzJy5yZXBsYWNlKCd7c3Vic2NyaWJlcklkfScsIHN1YnNjcmliZXJJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBxdWVyaWVzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncXVlcmllcyddID0gcXVlcmllcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZ2V0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMaXN0IHRvcGljc1xuICAgICAqXG4gICAgICogR2V0IGEgbGlzdCBvZiBhbGwgdG9waWNzIGZyb20gdGhlIGN1cnJlbnQgQXBwY29uZGEgcHJvamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHF1ZXJpZXNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VhcmNoXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlRvcGljTGlzdD59XG4gICAgICovXG4gICAgYXN5bmMgbGlzdFRvcGljcyhxdWVyaWVzPzogc3RyaW5nW10sIHNlYXJjaD86IHN0cmluZyk6IFByb21pc2U8TW9kZWxzLlRvcGljTGlzdD4ge1xuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvdG9waWNzJztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHF1ZXJpZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydxdWVyaWVzJ10gPSBxdWVyaWVzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2VhcmNoICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc2VhcmNoJ10gPSBzZWFyY2g7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHRvcGljXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSBuZXcgdG9waWMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdG9waWNJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gc3Vic2NyaWJlXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlRvcGljPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVUb3BpYyh0b3BpY0lkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgc3Vic2NyaWJlPzogc3RyaW5nW10pOiBQcm9taXNlPE1vZGVscy5Ub3BpYz4ge1xuICAgICAgICBpZiAodHlwZW9mIHRvcGljSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInRvcGljSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwibmFtZVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvbWVzc2FnaW5nL3RvcGljcyc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiB0b3BpY0lkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndG9waWNJZCddID0gdG9waWNJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyduYW1lJ10gPSBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc3Vic2NyaWJlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc3Vic2NyaWJlJ10gPSBzdWJzY3JpYmU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0b3BpY1xuICAgICAqXG4gICAgICogR2V0IGEgdG9waWMgYnkgaXRzIHVuaXF1ZSBJRC5cblxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRvcGljSWRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuVG9waWM+fVxuICAgICAqL1xuICAgIGFzeW5jIGdldFRvcGljKHRvcGljSWQ6IHN0cmluZyk6IFByb21pc2U8TW9kZWxzLlRvcGljPiB7XG4gICAgICAgIGlmICh0eXBlb2YgdG9waWNJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidG9waWNJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvbWVzc2FnaW5nL3RvcGljcy97dG9waWNJZH0nLnJlcGxhY2UoJ3t0b3BpY0lkfScsIHRvcGljSWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0b3BpY1xuICAgICAqXG4gICAgICogVXBkYXRlIGEgdG9waWMgYnkgaXRzIHVuaXF1ZSBJRC5cblxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRvcGljSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHN1YnNjcmliZVxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Ub3BpYz59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlVG9waWModG9waWNJZDogc3RyaW5nLCBuYW1lPzogc3RyaW5nLCBzdWJzY3JpYmU/OiBzdHJpbmdbXSk6IFByb21pc2U8TW9kZWxzLlRvcGljPiB7XG4gICAgICAgIGlmICh0eXBlb2YgdG9waWNJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidG9waWNJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvbWVzc2FnaW5nL3RvcGljcy97dG9waWNJZH0nLnJlcGxhY2UoJ3t0b3BpY0lkfScsIHRvcGljSWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ25hbWUnXSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzdWJzY3JpYmUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzdWJzY3JpYmUnXSA9IHN1YnNjcmliZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncGF0Y2gnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlbGV0ZSB0b3BpY1xuICAgICAqXG4gICAgICogRGVsZXRlIGEgdG9waWMgYnkgaXRzIHVuaXF1ZSBJRC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0b3BpY0lkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8e30+fVxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZVRvcGljKHRvcGljSWQ6IHN0cmluZyk6IFByb21pc2U8e30+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0b3BpY0lkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJ0b3BpY0lkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvdG9waWNzL3t0b3BpY0lkfScucmVwbGFjZSgne3RvcGljSWR9JywgdG9waWNJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2RlbGV0ZScsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTGlzdCB0b3BpYyBsb2dzXG4gICAgICpcbiAgICAgKiBHZXQgdGhlIHRvcGljIGFjdGl2aXR5IGxvZ3MgbGlzdGVkIGJ5IGl0cyB1bmlxdWUgSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdG9waWNJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHF1ZXJpZXNcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuTG9nTGlzdD59XG4gICAgICovXG4gICAgYXN5bmMgbGlzdFRvcGljTG9ncyh0b3BpY0lkOiBzdHJpbmcsIHF1ZXJpZXM/OiBzdHJpbmdbXSk6IFByb21pc2U8TW9kZWxzLkxvZ0xpc3Q+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0b3BpY0lkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJ0b3BpY0lkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvdG9waWNzL3t0b3BpY0lkfS9sb2dzJy5yZXBsYWNlKCd7dG9waWNJZH0nLCB0b3BpY0lkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHF1ZXJpZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydxdWVyaWVzJ10gPSBxdWVyaWVzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExpc3Qgc3Vic2NyaWJlcnNcbiAgICAgKlxuICAgICAqIEdldCBhIGxpc3Qgb2YgYWxsIHN1YnNjcmliZXJzIGZyb20gdGhlIGN1cnJlbnQgQXBwY29uZGEgcHJvamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0b3BpY0lkXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcXVlcmllc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWFyY2hcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuU3Vic2NyaWJlckxpc3Q+fVxuICAgICAqL1xuICAgIGFzeW5jIGxpc3RTdWJzY3JpYmVycyh0b3BpY0lkOiBzdHJpbmcsIHF1ZXJpZXM/OiBzdHJpbmdbXSwgc2VhcmNoPzogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuU3Vic2NyaWJlckxpc3Q+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0b3BpY0lkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJ0b3BpY0lkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvdG9waWNzL3t0b3BpY0lkfS9zdWJzY3JpYmVycycucmVwbGFjZSgne3RvcGljSWR9JywgdG9waWNJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBxdWVyaWVzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncXVlcmllcyddID0gcXVlcmllcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlYXJjaCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3NlYXJjaCddID0gc2VhcmNoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBzdWJzY3JpYmVyXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSBuZXcgc3Vic2NyaWJlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0b3BpY0lkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN1YnNjcmliZXJJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXRJZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5TdWJzY3JpYmVyPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVTdWJzY3JpYmVyKHRvcGljSWQ6IHN0cmluZywgc3Vic2NyaWJlcklkOiBzdHJpbmcsIHRhcmdldElkOiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5TdWJzY3JpYmVyPiB7XG4gICAgICAgIGlmICh0eXBlb2YgdG9waWNJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidG9waWNJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzdWJzY3JpYmVySWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInN1YnNjcmliZXJJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidGFyZ2V0SWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL21lc3NhZ2luZy90b3BpY3Mve3RvcGljSWR9L3N1YnNjcmliZXJzJy5yZXBsYWNlKCd7dG9waWNJZH0nLCB0b3BpY0lkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHN1YnNjcmliZXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3N1YnNjcmliZXJJZCddID0gc3Vic2NyaWJlcklkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0SWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd0YXJnZXRJZCddID0gdGFyZ2V0SWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBzdWJzY3JpYmVyXG4gICAgICpcbiAgICAgKiBHZXQgYSBzdWJzY3JpYmVyIGJ5IGl0cyB1bmlxdWUgSUQuXG5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0b3BpY0lkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN1YnNjcmliZXJJZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5TdWJzY3JpYmVyPn1cbiAgICAgKi9cbiAgICBhc3luYyBnZXRTdWJzY3JpYmVyKHRvcGljSWQ6IHN0cmluZywgc3Vic2NyaWJlcklkOiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5TdWJzY3JpYmVyPiB7XG4gICAgICAgIGlmICh0eXBlb2YgdG9waWNJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidG9waWNJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzdWJzY3JpYmVySWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInN1YnNjcmliZXJJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvbWVzc2FnaW5nL3RvcGljcy97dG9waWNJZH0vc3Vic2NyaWJlcnMve3N1YnNjcmliZXJJZH0nLnJlcGxhY2UoJ3t0b3BpY0lkfScsIHRvcGljSWQpLnJlcGxhY2UoJ3tzdWJzY3JpYmVySWR9Jywgc3Vic2NyaWJlcklkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZ2V0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxldGUgc3Vic2NyaWJlclxuICAgICAqXG4gICAgICogRGVsZXRlIGEgc3Vic2NyaWJlciBieSBpdHMgdW5pcXVlIElELlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRvcGljSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3Vic2NyaWJlcklkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8e30+fVxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZVN1YnNjcmliZXIodG9waWNJZDogc3RyaW5nLCBzdWJzY3JpYmVySWQ6IHN0cmluZyk6IFByb21pc2U8e30+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0b3BpY0lkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJ0b3BpY0lkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHN1YnNjcmliZXJJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwic3Vic2NyaWJlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvdG9waWNzL3t0b3BpY0lkfS9zdWJzY3JpYmVycy97c3Vic2NyaWJlcklkfScucmVwbGFjZSgne3RvcGljSWR9JywgdG9waWNJZCkucmVwbGFjZSgne3N1YnNjcmliZXJJZH0nLCBzdWJzY3JpYmVySWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdkZWxldGUnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxufVxuIl19
|