@resolveio/server-lib 1.0.0-rc28 → 1.0.0-rc4

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 (159) hide show
  1. package/collections/active-subscription.collection.js +2 -68
  2. package/collections/app-status.collection.js +2 -43
  3. package/collections/app-version.collection.js +2 -56
  4. package/collections/counter.collection.js +2 -73
  5. package/collections/cron-job-history.collection.js +2 -86
  6. package/collections/cron-job.collection.js +2 -89
  7. package/collections/file.collection.js +2 -73
  8. package/collections/flag.collection.js +2 -47
  9. package/collections/log.collection.js +2 -64
  10. package/collections/logged-in-users.collection.js +2 -70
  11. package/collections/method-call.collection.js +2 -44
  12. package/collections/method-response.collection.js +2 -48
  13. package/collections/queue-flag.collection.js +2 -41
  14. package/collections/queue-method.collection.js +2 -116
  15. package/collections/queue-response.collection.js +2 -78
  16. package/collections/support-ticket.collection.js +2 -146
  17. package/collections/user.collection.js +2 -108
  18. package/cron/cron.js +2 -160
  19. package/fixtures/cron-jobs.js +2 -72
  20. package/fixtures/init.js +2 -73
  21. package/http/auth.js +2 -472
  22. package/http/health.js +2 -8
  23. package/index.js +2 -125
  24. package/managers/cron.manager.js +2 -193
  25. package/managers/method.manager.js +2 -544
  26. package/managers/queue-method.manager.js +2 -239
  27. package/managers/subscription.manager.js +2 -700
  28. package/managers/support.manager.js +2 -208
  29. package/methods/accounts.js +2 -253
  30. package/methods/aws.js +2 -345
  31. package/methods/cloudconvert.js +2 -37
  32. package/methods/collections.js +2 -738
  33. package/methods/counters.js +2 -404
  34. package/methods/cron-jobs.js +2 -63
  35. package/methods/flags.js +2 -6
  36. package/methods/logs.js +2 -29
  37. package/methods/pdf.js +2 -303
  38. package/models/active-subscription.model.js +2 -2
  39. package/models/app-status.model.js +2 -2
  40. package/models/app-version.model.js +2 -2
  41. package/models/collection-document.model.js +2 -2
  42. package/models/counter.model.js +2 -2
  43. package/models/cron-job-history.model.js +2 -2
  44. package/models/cron-job.model.js +2 -2
  45. package/models/dialog.model.js +2 -2
  46. package/models/file.model.js +2 -2
  47. package/models/flag.model.js +2 -2
  48. package/models/log.model.js +2 -2
  49. package/models/logged-in-users.model.js +2 -2
  50. package/models/method-call.model.js +2 -2
  51. package/models/method-response.model.js +2 -2
  52. package/models/method.model.js +2 -2
  53. package/models/pagination.model.js +2 -20
  54. package/models/permission.model.js +2 -2
  55. package/models/queue-method.model.js +2 -2
  56. package/models/queue-response.model.js +2 -2
  57. package/models/select-data-label.model.js +2 -2
  58. package/models/server-response.model.js +2 -2
  59. package/models/subscription.model.js +2 -2
  60. package/models/support-method.model.js +2 -2
  61. package/models/support-ticket.model.js +2 -2
  62. package/models/user.model.js +2 -2
  63. package/package.json +2 -4
  64. package/publications/app-status.js +2 -14
  65. package/publications/app-version.js +2 -14
  66. package/publications/cron-jobs.js +2 -14
  67. package/publications/files.js +2 -71
  68. package/publications/flags.js +2 -23
  69. package/publications/logs.js +2 -26
  70. package/publications/method-calls.js +2 -14
  71. package/publications/method-responses.js +2 -14
  72. package/publications/super-admin.js +2 -21
  73. package/publications/support-tickets.js +2 -118
  74. package/server-app.js +2 -641
  75. package/support-methods/aws.js +2 -276
  76. package/support-methods/collections.js +2 -471
  77. package/support-methods/counters.js +2 -189
  78. package/support-methods/support.js +2 -19
  79. package/util/common.js +2 -334
  80. package/collections/active-subscription.collection.d.ts +0 -8
  81. package/collections/app-status.collection.d.ts +0 -8
  82. package/collections/app-version.collection.d.ts +0 -8
  83. package/collections/counter.collection.d.ts +0 -10
  84. package/collections/cron-job-history.collection.d.ts +0 -8
  85. package/collections/cron-job.collection.d.ts +0 -8
  86. package/collections/file.collection.d.ts +0 -10
  87. package/collections/flag.collection.d.ts +0 -8
  88. package/collections/log.collection.d.ts +0 -8
  89. package/collections/logged-in-users.collection.d.ts +0 -8
  90. package/collections/method-call.collection.d.ts +0 -7
  91. package/collections/method-response.collection.d.ts +0 -7
  92. package/collections/queue-flag.collection.d.ts +0 -8
  93. package/collections/queue-method.collection.d.ts +0 -8
  94. package/collections/queue-response.collection.d.ts +0 -8
  95. package/collections/support-ticket.collection.d.ts +0 -8
  96. package/collections/user.collection.d.ts +0 -9
  97. package/cron/cron.d.ts +0 -6
  98. package/fixtures/cron-jobs.d.ts +0 -2
  99. package/fixtures/init.d.ts +0 -2
  100. package/http/auth.d.ts +0 -3
  101. package/http/health.d.ts +0 -2
  102. package/index.d.ts +0 -17
  103. package/managers/cron.manager.d.ts +0 -17
  104. package/managers/method.manager.d.ts +0 -28
  105. package/managers/queue-method.manager.d.ts +0 -14
  106. package/managers/subscription.manager.d.ts +0 -27
  107. package/managers/support.manager.d.ts +0 -18
  108. package/methods/accounts.d.ts +0 -3
  109. package/methods/aws.d.ts +0 -3
  110. package/methods/cloudconvert.d.ts +0 -3
  111. package/methods/collections.d.ts +0 -3
  112. package/methods/counters.d.ts +0 -3
  113. package/methods/cron-jobs.d.ts +0 -3
  114. package/methods/flags.d.ts +0 -3
  115. package/methods/logs.d.ts +0 -3
  116. package/methods/pdf.d.ts +0 -3
  117. package/models/active-subscription.model.d.ts +0 -14
  118. package/models/app-status.model.d.ts +0 -5
  119. package/models/app-version.model.d.ts +0 -5
  120. package/models/collection-document.model.d.ts +0 -7
  121. package/models/counter.model.d.ts +0 -6
  122. package/models/cron-job-history.model.d.ts +0 -13
  123. package/models/cron-job.model.d.ts +0 -14
  124. package/models/dialog.model.d.ts +0 -24
  125. package/models/file.model.d.ts +0 -10
  126. package/models/flag.model.d.ts +0 -6
  127. package/models/log.model.d.ts +0 -12
  128. package/models/logged-in-users.model.d.ts +0 -10
  129. package/models/method-call.model.d.ts +0 -8
  130. package/models/method-response.model.d.ts +0 -9
  131. package/models/method.model.d.ts +0 -11
  132. package/models/notification.model.d.ts +0 -5
  133. package/models/notification.model.js +0 -2
  134. package/models/pagination.model.d.ts +0 -12
  135. package/models/permission.model.d.ts +0 -13
  136. package/models/queue-method.model.d.ts +0 -10
  137. package/models/queue-response.model.d.ts +0 -11
  138. package/models/select-data-label.model.d.ts +0 -10
  139. package/models/server-response.model.d.ts +0 -6
  140. package/models/subscription.model.d.ts +0 -31
  141. package/models/support-method.model.d.ts +0 -10
  142. package/models/support-ticket.model.d.ts +0 -40
  143. package/models/user.model.d.ts +0 -15
  144. package/publications/app-status.d.ts +0 -3
  145. package/publications/app-version.d.ts +0 -3
  146. package/publications/cron-jobs.d.ts +0 -3
  147. package/publications/files.d.ts +0 -3
  148. package/publications/flags.d.ts +0 -3
  149. package/publications/logs.d.ts +0 -3
  150. package/publications/method-calls.d.ts +0 -3
  151. package/publications/method-responses.d.ts +0 -3
  152. package/publications/super-admin.d.ts +0 -3
  153. package/publications/support-tickets.d.ts +0 -2
  154. package/server-app.d.ts +0 -34
  155. package/support-methods/aws.d.ts +0 -3
  156. package/support-methods/collections.d.ts +0 -3
  157. package/support-methods/counters.d.ts +0 -3
  158. package/support-methods/support.d.ts +0 -3
  159. package/util/common.d.ts +0 -15
