@decaf-ts/for-nano 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/for-nano.cjs CHANGED
@@ -4,25 +4,139 @@
4
4
  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["for-nano"] = {}, global.dbDecorators, null, global.forCouchdb, global.Nano, global.decoratorValidation, global.core));
5
5
  })(this, (function (exports, dbDecorators, reflectMetadata, forCouchdb, Nano, decoratorValidation, core) { 'use strict';
6
6
 
7
+ const NanoFlavour = "nano";
8
+
9
+ class NanoDispatch extends core.Dispatch {
10
+ constructor(timeout = 5000) {
11
+ super();
12
+ this.timeout = timeout;
13
+ this.attemptCounter = 0;
14
+ }
15
+ async changeHandler(error, response,
16
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
17
+ headers) {
18
+ const log = this.log.for(this.changeHandler);
19
+ if (error)
20
+ return log.error(`Error in change request: ${error}`);
21
+ try {
22
+ response = (typeof response === "string"
23
+ ? response
24
+ .split("\n")
25
+ .filter((r) => !!r)
26
+ .map((r) => JSON.parse(r))
27
+ : response);
28
+ }
29
+ catch (e) {
30
+ return log.error(`Error parsing couchdb change feed: ${e}`);
31
+ }
32
+ const count = response.length;
33
+ if (count > 0) {
34
+ log.debug(`Received ${count} changes. processing...`);
35
+ const changes = response
36
+ .map((rec, i) => {
37
+ if (i === count - 1) {
38
+ if (this.observerLastUpdate ===
39
+ rec.last_seq)
40
+ log.error(`Invalid last update check: ${this.observerLastUpdate} !== ${rec.last_seq}`);
41
+ return;
42
+ }
43
+ const r = rec;
44
+ const [table, id] = r.id.split(forCouchdb.CouchDBKeys.SEPARATOR);
45
+ return {
46
+ table: table,
47
+ id: id,
48
+ operation: r.deleted
49
+ ? dbDecorators.OperationKeys.DELETE
50
+ : r.changes[r.changes.length - 1].rev.split("-")[0] === "1"
51
+ ? dbDecorators.OperationKeys.CREATE
52
+ : dbDecorators.OperationKeys.UPDATE,
53
+ step: r.changes[r.changes.length - 1].rev,
54
+ };
55
+ })
56
+ .reduce((accum, r) => {
57
+ if (!r)
58
+ return accum;
59
+ const { table, id, operation, step } = r;
60
+ if (!accum[table])
61
+ accum[table] = {};
62
+ if (!accum[table][operation])
63
+ accum[table][operation] = { ids: new Set(), step: step };
64
+ accum[table][operation].ids.add(id);
65
+ accum[table][operation].step = step;
66
+ return accum;
67
+ }, {});
68
+ for (const table of Object.keys(changes)) {
69
+ for (const op of Object.keys(changes[table])) {
70
+ try {
71
+ await this.updateObservers(table, op, [
72
+ ...changes[table][op].ids.values(),
73
+ ]);
74
+ this.observerLastUpdate = changes[table][op].step;
75
+ log.verbose(`Observer refresh dispatched by ${op} for ${table}`);
76
+ log.debug(`pks: ${Array.from(changes[table][op].ids.values())}`);
77
+ }
78
+ catch (e) {
79
+ log.error(`Failed to dispatch observer refresh for ${table}, op ${op}: ${e}`);
80
+ }
81
+ }
82
+ }
83
+ }
84
+ }
85
+ initialize() {
86
+ async function subscribeToCouch() {
87
+ const log = this.log.for(subscribeToCouch);
88
+ if (!this.adapter || !this.native)
89
+ throw new dbDecorators.InternalError(`No adapter/native observed for dispatch`);
90
+ try {
91
+ this.native.changes({
92
+ feed: "continuous",
93
+ include_docs: false,
94
+ since: this.observerLastUpdate || "now",
95
+ timeout: this.timeout,
96
+ }, this.changeHandler.bind(this));
97
+ }
98
+ catch (e) {
99
+ if (++this.attemptCounter > 3)
100
+ return log.error(`Failed to subscribe to couchdb changes: ${e}`);
101
+ log.info(`Failed to subscribe to couchdb changes: ${e}. Retrying in 5 seconds...`);
102
+ await new Promise((resolve) => setTimeout(resolve, this.timeout));
103
+ return subscribeToCouch.call(this);
104
+ }
105
+ }
106
+ subscribeToCouch
107
+ .call(this)
108
+ .then(() => {
109
+ this.log.info(`Subscribed to couchdb changes`);
110
+ })
111
+ .catch((e) => {
112
+ throw new dbDecorators.InternalError(`Failed to subscribe to couchdb changes: ${e}`);
113
+ });
114
+ }
115
+ }
116
+
7
117
  async function createdByOnNanoCreateUpdate(context, data, key, model) {
8
- const user = context.get("user");
9
- if (!user || !user.name)
10
- throw new core.UnsupportedError("This adapter does not support user identification");
11
- model[key] = user.name;
118
+ try {
119
+ const user = context.get("user");
120
+ model[key] = user.name;
121
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
122
+ }
123
+ catch (e) {
124
+ throw new core.UnsupportedError("No User found in context. Please provide a user in the context");
125
+ }
12
126
  }
13
- const createdByKey = core.Repository.key(core.PersistenceKeys.CREATED_BY);
14
- const updatedByKey = core.Repository.key(core.PersistenceKeys.UPDATED_BY);
15
127
  class NanoAdapter extends forCouchdb.CouchDBAdapter {
16
- constructor(scope, flavour = "nano") {
17
- super(scope, flavour);
18
- decoratorValidation.Decoration.flavouredAs("nano")
19
- .for(createdByKey)
20
- .define(dbDecorators.onCreate(createdByOnNanoCreateUpdate), decoratorValidation.propMetadata(createdByKey, {}))
21
- .apply();
22
- decoratorValidation.Decoration.flavouredAs("nano")
23
- .for(updatedByKey)
24
- .define(dbDecorators.onCreate(createdByOnNanoCreateUpdate), decoratorValidation.propMetadata(updatedByKey, {}))
25
- .apply();
128
+ constructor(scope, alias) {
129
+ super(scope, NanoFlavour, alias);
130
+ }
131
+ flags(operation, model, flags) {
132
+ return Object.assign(super.flags(operation, model, flags), {
133
+ user: {
134
+ name: this.native.config.url.split("@")[0].split(":")[0],
135
+ },
136
+ });
137
+ }
138
+ Dispatch() {
139
+ return new NanoDispatch();
26
140
  }
27
141
  async index(...models) {
28
142
  const indexes = forCouchdb.generateIndexes(models);
@@ -150,12 +264,12 @@
150
264
  throw new dbDecorators.InternalError("Should be impossible");
151
265
  });
152
266
  }
153
- async raw(rawInput, process = true) {
267
+ async raw(rawInput, docsOnly = true) {
154
268
  try {
155
269
  const response = await this.native.find(rawInput);
156
270
  if (response.warning)
157
271
  console.warn(response.warning);
158
- if (process)
272
+ if (docsOnly)
159
273
  return response.docs;
160
274
  return response;
161
275
  }
@@ -240,8 +354,22 @@
240
354
  throw forCouchdb.CouchDBAdapter.parseError(e);
241
355
  }
242
356
  }
357
+ static decoration() {
358
+ const createdByKey = core.Repository.key(core.PersistenceKeys.CREATED_BY);
359
+ const updatedByKey = core.Repository.key(core.PersistenceKeys.UPDATED_BY);
360
+ decoratorValidation.Decoration.flavouredAs("nano")
361
+ .for(createdByKey)
362
+ .define(dbDecorators.onCreate(createdByOnNanoCreateUpdate), decoratorValidation.propMetadata(createdByKey, {}))
363
+ .apply();
364
+ decoratorValidation.Decoration.flavouredAs("nano")
365
+ .for(updatedByKey)
366
+ .define(dbDecorators.onCreate(createdByOnNanoCreateUpdate), decoratorValidation.propMetadata(updatedByKey, {}))
367
+ .apply();
368
+ }
243
369
  }
244
370
 
371
+ // Forces override for Nano Decoration
372
+ NanoAdapter.decoration();
245
373
  /**
246
374
  * @summary Module summary
247
375
  * @description Module description
@@ -253,11 +381,12 @@
253
381
  * @const VERSION
254
382
  * @memberOf module:ts-workspace
255
383
  */
256
- const VERSION = "0.0.15";
384
+ const VERSION = "0.1.0";
257
385
 
258
386
  exports.NanoAdapter = NanoAdapter;
387
+ exports.NanoFlavour = NanoFlavour;
259
388
  exports.VERSION = VERSION;
260
389
  exports.createdByOnNanoCreateUpdate = createdByOnNanoCreateUpdate;
261
390
 
262
391
  }));
263
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLW5hbm8uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvYWRhcHRlci50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb25mbGljdEVycm9yLFxuICBDb250ZXh0LFxuICBJbnRlcm5hbEVycm9yLFxuICBvbkNyZWF0ZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCI7XG5pbXBvcnQge1xuICBDb3VjaERCQWRhcHRlcixcbiAgQ291Y2hEQktleXMsXG4gIENyZWF0ZUluZGV4UmVxdWVzdCxcbiAgZ2VuZXJhdGVJbmRleGVzLFxuICBNYW5nb1F1ZXJ5LFxuICBNYW5nb1Jlc3BvbnNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgTmFubyBmcm9tIFwibmFub1wiO1xuaW1wb3J0IHtcbiAgRG9jdW1lbnRCdWxrUmVzcG9uc2UsXG4gIERvY3VtZW50R2V0UmVzcG9uc2UsXG4gIERvY3VtZW50SW5zZXJ0UmVzcG9uc2UsXG4gIERvY3VtZW50U2NvcGUsXG4gIE1heWJlRG9jdW1lbnQsXG4gIFNlcnZlclNjb3BlLFxufSBmcm9tIFwibmFub1wiO1xuaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIERlY29yYXRpb24sXG4gIE1vZGVsLFxuICBwcm9wTWV0YWRhdGEsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IE5hbm9GbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFJlbGF0aW9uc01ldGFkYXRhLFxuICBSZXBvLFxuICBSZXBvc2l0b3J5LFxuICBVbnN1cHBvcnRlZEVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZWRCeU9uTmFub0NyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBDLCBGPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuICBGIGV4dGVuZHMgTmFub0ZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxOYW5vRmxhZ3M+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHVzZXIgPSBjb250ZXh0LmdldChcInVzZXJcIik7XG4gIGlmICghdXNlciB8fCAhdXNlci5uYW1lKVxuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgXCJUaGlzIGFkYXB0ZXIgZG9lcyBub3Qgc3VwcG9ydCB1c2VyIGlkZW50aWZpY2F0aW9uXCJcbiAgICApO1xuICBtb2RlbFtrZXldID0gdXNlci5uYW1lIGFzIE1bdHlwZW9mIGtleV07XG59XG5cbmNvbnN0IGNyZWF0ZWRCeUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKTtcbmNvbnN0IHVwZGF0ZWRCeUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5VUERBVEVEX0JZKTtcblxuZXhwb3J0IGNsYXNzIE5hbm9BZGFwdGVyIGV4dGVuZHMgQ291Y2hEQkFkYXB0ZXI8XG4gIERvY3VtZW50U2NvcGU8YW55PixcbiAgTmFub0ZsYWdzLFxuICBDb250ZXh0PE5hbm9GbGFncz5cbj4ge1xuICBjb25zdHJ1Y3RvcihzY29wZTogRG9jdW1lbnRTY29wZTxhbnk+LCBmbGF2b3VyOiBzdHJpbmcgPSBcIm5hbm9cIikge1xuICAgIHN1cGVyKHNjb3BlLCBmbGF2b3VyKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFwibmFub1wiKVxuICAgICAgLmZvcihjcmVhdGVkQnlLZXkpXG4gICAgICAuZGVmaW5lKFxuICAgICAgICBvbkNyZWF0ZShjcmVhdGVkQnlPbk5hbm9DcmVhdGVVcGRhdGUpLFxuICAgICAgICBwcm9wTWV0YWRhdGEoY3JlYXRlZEJ5S2V5LCB7fSlcbiAgICAgIClcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhcIm5hbm9cIilcbiAgICAgIC5mb3IodXBkYXRlZEJ5S2V5KVxuICAgICAgLmRlZmluZShcbiAgICAgICAgb25DcmVhdGUoY3JlYXRlZEJ5T25OYW5vQ3JlYXRlVXBkYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKHVwZGF0ZWRCeUtleSwge30pXG4gICAgICApXG4gICAgICAuYXBwbHkoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBpbmRleDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIC4uLm1vZGVsczogQ29uc3RydWN0b3I8TT5bXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbmRleGVzOiBDcmVhdGVJbmRleFJlcXVlc3RbXSA9IGdlbmVyYXRlSW5kZXhlcyhtb2RlbHMpO1xuICAgIGZvciAoY29uc3QgaW5kZXggb2YgaW5kZXhlcykge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5uYXRpdmUuY3JlYXRlSW5kZXgoaW5kZXgpO1xuICAgICAgY29uc3QgeyByZXN1bHQsIGlkLCBuYW1lIH0gPSByZXM7XG4gICAgICBpZiAocmVzdWx0ID09PSBcImV4aXN0aW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBDb25mbGljdEVycm9yKGBJbmRleCBmb3IgdGFibGUgJHtuYW1lfSB3aXRoIGlkICR7aWR9YCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY3JlYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgbGV0IHJlc3BvbnNlOiBEb2N1bWVudEluc2VydFJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMubmF0aXZlLmluc2VydChtb2RlbCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuXG4gICAgaWYgKCFyZXNwb25zZS5vaylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIGluc2VydCBkb2MgaWQ6ICR7aWR9IGluIHRhYmxlICR7dGFibGVOYW1lfWBcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuYXNzaWduTWV0YWRhdGEobW9kZWwsIHJlc3BvbnNlLnJldik7XG4gIH1cblxuICBhc3luYyBjcmVhdGVBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWRzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgbGV0IHJlc3BvbnNlOiBEb2N1bWVudEJ1bGtSZXNwb25zZVtdO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMubmF0aXZlLmJ1bGsoeyBkb2NzOiBtb2RlbHMgfSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIGlmICghcmVzcG9uc2UuZXZlcnkoKHIpID0+ICFyLmVycm9yKSkge1xuICAgICAgY29uc3QgZXJyb3JzID0gcmVzcG9uc2UucmVkdWNlKChhY2N1bTogc3RyaW5nW10sIGVsLCBpKSA9PiB7XG4gICAgICAgIGlmIChlbC5lcnJvcilcbiAgICAgICAgICBhY2N1bS5wdXNoKFxuICAgICAgICAgICAgYGVsICR7aX06ICR7ZWwuZXJyb3J9JHtlbC5yZWFzb24gPyBgIC0gJHtlbC5yZWFzb259YCA6IFwiXCJ9YFxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIFtdKTtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGVycm9ycy5qb2luKFwiXFxuXCIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NdWx0aXBsZU1ldGFkYXRhKFxuICAgICAgbW9kZWxzLFxuICAgICAgcmVzcG9uc2UubWFwKChyKSA9PiByLnJldiBhcyBzdHJpbmcpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHJlYWQoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlclxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBfaWQgPSB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCk7XG4gICAgbGV0IHJlY29yZDogRG9jdW1lbnRHZXRSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVjb3JkID0gYXdhaXQgdGhpcy5uYXRpdmUuZ2V0KF9pZCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFzc2lnbk1ldGFkYXRhKHJlY29yZCwgcmVjb3JkLl9yZXYpO1xuICB9XG5cbiAgYXN5bmMgcmVhZEFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IChzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpW11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5uYXRpdmUuZmV0Y2goXG4gICAgICB7IGtleXM6IGlkcy5tYXAoKGlkKSA9PiB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCBhcyBhbnkpKSB9LFxuICAgICAge31cbiAgICApO1xuICAgIHJldHVybiByZXN1bHRzLnJvd3MubWFwKChyKSA9PiB7XG4gICAgICBpZiAoKHIgYXMgYW55KS5lcnJvcikgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKHIgYXMgYW55KS5lcnJvcik7XG4gICAgICBpZiAoKHIgYXMgYW55KS5kb2MpIHtcbiAgICAgICAgY29uc3QgcmVzID0gT2JqZWN0LmFzc2lnbih7fSwgKHIgYXMgYW55KS5kb2MpO1xuICAgICAgICByZXR1cm4gdGhpcy5hc3NpZ25NZXRhZGF0YShyZXMsIChyIGFzIGFueSkuZG9jW0NvdWNoREJLZXlzLlJFVl0pO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJTaG91bGQgYmUgaW1wb3NzaWJsZVwiKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGxldCByZXNwb25zZTogRG9jdW1lbnRJbnNlcnRSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm5hdGl2ZS5pbnNlcnQobW9kZWwpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cblxuICAgIGlmICghcmVzcG9uc2Uub2spXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byB1cGRhdGUgZG9jIGlkOiAke2lkfSBpbiB0YWJsZSAke3RhYmxlTmFtZX1gXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLmFzc2lnbk1ldGFkYXRhKG1vZGVsLCByZXNwb25zZS5yZXYpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGxldCByZXNwb25zZTogRG9jdW1lbnRCdWxrUmVzcG9uc2VbXTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm5hdGl2ZS5idWxrKHsgZG9jczogbW9kZWxzIH0pO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICBpZiAoIXJlc3BvbnNlLmV2ZXJ5KChyKSA9PiAhci5lcnJvcikpIHtcbiAgICAgIGNvbnN0IGVycm9ycyA9IHJlc3BvbnNlLnJlZHVjZSgoYWNjdW06IHN0cmluZ1tdLCBlbCwgaSkgPT4ge1xuICAgICAgICBpZiAoZWwuZXJyb3IpXG4gICAgICAgICAgYWNjdW0ucHVzaChcbiAgICAgICAgICAgIGBlbCAke2l9OiAke2VsLmVycm9yfSR7ZWwucmVhc29uID8gYCAtICR7ZWwucmVhc29ufWAgOiBcIlwifWBcbiAgICAgICAgICApO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LCBbXSk7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlcnJvcnMuam9pbihcIlxcblwiKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYXNzaWduTXVsdGlwbGVNZXRhZGF0YShcbiAgICAgIG1vZGVscyxcbiAgICAgIHJlc3BvbnNlLm1hcCgocikgPT4gci5yZXYgYXMgc3RyaW5nKVxuICAgICk7XG4gIH1cblxuICBhc3luYyBkZWxldGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlclxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBfaWQgPSB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCk7XG4gICAgbGV0IHJlY29yZDogRG9jdW1lbnRHZXRSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVjb3JkID0gYXdhaXQgdGhpcy5uYXRpdmUuZ2V0KF9pZCk7XG4gICAgICBhd2FpdCB0aGlzLm5hdGl2ZS5kZXN0cm95KF9pZCwgcmVjb3JkLl9yZXYpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NZXRhZGF0YShyZWNvcmQsIHJlY29yZC5fcmV2KTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IChzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpW11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5uYXRpdmUuZmV0Y2goXG4gICAgICB7IGtleXM6IGlkcy5tYXAoKGlkKSA9PiB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCBhcyBhbnkpKSB9LFxuICAgICAge31cbiAgICApO1xuICAgIGNvbnN0IGRlbGV0aW9uOiBEb2N1bWVudEJ1bGtSZXNwb25zZVtdID0gYXdhaXQgdGhpcy5uYXRpdmUuYnVsayh7XG4gICAgICBkb2NzOiByZXN1bHRzLnJvd3MubWFwKChyKSA9PiB7XG4gICAgICAgIChyIGFzIGFueSlbQ291Y2hEQktleXMuREVMRVRFRF0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIGRlbGV0aW9uLmZvckVhY2goKGQ6IERvY3VtZW50QnVsa1Jlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZC5lcnJvcikgY29uc29sZS5lcnJvcihkLmVycm9yKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0cy5yb3dzLm1hcCgocikgPT4ge1xuICAgICAgaWYgKChyIGFzIGFueSkuZXJyb3IpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKChyIGFzIGFueSkuZXJyb3IpO1xuICAgICAgaWYgKChyIGFzIGFueSkuZG9jKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IE9iamVjdC5hc3NpZ24oe30sIChyIGFzIGFueSkuZG9jKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXNzaWduTWV0YWRhdGEocmVzLCAociBhcyBhbnkpLmRvY1tDb3VjaERCS2V5cy5SRVZdKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiU2hvdWxkIGJlIGltcG9zc2libGVcIik7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyByYXc8Vj4ocmF3SW5wdXQ6IE1hbmdvUXVlcnksIHByb2Nlc3MgPSB0cnVlKTogUHJvbWlzZTxWPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBNYW5nb1Jlc3BvbnNlPFY+ID0gYXdhaXQgdGhpcy5uYXRpdmUuZmluZChyYXdJbnB1dCk7XG4gICAgICBpZiAocmVzcG9uc2Uud2FybmluZykgY29uc29sZS53YXJuKHJlc3BvbnNlLndhcm5pbmcpO1xuICAgICAgaWYgKHByb2Nlc3MpIHJldHVybiByZXNwb25zZS5kb2NzIGFzIFY7XG4gICAgICByZXR1cm4gcmVzcG9uc2UgYXMgVjtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgY29ubmVjdChcbiAgICB1c2VyOiBzdHJpbmcsXG4gICAgcGFzczogc3RyaW5nLFxuICAgIGhvc3QgPSBcImxvY2FsaG9zdDo1OTg0XCIsXG4gICAgcHJvdG9jb2w6IFwiaHR0cFwiIHwgXCJodHRwc1wiID0gXCJodHRwXCJcbiAgKTogU2VydmVyU2NvcGUge1xuICAgIHJldHVybiBOYW5vKGAke3Byb3RvY29sfTovLyR7dXNlcn06JHtwYXNzfUAke2hvc3R9YCk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY3JlYXRlRGF0YWJhc2UoY29uOiBTZXJ2ZXJTY29wZSwgbmFtZTogc3RyaW5nKSB7XG4gICAgbGV0IHJlc3VsdDogYW55O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCBjb24uZGIuY3JlYXRlKG5hbWUpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgQ291Y2hEQkFkYXB0ZXIucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgY29uc3QgeyBvaywgZXJyb3IsIHJlYXNvbiB9ID0gcmVzdWx0O1xuICAgIGlmICghb2spIHRocm93IENvdWNoREJBZGFwdGVyLnBhcnNlRXJyb3IoZXJyb3IgYXMgc3RyaW5nLCByZWFzb24pO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGRlbGV0ZURhdGFiYXNlKGNvbjogU2VydmVyU2NvcGUsIG5hbWU6IHN0cmluZykge1xuICAgIGxldCByZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IGNvbi5kYi5kZXN0cm95KG5hbWUpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgQ291Y2hEQkFkYXB0ZXIucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgY29uc3QgeyBvayB9ID0gcmVzdWx0O1xuICAgIGlmICghb2spXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIGRlbGV0ZSBkYXRhYmFzZSB3aXRoIG5hbWUgJHtuYW1lfWApO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGNyZWF0ZVVzZXIoXG4gICAgY29uOiBTZXJ2ZXJTY29wZSxcbiAgICBkYk5hbWU6IHN0cmluZyxcbiAgICB1c2VyOiBzdHJpbmcsXG4gICAgcGFzczogc3RyaW5nLFxuICAgIHJvbGVzOiBzdHJpbmdbXSA9IFtcInJlYWRlclwiLCBcIndyaXRlclwiXVxuICApIHtcbiAgICBjb25zdCB1c2VycyA9IGNvbi5kYi51c2UoXCJfdXNlcnNcIik7XG4gICAgY29uc3QgdXNyID0ge1xuICAgICAgX2lkOiBcIm9yZy5jb3VjaGRiLnVzZXI6XCIgKyB1c2VyLFxuICAgICAgbmFtZTogdXNlcixcbiAgICAgIHBhc3N3b3JkOiBwYXNzLFxuICAgICAgcm9sZXM6IHJvbGVzLFxuICAgICAgdHlwZTogXCJ1c2VyXCIsXG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY3JlYXRlZDogRG9jdW1lbnRJbnNlcnRSZXNwb25zZSA9IGF3YWl0IHVzZXJzLmluc2VydChcbiAgICAgICAgdXNyIGFzIE1heWJlRG9jdW1lbnRcbiAgICAgICk7XG4gICAgICBjb25zdCB7IG9rIH0gPSBjcmVhdGVkO1xuICAgICAgaWYgKCFvaykgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgdXNlciAke3VzZXJ9YCk7XG4gICAgICBjb25zdCBzZWN1cml0eTogYW55ID0gYXdhaXQgY29uLnJlcXVlc3Qoe1xuICAgICAgICBkYjogZGJOYW1lLFxuICAgICAgICBtZXRob2Q6IFwicHV0XCIsXG4gICAgICAgIHBhdGg6IFwiX3NlY3VyaXR5XCIsXG4gICAgICAgIC8vIGhlYWRlcnM6IHtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gfSxcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIGFkbWluczoge1xuICAgICAgICAgICAgbmFtZXM6IFt1c2VyXSxcbiAgICAgICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1lbWJlcnM6IHtcbiAgICAgICAgICAgIG5hbWVzOiBbdXNlcl0sXG4gICAgICAgICAgICByb2xlczogcm9sZXMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFzZWN1cml0eS5vaylcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBhdXRob3JpemUgdXNlciAke3VzZXJ9IHRvIGRiICR7ZGJOYW1lfWBcbiAgICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IENvdWNoREJBZGFwdGVyLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIGRlbGV0ZVVzZXIoY29uOiBTZXJ2ZXJTY29wZSwgZGJOYW1lOiBzdHJpbmcsIHVzZXI6IHN0cmluZykge1xuICAgIGNvbnN0IHVzZXJzID0gY29uLmRiLnVzZShcIl91c2Vyc1wiKTtcbiAgICBjb25zdCBpZCA9IFwib3JnLmNvdWNoZGIudXNlcjpcIiArIHVzZXI7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVzciA9IGF3YWl0IHVzZXJzLmdldChpZCk7XG4gICAgICBhd2FpdCB1c2Vycy5kZXN0cm95KGlkLCB1c3IuX3Jldik7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBDb3VjaERCQWRhcHRlci5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0ICogZnJvbSBcIi4vYWRhcHRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vTmFub1JlcG9zaXRvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgTW9kdWxlIHN1bW1hcnlcbiAqIEBkZXNjcmlwdGlvbiBNb2R1bGUgZGVzY3JpcHRpb25cbiAqIEBtb2R1bGUgZm9yLW5hbm9cbiAqL1xuXG4vKipcbiAqIEBzdW1tYXJ5IHN0b3JlcyB0aGUgY3VycmVudCBwYWNrYWdlIHZlcnNpb25cbiAqIEBkZXNjcmlwdGlvbiB0aGlzIGlzIGhvdyB5b3Ugc2hvdWxkIGRvY3VtZW50IGEgY29uc3RhbnRcbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnRzLXdvcmtzcGFjZVxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdLCJuYW1lcyI6WyJVbnN1cHBvcnRlZEVycm9yIiwiUmVwb3NpdG9yeSIsIlBlcnNpc3RlbmNlS2V5cyIsIkNvdWNoREJBZGFwdGVyIiwiRGVjb3JhdGlvbiIsIm9uQ3JlYXRlIiwicHJvcE1ldGFkYXRhIiwiZ2VuZXJhdGVJbmRleGVzIiwiQ29uZmxpY3RFcnJvciIsIkludGVybmFsRXJy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
392
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLW5hbm8uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL05hbm9EaXNwYXRjaC50cyIsIi4uL3NyYy9hZGFwdGVyLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBOYW5vRmxhdm91ciA9IFwibmFub1wiO1xuIiwiaW1wb3J0IHsgRGlzcGF0Y2ggfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7XG4gIERhdGFiYXNlQ2hhbmdlc1Jlc3BvbnNlLFxuICBEYXRhYmFzZUNoYW5nZXNSZXN1bHRJdGVtLFxuICBEb2N1bWVudFNjb3BlLFxuICBSZXF1ZXN0RXJyb3IsXG59IGZyb20gXCJuYW5vXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yLCBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb3VjaERCS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcblxuZXhwb3J0IGNsYXNzIE5hbm9EaXNwYXRjaCBleHRlbmRzIERpc3BhdGNoPERvY3VtZW50U2NvcGU8YW55Pj4ge1xuICBwcml2YXRlIG9ic2VydmVyTGFzdFVwZGF0ZT86IHN0cmluZztcbiAgcHJpdmF0ZSBhdHRlbXB0Q291bnRlcjogbnVtYmVyID0gMDtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB0aW1lb3V0ID0gNTAwMCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2hhbmdlSGFuZGxlcihcbiAgICBlcnJvcjogUmVxdWVzdEVycm9yIHwgbnVsbCxcbiAgICByZXNwb25zZTogKERhdGFiYXNlQ2hhbmdlc1Jlc3BvbnNlIHwgRGF0YWJhc2VDaGFuZ2VzUmVzdWx0SXRlbSlbXSB8IHN0cmluZyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgaGVhZGVycz86IGFueVxuICApIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5jaGFuZ2VIYW5kbGVyKTtcbiAgICBpZiAoZXJyb3IpIHJldHVybiBsb2cuZXJyb3IoYEVycm9yIGluIGNoYW5nZSByZXF1ZXN0OiAke2Vycm9yfWApO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IChcbiAgICAgICAgdHlwZW9mIHJlc3BvbnNlID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyByZXNwb25zZVxuICAgICAgICAgICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgICAgICAgICAgLmZpbHRlcigocikgPT4gISFyKVxuICAgICAgICAgICAgICAubWFwKChyKSA9PiBKU09OLnBhcnNlKHIpKVxuICAgICAgICAgIDogcmVzcG9uc2VcbiAgICAgICkgYXMgRGF0YWJhc2VDaGFuZ2VzUmVzcG9uc2VbXTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICByZXR1cm4gbG9nLmVycm9yKGBFcnJvciBwYXJzaW5nIGNvdWNoZGIgY2hhbmdlIGZlZWQ6ICR7ZX1gKTtcbiAgICB9XG4gICAgY29uc3QgY291bnQgPSByZXNwb25zZS5sZW5ndGg7XG4gICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgbG9nLmRlYnVnKGBSZWNlaXZlZCAke2NvdW50fSBjaGFuZ2VzLiBwcm9jZXNzaW5nLi4uYCk7XG4gICAgICBjb25zdCBjaGFuZ2VzID0gcmVzcG9uc2VcbiAgICAgICAgLm1hcCgocmVjLCBpKSA9PiB7XG4gICAgICAgICAgaWYgKGkgPT09IGNvdW50IC0gMSkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB0aGlzLm9ic2VydmVyTGFzdFVwZGF0ZSA9PT1cbiAgICAgICAgICAgICAgKHJlYyBhcyBEYXRhYmFzZUNoYW5nZXNSZXNwb25zZSkubGFzdF9zZXFcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgICAgICAgIGBJbnZhbGlkIGxhc3QgdXBkYXRlIGNoZWNrOiAke3RoaXMub2JzZXJ2ZXJMYXN0VXBkYXRlfSAhPT0gJHsocmVjIGFzIERhdGFiYXNlQ2hhbmdlc1Jlc3BvbnNlKS5sYXN0X3NlcX1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHIgPSByZWMgYXMgRGF0YWJhc2VDaGFuZ2VzUmVzdWx0SXRlbTtcbiAgICAgICAgICBjb25zdCBbdGFibGUsIGlkXSA9IHIuaWQuc3BsaXQoQ291Y2hEQktleXMuU0VQQVJBVE9SKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGFibGU6IHRhYmxlLFxuICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgb3BlcmF0aW9uOiByLmRlbGV0ZWRcbiAgICAgICAgICAgICAgPyBPcGVyYXRpb25LZXlzLkRFTEVURVxuICAgICAgICAgICAgICA6IHIuY2hhbmdlc1tyLmNoYW5nZXMubGVuZ3RoIC0gMV0ucmV2LnNwbGl0KFwiLVwiKVswXSA9PT0gXCIxXCJcbiAgICAgICAgICAgICAgICA/IE9wZXJhdGlvbktleXMuQ1JFQVRFXG4gICAgICAgICAgICAgICAgOiBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgICAgICAgIHN0ZXA6IHIuY2hhbmdlc1tyLmNoYW5nZXMubGVuZ3RoIC0gMV0ucmV2LFxuICAgICAgICAgIH07XG4gICAgICAgIH0pXG4gICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgKFxuICAgICAgICAgICAgYWNjdW06IFJlY29yZDxcbiAgICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgICBSZWNvcmQ8XG4gICAgICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlkczogU2V0PGFueT47XG4gICAgICAgICAgICAgICAgICBzdGVwOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICA+LFxuICAgICAgICAgICAgclxuICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgaWYgKCFyKSByZXR1cm4gYWNjdW07XG4gICAgICAgICAgICBjb25zdCB7IHRhYmxlLCBpZCwgb3BlcmF0aW9uLCBzdGVwIH0gPSByIGFzIHtcbiAgICAgICAgICAgICAgdGFibGU6IHN0cmluZztcbiAgICAgICAgICAgICAgaWQ6IHN0cmluZztcbiAgICAgICAgICAgICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzO1xuICAgICAgICAgICAgICBzdGVwOiBzdHJpbmc7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKCFhY2N1bVt0YWJsZV0pIGFjY3VtW3RhYmxlXSA9IHt9O1xuICAgICAgICAgICAgaWYgKCFhY2N1bVt0YWJsZV1bb3BlcmF0aW9uXSlcbiAgICAgICAgICAgICAgYWNjdW1bdGFibGVdW29wZXJhdGlvbl0gPSB7IGlkczogbmV3IFNldCgpLCBzdGVwOiBzdGVwIH07XG4gICAgICAgICAgICBhY2N1bVt0YWJsZV1bb3BlcmF0aW9uXS5pZHMuYWRkKGlkKTtcbiAgICAgICAgICAgIGFjY3VtW3RhYmxlXVtvcGVyYXRpb25dLnN0ZXAgPSBzdGVwO1xuICAgICAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgICAgIH0sXG4gICAgICAgICAge31cbiAgICAgICAgKTtcblxuICAgICAgZm9yIChjb25zdCB0YWJsZSBvZiBPYmplY3Qua2V5cyhjaGFuZ2VzKSkge1xuICAgICAgICBmb3IgKGNvbnN0IG9wIG9mIE9iamVjdC5rZXlzKGNoYW5nZXNbdGFibGVdKSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZU9ic2VydmVycyh0YWJsZSwgb3AsIFtcbiAgICAgICAgICAgICAgLi4uY2hhbmdlc1t0YWJsZV1bb3BdLmlkcy52YWx1ZXMoKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgdGhpcy5vYnNlcnZlckxhc3RVcGRhdGUgPSBjaGFuZ2VzW3RhYmxlXVtvcF0uc3RlcDtcbiAgICAgICAgICAgIGxvZy52ZXJib3NlKGBPYnNlcnZlciByZWZyZXNoIGRpc3BhdGNoZWQgYnkgJHtvcH0gZm9yICR7dGFibGV9YCk7XG4gICAgICAgICAgICBsb2cuZGVidWcoYHBrczogJHtBcnJheS5mcm9tKGNoYW5nZXNbdGFibGVdW29wXS5pZHMudmFsdWVzKCkpfWApO1xuICAgICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBkaXNwYXRjaCBvYnNlcnZlciByZWZyZXNoIGZvciAke3RhYmxlfSwgb3AgJHtvcH06ICR7ZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgIGFzeW5jIGZ1bmN0aW9uIHN1YnNjcmliZVRvQ291Y2godGhpczogTmFub0Rpc3BhdGNoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3Ioc3Vic2NyaWJlVG9Db3VjaCk7XG4gICAgICBpZiAoIXRoaXMuYWRhcHRlciB8fCAhdGhpcy5uYXRpdmUpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBhZGFwdGVyL25hdGl2ZSBvYnNlcnZlZCBmb3IgZGlzcGF0Y2hgKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5uYXRpdmUuY2hhbmdlcyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmZWVkOiBcImNvbnRpbnVvdXNcIixcbiAgICAgICAgICAgIGluY2x1ZGVfZG9jczogZmFsc2UsXG4gICAgICAgICAgICBzaW5jZTogdGhpcy5vYnNlcnZlckxhc3RVcGRhdGUgfHwgXCJub3dcIixcbiAgICAgICAgICAgIHRpbWVvdXQ6IHRoaXMudGltZW91dCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRoaXMuY2hhbmdlSGFuZGxlci5iaW5kKHRoaXMpIGFzIGFueVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBpZiAoKyt0aGlzLmF0dGVtcHRDb3VudGVyID4gMylcbiAgICAgICAgICByZXR1cm4gbG9nLmVycm9yKGBGYWlsZWQgdG8gc3Vic2NyaWJlIHRvIGNvdWNoZGIgY2hhbmdlczogJHtlfWApO1xuICAgICAgICBsb2cuaW5mbyhcbiAgICAgICAgICBgRmFpbGVkIHRvIHN1YnNjcmliZSB0byBjb3VjaGRiIGNoYW5nZXM6ICR7ZX0uIFJldHJ5aW5nIGluIDUgc2Vjb25kcy4uLmBcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgdGhpcy50aW1lb3V0KSk7XG4gICAgICAgIHJldHVybiBzdWJzY3JpYmVUb0NvdWNoLmNhbGwodGhpcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3Vic2NyaWJlVG9Db3VjaFxuICAgICAgLmNhbGwodGhpcylcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgU3Vic2NyaWJlZCB0byBjb3VjaGRiIGNoYW5nZXNgKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGU6IHVua25vd24pID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byBzdWJzY3JpYmUgdG8gY291Y2hkYiBjaGFuZ2VzOiAke2V9YCk7XG4gICAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ29uZmxpY3RFcnJvcixcbiAgQ29udGV4dCxcbiAgSW50ZXJuYWxFcnJvcixcbiAgb25DcmVhdGUsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YVwiO1xuaW1wb3J0IHtcbiAgQ291Y2hEQkFkYXB0ZXIsXG4gIENvdWNoREJLZXlzLFxuICBDcmVhdGVJbmRleFJlcXVlc3QsXG4gIGdlbmVyYXRlSW5kZXhlcyxcbiAgTWFuZ29RdWVyeSxcbiAgTWFuZ29SZXNwb25zZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuaW1wb3J0IE5hbm8gZnJvbSBcIm5hbm9cIjtcbmltcG9ydCB7XG4gIERvY3VtZW50QnVsa1Jlc3BvbnNlLFxuICBEb2N1bWVudEdldFJlc3BvbnNlLFxuICBEb2N1bWVudEluc2VydFJlc3BvbnNlLFxuICBEb2N1bWVudFNjb3BlLFxuICBNYXliZURvY3VtZW50LFxuICBTZXJ2ZXJTY29wZSxcbn0gZnJvbSBcIm5hbm9cIjtcbmltcG9ydCB7XG4gIENvbnN0cnVjdG9yLFxuICBEZWNvcmF0aW9uLFxuICBNb2RlbCxcbiAgcHJvcE1ldGFkYXRhLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBOYW5vRmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgUmVwb3NpdG9yeSxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBOYW5vRmxhdm91ciB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTmFub1JlcG9zaXRvcnkgfSBmcm9tIFwiLi9OYW5vUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgTmFub0Rpc3BhdGNoIH0gZnJvbSBcIi4vTmFub0Rpc3BhdGNoXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVkQnlPbk5hbm9DcmVhdGVVcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIE5hbm9SZXBvc2l0b3J5PE0+LFxuICBWIGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGEsXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PE5hbm9GbGFncz4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHVzZXIgPSBjb250ZXh0LmdldChcInVzZXJcIik7XG4gICAgbW9kZWxba2V5XSA9IHVzZXIubmFtZSBhcyBNW3R5cGVvZiBrZXldO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgXCJObyBVc2VyIGZvdW5kIGluIGNvbnRleHQuIFBsZWFzZSBwcm92aWRlIGEgdXNlciBpbiB0aGUgY29udGV4dFwiXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTmFub0FkYXB0ZXIgZXh0ZW5kcyBDb3VjaERCQWRhcHRlcjxcbiAgRG9jdW1lbnRTY29wZTxhbnk+LFxuICBOYW5vRmxhZ3MsXG4gIENvbnRleHQ8TmFub0ZsYWdzPlxuPiB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBEb2N1bWVudFNjb3BlPGFueT4sIGFsaWFzPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIE5hbm9GbGF2b3VyLCBhbGlhcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMsXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIGZsYWdzOiBQYXJ0aWFsPE5hbm9GbGFncz5cbiAgKTogTmFub0ZsYWdzIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihzdXBlci5mbGFncyhvcGVyYXRpb24sIG1vZGVsLCBmbGFncyksIHtcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgbmFtZTogdGhpcy5uYXRpdmUuY29uZmlnLnVybC5zcGxpdChcIkBcIilbMF0uc3BsaXQoXCI6XCIpWzBdLFxuICAgICAgfSxcbiAgICB9KSBhcyBOYW5vRmxhZ3M7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgRGlzcGF0Y2goKTogTmFub0Rpc3BhdGNoIHtcbiAgICByZXR1cm4gbmV3IE5hbm9EaXNwYXRjaCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGluZGV4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgLi4ubW9kZWxzOiBDb25zdHJ1Y3RvcjxNPltdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGluZGV4ZXM6IENyZWF0ZUluZGV4UmVxdWVzdFtdID0gZ2VuZXJhdGVJbmRleGVzKG1vZGVscyk7XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm5hdGl2ZS5jcmVhdGVJbmRleChpbmRleCk7XG4gICAgICBjb25zdCB7IHJlc3VsdCwgaWQsIG5hbWUgfSA9IHJlcztcbiAgICAgIGlmIChyZXN1bHQgPT09IFwiZXhpc3RpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IENvbmZsaWN0RXJyb3IoYEluZGV4IGZvciB0YWJsZSAke25hbWV9IHdpdGggaWQgJHtpZH1gKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjcmVhdGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBsZXQgcmVzcG9uc2U6IERvY3VtZW50SW5zZXJ0UmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5uYXRpdmUuaW5zZXJ0KG1vZGVsKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gaW5zZXJ0IGRvYyBpZDogJHtpZH0gaW4gdGFibGUgJHt0YWJsZU5hbWV9YFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NZXRhZGF0YShtb2RlbCwgcmVzcG9uc2UucmV2KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBsZXQgcmVzcG9uc2U6IERvY3VtZW50QnVsa1Jlc3BvbnNlW107XG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5uYXRpdmUuYnVsayh7IGRvY3M6IG1vZGVscyB9KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgaWYgKCFyZXNwb25zZS5ldmVyeSgocikgPT4gIXIuZXJyb3IpKSB7XG4gICAgICBjb25zdCBlcnJvcnMgPSByZXNwb25zZS5yZWR1Y2UoKGFjY3VtOiBzdHJpbmdbXSwgZWwsIGkpID0+IHtcbiAgICAgICAgaWYgKGVsLmVycm9yKVxuICAgICAgICAgIGFjY3VtLnB1c2goXG4gICAgICAgICAgICBgZWwgJHtpfTogJHtlbC5lcnJvcn0ke2VsLnJlYXNvbiA/IGAgLSAke2VsLnJlYXNvbn1gIDogXCJcIn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSwgW10pO1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZXJyb3JzLmpvaW4oXCJcXG5cIikpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFzc2lnbk11bHRpcGxlTWV0YWRhdGEoXG4gICAgICBtb2RlbHMsXG4gICAgICByZXNwb25zZS5tYXAoKHIpID0+IHIucmV2IGFzIHN0cmluZylcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IF9pZCA9IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkKTtcbiAgICBsZXQgcmVjb3JkOiBEb2N1bWVudEdldFJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZWNvcmQgPSBhd2FpdCB0aGlzLm5hdGl2ZS5nZXQoX2lkKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYXNzaWduTWV0YWRhdGEocmVjb3JkLCByZWNvcmQuX3Jldik7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyByZWFkQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludClbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLm5hdGl2ZS5mZXRjaChcbiAgICAgIHsga2V5czogaWRzLm1hcCgoaWQpID0+IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkIGFzIGFueSkpIH0sXG4gICAgICB7fVxuICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdHMucm93cy5tYXAoKHIpID0+IHtcbiAgICAgIGlmICgociBhcyBhbnkpLmVycm9yKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigociBhcyBhbnkpLmVycm9yKTtcbiAgICAgIGlmICgociBhcyBhbnkpLmRvYykge1xuICAgICAgICBjb25zdCByZXMgPSBPYmplY3QuYXNzaWduKHt9LCAociBhcyBhbnkpLmRvYyk7XG4gICAgICAgIHJldHVybiB0aGlzLmFzc2lnbk1ldGFkYXRhKHJlcywgKHIgYXMgYW55KS5kb2NbQ291Y2hEQktleXMuUkVWXSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIlNob3VsZCBiZSBpbXBvc3NpYmxlXCIpO1xuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgbGV0IHJlc3BvbnNlOiBEb2N1bWVudEluc2VydFJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMubmF0aXZlLmluc2VydChtb2RlbCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuXG4gICAgaWYgKCFyZXNwb25zZS5vaylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIHVwZGF0ZSBkb2MgaWQ6ICR7aWR9IGluIHRhYmxlICR7dGFibGVOYW1lfWBcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuYXNzaWduTWV0YWRhdGEobW9kZWwsIHJlc3BvbnNlLnJldik7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyB1cGRhdGVBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWRzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgbGV0IHJlc3BvbnNlOiBEb2N1bWVudEJ1bGtSZXNwb25zZVtdO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMubmF0aXZlLmJ1bGsoeyBkb2NzOiBtb2RlbHMgfSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIGlmICghcmVzcG9uc2UuZXZlcnkoKHIpID0+ICFyLmVycm9yKSkge1xuICAgICAgY29uc3QgZXJyb3JzID0gcmVzcG9uc2UucmVkdWNlKChhY2N1bTogc3RyaW5nW10sIGVsLCBpKSA9PiB7XG4gICAgICAgIGlmIChlbC5lcnJvcilcbiAgICAgICAgICBhY2N1bS5wdXNoKFxuICAgICAgICAgICAgYGVsICR7aX06ICR7ZWwuZXJyb3J9JHtlbC5yZWFzb24gPyBgIC0gJHtlbC5yZWFzb259YCA6IFwiXCJ9YFxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIFtdKTtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGVycm9ycy5qb2luKFwiXFxuXCIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NdWx0aXBsZU1ldGFkYXRhKFxuICAgICAgbW9kZWxzLFxuICAgICAgcmVzcG9uc2UubWFwKChyKSA9PiByLnJldiBhcyBzdHJpbmcpXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IF9pZCA9IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkKTtcbiAgICBsZXQgcmVjb3JkOiBEb2N1bWVudEdldFJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZWNvcmQgPSBhd2FpdCB0aGlzLm5hdGl2ZS5nZXQoX2lkKTtcbiAgICAgIGF3YWl0IHRoaXMubmF0aXZlLmRlc3Ryb3koX2lkLCByZWNvcmQuX3Jldik7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFzc2lnbk1ldGFkYXRhKHJlY29yZCwgcmVjb3JkLl9yZXYpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludClbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLm5hdGl2ZS5mZXRjaChcbiAgICAgIHsga2V5czogaWRzLm1hcCgoaWQpID0+IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkIGFzIGFueSkpIH0sXG4gICAgICB7fVxuICAgICk7XG4gICAgY29uc3QgZGVsZXRpb246IERvY3VtZW50QnVsa1Jlc3BvbnNlW10gPSBhd2FpdCB0aGlzLm5hdGl2ZS5idWxrKHtcbiAgICAgIGRvY3M6IHJlc3VsdHMucm93cy5tYXAoKHIpID0+IHtcbiAgICAgICAgKHIgYXMgYW55KVtDb3VjaERCS2V5cy5ERUxFVEVEXSA9IHRydWU7XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfSksXG4gICAgfSk7XG4gICAgZGVsZXRpb24uZm9yRWFjaCgoZDogRG9jdW1lbnRCdWxrUmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChkLmVycm9yKSBjb25zb2xlLmVycm9yKGQuZXJyb3IpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHRzLnJvd3MubWFwKChyKSA9PiB7XG4gICAgICBpZiAoKHIgYXMgYW55KS5lcnJvcikgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKHIgYXMgYW55KS5lcnJvcik7XG4gICAgICBpZiAoKHIgYXMgYW55KS5kb2MpIHtcbiAgICAgICAgY29uc3QgcmVzID0gT2JqZWN0LmFzc2lnbih7fSwgKHIgYXMgYW55KS5kb2MpO1xuICAgICAgICByZXR1cm4gdGhpcy5hc3NpZ25NZXRhZGF0YShyZXMsIChyIGFzIGFueSkuZG9jW0NvdWNoREJLZXlzLlJFVl0pO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJTaG91bGQgYmUgaW1wb3NzaWJsZVwiKTtcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHJhdzxSPihyYXdJbnB1dDogTWFuZ29RdWVyeSwgZG9jc09ubHkgPSB0cnVlKTogUHJvbWlzZTxSPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBNYW5nb1Jlc3BvbnNlPFI+ID0gYXdhaXQgdGhpcy5uYXRpdmUuZmluZChyYXdJbnB1dCk7XG4gICAgICBpZiAocmVzcG9uc2Uud2FybmluZykgY29uc29sZS53YXJuKHJlc3BvbnNlLndhcm5pbmcpO1xuICAgICAgaWYgKGRvY3NPbmx5KSByZXR1cm4gcmVzcG9uc2UuZG9jcyBhcyBSO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlIGFzIFI7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGNvbm5lY3QoXG4gICAgdXNlcjogc3RyaW5nLFxuICAgIHBhc3M6IHN0cmluZyxcbiAgICBob3N0ID0gXCJsb2NhbGhvc3Q6NTk4NFwiLFxuICAgIHByb3RvY29sOiBcImh0dHBcIiB8IFwiaHR0cHNcIiA9IFwiaHR0cFwiXG4gICk6IFNlcnZlclNjb3BlIHtcbiAgICByZXR1cm4gTmFubyhgJHtwcm90b2NvbH06Ly8ke3VzZXJ9OiR7cGFzc31AJHtob3N0fWApO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGNyZWF0ZURhdGFiYXNlKGNvbjogU2VydmVyU2NvcGUsIG5hbWU6IHN0cmluZykge1xuICAgIGxldCByZXN1bHQ6IGFueTtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgY29uLmRiLmNyZWF0ZShuYW1lKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IENvdWNoREJBZGFwdGVyLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIGNvbnN0IHsgb2ssIGVycm9yLCByZWFzb24gfSA9IHJlc3VsdDtcbiAgICBpZiAoIW9rKSB0aHJvdyBDb3VjaERCQWRhcHRlci5wYXJzZUVycm9yKGVycm9yIGFzIHN0cmluZywgcmVhc29uKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBkZWxldGVEYXRhYmFzZShjb246IFNlcnZlclNjb3BlLCBuYW1lOiBzdHJpbmcpIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCBjb24uZGIuZGVzdHJveShuYW1lKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IENvdWNoREJBZGFwdGVyLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIGNvbnN0IHsgb2sgfSA9IHJlc3VsdDtcbiAgICBpZiAoIW9rKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byBkZWxldGUgZGF0YWJhc2Ugd2l0aCBuYW1lICR7bmFtZX1gKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBjcmVhdGVVc2VyKFxuICAgIGNvbjogU2VydmVyU2NvcGUsXG4gICAgZGJOYW1lOiBzdHJpbmcsXG4gICAgdXNlcjogc3RyaW5nLFxuICAgIHBhc3M6IHN0cmluZyxcbiAgICByb2xlczogc3RyaW5nW10gPSBbXCJyZWFkZXJcIiwgXCJ3cml0ZXJcIl1cbiAgKSB7XG4gICAgY29uc3QgdXNlcnMgPSBjb24uZGIudXNlKFwiX3VzZXJzXCIpO1xuICAgIGNvbnN0IHVzciA9IHtcbiAgICAgIF9pZDogXCJvcmcuY291Y2hkYi51c2VyOlwiICsgdXNlcixcbiAgICAgIG5hbWU6IHVzZXIsXG4gICAgICBwYXNzd29yZDogcGFzcyxcbiAgICAgIHJvbGVzOiByb2xlcyxcbiAgICAgIHR5cGU6IFwidXNlclwiLFxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNyZWF0ZWQ6IERvY3VtZW50SW5zZXJ0UmVzcG9uc2UgPSBhd2FpdCB1c2Vycy5pbnNlcnQoXG4gICAgICAgIHVzciBhcyBNYXliZURvY3VtZW50XG4gICAgICApO1xuICAgICAgY29uc3QgeyBvayB9ID0gY3JlYXRlZDtcbiAgICAgIGlmICghb2spIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIHVzZXIgJHt1c2VyfWApO1xuICAgICAgY29uc3Qgc2VjdXJpdHk6IGFueSA9IGF3YWl0IGNvbi5yZXF1ZXN0KHtcbiAgICAgICAgZGI6IGRiTmFtZSxcbiAgICAgICAgbWV0aG9kOiBcInB1dFwiLFxuICAgICAgICBwYXRoOiBcIl9zZWN1cml0eVwiLFxuICAgICAgICAvLyBoZWFkZXJzOiB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vIH0sXG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICBhZG1pbnM6IHtcbiAgICAgICAgICAgIG5hbWVzOiBbdXNlcl0sXG4gICAgICAgICAgICByb2xlczogW10sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtZW1iZXJzOiB7XG4gICAgICAgICAgICBuYW1lczogW3VzZXJdLFxuICAgICAgICAgICAgcm9sZXM6IHJvbGVzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGlmICghc2VjdXJpdHkub2spXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gYXV0aG9yaXplIHVzZXIgJHt1c2VyfSB0byBkYiAke2RiTmFtZX1gXG4gICAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBDb3VjaERCQWRhcHRlci5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBkZWxldGVVc2VyKGNvbjogU2VydmVyU2NvcGUsIGRiTmFtZTogc3RyaW5nLCB1c2VyOiBzdHJpbmcpIHtcbiAgICBjb25zdCB1c2VycyA9IGNvbi5kYi51c2UoXCJfdXNlcnNcIik7XG4gICAgY29uc3QgaWQgPSBcIm9yZy5jb3VjaGRiLnVzZXI6XCIgKyB1c2VyO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1c3IgPSBhd2FpdCB1c2Vycy5nZXQoaWQpO1xuICAgICAgYXdhaXQgdXNlcnMuZGVzdHJveShpZCwgdXNyLl9yZXYpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgQ291Y2hEQkFkYXB0ZXIucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZGVjb3JhdGlvbigpIHtcbiAgICBjb25zdCBjcmVhdGVkQnlLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuQ1JFQVRFRF9CWSk7XG4gICAgY29uc3QgdXBkYXRlZEJ5S2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLlVQREFURURfQlkpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoXCJuYW5vXCIpXG4gICAgICAuZm9yKGNyZWF0ZWRCeUtleSlcbiAgICAgIC5kZWZpbmUoXG4gICAgICAgIG9uQ3JlYXRlKGNyZWF0ZWRCeU9uTmFub0NyZWF0ZVVwZGF0ZSksXG4gICAgICAgIHByb3BNZXRhZGF0YShjcmVhdGVkQnlLZXksIHt9KVxuICAgICAgKVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFwibmFub1wiKVxuICAgICAgLmZvcih1cGRhdGVkQnlLZXkpXG4gICAgICAuZGVmaW5lKFxuICAgICAgICBvbkNyZWF0ZShjcmVhdGVkQnlPbk5hbm9DcmVhdGVVcGRhdGUpLFxuICAgICAgICBwcm9wTWV0YWRhdGEodXBkYXRlZEJ5S2V5LCB7fSlcbiAgICAgIClcbiAgICAgIC5hcHBseSgpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOYW5vQWRhcHRlciB9IGZyb20gXCIuL2FkYXB0ZXJcIjtcblxuLy8gRm9yY2VzIG92ZXJyaWRlIGZvciBOYW5vIERlY29yYXRpb25cbk5hbm9BZGFwdGVyLmRlY29yYXRpb24oKTtcblxuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9OYW5vUmVwb3NpdG9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcbi8vIExlZnQgdG8gdGhlIGVuZCBvbiBwdXJwb3NlXG5leHBvcnQgKiBmcm9tIFwiLi9hZGFwdGVyXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgTW9kdWxlIHN1bW1hcnlcbiAqIEBkZXNjcmlwdGlvbiBNb2R1bGUgZGVzY3JpcHRpb25cbiAqIEBtb2R1bGUgZm9yLW5hbm9cbiAqL1xuXG4vKipcbiAqIEBzdW1tYXJ5IHN0b3JlcyB0aGUgY3VycmVudCBwYWNrYWdlIHZlcnNpb25cbiAqIEBkZXNjcmlwdGlvbiB0aGlzIGlzIGhvdyB5b3Ugc2hvdWxkIGRvY3VtZW50IGEgY29uc3RhbnRcbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnRzLXdvcmtzcGFjZVxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdLCJuYW1lcyI6WyJEaXNwYXRjaCIsIkNvdWNoREJLZXlzIiwiT3BlcmF0aW9uS2V5cyIsIkludGVybmFsRXJyb3IiLCJVbnN1cHBvcnRlZEVycm9yIiwiQ291Y2hEQkFkYXB0ZXIiLCJnZW5lcmF0ZUluZGV4ZXMiLCJDb25mbGljdEVycm9yIiwiUmVwb3NpdG9yeSIsIlBlcnNpc3RlbmNlS2V5cyIsIkRlY29yYXRpb24iLCJvbkNyZWF0ZSIsInByb3BNZXRhZGF0YSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQU8sVUFBTSxXQUFXLEdBQUc7O0lDVXJCLE1BQU8sWUFBYSxTQUFRQSxhQUE0QixDQUFBO0lBRzVELElBQUEsV0FBQSxDQUFvQixVQUFVLElBQUksRUFBQTtJQUNoQyxRQUFBLEtBQUssRUFBRTtZQURXLElBQU8s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