@nlabs/reaktor 0.10.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 (314) hide show
  1. package/.env +1 -0
  2. package/.env.example +1 -0
  3. package/DATABASE_I18N_GUIDE.md +434 -0
  4. package/TEST_UTILITIES_GUIDE.md +360 -0
  5. package/coverage/index.html +46 -76
  6. package/index.js +1 -1
  7. package/jest.config.js +17 -0
  8. package/jest.setup.js +36 -0
  9. package/lex.config.cjs +2 -2
  10. package/lib/actions/apps.js +17 -239
  11. package/lib/actions/connections.js +6 -89
  12. package/lib/actions/content.js +17 -0
  13. package/lib/actions/conversations.js +19 -336
  14. package/lib/actions/dynamodb.js +2 -150
  15. package/lib/actions/email.js +2 -152
  16. package/lib/actions/files.js +5 -283
  17. package/lib/actions/groups.js +19 -259
  18. package/lib/actions/images.js +31 -700
  19. package/lib/actions/index.js +2 -66
  20. package/lib/actions/ios.js +9 -162
  21. package/lib/actions/locations.js +7 -122
  22. package/lib/actions/messages.js +21 -196
  23. package/lib/actions/notifications.js +2 -59
  24. package/lib/actions/payments.js +11 -464
  25. package/lib/actions/posts.js +75 -527
  26. package/lib/actions/profiles.js +8 -0
  27. package/lib/actions/reactions.js +25 -312
  28. package/lib/actions/s3.js +2 -133
  29. package/lib/actions/search.js +5 -90
  30. package/lib/actions/sms.js +2 -108
  31. package/lib/actions/statistics.js +6 -60
  32. package/lib/actions/subscriptions.js +12 -0
  33. package/lib/actions/tags.js +19 -287
  34. package/lib/actions/users.js +64 -764
  35. package/lib/actions/websockets.js +14 -158
  36. package/lib/adapters/arangoAdapter.js +2 -46
  37. package/lib/adapters/contentAdapter.js +2 -0
  38. package/lib/adapters/fileAdapter.js +2 -76
  39. package/lib/adapters/imageAdapter.js +2 -40
  40. package/lib/adapters/messageAdapter.js +2 -49
  41. package/lib/adapters/postAdapter.js +2 -70
  42. package/lib/adapters/reaktorAdapter.js +2 -44
  43. package/lib/adapters/tagAdapter.js +2 -50
  44. package/lib/adapters/userAdapter.js +2 -115
  45. package/lib/config.js +2 -125
  46. package/lib/handlers/graphqlHandler.js +2 -0
  47. package/lib/index.js +2 -66
  48. package/lib/lambdas/actions/websockets.js +14 -116
  49. package/lib/lambdas/authorizer.js +2 -67
  50. package/lib/lambdas/connection.js +2 -91
  51. package/lib/lambdas/utils/message.js +2 -42
  52. package/lib/lambdas/utils/websocket.js +2 -105
  53. package/lib/mocks/conversation.js +2 -35
  54. package/lib/mocks/file.js +2 -38
  55. package/lib/mocks/group.js +2 -47
  56. package/lib/mocks/image.js +2 -44
  57. package/lib/mocks/post.js +2 -55
  58. package/lib/mocks/tag.js +2 -37
  59. package/lib/mocks/user.js +2 -88
  60. package/lib/mutations/index.js +2 -26
  61. package/lib/mutations/locations.integration.js +2 -0
  62. package/lib/mutations/locations.js +2 -44
  63. package/lib/mutations/messages.integration.js +2 -0
  64. package/lib/mutations/messages.js +2 -86
  65. package/lib/mutations/posts.integration.js +2 -0
  66. package/lib/mutations/posts.js +2 -53
  67. package/lib/mutations/profiles.integration.js +2 -0
  68. package/lib/mutations/profiles.js +2 -0
  69. package/lib/mutations/reactions.integration.js +2 -0
  70. package/lib/mutations/reactions.js +2 -51
  71. package/lib/mutations/statistics.integration.js +2 -0
  72. package/lib/mutations/statistics.js +2 -39
  73. package/lib/mutations/subscriptions.integration.js +2 -0
  74. package/lib/mutations/subscriptions.js +2 -56
  75. package/lib/mutations/tags.integration.js +2 -0
  76. package/lib/mutations/tags.js +2 -120
  77. package/lib/mutations/users.integration.js +2 -0
  78. package/lib/mutations/users.js +2 -116
  79. package/lib/objectTypes/app.js +2 -173
  80. package/lib/objectTypes/bankAccount.js +2 -76
  81. package/lib/objectTypes/connection.js +2 -48
  82. package/lib/objectTypes/conversation.js +2 -77
  83. package/lib/objectTypes/creditCard.js +2 -86
  84. package/lib/objectTypes/document.js +2 -46
  85. package/lib/objectTypes/error.js +2 -46
  86. package/lib/objectTypes/external.js +2 -74
  87. package/lib/objectTypes/file.js +2 -100
  88. package/lib/objectTypes/filter.js +2 -43
  89. package/lib/objectTypes/group.js +2 -123
  90. package/lib/objectTypes/iapSubscription.js +2 -40
  91. package/lib/objectTypes/image.js +2 -129
  92. package/lib/objectTypes/index.js +2 -68
  93. package/lib/objectTypes/location.js +2 -109
  94. package/lib/objectTypes/message.js +2 -96
  95. package/lib/objectTypes/passcode.js +2 -42
  96. package/lib/objectTypes/plan.js +2 -95
  97. package/lib/objectTypes/post.js +2 -125
  98. package/lib/objectTypes/profile.js +2 -0
  99. package/lib/objectTypes/reaction.js +2 -61
  100. package/lib/objectTypes/relation.js +2 -49
  101. package/lib/objectTypes/search.js +2 -72
  102. package/lib/objectTypes/statistics.js +2 -39
  103. package/lib/objectTypes/subscription.js +2 -117
  104. package/lib/objectTypes/tag.js +2 -65
  105. package/lib/objectTypes/user.js +2 -144
  106. package/lib/queries/index.js +2 -33
  107. package/lib/queries/locations.integration.js +2 -0
  108. package/lib/queries/locations.js +2 -45
  109. package/lib/queries/messages.integration.js +2 -0
  110. package/lib/queries/messages.js +2 -52
  111. package/lib/queries/posts.integration.js +2 -0
  112. package/lib/queries/posts.js +2 -154
  113. package/lib/queries/reactions.integration.js +2 -0
  114. package/lib/queries/reactions.js +2 -56
  115. package/lib/queries/statistics.js +2 -39
  116. package/lib/queries/subscriptions.js +2 -44
  117. package/lib/queries/tags.integration.js +2 -0
  118. package/lib/queries/tags.js +2 -75
  119. package/lib/queries/users.integration.js +2 -0
  120. package/lib/queries/users.js +2 -64
  121. package/lib/templates/email/layout.js +3 -25
  122. package/lib/templates/email/passwordForgot.js +3 -25
  123. package/lib/templates/email/passwordRecovery.js +3 -25
  124. package/lib/templates/email/verifyEmail.js +3 -25
  125. package/lib/templates/email/welcome.js +3 -25
  126. package/lib/templates/sms/passwordForgot.js +2 -24
  127. package/lib/templates/sms/passwordRecovery.js +2 -24
  128. package/lib/templates/sms/verifyEmail.js +2 -24
  129. package/lib/templates/sms/verifyPhone.js +2 -24
  130. package/lib/templates/sms/welcome.js +2 -24
  131. package/lib/types/apps.types.js +2 -32
  132. package/lib/types/arangodb.types.js +1 -16
  133. package/lib/types/auth.types.js +1 -16
  134. package/lib/types/connections.types.js +1 -16
  135. package/lib/types/content.types.js +1 -0
  136. package/lib/types/conversations.types.js +1 -16
  137. package/lib/types/email.types.js +1 -16
  138. package/lib/types/error.types.js +2 -44
  139. package/lib/types/files.types.js +1 -16
  140. package/lib/types/google.types.js +1 -16
  141. package/lib/types/groups.types.js +1 -16
  142. package/lib/types/images.types.js +1 -16
  143. package/lib/types/index.js +2 -60
  144. package/lib/types/locations.types.js +1 -16
  145. package/lib/types/messages.types.js +1 -16
  146. package/lib/types/notifications.types.js +1 -16
  147. package/lib/types/payments.types.js +1 -16
  148. package/lib/types/posts.types.js +1 -16
  149. package/lib/types/profiles.types.js +1 -0
  150. package/lib/types/statistics.types.js +1 -16
  151. package/lib/types/tags.types.js +1 -16
  152. package/lib/types/users.types.js +1 -16
  153. package/lib/types/websockets.types.js +1 -16
  154. package/lib/utils/adapterUtils.js +2 -45
  155. package/lib/utils/analyticsUtils.js +2 -72
  156. package/lib/utils/arangodbUtils.js +5 -163
  157. package/lib/utils/authUtils.js +2 -0
  158. package/lib/utils/contextUtils.js +2 -0
  159. package/lib/utils/dbI18n.example.js +6 -0
  160. package/lib/utils/dbI18n.js +2 -0
  161. package/lib/utils/googleTranslate.js +2 -0
  162. package/lib/utils/graphqlUtils.js +2 -0
  163. package/lib/utils/index.js +2 -30
  164. package/lib/utils/languageDetection.js +2 -0
  165. package/lib/utils/localeUtils.example.js +2 -0
  166. package/lib/utils/localeUtils.js +2 -0
  167. package/lib/utils/middlewareUtils.js +2 -0
  168. package/lib/utils/sessionUtils.js +2 -0
  169. package/lib/utils/stripeUtils.js +2 -43
  170. package/lib/utils/templateUtils.js +2 -0
  171. package/lib/utils/testUtils.js +2 -0
  172. package/lib/utils/translationQueue.example.js +2 -0
  173. package/lib/utils/translationQueue.js +2 -0
  174. package/package.json +27 -24
  175. package/.prettierrc.js +0 -4
  176. package/lib/actions/apps.d.ts +0 -25
  177. package/lib/actions/connections.d.ts +0 -4
  178. package/lib/actions/conversations.d.ts +0 -14
  179. package/lib/actions/dynamodb.d.ts +0 -8
  180. package/lib/actions/email.d.ts +0 -5
  181. package/lib/actions/files.d.ts +0 -19
  182. package/lib/actions/groups.d.ts +0 -14
  183. package/lib/actions/images.d.ts +0 -26
  184. package/lib/actions/index.d.ts +0 -23
  185. package/lib/actions/ios.d.ts +0 -7
  186. package/lib/actions/locations.d.ts +0 -6
  187. package/lib/actions/messages.d.ts +0 -14
  188. package/lib/actions/notifications.d.ts +0 -5
  189. package/lib/actions/payments.d.ts +0 -10
  190. package/lib/actions/personas.d.ts +0 -3
  191. package/lib/actions/personas.js +0 -110
  192. package/lib/actions/posts.d.ts +0 -22
  193. package/lib/actions/reactions.d.ts +0 -30
  194. package/lib/actions/s3.d.ts +0 -7
  195. package/lib/actions/search.d.ts +0 -3
  196. package/lib/actions/sms.d.ts +0 -9
  197. package/lib/actions/statistics.d.ts +0 -3
  198. package/lib/actions/subscription.d.ts +0 -7
  199. package/lib/actions/subscription.js +0 -208
  200. package/lib/actions/tags.d.ts +0 -34
  201. package/lib/actions/users.d.ts +0 -72
  202. package/lib/actions/websockets.d.ts +0 -20
  203. package/lib/adapters/arangoAdapter.d.ts +0 -2
  204. package/lib/adapters/fileAdapter.d.ts +0 -3
  205. package/lib/adapters/imageAdapter.d.ts +0 -2
  206. package/lib/adapters/messageAdapter.d.ts +0 -2
  207. package/lib/adapters/postAdapter.d.ts +0 -2
  208. package/lib/adapters/reaktorAdapter.d.ts +0 -6
  209. package/lib/adapters/tagAdapter.d.ts +0 -2
  210. package/lib/adapters/userAdapter.d.ts +0 -2
  211. package/lib/config.d.ts +0 -20
  212. package/lib/index.d.ts +0 -12
  213. package/lib/lambdas/actions/websockets.d.ts +0 -7
  214. package/lib/lambdas/authorizer.d.ts +0 -20
  215. package/lib/lambdas/connection.d.ts +0 -12
  216. package/lib/lambdas/utils/message.d.ts +0 -1
  217. package/lib/lambdas/utils/websocket.d.ts +0 -7
  218. package/lib/mocks/conversation.d.ts +0 -8
  219. package/lib/mocks/file.d.ts +0 -11
  220. package/lib/mocks/group.d.ts +0 -17
  221. package/lib/mocks/image.d.ts +0 -3
  222. package/lib/mocks/post.d.ts +0 -38
  223. package/lib/mocks/tag.d.ts +0 -2
  224. package/lib/mocks/user.d.ts +0 -4
  225. package/lib/mutations/index.d.ts +0 -3
  226. package/lib/mutations/locations.d.ts +0 -2
  227. package/lib/mutations/messages.d.ts +0 -2
  228. package/lib/mutations/personas.d.ts +0 -2
  229. package/lib/mutations/personas.js +0 -100
  230. package/lib/mutations/posts.d.ts +0 -2
  231. package/lib/mutations/reactions.d.ts +0 -2
  232. package/lib/mutations/statistics.d.ts +0 -2
  233. package/lib/mutations/subscriptions.d.ts +0 -2
  234. package/lib/mutations/tags.d.ts +0 -2
  235. package/lib/mutations/users.d.ts +0 -1
  236. package/lib/objectTypes/app.d.ts +0 -3
  237. package/lib/objectTypes/bankAccount.d.ts +0 -1
  238. package/lib/objectTypes/connection.d.ts +0 -1
  239. package/lib/objectTypes/conversation.d.ts +0 -2
  240. package/lib/objectTypes/creditCard.d.ts +0 -1
  241. package/lib/objectTypes/document.d.ts +0 -1
  242. package/lib/objectTypes/error.d.ts +0 -1
  243. package/lib/objectTypes/external.d.ts +0 -1
  244. package/lib/objectTypes/file.d.ts +0 -2
  245. package/lib/objectTypes/filter.d.ts +0 -1
  246. package/lib/objectTypes/group.d.ts +0 -3
  247. package/lib/objectTypes/iapSubscription.d.ts +0 -1
  248. package/lib/objectTypes/image.d.ts +0 -2
  249. package/lib/objectTypes/index.d.ts +0 -24
  250. package/lib/objectTypes/location.d.ts +0 -2
  251. package/lib/objectTypes/message.d.ts +0 -2
  252. package/lib/objectTypes/passcode.d.ts +0 -1
  253. package/lib/objectTypes/persona.d.ts +0 -3
  254. package/lib/objectTypes/persona.js +0 -87
  255. package/lib/objectTypes/plan.d.ts +0 -2
  256. package/lib/objectTypes/post.d.ts +0 -2
  257. package/lib/objectTypes/reaction.d.ts +0 -2
  258. package/lib/objectTypes/relation.d.ts +0 -1
  259. package/lib/objectTypes/search.d.ts +0 -1
  260. package/lib/objectTypes/statistics.d.ts +0 -1
  261. package/lib/objectTypes/subscription.d.ts +0 -2
  262. package/lib/objectTypes/tag.d.ts +0 -2
  263. package/lib/objectTypes/user.d.ts +0 -4
  264. package/lib/queries/index.d.ts +0 -3
  265. package/lib/queries/locations.d.ts +0 -2
  266. package/lib/queries/messages.d.ts +0 -2
  267. package/lib/queries/posts.d.ts +0 -2
  268. package/lib/queries/reactions.d.ts +0 -2
  269. package/lib/queries/statistics.d.ts +0 -2
  270. package/lib/queries/subscriptions.d.ts +0 -2
  271. package/lib/queries/tags.d.ts +0 -2
  272. package/lib/queries/users.d.ts +0 -1
  273. package/lib/templates/email/layout.d.ts +0 -2
  274. package/lib/templates/email/passwordForgot.d.ts +0 -2
  275. package/lib/templates/email/passwordRecovery.d.ts +0 -2
  276. package/lib/templates/email/verifyEmail.d.ts +0 -2
  277. package/lib/templates/email/welcome.d.ts +0 -2
  278. package/lib/templates/sms/passwordForgot.d.ts +0 -2
  279. package/lib/templates/sms/passwordRecovery.d.ts +0 -2
  280. package/lib/templates/sms/verifyEmail.d.ts +0 -2
  281. package/lib/templates/sms/verifyPhone.d.ts +0 -2
  282. package/lib/templates/sms/welcome.d.ts +0 -2
  283. package/lib/types/apps.types.d.ts +0 -46
  284. package/lib/types/arangodb.types.d.ts +0 -34
  285. package/lib/types/auth.types.d.ts +0 -9
  286. package/lib/types/connections.types.d.ts +0 -5
  287. package/lib/types/conversations.types.d.ts +0 -27
  288. package/lib/types/email.types.d.ts +0 -13
  289. package/lib/types/error.types.d.ts +0 -20
  290. package/lib/types/files.types.d.ts +0 -23
  291. package/lib/types/google.types.d.ts +0 -29
  292. package/lib/types/groups.types.d.ts +0 -18
  293. package/lib/types/images.types.d.ts +0 -52
  294. package/lib/types/index.d.ts +0 -20
  295. package/lib/types/locations.types.d.ts +0 -18
  296. package/lib/types/messages.types.d.ts +0 -16
  297. package/lib/types/notifications.types.d.ts +0 -19
  298. package/lib/types/payments.types.d.ts +0 -109
  299. package/lib/types/personas.types.d.ts +0 -32
  300. package/lib/types/personas.types.js +0 -16
  301. package/lib/types/posts.types.d.ts +0 -28
  302. package/lib/types/statistics.types.d.ts +0 -3
  303. package/lib/types/tags.types.d.ts +0 -15
  304. package/lib/types/users.types.d.ts +0 -79
  305. package/lib/types/websockets.types.d.ts +0 -18
  306. package/lib/utils/adapterUtils.d.ts +0 -1
  307. package/lib/utils/analyticsUtils.d.ts +0 -21
  308. package/lib/utils/arangodbUtils.d.ts +0 -66
  309. package/lib/utils/auth.d.ts +0 -21
  310. package/lib/utils/auth.js +0 -57
  311. package/lib/utils/index.d.ts +0 -5
  312. package/lib/utils/session.d.ts +0 -18
  313. package/lib/utils/session.js +0 -60
  314. package/lib/utils/stripeUtils.d.ts +0 -3
