@nlabs/reaktor 0.9.0 → 0.10.1

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 (400) hide show
  1. package/.env +1 -0
  2. package/.env.example +1 -0
  3. package/DATABASE_I18N_GUIDE.md +434 -0
  4. package/README.md +9 -0
  5. package/TEST_UTILITIES_GUIDE.md +360 -0
  6. package/coverage/index.html +61 -46
  7. package/dist/actions/apps.js +242 -0
  8. package/dist/actions/connections.js +90 -0
  9. package/dist/actions/conversations.js +350 -0
  10. package/dist/actions/dynamodb.js +150 -0
  11. package/dist/actions/email.js +152 -0
  12. package/dist/actions/files.js +283 -0
  13. package/dist/actions/groups.js +292 -0
  14. package/dist/actions/images.js +735 -0
  15. package/dist/actions/index.js +66 -0
  16. package/dist/actions/ios.js +164 -0
  17. package/dist/actions/locations.js +122 -0
  18. package/dist/actions/messages.js +208 -0
  19. package/dist/actions/notifications.js +59 -0
  20. package/dist/actions/payments.js +497 -0
  21. package/dist/actions/personas.js +110 -0
  22. package/dist/actions/posts.js +595 -0
  23. package/dist/actions/reactions.js +322 -0
  24. package/dist/actions/s3.js +133 -0
  25. package/dist/actions/search.js +90 -0
  26. package/dist/actions/sms.js +108 -0
  27. package/dist/actions/statistics.js +62 -0
  28. package/dist/actions/subscription.js +220 -0
  29. package/dist/actions/tags.js +292 -0
  30. package/dist/actions/users.js +784 -0
  31. package/dist/actions/websockets.js +174 -0
  32. package/dist/adapters/arangoAdapter.js +46 -0
  33. package/dist/adapters/fileAdapter.js +76 -0
  34. package/dist/adapters/imageAdapter.js +40 -0
  35. package/dist/adapters/messageAdapter.js +49 -0
  36. package/dist/adapters/postAdapter.js +70 -0
  37. package/dist/adapters/reaktorAdapter.js +44 -0
  38. package/dist/adapters/tagAdapter.js +50 -0
  39. package/dist/adapters/userAdapter.js +115 -0
  40. package/dist/config.js +125 -0
  41. package/dist/index.js +66 -0
  42. package/dist/lambdas/actions/websockets.js +132 -0
  43. package/dist/lambdas/authorizer.js +67 -0
  44. package/dist/lambdas/connection.js +91 -0
  45. package/dist/lambdas/utils/message.js +42 -0
  46. package/dist/lambdas/utils/websocket.js +105 -0
  47. package/dist/mocks/conversation.js +35 -0
  48. package/dist/mocks/file.js +38 -0
  49. package/dist/mocks/group.js +47 -0
  50. package/dist/mocks/image.js +44 -0
  51. package/dist/mocks/nlabs.png +0 -0
  52. package/dist/mocks/post.js +55 -0
  53. package/dist/mocks/tag.js +37 -0
  54. package/dist/mocks/user.js +88 -0
  55. package/dist/mutations/index.js +26 -0
  56. package/dist/mutations/locations.js +44 -0
  57. package/dist/mutations/messages.js +86 -0
  58. package/dist/mutations/personas.js +100 -0
  59. package/dist/mutations/posts.js +53 -0
  60. package/dist/mutations/reactions.js +51 -0
  61. package/dist/mutations/statistics.js +39 -0
  62. package/dist/mutations/subscriptions.js +56 -0
  63. package/dist/mutations/tags.js +120 -0
  64. package/dist/mutations/users.js +116 -0
  65. package/dist/objectTypes/app.js +173 -0
  66. package/dist/objectTypes/bankAccount.js +76 -0
  67. package/dist/objectTypes/connection.js +48 -0
  68. package/dist/objectTypes/conversation.js +77 -0
  69. package/dist/objectTypes/creditCard.js +86 -0
  70. package/dist/objectTypes/document.js +46 -0
  71. package/dist/objectTypes/error.js +46 -0
  72. package/dist/objectTypes/external.js +74 -0
  73. package/dist/objectTypes/file.js +100 -0
  74. package/dist/objectTypes/filter.js +43 -0
  75. package/dist/objectTypes/group.js +123 -0
  76. package/dist/objectTypes/iapSubscription.js +40 -0
  77. package/dist/objectTypes/image.js +129 -0
  78. package/dist/objectTypes/index.js +68 -0
  79. package/dist/objectTypes/location.js +109 -0
  80. package/dist/objectTypes/message.js +96 -0
  81. package/dist/objectTypes/passcode.js +42 -0
  82. package/dist/objectTypes/persona.js +87 -0
  83. package/dist/objectTypes/plan.js +95 -0
  84. package/dist/objectTypes/post.js +125 -0
  85. package/dist/objectTypes/reaction.js +61 -0
  86. package/dist/objectTypes/relation.js +49 -0
  87. package/dist/objectTypes/search.js +72 -0
  88. package/dist/objectTypes/statistics.js +39 -0
  89. package/dist/objectTypes/subscription.js +117 -0
  90. package/dist/objectTypes/tag.js +65 -0
  91. package/dist/objectTypes/user.js +144 -0
  92. package/dist/queries/index.js +33 -0
  93. package/dist/queries/locations.js +45 -0
  94. package/dist/queries/messages.js +52 -0
  95. package/dist/queries/posts.js +154 -0
  96. package/dist/queries/reactions.js +56 -0
  97. package/dist/queries/statistics.js +39 -0
  98. package/dist/queries/subscriptions.js +44 -0
  99. package/dist/queries/tags.js +75 -0
  100. package/dist/queries/users.js +64 -0
  101. package/dist/templates/email/layout.js +302 -0
  102. package/dist/templates/email/passwordForgot.js +38 -0
  103. package/dist/templates/email/passwordRecovery.js +35 -0
  104. package/dist/templates/email/verifyEmail.js +38 -0
  105. package/dist/templates/email/welcome.js +38 -0
  106. package/dist/templates/sms/passwordForgot.js +24 -0
  107. package/dist/templates/sms/passwordRecovery.js +24 -0
  108. package/dist/templates/sms/verifyEmail.js +24 -0
  109. package/dist/templates/sms/verifyPhone.js +24 -0
  110. package/dist/templates/sms/welcome.js +24 -0
  111. package/dist/types/apps.js +32 -0
  112. package/{lib → dist}/types/arangodb.js +1 -1
  113. package/{lib → dist}/types/auth.js +1 -1
  114. package/{lib → dist}/types/connections.js +1 -1
  115. package/dist/types/conversations.js +16 -0
  116. package/{lib → dist}/types/email.js +1 -1
  117. package/dist/types/files.js +16 -0
  118. package/dist/types/google.js +16 -0
  119. package/{lib → dist}/types/groups.js +1 -1
  120. package/dist/types/images.js +16 -0
  121. package/dist/types/index.js +60 -0
  122. package/{lib → dist}/types/locations.js +1 -1
  123. package/{lib → dist}/types/messages.js +1 -1
  124. package/{lib → dist}/types/notifications.js +1 -1
  125. package/dist/types/payments.js +16 -0
  126. package/dist/types/personas.js +16 -0
  127. package/dist/types/posts.js +16 -0
  128. package/{lib → dist}/types/tags.js +1 -1
  129. package/dist/types/users.js +16 -0
  130. package/dist/types/websockets.js +16 -0
  131. package/dist/utils/adapterUtils.js +45 -0
  132. package/dist/utils/analyticsUtils.js +72 -0
  133. package/dist/utils/arangodbUtils.js +165 -0
  134. package/dist/utils/auth.js +57 -0
  135. package/dist/utils/index.js +30 -0
  136. package/{lib → dist}/utils/session.js +10 -7
  137. package/index.js +1 -1
  138. package/jest.config.js +17 -0
  139. package/jest.setup.js +36 -0
  140. package/lex.config.cjs +13 -0
  141. package/lib/actions/apps.js +17 -249
  142. package/lib/actions/connections.js +7 -0
  143. package/lib/actions/content.js +17 -0
  144. package/lib/actions/conversations.js +19 -325
  145. package/lib/actions/dynamodb.js +2 -150
  146. package/lib/actions/email.js +2 -152
  147. package/lib/actions/files.js +5 -287
  148. package/lib/actions/groups.js +23 -263
  149. package/lib/actions/images.js +31 -646
  150. package/lib/actions/index.js +2 -62
  151. package/lib/actions/ios.js +9 -162
  152. package/lib/actions/locations.js +7 -110
  153. package/lib/actions/messages.js +21 -193
  154. package/lib/actions/notifications.js +2 -59
  155. package/lib/actions/payments.js +11 -461
  156. package/lib/actions/posts.js +77 -515
  157. package/lib/actions/profiles.js +8 -0
  158. package/lib/actions/reactions.js +25 -312
  159. package/lib/actions/s3.js +2 -133
  160. package/lib/actions/search.js +5 -90
  161. package/lib/actions/sms.js +2 -106
  162. package/lib/actions/statistics.js +6 -60
  163. package/lib/actions/subscriptions.js +12 -0
  164. package/lib/actions/tags.js +19 -262
  165. package/lib/actions/users.js +67 -537
  166. package/lib/actions/websockets.js +16 -158
  167. package/lib/adapters/arangoAdapter.js +2 -46
  168. package/lib/adapters/contentAdapter.js +2 -0
  169. package/lib/adapters/fileAdapter.js +2 -76
  170. package/lib/adapters/imageAdapter.js +2 -0
  171. package/lib/adapters/messageAdapter.js +2 -0
  172. package/lib/adapters/postAdapter.js +2 -70
  173. package/lib/adapters/reaktorAdapter.js +2 -44
  174. package/lib/adapters/tagAdapter.js +2 -50
  175. package/lib/adapters/userAdapter.js +2 -110
  176. package/lib/config.js +2 -125
  177. package/lib/handlers/graphqlHandler.js +2 -0
  178. package/lib/index.js +2 -30
  179. package/lib/lambdas/actions/websockets.js +14 -112
  180. package/lib/lambdas/authorizer.js +2 -67
  181. package/lib/lambdas/connection.js +2 -92
  182. package/lib/lambdas/utils/message.js +2 -42
  183. package/lib/lambdas/utils/websocket.js +2 -105
  184. package/lib/mocks/conversation.js +2 -35
  185. package/lib/mocks/file.js +2 -38
  186. package/lib/mocks/group.js +2 -47
  187. package/lib/mocks/image.js +2 -43
  188. package/lib/mocks/post.js +2 -55
  189. package/lib/mocks/tag.js +2 -37
  190. package/lib/mocks/user.js +2 -88
  191. package/lib/mutations/index.js +2 -0
  192. package/lib/mutations/locations.integration.js +2 -0
  193. package/lib/mutations/locations.js +2 -0
  194. package/lib/mutations/messages.integration.js +2 -0
  195. package/lib/mutations/messages.js +2 -0
  196. package/lib/mutations/posts.integration.js +2 -0
  197. package/lib/mutations/posts.js +2 -0
  198. package/lib/mutations/profiles.integration.js +2 -0
  199. package/lib/mutations/profiles.js +2 -0
  200. package/lib/mutations/reactions.integration.js +2 -0
  201. package/lib/mutations/reactions.js +2 -0
  202. package/lib/mutations/statistics.integration.js +2 -0
  203. package/lib/mutations/statistics.js +2 -0
  204. package/lib/mutations/subscriptions.integration.js +2 -0
  205. package/lib/mutations/subscriptions.js +2 -0
  206. package/lib/mutations/tags.integration.js +2 -0
  207. package/lib/mutations/tags.js +2 -0
  208. package/lib/mutations/users.integration.js +2 -0
  209. package/lib/mutations/users.js +2 -0
  210. package/lib/objectTypes/app.js +2 -0
  211. package/lib/objectTypes/bankAccount.js +2 -0
  212. package/lib/objectTypes/connection.js +2 -0
  213. package/lib/objectTypes/conversation.js +2 -0
  214. package/lib/objectTypes/creditCard.js +2 -0
  215. package/lib/objectTypes/document.js +2 -0
  216. package/lib/objectTypes/error.js +2 -0
  217. package/lib/objectTypes/external.js +2 -0
  218. package/lib/objectTypes/file.js +2 -0
  219. package/lib/objectTypes/filter.js +2 -0
  220. package/lib/objectTypes/group.js +2 -0
  221. package/lib/objectTypes/iapSubscription.js +2 -0
  222. package/lib/objectTypes/image.js +2 -0
  223. package/lib/objectTypes/index.js +2 -0
  224. package/lib/objectTypes/location.js +2 -0
  225. package/lib/objectTypes/message.js +2 -0
  226. package/lib/objectTypes/passcode.js +2 -0
  227. package/lib/objectTypes/plan.js +2 -0
  228. package/lib/objectTypes/post.js +2 -0
  229. package/lib/objectTypes/profile.js +2 -0
  230. package/lib/objectTypes/reaction.js +2 -0
  231. package/lib/objectTypes/relation.js +2 -0
  232. package/lib/objectTypes/search.js +2 -0
  233. package/lib/objectTypes/statistics.js +2 -0
  234. package/lib/objectTypes/subscription.js +2 -0
  235. package/lib/objectTypes/tag.js +2 -0
  236. package/lib/objectTypes/user.js +2 -0
  237. package/lib/queries/index.js +2 -0
  238. package/lib/queries/locations.integration.js +2 -0
  239. package/lib/queries/locations.js +2 -0
  240. package/lib/queries/messages.integration.js +2 -0
  241. package/lib/queries/messages.js +2 -0
  242. package/lib/queries/posts.integration.js +2 -0
  243. package/lib/queries/posts.js +2 -0
  244. package/lib/queries/reactions.integration.js +2 -0
  245. package/lib/queries/reactions.js +2 -0
  246. package/lib/queries/statistics.js +2 -0
  247. package/lib/queries/subscriptions.js +2 -0
  248. package/lib/queries/tags.integration.js +2 -0
  249. package/lib/queries/tags.js +2 -0
  250. package/lib/queries/users.integration.js +2 -0
  251. package/lib/queries/users.js +2 -0
  252. package/lib/templates/email/layout.js +3 -25
  253. package/lib/templates/email/passwordForgot.js +3 -25
  254. package/lib/templates/email/passwordRecovery.js +3 -25
  255. package/lib/templates/email/verifyEmail.js +3 -25
  256. package/lib/templates/email/welcome.js +3 -25
  257. package/lib/templates/sms/passwordForgot.js +2 -24
  258. package/lib/templates/sms/passwordRecovery.js +2 -24
  259. package/lib/templates/sms/verifyEmail.js +2 -24
  260. package/lib/templates/sms/verifyPhone.js +2 -24
  261. package/lib/templates/sms/welcome.js +2 -24
  262. package/lib/types/apps.types.js +2 -0
  263. package/lib/types/arangodb.types.js +1 -0
  264. package/lib/types/auth.types.js +1 -0
  265. package/lib/types/connections.types.js +1 -0
  266. package/lib/types/content.types.js +1 -0
  267. package/lib/types/conversations.types.js +1 -0
  268. package/lib/types/email.types.js +1 -0
  269. package/lib/types/error.types.js +2 -0
  270. package/lib/types/files.types.js +1 -0
  271. package/lib/types/google.types.js +1 -0
  272. package/lib/types/groups.types.js +1 -0
  273. package/lib/types/images.types.js +1 -0
  274. package/lib/types/index.js +2 -56
  275. package/lib/types/locations.types.js +1 -0
  276. package/lib/types/messages.types.js +1 -0
  277. package/lib/types/notifications.types.js +1 -0
  278. package/lib/types/payments.types.js +1 -0
  279. package/lib/types/posts.types.js +1 -0
  280. package/lib/types/profiles.types.js +1 -0
  281. package/lib/types/statistics.types.js +1 -0
  282. package/lib/types/tags.types.js +1 -0
  283. package/lib/types/users.types.js +1 -0
  284. package/lib/types/websockets.types.js +1 -0
  285. package/lib/utils/adapterUtils.js +2 -45
  286. package/lib/utils/analyticsUtils.js +2 -72
  287. package/lib/utils/arangodbUtils.js +5 -142
  288. package/lib/utils/authUtils.js +2 -0
  289. package/lib/utils/contextUtils.js +2 -0
  290. package/lib/utils/dbI18n.example.js +6 -0
  291. package/lib/utils/dbI18n.js +2 -0
  292. package/lib/utils/googleTranslate.js +2 -0
  293. package/lib/utils/graphqlUtils.js +2 -0
  294. package/lib/utils/index.js +2 -30
  295. package/lib/utils/languageDetection.js +2 -0
  296. package/lib/utils/localeUtils.example.js +2 -0
  297. package/lib/utils/localeUtils.js +2 -0
  298. package/lib/utils/middlewareUtils.js +2 -0
  299. package/lib/utils/sessionUtils.js +2 -0
  300. package/lib/utils/stripeUtils.js +2 -0
  301. package/lib/utils/templateUtils.js +2 -0
  302. package/lib/utils/testUtils.js +2 -0
  303. package/lib/utils/translationQueue.example.js +2 -0
  304. package/lib/utils/translationQueue.js +2 -0
  305. package/package.json +41 -37
  306. package/.eslintrc +0 -10
  307. package/.prettierrc.js +0 -4
  308. package/lib/actions/apps.d.ts +0 -25
  309. package/lib/actions/conversations.d.ts +0 -14
  310. package/lib/actions/dynamodb.d.ts +0 -8
  311. package/lib/actions/email.d.ts +0 -5
  312. package/lib/actions/files.d.ts +0 -19
  313. package/lib/actions/groups.d.ts +0 -14
  314. package/lib/actions/images.d.ts +0 -26
  315. package/lib/actions/index.d.ts +0 -21
  316. package/lib/actions/ios.d.ts +0 -7
  317. package/lib/actions/locations.d.ts +0 -5
  318. package/lib/actions/messages.d.ts +0 -13
  319. package/lib/actions/notifications.d.ts +0 -5
  320. package/lib/actions/payments.d.ts +0 -10
  321. package/lib/actions/posts.d.ts +0 -19
  322. package/lib/actions/reactions.d.ts +0 -30
  323. package/lib/actions/s3.d.ts +0 -7
  324. package/lib/actions/search.d.ts +0 -3
  325. package/lib/actions/sms.d.ts +0 -3
  326. package/lib/actions/statistics.d.ts +0 -3
  327. package/lib/actions/subscription.d.ts +0 -7
  328. package/lib/actions/subscription.js +0 -218
  329. package/lib/actions/tags.d.ts +0 -29
  330. package/lib/actions/users.d.ts +0 -47
  331. package/lib/actions/websockets.d.ts +0 -19
  332. package/lib/adapters/arangoAdapter.d.ts +0 -2
  333. package/lib/adapters/fileAdapter.d.ts +0 -3
  334. package/lib/adapters/postAdapter.d.ts +0 -2
  335. package/lib/adapters/reaktorAdapter.d.ts +0 -6
  336. package/lib/adapters/tagAdapter.d.ts +0 -2
  337. package/lib/adapters/userAdapter.d.ts +0 -2
  338. package/lib/config.d.ts +0 -20
  339. package/lib/index.d.ts +0 -5
  340. package/lib/lambdas/actions/websockets.d.ts +0 -6
  341. package/lib/lambdas/authorizer.d.ts +0 -20
  342. package/lib/lambdas/connection.d.ts +0 -12
  343. package/lib/lambdas/utils/message.d.ts +0 -1
  344. package/lib/lambdas/utils/websocket.d.ts +0 -7
  345. package/lib/mocks/conversation.d.ts +0 -8
  346. package/lib/mocks/file.d.ts +0 -11
  347. package/lib/mocks/group.d.ts +0 -17
  348. package/lib/mocks/image.d.ts +0 -3
  349. package/lib/mocks/post.d.ts +0 -38
  350. package/lib/mocks/tag.d.ts +0 -2
  351. package/lib/mocks/user.d.ts +0 -4
  352. package/lib/templates/email/layout.d.ts +0 -2
  353. package/lib/templates/email/passwordForgot.d.ts +0 -2
  354. package/lib/templates/email/passwordRecovery.d.ts +0 -2
  355. package/lib/templates/email/verifyEmail.d.ts +0 -2
  356. package/lib/templates/email/welcome.d.ts +0 -2
  357. package/lib/templates/sms/passwordForgot.d.ts +0 -2
  358. package/lib/templates/sms/passwordRecovery.d.ts +0 -2
  359. package/lib/templates/sms/verifyEmail.d.ts +0 -2
  360. package/lib/templates/sms/verifyPhone.d.ts +0 -2
  361. package/lib/templates/sms/welcome.d.ts +0 -2
  362. package/lib/types/apps.d.ts +0 -46
  363. package/lib/types/apps.js +0 -32
  364. package/lib/types/arangodb.d.ts +0 -30
  365. package/lib/types/auth.d.ts +0 -7
  366. package/lib/types/connections.d.ts +0 -7
  367. package/lib/types/conversations.d.ts +0 -29
  368. package/lib/types/conversations.js +0 -16
  369. package/lib/types/email.d.ts +0 -13
  370. package/lib/types/error.d.ts +0 -20
  371. package/lib/types/files.d.ts +0 -26
  372. package/lib/types/files.js +0 -16
  373. package/lib/types/google.d.ts +0 -29
  374. package/lib/types/google.js +0 -16
  375. package/lib/types/groups.d.ts +0 -21
  376. package/lib/types/images.d.ts +0 -51
  377. package/lib/types/images.js +0 -16
  378. package/lib/types/index.d.ts +0 -18
  379. package/lib/types/locations.d.ts +0 -20
  380. package/lib/types/messages.d.ts +0 -16
  381. package/lib/types/notifications.d.ts +0 -17
  382. package/lib/types/payments.d.ts +0 -112
  383. package/lib/types/payments.js +0 -16
  384. package/lib/types/posts.d.ts +0 -31
  385. package/lib/types/posts.js +0 -16
  386. package/lib/types/statistics.d.ts +0 -3
  387. package/lib/types/tags.d.ts +0 -10
  388. package/lib/types/users.d.ts +0 -76
  389. package/lib/types/users.js +0 -16
  390. package/lib/types/websocket.d.ts +0 -13
  391. package/lib/types/websocket.js +0 -16
  392. package/lib/utils/adapterUtils.d.ts +0 -1
  393. package/lib/utils/analyticsUtils.d.ts +0 -21
  394. package/lib/utils/arangodbUtils.d.ts +0 -65
  395. package/lib/utils/auth.d.ts +0 -20
  396. package/lib/utils/auth.js +0 -50
  397. package/lib/utils/index.d.ts +0 -5
  398. package/lib/utils/session.d.ts +0 -16
  399. /package/{lib → dist}/types/error.js +0 -0
  400. /package/{lib → dist}/types/statistics.js +0 -0
@@ -1,554 +1,84 @@
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
- getActiveUserCount: () => getActiveUserCount,
37
- getDisplayName: () => getDisplayName,
38
- getSessionUser: () => getSessionUser,
39
- getUser: () => getUser,
40
- getUserByToken: () => getUserByToken,
41
- getUserOptional: () => getUserOptional,
42
- getUsers: () => getUsers,
43
- getUsersByLatest: () => getUsersByLatest,
44
- getUsersByReactions: () => getUsersByReactions,
45
- getUsersByTags: () => getUsersByTags,
46
- parseUserOptions: () => parseUserOptions,
47
- refreshSession: () => refreshSession,
48
- signIn: () => signIn,
49
- signOut: () => signOut,
50
- updateUser: () => updateUser
51
- });
52
- module.exports = __toCommonJS(users_exports);
53
- var import_utils = require("@nlabs/utils");
54
- var import_arangojs = require("arangojs");
55
- var import_luxon = require("luxon");
56
- var import_stripe = __toESM(require("stripe"));
57
- var import_config = require("../config");
58
- var import_analyticsUtils = require("../utils/analyticsUtils");
59
- var import_arangodbUtils = require("../utils/arangodbUtils");
60
- var import_session = require("../utils/session");
61
- var import_error = require("../types/error");
62
- var import_userAdapter = require("../adapters/userAdapter");
63
- const eventCategory = "users";
64
- const STRIPE_API_VERSION = "2020-03-02";
65
- var UserAccess = /* @__PURE__ */ ((UserAccess2) => {
66
- UserAccess2[UserAccess2["DEACTIVATED"] = 0] = "DEACTIVATED";
67
- UserAccess2[UserAccess2["ACTIVE"] = 1] = "ACTIVE";
68
- UserAccess2[UserAccess2["PREMIUM"] = 2] = "PREMIUM";
69
- UserAccess2[UserAccess2["CONTENT_ADMIN"] = 3] = "CONTENT_ADMIN";
70
- UserAccess2[UserAccess2["ADMIN"] = 4] = "ADMIN";
71
- return UserAccess2;
72
- })(UserAccess || {});
73
- const createToken = (userId, username, userAccess, expiresInMinutes = 15) => {
74
- const now = import_luxon.DateTime.local();
75
- const sessionExpires = now.plus({ minutes: expiresInMinutes });
76
- const iat = Math.floor(now.toSeconds());
77
- const exp = Math.floor(sessionExpires.toSeconds());
78
- const token = (0, import_session.setSession)({
79
- exp,
80
- iat,
81
- username,
82
- userAccess,
83
- userId
84
- });
85
- return {
86
- expires: sessionExpires.toMillis(),
87
- issued: now.toMillis(),
88
- token
89
- };
90
- };
91
- const getUserOptional = (fields = []) => fields.reduce((selects, field) => {
92
- if (field.includes("Count")) {
93
- return (0, import_arangodbUtils.selectReactionCountByType)("users", "u", field, selects);
94
- }
95
- return selects;
96
- }, { objects: [], queries: [] });
97
- const parseUserOptions = (options = {}) => {
98
- const {
99
- from = 0,
100
- to = 30
101
- } = options;
102
- const limit = (0, import_arangodbUtils.getLimit)(from, to);
103
- return {
104
- ...options,
105
- limit
106
- };
107
- };
108
- const addUser = async (context, user) => {
109
- const action = "addUser";
110
- const { database } = context;
111
- const { email, password, phone, username } = (0, import_userAdapter.parseUser)(user);
112
- const salt = (0, import_utils.createHash)(`${username}${password}`, null);
113
- const encryptedPassword = (0, import_utils.createPassword)(password, salt);
114
- const formatUsername = (0, import_utils.parseUsername)(username);
115
- const formatEmail = (0, import_utils.parseEmail)(email);
116
- const formatPhone = (0, import_utils.parsePhone)(phone);
117
- if (!formatUsername || !password || !formatPhone && !formatEmail) {
118
- return (0, import_analyticsUtils.logException)({
119
- action,
120
- category: eventCategory,
121
- params: { username },
122
- value: import_error.ErrorTypes.INVALID_ARGUMENTS
123
- }, context);
124
- }
125
- const filters = [`u.username == "${formatUsername}"`];
126
- if (formatEmail) {
127
- filters.push(`u.email == "${formatEmail}"`);
128
- }
129
- if (formatPhone) {
130
- filters.push(`u.phone == ${formatPhone}`);
131
- }
132
- const checkQuery = `FOR u IN users
133
- FILTER ${filters.join(" || ")}
1
+ import{createHash as v,createPassword as P,parseArangoId as M,parseChar as Q,parseEmail as H,parseNum as J,parsePassword as L,parsePhone as Y,parseUsername as S}from"@nlabs/utils";import{aql as U}from"arangojs";import{DateTime as X}from"luxon";import z from"stripe";import{parseUser as D}from"../adapters/userAdapter";import{Config as K}from"../config";import{sendEmail as Z}from"./email";import{sendSms as ee}from"./sms";import{ErrorTypes as d}from"../types/error.types";import{logError as I,logException as q}from"../utils/analyticsUtils";import{getDocId as j,getLimit as se,selectReactionCountByType as re,useDb as g}from"../utils/arangodbUtils";import{detectLanguage as te}from"../utils/languageDetection";import{getSession as _,setSession as ne}from"../utils/sessionUtils";const E="users",oe="2025-05-28.basil";var ae=(t=>(t[t.DEACTIVATED=0]="DEACTIVATED",t[t.ACTIVE=1]="ACTIVE",t[t.PREMIUM=2]="PREMIUM",t[t.CONTENT_ADMIN=3]="CONTENT_ADMIN",t[t.ADMIN=4]="ADMIN",t))(ae||{});const B=(e,o,s,i=15)=>{const n=X.local(),t=n.plus({minutes:i}),u=Math.floor(n.toSeconds()),r=Math.floor(t.toSeconds()),a=ne({exp:r,iat:u,userAccess:s,userId:e,username:o});return{expires:t.toMillis(),issued:n.toMillis(),token:a,userId:e,username:o}},$=(e=[])=>e.reduce((o,s)=>s.includes("Count")?re("users","u",s,o):o,{objects:[],queries:[]}),b=(e={})=>{const{from:o=0,to:s=30}=e,i=se(o,s);return{...e,limit:i}},Ue=async(e,o)=>{const s="addUser",{databaseName:i,languageContext:n}=e,{email:t,password:u,phone:r,username:a,userId:c,_key:l,_id:p,...m}=D(o),T=L(u);if(!!!T||!(!!a||!!r||!!t))return q({action:s,category:E,params:{username:a},value:d.INVALID_ARGUMENTS},e);const A=v(`${a||r||t}${T}`,null),N=P(T,A),h=[];a&&h.push(`u.username == "${a}"`),t&&h.push(`u.email == "${t}"`),r&&h.push(`u.phone == ${r}`);const w=`FOR u IN users
2
+ FILTER ${h.join(" || ")}
134
3
  LIMIT 1
135
- RETURN u`;
136
- try {
137
- const existingUsers = await database.query(checkQuery).then((cursor) => cursor.all());
138
- if (existingUsers.length) {
139
- return (0, import_analyticsUtils.logException)({
140
- action,
141
- category: eventCategory,
142
- params: { username },
143
- value: import_error.ErrorTypes.EXISTING_ITEM
144
- }, context);
145
- }
146
- } catch (error) {
147
- return (0, import_analyticsUtils.logError)({
148
- action,
149
- category: eventCategory,
150
- params: { username },
151
- value: import_error.ErrorTypes.DATABASE_ERROR
152
- }, error, context);
153
- }
154
- const verifiedEmailCode = Math.floor(1e5 + Math.random() * 9e5);
155
- const verifiedPhoneCode = Math.floor(1e5 + Math.random() * 9e5);
156
- const insert = {
157
- _key: (0, import_utils.createHash)(username, null),
158
- added: Date.now(),
159
- email: formatEmail,
160
- modified: Date.now(),
161
- password: encryptedPassword,
162
- phone: formatPhone,
163
- salt,
164
- username: formatUsername,
165
- userAccess: 1,
166
- verifiedEmail: false,
167
- verifiedEmailCode,
168
- verifiedPhone: false,
169
- verifiedPhoneCode
170
- };
171
- const insertQuery = import_arangojs.aql`INSERT ${insert} IN users RETURN NEW`;
172
- return await database.query(insertQuery).then((cursor) => cursor.next()).catch((error) => (0, import_analyticsUtils.logError)({
173
- action,
174
- category: eventCategory,
175
- params: { username },
176
- value: import_error.ErrorTypes.DATABASE_ERROR
177
- }, error, context));
178
- };
179
- const updateUser = async (context, user) => {
180
- const action = "updateUser";
181
- const { database, session } = context;
182
- const { _key, _id, id, tags = [], userId, ...updated } = (0, import_userAdapter.parseUser)(user);
183
- if (!(0, import_session.isAdminUser)(session) && session?.userId !== userId) {
184
- return (0, import_analyticsUtils.logException)({
185
- action,
186
- category: eventCategory,
187
- params: { session },
188
- value: import_error.ErrorTypes.INVALID_SESSION
189
- }, context);
190
- }
191
- const userQuery = import_arangojs.aql`LET u = DOCUMENT(${id})
192
- UPDATE u WITH ${updated} IN users
193
- RETURN NEW`;
194
- try {
195
- const updatedUser = await database.query(userQuery).then((cursor) => cursor.next());
196
- const tagCollection = database.collection("isTagged");
197
- await Promise.all(tags.map(({ id: tagDocId, name }) => {
198
- const tagQuery = import_arangojs.aql`FOR it IN isTagged
199
- FILTER it._from == ${tagDocId} && it._to == ${id} && it.name == ${name}
4
+ RETURN u`;try{if((await g(i).query(w).then(W=>W.all())).length)return q({action:s,category:E,params:{email:t,phone:r,username:a},value:d.EXISTING_ITEM},e)}catch(C){return I({action:s,category:E,params:{email:t,phone:r,username:a},value:d.DATABASE_ERROR},C,e)}const x=r?.replace(/\D/g,"").substring(0,3),O=te({...n,phoneCountryCode:x,userPreference:m.locale||"en"}),F=Math.floor(1e5+Math.random()*9e5),k=Math.floor(1e5+Math.random()*9e5),G={...m,_key:v(a,null),added:Date.now(),email:t,locale:O,modified:Date.now(),password:N,phone:r,salt:A,userAccess:1,username:a,verifiedEmail:!1,verifiedEmailCode:F,verifiedPhone:!1,verifiedSmsCode:k},V=U`INSERT ${G} IN users RETURN NEW`;return await g(i).query(V).then(C=>C.next()).catch(C=>I({action:s,category:E,params:{username:a},value:d.DATABASE_ERROR},C,e))},Ne=async(e,o)=>{const s="updateUser",{databaseName:i}=e,n=D(o),{_key:t,_id:u,tags:r=[],...a}=n,{id:c}=n,l=U`LET u = DOCUMENT(${c})
5
+ UPDATE u WITH ${a} IN users
6
+ RETURN NEW`;try{const p=g(i),m=await p.query(l).then(y=>y.next()),T=p.collection("isTagged");return await Promise.all(r.map(({id:y,name:f})=>{const R=U`FOR it IN isTagged
7
+ FILTER it._from == ${y} && it._to == ${c} && it.name == ${f}
200
8
  LIMIT 1
201
- RETURN it`;
202
- return database.query(tagQuery).then((cursor) => cursor.next()).then((tagEdge) => {
203
- if (!!tagEdge) {
204
- return tagEdge;
205
- }
206
- const edge = {
207
- _from: tagDocId,
208
- _key: (0, import_utils.createHash)(`isTagged-${tagDocId}-${id}`),
209
- _to: id,
210
- added: Date.now(),
211
- name
212
- };
213
- return tagCollection.save(edge, { returnNew: true }).then(() => edge);
214
- });
215
- }));
216
- return updatedUser;
217
- } catch (error) {
218
- return (0, import_analyticsUtils.logError)({
219
- action,
220
- category: eventCategory,
221
- params: { user },
222
- value: import_error.ErrorTypes.DATABASE_ERROR
223
- }, error, context);
224
- }
225
- };
226
- const confirmCode = async (context, { code, type }) => {
227
- const { database, session: { userId: sessionId } } = context;
228
- const userDocId = (0, import_arangodbUtils.getDocId)("users", { userId: sessionId });
229
- const aqlQuery = import_arangojs.aql`LET u = DOCUMENT(${userDocId}) RETURN u`;
230
- try {
231
- return await database.query(aqlQuery).then((cursor) => cursor.next()).then(({ verifiedEmailCode, verifiedPhoneCode }) => {
232
- switch (type) {
233
- case "email":
234
- return code === verifiedEmailCode;
235
- case "phone":
236
- return code === verifiedPhoneCode;
237
- default:
238
- return false;
239
- }
240
- });
241
- } catch (error) {
242
- return false;
243
- }
244
- };
245
- const deleteUser = (context, user) => {
246
- const action = "deleteUser";
247
- const { database } = context;
248
- const { userId } = (0, import_userAdapter.parseUser)(user);
249
- const aqlQuery = import_arangojs.aql`FOR u IN users
250
- FILTER u._key == ${userId}
9
+ RETURN it`;return p.query(R).then(A=>A.next()).then(A=>{if(A)return A;const N={_from:y,_key:v(`isTagged-${y}-${c}`),_to:c,added:Date.now(),name:f};return T.save(N,{returnNew:!0}).then(()=>N)})})),m}catch(p){return I({action:s,category:E,params:{user:o},value:d.DATABASE_ERROR},p,e)}},he=async(e,{email:o,phone:s,username:i})=>{const n="forgotPassword",{databaseName:t}=e,u=U`FOR u IN users
10
+ FILTER u.email == ${o} || u.phone == ${s} || u.username == ${i}
251
11
  LIMIT 1
12
+ RETURN u`;try{return await g(t).query(u).then(async r=>{const a=r.next();if(a){const{email:c,phone:l,verifiedEmail:p,verifiedPhone:m}=a,T=1e3*60*15,y=Math.floor(1e5+Math.random()*9e5),f=j("users",a);let R;if(c&&p&&(Z({context:e,text:`Your code is ${y}`}),R={verifiedEmailCode:y,verifiedEmailExpires:T}),l&&m&&(ee({context:e,text:`Your code is ${y}`}),R={verifiedSmsCode:y,verifiedPhoneExpires:T}),R.verifiedEmailCode||R.verifiedSmsCode){const A=U`UPDATE ${f} WITH ${R} IN users`;return await g(t).query(A),!0}return!1}return!1})}catch(r){return I({action:n,category:E,params:{email:o,phone:s,username:i},value:d.DATABASE_ERROR},r,e),!1}},Oe=async(e,{code:o,password:s,type:i,username:n})=>{const t="resetPassword",{databaseName:u}=e,r=L(s),a=U`FOR u IN users
13
+ FILTER u.username == ${n}
14
+ LIMIT 1
15
+ RETURN u`;try{return await g(u).query(a).then(async c=>{const l=c.next();if(l){const{_id:p,salt:m,verifiedEmailCode:T,verifiedEmailExpires:y,verifiedSmsCode:f,verifiedPhoneExpires:R}=l,A=Date.now();let N;switch(i){case"email":o===T&&y>A&&(N={password:P(r,m)});break;case"phone":o===f&&R>A&&(N={password:P(r,m)});break;default:return!1}if(N){const h=U`UPDATE ${p} WITH ${N} IN users`;return await g(u).query(h),!0}}return!1})}catch(c){return I({action:t,category:E,params:{username:n},value:d.DATABASE_ERROR},c,e),!1}},$e=async(e,{code:o,type:s})=>{const i="confirmCode",{databaseName:n,session:{userId:t}}=e,u=j("users",{userId:t}),r=U`LET u = DOCUMENT(${u}) RETURN u`;try{return await g(n).query(r).then(a=>a.next()).then(({verifiedEmailCode:a,verifiedSmsCode:c})=>{switch(s){case"email":return o===a;case"phone":return o===c;default:return!1}})}catch(a){return I({action:i,category:E,params:{code:o,type:s},value:d.DATABASE_ERROR},a,e),!1}},Ce=(e,o)=>{const s="deleteUser",{databaseName:i}=e,{id:n}=D(o),t=U`LET u = DOCUMENT(${n})
252
16
  REMOVE u IN users
253
- RETURN OLD`;
254
- const stripeClient = new import_stripe.default(import_config.Config.get("stripe.token"), { apiVersion: STRIPE_API_VERSION, typescript: true });
255
- 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)({
256
- action,
257
- category: eventCategory,
258
- params: { userId },
259
- value: import_error.ErrorTypes.DATABASE_ERROR
260
- }, error, context));
261
- };
262
- const deactivateUser = (context, user) => {
263
- const action = "delete";
264
- const { database } = context;
265
- const { userId } = (0, import_userAdapter.parseUser)(user);
266
- const updated = {
267
- userAccess: 0
268
- };
269
- const aqlQuery = import_arangojs.aql`UPDATE ${userId} WITH ${updated} IN users LIMIT 1 RETURN NEW`;
270
- return database.query(aqlQuery).then((cursor) => cursor.next()).catch((error) => (0, import_analyticsUtils.logError)({
271
- action,
272
- category: eventCategory,
273
- params: { userId },
274
- value: import_error.ErrorTypes.DATABASE_ERROR
275
- }, error, context));
276
- };
277
- const getDisplayName = (user) => {
278
- const { first, last, name = "", username = "" } = user;
279
- const fullname = [first, last].join(" ").trim();
280
- if (name) {
281
- return name;
282
- } else if (fullname !== "") {
283
- return fullname;
284
- } else if (username) {
285
- return username;
286
- }
287
- return "Unknown";
288
- };
289
- const getSessionUser = (context) => {
290
- const action = "getSessionUser";
291
- const { database, fields, session: { userId: sessionId, username } } = context;
292
- const { objects: selectObjects, queries: selectQueries } = getUserOptional(fields);
293
- const aqlQuery = `LET u = DOCUMENT("users/${sessionId}")
294
- ${selectQueries.join("\n")}
295
- RETURN MERGE(u, {${selectObjects.join(", ")}})`;
296
- return database.query(aqlQuery).then((cursor) => cursor.next()).catch((error) => (0, import_analyticsUtils.logError)({
297
- action,
298
- category: eventCategory,
299
- params: { username, userId: sessionId },
300
- value: import_error.ErrorTypes.DATABASE_ERROR
301
- }, error, context));
302
- };
303
- const getUser = (context, user) => {
304
- const action = "getUser";
305
- const { userId } = (0, import_userAdapter.parseUser)(user);
306
- const { database, fields } = context;
307
- const { objects: selectObjects, queries: selectQueries } = getUserOptional(fields);
308
- const aqlQuery = `LET u = DOCUMENT("users/${userId}")
309
- ${selectQueries.join("\n")}
17
+ RETURN OLD`,u=new z(K.get("stripe.token"),{apiVersion:oe,typescript:!0});return g(i).query(t).then(r=>r.next()).then(r=>u.customers.del(r?.stripeCustomerId).then(()=>u.accounts.del(r?.stripeAccountId)).then(()=>r)).catch(r=>I({action:s,category:E,params:{id:n},value:d.DATABASE_ERROR},r,e))},Se=(e,o)=>{const s="delete",{databaseName:i}=e,{id:n}=D(o),u=U`UPDATE ${n} WITH ${{userAccess:0}} IN users LIMIT 1 RETURN NEW`;return g(i).query(u).then(r=>r.next()).catch(r=>I({action:s,category:E,params:{id:n},value:d.DATABASE_ERROR},r,e))},qe=e=>{const{first:o,last:s,name:i="",username:n=""}=e,t=[o,s].join(" ").trim();return i||(t!==""?t:n||"Unknown")},De=e=>{const o="getSessionUser",{databaseName:s,fields:i,session:{userId:n,username:t}}=e,{objects:u,queries:r}=$(i),c=`LET u = DOCUMENT("${M(`users/${n}`)}")
18
+ ${r.join(`
19
+ `)}
20
+ RETURN MERGE(u, {${u.join(", ")}})`;return g(s).query(c).then(l=>l.next()).catch(l=>(I({action:o,category:E,params:{userId:n,username:t},value:d.DATABASE_ERROR},l,e),null))},be=(e,o)=>{const s="getUser",{email:i,id:n,phone:t,userId:u,username:r}=D(o),{databaseName:a,fields:c}=e,{objects:l,queries:p}=$(c);let m;return n?m=`LET u = DOCUMENT("${n}")
21
+ ${p.join(`
22
+ `)}
310
23
  FILTER u.userAccess > 0
311
- RETURN MERGE(u, {${selectObjects.join(", ")}})`;
312
- return database.query(aqlQuery).then((cursor) => cursor.next()).then((user2) => user2).catch((error) => (0, import_analyticsUtils.logError)({
313
- action,
314
- category: eventCategory,
315
- params: { userId },
316
- value: import_error.ErrorTypes.DATABASE_ERROR
317
- }, error, context));
318
- };
319
- const getUsers = (context, options) => {
320
- const action = "getUserList";
321
- const { database, fields } = context;
322
- const { limit, username } = parseUserOptions(options);
323
- const { objects: selectObjects, queries: selectQueries } = getUserOptional(fields);
324
- const filterBy = ["u.userAccess > 0"];
325
- if (username) {
326
- filterBy.push(`CONTAINS(u.username, "${(0, import_utils.parseUsername)(username)}")`);
327
- }
328
- const aqlQuery = `FOR u IN users
329
- FILTER ${filterBy.join(" && ")}
330
- ${selectQueries.join("\n")}
331
- ${limit.aql}
24
+ RETURN MERGE(u, {${l.join(", ")}})`:r?m=`FOR u IN users
25
+ FILTER u.username == "${r}"
26
+ ${p.join(`
27
+ `)}
28
+ RETURN MERGE(u, {${l.join(", ")}})`:i?m=`FOR u IN users
29
+ FILTER u.email == "${i}"
30
+ ${p.join(`
31
+ `)}
32
+ RETURN MERGE(u, {${l.join(", ")}})`:t&&(m=`FOR u IN users
33
+ FILTER u.phone == "${t}"
34
+ ${p.join(`
35
+ `)}
36
+ RETURN MERGE(u, {${l.join(", ")}})`),g(a).query(m).then(T=>T.next()).then(T=>T).catch(T=>I({action:s,category:E,params:{id:n,userId:u,username:r},value:d.DATABASE_ERROR},T,e))},we=(e,o)=>{const s="getUserList",{databaseName:i,fields:n}=e,{limit:t,username:u}=b(o),{objects:r,queries:a}=$(n),c=["u.userAccess > 0"];u&&c.push(`CONTAINS(u.username, "${S(u)}")`);const l=`FOR u IN users
37
+ FILTER ${c.join(" && ")}
38
+ ${a.join(`
39
+ `)}
40
+ ${t.aql}
332
41
  SORT u.username
333
- RETURN MERGE(u, {${selectObjects.join(", ")}})`;
334
- return database.query(aqlQuery).then((cursor) => cursor.all()).catch((error) => (0, import_analyticsUtils.logError)({
335
- action,
336
- category: eventCategory,
337
- value: import_error.ErrorTypes.DATABASE_ERROR
338
- }, error, context));
339
- };
340
- const getUsersByReactions = (context, { reactions = [], username }, options) => {
341
- const action = "getUsersByReactions";
342
- const { database, fields, session: { userId: sessionId } } = context;
343
- const formatReactions = reactions.map((reactionName) => (0, import_utils.parseChar)(reactionName, 32).toLowerCase());
344
- const { limit } = parseUserOptions(options);
345
- const { objects: selectObjects, queries: selectQueries } = getUserOptional(fields);
346
- const formatSessionId = `users/${sessionId}`;
347
- const formatUsername = (0, import_utils.parseUsername)(username);
348
- const filterBy = [`POSITION(${JSON.stringify(formatReactions)}, LOWER(r.name))`];
349
- if (username) {
350
- filterBy.push(`CONTAINS(u.username, "${formatUsername}")`);
351
- }
352
- const aqlQuery = `FOR u, r IN OUTBOUND "${formatSessionId}" hasReaction
42
+ RETURN MERGE(u, {${r.join(", ")}})`;return g(i).query(l).then(p=>p.all()).catch(p=>(I({action:s,category:E,value:d.DATABASE_ERROR},p,e),[]))},Pe=(e,{reactions:o=[],username:s},i)=>{const n="getUsersByReactions",{databaseName:t,fields:u,session:{userId:r}}=e,a=o.map(R=>Q(R,32).toLowerCase()),{limit:c}=b(i),{objects:l,queries:p}=$(u),m=`users/${r}`,T=S(s),y=["u.userAccess > 0",`POSITION(${JSON.stringify(a)}, LOWER(r.name))`];s&&y.push(`CONTAINS(u.username, "${T}")`);const f=`FOR u, r IN OUTBOUND "${m}" hasReaction
353
43
  OPTIONS {vertexCollections: "users"}
354
- ${selectQueries.join("\n")}
355
- FILTER ${filterBy.join(" && ")}
356
- ${limit.aql}
357
- RETURN MERGE(u, {${selectObjects.join(", ")}})`;
358
- return database.query(aqlQuery).then((cursor) => cursor.all()).catch((error) => (0, import_analyticsUtils.logError)({
359
- action,
360
- category: eventCategory,
361
- value: import_error.ErrorTypes.DATABASE_ERROR
362
- }, error, context));
363
- };
364
- const getUsersByTags = (context, { tags, username }, options) => {
365
- const action = "getUsersByTags";
366
- const { database, fields, session: { userId: sessionId } } = context;
367
- const formatTags = tags?.reduce((list, tagName) => {
368
- if (tagName) {
369
- list.push((0, import_utils.parseChar)(tagName, 32).toLowerCase());
370
- }
371
- return list;
372
- }, []);
373
- const { limit } = parseUserOptions(options);
374
- const { objects: selectObjects, queries: selectQueries } = getUserOptional(fields);
375
- const formatUsername = (0, import_utils.parseUsername)(username);
376
- const filterBy = [`u._key != "${sessionId}"`];
377
- if (username) {
378
- filterBy.push(`CONTAINS(u.username, "${formatUsername}")`);
379
- }
380
- const aqlQuery = `FOR t IN tags
381
- FILTER POSITION(${JSON.stringify(formatTags)}, LOWER(t.name))
44
+ ${p.join(`
45
+ `)}
46
+ FILTER ${y.join(" && ")}
47
+ ${c.aql}
48
+ RETURN MERGE(u, {${l.join(", ")}})`;return g(t).query(f).then(R=>R.all()).catch(R=>(I({action:n,category:E,value:d.DATABASE_ERROR},R,e),[]))},xe=(e,{tags:o,username:s},i)=>{const n="getUsersByTags",{databaseName:t,fields:u,session:{userId:r}}=e,a=o?.reduce((f,R)=>(R&&f.push(Q(R,32).toLowerCase()),f),[]),{limit:c}=b(i),{objects:l,queries:p}=$(u),m=S(s),T=[`u._key != "${r}"`,"u.userAccess > 0"];s&&T.push(`CONTAINS(u.username, "${m}")`);const y=`FOR t IN tags
49
+ FILTER POSITION(${JSON.stringify(a)}, LOWER(t.name))
382
50
  FOR u, it IN OUTBOUND t isTagged
383
51
  OPTIONS {bfs: true, uniqueVertices: "global", vertexCollections: "users"}
384
- ${selectQueries.join("\n")}
385
- FILTER ${filterBy.join(" && ")}
386
- ${limit.aql}
387
- RETURN DISTINCT MERGE(u, {${selectObjects.join(", ")}})`;
388
- return database.query(aqlQuery).then((cursor) => cursor.all()).catch((error) => (0, import_analyticsUtils.logError)({
389
- action,
390
- category: eventCategory,
391
- value: import_error.ErrorTypes.DATABASE_ERROR
392
- }, error, context));
393
- };
394
- const getUsersByLatest = (context, { username }, options) => {
395
- const action = "getUsersByLatest";
396
- const { database, fields, session: { userId } } = context;
397
- const { limit } = parseUserOptions(options);
398
- const filter = ["u._id != session._id"];
399
- const { objects: selectObjects, queries: selectQueries } = getUserOptional(fields);
400
- if (username) {
401
- filter.push(`CONTAINS(u.username, "${(0, import_utils.parseUsername)(username)}")`);
402
- }
403
- const aqlQuery = `FOR u IN users
404
- LET session = DOCUMENT("users/${userId}")
405
- FILTER ${filter.join(" && ")}
406
- ${selectQueries.join("\n")}
52
+ ${p.join(`
53
+ `)}
54
+ FILTER ${T.join(" && ")}
55
+ ${c.aql}
56
+ RETURN DISTINCT MERGE(u, {${l.join(", ")}})`;return g(t).query(y).then(f=>f.all()).catch(f=>(I({action:n,category:E,value:d.DATABASE_ERROR},f,e),[]))},ve=(e,{username:o},s)=>{const i="getUsersByLatest",{databaseName:n,fields:t,session:{userId:u}}=e,{limit:r}=b(s),a=["u._id != session._id","u.userAccess > 0"],{objects:c,queries:l}=$(t);o&&a.push(`CONTAINS(u.username, "${S(o)}")`);const p=`FOR u IN users
57
+ LET session = DOCUMENT("users/${u}")
58
+ FILTER ${a.join(" && ")}
59
+ ${l.join(`
60
+ `)}
407
61
  LET distance = DISTANCE(u.latitude || 0, u.longitude || 0, session.latitude || 0, session.longitude || 0)
408
- ${limit.aql}
62
+ ${r.aql}
409
63
  SORT distance ASC, u.added DESC
410
- RETURN MERGE(u, {${selectObjects.join(", ")}})`;
411
- return database.query(aqlQuery).then((cursor) => cursor.all()).catch((error) => (0, import_analyticsUtils.logError)({
412
- action,
413
- category: eventCategory,
414
- value: import_error.ErrorTypes.DATABASE_ERROR
415
- }, error, context));
416
- };
417
- const refreshSession = async (context, { expires, token }) => {
418
- const { userId, username, userAccess } = (0, import_session.getSession)(token);
419
- return createToken(userId, username, userAccess, expires);
420
- };
421
- const signIn = async (context, args) => {
422
- const action = "signIn";
423
- const { database } = context;
424
- const { email, expires, password, username } = args;
425
- const formatEmail = (0, import_utils.parseEmail)(email);
426
- const formatUsername = (0, import_utils.parseUsername)(username);
427
- const formatPassword = (0, import_utils.parsePassword)(password);
428
- const formatExpires = (0, import_utils.parseNum)(expires) || 15;
429
- if (!formatUsername && !formatEmail || !formatPassword) {
430
- return (0, import_analyticsUtils.logException)({
431
- action,
432
- category: eventCategory,
433
- params: { username },
434
- value: import_error.ErrorTypes.INVALID_ARGUMENTS
435
- }, context);
436
- }
437
- const filters = [];
438
- if (formatEmail) {
439
- filters.push(`u.email == "${formatEmail}"`);
440
- } else if (formatUsername) {
441
- filters.push(`u.username == "${formatUsername}"`);
442
- }
443
- const checkQuery = `FOR u IN users
444
- FILTER ${filters.join(" || ")}
64
+ RETURN MERGE(u, {${c.join(", ")}})`;return g(n).query(p).then(m=>m.all()).catch(m=>(I({action:i,category:E,value:d.DATABASE_ERROR},m,e),[]))},Le=(e,{userId:o},s)=>{const i="getUsersByConnection",{databaseName:n,fields:t}=e,{limit:u,username:r}=b(s),{objects:a,queries:c}=$(t),l=M(`users/${o}`),p=["u.userAccess > 0"];r&&p.push(`CONTAINS(u.username, "${S(r)}")`);const m=`FOR cu IN users
65
+ LET session = DOCUMENT("${l}")
66
+ FOR u, connection IN OUTBOUND cu hasConnection
67
+ OPTIONS {bfs: true, uniqueVertices: "global", vertexCollections: "users"}
68
+ ${c.join(`
69
+ `)}
70
+ FILTER ${p.join(" && ")}
71
+ ${u.aql}
72
+ RETURN DISTINCT MERGE(u, {${a.join(", ")}})`;return g(n).query(m).then(T=>T.all()).catch(T=>(I({action:i,category:E,value:d.DATABASE_ERROR},T,e),[]))},je=({expires:e,token:o})=>{try{const{userId:s,username:i,userAccess:n}=_(o);return B(s,i,n,e)}catch(s){throw s}},Me=async(e,o)=>{const s="signIn",{databaseName:i}=e,{email:n,expires:t,password:u,phone:r,username:a}=o,c=H(n),l=S(a),p=L(u),m=Y(r),T=J(t)||15;if(!l&&!c&&!m||!p)return q({action:s,category:E,params:{username:a},value:d.INVALID_ARGUMENTS},e),null;const y=[];c&&y.push(`u.email == "${c}"`),m&&y.push(`u.phone == ${m}`),l&&y.push(`u.username == "${l}"`);const f=`FOR u IN users
73
+ FILTER ${y.join(" || ")}
445
74
  LIMIT 1
446
- RETURN u`;
447
- let checkUser;
448
- try {
449
- checkUser = await database.query(checkQuery).then((cursor) => cursor.next());
450
- } catch (error) {
451
- return (0, import_analyticsUtils.logError)({
452
- action,
453
- category: eventCategory,
454
- params: { username: formatUsername },
455
- value: import_error.ErrorTypes.DATABASE_ERROR
456
- }, error, context);
457
- }
458
- if (!checkUser) {
459
- return (0, import_analyticsUtils.logException)({
460
- action,
461
- category: eventCategory,
462
- params: { username },
463
- value: import_error.ErrorTypes.INVALID_AUTHENTICATION
464
- }, context);
465
- }
466
- const { _key: userId, password: validPassword, salt, userAccess } = checkUser;
467
- const authPassword = (0, import_utils.createPassword)(formatPassword, salt);
468
- if (validPassword !== authPassword) {
469
- return (0, import_analyticsUtils.logException)({
470
- action,
471
- category: eventCategory,
472
- params: { userAccess, userId, username },
473
- value: import_error.ErrorTypes.INVALID_AUTHENTICATION
474
- }, context);
475
- }
476
- return createToken(userId, username, userAccess, formatExpires);
477
- };
478
- const signOut = async (context) => {
479
- const action = "signOut";
480
- const { database, session: { userId: sessionId, username } } = context;
481
- const userDocId = `users/${sessionId}`;
482
- const update = {
483
- lastOnline: Date.now(),
484
- sessionId: null
485
- };
486
- const sessionQuery = import_arangojs.aql`LET u = DOCUMENT(${userDocId})
487
- UPDATE u WITH ${update} IN users
75
+ RETURN u`;let R;try{R=await g(i).query(f).then(O=>O.next())}catch(O){return I({action:s,category:E,params:{username:l},value:d.DATABASE_ERROR},O,e),null}if(!R)return q({action:s,category:E,params:{username:a},value:d.INVALID_AUTHENTICATION},e),null;const{_key:A,password:N,salt:h,userAccess:w}=R,x=P(p,h);if(N!==x)return q({action:s,category:E,params:{userAccess:w,userId:A,username:a},value:d.INVALID_AUTHENTICATION},e),null;try{return B(A,a,w,T)}catch(O){return I({action:s,category:E,params:{userId:A,username:a},value:d.DATABASE_ERROR},O,e),null}},Qe=async e=>{const o="signOut",{databaseName:s,session:{userId:i,username:n}}=e,t=`users/${i}`,u={lastOnline:Date.now(),sessionId:null},r=U`LET u = DOCUMENT(${t})
76
+ UPDATE u WITH ${u} IN users
488
77
  LIMIT 1
489
- RETURN NEW`;
490
- try {
491
- await database.query(sessionQuery).then((cursor) => cursor.next());
492
- } catch (error) {
493
- await (0, import_analyticsUtils.logError)({
494
- action,
495
- category: eventCategory,
496
- params: { username, userId: sessionId },
497
- value: import_error.ErrorTypes.DATABASE_ERROR
498
- }, error, context);
499
- }
500
- return true;
501
- };
502
- const getActiveUserCount = (context) => {
503
- const action = "getActiveUserCount";
504
- const { database } = context;
505
- const countQuery = import_arangojs.aql`LET docs = (
78
+ RETURN NEW`;try{await g(s).query(r).then(a=>a.next())}catch(a){await I({action:o,category:E,params:{userId:i,username:n},value:d.DATABASE_ERROR},a,e)}return!0},_e=e=>{const o="getActiveUserCount",{databaseName:s}=e,i=U`LET docs = (
506
79
  FOR u IN users
507
80
  FILTER u.active == true
508
81
  RETURN u
509
82
  )
510
- RETURN LENGTH(docs)`;
511
- return database.query(countQuery).then((cursor) => cursor.next()).catch((error) => (0, import_analyticsUtils.logError)({
512
- action,
513
- category: eventCategory,
514
- value: import_error.ErrorTypes.DATABASE_ERROR
515
- }, error, context));
516
- };
517
- const getUserByToken = (context, token) => {
518
- const action = "getUserByToken";
519
- const { database } = context;
520
- const { userId } = (0, import_session.getSession)(token);
521
- const userDocId = (0, import_arangodbUtils.getDocId)("users", { userId });
522
- const aqlQuery = import_arangojs.aql`LET u = DOCUMENT("${userDocId}") RETURN u`;
523
- return database.query(aqlQuery).then((cursor) => cursor.next()).catch((error) => (0, import_analyticsUtils.logError)({
524
- action,
525
- category: eventCategory,
526
- params: { userId },
527
- value: import_error.ErrorTypes.DATABASE_ERROR
528
- }, error, context));
529
- };
530
- // Annotate the CommonJS export names for ESM import in node:
531
- 0 && (module.exports = {
532
- UserAccess,
533
- addUser,
534
- confirmCode,
535
- createToken,
536
- deactivateUser,
537
- deleteUser,
538
- getActiveUserCount,
539
- getDisplayName,
540
- getSessionUser,
541
- getUser,
542
- getUserByToken,
543
- getUserOptional,
544
- getUsers,
545
- getUsersByLatest,
546
- getUsersByReactions,
547
- getUsersByTags,
548
- parseUserOptions,
549
- refreshSession,
550
- signIn,
551
- signOut,
552
- updateUser
553
- });
554
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvdXNlcnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge1xuICBjcmVhdGVIYXNoLFxuICBjcmVhdGVQYXNzd29yZCxcbiAgcGFyc2VDaGFyLFxuICBwYXJzZUVtYWlsLFxuICBwYXJzZUlkLFxuICBwYXJzZU51bSxcbiAgcGFyc2VQYXNzd29yZCxcbiAgcGFyc2VQaG9uZSxcbiAgcGFyc2VVc2VybmFtZVxufSBmcm9tICdAbmxhYnMvdXRpbHMnO1xuaW1wb3J0IHthcWx9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQge0VkZ2VDb2xsZWN0aW9ufSBmcm9tICdhcmFuZ29qcy9jb2xsZWN0aW9uJztcbmltcG9ydCB7QXJyYXlDdXJzb3J9IGZyb20gJ2FyYW5nb2pzL2N1cnNvcic7XG5pbXBvcnQge0RhdGVUaW1lfSBmcm9tICdsdXhvbic7XG5pbXBvcnQgU3RyaXBlIGZyb20gJ3N0cmlwZSc7XG5cbmltcG9ydCB7Q29uZmlnfSBmcm9tICcuLi9jb25maWcnO1xuaW1wb3J0IHR5cGUge0FwaUNvbnRleHR9IGZyb20gJy4uL3R5cGVzL2F1dGgnO1xuaW1wb3J0IHR5cGUge1VzZXJUeXBlfSBmcm9tICcuLi90eXBlcy91c2Vycyc7XG5pbXBvcnQge2xvZ0Vycm9yLCBsb2dFeGNlcHRpb259IGZyb20gJy4uL3V0aWxzL2FuYWx5dGljc1V0aWxzJztcbmltcG9ydCB7Z2V0RG9jSWQsIGdldExpbWl0LCBzZWxlY3RSZWFjdGlvbkNvdW50QnlUeXBlfSBmcm9tICcuLi91dGlscy9hcmFuZ29kYlV0aWxzJztcbmltcG9ydCB7Z2V0U2Vzc2lvbiwgaXNBZG1pblVzZXIsIFNlc3Npb25Ub2tlbiwgc2V0U2Vzc2lvbn0gZnJvbSAnLi4vdXRpbHMvc2Vzc2lvbic7XG5pbXBvcnQge0Vycm9yVHlwZXMsIFNlc3Npb25FcnJvcn0gZnJvbSAnLi4vdHlwZXMvZXJyb3InO1xuaW1wb3J0IHtwYXJzZVVzZXJ9IGZyb20gJy4uL2FkYXB0ZXJzL3VzZXJBZGFwdGVyJztcblxuY29uc3QgZXZlbnRDYXRlZ29yeTogc3RyaW5nID0gJ3VzZXJzJztcbmNvbnN0IFNUUklQRV9BUElfVkVSU0lPTjogYW55ID0gJzIwMjAtMDMtMDInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJPcHRpb25zIHtcbiAgcmVhZG9ubHkgZnJvbT86IG51bWJlcjtcbiAgcmVhZG9ubHkgdG8/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHVzZXJuYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZW51bSBVc2VyQWNjZXNzIHtcbiAgREVBQ1RJVkFURUQgPSAwLFxuICBBQ1RJVkUgPSAxLFxuICBQUkVNSVVNID0gMixcbiAgQ09OVEVOVF9BRE1JTiA9IDMsXG4gIEFETUlOID0gNFxufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlVG9rZW4gPSAoXG4gIHVzZXJJZDogc3RyaW5nLFxuICB1c2VybmFtZTogc3RyaW5nLFxuICB1c2VyQWNjZXNzOiBudW1iZXIsXG4gIGV4cGlyZXNJbk1pbnV0ZXM6IG51bWJlciA9IDE1XG4pOiBTZXNzaW9uVG9rZW4gPT4ge1xuICBjb25zdCBub3c6IERhdGVUaW1lID0gRGF0ZVRpbWUubG9jYWwoKTtcbiAgY29uc3Qgc2Vzc2lvbkV4cGlyZXM6IERhdGVUaW1lID0gbm93LnBsdXMoe21pbnV0ZXM6IGV4cGlyZXNJbk1pbnV0ZXN9KTtcbiAgY29uc3QgaWF0OiBudW1iZXIgPSBNYXRoLmZsb29yKG5vdy50b1NlY29uZHMoKSk7XG4gIGNvbnN0IGV4cDogbnVtYmVyID0gTWF0aC5mbG9vcihzZXNzaW9uRXhwaXJlcy50b1NlY29uZHMoKSk7XG4gIGNvbnN0IHRva2VuID0gc2V0U2Vzc2lvbih7XG4gICAgZXhwLFxuICAgIGlhdCxcbiAgICB1c2VybmFtZSxcbiAgICB1c2VyQWNjZXNzLFxuICAgIHVzZXJJZFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIGV4cGlyZXM6IHNlc3Npb25FeHBpcmVzLnRvTWlsbGlzKCksXG4gICAgaXNzdWVkOiBub3cudG9NaWxsaXMoKSxcbiAgICB0b2tlblxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJPcHRpb25hbCA9IChmaWVsZHM6IHN0cmluZ1tdID0gW10pID0+XG4gIGZpZWxkcy5yZWR1Y2UoKHNlbGVjdHM6IGFueSwgZmllbGQ6IHN0cmluZykgPT4ge1xuICAgIGlmKGZpZWxkLmluY2x1ZGVzKCdDb3VudCcpKSB7XG4gICAgICByZXR1cm4gc2VsZWN0UmVhY3Rpb25Db3VudEJ5VHlwZSgndXNlcnMnLCAndScsIGZpZWxkLCBzZWxlY3RzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZWN0cztcbiAgfSwge29iamVjdHM6IFtdLCBxdWVyaWVzOiBbXX0pO1xuXG5leHBvcnQgY29uc3QgcGFyc2VVc2VyT3B0aW9ucyA9IChvcHRpb25zOiBVc2VyT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBmcm9tID0gMCxcbiAgICB0byA9IDMwXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBsaW1pdCA9IGdldExpbWl0KGZyb20sIHRvKTtcblxuICByZXR1cm4ge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgbGltaXRcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRVc2VyID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXI6IFVzZXJUeXBlKTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnYWRkVXNlcic7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuICBjb25zdCB7ZW1haWwsIHBhc3N3b3JkLCBwaG9uZSwgdXNlcm5hbWV9ID0gcGFyc2VVc2VyKHVzZXIpO1xuICBjb25zdCBzYWx0OiBzdHJpbmcgPSBjcmVhdGVIYXNoKGAke3VzZXJuYW1lfSR7cGFzc3dvcmR9YCwgbnVsbCk7XG4gIGNvbnN0IGVuY3J5cHRlZFBhc3N3b3JkID0gY3JlYXRlUGFzc3dvcmQocGFzc3dvcmQsIHNhbHQpO1xuICBjb25zdCBmb3JtYXRVc2VybmFtZTogc3RyaW5nID0gcGFyc2VVc2VybmFtZSh1c2VybmFtZSk7XG4gIGNvbnN0IGZvcm1hdEVtYWlsOiBzdHJpbmcgPSBwYXJzZUVtYWlsKGVtYWlsKTtcbiAgY29uc3QgZm9ybWF0UGhvbmU6IHN0cmluZyA9IHBhcnNlUGhvbmUocGhvbmUpO1xuXG4gIGlmKCFmb3JtYXRVc2VybmFtZSB8fCAhcGFzc3dvcmQgfHwgKCFmb3JtYXRQaG9uZSAmJiAhZm9ybWF0RW1haWwpKSB7XG4gICAgcmV0dXJuIGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3VzZXJuYW1lfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklOVkFMSURfQVJHVU1FTlRTXG4gICAgfSwgY29udGV4dCk7XG4gIH1cblxuICBjb25zdCBmaWx0ZXJzOiBzdHJpbmdbXSA9IFtgdS51c2VybmFtZSA9PSBcIiR7Zm9ybWF0VXNlcm5hbWV9XCJgXTtcblxuICBpZihmb3JtYXRFbWFpbCkge1xuICAgIGZpbHRlcnMucHVzaChgdS5lbWFpbCA9PSBcIiR7Zm9ybWF0RW1haWx9XCJgKTtcbiAgfVxuXG4gIGlmKGZvcm1hdFBob25lKSB7XG4gICAgZmlsdGVycy5wdXNoKGB1LnBob25lID09ICR7Zm9ybWF0UGhvbmV9YCk7XG4gIH1cblxuICBjb25zdCBjaGVja1F1ZXJ5OiBzdHJpbmcgPSBgRk9SIHUgSU4gdXNlcnNcbiAgICBGSUxURVIgJHtmaWx0ZXJzLmpvaW4oJyB8fCAnKX1cbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIHVgO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZXhpc3RpbmdVc2VycyA9IGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KGNoZWNrUXVlcnkpLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG5cbiAgICBpZihleGlzdGluZ1VzZXJzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGxvZ0V4Y2VwdGlvbih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHBhcmFtczoge3VzZXJuYW1lfSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuRVhJU1RJTkdfSVRFTVxuICAgICAgfSwgY29udGV4dCk7XG4gICAgfVxuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgcmV0dXJuIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7dXNlcm5hbWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gIH1cblxuICBjb25zdCB2ZXJpZmllZEVtYWlsQ29kZTogbnVtYmVyID0gTWF0aC5mbG9vcigxMDAwMDAgKyAoTWF0aC5yYW5kb20oKSAqIDkwMDAwMCkpO1xuICBjb25zdCB2ZXJpZmllZFBob25lQ29kZTogbnVtYmVyID0gTWF0aC5mbG9vcigxMDAwMDAgKyAoTWF0aC5yYW5kb20oKSAqIDkwMDAwMCkpO1xuXG4gIGNvbnN0IGluc2VydDogVXNlclR5cGUgPSB7XG4gICAgX2tleTogY3JlYXRlSGFzaCh1c2VybmFtZSwgbnVsbCksXG4gICAgYWRkZWQ6IERhdGUubm93KCksXG4gICAgZW1haWw6IGZvcm1hdEVtYWlsLFxuICAgIG1vZGlmaWVkOiBEYXRlLm5vdygpLFxuICAgIHBhc3N3b3JkOiBlbmNyeXB0ZWRQYXNzd29yZCxcbiAgICBwaG9uZTogZm9ybWF0UGhvbmUsXG4gICAgc2FsdCxcbiAgICB1c2VybmFtZTogZm9ybWF0VXNlcm5hbWUsXG4gICAgdXNlckFjY2VzczogMSxcbiAgICB2ZXJpZmllZEVtYWlsOiBmYWxzZSxcbiAgICB2ZXJpZmllZEVtYWlsQ29kZSxcbiAgICB2ZXJpZmllZFBob25lOiBmYWxzZSxcbiAgICB2ZXJpZmllZFBob25lQ29kZVxuICB9O1xuXG4gIGNvbnN0IGluc2VydFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBJTlNFUlQgJHtpbnNlcnR9IElOIHVzZXJzIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiBhd2FpdCBkYXRhYmFzZS5xdWVyeShpbnNlcnRRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3VzZXJuYW1lfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVVc2VyID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXI6IFVzZXJUeXBlKTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAndXBkYXRlVXNlcic7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbn0gPSBjb250ZXh0O1xuICBjb25zdCB7X2tleSwgX2lkLCBpZCwgdGFncyA9IFtdLCB1c2VySWQsIC4uLnVwZGF0ZWR9ID0gcGFyc2VVc2VyKHVzZXIpO1xuXG4gIGlmKCFpc0FkbWluVXNlcihzZXNzaW9uKSAmJiAoc2Vzc2lvbj8udXNlcklkICE9PSB1c2VySWQpKSB7XG4gICAgcmV0dXJuIGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3Nlc3Npb259LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU5WQUxJRF9TRVNTSU9OXG4gICAgfSwgY29udGV4dCk7XG4gIH1cblxuICBjb25zdCB1c2VyUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYExFVCB1ID0gRE9DVU1FTlQoJHtpZH0pXG4gICAgVVBEQVRFIHUgV0lUSCAke3VwZGF0ZWR9IElOIHVzZXJzXG4gICAgUkVUVVJOIE5FV2A7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB1cGRhdGVkVXNlciA9IGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KHVzZXJRdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcbiAgICBjb25zdCB0YWdDb2xsZWN0aW9uOiBFZGdlQ29sbGVjdGlvbiA9IGRhdGFiYXNlLmNvbGxlY3Rpb24oJ2lzVGFnZ2VkJyk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbCh0YWdzLm1hcCgoe2lkOiB0YWdEb2NJZCwgbmFtZX0pID0+IHtcbiAgICAgIGNvbnN0IHRhZ1F1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgaXQgSU4gaXNUYWdnZWRcbiAgICAgICAgRklMVEVSIGl0Ll9mcm9tID09ICR7dGFnRG9jSWR9ICYmIGl0Ll90byA9PSAke2lkfSAmJiBpdC5uYW1lID09ICR7bmFtZX1cbiAgICAgICAgTElNSVQgMVxuICAgICAgICBSRVRVUk4gaXRgO1xuXG4gICAgICByZXR1cm4gZGF0YWJhc2UucXVlcnkodGFnUXVlcnkpXG4gICAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAudGhlbigodGFnRWRnZSkgPT4ge1xuICAgICAgICAgIGlmKCEhdGFnRWRnZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRhZ0VkZ2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZWRnZSA9IHtcbiAgICAgICAgICAgIF9mcm9tOiB0YWdEb2NJZCxcbiAgICAgICAgICAgIF9rZXk6IGNyZWF0ZUhhc2goYGlzVGFnZ2VkLSR7dGFnRG9jSWR9LSR7aWR9YCksXG4gICAgICAgICAgICBfdG86IGlkLFxuICAgICAgICAgICAgYWRkZWQ6IERhdGUubm93KCksXG4gICAgICAgICAgICBuYW1lXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHJldHVybiB0YWdDb2xsZWN0aW9uLnNhdmUoZWRnZSwge3JldHVybk5ldzogdHJ1ZX0pLnRoZW4oKCkgPT4gZWRnZSk7XG4gICAgICAgIH0pO1xuICAgIH0pKTtcblxuICAgIHJldHVybiB1cGRhdGVkVXNlcjtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHJldHVybiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3VzZXJ9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBjb25maXJtQ29kZSA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCB7Y29kZSwgdHlwZX0pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3Qge2RhdGFiYXNlLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHVzZXJEb2NJZCA9IGdldERvY0lkKCd1c2VycycsIHt1c2VySWQ6IHNlc3Npb25JZH0pO1xuICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgTEVUIHUgPSBET0NVTUVOVCgke3VzZXJEb2NJZH0pIFJFVFVSTiB1YDtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBkYXRhYmFzZS5xdWVyeShhcWxRdWVyeSlcbiAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAudGhlbigoe3ZlcmlmaWVkRW1haWxDb2RlLCB2ZXJpZmllZFBob25lQ29kZX06IFVzZXJUeXBlKSA9PiB7XG4gICAgICAgIHN3aXRjaCh0eXBlKSB7XG4gICAgICAgICAgY2FzZSAnZW1haWwnOlxuICAgICAgICAgICAgcmV0dXJuIGNvZGUgPT09IHZlcmlmaWVkRW1haWxDb2RlO1xuICAgICAgICAgIGNhc2UgJ3Bob25lJzpcbiAgICAgICAgICAgIHJldHVybiBjb2RlID09PSB2ZXJpZmllZFBob25lQ29kZTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZVVzZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcjogVXNlclR5cGUpOiBQcm9taXNlPGFueT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZGVsZXRlVXNlcic7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuICBjb25zdCB7dXNlcklkfSA9IHBhcnNlVXNlcih1c2VyKTtcblxuICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgRk9SIHUgSU4gdXNlcnNcbiAgICBGSUxURVIgdS5fa2V5ID09ICR7dXNlcklkfVxuICAgIExJTUlUIDFcbiAgICBSRU1PVkUgdSBJTiB1c2Vyc1xuICAgIFJFVFVSTiBPTERgO1xuXG4gIGNvbnN0IHN0cmlwZUNsaWVudCA9IG5ldyBTdHJpcGUoQ29uZmlnLmdldCgnc3RyaXBlLnRva2VuJyksIHthcGlWZXJzaW9uOiBTVFJJUEVfQVBJX1ZFUlNJT04sIHR5cGVzY3JpcHQ6IHRydWV9KTtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKGRlbGV0ZWRVc2VyKSA9PiBzdHJpcGVDbGllbnQuY3VzdG9tZXJzLmRlbChkZWxldGVkVXNlcj8uc3RyaXBlQ3VzdG9tZXJJZClcbiAgICAgIC50aGVuKCgpID0+IHN0cmlwZUNsaWVudC5hY2NvdW50cy5kZWwoZGVsZXRlZFVzZXI/LnN0cmlwZUFjY291bnRJZCkpXG4gICAgICAudGhlbigoKSA9PiBkZWxldGVkVXNlcikpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7dXNlcklkfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlYWN0aXZhdGVVc2VyID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXI6IFVzZXJUeXBlKTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZGVsZXRlJztcbiAgY29uc3Qge2RhdGFiYXNlfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHt1c2VySWR9ID0gcGFyc2VVc2VyKHVzZXIpO1xuICBjb25zdCB1cGRhdGVkOiBVc2VyVHlwZSA9IHtcbiAgICB1c2VyQWNjZXNzOiAwXG4gIH07XG4gIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBVUERBVEUgJHt1c2VySWR9IFdJVEggJHt1cGRhdGVkfSBJTiB1c2VycyBMSU1JVCAxIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VySWR9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvcixjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGlzcGxheU5hbWUgPSAodXNlcjogVXNlclR5cGUpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB7Zmlyc3QsIGxhc3QsIG5hbWUgPSAnJywgdXNlcm5hbWUgPSAnJ30gPSB1c2VyO1xuICBjb25zdCBmdWxsbmFtZSA9IChbZmlyc3QsIGxhc3RdKS5qb2luKCcgJykudHJpbSgpO1xuXG4gIGlmKG5hbWUpIHtcbiAgICByZXR1cm4gbmFtZTtcbiAgfSBlbHNlIGlmKGZ1bGxuYW1lICE9PSAnJykge1xuICAgIHJldHVybiBmdWxsbmFtZTtcbiAgfSBlbHNlIGlmKHVzZXJuYW1lKSB7XG4gICAgcmV0dXJuIHVzZXJuYW1lO1xuICB9XG5cbiAgcmV0dXJuICdVbmtub3duJztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTZXNzaW9uVXNlciA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0U2Vzc2lvblVzZXInO1xuICBjb25zdCB7ZGF0YWJhc2UsIGZpZWxkcywgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkLCB1c2VybmFtZX19ID0gY29udGV4dDtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0VXNlck9wdGlvbmFsKGZpZWxkcyk7XG5cbiAgY29uc3QgYXFsUXVlcnk6IHN0cmluZyA9IGBMRVQgdSA9IERPQ1VNRU5UKFwidXNlcnMvJHtzZXNzaW9uSWR9XCIpXG4gICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgUkVUVVJOIE1FUkdFKHUsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3VzZXJuYW1lLCB1c2VySWQ6IHNlc3Npb25JZH0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlciA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB1c2VyOiBVc2VyVHlwZSk6IFByb21pc2U8VXNlclR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFVzZXInO1xuICBjb25zdCB7dXNlcklkfSA9IHBhcnNlVXNlcih1c2VyKTtcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0VXNlck9wdGlvbmFsKGZpZWxkcyk7XG5cbiAgY29uc3QgYXFsUXVlcnk6IHN0cmluZyA9IGBMRVQgdSA9IERPQ1VNRU5UKFwidXNlcnMvJHt1c2VySWR9XCIpXG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgIEZJTFRFUiB1LnVzZXJBY2Nlc3MgPiAwXG4gICAgUkVUVVJOIE1FUkdFKHUsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKCh1c2VyKSA9PiB1c2VyKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3VzZXJJZH0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlcnMgPSAoY29udGV4dDogQXBpQ29udGV4dCwgb3B0aW9ucz86IFVzZXJPcHRpb25zKTogUHJvbWlzZTxVc2VyVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRVc2VyTGlzdCc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsaW1pdCwgdXNlcm5hbWV9ID0gcGFyc2VVc2VyT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0VXNlck9wdGlvbmFsKGZpZWxkcyk7XG4gIGNvbnN0IGZpbHRlckJ5OiBzdHJpbmdbXSA9IFsndS51c2VyQWNjZXNzID4gMCddO1xuXG4gIGlmKHVzZXJuYW1lKSB7XG4gICAgZmlsdGVyQnkucHVzaChgQ09OVEFJTlModS51c2VybmFtZSwgXCIke3BhcnNlVXNlcm5hbWUodXNlcm5hbWUpfVwiKWApO1xuICB9XG5cbiAgY29uc3QgYXFsUXVlcnk6IHN0cmluZyA9IGBGT1IgdSBJTiB1c2Vyc1xuICAgIEZJTFRFUiAke2ZpbHRlckJ5LmpvaW4oJyAmJiAnKX1cbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgJHtsaW1pdC5hcWx9XG4gICAgU09SVCB1LnVzZXJuYW1lXG4gICAgUkVUVVJOIE1FUkdFKHUsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJzQnlSZWFjdGlvbnMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtyZWFjdGlvbnMgPSBbXSwgdXNlcm5hbWV9OiBhbnksXG4gIG9wdGlvbnM/OiBVc2VyT3B0aW9uc1xuKTogUHJvbWlzZTxVc2VyVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRVc2Vyc0J5UmVhY3Rpb25zJztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0UmVhY3Rpb25zOiBzdHJpbmdbXSA9ICByZWFjdGlvbnMubWFwKChyZWFjdGlvbk5hbWU6IHN0cmluZykgPT4gcGFyc2VDaGFyKHJlYWN0aW9uTmFtZSwgMzIpLnRvTG93ZXJDYXNlKCkpO1xuICBjb25zdCB7bGltaXR9ID0gcGFyc2VVc2VyT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0VXNlck9wdGlvbmFsKGZpZWxkcyk7XG4gIGNvbnN0IGZvcm1hdFNlc3Npb25JZDogc3RyaW5nID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG4gIGNvbnN0IGZvcm1hdFVzZXJuYW1lOiBzdHJpbmcgPSBwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKTtcbiAgY29uc3QgZmlsdGVyQnk6IHN0cmluZ1tdID0gW2BQT1NJVElPTigke0pTT04uc3RyaW5naWZ5KGZvcm1hdFJlYWN0aW9ucyl9LCBMT1dFUihyLm5hbWUpKWBdO1xuXG4gIGlmKHVzZXJuYW1lKSB7XG4gICAgZmlsdGVyQnkucHVzaChgQ09OVEFJTlModS51c2VybmFtZSwgXCIke2Zvcm1hdFVzZXJuYW1lfVwiKWApO1xuICB9XG5cbiAgY29uc3QgYXFsUXVlcnk6IHN0cmluZyA9IGBGT1IgdSwgciBJTiBPVVRCT1VORCBcIiR7Zm9ybWF0U2Vzc2lvbklkfVwiIGhhc1JlYWN0aW9uXG4gICAgT1BUSU9OUyB7dmVydGV4Q29sbGVjdGlvbnM6IFwidXNlcnNcIn1cbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgRklMVEVSICR7ZmlsdGVyQnkuam9pbignICYmICcpfVxuICAgICR7bGltaXQuYXFsfVxuICAgIFJFVFVSTiBNRVJHRSh1LCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2Vyc0J5VGFncyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAge3RhZ3MsIHVzZXJuYW1lfTogYW55LFxuICBvcHRpb25zPzogVXNlck9wdGlvbnNcbik6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0VXNlcnNCeVRhZ3MnO1xuICBjb25zdCB7ZGF0YWJhc2UsIGZpZWxkcywgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRUYWdzOiBzdHJpbmdbXSA9ICB0YWdzPy5yZWR1Y2UoKGxpc3Q6IHN0cmluZ1tdLCB0YWdOYW1lOiBzdHJpbmcpID0+IHtcbiAgICBpZih0YWdOYW1lKSB7XG4gICAgICBsaXN0LnB1c2gocGFyc2VDaGFyKHRhZ05hbWUsIDMyKS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlzdDtcbiAgfSwgW10pO1xuICBjb25zdCB7bGltaXR9ID0gcGFyc2VVc2VyT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0VXNlck9wdGlvbmFsKGZpZWxkcyk7XG4gIGNvbnN0IGZvcm1hdFVzZXJuYW1lOiBzdHJpbmcgPSBwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKTtcbiAgY29uc3QgZmlsdGVyQnk6IHN0cmluZ1tdID0gW2B1Ll9rZXkgIT0gXCIke3Nlc3Npb25JZH1cImBdO1xuXG4gIGlmKHVzZXJuYW1lKSB7XG4gICAgZmlsdGVyQnkucHVzaChgQ09OVEFJTlModS51c2VybmFtZSwgXCIke2Zvcm1hdFVzZXJuYW1lfVwiKWApO1xuICB9XG5cbiAgY29uc3QgYXFsUXVlcnk6IHN0cmluZyA9IGBGT1IgdCBJTiB0YWdzXG4gICAgRklMVEVSIFBPU0lUSU9OKCR7SlNPTi5zdHJpbmdpZnkoZm9ybWF0VGFncyl9LCBMT1dFUih0Lm5hbWUpKVxuICAgIEZPUiB1LCBpdCBJTiBPVVRCT1VORCB0IGlzVGFnZ2VkXG4gICAgT1BUSU9OUyB7YmZzOiB0cnVlLCB1bmlxdWVWZXJ0aWNlczogXCJnbG9iYWxcIiwgdmVydGV4Q29sbGVjdGlvbnM6IFwidXNlcnNcIn1cbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgRklMVEVSICR7ZmlsdGVyQnkuam9pbignICYmICcpfVxuICAgICR7bGltaXQuYXFsfVxuICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRSh1LCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2Vyc0J5TGF0ZXN0ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHt1c2VybmFtZX06IGFueSwgb3B0aW9ucz86IFVzZXJPcHRpb25zKTogUHJvbWlzZTxVc2VyVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRVc2Vyc0J5TGF0ZXN0JztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsaW1pdH0gPSBwYXJzZVVzZXJPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCBmaWx0ZXIgPSBbJ3UuX2lkICE9IHNlc3Npb24uX2lkJ107XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFVzZXJPcHRpb25hbChmaWVsZHMpO1xuXG4gIGlmKHVzZXJuYW1lKSB7XG4gICAgZmlsdGVyLnB1c2goYENPTlRBSU5TKHUudXNlcm5hbWUsIFwiJHtwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKX1cIilgKTtcbiAgfVxuXG4gIC8vIEdldCBkYXRhIGZyb20gZGF0YWJhc2VcbiAgY29uc3QgYXFsUXVlcnk6IHN0cmluZyA9IGBGT1IgdSBJTiB1c2Vyc1xuICAgIExFVCBzZXNzaW9uID0gRE9DVU1FTlQoXCJ1c2Vycy8ke3VzZXJJZH1cIilcbiAgICBGSUxURVIgJHtmaWx0ZXIuam9pbignICYmICcpfVxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICBMRVQgZGlzdGFuY2UgPSBESVNUQU5DRSh1LmxhdGl0dWRlIHx8IDAsIHUubG9uZ2l0dWRlIHx8IDAsIHNlc3Npb24ubGF0aXR1ZGUgfHwgMCwgc2Vzc2lvbi5sb25naXR1ZGUgfHwgMClcbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIGRpc3RhbmNlIEFTQywgdS5hZGRlZCBERVNDXG4gICAgUkVUVVJOIE1FUkdFKHUsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlZnJlc2hTZXNzaW9uID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIHtleHBpcmVzLCB0b2tlbn0pOiBQcm9taXNlPFNlc3Npb25Ub2tlbiB8IFNlc3Npb25FcnJvcj4gPT4ge1xuICBjb25zdCB7dXNlcklkLCB1c2VybmFtZSwgdXNlckFjY2Vzc30gPSBnZXRTZXNzaW9uKHRva2VuKTtcblxuICByZXR1cm4gY3JlYXRlVG9rZW4odXNlcklkLCB1c2VybmFtZSwgdXNlckFjY2VzcywgZXhwaXJlcyk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2lnbkluID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIGFyZ3MpOiBQcm9taXNlPFNlc3Npb25Ub2tlbj4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnc2lnbkluJztcbiAgY29uc3Qge2RhdGFiYXNlfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtlbWFpbCwgZXhwaXJlcywgcGFzc3dvcmQsIHVzZXJuYW1lfSA9IGFyZ3M7XG4gIGNvbnN0IGZvcm1hdEVtYWlsOiBzdHJpbmcgPSBwYXJzZUVtYWlsKGVtYWlsKTtcbiAgY29uc3QgZm9ybWF0VXNlcm5hbWU6IHN0cmluZyA9IHBhcnNlVXNlcm5hbWUodXNlcm5hbWUpO1xuICBjb25zdCBmb3JtYXRQYXNzd29yZDogc3RyaW5nID0gcGFyc2VQYXNzd29yZChwYXNzd29yZCk7XG4gIGNvbnN0IGZvcm1hdEV4cGlyZXM6IG51bWJlciA9IHBhcnNlTnVtKGV4cGlyZXMpIHx8IDE1O1xuXG4gIGlmKCghZm9ybWF0VXNlcm5hbWUgJiYgIWZvcm1hdEVtYWlsKSB8fCAhZm9ybWF0UGFzc3dvcmQpIHtcbiAgICByZXR1cm4gbG9nRXhjZXB0aW9uKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7dXNlcm5hbWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU5WQUxJRF9BUkdVTUVOVFNcbiAgICB9LCBjb250ZXh0KTtcbiAgfVxuXG4gIGNvbnN0IGZpbHRlcnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYoZm9ybWF0RW1haWwpIHtcbiAgICBmaWx0ZXJzLnB1c2goYHUuZW1haWwgPT0gXCIke2Zvcm1hdEVtYWlsfVwiYCk7XG4gIH0gZWxzZSBpZihmb3JtYXRVc2VybmFtZSkge1xuICAgIGZpbHRlcnMucHVzaChgdS51c2VybmFtZSA9PSBcIiR7Zm9ybWF0VXNlcm5hbWV9XCJgKTtcbiAgfVxuXG4gIGNvbnN0IGNoZWNrUXVlcnk6IHN0cmluZyA9IGBGT1IgdSBJTiB1c2Vyc1xuICAgIEZJTFRFUiAke2ZpbHRlcnMuam9pbignIHx8ICcpfVxuICAgIExJTUlUIDFcbiAgICBSRVRVUk4gdWA7XG5cbiAgbGV0IGNoZWNrVXNlcjogVXNlclR5cGU7XG5cbiAgdHJ5IHtcbiAgICBjaGVja1VzZXIgPSBhd2FpdCBkYXRhYmFzZS5xdWVyeShjaGVja1F1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgcmV0dXJuIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7dXNlcm5hbWU6IGZvcm1hdFVzZXJuYW1lfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICB9XG5cbiAgaWYoIWNoZWNrVXNlcikge1xuICAgIHJldHVybiBsb2dFeGNlcHRpb24oe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTlZBTElEX0FVVEhFTlRJQ0FUSU9OXG4gICAgfSwgY29udGV4dCk7XG4gIH1cblxuICBjb25zdCB7X2tleTogdXNlcklkLCBwYXNzd29yZDogdmFsaWRQYXNzd29yZCwgc2FsdCwgdXNlckFjY2Vzc30gPSBjaGVja1VzZXI7XG4gIGNvbnN0IGF1dGhQYXNzd29yZDogc3RyaW5nID0gY3JlYXRlUGFzc3dvcmQoZm9ybWF0UGFzc3dvcmQsIHNhbHQpO1xuXG4gIGlmKHZhbGlkUGFzc3dvcmQgIT09IGF1dGhQYXNzd29yZCkge1xuICAgIHJldHVybiBsb2dFeGNlcHRpb24oe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VyQWNjZXNzLCB1c2VySWQsIHVzZXJuYW1lfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklOVkFMSURfQVVUSEVOVElDQVRJT05cbiAgICB9LCBjb250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVUb2tlbih1c2VySWQsIHVzZXJuYW1lLCB1c2VyQWNjZXNzLCBmb3JtYXRFeHBpcmVzKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzaWduT3V0ID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ3NpZ25PdXQnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZCwgdXNlcm5hbWV9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHVzZXJEb2NJZDogc3RyaW5nID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG5cbiAgY29uc3QgdXBkYXRlID0ge1xuICAgIGxhc3RPbmxpbmU6IERhdGUubm93KCksXG4gICAgc2Vzc2lvbklkOiBudWxsXG4gIH07XG4gIGNvbnN0IHNlc3Npb25RdWVyeTogQXFsUXVlcnkgPSBhcWxgTEVUIHUgPSBET0NVTUVOVCgke3VzZXJEb2NJZH0pXG4gICAgVVBEQVRFIHUgV0lUSCAke3VwZGF0ZX0gSU4gdXNlcnNcbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIE5FV2A7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBkYXRhYmFzZS5xdWVyeShzZXNzaW9uUXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBhd2FpdCBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3VzZXJuYW1lLCB1c2VySWQ6IHNlc3Npb25JZH0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFjdGl2ZVVzZXJDb3VudCA9IChjb250ZXh0OiBBcGlDb250ZXh0KSA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRBY3RpdmVVc2VyQ291bnQnO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3QgY291bnRRdWVyeTogQXFsUXVlcnkgPSBhcWxgTEVUIGRvY3MgPSAoXG4gICAgRk9SIHUgSU4gdXNlcnNcbiAgICBGSUxURVIgdS5hY3RpdmUgPT0gdHJ1ZVxuICAgIFJFVFVSTiB1XG4gIClcbiAgUkVUVVJOIExFTkdUSChkb2NzKWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGNvdW50UXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2VyQnlUb2tlbiA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB0b2tlbjogc3RyaW5nKTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0VXNlckJ5VG9rZW4nO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3Qge3VzZXJJZH0gPSBnZXRTZXNzaW9uKHRva2VuKTtcbiAgY29uc3QgdXNlckRvY0lkID0gZ2V0RG9jSWQoJ3VzZXJzJywge3VzZXJJZH0pO1xuICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgTEVUIHUgPSBET0NVTUVOVChcIiR7dXNlckRvY0lkfVwiKSBSRVRVUk4gdWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3VzZXJJZH0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtB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QUFBQSxJQUNwQixHQUFHLE9BQU87QUFBQSxFQUNaO0FBRUEsU0FBTyxZQUFZLFFBQVEsVUFBVSxZQUFZLGFBQWE7QUFDaEU7QUFFTyxNQUFNLFVBQVUsT0FBTyxZQUEwQztBQUN0RSxRQUFNLFNBQVM7QUFDZixRQUFNLEVBQUMsVUFBVSxTQUFTLEVBQUMsUUFBUSxXQUFXLFNBQVEsRUFBQyxJQUFJO0FBQzNELFFBQU0sWUFBb0IsU0FBUyxTQUFTO0FBRTVDLFFBQU0sU0FBUztBQUFBLElBQ2IsWUFBWSxLQUFLLElBQUk7QUFBQSxJQUNyQixXQUFXO0FBQUEsRUFDYjtBQUNBLFFBQU0sZUFBeUIsdUNBQXVCLFNBQVM7QUFBQSxvQkFDN0MsTUFBTTtBQUFBO0FBQUE7QUFJeEIsTUFBSTtBQUNGLFVBQU0sU0FBUyxNQUFNLFlBQVksRUFBRSxLQUFLLENBQUMsV0FBVyxPQUFPLEtBQUssQ0FBQztBQUFBLEVBQ25FLFNBQVEsT0FBTztBQUNiLGNBQU0sZ0NBQVM7QUFBQSxNQUNiO0FBQUEsTUFDQSxVQUFVO0FBQUEsTUFDVixRQUFRLEVBQUMsVUFBVSxRQUFRLFVBQVM7QUFBQSxNQUNwQyxPQUFPLHdCQUFXO0FBQUEsSUFDcEIsR0FBRyxPQUFPLE9BQU87QUFBQSxFQUNuQjtBQUVBLFNBQU87QUFDVDtBQUVPLE1BQU0scUJBQXFCLENBQUMsWUFBd0I7QUFDekQsUUFBTSxTQUFTO0FBQ2YsUUFBTSxFQUFDLFNBQVEsSUFBSTtBQUNuQixRQUFNLGFBQXVCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU83QixTQUFPLFNBQVMsTUFBTSxVQUFVLEVBQzdCLEtBQUssQ0FBQyxXQUFXLE9BQU8sS0FBSyxDQUFDLEVBQzlCLE1BQU0sQ0FBQyxjQUFVLGdDQUFTO0FBQUEsSUFDekI7QUFBQSxJQUNBLFVBQVU7QUFBQSxJQUNWLE9BQU8sd0JBQVc7QUFBQSxFQUNwQixHQUFHLE9BQU8sT0FBTyxDQUFDO0FBQ3RCO0FBRU8sTUFBTSxpQkFBaUIsQ0FBQyxTQUFxQixVQUFxQztBQUN2RixRQUFNLFNBQVM7QUFDZixRQUFNLEVBQUMsU0FBUSxJQUFJO0FBQ25CLFFBQU0sRUFBQyxPQUFNLFFBQUksMkJBQVcsS0FBSztBQUNqQyxRQUFNLGdCQUFZLCtCQUFTLFNBQVMsRUFBQyxPQUFNLENBQUM7QUFDNUMsUUFBTSxXQUFxQix3Q0FBd0IsU0FBUztBQUU1RCxTQUFPLFNBQVMsTUFBTSxRQUFRLEVBQzNCLEtBQUssQ0FBQyxXQUF3QixPQUFPLEtBQUssQ0FBQyxFQUMzQyxNQUFNLENBQUMsY0FBaUIsZ0NBQVM7QUFBQSxJQUNoQztBQUFBLElBQ0EsVUFBVTtBQUFBLElBQ1YsUUFBUSxFQUFDLE9BQU07QUFBQSxJQUNmLE9BQU8sd0JBQVc7QUFBQSxFQUNwQixHQUFHLE9BQU8sT0FBTyxDQUFDO0FBQ3RCOyIsCiAgIm5hbWVzIjogWyJVc2VyQWNjZXNzIiwgIlN0cmlwZSIsICJ1c2VyIl0KfQo=
83
+ RETURN LENGTH(docs)`;return g(s).query(i).then(n=>n.next()).catch(n=>I({action:o,category:E,value:d.DATABASE_ERROR},n,e))},Be=(e,o)=>{const s="getUserByToken",{databaseName:i}=e,{userId:n}=_(o),t=j("users",{userId:n}),u=U`LET u = DOCUMENT("${t}") RETURN u`;return g(i).query(u).then(r=>r.next()).catch(r=>I({action:s,category:E,params:{userId:n},value:d.DATABASE_ERROR},r,e))};export{ae as UserAccess,Ue as addUser,$e as confirmCode,B as createToken,Se as deactivateUser,Ce as deleteUser,he as forgotPassword,_e as getActiveUserCount,qe as getDisplayName,De as getSessionUser,be as getUser,Be as getUserByToken,$ as getUserOptional,we as getUsers,Le as getUsersByConnection,ve as getUsersByLatest,Pe as getUsersByReactions,xe as getUsersByTags,b as parseUserOptions,je as refreshSession,Oe as resetPassword,Me as signIn,Qe as signOut,Ne as updateUser};
84
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvdXNlcnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge1xuICBjcmVhdGVIYXNoLFxuICBjcmVhdGVQYXNzd29yZCxcbiAgcGFyc2VBcmFuZ29JZCxcbiAgcGFyc2VDaGFyLFxuICBwYXJzZUVtYWlsLFxuICBwYXJzZU51bSxcbiAgcGFyc2VQYXNzd29yZCxcbiAgcGFyc2VQaG9uZSxcbiAgcGFyc2VVc2VybmFtZVxufSBmcm9tICdAbmxhYnMvdXRpbHMnO1xuaW1wb3J0IHthcWx9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQge0RhdGVUaW1lfSBmcm9tICdsdXhvbic7XG5pbXBvcnQgU3RyaXBlIGZyb20gJ3N0cmlwZSc7XG5cbmltcG9ydCB7cGFyc2VVc2VyfSBmcm9tICcuLi9hZGFwdGVycy91c2VyQWRhcHRlcic7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7c2VuZEVtYWlsfSBmcm9tICcuL2VtYWlsJztcbmltcG9ydCB7c2VuZFNtc30gZnJvbSAnLi9zbXMnO1xuaW1wb3J0IHtFcnJvclR5cGVzLCBTZXNzaW9uRXJyb3J9IGZyb20gJy4uL3R5cGVzL2Vycm9yLnR5cGVzJztcbmltcG9ydCB7bG9nRXJyb3IsIGxvZ0V4Y2VwdGlvbn0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzVXRpbHMnO1xuaW1wb3J0IHtnZXREb2NJZCwgZ2V0TGltaXQsIHNlbGVjdFJlYWN0aW9uQ291bnRCeVR5cGUsIHVzZURifSBmcm9tICcuLi91dGlscy9hcmFuZ29kYlV0aWxzJztcbmltcG9ydCB7ZGV0ZWN0TGFuZ3VhZ2V9IGZyb20gJy4uL3V0aWxzL2xhbmd1YWdlRGV0ZWN0aW9uJztcbmltcG9ydCB7Z2V0U2Vzc2lvbiwgU2Vzc2lvblRva2VuLCBzZXRTZXNzaW9ufSBmcm9tICcuLi91dGlscy9zZXNzaW9uVXRpbHMnO1xuXG5pbXBvcnQgdHlwZSB7QXBpQ29udGV4dH0gZnJvbSAnLi4vdHlwZXMvYXV0aC50eXBlcyc7XG5pbXBvcnQgdHlwZSB7VXNlcklucHV0LCBVc2VyVHlwZX0gZnJvbSAnLi4vdHlwZXMvdXNlcnMudHlwZXMnO1xuaW1wb3J0IHR5cGUge0VkZ2VDb2xsZWN0aW9ufSBmcm9tICdhcmFuZ29qcy9jb2xsZWN0aW9ucyc7XG5cblxuY29uc3QgZXZlbnRDYXRlZ29yeSA9ICd1c2Vycyc7XG5jb25zdCBTVFJJUEVfQVBJX1ZFUlNJT04gPSAnMjAyNS0wNS0yOC5iYXNpbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlck9wdGlvbnMge1xuICByZWFkb25seSBmcm9tPzogbnVtYmVyO1xuICByZWFkb25seSB0bz86IG51bWJlcjtcbiAgcmVhZG9ubHkgdXNlcm5hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBlbnVtIFVzZXJBY2Nlc3Mge1xuICBERUFDVElWQVRFRCA9IDAsXG4gIEFDVElWRSA9IDEsXG4gIFBSRU1JVU0gPSAyLFxuICBDT05URU5UX0FETUlOID0gMyxcbiAgQURNSU4gPSA0XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVUb2tlbiA9IChcbiAgdXNlcklkOiBzdHJpbmcsXG4gIHVzZXJuYW1lOiBzdHJpbmcsXG4gIHVzZXJBY2Nlc3M6IG51bWJlcixcbiAgZXhwaXJlc0luTWludXRlczogbnVtYmVyID0gMTVcbik6IFNlc3Npb25Ub2tlbiA9PiB7XG4gIGNvbnN0IG5vdzogRGF0ZVRpbWUgPSBEYXRlVGltZS5sb2NhbCgpO1xuICBjb25zdCBzZXNzaW9uRXhwaXJlczogRGF0ZVRpbWUgPSBub3cucGx1cyh7bWludXRlczogZXhwaXJlc0luTWludXRlc30pO1xuICBjb25zdCBpYXQ6IG51bWJlciA9IE1hdGguZmxvb3Iobm93LnRvU2Vjb25kcygpKTtcbiAgY29uc3QgZXhwOiBudW1iZXIgPSBNYXRoLmZsb29yKHNlc3Npb25FeHBpcmVzLnRvU2Vjb25kcygpKTtcbiAgY29uc3QgdG9rZW4gPSBzZXRTZXNzaW9uKHtcbiAgICBleHAsXG4gICAgaWF0LFxuICAgIHVzZXJBY2Nlc3MsXG4gICAgdXNlcklkLFxuICAgIHVzZXJuYW1lXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgZXhwaXJlczogc2Vzc2lvbkV4cGlyZXMudG9NaWxsaXMoKSxcbiAgICBpc3N1ZWQ6IG5vdy50b01pbGxpcygpLFxuICAgIHRva2VuLFxuICAgIHVzZXJJZCxcbiAgICB1c2VybmFtZVxuICB9O1xufTtcblxuaW50ZXJmYWNlIFNlbGVjdEFjY3VtdWxhdG9yIHtcbiAgb2JqZWN0czogc3RyaW5nW107XG4gIHF1ZXJpZXM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0VXNlck9wdGlvbmFsID0gKGZpZWxkczogc3RyaW5nW10gPSBbXSk6IFNlbGVjdEFjY3VtdWxhdG9yID0+XG4gIGZpZWxkcy5yZWR1Y2UoKHNlbGVjdHM6IFNlbGVjdEFjY3VtdWxhdG9yLCBmaWVsZDogc3RyaW5nKSA9PiB7XG4gICAgaWYoZmllbGQuaW5jbHVkZXMoJ0NvdW50JykpIHtcbiAgICAgIHJldHVybiBzZWxlY3RSZWFjdGlvbkNvdW50QnlUeXBlKCd1c2VycycsICd1JywgZmllbGQsIHNlbGVjdHMpO1xuICAgIH1cblxuICAgIHJldHVybiBzZWxlY3RzO1xuICB9LCB7b2JqZWN0czogW10sIHF1ZXJpZXM6IFtdfSk7XG5cbmV4cG9ydCBjb25zdCBwYXJzZVVzZXJPcHRpb25zID0gKG9wdGlvbnM6IFVzZXJPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGZyb20gPSAwLFxuICAgIHRvID0gMzBcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGxpbWl0ID0gZ2V0TGltaXQoZnJvbSwgdG8pO1xuXG4gIHJldHVybiB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBsaW1pdFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZFVzZXIgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcjogVXNlcklucHV0KTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnYWRkVXNlcic7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIGxhbmd1YWdlQ29udGV4dH0gPSBjb250ZXh0O1xuICBjb25zdCB7ZW1haWwsIHBhc3N3b3JkLCBwaG9uZSwgdXNlcm5hbWUsIHVzZXJJZCwgX2tleSwgX2lkLCAuLi5pbnNlcnRVc2VyfSA9IHBhcnNlVXNlcih1c2VyKTtcbiAgY29uc3QgZm9ybWF0UGFzc3dvcmQ6IHN0cmluZyA9IHBhcnNlUGFzc3dvcmQocGFzc3dvcmQpO1xuICBjb25zdCBoYXNQYXNzd29yZCA9ICEhZm9ybWF0UGFzc3dvcmQ7XG4gIGNvbnN0IGhhc1VzZXJuYW1lID0gISF1c2VybmFtZSB8fCAhIXBob25lIHx8ICEhZW1haWw7XG5cbiAgaWYoIWhhc1Bhc3N3b3JkIHx8ICFoYXNVc2VybmFtZSkge1xuICAgIHJldHVybiBsb2dFeGNlcHRpb24oe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTlZBTElEX0FSR1VNRU5UU1xuICAgIH0sIGNvbnRleHQpO1xuICB9XG5cbiAgY29uc3QgaGFzaElkID0gdXNlcm5hbWUgfHwgcGhvbmUgfHwgZW1haWw7XG4gIGNvbnN0IHNhbHQ6IHN0cmluZyA9IGNyZWF0ZUhhc2goYCR7aGFzaElkfSR7Zm9ybWF0UGFzc3dvcmR9YCwgbnVsbCk7XG4gIGNvbnN0IGVuY3J5cHRlZFBhc3N3b3JkID0gY3JlYXRlUGFzc3dvcmQoZm9ybWF0UGFzc3dvcmQsIHNhbHQpO1xuICBjb25zdCBmaWx0ZXJzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmKHVzZXJuYW1lKSB7XG4gICAgZmlsdGVycy5wdXNoKGB1LnVzZXJuYW1lID09IFwiJHt1c2VybmFtZX1cImApO1xuICB9XG5cbiAgaWYoZW1haWwpIHtcbiAgICBmaWx0ZXJzLnB1c2goYHUuZW1haWwgPT0gXCIke2VtYWlsfVwiYCk7XG4gIH1cblxuICBpZihwaG9uZSkge1xuICAgIGZpbHRlcnMucHVzaChgdS5waG9uZSA9PSAke3Bob25lfWApO1xuICB9XG5cbiAgY29uc3QgY2hlY2tRdWVyeTogc3RyaW5nID0gYEZPUiB1IElOIHVzZXJzXG4gICAgRklMVEVSICR7ZmlsdGVycy5qb2luKCcgfHwgJyl9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiB1YDtcblxuICB0cnkge1xuICAgIGNvbnN0IGV4aXN0aW5nVXNlcnMgPSBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGNoZWNrUXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcblxuICAgIGlmKGV4aXN0aW5nVXNlcnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbG9nRXhjZXB0aW9uKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgZW1haWwsXG4gICAgICAgICAgcGhvbmUsXG4gICAgICAgICAgdXNlcm5hbWVcbiAgICAgICAgfSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuRVhJU1RJTkdfSVRFTVxuICAgICAgfSwgY29udGV4dCk7XG4gICAgfVxuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgcmV0dXJuIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7ZW1haWwsIHBob25lLCB1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgfVxuXG4gIGNvbnN0IHBob25lQ291bnRyeUNvZGUgPSBwaG9uZT8ucmVwbGFjZSgvXFxEL2csICcnKS5zdWJzdHJpbmcoMCwgMyk7XG4gIGNvbnN0IGxvY2FsZSA9IGRldGVjdExhbmd1YWdlKHtcbiAgICAuLi5sYW5ndWFnZUNvbnRleHQsXG4gICAgcGhvbmVDb3VudHJ5Q29kZSxcbiAgICB1c2VyUHJlZmVyZW5jZTogaW5zZXJ0VXNlci5sb2NhbGUgfHwgJ2VuJ1xuICB9KTtcbiAgY29uc3QgdmVyaWZpZWRFbWFpbENvZGU6IG51bWJlciA9IE1hdGguZmxvb3IoMTAwMDAwICsgKE1hdGgucmFuZG9tKCkgKiA5MDAwMDApKTtcbiAgY29uc3QgdmVyaWZpZWRTbXNDb2RlOiBudW1iZXIgPSBNYXRoLmZsb29yKDEwMDAwMCArIChNYXRoLnJhbmRvbSgpICogOTAwMDAwKSk7XG5cbiAgY29uc3QgaW5zZXJ0OiBVc2VyVHlwZSA9IHtcbiAgICAuLi5pbnNlcnRVc2VyLFxuICAgIF9rZXk6IGNyZWF0ZUhhc2godXNlcm5hbWUsIG51bGwpLFxuICAgIGFkZGVkOiBEYXRlLm5vdygpLFxuICAgIGVtYWlsLFxuICAgIGxvY2FsZSxcbiAgICBtb2RpZmllZDogRGF0ZS5ub3coKSxcbiAgICBwYXNzd29yZDogZW5jcnlwdGVkUGFzc3dvcmQsXG4gICAgcGhvbmUsXG4gICAgc2FsdCxcbiAgICB1c2VyQWNjZXNzOiAxLFxuICAgIHVzZXJuYW1lLFxuICAgIHZlcmlmaWVkRW1haWw6IGZhbHNlLFxuICAgIHZlcmlmaWVkRW1haWxDb2RlLFxuICAgIHZlcmlmaWVkUGhvbmU6IGZhbHNlLFxuICAgIHZlcmlmaWVkU21zQ29kZVxuICB9O1xuXG4gIGNvbnN0IGluc2VydFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBJTlNFUlQgJHtpbnNlcnR9IElOIHVzZXJzIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGluc2VydFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlVXNlciA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCB1c2VyOiBVc2VyVHlwZSk6IFByb21pc2U8VXNlclR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ3VwZGF0ZVVzZXInO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHVwZGF0ZWRVc2VyID0gcGFyc2VVc2VyKHVzZXIpO1xuICBjb25zdCB7X2tleSwgX2lkLCB0YWdzID0gW10sIC4uLnVwZGF0ZX0gPSB1cGRhdGVkVXNlcjtcbiAgY29uc3Qge2lkfSA9IHVwZGF0ZWRVc2VyO1xuXG4gIGNvbnN0IHVzZXJRdWVyeTogQXFsUXVlcnkgPSBhcWxgTEVUIHUgPSBET0NVTUVOVCgke2lkfSlcbiAgICBVUERBVEUgdSBXSVRIICR7dXBkYXRlfSBJTiB1c2Vyc1xuICAgIFJFVFVSTiBORVdgO1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGFiYXNlID0gdXNlRGIoZGF0YWJhc2VOYW1lKTtcbiAgICBjb25zdCB1cGRhdGVkVXNlciA9IGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KHVzZXJRdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcbiAgICBjb25zdCB0YWdDb2xsZWN0aW9uOiBFZGdlQ29sbGVjdGlvbiA9IGRhdGFiYXNlLmNvbGxlY3Rpb24oJ2lzVGFnZ2VkJyk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbCh0YWdzLm1hcCgoe2lkOiB0YWdEb2NJZCwgbmFtZX0pID0+IHtcbiAgICAgIGNvbnN0IHRhZ1F1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgaXQgSU4gaXNUYWdnZWRcbiAgICAgICAgRklMVEVSIGl0Ll9mcm9tID09ICR7dGFnRG9jSWR9ICYmIGl0Ll90byA9PSAke2lkfSAmJiBpdC5uYW1lID09ICR7bmFtZX1cbiAgICAgICAgTElNSVQgMVxuICAgICAgICBSRVRVUk4gaXRgO1xuXG4gICAgICByZXR1cm4gZGF0YWJhc2UucXVlcnkodGFnUXVlcnkpXG4gICAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAgIC50aGVuKCh0YWdFZGdlKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coe3RhZ0VkZ2V9KTtcbiAgICAgICAgICBpZighIXRhZ0VkZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiB0YWdFZGdlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGVkZ2UgPSB7XG4gICAgICAgICAgICBfZnJvbTogdGFnRG9jSWQsXG4gICAgICAgICAgICBfa2V5OiBjcmVhdGVIYXNoKGBpc1RhZ2dlZC0ke3RhZ0RvY0lkfS0ke2lkfWApLFxuICAgICAgICAgICAgX3RvOiBpZCxcbiAgICAgICAgICAgIGFkZGVkOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgbmFtZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICByZXR1cm4gdGFnQ29sbGVjdGlvbi5zYXZlKGVkZ2UsIHtyZXR1cm5OZXc6IHRydWV9KS50aGVuKCgpID0+IGVkZ2UpO1xuICAgICAgICB9KTtcbiAgICB9KSk7XG5cbiAgICByZXR1cm4gdXBkYXRlZFVzZXI7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICByZXR1cm4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VyfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZm9yZ290UGFzc3dvcmQgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwge2VtYWlsLCBwaG9uZSwgdXNlcm5hbWV9KTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdmb3Jnb3RQYXNzd29yZCc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3QgYXFsUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiB1IElOIHVzZXJzXG4gICAgRklMVEVSIHUuZW1haWwgPT0gJHtlbWFpbH0gfHwgdS5waG9uZSA9PSAke3Bob25lfSB8fCB1LnVzZXJuYW1lID09ICR7dXNlcm5hbWV9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiB1YDtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgICAgLnRoZW4oYXN5bmMgKGN1cnNvcikgPT4ge1xuICAgICAgICBjb25zdCB1c2VyID0gY3Vyc29yLm5leHQoKTtcblxuICAgICAgICBpZih1c2VyKSB7XG4gICAgICAgICAgY29uc3Qge2VtYWlsLCBwaG9uZSwgdmVyaWZpZWRFbWFpbCwgdmVyaWZpZWRQaG9uZX0gPSB1c2VyIGFzIFVzZXJUeXBlO1xuICAgICAgICAgIGNvbnN0IGNvZGVFeHBpcmVzID0gMTAwMCAqIDYwICogMTU7IC8vIDE1IG1pbnV0ZXNcbiAgICAgICAgICBjb25zdCBjb2RlID0gTWF0aC5mbG9vcigxMDAwMDAgKyAoTWF0aC5yYW5kb20oKSAqIDkwMDAwMCkpO1xuICAgICAgICAgIGNvbnN0IHVzZXJEb2NJZCA9IGdldERvY0lkKCd1c2VycycsIHVzZXIpO1xuICAgICAgICAgIGxldCB1cGRhdGU7XG5cbiAgICAgICAgICBpZihlbWFpbCAmJiB2ZXJpZmllZEVtYWlsKSB7XG4gICAgICAgICAgICBzZW5kRW1haWwoe1xuICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICB0ZXh0OiBgWW91ciBjb2RlIGlzICR7Y29kZX1gXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHVwZGF0ZSA9IHt2ZXJpZmllZEVtYWlsQ29kZTogY29kZSwgdmVyaWZpZWRFbWFpbEV4cGlyZXM6IGNvZGVFeHBpcmVzfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZihwaG9uZSAmJiB2ZXJpZmllZFBob25lKSB7XG4gICAgICAgICAgICBzZW5kU21zKHtcbiAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgdGV4dDogYFlvdXIgY29kZSBpcyAke2NvZGV9YFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB1cGRhdGUgPSB7dmVyaWZpZWRTbXNDb2RlOiBjb2RlLCB2ZXJpZmllZFBob25lRXhwaXJlczogY29kZUV4cGlyZXN9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmKHVwZGF0ZS52ZXJpZmllZEVtYWlsQ29kZSB8fCB1cGRhdGUudmVyaWZpZWRTbXNDb2RlKSB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVRdWVyeTogQXFsUXVlcnkgPSBhcWxgVVBEQVRFICR7dXNlckRvY0lkfSBXSVRIICR7dXBkYXRlfSBJTiB1c2Vyc2A7XG5cbiAgICAgICAgICAgIGF3YWl0IHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkodXBkYXRlUXVlcnkpO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7ZW1haWwsIHBob25lLCB1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHJlc2V0UGFzc3dvcmQgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtcbiAgICBjb2RlLFxuICAgIHBhc3N3b3JkLFxuICAgIHR5cGUsXG4gICAgdXNlcm5hbWVcbiAgfToge1xuICAgIGNvZGU6IG51bWJlcixcbiAgICBwYXNzd29yZDogc3RyaW5nLFxuICAgIHR5cGU6ICdwaG9uZScgfCAnZW1haWwnLFxuICAgIHVzZXJuYW1lOiBzdHJpbmdcbiAgfVxuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdyZXNldFBhc3N3b3JkJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRQYXNzd29yZDogc3RyaW5nID0gcGFyc2VQYXNzd29yZChwYXNzd29yZCk7XG4gIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgdSBJTiB1c2Vyc1xuICAgIEZJTFRFUiB1LnVzZXJuYW1lID09ICR7dXNlcm5hbWV9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiB1YDtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgICAgLnRoZW4oYXN5bmMgKGN1cnNvcikgPT4ge1xuICAgICAgICBjb25zdCB1c2VyID0gY3Vyc29yLm5leHQoKTtcblxuICAgICAgICBpZih1c2VyKSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgX2lkOiB1c2VyRG9jSWQsXG4gICAgICAgICAgICBzYWx0LFxuICAgICAgICAgICAgdmVyaWZpZWRFbWFpbENvZGUsXG4gICAgICAgICAgICB2ZXJpZmllZEVtYWlsRXhwaXJlcyxcbiAgICAgICAgICAgIHZlcmlmaWVkU21zQ29kZSxcbiAgICAgICAgICAgIHZlcmlmaWVkUGhvbmVFeHBpcmVzXG4gICAgICAgICAgfSA9IHVzZXIgYXMgVXNlclR5cGU7XG4gICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBsZXQgdXBkYXRlO1xuXG4gICAgICAgICAgc3dpdGNoKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2VtYWlsJzpcbiAgICAgICAgICAgICAgaWYoY29kZSA9PT0gdmVyaWZpZWRFbWFpbENvZGUgJiYgdmVyaWZpZWRFbWFpbEV4cGlyZXMgPiBub3cpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXNzd29yZDogc3RyaW5nID0gY3JlYXRlUGFzc3dvcmQoZm9ybWF0UGFzc3dvcmQsIHNhbHQpO1xuICAgICAgICAgICAgICAgIHVwZGF0ZSA9IHtwYXNzd29yZH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdwaG9uZSc6XG4gICAgICAgICAgICAgIGlmKGNvZGUgPT09IHZlcmlmaWVkU21zQ29kZSAmJiB2ZXJpZmllZFBob25lRXhwaXJlcyA+IG5vdykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhc3N3b3JkOiBzdHJpbmcgPSBjcmVhdGVQYXNzd29yZChmb3JtYXRQYXNzd29yZCwgc2FsdCk7XG4gICAgICAgICAgICAgICAgdXBkYXRlID0ge3Bhc3N3b3JkfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZih1cGRhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZVF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBVUERBVEUgJHt1c2VyRG9jSWR9IFdJVEggJHt1cGRhdGV9IElOIHVzZXJzYDtcblxuICAgICAgICAgICAgYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeSh1cGRhdGVRdWVyeSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGNvbmZpcm1Db2RlID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB7XG4gICAgY29kZSxcbiAgICB0eXBlXG4gIH06IHtcbiAgICBjb2RlOiBudW1iZXIsXG4gICAgdHlwZTogJ3Bob25lJyB8ICdlbWFpbCdcbiAgfVxuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdjb25maXJtQ29kZSc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgdXNlckRvY0lkID0gZ2V0RG9jSWQoJ3VzZXJzJywge3VzZXJJZDogc2Vzc2lvbklkfSk7XG4gIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBMRVQgdSA9IERPQ1VNRU5UKCR7dXNlckRvY0lkfSkgUkVUVVJOIHVgO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXVlcnkpXG4gICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgLnRoZW4oKHt2ZXJpZmllZEVtYWlsQ29kZSwgdmVyaWZpZWRTbXNDb2RlfTogVXNlclR5cGUpID0+IHtcbiAgICAgICAgc3dpdGNoKHR5cGUpIHtcbiAgICAgICAgICBjYXNlICdlbWFpbCc6XG4gICAgICAgICAgICByZXR1cm4gY29kZSA9PT0gdmVyaWZpZWRFbWFpbENvZGU7XG4gICAgICAgICAgY2FzZSAncGhvbmUnOlxuICAgICAgICAgICAgcmV0dXJuIGNvZGUgPT09IHZlcmlmaWVkU21zQ29kZTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7Y29kZSwgdHlwZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZVVzZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcjogVXNlclR5cGUpOiBQcm9taXNlPFVzZXJUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdkZWxldGVVc2VyJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCB7aWR9ID0gcGFyc2VVc2VyKHVzZXIpO1xuXG4gIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBMRVQgdSA9IERPQ1VNRU5UKCR7aWR9KVxuICAgIFJFTU9WRSB1IElOIHVzZXJzXG4gICAgUkVUVVJOIE9MRGA7XG5cbiAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gbmV3IFN0cmlwZShDb25maWcuZ2V0KCdzdHJpcGUudG9rZW4nKSwge2FwaVZlcnNpb246IFNUUklQRV9BUElfVkVSU0lPTiwgdHlwZXNjcmlwdDogdHJ1ZX0pO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKGRlbGV0ZWRVc2VyKSA9PiBzdHJpcGVDbGllbnQuY3VzdG9tZXJzLmRlbChkZWxldGVkVXNlcj8uc3RyaXBlQ3VzdG9tZXJJZClcbiAgICAgIC50aGVuKCgpID0+IHN0cmlwZUNsaWVudC5hY2NvdW50cy5kZWwoZGVsZXRlZFVzZXI/LnN0cmlwZUFjY291bnRJZCkpXG4gICAgICAudGhlbigoKSA9PiBkZWxldGVkVXNlcikpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7aWR9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvcixjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVhY3RpdmF0ZVVzZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcjogVXNlclR5cGUpOiBQcm9taXNlPFVzZXJUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdkZWxldGUnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtpZH0gPSBwYXJzZVVzZXIodXNlcik7XG4gIGNvbnN0IHVwZGF0ZWQ6IFVzZXJUeXBlID0ge1xuICAgIHVzZXJBY2Nlc3M6IDBcbiAgfTtcbiAgY29uc3QgYXFsUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQREFURSAke2lkfSBXSVRIICR7dXBkYXRlZH0gSU4gdXNlcnMgTElNSVQgMSBSRVRVUk4gTkVXYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2lkfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERpc3BsYXlOYW1lID0gKHVzZXI6IFVzZXJUeXBlKTogc3RyaW5nID0+IHtcbiAgY29uc3Qge2ZpcnN0LCBsYXN0LCBuYW1lID0gJycsIHVzZXJuYW1lID0gJyd9ID0gdXNlcjtcbiAgY29uc3QgZnVsbG5hbWUgPSAoW2ZpcnN0LCBsYXN0XSkuam9pbignICcpLnRyaW0oKTtcblxuICBpZihuYW1lKSB7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH0gZWxzZSBpZihmdWxsbmFtZSAhPT0gJycpIHtcbiAgICByZXR1cm4gZnVsbG5hbWU7XG4gIH0gZWxzZSBpZih1c2VybmFtZSkge1xuICAgIHJldHVybiB1c2VybmFtZTtcbiAgfVxuXG4gIHJldHVybiAnVW5rbm93bic7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U2Vzc2lvblVzZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCk6IFByb21pc2U8VXNlclR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFNlc3Npb25Vc2VyJztcbiAgY29uc29sZS5sb2coJ2dldFNlc3Npb25Vc2VyJywge2FjdGlvbiwgY29udGV4dH0pO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZCwgdXNlcm5hbWV9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFVzZXJPcHRpb25hbChmaWVsZHMpO1xuICBjb25zdCBmb3JtYXRTZXNzaW9uSWQgPSBwYXJzZUFyYW5nb0lkKGB1c2Vycy8ke3Nlc3Npb25JZH1gKTtcblxuICBjb25zdCBhcWxRdWVyeTogc3RyaW5nID0gYExFVCB1ID0gRE9DVU1FTlQoXCIke2Zvcm1hdFNlc3Npb25JZH1cIilcbiAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICBSRVRVUk4gTUVSR0UodSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpIGFzIHVua25vd24gYXMgVXNlclR5cGUpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgcGFyYW1zOiB7dXNlcklkOiBzZXNzaW9uSWQsIHVzZXJuYW1lfSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlciA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB1c2VyOiBVc2VyVHlwZSk6IFByb21pc2U8VXNlclR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFVzZXInO1xuICBjb25zdCB7ZW1haWwsIGlkLCBwaG9uZSwgdXNlcklkLCB1c2VybmFtZX0gPSBwYXJzZVVzZXIodXNlcik7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIGZpZWxkc30gPSBjb250ZXh0O1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRVc2VyT3B0aW9uYWwoZmllbGRzKTtcbiAgbGV0IGFxbFF1ZXJ5OiBzdHJpbmc7XG5cbiAgaWYoaWQpIHtcbiAgICBhcWxRdWVyeSA9IGBMRVQgdSA9IERPQ1VNRU5UKFwiJHtpZH1cIilcbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgRklMVEVSIHUudXNlckFjY2VzcyA+IDBcbiAgICBSRVRVUk4gTUVSR0UodSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcbiAgfSBlbHNlIGlmKHVzZXJuYW1lKSB7XG4gICAgYXFsUXVlcnkgPSBgRk9SIHUgSU4gdXNlcnNcbiAgICBGSUxURVIgdS51c2VybmFtZSA9PSBcIiR7dXNlcm5hbWV9XCJcbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgUkVUVVJOIE1FUkdFKHUsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG4gIH0gZWxzZSBpZihlbWFpbCkge1xuICAgIGFxbFF1ZXJ5ID0gYEZPUiB1IElOIHVzZXJzXG4gICAgRklMVEVSIHUuZW1haWwgPT0gXCIke2VtYWlsfVwiXG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgIFJFVFVSTiBNRVJHRSh1LCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuICB9IGVsc2UgaWYocGhvbmUpIHtcbiAgICBhcWxRdWVyeSA9IGBGT1IgdSBJTiB1c2Vyc1xuICAgIEZJTFRFUiB1LnBob25lID09IFwiJHtwaG9uZX1cIlxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICBSRVRVUk4gTUVSR0UodSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcbiAgfVxuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHVzZXIpID0+IHVzZXIpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7aWQsIHVzZXJJZCwgdXNlcm5hbWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJzID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIG9wdGlvbnM/OiBVc2VyT3B0aW9ucyk6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0VXNlckxpc3QnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB1c2VybmFtZX0gPSBwYXJzZVVzZXJPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRVc2VyT3B0aW9uYWwoZmllbGRzKTtcbiAgY29uc3QgZmlsdGVyQnk6IHN0cmluZ1tdID0gWyd1LnVzZXJBY2Nlc3MgPiAwJ107XG5cbiAgaWYodXNlcm5hbWUpIHtcbiAgICBmaWx0ZXJCeS5wdXNoKGBDT05UQUlOUyh1LnVzZXJuYW1lLCBcIiR7cGFyc2VVc2VybmFtZSh1c2VybmFtZSl9XCIpYCk7XG4gIH1cblxuICBjb25zdCBhcWxRdWVyeTogc3RyaW5nID0gYEZPUiB1IElOIHVzZXJzXG4gICAgRklMVEVSICR7ZmlsdGVyQnkuam9pbignICYmICcpfVxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIHUudXNlcm5hbWVcbiAgICBSRVRVUk4gTUVSR0UodSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBVc2VyVHlwZVtdKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG5cbiAgICAgIHJldHVybiBbXSBhcyBVc2VyVHlwZVtdO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJzQnlSZWFjdGlvbnMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtyZWFjdGlvbnMgPSBbXSwgdXNlcm5hbWV9OiB7cmVhY3Rpb25zPzogc3RyaW5nW10sIHVzZXJuYW1lPzogc3RyaW5nfSxcbiAgb3B0aW9ucz86IFVzZXJPcHRpb25zXG4pOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFVzZXJzQnlSZWFjdGlvbnMnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0UmVhY3Rpb25zOiBzdHJpbmdbXSA9ICByZWFjdGlvbnMubWFwKChyZWFjdGlvbk5hbWU6IHN0cmluZykgPT4gcGFyc2VDaGFyKHJlYWN0aW9uTmFtZSwgMzIpLnRvTG93ZXJDYXNlKCkpO1xuICBjb25zdCB7bGltaXR9ID0gcGFyc2VVc2VyT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0VXNlck9wdGlvbmFsKGZpZWxkcyk7XG4gIGNvbnN0IGZvcm1hdFNlc3Npb25JZDogc3RyaW5nID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG4gIGNvbnN0IGZvcm1hdFVzZXJuYW1lOiBzdHJpbmcgPSBwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKTtcbiAgY29uc3QgZmlsdGVyQnk6IHN0cmluZ1tdID0gW1xuICAgICd1LnVzZXJBY2Nlc3MgPiAwJyxcbiAgICBgUE9TSVRJT04oJHtKU09OLnN0cmluZ2lmeShmb3JtYXRSZWFjdGlvbnMpfSwgTE9XRVIoci5uYW1lKSlgXG4gIF07XG5cbiAgaWYodXNlcm5hbWUpIHtcbiAgICBmaWx0ZXJCeS5wdXNoKGBDT05UQUlOUyh1LnVzZXJuYW1lLCBcIiR7Zm9ybWF0VXNlcm5hbWV9XCIpYCk7XG4gIH1cblxuICBjb25zdCBhcWxRdWVyeTogc3RyaW5nID0gYEZPUiB1LCByIElOIE9VVEJPVU5EIFwiJHtmb3JtYXRTZXNzaW9uSWR9XCIgaGFzUmVhY3Rpb25cbiAgICBPUFRJT05TIHt2ZXJ0ZXhDb2xsZWN0aW9uczogXCJ1c2Vyc1wifVxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICBGSUxURVIgJHtmaWx0ZXJCeS5qb2luKCcgJiYgJyl9XG4gICAgJHtsaW1pdC5hcWx9XG4gICAgUkVUVVJOIE1FUkdFKHUsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgVXNlclR5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gW10gYXMgVXNlclR5cGVbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2Vyc0J5VGFncyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAge3RhZ3MsIHVzZXJuYW1lfSxcbiAgb3B0aW9ucz86IFVzZXJPcHRpb25zXG4pOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFVzZXJzQnlUYWdzJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdFRhZ3M6IHN0cmluZ1tdID0gIHRhZ3M/LnJlZHVjZSgobGlzdDogc3RyaW5nW10sIHRhZ05hbWU6IHN0cmluZykgPT4ge1xuICAgIGlmKHRhZ05hbWUpIHtcbiAgICAgIGxpc3QucHVzaChwYXJzZUNoYXIodGFnTmFtZSwgMzIpLnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0O1xuICB9LCBbXSk7XG4gIGNvbnN0IHtsaW1pdH0gPSBwYXJzZVVzZXJPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRVc2VyT3B0aW9uYWwoZmllbGRzKTtcbiAgY29uc3QgZm9ybWF0VXNlcm5hbWU6IHN0cmluZyA9IHBhcnNlVXNlcm5hbWUodXNlcm5hbWUpO1xuICBjb25zdCBmaWx0ZXJCeTogc3RyaW5nW10gPSBbXG4gICAgYHUuX2tleSAhPSBcIiR7c2Vzc2lvbklkfVwiYCxcbiAgICAndS51c2VyQWNjZXNzID4gMCdcbiAgXTtcblxuICBpZih1c2VybmFtZSkge1xuICAgIGZpbHRlckJ5LnB1c2goYENPTlRBSU5TKHUudXNlcm5hbWUsIFwiJHtmb3JtYXRVc2VybmFtZX1cIilgKTtcbiAgfVxuXG4gIGNvbnN0IGFxbFF1ZXJ5OiBzdHJpbmcgPSBgRk9SIHQgSU4gdGFnc1xuICAgIEZJTFRFUiBQT1NJVElPTigke0pTT04uc3RyaW5naWZ5KGZvcm1hdFRhZ3MpfSwgTE9XRVIodC5uYW1lKSlcbiAgICBGT1IgdSwgaXQgSU4gT1VUQk9VTkQgdCBpc1RhZ2dlZFxuICAgIE9QVElPTlMge2JmczogdHJ1ZSwgdW5pcXVlVmVydGljZXM6IFwiZ2xvYmFsXCIsIHZlcnRleENvbGxlY3Rpb25zOiBcInVzZXJzXCJ9XG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgIEZJTFRFUiAke2ZpbHRlckJ5LmpvaW4oJyAmJiAnKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UodSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBVc2VyVHlwZVtdKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG5cbiAgICAgIHJldHVybiBbXSBhcyBVc2VyVHlwZVtdO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJzQnlMYXRlc3QgPSAoY29udGV4dDogQXBpQ29udGV4dCwge3VzZXJuYW1lfSwgb3B0aW9ucz86IFVzZXJPcHRpb25zKTogUHJvbWlzZTxVc2VyVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRVc2Vyc0J5TGF0ZXN0JztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7bGltaXR9ID0gcGFyc2VVc2VyT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3QgZmlsdGVyID0gW1xuICAgICd1Ll9pZCAhPSBzZXNzaW9uLl9pZCcsXG4gICAgJ3UudXNlckFjY2VzcyA+IDAnXG4gIF07XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFVzZXJPcHRpb25hbChmaWVsZHMpO1xuXG4gIGlmKHVzZXJuYW1lKSB7XG4gICAgZmlsdGVyLnB1c2goYENPTlRBSU5TKHUudXNlcm5hbWUsIFwiJHtwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKX1cIilgKTtcbiAgfVxuXG4gIC8vIEdldCBkYXRhIGZyb20gZGF0YWJhc2VcbiAgY29uc3QgYXFsUXVlcnk6IHN0cmluZyA9IGBGT1IgdSBJTiB1c2Vyc1xuICAgIExFVCBzZXNzaW9uID0gRE9DVU1FTlQoXCJ1c2Vycy8ke3VzZXJJZH1cIilcbiAgICBGSUxURVIgJHtmaWx0ZXIuam9pbignICYmICcpfVxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICBMRVQgZGlzdGFuY2UgPSBESVNUQU5DRSh1LmxhdGl0dWRlIHx8IDAsIHUubG9uZ2l0dWRlIHx8IDAsIHNlc3Npb24ubGF0aXR1ZGUgfHwgMCwgc2Vzc2lvbi5sb25naXR1ZGUgfHwgMClcbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIGRpc3RhbmNlIEFTQywgdS5hZGRlZCBERVNDXG4gICAgUkVUVVJOIE1FUkdFKHUsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgVXNlclR5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gW10gYXMgVXNlclR5cGVbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2Vyc0J5Q29ubmVjdGlvbiA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAge3VzZXJJZH06IFVzZXJUeXBlLFxuICBvcHRpb25zPzogVXNlck9wdGlvbnNcbik6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0VXNlcnNCeUNvbm5lY3Rpb24nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB1c2VybmFtZX0gPSBwYXJzZVVzZXJPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRVc2VyT3B0aW9uYWwoZmllbGRzKTtcbiAgY29uc3QgZm9ybWF0VXNlcklkOiBzdHJpbmcgPSBwYXJzZUFyYW5nb0lkKGB1c2Vycy8ke3VzZXJJZH1gKTtcbiAgY29uc3QgZmlsdGVyQnk6IHN0cmluZ1tdID0gW1xuICAgICd1LnVzZXJBY2Nlc3MgPiAwJ1xuICBdO1xuXG4gIGlmKHVzZXJuYW1lKSB7XG4gICAgZmlsdGVyQnkucHVzaChgQ09OVEFJTlModS51c2VybmFtZSwgXCIke3BhcnNlVXNlcm5hbWUodXNlcm5hbWUpfVwiKWApO1xuICB9XG5cbiAgY29uc3QgYXFsUXVlcnk6IHN0cmluZyA9IGBGT1IgY3UgSU4gdXNlcnNcbiAgICBMRVQgc2Vzc2lvbiA9IERPQ1VNRU5UKFwiJHtmb3JtYXRVc2VySWR9XCIpXG4gICAgRk9SIHUsIGNvbm5lY3Rpb24gSU4gT1VUQk9VTkQgY3UgaGFzQ29ubmVjdGlvblxuICAgIE9QVElPTlMge2JmczogdHJ1ZSwgdW5pcXVlVmVydGljZXM6IFwiZ2xvYmFsXCIsIHZlcnRleENvbGxlY3Rpb25zOiBcInVzZXJzXCJ9XG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgIEZJTFRFUiAke2ZpbHRlckJ5LmpvaW4oJyAmJiAnKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UodSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBVc2VyVHlwZVtdKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG5cbiAgICAgIHJldHVybiBbXSBhcyBVc2VyVHlwZVtdO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlZnJlc2hTZXNzaW9uID0gKHtleHBpcmVzLCB0b2tlbn0pOiBTZXNzaW9uVG9rZW4gfCBTZXNzaW9uRXJyb3IgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHt1c2VySWQsIHVzZXJuYW1lLCB1c2VyQWNjZXNzfSA9IGdldFNlc3Npb24odG9rZW4pO1xuICAgIHJldHVybiBjcmVhdGVUb2tlbih1c2VySWQsIHVzZXJuYW1lLCB1c2VyQWNjZXNzLCBleHBpcmVzKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHRocm93IGVycm9yOyAvLyBSZS10aHJvdyB0aGUgZXJyb3IgZnJvbSBnZXRTZXNzaW9uXG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzaWduSW4gPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgYXJncyk6IFByb21pc2U8U2Vzc2lvblRva2VuPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdzaWduSW4nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtlbWFpbCwgZXhwaXJlcywgcGFzc3dvcmQsIHBob25lLCB1c2VybmFtZX0gPSBhcmdzO1xuICBjb25zdCBmb3JtYXRFbWFpbDogc3RyaW5nID0gcGFyc2VFbWFpbChlbWFpbCk7XG4gIGNvbnN0IGZvcm1hdFVzZXJuYW1lOiBzdHJpbmcgPSBwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKTtcbiAgY29uc3QgZm9ybWF0UGFzc3dvcmQ6IHN0cmluZyA9IHBhcnNlUGFzc3dvcmQocGFzc3dvcmQpO1xuICBjb25zdCBmb3JtYXRQaG9uZTogc3RyaW5nID0gcGFyc2VQaG9uZShwaG9uZSk7XG4gIGNvbnN0IGZvcm1hdEV4cGlyZXM6IG51bWJlciA9IHBhcnNlTnVtKGV4cGlyZXMpIHx8IDE1O1xuXG4gIGlmKCghZm9ybWF0VXNlcm5hbWUgJiYgIWZvcm1hdEVtYWlsICYmICFmb3JtYXRQaG9uZSkgfHwgIWZvcm1hdFBhc3N3b3JkKSB7XG4gICAgbG9nRXhjZXB0aW9uKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7dXNlcm5hbWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU5WQUxJRF9BUkdVTUVOVFNcbiAgICB9LCBjb250ZXh0KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGZpbHRlcnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYoZm9ybWF0RW1haWwpIHtcbiAgICBmaWx0ZXJzLnB1c2goYHUuZW1haWwgPT0gXCIke2Zvcm1hdEVtYWlsfVwiYCk7XG4gIH1cblxuICBpZihmb3JtYXRQaG9uZSkge1xuICAgIGZpbHRlcnMucHVzaChgdS5waG9uZSA9PSAke2Zvcm1hdFBob25lfWApO1xuICB9XG5cbiAgaWYoZm9ybWF0VXNlcm5hbWUpIHtcbiAgICBmaWx0ZXJzLnB1c2goYHUudXNlcm5hbWUgPT0gXCIke2Zvcm1hdFVzZXJuYW1lfVwiYCk7XG4gIH1cblxuICBjb25zdCBjaGVja1F1ZXJ5OiBzdHJpbmcgPSBgRk9SIHUgSU4gdXNlcnNcbiAgICBGSUxURVIgJHtmaWx0ZXJzLmpvaW4oJyB8fCAnKX1cbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIHVgO1xuXG4gIGxldCBjaGVja1VzZXI6IFVzZXJUeXBlO1xuXG4gIHRyeSB7XG4gICAgY2hlY2tVc2VyID0gYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShjaGVja1F1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VybmFtZTogZm9ybWF0VXNlcm5hbWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmKCFjaGVja1VzZXIpIHtcbiAgICBsb2dFeGNlcHRpb24oe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTlZBTElEX0FVVEhFTlRJQ0FUSU9OXG4gICAgfSwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHtfa2V5OiB1c2VySWQsIHBhc3N3b3JkOiB2YWxpZFBhc3N3b3JkLCBzYWx0LCB1c2VyQWNjZXNzfSA9IGNoZWNrVXNlcjtcbiAgY29uc3QgYXV0aFBhc3N3b3JkOiBzdHJpbmcgPSBjcmVhdGVQYXNzd29yZChmb3JtYXRQYXNzd29yZCwgc2FsdCk7XG5cbiAgaWYodmFsaWRQYXNzd29yZCAhPT0gYXV0aFBhc3N3b3JkKSB7XG4gICAgbG9nRXhjZXB0aW9uKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7dXNlckFjY2VzcywgdXNlcklkLCB1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTlZBTElEX0FVVEhFTlRJQ0FUSU9OXG4gICAgfSwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc29sZS5sb2coe2Zvcm1hdEV4cGlyZXMsIHVzZXJBY2Nlc3MsIHVzZXJJZCwgdXNlcm5hbWV9KTtcbiAgICBjb25zdCB0b2tlbiA9IGNyZWF0ZVRva2VuKHVzZXJJZCwgdXNlcm5hbWUsIHVzZXJBY2Nlc3MsIGZvcm1hdEV4cGlyZXMpO1xuICAgIGNvbnNvbGUubG9nKHt0b2tlbn0pO1xuXG4gICAgcmV0dXJuIHRva2VuO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VySWQsIHVzZXJuYW1lfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzaWduT3V0ID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ3NpZ25PdXQnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWQsIHVzZXJuYW1lfX0gPSBjb250ZXh0O1xuICBjb25zdCB1c2VyRG9jSWQ6IHN0cmluZyA9IGB1c2Vycy8ke3Nlc3Npb25JZH1gO1xuXG4gIGNvbnN0IHVwZGF0ZSA9IHtcbiAgICBsYXN0T25saW5lOiBEYXRlLm5vdygpLFxuICAgIHNlc3Npb25JZDogbnVsbFxuICB9O1xuICBjb25zdCBzZXNzaW9uUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYExFVCB1ID0gRE9DVU1FTlQoJHt1c2VyRG9jSWR9KVxuICAgIFVQREFURSB1IFdJVEggJHt1cGRhdGV9IElOIHVzZXJzXG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBORVdgO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShzZXNzaW9uUXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBhd2FpdCBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3VzZXJJZDogc2Vzc2lvbklkLCB1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFjdGl2ZVVzZXJDb3VudCA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldEFjdGl2ZVVzZXJDb3VudCc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3QgY291bnRRdWVyeTogQXFsUXVlcnkgPSBhcWxgTEVUIGRvY3MgPSAoXG4gICAgRk9SIHUgSU4gdXNlcnNcbiAgICBGSUxURVIgdS5hY3RpdmUgPT0gdHJ1ZVxuICAgIFJFVFVSTiB1XG4gIClcbiAgUkVUVVJOIExFTkdUSChkb2NzKWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoY291bnRRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJCeVRva2VuID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPFVzZXJUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRVc2VyQnlUb2tlbic7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3Qge3VzZXJJZH0gPSBnZXRTZXNzaW9uKHRva2VuKTtcbiAgY29uc3QgdXNlckRvY0lkID0gZ2V0RG9jSWQoJ3VzZXJzJywge3VzZXJJZH0pO1xuICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgTEVUIHUgPSBET0NVTUVOVChcIiR7dXNlckRvY0lkfVwiKSBSRVRVUk4gdWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VySWR9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTsiXSwKICAibWFwcGluZ3MiOiAiQUFJQSxPQUNFLGNBQUFBLEVBQ0Esa0JBQUFDLEVBQ0EsaUJBQUFDLEVBQ0EsYUFBQUMsRUFDQSxjQUFBQyxFQUNBLFlBQUFDLEVBQ0EsaUJBQUFDLEVBQ0EsY0FBQUMsRUFDQSxpQkFBQUMsTUFDSyxlQUNQLE9BQVEsT0FBQUMsTUFBVSxXQUVsQixPQUFRLFlBQUFDLE1BQWUsUUFDdkIsT0FBT0MsTUFBWSxTQUVuQixPQUFRLGFBQUFDLE1BQWdCLDBCQUN4QixPQUFRLFVBQUFDLE1BQWEsWUFDckIsT0FBUSxhQUFBQyxNQUFnQixVQUN4QixPQUFRLFdBQUFDLE9BQWMsUUFDdEIsT0FBUSxjQUFBQyxNQUErQix1QkFDdkMs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ekUsRUFBUyxRQUFTLENBQUMsT0FBQVcsQ0FBTSxDQUFDLEVBQ3RDeUQsRUFBcUI5RSxzQkFBd0JtRixDQUFTLGNBRTVELE9BQU90RSxFQUFNOEIsQ0FBWSxFQUFFLE1BQU1tQyxDQUFRLEVBQ3RDLEtBQU10QixHQUFXQSxFQUFPLEtBQUssQ0FBQyxFQUM5QixNQUFPQyxHQUFpQmpELEVBQVMsQ0FDaEMsT0FBQWtDLEVBQ0EsU0FBVXpCLEVBQ1YsT0FBUSxDQUFDLE9BQUFJLENBQU0sRUFDZixNQUFPZCxFQUFXLGNBQ3BCLEVBQUdrRCxFQUFPakIsQ0FBTyxDQUFDLENBQ3RCIiwKICAibmFtZXMiOiBbImNyZWF0ZUhhc2giLCAiY3JlYXRlUGFzc3dvcmQiLCAicGFyc2VBcmFuZ29JZCIsICJwYXJzZUNoYXIiLCAicGFyc2VFbWFpbCIsICJwYXJzZU51bSIsICJwYXJzZVBhc3N3b3JkIiwgInBhcnNlUGhvbmUiLCAicGFyc2VVc2VybmFtZSIsICJhcWwiLCAiRGF0ZVRpbWUiLCAiU3RyaXBlIiwgInBhcnNlVXNlciIsICJDb25maWciLCAic2VuZEVtYWlsIiwgInNlbmRTbXMiLCAiRXJyb3JUeXBlcyIsICJsb2dFcnJvciIsICJsb2dFeGNlcHRpb24iLCAiZ2V0RG9jSWQiLCAiZ2V0TGltaXQiLCAic2VsZWN0UmVhY3Rpb25Db3VudEJ5VHlwZSIsICJ1c2VEYiIsICJkZXRlY3RMYW5ndWFnZSIsICJnZXRTZXNzaW9uIiwgInNldFNlc3Npb24iLCAiZXZlbnRDYXRlZ29yeSIsICJTVFJJUEVfQVBJX1ZFUlNJT04iLCAiVXNlckFjY2VzcyIsICJjcmVhdGVUb2tlbiIsICJ1c2VySWQiLCAidXNlcm5hbWUiLCAidXNlckFjY2VzcyIsICJleHBpcmVzSW5NaW51dGVzIiwgIm5vdyIsICJzZXNzaW9uRXhwaXJlcyIsICJpYXQiLCAiZXhwIiwgInRva2VuIiwgImdldFVzZXJPcHRpb25hbCIsICJmaWVsZHMiLCAic2VsZWN0cyIsICJmaWVsZCIsICJwYXJzZVVzZXJPcHRpb25zIiwgIm9wdGlvbnMiLCAiZnJvbSIsICJ0byIsICJsaW1pdCIsICJhZGRVc2VyIiwgImNvbnRleHQiLCAidXNlciIsICJhY3Rpb24iLCAiZGF0YWJhc2VOYW1lIiwgImxhbmd1YWdlQ29udGV4dCIsICJlbWFpbCIsICJwYXNzd29yZCIsICJwaG9uZSIsICJfa2V5IiwgIl9pZCIsICJpbnNlcnRVc2VyIiwgImZvcm1hdFBhc3N3b3JkIiwgInNhbHQiLCAiZW5jcnlwdGVkUGFzc3dvcmQiLCAiZmlsdGVycyIsICJjaGVja1F1ZXJ5IiwgImN1cnNvciIsICJlcnJvciIsICJwaG9uZUNvdW50cnlDb2RlIiwgImxvY2FsZSIsICJ2ZXJpZmllZEVtYWlsQ29kZSIsICJ2ZXJpZmllZFNtc0NvZGUiLCAiaW5zZXJ0IiwgImluc2VydFF1ZXJ5IiwgInVwZGF0ZVVzZXIiLCAidXBkYXRlZFVzZXIiLCAidGFncyIsICJ1cGRhdGUiLCAiaWQiLCAidXNlclF1ZXJ5IiwgImRhdGFiYXNlIiwgInRhZ0NvbGxlY3Rpb24iLCAidGFnRG9jSWQiLCAibmFtZSIsICJ0YWdRdWVyeSIsICJ0YWdFZGdlIiwgImVkZ2UiLCAiZm9yZ290UGFzc3dvcmQiLCAiYXFsUXVlcnkiLCAidmVyaWZpZWRFbWFpbCIsICJ2ZXJpZmllZFBob25lIiwgImNvZGVFeHBpcmVzIiwgImNvZGUiLCAidXNlckRvY0lkIiwgInVwZGF0ZVF1ZXJ5IiwgInJlc2V0UGFzc3dvcmQiLCAidHlwZSIsICJ2ZXJpZmllZEVtYWlsRXhwaXJlcyIsICJ2ZXJpZmllZFBob25lRXhwaXJlcyIsICJjb25maXJtQ29kZSIsICJzZXNzaW9uSWQiLCAiZGVsZXRlVXNlciIsICJzdHJpcGVDbGllbnQiLCAiZGVsZXRlZFVzZXIiLCAiZGVhY3RpdmF0ZVVzZXIiLCAiZ2V0RGlzcGxheU5hbWUiLCAiZmlyc3QiLCAibGFzdCIsICJmdWxsbmFtZSIsICJnZXRTZXNzaW9uVXNlciIsICJzZWxlY3RPYmplY3RzIiwgInNlbGVjdFF1ZXJpZXMiLCAiZ2V0VXNlciIsICJnZXRVc2VycyIsICJmaWx0ZXJCeSIsICJnZXRVc2Vyc0J5UmVhY3Rpb25zIiwgInJlYWN0aW9ucyIsICJmb3JtYXRSZWFjdGlvbnMiLCAicmVhY3Rpb25OYW1lIiwgImZvcm1hdFNlc3Npb25JZCIsICJmb3JtYXRVc2VybmFtZSIsICJnZXRVc2Vyc0J5VGFncyIsICJmb3JtYXRUYWdzIiwgImxpc3QiLCAidGFnTmFtZSIsICJnZXRVc2Vyc0J5TGF0ZXN0IiwgImZpbHRlciIsICJnZXRVc2Vyc0J5Q29ubmVjdGlvbiIsICJmb3JtYXRVc2VySWQiLCAicmVmcmVzaFNlc3Npb24iLCAiZXhwaXJlcyIsICJzaWduSW4iLCAiYXJncyIsICJmb3JtYXRFbWFpbCIsICJmb3JtYXRQaG9uZSIsICJmb3JtYXRFeHBpcmVzIiwgImNoZWNrVXNlciIsICJ2YWxpZFBhc3N3b3JkIiwgImF1dGhQYXNzd29yZCIsICJzaWduT3V0IiwgInNlc3Npb25RdWVyeSIsICJnZXRBY3RpdmVVc2VyQ291bnQiLCAiY291bnRRdWVyeSIsICJnZXRVc2VyQnlUb2tlbiJdCn0K