@appconda/sdk 1.0.194 → 1.0.410

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 (984) hide show
  1. package/.github/workflows/autoclose.yml +11 -0
  2. package/.github/workflows/publish.yml +42 -0
  3. package/.travis.yml +32 -0
  4. package/CHANGELOG.md +1 -0
  5. package/LICENSE +12 -0
  6. package/README.md +0 -0
  7. package/dist/actions/_authOptions.d.ts +5 -0
  8. package/dist/actions/_authOptions.js +235 -0
  9. package/dist/actions/actionClient.d.ts +10 -0
  10. package/dist/actions/actionClient.js +41 -0
  11. package/dist/actions/auth.d.ts +1 -0
  12. package/dist/actions/auth.js +7 -0
  13. package/dist/actions/authOptions.d.ts +5 -0
  14. package/dist/actions/authOptions.js +133 -0
  15. package/dist/actions/index.d.ts +3 -0
  16. package/dist/actions/index.js +4 -0
  17. package/dist/actions/nextAuthHandler.d.ts +1 -0
  18. package/dist/actions/nextAuthHandler.js +6 -0
  19. package/dist/client.d.ts +141 -0
  20. package/dist/client.js +335 -0
  21. package/dist/decorators/Cache.d.ts +1 -0
  22. package/dist/decorators/Cache.js +79 -0
  23. package/dist/decorators/CacheKey.d.ts +1 -0
  24. package/dist/decorators/CacheKey.js +9 -0
  25. package/dist/decorators/Invalidate.d.ts +1 -0
  26. package/dist/decorators/Invalidate.js +47 -0
  27. package/dist/enums/api-service.d.ts +13 -0
  28. package/dist/enums/api-service.js +15 -0
  29. package/dist/enums/api.d.ts +5 -0
  30. package/dist/enums/api.js +7 -0
  31. package/dist/enums/auth-method.d.ts +9 -0
  32. package/dist/enums/auth-method.js +11 -0
  33. package/dist/enums/browser.d.ts +16 -0
  34. package/dist/enums/browser.js +18 -0
  35. package/dist/enums/compression.d.ts +5 -0
  36. package/dist/enums/compression.js +7 -0
  37. package/dist/enums/credit-card.d.ts +18 -0
  38. package/dist/enums/credit-card.js +20 -0
  39. package/dist/enums/database-usage-range.d.ts +5 -0
  40. package/dist/enums/database-usage-range.js +7 -0
  41. package/dist/enums/email-template-locale.d.ts +133 -0
  42. package/dist/enums/email-template-locale.js +135 -0
  43. package/dist/enums/email-template-type.d.ts +9 -0
  44. package/dist/enums/email-template-type.js +11 -0
  45. package/dist/enums/entities/EntityLimitType.d.ts +4 -0
  46. package/dist/enums/entities/EntityLimitType.js +6 -0
  47. package/dist/enums/entities/PropertyAttributeName.d.ts +27 -0
  48. package/dist/enums/entities/PropertyAttributeName.js +29 -0
  49. package/dist/enums/entities/PropertyCondition.d.ts +7 -0
  50. package/dist/enums/entities/PropertyCondition.js +10 -0
  51. package/dist/enums/entities/PropertyType.d.ts +12 -0
  52. package/dist/enums/entities/PropertyType.js +18 -0
  53. package/dist/enums/entities/PropertyValueType.d.ts +6 -0
  54. package/dist/enums/entities/PropertyValueType.js +8 -0
  55. package/dist/enums/entities/RowAccess.d.ts +2 -0
  56. package/dist/enums/entities/RowAccess.js +2 -0
  57. package/dist/enums/entities/ViewFilterCondition.d.ts +12 -0
  58. package/dist/enums/entities/ViewFilterCondition.js +14 -0
  59. package/dist/enums/execution-method.d.ts +8 -0
  60. package/dist/enums/execution-method.js +10 -0
  61. package/dist/enums/flag.d.ts +197 -0
  62. package/dist/enums/flag.js +199 -0
  63. package/dist/enums/function-usage-range.d.ts +5 -0
  64. package/dist/enums/function-usage-range.js +7 -0
  65. package/dist/enums/image-format.d.ts +7 -0
  66. package/dist/enums/image-format.js +9 -0
  67. package/dist/enums/image-gravity.d.ts +11 -0
  68. package/dist/enums/image-gravity.js +13 -0
  69. package/dist/enums/index-type.d.ts +5 -0
  70. package/dist/enums/index-type.js +7 -0
  71. package/dist/enums/messaging-provider-type.d.ts +5 -0
  72. package/dist/enums/messaging-provider-type.js +7 -0
  73. package/dist/enums/name.d.ts +14 -0
  74. package/dist/enums/name.js +16 -0
  75. package/dist/enums/o-auth-provider copy.d.ts +41 -0
  76. package/dist/enums/o-auth-provider copy.js +43 -0
  77. package/dist/enums/password-hash.d.ts +13 -0
  78. package/dist/enums/password-hash.js +15 -0
  79. package/dist/enums/platform-type.d.ts +17 -0
  80. package/dist/enums/platform-type.js +19 -0
  81. package/dist/enums/project-usage-range.d.ts +4 -0
  82. package/dist/enums/project-usage-range.js +6 -0
  83. package/dist/enums/region.d.ts +4 -0
  84. package/dist/enums/region.js +6 -0
  85. package/dist/enums/relation-mutate.d.ts +5 -0
  86. package/dist/enums/relation-mutate.js +7 -0
  87. package/dist/enums/relationship-type.d.ts +6 -0
  88. package/dist/enums/relationship-type.js +8 -0
  89. package/dist/enums/resource-type.d.ts +4 -0
  90. package/dist/enums/resource-type.js +6 -0
  91. package/dist/enums/runtime.d.ts +48 -0
  92. package/dist/enums/runtime.js +50 -0
  93. package/dist/enums/s-m-t-p-secure.d.ts +3 -0
  94. package/dist/enums/s-m-t-p-secure.js +5 -0
  95. package/dist/enums/shared/ApplicationLayout.d.ts +4 -0
  96. package/dist/enums/shared/ApplicationLayout.js +6 -0
  97. package/dist/enums/shared/Colors.d.ts +24 -0
  98. package/dist/enums/shared/Colors.js +26 -0
  99. package/dist/enums/shared/InputType.d.ts +6 -0
  100. package/dist/enums/shared/InputType.js +8 -0
  101. package/dist/enums/shared/Periodicity.d.ts +7 -0
  102. package/dist/enums/shared/Periodicity.js +9 -0
  103. package/dist/enums/shared/SvgIcon.d.ts +37 -0
  104. package/dist/enums/shared/SvgIcon.js +39 -0
  105. package/dist/enums/shared/Theme.d.ts +4 -0
  106. package/dist/enums/shared/Theme.js +6 -0
  107. package/dist/enums/sms-template-locale.d.ts +133 -0
  108. package/dist/enums/sms-template-locale.js +135 -0
  109. package/dist/enums/sms-template-type.d.ts +6 -0
  110. package/dist/enums/sms-template-type.js +8 -0
  111. package/dist/enums/smtp-encryption.d.ts +5 -0
  112. package/dist/enums/smtp-encryption.js +7 -0
  113. package/dist/enums/storage-usage-range.d.ts +5 -0
  114. package/dist/enums/storage-usage-range.js +7 -0
  115. package/dist/enums/subscriptions/PricingModel.d.ts +11 -0
  116. package/dist/enums/subscriptions/PricingModel.js +12 -0
  117. package/dist/enums/subscriptions/SubscriptionBillingPeriod.d.ts +10 -0
  118. package/dist/enums/subscriptions/SubscriptionBillingPeriod.js +11 -0
  119. package/dist/enums/subscriptions/SubscriptionFeatureLimitType.d.ts +10 -0
  120. package/dist/enums/subscriptions/SubscriptionFeatureLimitType.js +13 -0
  121. package/dist/enums/subscriptions/SubscriptionPriceType.d.ts +7 -0
  122. package/dist/enums/subscriptions/SubscriptionPriceType.js +8 -0
  123. package/dist/enums/tenants/LinkedAccountStatus.d.ts +5 -0
  124. package/dist/enums/tenants/LinkedAccountStatus.js +7 -0
  125. package/dist/enums/tenants/TenantUserJoined.d.ts +6 -0
  126. package/dist/enums/tenants/TenantUserJoined.js +8 -0
  127. package/dist/enums/tenants/TenantUserStatus.d.ts +6 -0
  128. package/dist/enums/tenants/TenantUserStatus.js +8 -0
  129. package/dist/enums/tenants/TenantUserType.d.ts +5 -0
  130. package/dist/enums/tenants/TenantUserType.js +7 -0
  131. package/dist/enums/user-usage-range.d.ts +5 -0
  132. package/dist/enums/user-usage-range.js +7 -0
  133. package/dist/getAppcondaClient.d.ts +3 -0
  134. package/dist/getAppcondaClient.js +71 -0
  135. package/dist/getSDKForCurrentUser.d.ts +59 -0
  136. package/dist/getSDKForCurrentUser.js +100 -0
  137. package/dist/getSDKForService.d.ts +18 -0
  138. package/dist/getSDKForService.js +67 -0
  139. package/dist/getSDKForTenant.d.ts +20 -0
  140. package/dist/getSDKForTenant.js +44 -0
  141. package/dist/id.d.ts +20 -0
  142. package/dist/id.js +45 -0
  143. package/dist/index.d.ts +1 -0
  144. package/dist/index.js +2 -0
  145. package/dist/inputFile.d.ts +7 -0
  146. package/dist/inputFile.js +17 -0
  147. package/dist/lib/Cache/Adapter.d.ts +10 -0
  148. package/dist/lib/Cache/Adapter.js +2 -0
  149. package/dist/lib/Cache/Adapters/Filesystem.d.ts +16 -0
  150. package/dist/lib/Cache/Adapters/Filesystem.js +103 -0
  151. package/dist/lib/Cache/Adapters/Memory.d.ts +18 -0
  152. package/dist/lib/Cache/Adapters/Memory.js +47 -0
  153. package/dist/lib/Cache/Adapters/None.d.ts +12 -0
  154. package/dist/lib/Cache/Adapters/None.js +28 -0
  155. package/dist/lib/Cache/Adapters/Sharding.d.ts +17 -0
  156. package/dist/lib/Cache/Adapters/Sharding.js +73 -0
  157. package/dist/lib/Cache/Cache.d.ts +16 -0
  158. package/dist/lib/Cache/Cache.js +52 -0
  159. package/dist/lib/Cache/index.d.ts +4 -0
  160. package/dist/lib/Cache/index.js +5 -0
  161. package/dist/lib/Cache/test.d.ts +0 -0
  162. package/dist/lib/Cache/test.js +1 -0
  163. package/dist/lib/Registry/Registry.d.ts +38 -0
  164. package/dist/lib/Registry/Registry.js +56 -0
  165. package/dist/lib/Registry/index.d.ts +1 -0
  166. package/dist/lib/Registry/index.js +2 -0
  167. package/dist/lib/Services.d.ts +6 -0
  168. package/dist/lib/Services.js +14 -0
  169. package/dist/lib/crypto.d.ts +23 -0
  170. package/dist/lib/crypto.js +78 -0
  171. package/dist/lib/env.d.ts +1 -0
  172. package/dist/lib/env.js +137 -0
  173. package/dist/lib/errors.d.ts +70 -0
  174. package/dist/lib/errors.js +79 -0
  175. package/dist/lib/index.d.ts +0 -0
  176. package/dist/lib/index.js +1 -0
  177. package/dist/lib/jwt.d.ts +12 -0
  178. package/dist/lib/jwt.js +103 -0
  179. package/dist/lib/types.d.ts +5 -0
  180. package/dist/lib/types.js +2 -0
  181. package/dist/models.d.ts +3272 -0
  182. package/dist/models.js +2 -0
  183. package/dist/modules/account/actions.d.ts +11 -0
  184. package/dist/modules/account/actions.js +49 -0
  185. package/dist/modules/account/enums/authentication-factor.d.ts +6 -0
  186. package/dist/modules/account/enums/authentication-factor.js +8 -0
  187. package/dist/modules/account/enums/authenticator-type.d.ts +3 -0
  188. package/dist/modules/account/enums/authenticator-type.js +5 -0
  189. package/dist/modules/account/enums/o-auth-provider.d.ts +41 -0
  190. package/dist/modules/account/enums/o-auth-provider.js +43 -0
  191. package/dist/modules/account/index.d.ts +2 -0
  192. package/dist/modules/account/index.js +3 -0
  193. package/dist/modules/account/schema.d.ts +7 -0
  194. package/dist/modules/account/schema.js +8 -0
  195. package/dist/modules/account/service.d.ts +530 -0
  196. package/dist/modules/account/service.js +1263 -0
  197. package/dist/modules/account/types.d.ts +411 -0
  198. package/dist/modules/account/types.js +2 -0
  199. package/dist/modules/accounv1/action.d.ts +9 -0
  200. package/dist/modules/accounv1/action.js +88 -0
  201. package/dist/modules/accounv1/index.d.ts +3 -0
  202. package/dist/modules/accounv1/index.js +4 -0
  203. package/dist/modules/accounv1/schema.d.ts +43 -0
  204. package/dist/modules/accounv1/schema.js +44 -0
  205. package/dist/modules/accounv1/service.d.ts +14 -0
  206. package/dist/modules/accounv1/service.js +28 -0
  207. package/dist/modules/accounv1/types.d.ts +14 -0
  208. package/dist/modules/accounv1/types.js +2 -0
  209. package/dist/modules/acl/service.d.ts +26 -0
  210. package/dist/modules/acl/service.js +27 -0
  211. package/dist/modules/agent/action.d.ts +29 -0
  212. package/dist/modules/agent/action.js +53 -0
  213. package/dist/modules/agent/index.d.ts +4 -0
  214. package/dist/modules/agent/index.js +5 -0
  215. package/dist/modules/agent/schema.d.ts +20 -0
  216. package/dist/modules/agent/schema.js +21 -0
  217. package/dist/modules/agent/service.d.ts +12 -0
  218. package/dist/modules/agent/service.js +22 -0
  219. package/dist/modules/agent/types.d.ts +11 -0
  220. package/dist/modules/agent/types.js +2 -0
  221. package/dist/modules/ai/index.d.ts +1 -0
  222. package/dist/modules/ai/index.js +2 -0
  223. package/dist/modules/ai/node/actions.d.ts +4 -0
  224. package/dist/modules/ai/node/actions.js +14 -0
  225. package/dist/modules/ai/node/index.d.ts +2 -0
  226. package/dist/modules/ai/node/index.js +3 -0
  227. package/dist/modules/ai/node/service.d.ts +5 -0
  228. package/dist/modules/ai/node/service.js +12 -0
  229. package/dist/modules/bpm/action.d.ts +7 -0
  230. package/dist/modules/bpm/action.js +60 -0
  231. package/dist/modules/bpm/index.d.ts +3 -0
  232. package/dist/modules/bpm/index.js +4 -0
  233. package/dist/modules/bpm/schema.d.ts +18 -0
  234. package/dist/modules/bpm/schema.js +19 -0
  235. package/dist/modules/bpm/service.d.ts +11 -0
  236. package/dist/modules/bpm/service.js +19 -0
  237. package/dist/modules/bpm/types.d.ts +9 -0
  238. package/dist/modules/bpm/types.js +2 -0
  239. package/dist/modules/builder/action.d.ts +18 -0
  240. package/dist/modules/builder/action.js +214 -0
  241. package/dist/modules/builder/index.d.ts +4 -0
  242. package/dist/modules/builder/index.js +5 -0
  243. package/dist/modules/builder/schema.d.ts +80 -0
  244. package/dist/modules/builder/schema.js +81 -0
  245. package/dist/modules/builder/service.d.ts +22 -0
  246. package/dist/modules/builder/service.js +52 -0
  247. package/dist/modules/builder/types.d.ts +62 -0
  248. package/dist/modules/builder/types.js +2 -0
  249. package/dist/modules/datasource/action.d.ts +14 -0
  250. package/dist/modules/datasource/action.js +172 -0
  251. package/dist/modules/datasource/index.d.ts +4 -0
  252. package/dist/modules/datasource/index.js +5 -0
  253. package/dist/modules/datasource/schema.d.ts +55 -0
  254. package/dist/modules/datasource/schema.js +56 -0
  255. package/dist/modules/datasource/service.d.ts +19 -0
  256. package/dist/modules/datasource/service.js +43 -0
  257. package/dist/modules/datasource/types.d.ts +28 -0
  258. package/dist/modules/datasource/types.js +2 -0
  259. package/dist/modules/emploid/action.d.ts +73 -0
  260. package/dist/modules/emploid/action.js +984 -0
  261. package/dist/modules/emploid/index.d.ts +4 -0
  262. package/dist/modules/emploid/index.js +5 -0
  263. package/dist/modules/emploid/schema.d.ts +386 -0
  264. package/dist/modules/emploid/schema.js +331 -0
  265. package/dist/modules/emploid/service.d.ts +77 -0
  266. package/dist/modules/emploid/service.js +217 -0
  267. package/dist/modules/emploid/types.d.ts +114 -0
  268. package/dist/modules/emploid/types.js +2 -0
  269. package/dist/modules/google/action.d.ts +5 -0
  270. package/dist/modules/google/action.js +46 -0
  271. package/dist/modules/google/index.d.ts +4 -0
  272. package/dist/modules/google/index.js +5 -0
  273. package/dist/modules/google/schema.d.ts +13 -0
  274. package/dist/modules/google/schema.js +14 -0
  275. package/dist/modules/google/service.d.ts +10 -0
  276. package/dist/modules/google/service.js +16 -0
  277. package/dist/modules/google/types.d.ts +12 -0
  278. package/dist/modules/google/types.js +2 -0
  279. package/dist/modules/hooks/index.d.ts +3 -0
  280. package/dist/modules/hooks/index.js +4 -0
  281. package/dist/modules/hooks/lib/Hooks.d.ts +32 -0
  282. package/dist/modules/hooks/lib/Hooks.js +64 -0
  283. package/dist/modules/hooks/lib/handler.d.ts +3 -0
  284. package/dist/modules/hooks/lib/handler.js +23 -0
  285. package/dist/modules/hooks/lib/jobs/index.d.ts +2 -0
  286. package/dist/modules/hooks/lib/jobs/index.js +3 -0
  287. package/dist/modules/hooks/lib/jobs/job1.d.ts +1 -0
  288. package/dist/modules/hooks/lib/jobs/job1.js +16 -0
  289. package/dist/modules/hooks/lib/jobs/log-job.d.ts +1 -0
  290. package/dist/modules/hooks/lib/jobs/log-job.js +9 -0
  291. package/dist/modules/hooks/lib/wait.d.ts +8 -0
  292. package/dist/modules/hooks/lib/wait.js +13 -0
  293. package/dist/modules/index.d.ts +17 -0
  294. package/dist/modules/index.js +18 -0
  295. package/dist/modules/mail/action.d.ts +3 -0
  296. package/dist/modules/mail/action.js +18 -0
  297. package/dist/modules/mail/index.d.ts +4 -0
  298. package/dist/modules/mail/index.js +5 -0
  299. package/dist/modules/mail/schema.d.ts +6 -0
  300. package/dist/modules/mail/schema.js +7 -0
  301. package/dist/modules/mail/service.d.ts +8 -0
  302. package/dist/modules/mail/service.js +10 -0
  303. package/dist/modules/mail/types.d.ts +6 -0
  304. package/dist/modules/mail/types.js +2 -0
  305. package/dist/modules/notion/action.d.ts +5 -0
  306. package/dist/modules/notion/action.js +46 -0
  307. package/dist/modules/notion/index.d.ts +4 -0
  308. package/dist/modules/notion/index.js +5 -0
  309. package/dist/modules/notion/schema.d.ts +13 -0
  310. package/dist/modules/notion/schema.js +14 -0
  311. package/dist/modules/notion/service.d.ts +10 -0
  312. package/dist/modules/notion/service.js +19 -0
  313. package/dist/modules/notion/types.d.ts +11 -0
  314. package/dist/modules/notion/types.js +2 -0
  315. package/dist/modules/organization/action.d.ts +7 -0
  316. package/dist/modules/organization/action.js +60 -0
  317. package/dist/modules/organization/index.d.ts +4 -0
  318. package/dist/modules/organization/index.js +5 -0
  319. package/dist/modules/organization/schema.d.ts +24 -0
  320. package/dist/modules/organization/schema.js +20 -0
  321. package/dist/modules/organization/service.d.ts +11 -0
  322. package/dist/modules/organization/service.js +19 -0
  323. package/dist/modules/organization/types.d.ts +11 -0
  324. package/dist/modules/organization/types.js +2 -0
  325. package/dist/modules/scheduled-job/action.d.ts +70 -0
  326. package/dist/modules/scheduled-job/action.js +173 -0
  327. package/dist/modules/scheduled-job/index.d.ts +7 -0
  328. package/dist/modules/scheduled-job/index.js +8 -0
  329. package/dist/modules/scheduled-job/lib/Schedules.d.ts +34 -0
  330. package/dist/modules/scheduled-job/lib/Schedules.js +65 -0
  331. package/dist/modules/scheduled-job/lib/handler.d.ts +3 -0
  332. package/dist/modules/scheduled-job/lib/handler.js +23 -0
  333. package/dist/modules/scheduled-job/lib/jobs/index.d.ts +1 -0
  334. package/dist/modules/scheduled-job/lib/jobs/index.js +2 -0
  335. package/dist/modules/scheduled-job/lib/jobs/job1.d.ts +1 -0
  336. package/dist/modules/scheduled-job/lib/jobs/job1.js +10 -0
  337. package/dist/modules/scheduled-job/lib/wait.d.ts +8 -0
  338. package/dist/modules/scheduled-job/lib/wait.js +13 -0
  339. package/dist/modules/scheduled-job/schema.d.ts +39 -0
  340. package/dist/modules/scheduled-job/schema.js +40 -0
  341. package/dist/modules/scheduled-job/service.d.ts +20 -0
  342. package/dist/modules/scheduled-job/service.js +46 -0
  343. package/dist/modules/scheduled-job/types.d.ts +66 -0
  344. package/dist/modules/scheduled-job/types.js +2 -0
  345. package/dist/modules/task/action.d.ts +64 -0
  346. package/dist/modules/task/action.js +758 -0
  347. package/dist/modules/task/index.d.ts +4 -0
  348. package/dist/modules/task/index.js +5 -0
  349. package/dist/modules/task/schema.d.ts +355 -0
  350. package/dist/modules/task/schema.js +371 -0
  351. package/dist/modules/task/service.d.ts +69 -0
  352. package/dist/modules/task/service.js +193 -0
  353. package/dist/modules/task/types.d.ts +293 -0
  354. package/dist/modules/task/types.js +37 -0
  355. package/dist/modules/tenant/actions.d.ts +10 -0
  356. package/dist/modules/tenant/actions.js +160 -0
  357. package/dist/modules/tenant/index.d.ts +3 -0
  358. package/dist/modules/tenant/index.js +4 -0
  359. package/dist/modules/tenant/schema.d.ts +26 -0
  360. package/dist/modules/tenant/schema.js +28 -0
  361. package/dist/modules/tenant/service.d.ts +14 -0
  362. package/dist/modules/tenant/service.js +28 -0
  363. package/dist/modules/tenant/tenant.d.ts +32 -0
  364. package/dist/modules/tenant/tenant.js +125 -0
  365. package/dist/modules/tenant/types.d.ts +20 -0
  366. package/dist/modules/tenant/types.js +2 -0
  367. package/dist/modules/waitlist/action.d.ts +6 -0
  368. package/dist/modules/waitlist/action.js +78 -0
  369. package/dist/modules/waitlist/index.d.ts +4 -0
  370. package/dist/modules/waitlist/index.js +5 -0
  371. package/dist/modules/waitlist/schema.d.ts +17 -0
  372. package/dist/modules/waitlist/schema.js +18 -0
  373. package/dist/modules/waitlist/service.d.ts +13 -0
  374. package/dist/modules/waitlist/service.js +28 -0
  375. package/dist/modules/waitlist/types.d.ts +14 -0
  376. package/dist/modules/waitlist/types.js +2 -0
  377. package/dist/permission.d.ts +43 -0
  378. package/dist/permission.js +54 -0
  379. package/dist/query.d.ts +194 -0
  380. package/dist/query.js +204 -0
  381. package/dist/role.d.ts +70 -0
  382. package/dist/role.js +94 -0
  383. package/dist/schemas/nodes.d.ts +0 -0
  384. package/dist/schemas/nodes.js +1 -0
  385. package/dist/service-client.d.ts +8 -0
  386. package/dist/service-client.js +22 -0
  387. package/dist/service.d.ts +11 -0
  388. package/dist/service.js +23 -0
  389. package/dist/services/applets.d.ts +9 -0
  390. package/dist/services/applets.js +40 -0
  391. package/dist/services/avatars.d.ts +115 -0
  392. package/dist/services/avatars.js +251 -0
  393. package/dist/services/chat-flow.d.ts +7 -0
  394. package/dist/services/chat-flow.js +26 -0
  395. package/dist/services/community.d.ts +19 -0
  396. package/dist/services/community.js +69 -0
  397. package/dist/services/configuration.d.ts +5 -0
  398. package/dist/services/configuration.js +11 -0
  399. package/dist/services/databases.d.ts +613 -0
  400. package/dist/services/databases.js +1736 -0
  401. package/dist/services/functions.d.ts +319 -0
  402. package/dist/services/functions.js +810 -0
  403. package/dist/services/graphql.d.ts +25 -0
  404. package/dist/services/graphql.js +57 -0
  405. package/dist/services/health.d.ts +231 -0
  406. package/dist/services/health.js +463 -0
  407. package/dist/services/locale.d.ts +80 -0
  408. package/dist/services/locale.js +144 -0
  409. package/dist/services/messaging.d.ts +685 -0
  410. package/dist/services/messaging.js +1920 -0
  411. package/dist/services/permissions.d.ts +20 -0
  412. package/dist/services/permissions.js +90 -0
  413. package/dist/services/pricing.d.ts +15 -0
  414. package/dist/services/pricing.js +21 -0
  415. package/dist/services/projects.d.ts +542 -0
  416. package/dist/services/projects.js +1526 -0
  417. package/dist/services/roles.d.ts +19 -0
  418. package/dist/services/roles.js +72 -0
  419. package/dist/services/schema.d.ts +17 -0
  420. package/dist/services/schema.js +48 -0
  421. package/dist/services/storage.d.ts +189 -0
  422. package/dist/services/storage.js +474 -0
  423. package/dist/services/subscription.d.ts +15 -0
  424. package/dist/services/subscription.js +30 -0
  425. package/dist/services/teams.d.ts +167 -0
  426. package/dist/services/teams.js +395 -0
  427. package/dist/services/tenant-subscription.d.ts +12 -0
  428. package/dist/services/tenant-subscription.js +52 -0
  429. package/dist/services/users.d.ts +499 -0
  430. package/dist/services/users.js +1283 -0
  431. package/docs/examples/account/create-anonymous-session.md +11 -0
  432. package/docs/examples/account/create-email-password-session.md +14 -0
  433. package/docs/examples/account/create-email-token.md +15 -0
  434. package/docs/examples/account/create-j-w-t.md +11 -0
  435. package/docs/examples/account/create-magic-u-r-l-token.md +16 -0
  436. package/docs/examples/account/create-mfa-authenticator.md +13 -0
  437. package/docs/examples/account/create-mfa-challenge.md +13 -0
  438. package/docs/examples/account/create-mfa-recovery-codes.md +11 -0
  439. package/docs/examples/account/create-o-auth2session.md +15 -0
  440. package/docs/examples/account/create-o-auth2token.md +15 -0
  441. package/docs/examples/account/create-phone-token.md +14 -0
  442. package/docs/examples/account/create-phone-verification.md +11 -0
  443. package/docs/examples/account/create-push-target.md +15 -0
  444. package/docs/examples/account/create-recovery.md +14 -0
  445. package/docs/examples/account/create-session.md +14 -0
  446. package/docs/examples/account/create-verification.md +13 -0
  447. package/docs/examples/account/create.md +16 -0
  448. package/docs/examples/account/delete-identity.md +13 -0
  449. package/docs/examples/account/delete-mfa-authenticator.md +13 -0
  450. package/docs/examples/account/delete-push-target.md +13 -0
  451. package/docs/examples/account/delete-session.md +13 -0
  452. package/docs/examples/account/delete-sessions.md +11 -0
  453. package/docs/examples/account/delete.md +11 -0
  454. package/docs/examples/account/get-mfa-recovery-codes.md +11 -0
  455. package/docs/examples/account/get-prefs.md +11 -0
  456. package/docs/examples/account/get-session.md +13 -0
  457. package/docs/examples/account/get.md +11 -0
  458. package/docs/examples/account/list-identities.md +13 -0
  459. package/docs/examples/account/list-logs.md +13 -0
  460. package/docs/examples/account/list-mfa-factors.md +11 -0
  461. package/docs/examples/account/list-sessions.md +11 -0
  462. package/docs/examples/account/update-email.md +14 -0
  463. package/docs/examples/account/update-m-f-a.md +13 -0
  464. package/docs/examples/account/update-magic-u-r-l-session.md +14 -0
  465. package/docs/examples/account/update-mfa-authenticator.md +14 -0
  466. package/docs/examples/account/update-mfa-challenge.md +14 -0
  467. package/docs/examples/account/update-mfa-recovery-codes.md +11 -0
  468. package/docs/examples/account/update-name.md +13 -0
  469. package/docs/examples/account/update-password.md +14 -0
  470. package/docs/examples/account/update-phone-session.md +14 -0
  471. package/docs/examples/account/update-phone-verification.md +14 -0
  472. package/docs/examples/account/update-phone.md +14 -0
  473. package/docs/examples/account/update-prefs.md +13 -0
  474. package/docs/examples/account/update-push-target.md +14 -0
  475. package/docs/examples/account/update-recovery.md +15 -0
  476. package/docs/examples/account/update-session.md +13 -0
  477. package/docs/examples/account/update-status.md +11 -0
  478. package/docs/examples/account/update-verification.md +14 -0
  479. package/docs/examples/assistant/chat.md +13 -0
  480. package/docs/examples/avatars/get-browser.md +16 -0
  481. package/docs/examples/avatars/get-credit-card.md +16 -0
  482. package/docs/examples/avatars/get-favicon.md +13 -0
  483. package/docs/examples/avatars/get-flag.md +16 -0
  484. package/docs/examples/avatars/get-image.md +15 -0
  485. package/docs/examples/avatars/get-initials.md +16 -0
  486. package/docs/examples/avatars/get-q-r.md +16 -0
  487. package/docs/examples/console/variables.md +11 -0
  488. package/docs/examples/databases/create-boolean-attribute.md +18 -0
  489. package/docs/examples/databases/create-collection.md +18 -0
  490. package/docs/examples/databases/create-datetime-attribute.md +18 -0
  491. package/docs/examples/databases/create-document.md +17 -0
  492. package/docs/examples/databases/create-email-attribute.md +18 -0
  493. package/docs/examples/databases/create-enum-attribute.md +19 -0
  494. package/docs/examples/databases/create-float-attribute.md +20 -0
  495. package/docs/examples/databases/create-index.md +18 -0
  496. package/docs/examples/databases/create-integer-attribute.md +20 -0
  497. package/docs/examples/databases/create-ip-attribute.md +18 -0
  498. package/docs/examples/databases/create-relationship-attribute.md +20 -0
  499. package/docs/examples/databases/create-string-attribute.md +20 -0
  500. package/docs/examples/databases/create-url-attribute.md +18 -0
  501. package/docs/examples/databases/create.md +15 -0
  502. package/docs/examples/databases/delete-attribute.md +15 -0
  503. package/docs/examples/databases/delete-collection.md +14 -0
  504. package/docs/examples/databases/delete-document.md +15 -0
  505. package/docs/examples/databases/delete-index.md +15 -0
  506. package/docs/examples/databases/delete.md +13 -0
  507. package/docs/examples/databases/get-attribute.md +15 -0
  508. package/docs/examples/databases/get-collection-usage.md +15 -0
  509. package/docs/examples/databases/get-collection.md +14 -0
  510. package/docs/examples/databases/get-database-usage.md +14 -0
  511. package/docs/examples/databases/get-document.md +16 -0
  512. package/docs/examples/databases/get-index.md +15 -0
  513. package/docs/examples/databases/get-usage.md +13 -0
  514. package/docs/examples/databases/get.md +13 -0
  515. package/docs/examples/databases/list-attributes.md +15 -0
  516. package/docs/examples/databases/list-collection-logs.md +15 -0
  517. package/docs/examples/databases/list-collections.md +15 -0
  518. package/docs/examples/databases/list-document-logs.md +16 -0
  519. package/docs/examples/databases/list-documents.md +15 -0
  520. package/docs/examples/databases/list-indexes.md +15 -0
  521. package/docs/examples/databases/list-logs.md +14 -0
  522. package/docs/examples/databases/list.md +14 -0
  523. package/docs/examples/databases/update-boolean-attribute.md +17 -0
  524. package/docs/examples/databases/update-collection.md +18 -0
  525. package/docs/examples/databases/update-datetime-attribute.md +17 -0
  526. package/docs/examples/databases/update-document.md +17 -0
  527. package/docs/examples/databases/update-email-attribute.md +17 -0
  528. package/docs/examples/databases/update-enum-attribute.md +18 -0
  529. package/docs/examples/databases/update-float-attribute.md +19 -0
  530. package/docs/examples/databases/update-integer-attribute.md +19 -0
  531. package/docs/examples/databases/update-ip-attribute.md +17 -0
  532. package/docs/examples/databases/update-relationship-attribute.md +16 -0
  533. package/docs/examples/databases/update-string-attribute.md +17 -0
  534. package/docs/examples/databases/update-url-attribute.md +17 -0
  535. package/docs/examples/databases/update.md +15 -0
  536. package/docs/examples/functions/create-build.md +15 -0
  537. package/docs/examples/functions/create-deployment.md +17 -0
  538. package/docs/examples/functions/create-execution.md +19 -0
  539. package/docs/examples/functions/create-variable.md +15 -0
  540. package/docs/examples/functions/create.md +34 -0
  541. package/docs/examples/functions/delete-deployment.md +14 -0
  542. package/docs/examples/functions/delete-execution.md +14 -0
  543. package/docs/examples/functions/delete-variable.md +14 -0
  544. package/docs/examples/functions/delete.md +13 -0
  545. package/docs/examples/functions/get-deployment-download.md +14 -0
  546. package/docs/examples/functions/get-deployment.md +14 -0
  547. package/docs/examples/functions/get-execution.md +14 -0
  548. package/docs/examples/functions/get-function-usage.md +14 -0
  549. package/docs/examples/functions/get-template.md +13 -0
  550. package/docs/examples/functions/get-usage.md +13 -0
  551. package/docs/examples/functions/get-variable.md +14 -0
  552. package/docs/examples/functions/get.md +13 -0
  553. package/docs/examples/functions/list-deployments.md +15 -0
  554. package/docs/examples/functions/list-executions.md +15 -0
  555. package/docs/examples/functions/list-runtimes.md +11 -0
  556. package/docs/examples/functions/list-specifications.md +11 -0
  557. package/docs/examples/functions/list-templates.md +16 -0
  558. package/docs/examples/functions/list-variables.md +13 -0
  559. package/docs/examples/functions/list.md +14 -0
  560. package/docs/examples/functions/update-deployment-build.md +14 -0
  561. package/docs/examples/functions/update-deployment.md +14 -0
  562. package/docs/examples/functions/update-variable.md +16 -0
  563. package/docs/examples/functions/update.md +30 -0
  564. package/docs/examples/graphql/mutation.md +13 -0
  565. package/docs/examples/graphql/query.md +13 -0
  566. package/docs/examples/health/get-antivirus.md +11 -0
  567. package/docs/examples/health/get-cache.md +11 -0
  568. package/docs/examples/health/get-certificate.md +13 -0
  569. package/docs/examples/health/get-d-b.md +11 -0
  570. package/docs/examples/health/get-failed-jobs.md +14 -0
  571. package/docs/examples/health/get-pub-sub.md +11 -0
  572. package/docs/examples/health/get-queue-builds.md +13 -0
  573. package/docs/examples/health/get-queue-certificates.md +13 -0
  574. package/docs/examples/health/get-queue-databases.md +14 -0
  575. package/docs/examples/health/get-queue-deletes.md +13 -0
  576. package/docs/examples/health/get-queue-functions.md +13 -0
  577. package/docs/examples/health/get-queue-logs.md +13 -0
  578. package/docs/examples/health/get-queue-mails.md +13 -0
  579. package/docs/examples/health/get-queue-messaging.md +13 -0
  580. package/docs/examples/health/get-queue-migrations.md +13 -0
  581. package/docs/examples/health/get-queue-usage-dump.md +13 -0
  582. package/docs/examples/health/get-queue-usage.md +13 -0
  583. package/docs/examples/health/get-queue-webhooks.md +13 -0
  584. package/docs/examples/health/get-queue.md +11 -0
  585. package/docs/examples/health/get-storage-local.md +11 -0
  586. package/docs/examples/health/get-storage.md +11 -0
  587. package/docs/examples/health/get-time.md +11 -0
  588. package/docs/examples/health/get.md +11 -0
  589. package/docs/examples/locale/get.md +11 -0
  590. package/docs/examples/locale/list-codes.md +11 -0
  591. package/docs/examples/locale/list-continents.md +11 -0
  592. package/docs/examples/locale/list-countries-e-u.md +11 -0
  593. package/docs/examples/locale/list-countries-phones.md +11 -0
  594. package/docs/examples/locale/list-countries.md +11 -0
  595. package/docs/examples/locale/list-currencies.md +11 -0
  596. package/docs/examples/locale/list-languages.md +11 -0
  597. package/docs/examples/messaging/create-apns-provider.md +20 -0
  598. package/docs/examples/messaging/create-email.md +24 -0
  599. package/docs/examples/messaging/create-fcm-provider.md +16 -0
  600. package/docs/examples/messaging/create-mailgun-provider.md +22 -0
  601. package/docs/examples/messaging/create-msg91provider.md +18 -0
  602. package/docs/examples/messaging/create-push.md +28 -0
  603. package/docs/examples/messaging/create-sendgrid-provider.md +20 -0
  604. package/docs/examples/messaging/create-sms.md +19 -0
  605. package/docs/examples/messaging/create-smtp-provider.md +26 -0
  606. package/docs/examples/messaging/create-subscriber.md +15 -0
  607. package/docs/examples/messaging/create-telesign-provider.md +18 -0
  608. package/docs/examples/messaging/create-textmagic-provider.md +18 -0
  609. package/docs/examples/messaging/create-topic.md +15 -0
  610. package/docs/examples/messaging/create-twilio-provider.md +18 -0
  611. package/docs/examples/messaging/create-vonage-provider.md +18 -0
  612. package/docs/examples/messaging/delete-provider.md +13 -0
  613. package/docs/examples/messaging/delete-subscriber.md +14 -0
  614. package/docs/examples/messaging/delete-topic.md +13 -0
  615. package/docs/examples/messaging/delete.md +13 -0
  616. package/docs/examples/messaging/get-message.md +13 -0
  617. package/docs/examples/messaging/get-provider.md +13 -0
  618. package/docs/examples/messaging/get-subscriber.md +14 -0
  619. package/docs/examples/messaging/get-topic.md +13 -0
  620. package/docs/examples/messaging/list-message-logs.md +14 -0
  621. package/docs/examples/messaging/list-messages.md +14 -0
  622. package/docs/examples/messaging/list-provider-logs.md +14 -0
  623. package/docs/examples/messaging/list-providers.md +14 -0
  624. package/docs/examples/messaging/list-subscriber-logs.md +14 -0
  625. package/docs/examples/messaging/list-subscribers.md +15 -0
  626. package/docs/examples/messaging/list-targets.md +14 -0
  627. package/docs/examples/messaging/list-topic-logs.md +14 -0
  628. package/docs/examples/messaging/list-topics.md +14 -0
  629. package/docs/examples/messaging/update-apns-provider.md +20 -0
  630. package/docs/examples/messaging/update-email.md +24 -0
  631. package/docs/examples/messaging/update-fcm-provider.md +16 -0
  632. package/docs/examples/messaging/update-mailgun-provider.md +22 -0
  633. package/docs/examples/messaging/update-msg91provider.md +18 -0
  634. package/docs/examples/messaging/update-push.md +28 -0
  635. package/docs/examples/messaging/update-sendgrid-provider.md +20 -0
  636. package/docs/examples/messaging/update-sms.md +19 -0
  637. package/docs/examples/messaging/update-smtp-provider.md +26 -0
  638. package/docs/examples/messaging/update-telesign-provider.md +18 -0
  639. package/docs/examples/messaging/update-textmagic-provider.md +18 -0
  640. package/docs/examples/messaging/update-topic.md +15 -0
  641. package/docs/examples/messaging/update-twilio-provider.md +18 -0
  642. package/docs/examples/messaging/update-vonage-provider.md +18 -0
  643. package/docs/examples/migrations/create-appwrite-migration.md +16 -0
  644. package/docs/examples/migrations/create-firebase-migration.md +14 -0
  645. package/docs/examples/migrations/create-firebase-o-auth-migration.md +14 -0
  646. package/docs/examples/migrations/create-n-host-migration.md +20 -0
  647. package/docs/examples/migrations/create-supabase-migration.md +19 -0
  648. package/docs/examples/migrations/delete-firebase-auth.md +11 -0
  649. package/docs/examples/migrations/delete.md +13 -0
  650. package/docs/examples/migrations/get-appwrite-report.md +16 -0
  651. package/docs/examples/migrations/get-firebase-report-o-auth.md +14 -0
  652. package/docs/examples/migrations/get-firebase-report.md +14 -0
  653. package/docs/examples/migrations/get-n-host-report.md +20 -0
  654. package/docs/examples/migrations/get-supabase-report.md +19 -0
  655. package/docs/examples/migrations/get.md +13 -0
  656. package/docs/examples/migrations/list-firebase-projects.md +11 -0
  657. package/docs/examples/migrations/list.md +14 -0
  658. package/docs/examples/migrations/retry.md +13 -0
  659. package/docs/examples/project/create-variable.md +14 -0
  660. package/docs/examples/project/delete-variable.md +13 -0
  661. package/docs/examples/project/get-usage.md +15 -0
  662. package/docs/examples/project/get-variable.md +13 -0
  663. package/docs/examples/project/list-variables.md +11 -0
  664. package/docs/examples/project/update-variable.md +15 -0
  665. package/docs/examples/projects/create-j-w-t.md +15 -0
  666. package/docs/examples/projects/create-key.md +16 -0
  667. package/docs/examples/projects/create-platform.md +18 -0
  668. package/docs/examples/projects/create-smtp-test.md +22 -0
  669. package/docs/examples/projects/create-webhook.md +20 -0
  670. package/docs/examples/projects/create.md +25 -0
  671. package/docs/examples/projects/delete-email-template.md +15 -0
  672. package/docs/examples/projects/delete-key.md +14 -0
  673. package/docs/examples/projects/delete-platform.md +14 -0
  674. package/docs/examples/projects/delete-sms-template.md +15 -0
  675. package/docs/examples/projects/delete-webhook.md +14 -0
  676. package/docs/examples/projects/delete.md +13 -0
  677. package/docs/examples/projects/get-email-template.md +15 -0
  678. package/docs/examples/projects/get-key.md +14 -0
  679. package/docs/examples/projects/get-platform.md +14 -0
  680. package/docs/examples/projects/get-sms-template.md +15 -0
  681. package/docs/examples/projects/get-webhook.md +14 -0
  682. package/docs/examples/projects/get.md +13 -0
  683. package/docs/examples/projects/list-keys.md +13 -0
  684. package/docs/examples/projects/list-platforms.md +13 -0
  685. package/docs/examples/projects/list-webhooks.md +13 -0
  686. package/docs/examples/projects/list.md +14 -0
  687. package/docs/examples/projects/update-api-status-all.md +14 -0
  688. package/docs/examples/projects/update-api-status.md +15 -0
  689. package/docs/examples/projects/update-auth-duration.md +14 -0
  690. package/docs/examples/projects/update-auth-limit.md +14 -0
  691. package/docs/examples/projects/update-auth-password-dictionary.md +14 -0
  692. package/docs/examples/projects/update-auth-password-history.md +14 -0
  693. package/docs/examples/projects/update-auth-sessions-limit.md +14 -0
  694. package/docs/examples/projects/update-auth-status.md +15 -0
  695. package/docs/examples/projects/update-email-template.md +20 -0
  696. package/docs/examples/projects/update-key.md +17 -0
  697. package/docs/examples/projects/update-mock-numbers.md +14 -0
  698. package/docs/examples/projects/update-o-auth2.md +17 -0
  699. package/docs/examples/projects/update-personal-data-check.md +14 -0
  700. package/docs/examples/projects/update-platform.md +18 -0
  701. package/docs/examples/projects/update-service-status-all.md +14 -0
  702. package/docs/examples/projects/update-service-status.md +15 -0
  703. package/docs/examples/projects/update-session-alerts.md +14 -0
  704. package/docs/examples/projects/update-sms-template.md +16 -0
  705. package/docs/examples/projects/update-smtp.md +22 -0
  706. package/docs/examples/projects/update-team.md +14 -0
  707. package/docs/examples/projects/update-webhook-signature.md +14 -0
  708. package/docs/examples/projects/update-webhook.md +21 -0
  709. package/docs/examples/projects/update.md +23 -0
  710. package/docs/examples/proxy/create-rule.md +15 -0
  711. package/docs/examples/proxy/delete-rule.md +13 -0
  712. package/docs/examples/proxy/get-rule.md +13 -0
  713. package/docs/examples/proxy/list-rules.md +14 -0
  714. package/docs/examples/proxy/update-rule-verification.md +13 -0
  715. package/docs/examples/storage/create-bucket.md +22 -0
  716. package/docs/examples/storage/create-file.md +16 -0
  717. package/docs/examples/storage/delete-bucket.md +13 -0
  718. package/docs/examples/storage/delete-file.md +14 -0
  719. package/docs/examples/storage/get-bucket-usage.md +14 -0
  720. package/docs/examples/storage/get-bucket.md +13 -0
  721. package/docs/examples/storage/get-file-download.md +14 -0
  722. package/docs/examples/storage/get-file-preview.md +25 -0
  723. package/docs/examples/storage/get-file-view.md +14 -0
  724. package/docs/examples/storage/get-file.md +14 -0
  725. package/docs/examples/storage/get-usage.md +13 -0
  726. package/docs/examples/storage/list-buckets.md +14 -0
  727. package/docs/examples/storage/list-files.md +15 -0
  728. package/docs/examples/storage/update-bucket.md +22 -0
  729. package/docs/examples/storage/update-file.md +16 -0
  730. package/docs/examples/teams/create-membership.md +19 -0
  731. package/docs/examples/teams/create.md +15 -0
  732. package/docs/examples/teams/delete-membership.md +14 -0
  733. package/docs/examples/teams/delete.md +13 -0
  734. package/docs/examples/teams/get-membership.md +14 -0
  735. package/docs/examples/teams/get-prefs.md +13 -0
  736. package/docs/examples/teams/get.md +13 -0
  737. package/docs/examples/teams/list-logs.md +14 -0
  738. package/docs/examples/teams/list-memberships.md +15 -0
  739. package/docs/examples/teams/list.md +14 -0
  740. package/docs/examples/teams/update-membership-status.md +16 -0
  741. package/docs/examples/teams/update-membership.md +15 -0
  742. package/docs/examples/teams/update-name.md +14 -0
  743. package/docs/examples/teams/update-prefs.md +14 -0
  744. package/docs/examples/users/create-argon2user.md +16 -0
  745. package/docs/examples/users/create-bcrypt-user.md +16 -0
  746. package/docs/examples/users/create-j-w-t.md +15 -0
  747. package/docs/examples/users/create-m-d5user.md +16 -0
  748. package/docs/examples/users/create-mfa-recovery-codes.md +13 -0
  749. package/docs/examples/users/create-p-h-pass-user.md +16 -0
  750. package/docs/examples/users/create-s-h-a-user.md +17 -0
  751. package/docs/examples/users/create-scrypt-modified-user.md +19 -0
  752. package/docs/examples/users/create-scrypt-user.md +21 -0
  753. package/docs/examples/users/create-session.md +13 -0
  754. package/docs/examples/users/create-target.md +18 -0
  755. package/docs/examples/users/create-token.md +15 -0
  756. package/docs/examples/users/create.md +17 -0
  757. package/docs/examples/users/delete-identity.md +13 -0
  758. package/docs/examples/users/delete-mfa-authenticator.md +14 -0
  759. package/docs/examples/users/delete-session.md +14 -0
  760. package/docs/examples/users/delete-sessions.md +13 -0
  761. package/docs/examples/users/delete-target.md +14 -0
  762. package/docs/examples/users/delete.md +13 -0
  763. package/docs/examples/users/get-mfa-recovery-codes.md +13 -0
  764. package/docs/examples/users/get-prefs.md +13 -0
  765. package/docs/examples/users/get-target.md +14 -0
  766. package/docs/examples/users/get-usage.md +13 -0
  767. package/docs/examples/users/get.md +13 -0
  768. package/docs/examples/users/list-identities.md +14 -0
  769. package/docs/examples/users/list-logs.md +14 -0
  770. package/docs/examples/users/list-memberships.md +13 -0
  771. package/docs/examples/users/list-mfa-factors.md +13 -0
  772. package/docs/examples/users/list-sessions.md +13 -0
  773. package/docs/examples/users/list-targets.md +14 -0
  774. package/docs/examples/users/list.md +14 -0
  775. package/docs/examples/users/update-email-verification.md +14 -0
  776. package/docs/examples/users/update-email.md +14 -0
  777. package/docs/examples/users/update-labels.md +14 -0
  778. package/docs/examples/users/update-mfa-recovery-codes.md +13 -0
  779. package/docs/examples/users/update-mfa.md +14 -0
  780. package/docs/examples/users/update-name.md +14 -0
  781. package/docs/examples/users/update-password.md +14 -0
  782. package/docs/examples/users/update-phone-verification.md +14 -0
  783. package/docs/examples/users/update-phone.md +14 -0
  784. package/docs/examples/users/update-prefs.md +14 -0
  785. package/docs/examples/users/update-status.md +14 -0
  786. package/docs/examples/users/update-target.md +17 -0
  787. package/docs/examples/vcs/create-repository-detection.md +15 -0
  788. package/docs/examples/vcs/create-repository.md +15 -0
  789. package/docs/examples/vcs/delete-installation.md +13 -0
  790. package/docs/examples/vcs/get-installation.md +13 -0
  791. package/docs/examples/vcs/get-repository-contents.md +15 -0
  792. package/docs/examples/vcs/get-repository.md +14 -0
  793. package/docs/examples/vcs/list-installations.md +14 -0
  794. package/docs/examples/vcs/list-repositories.md +14 -0
  795. package/docs/examples/vcs/list-repository-branches.md +14 -0
  796. package/docs/examples/vcs/update-external-deployments.md +15 -0
  797. package/package.json +29 -141
  798. package/publish.sh +4 -0
  799. package/src/client.ts +397 -0
  800. package/src/enums/api-service.ts +13 -0
  801. package/src/enums/api.ts +5 -0
  802. package/src/enums/auth-method.ts +9 -0
  803. package/src/enums/browser.ts +16 -0
  804. package/src/enums/compression.ts +5 -0
  805. package/src/enums/credit-card.ts +18 -0
  806. package/src/enums/database-usage-range.ts +5 -0
  807. package/src/enums/email-template-locale.ts +133 -0
  808. package/src/enums/email-template-type.ts +9 -0
  809. package/src/enums/entities/EntityLimitType.ts +4 -0
  810. package/src/enums/entities/PropertyAttributeName.ts +27 -0
  811. package/src/enums/entities/PropertyCondition.ts +8 -0
  812. package/src/enums/entities/PropertyType.ts +16 -0
  813. package/src/enums/entities/PropertyValueType.ts +6 -0
  814. package/src/enums/entities/RowAccess.ts +2 -0
  815. package/src/enums/entities/ViewFilterCondition.ts +12 -0
  816. package/src/enums/execution-method.ts +8 -0
  817. package/src/enums/flag.ts +197 -0
  818. package/src/enums/function-usage-range.ts +5 -0
  819. package/src/enums/image-format.ts +7 -0
  820. package/src/enums/image-gravity.ts +11 -0
  821. package/src/enums/index-type.ts +5 -0
  822. package/src/enums/messaging-provider-type.ts +5 -0
  823. package/src/enums/name.ts +14 -0
  824. package/src/enums/o-auth-provider copy.ts +41 -0
  825. package/src/enums/password-hash.ts +13 -0
  826. package/src/enums/platform-type.ts +17 -0
  827. package/src/enums/project-usage-range.ts +4 -0
  828. package/src/enums/region.ts +4 -0
  829. package/src/enums/relation-mutate.ts +5 -0
  830. package/src/enums/relationship-type.ts +6 -0
  831. package/src/enums/resource-type.ts +4 -0
  832. package/src/enums/runtime.ts +48 -0
  833. package/src/enums/s-m-t-p-secure.ts +3 -0
  834. package/src/enums/shared/ApplicationLayout.ts +4 -0
  835. package/src/enums/shared/Colors.ts +24 -0
  836. package/src/enums/shared/InputType.ts +6 -0
  837. package/src/enums/shared/Periodicity.ts +7 -0
  838. package/src/enums/shared/SvgIcon.ts +37 -0
  839. package/src/enums/shared/Theme.ts +4 -0
  840. package/src/enums/sms-template-locale.ts +133 -0
  841. package/src/enums/sms-template-type.ts +6 -0
  842. package/src/enums/smtp-encryption.ts +5 -0
  843. package/src/enums/storage-usage-range.ts +5 -0
  844. package/src/enums/subscriptions/PricingModel.ts +14 -0
  845. package/src/enums/subscriptions/SubscriptionBillingPeriod.ts +15 -0
  846. package/src/enums/subscriptions/SubscriptionFeatureLimitType.ts +16 -0
  847. package/src/enums/subscriptions/SubscriptionPriceType.ts +10 -0
  848. package/src/enums/tenants/LinkedAccountStatus.ts +5 -0
  849. package/src/enums/tenants/TenantUserJoined.ts +6 -0
  850. package/src/enums/tenants/TenantUserStatus.ts +6 -0
  851. package/src/enums/tenants/TenantUserType.ts +5 -0
  852. package/src/enums/user-usage-range.ts +5 -0
  853. package/src/getAppcondaClient.ts +75 -0
  854. package/src/getSDKForService.ts +71 -0
  855. package/src/id.ts +47 -0
  856. package/src/index.ts +3 -0
  857. package/src/inputFile.ts +23 -0
  858. package/src/lib/errors.ts +141 -0
  859. package/src/lib/index.ts +0 -0
  860. package/src/lib/types.ts +7 -0
  861. package/src/models.ts +3339 -0
  862. package/src/modules/account/enums/authentication-factor.ts +6 -0
  863. package/src/modules/account/enums/authenticator-type.ts +3 -0
  864. package/src/modules/account/enums/o-auth-provider.ts +41 -0
  865. package/src/modules/account/index.ts +3 -0
  866. package/src/modules/account/schema.ts +8 -0
  867. package/src/modules/account/service.ts +1648 -0
  868. package/src/modules/account/types.ts +426 -0
  869. package/src/modules/accounv1/index.ts +4 -0
  870. package/src/modules/accounv1/schema.ts +50 -0
  871. package/src/modules/accounv1/service.ts +43 -0
  872. package/src/modules/accounv1/types.ts +16 -0
  873. package/src/modules/acl/service.ts +55 -0
  874. package/src/modules/agent/action.ts +66 -0
  875. package/src/modules/agent/index.ts +4 -0
  876. package/src/modules/agent/schema.ts +25 -0
  877. package/src/modules/agent/service.ts +34 -0
  878. package/src/modules/agent/types.ts +15 -0
  879. package/src/modules/ai/index.ts +1 -0
  880. package/src/modules/ai/node/actions.ts +14 -0
  881. package/src/modules/ai/node/index.ts +2 -0
  882. package/src/modules/ai/node/service.ts +18 -0
  883. package/src/modules/bpm/index.ts +3 -0
  884. package/src/modules/bpm/schema.ts +23 -0
  885. package/src/modules/bpm/service.ts +28 -0
  886. package/src/modules/bpm/types.ts +11 -0
  887. package/src/modules/builder/action.ts +234 -0
  888. package/src/modules/builder/index.ts +4 -0
  889. package/src/modules/builder/schema.ts +95 -0
  890. package/src/modules/builder/service.ts +74 -0
  891. package/src/modules/builder/types.ts +68 -0
  892. package/src/modules/datasource/action.ts +189 -0
  893. package/src/modules/datasource/index.ts +4 -0
  894. package/src/modules/datasource/schema.ts +69 -0
  895. package/src/modules/datasource/service.ts +58 -0
  896. package/src/modules/datasource/types.ts +31 -0
  897. package/src/modules/emploid/action.ts +1063 -0
  898. package/src/modules/emploid/index.ts +4 -0
  899. package/src/modules/emploid/schema.ts +405 -0
  900. package/src/modules/emploid/service.ts +295 -0
  901. package/src/modules/emploid/types.ts +132 -0
  902. package/src/modules/google/action.ts +54 -0
  903. package/src/modules/google/index.ts +4 -0
  904. package/src/modules/google/schema.ts +19 -0
  905. package/src/modules/google/service.ts +23 -0
  906. package/src/modules/google/types.ts +15 -0
  907. package/src/modules/hooks/index.ts +5 -0
  908. package/src/modules/hooks/lib/Hooks.ts +103 -0
  909. package/src/modules/hooks/lib/handler.ts +27 -0
  910. package/src/modules/hooks/lib/jobs/index.ts +2 -0
  911. package/src/modules/hooks/lib/jobs/job1.ts +20 -0
  912. package/src/modules/hooks/lib/jobs/log-job.ts +10 -0
  913. package/src/modules/hooks/lib/wait.ts +17 -0
  914. package/src/modules/index.ts +17 -0
  915. package/src/modules/mail/action.ts +22 -0
  916. package/src/modules/mail/index.ts +4 -0
  917. package/src/modules/mail/schema.ts +9 -0
  918. package/src/modules/mail/service.ts +15 -0
  919. package/src/modules/mail/types.ts +11 -0
  920. package/src/modules/notion/action.ts +53 -0
  921. package/src/modules/notion/index.ts +4 -0
  922. package/src/modules/notion/schema.ts +21 -0
  923. package/src/modules/notion/service.ts +26 -0
  924. package/src/modules/notion/types.ts +14 -0
  925. package/src/modules/organization/action.ts +71 -0
  926. package/src/modules/organization/index.ts +4 -0
  927. package/src/modules/organization/schema.ts +23 -0
  928. package/src/modules/organization/service.ts +32 -0
  929. package/src/modules/organization/types.ts +15 -0
  930. package/src/modules/scheduled-job/action.ts +212 -0
  931. package/src/modules/scheduled-job/index.ts +8 -0
  932. package/src/modules/scheduled-job/lib/Schedules.ts +105 -0
  933. package/src/modules/scheduled-job/lib/handler.ts +27 -0
  934. package/src/modules/scheduled-job/lib/jobs/index.ts +2 -0
  935. package/src/modules/scheduled-job/lib/jobs/job1.ts +12 -0
  936. package/src/modules/scheduled-job/lib/wait.ts +17 -0
  937. package/src/modules/scheduled-job/schema.ts +62 -0
  938. package/src/modules/scheduled-job/service.ts +63 -0
  939. package/src/modules/scheduled-job/types.ts +79 -0
  940. package/src/modules/task/action.ts +819 -0
  941. package/src/modules/task/index.ts +4 -0
  942. package/src/modules/task/schema.ts +455 -0
  943. package/src/modules/task/service.ts +268 -0
  944. package/src/modules/task/types.ts +325 -0
  945. package/src/modules/tenant/actions.ts +173 -0
  946. package/src/modules/tenant/index.ts +3 -0
  947. package/src/modules/tenant/schema.ts +32 -0
  948. package/src/modules/tenant/service.ts +43 -0
  949. package/src/modules/tenant/tenant.ts +193 -0
  950. package/src/modules/tenant/types.ts +22 -0
  951. package/src/modules/waitlist/action.ts +93 -0
  952. package/src/modules/waitlist/index.ts +4 -0
  953. package/src/modules/waitlist/schema.ts +24 -0
  954. package/src/modules/waitlist/service.ts +41 -0
  955. package/src/modules/waitlist/types.ts +18 -0
  956. package/src/permission.ts +57 -0
  957. package/src/query.ts +261 -0
  958. package/src/role.ts +100 -0
  959. package/src/service-client.ts +40 -0
  960. package/src/service.ts +30 -0
  961. package/src/services/applets.ts +75 -0
  962. package/src/services/avatars.ts +314 -0
  963. package/src/services/chat-flow.ts +32 -0
  964. package/src/services/community.ts +102 -0
  965. package/src/services/configuration.ts +15 -0
  966. package/src/services/databases.ts +2037 -0
  967. package/src/services/functions.ts +986 -0
  968. package/src/services/graphql.ts +75 -0
  969. package/src/services/health.ts +629 -0
  970. package/src/services/locale.ts +205 -0
  971. package/src/services/messaging.ts +2247 -0
  972. package/src/services/permissions.ts +131 -0
  973. package/src/services/pricing.ts +30 -0
  974. package/src/services/projects.ts +1901 -0
  975. package/src/services/roles.ts +101 -0
  976. package/src/services/schema.ts +65 -0
  977. package/src/services/storage.ts +576 -0
  978. package/src/services/subscription.ts +39 -0
  979. package/src/services/teams.ts +490 -0
  980. package/src/services/tenant-subscription.ts +93 -0
  981. package/src/services/users.ts +1584 -0
  982. package/tsconfig.json +32 -0
  983. package/index.d.ts +0 -3367
  984. package/index.js +0 -407
@@ -0,0 +1,1263 @@
1
+ import { AppcondaException } from '../../client';
2
+ import { Service } from '../../service';
3
+ export class Account {
4
+ constructor(client) {
5
+ this.client = client;
6
+ }
7
+ /**
8
+ * Get account
9
+ *
10
+ * Get the currently logged in user.
11
+ *
12
+ * @throws {AppcondaException}
13
+ * @returns {Promise<Models.User<Preferences>>}
14
+ */
15
+ async get() {
16
+ const apiPath = '/account';
17
+ const payload = {};
18
+ const uri = new URL(this.client.config.endpoint + apiPath);
19
+ const apiHeaders = {
20
+ 'content-type': 'application/json',
21
+ };
22
+ return await this.client.call('get', uri, apiHeaders, payload);
23
+ }
24
+ /**
25
+ * Create account
26
+ *
27
+ * Use this endpoint to allow a new user to register a new account in your project. After the user registration completes successfully, you can use the [/account/verfication](https://appconda.io/docs/references/cloud/client-web/account#createVerification) route to start verifying the user email address. To allow the new user to login to their new account, you need to create a new [account session](https://appconda.io/docs/references/cloud/client-web/account#createEmailSession).
28
+ *
29
+ * @param {string} userId
30
+ * @param {string} email
31
+ * @param {string} password
32
+ * @param {string} name
33
+ * @throws {AppcondaException}
34
+ * @returns {Promise<Models.User<Preferences>>}
35
+ */
36
+ async create(userId, email, password, name) {
37
+ if (typeof userId === 'undefined') {
38
+ throw new AppcondaException('Missing required parameter: "userId"');
39
+ }
40
+ if (typeof email === 'undefined') {
41
+ throw new AppcondaException('Missing required parameter: "email"');
42
+ }
43
+ if (typeof password === 'undefined') {
44
+ throw new AppcondaException('Missing required parameter: "password"');
45
+ }
46
+ const apiPath = '/account';
47
+ const payload = {};
48
+ if (typeof userId !== 'undefined') {
49
+ payload['userId'] = userId;
50
+ }
51
+ if (typeof email !== 'undefined') {
52
+ payload['email'] = email;
53
+ }
54
+ if (typeof password !== 'undefined') {
55
+ payload['password'] = password;
56
+ }
57
+ if (typeof name !== 'undefined') {
58
+ payload['name'] = name;
59
+ }
60
+ const uri = new URL(this.client.config.endpoint + apiPath);
61
+ const apiHeaders = {
62
+ 'content-type': 'application/json',
63
+ };
64
+ return await this.client.call('post', uri, apiHeaders, payload);
65
+ }
66
+ /**
67
+ * Delete account
68
+ *
69
+ * Delete the currently logged in user.
70
+ *
71
+ * @throws {AppcondaException}
72
+ * @returns {Promise<{}>}
73
+ */
74
+ async delete() {
75
+ const apiPath = '/account';
76
+ const payload = {};
77
+ const uri = new URL(this.client.config.endpoint + apiPath);
78
+ const apiHeaders = {
79
+ 'content-type': 'application/json',
80
+ };
81
+ return await this.client.call('delete', uri, apiHeaders, payload);
82
+ }
83
+ /**
84
+ * Update email
85
+ *
86
+ * Update currently logged in user account email address. After changing user address, the user confirmation status will get reset. A new confirmation email is not sent automatically however you can use the send confirmation email endpoint again to send the confirmation email. For security measures, user password is required to complete this request.
87
+ This endpoint can also be used to convert an anonymous account to a normal one, by passing an email address and a new password.
88
+
89
+ *
90
+ * @param {string} email
91
+ * @param {string} password
92
+ * @throws {AppcondaException}
93
+ * @returns {Promise<Models.User<Preferences>>}
94
+ */
95
+ async updateEmail(email, password) {
96
+ if (typeof email === 'undefined') {
97
+ throw new AppcondaException('Missing required parameter: "email"');
98
+ }
99
+ if (typeof password === 'undefined') {
100
+ throw new AppcondaException('Missing required parameter: "password"');
101
+ }
102
+ const apiPath = '/account/email';
103
+ const payload = {};
104
+ if (typeof email !== 'undefined') {
105
+ payload['email'] = email;
106
+ }
107
+ if (typeof password !== 'undefined') {
108
+ payload['password'] = password;
109
+ }
110
+ const uri = new URL(this.client.config.endpoint + apiPath);
111
+ const apiHeaders = {
112
+ 'content-type': 'application/json',
113
+ };
114
+ return await this.client.call('patch', uri, apiHeaders, payload);
115
+ }
116
+ /**
117
+ * List Identities
118
+ *
119
+ * Get the list of identities for the currently logged in user.
120
+ *
121
+ * @param {string[]} queries
122
+ * @throws {AppcondaException}
123
+ * @returns {Promise<IdentityList>}
124
+ */
125
+ async listIdentities(queries) {
126
+ const apiPath = '/account/identities';
127
+ const payload = {};
128
+ if (typeof queries !== 'undefined') {
129
+ payload['queries'] = queries;
130
+ }
131
+ const uri = new URL(this.client.config.endpoint + apiPath);
132
+ const apiHeaders = {
133
+ 'content-type': 'application/json',
134
+ };
135
+ return await this.client.call('get', uri, apiHeaders, payload);
136
+ }
137
+ /**
138
+ * Delete identity
139
+ *
140
+ * Delete an identity by its unique ID.
141
+ *
142
+ * @param {string} identityId
143
+ * @throws {AppcondaException}
144
+ * @returns {Promise<{}>}
145
+ */
146
+ async deleteIdentity(identityId) {
147
+ if (typeof identityId === 'undefined') {
148
+ throw new AppcondaException('Missing required parameter: "identityId"');
149
+ }
150
+ const apiPath = '/account/identities/{identityId}'.replace('{identityId}', identityId);
151
+ const payload = {};
152
+ const uri = new URL(this.client.config.endpoint + apiPath);
153
+ const apiHeaders = {
154
+ 'content-type': 'application/json',
155
+ };
156
+ return await this.client.call('delete', uri, apiHeaders, payload);
157
+ }
158
+ /**
159
+ * Create JWT
160
+ *
161
+ * Use this endpoint to create a JSON Web Token. You can use the resulting JWT to authenticate on behalf of the current user when working with the Appconda server-side API and SDKs. The JWT secret is valid for 15 minutes from its creation and will be invalid if the user will logout in that time frame.
162
+ *
163
+ * @throws {AppcondaException}
164
+ * @returns {Promise<Jwt>}
165
+ */
166
+ async createJWT() {
167
+ const apiPath = '/account/jwts';
168
+ const payload = {};
169
+ const uri = new URL(this.client.config.endpoint + apiPath);
170
+ const apiHeaders = {
171
+ 'content-type': 'application/json',
172
+ };
173
+ return await this.client.call('post', uri, apiHeaders, payload);
174
+ }
175
+ /**
176
+ * List logs
177
+ *
178
+ * Get the list of latest security activity logs for the currently logged in user. Each log returns user IP address, location and date and time of log.
179
+ *
180
+ * @param {string[]} queries
181
+ * @throws {AppcondaException}
182
+ * @returns {Promise<LogList>}
183
+ */
184
+ async listLogs(queries) {
185
+ const apiPath = '/account/logs';
186
+ const payload = {};
187
+ if (typeof queries !== 'undefined') {
188
+ payload['queries'] = queries;
189
+ }
190
+ const uri = new URL(this.client.config.endpoint + apiPath);
191
+ const apiHeaders = {
192
+ 'content-type': 'application/json',
193
+ };
194
+ return await this.client.call('get', uri, apiHeaders, payload);
195
+ }
196
+ /**
197
+ * Update MFA
198
+ *
199
+ * Enable or disable MFA on an account.
200
+ *
201
+ * @param {boolean} mfa
202
+ * @throws {AppcondaException}
203
+ * @returns {Promise<Models.User<Preferences>>}
204
+ */
205
+ async updateMFA(mfa) {
206
+ if (typeof mfa === 'undefined') {
207
+ throw new AppcondaException('Missing required parameter: "mfa"');
208
+ }
209
+ const apiPath = '/account/mfa';
210
+ const payload = {};
211
+ if (typeof mfa !== 'undefined') {
212
+ payload['mfa'] = mfa;
213
+ }
214
+ const uri = new URL(this.client.config.endpoint + apiPath);
215
+ const apiHeaders = {
216
+ 'content-type': 'application/json',
217
+ };
218
+ return await this.client.call('patch', uri, apiHeaders, payload);
219
+ }
220
+ /**
221
+ * Create Authenticator
222
+ *
223
+ * Add an authenticator app to be used as an MFA factor. Verify the authenticator using the [verify authenticator](/docs/references/cloud/client-web/account#updateMfaAuthenticator) method.
224
+ *
225
+ * @param {AuthenticatorType} type
226
+ * @throws {AppcondaException}
227
+ * @returns {Promise<MfaType>}
228
+ */
229
+ async createMfaAuthenticator(type) {
230
+ if (typeof type === 'undefined') {
231
+ throw new AppcondaException('Missing required parameter: "type"');
232
+ }
233
+ const apiPath = '/account/mfa/authenticators/{type}'.replace('{type}', type);
234
+ const payload = {};
235
+ const uri = new URL(this.client.config.endpoint + apiPath);
236
+ const apiHeaders = {
237
+ 'content-type': 'application/json',
238
+ };
239
+ return await this.client.call('post', uri, apiHeaders, payload);
240
+ }
241
+ /**
242
+ * Verify Authenticator
243
+ *
244
+ * Verify an authenticator app after adding it using the [add authenticator](/docs/references/cloud/client-web/account#createMfaAuthenticator) method.
245
+ *
246
+ * @param {AuthenticatorType} type
247
+ * @param {string} otp
248
+ * @throws {AppcondaException}
249
+ * @returns {Promise<Models.User<Preferences>>}
250
+ */
251
+ async updateMfaAuthenticator(type, otp) {
252
+ if (typeof type === 'undefined') {
253
+ throw new AppcondaException('Missing required parameter: "type"');
254
+ }
255
+ if (typeof otp === 'undefined') {
256
+ throw new AppcondaException('Missing required parameter: "otp"');
257
+ }
258
+ const apiPath = '/account/mfa/authenticators/{type}'.replace('{type}', type);
259
+ const payload = {};
260
+ if (typeof otp !== 'undefined') {
261
+ payload['otp'] = otp;
262
+ }
263
+ const uri = new URL(this.client.config.endpoint + apiPath);
264
+ const apiHeaders = {
265
+ 'content-type': 'application/json',
266
+ };
267
+ return await this.client.call('put', uri, apiHeaders, payload);
268
+ }
269
+ /**
270
+ * Delete Authenticator
271
+ *
272
+ * Delete an authenticator for a user by ID.
273
+ *
274
+ * @param {AuthenticatorType} type
275
+ * @throws {AppcondaException}
276
+ * @returns {Promise<{}>}
277
+ */
278
+ async deleteMfaAuthenticator(type) {
279
+ if (typeof type === 'undefined') {
280
+ throw new AppcondaException('Missing required parameter: "type"');
281
+ }
282
+ const apiPath = '/account/mfa/authenticators/{type}'.replace('{type}', type);
283
+ const payload = {};
284
+ const uri = new URL(this.client.config.endpoint + apiPath);
285
+ const apiHeaders = {
286
+ 'content-type': 'application/json',
287
+ };
288
+ return await this.client.call('delete', uri, apiHeaders, payload);
289
+ }
290
+ /**
291
+ * Create MFA Challenge
292
+ *
293
+ * Begin the process of MFA verification after sign-in. Finish the flow with [updateMfaChallenge](/docs/references/cloud/client-web/account#updateMfaChallenge) method.
294
+ *
295
+ * @param {AuthenticationFactor} factor
296
+ * @throws {AppcondaException}
297
+ * @returns {Promise<MfaChallenge>}
298
+ */
299
+ async createMfaChallenge(factor) {
300
+ if (typeof factor === 'undefined') {
301
+ throw new AppcondaException('Missing required parameter: "factor"');
302
+ }
303
+ const apiPath = '/account/mfa/challenge';
304
+ const payload = {};
305
+ if (typeof factor !== 'undefined') {
306
+ payload['factor'] = factor;
307
+ }
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('post', uri, apiHeaders, payload);
313
+ }
314
+ /**
315
+ * Create MFA Challenge (confirmation)
316
+ *
317
+ * Complete the MFA challenge by providing the one-time password. Finish the process of MFA verification by providing the one-time password. To begin the flow, use [createMfaChallenge](/docs/references/cloud/client-web/account#createMfaChallenge) method.
318
+ *
319
+ * @param {string} challengeId
320
+ * @param {string} otp
321
+ * @throws {AppcondaException}
322
+ * @returns {Promise<{}>}
323
+ */
324
+ async updateMfaChallenge(challengeId, otp) {
325
+ if (typeof challengeId === 'undefined') {
326
+ throw new AppcondaException('Missing required parameter: "challengeId"');
327
+ }
328
+ if (typeof otp === 'undefined') {
329
+ throw new AppcondaException('Missing required parameter: "otp"');
330
+ }
331
+ const apiPath = '/account/mfa/challenge';
332
+ const payload = {};
333
+ if (typeof challengeId !== 'undefined') {
334
+ payload['challengeId'] = challengeId;
335
+ }
336
+ if (typeof otp !== 'undefined') {
337
+ payload['otp'] = otp;
338
+ }
339
+ const uri = new URL(this.client.config.endpoint + apiPath);
340
+ const apiHeaders = {
341
+ 'content-type': 'application/json',
342
+ };
343
+ return await this.client.call('put', uri, apiHeaders, payload);
344
+ }
345
+ /**
346
+ * List Factors
347
+ *
348
+ * List the factors available on the account to be used as a MFA challange.
349
+ *
350
+ * @throws {AppcondaException}
351
+ * @returns {Promise<MfaFactors>}
352
+ */
353
+ async listMfaFactors() {
354
+ const apiPath = '/account/mfa/factors';
355
+ const payload = {};
356
+ const uri = new URL(this.client.config.endpoint + apiPath);
357
+ const apiHeaders = {
358
+ 'content-type': 'application/json',
359
+ };
360
+ return await this.client.call('get', uri, apiHeaders, payload);
361
+ }
362
+ /**
363
+ * Get MFA Recovery Codes
364
+ *
365
+ * Get recovery codes that can be used as backup for MFA flow. Before getting codes, they must be generated using [createMfaRecoveryCodes](/docs/references/cloud/client-web/account#createMfaRecoveryCodes) method. An OTP challenge is required to read recovery codes.
366
+ *
367
+ * @throws {AppcondaException}
368
+ * @returns {Promise<MfaRecoveryCodes>}
369
+ */
370
+ async getMfaRecoveryCodes() {
371
+ const apiPath = '/account/mfa/recovery-codes';
372
+ const payload = {};
373
+ const uri = new URL(this.client.config.endpoint + apiPath);
374
+ const apiHeaders = {
375
+ 'content-type': 'application/json',
376
+ };
377
+ return await this.client.call('get', uri, apiHeaders, payload);
378
+ }
379
+ /**
380
+ * Create MFA Recovery Codes
381
+ *
382
+ * Generate recovery codes as backup for MFA flow. It&#039;s recommended to generate and show then immediately after user successfully adds their authehticator. Recovery codes can be used as a MFA verification type in [createMfaChallenge](/docs/references/cloud/client-web/account#createMfaChallenge) method.
383
+ *
384
+ * @throws {AppcondaException}
385
+ * @returns {Promise<Models.MfaRecoveryCodes>}
386
+ */
387
+ async createMfaRecoveryCodes() {
388
+ const apiPath = '/account/mfa/recovery-codes';
389
+ const payload = {};
390
+ const uri = new URL(this.client.config.endpoint + apiPath);
391
+ const apiHeaders = {
392
+ 'content-type': 'application/json',
393
+ };
394
+ return await this.client.call('post', uri, apiHeaders, payload);
395
+ }
396
+ /**
397
+ * Regenerate MFA Recovery Codes
398
+ *
399
+ * Regenerate recovery codes that can be used as backup for MFA flow. Before regenerating codes, they must be first generated using [createMfaRecoveryCodes](/docs/references/cloud/client-web/account#createMfaRecoveryCodes) method. An OTP challenge is required to regenreate recovery codes.
400
+ *
401
+ * @throws {AppcondaException}
402
+ * @returns {Promise<Models.MfaRecoveryCodes>}
403
+ */
404
+ async updateMfaRecoveryCodes() {
405
+ const apiPath = '/account/mfa/recovery-codes';
406
+ const payload = {};
407
+ const uri = new URL(this.client.config.endpoint + apiPath);
408
+ const apiHeaders = {
409
+ 'content-type': 'application/json',
410
+ };
411
+ return await this.client.call('patch', uri, apiHeaders, payload);
412
+ }
413
+ /**
414
+ * Update name
415
+ *
416
+ * Update currently logged in user account name.
417
+ *
418
+ * @param {string} name
419
+ * @throws {AppcondaException}
420
+ * @returns {Promise<Models.User<Preferences>>}
421
+ */
422
+ async updateName(name) {
423
+ if (typeof name === 'undefined') {
424
+ throw new AppcondaException('Missing required parameter: "name"');
425
+ }
426
+ const apiPath = '/account/name';
427
+ const payload = {};
428
+ if (typeof name !== 'undefined') {
429
+ payload['name'] = name;
430
+ }
431
+ const uri = new URL(this.client.config.endpoint + apiPath);
432
+ const apiHeaders = {
433
+ 'content-type': 'application/json',
434
+ };
435
+ return await this.client.call('patch', uri, apiHeaders, payload);
436
+ }
437
+ /**
438
+ * Update password
439
+ *
440
+ * Update currently logged in user password. For validation, user is required to pass in the new password, and the old password. For users created with OAuth, Team Invites and Magic URL, oldPassword is optional.
441
+ *
442
+ * @param {string} password
443
+ * @param {string} oldPassword
444
+ * @throws {AppcondaException}
445
+ * @returns {Promise<Models.User<Preferences>>}
446
+ */
447
+ async updatePassword(password, oldPassword) {
448
+ if (typeof password === 'undefined') {
449
+ throw new AppcondaException('Missing required parameter: "password"');
450
+ }
451
+ const apiPath = '/account/password';
452
+ const payload = {};
453
+ if (typeof password !== 'undefined') {
454
+ payload['password'] = password;
455
+ }
456
+ if (typeof oldPassword !== 'undefined') {
457
+ payload['oldPassword'] = oldPassword;
458
+ }
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('patch', uri, apiHeaders, payload);
464
+ }
465
+ /**
466
+ * Update phone
467
+ *
468
+ * Update the currently logged in user&#039;s phone number. After updating the phone number, the phone verification status will be reset. A confirmation SMS is not sent automatically, however you can use the [POST /account/verification/phone](https://appconda.io/docs/references/cloud/client-web/account#createPhoneVerification) endpoint to send a confirmation SMS.
469
+ *
470
+ * @param {string} phone
471
+ * @param {string} password
472
+ * @throws {AppcondaException}
473
+ * @returns {Promise<Models.User<Preferences>>}
474
+ */
475
+ async updatePhone(phone, password) {
476
+ if (typeof phone === 'undefined') {
477
+ throw new AppcondaException('Missing required parameter: "phone"');
478
+ }
479
+ if (typeof password === 'undefined') {
480
+ throw new AppcondaException('Missing required parameter: "password"');
481
+ }
482
+ const apiPath = '/account/phone';
483
+ const payload = {};
484
+ if (typeof phone !== 'undefined') {
485
+ payload['phone'] = phone;
486
+ }
487
+ if (typeof password !== 'undefined') {
488
+ payload['password'] = password;
489
+ }
490
+ const uri = new URL(this.client.config.endpoint + apiPath);
491
+ const apiHeaders = {
492
+ 'content-type': 'application/json',
493
+ };
494
+ return await this.client.call('patch', uri, apiHeaders, payload);
495
+ }
496
+ /**
497
+ * Get account preferences
498
+ *
499
+ * Get the preferences as a key-value object for the currently logged in user.
500
+ *
501
+ * @throws {AppcondaException}
502
+ * @returns {Promise<Preferences>}
503
+ */
504
+ async getPrefs() {
505
+ const apiPath = '/account/prefs';
506
+ const payload = {};
507
+ const uri = new URL(this.client.config.endpoint + apiPath);
508
+ const apiHeaders = {
509
+ 'content-type': 'application/json',
510
+ };
511
+ return await this.client.call('get', uri, apiHeaders, payload);
512
+ }
513
+ /**
514
+ * Update preferences
515
+ *
516
+ * Update currently logged in user account preferences. The object you pass is stored as is, and replaces any previous value. The maximum allowed prefs size is 64kB and throws error if exceeded.
517
+ *
518
+ * @param {Partial<Preferences>} prefs
519
+ * @throws {AppcondaException}
520
+ * @returns {Promise<Models.User<Preferences>>}
521
+ */
522
+ async updatePrefs(prefs) {
523
+ if (typeof prefs === 'undefined') {
524
+ throw new AppcondaException('Missing required parameter: "prefs"');
525
+ }
526
+ const apiPath = '/account/prefs';
527
+ const payload = {};
528
+ if (typeof prefs !== 'undefined') {
529
+ payload['prefs'] = prefs;
530
+ }
531
+ const uri = new URL(this.client.config.endpoint + apiPath);
532
+ const apiHeaders = {
533
+ 'content-type': 'application/json',
534
+ };
535
+ return await this.client.call('patch', uri, apiHeaders, payload);
536
+ }
537
+ /**
538
+ * Create password recovery
539
+ *
540
+ * Sends the user an email with a temporary secret key for password reset. When the user clicks the confirmation link he is redirected back to your app password reset URL with the secret key and email address values attached to the URL query string. Use the query string params to submit a request to the [PUT /account/recovery](https://appconda.io/docs/references/cloud/client-web/account#updateRecovery) endpoint to complete the process. The verification link sent to the user&#039;s email address is valid for 1 hour.
541
+ *
542
+ * @param {string} email
543
+ * @param {string} url
544
+ * @throws {AppcondaException}
545
+ * @returns {Promise<Token>}
546
+ */
547
+ async createRecovery(email, url) {
548
+ if (typeof email === 'undefined') {
549
+ throw new AppcondaException('Missing required parameter: "email"');
550
+ }
551
+ if (typeof url === 'undefined') {
552
+ throw new AppcondaException('Missing required parameter: "url"');
553
+ }
554
+ const apiPath = '/account/recovery';
555
+ const payload = {};
556
+ if (typeof email !== 'undefined') {
557
+ payload['email'] = email;
558
+ }
559
+ if (typeof url !== 'undefined') {
560
+ payload['url'] = url;
561
+ }
562
+ const uri = new URL(this.client.config.endpoint + apiPath);
563
+ const apiHeaders = {
564
+ 'content-type': 'application/json',
565
+ };
566
+ return await this.client.call('post', uri, apiHeaders, payload);
567
+ }
568
+ /**
569
+ * Create password recovery (confirmation)
570
+ *
571
+ * Use this endpoint to complete the user account password reset. Both the **userId** and **secret** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the [POST /account/recovery](https://appconda.io/docs/references/cloud/client-web/account#createRecovery) endpoint.
572
+
573
+ Please note that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.
574
+ *
575
+ * @param {string} userId
576
+ * @param {string} secret
577
+ * @param {string} password
578
+ * @throws {AppcondaException}
579
+ * @returns {Promise<Models.Token>}
580
+ */
581
+ async updateRecovery(userId, secret, password) {
582
+ if (typeof userId === 'undefined') {
583
+ throw new AppcondaException('Missing required parameter: "userId"');
584
+ }
585
+ if (typeof secret === 'undefined') {
586
+ throw new AppcondaException('Missing required parameter: "secret"');
587
+ }
588
+ if (typeof password === 'undefined') {
589
+ throw new AppcondaException('Missing required parameter: "password"');
590
+ }
591
+ const apiPath = '/account/recovery';
592
+ const payload = {};
593
+ if (typeof userId !== 'undefined') {
594
+ payload['userId'] = userId;
595
+ }
596
+ if (typeof secret !== 'undefined') {
597
+ payload['secret'] = secret;
598
+ }
599
+ if (typeof password !== 'undefined') {
600
+ payload['password'] = password;
601
+ }
602
+ const uri = new URL(this.client.config.endpoint + apiPath);
603
+ const apiHeaders = {
604
+ 'content-type': 'application/json',
605
+ };
606
+ return await this.client.call('put', uri, apiHeaders, payload);
607
+ }
608
+ /**
609
+ * List sessions
610
+ *
611
+ * Get the list of active sessions across different devices for the currently logged in user.
612
+ *
613
+ * @throws {AppcondaException}
614
+ * @returns {Promise<SessionList>}
615
+ */
616
+ async listSessions() {
617
+ const apiPath = '/account/sessions';
618
+ const payload = {};
619
+ const uri = new URL(this.client.config.endpoint + apiPath);
620
+ const apiHeaders = {
621
+ 'content-type': 'application/json',
622
+ };
623
+ return await this.client.call('get', uri, apiHeaders, payload);
624
+ }
625
+ /**
626
+ * Delete sessions
627
+ *
628
+ * Delete all sessions from the user account and remove any sessions cookies from the end client.
629
+ *
630
+ * @throws {AppcondaException}
631
+ * @returns {Promise<{}>}
632
+ */
633
+ async deleteSessions() {
634
+ const apiPath = '/account/sessions';
635
+ const payload = {};
636
+ const uri = new URL(this.client.config.endpoint + apiPath);
637
+ const apiHeaders = {
638
+ 'content-type': 'application/json',
639
+ };
640
+ return await this.client.call('delete', uri, apiHeaders, payload);
641
+ }
642
+ /**
643
+ * Create anonymous session
644
+ *
645
+ * Use this endpoint to allow a new user to register an anonymous account in your project. This route will also create a new session for the user. To allow the new user to convert an anonymous account to a normal account, you need to update its [email and password](https://appconda.io/docs/references/cloud/client-web/account#updateEmail) or create an [OAuth2 session](https://appconda.io/docs/references/cloud/client-web/account#CreateOAuth2Session).
646
+ *
647
+ * @throws {AppcondaException}
648
+ * @returns {Promise<Models.Session>}
649
+ */
650
+ async createAnonymousSession() {
651
+ const apiPath = '/account/sessions/anonymous';
652
+ const payload = {};
653
+ const uri = new URL(this.client.config.endpoint + apiPath);
654
+ const apiHeaders = {
655
+ 'content-type': 'application/json',
656
+ };
657
+ return await this.client.call('post', uri, apiHeaders, payload);
658
+ }
659
+ /**
660
+ * Create email password session
661
+ *
662
+ * Allow the user to login into their account by providing a valid email and password combination. This route will create a new session for the user.
663
+
664
+ A user is limited to 10 active sessions at a time by default. [Learn more about session limits](https://appconda.io/docs/authentication-security#limits).
665
+ *
666
+ * @param {string} email
667
+ * @param {string} password
668
+ * @throws {AppcondaException}
669
+ * @returns {Promise<Session>}
670
+ */
671
+ async createEmailPasswordSession(email, password) {
672
+ if (typeof email === 'undefined') {
673
+ throw new AppcondaException('Missing required parameter: "email"');
674
+ }
675
+ if (typeof password === 'undefined') {
676
+ throw new AppcondaException('Missing required parameter: "password"');
677
+ }
678
+ const apiPath = '/account/sessions/email';
679
+ const payload = {};
680
+ if (typeof email !== 'undefined') {
681
+ payload['email'] = email;
682
+ }
683
+ if (typeof password !== 'undefined') {
684
+ payload['password'] = password;
685
+ }
686
+ const uri = new URL(this.client.config.endpoint + apiPath);
687
+ const apiHeaders = {
688
+ 'content-type': 'application/json',
689
+ };
690
+ return await this.client.call('post', uri, apiHeaders, payload);
691
+ }
692
+ /**
693
+ * Update magic URL session
694
+ *
695
+ * Use this endpoint to create a session from token. Provide the **userId** and **secret** parameters from the successful response of authentication flows initiated by token creation. For example, magic URL and phone login.
696
+ *
697
+ * @param {string} userId
698
+ * @param {string} secret
699
+ * @throws {AppcondaException}
700
+ * @returns {Promise<Models.Session>}
701
+ */
702
+ async updateMagicURLSession(userId, secret) {
703
+ if (typeof userId === 'undefined') {
704
+ throw new AppcondaException('Missing required parameter: "userId"');
705
+ }
706
+ if (typeof secret === 'undefined') {
707
+ throw new AppcondaException('Missing required parameter: "secret"');
708
+ }
709
+ const apiPath = '/account/sessions/magic-url';
710
+ const payload = {};
711
+ if (typeof userId !== 'undefined') {
712
+ payload['userId'] = userId;
713
+ }
714
+ if (typeof secret !== 'undefined') {
715
+ payload['secret'] = secret;
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('put', uri, apiHeaders, payload);
722
+ }
723
+ /**
724
+ * Create OAuth2 session
725
+ *
726
+ * Allow the user to login to their account using the OAuth2 provider of their choice. Each OAuth2 provider should be enabled from the Appconda console first. Use the success and failure arguments to provide a redirect URL&#039;s back to your app when login is completed.
727
+
728
+ If there is already an active session, the new session will be attached to the logged-in account. If there are no active sessions, the server will attempt to look for a user with the same email address as the email received from the OAuth2 provider and attach the new session to the existing user. If no matching user is found - the server will create a new user.
729
+
730
+ A user is limited to 10 active sessions at a time by default. [Learn more about session limits](https://appconda.io/docs/authentication-security#limits).
731
+
732
+ *
733
+ * @param {OAuthProvider} provider
734
+ * @param {string} success
735
+ * @param {string} failure
736
+ * @param {string[]} scopes
737
+ * @throws {AppcondaException}
738
+ * @returns {Promise<void | string>}
739
+ */
740
+ async createOAuth2Session(provider, success, failure, scopes) {
741
+ if (typeof provider === 'undefined') {
742
+ throw new AppcondaException('Missing required parameter: "provider"');
743
+ }
744
+ const apiPath = '/account/sessions/oauth2/{provider}'.replace('{provider}', provider);
745
+ const payload = {};
746
+ if (typeof success !== 'undefined') {
747
+ payload['success'] = success;
748
+ }
749
+ if (typeof failure !== 'undefined') {
750
+ payload['failure'] = failure;
751
+ }
752
+ if (typeof scopes !== 'undefined') {
753
+ payload['scopes'] = scopes;
754
+ }
755
+ const uri = new URL(this.client.config.endpoint + apiPath);
756
+ const apiHeaders = {
757
+ 'content-type': 'application/json',
758
+ };
759
+ payload['project'] = this.client.config.project;
760
+ for (const [key, value] of Object.entries(Service.flatten(payload))) {
761
+ uri.searchParams.append(key, value);
762
+ }
763
+ if (typeof window !== 'undefined' && window?.location) {
764
+ window.location.href = uri.toString();
765
+ return;
766
+ }
767
+ else {
768
+ return uri.toString();
769
+ }
770
+ }
771
+ /**
772
+ * Update phone session
773
+ *
774
+ * Use this endpoint to create a session from token. Provide the **userId** and **secret** parameters from the successful response of authentication flows initiated by token creation. For example, magic URL and phone login.
775
+ *
776
+ * @param {string} userId
777
+ * @param {string} secret
778
+ * @throws {AppcondaException}
779
+ * @returns {Promise<Models.Session>}
780
+ */
781
+ async updatePhoneSession(userId, secret) {
782
+ if (typeof userId === 'undefined') {
783
+ throw new AppcondaException('Missing required parameter: "userId"');
784
+ }
785
+ if (typeof secret === 'undefined') {
786
+ throw new AppcondaException('Missing required parameter: "secret"');
787
+ }
788
+ const apiPath = '/account/sessions/phone';
789
+ const payload = {};
790
+ if (typeof userId !== 'undefined') {
791
+ payload['userId'] = userId;
792
+ }
793
+ if (typeof secret !== 'undefined') {
794
+ payload['secret'] = secret;
795
+ }
796
+ const uri = new URL(this.client.config.endpoint + apiPath);
797
+ const apiHeaders = {
798
+ 'content-type': 'application/json',
799
+ };
800
+ return await this.client.call('put', uri, apiHeaders, payload);
801
+ }
802
+ /**
803
+ * Create session
804
+ *
805
+ * Use this endpoint to create a session from token. Provide the **userId** and **secret** parameters from the successful response of authentication flows initiated by token creation. For example, magic URL and phone login.
806
+ *
807
+ * @param {string} userId
808
+ * @param {string} secret
809
+ * @throws {AppcondaException}
810
+ * @returns {Promise<Models.Session>}
811
+ */
812
+ async createSession(userId, secret) {
813
+ if (typeof userId === 'undefined') {
814
+ throw new AppcondaException('Missing required parameter: "userId"');
815
+ }
816
+ if (typeof secret === 'undefined') {
817
+ throw new AppcondaException('Missing required parameter: "secret"');
818
+ }
819
+ const apiPath = '/account/sessions/token';
820
+ const payload = {};
821
+ if (typeof userId !== 'undefined') {
822
+ payload['userId'] = userId;
823
+ }
824
+ if (typeof secret !== 'undefined') {
825
+ payload['secret'] = secret;
826
+ }
827
+ const uri = new URL(this.client.config.endpoint + apiPath);
828
+ const apiHeaders = {
829
+ 'content-type': 'application/json',
830
+ };
831
+ return await this.client.call('post', uri, apiHeaders, payload);
832
+ }
833
+ /**
834
+ * Get session
835
+ *
836
+ * Use this endpoint to get a logged in user&#039;s session using a Session ID. Inputting &#039;current&#039; will return the current session being used.
837
+ *
838
+ * @param {string} sessionId
839
+ * @throws {AppcondaException}
840
+ * @returns {Promise<Models.Session>}
841
+ */
842
+ async getSession(sessionId) {
843
+ if (typeof sessionId === 'undefined') {
844
+ throw new AppcondaException('Missing required parameter: "sessionId"');
845
+ }
846
+ const apiPath = '/account/sessions/{sessionId}'.replace('{sessionId}', sessionId);
847
+ const payload = {};
848
+ const uri = new URL(this.client.config.endpoint + apiPath);
849
+ const apiHeaders = {
850
+ 'content-type': 'application/json',
851
+ };
852
+ return await this.client.call('get', uri, apiHeaders, payload);
853
+ }
854
+ /**
855
+ * Update session
856
+ *
857
+ * Use this endpoint to extend a session&#039;s length. Extending a session is useful when session expiry is short. If the session was created using an OAuth provider, this endpoint refreshes the access token from the provider.
858
+ *
859
+ * @param {string} sessionId
860
+ * @throws {AppcondaException}
861
+ * @returns {Promise<Models.Session>}
862
+ */
863
+ async updateSession(sessionId) {
864
+ if (typeof sessionId === 'undefined') {
865
+ throw new AppcondaException('Missing required parameter: "sessionId"');
866
+ }
867
+ const apiPath = '/account/sessions/{sessionId}'.replace('{sessionId}', sessionId);
868
+ const payload = {};
869
+ const uri = new URL(this.client.config.endpoint + apiPath);
870
+ const apiHeaders = {
871
+ 'content-type': 'application/json',
872
+ };
873
+ return await this.client.call('patch', uri, apiHeaders, payload);
874
+ }
875
+ /**
876
+ * Delete session
877
+ *
878
+ * Logout the user. Use &#039;current&#039; as the session ID to logout on this device, use a session ID to logout on another device. If you&#039;re looking to logout the user on all devices, use [Delete Sessions](https://appconda.io/docs/references/cloud/client-web/account#deleteSessions) instead.
879
+ *
880
+ * @param {string} sessionId
881
+ * @throws {AppcondaException}
882
+ * @returns {Promise<{}>}
883
+ */
884
+ async deleteSession(sessionId) {
885
+ if (typeof sessionId === 'undefined') {
886
+ throw new AppcondaException('Missing required parameter: "sessionId"');
887
+ }
888
+ const apiPath = '/account/sessions/{sessionId}'.replace('{sessionId}', sessionId);
889
+ const payload = {};
890
+ const uri = new URL(this.client.config.endpoint + apiPath);
891
+ const apiHeaders = {
892
+ 'content-type': 'application/json',
893
+ };
894
+ return await this.client.call('delete', uri, apiHeaders, payload);
895
+ }
896
+ /**
897
+ * Update status
898
+ *
899
+ * Block the currently logged in user account. Behind the scene, the user record is not deleted but permanently blocked from any access. To completely delete a user, use the Users API instead.
900
+ *
901
+ * @throws {AppcondaException}
902
+ * @returns {Promise<Models.User<Preferences>>}
903
+ */
904
+ async updateStatus() {
905
+ const apiPath = '/account/status';
906
+ const payload = {};
907
+ const uri = new URL(this.client.config.endpoint + apiPath);
908
+ const apiHeaders = {
909
+ 'content-type': 'application/json',
910
+ };
911
+ return await this.client.call('patch', uri, apiHeaders, payload);
912
+ }
913
+ /**
914
+ * Create push target
915
+ *
916
+ *
917
+ * @param {string} targetId
918
+ * @param {string} identifier
919
+ * @param {string} providerId
920
+ * @throws {AppcondaException}
921
+ * @returns {Promise<Target>}
922
+ */
923
+ async createPushTarget(targetId, identifier, providerId) {
924
+ if (typeof targetId === 'undefined') {
925
+ throw new AppcondaException('Missing required parameter: "targetId"');
926
+ }
927
+ if (typeof identifier === 'undefined') {
928
+ throw new AppcondaException('Missing required parameter: "identifier"');
929
+ }
930
+ const apiPath = '/account/targets/push';
931
+ const payload = {};
932
+ if (typeof targetId !== 'undefined') {
933
+ payload['targetId'] = targetId;
934
+ }
935
+ if (typeof identifier !== 'undefined') {
936
+ payload['identifier'] = identifier;
937
+ }
938
+ if (typeof providerId !== 'undefined') {
939
+ payload['providerId'] = providerId;
940
+ }
941
+ const uri = new URL(this.client.config.endpoint + apiPath);
942
+ const apiHeaders = {
943
+ 'content-type': 'application/json',
944
+ };
945
+ return await this.client.call('post', uri, apiHeaders, payload);
946
+ }
947
+ /**
948
+ * Update push target
949
+ *
950
+ *
951
+ * @param {string} targetId
952
+ * @param {string} identifier
953
+ * @throws {AppcondaException}
954
+ * @returns {Promise<Target>}
955
+ */
956
+ async updatePushTarget(targetId, identifier) {
957
+ if (typeof targetId === 'undefined') {
958
+ throw new AppcondaException('Missing required parameter: "targetId"');
959
+ }
960
+ if (typeof identifier === 'undefined') {
961
+ throw new AppcondaException('Missing required parameter: "identifier"');
962
+ }
963
+ const apiPath = '/account/targets/{targetId}/push'.replace('{targetId}', targetId);
964
+ const payload = {};
965
+ if (typeof identifier !== 'undefined') {
966
+ payload['identifier'] = identifier;
967
+ }
968
+ const uri = new URL(this.client.config.endpoint + apiPath);
969
+ const apiHeaders = {
970
+ 'content-type': 'application/json',
971
+ };
972
+ return await this.client.call('put', uri, apiHeaders, payload);
973
+ }
974
+ /**
975
+ * Delete push target
976
+ *
977
+ *
978
+ * @param {string} targetId
979
+ * @throws {AppcondaException}
980
+ * @returns {Promise<{}>}
981
+ */
982
+ async deletePushTarget(targetId) {
983
+ if (typeof targetId === 'undefined') {
984
+ throw new AppcondaException('Missing required parameter: "targetId"');
985
+ }
986
+ const apiPath = '/account/targets/{targetId}/push'.replace('{targetId}', targetId);
987
+ const payload = {};
988
+ const uri = new URL(this.client.config.endpoint + apiPath);
989
+ const apiHeaders = {
990
+ 'content-type': 'application/json',
991
+ };
992
+ return await this.client.call('delete', uri, apiHeaders, payload);
993
+ }
994
+ /**
995
+ * Create email token (OTP)
996
+ *
997
+ * Sends the user an email with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST /v1/account/sessions/token](https://appconda.io/docs/references/cloud/client-web/account#createSession) endpoint to complete the login process. The secret sent to the user&#039;s email is valid for 15 minutes.
998
+
999
+ A user is limited to 10 active sessions at a time by default. [Learn more about session limits](https://appconda.io/docs/authentication-security#limits).
1000
+ *
1001
+ * @param {string} userId
1002
+ * @param {string} email
1003
+ * @param {boolean} phrase
1004
+ * @throws {AppcondaException}
1005
+ * @returns {Promise<Models.Token>}
1006
+ */
1007
+ async createEmailToken(userId, email, phrase) {
1008
+ if (typeof userId === 'undefined') {
1009
+ throw new AppcondaException('Missing required parameter: "userId"');
1010
+ }
1011
+ if (typeof email === 'undefined') {
1012
+ throw new AppcondaException('Missing required parameter: "email"');
1013
+ }
1014
+ const apiPath = '/account/tokens/email';
1015
+ const payload = {};
1016
+ if (typeof userId !== 'undefined') {
1017
+ payload['userId'] = userId;
1018
+ }
1019
+ if (typeof email !== 'undefined') {
1020
+ payload['email'] = email;
1021
+ }
1022
+ if (typeof phrase !== 'undefined') {
1023
+ payload['phrase'] = phrase;
1024
+ }
1025
+ const uri = new URL(this.client.config.endpoint + apiPath);
1026
+ const apiHeaders = {
1027
+ 'content-type': 'application/json',
1028
+ };
1029
+ return await this.client.call('post', uri, apiHeaders, payload);
1030
+ }
1031
+ /**
1032
+ * Create magic URL token
1033
+ *
1034
+ * Sends the user an email with a secret key for creating a session. If the provided user ID has not been registered, a new user will be created. When the user clicks the link in the email, the user is redirected back to the URL you provided with the secret key and userId values attached to the URL query string. Use the query string parameters to submit a request to the [POST /v1/account/sessions/token](https://appconda.io/docs/references/cloud/client-web/account#createSession) endpoint to complete the login process. The link sent to the user&#039;s email address is valid for 1 hour. If you are on a mobile device you can leave the URL parameter empty, so that the login completion will be handled by your Appconda instance by default.
1035
+
1036
+ A user is limited to 10 active sessions at a time by default. [Learn more about session limits](https://appconda.io/docs/authentication-security#limits).
1037
+
1038
+ *
1039
+ * @param {string} userId
1040
+ * @param {string} email
1041
+ * @param {string} url
1042
+ * @param {boolean} phrase
1043
+ * @throws {AppcondaException}
1044
+ * @returns {Promise<Models.Token>}
1045
+ */
1046
+ async createMagicURLToken(userId, email, url, phrase) {
1047
+ if (typeof userId === 'undefined') {
1048
+ throw new AppcondaException('Missing required parameter: "userId"');
1049
+ }
1050
+ if (typeof email === 'undefined') {
1051
+ throw new AppcondaException('Missing required parameter: "email"');
1052
+ }
1053
+ const apiPath = '/account/tokens/magic-url';
1054
+ const payload = {};
1055
+ if (typeof userId !== 'undefined') {
1056
+ payload['userId'] = userId;
1057
+ }
1058
+ if (typeof email !== 'undefined') {
1059
+ payload['email'] = email;
1060
+ }
1061
+ if (typeof url !== 'undefined') {
1062
+ payload['url'] = url;
1063
+ }
1064
+ if (typeof phrase !== 'undefined') {
1065
+ payload['phrase'] = phrase;
1066
+ }
1067
+ const uri = new URL(this.client.config.endpoint + apiPath);
1068
+ const apiHeaders = {
1069
+ 'content-type': 'application/json',
1070
+ };
1071
+ return await this.client.call('post', uri, apiHeaders, payload);
1072
+ }
1073
+ /**
1074
+ * Create OAuth2 token
1075
+ *
1076
+ * Allow the user to login to their account using the OAuth2 provider of their choice. Each OAuth2 provider should be enabled from the Appconda console first. Use the success and failure arguments to provide a redirect URL&#039;s back to your app when login is completed.
1077
+
1078
+ If authentication succeeds, `userId` and `secret` of a token will be appended to the success URL as query parameters. These can be used to create a new session using the [Create session](https://appconda.io/docs/references/cloud/client-web/account#createSession) endpoint.
1079
+
1080
+ A user is limited to 10 active sessions at a time by default. [Learn more about session limits](https://appconda.io/docs/authentication-security#limits).
1081
+ *
1082
+ * @param {OAuthProvider} provider
1083
+ * @param {string} success
1084
+ * @param {string} failure
1085
+ * @param {string[]} scopes
1086
+ * @throws {AppcondaException}
1087
+ * @returns {Promise<void | string>}
1088
+ */
1089
+ async createOAuth2Token(provider, success, failure, scopes) {
1090
+ if (typeof provider === 'undefined') {
1091
+ throw new AppcondaException('Missing required parameter: "provider"');
1092
+ }
1093
+ const apiPath = '/account/tokens/oauth2/{provider}'.replace('{provider}', provider);
1094
+ const payload = {};
1095
+ if (typeof success !== 'undefined') {
1096
+ payload['success'] = success;
1097
+ }
1098
+ if (typeof failure !== 'undefined') {
1099
+ payload['failure'] = failure;
1100
+ }
1101
+ if (typeof scopes !== 'undefined') {
1102
+ payload['scopes'] = scopes;
1103
+ }
1104
+ const uri = new URL(this.client.config.endpoint + apiPath);
1105
+ const apiHeaders = {
1106
+ 'content-type': 'application/json',
1107
+ };
1108
+ payload['project'] = this.client.config.project;
1109
+ for (const [key, value] of Object.entries(Service.flatten(payload))) {
1110
+ uri.searchParams.append(key, value);
1111
+ }
1112
+ if (typeof window !== 'undefined' && window?.location) {
1113
+ window.location.href = uri.toString();
1114
+ return;
1115
+ }
1116
+ else {
1117
+ return uri.toString();
1118
+ }
1119
+ }
1120
+ /**
1121
+ * Create phone token
1122
+ *
1123
+ * Sends the user an SMS with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST /v1/account/sessions/token](https://appconda.io/docs/references/cloud/client-web/account#createSession) endpoint to complete the login process. The secret sent to the user&#039;s phone is valid for 15 minutes.
1124
+
1125
+ A user is limited to 10 active sessions at a time by default. [Learn more about session limits](https://appconda.io/docs/authentication-security#limits).
1126
+ *
1127
+ * @param {string} userId
1128
+ * @param {string} phone
1129
+ * @throws {AppcondaException}
1130
+ * @returns {Promise<Models.Token>}
1131
+ */
1132
+ async createPhoneToken(userId, phone) {
1133
+ if (typeof userId === 'undefined') {
1134
+ throw new AppcondaException('Missing required parameter: "userId"');
1135
+ }
1136
+ if (typeof phone === 'undefined') {
1137
+ throw new AppcondaException('Missing required parameter: "phone"');
1138
+ }
1139
+ const apiPath = '/account/tokens/phone';
1140
+ const payload = {};
1141
+ if (typeof userId !== 'undefined') {
1142
+ payload['userId'] = userId;
1143
+ }
1144
+ if (typeof phone !== 'undefined') {
1145
+ payload['phone'] = phone;
1146
+ }
1147
+ const uri = new URL(this.client.config.endpoint + apiPath);
1148
+ const apiHeaders = {
1149
+ 'content-type': 'application/json',
1150
+ };
1151
+ return await this.client.call('post', uri, apiHeaders, payload);
1152
+ }
1153
+ /**
1154
+ * Create email verification
1155
+ *
1156
+ * Use this endpoint to send a verification message to your user email address to confirm they are the valid owners of that address. Both the **userId** and **secret** arguments will be passed as query parameters to the URL you have provided to be attached to the verification email. The provided URL should redirect the user back to your app and allow you to complete the verification process by verifying both the **userId** and **secret** parameters. Learn more about how to [complete the verification process](https://appconda.io/docs/references/cloud/client-web/account#updateVerification). The verification link sent to the user&#039;s email address is valid for 7 days.
1157
+
1158
+ Please note that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md), the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.
1159
+
1160
+ *
1161
+ * @param {string} url
1162
+ * @throws {AppcondaException}
1163
+ * @returns {Promise<Models.Token>}
1164
+ */
1165
+ async createVerification(url, body) {
1166
+ if (typeof url === 'undefined') {
1167
+ throw new AppcondaException('Missing required parameter: "url"');
1168
+ }
1169
+ const apiPath = '/account/verification';
1170
+ const payload = {};
1171
+ if (typeof url !== 'undefined') {
1172
+ payload['url'] = url;
1173
+ }
1174
+ if (typeof body !== 'undefined') {
1175
+ payload['body'] = body;
1176
+ }
1177
+ const uri = new URL(this.client.config.endpoint + apiPath);
1178
+ const apiHeaders = {
1179
+ 'content-type': 'application/json',
1180
+ };
1181
+ return await this.client.call('post', uri, apiHeaders, payload);
1182
+ }
1183
+ /**
1184
+ * Create email verification (confirmation)
1185
+ *
1186
+ * Use this endpoint to complete the user email verification process. Use both the **userId** and **secret** parameters that were attached to your app URL to verify the user email ownership. If confirmed this route will return a 200 status code.
1187
+ *
1188
+ * @param {string} userId
1189
+ * @param {string} secret
1190
+ * @throws {AppcondaException}
1191
+ * @returns {Promise<Models.Token>}
1192
+ */
1193
+ async updateVerification(userId, secret) {
1194
+ if (typeof userId === 'undefined') {
1195
+ throw new AppcondaException('Missing required parameter: "userId"');
1196
+ }
1197
+ if (typeof secret === 'undefined') {
1198
+ throw new AppcondaException('Missing required parameter: "secret"');
1199
+ }
1200
+ const apiPath = '/account/verification';
1201
+ const payload = {};
1202
+ if (typeof userId !== 'undefined') {
1203
+ payload['userId'] = userId;
1204
+ }
1205
+ if (typeof secret !== 'undefined') {
1206
+ payload['secret'] = secret;
1207
+ }
1208
+ const uri = new URL(this.client.config.endpoint + apiPath);
1209
+ const apiHeaders = {
1210
+ 'content-type': 'application/json',
1211
+ };
1212
+ return await this.client.call('put', uri, apiHeaders, payload);
1213
+ }
1214
+ /**
1215
+ * Create phone verification
1216
+ *
1217
+ * Use this endpoint to send a verification SMS to the currently logged in user. This endpoint is meant for use after updating a user&#039;s phone number using the [accountUpdatePhone](https://appconda.io/docs/references/cloud/client-web/account#updatePhone) endpoint. Learn more about how to [complete the verification process](https://appconda.io/docs/references/cloud/client-web/account#updatePhoneVerification). The verification code sent to the user&#039;s phone number is valid for 15 minutes.
1218
+ *
1219
+ * @throws {AppcondaException}
1220
+ * @returns {Promise<Models.Token>}
1221
+ */
1222
+ async createPhoneVerification() {
1223
+ const apiPath = '/account/verification/phone';
1224
+ const payload = {};
1225
+ const uri = new URL(this.client.config.endpoint + apiPath);
1226
+ const apiHeaders = {
1227
+ 'content-type': 'application/json',
1228
+ };
1229
+ return await this.client.call('post', uri, apiHeaders, payload);
1230
+ }
1231
+ /**
1232
+ * Update phone verification (confirmation)
1233
+ *
1234
+ * Use this endpoint to complete the user phone verification process. Use the **userId** and **secret** that were sent to your user&#039;s phone number to verify the user email ownership. If confirmed this route will return a 200 status code.
1235
+ *
1236
+ * @param {string} userId
1237
+ * @param {string} secret
1238
+ * @throws {AppcondaException}
1239
+ * @returns {Promise<Models.Token>}
1240
+ */
1241
+ async updatePhoneVerification(userId, secret) {
1242
+ if (typeof userId === 'undefined') {
1243
+ throw new AppcondaException('Missing required parameter: "userId"');
1244
+ }
1245
+ if (typeof secret === 'undefined') {
1246
+ throw new AppcondaException('Missing required parameter: "secret"');
1247
+ }
1248
+ const apiPath = '/account/verification/phone';
1249
+ const payload = {};
1250
+ if (typeof userId !== 'undefined') {
1251
+ payload['userId'] = userId;
1252
+ }
1253
+ if (typeof secret !== 'undefined') {
1254
+ payload['secret'] = secret;
1255
+ }
1256
+ const uri = new URL(this.client.config.endpoint + apiPath);
1257
+ const apiHeaders = {
1258
+ 'content-type': 'application/json',
1259
+ };
1260
+ return await this.client.call('put', uri, apiHeaders, payload);
1261
+ }
1262
+ }
1263
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2R1bGVzL2FjY291bnQvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLEVBQUUsaUJBQWlCLEVBQW1CLE1BQU0sY0FBYyxDQUFDO0FBRWxFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHeEMsTUFBTSxPQUFPLE9BQU87SUFHaEIsWUFBWSxNQUFjO1FBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLEdBQUc7UUFDTCxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUM7UUFDM0IsTUFBTSxPQUFPLEdBQVksRUFBRSxDQUFDO1FBQzVCLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUUzRCxNQUFNLFVBQVUsR0FBaUM7WUFDN0MsY0FBYyxFQUFFLGtCQUFrQjtTQUNyQyxDQUFBO1FBR0QsT0FBTyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUN6QixLQUFLLEVBQ0wsR0FBRyxFQUNILFVBQVUsRUFDVixPQUFPLENBQ1YsQ0FBQztJQUNOLENBQUM7SUFDRDs7Ozs7Ozs7Ozs7T0FXRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQXdCLE1BQWMsRUFBRSxLQUFhLEVBQUUsUUFBZ0IsRUFBRSxJQUFhO1FBQzlGLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDaEMsTUFBTSxJQUFJLGlCQUFpQixDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUNELElBQUksT0FBTyxLQUFLLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDL0IsTUFBTSxJQUFJLGlCQUFpQixDQUFDLHFDQUFxQyxDQUFDLENB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LDZCQUE2QixDQUFDO1FBQzlDLE1BQU0sT0FBTyxHQUFZLEVBQUUsQ0FBQztRQUM1QixJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ2hDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDL0IsQ0FBQztRQUNELElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDaEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMvQixDQUFDO1FBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBRTNELE1BQU0sVUFBVSxHQUFpQztZQUM3QyxjQUFjLEVBQUUsa0JBQWtCO1NBQ3JDLENBQUE7UUFHRCxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3pCLEtBQUssRUFDTCxHQUFHLEVBQ0gsVUFBVSxFQUNWLE9BQU8sQ0FDVixDQUFDO0lBQ04sQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiXG5cbmltcG9ydCB7IEF1dGhlbnRpY2F0b3JUeXBlIH0gZnJvbSAnLi9lbnVtcy9hdXRoZW50aWNhdG9yLXR5cGUnO1xuaW1wb3J0IHsgQXV0aGVudGljYXRpb25GYWN0b3IgfSBmcm9tICcuL2VudW1zL2F1dGhlbnRpY2F0aW9uLWZhY3Rvcic7XG5pbXBvcnQgeyBPQXV0aFByb3ZpZGVyIH0gZnJvbSAnLi9lbnVtcy9vLWF1dGgtcHJvdmlkZXInO1xuaW1wb3J0IHsgQXBwY29uZGFFeGNlcHRpb24sIENsaWVudCwgUGF5bG9hZCB9IGZyb20gJy4uLy4uL2NsaWVudCc7XG5pbXBvcnQgeyBVc2VyLCBQcmVmZXJlbmNlcywgSWRlbnRpdHlMaXN0LCBKd3QsIExvZ0xpc3QsIE1mYVR5cGUsIE1mYUNoYWxsZW5nZSwgTWZhRmFjdG9ycywgTWZhUmVjb3ZlcnlDb2RlcywgVG9rZW4sIFNlc3Npb25MaXN0LCBTZXNzaW9uLCBUYXJnZXQgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlJztcblxuXG5leHBvcnQgY2xhc3MgQWNjb3VudCB7XG4gICAgY2xpZW50OiBDbGllbnQ7XG5cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCkge1xuICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYWNjb3VudFxuICAgICAqXG4gICAgICogR2V0IHRoZSBjdXJyZW50bHkgbG9nZ2VkIGluIHVzZXIuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuVXNlcjxQcmVmZXJlbmNlcz4+fVxuICAgICAqL1xuICAgIGFzeW5jIGdldDxUIGV4dGVuZHMgUHJlZmVyZW5jZXM+KCk6IFByb21pc2U8VXNlcjxUPj4ge1xuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9hY2NvdW50JztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFjY291bnRcbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIGVuZHBvaW50IHRvIGFsbG93IGEgbmV3IHVzZXIgdG8gcmVnaXN0ZXIgYSBuZXcgYWNjb3VudCBpbiB5b3VyIHByb2plY3QuIEFmdGVyIHRoZSB1c2VyIHJlZ2lzdHJhdGlvbiBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5LCB5b3UgY2FuIHVzZSB0aGUgWy9hY2NvdW50L3ZlcmZpY2F0aW9uXShodHRwczovL2FwcGNvbmRhLmlvL2RvY3MvcmVmZXJlbmNlcy9jbG91ZC9jbGllbnQtd2ViL2FjY291bnQjY3JlYXRlVmVyaWZpY2F0aW9uKSByb3V0ZSB0byBzdGFydCB2ZXJpZnlpbmcgdGhlIHVzZXIgZW1haWwgYWRkcmVzcy4gVG8gYWxsb3cgdGhlIG5ldyB1c2VyIHRvIGxvZ2luIHRvIHRoZWlyIG5ldyBhY2NvdW50LCB5b3UgbmVlZCB0byBjcmVhdGUgYSBuZXcgW2FjY291bnQgc2Vzc2lvbl0oaHR0cHM6Ly9hcHBjb25kYS5pby9kb2NzL3JlZmVyZW5jZXMvY2xvdWQvY2xpZW50LXdlYi9hY2NvdW50I2NyZWF0ZUVtYWlsU2Vzc2lvbikuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGVtYWlsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3N3b3JkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuVXNlcjxQcmVmZXJlbmNlcz4+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZTxUIGV4dGVuZHMgUHJlZmVyZW5jZXM+KHVzZXJJZDogc3RyaW5nLCBlbWFpbDogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nLCBuYW1lPzogc3RyaW5nKTogUHJvbWlzZTxVc2VyPFQ+PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdXNlcklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJ1c2VySWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW1haWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImVtYWlsXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBhc3N3b3JkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwYXNzd29yZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudCc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiB1c2VySWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd1c2VySWQnXSA9IHVzZXJJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVtYWlsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZW1haWwnXSA9IGVtYWlsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcGFzc3dvcmQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydwYXNzd29yZCddID0gcGFzc3dvcmQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmFtZSddID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwb3N0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBhY2NvdW50XG4gICAgICpcbiAgICAgKiBEZWxldGUgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlci5cbiAgICAgKlxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHt9Pn1cbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGUoKTogUHJvbWlzZTx7fT4ge1xuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9hY2NvdW50JztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdkZWxldGUnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgZW1haWxcbiAgICAgKlxuICAgICAqIFVwZGF0ZSBjdXJyZW50bHkgbG9nZ2VkIGluIHVzZXIgYWNjb3VudCBlbWFpbCBhZGRyZXNzLiBBZnRlciBjaGFuZ2luZyB1c2VyIGFkZHJlc3MsIHRoZSB1c2VyIGNvbmZpcm1hdGlvbiBzdGF0dXMgd2lsbCBnZXQgcmVzZXQuIEEgbmV3IGNvbmZpcm1hdGlvbiBlbWFpbCBpcyBub3Qgc2VudCBhdXRvbWF0aWNhbGx5IGhvd2V2ZXIgeW91IGNhbiB1c2UgdGhlIHNlbmQgY29uZmlybWF0aW9uIGVtYWlsIGVuZHBvaW50IGFnYWluIHRvIHNlbmQgdGhlIGNvbmZpcm1hdGlvbiBlbWFpbC4gRm9yIHNlY3VyaXR5IG1lYXN1cmVzLCB1c2VyIHBhc3N3b3JkIGlzIHJlcXVpcmVkIHRvIGNvbXBsZXRlIHRoaXMgcmVxdWVzdC5cblRoaXMgZW5kcG9pbnQgY2FuIGFsc28gYmUgdXNlZCB0byBjb252ZXJ0IGFuIGFub255bW91cyBhY2NvdW50IHRvIGEgbm9ybWFsIG9uZSwgYnkgcGFzc2luZyBhbiBlbWFpbCBhZGRyZXNzIGFuZCBhIG5ldyBwYXNzd29yZC5cblxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGVtYWlsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3N3b3JkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlVzZXI8UHJlZmVyZW5jZXM+Pn1cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVFbWFpbDxUIGV4dGVuZHMgUHJlZmVyZW5jZXM+KGVtYWlsOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPFVzZXI8VD4+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbWFpbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZW1haWxcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcGFzc3dvcmQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInBhc3N3b3JkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9hY2NvdW50L2VtYWlsJztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGVtYWlsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZW1haWwnXSA9IGVtYWlsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcGFzc3dvcmQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydwYXNzd29yZCddID0gcGFzc3dvcmQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncGF0Y2gnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTGlzdCBJZGVudGl0aWVzXG4gICAgICpcbiAgICAgKiBHZXQgdGhlIGxpc3Qgb2YgaWRlbnRpdGllcyBmb3IgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHF1ZXJpZXNcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxJZGVudGl0eUxpc3Q+fVxuICAgICAqL1xuICAgIGFzeW5jIGxpc3RJZGVudGl0aWVzKHF1ZXJpZXM/OiBzdHJpbmdbXSk6IFByb21pc2U8SWRlbnRpdHlMaXN0PiB7XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvaWRlbnRpdGllcyc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBxdWVyaWVzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncXVlcmllcyddID0gcXVlcmllcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVsZXRlIGlkZW50aXR5XG4gICAgICpcbiAgICAgKiBEZWxldGUgYW4gaWRlbnRpdHkgYnkgaXRzIHVuaXF1ZSBJRC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZGVudGl0eUlkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8e30+fVxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZUlkZW50aXR5KGlkZW50aXR5SWQ6IHN0cmluZyk6IFByb21pc2U8e30+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBpZGVudGl0eUlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJpZGVudGl0eUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9hY2NvdW50L2lkZW50aXRpZXMve2lkZW50aXR5SWR9Jy5yZXBsYWNlKCd7aWRlbnRpdHlJZH0nLCBpZGVudGl0eUlkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdkZWxldGUnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIEpXVFxuICAgICAqXG4gICAgICogVXNlIHRoaXMgZW5kcG9pbnQgdG8gY3JlYXRlIGEgSlNPTiBXZWIgVG9rZW4uIFlvdSBjYW4gdXNlIHRoZSByZXN1bHRpbmcgSldUIHRvIGF1dGhlbnRpY2F0ZSBvbiBiZWhhbGYgb2YgdGhlIGN1cnJlbnQgdXNlciB3aGVuIHdvcmtpbmcgd2l0aCB0aGUgQXBwY29uZGEgc2VydmVyLXNpZGUgQVBJIGFuZCBTREtzLiBUaGUgSldUIHNlY3JldCBpcyB2YWxpZCBmb3IgMTUgbWludXRlcyBmcm9tIGl0cyBjcmVhdGlvbiBhbmQgd2lsbCBiZSBpbnZhbGlkIGlmIHRoZSB1c2VyIHdpbGwgbG9nb3V0IGluIHRoYXQgdGltZSBmcmFtZS5cbiAgICAgKlxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPEp3dD59XG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlSldUKCk6IFByb21pc2U8Snd0PiB7XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvand0cyc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncG9zdCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMaXN0IGxvZ3NcbiAgICAgKlxuICAgICAqIEdldCB0aGUgbGlzdCBvZiBsYXRlc3Qgc2VjdXJpdHkgYWN0aXZpdHkgbG9ncyBmb3IgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlci4gRWFjaCBsb2cgcmV0dXJucyB1c2VyIElQIGFkZHJlc3MsIGxvY2F0aW9uIGFuZCBkYXRlIGFuZCB0aW1lIG9mIGxvZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHF1ZXJpZXNcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxMb2dMaXN0Pn1cbiAgICAgKi9cbiAgICBhc3luYyBsaXN0TG9ncyhxdWVyaWVzPzogc3RyaW5nW10pOiBQcm9taXNlPExvZ0xpc3Q+IHtcbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC9sb2dzJztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHF1ZXJpZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydxdWVyaWVzJ10gPSBxdWVyaWVzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgTUZBXG4gICAgICpcbiAgICAgKiBFbmFibGUgb3IgZGlzYWJsZSBNRkEgb24gYW4gYWNjb3VudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gbWZhXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlVzZXI8UHJlZmVyZW5jZXM+Pn1cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVNRkE8VCBleHRlbmRzIFByZWZlcmVuY2VzPihtZmE6IGJvb2xlYW4pOiBQcm9taXNlPFVzZXI8VD4+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBtZmEgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcIm1mYVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC9tZmEnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgbWZhICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbWZhJ10gPSBtZmE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncGF0Y2gnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIEF1dGhlbnRpY2F0b3JcbiAgICAgKlxuICAgICAqIEFkZCBhbiBhdXRoZW50aWNhdG9yIGFwcCB0byBiZSB1c2VkIGFzIGFuIE1GQSBmYWN0b3IuIFZlcmlmeSB0aGUgYXV0aGVudGljYXRvciB1c2luZyB0aGUgW3ZlcmlmeSBhdXRoZW50aWNhdG9yXSgvZG9jcy9yZWZlcmVuY2VzL2Nsb3VkL2NsaWVudC13ZWIvYWNjb3VudCN1cGRhdGVNZmFBdXRoZW50aWNhdG9yKSBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0F1dGhlbnRpY2F0b3JUeXBlfSB0eXBlXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TWZhVHlwZT59XG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlTWZhQXV0aGVudGljYXRvcih0eXBlOiBBdXRoZW50aWNhdG9yVHlwZSk6IFByb21pc2U8TWZhVHlwZT4ge1xuICAgICAgICBpZiAodHlwZW9mIHR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInR5cGVcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvbWZhL2F1dGhlbnRpY2F0b3JzL3t0eXBlfScucmVwbGFjZSgne3R5cGV9JywgdHlwZSk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncG9zdCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBWZXJpZnkgQXV0aGVudGljYXRvclxuICAgICAqXG4gICAgICogVmVyaWZ5IGFuIGF1dGhlbnRpY2F0b3IgYXBwIGFmdGVyIGFkZGluZyBpdCB1c2luZyB0aGUgW2FkZCBhdXRoZW50aWNhdG9yXSgvZG9jcy9yZWZlcmVuY2VzL2Nsb3VkL2NsaWVudC13ZWIvYWNjb3VudCNjcmVhdGVNZmFBdXRoZW50aWNhdG9yKSBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0F1dGhlbnRpY2F0b3JUeXBlfSB0eXBlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG90cFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Vc2VyPFByZWZlcmVuY2VzPj59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlTWZhQXV0aGVudGljYXRvcjxUIGV4dGVuZHMgUHJlZmVyZW5jZXM+KHR5cGU6IEF1dGhlbnRpY2F0b3JUeXBlLCBvdHA6IHN0cmluZyk6IFByb21pc2U8VXNlcjxUPj4ge1xuICAgICAgICBpZiAodHlwZW9mIHR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInR5cGVcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygb3RwID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJvdHBcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvbWZhL2F1dGhlbnRpY2F0b3JzL3t0eXBlfScucmVwbGFjZSgne3R5cGV9JywgdHlwZSk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBvdHAgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydvdHAnXSA9IG90cDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwdXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVsZXRlIEF1dGhlbnRpY2F0b3JcbiAgICAgKlxuICAgICAqIERlbGV0ZSBhbiBhdXRoZW50aWNhdG9yIGZvciBhIHVzZXIgYnkgSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0F1dGhlbnRpY2F0b3JUeXBlfSB0eXBlXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8e30+fVxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZU1mYUF1dGhlbnRpY2F0b3IodHlwZTogQXV0aGVudGljYXRvclR5cGUpOiBQcm9taXNlPHt9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidHlwZVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC9tZmEvYXV0aGVudGljYXRvcnMve3R5cGV9Jy5yZXBsYWNlKCd7dHlwZX0nLCB0eXBlKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdkZWxldGUnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIE1GQSBDaGFsbGVuZ2VcbiAgICAgKlxuICAgICAqIEJlZ2luIHRoZSBwcm9jZXNzIG9mIE1GQSB2ZXJpZmljYXRpb24gYWZ0ZXIgc2lnbi1pbi4gRmluaXNoIHRoZSBmbG93IHdpdGggW3VwZGF0ZU1mYUNoYWxsZW5nZV0oL2RvY3MvcmVmZXJlbmNlcy9jbG91ZC9jbGllbnQtd2ViL2FjY291bnQjdXBkYXRlTWZhQ2hhbGxlbmdlKSBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0F1dGhlbnRpY2F0aW9uRmFjdG9yfSBmYWN0b3JcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNZmFDaGFsbGVuZ2U+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZU1mYUNoYWxsZW5nZShmYWN0b3I6IEF1dGhlbnRpY2F0aW9uRmFjdG9yKTogUHJvbWlzZTxNZmFDaGFsbGVuZ2U+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmYWN0b3IgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImZhY3RvclwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC9tZmEvY2hhbGxlbmdlJztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGZhY3RvciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2ZhY3RvciddID0gZmFjdG9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIE1GQSBDaGFsbGVuZ2UgKGNvbmZpcm1hdGlvbilcbiAgICAgKlxuICAgICAqIENvbXBsZXRlIHRoZSBNRkEgY2hhbGxlbmdlIGJ5IHByb3ZpZGluZyB0aGUgb25lLXRpbWUgcGFzc3dvcmQuIEZpbmlzaCB0aGUgcHJvY2VzcyBvZiBNRkEgdmVyaWZpY2F0aW9uIGJ5IHByb3ZpZGluZyB0aGUgb25lLXRpbWUgcGFzc3dvcmQuIFRvIGJlZ2luIHRoZSBmbG93LCB1c2UgW2NyZWF0ZU1mYUNoYWxsZW5nZV0oL2RvY3MvcmVmZXJlbmNlcy9jbG91ZC9jbGllbnQtd2ViL2FjY291bnQjY3JlYXRlTWZhQ2hhbGxlbmdlKSBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbGxlbmdlSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb3RwXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8e30+fVxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZU1mYUNoYWxsZW5nZShjaGFsbGVuZ2VJZDogc3RyaW5nLCBvdHA6IHN0cmluZyk6IFByb21pc2U8e30+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjaGFsbGVuZ2VJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiY2hhbGxlbmdlSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygb3RwID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJvdHBcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvbWZhL2NoYWxsZW5nZSc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBjaGFsbGVuZ2VJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2NoYWxsZW5nZUlkJ10gPSBjaGFsbGVuZ2VJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG90cCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ290cCddID0gb3RwO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3B1dCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMaXN0IEZhY3RvcnNcbiAgICAgKlxuICAgICAqIExpc3QgdGhlIGZhY3RvcnMgYXZhaWxhYmxlIG9uIHRoZSBhY2NvdW50IHRvIGJlIHVzZWQgYXMgYSBNRkEgY2hhbGxhbmdlLlxuICAgICAqXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TWZhRmFjdG9ycz59XG4gICAgICovXG4gICAgYXN5bmMgbGlzdE1mYUZhY3RvcnMoKTogUHJvbWlzZTxNZmFGYWN0b3JzPiB7XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvbWZhL2ZhY3RvcnMnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgTUZBIFJlY292ZXJ5IENvZGVzXG4gICAgICpcbiAgICAgKiBHZXQgcmVjb3ZlcnkgY29kZXMgdGhhdCBjYW4gYmUgdXNlZCBhcyBiYWNrdXAgZm9yIE1GQSBmbG93LiBCZWZvcmUgZ2V0dGluZyBjb2RlcywgdGhleSBtdXN0IGJlIGdlbmVyYXRlZCB1c2luZyBbY3JlYXRlTWZhUmVjb3ZlcnlDb2Rlc10oL2RvY3MvcmVmZXJlbmNlcy9jbG91ZC9jbGllbnQtd2ViL2FjY291bnQjY3JlYXRlTWZhUmVjb3ZlcnlDb2RlcykgbWV0aG9kLiBBbiBPVFAgY2hhbGxlbmdlIGlzIHJlcXVpcmVkIHRvIHJlYWQgcmVjb3ZlcnkgY29kZXMuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNZmFSZWNvdmVyeUNvZGVzPn1cbiAgICAgKi9cbiAgICBhc3luYyBnZXRNZmFSZWNvdmVyeUNvZGVzKCk6IFByb21pc2U8TWZhUmVjb3ZlcnlDb2Rlcz4ge1xuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9hY2NvdW50L21mYS9yZWNvdmVyeS1jb2Rlcyc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZ2V0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBNRkEgUmVjb3ZlcnkgQ29kZXNcbiAgICAgKlxuICAgICAqIEdlbmVyYXRlIHJlY292ZXJ5IGNvZGVzIGFzIGJhY2t1cCBmb3IgTUZBIGZsb3cuIEl0JiMwMzk7cyByZWNvbW1lbmRlZCB0byBnZW5lcmF0ZSBhbmQgc2hvdyB0aGVuIGltbWVkaWF0ZWx5IGFmdGVyIHVzZXIgc3VjY2Vzc2Z1bGx5IGFkZHMgdGhlaXIgYXV0aGVodGljYXRvci4gUmVjb3ZlcnkgY29kZXMgY2FuIGJlIHVzZWQgYXMgYSBNRkEgdmVyaWZpY2F0aW9uIHR5cGUgaW4gW2NyZWF0ZU1mYUNoYWxsZW5nZV0oL2RvY3MvcmVmZXJlbmNlcy9jbG91ZC9jbGllbnQtd2ViL2FjY291bnQjY3JlYXRlTWZhQ2hhbGxlbmdlKSBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuTWZhUmVjb3ZlcnlDb2Rlcz59XG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlTWZhUmVjb3ZlcnlDb2RlcygpOiBQcm9taXNlPE1mYVJlY292ZXJ5Q29kZXM+IHtcbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC9tZmEvcmVjb3ZlcnktY29kZXMnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdlbmVyYXRlIE1GQSBSZWNvdmVyeSBDb2Rlc1xuICAgICAqXG4gICAgICogUmVnZW5lcmF0ZSByZWNvdmVyeSBjb2RlcyB0aGF0IGNhbiBiZSB1c2VkIGFzIGJhY2t1cCBmb3IgTUZBIGZsb3cuIEJlZm9yZSByZWdlbmVyYXRpbmcgY29kZXMsIHRoZXkgbXVzdCBiZSBmaXJzdCBnZW5lcmF0ZWQgdXNpbmcgW2NyZWF0ZU1mYVJlY292ZXJ5Q29kZXNdKC9kb2NzL3JlZmVyZW5jZXMvY2xvdWQvY2xpZW50LXdlYi9hY2NvdW50I2NyZWF0ZU1mYVJlY292ZXJ5Q29kZXMpIG1ldGhvZC4gQW4gT1RQIGNoYWxsZW5nZSBpcyByZXF1aXJlZCB0byByZWdlbnJlYXRlIHJlY292ZXJ5IGNvZGVzLlxuICAgICAqXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLk1mYVJlY292ZXJ5Q29kZXM+fVxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZU1mYVJlY292ZXJ5Q29kZXMoKTogUHJvbWlzZTxNZmFSZWNvdmVyeUNvZGVzPiB7XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvbWZhL3JlY292ZXJ5LWNvZGVzJztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgbmFtZVxuICAgICAqXG4gICAgICogVXBkYXRlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlciBhY2NvdW50IG5hbWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Vc2VyPFByZWZlcmVuY2VzPj59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlTmFtZTxUIGV4dGVuZHMgUHJlZmVyZW5jZXM+KG5hbWU6IHN0cmluZyk6IFByb21pc2U8VXNlcjxUPj4ge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcIm5hbWVcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvbmFtZSc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmFtZSddID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgcGFzc3dvcmRcbiAgICAgKlxuICAgICAqIFVwZGF0ZSBjdXJyZW50bHkgbG9nZ2VkIGluIHVzZXIgcGFzc3dvcmQuIEZvciB2YWxpZGF0aW9uLCB1c2VyIGlzIHJlcXVpcmVkIHRvIHBhc3MgaW4gdGhlIG5ldyBwYXNzd29yZCwgYW5kIHRoZSBvbGQgcGFzc3dvcmQuIEZvciB1c2VycyBjcmVhdGVkIHdpdGggT0F1dGgsIFRlYW0gSW52aXRlcyBhbmQgTWFnaWMgVVJMLCBvbGRQYXNzd29yZCBpcyBvcHRpb25hbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvbGRQYXNzd29yZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Vc2VyPFByZWZlcmVuY2VzPj59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlUGFzc3dvcmQ8VCBleHRlbmRzIFByZWZlcmVuY2VzPihwYXNzd29yZDogc3RyaW5nLCBvbGRQYXNzd29yZD86IHN0cmluZyk6IFByb21pc2U8VXNlcjxUPj4ge1xuICAgICAgICBpZiAodHlwZW9mIHBhc3N3b3JkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwYXNzd29yZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC9wYXNzd29yZCc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXNzd29yZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3Bhc3N3b3JkJ10gPSBwYXNzd29yZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9sZFBhc3N3b3JkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnb2xkUGFzc3dvcmQnXSA9IG9sZFBhc3N3b3JkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3BhdGNoJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBwaG9uZVxuICAgICAqXG4gICAgICogVXBkYXRlIHRoZSBjdXJyZW50bHkgbG9nZ2VkIGluIHVzZXImIzAzOTtzIHBob25lIG51bWJlci4gQWZ0ZXIgdXBkYXRpbmcgdGhlIHBob25lIG51bWJlciwgdGhlIHBob25lIHZlcmlmaWNhdGlvbiBzdGF0dXMgd2lsbCBiZSByZXNldC4gQSBjb25maXJtYXRpb24gU01TIGlzIG5vdCBzZW50IGF1dG9tYXRpY2FsbHksIGhvd2V2ZXIgeW91IGNhbiB1c2UgdGhlIFtQT1NUIC9hY2NvdW50L3ZlcmlmaWNhdGlvbi9waG9uZV0oaHR0cHM6Ly9hcHBjb25kYS5pby9kb2NzL3JlZmVyZW5jZXMvY2xvdWQvY2xpZW50LXdlYi9hY2NvdW50I2NyZWF0ZVBob25lVmVyaWZpY2F0aW9uKSBlbmRwb2ludCB0byBzZW5kIGEgY29uZmlybWF0aW9uIFNNUy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwaG9uZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Vc2VyPFByZWZlcmVuY2VzPj59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlUGhvbmU8VCBleHRlbmRzIFByZWZlcmVuY2VzPihwaG9uZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxVc2VyPFQ+PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcGhvbmUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInBob25lXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBhc3N3b3JkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwYXNzd29yZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC9waG9uZSc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBwaG9uZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3Bob25lJ10gPSBwaG9uZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBhc3N3b3JkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncGFzc3dvcmQnXSA9IHBhc3N3b3JkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3BhdGNoJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBhY2NvdW50IHByZWZlcmVuY2VzXG4gICAgICpcbiAgICAgKiBHZXQgdGhlIHByZWZlcmVuY2VzIGFzIGEga2V5LXZhbHVlIG9iamVjdCBmb3IgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlci5cbiAgICAgKlxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFByZWZlcmVuY2VzPn1cbiAgICAgKi9cbiAgICBhc3luYyBnZXRQcmVmczxUIGV4dGVuZHMgUHJlZmVyZW5jZXM+KCk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9hY2NvdW50L3ByZWZzJztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHByZWZlcmVuY2VzXG4gICAgICpcbiAgICAgKiBVcGRhdGUgY3VycmVudGx5IGxvZ2dlZCBpbiB1c2VyIGFjY291bnQgcHJlZmVyZW5jZXMuIFRoZSBvYmplY3QgeW91IHBhc3MgaXMgc3RvcmVkIGFzIGlzLCBhbmQgcmVwbGFjZXMgYW55IHByZXZpb3VzIHZhbHVlLiBUaGUgbWF4aW11bSBhbGxvd2VkIHByZWZzIHNpemUgaXMgNjRrQiBhbmQgdGhyb3dzIGVycm9yIGlmIGV4Y2VlZGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQYXJ0aWFsPFByZWZlcmVuY2VzPn0gcHJlZnNcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuVXNlcjxQcmVmZXJlbmNlcz4+fVxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZVByZWZzPFQgZXh0ZW5kcyBQcmVmZXJlbmNlcz4ocHJlZnM6IFBhcnRpYWw8UHJlZmVyZW5jZXM+KTogUHJvbWlzZTxVc2VyPFQ+PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJlZnMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInByZWZzXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9hY2NvdW50L3ByZWZzJztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHByZWZzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncHJlZnMnXSA9IHByZWZzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3BhdGNoJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBwYXNzd29yZCByZWNvdmVyeVxuICAgICAqXG4gICAgICogU2VuZHMgdGhlIHVzZXIgYW4gZW1haWwgd2l0aCBhIHRlbXBvcmFyeSBzZWNyZXQga2V5IGZvciBwYXNzd29yZCByZXNldC4gV2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIGNvbmZpcm1hdGlvbiBsaW5rIGhlIGlzIHJlZGlyZWN0ZWQgYmFjayB0byB5b3VyIGFwcCBwYXNzd29yZCByZXNldCBVUkwgd2l0aCB0aGUgc2VjcmV0IGtleSBhbmQgZW1haWwgYWRkcmVzcyB2YWx1ZXMgYXR0YWNoZWQgdG8gdGhlIFVSTCBxdWVyeSBzdHJpbmcuIFVzZSB0aGUgcXVlcnkgc3RyaW5nIHBhcmFtcyB0byBzdWJtaXQgYSByZXF1ZXN0IHRvIHRoZSBbUFVUIC9hY2NvdW50L3JlY292ZXJ5XShodHRwczovL2FwcGNvbmRhLmlvL2RvY3MvcmVmZXJlbmNlcy9jbG91ZC9jbGllbnQtd2ViL2FjY291bnQjdXBkYXRlUmVjb3ZlcnkpIGVuZHBvaW50IHRvIGNvbXBsZXRlIHRoZSBwcm9jZXNzLiBUaGUgdmVyaWZpY2F0aW9uIGxpbmsgc2VudCB0byB0aGUgdXNlciYjMDM5O3MgZW1haWwgYWRkcmVzcyBpcyB2YWxpZCBmb3IgMSBob3VyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGVtYWlsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFRva2VuPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVSZWNvdmVyeShlbWFpbDogc3RyaW5nLCB1cmw6IHN0cmluZyk6IFByb21pc2U8VG9rZW4+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbWFpbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZW1haWxcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJ1cmxcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvcmVjb3ZlcnknO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgZW1haWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbWFpbCddID0gZW1haWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB1cmwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd1cmwnXSA9IHVybDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwb3N0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBwYXNzd29yZCByZWNvdmVyeSAoY29uZmlybWF0aW9uKVxuICAgICAqXG4gICAgICogVXNlIHRoaXMgZW5kcG9pbnQgdG8gY29tcGxldGUgdGhlIHVzZXIgYWNjb3VudCBwYXNzd29yZCByZXNldC4gQm90aCB0aGUgKip1c2VySWQqKiBhbmQgKipzZWNyZXQqKiBhcmd1bWVudHMgd2lsbCBiZSBwYXNzZWQgYXMgcXVlcnkgcGFyYW1ldGVycyB0byB0aGUgcmVkaXJlY3QgVVJMIHlvdSBoYXZlIHByb3ZpZGVkIHdoZW4gc2VuZGluZyB5b3VyIHJlcXVlc3QgdG8gdGhlIFtQT1NUIC9hY2NvdW50L3JlY292ZXJ5XShodHRwczovL2FwcGNvbmRhLmlvL2RvY3MvcmVmZXJlbmNlcy9jbG91ZC9jbGllbnQtd2ViL2FjY291bnQjY3JlYXRlUmVjb3ZlcnkpIGVuZHBvaW50LlxuXG5QbGVhc2Ugbm90ZSB0aGF0IGluIG9yZGVyIHRvIGF2b2lkIGEgW1JlZGlyZWN0IEF0dGFja10oaHR0cHM6Ly9naXRodWIuY29tL09XQVNQL0NoZWF0U2hlZXRTZXJpZXMvYmxvYi9tYXN0ZXIvY2hlYXRzaGVldHMvVW52YWxpZGF0ZWRfUmVkaXJlY3RzX2FuZF9Gb3J3YXJkc19DaGVhdF9TaGVldC5tZCkgdGhlIG9ubHkgdmFsaWQgcmVkaXJlY3QgVVJMcyBhcmUgdGhlIG9uZXMgZnJvbSBkb21haW5zIHlvdSBoYXZlIHNldCB3aGVuIGFkZGluZyB5b3VyIHBsYXRmb3JtcyBpbiB0aGUgY29uc29sZSBpbnRlcmZhY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlY3JldFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Ub2tlbj59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlUmVjb3ZlcnkodXNlcklkOiBzdHJpbmcsIHNlY3JldDogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxUb2tlbj4ge1xuICAgICAgICBpZiAodHlwZW9mIHVzZXJJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidXNlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlY3JldCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwic2VjcmV0XCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBhc3N3b3JkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwYXNzd29yZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC9yZWNvdmVyeSc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiB1c2VySWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd1c2VySWQnXSA9IHVzZXJJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlY3JldCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3NlY3JldCddID0gc2VjcmV0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcGFzc3dvcmQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydwYXNzd29yZCddID0gcGFzc3dvcmQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncHV0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExpc3Qgc2Vzc2lvbnNcbiAgICAgKlxuICAgICAqIEdldCB0aGUgbGlzdCBvZiBhY3RpdmUgc2Vzc2lvbnMgYWNyb3NzIGRpZmZlcmVudCBkZXZpY2VzIGZvciB0aGUgY3VycmVudGx5IGxvZ2dlZCBpbiB1c2VyLlxuICAgICAqXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8U2Vzc2lvbkxpc3Q+fVxuICAgICAqL1xuICAgIGFzeW5jIGxpc3RTZXNzaW9ucygpOiBQcm9taXNlPFNlc3Npb25MaXN0PiB7XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvc2Vzc2lvbnMnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxldGUgc2Vzc2lvbnNcbiAgICAgKlxuICAgICAqIERlbGV0ZSBhbGwgc2Vzc2lvbnMgZnJvbSB0aGUgdXNlciBhY2NvdW50IGFuZCByZW1vdmUgYW55IHNlc3Npb25zIGNvb2tpZXMgZnJvbSB0aGUgZW5kIGNsaWVudC5cbiAgICAgKlxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHt9Pn1cbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGVTZXNzaW9ucygpOiBQcm9taXNlPHt9PiB7XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvc2Vzc2lvbnMnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2RlbGV0ZScsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYW5vbnltb3VzIHNlc3Npb25cbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIGVuZHBvaW50IHRvIGFsbG93IGEgbmV3IHVzZXIgdG8gcmVnaXN0ZXIgYW4gYW5vbnltb3VzIGFjY291bnQgaW4geW91ciBwcm9qZWN0LiBUaGlzIHJvdXRlIHdpbGwgYWxzbyBjcmVhdGUgYSBuZXcgc2Vzc2lvbiBmb3IgdGhlIHVzZXIuIFRvIGFsbG93IHRoZSBuZXcgdXNlciB0byBjb252ZXJ0IGFuIGFub255bW91cyBhY2NvdW50IHRvIGEgbm9ybWFsIGFjY291bnQsIHlvdSBuZWVkIHRvIHVwZGF0ZSBpdHMgW2VtYWlsIGFuZCBwYXNzd29yZF0oaHR0cHM6Ly9hcHBjb25kYS5pby9kb2NzL3JlZmVyZW5jZXMvY2xvdWQvY2xpZW50LXdlYi9hY2NvdW50I3VwZGF0ZUVtYWlsKSBvciBjcmVhdGUgYW4gW09BdXRoMiBzZXNzaW9uXShodHRwczovL2FwcGNvbmRhLmlvL2RvY3MvcmVmZXJlbmNlcy9jbG91ZC9jbGllbnQtd2ViL2FjY291bnQjQ3JlYXRlT0F1dGgyU2Vzc2lvbikuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuU2Vzc2lvbj59XG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlQW5vbnltb3VzU2Vzc2lvbigpOiBQcm9taXNlPFNlc3Npb24+IHtcbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC9zZXNzaW9ucy9hbm9ueW1vdXMnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGVtYWlsIHBhc3N3b3JkIHNlc3Npb25cbiAgICAgKlxuICAgICAqIEFsbG93IHRoZSB1c2VyIHRvIGxvZ2luIGludG8gdGhlaXIgYWNjb3VudCBieSBwcm92aWRpbmcgYSB2YWxpZCBlbWFpbCBhbmQgcGFzc3dvcmQgY29tYmluYXRpb24uIFRoaXMgcm91dGUgd2lsbCBjcmVhdGUgYSBuZXcgc2Vzc2lvbiBmb3IgdGhlIHVzZXIuXG5cbkEgdXNlciBpcyBsaW1pdGVkIHRvIDEwIGFjdGl2ZSBzZXNzaW9ucyBhdCBhIHRpbWUgYnkgZGVmYXVsdC4gW0xlYXJuIG1vcmUgYWJvdXQgc2Vzc2lvbiBsaW1pdHNdKGh0dHBzOi8vYXBwY29uZGEuaW8vZG9jcy9hdXRoZW50aWNhdGlvbi1zZWN1cml0eSNsaW1pdHMpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGVtYWlsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3N3b3JkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8U2Vzc2lvbj59XG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlRW1haWxQYXNzd29yZFNlc3Npb24oZW1haWw6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8U2Vzc2lvbj4ge1xuICAgICAgICBpZiAodHlwZW9mIGVtYWlsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJlbWFpbFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwYXNzd29yZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicGFzc3dvcmRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvc2Vzc2lvbnMvZW1haWwnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgZW1haWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbWFpbCddID0gZW1haWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwYXNzd29yZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3Bhc3N3b3JkJ10gPSBwYXNzd29yZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwb3N0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBtYWdpYyBVUkwgc2Vzc2lvblxuICAgICAqXG4gICAgICogVXNlIHRoaXMgZW5kcG9pbnQgdG8gY3JlYXRlIGEgc2Vzc2lvbiBmcm9tIHRva2VuLiBQcm92aWRlIHRoZSAqKnVzZXJJZCoqIGFuZCAqKnNlY3JldCoqIHBhcmFtZXRlcnMgZnJvbSB0aGUgc3VjY2Vzc2Z1bCByZXNwb25zZSBvZiBhdXRoZW50aWNhdGlvbiBmbG93cyBpbml0aWF0ZWQgYnkgdG9rZW4gY3JlYXRpb24uIEZvciBleGFtcGxlLCBtYWdpYyBVUkwgYW5kIHBob25lIGxvZ2luLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWNyZXRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuU2Vzc2lvbj59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlTWFnaWNVUkxTZXNzaW9uKHVzZXJJZDogc3RyaW5nLCBzZWNyZXQ6IHN0cmluZyk6IFByb21pc2U8U2Vzc2lvbj4ge1xuICAgICAgICBpZiAodHlwZW9mIHVzZXJJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidXNlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlY3JldCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwic2VjcmV0XCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9hY2NvdW50L3Nlc3Npb25zL21hZ2ljLXVybCc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiB1c2VySWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd1c2VySWQnXSA9IHVzZXJJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlY3JldCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3NlY3JldCddID0gc2VjcmV0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3B1dCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgT0F1dGgyIHNlc3Npb25cbiAgICAgKlxuICAgICAqIEFsbG93IHRoZSB1c2VyIHRvIGxvZ2luIHRvIHRoZWlyIGFjY291bnQgdXNpbmcgdGhlIE9BdXRoMiBwcm92aWRlciBvZiB0aGVpciBjaG9pY2UuIEVhY2ggT0F1dGgyIHByb3ZpZGVyIHNob3VsZCBiZSBlbmFibGVkIGZyb20gdGhlIEFwcGNvbmRhIGNvbnNvbGUgZmlyc3QuIFVzZSB0aGUgc3VjY2VzcyBhbmQgZmFpbHVyZSBhcmd1bWVudHMgdG8gcHJvdmlkZSBhIHJlZGlyZWN0IFVSTCYjMDM5O3MgYmFjayB0byB5b3VyIGFwcCB3aGVuIGxvZ2luIGlzIGNvbXBsZXRlZC5cblxuSWYgdGhlcmUgaXMgYWxyZWFkeSBhbiBhY3RpdmUgc2Vzc2lvbiwgdGhlIG5ldyBzZXNzaW9uIHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIGxvZ2dlZC1pbiBhY2NvdW50LiBJZiB0aGVyZSBhcmUgbm8gYWN0aXZlIHNlc3Npb25zLCB0aGUgc2VydmVyIHdpbGwgYXR0ZW1wdCB0byBsb29rIGZvciBhIHVzZXIgd2l0aCB0aGUgc2FtZSBlbWFpbCBhZGRyZXNzIGFzIHRoZSBlbWFpbCByZWNlaXZlZCBmcm9tIHRoZSBPQXV0aDIgcHJvdmlkZXIgYW5kIGF0dGFjaCB0aGUgbmV3IHNlc3Npb24gdG8gdGhlIGV4aXN0aW5nIHVzZXIuIElmIG5vIG1hdGNoaW5nIHVzZXIgaXMgZm91bmQgLSB0aGUgc2VydmVyIHdpbGwgY3JlYXRlIGEgbmV3IHVzZXIuXG5cbkEgdXNlciBpcyBsaW1pdGVkIHRvIDEwIGFjdGl2ZSBzZXNzaW9ucyBhdCBhIHRpbWUgYnkgZGVmYXVsdC4gW0xlYXJuIG1vcmUgYWJvdXQgc2Vzc2lvbiBsaW1pdHNdKGh0dHBzOi8vYXBwY29uZGEuaW8vZG9jcy9hdXRoZW50aWNhdGlvbi1zZWN1cml0eSNsaW1pdHMpLlxuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09BdXRoUHJvdmlkZXJ9IHByb3ZpZGVyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN1Y2Nlc3NcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZmFpbHVyZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHNjb3Blc1xuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQgfCBzdHJpbmc+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZU9BdXRoMlNlc3Npb24ocHJvdmlkZXI6IE9BdXRoUHJvdmlkZXIsIHN1Y2Nlc3M/OiBzdHJpbmcsIGZhaWx1cmU/OiBzdHJpbmcsIHNjb3Blcz86IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkIHwgc3RyaW5nPiB7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicHJvdmlkZXJcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvc2Vzc2lvbnMvb2F1dGgyL3twcm92aWRlcn0nLnJlcGxhY2UoJ3twcm92aWRlcn0nLCBwcm92aWRlcik7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBzdWNjZXNzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc3VjY2VzcyddID0gc3VjY2VzcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGZhaWx1cmUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydmYWlsdXJlJ10gPSBmYWlsdXJlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2NvcGVzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc2NvcGVzJ10gPSBzY29wZXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHBheWxvYWRbJ3Byb2plY3QnXSA9IHRoaXMuY2xpZW50LmNvbmZpZy5wcm9qZWN0O1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhTZXJ2aWNlLmZsYXR0ZW4ocGF5bG9hZCkpKSB7XG4gICAgICAgICAgICB1cmkuc2VhcmNoUGFyYW1zLmFwcGVuZChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3c/LmxvY2F0aW9uKSB7XG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVyaS50b1N0cmluZygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHVyaS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBwaG9uZSBzZXNzaW9uXG4gICAgICpcbiAgICAgKiBVc2UgdGhpcyBlbmRwb2ludCB0byBjcmVhdGUgYSBzZXNzaW9uIGZyb20gdG9rZW4uIFByb3ZpZGUgdGhlICoqdXNlcklkKiogYW5kICoqc2VjcmV0KiogcGFyYW1ldGVycyBmcm9tIHRoZSBzdWNjZXNzZnVsIHJlc3BvbnNlIG9mIGF1dGhlbnRpY2F0aW9uIGZsb3dzIGluaXRpYXRlZCBieSB0b2tlbiBjcmVhdGlvbi4gRm9yIGV4YW1wbGUsIG1hZ2ljIFVSTCBhbmQgcGhvbmUgbG9naW4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlY3JldFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5TZXNzaW9uPn1cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVQaG9uZVNlc3Npb24odXNlcklkOiBzdHJpbmcsIHNlY3JldDogc3RyaW5nKTogUHJvbWlzZTxTZXNzaW9uPiB7XG4gICAgICAgIGlmICh0eXBlb2YgdXNlcklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJ1c2VySWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2VjcmV0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJzZWNyZXRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvc2Vzc2lvbnMvcGhvbmUnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgdXNlcklkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndXNlcklkJ10gPSB1c2VySWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzZWNyZXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzZWNyZXQnXSA9IHNlY3JldDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwdXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHNlc3Npb25cbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHNlc3Npb24gZnJvbSB0b2tlbi4gUHJvdmlkZSB0aGUgKip1c2VySWQqKiBhbmQgKipzZWNyZXQqKiBwYXJhbWV0ZXJzIGZyb20gdGhlIHN1Y2Nlc3NmdWwgcmVzcG9uc2Ugb2YgYXV0aGVudGljYXRpb24gZmxvd3MgaW5pdGlhdGVkIGJ5IHRva2VuIGNyZWF0aW9uLiBGb3IgZXhhbXBsZSwgbWFnaWMgVVJMIGFuZCBwaG9uZSBsb2dpbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VjcmV0XG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlNlc3Npb24+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZVNlc3Npb24odXNlcklkOiBzdHJpbmcsIHNlY3JldDogc3RyaW5nKTogUHJvbWlzZTxTZXNzaW9uPiB7XG4gICAgICAgIGlmICh0eXBlb2YgdXNlcklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJ1c2VySWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2VjcmV0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJzZWNyZXRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvc2Vzc2lvbnMvdG9rZW4nO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgdXNlcklkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndXNlcklkJ10gPSB1c2VySWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzZWNyZXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzZWNyZXQnXSA9IHNlY3JldDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwb3N0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBzZXNzaW9uXG4gICAgICpcbiAgICAgKiBVc2UgdGhpcyBlbmRwb2ludCB0byBnZXQgYSBsb2dnZWQgaW4gdXNlciYjMDM5O3Mgc2Vzc2lvbiB1c2luZyBhIFNlc3Npb24gSUQuIElucHV0dGluZyAmIzAzOTtjdXJyZW50JiMwMzk7IHdpbGwgcmV0dXJuIHRoZSBjdXJyZW50IHNlc3Npb24gYmVpbmcgdXNlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uSWRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuU2Vzc2lvbj59XG4gICAgICovXG4gICAgYXN5bmMgZ2V0U2Vzc2lvbihzZXNzaW9uSWQ6IHN0cmluZyk6IFByb21pc2U8U2Vzc2lvbj4ge1xuICAgICAgICBpZiAodHlwZW9mIHNlc3Npb25JZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwic2Vzc2lvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9hY2NvdW50L3Nlc3Npb25zL3tzZXNzaW9uSWR9Jy5yZXBsYWNlKCd7c2Vzc2lvbklkfScsIHNlc3Npb25JZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZ2V0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBzZXNzaW9uXG4gICAgICpcbiAgICAgKiBVc2UgdGhpcyBlbmRwb2ludCB0byBleHRlbmQgYSBzZXNzaW9uJiMwMzk7cyBsZW5ndGguIEV4dGVuZGluZyBhIHNlc3Npb24gaXMgdXNlZnVsIHdoZW4gc2Vzc2lvbiBleHBpcnkgaXMgc2hvcnQuIElmIHRoZSBzZXNzaW9uIHdhcyBjcmVhdGVkIHVzaW5nIGFuIE9BdXRoIHByb3ZpZGVyLCB0aGlzIGVuZHBvaW50IHJlZnJlc2hlcyB0aGUgYWNjZXNzIHRva2VuIGZyb20gdGhlIHByb3ZpZGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25JZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5TZXNzaW9uPn1cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVTZXNzaW9uKHNlc3Npb25JZDogc3RyaW5nKTogUHJvbWlzZTxTZXNzaW9uPiB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2Vzc2lvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJzZXNzaW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvc2Vzc2lvbnMve3Nlc3Npb25JZH0nLnJlcGxhY2UoJ3tzZXNzaW9uSWR9Jywgc2Vzc2lvbklkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxldGUgc2Vzc2lvblxuICAgICAqXG4gICAgICogTG9nb3V0IHRoZSB1c2VyLiBVc2UgJiMwMzk7Y3VycmVudCYjMDM5OyBhcyB0aGUgc2Vzc2lvbiBJRCB0byBsb2dvdXQgb24gdGhpcyBkZXZpY2UsIHVzZSBhIHNlc3Npb24gSUQgdG8gbG9nb3V0IG9uIGFub3RoZXIgZGV2aWNlLiBJZiB5b3UmIzAzOTtyZSBsb29raW5nIHRvIGxvZ291dCB0aGUgdXNlciBvbiBhbGwgZGV2aWNlcywgdXNlIFtEZWxldGUgU2Vzc2lvbnNdKGh0dHBzOi8vYXBwY29uZGEuaW8vZG9jcy9yZWZlcmVuY2VzL2Nsb3VkL2NsaWVudC13ZWIvYWNjb3VudCNkZWxldGVTZXNzaW9ucykgaW5zdGVhZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uSWRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7fT59XG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlU2Vzc2lvbihzZXNzaW9uSWQ6IHN0cmluZyk6IFByb21pc2U8e30+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXNzaW9uSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInNlc3Npb25JZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC9zZXNzaW9ucy97c2Vzc2lvbklkfScucmVwbGFjZSgne3Nlc3Npb25JZH0nLCBzZXNzaW9uSWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2RlbGV0ZScsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgc3RhdHVzXG4gICAgICpcbiAgICAgKiBCbG9jayB0aGUgY3VycmVudGx5IGxvZ2dlZCBpbiB1c2VyIGFjY291bnQuIEJlaGluZCB0aGUgc2NlbmUsIHRoZSB1c2VyIHJlY29yZCBpcyBub3QgZGVsZXRlZCBidXQgcGVybWFuZW50bHkgYmxvY2tlZCBmcm9tIGFueSBhY2Nlc3MuIFRvIGNvbXBsZXRlbHkgZGVsZXRlIGEgdXNlciwgdXNlIHRoZSBVc2VycyBBUEkgaW5zdGVhZC5cbiAgICAgKlxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Vc2VyPFByZWZlcmVuY2VzPj59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlU3RhdHVzPFQgZXh0ZW5kcyBQcmVmZXJlbmNlcz4oKTogUHJvbWlzZTxVc2VyPFQ+PiB7XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvc3RhdHVzJztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgcHVzaCB0YXJnZXRcbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldElkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvdmlkZXJJZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFRhcmdldD59XG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlUHVzaFRhcmdldCh0YXJnZXRJZDogc3RyaW5nLCBpZGVudGlmaWVyOiBzdHJpbmcsIHByb3ZpZGVySWQ/OiBzdHJpbmcpOiBQcm9taXNlPFRhcmdldD4ge1xuICAgICAgICBpZiAodHlwZW9mIHRhcmdldElkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJ0YXJnZXRJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBpZGVudGlmaWVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJpZGVudGlmaWVyXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9hY2NvdW50L3RhcmdldHMvcHVzaCc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3RhcmdldElkJ10gPSB0YXJnZXRJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGlkZW50aWZpZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydpZGVudGlmaWVyJ10gPSBpZGVudGlmaWVyO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdmlkZXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3Byb3ZpZGVySWQnXSA9IHByb3ZpZGVySWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncG9zdCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgcHVzaCB0YXJnZXRcbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldElkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkZW50aWZpZXJcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUYXJnZXQ+fVxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZVB1c2hUYXJnZXQodGFyZ2V0SWQ6IHN0cmluZywgaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTxUYXJnZXQ+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidGFyZ2V0SWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgaWRlbnRpZmllciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiaWRlbnRpZmllclwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC90YXJnZXRzL3t0YXJnZXRJZH0vcHVzaCcucmVwbGFjZSgne3RhcmdldElkfScsIHRhcmdldElkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGlkZW50aWZpZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydpZGVudGlmaWVyJ10gPSBpZGVudGlmaWVyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3B1dCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxldGUgcHVzaCB0YXJnZXRcbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldElkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8e30+fVxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZVB1c2hUYXJnZXQodGFyZ2V0SWQ6IHN0cmluZyk6IFByb21pc2U8e30+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidGFyZ2V0SWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvdGFyZ2V0cy97dGFyZ2V0SWR9L3B1c2gnLnJlcGxhY2UoJ3t0YXJnZXRJZH0nLCB0YXJnZXRJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZGVsZXRlJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBlbWFpbCB0b2tlbiAoT1RQKVxuICAgICAqXG4gICAgICogU2VuZHMgdGhlIHVzZXIgYW4gZW1haWwgd2l0aCBhIHNlY3JldCBrZXkgZm9yIGNyZWF0aW5nIGEgc2Vzc2lvbi4gSWYgdGhlIHByb3ZpZGVkIHVzZXIgSUQgaGFzIG5vdCBiZSByZWdpc3RlcmVkLCBhIG5ldyB1c2VyIHdpbGwgYmUgY3JlYXRlZC4gVXNlIHRoZSByZXR1cm5lZCB1c2VyIElEIGFuZCBzZWNyZXQgYW5kIHN1Ym1pdCBhIHJlcXVlc3QgdG8gdGhlIFtQT1NUIC92MS9hY2NvdW50L3Nlc3Npb25zL3Rva2VuXShodHRwczovL2FwcGNvbmRhLmlvL2RvY3MvcmVmZXJlbmNlcy9jbG91ZC9jbGllbnQtd2ViL2FjY291bnQjY3JlYXRlU2Vzc2lvbikgZW5kcG9pbnQgdG8gY29tcGxldGUgdGhlIGxvZ2luIHByb2Nlc3MuIFRoZSBzZWNyZXQgc2VudCB0byB0aGUgdXNlciYjMDM5O3MgZW1haWwgaXMgdmFsaWQgZm9yIDE1IG1pbnV0ZXMuXG5cbkEgdXNlciBpcyBsaW1pdGVkIHRvIDEwIGFjdGl2ZSBzZXNzaW9ucyBhdCBhIHRpbWUgYnkgZGVmYXVsdC4gW0xlYXJuIG1vcmUgYWJvdXQgc2Vzc2lvbiBsaW1pdHNdKGh0dHBzOi8vYXBwY29uZGEuaW8vZG9jcy9hdXRoZW50aWNhdGlvbi1zZWN1cml0eSNsaW1pdHMpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBlbWFpbFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcGhyYXNlXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlRva2VuPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVFbWFpbFRva2VuKHVzZXJJZDogc3RyaW5nLCBlbWFpbDogc3RyaW5nLCBwaHJhc2U/OiBib29sZWFuKTogUHJvbWlzZTxUb2tlbj4ge1xuICAgICAgICBpZiAodHlwZW9mIHVzZXJJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidXNlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVtYWlsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJlbWFpbFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC90b2tlbnMvZW1haWwnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgdXNlcklkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndXNlcklkJ10gPSB1c2VySWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBlbWFpbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2VtYWlsJ10gPSBlbWFpbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBocmFzZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3BocmFzZSddID0gcGhyYXNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIG1hZ2ljIFVSTCB0b2tlblxuICAgICAqXG4gICAgICogU2VuZHMgdGhlIHVzZXIgYW4gZW1haWwgd2l0aCBhIHNlY3JldCBrZXkgZm9yIGNyZWF0aW5nIGEgc2Vzc2lvbi4gSWYgdGhlIHByb3ZpZGVkIHVzZXIgSUQgaGFzIG5vdCBiZWVuIHJlZ2lzdGVyZWQsIGEgbmV3IHVzZXIgd2lsbCBiZSBjcmVhdGVkLiBXaGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgbGluayBpbiB0aGUgZW1haWwsIHRoZSB1c2VyIGlzIHJlZGlyZWN0ZWQgYmFjayB0byB0aGUgVVJMIHlvdSBwcm92aWRlZCB3aXRoIHRoZSBzZWNyZXQga2V5IGFuZCB1c2VySWQgdmFsdWVzIGF0dGFjaGVkIHRvIHRoZSBVUkwgcXVlcnkgc3RyaW5nLiBVc2UgdGhlIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzIHRvIHN1Ym1pdCBhIHJlcXVlc3QgdG8gdGhlIFtQT1NUIC92MS9hY2NvdW50L3Nlc3Npb25zL3Rva2VuXShodHRwczovL2FwcGNvbmRhLmlvL2RvY3MvcmVmZXJlbmNlcy9jbG91ZC9jbGllbnQtd2ViL2FjY291bnQjY3JlYXRlU2Vzc2lvbikgZW5kcG9pbnQgdG8gY29tcGxldGUgdGhlIGxvZ2luIHByb2Nlc3MuIFRoZSBsaW5rIHNlbnQgdG8gdGhlIHVzZXImIzAzOTtzIGVtYWlsIGFkZHJlc3MgaXMgdmFsaWQgZm9yIDEgaG91ci4gSWYgeW91IGFyZSBvbiBhIG1vYmlsZSBkZXZpY2UgeW91IGNhbiBsZWF2ZSB0aGUgVVJMIHBhcmFtZXRlciBlbXB0eSwgc28gdGhhdCB0aGUgbG9naW4gY29tcGxldGlvbiB3aWxsIGJlIGhhbmRsZWQgYnkgeW91ciBBcHBjb25kYSBpbnN0YW5jZSBieSBkZWZhdWx0LlxuXG5BIHVzZXIgaXMgbGltaXRlZCB0byAxMCBhY3RpdmUgc2Vzc2lvbnMgYXQgYSB0aW1lIGJ5IGRlZmF1bHQuIFtMZWFybiBtb3JlIGFib3V0IHNlc3Npb24gbGltaXRzXShodHRwczovL2FwcGNvbmRhLmlvL2RvY3MvYXV0aGVudGljYXRpb24tc2VjdXJpdHkjbGltaXRzKS5cblxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBlbWFpbFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHBocmFzZVxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Ub2tlbj59XG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlTWFnaWNVUkxUb2tlbih1c2VySWQ6IHN0cmluZywgZW1haWw6IHN0cmluZywgdXJsPzogc3RyaW5nLCBwaHJhc2U/OiBib29sZWFuKTogUHJvbWlzZTxUb2tlbj4ge1xuICAgICAgICBpZiAodHlwZW9mIHVzZXJJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidXNlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVtYWlsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJlbWFpbFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC90b2tlbnMvbWFnaWMtdXJsJztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHVzZXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3VzZXJJZCddID0gdXNlcklkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW1haWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbWFpbCddID0gZW1haWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB1cmwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd1cmwnXSA9IHVybDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBocmFzZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3BocmFzZSddID0gcGhyYXNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIE9BdXRoMiB0b2tlblxuICAgICAqXG4gICAgICogQWxsb3cgdGhlIHVzZXIgdG8gbG9naW4gdG8gdGhlaXIgYWNjb3VudCB1c2luZyB0aGUgT0F1dGgyIHByb3ZpZGVyIG9mIHRoZWlyIGNob2ljZS4gRWFjaCBPQXV0aDIgcHJvdmlkZXIgc2hvdWxkIGJlIGVuYWJsZWQgZnJvbSB0aGUgQXBwY29uZGEgY29uc29sZSBmaXJzdC4gVXNlIHRoZSBzdWNjZXNzIGFuZCBmYWlsdXJlIGFyZ3VtZW50cyB0byBwcm92aWRlIGEgcmVkaXJlY3QgVVJMJiMwMzk7cyBiYWNrIHRvIHlvdXIgYXBwIHdoZW4gbG9naW4gaXMgY29tcGxldGVkLiBcblxuSWYgYXV0aGVudGljYXRpb24gc3VjY2VlZHMsIGB1c2VySWRgIGFuZCBgc2VjcmV0YCBvZiBhIHRva2VuIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIHN1Y2Nlc3MgVVJMIGFzIHF1ZXJ5IHBhcmFtZXRlcnMuIFRoZXNlIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBzZXNzaW9uIHVzaW5nIHRoZSBbQ3JlYXRlIHNlc3Npb25dKGh0dHBzOi8vYXBwY29uZGEuaW8vZG9jcy9yZWZlcmVuY2VzL2Nsb3VkL2NsaWVudC13ZWIvYWNjb3VudCNjcmVhdGVTZXNzaW9uKSBlbmRwb2ludC5cblxuQSB1c2VyIGlzIGxpbWl0ZWQgdG8gMTAgYWN0aXZlIHNlc3Npb25zIGF0IGEgdGltZSBieSBkZWZhdWx0LiBbTGVhcm4gbW9yZSBhYm91dCBzZXNzaW9uIGxpbWl0c10oaHR0cHM6Ly9hcHBjb25kYS5pby9kb2NzL2F1dGhlbnRpY2F0aW9uLXNlY3VyaXR5I2xpbWl0cykuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09BdXRoUHJvdmlkZXJ9IHByb3ZpZGVyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN1Y2Nlc3NcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZmFpbHVyZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHNjb3Blc1xuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQgfCBzdHJpbmc+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZU9BdXRoMlRva2VuKHByb3ZpZGVyOiBPQXV0aFByb3ZpZGVyLCBzdWNjZXNzPzogc3RyaW5nLCBmYWlsdXJlPzogc3RyaW5nLCBzY29wZXM/OiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZCB8IHN0cmluZz4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb3ZpZGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm92aWRlclwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC90b2tlbnMvb2F1dGgyL3twcm92aWRlcn0nLnJlcGxhY2UoJ3twcm92aWRlcn0nLCBwcm92aWRlcik7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBzdWNjZXNzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc3VjY2VzcyddID0gc3VjY2VzcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGZhaWx1cmUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydmYWlsdXJlJ10gPSBmYWlsdXJlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2NvcGVzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc2NvcGVzJ10gPSBzY29wZXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHBheWxvYWRbJ3Byb2plY3QnXSA9IHRoaXMuY2xpZW50LmNvbmZpZy5wcm9qZWN0O1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhTZXJ2aWNlLmZsYXR0ZW4ocGF5bG9hZCkpKSB7XG4gICAgICAgICAgICB1cmkuc2VhcmNoUGFyYW1zLmFwcGVuZChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3c/LmxvY2F0aW9uKSB7XG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVyaS50b1N0cmluZygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHVyaS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBwaG9uZSB0b2tlblxuICAgICAqXG4gICAgICogU2VuZHMgdGhlIHVzZXIgYW4gU01TIHdpdGggYSBzZWNyZXQga2V5IGZvciBjcmVhdGluZyBhIHNlc3Npb24uIElmIHRoZSBwcm92aWRlZCB1c2VyIElEIGhhcyBub3QgYmUgcmVnaXN0ZXJlZCwgYSBuZXcgdXNlciB3aWxsIGJlIGNyZWF0ZWQuIFVzZSB0aGUgcmV0dXJuZWQgdXNlciBJRCBhbmQgc2VjcmV0IGFuZCBzdWJtaXQgYSByZXF1ZXN0IHRvIHRoZSBbUE9TVCAvdjEvYWNjb3VudC9zZXNzaW9ucy90b2tlbl0oaHR0cHM6Ly9hcHBjb25kYS5pby9kb2NzL3JlZmVyZW5jZXMvY2xvdWQvY2xpZW50LXdlYi9hY2NvdW50I2NyZWF0ZVNlc3Npb24pIGVuZHBvaW50IHRvIGNvbXBsZXRlIHRoZSBsb2dpbiBwcm9jZXNzLiBUaGUgc2VjcmV0IHNlbnQgdG8gdGhlIHVzZXImIzAzOTtzIHBob25lIGlzIHZhbGlkIGZvciAxNSBtaW51dGVzLlxuXG5BIHVzZXIgaXMgbGltaXRlZCB0byAxMCBhY3RpdmUgc2Vzc2lvbnMgYXQgYSB0aW1lIGJ5IGRlZmF1bHQuIFtMZWFybiBtb3JlIGFib3V0IHNlc3Npb24gbGltaXRzXShodHRwczovL2FwcGNvbmRhLmlvL2RvY3MvYXV0aGVudGljYXRpb24tc2VjdXJpdHkjbGltaXRzKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGhvbmVcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuVG9rZW4+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZVBob25lVG9rZW4odXNlcklkOiBzdHJpbmcsIHBob25lOiBzdHJpbmcpOiBQcm9taXNlPFRva2VuPiB7XG4gICAgICAgIGlmICh0eXBlb2YgdXNlcklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJ1c2VySWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcGhvbmUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInBob25lXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9hY2NvdW50L3Rva2Vucy9waG9uZSc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiB1c2VySWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd1c2VySWQnXSA9IHVzZXJJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBob25lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncGhvbmUnXSA9IHBob25lO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGVtYWlsIHZlcmlmaWNhdGlvblxuICAgICAqXG4gICAgICogVXNlIHRoaXMgZW5kcG9pbnQgdG8gc2VuZCBhIHZlcmlmaWNhdGlvbiBtZXNzYWdlIHRvIHlvdXIgdXNlciBlbWFpbCBhZGRyZXNzIHRvIGNvbmZpcm0gdGhleSBhcmUgdGhlIHZhbGlkIG93bmVycyBvZiB0aGF0IGFkZHJlc3MuIEJvdGggdGhlICoqdXNlcklkKiogYW5kICoqc2VjcmV0KiogYXJndW1lbnRzIHdpbGwgYmUgcGFzc2VkIGFzIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gdGhlIFVSTCB5b3UgaGF2ZSBwcm92aWRlZCB0byBiZSBhdHRhY2hlZCB0byB0aGUgdmVyaWZpY2F0aW9uIGVtYWlsLiBUaGUgcHJvdmlkZWQgVVJMIHNob3VsZCByZWRpcmVjdCB0aGUgdXNlciBiYWNrIHRvIHlvdXIgYXBwIGFuZCBhbGxvdyB5b3UgdG8gY29tcGxldGUgdGhlIHZlcmlmaWNhdGlvbiBwcm9jZXNzIGJ5IHZlcmlmeWluZyBib3RoIHRoZSAqKnVzZXJJZCoqIGFuZCAqKnNlY3JldCoqIHBhcmFtZXRlcnMuIExlYXJuIG1vcmUgYWJvdXQgaG93IHRvIFtjb21wbGV0ZSB0aGUgdmVyaWZpY2F0aW9uIHByb2Nlc3NdKGh0dHBzOi8vYXBwY29uZGEuaW8vZG9jcy9yZWZlcmVuY2VzL2Nsb3VkL2NsaWVudC13ZWIvYWNjb3VudCN1cGRhdGVWZXJpZmljYXRpb24pLiBUaGUgdmVyaWZpY2F0aW9uIGxpbmsgc2VudCB0byB0aGUgdXNlciYjMDM5O3MgZW1haWwgYWRkcmVzcyBpcyB2YWxpZCBmb3IgNyBkYXlzLlxuXG5QbGVhc2Ugbm90ZSB0aGF0IGluIG9yZGVyIHRvIGF2b2lkIGEgW1JlZGlyZWN0IEF0dGFja10oaHR0cHM6Ly9naXRodWIuY29tL09XQVNQL0NoZWF0U2hlZXRTZXJpZXMvYmxvYi9tYXN0ZXIvY2hlYXRzaGVldHMvVW52YWxpZGF0ZWRfUmVkaXJlY3RzX2FuZF9Gb3J3YXJkc19DaGVhdF9TaGVldC5tZCksIHRoZSBvbmx5IHZhbGlkIHJlZGlyZWN0IFVSTHMgYXJlIHRoZSBvbmVzIGZyb20gZG9tYWlucyB5b3UgaGF2ZSBzZXQgd2hlbiBhZGRpbmcgeW91ciBwbGF0Zm9ybXMgaW4gdGhlIGNvbnNvbGUgaW50ZXJmYWNlLlxuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlRva2VuPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVWZXJpZmljYXRpb24odXJsOiBzdHJpbmcsIGJvZHk6IHN0cmluZyk6IFByb21pc2U8VG9rZW4+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB1cmwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInVybFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC92ZXJpZmljYXRpb24nO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgdXJsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndXJsJ10gPSB1cmw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBib2R5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnYm9keSddID0gYm9keTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwb3N0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBlbWFpbCB2ZXJpZmljYXRpb24gKGNvbmZpcm1hdGlvbilcbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIGVuZHBvaW50IHRvIGNvbXBsZXRlIHRoZSB1c2VyIGVtYWlsIHZlcmlmaWNhdGlvbiBwcm9jZXNzLiBVc2UgYm90aCB0aGUgKip1c2VySWQqKiBhbmQgKipzZWNyZXQqKiBwYXJhbWV0ZXJzIHRoYXQgd2VyZSBhdHRhY2hlZCB0byB5b3VyIGFwcCBVUkwgdG8gdmVyaWZ5IHRoZSB1c2VyIGVtYWlsIG93bmVyc2hpcC4gSWYgY29uZmlybWVkIHRoaXMgcm91dGUgd2lsbCByZXR1cm4gYSAyMDAgc3RhdHVzIGNvZGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlY3JldFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Ub2tlbj59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlVmVyaWZpY2F0aW9uKHVzZXJJZDogc3RyaW5nLCBzZWNyZXQ6IHN0cmluZyk6IFByb21pc2U8VG9rZW4+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB1c2VySWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInVzZXJJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzZWNyZXQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInNlY3JldFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC92ZXJpZmljYXRpb24nO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgdXNlcklkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndXNlcklkJ10gPSB1c2VySWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzZWNyZXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzZWNyZXQnXSA9IHNlY3JldDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwdXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHBob25lIHZlcmlmaWNhdGlvblxuICAgICAqXG4gICAgICogVXNlIHRoaXMgZW5kcG9pbnQgdG8gc2VuZCBhIHZlcmlmaWNhdGlvbiBTTVMgdG8gdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlci4gVGhpcyBlbmRwb2ludCBpcyBtZWFudCBmb3IgdXNlIGFmdGVyIHVwZGF0aW5nIGEgdXNlciYjMDM5O3MgcGhvbmUgbnVtYmVyIHVzaW5nIHRoZSBbYWNjb3VudFVwZGF0ZVBob25lXShodHRwczovL2FwcGNvbmRhLmlvL2RvY3MvcmVmZXJlbmNlcy9jbG91ZC9jbGllbnQtd2ViL2FjY291bnQjdXBkYXRlUGhvbmUpIGVuZHBvaW50LiBMZWFybiBtb3JlIGFib3V0IGhvdyB0byBbY29tcGxldGUgdGhlIHZlcmlmaWNhdGlvbiBwcm9jZXNzXShodHRwczovL2FwcGNvbmRhLmlvL2RvY3MvcmVmZXJlbmNlcy9jbG91ZC9jbGllbnQtd2ViL2FjY291bnQjdXBkYXRlUGhvbmVWZXJpZmljYXRpb24pLiBUaGUgdmVyaWZpY2F0aW9uIGNvZGUgc2VudCB0byB0aGUgdXNlciYjMDM5O3MgcGhvbmUgbnVtYmVyIGlzIHZhbGlkIGZvciAxNSBtaW51dGVzLlxuICAgICAqXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlRva2VuPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVQaG9uZVZlcmlmaWNhdGlvbigpOiBQcm9taXNlPFRva2VuPiB7XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvdmVyaWZpY2F0aW9uL3Bob25lJztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwb3N0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBwaG9uZSB2ZXJpZmljYXRpb24gKGNvbmZpcm1hdGlvbilcbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIGVuZHBvaW50IHRvIGNvbXBsZXRlIHRoZSB1c2VyIHBob25lIHZlcmlmaWNhdGlvbiBwcm9jZXNzLiBVc2UgdGhlICoqdXNlcklkKiogYW5kICoqc2VjcmV0KiogdGhhdCB3ZXJlIHNlbnQgdG8geW91ciB1c2VyJiMwMzk7cyBwaG9uZSBudW1iZXIgdG8gdmVyaWZ5IHRoZSB1c2VyIGVtYWlsIG93bmVyc2hpcC4gSWYgY29uZmlybWVkIHRoaXMgcm91dGUgd2lsbCByZXR1cm4gYSAyMDAgc3RhdHVzIGNvZGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlY3JldFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Ub2tlbj59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlUGhvbmVWZXJpZmljYXRpb24odXNlcklkOiBzdHJpbmcsIHNlY3JldDogc3RyaW5nKTogUHJvbWlzZTxUb2tlbj4ge1xuICAgICAgICBpZiAodHlwZW9mIHVzZXJJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidXNlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlY3JldCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwic2VjcmV0XCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9hY2NvdW50L3ZlcmlmaWNhdGlvbi9waG9uZSc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiB1c2VySWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd1c2VySWQnXSA9IHVzZXJJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlY3JldCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3NlY3JldCddID0gc2VjcmV0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3B1dCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbn1cbiJdfQ==