@@ -1,350 +1,33 @@
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 conversations_exports = {};
29
- __export(conversations_exports, {
30
- addDirectConversation: () => addDirectConversation,
31
- addUserToConversation: () => addUserToConversation,
32
- deleteUserFromConversation: () => deleteUserFromConversation,
33
- getConnectionUsers: () => getConnectionUsers,
34
- getConversation: () => getConversation,
35
- getConversationUsers: () => getConversationUsers,
36
- getConversations: () => getConversations,
37
- getDirectConversation: () => getDirectConversation,
38
- parseConversationOptions: () => parseConversationOptions,
39
- updateConversation: () => updateConversation
40
- });
41
- module.exports = __toCommonJS(conversations_exports);
42
- var import_utils = require("@nlabs/utils");
43
- var import_arangojs = require("arangojs");
44
- var import_cloneDeep = __toESM(require("lodash/cloneDeep"), 1);
45
- var import_images = require("./images");
46
- var import_users = require("./users");
47
- var import_config = require("../config");
48
- var import_error = require("../types/error.types");
49
- var import_analyticsUtils = require("../utils/analyticsUtils");
50
- var import_arangodbUtils = require("../utils/arangodbUtils");
51
- const eventCategory = "conversations";
52
- const parseConversationOptions = (options = {}) => {
53
- const {
54
- from = 0,
55
- to = 30
56
- } = options;
57
- return {
58
- limit: (0, import_arangodbUtils.getLimit)(from, to)
59
- };
60
- };
61
- const getConversations = (context, userId, options) => {
62
- const action = "getConversations";
63
- const { database } = context;
64
- const { limit } = parseConversationOptions(options);
65
- const userDocId = `users/${userId}`;
66
- const aqlQry = `FOR c, e IN 1..1 OUTBOUND "${userDocId}" hasConversation
67
- ${limit.aql}
1
+ import{createHash as T,parseId as v}from"@nlabs/utils";import{aql as R}from"arangojs";import O from"lodash/cloneDeep";import{getImageUrl as q}from"./images";import{getDisplayName as _,getUser as N}from"./users";import{Config as b}from"../config";import{ErrorTypes as C}from"../types/error.types";import{logError as I}from"../utils/analyticsUtils";import{getLimit as P,sortIds as A,useDb as y}from"../utils/arangodbUtils";const g="conversations",Q=(e={})=>{const{from:n=0,to:a=30}=e;return{limit:P(n,a)}},G=(e,n,a)=>{const i="getConversations",{databaseName:c}=e,{limit:u}=Q(a),o=`users/${n}`,t=`FOR c, e IN 1..1 OUTBOUND "${o}" hasConversation
2
+ ${u.aql}
68
3
  LET users = (
69
4
  FOR u, uc IN 1..1 INBOUND c._id hasConversation
70
- FILTER u._id != "${userDocId}"
5
+ FILTER u._id != "${o}"
71
6
  RETURN u
72
7
  )
73
- RETURN MERGE(c, {users: users})`;
74
- return database.query(aqlQry).then((cursor) => cursor.all()).catch((error) => {
75
- (0, import_analyticsUtils.logError)({
76
- action,
77
- category: eventCategory,
78
- label: import_error.ErrorTypes.DATABASE_ERROR
79
- }, error, context);
80
- return [];
81
- });
82
- };
83
- const getDirectConversation = async (context, {
84
- fromId,
85
- toId,
86
- toUser
87
- }) => {
88
- const action = "getDirectConversation";
89
- const { database } = context;
90
- try {
91
- const formatFromId = (0, import_utils.parseId)(fromId);
92
- const formatToId = (0, import_utils.parseId)(toId);
93
- const userIds = [formatFromId, formatToId];
94
- const sortedUserIds = (0, import_arangodbUtils.sortIds)(userIds);
95
- const conversationId = (0, import_utils.createHash)(`conversations-${sortedUserIds.join("-")}`, null);
96
- const user = toUser || await (0, import_users.getUser)(context, { userId: formatToId });
97
- const aqlQry = import_arangojs.aql`LET c = DOCUMENT(${`conversations/${conversationId}`}) RETURN c`;
98
- const conversation = await database.query(aqlQry).then((cursor) => cursor.next()).catch((error) => (0, import_analyticsUtils.logError)({
99
- action,
100
- category: eventCategory,
101
- label: import_error.ErrorTypes.DATABASE_ERROR
102
- }, error, context));
103
- if (conversation) {
104
- return { ...conversation, users: [user] };
105
- }
106
- return addDirectConversation(context, { fromId, toId, toUser: user });
107
- } catch (databaseError) {
108
- return (0, import_analyticsUtils.logError)({
109
- action,
110
- category: eventCategory,
111
- label: import_error.ErrorTypes.DATABASE_ERROR
112
- }, databaseError, context);
113
- }
114
- };
115
- const addDirectConversation = async (context, {
116
- fromId,
117
- toId,
118
- toUser
119
- }) => {
120
- const action = "getDirectConversation";
121
- const { database } = context;
122
- try {
123
- const formatFromId = (0, import_utils.parseId)(fromId);
124
- const formatToId = (0, import_utils.parseId)(toId);
125
- const userIds = [formatFromId, formatToId];
126
- const sortedUserIds = (0, import_arangodbUtils.sortIds)([formatFromId, formatToId]);
127
- const user = toUser || await (0, import_users.getUser)(context, { userId: formatToId });
128
- const conversationId = (0, import_utils.createHash)(`conversations-${sortedUserIds.join("-")}`, null);
129
- const now = Date.now();
130
- const insert = {
131
- _key: conversationId,
132
- added: now,
133
- isDirect: true,
134
- modified: now
135
- };
136
- const insertQuery = import_arangojs.aql`INSERT ${insert} IN conversations RETURN NEW`;
137
- const updatedConversation = await database.query(insertQuery).then((cursor) => cursor.next());
138
- await Promise.all(userIds.map((userId) => {
139
- const edgeId = (0, import_utils.createHash)(`hasConversation-${userId}-${conversationId}`);
140
- const edge = {
141
- _from: `users/${userId}`,
142
- _key: edgeId,
143
- _to: `conversations/${conversationId}`,
144
- added: Date.now()
145
- };
146
- const insertEdgeQuery = import_arangojs.aql`INSERT ${edge} IN hasConversation RETURN NEW`;
147
- return database.query(insertEdgeQuery);
148
- }));
149
- return { ...updatedConversation, users: [user] };
150
- } catch (databaseError) {
151
- (0, import_analyticsUtils.logError)({
152
- action,
153
- category: eventCategory,
154
- label: import_error.ErrorTypes.DATABASE_ERROR
155
- }, databaseError, context);
156
- return {};
157
- }
158
- };
159
- const getConnectionUsers = (context, {
160
- conversationId,
161
- includeAll = false,
162
- isDirect
163
- }) => {
164
- const action = "getConnectionUsers";
165
- const { database, session: { userId: sessionUserId } } = context;
166
- const filters = ["c.userId == u._key"];
167
- if (!includeAll) {
168
- filters.push(`u._key != ${sessionUserId}`);
169
- }
170
- if (isDirect) {
171
- filters.push(`p.vertices[0].isDirect == ${isDirect}`);
172
- }
173
- const aqlQry = import_arangojs.aql`FOR u, e,p IN 1..1 INBOUND ${`conversations/${conversationId}`} hasConversation
8
+ RETURN MERGE(c, {users: users})`;return y(c).query(t).then(s=>s.all()).catch(s=>(I({action:i,category:g,label:C.DATABASE_ERROR},s,e),[]))},H=async(e,{fromId:n,toId:a,toUser:i})=>{const c="getDirectConversation",{databaseName:u}=e;try{const o=v(n),t=v(a),r=A([o,t]),d=T(`conversations-${r.join("-")}`,null),m=i||await N(e,{userId:t}),l=R`LET c = DOCUMENT(${`conversations/${d}`}) RETURN c`,p=await y(u).query(l).then(E=>E.next()).catch(E=>I({action:c,category:g,label:C.DATABASE_ERROR},E,e));return p?{...p,users:[m]}:F(e,{fromId:n,toId:a,toUser:m})}catch(o){return I({action:c,category:g,label:C.DATABASE_ERROR},o,e)}},F=async(e,{fromId:n,toId:a,toUser:i})=>{const c="getDirectConversation",{databaseName:u}=e;try{const o=v(n),t=v(a),s=[o,t],r=A([o,t]),d=i||await N(e,{userId:t}),m=T(`conversations-${r.join("-")}`,null),l=Date.now(),E=R`INSERT ${{_key:m,added:l,isDirect:!0,modified:l}} IN conversations RETURN NEW`,h=await y(u).query(E).then(U=>U.next());return await Promise.all(s.map(U=>{const D=T(`hasConversation-${U}-${m}`),$={_from:`users/${U}`,_key:D,_to:`conversations/${m}`,added:Date.now()},f=R`INSERT ${$} IN hasConversation RETURN NEW`;return y(u).query(f)})),{...h,users:[d]}}catch(o){return I({action:c,category:g,label:C.DATABASE_ERROR},o,e),{}}},V=(e,{conversationId:n,includeAll:a=!1,isDirect:i})=>{const c="getConnectionUsers",{databaseName:u,session:{userId:o}}=e,t=["c.userId == u._key"];a||t.push(`u._key != ${o}`),i&&t.push(`p.vertices[0].isDirect == ${i}`);const s=R`FOR u, e,p IN 1..1 INBOUND ${`conversations/${n}`} hasConversation
174
9
  OPTIONS {vertexCollections: "users"}
175
10
  FOR c IN connections
176
- FILTER ${filters.join(" && ")}
177
- RETURN c`;
178
- return database.query(aqlQry).then((cursor) => cursor.all()).catch((error) => {
179
- (0, import_analyticsUtils.logError)({
180
- action,
181
- category: eventCategory,
182
- label: import_error.ErrorTypes.DATABASE_ERROR
183
- }, error, context);
184
- return [];
185
- });
186
- };
187
- const getConversationUsers = (context, {
188
- conversationId,
189
- includeAll = false,
190
- isDirect
191
- }) => {
192
- const action = "getConversationUsers";
193
- const { database, session: { userId: sessionUserId } } = context;
194
- const filters = ["c.userId == u._key"];
195
- if (!includeAll) {
196
- filters.push(`u._key != ${sessionUserId}`);
197
- }
198
- if (isDirect) {
199
- filters.push(`p.vertices[0].isDirect == ${isDirect}`);
200
- }
201
- const aqlQry = import_arangojs.aql`FOR u, e,p IN 1..1 INBOUND ${`conversations/${conversationId}`} hasConversation
11
+ FILTER ${t.join(" && ")}
12
+ RETURN c`;return y(u).query(s).then(r=>r.all()).catch(r=>(I({action:c,category:g,label:C.DATABASE_ERROR},r,e),[]))},z=(e,{conversationId:n,includeAll:a=!1,isDirect:i})=>{const c="getConversationUsers",{databaseName:u,session:{userId:o}}=e,t=["c.userId == u._key"];a||t.push(`u._key != ${o}`),i&&t.push(`p.vertices[0].isDirect == ${i}`);const s=R`FOR u, e,p IN 1..1 INBOUND ${`conversations/${n}`} hasConversation
202
13
  OPTIONS {vertexCollections: "users"}
203
- FILTER ${filters.join(" && ")}
204
- RETURN u`;
205
- return database.query(aqlQry).then((cursor) => cursor.all()).catch((error) => {
206
- (0, import_analyticsUtils.logError)({
207
- action,
208
- category: eventCategory,
209
- label: import_error.ErrorTypes.DATABASE_ERROR
210
- }, error, context);
211
- return [];
212
- });
213
- };
214
- const getConversation = (context, conversationId) => {
215
- const action = "getItem";
216
- const { database, session: { userId: sessionId } } = context;
217
- const sessionDocId = `users/${sessionId}`;
218
- const conversationDocId = `conversations/${(0, import_utils.parseId)(conversationId)}`;
219
- const aqlQry = import_arangojs.aql`FOR c, e IN 1..1 OUTBOUND ${sessionDocId} hasConversation
220
- FILTER c._id == ${conversationDocId}
14
+ FILTER ${t.join(" && ")}
15
+ RETURN u`;return y(u).query(s).then(r=>r.all()).catch(r=>(I({action:c,category:g,label:C.DATABASE_ERROR},r,e),[]))},J=(e,n)=>{const a="getItem",{databaseName:i,session:{userId:c}}=e,u=`users/${c}`,o=`conversations/${v(n)}`,t=R`FOR c, e IN 1..1 OUTBOUND ${u} hasConversation
16
+ FILTER c._id == ${o}
221
17
  LET u = (
222
- FOR inUser, inEdge IN 1..1 INBOUND ${conversationDocId} hasConversation
18
+ FOR inUser, inEdge IN 1..1 INBOUND ${o} hasConversation
223
19
  RETURN inUser
224
20
  )
225
21
  LIMIT 1
226
- RETURN MERGE(c, {users: u})`;
227
- return database.query(aqlQry).then((cursor) => cursor.next()).then((conversation) => {
228
- if (!conversation) {
229
- return {};
230
- }
231
- conversation.users = conversation.users.map((user) => {
232
- const { imageId, userId } = user;
233
- const thumbUrlData = {
234
- bucket: import_config.Config.get("aws.s3.Bucket"),
235
- imageDir: "thumbs",
236
- imageId,
237
- type: "users",
238
- typeId: userId
239
- };
240
- return {
241
- ...user,
242
- name: (0, import_users.getDisplayName)(user),
243
- thumb: (0, import_images.getImageUrl)(thumbUrlData)
244
- };
245
- });
246
- return conversation;
247
- }).catch((error) => (0, import_analyticsUtils.logError)({
248
- action,
249
- category: eventCategory,
250
- label: import_error.ErrorTypes.DATABASE_ERROR
251
- }, error, context));
252
- };
253
- const updateConversation = (context, conversation) => {
254
- const action = "updateConversation";
255
- const { database, session: { userId: sessionId } } = context;
256
- const {
257
- conversationId = (0, import_utils.createHash)(`conversation-${sessionId} `),
258
- isDirect = false,
259
- name
260
- } = conversation;
261
- const formatConversationId = (0, import_utils.parseId)(conversationId);
262
- const now = Date.now();
263
- const update = {
264
- isDirect,
265
- modified: now,
266
- name
267
- };
268
- const insert = {
269
- ...(0, import_cloneDeep.default)(update),
270
- _key: formatConversationId,
271
- added: now
272
- };
273
- const aqlQry = import_arangojs.aql`UPSERT {_key: ${formatConversationId} }
274
- INSERT ${insert}
275
- UPDATE ${update}
276
- IN conversations RETURN NEW`;
277
- return database.query(aqlQry).then((cursor) => cursor.next()).then((conversation2) => conversation2).catch((error) => (0, import_analyticsUtils.logError)({
278
- action,
279
- category: eventCategory,
280
- label: import_error.ErrorTypes.DATABASE_ERROR
281
- }, error, context));
282
- };
283
- const addUserToConversation = (context, {
284
- conversationId,
285
- userId
286
- }) => {
287
- const action = "addUserToConversation";
288
- const { database } = context;
289
- const formatConversationId = (0, import_utils.parseId)(conversationId);
290
- const formatUserId = (0, import_utils.parseId)(userId);
291
- const conversationDocId = `conversations/${formatConversationId}`;
292
- const userDocId = `users/${formatUserId}`;
293
- const aqlQry = import_arangojs.aql`FOR hc IN hasConversation
294
- FILTER hc._from == ${userDocId} && hc._to == ${conversationDocId}
22
+ RETURN MERGE(c, {users: u})`;return y(i).query(t).then(s=>s.next()).then(s=>s?(s.users=s.users.map(r=>{const{imageId:d,userId:m}=r,l={bucket:b.get("aws.s3.Bucket"),imageDir:"thumbs",imageId:d,type:"users",typeId:m};return{...r,name:_(r),thumb:q(l)}}),s):{}).catch(s=>I({action:a,category:g,label:C.DATABASE_ERROR},s,e))},K=(e,n)=>{const a="updateConversation",{databaseName:i,session:{userId:c}}=e,{conversationId:u=T(`conversation-${c} `),isDirect:o=!1,name:t}=n,s=v(u),r=Date.now(),d={isDirect:o,modified:r,name:t},m={...O(d),_key:s,added:r},l=R`UPSERT {_key: ${s} }
23
+ INSERT ${m}
24
+ UPDATE ${d}
25
+ IN conversations RETURN NEW`;return y(i).query(l).then(p=>p.next()).then(p=>p).catch(p=>I({action:a,category:g,label:C.DATABASE_ERROR},p,e))},X=(e,{conversationId:n,userId:a})=>{const i="addUserToConversation",{databaseName:c}=e,u=v(n),o=v(a),t=`conversations/${u}`,s=`users/${o}`,r=R`FOR hc IN hasConversation
26
+ FILTER hc._from == ${s} && hc._to == ${t}
295
27
  LIMIT 1
296
- RETURN hc`;
297
- return database.query(aqlQry).then((cursor) => cursor.next()).then((hasConversationEdge) => {
298
- if (!!hasConversationEdge) {
299
- return hasConversationEdge;
300
- }
301
- const edgeCollection = database.collection("hasConversation");
302
- const edgeId = (0, import_utils.createHash)(`convo - ${formatConversationId} -${formatUserId} `);
303
- const edge = {
304
- _from: userDocId,
305
- _key: edgeId,
306
- _to: conversationDocId,
307
- added: Date.now()
308
- };
309
- return edgeCollection.save(edge, { returnNew: true }).then(() => edge);
310
- }).catch((error) => (0, import_analyticsUtils.logError)({
311
- action,
312
- category: eventCategory,
313
- label: import_error.ErrorTypes.DATABASE_ERROR
314
- }, error, context));
315
- };
316
- const deleteUserFromConversation = (context, {
317
- conversationId,
318
- userId
319
- }) => {
320
- const action = "deleteUserFromConversation";
321
- const { database } = context;
322
- const formatConversationId = (0, import_utils.parseId)(conversationId);
323
- const formatUserId = (0, import_utils.parseId)(userId);
324
- const conversationDocId = `conversations/${formatConversationId}`;
325
- const userDocId = `users/${formatUserId}`;
326
- const aqlQry = import_arangojs.aql`FOR hc IN hasConversation
327
- FILTER hc._from == ${userDocId} && hc._to == ${conversationDocId}
28
+ RETURN hc`;return y(c).query(r).then(d=>d.next()).then(d=>{if(d)return d;const m=y(c).collection("hasConversation"),l=T(`convo - ${u} -${o} `),p={_from:s,_key:l,_to:t,added:Date.now()};return m.save(p,{returnNew:!0}).then(()=>p)}).catch(d=>I({action:i,category:g,label:C.DATABASE_ERROR},d,e))},Y=(e,{conversationId:n,userId:a})=>{const i="deleteUserFromConversation",{databaseName:c}=e,u=v(n),o=v(a),t=`conversations/${u}`,s=`users/${o}`,r=R`FOR hc IN hasConversation
29
+ FILTER hc._from == ${s} && hc._to == ${t}
328
30
  LIMIT 1
329
31
  REMOVE hc IN hasConversation
330
- RETURN OLD`;
331
- return database.query(aqlQry).then((cursor) => cursor.next()).catch((error) => (0, import_analyticsUtils.logError)({
332
- action,
333
- category: eventCategory,
334
- label: import_error.ErrorTypes.DATABASE_ERROR
335
- }, error, context));
336
- };
337
- // Annotate the CommonJS export names for ESM import in node:
338
- 0 && (module.exports = {
339
- addDirectConversation,
340
- addUserToConversation,
341
- deleteUserFromConversation,
342
- getConnectionUsers,
343
- getConversation,
344
- getConversationUsers,
345
- getConversations,
346
- getDirectConversation,
347
- parseConversationOptions,
348
- updateConversation
349
- });
350
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvY29udmVyc2F0aW9ucy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7Y3JlYXRlSGFzaCwgcGFyc2VJZH0gZnJvbSAnQG5sYWJzL3V0aWxzJztcbmltcG9ydCB7YXFsfSBmcm9tICdhcmFuZ29qcyc7XG5pbXBvcnQge0FxbFF1ZXJ5fSBmcm9tICdhcmFuZ29qcy9hcWwnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2gvY2xvbmVEZWVwJztcblxuaW1wb3J0IHtnZXRJbWFnZVVybH0gZnJvbSAnLi9pbWFnZXMnO1xuaW1wb3J0IHtnZXREaXNwbGF5TmFtZSwgZ2V0VXNlcn0gZnJvbSAnLi91c2Vycyc7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7RXJyb3JUeXBlc30gZnJvbSAnLi4vdHlwZXMvZXJyb3IudHlwZXMnO1xuaW1wb3J0IHtsb2dFcnJvcn0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzVXRpbHMnO1xuaW1wb3J0IHtnZXRMaW1pdCwgc29ydElkc30gZnJvbSAnLi4vdXRpbHMvYXJhbmdvZGJVdGlscyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgQXJhbmdvRGJMaW1pdCxcbiAgQ29ubmVjdGlvblR5cGUsXG4gIENvbnZlcnNhdGlvbk9wdGlvbnMsXG4gIENvbnZlcnNhdGlvblR5cGUsXG4gIENvbnZlcnNhdGlvblVzZXJzUGFyYW1zLFxuICBEaXJlY3RDb252ZXJzYXRpb25QYXJhbXMsXG4gIEVkZ2VUeXBlLFxuICBJbWFnZVVybERhdGEsXG4gIFVwZGF0ZUNvbnZlcnNhdGlvblVzZXJQYXJhbXMsXG4gIFVzZXJUeXBlXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzJztcbmltcG9ydCB0eXBlIHtFZGdlQ29sbGVjdGlvbn0gZnJvbSAnYXJhbmdvanMvY29sbGVjdGlvbnMnO1xuXG5jb25zdCBldmVudENhdGVnb3J5OiBzdHJpbmcgPSAnY29udmVyc2F0aW9ucyc7XG5cbmV4cG9ydCBjb25zdCBwYXJzZUNvbnZlcnNhdGlvbk9wdGlvbnMgPSAob3B0aW9uczogQ29udmVyc2F0aW9uT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBmcm9tID0gMCxcbiAgICB0byA9IDMwXG4gIH0gPSBvcHRpb25zO1xuXG4gIHJldHVybiB7XG4gICAgbGltaXQ6IGdldExpbWl0KGZyb20sIHRvKSBhcyBBcmFuZ29EYkxpbWl0XG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udmVyc2F0aW9ucyA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB1c2VySWQ6IHN0cmluZywgb3B0aW9ucz8pOiBQcm9taXNlPENvbnZlcnNhdGlvblR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRDb252ZXJzYXRpb25zJztcbiAgY29uc3Qge2RhdGFiYXNlfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsaW1pdH0gPSBwYXJzZUNvbnZlcnNhdGlvbk9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHVzZXJEb2NJZDogc3RyaW5nID0gYHVzZXJzLyR7dXNlcklkfWA7XG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBjLCBlIElOIDEuLjEgT1VUQk9VTkQgXCIke3VzZXJEb2NJZH1cIiBoYXNDb252ZXJzYXRpb25cbiAgICAke2xpbWl0LmFxbH1cbiAgICBMRVQgdXNlcnMgPSAoXG4gICAgICBGT1IgdSwgdWMgSU4gMS4uMSBJTkJPVU5EIGMuX2lkIGhhc0NvbnZlcnNhdGlvblxuICAgICAgRklMVEVSIHUuX2lkICE9IFwiJHt1c2VyRG9jSWR9XCJcbiAgICAgIFJFVFVSTiB1XG4gICAgKVxuICAgIFJFVFVSTiBNRVJHRShjLCB7dXNlcnM6IHVzZXJzfSlgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgQ29udmVyc2F0aW9uVHlwZVtdKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgICByZXR1cm4gW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGlyZWN0Q29udmVyc2F0aW9uID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB7XG4gICAgZnJvbUlkLFxuICAgIHRvSWQsXG4gICAgdG9Vc2VyXG4gIH06IERpcmVjdENvbnZlcnNhdGlvblBhcmFtc1xuKTogUHJvbWlzZTxDb252ZXJzYXRpb25UeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldERpcmVjdENvbnZlcnNhdGlvbic7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZm9ybWF0RnJvbUlkID0gcGFyc2VJZChmcm9tSWQpO1xuICAgIGNvbnN0IGZvcm1hdFRvSWQgPSBwYXJzZUlkKHRvSWQpO1xuICAgIGNvbnN0IHVzZXJJZHMgPSBbZm9ybWF0RnJvbUlkLCBmb3JtYXRUb0lkXTtcbiAgICBjb25zdCBzb3J0ZWRVc2VySWRzID0gc29ydElkcyh1c2VySWRzKTtcbiAgICBjb25zdCBjb252ZXJzYXRpb25JZCA9IGNyZWF0ZUhhc2goYGNvbnZlcnNhdGlvbnMtJHtzb3J0ZWRVc2VySWRzLmpvaW4oJy0nKX1gLCBudWxsKTtcbiAgICBjb25zdCB1c2VyOiBVc2VyVHlwZSA9IHRvVXNlciB8fCBhd2FpdCBnZXRVc2VyKGNvbnRleHQsIHt1c2VySWQ6IGZvcm1hdFRvSWR9KTtcbiAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYExFVCBjID0gRE9DVU1FTlQoJHtgY29udmVyc2F0aW9ucy8ke2NvbnZlcnNhdGlvbklkfWB9KSBSRVRVUk4gY2A7XG4gICAgY29uc3QgY29udmVyc2F0aW9uID0gYXdhaXQgZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCkpO1xuXG4gICAgaWYoY29udmVyc2F0aW9uKSB7XG4gICAgICByZXR1cm4gey4uLmNvbnZlcnNhdGlvbiwgdXNlcnM6IFt1c2VyXX07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFkZERpcmVjdENvbnZlcnNhdGlvbihjb250ZXh0LCB7ZnJvbUlkLCB0b0lkLCB0b1VzZXI6IHVzZXJ9KTtcbiAgfSBjYXRjaChkYXRhYmFzZUVycm9yKSB7XG4gICAgcmV0dXJuIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBkYXRhYmFzZUVycm9yLCBjb250ZXh0KTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGFkZERpcmVjdENvbnZlcnNhdGlvbiA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAge1xuICAgIGZyb21JZCxcbiAgICB0b0lkLFxuICAgIHRvVXNlclxuICB9OiBEaXJlY3RDb252ZXJzYXRpb25QYXJhbXNcbik6IFByb21pc2U8Q29udmVyc2F0aW9uVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXREaXJlY3RDb252ZXJzYXRpb24nO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcblxuICB0cnkge1xuICAgIGNvbnN0IGZvcm1hdEZyb21JZCA9IHBhcnNlSWQoZnJvbUlkKTtcbiAgICBjb25zdCBmb3JtYXRUb0lkID0gcGFyc2VJZCh0b0lkKTtcbiAgICBjb25zdCB1c2VySWRzID0gW2Zvcm1hdEZyb21JZCwgZm9ybWF0VG9JZF07XG4gICAgY29uc3Qgc29ydGVkVXNlcklkcyA9IHNvcnRJZHMoW2Zvcm1hdEZyb21JZCwgZm9ybWF0VG9JZF0pO1xuICAgIGNvbnN0IHVzZXI6IFVzZXJUeXBlID0gdG9Vc2VyIHx8IGF3YWl0IGdldFVzZXIoY29udGV4dCwge3VzZXJJZDogZm9ybWF0VG9JZH0pO1xuICAgIGNvbnN0IGNvbnZlcnNhdGlvbklkID0gY3JlYXRlSGFzaChgY29udmVyc2F0aW9ucy0ke3NvcnRlZFVzZXJJZHMuam9pbignLScpfWAsIG51bGwpO1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgaW5zZXJ0ID0ge1xuICAgICAgX2tleTogY29udmVyc2F0aW9uSWQsXG4gICAgICBhZGRlZDogbm93LFxuICAgICAgaXNEaXJlY3Q6IHRydWUsXG4gICAgICBtb2RpZmllZDogbm93XG4gICAgfTtcbiAgICBjb25zdCBpbnNlcnRRdWVyeTogQXFsUXVlcnkgPSBhcWxgSU5TRVJUICR7aW5zZXJ0fSBJTiBjb252ZXJzYXRpb25zIFJFVFVSTiBORVdgO1xuICAgIGNvbnN0IHVwZGF0ZWRDb252ZXJzYXRpb24gPSBhd2FpdCBkYXRhYmFzZS5xdWVyeShpbnNlcnRRdWVyeSlcbiAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwodXNlcklkcy5tYXAoKHVzZXJJZCkgPT4ge1xuICAgICAgY29uc3QgZWRnZUlkOiBzdHJpbmcgPSBjcmVhdGVIYXNoKGBoYXNDb252ZXJzYXRpb24tJHt1c2VySWR9LSR7Y29udmVyc2F0aW9uSWR9YCk7XG4gICAgICBjb25zdCBlZGdlOiBFZGdlVHlwZSA9IHtcbiAgICAgICAgX2Zyb206IGB1c2Vycy8ke3VzZXJJZH1gLFxuICAgICAgICBfa2V5OiBlZGdlSWQsXG4gICAgICAgIF90bzogYGNvbnZlcnNhdGlvbnMvJHtjb252ZXJzYXRpb25JZH1gLFxuICAgICAgICBhZGRlZDogRGF0ZS5ub3coKVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGluc2VydEVkZ2VRdWVyeTogQXFsUXVlcnkgPSBhcWxgSU5TRVJUICR7ZWRnZX0gSU4gaGFzQ29udmVyc2F0aW9uIFJFVFVSTiBORVdgO1xuICAgICAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGluc2VydEVkZ2VRdWVyeSk7XG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIHsuLi51cGRhdGVkQ29udmVyc2F0aW9uLCB1c2VyczogW3VzZXJdfTtcbiAgfSBjYXRjaChkYXRhYmFzZUVycm9yKSB7XG4gICAgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGRhdGFiYXNlRXJyb3IsIGNvbnRleHQpO1xuICAgIHJldHVybiB7fTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbm5lY3Rpb25Vc2VycyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAge1xuICAgIGNvbnZlcnNhdGlvbklkLFxuICAgIGluY2x1ZGVBbGwgPSBmYWxzZSxcbiAgICBpc0RpcmVjdFxuICB9OiBDb252ZXJzYXRpb25Vc2Vyc1BhcmFtc1xuKTogUHJvbWlzZTxDb25uZWN0aW9uVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldENvbm5lY3Rpb25Vc2Vycyc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvblVzZXJJZH19ID0gY29udGV4dDtcbiAgY29uc3QgZmlsdGVyczogc3RyaW5nW10gPSBbJ2MudXNlcklkID09IHUuX2tleSddO1xuXG4gIGlmKCFpbmNsdWRlQWxsKSB7XG4gICAgZmlsdGVycy5wdXNoKGB1Ll9rZXkgIT0gJHtzZXNzaW9uVXNlcklkfWApO1xuICB9XG4gIGlmKGlzRGlyZWN0KSB7XG4gICAgZmlsdGVycy5wdXNoKGBwLnZlcnRpY2VzWzBdLmlzRGlyZWN0ID09ICR7aXNEaXJlY3R9YCk7XG4gIH1cblxuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiB1LCBlLHAgSU4gMS4uMSBJTkJPVU5EICR7YGNvbnZlcnNhdGlvbnMvJHtjb252ZXJzYXRpb25JZH1gfSBoYXNDb252ZXJzYXRpb25cbiAgICBPUFRJT05TIHt2ZXJ0ZXhDb2xsZWN0aW9uczogXCJ1c2Vyc1wifVxuICAgIEZPUiBjIElOIGNvbm5lY3Rpb25zXG4gICAgRklMVEVSICR7ZmlsdGVycy5qb2luKCcgJiYgJyl9XG4gICAgUkVUVVJOIGNgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgQ29ubmVjdGlvblR5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbnZlcnNhdGlvblVzZXJzID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB7XG4gICAgY29udmVyc2F0aW9uSWQsXG4gICAgaW5jbHVkZUFsbCA9IGZhbHNlLFxuICAgIGlzRGlyZWN0XG4gIH06IENvbnZlcnNhdGlvblVzZXJzUGFyYW1zXG4pOiBQcm9taXNlPENvbnZlcnNhdGlvblR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRDb252ZXJzYXRpb25Vc2Vycyc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvblVzZXJJZH19ID0gY29udGV4dDtcbiAgY29uc3QgZmlsdGVyczogc3RyaW5nW10gPSBbJ2MudXNlcklkID09IHUuX2tleSddO1xuXG4gIGlmKCFpbmNsdWRlQWxsKSB7XG4gICAgZmlsdGVycy5wdXNoKGB1Ll9rZXkgIT0gJHtzZXNzaW9uVXNlcklkfWApO1xuICB9XG4gIGlmKGlzRGlyZWN0KSB7XG4gICAgZmlsdGVycy5wdXNoKGBwLnZlcnRpY2VzWzBdLmlzRGlyZWN0ID09ICR7aXNEaXJlY3R9YCk7XG4gIH1cblxuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiB1LCBlLHAgSU4gMS4uMSBJTkJPVU5EICR7YGNvbnZlcnNhdGlvbnMvJHtjb252ZXJzYXRpb25JZH1gfSBoYXNDb252ZXJzYXRpb25cbiAgICBPUFRJT05TIHt2ZXJ0ZXhDb2xsZWN0aW9uczogXCJ1c2Vyc1wifVxuICAgIEZJTFRFUiAke2ZpbHRlcnMuam9pbignICYmICcpfVxuICAgIFJFVFVSTiB1YDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIENvbnZlcnNhdGlvblR5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pO1xufTtcblxuLy8gZXhwb3J0IGNvbnN0IGdldERpcmVjdENvbnZlcnNhdGlvbk9sZCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB1c2VySWQ6IHN0cmluZyk6IFByb21pc2U8Q29udmVyc2F0aW9uVHlwZT4gPT4ge1xuLy8gICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXREaXJlY3RDb252ZXJzYXRpb24nO1xuLy8gICBjb25zdCB7ZGF0YWJhc2UsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbi8vICAgY29uc3Qgc2Vzc2lvbkRvY0lkOiBzdHJpbmcgPSBgdXNlcnMvJHtzZXNzaW9uSWR9YDtcbi8vICAgY29uc3QgZm9ybWF0VXNlcklkOiBzdHJpbmcgPSBwYXJzZUFyYW5nb0lkKHVzZXJJZCk7XG5cbi8vICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBMRVQgZnJvbSA9IChcbi8vICAgICAgIEZPUiBjLCBlIElOIDEuLjEgT1VUQk9VTkQgJHtzZXNzaW9uRG9jSWR9IGhhc0NvbnZlcnNhdGlvblxuLy8gICAgICAgRklMVEVSIGMuZGlyZWN0ID09IHRydWVcbi8vICAgICAgIFJFVFVSTiBjXG4vLyAgICAgKVxuLy8gICAgIExFVCB0byA9IChcbi8vICAgICAgIEZPUiBjLCBlIElOIDEuLjEgT1VUQk9VTkQgJHtmb3JtYXRVc2VySWR9IGhhc0NvbnZlcnNhdGlvblxuLy8gICAgICAgRklMVEVSIGMuZGlyZWN0ID09IHRydWVcbi8vICAgICAgIFJFVFVSTiBjXG4vLyAgICAgKVxuLy8gICAgIExFVCBjb252ZXJzYXRpb24gPSBGSVJTVChJTlRFUlNFQ1RJT04oZnJvbSwgdG8pKVxuLy8gICAgIExFVCB1c2VycyA9ICFJU19OVUxMKGNvbnZlcnNhdGlvbikgJiYgKFxuLy8gICAgICAgRk9SIGcgSU5bJHtzZXNzaW9uRG9jSWR9LCAke2Zvcm1hdFVzZXJJZH1dXG4vLyAgICAgICBGT1IgdSBJTiB1c2Vyc1xuLy8gICAgICAgRklMVEVSIGcgPT0gdS5faWRcbi8vICAgICAgIFJFVFVSTiB1XG4vLyAgICAgKVxuLy8gICAgIFJFVFVSTiBJU19OVUxMKGNvbnZlcnNhdGlvbikgPyBudWxsIDogTUVSR0UoY29udmVyc2F0aW9uLCB7dXNlcnM6IHVzZXJzfSlgO1xuXG4vLyAgIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4vLyAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbi8vICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuLy8gICAgICAgYWN0aW9uLFxuLy8gICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4vLyAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuLy8gICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG4vLyB9O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udmVyc2F0aW9uID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGNvbnZlcnNhdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPENvbnZlcnNhdGlvblR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0SXRlbSc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCBzZXNzaW9uRG9jSWQ6IHN0cmluZyA9IGB1c2Vycy8ke3Nlc3Npb25JZH1gO1xuICBjb25zdCBjb252ZXJzYXRpb25Eb2NJZDogc3RyaW5nID0gYGNvbnZlcnNhdGlvbnMvJHtwYXJzZUlkKGNvbnZlcnNhdGlvbklkKX1gO1xuXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIGMsIGUgSU4gMS4uMSBPVVRCT1VORCAke3Nlc3Npb25Eb2NJZH0gaGFzQ29udmVyc2F0aW9uXG4gICAgRklMVEVSIGMuX2lkID09ICR7Y29udmVyc2F0aW9uRG9jSWR9XG4gICAgTEVUIHUgPSAoXG4gICAgICBGT1IgaW5Vc2VyLCBpbkVkZ2UgSU4gMS4uMSBJTkJPVU5EICR7Y29udmVyc2F0aW9uRG9jSWR9IGhhc0NvbnZlcnNhdGlvblxuICAgICAgUkVUVVJOIGluVXNlclxuICAgIClcbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIE1FUkdFKGMsIHt1c2VyczogdX0pYDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKGNvbnZlcnNhdGlvbjogQ29udmVyc2F0aW9uVHlwZSkgPT4ge1xuICAgICAgaWYoIWNvbnZlcnNhdGlvbikge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG5cbiAgICAgIGNvbnZlcnNhdGlvbi51c2VycyA9IGNvbnZlcnNhdGlvbi51c2Vycy5tYXAoKHVzZXI6IFVzZXJUeXBlKSA9PiB7XG4gICAgICAgIGNvbnN0IHtpbWFnZUlkLCB1c2VySWR9ID0gdXNlcjtcbiAgICAgICAgY29uc3QgdGh1bWJVcmxEYXRhOiBJbWFnZVVybERhdGEgPSB7XG4gICAgICAgICAgYnVja2V0OiBDb25maWcuZ2V0KCdhd3MuczMuQnVja2V0JyksXG4gICAgICAgICAgaW1hZ2VEaXI6ICd0aHVtYnMnLFxuICAgICAgICAgIGltYWdlSWQsXG4gICAgICAgICAgdHlwZTogJ3VzZXJzJyxcbiAgICAgICAgICB0eXBlSWQ6IHVzZXJJZFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4udXNlcixcbiAgICAgICAgICBuYW1lOiBnZXREaXNwbGF5TmFtZSh1c2VyKSxcbiAgICAgICAgICB0aHVtYjogZ2V0SW1hZ2VVcmwodGh1bWJVcmxEYXRhKVxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBjb252ZXJzYXRpb247XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlQ29udmVyc2F0aW9uID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBjb252ZXJzYXRpb246IENvbnZlcnNhdGlvblR5cGVcbik6IFByb21pc2U8Q29udmVyc2F0aW9uVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICd1cGRhdGVDb252ZXJzYXRpb24nO1xuICBjb25zdCB7ZGF0YWJhc2UsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge1xuICAgIGNvbnZlcnNhdGlvbklkID0gY3JlYXRlSGFzaChgY29udmVyc2F0aW9uLSR7c2Vzc2lvbklkfSBgKSxcbiAgICBpc0RpcmVjdCA9IGZhbHNlLFxuICAgIG5hbWVcbiAgfSA9IGNvbnZlcnNhdGlvbjtcbiAgY29uc3QgZm9ybWF0Q29udmVyc2F0aW9uSWQ6IHN0cmluZyA9IHBhcnNlSWQoY29udmVyc2F0aW9uSWQpO1xuICBjb25zdCBub3c6IG51bWJlciA9IERhdGUubm93KCk7XG4gIGNvbnN0IHVwZGF0ZSA9IHtcbiAgICBpc0RpcmVjdCxcbiAgICBtb2RpZmllZDogbm93LFxuICAgIG5hbWVcbiAgfTtcblxuICBjb25zdCBpbnNlcnQgPSB7XG4gICAgLi4uY2xvbmVEZWVwKHVwZGF0ZSksXG4gICAgX2tleTogZm9ybWF0Q29udmVyc2F0aW9uSWQsXG4gICAgYWRkZWQ6IG5vd1xuICB9O1xuXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBTRVJUIHtfa2V5OiAke2Zvcm1hdENvbnZlcnNhdGlvbklkfSB9XG4gICAgSU5TRVJUICR7aW5zZXJ0fVxuICAgIFVQREFURSAke3VwZGF0ZX1cbiAgICBJTiBjb252ZXJzYXRpb25zIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigoY29udmVyc2F0aW9uOiBDb252ZXJzYXRpb25UeXBlKSA9PiBjb252ZXJzYXRpb24pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZFVzZXJUb0NvbnZlcnNhdGlvbiA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAge1xuICAgIGNvbnZlcnNhdGlvbklkLFxuICAgIHVzZXJJZFxuICB9OiBVcGRhdGVDb252ZXJzYXRpb25Vc2VyUGFyYW1zXG4pOiBQcm9taXNlPENvbnZlcnNhdGlvblR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnYWRkVXNlclRvQ29udmVyc2F0aW9uJztcbiAgY29uc3Qge2RhdGFiYXNlfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdENvbnZlcnNhdGlvbklkOiBzdHJpbmcgPSBwYXJzZUlkKGNvbnZlcnNhdGlvbklkKTtcbiAgY29uc3QgZm9ybWF0VXNlcklkOiBzdHJpbmcgPSBwYXJzZUlkKHVzZXJJZCk7XG4gIGNvbnN0IGNvbnZlcnNhdGlvbkRvY0lkOiBzdHJpbmcgPSBgY29udmVyc2F0aW9ucy8ke2Zvcm1hdENvbnZlcnNhdGlvbklkfWA7XG4gIGNvbnN0IHVzZXJEb2NJZDogc3RyaW5nID0gYHVzZXJzLyR7Zm9ybWF0VXNlcklkfWA7XG5cbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgaGMgSU4gaGFzQ29udmVyc2F0aW9uXG4gICAgRklMVEVSIGhjLl9mcm9tID09ICR7dXNlckRvY0lkfSAmJiBoYy5fdG8gPT0gJHtjb252ZXJzYXRpb25Eb2NJZH1cbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIGhjYDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKGhhc0NvbnZlcnNhdGlvbkVkZ2UpID0+IHtcbiAgICAgIGlmKCEhaGFzQ29udmVyc2F0aW9uRWRnZSkge1xuICAgICAgICByZXR1cm4gaGFzQ29udmVyc2F0aW9uRWRnZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZWRnZUNvbGxlY3Rpb246IEVkZ2VDb2xsZWN0aW9uID0gZGF0YWJhc2UuY29sbGVjdGlvbignaGFzQ29udmVyc2F0aW9uJyk7XG4gICAgICBjb25zdCBlZGdlSWQ6IHN0cmluZyA9IGNyZWF0ZUhhc2goYGNvbnZvIC0gJHtmb3JtYXRDb252ZXJzYXRpb25JZH0gLSR7Zm9ybWF0VXNlcklkfSBgKTtcblxuICAgICAgY29uc3QgZWRnZTogQ29udmVyc2F0aW9uVHlwZSA9IHtcbiAgICAgICAgX2Zyb206IHVzZXJEb2NJZCxcbiAgICAgICAgX2tleTogZWRnZUlkLFxuICAgICAgICBfdG86IGNvbnZlcnNhdGlvbkRvY0lkLFxuICAgICAgICBhZGRlZDogRGF0ZS5ub3coKVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGVkZ2VDb2xsZWN0aW9uXG4gICAgICAgIC5zYXZlKGVkZ2UsIHtyZXR1cm5OZXc6IHRydWV9KVxuICAgICAgICAudGhlbigoKSA9PiBlZGdlKTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVVc2VyRnJvbUNvbnZlcnNhdGlvbiA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAge1xuICAgIGNvbnZlcnNhdGlvbklkLFxuICAgIHVzZXJJZFxuICB9OiBVcGRhdGVDb252ZXJzYXRpb25Vc2VyUGFyYW1zXG4pOiBQcm9taXNlPENvbnZlcnNhdGlvblR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZGVsZXRlVXNlckZyb21Db252ZXJzYXRpb24nO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0Q29udmVyc2F0aW9uSWQ6IHN0cmluZyA9IHBhcnNlSWQoY29udmVyc2F0aW9uSWQpO1xuICBjb25zdCBmb3JtYXRVc2VySWQ6IHN0cmluZyA9IHBhcnNlSWQodXNlcklkKTtcbiAgY29uc3QgY29udmVyc2F0aW9uRG9jSWQ6IHN0cmluZyA9IGBjb252ZXJzYXRpb25zLyR7Zm9ybWF0Q29udmVyc2F0aW9uSWR9YDtcbiAgY29uc3QgdXNlckRvY0lkOiBzdHJpbmcgPSBgdXNlcnMvJHtmb3JtYXRVc2VySWR9YDtcblxuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBoYyBJTiBoYXNDb252ZXJzYXRpb25cbiAgICBGSUxURVIgaGMuX2Zyb20gPT0gJHt1c2VyRG9jSWR9ICYmIGhjLl90byA9PSAke2NvbnZlcnNhdGlvbkRvY0lkfVxuICAgIExJTUlUIDFcbiAgICBSRU1PVkUgaGMgSU4gaGFzQ29udmVyc2F0aW9uXG4gICAgUkVUVVJOIE9MRGA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbn07XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSUEsbUJBQWtDO0FBQ2xDLHNCQUFrQjtBQUVsQix1QkFBc0I7QUFFdEIsb0JBQTBCO0FBQzFCLG1CQUFzQztBQUN0QyxvQkFBcUI7QUFDckIsbUJBQXlCO0FBQ3pCLDRCQUF1QjtBQUN2QiwyQkFBZ0M7QUFpQmhDLE1BQU0sZ0JBQXdCO0FBRXZCLE1BQU0sMkJBQTJCLENBQUMsVUFBK0IsQ0FBQyxNQUFNO0FBQzdFLFFBQU07QUFBQSxJQUNKLE9BQU87QUFBQSxJQUNQLEtBQUs7QUFBQSxFQUNQLElBQUk7QUFFSixTQUFPO0FBQUEsSUFDTCxXQUFPLCtCQUFTLE1BQU0sRUFBRTtBQUFBLEVBQzFCO0FBQ0Y7QUFFTyxNQUFNLG1CQUFtQixDQUFDLFNBQXFCLFFBQWdCLFlBQTBDO0FBQzlHLFFBQU0sU0FBaUI7QUFDdkIsUUFBTSxFQUFDLFNBQVEsSUFBSTtBQUNuQixRQUFNLEVBQUMsTUFBSyxJQUFJLHlCQUF5QixPQUFPO0FBQ2hELFFBQU0sWUFBb0IsU0FBUyxNQUFNO0FBQ3pDLFFBQU0sU0FBaUIsOEJBQThCLFNBQVM7QUFBQSxNQUMxRCxNQUFNLEdBQUc7QUFBQTtBQUFBO0FBQUEseUJBR1UsU0FBUztBQUFBO0FBQUE7QUFBQTtBQUtoQyxTQUFPLFNBQVMsTUFBTSxNQUFNLEVBQ3pCLEtBQUssQ0FBQyxXQUFXLE9BQU8sSUFBSSxDQUFrQyxFQUM5RCxNQUFNLENBQUMsVUFBaUI7QUFDdkIsd0NBQVM7QUFBQSxNQUNQO0FBQUEsTUFDQSxVQUFVO0FBQUEsTUFDVixPQUFPLHdCQUFXO0FBQUEsSUFDcEIsR0FBRyxPQUFPLE9BQU87QUFDakIsV0FBTyxDQUFDO0FBQUEsRUFD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Tyx3QkFBVztBQUFBLEVBQ3BCLEdBQUcsT0FBTyxPQUFPLENBQUM7QUFDdEI7QUFFTyxNQUFNLHdCQUF3QixDQUNuQyxTQUNBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFDRixNQUM4QjtBQUM5QixRQUFNLFNBQWlCO0FBQ3ZCLFFBQU0sRUFBQyxTQUFRLElBQUk7QUFDbkIsUUFBTSwyQkFBK0Isc0JBQVEsY0FBYztBQUMzRCxRQUFNLG1CQUF1QixzQkFBUSxNQUFNO0FBQzNDLFFBQU0sb0JBQTRCLGlCQUFpQixvQkFBb0I7QUFDdkUsUUFBTSxZQUFvQixTQUFTLFlBQVk7QUFFL0MsUUFBTSxTQUFtQjtBQUFBLHlCQUNGLFNBQVMsaUJBQWlCLGlCQUFpQjtBQUFBO0FBQUE7QUFJbEUsU0FBTyxTQUFTLE1BQU0sTUFBTSxFQUN6QixLQUFLLENBQUMsV0FBVyxPQUFPLEtBQUssQ0FBQyxFQUM5QixLQUFLLENBQUMsd0JBQXdCO0FBQzdCLFFBQUcsQ0FBQyxDQUFDLHFCQUFxQjtBQUN4QixhQUFPO0FBQUEsSUFDVDtBQUVBLFVBQU0saUJBQWlDLFNBQVMsV0FBVyxpQkFBaUI7QUFDNUUsVUFBTSxhQUFpQix5QkFBVyxXQUFXLG9CQUFvQixLQUFLLFlBQVksR0FBRztBQUVyRixVQUFNLE9BQXlCO0FBQUEsTUFDN0IsT0FBTztBQUFBLE1BQ1AsTUFBTTtBQUFBLE1BQ04sS0FBSztBQUFBLE1BQ0wsT0FBTyxLQUFLLElBQUk7QUFBQSxJQUNsQjtBQUVBLFdBQU8sZUFDSixLQUFLLE1BQU0sRUFBQyxXQUFXLEtBQUksQ0FBQyxFQUM1QixLQUFLLE1BQU0sSUFBSTtBQUFBLEVBQ3BCLENBQUMsRUFDQSxNQUFNLENBQUMsY0FBaUIsZ0NBQVM7QUFBQSxJQUNoQztBQUFBLElBQ0EsVUFBVTtBQUFBLElBQ1YsT0FBTyx3QkFBVztBQUFBLEVBQ3BCLEdBQUcsT0FBTyxPQUFPLENBQUM7QUFDdEI7QUFFTyxNQUFNLDZCQUE2QixDQUN4QyxTQUNBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFDRixNQUM4QjtBQUM5QixRQUFNLFNBQWlCO0FBQ3ZCLFFBQU0sRUFBQyxTQUFRLElBQUk7QUFDbkIsUUFBTSwyQkFBK0Isc0JBQVEsY0FBYztBQUMzRCxRQUFNLG1CQUF1QixzQkFBUSxNQUFNO0FBQzNDLFFBQU0sb0JBQTRCLGlCQUFpQixvQkFBb0I7QUFDdkUsUUFBTSxZQUFvQixTQUFTLFlBQVk7QUFFL0MsUUFBTSxTQUFtQjtBQUFBLHlCQUNGLFNBQVMsaUJBQWlCLGlCQUFpQjtBQUFBO0FBQUE7QUFBQTtBQUtsRSxTQUFPLFNBQVMsTUFBTSxNQUFNLEVBQ3pCLEtBQUssQ0FBQyxXQUFXLE9BQU8sS0FBSyxDQUFDLEVBQzlCLE1BQU0sQ0FBQyxjQUFpQixnQ0FBUztBQUFBLElBQ2hDO0FBQUEsSUFDQSxVQUFVO0FBQUEsSUFDVixPQUFPLHdCQUFXO0FBQUEsRUFDcEIsR0FBRyxPQUFPLE9BQU8sQ0FBQztBQUN0QjsiLAogICJuYW1lcyI6IFsiY2xvbmVEZWVwIiwgImNvbnZlcnNhdGlvbiJdCn0K
32
+ RETURN OLD`;return y(c).query(r).then(d=>d.next()).catch(d=>I({action:i,category:g,label:C.DATABASE_ERROR},d,e))};export{F as addDirectConversation,X as addUserToConversation,Y as deleteUserFromConversation,V as getConnectionUsers,J as getConversation,z as getConversationUsers,G as getConversations,H as getDirectConversation,Q as parseConversationOptions,K as updateConversation};
33
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvY29udmVyc2F0aW9ucy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7Y3JlYXRlSGFzaCwgcGFyc2VJZH0gZnJvbSAnQG5sYWJzL3V0aWxzJztcbmltcG9ydCB7YXFsfSBmcm9tICdhcmFuZ29qcyc7XG5pbXBvcnQge0FxbFF1ZXJ5fSBmcm9tICdhcmFuZ29qcy9hcWwnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2gvY2xvbmVEZWVwJztcblxuaW1wb3J0IHtnZXRJbWFnZVVybH0gZnJvbSAnLi9pbWFnZXMnO1xuaW1wb3J0IHtnZXREaXNwbGF5TmFtZSwgZ2V0VXNlcn0gZnJvbSAnLi91c2Vycyc7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7RXJyb3JUeXBlc30gZnJvbSAnLi4vdHlwZXMvZXJyb3IudHlwZXMnO1xuaW1wb3J0IHtsb2dFcnJvcn0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzVXRpbHMnO1xuaW1wb3J0IHtnZXRMaW1pdCwgc29ydElkcywgdXNlRGJ9IGZyb20gJy4uL3V0aWxzL2FyYW5nb2RiVXRpbHMnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFyYW5nb0RiTGltaXQsXG4gIENvbm5lY3Rpb25UeXBlLFxuICBDb252ZXJzYXRpb25PcHRpb25zLFxuICBDb252ZXJzYXRpb25UeXBlLFxuICBDb252ZXJzYXRpb25Vc2Vyc1BhcmFtcyxcbiAgRGlyZWN0Q29udmVyc2F0aW9uUGFyYW1zLFxuICBFZGdlVHlwZSxcbiAgSW1hZ2VVcmxEYXRhLFxuICBVcGRhdGVDb252ZXJzYXRpb25Vc2VyUGFyYW1zLFxuICBVc2VyVHlwZVxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7QXBpQ29udGV4dH0gZnJvbSAnLi4vdHlwZXMvYXV0aC50eXBlcyc7XG5pbXBvcnQgdHlwZSB7RWRnZUNvbGxlY3Rpb259IGZyb20gJ2FyYW5nb2pzL2NvbGxlY3Rpb25zJztcblxuY29uc3QgZXZlbnRDYXRlZ29yeTogc3RyaW5nID0gJ2NvbnZlcnNhdGlvbnMnO1xuXG5leHBvcnQgY29uc3QgcGFyc2VDb252ZXJzYXRpb25PcHRpb25zID0gKG9wdGlvbnM6IENvbnZlcnNhdGlvbk9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZnJvbSA9IDAsXG4gICAgdG8gPSAzMFxuICB9ID0gb3B0aW9ucztcblxuICByZXR1cm4ge1xuICAgIGxpbWl0OiBnZXRMaW1pdChmcm9tLCB0bykgYXMgQXJhbmdvRGJMaW1pdFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbnZlcnNhdGlvbnMgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcklkOiBzdHJpbmcsIG9wdGlvbnM/KTogUHJvbWlzZTxDb252ZXJzYXRpb25UeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0Q29udmVyc2F0aW9ucyc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0fSA9IHBhcnNlQ29udmVyc2F0aW9uT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3QgdXNlckRvY0lkOiBzdHJpbmcgPSBgdXNlcnMvJHt1c2VySWR9YDtcbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIGMsIGUgSU4gMS4uMSBPVVRCT1VORCBcIiR7dXNlckRvY0lkfVwiIGhhc0NvbnZlcnNhdGlvblxuICAgICR7bGltaXQuYXFsfVxuICAgIExFVCB1c2VycyA9IChcbiAgICAgIEZPUiB1LCB1YyBJTiAxLi4xIElOQk9VTkQgYy5faWQgaGFzQ29udmVyc2F0aW9uXG4gICAgICBGSUxURVIgdS5faWQgIT0gXCIke3VzZXJEb2NJZH1cIlxuICAgICAgUkVUVVJOIHVcbiAgICApXG4gICAgUkVUVVJOIE1FUkdFKGMsIHt1c2VyczogdXNlcnN9KWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIENvbnZlcnNhdGlvblR5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERpcmVjdENvbnZlcnNhdGlvbiA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAge1xuICAgIGZyb21JZCxcbiAgICB0b0lkLFxuICAgIHRvVXNlclxuICB9OiBEaXJlY3RDb252ZXJzYXRpb25QYXJhbXNcbik6IFByb21pc2U8Q29udmVyc2F0aW9uVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXREaXJlY3RDb252ZXJzYXRpb24nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBmb3JtYXRGcm9tSWQgPSBwYXJzZUlkKGZyb21JZCk7XG4gICAgY29uc3QgZm9ybWF0VG9JZCA9IHBhcnNlSWQodG9JZCk7XG4gICAgY29uc3QgdXNlcklkcyA9IFtmb3JtYXRGcm9tSWQsIGZvcm1hdFRvSWRdO1xuICAgIGNvbnN0IHNvcnRlZFVzZXJJZHMgPSBzb3J0SWRzKHVzZXJJZHMpO1xuICAgIGNvbnN0IGNvbnZlcnNhdGlvbklkID0gY3JlYXRlSGFzaChgY29udmVyc2F0aW9ucy0ke3NvcnRlZFVzZXJJZHMuam9pbignLScpfWAsIG51bGwpO1xuICAgIGNvbnN0IHVzZXI6IFVzZXJUeXBlID0gdG9Vc2VyIHx8IGF3YWl0IGdldFVzZXIoY29udGV4dCwge3VzZXJJZDogZm9ybWF0VG9JZH0pO1xuICAgIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgTEVUIGMgPSBET0NVTUVOVCgke2Bjb252ZXJzYXRpb25zLyR7Y29udmVyc2F0aW9uSWR9YH0pIFJFVFVSTiBjYDtcbiAgICBjb25zdCBjb252ZXJzYXRpb24gPSBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcblxuICAgIGlmKGNvbnZlcnNhdGlvbikge1xuICAgICAgcmV0dXJuIHsuLi5jb252ZXJzYXRpb24sIHVzZXJzOiBbdXNlcl19O1xuICAgIH1cblxuICAgIHJldHVybiBhZGREaXJlY3RDb252ZXJzYXRpb24oY29udGV4dCwge2Zyb21JZCwgdG9JZCwgdG9Vc2VyOiB1c2VyfSk7XG4gIH0gY2F0Y2goZGF0YWJhc2VFcnJvcikge1xuICAgIHJldHVybiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZGF0YWJhc2VFcnJvciwgY29udGV4dCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBhZGREaXJlY3RDb252ZXJzYXRpb24gPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtcbiAgICBmcm9tSWQsXG4gICAgdG9JZCxcbiAgICB0b1VzZXJcbiAgfTogRGlyZWN0Q29udmVyc2F0aW9uUGFyYW1zXG4pOiBQcm9taXNlPENvbnZlcnNhdGlvblR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0RGlyZWN0Q29udmVyc2F0aW9uJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZm9ybWF0RnJvbUlkID0gcGFyc2VJZChmcm9tSWQpO1xuICAgIGNvbnN0IGZvcm1hdFRvSWQgPSBwYXJzZUlkKHRvSWQpO1xuICAgIGNvbnN0IHVzZXJJZHMgPSBbZm9ybWF0RnJvbUlkLCBmb3JtYXRUb0lkXTtcbiAgICBjb25zdCBzb3J0ZWRVc2VySWRzID0gc29ydElkcyhbZm9ybWF0RnJvbUlkLCBmb3JtYXRUb0lkXSk7XG4gICAgY29uc3QgdXNlcjogVXNlclR5cGUgPSB0b1VzZXIgfHwgYXdhaXQgZ2V0VXNlcihjb250ZXh0LCB7dXNlcklkOiBmb3JtYXRUb0lkfSk7XG4gICAgY29uc3QgY29udmVyc2F0aW9uSWQgPSBjcmVhdGVIYXNoKGBjb252ZXJzYXRpb25zLSR7c29ydGVkVXNlcklkcy5qb2luKCctJyl9YCwgbnVsbCk7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBpbnNlcnQgPSB7XG4gICAgICBfa2V5OiBjb252ZXJzYXRpb25JZCxcbiAgICAgIGFkZGVkOiBub3csXG4gICAgICBpc0RpcmVjdDogdHJ1ZSxcbiAgICAgIG1vZGlmaWVkOiBub3dcbiAgICB9O1xuICAgIGNvbnN0IGluc2VydFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBJTlNFUlQgJHtpbnNlcnR9IElOIGNvbnZlcnNhdGlvbnMgUkVUVVJOIE5FV2A7XG4gICAgY29uc3QgdXBkYXRlZENvbnZlcnNhdGlvbiA9IGF3YWl0IHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoaW5zZXJ0UXVlcnkpXG4gICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKHVzZXJJZHMubWFwKCh1c2VySWQpID0+IHtcbiAgICAgIGNvbnN0IGVkZ2VJZDogc3RyaW5nID0gY3JlYXRlSGFzaChgaGFzQ29udmVyc2F0aW9uLSR7dXNlcklkfS0ke2NvbnZlcnNhdGlvbklkfWApO1xuICAgICAgY29uc3QgZWRnZTogRWRnZVR5cGUgPSB7XG4gICAgICAgIF9mcm9tOiBgdXNlcnMvJHt1c2VySWR9YCxcbiAgICAgICAgX2tleTogZWRnZUlkLFxuICAgICAgICBfdG86IGBjb252ZXJzYXRpb25zLyR7Y29udmVyc2F0aW9uSWR9YCxcbiAgICAgICAgYWRkZWQ6IERhdGUubm93KClcbiAgICAgIH07XG4gICAgICBjb25zdCBpbnNlcnRFZGdlUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYElOU0VSVCAke2VkZ2V9IElOIGhhc0NvbnZlcnNhdGlvbiBSRVRVUk4gTkVXYDtcbiAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGluc2VydEVkZ2VRdWVyeSk7XG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIHsuLi51cGRhdGVkQ29udmVyc2F0aW9uLCB1c2VyczogW3VzZXJdfTtcbiAgfSBjYXRjaChkYXRhYmFzZUVycm9yKSB7XG4gICAgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGRhdGFiYXNlRXJyb3IsIGNvbnRleHQpO1xuICAgIHJldHVybiB7fTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbm5lY3Rpb25Vc2VycyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAge1xuICAgIGNvbnZlcnNhdGlvbklkLFxuICAgIGluY2x1ZGVBbGwgPSBmYWxzZSxcbiAgICBpc0RpcmVjdFxuICB9OiBDb252ZXJzYXRpb25Vc2Vyc1BhcmFtc1xuKTogUHJvbWlzZTxDb25uZWN0aW9uVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldENvbm5lY3Rpb25Vc2Vycyc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25Vc2VySWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZpbHRlcnM6IHN0cmluZ1tdID0gWydjLnVzZXJJZCA9PSB1Ll9rZXknXTtcblxuICBpZighaW5jbHVkZUFsbCkge1xuICAgIGZpbHRlcnMucHVzaChgdS5fa2V5ICE9ICR7c2Vzc2lvblVzZXJJZH1gKTtcbiAgfVxuICBpZihpc0RpcmVjdCkge1xuICAgIGZpbHRlcnMucHVzaChgcC52ZXJ0aWNlc1swXS5pc0RpcmVjdCA9PSAke2lzRGlyZWN0fWApO1xuICB9XG5cbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgdSwgZSxwIElOIDEuLjEgSU5CT1VORCAke2Bjb252ZXJzYXRpb25zLyR7Y29udmVyc2F0aW9uSWR9YH0gaGFzQ29udmVyc2F0aW9uXG4gICAgT1BUSU9OUyB7dmVydGV4Q29sbGVjdGlvbnM6IFwidXNlcnNcIn1cbiAgICBGT1IgYyBJTiBjb25uZWN0aW9uc1xuICAgIEZJTFRFUiAke2ZpbHRlcnMuam9pbignICYmICcpfVxuICAgIFJFVFVSTiBjYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgQ29ubmVjdGlvblR5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbnZlcnNhdGlvblVzZXJzID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB7XG4gICAgY29udmVyc2F0aW9uSWQsXG4gICAgaW5jbHVkZUFsbCA9IGZhbHNlLFxuICAgIGlzRGlyZWN0XG4gIH06IENvbnZlcnNhdGlvblVzZXJzUGFyYW1zXG4pOiBQcm9taXNlPENvbnZlcnNhdGlvblR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRDb252ZXJzYXRpb25Vc2Vycyc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25Vc2VySWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZpbHRlcnM6IHN0cmluZ1tdID0gWydjLnVzZXJJZCA9PSB1Ll9rZXknXTtcblxuICBpZighaW5jbHVkZUFsbCkge1xuICAgIGZpbHRlcnMucHVzaChgdS5fa2V5ICE9ICR7c2Vzc2lvblVzZXJJZH1gKTtcbiAgfVxuICBpZihpc0RpcmVjdCkge1xuICAgIGZpbHRlcnMucHVzaChgcC52ZXJ0aWNlc1swXS5pc0RpcmVjdCA9PSAke2lzRGlyZWN0fWApO1xuICB9XG5cbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgdSwgZSxwIElOIDEuLjEgSU5CT1VORCAke2Bjb252ZXJzYXRpb25zLyR7Y29udmVyc2F0aW9uSWR9YH0gaGFzQ29udmVyc2F0aW9uXG4gICAgT1BUSU9OUyB7dmVydGV4Q29sbGVjdGlvbnM6IFwidXNlcnNcIn1cbiAgICBGSUxURVIgJHtmaWx0ZXJzLmpvaW4oJyAmJiAnKX1cbiAgICBSRVRVUk4gdWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIENvbnZlcnNhdGlvblR5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pO1xufTtcblxuLy8gZXhwb3J0IGNvbnN0IGdldERpcmVjdENvbnZlcnNhdGlvbk9sZCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB1c2VySWQ6IHN0cmluZyk6IFByb21pc2U8Q29udmVyc2F0aW9uVHlwZT4gPT4ge1xuLy8gICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXREaXJlY3RDb252ZXJzYXRpb24nO1xuLy8gICBjb25zdCB7ZGF0YWJhc2UsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbi8vICAgY29uc3Qgc2Vzc2lvbkRvY0lkOiBzdHJpbmcgPSBgdXNlcnMvJHtzZXNzaW9uSWR9YDtcbi8vICAgY29uc3QgZm9ybWF0VXNlcklkOiBzdHJpbmcgPSBwYXJzZUFyYW5nb0lkKHVzZXJJZCk7XG5cbi8vICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBMRVQgZnJvbSA9IChcbi8vICAgICAgIEZPUiBjLCBlIElOIDEuLjEgT1VUQk9VTkQgJHtzZXNzaW9uRG9jSWR9IGhhc0NvbnZlcnNhdGlvblxuLy8gICAgICAgRklMVEVSIGMuZGlyZWN0ID09IHRydWVcbi8vICAgICAgIFJFVFVSTiBjXG4vLyAgICAgKVxuLy8gICAgIExFVCB0byA9IChcbi8vICAgICAgIEZPUiBjLCBlIElOIDEuLjEgT1VUQk9VTkQgJHtmb3JtYXRVc2VySWR9IGhhc0NvbnZlcnNhdGlvblxuLy8gICAgICAgRklMVEVSIGMuZGlyZWN0ID09IHRydWVcbi8vICAgICAgIFJFVFVSTiBjXG4vLyAgICAgKVxuLy8gICAgIExFVCBjb252ZXJzYXRpb24gPSBGSVJTVChJTlRFUlNFQ1RJT04oZnJvbSwgdG8pKVxuLy8gICAgIExFVCB1c2VycyA9ICFJU19OVUxMKGNvbnZlcnNhdGlvbikgJiYgKFxuLy8gICAgICAgRk9SIGcgSU5bJHtzZXNzaW9uRG9jSWR9LCAke2Zvcm1hdFVzZXJJZH1dXG4vLyAgICAgICBGT1IgdSBJTiB1c2Vyc1xuLy8gICAgICAgRklMVEVSIGcgPT0gdS5faWRcbi8vICAgICAgIFJFVFVSTiB1XG4vLyAgICAgKVxuLy8gICAgIFJFVFVSTiBJU19OVUxMKGNvbnZlcnNhdGlvbikgPyBudWxsIDogTUVSR0UoY29udmVyc2F0aW9uLCB7dXNlcnM6IHVzZXJzfSlgO1xuXG4vLyAgIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4vLyAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbi8vICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuLy8gICAgICAgYWN0aW9uLFxuLy8gICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4vLyAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuLy8gICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG4vLyB9O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udmVyc2F0aW9uID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGNvbnZlcnNhdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPENvbnZlcnNhdGlvblR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0SXRlbSc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qgc2Vzc2lvbkRvY0lkOiBzdHJpbmcgPSBgdXNlcnMvJHtzZXNzaW9uSWR9YDtcbiAgY29uc3QgY29udmVyc2F0aW9uRG9jSWQ6IHN0cmluZyA9IGBjb252ZXJzYXRpb25zLyR7cGFyc2VJZChjb252ZXJzYXRpb25JZCl9YDtcblxuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBjLCBlIElOIDEuLjEgT1VUQk9VTkQgJHtzZXNzaW9uRG9jSWR9IGhhc0NvbnZlcnNhdGlvblxuICAgIEZJTFRFUiBjLl9pZCA9PSAke2NvbnZlcnNhdGlvbkRvY0lkfVxuICAgIExFVCB1ID0gKFxuICAgICAgRk9SIGluVXNlciwgaW5FZGdlIElOIDEuLjEgSU5CT1VORCAke2NvbnZlcnNhdGlvbkRvY0lkfSBoYXNDb252ZXJzYXRpb25cbiAgICAgIFJFVFVSTiBpblVzZXJcbiAgICApXG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBNRVJHRShjLCB7dXNlcnM6IHV9KWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKGNvbnZlcnNhdGlvbjogQ29udmVyc2F0aW9uVHlwZSkgPT4ge1xuICAgICAgaWYoIWNvbnZlcnNhdGlvbikge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG5cbiAgICAgIGNvbnZlcnNhdGlvbi51c2VycyA9IGNvbnZlcnNhdGlvbi51c2Vycy5tYXAoKHVzZXI6IFVzZXJUeXBlKSA9PiB7XG4gICAgICAgIGNvbnN0IHtpbWFnZUlkLCB1c2VySWR9ID0gdXNlcjtcbiAgICAgICAgY29uc3QgdGh1bWJVcmxEYXRhOiBJbWFnZVVybERhdGEgPSB7XG4gICAgICAgICAgYnVja2V0OiBDb25maWcuZ2V0KCdhd3MuczMuQnVja2V0JyksXG4gICAgICAgICAgaW1hZ2VEaXI6ICd0aHVtYnMnLFxuICAgICAgICAgIGltYWdlSWQsXG4gICAgICAgICAgdHlwZTogJ3VzZXJzJyxcbiAgICAgICAgICB0eXBlSWQ6IHVzZXJJZFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4udXNlcixcbiAgICAgICAgICBuYW1lOiBnZXREaXNwbGF5TmFtZSh1c2VyKSxcbiAgICAgICAgICB0aHVtYjogZ2V0SW1hZ2VVcmwodGh1bWJVcmxEYXRhKVxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBjb252ZXJzYXRpb247XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlQ29udmVyc2F0aW9uID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBjb252ZXJzYXRpb246IENvbnZlcnNhdGlvblR5cGVcbik6IFByb21pc2U8Q29udmVyc2F0aW9uVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICd1cGRhdGVDb252ZXJzYXRpb24nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICBjb252ZXJzYXRpb25JZCA9IGNyZWF0ZUhhc2goYGNvbnZlcnNhdGlvbi0ke3Nlc3Npb25JZH0gYCksXG4gICAgaXNEaXJlY3QgPSBmYWxzZSxcbiAgICBuYW1lXG4gIH0gPSBjb252ZXJzYXRpb247XG4gIGNvbnN0IGZvcm1hdENvbnZlcnNhdGlvbklkOiBzdHJpbmcgPSBwYXJzZUlkKGNvbnZlcnNhdGlvbklkKTtcbiAgY29uc3Qgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICBjb25zdCB1cGRhdGUgPSB7XG4gICAgaXNEaXJlY3QsXG4gICAgbW9kaWZpZWQ6IG5vdyxcbiAgICBuYW1lXG4gIH07XG5cbiAgY29uc3QgaW5zZXJ0ID0ge1xuICAgIC4uLmNsb25lRGVlcCh1cGRhdGUpLFxuICAgIF9rZXk6IGZvcm1hdENvbnZlcnNhdGlvbklkLFxuICAgIGFkZGVkOiBub3dcbiAgfTtcblxuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQU0VSVCB7X2tleTogJHtmb3JtYXRDb252ZXJzYXRpb25JZH0gfVxuICAgIElOU0VSVCAke2luc2VydH1cbiAgICBVUERBVEUgJHt1cGRhdGV9XG4gICAgSU4gY29udmVyc2F0aW9ucyBSRVRVUk4gTkVXYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigoY29udmVyc2F0aW9uOiBDb252ZXJzYXRpb25UeXBlKSA9PiBjb252ZXJzYXRpb24pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZFVzZXJUb0NvbnZlcnNhdGlvbiA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAge1xuICAgIGNvbnZlcnNhdGlvbklkLFxuICAgIHVzZXJJZFxuICB9OiBVcGRhdGVDb252ZXJzYXRpb25Vc2VyUGFyYW1zXG4pOiBQcm9taXNlPENvbnZlcnNhdGlvblR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnYWRkVXNlclRvQ29udmVyc2F0aW9uJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRDb252ZXJzYXRpb25JZDogc3RyaW5nID0gcGFyc2VJZChjb252ZXJzYXRpb25JZCk7XG4gIGNvbnN0IGZvcm1hdFVzZXJJZDogc3RyaW5nID0gcGFyc2VJZCh1c2VySWQpO1xuICBjb25zdCBjb252ZXJzYXRpb25Eb2NJZDogc3RyaW5nID0gYGNvbnZlcnNhdGlvbnMvJHtmb3JtYXRDb252ZXJzYXRpb25JZH1gO1xuICBjb25zdCB1c2VyRG9jSWQ6IHN0cmluZyA9IGB1c2Vycy8ke2Zvcm1hdFVzZXJJZH1gO1xuXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIGhjIElOIGhhc0NvbnZlcnNhdGlvblxuICAgIEZJTFRFUiBoYy5fZnJvbSA9PSAke3VzZXJEb2NJZH0gJiYgaGMuX3RvID09ICR7Y29udmVyc2F0aW9uRG9jSWR9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBoY2A7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKGhhc0NvbnZlcnNhdGlvbkVkZ2UpID0+IHtcbiAgICAgIGlmKCEhaGFzQ29udmVyc2F0aW9uRWRnZSkge1xuICAgICAgICByZXR1cm4gaGFzQ29udmVyc2F0aW9uRWRnZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZWRnZUNvbGxlY3Rpb246IEVkZ2VDb2xsZWN0aW9uID0gdXNlRGIoZGF0YWJhc2VOYW1lKS5jb2xsZWN0aW9uKCdoYXNDb252ZXJzYXRpb24nKTtcbiAgICAgIGNvbnN0IGVkZ2VJZDogc3RyaW5nID0gY3JlYXRlSGFzaChgY29udm8gLSAke2Zvcm1hdENvbnZlcnNhdGlvbklkfSAtJHtmb3JtYXRVc2VySWR9IGApO1xuXG4gICAgICBjb25zdCBlZGdlOiBDb252ZXJzYXRpb25UeXBlID0ge1xuICAgICAgICBfZnJvbTogdXNlckRvY0lkLFxuICAgICAgICBfa2V5OiBlZGdlSWQsXG4gICAgICAgIF90bzogY29udmVyc2F0aW9uRG9jSWQsXG4gICAgICAgIGFkZGVkOiBEYXRlLm5vdygpXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gZWRnZUNvbGxlY3Rpb25cbiAgICAgICAgLnNhdmUoZWRnZSwge3JldHVybk5ldzogdHJ1ZX0pXG4gICAgICAgIC50aGVuKCgpID0+IGVkZ2UpO1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZVVzZXJGcm9tQ29udmVyc2F0aW9uID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB7XG4gICAgY29udmVyc2F0aW9uSWQsXG4gICAgdXNlcklkXG4gIH06IFVwZGF0ZUNvbnZlcnNhdGlvblVzZXJQYXJhbXNcbik6IFByb21pc2U8Q29udmVyc2F0aW9uVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdkZWxldGVVc2VyRnJvbUNvbnZlcnNhdGlvbic7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0Q29udmVyc2F0aW9uSWQ6IHN0cmluZyA9IHBhcnNlSWQoY29udmVyc2F0aW9uSWQpO1xuICBjb25zdCBmb3JtYXRVc2VySWQ6IHN0cmluZyA9IHBhcnNlSWQodXNlcklkKTtcbiAgY29uc3QgY29udmVyc2F0aW9uRG9jSWQ6IHN0cmluZyA9IGBjb252ZXJzYXRpb25zLyR7Zm9ybWF0Q29udmVyc2F0aW9uSWR9YDtcbiAgY29uc3QgdXNlckRvY0lkOiBzdHJpbmcgPSBgdXNlcnMvJHtmb3JtYXRVc2VySWR9YDtcblxuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBoYyBJTiBoYXNDb252ZXJzYXRpb25cbiAgICBGSUxURVIgaGMuX2Zyb20gPT0gJHt1c2VyRG9jSWR9ICYmIGhjLl90byA9PSAke2NvbnZlcnNhdGlvbkRvY0lkfVxuICAgIExJTUlUIDFcbiAgICBSRU1PVkUgaGMgSU4gaGFzQ29udmVyc2F0aW9uXG4gICAgUkVUVVJOIE9MRGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcbiJdLAogICJtYXBwaW5ncyI6ICJBQUlBLE9BQVEsY0FBQUEsRUFBWSxXQUFBQyxNQUFjLGVBQ2xDLE9BQVEsT0FBQUMsTUFBVSxXQUVsQixPQUFPQyxNQUFlLG1CQUV0QixPQUFRLGVBQUFDLE1BQWtCLFdBQzFCLE9BQVEsa0JBQUFDLEVBQWdCLFdBQUFDLE1BQWMsVUFDdEMsT0FBUSxVQUFBQyxNQUFhLFlBQ3JCLE9BQVEsY0FBQUMsTUFBaUIsdUJBQ3pCLE9BQVEsWUFBQUMsTUFBZSwwQkFDdkIsT0FBUSxZQUFBQyxFQUFVLFdBQUFDLEVBQVMsU0FBQUMsTUFBWSx5QkFpQnZDLE1BQU1DLEVBQXdCLGdCQUVqQkMsRUFBMkIsQ0FBQ0MsRUFBK0IsQ0FBQyxJQUFNLENBQzdFLEtBQU0sQ0FDSixLQUFBQyxFQUFPLEVBQ1AsR0FBQUMsRUFBSyxFQUNQLEVBQUlGLEVBRUosTUFBTyxDQUNMLE1BQU9MLEVBQVNNLEVBQU1DLENBQUUsQ0FDMUIsQ0FDRixFQUVhQyxFQUFtQixDQUFDQyxFQUFxQkMsRUFBZ0JMLElBQTBDLENBQzlHLE1BQU1NLEVBQWlCLG1CQUNqQixDQUFDLGFBQUFDLENBQVksRUFBSUgsRUFDakIsQ0FBQyxNQUFBSSxDQUFLLEVBQUlULEVBQXlCQyxDQUFPLEVBQzFDUyxFQUFvQixTQUFTSixDQUFNLEdBQ25DSyxFQUFpQiw4QkFBOEJELENBQVM7QUFBQSxNQUMxREQsRUFBTSxHQUFHO0FBQUE7QUFBQTtBQUFBLHlCQUdVQyxDQUFTO0FBQUE7QUFBQTtBQUFBLHFDQUtoQyxPQUFP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QSxnQkFLbEUsT0FBTzVDLEVBQU1VLENBQVksRUFBRSxNQUFNRyxDQUFNLEVBQ3BDLEtBQU1DLEdBQVdBLEVBQU8sS0FBSyxDQUFDLEVBQzlCLE1BQU9DLEdBQWlCbEIsRUFBUyxDQUNoQyxPQUFBWSxFQUNBLFNBQVVSLEVBQ1YsTUFBT0wsRUFBVyxjQUNwQixFQUFHbUIsRUFBT1IsQ0FBTyxDQUFDLENBQ3RCIiwKICAibmFtZXMiOiBbImNyZWF0ZUhhc2giLCAicGFyc2VJZCIsICJhcWwiLCAiY2xvbmVEZWVwIiwgImdldEltYWdlVXJsIiwgImdldERpc3BsYXlOYW1lIiwgImdldFVzZXIiLCAiQ29uZmlnIiwgIkVycm9yVHlwZXMiLCAibG9nRXJyb3IiLCAiZ2V0TGltaXQiLCAic29ydElkcyIsICJ1c2VEYiIsICJldmVudENhdGVnb3J5IiwgInBhcnNlQ29udmVyc2F0aW9uT3B0aW9ucyIsICJvcHRpb25zIiwgImZyb20iLCAidG8iLCAiZ2V0Q29udmVyc2F0aW9ucyIsICJjb250ZXh0IiwgInVzZXJJZCIsICJhY3Rpb24iLCAiZGF0YWJhc2VOYW1lIiwgImxpbWl0IiwgInVzZXJEb2NJZCIsICJhcWxRcnkiLCAiY3Vyc29yIiwgImVycm9yIiwgImdldERpcmVjdENvbnZlcnNhdGlvbiIsICJmcm9tSWQiLCAidG9JZCIsICJ0b1VzZXIiLCAiZm9ybWF0RnJvbUlkIiwgImZvcm1hdFRvSWQiLCAic29ydGVkVXNlcklkcyIsICJjb252ZXJzYXRpb25JZCIsICJ1c2VyIiwgImNvbnZlcnNhdGlvbiIsICJhZGREaXJlY3RDb252ZXJzYXRpb24iLCAiZGF0YWJhc2VFcnJvciIsICJ1c2VySWRzIiwgIm5vdyIsICJpbnNlcnRRdWVyeSIsICJ1cGRhdGVkQ29udmVyc2F0aW9uIiwgImVkZ2VJZCIsICJlZGdlIiwgImluc2VydEVkZ2VRdWVyeSIsICJnZXRDb25uZWN0aW9uVXNlcnMiLCAiaW5jbHVkZUFsbCIsICJpc0RpcmVjdCIsICJzZXNzaW9uVXNlcklkIiwgImZpbHRlcnMiLCAiZ2V0Q29udmVyc2F0aW9uVXNlcnMiLCAiZ2V0Q29udmVyc2F0aW9uIiwgInNlc3Npb25JZCIsICJzZXNzaW9uRG9jSWQiLCAiY29udmVyc2F0aW9uRG9jSWQiLCAiaW1hZ2VJZCIsICJ0aHVtYlVybERhdGEiLCAidXBkYXRlQ29udmVyc2F0aW9uIiwgIm5hbWUiLCAiZm9ybWF0Q29udmVyc2F0aW9uSWQiLCAidXBkYXRlIiwgImluc2VydCIsICJhZGRVc2VyVG9Db252ZXJzYXRpb24iLCAiZm9ybWF0VXNlcklkIiwgImhhc0NvbnZlcnNhdGlvbkVkZ2UiLCAiZWRnZUNvbGxlY3Rpb24iLCAiZGVsZXRlVXNlckZyb21Db252ZXJzYXRpb24iXQp9Cg==