@rivet-health/design-system 40.6.2 → 40.7.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.
@@ -29,12 +29,19 @@ export var RivSelect;
29
29
  return this.byId.has(option.id);
30
30
  }
31
31
  add(option) {
32
- if (this.byId.has(option.id)) {
33
- // Preserve insertion order while swapping to the newer object
34
- // reference. Rebuilding the full Set matches the previous
35
- // implementation's semantics; the cost of that rebuild only hits
36
- // the rare "re-add existing" path — the common O(N²) case (fresh
37
- // adds during construction) no longer pays it.
32
+ const existing = this.byId.get(option.id);
33
+ if (existing === option) {
34
+ // Same object reference — nothing to update. Ancestor re-adds
35
+ // during a selection snapshot hit this path repeatedly, so keeping
36
+ // it O(1) is what prevents the tree-select N² blow-up seen in
37
+ // RVT-25470.
38
+ return this;
39
+ }
40
+ if (existing !== undefined) {
41
+ // Different reference, same id — swap the stored ref while
42
+ // preserving Set insertion order. The rebuild is O(N), but this
43
+ // path is rare in practice (the hot ancestor-snapshot loop takes
44
+ // the identity fast-path above).
38
45
  const items = [...this].map(o => (o.id === option.id ? option : o));
39
46
  this.byId.set(option.id, option);
40
47
  super.clear();
@@ -375,17 +382,22 @@ export var RivSelect;
375
382
  const snapshot = new OptionSet(state.selection.selected);
376
383
  const topLevelOptions = getTopLevelOptions(state.sourceOptionGroups);
377
384
  const [parents] = getRelationshipMaps(topLevelOptions);
378
- // For each selected option, add all its ancestors to the snapshot
385
+ // Sibling leaves share ancestors, so once we've walked up through a
386
+ // given parent id we can stop — anything above it has already been
387
+ // added by a previous iteration. Without this short-circuit the loop
388
+ // re-runs findOption (which is a full tree walk) once per shared
389
+ // ancestor edge, which was the #2 hotspot behind OptionSet.add in
390
+ // RVT-25470's profile.
391
+ const visited = new Set();
379
392
  for (const selectedOption of state.selection.selected) {
380
- let currentId = selectedOption.id;
381
- let parentId = parents.get(currentId);
382
- while (parentId !== undefined) {
393
+ let parentId = parents.get(selectedOption.id);
394
+ while (parentId !== undefined && !visited.has(parentId)) {
395
+ visited.add(parentId);
383
396
  const parentOption = findOption(topLevelOptions, parentId);
384
397
  if (parentOption) {
385
398
  snapshot.add(parentOption);
386
399
  }
387
- currentId = parentId;
388
- parentId = parents.get(currentId);
400
+ parentId = parents.get(parentId);
389
401
  }
390
402
  }
391
403
  return snapshot;
@@ -858,4 +870,4 @@ export var RivSelect;
858
870
  }
859
871
  }
860
872
  })(RivSelect || (RivSelect = {}));
