@nlabs/reaktor 0.1.6 → 0.1.7
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.
- package/lib/config.js +20 -11
- package/lib/data/conversations.js +69 -39
- package/lib/data/dynamodb.js +60 -27
- package/lib/data/email.js +50 -19
- package/lib/data/files.js +103 -46
- package/lib/data/groups.js +114 -67
- package/lib/data/images.js +168 -100
- package/lib/data/index.js +234 -24
- package/lib/data/ios.js +48 -23
- package/lib/data/locations.js +45 -29
- package/lib/data/messages.d.ts +2 -2
- package/lib/data/messages.js +105 -72
- package/lib/data/notifications.js +31 -14
- package/lib/data/payments.js +164 -114
- package/lib/data/posts.js +144 -87
- package/lib/data/reactions.js +58 -33
- package/lib/data/s3.js +54 -24
- package/lib/data/search.js +32 -19
- package/lib/data/sms.js +35 -15
- package/lib/data/subscription.js +78 -51
- package/lib/data/tags.js +90 -51
- package/lib/data/users.js +118 -70
- package/lib/index.js +42 -8
- package/lib/types/apps.js +1 -1
- package/lib/types/arangodb.js +1 -1
- package/lib/types/auth.js +1 -1
- package/lib/types/conversations.js +1 -1
- package/lib/types/email.js +1 -1
- package/lib/types/files.js +1 -1
- package/lib/types/google.js +1 -1
- package/lib/types/groups.js +1 -1
- package/lib/types/images.js +1 -1
- package/lib/types/index.js +210 -22
- package/lib/types/locations.js +1 -1
- package/lib/types/messages.d.ts +12 -7
- package/lib/types/messages.js +1 -1
- package/lib/types/notifications.js +1 -1
- package/lib/types/payments.js +1 -1
- package/lib/types/posts.js +1 -1
- package/lib/types/reactions.js +1 -1
- package/lib/types/tags.js +1 -1
- package/lib/types/users.d.ts +0 -1
- package/lib/types/users.js +1 -1
- package/lib/utils/analytics.js +23 -11
- package/lib/utils/arangodb.js +48 -19
- package/lib/utils/auth.js +31 -15
- package/lib/utils/graphql.js +16 -4
- package/lib/utils/index.js +78 -11
- package/lib/utils/objects.js +30 -10
- package/lib/utils/redis.js +21 -8
- package/package.json +5 -5
- package/index.d.ts +0 -1
package/lib/data/posts.js
CHANGED
|
@@ -1,3 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createPostEdge = exports.cleanPosts = exports.deletePost = exports.updatePost = exports.addPost = exports.getPostComments = exports.getPostListByUser = exports.getPostListByTags = exports.getPostListByLatest = exports.getPostListByGroup = exports.getPostListByArea = exports.getPostList = exports.getPost = exports.getPostOptional = exports.parsePostOptions = void 0;
|
|
7
|
+
|
|
8
|
+
var _utils = require("@nlabs/utils");
|
|
9
|
+
|
|
10
|
+
var _arangojs = require("arangojs");
|
|
11
|
+
|
|
12
|
+
var _flatten = _interopRequireDefault(require("lodash/flatten"));
|
|
13
|
+
|
|
14
|
+
var _uniqBy = _interopRequireDefault(require("lodash/uniqBy"));
|
|
15
|
+
|
|
16
|
+
var _utils2 = require("../utils");
|
|
17
|
+
|
|
18
|
+
var _files = require("./files");
|
|
19
|
+
|
|
20
|
+
var _tags = require("./tags");
|
|
21
|
+
|
|
22
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
23
|
+
|
|
1
24
|
function _templateObject8() {
|
|
2
25
|
var data = _taggedTemplateLiteral(["FOR p IN posts\n FILTER p.added < DATE_TIMESTAMP(DATE_SUBTRACT(DATE_NOW(), 60, 'day')) && p.type == \"default\"\n REMOVE p IN posts\n RETURN OLD"]);
|
|
3
26
|
|
|
@@ -84,20 +107,10 @@ function _templateObject() {
|
|
|
84
107
|
|
|
85
108
|
function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
|
|
86
109
|
|
|
87
|
-
|
|
88
|
-
* Copyright (c) 2019-Present, Nitrogen Labs, Inc.
|
|
89
|
-
* Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
|
|
90
|
-
*/
|
|
91
|
-
import { createHash, parseChar, parseId, parseNum, parseString, parseVarChar } from '@nlabs/utils';
|
|
92
|
-
import { aql } from 'arangojs';
|
|
93
|
-
import flatten from 'lodash/flatten';
|
|
94
|
-
import uniqBy from 'lodash/uniqBy';
|
|
95
|
-
import { getLimit, useDb } from '../utils';
|
|
96
|
-
import { updateFiles } from './files';
|
|
97
|
-
import { extractTags } from './tags'; // const eventCategory: string = 'posts';
|
|
98
|
-
|
|
110
|
+
// const eventCategory: string = 'posts';
|
|
99
111
|
var MAX_CONTENT_LENGTH = 100000;
|
|
100
|
-
|
|
112
|
+
|
|
113
|
+
var parsePostOptions = function parsePostOptions() {
|
|
101
114
|
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
102
115
|
var _options$from = options.from,
|
|
103
116
|
from = _options$from === void 0 ? 0 : _options$from,
|
|
@@ -110,13 +123,16 @@ export var parsePostOptions = function parsePostOptions() {
|
|
|
110
123
|
_options$type = options.type,
|
|
111
124
|
type = _options$type === void 0 ? 'default' : _options$type;
|
|
112
125
|
return {
|
|
113
|
-
latitude: parseNum(latitude, 32),
|
|
114
|
-
limit: getLimit(from, to),
|
|
115
|
-
longitude: parseNum(longitude, 32),
|
|
116
|
-
type: parseChar(type, 32)
|
|
126
|
+
latitude: (0, _utils.parseNum)(latitude, 32),
|
|
127
|
+
limit: (0, _utils2.getLimit)(from, to),
|
|
128
|
+
longitude: (0, _utils.parseNum)(longitude, 32),
|
|
129
|
+
type: (0, _utils.parseChar)(type, 32)
|
|
117
130
|
};
|
|
118
131
|
};
|
|
119
|
-
|
|
132
|
+
|
|
133
|
+
exports.parsePostOptions = parsePostOptions;
|
|
134
|
+
|
|
135
|
+
var getPostOptional = function getPostOptional(fields) {
|
|
120
136
|
return fields.reduce(function (selects, field) {
|
|
121
137
|
switch (field) {
|
|
122
138
|
case 'reactions':
|
|
@@ -150,19 +166,22 @@ export var getPostOptional = function getPostOptional(fields) {
|
|
|
150
166
|
queries: []
|
|
151
167
|
});
|
|
152
168
|
};
|
|
153
|
-
|
|
169
|
+
|
|
170
|
+
exports.getPostOptional = getPostOptional;
|
|
171
|
+
|
|
172
|
+
var getPost = function getPost(context, itemId) {
|
|
154
173
|
// const action: string = 'getItem';
|
|
155
174
|
var database = context.database,
|
|
156
175
|
fields = context.fields,
|
|
157
176
|
sessionId = context.userId;
|
|
158
|
-
var formatItemId = parseId(itemId);
|
|
159
|
-
var db = useDb(database);
|
|
177
|
+
var formatItemId = (0, _utils.parseId)(itemId);
|
|
178
|
+
var db = (0, _utils2.useDb)(database);
|
|
160
179
|
|
|
161
180
|
var _getPostOptional = getPostOptional(fields),
|
|
162
181
|
selectObjects = _getPostOptional.objects,
|
|
163
182
|
selectQueries = _getPostOptional.queries;
|
|
164
183
|
|
|
165
|
-
var aqlQry = aql(_templateObject(), formatItemId);
|
|
184
|
+
var aqlQry = (0, _arangojs.aql)(_templateObject(), formatItemId);
|
|
166
185
|
return db.query(aqlQry).then(function (cursor) {
|
|
167
186
|
return cursor.next();
|
|
168
187
|
}).then(function () {
|
|
@@ -196,7 +215,10 @@ export var getPost = function getPost(context, itemId) {
|
|
|
196
215
|
throw error;
|
|
197
216
|
});
|
|
198
217
|
};
|
|
199
|
-
|
|
218
|
+
|
|
219
|
+
exports.getPost = getPost;
|
|
220
|
+
|
|
221
|
+
var getPostList = function getPostList(context, options) {
|
|
200
222
|
// const action: string = 'getListByApp';
|
|
201
223
|
var database = context.database,
|
|
202
224
|
fields = context.fields;
|
|
@@ -210,13 +232,16 @@ export var getPostList = function getPostList(context, options) {
|
|
|
210
232
|
selectQueries = _getPostOptional2.queries;
|
|
211
233
|
|
|
212
234
|
var aqlQry = "FOR p IN posts\n FILTER p.type == \"".concat(type, "\" && p.privacy == \"public\" && p.parent == null\n ").concat(selectQueries.join('\n'), "\n ").concat(limit.aql, "\n SORT p.added\n RETURN DISTINCT MERGE(p, {").concat(selectObjects.join(', '), "})");
|
|
213
|
-
return useDb(database).query(aqlQry).then(function (cursor) {
|
|
235
|
+
return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
|
|
214
236
|
return cursor.all();
|
|
215
237
|
}).catch(function (error) {
|
|
216
238
|
throw error;
|
|
217
239
|
});
|
|
218
240
|
};
|
|
219
|
-
|
|
241
|
+
|
|
242
|
+
exports.getPostList = getPostList;
|
|
243
|
+
|
|
244
|
+
var getPostListByArea = function getPostListByArea(context, latitude, longitude, options) {
|
|
220
245
|
// const action: string = 'getListByUser';
|
|
221
246
|
var database = context.database,
|
|
222
247
|
fields = context.fields;
|
|
@@ -225,8 +250,8 @@ export var getPostListByArea = function getPostListByArea(context, latitude, lon
|
|
|
225
250
|
limit = _parsePostOptions2.limit,
|
|
226
251
|
type = _parsePostOptions2.type;
|
|
227
252
|
|
|
228
|
-
var formatLatitude = parseNum(latitude);
|
|
229
|
-
var formatLongitude = parseNum(longitude);
|
|
253
|
+
var formatLatitude = (0, _utils.parseNum)(latitude);
|
|
254
|
+
var formatLongitude = (0, _utils.parseNum)(longitude);
|
|
230
255
|
|
|
231
256
|
var _getPostOptional3 = getPostOptional(fields),
|
|
232
257
|
selectObjects = _getPostOptional3.objects,
|
|
@@ -235,13 +260,16 @@ export var getPostListByArea = function getPostListByArea(context, latitude, lon
|
|
|
235
260
|
selectQueries.push("LET distance = DISTANCE(\n ".concat(formatLatitude, ",\n ").concat(formatLongitude, ",\n NOT_NULL(p.latitude, 0),\n NOT_NULL(p.longitude, 0))\n "));
|
|
236
261
|
selectObjects.push('distance:distance');
|
|
237
262
|
var aqlQry = "FOR p IN posts\n ".concat(selectQueries.join('\n'), "\n FILTER p.type == \"").concat(type, "\" && p.privacy == \"public\" && p.parentId == null\n ").concat(limit.aql, "\n SORT distance, p.added\n RETURN DISTINCT MERGE(p, {").concat(selectObjects.join(', '), "})");
|
|
238
|
-
return useDb(database).query(aqlQry).then(function (cursor) {
|
|
263
|
+
return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
|
|
239
264
|
return cursor.all();
|
|
240
265
|
}).catch(function (error) {
|
|
241
266
|
throw error;
|
|
242
267
|
});
|
|
243
268
|
};
|
|
244
|
-
|
|
269
|
+
|
|
270
|
+
exports.getPostListByArea = getPostListByArea;
|
|
271
|
+
|
|
272
|
+
var getPostListByGroup = function getPostListByGroup(context, groupId, options) {
|
|
245
273
|
// const action: string = 'getListByGroup';
|
|
246
274
|
var database = context.database,
|
|
247
275
|
fields = context.fields,
|
|
@@ -252,8 +280,8 @@ export var getPostListByGroup = function getPostListByGroup(context, groupId, op
|
|
|
252
280
|
selectQueries = _getPostOptional4.queries; // Group id
|
|
253
281
|
|
|
254
282
|
|
|
255
|
-
var formatGroupId = parseId(groupId);
|
|
256
|
-
var db = useDb(database);
|
|
283
|
+
var formatGroupId = (0, _utils.parseId)(groupId);
|
|
284
|
+
var db = (0, _utils2.useDb)(database);
|
|
257
285
|
var aqlQry = "FOR u, g IN INBOUND ".concat(formatGroupId, " hasGroup\n FILTER u._key == ").concat(sessionId, "\n RETURN g");
|
|
258
286
|
return db.query(aqlQry).then(function (cursor) {
|
|
259
287
|
return cursor.all();
|
|
@@ -278,7 +306,10 @@ export var getPostListByGroup = function getPostListByGroup(context, groupId, op
|
|
|
278
306
|
throw error;
|
|
279
307
|
});
|
|
280
308
|
};
|
|
281
|
-
|
|
309
|
+
|
|
310
|
+
exports.getPostListByGroup = getPostListByGroup;
|
|
311
|
+
|
|
312
|
+
var getPostListByLatest = function getPostListByLatest(context, options) {
|
|
282
313
|
// const action: string = 'getListByLatest';
|
|
283
314
|
var database = context.database,
|
|
284
315
|
fields = context.fields;
|
|
@@ -292,13 +323,16 @@ export var getPostListByLatest = function getPostListByLatest(context, options)
|
|
|
292
323
|
selectQueries = _getPostOptional5.queries;
|
|
293
324
|
|
|
294
325
|
var aqlQry = "FOR p IN posts\n FILTER p.type == \"".concat(type, "\" && p.privacy == \"public\" && p.parent == null\n ").concat(selectQueries.join('\n'), "\n ").concat(limit.aql, "\n SORT p.added\n RETURN DISTINCT MERGE(p, {").concat(selectObjects.join(', '), "})");
|
|
295
|
-
return useDb(database).query(aqlQry).then(function (cursor) {
|
|
326
|
+
return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
|
|
296
327
|
return cursor.all();
|
|
297
328
|
}).catch(function (error) {
|
|
298
329
|
throw error;
|
|
299
330
|
});
|
|
300
331
|
};
|
|
301
|
-
|
|
332
|
+
|
|
333
|
+
exports.getPostListByLatest = getPostListByLatest;
|
|
334
|
+
|
|
335
|
+
var getPostListByTags = function getPostListByTags(context, tagNames, options) {
|
|
302
336
|
// const action: string = 'getListByTags';
|
|
303
337
|
var database = context.database,
|
|
304
338
|
fields = context.fields;
|
|
@@ -316,8 +350,8 @@ export var getPostListByTags = function getPostListByTags(context, tagNames, opt
|
|
|
316
350
|
var sortBy = [];
|
|
317
351
|
|
|
318
352
|
if (latitude !== undefined && longitude !== undefined) {
|
|
319
|
-
var formatLatitude = parseNum(latitude);
|
|
320
|
-
var formatLongitude = parseNum(longitude);
|
|
353
|
+
var formatLatitude = (0, _utils.parseNum)(latitude);
|
|
354
|
+
var formatLongitude = (0, _utils.parseNum)(longitude);
|
|
321
355
|
selectQueries.push("LET distance = DISTANCE(\n ".concat(formatLatitude, ",\n ").concat(formatLongitude, ",\n NOT_NULL(p.latitude, 0),\n NOT_NULL(p.longitude, 0))\n "));
|
|
322
356
|
selectObjects.push('distance:distance');
|
|
323
357
|
sortBy.push('distance');
|
|
@@ -326,18 +360,21 @@ export var getPostListByTags = function getPostListByTags(context, tagNames, opt
|
|
|
326
360
|
sortBy.push('p.added');
|
|
327
361
|
return Promise.all(tagNames.map(function (tagName) {
|
|
328
362
|
var aqlQry = "FOR targetTag IN tags\n FILTER targetTag.name == \"".concat(tagName, "\"\n FOR p, e IN OUTBOUND targetTag._id isTagged\n ").concat(selectQueries.join('\n'), "\n FILTER p.type = \"").concat(type, "\" && p.privacy == \"public\" && e.type == 'posts'\n ").concat(limit.aql, "\n SORT ").concat(sortBy.join(', '), "\n RETURN DISTINCT MERGE(p, {").concat(selectObjects.join(', '), "})");
|
|
329
|
-
return useDb(database).query(aqlQry).then(function (cursor) {
|
|
363
|
+
return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
|
|
330
364
|
return cursor.all();
|
|
331
365
|
}).catch(function () {
|
|
332
366
|
return [];
|
|
333
367
|
});
|
|
334
368
|
})).then(function (results) {
|
|
335
|
-
return
|
|
369
|
+
return (0, _uniqBy.default)((0, _flatten.default)(results), '_key');
|
|
336
370
|
}).catch(function (error) {
|
|
337
371
|
throw error;
|
|
338
372
|
});
|
|
339
373
|
};
|
|
340
|
-
|
|
374
|
+
|
|
375
|
+
exports.getPostListByTags = getPostListByTags;
|
|
376
|
+
|
|
377
|
+
var getPostListByUser = function getPostListByUser(context, userId, options) {
|
|
341
378
|
// const action: string = 'getListByUser';
|
|
342
379
|
var database = context.database,
|
|
343
380
|
fields = context.fields;
|
|
@@ -346,20 +383,23 @@ export var getPostListByUser = function getPostListByUser(context, userId, optio
|
|
|
346
383
|
limit = _parsePostOptions6.limit,
|
|
347
384
|
type = _parsePostOptions6.type;
|
|
348
385
|
|
|
349
|
-
var formatUserId = parseId(userId);
|
|
386
|
+
var formatUserId = (0, _utils.parseId)(userId);
|
|
350
387
|
|
|
351
388
|
var _getPostOptional7 = getPostOptional(fields),
|
|
352
389
|
selectObjects = _getPostOptional7.objects,
|
|
353
390
|
selectQueries = _getPostOptional7.queries;
|
|
354
391
|
|
|
355
392
|
var aqlQry = "FOR p IN posts\n FILTER p.userId == \"".concat(formatUserId, "\" && p.type == \"").concat(type, "\" && p.privacy == \"public\" && p.parent == null\n ").concat(selectQueries.join('\n'), "\n ").concat(limit.aql, "\n SORT p.added\n RETURN DISTINCT MERGE(p, {").concat(selectObjects.join(', '), "})");
|
|
356
|
-
return useDb(database).query(aqlQry).then(function (cursor) {
|
|
393
|
+
return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
|
|
357
394
|
return cursor.all();
|
|
358
395
|
}).catch(function (error) {
|
|
359
396
|
throw error;
|
|
360
397
|
});
|
|
361
398
|
};
|
|
362
|
-
|
|
399
|
+
|
|
400
|
+
exports.getPostListByUser = getPostListByUser;
|
|
401
|
+
|
|
402
|
+
var getPostComments = function getPostComments(context, itemId, options) {
|
|
363
403
|
// const action: string = 'getComments';
|
|
364
404
|
var database = context.database,
|
|
365
405
|
sessionId = context.userId;
|
|
@@ -368,10 +408,10 @@ export var getPostComments = function getPostComments(context, itemId, options)
|
|
|
368
408
|
limit = _parsePostOptions7.limit,
|
|
369
409
|
type = _parsePostOptions7.type;
|
|
370
410
|
|
|
371
|
-
var formatItemId = parseId(itemId); // Get the parent post to get restrictions
|
|
411
|
+
var formatItemId = (0, _utils.parseId)(itemId); // Get the parent post to get restrictions
|
|
372
412
|
|
|
373
|
-
var db = useDb(database);
|
|
374
|
-
var aqlQry = aql(_templateObject2(), type, formatItemId);
|
|
413
|
+
var db = (0, _utils2.useDb)(database);
|
|
414
|
+
var aqlQry = (0, _arangojs.aql)(_templateObject2(), type, formatItemId);
|
|
375
415
|
return db.query(aqlQry).then(function (cursor) {
|
|
376
416
|
return cursor.next();
|
|
377
417
|
}).then(function () {
|
|
@@ -402,7 +442,10 @@ export var getPostComments = function getPostComments(context, itemId, options)
|
|
|
402
442
|
throw error;
|
|
403
443
|
});
|
|
404
444
|
};
|
|
405
|
-
|
|
445
|
+
|
|
446
|
+
exports.getPostComments = getPostComments;
|
|
447
|
+
|
|
448
|
+
var addPost = function addPost(context, item) {
|
|
406
449
|
// const action: string = 'add';
|
|
407
450
|
var database = context.database,
|
|
408
451
|
sessionId = context.userId;
|
|
@@ -423,29 +466,29 @@ export var addPost = function addPost(context, item) {
|
|
|
423
466
|
type = _item$type === void 0 ? 'default' : _item$type;
|
|
424
467
|
var now = Date.now();
|
|
425
468
|
var insert = {
|
|
426
|
-
_key: createHash("post-".concat(sessionId)),
|
|
469
|
+
_key: (0, _utils.createHash)("post-".concat(sessionId)),
|
|
427
470
|
added: now,
|
|
428
|
-
content: parseString(content, MAX_CONTENT_LENGTH),
|
|
429
|
-
groupId: groupId ? parseId(groupId) : undefined,
|
|
430
|
-
latitude: latitude !== undefined ? parseNum(latitude) : undefined,
|
|
431
|
-
location: location ? parseString(location, 160) : undefined,
|
|
432
|
-
longitude: longitude !== undefined ? parseNum(longitude) : undefined,
|
|
471
|
+
content: (0, _utils.parseString)(content, MAX_CONTENT_LENGTH),
|
|
472
|
+
groupId: groupId ? (0, _utils.parseId)(groupId) : undefined,
|
|
473
|
+
latitude: latitude !== undefined ? (0, _utils.parseNum)(latitude) : undefined,
|
|
474
|
+
location: location ? (0, _utils.parseString)(location, 160) : undefined,
|
|
475
|
+
longitude: longitude !== undefined ? (0, _utils.parseNum)(longitude) : undefined,
|
|
433
476
|
modified: now,
|
|
434
|
-
name: parseString(name, 160),
|
|
435
|
-
parentId: parentId ? parseId(parentId) : undefined,
|
|
436
|
-
privacy: privacy ? parseVarChar(privacy, 16) : undefined,
|
|
437
|
-
type: parseChar(type, 32),
|
|
477
|
+
name: (0, _utils.parseString)(name, 160),
|
|
478
|
+
parentId: parentId ? (0, _utils.parseId)(parentId) : undefined,
|
|
479
|
+
privacy: privacy ? (0, _utils.parseVarChar)(privacy, 16) : undefined,
|
|
480
|
+
type: (0, _utils.parseChar)(type, 32),
|
|
438
481
|
userId: sessionId
|
|
439
482
|
};
|
|
440
|
-
var db = useDb(database);
|
|
441
|
-
var aqlQry = aql(_templateObject3(), insert);
|
|
483
|
+
var db = (0, _utils2.useDb)(database);
|
|
484
|
+
var aqlQry = (0, _arangojs.aql)(_templateObject3(), insert);
|
|
442
485
|
return db.query(aqlQry).then(function (cursor) {
|
|
443
486
|
return cursor.next();
|
|
444
487
|
}).then(function () {
|
|
445
488
|
var post = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
446
489
|
var postKey = post._key; // Update linked tags within posts
|
|
447
490
|
|
|
448
|
-
return extractTags(db, 'posts', postKey, insert.content).then(function (tagList) {
|
|
491
|
+
return (0, _tags.extractTags)(db, 'posts', postKey, insert.content).then(function (tagList) {
|
|
449
492
|
post.tags = tagList;
|
|
450
493
|
return post;
|
|
451
494
|
});
|
|
@@ -453,7 +496,10 @@ export var addPost = function addPost(context, item) {
|
|
|
453
496
|
throw error;
|
|
454
497
|
});
|
|
455
498
|
};
|
|
456
|
-
|
|
499
|
+
|
|
500
|
+
exports.addPost = addPost;
|
|
501
|
+
|
|
502
|
+
var updatePost = function updatePost(context, item) {
|
|
457
503
|
// const action: string = 'update';
|
|
458
504
|
var database = context.database,
|
|
459
505
|
sessionId = context.userId;
|
|
@@ -466,16 +512,16 @@ export var updatePost = function updatePost(context, item) {
|
|
|
466
512
|
privacy = item.privacy,
|
|
467
513
|
type = item.type;
|
|
468
514
|
var update = {
|
|
469
|
-
content: content ? parseString(content, MAX_CONTENT_LENGTH) : undefined,
|
|
515
|
+
content: content ? (0, _utils.parseString)(content, MAX_CONTENT_LENGTH) : undefined,
|
|
470
516
|
modified: now,
|
|
471
|
-
name: name ? parseString(name, 160) : undefined,
|
|
472
|
-
parentId: parentId ? parseString(parentId, 160) : undefined,
|
|
473
|
-
privacy: privacy ? parseVarChar(privacy, 16) : undefined,
|
|
474
|
-
type: type !== undefined ? parseChar(type, 16) : undefined
|
|
517
|
+
name: name ? (0, _utils.parseString)(name, 160) : undefined,
|
|
518
|
+
parentId: parentId ? (0, _utils.parseString)(parentId, 160) : undefined,
|
|
519
|
+
privacy: privacy ? (0, _utils.parseVarChar)(privacy, 16) : undefined,
|
|
520
|
+
type: type !== undefined ? (0, _utils.parseChar)(type, 16) : undefined
|
|
475
521
|
};
|
|
476
|
-
var formatId = parseId(postId);
|
|
477
|
-
formatId = formatId === '' ? createHash("post-".concat(sessionId)) : formatId;
|
|
478
|
-
var formatGroupId = parseId(groupId);
|
|
522
|
+
var formatId = (0, _utils.parseId)(postId);
|
|
523
|
+
formatId = formatId === '' ? (0, _utils.createHash)("post-".concat(sessionId)) : formatId;
|
|
524
|
+
var formatGroupId = (0, _utils.parseId)(groupId);
|
|
479
525
|
|
|
480
526
|
var insert = _objectSpread({}, update, {
|
|
481
527
|
_key: formatId,
|
|
@@ -485,22 +531,22 @@ export var updatePost = function updatePost(context, item) {
|
|
|
485
531
|
userId: sessionId
|
|
486
532
|
});
|
|
487
533
|
|
|
488
|
-
var db = useDb(database);
|
|
489
|
-
var aqlQry = aql(_templateObject4(), formatId, sessionId, insert, update);
|
|
534
|
+
var db = (0, _utils2.useDb)(database);
|
|
535
|
+
var aqlQry = (0, _arangojs.aql)(_templateObject4(), formatId, sessionId, insert, update);
|
|
490
536
|
return db.query(aqlQry).then(function (cursor) {
|
|
491
537
|
return cursor.next();
|
|
492
538
|
}).then(function () {
|
|
493
539
|
var updatedPost = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
494
540
|
var updatedPostKey = updatedPost._key; // Update linked tags
|
|
495
541
|
|
|
496
|
-
return extractTags(db, 'posts', updatedPostKey, update.content || '').then(function () {
|
|
542
|
+
return (0, _tags.extractTags)(db, 'posts', updatedPostKey, update.content || '').then(function () {
|
|
497
543
|
var tagList = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
498
544
|
updatedPost.tags = tagList; // Update linked files
|
|
499
545
|
|
|
500
546
|
var files = updatedPost.files || [];
|
|
501
547
|
|
|
502
548
|
if (files.length) {
|
|
503
|
-
return updateFiles(db, formatId, files).then(function () {
|
|
549
|
+
return (0, _files.updateFiles)(db, formatId, files).then(function () {
|
|
504
550
|
var fileList = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
505
551
|
updatedPost.files = fileList;
|
|
506
552
|
return updatedPost;
|
|
@@ -514,13 +560,16 @@ export var updatePost = function updatePost(context, item) {
|
|
|
514
560
|
throw error;
|
|
515
561
|
});
|
|
516
562
|
};
|
|
517
|
-
|
|
563
|
+
|
|
564
|
+
exports.updatePost = updatePost;
|
|
565
|
+
|
|
566
|
+
var deletePost = function deletePost(context, itemId) {
|
|
518
567
|
// const action: string = 'delete';
|
|
519
568
|
var database = context.database,
|
|
520
569
|
sessionId = context.userId;
|
|
521
|
-
var formatItemId = parseId(itemId);
|
|
522
|
-
var db = useDb(database);
|
|
523
|
-
var aqlQry = aql(_templateObject5(), formatItemId, sessionId);
|
|
570
|
+
var formatItemId = (0, _utils.parseId)(itemId);
|
|
571
|
+
var db = (0, _utils2.useDb)(database);
|
|
572
|
+
var aqlQry = (0, _arangojs.aql)(_templateObject5(), formatItemId, sessionId);
|
|
524
573
|
return db.query(aqlQry).then(function (cursor) {
|
|
525
574
|
return cursor.next();
|
|
526
575
|
}).then(function () {
|
|
@@ -528,10 +577,10 @@ export var deletePost = function deletePost(context, itemId) {
|
|
|
528
577
|
|
|
529
578
|
if (post) {
|
|
530
579
|
// Remove tag links
|
|
531
|
-
var edgeAqlQry = aql(_templateObject6(), formatItemId);
|
|
580
|
+
var edgeAqlQry = (0, _arangojs.aql)(_templateObject6(), formatItemId);
|
|
532
581
|
return db.query(edgeAqlQry).then(function () {
|
|
533
582
|
// Remove attached files
|
|
534
|
-
var fileAqlQry = aql(_templateObject7(), formatItemId);
|
|
583
|
+
var fileAqlQry = (0, _arangojs.aql)(_templateObject7(), formatItemId);
|
|
535
584
|
return db.query(fileAqlQry).then(function () {
|
|
536
585
|
return post;
|
|
537
586
|
}).catch(function (error) {
|
|
@@ -547,10 +596,13 @@ export var deletePost = function deletePost(context, itemId) {
|
|
|
547
596
|
throw error;
|
|
548
597
|
});
|
|
549
598
|
};
|
|
550
|
-
|
|
599
|
+
|
|
600
|
+
exports.deletePost = deletePost;
|
|
601
|
+
|
|
602
|
+
var cleanPosts = function cleanPosts(database) {
|
|
551
603
|
// Remove all messages that are over 60 days and not saved
|
|
552
|
-
var aqlQry = aql(_templateObject8());
|
|
553
|
-
return useDb(database).query(aqlQry).then(function (cursor) {
|
|
604
|
+
var aqlQry = (0, _arangojs.aql)(_templateObject8());
|
|
605
|
+
return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
|
|
554
606
|
return cursor.all();
|
|
555
607
|
}).then(function () {
|
|
556
608
|
var results = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
@@ -559,13 +611,16 @@ export var cleanPosts = function cleanPosts(database) {
|
|
|
559
611
|
throw error;
|
|
560
612
|
});
|
|
561
613
|
};
|
|
562
|
-
|
|
614
|
+
|
|
615
|
+
exports.cleanPosts = cleanPosts;
|
|
616
|
+
|
|
617
|
+
var createPostEdge = function createPostEdge(db, file, postId) {
|
|
563
618
|
var edgeCollection = db.edgeCollection('isPosted');
|
|
564
619
|
var fileId = file.fileId;
|
|
565
|
-
var formatFileId = parseId(fileId);
|
|
566
|
-
var edgeId = createHash("file-".concat(postId, "-").concat(formatFileId));
|
|
567
|
-
var formatPostId = parseId(postId);
|
|
568
|
-
var fileType = parseChar(file.fileType, 16);
|
|
620
|
+
var formatFileId = (0, _utils.parseId)(fileId);
|
|
621
|
+
var edgeId = (0, _utils.createHash)("file-".concat(postId, "-").concat(formatFileId));
|
|
622
|
+
var formatPostId = (0, _utils.parseId)(postId);
|
|
623
|
+
var fileType = (0, _utils.parseChar)(file.fileType, 16);
|
|
569
624
|
var edge = {
|
|
570
625
|
_key: edgeId,
|
|
571
626
|
added: Date.now(),
|
|
@@ -577,4 +632,6 @@ export var createPostEdge = function createPostEdge(db, file, postId) {
|
|
|
577
632
|
throw error;
|
|
578
633
|
});
|
|
579
634
|
};
|
|
580
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhL3Bvc3RzLnRzIl0sIm5hbWVzIjpbImNyZWF0ZUhhc2giLCJwYXJzZUNoYXIiLCJwYXJzZUlkIiwicGFyc2VOdW0iLCJwYXJzZVN0cmluZyIsInBhcnNlVmFyQ2hhciIsImFxbCIsImZsYXR0ZW4iLCJ1bmlxQnkiLCJnZXRMaW1pdCIsInVzZURiIiwidXBkYXRlRmlsZXMiLCJleHRyYWN0VGFncyIsIk1BWF9DT05URU5UX0xFTkdUSCIsInBhcnNlUG9zdE9wdGlvbnMiLCJvcHRpb25zIiwiZnJvbSIsImxhdGl0dWRlIiwibG9uZ2l0dWRlIiwidG8iLCJ0eXBlIiwibGltaXQiLCJnZXRQb3N0T3B0aW9uYWwiLCJmaWVsZHMiLCJyZWR1Y2UiLCJzZWxlY3RzIiwiZmllbGQiLCJxdWVyaWVzIiwicHVzaCIsIm9iamVjdHMiLCJnZXRQb3N0IiwiY29udGV4dCIsIml0ZW1JZCIsImRhdGFiYXNlIiwic2Vzc2lvbklkIiwidXNlcklkIiwiZm9ybWF0SXRlbUlkIiwiZGIiLCJzZWxlY3RPYmplY3RzIiwic2VsZWN0UXVlcmllcyIsImFxbFFyeSIsInF1ZXJ5IiwidGhlbiIsImN1cnNvciIsIm5leHQiLCJwb3N0IiwiX2tleSIsImdyb3VwSWQiLCJwcml2YWN5IiwicHJpdmFjeUFxbFFyeSIsImpvaW4iLCJmaWx0ZXJlZFBvc3QiLCJjYXRjaCIsImVycm9yIiwiZ2V0UG9zdExpc3QiLCJhbGwiLCJnZXRQb3N0TGlzdEJ5QXJlYSIsImZvcm1hdExhdGl0dWRlIiwiZm9ybWF0TG9uZ2l0dWRlIiwiZ2V0UG9zdExpc3RCeUdyb3VwIiwiZm9ybWF0R3JvdXBJZCIsImdyb3VwcyIsImxlbmd0aCIsInBvc3RBcWxRcnkiLCJnZXRQb3N0TGlzdEJ5TGF0ZXN0IiwiZ2V0UG9zdExpc3RCeVRhZ3MiLCJ0YWdOYW1lcyIsInNvcnRCeSIsInVuZGVmaW5lZCIsIlByb21pc2UiLCJtYXAiLCJ0YWdOYW1lIiwicmVzdWx0cyIsImdldFBvc3RMaXN0QnlVc2VyIiwiZm9ybWF0VXNlcklkIiwiZ2V0UG9zdENvbW1lbnRzIiwiYWRkUG9zdCIsIml0ZW0iLCJjb250ZW50IiwibG9jYXRpb24iLCJuYW1lIiwicGFyZW50SWQiLCJub3ciLCJEYXRlIiwiaW5zZXJ0IiwiYWRkZWQiLCJtb2RpZmllZCIsInBvc3RLZXkiLCJ0YWdMaXN0IiwidGFncyIsInVwZGF0ZVBvc3QiLCJwb3N0SWQiLCJ1cGRhdGUiLCJmb3JtYXRJZCIsInVwZGF0ZWRQb3N0IiwidXBkYXRlZFBvc3RLZXkiLCJmaWxlcyIsImZpbGVMaXN0IiwiZGVsZXRlUG9zdCIsImVkZ2VBcWxRcnkiLCJmaWxlQXFsUXJ5IiwiY2xlYW5Qb3N0cyIsImNyZWF0ZVBvc3RFZGdlIiwiZmlsZSIsImVkZ2VDb2xsZWN0aW9uIiwiZmlsZUlkIiwiZm9ybWF0RmlsZUlkIiwiZWRnZUlkIiwiZm9ybWF0UG9zdElkIiwiZmlsZVR5cGUiLCJlZGdlIiwic2F2ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7OztBQUlBLFNBQVFBLFVBQVIsRUFBb0JDLFNBQXBCLEVBQStCQyxPQUEvQixFQUF3Q0MsUUFBeEMsRUFBa0RDLFdBQWxELEVBQStEQyxZQUEvRCxRQUFrRixjQUFsRjtBQUNBLFNBQVFDLEdBQVIsUUFBNEIsVUFBNUI7QUFHQSxPQUFPQyxPQUFQLE1BQW9CLGdCQUFwQjtBQUNBLE9BQU9DLE1BQVAsTUFBbUIsZUFBbkI7QUFHQSxTQUFRQyxRQUFSLEVBQWtCQyxLQUFsQixRQUE4QixVQUE5QjtBQUNBLFNBQVFDLFdBQVIsUUFBMEIsU0FBMUI7QUFDQSxTQUFRQyxXQUFSLFFBQTBCLFFBQTFCLEMsQ0FFQTs7QUFDQSxJQUFNQyxrQkFBMEIsR0FBRyxNQUFuQztBQUVBLE9BQU8sSUFBTUMsZ0JBQWdCLEdBQUcsU0FBbkJBLGdCQUFtQixHQUErQjtBQUFBLE1BQTlCQyxPQUE4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QUFnQixFQUFoQixDQUFsQztBQUVBLE1BQU1DLElBQVMsR0FBRztBQUNoQmhFLElBQUFBLElBQUksRUFBRTZELE1BRFU7QUFFaEJ0QixJQUFBQSxLQUFLLEVBQUVGLElBQUksQ0FBQ0QsR0FBTCxFQUZTO0FBR2hCOUQsSUFBQUEsSUFBSSxFQUFFeUY7QUFIVSxHQUFsQjtBQU1BLFNBQU9MLGNBQWMsQ0FBQ08sSUFBZixDQUFvQkQsSUFBcEIsa0JBQW1DRixZQUFuQyxtQkFBNERGLFlBQTVELEdBQ0poRSxJQURJLENBQ0M7QUFBQSxXQUFNNkQsSUFBTjtBQUFBLEdBREQsRUFFSm5ELEtBRkksQ0FFRSxVQUFDQyxLQUFELEVBQWtCO0FBQ3ZCLFVBQU1BLEtBQU47QUFDRCxHQUpJLENBQVA7QUFLRCxDQW5CTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge2NyZWF0ZUhhc2gsIHBhcnNlQ2hhciwgcGFyc2VJZCwgcGFyc2VOdW0sIHBhcnNlU3RyaW5nLCBwYXJzZVZhckNoYXJ9IGZyb20gJ0BubGFicy91dGlscyc7XG5pbXBvcnQge2FxbCwgRGF0YWJhc2V9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2xpYi9janMvYXFsLXF1ZXJ5JztcbmltcG9ydCB7QXJyYXlDdXJzb3J9IGZyb20gJ2FyYW5nb2pzL2xpYi9janMvY3Vyc29yJztcbmltcG9ydCBmbGF0dGVuIGZyb20gJ2xvZGFzaC9mbGF0dGVuJztcbmltcG9ydCB1bmlxQnkgZnJvbSAnbG9kYXNoL3VuaXFCeSc7XG5cbmltcG9ydCB7QXBpQ29udGV4dCwgRmlsZVR5cGUsIEdyb3VwVHlwZSwgUG9zdE9wdGlvbnMsIFBvc3RUeXBlLCBUYWdUeXBlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2dldExpbWl0LCB1c2VEYn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHt1cGRhdGVGaWxlc30gZnJvbSAnLi9maWxlcyc7XG5pbXBvcnQge2V4dHJhY3RUYWdzfSBmcm9tICcuL3RhZ3MnO1xuXG4vLyBjb25zdCBldmVudENhdGVnb3J5OiBzdHJpbmcgPSAncG9zdHMnO1xuY29uc3QgTUFYX0NPTlRFTlRfTEVOR1RIOiBudW1iZXIgPSAxMDAwMDA7XG5cbmV4cG9ydCBjb25zdCBwYXJzZVBvc3RPcHRpb25zID0gKG9wdGlvbnM6IFBvc3RPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGZyb20gPSAwLFxuICAgIGxhdGl0dWRlID0gMCxcbiAgICBsb25naXR1ZGUgPSAwLFxuICAgIHRvID0gMzAsXG4gICAgdHlwZSA9ICdkZWZhdWx0J1xuICB9ID0gb3B0aW9ucztcblxuXG4gIHJldHVybiB7XG4gICAgbGF0aXR1ZGU6IHBhcnNlTnVtKGxhdGl0dWRlLCAzMiksXG4gICAgbGltaXQ6IGdldExpbWl0KGZyb20sIHRvKSxcbiAgICBsb25naXR1ZGU6IHBhcnNlTnVtKGxvbmdpdHVkZSwgMzIpLFxuICAgIHR5cGU6IHBhcnNlQ2hhcih0eXBlLCAzMilcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0T3B0aW9uYWwgPSAoZmllbGRzOiBzdHJpbmdbXSkgPT5cbiAgZmllbGRzLnJlZHVjZSgoc2VsZWN0czogYW55LCBmaWVsZDogc3RyaW5nKSA9PiB7XG4gICAgc3dpdGNoKGZpZWxkKSB7XG4gICAgICBjYXNlICdyZWFjdGlvbnMnOiB7XG4gICAgICAgIHNlbGVjdHMucXVlcmllcy5wdXNoKGBMRVQgcmVhY3Rpb25zID0gKFxuICAgICAgICAgIEZPUiBwb3N0LCByIElOIElOQk9VTkQgcC5faWQgcmVhY3Rpb25zXG4gICAgICAgICAgQ09MTEVDVCByZWFjdGlvbk5hbWUgPSByLnZhbHVlIElOVE8gcmVhY3Rpb25JdGVtc1xuICAgICAgICAgIFJFVFVSTiB7bmFtZTogcmVhY3Rpb25OYW1lLCBjb3VudDogTEVOR1RIKHJlYWN0aW9uSXRlbXNbKl0uci52YWx1ZSl9XG4gICAgICAgIClgKTtcbiAgICAgICAgc2VsZWN0cy5vYmplY3RzLnB1c2goJ3JlYWN0aW9uczpyZWFjdGlvbnMnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdzJzoge1xuICAgICAgICBzZWxlY3RzLnF1ZXJpZXMucHVzaChgTEVUIHRhZ3MgPSAoXG4gICAgICAgICAgRk9SIHQsIHBsIElOIElOQk9VTkQgcC5faWQgaXNUYWdnZWRcbiAgICAgICAgICBSRVRVUk4gdFxuICAgICAgICApYCk7XG4gICAgICAgIHNlbGVjdHMub2JqZWN0cy5wdXNoKCd0YWdzOnRhZ3MnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBjYXNlICd1c2VyJzoge1xuICAgICAgICBzZWxlY3RzLnF1ZXJpZXMucHVzaChgTEVUIHVzZXIgPSBGSVJTVChcbiAgICAgICAgICBGT1IgdSBJTiB1c2Vyc1xuICAgICAgICAgIEZJTFRFUiBwLnVzZXJJZCA9PSB1Ll9rZXlcbiAgICAgICAgICBMSU1JVCAxXG4gICAgICAgICAgUkVUVVJOIHVcbiAgICAgICAgKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgndXNlcjp1c2VyJyk7XG4gICAgICAgIHJldHVybiBzZWxlY3RzO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtvYmplY3RzOiBbXSwgcXVlcmllczogW119KTtcblxuZXhwb3J0IGNvbnN0IGdldFBvc3QgPSAoY29udGV4dDogQXBpQ29udGV4dCwgaXRlbUlkOiBzdHJpbmcpOiBQcm9taXNlPFBvc3RUeXBlPiA9PiB7XG4gIC8vIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldEl0ZW0nO1xuICBjb25zdCB7ZGF0YWJhc2UsIGZpZWxkcywgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SXRlbUlkOiBzdHJpbmcgPSBwYXJzZUlkKGl0ZW1JZCk7XG4gIGNvbnN0IGRiID0gdXNlRGIoZGF0YWJhc2UpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzKTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgcCBJTiBwb3N0c1xuICAgIEZJTFRFUiBwLl9rZXkgPT0gJHtmb3JtYXRJdGVtSWR9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBwYDtcblxuICByZXR1cm4gZGIucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChwb3N0OiBQb3N0VHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIF9rZXksXG4gICAgICAgIGdyb3VwSWQsXG4gICAgICAgIHByaXZhY3kgPSAnZGVmYXVsdCdcbiAgICAgIH06IFBvc3RUeXBlID0gcG9zdDtcblxuICAgICAgLy8gUXVlcnkgYmFzZWQgb24gcHJpdmFjeSBsZXZlbFxuICAgICAgbGV0IHByaXZhY3lBcWxRcnk6IHN0cmluZztcblxuICAgICAgaWYoZ3JvdXBJZCAmJiBwcml2YWN5ID09PSAnZ3JvdXAnKSB7XG4gICAgICAgIHByaXZhY3lBcWxRcnkgPSBgRk9SIHAgSU4gcG9zdHNcbiAgICAgICAgICBGSUxURVIgcC5fa2V5ID09IFwiJHtfa2V5fVwiXG4gICAgICAgICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgICAgICAgIEZPUiBncm91cCBJTiBncm91cHNcbiAgICAgICAgICBGSUxURVIgZ3JvdXAuX2tleSA9PSBwLmdyb3VwSWRcbiAgICAgICAgICBGT1IgdSwgZSBJTiBPVVRCT1VORCBncm91cC5faWQgaXNHcm91cGVkXG4gICAgICAgICAgRklMVEVSIHUuX2tleSA9PSAke3Nlc3Npb25JZH1cbiAgICAgICAgICBMSU1JVCAxXG4gICAgICAgICAgUkVUVVJOIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG4gICAgICB9IGVsc2UgaWYocHJpdmFjeSA9PT0gJ3B1YmxpYycpIHtcbiAgICAgICAgcHJpdmFjeUFxbFFyeSA9IGBGT1IgcCBJTiBwb3N0c1xuICAgICAgICAgIEZJTFRFUiBwLl9rZXkgPT0gXCIke19rZXl9XCJcbiAgICAgICAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgICAgICAgTElNSVQgMVxuICAgICAgICAgIFJFVFVSTiBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuICAgICAgfVxuXG4gICAgICBpZihwcml2YWN5QXFsUXJ5KSB7XG4gICAgICAgIHJldHVybiBkYi5xdWVyeShwcml2YWN5QXFsUXJ5KVxuICAgICAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAgIC50aGVuKChmaWx0ZXJlZFBvc3Q6IFBvc3RUeXBlID0ge30pID0+IGZpbHRlcmVkUG9zdClcbiAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7fTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0TGlzdCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBvcHRpb25zPzogUG9zdE9wdGlvbnMpOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbiAgLy8gY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0TGlzdEJ5QXBwJztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMpO1xuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgcCBJTiBwb3N0c1xuICAgIEZJTFRFUiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgcC5wYXJlbnQgPT0gbnVsbFxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIHAuYWRkZWRcbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0TGlzdEJ5QXJlYSA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgbGF0aXR1ZGU6IG51bWJlcixcbiAgbG9uZ2l0dWRlOiBudW1iZXIsXG4gIG9wdGlvbnM/OiBQb3N0T3B0aW9uc1xuKTogUHJvbWlzZTxQb3N0VHlwZVtdPiA9PiB7XG4gIC8vIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldExpc3RCeVVzZXInO1xuICBjb25zdCB7ZGF0YWJhc2UsIGZpZWxkc30gPSBjb250ZXh0O1xuICBjb25zdCB7bGltaXQsIHR5cGV9ID0gcGFyc2VQb3N0T3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3QgZm9ybWF0TGF0aXR1ZGU6IG51bWJlciA9IHBhcnNlTnVtKGxhdGl0dWRlKTtcbiAgY29uc3QgZm9ybWF0TG9uZ2l0dWRlOiBudW1iZXIgPSBwYXJzZU51bShsb25naXR1ZGUpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzKTtcbiAgc2VsZWN0UXVlcmllcy5wdXNoKGBMRVQgZGlzdGFuY2UgPSBESVNUQU5DRShcbiAgICAke2Zvcm1hdExhdGl0dWRlfSxcbiAgICAke2Zvcm1hdExvbmdpdHVkZX0sXG4gICAgTk9UX05VTEwocC5sYXRpdHVkZSwgMCksXG4gICAgTk9UX05VTEwocC5sb25naXR1ZGUsIDApKVxuICBgKTtcbiAgc2VsZWN0T2JqZWN0cy5wdXNoKCdkaXN0YW5jZTpkaXN0YW5jZScpO1xuXG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBwIElOIHBvc3RzXG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgIEZJTFRFUiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgcC5wYXJlbnRJZCA9PSBudWxsXG4gICAgJHtsaW1pdC5hcWx9XG4gICAgU09SVCBkaXN0YW5jZSwgcC5hZGRlZFxuICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFBvc3RMaXN0QnlHcm91cCA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgZ3JvdXBJZDogc3RyaW5nLFxuICBvcHRpb25zPzogUG9zdE9wdGlvbnNcbik6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0QnlHcm91cCc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCB1c2VySWQ6IHNlc3Npb25JZH0gPSBjb250ZXh0O1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzKTtcblxuICAvLyBHcm91cCBpZFxuICBjb25zdCBmb3JtYXRHcm91cElkOiBzdHJpbmcgPSBwYXJzZUlkKGdyb3VwSWQpO1xuICBjb25zdCBkYiA9IHVzZURiKGRhdGFiYXNlKTtcbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHUsIGcgSU4gSU5CT1VORCAke2Zvcm1hdEdyb3VwSWR9IGhhc0dyb3VwXG4gICAgICBGSUxURVIgdS5fa2V5ID09ICR7c2Vzc2lvbklkfVxuICAgICAgUkVUVVJOIGdgO1xuXG4gIHJldHVybiBkYi5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAudGhlbigoZ3JvdXBzOiBHcm91cFR5cGVbXSA9IFtdKSA9PiB7XG4gICAgICBpZihncm91cHMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHtsaW1pdCwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBwb3N0QXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHAgSU4gcG9zdHNcbiAgICAgICAgICBGSUxURVIgcC50eXBlID09IFwiJHt0eXBlfVwiICYmIHAuZ3JvdXBJZCA9PSBcIiR7Zm9ybWF0R3JvdXBJZH1cIiAmJiBwLnBhcmVudCA9PSBudWxsXG4gICAgICAgICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgICAgICAgICR7bGltaXQuYXFsfVxuICAgICAgICAgIFNPUlQgcC5hZGRlZFxuICAgICAgICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gICAgICAgIHJldHVybiBkYi5xdWVyeShwb3N0QXFsUXJ5KVxuICAgICAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW107XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UG9zdExpc3RCeUxhdGVzdCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBvcHRpb25zPzogUG9zdE9wdGlvbnMpOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbiAgLy8gY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0TGlzdEJ5TGF0ZXN0JztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMpO1xuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgcCBJTiBwb3N0c1xuICAgIEZJTFRFUiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgcC5wYXJlbnQgPT0gbnVsbFxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIHAuYWRkZWRcbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0TGlzdEJ5VGFncyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdGFnTmFtZXM6IHN0cmluZ1tdLFxuICBvcHRpb25zPzogUG9zdE9wdGlvbnNcbik6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0QnlUYWdzJztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge2xhdGl0dWRlLCBsb25naXR1ZGUsIGxpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMpO1xuICBjb25zdCBzb3J0Qnk6IHN0cmluZ1tdID0gW107XG5cbiAgaWYobGF0aXR1ZGUgIT09IHVuZGVmaW5lZCAmJiBsb25naXR1ZGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGZvcm1hdExhdGl0dWRlOiBudW1iZXIgPSBwYXJzZU51bShsYXRpdHVkZSk7XG4gICAgY29uc3QgZm9ybWF0TG9uZ2l0dWRlOiBudW1iZXIgPSBwYXJzZU51bShsb25naXR1ZGUpO1xuICAgIHNlbGVjdFF1ZXJpZXMucHVzaChgTEVUIGRpc3RhbmNlID0gRElTVEFOQ0UoXG4gICAgICAke2Zvcm1hdExhdGl0dWRlfSxcbiAgICAgICR7Zm9ybWF0TG9uZ2l0dWRlfSxcbiAgICAgIE5PVF9OVUxMKHAubGF0aXR1ZGUsIDApLFxuICAgICAgTk9UX05VTEwocC5sb25naXR1ZGUsIDApKVxuICAgIGApO1xuICAgIHNlbGVjdE9iamVjdHMucHVzaCgnZGlzdGFuY2U6ZGlzdGFuY2UnKTtcbiAgICBzb3J0QnkucHVzaCgnZGlzdGFuY2UnKTtcbiAgfVxuXG4gIHNvcnRCeS5wdXNoKCdwLmFkZGVkJyk7XG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgIHRhZ05hbWVzLm1hcCgodGFnTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgdGFyZ2V0VGFnIElOIHRhZ3NcbiAgICAgICAgRklMVEVSIHRhcmdldFRhZy5uYW1lID09IFwiJHt0YWdOYW1lfVwiXG4gICAgICAgIEZPUiBwLCBlIElOIE9VVEJPVU5EIHRhcmdldFRhZy5faWQgaXNUYWdnZWRcbiAgICAgICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgICAgICBGSUxURVIgcC50eXBlID0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgZS50eXBlID09ICdwb3N0cydcbiAgICAgICAgJHtsaW1pdC5hcWx9XG4gICAgICAgIFNPUlQgJHtzb3J0Qnkuam9pbignLCAnKX1cbiAgICAgICAgUkVUVVJOIERJU1RJTkNUIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgICAgICAuY2F0Y2goKCkgPT4gW10pO1xuICAgIH0pKVxuICAgIC50aGVuKChyZXN1bHRzKSA9PiB1bmlxQnkoZmxhdHRlbihyZXN1bHRzKSwgJ19rZXknKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UG9zdExpc3RCeVVzZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcklkOiBzdHJpbmcsIG9wdGlvbnM/OiBQb3N0T3B0aW9ucyk6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0QnlVc2VyJztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IGZvcm1hdFVzZXJJZDogc3RyaW5nID0gcGFyc2VJZCh1c2VySWQpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzKTtcbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHAgSU4gcG9zdHNcbiAgICBGSUxURVIgcC51c2VySWQgPT0gXCIke2Zvcm1hdFVzZXJJZH1cIiAmJiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgcC5wYXJlbnQgPT0gbnVsbFxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIHAuYWRkZWRcbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0Q29tbWVudHMgPSAoY29udGV4dDogQXBpQ29udGV4dCwgaXRlbUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBQb3N0T3B0aW9ucyk6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRDb21tZW50cyc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IGZvcm1hdEl0ZW1JZDogc3RyaW5nID0gcGFyc2VJZChpdGVtSWQpO1xuXG4gIC8vIEdldCB0aGUgcGFyZW50IHBvc3QgdG8gZ2V0IHJlc3RyaWN0aW9uc1xuICBjb25zdCBkYiA9IHVzZURiKGRhdGFiYXNlKTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgcCBJTiBwb3N0c1xuICAgIEZJTFRFUiBwLnR5cGUgPT0gJHt0eXBlfSAmJiBwLl9rZXkgPT0gJHtmb3JtYXRJdGVtSWR9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBwYDtcblxuICByZXR1cm4gZGIucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChwb3N0OiBQb3N0VHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIF9rZXksXG4gICAgICAgIGdyb3VwSWQsXG4gICAgICAgIHByaXZhY3kgPSAncHVibGljJ1xuICAgICAgfTogUG9zdFR5cGUgPSBwb3N0O1xuXG4gICAgICAvLyBRdWVyeSBiYXNlZCBvbiBwcml2YWN5IGxldmVsXG4gICAgICBsZXQgcHJpdmFjeUFxbFFyeTogc3RyaW5nO1xuXG4gICAgICBpZihncm91cElkICYmIHByaXZhY3kgPT09ICdncm91cCcpIHtcbiAgICAgICAgcHJpdmFjeUFxbFFyeSA9IGBGT1IgcCBJTiBwb3N0c1xuICAgICAgICAgIEZPUiB1c2VyIElOIHVzZXJzXG4gICAgICAgICAgRklMVEVSIHAucGFyZW50ID09IFwiJHtfa2V5fVwiICYmIHVzZXIuX2tleSA9PSBwLnVzZXJJZFxuICAgICAgICAgIExFVCByZWFjdGlvbnMgPSAoXG4gICAgICAgICAgICBGT1IgcG9zdCwgciBJTiBJTkJPVU5EIHAuX2lkIHJlYWN0aW9uc1xuICAgICAgICAgICAgQ09MTEVDVCByZWFjdGlvbk5hbWUgPSByLnZhbHVlIElOVE8gcmVhY3Rpb25JdGVtc1xuICAgICAgICAgICAgUkVUVVJOIHtuYW1lOiByZWFjdGlvbk5hbWUsIGNvdW50OiBMRU5HVEgocmVhY3Rpb25JdGVtc1sqXS5yLnZhbHVlKX1cbiAgICAgICAgICApXG4gICAgICAgICAgRk9SIGdyb3VwIElOIGdyb3Vwc1xuICAgICAgICAgIEZJTFRFUiBncm91cC5fa2V5ID09IHAuZ3JvdXBJZFxuICAgICAgICAgIEZPUiB1LCBlIElOIE9VVEJPVU5EIGdyb3VwLl9pZCBpc0dyb3VwZWRcbiAgICAgICAgICBGSUxURVIgdS5fa2V5ID09IFwiJHtzZXNzaW9uSWR9XCJcbiAgICAgICAgICBTT1JUIHAuYWRkZWRcbiAgICAgICAgICAke2xpbWl0LmFxbH1cbiAgICAgICAgICBSRVRVUk4gTUVSR0UocCwge3VzZXI6IHVzZXIsIHJlYWN0aW9uczogcmVhY3Rpb25zfSlgO1xuICAgICAgfSBlbHNlIGlmKHByaXZhY3kgPT09ICdwdWJsaWMnKSB7XG4gICAgICAgIHByaXZhY3lBcWxRcnkgPSBgRk9SIHAgSU4gcG9zdHNcbiAgICAgICAgICBGT1IgdXNlciBJTiB1c2Vyc1xuICAgICAgICAgIEZJTFRFUiBwLnBhcmVudCA9PSBcIiR7X2tleX1cIiAmJiB1c2VyLl9rZXkgPT0gcC51c2VySWRcbiAgICAgICAgICBMRVQgcmVhY3Rpb25zID0gKFxuICAgICAgICAgICAgRk9SIHBvc3QsIHIgSU4gSU5CT1VORCBwLl9pZCByZWFjdGlvbnNcbiAgICAgICAgICAgIENPTExFQ1QgcmVhY3Rpb25OYW1lID0gci52YWx1ZSBJTlRPIHJlYWN0aW9uSXRlbXNcbiAgICAgICAgICAgIFJFVFVSTiB7bmFtZTogcmVhY3Rpb25OYW1lLCBjb3VudDogTEVOR1RIKHJlYWN0aW9uSXRlbXNbKl0uci52YWx1ZSl9XG4gICAgICAgICAgKVxuICAgICAgICAgIFNPUlQgcC5hZGRlZFxuICAgICAgICAgICR7bGltaXQuYXFsfVxuICAgICAgICAgIFJFVFVSTiBNRVJHRShwLCB7dXNlcjogdXNlciwgcmVhY3Rpb25zOiByZWFjdGlvbnN9KWA7XG4gICAgICB9XG5cbiAgICAgIGlmKHByaXZhY3lBcWxRcnkpIHtcbiAgICAgICAgcmV0dXJuIGRiLnF1ZXJ5KHByaXZhY3lBcWxRcnkpXG4gICAgICAgICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRQb3N0ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGl0ZW06IFBvc3RUeXBlKTogUHJvbWlzZTxQb3N0VHlwZT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdhZGQnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHVzZXJJZDogc2Vzc2lvbklkfSA9IGNvbnRleHQ7XG5cbiAgY29uc3Qge1xuICAgIGNvbnRlbnQgPSAnJyxcbiAgICBncm91cElkID0gJycsXG4gICAgbG9jYXRpb24sXG4gICAgbGF0aXR1ZGUsXG4gICAgbG9uZ2l0dWRlLFxuICAgIG5hbWUgPSAnJyxcbiAgICBwYXJlbnRJZCA9IG51bGwsXG4gICAgcHJpdmFjeSA9ICdwdWJsaWMnLFxuICAgIHR5cGUgPSAnZGVmYXVsdCdcbiAgfTogUG9zdFR5cGUgPSBpdGVtO1xuXG4gIGNvbnN0IG5vdzogbnVtYmVyID0gRGF0ZS5ub3coKTtcblxuICBjb25zdCBpbnNlcnQ6IFBvc3RUeXBlID0ge1xuICAgIF9rZXk6IGNyZWF0ZUhhc2goYHBvc3QtJHtzZXNzaW9uSWR9YCksXG4gICAgYWRkZWQ6IG5vdyxcbiAgICBjb250ZW50OiBwYXJzZVN0cmluZyhjb250ZW50LCBNQVhfQ09OVEVOVF9MRU5HVEgpLFxuICAgIGdyb3VwSWQ6IGdyb3VwSWQgPyBwYXJzZUlkKGdyb3VwSWQpIDogdW5kZWZpbmVkLFxuICAgIGxhdGl0dWRlOiBsYXRpdHVkZSAhPT0gdW5kZWZpbmVkID8gcGFyc2VOdW0obGF0aXR1ZGUpIDogdW5kZWZpbmVkLFxuICAgIGxvY2F0aW9uOiBsb2NhdGlvbiA/IHBhcnNlU3RyaW5nKGxvY2F0aW9uLCAxNjApIDogdW5kZWZpbmVkLFxuICAgIGxvbmdpdHVkZTogbG9uZ2l0dWRlICE9PSB1bmRlZmluZWQgPyBwYXJzZU51bShsb25naXR1ZGUpIDogdW5kZWZpbmVkLFxuICAgIG1vZGlmaWVkOiBub3csXG4gICAgbmFtZTogcGFyc2VTdHJpbmcobmFtZSwgMTYwKSxcbiAgICBwYXJlbnRJZDogcGFyZW50SWQgPyBwYXJzZUlkKHBhcmVudElkKSA6IHVuZGVmaW5lZCxcbiAgICBwcml2YWN5OiBwcml2YWN5ID8gcGFyc2VWYXJDaGFyKHByaXZhY3ksIDE2KSA6IHVuZGVmaW5lZCxcbiAgICB0eXBlOiBwYXJzZUNoYXIodHlwZSwgMzIpLFxuICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gIH07XG5cbiAgY29uc3QgZGI6IERhdGFiYXNlID0gdXNlRGIoZGF0YWJhc2UpO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYElOU0VSVCAke2luc2VydH0gSU4gcG9zdHMgUkVUVVJOIE5FV2A7XG5cbiAgcmV0dXJuIGRiLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigocG9zdDogUG9zdFR5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3Qge19rZXk6IHBvc3RLZXl9ID0gcG9zdDtcblxuICAgICAgLy8gVXBkYXRlIGxpbmtlZCB0YWdzIHdpdGhpbiBwb3N0c1xuICAgICAgcmV0dXJuIGV4dHJhY3RUYWdzKGRiLCAncG9zdHMnLCBwb3N0S2V5LCBpbnNlcnQuY29udGVudClcbiAgICAgICAgLnRoZW4oKHRhZ0xpc3Q6IFRhZ1R5cGVbXSkgPT4ge1xuICAgICAgICAgIHBvc3QudGFncyA9IHRhZ0xpc3Q7XG4gICAgICAgICAgcmV0dXJuIHBvc3Q7XG4gICAgICAgIH0pO1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZVBvc3QgPSAoY29udGV4dDogQXBpQ29udGV4dCwgaXRlbTogUG9zdFR5cGUpOiBQcm9taXNlPFBvc3RUeXBlPiA9PiB7XG4gIC8vIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ3VwZGF0ZSc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcbiAgY29uc3Qgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICBjb25zdCB7XG4gICAgY29udGVudCxcbiAgICBncm91cElkLFxuICAgIG5hbWUsXG4gICAgcGFyZW50SWQsXG4gICAgcG9zdElkLFxuICAgIHByaXZhY3ksXG4gICAgdHlwZVxuICB9OiBQb3N0VHlwZSA9IGl0ZW07XG5cbiAgY29uc3QgdXBkYXRlOiBQb3N0VHlwZSA9IHtcbiAgICBjb250ZW50OiBjb250ZW50ID8gcGFyc2VTdHJpbmcoY29udGVudCwgTUFYX0NPTlRFTlRfTEVOR1RIKSA6IHVuZGVmaW5lZCxcbiAgICBtb2RpZmllZDogbm93LFxuICAgIG5hbWU6IG5hbWUgPyBwYXJzZVN0cmluZyhuYW1lLCAxNjApIDogdW5kZWZpbmVkLFxuICAgIHBhcmVudElkOiBwYXJlbnRJZCA/IHBhcnNlU3RyaW5nKHBhcmVudElkLCAxNjApIDogdW5kZWZpbmVkLFxuICAgIHByaXZhY3k6IHByaXZhY3kgPyBwYXJzZVZhckNoYXIocHJpdmFjeSwgMTYpIDogdW5kZWZpbmVkLFxuICAgIHR5cGU6IHR5cGUgIT09IHVuZGVmaW5lZCA/IHBhcnNlQ2hhcih0eXBlLCAxNikgOiB1bmRlZmluZWRcbiAgfTtcblxuICBsZXQgZm9ybWF0SWQ6IHN0cmluZyA9IHBhcnNlSWQocG9zdElkKTtcbiAgZm9ybWF0SWQgPSBmb3JtYXRJZCA9PT0gJycgPyBjcmVhdGVIYXNoKGBwb3N0LSR7c2Vzc2lvbklkfWApIDogZm9ybWF0SWQ7XG4gIGNvbnN0IGZvcm1hdEdyb3VwSWQ6IHN0cmluZyA9IHBhcnNlSWQoZ3JvdXBJZCk7XG4gIGNvbnN0IGluc2VydDogYW55ID0ge1xuICAgIC4uLnVwZGF0ZSxcbiAgICBfa2V5OiBmb3JtYXRJZCxcbiAgICBhZGRlZDogbm93LFxuICAgIGdyb3VwSWQ6IGZvcm1hdEdyb3VwSWQsXG4gICAgcHJpdmFjeSxcbiAgICB1c2VySWQ6IHNlc3Npb25JZFxuICB9O1xuICBjb25zdCBkYjogRGF0YWJhc2UgPSB1c2VEYihkYXRhYmFzZSk7XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBTRVJUIHtfa2V5OiAke2Zvcm1hdElkfSwgdXNlcklkOiAke3Nlc3Npb25JZH19XG4gICAgSU5TRVJUICR7aW5zZXJ0fVxuICAgIFVQREFURSAke3VwZGF0ZX1cbiAgICBJTiBwb3N0cyBSRVRVUk4gTkVXYDtcblxuICByZXR1cm4gZGIucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKCh1cGRhdGVkUG9zdDogUG9zdFR5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3Qge19rZXk6IHVwZGF0ZWRQb3N0S2V5fSA9IHVwZGF0ZWRQb3N0O1xuXG4gICAgICAvLyBVcGRhdGUgbGlua2VkIHRhZ3NcbiAgICAgIHJldHVybiBleHRyYWN0VGFncyhkYiwgJ3Bvc3RzJywgdXBkYXRlZFBvc3RLZXksIHVwZGF0ZS5jb250ZW50IHx8ICcnKVxuICAgICAgICAudGhlbigodGFnTGlzdCA9IFtdKSA9PiB7XG4gICAgICAgICAgdXBkYXRlZFBvc3QudGFncyA9IHRhZ0xpc3Q7XG5cbiAgICAgICAgICAvLyBVcGRhdGUgbGlua2VkIGZpbGVzXG4gICAgICAgICAgY29uc3QgZmlsZXM6IEZpbGVUeXBlW10gPSB1cGRhdGVkUG9zdC5maWxlcyB8fCBbXTtcblxuICAgICAgICAgIGlmKGZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUZpbGVzKGRiLCBmb3JtYXRJZCwgZmlsZXMpXG4gICAgICAgICAgICAgIC50aGVuKChmaWxlTGlzdCA9IFtdKSA9PiB7XG4gICAgICAgICAgICAgICAgdXBkYXRlZFBvc3QuZmlsZXMgPSBmaWxlTGlzdDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlZFBvc3Q7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZWRQb3N0LmZpbGVzID0gW107XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZWRQb3N0O1xuICAgICAgICB9KTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVQb3N0ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTxQb3N0VHlwZT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdkZWxldGUnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHVzZXJJZDogc2Vzc2lvbklkfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdEl0ZW1JZDogc3RyaW5nID0gcGFyc2VJZChpdGVtSWQpO1xuICBjb25zdCBkYjogRGF0YWJhc2UgPSB1c2VEYihkYXRhYmFzZSk7XG4gIGNvbnN0IGFxbFFyeSA9IGFxbGBGT1IgcCBJTiBwb3N0c1xuICAgICAgRklMVEVSIHAuX2tleSA9PSAke2Zvcm1hdEl0ZW1JZH0gJiYgcC51c2VySWQgPT0gJHtzZXNzaW9uSWR9XG4gICAgICBMSU1JVCAxXG4gICAgICBSRU1PVkUgcCBJTiBwb3N0c1xuICAgICAgUkVUVVJOIE9MRGA7XG5cbiAgcmV0dXJuIGRiLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigocG9zdDogUG9zdFR5cGUgPSB7fSkgPT4ge1xuICAgICAgaWYocG9zdCkge1xuICAgICAgICAvLyBSZW1vdmUgdGFnIGxpbmtzXG4gICAgICAgIGNvbnN0IGVkZ2VBcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiB0IElOIGlzVGFnZ2VkXG4gICAgICAgICAgICBGSUxURVIgdC5fdG8gPT0gJHtmb3JtYXRJdGVtSWR9XG4gICAgICAgICAgICBSRU1PVkUgdCBJTiBpc1RhZ2dlZGA7XG5cbiAgICAgICAgcmV0dXJuIGRiLnF1ZXJ5KGVkZ2VBcWxRcnkpXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIGF0dGFjaGVkIGZpbGVzXG4gICAgICAgICAgICBjb25zdCBmaWxlQXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgZiBJTiBoYXNGaWxlXG4gICAgICAgICAgICAgICAgRklMVEVSIGYuX3RvID09ICR7Zm9ybWF0SXRlbUlkfVxuICAgICAgICAgICAgICAgIFJFTU9WRSBmIElOIGhhc0ZpbGVgO1xuXG4gICAgICAgICAgICByZXR1cm4gZGIucXVlcnkoZmlsZUFxbFFyeSlcbiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gcG9zdClcbiAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge307XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY2xlYW5Qb3N0cyA9IChkYXRhYmFzZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgLy8gUmVtb3ZlIGFsbCBtZXNzYWdlcyB0aGF0IGFyZSBvdmVyIDYwIGRheXMgYW5kIG5vdCBzYXZlZFxuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBwIElOIHBvc3RzXG4gICAgICBGSUxURVIgcC5hZGRlZCA8IERBVEVfVElNRVNUQU1QKERBVEVfU1VCVFJBQ1QoREFURV9OT1coKSwgNjAsICdkYXknKSkgJiYgcC50eXBlID09IFwiZGVmYXVsdFwiXG4gICAgICBSRU1PVkUgcCBJTiBwb3N0c1xuICAgICAgUkVUVVJOIE9MRGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAudGhlbigocmVzdWx0czogUG9zdFR5cGVbXSA9IFtdKSA9PiByZXN1bHRzLmxlbmd0aClcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlUG9zdEVkZ2UgPSAoZGI6IERhdGFiYXNlLCBmaWxlOiBGaWxlVHlwZSwgcG9zdElkOiBzdHJpbmcpOiBQcm9taXNlPEZpbGVUeXBlPiA9PiB7XG4gIGNvbnN0IGVkZ2VDb2xsZWN0aW9uID0gZGIuZWRnZUNvbGxlY3Rpb24oJ2lzUG9zdGVkJyk7XG4gIGNvbnN0IHtmaWxlSWR9ID0gZmlsZTtcbiAgY29uc3QgZm9ybWF0RmlsZUlkOiBzdHJpbmcgPSBwYXJzZUlkKGZpbGVJZCk7XG4gIGNvbnN0IGVkZ2VJZDogc3RyaW5nID0gY3JlYXRlSGFzaChgZmlsZS0ke3Bvc3RJZH0tJHtmb3JtYXRGaWxlSWR9YCk7XG4gIGNvbnN0IGZvcm1hdFBvc3RJZDogc3RyaW5nID0gcGFyc2VJZChwb3N0SWQpO1xuICBjb25zdCBmaWxlVHlwZTogc3RyaW5nID0gcGFyc2VDaGFyKGZpbGUuZmlsZVR5cGUsIDE2KTtcblxuICBjb25zdCBlZGdlOiBhbnkgPSB7XG4gICAgX2tleTogZWRnZUlkLFxuICAgIGFkZGVkOiBEYXRlLm5vdygpLFxuICAgIHR5cGU6IGZpbGVUeXBlXG4gIH07XG5cbiAgcmV0dXJuIGVkZ2VDb2xsZWN0aW9uLnNhdmUoZWRnZSwgYHBvc3RzLyR7Zm9ybWF0UG9zdElkfWAsIGBmaWxlcy8ke2Zvcm1hdEZpbGVJZH1gKVxuICAgIC50aGVuKCgpID0+IGZpbGUpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcbiJdfQ==
|
|
635
|
+
|
|
636
|
+
exports.createPostEdge = createPostEdge;
|
|
637
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhL3Bvc3RzLnRzIl0sIm5hbWVzIjpbIk1BWF9DT05URU5UX0xFTkdUSCIsInBhcnNlUG9zdE9wdGlvbnMiLCJvcHRpb25zIiwiZnJvbSIsImxhdGl0dWRlIiwibG9uZ2l0dWRlIiwidG8iLCJ0eXBlIiwibGltaXQiLCJnZXRQb3N0T3B0aW9uYWwiLCJmaWVsZHMiLCJyZWR1Y2UiLCJzZWxlY3RzIiwiZmllbGQiLCJxdWVyaWVzIiwicHVzaCIsIm9iamVjdHMiLCJnZXRQb3N0IiwiY29udGV4dCIsIml0ZW1JZCIsImRhdGFiYXNlIiwic2Vzc2lvbklkIiwidXNlcklkIiwiZm9ybWF0SXRlbUlkIiwiZGIiLCJzZWxlY3RPYmplY3RzIiwic2VsZWN0UXVlcmllcyIsImFxbFFyeSIsImFxbCIsInF1ZXJ5IiwidGhlbiIsImN1cnNvciIsIm5leHQiLCJwb3N0IiwiX2tleSIsImdyb3VwSWQiLCJwcml2YWN5IiwicHJpdmFjeUFxbFFyeSIsImpvaW4iLCJmaWx0ZXJlZFBvc3QiLCJjYXRjaCIsImVycm9yIiwiZ2V0UG9zdExpc3QiLCJhbGwiLCJnZXRQb3N0TGlzdEJ5QXJlYSIsImZvcm1hdExhdGl0dWRlIiwiZm9ybWF0TG9uZ2l0dWRlIiwiZ2V0UG9zdExpc3RCeUdyb3VwIiwiZm9ybWF0R3JvdXBJZCIsImdyb3VwcyIsImxlbmd0aCIsInBvc3RBcWxRcnkiLCJnZXRQb3N0TGlzdEJ5TGF0ZXN0IiwiZ2V0UG9zdExpc3RCeVRhZ3MiLCJ0YWdOYW1lcyIsInNvcnRCeSIsInVuZGVmaW5lZCIsIlByb21pc2UiLCJtYXAiLCJ0YWdOYW1lIiwicmVzdWx0cyIsImdldFBvc3RMaXN0QnlVc2VyIiwiZm9ybWF0VXNlcklkIiwiZ2V0UG9zdENvbW1lbnRzIiwiYWRkUG9zdCIsIml0ZW0iLCJjb250ZW50IiwibG9jYXRpb24iLCJuYW1lIiwicGFyZW50SWQiLCJub3ciLCJEYXRlIiwiaW5zZXJ0IiwiYWRkZWQiLCJtb2RpZmllZCIsInBvc3RLZXkiLCJ0YWdMaXN0IiwidGFncyIsInVwZGF0ZVBvc3QiLCJwb3N0SWQiLCJ1cGRhdGUiLCJmb3JtYXRJZCIsInVwZGF0ZWRQb3N0IiwidXBkYXRlZFBvc3RLZXkiLCJmaWxlcyIsImZpbGVMaXN0IiwiZGVsZXRlUG9zdCIsImVkZ2VBcWxRcnkiLCJmaWxlQXFsUXJ5IiwiY2xlYW5Qb3N0cyIsImNyZWF0ZVBvc3RFZGdlIiwiZmlsZSIsImVkZ2VDb2xsZWN0aW9uIiwiZmlsZUlkIiwiZm9ybWF0RmlsZUlkIiwiZWRnZUlkIiwiZm9ybWF0UG9zdElkIiwiZmlsZVR5cGUiLCJlZGdlIiwic2F2ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUlBOztBQUNBOztBQUdBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQTtBQUNBLElBQU1BLGtCQUEwQixHQUFHLE1BQW5DOztBQUVPLElBQU1DLGdCQUFnQixHQUFHLFNBQW5CQSxnQkFBbUIsR0FBK0I7QUFBQSxNQUE5QkMsT0FBOEIsdUVBQVAsRUFBTztBQUFBLHNCQU96REEsT0FQeUQsQ0FFM0RDLElBRjJEO0FBQUEsTUFFM0RBLElBRjJELDhCQUVwRCxDQUZvRDtBQUFBLDBCQU96REQsT0FQeUQsQ0FHM0RFLFFBSDJEO0FBQUEsTUFHM0RBLFFBSDJELGtDQUdoRCxDQUhnRDtBQUFBLDJCQU96REYsT0FQeUQsQ0FJM0RHLFNBSjJEO0FBQUEsTUFJM0RBLFNBSjJELG1DQUkvQyxDQUorQztBQUFBLG9CQU96REgsT0FQeUQsQ0FLM0RJLEVBTDJEO0FBQUEsTUFLM0RBLEVBTDJELDRCQUt0RCxFQUxzRDtBQUFBLHNCQU96REosT0FQeUQsQ0FNM0RLLElBTjJEO0FBQUEsTUFNM0RBLElBTjJELDhCQU1wRCxTQU5vRDtBQVU3RCxTQUFPO0FBQ0xILElBQUFBLFFBQVEsRUFBRSxxQkFBU0EsUUFBVCxFQUFtQixF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QTdCO0FBQ0EsTUFBTUUsTUFBYyxHQUFHLHNDQUFtQmhCLE1BQW5CLGNBQTZCZSxZQUE3QixFQUF2QjtBQUNBLE1BQU1FLFlBQW9CLEdBQUcsb0JBQVFqQixNQUFSLENBQTdCO0FBQ0EsTUFBTWtCLFFBQWdCLEdBQUcsc0JBQVVOLElBQUksQ0FBQ00sUUFBZixFQUF5QixFQUF6QixDQUF6QjtBQUVBLE1BQU1DLElBQVMsR0FBRztBQUNoQmhFLElBQUFBLElBQUksRUFBRTZELE1BRFU7QUFFaEJ0QixJQUFBQSxLQUFLLEVBQUVGLElBQUksQ0FBQ0QsR0FBTCxFQUZTO0FBR2hCL0QsSUFBQUEsSUFBSSxFQUFFMEY7QUFIVSxHQUFsQjtBQU1BLFNBQU9MLGNBQWMsQ0FBQ08sSUFBZixDQUFvQkQsSUFBcEIsa0JBQW1DRixZQUFuQyxtQkFBNERGLFlBQTVELEdBQ0poRSxJQURJLENBQ0M7QUFBQSxXQUFNNkQsSUFBTjtBQUFBLEdBREQsRUFFSm5ELEtBRkksQ0FFRSxVQUFDQyxLQUFELEVBQWtCO0FBQ3ZCLFVBQU1BLEtBQU47QUFDRCxHQUpJLENBQVA7QUFLRCxDQW5CTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge2NyZWF0ZUhhc2gsIHBhcnNlQ2hhciwgcGFyc2VJZCwgcGFyc2VOdW0sIHBhcnNlU3RyaW5nLCBwYXJzZVZhckNoYXJ9IGZyb20gJ0BubGFicy91dGlscyc7XG5pbXBvcnQge2FxbCwgRGF0YWJhc2V9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2xpYi9janMvYXFsLXF1ZXJ5JztcbmltcG9ydCB7QXJyYXlDdXJzb3J9IGZyb20gJ2FyYW5nb2pzL2xpYi9janMvY3Vyc29yJztcbmltcG9ydCBmbGF0dGVuIGZyb20gJ2xvZGFzaC9mbGF0dGVuJztcbmltcG9ydCB1bmlxQnkgZnJvbSAnbG9kYXNoL3VuaXFCeSc7XG5cbmltcG9ydCB7QXBpQ29udGV4dCwgRmlsZVR5cGUsIEdyb3VwVHlwZSwgUG9zdE9wdGlvbnMsIFBvc3RUeXBlLCBUYWdUeXBlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2dldExpbWl0LCB1c2VEYn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHt1cGRhdGVGaWxlc30gZnJvbSAnLi9maWxlcyc7XG5pbXBvcnQge2V4dHJhY3RUYWdzfSBmcm9tICcuL3RhZ3MnO1xuXG4vLyBjb25zdCBldmVudENhdGVnb3J5OiBzdHJpbmcgPSAncG9zdHMnO1xuY29uc3QgTUFYX0NPTlRFTlRfTEVOR1RIOiBudW1iZXIgPSAxMDAwMDA7XG5cbmV4cG9ydCBjb25zdCBwYXJzZVBvc3RPcHRpb25zID0gKG9wdGlvbnM6IFBvc3RPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGZyb20gPSAwLFxuICAgIGxhdGl0dWRlID0gMCxcbiAgICBsb25naXR1ZGUgPSAwLFxuICAgIHRvID0gMzAsXG4gICAgdHlwZSA9ICdkZWZhdWx0J1xuICB9ID0gb3B0aW9ucztcblxuXG4gIHJldHVybiB7XG4gICAgbGF0aXR1ZGU6IHBhcnNlTnVtKGxhdGl0dWRlLCAzMiksXG4gICAgbGltaXQ6IGdldExpbWl0KGZyb20sIHRvKSxcbiAgICBsb25naXR1ZGU6IHBhcnNlTnVtKGxvbmdpdHVkZSwgMzIpLFxuICAgIHR5cGU6IHBhcnNlQ2hhcih0eXBlLCAzMilcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0T3B0aW9uYWwgPSAoZmllbGRzOiBzdHJpbmdbXSkgPT5cbiAgZmllbGRzLnJlZHVjZSgoc2VsZWN0czogYW55LCBmaWVsZDogc3RyaW5nKSA9PiB7XG4gICAgc3dpdGNoKGZpZWxkKSB7XG4gICAgICBjYXNlICdyZWFjdGlvbnMnOiB7XG4gICAgICAgIHNlbGVjdHMucXVlcmllcy5wdXNoKGBMRVQgcmVhY3Rpb25zID0gKFxuICAgICAgICAgIEZPUiBwb3N0LCByIElOIElOQk9VTkQgcC5faWQgcmVhY3Rpb25zXG4gICAgICAgICAgQ09MTEVDVCByZWFjdGlvbk5hbWUgPSByLnZhbHVlIElOVE8gcmVhY3Rpb25JdGVtc1xuICAgICAgICAgIFJFVFVSTiB7bmFtZTogcmVhY3Rpb25OYW1lLCBjb3VudDogTEVOR1RIKHJlYWN0aW9uSXRlbXNbKl0uci52YWx1ZSl9XG4gICAgICAgIClgKTtcbiAgICAgICAgc2VsZWN0cy5vYmplY3RzLnB1c2goJ3JlYWN0aW9uczpyZWFjdGlvbnMnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdzJzoge1xuICAgICAgICBzZWxlY3RzLnF1ZXJpZXMucHVzaChgTEVUIHRhZ3MgPSAoXG4gICAgICAgICAgRk9SIHQsIHBsIElOIElOQk9VTkQgcC5faWQgaXNUYWdnZWRcbiAgICAgICAgICBSRVRVUk4gdFxuICAgICAgICApYCk7XG4gICAgICAgIHNlbGVjdHMub2JqZWN0cy5wdXNoKCd0YWdzOnRhZ3MnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBjYXNlICd1c2VyJzoge1xuICAgICAgICBzZWxlY3RzLnF1ZXJpZXMucHVzaChgTEVUIHVzZXIgPSBGSVJTVChcbiAgICAgICAgICBGT1IgdSBJTiB1c2Vyc1xuICAgICAgICAgIEZJTFRFUiBwLnVzZXJJZCA9PSB1Ll9rZXlcbiAgICAgICAgICBMSU1JVCAxXG4gICAgICAgICAgUkVUVVJOIHVcbiAgICAgICAgKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgndXNlcjp1c2VyJyk7XG4gICAgICAgIHJldHVybiBzZWxlY3RzO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtvYmplY3RzOiBbXSwgcXVlcmllczogW119KTtcblxuZXhwb3J0IGNvbnN0IGdldFBvc3QgPSAoY29udGV4dDogQXBpQ29udGV4dCwgaXRlbUlkOiBzdHJpbmcpOiBQcm9taXNlPFBvc3RUeXBlPiA9PiB7XG4gIC8vIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldEl0ZW0nO1xuICBjb25zdCB7ZGF0YWJhc2UsIGZpZWxkcywgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SXRlbUlkOiBzdHJpbmcgPSBwYXJzZUlkKGl0ZW1JZCk7XG4gIGNvbnN0IGRiID0gdXNlRGIoZGF0YWJhc2UpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzKTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgcCBJTiBwb3N0c1xuICAgIEZJTFRFUiBwLl9rZXkgPT0gJHtmb3JtYXRJdGVtSWR9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBwYDtcblxuICByZXR1cm4gZGIucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChwb3N0OiBQb3N0VHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIF9rZXksXG4gICAgICAgIGdyb3VwSWQsXG4gICAgICAgIHByaXZhY3kgPSAnZGVmYXVsdCdcbiAgICAgIH06IFBvc3RUeXBlID0gcG9zdDtcblxuICAgICAgLy8gUXVlcnkgYmFzZWQgb24gcHJpdmFjeSBsZXZlbFxuICAgICAgbGV0IHByaXZhY3lBcWxRcnk6IHN0cmluZztcblxuICAgICAgaWYoZ3JvdXBJZCAmJiBwcml2YWN5ID09PSAnZ3JvdXAnKSB7XG4gICAgICAgIHByaXZhY3lBcWxRcnkgPSBgRk9SIHAgSU4gcG9zdHNcbiAgICAgICAgICBGSUxURVIgcC5fa2V5ID09IFwiJHtfa2V5fVwiXG4gICAgICAgICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgICAgICAgIEZPUiBncm91cCBJTiBncm91cHNcbiAgICAgICAgICBGSUxURVIgZ3JvdXAuX2tleSA9PSBwLmdyb3VwSWRcbiAgICAgICAgICBGT1IgdSwgZSBJTiBPVVRCT1VORCBncm91cC5faWQgaXNHcm91cGVkXG4gICAgICAgICAgRklMVEVSIHUuX2tleSA9PSAke3Nlc3Npb25JZH1cbiAgICAgICAgICBMSU1JVCAxXG4gICAgICAgICAgUkVUVVJOIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG4gICAgICB9IGVsc2UgaWYocHJpdmFjeSA9PT0gJ3B1YmxpYycpIHtcbiAgICAgICAgcHJpdmFjeUFxbFFyeSA9IGBGT1IgcCBJTiBwb3N0c1xuICAgICAgICAgIEZJTFRFUiBwLl9rZXkgPT0gXCIke19rZXl9XCJcbiAgICAgICAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgICAgICAgTElNSVQgMVxuICAgICAgICAgIFJFVFVSTiBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuICAgICAgfVxuXG4gICAgICBpZihwcml2YWN5QXFsUXJ5KSB7XG4gICAgICAgIHJldHVybiBkYi5xdWVyeShwcml2YWN5QXFsUXJ5KVxuICAgICAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAgIC50aGVuKChmaWx0ZXJlZFBvc3Q6IFBvc3RUeXBlID0ge30pID0+IGZpbHRlcmVkUG9zdClcbiAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7fTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0TGlzdCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBvcHRpb25zPzogUG9zdE9wdGlvbnMpOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbiAgLy8gY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0TGlzdEJ5QXBwJztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMpO1xuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgcCBJTiBwb3N0c1xuICAgIEZJTFRFUiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgcC5wYXJlbnQgPT0gbnVsbFxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIHAuYWRkZWRcbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0TGlzdEJ5QXJlYSA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgbGF0aXR1ZGU6IG51bWJlcixcbiAgbG9uZ2l0dWRlOiBudW1iZXIsXG4gIG9wdGlvbnM/OiBQb3N0T3B0aW9uc1xuKTogUHJvbWlzZTxQb3N0VHlwZVtdPiA9PiB7XG4gIC8vIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldExpc3RCeVVzZXInO1xuICBjb25zdCB7ZGF0YWJhc2UsIGZpZWxkc30gPSBjb250ZXh0O1xuICBjb25zdCB7bGltaXQsIHR5cGV9ID0gcGFyc2VQb3N0T3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3QgZm9ybWF0TGF0aXR1ZGU6IG51bWJlciA9IHBhcnNlTnVtKGxhdGl0dWRlKTtcbiAgY29uc3QgZm9ybWF0TG9uZ2l0dWRlOiBudW1iZXIgPSBwYXJzZU51bShsb25naXR1ZGUpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzKTtcbiAgc2VsZWN0UXVlcmllcy5wdXNoKGBMRVQgZGlzdGFuY2UgPSBESVNUQU5DRShcbiAgICAke2Zvcm1hdExhdGl0dWRlfSxcbiAgICAke2Zvcm1hdExvbmdpdHVkZX0sXG4gICAgTk9UX05VTEwocC5sYXRpdHVkZSwgMCksXG4gICAgTk9UX05VTEwocC5sb25naXR1ZGUsIDApKVxuICBgKTtcbiAgc2VsZWN0T2JqZWN0cy5wdXNoKCdkaXN0YW5jZTpkaXN0YW5jZScpO1xuXG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBwIElOIHBvc3RzXG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgIEZJTFRFUiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgcC5wYXJlbnRJZCA9PSBudWxsXG4gICAgJHtsaW1pdC5hcWx9XG4gICAgU09SVCBkaXN0YW5jZSwgcC5hZGRlZFxuICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFBvc3RMaXN0QnlHcm91cCA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgZ3JvdXBJZDogc3RyaW5nLFxuICBvcHRpb25zPzogUG9zdE9wdGlvbnNcbik6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0QnlHcm91cCc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCB1c2VySWQ6IHNlc3Npb25JZH0gPSBjb250ZXh0O1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzKTtcblxuICAvLyBHcm91cCBpZFxuICBjb25zdCBmb3JtYXRHcm91cElkOiBzdHJpbmcgPSBwYXJzZUlkKGdyb3VwSWQpO1xuICBjb25zdCBkYiA9IHVzZURiKGRhdGFiYXNlKTtcbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHUsIGcgSU4gSU5CT1VORCAke2Zvcm1hdEdyb3VwSWR9IGhhc0dyb3VwXG4gICAgICBGSUxURVIgdS5fa2V5ID09ICR7c2Vzc2lvbklkfVxuICAgICAgUkVUVVJOIGdgO1xuXG4gIHJldHVybiBkYi5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAudGhlbigoZ3JvdXBzOiBHcm91cFR5cGVbXSA9IFtdKSA9PiB7XG4gICAgICBpZihncm91cHMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHtsaW1pdCwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBwb3N0QXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHAgSU4gcG9zdHNcbiAgICAgICAgICBGSUxURVIgcC50eXBlID09IFwiJHt0eXBlfVwiICYmIHAuZ3JvdXBJZCA9PSBcIiR7Zm9ybWF0R3JvdXBJZH1cIiAmJiBwLnBhcmVudCA9PSBudWxsXG4gICAgICAgICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgICAgICAgICR7bGltaXQuYXFsfVxuICAgICAgICAgIFNPUlQgcC5hZGRlZFxuICAgICAgICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gICAgICAgIHJldHVybiBkYi5xdWVyeShwb3N0QXFsUXJ5KVxuICAgICAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW107XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UG9zdExpc3RCeUxhdGVzdCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBvcHRpb25zPzogUG9zdE9wdGlvbnMpOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbiAgLy8gY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0TGlzdEJ5TGF0ZXN0JztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMpO1xuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgcCBJTiBwb3N0c1xuICAgIEZJTFRFUiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgcC5wYXJlbnQgPT0gbnVsbFxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIHAuYWRkZWRcbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0TGlzdEJ5VGFncyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdGFnTmFtZXM6IHN0cmluZ1tdLFxuICBvcHRpb25zPzogUG9zdE9wdGlvbnNcbik6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0QnlUYWdzJztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge2xhdGl0dWRlLCBsb25naXR1ZGUsIGxpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMpO1xuICBjb25zdCBzb3J0Qnk6IHN0cmluZ1tdID0gW107XG5cbiAgaWYobGF0aXR1ZGUgIT09IHVuZGVmaW5lZCAmJiBsb25naXR1ZGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGZvcm1hdExhdGl0dWRlOiBudW1iZXIgPSBwYXJzZU51bShsYXRpdHVkZSk7XG4gICAgY29uc3QgZm9ybWF0TG9uZ2l0dWRlOiBudW1iZXIgPSBwYXJzZU51bShsb25naXR1ZGUpO1xuICAgIHNlbGVjdFF1ZXJpZXMucHVzaChgTEVUIGRpc3RhbmNlID0gRElTVEFOQ0UoXG4gICAgICAke2Zvcm1hdExhdGl0dWRlfSxcbiAgICAgICR7Zm9ybWF0TG9uZ2l0dWRlfSxcbiAgICAgIE5PVF9OVUxMKHAubGF0aXR1ZGUsIDApLFxuICAgICAgTk9UX05VTEwocC5sb25naXR1ZGUsIDApKVxuICAgIGApO1xuICAgIHNlbGVjdE9iamVjdHMucHVzaCgnZGlzdGFuY2U6ZGlzdGFuY2UnKTtcbiAgICBzb3J0QnkucHVzaCgnZGlzdGFuY2UnKTtcbiAgfVxuXG4gIHNvcnRCeS5wdXNoKCdwLmFkZGVkJyk7XG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgIHRhZ05hbWVzLm1hcCgodGFnTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgdGFyZ2V0VGFnIElOIHRhZ3NcbiAgICAgICAgRklMVEVSIHRhcmdldFRhZy5uYW1lID09IFwiJHt0YWdOYW1lfVwiXG4gICAgICAgIEZPUiBwLCBlIElOIE9VVEJPVU5EIHRhcmdldFRhZy5faWQgaXNUYWdnZWRcbiAgICAgICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgICAgICBGSUxURVIgcC50eXBlID0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgZS50eXBlID09ICdwb3N0cydcbiAgICAgICAgJHtsaW1pdC5hcWx9XG4gICAgICAgIFNPUlQgJHtzb3J0Qnkuam9pbignLCAnKX1cbiAgICAgICAgUkVUVVJOIERJU1RJTkNUIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgICAgICAuY2F0Y2goKCkgPT4gW10pO1xuICAgIH0pKVxuICAgIC50aGVuKChyZXN1bHRzKSA9PiB1bmlxQnkoZmxhdHRlbihyZXN1bHRzKSwgJ19rZXknKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UG9zdExpc3RCeVVzZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcklkOiBzdHJpbmcsIG9wdGlvbnM/OiBQb3N0T3B0aW9ucyk6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0QnlVc2VyJztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IGZvcm1hdFVzZXJJZDogc3RyaW5nID0gcGFyc2VJZCh1c2VySWQpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzKTtcbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHAgSU4gcG9zdHNcbiAgICBGSUxURVIgcC51c2VySWQgPT0gXCIke2Zvcm1hdFVzZXJJZH1cIiAmJiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgcC5wYXJlbnQgPT0gbnVsbFxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIHAuYWRkZWRcbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0Q29tbWVudHMgPSAoY29udGV4dDogQXBpQ29udGV4dCwgaXRlbUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBQb3N0T3B0aW9ucyk6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRDb21tZW50cyc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IGZvcm1hdEl0ZW1JZDogc3RyaW5nID0gcGFyc2VJZChpdGVtSWQpO1xuXG4gIC8vIEdldCB0aGUgcGFyZW50IHBvc3QgdG8gZ2V0IHJlc3RyaWN0aW9uc1xuICBjb25zdCBkYiA9IHVzZURiKGRhdGFiYXNlKTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgcCBJTiBwb3N0c1xuICAgIEZJTFRFUiBwLnR5cGUgPT0gJHt0eXBlfSAmJiBwLl9rZXkgPT0gJHtmb3JtYXRJdGVtSWR9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBwYDtcblxuICByZXR1cm4gZGIucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChwb3N0OiBQb3N0VHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIF9rZXksXG4gICAgICAgIGdyb3VwSWQsXG4gICAgICAgIHByaXZhY3kgPSAncHVibGljJ1xuICAgICAgfTogUG9zdFR5cGUgPSBwb3N0O1xuXG4gICAgICAvLyBRdWVyeSBiYXNlZCBvbiBwcml2YWN5IGxldmVsXG4gICAgICBsZXQgcHJpdmFjeUFxbFFyeTogc3RyaW5nO1xuXG4gICAgICBpZihncm91cElkICYmIHByaXZhY3kgPT09ICdncm91cCcpIHtcbiAgICAgICAgcHJpdmFjeUFxbFFyeSA9IGBGT1IgcCBJTiBwb3N0c1xuICAgICAgICAgIEZPUiB1c2VyIElOIHVzZXJzXG4gICAgICAgICAgRklMVEVSIHAucGFyZW50ID09IFwiJHtfa2V5fVwiICYmIHVzZXIuX2tleSA9PSBwLnVzZXJJZFxuICAgICAgICAgIExFVCByZWFjdGlvbnMgPSAoXG4gICAgICAgICAgICBGT1IgcG9zdCwgciBJTiBJTkJPVU5EIHAuX2lkIHJlYWN0aW9uc1xuICAgICAgICAgICAgQ09MTEVDVCByZWFjdGlvbk5hbWUgPSByLnZhbHVlIElOVE8gcmVhY3Rpb25JdGVtc1xuICAgICAgICAgICAgUkVUVVJOIHtuYW1lOiByZWFjdGlvbk5hbWUsIGNvdW50OiBMRU5HVEgocmVhY3Rpb25JdGVtc1sqXS5yLnZhbHVlKX1cbiAgICAgICAgICApXG4gICAgICAgICAgRk9SIGdyb3VwIElOIGdyb3Vwc1xuICAgICAgICAgIEZJTFRFUiBncm91cC5fa2V5ID09IHAuZ3JvdXBJZFxuICAgICAgICAgIEZPUiB1LCBlIElOIE9VVEJPVU5EIGdyb3VwLl9pZCBpc0dyb3VwZWRcbiAgICAgICAgICBGSUxURVIgdS5fa2V5ID09IFwiJHtzZXNzaW9uSWR9XCJcbiAgICAgICAgICBTT1JUIHAuYWRkZWRcbiAgICAgICAgICAke2xpbWl0LmFxbH1cbiAgICAgICAgICBSRVRVUk4gTUVSR0UocCwge3VzZXI6IHVzZXIsIHJlYWN0aW9uczogcmVhY3Rpb25zfSlgO1xuICAgICAgfSBlbHNlIGlmKHByaXZhY3kgPT09ICdwdWJsaWMnKSB7XG4gICAgICAgIHByaXZhY3lBcWxRcnkgPSBgRk9SIHAgSU4gcG9zdHNcbiAgICAgICAgICBGT1IgdXNlciBJTiB1c2Vyc1xuICAgICAgICAgIEZJTFRFUiBwLnBhcmVudCA9PSBcIiR7X2tleX1cIiAmJiB1c2VyLl9rZXkgPT0gcC51c2VySWRcbiAgICAgICAgICBMRVQgcmVhY3Rpb25zID0gKFxuICAgICAgICAgICAgRk9SIHBvc3QsIHIgSU4gSU5CT1VORCBwLl9pZCByZWFjdGlvbnNcbiAgICAgICAgICAgIENPTExFQ1QgcmVhY3Rpb25OYW1lID0gci52YWx1ZSBJTlRPIHJlYWN0aW9uSXRlbXNcbiAgICAgICAgICAgIFJFVFVSTiB7bmFtZTogcmVhY3Rpb25OYW1lLCBjb3VudDogTEVOR1RIKHJlYWN0aW9uSXRlbXNbKl0uci52YWx1ZSl9XG4gICAgICAgICAgKVxuICAgICAgICAgIFNPUlQgcC5hZGRlZFxuICAgICAgICAgICR7bGltaXQuYXFsfVxuICAgICAgICAgIFJFVFVSTiBNRVJHRShwLCB7dXNlcjogdXNlciwgcmVhY3Rpb25zOiByZWFjdGlvbnN9KWA7XG4gICAgICB9XG5cbiAgICAgIGlmKHByaXZhY3lBcWxRcnkpIHtcbiAgICAgICAgcmV0dXJuIGRiLnF1ZXJ5KHByaXZhY3lBcWxRcnkpXG4gICAgICAgICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRQb3N0ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGl0ZW06IFBvc3RUeXBlKTogUHJvbWlzZTxQb3N0VHlwZT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdhZGQnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHVzZXJJZDogc2Vzc2lvbklkfSA9IGNvbnRleHQ7XG5cbiAgY29uc3Qge1xuICAgIGNvbnRlbnQgPSAnJyxcbiAgICBncm91cElkID0gJycsXG4gICAgbG9jYXRpb24sXG4gICAgbGF0aXR1ZGUsXG4gICAgbG9uZ2l0dWRlLFxuICAgIG5hbWUgPSAnJyxcbiAgICBwYXJlbnRJZCA9IG51bGwsXG4gICAgcHJpdmFjeSA9ICdwdWJsaWMnLFxuICAgIHR5cGUgPSAnZGVmYXVsdCdcbiAgfTogUG9zdFR5cGUgPSBpdGVtO1xuXG4gIGNvbnN0IG5vdzogbnVtYmVyID0gRGF0ZS5ub3coKTtcblxuICBjb25zdCBpbnNlcnQ6IFBvc3RUeXBlID0ge1xuICAgIF9rZXk6IGNyZWF0ZUhhc2goYHBvc3QtJHtzZXNzaW9uSWR9YCksXG4gICAgYWRkZWQ6IG5vdyxcbiAgICBjb250ZW50OiBwYXJzZVN0cmluZyhjb250ZW50LCBNQVhfQ09OVEVOVF9MRU5HVEgpLFxuICAgIGdyb3VwSWQ6IGdyb3VwSWQgPyBwYXJzZUlkKGdyb3VwSWQpIDogdW5kZWZpbmVkLFxuICAgIGxhdGl0dWRlOiBsYXRpdHVkZSAhPT0gdW5kZWZpbmVkID8gcGFyc2VOdW0obGF0aXR1ZGUpIDogdW5kZWZpbmVkLFxuICAgIGxvY2F0aW9uOiBsb2NhdGlvbiA/IHBhcnNlU3RyaW5nKGxvY2F0aW9uLCAxNjApIDogdW5kZWZpbmVkLFxuICAgIGxvbmdpdHVkZTogbG9uZ2l0dWRlICE9PSB1bmRlZmluZWQgPyBwYXJzZU51bShsb25naXR1ZGUpIDogdW5kZWZpbmVkLFxuICAgIG1vZGlmaWVkOiBub3csXG4gICAgbmFtZTogcGFyc2VTdHJpbmcobmFtZSwgMTYwKSxcbiAgICBwYXJlbnRJZDogcGFyZW50SWQgPyBwYXJzZUlkKHBhcmVudElkKSA6IHVuZGVmaW5lZCxcbiAgICBwcml2YWN5OiBwcml2YWN5ID8gcGFyc2VWYXJDaGFyKHByaXZhY3ksIDE2KSA6IHVuZGVmaW5lZCxcbiAgICB0eXBlOiBwYXJzZUNoYXIodHlwZSwgMzIpLFxuICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gIH07XG5cbiAgY29uc3QgZGI6IERhdGFiYXNlID0gdXNlRGIoZGF0YWJhc2UpO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYElOU0VSVCAke2luc2VydH0gSU4gcG9zdHMgUkVUVVJOIE5FV2A7XG5cbiAgcmV0dXJuIGRiLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigocG9zdDogUG9zdFR5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3Qge19rZXk6IHBvc3RLZXl9ID0gcG9zdDtcblxuICAgICAgLy8gVXBkYXRlIGxpbmtlZCB0YWdzIHdpdGhpbiBwb3N0c1xuICAgICAgcmV0dXJuIGV4dHJhY3RUYWdzKGRiLCAncG9zdHMnLCBwb3N0S2V5LCBpbnNlcnQuY29udGVudClcbiAgICAgICAgLnRoZW4oKHRhZ0xpc3Q6IFRhZ1R5cGVbXSkgPT4ge1xuICAgICAgICAgIHBvc3QudGFncyA9IHRhZ0xpc3Q7XG4gICAgICAgICAgcmV0dXJuIHBvc3Q7XG4gICAgICAgIH0pO1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZVBvc3QgPSAoY29udGV4dDogQXBpQ29udGV4dCwgaXRlbTogUG9zdFR5cGUpOiBQcm9taXNlPFBvc3RUeXBlPiA9PiB7XG4gIC8vIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ3VwZGF0ZSc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcbiAgY29uc3Qgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICBjb25zdCB7XG4gICAgY29udGVudCxcbiAgICBncm91cElkLFxuICAgIG5hbWUsXG4gICAgcGFyZW50SWQsXG4gICAgcG9zdElkLFxuICAgIHByaXZhY3ksXG4gICAgdHlwZVxuICB9OiBQb3N0VHlwZSA9IGl0ZW07XG5cbiAgY29uc3QgdXBkYXRlOiBQb3N0VHlwZSA9IHtcbiAgICBjb250ZW50OiBjb250ZW50ID8gcGFyc2VTdHJpbmcoY29udGVudCwgTUFYX0NPTlRFTlRfTEVOR1RIKSA6IHVuZGVmaW5lZCxcbiAgICBtb2RpZmllZDogbm93LFxuICAgIG5hbWU6IG5hbWUgPyBwYXJzZVN0cmluZyhuYW1lLCAxNjApIDogdW5kZWZpbmVkLFxuICAgIHBhcmVudElkOiBwYXJlbnRJZCA/IHBhcnNlU3RyaW5nKHBhcmVudElkLCAxNjApIDogdW5kZWZpbmVkLFxuICAgIHByaXZhY3k6IHByaXZhY3kgPyBwYXJzZVZhckNoYXIocHJpdmFjeSwgMTYpIDogdW5kZWZpbmVkLFxuICAgIHR5cGU6IHR5cGUgIT09IHVuZGVmaW5lZCA/IHBhcnNlQ2hhcih0eXBlLCAxNikgOiB1bmRlZmluZWRcbiAgfTtcblxuICBsZXQgZm9ybWF0SWQ6IHN0cmluZyA9IHBhcnNlSWQocG9zdElkKTtcbiAgZm9ybWF0SWQgPSBmb3JtYXRJZCA9PT0gJycgPyBjcmVhdGVIYXNoKGBwb3N0LSR7c2Vzc2lvbklkfWApIDogZm9ybWF0SWQ7XG4gIGNvbnN0IGZvcm1hdEdyb3VwSWQ6IHN0cmluZyA9IHBhcnNlSWQoZ3JvdXBJZCk7XG4gIGNvbnN0IGluc2VydDogYW55ID0ge1xuICAgIC4uLnVwZGF0ZSxcbiAgICBfa2V5OiBmb3JtYXRJZCxcbiAgICBhZGRlZDogbm93LFxuICAgIGdyb3VwSWQ6IGZvcm1hdEdyb3VwSWQsXG4gICAgcHJpdmFjeSxcbiAgICB1c2VySWQ6IHNlc3Npb25JZFxuICB9O1xuICBjb25zdCBkYjogRGF0YWJhc2UgPSB1c2VEYihkYXRhYmFzZSk7XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBTRVJUIHtfa2V5OiAke2Zvcm1hdElkfSwgdXNlcklkOiAke3Nlc3Npb25JZH19XG4gICAgSU5TRVJUICR7aW5zZXJ0fVxuICAgIFVQREFURSAke3VwZGF0ZX1cbiAgICBJTiBwb3N0cyBSRVRVUk4gTkVXYDtcblxuICByZXR1cm4gZGIucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKCh1cGRhdGVkUG9zdDogUG9zdFR5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3Qge19rZXk6IHVwZGF0ZWRQb3N0S2V5fSA9IHVwZGF0ZWRQb3N0O1xuXG4gICAgICAvLyBVcGRhdGUgbGlua2VkIHRhZ3NcbiAgICAgIHJldHVybiBleHRyYWN0VGFncyhkYiwgJ3Bvc3RzJywgdXBkYXRlZFBvc3RLZXksIHVwZGF0ZS5jb250ZW50IHx8ICcnKVxuICAgICAgICAudGhlbigodGFnTGlzdCA9IFtdKSA9PiB7XG4gICAgICAgICAgdXBkYXRlZFBvc3QudGFncyA9IHRhZ0xpc3Q7XG5cbiAgICAgICAgICAvLyBVcGRhdGUgbGlua2VkIGZpbGVzXG4gICAgICAgICAgY29uc3QgZmlsZXM6IEZpbGVUeXBlW10gPSB1cGRhdGVkUG9zdC5maWxlcyB8fCBbXTtcblxuICAgICAgICAgIGlmKGZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUZpbGVzKGRiLCBmb3JtYXRJZCwgZmlsZXMpXG4gICAgICAgICAgICAgIC50aGVuKChmaWxlTGlzdCA9IFtdKSA9PiB7XG4gICAgICAgICAgICAgICAgdXBkYXRlZFBvc3QuZmlsZXMgPSBmaWxlTGlzdDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlZFBvc3Q7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZWRQb3N0LmZpbGVzID0gW107XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZWRQb3N0O1xuICAgICAgICB9KTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVQb3N0ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTxQb3N0VHlwZT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdkZWxldGUnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHVzZXJJZDogc2Vzc2lvbklkfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdEl0ZW1JZDogc3RyaW5nID0gcGFyc2VJZChpdGVtSWQpO1xuICBjb25zdCBkYjogRGF0YWJhc2UgPSB1c2VEYihkYXRhYmFzZSk7XG4gIGNvbnN0IGFxbFFyeSA9IGFxbGBGT1IgcCBJTiBwb3N0c1xuICAgICAgRklMVEVSIHAuX2tleSA9PSAke2Zvcm1hdEl0ZW1JZH0gJiYgcC51c2VySWQgPT0gJHtzZXNzaW9uSWR9XG4gICAgICBMSU1JVCAxXG4gICAgICBSRU1PVkUgcCBJTiBwb3N0c1xuICAgICAgUkVUVVJOIE9MRGA7XG5cbiAgcmV0dXJuIGRiLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigocG9zdDogUG9zdFR5cGUgPSB7fSkgPT4ge1xuICAgICAgaWYocG9zdCkge1xuICAgICAgICAvLyBSZW1vdmUgdGFnIGxpbmtzXG4gICAgICAgIGNvbnN0IGVkZ2VBcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiB0IElOIGlzVGFnZ2VkXG4gICAgICAgICAgICBGSUxURVIgdC5fdG8gPT0gJHtmb3JtYXRJdGVtSWR9XG4gICAgICAgICAgICBSRU1PVkUgdCBJTiBpc1RhZ2dlZGA7XG5cbiAgICAgICAgcmV0dXJuIGRiLnF1ZXJ5KGVkZ2VBcWxRcnkpXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIGF0dGFjaGVkIGZpbGVzXG4gICAgICAgICAgICBjb25zdCBmaWxlQXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgZiBJTiBoYXNGaWxlXG4gICAgICAgICAgICAgICAgRklMVEVSIGYuX3RvID09ICR7Zm9ybWF0SXRlbUlkfVxuICAgICAgICAgICAgICAgIFJFTU9WRSBmIElOIGhhc0ZpbGVgO1xuXG4gICAgICAgICAgICByZXR1cm4gZGIucXVlcnkoZmlsZUFxbFFyeSlcbiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gcG9zdClcbiAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge307XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY2xlYW5Qb3N0cyA9IChkYXRhYmFzZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgLy8gUmVtb3ZlIGFsbCBtZXNzYWdlcyB0aGF0IGFyZSBvdmVyIDYwIGRheXMgYW5kIG5vdCBzYXZlZFxuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBwIElOIHBvc3RzXG4gICAgICBGSUxURVIgcC5hZGRlZCA8IERBVEVfVElNRVNUQU1QKERBVEVfU1VCVFJBQ1QoREFURV9OT1coKSwgNjAsICdkYXknKSkgJiYgcC50eXBlID09IFwiZGVmYXVsdFwiXG4gICAgICBSRU1PVkUgcCBJTiBwb3N0c1xuICAgICAgUkVUVVJOIE9MRGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAudGhlbigocmVzdWx0czogUG9zdFR5cGVbXSA9IFtdKSA9PiByZXN1bHRzLmxlbmd0aClcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlUG9zdEVkZ2UgPSAoZGI6IERhdGFiYXNlLCBmaWxlOiBGaWxlVHlwZSwgcG9zdElkOiBzdHJpbmcpOiBQcm9taXNlPEZpbGVUeXBlPiA9PiB7XG4gIGNvbnN0IGVkZ2VDb2xsZWN0aW9uID0gZGIuZWRnZUNvbGxlY3Rpb24oJ2lzUG9zdGVkJyk7XG4gIGNvbnN0IHtmaWxlSWR9ID0gZmlsZTtcbiAgY29uc3QgZm9ybWF0RmlsZUlkOiBzdHJpbmcgPSBwYXJzZUlkKGZpbGVJZCk7XG4gIGNvbnN0IGVkZ2VJZDogc3RyaW5nID0gY3JlYXRlSGFzaChgZmlsZS0ke3Bvc3RJZH0tJHtmb3JtYXRGaWxlSWR9YCk7XG4gIGNvbnN0IGZvcm1hdFBvc3RJZDogc3RyaW5nID0gcGFyc2VJZChwb3N0SWQpO1xuICBjb25zdCBmaWxlVHlwZTogc3RyaW5nID0gcGFyc2VDaGFyKGZpbGUuZmlsZVR5cGUsIDE2KTtcblxuICBjb25zdCBlZGdlOiBhbnkgPSB7XG4gICAgX2tleTogZWRnZUlkLFxuICAgIGFkZGVkOiBEYXRlLm5vdygpLFxuICAgIHR5cGU6IGZpbGVUeXBlXG4gIH07XG5cbiAgcmV0dXJuIGVkZ2VDb2xsZWN0aW9uLnNhdmUoZWRnZSwgYHBvc3RzLyR7Zm9ybWF0UG9zdElkfWAsIGBmaWxlcy8ke2Zvcm1hdEZpbGVJZH1gKVxuICAgIC50aGVuKCgpID0+IGZpbGUpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcbiJdfQ==
|