@@ -1,471 +1,2 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- var mongoose_1 = require("mongoose");
4
- var common_1 = require("../util/common");
5
- var simpl_schema_1 = require("simpl-schema");
6
- var log_collection_1 = require("../collections/log.collection");
7
- var pagination_model_1 = require("../models/pagination.model");
8
- var __1 = require("..");
9
- function loadSupportCollectionMethods(supportManager) {
10
- supportManager.supportMethods({
11
- findOne: {
12
- check: new simpl_schema_1.default({
13
- collection: {
14
- type: String
15
- },
16
- query: {
17
- type: Object,
18
- blackbox: true
19
- }
20
- }),
21
- function: function (collection, query) {
22
- return __1.ResolveIOServer.getSupportDB().model(collection).findOne(query).exec();
23
- }
24
- },
25
- find: {
26
- check: new simpl_schema_1.default({
27
- collection: {
28
- type: String
29
- },
30
- query: {
31
- type: Object,
32
- blackbox: true
33
- },
34
- sort: {
35
- type: Object,
36
- blackbox: true,
37
- optional: true
38
- }
39
- }),
40
- function: function (collection, query, sortQuery) {
41
- if (sortQuery === void 0) { sortQuery = {}; }
42
- return __1.ResolveIOServer.getSupportDB().model(collection).find(query).sort(sortQuery).exec();
43
- }
44
- },
45
- findWithOptions: {
46
- check: new simpl_schema_1.default({
47
- collection: {
48
- type: String
49
- },
50
- query: {
51
- type: Object,
52
- blackbox: true
53
- },
54
- options: {
55
- type: pagination_model_1.PaginationOptionsSchema
56
- }
57
- }),
58
- function: function (collection, query, options) {
59
- return __1.ResolveIOServer.getSupportDB().model(collection).find(query).sort(options.sort).limit(options.limit).skip(options.skip).select(options.fields).exec();
60
- }
61
- },
62
- // Insert 1 document
63
- // @Inputs: collection, document
64
- // @Outputs: res = _id of new document, err = not inserted
65
- insertDocument: {
66
- check: new simpl_schema_1.default({
67
- collection: {
68
- type: String
69
- },
70
- document: {
71
- type: Object,
72
- blackbox: true
73
- }
74
- }),
75
- function: function (collection, document) {
76
- var _this = this;
77
- return new Promise(function (resolve, reject) {
78
- var schemaErrors = null;
79
- try {
80
- __1.ResolveIOServer.getSupportDB().model(collection)['simplschema'].validate(document);
81
- }
82
- catch (errors) {
83
- schemaErrors = errors;
84
- supportManager.getMainServer().getMethodManager().callMethodInternal('insertErrorLog', 'Schema Failed on insert - ' + collection, [schemaErrors, document]);
85
- }
86
- if (schemaErrors) {
87
- console.log(schemaErrors);
88
- reject('Schema Errors');
89
- }
90
- else {
91
- if (common_1.getBinarySize(JSON.stringify(document)) < 200000) {
92
- log_collection_1.Logs.create({
93
- _id: mongoose_1.Types.ObjectId().toHexString(),
94
- date: new Date(),
95
- type: 'info',
96
- title: 'Insert Document',
97
- message: 'User: ' + _this.user + ', Collection Type: ' + collection,
98
- payload: document,
99
- method: 'insertDocument',
100
- user: _this.user,
101
- messageId: ''
102
- });
103
- }
104
- else {
105
- log_collection_1.Logs.create({
106
- _id: mongoose_1.Types.ObjectId().toHexString(),
107
- date: new Date(),
108
- type: 'info',
109
- title: 'Insert Document',
110
- message: 'User: ' + _this.user + ', Collection Type: ' + collection,
111
- payload: 'Too Big',
112
- method: 'insertDocument',
113
- user: _this.user,
114
- messageId: ''
115
- });
116
- }
117
- var id_1 = mongoose_1.Types.ObjectId().toHexString();
118
- document._id = id_1;
119
- document.__v = 0;
120
- __1.ResolveIOServer.getSupportDB().model(collection).create(document).then(function () { return resolve(id_1); }, function (err) { return reject(err); });
121
- }
122
- });
123
- }
124
- },
125
- // Replaces 1 document with new document (from _id)
126
- // @Inputs: collection, document id
127
- // @Outputs: res = 1 (updated 1), res = 0 (not updated), err = not updated/wrong version
128
- // Search for doc, check version, if found then try and update
129
- updateDocument: {
130
- check: new simpl_schema_1.default({
131
- collection: {
132
- type: String
133
- },
134
- f_document: {
135
- type: Object,
136
- blackbox: true
137
- }
138
- }),
139
- function: function (collection, f_document) {
140
- var _this = this;
141
- return new Promise(function (resolve, reject) {
142
- __1.ResolveIOServer.getSupportDB().model(collection).findOne({ _id: f_document._id }).lean().exec(function (errDoc, currDoc) {
143
- if (currDoc) {
144
- if (currDoc.__v === f_document.__v) {
145
- var versionDoc = common_1.deepCopy(currDoc);
146
- versionDoc._id = {
147
- _id: currDoc._id,
148
- __v: currDoc.__v
149
- };
150
- var schemaErrors = null;
151
- try {
152
- __1.ResolveIOServer.getSupportDB().model(collection)['simplschema'].validate(f_document);
153
- }
154
- catch (errors) {
155
- schemaErrors = errors;
156
- supportManager.getMainServer().getMethodManager().callMethodInternal('insertErrorLog', 'Schema Failed on updateDocument - ' + collection, [schemaErrors, f_document]);
157
- }
158
- if (schemaErrors) {
159
- console.log(schemaErrors);
160
- reject('Schema Errors');
161
- }
162
- else {
163
- __1.ResolveIOServer.getSupportDB().model(__1.ResolveIOServer.getSupportDB().model(collection)['versionCollection']).create(versionDoc).then(function (doc) {
164
- __1.ResolveIOServer.getSupportDB().model(__1.ResolveIOServer.getSupportDB().model(collection)['versionCollection']).deleteMany({
165
- $and: [
166
- { '_id._id': currDoc._id },
167
- { '_id.__v': { $lte: currDoc.__v - 4 } }
168
- ]
169
- }).exec();
170
- }, function (err) {
171
- console.log(err);
172
- });
173
- var updates = common_1.getMongoUpdates(currDoc, f_document, true);
174
- if (updates) {
175
- __1.ResolveIOServer.getSupportDB().model(collection).updateOne({ _id: f_document._id }, updates, { strict: false }).exec().then(function (res) {
176
- resolve(res.nModified);
177
- }, function (err) { return reject(err); });
178
- }
179
- else {
180
- resolve(1);
181
- }
182
- if (common_1.getBinarySize(JSON.stringify(f_document)) < 200000) {
183
- log_collection_1.Logs.create({
184
- _id: mongoose_1.Types.ObjectId().toHexString(),
185
- date: new Date(),
186
- type: 'info',
187
- title: 'Update Document',
188
- message: 'User: ' + _this.user + ', Collection Type: ' + collection,
189
- payload: f_document,
190
- method: 'updateDocument',
191
- user: _this.user,
192
- messageId: ''
193
- });
194
- }
195
- else {
196
- log_collection_1.Logs.create({
197
- _id: mongoose_1.Types.ObjectId().toHexString(),
198
- date: new Date(),
199
- type: 'info',
200
- title: 'Update Document',
201
- message: 'User: ' + _this.user + ', Collection Type: ' + collection,
202
- payload: 'Too Big',
203
- method: 'updateDocument',
204
- user: _this.user,
205
- messageId: ''
206
- });
207
- }
208
- }
209
- }
210
- else {
211
- console.log('invalid version - ' + collection, currDoc.__v, f_document.__v);
212
- __1.ResolveIOServer.getSupportDB().model(__1.ResolveIOServer.getSupportDB().model(collection)['versionCollection']).findOne({
213
- $and: [
214
- { '_id._id': currDoc._id },
215
- { '_id.__v': f_document.__v }
216
- ]
217
- }).lean().exec(function (errOldDoc, oldDoc) {
218
- var newCurrDocId = currDoc._id;
219
- if (oldDoc) {
220
- var versionDoc_1 = common_1.deepCopy(currDoc);
221
- versionDoc_1._id = {
222
- _id: currDoc._id,
223
- __v: currDoc.__v
224
- };
225
- var updatedDoc = common_1.getMongoMergeUpdatedDoc(f_document, currDoc, oldDoc);
226
- updatedDoc._id = newCurrDocId;
227
- updatedDoc.__v++;
228
- __1.ResolveIOServer.getSupportDB().model(collection).replaceOne({ _id: newCurrDocId }, updatedDoc).exec().then(function (res) {
229
- __1.ResolveIOServer.getSupportDB().model(__1.ResolveIOServer.getSupportDB().model(collection)['versionCollection']).create(versionDoc_1).then(function (doc) {
230
- __1.ResolveIOServer.getSupportDB().model(__1.ResolveIOServer.getSupportDB().model(collection)['versionCollection']).deleteMany({
231
- $and: [
232
- { '_id._id': versionDoc_1._id._id },
233
- { '_id.__v': { $lte: versionDoc_1._id.__v - 4 } }
234
- ]
235
- }).exec();
236
- resolve(res.nModified);
237
- });
238
- }, function (err) { return reject(err); });
239
- }
240
- else {
241
- reject('Invalid Version And Could Not Find History - DB: ' + currDoc.__v + ', Trying to update with :' + f_document.__v);
242
- }
243
- });
244
- }
245
- }
246
- else {
247
- reject(errDoc);
248
- }
249
- });
250
- });
251
- }
252
- },
253
- // Updates 1 document's props (from _id)
254
- // @Inputs: collection, document id, document version, update paramters ({prop: 'xxx', data: 'yyy})
255
- // @Outputs: res = 1 (updated 1), res = 0 (not updated), err = not updated/wrong version
256
- // Search for doc, check version, if found then try and update props
257
- updateDocumentProps: {
258
- check: new simpl_schema_1.default({
259
- collection: {
260
- type: String
261
- },
262
- doc_id: {
263
- type: String
264
- },
265
- updateParams: {
266
- type: Array
267
- },
268
- 'updateParams.$': {
269
- type: Object,
270
- blackbox: true
271
- },
272
- doc__v: {
273
- type: Number
274
- }
275
- }),
276
- function: function (collection, doc_id, updateParams, doc__v) {
277
- var _this = this;
278
- return new Promise(function (resolve, reject) {
279
- __1.ResolveIOServer.getSupportDB().model(collection).findOne({ _id: doc_id }).lean().exec(function (errDoc, currDoc) {
280
- if (currDoc) {
281
- var modifiedDoc_1 = common_1.deepCopy(currDoc);
282
- updateParams.forEach(function (data) {
283
- modifiedDoc_1[data.prop] = data.data;
284
- });
285
- if (modifiedDoc_1.__v === doc__v) {
286
- var versionDoc = common_1.deepCopy(currDoc);
287
- versionDoc._id = {
288
- _id: currDoc._id,
289
- __v: currDoc.__v
290
- };
291
- var schemaErrors = null;
292
- try {
293
- __1.ResolveIOServer.getSupportDB().model(collection)['simplschema'].validate(modifiedDoc_1);
294
- }
295
- catch (errors) {
296
- schemaErrors = errors;
297
- supportManager.getMainServer().getMethodManager().callMethodInternal('insertErrorLog', 'Schema Failed on updateDocumentProps - ' + collection, [schemaErrors, modifiedDoc_1]);
298
- }
299
- if (schemaErrors) {
300
- console.log(schemaErrors);
301
- reject('Schema Errors');
302
- }
303
- else {
304
- __1.ResolveIOServer.getSupportDB().model(__1.ResolveIOServer.getSupportDB().model(collection)['versionCollection']).create(versionDoc).then(function (doc) {
305
- __1.ResolveIOServer.getSupportDB().model(__1.ResolveIOServer.getSupportDB().model(collection)['versionCollection']).deleteMany({
306
- $and: [
307
- { '_id._id': currDoc._id },
308
- { '_id.__v': { $lte: currDoc.__v - 4 } }
309
- ]
310
- }).exec();
311
- }, function (err) {
312
- console.log(err);
313
- });
314
- var updates = common_1.getMongoUpdates(currDoc, modifiedDoc_1, true);
315
- if (updates) {
316
- __1.ResolveIOServer.getSupportDB().model(collection).updateOne({ _id: modifiedDoc_1._id }, updates, { strict: false }).exec().then(function (res) {
317
- resolve(res.ok);
318
- }, function (err) { return reject(err); });
319
- }
320
- else {
321
- resolve(1);
322
- }
323
- if (common_1.getBinarySize(JSON.stringify(updateParams)) < 200000) {
324
- log_collection_1.Logs.create({
325
- _id: mongoose_1.Types.ObjectId().toHexString(),
326
- date: new Date(),
327
- type: 'info',
328
- title: 'Update Document Props',
329
- message: 'User: ' + _this.user + ', Collection Type: ' + collection + ', Id: ' + doc_id + ', ' + 'Version: ' + doc__v,
330
- payload: updateParams,
331
- method: 'updateDocumentProps',
332
- user: _this.user,
333
- messageId: ''
334
- });
335
- }
336
- else {
337
- log_collection_1.Logs.create({
338
- _id: mongoose_1.Types.ObjectId().toHexString(),
339
- date: new Date(),
340
- type: 'info',
341
- title: 'Update Document Props',
342
- message: 'User: ' + _this.user + ', Collection Type: ' + collection + ', Id: ' + doc_id + ', ' + 'Version: ' + doc__v,
343
- payload: 'Too Big',
344
- method: 'updateDocumentProps',
345
- user: _this.user,
346
- messageId: ''
347
- });
348
- }
349
- }
350
- }
351
- else {
352
- console.log('invalid version - ' + collection, currDoc.__v, doc__v);
353
- __1.ResolveIOServer.getSupportDB().model(__1.ResolveIOServer.getSupportDB().model(collection)['versionCollection']).findOne({
354
- $and: [
355
- { '_id._id': currDoc._id },
356
- { '_id.__v': doc__v }
357
- ]
358
- }).lean().exec(function (errOldDoc, oldDoc) {
359
- var newCurrDocId = currDoc._id;
360
- if (oldDoc) {
361
- var versionDoc_2 = common_1.deepCopy(currDoc);
362
- versionDoc_2._id = {
363
- _id: currDoc._id,
364
- __v: currDoc.__v
365
- };
366
- var updatedDoc = common_1.getMongoMergeUpdatedDoc(modifiedDoc_1, currDoc, oldDoc);
367
- updatedDoc._id = newCurrDocId;
368
- updatedDoc.__v++;
369
- __1.ResolveIOServer.getSupportDB().model(collection).replaceOne({ _id: newCurrDocId }, updatedDoc).exec().then(function (res) {
370
- __1.ResolveIOServer.getSupportDB().model(__1.ResolveIOServer.getSupportDB().model(collection)['versionCollection']).create(versionDoc_2).then(function (doc) {
371
- __1.ResolveIOServer.getSupportDB().model(__1.ResolveIOServer.getSupportDB().model(collection)['versionCollection']).deleteMany({
372
- $and: [
373
- { '_id._id': versionDoc_2._id._id },
374
- { '_id.__v': { $lte: versionDoc_2._id.__v - 4 } }
375
- ]
376
- }).exec();
377
- }, function (err) {
378
- console.log(err);
379
- });
380
- resolve(res.nModified);
381
- }, function (err) { return reject(err); });
382
- }
383
- else {
384
- reject('Invalid Version And Could Not Find History Props - DB: ' + currDoc.__v + ', Trying to update with :' + modifiedDoc_1.__v);
385
- }
386
- });
387
- }
388
- }
389
- else {
390
- reject(errDoc);
391
- }
392
- });
393
- });
394
- }
395
- },
396
- // Removes 1 document (from _id)
397
- // @Inputs: collection, document id
398
- // @Outputs: res = 1 (deleted), res = 0 (not deleted), err = not deleted
399
- // Search for doc, if found then try and remove
400
- removeDocument: {
401
- check: new simpl_schema_1.default({
402
- collection: {
403
- type: String
404
- },
405
- doc_id: {
406
- type: String
407
- }
408
- }),
409
- function: function (collection, doc_id) {
410
- var _this = this;
411
- return new Promise(function (resolve, reject) {
412
- log_collection_1.Logs.create({
413
- _id: mongoose_1.Types.ObjectId().toHexString(),
414
- date: new Date(),
415
- type: 'info',
416
- title: 'Remove Document',
417
- message: 'User: ' + _this.user + ', Collection Type: ' + collection,
418
- payload: { _id: doc_id },
419
- method: 'removeDocument',
420
- user: _this.user,
421
- messageId: ''
422
- });
423
- __1.ResolveIOServer.getSupportDB().model(collection).deleteOne({ _id: doc_id }).exec(function (err, res) {
424
- if (err) {
425
- reject(err);
426
- }
427
- else {
428
- resolve(res.ok);
429
- }
430
- });
431
- });
432
- }
433
- },
434
- removeDocumentWithQuery: {
435
- check: new simpl_schema_1.default({
436
- collection: {
437
- type: String
438
- },
439
- query: {
440
- type: Object,
441
- blackbox: true
442
- }
443
- }),
444
- function: function (collection, query) {
445
- var _this = this;
446
- return new Promise(function (resolve, reject) {
447
- log_collection_1.Logs.create({
448
- _id: mongoose_1.Types.ObjectId().toHexString(),
449
- date: new Date(),
450
- type: 'info',
451
- title: 'Remove Document (Query)',
452
- message: 'User: ' + _this.user + ', Collection Type: ' + collection,
453
- payload: { _id: query },
454
- method: 'removeDocumentWithQuery',
455
- user: _this.user,
456
- messageId: ''
457
- });
458
- __1.ResolveIOServer.getSupportDB().model(collection).deleteOne(query).exec(function (err, res) {
459
- if (err) {
460
- reject(err);
461
- }
462
- else {
463
- resolve(res.ok);
464
- }
465
- });
466
- });
467
- }
468
- }
469
- });
470
- }
471
- exports.loadSupportCollectionMethods = loadSupportCollectionMethods;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var mongoose_1=require("mongoose"),common_1=require("../util/common"),simpl_schema_1=require("simpl-schema"),log_collection_1=require("../collections/log.collection"),pagination_model_1=require("../models/pagination.model"),__1=require("..");function loadSupportCollectionMethods(p){p.supportMethods({findOne:{check:new simpl_schema_1.default({collection:{type:String},query:{type:Object,blackbox:!0}}),function:function(e,t){return __1.default.getSupportDB().model(e).findOne(t).exec()}},find:{check:new simpl_schema_1.default({collection:{type:String},query:{type:Object,blackbox:!0},sort:{type:Object,blackbox:!0,optional:!0}}),function:function(e,t,o){return void 0===o&&(o={}),__1.default.getSupportDB().model(e).find(t).sort(o).exec()}},findWithOptions:{check:new simpl_schema_1.default({collection:{type:String},query:{type:Object,blackbox:!0},options:{type:pagination_model_1.PaginationOptionsSchema}}),function:function(e,t,o){return __1.default.getSupportDB().model(e).find(t).sort(o.sort).limit(o.limit).skip(o.skip).select(o.fields).exec()}},insertDocument:{check:new simpl_schema_1.default({collection:{type:String},document:{type:Object,blackbox:!0}}),function:function(i,d){var l=this;return new Promise(function(e,t){var o=null;try{__1.default.getSupportDB().model(i).simplschema.validate(d)}catch(e){o=e,p.getMainServer().getMethodManager().callMethodInternal("insertErrorLog","Schema Failed on insert - "+i,[o,d])}if(o)console.log(o),t("Schema Errors");else{common_1.getBinarySize(JSON.stringify(d))<2e5?log_collection_1.Logs.create({_id:mongoose_1.Types.ObjectId().toHexString(),date:new Date,type:"info",title:"Insert Document",message:"User: "+l.user+", Collection Type: "+i,payload:d,method:"insertDocument",user:l.user,messageId:""}):log_collection_1.Logs.create({_id:mongoose_1.Types.ObjectId().toHexString(),date:new Date,type:"info",title:"Insert Document",message:"User: "+l.user+", Collection Type: "+i,payload:"Too Big",method:"insertDocument",user:l.user,messageId:""});var n=mongoose_1.Types.ObjectId().toHexString();d._id=n,d.__v=0,__1.default.getSupportDB().model(i).create(d).then(function(){return e(n)},function(e){return t(e)})}})}},updateDocument:{check:new simpl_schema_1.default({collection:{type:String},f_document:{type:Object,blackbox:!0}}),function:function(_,c){var i=this;return new Promise(function(l,r){__1.default.getSupportDB().model(_).findOne({_id:c._id}).lean().exec(function(e,d){if(d)if(d.__v===c.__v){var t=common_1.deepCopy(d);t._id={_id:d._id,__v:d.__v};var o=null;try{__1.default.getSupportDB().model(_).simplschema.validate(c)}catch(e){o=e,p.getMainServer().getMethodManager().callMethodInternal("insertErrorLog","Schema Failed on updateDocument - "+_,[o,c])}if(o)console.log(o),r("Schema Errors");else{__1.default.getSupportDB().model(__1.default.getSupportDB().model(_).versionCollection).create(t).then(function(e){__1.default.getSupportDB().model(__1.default.getSupportDB().model(_).versionCollection).deleteMany({$and:[{"_id._id":d._id},{"_id.__v":{$lte:d.__v-4}}]}).exec()},function(e){console.log(e)});var n=common_1.getMongoUpdates(d,c,!0);n?__1.default.getSupportDB().model(_).updateOne({_id:c._id},n,{strict:!1}).exec().then(function(e){l(e.nModified)},function(e){return r(e)}):l(1),common_1.getBinarySize(JSON.stringify(c))<2e5?log_collection_1.Logs.create({_id:mongoose_1.Types.ObjectId().toHexString(),date:new Date,type:"info",title:"Update Document",message:"User: "+i.user+", Collection Type: "+_,payload:c,method:"updateDocument",user:i.user,messageId:""}):log_collection_1.Logs.create({_id:mongoose_1.Types.ObjectId().toHexString(),date:new Date,type:"info",title:"Update Document",message:"User: "+i.user+", Collection Type: "+_,payload:"Too Big",method:"updateDocument",user:i.user,messageId:""})}}else console.log("invalid version - "+_,d.__v,c.__v),__1.default.getSupportDB().model(__1.default.getSupportDB().model(_).versionCollection).findOne({$and:[{"_id._id":d._id},{"_id.__v":c.__v}]}).lean().exec(function(e,t){var o=d._id;if(t){var n=common_1.deepCopy(d);n._id={_id:d._id,__v:d.__v};var i=common_1.getMongoMergeUpdatedDoc(c,d,t);i._id=o,i.__v++,__1.default.getSupportDB().model(_).replaceOne({_id:o},i).exec().then(function(t){__1.default.getSupportDB().model(__1.default.getSupportDB().model(_).versionCollection).create(n).then(function(e){__1.default.getSupportDB().model(__1.default.getSupportDB().model(_).versionCollection).deleteMany({$and:[{"_id._id":n._id._id},{"_id.__v":{$lte:n._id.__v-4}}]}).exec(),l(t.nModified)})},function(e){return r(e)})}else r("Invalid Version And Could Not Find History - DB: "+d.__v+", Trying to update with :"+c.__v)});else r(e)})})}},updateDocumentProps:{check:new simpl_schema_1.default({collection:{type:String},doc_id:{type:String},updateParams:{type:Array},"updateParams.$":{type:Object,blackbox:!0},doc__v:{type:Number}}),function:function(c,i,a,u){var s=this;return new Promise(function(r,_){__1.default.getSupportDB().model(c).findOne({_id:i}).lean().exec(function(e,d){if(d){var l=common_1.deepCopy(d);if(a.forEach(function(e){l[e.prop]=e.data}),l.__v===u){var t=common_1.deepCopy(d);t._id={_id:d._id,__v:d.__v};var o=null;try{__1.default.getSupportDB().model(c).simplschema.validate(l)}catch(e){o=e,p.getMainServer().getMethodManager().callMethodInternal("insertErrorLog","Schema Failed on updateDocumentProps - "+c,[o,l])}if(o)console.log(o),_("Schema Errors");else{__1.default.getSupportDB().model(__1.default.getSupportDB().model(c).versionCollection).create(t).then(function(e){__1.default.getSupportDB().model(__1.default.getSupportDB().model(c).versionCollection).deleteMany({$and:[{"_id._id":d._id},{"_id.__v":{$lte:d.__v-4}}]}).exec()},function(e){console.log(e)});var n=common_1.getMongoUpdates(d,l,!0);n?__1.default.getSupportDB().model(c).updateOne({_id:l._id},n,{strict:!1}).exec().then(function(e){r(e.ok)},function(e){return _(e)}):r(1),common_1.getBinarySize(JSON.stringify(a))<2e5?log_collection_1.Logs.create({_id:mongoose_1.Types.ObjectId().toHexString(),date:new Date,type:"info",title:"Update Document Props",message:"User: "+s.user+", Collection Type: "+c+", Id: "+i+", Version: "+u,payload:a,method:"updateDocumentProps",user:s.user,messageId:""}):log_collection_1.Logs.create({_id:mongoose_1.Types.ObjectId().toHexString(),date:new Date,type:"info",title:"Update Document Props",message:"User: "+s.user+", Collection Type: "+c+", Id: "+i+", Version: "+u,payload:"Too Big",method:"updateDocumentProps",user:s.user,messageId:""})}}else console.log("invalid version - "+c,d.__v,u),__1.default.getSupportDB().model(__1.default.getSupportDB().model(c).versionCollection).findOne({$and:[{"_id._id":d._id},{"_id.__v":u}]}).lean().exec(function(e,t){var o=d._id;if(t){var n=common_1.deepCopy(d);n._id={_id:d._id,__v:d.__v};var i=common_1.getMongoMergeUpdatedDoc(l,d,t);i._id=o,i.__v++,__1.default.getSupportDB().model(c).replaceOne({_id:o},i).exec().then(function(e){__1.default.getSupportDB().model(__1.default.getSupportDB().model(c).versionCollection).create(n).then(function(e){__1.default.getSupportDB().model(__1.default.getSupportDB().model(c).versionCollection).deleteMany({$and:[{"_id._id":n._id._id},{"_id.__v":{$lte:n._id.__v-4}}]}).exec()},function(e){console.log(e)}),r(e.nModified)},function(e){return _(e)})}else _("Invalid Version And Could Not Find History Props - DB: "+d.__v+", Trying to update with :"+l.__v)})}else _(e)})})}},removeDocument:{check:new simpl_schema_1.default({collection:{type:String},doc_id:{type:String}}),function:function(e,t){var i=this;return new Promise(function(o,n){log_collection_1.Logs.create({_id:mongoose_1.Types.ObjectId().toHexString(),date:new Date,type:"info",title:"Remove Document",message:"User: "+i.user+", Collection Type: "+e,payload:{_id:t},method:"removeDocument",user:i.user,messageId:""}),__1.default.getSupportDB().model(e).deleteOne({_id:t}).exec(function(e,t){e?n(e):o(t.ok)})})}},removeDocumentWithQuery:{check:new simpl_schema_1.default({collection:{type:String},query:{type:Object,blackbox:!0}}),function:function(e,t){var i=this;return new Promise(function(o,n){log_collection_1.Logs.create({_id:mongoose_1.Types.ObjectId().toHexString(),date:new Date,type:"info",title:"Remove Document (Query)",message:"User: "+i.user+", Collection Type: "+e,payload:{_id:t},method:"removeDocumentWithQuery",user:i.user,messageId:""}),__1.default.getSupportDB().model(e).deleteOne(t).exec(function(e,t){e?n(e):o(t.ok)})})}}})}exports.loadSupportCollectionMethods=loadSupportCollectionMethods;
2
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdXBwb3J0LW1ldGhvZHMvY29sbGVjdGlvbnMudHMiXSwibmFtZXMiOlsibW9uZ29vc2VfMSIsInJlcXVpcmUiLCJjb21tb25fMSIsInNpbXBsX3NjaGVtYV8xIiwibG9nX2NvbGxlY3Rpb25fMSIsInBhZ2luYXRpb25fbW9kZWxfMSIsIl9fMSIsImxvYWRTdXBwb3J0Q29sbGVjdGlvbk1ldGhvZHMiLCJzdXBwb3J0TWFuYWdlciIsInN1cHBvcnRNZXRob2RzIiwiZmluZE9uZSIsImNoZWNrIiwiZGVmYXVsdCIsImNvbGxlY3Rpb24iLCJ0eXBlIiwiU3RyaW5nIiwicXVlcnkiLCJPYmplY3QiLCJibGFja2JveCIsImZ1bmN0aW9uIiwiZ2V0U3VwcG9ydERCIiwibW9kZWwiLCJleGVjIiwiZmluZCIsInNvcnQiLCJvcHRpb25hbCIsInNvcnRRdWVyeSIsImZpbmRXaXRoT3B0aW9ucyIsIm9wdGlvbnMiLCJQYWdpbmF0aW9uT3B0aW9uc1NjaGVtYSIsImxpbWl0Iiwic2tpcCIsInNlbGVjdCIsImZpZWxkcyIsImluc2VydERvY3VtZW50IiwiZG9jdW1lbnQiLCJfdGhpcyIsInRoaXMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInNjaGVtYUVycm9ycyIsInZhbGlkYXRlIiwiZXJyb3JzIiwiZ2V0TWFpblNlcnZlciIsImdldE1ldGhvZE1hbmFnZXIiLCJjYWxsTWV0aG9kSW50ZXJuYWwiLCJjb25zb2xlIiwibG9nIiwiZ2V0QmluYXJ5U2l6ZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJMb2dzIiwiY3JlYXRlIiwiX2lkIiwiVHlwZXMiLCJPYmplY3RJZCIsInRvSGV4U3RyaW5nIiwiZGF0ZSIsIkRhdGUiLCJ0aXRsZSIsIm1lc3NhZ2UiLCJ1c2VyIiwicGF5bG9hZCIsIm1ldGhvZCIsIm1lc3NhZ2VJZCIsImlkXzEiLCJfX3YiLCJ0aGVuIiwiZXJyIiwidXBkYXRlRG9jdW1lbnQiLCJmX2RvY3VtZW50IiwibGVhbiIsImVyckRvYyIsImN1cnJEb2MiLCJ2ZXJzaW9uRG9jIiwiZGVlcENvcHkiLCJkb2MiLCJkZWxldGVNYW55IiwiJGFuZCIsIl9pZC5faWQiLCJfaWQuX192IiwiJGx0ZSIsInVwZGF0ZXMiLCJnZXRNb25nb1VwZGF0ZXMiLCJ1cGRhdGVPbmUiLCJzdHJpY3QiLCJyZXMiLCJuTW9kaWZpZWQiLCJlcnJPbGREb2MiLCJvbGREb2MiLCJuZXdDdXJyRG9jSWQiLCJ2ZXJzaW9uRG9jXzEiLCJ1cGRhdGVkRG9jIiwiZ2V0TW9uZ29NZXJnZVVwZGF0ZWREb2MiLCJyZXBsYWNlT25lIiwidXBkYXRlRG9jdW1lbnRQcm9wcyIsImRvY19pZCIsInVwZGF0ZVBhcmFtcyIsIkFycmF5IiwidXBkYXRlUGFyYW1zLiQiLCJkb2NfX3YiLCJOdW1iZXIiLCJtb2RpZmllZERvY18xIiwiZm9yRWFjaCIsImRhdGEiLCJwcm9wIiwib2siLCJ2ZXJzaW9uRG9jXzIiLCJyZW1vdmVEb2N1bWVudCIsImRlbGV0ZU9uZSIsInJlbW92ZURvY3VtZW50V2l0aFF1ZXJ5IiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Im9FQUFBLElBQUFBLFdBQUFDLFFBQUEsWUFDQUMsU0FBQUQsUUFBQSxrQkFDQUUsZUFBQUYsUUFBQSxnQkFDQUcsaUJBQUFILFFBQUEsaUNBQ0FJLG1CQUFBSixRQUFBLDhCQUVBSyxJQUFBTCxRQUFBLE1BRUEsU0FBZ0JNLDZCQUE2QkMsR0FDNUNBLEVBQWVDLGVBQWUsQ0FDN0JDLFFBQVMsQ0FDUkMsTUFBTyxJQUFJUixlQUFBUyxRQUFhLENBQ3ZCQyxXQUFZLENBQ1hDLEtBQU1DLFFBRVBDLE1BQU8sQ0FDTkYsS0FBTUcsT0FDTkMsVUFBVSxLQUdaQyxTQUFVLFNBQVNOLEVBQW9CRyxHQUN0QyxPQUFPVixJQUFBTSxRQUFnQlEsZUFBZUMsTUFBTVIsR0FBWUgsUUFBUU0sR0FBT00sU0FHekVDLEtBQU0sQ0FDTFosTUFBTyxJQUFJUixlQUFBUyxRQUFhLENBQ3ZCQyxXQUFZLENBQ1hDLEtBQU1DLFFBRVBDLE1BQU8sQ0FDTkYsS0FBTUcs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R0FDaEZsQixFQUNIN0IsRUFBTzZCLEdBR1A5QixFQUFRZ0QsRUFBSW9CLFVBTWpCSSx3QkFBeUIsQ0FDeEJwRyxNQUFPLElBQUlSLGVBQUFTLFFBQWEsQ0FDdkJDLFdBQVksQ0FDWEMsS0FBTUMsUUFFUEMsTUFBTyxDQUNORixLQUFNRyxPQUNOQyxVQUFVLEtBR1pDLFNBQVUsU0FBU04sRUFBb0JHLEdBQTdCLElBQUFvQixFQUFBQyxLQUNULE9BQU8sSUFBSUMsUUFBUSxTQUFDQyxFQUFTQyxHQUU1QnBDLGlCQUFBZ0QsS0FBS0MsT0FBTyxDQUNYQyxJQUFLdEQsV0FBQXVELE1BQU1DLFdBQVdDLGNBQ3RCQyxLQUFNLElBQUlDLEtBQ1Y3QyxLQUFNLE9BQ044QyxNQUFPLDBCQUNQQyxRQUFTLFNBQVd6QixFQUFLMEIsS0FBTyxzQkFBd0JqRCxFQUN4RGtELFFBQVMsQ0FBQ1QsSUFBS3RDLEdBQ2ZnRCxPQUFRLDBCQUNSRixLQUFNMUIsRUFBSzBCLEtBQ1hHLFVBQVcsS0FHWjNELElBQUFNLFFBQWdCUSxlQUFlQyxNQUFNUixHQUFZaUcsVUFBVTlGLEdBQU9NLEtBQUssU0FBQytDLEVBQUtrQixHQUN4RWxCLEVBQ0g3QixFQUFPNkIsR0FHUDlCLEVBQVFnRCxFQUFJb0IsWUFyZW5CSyxRQUFBekcsNkJBQUFBIiwiZmlsZSI6InN1cHBvcnQtbWV0aG9kcy9jb2xsZWN0aW9ucy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERvY3VtZW50LCBUeXBlc30gZnJvbSAnbW9uZ29vc2UnO1xuaW1wb3J0IHsgZ2V0TW9uZ29VcGRhdGVzLCBkZWVwQ29weSwgZ2V0TW9uZ29NZXJnZVVwZGF0ZWREb2MsIGdldEJpbmFyeVNpemUgfSBmcm9tICcuLi91dGlsL2NvbW1vbic7XG5pbXBvcnQgU2ltcGxlU2NoZW1hIGZyb20gJ3NpbXBsLXNjaGVtYSc7XG5pbXBvcnQgeyBMb2dzIH0gZnJvbSAnLi4vY29sbGVjdGlvbnMvbG9nLmNvbGxlY3Rpb24nO1xuaW1wb3J0IHsgUGFnaW5hdGlvbk9wdGlvbnNTY2hlbWEsIFBhZ2luYXRpb25PcHRpb25zIH0gZnJvbSAnLi4vbW9kZWxzL3BhZ2luYXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgU3VwcG9ydE1hbmFnZXIgfSBmcm9tICcuLi9tYW5hZ2Vycy9zdXBwb3J0Lm1hbmFnZXInO1xuaW1wb3J0IFJlc29sdmVJT1NlcnZlciBmcm9tICcuLic7XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkU3VwcG9ydENvbGxlY3Rpb25NZXRob2RzKHN1cHBvcnRNYW5hZ2VyOiBTdXBwb3J0TWFuYWdlcikge1xuXHRzdXBwb3J0TWFuYWdlci5zdXBwb3J0TWV0aG9kcyh7XG5cdFx0ZmluZE9uZToge1xuXHRcdFx0Y2hlY2s6IG5ldyBTaW1wbGVTY2hlbWEoe1xuXHRcdFx0XHRjb2xsZWN0aW9uOiB7XG5cdFx0XHRcdFx0dHlwZTogU3RyaW5nXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHF1ZXJ5OiB7XG5cdFx0XHRcdFx0dHlwZTogT2JqZWN0LFxuXHRcdFx0XHRcdGJsYWNrYm94OiB0cnVlXG5cdFx0XHRcdH1cblx0XHRcdH0pLFxuXHRcdFx0ZnVuY3Rpb246IGZ1bmN0aW9uKGNvbGxlY3Rpb246IHN0cmluZywgcXVlcnk6IE9iamVjdCkge1xuXHRcdFx0XHRyZXR1cm4gUmVzb2x2ZUlPU2VydmVyLmdldFN1cHBvcnREQigpLm1vZGVsKGNvbGxlY3Rpb24pLmZpbmRPbmUocXVlcnkpLmV4ZWMoKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGZpbmQ6IHtcblx0XHRcdGNoZWNrOiBuZXcgU2ltcGxlU2NoZW1hKHtcblx0XHRcdFx0Y29sbGVjdGlvbjoge1xuXHRcdFx0XHRcdHR5cGU6IFN0cmluZ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRxdWVyeToge1xuXHRcdFx0XHRcdHR5cGU6IE9iamVjdCxcblx0XHRcdFx0XHRibGFja2JveDogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRzb3J0OiB7XG5cdFx0XHRcdFx0dHlwZTogT2JqZWN0LFxuXHRcdFx0XHRcdGJsYWNrYm94OiB0cnVlLFxuXHRcdFx0XHRcdG9wdGlvbmFsOiB0cnVlXG5cdFx0XHRcdH1cblx0XHRcdH0pLFxuXHRcdFx0ZnVuY3Rpb246IGZ1bmN0aW9uKGNvbGxlY3Rpb246IHN0cmluZywgcXVlcnk6IE9iamVjdCwgc29ydFF1ZXJ5OiBPYmplY3QgPSB7fSkge1xuXHRcdFx0XHRyZXR1cm4gUmVzb2x2ZUlPU2VydmVyLmdldFN1cHBvcnREQigpLm1vZGVsKGNvbGxlY3Rpb24pLmZpbmQocXVlcnkpLnNvcnQoc29ydFF1ZXJ5KS5leGVjKCk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRmaW5kV2l0aE9wdGlvbnM6IHtcblx0XHRcdGNoZWNrOiBuZXcgU2ltcGxlU2NoZW1hKHtcblx0XHRcdFx0Y29sbGVjdGlvbjoge1xuXHRcdFx0XHRcdHR5cGU6IFN0cmluZ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRxdWVyeToge1xuXHRcdFx0XHRcdHR5cGU6IE9iamVjdCxcblx0XHRcdFx0XHRibGFja2JveDogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRvcHRpb25zOiB7XG5cdFx0XHRcdFx0dHlwZTogUGFnaW5hdGlvbk9wdGlvbnNTY2hlbWFcblx0XHRcdFx0fVxuXHRcdFx0fSksXG5cdFx0XHRmdW5jdGlvbjogZnVuY3Rpb24oY29sbGVjdGlvbjogc3RyaW5nLCBxdWVyeTogT2JqZWN0LCBvcHRpb25zOiBQYWdpbmF0aW9uT3B0aW9ucykge1xuXHRcdFx0XHRyZXR1cm4gUmVzb2x2ZUlPU2VydmVyLmdldFN1cHBvcnREQigpLm1vZGVsKGNvbGxlY3Rpb24pLmZpbmQocXVlcnkpLnNvcnQob3B0aW9ucy5zb3J0KS5saW1pdChvcHRpb25zLmxpbWl0KS5za2lwKG9wdGlvbnMuc2tpcCkuc2VsZWN0KG9wdGlvbnMuZmllbGRzKS5leGVjKCk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvLyBJbnNlcnQgMSBkb2N1bWVudFxuXHRcdC8vIEBJbnB1dHM6IGNvbGxlY3Rpb24sIGRvY3VtZW50XG5cdFx0Ly8gQE91dHB1dHM6IHJlcyA9IF9pZCBvZiBuZXcgZG9jdW1lbnQsIGVyciA9IG5vdCBpbnNlcnRlZFxuXHRcdGluc2VydERvY3VtZW50OiB7XG5cdFx0XHRjaGVjazogbmV3IFNpbXBsZVNjaGVtYSh7XG5cdFx0XHRcdGNvbGxlY3Rpb246IHtcblx0XHRcdFx0XHR0eXBlOiBTdHJpbmdcblx0XHRcdFx0fSxcblx0XHRcdFx0ZG9jdW1lbnQ6IHtcblx0XHRcdFx0XHR0eXBlOiBPYmplY3QsXG5cdFx0XHRcdFx0YmxhY2tib3g6IHRydWVcblx0XHRcdFx0fVxuXHRcdFx0fSksXG5cdFx0XHRmdW5jdGlvbjogZnVuY3Rpb24oY29sbGVjdGlvbjogc3RyaW5nLCBkb2N1bWVudDogRG9jdW1lbnQpIHtcblx0XHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuXHRcdFx0XHRcdGxldCBzY2hlbWFFcnJvcnMgPSBudWxsO1xuXG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFJlc29sdmVJT1NlcnZlci5nZXRTdXBwb3J0REIoKS5tb2RlbChjb2xsZWN0aW9uKVsnc2ltcGxzY2hlbWEnXS52YWxpZGF0ZShkb2N1bWVudCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNhdGNoIChlcnJvcnMpIHtcblx0XHRcdFx0XHRcdHNjaGVtYUVycm9ycyA9IGVycm9ycztcblx0XHRcdFx0XHRcdHN1cHBvcnRNYW5hZ2VyLmdldE1haW5TZXJ2ZXIoKS5nZXRNZXRob2RNYW5hZ2VyKCkuY2FsbE1ldGhvZEludGVybmFsKCdpbnNlcnRFcnJvckxvZycsICdTY2hlbWEgRmFpbGVkIG9uIGluc2VydCAtICcgKyBjb2xsZWN0aW9uLCBbc2NoZW1hRXJyb3JzLCBkb2N1bWVudF0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcblx0XHRcdFx0XHRpZiAoc2NoZW1hRXJyb3JzKSB7XG5cdFx0XHRcdFx0XHRjb25zb2xlLmxvZyhzY2hlbWFFcnJvcnMpO1xuXHRcdFx0XHRcdFx0cmVqZWN0KCdTY2hlbWEgRXJyb3JzJyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0aWYgKGdldEJpbmFyeVNpemUoSlNPTi5zdHJpbmdpZnkoZG9jdW1lbnQpKSA8IDIwMDAwMCkge1xuXHRcdFx0XHRcdFx0XHRMb2dzLmNyZWF0ZSh7XG5cdFx0XHRcdFx0XHRcdFx0X2lkOiBUeXBlcy5PYmplY3RJZCgpLnRvSGV4U3RyaW5nKCksXG5cdFx0XHRcdFx0XHRcdFx0ZGF0ZTogbmV3IERhdGUoKSxcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnaW5mbycsXG5cdFx0XHRcdFx0XHRcdFx0dGl0bGU6ICdJbnNlcnQgRG9jdW1lbnQnLFxuXHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2U6ICdVc2VyOiAnICsgdGhpcy51c2VyICsgJywgQ29sbGVjdGlvbiBUeXBlOiAnICsgY29sbGVjdGlvbixcblx0XHRcdFx0XHRcdFx0XHRwYXlsb2FkOiBkb2N1bWVudCxcblx0XHRcdFx0XHRcdFx0XHRtZXRob2Q6ICdpbnNlcnREb2N1bWVudCcsXG5cdFx0XHRcdFx0XHRcdFx0dXNlcjogdGhpcy51c2VyLFxuXHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VJZDogJydcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0TG9ncy5jcmVhdGUoe1xuXHRcdFx0XHRcdFx0XHRcdF9pZDogVHlwZXMuT2JqZWN0SWQoKS50b0hleFN0cmluZygpLFxuXHRcdFx0XHRcdFx0XHRcdGRhdGU6IG5ldyBEYXRlKCksXG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogJ2luZm8nLFxuXHRcdFx0XHRcdFx0XHRcdHRpdGxlOiAnSW5zZXJ0IERvY3VtZW50Jyxcblx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlOiAnVXNlcjogJyArIHRoaXMudXNlciArICcsIENvbGxlY3Rpb24gVHlwZTogJyArIGNvbGxlY3Rpb24sXG5cdFx0XHRcdFx0XHRcdFx0cGF5bG9hZDogJ1RvbyBCaWcnLFxuXHRcdFx0XHRcdFx0XHRcdG1ldGhvZDogJ2luc2VydERvY3VtZW50Jyxcblx0XHRcdFx0XHRcdFx0XHR1c2VyOiB0aGlzLnVzZXIsXG5cdFx0XHRcdFx0XHRcdFx0bWVzc2FnZUlkOiAnJ1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0bGV0IGlkID0gVHlwZXMuT2JqZWN0SWQoKS50b0hleFN0cmluZygpO1xuXHRcdFx0XHRcdFx0ZG9jdW1lbnQuX2lkID0gaWQ7XG5cdFx0XHRcdFx0XHRkb2N1bWVudC5fX3YgPSAwO1xuXHRcdFx0XHRcdFx0UmVzb2x2ZUlPU2VydmVyLmdldFN1cHBvcnREQigpLm1vZGVsKGNvbGxlY3Rpb24pLmNyZWF0ZShkb2N1bWVudCkudGhlbigoKSA9PiByZXNvbHZlKGlkKSwgZXJyID0+IHJlamVjdChlcnIpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Ly8gUmVwbGFjZXMgMSBkb2N1bWVudCB3aXRoIG5ldyBkb2N1bWVudCAoZnJvbSBfaWQpXG5cdFx0Ly8gQElucHV0czogY29sbGVjdGlvbiwgZG9jdW1lbnQgaWRcblx0XHQvLyBAT3V0cHV0czogcmVzID0gMSAodXBkYXRlZCAxKSwgcmVzID0gMCAobm90IHVwZGF0ZWQpLCBlcnIgPSBub3QgdXBkYXRlZC93cm9uZyB2ZXJzaW9uXG5cdFx0Ly8gU2VhcmNoIGZvciBkb2MsIGNoZWNrIHZlcnNpb24sIGlmIGZvdW5kIHRoZW4gdHJ5IGFuZCB1cGRhdGVcblx0XHR1cGRhdGVEb2N1bWVudDoge1xuXHRcdFx0Y2hlY2s6IG5ldyBTaW1wbGVTY2hlbWEoe1xuXHRcdFx0XHRjb2xsZWN0aW9uOiB7XG5cdFx0XHRcdFx0dHlwZTogU3RyaW5nXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGZfZG9jdW1lbnQ6IHtcblx0XHRcdFx0XHR0eXBlOiBPYmplY3QsXG5cdFx0XHRcdFx0YmxhY2tib3g6IHRydWVcblx0XHRcdFx0fVxuXHRcdFx0fSksXG5cdFx0XHRmdW5jdGlvbjogZnVuY3Rpb24oY29sbGVjdGlvbjogc3RyaW5nLCBmX2RvY3VtZW50OiBEb2N1bWVudCkge1xuXHRcdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0XHRcdFJlc29sdmVJT1NlcnZlci5nZXRTdXBwb3J0REIoKS5tb2RlbChjb2xsZWN0aW9uKS5maW5kT25lKHtfaWQ6IGZfZG9jdW1lbnQuX2lkfSkubGVhbigpLmV4ZWMoKGVyckRvYywgY3VyckRvYykgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKGN1cnJEb2MpIHtcblx0XHRcdFx0XHRcdFx0aWYgKGN1cnJEb2MuX192ID09PSBmX2RvY3VtZW50Ll9fdikge1xuXHRcdFx0XHRcdFx0XHRcdGxldCB2ZXJzaW9uRG9jID0gZGVlcENvcHkoY3VyckRvYyk7XG5cblx0XHRcdFx0XHRcdFx0XHR2ZXJzaW9uRG9jLl9pZCA9IHtcblx0XHRcdFx0XHRcdFx0XHRcdF9pZDogY3VyckRvYy5faWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRfX3Y6IGN1cnJEb2MuX192XG5cdFx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0XHRcdGxldCBzY2hlbWFFcnJvcnMgPSBudWxsO1xuXG5cdFx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRcdFJlc29sdmVJT1NlcnZlci5nZXRTdXBwb3J0REIoKS5tb2RlbChjb2xsZWN0aW9uKVsnc2ltcGxzY2hlbWEnXS52YWxpZGF0ZShmX2RvY3VtZW50KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0Y2F0Y2ggKGVycm9ycykge1xuXHRcdFx0XHRcdFx0XHRcdFx0c2NoZW1hRXJyb3JzID0gZXJyb3JzO1xuXHRcdFx0XHRcdFx0XHRcdFx0c3VwcG9ydE1hbmFnZXIuZ2V0TWFpblNlcnZlcigpLmdldE1ldGhvZE1hbmFnZXIoKS5jYWxsTWV0aG9kSW50ZXJuYWwoJ2luc2VydEVycm9yTG9nJywgJ1NjaGVtYSBGYWlsZWQgb24gdXBkYXRlRG9jdW1lbnQgLSAnICsgY29sbGVjdGlvbiwgW3NjaGVtYUVycm9ycywgZl9kb2N1bWVudF0pO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFx0XHRpZiAoc2NoZW1hRXJyb3JzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLmxvZyhzY2hlbWFFcnJvcnMpO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmVqZWN0KCdTY2hlbWEgRXJyb3JzJyk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0UmVzb2x2ZUlPU2VydmVyLmdldFN1cHBvcnREQigpLm1vZGVsKFJlc29sdmVJT1NlcnZlci5nZXRTdXBwb3J0REIoKS5tb2RlbChjb2xsZWN0aW9uKVsndmVyc2lvbkNvbGxlY3Rpb24nXSkuY3JlYXRlKHZlcnNpb25Eb2MpLnRoZW4oZG9jID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0UmVzb2x2ZUlPU2VydmVyLmdldFN1cHBvcnREQigpLm1vZGVsKFJlc29sdmVJT1NlcnZlci5nZXRTdXBwb3J0REIoKS5tb2RlbChjb2xsZWN0aW9uKVsndmVyc2lvbkNvbGxlY3Rpb24nXSkuZGVsZXRlTWFueSh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0JGFuZDogW1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0eydfaWQuX2lkJzogY3VyckRvYy5faWR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0eydfaWQuX192JzogeyRsdGU6IGN1cnJEb2MuX192IC0gNH19XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KS5leGVjKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9LCBlcnIgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLmxvZyhlcnIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdGxldCB1cGRhdGVzID0gZ2V0TW9uZ29VcGRhdGVzKGN1cnJEb2MsIGZfZG9jdW1lbnQsIHRydWUpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAodXBkYXRlcykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRSZXNvbHZlSU9TZXJ2ZXIuZ2V0U3VwcG9ydERCKCkubW9kZWwoY29sbGVjdGlvbikudXBkYXRlT25lKHtfaWQ6IGZfZG9jdW1lbnQuX2lkfSwgdXBkYXRlcywge3N0cmljdDogZmFsc2V9KS5leGVjKCkudGhlbihyZXMgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUocmVzLm5Nb2RpZmllZCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0sIGVyciA9PiByZWplY3QoZXJyKSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgxKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGdldEJpbmFyeVNpemUoSlNPTi5zdHJpbmdpZnkoZl9kb2N1bWVudCkpIDwgMjAwMDAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdExvZ3MuY3JlYXRlKHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRfaWQ6IFR5cGVzLk9iamVjdElkKCkudG9IZXhTdHJpbmcoKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRlOiBuZXcgRGF0ZSgpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHR5cGU6ICdpbmZvJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aXRsZTogJ1VwZGF0ZSBEb2N1bWVudCcsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZTogJ1VzZXI6ICcgKyB0aGlzLnVzZXIgKyAnLCBDb2xsZWN0aW9uIFR5cGU6ICcgKyBjb2xsZWN0aW9uLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBheWxvYWQ6IGZfZG9jdW1lbnQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWV0aG9kOiAndXBkYXRlRG9jdW1lbnQnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVzZXI6IHRoaXMudXNlcixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlSWQ6ICcnXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdExvZ3MuY3JlYXRlKHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRfaWQ6IFR5cGVzLk9iamVjdElkKCkudG9IZXhTdHJpbmcoKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRlOiBuZXcgRGF0ZSgpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHR5cGU6ICdpbmZvJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aXRsZTogJ1VwZGF0ZSBEb2N1bWVudCcsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZTogJ1VzZXI6ICcgKyB0aGlzLnVzZXIgKyAnLCBDb2xsZWN0aW9uIFR5cGU6ICcgKyBjb2xsZWN0aW9uLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBheWxvYWQ6ICdUb28gQmlnJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXRob2Q6ICd1cGRhdGVEb2N1bWVudCcsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dXNlcjogdGhpcy51c2VyLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VJZDogJydcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKCdpbnZhbGlkIHZlcnNpb24gLSAnICsgY29sbGVjdGlvbiwgY3VyckRvYy5fX3YsIGZfZG9jdW1lbnQuX192KTtcblxuXHRcdFx0XHRcdFx0XHRcdFJlc29sdmVJT1NlcnZlci5nZXRTdXBwb3J0REIoKS5tb2RlbChSZXNvbHZlSU9TZXJ2ZXIuZ2V0U3VwcG9ydERCKCkubW9kZWwoY29sbGVjdGlvbilbJ3ZlcnNpb25Db2xsZWN0aW9uJ10pLmZpbmRPbmUoe1xuXHRcdFx0XHRcdFx0XHRcdFx0JGFuZDogW1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR7J19pZC5faWQnOiBjdXJyRG9jLl9pZH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsnX2lkLl9fdic6IGZfZG9jdW1lbnQuX192fVxuXHRcdFx0XHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0XHRcdH0pLmxlYW4oKS5leGVjKChlcnJPbGREb2MsIG9sZERvYykgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IG5ld0N1cnJEb2NJZCA9IGN1cnJEb2MuX2lkO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAob2xkRG9jKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCB2ZXJzaW9uRG9jID0gZGVlcENvcHkoY3VyckRvYyk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0dmVyc2lvbkRvYy5faWQgPSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0X2lkOiBjdXJyRG9jLl9pZCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRfX3Y6IGN1cnJEb2MuX192XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IHVwZGF0ZWREb2MgPSBnZXRNb25nb01lcmdlVXBkYXRlZERvYyhmX2RvY3VtZW50LCBjdXJyRG9jLCBvbGREb2MpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR1cGRhdGVkRG9jLl9pZCA9IG5ld0N1cnJEb2NJZDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dXBkYXRlZERvYy5fX3YrKztcblx0XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0UmVzb2x2ZUlPU2VydmVyLmdldFN1cHBvcnREQigpLm1vZGVsKGNvbGxlY3Rpb24pLnJlcGxhY2VPbmUoe19pZDogbmV3Q3VyckRvY0lkfSwgdXBkYXRlZERvYykuZXhlYygpLnRoZW4ocmVzID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRSZXNvbHZlSU9TZXJ2ZXIuZ2V0U3VwcG9ydERCKCkubW9kZWwoUmVzb2x2ZUlPU2VydmVyLmdldFN1cHBvcnREQigpLm1vZGVsKGNvbGxlY3Rpb24pWyd2ZXJzaW9uQ29sbGVjdGlvbiddKS5jcmVhdGUodmVyc2lvbkRvYykudGhlbihkb2MgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0UmVzb2x2ZUlPU2VydmVyLmdldFN1cHBvcnREQigpLm1vZGVsKFJlc29sdmVJT1NlcnZlci5nZXRTdXBwb3J0REIoKS5tb2RlbChjb2xsZWN0aW9uKVsndmVyc2lvbkNvbGxlY3Rpb24nXSkuZGVsZXRlTWFueSh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCRhbmQ6IFtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7J19pZC5faWQnOiB2ZXJzaW9uRG9jLl9pZC5faWR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHsnX2lkLl9fdic6IHskbHRlOiB2ZXJzaW9uRG9jLl9pZC5fX3YgLSA0fX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSkuZXhlYygpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKHJlcy5uTW9kaWZpZWQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9LCBlcnIgPT4gcmVqZWN0KGVycikpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJlamVjdCgnSW52YWxpZCBWZXJzaW9uIEFuZCBDb3VsZCBOb3QgRmluZCBIaXN0b3J5IC0gREI6ICcgKyBjdXJyRG9jLl9fdiArICcsIFRyeWluZyB0byB1cGRhdGUgd2l0aCA6JyArIGZfZG9jdW1lbnQuX192KTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJlamVjdChlcnJEb2MpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdC8vIFVwZGF0ZXMgMSBkb2N1bWVudCdzIHByb3BzIChmcm9tIF9pZClcblx0XHQvLyBASW5wdXRzOiBjb2xsZWN0aW9uLCBkb2N1bWVudCBpZCwgZG9jdW1lbnQgdmVyc2lvbiwgdXBkYXRlIHBhcmFtdGVycyAoe3Byb3A6ICd4eHgnLCBkYXRhOiAneXl5fSlcblx0XHQvLyBAT3V0cHV0czogcmVzID0gMSAodXBkYXRlZCAxKSwgcmVzID0gMCAobm90IHVwZGF0ZWQpLCBlcnIgPSBub3QgdXBkYXRlZC93cm9uZyB2ZXJzaW9uXG5cdFx0Ly8gU2VhcmNoIGZvciBkb2MsIGNoZWNrIHZlcnNpb24sIGlmIGZvdW5kIHRoZW4gdHJ5IGFuZCB1cGRhdGUgcHJvcHNcblx0XHR1cGRhdGVEb2N1bWVudFByb3BzOiB7XG5cdFx0XHRjaGVjazogbmV3IFNpbXBsZVNjaGVtYSh7XG5cdFx0XHRcdGNvbGxlY3Rpb246IHtcblx0XHRcdFx0XHR0eXBlOiBTdHJpbmdcblx0XHRcdFx0fSxcblx0XHRcdFx0ZG9jX2lkOiB7XG5cdFx0XHRcdFx0dHlwZTogU3RyaW5nXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHVwZGF0ZVBhcmFtczoge1xuXHRcdFx0XHRcdHR5cGU6IEFycmF5XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCd1cGRhdGVQYXJhbXMuJCc6IHtcblx0XHRcdFx0XHR0eXBlOiBPYmplY3QsXG5cdFx0XHRcdFx0YmxhY2tib3g6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0ZG9jX192OiB7XG5cdFx0XHRcdFx0dHlwZTogTnVtYmVyXG5cdFx0XHRcdH1cblx0XHRcdH0pLFxuXHRcdFx0ZnVuY3Rpb246IGZ1bmN0aW9uKGNvbGxlY3Rpb246IHN0cmluZywgZG9jX2lkOiBzdHJpbmcsIHVwZGF0ZVBhcmFtczogYW55W10sIGRvY19fdjogbnVtYmVyKSB7XG5cdFx0XHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdFx0UmVzb2x2ZUlPU2VydmVyLmdldFN1cHBvcnREQigpLm1vZGVsKGNvbGxlY3Rpb24pLmZpbmRPbmUoe19pZDogZG9jX2lkfSkubGVhbigpLmV4ZWMoKGVyckRvYywgY3VyckRvYzogRG9jdW1lbnQpID0+IHtcblx0XHRcdFx0XHRcdGlmIChjdXJyRG9jKSB7XG5cdFx0XHRcdFx0XHRcdGxldCBtb2RpZmllZERvYyA9IGRlZXBDb3B5KGN1cnJEb2MpO1xuXG5cdFx0XHRcdFx0XHRcdHVwZGF0ZVBhcmFtcy5mb3JFYWNoKGRhdGEgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdG1vZGlmaWVkRG9jW2RhdGEucHJvcF0gPSBkYXRhLmRhdGE7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChtb2RpZmllZERvYy5fX3YgPT09IGRvY19fdikge1xuXHRcdFx0XHRcdFx0XHRcdGxldCB2ZXJzaW9uRG9jID0gZGVlcENvcHkoY3VyckRvYyk7XG5cdFxuXHRcdFx0XHRcdFx0XHRcdHZlcnNpb25Eb2MuX2lkID0ge1xuXHRcdFx0XHRcdFx0XHRcdFx0X2lkOiBjdXJyRG9jLl9pZCxcblx0XHRcdFx0XHRcdFx0XHRcdF9fdjogY3VyckRvYy5fX3Zcblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcblx0XHRcdFx0XHRcdFx0XHRsZXQgc2NoZW1hRXJyb3JzID0gbnVsbDtcblx0XHRcdFx0XG5cdFx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRcdFJlc29sdmVJT1NlcnZlci5nZXRTdXBwb3J0REIoKS5tb2RlbChjb2xsZWN0aW9uKVsnc2ltcGxzY2hlbWEnXS52YWxpZGF0ZShtb2RpZmllZERvYyk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGNhdGNoIChlcnJvcnMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHNjaGVtYUVycm9ycyA9IGVycm9ycztcblx0XHRcdFx0XHRcdFx0XHRcdHN1cHBvcnRNYW5hZ2VyLmdldE1haW5TZXJ2ZXIoKS5nZXRNZXRob2RNYW5hZ2VyKCkuY2FsbE1ldGhvZEludGVybmFsKCdpbnNlcnRFcnJvckxvZycsICdTY2hlbWEgRmFpbGVkIG9uIHVwZGF0ZURvY3VtZW50UHJvcHMgLSAnICsgY29sbGVjdGlvbiwgW3NjaGVtYUVycm9ycywgbW9kaWZpZWREb2NdKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNjaGVtYUVycm9ycykge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc29sZS5sb2coc2NoZW1hRXJyb3JzKTtcblx0XHRcdFx0XHRcdFx0XHRcdHJlamVjdCgnU2NoZW1hIEVycm9ycycpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFJlc29sdmVJT1NlcnZlci5nZXRTdXBwb3J0REIoKS5tb2RlbChSZXNvbHZlSU9TZXJ2ZXIuZ2V0U3VwcG9ydERCKCkubW9kZWwoY29sbGVjdGlvbilbJ3ZlcnNpb25Db2xsZWN0aW9uJ10pLmNyZWF0ZSh2ZXJzaW9uRG9jKS50aGVuKGRvYyA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFJlc29sdmVJT1NlcnZlci5nZXRTdXBwb3J0REIoKS5tb2RlbChSZXNvbHZlSU9TZXJ2ZXIuZ2V0U3VwcG9ydERCKCkubW9kZWwoY29sbGVjdGlvbilbJ3ZlcnNpb25Db2xsZWN0aW9uJ10pLmRlbGV0ZU1hbnkoe1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCRhbmQ6IFtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHsnX2lkLl9pZCc6IGN1cnJEb2MuX2lkfSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHsnX2lkLl9fdic6IHskbHRlOiBjdXJyRG9jLl9fdiAtIDR9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fSkuZXhlYygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSwgZXJyID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc29sZS5sb2coZXJyKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgdXBkYXRlcyA9IGdldE1vbmdvVXBkYXRlcyhjdXJyRG9jLCBtb2RpZmllZERvYywgdHJ1ZSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmICh1cGRhdGVzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFJlc29sdmVJT1NlcnZlci5nZXRTdXBwb3J0REIoKS5tb2RlbChjb2xsZWN0aW9uKS51cGRhdGVPbmUoe19pZDogbW9kaWZpZWREb2MuX2lkfSwgdXBkYXRlcywge3N0cmljdDogZmFsc2V9KS5leGVjKCkudGhlbihyZXMgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUocmVzLm9rKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSwgZXJyID0+IHJlamVjdChlcnIpKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKDEpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoZ2V0QmluYXJ5U2l6ZShKU09OLnN0cmluZ2lmeSh1cGRhdGVQYXJhbXMpKSA8IDIwMDAwMCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRMb2dzLmNyZWF0ZSh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0X2lkOiBUeXBlcy5PYmplY3RJZCgpLnRvSGV4U3RyaW5nKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0ZTogbmV3IERhdGUoKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnaW5mbycsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6ICdVcGRhdGUgRG9jdW1lbnQgUHJvcHMnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2U6ICdVc2VyOiAnICsgdGhpcy51c2VyICsgJywgQ29sbGVjdGlvbiBUeXBlOiAnICsgY29sbGVjdGlvbiArICcsIElkOiAnICsgZG9jX2lkICsgJywgJyArICdWZXJzaW9uOiAnICsgZG9jX192LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBheWxvYWQ6IHVwZGF0ZVBhcmFtcyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXRob2Q6ICd1cGRhdGVEb2N1bWVudFByb3BzJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1c2VyOiB0aGlzLnVzZXIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZUlkOiAnJ1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRMb2dzLmNyZWF0ZSh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0X2lkOiBUeXBlcy5PYmplY3RJZCgpLnRvSGV4U3RyaW5nKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0ZTogbmV3IERhdGUoKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnaW5mbycsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6ICdVcGRhdGUgRG9jdW1lbnQgUHJvcHMnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2U6ICdVc2VyOiAnICsgdGhpcy51c2VyICsgJywgQ29sbGVjdGlvbiBUeXBlOiAnICsgY29sbGVjdGlvbiArICcsIElkOiAnICsgZG9jX2lkICsgJywgJyArICdWZXJzaW9uOiAnICsgZG9jX192LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBheWxvYWQ6ICdUb28gQmlnJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXRob2Q6ICd1cGRhdGVEb2N1bWVudFByb3BzJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1c2VyOiB0aGlzLnVzZXIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZUlkOiAnJ1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc29sZS5sb2coJ2ludmFsaWQgdmVyc2lvbiAtICcgKyBjb2xsZWN0aW9uLCBjdXJyRG9jLl9fdiwgZG9jX192KTtcblxuXHRcdFx0XHRcdFx0XHRcdFJlc29sdmVJT1NlcnZlci5nZXRTdXBwb3J0REIoKS5tb2RlbChSZXNvbHZlSU9TZXJ2ZXIuZ2V0U3VwcG9ydERCKCkubW9kZWwoY29sbGVjdGlvbilbJ3ZlcnNpb25Db2xsZWN0aW9uJ10pLmZpbmRPbmUoe1xuXHRcdFx0XHRcdFx0XHRcdFx0JGFuZDogW1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR7J19pZC5faWQnOiBjdXJyRG9jLl9pZH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsnX2lkLl9fdic6IGRvY19fdn1cblx0XHRcdFx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRcdFx0XHR9KS5sZWFuKCkuZXhlYygoZXJyT2xkRG9jLCBvbGREb2MpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBuZXdDdXJyRG9jSWQgPSBjdXJyRG9jLl9pZDtcblxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9sZERvYykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgdmVyc2lvbkRvYyA9IGRlZXBDb3B5KGN1cnJEb2MpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZlcnNpb25Eb2MuX2lkID0ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdF9pZDogY3VyckRvYy5faWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0X192OiBjdXJyRG9jLl9fdlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCB1cGRhdGVkRG9jID0gZ2V0TW9uZ29NZXJnZVVwZGF0ZWREb2MobW9kaWZpZWREb2MsIGN1cnJEb2MsIG9sZERvYyk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHVwZGF0ZWREb2MuX2lkID0gbmV3Q3VyckRvY0lkO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR1cGRhdGVkRG9jLl9fdisrO1xuXHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0UmVzb2x2ZUlPU2VydmVyLmdldFN1cHBvcnREQigpLm1vZGVsKGNvbGxlY3Rpb24pLnJlcGxhY2VPbmUoe19pZDogbmV3Q3VyckRvY0lkfSwgdXBkYXRlZERvYykuZXhlYygpLnRoZW4ocmVzID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRSZXNvbHZlSU9TZXJ2ZXIuZ2V0U3VwcG9ydERCKCkubW9kZWwoUmVzb2x2ZUlPU2VydmVyLmdldFN1cHBvcnREQigpLm1vZGVsKGNvbGxlY3Rpb24pWyd2ZXJzaW9uQ29sbGVjdGlvbiddKS5jcmVhdGUodmVyc2lvbkRvYykudGhlbihkb2MgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0UmVzb2x2ZUlPU2VydmVyLmdldFN1cHBvcnREQigpLm1vZGVsKFJlc29sdmVJT1NlcnZlci5nZXRTdXBwb3J0REIoKS5tb2RlbChjb2xsZWN0aW9uKVsndmVyc2lvbkNvbGxlY3Rpb24nXSkuZGVsZXRlTWFueSh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCRhbmQ6IFtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7J19pZC5faWQnOiB2ZXJzaW9uRG9jLl9pZC5faWR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHsnX2lkLl9fdic6IHskbHRlOiB2ZXJzaW9uRG9jLl9pZC5fX3YgLSA0fX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSkuZXhlYygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0sIGVyciA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLmxvZyhlcnIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUocmVzLm5Nb2RpZmllZCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0sIGVyciA9PiByZWplY3QoZXJyKSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVqZWN0KCdJbnZhbGlkIFZlcnNpb24gQW5kIENvdWxkIE5vdCBGaW5kIEhpc3RvcnkgUHJvcHMgLSBEQjogJyArIGN1cnJEb2MuX192ICsgJywgVHJ5aW5nIHRvIHVwZGF0ZSB3aXRoIDonICsgbW9kaWZpZWREb2MuX192KTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJlamVjdChlcnJEb2MpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdC8vIFJlbW92ZXMgMSBkb2N1bWVudCAoZnJvbSBfaWQpXG5cdFx0Ly8gQElucHV0czogY29sbGVjdGlvbiwgZG9jdW1lbnQgaWRcblx0XHQvLyBAT3V0cHV0czogcmVzID0gMSAoZGVsZXRlZCksIHJlcyA9IDAgKG5vdCBkZWxldGVkKSwgZXJyID0gbm90IGRlbGV0ZWRcblx0XHQvLyBTZWFyY2ggZm9yIGRvYywgaWYgZm91bmQgdGhlbiB0cnkgYW5kIHJlbW92ZVxuXHRcdHJlbW92ZURvY3VtZW50OiB7XG5cdFx0XHRjaGVjazogbmV3IFNpbXBsZVNjaGVtYSh7XG5cdFx0XHRcdGNvbGxlY3Rpb246IHtcblx0XHRcdFx0XHR0eXBlOiBTdHJpbmdcblx0XHRcdFx0fSxcblx0XHRcdFx0ZG9jX2lkOiB7XG5cdFx0XHRcdFx0dHlwZTogU3RyaW5nXG5cdFx0XHRcdH1cblx0XHRcdH0pLFxuXHRcdFx0ZnVuY3Rpb246IGZ1bmN0aW9uKGNvbGxlY3Rpb246IHN0cmluZywgZG9jX2lkOiBzdHJpbmcpIHtcblx0XHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuXHRcdFx0XHRcdExvZ3MuY3JlYXRlKHtcblx0XHRcdFx0XHRcdF9pZDogVHlwZXMuT2JqZWN0SWQoKS50b0hleFN0cmluZygpLFxuXHRcdFx0XHRcdFx0ZGF0ZTogbmV3IERhdGUoKSxcblx0XHRcdFx0XHRcdHR5cGU6ICdpbmZvJyxcblx0XHRcdFx0XHRcdHRpdGxlOiAnUmVtb3ZlIERvY3VtZW50Jyxcblx0XHRcdFx0XHRcdG1lc3NhZ2U6ICdVc2VyOiAnICsgdGhpcy51c2VyICsgJywgQ29sbGVjdGlvbiBUeXBlOiAnICsgY29sbGVjdGlvbixcblx0XHRcdFx0XHRcdHBheWxvYWQ6IHtfaWQ6IGRvY19pZH0sXG5cdFx0XHRcdFx0XHRtZXRob2Q6ICdyZW1vdmVEb2N1bWVudCcsXG5cdFx0XHRcdFx0XHR1c2VyOiB0aGlzLnVzZXIsXG5cdFx0XHRcdFx0XHRtZXNzYWdlSWQ6ICcnXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRSZXNvbHZlSU9TZXJ2ZXIuZ2V0U3VwcG9ydERCKCkubW9kZWwoY29sbGVjdGlvbikuZGVsZXRlT25lKHtfaWQ6IGRvY19pZH0pLmV4ZWMoKGVyciwgcmVzKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoZXJyKSB7XG5cdFx0XHRcdFx0XHRcdHJlamVjdChlcnIpO1x0XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZShyZXMub2spO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdHJlbW92ZURvY3VtZW50V2l0aFF1ZXJ5OiB7XG5cdFx0XHRjaGVjazogbmV3IFNpbXBsZVNjaGVtYSh7XG5cdFx0XHRcdGNvbGxlY3Rpb246IHtcblx0XHRcdFx0XHR0eXBlOiBTdHJpbmdcblx0XHRcdFx0fSxcblx0XHRcdFx0cXVlcnk6IHtcblx0XHRcdFx0XHR0eXBlOiBPYmplY3QsXG5cdFx0XHRcdFx0YmxhY2tib3g6IHRydWVcblx0XHRcdFx0fVxuXHRcdFx0fSksXG5cdFx0XHRmdW5jdGlvbjogZnVuY3Rpb24oY29sbGVjdGlvbjogc3RyaW5nLCBxdWVyeTogT2JqZWN0KSB7XG5cdFx0XHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cblx0XHRcdFx0XHRMb2dzLmNyZWF0ZSh7XG5cdFx0XHRcdFx0XHRfaWQ6IFR5cGVzLk9iamVjdElkKCkudG9IZXhTdHJpbmcoKSxcblx0XHRcdFx0XHRcdGRhdGU6IG5ldyBEYXRlKCksXG5cdFx0XHRcdFx0XHR0eXBlOiAnaW5mbycsXG5cdFx0XHRcdFx0XHR0aXRsZTogJ1JlbW92ZSBEb2N1bWVudCAoUXVlcnkpJyxcblx0XHRcdFx0XHRcdG1lc3NhZ2U6ICdVc2VyOiAnICsgdGhpcy51c2VyICsgJywgQ29sbGVjdGlvbiBUeXBlOiAnICsgY29sbGVjdGlvbixcblx0XHRcdFx0XHRcdHBheWxvYWQ6IHtfaWQ6IHF1ZXJ5fSxcblx0XHRcdFx0XHRcdG1ldGhvZDogJ3JlbW92ZURvY3VtZW50V2l0aFF1ZXJ5Jyxcblx0XHRcdFx0XHRcdHVzZXI6IHRoaXMudXNlcixcblx0XHRcdFx0XHRcdG1lc3NhZ2VJZDogJydcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdFJlc29sdmVJT1NlcnZlci5nZXRTdXBwb3J0REIoKS5tb2RlbChjb2xsZWN0aW9uKS5kZWxldGVPbmUocXVlcnkpLmV4ZWMoKGVyciwgcmVzKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoZXJyKSB7XG5cdFx0XHRcdFx0XHRcdHJlamVjdChlcnIpO1x0XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZShyZXMub2spO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufSJdfQ==