@nlabs/reaktor 0.10.0 → 0.10.2

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 (448) hide show
  1. package/.env +1 -0
  2. package/.env.example +1 -0
  3. package/DATABASE_I18N_GUIDE.md +434 -0
  4. package/TEST_UTILITIES_GUIDE.md +360 -0
  5. package/coverage/actions/index.html +21 -36
  6. package/coverage/actions/notifications.ts.html +223 -0
  7. package/coverage/actions/posts.ts.html +2356 -0
  8. package/coverage/adapters/arangoAdapter.ts.html +170 -20
  9. package/coverage/adapters/fileAdapter.ts.html +445 -0
  10. package/coverage/adapters/index.html +72 -42
  11. package/coverage/adapters/postAdapter.ts.html +436 -0
  12. package/coverage/adapters/reaktorAdapter.ts.html +201 -18
  13. package/coverage/adapters/tagAdapter.ts.html +274 -25
  14. package/coverage/adapters/userAdapter.ts.html +829 -0
  15. package/coverage/analyticsUtils.ts.html +286 -0
  16. package/coverage/config.ts.html +766 -0
  17. package/coverage/index.html +77 -77
  18. package/coverage/mocks/group.ts.html +5 -5
  19. package/coverage/mocks/image.ts.html +18 -12
  20. package/coverage/mocks/index.html +37 -7
  21. package/coverage/mocks/post.ts.html +8 -8
  22. package/coverage/mocks/tag.ts.html +2 -2
  23. package/coverage/mocks/user.ts.html +18 -15
  24. package/coverage/testUtils.ts.html +1309 -0
  25. package/coverage/translationQueue.ts.html +592 -0
  26. package/coverage/types/error.types.ts.html +148 -0
  27. package/coverage/types/index.html +2 -2
  28. package/coverage/utils/adapterUtils.ts.html +39 -27
  29. package/coverage/utils/analyticsUtils.ts.html +35 -41
  30. package/coverage/utils/authUtils.ts.html +328 -0
  31. package/coverage/utils/dbI18n.ts.html +280 -0
  32. package/coverage/utils/googleTranslate.ts.html +385 -0
  33. package/coverage/utils/index.html +29 -44
  34. package/coverage/utils/localeUtils.ts.html +193 -0
  35. package/coverage/utils/sessionUtils.ts.html +211 -0
  36. package/coverage/utils/testUtils.ts.html +1309 -0
  37. package/index.js +1 -1
  38. package/lex.config.mjs +34 -0
  39. package/lib/actions/apps.d.ts +4 -4
  40. package/lib/actions/apps.js +17 -239
  41. package/lib/actions/connections.d.ts +2 -1
  42. package/lib/actions/connections.js +6 -89
  43. package/lib/actions/content.d.ts +13 -0
  44. package/lib/actions/content.js +17 -0
  45. package/lib/actions/conversations.d.ts +4 -2
  46. package/lib/actions/conversations.js +19 -336
  47. package/lib/actions/dynamodb.d.ts +4 -0
  48. package/lib/actions/dynamodb.js +2 -150
  49. package/lib/actions/email.d.ts +5 -2
  50. package/lib/actions/email.js +2 -152
  51. package/lib/actions/files.d.ts +3 -3
  52. package/lib/actions/files.js +5 -283
  53. package/lib/actions/groups.d.ts +4 -5
  54. package/lib/actions/groups.js +19 -259
  55. package/lib/actions/images.d.ts +8 -1
  56. package/lib/actions/images.js +31 -700
  57. package/lib/actions/index.d.ts +27 -23
  58. package/lib/actions/index.js +2 -66
  59. package/lib/actions/ios.d.ts +3 -3
  60. package/lib/actions/ios.js +9 -162
  61. package/lib/actions/locations.d.ts +3 -3
  62. package/lib/actions/locations.js +7 -122
  63. package/lib/actions/messages.d.ts +3 -4
  64. package/lib/actions/messages.js +21 -196
  65. package/lib/actions/notifications.d.ts +5 -1
  66. package/lib/actions/notifications.js +2 -59
  67. package/lib/actions/payments.d.ts +3 -1
  68. package/lib/actions/payments.js +11 -464
  69. package/lib/actions/posts.d.ts +7 -4
  70. package/lib/actions/posts.js +75 -527
  71. package/lib/actions/profiles.d.ts +4 -0
  72. package/lib/actions/profiles.js +8 -0
  73. package/lib/actions/reactions.d.ts +3 -1
  74. package/lib/actions/reactions.js +25 -312
  75. package/lib/actions/s3.d.ts +4 -0
  76. package/lib/actions/s3.js +2 -133
  77. package/lib/actions/search.d.ts +2 -2
  78. package/lib/actions/search.js +5 -90
  79. package/lib/actions/sms.d.ts +2 -9
  80. package/lib/actions/sms.js +2 -108
  81. package/lib/actions/statistics.d.ts +2 -1
  82. package/lib/actions/statistics.js +6 -60
  83. package/lib/actions/{subscription.d.ts → subscriptions.d.ts} +2 -2
  84. package/lib/actions/subscriptions.js +12 -0
  85. package/lib/actions/tags.d.ts +3 -3
  86. package/lib/actions/tags.js +19 -287
  87. package/lib/actions/users.d.ts +13 -12
  88. package/lib/actions/users.js +66 -763
  89. package/lib/actions/websockets.d.ts +2 -2
  90. package/lib/actions/websockets.js +14 -158
  91. package/lib/adapters/arangoAdapter.d.ts +7 -1
  92. package/lib/adapters/arangoAdapter.js +2 -46
  93. package/lib/adapters/contentAdapter.d.ts +8 -0
  94. package/lib/adapters/contentAdapter.js +2 -0
  95. package/lib/adapters/fileAdapter.d.ts +8 -2
  96. package/lib/adapters/fileAdapter.js +2 -76
  97. package/lib/adapters/imageAdapter.d.ts +7 -1
  98. package/lib/adapters/imageAdapter.js +2 -40
  99. package/lib/adapters/index.d.ts +9 -0
  100. package/lib/adapters/index.js +2 -0
  101. package/lib/adapters/messageAdapter.d.ts +7 -1
  102. package/lib/adapters/messageAdapter.js +2 -49
  103. package/lib/adapters/postAdapter.d.ts +7 -1
  104. package/lib/adapters/postAdapter.js +2 -70
  105. package/lib/adapters/reaktorAdapter.d.ts +16 -6
  106. package/lib/adapters/reaktorAdapter.js +2 -44
  107. package/lib/adapters/tagAdapter.d.ts +8 -1
  108. package/lib/adapters/tagAdapter.js +2 -50
  109. package/lib/adapters/userAdapter.d.ts +12 -1
  110. package/lib/adapters/userAdapter.js +2 -115
  111. package/lib/config.d.ts +43 -6
  112. package/lib/config.js +2 -125
  113. package/lib/handlers/graphqlHandler.d.ts +4 -0
  114. package/lib/handlers/graphqlHandler.js +2 -0
  115. package/lib/index.d.ts +17 -10
  116. package/lib/index.js +2 -66
  117. package/lib/lambdas/actions/websockets.d.ts +3 -3
  118. package/lib/lambdas/actions/websockets.js +14 -116
  119. package/lib/lambdas/authorizer.js +2 -67
  120. package/lib/lambdas/connection.js +2 -91
  121. package/lib/lambdas/utils/message.js +2 -42
  122. package/lib/lambdas/utils/websocket.js +2 -105
  123. package/lib/mocks/conversation.js +2 -35
  124. package/lib/mocks/file.js +2 -38
  125. package/lib/mocks/group.js +2 -47
  126. package/lib/mocks/image.d.ts +1 -1
  127. package/lib/mocks/image.js +2 -44
  128. package/lib/mocks/post.js +2 -55
  129. package/lib/mocks/tag.d.ts +1 -1
  130. package/lib/mocks/tag.js +2 -37
  131. package/lib/mocks/user.d.ts +1 -1
  132. package/lib/mocks/user.js +2 -88
  133. package/lib/mutations/content.d.ts +2 -0
  134. package/lib/mutations/content.js +2 -0
  135. package/lib/mutations/index.d.ts +11 -3
  136. package/lib/mutations/index.js +2 -26
  137. package/lib/mutations/locations.d.ts +1 -1
  138. package/lib/mutations/locations.js +2 -44
  139. package/lib/mutations/messages.d.ts +1 -1
  140. package/lib/mutations/messages.js +2 -86
  141. package/lib/mutations/posts.d.ts +1 -1
  142. package/lib/mutations/posts.js +2 -53
  143. package/lib/mutations/profiles.d.ts +2 -0
  144. package/lib/mutations/profiles.js +2 -0
  145. package/lib/mutations/reactions.d.ts +1 -1
  146. package/lib/mutations/reactions.js +2 -51
  147. package/lib/mutations/statistics.d.ts +1 -1
  148. package/lib/mutations/statistics.js +2 -39
  149. package/lib/mutations/subscriptions.d.ts +1 -1
  150. package/lib/mutations/subscriptions.js +2 -56
  151. package/lib/mutations/tags.d.ts +1 -1
  152. package/lib/mutations/tags.js +2 -120
  153. package/lib/mutations/users.js +2 -116
  154. package/lib/objectTypes/app.js +2 -173
  155. package/lib/objectTypes/bankAccount.js +2 -76
  156. package/lib/objectTypes/connection.js +2 -48
  157. package/lib/objectTypes/content.d.ts +2 -0
  158. package/lib/objectTypes/content.js +2 -0
  159. package/lib/objectTypes/conversation.js +2 -77
  160. package/lib/objectTypes/creditCard.js +2 -86
  161. package/lib/objectTypes/document.js +2 -46
  162. package/lib/objectTypes/error.js +2 -46
  163. package/lib/objectTypes/external.js +2 -74
  164. package/lib/objectTypes/file.js +2 -100
  165. package/lib/objectTypes/filter.js +2 -43
  166. package/lib/objectTypes/group.js +2 -123
  167. package/lib/objectTypes/iapSubscription.js +2 -40
  168. package/lib/objectTypes/image.d.ts +4 -0
  169. package/lib/objectTypes/image.js +2 -129
  170. package/lib/objectTypes/index.d.ts +26 -24
  171. package/lib/objectTypes/index.js +2 -68
  172. package/lib/objectTypes/location.js +2 -109
  173. package/lib/objectTypes/message.js +2 -96
  174. package/lib/objectTypes/passcode.js +2 -42
  175. package/lib/objectTypes/plan.js +2 -95
  176. package/lib/objectTypes/post.js +2 -125
  177. package/lib/objectTypes/profile.d.ts +3 -0
  178. package/lib/objectTypes/profile.js +2 -0
  179. package/lib/objectTypes/reaction.js +2 -61
  180. package/lib/objectTypes/relation.js +2 -49
  181. package/lib/objectTypes/search.js +2 -72
  182. package/lib/objectTypes/statistics.js +2 -39
  183. package/lib/objectTypes/subscription.js +2 -117
  184. package/lib/objectTypes/tag.js +2 -65
  185. package/lib/objectTypes/user.js +2 -144
  186. package/lib/queries/content.d.ts +2 -0
  187. package/lib/queries/content.js +2 -0
  188. package/lib/queries/index.d.ts +10 -3
  189. package/lib/queries/index.js +2 -33
  190. package/lib/queries/locations.d.ts +1 -1
  191. package/lib/queries/locations.js +2 -45
  192. package/lib/queries/messages.d.ts +1 -1
  193. package/lib/queries/messages.js +2 -52
  194. package/lib/queries/posts.d.ts +1 -1
  195. package/lib/queries/posts.js +2 -154
  196. package/lib/queries/reactions.d.ts +1 -1
  197. package/lib/queries/reactions.js +2 -56
  198. package/lib/queries/statistics.d.ts +1 -1
  199. package/lib/queries/statistics.js +2 -39
  200. package/lib/queries/subscriptions.d.ts +1 -1
  201. package/lib/queries/subscriptions.js +2 -44
  202. package/lib/queries/tags.d.ts +1 -1
  203. package/lib/queries/tags.js +2 -75
  204. package/lib/queries/users.js +2 -64
  205. package/lib/templates/email/layout.js +3 -25
  206. package/lib/templates/email/passwordForgot.js +3 -25
  207. package/lib/templates/email/passwordRecovery.js +3 -25
  208. package/lib/templates/email/verifyEmail.js +3 -25
  209. package/lib/templates/email/welcome.js +3 -25
  210. package/lib/templates/sms/passwordForgot.js +2 -24
  211. package/lib/templates/sms/passwordRecovery.js +2 -24
  212. package/lib/templates/sms/verifyEmail.js +2 -24
  213. package/lib/templates/sms/verifyPhone.js +2 -24
  214. package/lib/templates/sms/welcome.js +2 -24
  215. package/lib/types/apps.types.d.ts +6 -2
  216. package/lib/types/apps.types.js +2 -32
  217. package/lib/types/arangodb.types.d.ts +8 -4
  218. package/lib/types/arangodb.types.js +1 -16
  219. package/lib/types/auth.types.d.ts +11 -5
  220. package/lib/types/auth.types.js +1 -16
  221. package/lib/types/connections.types.d.ts +5 -1
  222. package/lib/types/connections.types.js +1 -16
  223. package/lib/types/content.types.d.ts +31 -0
  224. package/lib/types/content.types.js +1 -0
  225. package/lib/types/conversations.types.d.ts +6 -2
  226. package/lib/types/conversations.types.js +1 -16
  227. package/lib/types/email.types.d.ts +9 -5
  228. package/lib/types/email.types.js +1 -16
  229. package/lib/types/error.types.d.ts +1 -0
  230. package/lib/types/error.types.js +2 -44
  231. package/lib/types/files.types.d.ts +5 -1
  232. package/lib/types/files.types.js +1 -16
  233. package/lib/types/google.types.d.ts +4 -0
  234. package/lib/types/google.types.js +1 -16
  235. package/lib/types/groups.types.d.ts +5 -1
  236. package/lib/types/groups.types.js +1 -16
  237. package/lib/types/images.types.d.ts +6 -2
  238. package/lib/types/images.types.js +1 -16
  239. package/lib/types/index.d.ts +26 -20
  240. package/lib/types/index.js +2 -60
  241. package/lib/types/locations.types.d.ts +5 -1
  242. package/lib/types/locations.types.js +1 -16
  243. package/lib/types/messages.types.d.ts +7 -3
  244. package/lib/types/messages.types.js +1 -16
  245. package/lib/types/notifications.types.d.ts +9 -5
  246. package/lib/types/notifications.types.js +1 -16
  247. package/lib/types/payments.types.d.ts +5 -1
  248. package/lib/types/payments.types.js +1 -16
  249. package/lib/types/posts.types.d.ts +7 -3
  250. package/lib/types/posts.types.js +1 -16
  251. package/lib/types/{personas.types.d.ts → profiles.types.d.ts} +3 -15
  252. package/lib/types/profiles.types.js +1 -0
  253. package/lib/types/statistics.types.js +1 -16
  254. package/lib/types/tags.types.d.ts +5 -1
  255. package/lib/types/tags.types.js +1 -16
  256. package/lib/types/users.types.d.ts +41 -10
  257. package/lib/types/users.types.js +1 -16
  258. package/lib/types/websockets.types.d.ts +5 -1
  259. package/lib/types/websockets.types.js +1 -16
  260. package/lib/utils/adapterUtils.d.ts +4 -0
  261. package/lib/utils/adapterUtils.js +2 -45
  262. package/lib/utils/analyticsUtils.d.ts +5 -1
  263. package/lib/utils/analyticsUtils.js +2 -72
  264. package/lib/utils/arangodbUtils.d.ts +6 -2
  265. package/lib/utils/arangodbUtils.js +5 -163
  266. package/lib/utils/{auth.d.ts → authUtils.d.ts} +3 -1
  267. package/lib/utils/authUtils.js +2 -0
  268. package/lib/utils/contextUtils.d.ts +3 -0
  269. package/lib/utils/contextUtils.js +2 -0
  270. package/lib/utils/dbI18n.d.ts +10 -0
  271. package/lib/utils/dbI18n.example.d.ts +20 -0
  272. package/lib/utils/dbI18n.example.js +6 -0
  273. package/lib/utils/dbI18n.js +2 -0
  274. package/lib/utils/googleTranslate.d.ts +6 -0
  275. package/lib/utils/googleTranslate.js +2 -0
  276. package/lib/utils/graphqlUtils.d.ts +10 -0
  277. package/lib/utils/graphqlUtils.js +2 -0
  278. package/lib/utils/index.d.ts +18 -5
  279. package/lib/utils/index.js +2 -30
  280. package/lib/utils/languageDetection.d.ts +8 -0
  281. package/lib/utils/languageDetection.js +2 -0
  282. package/lib/utils/localeUtils.d.ts +11 -0
  283. package/lib/utils/localeUtils.example.d.ts +5 -0
  284. package/lib/utils/localeUtils.example.js +2 -0
  285. package/lib/utils/localeUtils.js +2 -0
  286. package/lib/utils/middlewareUtils.d.ts +2 -0
  287. package/lib/utils/middlewareUtils.js +2 -0
  288. package/lib/utils/{session.d.ts → sessionUtils.d.ts} +1 -1
  289. package/lib/utils/sessionUtils.js +2 -0
  290. package/lib/utils/stripeUtils.d.ts +7 -3
  291. package/lib/utils/stripeUtils.js +2 -43
  292. package/lib/utils/templateUtils.d.ts +3 -0
  293. package/lib/utils/templateUtils.js +2 -0
  294. package/lib/utils/testUtils.d.ts +95 -0
  295. package/lib/utils/testUtils.js +2 -0
  296. package/lib/utils/translationQueue.d.ts +29 -0
  297. package/lib/utils/translationQueue.example.d.ts +33 -0
  298. package/lib/utils/translationQueue.example.js +2 -0
  299. package/lib/utils/translationQueue.js +2 -0
  300. package/package.json +32 -28
  301. package/tsconfig.build.json +21 -0
  302. package/tsconfig.lint.json +33 -0
  303. package/tsconfig.test.json +31 -0
  304. package/.prettierrc.js +0 -4
  305. package/dist/actions/apps.js +0 -242
  306. package/dist/actions/connections.js +0 -90
  307. package/dist/actions/conversations.js +0 -350
  308. package/dist/actions/dynamodb.js +0 -150
  309. package/dist/actions/email.js +0 -152
  310. package/dist/actions/files.js +0 -283
  311. package/dist/actions/groups.js +0 -292
  312. package/dist/actions/images.js +0 -735
  313. package/dist/actions/index.js +0 -66
  314. package/dist/actions/ios.js +0 -164
  315. package/dist/actions/locations.js +0 -122
  316. package/dist/actions/messages.js +0 -208
  317. package/dist/actions/notifications.js +0 -59
  318. package/dist/actions/payments.js +0 -497
  319. package/dist/actions/personas.js +0 -110
  320. package/dist/actions/posts.js +0 -595
  321. package/dist/actions/reactions.js +0 -322
  322. package/dist/actions/s3.js +0 -133
  323. package/dist/actions/search.js +0 -90
  324. package/dist/actions/sms.js +0 -108
  325. package/dist/actions/statistics.js +0 -62
  326. package/dist/actions/subscription.js +0 -220
  327. package/dist/actions/tags.js +0 -292
  328. package/dist/actions/users.js +0 -784
  329. package/dist/actions/websockets.js +0 -174
  330. package/dist/adapters/arangoAdapter.js +0 -46
  331. package/dist/adapters/fileAdapter.js +0 -76
  332. package/dist/adapters/imageAdapter.js +0 -40
  333. package/dist/adapters/messageAdapter.js +0 -49
  334. package/dist/adapters/postAdapter.js +0 -70
  335. package/dist/adapters/reaktorAdapter.js +0 -44
  336. package/dist/adapters/tagAdapter.js +0 -50
  337. package/dist/adapters/userAdapter.js +0 -115
  338. package/dist/config.js +0 -125
  339. package/dist/index.js +0 -66
  340. package/dist/lambdas/actions/websockets.js +0 -132
  341. package/dist/lambdas/authorizer.js +0 -67
  342. package/dist/lambdas/connection.js +0 -91
  343. package/dist/lambdas/utils/message.js +0 -42
  344. package/dist/lambdas/utils/websocket.js +0 -105
  345. package/dist/mocks/conversation.js +0 -35
  346. package/dist/mocks/file.js +0 -38
  347. package/dist/mocks/group.js +0 -47
  348. package/dist/mocks/image.js +0 -44
  349. package/dist/mocks/nlabs.png +0 -0
  350. package/dist/mocks/post.js +0 -55
  351. package/dist/mocks/tag.js +0 -37
  352. package/dist/mocks/user.js +0 -88
  353. package/dist/mutations/index.js +0 -26
  354. package/dist/mutations/locations.js +0 -44
  355. package/dist/mutations/messages.js +0 -86
  356. package/dist/mutations/personas.js +0 -100
  357. package/dist/mutations/posts.js +0 -53
  358. package/dist/mutations/reactions.js +0 -51
  359. package/dist/mutations/statistics.js +0 -39
  360. package/dist/mutations/subscriptions.js +0 -56
  361. package/dist/mutations/tags.js +0 -120
  362. package/dist/mutations/users.js +0 -116
  363. package/dist/objectTypes/app.js +0 -173
  364. package/dist/objectTypes/bankAccount.js +0 -76
  365. package/dist/objectTypes/connection.js +0 -48
  366. package/dist/objectTypes/conversation.js +0 -77
  367. package/dist/objectTypes/creditCard.js +0 -86
  368. package/dist/objectTypes/document.js +0 -46
  369. package/dist/objectTypes/error.js +0 -46
  370. package/dist/objectTypes/external.js +0 -74
  371. package/dist/objectTypes/file.js +0 -100
  372. package/dist/objectTypes/filter.js +0 -43
  373. package/dist/objectTypes/group.js +0 -123
  374. package/dist/objectTypes/iapSubscription.js +0 -40
  375. package/dist/objectTypes/image.js +0 -129
  376. package/dist/objectTypes/index.js +0 -68
  377. package/dist/objectTypes/location.js +0 -109
  378. package/dist/objectTypes/message.js +0 -96
  379. package/dist/objectTypes/passcode.js +0 -42
  380. package/dist/objectTypes/persona.js +0 -87
  381. package/dist/objectTypes/plan.js +0 -95
  382. package/dist/objectTypes/post.js +0 -125
  383. package/dist/objectTypes/reaction.js +0 -61
  384. package/dist/objectTypes/relation.js +0 -49
  385. package/dist/objectTypes/search.js +0 -72
  386. package/dist/objectTypes/statistics.js +0 -39
  387. package/dist/objectTypes/subscription.js +0 -117
  388. package/dist/objectTypes/tag.js +0 -65
  389. package/dist/objectTypes/user.js +0 -144
  390. package/dist/queries/index.js +0 -33
  391. package/dist/queries/locations.js +0 -45
  392. package/dist/queries/messages.js +0 -52
  393. package/dist/queries/posts.js +0 -154
  394. package/dist/queries/reactions.js +0 -56
  395. package/dist/queries/statistics.js +0 -39
  396. package/dist/queries/subscriptions.js +0 -44
  397. package/dist/queries/tags.js +0 -75
  398. package/dist/queries/users.js +0 -64
  399. package/dist/templates/email/layout.js +0 -302
  400. package/dist/templates/email/passwordForgot.js +0 -38
  401. package/dist/templates/email/passwordRecovery.js +0 -35
  402. package/dist/templates/email/verifyEmail.js +0 -38
  403. package/dist/templates/email/welcome.js +0 -38
  404. package/dist/templates/sms/passwordForgot.js +0 -24
  405. package/dist/templates/sms/passwordRecovery.js +0 -24
  406. package/dist/templates/sms/verifyEmail.js +0 -24
  407. package/dist/templates/sms/verifyPhone.js +0 -24
  408. package/dist/templates/sms/welcome.js +0 -24
  409. package/dist/types/apps.js +0 -32
  410. package/dist/types/arangodb.js +0 -16
  411. package/dist/types/auth.js +0 -16
  412. package/dist/types/connections.js +0 -16
  413. package/dist/types/conversations.js +0 -16
  414. package/dist/types/email.js +0 -16
  415. package/dist/types/error.js +0 -44
  416. package/dist/types/files.js +0 -16
  417. package/dist/types/google.js +0 -16
  418. package/dist/types/groups.js +0 -16
  419. package/dist/types/images.js +0 -16
  420. package/dist/types/index.js +0 -60
  421. package/dist/types/locations.js +0 -16
  422. package/dist/types/messages.js +0 -16
  423. package/dist/types/notifications.js +0 -16
  424. package/dist/types/payments.js +0 -16
  425. package/dist/types/personas.js +0 -16
  426. package/dist/types/posts.js +0 -16
  427. package/dist/types/statistics.js +0 -16
  428. package/dist/types/tags.js +0 -16
  429. package/dist/types/users.js +0 -16
  430. package/dist/types/websockets.js +0 -16
  431. package/dist/utils/adapterUtils.js +0 -45
  432. package/dist/utils/analyticsUtils.js +0 -72
  433. package/dist/utils/arangodbUtils.js +0 -165
  434. package/dist/utils/auth.js +0 -57
  435. package/dist/utils/index.js +0 -30
  436. package/dist/utils/session.js +0 -60
  437. package/jest.setup.js +0 -0
  438. package/lex.config.cjs +0 -13
  439. package/lib/actions/personas.d.ts +0 -3
  440. package/lib/actions/personas.js +0 -110
  441. package/lib/actions/subscription.js +0 -208
  442. package/lib/mutations/personas.d.ts +0 -2
  443. package/lib/mutations/personas.js +0 -100
  444. package/lib/objectTypes/persona.d.ts +0 -3
  445. package/lib/objectTypes/persona.js +0 -87
  446. package/lib/types/personas.types.js +0 -16
  447. package/lib/utils/auth.js +0 -57
  448. package/lib/utils/session.js +0 -60
