@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,267 +1,24 @@
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 tags_exports = {};
29
- __export(tags_exports, {
30
- addTag: () => addTag,
31
- addTagToItem: () => addTagToItem,
32
- deleteTag: () => deleteTag,
33
- deleteTagFromItem: () => deleteTagFromItem,
34
- extractTags: () => extractTags,
35
- getTag: () => getTag,
36
- getTags: () => getTags,
37
- getTagsByItem: () => getTagsByItem,
38
- getTagsByName: () => getTagsByName,
39
- updateTag: () => updateTag,
40
- updateTagsInItem: () => updateTagsInItem
41
- });
42
- module.exports = __toCommonJS(tags_exports);
43
- var import_utils = require("@nlabs/utils");
44
- var import_arangojs = require("arangojs");
45
- var import_words = __toESM(require("lodash/words"));
46
- var import_tagAdapter = require("../adapters/tagAdapter");
47
- var import_error = require("../types/error");
48
- var import_analyticsUtils = require("../utils/analyticsUtils");
49
- var import_arangodbUtils = require("../utils/arangodbUtils");
50
- const eventCategory = "tags";
51
- const getTags = (context, options = {}) => {
52
- const action = "getList";
53
- const { database } = context;
54
- const { search = "", from = 0, to = 30, userId } = options;
55
- const limit = (0, import_arangodbUtils.getLimit)(from, to);
56
- const filters = [];
57
- if (search) {
58
- filters.push(`LIKE(t.name, "%${search}%")`);
59
- }
60
- if (userId) {
61
- filters.push(`t.userId == "${userId}"`);
62
- }
63
- const aqlQry = `FOR t IN tags
64
- FILTER ${filters.join(" || ")}
65
- ${limit.aql}
1
+ import{createHash as O,parseArangoId as u,parseId as D,parseVarChar as A}from"@nlabs/utils";import{aql as I}from"arangojs";import q from"lodash/words";import{parseTag as h}from"../adapters/tagAdapter";import{ErrorTypes as m}from"../types/error.types";import{logError as d}from"../utils/analyticsUtils";import{getDocId as C,getLimit as x,useDb as y}from"../utils/arangodbUtils";const p="tags",P=(o,r={})=>{const n="getList",{databaseName:s}=o,{search:a="",from:g=0,to:t=30,userId:e}=r,i=x(g,t),T=[];a&&T.push(`LIKE(t.name, "%${a}%")`),e&&T.push(`t.userId == "${e}"`);const c=`FOR t IN tags
2
+ FILTER ${T.join(" || ")}
3
+ ${i.aql}
66
4
  SORT t.name
67
- RETURN t`;
68
- return database.query(aqlQry).then((cursor) => cursor.all()).catch((error) => (0, import_analyticsUtils.logError)({
69
- action,
70
- category: eventCategory,
71
- value: import_error.ErrorTypes.DATABASE_ERROR
72
- }, error, {}));
73
- };
74
- const getTagsByItem = (context, itemDocId, options = {}) => {
75
- const action = "getTagsByItem";
76
- const { from = 0, to = 30 } = options;
77
- const { database } = context;
78
- const limit = (0, import_arangodbUtils.getLimit)(from, to);
79
- const formatItemId = (0, import_utils.parseArangoId)(itemDocId);
80
- const tagQuery = `FOR t, it IN INBOUND "${formatItemId}" isTagged
81
- ${limit.aql}
5
+ RETURN t`;return y(s).query(c).then(l=>l.all()).catch(l=>(d({action:n,category:p,value:m.DATABASE_ERROR},l,{}),[]))},U=(o,r,n={})=>{const s="getTagsByItem",{from:a=0,to:g=30}=n,{databaseName:t}=o,e=x(a,g),T=`FOR t, it IN INBOUND "${u(r)}" isTagged
6
+ ${e.aql}
82
7
  SORT it.added
83
- RETURN t`;
84
- return database.query(tagQuery).then((cursor) => cursor.all()).catch((error) => (0, import_analyticsUtils.logError)({
85
- action,
86
- category: eventCategory,
87
- value: import_error.ErrorTypes.DATABASE_ERROR
88
- }, error, {}));
89
- };
90
- const getTag = (context, tagId) => {
91
- const action = "getTag";
92
- const { database } = context;
93
- const formatId = (0, import_utils.parseId)(tagId);
94
- const aqlQry = `FOR t IN tags
95
- FILTER t._key == "${formatId}"
8
+ RETURN t`;return y(t).query(T).then(c=>c.all()).catch(c=>(d({action:s,category:p,value:m.DATABASE_ERROR},c,{}),[]))},k=(o,r)=>{const n="getTag",{databaseName:s}=o,g=`FOR t IN tags
9
+ FILTER t._key == "${D(r)}"
96
10
  LIMIT 1
97
- RETURN t`;
98
- return database.query(aqlQry).then((cursor) => cursor.next()).catch((error) => (0, import_analyticsUtils.logError)({
99
- action,
100
- category: eventCategory,
101
- value: import_error.ErrorTypes.DATABASE_ERROR
102
- }, error, {}));
103
- };
104
- const getTagsByName = (context, tagNames) => {
105
- const action = "getTagsByName";
106
- const { database } = context;
107
- const formatTagNames = tagNames.map((tagName) => (0, import_utils.parseVarChar)(tagName, 32)).filter((tagName) => !!tagName);
108
- if (!formatTagNames.length) {
109
- return Promise.resolve([]);
110
- }
111
- const aqlQry = import_arangojs.aql`FOR t IN tags
112
- FILTER POSITION(${JSON.stringify(formatTagNames)}, t.name)
113
- RETURN t`;
114
- return database.query(aqlQry).then((cursor) => cursor.all()).catch((error) => (0, import_analyticsUtils.logError)({
115
- action,
116
- category: eventCategory,
117
- value: import_error.ErrorTypes.DATABASE_ERROR
118
- }, error, {}));
119
- };
120
- const addTag = (context, tag) => {
121
- const action = "addTag";
122
- const { database } = context;
123
- const now = Date.now();
124
- const { description, name } = (0, import_tagAdapter.parseTag)(tag);
125
- const formatId = (0, import_utils.createHash)(`tag-${name.toLowerCase()}`, null);
126
- const insert = {
127
- _key: formatId,
128
- added: now,
129
- description: (0, import_utils.parseVarChar)(description, 64),
130
- modified: now,
131
- name: (0, import_utils.parseVarChar)(name, 32)
132
- };
133
- const aqlQry = import_arangojs.aql`INSERT ${insert} IN tags RETURN NEW`;
134
- return database.query(aqlQry).then((cursor) => cursor.next()).catch((error) => (0, import_analyticsUtils.logError)({
135
- action,
136
- category: eventCategory,
137
- value: import_error.ErrorTypes.DATABASE_ERROR
138
- }, error, {}));
139
- };
140
- const addTagToItem = async (context, { itemDocId, tagBy, tagDocId }) => {
141
- const action = "addTagToItem";
142
- const { database, session: { userId: sessionId } } = context;
143
- const added = Date.now();
144
- const formatTagDocId = (0, import_utils.parseArangoId)(tagDocId);
145
- const formatItemDocId = (0, import_utils.parseArangoId)(itemDocId);
146
- const edgeId = (0, import_utils.createHash)(`isTagged-${formatTagDocId}-${formatItemDocId}`, null);
147
- const edgeCollection = database.collection("isTagged");
148
- const type = formatItemDocId.split("/")[0];
149
- const formatTagBy = (0, import_utils.parseId)(tagBy) || sessionId;
150
- const edge = { _from: formatTagDocId, _key: edgeId, _to: formatItemDocId, added, tagBy: formatTagBy, type };
151
- await edgeCollection.save(edge, { overwriteMode: "ignore", returnNew: true, silent: true }).catch((error) => (0, import_analyticsUtils.logError)({
152
- action,
153
- category: eventCategory,
154
- params: {
155
- edge
156
- },
157
- value: import_error.ErrorTypes.DATABASE_ERROR
158
- }, error, {}));
159
- const tagQuery = import_arangojs.aql`LET t = DOCUMENT(${formatTagDocId}) RETURN t`;
160
- return database.query(tagQuery).then((cursor) => cursor.next()).catch((error) => (0, import_analyticsUtils.logError)({
161
- action,
162
- category: eventCategory,
163
- params: {
164
- edge
165
- },
166
- value: import_error.ErrorTypes.DATABASE_ERROR
167
- }, error, {}));
168
- };
169
- const updateTag = (context, tag) => {
170
- const action = "updateTag";
171
- const { database, session: { userId: sessionId } } = context;
172
- const now = Date.now();
173
- const { description, name, tagId } = (0, import_tagAdapter.parseTag)(tag);
174
- const formatName = (0, import_utils.parseVarChar)(name, 32);
175
- const update = {
176
- description: (0, import_utils.parseVarChar)(description, 64),
177
- modified: now,
178
- name: formatName
179
- };
180
- const newTagKey = tagId || (0, import_utils.createHash)(`tag-${formatName.toLowerCase()}`, null);
181
- const insert = {
182
- ...update,
183
- _id: `tags/${newTagKey}`,
184
- _key: newTagKey,
185
- added: now,
186
- tagBy: sessionId
187
- };
188
- const aqlQry = import_arangojs.aql`UPSERT {name: ${formatName}}
189
- INSERT ${insert}
190
- UPDATE ${update}
191
- IN tags RETURN NEW`;
192
- return database.query(aqlQry).then((cursor) => cursor.next()).catch((error) => (0, import_analyticsUtils.logError)({
193
- action,
194
- category: eventCategory,
195
- value: import_error.ErrorTypes.DATABASE_ERROR
196
- }, error, {}));
197
- };
198
- const deleteTag = async (context, tag) => {
199
- const action = "deleteTag";
200
- const { database } = context;
201
- const formatItemId = (0, import_arangodbUtils.getDocId)("tags", tag);
202
- const tagQuery = `FOR it FROM isTagged
203
- FILTER it._from == "${formatItemId}" || it._to == "${formatItemId}"
11
+ RETURN t`;return y(s).query(g).then(t=>t.next()).catch(t=>d({action:n,category:p,value:m.DATABASE_ERROR},t,{}))},M=(o,r)=>{const n="getTagsByName",{databaseName:s}=o,a=r.map(t=>A(t,32)).filter(t=>!!t);if(!a.length)return Promise.resolve([]);const g=I`FOR t IN tags
12
+ FILTER POSITION(${JSON.stringify(a)}, t.name)
13
+ RETURN t`;return y(s).query(g).then(t=>t.all()).catch(t=>(d({action:n,category:p,value:m.DATABASE_ERROR},t,{}),[]))},V=(o,r)=>{const n="addTag",{databaseName:s}=o,a=Date.now(),{description:g,name:t}=h(r),i={_key:O(`tag-${t.toLowerCase()}`,null),added:a,description:A(g,64),modified:a,name:A(t,32)},T=I`INSERT ${i} IN tags RETURN NEW`;return y(s).query(T).then(c=>c.next()).catch(c=>d({action:n,category:p,value:m.DATABASE_ERROR},c,{}))},$=async(o,{itemDocId:r,tagBy:n,tagDocId:s})=>{const a="addTagToItem",{databaseName:g,session:{userId:t}}=o,e=Date.now(),i=u(s),T=u(r),c=O(`isTagged-${i}-${T}`,null),l=y(g).collection("isTagged"),f=T.split("/")[0],N=D(n)||t,E={_from:i,_key:c,_to:T,added:e,tagBy:N,type:f};await l.save(E,{overwriteMode:"ignore",returnNew:!0,silent:!0}).catch(R=>d({action:a,category:p,params:{edge:E},value:m.DATABASE_ERROR},R,{}));const _=I`LET t = DOCUMENT(${i}) RETURN t`;return y(g).query(_).then(R=>R.next()).catch(R=>d({action:a,category:p,params:{edge:E},value:m.DATABASE_ERROR},R,{}))},j=(o,r)=>{const n="updateTag",{databaseName:s,session:{userId:a}}=o,g=Date.now(),{description:t,name:e,tagId:i}=h(r),T=A(e,32),c={description:A(t,64),modified:g,name:T},l=i||O(`tag-${T.toLowerCase()}`,null),f={...c,_id:`tags/${l}`,_key:l,added:g,tagBy:a},N=I`UPSERT {name: ${T}}
14
+ INSERT ${f}
15
+ UPDATE ${c}
16
+ IN tags RETURN NEW`;return y(s).query(N).then(E=>E.next()).catch(E=>d({action:n,category:p,value:m.DATABASE_ERROR},E,{}))},K=async(o,r)=>{const n="deleteTag",{databaseName:s}=o,a=C("tags",r),g=`FOR it FROM isTagged
17
+ FILTER it._from == "${a}" || it._to == "${a}"
204
18
  REMOVE it IN isTagged
205
- RETURN OLD`;
206
- await database.query(tagQuery).then((cursor) => cursor.all()).catch((error) => (0, import_analyticsUtils.logError)({
207
- action,
208
- category: eventCategory,
209
- value: import_error.ErrorTypes.DATABASE_ERROR
210
- }, error, {}));
211
- const aqlQry = `LET t = DOCUMENT(${formatItemId})
19
+ RETURN OLD`;await y(s).query(g).then(e=>e.all()).catch(e=>d({action:n,category:p,value:m.DATABASE_ERROR},e,{}));const t=`LET t = DOCUMENT(${a})
212
20
  REMOVE t IN tags
213
- RETURN OLD`;
214
- return database.query(aqlQry).then((cursor) => cursor.next()).catch((error) => (0, import_analyticsUtils.logError)({
215
- action,
216
- category: eventCategory,
217
- value: import_error.ErrorTypes.DATABASE_ERROR
218
- }, error, {}));
219
- };
220
- const deleteTagFromItem = async (context, { tagDocId, edgeDocId }) => {
221
- const action = "deleteTagFromItem";
222
- const { database } = context;
223
- const formatTagDocId = (0, import_utils.parseArangoId)(tagDocId);
224
- const formatEdgeDocId = (0, import_utils.parseArangoId)(edgeDocId);
225
- const edgeCollection = database.collection("isTagged");
226
- const edge = { _id: formatEdgeDocId };
227
- await edgeCollection.remove(edge, { silent: true }).catch((error) => (0, import_analyticsUtils.logError)({
228
- action,
229
- category: eventCategory,
230
- value: import_error.ErrorTypes.DATABASE_ERROR
231
- }, error, {}));
232
- const tagQuery = import_arangojs.aql`LET t = DOCUMENT(${formatTagDocId}) RETURN t`;
233
- return database.query(tagQuery).then((cursor) => cursor.next()).catch((error) => (0, import_analyticsUtils.logError)({
234
- action,
235
- category: eventCategory,
236
- value: import_error.ErrorTypes.DATABASE_ERROR
237
- }, error, {}));
238
- };
239
- const extractTags = (content) => (0, import_words.default)(content, /#[a-zA-Z\d-]+/g).map((tag) => (0, import_utils.parseId)(tag));
240
- const updateTagsInItem = (context, { itemDocId, tags }) => {
241
- const action = "updateTagsInItem";
242
- const { database } = context;
243
- const edgeCollection = database.collection("isTagged");
244
- return edgeCollection.inEdges(itemDocId, {}).then((edges) => Promise.all([
245
- ...edges.filter(({ name: existingTagName }) => !tags.find(({ name: tagName }) => existingTagName === tagName)).map(({ _id: edgeDocId, _from: tagDocId }) => deleteTagFromItem(context, { tagDocId, edgeDocId })),
246
- ...tags.filter(({ name: tagName }) => !edges.find(({ name: existingTagName }) => existingTagName === tagName)).map(({ _id: tagDocId, tagBy }) => addTagToItem(context, { itemDocId, tagBy, tagDocId }))
247
- ]).then(() => tags)).catch((error) => (0, import_analyticsUtils.logError)({
248
- action,
249
- category: eventCategory,
250
- value: import_error.ErrorTypes.DATABASE_ERROR
251
- }, error, {}));
252
- };
253
- // Annotate the CommonJS export names for ESM import in node:
254
- 0 && (module.exports = {
255
- addTag,
256
- addTagToItem,
257
- deleteTag,
258
- deleteTagFromItem,
259
- extractTags,
260
- getTag,
261
- getTags,
262
- getTagsByItem,
263
- getTagsByName,
264
- updateTag,
265
- updateTagsInItem
266
- });
267
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvdGFncy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7Y3JlYXRlSGFzaCwgcGFyc2VBcmFuZ29JZCwgcGFyc2VJZCwgcGFyc2VWYXJDaGFyfSBmcm9tICdAbmxhYnMvdXRpbHMnO1xuaW1wb3J0IHthcWx9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQge0VkZ2VDb2xsZWN0aW9ufSBmcm9tICdhcmFuZ29qcy9jb2xsZWN0aW9uJztcbmltcG9ydCB7QXJyYXlDdXJzb3J9IGZyb20gJ2FyYW5nb2pzL2N1cnNvcic7XG5pbXBvcnQge0VkZ2V9IGZyb20gJ2FyYW5nb2pzL2RvY3VtZW50cyc7XG5pbXBvcnQgd29yZHMgZnJvbSAnbG9kYXNoL3dvcmRzJztcblxuaW1wb3J0IHtwYXJzZVRhZ30gZnJvbSAnLi4vYWRhcHRlcnMvdGFnQWRhcHRlcic7XG5pbXBvcnQgdHlwZSB7QXJhbmdvRGJMaW1pdH0gZnJvbSAnLi4vdHlwZXMvYXJhbmdvZGInO1xuaW1wb3J0IHR5cGUge0FwaUNvbnRleHR9IGZyb20gJy4uL3R5cGVzL2F1dGgnO1xuaW1wb3J0IHtFcnJvclR5cGVzfSBmcm9tICcuLi90eXBlcy9lcnJvcic7XG5pbXBvcnQgdHlwZSB7VGFnVHlwZX0gZnJvbSAnLi4vdHlwZXMvdGFncyc7XG5pbXBvcnQge2xvZ0Vycm9yfSBmcm9tICcuLi91dGlscy9hbmFseXRpY3NVdGlscyc7XG5pbXBvcnQge2dldERvY0lkLCBnZXRMaW1pdH0gZnJvbSAnLi4vdXRpbHMvYXJhbmdvZGJVdGlscyc7XG5cbmNvbnN0IGV2ZW50Q2F0ZWdvcnk6IHN0cmluZyA9ICd0YWdzJztcbmV4cG9ydCBpbnRlcmZhY2UgVGFnT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGZyb20/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHNlYXJjaD86IHN0cmluZztcbiAgcmVhZG9ubHkgdG8/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHVzZXJJZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IGdldFRhZ3MgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIG9wdGlvbnM6IFRhZ09wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUYWdUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0TGlzdCc7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuICBjb25zdCB7c2VhcmNoID0gJycsIGZyb20gPSAwLCB0byA9IDMwLCB1c2VySWR9ID0gb3B0aW9ucztcbiAgY29uc3QgbGltaXQ6IEFyYW5nb0RiTGltaXQgPSBnZXRMaW1pdChmcm9tLCB0byk7XG5cbiAgY29uc3QgZmlsdGVyczogc3RyaW5nW10gPSBbXTtcblxuICBpZihzZWFyY2gpIHtcbiAgICBmaWx0ZXJzLnB1c2goYExJS0UodC5uYW1lLCBcIiUke3NlYXJjaH0lXCIpYCk7XG4gIH1cblxuICBpZih1c2VySWQpIHtcbiAgICBmaWx0ZXJzLnB1c2goYHQudXNlcklkID09IFwiJHt1c2VySWR9XCJgKTtcbiAgfVxuXG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiB0IElOIHRhZ3NcbiAgICBGSUxURVIgJHtmaWx0ZXJzLmpvaW4oJyB8fCAnKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIHQubmFtZVxuICAgIFJFVFVSTiB0YDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwge30pKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUYWdzQnlJdGVtID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpdGVtRG9jSWQ6IHN0cmluZyxcbiAgb3B0aW9uczogVGFnT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFRhZ1R5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRUYWdzQnlJdGVtJztcbiAgY29uc3Qge2Zyb20gPSAwLCB0byA9IDMwfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuICBjb25zdCBsaW1pdDogQXJhbmdvRGJMaW1pdCA9IGdldExpbWl0KGZyb20sIHRvKTtcbiAgY29uc3QgZm9ybWF0SXRlbUlkOiBzdHJpbmcgPSBwYXJzZUFyYW5nb0lkKGl0ZW1Eb2NJZCk7XG4gIGNvbnN0IHRhZ1F1ZXJ5OiBzdHJpbmcgPSBgRk9SIHQsIGl0IElOIElOQk9VTkQgXCIke2Zvcm1hdEl0ZW1JZH1cIiBpc1RhZ2dlZFxuICAgICR7bGltaXQuYXFsfVxuICAgIFNPUlQgaXQuYWRkZWRcbiAgICBSRVRVUk4gdGA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KHRhZ1F1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwge30pKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUYWcgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdGFnSWQ6IHN0cmluZyk6IFByb21pc2U8VGFnVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRUYWcnO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SWQ6IHN0cmluZyA9IHBhcnNlSWQodGFnSWQpO1xuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgdCBJTiB0YWdzXG4gICAgRklMVEVSIHQuX2tleSA9PSBcIiR7Zm9ybWF0SWR9XCJcbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIHRgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwge30pKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUYWdzQnlOYW1lID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHRhZ05hbWVzOiBzdHJpbmdbXSk6IFByb21pc2U8VGFnVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldFRhZ3NCeU5hbWUnO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0VGFnTmFtZXMgPSB0YWdOYW1lc1xuICAgIC5tYXAoKHRhZ05hbWUpID0+IHBhcnNlVmFyQ2hhcih0YWdOYW1lLCAzMikpXG4gICAgLmZpbHRlcigodGFnTmFtZSkgPT4gISF0YWdOYW1lKTtcblxuICBpZighZm9ybWF0VGFnTmFtZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG4gIH1cblxuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiB0IElOIHRhZ3NcbiAgICBGSUxURVIgUE9TSVRJT04oJHtKU09OLnN0cmluZ2lmeShmb3JtYXRUYWdOYW1lcyl9LCB0Lm5hbWUpXG4gICAgUkVUVVJOIHRgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCB7fSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZFRhZyA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB0YWc6IFRhZ1R5cGUpOiBQcm9taXNlPFRhZ1R5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnYWRkVGFnJztcbiAgY29uc3Qge2RhdGFiYXNlfSA9IGNvbnRleHQ7XG4gIGNvbnN0IG5vdzogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qge2Rlc2NyaXB0aW9uLCBuYW1lfSA9IHBhcnNlVGFnKHRhZyk7XG4gIGNvbnN0IGZvcm1hdElkOiBzdHJpbmcgPSBjcmVhdGVIYXNoKGB0YWctJHtuYW1lLnRvTG93ZXJDYXNlKCl9YCwgbnVsbCk7XG4gIGNvbnN0IGluc2VydDogYW55ID0ge1xuICAgIF9rZXk6IGZvcm1hdElkLFxuICAgIGFkZGVkOiBub3csXG4gICAgZGVzY3JpcHRpb246IHBhcnNlVmFyQ2hhcihkZXNjcmlwdGlvbiwgNjQpLFxuICAgIG1vZGlmaWVkOiBub3csXG4gICAgbmFtZTogcGFyc2VWYXJDaGFyKG5hbWUsIDMyKVxuICB9O1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYElOU0VSVCAke2luc2VydH0gSU4gdGFncyBSRVRVUk4gTkVXYDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIHt9KSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkVGFnVG9JdGVtID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB7aXRlbURvY0lkLCB0YWdCeSwgdGFnRG9jSWR9OiB7aXRlbURvY0lkOiBzdHJpbmcsIHRhZ0J5Pzogc3RyaW5nLCB0YWdEb2NJZDogc3RyaW5nfVxuKTogUHJvbWlzZTxUYWdUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2FkZFRhZ1RvSXRlbSc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCBhZGRlZDogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgZm9ybWF0VGFnRG9jSWQ6IHN0cmluZyA9IHBhcnNlQXJhbmdvSWQodGFnRG9jSWQpO1xuICBjb25zdCBmb3JtYXRJdGVtRG9jSWQ6IHN0cmluZyA9IHBhcnNlQXJhbmdvSWQoaXRlbURvY0lkKTtcbiAgY29uc3QgZWRnZUlkOiBzdHJpbmcgPSBjcmVhdGVIYXNoKGBpc1RhZ2dlZC0ke2Zvcm1hdFRhZ0RvY0lkfS0ke2Zvcm1hdEl0ZW1Eb2NJZH1gLCBudWxsKTtcbiAgY29uc3QgZWRnZUNvbGxlY3Rpb246IEVkZ2VDb2xsZWN0aW9uID0gZGF0YWJhc2UuY29sbGVjdGlvbignaXNUYWdnZWQnKTtcbiAgY29uc3QgdHlwZTogc3RyaW5nID0gZm9ybWF0SXRlbURvY0lkLnNwbGl0KCcvJylbMF07XG4gIGNvbnN0IGZvcm1hdFRhZ0J5OiBzdHJpbmcgPSBwYXJzZUlkKHRhZ0J5KSB8fCBzZXNzaW9uSWQ7XG4gIGNvbnN0IGVkZ2U6IEVkZ2UgPSB7X2Zyb206IGZvcm1hdFRhZ0RvY0lkLCBfa2V5OiBlZGdlSWQsIF90bzogZm9ybWF0SXRlbURvY0lkLCBhZGRlZCwgdGFnQnk6IGZvcm1hdFRhZ0J5LCB0eXBlfTtcblxuICBhd2FpdCBlZGdlQ29sbGVjdGlvbi5zYXZlKGVkZ2UsIHtvdmVyd3JpdGVNb2RlOiAnaWdub3JlJywgcmV0dXJuTmV3OiB0cnVlLCBzaWxlbnQ6IHRydWV9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBlZGdlXG4gICAgICB9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwge30pKTtcblxuICBjb25zdCB0YWdRdWVyeTogQXFsUXVlcnkgPSBhcWxgTEVUIHQgPSBET0NVTUVOVCgke2Zvcm1hdFRhZ0RvY0lkfSkgUkVUVVJOIHRgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeSh0YWdRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgZWRnZVxuICAgICAgfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIHt9KSk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlVGFnID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHRhZzogVGFnVHlwZSk6IFByb21pc2U8VGFnVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICd1cGRhdGVUYWcnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICBjb25zdCB7ZGVzY3JpcHRpb24sIG5hbWUsIHRhZ0lkfSA9IHBhcnNlVGFnKHRhZyk7XG4gIGNvbnN0IGZvcm1hdE5hbWU6IHN0cmluZyA9IHBhcnNlVmFyQ2hhcihuYW1lLCAzMik7XG4gIGNvbnN0IHVwZGF0ZTogVGFnVHlwZSA9IHtcbiAgICBkZXNjcmlwdGlvbjogcGFyc2VWYXJDaGFyKGRlc2NyaXB0aW9uLCA2NCksXG4gICAgbW9kaWZpZWQ6IG5vdyxcbiAgICBuYW1lOiBmb3JtYXROYW1lXG4gIH07XG4gIGNvbnN0IG5ld1RhZ0tleTogc3RyaW5nID0gdGFnSWQgfHwgY3JlYXRlSGFzaChgdGFnLSR7Zm9ybWF0TmFtZS50b0xvd2VyQ2FzZSgpfWAsIG51bGwpO1xuICBjb25zdCBpbnNlcnQ6IFRhZ1R5cGUgPSB7XG4gICAgLi4udXBkYXRlLFxuICAgIF9pZDogYHRhZ3MvJHtuZXdUYWdLZXl9YCxcbiAgICBfa2V5OiBuZXdUYWdLZXksXG4gICAgYWRkZWQ6IG5vdyxcbiAgICB0YWdCeTogc2Vzc2lvbklkXG4gIH07XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBTRVJUIHtuYW1lOiAke2Zvcm1hdE5hbWV9fVxuICAgIElOU0VSVCAke2luc2VydH1cbiAgICBVUERBVEUgJHt1cGRhdGV9XG4gICAgSU4gdGFncyBSRVRVUk4gTkVXYDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIHt9KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVsZXRlVGFnID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIHRhZzogVGFnVHlwZSk6IFByb21pc2U8VGFnVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdkZWxldGVUYWcnO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SXRlbUlkID0gZ2V0RG9jSWQoJ3RhZ3MnLCB0YWcpO1xuICBjb25zdCB0YWdRdWVyeTogc3RyaW5nID0gYEZPUiBpdCBGUk9NIGlzVGFnZ2VkXG4gICAgRklMVEVSIGl0Ll9mcm9tID09IFwiJHtmb3JtYXRJdGVtSWR9XCIgfHwgaXQuX3RvID09IFwiJHtmb3JtYXRJdGVtSWR9XCJcbiAgICBSRU1PVkUgaXQgSU4gaXNUYWdnZWRcbiAgICBSRVRVUk4gT0xEYDtcblxuICBhd2FpdCBkYXRhYmFzZS5xdWVyeSh0YWdRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIHt9KSk7XG5cbiAgY29uc3QgYXFsUXJ5ID0gYExFVCB0ID0gRE9DVU1FTlQoJHtmb3JtYXRJdGVtSWR9KVxuICAgIFJFTU9WRSB0IElOIHRhZ3NcbiAgICBSRVRVUk4gT0xEYDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIHt9KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVsZXRlVGFnRnJvbUl0ZW0gPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwge3RhZ0RvY0lkLCBlZGdlRG9jSWR9KTogUHJvbWlzZTxUYWdUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdkZWxldGVUYWdGcm9tSXRlbSc7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRUYWdEb2NJZCA9IHBhcnNlQXJhbmdvSWQodGFnRG9jSWQpO1xuICBjb25zdCBmb3JtYXRFZGdlRG9jSWQgPSBwYXJzZUFyYW5nb0lkKGVkZ2VEb2NJZCk7XG4gIGNvbnN0IGVkZ2VDb2xsZWN0aW9uOiBFZGdlQ29sbGVjdGlvbiA9IGRhdGFiYXNlLmNvbGxlY3Rpb24oJ2lzVGFnZ2VkJyk7XG4gIGNvbnN0IGVkZ2UgPSB7X2lkOiBmb3JtYXRFZGdlRG9jSWR9O1xuXG4gIGF3YWl0IGVkZ2VDb2xsZWN0aW9uLnJlbW92ZShlZGdlLCB7c2lsZW50OiB0cnVlfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCB7fSkpO1xuXG4gIGNvbnN0IHRhZ1F1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBMRVQgdCA9IERPQ1VNRU5UKCR7Zm9ybWF0VGFnRG9jSWR9KSBSRVRVUk4gdGA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KHRhZ1F1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIHt9KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZXh0cmFjdFRhZ3MgPSAoY29udGVudDogc3RyaW5nKTogc3RyaW5nW10gPT5cbiAgd29yZHMoY29udGVudCwgLyNbYS16QS1aXFxkLV0rL2cpLm1hcCgodGFnOiBzdHJpbmcpID0+IHBhcnNlSWQodGFnKSk7XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVUYWdzSW5JdGVtID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHtpdGVtRG9jSWQsIHRhZ3N9KTogUHJvbWlzZTxUYWdUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ3VwZGF0ZVRhZ3NJbkl0ZW0nO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3QgZWRnZUNvbGxlY3Rpb24gPSBkYXRhYmFzZS5jb2xsZWN0aW9uKCdpc1RhZ2dlZCcpO1xuXG4gIHJldHVybiBlZGdlQ29sbGVjdGlvbi5pbkVkZ2VzKGl0ZW1Eb2NJZCwge30pXG4gICAgLnRoZW4oKGVkZ2VzOiBhbnkpID0+IFByb21pc2UuYWxsKFtcbiAgICAgIC4uLmVkZ2VzXG4gICAgICAgIC5maWx0ZXIoKHtuYW1lOiBleGlzdGluZ1RhZ05hbWV9KSA9PiAhdGFncy5maW5kKCh7bmFtZTogdGFnTmFtZX0pID0+IGV4aXN0aW5nVGFnTmFtZSA9PT0gdGFnTmFtZSkpXG4gICAgICAgIC5tYXAoKHtfaWQ6IGVkZ2VEb2NJZCwgX2Zyb206IHRhZ0RvY0lkfSkgPT5cbiAgICAgICAgICBkZWxldGVUYWdGcm9tSXRlbShjb250ZXh0LCB7dGFnRG9jSWQsIGVkZ2VEb2NJZH0pKSxcbiAgICAgIC4uLnRhZ3NcbiAgICAgICAgLmZpbHRlcigoe25hbWU6IHRhZ05hbWV9KSA9PiAhZWRnZXMuZmluZCgoe25hbWU6IGV4aXN0aW5nVGFnTmFtZX0pID0+IGV4aXN0aW5nVGFnTmFtZSA9PT0gdGFnTmFtZSkpXG4gICAgICAgIC5tYXAoKHtfaWQ6IHRhZ0RvY0lkLCB0YWdCeX0pID0+XG4gICAgICAgICAgYWRkVGFnVG9JdGVtKGNvbnRleHQsIHtpdGVtRG9jSWQsIHRhZ0J5LCB0YWdEb2NJZH0pKVxuICAgIF0pLnRoZW4oKCkgPT4gdGFncykpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwge30pKTtcbn07XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFJQSxtQkFBK0Q7QUFDL0Qsc0JBQWtCO0FBS2xCLG1CQUFrQjtBQUVsQix3QkFBdUI7QUFHdkIsbUJBQXlCO0FBRXpCLDRCQUF1QjtBQUN2QiwyQkFBaUM7QUFFakMsTUFBTSxnQkFBd0I7QUFRdkIsTUFBTSxVQUFVLENBQ3JCLFNBQ0EsVUFBc0IsQ0FBQyxNQUNBO0FBQ3ZCLFFBQU0sU0FBaUI7QUFDdkIsUUFBTSxFQUFDLFNBQVEsSUFBSTtBQUNuQixRQUFNLEVBQUMsU0FBUyxJQUFJLE9BQU8sR0FBRyxLQUFLLElBQUksT0FBTSxJQUFJO0FBQ2pELFFBQU0sWUFBdUIsK0JBQVMsTUFBTSxFQUFFO0FBRTlDLFFBQU0sVUFBb0IsQ0FBQztBQUUzQixNQUFHLFFBQVE7QUFDVCxZQUFRLEtBQUssa0JBQWtCLE1BQU0sS0FBSztBQUFBLEVBQzVDO0FBRUEsTUFBRyxRQUFRO0FBQ1QsWUFBUSxLQUFLLGdCQUFnQixNQUFNLEdBQUc7QUFB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QUFBQSxJQUNBLFVBQVU7QUFBQSxJQUNWLE9BQU8sd0JBQVc7QUFBQSxFQUNwQixHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFFZixRQUFNLFdBQXFCLHVDQUF1QixjQUFjO0FBRWhFLFNBQU8sU0FBUyxNQUFNLFFBQVEsRUFDM0IsS0FBSyxDQUFDLFdBQXdCLE9BQU8sS0FBSyxDQUFDLEVBQzNDLE1BQU0sQ0FBQyxjQUFpQixnQ0FBUztBQUFBLElBQ2hDO0FBQUEsSUFDQSxVQUFVO0FBQUEsSUFDVixPQUFPLHdCQUFXO0FBQUEsRUFDcEIsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ2pCO0FBRU8sTUFBTSxjQUFjLENBQUMsZ0JBQzFCLGFBQUFBLFNBQU0sU0FBUyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsWUFBZ0Isc0JBQVEsR0FBRyxDQUFDO0FBRTdELE1BQU0sbUJBQW1CLENBQUMsU0FBcUIsRUFBQyxXQUFXLEtBQUksTUFBMEI7QUFDOUYsUUFBTSxTQUFTO0FBQ2YsUUFBTSxFQUFDLFNBQVEsSUFBSTtBQUNuQixRQUFNLGlCQUFpQixTQUFTLFdBQVcsVUFBVTtBQUVyRCxTQUFPLGVBQWUsUUFBUSxXQUFXLENBQUMsQ0FBQyxFQUN4QyxLQUFLLENBQUMsVUFBZSxRQUFRLElBQUk7QUFBQSxJQUNoQyxHQUFHLE1BQ0EsT0FBTyxDQUFDLEVBQUMsTUFBTSxnQkFBZSxNQUFNLENBQUMsS0FBSyxLQUFLLENBQUMsRUFBQyxNQUFNLFFBQU8sTUFBTSxvQkFBb0IsT0FBTyxDQUFDLEVBQ2hHLElBQUksQ0FBQyxFQUFDLEtBQUssV0FBVyxPQUFPLFNBQVEsTUFDcEMsa0JBQWtCLFNBQVMsRUFBQyxVQUFVLFVBQVMsQ0FBQyxDQUFDO0FBQUEsSUFDckQsR0FBRyxLQUNBLE9BQU8sQ0FBQyxFQUFDLE1BQU0sUUFBTyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBQyxNQUFNLGdCQUFlLE1BQU0sb0JBQW9CLE9BQU8sQ0FBQyxFQUNqRyxJQUFJLENBQUMsRUFBQyxLQUFLLFVBQVUsTUFBSyxNQUN6QixhQUFhLFNBQVMsRUFBQyxXQUFXLE9BQU8sU0FBUSxDQUFDLENBQUM7QUFBQSxFQUN6RCxDQUFDLEVBQUUsS0FBSyxNQUFNLElBQUksQ0FBQyxFQUNsQixNQUFNLENBQUMsY0FBaUIsZ0NBQVM7QUFBQSxJQUNoQztBQUFBLElBQ0EsVUFBVTtBQUFBLElBQ1YsT0FBTyx3QkFBVztBQUFBLEVBQ3BCLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUNqQjsiLAogICJuYW1lcyI6IFsid29yZHMiXQp9Cg==
21
+ RETURN OLD`;return y(s).query(t).then(e=>e.next()).catch(e=>d({action:n,category:p,value:m.DATABASE_ERROR},e,{}))},B=async(o,{tagDocId:r,edgeDocId:n})=>{const s="deleteTagFromEdge",{databaseName:a}=o,g=u(r),t=u(n),e=y(a).collection("isTagged"),i={_id:t};await e.remove(i,{silent:!0}).catch(c=>d({action:s,category:p,value:m.DATABASE_ERROR},c,{}));const T=I`LET t = DOCUMENT(${g}) RETURN t`;return y(a).query(T).then(c=>c.next()).catch(c=>d({action:s,category:p,value:m.DATABASE_ERROR},c,{}))},W=async(o,{tagId:r,itemId:n,itemType:s})=>{const a="deleteTagFromItem",{databaseName:g}=o,t=u(`tags/${r}`),e=u(`${s}/${n}`),i=`FOR it FROM isTagged
22
+ FILTER it._from == "${t}" || it._to == "${e}"
23
+ REMOVE it IN isTagged`;return y(g).query(i).then(()=>!0).catch(T=>d({action:a,category:p,value:m.DATABASE_ERROR},T,{}))},z=o=>q(o,/#[a-zA-Z\d-]+/g).map(r=>D(r)),H=(o,{itemDocId:r,tags:n})=>{const s="updateTagsInItem",{databaseName:a}=o;return y(a).collection("isTagged").inEdges(r,{}).then(t=>Promise.all([...t.filter(({name:e})=>!n.find(({name:i})=>e===i)).map(({_id:e,_from:i})=>B(o,{edgeDocId:e,tagDocId:i})),...n.filter(({name:e})=>!t.find(({name:i})=>i===e)).map(({_id:e,tagBy:i})=>$(o,{itemDocId:r,tagBy:i,tagDocId:e}))]).then(()=>n)).catch(t=>d({action:s,category:p,value:m.DATABASE_ERROR},t,{}))};export{V as addTag,$ as addTagToItem,K as deleteTag,B as deleteTagFromEdge,W as deleteTagFromItem,z as extractTags,k as getTag,P as getTags,U as getTagsByItem,M as getTagsByName,j as updateTag,H as updateTagsInItem};
24
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvdGFncy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7Y3JlYXRlSGFzaCwgcGFyc2VBcmFuZ29JZCwgcGFyc2VJZCwgcGFyc2VWYXJDaGFyfSBmcm9tICdAbmxhYnMvdXRpbHMnO1xuaW1wb3J0IHthcWx9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQge0VkZ2V9IGZyb20gJ2FyYW5nb2pzL2RvY3VtZW50cyc7XG5pbXBvcnQgd29yZHMgZnJvbSAnbG9kYXNoL3dvcmRzJztcblxuaW1wb3J0IHtwYXJzZVRhZ30gZnJvbSAnLi4vYWRhcHRlcnMvdGFnQWRhcHRlcic7XG5pbXBvcnQge0Vycm9yVHlwZXN9IGZyb20gJy4uL3R5cGVzL2Vycm9yLnR5cGVzJztcbmltcG9ydCB7bG9nRXJyb3J9IGZyb20gJy4uL3V0aWxzL2FuYWx5dGljc1V0aWxzJztcbmltcG9ydCB7Z2V0RG9jSWQsIGdldExpbWl0LCB1c2VEYn0gZnJvbSAnLi4vdXRpbHMvYXJhbmdvZGJVdGlscyc7XG5cbmltcG9ydCB0eXBlIHtBcmFuZ29EYkxpbWl0fSBmcm9tICcuLi90eXBlcy9hcmFuZ29kYi50eXBlcyc7XG5pbXBvcnQgdHlwZSB7QXBpQ29udGV4dH0gZnJvbSAnLi4vdHlwZXMvYXV0aC50eXBlcyc7XG5pbXBvcnQgdHlwZSB7SXNUYWdnZWRUeXBlLCBUYWdUeXBlfSBmcm9tICcuLi90eXBlcy90YWdzLnR5cGVzJztcbmltcG9ydCB0eXBlIHtFZGdlQ29sbGVjdGlvbn0gZnJvbSAnYXJhbmdvanMvY29sbGVjdGlvbnMnO1xuXG5jb25zdCBldmVudENhdGVnb3J5OiBzdHJpbmcgPSAndGFncyc7XG5leHBvcnQgaW50ZXJmYWNlIFRhZ09wdGlvbnMge1xuICByZWFkb25seSBmcm9tPzogbnVtYmVyO1xuICByZWFkb25seSBzZWFyY2g/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRvPzogbnVtYmVyO1xuICByZWFkb25seSB1c2VySWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRUYWdzID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBvcHRpb25zOiBUYWdPcHRpb25zID0ge31cbik6IFByb21pc2U8VGFnVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldExpc3QnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtzZWFyY2ggPSAnJywgZnJvbSA9IDAsIHRvID0gMzAsIHVzZXJJZH0gPSBvcHRpb25zO1xuICBjb25zdCBsaW1pdDogQXJhbmdvRGJMaW1pdCA9IGdldExpbWl0KGZyb20sIHRvKTtcblxuICBjb25zdCBmaWx0ZXJzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmKHNlYXJjaCkge1xuICAgIGZpbHRlcnMucHVzaChgTElLRSh0Lm5hbWUsIFwiJSR7c2VhcmNofSVcIilgKTtcbiAgfVxuXG4gIGlmKHVzZXJJZCkge1xuICAgIGZpbHRlcnMucHVzaChgdC51c2VySWQgPT0gXCIke3VzZXJJZH1cImApO1xuICB9XG5cbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHQgSU4gdGFnc1xuICAgIEZJTFRFUiAke2ZpbHRlcnMuam9pbignIHx8ICcpfVxuICAgICR7bGltaXQuYXFsfVxuICAgIFNPUlQgdC5uYW1lXG4gICAgUkVUVVJOIHRgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBUYWdUeXBlW10pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCB7fSk7XG5cbiAgICAgIHJldHVybiBbXSBhcyBUYWdUeXBlW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VGFnc0J5SXRlbSA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaXRlbURvY0lkOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFRhZ09wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUYWdUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0VGFnc0J5SXRlbSc7XG4gIGNvbnN0IHtmcm9tID0gMCwgdG8gPSAzMH0gPSBvcHRpb25zO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGxpbWl0OiBBcmFuZ29EYkxpbWl0ID0gZ2V0TGltaXQoZnJvbSwgdG8pO1xuICBjb25zdCBmb3JtYXRJdGVtSWQ6IHN0cmluZyA9IHBhcnNlQXJhbmdvSWQoaXRlbURvY0lkKTtcbiAgY29uc3QgdGFnUXVlcnk6IHN0cmluZyA9IGBGT1IgdCwgaXQgSU4gSU5CT1VORCBcIiR7Zm9ybWF0SXRlbUlkfVwiIGlzVGFnZ2VkXG4gICAgJHtsaW1pdC5hcWx9XG4gICAgU09SVCBpdC5hZGRlZFxuICAgIFJFVFVSTiB0YDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeSh0YWdRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBUYWdUeXBlW10pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCB7fSk7XG5cbiAgICAgIHJldHVybiBbXSBhcyBUYWdUeXBlW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VGFnID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHRhZ0lkOiBzdHJpbmcpOiBQcm9taXNlPFRhZ1R5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0VGFnJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRJZDogc3RyaW5nID0gcGFyc2VJZCh0YWdJZCk7XG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiB0IElOIHRhZ3NcbiAgICBGSUxURVIgdC5fa2V5ID09IFwiJHtmb3JtYXRJZH1cIlxuICAgIExJTUlUIDFcbiAgICBSRVRVUk4gdGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwge30pKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUYWdzQnlOYW1lID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHRhZ05hbWVzOiBzdHJpbmdbXSk6IFByb21pc2U8VGFnVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldFRhZ3NCeU5hbWUnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdFRhZ05hbWVzID0gdGFnTmFtZXNcbiAgICAubWFwKCh0YWdOYW1lKSA9PiBwYXJzZVZhckNoYXIodGFnTmFtZSwgMzIpKVxuICAgIC5maWx0ZXIoKHRhZ05hbWUpID0+ICEhdGFnTmFtZSk7XG5cbiAgaWYoIWZvcm1hdFRhZ05hbWVzLmxlbmd0aCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuICB9XG5cbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgdCBJTiB0YWdzXG4gICAgRklMVEVSIFBPU0lUSU9OKCR7SlNPTi5zdHJpbmdpZnkoZm9ybWF0VGFnTmFtZXMpfSwgdC5uYW1lKVxuICAgIFJFVFVSTiB0YDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgVGFnVHlwZVtdKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwge30pO1xuXG4gICAgICByZXR1cm4gW10gYXMgVGFnVHlwZVtdO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZFRhZyA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB0YWc6IFRhZ1R5cGUpOiBQcm9taXNlPFRhZ1R5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnYWRkVGFnJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCBub3c6IG51bWJlciA9IERhdGUubm93KCk7XG4gIGNvbnN0IHtkZXNjcmlwdGlvbiwgbmFtZX0gPSBwYXJzZVRhZyh0YWcpO1xuICBjb25zdCBmb3JtYXRJZDogc3RyaW5nID0gY3JlYXRlSGFzaChgdGFnLSR7bmFtZS50b0xvd2VyQ2FzZSgpfWAsIG51bGwpO1xuICBjb25zdCBpbnNlcnQ6IFRhZ1R5cGUgPSB7XG4gICAgX2tleTogZm9ybWF0SWQsXG4gICAgYWRkZWQ6IG5vdyxcbiAgICBkZXNjcmlwdGlvbjogcGFyc2VWYXJDaGFyKGRlc2NyaXB0aW9uLCA2NCksXG4gICAgbW9kaWZpZWQ6IG5vdyxcbiAgICBuYW1lOiBwYXJzZVZhckNoYXIobmFtZSwgMzIpXG4gIH07XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgSU5TRVJUICR7aW5zZXJ0fSBJTiB0YWdzIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIHt9KSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkVGFnVG9JdGVtID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB7aXRlbURvY0lkLCB0YWdCeSwgdGFnRG9jSWR9OiB7aXRlbURvY0lkOiBzdHJpbmcsIHRhZ0J5Pzogc3RyaW5nLCB0YWdEb2NJZDogc3RyaW5nfVxuKTogUHJvbWlzZTxUYWdUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2FkZFRhZ1RvSXRlbSc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgYWRkZWQ6IG51bWJlciA9IERhdGUubm93KCk7XG4gIGNvbnN0IGZvcm1hdFRhZ0RvY0lkOiBzdHJpbmcgPSBwYXJzZUFyYW5nb0lkKHRhZ0RvY0lkKTtcbiAgY29uc3QgZm9ybWF0SXRlbURvY0lkOiBzdHJpbmcgPSBwYXJzZUFyYW5nb0lkKGl0ZW1Eb2NJZCk7XG4gIGNvbnN0IGVkZ2VJZDogc3RyaW5nID0gY3JlYXRlSGFzaChgaXNUYWdnZWQtJHtmb3JtYXRUYWdEb2NJZH0tJHtmb3JtYXRJdGVtRG9jSWR9YCwgbnVsbCk7XG4gIGNvbnN0IGVkZ2VDb2xsZWN0aW9uOiBFZGdlQ29sbGVjdGlvbiA9IHVzZURiKGRhdGFiYXNlTmFtZSkuY29sbGVjdGlvbignaXNUYWdnZWQnKTtcbiAgY29uc3QgdHlwZTogc3RyaW5nID0gZm9ybWF0SXRlbURvY0lkLnNwbGl0KCcvJylbMF07XG4gIGNvbnN0IGZvcm1hdFRhZ0J5OiBzdHJpbmcgPSBwYXJzZUlkKHRhZ0J5KSB8fCBzZXNzaW9uSWQ7XG4gIGNvbnN0IGVkZ2U6IEVkZ2UgPSB7X2Zyb206IGZvcm1hdFRhZ0RvY0lkLCBfa2V5OiBlZGdlSWQsIF90bzogZm9ybWF0SXRlbURvY0lkLCBhZGRlZCwgdGFnQnk6IGZvcm1hdFRhZ0J5LCB0eXBlfTtcblxuICBhd2FpdCBlZGdlQ29sbGVjdGlvbi5zYXZlKGVkZ2UsIHtvdmVyd3JpdGVNb2RlOiAnaWdub3JlJywgcmV0dXJuTmV3OiB0cnVlLCBzaWxlbnQ6IHRydWV9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBlZGdlXG4gICAgICB9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwge30pKTtcblxuICBjb25zdCB0YWdRdWVyeTogQXFsUXVlcnkgPSBhcWxgTEVUIHQgPSBET0NVTUVOVCgke2Zvcm1hdFRhZ0RvY0lkfSkgUkVUVVJOIHRgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KHRhZ1F1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIGVkZ2VcbiAgICAgIH0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCB7fSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZVRhZyA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB0YWc6IFRhZ1R5cGUpOiBQcm9taXNlPFRhZ1R5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAndXBkYXRlVGFnJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCBub3c6IG51bWJlciA9IERhdGUubm93KCk7XG4gIGNvbnN0IHtkZXNjcmlwdGlvbiwgbmFtZSwgdGFnSWR9ID0gcGFyc2VUYWcodGFnKTtcbiAgY29uc3QgZm9ybWF0TmFtZTogc3RyaW5nID0gcGFyc2VWYXJDaGFyKG5hbWUsIDMyKTtcbiAgY29uc3QgdXBkYXRlOiBUYWdUeXBlID0ge1xuICAgIGRlc2NyaXB0aW9uOiBwYXJzZVZhckNoYXIoZGVzY3JpcHRpb24sIDY0KSxcbiAgICBtb2RpZmllZDogbm93LFxuICAgIG5hbWU6IGZvcm1hdE5hbWVcbiAgfTtcbiAgY29uc3QgbmV3VGFnS2V5OiBzdHJpbmcgPSB0YWdJZCB8fCBjcmVhdGVIYXNoKGB0YWctJHtmb3JtYXROYW1lLnRvTG93ZXJDYXNlKCl9YCwgbnVsbCk7XG4gIGNvbnN0IGluc2VydDogVGFnVHlwZSA9IHtcbiAgICAuLi51cGRhdGUsXG4gICAgX2lkOiBgdGFncy8ke25ld1RhZ0tleX1gLFxuICAgIF9rZXk6IG5ld1RhZ0tleSxcbiAgICBhZGRlZDogbm93LFxuICAgIHRhZ0J5OiBzZXNzaW9uSWRcbiAgfTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBVUFNFUlQge25hbWU6ICR7Zm9ybWF0TmFtZX19XG4gICAgSU5TRVJUICR7aW5zZXJ0fVxuICAgIFVQREFURSAke3VwZGF0ZX1cbiAgICBJTiB0YWdzIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIHt9KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVsZXRlVGFnID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIHRhZzogVGFnVHlwZSk6IFByb21pc2U8VGFnVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdkZWxldGVUYWcnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdEl0ZW1JZCA9IGdldERvY0lkKCd0YWdzJywgdGFnKTtcbiAgY29uc3QgdGFnUXVlcnk6IHN0cmluZyA9IGBGT1IgaXQgRlJPTSBpc1RhZ2dlZFxuICAgIEZJTFRFUiBpdC5fZnJvbSA9PSBcIiR7Zm9ybWF0SXRlbUlkfVwiIHx8IGl0Ll90byA9PSBcIiR7Zm9ybWF0SXRlbUlkfVwiXG4gICAgUkVNT1ZFIGl0IElOIGlzVGFnZ2VkXG4gICAgUkVUVVJOIE9MRGA7XG5cbiAgYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeSh0YWdRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwge30pKTtcblxuICBjb25zdCBhcWxRcnkgPSBgTEVUIHQgPSBET0NVTUVOVCgke2Zvcm1hdEl0ZW1JZH0pXG4gICAgUkVNT1ZFIHQgSU4gdGFnc1xuICAgIFJFVFVSTiBPTERgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIHt9KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVsZXRlVGFnRnJvbUVkZ2UgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwge3RhZ0RvY0lkLCBlZGdlRG9jSWR9KTogUHJvbWlzZTxUYWdUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdkZWxldGVUYWdGcm9tRWRnZSc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0VGFnRG9jSWQgPSBwYXJzZUFyYW5nb0lkKHRhZ0RvY0lkKTtcbiAgY29uc3QgZm9ybWF0RWRnZURvY0lkID0gcGFyc2VBcmFuZ29JZChlZGdlRG9jSWQpO1xuICBjb25zdCBlZGdlQ29sbGVjdGlvbjogRWRnZUNvbGxlY3Rpb24gPSB1c2VEYihkYXRhYmFzZU5hbWUpLmNvbGxlY3Rpb24oJ2lzVGFnZ2VkJyk7XG4gIGNvbnN0IGVkZ2UgPSB7X2lkOiBmb3JtYXRFZGdlRG9jSWR9O1xuXG4gIGF3YWl0IGVkZ2VDb2xsZWN0aW9uLnJlbW92ZShlZGdlLCB7c2lsZW50OiB0cnVlfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCB7fSkpO1xuXG4gIGNvbnN0IHRhZ1F1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBMRVQgdCA9IERPQ1VNRU5UKCR7Zm9ybWF0VGFnRG9jSWR9KSBSRVRVUk4gdGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkodGFnUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCB7fSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZVRhZ0Zyb21JdGVtID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIHt0YWdJZCwgaXRlbUlkLCBpdGVtVHlwZX0pOiBQcm9taXNlPFRhZ1R5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2RlbGV0ZVRhZ0Zyb21JdGVtJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRUYWdEb2NJZCA9IHBhcnNlQXJhbmdvSWQoYHRhZ3MvJHt0YWdJZH1gKTtcbiAgY29uc3QgZm9ybWF0SXRlbURvY0lkID0gcGFyc2VBcmFuZ29JZChgJHtpdGVtVHlwZX0vJHtpdGVtSWR9YCk7XG5cbiAgY29uc3QgYXFsUXVlcnk6IHN0cmluZyA9IGBGT1IgaXQgRlJPTSBpc1RhZ2dlZFxuICAgIEZJTFRFUiBpdC5fZnJvbSA9PSBcIiR7Zm9ybWF0VGFnRG9jSWR9XCIgfHwgaXQuX3RvID09IFwiJHtmb3JtYXRJdGVtRG9jSWR9XCJcbiAgICBSRU1PVkUgaXQgSU4gaXNUYWdnZWRgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKCgpID0+IHRydWUpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwge30pKTtcbn07XG5cbmV4cG9ydCBjb25zdCBleHRyYWN0VGFncyA9IChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmdbXSA9PlxuICB3b3Jkcyhjb250ZW50LCAvI1thLXpBLVpcXGQtXSsvZykubWFwKCh0YWc6IHN0cmluZykgPT4gcGFyc2VJZCh0YWcpKTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZVRhZ3NJbkl0ZW0gPSAoY29udGV4dDogQXBpQ29udGV4dCwge2l0ZW1Eb2NJZCwgdGFnc30pOiBQcm9taXNlPFRhZ1R5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAndXBkYXRlVGFnc0luSXRlbSc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3QgZWRnZUNvbGxlY3Rpb24gPSB1c2VEYihkYXRhYmFzZU5hbWUpLmNvbGxlY3Rpb24oJ2lzVGFnZ2VkJykgYXMgRWRnZUNvbGxlY3Rpb248VGFnVHlwZT47XG5cbiAgcmV0dXJuIGVkZ2VDb2xsZWN0aW9uLmluRWRnZXMoaXRlbURvY0lkLCB7fSlcbiAgICAudGhlbigoZWRnZXMpID0+IFByb21pc2UuYWxsKFtcbiAgICAgIC4uLihlZGdlcyBhcyB1bmtub3duIGFzIElzVGFnZ2VkVHlwZVtdKVxuICAgICAgICAuZmlsdGVyKCh7bmFtZTogZXhpc3RpbmdUYWdOYW1lfSkgPT4gIXRhZ3MuZmluZCgoe25hbWU6IHRhZ05hbWV9KSA9PiBleGlzdGluZ1RhZ05hbWUgPT09IHRhZ05hbWUpKVxuICAgICAgICAubWFwKCh7X2lkOiBlZGdlRG9jSWQsIF9mcm9tOiB0YWdEb2NJZH0pID0+IGRlbGV0ZVRhZ0Zyb21FZGdlKGNvbnRleHQsIHtlZGdlRG9jSWQsIHRhZ0RvY0lkfSkpLFxuICAgICAgLi4uKHRhZ3MgYXMgdW5rbm93biBhcyBUYWdUeXBlW10pXG4gICAgICAgIC5maWx0ZXIoKHtuYW1lOiB0YWdOYW1lfSkgPT4gIShlZGdlcyBhcyB1bmtub3duIGFzIElzVGFnZ2VkVHlwZVtdKVxuICAgICAgICAgIC5maW5kKCh7bmFtZTogZXhpc3RpbmdUYWdOYW1lfSkgPT4gZXhpc3RpbmdUYWdOYW1lID09PSB0YWdOYW1lKSlcbiAgICAgICAgLm1hcCgoe19pZDogdGFnRG9jSWQsIHRhZ0J5fSkgPT4gYWRkVGFnVG9JdGVtKGNvbnRleHQsIHtpdGVtRG9jSWQsIHRhZ0J5LCB0YWdEb2NJZH0pKVxuICAgIF0pXG4gICAgICAudGhlbigoKSA9PiB0YWdzKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCB7fSkpO1xufTtcbiJdLAogICJtYXBwaW5ncyI6ICJBQUlBLE9BQVEsY0FBQUEsRUFBWSxpQkFBQUMsRUFBZSxXQUFBQyxFQUFTLGdCQUFBQyxNQUFtQixlQUMvRCxPQUFRLE9BQUFDLE1BQVUsV0FHbEIsT0FBT0MsTUFBVyxlQUVsQixPQUFRLFlBQUFDLE1BQWUseUJBQ3ZCLE9BQVEsY0FBQUMsTUFBaUIsdUJBQ3pCLE9BQVEsWUFBQUMsTUFBZSwwQkFDdkIsT0FBUSxZQUFBQyxFQUFVLFlBQUFDLEVBQVUsU0FBQUMsTUFBWSx5QkFPeEMsTUFBTUMsRUFBd0IsT0FRakJDLEVBQVUsQ0FDckJDLEVBQ0FDLEVBQXNCLENBQUMsSUFDQSxDQUN2QixNQUFNQyxFQUFpQixVQUNqQixDQUFD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L0IsR0FBZ0JuQyxFQUFRbUMsQ0FBRyxDQUFDLEVBRXZEZ0MsRUFBbUIsQ0FBQ3ZELEVBQXFCLENBQUMsVUFBQWMsRUFBVyxLQUFBMEMsQ0FBSSxJQUEwQixDQUM5RixNQUFNdEQsRUFBUyxtQkFDVCxDQUFDLGFBQUFDLENBQVksRUFBSUgsRUFHdkIsT0FGdUJILEVBQU1NLENBQVksRUFBRSxXQUFXLFVBQVUsRUFFMUMsUUFBUVcsRUFBVyxDQUFDLENBQUMsRUFDeEMsS0FBTTJDLEdBQVUsUUFBUSxJQUFJLENBQzNCLEdBQUlBLEVBQ0QsT0FBTyxDQUFDLENBQUMsS0FBTUMsQ0FBZSxJQUFNLENBQUNGLEVBQUssS0FBSyxDQUFDLENBQUMsS0FBTW5DLENBQU8sSUFBTXFDLElBQW9CckMsQ0FBTyxDQUFDLEVBQ2hHLElBQUksQ0FBQyxDQUFDLElBQUswQixFQUFXLE1BQU9qQixDQUFRLElBQU1nQixFQUFrQjlDLEVBQVMsQ0FBQyxVQUFBK0MsRUFBVyxTQUFBakIsQ0FBUSxDQUFDLENBQUMsRUFDL0YsR0FBSTBCLEVBQ0QsT0FBTyxDQUFDLENBQUMsS0FBTW5DLENBQU8sSUFBTSxDQUFFb0MsRUFDNUIsS0FBSyxDQUFDLENBQUMsS0FBTUMsQ0FBZSxJQUFNQSxJQUFvQnJDLENBQU8sQ0FBQyxFQUNoRSxJQUFJLENBQUMsQ0FBQyxJQUFLUyxFQUFVLE1BQUFELENBQUssSUFBTUQsRUFBYTVCLEVBQVMsQ0FBQyxVQUFBYyxFQUFXLE1BQUFlLEVBQU8sU0FBQUMsQ0FBUSxDQUFDLENBQUMsQ0FDeEYsQ0FBQyxFQUNFLEtBQUssSUFBTTBCLENBQUksQ0FBQyxFQUNsQixNQUFPNUMsR0FBaUJsQixFQUFTLENBQ2hDLE9BQUFRLEVBQ0EsU0FBVUosRUFDVixNQUFPTCxFQUFXLGNBQ3BCLEVBQUdtQixFQUFPLENBQUMsQ0FBQyxDQUFDLENBQ2pCIiwKICAibmFtZXMiOiBbImNyZWF0ZUhhc2giLCAicGFyc2VBcmFuZ29JZCIsICJwYXJzZUlkIiwgInBhcnNlVmFyQ2hhciIsICJhcWwiLCAid29yZHMiLCAicGFyc2VUYWciLCAiRXJyb3JUeXBlcyIsICJsb2dFcnJvciIsICJnZXREb2NJZCIsICJnZXRMaW1pdCIsICJ1c2VEYiIsICJldmVudENhdGVnb3J5IiwgImdldFRhZ3MiLCAiY29udGV4dCIsICJvcHRpb25zIiwgImFjdGlvbiIsICJkYXRhYmFzZU5hbWUiLCAic2VhcmNoIiwgImZyb20iLCAidG8iLCAidXNlcklkIiwgImxpbWl0IiwgImZpbHRlcnMiLCAiYXFsUXJ5IiwgImN1cnNvciIsICJlcnJvciIsICJnZXRUYWdzQnlJdGVtIiwgIml0ZW1Eb2NJZCIsICJ0YWdRdWVyeSIsICJnZXRUYWciLCAidGFnSWQiLCAiZ2V0VGFnc0J5TmFtZSIsICJ0YWdOYW1lcyIsICJmb3JtYXRUYWdOYW1lcyIsICJ0YWdOYW1lIiwgImFkZFRhZyIsICJ0YWciLCAibm93IiwgImRlc2NyaXB0aW9uIiwgIm5hbWUiLCAiaW5zZXJ0IiwgImFkZFRhZ1RvSXRlbSIsICJ0YWdCeSIsICJ0YWdEb2NJZCIsICJzZXNzaW9uSWQiLCAiYWRkZWQiLCAiZm9ybWF0VGFnRG9jSWQiLCAiZm9ybWF0SXRlbURvY0lkIiwgImVkZ2VJZCIsICJlZGdlQ29sbGVjdGlvbiIsICJ0eXBlIiwgImZvcm1hdFRhZ0J5IiwgImVkZ2UiLCAidXBkYXRlVGFnIiwgImZvcm1hdE5hbWUiLCAidXBkYXRlIiwgIm5ld1RhZ0tleSIsICJkZWxldGVUYWciLCAiZm9ybWF0SXRlbUlkIiwgImRlbGV0ZVRhZ0Zyb21FZGdlIiwgImVkZ2VEb2NJZCIsICJmb3JtYXRFZGdlRG9jSWQiLCAiZGVsZXRlVGFnRnJvbUl0ZW0iLCAiaXRlbUlkIiwgIml0ZW1UeXBlIiwgImFxbFF1ZXJ5IiwgImV4dHJhY3RUYWdzIiwgImNvbnRlbnQiLCAidXBkYXRlVGFnc0luSXRlbSIsICJ0YWdzIiwgImVkZ2VzIiwgImV4aXN0aW5nVGFnTmFtZSJdCn0K