@sockethub/activity-streams 4.4.0-alpha.4 → 4.4.0-alpha.5

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.
@@ -0,0 +1,462 @@
1
+ var __create = Object.create;
2
+ var __getProtoOf = Object.getPrototypeOf;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __toESM = (mod, isNodeMode, target) => {
7
+ target = mod != null ? __create(__getProtoOf(mod)) : {};
8
+ const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
9
+ for (let key of __getOwnPropNames(mod))
10
+ if (!__hasOwnProp.call(to, key))
11
+ __defProp(to, key, {
12
+ get: () => mod[key],
13
+ enumerable: true
14
+ });
15
+ return to;
16
+ };
17
+ var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
18
+
19
+ // ../../node_modules/eventemitter3/index.js
20
+ var require_eventemitter3 = __commonJS((exports, module) => {
21
+ var has = Object.prototype.hasOwnProperty;
22
+ var prefix = "~";
23
+ function Events() {}
24
+ if (Object.create) {
25
+ Events.prototype = Object.create(null);
26
+ if (!new Events().__proto__)
27
+ prefix = false;
28
+ }
29
+ function EE(fn, context, once) {
30
+ this.fn = fn;
31
+ this.context = context;
32
+ this.once = once || false;
33
+ }
34
+ function addListener(emitter, event, fn, context, once) {
35
+ if (typeof fn !== "function") {
36
+ throw new TypeError("The listener must be a function");
37
+ }
38
+ var listener = new EE(fn, context || emitter, once), evt = prefix ? prefix + event : event;
39
+ if (!emitter._events[evt])
40
+ emitter._events[evt] = listener, emitter._eventsCount++;
41
+ else if (!emitter._events[evt].fn)
42
+ emitter._events[evt].push(listener);
43
+ else
44
+ emitter._events[evt] = [emitter._events[evt], listener];
45
+ return emitter;
46
+ }
47
+ function clearEvent(emitter, evt) {
48
+ if (--emitter._eventsCount === 0)
49
+ emitter._events = new Events;
50
+ else
51
+ delete emitter._events[evt];
52
+ }
53
+ function EventEmitter() {
54
+ this._events = new Events;
55
+ this._eventsCount = 0;
56
+ }
57
+ EventEmitter.prototype.eventNames = function eventNames() {
58
+ var names = [], events, name;
59
+ if (this._eventsCount === 0)
60
+ return names;
61
+ for (name in events = this._events) {
62
+ if (has.call(events, name))
63
+ names.push(prefix ? name.slice(1) : name);
64
+ }
65
+ if (Object.getOwnPropertySymbols) {
66
+ return names.concat(Object.getOwnPropertySymbols(events));
67
+ }
68
+ return names;
69
+ };
70
+ EventEmitter.prototype.listeners = function listeners(event) {
71
+ var evt = prefix ? prefix + event : event, handlers = this._events[evt];
72
+ if (!handlers)
73
+ return [];
74
+ if (handlers.fn)
75
+ return [handlers.fn];
76
+ for (var i = 0, l = handlers.length, ee = new Array(l);i < l; i++) {
77
+ ee[i] = handlers[i].fn;
78
+ }
79
+ return ee;
80
+ };
81
+ EventEmitter.prototype.listenerCount = function listenerCount(event) {
82
+ var evt = prefix ? prefix + event : event, listeners = this._events[evt];
83
+ if (!listeners)
84
+ return 0;
85
+ if (listeners.fn)
86
+ return 1;
87
+ return listeners.length;
88
+ };
89
+ EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
90
+ var evt = prefix ? prefix + event : event;
91
+ if (!this._events[evt])
92
+ return false;
93
+ var listeners = this._events[evt], len = arguments.length, args, i;
94
+ if (listeners.fn) {
95
+ if (listeners.once)
96
+ this.removeListener(event, listeners.fn, undefined, true);
97
+ switch (len) {
98
+ case 1:
99
+ return listeners.fn.call(listeners.context), true;
100
+ case 2:
101
+ return listeners.fn.call(listeners.context, a1), true;
102
+ case 3:
103
+ return listeners.fn.call(listeners.context, a1, a2), true;
104
+ case 4:
105
+ return listeners.fn.call(listeners.context, a1, a2, a3), true;
106
+ case 5:
107
+ return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
108
+ case 6:
109
+ return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
110
+ }
111
+ for (i = 1, args = new Array(len - 1);i < len; i++) {
112
+ args[i - 1] = arguments[i];
113
+ }
114
+ listeners.fn.apply(listeners.context, args);
115
+ } else {
116
+ var length = listeners.length, j;
117
+ for (i = 0;i < length; i++) {
118
+ if (listeners[i].once)
119
+ this.removeListener(event, listeners[i].fn, undefined, true);
120
+ switch (len) {
121
+ case 1:
122
+ listeners[i].fn.call(listeners[i].context);
123
+ break;
124
+ case 2:
125
+ listeners[i].fn.call(listeners[i].context, a1);
126
+ break;
127
+ case 3:
128
+ listeners[i].fn.call(listeners[i].context, a1, a2);
129
+ break;
130
+ case 4:
131
+ listeners[i].fn.call(listeners[i].context, a1, a2, a3);
132
+ break;
133
+ default:
134
+ if (!args)
135
+ for (j = 1, args = new Array(len - 1);j < len; j++) {
136
+ args[j - 1] = arguments[j];
137
+ }
138
+ listeners[i].fn.apply(listeners[i].context, args);
139
+ }
140
+ }
141
+ }
142
+ return true;
143
+ };
144
+ EventEmitter.prototype.on = function on(event, fn, context) {
145
+ return addListener(this, event, fn, context, false);
146
+ };
147
+ EventEmitter.prototype.once = function once(event, fn, context) {
148
+ return addListener(this, event, fn, context, true);
149
+ };
150
+ EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {
151
+ var evt = prefix ? prefix + event : event;
152
+ if (!this._events[evt])
153
+ return this;
154
+ if (!fn) {
155
+ clearEvent(this, evt);
156
+ return this;
157
+ }
158
+ var listeners = this._events[evt];
159
+ if (listeners.fn) {
160
+ if (listeners.fn === fn && (!once || listeners.once) && (!context || listeners.context === context)) {
161
+ clearEvent(this, evt);
162
+ }
163
+ } else {
164
+ for (var i = 0, events = [], length = listeners.length;i < length; i++) {
165
+ if (listeners[i].fn !== fn || once && !listeners[i].once || context && listeners[i].context !== context) {
166
+ events.push(listeners[i]);
167
+ }
168
+ }
169
+ if (events.length)
170
+ this._events[evt] = events.length === 1 ? events[0] : events;
171
+ else
172
+ clearEvent(this, evt);
173
+ }
174
+ return this;
175
+ };
176
+ EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {
177
+ var evt;
178
+ if (event) {
179
+ evt = prefix ? prefix + event : event;
180
+ if (this._events[evt])
181
+ clearEvent(this, evt);
182
+ } else {
183
+ this._events = new Events;
184
+ this._eventsCount = 0;
185
+ }
186
+ return this;
187
+ };
188
+ EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
189
+ EventEmitter.prototype.addListener = EventEmitter.prototype.on;
190
+ EventEmitter.prefixed = prefix;
191
+ EventEmitter.EventEmitter = EventEmitter;
192
+ if (typeof module !== "undefined") {
193
+ module.exports = EventEmitter;
194
+ }
195
+ });
196
+
197
+ // ../../node_modules/eventemitter3/index.mjs
198
+ var import__ = __toESM(require_eventemitter3(), 1);
199
+ var eventemitter3_default = import__.default;
200
+
201
+ // src/activity-streams.ts
202
+ /*!
203
+ * activity-streams
204
+ * https://github.com/silverbucket/activity-streams
205
+ *
206
+ * Developed and Maintained by:
207
+ * Nick Jennings <nick@silverbucket.net>
208
+ *
209
+ * activity-streams is released under the MIT (see LICENSE).
210
+ *
211
+ * You don't have to do anything special to choose one license or the other
212
+ * and you don't have to notify anyone which license you are using.
213
+ * Please see the corresponding license file for details of these licenses.
214
+ * You are free to use, modify and distribute this software, but all copyright
215
+ * information must remain.
216
+ *
217
+ */
218
+ var ee = new eventemitter3_default;
219
+ var baseProps = {
220
+ stream: [
221
+ "id",
222
+ "type",
223
+ "actor",
224
+ "target",
225
+ "object",
226
+ "context",
227
+ "context",
228
+ "published",
229
+ "error"
230
+ ],
231
+ object: [
232
+ "id",
233
+ "type",
234
+ "context",
235
+ "alias",
236
+ "attachedTo",
237
+ "attachment",
238
+ "attributedTo",
239
+ "attributedWith",
240
+ "condition",
241
+ "content",
242
+ "contentMap",
243
+ "context",
244
+ "contextOf",
245
+ "name",
246
+ "endTime",
247
+ "generator",
248
+ "generatorOf",
249
+ "group",
250
+ "icon",
251
+ "image",
252
+ "inReplyTo",
253
+ "members",
254
+ "memberOf",
255
+ "message",
256
+ "location",
257
+ "locationOf",
258
+ "objectOf",
259
+ "originOf",
260
+ "presence",
261
+ "preview",
262
+ "previewOf",
263
+ "provider",
264
+ "providerOf",
265
+ "published",
266
+ "rating",
267
+ "relationship",
268
+ "resultOf",
269
+ "replies",
270
+ "role",
271
+ "scope",
272
+ "scopeOf",
273
+ "startTime",
274
+ "status",
275
+ "summary",
276
+ "topic",
277
+ "tag",
278
+ "tagOf",
279
+ "targetOf",
280
+ "title",
281
+ "titleMap",
282
+ "updated",
283
+ "url",
284
+ "xmpp:stanza-id"
285
+ ]
286
+ };
287
+ var rename = {
288
+ "@id": "id",
289
+ "@type": "type",
290
+ verb: "type",
291
+ displayName: "name",
292
+ objectType: "type",
293
+ platform: "context"
294
+ };
295
+ var expand = {
296
+ actor: {
297
+ primary: "id",
298
+ props: baseProps
299
+ },
300
+ target: {
301
+ primary: "id",
302
+ props: baseProps
303
+ },
304
+ object: {
305
+ primary: "content",
306
+ props: baseProps
307
+ }
308
+ };
309
+ var objs = new Map;
310
+ var customProps = {};
311
+ var failOnUnknownObjectProperties = false;
312
+ var warnOnUnknownObjectProperties = true;
313
+ var specialObjs = [];
314
+ function matchesCustomProp(type, key) {
315
+ if (customProps[type] instanceof Object) {
316
+ const obj = customProps[type];
317
+ if (obj.includes(key)) {
318
+ return true;
319
+ }
320
+ }
321
+ return false;
322
+ }
323
+ function renameProp(obj, key) {
324
+ obj[rename[key]] = obj[key];
325
+ delete obj[key];
326
+ return obj;
327
+ }
328
+ function validateObject(type, incomingObj, requireId = false) {
329
+ if (incomingObj === null) {
330
+ throw new Error(`ActivityStreams validation failed: the "${type}" property is null. Example: { id: "user@example.com", type: "person" }`);
331
+ }
332
+ if (incomingObj === undefined) {
333
+ throw new Error(`ActivityStreams validation failed: the "${type}" property is undefined. Example: { id: "user@example.com", type: "person" }`);
334
+ }
335
+ if (typeof incomingObj === "string") {
336
+ throw new Error(`ActivityStreams validation failed: the "${type}" property received string "${incomingObj}" but expected an object. Use: { id: "${incomingObj}", type: "person" }`);
337
+ }
338
+ if (typeof incomingObj !== "object" || Array.isArray(incomingObj)) {
339
+ const receivedType = Array.isArray(incomingObj) ? "array" : typeof incomingObj;
340
+ const receivedValue = String(incomingObj);
341
+ throw new Error(`ActivityStreams validation failed: the "${type}" property must be an object, received ${receivedType} (${receivedValue}). Example: { id: "user@example.com", type: "person" }`);
342
+ }
343
+ const obj = incomingObj;
344
+ if (requireId && !obj.id) {
345
+ throw new Error(`ActivityStreams validation failed: the "${type}" property requires an 'id' property. Example: { id: "user@example.com", type: "person" }`);
346
+ }
347
+ const unknownKeys = Object.keys(incomingObj).filter((key) => {
348
+ return !baseProps[type].includes(key);
349
+ });
350
+ for (const key of unknownKeys) {
351
+ let ao = incomingObj;
352
+ if (rename[key]) {
353
+ ao = renameProp(ao, key);
354
+ continue;
355
+ }
356
+ if (matchesCustomProp(ao.type, key)) {
357
+ continue;
358
+ }
359
+ if (!specialObjs.includes(ao.type)) {
360
+ console.log(ao);
361
+ const receivedValue = typeof ao[key] === "string" ? `"${ao[key]}"` : String(ao[key]);
362
+ const err = `ActivityStreams validation failed: property "${key}" with value ${receivedValue} is not allowed on the "${type}" object of type "${ao.type}".`;
363
+ if (failOnUnknownObjectProperties) {
364
+ throw new Error(err);
365
+ }
366
+ if (warnOnUnknownObjectProperties) {
367
+ console.warn(err);
368
+ }
369
+ }
370
+ }
371
+ }
372
+ function ensureProps(obj) {
373
+ return obj;
374
+ }
375
+ function expandStream(meta) {
376
+ const stream = {};
377
+ for (const key of Object.keys(meta)) {
378
+ if (typeof meta[key] === "string") {
379
+ stream[key] = objs.get(meta[key]) || meta[key];
380
+ } else if (Array.isArray(meta[key])) {
381
+ stream[key] = [];
382
+ for (const entry of meta[key]) {
383
+ if (typeof entry === "string") {
384
+ stream[key].push(objs.get(entry) || entry);
385
+ }
386
+ }
387
+ } else {
388
+ stream[key] = meta[key];
389
+ }
390
+ }
391
+ for (const key of Object.keys(expand)) {
392
+ if (typeof stream[key] === "string") {
393
+ const idx = expand[key].primary;
394
+ const obj = {};
395
+ obj[idx] = stream[key];
396
+ stream[key] = obj;
397
+ }
398
+ }
399
+ return stream;
400
+ }
401
+ function Stream(meta) {
402
+ validateObject("stream", meta);
403
+ if (typeof meta.object === "object") {
404
+ validateObject("object", meta.object);
405
+ }
406
+ const stream = expandStream(meta);
407
+ ee.emit("activity-stream", stream);
408
+ return stream;
409
+ }
410
+ var _Object = {
411
+ create: (obj) => {
412
+ validateObject("object", obj, true);
413
+ const ao = ensureProps(obj);
414
+ objs.set(ao.id, ao);
415
+ ee.emit("activity-object-create", ao);
416
+ return ao;
417
+ },
418
+ delete: (id) => {
419
+ const result = objs.delete(id);
420
+ if (result) {
421
+ ee.emit("activity-object-delete", id);
422
+ }
423
+ return result;
424
+ },
425
+ get: (id, expand2) => {
426
+ let obj = objs.get(id);
427
+ if (!obj) {
428
+ if (!expand2) {
429
+ return id;
430
+ }
431
+ obj = { id };
432
+ }
433
+ return ensureProps(obj);
434
+ },
435
+ list: () => objs.keys()
436
+ };
437
+ function ASFactory(opts = {}) {
438
+ specialObjs = opts?.specialObjs || [];
439
+ failOnUnknownObjectProperties = typeof opts.failOnUnknownObjectProperties === "boolean" ? opts.failOnUnknownObjectProperties : failOnUnknownObjectProperties;
440
+ warnOnUnknownObjectProperties = typeof opts.warnOnUnknownObjectProperties === "boolean" ? opts.warnOnUnknownObjectProperties : warnOnUnknownObjectProperties;
441
+ for (const propName of Object.keys(opts.customProps || {})) {
442
+ if (typeof opts.customProps[propName] === "object") {
443
+ customProps[propName] = opts.customProps[propName];
444
+ }
445
+ }
446
+ return {
447
+ Stream,
448
+ Object: _Object,
449
+ on: (event, func) => ee.on(event, func),
450
+ once: (event, func) => ee.once(event, func),
451
+ off: (event, funcName) => ee.off(event, funcName)
452
+ };
453
+ }
454
+ ((global) => {
455
+ global.ASFactor = ASFactory;
456
+ })(typeof window === "object" ? window : {});
457
+ export {
458
+ ASFactory
459
+ };
460
+
461
+ //# debugId=BDF4FA2886BECFB864756E2164756E21
462
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2V2ZW50ZW1pdHRlcjMvaW5kZXguanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2V2ZW50ZW1pdHRlcjMvaW5kZXgubWpzIiwgIi4uL3NyYy9hY3Rpdml0eS1zdHJlYW1zLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcbiAgLCBwcmVmaXggPSAnfic7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgdG8gY3JlYXRlIGEgc3RvcmFnZSBmb3Igb3VyIGBFRWAgb2JqZWN0cy5cbiAqIEFuIGBFdmVudHNgIGluc3RhbmNlIGlzIGEgcGxhaW4gb2JqZWN0IHdob3NlIHByb3BlcnRpZXMgYXJlIGV2ZW50IG5hbWVzLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gRXZlbnRzKCkge31cblxuLy9cbi8vIFdlIHRyeSB0byBub3QgaW5oZXJpdCBmcm9tIGBPYmplY3QucHJvdG90eXBlYC4gSW4gc29tZSBlbmdpbmVzIGNyZWF0aW5nIGFuXG4vLyBpbnN0YW5jZSBpbiB0aGlzIHdheSBpcyBmYXN0ZXIgdGhhbiBjYWxsaW5nIGBPYmplY3QuY3JlYXRlKG51bGwpYCBkaXJlY3RseS5cbi8vIElmIGBPYmplY3QuY3JlYXRlKG51bGwpYCBpcyBub3Qgc3VwcG9ydGVkIHdlIHByZWZpeCB0aGUgZXZlbnQgbmFtZXMgd2l0aCBhXG4vLyBjaGFyYWN0ZXIgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWx0LWluIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSBub3Rcbi8vIG92ZXJyaWRkZW4gb3IgdXNlZCBhcyBhbiBhdHRhY2sgdmVjdG9yLlxuLy9cbmlmIChPYmplY3QuY3JlYXRlKSB7XG4gIEV2ZW50cy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gIC8vXG4gIC8vIFRoaXMgaGFjayBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgYF9fcHJvdG9fX2AgcHJvcGVydHkgaXMgc3RpbGwgaW5oZXJpdGVkIGluXG4gIC8vIHNvbWUgb2xkIGJyb3dzZXJzIGxpa2UgQW5kcm9pZCA0LCBpUGhvbmUgNS4xLCBPcGVyYSAxMSBhbmQgU2FmYXJpIDUuXG4gIC8vXG4gIGlmICghbmV3IEV2ZW50cygpLl9fcHJvdG9fXykgcHJlZml4ID0gZmFsc2U7XG59XG5cbi8qKlxuICogUmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgZXZlbnQgbGlzdGVuZXIuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29uY2U9ZmFsc2VdIFNwZWNpZnkgaWYgdGhlIGxpc3RlbmVyIGlzIGEgb25lLXRpbWUgbGlzdGVuZXIuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIEVFKGZuLCBjb250ZXh0LCBvbmNlKSB7XG4gIHRoaXMuZm4gPSBmbjtcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5vbmNlID0gb25jZSB8fCBmYWxzZTtcbn1cblxuLyoqXG4gKiBBZGQgYSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gZW1pdHRlciBSZWZlcmVuY2UgdG8gdGhlIGBFdmVudEVtaXR0ZXJgIGluc3RhbmNlLlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25jZSBTcGVjaWZ5IGlmIHRoZSBsaXN0ZW5lciBpcyBhIG9uZS10aW1lIGxpc3RlbmVyLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGFkZExpc3RlbmVyKGVtaXR0ZXIsIGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVyID0gbmV3IEVFKGZuLCBjb250ZXh0IHx8IGVtaXR0ZXIsIG9uY2UpXG4gICAgLCBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuXG4gIGlmICghZW1pdHRlci5fZXZlbnRzW2V2dF0pIGVtaXR0ZXIuX2V2ZW50c1tldnRdID0gbGlzdGVuZXIsIGVtaXR0ZXIuX2V2ZW50c0NvdW50Kys7XG4gIGVsc2UgaWYgKCFlbWl0dGVyLl9ldmVudHNbZXZ0XS5mbikgZW1pdHRlci5fZXZlbnRzW2V2dF0ucHVzaChsaXN0ZW5lcik7XG4gIGVsc2UgZW1pdHRlci5fZXZlbnRzW2V2dF0gPSBbZW1pdHRlci5fZXZlbnRzW2V2dF0sIGxpc3RlbmVyXTtcblxuICByZXR1cm4gZW1pdHRlcjtcbn1cblxuLyoqXG4gKiBDbGVhciBldmVudCBieSBuYW1lLlxuICpcbiAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBlbWl0dGVyIFJlZmVyZW5jZSB0byB0aGUgYEV2ZW50RW1pdHRlcmAgaW5zdGFuY2UuXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZ0IFRoZSBFdmVudCBuYW1lLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2xlYXJFdmVudChlbWl0dGVyLCBldnQpIHtcbiAgaWYgKC0tZW1pdHRlci5fZXZlbnRzQ291bnQgPT09IDApIGVtaXR0ZXIuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgZWxzZSBkZWxldGUgZW1pdHRlci5fZXZlbnRzW2V2dF07XG59XG5cbi8qKlxuICogTWluaW1hbCBgRXZlbnRFbWl0dGVyYCBpbnRlcmZhY2UgdGhhdCBpcyBtb2xkZWQgYWdhaW5zdCB0aGUgTm9kZS5qc1xuICogYEV2ZW50RW1pdHRlcmAgaW50ZXJmYWNlLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xufVxuXG4vKipcbiAqIFJldHVybiBhbiBhcnJheSBsaXN0aW5nIHRoZSBldmVudHMgZm9yIHdoaWNoIHRoZSBlbWl0dGVyIGhhcyByZWdpc3RlcmVkXG4gKiBsaXN0ZW5lcnMuXG4gKlxuICogQHJldHVybnMge0FycmF5fVxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICB2YXIgbmFtZXMgPSBbXVxuICAgICwgZXZlbnRzXG4gICAgLCBuYW1lO1xuXG4gIGlmICh0aGlzLl9ldmVudHNDb3VudCA9PT0gMCkgcmV0dXJuIG5hbWVzO1xuXG4gIGZvciAobmFtZSBpbiAoZXZlbnRzID0gdGhpcy5fZXZlbnRzKSkge1xuICAgIGlmIChoYXMuY2FsbChldmVudHMsIG5hbWUpKSBuYW1lcy5wdXNoKHByZWZpeCA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lKTtcbiAgfVxuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgcmV0dXJuIG5hbWVzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGV2ZW50cykpO1xuICB9XG5cbiAgcmV0dXJuIG5hbWVzO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGxpc3RlbmVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gVGhlIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyhldmVudCkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudFxuICAgICwgaGFuZGxlcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoIWhhbmRsZXJzKSByZXR1cm4gW107XG4gIGlmIChoYW5kbGVycy5mbikgcmV0dXJuIFtoYW5kbGVycy5mbl07XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGgsIGVlID0gbmV3IEFycmF5KGwpOyBpIDwgbDsgaSsrKSB7XG4gICAgZWVbaV0gPSBoYW5kbGVyc1tpXS5mbjtcbiAgfVxuXG4gIHJldHVybiBlZTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIGxpc3RlbmluZyB0byBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1iZXIgb2YgbGlzdGVuZXJzLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbiBsaXN0ZW5lckNvdW50KGV2ZW50KSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50XG4gICAgLCBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoIWxpc3RlbmVycykgcmV0dXJuIDA7XG4gIGlmIChsaXN0ZW5lcnMuZm4pIHJldHVybiAxO1xuICByZXR1cm4gbGlzdGVuZXJzLmxlbmd0aDtcbn07XG5cbi8qKlxuICogQ2FsbHMgZWFjaCBvZiB0aGUgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZXZlbnQgaGFkIGxpc3RlbmVycywgZWxzZSBgZmFsc2VgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KGV2ZW50LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbZXZ0XSkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XVxuICAgICwgbGVuID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICwgYXJnc1xuICAgICwgaTtcblxuICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgaWYgKGxpc3RlbmVycy5vbmNlKSB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcnMuZm4sIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cbiAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgY2FzZSAxOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQpLCB0cnVlO1xuICAgICAgY2FzZSAyOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExKSwgdHJ1ZTtcbiAgICAgIGNhc2UgMzogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIpLCB0cnVlO1xuICAgICAgY2FzZSA0OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMpLCB0cnVlO1xuICAgICAgY2FzZSA1OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMsIGE0KSwgdHJ1ZTtcbiAgICAgIGNhc2UgNjogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzLCBhNCwgYTUpLCB0cnVlO1xuICAgIH1cblxuICAgIGZvciAoaSA9IDEsIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0xKTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMuZm4uYXBwbHkobGlzdGVuZXJzLmNvbnRleHQsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZhciBsZW5ndGggPSBsaXN0ZW5lcnMubGVuZ3RoXG4gICAgICAsIGo7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsaXN0ZW5lcnNbaV0ub25jZSkgdGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXJzW2ldLmZuLCB1bmRlZmluZWQsIHRydWUpO1xuXG4gICAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgICBjYXNlIDE6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0KTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMjogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMzogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExLCBhMik7IGJyZWFrO1xuICAgICAgICBjYXNlIDQ6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSwgYTIsIGEzKTsgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKCFhcmdzKSBmb3IgKGogPSAxLCBhcmdzID0gbmV3IEFycmF5KGxlbiAtMSk7IGogPCBsZW47IGorKykge1xuICAgICAgICAgICAgYXJnc1tqIC0gMV0gPSBhcmd1bWVudHNbal07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGlzdGVuZXJzW2ldLmZuLmFwcGx5KGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhcmdzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQWRkIGEgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBbY29udGV4dD10aGlzXSBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBmdW5jdGlvbiBvbihldmVudCwgZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgZmFsc2UpO1xufTtcblxuLyoqXG4gKiBBZGQgYSBvbmUtdGltZSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IFtjb250ZXh0PXRoaXNdIFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZShldmVudCwgZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgdHJ1ZSk7XG59O1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgbGlzdGVuZXJzIG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IG1hdGNoIHRoaXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IGhhdmUgdGhpcyBjb250ZXh0LlxuICogQHBhcmFtIHtCb29sZWFufSBvbmNlIE9ubHkgcmVtb3ZlIG9uZS10aW1lIGxpc3RlbmVycy5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcblxuICBpZiAoIXRoaXMuX2V2ZW50c1tldnRdKSByZXR1cm4gdGhpcztcbiAgaWYgKCFmbikge1xuICAgIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgaWYgKFxuICAgICAgbGlzdGVuZXJzLmZuID09PSBmbiAmJlxuICAgICAgKCFvbmNlIHx8IGxpc3RlbmVycy5vbmNlKSAmJlxuICAgICAgKCFjb250ZXh0IHx8IGxpc3RlbmVycy5jb250ZXh0ID09PSBjb250ZXh0KVxuICAgICkge1xuICAgICAgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMCwgZXZlbnRzID0gW10sIGxlbmd0aCA9IGxpc3RlbmVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKFxuICAgICAgICBsaXN0ZW5lcnNbaV0uZm4gIT09IGZuIHx8XG4gICAgICAgIChvbmNlICYmICFsaXN0ZW5lcnNbaV0ub25jZSkgfHxcbiAgICAgICAgKGNvbnRleHQgJiYgbGlzdGVuZXJzW2ldLmNvbnRleHQgIT09IGNvbnRleHQpXG4gICAgICApIHtcbiAgICAgICAgZXZlbnRzLnB1c2gobGlzdGVuZXJzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIFJlc2V0IHRoZSBhcnJheSwgb3IgcmVtb3ZlIGl0IGNvbXBsZXRlbHkgaWYgd2UgaGF2ZSBubyBtb3JlIGxpc3RlbmVycy5cbiAgICAvL1xuICAgIGlmIChldmVudHMubGVuZ3RoKSB0aGlzLl9ldmVudHNbZXZ0XSA9IGV2ZW50cy5sZW5ndGggPT09IDEgPyBldmVudHNbMF0gOiBldmVudHM7XG4gICAgZWxzZSBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIGFsbCBsaXN0ZW5lcnMsIG9yIHRob3NlIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IFtldmVudF0gVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50KSB7XG4gIHZhciBldnQ7XG5cbiAgaWYgKGV2ZW50KSB7XG4gICAgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcbiAgICBpZiAodGhpcy5fZXZlbnRzW2V2dF0pIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG4gICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vL1xuLy8gQWxpYXMgbWV0aG9kcyBuYW1lcyBiZWNhdXNlIHBlb3BsZSByb2xsIGxpa2UgdGhhdC5cbi8vXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbjtcblxuLy9cbi8vIEV4cG9zZSB0aGUgcHJlZml4LlxuLy9cbkV2ZW50RW1pdHRlci5wcmVmaXhlZCA9IHByZWZpeDtcblxuLy9cbi8vIEFsbG93IGBFdmVudEVtaXR0ZXJgIHRvIGJlIGltcG9ydGVkIGFzIG1vZHVsZSBuYW1lc3BhY2UuXG4vL1xuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuLy9cbi8vIEV4cG9zZSB0aGUgbW9kdWxlLlxuLy9cbmlmICgndW5kZWZpbmVkJyAhPT0gdHlwZW9mIG1vZHVsZSkge1xuICBtb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcbn1cbiIsCiAgICAiaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICcuL2luZGV4LmpzJ1xuXG5leHBvcnQgeyBFdmVudEVtaXR0ZXIgfVxuZXhwb3J0IGRlZmF1bHQgRXZlbnRFbWl0dGVyXG4iLAogICAgIi8qIVxuICogYWN0aXZpdHktc3RyZWFtc1xuICogICBodHRwczovL2dpdGh1Yi5jb20vc2lsdmVyYnVja2V0L2FjdGl2aXR5LXN0cmVhbXNcbiAqXG4gKiBEZXZlbG9wZWQgYW5kIE1haW50YWluZWQgYnk6XG4gKiAgIE5pY2sgSmVubmluZ3MgPG5pY2tAc2lsdmVyYnVja2V0Lm5ldD5cbiAqXG4gKiBhY3Rpdml0eS1zdHJlYW1zIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgKHNlZSBMSUNFTlNFKS5cbiAqXG4gKiBZb3UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsIHRvIGNob29zZSBvbmUgbGljZW5zZSBvciB0aGUgb3RoZXJcbiAqIGFuZCB5b3UgZG9uJ3QgaGF2ZSB0byBub3RpZnkgYW55b25lIHdoaWNoIGxpY2Vuc2UgeW91IGFyZSB1c2luZy5cbiAqIFBsZWFzZSBzZWUgdGhlIGNvcnJlc3BvbmRpbmcgbGljZW5zZSBmaWxlIGZvciBkZXRhaWxzIG9mIHRoZXNlIGxpY2Vuc2VzLlxuICogWW91IGFyZSBmcmVlIHRvIHVzZSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUsIGJ1dCBhbGwgY29weXJpZ2h0XG4gKiBpbmZvcm1hdGlvbiBtdXN0IHJlbWFpbi5cbiAqXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBY3Rpdml0eU9iamVjdCwgQWN0aXZpdHlTdHJlYW0gfSBmcm9tIFwiQHNvY2tldGh1Yi9zY2hlbWFzXCI7XG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gXCJldmVudGVtaXR0ZXIzXCI7XG5cbmNvbnN0IGVlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuY29uc3QgYmFzZVByb3BzID0ge1xuICAgIHN0cmVhbTogW1xuICAgICAgICBcImlkXCIsXG4gICAgICAgIFwidHlwZVwiLFxuICAgICAgICBcImFjdG9yXCIsXG4gICAgICAgIFwidGFyZ2V0XCIsXG4gICAgICAgIFwib2JqZWN0XCIsXG4gICAgICAgIFwiY29udGV4dFwiLFxuICAgICAgICBcImNvbnRleHRcIixcbiAgICAgICAgXCJwdWJsaXNoZWRcIixcbiAgICAgICAgXCJlcnJvclwiLFxuICAgIF0sXG4gICAgb2JqZWN0OiBbXG4gICAgICAgIFwiaWRcIixcbiAgICAgICAgXCJ0eXBlXCIsXG4gICAgICAgIFwiY29udGV4dFwiLFxuICAgICAgICBcImFsaWFzXCIsXG4gICAgICAgIFwiYXR0YWNoZWRUb1wiLFxuICAgICAgICBcImF0dGFjaG1lbnRcIixcbiAgICAgICAgXCJhdHRyaWJ1dGVkVG9cIixcbiAgICAgICAgXCJhdHRyaWJ1dGVkV2l0aFwiLFxuICAgICAgICBcImNvbmRpdGlvblwiLFxuICAgICAgICBcImNvbnRlbnRcIixcbiAgICAgICAgXCJjb250ZW50TWFwXCIsXG4gICAgICAgIFwiY29udGV4dFwiLFxuICAgICAgICBcImNvbnRleHRPZlwiLFxuICAgICAgICBcIm5hbWVcIixcbiAgICAgICAgXCJlbmRUaW1lXCIsXG4gICAgICAgIFwiZ2VuZXJhdG9yXCIsXG4gICAgICAgIFwiZ2VuZXJhdG9yT2ZcIixcbiAgICAgICAgXCJncm91cFwiLFxuICAgICAgICBcImljb25cIixcbiAgICAgICAgXCJpbWFnZVwiLFxuICAgICAgICBcImluUmVwbHlUb1wiLFxuICAgICAgICBcIm1lbWJlcnNcIixcbiAgICAgICAgXCJtZW1iZXJPZlwiLFxuICAgICAgICBcIm1lc3NhZ2VcIixcbiAgICAgICAgXCJsb2NhdGlvblwiLFxuICAgICAgICBcImxvY2F0aW9uT2ZcIixcbiAgICAgICAgXCJvYmplY3RPZlwiLFxuICAgICAgICBcIm9yaWdpbk9mXCIsXG4gICAgICAgIFwicHJlc2VuY2VcIixcbiAgICAgICAgXCJwcmV2aWV3XCIsXG4gICAgICAgIFwicHJldmlld09mXCIsXG4gICAgICAgIFwicHJvdmlkZXJcIixcbiAgICAgICAgXCJwcm92aWRlck9mXCIsXG4gICAgICAgIFwicHVibGlzaGVkXCIsXG4gICAgICAgIFwicmF0aW5nXCIsXG4gICAgICAgIFwicmVsYXRpb25zaGlwXCIsXG4gICAgICAgIFwicmVzdWx0T2ZcIixcbiAgICAgICAgXCJyZXBsaWVzXCIsXG4gICAgICAgIFwicm9sZVwiLFxuICAgICAgICBcInNjb3BlXCIsXG4gICAgICAgIFwic2NvcGVPZlwiLFxuICAgICAgICBcInN0YXJ0VGltZVwiLFxuICAgICAgICBcInN0YXR1c1wiLFxuICAgICAgICBcInN1bW1hcnlcIixcbiAgICAgICAgXCJ0b3BpY1wiLFxuICAgICAgICBcInRhZ1wiLFxuICAgICAgICBcInRhZ09mXCIsXG4gICAgICAgIFwidGFyZ2V0T2ZcIixcbiAgICAgICAgXCJ0aXRsZVwiLFxuICAgICAgICBcInRpdGxlTWFwXCIsXG4gICAgICAgIFwidXBkYXRlZFwiLFxuICAgICAgICBcInVybFwiLFxuICAgICAgICBcInhtcHA6c3RhbnphLWlkXCIsXG4gICAgXSxcbn07XG5jb25zdCByZW5hbWUgPSB7XG4gICAgXCJAaWRcIjogXCJpZFwiLFxuICAgIFwiQHR5cGVcIjogXCJ0eXBlXCIsXG4gICAgdmVyYjogXCJ0eXBlXCIsXG4gICAgZGlzcGxheU5hbWU6IFwibmFtZVwiLFxuICAgIG9iamVjdFR5cGU6IFwidHlwZVwiLFxuICAgIHBsYXRmb3JtOiBcImNvbnRleHRcIixcbn07XG5jb25zdCBleHBhbmQgPSB7XG4gICAgYWN0b3I6IHtcbiAgICAgICAgcHJpbWFyeTogXCJpZFwiLFxuICAgICAgICBwcm9wczogYmFzZVByb3BzLFxuICAgIH0sXG4gICAgdGFyZ2V0OiB7XG4gICAgICAgIHByaW1hcnk6IFwiaWRcIixcbiAgICAgICAgcHJvcHM6IGJhc2VQcm9wcyxcbiAgICB9LFxuICAgIG9iamVjdDoge1xuICAgICAgICBwcmltYXJ5OiBcImNvbnRlbnRcIixcbiAgICAgICAgcHJvcHM6IGJhc2VQcm9wcyxcbiAgICB9LFxufTtcblxudHlwZSBDdXN0b21Qcm9wcyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgb2JqZWN0IHwgc3RyaW5nW107XG59O1xuXG5jb25zdCBvYmpzID0gbmV3IE1hcCgpO1xuY29uc3QgY3VzdG9tUHJvcHM6IEN1c3RvbVByb3BzID0ge307XG5cbmxldCBmYWlsT25Vbmtub3duT2JqZWN0UHJvcGVydGllcyA9IGZhbHNlO1xubGV0IHdhcm5PblVua25vd25PYmplY3RQcm9wZXJ0aWVzID0gdHJ1ZTtcbmxldCBzcGVjaWFsT2JqcyA9IFtdOyAvLyB0aGUgb2JqZWN0cyBkb24ndCBnZXQgcmVqZWN0ZWQgZm9yIGJhZCBwcm9wc1xuXG5mdW5jdGlvbiBtYXRjaGVzQ3VzdG9tUHJvcCh0eXBlOiBzdHJpbmcsIGtleTogc3RyaW5nKSB7XG4gICAgaWYgKGN1c3RvbVByb3BzW3R5cGVdIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IG9iaiA9IGN1c3RvbVByb3BzW3R5cGVdIGFzIHN0cmluZ1tdO1xuICAgICAgICBpZiAob2JqLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVuYW1lUHJvcDxUPihvYmo6IFQsIGtleTogc3RyaW5nKTogVCB7XG4gICAgb2JqW3JlbmFtZVtrZXldXSA9IG9ialtrZXldO1xuICAgIGRlbGV0ZSBvYmpba2V5XTtcbiAgICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZU9iamVjdDxUPih0eXBlOiBzdHJpbmcsIGluY29taW5nT2JqOiBULCByZXF1aXJlSWQgPSBmYWxzZSkge1xuICAgIC8vIElucHV0IHZhbGlkYXRpb24gd2l0aCBjbGVhciBlcnJvciBtZXNzYWdlc1xuICAgIGlmIChpbmNvbWluZ09iaiA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQWN0aXZpdHlTdHJlYW1zIHZhbGlkYXRpb24gZmFpbGVkOiB0aGUgXCIke3R5cGV9XCIgcHJvcGVydHkgaXMgbnVsbC4gRXhhbXBsZTogeyBpZDogXCJ1c2VyQGV4YW1wbGUuY29tXCIsIHR5cGU6IFwicGVyc29uXCIgfWAsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGluY29taW5nT2JqID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEFjdGl2aXR5U3RyZWFtcyB2YWxpZGF0aW9uIGZhaWxlZDogdGhlIFwiJHt0eXBlfVwiIHByb3BlcnR5IGlzIHVuZGVmaW5lZC4gRXhhbXBsZTogeyBpZDogXCJ1c2VyQGV4YW1wbGUuY29tXCIsIHR5cGU6IFwicGVyc29uXCIgfWAsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbmNvbWluZ09iaiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQWN0aXZpdHlTdHJlYW1zIHZhbGlkYXRpb24gZmFpbGVkOiB0aGUgXCIke3R5cGV9XCIgcHJvcGVydHkgcmVjZWl2ZWQgc3RyaW5nIFwiJHtpbmNvbWluZ09ian1cIiBidXQgZXhwZWN0ZWQgYW4gb2JqZWN0LiBVc2U6IHsgaWQ6IFwiJHtpbmNvbWluZ09ian1cIiwgdHlwZTogXCJwZXJzb25cIiB9YCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluY29taW5nT2JqICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoaW5jb21pbmdPYmopKSB7XG4gICAgICAgIGNvbnN0IHJlY2VpdmVkVHlwZSA9IEFycmF5LmlzQXJyYXkoaW5jb21pbmdPYmopXG4gICAgICAgICAgICA/IFwiYXJyYXlcIlxuICAgICAgICAgICAgOiB0eXBlb2YgaW5jb21pbmdPYmo7XG4gICAgICAgIGNvbnN0IHJlY2VpdmVkVmFsdWUgPSBTdHJpbmcoaW5jb21pbmdPYmopO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQWN0aXZpdHlTdHJlYW1zIHZhbGlkYXRpb24gZmFpbGVkOiB0aGUgXCIke3R5cGV9XCIgcHJvcGVydHkgbXVzdCBiZSBhbiBvYmplY3QsIHJlY2VpdmVkICR7cmVjZWl2ZWRUeXBlfSAoJHtyZWNlaXZlZFZhbHVlfSkuIEV4YW1wbGU6IHsgaWQ6IFwidXNlckBleGFtcGxlLmNvbVwiLCB0eXBlOiBcInBlcnNvblwiIH1gLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIFJlcXVpcmUgJ2lkJyBwcm9wZXJ0eSB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkIChlLmcuLCBPYmplY3QuY3JlYXRlKCkpXG4gICAgY29uc3Qgb2JqID0gaW5jb21pbmdPYmogYXMgQWN0aXZpdHlPYmplY3Q7XG4gICAgaWYgKHJlcXVpcmVJZCAmJiAhb2JqLmlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBY3Rpdml0eVN0cmVhbXMgdmFsaWRhdGlvbiBmYWlsZWQ6IHRoZSBcIiR7dHlwZX1cIiBwcm9wZXJ0eSByZXF1aXJlcyBhbiAnaWQnIHByb3BlcnR5LiBFeGFtcGxlOiB7IGlkOiBcInVzZXJAZXhhbXBsZS5jb21cIiwgdHlwZTogXCJwZXJzb25cIiB9YCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB1bmtub3duS2V5cyA9IE9iamVjdC5rZXlzKGluY29taW5nT2JqKS5maWx0ZXIoXG4gICAgICAgIChrZXk6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgICAgcmV0dXJuICFiYXNlUHJvcHNbdHlwZV0uaW5jbHVkZXMoa2V5KTtcbiAgICAgICAgfSxcbiAgICApO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgdW5rbm93bktleXMpIHtcbiAgICAgICAgbGV0IGFvOiBBY3Rpdml0eU9iamVjdCA9IGluY29taW5nT2JqIGFzIEFjdGl2aXR5T2JqZWN0O1xuICAgICAgICBpZiAocmVuYW1lW2tleV0pIHtcbiAgICAgICAgICAgIC8vIHJlbmFtZSBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGZhaWxcbiAgICAgICAgICAgIGFvID0gcmVuYW1lUHJvcChhbywga2V5KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1hdGNoZXNDdXN0b21Qcm9wKGFvLnR5cGUsIGtleSkpIHtcbiAgICAgICAgICAgIC8vIGN1c3RvbSBwcm9wZXJ0eSBtYXRjaGVzLCBjb250aW51ZVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNwZWNpYWxPYmpzLmluY2x1ZGVzKGFvLnR5cGUpKSB7XG4gICAgICAgICAgICAvLyBub3QgZGVmaW5lZCBhcyBhIHNwZWNpYWwgcHJvcFxuICAgICAgICAgICAgLy8gZG9uJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggaXQsIHNvIHRocm93IGVycm9yXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhhbyk7XG4gICAgICAgICAgICBjb25zdCByZWNlaXZlZFZhbHVlID1cbiAgICAgICAgICAgICAgICB0eXBlb2YgYW9ba2V5XSA9PT0gXCJzdHJpbmdcIiA/IGBcIiR7YW9ba2V5XX1cImAgOiBTdHJpbmcoYW9ba2V5XSk7XG4gICAgICAgICAgICBjb25zdCBlcnIgPSBgQWN0aXZpdHlTdHJlYW1zIHZhbGlkYXRpb24gZmFpbGVkOiBwcm9wZXJ0eSBcIiR7a2V5fVwiIHdpdGggdmFsdWUgJHtyZWNlaXZlZFZhbHVlfSBpcyBub3QgYWxsb3dlZCBvbiB0aGUgXCIke3R5cGV9XCIgb2JqZWN0IG9mIHR5cGUgXCIke2FvLnR5cGV9XCIuYDtcbiAgICAgICAgICAgIGlmIChmYWlsT25Vbmtub3duT2JqZWN0UHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHdhcm5PblVua25vd25PYmplY3RQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGVuc3VyZVByb3BzKG9iajogQWN0aXZpdHlPYmplY3QpOiBBY3Rpdml0eU9iamVjdCB7XG4gICAgLy8gZW5zdXJlIHRoZSBuYW1lIHByb3BlcnR5LCB3aGljaCBjYW4gZ2VuZXJhbGx5IGJlIGluZmVycmVkIGZyb20gdGhlIGlkXG4gICAgLy8gbmFtZSA9IG9iai5tYXRjaCgvKD8oP1xcdyspOlxcL1xcLykoPzouK0ApPyguKz8pKD86XFwvfCQpLylbMV1cbiAgICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBleHBhbmRTdHJlYW0obWV0YTogQWN0aXZpdHlTdHJlYW0pIHtcbiAgICBjb25zdCBzdHJlYW0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhtZXRhKSkge1xuICAgICAgICBpZiAodHlwZW9mIG1ldGFba2V5XSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgc3RyZWFtW2tleV0gPSBvYmpzLmdldChtZXRhW2tleV0pIHx8IG1ldGFba2V5XTtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG1ldGFba2V5XSkpIHtcbiAgICAgICAgICAgIHN0cmVhbVtrZXldID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIG1ldGFba2V5XSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtW2tleV0ucHVzaChvYmpzLmdldChlbnRyeSkgfHwgZW50cnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0cmVhbVtrZXldID0gbWV0YVtrZXldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gb25seSBleHBhbmQgc3RyaW5nIGludG8gb2JqZWN0cyBpZiB0aGV5IGFyZSBpbiB0aGUgZXhwYW5kIGxpc3RcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhleHBhbmQpKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc3RyZWFtW2tleV0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9IGV4cGFuZFtrZXldLnByaW1hcnk7XG4gICAgICAgICAgICBjb25zdCBvYmogPSB7fTtcbiAgICAgICAgICAgIG9ialtpZHhdID0gc3RyZWFtW2tleV07XG4gICAgICAgICAgICBzdHJlYW1ba2V5XSA9IG9iajtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RyZWFtO1xufVxuXG5mdW5jdGlvbiBTdHJlYW0oXG4gICAgbWV0YTogQWN0aXZpdHlTdHJlYW0sXG4pOiBBY3Rpdml0eVN0cmVhbSB8IEFjdGl2aXR5T2JqZWN0IHwgUmVjb3JkPHN0cmluZywgbmV2ZXI+IHtcbiAgICB2YWxpZGF0ZU9iamVjdChcInN0cmVhbVwiLCBtZXRhKTtcbiAgICBpZiAodHlwZW9mIG1ldGEub2JqZWN0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHZhbGlkYXRlT2JqZWN0KFwib2JqZWN0XCIsIG1ldGEub2JqZWN0KTtcbiAgICB9XG4gICAgY29uc3Qgc3RyZWFtID0gZXhwYW5kU3RyZWFtKG1ldGEpO1xuICAgIGVlLmVtaXQoXCJhY3Rpdml0eS1zdHJlYW1cIiwgc3RyZWFtKTtcbiAgICByZXR1cm4gc3RyZWFtO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2aXR5T2JqZWN0TWFuYWdlciB7XG4gICAgY3JlYXRlKG9iajogdW5rbm93bik6IHVua25vd247XG4gICAgZGVsZXRlKGlkOiBzdHJpbmcpOiBib29sZWFuO1xuICAgIGxpc3QoKTogSXRlcmFibGVJdGVyYXRvcjx1bmtub3duPjtcbiAgICBnZXQoaWQ6IHN0cmluZywgZXhwYW5kPzogYm9vbGVhbik6IHVua25vd247XG59XG5cbmNvbnN0IF9PYmplY3Q6IEFjdGl2aXR5T2JqZWN0TWFuYWdlciA9IHtcbiAgICBjcmVhdGU6IChvYmo6IEFjdGl2aXR5T2JqZWN0KSA9PiB7XG4gICAgICAgIHZhbGlkYXRlT2JqZWN0KFwib2JqZWN0XCIsIG9iaiwgdHJ1ZSk7IC8vIHJlcXVpcmUgSUQgZm9yIE9iamVjdC5jcmVhdGUoKVxuICAgICAgICBjb25zdCBhbyA9IGVuc3VyZVByb3BzKG9iaik7XG4gICAgICAgIG9ianMuc2V0KGFvLmlkLCBhbyk7XG4gICAgICAgIGVlLmVtaXQoXCJhY3Rpdml0eS1vYmplY3QtY3JlYXRlXCIsIGFvKTtcbiAgICAgICAgcmV0dXJuIGFvO1xuICAgIH0sXG5cbiAgICBkZWxldGU6IChpZCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBvYmpzLmRlbGV0ZShpZCk7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIGVlLmVtaXQoXCJhY3Rpdml0eS1vYmplY3QtZGVsZXRlXCIsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBnZXQ6IChpZCwgZXhwYW5kKSA9PiB7XG4gICAgICAgIGxldCBvYmogPSBvYmpzLmdldChpZCk7XG4gICAgICAgIGlmICghb2JqKSB7XG4gICAgICAgICAgICBpZiAoIWV4cGFuZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9iaiA9IHsgaWQ6IGlkIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVuc3VyZVByb3BzKG9iaik7XG4gICAgfSxcblxuICAgIGxpc3Q6ICgpOiBJdGVyYWJsZUl0ZXJhdG9yPHVua25vd24+ID0+IG9ianMua2V5cygpLFxufTtcblxuZXhwb3J0IGludGVyZmFjZSBBU0ZhY3RvcnlPcHRpb25zIHtcbiAgICBzcGVjaWFsT2Jqcz86IEFycmF5PHN0cmluZz47XG4gICAgZmFpbE9uVW5rbm93bk9iamVjdFByb3BlcnRpZXM/OiBib29sZWFuO1xuICAgIHdhcm5PblVua25vd25PYmplY3RQcm9wZXJ0aWVzPzogYm9vbGVhbjtcbiAgICBjdXN0b21Qcm9wcz86IEN1c3RvbVByb3BzO1xufVxuXG50eXBlIEV2ZW50Q2FsbGJhY2sgPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFTTWFuYWdlciB7XG4gICAgU3RyZWFtKG1ldGE6IHVua25vd24pOiBBY3Rpdml0eVN0cmVhbSB8IEFjdGl2aXR5T2JqZWN0O1xuICAgIE9iamVjdDogQWN0aXZpdHlPYmplY3RNYW5hZ2VyO1xuICAgIG9uKGV2ZW50OiBzdHJpbmcsIGZ1bmM6IEV2ZW50Q2FsbGJhY2spOiB2b2lkO1xuICAgIG9uY2UoZXZlbnQ6IHN0cmluZywgZnVuYzogRXZlbnRDYWxsYmFjayk6IHZvaWQ7XG4gICAgb2ZmKGV2ZW50OiBzdHJpbmcsIGZ1bmM6IEV2ZW50Q2FsbGJhY2spOiB2b2lkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gQVNGYWN0b3J5KG9wdHM6IEFTRmFjdG9yeU9wdGlvbnMgPSB7fSk6IEFTTWFuYWdlciB7XG4gICAgc3BlY2lhbE9ianMgPSBvcHRzPy5zcGVjaWFsT2JqcyB8fCBbXTtcbiAgICBmYWlsT25Vbmtub3duT2JqZWN0UHJvcGVydGllcyA9XG4gICAgICAgIHR5cGVvZiBvcHRzLmZhaWxPblVua25vd25PYmplY3RQcm9wZXJ0aWVzID09PSBcImJvb2xlYW5cIlxuICAgICAgICAgICAgPyBvcHRzLmZhaWxPblVua25vd25PYmplY3RQcm9wZXJ0aWVzXG4gICAgICAgICAgICA6IGZhaWxPblVua25vd25PYmplY3RQcm9wZXJ0aWVzO1xuICAgIHdhcm5PblVua25vd25PYmplY3RQcm9wZXJ0aWVzID1cbiAgICAgICAgdHlwZW9mIG9wdHMud2Fybk9uVW5rbm93bk9iamVjdFByb3BlcnRpZXMgPT09IFwiYm9vbGVhblwiXG4gICAgICAgICAgICA/IG9wdHMud2Fybk9uVW5rbm93bk9iamVjdFByb3BlcnRpZXNcbiAgICAgICAgICAgIDogd2Fybk9uVW5rbm93bk9iamVjdFByb3BlcnRpZXM7XG4gICAgZm9yIChjb25zdCBwcm9wTmFtZSBvZiBPYmplY3Qua2V5cyhvcHRzLmN1c3RvbVByb3BzIHx8IHt9KSkge1xuICAgICAgICBpZiAodHlwZW9mIG9wdHMuY3VzdG9tUHJvcHNbcHJvcE5hbWVdID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBjdXN0b21Qcm9wc1twcm9wTmFtZV0gPSBvcHRzLmN1c3RvbVByb3BzW3Byb3BOYW1lXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIFN0cmVhbTogU3RyZWFtLFxuICAgICAgICBPYmplY3Q6IF9PYmplY3QsXG4gICAgICAgIG9uOiAoZXZlbnQsIGZ1bmMpID0+IGVlLm9uKGV2ZW50LCBmdW5jKSxcbiAgICAgICAgb25jZTogKGV2ZW50LCBmdW5jKSA9PiBlZS5vbmNlKGV2ZW50LCBmdW5jKSxcbiAgICAgICAgb2ZmOiAoZXZlbnQsIGZ1bmNOYW1lKSA9PiBlZS5vZmYoZXZlbnQsIGZ1bmNOYW1lKSxcbiAgICB9IGFzIEFTTWFuYWdlcjtcbn1cblxuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiA8ZXhwbGFuYXRpb24+XG4oKGdsb2JhbDogYW55KSA9PiB7XG4gICAgZ2xvYmFsLkFTRmFjdG9yID0gQVNGYWN0b3J5O1xufSkodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIiA/IHdpbmRvdyA6IHt9KTtcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBRUEsSUFBSSxNQUFNLE9BQU8sVUFBVTtBQUFBLEVBQTNCLElBQ0ksU0FBUztBQUFBLEVBU2IsU0FBUyxNQUFNLEdBQUc7QUFBQSxFQVNsQixJQUFJLE9BQU8sUUFBUTtBQUFBLElBQ2pCLE9BQU8sWUFBWSxPQUFPLE9BQU8sSUFBSTtBQUFBLElBTXJDLElBQUksQ0FBQyxJQUFJLE9BQU8sRUFBRTtBQUFBLE1BQVcsU0FBUztBQUFBLEVBQ3hDO0FBQUEsRUFXQSxTQUFTLEVBQUUsQ0FBQyxJQUFJLFNBQVMsTUFBTTtBQUFBLElBQzdCLEtBQUssS0FBSztBQUFBLElBQ1YsS0FBSyxVQUFVO0FBQUEsSUFDZixLQUFLLE9BQU8sUUFBUTtBQUFBO0FBQUEsRUFjdEIsU0FBUyxXQUFXLENBQUMsU0FBUyxPQUFPLElBQUksU0FBUyxNQUFNO0FBQUEsSUFDdEQs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QUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0EsSUFBTSxLQUFLLElBQUk7QUFDZixJQUFNLFlBQVk7QUFBQSxFQUNkLFFBQVE7QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNKO0FBQUEsRUFDQSxRQUFRO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNKO0FBQ0o7QUFDQSxJQUFNLFNBQVM7QUFBQSxFQUNYLE9BQU87QUFBQSxFQUNQLFNBQVM7QUFBQSxFQUNULE1BQU07QUFBQSxFQUNOLGFBQWE7QUFBQSxFQUNiLFlBQVk7QUFBQSxFQUNaLFVBQVU7QUFDZDtBQUNBLElBQU0sU0FBUztBQUFBLEVBQ1gsT0FBTztBQUFBLElB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SUFBTSxVQUFpQztBQUFBLEVBQ25DLFFBQVEsQ0FBQyxRQUF3QjtBQUFBLElBQzdCLGVBQWUsVUFBVSxLQUFLLElBQUk7QUFBQSxJQUNsQyxNQUFNLEtBQUssWUFBWSxHQUFHO0FBQUEsSUFDMUIsS0FBSyxJQUFJLEdBQUcsSUFBSSxFQUFFO0FBQUEsSUFDbEIsR0FBRyxLQUFLLDBCQUEwQixFQUFFO0FBQUEsSUFDcEMsT0FBTztBQUFBO0FBQUEsRUFHWCxRQUFRLENBQUMsT0FBTztBQUFBLElBQ1osTUFBTSxTQUFTLEtBQUssT0FBTyxFQUFFO0FBQUEsSUFDN0IsSUFBSSxRQUFRO0FBQUEsTUFDUixHQUFHLEtBQUssMEJBQTBCLEVBQUU7QUFBQSxJQUN4QztBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUEsRUFHWCxLQUFLLENBQUMsSUFBSSxZQUFXO0FBQUEsSUFDakIsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO0FBQUEsSUFDckIsSUFBSSxDQUFDLEtBQUs7QUFBQSxNQUNOLElBQUksQ0FBQyxTQUFRO0FBQUEsUUFDVCxPQUFPO0FBQUEsTUFDWDtBQUFBLE1BQ0EsTUFBTSxFQUFFLEdBQU87QUFBQSxJQUNuQjtBQUFBLElBQ0EsT0FBTyxZQUFZLEdBQUc7QUFBQTtBQUFBLEVBRzFCLE1BQU0sTUFBaUMsS0FBSyxLQUFLO0FBQ3JEO0FBbUJPLFNBQVMsU0FBUyxDQUFDLE9BQXlCLENBQUMsR0FBYztBQUFBLEVBQzlELGNBQWMsTUFBTSxlQUFlLENBQUM7QUFBQSxFQUNwQyxnQ0FDSSxPQUFPLEtBQUssa0NBQWtDLFlBQ3hDLEtBQUssZ0NBQ0w7QUFBQSxFQUNWLGdDQUNJLE9BQU8sS0FBSyxrQ0FBa0MsWUFDeEMsS0FBSyxnQ0FDTDtBQUFBLEVBQ1YsV0FBVyxZQUFZLE9BQU8sS0FBSyxLQUFLLGVBQWUsQ0FBQyxDQUFDLEdBQUc7QUFBQSxJQUN4RCxJQUFJLE9BQU8sS0FBSyxZQUFZLGNBQWMsVUFBVTtBQUFBLE1BQ2hELFlBQVksWUFBWSxLQUFLLFlBQVk7QUFBQSxJQUM3QztBQUFBLEVBQ0o7QUFBQSxFQUVBLE9BQU87QUFBQSxJQUNIO0FBQUEsSUFDQSxRQUFRO0FBQUEsSUFDUixJQUFJLENBQUMsT0FBTyxTQUFTLEdBQUcsR0FBRyxPQUFPLElBQUk7QUFBQSxJQUN0QyxNQUFNLENBQUMsT0FBTyxTQUFTLEdBQUcsS0FBSyxPQUFPLElBQUk7QUFBQSxJQUMxQyxLQUFLLENBQUMsT0FBTyxhQUFhLEdBQUcsSUFBSSxPQUFPLFFBQVE7QUFBQSxFQUNwRDtBQUFBO0FBQUEsQ0FJSCxDQUFDLFdBQWdCO0FBQUEsRUFDZCxPQUFPLFdBQVc7QUFBQSxHQUNuQixPQUFPLFdBQVcsV0FBVyxTQUFTLENBQUMsQ0FBQzsiLAogICJkZWJ1Z0lkIjogIkJERjRGQTI4ODZCRUNGQjg2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9