@@ -1,784 +1,87 @@
1
- var __create = Object.create;
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __getProtoOf = Object.getPrototypeOf;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __export = (target, all) => {
8
- for (var name in all)
9
- __defProp(target, name, { get: all[name], enumerable: true });
10
- };
11
- var __copyProps = (to, from, except, desc) => {
12
- if (from && typeof from === "object" || typeof from === "function") {
13
- for (let key of __getOwnPropNames(from))
14
- if (!__hasOwnProp.call(to, key) && key !== except)
15
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
- }
17
- return to;
18
- };
19
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
- // If the importer is in node compatibility mode or this is not an ESM
21
- // file that has been converted to a CommonJS file using a Babel-
22
- // compatible transform (i.e. "__esModule" has not been set), then set
23
- // "default" to the CommonJS "module.exports" for node compatibility.
24
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
- mod
26
- ));
27
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
- var users_exports = {};
29
- __export(users_exports, {
30
- UserAccess: () => UserAccess,
31
- addUser: () => addUser,
32
- confirmCode: () => confirmCode,
33
- createToken: () => createToken,
34
- deactivateUser: () => deactivateUser,
35
- deleteUser: () => deleteUser,
36
- forgotPassword: () => forgotPassword,
37
- getActiveUserCount: () => getActiveUserCount,
38
- getDisplayName: () => getDisplayName,
39
- getSessionUser: () => getSessionUser,
40
- getUser: () => getUser,
41
- getUserByToken: () => getUserByToken,
42
- getUserOptional: () => getUserOptional,
43
- getUsers: () => getUsers,
44
- getUsersByConnection: () => getUsersByConnection,
45
- getUsersByLatest: () => getUsersByLatest,
46
- getUsersByReactions: () => getUsersByReactions,
47
- getUsersByTags: () => getUsersByTags,
48
- parseUserOptions: () => parseUserOptions,
49
- refreshSession: () => refreshSession,
50
- resetPassword: () => resetPassword,
51
- signIn: () => signIn,
52
- signOut: () => signOut,
53
- updateUser: () => updateUser
54
- });
55
- module.exports = __toCommonJS(users_exports);
56
- var import_utils = require("@nlabs/utils");
57
- var import_arangojs = require("arangojs");
58
- var import_luxon = require("luxon");
59
- var import_stripe = __toESM(require("stripe"), 1);
60
- var import_userAdapter = require("../adapters/userAdapter");
61
- var import_config = require("../config");
62
- var import_email = require("./email");
63
- var import_sms = require("./sms");
64
- var import_error = require("../types/error.types");
65
- var import_analyticsUtils = require("../utils/analyticsUtils");
66
- var import_arangodbUtils = require("../utils/arangodbUtils");
67
- var import_session = require("../utils/session");
68
- const eventCategory = "users";
69
- const STRIPE_API_VERSION = "2025-05-28.basil";
70
- var UserAccess = /* @__PURE__ */ ((UserAccess2) => {
71
- UserAccess2[UserAccess2["DEACTIVATED"] = 0] = "DEACTIVATED";
72
- UserAccess2[UserAccess2["ACTIVE"] = 1] = "ACTIVE";
73
- UserAccess2[UserAccess2["PREMIUM"] = 2] = "PREMIUM";
74
- UserAccess2[UserAccess2["CONTENT_ADMIN"] = 3] = "CONTENT_ADMIN";
75
- UserAccess2[UserAccess2["ADMIN"] = 4] = "ADMIN";
76
- return UserAccess2;
77
- })(UserAccess || {});
78
- const createToken = (userId, username, userAccess, expiresInMinutes = 15) => {
79
- const now = import_luxon.DateTime.local();
80
- const sessionExpires = now.plus({ minutes: expiresInMinutes });
81
- const iat = Math.floor(now.toSeconds());
82
- const exp = Math.floor(sessionExpires.toSeconds());
83
- const token = (0, import_session.setSession)({
84
- exp,
85
- iat,
86
- userAccess,
87
- userId,
88
- username
89
- });
90
- return {
91
- expires: sessionExpires.toMillis(),
92
- issued: now.toMillis(),
93
- token,
94
- userId,
95
- username
96
- };
97
- };
98
- const getUserOptional = (fields = []) => fields.reduce((selects, field) => {
99
- if (field.includes("Count")) {
100
- return (0, import_arangodbUtils.selectReactionCountByType)("users", "u", field, selects);
101
- }
102
- return selects;
103
- }, { objects: [], queries: [] });
104
- const parseUserOptions = (options = {}) => {
105
- const {
106
- from = 0,
107
- to = 30
108
- } = options;
109
- const limit = (0, import_arangodbUtils.getLimit)(from, to);
110
- return {
111
- ...options,
112
- limit
113
- };
114
- };
115
- const addUser = async (context, user) => {
116
- const action = "addUser";
117
- const { database } = context;
118
- const { email, password, phone, username } = (0, import_userAdapter.parseUser)(user);
119
- const formatUsername = (0, import_utils.parseUsername)(username);
120
- const formatEmail = (0, import_utils.parseEmail)(email);
121
- const formatPhone = (0, import_utils.parsePhone)(phone);
122
- const formatPassword = (0, import_utils.parsePassword)(password);
123
- const hasPassword = !!formatPassword;
124
- const hasUsername = !!formatUsername || !!formatPhone || !!formatEmail;
125
- if (!hasPassword || !hasUsername) {
126
- return (0, import_analyticsUtils.logException)({
127
- action,
128
- category: eventCategory,
129
- params: { username },
130
- value: import_error.ErrorTypes.INVALID_ARGUMENTS
131
- }, context);
132
- }
133
- const hashId = formatUsername || formatPhone || formatEmail;
134
- const salt = (0, import_utils.createHash)(`${hashId}${formatPassword}`, null);
135
- const encryptedPassword = (0, import_utils.createPassword)(formatPassword, salt);
136
- const filters = [];
137
- if (formatUsername) {
138
- filters.push(`u.username == "${formatUsername}"`);
139
- }
140
- if (formatEmail) {
141
- filters.push(`u.email == "${formatEmail}"`);
142
- }
143
- if (formatPhone) {
144
- filters.push(`u.phone == ${formatPhone}`);
145
- }
146
- const checkQuery = `FOR u IN users
147
- FILTER ${filters.join(" || ")}
1
+ import{parseNum as Y}from"@nlabs/utils/parsers/numbers";import{createHash as L,createPassword as b,parseArangoId as x,parseChar as j,parseEmail as _,parsePassword as M,parsePhone as Q,parseUsername as w}from"@nlabs/utils/parsers/strings";import{aql as U}from"arangojs";import{DateTime as X}from"luxon";import z from"stripe";import{parseUser as D}from"../adapters/userAdapter.js";import{Config as K}from"../config.js";import{ErrorTypes as T}from"../types/error.types.js";import{logError as g,logException as q}from"../utils/analyticsUtils.js";import{getDocId as Z,getLimit as ee,selectReactionCountByType as se,useDb as f}from"../utils/arangodbUtils.js";import{detectLanguage as re}from"../utils/languageDetection.js";import{getSession as B,setSession as te}from"../utils/sessionUtils.js";import{sendEmail as oe}from"./email.js";import{sendSms as ne}from"./sms.js";const E="users",ae="2025-07-30.basil";var ie=(n=>(n[n.DEACTIVATED=0]="DEACTIVATED",n[n.ACTIVE=1]="ACTIVE",n[n.PREMIUM=2]="PREMIUM",n[n.CONTENT_ADMIN=3]="CONTENT_ADMIN",n[n.ADMIN=4]="ADMIN",n))(ie||{});const F=(e,o="",s=0,a=15)=>{const t=X.local(),n=t.plus({minutes:a}),c=Math.floor(t.toSeconds()),r=Math.floor(n.toSeconds()),l=te({exp:r,iat:c,userAccess:s,userId:e,username:o});return{expires:n.toMillis(),issued:t.toMillis(),token:l,userId:e,username:o}},C=(e=[])=>e.reduce((o,s)=>s.includes("Count")?se("users","u",s,o):o,{objects:[],queries:[]}),v=(e={})=>{const{from:o=0,to:s=30}=e,a=ee(o,s);return{...e,limit:a}},Ue=async(e,o)=>{const s="addUser",{databaseName:a,languageContext:t}=e,{confirm:n,...c}=o,{email:r,password:l,phone:u,username:i,userId:p,_key:m,_id:d,...y}=D(c);if(!!!l||!(!!i||!!u||!!r))return q({action:s,category:E,params:{username:i},value:T.INVALID_ARGUMENTS},e),null;const h=L(`${i||u||r}${l}`,""),O=b(l,h),$=[];i&&$.push(`u.username == "${i}"`),r&&$.push(`u.email == "${r}"`),u&&$.push(`u.phone == ${u}`);const P=`FOR u IN users
2
+ FILTER ${$.join(" || ")}
148
3
  LIMIT 1
149
- RETURN u`;
150
- try {
151
- const existingUsers = await database.query(checkQuery).then((cursor) => cursor.all());
152
- if (existingUsers.length) {
153
- return (0, import_analyticsUtils.logException)({
154
- action,
155
- category: eventCategory,
156
- params: {
157
- email: formatEmail,
158
- phone: formatPhone,
159
- username: formatUsername
160
- },
161
- value: import_error.ErrorTypes.EXISTING_ITEM
162
- }, context);
163
- }
164
- } catch (error) {
165
- return (0, import_analyticsUtils.logError)({
166
- action,
167
- category: eventCategory,
168
- params: { username },
169
- value: import_error.ErrorTypes.DATABASE_ERROR
170
- }, error, context);
171
- }
172
- const verifiedEmailCode = Math.floor(1e5 + Math.random() * 9e5);
173
- const verifiedPhoneCode = Math.floor(1e5 + Math.random() * 9e5);
174
- const insert = {
175
- _key: (0, import_utils.createHash)(formatUsername, null),
176
- added: Date.now(),
177
- email: formatEmail,
178
- modified: Date.now(),
179
- password: encryptedPassword,
180
- phone: formatPhone,
181
- salt,
182
- userAccess: 1,
183
- username: formatUsername,
184
- verifiedEmail: false,
185
- verifiedEmailCode,
186
- verifiedPhone: false,
187
- verifiedPhoneCode
188
- };
189
- const insertQuery = import_arangojs.aql`INSERT ${insert} IN users RETURN NEW`;
190
- return await database.query(insertQuery).then((cursor) => cursor.next()).catch((error) => (0, import_analyticsUtils.logError)({
191
- action,
192
- category: eventCategory,
193
- params: { username },
194
- value: import_error.ErrorTypes.DATABASE_ERROR
195
- }, error, context));
196
- };
197
- const updateUser = async (context, user) => {
198
- const action = "updateUser";
199
- const { database, session } = context;
200
- const { _key, _id, id, tags = [], userId, ...updated } = (0, import_userAdapter.parseUser)(user);
201
- if (!(0, import_session.isAdminUser)(session) && session?.userId !== userId) {
202
- return (0, import_analyticsUtils.logException)({
203
- action,
204
- category: eventCategory,
205
- params: { session },
206
- value: import_error.ErrorTypes.INVALID_SESSION
207
- }, context);
208
- }
209
- const userQuery = import_arangojs.aql`LET u = DOCUMENT(${id})
210
- UPDATE u WITH ${updated} IN users
211
- RETURN NEW`;
212
- try {
213
- const updatedUser = await database.query(userQuery).then((cursor) => cursor.next());
214
- const tagCollection = database.collection("isTagged");
215
- await Promise.all(tags.map(({ id: tagDocId, name }) => {
216
- const tagQuery = import_arangojs.aql`FOR it IN isTagged
217
- FILTER it._from == ${tagDocId} && it._to == ${id} && it.name == ${name}
4
+ RETURN u`;try{if((await f(a).query(P).then(J=>J.all())).length)throw q({action:s,category:E,params:{email:r,phone:u,username:i},value:T.EXISTING_ITEM},e)}catch(S){throw g({action:s,category:E,params:{email:r,phone:u,username:i},value:T.DATABASE_ERROR},S,e)}const N=u?.replace(/\D/g,"").substring(0,3),k=re({...t,phoneCountryCode:N||"",userPreference:y.locale||"en"}),G=Math.floor(1e5+Math.random()*9e5),V=Math.floor(1e5+Math.random()*9e5),W={...y,_key:L(i),added:Date.now(),email:r,locale:k,modified:Date.now(),password:O,phone:u,salt:h,userAccess:1,username:i,verifiedEmail:!1,verifiedEmailCode:G,verifiedPhone:!1,verifiedSmsCode:V},H=U`INSERT ${W} IN users RETURN NEW`;return await f(a).query(H).then(S=>S.next()).catch(S=>{throw g({action:s,category:E,params:{username:i},value:T.DATABASE_ERROR},S,e)})},he=async(e,o)=>{const s="updateUser",{databaseName:a}=e,t=D(o),{_key:n,_id:c,tags:r=[],...l}=t,{id:u}=t,i=U`LET u = DOCUMENT(${u})
5
+ UPDATE u WITH ${l} IN users
6
+ RETURN NEW`;try{const p=f(a),m=await p.query(i).then(y=>y.next()),d=p.collection("isTagged");return await Promise.all(r.map(({id:y,name:I})=>{const R=U`FOR it IN isTagged
7
+ FILTER it._from == ${y} && it._to == ${u} && it.name == ${I}
218
8
  LIMIT 1
219
- RETURN it`;
220
- return database.query(tagQuery).then((cursor) => cursor.next()).then((tagEdge) => {
221
- if (!!tagEdge) {
222
- return tagEdge;
223
- }
224
- const edge = {
225
- _from: tagDocId,
226
- _key: (0, import_utils.createHash)(`isTagged-${tagDocId}-${id}`),
227
- _to: id,
228
- added: Date.now(),
229
- name
230
- };
231
- return tagCollection.save(edge, { returnNew: true }).then(() => edge);
232
- });
233
- }));
234
- return updatedUser;
235
- } catch (error) {
236
- return (0, import_analyticsUtils.logError)({
237
- action,
238
- category: eventCategory,
239
- params: { user },
240
- value: import_error.ErrorTypes.DATABASE_ERROR
241
- }, error, context);
242
- }
243
- };
244
- const forgotPassword = async (context, { email, phone, username }) => {
245
- const action = "forgotPassword";
246
- const { app, database } = context;
247
- const aqlQuery = import_arangojs.aql`FOR u IN users
248
- FILTER u.email == ${email} || u.phone == ${phone} || u.username == ${username}
9
+ RETURN it`;return p.query(R).then(A=>A.next()).then(A=>{if(A)return A;const h={_from:y,_key:L(`isTagged-${y}-${u}`),_to:u,added:Date.now(),name:I};return d.save(h,{returnNew:!0}).then(()=>h)})})),m}catch(p){throw g({action:s,category:E,params:{user:o},value:T.DATABASE_ERROR},p,e)}},Ne=async(e,{email:o,phone:s,username:a})=>{const t="forgotPassword",{databaseName:n}=e,c=U`FOR u IN users
10
+ FILTER u.email == ${o} || u.phone == ${s} || u.username == ${a}
249
11
  LIMIT 1
250
- RETURN u`;
251
- try {
252
- return await database.query(aqlQuery).then(async (cursor) => {
253
- const user = cursor.next();
254
- if (user) {
255
- const { email: email2, phone: phone2, verifiedEmail, verifiedPhone } = user;
256
- const codeExpires = 1e3 * 60 * 15;
257
- const code = Math.floor(1e5 + Math.random() * 9e5);
258
- const userDocId = (0, import_arangodbUtils.getDocId)("users", user);
259
- let update;
260
- if (email2 && verifiedEmail) {
261
- (0, import_email.sendEmail)({
262
- app,
263
- text: `Your code is ${code}`
264
- });
265
- update = { verifiedEmailCode: code, verifiedEmailExpires: codeExpires };
266
- }
267
- if (phone2 && verifiedPhone) {
268
- (0, import_sms.sendSms)({
269
- app,
270
- text: `Your code is ${code}`
271
- });
272
- update = { verifiedPhoneCode: code, verifiedPhoneExpires: codeExpires };
273
- }
274
- if (update.verifiedEmailCode || update.verifiedPhoneCode) {
275
- const updateQuery = import_arangojs.aql`UPDATE ${userDocId} WITH ${update} IN users`;
276
- await database.query(updateQuery);
277
- return true;
278
- }
279
- return false;
280
- }
281
- return false;
282
- });
283
- } catch (error) {
284
- (0, import_analyticsUtils.logError)({
285
- action,
286
- category: eventCategory,
287
- params: { email, phone, username },
288
- value: import_error.ErrorTypes.DATABASE_ERROR
289
- }, error, context);
290
- return false;
291
- }
292
- };
293
- const resetPassword = async (context, {
294
- code,
295
- password,
296
- type,
297
- username
298
- }) => {
299
- const action = "resetPassword";
300
- const { database } = context;
301
- const formatPassword = (0, import_utils.parsePassword)(password);
302
- const aqlQuery = import_arangojs.aql`FOR u IN users
303
- FILTER u.username == ${username}
12
+ RETURN u`;try{return await f(n).query(c).then(async r=>{const l=r.next();if(l){const{email:u,phone:i,verifiedEmail:p,verifiedPhone:m}=l,d=1e3*60*15,y=Math.floor(1e5+Math.random()*9e5),I=Z("users",l);let R;if(u&&p&&(oe({context:e,text:`Your code is ${y}`}),R={verifiedEmailCode:y,verifiedEmailExpires:d}),i&&m&&(ne({context:e,text:`Your code is ${y}`}),R={verifiedPhoneExpires:d,verifiedSmsCode:y}),R.verifiedEmailCode||R.verifiedSmsCode){const A=U`UPDATE ${I} WITH ${R} IN users`;return await f(n).query(A),!0}return!1}return!1})}catch(r){return g({action:t,category:E,params:{email:o,phone:s,username:a},value:T.DATABASE_ERROR},r,e),!1}},Oe=async(e,{code:o,password:s,type:a,username:t})=>{const n="resetPassword",{databaseName:c}=e,r=M(s),l=U`FOR u IN users
13
+ FILTER u.username == ${t}
304
14
  LIMIT 1
305
- RETURN u`;
306
- try {
307
- return await database.query(aqlQuery).then(async (cursor) => {
308
- const user = cursor.next();
309
- if (user) {
310
- const {
311
- _id: userDocId,
312
- salt,
313
- verifiedEmailCode,
314
- verifiedEmailExpires,
315
- verifiedPhoneCode,
316
- verifiedPhoneExpires
317
- } = user;
318
- const now = Date.now();
319
- let update;
320
- switch (type) {
321
- case "email":
322
- if (code === verifiedEmailCode && verifiedEmailExpires > now) {
323
- const password2 = (0, import_utils.createPassword)(formatPassword, salt);
324
- update = { password: password2 };
325
- }
326
- break;
327
- case "phone":
328
- if (code === verifiedPhoneCode && verifiedPhoneExpires > now) {
329
- const password2 = (0, import_utils.createPassword)(formatPassword, salt);
330
- update = { password: password2 };
331
- }
332
- break;
333
- default:
334
- return false;
335
- }
336
- if (update) {
337
- const updateQuery = import_arangojs.aql`UPDATE ${userDocId} WITH ${update} IN users`;
338
- await database.query(updateQuery);
339
- return true;
340
- }
341
- }
342
- return false;
343
- });
344
- } catch (error) {
345
- (0, import_analyticsUtils.logError)({
346
- action,
347
- category: eventCategory,
348
- params: { username },
349
- value: import_error.ErrorTypes.DATABASE_ERROR
350
- }, error, context);
351
- return false;
352
- }
353
- };
354
- const confirmCode = async (context, {
355
- code,
356
- type
357
- }) => {
358
- const action = "confirmCode";
359
- const { database, session: { userId: sessionId } } = context;
360
- const userDocId = (0, import_arangodbUtils.getDocId)("users", { userId: sessionId });
361
- const aqlQuery = import_arangojs.aql`LET u = DOCUMENT(${userDocId}) RETURN u`;
362
- try {
363
- return await database.query(aqlQuery).then((cursor) => cursor.next()).then(({ verifiedEmailCode, verifiedPhoneCode }) => {
364
- switch (type) {
365
- case "email":
366
- return code === verifiedEmailCode;
367
- case "phone":
368
- return code === verifiedPhoneCode;
369
- default:
370
- return false;
371
- }
372
- });
373
- } catch (error) {
374
- (0, import_analyticsUtils.logError)({
375
- action,
376
- category: eventCategory,
377
- params: { code, type },
378
- value: import_error.ErrorTypes.DATABASE_ERROR
379
- }, error, context);
380
- return false;
381
- }
382
- };
383
- const deleteUser = (context, user) => {
384
- const action = "deleteUser";
385
- const { database } = context;
386
- const { userId } = (0, import_userAdapter.parseUser)(user);
387
- const aqlQuery = import_arangojs.aql`FOR u IN users
388
- FILTER u._key == ${userId}
15
+ RETURN u`;try{return await f(c).query(l).then(async u=>{const i=u.next();if(i){const{_id:p,salt:m,verifiedEmailCode:d,verifiedEmailExpires:y=0,verifiedSmsCode:I,verifiedPhoneExpires:R=0}=i,A=Date.now();let h;switch(a){case"email":o===d&&y>A&&(h={password:b(r,m)});break;case"phone":o===I&&R>A&&(h={password:b(r,m)});break;default:return!1}if(h){const O=U`UPDATE ${p} WITH ${h} IN users`;return await f(c).query(O),!0}}return!1})}catch(u){return g({action:n,category:E,params:{username:t},value:T.DATABASE_ERROR},u,e),!1}},$e=async(e,{code:o,type:s,value:a})=>{const t="confirmCode",{databaseName:n}=e,c=s==="sms",r=c?Q(a):_(a),u=`FOR u IN users
16
+ ${c?`FILTER u.phone == "${r}" && u.verifiedSmsCode == ${o}`:`FILTER u.email == "${r}" && u.verifiedEmailCode == ${o}`}
389
17
  LIMIT 1
18
+ RETURN u`;try{return await f(n).query(u).then(i=>i.next()).then(i=>{if(i){const p=c?{verifiedPhone:!0,verifiedSmsCode:0}:{verifiedEmail:!0,verifiedEmailCode:0},m=U`UPDATE ${i._key} WITH ${p} IN users`;return f(n).query(m).then(()=>!0).catch(d=>(g({action:t,category:E,params:{code:o,type:s,value:r},value:T.DATABASE_ERROR},d,e),!1))}return!1})}catch(i){return g({action:t,category:E,params:{code:o,type:s,value:r},value:T.DATABASE_ERROR},i,e),!1}},Ce=(e,o)=>{const s="deleteUser",{databaseName:a}=e,{id:t}=D(o),n=U`LET u = DOCUMENT(${t})
390
19
  REMOVE u IN users
391
- RETURN OLD`;
392
- const stripeClient = new import_stripe.default(import_config.Config.get("stripe.token"), { apiVersion: STRIPE_API_VERSION, typescript: true });
393
- return database.query(aqlQuery).then((cursor) => cursor.next()).then((deletedUser) => stripeClient.customers.del(deletedUser?.stripeCustomerId).then(() => stripeClient.accounts.del(deletedUser?.stripeAccountId)).then(() => deletedUser)).catch((error) => (0, import_analyticsUtils.logError)({
394
- action,
395
- category: eventCategory,
396
- params: { userId },
397
- value: import_error.ErrorTypes.DATABASE_ERROR
398
- }, error, context));
399
- };
400
- const deactivateUser = (context, user) => {
401
- const action = "delete";
402
- const { database } = context;
403
- const { userId } = (0, import_userAdapter.parseUser)(user);
404
- const updated = {
405
- userAccess: 0
406
- };
407
- const aqlQuery = import_arangojs.aql`UPDATE ${userId} WITH ${updated} IN users LIMIT 1 RETURN NEW`;
408
- return database.query(aqlQuery).then((cursor) => cursor.next()).catch((error) => (0, import_analyticsUtils.logError)({
409
- action,
410
- category: eventCategory,
411
- params: { userId },
412
- value: import_error.ErrorTypes.DATABASE_ERROR
413
- }, error, context));
414
- };
415
- const getDisplayName = (user) => {
416
- const { first, last, name = "", username = "" } = user;
417
- const fullname = [first, last].join(" ").trim();
418
- if (name) {
419
- return name;
420
- } else if (fullname !== "") {
421
- return fullname;
422
- } else if (username) {
423
- return username;
424
- }
425
- return "Unknown";
426
- };
427
- const getSessionUser = (context) => {
428
- const action = "getSessionUser";
429
- console.log("getSessionUser", { action, context });
430
- const { database, fields, session: { userId: sessionId, username } } = context;
431
- const { objects: selectObjects, queries: selectQueries } = getUserOptional(fields);
432
- const formatSessionId = (0, import_utils.parseArangoId)(`users/${sessionId}`);
433
- const aqlQuery = `LET u = DOCUMENT("${formatSessionId}")
434
- ${selectQueries.join("\n")}
435
- RETURN MERGE(u, {${selectObjects.join(", ")}})`;
436
- return database.query(aqlQuery).then((cursor) => cursor.next()).catch((error) => {
437
- (0, import_analyticsUtils.logError)({
438
- action,
439
- category: eventCategory,
440
- params: { userId: sessionId, username },
441
- value: import_error.ErrorTypes.DATABASE_ERROR
442
- }, error, context);
443
- return null;
444
- });
445
- };
446
- const getUser = (context, user) => {
447
- const action = "getUser";
448
- const { id, userId, username } = (0, import_userAdapter.parseUser)(user);
449
- const { database, fields } = context;
450
- const { objects: selectObjects, queries: selectQueries } = getUserOptional(fields);
451
- let aqlQuery;
452
- console.log({ id, userId, username });
453
- if (id) {
454
- aqlQuery = `LET u = DOCUMENT("${id}")
455
- ${selectQueries.join("\n")}
20
+ RETURN OLD`,c=new z(K.get("stripe.token"),{apiVersion:ae,typescript:!0});return f(a).query(n).then(r=>r.next()).then(r=>c.customers.del(r?.stripeCustomerId).then(()=>c.accounts.del(r?.stripeAccountId)).then(()=>r)).catch(r=>g({action:s,category:E,params:{id:t},value:T.DATABASE_ERROR},r,e))},Se=(e,o)=>{const s="delete",{databaseName:a}=e,{id:t}=D(o),c=U`UPDATE ${t} WITH ${{userAccess:0}} IN users LIMIT 1 RETURN NEW`;return f(a).query(c).then(r=>r.next()).catch(r=>{throw g({action:s,category:E,params:{id:t},value:T.DATABASE_ERROR},r,e)})},we=e=>{const{first:o,last:s,name:a="",username:t=""}=e,n=[o,s].join(" ").trim();return a||(n!==""?n:t||"Unknown")},qe=e=>{const o="getSessionUser",{databaseName:s,fields:a,session:{userId:t,username:n}={}}=e,{objects:c,queries:r}=C(a),u=`LET u = DOCUMENT("${x(`users/${t}`)}")
21
+ ${r.join(`
22
+ `)}
23
+ RETURN MERGE(u, {${c.join(", ")}})`;return f(s).query(u).then(i=>i.next()).catch(i=>{throw g({action:o,category:E,params:{userId:t,username:n},value:T.DATABASE_ERROR},i,e)})},De=(e,o)=>{const s="getUser",{email:a,id:t,phone:n,userId:c,username:r}=D(o),{databaseName:l,fields:u}=e,{objects:i,queries:p}=C(u);let m="";return t?m=`LET u = DOCUMENT("${t}")
24
+ ${p.join(`
25
+ `)}
456
26
  FILTER u.userAccess > 0
457
- RETURN MERGE(u, {${selectObjects.join(", ")}})`;
458
- } else if (username) {
459
- aqlQuery = `FOR u IN users
460
- FILTER u.username == "${username}"
461
- ${selectQueries.join("\n")}
462
- RETURN MERGE(u, {${selectObjects.join(", ")}})`;
463
- }
464
- return database.query(aqlQuery).then((cursor) => cursor.next()).then((user2) => user2).catch((error) => (0, import_analyticsUtils.logError)({
465
- action,
466
- category: eventCategory,
467
- params: { id, userId, username },
468
- value: import_error.ErrorTypes.DATABASE_ERROR
469
- }, error, context));
470
- };
471
- const getUsers = (context, options) => {
472
- const action = "getUserList";
473
- const { database, fields } = context;
474
- const { limit, username } = parseUserOptions(options);
475
- const { objects: selectObjects, queries: selectQueries } = getUserOptional(fields);
476
- const filterBy = ["u.userAccess > 0"];
477
- if (username) {
478
- filterBy.push(`CONTAINS(u.username, "${(0, import_utils.parseUsername)(username)}")`);
479
- }
480
- const aqlQuery = `FOR u IN users
481
- FILTER ${filterBy.join(" && ")}
482
- ${selectQueries.join("\n")}
483
- ${limit.aql}
27
+ RETURN MERGE(u, {${i.join(", ")}})`:r?m=`FOR u IN users
28
+ FILTER u.username == "${r}"
29
+ ${p.join(`
30
+ `)}
31
+ RETURN MERGE(u, {${i.join(", ")}})`:a?m=`FOR u IN users
32
+ FILTER u.email == "${a}"
33
+ ${p.join(`
34
+ `)}
35
+ RETURN MERGE(u, {${i.join(", ")}})`:n&&(m=`FOR u IN users
36
+ FILTER u.phone == "${n}"
37
+ ${p.join(`
38
+ `)}
39
+ RETURN MERGE(u, {${i.join(", ")}})`),f(l).query(m).then(d=>d.next()).then(d=>d).catch(d=>g({action:s,category:E,params:{id:t,userId:c,username:r},value:T.DATABASE_ERROR},d,e))},ve=(e,o)=>{const s="getUserList",{databaseName:a,fields:t}=e,{limit:n,username:c}=v(o),{objects:r,queries:l}=C(t),u=["u.userAccess > 0"];c&&u.push(`CONTAINS(u.username, "${w(c)}")`);const i=`FOR u IN users
40
+ FILTER ${u.join(" && ")}
41
+ ${l.join(`
42
+ `)}
43
+ ${n.aql}
484
44
  SORT u.username
485
- RETURN MERGE(u, {${selectObjects.join(", ")}})`;
486
- return database.query(aqlQuery).then((cursor) => cursor.all()).catch((error) => {
487
- (0, import_analyticsUtils.logError)({
488
- action,
489
- category: eventCategory,
490
- value: import_error.ErrorTypes.DATABASE_ERROR
491
- }, error, context);
492
- return [];
493
- });
494
- };
495
- const getUsersByReactions = (context, { reactions = [], username }, options) => {
496
- const action = "getUsersByReactions";
497
- const { database, fields, session: { userId: sessionId } } = context;
498
- const formatReactions = reactions.map((reactionName) => (0, import_utils.parseChar)(reactionName, 32).toLowerCase());
499
- const { limit } = parseUserOptions(options);
500
- const { objects: selectObjects, queries: selectQueries } = getUserOptional(fields);
501
- const formatSessionId = `users/${sessionId}`;
502
- const formatUsername = (0, import_utils.parseUsername)(username);
503
- const filterBy = [
504
- "u.userAccess > 0",
505
- `POSITION(${JSON.stringify(formatReactions)}, LOWER(r.name))`
506
- ];
507
- if (username) {
508
- filterBy.push(`CONTAINS(u.username, "${formatUsername}")`);
509
- }
510
- const aqlQuery = `FOR u, r IN OUTBOUND "${formatSessionId}" hasReaction
45
+ RETURN MERGE(u, {${r.join(", ")}})`;return f(a).query(i).then(p=>p.all()).catch(p=>(g({action:s,category:E,value:T.DATABASE_ERROR},p,e),[]))},be=(e,{reactions:o=[],username:s},a)=>{const t="getUsersByReactions",{databaseName:n,fields:c,session:{userId:r}={}}=e,l=o.map(R=>j(R,32).toLowerCase()),{limit:u}=v(a),{objects:i,queries:p}=C(c),m=`users/${r}`,d=w(s),y=["u.userAccess > 0",`POSITION(${JSON.stringify(l)}, LOWER(r.name))`];s&&y.push(`CONTAINS(u.username, "${d}")`);const I=`FOR u, r IN OUTBOUND "${m}" hasReaction
511
46
  OPTIONS {vertexCollections: "users"}
512
- ${selectQueries.join("\n")}
513
- FILTER ${filterBy.join(" && ")}
514
- ${limit.aql}
515
- RETURN MERGE(u, {${selectObjects.join(", ")}})`;
516
- return database.query(aqlQuery).then((cursor) => cursor.all()).catch((error) => {
517
- (0, import_analyticsUtils.logError)({
518
- action,
519
- category: eventCategory,
520
- value: import_error.ErrorTypes.DATABASE_ERROR
521
- }, error, context);
522
- return [];
523
- });
524
- };
525
- const getUsersByTags = (context, { tags, username }, options) => {
526
- const action = "getUsersByTags";
527
- const { database, fields, session: { userId: sessionId } } = context;
528
- const formatTags = tags?.reduce((list, tagName) => {
529
- if (tagName) {
530
- list.push((0, import_utils.parseChar)(tagName, 32).toLowerCase());
531
- }
532
- return list;
533
- }, []);
534
- const { limit } = parseUserOptions(options);
535
- const { objects: selectObjects, queries: selectQueries } = getUserOptional(fields);
536
- const formatUsername = (0, import_utils.parseUsername)(username);
537
- const filterBy = [
538
- `u._key != "${sessionId}"`,
539
- "u.userAccess > 0"
540
- ];
541
- if (username) {
542
- filterBy.push(`CONTAINS(u.username, "${formatUsername}")`);
543
- }
544
- const aqlQuery = `FOR t IN tags
545
- FILTER POSITION(${JSON.stringify(formatTags)}, LOWER(t.name))
47
+ ${p.join(`
48
+ `)}
49
+ FILTER ${y.join(" && ")}
50
+ ${u.aql}
51
+ RETURN MERGE(u, {${i.join(", ")}})`;return f(n).query(I).then(R=>R.all()).catch(R=>(g({action:t,category:E,value:T.DATABASE_ERROR},R,e),[]))},Pe=(e,{tags:o,username:s},a)=>{const t="getUsersByTags",{databaseName:n,fields:c,session:{userId:r}={}}=e,l=o?.reduce((I,R)=>(R&&I.push(j(R,32).toLowerCase()),I),[]),{limit:u}=v(a),{objects:i,queries:p}=C(c),m=w(s),d=[`u._key != "${r}"`,"u.userAccess > 0"];s&&d.push(`CONTAINS(u.username, "${m}")`);const y=`FOR t IN tags
52
+ FILTER POSITION(${JSON.stringify(l)}, LOWER(t.name))
546
53
  FOR u, it IN OUTBOUND t isTagged
547
54
  OPTIONS {bfs: true, uniqueVertices: "global", vertexCollections: "users"}
548
- ${selectQueries.join("\n")}
549
- FILTER ${filterBy.join(" && ")}
550
- ${limit.aql}
551
- RETURN DISTINCT MERGE(u, {${selectObjects.join(", ")}})`;
552
- return database.query(aqlQuery).then((cursor) => cursor.all()).catch((error) => {
553
- (0, import_analyticsUtils.logError)({
554
- action,
555
- category: eventCategory,
556
- value: import_error.ErrorTypes.DATABASE_ERROR
557
- }, error, context);
558
- return [];
559
- });
560
- };
561
- const getUsersByLatest = (context, { username }, options) => {
562
- const action = "getUsersByLatest";
563
- const { database, fields, session: { userId } } = context;
564
- const { limit } = parseUserOptions(options);
565
- const filter = [
566
- "u._id != session._id",
567
- "u.userAccess > 0"
568
- ];
569
- const { objects: selectObjects, queries: selectQueries } = getUserOptional(fields);
570
- if (username) {
571
- filter.push(`CONTAINS(u.username, "${(0, import_utils.parseUsername)(username)}")`);
572
- }
573
- const aqlQuery = `FOR u IN users
574
- LET session = DOCUMENT("users/${userId}")
575
- FILTER ${filter.join(" && ")}
576
- ${selectQueries.join("\n")}
55
+ ${p.join(`
56
+ `)}
57
+ FILTER ${d.join(" && ")}
58
+ ${u.aql}
59
+ RETURN DISTINCT MERGE(u, {${i.join(", ")}})`;return f(n).query(y).then(I=>I.all()).catch(I=>(g({action:t,category:E,value:T.DATABASE_ERROR},I,e),[]))},Le=(e,{username:o},s)=>{const a="getUsersByLatest",{databaseName:t,fields:n,session:{userId:c}={}}=e,{limit:r}=v(s),l=["u._id != session._id","u.userAccess > 0"],{objects:u,queries:i}=C(n);o&&l.push(`CONTAINS(u.username, "${w(o)}")`);const p=`FOR u IN users
60
+ LET session = DOCUMENT("users/${c}")
61
+ FILTER ${l.join(" && ")}
62
+ ${i.join(`
63
+ `)}
577
64
  LET distance = DISTANCE(u.latitude || 0, u.longitude || 0, session.latitude || 0, session.longitude || 0)
578
- ${limit.aql}
65
+ ${r.aql}
579
66
  SORT distance ASC, u.added DESC
580
- RETURN MERGE(u, {${selectObjects.join(", ")}})`;
581
- return database.query(aqlQuery).then((cursor) => cursor.all()).catch((error) => {
582
- (0, import_analyticsUtils.logError)({
583
- action,
584
- category: eventCategory,
585
- value: import_error.ErrorTypes.DATABASE_ERROR
586
- }, error, context);
587
- return [];
588
- });
589
- };
590
- const getUsersByConnection = (context, { userId }, options) => {
591
- const action = "getUsersByConnection";
592
- const { database, fields } = context;
593
- const { limit, username } = parseUserOptions(options);
594
- const { objects: selectObjects, queries: selectQueries } = getUserOptional(fields);
595
- const formatUserId = (0, import_utils.parseArangoId)(`users/${userId}`);
596
- const filterBy = [
597
- "u.userAccess > 0"
598
- ];
599
- if (username) {
600
- filterBy.push(`CONTAINS(u.username, "${(0, import_utils.parseUsername)(username)}")`);
601
- }
602
- const aqlQuery = `FOR cu IN users
603
- LET session = DOCUMENT("${formatUserId}")
67
+ RETURN MERGE(u, {${u.join(", ")}})`;return f(t).query(p).then(m=>m.all()).catch(m=>(g({action:a,category:E,value:T.DATABASE_ERROR},m,e),[]))},xe=(e,{userId:o},s)=>{const a="getUsersByConnection",{databaseName:t,fields:n}=e,{limit:c,username:r}=v(s),{objects:l,queries:u}=C(n),i=x(`users/${o}`),p=["u.userAccess > 0"];r&&p.push(`CONTAINS(u.username, "${w(r)}")`);const m=`FOR cu IN users
68
+ LET session = DOCUMENT("${i}")
604
69
  FOR u, connection IN OUTBOUND cu hasConnection
605
70
  OPTIONS {bfs: true, uniqueVertices: "global", vertexCollections: "users"}
606
- ${selectQueries.join("\n")}
607
- FILTER ${filterBy.join(" && ")}
608
- ${limit.aql}
609
- RETURN DISTINCT MERGE(u, {${selectObjects.join(", ")}})`;
610
- return database.query(aqlQuery).then((cursor) => cursor.all()).catch((error) => {
611
- (0, import_analyticsUtils.logError)({
612
- action,
613
- category: eventCategory,
614
- value: import_error.ErrorTypes.DATABASE_ERROR
615
- }, error, context);
616
- return [];
617
- });
618
- };
619
- const refreshSession = ({ expires, token }) => {
620
- try {
621
- const { userId, username, userAccess } = (0, import_session.getSession)(token);
622
- return createToken(userId, username, userAccess, expires);
623
- } catch (error) {
624
- throw error;
625
- }
626
- };
627
- const signIn = async (context, args) => {
628
- const action = "signIn";
629
- const { database } = context;
630
- const { email, expires, password, phone, username } = args;
631
- const formatEmail = (0, import_utils.parseEmail)(email);
632
- const formatUsername = (0, import_utils.parseUsername)(username);
633
- const formatPassword = (0, import_utils.parsePassword)(password);
634
- const formatPhone = (0, import_utils.parsePhone)(phone);
635
- const formatExpires = (0, import_utils.parseNum)(expires) || 15;
636
- if (!formatUsername && !formatEmail && !formatPhone || !formatPassword) {
637
- (0, import_analyticsUtils.logException)({
638
- action,
639
- category: eventCategory,
640
- params: { username },
641
- value: import_error.ErrorTypes.INVALID_ARGUMENTS
642
- }, context);
643
- return null;
644
- }
645
- const filters = [];
646
- if (formatEmail) {
647
- filters.push(`u.email == "${formatEmail}"`);
648
- }
649
- if (formatPhone) {
650
- filters.push(`u.phone == ${formatPhone}`);
651
- }
652
- if (formatUsername) {
653
- filters.push(`u.username == "${formatUsername}"`);
654
- }
655
- const checkQuery = `FOR u IN users
656
- FILTER ${filters.join(" || ")}
71
+ ${u.join(`
72
+ `)}
73
+ FILTER ${p.join(" && ")}
74
+ ${c.aql}
75
+ RETURN DISTINCT MERGE(u, {${l.join(", ")}})`;return f(t).query(m).then(d=>d.all()).catch(d=>(g({action:a,category:E,value:T.DATABASE_ERROR},d,e),[]))},je=({expires:e,token:o})=>{try{const{userId:s,username:a,userAccess:t}=B(o);return F(s,a,t,e)}catch(s){throw s}},_e=async(e,o)=>{const s="signIn",{databaseName:a}=e,{email:t,expires:n,password:c,phone:r,username:l}=o,u=_(t),i=w(l),p=M(c),m=Q(r),d=Y(n)||15;if(!i&&!u&&!m||!p)throw q({action:s,category:E,params:{username:l},value:T.INVALID_ARGUMENTS},e);const y=[];u&&y.push(`u.email == "${u}"`),m&&y.push(`u.phone == ${m}`),i&&y.push(`u.username == "${i}"`);const I=`FOR u IN users
76
+ FILTER ${y.join(" || ")}
657
77
  LIMIT 1
658
- RETURN u`;
659
- let checkUser;
660
- try {
661
- checkUser = await database.query(checkQuery).then((cursor) => cursor.next());
662
- } catch (error) {
663
- (0, import_analyticsUtils.logError)({
664
- action,
665
- category: eventCategory,
666
- params: { username: formatUsername },
667
- value: import_error.ErrorTypes.DATABASE_ERROR
668
- }, error, context);
669
- return null;
670
- }
671
- if (!checkUser) {
672
- (0, import_analyticsUtils.logException)({
673
- action,
674
- category: eventCategory,
675
- params: { username },
676
- value: import_error.ErrorTypes.INVALID_AUTHENTICATION
677
- }, context);
678
- return null;
679
- }
680
- const { _key: userId, password: validPassword, salt, userAccess } = checkUser;
681
- const authPassword = (0, import_utils.createPassword)(formatPassword, salt);
682
- if (validPassword !== authPassword) {
683
- (0, import_analyticsUtils.logException)({
684
- action,
685
- category: eventCategory,
686
- params: { userAccess, userId, username },
687
- value: import_error.ErrorTypes.INVALID_AUTHENTICATION
688
- }, context);
689
- return null;
690
- }
691
- try {
692
- console.log({ formatExpires, userAccess, userId, username });
693
- const token = createToken(userId, username, userAccess, formatExpires);
694
- console.log({ token });
695
- return token;
696
- } catch (error) {
697
- (0, import_analyticsUtils.logError)({
698
- action,
699
- category: eventCategory,
700
- value: import_error.ErrorTypes.DATABASE_ERROR
701
- }, error, context);
702
- return null;
703
- }
704
- };
705
- const signOut = async (context) => {
706
- const action = "signOut";
707
- const { database, session: { userId: sessionId, username } } = context;
708
- const userDocId = `users/${sessionId}`;
709
- const update = {
710
- lastOnline: Date.now(),
711
- sessionId: null
712
- };
713
- const sessionQuery = import_arangojs.aql`LET u = DOCUMENT(${userDocId})
714
- UPDATE u WITH ${update} IN users
78
+ RETURN u`;let R;try{R=await f(a).query(I).then(N=>N.next())}catch(N){throw g({action:s,category:E,params:{username:i},value:T.DATABASE_ERROR},N,e)}if(!R)throw q({action:s,category:E,params:{username:l},value:T.INVALID_AUTHENTICATION},e);const{_key:A,password:h,salt:O,userAccess:$}=R,P=b(p,O);if(h!==P)throw q({action:s,category:E,params:{userAccess:$,userId:A,username:l},value:T.INVALID_AUTHENTICATION},e);try{return F(A||"",l||"",$,d)}catch(N){throw g({action:s,category:E,params:{userId:A,username:l},value:T.DATABASE_ERROR},N,e)}},Me=async e=>{const o="signOut",{databaseName:s,session:{userId:a,username:t}={}}=e,n=`users/${a}`,c={lastOnline:Date.now(),sessionId:null},r=U`LET u = DOCUMENT(${n})
79
+ UPDATE u WITH ${c} IN users
715
80
  LIMIT 1
716
- RETURN NEW`;
717
- try {
718
- await database.query(sessionQuery).then((cursor) => cursor.next());
719
- } catch (error) {
720
- await (0, import_analyticsUtils.logError)({
721
- action,
722
- category: eventCategory,
723
- params: { userId: sessionId, username },
724
- value: import_error.ErrorTypes.DATABASE_ERROR
725
- }, error, context);
726
- }
727
- return true;
728
- };
729
- const getActiveUserCount = (context) => {
730
- const action = "getActiveUserCount";
731
- const { database } = context;
732
- const countQuery = import_arangojs.aql`LET docs = (
81
+ RETURN NEW`;try{await f(s).query(r).then(l=>l.next())}catch(l){return g({action:o,category:E,params:{userId:a,username:t},value:T.DATABASE_ERROR},l,e),!1}return!0},Qe=e=>{const o="getActiveUserCount",{databaseName:s}=e,a=U`LET docs = (
733
82
  FOR u IN users
734
83
  FILTER u.active == true
735
84
  RETURN u
736
85
  )
737
- RETURN LENGTH(docs)`;
738
- return database.query(countQuery).then((cursor) => cursor.next()).catch((error) => (0, import_analyticsUtils.logError)({
739
- action,
740
- category: eventCategory,
741
- value: import_error.ErrorTypes.DATABASE_ERROR
742
- }, error, context));
743
- };
744
- const getUserByToken = (context, token) => {
745
- const action = "getUserByToken";
746
- const { database } = context;
747
- const { userId } = (0, import_session.getSession)(token);
748
- const userDocId = (0, import_arangodbUtils.getDocId)("users", { userId });
749
- const aqlQuery = import_arangojs.aql`LET u = DOCUMENT("${userDocId}") RETURN u`;
750
- return database.query(aqlQuery).then((cursor) => cursor.next()).catch((error) => (0, import_analyticsUtils.logError)({
751
- action,
752
- category: eventCategory,
753
- params: { userId },
754
- value: import_error.ErrorTypes.DATABASE_ERROR
755
- }, error, context));
756
- };
757
- // Annotate the CommonJS export names for ESM import in node:
758
- 0 && (module.exports = {
759
- UserAccess,
760
- addUser,
761
- confirmCode,
762
- createToken,
763
- deactivateUser,
764
- deleteUser,
765
- forgotPassword,
766
- getActiveUserCount,
767
- getDisplayName,
768
- getSessionUser,
769
- getUser,
770
- getUserByToken,
771
- getUserOptional,
772
- getUsers,
773
- getUsersByConnection,
774
- getUsersByLatest,
775
- getUsersByReactions,
776
- getUsersByTags,
777
- parseUserOptions,
778
- refreshSession,
779
- resetPassword,
780
- signIn,
781
- signOut,
782
- updateUser
783
- });
784
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvdXNlcnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge1xuICBjcmVhdGVIYXNoLFxuICBjcmVhdGVQYXNzd29yZCxcbiAgcGFyc2VBcmFuZ29JZCxcbiAgcGFyc2VDaGFyLFxuICBwYXJzZUVtYWlsLFxuICBwYXJzZU51bSxcbiAgcGFyc2VQYXNzd29yZCxcbiAgcGFyc2VQaG9uZSxcbiAgcGFyc2VVc2VybmFtZVxufSBmcm9tICdAbmxhYnMvdXRpbHMnO1xuaW1wb3J0IHthcWx9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQge0RhdGVUaW1lfSBmcm9tICdsdXhvbic7XG5pbXBvcnQgU3RyaXBlIGZyb20gJ3N0cmlwZSc7XG5cbmltcG9ydCB7cGFyc2VVc2VyfSBmcm9tICcuLi9hZGFwdGVycy91c2VyQWRhcHRlcic7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7c2VuZEVtYWlsfSBmcm9tICcuL2VtYWlsJztcbmltcG9ydCB7c2VuZFNtc30gZnJvbSAnLi9zbXMnO1xuaW1wb3J0IHtFcnJvclR5cGVzLCBTZXNzaW9uRXJyb3J9IGZyb20gJy4uL3R5cGVzL2Vycm9yLnR5cGVzJztcbmltcG9ydCB7bG9nRXJyb3IsIGxvZ0V4Y2VwdGlvbn0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzVXRpbHMnO1xuaW1wb3J0IHtnZXREb2NJZCwgZ2V0TGltaXQsIHNlbGVjdFJlYWN0aW9uQ291bnRCeVR5cGV9IGZyb20gJy4uL3V0aWxzL2FyYW5nb2RiVXRpbHMnO1xuaW1wb3J0IHtnZXRTZXNzaW9uLCBpc0FkbWluVXNlciwgU2Vzc2lvblRva2VuLCBzZXRTZXNzaW9ufSBmcm9tICcuLi91dGlscy9zZXNzaW9uJztcblxuaW1wb3J0IHR5cGUge0FwaUNvbnRleHR9IGZyb20gJy4uL3R5cGVzL2F1dGgudHlwZXMnO1xuaW1wb3J0IHR5cGUge1VzZXJUeXBlfSBmcm9tICcuLi90eXBlcy91c2Vycy50eXBlcyc7XG5pbXBvcnQgdHlwZSB7RWRnZUNvbGxlY3Rpb259IGZyb20gJ2FyYW5nb2pzL2NvbGxlY3Rpb25zJztcblxuXG5jb25zdCBldmVudENhdGVnb3J5ID0gJ3VzZXJzJztcbmNvbnN0IFNUUklQRV9BUElfVkVSU0lPTiA9ICcyMDI1LTA1LTI4LmJhc2lsJztcblxuZXhwb3J0IGludGVyZmFjZSBVc2VyT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGZyb20/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHRvPzogbnVtYmVyO1xuICByZWFkb25seSB1c2VybmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGVudW0gVXNlckFjY2VzcyB7XG4gIERFQUNUSVZBVEVEID0gMCxcbiAgQUNUSVZFID0gMSxcbiAgUFJFTUlVTSA9IDIsXG4gIENPTlRFTlRfQURNSU4gPSAzLFxuICBBRE1JTiA9IDRcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVRva2VuID0gKFxuICB1c2VySWQ6IHN0cmluZyxcbiAgdXNlcm5hbWU6IHN0cmluZyxcbiAgdXNlckFjY2VzczogbnVtYmVyLFxuICBleHBpcmVzSW5NaW51dGVzOiBudW1iZXIgPSAxNVxuKTogU2Vzc2lvblRva2VuID0+IHtcbiAgY29uc3Qgbm93OiBEYXRlVGltZSA9IERhdGVUaW1lLmxvY2FsKCk7XG4gIGNvbnN0IHNlc3Npb25FeHBpcmVzOiBEYXRlVGltZSA9IG5vdy5wbHVzKHttaW51dGVzOiBleHBpcmVzSW5NaW51dGVzfSk7XG4gIGNvbnN0IGlhdDogbnVtYmVyID0gTWF0aC5mbG9vcihub3cudG9TZWNvbmRzKCkpO1xuICBjb25zdCBleHA6IG51bWJlciA9IE1hdGguZmxvb3Ioc2Vzc2lvbkV4cGlyZXMudG9TZWNvbmRzKCkpO1xuICBjb25zdCB0b2tlbiA9IHNldFNlc3Npb24oe1xuICAgIGV4cCxcbiAgICBpYXQsXG4gICAgdXNlckFjY2VzcyxcbiAgICB1c2VySWQsXG4gICAgdXNlcm5hbWVcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBleHBpcmVzOiBzZXNzaW9uRXhwaXJlcy50b01pbGxpcygpLFxuICAgIGlzc3VlZDogbm93LnRvTWlsbGlzKCksXG4gICAgdG9rZW4sXG4gICAgdXNlcklkLFxuICAgIHVzZXJuYW1lXG4gIH07XG59O1xuXG5pbnRlcmZhY2UgU2VsZWN0QWNjdW11bGF0b3Ige1xuICBvYmplY3RzOiBzdHJpbmdbXTtcbiAgcXVlcmllczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBjb25zdCBnZXRVc2VyT3B0aW9uYWwgPSAoZmllbGRzOiBzdHJpbmdbXSA9IFtdKTogU2VsZWN0QWNjdW11bGF0b3IgPT5cbiAgZmllbGRzLnJlZHVjZSgoc2VsZWN0czogU2VsZWN0QWNjdW11bGF0b3IsIGZpZWxkOiBzdHJpbmcpID0+IHtcbiAgICBpZihmaWVsZC5pbmNsdWRlcygnQ291bnQnKSkge1xuICAgICAgcmV0dXJuIHNlbGVjdFJlYWN0aW9uQ291bnRCeVR5cGUoJ3VzZXJzJywgJ3UnLCBmaWVsZCwgc2VsZWN0cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGVjdHM7XG4gIH0sIHtvYmplY3RzOiBbXSwgcXVlcmllczogW119KTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlVXNlck9wdGlvbnMgPSAob3B0aW9uczogVXNlck9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZnJvbSA9IDAsXG4gICAgdG8gPSAzMFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgbGltaXQgPSBnZXRMaW1pdChmcm9tLCB0byk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGxpbWl0XG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgYWRkVXNlciA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCB1c2VyOiBVc2VyVHlwZSk6IFByb21pc2U8VXNlclR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2FkZFVzZXInO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3Qge2VtYWlsLCBwYXNzd29yZCwgcGhvbmUsIHVzZXJuYW1lfSA9IHBhcnNlVXNlcih1c2VyKTtcbiAgY29uc3QgZm9ybWF0VXNlcm5hbWU6IHN0cmluZyA9IHBhcnNlVXNlcm5hbWUodXNlcm5hbWUpO1xuICBjb25zdCBmb3JtYXRFbWFpbDogc3RyaW5nID0gcGFyc2VFbWFpbChlbWFpbCk7XG4gIGNvbnN0IGZvcm1hdFBob25lOiBzdHJpbmcgPSBwYXJzZVBob25lKHBob25lKTtcbiAgY29uc3QgZm9ybWF0UGFzc3dvcmQ6IHN0cmluZyA9IHBhcnNlUGFzc3dvcmQocGFzc3dvcmQpO1xuICBjb25zdCBoYXNQYXNzd29yZCA9ICEhZm9ybWF0UGFzc3dvcmQ7XG4gIGNvbnN0IGhhc1VzZXJuYW1lID0gISFmb3JtYXRVc2VybmFtZSB8fCAhIWZvcm1hdFBob25lIHx8ICEhZm9ybWF0RW1haWw7XG5cbiAgaWYoIWhhc1Bhc3N3b3JkIHx8ICFoYXNVc2VybmFtZSkge1xuICAgIHJldHVybiBsb2dFeGNlcHRpb24oe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTlZBTElEX0FSR1VNRU5UU1xuICAgIH0sIGNvbnRleHQpO1xuICB9XG5cbiAgY29uc3QgaGFzaElkID0gZm9ybWF0VXNlcm5hbWUgfHwgZm9ybWF0UGhvbmUgfHwgZm9ybWF0RW1haWw7XG4gIGNvbnN0IHNhbHQ6IHN0cmluZyA9IGNyZWF0ZUhhc2goYCR7aGFzaElkfSR7Zm9ybWF0UGFzc3dvcmR9YCwgbnVsbCk7XG4gIGNvbnN0IGVuY3J5cHRlZFBhc3N3b3JkID0gY3JlYXRlUGFzc3dvcmQoZm9ybWF0UGFzc3dvcmQsIHNhbHQpO1xuICBjb25zdCBmaWx0ZXJzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmKGZvcm1hdFVzZXJuYW1lKSB7XG4gICAgZmlsdGVycy5wdXNoKGB1LnVzZXJuYW1lID09IFwiJHtmb3JtYXRVc2VybmFtZX1cImApO1xuICB9XG5cbiAgaWYoZm9ybWF0RW1haWwpIHtcbiAgICBmaWx0ZXJzLnB1c2goYHUuZW1haWwgPT0gXCIke2Zvcm1hdEVtYWlsfVwiYCk7XG4gIH1cblxuICBpZihmb3JtYXRQaG9uZSkge1xuICAgIGZpbHRlcnMucHVzaChgdS5waG9uZSA9PSAke2Zvcm1hdFBob25lfWApO1xuICB9XG5cbiAgY29uc3QgY2hlY2tRdWVyeTogc3RyaW5nID0gYEZPUiB1IElOIHVzZXJzXG4gICAgRklMVEVSICR7ZmlsdGVycy5qb2luKCcgfHwgJyl9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiB1YDtcblxuICB0cnkge1xuICAgIGNvbnN0IGV4aXN0aW5nVXNlcnMgPSBhd2FpdCBkYXRhYmFzZS5xdWVyeShjaGVja1F1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG5cbiAgICBpZihleGlzdGluZ1VzZXJzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGxvZ0V4Y2VwdGlvbih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGVtYWlsOiBmb3JtYXRFbWFpbCxcbiAgICAgICAgICBwaG9uZTogZm9ybWF0UGhvbmUsXG4gICAgICAgICAgdXNlcm5hbWU6IGZvcm1hdFVzZXJuYW1lXG4gICAgICAgIH0sXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkVYSVNUSU5HX0lURU1cbiAgICAgIH0sIGNvbnRleHQpO1xuICAgIH1cbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHJldHVybiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3VzZXJuYW1lfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICB9XG5cbiAgY29uc3QgdmVyaWZpZWRFbWFpbENvZGU6IG51bWJlciA9IE1hdGguZmxvb3IoMTAwMDAwICsgKE1hdGgucmFuZG9tKCkgKiA5MDAwMDApKTtcbiAgY29uc3QgdmVyaWZpZWRQaG9uZUNvZGU6IG51bWJlciA9IE1hdGguZmxvb3IoMTAwMDAwICsgKE1hdGgucmFuZG9tKCkgKiA5MDAwMDApKTtcblxuICBjb25zdCBpbnNlcnQ6IFVzZXJUeXBlID0ge1xuICAgIF9rZXk6IGNyZWF0ZUhhc2goZm9ybWF0VXNlcm5hbWUsIG51bGwpLFxuICAgIGFkZGVkOiBEYXRlLm5vdygpLFxuICAgIGVtYWlsOiBmb3JtYXRFbWFpbCxcbiAgICBtb2RpZmllZDogRGF0ZS5ub3coKSxcbiAgICBwYXNzd29yZDogZW5jcnlwdGVkUGFzc3dvcmQsXG4gICAgcGhvbmU6IGZvcm1hdFBob25lLFxuICAgIHNhbHQsXG4gICAgdXNlckFjY2VzczogMSxcbiAgICB1c2VybmFtZTogZm9ybWF0VXNlcm5hbWUsXG4gICAgdmVyaWZpZWRFbWFpbDogZmFsc2UsXG4gICAgdmVyaWZpZWRFbWFpbENvZGUsXG4gICAgdmVyaWZpZWRQaG9uZTogZmFsc2UsXG4gICAgdmVyaWZpZWRQaG9uZUNvZGVcbiAgfTtcblxuICBjb25zdCBpbnNlcnRRdWVyeTogQXFsUXVlcnkgPSBhcWxgSU5TRVJUICR7aW5zZXJ0fSBJTiB1c2VycyBSRVRVUk4gTkVXYDtcblxuICByZXR1cm4gYXdhaXQgZGF0YWJhc2UucXVlcnkoaW5zZXJ0UXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3VzZXJuYW1lfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVVc2VyID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXI6IFVzZXJUeXBlKTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAndXBkYXRlVXNlcic7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbn0gPSBjb250ZXh0O1xuICBjb25zdCB7X2tleSwgX2lkLCBpZCwgdGFncyA9IFtdLCB1c2VySWQsIC4uLnVwZGF0ZWR9ID0gcGFyc2VVc2VyKHVzZXIpO1xuXG4gIGlmKCFpc0FkbWluVXNlcihzZXNzaW9uKSAmJiAoc2Vzc2lvbj8udXNlcklkICE9PSB1c2VySWQpKSB7XG4gICAgcmV0dXJuIGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3Nlc3Npb259LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU5WQUxJRF9TRVNTSU9OXG4gICAgfSwgY29udGV4dCk7XG4gIH1cblxuICBjb25zdCB1c2VyUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYExFVCB1ID0gRE9DVU1FTlQoJHtpZH0pXG4gICAgVVBEQVRFIHUgV0lUSCAke3VwZGF0ZWR9IElOIHVzZXJzXG4gICAgUkVUVVJOIE5FV2A7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB1cGRhdGVkVXNlciA9IGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KHVzZXJRdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcbiAgICBjb25zdCB0YWdDb2xsZWN0aW9uOiBFZGdlQ29sbGVjdGlvbiA9IGRhdGFiYXNlLmNvbGxlY3Rpb24oJ2lzVGFnZ2VkJyk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbCh0YWdzLm1hcCgoe2lkOiB0YWdEb2NJZCwgbmFtZX0pID0+IHtcbiAgICAgIGNvbnN0IHRhZ1F1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgaXQgSU4gaXNUYWdnZWRcbiAgICAgICAgRklMVEVSIGl0Ll9mcm9tID09ICR7dGFnRG9jSWR9ICYmIGl0Ll90byA9PSAke2lkfSAmJiBpdC5uYW1lID09ICR7bmFtZX1cbiAgICAgICAgTElNSVQgMVxuICAgICAgICBSRVRVUk4gaXRgO1xuXG4gICAgICByZXR1cm4gZGF0YWJhc2UucXVlcnkodGFnUXVlcnkpXG4gICAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAgIC50aGVuKCh0YWdFZGdlKSA9PiB7XG4gICAgICAgICAgaWYoISF0YWdFZGdlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFnRWRnZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBlZGdlID0ge1xuICAgICAgICAgICAgX2Zyb206IHRhZ0RvY0lkLFxuICAgICAgICAgICAgX2tleTogY3JlYXRlSGFzaChgaXNUYWdnZWQtJHt0YWdEb2NJZH0tJHtpZH1gKSxcbiAgICAgICAgICAgIF90bzogaWQsXG4gICAgICAgICAgICBhZGRlZDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIG5hbWVcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgcmV0dXJuIHRhZ0NvbGxlY3Rpb24uc2F2ZShlZGdlLCB7cmV0dXJuTmV3OiB0cnVlfSkudGhlbigoKSA9PiBlZGdlKTtcbiAgICAgICAgfSk7XG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIHVwZGF0ZWRVc2VyO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgcmV0dXJuIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7dXNlcn0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGZvcmdvdFBhc3N3b3JkID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIHtlbWFpbCwgcGhvbmUsIHVzZXJuYW1lfSk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZm9yZ290UGFzc3dvcmQnO1xuICBjb25zdCB7YXBwLCBkYXRhYmFzZX0gPSBjb250ZXh0O1xuICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgRk9SIHUgSU4gdXNlcnNcbiAgICBGSUxURVIgdS5lbWFpbCA9PSAke2VtYWlsfSB8fCB1LnBob25lID09ICR7cGhvbmV9IHx8IHUudXNlcm5hbWUgPT0gJHt1c2VybmFtZX1cbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIHVgO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgICAgLnRoZW4oYXN5bmMgKGN1cnNvcikgPT4ge1xuICAgICAgICBjb25zdCB1c2VyID0gY3Vyc29yLm5leHQoKTtcblxuICAgICAgICBpZih1c2VyKSB7XG4gICAgICAgICAgY29uc3Qge2VtYWlsLCBwaG9uZSwgdmVyaWZpZWRFbWFpbCwgdmVyaWZpZWRQaG9uZX0gPSB1c2VyIGFzIFVzZXJUeXBlO1xuICAgICAgICAgIGNvbnN0IGNvZGVFeHBpcmVzID0gMTAwMCAqIDYwICogMTU7IC8vIDE1IG1pbnV0ZXNcbiAgICAgICAgICBjb25zdCBjb2RlID0gTWF0aC5mbG9vcigxMDAwMDAgKyAoTWF0aC5yYW5kb20oKSAqIDkwMDAwMCkpO1xuICAgICAgICAgIGNvbnN0IHVzZXJEb2NJZCA9IGdldERvY0lkKCd1c2VycycsIHVzZXIpO1xuICAgICAgICAgIGxldCB1cGRhdGU7XG5cbiAgICAgICAgICBpZihlbWFpbCAmJiB2ZXJpZmllZEVtYWlsKSB7XG4gICAgICAgICAgICBzZW5kRW1haWwoe1xuICAgICAgICAgICAgICBhcHAsXG4gICAgICAgICAgICAgIHRleHQ6IGBZb3VyIGNvZGUgaXMgJHtjb2RlfWBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdXBkYXRlID0ge3ZlcmlmaWVkRW1haWxDb2RlOiBjb2RlLCB2ZXJpZmllZEVtYWlsRXhwaXJlczogY29kZUV4cGlyZXN9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmKHBob25lICYmIHZlcmlmaWVkUGhvbmUpIHtcbiAgICAgICAgICAgIHNlbmRTbXMoe1xuICAgICAgICAgICAgICBhcHAsXG4gICAgICAgICAgICAgIHRleHQ6IGBZb3VyIGNvZGUgaXMgJHtjb2RlfWBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdXBkYXRlID0ge3ZlcmlmaWVkUGhvbmVDb2RlOiBjb2RlLCB2ZXJpZmllZFBob25lRXhwaXJlczogY29kZUV4cGlyZXN9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmKHVwZGF0ZS52ZXJpZmllZEVtYWlsQ29kZSB8fCB1cGRhdGUudmVyaWZpZWRQaG9uZUNvZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZVF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBVUERBVEUgJHt1c2VyRG9jSWR9IFdJVEggJHt1cGRhdGV9IElOIHVzZXJzYDtcblxuICAgICAgICAgICAgYXdhaXQgZGF0YWJhc2UucXVlcnkodXBkYXRlUXVlcnkpO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7ZW1haWwsIHBob25lLCB1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHJlc2V0UGFzc3dvcmQgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtcbiAgICBjb2RlLFxuICAgIHBhc3N3b3JkLFxuICAgIHR5cGUsXG4gICAgdXNlcm5hbWVcbiAgfToge1xuICAgIGNvZGU6IG51bWJlcixcbiAgICBwYXNzd29yZDogc3RyaW5nLFxuICAgIHR5cGU6ICdwaG9uZScgfCAnZW1haWwnLFxuICAgIHVzZXJuYW1lOiBzdHJpbmdcbiAgfVxuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdyZXNldFBhc3N3b3JkJztcbiAgY29uc3Qge2RhdGFiYXNlfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdFBhc3N3b3JkOiBzdHJpbmcgPSBwYXJzZVBhc3N3b3JkKHBhc3N3b3JkKTtcbiAgY29uc3QgYXFsUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiB1IElOIHVzZXJzXG4gICAgRklMVEVSIHUudXNlcm5hbWUgPT0gJHt1c2VybmFtZX1cbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIHVgO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgICAgLnRoZW4oYXN5bmMgKGN1cnNvcikgPT4ge1xuICAgICAgICBjb25zdCB1c2VyID0gY3Vyc29yLm5leHQoKTtcblxuICAgICAgICBpZih1c2VyKSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgX2lkOiB1c2VyRG9jSWQsXG4gICAgICAgICAgICBzYWx0LFxuICAgICAgICAgICAgdmVyaWZpZWRFbWFpbENvZGUsXG4gICAgICAgICAgICB2ZXJpZmllZEVtYWlsRXhwaXJlcyxcbiAgICAgICAgICAgIHZlcmlmaWVkUGhvbmVDb2RlLFxuICAgICAgICAgICAgdmVyaWZpZWRQaG9uZUV4cGlyZXNcbiAgICAgICAgICB9ID0gdXNlciBhcyBVc2VyVHlwZTtcbiAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIGxldCB1cGRhdGU7XG5cbiAgICAgICAgICBzd2l0Y2godHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnZW1haWwnOlxuICAgICAgICAgICAgICBpZihjb2RlID09PSB2ZXJpZmllZEVtYWlsQ29kZSAmJiB2ZXJpZmllZEVtYWlsRXhwaXJlcyA+IG5vdykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhc3N3b3JkOiBzdHJpbmcgPSBjcmVhdGVQYXNzd29yZChmb3JtYXRQYXNzd29yZCwgc2FsdCk7XG4gICAgICAgICAgICAgICAgdXBkYXRlID0ge3Bhc3N3b3JkfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3Bob25lJzpcbiAgICAgICAgICAgICAgaWYoY29kZSA9PT0gdmVyaWZpZWRQaG9uZUNvZGUgJiYgdmVyaWZpZWRQaG9uZUV4cGlyZXMgPiBub3cpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXNzd29yZDogc3RyaW5nID0gY3JlYXRlUGFzc3dvcmQoZm9ybWF0UGFzc3dvcmQsIHNhbHQpO1xuICAgICAgICAgICAgICAgIHVwZGF0ZSA9IHtwYXNzd29yZH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYodXBkYXRlKSB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVRdWVyeTogQXFsUXVlcnkgPSBhcWxgVVBEQVRFICR7dXNlckRvY0lkfSBXSVRIICR7dXBkYXRlfSBJTiB1c2Vyc2A7XG5cbiAgICAgICAgICAgIGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KHVwZGF0ZVF1ZXJ5KTtcblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3VzZXJuYW1lfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgY29uZmlybUNvZGUgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtcbiAgICBjb2RlLFxuICAgIHR5cGVcbiAgfToge1xuICAgIGNvZGU6IG51bWJlcixcbiAgICB0eXBlOiAncGhvbmUnIHwgJ2VtYWlsJ1xuICB9XG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2NvbmZpcm1Db2RlJztcbiAgY29uc3Qge2RhdGFiYXNlLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHVzZXJEb2NJZCA9IGdldERvY0lkKCd1c2VycycsIHt1c2VySWQ6IHNlc3Npb25JZH0pO1xuICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgTEVUIHUgPSBET0NVTUVOVCgke3VzZXJEb2NJZH0pIFJFVFVSTiB1YDtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBkYXRhYmFzZS5xdWVyeShhcWxRdWVyeSlcbiAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAudGhlbigoe3ZlcmlmaWVkRW1haWxDb2RlLCB2ZXJpZmllZFBob25lQ29kZX06IFVzZXJUeXBlKSA9PiB7XG4gICAgICAgIHN3aXRjaCh0eXBlKSB7XG4gICAgICAgICAgY2FzZSAnZW1haWwnOlxuICAgICAgICAgICAgcmV0dXJuIGNvZGUgPT09IHZlcmlmaWVkRW1haWxDb2RlO1xuICAgICAgICAgIGNhc2UgJ3Bob25lJzpcbiAgICAgICAgICAgIHJldHVybiBjb2RlID09PSB2ZXJpZmllZFBob25lQ29kZTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7Y29kZSwgdHlwZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZVVzZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcjogVXNlclR5cGUpOiBQcm9taXNlPFVzZXJUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdkZWxldGVVc2VyJztcbiAgY29uc3Qge2RhdGFiYXNlfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHt1c2VySWR9ID0gcGFyc2VVc2VyKHVzZXIpO1xuXG4gIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgdSBJTiB1c2Vyc1xuICAgIEZJTFRFUiB1Ll9rZXkgPT0gJHt1c2VySWR9XG4gICAgTElNSVQgMVxuICAgIFJFTU9WRSB1IElOIHVzZXJzXG4gICAgUkVUVVJOIE9MRGA7XG5cbiAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gbmV3IFN0cmlwZShDb25maWcuZ2V0KCdzdHJpcGUudG9rZW4nKSwge2FwaVZlcnNpb246IFNUUklQRV9BUElfVkVSU0lPTiwgdHlwZXNjcmlwdDogdHJ1ZX0pO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChkZWxldGVkVXNlcikgPT4gc3RyaXBlQ2xpZW50LmN1c3RvbWVycy5kZWwoZGVsZXRlZFVzZXI/LnN0cmlwZUN1c3RvbWVySWQpXG4gICAgICAudGhlbigoKSA9PiBzdHJpcGVDbGllbnQuYWNjb3VudHMuZGVsKGRlbGV0ZWRVc2VyPy5zdHJpcGVBY2NvdW50SWQpKVxuICAgICAgLnRoZW4oKCkgPT4gZGVsZXRlZFVzZXIpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3VzZXJJZH0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLGNvbnRleHQpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWFjdGl2YXRlVXNlciA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB1c2VyOiBVc2VyVHlwZSk6IFByb21pc2U8VXNlclR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2RlbGV0ZSc7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuICBjb25zdCB7dXNlcklkfSA9IHBhcnNlVXNlcih1c2VyKTtcbiAgY29uc3QgdXBkYXRlZDogVXNlclR5cGUgPSB7XG4gICAgdXNlckFjY2VzczogMFxuICB9O1xuICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgVVBEQVRFICR7dXNlcklkfSBXSVRIICR7dXBkYXRlZH0gSU4gdXNlcnMgTElNSVQgMSBSRVRVUk4gTkVXYDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VySWR9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvcixjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGlzcGxheU5hbWUgPSAodXNlcjogVXNlclR5cGUpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB7Zmlyc3QsIGxhc3QsIG5hbWUgPSAnJywgdXNlcm5hbWUgPSAnJ30gPSB1c2VyO1xuICBjb25zdCBmdWxsbmFtZSA9IChbZmlyc3QsIGxhc3RdKS5qb2luKCcgJykudHJpbSgpO1xuXG4gIGlmKG5hbWUpIHtcbiAgICByZXR1cm4gbmFtZTtcbiAgfSBlbHNlIGlmKGZ1bGxuYW1lICE9PSAnJykge1xuICAgIHJldHVybiBmdWxsbmFtZTtcbiAgfSBlbHNlIGlmKHVzZXJuYW1lKSB7XG4gICAgcmV0dXJuIHVzZXJuYW1lO1xuICB9XG5cbiAgcmV0dXJuICdVbmtub3duJztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTZXNzaW9uVXNlciA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0U2Vzc2lvblVzZXInO1xuICBjb25zb2xlLmxvZygnZ2V0U2Vzc2lvblVzZXInLCB7YWN0aW9uLCBjb250ZXh0fSk7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWQsIHVzZXJuYW1lfX0gPSBjb250ZXh0O1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRVc2VyT3B0aW9uYWwoZmllbGRzKTtcbiAgY29uc3QgZm9ybWF0U2Vzc2lvbklkID0gcGFyc2VBcmFuZ29JZChgdXNlcnMvJHtzZXNzaW9uSWR9YCk7XG5cbiAgY29uc3QgYXFsUXVlcnk6IHN0cmluZyA9IGBMRVQgdSA9IERPQ1VNRU5UKFwiJHtmb3JtYXRTZXNzaW9uSWR9XCIpXG4gICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgUkVUVVJOIE1FUkdFKHUsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkgYXMgdW5rbm93biBhcyBVc2VyVHlwZSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBwYXJhbXM6IHt1c2VySWQ6IHNlc3Npb25JZCwgdXNlcm5hbWV9LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2VyID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXI6IFVzZXJUeXBlKTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0VXNlcic7XG4gIGNvbnN0IHtpZCwgdXNlcklkLCB1c2VybmFtZX0gPSBwYXJzZVVzZXIodXNlcik7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFVzZXJPcHRpb25hbChmaWVsZHMpO1xuICBsZXQgYXFsUXVlcnk6IHN0cmluZztcblxuICBjb25zb2xlLmxvZyh7aWQsIHVzZXJJZCwgdXNlcm5hbWV9KTtcbiAgaWYoaWQpIHtcbiAgICBhcWxRdWVyeSA9IGBMRVQgdSA9IERPQ1VNRU5UKFwiJHtpZH1cIilcbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgRklMVEVSIHUudXNlckFjY2VzcyA+IDBcbiAgICBSRVRVUk4gTUVSR0UodSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcbiAgfSBlbHNlIGlmKHVzZXJuYW1lKSB7XG4gICAgYXFsUXVlcnkgPSBgRk9SIHUgSU4gdXNlcnNcbiAgICBGSUxURVIgdS51c2VybmFtZSA9PSBcIiR7dXNlcm5hbWV9XCJcbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgUkVUVVJOIE1FUkdFKHUsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG4gIH1cblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigodXNlcikgPT4gdXNlcilcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHtpZCwgdXNlcklkLCB1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlcnMgPSAoY29udGV4dDogQXBpQ29udGV4dCwgb3B0aW9ucz86IFVzZXJPcHRpb25zKTogUHJvbWlzZTxVc2VyVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRVc2VyTGlzdCc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsaW1pdCwgdXNlcm5hbWV9ID0gcGFyc2VVc2VyT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0VXNlck9wdGlvbmFsKGZpZWxkcyk7XG4gIGNvbnN0IGZpbHRlckJ5OiBzdHJpbmdbXSA9IFsndS51c2VyQWNjZXNzID4gMCddO1xuXG4gIGlmKHVzZXJuYW1lKSB7XG4gICAgZmlsdGVyQnkucHVzaChgQ09OVEFJTlModS51c2VybmFtZSwgXCIke3BhcnNlVXNlcm5hbWUodXNlcm5hbWUpfVwiKWApO1xuICB9XG5cbiAgY29uc3QgYXFsUXVlcnk6IHN0cmluZyA9IGBGT1IgdSBJTiB1c2Vyc1xuICAgIEZJTFRFUiAke2ZpbHRlckJ5LmpvaW4oJyAmJiAnKX1cbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgJHtsaW1pdC5hcWx9XG4gICAgU09SVCB1LnVzZXJuYW1lXG4gICAgUkVUVVJOIE1FUkdFKHUsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIFVzZXJUeXBlW10pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIFtdIGFzIFVzZXJUeXBlW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlcnNCeVJlYWN0aW9ucyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAge3JlYWN0aW9ucyA9IFtdLCB1c2VybmFtZX0sXG4gIG9wdGlvbnM/OiBVc2VyT3B0aW9uc1xuKTogUHJvbWlzZTxVc2VyVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRVc2Vyc0J5UmVhY3Rpb25zJztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0UmVhY3Rpb25zOiBzdHJpbmdbXSA9ICByZWFjdGlvbnMubWFwKChyZWFjdGlvbk5hbWU6IHN0cmluZykgPT4gcGFyc2VDaGFyKHJlYWN0aW9uTmFtZSwgMzIpLnRvTG93ZXJDYXNlKCkpO1xuICBjb25zdCB7bGltaXR9ID0gcGFyc2VVc2VyT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0VXNlck9wdGlvbmFsKGZpZWxkcyk7XG4gIGNvbnN0IGZvcm1hdFNlc3Npb25JZDogc3RyaW5nID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG4gIGNvbnN0IGZvcm1hdFVzZXJuYW1lOiBzdHJpbmcgPSBwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKTtcbiAgY29uc3QgZmlsdGVyQnk6IHN0cmluZ1tdID0gW1xuICAgICd1LnVzZXJBY2Nlc3MgPiAwJyxcbiAgICBgUE9TSVRJT04oJHtKU09OLnN0cmluZ2lmeShmb3JtYXRSZWFjdGlvbnMpfSwgTE9XRVIoci5uYW1lKSlgXG4gIF07XG5cbiAgaWYodXNlcm5hbWUpIHtcbiAgICBmaWx0ZXJCeS5wdXNoKGBDT05UQUlOUyh1LnVzZXJuYW1lLCBcIiR7Zm9ybWF0VXNlcm5hbWV9XCIpYCk7XG4gIH1cblxuICBjb25zdCBhcWxRdWVyeTogc3RyaW5nID0gYEZPUiB1LCByIElOIE9VVEJPVU5EIFwiJHtmb3JtYXRTZXNzaW9uSWR9XCIgaGFzUmVhY3Rpb25cbiAgICBPUFRJT05TIHt2ZXJ0ZXhDb2xsZWN0aW9uczogXCJ1c2Vyc1wifVxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICBGSUxURVIgJHtmaWx0ZXJCeS5qb2luKCcgJiYgJyl9XG4gICAgJHtsaW1pdC5hcWx9XG4gICAgUkVUVVJOIE1FUkdFKHUsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIFVzZXJUeXBlW10pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIFtdIGFzIFVzZXJUeXBlW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlcnNCeVRhZ3MgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHt0YWdzLCB1c2VybmFtZX0sXG4gIG9wdGlvbnM/OiBVc2VyT3B0aW9uc1xuKTogUHJvbWlzZTxVc2VyVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRVc2Vyc0J5VGFncyc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdFRhZ3M6IHN0cmluZ1tdID0gIHRhZ3M/LnJlZHVjZSgobGlzdDogc3RyaW5nW10sIHRhZ05hbWU6IHN0cmluZykgPT4ge1xuICAgIGlmKHRhZ05hbWUpIHtcbiAgICAgIGxpc3QucHVzaChwYXJzZUNoYXIodGFnTmFtZSwgMzIpLnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0O1xuICB9LCBbXSk7XG4gIGNvbnN0IHtsaW1pdH0gPSBwYXJzZVVzZXJPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRVc2VyT3B0aW9uYWwoZmllbGRzKTtcbiAgY29uc3QgZm9ybWF0VXNlcm5hbWU6IHN0cmluZyA9IHBhcnNlVXNlcm5hbWUodXNlcm5hbWUpO1xuICBjb25zdCBmaWx0ZXJCeTogc3RyaW5nW10gPSBbXG4gICAgYHUuX2tleSAhPSBcIiR7c2Vzc2lvbklkfVwiYCxcbiAgICAndS51c2VyQWNjZXNzID4gMCdcbiAgXTtcblxuICBpZih1c2VybmFtZSkge1xuICAgIGZpbHRlckJ5LnB1c2goYENPTlRBSU5TKHUudXNlcm5hbWUsIFwiJHtmb3JtYXRVc2VybmFtZX1cIilgKTtcbiAgfVxuXG4gIGNvbnN0IGFxbFF1ZXJ5OiBzdHJpbmcgPSBgRk9SIHQgSU4gdGFnc1xuICAgIEZJTFRFUiBQT1NJVElPTigke0pTT04uc3RyaW5naWZ5KGZvcm1hdFRhZ3MpfSwgTE9XRVIodC5uYW1lKSlcbiAgICBGT1IgdSwgaXQgSU4gT1VUQk9VTkQgdCBpc1RhZ2dlZFxuICAgIE9QVElPTlMge2JmczogdHJ1ZSwgdW5pcXVlVmVydGljZXM6IFwiZ2xvYmFsXCIsIHZlcnRleENvbGxlY3Rpb25zOiBcInVzZXJzXCJ9XG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgIEZJTFRFUiAke2ZpbHRlckJ5LmpvaW4oJyAmJiAnKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UodSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgVXNlclR5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gW10gYXMgVXNlclR5cGVbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2Vyc0J5TGF0ZXN0ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHt1c2VybmFtZX0sIG9wdGlvbnM/OiBVc2VyT3B0aW9ucyk6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0VXNlcnNCeUxhdGVzdCc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7bGltaXR9ID0gcGFyc2VVc2VyT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3QgZmlsdGVyID0gW1xuICAgICd1Ll9pZCAhPSBzZXNzaW9uLl9pZCcsXG4gICAgJ3UudXNlckFjY2VzcyA+IDAnXG4gIF07XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFVzZXJPcHRpb25hbChmaWVsZHMpO1xuXG4gIGlmKHVzZXJuYW1lKSB7XG4gICAgZmlsdGVyLnB1c2goYENPTlRBSU5TKHUudXNlcm5hbWUsIFwiJHtwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKX1cIilgKTtcbiAgfVxuXG4gIC8vIEdldCBkYXRhIGZyb20gZGF0YWJhc2VcbiAgY29uc3QgYXFsUXVlcnk6IHN0cmluZyA9IGBGT1IgdSBJTiB1c2Vyc1xuICAgIExFVCBzZXNzaW9uID0gRE9DVU1FTlQoXCJ1c2Vycy8ke3VzZXJJZH1cIilcbiAgICBGSUxURVIgJHtmaWx0ZXIuam9pbignICYmICcpfVxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICBMRVQgZGlzdGFuY2UgPSBESVNUQU5DRSh1LmxhdGl0dWRlIHx8IDAsIHUubG9uZ2l0dWRlIHx8IDAsIHNlc3Npb24ubGF0aXR1ZGUgfHwgMCwgc2Vzc2lvbi5sb25naXR1ZGUgfHwgMClcbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIGRpc3RhbmNlIEFTQywgdS5hZGRlZCBERVNDXG4gICAgUkVUVVJOIE1FUkdFKHUsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIFVzZXJUeXBlW10pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIFtdIGFzIFVzZXJUeXBlW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlcnNCeUNvbm5lY3Rpb24gPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHt1c2VySWR9OiBVc2VyVHlwZSxcbiAgb3B0aW9ucz86IFVzZXJPcHRpb25zXG4pOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFVzZXJzQnlDb25uZWN0aW9uJztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB1c2VybmFtZX0gPSBwYXJzZVVzZXJPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRVc2VyT3B0aW9uYWwoZmllbGRzKTtcbiAgY29uc3QgZm9ybWF0VXNlcklkOiBzdHJpbmcgPSBwYXJzZUFyYW5nb0lkKGB1c2Vycy8ke3VzZXJJZH1gKTtcbiAgY29uc3QgZmlsdGVyQnk6IHN0cmluZ1tdID0gW1xuICAgICd1LnVzZXJBY2Nlc3MgPiAwJ1xuICBdO1xuXG4gIGlmKHVzZXJuYW1lKSB7XG4gICAgZmlsdGVyQnkucHVzaChgQ09OVEFJTlModS51c2VybmFtZSwgXCIke3BhcnNlVXNlcm5hbWUodXNlcm5hbWUpfVwiKWApO1xuICB9XG5cbiAgY29uc3QgYXFsUXVlcnk6IHN0cmluZyA9IGBGT1IgY3UgSU4gdXNlcnNcbiAgICBMRVQgc2Vzc2lvbiA9IERPQ1VNRU5UKFwiJHtmb3JtYXRVc2VySWR9XCIpXG4gICAgRk9SIHUsIGNvbm5lY3Rpb24gSU4gT1VUQk9VTkQgY3UgaGFzQ29ubmVjdGlvblxuICAgIE9QVElPTlMge2JmczogdHJ1ZSwgdW5pcXVlVmVydGljZXM6IFwiZ2xvYmFsXCIsIHZlcnRleENvbGxlY3Rpb25zOiBcInVzZXJzXCJ9XG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgIEZJTFRFUiAke2ZpbHRlckJ5LmpvaW4oJyAmJiAnKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UodSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgVXNlclR5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gW10gYXMgVXNlclR5cGVbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCByZWZyZXNoU2Vzc2lvbiA9ICh7ZXhwaXJlcywgdG9rZW59KTogU2Vzc2lvblRva2VuIHwgU2Vzc2lvbkVycm9yID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB7dXNlcklkLCB1c2VybmFtZSwgdXNlckFjY2Vzc30gPSBnZXRTZXNzaW9uKHRva2VuKTtcbiAgICByZXR1cm4gY3JlYXRlVG9rZW4odXNlcklkLCB1c2VybmFtZSwgdXNlckFjY2VzcywgZXhwaXJlcyk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICB0aHJvdyBlcnJvcjsgLy8gUmUtdGhyb3cgdGhlIGVycm9yIGZyb20gZ2V0U2Vzc2lvblxuICB9XG59O1xuXG5leHBvcnQgY29uc3Qgc2lnbkluID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIGFyZ3MpOiBQcm9taXNlPFNlc3Npb25Ub2tlbj4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnc2lnbkluJztcbiAgY29uc3Qge2RhdGFiYXNlfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtlbWFpbCwgZXhwaXJlcywgcGFzc3dvcmQsIHBob25lLCB1c2VybmFtZX0gPSBhcmdzO1xuICBjb25zdCBmb3JtYXRFbWFpbDogc3RyaW5nID0gcGFyc2VFbWFpbChlbWFpbCk7XG4gIGNvbnN0IGZvcm1hdFVzZXJuYW1lOiBzdHJpbmcgPSBwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKTtcbiAgY29uc3QgZm9ybWF0UGFzc3dvcmQ6IHN0cmluZyA9IHBhcnNlUGFzc3dvcmQocGFzc3dvcmQpO1xuICBjb25zdCBmb3JtYXRQaG9uZTogc3RyaW5nID0gcGFyc2VQaG9uZShwaG9uZSk7XG4gIGNvbnN0IGZvcm1hdEV4cGlyZXM6IG51bWJlciA9IHBhcnNlTnVtKGV4cGlyZXMpIHx8IDE1O1xuXG4gIGlmKCghZm9ybWF0VXNlcm5hbWUgJiYgIWZvcm1hdEVtYWlsICYmICFmb3JtYXRQaG9uZSkgfHwgIWZvcm1hdFBhc3N3b3JkKSB7XG4gICAgbG9nRXhjZXB0aW9uKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7dXNlcm5hbWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU5WQUxJRF9BUkdVTUVOVFNcbiAgICB9LCBjb250ZXh0KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGZpbHRlcnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYoZm9ybWF0RW1haWwpIHtcbiAgICBmaWx0ZXJzLnB1c2goYHUuZW1haWwgPT0gXCIke2Zvcm1hdEVtYWlsfVwiYCk7XG4gIH1cblxuICBpZihmb3JtYXRQaG9uZSkge1xuICAgIGZpbHRlcnMucHVzaChgdS5waG9uZSA9PSAke2Zvcm1hdFBob25lfWApO1xuICB9XG5cbiAgaWYoZm9ybWF0VXNlcm5hbWUpIHtcbiAgICBmaWx0ZXJzLnB1c2goYHUudXNlcm5hbWUgPT0gXCIke2Zvcm1hdFVzZXJuYW1lfVwiYCk7XG4gIH1cblxuICBjb25zdCBjaGVja1F1ZXJ5OiBzdHJpbmcgPSBgRk9SIHUgSU4gdXNlcnNcbiAgICBGSUxURVIgJHtmaWx0ZXJzLmpvaW4oJyB8fCAnKX1cbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIHVgO1xuXG4gIGxldCBjaGVja1VzZXI6IFVzZXJUeXBlO1xuXG4gIHRyeSB7XG4gICAgY2hlY2tVc2VyID0gYXdhaXQgZGF0YWJhc2UucXVlcnkoY2hlY2tRdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7dXNlcm5hbWU6IGZvcm1hdFVzZXJuYW1lfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZighY2hlY2tVc2VyKSB7XG4gICAgbG9nRXhjZXB0aW9uKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7dXNlcm5hbWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU5WQUxJRF9BVVRIRU5USUNBVElPTlxuICAgIH0sIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB7X2tleTogdXNlcklkLCBwYXNzd29yZDogdmFsaWRQYXNzd29yZCwgc2FsdCwgdXNlckFjY2Vzc30gPSBjaGVja1VzZXI7XG4gIGNvbnN0IGF1dGhQYXNzd29yZDogc3RyaW5nID0gY3JlYXRlUGFzc3dvcmQoZm9ybWF0UGFzc3dvcmQsIHNhbHQpO1xuXG4gIGlmKHZhbGlkUGFzc3dvcmQgIT09IGF1dGhQYXNzd29yZCkge1xuICAgIGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3VzZXJBY2Nlc3MsIHVzZXJJZCwgdXNlcm5hbWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU5WQUxJRF9BVVRIRU5USUNBVElPTlxuICAgIH0sIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnNvbGUubG9nKHtmb3JtYXRFeHBpcmVzLCB1c2VyQWNjZXNzLCB1c2VySWQsIHVzZXJuYW1lfSk7XG4gICAgY29uc3QgdG9rZW4gPSBjcmVhdGVUb2tlbih1c2VySWQsIHVzZXJuYW1lLCB1c2VyQWNjZXNzLCBmb3JtYXRFeHBpcmVzKTtcbiAgICBjb25zb2xlLmxvZyh7dG9rZW59KTtcblxuICAgIHJldHVybiB0b2tlbjtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNpZ25PdXQgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnc2lnbk91dCc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkLCB1c2VybmFtZX19ID0gY29udGV4dDtcbiAgY29uc3QgdXNlckRvY0lkOiBzdHJpbmcgPSBgdXNlcnMvJHtzZXNzaW9uSWR9YDtcblxuICBjb25zdCB1cGRhdGUgPSB7XG4gICAgbGFzdE9ubGluZTogRGF0ZS5ub3coKSxcbiAgICBzZXNzaW9uSWQ6IG51bGxcbiAgfTtcbiAgY29uc3Qgc2Vzc2lvblF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBMRVQgdSA9IERPQ1VNRU5UKCR7dXNlckRvY0lkfSlcbiAgICBVUERBVEUgdSBXSVRIICR7dXBkYXRlfSBJTiB1c2Vyc1xuICAgIExJTUlUIDFcbiAgICBSRVRVUk4gTkVXYDtcblxuICB0cnkge1xuICAgIGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KHNlc3Npb25RdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGF3YWl0IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7dXNlcklkOiBzZXNzaW9uSWQsIHVzZXJuYW1lfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QWN0aXZlVXNlckNvdW50ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0QWN0aXZlVXNlckNvdW50JztcbiAgY29uc3Qge2RhdGFiYXNlfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGNvdW50UXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYExFVCBkb2NzID0gKFxuICAgIEZPUiB1IElOIHVzZXJzXG4gICAgRklMVEVSIHUuYWN0aXZlID09IHRydWVcbiAgICBSRVRVUk4gdVxuICApXG4gIFJFVFVSTiBMRU5HVEgoZG9jcylgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShjb3VudFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlckJ5VG9rZW4gPSAoY29udGV4dDogQXBpQ29udGV4dCwgdG9rZW46IHN0cmluZyk6IFByb21pc2U8VXNlclR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFVzZXJCeVRva2VuJztcbiAgY29uc3Qge2RhdGFiYXNlfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHt1c2VySWR9ID0gZ2V0U2Vzc2lvbih0b2tlbik7XG4gIGNvbnN0IHVzZXJEb2NJZCA9IGdldERvY0lkKCd1c2VycycsIHt1c2VySWR9KTtcbiAgY29uc3QgYXFsUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYExFVCB1ID0gRE9DVU1FTlQoXCIke3VzZXJEb2NJZH1cIikgUkVUVVJOIHVgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3VzZXJJZH0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250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
86
+ RETURN LENGTH(docs)`;return f(s).query(a).then(t=>t.next()).catch(t=>{throw g({action:o,category:E,value:T.DATABASE_ERROR},t,e)})},Be=(e,o)=>{const s="getUserByToken",{databaseName:a}=e,{userId:t}=B(o),n=x(`users/${t}`),c=U`LET u = DOCUMENT("${n}") RETURN u`;return f(a).query(c).then(r=>r.next()).catch(r=>{throw g({action:s,category:E,params:{userId:t},value:T.DATABASE_ERROR},r,e)})};export{ie as UserAccess,Ue as addUser,$e as confirmCode,F as createToken,Se as deactivateUser,Ce as deleteUser,Ne as forgotPassword,Qe as getActiveUserCount,we as getDisplayName,qe as getSessionUser,De as getUser,Be as getUserByToken,C as getUserOptional,ve as getUsers,xe as getUsersByConnection,Le as getUsersByLatest,be as getUsersByReactions,Pe as getUsersByTags,v as parseUserOptions,je as refreshSession,Oe as resetPassword,_e as signIn,Me as signOut,he as updateUser};
87
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvdXNlcnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge3BhcnNlTnVtfSBmcm9tICdAbmxhYnMvdXRpbHMvcGFyc2Vycy9udW1iZXJzJztcbmltcG9ydCB7XG4gIGNyZWF0ZUhhc2gsXG4gIGNyZWF0ZVBhc3N3b3JkLFxuICBwYXJzZUFyYW5nb0lkLFxuICBwYXJzZUNoYXIsXG4gIHBhcnNlRW1haWwsXG4gIHBhcnNlUGFzc3dvcmQsXG4gIHBhcnNlUGhvbmUsXG4gIHBhcnNlVXNlcm5hbWVcbn0gZnJvbSAnQG5sYWJzL3V0aWxzL3BhcnNlcnMvc3RyaW5ncyc7XG5pbXBvcnQge2FxbH0gZnJvbSAnYXJhbmdvanMnO1xuaW1wb3J0IHtEYXRlVGltZX0gZnJvbSAnbHV4b24nO1xuaW1wb3J0IFN0cmlwZSBmcm9tICdzdHJpcGUnO1xuXG5pbXBvcnQge3BhcnNlVXNlcn0gZnJvbSAnLi4vYWRhcHRlcnMvdXNlckFkYXB0ZXIuanMnO1xuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5pbXBvcnQge0Vycm9yVHlwZXMsIHR5cGUgU2Vzc2lvbkVycm9yfSBmcm9tICcuLi90eXBlcy9lcnJvci50eXBlcy5qcyc7XG5pbXBvcnQge2xvZ0Vycm9yLCBsb2dFeGNlcHRpb259IGZyb20gJy4uL3V0aWxzL2FuYWx5dGljc1V0aWxzLmpzJztcbmltcG9ydCB7Z2V0RG9jSWQsIGdldExpbWl0LCBzZWxlY3RSZWFjdGlvbkNvdW50QnlUeXBlLCB1c2VEYn0gZnJvbSAnLi4vdXRpbHMvYXJhbmdvZGJVdGlscy5qcyc7XG5pbXBvcnQge2RldGVjdExhbmd1YWdlfSBmcm9tICcuLi91dGlscy9sYW5ndWFnZURldGVjdGlvbi5qcyc7XG5pbXBvcnQge2dldFNlc3Npb24sIHNldFNlc3Npb24sIHR5cGUgU2Vzc2lvblRva2VufSBmcm9tICcuLi91dGlscy9zZXNzaW9uVXRpbHMuanMnO1xuaW1wb3J0IHtzZW5kRW1haWx9IGZyb20gJy4vZW1haWwuanMnO1xuaW1wb3J0IHtzZW5kU21zfSBmcm9tICcuL3Ntcy5qcyc7XG5cbmltcG9ydCB0eXBlIHtBcWxRdWVyeX0gZnJvbSAnYXJhbmdvanMvYXFsJztcbmltcG9ydCB0eXBlIHtFZGdlQ29sbGVjdGlvbn0gZnJvbSAnYXJhbmdvanMvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHR5cGUge0FwaUNvbnRleHR9IGZyb20gJy4uL3R5cGVzL2F1dGgudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1VzZXJJbnB1dCwgVXNlclR5cGV9IGZyb20gJy4uL3R5cGVzL3VzZXJzLnR5cGVzLmpzJztcblxuY29uc3QgZXZlbnRDYXRlZ29yeSA9ICd1c2Vycyc7XG5jb25zdCBTVFJJUEVfQVBJX1ZFUlNJT04gPSAnMjAyNS0wNy0zMC5iYXNpbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlck9wdGlvbnMge1xuICByZWFkb25seSBmcm9tPzogbnVtYmVyO1xuICByZWFkb25seSB0bz86IG51bWJlcjtcbiAgcmVhZG9ubHkgdXNlcm5hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBlbnVtIFVzZXJBY2Nlc3Mge1xuICBERUFDVElWQVRFRCA9IDAsXG4gIEFDVElWRSA9IDEsXG4gIFBSRU1JVU0gPSAyLFxuICBDT05URU5UX0FETUlOID0gMyxcbiAgQURNSU4gPSA0XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVUb2tlbiA9IChcbiAgdXNlcklkOiBzdHJpbmcsXG4gIHVzZXJuYW1lOiBzdHJpbmcgPSAnJyxcbiAgdXNlckFjY2VzczogbnVtYmVyID0gMCxcbiAgZXhwaXJlc0luTWludXRlczogbnVtYmVyID0gMTVcbik6IFNlc3Npb25Ub2tlbiA9PiB7XG4gIGNvbnN0IG5vdzogRGF0ZVRpbWUgPSBEYXRlVGltZS5sb2NhbCgpO1xuICBjb25zdCBzZXNzaW9uRXhwaXJlczogRGF0ZVRpbWUgPSBub3cucGx1cyh7bWludXRlczogZXhwaXJlc0luTWludXRlc30pO1xuICBjb25zdCBpYXQ6IG51bWJlciA9IE1hdGguZmxvb3Iobm93LnRvU2Vjb25kcygpKTtcbiAgY29uc3QgZXhwOiBudW1iZXIgPSBNYXRoLmZsb29yKHNlc3Npb25FeHBpcmVzLnRvU2Vjb25kcygpKTtcbiAgY29uc3QgdG9rZW4gPSBzZXRTZXNzaW9uKHtcbiAgICBleHAsXG4gICAgaWF0LFxuICAgIHVzZXJBY2Nlc3MsXG4gICAgdXNlcklkLFxuICAgIHVzZXJuYW1lXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgZXhwaXJlczogc2Vzc2lvbkV4cGlyZXMudG9NaWxsaXMoKSxcbiAgICBpc3N1ZWQ6IG5vdy50b01pbGxpcygpLFxuICAgIHRva2VuLFxuICAgIHVzZXJJZCxcbiAgICB1c2VybmFtZVxuICB9O1xufTtcblxuaW50ZXJmYWNlIFNlbGVjdEFjY3VtdWxhdG9yIHtcbiAgb2JqZWN0czogc3RyaW5nW107XG4gIHF1ZXJpZXM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0VXNlck9wdGlvbmFsID0gKGZpZWxkczogc3RyaW5nW10gPSBbXSk6IFNlbGVjdEFjY3VtdWxhdG9yID0+XG4gIGZpZWxkcy5yZWR1Y2UoKHNlbGVjdHM6IFNlbGVjdEFjY3VtdWxhdG9yLCBmaWVsZDogc3RyaW5nKSA9PiB7XG4gICAgaWYoZmllbGQuaW5jbHVkZXMoJ0NvdW50JykpIHtcbiAgICAgIHJldHVybiBzZWxlY3RSZWFjdGlvbkNvdW50QnlUeXBlKCd1c2VycycsICd1JywgZmllbGQsIHNlbGVjdHMpO1xuICAgIH1cblxuICAgIHJldHVybiBzZWxlY3RzO1xuICB9LCB7b2JqZWN0czogW10sIHF1ZXJpZXM6IFtdfSk7XG5cbmV4cG9ydCBjb25zdCBwYXJzZVVzZXJPcHRpb25zID0gKG9wdGlvbnM6IFVzZXJPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGZyb20gPSAwLFxuICAgIHRvID0gMzBcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGxpbWl0ID0gZ2V0TGltaXQoZnJvbSwgdG8pO1xuXG4gIHJldHVybiB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBsaW1pdFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZFVzZXIgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcjogVXNlcklucHV0KTogUHJvbWlzZTxVc2VyVHlwZSB8IG51bGw+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2FkZFVzZXInO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBsYW5ndWFnZUNvbnRleHR9ID0gY29udGV4dDtcbiAgY29uc3Qge2NvbmZpcm06IF9jb25maXJtLCAuLi5uZXdVc2VyfSA9IHVzZXI7XG4gIGNvbnN0IHtlbWFpbCwgcGFzc3dvcmQsIHBob25lLCB1c2VybmFtZSwgdXNlcklkLCBfa2V5LCBfaWQsIC4uLmluc2VydFVzZXJ9ID0gcGFyc2VVc2VyKG5ld1VzZXIpO1xuICBjb25zdCBoYXNQYXNzd29yZCA9ICEhcGFzc3dvcmQ7XG4gIGNvbnN0IGhhc1VzZXJuYW1lID0gISF1c2VybmFtZSB8fCAhIXBob25lIHx8ICEhZW1haWw7XG5cbiAgaWYoIWhhc1Bhc3N3b3JkIHx8ICFoYXNVc2VybmFtZSkge1xuICAgIGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3VzZXJuYW1lfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklOVkFMSURfQVJHVU1FTlRTXG4gICAgfSwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGhhc2hJZCA9IHVzZXJuYW1lIHx8IHBob25lIHx8IGVtYWlsO1xuICBjb25zdCBzYWx0OiBzdHJpbmcgPSBjcmVhdGVIYXNoKGAke2hhc2hJZH0ke3Bhc3N3b3JkfWAsICcnKTtcbiAgY29uc3QgZW5jcnlwdGVkUGFzc3dvcmQgPSBjcmVhdGVQYXNzd29yZChwYXNzd29yZCwgc2FsdCk7XG4gIGNvbnN0IGZpbHRlcnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYodXNlcm5hbWUpIHtcbiAgICBmaWx0ZXJzLnB1c2goYHUudXNlcm5hbWUgPT0gXCIke3VzZXJuYW1lfVwiYCk7XG4gIH1cblxuICBpZihlbWFpbCkge1xuICAgIGZpbHRlcnMucHVzaChgdS5lbWFpbCA9PSBcIiR7ZW1haWx9XCJgKTtcbiAgfVxuXG4gIGlmKHBob25lKSB7XG4gICAgZmlsdGVycy5wdXNoKGB1LnBob25lID09ICR7cGhvbmV9YCk7XG4gIH1cblxuICBjb25zdCBjaGVja1F1ZXJ5OiBzdHJpbmcgPSBgRk9SIHUgSU4gdXNlcnNcbiAgICBGSUxURVIgJHtmaWx0ZXJzLmpvaW4oJyB8fCAnKX1cbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIHVgO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZXhpc3RpbmdVc2VycyA9IGF3YWl0IHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoY2hlY2tRdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xuXG4gICAgaWYoZXhpc3RpbmdVc2Vycy5sZW5ndGgpIHtcbiAgICAgIHRocm93IGxvZ0V4Y2VwdGlvbih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGVtYWlsLFxuICAgICAgICAgIHBob25lLFxuICAgICAgICAgIHVzZXJuYW1lXG4gICAgICAgIH0sXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkVYSVNUSU5HX0lURU1cbiAgICAgIH0sIGNvbnRleHQpO1xuICAgIH1cbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHRocm93IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7ZW1haWwsIHBob25lLCB1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgfVxuXG4gIGNvbnN0IHBob25lQ291bnRyeUNvZGUgPSBwaG9uZT8ucmVwbGFjZSgvXFxEL2csICcnKS5zdWJzdHJpbmcoMCwgMyk7XG4gIGNvbnN0IGxvY2FsZSA9IGRldGVjdExhbmd1YWdlKHtcbiAgICAuLi5sYW5ndWFnZUNvbnRleHQsXG4gICAgcGhvbmVDb3VudHJ5Q29kZTogcGhvbmVDb3VudHJ5Q29kZSB8fCAnJyxcbiAgICB1c2VyUHJlZmVyZW5jZTogaW5zZXJ0VXNlci5sb2NhbGUgfHwgJ2VuJ1xuICB9KTtcbiAgY29uc3QgdmVyaWZpZWRFbWFpbENvZGU6IG51bWJlciA9IE1hdGguZmxvb3IoMTAwMDAwICsgKE1hdGgucmFuZG9tKCkgKiA5MDAwMDApKTtcbiAgY29uc3QgdmVyaWZpZWRTbXNDb2RlOiBudW1iZXIgPSBNYXRoLmZsb29yKDEwMDAwMCArIChNYXRoLnJhbmRvbSgpICogOTAwMDAwKSk7XG5cbiAgY29uc3QgaW5zZXJ0OiBVc2VyVHlwZSA9IHtcbiAgICAuLi5pbnNlcnRVc2VyLFxuICAgIF9rZXk6IGNyZWF0ZUhhc2godXNlcm5hbWUpLFxuICAgIGFkZGVkOiBEYXRlLm5vdygpLFxuICAgIGVtYWlsLFxuICAgIGxvY2FsZSxcbiAgICBtb2RpZmllZDogRGF0ZS5ub3coKSxcbiAgICBwYXNzd29yZDogZW5jcnlwdGVkUGFzc3dvcmQsXG4gICAgcGhvbmUsXG4gICAgc2FsdCxcbiAgICB1c2VyQWNjZXNzOiAxLFxuICAgIHVzZXJuYW1lLFxuICAgIHZlcmlmaWVkRW1haWw6IGZhbHNlLFxuICAgIHZlcmlmaWVkRW1haWxDb2RlLFxuICAgIHZlcmlmaWVkUGhvbmU6IGZhbHNlLFxuICAgIHZlcmlmaWVkU21zQ29kZVxuICB9O1xuXG4gIGNvbnN0IGluc2VydFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBJTlNFUlQgJHtpbnNlcnR9IElOIHVzZXJzIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGluc2VydFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgdGhyb3cgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBwYXJhbXM6IHt1c2VybmFtZX0sXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlVXNlciA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCB1c2VyOiBVc2VyVHlwZSk6IFByb21pc2U8VXNlclR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ3VwZGF0ZVVzZXInO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHVwZGF0ZWRVc2VyID0gcGFyc2VVc2VyKHVzZXIpO1xuICBjb25zdCB7X2tleSwgX2lkLCB0YWdzID0gW10sIC4uLnVwZGF0ZX0gPSB1cGRhdGVkVXNlcjtcbiAgY29uc3Qge2lkfSA9IHVwZGF0ZWRVc2VyO1xuXG4gIGNvbnN0IHVzZXJRdWVyeTogQXFsUXVlcnkgPSBhcWxgTEVUIHUgPSBET0NVTUVOVCgke2lkfSlcbiAgICBVUERBVEUgdSBXSVRIICR7dXBkYXRlfSBJTiB1c2Vyc1xuICAgIFJFVFVSTiBORVdgO1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGFiYXNlID0gdXNlRGIoZGF0YWJhc2VOYW1lKTtcbiAgICBjb25zdCB1cGRhdGVkVXNlciA9IGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KHVzZXJRdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcbiAgICBjb25zdCB0YWdDb2xsZWN0aW9uOiBFZGdlQ29sbGVjdGlvbiA9IGRhdGFiYXNlLmNvbGxlY3Rpb24oJ2lzVGFnZ2VkJyk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbCh0YWdzLm1hcCgoe2lkOiB0YWdEb2NJZCwgbmFtZX0pID0+IHtcbiAgICAgIGNvbnN0IHRhZ1F1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgaXQgSU4gaXNUYWdnZWRcbiAgICAgICAgRklMVEVSIGl0Ll9mcm9tID09ICR7dGFnRG9jSWR9ICYmIGl0Ll90byA9PSAke2lkfSAmJiBpdC5uYW1lID09ICR7bmFtZX1cbiAgICAgICAgTElNSVQgMVxuICAgICAgICBSRVRVUk4gaXRgO1xuXG4gICAgICByZXR1cm4gZGF0YWJhc2UucXVlcnkodGFnUXVlcnkpXG4gICAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAgIC50aGVuKCh0YWdFZGdlKSA9PiB7XG4gICAgICAgICAgaWYoISF0YWdFZGdlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFnRWRnZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBlZGdlID0ge1xuICAgICAgICAgICAgX2Zyb206IHRhZ0RvY0lkLFxuICAgICAgICAgICAgX2tleTogY3JlYXRlSGFzaChgaXNUYWdnZWQtJHt0YWdEb2NJZH0tJHtpZH1gKSxcbiAgICAgICAgICAgIF90bzogaWQsXG4gICAgICAgICAgICBhZGRlZDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIG5hbWVcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgcmV0dXJuIHRhZ0NvbGxlY3Rpb24uc2F2ZShlZGdlLCB7cmV0dXJuTmV3OiB0cnVlfSkudGhlbigoKSA9PiBlZGdlKTtcbiAgICAgICAgfSk7XG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIHVwZGF0ZWRVc2VyO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgdGhyb3cgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VyfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZm9yZ290UGFzc3dvcmQgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwge2VtYWlsLCBwaG9uZSwgdXNlcm5hbWV9KTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdmb3Jnb3RQYXNzd29yZCc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3QgYXFsUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiB1IElOIHVzZXJzXG4gICAgRklMVEVSIHUuZW1haWwgPT0gJHtlbWFpbH0gfHwgdS5waG9uZSA9PSAke3Bob25lfSB8fCB1LnVzZXJuYW1lID09ICR7dXNlcm5hbWV9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiB1YDtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgICAgLnRoZW4oYXN5bmMgKGN1cnNvcikgPT4ge1xuICAgICAgICBjb25zdCB1c2VyID0gY3Vyc29yLm5leHQoKTtcblxuICAgICAgICBpZih1c2VyKSB7XG4gICAgICAgICAgY29uc3Qge2VtYWlsLCBwaG9uZSwgdmVyaWZpZWRFbWFpbCwgdmVyaWZpZWRQaG9uZX0gPSB1c2VyIGFzIFVzZXJUeXBlO1xuICAgICAgICAgIGNvbnN0IGNvZGVFeHBpcmVzID0gMTAwMCAqIDYwICogMTU7IC8vIDE1IG1pbnV0ZXNcbiAgICAgICAgICBjb25zdCBjb2RlID0gTWF0aC5mbG9vcigxMDAwMDAgKyAoTWF0aC5yYW5kb20oKSAqIDkwMDAwMCkpO1xuICAgICAgICAgIGNvbnN0IHVzZXJEb2NJZCA9IGdldERvY0lkKCd1c2VycycsIHVzZXIpO1xuICAgICAgICAgIGxldCB1cGRhdGU7XG5cbiAgICAgICAgICBpZihlbWFpbCAmJiB2ZXJpZmllZEVtYWlsKSB7XG4gICAgICAgICAgICBzZW5kRW1haWwoe1xuICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICB0ZXh0OiBgWW91ciBjb2RlIGlzICR7Y29kZX1gXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHVwZGF0ZSA9IHt2ZXJpZmllZEVtYWlsQ29kZTogY29kZSwgdmVyaWZpZWRFbWFpbEV4cGlyZXM6IGNvZGVFeHBpcmVzfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZihwaG9uZSAmJiB2ZXJpZmllZFBob25lKSB7XG4gICAgICAgICAgICBzZW5kU21zKHtcbiAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgdGV4dDogYFlvdXIgY29kZSBpcyAke2NvZGV9YFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB1cGRhdGUgPSB7dmVyaWZpZWRQaG9uZUV4cGlyZXM6IGNvZGVFeHBpcmVzLCB2ZXJpZmllZFNtc0NvZGU6IGNvZGV9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmKHVwZGF0ZS52ZXJpZmllZEVtYWlsQ29kZSB8fCB1cGRhdGUudmVyaWZpZWRTbXNDb2RlKSB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVRdWVyeTogQXFsUXVlcnkgPSBhcWxgVVBEQVRFICR7dXNlckRvY0lkfSBXSVRIICR7dXBkYXRlfSBJTiB1c2Vyc2A7XG5cbiAgICAgICAgICAgIGF3YWl0IHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkodXBkYXRlUXVlcnkpO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7ZW1haWwsIHBob25lLCB1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHJlc2V0UGFzc3dvcmQgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtcbiAgICBjb2RlLFxuICAgIHBhc3N3b3JkLFxuICAgIHR5cGUsXG4gICAgdXNlcm5hbWVcbiAgfToge1xuICAgIGNvZGU6IG51bWJlcjtcbiAgICBwYXNzd29yZDogc3RyaW5nO1xuICAgIHR5cGU6ICdwaG9uZScgfCAnZW1haWwnO1xuICAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gIH1cbik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAncmVzZXRQYXNzd29yZCc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0UGFzc3dvcmQ6IHN0cmluZyA9IHBhcnNlUGFzc3dvcmQocGFzc3dvcmQpO1xuICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgRk9SIHUgSU4gdXNlcnNcbiAgICBGSUxURVIgdS51c2VybmFtZSA9PSAke3VzZXJuYW1lfVxuICAgIExJTUlUIDFcbiAgICBSRVRVUk4gdWA7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRdWVyeSlcbiAgICAgIC50aGVuKGFzeW5jIChjdXJzb3IpID0+IHtcbiAgICAgICAgY29uc3QgdXNlciA9IGN1cnNvci5uZXh0KCk7XG5cbiAgICAgICAgaWYodXNlcikge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIF9pZDogdXNlckRvY0lkLFxuICAgICAgICAgICAgc2FsdCxcbiAgICAgICAgICAgIHZlcmlmaWVkRW1haWxDb2RlLFxuICAgICAgICAgICAgdmVyaWZpZWRFbWFpbEV4cGlyZXMgPSAwLFxuICAgICAgICAgICAgdmVyaWZpZWRTbXNDb2RlLFxuICAgICAgICAgICAgdmVyaWZpZWRQaG9uZUV4cGlyZXMgPSAwXG4gICAgICAgICAgfSA9IHVzZXIgYXMgVXNlclR5cGU7XG4gICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBsZXQgdXBkYXRlO1xuXG4gICAgICAgICAgc3dpdGNoKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2VtYWlsJzpcbiAgICAgICAgICAgICAgaWYoY29kZSA9PT0gdmVyaWZpZWRFbWFpbENvZGUgJiYgdmVyaWZpZWRFbWFpbEV4cGlyZXMgPiBub3cpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXNzd29yZDogc3RyaW5nID0gY3JlYXRlUGFzc3dvcmQoZm9ybWF0UGFzc3dvcmQsIHNhbHQpO1xuICAgICAgICAgICAgICAgIHVwZGF0ZSA9IHtwYXNzd29yZH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdwaG9uZSc6XG4gICAgICAgICAgICAgIGlmKGNvZGUgPT09IHZlcmlmaWVkU21zQ29kZSAmJiB2ZXJpZmllZFBob25lRXhwaXJlcyA+IG5vdykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhc3N3b3JkOiBzdHJpbmcgPSBjcmVhdGVQYXNzd29yZChmb3JtYXRQYXNzd29yZCwgc2FsdCk7XG4gICAgICAgICAgICAgICAgdXBkYXRlID0ge3Bhc3N3b3JkfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZih1cGRhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZVF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBVUERBVEUgJHt1c2VyRG9jSWR9IFdJVEggJHt1cGRhdGV9IElOIHVzZXJzYDtcblxuICAgICAgICAgICAgYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeSh1cGRhdGVRdWVyeSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGNvbmZpcm1Db2RlID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB7XG4gICAgY29kZSxcbiAgICB0eXBlLFxuICAgIHZhbHVlXG4gIH06IHtcbiAgICBjb2RlOiBudW1iZXI7XG4gICAgdHlwZTogJ3NtcycgfCAnZW1haWwnO1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gIH1cbik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnY29uZmlybUNvZGUnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGlzU21zID0gdHlwZSA9PT0gJ3Ntcyc7XG4gIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gaXNTbXMgPyBwYXJzZVBob25lKHZhbHVlKSA6IHBhcnNlRW1haWwodmFsdWUpO1xuICBjb25zdCBmaWx0ZXJCeVR5cGUgPSBpc1Ntc1xuICAgID8gYEZJTFRFUiB1LnBob25lID09IFwiJHtmb3JtYXR0ZWRWYWx1ZX1cIiAmJiB1LnZlcmlmaWVkU21zQ29kZSA9PSAke2NvZGV9YFxuICAgIDogYEZJTFRFUiB1LmVtYWlsID09IFwiJHtmb3JtYXR0ZWRWYWx1ZX1cIiAmJiB1LnZlcmlmaWVkRW1haWxDb2RlID09ICR7Y29kZX1gO1xuICBjb25zdCBhcWxRdWVyeTogc3RyaW5nID0gYEZPUiB1IElOIHVzZXJzXG4gICAgJHtmaWx0ZXJCeVR5cGV9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiB1YDtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgIC50aGVuKCh1c2VyKSA9PiB7XG4gICAgICAgIGlmKHVzZXIpIHtcbiAgICAgICAgICBjb25zdCB1cGRhdGVkVXNlciA9IGlzU21zXG4gICAgICAgICAgICA/IHt2ZXJpZmllZFBob25lOiB0cnVlLCB2ZXJpZmllZFNtc0NvZGU6IDB9XG4gICAgICAgICAgICA6IHt2ZXJpZmllZEVtYWlsOiB0cnVlLCB2ZXJpZmllZEVtYWlsQ29kZTogMH07XG4gICAgICAgICAgY29uc3QgYXFsUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQREFURSAke3VzZXIuX2tleX0gV0lUSCAke3VwZGF0ZWRVc2VyfSBJTiB1c2Vyc2A7XG5cbiAgICAgICAgICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRdWVyeSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHRydWUpXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICBsb2dFcnJvcih7XG4gICAgICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgICAgICAgIHBhcmFtczoge2NvZGUsIHR5cGUsIHZhbHVlOiBmb3JtYXR0ZWRWYWx1ZX0sXG4gICAgICAgICAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgICAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2NvZGUsIHR5cGUsIHZhbHVlOiBmb3JtYXR0ZWRWYWx1ZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZVVzZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcjogVXNlclR5cGUpOiBQcm9taXNlPFVzZXJUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdkZWxldGVVc2VyJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCB7aWR9ID0gcGFyc2VVc2VyKHVzZXIpO1xuXG4gIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBMRVQgdSA9IERPQ1VNRU5UKCR7aWR9KVxuICAgIFJFTU9WRSB1IElOIHVzZXJzXG4gICAgUkVUVVJOIE9MRGA7XG5cbiAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gbmV3IFN0cmlwZShDb25maWcuZ2V0KCdzdHJpcGUudG9rZW4nKSwge2FwaVZlcnNpb246IFNUUklQRV9BUElfVkVSU0lPTiwgdHlwZXNjcmlwdDogdHJ1ZX0pO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKGRlbGV0ZWRVc2VyKSA9PiBzdHJpcGVDbGllbnQuY3VzdG9tZXJzLmRlbChkZWxldGVkVXNlcj8uc3RyaXBlQ3VzdG9tZXJJZClcbiAgICAgIC50aGVuKCgpID0+IHN0cmlwZUNsaWVudC5hY2NvdW50cy5kZWwoZGVsZXRlZFVzZXI/LnN0cmlwZUFjY291bnRJZCkpXG4gICAgICAudGhlbigoKSA9PiBkZWxldGVkVXNlcikpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7aWR9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlYWN0aXZhdGVVc2VyID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXI6IFVzZXJUeXBlKTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZGVsZXRlJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCB7aWR9ID0gcGFyc2VVc2VyKHVzZXIpO1xuICBjb25zdCB1cGRhdGVkOiBVc2VyVHlwZSA9IHtcbiAgICB1c2VyQWNjZXNzOiAwXG4gIH07XG4gIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBVUERBVEUgJHtpZH0gV0lUSCAke3VwZGF0ZWR9IElOIHVzZXJzIExJTUlUIDEgUkVUVVJOIE5FV2A7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHtpZH0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGlzcGxheU5hbWUgPSAodXNlcjogVXNlclR5cGUpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB7Zmlyc3QsIGxhc3QsIG5hbWUgPSAnJywgdXNlcm5hbWUgPSAnJ30gPSB1c2VyO1xuICBjb25zdCBmdWxsbmFtZSA9IChbZmlyc3QsIGxhc3RdKS5qb2luKCcgJykudHJpbSgpO1xuXG4gIGlmKG5hbWUpIHtcbiAgICByZXR1cm4gbmFtZTtcbiAgfSBlbHNlIGlmKGZ1bGxuYW1lICE9PSAnJykge1xuICAgIHJldHVybiBmdWxsbmFtZTtcbiAgfSBlbHNlIGlmKHVzZXJuYW1lKSB7XG4gICAgcmV0dXJuIHVzZXJuYW1lO1xuICB9XG5cbiAgcmV0dXJuICdVbmtub3duJztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTZXNzaW9uVXNlciA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0U2Vzc2lvblVzZXInO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZCwgdXNlcm5hbWV9ID0ge319ID0gY29udGV4dDtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0VXNlck9wdGlvbmFsKGZpZWxkcyk7XG4gIGNvbnN0IGZvcm1hdFNlc3Npb25JZCA9IHBhcnNlQXJhbmdvSWQoYHVzZXJzLyR7c2Vzc2lvbklkfWApO1xuXG4gIGNvbnN0IGFxbFF1ZXJ5OiBzdHJpbmcgPSBgTEVUIHUgPSBET0NVTUVOVChcIiR7Zm9ybWF0U2Vzc2lvbklkfVwiKVxuICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gIFJFVFVSTiBNRVJHRSh1LCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkgYXMgdW5rbm93biBhcyBVc2VyVHlwZSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBwYXJhbXM6IHt1c2VySWQ6IHNlc3Npb25JZCwgdXNlcm5hbWV9LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcjogVXNlclR5cGUpOiBQcm9taXNlPFVzZXJUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRVc2VyJztcbiAgY29uc3Qge2VtYWlsLCBpZCwgcGhvbmUsIHVzZXJJZCwgdXNlcm5hbWV9ID0gcGFyc2VVc2VyKHVzZXIpO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0VXNlck9wdGlvbmFsKGZpZWxkcyk7XG4gIGxldCBhcWxRdWVyeTogc3RyaW5nID0gJyc7XG5cbiAgaWYoaWQpIHtcbiAgICBhcWxRdWVyeSA9IGBMRVQgdSA9IERPQ1VNRU5UKFwiJHtpZH1cIilcbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgRklMVEVSIHUudXNlckFjY2VzcyA+IDBcbiAgICBSRVRVUk4gTUVSR0UodSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcbiAgfSBlbHNlIGlmKHVzZXJuYW1lKSB7XG4gICAgYXFsUXVlcnkgPSBgRk9SIHUgSU4gdXNlcnNcbiAgICBGSUxURVIgdS51c2VybmFtZSA9PSBcIiR7dXNlcm5hbWV9XCJcbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgUkVUVVJOIE1FUkdFKHUsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG4gIH0gZWxzZSBpZihlbWFpbCkge1xuICAgIGFxbFF1ZXJ5ID0gYEZPUiB1IElOIHVzZXJzXG4gICAgRklMVEVSIHUuZW1haWwgPT0gXCIke2VtYWlsfVwiXG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgIFJFVFVSTiBNRVJHRSh1LCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuICB9IGVsc2UgaWYocGhvbmUpIHtcbiAgICBhcWxRdWVyeSA9IGBGT1IgdSBJTiB1c2Vyc1xuICAgIEZJTFRFUiB1LnBob25lID09IFwiJHtwaG9uZX1cIlxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICBSRVRVUk4gTUVSR0UodSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcbiAgfVxuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpXG4gICAgLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHVzZXIpID0+IHVzZXIpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7aWQsIHVzZXJJZCwgdXNlcm5hbWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJzID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIG9wdGlvbnM/OiBVc2VyT3B0aW9ucyk6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0VXNlckxpc3QnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB1c2VybmFtZX0gPSBwYXJzZVVzZXJPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRVc2VyT3B0aW9uYWwoZmllbGRzKTtcbiAgY29uc3QgZmlsdGVyQnk6IHN0cmluZ1tdID0gWyd1LnVzZXJBY2Nlc3MgPiAwJ107XG5cbiAgaWYodXNlcm5hbWUpIHtcbiAgICBmaWx0ZXJCeS5wdXNoKGBDT05UQUlOUyh1LnVzZXJuYW1lLCBcIiR7cGFyc2VVc2VybmFtZSh1c2VybmFtZSl9XCIpYCk7XG4gIH1cblxuICBjb25zdCBhcWxRdWVyeTogc3RyaW5nID0gYEZPUiB1IElOIHVzZXJzXG4gICAgRklMVEVSICR7ZmlsdGVyQnkuam9pbignICYmICcpfVxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIHUudXNlcm5hbWVcbiAgICBSRVRVUk4gTUVSR0UodSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBVc2VyVHlwZVtdKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG5cbiAgICAgIHJldHVybiBbXSBhcyBVc2VyVHlwZVtdO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJzQnlSZWFjdGlvbnMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtyZWFjdGlvbnMgPSBbXSwgdXNlcm5hbWV9OiB7cmVhY3Rpb25zPzogc3RyaW5nW107IHVzZXJuYW1lPzogc3RyaW5nfSxcbiAgb3B0aW9ucz86IFVzZXJPcHRpb25zXG4pOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFVzZXJzQnlSZWFjdGlvbnMnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH0gPSB7fX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRSZWFjdGlvbnM6IHN0cmluZ1tdID0gcmVhY3Rpb25zLm1hcCgocmVhY3Rpb25OYW1lOiBzdHJpbmcpID0+IHBhcnNlQ2hhcihyZWFjdGlvbk5hbWUsIDMyKS50b0xvd2VyQ2FzZSgpKTtcbiAgY29uc3Qge2xpbWl0fSA9IHBhcnNlVXNlck9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFVzZXJPcHRpb25hbChmaWVsZHMpO1xuICBjb25zdCBmb3JtYXRTZXNzaW9uSWQ6IHN0cmluZyA9IGB1c2Vycy8ke3Nlc3Npb25JZH1gO1xuICBjb25zdCBmb3JtYXRVc2VybmFtZTogc3RyaW5nID0gcGFyc2VVc2VybmFtZSh1c2VybmFtZSk7XG4gIGNvbnN0IGZpbHRlckJ5OiBzdHJpbmdbXSA9IFtcbiAgICAndS51c2VyQWNjZXNzID4gMCcsXG4gICAgYFBPU0lUSU9OKCR7SlNPTi5zdHJpbmdpZnkoZm9ybWF0UmVhY3Rpb25zKX0sIExPV0VSKHIubmFtZSkpYFxuICBdO1xuXG4gIGlmKHVzZXJuYW1lKSB7XG4gICAgZmlsdGVyQnkucHVzaChgQ09OVEFJTlModS51c2VybmFtZSwgXCIke2Zvcm1hdFVzZXJuYW1lfVwiKWApO1xuICB9XG5cbiAgY29uc3QgYXFsUXVlcnk6IHN0cmluZyA9IGBGT1IgdSwgciBJTiBPVVRCT1VORCBcIiR7Zm9ybWF0U2Vzc2lvbklkfVwiIGhhc1JlYWN0aW9uXG4gICAgT1BUSU9OUyB7dmVydGV4Q29sbGVjdGlvbnM6IFwidXNlcnNcIn1cbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgRklMVEVSICR7ZmlsdGVyQnkuam9pbignICYmICcpfVxuICAgICR7bGltaXQuYXFsfVxuICAgIFJFVFVSTiBNRVJHRSh1LCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIFVzZXJUeXBlW10pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIFtdIGFzIFVzZXJUeXBlW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlcnNCeVRhZ3MgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHt0YWdzLCB1c2VybmFtZX0sXG4gIG9wdGlvbnM/OiBVc2VyT3B0aW9uc1xuKTogUHJvbWlzZTxVc2VyVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRVc2Vyc0J5VGFncyc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIGZpZWxkcywgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfSA9IHt9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdFRhZ3M6IHN0cmluZ1tdID0gdGFncz8ucmVkdWNlKChsaXN0OiBzdHJpbmdbXSwgdGFnTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgaWYodGFnTmFtZSkge1xuICAgICAgbGlzdC5wdXNoKHBhcnNlQ2hhcih0YWdOYW1lLCAzMikudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpc3Q7XG4gIH0sIFtdKTtcbiAgY29uc3Qge2xpbWl0fSA9IHBhcnNlVXNlck9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFVzZXJPcHRpb25hbChmaWVsZHMpO1xuICBjb25zdCBmb3JtYXRVc2VybmFtZTogc3RyaW5nID0gcGFyc2VVc2VybmFtZSh1c2VybmFtZSk7XG4gIGNvbnN0IGZpbHRlckJ5OiBzdHJpbmdbXSA9IFtcbiAgICBgdS5fa2V5ICE9IFwiJHtzZXNzaW9uSWR9XCJgLFxuICAgICd1LnVzZXJBY2Nlc3MgPiAwJ1xuICBdO1xuXG4gIGlmKHVzZXJuYW1lKSB7XG4gICAgZmlsdGVyQnkucHVzaChgQ09OVEFJTlModS51c2VybmFtZSwgXCIke2Zvcm1hdFVzZXJuYW1lfVwiKWApO1xuICB9XG5cbiAgY29uc3QgYXFsUXVlcnk6IHN0cmluZyA9IGBGT1IgdCBJTiB0YWdzXG4gICAgRklMVEVSIFBPU0lUSU9OKCR7SlNPTi5zdHJpbmdpZnkoZm9ybWF0VGFncyl9LCBMT1dFUih0Lm5hbWUpKVxuICAgIEZPUiB1LCBpdCBJTiBPVVRCT1VORCB0IGlzVGFnZ2VkXG4gICAgT1BUSU9OUyB7YmZzOiB0cnVlLCB1bmlxdWVWZXJ0aWNlczogXCJnbG9iYWxcIiwgdmVydGV4Q29sbGVjdGlvbnM6IFwidXNlcnNcIn1cbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgRklMVEVSICR7ZmlsdGVyQnkuam9pbignICYmICcpfVxuICAgICR7bGltaXQuYXFsfVxuICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRSh1LCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIFVzZXJUeXBlW10pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIFtdIGFzIFVzZXJUeXBlW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlcnNCeUxhdGVzdCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB7dXNlcm5hbWV9LCBvcHRpb25zPzogVXNlck9wdGlvbnMpOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFVzZXJzQnlMYXRlc3QnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWR9ID0ge319ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0fSA9IHBhcnNlVXNlck9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IGZpbHRlciA9IFtcbiAgICAndS5faWQgIT0gc2Vzc2lvbi5faWQnLFxuICAgICd1LnVzZXJBY2Nlc3MgPiAwJ1xuICBdO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRVc2VyT3B0aW9uYWwoZmllbGRzKTtcblxuICBpZih1c2VybmFtZSkge1xuICAgIGZpbHRlci5wdXNoKGBDT05UQUlOUyh1LnVzZXJuYW1lLCBcIiR7cGFyc2VVc2VybmFtZSh1c2VybmFtZSl9XCIpYCk7XG4gIH1cblxuICAvLyBHZXQgZGF0YSBmcm9tIGRhdGFiYXNlXG4gIGNvbnN0IGFxbFF1ZXJ5OiBzdHJpbmcgPSBgRk9SIHUgSU4gdXNlcnNcbiAgICBMRVQgc2Vzc2lvbiA9IERPQ1VNRU5UKFwidXNlcnMvJHt1c2VySWR9XCIpXG4gICAgRklMVEVSICR7ZmlsdGVyLmpvaW4oJyAmJiAnKX1cbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgTEVUIGRpc3RhbmNlID0gRElTVEFOQ0UodS5sYXRpdHVkZSB8fCAwLCB1LmxvbmdpdHVkZSB8fCAwLCBzZXNzaW9uLmxhdGl0dWRlIHx8IDAsIHNlc3Npb24ubG9uZ2l0dWRlIHx8IDApXG4gICAgJHtsaW1pdC5hcWx9XG4gICAgU09SVCBkaXN0YW5jZSBBU0MsIHUuYWRkZWQgREVTQ1xuICAgIFJFVFVSTiBNRVJHRSh1LCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIFVzZXJUeXBlW10pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIFtdIGFzIFVzZXJUeXBlW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlcnNCeUNvbm5lY3Rpb24gPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHt1c2VySWR9OiBVc2VyVHlwZSxcbiAgb3B0aW9ucz86IFVzZXJPcHRpb25zXG4pOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFVzZXJzQnlDb25uZWN0aW9uJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgZmllbGRzfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsaW1pdCwgdXNlcm5hbWV9ID0gcGFyc2VVc2VyT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0VXNlck9wdGlvbmFsKGZpZWxkcyk7XG4gIGNvbnN0IGZvcm1hdFVzZXJJZDogc3RyaW5nID0gcGFyc2VBcmFuZ29JZChgdXNlcnMvJHt1c2VySWR9YCk7XG4gIGNvbnN0IGZpbHRlckJ5OiBzdHJpbmdbXSA9IFtcbiAgICAndS51c2VyQWNjZXNzID4gMCdcbiAgXTtcblxuICBpZih1c2VybmFtZSkge1xuICAgIGZpbHRlckJ5LnB1c2goYENPTlRBSU5TKHUudXNlcm5hbWUsIFwiJHtwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKX1cIilgKTtcbiAgfVxuXG4gIGNvbnN0IGFxbFF1ZXJ5OiBzdHJpbmcgPSBgRk9SIGN1IElOIHVzZXJzXG4gICAgTEVUIHNlc3Npb24gPSBET0NVTUVOVChcIiR7Zm9ybWF0VXNlcklkfVwiKVxuICAgIEZPUiB1LCBjb25uZWN0aW9uIElOIE9VVEJPVU5EIGN1IGhhc0Nvbm5lY3Rpb25cbiAgICBPUFRJT05TIHtiZnM6IHRydWUsIHVuaXF1ZVZlcnRpY2VzOiBcImdsb2JhbFwiLCB2ZXJ0ZXhDb2xsZWN0aW9uczogXCJ1c2Vyc1wifVxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICBGSUxURVIgJHtmaWx0ZXJCeS5qb2luKCcgJiYgJyl9XG4gICAgJHtsaW1pdC5hcWx9XG4gICAgUkVUVVJOIERJU1RJTkNUIE1FUkdFKHUsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgVXNlclR5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gW10gYXMgVXNlclR5cGVbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCByZWZyZXNoU2Vzc2lvbiA9ICh7ZXhwaXJlcywgdG9rZW59KTogU2Vzc2lvblRva2VuIHwgU2Vzc2lvbkVycm9yID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB7dXNlcklkLCB1c2VybmFtZSwgdXNlckFjY2Vzc30gPSBnZXRTZXNzaW9uKHRva2VuKTtcbiAgICByZXR1cm4gY3JlYXRlVG9rZW4odXNlcklkLCB1c2VybmFtZSwgdXNlckFjY2VzcywgZXhwaXJlcyk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICB0aHJvdyBlcnJvcjsgLy8gUmUtdGhyb3cgdGhlIGVycm9yIGZyb20gZ2V0U2Vzc2lvblxuICB9XG59O1xuXG5leHBvcnQgY29uc3Qgc2lnbkluID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIGFyZ3MpOiBQcm9taXNlPFNlc3Npb25Ub2tlbiB8IG51bGw+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ3NpZ25Jbic7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3Qge2VtYWlsLCBleHBpcmVzLCBwYXNzd29yZCwgcGhvbmUsIHVzZXJuYW1lfSA9IGFyZ3M7XG4gIGNvbnN0IGZvcm1hdEVtYWlsOiBzdHJpbmcgPSBwYXJzZUVtYWlsKGVtYWlsKTtcbiAgY29uc3QgZm9ybWF0VXNlcm5hbWU6IHN0cmluZyA9IHBhcnNlVXNlcm5hbWUodXNlcm5hbWUpO1xuICBjb25zdCBmb3JtYXRQYXNzd29yZDogc3RyaW5nID0gcGFyc2VQYXNzd29yZChwYXNzd29yZCk7XG4gIGNvbnN0IGZvcm1hdFBob25lOiBzdHJpbmcgPSBwYXJzZVBob25lKHBob25lKTtcbiAgY29uc3QgZm9ybWF0RXhwaXJlczogbnVtYmVyID0gcGFyc2VOdW0oZXhwaXJlcykgfHwgMTU7XG5cbiAgaWYoKCFmb3JtYXRVc2VybmFtZSAmJiAhZm9ybWF0RW1haWwgJiYgIWZvcm1hdFBob25lKSB8fCAhZm9ybWF0UGFzc3dvcmQpIHtcbiAgICB0aHJvdyBsb2dFeGNlcHRpb24oe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTlZBTElEX0FSR1VNRU5UU1xuICAgIH0sIGNvbnRleHQpO1xuICB9XG5cbiAgY29uc3QgZmlsdGVyczogc3RyaW5nW10gPSBbXTtcblxuICBpZihmb3JtYXRFbWFpbCkge1xuICAgIGZpbHRlcnMucHVzaChgdS5lbWFpbCA9PSBcIiR7Zm9ybWF0RW1haWx9XCJgKTtcbiAgfVxuXG4gIGlmKGZvcm1hdFBob25lKSB7XG4gICAgZmlsdGVycy5wdXNoKGB1LnBob25lID09ICR7Zm9ybWF0UGhvbmV9YCk7XG4gIH1cblxuICBpZihmb3JtYXRVc2VybmFtZSkge1xuICAgIGZpbHRlcnMucHVzaChgdS51c2VybmFtZSA9PSBcIiR7Zm9ybWF0VXNlcm5hbWV9XCJgKTtcbiAgfVxuXG4gIGNvbnN0IGNoZWNrUXVlcnk6IHN0cmluZyA9IGBGT1IgdSBJTiB1c2Vyc1xuICAgIEZJTFRFUiAke2ZpbHRlcnMuam9pbignIHx8ICcpfVxuICAgIExJTUlUIDFcbiAgICBSRVRVUk4gdWA7XG5cbiAgbGV0IGNoZWNrVXNlcjogVXNlclR5cGU7XG5cbiAgdHJ5IHtcbiAgICBjaGVja1VzZXIgPSBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGNoZWNrUXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICB0aHJvdyBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3VzZXJuYW1lOiBmb3JtYXRVc2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgfVxuXG4gIGlmKCFjaGVja1VzZXIpIHtcbiAgICB0aHJvdyBsb2dFeGNlcHRpb24oe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTlZBTElEX0FVVEhFTlRJQ0FUSU9OXG4gICAgfSwgY29udGV4dCk7XG4gIH1cblxuICBjb25zdCB7X2tleTogdXNlcklkLCBwYXNzd29yZDogdmFsaWRQYXNzd29yZCwgc2FsdCwgdXNlckFjY2Vzc30gPSBjaGVja1VzZXIgYXMgVXNlclR5cGU7XG4gIGNvbnN0IGF1dGhQYXNzd29yZDogc3RyaW5nID0gY3JlYXRlUGFzc3dvcmQoZm9ybWF0UGFzc3dvcmQsIHNhbHQpO1xuXG4gIGNvbnNvbGUubG9nKHtcbiAgICBjcmVhdGVQYXNzd29yZCxcbiAgICBhdXRoUGFzc3dvcmQsXG4gICAgdmFsaWRQYXNzd29yZCxcbiAgICBmb3JtYXRQYXNzd29yZCxcbiAgICBzYWx0XG4gIH0pO1xuXG4gIGlmKHZhbGlkUGFzc3dvcmQgIT09IGF1dGhQYXNzd29yZCkge1xuICAgIHRocm93IGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3VzZXJBY2Nlc3MsIHVzZXJJZCwgdXNlcm5hbWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU5WQUxJRF9BVVRIRU5USUNBVElPTlxuICAgIH0sIGNvbnRleHQpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB0b2tlbiA9IGNyZWF0ZVRva2VuKHVzZXJJZCB8fCAnJywgdXNlcm5hbWUgfHwgJycsIHVzZXJBY2Nlc3MsIGZvcm1hdEV4cGlyZXMpO1xuXG4gICAgcmV0dXJuIHRva2VuO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgdGhyb3cgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VySWQsIHVzZXJuYW1lfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3Qgc2lnbk91dCA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdzaWduT3V0JztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkLCB1c2VybmFtZX0gPSB7fX0gPSBjb250ZXh0O1xuICBjb25zdCB1c2VyRG9jSWQ6IHN0cmluZyA9IGB1c2Vycy8ke3Nlc3Npb25JZH1gO1xuXG4gIGNvbnN0IHVwZGF0ZSA9IHtcbiAgICBsYXN0T25saW5lOiBEYXRlLm5vdygpLFxuICAgIHNlc3Npb25JZDogbnVsbFxuICB9O1xuICBjb25zdCBzZXNzaW9uUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYExFVCB1ID0gRE9DVU1FTlQoJHt1c2VyRG9jSWR9KVxuICAgIFVQREFURSB1IFdJVEggJHt1cGRhdGV9IElOIHVzZXJzXG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBORVdgO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShzZXNzaW9uUXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3VzZXJJZDogc2Vzc2lvbklkLCB1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFjdGl2ZVVzZXJDb3VudCA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldEFjdGl2ZVVzZXJDb3VudCc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3QgY291bnRRdWVyeTogQXFsUXVlcnkgPSBhcWxgTEVUIGRvY3MgPSAoXG4gICAgRk9SIHUgSU4gdXNlcnNcbiAgICBGSUxURVIgdS5hY3RpdmUgPT0gdHJ1ZVxuICAgIFJFVFVSTiB1XG4gIClcbiAgUkVUVVJOIExFTkdUSChkb2NzKWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoY291bnRRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgIHRocm93IGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2VyQnlUb2tlbiA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB0b2tlbjogc3RyaW5nKTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0VXNlckJ5VG9rZW4nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHt1c2VySWR9ID0gZ2V0U2Vzc2lvbih0b2tlbik7XG4gIGNvbnN0IHVzZXJEb2NJZCA9IHBhcnNlQXJhbmdvSWQoYHVzZXJzLyR7dXNlcklkfWApO1xuICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgTEVUIHUgPSBET0NVTUVOVChcIiR7dXNlckRvY0lkfVwiKSBSRVRVUk4gdWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSlcbiAgICAucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBwYXJhbXM6IHt1c2VySWR9LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgIH0pO1xufTsiXSwKICAibWFwcGluZ3MiOiAiQUFJQSxPQUFRLFlBQUFBLE1BQWUsK0JBQ3ZCLE9BQ0UsY0FBQUMsRUFDQSxrQkFBQUMsRUFDQSxpQkFBQUMsRUFDQSxhQUFBQyxFQUNBLGNBQUFDLEVBQ0EsaUJBQUFDLEVBQ0EsY0FBQUMsRUFDQSxpQkFBQUMsTUFDSywrQkFDUCxPQUFRLE9BQUFDLE1BQVUsV0FDbEIsT0FBUSxZQUFBQyxNQUFlLFFBQ3ZCLE9BQU9DLE1BQVksU0FFbkIsT0FBUSxhQUFBQyxNQUFnQiw2QkFDeEIsT0FBUSxVQUFBQyxNQUFhLGVBQ3JCLE9BQVEsY0FBQUMsTUFBb0MsMEJBQzVDLE9BQVEs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SWQiLCAicGFyc2VDaGFyIiwgInBhcnNlRW1haWwiLCAicGFyc2VQYXNzd29yZCIsICJwYXJzZVBob25lIiwgInBhcnNlVXNlcm5hbWUiLCAiYXFsIiwgIkRhdGVUaW1lIiwgIlN0cmlwZSIsICJwYXJzZVVzZXIiLCAiQ29uZmlnIiwgIkVycm9yVHlwZXMiLCAibG9nRXJyb3IiLCAibG9nRXhjZXB0aW9uIiwgImdldERvY0lkIiwgImdldExpbWl0IiwgInNlbGVjdFJlYWN0aW9uQ291bnRCeVR5cGUiLCAidXNlRGIiLCAiZGV0ZWN0TGFuZ3VhZ2UiLCAiZ2V0U2Vzc2lvbiIsICJzZXRTZXNzaW9uIiwgInNlbmRFbWFpbCIsICJzZW5kU21zIiwgImV2ZW50Q2F0ZWdvcnkiLCAiU1RSSVBFX0FQSV9WRVJTSU9OIiwgIlVzZXJBY2Nlc3MiLCAiY3JlYXRlVG9rZW4iLCAidXNlcklkIiwgInVzZXJuYW1lIiwgInVzZXJBY2Nlc3MiLCAiZXhwaXJlc0luTWludXRlcyIsICJub3ciLCAic2Vzc2lvbkV4cGlyZXMiLCAiaWF0IiwgImV4cCIsICJ0b2tlbiIsICJnZXRVc2VyT3B0aW9uYWwiLCAiZmllbGRzIiwgInNlbGVjdHMiLCAiZmllbGQiLCAicGFyc2VVc2VyT3B0aW9ucyIsICJvcHRpb25zIiwgImZyb20iLCAidG8iLCAibGltaXQiLCAiYWRkVXNlciIsICJjb250ZXh0IiwgInVzZXIiLCAiYWN0aW9uIiwgImRhdGFiYXNlTmFtZSIsICJsYW5ndWFnZUNvbnRleHQiLCAiX2NvbmZpcm0iLCAibmV3VXNlciIsICJlbWFpbCIsICJwYXNzd29yZCIsICJwaG9uZSIsICJfa2V5IiwgIl9pZCIsICJpbnNlcnRVc2VyIiwgInNhbHQiLCAiZW5jcnlwdGVkUGFzc3dvcmQiLCAiZmlsdGVycyIsICJjaGVja1F1ZXJ5IiwgImN1cnNvciIsICJlcnJvciIsICJwaG9uZUNvdW50cnlDb2RlIiwgImxvY2FsZSIsICJ2ZXJpZmllZEVtYWlsQ29kZSIsICJ2ZXJpZmllZFNtc0NvZGUiLCAiaW5zZXJ0IiwgImluc2VydFF1ZXJ5IiwgInVwZGF0ZVVzZXIiLCAidXBkYXRlZFVzZXIiLCAidGFncyIsICJ1cGRhdGUiLCAiaWQiLCAidXNlclF1ZXJ5IiwgImRhdGFiYXNlIiwgInRhZ0NvbGxlY3Rpb24iLCAidGFnRG9jSWQiLCAibmFtZSIsICJ0YWdRdWVyeSIsICJ0YWdFZGdlIiwgImVkZ2UiLCAiZm9yZ290UGFzc3dvcmQiLCAiYXFsUXVlcnkiLCAidmVyaWZpZWRFbWFpbCIsICJ2ZXJpZmllZFBob25lIiwgImNvZGVFeHBpcmVzIiwgImNvZGUiLCAidXNlckRvY0lkIiwgInVwZGF0ZVF1ZXJ5IiwgInJlc2V0UGFzc3dvcmQiLCAidHlwZSIsICJmb3JtYXRQYXNzd29yZCIsICJ2ZXJpZmllZEVtYWlsRXhwaXJlcyIsICJ2ZXJpZmllZFBob25lRXhwaXJlcyIsICJjb25maXJtQ29kZSIsICJ2YWx1ZSIsICJpc1NtcyIsICJmb3JtYXR0ZWRWYWx1ZSIsICJkZWxldGVVc2VyIiwgInN0cmlwZUNsaWVudCIsICJkZWxldGVkVXNlciIsICJkZWFjdGl2YXRlVXNlciIsICJnZXREaXNwbGF5TmFtZSIsICJmaXJzdCIsICJsYXN0IiwgImZ1bGxuYW1lIiwgImdldFNlc3Npb25Vc2VyIiwgInNlc3Npb25JZCIsICJzZWxlY3RPYmplY3RzIiwgInNlbGVjdFF1ZXJpZXMiLCAiZ2V0VXNlciIsICJnZXRVc2VycyIsICJmaWx0ZXJCeSIsICJnZXRVc2Vyc0J5UmVhY3Rpb25zIiwgInJlYWN0aW9ucyIsICJmb3JtYXRSZWFjdGlvbnMiLCAicmVhY3Rpb25OYW1lIiwgImZvcm1hdFNlc3Npb25JZCIsICJmb3JtYXRVc2VybmFtZSIsICJnZXRVc2Vyc0J5VGFncyIsICJmb3JtYXRUYWdzIiwgImxpc3QiLCAidGFnTmFtZSIsICJnZXRVc2Vyc0J5TGF0ZXN0IiwgImZpbHRlciIsICJnZXRVc2Vyc0J5Q29ubmVjdGlvbiIsICJmb3JtYXRVc2VySWQiLCAicmVmcmVzaFNlc3Npb24iLCAiZXhwaXJlcyIsICJzaWduSW4iLCAiYXJncyIsICJmb3JtYXRFbWFpbCIsICJmb3JtYXRQaG9uZSIsICJmb3JtYXRFeHBpcmVzIiwgImNoZWNrVXNlciIsICJ2YWxpZFBhc3N3b3JkIiwgImF1dGhQYXNzd29yZCIsICJzaWduT3V0IiwgInNlc3Npb25RdWVyeSIsICJnZXRBY3RpdmVVc2VyQ291bnQiLCAiY291bnRRdWVyeSIsICJnZXRVc2VyQnlUb2tlbiJdCn0K