@fgv/ts-utils 1.6.1 → 1.6.2

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fgv/ts-utils",
3
- "version": "1.6.1",
3
+ "version": "1.6.2",
4
4
  "description": "Assorted Typescript Utilities",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -11,6 +11,7 @@ export type JarFieldPicker<T extends JarRecord = JarRecord> = (record: T) => (ke
11
11
  */
12
12
  export interface JarRecordParserOptions {
13
13
  readonly arrayFields?: string[] | JarFieldPicker;
14
+ readonly fixedContinuationSize?: number;
14
15
  }
15
16
  /**
16
17
  * Reads a record-jar from an array of strings, each of which represents one
@@ -1 +1 @@
1
- {"version":3,"file":"recordJarHelpers.d.ts","sourceRoot":"","sources":["../src/recordJarHelpers.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAE,MAAM,EAAgC,MAAM,UAAU,CAAC;AAQhE;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;AAE1D,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;AAEzF;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC;CACpD;AAoLD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC,CAE1G;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC,CAO5G"}
1
+ {"version":3,"file":"recordJarHelpers.d.ts","sourceRoot":"","sources":["../src/recordJarHelpers.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAE,MAAM,EAAgC,MAAM,UAAU,CAAC;AAQhE;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;AAE1D,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;AAEzF;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC;IACjD,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAC3C;AAuMD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC,CAE1G;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC,CAO5G"}
@@ -61,8 +61,7 @@ class RecordParser {
61
61
  static parse(lines, options) {
62
62
  return new RecordParser(options)._parse(lines);
63
63
  }
64
- static _parseRecordBody(from, oldBody) {
65
- let body = `${oldBody !== null && oldBody !== void 0 ? oldBody : ''}${from.trim()}`;
64
+ static _parseRecordBody(body) {
66
65
  const isContinuation = body.endsWith('\\');
67
66
  if (isContinuation) {
68
67
  body = body.slice(0, body.length - 1);
@@ -139,7 +138,7 @@ class RecordParser {
139
138
  if (this._body === undefined) {
140
139
  return (0, result_1.fail)(`${n}: continuation ("${line}") without prior value.`);
141
140
  }
142
- const result = RecordParser._parseRecordBody(line, this._body.body);
141
+ const result = this._parseContinuation(line);
143
142
  if (result.isFailure()) {
144
143
  return (0, result_1.fail)(`${n}: ${result.message}`);
145
144
  }
@@ -169,12 +168,32 @@ class RecordParser {
169
168
  ];
170
169
  return this._writePendingField().onSuccess(() => {
171
170
  this._name = parts[0].trimEnd();
172
- return RecordParser._parseRecordBody(parts[1]).onSuccess((body) => {
171
+ return RecordParser._parseRecordBody(parts[1].trim()).onSuccess((body) => {
173
172
  this._body = body;
174
173
  return (0, result_1.succeed)(true);
175
174
  });
176
175
  });
177
176
  }
177
+ _parseContinuation(line) {
178
+ var _a, _b;
179
+ let trimmed = line.trim();
180
+ if (!this._body.isContinuation) {
181
+ // istanbul ignore next
182
+ const fixedSize = (_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.fixedContinuationSize) !== null && _b !== void 0 ? _b : 0;
183
+ if (fixedSize > 0) {
184
+ if (trimmed.length < line.length - fixedSize) {
185
+ // oops, took too much
186
+ trimmed = line.slice(fixedSize);
187
+ }
188
+ }
189
+ }
190
+ return RecordParser._parseRecordBody(trimmed).onSuccess((newBody) => {
191
+ return (0, result_1.succeed)({
192
+ body: `${this._body.body}${newBody.body}`,
193
+ isContinuation: newBody.isContinuation,
194
+ });
195
+ });
196
+ }
178
197
  _havePendingRecord() {
179
198
  return Object.keys(this._fields).length > 0;
180
199
  }
@@ -240,4 +259,4 @@ function readRecordJarFileSync(srcPath, options) {
240
259
  });
241
260
  }
242
261
  exports.readRecordJarFileSync = readRecordJarFileSync;
243
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkSmFySGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yZWNvcmRKYXJIZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUU3QixxQ0FBZ0U7QUFDaEUsbUNBQWtDO0FBdUJsQyxNQUFNLFlBQVk7SUFRZCxnRUFBZ0U7SUFDaEUsWUFBb0IsT0FBZ0M7UUFScEMsWUFBTyxHQUFnQixFQUFFLENBQUM7UUFHaEMsWUFBTyxHQUFjLEVBQUUsQ0FBQztRQUN4QixVQUFLLEdBQXVCLFNBQVMsQ0FBQztRQUN0QyxVQUFLLEdBQTJCLFNBQVMsQ0FBQztRQUloRCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sYUFBUCxPQUFPLGNBQVAsT0FBTyxHQUFJLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFlLEVBQUUsT0FBZ0M7UUFDakUsT0FBTyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVTLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFZLEVBQUUsT0FBZ0I7UUFDNUQsSUFBSSxJQUFJLEdBQUcsR0FBRyxPQUFPLGFBQVAsT0FBTyxjQUFQLE9BQU8sR0FBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7UUFDNUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxJQUFJLGNBQWMsRUFBRTtZQUNoQixJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztTQUN6QztRQUNELElBQUksSUFBSSxDQUFD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QUFPLFlBQVksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzlDLENBQUM7QUFGRCxrREFFQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixxQkFBcUIsQ0FBQyxPQUFlLEVBQUUsT0FBZ0M7SUFDbkYsT0FBTyxJQUFBLHNCQUFhLEVBQUMsR0FBRyxFQUFFO1FBQ3RCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkMsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdkUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDbkIsT0FBTyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDL0MsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBUEQsc0RBT0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDIyIEVyaWsgRm9ydHVuZVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IHsgUmVzdWx0LCBjYXB0dXJlUmVzdWx0LCBmYWlsLCBzdWNjZWVkIH0gZnJvbSAnLi9yZXN1bHQnO1xuaW1wb3J0IHsgaXNLZXlPZiB9IGZyb20gJy4vdXRpbHMnO1xuXG5pbnRlcmZhY2UgUmVjb3JkQm9keSB7XG4gICAgYm9keTogc3RyaW5nO1xuICAgIGlzQ29udGludWF0aW9uOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBzaW5nbGUgcmVjb3JkIGluIGEgSkFSIGZpbGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgSmFyUmVjb3JkID0gUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+O1xuXG5leHBvcnQgdHlwZSBKYXJGaWVsZFBpY2tlcjxUIGV4dGVuZHMgSmFyUmVjb3JkID0gSmFyUmVjb3JkPiA9IChyZWNvcmQ6IFQpID0+IChrZXlvZiBUKVtdO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGEgSkFSIHJlY29yZCBwYXJzZXIuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSmFyUmVjb3JkUGFyc2VyT3B0aW9ucyB7XG4gICAgcmVhZG9ubHkgYXJyYXlGaWVsZHM/OiBzdHJpbmdbXSB8IEphckZpZWxkUGlja2VyO1xufVxuXG5jbGFzcyBSZWNvcmRQYXJzZXIge1xuICAgIHB1YmxpYyByZWFkb25seSByZWNvcmRzOiBKYXJSZWNvcmRbXSA9IFtdO1xuICAgIHB1YmxpYyByZWFkb25seSBvcHRpb25zOiBKYXJSZWNvcmRQYXJzZXJPcHRpb25zO1xuXG4gICAgcHJvdGVjdGVkIF9maWVsZHM6IEphclJlY29yZCA9IHt9O1xuICAgIHByb3RlY3RlZCBfbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIHByb3RlY3RlZCBfYm9keTogUmVjb3JkQm9keSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBKYXJSZWNvcmRQYXJzZXJPcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgPz8ge307XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBwYXJzZShsaW5lczogc3RyaW5nW10sIG9wdGlvbnM/OiBKYXJSZWNvcmRQYXJzZXJPcHRpb25zKTogUmVzdWx0PEphclJlY29yZFtdPiB7XG4gICAgICAgIHJldHVybiBuZXcgUmVjb3JkUGFyc2VyKG9wdGlvbnMpLl9wYXJzZShsaW5lcyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBfcGFyc2VSZWNvcmRCb2R5KGZyb206IHN0cmluZywgb2xkQm9keT86IHN0cmluZyk6IFJlc3VsdDxSZWNvcmRCb2R5PiB7XG4gICAgICAgIGxldCBib2R5ID0gYCR7b2xkQm9keSA/PyAnJ30ke2Zyb20udHJpbSgpfWA7XG4gICAgICAgIGNvbnN0IGlzQ29udGludWF0aW9uID0gYm9keS5lbmRzV2l0aCgnXFxcXCcpO1xuICAgICAgICBpZiAoaXNDb250aW51YXRpb24pIHtcbiAgICAgICAgICAgIGJvZHkgPSBib2R5LnNsaWNlKDAsIGJvZHkubGVuZ3RoIC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2hhc0VzY2FwZXMoYm9keSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3JlcGxhY2VFc2NhcGVzKGJvZHkpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJvZHkgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQoeyBib2R5LCBpc0NvbnRpbnVhdGlvbiB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3RhdGljIF9oYXNFc2NhcGVzKGZyb206IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZnJvbS5pbmNsdWRlcygnXFxcXCcpIHx8IGZyb20uaW5jbHVkZXMoJyYnKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3RhdGljIF9yZXBsYWNlRXNjYXBlcyhib2R5OiBzdHJpbmcpOiBSZXN1bHQ8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGludmFsaWQ6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGNvbnN0IGVzY2FwZWQgPSBib2R5LnJlcGxhY2UoLyhcXFxcLil8KCYjeFthLWZBLUYwLTldezIsNn07KS9nLCAobWF0Y2gpID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdcXFxcXFxcXCc6IHJldHVybiAnXFxcXCc7XG4gICAgICAgICAgICAgICAgY2FzZSAnXFxcXCYnOiByZXR1cm4gJyYnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1xcXFxyJzogcmV0dXJuICdcXHInO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1xcXFxuJzogcmV0dXJuICdcXG4nO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1xcXFx0JzogcmV0dXJuICdcXHQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoLnN0YXJ0c1dpdGgoJyYnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhleENvZGUgPSBgMHgke21hdGNoLnNsaWNlKDMsIG1hdGNoLmxlbmd0aCAtIDEpfWA7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhckNvZGUgPSBOdW1iZXIucGFyc2VJbnQoaGV4Q29kZSwgMTYpO1xuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludmFsaWQucHVzaChtYXRjaCk7XG4gICAgICAgICAgICByZXR1cm4gJ1xcXFwnO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGludmFsaWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYHVucmVjb2duaXplZCBlc2NhcGUgXCIke2ludmFsaWQuam9pbignLCAnKX1cIiBpbiByZWNvcmQtamFyIGJvZHlgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VjY2VlZChlc2NhcGVkKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3RhdGljIF9hcHBseU9wdGlvbnMocmVjb3JkOiBKYXJSZWNvcmQsIG9wdGlvbnM6IEphclJlY29yZFBhcnNlck9wdGlvbnMpOiBKYXJSZWNvcmQge1xuICAgICAgICBpZiAob3B0aW9ucy5hcnJheUZpZWxkcykge1xuICAgICAgICAgICAgcmVjb3JkID0geyAuLi5yZWNvcmQgfTsgLy8gZG9uJ3QgZWRpdCBpbmNvbWluZyB2YWx1ZXNcbiAgICAgICAgICAgIGNvbnN0IGFycmF5RmllbGRzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLmFycmF5RmllbGRzKVxuICAgICAgICAgICAgICAgID8gb3B0aW9ucy5hcnJheUZpZWxkc1xuICAgICAgICAgICAgICAgIDogb3B0aW9ucy5hcnJheUZpZWxkcyhyZWNvcmQpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGFycmF5RmllbGRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzS2V5T2YoZmllbGQsIHJlY29yZCkgJiYgdHlwZW9mIHJlY29yZFtmaWVsZF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSByZWNvcmRbZmllbGRdIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkW2ZpZWxkXSA9IFtjdXJyZW50XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3BhcnNlKGxpbmVzOiBzdHJpbmdbXSk6IFJlc3VsdDxKYXJSZWNvcmRbXT4ge1xuICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGxpbmVzLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5lID0gbGluZXNbbl07XG4gICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCclJScpICYmICF0aGlzLl9ib2R5Py5pc0NvbnRpbnVhdGlvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3dyaXRlUGVuZGluZ1JlY29yZCgpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoYCR7bn06ICR7cmVzdWx0Lm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoL15cXHMqJC8udGVzdChsaW5lKSkge1xuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBibGFuayBsaW5lcyBidXQgY2FuY2VsIGNvbnRpbnVhdGlvblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9ib2R5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2JvZHkuaXNDb250aW51YXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9ib2R5Py5pc0NvbnRpbnVhdGlvbiB8fCAvXlxccysvLnRlc3QobGluZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBleHBsaWNpdCBjb250aW51YXRpb24gb24gcHJldmlvdXMgbGluZSBvciBpbXBsaWNpdCBzdGFydHMgd2l0aCB3aGl0ZXNwYWNlXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2JvZHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgJHtufTogY29udGludWF0aW9uIChcIiR7bGluZX1cIikgd2l0aG91dCBwcmlvciB2YWx1ZS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gUmVjb3JkUGFyc2VyLl9wYXJzZVJlY29yZEJvZHkobGluZSwgdGhpcy5fYm9keS5ib2R5KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzRmFpbHVyZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKGAke259OiAke3Jlc3VsdC5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9ib2R5ID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fcGFyc2VGaWVsZChsaW5lKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzRmFpbHVyZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKGAke259OiAke3Jlc3VsdC5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3dyaXRlUGVuZGluZ1JlY29yZCgpO1xuICAgICAgICBpZiAocmVzdWx0LmlzRmFpbHVyZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFpbChgJHtsaW5lcy5sZW5ndGh9OiAke3Jlc3VsdC5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdWNjZWVkKHRoaXMucmVjb3Jkcyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9wYXJzZUZpZWxkKGxpbmU6IHN0cmluZyk6IFJlc3VsdDxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IHNlcGFyYXRvckluZGV4ID0gbGluZS5pbmRleE9mKCc6Jyk7XG4gICAgICAgIGlmIChzZXBhcmF0b3JJbmRleCA8IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWlsKGBtYWxmb3JtZWQgbGluZSAoXCIke2xpbmV9XCIpIGluIHJlY29yZC1qYXIuYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFydHMgPSBbXG4gICAgICAgICAgICBsaW5lLnNsaWNlKDAsIHNlcGFyYXRvckluZGV4KSxcbiAgICAgICAgICAgIGxpbmUuc2xpY2Uoc2VwYXJhdG9ySW5kZXggKyAxKSxcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fd3JpdGVQZW5kaW5nRmllbGQoKS5vblN1Y2Nlc3MoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fbmFtZSA9IHBhcnRzWzBdLnRyaW1FbmQoKTtcbiAgICAgICAgICAgIHJldHVybiBSZWNvcmRQYXJzZXIuX3BhcnNlUmVjb3JkQm9keShwYXJ0c1sxXSkub25TdWNjZXNzKChib2R5KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYm9keSA9IGJvZHk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQodHJ1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9oYXZlUGVuZGluZ1JlY29yZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX2ZpZWxkcykubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3dyaXRlUGVuZGluZ1JlY29yZCgpOiBSZXN1bHQ8SmFyUmVjb3JkIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZVBlbmRpbmdGaWVsZCgpLm9uU3VjY2VzcygoKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVjb3JkID0gdGhpcy5faGF2ZVBlbmRpbmdSZWNvcmQoKSA/IHRoaXMuX2ZpZWxkcyA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChyZWNvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJlY29yZCA9IFJlY29yZFBhcnNlci5fYXBwbHlPcHRpb25zKHJlY29yZCwgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlY29yZHMucHVzaChyZWNvcmQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpZWxkcyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQodW5kZWZpbmVkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF93cml0ZVBlbmRpbmdGaWVsZCgpOiBSZXN1bHQ8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAodGhpcy5fbmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fYm9keSEuYm9keS5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoJ2VtcHR5IGJvZHkgdmFsdWUgbm90IGFsbG93ZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNLZXlPZih0aGlzLl9uYW1lLCB0aGlzLl9maWVsZHMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmllbGRzW3RoaXMuX25hbWVdID0gdGhpcy5fYm9keSEuYm9keTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0aGlzLl9maWVsZHNbdGhpcy5fbmFtZV0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuX2ZpZWxkc1t0aGlzLl9uYW1lXSBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmllbGRzW3RoaXMuX25hbWVdID0gW2N1cnJlbnQsIHRoaXMuX2JvZHkhLmJvZHldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuX2ZpZWxkc1t0aGlzLl9uYW1lXSBhcyBzdHJpbmdbXTtcbiAgICAgICAgICAgICAgICBjdXJyZW50LnB1c2godGhpcy5fYm9keSEuYm9keSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9uYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fYm9keSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VjY2VlZCh0cnVlKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmVhZHMgYSByZWNvcmQtamFyIGZyb20gYW4gYXJyYXkgb2Ygc3RyaW5ncywgZWFjaCBvZiB3aGljaCByZXByZXNlbnRzIG9uZVxuICogbGluZSBpbiB0aGUgc291cmNlIGZpbGUuXG4gKiBAcGFyYW0gbGluZXMgLSB0aGUgYXJyYXkgb2Ygc3RyaW5ncyB0byBiZSBwYXJzZWRcbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgcGFyc2VyIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIGEgY29ycmVzcG9uZGluZyBhcnJheSBvZiBgUmVjb3JkPHN0cmluZywgc3RyaW5nPmBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmVjb3JkSmFyTGluZXMobGluZXM6IHN0cmluZ1tdLCBvcHRpb25zPzogSmFyUmVjb3JkUGFyc2VyT3B0aW9ucyk6IFJlc3VsdDxKYXJSZWNvcmRbXT4ge1xuICAgIHJldHVybiBSZWNvcmRQYXJzZXIucGFyc2UobGluZXMsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFJlYWRzIGEgcmVjb3JkLWphciBmaWxlIGZyb20gYSBzdXBwbGllZCBwYXRoLlxuICogQHBhcmFtIHNyY1BhdGggLSBTb3VyY2UgcGF0aCBmcm9tIHdoaWNoIHRoZSBmaWxlIGlzIHJlYWQuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHBhcnNlciBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBUaGUgY29udGVudHMgb2YgdGhlIGZpbGUgYXMgYW4gYXJyYXkgb2YgYFJlY29yZDxzdHJpbmcsIHN0cmluZz5gXG4gKiBAc2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvZHJhZnQtcGhpbGxpcHMtcmVjb3JkLWphci0wMVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZFJlY29yZEphckZpbGVTeW5jKHNyY1BhdGg6IHN0cmluZywgb3B0aW9ucz86IEphclJlY29yZFBhcnNlck9wdGlvbnMpOiBSZXN1bHQ8SmFyUmVjb3JkW10+IHtcbiAgICByZXR1cm4gY2FwdHVyZVJlc3VsdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5yZXNvbHZlKHNyY1BhdGgpO1xuICAgICAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKGZ1bGxQYXRoLCAndXRmOCcpLnRvU3RyaW5nKCkuc3BsaXQoL1xccj9cXG4vKTtcbiAgICB9KS5vblN1Y2Nlc3MoKGxpbmVzKSA9PiB7XG4gICAgICAgIHJldHVybiBwYXJzZVJlY29yZEphckxpbmVzKGxpbmVzLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbiJdfQ==
262
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkSmFySGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yZWNvcmRKYXJIZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUU3QixxQ0FBZ0U7QUFDaEUsbUNBQWtDO0FBd0JsQyxNQUFNLFlBQVk7SUFRZCxnRUFBZ0U7SUFDaEUsWUFBb0IsT0FBZ0M7UUFScEMsWUFBTyxHQUFnQixFQUFFLENBQUM7UUFHaEMsWUFBTyxHQUFjLEVBQUUsQ0FBQztRQUN4QixVQUFLLEdBQXVCLFNBQVMsQ0FBQztRQUN0QyxVQUFLLEdBQTJCLFNBQVMsQ0FBQztRQUloRCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sYUFBUCxPQUFPLGNBQVAsT0FBTyxHQUFJLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFlLEVBQUUsT0FBZ0M7UUFDakUsT0FBTyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVTLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFZO1FBQzFDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsSUFBSSxjQUFjLEVBQUU7WUFDaEIsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDekM7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDeEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDcEIsT0FBTyxJQUFBLGFBQUksRUFBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDL0I7WUFDRCxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztTQUN2QjtRQUNELE9BQU8sSUFBQSxnQkFBTyxFQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVTLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBWTtRQUNyQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRVMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFZO1FBQ3pDLE1BQU0sT0FBTyxHQUFhLEVBQUUsQ0FBQztRQUM3QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLCtCQUErQixFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDcEUsUUFBUSxLQUFLLEVBQUU7Z0JBQ1gsS0FBSyxNQUFNLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQztnQkFDekIsS0FBSyxLQUFLLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQztnQkFDdkIsS0FBSyxLQUFLLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQztnQkFDeEIsS0FBSyxLQUFLLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQztnQkFDeEIsS0FBSyxLQUFLLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQzthQUMzQjtZQUNELElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDdkIsTUFBTSxPQUFPLEdBQUcsS0FBSyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUM5QyxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDeEM7WUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BCLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNwQixPQUFPLElBQUEsYUFBSSxFQUFDLHdCQUF3QixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1NBQ2pGO1FBQ0QsT0FBTyxJQUFBLGdCQUFPLEVBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVTLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBaUIsRUFBRSxPQUErQjtRQUM3RSxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUU7WUFDckIsTUFBTSxHQUFHLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQyxDQUFDLDZCQUE2QjtZQUNyRCxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7Z0JBQ2xELENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVztnQkFDckIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFbEMsS0FBSyxNQUFNLEtBQUssSUFBSSxXQUFXLEVBQUU7Z0JBQzdCLElBQUksSUFBQSxlQUFPLEVBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLFFBQVEsRUFBRTtvQkFDN0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBVyxDQUFDO29CQUN4QyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDN0I7YUFDSjtTQUNKO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVTLE1BQU0sQ0FBQyxLQUFlOztRQUM1QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNuQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQSxNQUFBLElBQUksQ0FBQyxLQUFLLDBDQUFFLGNBQWMsQ0FBQSxFQUFFO2dCQUN0RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDMUMsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUU7b0JBQ3BCLE9BQU8sSUFBQSxhQUFJLEVBQUMsR0FBRyxDQUFDLEtBQUssTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7aUJBQzFDO2FBQ0o7aUJBQ0ksSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUN6Qiw2Q0FBNkM7Z0JBQzdDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtvQkFDWixJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7aUJBQ3JDO2dCQUNELFNBQVM7YUFDWjtpQkFDSSxJQUFJLENBQUEsTUFBQSxJQUFJLENBQUMsS0FBSywwQ0FBRSxjQUFjLEtBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDdEQsNEVBQTRFO2dCQUM1RSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFO29CQUMxQixPQUFPLElBQUEsYUFBSSxFQUFDLEdBQUcsQ0FBQyxvQkFBb0IsSUFBSSx5QkFBeUIsQ0FBQyxDQUFDO2lCQUN0RTtnQkFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzdDLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFO29CQUNwQixPQUFPLElBQUEsYUFBSSxFQUFDLEdBQUcsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2lCQUMxQztnQkFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7YUFDN0I7aUJBQ0k7Z0JBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUU7b0JBQ3BCLE9BQU8sSUFBQSxhQUFJLEVBQUMsR0FBRyxDQUFDLEtBQUssTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7aUJBQzFDO2FBQ0o7U0FDSjtRQUVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzFDLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ3BCLE9BQU8sSUFBQSxhQUFJLEVBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQ3JEO1FBQ0QsT0FBTyxJQUFBLGdCQUFPLEVBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFUyxXQUFXLENBQUMsSUFBWTtRQUM5QixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLElBQUksY0FBYyxHQUFHLENBQUMsRUFBRTtZQUNwQixPQUFPLElBQUEsYUFBSSxFQUFDLG9CQUFvQixJQUFJLG1CQUFtQixDQUFDLENBQUM7U0FDNUQ7UUFDRCxNQUFNLEtBQUssR0FBRztZQUNWLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQztZQUM3QixJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUM7U0FDakMsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUM1QyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNoQyxPQUFPLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDckUsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7Z0JBQ2xCLE9BQU8sSUFBQSxnQkFBTyxFQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRVMsa0JBQWtCLENBQUMsSUFBWTs7UUFDckMsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBTSxDQUFDLGNBQWMsRUFBRTtZQUM3Qix1QkFBdUI7WUFDdkIsTUFBTSxTQUFTLEdBQUcsTUFBQSxNQUFBLElBQUksQ0FBQyxPQUFPLDBDQUFFLHFCQUFxQixtQ0FBSSxDQUFDLENBQUM7WUFDM0QsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFO2dCQUNmLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsRUFBRTtvQkFDMUMsc0JBQXNCO29CQUN0QixPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDbkM7YUFDSjtTQUNKO1FBQ0QsT0FBTyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDaEUsT0FBTyxJQUFBLGdCQUFPLEVBQUM7Z0JBQ1gsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQU0sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRTtnQkFDMUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjO2FBQ3pDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVTLGtCQUFrQjtRQUN4QixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVTLG1CQUFtQjtRQUN6QixPQUFPLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDNUMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNsRSxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7Z0JBQ3RCLE1BQU0sR0FBRyxZQUFZLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzFELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMxQixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQzthQUNyQjtZQUNELE9BQU8sSUFBQSxnQkFBTyxFQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVTLGtCQUFrQjtRQUN4QixJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQzFCLElBQUksSUFBSSxDQUFDLEtBQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDN0IsT0FBTyxJQUFBLGFBQUksRUFBQyw4QkFBOEIsQ0FBQyxDQUFDO2FBQy9DO1lBQ0QsSUFBSSxDQUFDLElBQUEsZUFBTyxFQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNwQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBTSxDQUFDLElBQUksQ0FBQzthQUMvQztpQkFDSSxJQUFJLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssUUFBUSxFQUFFO2dCQUNuRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQVcsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMxRDtpQkFDSTtnQkFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQWEsQ0FBQztnQkFDckQsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2xDO1lBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7WUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7U0FDMUI7UUFDRCxPQUFPLElBQUEsZ0JBQU8sRUFBQyxJQUFJLENBQUMsQ0FBQztJQUN6QixDQUFDO0NBQ0o7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsS0FBZSxFQUFFLE9BQWdDO0lBQ2pGLE9BQU8sWUFBWSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDOUMsQ0FBQztBQUZELGtEQUVDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLHFCQUFxQixDQUFDLE9BQWUsRUFBRSxPQUFnQztJQUNuRixPQUFPLElBQUEsc0JBQWEsRUFBQyxHQUFHLEVBQUU7UUFDdEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2QyxPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2RSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUNuQixPQUFPLG1CQUFtQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMvQyxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFQRCxzREFPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgRXJpayBGb3J0dW5lXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgeyBSZXN1bHQsIGNhcHR1cmVSZXN1bHQsIGZhaWwsIHN1Y2NlZWQgfSBmcm9tICcuL3Jlc3VsdCc7XG5pbXBvcnQgeyBpc0tleU9mIH0gZnJvbSAnLi91dGlscyc7XG5cbmludGVyZmFjZSBSZWNvcmRCb2R5IHtcbiAgICBib2R5OiBzdHJpbmc7XG4gICAgaXNDb250aW51YXRpb246IGJvb2xlYW47XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHNpbmdsZSByZWNvcmQgaW4gYSBKQVIgZmlsZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBKYXJSZWNvcmQgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT47XG5cbmV4cG9ydCB0eXBlIEphckZpZWxkUGlja2VyPFQgZXh0ZW5kcyBKYXJSZWNvcmQgPSBKYXJSZWNvcmQ+ID0gKHJlY29yZDogVCkgPT4gKGtleW9mIFQpW107XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYSBKQVIgcmVjb3JkIHBhcnNlci5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKYXJSZWNvcmRQYXJzZXJPcHRpb25zIHtcbiAgICByZWFkb25seSBhcnJheUZpZWxkcz86IHN0cmluZ1tdIHwgSmFyRmllbGRQaWNrZXI7XG4gICAgcmVhZG9ubHkgZml4ZWRDb250aW51YXRpb25TaXplPzogbnVtYmVyO1xufVxuXG5jbGFzcyBSZWNvcmRQYXJzZXIge1xuICAgIHB1YmxpYyByZWFkb25seSByZWNvcmRzOiBKYXJSZWNvcmRbXSA9IFtdO1xuICAgIHB1YmxpYyByZWFkb25seSBvcHRpb25zOiBKYXJSZWNvcmRQYXJzZXJPcHRpb25zO1xuXG4gICAgcHJvdGVjdGVkIF9maWVsZHM6IEphclJlY29yZCA9IHt9O1xuICAgIHByb3RlY3RlZCBfbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIHByb3RlY3RlZCBfYm9keTogUmVjb3JkQm9keSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBKYXJSZWNvcmRQYXJzZXJPcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgPz8ge307XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBwYXJzZShsaW5lczogc3RyaW5nW10sIG9wdGlvbnM/OiBKYXJSZWNvcmRQYXJzZXJPcHRpb25zKTogUmVzdWx0PEphclJlY29yZFtdPiB7XG4gICAgICAgIHJldHVybiBuZXcgUmVjb3JkUGFyc2VyKG9wdGlvbnMpLl9wYXJzZShsaW5lcyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBfcGFyc2VSZWNvcmRCb2R5KGJvZHk6IHN0cmluZyk6IFJlc3VsdDxSZWNvcmRCb2R5PiB7XG4gICAgICAgIGNvbnN0IGlzQ29udGludWF0aW9uID0gYm9keS5lbmRzV2l0aCgnXFxcXCcpO1xuICAgICAgICBpZiAoaXNDb250aW51YXRpb24pIHtcbiAgICAgICAgICAgIGJvZHkgPSBib2R5LnNsaWNlKDAsIGJvZHkubGVuZ3RoIC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2hhc0VzY2FwZXMoYm9keSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3JlcGxhY2VFc2NhcGVzKGJvZHkpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJvZHkgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQoeyBib2R5LCBpc0NvbnRpbnVhdGlvbiB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3RhdGljIF9oYXNFc2NhcGVzKGZyb206IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZnJvbS5pbmNsdWRlcygnXFxcXCcpIHx8IGZyb20uaW5jbHVkZXMoJyYnKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3RhdGljIF9yZXBsYWNlRXNjYXBlcyhib2R5OiBzdHJpbmcpOiBSZXN1bHQ8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGludmFsaWQ6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGNvbnN0IGVzY2FwZWQgPSBib2R5LnJlcGxhY2UoLyhcXFxcLil8KCYjeFthLWZBLUYwLTldezIsNn07KS9nLCAobWF0Y2gpID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdcXFxcXFxcXCc6IHJldHVybiAnXFxcXCc7XG4gICAgICAgICAgICAgICAgY2FzZSAnXFxcXCYnOiByZXR1cm4gJyYnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1xcXFxyJzogcmV0dXJuICdcXHInO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1xcXFxuJzogcmV0dXJuICdcXG4nO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1xcXFx0JzogcmV0dXJuICdcXHQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoLnN0YXJ0c1dpdGgoJyYnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhleENvZGUgPSBgMHgke21hdGNoLnNsaWNlKDMsIG1hdGNoLmxlbmd0aCAtIDEpfWA7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhckNvZGUgPSBOdW1iZXIucGFyc2VJbnQoaGV4Q29kZSwgMTYpO1xuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludmFsaWQucHVzaChtYXRjaCk7XG4gICAgICAgICAgICByZXR1cm4gJ1xcXFwnO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGludmFsaWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYHVucmVjb2duaXplZCBlc2NhcGUgXCIke2ludmFsaWQuam9pbignLCAnKX1cIiBpbiByZWNvcmQtamFyIGJvZHlgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VjY2VlZChlc2NhcGVkKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3RhdGljIF9hcHBseU9wdGlvbnMocmVjb3JkOiBKYXJSZWNvcmQsIG9wdGlvbnM6IEphclJlY29yZFBhcnNlck9wdGlvbnMpOiBKYXJSZWNvcmQge1xuICAgICAgICBpZiAob3B0aW9ucy5hcnJheUZpZWxkcykge1xuICAgICAgICAgICAgcmVjb3JkID0geyAuLi5yZWNvcmQgfTsgLy8gZG9uJ3QgZWRpdCBpbmNvbWluZyB2YWx1ZXNcbiAgICAgICAgICAgIGNvbnN0IGFycmF5RmllbGRzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLmFycmF5RmllbGRzKVxuICAgICAgICAgICAgICAgID8gb3B0aW9ucy5hcnJheUZpZWxkc1xuICAgICAgICAgICAgICAgIDogb3B0aW9ucy5hcnJheUZpZWxkcyhyZWNvcmQpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGFycmF5RmllbGRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzS2V5T2YoZmllbGQsIHJlY29yZCkgJiYgdHlwZW9mIHJlY29yZFtmaWVsZF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSByZWNvcmRbZmllbGRdIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkW2ZpZWxkXSA9IFtjdXJyZW50XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3BhcnNlKGxpbmVzOiBzdHJpbmdbXSk6IFJlc3VsdDxKYXJSZWNvcmRbXT4ge1xuICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGxpbmVzLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5lID0gbGluZXNbbl07XG4gICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCclJScpICYmICF0aGlzLl9ib2R5Py5pc0NvbnRpbnVhdGlvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3dyaXRlUGVuZGluZ1JlY29yZCgpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoYCR7bn06ICR7cmVzdWx0Lm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoL15cXHMqJC8udGVzdChsaW5lKSkge1xuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBibGFuayBsaW5lcyBidXQgY2FuY2VsIGNvbnRpbnVhdGlvblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9ib2R5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2JvZHkuaXNDb250aW51YXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9ib2R5Py5pc0NvbnRpbnVhdGlvbiB8fCAvXlxccysvLnRlc3QobGluZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBleHBsaWNpdCBjb250aW51YXRpb24gb24gcHJldmlvdXMgbGluZSBvciBpbXBsaWNpdCBzdGFydHMgd2l0aCB3aGl0ZXNwYWNlXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2JvZHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgJHtufTogY29udGludWF0aW9uIChcIiR7bGluZX1cIikgd2l0aG91dCBwcmlvciB2YWx1ZS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fcGFyc2VDb250aW51YXRpb24obGluZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgJHtufTogJHtyZXN1bHQubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fYm9keSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3BhcnNlRmllbGQobGluZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgJHtufTogJHtyZXN1bHQubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl93cml0ZVBlbmRpbmdSZWNvcmQoKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYCR7bGluZXMubGVuZ3RofTogJHtyZXN1bHQubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VjY2VlZCh0aGlzLnJlY29yZHMpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfcGFyc2VGaWVsZChsaW5lOiBzdHJpbmcpOiBSZXN1bHQ8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBzZXBhcmF0b3JJbmRleCA9IGxpbmUuaW5kZXhPZignOicpO1xuICAgICAgICBpZiAoc2VwYXJhdG9ySW5kZXggPCAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFpbChgbWFsZm9ybWVkIGxpbmUgKFwiJHtsaW5lfVwiKSBpbiByZWNvcmQtamFyLmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnRzID0gW1xuICAgICAgICAgICAgbGluZS5zbGljZSgwLCBzZXBhcmF0b3JJbmRleCksXG4gICAgICAgICAgICBsaW5lLnNsaWNlKHNlcGFyYXRvckluZGV4ICsgMSksXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlUGVuZGluZ0ZpZWxkKCkub25TdWNjZXNzKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX25hbWUgPSBwYXJ0c1swXS50cmltRW5kKCk7XG4gICAgICAgICAgICByZXR1cm4gUmVjb3JkUGFyc2VyLl9wYXJzZVJlY29yZEJvZHkocGFydHNbMV0udHJpbSgpKS5vblN1Y2Nlc3MoKGJvZHkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ib2R5ID0gYm9keTtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VjY2VlZCh0cnVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3BhcnNlQ29udGludWF0aW9uKGxpbmU6IHN0cmluZyk6IFJlc3VsdDxSZWNvcmRCb2R5PiB7XG4gICAgICAgIGxldCB0cmltbWVkID0gbGluZS50cmltKCk7XG4gICAgICAgIGlmICghdGhpcy5fYm9keSEuaXNDb250aW51YXRpb24pIHtcbiAgICAgICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgICAgICAgICBjb25zdCBmaXhlZFNpemUgPSB0aGlzLm9wdGlvbnM/LmZpeGVkQ29udGludWF0aW9uU2l6ZSA/PyAwO1xuICAgICAgICAgICAgaWYgKGZpeGVkU2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodHJpbW1lZC5sZW5ndGggPCBsaW5lLmxlbmd0aCAtIGZpeGVkU2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBvb3BzLCB0b29rIHRvbyBtdWNoXG4gICAgICAgICAgICAgICAgICAgIHRyaW1tZWQgPSBsaW5lLnNsaWNlKGZpeGVkU2l6ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZWNvcmRQYXJzZXIuX3BhcnNlUmVjb3JkQm9keSh0cmltbWVkKS5vblN1Y2Nlc3MoKG5ld0JvZHkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKHtcbiAgICAgICAgICAgICAgICBib2R5OiBgJHt0aGlzLl9ib2R5IS5ib2R5fSR7bmV3Qm9keS5ib2R5fWAsXG4gICAgICAgICAgICAgICAgaXNDb250aW51YXRpb246IG5ld0JvZHkuaXNDb250aW51YXRpb24sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9oYXZlUGVuZGluZ1JlY29yZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX2ZpZWxkcykubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3dyaXRlUGVuZGluZ1JlY29yZCgpOiBSZXN1bHQ8SmFyUmVjb3JkIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZVBlbmRpbmdGaWVsZCgpLm9uU3VjY2VzcygoKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVjb3JkID0gdGhpcy5faGF2ZVBlbmRpbmdSZWNvcmQoKSA/IHRoaXMuX2ZpZWxkcyA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChyZWNvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJlY29yZCA9IFJlY29yZFBhcnNlci5fYXBwbHlPcHRpb25zKHJlY29yZCwgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlY29yZHMucHVzaChyZWNvcmQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpZWxkcyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQodW5kZWZpbmVkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF93cml0ZVBlbmRpbmdGaWVsZCgpOiBSZXN1bHQ8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAodGhpcy5fbmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fYm9keSEuYm9keS5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoJ2VtcHR5IGJvZHkgdmFsdWUgbm90IGFsbG93ZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNLZXlPZih0aGlzLl9uYW1lLCB0aGlzLl9maWVsZHMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmllbGRzW3RoaXMuX25hbWVdID0gdGhpcy5fYm9keSEuYm9keTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0aGlzLl9maWVsZHNbdGhpcy5fbmFtZV0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuX2ZpZWxkc1t0aGlzLl9uYW1lXSBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmllbGRzW3RoaXMuX25hbWVdID0gW2N1cnJlbnQsIHRoaXMuX2JvZHkhLmJvZHldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuX2ZpZWxkc1t0aGlzLl9uYW1lXSBhcyBzdHJpbmdbXTtcbiAgICAgICAgICAgICAgICBjdXJyZW50LnB1c2godGhpcy5fYm9keSEuYm9keSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9uYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fYm9keSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VjY2VlZCh0cnVlKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmVhZHMgYSByZWNvcmQtamFyIGZyb20gYW4gYXJyYXkgb2Ygc3RyaW5ncywgZWFjaCBvZiB3aGljaCByZXByZXNlbnRzIG9uZVxuICogbGluZSBpbiB0aGUgc291cmNlIGZpbGUuXG4gKiBAcGFyYW0gbGluZXMgLSB0aGUgYXJyYXkgb2Ygc3RyaW5ncyB0byBiZSBwYXJzZWRcbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgcGFyc2VyIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIGEgY29ycmVzcG9uZGluZyBhcnJheSBvZiBgUmVjb3JkPHN0cmluZywgc3RyaW5nPmBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmVjb3JkSmFyTGluZXMobGluZXM6IHN0cmluZ1tdLCBvcHRpb25zPzogSmFyUmVjb3JkUGFyc2VyT3B0aW9ucyk6IFJlc3VsdDxKYXJSZWNvcmRbXT4ge1xuICAgIHJldHVybiBSZWNvcmRQYXJzZXIucGFyc2UobGluZXMsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFJlYWRzIGEgcmVjb3JkLWphciBmaWxlIGZyb20gYSBzdXBwbGllZCBwYXRoLlxuICogQHBhcmFtIHNyY1BhdGggLSBTb3VyY2UgcGF0aCBmcm9tIHdoaWNoIHRoZSBmaWxlIGlzIHJlYWQuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHBhcnNlciBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBUaGUgY29udGVudHMgb2YgdGhlIGZpbGUgYXMgYW4gYXJyYXkgb2YgYFJlY29yZDxzdHJpbmcsIHN0cmluZz5gXG4gKiBAc2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvZHJhZnQtcGhpbGxpcHMtcmVjb3JkLWphci0wMVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZFJlY29yZEphckZpbGVTeW5jKHNyY1BhdGg6IHN0cmluZywgb3B0aW9ucz86IEphclJlY29yZFBhcnNlck9wdGlvbnMpOiBSZXN1bHQ8SmFyUmVjb3JkW10+IHtcbiAgICByZXR1cm4gY2FwdHVyZVJlc3VsdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5yZXNvbHZlKHNyY1BhdGgpO1xuICAgICAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKGZ1bGxQYXRoLCAndXRmOCcpLnRvU3RyaW5nKCkuc3BsaXQoL1xccj9cXG4vKTtcbiAgICB9KS5vblN1Y2Nlc3MoKGxpbmVzKSA9PiB7XG4gICAgICAgIHJldHVybiBwYXJzZVJlY29yZEphckxpbmVzKGxpbmVzLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbiJdfQ==