@appconda/nextjs 1.0.112 → 1.0.114

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.
Files changed (308) hide show
  1. package/package.json +3 -3
  2. package/src/modules/task/action.ts +11 -31
  3. package/dist/actions/actionClient.d.ts +0 -10
  4. package/dist/actions/actionClient.js +0 -38
  5. package/dist/actions/auth.d.ts +0 -1
  6. package/dist/actions/auth.js +0 -6
  7. package/dist/actions/authOptions.d.ts +0 -5
  8. package/dist/actions/authOptions.js +0 -235
  9. package/dist/actions/index.d.ts +0 -3
  10. package/dist/actions/index.js +0 -4
  11. package/dist/actions/nextAuthHandler.d.ts +0 -1
  12. package/dist/actions/nextAuthHandler.js +0 -6
  13. package/dist/actions/nodes.d.ts +0 -4
  14. package/dist/actions/nodes.js +0 -15
  15. package/dist/client.d.ts +0 -141
  16. package/dist/client.js +0 -335
  17. package/dist/decorators/Cache.d.ts +0 -1
  18. package/dist/decorators/Cache.js +0 -79
  19. package/dist/decorators/CacheKey.d.ts +0 -1
  20. package/dist/decorators/CacheKey.js +0 -9
  21. package/dist/decorators/Invalidate.d.ts +0 -1
  22. package/dist/decorators/Invalidate.js +0 -47
  23. package/dist/enums/api-service.d.ts +0 -13
  24. package/dist/enums/api-service.js +0 -15
  25. package/dist/enums/api.d.ts +0 -5
  26. package/dist/enums/api.js +0 -7
  27. package/dist/enums/auth-method.d.ts +0 -9
  28. package/dist/enums/auth-method.js +0 -11
  29. package/dist/enums/authentication-factor.d.ts +0 -6
  30. package/dist/enums/authentication-factor.js +0 -7
  31. package/dist/enums/authenticator-type.d.ts +0 -3
  32. package/dist/enums/authenticator-type.js +0 -4
  33. package/dist/enums/browser.d.ts +0 -16
  34. package/dist/enums/browser.js +0 -18
  35. package/dist/enums/compression.d.ts +0 -5
  36. package/dist/enums/compression.js +0 -7
  37. package/dist/enums/credit-card.d.ts +0 -18
  38. package/dist/enums/credit-card.js +0 -20
  39. package/dist/enums/database-usage-range.d.ts +0 -5
  40. package/dist/enums/database-usage-range.js +0 -7
  41. package/dist/enums/email-template-locale.d.ts +0 -133
  42. package/dist/enums/email-template-locale.js +0 -135
  43. package/dist/enums/email-template-type.d.ts +0 -9
  44. package/dist/enums/email-template-type.js +0 -11
  45. package/dist/enums/entities/EntityLimitType.d.ts +0 -4
  46. package/dist/enums/entities/EntityLimitType.js +0 -6
  47. package/dist/enums/entities/PropertyAttributeName.d.ts +0 -27
  48. package/dist/enums/entities/PropertyAttributeName.js +0 -29
  49. package/dist/enums/entities/PropertyCondition.d.ts +0 -7
  50. package/dist/enums/entities/PropertyCondition.js +0 -10
  51. package/dist/enums/entities/PropertyType.d.ts +0 -12
  52. package/dist/enums/entities/PropertyType.js +0 -18
  53. package/dist/enums/entities/PropertyValueType.d.ts +0 -6
  54. package/dist/enums/entities/PropertyValueType.js +0 -8
  55. package/dist/enums/entities/RowAccess.d.ts +0 -2
  56. package/dist/enums/entities/RowAccess.js +0 -2
  57. package/dist/enums/entities/ViewFilterCondition.d.ts +0 -12
  58. package/dist/enums/entities/ViewFilterCondition.js +0 -14
  59. package/dist/enums/execution-method.d.ts +0 -8
  60. package/dist/enums/execution-method.js +0 -10
  61. package/dist/enums/flag.d.ts +0 -197
  62. package/dist/enums/flag.js +0 -199
  63. package/dist/enums/function-usage-range.d.ts +0 -5
  64. package/dist/enums/function-usage-range.js +0 -7
  65. package/dist/enums/image-format.d.ts +0 -7
  66. package/dist/enums/image-format.js +0 -9
  67. package/dist/enums/image-gravity.d.ts +0 -11
  68. package/dist/enums/image-gravity.js +0 -13
  69. package/dist/enums/index-type.d.ts +0 -5
  70. package/dist/enums/index-type.js +0 -7
  71. package/dist/enums/messaging-provider-type.d.ts +0 -5
  72. package/dist/enums/messaging-provider-type.js +0 -7
  73. package/dist/enums/name.d.ts +0 -14
  74. package/dist/enums/name.js +0 -16
  75. package/dist/enums/o-auth-provider copy.d.ts +0 -41
  76. package/dist/enums/o-auth-provider copy.js +0 -43
  77. package/dist/enums/o-auth-provider.d.ts +0 -41
  78. package/dist/enums/o-auth-provider.js +0 -42
  79. package/dist/enums/password-hash.d.ts +0 -13
  80. package/dist/enums/password-hash.js +0 -15
  81. package/dist/enums/platform-type.d.ts +0 -17
  82. package/dist/enums/platform-type.js +0 -19
  83. package/dist/enums/project-usage-range.d.ts +0 -4
  84. package/dist/enums/project-usage-range.js +0 -6
  85. package/dist/enums/region.d.ts +0 -4
  86. package/dist/enums/region.js +0 -6
  87. package/dist/enums/relation-mutate.d.ts +0 -5
  88. package/dist/enums/relation-mutate.js +0 -7
  89. package/dist/enums/relationship-type.d.ts +0 -6
  90. package/dist/enums/relationship-type.js +0 -8
  91. package/dist/enums/resource-type.d.ts +0 -4
  92. package/dist/enums/resource-type.js +0 -6
  93. package/dist/enums/runtime.d.ts +0 -48
  94. package/dist/enums/runtime.js +0 -50
  95. package/dist/enums/s-m-t-p-secure.d.ts +0 -3
  96. package/dist/enums/s-m-t-p-secure.js +0 -5
  97. package/dist/enums/shared/ApplicationLayout.d.ts +0 -4
  98. package/dist/enums/shared/ApplicationLayout.js +0 -6
  99. package/dist/enums/shared/Colors.d.ts +0 -24
  100. package/dist/enums/shared/Colors.js +0 -26
  101. package/dist/enums/shared/InputType.d.ts +0 -6
  102. package/dist/enums/shared/InputType.js +0 -8
  103. package/dist/enums/shared/Periodicity.d.ts +0 -7
  104. package/dist/enums/shared/Periodicity.js +0 -9
  105. package/dist/enums/shared/SvgIcon.d.ts +0 -37
  106. package/dist/enums/shared/SvgIcon.js +0 -39
  107. package/dist/enums/shared/Theme.d.ts +0 -4
  108. package/dist/enums/shared/Theme.js +0 -6
  109. package/dist/enums/sms-template-locale.d.ts +0 -133
  110. package/dist/enums/sms-template-locale.js +0 -135
  111. package/dist/enums/sms-template-type.d.ts +0 -6
  112. package/dist/enums/sms-template-type.js +0 -8
  113. package/dist/enums/smtp-encryption.d.ts +0 -5
  114. package/dist/enums/smtp-encryption.js +0 -7
  115. package/dist/enums/storage-usage-range.d.ts +0 -5
  116. package/dist/enums/storage-usage-range.js +0 -7
  117. package/dist/enums/subscriptions/PricingModel.d.ts +0 -11
  118. package/dist/enums/subscriptions/PricingModel.js +0 -12
  119. package/dist/enums/subscriptions/SubscriptionBillingPeriod.d.ts +0 -10
  120. package/dist/enums/subscriptions/SubscriptionBillingPeriod.js +0 -11
  121. package/dist/enums/subscriptions/SubscriptionFeatureLimitType.d.ts +0 -10
  122. package/dist/enums/subscriptions/SubscriptionFeatureLimitType.js +0 -13
  123. package/dist/enums/subscriptions/SubscriptionPriceType.d.ts +0 -7
  124. package/dist/enums/subscriptions/SubscriptionPriceType.js +0 -8
  125. package/dist/enums/tenants/LinkedAccountStatus.d.ts +0 -5
  126. package/dist/enums/tenants/LinkedAccountStatus.js +0 -7
  127. package/dist/enums/tenants/TenantUserJoined.d.ts +0 -6
  128. package/dist/enums/tenants/TenantUserJoined.js +0 -8
  129. package/dist/enums/tenants/TenantUserStatus.d.ts +0 -6
  130. package/dist/enums/tenants/TenantUserStatus.js +0 -8
  131. package/dist/enums/tenants/TenantUserType.d.ts +0 -5
  132. package/dist/enums/tenants/TenantUserType.js +0 -7
  133. package/dist/enums/user-usage-range.d.ts +0 -5
  134. package/dist/enums/user-usage-range.js +0 -7
  135. package/dist/getAppcondaClient.d.ts +0 -2
  136. package/dist/getAppcondaClient.js +0 -44
  137. package/dist/getSDKForCurrentUser.d.ts +0 -43
  138. package/dist/getSDKForCurrentUser.js +0 -76
  139. package/dist/getSDKForService.d.ts +0 -6
  140. package/dist/getSDKForService.js +0 -51
  141. package/dist/getSDKForTenant.d.ts +0 -20
  142. package/dist/getSDKForTenant.js +0 -44
  143. package/dist/id.d.ts +0 -20
  144. package/dist/id.js +0 -45
  145. package/dist/index.d.ts +0 -44
  146. package/dist/index.js +0 -42
  147. package/dist/inputFile.d.ts +0 -6
  148. package/dist/inputFile.js +0 -17
  149. package/dist/lib/Cache/Adapter.d.ts +0 -10
  150. package/dist/lib/Cache/Adapter.js +0 -2
  151. package/dist/lib/Cache/Adapters/Filesystem.d.ts +0 -16
  152. package/dist/lib/Cache/Adapters/Filesystem.js +0 -103
  153. package/dist/lib/Cache/Adapters/Memory.d.ts +0 -18
  154. package/dist/lib/Cache/Adapters/Memory.js +0 -47
  155. package/dist/lib/Cache/Adapters/None.d.ts +0 -12
  156. package/dist/lib/Cache/Adapters/None.js +0 -28
  157. package/dist/lib/Cache/Adapters/Sharding.d.ts +0 -17
  158. package/dist/lib/Cache/Adapters/Sharding.js +0 -73
  159. package/dist/lib/Cache/Cache.d.ts +0 -16
  160. package/dist/lib/Cache/Cache.js +0 -52
  161. package/dist/lib/Cache/index.d.ts +0 -4
  162. package/dist/lib/Cache/index.js +0 -5
  163. package/dist/lib/Cache/test.d.ts +0 -0
  164. package/dist/lib/Cache/test.js +0 -1
  165. package/dist/lib/Registry/Registry.d.ts +0 -38
  166. package/dist/lib/Registry/Registry.js +0 -56
  167. package/dist/lib/Registry/index.d.ts +0 -1
  168. package/dist/lib/Registry/index.js +0 -2
  169. package/dist/lib/Services.d.ts +0 -6
  170. package/dist/lib/Services.js +0 -14
  171. package/dist/lib/crypto.d.ts +0 -23
  172. package/dist/lib/crypto.js +0 -78
  173. package/dist/lib/env.d.ts +0 -1
  174. package/dist/lib/env.js +0 -137
  175. package/dist/lib/errors.d.ts +0 -70
  176. package/dist/lib/errors.js +0 -76
  177. package/dist/lib/index.d.ts +0 -2
  178. package/dist/lib/index.js +0 -3
  179. package/dist/lib/jwt.d.ts +0 -12
  180. package/dist/lib/jwt.js +0 -103
  181. package/dist/models.d.ts +0 -3272
  182. package/dist/models.js +0 -2
  183. package/dist/modules/account/actions.d.ts +0 -25
  184. package/dist/modules/account/actions.js +0 -18
  185. package/dist/modules/account/enums/authentication-factor.d.ts +0 -6
  186. package/dist/modules/account/enums/authentication-factor.js +0 -8
  187. package/dist/modules/account/enums/authenticator-type.d.ts +0 -3
  188. package/dist/modules/account/enums/authenticator-type.js +0 -5
  189. package/dist/modules/account/enums/o-auth-provider.d.ts +0 -41
  190. package/dist/modules/account/enums/o-auth-provider.js +0 -43
  191. package/dist/modules/account/index.d.ts +0 -3
  192. package/dist/modules/account/index.js +0 -4
  193. package/dist/modules/account/schema.d.ts +0 -17
  194. package/dist/modules/account/schema.js +0 -8
  195. package/dist/modules/account/service.d.ts +0 -530
  196. package/dist/modules/account/service.js +0 -1260
  197. package/dist/modules/account/types.d.ts +0 -411
  198. package/dist/modules/account/types.js +0 -2
  199. package/dist/modules/acl/service.d.ts +0 -26
  200. package/dist/modules/acl/service.js +0 -27
  201. package/dist/modules/agent/action.d.ts +0 -53
  202. package/dist/modules/agent/action.js +0 -64
  203. package/dist/modules/agent/index.d.ts +0 -4
  204. package/dist/modules/agent/index.js +0 -5
  205. package/dist/modules/agent/schema.d.ts +0 -48
  206. package/dist/modules/agent/schema.js +0 -21
  207. package/dist/modules/agent/service.d.ts +0 -12
  208. package/dist/modules/agent/service.js +0 -22
  209. package/dist/modules/agent/types.d.ts +0 -11
  210. package/dist/modules/agent/types.js +0 -2
  211. package/dist/modules/ai/index.d.ts +0 -1
  212. package/dist/modules/ai/index.js +0 -2
  213. package/dist/modules/ai/node/actions.d.ts +0 -4
  214. package/dist/modules/ai/node/actions.js +0 -16
  215. package/dist/modules/ai/node/index.d.ts +0 -2
  216. package/dist/modules/ai/node/index.js +0 -3
  217. package/dist/modules/ai/node/service.d.ts +0 -5
  218. package/dist/modules/ai/node/service.js +0 -12
  219. package/dist/modules/index.d.ts +0 -6
  220. package/dist/modules/index.js +0 -7
  221. package/dist/modules/task/action.d.ts +0 -168
  222. package/dist/modules/task/action.js +0 -163
  223. package/dist/modules/task/index.d.ts +0 -4
  224. package/dist/modules/task/index.js +0 -5
  225. package/dist/modules/task/schema.d.ts +0 -107
  226. package/dist/modules/task/schema.js +0 -44
  227. package/dist/modules/task/service.d.ts +0 -19
  228. package/dist/modules/task/service.js +0 -43
  229. package/dist/modules/task/types.d.ts +0 -84
  230. package/dist/modules/task/types.js +0 -2
  231. package/dist/modules/tenant/actions.d.ts +0 -45
  232. package/dist/modules/tenant/actions.js +0 -38
  233. package/dist/modules/tenant/index.d.ts +0 -3
  234. package/dist/modules/tenant/index.js +0 -4
  235. package/dist/modules/tenant/tenant.d.ts +0 -32
  236. package/dist/modules/tenant/tenant.js +0 -125
  237. package/dist/modules/tenant/types.d.ts +0 -11
  238. package/dist/modules/tenant/types.js +0 -2
  239. package/dist/modules/waitlist/action.d.ts +0 -69
  240. package/dist/modules/waitlist/action.js +0 -78
  241. package/dist/modules/waitlist/index.d.ts +0 -4
  242. package/dist/modules/waitlist/index.js +0 -5
  243. package/dist/modules/waitlist/schema.d.ts +0 -39
  244. package/dist/modules/waitlist/schema.js +0 -18
  245. package/dist/modules/waitlist/service.d.ts +0 -13
  246. package/dist/modules/waitlist/service.js +0 -28
  247. package/dist/modules/waitlist/types.d.ts +0 -14
  248. package/dist/modules/waitlist/types.js +0 -2
  249. package/dist/permission.d.ts +0 -43
  250. package/dist/permission.js +0 -54
  251. package/dist/query.d.ts +0 -194
  252. package/dist/query.js +0 -204
  253. package/dist/role.d.ts +0 -70
  254. package/dist/role.js +0 -94
  255. package/dist/schemas/nodes.d.ts +0 -0
  256. package/dist/schemas/nodes.js +0 -1
  257. package/dist/service-client.d.ts +0 -7
  258. package/dist/service-client.js +0 -14
  259. package/dist/service.d.ts +0 -11
  260. package/dist/service.js +0 -23
  261. package/dist/services/account.d.ts +0 -530
  262. package/dist/services/account.js +0 -1259
  263. package/dist/services/applets.d.ts +0 -9
  264. package/dist/services/applets.js +0 -40
  265. package/dist/services/avatars.d.ts +0 -115
  266. package/dist/services/avatars.js +0 -251
  267. package/dist/services/chat-flow.d.ts +0 -7
  268. package/dist/services/chat-flow.js +0 -26
  269. package/dist/services/community.d.ts +0 -19
  270. package/dist/services/community.js +0 -69
  271. package/dist/services/configuration.d.ts +0 -5
  272. package/dist/services/configuration.js +0 -11
  273. package/dist/services/databases.d.ts +0 -613
  274. package/dist/services/databases.js +0 -1736
  275. package/dist/services/functions.d.ts +0 -319
  276. package/dist/services/functions.js +0 -810
  277. package/dist/services/graphql.d.ts +0 -25
  278. package/dist/services/graphql.js +0 -57
  279. package/dist/services/health.d.ts +0 -231
  280. package/dist/services/health.js +0 -463
  281. package/dist/services/locale.d.ts +0 -80
  282. package/dist/services/locale.js +0 -144
  283. package/dist/services/messaging.d.ts +0 -685
  284. package/dist/services/messaging.js +0 -1920
  285. package/dist/services/node.d.ts +0 -5
  286. package/dist/services/node.js +0 -11
  287. package/dist/services/permissions.d.ts +0 -20
  288. package/dist/services/permissions.js +0 -90
  289. package/dist/services/pricing.d.ts +0 -15
  290. package/dist/services/pricing.js +0 -21
  291. package/dist/services/projects.d.ts +0 -542
  292. package/dist/services/projects.js +0 -1526
  293. package/dist/services/roles.d.ts +0 -19
  294. package/dist/services/roles.js +0 -72
  295. package/dist/services/schema.d.ts +0 -17
  296. package/dist/services/schema.js +0 -48
  297. package/dist/services/storage.d.ts +0 -189
  298. package/dist/services/storage.js +0 -474
  299. package/dist/services/subscription.d.ts +0 -15
  300. package/dist/services/subscription.js +0 -30
  301. package/dist/services/teams.d.ts +0 -167
  302. package/dist/services/teams.js +0 -395
  303. package/dist/services/tenant-subscription.d.ts +0 -12
  304. package/dist/services/tenant-subscription.js +0 -52
  305. package/dist/services/tenant.d.ts +0 -32
  306. package/dist/services/tenant.js +0 -124
  307. package/dist/services/users.d.ts +0 -499
  308. package/dist/services/users.js +0 -1283