861
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi9pbnB1dC9zZWxlY3Qvc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUtOLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDckUsT0FBTyxFQUNMLFdBQVcsRUFFWCxHQUFHLEVBQ0gsS0FBSyxFQUVMLGFBQWEsRUFDYixJQUFJLEVBQ0osU0FBUyxFQUNULE9BQU8sR0FDUixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUc1RCxNQUFNLEtBQVcsU0FBUyxDQXU2Q3pCO0FBdjZDRCxXQUFpQixTQUFTO0lBQ3hCLGFBQWE7SUFDYixhQUFhO0lBQ2IsYUFBYTtJQW9HYjs7O09BR0c7SUFDSCxNQUFhLFNBQWdDLFNBQVEsR0FBb0I7UUFPdkUsWUFBWSxNQUF5QztZQUNuRCxLQUFLLEVBQUUsQ0FBQztZQVBWLHVFQUF1RTtZQUN2RSx1RUFBdUU7WUFDdkUsdUVBQXVFO1lBQ3ZFLDhEQUE4RDtZQUM3QyxTQUFJLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7WUFJMUQsSUFBSSxNQUFNLEVBQUU7Z0JBQ1YsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7b0JBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ2pCO2FBQ0Y7UUFDSCxDQUFDO1FBRVEsR0FBRyxDQUFDLE1BQXVDO1lBQ2xELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFFUSxHQUFHLENBQUMsTUFBdUI7WUFDbEMsSUFBSSxJQUFJLENBQUMsSUFBSSxD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QUFLO29CQUNSLEtBQUssRUFBRTt3QkFDTCxHQUFHLEtBQUssQ0FBQyxLQUFLO3dCQUNkLE1BQU0sRUFBRSxNQUFNLENBQUMsT0FBTztxQkFDdkI7aUJBQ0YsQ0FBQztZQUNKLEtBQUssYUFBYTtnQkFDaEIsT0FBTztvQkFDTCxHQUFHLEtBQUs7b0JBQ1IsS0FBSyxFQUFFO3dCQUNMLEdBQUcsS0FBSyxDQUFDLEtBQUs7d0JBQ2QsS0FBSyxFQUFFLE1BQU0sQ0FBQyxPQUFPO3FCQUN0QjtpQkFDRixDQUFDO1lBQ0osS0FBSyxpQkFBaUI7Z0JBQ3BCLE9BQU87b0JBQ0wsR0FBRyxLQUFLO29CQUNSLFNBQVMsRUFBRSxNQUFNLENBQUMsT0FBTztpQkFDMUIsQ0FBQztZQUNKLEtBQUssc0JBQXNCO2dCQUN6QixPQUFPLGNBQWMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUMxRCxLQUFLLG1CQUFtQjtnQkFDdEIsT0FBTyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLEtBQUssdUJBQXVCO2dCQUMxQixPQUFPLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLEtBQUssc0JBQXNCO2dCQUN6QixPQUFPLG9CQUFvQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDakQ7SUFDSCxDQUFDO0FBQ0gsQ0FBQyxFQXY2Q2dCLFNBQVMsS0FBVCxTQUFTLFFBdTZDekIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRnVzZSwge1xuICBGdXNlUmVzdWx0LFxuICBGdXNlUmVzdWx0TWF0Y2gsXG4gIElGdXNlT3B0aW9ucyxcbiAgUmFuZ2VUdXBsZSxcbn0gZnJvbSAnZnVzZS5qcyc7XG5pbXBvcnQgeyBkZWZhdWx0c0RlZXAsIGZsYXR0ZW5EZWVwLCBpc051bWJlciwgc29ydEJ5IH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7XG4gIGNvbm5lY3RhYmxlLFxuICBDb25uZWN0YWJsZSxcbiAgbWFwLFxuICBtZXJnZSxcbiAgT2JzZXJ2YWJsZSxcbiAgUmVwbGF5U3ViamVjdCxcbiAgc2NhbixcbiAgc3RhcnRXaXRoLFxuICBTdWJqZWN0LFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERlZXBQYXJ0aWFsIH0gZnJvbSAndXRpbGl0eS10eXBlcyc7XG5pbXBvcnQgeyBOdW1iZXJQaXBlIH0gZnJvbSAnLi4vLi4vZm9ybWF0L3BpcGVzL251bWJlci5waXBlJztcbmltcG9ydCB7IEhpZ2hsaWdodENvbXBvbmVudCB9IGZyb20gJy4uLy4uL3Zpc3VhbGl6YXRpb24vaGlnaGxpZ2h0L2hpZ2hsaWdodC5jb21wb25lbnQnO1xuXG5leHBvcnQgbmFtZXNwYWNlIFJpdlNlbGVjdCB7XG4gIC8vLy8vLy8vLy8vLy9cbiAgLy8gT3B0aW9ucyAvL1xuICAvLy8vLy8vLy8vLy8vXG5cbiAgLyoqXG4gICAqIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgC0tLS0tLS0tLS0tLS0tLS0tLS3ilIDilIDilIDilJBcbiAgICog4pSCIEJhc2VPcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxuICAgKiDilIIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCXG4gICAqIOKUgiBUaGUgY29yZSBkYXRhIHJlcXVpcmVkIGZvciBlYWNoIG9wdGlvbiAgICDilIJcbiAgICog4pSCIChzdWNoIGFzIGlkIGFuZCB0aXRsZSkuICAgICAgICAgICAgICAgICAgIOKUglxuICAgKiDilJzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAtLS0tLS0tLS0tLS0tLS0tLS0t4pSA4pSA4pSkXG4gICAqIOKUgiBPcHRpb24gKEJhc2VPcHRpb24gKyBjaGlsZHJlbikgICAgICAgICAgICDilIJcbiAgICog4pSCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxuICAgKiDilIIgUHJvdmlkZXMgcmVjdXJzaXZlIHR5cGUgc2FmZXR5IHRvIHRoZSAgICAg4pSCXG4gICAqIOKUgiB0eXBlIHNhZmV0eSB0byB0aGUgQmFzZU9wdGlvbi4gICAgICAgICAgICDilIJcbiAgICog4pSU4pSALS0tLS0tLS0tLS0tLS0tLS0t4pSsLS0tLS0tLeKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICAgKiAgICAgICAgICAgICAgICAgICAgIHxcbiAgICog4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pa84pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gICAqIOKUgiBTb3VyY2VPcHRpb24gKE9wdGlvbiArIHNlYXJjaCBoaWdobGlnaHRzKSDilIJcbiAgICog4pSCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxuICAgKiDilIIgQWRkcyBzZWFyY2ggaGlnaGxpZ2h0cyB0byB0aGUgT3B0aW9uIGFuZCAg4pSCXG4gICAqIOKUgiBpcyB0aGUgcmV0dXJuIHR5cGUgZm9yIHRoZSBvcHRpb24gU291cmNlICDilIJcbiAgICog4pSCIChkYXRhIGZldGNoZXIpIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgIOKUglxuICAgKiDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilKzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcbiAgICogICAgICAgICAgICAgICAgICAgICB8XG4gICAqIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKWvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICAgKiDilIIgRnVsbE9wdGlvbiAoU291cmNlT3B0aW9uICsgVUkgc3RhdGUpICAgICAg4pSCXG4gICAqIOKUgiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIJcbiAgICog4pSCIEF1Z21lbnRzIHRoZSBTb3VyY2VPcHRpb24gd2l0aCBhbGwgb2YgdGhlIOKUglxuICAgKiDilIIgVUkgaW5mb3JtYXRpb24gZnJvbSBvdGhlciBwYXJ0cyBvZiB0aGUgICAg4pSCXG4gICAqIOKUgiBzdGF0ZSwgc3VjaCBhcyBzZWxlY3Rpb24gc3RhdHVzLCB3aGV0aGVyICDilIJcbiAgICog4pSCIG9yIG5vdCB0aGUgbm9kZSBpcyBleHBhbmRlZCwgZXRjLiAgICAgICAgIOKUglxuICAgKiDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcbiAgICpcbiAgICogTm90ZSB0aGF0IHRoZSB1c2FnZXMgb2YgT21pdDwuLi4+IGluIHRoaXMgc2VjdGlvbiBhcmUgbm90IHJlcXVpcmVkLCBidXRcbiAgICogZG8gaGVscCBpbi1lZGl0b3IgdHlwZSBoaW50cyB0byBiZSBtb3JlIGNsZWFyIGFuZCBkaXJlY3QuXG4gICAqL1xuXG4gIGV4cG9ydCB0eXBlIEJhc2VPcHRpb24gPSB7XG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcjtcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIHN1YnRpdGxlPzogc3RyaW5nO1xuICAgIGhlbHA/OiBzdHJpbmc7XG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICB9O1xuICBleHBvcnQgdHlwZSBPcHRpb248TyBleHRlbmRzIEJhc2VPcHRpb24gPSBCYXNlT3B0aW9uPiA9IE8gJiB7XG4gICAgY2hpbGRyZW4/OiBPcHRpb248Tz5bXTtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBTb3VyY2VPcHRpb248TyBleHRlbmRzIEJhc2VPcHRpb24+ID0gT21pdDxcbiAgICBPcHRpb248Tz4sXG4gICAgJ2NoaWxkcmVuJ1xuICA+ICYge1xuICAgIHRpdGxlSGlnaGxpZ2h0SW5kaWNlcz86IEhpZ2hsaWdodENvbXBvbmVudC5IaWdobGlnaHRJbmRpY2VzW107XG4gICAgc3VidGl0bGVIaWdobGlnaHRJbmRpY2VzPzogSGlnaGxpZ2h0Q29tcG9uZW50LkhpZ2hsaWdodEluZGljZXNbXTtcbiAgICBjaGlsZHJlbj86IFNvdXJjZU9wdGlvbjxPPltdO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIE11bHRpU2VsZWN0aW9uU3RhdGUgPSBib29sZWFuIHwgJ2luZGV0ZXJtaW5hdGUnO1xuXG4gIGV4cG9ydCB0eXBlIEZ1bGxPcHRpb248TyBleHRlbmRzIEJhc2VPcHRpb24+ID0gT21pdDxcbiAgICBTb3VyY2VPcHRpb248Tz4sXG4gICAgJ2NoaWxkcmVuJ1xuICA+ICYge1xuICAgIHNlbGVjdGVkOiBNdWx0aVNlbGVjdGlvblN0YXRlO1xuICAgIGV4cGFuZGVkOiBib29sZWFuO1xuICAgIHNlbGVjdGFibGU6IGJvb2xlYW47XG4gICAgZXhwYW5kYWJsZTogYm9vbGVhbjtcbiAgICBjaGlsZHJlbj86IEZ1bGxPcHRpb248Tz5bXTtcbiAgfTtcblxuICAvLy8vLy8vLy8vLy8vLy8vLy8vXG4gIC8vIE9wdGlvbiBncm91cHMgLy9cbiAgLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gIC8qKlxuICAgKiBUaGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIE9wdGlvbkdyb3VwLCBTb3VyY2VPcHRpb25Hcm91cCwgYW5kXG4gICAqIEZ1bGxPcHRpb25Hcm91cCBpcyBhbmFsb2dvdXMgdG8gdGhlIG9wdGlvbiB0eXBlcyBhYm92ZS5cbiAgICpcbiAgICogQXMgd2l0aCBiZWZvcmUsIHRoZSB1c2Ugb2YgT21pdDwuLi4+IGlzIG5vdCByZXF1aXJlZCBidXQgaGVscGZ1bC5cbiAgICovXG5cbiAgZXhwb3J0IHR5cGUgT3B0aW9uR3JvdXA8TyBleHRlbmRzIEJhc2VPcHRpb24+ID0ge1xuICAgIGhlYWRlcj86IHN0cmluZztcbiAgICBvcHRpb25zOiBPcHRpb248Tz5bXTtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBTb3VyY2VPcHRpb25Hcm91cDxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSBPbWl0PFxuICAgIE9wdGlvbkdyb3VwPE8+LFxuICAgICdvcHRpb25zJ1xuICA+ICYge1xuICAgIG9wdGlvbnM6IFNvdXJjZU9wdGlvbjxPPltdO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIEZ1bGxPcHRpb25Hcm91cDxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSBPbWl0PFxuICAgIFNvdXJjZU9wdGlvbkdyb3VwPE8+LFxuICAgICdvcHRpb25zJ1xuICA+ICYge1xuICAgIG9wdGlvbnM6IEZ1bGxPcHRpb248Tz5bXTtcbiAgfTtcblxuICAvKipcbiAgICogVGhlIE9wdGlvblNldCBjbGFzcyBwcm92aWRlcyBTZXQtbGlrZSBmdW5jdGlvbmFsaXR5LCBidXQgdW5pcXVlbmVzcyBpc1xuICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBvcHRpb24ncyBJRCByYXRoZXIgdGhhbiB0aGUgb2JqZWN0IHJlZmVyZW5jZS5cbiAgICovXG4gIGV4cG9ydCBjbGFzcyBPcHRpb25TZXQ8TyBleHRlbmRzIEJhc2VPcHRpb24+IGV4dGVuZHMgU2V0PFNvdXJjZU9wdGlvbjxPPj4ge1xuICAgIC8vIFBhcmFsbGVsIGlkIOKGkiBvcHRpb24gbWFwIHNvIGhhcygpL2FkZCgpL2RlbGV0ZSgpIGFyZSBPKDEpIGluc3RlYWQgb2ZcbiAgICAvLyBzcHJlYWRpbmcgdGhlIFNldCBhbmQgbGluZWFyLXNjYW5uaW5nIGl0LiBSZWJ1aWxkaW5nIGFuIE8oTsKyKSBsb29rdXBcbiAgICAvLyBmb3IgYSAxNmstb3B0aW9uIHNlbGVjdGlvbiB3YXMgdGhlIHByaW1hcnkgY2F1c2Ugb2YgdGhlIG11bHRpLW1pbnV0ZVxuICAgIC8vIGZyZWV6ZSB0aGF0IHN1cmZhY2VkIFJWVC0yNTM4MydzIHRyZWUtc2VsZWN0IHNjYWxlIHByb2JsZW0uXG4gICAgcHJpdmF0ZSByZWFkb25seSBieUlkID0gbmV3IE1hcDxPWydpZCddLCBTb3VyY2VPcHRpb248Tz4+KCk7XG5cbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZXM/OiBJdGVyYWJsZTxTb3VyY2VPcHRpb248Tz4+IHwgbnVsbCkge1xuICAgICAgc3VwZXIoKTtcbiAgICAgIGlmICh2YWx1ZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICAgICB0aGlzLmFkZCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBvdmVycmlkZSBoYXMob3B0aW9uOiBTb3VyY2VPcHRpb248Tz4gfCBGdWxsT3B0aW9uPE8+KSB7XG4gICAgICByZXR1cm4gdGhpcy5ieUlkLmhhcyhvcHRpb24uaWQpO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGFkZChvcHRpb246IFNvdXJjZU9wdGlvbjxPPikge1xuICAgICAgaWYgKHRoaXMuYnlJZC5oYXMob3B0aW9uLmlkKSkge1xuICAgICAgICAvLyBQcmVzZXJ2ZSBpbnNlcnRpb24gb3JkZXIgd2hpbGUgc3dhcHBpbmcgdG8gdGhlIG5ld2VyIG9iamVjdFxuICAgICAgICAvLyByZWZlcmVuY2UuIFJlYnVpbGRpbmcgdGhlIGZ1bGwgU2V0IG1hdGNoZXMgdGhlIHByZXZpb3VzXG4gICAgICAgIC8vIGltcGxlbWVudGF0aW9uJ3Mgc2VtYW50aWNzOyB0aGUgY29zdCBvZiB0aGF0IHJlYnVpbGQgb25seSBoaXRzXG4gICAgICAgIC8vIHRoZSByYXJlIFwicmUtYWRkIGV4aXN0aW5nXCIgcGF0aCDigJQgdGhlIGNvbW1vbiBPKE7CsikgY2FzZSAoZnJlc2hcbiAgICAgICAgLy8gYWRkcyBkdXJpbmcgY29uc3RydWN0aW9uKSBubyBsb25nZXIgcGF5cyBpdC5cbiAgICAgICAgY29uc3QgaXRlbXMgPSBbLi4udGhpc10ubWFwKG8gPT4gKG8uaWQgPT09IG9wdGlvbi5pZCA/IG9wdGlvbiA6IG8pKTtcbiAgICAgICAgdGhpcy5ieUlkLnNldChvcHRpb24uaWQsIG9wdGlvbik7XG4gICAgICAgIHN1cGVyLmNsZWFyKCk7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgc3VwZXIuYWRkKGl0ZW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5ieUlkLnNldChvcHRpb24uaWQsIG9wdGlvbik7XG4gICAgICAgIHN1cGVyLmFkZChvcHRpb24pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZGVsZXRlKG9wdGlvbjogU291cmNlT3B0aW9uPE8+KSB7XG4gICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuYnlJZC5nZXQob3B0aW9uLmlkKTtcbiAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICB0aGlzLmJ5SWQuZGVsZXRlKG9wdGlvbi5pZCk7XG4gICAgICAgIHN1cGVyLmRlbGV0ZShleGlzdGluZyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIG92ZXJyaWRlIGNsZWFyKCkge1xuICAgICAgdGhpcy5ieUlkLmNsZWFyKCk7XG4gICAgICBzdXBlci5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIC8vLy8vLy8vLy8vXG4gIC8vIFN0YXRlIC8vXG4gIC8vLy8vLy8vLy8vXG5cbiAgLyoqXG4gICAqIFRoZSBDb3JlU3RhdGUgcHJvdmlkZXMgYWxsIG9mIHRoZSBmb3VuZGF0aW9uYWwgcGllY2VzIG9mIHN0YXRlIHJlcXVpcmVkXG4gICAqIGZvciBhIHdvcmtpbmcgY29tcG9uZW50LiBGdWxsU3RhdGUgaXMgYSBwdXJlIGRlcml2YXRpb24gb2YgQ29yZVN0YXRlIHBsdXNcbiAgICogdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgYW5kIHByb3ZpZGVzIGNvbnZlbmllbmNlcyBmb3IgcmVuZGVyaW5nIHRoZVxuICAgKiBjb21wb25lbnRzLiBBY3Rpb25zIGFuZCB0aGUgY29yZSBzdGF0ZSBhcmUgcGFzc2VkIHRvIHRoZSByZWR1Y2VyIHRvXG4gICAqIHByb2R1Y2UgbmV3IENvcmVTdGF0ZXMgKHdoaWNoIGFyZSB0aGVuIHVzZWQgdG8gY2FsY3VsYXRlIG5ldyBGdWxsU3RhdGVzKS5cbiAgICpcbiAgICog4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gICAqIOKUgiAgVUkgIOKXhOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICAgKiDilJTilIDilIDilKzilIDilIDilIDilJggICAgICAgIOKUglxuICAgKiAgICDilIIgICAgICAgICAgICDilIJcbiAgICog4pSM4pSA4pSA4pa84pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQICAg4pSCXG4gICAqIOKUgiAgQWN0aW9ucyAg4pSCICAg4pSCXG4gICAqIOKUlOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgIOKUglxuICAgKiAgICDilIIgICAgICAgICAgICDilIJcbiAgICog4pSM4pSA4pSA4pa84pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pS04pSA4pSQXG4gICAqIOKUgiAgU3RhdGUgcmVkdWNlciAg4pSCXG4gICAqIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICAgKi9cblxuICBleHBvcnQgdHlwZSBPcmRlckJ5ID0gJ3RpdGxlJyB8ICdjb3VudCcgfCAnc291cmNlJztcblxuICBjb25zdCBNSU5fT1BUSU9OU19GT1JfQ09OVFJPTFMgPSA1O1xuXG4gIGV4cG9ydCB0eXBlIENvcmVTdGF0ZTxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSB7XG4gICAgcXVlcnk6IHtcbiAgICAgIHNlYXJjaDogc3RyaW5nO1xuICAgICAgb3JkZXI6IE9yZGVyQnk7XG4gICAgfTtcbiAgICBsb2FkOiB7XG4gICAgICBsb2FkaW5nOiBib29sZWFuO1xuICAgICAgZXJyb3I6IHVua25vd24gfCBudWxsO1xuICAgIH07XG4gICAgc291cmNlT3B0aW9uR3JvdXBzOiBTb3VyY2VPcHRpb25Hcm91cDxPPltdO1xuICAgIC8qKlxuICAgICAqIFN0b3JlcyB0aGUgdW5maWx0ZXJlZCBvcmlnaW5hbCBvcHRpb24gZ3JvdXBzIHdoZW4gc2VhcmNoIGZpbHRlcmluZyBpcyBhY3RpdmUuXG4gICAgICogVXNlZCBieSBgYWxsb3dTZWxlY3ROb25MZWFmRHVyaW5nU2VhcmNoYCB0byBzZWxlY3QgYWxsIGNoaWxkcmVuIG9mIGEgcGFyZW50LFxuICAgICAqIGluY2x1ZGluZyB0aG9zZSBub3QgdmlzaWJsZSBpbiB0aGUgZmlsdGVyZWQgc2VhcmNoIHJlc3VsdHMuXG4gICAgICovXG4gICAgb3JpZ2luYWxPcHRpb25Hcm91cHM6IFNvdXJjZU9wdGlvbkdyb3VwPE8+W107XG4gICAgc2VsZWN0aW9uOiB7XG4gICAgICBzZWxlY3RlZDogT3B0aW9uU2V0PE8+O1xuICAgIH07XG4gICAgZGlzcGxheToge1xuICAgICAgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgICAgIG9wZW46IGJvb2xlYW47XG4gICAgICBleHBhbmRlZE9wdGlvbnM6IFNldDxPWydpZCddPjtcbiAgICB9O1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIEZ1bGxTdGF0ZTxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSBDb3JlU3RhdGU8Tz4gJiB7XG4gICAgcXVlcnk6IHtcbiAgICAgIHNob3dTZWFyY2g6IGJvb2xlYW47XG4gICAgICBzZWFyY2hQbGFjZWhvbGRlcjogc3RyaW5nO1xuICAgICAgc2hvd09yZGVyOiBib29sZWFuO1xuICAgIH07XG4gICAgZnVsbE9wdGlvbkdyb3VwczogRnVsbE9wdGlvbkdyb3VwPE8+W107XG4gICAgc2VsZWN0aW9uOiB7XG4gICAgICBhbGxvd011bHRpU2VsZWN0OiBib29sZWFuO1xuICAgICAgYWxsb3dTZWxlY3RBbGw6IGJvb2xlYW47XG4gICAgICB2aXNpYmxlU2VsZWN0aW9uU3RhdGU6IE11bHRpU2VsZWN0aW9uU3RhdGU7XG4gICAgfTtcbiAgICBkaXNwbGF5OiB7XG4gICAgICBmb3JtYXR0ZWRTZWxlY3RlZE9wdGlvbnM6IHN0cmluZztcbiAgICAgIHplcm9TdGF0ZU1lc3NhZ2U6IHN0cmluZyB8IG51bGw7XG4gICAgICBkaXZpZGVyczogYm9vbGVhbjtcbiAgICAgIGlubGluZTogYm9vbGVhbjtcbiAgICAgIG1heEhlaWdodDogc3RyaW5nIHwgbnVsbDtcbiAgICAgIG1heFdpZHRoOiBzdHJpbmcgfCBudWxsO1xuICAgICAgbWluSGVpZ2h0OiBzdHJpbmcgfCBudWxsO1xuICAgICAgbWluV2lkdGg6IHN0cmluZyB8IG51bGw7XG4gICAgICBkaXNwbGF5TGltaXRNZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xuICAgICAgc2hvd1NpbmdsZVNlbGVjdGVkOiBib29sZWFuO1xuICAgICAgcGlsbENvdW50OiBudW1iZXI7XG4gICAgfTtcbiAgfTtcblxuICAvLy8vLy8vLy8vLy8vXG4gIC8vIEFjdGlvbnMgLy9cbiAgLy8vLy8vLy8vLy8vL1xuXG4gIGV4cG9ydCB0eXBlIEFjdGlvbjxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPVxuICAgIHwgeyB0eXBlOiAnbG9hZCcgfVxuICAgIHwgeyB0eXBlOiAnb3BlbkNoYW5nZSc7IG9wZW46IGJvb2xlYW4gfVxuICAgIHwgeyB0eXBlOiAnc2VhcmNoQ2hhbmdlJzsgcGF5bG9hZDogc3RyaW5nIH1cbiAgICB8IHsgdHlwZTogJ29yZGVyQ2hhbmdlJzsgcGF5bG9hZDogT3JkZXJCeSB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdzZWxlY3Rpb25DaGFuZ2UnO1xuICAgICAgICBwYXlsb2FkOiBDb3JlU3RhdGU8Tz5bJ3NlbGVjdGlvbiddO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAndG9nZ2xlT3B0aW9uU2VsZWN0ZWQnO1xuICAgICAgICBpZDogT1snaWQnXTtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3NldFNlbGVjdGVkT3B0aW9uJztcbiAgICAgICAgaWQ6IE9bJ2lkJ107XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICd2aXNpYmxlU2VsZWN0ZWRDaGFuZ2UnO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAndG9nZ2xlT3B0aW9uRXhwYW5kZWQnO1xuICAgICAgICBpZDogT1snaWQnXTtcbiAgICAgIH07XG5cbiAgdHlwZSBJbnRlcm5hbEFjdGlvbjxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPVxuICAgIHwge1xuICAgICAgICB0eXBlOiAnbG9hZENvbXBsZXRlJztcbiAgICAgICAgZGF0YTogU291cmNlT3B0aW9uR3JvdXA8Tz5bXTtcbiAgICAgICAgLyoqIE9yaWdpbmFsIHVuZmlsdGVyZWQgZGF0YSwgcHJvdmlkZWQgd2hlbiBzZWFyY2ggaXMgYWN0aXZlICovXG4gICAgICAgIG9yaWdpbmFsRGF0YT86IFNvdXJjZU9wdGlvbkdyb3VwPE8+W107XG4gICAgICB9XG4gICAgfCB7IHR5cGU6ICdsb2FkRXJyb3InOyBlcnJvcjogdW5rbm93biB9O1xuXG4gIC8vLy8vLy8vLy8vL1xuICAvLyBTb3VyY2UgLy9cbiAgLy8vLy8vLy8vLy8vXG5cbiAgLyoqXG4gICAqIFRoZSBTb3VyY2UncyBqb2IgaXMgdG8gZmV0Y2ggb3B0aW9ucyAoYmFzZWQgb24gdGhlIGN1cnJlbnQgc3RhdGUpIHdoaWNoXG4gICAqIHRoZW4gYmxlbmQgd2l0aCB0aGUgb3RoZXIgcGllY2VzIG9mIHN0YXRlIHRvIHByb2R1Y2UgdGhlIEZ1bGxTdGF0ZS5cbiAgICovXG5cbiAgZXhwb3J0IHR5cGUgU291cmNlUmVzdWx0PE8gZXh0ZW5kcyBCYXNlT3B0aW9uPiA9XG4gICAgfCBTb3VyY2VPcHRpb25Hcm91cDxPPltdXG4gICAgfCB7XG4gICAgICAgIGRhdGE6IFNvdXJjZU9wdGlvbkdyb3VwPE8+W107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBPcmlnaW5hbCB1bmZpbHRlcmVkIGRhdGEsIHByb3ZpZGVkIHdoZW4gc2VhcmNoIGZpbHRlcmluZyBpcyBhY3RpdmUuXG4gICAgICAgICAqIFVzZWQgYnkgYGFsbG93U2VsZWN0Tm9uTGVhZkR1cmluZ1NlYXJjaGAgdG8gc2VsZWN0IGFsbCBjaGlsZHJlbiBvZlxuICAgICAgICAgKiBhIHBhcmVudCwgaW5jbHVkaW5nIHRob3NlIG5vdCB2aXNpYmxlIGluIHRoZSBmaWx0ZXJlZCBzZWFyY2ggcmVzdWx0cy5cbiAgICAgICAgICovXG4gICAgICAgIG9yaWdpbmFsRGF0YT86IFNvdXJjZU9wdGlvbkdyb3VwPE8+W107XG4gICAgICB9O1xuXG4gIGV4cG9ydCB0eXBlIFNvdXJjZTxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSAoXG4gICAgcXVlcnk6IENvcmVTdGF0ZTxPPlsncXVlcnknXSxcbiAgICBtb3N0UmVjZW50QWN0aW9uOiBBY3Rpb248Tz4sXG4gICkgPT4gUHJvbWlzZTxTb3VyY2VSZXN1bHQ8Tz4+O1xuXG4gIC8vLy8vLy8vLy8vLy9cbiAgLy8gTWFuYWdlciAvL1xuICAvLy8vLy8vLy8vLy8vXG5cbiAgZXhwb3J0IHR5cGUgTWFuYWdlcjxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSB7XG4gICAgYWN0aW9uczogU3ViamVjdDxBY3Rpb248Tz4+O1xuICAgIHN0YXRlOiBDb25uZWN0YWJsZTxGdWxsU3RhdGU8Tz4+O1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIE1hbmFnZXJPcHRpb25zPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPiA9IHtcbiAgICBpbml0aWFsU3RhdGU/OiBEZWVwUGFydGlhbDxDb3JlU3RhdGU8Tz4+O1xuICAgIGFsbG93TXVsdGlTZWxlY3Q/OiBib29sZWFuO1xuICAgIGFsbG93U2VhcmNoPzogYm9vbGVhbjtcbiAgICBhbGxvd1NlbGVjdEFsbD86IGJvb2xlYW47XG4gICAgYWxsb3dPcmRlcj86IGJvb2xlYW47XG4gICAgc2VhcmNoUGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gICAgZGl2aWRlcnM/OiBib29sZWFuO1xuICAgIGlubGluZT86IGJvb2xlYW47XG4gICAgbWF4SGVpZ2h0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICBtYXhXaWR0aD86IHN0cmluZyB8IG51bGw7XG4gICAgbWluSGVpZ2h0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICBtaW5XaWR0aD86IHN0cmluZyB8IG51bGw7XG4gICAgZGlzcGxheUxpbWl0PzogbnVtYmVyO1xuICAgIHNlbGVjdGVkT3B0aW9uTGltaXQ/OiBudW1iZXI7XG4gICAgc2hvd1NpbmdsZVNlbGVjdGVkPzogYm9vbGVhbjtcbiAgICB1c2VUb3BMZXZlbE9wdGlvbnNGb3JEaXNwbGF5PzogYm9vbGVhbjtcbiAgICBnZXRDdXN0b21PcHRpb25EaXNwbGF5PzogKHNlbGVjdGVkT3B0aW9uczogU291cmNlT3B0aW9uPE8+W10pID0+IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIG5vbi1sZWFmIG5vZGVzIChwYXJlbnRzKSByZW1haW4gc2VsZWN0YWJsZSBkdXJpbmcgc2VhcmNoLFxuICAgICAqIGFuZCBzZWxlY3RpbmcgdGhlbSB3aWxsIHNlbGVjdC9kZXNlbGVjdCBBTEwgY2hpbGRyZW4gZnJvbSB0aGUgb3JpZ2luYWxcbiAgICAgKiBkYXRhc2V0LCBub3QganVzdCB0aGUgdmlzaWJsZSBmaWx0ZXJlZCByZXN1bHRzLlxuICAgICAqXG4gICAgICogRGVmYXVsdDogZmFsc2UgKGN1cnJlbnQgYmVoYXZpb3IgLSBwYXJlbnRzIGFyZSBub3Qgc2VsZWN0YWJsZSBkdXJpbmcgc2VhcmNoKVxuICAgICAqL1xuICAgIGFsbG93U2VsZWN0Tm9uTGVhZkR1cmluZ1NlYXJjaD86IGJvb2xlYW47XG4gIH07XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1hbmFnZXI8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHNvdXJjZTogU291cmNlPE8+LFxuICAgIG9wdGlvbnM/OiBNYW5hZ2VyT3B0aW9uczxPPixcbiAgKTogTWFuYWdlcjxPPiB7XG4gICAgY29uc3QgZGVmYXVsdFN0YXRlOiBDb3JlU3RhdGU8Tz4gPSB7XG4gICAgICBxdWVyeToge1xuICAgICAgICBzZWFyY2g6ICcnLFxuICAgICAgICBvcmRlcjogJ3RpdGxlJyxcbiAgICAgIH0sXG4gICAgICBsb2FkOiB7XG4gICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH0sXG4gICAgICBzb3VyY2VPcHRpb25Hcm91cHM6IFtdLFxuICAgICAgb3JpZ2luYWxPcHRpb25Hcm91cHM6IFtdLFxuICAgICAgc2VsZWN0aW9uOiB7XG4gICAgICAgIHNlbGVjdGVkOiBuZXcgT3B0aW9uU2V0KCksXG4gICAgICB9LFxuICAgICAgZGlzcGxheToge1xuICAgICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCcsXG4gICAgICAgIG9wZW46IGZhbHNlLFxuICAgICAgICBleHBhbmRlZE9wdGlvbnM6IG5ldyBTZXQoKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCBkZWZhdWx0ZWRJbml0aWFsU3RhdGU6IENvcmVTdGF0ZTxPPiA9IGRlZmF1bHRzRGVlcChcbiAgICAgIHt9LFxuICAgICAgb3B0aW9ucz8uaW5pdGlhbFN0YXRlLFxuICAgICAgZGVmYXVsdFN0YXRlLFxuICAgICk7XG5cbiAgICBjb25zdCBhY3Rpb25zOiBTdWJqZWN0PEFjdGlvbjxPPj4gPSBuZXcgU3ViamVjdCgpO1xuICAgIGNvbnN0IGludGVybmFsQWN0aW9uczogU3ViamVjdDxJbnRlcm5hbEFjdGlvbjxPPj4gPSBuZXcgU3ViamVjdCgpO1xuXG4gICAgY29uc3QgY29yZVN0YXRlV2l0aFNlbGVjdGlvblNuYXBzaG90OiBPYnNlcnZhYmxlPFxuICAgICAgW0NvcmVTdGF0ZTxPPiwgT3B0aW9uU2V0PE8+XVxuICAgID4gPSBtZXJnZShhY3Rpb25zLCBpbnRlcm5hbEFjdGlvbnMpLnBpcGUoXG4gICAgICBzY2FuPEFjdGlvbjxPPiB8IEludGVybmFsQWN0aW9uPE8+LCBbQ29yZVN0YXRlPE8+LCBPcHRpb25TZXQ8Tz5dPihcbiAgICAgICAgKFtzdGF0ZSwgc25hcHNob3RdLCBhY3Rpb24pID0+IHtcbiAgICAgICAgICBjb25zdCBuZXdTdGF0ZSA9IHNpZGVFZmZlY3RzKFxuICAgICAgICAgICAgcmVkdWNlKHN0YXRlLCBhY3Rpb24sIG9wdGlvbnMpLFxuICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgaW50ZXJuYWxBY3Rpb25zLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBuZXdTZWxlY3Rpb25TbmFwc2hvdCA9XG4gICAgICAgICAgICAoYWN0aW9uLnR5cGUgPT09ICdvcGVuQ2hhbmdlJyAmJiBhY3Rpb24ub3BlbikgfHxcbiAgICAgICAgICAgIChhY3Rpb24udHlwZSA9PT0gJ2xvYWRDb21wbGV0ZScgJiZcbiAgICAgICAgICAgICAgKG5ld1N0YXRlLmRpc3BsYXkub3BlbiB8fCBvcHRpb25zPy5pbmxpbmUpKVxuICAgICAgICAgICAgICA/IGNyZWF0ZVNlbGVjdGlvblNuYXBzaG90V2l0aEFuY2VzdG9ycyhuZXdTdGF0ZSlcbiAgICAgICAgICAgICAgOiBzbmFwc2hvdDtcblxuICAgICAgICAgIHJldHVybiBbbmV3U3RhdGUsIG5ld1NlbGVjdGlvblNuYXBzaG90XTtcbiAgICAgICAgfSxcbiAgICAgICAgW2RlZmF1bHRlZEluaXRpYWxTdGF0ZSwgbmV3IE9wdGlvblNldDxPPigpXSxcbiAgICAgICksXG4gICAgICBzdGFydFdpdGg8W0NvcmVTdGF0ZTxPPiwgT3B0aW9uU2V0PE8+XT4oW1xuICAgICAgICBkZWZhdWx0ZWRJbml0aWFsU3RhdGUsXG4gICAgICAgIG5ldyBPcHRpb25TZXQ8Tz4oKSxcbiAgICAgIF0pLFxuICAgICk7XG5cbiAgICBjb25zdCBzdGF0ZTogQ29ubmVjdGFibGU8RnVsbFN0YXRlPE8+PiA9IGNvbm5lY3RhYmxlKFxuICAgICAgY29yZVN0YXRlV2l0aFNlbGVjdGlvblNuYXBzaG90LnBpcGUoXG4gICAgICAgIG1hcCgoW3MsIHNlbGVjdGlvbkF0T3Blbl0pID0+IHtcbiAgICAgICAgICBjb25zdCBhbGxPcHRpb25Hcm91cHM6IEZ1bGxPcHRpb25Hcm91cDxPPltdID1cbiAgICAgICAgICAgIHMuc291cmNlT3B0aW9uR3JvdXBzLm1hcChvcHRpb25Hcm91cCA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4ub3B0aW9uR3JvdXAsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uR3JvdXAub3B0aW9ucy5tYXAob3B0aW9uID0+XG4gICAgICAgICAgICAgICAgICBhdWdtZW50T3B0aW9uVG9GdWxsT3B0aW9uKHMsIG9wdGlvbiwgb3B0aW9ucyksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgdG9wTGV2ZWxPcHRpb25zID0gZ2V0VG9wTGV2ZWxPcHRpb25zKGFsbE9wdGlvbkdyb3Vwcyk7XG5cbiAgICAgICAgICBjb25zdCBzb3J0ZWRPcHRpb25Hcm91cHMgPSBvcHRpb25zPy5hbGxvd011bHRpU2VsZWN0XG4gICAgICAgICAgICA/IHNvcnRPcHRpb25zQnlQcmV2aW91c2x5U2VsZWN0ZWRTdGF0ZShcbiAgICAgICAgICAgICAgICBhbGxPcHRpb25Hcm91cHMsXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uQXRPcGVuLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IGFsbE9wdGlvbkdyb3VwcztcblxuICAgICAgICAgIGNvbnN0IGRpc3BsYXlMaW1pdGVkT3B0aW9uR3JvdXBzID0gYXBwbHlEaXNwbGF5TGltaXQoXG4gICAgICAgICAgICBzb3J0ZWRPcHRpb25Hcm91cHMsXG4gICAgICAgICAgICBvcHRpb25zPy5kaXNwbGF5TGltaXQgPz8gMTAwLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgZnVsbE9wdGlvbkdyb3VwcyA9IGFwcGx5U2VsZWN0ZWRPcHRpb25MaW1pdChcbiAgICAgICAgICAgIHMsXG4gICAgICAgICAgICBkaXNwbGF5TGltaXRlZE9wdGlvbkdyb3VwcyxcbiAgICAgICAgICAgIHRvcExldmVsT3B0aW9ucyxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zLFxuICAgICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgICAgLi4ucy5xdWVyeSxcbiAgICAgICAgICAgICAgc2hvd1NlYXJjaDpcbiAgICAgICAgICAgICAgICAhIW9wdGlvbnM/LmFsbG93U2VhcmNoICYmXG4gICAgICAgICAgICAgICAgKCEhcy5xdWVyeS5zZWFyY2ggfHxcbiAgICAgICAgICAgICAgICAgIGNvdW50QWxsT3B0aW9ucyhhbGxPcHRpb25Hcm91cHMpID4gTUlOX09QVElPTlNfRk9SX0NPTlRST0xTKSxcbiAgICAgICAgICAgICAgc2VhcmNoUGxhY2Vob2xkZXI6IG9wdGlvbnM/LnNlYXJjaFBsYWNlaG9sZGVyID8/ICdTZWFyY2gnLFxuICAgICAgICAgICAgICBzaG93T3JkZXI6XG4gICAgICAgICAgICAgICAgISFvcHRpb25zPy5hbGxvd09yZGVyICYmXG4gICAgICAgICAgICAgICAgIXMucXVlcnkuc2VhcmNoICYmXG4gICAgICAgICAgICAgICAgY291bnRBbGxPcHRpb25zKGFsbE9wdGlvbkdyb3VwcykgPiBNSU5fT1BUSU9OU19GT1JfQ09OVFJPTFMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZnVsbE9wdGlvbkdyb3VwcyxcbiAgICAgICAgICAgIHNlbGVjdGlvbjoge1xuICAgICAgICAgICAgICAuLi5zLnNlbGVjdGlvbixcbiAgICAgICAgICAgICAgYWxsb3dNdWx0aVNlbGVjdDogISFvcHRpb25zPy5hbGxvd011bHRpU2VsZWN0LFxuICAgICAgICAgICAgICBhbGxvd1NlbGVjdEFsbDpcbiAgICAgICAgICAgICAgICAhIW9wdGlvbnM/LmFsbG93U2VsZWN0QWxsICYmXG4gICAgICAgICAgICAgICAgb3B0aW9ucz8uc2VsZWN0ZWRPcHRpb25MaW1pdCA9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHZpc2libGVTZWxlY3Rpb25TdGF0ZTpcbiAgICAgICAgICAgICAgICBnZXRQYXJlbnRNdWx0aVNlbGVjdGlvblN0YXRlKHRvcExldmVsT3B0aW9ucyksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGlzcGxheToge1xuICAgICAgICAgICAgICAuLi5zLmRpc3BsYXksXG4gICAgICAgICAgICAgIGZvcm1hdHRlZFNlbGVjdGVkT3B0aW9uczogZ2V0Rm9ybWF0dGVkT3B0aW9uc0ZvckRpc3BsYXkoXG4gICAgICAgICAgICAgICAgcyxcbiAgICAgICAgICAgICAgICB0b3BMZXZlbE9wdGlvbnMsXG4gICAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgemVyb1N0YXRlTWVzc2FnZTogZ2V0WmVyb1N0YXRlTWVzc2FnZShzKSxcbiAgICAgICAgICAgICAgZGl2aWRlcnM6ICEhb3B0aW9ucz8uZGl2aWRlcnMsXG4gICAgICAgICAgICAgIGlubGluZTogISFvcHRpb25zPy5pbmxpbmUsXG4gICAgICAgICAgICAgIG1heEhlaWdodDogb3B0aW9ucz8ubWF4SGVpZ2h0ID8/IG51bGwsXG4gICAgICAgICAgICAgIG1heFdpZHRoOiBvcHRpb25zPy5tYXhXaWR0aCA/PyBudWxsLFxuICAgICAgICAgICAgICBtaW5IZWlnaHQ6IG9wdGlvbnM/Lm1pbkhlaWdodCA/PyBudWxsLFxuICAgICAgICAgICAgICBtaW5XaWR0aDogb3B0aW9ucz8ubWluV2lkdGggPz8gbnVsbCxcbiAgICAgICAgICAgICAgZGlzcGxheUxpbWl0TWVzc2FnZTogZ2V0RGlzcGxheUxpbWl0TWVzc2FnZShcbiAgICAgICAgICAgICAgICBjb3VudFZpc2libGVPcHRpb25zKGZ1bGxPcHRpb25Hcm91cHMsICEhcy5xdWVyeS5zZWFyY2gpLFxuICAgICAgICAgICAgICAgIGNvdW50VmlzaWJsZU9wdGlvbnMoYWxsT3B0aW9uR3JvdXBzLCAhIXMucXVlcnkuc2VhcmNoKSxcbiAgICAgICAgICAgICAgICBzLnF1ZXJ5LFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBzaG93U2luZ2xlU2VsZWN0ZWQ6ICEhb3B0aW9ucz8uc2hvd1NpbmdsZVNlbGVjdGVkLFxuICAgICAgICAgICAgICBwaWxsQ291bnQ6IGdldFBpbGxDb3VudEZvckRpc3BsYXkocywgdG9wTGV2ZWxPcHRpb25zLCBvcHRpb25zKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICAge1xuICAgICAgICBjb25uZWN0b3I6ICgpID0+IG5ldyBSZXBsYXlTdWJqZWN0KDEpLFxuICAgICAgICByZXNldE9uRGlzY29ubmVjdDogZmFsc2UsXG4gICAgICB9LFxuICAgICk7XG4gICAgc3RhdGUuY29ubmVjdCgpO1xuXG4gICAgLy8gTG9hZCB0aGUgb3B0aW9ucyBpbW1lZGlhdGVseSBmb3Igc2VsZWN0cyB0aGF0IGFyZSBkaXNwbGF5ZWQgaW5saW5lLlxuICAgIGlmIChvcHRpb25zPy5pbmxpbmUpIGFjdGlvbnMubmV4dCh7IHR5cGU6ICdsb2FkJyB9KTtcblxuICAgIHJldHVybiB7IGFjdGlvbnMsIHN0YXRlIH07XG4gIH1cblxuICBleHBvcnQgdHlwZSBJbk1lbW9yeU1hbmFnZXJPcHRpb25zPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPiA9XG4gICAgTWFuYWdlck9wdGlvbnM8Tz4gJiB7XG4gICAgICBmdXNlT3B0aW9ucz86IElGdXNlT3B0aW9uczxPPjtcbiAgICB9O1xuXG4gIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJbk1lbW9yeU1hbmFnZXI8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIGZldGNoRGF0YXNldDogKCkgPT4gUHJvbWlzZTxPcHRpb25Hcm91cDxPPltdPiB8IE9wdGlvbkdyb3VwPE8+W10sXG4gICAgb3B0aW9ucz86IEluTWVtb3J5TWFuYWdlck9wdGlvbnM8Tz4sXG4gICk6IE1hbmFnZXI8Tz4ge1xuICAgIGxldCBkYXRhOiBPcHRpb25Hcm91cDxPPltdO1xuICAgIGxldCBmdXNlOiBGdXNlPE8+O1xuICAgIGxldCBleGFjdE1hdGNoOiBib29sZWFuID0gZmFsc2U7XG4gICAgbGV0IHBhcmVudHM6IE1hcDxPWydpZCddLCBPWydpZCddPjtcbiAgICBsZXQgY2hpbGRyZW46IE1hcDxPWydpZCddLCBPWydpZCddW10+O1xuXG4gICAgY29uc3Qgc291cmNlOiBTb3VyY2U8Tz4gPSBhc3luYyAocXVlcnksIG1vc3RSZWNlbnRBY3Rpb24pID0+IHtcbiAgICAgIC8qXG4gICAgICAgIFJlLWZldGNoIHRoZSBvcHRpb25zIG9uIHRoZSBsb2FkIGFjdGlvbiwgYW5kIHJlYnVpbGQgdGhlIHN0YXRlXG4gICAgICAgIGRlcml2ZWQgZnJvbSB0aGUgb3B0aW9uIGRhdGEuXG4gICAgICAqL1xuICAgICAgaWYgKFxuICAgICAgICBtb3N0UmVjZW50QWN0aW9uLnR5cGUgPT09ICdsb2FkJyB8fFxuICAgICAgICBtb3N0UmVjZW50QWN0aW9uLnR5cGUgPT09ICdvcGVuQ2hhbmdlJ1xuICAgICAgKSB7XG4gICAgICAgIGRhdGEgPSBhd2FpdCBmZXRjaERhdGFzZXQoKTtcbiAgICAgICAgY29uc3QgdG9wTGV2ZWxPcHRpb25zID0gZ2V0VG9wTGV2ZWxPcHRpb25zKGRhdGEpO1xuXG4gICAgICAgIGZ1c2UgPSBuZXcgRnVzZShmbGF0dGVuT3B0aW9ucyh0b3BMZXZlbE9wdGlvbnMsIGZhbHNlKSwge1xuICAgICAgICAgIHRocmVzaG9sZDogMC4yLFxuICAgICAgICAgIGtleXM6IFsndGl0bGUnXSxcbiAgICAgICAgICBpbmNsdWRlU2NvcmU6IHRydWUsXG4gICAgICAgICAgaW5jbHVkZU1hdGNoZXM6IHRydWUsXG4gICAgICAgICAgLi4ub3B0aW9ucz8uZnVzZU9wdGlvbnMsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV4YWN0TWF0Y2ggPSBvcHRpb25zPy5mdXNlT3B0aW9ucz8udGhyZXNob2xkID09IDA7XG4gICAgICAgIFtwYXJlbnRzLCBjaGlsZHJlbl0gPSBnZXRSZWxhdGlvbnNoaXBNYXBzKHRvcExldmVsT3B0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIC8qXG4gICAgICAgIElmIHRoZSB1c2VyIGlzIG5vdCBzZWFyY2hpbmcgb3B0aW9ucywgcmV0dXJuIHRoZSBmdWxsIHNldCBvZiBvcHRpb25zXG4gICAgICAgIHNvcnRlZCBhcHByb3ByaWF0ZWx5LlxuICAgICAgKi9cbiAgICAgIGlmICghcXVlcnkuc2VhcmNoKSB7XG4gICAgICAgIC8qXG4gICAgICAgICAgVGhlIGBzb3VyY2VgIG9yZGVyIHByb3BlcnR5IGFsbG93cyBmb3Igb3B0aW5nIG91dCBvZiBhdXRvbWF0aWNcbiAgICAgICAgICBzb3J0aW5nLCByZXR1cm5pbmcgdGhlIGRhdGEgaW4gaXRzIG5hdHVyYWwgaW5wdXQgb3JkZXIuXG4gICAgICAgICovXG4gICAgICAgIGlmIChxdWVyeS5vcmRlciA9PT0gJ3NvdXJjZScpIHJldHVybiBkYXRhO1xuXG4gICAgICAgIC8qXG4gICAgICAgICAgU29ydCB0aGUgb3B0aW9ucyBieSB0aXRsZSBhbmQgc3VidGl0bGUuXG4gICAgICAgICovXG4gICAgICAgIGlmIChxdWVyeS5vcmRlciA9PT0gJ3RpdGxlJykge1xuICAgICAgICAgIGZ1bmN0aW9uIHNvcnRCeVRpdGxlKG9wdGlvbnM6IE9wdGlvbjxPPltdKTogT3B0aW9uPE8+W10ge1xuICAgICAgICAgICAgcmV0dXJuIHNvcnRCeShvcHRpb25zLCBbXG4gICAgICAgICAgICAgIChvOiBPcHRpb248Tz4pID0+IG8udGl0bGUudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgICAgKG86IE9wdGlvbjxPPikgPT4gby5zdWJ0aXRsZT8udG9Mb3dlckNhc2UoKSA/PyAnJyxcbiAgICAgICAgICAgIF0pLm1hcChvcHRpb24gPT4gKHtcbiAgICAgICAgICAgICAgLi4ub3B0aW9uLFxuICAgICAgICAgICAgICBjaGlsZHJlbjogb3B0aW9uLmNoaWxkcmVuPy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IHNvcnRCeVRpdGxlKG9wdGlvbi5jaGlsZHJlbilcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZGF0YS5tYXAoZ3JvdXAgPT4gKHtcbiAgICAgICAgICAgIC4uLmdyb3VwLFxuICAgICAgICAgICAgb3B0aW9uczogc29ydEJ5VGl0bGUoZ3JvdXAub3B0aW9ucyksXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgICBTb3J0IHRoZSBvcHRpb25zIGJ5IGNvdW50LCB0aGVuIGJ5IHRpdGxlLCB0aGVuIGJ5IHN1YnRpdGxlLlxuICAgICAgICAqL1xuICAgICAgICBpZiAocXVlcnkub3JkZXIgPT09ICdjb3VudCcpIHtcbiAgICAgICAgICBmdW5jdGlvbiBzb3J0QnlDb3VudChvcHRpb25zOiBPcHRpb248Tz5bXSk6IE9wdGlvbjxPPltdIHtcbiAgICAgICAgICAgIHJldHVybiBzb3J0Qnkob3B0aW9ucywgW1xuICAgICAgICAgICAgICAobzogT3B0aW9uPE8+KSA9PiAoaXNOdW1iZXIoby5jb3VudCkgPyAtby5jb3VudCA6IEluZmluaXR5KSxcbiAgICAgICAgICAgICAgKG86IE9wdGlvbjxPPikgPT4gby50aXRsZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgICAobzogT3B0aW9uPE8+KSA9PiBvLnN1YnRpdGxlPy50b0xvd2VyQ2FzZSgpID8/ICcnLFxuICAgICAgICAgICAgXSkubWFwKG9wdGlvbiA9PiAoe1xuICAgICAgICAgICAgICAuLi5vcHRpb24sXG4gICAgICAgICAgICAgIGNoaWxkcmVuOiBvcHRpb24uY2hpbGRyZW4/Lmxlbmd0aFxuICAgICAgICAgICAgICAgID8gc29ydEJ5Q291bnQob3B0aW9uLmNoaWxkcmVuKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBkYXRhLm1hcChncm91cCA9PiAoe1xuICAgICAgICAgICAgLi4uZ3JvdXAsXG4gICAgICAgICAgICBvcHRpb25zOiBzb3J0QnlDb3VudChncm91cC5vcHRpb25zKSxcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLypcbiAgICAgICAgRXhlY3V0ZSB0aGUgc2VhcmNoIHdpdGggZnVzZS4gT25jZSB3ZSBoYXZlIHRoZSBzZWFyY2ggbWF0Y2ggZGF0YSxcbiAgICAgICAgcmVidWlsZCBqdXN0IGFzIG11Y2ggb2YgdGhlIHRyZWUgYXMgaXMgbmVlZGVkIHRvIHJlbmRlciB0aGUgc2VhcmNoXG4gICAgICAgIHJlc3VsdHMuIFNwZWNpZmljYWxseSwgYW55IG1hdGNoIHdpbGwgbmVlZCBhbGwgb2YgaXRzIGFuY2VzdG9ycyAoc29cbiAgICAgICAgdGhhdCBtYXRjaGVkIGxlYWYgbm9kZXMgYXJlIHNob3duIG5lc3RlZCB1bmRlciB0aGVpciBhbmNlc3RvcnMpIGFuZCBhbGxcbiAgICAgICAgb2YgaXRzIGNoaWxkcmVuIChiZWNhdXNlIGEgbWF0Y2hpbmcgcGFyZW50IG1lYW5zIHRoYXQgYWxsIG9mIGl0c1xuICAgICAgICBkZXNjZW5kYW50cyBtYXRjaCB0b28sIHBlciB0aGUgZGVzaWduIHNwZWNpZmljYXRpb24pLCB3aGV0aGVyIHRoZXlcbiAgICAgICAgdGhlbXNlbHZlcyBtYXRjaGVkIG9yIG5vdC5cbiAgICAgICovXG4gICAgICBjb25zdCBtYXRjaGVkT3B0aW9uczogRnVzZVJlc3VsdDxPPltdID0gZnVzZS5zZWFyY2gocXVlcnkuc2VhcmNoKTtcbiAgICAgIGNvbnN0IG1hdGNoZWRJZHM6IFNldDxPWydpZCddPiA9IG5ldyBTZXQoXG4gICAgICAgIG1hdGNoZWRPcHRpb25zLm1hcChyZXN1bHQgPT4gcmVzdWx0Lml0ZW0uaWQpLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgbWF0Y2hBbmNlc3RvcnM6IFNldDxPWydpZCddPiA9IG5ldyBTZXQoKTtcbiAgICAgIGZ1bmN0aW9uIGNvbGxlY3RBbmNlc3RvcnMoaWRzOiBPWydpZCddW10pIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgICAgICBjb25zdCBwYXJlbnRJZCA9IHBhcmVudHMuZ2V0KGlkKTtcbiAgICAgICAgICBpZiAocGFyZW50SWQpIHtcbiAgICAgICAgICAgIG1hdGNoQW5jZXN0b3JzLmFkZChwYXJlbnRJZCk7XG4gICAgICAgICAgICBjb2xsZWN0QW5jZXN0b3JzKFtwYXJlbnRJZF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29sbGVjdEFuY2VzdG9ycyhbLi4ubWF0Y2hlZElkc10pO1xuXG4gICAgICBjb25zdCBtYXRjaERlc2NlbmRhbnRzOiBTZXQ8T1snaWQnXT4gPSBuZXcgU2V0KCk7XG4gICAgICBmdW5jdGlvbiBjb2xsZWN0RGVzY2VuZGFudHMoaWRzOiBPWydpZCddW10pIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgICAgICBjb25zdCBjaGlsZHJlbklkcyA9IGNoaWxkcmVuLmdldChpZCk7XG4gICAgICAgICAgaWYgKGNoaWxkcmVuSWRzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuSWRzKSB7XG4gICAgICAgICAgICAgIG1hdGNoRGVzY2VuZGFudHMuYWRkKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbGxlY3REZXNjZW5kYW50cyhjaGlsZHJlbklkcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb2xsZWN0RGVzY2VuZGFudHMoWy4uLm1hdGNoZWRJZHNdKTtcblxuICAgICAgLypcbiAgICAgICAgTmV4dCwgd2UnbGwgY29tYmluZSBhbGwgdGhlIG1hdGNoZWQgSURzIHdpdGggdGhlaXIgZGlyZWN0IGFuY2VzdG9ycyBhbmRcbiAgICAgICAgZGVzY2FuZGFudHMsIGFuZCBmaWx0ZXIgdGhlIG9yaWdpbmFsIGRhdGEgc2V0IGRvd24gdG8ganVzdCB0aGVzZVxuICAgICAgICBvcHRpb25zLlxuICAgICAgKi9cbiAgICAgIGNvbnN0IGZpbHRlcmVkSWRzOiBTZXQ8T1snaWQnXT4gPSBuZXcgU2V0KFtcbiAgICAgICAgLi4ubWF0Y2hlZElkcyxcbiAgICAgICAgLi4ubWF0Y2hBbmNlc3RvcnMsXG4gICAgICAgIC4uLm1hdGNoRGVzY2VuZGFudHMsXG4gICAgICBdKTtcblxuICAgICAgZnVuY3Rpb24gZmlsdGVyT3B0aW9ucyhvcHRpb25zOiBPcHRpb248Tz5bXSk6IE9wdGlvbjxPPltdIHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWRPcHRpb25zOiBPcHRpb248Tz5bXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XG4gICAgICAgICAgaWYgKGZpbHRlcmVkSWRzLmhhcyhvcHRpb24uaWQpKSB7XG4gICAgICAgICAgICBmaWx0ZXJlZE9wdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgIC4uLm9wdGlvbixcbiAgICAgICAgICAgICAgY2hpbGRyZW46IG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyBmaWx0ZXJPcHRpb25zKG9wdGlvbi5jaGlsZHJlbilcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsdGVyZWRPcHRpb25zO1xuICAgICAgfVxuICAgICAgY29uc3QgZmlsdGVyZWRPcHRpb25zID0gZmlsdGVyT3B0aW9ucyhnZXRUb3BMZXZlbE9wdGlvbnMoZGF0YSkpO1xuXG4gICAgICAvKlxuICAgICAgICBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIGFuIGFycmF5IG9mIGRpc3RpbmN0IHRyZWVzICh0b3AtbGV2ZWwgb3B0aW9ucyksXG4gICAgICAgIGZpbHRlcmVkIGRvd24gdG8gb25seSB0aGUgb3B0aW9ucyBtYXRjaGluZyB0aGUgc2VhcmNoIHF1ZXJ5LiBOb3RlIHRoYXRcbiAgICAgICAgd2UgZG9uJ3QgY2FyZSBhYm91dCBzZWN0aW9uIGhlYWRlcnMgd2hlbiBzZWFyY2hpbmcgc2luY2UgcmVzdWx0cyBzaG91bGRcbiAgICAgICAgYmUgb3JkZXJlZCBieSByZWxldmFuY2UuIFRvIGNhbGN1bGF0ZSB0aGUgb3JkZXIgb2YgdGhlc2UgdHJlZXMsIHdlJ2xsXG4gICAgICAgIHRha2UgdGhlIHRvdGFsIG1hdGNoIHNjb3JlcyBmb3Igb3B0aW9ucyBmb3VuZCBpbiB0aGUgdHJlZSwgZGl2aWRlZCBieVxuICAgICAgICB0aGUgY291bnQgb2YgbWF0Y2hlcyBpbiB0aGUgdHJlZSAodGhlIGJlc3QgYXZlcmFnZSBtYXRjaCBzY29yZSkuXG4gICAgICAqL1xuXG4gICAgICBjb25zdCBzY29yZU1hcDogTWFwPE9bJ2lkJ10sIG51bWJlcj4gPSBuZXcgTWFwKFxuICAgICAgICBtYXRjaGVkT3B0aW9ucy5tYXAocmVzdWx0ID0+IFtyZXN1bHQuaXRlbS5pZCwgcmVzdWx0LnNjb3JlID8/IDBdKSxcbiAgICAgICk7XG4gICAgICBjb25zdCBvcmRlcmVkID0gc29ydEJ5KGZpbHRlcmVkT3B0aW9ucywgKG9wdGlvbjogT3B0aW9uPE8+KTogbnVtYmVyID0+IHtcbiAgICAgICAgZnVuY3Rpb24gY2FsY3VsYXRlU2NvcmUob3B0aW9uOiBPcHRpb248Tz4pOiBudW1iZXIge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoc2NvcmVNYXAuZ2V0KG9wdGlvbi5pZCkgPz8gMCkgK1xuICAgICAgICAgICAgKG9wdGlvbi5jaGlsZHJlbiA/PyBbXSkucmVkdWNlKFxuICAgICAgICAgICAgICAoc2NvcmUsIGNoaWxkKSA9PiBzY29yZSArIGNhbGN1bGF0ZVNjb3JlKGNoaWxkKSxcbiAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZUNvdW50KG9wdGlvbjogT3B0aW9uPE8+KTogbnVtYmVyIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgMSArXG4gICAgICAgICAgICAob3B0aW9uLmNoaWxkcmVuID8/IFtdKS5yZWR1Y2UoXG4gICAgICAgICAgICAgIChjb3VudCwgY2hpbGQpID0+IGNvdW50ICsgY2FsY3VsYXRlQ291bnQoY2hpbGQpLFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG90YWxTY29yZSA9IGNhbGN1bGF0ZVNjb3JlKG9wdGlvbik7XG4gICAgICAgIGNvbnN0IHRvdGFsQ291bnQgPSBjYWxjdWxhdGVDb3VudChvcHRpb24pO1xuICAgICAgICByZXR1cm4gdG90YWxTY29yZSAvIHRvdGFsQ291bnQ7XG4gICAgICB9KTtcblxuICAgICAgLypcbiAgICAgICAgRmluYWxseSwgd2UnbGwgYWRkIGhpZ2hsaWdodCBpbmRpY2VzIHRvIHRoZSBtYXRjaGVzIHNvIHRoYXQgdGhleSBjYW4gYmVcbiAgICAgICAgZGlzcGxheWVkIHRvIHRoZSB1c2VyLlxuICAgICAgKi9cblxuICAgICAgdHlwZSBIaWdobGlnaHRzID0ge1xuICAgICAgICB0aXRsZUhpZ2hsaWdodEluZGljZXM/OiBIaWdobGlnaHRDb21wb25lbnQuSGlnaGxpZ2h0SW5kaWNlc1tdO1xuICAgICAgICBzdWJ0aXRsZUhpZ2hsaWdodEluZGljZXM/OiBIaWdobGlnaHRDb21wb25lbnQuSGlnaGxpZ2h0SW5kaWNlc1tdO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGhpZ2hsaWdodE1hcDogTWFwPE9bJ2lkJ10sIEhpZ2hsaWdodHM+ID0gbmV3IE1hcChcbiAgICAgICAgbWF0Y2hlZE9wdGlvbnMubWFwKHJlc3VsdCA9PiB7XG4gICAgICAgICAgY29uc3QgaGlnaGxpZ2h0czogSGlnaGxpZ2h0cyA9IHt9O1xuICAgICAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgcmVzdWx0Lm1hdGNoZXMgPz8gW10pIHtcbiAgICAgICAgICAgIC8vIGZpbHRlciBvdXQgaW5leGFjdCBtYXRjaGVzXG4gICAgICAgICAgICBpZiAoZXhhY3RNYXRjaCAmJiBtYXRjaC52YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIG1hdGNoLmluZGljZXMgPSBtYXRjaC5pbmRpY2VzLmZpbHRlcihcbiAgICAgICAgICAgICAgICBpc0Z1c2VNYXRjaEV4YWN0KG1hdGNoLCBxdWVyeS5zZWFyY2gpLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoLmtleSA9PT0gJ3RpdGxlJykge1xuICAgICAgICAgICAgICBoaWdobGlnaHRzLnRpdGxlSGlnaGxpZ2h0SW5kaWNlcyA9IFsuLi5tYXRjaC5pbmRpY2VzXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaC5rZXkgPT09ICdzdWJ0aXRsZScpIHtcbiAgICAgICAgICAgICAgaGlnaGxpZ2h0cy5zdWJ0aXRsZUhpZ2hsaWdodEluZGljZXMgPSBbLi4ubWF0Y2guaW5kaWNlc107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbcmVzdWx0Lml0ZW0uaWQsIGhpZ2hsaWdodHNdO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICBmdW5jdGlvbiBhZGRIaWdobGlnaHRzVG9PcHRpb24ob3B0aW9uczogT3B0aW9uPE8+W10pOiBTb3VyY2VPcHRpb248Tz5bXSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLm1hcChvcHRpb24gPT4gKHtcbiAgICAgICAgICAuLi5vcHRpb24sXG4gICAgICAgICAgLi4uaGlnaGxpZ2h0TWFwLmdldChvcHRpb24uaWQpLFxuICAgICAgICAgIC4uLihvcHRpb24uY2hpbGRyZW4/Lmxlbmd0aFxuICAgICAgICAgICAgPyB7IGNoaWxkcmVuOiBhZGRIaWdobGlnaHRzVG9PcHRpb24ob3B0aW9uLmNoaWxkcmVuKSB9XG4gICAgICAgICAgICA6IG51bGwpLFxuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IFt7IG9wdGlvbnM6IGFkZEhpZ2hsaWdodHNUb09wdGlvbihvcmRlcmVkKSB9XSxcbiAgICAgICAgb3JpZ2luYWxEYXRhOiBkYXRhLFxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGNyZWF0ZU1hbmFnZXIoc291cmNlLCBvcHRpb25zKTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBpc0Z1c2VNYXRjaEV4YWN0KFxuICAgIG1hdGNoOiBGdXNlUmVzdWx0TWF0Y2gsXG4gICAgc2VhcmNoOiBzdHJpbmcsXG4gICk6IChcbiAgICB2YWx1ZTogUmFuZ2VUdXBsZSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIGFycmF5OiByZWFkb25seSBSYW5nZVR1cGxlW10sXG4gICkgPT4gYm9vbGVhbiB7XG4gICAgcmV0dXJuIG1hdGNoZWRJbmRpY2VzID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoZWRWYWx1ZSA9IG1hdGNoXG4gICAgICAgIC52YWx1ZSEuc2xpY2UobWF0Y2hlZEluZGljZXNbMF0sIG1hdGNoZWRJbmRpY2VzWzFdICsgMSlcbiAgICAgICAgLnRvTG93ZXJDYXNlKCk7XG4gICAgICAvLyBmdXNlIGlzIHdlaXJkIHdpdGggaXQncyBtYXRjaGVzLiBGb3IgYSB0ZXh0IG9mIFwicGxhbm5pbmdcIiBhbmQgYSBzZWFyY2ggc3RyaW5nIG9mIFwicGxhblwiXG4gICAgICAvLyB0aGUgbWF0Y2hlZCB2YWx1ZSB3aWxsIGJlIFwicGxhbm5cIiB3aXRoIHRoZSBleHRyYSAnbicgYmVjYXVzZSBvZiBpdHMgZnV6enkgbWF0Y2hpbmcuXG4gICAgICAvLyBzbyBqdXN0IG1ha2Ugc3VyZSB0aGUgbWF0Y2hlZCB2YWx1ZSBhdCBsZWFzdCBzdGFydHMgd2l0aCB0aGUgc2VhcmNoIHN0cmluZy5cbiAgICAgIC8vIGl0J3MgZXh0cmEgd2VpcmQgYmVjYXVzZSBmb3IgYSB0ZXh0IG9mIFwiYW5hbHl0aWNzXCIgYW5kIGEgc2VhcmNoIHN0cmluZyBvZiBcIm5hbHl0aWNzXCIsXG4gICAgICAvLyB0aGUgbWF0Y2hlZCB2YWx1ZSB3aWxsIGJlIFwiYW5hbHl0aWNzXCIuIFNvIHdlIGp1c3QgbmVlZCB0byBtYWtlIHN1cmUgdGhlIHRoZSBtYXRjaGVkIHZhbHVlXG4gICAgICAvLyBpbmNsdWRlcyB0aGUgc2VhcmNoIHN0cmluZyBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlIGV4dHJhIHN0dWZmIG9uIHRoZSBmcm9udCBvciB0aGUgZW5kLlxuICAgICAgcmV0dXJuIG1hdGNoZWRWYWx1ZS5pbmNsdWRlcyhzZWFyY2gudG9Mb3dlckNhc2UoKSk7XG4gICAgfTtcbiAgfVxuXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgLy8gU3RhdGUgcmVkdWNlciAod2l0aCBoZWxwZXJzKSAvL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgZnVuY3Rpb24gY3JlYXRlU2VsZWN0aW9uU25hcHNob3RXaXRoQW5jZXN0b3JzPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPE8+LFxuICApOiBPcHRpb25TZXQ8Tz4ge1xuICAgIGNvbnN0IHNuYXBzaG90ID0gbmV3IE9wdGlvblNldChzdGF0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQpO1xuICAgIGNvbnN0IHRvcExldmVsT3B0aW9ucyA9IGdldFRvcExldmVsT3B0aW9ucyhzdGF0ZS5zb3VyY2VPcHRpb25Hcm91cHMpO1xuICAgIGNvbnN0IFtwYXJlbnRzXSA9IGdldFJlbGF0aW9uc2hpcE1hcHModG9wTGV2ZWxPcHRpb25zKTtcblxuICAgIC8vIEZvciBlYWNoIHNlbGVjdGVkIG9wdGlvbiwgYWRkIGFsbCBpdHMgYW5jZXN0b3JzIHRvIHRoZSBzbmFwc2hvdFxuICAgIGZvciAoY29uc3Qgc2VsZWN0ZWRPcHRpb24gb2Ygc3RhdGUuc2VsZWN0aW9uLnNlbGVjdGVkKSB7XG4gICAgICBsZXQgY3VycmVudElkID0gc2VsZWN0ZWRPcHRpb24uaWQ7XG4gICAgICBsZXQgcGFyZW50SWQgPSBwYXJlbnRzLmdldChjdXJyZW50SWQpO1xuXG4gICAgICB3aGlsZSAocGFyZW50SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBwYXJlbnRPcHRpb24gPSBmaW5kT3B0aW9uKHRvcExldmVsT3B0aW9ucywgcGFyZW50SWQpO1xuICAgICAgICBpZiAocGFyZW50T3B0aW9uKSB7XG4gICAgICAgICAgc25hcHNob3QuYWRkKHBhcmVudE9wdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudElkID0gcGFyZW50SWQ7XG4gICAgICAgIHBhcmVudElkID0gcGFyZW50cy5nZXQoY3VycmVudElkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc25hcHNob3Q7XG4gIH1cblxuICBmdW5jdGlvbiBnZXREaXNwbGF5TGltaXRNZXNzYWdlPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBkaXNwbGF5ZWRPcHRpb25Db3VudDogbnVtYmVyLFxuICAgIHRvdGFsT3B0aW9uQ291bnQ6IG51bWJlcixcbiAgICBxdWVyeTogQ29yZVN0YXRlPE8+WydxdWVyeSddLFxuICApOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoZGlzcGxheWVkT3B0aW9uQ291bnQgPT09IHRvdGFsT3B0aW9uQ291bnQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHJpdk51bWJlciA9IG5ldyBOdW1iZXJQaXBlKCk7XG4gICAgY29uc3QgZGlzcGxheWVkID0gcml2TnVtYmVyLnRyYW5zZm9ybShkaXNwbGF5ZWRPcHRpb25Db3VudCk7XG4gICAgY29uc3QgdG90YWwgPSByaXZOdW1iZXIudHJhbnNmb3JtKHRvdGFsT3B0aW9uQ291bnQpO1xuICAgIGNvbnN0IHN0YXJ0ID0gYFNob3dpbmcgJHtkaXNwbGF5ZWR9IG9mICR7dG90YWx9IG9wdGlvbnNgO1xuICAgIHJldHVybiBxdWVyeS5zZWFyY2ggPyBgJHtzdGFydH0gbWF0Y2hpbmcgXCIke3F1ZXJ5LnNlYXJjaH1cImAgOiBzdGFydDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvdW50VmlzaWJsZU9wdGlvbnM8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIG9wdGlvbkdyb3VwczogRnVsbE9wdGlvbkdyb3VwPE8+W10sXG4gICAgbGVhZk9ubHk6IGJvb2xlYW4sXG4gICk6IG51bWJlciB7XG4gICAgZnVuY3Rpb24gY291bnQob3B0aW9uczogRnVsbE9wdGlvbjxPPltdKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiBvcHRpb25zLnJlZHVjZSgoYWNjLCBvcHRpb24pID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbi5leHBhbmRlZCAmJiBvcHRpb24uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBhY2MgKyAobGVhZk9ubHkgPyAwIDogMSkgKyBjb3VudChvcHRpb24uY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2MgKyAxO1xuICAgICAgfSwgMCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGlvbkdyb3Vwcy5yZWR1Y2UoXG4gICAgICAodG90YWwsIGdyb3VwKSA9PiB0b3RhbCArIGNvdW50KGdyb3VwLm9wdGlvbnMpLFxuICAgICAgMCxcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gY291bnRBbGxPcHRpb25zPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBvcHRpb25Hcm91cHM6IEZ1bGxPcHRpb25Hcm91cDxPPltdLFxuICApOiBudW1iZXIge1xuICAgIGZ1bmN0aW9uIGNvdW50KG9wdGlvbnM6IEZ1bGxPcHRpb248Tz5bXSk6IG51bWJlciB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5yZWR1Y2UoKGFjYywgb3B0aW9uKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb24uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBhY2MgKyAxICsgY291bnQob3B0aW9uLmNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjICsgMTtcbiAgICAgIH0sIDApO1xuICAgIH1cblxuICAgIHJldHVybiBvcHRpb25Hcm91cHMucmVkdWNlKFxuICAgICAgKHRvdGFsLCBncm91cCkgPT4gdG90YWwgKyBjb3VudChncm91cC5vcHRpb25zKSxcbiAgICAgIDAsXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGx5RGlzcGxheUxpbWl0PE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBvcHRpb25Hcm91cHM6IEZ1bGxPcHRpb25Hcm91cDxPPltdLFxuICAgIGRpc3BsYXlMaW1pdDogbnVtYmVyLFxuICApOiBGdWxsT3B0aW9uR3JvdXA8Tz5bXSB7XG4gICAgdHlwZSBEaXNwbGF5TGltaXRPcHRpb25zID0gW0Z1bGxPcHRpb248Tz5bXSwgbnVtYmVyXTtcbiAgICBmdW5jdGlvbiBmaWx0ZXJXaXRoTGltaXQoXG4gICAgICBvcHRpb25zOiBGdWxsT3B0aW9uPE8+W10sXG4gICAgICByZW1haW5pbmc6IG51bWJlcixcbiAgICApOiBEaXNwbGF5TGltaXRPcHRpb25zIHtcbiAgICAgIGxldCBsZWZ0ID0gcmVtYWluaW5nO1xuICAgICAgY29uc3QgdmlzaWJsZU9wdGlvbnM6IEZ1bGxPcHRpb248Tz5bXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xuICAgICAgICBpZiAobGVmdCA8PSAwKSBicmVhaztcblxuICAgICAgICBpZiAob3B0aW9uLmV4cGFuZGVkICYmIG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgW2NoaWxkT3B0aW9ucywgY2hpbGRSZW1haW5pbmddID0gZmlsdGVyV2l0aExpbWl0KFxuICAgICAgICAgICAgb3B0aW9uLmNoaWxkcmVuLFxuICAgICAgICAgICAgbGVmdCAtIDEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB2aXNpYmxlT3B0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIC4uLm9wdGlvbixcbiAgICAgICAgICAgIGNoaWxkcmVuOiBjaGlsZE9wdGlvbnMsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGVmdCA9IGNoaWxkUmVtYWluaW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZpc2libGVPcHRpb25zLnB1c2gob3B0aW9uKTtcbiAgICAgICAgICBsZWZ0LS07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBbdmlzaWJsZU9wdGlvbnMsIGxlZnRdO1xuICAgIH1cblxuICAgIHR5cGUgRGlzcGxheUxpbWl0R3JvdXBzID0gW0Z1bGxPcHRpb25Hcm91cDxPPltdLCBudW1iZXJdO1xuICAgIGNvbnN0IHN0YXJ0aW5nVmFsdWU6IERpc3BsYXlMaW1pdEdyb3VwcyA9IFtbXSwgZGlzcGxheUxpbWl0XTtcbiAgICBjb25zdCBbcmVzb2x2ZWRHcm91cHNdID0gb3B0aW9uR3JvdXBzLnJlZHVjZTxEaXNwbGF5TGltaXRHcm91cHM+KFxuICAgICAgKFtncm91cHMsIHJlbWFpbmluZ10sIGdyb3VwKSA9PiB7XG4gICAgICAgIGNvbnN0IFtvcHRpb25zLCBsZWZ0QWZ0ZXJdID0gZmlsdGVyV2l0aExpbWl0KGdyb3VwLm9wdGlvbnMsIHJlbWFpbmluZyk7XG4gICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBbWy4uLmdyb3VwcywgeyAuLi5ncm91cCwgb3B0aW9ucyB9XSwgbGVmdEFmdGVyXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gW2dyb3VwcywgcmVtYWluaW5nXTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHN0YXJ0aW5nVmFsdWUsXG4gICAgKTtcblxuICAgIHJldHVybiByZXNvbHZlZEdyb3VwcztcbiAgfVxuXG4gIC8qXG4gICAgU29ydCBvcHRpb25zIHNvIHRoYXQgcHJldmlvdXNseSBzZWxlY3RlZCBvcHRpb25zIChmcm9tIHByaW9yIHNlc3Npb25zKVxuICAgIGFwcGVhciBhdCB0aGUgdG9wIG9mIHRoZWlyIHBlZXIvc2libGluZyBsaXN0cy5cbiAgKi9cbiAgZnVuY3Rpb24gc29ydE9wdGlvbnNCeVByZXZpb3VzbHlTZWxlY3RlZFN0YXRlPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBvcHRpb25Hcm91cHM6IEZ1bGxPcHRpb25Hcm91cDxPPltdLFxuICAgIHNlbGVjdGlvbkF0T3BlbjogT3B0aW9uU2V0PE8+LFxuICApOiBGdWxsT3B0aW9uR3JvdXA8Tz5bXSB7XG4gICAgZnVuY3Rpb24gc29ydE9wdGlvbnMob3B0aW9uczogRnVsbE9wdGlvbjxPPltdKTogRnVsbE9wdGlvbjxPPltdIHtcbiAgICAgIHJldHVybiBzb3J0Qnkob3B0aW9ucywgb3B0aW9uID0+ICFzZWxlY3Rpb25BdE9wZW4uaGFzKG9wdGlvbikpLm1hcChcbiAgICAgICAgb3B0aW9uID0+IHtcbiAgICAgICAgICBpZiAob3B0aW9uLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5vcHRpb24sXG4gICAgICAgICAgICAgIGNoaWxkcmVuOiBzb3J0T3B0aW9ucyhvcHRpb24uY2hpbGRyZW4pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2UgcmV0dXJuIG9wdGlvbjtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGlvbkdyb3Vwcy5tYXAoZ3JvdXAgPT4gKHtcbiAgICAgIC4uLmdyb3VwLFxuICAgICAgb3B0aW9uczogc29ydE9wdGlvbnMoZ3JvdXAub3B0aW9ucyksXG4gICAgfSkpO1xuICB9XG5cbiAgLypcbiAgICBJZiB3ZSBhcmUgcmVzdHJpY3RpbmcgaG93IG1hbnkgb3B0aW9ucyBhcmUgc2VsZWN0ZWQgdG8gYSBzcGVjaWZpYyBsaW1pdCxcbiAgICAgIHdoZW4gd2UgYXJlIGF0IHRoYXQgbGltaXQsIGRpc2FibGUgYWxsIG9wdGlvbnMgbm90IGN1cnJlbnRseSBzZWxlY3RlZC5cbiAgKi9cbiAgZnVuY3Rpb24gYXBwbHlTZWxlY3RlZE9wdGlvbkxpbWl0PE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPE8+LFxuICAgIG9wdGlvbkdyb3VwczogRnVsbE9wdGlvbkdyb3VwPE8+W10sXG4gICAgdG9wTGV2ZWxPcHRpb25zOiBGdWxsT3B0aW9uPE8+W10sXG4gICAgb3B0aW9ucz86IE1hbmFnZXJPcHRpb25zPE8+LFxuICApOiBGdWxsT3B0aW9uR3JvdXA8Tz5bXSB7XG4gICAgaWYgKG9wdGlvbnM/LnNlbGVjdGVkT3B0aW9uTGltaXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG9wdGlvbkdyb3VwcztcbiAgICB9XG5cbiAgICAvLyBXaGVuIHVzZVRvcExldmVsT3B0aW9uc0ZvckRpc3BsYXkgaXMgdHJ1ZSBhbmQgc2VhcmNoIGlzIGFjdGl2ZSwgY291bnRcbiAgICAvLyBzZWxlY3RlZCB0b3AtbGV2ZWwgb3B0aW9ucyBmcm9tIHRoZSBvcmlnaW5hbCAodW5maWx0ZXJlZCkgZGF0YSB0byBlbnN1cmVcbiAgICAvLyBhbHJlYWR5LXNlbGVjdGVkIG9wdGlvbnMgdGhhdCBkb24ndCBtYXRjaCB0aGUgc2VhcmNoIGFyZSBzdGlsbCBjb3VudGVkLlxuICAgIGNvbnN0IHVzZU9yaWdpbmFsRm9yQ291bnRpbmcgPVxuICAgICAgb3B0aW9ucz8udXNlVG9wTGV2ZWxPcHRpb25zRm9yRGlzcGxheSAmJlxuICAgICAgc3RhdGUucXVlcnkuc2VhcmNoICYmXG4gICAgICBzdGF0ZS5vcmlnaW5hbE9wdGlvbkdyb3Vwcy5sZW5ndGggPiAwO1xuXG4gICAgY29uc3QgdG9wT3B0aW9uc0ZvckNvdW50aW5nID0gdXNlT3JpZ2luYWxGb3JDb3VudGluZ1xuICAgICAgPyBnZXRUb3BMZXZlbE9wdGlvbnMoc3RhdGUub3JpZ2luYWxPcHRpb25Hcm91cHMpLm1hcChvcHRpb24gPT5cbiAgICAgICAgICBhdWdtZW50T3B0aW9uVG9GdWxsT3B0aW9uKHN0YXRlLCBvcHRpb24sIG9wdGlvbnMpLFxuICAgICAgICApXG4gICAgICA6IHRvcExldmVsT3B0aW9ucztcblxuICAgIGNvbnN0IHNlbGVjdGVkT3JJbmRldGVybWluYXRlVG9wT3B0aW9ucyA9IHRvcE9wdGlvbnNGb3JDb3VudGluZy5maWx0ZXIoXG4gICAgICBvcHRpb24gPT4gb3B0aW9uLnNlbGVjdGVkICE9IGZhbHNlLFxuICAgICk7XG4gICAgY29uc3QgbnVtU2VsZWN0ZWRPcHRpb25zOiBudW1iZXIgPSBvcHRpb25zPy51c2VUb3BMZXZlbE9wdGlvbnNGb3JEaXNwbGF5XG4gICAgICA/IHNlbGVjdGVkT3JJbmRldGVybWluYXRlVG9wT3B0aW9ucy5sZW5ndGhcbiAgICAgIDogc3RhdGUuc2VsZWN0aW9uLnNlbGVjdGVkLnNpemU7XG5cbiAgICBjb25zdCBzZWxlY3RlZE9wdGlvbkxpbWl0OiBudW1iZXIgPSBvcHRpb25zLnNlbGVjdGVkT3B0aW9uTGltaXQ7XG5cbiAgICAvLyBJZiB3ZSBoYXZlIGxlc3MgaXRlbXMgc2VsZWN0ZWQgdGhhbiB0aGUgbGltaXQsIGJ1c2luZXNzIGFzIHVzdWFsLlxuICAgIGlmIChudW1TZWxlY3RlZE9wdGlvbnMgPCBzZWxlY3RlZE9wdGlvbkxpbWl0KSB7XG4gICAgICByZXR1cm4gb3B0aW9uR3JvdXBzO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgZXF1YWwgaXRlbXMgc2VsZWN0ZWQgdG8gdGhlIGxpbWl0IChvciBtb3JlKSwgcHJldmVudCB1c2VycyBmcm9tIHNlbGVjdGluZyBtb3JlIG9wdGlvbnMuXG4gICAgZnVuY3Rpb24gZGlzYWJsZVVuc2VsZWN0ZWRJdGVtcyhcbiAgICAgIGN1cnJlbnRPcHRpb25zOiBGdWxsT3B0aW9uPE8+W10sXG4gICAgICBvcHRpb25zQXJlQ2hpbGRyZW5PZlNlbGVjdGVkR3JvdXA6IGJvb2xlYW4sXG4gICAgKTogRnVsbE9wdGlvbjxPPltdIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRJdGVtczogRnVsbE9wdGlvbjxPPltdID0gW107XG4gICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBjdXJyZW50T3B0aW9ucykge1xuICAgICAgICBjb25zdCBpc0Rpc2FibGVkT3JVbnNlbGVjdGVkOiBib29sZWFuID1cbiAgICAgICAgICAhIW9wdGlvbi5kaXNhYmxlZCB8fCAob3B0aW9uLnNlbGVjdGFibGUgJiYgb3B0aW9uLnNlbGVjdGVkID09IGZhbHNlKTtcblxuICAgICAgICBjb25zdCBpc0N1cnJlbnRPcHRpb25TZWxlY3RlZDogYm9vbGVhbiA9XG4gICAgICAgICAgb3B0aW9uLnNlbGVjdGFibGUgJiYgb3B0aW9uLnNlbGVjdGVkICE9IGZhbHNlO1xuICAgICAgICBjb25zdCBpc0N1cnJlbnRPclBhcmVudE9wdGlvblNlbGVjdGVkOiBib29sZWFuID1cbiAgICAgICAgICBpc0N1cnJlbnRPcHRpb25TZWxlY3RlZCB8fCBvcHRpb25zQXJlQ2hpbGRyZW5PZlNlbGVjdGVkR3JvdXA7XG5cbiAgICAgICAgY29uc3QgZm9yY2VFbmFibGVkQmFzZWRPblBhcmVudDogYm9vbGVhbiA9XG4gICAgICAgICAgISFvcHRpb25zPy51c2VUb3BMZXZlbE9wdGlvbnNGb3JEaXNwbGF5ICYmXG4gICAgICAgICAgb3B0aW9uc0FyZUNoaWxkcmVuT2ZTZWxlY3RlZEdyb3VwO1xuICAgICAgICBjb25zdCBtYXJrRGlzYWJsZWQ6IGJvb2xlYW4gPVxuICAgICAgICAgIGlzRGlzYWJsZWRPclVuc2VsZWN0ZWQgJiYgIWZvcmNlRW5hYmxlZEJhc2VkT25QYXJlbnQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgY2hpbGRPcHRpb25zID0gZGlzYWJsZVVuc2VsZWN0ZWRJdGVtcyhcbiAgICAgICAgICAgIG9wdGlvbi5jaGlsZHJlbixcbiAgICAgICAgICAgIGlzQ3VycmVudE9yUGFyZW50T3B0aW9uU2VsZWN0ZWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB1cGRhdGVkSXRlbXMucHVzaCh7XG4gICAgICAgICAgICAuLi5vcHRpb24sXG4gICAgICAgICAgICBkaXNhYmxlZDogISFtYXJrRGlzYWJsZWQsXG4gICAgICAgICAgICBjaGlsZHJlbjogY2hpbGRPcHRpb25zLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVwZGF0ZWRJdGVtcy5wdXNoKHtcbiAgICAgICAgICAgIC4uLm9wdGlvbixcbiAgICAgICAgICAgIGRpc2FibGVkOiAhIW1hcmtEaXNhYmxlZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHVwZGF0ZWRJdGVtcztcbiAgICB9XG5cbiAgICBjb25zdCBncm91cHNBZnRlckxpbWl0OiBGdWxsT3B0aW9uR3JvdXA8Tz5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY3VycmVudEdyb3VwIG9mIG9wdGlvbkdyb3Vwcykge1xuICAgICAgZ3JvdXBzQWZ0ZXJMaW1pdC5wdXNoKHtcbiAgICAgICAgLi4uY3VycmVudEdyb3VwLFxuICAgICAgICBvcHRpb25zOiBkaXNhYmxlVW5zZWxlY3RlZEl0ZW1zKGN1cnJlbnRHcm91cC5vcHRpb25zLCBmYWxzZSksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ3JvdXBzQWZ0ZXJMaW1pdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFJlbGF0aW9uc2hpcE1hcHM8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIG9wdGlvbnM6IE9wdGlvbjxPPltdLFxuICApOiBbTWFwPE9bJ2lkJ10sIE9bJ2lkJ10+LCBNYXA8T1snaWQnXSwgT1snaWQnXVtdPl0ge1xuICAgIGNvbnN0IHBhcmVudHMgPSBuZXcgTWFwKCk7XG4gICAgZnVuY3Rpb24gYnVpbGRQYXJlbnRzTWFwKG9wdGlvbnM6IE9wdGlvbjxPPltdLCBwYXJlbnQ/OiBPcHRpb248Tz4pOiB2b2lkIHtcbiAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgIHBhcmVudHMuc2V0KG9wdGlvbi5pZCwgcGFyZW50LmlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9uLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgICBidWlsZFBhcmVudHNNYXAob3B0aW9uLmNoaWxkcmVuLCBvcHRpb24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGJ1aWxkUGFyZW50c01hcChvcHRpb25zKTtcblxuICAgIGNvbnN0IGNoaWxkcmVuID0gbmV3IE1hcCgpO1xuICAgIGZ1bmN0aW9uIGJ1aWxkQ2hpbGRyZW5NYXAob3B0aW9uczogT3B0aW9uPE8+W10pOiB2b2lkIHtcbiAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgY2hpbGRyZW4uc2V0KFxuICAgICAgICAgICAgb3B0aW9uLmlkLFxuICAgICAgICAgICAgb3B0aW9uLmNoaWxkcmVuLm1hcCgoeyBpZCB9KSA9PiBpZCksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBidWlsZENoaWxkcmVuTWFwKG9wdGlvbi5jaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgYnVpbGRDaGlsZHJlbk1hcChvcHRpb25zKTtcblxuICAgIHJldHVybiBbcGFyZW50cywgY2hpbGRyZW5dO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0VG9wTGV2ZWxPcHRpb25zPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBvcHRpb25Hcm91cHM6IEZ1bGxPcHRpb25Hcm91cDxPPltdLFxuICApOiBGdWxsT3B0aW9uPE8+W107XG4gIGZ1bmN0aW9uIGdldFRvcExldmVsT3B0aW9uczxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgb3B0aW9uR3JvdXBzOiBTb3VyY2VPcHRpb25Hcm91cDxPPltdLFxuICApOiBTb3VyY2VPcHRpb248Tz5bXTtcbiAgZnVuY3Rpb24gZ2V0VG9wTGV2ZWxPcHRpb25zPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBvcHRpb25Hcm91cHM6IE9wdGlvbkdyb3VwPE8+W10sXG4gICk6IE9wdGlvbjxPPltdO1xuICBmdW5jdGlvbiBnZXRUb3BMZXZlbE9wdGlvbnM8XG4gICAgTyBleHRlbmRzIEJhc2VPcHRpb24sXG4gICAgRyBleHRlbmRzIHsgb3B0aW9uczogcmVhZG9ubHkgVFtdIH0sXG4gICAgVCA9IEcgZXh0ZW5kcyBGdWxsT3B0aW9uR3JvdXA8Tz5cbiAgICAgID8gRnVsbE9wdGlvbjxPPlxuICAgICAgOiBHIGV4dGVuZHMgU291cmNlT3B0aW9uR3JvdXA8Tz5cbiAgICAgID8gU291cmNlT3B0aW9uPE8+XG4gICAgICA6IE9wdGlvbjxPPixcbiAgPihvcHRpb25Hcm91cHM6IEdbXSk6IFRbXSB7XG4gICAgcmV0dXJuIG9wdGlvbkdyb3Vwcy5yZWR1Y2U8VFtdPihcbiAgICAgIChvcHRpb25zLCBncm91cCkgPT4gWy4uLm9wdGlvbnMsIC4uLmdyb3VwLm9wdGlvbnNdLFxuICAgICAgW10sXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFBhcmVudE11bHRpU2VsZWN0aW9uU3RhdGU8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIGNoaWxkcmVuOiBGdWxsT3B0aW9uPE8+W10sXG4gICk6IE11bHRpU2VsZWN0aW9uU3RhdGUge1xuICAgIGlmIChjaGlsZHJlbi5ldmVyeShjaGlsZCA9PiBjaGlsZC5zZWxlY3RlZCA9PT0gdHJ1ZSkpIHJldHVybiB0cnVlO1xuICAgIGlmIChjaGlsZHJlbi5ldmVyeShjaGlsZCA9PiBjaGlsZC5zZWxlY3RlZCA9PT0gZmFsc2UpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICdpbmRldGVybWluYXRlJztcbiAgfVxuXG4gIGZ1bmN0aW9uIGF1Z21lbnRPcHRpb25Ub0Z1bGxPcHRpb248TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHN0YXRlOiBDb3JlU3RhdGU8Tz4sXG4gICAgb3B0aW9uOiBTb3VyY2VPcHRpb248Tz4sXG4gICAgbWFuYWdlck9wdGlvbnM/OiBNYW5hZ2VyT3B0aW9uczxPPixcbiAgKTogRnVsbE9wdGlvbjxPPiB7XG4gICAgaWYgKG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBhdWdtZW50ZWRDaGlsZHJlbiA9IG9wdGlvbi5jaGlsZHJlbi5tYXAoY2hpbGQgPT5cbiAgICAgICAgYXVnbWVudE9wdGlvblRvRnVsbE9wdGlvbihzdGF0ZSwgY2hpbGQsIG1hbmFnZXJPcHRpb25zKSxcbiAgICAgICk7XG4gICAgICBjb25zdCBzZWxlY3RhYmxlV2hlblNlYXJjaGluZyA9XG4gICAgICAgIG1hbmFnZXJPcHRpb25zPy5hbGxvd1NlbGVjdE5vbkxlYWZEdXJpbmdTZWFyY2ggPz8gZmFsc2U7XG5cbiAgICAgIC8vIFdoZW4gYWxsb3dTZWxlY3ROb25MZWFmRHVyaW5nU2VhcmNoIGlzIGVuYWJsZWQgYW5kIHNlYXJjaCBpcyBhY3RpdmUsXG4gICAgICAvLyBjYWxjdWxhdGUgc2VsZWN0aW9uIHN0YXRlIGZyb20gQUxMIG9yaWdpbmFsIGNoaWxkcmVuLCBub3QganVzdCB0aGVcbiAgICAgIC8vIGZpbHRlcmVkIG9uZXMgdmlzaWJsZSBpbiBzZWFyY2ggcmVzdWx0cy5cbiAgICAgIGNvbnN0IHVzZU9yaWdpbmFsRm9yU2VsZWN0aW9uU3RhdGUgPVxuICAgICAgICBtYW5hZ2VyT3B0aW9ucz8uYWxsb3dTZWxlY3ROb25MZWFmRHVyaW5nU2VhcmNoICYmXG4gICAgICAgIHN0YXRlLnF1ZXJ5LnNlYXJjaCAmJlxuICAgICAgICBzdGF0ZS5vcmlnaW5hbE9wdGlvbkdyb3Vwcy5sZW5ndGggPiAwO1xuXG4gICAgICBsZXQgc2VsZWN0ZWQ6IE11bHRpU2VsZWN0aW9uU3RhdGU7XG4gICAgICBpZiAodXNlT3JpZ2luYWxGb3JTZWxlY3Rpb25TdGF0ZSkge1xuICAgICAgICBjb25zdCBvcmlnaW5hbE9wdGlvbiA9IGZpbmRPcHRpb24oXG4gICAgICAgICAgZ2V0VG9wTGV2ZWxPcHRpb25zKHN0YXRlLm9yaWdpbmFsT3B0aW9uR3JvdXBzKSxcbiAgICAgICAgICBvcHRpb24uaWQsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChvcmlnaW5hbE9wdGlvbikge1xuICAgICAgICAgIGNvbnN0IGFsbExlYXZlcyA9IGZsYXR0ZW5PcHRpb25zKFtvcmlnaW5hbE9wdGlvbl0sIHRydWUpO1xuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkQ291bnQgPSBhbGxMZWF2ZXMuZmlsdGVyKGxlYWYgPT5cbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGlvbi5zZWxlY3RlZC5oYXMobGVhZiksXG4gICAgICAgICAgKS5sZW5ndGg7XG4gICAgICAgICAgaWYgKHNlbGVjdGVkQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZENvdW50ID09PSBhbGxMZWF2ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBzZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGVjdGVkID0gJ2luZGV0ZXJtaW5hdGUnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxlY3RlZCA9IGdldFBhcmVudE11bHRpU2VsZWN0aW9uU3RhdGUoYXVnbWVudGVkQ2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxlY3RlZCA9IGdldFBhcmVudE11bHRpU2VsZWN0aW9uU3RhdGUoYXVnbWVudGVkQ2hpbGRyZW4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5vcHRpb24sXG4gICAgICAgIGNoaWxkcmVuOiBhdWdtZW50ZWRDaGlsZHJlbixcbiAgICAgICAgc2VsZWN0ZWQsXG4gICAgICAgIGV4cGFuZGVkOiBzdGF0ZS5xdWVyeS5zZWFyY2hcbiAgICAgICAgICA/IHRydWVcbiAgICAgICAgICA6IHN0YXRlLmRpc3BsYXkuZXhwYW5kZWRPcHRpb25zLmhhcyhvcHRpb24uaWQpLFxuICAgICAgICBzZWxlY3RhYmxlOiAhc3RhdGUucXVlcnkuc2VhcmNoIHx8IHNlbGVjdGFibGVXaGVuU2VhcmNoaW5nLFxuICAgICAgICBleHBhbmRhYmxlOiAhc3RhdGUucXVlcnkuc2VhcmNoLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm9wdGlvbixcbiAgICAgIGNoaWxkcmVuOiB1bmRlZmluZWQsXG4gICAgICBzZWxlY3RlZDogc3RhdGUuc2VsZWN0aW9uLnNlbGVjdGVkLmhhcyhvcHRpb24pLFxuICAgICAgZXhwYW5kZWQ6IGZhbHNlLFxuICAgICAgc2VsZWN0YWJsZTogdHJ1ZSxcbiAgICAgIGV4cGFuZGFibGU6IGZhbHNlLFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRPcHRpb25zRm9yRGlzcGxheTxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgc3RhdGU6IENvcmVTdGF0ZTxPPixcbiAgICB0b3BMZXZlbE9wdGlvbnM6IEZ1bGxPcHRpb248Tz5bXSxcbiAgICBvcHRpb25zPzogTWFuYWdlck9wdGlvbnM8Tz4sXG4gICk6IHN0cmluZyB7XG4gICAgLy8gSWYgd2UgaGF2ZSBhIGN1c3RvbSBkaXNwbGF5IGZ1bmN0aW9uLCB1c2UgaXRcbiAgICBpZiAob3B0aW9ucz8uZ2V0Q3VzdG9tT3B0aW9uRGlzcGxheSkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuZ2V0Q3VzdG9tT3B0aW9uRGlzcGxheShbLi4uc3RhdGUuc2VsZWN0aW9uLnNlbGVjdGVkXSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zPy51c2VUb3BMZXZlbE9wdGlvbnNGb3JEaXNwbGF5KSB7XG4gICAgICByZXR1cm4gZ2V0VG9wTGV2ZWxGb3JtYXR0ZWRPcHRpb25zRm9yRGlzcGxheSh0b3BMZXZlbE9wdGlvbnMpO1xuICAgIH1cbiAgICAvLyBPdGhlcndpc2UsIHVzZSB0aGUgZGVmYXVsdCBkaXNwbGF5IGZvciBvcHRpb25zIC0gdGl0bGVzIHNlcGFyYXRlZCBieSBjb21tYXMuXG4gICAgcmV0dXJuIFsuLi5zdGF0ZS5zZWxlY3Rpb24uc2VsZWN0ZWRdLm1hcCgoeyB0aXRsZSB9KSA9PiB0aXRsZSkuam9pbignLCAnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFRvcExldmVsRm9ybWF0dGVkT3B0aW9uc0ZvckRpc3BsYXk8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHRvcExldmVsT3B0aW9uczogRnVsbE9wdGlvbjxPPltdLFxuICApOiBzdHJpbmcge1xuICAgIGlmICghdG9wTGV2ZWxPcHRpb25zIHx8IHRvcExldmVsT3B0aW9ucy5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3RlZE9ySW5kZXRlcm1pbmF0ZVRvcE9wdGlvbnMgPSB0b3BMZXZlbE9wdGlvbnMuZmlsdGVyKFxuICAgICAgb3B0aW9uID0+IG9wdGlvbi5zZWxlY3RlZCAhPSBmYWxzZSxcbiAgICApO1xuICAgIHJldHVybiBzZWxlY3RlZE9ySW5kZXRlcm1pbmF0ZVRvcE9wdGlvbnNcbiAgICAgIC5tYXAoKHsgdGl0bGUgfSkgPT4gdGl0bGUpXG4gICAgICAuam9pbignLCAnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFBpbGxDb3VudEZvckRpc3BsYXk8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHN0YXRlOiBDb3JlU3RhdGU8Tz4sXG4gICAgdG9wTGV2ZWxPcHRpb25zOiBGdWxsT3B0aW9uPE8+W10sXG4gICAgb3B0aW9ucz86IE1hbmFnZXJPcHRpb25zPE8+LFxuICApOiBudW1iZXIge1xuICAgIGlmIChvcHRpb25zPy51c2VUb3BMZXZlbE9wdGlvbnNGb3JEaXNwbGF5KSB7XG4gICAgICBjb25zdCBzZWxlY3RlZE9ySW5kZXRlcm1pbmF0ZVRvcE9wdGlvbnMgPSB0b3BMZXZlbE9wdGlvbnMuZmlsdGVyKFxuICAgICAgICBvcHRpb24gPT4gb3B0aW9uLnNlbGVjdGVkICE9IGZhbHNlLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBzZWxlY3RlZE9ySW5kZXRlcm1pbmF0ZVRvcE9wdGlvbnMubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGUuc2VsZWN0aW9uLnNlbGVjdGVkLnNpemU7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRaZXJvU3RhdGVNZXNzYWdlPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPE8+LFxuICApOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoc3RhdGUuc291cmNlT3B0aW9uR3JvdXBzLmV2ZXJ5KGdyb3VwID0+IGdyb3VwLm9wdGlvbnMubGVuZ3RoID09PSAwKSkge1xuICAgICAgaWYgKHN0YXRlLnF1ZXJ5LnNlYXJjaCkgcmV0dXJuICdObyByZXN1bHRzIGZvdW5kLic7XG4gICAgICByZXR1cm4gJ05vIG9wdGlvbnMuJztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBmaW5kT3B0aW9uPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBvcHRpb25zOiBTb3VyY2VPcHRpb248Tz5bXSxcbiAgICBpZDogT1snaWQnXSxcbiAgKTogU291cmNlT3B0aW9uPE8+IHwgbnVsbCB7XG4gICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xuICAgICAgaWYgKG9wdGlvbi5pZCA9PT0gaWQpIHJldHVybiBvcHRpb247XG4gICAgICBpZiAob3B0aW9uLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBmaW5kT3B0aW9uKG9wdGlvbi5jaGlsZHJlbiwgaWQpO1xuICAgICAgICBpZiAoY2hpbGQpIHJldHVybiBjaGlsZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBmbGF0dGVuT3B0aW9uczxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgb3B0aW9uczogT3B0aW9uPE8+W10sXG4gICAgbGVhZk9ubHk6IGJvb2xlYW4sXG4gICk6IE9bXSB7XG4gICAgcmV0dXJuIGZsYXR0ZW5EZWVwKFxuICAgICAgb3B0aW9ucy5tYXAob3B0aW9uID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgZGVzY2VuZGFudHMgPSBvcHRpb24uY2hpbGRyZW4ubWFwKGNoaWxkID0+XG4gICAgICAgICAgICBmbGF0dGVuT3B0aW9ucyhbY2hpbGRdLCBsZWFmT25seSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gbGVhZk9ubHkgPyBkZXNjZW5kYW50cyA6IFtvcHRpb24sIC4uLmRlc2NlbmRhbnRzXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gW29wdGlvbl07XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiB0b2dnbGVTZWxlY3RlZDxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgc3RhdGU6IENvcmVTdGF0ZTxPPixcbiAgICBpZDogT1snaWQnXSxcbiAgICBtYW5hZ2VyT3B0aW9ucz86IE1hbmFnZXJPcHRpb25zPE8+LFxuICApOiBDb3JlU3RhdGU8Tz4ge1xuICAgIGNvbnN0IHRvcExldmVsT3B0aW9ucyA9IGdldFRvcExldmVsT3B0aW9ucyhzdGF0ZS5zb3VyY2VPcHRpb25Hcm91cHMpO1xuICAgIGNvbnN0IG9wdGlvbiA9IGZpbmRPcHRpb24odG9wTGV2ZWxPcHRpb25zLCBpZCk7XG4gICAgaWYgKCFvcHRpb24pIHJldHVybiBzdGF0ZTtcblxuICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IG5ldyBPcHRpb25TZXQoc3RhdGUuc2VsZWN0aW9uLnNlbGVjdGVkKTtcblxuICAgIGNvbnN0IG5ld1ZhbHVlID0gIShcbiAgICAgIGF1Z21lbnRPcHRpb25Ub0Z1bGxPcHRpb24oc3RhdGUsIG9wdGlvbiwgbWFuYWdlck9wdGlvbnMpLnNlbGVjdGVkID09PSB0cnVlXG4gICAgKTtcblxuICAgIC8vIFdoZW4gYWxsb3dTZWxlY3ROb25MZWFmRHVyaW5nU2VhcmNoIGlzIGVuYWJsZWQgYW5kIHNlYXJjaCBpcyBhY3RpdmUsXG4gICAgLy8gdXNlIHRoZSBvcmlnaW5hbCAodW5maWx0ZXJlZCkgZGF0YSB0byBnZXQgYWxsIGNoaWxkcmVuLCBub3QganVzdFxuICAgIC8vIHRob3NlIHZpc2libGUgaW4gdGhlIGZpbHRlcmVkIHNlYXJjaCByZXN1bHRzLlxuICAgIGNvbnN0IHVzZU9yaWdpbmFsRGF0YSA9XG4gICAgICBtYW5hZ2VyT3B0aW9ucz8uYWxsb3dTZWxlY3ROb25MZWFmRHVyaW5nU2VhcmNoICYmXG4gICAgICBzdGF0ZS5xdWVyeS5zZWFyY2ggJiZcbiAgICAgIHN0YXRlLm9yaWdpbmFsT3B0aW9uR3JvdXBzLmxlbmd0aCA+IDA7XG5cbiAgICBjb25zdCBvcHRpb25Gb3JMZWF2ZXMgPSB1c2VPcmlnaW5hbERhdGFcbiAgICAgID8gZmluZE9wdGlvbihnZXRUb3BMZXZlbE9wdGlvbnMoc3RhdGUub3JpZ2luYWxPcHRpb25Hcm91cHMpLCBpZCkgPz8gb3B0aW9uXG4gICAgICA6IG9wdGlvbjtcblxuICAgIGNvbnN0IGxlYXZlcyA9IGZsYXR0ZW5PcHRpb25zKFtvcHRpb25Gb3JMZWF2ZXNdLCB0cnVlKTtcbiAgICBmb3IgKGNvbnN0IGxlYWYgb2YgbGVhdmVzKSB7XG4gICAgICBpZiAobmV3VmFsdWUpIHtcbiAgICAgICAgbmV3U2VsZWN0aW9uLmFkZChsZWFmKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1NlbGVjdGlvbi5kZWxldGUobGVhZik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgc2VsZWN0aW9uOiB7XG4gICAgICAgIHNlbGVjdGVkOiBuZXdTZWxlY3Rpb24sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBzZXRTZWxlY3RlZE9wdGlvbjxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgc3RhdGU6IENvcmVTdGF0ZTxPPixcbiAgICBpZDogT1snaWQnXSxcbiAgKTogQ29yZVN0YXRlPE8+IHtcbiAgICBjb25zdCB0b3BMZXZlbE9wdGlvbnMgPSBnZXRUb3BMZXZlbE9wdGlvbnMoc3RhdGUuc291cmNlT3B0aW9uR3JvdXBzKTtcbiAgICBjb25zdCBvcHRpb24gPSBmaW5kT3B0aW9uKHRvcExldmVsT3B0aW9ucywgaWQpO1xuICAgIGlmICghb3B0aW9uKSByZXR1cm4gc3RhdGU7XG5cbiAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSBuZXcgT3B0aW9uU2V0PE8+KCk7XG4gICAgbmV3U2VsZWN0aW9uLmFkZChvcHRpb24pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgc2VsZWN0aW9uOiB7XG4gICAgICAgIHNlbGVjdGVkOiBuZXdTZWxlY3Rpb24sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiB0b2dnbGVWaXNpYmxlU2VsZWN0ZWQ8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHN0YXRlOiBDb3JlU3RhdGU8Tz4sXG4gICk6IENvcmVTdGF0ZTxPPiB7XG4gICAgY29uc3QgbGVhdmVzID0gZmxhdHRlbk9wdGlvbnMoXG4gICAgICBnZXRUb3BMZXZlbE9wdGlvbnMoc3RhdGUuc291cmNlT3B0aW9uR3JvdXBzKSxcbiAgICAgIHRydWUsXG4gICAgKTtcbiAgICBjb25zdCBpc0FsbFNlbGVjdGVkID0gbGVhdmVzLmV2ZXJ5KGxlYWYgPT5cbiAgICAgIHN0YXRlLnNlbGVjdGlvbi5zZWxlY3RlZC5oYXMobGVhZiksXG4gICAgKTtcbiAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSBuZXcgT3B0aW9uU2V0KHN0YXRlLnNlbGVjdGlvbi5zZWxlY3RlZCk7XG5cbiAgICBmb3IgKGNvbnN0IGxlYWYgb2YgbGVhdmVzKSB7XG4gICAgICBpZiAoaXNBbGxTZWxlY3RlZCkgbmV3U2VsZWN0aW9uLmRlbGV0ZShsZWFmKTtcbiAgICAgIGVsc2UgbmV3U2VsZWN0aW9uLmFkZChsZWFmKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgLi4uc3RhdGUuc2VsZWN0aW9uLFxuICAgICAgICBzZWxlY3RlZDogbmV3U2VsZWN0aW9uLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gdG9nZ2xlT3B0aW9uRXhwYW5kZWQ8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHN0YXRlOiBDb3JlU3RhdGU8Tz4sXG4gICAgaWQ6IE9bJ2lkJ10sXG4gICk6IENvcmVTdGF0ZTxPPiB7XG4gICAgY29uc3QgbmV3VmFsdWUgPSAhc3RhdGUuZGlzcGxheS5leHBhbmRlZE9wdGlvbnMuaGFzKGlkKTtcbiAgICBjb25zdCBuZXdFeHBhbmRlZE9wdGlvbnMgPSBuZXcgU2V0KHN0YXRlLmRpc3BsYXkuZXhwYW5kZWRPcHRpb25zKTtcbiAgICBpZiAobmV3VmFsdWUpIG5ld0V4cGFuZGVkT3B0aW9ucy5hZGQoaWQpO1xuICAgIGVsc2UgbmV3RXhwYW5kZWRPcHRpb25zLmRlbGV0ZShpZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgZGlzcGxheToge1xuICAgICAgICAuLi5zdGF0ZS5kaXNwbGF5LFxuICAgICAgICBleHBhbmRlZE9wdGlvbnM6IG5ld0V4cGFuZGVkT3B0aW9ucyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNpZGVFZmZlY3RzPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPE8+LFxuICAgIGFjdGlvbjogQWN0aW9uPE8+IHwgSW50ZXJuYWxBY3Rpb248Tz4sXG4gICAgc291cmNlOiBTb3VyY2U8Tz4sXG4gICAgaW50ZXJuYWxBY3Rpb25zOiBTdWJqZWN0PEludGVybmFsQWN0aW9uPE8+PixcbiAgKTogQ29yZVN0YXRlPE8+IHtcbiAgICBpZiAoXG4gICAgICBhY3Rpb24udHlwZSA9PT0gJ2xvYWQnIHx8XG4gICAgICBhY3Rpb24udHlwZSA9PT0gJ3NlYXJjaENoYW5nZScgfHxcbiAgICAgIGFjdGlvbi50eXBlID09PSAnb3JkZXJDaGFuZ2UnIHx8XG4gICAgICAoYWN0aW9uLnR5cGUgPT09ICdvcGVuQ2hhbmdlJyAmJiBhY3Rpb24ub3BlbilcbiAgICApIHtcbiAgICAgIHNvdXJjZShzdGF0ZS5xdWVyeSwgYWN0aW9uKVxuICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyByZXN1bHQgOiByZXN1bHQuZGF0YTtcbiAgICAgICAgICBjb25zdCBvcmlnaW5hbERhdGEgPSBBcnJheS5pc0FycmF5KHJlc3VsdClcbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IHJlc3VsdC5vcmlnaW5hbERhdGE7XG4gICAgICAgICAgaW50ZXJuYWxBY3Rpb25zLm5leHQoeyB0eXBlOiAnbG9hZENvbXBsZXRlJywgZGF0YSwgb3JpZ2luYWxEYXRhIH0pO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgaW50ZXJuYWxBY3Rpb25zLm5leHQoeyB0eXBlOiAnbG9hZEVycm9yJywgZXJyb3IgfSk7XG4gICAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGxvYWQ6IHtcbiAgICAgICAgICBsb2FkaW5nOiB0cnVlLFxuICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVkdWNlPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPE8+LFxuICAgIGFjdGlvbjogQWN0aW9uPE8+IHwgSW50ZXJuYWxBY3Rpb248Tz4sXG4gICAgbWFuYWdlck9wdGlvbnM/OiBNYW5hZ2VyT3B0aW9uczxPPixcbiAgKTogQ29yZVN0YXRlPE8+IHtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICBjYXNlICdsb2FkJzpcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgY2FzZSAnbG9hZENvbXBsZXRlJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBsb2FkOiB7XG4gICAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc291cmNlT3B0aW9uR3JvdXBzOiBhY3Rpb24uZGF0YSxcbiAgICAgICAgICBvcmlnaW5hbE9wdGlvbkdyb3VwczogYWN0aW9uLm9yaWdpbmFsRGF0YSA/PyBbXSxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ2xvYWRFcnJvcic6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgbG9hZDoge1xuICAgICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogYWN0aW9uLmVycm9yLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICBjYXNlICdvcGVuQ2hhbmdlJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgICBzZWFyY2g6ICcnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGlzcGxheToge1xuICAgICAgICAgICAgLi4uc3RhdGUuZGlzcGxheSxcbiAgICAgICAgICAgIG9wZW46IGFjdGlvbi5vcGVuLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICBjYXNlICdzZWFyY2hDaGFuZ2UnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeSxcbiAgICAgICAgICAgIHNlYXJjaDogYWN0aW9uLnBheWxvYWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ29yZGVyQ2hhbmdlJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgICBvcmRlcjogYWN0aW9uLnBheWxvYWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ3NlbGVjdGlvbkNoYW5nZSc6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgc2VsZWN0aW9uOiBhY3Rpb24ucGF5bG9hZCxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ3RvZ2dsZU9wdGlvblNlbGVjdGVkJzpcbiAgICAgICAgcmV0dXJuIHRvZ2dsZVNlbGVjdGVkKHN0YXRlLCBhY3Rpb24uaWQsIG1hbmFnZXJPcHRpb25zKTtcbiAgICAgIGNhc2UgJ3NldFNlbGVjdGVkT3B0aW9uJzpcbiAgICAgICAgcmV0dXJuIHNldFNlbGVjdGVkT3B0aW9uKHN0YXRlLCBhY3Rpb24uaWQpO1xuICAgICAgY2FzZSAndmlzaWJsZVNlbGVjdGVkQ2hhbmdlJzpcbiAgICAgICAgcmV0dXJuIHRvZ2dsZVZpc2libGVTZWxlY3RlZChzdGF0ZSk7XG4gICAgICBjYXNlICd0b2dnbGVPcHRpb25FeHBhbmRlZCc6XG4gICAgICAgIHJldHVybiB0b2dnbGVPcHRpb25FeHBhbmRlZChzdGF0ZSwgYWN0aW9uLmlkKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
873
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi9pbnB1dC9zZWxlY3Qvc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUtOLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDckUsT0FBTyxFQUNMLFdBQVcsRUFFWCxHQUFHLEVBQ0gsS0FBSyxFQUVMLGFBQWEsRUFDYixJQUFJLEVBQ0osU0FBUyxFQUNULE9BQU8sR0FDUixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUc1RCxNQUFNLEtBQVcsU0FBUyxDQWs3Q3pCO0FBbDdDRCxXQUFpQixTQUFTO0lBQ3hCLGFBQWE7SUFDYixhQUFhO0lBQ2IsYUFBYTtJQW9HYjs7O09BR0c7SUFDSCxNQUFhLFNBQWdDLFNBQVEsR0FBb0I7UUFPdkUsWUFBWSxNQUF5QztZQUNuRCxLQUFLLEVBQUUsQ0FBQztZQVBWLHVFQUF1RTtZQUN2RSx1RUFBdUU7WUFDdkUsdUVBQXVFO1lBQ3ZFLDhEQUE4RDtZQUM3QyxTQUFJLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7WUFJMUQsSUFBSSxNQUFNLEVBQUU7Z0JBQ1YsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7b0JBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ2pCO2FBQ0Y7UUFDSCxDQUFDO1FBRVEsR0FBRyxDQUFDLE1BQXVDO1lBQ2xELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFFUSxHQUFHLENBQUMsTUFBdUI7WUFDbEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxD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Q0FBQyxFQWw3Q2dCLFNBQVMsS0FBVCxTQUFTLFFBazdDekIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRnVzZSwge1xuICBGdXNlUmVzdWx0LFxuICBGdXNlUmVzdWx0TWF0Y2gsXG4gIElGdXNlT3B0aW9ucyxcbiAgUmFuZ2VUdXBsZSxcbn0gZnJvbSAnZnVzZS5qcyc7XG5pbXBvcnQgeyBkZWZhdWx0c0RlZXAsIGZsYXR0ZW5EZWVwLCBpc051bWJlciwgc29ydEJ5IH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7XG4gIGNvbm5lY3RhYmxlLFxuICBDb25uZWN0YWJsZSxcbiAgbWFwLFxuICBtZXJnZSxcbiAgT2JzZXJ2YWJsZSxcbiAgUmVwbGF5U3ViamVjdCxcbiAgc2NhbixcbiAgc3RhcnRXaXRoLFxuICBTdWJqZWN0LFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERlZXBQYXJ0aWFsIH0gZnJvbSAndXRpbGl0eS10eXBlcyc7XG5pbXBvcnQgeyBOdW1iZXJQaXBlIH0gZnJvbSAnLi4vLi4vZm9ybWF0L3BpcGVzL251bWJlci5waXBlJztcbmltcG9ydCB7IEhpZ2hsaWdodENvbXBvbmVudCB9IGZyb20gJy4uLy4uL3Zpc3VhbGl6YXRpb24vaGlnaGxpZ2h0L2hpZ2hsaWdodC5jb21wb25lbnQnO1xuXG5leHBvcnQgbmFtZXNwYWNlIFJpdlNlbGVjdCB7XG4gIC8vLy8vLy8vLy8vLy9cbiAgLy8gT3B0aW9ucyAvL1xuICAvLy8vLy8vLy8vLy8vXG5cbiAgLyoqXG4gICAqIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgC0tLS0tLS0tLS0tLS0tLS0tLS3ilIDilIDilIDilJBcbiAgICog4pSCIEJhc2VPcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxuICAgKiDilIIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCXG4gICAqIOKUgiBUaGUgY29yZSBkYXRhIHJlcXVpcmVkIGZvciBlYWNoIG9wdGlvbiAgICDilIJcbiAgICog4pSCIChzdWNoIGFzIGlkIGFuZCB0aXRsZSkuICAgICAgICAgICAgICAgICAgIOKUglxuICAgKiDilJzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAtLS0tLS0tLS0tLS0tLS0tLS0t4pSA4pSA4pSkXG4gICAqIOKUgiBPcHRpb24gKEJhc2VPcHRpb24gKyBjaGlsZHJlbikgICAgICAgICAgICDilIJcbiAgICog4pSCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxuICAgKiDilIIgUHJvdmlkZXMgcmVjdXJzaXZlIHR5cGUgc2FmZXR5IHRvIHRoZSAgICAg4pSCXG4gICAqIOKUgiB0eXBlIHNhZmV0eSB0byB0aGUgQmFzZU9wdGlvbi4gICAgICAgICAgICDilIJcbiAgICog4pSU4pSALS0tLS0tLS0tLS0tLS0tLS0t4pSsLS0tLS0tLeKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICAgKiAgICAgICAgICAgICAgICAgICAgIHxcbiAgICog4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pa84pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gICAqIOKUgiBTb3VyY2VPcHRpb24gKE9wdGlvbiArIHNlYXJjaCBoaWdobGlnaHRzKSDilIJcbiAgICog4pSCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxuICAgKiDilIIgQWRkcyBzZWFyY2ggaGlnaGxpZ2h0cyB0byB0aGUgT3B0aW9uIGFuZCAg4pSCXG4gICAqIOKUgiBpcyB0aGUgcmV0dXJuIHR5cGUgZm9yIHRoZSBvcHRpb24gU291cmNlICDilIJcbiAgICog4pSCIChkYXRhIGZldGNoZXIpIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgIOKUglxuICAgKiDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilKzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcbiAgICogICAgICAgICAgICAgICAgICAgICB8XG4gICAqIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKWvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICAgKiDilIIgRnVsbE9wdGlvbiAoU291cmNlT3B0aW9uICsgVUkgc3RhdGUpICAgICAg4pSCXG4gICAqIOKUgiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIJcbiAgICog4pSCIEF1Z21lbnRzIHRoZSBTb3VyY2VPcHRpb24gd2l0aCBhbGwgb2YgdGhlIOKUglxuICAgKiDilIIgVUkgaW5mb3JtYXRpb24gZnJvbSBvdGhlciBwYXJ0cyBvZiB0aGUgICAg4pSCXG4gICAqIOKUgiBzdGF0ZSwgc3VjaCBhcyBzZWxlY3Rpb24gc3RhdHVzLCB3aGV0aGVyICDilIJcbiAgICog4pSCIG9yIG5vdCB0aGUgbm9kZSBpcyBleHBhbmRlZCwgZXRjLiAgICAgICAgIOKUglxuICAgKiDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcbiAgICpcbiAgICogTm90ZSB0aGF0IHRoZSB1c2FnZXMgb2YgT21pdDwuLi4+IGluIHRoaXMgc2VjdGlvbiBhcmUgbm90IHJlcXVpcmVkLCBidXRcbiAgICogZG8gaGVscCBpbi1lZGl0b3IgdHlwZSBoaW50cyB0byBiZSBtb3JlIGNsZWFyIGFuZCBkaXJlY3QuXG4gICAqL1xuXG4gIGV4cG9ydCB0eXBlIEJhc2VPcHRpb24gPSB7XG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcjtcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIHN1YnRpdGxlPzogc3RyaW5nO1xuICAgIGhlbHA/OiBzdHJpbmc7XG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICB9O1xuICBleHBvcnQgdHlwZSBPcHRpb248TyBleHRlbmRzIEJhc2VPcHRpb24gPSBCYXNlT3B0aW9uPiA9IE8gJiB7XG4gICAgY2hpbGRyZW4/OiBPcHRpb248Tz5bXTtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBTb3VyY2VPcHRpb248TyBleHRlbmRzIEJhc2VPcHRpb24+ID0gT21pdDxcbiAgICBPcHRpb248Tz4sXG4gICAgJ2NoaWxkcmVuJ1xuICA+ICYge1xuICAgIHRpdGxlSGlnaGxpZ2h0SW5kaWNlcz86IEhpZ2hsaWdodENvbXBvbmVudC5IaWdobGlnaHRJbmRpY2VzW107XG4gICAgc3VidGl0bGVIaWdobGlnaHRJbmRpY2VzPzogSGlnaGxpZ2h0Q29tcG9uZW50LkhpZ2hsaWdodEluZGljZXNbXTtcbiAgICBjaGlsZHJlbj86IFNvdXJjZU9wdGlvbjxPPltdO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIE11bHRpU2VsZWN0aW9uU3RhdGUgPSBib29sZWFuIHwgJ2luZGV0ZXJtaW5hdGUnO1xuXG4gIGV4cG9ydCB0eXBlIEZ1bGxPcHRpb248TyBleHRlbmRzIEJhc2VPcHRpb24+ID0gT21pdDxcbiAgICBTb3VyY2VPcHRpb248Tz4sXG4gICAgJ2NoaWxkcmVuJ1xuICA+ICYge1xuICAgIHNlbGVjdGVkOiBNdWx0aVNlbGVjdGlvblN0YXRlO1xuICAgIGV4cGFuZGVkOiBib29sZWFuO1xuICAgIHNlbGVjdGFibGU6IGJvb2xlYW47XG4gICAgZXhwYW5kYWJsZTogYm9vbGVhbjtcbiAgICBjaGlsZHJlbj86IEZ1bGxPcHRpb248Tz5bXTtcbiAgfTtcblxuICAvLy8vLy8vLy8vLy8vLy8vLy8vXG4gIC8vIE9wdGlvbiBncm91cHMgLy9cbiAgLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gIC8qKlxuICAgKiBUaGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIE9wdGlvbkdyb3VwLCBTb3VyY2VPcHRpb25Hcm91cCwgYW5kXG4gICAqIEZ1bGxPcHRpb25Hcm91cCBpcyBhbmFsb2dvdXMgdG8gdGhlIG9wdGlvbiB0eXBlcyBhYm92ZS5cbiAgICpcbiAgICogQXMgd2l0aCBiZWZvcmUsIHRoZSB1c2Ugb2YgT21pdDwuLi4+IGlzIG5vdCByZXF1aXJlZCBidXQgaGVscGZ1bC5cbiAgICovXG5cbiAgZXhwb3J0IHR5cGUgT3B0aW9uR3JvdXA8TyBleHRlbmRzIEJhc2VPcHRpb24+ID0ge1xuICAgIGhlYWRlcj86IHN0cmluZztcbiAgICBvcHRpb25zOiBPcHRpb248Tz5bXTtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBTb3VyY2VPcHRpb25Hcm91cDxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSBPbWl0PFxuICAgIE9wdGlvbkdyb3VwPE8+LFxuICAgICdvcHRpb25zJ1xuICA+ICYge1xuICAgIG9wdGlvbnM6IFNvdXJjZU9wdGlvbjxPPltdO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIEZ1bGxPcHRpb25Hcm91cDxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSBPbWl0PFxuICAgIFNvdXJjZU9wdGlvbkdyb3VwPE8+LFxuICAgICdvcHRpb25zJ1xuICA+ICYge1xuICAgIG9wdGlvbnM6IEZ1bGxPcHRpb248Tz5bXTtcbiAgfTtcblxuICAvKipcbiAgICogVGhlIE9wdGlvblNldCBjbGFzcyBwcm92aWRlcyBTZXQtbGlrZSBmdW5jdGlvbmFsaXR5LCBidXQgdW5pcXVlbmVzcyBpc1xuICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBvcHRpb24ncyBJRCByYXRoZXIgdGhhbiB0aGUgb2JqZWN0IHJlZmVyZW5jZS5cbiAgICovXG4gIGV4cG9ydCBjbGFzcyBPcHRpb25TZXQ8TyBleHRlbmRzIEJhc2VPcHRpb24+IGV4dGVuZHMgU2V0PFNvdXJjZU9wdGlvbjxPPj4ge1xuICAgIC8vIFBhcmFsbGVsIGlkIOKGkiBvcHRpb24gbWFwIHNvIGhhcygpL2FkZCgpL2RlbGV0ZSgpIGFyZSBPKDEpIGluc3RlYWQgb2ZcbiAgICAvLyBzcHJlYWRpbmcgdGhlIFNldCBhbmQgbGluZWFyLXNjYW5uaW5nIGl0LiBSZWJ1aWxkaW5nIGFuIE8oTsKyKSBsb29rdXBcbiAgICAvLyBmb3IgYSAxNmstb3B0aW9uIHNlbGVjdGlvbiB3YXMgdGhlIHByaW1hcnkgY2F1c2Ugb2YgdGhlIG11bHRpLW1pbnV0ZVxuICAgIC8vIGZyZWV6ZSB0aGF0IHN1cmZhY2VkIFJWVC0yNTM4MydzIHRyZWUtc2VsZWN0IHNjYWxlIHByb2JsZW0uXG4gICAgcHJpdmF0ZSByZWFkb25seSBieUlkID0gbmV3IE1hcDxPWydpZCddLCBTb3VyY2VPcHRpb248Tz4+KCk7XG5cbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZXM/OiBJdGVyYWJsZTxTb3VyY2VPcHRpb248Tz4+IHwgbnVsbCkge1xuICAgICAgc3VwZXIoKTtcbiAgICAgIGlmICh2YWx1ZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICAgICB0aGlzLmFkZCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBvdmVycmlkZSBoYXMob3B0aW9uOiBTb3VyY2VPcHRpb248Tz4gfCBGdWxsT3B0aW9uPE8+KSB7XG4gICAgICByZXR1cm4gdGhpcy5ieUlkLmhhcyhvcHRpb24uaWQpO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGFkZChvcHRpb246IFNvdXJjZU9wdGlvbjxPPikge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmJ5SWQuZ2V0KG9wdGlvbi5pZCk7XG4gICAgICBpZiAoZXhpc3RpbmcgPT09IG9wdGlvbikge1xuICAgICAgICAvLyBTYW1lIG9iamVjdCByZWZlcmVuY2Ug4oCUIG5vdGhpbmcgdG8gdXBkYXRlLiBBbmNlc3RvciByZS1hZGRzXG4gICAgICAgIC8vIGR1cmluZyBhIHNlbGVjdGlvbiBzbmFwc2hvdCBoaXQgdGhpcyBwYXRoIHJlcGVhdGVkbHksIHNvIGtlZXBpbmdcbiAgICAgICAgLy8gaXQgTygxKSBpcyB3aGF0IHByZXZlbnRzIHRoZSB0cmVlLXNlbGVjdCBOwrIgYmxvdy11cCBzZWVuIGluXG4gICAgICAgIC8vIFJWVC0yNTQ3MC5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICBpZiAoZXhpc3RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBEaWZmZXJlbnQgcmVmZXJlbmNlLCBzYW1lIGlkIOKAlCBzd2FwIHRoZSBzdG9yZWQgcmVmIHdoaWxlXG4gICAgICAgIC8vIHByZXNlcnZpbmcgU2V0IGluc2VydGlvbiBvcmRlci4gVGhlIHJlYnVpbGQgaXMgTyhOKSwgYnV0IHRoaXNcbiAgICAgICAgLy8gcGF0aCBpcyByYXJlIGluIHByYWN0aWNlICh0aGUgaG90IGFuY2VzdG9yLXNuYXBzaG90IGxvb3AgdGFrZXNcbiAgICAgICAgLy8gdGhlIGlkZW50aXR5IGZhc3QtcGF0aCBhYm92ZSkuXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gWy4uLnRoaXNdLm1hcChvID0+IChvLmlkID09PSBvcHRpb24uaWQgPyBvcHRpb24gOiBvKSk7XG4gICAgICAgIHRoaXMuYnlJZC5zZXQob3B0aW9uLmlkLCBvcHRpb24pO1xuICAgICAgICBzdXBlci5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHN1cGVyLmFkZChpdGVtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYnlJZC5zZXQob3B0aW9uLmlkLCBvcHRpb24pO1xuICAgICAgICBzdXBlci5hZGQob3B0aW9uKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGRlbGV0ZShvcHRpb246IFNvdXJjZU9wdGlvbjxPPikge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmJ5SWQuZ2V0KG9wdGlvbi5pZCk7XG4gICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgdGhpcy5ieUlkLmRlbGV0ZShvcHRpb24uaWQpO1xuICAgICAgICBzdXBlci5kZWxldGUoZXhpc3RpbmcpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBvdmVycmlkZSBjbGVhcigpIHtcbiAgICAgIHRoaXMuYnlJZC5jbGVhcigpO1xuICAgICAgc3VwZXIuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICAvLy8vLy8vLy8vL1xuICAvLyBTdGF0ZSAvL1xuICAvLy8vLy8vLy8vL1xuXG4gIC8qKlxuICAgKiBUaGUgQ29yZVN0YXRlIHByb3ZpZGVzIGFsbCBvZiB0aGUgZm91bmRhdGlvbmFsIHBpZWNlcyBvZiBzdGF0ZSByZXF1aXJlZFxuICAgKiBmb3IgYSB3b3JraW5nIGNvbXBvbmVudC4gRnVsbFN0YXRlIGlzIGEgcHVyZSBkZXJpdmF0aW9uIG9mIENvcmVTdGF0ZSBwbHVzXG4gICAqIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMsIGFuZCBwcm92aWRlcyBjb252ZW5pZW5jZXMgZm9yIHJlbmRlcmluZyB0aGVcbiAgICogY29tcG9uZW50cy4gQWN0aW9ucyBhbmQgdGhlIGNvcmUgc3RhdGUgYXJlIHBhc3NlZCB0byB0aGUgcmVkdWNlciB0b1xuICAgKiBwcm9kdWNlIG5ldyBDb3JlU3RhdGVzICh3aGljaCBhcmUgdGhlbiB1c2VkIHRvIGNhbGN1bGF0ZSBuZXcgRnVsbFN0YXRlcykuXG4gICAqXG4gICAqIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICAgKiDilIIgIFVJICDil4TilIDilIDilIDilIDilIDilIDilIDilIDilJBcbiAgICog4pSU4pSA4pSA4pSs4pSA4pSA4pSA4pSYICAgICAgICDilIJcbiAgICogICAg4pSCICAgICAgICAgICAg4pSCXG4gICAqIOKUjOKUgOKUgOKWvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgIOKUglxuICAgKiDilIIgIEFjdGlvbnMgIOKUgiAgIOKUglxuICAgKiDilJTilIDilIDilKzilIDilIDilIDilIDilIDilIDilIDilIDilJggICDilIJcbiAgICogICAg4pSCICAgICAgICAgICAg4pSCXG4gICAqIOKUjOKUgOKUgOKWvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUkFxuICAgKiDilIIgIFN0YXRlIHJlZHVjZXIgIOKUglxuICAgKiDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcbiAgICovXG5cbiAgZXhwb3J0IHR5cGUgT3JkZXJCeSA9ICd0aXRsZScgfCAnY291bnQnIHwgJ3NvdXJjZSc7XG5cbiAgY29uc3QgTUlOX09QVElPTlNfRk9SX0NPTlRST0xTID0gNTtcblxuICBleHBvcnQgdHlwZSBDb3JlU3RhdGU8TyBleHRlbmRzIEJhc2VPcHRpb24+ID0ge1xuICAgIHF1ZXJ5OiB7XG4gICAgICBzZWFyY2g6IHN0cmluZztcbiAgICAgIG9yZGVyOiBPcmRlckJ5O1xuICAgIH07XG4gICAgbG9hZDoge1xuICAgICAgbG9hZGluZzogYm9vbGVhbjtcbiAgICAgIGVycm9yOiB1bmtub3duIHwgbnVsbDtcbiAgICB9O1xuICAgIHNvdXJjZU9wdGlvbkdyb3VwczogU291cmNlT3B0aW9uR3JvdXA8Tz5bXTtcbiAgICAvKipcbiAgICAgKiBTdG9yZXMgdGhlIHVuZmlsdGVyZWQgb3JpZ2luYWwgb3B0aW9uIGdyb3VwcyB3aGVuIHNlYXJjaCBmaWx0ZXJpbmcgaXMgYWN0aXZlLlxuICAgICAqIFVzZWQgYnkgYGFsbG93U2VsZWN0Tm9uTGVhZkR1cmluZ1NlYXJjaGAgdG8gc2VsZWN0IGFsbCBjaGlsZHJlbiBvZiBhIHBhcmVudCxcbiAgICAgKiBpbmNsdWRpbmcgdGhvc2Ugbm90IHZpc2libGUgaW4gdGhlIGZpbHRlcmVkIHNlYXJjaCByZXN1bHRzLlxuICAgICAqL1xuICAgIG9yaWdpbmFsT3B0aW9uR3JvdXBzOiBTb3VyY2VPcHRpb25Hcm91cDxPPltdO1xuICAgIHNlbGVjdGlvbjoge1xuICAgICAgc2VsZWN0ZWQ6IE9wdGlvblNldDxPPjtcbiAgICB9O1xuICAgIGRpc3BsYXk6IHtcbiAgICAgIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gICAgICBvcGVuOiBib29sZWFuO1xuICAgICAgZXhwYW5kZWRPcHRpb25zOiBTZXQ8T1snaWQnXT47XG4gICAgfTtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBGdWxsU3RhdGU8TyBleHRlbmRzIEJhc2VPcHRpb24+ID0gQ29yZVN0YXRlPE8+ICYge1xuICAgIHF1ZXJ5OiB7XG4gICAgICBzaG93U2VhcmNoOiBib29sZWFuO1xuICAgICAgc2VhcmNoUGxhY2Vob2xkZXI6IHN0cmluZztcbiAgICAgIHNob3dPcmRlcjogYm9vbGVhbjtcbiAgICB9O1xuICAgIGZ1bGxPcHRpb25Hcm91cHM6IEZ1bGxPcHRpb25Hcm91cDxPPltdO1xuICAgIHNlbGVjdGlvbjoge1xuICAgICAgYWxsb3dNdWx0aVNlbGVjdDogYm9vbGVhbjtcbiAgICAgIGFsbG93U2VsZWN0QWxsOiBib29sZWFuO1xuICAgICAgdmlzaWJsZVNlbGVjdGlvblN0YXRlOiBNdWx0aVNlbGVjdGlvblN0YXRlO1xuICAgIH07XG4gICAgZGlzcGxheToge1xuICAgICAgZm9ybWF0dGVkU2VsZWN0ZWRPcHRpb25zOiBzdHJpbmc7XG4gICAgICB6ZXJvU3RhdGVNZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xuICAgICAgZGl2aWRlcnM6IGJvb2xlYW47XG4gICAgICBpbmxpbmU6IGJvb2xlYW47XG4gICAgICBtYXhIZWlnaHQ6IHN0cmluZyB8IG51bGw7XG4gICAgICBtYXhXaWR0aDogc3RyaW5nIHwgbnVsbDtcbiAgICAgIG1pbkhlaWdodDogc3RyaW5nIHwgbnVsbDtcbiAgICAgIG1pbldpZHRoOiBzdHJpbmcgfCBudWxsO1xuICAgICAgZGlzcGxheUxpbWl0TWVzc2FnZTogc3RyaW5nIHwgbnVsbDtcbiAgICAgIHNob3dTaW5nbGVTZWxlY3RlZDogYm9vbGVhbjtcbiAgICAgIHBpbGxDb3VudDogbnVtYmVyO1xuICAgIH07XG4gIH07XG5cbiAgLy8vLy8vLy8vLy8vL1xuICAvLyBBY3Rpb25zIC8vXG4gIC8vLy8vLy8vLy8vLy9cblxuICBleHBvcnQgdHlwZSBBY3Rpb248TyBleHRlbmRzIEJhc2VPcHRpb24+ID1cbiAgICB8IHsgdHlwZTogJ2xvYWQnIH1cbiAgICB8IHsgdHlwZTogJ29wZW5DaGFuZ2UnOyBvcGVuOiBib29sZWFuIH1cbiAgICB8IHsgdHlwZTogJ3NlYXJjaENoYW5nZSc7IHBheWxvYWQ6IHN0cmluZyB9XG4gICAgfCB7IHR5cGU6ICdvcmRlckNoYW5nZSc7IHBheWxvYWQ6IE9yZGVyQnkgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAnc2VsZWN0aW9uQ2hhbmdlJztcbiAgICAgICAgcGF5bG9hZDogQ29yZVN0YXRlPE8+WydzZWxlY3Rpb24nXTtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3RvZ2dsZU9wdGlvblNlbGVjdGVkJztcbiAgICAgICAgaWQ6IE9bJ2lkJ107XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdzZXRTZWxlY3RlZE9wdGlvbic7XG4gICAgICAgIGlkOiBPWydpZCddO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAndmlzaWJsZVNlbGVjdGVkQ2hhbmdlJztcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3RvZ2dsZU9wdGlvbkV4cGFuZGVkJztcbiAgICAgICAgaWQ6IE9bJ2lkJ107XG4gICAgICB9O1xuXG4gIHR5cGUgSW50ZXJuYWxBY3Rpb248TyBleHRlbmRzIEJhc2VPcHRpb24+ID1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ2xvYWRDb21wbGV0ZSc7XG4gICAgICAgIGRhdGE6IFNvdXJjZU9wdGlvbkdyb3VwPE8+W107XG4gICAgICAgIC8qKiBPcmlnaW5hbCB1bmZpbHRlcmVkIGRhdGEsIHByb3ZpZGVkIHdoZW4gc2VhcmNoIGlzIGFjdGl2ZSAqL1xuICAgICAgICBvcmlnaW5hbERhdGE/OiBTb3VyY2VPcHRpb25Hcm91cDxPPltdO1xuICAgICAgfVxuICAgIHwgeyB0eXBlOiAnbG9hZEVycm9yJzsgZXJyb3I6IHVua25vd24gfTtcblxuICAvLy8vLy8vLy8vLy9cbiAgLy8gU291cmNlIC8vXG4gIC8vLy8vLy8vLy8vL1xuXG4gIC8qKlxuICAgKiBUaGUgU291cmNlJ3Mgam9iIGlzIHRvIGZldGNoIG9wdGlvbnMgKGJhc2VkIG9uIHRoZSBjdXJyZW50IHN0YXRlKSB3aGljaFxuICAgKiB0aGVuIGJsZW5kIHdpdGggdGhlIG90aGVyIHBpZWNlcyBvZiBzdGF0ZSB0byBwcm9kdWNlIHRoZSBGdWxsU3RhdGUuXG4gICAqL1xuXG4gIGV4cG9ydCB0eXBlIFNvdXJjZVJlc3VsdDxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPVxuICAgIHwgU291cmNlT3B0aW9uR3JvdXA8Tz5bXVxuICAgIHwge1xuICAgICAgICBkYXRhOiBTb3VyY2VPcHRpb25Hcm91cDxPPltdO1xuICAgICAgICAvKipcbiAgICAgICAgICogT3JpZ2luYWwgdW5maWx0ZXJlZCBkYXRhLCBwcm92aWRlZCB3aGVuIHNlYXJjaCBmaWx0ZXJpbmcgaXMgYWN0aXZlLlxuICAgICAgICAgKiBVc2VkIGJ5IGBhbGxvd1NlbGVjdE5vbkxlYWZEdXJpbmdTZWFyY2hgIHRvIHNlbGVjdCBhbGwgY2hpbGRyZW4gb2ZcbiAgICAgICAgICogYSBwYXJlbnQsIGluY2x1ZGluZyB0aG9zZSBub3QgdmlzaWJsZSBpbiB0aGUgZmlsdGVyZWQgc2VhcmNoIHJlc3VsdHMuXG4gICAgICAgICAqL1xuICAgICAgICBvcmlnaW5hbERhdGE/OiBTb3VyY2VPcHRpb25Hcm91cDxPPltdO1xuICAgICAgfTtcblxuICBleHBvcnQgdHlwZSBTb3VyY2U8TyBleHRlbmRzIEJhc2VPcHRpb24+ID0gKFxuICAgIHF1ZXJ5OiBDb3JlU3RhdGU8Tz5bJ3F1ZXJ5J10sXG4gICAgbW9zdFJlY2VudEFjdGlvbjogQWN0aW9uPE8+LFxuICApID0+IFByb21pc2U8U291cmNlUmVzdWx0PE8+PjtcblxuICAvLy8vLy8vLy8vLy8vXG4gIC8vIE1hbmFnZXIgLy9cbiAgLy8vLy8vLy8vLy8vL1xuXG4gIGV4cG9ydCB0eXBlIE1hbmFnZXI8TyBleHRlbmRzIEJhc2VPcHRpb24+ID0ge1xuICAgIGFjdGlvbnM6IFN1YmplY3Q8QWN0aW9uPE8+PjtcbiAgICBzdGF0ZTogQ29ubmVjdGFibGU8RnVsbFN0YXRlPE8+PjtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBNYW5hZ2VyT3B0aW9uczxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSB7XG4gICAgaW5pdGlhbFN0YXRlPzogRGVlcFBhcnRpYWw8Q29yZVN0YXRlPE8+PjtcbiAgICBhbGxvd011bHRpU2VsZWN0PzogYm9vbGVhbjtcbiAgICBhbGxvd1NlYXJjaD86IGJvb2xlYW47XG4gICAgYWxsb3dTZWxlY3RBbGw/OiBib29sZWFuO1xuICAgIGFsbG93T3JkZXI/OiBib29sZWFuO1xuICAgIHNlYXJjaFBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAgIGRpdmlkZXJzPzogYm9vbGVhbjtcbiAgICBpbmxpbmU/OiBib29sZWFuO1xuICAgIG1heEhlaWdodD86IHN0cmluZyB8IG51bGw7XG4gICAgbWF4V2lkdGg/OiBzdHJpbmcgfCBudWxsO1xuICAgIG1pbkhlaWdodD86IHN0cmluZyB8IG51bGw7XG4gICAgbWluV2lkdGg/OiBzdHJpbmcgfCBudWxsO1xuICAgIGRpc3BsYXlMaW1pdD86IG51bWJlcjtcbiAgICBzZWxlY3RlZE9wdGlvbkxpbWl0PzogbnVtYmVyO1xuICAgIHNob3dTaW5nbGVTZWxlY3RlZD86IGJvb2xlYW47XG4gICAgdXNlVG9wTGV2ZWxPcHRpb25zRm9yRGlzcGxheT86IGJvb2xlYW47XG4gICAgZ2V0Q3VzdG9tT3B0aW9uRGlzcGxheT86IChzZWxlY3RlZE9wdGlvbnM6IFNvdXJjZU9wdGlvbjxPPltdKSA9PiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCBub24tbGVhZiBub2RlcyAocGFyZW50cykgcmVtYWluIHNlbGVjdGFibGUgZHVyaW5nIHNlYXJjaCxcbiAgICAgKiBhbmQgc2VsZWN0aW5nIHRoZW0gd2lsbCBzZWxlY3QvZGVzZWxlY3QgQUxMIGNoaWxkcmVuIGZyb20gdGhlIG9yaWdpbmFsXG4gICAgICogZGF0YXNldCwgbm90IGp1c3QgdGhlIHZpc2libGUgZmlsdGVyZWQgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIERlZmF1bHQ6IGZhbHNlIChjdXJyZW50IGJlaGF2aW9yIC0gcGFyZW50cyBhcmUgbm90IHNlbGVjdGFibGUgZHVyaW5nIHNlYXJjaClcbiAgICAgKi9cbiAgICBhbGxvd1NlbGVjdE5vbkxlYWZEdXJpbmdTZWFyY2g/OiBib29sZWFuO1xuICB9O1xuXG4gIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNYW5hZ2VyPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzb3VyY2U6IFNvdXJjZTxPPixcbiAgICBvcHRpb25zPzogTWFuYWdlck9wdGlvbnM8Tz4sXG4gICk6IE1hbmFnZXI8Tz4ge1xuICAgIGNvbnN0IGRlZmF1bHRTdGF0ZTogQ29yZVN0YXRlPE8+ID0ge1xuICAgICAgcXVlcnk6IHtcbiAgICAgICAgc2VhcmNoOiAnJyxcbiAgICAgICAgb3JkZXI6ICd0aXRsZScsXG4gICAgICB9LFxuICAgICAgbG9hZDoge1xuICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB9LFxuICAgICAgc291cmNlT3B0aW9uR3JvdXBzOiBbXSxcbiAgICAgIG9yaWdpbmFsT3B0aW9uR3JvdXBzOiBbXSxcbiAgICAgIHNlbGVjdGlvbjoge1xuICAgICAgICBzZWxlY3RlZDogbmV3IE9wdGlvblNldCgpLFxuICAgICAgfSxcbiAgICAgIGRpc3BsYXk6IHtcbiAgICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QnLFxuICAgICAgICBvcGVuOiBmYWxzZSxcbiAgICAgICAgZXhwYW5kZWRPcHRpb25zOiBuZXcgU2V0KCksXG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3QgZGVmYXVsdGVkSW5pdGlhbFN0YXRlOiBDb3JlU3RhdGU8Tz4gPSBkZWZhdWx0c0RlZXAoXG4gICAgICB7fSxcbiAgICAgIG9wdGlvbnM/LmluaXRpYWxTdGF0ZSxcbiAgICAgIGRlZmF1bHRTdGF0ZSxcbiAgICApO1xuXG4gICAgY29uc3QgYWN0aW9uczogU3ViamVjdDxBY3Rpb248Tz4+ID0gbmV3IFN1YmplY3QoKTtcbiAgICBjb25zdCBpbnRlcm5hbEFjdGlvbnM6IFN1YmplY3Q8SW50ZXJuYWxBY3Rpb248Tz4+ID0gbmV3IFN1YmplY3QoKTtcblxuICAgIGNvbnN0IGNvcmVTdGF0ZVdpdGhTZWxlY3Rpb25TbmFwc2hvdDogT2JzZXJ2YWJsZTxcbiAgICAgIFtDb3JlU3RhdGU8Tz4sIE9wdGlvblNldDxPPl1cbiAgICA+ID0gbWVyZ2UoYWN0aW9ucywgaW50ZXJuYWxBY3Rpb25zKS5waXBlKFxuICAgICAgc2NhbjxBY3Rpb248Tz4gfCBJbnRlcm5hbEFjdGlvbjxPPiwgW0NvcmVTdGF0ZTxPPiwgT3B0aW9uU2V0PE8+XT4oXG4gICAgICAgIChbc3RhdGUsIHNuYXBzaG90XSwgYWN0aW9uKSA9PiB7XG4gICAgICAgICAgY29uc3QgbmV3U3RhdGUgPSBzaWRlRWZmZWN0cyhcbiAgICAgICAgICAgIHJlZHVjZShzdGF0ZSwgYWN0aW9uLCBvcHRpb25zKSxcbiAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgIGludGVybmFsQWN0aW9ucyxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uU25hcHNob3QgPVxuICAgICAgICAgICAgKGFjdGlvbi50eXBlID09PSAnb3BlbkNoYW5nZScgJiYgYWN0aW9uLm9wZW4pIHx8XG4gICAgICAgICAgICAoYWN0aW9uLnR5cGUgPT09ICdsb2FkQ29tcGxldGUnICYmXG4gICAgICAgICAgICAgIChuZXdTdGF0ZS5kaXNwbGF5Lm9wZW4gfHwgb3B0aW9ucz8uaW5saW5lKSlcbiAgICAgICAgICAgICAgPyBjcmVhdGVTZWxlY3Rpb25TbmFwc2hvdFdpdGhBbmNlc3RvcnMobmV3U3RhdGUpXG4gICAgICAgICAgICAgIDogc25hcHNob3Q7XG5cbiAgICAgICAgICByZXR1cm4gW25ld1N0YXRlLCBuZXdTZWxlY3Rpb25TbmFwc2hvdF07XG4gICAgICAgIH0sXG4gICAgICAgIFtkZWZhdWx0ZWRJbml0aWFsU3RhdGUsIG5ldyBPcHRpb25TZXQ8Tz4oKV0sXG4gICAgICApLFxuICAgICAgc3RhcnRXaXRoPFtDb3JlU3RhdGU8Tz4sIE9wdGlvblNldDxPPl0+KFtcbiAgICAgICAgZGVmYXVsdGVkSW5pdGlhbFN0YXRlLFxuICAgICAgICBuZXcgT3B0aW9uU2V0PE8+KCksXG4gICAgICBdKSxcbiAgICApO1xuXG4gICAgY29uc3Qgc3RhdGU6IENvbm5lY3RhYmxlPEZ1bGxTdGF0ZTxPPj4gPSBjb25uZWN0YWJsZShcbiAgICAgIGNvcmVTdGF0ZVdpdGhTZWxlY3Rpb25TbmFwc2hvdC5waXBlKFxuICAgICAgICBtYXAoKFtzLCBzZWxlY3Rpb25BdE9wZW5dKSA9PiB7XG4gICAgICAgICAgY29uc3QgYWxsT3B0aW9uR3JvdXBzOiBGdWxsT3B0aW9uR3JvdXA8Tz5bXSA9XG4gICAgICAgICAgICBzLnNvdXJjZU9wdGlvbkdyb3Vwcy5tYXAob3B0aW9uR3JvdXAgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLm9wdGlvbkdyb3VwLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbkdyb3VwLm9wdGlvbnMubWFwKG9wdGlvbiA9PlxuICAgICAgICAgICAgICAgICAgYXVnbWVudE9wdGlvblRvRnVsbE9wdGlvbihzLCBvcHRpb24sIG9wdGlvbnMpLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IHRvcExldmVsT3B0aW9ucyA9IGdldFRvcExldmVsT3B0aW9ucyhhbGxPcHRpb25Hcm91cHMpO1xuXG4gICAgICAgICAgY29uc3Qgc29ydGVkT3B0aW9uR3JvdXBzID0gb3B0aW9ucz8uYWxsb3dNdWx0aVNlbGVjdFxuICAgICAgICAgICAgPyBzb3J0T3B0aW9uc0J5UHJldmlvdXNseVNlbGVjdGVkU3RhdGUoXG4gICAgICAgICAgICAgICAgYWxsT3B0aW9uR3JvdXBzLFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbkF0T3BlbixcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiBhbGxPcHRpb25Hcm91cHM7XG5cbiAgICAgICAgICBjb25zdCBkaXNwbGF5TGltaXRlZE9wdGlvbkdyb3VwcyA9IGFwcGx5RGlzcGxheUxpbWl0KFxuICAgICAgICAgICAgc29ydGVkT3B0aW9uR3JvdXBzLFxuICAgICAgICAgICAgb3B0aW9ucz8uZGlzcGxheUxpbWl0ID8/IDEwMCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGZ1bGxPcHRpb25Hcm91cHMgPSBhcHBseVNlbGVjdGVkT3B0aW9uTGltaXQoXG4gICAgICAgICAgICBzLFxuICAgICAgICAgICAgZGlzcGxheUxpbWl0ZWRPcHRpb25Hcm91cHMsXG4gICAgICAgICAgICB0b3BMZXZlbE9wdGlvbnMsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucyxcbiAgICAgICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICAgIC4uLnMucXVlcnksXG4gICAgICAgICAgICAgIHNob3dTZWFyY2g6XG4gICAgICAgICAgICAgICAgISFvcHRpb25zPy5hbGxvd1NlYXJjaCAmJlxuICAgICAgICAgICAgICAgICghIXMucXVlcnkuc2VhcmNoIHx8XG4gICAgICAgICAgICAgICAgICBjb3VudEFsbE9wdGlvbnMoYWxsT3B0aW9uR3JvdXBzKSA+IE1JTl9PUFRJT05TX0ZPUl9DT05UUk9MUyksXG4gICAgICAgICAgICAgIHNlYXJjaFBsYWNlaG9sZGVyOiBvcHRpb25zPy5zZWFyY2hQbGFjZWhvbGRlciA/PyAnU2VhcmNoJyxcbiAgICAgICAgICAgICAgc2hvd09yZGVyOlxuICAgICAgICAgICAgICAgICEhb3B0aW9ucz8uYWxsb3dPcmRlciAmJlxuICAgICAgICAgICAgICAgICFzLnF1ZXJ5LnNlYXJjaCAmJlxuICAgICAgICAgICAgICAgIGNvdW50QWxsT3B0aW9ucyhhbGxPcHRpb25Hcm91cHMpID4gTUlOX09QVElPTlNfRk9SX0NPTlRST0xTLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZ1bGxPcHRpb25Hcm91cHMsXG4gICAgICAgICAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgICAgICAgLi4ucy5zZWxlY3Rpb24sXG4gICAgICAgICAgICAgIGFsbG93TXVsdGlTZWxlY3Q6ICEhb3B0aW9ucz8uYWxsb3dNdWx0aVNlbGVjdCxcbiAgICAgICAgICAgICAgYWxsb3dTZWxlY3RBbGw6XG4gICAgICAgICAgICAgICAgISFvcHRpb25zPy5hbGxvd1NlbGVjdEFsbCAmJlxuICAgICAgICAgICAgICAgIG9wdGlvbnM/LnNlbGVjdGVkT3B0aW9uTGltaXQgPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB2aXNpYmxlU2VsZWN0aW9uU3RhdGU6XG4gICAgICAgICAgICAgICAgZ2V0UGFyZW50TXVsdGlTZWxlY3Rpb25TdGF0ZSh0b3BMZXZlbE9wdGlvbnMpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRpc3BsYXk6IHtcbiAgICAgICAgICAgICAgLi4ucy5kaXNwbGF5LFxuICAgICAgICAgICAgICBmb3JtYXR0ZWRTZWxlY3RlZE9wdGlvbnM6IGdldEZvcm1hdHRlZE9wdGlvbnNGb3JEaXNwbGF5KFxuICAgICAgICAgICAgICAgIHMsXG4gICAgICAgICAgICAgICAgdG9wTGV2ZWxPcHRpb25zLFxuICAgICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHplcm9TdGF0ZU1lc3NhZ2U6IGdldFplcm9TdGF0ZU1lc3NhZ2UocyksXG4gICAgICAgICAgICAgIGRpdmlkZXJzOiAhIW9wdGlvbnM/LmRpdmlkZXJzLFxuICAgICAgICAgICAgICBpbmxpbmU6ICEhb3B0aW9ucz8uaW5saW5lLFxuICAgICAgICAgICAgICBtYXhIZWlnaHQ6IG9wdGlvbnM/Lm1heEhlaWdodCA/PyBudWxsLFxuICAgICAgICAgICAgICBtYXhXaWR0aDogb3B0aW9ucz8ubWF4V2lkdGggPz8gbnVsbCxcbiAgICAgICAgICAgICAgbWluSGVpZ2h0OiBvcHRpb25zPy5taW5IZWlnaHQgPz8gbnVsbCxcbiAgICAgICAgICAgICAgbWluV2lkdGg6IG9wdGlvbnM/Lm1pbldpZHRoID8/IG51bGwsXG4gICAgICAgICAgICAgIGRpc3BsYXlMaW1pdE1lc3NhZ2U6IGdldERpc3BsYXlMaW1pdE1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgY291bnRWaXNpYmxlT3B0aW9ucyhmdWxsT3B0aW9uR3JvdXBzLCAhIXMucXVlcnkuc2VhcmNoKSxcbiAgICAgICAgICAgICAgICBjb3VudFZpc2libGVPcHRpb25zKGFsbE9wdGlvbkdyb3VwcywgISFzLnF1ZXJ5LnNlYXJjaCksXG4gICAgICAgICAgICAgICAgcy5xdWVyeSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgc2hvd1NpbmdsZVNlbGVjdGVkOiAhIW9wdGlvbnM/LnNob3dTaW5nbGVTZWxlY3RlZCxcbiAgICAgICAgICAgICAgcGlsbENvdW50OiBnZXRQaWxsQ291bnRGb3JEaXNwbGF5KHMsIHRvcExldmVsT3B0aW9ucywgb3B0aW9ucyksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICAgIHtcbiAgICAgICAgY29ubmVjdG9yOiAoKSA9PiBuZXcgUmVwbGF5U3ViamVjdCgxKSxcbiAgICAgICAgcmVzZXRPbkRpc2Nvbm5lY3Q6IGZhbHNlLFxuICAgICAgfSxcbiAgICApO1xuICAgIHN0YXRlLmNvbm5lY3QoKTtcblxuICAgIC8vIExvYWQgdGhlIG9wdGlvbnMgaW1tZWRpYXRlbHkgZm9yIHNlbGVjdHMgdGhhdCBhcmUgZGlzcGxheWVkIGlubGluZS5cbiAgICBpZiAob3B0aW9ucz8uaW5saW5lKSBhY3Rpb25zLm5leHQoeyB0eXBlOiAnbG9hZCcgfSk7XG5cbiAgICByZXR1cm4geyBhY3Rpb25zLCBzdGF0ZSB9O1xuICB9XG5cbiAgZXhwb3J0IHR5cGUgSW5NZW1vcnlNYW5hZ2VyT3B0aW9uczxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPVxuICAgIE1hbmFnZXJPcHRpb25zPE8+ICYge1xuICAgICAgZnVzZU9wdGlvbnM/OiBJRnVzZU9wdGlvbnM8Tz47XG4gICAgfTtcblxuICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlSW5NZW1vcnlNYW5hZ2VyPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBmZXRjaERhdGFzZXQ6ICgpID0+IFByb21pc2U8T3B0aW9uR3JvdXA8Tz5bXT4gfCBPcHRpb25Hcm91cDxPPltdLFxuICAgIG9wdGlvbnM/OiBJbk1lbW9yeU1hbmFnZXJPcHRpb25zPE8+LFxuICApOiBNYW5hZ2VyPE8+IHtcbiAgICBsZXQgZGF0YTogT3B0aW9uR3JvdXA8Tz5bXTtcbiAgICBsZXQgZnVzZTogRnVzZTxPPjtcbiAgICBsZXQgZXhhY3RNYXRjaDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGxldCBwYXJlbnRzOiBNYXA8T1snaWQnXSwgT1snaWQnXT47XG4gICAgbGV0IGNoaWxkcmVuOiBNYXA8T1snaWQnXSwgT1snaWQnXVtdPjtcblxuICAgIGNvbnN0IHNvdXJjZTogU291cmNlPE8+ID0gYXN5bmMgKHF1ZXJ5LCBtb3N0UmVjZW50QWN0aW9uKSA9PiB7XG4gICAgICAvKlxuICAgICAgICBSZS1mZXRjaCB0aGUgb3B0aW9ucyBvbiB0aGUgbG9hZCBhY3Rpb24sIGFuZCByZWJ1aWxkIHRoZSBzdGF0ZVxuICAgICAgICBkZXJpdmVkIGZyb20gdGhlIG9wdGlvbiBkYXRhLlxuICAgICAgKi9cbiAgICAgIGlmIChcbiAgICAgICAgbW9zdFJlY2VudEFjdGlvbi50eXBlID09PSAnbG9hZCcgfHxcbiAgICAgICAgbW9zdFJlY2VudEFjdGlvbi50eXBlID09PSAnb3BlbkNoYW5nZSdcbiAgICAgICkge1xuICAgICAgICBkYXRhID0gYXdhaXQgZmV0Y2hEYXRhc2V0KCk7XG4gICAgICAgIGNvbnN0IHRvcExldmVsT3B0aW9ucyA9IGdldFRvcExldmVsT3B0aW9ucyhkYXRhKTtcblxuICAgICAgICBmdXNlID0gbmV3IEZ1c2UoZmxhdHRlbk9wdGlvbnModG9wTGV2ZWxPcHRpb25zLCBmYWxzZSksIHtcbiAgICAgICAgICB0aHJlc2hvbGQ6IDAuMixcbiAgICAgICAgICBrZXlzOiBbJ3RpdGxlJ10sXG4gICAgICAgICAgaW5jbHVkZVNjb3JlOiB0cnVlLFxuICAgICAgICAgIGluY2x1ZGVNYXRjaGVzOiB0cnVlLFxuICAgICAgICAgIC4uLm9wdGlvbnM/LmZ1c2VPcHRpb25zLFxuICAgICAgICB9KTtcblxuICAgICAgICBleGFjdE1hdGNoID0gb3B0aW9ucz8uZnVzZU9wdGlvbnM/LnRocmVzaG9sZCA9PSAwO1xuICAgICAgICBbcGFyZW50cywgY2hpbGRyZW5dID0gZ2V0UmVsYXRpb25zaGlwTWFwcyh0b3BMZXZlbE9wdGlvbnMpO1xuICAgICAgfVxuXG4gICAgICAvKlxuICAgICAgICBJZiB0aGUgdXNlciBpcyBub3Qgc2VhcmNoaW5nIG9wdGlvbnMsIHJldHVybiB0aGUgZnVsbCBzZXQgb2Ygb3B0aW9uc1xuICAgICAgICBzb3J0ZWQgYXBwcm9wcmlhdGVseS5cbiAgICAgICovXG4gICAgICBpZiAoIXF1ZXJ5LnNlYXJjaCkge1xuICAgICAgICAvKlxuICAgICAgICAgIFRoZSBgc291cmNlYCBvcmRlciBwcm9wZXJ0eSBhbGxvd3MgZm9yIG9wdGluZyBvdXQgb2YgYXV0b21hdGljXG4gICAgICAgICAgc29ydGluZywgcmV0dXJuaW5nIHRoZSBkYXRhIGluIGl0cyBuYXR1cmFsIGlucHV0IG9yZGVyLlxuICAgICAgICAqL1xuICAgICAgICBpZiAocXVlcnkub3JkZXIgPT09ICdzb3VyY2UnKSByZXR1cm4gZGF0YTtcblxuICAgICAgICAvKlxuICAgICAgICAgIFNvcnQgdGhlIG9wdGlvbnMgYnkgdGl0bGUgYW5kIHN1YnRpdGxlLlxuICAgICAgICAqL1xuICAgICAgICBpZiAocXVlcnkub3JkZXIgPT09ICd0aXRsZScpIHtcbiAgICAgICAgICBmdW5jdGlvbiBzb3J0QnlUaXRsZShvcHRpb25zOiBPcHRpb248Tz5bXSk6IE9wdGlvbjxPPltdIHtcbiAgICAgICAgICAgIHJldHVybiBzb3J0Qnkob3B0aW9ucywgW1xuICAgICAgICAgICAgICAobzogT3B0aW9uPE8+KSA9PiBvLnRpdGxlLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICAgIChvOiBPcHRpb248Tz4pID0+IG8uc3VidGl0bGU/LnRvTG93ZXJDYXNlKCkgPz8gJycsXG4gICAgICAgICAgICBdKS5tYXAob3B0aW9uID0+ICh7XG4gICAgICAgICAgICAgIC4uLm9wdGlvbixcbiAgICAgICAgICAgICAgY2hpbGRyZW46IG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyBzb3J0QnlUaXRsZShvcHRpb24uY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGRhdGEubWFwKGdyb3VwID0+ICh7XG4gICAgICAgICAgICAuLi5ncm91cCxcbiAgICAgICAgICAgIG9wdGlvbnM6IHNvcnRCeVRpdGxlKGdyb3VwLm9wdGlvbnMpLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICAgU29ydCB0aGUgb3B0aW9ucyBieSBjb3VudCwgdGhlbiBieSB0aXRsZSwgdGhlbiBieSBzdWJ0aXRsZS5cbiAgICAgICAgKi9cbiAgICAgICAgaWYgKHF1ZXJ5Lm9yZGVyID09PSAnY291bnQnKSB7XG4gICAgICAgICAgZnVuY3Rpb24gc29ydEJ5Q291bnQob3B0aW9uczogT3B0aW9uPE8+W10pOiBPcHRpb248Tz5bXSB7XG4gICAgICAgICAgICByZXR1cm4gc29ydEJ5KG9wdGlvbnMsIFtcbiAgICAgICAgICAgICAgKG86IE9wdGlvbjxPPikgPT4gKGlzTnVtYmVyKG8uY291bnQpID8gLW8uY291bnQgOiBJbmZpbml0eSksXG4gICAgICAgICAgICAgIChvOiBPcHRpb248Tz4pID0+IG8udGl0bGUudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgICAgKG86IE9wdGlvbjxPPikgPT4gby5zdWJ0aXRsZT8udG9Mb3dlckNhc2UoKSA/PyAnJyxcbiAgICAgICAgICAgIF0pLm1hcChvcHRpb24gPT4gKHtcbiAgICAgICAgICAgICAgLi4ub3B0aW9uLFxuICAgICAgICAgICAgICBjaGlsZHJlbjogb3B0aW9uLmNoaWxkcmVuPy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IHNvcnRCeUNvdW50KG9wdGlvbi5jaGlsZHJlbilcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZGF0YS5tYXAoZ3JvdXAgPT4gKHtcbiAgICAgICAgICAgIC4uLmdyb3VwLFxuICAgICAgICAgICAgb3B0aW9uczogc29ydEJ5Q291bnQoZ3JvdXAub3B0aW9ucyksXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8qXG4gICAgICAgIEV4ZWN1dGUgdGhlIHNlYXJjaCB3aXRoIGZ1c2UuIE9uY2Ugd2UgaGF2ZSB0aGUgc2VhcmNoIG1hdGNoIGRhdGEsXG4gICAgICAgIHJlYnVpbGQganVzdCBhcyBtdWNoIG9mIHRoZSB0cmVlIGFzIGlzIG5lZWRlZCB0byByZW5kZXIgdGhlIHNlYXJjaFxuICAgICAgICByZXN1bHRzLiBTcGVjaWZpY2FsbHksIGFueSBtYXRjaCB3aWxsIG5lZWQgYWxsIG9mIGl0cyBhbmNlc3RvcnMgKHNvXG4gICAgICAgIHRoYXQgbWF0Y2hlZCBsZWFmIG5vZGVzIGFyZSBzaG93biBuZXN0ZWQgdW5kZXIgdGhlaXIgYW5jZXN0b3JzKSBhbmQgYWxsXG4gICAgICAgIG9mIGl0cyBjaGlsZHJlbiAoYmVjYXVzZSBhIG1hdGNoaW5nIHBhcmVudCBtZWFucyB0aGF0IGFsbCBvZiBpdHNcbiAgICAgICAgZGVzY2VuZGFudHMgbWF0Y2ggdG9vLCBwZXIgdGhlIGRlc2lnbiBzcGVjaWZpY2F0aW9uKSwgd2hldGhlciB0aGV5XG4gICAgICAgIHRoZW1zZWx2ZXMgbWF0Y2hlZCBvciBub3QuXG4gICAgICAqL1xuICAgICAgY29uc3QgbWF0Y2hlZE9wdGlvbnM6IEZ1c2VSZXN1bHQ8Tz5bXSA9IGZ1c2Uuc2VhcmNoKHF1ZXJ5LnNlYXJjaCk7XG4gICAgICBjb25zdCBtYXRjaGVkSWRzOiBTZXQ8T1snaWQnXT4gPSBuZXcgU2V0KFxuICAgICAgICBtYXRjaGVkT3B0aW9ucy5tYXAocmVzdWx0ID0+IHJlc3VsdC5pdGVtLmlkKSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IG1hdGNoQW5jZXN0b3JzOiBTZXQ8T1snaWQnXT4gPSBuZXcgU2V0KCk7XG4gICAgICBmdW5jdGlvbiBjb2xsZWN0QW5jZXN0b3JzKGlkczogT1snaWQnXVtdKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG4gICAgICAgICAgY29uc3QgcGFyZW50SWQgPSBwYXJlbnRzLmdldChpZCk7XG4gICAgICAgICAgaWYgKHBhcmVudElkKSB7XG4gICAgICAgICAgICBtYXRjaEFuY2VzdG9ycy5hZGQocGFyZW50SWQpO1xuICAgICAgICAgICAgY29sbGVjdEFuY2VzdG9ycyhbcGFyZW50SWRdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbGxlY3RBbmNlc3RvcnMoWy4uLm1hdGNoZWRJZHNdKTtcblxuICAgICAgY29uc3QgbWF0Y2hEZXNjZW5kYW50czogU2V0PE9bJ2lkJ10+ID0gbmV3IFNldCgpO1xuICAgICAgZnVuY3Rpb24gY29sbGVjdERlc2NlbmRhbnRzKGlkczogT1snaWQnXVtdKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG4gICAgICAgICAgY29uc3QgY2hpbGRyZW5JZHMgPSBjaGlsZHJlbi5nZXQoaWQpO1xuICAgICAgICAgIGlmIChjaGlsZHJlbklkcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbklkcykge1xuICAgICAgICAgICAgICBtYXRjaERlc2NlbmRhbnRzLmFkZChjaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb2xsZWN0RGVzY2VuZGFudHMoY2hpbGRyZW5JZHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29sbGVjdERlc2NlbmRhbnRzKFsuLi5tYXRjaGVkSWRzXSk7XG5cbiAgICAgIC8qXG4gICAgICAgIE5leHQsIHdlJ2xsIGNvbWJpbmUgYWxsIHRoZSBtYXRjaGVkIElEcyB3aXRoIHRoZWlyIGRpcmVjdCBhbmNlc3RvcnMgYW5kXG4gICAgICAgIGRlc2NhbmRhbnRzLCBhbmQgZmlsdGVyIHRoZSBvcmlnaW5hbCBkYXRhIHNldCBkb3duIHRvIGp1c3QgdGhlc2VcbiAgICAgICAgb3B0aW9ucy5cbiAgICAgICovXG4gICAgICBjb25zdCBmaWx0ZXJlZElkczogU2V0PE9bJ2lkJ10+ID0gbmV3IFNldChbXG4gICAgICAgIC4uLm1hdGNoZWRJZHMsXG4gICAgICAgIC4uLm1hdGNoQW5jZXN0b3JzLFxuICAgICAgICAuLi5tYXRjaERlc2NlbmRhbnRzLFxuICAgICAgXSk7XG5cbiAgICAgIGZ1bmN0aW9uIGZpbHRlck9wdGlvbnMob3B0aW9uczogT3B0aW9uPE8+W10pOiBPcHRpb248Tz5bXSB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkT3B0aW9uczogT3B0aW9uPE8+W10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xuICAgICAgICAgIGlmIChmaWx0ZXJlZElkcy5oYXMob3B0aW9uLmlkKSkge1xuICAgICAgICAgICAgZmlsdGVyZWRPcHRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAuLi5vcHRpb24sXG4gICAgICAgICAgICAgIGNoaWxkcmVuOiBvcHRpb24uY2hpbGRyZW4/Lmxlbmd0aFxuICAgICAgICAgICAgICAgID8gZmlsdGVyT3B0aW9ucyhvcHRpb24uY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkT3B0aW9ucztcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpbHRlcmVkT3B0aW9ucyA9IGZpbHRlck9wdGlvbnMoZ2V0VG9wTGV2ZWxPcHRpb25zKGRhdGEpKTtcblxuICAgICAgLypcbiAgICAgICAgQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSBhbiBhcnJheSBvZiBkaXN0aW5jdCB0cmVlcyAodG9wLWxldmVsIG9wdGlvbnMpLFxuICAgICAgICBmaWx0ZXJlZCBkb3duIHRvIG9ubHkgdGhlIG9wdGlvbnMgbWF0Y2hpbmcgdGhlIHNlYXJjaCBxdWVyeS4gTm90ZSB0aGF0XG4gICAgICAgIHdlIGRvbid0IGNhcmUgYWJvdXQgc2VjdGlvbiBoZWFkZXJzIHdoZW4gc2VhcmNoaW5nIHNpbmNlIHJlc3VsdHMgc2hvdWxkXG4gICAgICAgIGJlIG9yZGVyZWQgYnkgcmVsZXZhbmNlLiBUbyBjYWxjdWxhdGUgdGhlIG9yZGVyIG9mIHRoZXNlIHRyZWVzLCB3ZSdsbFxuICAgICAgICB0YWtlIHRoZSB0b3RhbCBtYXRjaCBzY29yZXMgZm9yIG9wdGlvbnMgZm91bmQgaW4gdGhlIHRyZWUsIGRpdmlkZWQgYnlcbiAgICAgICAgdGhlIGNvdW50IG9mIG1hdGNoZXMgaW4gdGhlIHRyZWUgKHRoZSBiZXN0IGF2ZXJhZ2UgbWF0Y2ggc2NvcmUpLlxuICAgICAgKi9cblxuICAgICAgY29uc3Qgc2NvcmVNYXA6IE1hcDxPWydpZCddLCBudW1iZXI+ID0gbmV3IE1hcChcbiAgICAgICAgbWF0Y2hlZE9wdGlvbnMubWFwKHJlc3VsdCA9PiBbcmVzdWx0Lml0ZW0uaWQsIHJlc3VsdC5zY29yZSA/PyAwXSksXG4gICAgICApO1xuICAgICAgY29uc3Qgb3JkZXJlZCA9IHNvcnRCeShmaWx0ZXJlZE9wdGlvbnMsIChvcHRpb246IE9wdGlvbjxPPik6IG51bWJlciA9PiB7XG4gICAgICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZVNjb3JlKG9wdGlvbjogT3B0aW9uPE8+KTogbnVtYmVyIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHNjb3JlTWFwLmdldChvcHRpb24uaWQpID8/IDApICtcbiAgICAgICAgICAgIChvcHRpb24uY2hpbGRyZW4gPz8gW10pLnJlZHVjZShcbiAgICAgICAgICAgICAgKHNjb3JlLCBjaGlsZCkgPT4gc2NvcmUgKyBjYWxjdWxhdGVTY29yZShjaGlsZCksXG4gICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBjYWxjdWxhdGVDb3VudChvcHRpb246IE9wdGlvbjxPPik6IG51bWJlciB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDEgK1xuICAgICAgICAgICAgKG9wdGlvbi5jaGlsZHJlbiA/PyBbXSkucmVkdWNlKFxuICAgICAgICAgICAgICAoY291bnQsIGNoaWxkKSA9PiBjb3VudCArIGNhbGN1bGF0ZUNvdW50KGNoaWxkKSxcbiAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvdGFsU2NvcmUgPSBjYWxjdWxhdGVTY29yZShvcHRpb24pO1xuICAgICAgICBjb25zdCB0b3RhbENvdW50ID0gY2FsY3VsYXRlQ291bnQob3B0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRvdGFsU2NvcmUgLyB0b3RhbENvdW50O1xuICAgICAgfSk7XG5cbiAgICAgIC8qXG4gICAgICAgIEZpbmFsbHksIHdlJ2xsIGFkZCBoaWdobGlnaHQgaW5kaWNlcyB0byB0aGUgbWF0Y2hlcyBzbyB0aGF0IHRoZXkgY2FuIGJlXG4gICAgICAgIGRpc3BsYXllZCB0byB0aGUgdXNlci5cbiAgICAgICovXG5cbiAgICAgIHR5cGUgSGlnaGxpZ2h0cyA9IHtcbiAgICAgICAgdGl0bGVIaWdobGlnaHRJbmRpY2VzPzogSGlnaGxpZ2h0Q29tcG9uZW50LkhpZ2hsaWdodEluZGljZXNbXTtcbiAgICAgICAgc3VidGl0bGVIaWdobGlnaHRJbmRpY2VzPzogSGlnaGxpZ2h0Q29tcG9uZW50LkhpZ2hsaWdodEluZGljZXNbXTtcbiAgICAgIH07XG4gICAgICBjb25zdCBoaWdobGlnaHRNYXA6IE1hcDxPWydpZCddLCBIaWdobGlnaHRzPiA9IG5ldyBNYXAoXG4gICAgICAgIG1hdGNoZWRPcHRpb25zLm1hcChyZXN1bHQgPT4ge1xuICAgICAgICAgIGNvbnN0IGhpZ2hsaWdodHM6IEhpZ2hsaWdodHMgPSB7fTtcbiAgICAgICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIHJlc3VsdC5tYXRjaGVzID8/IFtdKSB7XG4gICAgICAgICAgICAvLyBmaWx0ZXIgb3V0IGluZXhhY3QgbWF0Y2hlc1xuICAgICAgICAgICAgaWYgKGV4YWN0TWF0Y2ggJiYgbWF0Y2gudmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBtYXRjaC5pbmRpY2VzID0gbWF0Y2guaW5kaWNlcy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgaXNGdXNlTWF0Y2hFeGFjdChtYXRjaCwgcXVlcnkuc2VhcmNoKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaC5rZXkgPT09ICd0aXRsZScpIHtcbiAgICAgICAgICAgICAgaGlnaGxpZ2h0cy50aXRsZUhpZ2hsaWdodEluZGljZXMgPSBbLi4ubWF0Y2guaW5kaWNlc107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF0Y2gua2V5ID09PSAnc3VidGl0bGUnKSB7XG4gICAgICAgICAgICAgIGhpZ2hsaWdodHMuc3VidGl0bGVIaWdobGlnaHRJbmRpY2VzID0gWy4uLm1hdGNoLmluZGljZXNdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gW3Jlc3VsdC5pdGVtLmlkLCBoaWdobGlnaHRzXTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgZnVuY3Rpb24gYWRkSGlnaGxpZ2h0c1RvT3B0aW9uKG9wdGlvbnM6IE9wdGlvbjxPPltdKTogU291cmNlT3B0aW9uPE8+W10ge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5tYXAob3B0aW9uID0+ICh7XG4gICAgICAgICAgLi4ub3B0aW9uLFxuICAgICAgICAgIC4uLmhpZ2hsaWdodE1hcC5nZXQob3B0aW9uLmlkKSxcbiAgICAgICAgICAuLi4ob3B0aW9uLmNoaWxkcmVuPy5sZW5ndGhcbiAgICAgICAgICAgID8geyBjaGlsZHJlbjogYWRkSGlnaGxpZ2h0c1RvT3B0aW9uKG9wdGlvbi5jaGlsZHJlbikgfVxuICAgICAgICAgICAgOiBudWxsKSxcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiBbeyBvcHRpb25zOiBhZGRIaWdobGlnaHRzVG9PcHRpb24ob3JkZXJlZCkgfV0sXG4gICAgICAgIG9yaWdpbmFsRGF0YTogZGF0YSxcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHJldHVybiBjcmVhdGVNYW5hZ2VyKHNvdXJjZSwgb3B0aW9ucyk7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gaXNGdXNlTWF0Y2hFeGFjdChcbiAgICBtYXRjaDogRnVzZVJlc3VsdE1hdGNoLFxuICAgIHNlYXJjaDogc3RyaW5nLFxuICApOiAoXG4gICAgdmFsdWU6IFJhbmdlVHVwbGUsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBhcnJheTogcmVhZG9ubHkgUmFuZ2VUdXBsZVtdLFxuICApID0+IGJvb2xlYW4ge1xuICAgIHJldHVybiBtYXRjaGVkSW5kaWNlcyA9PiB7XG4gICAgICBjb25zdCBtYXRjaGVkVmFsdWUgPSBtYXRjaFxuICAgICAgICAudmFsdWUhLnNsaWNlKG1hdGNoZWRJbmRpY2VzWzBdLCBtYXRjaGVkSW5kaWNlc1sxXSArIDEpXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpO1xuICAgICAgLy8gZnVzZSBpcyB3ZWlyZCB3aXRoIGl0J3MgbWF0Y2hlcy4gRm9yIGEgdGV4dCBvZiBcInBsYW5uaW5nXCIgYW5kIGEgc2VhcmNoIHN0cmluZyBvZiBcInBsYW5cIlxuICAgICAgLy8gdGhlIG1hdGNoZWQgdmFsdWUgd2lsbCBiZSBcInBsYW5uXCIgd2l0aCB0aGUgZXh0cmEgJ24nIGJlY2F1c2Ugb2YgaXRzIGZ1enp5IG1hdGNoaW5nLlxuICAgICAgLy8gc28ganVzdCBtYWtlIHN1cmUgdGhlIG1hdGNoZWQgdmFsdWUgYXQgbGVhc3Qgc3RhcnRzIHdpdGggdGhlIHNlYXJjaCBzdHJpbmcuXG4gICAgICAvLyBpdCdzIGV4dHJhIHdlaXJkIGJlY2F1c2UgZm9yIGEgdGV4dCBvZiBcImFuYWx5dGljc1wiIGFuZCBhIHNlYXJjaCBzdHJpbmcgb2YgXCJuYWx5dGljc1wiLFxuICAgICAgLy8gdGhlIG1hdGNoZWQgdmFsdWUgd2lsbCBiZSBcImFuYWx5dGljc1wiLiBTbyB3ZSBqdXN0IG5lZWQgdG8gbWFrZSBzdXJlIHRoZSB0aGUgbWF0Y2hlZCB2YWx1ZVxuICAgICAgLy8gaW5jbHVkZXMgdGhlIHNlYXJjaCBzdHJpbmcgYmVjYXVzZSB0aGVyZSBtaWdodCBiZSBleHRyYSBzdHVmZiBvbiB0aGUgZnJvbnQgb3IgdGhlIGVuZC5cbiAgICAgIHJldHVybiBtYXRjaGVkVmFsdWUuaW5jbHVkZXMoc2VhcmNoLnRvTG93ZXJDYXNlKCkpO1xuICAgIH07XG4gIH1cblxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gIC8vIFN0YXRlIHJlZHVjZXIgKHdpdGggaGVscGVycykgLy9cbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZVNlbGVjdGlvblNuYXBzaG90V2l0aEFuY2VzdG9yczxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgc3RhdGU6IENvcmVTdGF0ZTxPPixcbiAgKTogT3B0aW9uU2V0PE8+IHtcbiAgICBjb25zdCBzbmFwc2hvdCA9IG5ldyBPcHRpb25TZXQoc3RhdGUuc2VsZWN0aW9uLnNlbGVjdGVkKTtcbiAgICBjb25zdCB0b3BMZXZlbE9wdGlvbnMgPSBnZXRUb3BMZXZlbE9wdGlvbnMoc3RhdGUuc291cmNlT3B0aW9uR3JvdXBzKTtcbiAgICBjb25zdCBbcGFyZW50c10gPSBnZXRSZWxhdGlvbnNoaXBNYXBzKHRvcExldmVsT3B0aW9ucyk7XG5cbiAgICAvLyBTaWJsaW5nIGxlYXZlcyBzaGFyZSBhbmNlc3RvcnMsIHNvIG9uY2Ugd2UndmUgd2Fsa2VkIHVwIHRocm91Z2ggYVxuICAgIC8vIGdpdmVuIHBhcmVudCBpZCB3ZSBjYW4gc3RvcCDigJQgYW55dGhpbmcgYWJvdmUgaXQgaGFzIGFscmVhZHkgYmVlblxuICAgIC8vIGFkZGVkIGJ5IGEgcHJldmlvdXMgaXRlcmF0aW9uLiBXaXRob3V0IHRoaXMgc2hvcnQtY2lyY3VpdCB0aGUgbG9vcFxuICAgIC8vIHJlLXJ1bnMgZmluZE9wdGlvbiAod2hpY2ggaXMgYSBmdWxsIHRyZWUgd2Fsaykgb25jZSBwZXIgc2hhcmVkXG4gICAgLy8gYW5jZXN0b3IgZWRnZSwgd2hpY2ggd2FzIHRoZSAjMiBob3RzcG90IGJlaGluZCBPcHRpb25TZXQuYWRkIGluXG4gICAgLy8gUlZULTI1NDcwJ3MgcHJvZmlsZS5cbiAgICBjb25zdCB2aXNpdGVkID0gbmV3IFNldDxPWydpZCddPigpO1xuICAgIGZvciAoY29uc3Qgc2VsZWN0ZWRPcHRpb24gb2Ygc3RhdGUuc2VsZWN0aW9uLnNlbGVjdGVkKSB7XG4gICAgICBsZXQgcGFyZW50SWQgPSBwYXJlbnRzLmdldChzZWxlY3RlZE9wdGlvbi5pZCk7XG4gICAgICB3aGlsZSAocGFyZW50SWQgIT09IHVuZGVmaW5lZCAmJiAhdmlzaXRlZC5oYXMocGFyZW50SWQpKSB7XG4gICAgICAgIHZpc2l0ZWQuYWRkKHBhcmVudElkKTtcbiAgICAgICAgY29uc3QgcGFyZW50T3B0aW9uID0gZmluZE9wdGlvbih0b3BMZXZlbE9wdGlvbnMsIHBhcmVudElkKTtcbiAgICAgICAgaWYgKHBhcmVudE9wdGlvbikge1xuICAgICAgICAgIHNuYXBzaG90LmFkZChwYXJlbnRPcHRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudElkID0gcGFyZW50cy5nZXQocGFyZW50SWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzbmFwc2hvdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldERpc3BsYXlMaW1pdE1lc3NhZ2U8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIGRpc3BsYXllZE9wdGlvbkNvdW50OiBudW1iZXIsXG4gICAgdG90YWxPcHRpb25Db3VudDogbnVtYmVyLFxuICAgIHF1ZXJ5OiBDb3JlU3RhdGU8Tz5bJ3F1ZXJ5J10sXG4gICk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmIChkaXNwbGF5ZWRPcHRpb25Db3VudCA9PT0gdG90YWxPcHRpb25Db3VudCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgcml2TnVtYmVyID0gbmV3IE51bWJlclBpcGUoKTtcbiAgICBjb25zdCBkaXNwbGF5ZWQgPSByaXZOdW1iZXIudHJhbnNmb3JtKGRpc3BsYXllZE9wdGlvbkNvdW50KTtcbiAgICBjb25zdCB0b3RhbCA9IHJpdk51bWJlci50cmFuc2Zvcm0odG90YWxPcHRpb25Db3VudCk7XG4gICAgY29uc3Qgc3RhcnQgPSBgU2hvd2luZyAke2Rpc3BsYXllZH0gb2YgJHt0b3RhbH0gb3B0aW9uc2A7XG4gICAgcmV0dXJuIHF1ZXJ5LnNlYXJjaCA/IGAke3N0YXJ0fSBtYXRjaGluZyBcIiR7cXVlcnkuc2VhcmNofVwiYCA6IHN0YXJ0O1xuICB9XG5cbiAgZnVuY3Rpb24gY291bnRWaXNpYmxlT3B0aW9uczxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgb3B0aW9uR3JvdXBzOiBGdWxsT3B0aW9uR3JvdXA8Tz5bXSxcbiAgICBsZWFmT25seTogYm9vbGVhbixcbiAgKTogbnVtYmVyIHtcbiAgICBmdW5jdGlvbiBjb3VudChvcHRpb25zOiBGdWxsT3B0aW9uPE8+W10pOiBudW1iZXIge1xuICAgICAgcmV0dXJuIG9wdGlvbnMucmVkdWNlKChhY2MsIG9wdGlvbikgPT4ge1xuICAgICAgICBpZiAob3B0aW9uLmV4cGFuZGVkICYmIG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIGFjYyArIChsZWFmT25seSA/IDAgOiAxKSArIGNvdW50KG9wdGlvbi5jaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYyArIDE7XG4gICAgICB9LCAwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9uR3JvdXBzLnJlZHVjZShcbiAgICAgICh0b3RhbCwgZ3JvdXApID0+IHRvdGFsICsgY291bnQoZ3JvdXAub3B0aW9ucyksXG4gICAgICAwLFxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBjb3VudEFsbE9wdGlvbnM8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIG9wdGlvbkdyb3VwczogRnVsbE9wdGlvbkdyb3VwPE8+W10sXG4gICk6IG51bWJlciB7XG4gICAgZnVuY3Rpb24gY291bnQob3B0aW9uczogRnVsbE9wdGlvbjxPPltdKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiBvcHRpb25zLnJlZHVjZSgoYWNjLCBvcHRpb24pID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIGFjYyArIDEgKyBjb3VudChvcHRpb24uY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2MgKyAxO1xuICAgICAgfSwgMCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGlvbkdyb3Vwcy5yZWR1Y2UoXG4gICAgICAodG90YWwsIGdyb3VwKSA9PiB0b3RhbCArIGNvdW50KGdyb3VwLm9wdGlvbnMpLFxuICAgICAgMCxcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gYXBwbHlEaXNwbGF5TGltaXQ8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIG9wdGlvbkdyb3VwczogRnVsbE9wdGlvbkdyb3VwPE8+W10sXG4gICAgZGlzcGxheUxpbWl0OiBudW1iZXIsXG4gICk6IEZ1bGxPcHRpb25Hcm91cDxPPltdIHtcbiAgICB0eXBlIERpc3BsYXlMaW1pdE9wdGlvbnMgPSBbRnVsbE9wdGlvbjxPPltdLCBudW1iZXJdO1xuICAgIGZ1bmN0aW9uIGZpbHRlcldpdGhMaW1pdChcbiAgICAgIG9wdGlvbnM6IEZ1bGxPcHRpb248Tz5bXSxcbiAgICAgIHJlbWFpbmluZzogbnVtYmVyLFxuICAgICk6IERpc3BsYXlMaW1pdE9wdGlvbnMge1xuICAgICAgbGV0IGxlZnQgPSByZW1haW5pbmc7XG4gICAgICBjb25zdCB2aXNpYmxlT3B0aW9uczogRnVsbE9wdGlvbjxPPltdID0gW107XG4gICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XG4gICAgICAgIGlmIChsZWZ0IDw9IDApIGJyZWFrO1xuXG4gICAgICAgIGlmIChvcHRpb24uZXhwYW5kZWQgJiYgb3B0aW9uLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBbY2hpbGRPcHRpb25zLCBjaGlsZFJlbWFpbmluZ10gPSBmaWx0ZXJXaXRoTGltaXQoXG4gICAgICAgICAgICBvcHRpb24uY2hpbGRyZW4sXG4gICAgICAgICAgICBsZWZ0IC0gMSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHZpc2libGVPcHRpb25zLnB1c2goe1xuICAgICAgICAgICAgLi4ub3B0aW9uLFxuICAgICAgICAgICAgY2hpbGRyZW46IGNoaWxkT3B0aW9ucyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBsZWZ0ID0gY2hpbGRSZW1haW5pbmc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmlzaWJsZU9wdGlvbnMucHVzaChvcHRpb24pO1xuICAgICAgICAgIGxlZnQtLTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIFt2aXNpYmxlT3B0aW9ucywgbGVmdF07XG4gICAgfVxuXG4gICAgdHlwZSBEaXNwbGF5TGltaXRHcm91cHMgPSBbRnVsbE9wdGlvbkdyb3VwPE8+W10sIG51bWJlcl07XG4gICAgY29uc3Qgc3RhcnRpbmdWYWx1ZTogRGlzcGxheUxpbWl0R3JvdXBzID0gW1tdLCBkaXNwbGF5TGltaXRdO1xuICAgIGNvbnN0IFtyZXNvbHZlZEdyb3Vwc10gPSBvcHRpb25Hcm91cHMucmVkdWNlPERpc3BsYXlMaW1pdEdyb3Vwcz4oXG4gICAgICAoW2dyb3VwcywgcmVtYWluaW5nXSwgZ3JvdXApID0+IHtcbiAgICAgICAgY29uc3QgW29wdGlvbnMsIGxlZnRBZnRlcl0gPSBmaWx0ZXJXaXRoTGltaXQoZ3JvdXAub3B0aW9ucywgcmVtYWluaW5nKTtcbiAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIFtbLi4uZ3JvdXBzLCB7IC4uLmdyb3VwLCBvcHRpb25zIH1dLCBsZWZ0QWZ0ZXJdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBbZ3JvdXBzLCByZW1haW5pbmddO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc3RhcnRpbmdWYWx1ZSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHJlc29sdmVkR3JvdXBzO1xuICB9XG5cbiAgLypcbiAgICBTb3J0IG9wdGlvbnMgc28gdGhhdCBwcmV2aW91c2x5IHNlbGVjdGVkIG9wdGlvbnMgKGZyb20gcHJpb3Igc2Vzc2lvbnMpXG4gICAgYXBwZWFyIGF0IHRoZSB0b3Agb2YgdGhlaXIgcGVlci9zaWJsaW5nIGxpc3RzLlxuICAqL1xuICBmdW5jdGlvbiBzb3J0T3B0aW9uc0J5UHJldmlvdXNseVNlbGVjdGVkU3RhdGU8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIG9wdGlvbkdyb3VwczogRnVsbE9wdGlvbkdyb3VwPE8+W10sXG4gICAgc2VsZWN0aW9uQXRPcGVuOiBPcHRpb25TZXQ8Tz4sXG4gICk6IEZ1bGxPcHRpb25Hcm91cDxPPltdIHtcbiAgICBmdW5jdGlvbiBzb3J0T3B0aW9ucyhvcHRpb25zOiBGdWxsT3B0aW9uPE8+W10pOiBGdWxsT3B0aW9uPE8+W10ge1xuICAgICAgcmV0dXJuIHNvcnRCeShvcHRpb25zLCBvcHRpb24gPT4gIXNlbGVjdGlvbkF0T3Blbi5oYXMob3B0aW9uKSkubWFwKFxuICAgICAgICBvcHRpb24gPT4ge1xuICAgICAgICAgIGlmIChvcHRpb24uY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLm9wdGlvbixcbiAgICAgICAgICAgICAgY2hpbGRyZW46IHNvcnRPcHRpb25zKG9wdGlvbi5jaGlsZHJlbiksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSByZXR1cm4gb3B0aW9uO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9uR3JvdXBzLm1hcChncm91cCA9PiAoe1xuICAgICAgLi4uZ3JvdXAsXG4gICAgICBvcHRpb25zOiBzb3J0T3B0aW9ucyhncm91cC5vcHRpb25zKSxcbiAgICB9KSk7XG4gIH1cblxuICAvKlxuICAgIElmIHdlIGFyZSByZXN0cmljdGluZyBob3cgbWFueSBvcHRpb25zIGFyZSBzZWxlY3RlZCB0byBhIHNwZWNpZmljIGxpbWl0LFxuICAgICAgd2hlbiB3ZSBhcmUgYXQgdGhhdCBsaW1pdCwgZGlzYWJsZSBhbGwgb3B0aW9ucyBub3QgY3VycmVudGx5IHNlbGVjdGVkLlxuICAqL1xuICBmdW5jdGlvbiBhcHBseVNlbGVjdGVkT3B0aW9uTGltaXQ8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHN0YXRlOiBDb3JlU3RhdGU8Tz4sXG4gICAgb3B0aW9uR3JvdXBzOiBGdWxsT3B0aW9uR3JvdXA8Tz5bXSxcbiAgICB0b3BMZXZlbE9wdGlvbnM6IEZ1bGxPcHRpb248Tz5bXSxcbiAgICBvcHRpb25zPzogTWFuYWdlck9wdGlvbnM8Tz4sXG4gICk6IEZ1bGxPcHRpb25Hcm91cDxPPltdIHtcbiAgICBpZiAob3B0aW9ucz8uc2VsZWN0ZWRPcHRpb25MaW1pdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gb3B0aW9uR3JvdXBzO1xuICAgIH1cblxuICAgIC8vIFdoZW4gdXNlVG9wTGV2ZWxPcHRpb25zRm9yRGlzcGxheSBpcyB0cnVlIGFuZCBzZWFyY2ggaXMgYWN0aXZlLCBjb3VudFxuICAgIC8vIHNlbGVjdGVkIHRvcC1sZXZlbCBvcHRpb25zIGZyb20gdGhlIG9yaWdpbmFsICh1bmZpbHRlcmVkKSBkYXRhIHRvIGVuc3VyZVxuICAgIC8vIGFscmVhZHktc2VsZWN0ZWQgb3B0aW9ucyB0aGF0IGRvbid0IG1hdGNoIHRoZSBzZWFyY2ggYXJlIHN0aWxsIGNvdW50ZWQuXG4gICAgY29uc3QgdXNlT3JpZ2luYWxGb3JDb3VudGluZyA9XG4gICAgICBvcHRpb25zPy51c2VUb3BMZXZlbE9wdGlvbnNGb3JEaXNwbGF5ICYmXG4gICAgICBzdGF0ZS5xdWVyeS5zZWFyY2ggJiZcbiAgICAgIHN0YXRlLm9yaWdpbmFsT3B0aW9uR3JvdXBzLmxlbmd0aCA+IDA7XG5cbiAgICBjb25zdCB0b3BPcHRpb25zRm9yQ291bnRpbmcgPSB1c2VPcmlnaW5hbEZvckNvdW50aW5nXG4gICAgICA/IGdldFRvcExldmVsT3B0aW9ucyhzdGF0ZS5vcmlnaW5hbE9wdGlvbkdyb3VwcykubWFwKG9wdGlvbiA9PlxuICAgICAgICAgIGF1Z21lbnRPcHRpb25Ub0Z1bGxPcHRpb24oc3RhdGUsIG9wdGlvbiwgb3B0aW9ucyksXG4gICAgICAgIClcbiAgICAgIDogdG9wTGV2ZWxPcHRpb25zO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRPckluZGV0ZXJtaW5hdGVUb3BPcHRpb25zID0gdG9wT3B0aW9uc0ZvckNvdW50aW5nLmZpbHRlcihcbiAgICAgIG9wdGlvbiA9PiBvcHRpb24uc2VsZWN0ZWQgIT0gZmFsc2UsXG4gICAgKTtcbiAgICBjb25zdCBudW1TZWxlY3RlZE9wdGlvbnM6IG51bWJlciA9IG9wdGlvbnM/LnVzZVRvcExldmVsT3B0aW9uc0ZvckRpc3BsYXlcbiAgICAgID8gc2VsZWN0ZWRPckluZGV0ZXJtaW5hdGVUb3BPcHRpb25zLmxlbmd0aFxuICAgICAgOiBzdGF0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQuc2l6ZTtcblxuICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uTGltaXQ6IG51bWJlciA9IG9wdGlvbnMuc2VsZWN0ZWRPcHRpb25MaW1pdDtcblxuICAgIC8vIElmIHdlIGhhdmUgbGVzcyBpdGVtcyBzZWxlY3RlZCB0aGFuIHRoZSBsaW1pdCwgYnVzaW5lc3MgYXMgdXN1YWwuXG4gICAgaWYgKG51bVNlbGVjdGVkT3B0aW9ucyA8IHNlbGVjdGVkT3B0aW9uTGltaXQpIHtcbiAgICAgIHJldHVybiBvcHRpb25Hcm91cHM7XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgaGF2ZSBlcXVhbCBpdGVtcyBzZWxlY3RlZCB0byB0aGUgbGltaXQgKG9yIG1vcmUpLCBwcmV2ZW50IHVzZXJzIGZyb20gc2VsZWN0aW5nIG1vcmUgb3B0aW9ucy5cbiAgICBmdW5jdGlvbiBkaXNhYmxlVW5zZWxlY3RlZEl0ZW1zKFxuICAgICAgY3VycmVudE9wdGlvbnM6IEZ1bGxPcHRpb248Tz5bXSxcbiAgICAgIG9wdGlvbnNBcmVDaGlsZHJlbk9mU2VsZWN0ZWRHcm91cDogYm9vbGVhbixcbiAgICApOiBGdWxsT3B0aW9uPE8+W10ge1xuICAgICAgY29uc3QgdXBkYXRlZEl0ZW1zOiBGdWxsT3B0aW9uPE8+W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIGN1cnJlbnRPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGlzRGlzYWJsZWRPclVuc2VsZWN0ZWQ6IGJvb2xlYW4gPVxuICAgICAgICAgICEhb3B0aW9uLmRpc2FibGVkIHx8IChvcHRpb24uc2VsZWN0YWJsZSAmJiBvcHRpb24uc2VsZWN0ZWQgPT0gZmFsc2UpO1xuXG4gICAgICAgIGNvbnN0IGlzQ3VycmVudE9wdGlvblNlbGVjdGVkOiBib29sZWFuID1cbiAgICAgICAgICBvcHRpb24uc2VsZWN0YWJsZSAmJiBvcHRpb24uc2VsZWN0ZWQgIT0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGlzQ3VycmVudE9yUGFyZW50T3B0aW9uU2VsZWN0ZWQ6IGJvb2xlYW4gPVxuICAgICAgICAgIGlzQ3VycmVudE9wdGlvblNlbGVjdGVkIHx8IG9wdGlvbnNBcmVDaGlsZHJlbk9mU2VsZWN0ZWRHcm91cDtcblxuICAgICAgICBjb25zdCBmb3JjZUVuYWJsZWRCYXNlZE9uUGFyZW50OiBib29sZWFuID1cbiAgICAgICAgICAhIW9wdGlvbnM/LnVzZVRvcExldmVsT3B0aW9uc0ZvckRpc3BsYXkgJiZcbiAgICAgICAgICBvcHRpb25zQXJlQ2hpbGRyZW5PZlNlbGVjdGVkR3JvdXA7XG4gICAgICAgIGNvbnN0IG1hcmtEaXNhYmxlZDogYm9vbGVhbiA9XG4gICAgICAgICAgaXNEaXNhYmxlZE9yVW5zZWxlY3RlZCAmJiAhZm9yY2VFbmFibGVkQmFzZWRPblBhcmVudDtcblxuICAgICAgICBpZiAob3B0aW9uLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBjaGlsZE9wdGlvbnMgPSBkaXNhYmxlVW5zZWxlY3RlZEl0ZW1zKFxuICAgICAgICAgICAgb3B0aW9uLmNoaWxkcmVuLFxuICAgICAgICAgICAgaXNDdXJyZW50T3JQYXJlbnRPcHRpb25TZWxlY3RlZCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHVwZGF0ZWRJdGVtcy5wdXNoKHtcbiAgICAgICAgICAgIC4uLm9wdGlvbixcbiAgICAgICAgICAgIGRpc2FibGVkOiAhIW1hcmtEaXNhYmxlZCxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBjaGlsZE9wdGlvbnMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdXBkYXRlZEl0ZW1zLnB1c2goe1xuICAgICAgICAgICAgLi4ub3B0aW9uLFxuICAgICAgICAgICAgZGlzYWJsZWQ6ICEhbWFya0Rpc2FibGVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdXBkYXRlZEl0ZW1zO1xuICAgIH1cblxuICAgIGNvbnN0IGdyb3Vwc0FmdGVyTGltaXQ6IEZ1bGxPcHRpb25Hcm91cDxPPltdID0gW107XG4gICAgZm9yIChjb25zdCBjdXJyZW50R3JvdXAgb2Ygb3B0aW9uR3JvdXBzKSB7XG4gICAgICBncm91cHNBZnRlckxpbWl0LnB1c2goe1xuICAgICAgICAuLi5jdXJyZW50R3JvdXAsXG4gICAgICAgIG9wdGlvbnM6IGRpc2FibGVVbnNlbGVjdGVkSXRlbXMoY3VycmVudEdyb3VwLm9wdGlvbnMsIGZhbHNlKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBncm91cHNBZnRlckxpbWl0O1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UmVsYXRpb25zaGlwTWFwczxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgb3B0aW9uczogT3B0aW9uPE8+W10sXG4gICk6IFtNYXA8T1snaWQnXSwgT1snaWQnXT4sIE1hcDxPWydpZCddLCBPWydpZCddW10+XSB7XG4gICAgY29uc3QgcGFyZW50cyA9IG5ldyBNYXAoKTtcbiAgICBmdW5jdGlvbiBidWlsZFBhcmVudHNNYXAob3B0aW9uczogT3B0aW9uPE8+W10sIHBhcmVudD86IE9wdGlvbjxPPik6IHZvaWQge1xuICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgcGFyZW50cy5zZXQob3B0aW9uLmlkLCBwYXJlbnQuaWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb24uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICAgIGJ1aWxkUGFyZW50c01hcChvcHRpb24uY2hpbGRyZW4sIG9wdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgYnVpbGRQYXJlbnRzTWFwKG9wdGlvbnMpO1xuXG4gICAgY29uc3QgY2hpbGRyZW4gPSBuZXcgTWFwKCk7XG4gICAgZnVuY3Rpb24gYnVpbGRDaGlsZHJlbk1hcChvcHRpb25zOiBPcHRpb248Tz5bXSk6IHZvaWQge1xuICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9uLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgICBjaGlsZHJlbi5zZXQoXG4gICAgICAgICAgICBvcHRpb24uaWQsXG4gICAgICAgICAgICBvcHRpb24uY2hpbGRyZW4ubWFwKCh7IGlkIH0pID0+IGlkKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGJ1aWxkQ2hpbGRyZW5NYXAob3B0aW9uLmNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBidWlsZENoaWxkcmVuTWFwKG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIFtwYXJlbnRzLCBjaGlsZHJlbl07XG4gIH1cblxuICBmdW5jdGlvbiBnZXRUb3BMZXZlbE9wdGlvbnM8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIG9wdGlvbkdyb3VwczogRnVsbE9wdGlvbkdyb3VwPE8+W10sXG4gICk6IEZ1bGxPcHRpb248Tz5bXTtcbiAgZnVuY3Rpb24gZ2V0VG9wTGV2ZWxPcHRpb25zPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBvcHRpb25Hcm91cHM6IFNvdXJjZU9wdGlvbkdyb3VwPE8+W10sXG4gICk6IFNvdXJjZU9wdGlvbjxPPltdO1xuICBmdW5jdGlvbiBnZXRUb3BMZXZlbE9wdGlvbnM8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIG9wdGlvbkdyb3VwczogT3B0aW9uR3JvdXA8Tz5bXSxcbiAgKTogT3B0aW9uPE8+W107XG4gIGZ1bmN0aW9uIGdldFRvcExldmVsT3B0aW9uczxcbiAgICBPIGV4dGVuZHMgQmFzZU9wdGlvbixcbiAgICBHIGV4dGVuZHMgeyBvcHRpb25zOiByZWFkb25seSBUW10gfSxcbiAgICBUID0gRyBleHRlbmRzIEZ1bGxPcHRpb25Hcm91cDxPPlxuICAgICAgPyBGdWxsT3B0aW9uPE8+XG4gICAgICA6IEcgZXh0ZW5kcyBTb3VyY2VPcHRpb25Hcm91cDxPPlxuICAgICAgPyBTb3VyY2VPcHRpb248Tz5cbiAgICAgIDogT3B0aW9uPE8+LFxuICA+KG9wdGlvbkdyb3VwczogR1tdKTogVFtdIHtcbiAgICByZXR1cm4gb3B0aW9uR3JvdXBzLnJlZHVjZTxUW10+KFxuICAgICAgKG9wdGlvbnMsIGdyb3VwKSA9PiBbLi4ub3B0aW9ucywgLi4uZ3JvdXAub3B0aW9uc10sXG4gICAgICBbXSxcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UGFyZW50TXVsdGlTZWxlY3Rpb25TdGF0ZTxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgY2hpbGRyZW46IEZ1bGxPcHRpb248Tz5bXSxcbiAgKTogTXVsdGlTZWxlY3Rpb25TdGF0ZSB7XG4gICAgaWYgKGNoaWxkcmVuLmV2ZXJ5KGNoaWxkID0+IGNoaWxkLnNlbGVjdGVkID09PSB0cnVlKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGNoaWxkcmVuLmV2ZXJ5KGNoaWxkID0+IGNoaWxkLnNlbGVjdGVkID09PSBmYWxzZSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gJ2luZGV0ZXJtaW5hdGUnO1xuICB9XG5cbiAgZnVuY3Rpb24gYXVnbWVudE9wdGlvblRvRnVsbE9wdGlvbjxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgc3RhdGU6IENvcmVTdGF0ZTxPPixcbiAgICBvcHRpb246IFNvdXJjZU9wdGlvbjxPPixcbiAgICBtYW5hZ2VyT3B0aW9ucz86IE1hbmFnZXJPcHRpb25zPE8+LFxuICApOiBGdWxsT3B0aW9uPE8+IHtcbiAgICBpZiAob3B0aW9uLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGF1Z21lbnRlZENoaWxkcmVuID0gb3B0aW9uLmNoaWxkcmVuLm1hcChjaGlsZCA9PlxuICAgICAgICBhdWdtZW50T3B0aW9uVG9GdWxsT3B0aW9uKHN0YXRlLCBjaGlsZCwgbWFuYWdlck9wdGlvbnMpLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNlbGVjdGFibGVXaGVuU2VhcmNoaW5nID1cbiAgICAgICAgbWFuYWdlck9wdGlvbnM/LmFsbG93U2VsZWN0Tm9uTGVhZkR1cmluZ1NlYXJjaCA/PyBmYWxzZTtcblxuICAgICAgLy8gV2hlbiBhbGxvd1NlbGVjdE5vbkxlYWZEdXJpbmdTZWFyY2ggaXMgZW5hYmxlZCBhbmQgc2VhcmNoIGlzIGFjdGl2ZSxcbiAgICAgIC8vIGNhbGN1bGF0ZSBzZWxlY3Rpb24gc3RhdGUgZnJvbSBBTEwgb3JpZ2luYWwgY2hpbGRyZW4sIG5vdCBqdXN0IHRoZVxuICAgICAgLy8gZmlsdGVyZWQgb25lcyB2aXNpYmxlIGluIHNlYXJjaCByZXN1bHRzLlxuICAgICAgY29uc3QgdXNlT3JpZ2luYWxGb3JTZWxlY3Rpb25TdGF0ZSA9XG4gICAgICAgIG1hbmFnZXJPcHRpb25zPy5hbGxvd1NlbGVjdE5vbkxlYWZEdXJpbmdTZWFyY2ggJiZcbiAgICAgICAgc3RhdGUucXVlcnkuc2VhcmNoICYmXG4gICAgICAgIHN0YXRlLm9yaWdpbmFsT3B0aW9uR3JvdXBzLmxlbmd0aCA+IDA7XG5cbiAgICAgIGxldCBzZWxlY3RlZDogTXVsdGlTZWxlY3Rpb25TdGF0ZTtcbiAgICAgIGlmICh1c2VPcmlnaW5hbEZvclNlbGVjdGlvblN0YXRlKSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsT3B0aW9uID0gZmluZE9wdGlvbihcbiAgICAgICAgICBnZXRUb3BMZXZlbE9wdGlvbnMoc3RhdGUub3JpZ2luYWxPcHRpb25Hcm91cHMpLFxuICAgICAgICAgIG9wdGlvbi5pZCxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG9yaWdpbmFsT3B0aW9uKSB7XG4gICAgICAgICAgY29uc3QgYWxsTGVhdmVzID0gZmxhdHRlbk9wdGlvbnMoW29yaWdpbmFsT3B0aW9uXSwgdHJ1ZSk7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRDb3VudCA9IGFsbExlYXZlcy5maWx0ZXIobGVhZiA9PlxuICAgICAgICAgICAgc3RhdGUuc2VsZWN0aW9uLnNlbGVjdGVkLmhhcyhsZWFmKSxcbiAgICAgICAgICApLmxlbmd0aDtcbiAgICAgICAgICBpZiAoc2VsZWN0ZWRDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkQ291bnQgPT09IGFsbExlYXZlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZWN0ZWQgPSAnaW5kZXRlcm1pbmF0ZSc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGVjdGVkID0gZ2V0UGFyZW50TXVsdGlTZWxlY3Rpb25TdGF0ZShhdWdtZW50ZWRDaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGVjdGVkID0gZ2V0UGFyZW50TXVsdGlTZWxlY3Rpb25TdGF0ZShhdWdtZW50ZWRDaGlsZHJlbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLm9wdGlvbixcbiAgICAgICAgY2hpbGRyZW46IGF1Z21lbnRlZENoaWxkcmVuLFxuICAgICAgICBzZWxlY3RlZCxcbiAgICAgICAgZXhwYW5kZWQ6IHN0YXRlLnF1ZXJ5LnNlYXJjaFxuICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgIDogc3RhdGUuZGlzcGxheS5leHBhbmRlZE9wdGlvbnMuaGFzKG9wdGlvbi5pZCksXG4gICAgICAgIHNlbGVjdGFibGU6ICFzdGF0ZS5xdWVyeS5zZWFyY2ggfHwgc2VsZWN0YWJsZVdoZW5TZWFyY2hpbmcsXG4gICAgICAgIGV4cGFuZGFibGU6ICFzdGF0ZS5xdWVyeS5zZWFyY2gsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgLi4ub3B0aW9uLFxuICAgICAgY2hpbGRyZW46IHVuZGVmaW5lZCxcbiAgICAgIHNlbGVjdGVkOiBzdGF0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQuaGFzKG9wdGlvbiksXG4gICAgICBleHBhbmRlZDogZmFsc2UsXG4gICAgICBzZWxlY3RhYmxlOiB0cnVlLFxuICAgICAgZXhwYW5kYWJsZTogZmFsc2UsXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEZvcm1hdHRlZE9wdGlvbnNGb3JEaXNwbGF5PE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPE8+LFxuICAgIHRvcExldmVsT3B0aW9uczogRnVsbE9wdGlvbjxPPltdLFxuICAgIG9wdGlvbnM/OiBNYW5hZ2VyT3B0aW9uczxPPixcbiAgKTogc3RyaW5nIHtcbiAgICAvLyBJZiB3ZSBoYXZlIGEgY3VzdG9tIGRpc3BsYXkgZnVuY3Rpb24sIHVzZSBpdFxuICAgIGlmIChvcHRpb25zPy5nZXRDdXN0b21PcHRpb25EaXNwbGF5KSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5nZXRDdXN0b21PcHRpb25EaXNwbGF5KFsuLi5zdGF0ZS5zZWxlY3Rpb24uc2VsZWN0ZWRdKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnM/LnVzZVRvcExldmVsT3B0aW9uc0ZvckRpc3BsYXkpIHtcbiAgICAgIHJldHVybiBnZXRUb3BMZXZlbEZvcm1hdHRlZE9wdGlvbnNGb3JEaXNwbGF5KHRvcExldmVsT3B0aW9ucyk7XG4gICAgfVxuICAgIC8vIE90aGVyd2lzZSwgdXNlIHRoZSBkZWZhdWx0IGRpc3BsYXkgZm9yIG9wdGlvbnMgLSB0aXRsZXMgc2VwYXJhdGVkIGJ5IGNvbW1hcy5cbiAgICByZXR1cm4gWy4uLnN0YXRlLnNlbGVjdGlvbi5zZWxlY3RlZF0ubWFwKCh7IHRpdGxlIH0pID0+IHRpdGxlKS5qb2luKCcsICcpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0VG9wTGV2ZWxGb3JtYXR0ZWRPcHRpb25zRm9yRGlzcGxheTxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgdG9wTGV2ZWxPcHRpb25zOiBGdWxsT3B0aW9uPE8+W10sXG4gICk6IHN0cmluZyB7XG4gICAgaWYgKCF0b3BMZXZlbE9wdGlvbnMgfHwgdG9wTGV2ZWxPcHRpb25zLmxlbmd0aCA9PSAwKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdGVkT3JJbmRldGVybWluYXRlVG9wT3B0aW9ucyA9IHRvcExldmVsT3B0aW9ucy5maWx0ZXIoXG4gICAgICBvcHRpb24gPT4gb3B0aW9uLnNlbGVjdGVkICE9IGZhbHNlLFxuICAgICk7XG4gICAgcmV0dXJuIHNlbGVjdGVkT3JJbmRldGVybWluYXRlVG9wT3B0aW9uc1xuICAgICAgLm1hcCgoeyB0aXRsZSB9KSA9PiB0aXRsZSlcbiAgICAgIC5qb2luKCcsICcpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UGlsbENvdW50Rm9yRGlzcGxheTxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgc3RhdGU6IENvcmVTdGF0ZTxPPixcbiAgICB0b3BMZXZlbE9wdGlvbnM6IEZ1bGxPcHRpb248Tz5bXSxcbiAgICBvcHRpb25zPzogTWFuYWdlck9wdGlvbnM8Tz4sXG4gICk6IG51bWJlciB7XG4gICAgaWYgKG9wdGlvbnM/LnVzZVRvcExldmVsT3B0aW9uc0ZvckRpc3BsYXkpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkT3JJbmRldGVybWluYXRlVG9wT3B0aW9ucyA9IHRvcExldmVsT3B0aW9ucy5maWx0ZXIoXG4gICAgICAgIG9wdGlvbiA9PiBvcHRpb24uc2VsZWN0ZWQgIT0gZmFsc2UsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHNlbGVjdGVkT3JJbmRldGVybWluYXRlVG9wT3B0aW9ucy5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQuc2l6ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFplcm9TdGF0ZU1lc3NhZ2U8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHN0YXRlOiBDb3JlU3RhdGU8Tz4sXG4gICk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmIChzdGF0ZS5zb3VyY2VPcHRpb25Hcm91cHMuZXZlcnkoZ3JvdXAgPT4gZ3JvdXAub3B0aW9ucy5sZW5ndGggPT09IDApKSB7XG4gICAgICBpZiAoc3RhdGUucXVlcnkuc2VhcmNoKSByZXR1cm4gJ05vIHJlc3VsdHMgZm91bmQuJztcbiAgICAgIHJldHVybiAnTm8gb3B0aW9ucy4nO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmRPcHRpb248TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIG9wdGlvbnM6IFNvdXJjZU9wdGlvbjxPPltdLFxuICAgIGlkOiBPWydpZCddLFxuICApOiBTb3VyY2VPcHRpb248Tz4gfCBudWxsIHtcbiAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XG4gICAgICBpZiAob3B0aW9uLmlkID09PSBpZCkgcmV0dXJuIG9wdGlvbjtcbiAgICAgIGlmIChvcHRpb24uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICBjb25zdCBjaGlsZCA9IGZpbmRPcHRpb24ob3B0aW9uLmNoaWxkcmVuLCBpZCk7XG4gICAgICAgIGlmIChjaGlsZCkgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZsYXR0ZW5PcHRpb25zPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBvcHRpb25zOiBPcHRpb248Tz5bXSxcbiAgICBsZWFmT25seTogYm9vbGVhbixcbiAgKTogT1tdIHtcbiAgICByZXR1cm4gZmxhdHRlbkRlZXAoXG4gICAgICBvcHRpb25zLm1hcChvcHRpb24gPT4ge1xuICAgICAgICBpZiAob3B0aW9uLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBkZXNjZW5kYW50cyA9IG9wdGlvbi5jaGlsZHJlbi5tYXAoY2hpbGQgPT5cbiAgICAgICAgICAgIGZsYXR0ZW5PcHRpb25zKFtjaGlsZF0sIGxlYWZPbmx5KSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBsZWFmT25seSA/IGRlc2NlbmRhbnRzIDogW29wdGlvbiwgLi4uZGVzY2VuZGFudHNdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBbb3B0aW9uXTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvZ2dsZVNlbGVjdGVkPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPE8+LFxuICAgIGlkOiBPWydpZCddLFxuICAgIG1hbmFnZXJPcHRpb25zPzogTWFuYWdlck9wdGlvbnM8Tz4sXG4gICk6IENvcmVTdGF0ZTxPPiB7XG4gICAgY29uc3QgdG9wTGV2ZWxPcHRpb25zID0gZ2V0VG9wTGV2ZWxPcHRpb25zKHN0YXRlLnNvdXJjZU9wdGlvbkdyb3Vwcyk7XG4gICAgY29uc3Qgb3B0aW9uID0gZmluZE9wdGlvbih0b3BMZXZlbE9wdGlvbnMsIGlkKTtcbiAgICBpZiAoIW9wdGlvbikgcmV0dXJuIHN0YXRlO1xuXG4gICAgY29uc3QgbmV3U2VsZWN0aW9uID0gbmV3IE9wdGlvblNldChzdGF0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQpO1xuXG4gICAgY29uc3QgbmV3VmFsdWUgPSAhKFxuICAgICAgYXVnbWVudE9wdGlvblRvRnVsbE9wdGlvbihzdGF0ZSwgb3B0aW9uLCBtYW5hZ2VyT3B0aW9ucykuc2VsZWN0ZWQgPT09IHRydWVcbiAgICApO1xuXG4gICAgLy8gV2hlbiBhbGxvd1NlbGVjdE5vbkxlYWZEdXJpbmdTZWFyY2ggaXMgZW5hYmxlZCBhbmQgc2VhcmNoIGlzIGFjdGl2ZSxcbiAgICAvLyB1c2UgdGhlIG9yaWdpbmFsICh1bmZpbHRlcmVkKSBkYXRhIHRvIGdldCBhbGwgY2hpbGRyZW4sIG5vdCBqdXN0XG4gICAgLy8gdGhvc2UgdmlzaWJsZSBpbiB0aGUgZmlsdGVyZWQgc2VhcmNoIHJlc3VsdHMuXG4gICAgY29uc3QgdXNlT3JpZ2luYWxEYXRhID1cbiAgICAgIG1hbmFnZXJPcHRpb25zPy5hbGxvd1NlbGVjdE5vbkxlYWZEdXJpbmdTZWFyY2ggJiZcbiAgICAgIHN0YXRlLnF1ZXJ5LnNlYXJjaCAmJlxuICAgICAgc3RhdGUub3JpZ2luYWxPcHRpb25Hcm91cHMubGVuZ3RoID4gMDtcblxuICAgIGNvbnN0IG9wdGlvbkZvckxlYXZlcyA9IHVzZU9yaWdpbmFsRGF0YVxuICAgICAgPyBmaW5kT3B0aW9uKGdldFRvcExldmVsT3B0aW9ucyhzdGF0ZS5vcmlnaW5hbE9wdGlvbkdyb3VwcyksIGlkKSA/PyBvcHRpb25cbiAgICAgIDogb3B0aW9uO1xuXG4gICAgY29uc3QgbGVhdmVzID0gZmxhdHRlbk9wdGlvbnMoW29wdGlvbkZvckxlYXZlc10sIHRydWUpO1xuICAgIGZvciAoY29uc3QgbGVhZiBvZiBsZWF2ZXMpIHtcbiAgICAgIGlmIChuZXdWYWx1ZSkge1xuICAgICAgICBuZXdTZWxlY3Rpb24uYWRkKGxlYWYpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3U2VsZWN0aW9uLmRlbGV0ZShsZWFmKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgc2VsZWN0ZWQ6IG5ld1NlbGVjdGlvbixcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFNlbGVjdGVkT3B0aW9uPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPE8+LFxuICAgIGlkOiBPWydpZCddLFxuICApOiBDb3JlU3RhdGU8Tz4ge1xuICAgIGNvbnN0IHRvcExldmVsT3B0aW9ucyA9IGdldFRvcExldmVsT3B0aW9ucyhzdGF0ZS5zb3VyY2VPcHRpb25Hcm91cHMpO1xuICAgIGNvbnN0IG9wdGlvbiA9IGZpbmRPcHRpb24odG9wTGV2ZWxPcHRpb25zLCBpZCk7XG4gICAgaWYgKCFvcHRpb24pIHJldHVybiBzdGF0ZTtcblxuICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IG5ldyBPcHRpb25TZXQ8Tz4oKTtcbiAgICBuZXdTZWxlY3Rpb24uYWRkKG9wdGlvbik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgc2VsZWN0ZWQ6IG5ld1NlbGVjdGlvbixcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvZ2dsZVZpc2libGVTZWxlY3RlZDxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgc3RhdGU6IENvcmVTdGF0ZTxPPixcbiAgKTogQ29yZVN0YXRlPE8+IHtcbiAgICBjb25zdCBsZWF2ZXMgPSBmbGF0dGVuT3B0aW9ucyhcbiAgICAgIGdldFRvcExldmVsT3B0aW9ucyhzdGF0ZS5zb3VyY2VPcHRpb25Hcm91cHMpLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICAgIGNvbnN0IGlzQWxsU2VsZWN0ZWQgPSBsZWF2ZXMuZXZlcnkobGVhZiA9PlxuICAgICAgc3RhdGUuc2VsZWN0aW9uLnNlbGVjdGVkLmhhcyhsZWFmKSxcbiAgICApO1xuICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IG5ldyBPcHRpb25TZXQoc3RhdGUuc2VsZWN0aW9uLnNlbGVjdGVkKTtcblxuICAgIGZvciAoY29uc3QgbGVhZiBvZiBsZWF2ZXMpIHtcbiAgICAgIGlmIChpc0FsbFNlbGVjdGVkKSBuZXdTZWxlY3Rpb24uZGVsZXRlKGxlYWYpO1xuICAgICAgZWxzZSBuZXdTZWxlY3Rpb24uYWRkKGxlYWYpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIHNlbGVjdGlvbjoge1xuICAgICAgICAuLi5zdGF0ZS5zZWxlY3Rpb24sXG4gICAgICAgIHNlbGVjdGVkOiBuZXdTZWxlY3Rpb24sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiB0b2dnbGVPcHRpb25FeHBhbmRlZDxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgc3RhdGU6IENvcmVTdGF0ZTxPPixcbiAgICBpZDogT1snaWQnXSxcbiAgKTogQ29yZVN0YXRlPE8+IHtcbiAgICBjb25zdCBuZXdWYWx1ZSA9ICFzdGF0ZS5kaXNwbGF5LmV4cGFuZGVkT3B0aW9ucy5oYXMoaWQpO1xuICAgIGNvbnN0IG5ld0V4cGFuZGVkT3B0aW9ucyA9IG5ldyBTZXQoc3RhdGUuZGlzcGxheS5leHBhbmRlZE9wdGlvbnMpO1xuICAgIGlmIChuZXdWYWx1ZSkgbmV3RXhwYW5kZWRPcHRpb25zLmFkZChpZCk7XG4gICAgZWxzZSBuZXdFeHBhbmRlZE9wdGlvbnMuZGVsZXRlKGlkKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBkaXNwbGF5OiB7XG4gICAgICAgIC4uLnN0YXRlLmRpc3BsYXksXG4gICAgICAgIGV4cGFuZGVkT3B0aW9uczogbmV3RXhwYW5kZWRPcHRpb25zLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gc2lkZUVmZmVjdHM8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHN0YXRlOiBDb3JlU3RhdGU8Tz4sXG4gICAgYWN0aW9uOiBBY3Rpb248Tz4gfCBJbnRlcm5hbEFjdGlvbjxPPixcbiAgICBzb3VyY2U6IFNvdXJjZTxPPixcbiAgICBpbnRlcm5hbEFjdGlvbnM6IFN1YmplY3Q8SW50ZXJuYWxBY3Rpb248Tz4+LFxuICApOiBDb3JlU3RhdGU8Tz4ge1xuICAgIGlmIChcbiAgICAgIGFjdGlvbi50eXBlID09PSAnbG9hZCcgfHxcbiAgICAgIGFjdGlvbi50eXBlID09PSAnc2VhcmNoQ2hhbmdlJyB8fFxuICAgICAgYWN0aW9uLnR5cGUgPT09ICdvcmRlckNoYW5nZScgfHxcbiAgICAgIChhY3Rpb24udHlwZSA9PT0gJ29wZW5DaGFuZ2UnICYmIGFjdGlvbi5vcGVuKVxuICAgICkge1xuICAgICAgc291cmNlKHN0YXRlLnF1ZXJ5LCBhY3Rpb24pXG4gICAgICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IHJlc3VsdC5kYXRhO1xuICAgICAgICAgIGNvbnN0IG9yaWdpbmFsRGF0YSA9IEFycmF5LmlzQXJyYXkocmVzdWx0KVxuICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgIDogcmVzdWx0Lm9yaWdpbmFsRGF0YTtcbiAgICAgICAgICBpbnRlcm5hbEFjdGlvbnMubmV4dCh7IHR5cGU6ICdsb2FkQ29tcGxldGUnLCBkYXRhLCBvcmlnaW5hbERhdGEgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICBpbnRlcm5hbEFjdGlvbnMubmV4dCh7IHR5cGU6ICdsb2FkRXJyb3InLCBlcnJvciB9KTtcbiAgICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgbG9hZDoge1xuICAgICAgICAgIGxvYWRpbmc6IHRydWUsXG4gICAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBmdW5jdGlvbiByZWR1Y2U8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHN0YXRlOiBDb3JlU3RhdGU8Tz4sXG4gICAgYWN0aW9uOiBBY3Rpb248Tz4gfCBJbnRlcm5hbEFjdGlvbjxPPixcbiAgICBtYW5hZ2VyT3B0aW9ucz86IE1hbmFnZXJPcHRpb25zPE8+LFxuICApOiBDb3JlU3RhdGU8Tz4ge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2xvYWQnOlxuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICBjYXNlICdsb2FkQ29tcGxldGUnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIGxvYWQ6IHtcbiAgICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzb3VyY2VPcHRpb25Hcm91cHM6IGFjdGlvbi5kYXRhLFxuICAgICAgICAgIG9yaWdpbmFsT3B0aW9uR3JvdXBzOiBhY3Rpb24ub3JpZ2luYWxEYXRhID8/IFtdLFxuICAgICAgICB9O1xuICAgICAgY2FzZSAnbG9hZEVycm9yJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBsb2FkOiB7XG4gICAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiBhY3Rpb24uZXJyb3IsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ29wZW5DaGFuZ2UnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeSxcbiAgICAgICAgICAgIHNlYXJjaDogJycsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBkaXNwbGF5OiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5kaXNwbGF5LFxuICAgICAgICAgICAgb3BlbjogYWN0aW9uLm9wZW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ3NlYXJjaENoYW5nZSc6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LFxuICAgICAgICAgICAgc2VhcmNoOiBhY3Rpb24ucGF5bG9hZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgY2FzZSAnb3JkZXJDaGFuZ2UnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeSxcbiAgICAgICAgICAgIG9yZGVyOiBhY3Rpb24ucGF5bG9hZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgY2FzZSAnc2VsZWN0aW9uQ2hhbmdlJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBzZWxlY3Rpb246IGFjdGlvbi5wYXlsb2FkLFxuICAgICAgICB9O1xuICAgICAgY2FzZSAndG9nZ2xlT3B0aW9uU2VsZWN0ZWQnOlxuICAgICAgICByZXR1cm4gdG9nZ2xlU2VsZWN0ZWQoc3RhdGUsIGFjdGlvbi5pZCwgbWFuYWdlck9wdGlvbnMpO1xuICAgICAgY2FzZSAnc2V0U2VsZWN0ZWRPcHRpb24nOlxuICAgICAgICByZXR1cm4gc2V0U2VsZWN0ZWRPcHRpb24oc3RhdGUsIGFjdGlvbi5pZCk7XG4gICAgICBjYXNlICd2aXNpYmxlU2VsZWN0ZWRDaGFuZ2UnOlxuICAgICAgICByZXR1cm4gdG9nZ2xlVmlzaWJsZVNlbGVjdGVkKHN0YXRlKTtcbiAgICAgIGNhc2UgJ3RvZ2dsZU9wdGlvbkV4cGFuZGVkJzpcbiAgICAgICAgcmV0dXJuIHRvZ2dsZU9wdGlvbkV4cGFuZGVkKHN0YXRlLCBhY3Rpb24uaWQpO1xuICAgIH1cbiAgfVxufVxuIl19