@@ -1,810 +0,0 @@
1
- import { AppcondaException } from '../client';
2
- export class Functions {
3
- constructor(client) {
4
- this.client = client;
5
- }
6
- /**
7
- * List functions
8
- *
9
- * Get a list of all the project's functions. You can use the query params to filter your results.
10
- *
11
- * @param {string[]} queries
12
- * @param {string} search
13
- * @throws {AppcondaException}
14
- * @returns {Promise<Models.FunctionList>}
15
- */
16
- async list(queries, search) {
17
- const apiPath = '/functions';
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 function
33
- *
34
- * Create a new function. You can pass a list of [permissions](https://appconda.io/docs/permissions) to allow different project users or team with access to execute the function using the client API.
35
- *
36
- * @param {string} functionId
37
- * @param {string} name
38
- * @param {Runtime} runtime
39
- * @param {string[]} execute
40
- * @param {string[]} events
41
- * @param {string} schedule
42
- * @param {number} timeout
43
- * @param {boolean} enabled
44
- * @param {boolean} logging
45
- * @param {string} entrypoint
46
- * @param {string} commands
47
- * @param {string[]} scopes
48
- * @param {string} installationId
49
- * @param {string} providerRepositoryId
50
- * @param {string} providerBranch
51
- * @param {boolean} providerSilentMode
52
- * @param {string} providerRootDirectory
53
- * @param {string} templateRepository
54
- * @param {string} templateOwner
55
- * @param {string} templateRootDirectory
56
- * @param {string} templateVersion
57
- * @param {string} specification
58
- * @throws {AppcondaException}
59
- * @returns {Promise<Models.Function>}
60
- */
61
- async create(functionId, name, runtime, execute, events, schedule, timeout, enabled, logging, entrypoint, commands, scopes, installationId, providerRepositoryId, providerBranch, providerSilentMode, providerRootDirectory, templateRepository, templateOwner, templateRootDirectory, templateVersion, specification) {
62
- if (typeof functionId === 'undefined') {
63
- throw new AppcondaException('Missing required parameter: "functionId"');
64
- }
65
- if (typeof name === 'undefined') {
66
- throw new AppcondaException('Missing required parameter: "name"');
67
- }
68
- if (typeof runtime === 'undefined') {
69
- throw new AppcondaException('Missing required parameter: "runtime"');
70
- }
71
- const apiPath = '/functions';
72
- const payload = {};
73
- if (typeof functionId !== 'undefined') {
74
- payload['functionId'] = functionId;
75
- }
76
- if (typeof name !== 'undefined') {
77
- payload['name'] = name;
78
- }
79
- if (typeof runtime !== 'undefined') {
80
- payload['runtime'] = runtime;
81
- }
82
- if (typeof execute !== 'undefined') {
83
- payload['execute'] = execute;
84
- }
85
- if (typeof events !== 'undefined') {
86
- payload['events'] = events;
87
- }
88
- if (typeof schedule !== 'undefined') {
89
- payload['schedule'] = schedule;
90
- }
91
- if (typeof timeout !== 'undefined') {
92
- payload['timeout'] = timeout;
93
- }
94
- if (typeof enabled !== 'undefined') {
95
- payload['enabled'] = enabled;
96
- }
97
- if (typeof logging !== 'undefined') {
98
- payload['logging'] = logging;
99
- }
100
- if (typeof entrypoint !== 'undefined') {
101
- payload['entrypoint'] = entrypoint;
102
- }
103
- if (typeof commands !== 'undefined') {
104
- payload['commands'] = commands;
105
- }
106
- if (typeof scopes !== 'undefined') {
107
- payload['scopes'] = scopes;
108
- }
109
- if (typeof installationId !== 'undefined') {
110
- payload['installationId'] = installationId;
111
- }
112
- if (typeof providerRepositoryId !== 'undefined') {
113
- payload['providerRepositoryId'] = providerRepositoryId;
114
- }
115
- if (typeof providerBranch !== 'undefined') {
116
- payload['providerBranch'] = providerBranch;
117
- }
118
- if (typeof providerSilentMode !== 'undefined') {
119
- payload['providerSilentMode'] = providerSilentMode;
120
- }
121
- if (typeof providerRootDirectory !== 'undefined') {
122
- payload['providerRootDirectory'] = providerRootDirectory;
123
- }
124
- if (typeof templateRepository !== 'undefined') {
125
- payload['templateRepository'] = templateRepository;
126
- }
127
- if (typeof templateOwner !== 'undefined') {
128
- payload['templateOwner'] = templateOwner;
129
- }
130
- if (typeof templateRootDirectory !== 'undefined') {
131
- payload['templateRootDirectory'] = templateRootDirectory;
132
- }
133
- if (typeof templateVersion !== 'undefined') {
134
- payload['templateVersion'] = templateVersion;
135
- }
136
- if (typeof specification !== 'undefined') {
137
- payload['specification'] = specification;
138
- }
139
- const uri = new URL(this.client.config.endpoint + apiPath);
140
- const apiHeaders = {
141
- 'content-type': 'application/json',
142
- };
143
- return await this.client.call('post', uri, apiHeaders, payload);
144
- }
145
- /**
146
- * List runtimes
147
- *
148
- * Get a list of all runtimes that are currently active on your instance.
149
- *
150
- * @throws {AppcondaException}
151
- * @returns {Promise<Models.RuntimeList>}
152
- */
153
- async listRuntimes() {
154
- const apiPath = '/functions/runtimes';
155
- const payload = {};
156
- const uri = new URL(this.client.config.endpoint + apiPath);
157
- const apiHeaders = {
158
- 'content-type': 'application/json',
159
- };
160
- return await this.client.call('get', uri, apiHeaders, payload);
161
- }
162
- /**
163
- * List available function runtime specifications
164
- *
165
- * List allowed function specifications for this instance.
166
-
167
- *
168
- * @throws {AppcondaException}
169
- * @returns {Promise<Models.SpecificationList>}
170
- */
171
- async listSpecifications() {
172
- const apiPath = '/functions/specifications';
173
- const payload = {};
174
- const uri = new URL(this.client.config.endpoint + apiPath);
175
- const apiHeaders = {
176
- 'content-type': 'application/json',
177
- };
178
- return await this.client.call('get', uri, apiHeaders, payload);
179
- }
180
- /**
181
- * Get function
182
- *
183
- * Get a function by its unique ID.
184
- *
185
- * @param {string} functionId
186
- * @throws {AppcondaException}
187
- * @returns {Promise<Models.Function>}
188
- */
189
- async get(functionId) {
190
- if (typeof functionId === 'undefined') {
191
- throw new AppcondaException('Missing required parameter: "functionId"');
192
- }
193
- const apiPath = '/functions/{functionId}'.replace('{functionId}', functionId);
194
- const payload = {};
195
- const uri = new URL(this.client.config.endpoint + apiPath);
196
- const apiHeaders = {
197
- 'content-type': 'application/json',
198
- };
199
- return await this.client.call('get', uri, apiHeaders, payload);
200
- }
201
- /**
202
- * Update function
203
- *
204
- * Update function by its unique ID.
205
- *
206
- * @param {string} functionId
207
- * @param {string} name
208
- * @param {Runtime} runtime
209
- * @param {string[]} execute
210
- * @param {string[]} events
211
- * @param {string} schedule
212
- * @param {number} timeout
213
- * @param {boolean} enabled
214
- * @param {boolean} logging
215
- * @param {string} entrypoint
216
- * @param {string} commands
217
- * @param {string[]} scopes
218
- * @param {string} installationId
219
- * @param {string} providerRepositoryId
220
- * @param {string} providerBranch
221
- * @param {boolean} providerSilentMode
222
- * @param {string} providerRootDirectory
223
- * @param {string} specification
224
- * @throws {AppcondaException}
225
- * @returns {Promise<Models.Function>}
226
- */
227
- async update(functionId, name, runtime, execute, events, schedule, timeout, enabled, logging, entrypoint, commands, scopes, installationId, providerRepositoryId, providerBranch, providerSilentMode, providerRootDirectory, specification) {
228
- if (typeof functionId === 'undefined') {
229
- throw new AppcondaException('Missing required parameter: "functionId"');
230
- }
231
- if (typeof name === 'undefined') {
232
- throw new AppcondaException('Missing required parameter: "name"');
233
- }
234
- const apiPath = '/functions/{functionId}'.replace('{functionId}', functionId);
235
- const payload = {};
236
- if (typeof name !== 'undefined') {
237
- payload['name'] = name;
238
- }
239
- if (typeof runtime !== 'undefined') {
240
- payload['runtime'] = runtime;
241
- }
242
- if (typeof execute !== 'undefined') {
243
- payload['execute'] = execute;
244
- }
245
- if (typeof events !== 'undefined') {
246
- payload['events'] = events;
247
- }
248
- if (typeof schedule !== 'undefined') {
249
- payload['schedule'] = schedule;
250
- }
251
- if (typeof timeout !== 'undefined') {
252
- payload['timeout'] = timeout;
253
- }
254
- if (typeof enabled !== 'undefined') {
255
- payload['enabled'] = enabled;
256
- }
257
- if (typeof logging !== 'undefined') {
258
- payload['logging'] = logging;
259
- }
260
- if (typeof entrypoint !== 'undefined') {
261
- payload['entrypoint'] = entrypoint;
262
- }
263
- if (typeof commands !== 'undefined') {
264
- payload['commands'] = commands;
265
- }
266
- if (typeof scopes !== 'undefined') {
267
- payload['scopes'] = scopes;
268
- }
269
- if (typeof installationId !== 'undefined') {
270
- payload['installationId'] = installationId;
271
- }
272
- if (typeof providerRepositoryId !== 'undefined') {
273
- payload['providerRepositoryId'] = providerRepositoryId;
274
- }
275
- if (typeof providerBranch !== 'undefined') {
276
- payload['providerBranch'] = providerBranch;
277
- }
278
- if (typeof providerSilentMode !== 'undefined') {
279
- payload['providerSilentMode'] = providerSilentMode;
280
- }
281
- if (typeof providerRootDirectory !== 'undefined') {
282
- payload['providerRootDirectory'] = providerRootDirectory;
283
- }
284
- if (typeof specification !== 'undefined') {
285
- payload['specification'] = specification;
286
- }
287
- const uri = new URL(this.client.config.endpoint + apiPath);
288
- const apiHeaders = {
289
- 'content-type': 'application/json',
290
- };
291
- return await this.client.call('put', uri, apiHeaders, payload);
292
- }
293
- /**
294
- * Delete function
295
- *
296
- * Delete a function by its unique ID.
297
- *
298
- * @param {string} functionId
299
- * @throws {AppcondaException}
300
- * @returns {Promise<{}>}
301
- */
302
- async delete(functionId) {
303
- if (typeof functionId === 'undefined') {
304
- throw new AppcondaException('Missing required parameter: "functionId"');
305
- }
306
- const apiPath = '/functions/{functionId}'.replace('{functionId}', functionId);
307
- const payload = {};
308
- const uri = new URL(this.client.config.endpoint + apiPath);
309
- const apiHeaders = {
310
- 'content-type': 'application/json',
311
- };
312
- return await this.client.call('delete', uri, apiHeaders, payload);
313
- }
314
- /**
315
- * List deployments
316
- *
317
- * Get a list of all the project&#039;s code deployments. You can use the query params to filter your results.
318
- *
319
- * @param {string} functionId
320
- * @param {string[]} queries
321
- * @param {string} search
322
- * @throws {AppcondaException}
323
- * @returns {Promise<Models.DeploymentList>}
324
- */
325
- async listDeployments(functionId, queries, search) {
326
- if (typeof functionId === 'undefined') {
327
- throw new AppcondaException('Missing required parameter: "functionId"');
328
- }
329
- const apiPath = '/functions/{functionId}/deployments'.replace('{functionId}', functionId);
330
- const payload = {};
331
- if (typeof queries !== 'undefined') {
332
- payload['queries'] = queries;
333
- }
334
- if (typeof search !== 'undefined') {
335
- payload['search'] = search;
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('get', uri, apiHeaders, payload);
342
- }
343
- /**
344
- * Create deployment
345
- *
346
- * Create a new function code deployment. Use this endpoint to upload a new version of your code function. To execute your newly uploaded code, you&#039;ll need to update the function&#039;s deployment to use your new deployment UID.
347
-
348
- This endpoint accepts a tar.gz file compressed with your code. Make sure to include any dependencies your code has within the compressed file. You can learn more about code packaging in the [Appconda Cloud Functions tutorial](https://appconda.io/docs/functions).
349
-
350
- Use the &quot;command&quot; param to set the entrypoint used to execute your code.
351
- *
352
- * @param {string} functionId
353
- * @param {File} code
354
- * @param {boolean} activate
355
- * @param {string} entrypoint
356
- * @param {string} commands
357
- * @throws {AppcondaException}
358
- * @returns {Promise<Models.Deployment>}
359
- */
360
- async createDeployment(functionId, code, activate, entrypoint, commands, onProgress = (progress) => { }) {
361
- if (typeof functionId === 'undefined') {
362
- throw new AppcondaException('Missing required parameter: "functionId"');
363
- }
364
- if (typeof code === 'undefined') {
365
- throw new AppcondaException('Missing required parameter: "code"');
366
- }
367
- if (typeof activate === 'undefined') {
368
- throw new AppcondaException('Missing required parameter: "activate"');
369
- }
370
- const apiPath = '/functions/{functionId}/deployments'.replace('{functionId}', functionId);
371
- const payload = {};
372
- if (typeof entrypoint !== 'undefined') {
373
- payload['entrypoint'] = entrypoint;
374
- }
375
- if (typeof commands !== 'undefined') {
376
- payload['commands'] = commands;
377
- }
378
- if (typeof code !== 'undefined') {
379
- payload['code'] = code;
380
- }
381
- if (typeof activate !== 'undefined') {
382
- payload['activate'] = activate;
383
- }
384
- const uri = new URL(this.client.config.endpoint + apiPath);
385
- const apiHeaders = {
386
- 'content-type': 'multipart/form-data',
387
- };
388
- return await this.client.chunkedUpload('post', uri, apiHeaders, payload, onProgress);
389
- }
390
- /**
391
- * Get deployment
392
- *
393
- * Get a code deployment by its unique ID.
394
- *
395
- * @param {string} functionId
396
- * @param {string} deploymentId
397
- * @throws {AppcondaException}
398
- * @returns {Promise<Models.Deployment>}
399
- */
400
- async getDeployment(functionId, deploymentId) {
401
- if (typeof functionId === 'undefined') {
402
- throw new AppcondaException('Missing required parameter: "functionId"');
403
- }
404
- if (typeof deploymentId === 'undefined') {
405
- throw new AppcondaException('Missing required parameter: "deploymentId"');
406
- }
407
- const apiPath = '/functions/{functionId}/deployments/{deploymentId}'.replace('{functionId}', functionId).replace('{deploymentId}', deploymentId);
408
- const payload = {};
409
- const uri = new URL(this.client.config.endpoint + apiPath);
410
- const apiHeaders = {
411
- 'content-type': 'application/json',
412
- };
413
- return await this.client.call('get', uri, apiHeaders, payload);
414
- }
415
- /**
416
- * Update deployment
417
- *
418
- * Update the function code deployment ID using the unique function ID. Use this endpoint to switch the code deployment that should be executed by the execution endpoint.
419
- *
420
- * @param {string} functionId
421
- * @param {string} deploymentId
422
- * @throws {AppcondaException}
423
- * @returns {Promise<Models.Function>}
424
- */
425
- async updateDeployment(functionId, deploymentId) {
426
- if (typeof functionId === 'undefined') {
427
- throw new AppcondaException('Missing required parameter: "functionId"');
428
- }
429
- if (typeof deploymentId === 'undefined') {
430
- throw new AppcondaException('Missing required parameter: "deploymentId"');
431
- }
432
- const apiPath = '/functions/{functionId}/deployments/{deploymentId}'.replace('{functionId}', functionId).replace('{deploymentId}', deploymentId);
433
- const payload = {};
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
- * Delete deployment
442
- *
443
- * Delete a code deployment by its unique ID.
444
- *
445
- * @param {string} functionId
446
- * @param {string} deploymentId
447
- * @throws {AppcondaException}
448
- * @returns {Promise<{}>}
449
- */
450
- async deleteDeployment(functionId, deploymentId) {
451
- if (typeof functionId === 'undefined') {
452
- throw new AppcondaException('Missing required parameter: "functionId"');
453
- }
454
- if (typeof deploymentId === 'undefined') {
455
- throw new AppcondaException('Missing required parameter: "deploymentId"');
456
- }
457
- const apiPath = '/functions/{functionId}/deployments/{deploymentId}'.replace('{functionId}', functionId).replace('{deploymentId}', deploymentId);
458
- const payload = {};
459
- const uri = new URL(this.client.config.endpoint + apiPath);
460
- const apiHeaders = {
461
- 'content-type': 'application/json',
462
- };
463
- return await this.client.call('delete', uri, apiHeaders, payload);
464
- }
465
- /**
466
- * Rebuild deployment
467
- *
468
- *
469
- * @param {string} functionId
470
- * @param {string} deploymentId
471
- * @param {string} buildId
472
- * @throws {AppcondaException}
473
- * @returns {Promise<{}>}
474
- */
475
- async createBuild(functionId, deploymentId, buildId) {
476
- if (typeof functionId === 'undefined') {
477
- throw new AppcondaException('Missing required parameter: "functionId"');
478
- }
479
- if (typeof deploymentId === 'undefined') {
480
- throw new AppcondaException('Missing required parameter: "deploymentId"');
481
- }
482
- const apiPath = '/functions/{functionId}/deployments/{deploymentId}/build'.replace('{functionId}', functionId).replace('{deploymentId}', deploymentId);
483
- const payload = {};
484
- if (typeof buildId !== 'undefined') {
485
- payload['buildId'] = buildId;
486
- }
487
- const uri = new URL(this.client.config.endpoint + apiPath);
488
- const apiHeaders = {
489
- 'content-type': 'application/json',
490
- };
491
- return await this.client.call('post', uri, apiHeaders, payload);
492
- }
493
- /**
494
- * Cancel deployment
495
- *
496
- *
497
- * @param {string} functionId
498
- * @param {string} deploymentId
499
- * @throws {AppcondaException}
500
- * @returns {Promise<Models.Build>}
501
- */
502
- async updateDeploymentBuild(functionId, deploymentId) {
503
- if (typeof functionId === 'undefined') {
504
- throw new AppcondaException('Missing required parameter: "functionId"');
505
- }
506
- if (typeof deploymentId === 'undefined') {
507
- throw new AppcondaException('Missing required parameter: "deploymentId"');
508
- }
509
- const apiPath = '/functions/{functionId}/deployments/{deploymentId}/build'.replace('{functionId}', functionId).replace('{deploymentId}', deploymentId);
510
- const payload = {};
511
- const uri = new URL(this.client.config.endpoint + apiPath);
512
- const apiHeaders = {
513
- 'content-type': 'application/json',
514
- };
515
- return await this.client.call('patch', uri, apiHeaders, payload);
516
- }
517
- /**
518
- * Download deployment
519
- *
520
- * Get a Deployment&#039;s contents by its unique ID. This endpoint supports range requests for partial or streaming file download.
521
- *
522
- * @param {string} functionId
523
- * @param {string} deploymentId
524
- * @throws {AppcondaException}
525
- * @returns {Promise<ArrayBuffer>}
526
- */
527
- async getDeploymentDownload(functionId, deploymentId) {
528
- if (typeof functionId === 'undefined') {
529
- throw new AppcondaException('Missing required parameter: "functionId"');
530
- }
531
- if (typeof deploymentId === 'undefined') {
532
- throw new AppcondaException('Missing required parameter: "deploymentId"');
533
- }
534
- const apiPath = '/functions/{functionId}/deployments/{deploymentId}/download'.replace('{functionId}', functionId).replace('{deploymentId}', deploymentId);
535
- const payload = {};
536
- const uri = new URL(this.client.config.endpoint + apiPath);
537
- const apiHeaders = {
538
- 'content-type': 'application/json',
539
- };
540
- return await this.client.call('get', uri, apiHeaders, payload, 'arrayBuffer');
541
- }
542
- /**
543
- * List executions
544
- *
545
- * Get a list of all the current user function execution logs. You can use the query params to filter your results.
546
- *
547
- * @param {string} functionId
548
- * @param {string[]} queries
549
- * @param {string} search
550
- * @throws {AppcondaException}
551
- * @returns {Promise<Models.ExecutionList>}
552
- */
553
- async listExecutions(functionId, queries, search) {
554
- if (typeof functionId === 'undefined') {
555
- throw new AppcondaException('Missing required parameter: "functionId"');
556
- }
557
- const apiPath = '/functions/{functionId}/executions'.replace('{functionId}', functionId);
558
- const payload = {};
559
- if (typeof queries !== 'undefined') {
560
- payload['queries'] = queries;
561
- }
562
- if (typeof search !== 'undefined') {
563
- payload['search'] = search;
564
- }
565
- const uri = new URL(this.client.config.endpoint + apiPath);
566
- const apiHeaders = {
567
- 'content-type': 'application/json',
568
- };
569
- return await this.client.call('get', uri, apiHeaders, payload);
570
- }
571
- /**
572
- * Create execution
573
- *
574
- * Trigger a function execution. The returned object will return you the current execution status. You can ping the `Get Execution` endpoint to get updates on the current execution status. Once this endpoint is called, your function execution process will start asynchronously.
575
- *
576
- * @param {string} functionId
577
- * @param {string} body
578
- * @param {boolean} async
579
- * @param {string} xpath
580
- * @param {ExecutionMethod} method
581
- * @param {object} headers
582
- * @param {string} scheduledAt
583
- * @throws {AppcondaException}
584
- * @returns {Promise<Models.Execution>}
585
- */
586
- async createExecution(functionId, body, async, xpath, method, headers, scheduledAt) {
587
- if (typeof functionId === 'undefined') {
588
- throw new AppcondaException('Missing required parameter: "functionId"');
589
- }
590
- const apiPath = '/functions/{functionId}/executions'.replace('{functionId}', functionId);
591
- const payload = {};
592
- if (typeof body !== 'undefined') {
593
- payload['body'] = body;
594
- }
595
- if (typeof async !== 'undefined') {
596
- payload['async'] = async;
597
- }
598
- if (typeof xpath !== 'undefined') {
599
- payload['path'] = xpath;
600
- }
601
- if (typeof method !== 'undefined') {
602
- payload['method'] = method;
603
- }
604
- if (typeof headers !== 'undefined') {
605
- payload['headers'] = headers;
606
- }
607
- if (typeof scheduledAt !== 'undefined') {
608
- payload['scheduledAt'] = scheduledAt;
609
- }
610
- const uri = new URL(this.client.config.endpoint + apiPath);
611
- const apiHeaders = {
612
- 'content-type': 'application/json',
613
- };
614
- return await this.client.call('post', uri, apiHeaders, payload);
615
- }
616
- /**
617
- * Get execution
618
- *
619
- * Get a function execution log by its unique ID.
620
- *
621
- * @param {string} functionId
622
- * @param {string} executionId
623
- * @throws {AppcondaException}
624
- * @returns {Promise<Models.Execution>}
625
- */
626
- async getExecution(functionId, executionId) {
627
- if (typeof functionId === 'undefined') {
628
- throw new AppcondaException('Missing required parameter: "functionId"');
629
- }
630
- if (typeof executionId === 'undefined') {
631
- throw new AppcondaException('Missing required parameter: "executionId"');
632
- }
633
- const apiPath = '/functions/{functionId}/executions/{executionId}'.replace('{functionId}', functionId).replace('{executionId}', executionId);
634
- const payload = {};
635
- const uri = new URL(this.client.config.endpoint + apiPath);
636
- const apiHeaders = {
637
- 'content-type': 'application/json',
638
- };
639
- return await this.client.call('get', uri, apiHeaders, payload);
640
- }
641
- /**
642
- * Delete execution
643
- *
644
- * Delete a function execution by its unique ID.
645
-
646
- *
647
- * @param {string} functionId
648
- * @param {string} executionId
649
- * @throws {AppcondaException}
650
- * @returns {Promise<{}>}
651
- */
652
- async deleteExecution(functionId, executionId) {
653
- if (typeof functionId === 'undefined') {
654
- throw new AppcondaException('Missing required parameter: "functionId"');
655
- }
656
- if (typeof executionId === 'undefined') {
657
- throw new AppcondaException('Missing required parameter: "executionId"');
658
- }
659
- const apiPath = '/functions/{functionId}/executions/{executionId}'.replace('{functionId}', functionId).replace('{executionId}', executionId);
660
- const payload = {};
661
- const uri = new URL(this.client.config.endpoint + apiPath);
662
- const apiHeaders = {
663
- 'content-type': 'application/json',
664
- };
665
- return await this.client.call('delete', uri, apiHeaders, payload);
666
- }
667
- /**
668
- * List variables
669
- *
670
- * Get a list of all variables of a specific function.
671
- *
672
- * @param {string} functionId
673
- * @throws {AppcondaException}
674
- * @returns {Promise<Models.VariableList>}
675
- */
676
- async listVariables(functionId) {
677
- if (typeof functionId === 'undefined') {
678
- throw new AppcondaException('Missing required parameter: "functionId"');
679
- }
680
- const apiPath = '/functions/{functionId}/variables'.replace('{functionId}', functionId);
681
- const payload = {};
682
- const uri = new URL(this.client.config.endpoint + apiPath);
683
- const apiHeaders = {
684
- 'content-type': 'application/json',
685
- };
686
- return await this.client.call('get', uri, apiHeaders, payload);
687
- }
688
- /**
689
- * Create variable
690
- *
691
- * Create a new function environment variable. These variables can be accessed in the function at runtime as environment variables.
692
- *
693
- * @param {string} functionId
694
- * @param {string} key
695
- * @param {string} value
696
- * @throws {AppcondaException}
697
- * @returns {Promise<Models.Variable>}
698
- */
699
- async createVariable(functionId, key, value) {
700
- if (typeof functionId === 'undefined') {
701
- throw new AppcondaException('Missing required parameter: "functionId"');
702
- }
703
- if (typeof key === 'undefined') {
704
- throw new AppcondaException('Missing required parameter: "key"');
705
- }
706
- if (typeof value === 'undefined') {
707
- throw new AppcondaException('Missing required parameter: "value"');
708
- }
709
- const apiPath = '/functions/{functionId}/variables'.replace('{functionId}', functionId);
710
- const payload = {};
711
- if (typeof key !== 'undefined') {
712
- payload['key'] = key;
713
- }
714
- if (typeof value !== 'undefined') {
715
- payload['value'] = value;
716
- }
717
- const uri = new URL(this.client.config.endpoint + apiPath);
718
- const apiHeaders = {
719
- 'content-type': 'application/json',
720
- };
721
- return await this.client.call('post', uri, apiHeaders, payload);
722
- }
723
- /**
724
- * Get variable
725
- *
726
- * Get a variable by its unique ID.
727
- *
728
- * @param {string} functionId
729
- * @param {string} variableId
730
- * @throws {AppcondaException}
731
- * @returns {Promise<Models.Variable>}
732
- */
733
- async getVariable(functionId, variableId) {
734
- if (typeof functionId === 'undefined') {
735
- throw new AppcondaException('Missing required parameter: "functionId"');
736
- }
737
- if (typeof variableId === 'undefined') {
738
- throw new AppcondaException('Missing required parameter: "variableId"');
739
- }
740
- const apiPath = '/functions/{functionId}/variables/{variableId}'.replace('{functionId}', functionId).replace('{variableId}', variableId);
741
- const payload = {};
742
- const uri = new URL(this.client.config.endpoint + apiPath);
743
- const apiHeaders = {
744
- 'content-type': 'application/json',
745
- };
746
- return await this.client.call('get', uri, apiHeaders, payload);
747
- }
748
- /**
749
- * Update variable
750
- *
751
- * Update variable by its unique ID.
752
- *
753
- * @param {string} functionId
754
- * @param {string} variableId
755
- * @param {string} key
756
- * @param {string} value
757
- * @throws {AppcondaException}
758
- * @returns {Promise<Models.Variable>}
759
- */
760
- async updateVariable(functionId, variableId, key, value) {
761
- if (typeof functionId === 'undefined') {
762
- throw new AppcondaException('Missing required parameter: "functionId"');
763
- }
764
- if (typeof variableId === 'undefined') {
765
- throw new AppcondaException('Missing required parameter: "variableId"');
766
- }
767
- if (typeof key === 'undefined') {
768
- throw new AppcondaException('Missing required parameter: "key"');
769
- }
770
- const apiPath = '/functions/{functionId}/variables/{variableId}'.replace('{functionId}', functionId).replace('{variableId}', variableId);
771
- const payload = {};
772
- if (typeof key !== 'undefined') {
773
- payload['key'] = key;
774
- }
775
- if (typeof value !== 'undefined') {
776
- payload['value'] = value;
777
- }
778
- const uri = new URL(this.client.config.endpoint + apiPath);
779
- const apiHeaders = {
780
- 'content-type': 'application/json',
781
- };
782
- return await this.client.call('put', uri, apiHeaders, payload);
783
- }
784
- /**
785
- * Delete variable
786
- *
787
- * Delete a variable by its unique ID.
788
- *
789
- * @param {string} functionId
790
- * @param {string} variableId
791
- * @throws {AppcondaException}
792
- * @returns {Promise<{}>}
793
- */
794
- async deleteVariable(functionId, variableId) {
795
- if (typeof functionId === 'undefined') {
796
- throw new AppcondaException('Missing required parameter: "functionId"');
797
- }
798
- if (typeof variableId === 'undefined') {
799
- throw new AppcondaException('Missing required parameter: "variableId"');
800
- }
801
- const apiPath = '/functions/{functionId}/variables/{variableId}'.replace('{functionId}', functionId).replace('{variableId}', variableId);
802
- const payload = {};
803
- const uri = new URL(this.client.config.endpoint + apiPath);
804
- const apiHeaders = {
805
- 'content-type': 'application/json',
806
- };
807
- return await this.client.call('delete', uri, apiHeaders, payload);
808
- }
809
- }
810
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL2Z1bmN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQXdDLE1BQU0sV0FBVyxDQUFDO0FBS3BGLE1BQU0sT0FBTyxTQUFTO0lBR2xCLFlBQVksTUFBYztRQUN0QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFrQixFQUFFLE1BQWU7UUFDMUMsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDO1FBQzdCLE1BQU0sT0FBTyxHQUFZLEVBQUUsQ0FBQztRQUM1QixJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxPQUFPLENBQUM7UUFDakMsQ0FBQztRQUNELElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDaEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMvQixDQUFDO1FBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBRTNELE1BQU0sVUFBVSxHQUFpQztZQUM3QyxjQUFjLEVBQUUsa0JBQWtCO1NBQ3JDLENBQUE7UUFFRCxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3pCLEtBQUssRUFDTCxHQUFHLEVBQ0gsVUFBVSxFQUNWLE9BQU8sQ0FDVixDQUFDO0lBQ04sQ0FBQztJQUNEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTZCRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBa0IsRUFBRSxJQUFZLEVBQUUsT0FBZ0IsRUFBRSxPQUFr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UUFDRCxJQUFJLE9BQU8sVUFBVSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxpQkFBaUIsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1FBQzVFLENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxnREFBZ0QsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDekksTUFBTSxPQUFPLEdBQVksRUFBRSxDQUFDO1FBQzVCLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUUzRCxNQUFNLFVBQVUsR0FBaUM7WUFDN0MsY0FBYyxFQUFFLGtCQUFrQjtTQUNyQyxDQUFBO1FBRUQsT0FBTyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUN6QixRQUFRLEVBQ1IsR0FBRyxFQUNILFVBQVUsRUFDVixPQUFPLENBQ1YsQ0FBQztJQUNOLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcGNvbmRhRXhjZXB0aW9uLCBDbGllbnQsIHR5cGUgUGF5bG9hZCwgVXBsb2FkUHJvZ3Jlc3MgfSBmcm9tICcuLi9jbGllbnQnO1xuaW1wb3J0IHR5cGUgeyBNb2RlbHMgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgUnVudGltZSB9IGZyb20gJy4uL2VudW1zL3J1bnRpbWUnO1xuaW1wb3J0IHsgRXhlY3V0aW9uTWV0aG9kIH0gZnJvbSAnLi4vZW51bXMvZXhlY3V0aW9uLW1ldGhvZCc7XG5cbmV4cG9ydCBjbGFzcyBGdW5jdGlvbnMge1xuICAgIGNsaWVudDogQ2xpZW50O1xuXG4gICAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQpIHtcbiAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBmdW5jdGlvbnNcbiAgICAgKlxuICAgICAqIEdldCBhIGxpc3Qgb2YgYWxsIHRoZSBwcm9qZWN0JiMwMzk7cyBmdW5jdGlvbnMuIFlvdSBjYW4gdXNlIHRoZSBxdWVyeSBwYXJhbXMgdG8gZmlsdGVyIHlvdXIgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHF1ZXJpZXNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VhcmNoXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLkZ1bmN0aW9uTGlzdD59XG4gICAgICovXG4gICAgYXN5bmMgbGlzdChxdWVyaWVzPzogc3RyaW5nW10sIHNlYXJjaD86IHN0cmluZyk6IFByb21pc2U8TW9kZWxzLkZ1bmN0aW9uTGlzdD4ge1xuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9mdW5jdGlvbnMnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgcXVlcmllcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3F1ZXJpZXMnXSA9IHF1ZXJpZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzZWFyY2ggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzZWFyY2gnXSA9IHNlYXJjaDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZ2V0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgZnVuY3Rpb25cbiAgICAgKlxuICAgICAqIENyZWF0ZSBhIG5ldyBmdW5jdGlvbi4gWW91IGNhbiBwYXNzIGEgbGlzdCBvZiBbcGVybWlzc2lvbnNdKGh0dHBzOi8vYXBwY29uZGEuaW8vZG9jcy9wZXJtaXNzaW9ucykgdG8gYWxsb3cgZGlmZmVyZW50IHByb2plY3QgdXNlcnMgb3IgdGVhbSB3aXRoIGFjY2VzcyB0byBleGVjdXRlIHRoZSBmdW5jdGlvbiB1c2luZyB0aGUgY2xpZW50IEFQSS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmdW5jdGlvbklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge1J1bnRpbWV9IHJ1bnRpbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBleGVjdXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gZXZlbnRzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNjaGVkdWxlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGxvZ2dpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZW50cnlwb2ludFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHNjb3Blc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0YWxsYXRpb25JZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm92aWRlclJlcG9zaXRvcnlJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm92aWRlckJyYW5jaFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcHJvdmlkZXJTaWxlbnRNb2RlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVyUm9vdERpcmVjdG9yeVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZW1wbGF0ZVJlcG9zaXRvcnlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGVtcGxhdGVPd25lclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZW1wbGF0ZVJvb3REaXJlY3RvcnlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGVtcGxhdGVWZXJzaW9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNwZWNpZmljYXRpb25cbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuRnVuY3Rpb24+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZShmdW5jdGlvbklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgcnVudGltZTogUnVudGltZSwgZXhlY3V0ZT86IHN0cmluZ1tdLCBldmVudHM/OiBzdHJpbmdbXSwgc2NoZWR1bGU/OiBzdHJpbmcsIHRpbWVvdXQ/OiBudW1iZXIsIGVuYWJsZWQ/OiBib29sZWFuLCBsb2dnaW5nPzogYm9vbGVhbiwgZW50cnlwb2ludD86IHN0cmluZywgY29tbWFuZHM/OiBzdHJpbmcsIHNjb3Blcz86IHN0cmluZ1tdLCBpbnN0YWxsYXRpb25JZD86IHN0cmluZywgcHJvdmlkZXJSZXBvc2l0b3J5SWQ/OiBzdHJpbmcsIHByb3ZpZGVyQnJhbmNoPzogc3RyaW5nLCBwcm92aWRlclNpbGVudE1vZGU/OiBib29sZWFuLCBwcm92aWRlclJvb3REaXJlY3Rvcnk/OiBzdHJpbmcsIHRlbXBsYXRlUmVwb3NpdG9yeT86IHN0cmluZywgdGVtcGxhdGVPd25lcj86IHN0cmluZywgdGVtcGxhdGVSb290RGlyZWN0b3J5Pzogc3RyaW5nLCB0ZW1wbGF0ZVZlcnNpb24/OiBzdHJpbmcsIHNwZWNpZmljYXRpb24/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5GdW5jdGlvbj4ge1xuICAgICAgICBpZiAodHlwZW9mIGZ1bmN0aW9uSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImZ1bmN0aW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwibmFtZVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBydW50aW1lID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJydW50aW1lXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9mdW5jdGlvbnMnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgZnVuY3Rpb25JZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2Z1bmN0aW9uSWQnXSA9IGZ1bmN0aW9uSWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmFtZSddID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJ1bnRpbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydydW50aW1lJ10gPSBydW50aW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZXhlY3V0ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2V4ZWN1dGUnXSA9IGV4ZWN1dGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBldmVudHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydldmVudHMnXSA9IGV2ZW50cztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNjaGVkdWxlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc2NoZWR1bGUnXSA9IHNjaGVkdWxlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGltZW91dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3RpbWVvdXQnXSA9IHRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBlbmFibGVkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZW5hYmxlZCddID0gZW5hYmxlZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGxvZ2dpbmcgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydsb2dnaW5nJ10gPSBsb2dnaW5nO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnlwb2ludCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2VudHJ5cG9pbnQnXSA9IGVudHJ5cG9pbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBjb21tYW5kcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2NvbW1hbmRzJ10gPSBjb21tYW5kcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNjb3BlcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3Njb3BlcyddID0gc2NvcGVzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgaW5zdGFsbGF0aW9uSWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydpbnN0YWxsYXRpb25JZCddID0gaW5zdGFsbGF0aW9uSWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlclJlcG9zaXRvcnlJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3Byb3ZpZGVyUmVwb3NpdG9yeUlkJ10gPSBwcm92aWRlclJlcG9zaXRvcnlJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHByb3ZpZGVyQnJhbmNoICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncHJvdmlkZXJCcmFuY2gnXSA9IHByb3ZpZGVyQnJhbmNoO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdmlkZXJTaWxlbnRNb2RlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncHJvdmlkZXJTaWxlbnRNb2RlJ10gPSBwcm92aWRlclNpbGVudE1vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlclJvb3REaXJlY3RvcnkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydwcm92aWRlclJvb3REaXJlY3RvcnknXSA9IHByb3ZpZGVyUm9vdERpcmVjdG9yeTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRlbXBsYXRlUmVwb3NpdG9yeSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3RlbXBsYXRlUmVwb3NpdG9yeSddID0gdGVtcGxhdGVSZXBvc2l0b3J5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGVPd25lciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3RlbXBsYXRlT3duZXInXSA9IHRlbXBsYXRlT3duZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0ZW1wbGF0ZVJvb3REaXJlY3RvcnkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd0ZW1wbGF0ZVJvb3REaXJlY3RvcnknXSA9IHRlbXBsYXRlUm9vdERpcmVjdG9yeTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRlbXBsYXRlVmVyc2lvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3RlbXBsYXRlVmVyc2lvbiddID0gdGVtcGxhdGVWZXJzaW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc3BlY2lmaWNhdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3NwZWNpZmljYXRpb24nXSA9IHNwZWNpZmljYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExpc3QgcnVudGltZXNcbiAgICAgKlxuICAgICAqIEdldCBhIGxpc3Qgb2YgYWxsIHJ1bnRpbWVzIHRoYXQgYXJlIGN1cnJlbnRseSBhY3RpdmUgb24geW91ciBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5SdW50aW1lTGlzdD59XG4gICAgICovXG4gICAgYXN5bmMgbGlzdFJ1bnRpbWVzKCk6IFByb21pc2U8TW9kZWxzLlJ1bnRpbWVMaXN0PiB7XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2Z1bmN0aW9ucy9ydW50aW1lcyc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTGlzdCBhdmFpbGFibGUgZnVuY3Rpb24gcnVudGltZSBzcGVjaWZpY2F0aW9uc1xuICAgICAqXG4gICAgICogTGlzdCBhbGxvd2VkIGZ1bmN0aW9uIHNwZWNpZmljYXRpb25zIGZvciB0aGlzIGluc3RhbmNlLlxuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuU3BlY2lmaWNhdGlvbkxpc3Q+fVxuICAgICAqL1xuICAgIGFzeW5jIGxpc3RTcGVjaWZpY2F0aW9ucygpOiBQcm9taXNlPE1vZGVscy5TcGVjaWZpY2F0aW9uTGlzdD4ge1xuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9mdW5jdGlvbnMvc3BlY2lmaWNhdGlvbnMnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBmdW5jdGlvblxuICAgICAqXG4gICAgICogR2V0IGEgZnVuY3Rpb24gYnkgaXRzIHVuaXF1ZSBJRC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmdW5jdGlvbklkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLkZ1bmN0aW9uPn1cbiAgICAgKi9cbiAgICBhc3luYyBnZXQoZnVuY3Rpb25JZDogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuRnVuY3Rpb24+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJmdW5jdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9mdW5jdGlvbnMve2Z1bmN0aW9uSWR9Jy5yZXBsYWNlKCd7ZnVuY3Rpb25JZH0nLCBmdW5jdGlvbklkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZ2V0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgZnVuY3Rpb25cbiAgICAgKlxuICAgICAqIFVwZGF0ZSBmdW5jdGlvbiBieSBpdHMgdW5pcXVlIElELlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7UnVudGltZX0gcnVudGltZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IGV4ZWN1dGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBldmVudHNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2NoZWR1bGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZW91dFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZW5hYmxlZFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gbG9nZ2luZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBlbnRyeXBvaW50XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbW1hbmRzXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gc2NvcGVzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGluc3RhbGxhdGlvbklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVyUmVwb3NpdG9yeUlkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVyQnJhbmNoXG4gICAgICogQHBhcmFtIHtib29sZWFufSBwcm92aWRlclNpbGVudE1vZGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvdmlkZXJSb290RGlyZWN0b3J5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNwZWNpZmljYXRpb25cbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuRnVuY3Rpb24+fVxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZShmdW5jdGlvbklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgcnVudGltZT86IFJ1bnRpbWUsIGV4ZWN1dGU/OiBzdHJpbmdbXSwgZXZlbnRzPzogc3RyaW5nW10sIHNjaGVkdWxlPzogc3RyaW5nLCB0aW1lb3V0PzogbnVtYmVyLCBlbmFibGVkPzogYm9vbGVhbiwgbG9nZ2luZz86IGJvb2xlYW4sIGVudHJ5cG9pbnQ/OiBzdHJpbmcsIGNvbW1hbmRzPzogc3RyaW5nLCBzY29wZXM/OiBzdHJpbmdbXSwgaW5zdGFsbGF0aW9uSWQ/OiBzdHJpbmcsIHByb3ZpZGVyUmVwb3NpdG9yeUlkPzogc3RyaW5nLCBwcm92aWRlckJyYW5jaD86IHN0cmluZywgcHJvdmlkZXJTaWxlbnRNb2RlPzogYm9vbGVhbiwgcHJvdmlkZXJSb290RGlyZWN0b3J5Pzogc3RyaW5nLCBzcGVjaWZpY2F0aW9uPzogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuRnVuY3Rpb24+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJmdW5jdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcIm5hbWVcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2Z1bmN0aW9ucy97ZnVuY3Rpb25JZH0nLnJlcGxhY2UoJ3tmdW5jdGlvbklkfScsIGZ1bmN0aW9uSWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ25hbWUnXSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBydW50aW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncnVudGltZSddID0gcnVudGltZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGV4ZWN1dGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydleGVjdXRlJ10gPSBleGVjdXRlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZXZlbnRzJ10gPSBldmVudHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzY2hlZHVsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3NjaGVkdWxlJ10gPSBzY2hlZHVsZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRpbWVvdXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd0aW1lb3V0J10gPSB0aW1lb3V0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW5hYmxlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2VuYWJsZWQnXSA9IGVuYWJsZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBsb2dnaW5nICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbG9nZ2luZyddID0gbG9nZ2luZztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVudHJ5cG9pbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbnRyeXBvaW50J10gPSBlbnRyeXBvaW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY29tbWFuZHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydjb21tYW5kcyddID0gY29tbWFuZHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzY29wZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzY29wZXMnXSA9IHNjb3BlcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGluc3RhbGxhdGlvbklkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnaW5zdGFsbGF0aW9uSWQnXSA9IGluc3RhbGxhdGlvbklkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdmlkZXJSZXBvc2l0b3J5SWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydwcm92aWRlclJlcG9zaXRvcnlJZCddID0gcHJvdmlkZXJSZXBvc2l0b3J5SWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlckJyYW5jaCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3Byb3ZpZGVyQnJhbmNoJ10gPSBwcm92aWRlckJyYW5jaDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHByb3ZpZGVyU2lsZW50TW9kZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3Byb3ZpZGVyU2lsZW50TW9kZSddID0gcHJvdmlkZXJTaWxlbnRNb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdmlkZXJSb290RGlyZWN0b3J5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncHJvdmlkZXJSb290RGlyZWN0b3J5J10gPSBwcm92aWRlclJvb3REaXJlY3Rvcnk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzcGVjaWZpY2F0aW9uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc3BlY2lmaWNhdGlvbiddID0gc3BlY2lmaWNhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncHV0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxldGUgZnVuY3Rpb25cbiAgICAgKlxuICAgICAqIERlbGV0ZSBhIGZ1bmN0aW9uIGJ5IGl0cyB1bmlxdWUgSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnVuY3Rpb25JZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHt9Pn1cbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGUoZnVuY3Rpb25JZDogc3RyaW5nKTogUHJvbWlzZTx7fT4ge1xuICAgICAgICBpZiAodHlwZW9mIGZ1bmN0aW9uSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImZ1bmN0aW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2Z1bmN0aW9ucy97ZnVuY3Rpb25JZH0nLnJlcGxhY2UoJ3tmdW5jdGlvbklkfScsIGZ1bmN0aW9uSWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdkZWxldGUnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExpc3QgZGVwbG95bWVudHNcbiAgICAgKlxuICAgICAqIEdldCBhIGxpc3Qgb2YgYWxsIHRoZSBwcm9qZWN0JiMwMzk7cyBjb2RlIGRlcGxveW1lbnRzLiBZb3UgY2FuIHVzZSB0aGUgcXVlcnkgcGFyYW1zIHRvIGZpbHRlciB5b3VyIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnVuY3Rpb25JZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHF1ZXJpZXNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VhcmNoXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLkRlcGxveW1lbnRMaXN0Pn1cbiAgICAgKi9cbiAgICBhc3luYyBsaXN0RGVwbG95bWVudHMoZnVuY3Rpb25JZDogc3RyaW5nLCBxdWVyaWVzPzogc3RyaW5nW10sIHNlYXJjaD86IHN0cmluZyk6IFByb21pc2U8TW9kZWxzLkRlcGxveW1lbnRMaXN0PiB7XG4gICAgICAgIGlmICh0eXBlb2YgZnVuY3Rpb25JZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZnVuY3Rpb25JZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvZnVuY3Rpb25zL3tmdW5jdGlvbklkfS9kZXBsb3ltZW50cycucmVwbGFjZSgne2Z1bmN0aW9uSWR9JywgZnVuY3Rpb25JZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBxdWVyaWVzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncXVlcmllcyddID0gcXVlcmllcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlYXJjaCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3NlYXJjaCddID0gc2VhcmNoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBkZXBsb3ltZW50XG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSBuZXcgZnVuY3Rpb24gY29kZSBkZXBsb3ltZW50LiBVc2UgdGhpcyBlbmRwb2ludCB0byB1cGxvYWQgYSBuZXcgdmVyc2lvbiBvZiB5b3VyIGNvZGUgZnVuY3Rpb24uIFRvIGV4ZWN1dGUgeW91ciBuZXdseSB1cGxvYWRlZCBjb2RlLCB5b3UmIzAzOTtsbCBuZWVkIHRvIHVwZGF0ZSB0aGUgZnVuY3Rpb24mIzAzOTtzIGRlcGxveW1lbnQgdG8gdXNlIHlvdXIgbmV3IGRlcGxveW1lbnQgVUlELlxuXG5UaGlzIGVuZHBvaW50IGFjY2VwdHMgYSB0YXIuZ3ogZmlsZSBjb21wcmVzc2VkIHdpdGggeW91ciBjb2RlLiBNYWtlIHN1cmUgdG8gaW5jbHVkZSBhbnkgZGVwZW5kZW5jaWVzIHlvdXIgY29kZSBoYXMgd2l0aGluIHRoZSBjb21wcmVzc2VkIGZpbGUuIFlvdSBjYW4gbGVhcm4gbW9yZSBhYm91dCBjb2RlIHBhY2thZ2luZyBpbiB0aGUgW0FwcGNvbmRhIENsb3VkIEZ1bmN0aW9ucyB0dXRvcmlhbF0oaHR0cHM6Ly9hcHBjb25kYS5pby9kb2NzL2Z1bmN0aW9ucykuXG5cblVzZSB0aGUgJnF1b3Q7Y29tbWFuZCZxdW90OyBwYXJhbSB0byBzZXQgdGhlIGVudHJ5cG9pbnQgdXNlZCB0byBleGVjdXRlIHlvdXIgY29kZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmdW5jdGlvbklkXG4gICAgICogQHBhcmFtIHtGaWxlfSBjb2RlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBhY3RpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBlbnRyeXBvaW50XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbW1hbmRzXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLkRlcGxveW1lbnQ+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZURlcGxveW1lbnQoZnVuY3Rpb25JZDogc3RyaW5nLCBjb2RlOiBGaWxlLCBhY3RpdmF0ZTogYm9vbGVhbiwgZW50cnlwb2ludD86IHN0cmluZywgY29tbWFuZHM/OiBzdHJpbmcsIG9uUHJvZ3Jlc3MgPSAocHJvZ3Jlc3M6IFVwbG9hZFByb2dyZXNzKSA9PiB7fSk6IFByb21pc2U8TW9kZWxzLkRlcGxveW1lbnQ+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJmdW5jdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNvZGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImNvZGVcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYWN0aXZhdGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImFjdGl2YXRlXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9mdW5jdGlvbnMve2Z1bmN0aW9uSWR9L2RlcGxveW1lbnRzJy5yZXBsYWNlKCd7ZnVuY3Rpb25JZH0nLCBmdW5jdGlvbklkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGVudHJ5cG9pbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbnRyeXBvaW50J10gPSBlbnRyeXBvaW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY29tbWFuZHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydjb21tYW5kcyddID0gY29tbWFuZHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBjb2RlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnY29kZSddID0gY29kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGFjdGl2YXRlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnYWN0aXZhdGUnXSA9IGFjdGl2YXRlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2h1bmtlZFVwbG9hZChcbiAgICAgICAgICAgICdwb3N0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICAgICAgb25Qcm9ncmVzc1xuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgZGVwbG95bWVudFxuICAgICAqXG4gICAgICogR2V0IGEgY29kZSBkZXBsb3ltZW50IGJ5IGl0cyB1bmlxdWUgSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnVuY3Rpb25JZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkZXBsb3ltZW50SWRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuRGVwbG95bWVudD59XG4gICAgICovXG4gICAgYXN5bmMgZ2V0RGVwbG95bWVudChmdW5jdGlvbklkOiBzdHJpbmcsIGRlcGxveW1lbnRJZDogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuRGVwbG95bWVudD4ge1xuICAgICAgICBpZiAodHlwZW9mIGZ1bmN0aW9uSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImZ1bmN0aW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZGVwbG95bWVudElkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJkZXBsb3ltZW50SWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2Z1bmN0aW9ucy97ZnVuY3Rpb25JZH0vZGVwbG95bWVudHMve2RlcGxveW1lbnRJZH0nLnJlcGxhY2UoJ3tmdW5jdGlvbklkfScsIGZ1bmN0aW9uSWQpLnJlcGxhY2UoJ3tkZXBsb3ltZW50SWR9JywgZGVwbG95bWVudElkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZ2V0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgZGVwbG95bWVudFxuICAgICAqXG4gICAgICogVXBkYXRlIHRoZSBmdW5jdGlvbiBjb2RlIGRlcGxveW1lbnQgSUQgdXNpbmcgdGhlIHVuaXF1ZSBmdW5jdGlvbiBJRC4gVXNlIHRoaXMgZW5kcG9pbnQgdG8gc3dpdGNoIHRoZSBjb2RlIGRlcGxveW1lbnQgdGhhdCBzaG91bGQgYmUgZXhlY3V0ZWQgYnkgdGhlIGV4ZWN1dGlvbiBlbmRwb2ludC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmdW5jdGlvbklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRlcGxveW1lbnRJZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5GdW5jdGlvbj59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlRGVwbG95bWVudChmdW5jdGlvbklkOiBzdHJpbmcsIGRlcGxveW1lbnRJZDogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuRnVuY3Rpb24+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJmdW5jdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRlcGxveW1lbnRJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZGVwbG95bWVudElkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9mdW5jdGlvbnMve2Z1bmN0aW9uSWR9L2RlcGxveW1lbnRzL3tkZXBsb3ltZW50SWR9Jy5yZXBsYWNlKCd7ZnVuY3Rpb25JZH0nLCBmdW5jdGlvbklkKS5yZXBsYWNlKCd7ZGVwbG95bWVudElkfScsIGRlcGxveW1lbnRJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3BhdGNoJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxldGUgZGVwbG95bWVudFxuICAgICAqXG4gICAgICogRGVsZXRlIGEgY29kZSBkZXBsb3ltZW50IGJ5IGl0cyB1bmlxdWUgSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnVuY3Rpb25JZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkZXBsb3ltZW50SWRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7fT59XG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlRGVwbG95bWVudChmdW5jdGlvbklkOiBzdHJpbmcsIGRlcGxveW1lbnRJZDogc3RyaW5nKTogUHJvbWlzZTx7fT4ge1xuICAgICAgICBpZiAodHlwZW9mIGZ1bmN0aW9uSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImZ1bmN0aW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZGVwbG95bWVudElkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJkZXBsb3ltZW50SWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2Z1bmN0aW9ucy97ZnVuY3Rpb25JZH0vZGVwbG95bWVudHMve2RlcGxveW1lbnRJZH0nLnJlcGxhY2UoJ3tmdW5jdGlvbklkfScsIGZ1bmN0aW9uSWQpLnJlcGxhY2UoJ3tkZXBsb3ltZW50SWR9JywgZGVwbG95bWVudElkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZGVsZXRlJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWJ1aWxkIGRlcGxveW1lbnRcbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGVwbG95bWVudElkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGJ1aWxkSWRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7fT59XG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlQnVpbGQoZnVuY3Rpb25JZDogc3RyaW5nLCBkZXBsb3ltZW50SWQ6IHN0cmluZywgYnVpbGRJZD86IHN0cmluZyk6IFByb21pc2U8e30+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJmdW5jdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRlcGxveW1lbnRJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZGVwbG95bWVudElkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9mdW5jdGlvbnMve2Z1bmN0aW9uSWR9L2RlcGxveW1lbnRzL3tkZXBsb3ltZW50SWR9L2J1aWxkJy5yZXBsYWNlKCd7ZnVuY3Rpb25JZH0nLCBmdW5jdGlvbklkKS5yZXBsYWNlKCd7ZGVwbG95bWVudElkfScsIGRlcGxveW1lbnRJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBidWlsZElkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnYnVpbGRJZCddID0gYnVpbGRJZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncG9zdCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FuY2VsIGRlcGxveW1lbnRcbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGVwbG95bWVudElkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLkJ1aWxkPn1cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVEZXBsb3ltZW50QnVpbGQoZnVuY3Rpb25JZDogc3RyaW5nLCBkZXBsb3ltZW50SWQ6IHN0cmluZyk6IFByb21pc2U8TW9kZWxzLkJ1aWxkPiB7XG4gICAgICAgIGlmICh0eXBlb2YgZnVuY3Rpb25JZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZnVuY3Rpb25JZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkZXBsb3ltZW50SWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImRlcGxveW1lbnRJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvZnVuY3Rpb25zL3tmdW5jdGlvbklkfS9kZXBsb3ltZW50cy97ZGVwbG95bWVudElkfS9idWlsZCcucmVwbGFjZSgne2Z1bmN0aW9uSWR9JywgZnVuY3Rpb25JZCkucmVwbGFjZSgne2RlcGxveW1lbnRJZH0nLCBkZXBsb3ltZW50SWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRG93bmxvYWQgZGVwbG95bWVudFxuICAgICAqXG4gICAgICogR2V0IGEgRGVwbG95bWVudCYjMDM5O3MgY29udGVudHMgYnkgaXRzIHVuaXF1ZSBJRC4gVGhpcyBlbmRwb2ludCBzdXBwb3J0cyByYW5nZSByZXF1ZXN0cyBmb3IgcGFydGlhbCBvciBzdHJlYW1pbmcgZmlsZSBkb3dubG9hZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmdW5jdGlvbklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRlcGxveW1lbnRJZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5QnVmZmVyPn1cbiAgICAgKi9cbiAgICBhc3luYyBnZXREZXBsb3ltZW50RG93bmxvYWQoZnVuY3Rpb25JZDogc3RyaW5nLCBkZXBsb3ltZW50SWQ6IHN0cmluZyk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJmdW5jdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRlcGxveW1lbnRJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZGVwbG95bWVudElkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9mdW5jdGlvbnMve2Z1bmN0aW9uSWR9L2RlcGxveW1lbnRzL3tkZXBsb3ltZW50SWR9L2Rvd25sb2FkJy5yZXBsYWNlKCd7ZnVuY3Rpb25JZH0nLCBmdW5jdGlvbklkKS5yZXBsYWNlKCd7ZGVwbG95bWVudElkfScsIGRlcGxveW1lbnRJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICAgICdhcnJheUJ1ZmZlcidcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTGlzdCBleGVjdXRpb25zXG4gICAgICpcbiAgICAgKiBHZXQgYSBsaXN0IG9mIGFsbCB0aGUgY3VycmVudCB1c2VyIGZ1bmN0aW9uIGV4ZWN1dGlvbiBsb2dzLiBZb3UgY2FuIHVzZSB0aGUgcXVlcnkgcGFyYW1zIHRvIGZpbHRlciB5b3VyIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnVuY3Rpb25JZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHF1ZXJpZXNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VhcmNoXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLkV4ZWN1dGlvbkxpc3Q+fVxuICAgICAqL1xuICAgIGFzeW5jIGxpc3RFeGVjdXRpb25zKGZ1bmN0aW9uSWQ6IHN0cmluZywgcXVlcmllcz86IHN0cmluZ1tdLCBzZWFyY2g/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5FeGVjdXRpb25MaXN0PiB7XG4gICAgICAgIGlmICh0eXBlb2YgZnVuY3Rpb25JZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZnVuY3Rpb25JZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvZnVuY3Rpb25zL3tmdW5jdGlvbklkfS9leGVjdXRpb25zJy5yZXBsYWNlKCd7ZnVuY3Rpb25JZH0nLCBmdW5jdGlvbklkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHF1ZXJpZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydxdWVyaWVzJ10gPSBxdWVyaWVzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2VhcmNoICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc2VhcmNoJ10gPSBzZWFyY2g7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGV4ZWN1dGlvblxuICAgICAqXG4gICAgICogVHJpZ2dlciBhIGZ1bmN0aW9uIGV4ZWN1dGlvbi4gVGhlIHJldHVybmVkIG9iamVjdCB3aWxsIHJldHVybiB5b3UgdGhlIGN1cnJlbnQgZXhlY3V0aW9uIHN0YXR1cy4gWW91IGNhbiBwaW5nIHRoZSBgR2V0IEV4ZWN1dGlvbmAgZW5kcG9pbnQgdG8gZ2V0IHVwZGF0ZXMgb24gdGhlIGN1cnJlbnQgZXhlY3V0aW9uIHN0YXR1cy4gT25jZSB0aGlzIGVuZHBvaW50IGlzIGNhbGxlZCwgeW91ciBmdW5jdGlvbiBleGVjdXRpb24gcHJvY2VzcyB3aWxsIHN0YXJ0IGFzeW5jaHJvbm91c2x5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYm9keVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYXN5bmNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30geHBhdGhcbiAgICAgKiBAcGFyYW0ge0V4ZWN1dGlvbk1ldGhvZH0gbWV0aG9kXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGhlYWRlcnNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2NoZWR1bGVkQXRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuRXhlY3V0aW9uPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVFeGVjdXRpb24oZnVuY3Rpb25JZDogc3RyaW5nLCBib2R5Pzogc3RyaW5nLCBhc3luYz86IGJvb2xlYW4sIHhwYXRoPzogc3RyaW5nLCBtZXRob2Q/OiBFeGVjdXRpb25NZXRob2QsIGhlYWRlcnM/OiBvYmplY3QsIHNjaGVkdWxlZEF0Pzogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuRXhlY3V0aW9uPiB7XG4gICAgICAgIGlmICh0eXBlb2YgZnVuY3Rpb25JZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZnVuY3Rpb25JZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvZnVuY3Rpb25zL3tmdW5jdGlvbklkfS9leGVjdXRpb25zJy5yZXBsYWNlKCd7ZnVuY3Rpb25JZH0nLCBmdW5jdGlvbklkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGJvZHkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydib2R5J10gPSBib2R5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYXN5bmMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydhc3luYyddID0gYXN5bmM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB4cGF0aCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3BhdGgnXSA9IHhwYXRoO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbWV0aG9kICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbWV0aG9kJ10gPSBtZXRob2Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBoZWFkZXJzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnaGVhZGVycyddID0gaGVhZGVycztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNjaGVkdWxlZEF0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc2NoZWR1bGVkQXQnXSA9IHNjaGVkdWxlZEF0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwb3N0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgZXhlY3V0aW9uXG4gICAgICpcbiAgICAgKiBHZXQgYSBmdW5jdGlvbiBleGVjdXRpb24gbG9nIGJ5IGl0cyB1bmlxdWUgSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnVuY3Rpb25JZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleGVjdXRpb25JZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5FeGVjdXRpb24+fVxuICAgICAqL1xuICAgIGFzeW5jIGdldEV4ZWN1dGlvbihmdW5jdGlvbklkOiBzdHJpbmcsIGV4ZWN1dGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5FeGVjdXRpb24+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJmdW5jdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGV4ZWN1dGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJleGVjdXRpb25JZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvZnVuY3Rpb25zL3tmdW5jdGlvbklkfS9leGVjdXRpb25zL3tleGVjdXRpb25JZH0nLnJlcGxhY2UoJ3tmdW5jdGlvbklkfScsIGZ1bmN0aW9uSWQpLnJlcGxhY2UoJ3tleGVjdXRpb25JZH0nLCBleGVjdXRpb25JZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVsZXRlIGV4ZWN1dGlvblxuICAgICAqXG4gICAgICogRGVsZXRlIGEgZnVuY3Rpb24gZXhlY3V0aW9uIGJ5IGl0cyB1bmlxdWUgSUQuXG5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmdW5jdGlvbklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV4ZWN1dGlvbklkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8e30+fVxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZUV4ZWN1dGlvbihmdW5jdGlvbklkOiBzdHJpbmcsIGV4ZWN1dGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPHt9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgZnVuY3Rpb25JZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZnVuY3Rpb25JZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBleGVjdXRpb25JZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZXhlY3V0aW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2Z1bmN0aW9ucy97ZnVuY3Rpb25JZH0vZXhlY3V0aW9ucy97ZXhlY3V0aW9uSWR9Jy5yZXBsYWNlKCd7ZnVuY3Rpb25JZH0nLCBmdW5jdGlvbklkKS5yZXBsYWNlKCd7ZXhlY3V0aW9uSWR9JywgZXhlY3V0aW9uSWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdkZWxldGUnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExpc3QgdmFyaWFibGVzXG4gICAgICpcbiAgICAgKiBHZXQgYSBsaXN0IG9mIGFsbCB2YXJpYWJsZXMgb2YgYSBzcGVjaWZpYyBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmdW5jdGlvbklkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlZhcmlhYmxlTGlzdD59XG4gICAgICovXG4gICAgYXN5bmMgbGlzdFZhcmlhYmxlcyhmdW5jdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5WYXJpYWJsZUxpc3Q+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJmdW5jdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9mdW5jdGlvbnMve2Z1bmN0aW9uSWR9L3ZhcmlhYmxlcycucmVwbGFjZSgne2Z1bmN0aW9uSWR9JywgZnVuY3Rpb25JZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHZhcmlhYmxlXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSBuZXcgZnVuY3Rpb24gZW52aXJvbm1lbnQgdmFyaWFibGUuIFRoZXNlIHZhcmlhYmxlcyBjYW4gYmUgYWNjZXNzZWQgaW4gdGhlIGZ1bmN0aW9uIGF0IHJ1bnRpbWUgYXMgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlZhcmlhYmxlPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVWYXJpYWJsZShmdW5jdGlvbklkOiBzdHJpbmcsIGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuVmFyaWFibGU+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJmdW5jdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwia2V5XCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJ2YWx1ZVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvZnVuY3Rpb25zL3tmdW5jdGlvbklkfS92YXJpYWJsZXMnLnJlcGxhY2UoJ3tmdW5jdGlvbklkfScsIGZ1bmN0aW9uSWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsna2V5J10gPSBrZXk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3ZhbHVlJ10gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncG9zdCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHZhcmlhYmxlXG4gICAgICpcbiAgICAgKiBHZXQgYSB2YXJpYWJsZSBieSBpdHMgdW5pcXVlIElELlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFyaWFibGVJZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5WYXJpYWJsZT59XG4gICAgICovXG4gICAgYXN5bmMgZ2V0VmFyaWFibGUoZnVuY3Rpb25JZDogc3RyaW5nLCB2YXJpYWJsZUlkOiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5WYXJpYWJsZT4ge1xuICAgICAgICBpZiAodHlwZW9mIGZ1bmN0aW9uSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImZ1bmN0aW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdmFyaWFibGVJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidmFyaWFibGVJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvZnVuY3Rpb25zL3tmdW5jdGlvbklkfS92YXJpYWJsZXMve3ZhcmlhYmxlSWR9Jy5yZXBsYWNlKCd7ZnVuY3Rpb25JZH0nLCBmdW5jdGlvbklkKS5yZXBsYWNlKCd7dmFyaWFibGVJZH0nLCB2YXJpYWJsZUlkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZ2V0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdmFyaWFibGVcbiAgICAgKlxuICAgICAqIFVwZGF0ZSB2YXJpYWJsZSBieSBpdHMgdW5pcXVlIElELlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFyaWFibGVJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuVmFyaWFibGU+fVxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZVZhcmlhYmxlKGZ1bmN0aW9uSWQ6IHN0cmluZywgdmFyaWFibGVJZDogc3RyaW5nLCBrZXk6IHN0cmluZywgdmFsdWU/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5WYXJpYWJsZT4ge1xuICAgICAgICBpZiAodHlwZW9mIGZ1bmN0aW9uSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImZ1bmN0aW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdmFyaWFibGVJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidmFyaWFibGVJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImtleVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvZnVuY3Rpb25zL3tmdW5jdGlvbklkfS92YXJpYWJsZXMve3ZhcmlhYmxlSWR9Jy5yZXBsYWNlKCd7ZnVuY3Rpb25JZH0nLCBmdW5jdGlvbklkKS5yZXBsYWNlKCd7dmFyaWFibGVJZH0nLCB2YXJpYWJsZUlkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGtleSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2tleSddID0ga2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd2YWx1ZSddID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3B1dCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVsZXRlIHZhcmlhYmxlXG4gICAgICpcbiAgICAgKiBEZWxldGUgYSB2YXJpYWJsZSBieSBpdHMgdW5pcXVlIElELlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFyaWFibGVJZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHt9Pn1cbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGVWYXJpYWJsZShmdW5jdGlvbklkOiBzdHJpbmcsIHZhcmlhYmxlSWQ6IHN0cmluZyk6IFByb21pc2U8e30+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJmdW5jdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHZhcmlhYmxlSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInZhcmlhYmxlSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2Z1bmN0aW9ucy97ZnVuY3Rpb25JZH0vdmFyaWFibGVzL3t2YXJpYWJsZUlkfScucmVwbGFjZSgne2Z1bmN0aW9uSWR9JywgZnVuY3Rpb25JZCkucmVwbGFjZSgne3ZhcmlhYmxlSWR9JywgdmFyaWFibGVJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2RlbGV0ZScsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=