@jax-data-science/sci-image-visualizer 0.2.13 → 0.2.15

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.
@@ -1359,6 +1359,9 @@ export class VisualizerComponent {
1359
1359
  mergeThreshold: def?.defaults.mergeThreshold ?? 0.3,
1360
1360
  overlapX: def?.defaults.overlapX ?? 0,
1361
1361
  overlapY: def?.defaults.overlapY ?? 0,
1362
+ // Exposed in the dialog, so it must be seeded — otherwise the scale
1363
+ // control reads as 0 and the re-crop never runs.
1364
+ downsamplingFactor: 5,
1362
1365
  withMasks: true,
1363
1366
  simplifyTolerance: 1,
1364
1367
  minArea: 0,
@@ -1756,4 +1759,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
1756
1759
  type: HostListener,
1757
1760
  args: ['window:keydown', ['$event']]
1758
1761
  }] } });
1759
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsaXplci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Zpc3VhbGl6ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vc3JjL2xpYi92aXN1YWxpemVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQWlCLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWdDLFFBQVEsRUFBRSxNQUFNLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6TSxPQUFPLEVBQW1CLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBWSxjQUFjLEVBQVksTUFBTSxhQUFhLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWxELE9BQU8sRUFBa0IsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RixPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRSxPQUFPLEVBQ0wsUUFBUSxFQUVSLFVBQVUsRUFDVix1QkFBdUIsR0FDeEIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUsYUFBYSxFQUFFLE1B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LENBQUMsQ0FBQztJQUM5QyxDQUFDOzhHQXJ3RFUsbUJBQW1CLGtCQXVRcEIsZ0JBQWdCLGFBQ2hCLFVBQVUsME9BUVYsa0JBQWtCLGdGQUdOLFVBQVU7a0dBblJyQixtQkFBbUIsMlhDdkRoQyxnaWJBK1BBOzsyRkR4TWEsbUJBQW1CO2tCQVAvQixTQUFTOytCQUdFLFlBQVk7OzBCQTJRbkIsTUFBTTsyQkFBQyxnQkFBZ0I7OzBCQUN2QixNQUFNOzJCQUFDLFVBQVU7OzBCQVFqQixNQUFNOzJCQUFDLGtCQUFrQjs7MEJBR3pCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsVUFBVTt5Q0E5T2hDLFlBQVk7c0JBRFgsTUFBTTtnQkFHUCxnQkFBZ0I7c0JBRGYsTUFBTTtnQkFNSCxZQUFZO3NCQURmLEtBQUs7Z0JBY04sUUFBUTtzQkFEUCxLQUFLO2dCQTZDVyxXQUFXO3NCQUEzQixTQUFTO3VCQUFDLElBQUk7Z0JBdzlCZixTQUFTO3NCQURSLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBBZnRlclZpZXdJbml0LCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5qZWN0LCBJbnB1dCwgTmdab25lLCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgTWVudUl0ZW0sIE1lc3NhZ2VTZXJ2aWNlLCBUcmVlTm9kZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IENvbnRleHRNZW51IH0gZnJvbSAncHJpbWVuZy9jb250ZXh0bWVudSc7XG5pbXBvcnQgeyBJSW1hZ2VJbmZvIH0gZnJvbSAnLi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuaW1wb3J0IHsgSW1hZ2VTdGF0ZVBvcnQsIElNQUdFX1NUQVRFX1BPUlQgfSBmcm9tICcuL2NvbnRyYWN0cy9wb3J0cy9pbWFnZS1zdGF0ZS5wb3J0JztcbmltcG9ydCB7IFBvbHlnb24sIFJlY3RhbmdsZSwgTXVsdGlQb2x5Z29uLCBSZWdpb24gfSBmcm9tICcuL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHsgUmVnaW9uT3BzU2VydmljZSB9IGZyb20gJy4vcmVnaW9uLW9wcy5zZXJ2aWNlJztcbmltcG9ydCB7IFZJWl9UT0FTVF9LRVksIFZJWl9BTEVSVF9UT0FTVF9LRVkgfSBmcm9tICcuL3RvYXN0LW91dGxldHMnO1xuaW1wb3J0IHsgVmlzdWFsaXplclN0b3JlIH0gZnJvbSAnLi9zdG9yZS92aXN1YWxpemVyLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVuZGVyT3JjaGVzdHJhdG9yLCBTbGljZVNjcnViYmVyIH0gZnJvbSAnLi9yZW5kZXItb3JjaGVzdHJhdG9yJztcbmltcG9ydCB7XG4gIFBsb3RUeXBlLFxuICBQbG90VHlwZURlc2NyaXB0b3IsXG4gIGlzTmFwYXJpM2QsXG4gIE5BUEFSSV9ERUZBVUxUX0RFQ0lNQVRFLFxufSBmcm9tICcuL2NvbnRyYWN0cy9wbG90LXR5cGUnO1xuaW1wb3J0IHsgVmlld2VyRmVhdHVyZSB9IGZyb20gJy4vY29udHJhY3RzL2NhcGFiaWxpdGllcy5jb250cmFjdCc7XG5pbXBvcnQgeyBJbnRlbnNpdHlQcm9maWxlLCBJVmlzdWFsaXplciwgVklTVUFMSVpFUiB9IGZyb20gJy4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHsgU0FNX01PREVMUywgZ2V0RGVmYXVsdFNhbU1vZGVsSWQsIGlzU2FtTW9kZWxSZWFkeSB9IGZyb20gJy4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLW1vZGVsLXJlZ2lzdHJ5JztcbmltcG9ydCB7IFNhbVRvb2xTZXJ2aWNlIH0gZnJvbSAnLi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFNhbVBvaW50VG9vbFNlcnZpY2UgfSBmcm9tICcuL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS1wb2ludC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2VsbFNlZ21lbnRUb29sU2VydmljZSB9IGZyb20gJy4vdG9vbGJhci9zZWdtZW50YXRpb24vY2VsbC1zZWdtZW50LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBZb2xvRGV0ZWN0VG9vbFNlcnZpY2UgfSBmcm9tICcuL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3lvbG8tZGV0ZWN0LXRvb2wuc2VydmljZSc7XG5pbXBvcnQge1xuICBZT0xPX01PREVMUyxcbiAgaXNZb2xvTW9kZWxSZWFkeSxcbiAgZ2V0RGVmYXVsdFlvbG9Nb2RlbElkLFxuICBzZXREZWZhdWx0WW9sb01vZGVsLFxufSBmcm9tICcuL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3lvbG8tbW9kZWwtcmVnaXN0cnknO1xuaW1wb3J0IHsgSU5TVEFOQ0VfU0VHTUVOVEVSIH0gZnJvbSAnLi9jb250cmFjdHMvaW5zdGFuY2Utc2VnbWVudGVyLmNvbnRyYWN0JztcbmltcG9ydCB0eXBlIHtcbiAgSUluc3RhbmNlU2VnbWVudGVyLFxuICBJbnN0YW5jZVNlZ21lbnRPcHRpb25zLFxufSBmcm9tICcuL2NvbnRyYWN0cy9pbnN0YW5jZS1zZWdtZW50ZXIuY29udHJhY3QnO1xuaW1wb3J0IHsgUmVnaW9uVG9vbE1vZGUgfSBmcm9tICcuL2NvbnRyYWN0cy9yZWdpb24tb3ZlcmxheS5jb250cmFjdCc7XG5pbXBvcnQgeyBUb29sYmFyVG9vbFZpc2liaWxpdHksIEFMTF9UT09MQkFSX1RPT0xTIH0gZnJvbSAnLi9jb250cmFjdHMvdG9vbGJhci1jb25maWcnO1xuaW1wb3J0IHsgVklaX0NPTkZJRywgVml6Q29uZmlnIH0gZnJvbSAnLi9jb250cmFjdHMvdml6LWNvbmZpZyc7XG5cbi8qKiBQZXItaW5zdGFuY2UgcGxvdC1kaXYgaWQgc291cmNlLiBUaGUgbW91bnQgZWxlbWVudCdzIGlkIG11c3QgYmUgdW5pcXVlIHNvIHR3b1xuICogIGxpdmUgdmlld2VycyAoZS5nLiB0aGUgbWFpbiBkaWFncmFtICsgYSBtb2RhbCBwcmV2aWV3KSBkb24ndCBjb2xsaWRlIG9uIHRoZVxuICogIHNhbWUgRE9NIGlkIOKAlCBgZ2V0RWxlbWVudEJ5SWRgIHdvdWxkIG90aGVyd2lzZSByZXR1cm4gd2hpY2hldmVyIGNhbWUgZmlyc3QuXG4gKiAgU3R5bGluZyBoYW5ncyBvZmYgdGhlIGAudml6LXBsb3RgIGNsYXNzIGluc3RlYWQgb2YgdGhlIGlkLiAqL1xubGV0IHBsb3RJbnN0YW5jZVNlcSA9IDA7XG5cbkBDb21wb25lbnQoe1xuICAvLyBDYW5vbmljYWwgcHJlZml4ZWQgc2VsZWN0b3IgZmlyc3Q7IHRoZSB1bnByZWZpeGVkIG9yaWdpbmFsIGlzIGtlcHQgYXMgYW5cbiAgLy8gYWxpYXMgZm9yIG9uZSByZWxlYXNlIChwcmUtcHVibGljYXRpb24gYmFjay1jb21wYXQpLlxuICBzZWxlY3RvcjogJ3Zpc3VhbGl6ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vdmlzdWFsaXplci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Zpc3VhbGl6ZXIuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVmlzdWFsaXplckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvKiogUGVyLWluc3RhbmNlIHRvYXN0IGtleS4gTWVzc2FnZVNlcnZpY2UgaXMgYSBnbG9iYWwgc2luZ2xldG9uLCBzbyB0d28gbGl2ZVxuICAgKiAgYDx2aXN1YWxpemVyPmAgaW5zdGFuY2VzIChtYWluIHZpZXdlciArIHBpcGVsaW5lLWRpYWxvZyBwcmV2aWV3KSBzaGFyaW5nXG4gICAqICBvbmUga2V5IHdvdWxkIGVhY2ggcmVuZGVyIHRoZSBzYW1lIG1lc3NhZ2Ug4oCUIGEgZHVwbGljYXRlIHRvYXN0LiBBIHVuaXF1ZVxuICAgKiAga2V5IHBlciBpbnN0YW5jZSBzY29wZXMgdGhlIHRvYXN0IHRvIHRoZSBjb21wb25lbnQgdGhhdCByYWlzZWQgaXQuICovXG4gIHByaXZhdGUgc3RhdGljIG5leHRUb2FzdElkID0gMDtcblxuICAvKipcbiAgICogVGhlIGxpYnJhcnkgYWxzbyByYWlzZXMgbm90aWNlcyBmcm9tIHBsYWNlcyB0aGF0IGhhdmUgbm8gaW5zdGFuY2Ugb2YgdGhlaXJcbiAgICogb3duIHRvIGtleSBhZ2FpbnN0OiB7QGxpbmsgUGxvdGx5U2VydmljZX0gaXMgYHByb3ZpZGVkSW46ICdyb290J2AsIGFuZCB0aGVcbiAgICogcmVnaW9uIGVkaXRvciBpcyBhIGNoaWxkIGRpYWxvZy4gVGhvc2UgdXNlIHRoZSBmaXhlZFxuICAgKiB7QGxpbmsgVklaX1RPQVNUX0tFWX0gLyB7QGxpbmsgVklaX0FMRVJUX1RPQVNUX0tFWX0gb3V0bGV0cy5cbiAgICpcbiAgICogRm9yIHRoZSBzYW1lIHJlYXNvbiB0aGUgcGVyLWluc3RhbmNlIGtleSBhYm92ZSBleGlzdHMsIGV4YWN0bHkgT05FIG1vdW50ZWRcbiAgICogdmlzdWFsaXplciBtYXkgcmVuZGVyIHRob3NlIHNoYXJlZCBvdXRsZXRzIOKAlCBvdGhlcndpc2UgYSBtZXNzYWdlIGZyb20gdGhlXG4gICAqIHJvb3Qgc2VydmljZSB3b3VsZCBiZSBzaG93biBvbmNlIHBlciBsaXZlIHZpZXdlciAoaml0LXVpIHJ1bnMgYSBtYWluIHZpZXdcbiAgICogYW5kIGEgcGlwZWxpbmUtcHJldmlldyBhdCB0aGUgc2FtZSB0aW1lKS4gVGhlIGZpcnN0IHRvIGluaXQgY2xhaW1zIHRoZW0gYW5kXG4gICAqIHJlbGVhc2VzIG9uIGRlc3Ryb3ksIHNvIHRoZSBzdXJ2aXZpbmcgdmlld2VyIHBpY2tzIHRoZW0gdXAuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBsaXZlSW5zdGFuY2VzID0gbmV3IFNldDxWaXN1YWxpemVyQ29tcG9uZW50PigpO1xuICByZWFkb25seSB2aXpUb2FzdEtleSA9IFZJWl9UT0FTVF9LRVk7XG4gIHJlYWRvbmx5IHZpekFsZXJ0VG9hc3RLZXkgPSBWSVpfQUxFUlRfVE9BU1RfS0VZO1xuICAvKipcbiAgICogV2hldGhlciB0aGlzIGluc3RhbmNlIHJlbmRlcnMgdGhlIHNoYXJlZCBvdXRsZXRzLiBUaGUgb3duZXIgaXMgc2ltcGx5IHRoZVxuICAgKiBvbGRlc3QgbGl2ZSB2aXN1YWxpemVyIOKAlCBhIGBTZXRgIGl0ZXJhdGVzIGluIGluc2VydGlvbiBvcmRlciwgc28gd2hlbiB0aGVcbiAgICogb3duZXIgaXMgZGVzdHJveWVkIHRoZSBuZXh0IG9uZSB0YWtlcyBvdmVyIG9uIGl0cyBmb2xsb3dpbmcgY2hhbmdlLWRldGVjdGlvblxuICAgKiBwYXNzLiBUcmFja2luZyBhIHNldCByYXRoZXIgdGhhbiBhIHNpbmdsZSBvd25lciBtYXR0ZXJzOiB3aXRoIGEgbG9uZVxuICAgKiBgb3duZXJgIHJlZmVyZW5jZSwgdGVhcmluZyBkb3duIHRoZSBvd25lciB3aGlsZSBhIHNpYmxpbmcgd2FzIGFscmVhZHlcbiAgICogaW5pdGlhbGlzZWQgd291bGQgbGVhdmUgbm9ib2R5IHJlbmRlcmluZyB0aGUgb3V0bGV0cywgYW5kIGV2ZXJ5IG5vdGljZSBmcm9tXG4gICAqIHRoZSByb290IHNlcnZpY2Ugd291bGQgc2lsZW50bHkgdmFuaXNoIGFnYWluLlxuICAgKi9cbiAgZ2V0IG93bnNTaGFyZWRUb2FzdHMoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgb2xkZXN0ID0gVmlzdWFsaXplckNvbXBvbmVudC5saXZlSW5zdGFuY2VzLnZhbHVlcygpLm5leHQoKTtcbiAgICByZXR1cm4gIW9sZGVzdC5kb25lICYmIG9sZGVzdC52YWx1ZSA9PT0gdGhpcztcbiAgfVxuXG4gIEBPdXRwdXQoKVxuICBpc1N0YWNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKTtcbiAgQE91dHB1dCgpXG4gIGlzR3JheXNjYWxlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKTtcblxuICAvKiogV2hpY2ggdG9vbGJhciBncm91cHMgdG8gc2hvdy4gQSBwYXJ0aWFsIG92ZXJyaWRlIG1lcmdlcyBvdmVyIHRoZSBmdWxsIHNldCxcbiAgICogIHNvIGB7IHNwZWNpYWxUb29sczogZmFsc2UgfWAgaGlkZXMgb25seSB0aGF0IGdyb3VwLiBEZWZhdWx0cyB0byBldmVyeXRoaW5nLiAqL1xuICBASW5wdXQoKVxuICBzZXQgdG9vbGJhclRvb2xzKHY6IFRvb2xiYXJUb29sVmlzaWJpbGl0eSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3Rvb2xiYXJUb29scyA9IHsgLi4uQUxMX1RPT0xCQVJfVE9PTFMsIC4uLih2ID8/IHt9KSB9O1xuICB9XG5cbiAgZ2V0IHRvb2xiYXJUb29scygpOiBSZXF1aXJlZDxUb29sYmFyVG9vbFZpc2liaWxpdHk+IHtcbiAgICByZXR1cm4gdGhpcy5fdG9vbGJhclRvb2xzO1xuICB9XG4gIHByaXZhdGUgX3Rvb2xiYXJUb29sczogUmVxdWlyZWQ8VG9vbGJhclRvb2xWaXNpYmlsaXR5PiA9IEFMTF9UT09MQkFSX1RPT0xTO1xuXG4gIC8qKiBFeHBvc2UgdGVzdC1vbmx5IHBsb3QgbW9kZXMgaW4gdGhlIHNlbGVjdG9yIChlLmcuIHRoZSBuYXBhcmkgYEltYWdlYFxuICAgKiAgbW9kZSwgb3RoZXJ3aXNlIGhpZGRlbikuIFRoZSBob3N0IGFwcCBzZXRzIHRoaXMgZnJvbSBhIGA/dGVzdD0xYCBVUkxcbiAgICogIHRvZ2dsZS4gT2ZmIGJ5IGRlZmF1bHQsIHNvIHByb2R1Y3Rpb24gdXNlcnMgbmV2ZXIgc2VlIHRoZW0uICovXG4gIEBJbnB1dCgpXG4gIHRlc3RNb2RlID0gZmFsc2U7XG5cbiAgLyoqIEltYWdlLXNtb290aGluZyBzdGF0ZSBmb3IgdGhlIHRvb2xiYXIncyBTbW9vdGhlbiB0b2dnbGUgKE9TRCBvbmx5KS5cbiAgICogIERlZmF1bHRzIHRvIGBmYWxzZWAgc28gT1NEIHNob3dzIHJhdyBwaXhlbHMgKG5lYXJlc3QtbmVpZ2hib3VyKS4gKi9cbiAgaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XG4gIGxvYWRpbmdNZXNzYWdlID0gJ0xvYWRpbmcgaW1hZ2UuLi4nO1xuICB6b29tID0gZmFsc2U7XG4gIGZpbGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgbG9hZGVkRmlsZU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgdW5zdWIgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIHByZXZpZXdTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgcHVibGljIHN0YWNrTG9hZGluZyA9IGZhbHNlO1xuICBwdWJsaWMgaW1nTG9hZGluZyA9IGZhbHNlO1xuICBwdWJsaWMgbG9hZGluZ1BlcmNlbnRhZ2UgPSAwO1xuICAvLyBOb24tbnVsbCAoMC4uMTAwKSB3aGlsZSBqaXQtc2VydmljZSBpcyBjb3B5aW5nIHRoZSBzb3VyY2UgZmlsZSBpbnRvIHRoZVxuICAvLyBsb2NhbCBjYWNoZSBQVkMgb24gZmlyc3QgY2xpY2suIFdoZW4gc2V0LCB0aGUgbG9hZGluZyBvdmVybGF5IHN3YXBzIHRoZVxuICAvLyBzcGlubmVyIGZvciBhIGRldGVybWluYXRlIHByb2dyZXNzIGJhciB3aXRoIGEgXCJDYWNoaW5nIGltYWdlXCIgbWVzc2FnZS5cbiAgcHVibGljIGNhY2hlUHJvZ3Jlc3M6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAvLyBUcnVlIGJldHdlZW4gdGhlIHNtYWxsLXRpZXIgcmVuZGVyIGxhbmRpbmcgYW5kIHRoZSBsYXJnZS10aWVyIHJlbmRlclxuICAvLyBsYW5kaW5nIGluIHRoZSBtdWx0aS10aWVyIHJlbmRlcmluZyBwYXRoLiBUaGUgdGVtcGxhdGUgdXNlcyB0aGlzIHRvXG4gIC8vIG92ZXJsYXkgYSB0cmFuc2x1Y2VudCBzcGlubmVyIG9uIHRvcCBvZiB0aGUgYmx1cnJ5IHNtYWxsLXRpZXIgaW1hZ2Ugc29cbiAgLy8gdGhlIHVzZXIgZG9lc24ndCBtaXN0YWtlIGl0IGZvciB0aGUgZmluYWwgcHJldmlldy5cbiAgcHVibGljIHNoYXJwZW5pbmcgPSBmYWxzZTtcbiAgLyoqIEEgaml0LXNlcnZpY2UgY2FjaGUgY29weSBpcyBhY3RpdmVseSBpbiBwcm9ncmVzcyAoZGV0ZXJtaW5hdGUgMC4uOTkpLiBEcml2ZXMgdGhlIGNhY2hlXG4gICAqICBwcm9ncmVzcyBiYXIgaW5kZXBlbmRlbnRseSBvZiBgaW1nTG9hZGluZ2Agc28gdGhlIGJhciBjYW4ndCBiZSBkcm9wcGVkIOKAlCBvciBtYXNrZWQgYnkgdGhlXG4gICAqICBcIlNoYXJwZW5pbmcgcHJldmlldy4uLlwiIG92ZXJsYXkg4oCUIG1pZC1kb3dubG9hZCBpZiB0aGUgbG9hZGluZyBmbGFnIGZsaXBzIGVhcmx5LiAqL1xuICBnZXQgaXNDYWNoaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNhY2hlUHJvZ3Jlc3MgIT09IG51bGwgJiYgdGhpcy5jYWNoZVByb2dyZXNzIDwgMTAwO1xuICB9XG4gIHByaXZhdGUgcnVubmluZyA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBNb25vdG9uaWMgcmVuZGVyIGdlbmVyYXRpb24uIEJ1bXBlZCB3aGVuIGEgcmVuZGVyIHN0YXJ0cywgc28gYSByZW5kZXIgdGhhdFxuICAgKiBoYXMgYmVlbiBzdXBlcnNlZGVkIGJ5IGEgbmV3ZXIgaW1hZ2UgY2FuIGJlIHJlY29nbmlzZWQgYW5kIG1hZGUgaW5lcnQ6IGl0c1xuICAgKiBjYWxsYmFja3MgcmV0dXJuIGVhcmx5IGluc3RlYWQgb2YgcGFpbnRpbmcsIGNsZWFyaW5nIGBydW5uaW5nYCwgcmVsZWFzaW5nXG4gICAqIHRoZSBuZXdlciByZW5kZXIncyBvdmVybGF5LCBvciBhcHBseWluZyBpdHMgUk9Jcy5cbiAgICovXG4gIHByaXZhdGUgcmVuZGVyVG9rZW4gPSAwO1xuICBwdWJsaWMgekluZGV4ID0gMDtcbiAgcHVibGljIG1heEluZGV4ID0gMDtcblxuICBAVmlld0NoaWxkKCdjbScpIGNvbnRleHRNZW51ITogQ29udGV4dE1lbnU7XG4gIGNvbnRleHRNZW51SXRlbXM6IE1lbnVJdGVtW10gPSBbXTtcblxuICBhY3RpdmVEcmFnTW9kZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFdoZXRoZXIgYSByZWdpb24gYWN0aW9uIGlzIGF2YWlsYWJsZSB0byB1bmRvIChqaXQtdWkjODUpLiBNaXJyb3JzIHRoZVxuICAgKiAgc2hhcmVkIFJlZ2lvblN0b3JlJ3MgaGlzdG9yeSBkZXB0aDsgZHJpdmVzIHRoZSB0b29sYmFyIFVuZG8gYnV0dG9uLiAqL1xuICBjYW5VbmRvUmVnaW9uID0gZmFsc2U7XG4gIC8qKiBXaGV0aGVyIGFuIHVuZG9uZSByZWdpb24gYWN0aW9uIGlzIGF2YWlsYWJsZSB0byByZWRvIChqaXQtdWkjODUpLiAqL1xuICBjYW5SZWRvUmVnaW9uID0gZmFsc2U7XG5cbiAgLyoqIEN1c3RvbS10aHJlc2hvbGQgU2ltcGxpZnkgZGlhbG9nIChqaXQtdWkjODUpLiAqL1xuICBkaXNwbGF5U2ltcGxpZnlEaWFsb2cgPSBmYWxzZTtcbiAgc2ltcGxpZnlUaHJlc2hvbGQgPSAzO1xuICAvKiogQ3VycmVudCByZWdpb24gc2VsZWN0aW9uIChhcnJheSBpbmRpY2VzKSDigJQgbWlycm9yZWQgZnJvbSB0aGUgc3RvcmUgc28gdGhlXG4gICAqICBjb250ZXh0LW1lbnUgcmVnaW9uIGFjdGlvbnMgY2FuIHJlYWQgaXQgc3luY2hyb25vdXNseSAoaml0LXVpIzg1KS4gKi9cbiAgcHJpdmF0ZSBzZWxlY3RlZEluZGljZXM6IG51bWJlcltdID0gW107XG5cbiAgLyoqIFdhbmQgc2Vuc2l0aXZpdHkg4oCUIGhpZ2hlciA9IHN0cmljdGVyIChzbWFsbGVyIHNlbGVjdGlvbikuIE1hdGNoZXMgUXVQYXRoIGRlZmF1bHQuICovXG4gIHdhbmRTZW5zaXRpdml0eSA9IDIuMDtcbiAgLyoqIEJydXNoIGRpYW1ldGVyIGluIGltYWdlLXBpeGVsIGNvb3JkaW5hdGVzIChkcml2ZXMgdGhlIHBhaW50ZWQgZGlzYyBzaXplKS4gKi9cbiAgYnJ1c2hTaXplID0gNDA7XG4gIC8qKiBTQU0gbW9kZWwgcGlja2VyIG9wdGlvbnMgKyBjdXJyZW50IHNlbGVjdGlvbiAoaml0LXVpIzkwIFAxKS4gT25seSBtb2RlbHNcbiAgICogIHdpdGggYSBob3N0ZWQgT05OWCBwYWlyIChjb25maWd1cmVkIHZpYSBzZXRTYW1Nb2RlbFVybHMgYXQgYXBwIGluaXQpIGFyZVxuICAgKiAgb2ZmZXJlZCwgc28gdGhlIHBpY2tlciBjYW4ndCBzZWxlY3QgYSBtb2RlbCB0aGF0IGNhbid0IHJ1bi4gKi9cbiAgc2FtTW9kZWxzID0gU0FNX01PREVMUy5maWx0ZXIoaXNTYW1Nb2RlbFJlYWR5KS5tYXAoKG0pID0+ICh7IGlkOiBtLmlkLCBsYWJlbDogbS5sYWJlbCB9KSk7XG4gIHNhbU1vZGVsSWQgPSBnZXREZWZhdWx0U2FtTW9kZWxJZCgpO1xuXG4gIC8qKiBZT0xPIGNoZWNrcG9pbnRzIHdpdGggYSBjb25maWd1cmVkIFVSTCwgYW5kIHRoZSBhY3RpdmUgb25lLiAqL1xuICB5b2xvTW9kZWxzID0gWU9MT19NT0RFTFMuZmlsdGVyKChtKSA9PiBpc1lvbG9Nb2RlbFJlYWR5KG0uaWQpKS5tYXAoKG0pID0+ICh7XG4gICAgaWQ6IG0uaWQsXG4gICAgbGFiZWw6IG0ubGFiZWwsXG4gIH0pKTtcbiAgeW9sb01vZGVsSWQgPSBnZXREZWZhdWx0WW9sb01vZGVsSWQoKTtcbiAgLyoqIFBhcmFtZXRlciBkaWFsb2cgc3RhdGUuIFNlZWRlZCBmcm9tIHRoZSBhY3RpdmUgbW9kZWwncyBvd24gZGVmYXVsdHMsIHdoaWNoXG4gICAqICBlbmNvZGUgdGhlIHNjYWxlIGFuZCBjcm93ZGluZyBlYWNoIGNoZWNrcG9pbnQgd2FzIHRyYWluZWQgZm9yLiAqL1xuICBzaG93WW9sb1BhcmFtcyA9IGZhbHNlO1xuICB5b2xvUGFyYW1zOiBJbnN0YW5jZVNlZ21lbnRPcHRpb25zID0gdGhpcy5kZWZhdWx0WW9sb1BhcmFtcygpO1xuICAvKiogU0FNIGRvd25sb2FkL3NlZ21lbnQgdG9hc3Qgc3RhdGUgKGJvdW5kIGJ5IHRoZSBgc2FtYCBwLXRvYXN0IHRlbXBsYXRlKS4gKi9cbiAgc2FtU3RhdHVzID0gJyc7XG4gIHNhbVByb2dyZXNzID0gMDsgLy8gMC4uMTAwLCBlbmNvZGVyIGRvd25sb2FkXG4gIHNhbURvd25sb2FkaW5nID0gZmFsc2U7XG4gIHNhbUJ1c3kgPSBmYWxzZTsgLy8gYW55IFNBTSB3b3JrIGluIGZsaWdodCAoZHJpdmVzIHRoZSBpbmRldGVybWluYXRlIHNwaW5uZXIpXG4gIC8qKiBXaGV0aGVyIHRoZSBzaGFyZWQgYHNhbWAgdG9hc3QgaXMgY3VycmVudGx5IHNob3duIChhdm9pZHMgc3RhY2tpbmcgaXQgb25cbiAgICogIGV2ZXJ5IHBvaW50IGNsaWNrLCB3aGljaCByZS1ydW5zIGluZmVyZW5jZSkuICovXG4gIHByaXZhdGUgc2FtVG9hc3RTaG93biA9IGZhbHNlO1xuXG4gIHJlYWRvbmx5IHNhbVRvYXN0S2V5ID0gYHNhbS0ke1Zpc3VhbGl6ZXJDb21wb25lbnQubmV4dFRvYXN0SWQrK31gO1xuICAvKipcbiAgICogT3V0bGV0IGZvciB0aGUgbGlicmFyeSdzIG93biByZXN1bHQvZXJyb3Igbm90aWNlcy5cbiAgICpcbiAgICogUHJpbWVORyByb3V0ZXMgYSBtZXNzYWdlIHRvIGEgYDxwLXRvYXN0PmAgb25seSB3aGVuIHRoZSBrZXlzIG1hdGNoIOKAlCBhXG4gICAqIGtleWxlc3MgbWVzc2FnZSByZWFjaGVzIGEga2V5bGVzcyB0b2FzdCBhbmQgbm90aGluZyBlbHNlLiBUaGVzZSBub3RpY2VzIHVzZWRcbiAgICogdG8gYmUgZW1pdHRlZCB3aXRoIG5vIGtleSwgc28gdGhleSByZW5kZXJlZCBvbmx5IGluIGhvc3RzIHRoYXQgaGFwcGVuIHRvXG4gICAqIG1vdW50IGEgYmFyZSBgPHAtdG9hc3Q+YCAoaml0LXVpIGRvZXMsIGluIGl0cyBmaWxlLXRyZWUgY29tcG9uZW50KS4gRXZlcnlcbiAgICogb3RoZXIgaG9zdCDigJQgaW5jbHVkaW5nIHRoaXMgcmVwbydzIG93biBicm93c2VyIGV4YW1wbGUg4oCUIGRyb3BwZWQgdGhlbVxuICAgKiBzaWxlbnRseSwgd2hpY2ggbWFkZSBhIGZhaWxlZCBvciBuby1vcCBzZWdtZW50YXRpb24gbG9vayBsaWtlIGEgZGVhZCBidXR0b246XG4gICAqIHRoZSBzdGlja3kgcHJvZ3Jlc3MgdG9hc3QgaXMgY2xlYXJlZCBpbiB0aGUgc2FtZSB0aWNrIGJ5IGhpZGVTYW1Ub2FzdCwgYW5kXG4gICAqIHRoZSBtZXNzYWdlIGV4cGxhaW5pbmcgd2h5IG5ldmVyIGFwcGVhcmVkIGFueXdoZXJlLlxuICAgKlxuICAgKiBLZXllZCB0byB0aGlzIGNvbXBvbmVudCBpbnN0YW5jZSBzbyB0aGUgbGlicmFyeSByZW5kZXJzIGl0cyBvd24gb3V0bGV0IGFuZFxuICAgKiBpcyBub3QgZGVwZW5kZW50IG9uIGhvc3QgbWFya3VwLiBEZWxpYmVyYXRlbHkgTk9UIHRoZSBzdGlja3kgdG9hc3QncyBrZXk6XG4gICAqIHtAbGluayBoaWRlU2FtVG9hc3R9IGNsZWFycyB0aGF0IGtleSBpbiB0aGUgYGZpbmFsbHlgLCB3aGljaCB3b3VsZCB3aXBlIHRoZVxuICAgKiByZXN1bHQgdGhlIG1vbWVudCBpdCB3YXMgcG9zdGVkLCBhbmQgdGhlIHN0aWNreSB0b2FzdCdzIGN1c3RvbSB0ZW1wbGF0ZSBpc1xuICAgKiBidWlsdCBmb3IgdGhlIGxpdmUgc3RhdHVzICsgcHJvZ3Jlc3MgYmFyLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzdWx0VG9hc3RLZXkgPSBgJHt0aGlzLnNhbVRvYXN0S2V5fS1yZXN1bHRgO1xuICAvKiogU3Vic2NyaXB0aW9ucyB0byB0aGUgcG9pbnQgdG9vbCdzIGxpdmUgZmVlZHMgKHN0YXR1cy9idXN5L2Rvd25sb2FkKS4gKi9cbiAgcHJpdmF0ZSBzYW1Qb2ludFN1YiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgLyoqIFZlcnRleCBlcmFzZXIgcmFkaXVzIGluIGltYWdlLXBpeGVsIGNvb3JkaW5hdGVzLiAqL1xuICB2ZXJ0ZXhFcmFzZXJSYWRpdXMgPSAyMDtcblxuICBjb2xvcm1hcHNPcHRpb25zITogYW55O1xuICByZXZlcnNlc2NhbGUgPSBmYWxzZTtcbiAgc2VsZWN0ZWRDb2xvcm1hcCE6IGFueTtcbiAgLyoqIENoYW5uZWxzICYgSGlzdG9ncmFtIGRpYWxvZyB2aXNpYmlsaXR5IChvcGVuZWQgZnJvbSB0aGUgdG9vbGJhcikuICovXG4gIHNob3dDaGFubmVsSGlzdG9ncmFtID0gZmFsc2U7XG4gIC8qKiBSZWdpb24gRWRpdG9yIGRpYWxvZyB2aXNpYmlsaXR5IChvcGVuZWQgZnJvbSB0aGUgdG9vbGJhcikuICovXG4gIHNob3dSZWdpb25FZGl0b3IgPSBmYWxzZTtcbiAgLyoqIFJlZ2lvbiBFZGl0b3IgZGlhbG9nIHdpZHRoLiBPbiBvcGVuIGl0IGlzIHNldCB0byB0aGUgY29uZmlndXJlZCBob3N0XG4gICAqICBlbGVtZW50J3MgY3VycmVudCB3aWR0aCwgb3Ig4oCUIHdoZW4gbm8gc2VsZWN0b3IgaXMgY29uZmlndXJlZCAvIHRoZSBlbGVtZW50XG4gICAqICBpc24ndCBmb3VuZCDigJQgdG8gYSBxdWFydGVyIG9mIHRoZSBwYWdlIChzZWUgb3BlblJlZ2lvbkVkaXRvcikuICovXG4gIHJlZ2lvbkVkaXRvcldpZHRoID0gJzI1dncnO1xuICBzdGFja09wdGlvbnMgPSBbXG4gICAgeyBuYW1lOiAnU2luZ2xlIGltYWdlJywgdmFsOiAnZmFsc2UnIH0sXG4gICAgeyBuYW1lOiAnU3RhY2snLCB2YWw6ICd0cnVlJyB9LFxuICBdO1xuICBzZWxlY3RlZFN0YWNrT3B0aW9uOiB7IG5hbWU6IHN0cmluZzsgdmFsOiBzdHJpbmcgfSB8IHVuZGVmaW5lZCA9IHRoaXMuc3RhY2tPcHRpb25zWzBdO1xuICByZWFkb25seSBwbG90RGl2TmFtZSA9IGB2aXotcGxvdC0ke3Bsb3RJbnN0YW5jZVNlcSsrfWA7XG4gIHBsb3RUeXBlID0gUGxvdFR5cGUuSU1BR0U7XG4gIGlzSGVhdG1hcCA9IHRydWU7XG4gIGFjdGl2ZVN1cmZhY2UzZE1vZGUgPSAndHVybnRhYmxlJztcbiAgLyoqIFdoZXRoZXIgdGhlIG5hcGFyaSAzRCBjb29yZGluYXRlLWF4ZXMgLyBzY2FsZSBnaXptbyBpcyBzaG93biAodm9sdW1lL2lzb3N1cmZhY2UpLiAqL1xuICBheGVzVmlzaWJsZSA9IHRydWU7XG4gIHdpcmVmcmFtZUFjdGl2ZSA9IGZhbHNlO1xuICAvKiogbmFwYXJpIDNEIGRlY2ltYXRlIGZhY3RvciAoMSA9IEZ1bGwg4oCmIDggPSDihZs7IGRlZmF1bHQgwr0pOyBjaGFuZ2luZyBpdCByZS1wbG90cy4gKi9cbiAgcmVzb2x1dGlvblNjYWxlID0gTkFQQVJJX0RFRkFVTFRfREVDSU1BVEU7XG5cbiAgLyoqIFBsb3QgdHlwZXMgdGhlIGFjdGl2ZSBiYWNrZW5kIGFkdmVydGlzZXMgKDNEIGdhdGVkIGJ5IGNhcGFiaWxpdHkpLiAqL1xuICBwbG90VHlwZU9wdGlvbnM6IFBsb3RUeXBlRGVzY3JpcHRvcltdID0gW107XG4gIHNlbGVjdGVkUGxvdFR5cGU6IFBsb3RUeXBlID0gUGxvdFR5cGUuSU1BR0U7XG5cbiAgLyoqIEZsb2F0aW5nIGludGVuc2l0eS1wcm9maWxlIGluc2V0IChMSU5FIG1vZGUpLiAqL1xuICByZWFkb25seSBpbnRlbnNpdHlJbnNldERpdiA9ICdpbnRlbnNpdHktaW5zZXQtcGxvdCc7XG4gIHByb2ZpbGVQYW5lbFBvcyA9IHsgeDogMjAsIHk6IDcwIH07XG4gIHByaXZhdGUgcHJvZmlsZVBhbmVsRHJhZ2dpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBwcm9maWxlUGFuZWxTdGFydCA9IHsgbXg6IDAsIG15OiAwLCB4OiAwLCB5OiAwIH07XG5cbiAgLyoqIFRvb2xiYXIgZG9ja2luZzogZG9ja2VkIGFjcm9zcyB0aGUgdG9wIGJ5IGRlZmF1bHQ7IGRyYWdnaW5nIGl0cyBoYW5kbGVcbiAgICogIGRldGFjaGVzIGl0IGludG8gYSBmbG9hdGluZywgbW92YWJsZSB3aW5kb3cgKGZyZWVzIHRoZSB0b3Agcm93IGZvciB0aGVcbiAgICogIHZpc3VhbGl6YXRpb24pLiAqL1xuICB0b29sYmFyRmxvYXRpbmcgPSBmYWxzZTtcbiAgdG9vbGJhclBvcyA9IHsgeDogOCwgeTogOCB9O1xuICBwcml2YXRlIHRvb2xiYXJEcmFnZ2luZyA9IGZhbHNlO1xuICBwcml2YXRlIHRvb2xiYXJTdGFydCA9IHsgbXg6IDAsIG15OiAwLCB4OiAwLCB5OiAwIH07XG4gIHByaXZhdGUgbGF0ZXN0UHJvZmlsZXM6IEludGVuc2l0eVByb2ZpbGVbXSA9IFtdO1xuICAvKiogRHJpdmVzIHRoZSBpbnRlbnNpdHkgaW5zZXQgcGFuZWwncyB2aXNpYmlsaXR5IOKAlCB0cnVlIHdoZW5ldmVyIGFueVxuICAgKiAgaW50ZW5zaXR5LXByb2ZpbGUgbGluZSBleGlzdHMgKGluZGVwZW5kZW50IG9mIHRoZSBjdXJyZW50IHBsb3QgdHlwZSkuICovXG4gIGhhc1Byb2ZpbGVzID0gZmFsc2U7XG4gIHByaXZhdGUgaW50ZW5zaXR5UHJvZmlsZVN1Yj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSB2aWV3cG9ydENoYW5nZVN1Yj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBwcm9maWxlRHJhZ01vdmVMaXN0ZW5lcj86IChlOiBNb3VzZUV2ZW50KSA9PiB2b2lkO1xuICBwcml2YXRlIHByb2ZpbGVEcmFnVXBMaXN0ZW5lcj86ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgcHJvZmlsZVJlc2l6ZUxpc3RlbmVyPzogKCkgPT4gdm9pZDtcblxuICAvKiogTElORSBwbG90IHR5cGUgc2hvd3MgdGhlIGltYWdlICsgZHJhZ2dhYmxlIGxpbmUgUk9JICsgaW50ZW5zaXR5IGluc2V0LiAqL1xuICBnZXQgaXNQcm9maWxlTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFBsb3RUeXBlID09PSBQbG90VHlwZS5MSU5FO1xuICB9XG5cbiAgLyoqIFRydWUgZm9yIHRoZSBJbWFnZSBwbG90IHR5cGUsIHdoaWNoIHJlbmRlcnMgYXMgYSBuYXRpdmVseSBwYW4vem9vbS1hYmxlXG4gICAqICByYXN0ZXIg4oCUIHNvIHRoZSBiYWNrZW5kLWFnbm9zdGljIHpvb20vcGFuIHRvb2xiYXIgdG9vbHMgYXJlIGhpZGRlbi4gVGhlXG4gICAqICBjb21wb25lbnQgZHJpdmVzIHRoaXMgb2ZmIHRoZSBwbG90IHR5cGUsIG5vdCB0aGUgYWN0aXZlIGJhY2tlbmQuICovXG4gIGdldCBpc0ltYWdlVmlldygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFBsb3RUeXBlID09PSBQbG90VHlwZS5JTUFHRTtcbiAgfVxuXG4gIC8qKiBJc29zdXJmYWNlIGJhbmQgYXMgYSAw4oCTMjU1IHNsaWRlciBwb3NpdGlvbiwgbWFwcGVkIG9udG8gdGhlIHZvbHVtZSdzIHJlYWxcbiAgICogIGludGVuc2l0eSByYW5nZSBieSB0aGUgcmVuZGVyZXIuIERlZmF1bHRzIHRvIHRoZSBmdWxsIHJhbmdlLiAqL1xuICBpc29SYW5nZTogbnVtYmVyW10gPSBbMCwgMjU1XTtcblxuICBwbG90V2lkdGhTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIGltYWdlTG9hZGluZ1N1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgaW1nTG9hZGluZ01lc3NhZ2VTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIGlzWm9vbVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgZmlsZW5hbWVTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIGF1dG9zY2FsZVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblxuICBwcml2YXRlIHBsb3RDb250ZXh0TWVudUxpc3RlbmVyPzogKGU6IE1vdXNlRXZlbnQpID0+IHZvaWQ7XG4gIHByaXZhdGUga2V5ZG93bkxpc3RlbmVyPzogKGU6IEtleWJvYXJkRXZlbnQpID0+IHZvaWQ7XG4gIHByaXZhdGUgd2hlZWxMaXN0ZW5lcj86IChlOiBXaGVlbEV2ZW50KSA9PiB2b2lkO1xuXG4gIC8qKiBEZWJvdW5jZWQgei1zbGljZSBzY3J1YmJpbmcgKHNlZSBTbGljZVNjcnViYmVyIOKAlCByZWZhY3RvcmluZyBwbGFuIFN0ZXAgNykuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2NydWJiZXIgPSBuZXcgU2xpY2VTY3J1YmJlcigoeikgPT4ge1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0WkluZGV4KHopO1xuICAgIC8vIEluIGEgcGVyLXNsaWNlIHotc3RhY2sgc2Vzc2lvbiB0aGUgc3RvcmUgc3dhcHMgdGhlIGxpdmUgcmVnaW9uIHNldCB0byB0aGlzXG4gICAgLy8gc2xpY2UgKHByZXNlcnZpbmcgZWRpdHMgbWFkZSBvbiB0aGUgcHJldmlvdXMgb25lKTsgb3V0c2lkZSBzdGFjayBtb2RlIHRoaXNcbiAgICAvLyBqdXN0IHJlY29yZHMgdGhlIHNsaWNlLCBsZWF2aW5nIHNpbmdsZS1wbGFuZSByZWdpb25zIHVudG91Y2hlZCAoaml0LXVpIzkzKS5cbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldERpc3BsYXlTbGljZSh6KTtcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChJTUFHRV9TVEFURV9QT1JUKSBwcml2YXRlIHN0YXRlOiBJbWFnZVN0YXRlUG9ydCxcbiAgICBASW5qZWN0KFZJU1VBTElaRVIpIHB1YmxpYyBwbG90U2VydmljZTogSVZpc3VhbGl6ZXIsXG4gICAgcHVibGljIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHNlc3Npb246IFZpc3VhbGl6ZXJTdG9yZSxcbiAgICBwcml2YXRlIHNhbVRvb2w6IFNhbVRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2VsbFNlZ21lbnRUb29sOiBDZWxsU2VnbWVudFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgeW9sb0RldGVjdFRvb2w6IFlvbG9EZXRlY3RUb29sU2VydmljZSxcbiAgICBASW5qZWN0KElOU1RBTkNFX1NFR01FTlRFUikgcHJpdmF0ZSBpbnN0YW5jZVNlZ21lbnRlcjogSUluc3RhbmNlU2VnbWVudGVyLFxuICAgIHByaXZhdGUgc2FtUG9pbnRUb29sOiBTYW1Qb2ludFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVnaW9uT3BzOiBSZWdpb25PcHNTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoVklaX0NPTkZJRykgcHJpdmF0ZSB2aXpDb25maWc/OiBWaXpDb25maWcsXG4gICkge1xuICAgIHRoaXMuY29sb3JtYXBzT3B0aW9ucyA9IHBsb3RTZXJ2aWNlLmdldENvbG9ybWFwT3B0aW9ucygpO1xuICAgIHRoaXMuY29tcHV0ZVBsb3RUeXBlT3B0aW9ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsb3QgdHlwZXMgb2ZmZXJlZCBpbiB0aGUgc2VsZWN0b3IgZm9yIHRoZSBjdXJyZW50IGltYWdlOlxuICAgKiAgLSBPdXRzaWRlICoqdGVzdCBtb2RlKiosIG9ubHkgdGhlIGN1cmF0ZWQgZGVmYXVsdCBzZXQgKGRlc2NyaXB0b3JzIHdpdGggYVxuICAgKiAgICBgcHJvZHVjdGlvbkxhYmVsYCkgaXMgb2ZmZXJlZCwgc2hvd24gdW5kZXIgc3VmZml4LWZyZWUgbmFtZXMg4oCUIEltYWdlLFxuICAgKiAgICBIZWF0bWFwLCBDb250b3VyIGFuZCB0aGUgbmFwYXJpIFN1cmZhY2UgLyBWb2x1bWUgLyBJc29zdXJmYWNlLiBUZXN0IG1vZGVcbiAgICogICAgZXhwb3NlcyBldmVyeSBiYWNrZW5kJ3MgdHlwZSB1bmRlciBpdHMgZnVsbCAoYmFja2VuZC1zdWZmaXhlZCkgbGFiZWwuXG4gICAqICAtIDNEIHR5cGVzIGhpZGRlbiB3aGVuIHRoZSBiYWNrZW5kIGNhbid0IHJlbmRlciBhIDNEIHNjZW5lLlxuICAgKiAgLSBzdGFjay1vbmx5IHR5cGVzICh2b2x1bWUsIGlzb3N1cmZhY2UpIGhpZGRlbiB1bmxlc3MgdGhlIGZpbGUgaXMgYSBzdGFjayDigJRcbiAgICogICAgYSB2b2x1bWUgbmVlZHMgbXVsdGlwbGUgei1zbGljZXMuXG4gICAqICAtIHNjYWxhci1pbnRlbnNpdHkgdHlwZXMgKGNvbnRvdXIsIHN1cmZhY2UsIGlzb3N1cmZhY2UpIGhpZGRlbiBmb3IgUkdCXG4gICAqICAgIGltYWdlcyDigJQgdGhleSBtYXAgYSBzaW5nbGUgaW50ZW5zaXR5IHBlciBwaXhlbC4gSW1hZ2UgYW5kIEhlYXRtYXAgcmVuZGVyXG4gICAqICAgIGFueSBpbWFnZS5cbiAgICovXG4gIHByaXZhdGUgY29tcHV0ZVBsb3RUeXBlT3B0aW9ucygpIHtcbiAgICBjb25zdCBjYXBzID0gdGhpcy5wbG90U2VydmljZS5jYXBhYmlsaXRpZXM7XG4gICAgY29uc3QgaXNTdGFjayA9ICEhdGhpcy5pbWFnZUluZm8/LmlzU3RhY2s7XG4gICAgY29uc3QgaXNHcmF5c2NhbGUgPSAhIXRoaXMuaW1hZ2VJbmZvPy5pc0dyYXlzY2FsZTtcbiAgICAvLyBBIG11bHRpY2hhbm5lbCBpbWFnZSdzIGJhbmRzIGFyZSBlYWNoIHNpbmdsZS1iYW5kIChzY2FsYXIpLCBzbyB0aGUgc2NhbGFyXG4gICAgLy8gcGxvdCBtb2RlcyAoSGVhdG1hcCAvIFN1cmZhY2UgLyBWb2x1bWUgLyBJc29zdXJmYWNlKSBhcHBseSBwZXIgY2hhbm5lbCBldmVuXG4gICAgLy8gdGhvdWdoIHRoZSBSR0IgY29tcG9zaXRlIGlzbid0IGdyYXlzY2FsZSDigJQgZG9uJ3QgZ2F0ZSB0aGVtIG91dC5cbiAgICBjb25zdCBtMCA9IHRoaXMuaW1hZ2VJbmZvPy5pbWFnZU1ldGE/LlswXTtcbiAgICBjb25zdCBpc011bHRpY2hhbm5lbCA9IChtMD8uY2hhbm5lbENvdW50ID8/IDEpID4gMSAmJiAobTA/LnJnYkNoYW5uZWxzID8/IDEpIDwgMztcbiAgICB0aGlzLnBsb3RUeXBlT3B0aW9ucyA9IHRoaXMucGxvdFNlcnZpY2UuZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpXG4gICAgICAuZmlsdGVyKChkKSA9PiB7XG4gICAgICAgIC8vIE91dHNpZGUgdGVzdCBtb2RlLCBvbmx5IHRoZSBjdXJhdGVkIHNldCAodGhvc2Ugd2l0aCBhIHByb2R1Y3Rpb25MYWJlbClcbiAgICAgICAgLy8gaXMgb2ZmZXJlZDsgdGVzdCBtb2RlIGV4cG9zZXMgZXZlcnkgYmFja2VuZCdzIHR5cGUuXG4gICAgICAgIGlmICghdGhpcy50ZXN0TW9kZSAmJiAhZC5wcm9kdWN0aW9uTGFiZWwpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGQuZGltZW5zaW9ucyA9PT0gJzNkJyAmJiAhY2Fwcy5oYXMoVmlld2VyRmVhdHVyZS5TdXJmYWNlM0QpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChkLnJlcXVpcmVzU3RhY2sgJiYgIWlzU3RhY2spIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGQucmVxdWlyZXNHcmF5c2NhbGUgJiYgIWlzR3JheXNjYWxlICYmICFpc011bHRpY2hhbm5lbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pXG4gICAgICAvLyBEZWZhdWx0IHNlbGVjdG9yIHNob3dzIHRoZSBzdWZmaXgtZnJlZSBwcm9kdWN0aW9uTGFiZWw7IHRlc3QgbW9kZSBrZWVwc1xuICAgICAgLy8gdGhlIGZ1bGwgYmFja2VuZC1zdWZmaXhlZCBsYWJlbCBzbyBzYW1lLW5hbWVkIG1vZGVzIHN0YXkgZGlzdGluZ3Vpc2hhYmxlLlxuICAgICAgLm1hcCgoZCkgPT4gKHRoaXMudGVzdE1vZGUgPyBkIDogeyAuLi5kLCBsYWJlbDogZC5wcm9kdWN0aW9uTGFiZWwhIH0pKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvLyBUaGUgY29uc3RydWN0b3IgY29tcHV0ZXMgdGhlIG9wdGlvbnMgd2l0aCB0ZXN0TW9kZSBzdGlsbCBhdCBpdHMgZGVmYXVsdDtcbiAgICAvLyByZWNvbXB1dGUgb25jZSB0aGUgaG9zdCBiaW5kcyBpdCAoYW5kIG9uIGFueSBsYXRlciBjaGFuZ2UpIHNvIHRoZSBzZWxlY3RvclxuICAgIC8vIHJlZmxlY3RzIHRlc3QgbW9kZSBpbW1lZGlhdGVseSwgd2l0aG91dCB3YWl0aW5nIGZvciBhbiBpbWFnZSB0byAocmUpbG9hZC5cbiAgICBpZiAoY2hhbmdlc1sndGVzdE1vZGUnXSkge1xuICAgICAgdGhpcy5jb21wdXRlUGxvdFR5cGVPcHRpb25zKCk7XG4gICAgICAvLyBJZiB0ZXN0IG1vZGUgaXMgdHVybmVkIG9mZiB3aGlsZSBhIHRlc3Qtb25seSB0eXBlIChlLmcuIE5BUEFSSV9JTUFHRSkgaXNcbiAgICAgIC8vIGFjdGl2ZSwgdGhhdCB0eXBlIGlzIG5vIGxvbmdlciBvZmZlcmVkIOKAlCBmYWxsIGJhY2sgdG8gSW1hZ2UuXG4gICAgICB0aGlzLnJlY29uY2lsZVNlbGVjdGVkUGxvdFR5cGUoKTtcbiAgICB9XG4gIH1cblxuICAvKiogSWYgdGhlIGFjdGl2ZSBwbG90IHR5cGUgaXMgbm8gbG9uZ2VyIGluIHRoZSBvZmZlcmVkIG9wdGlvbnMgKGUuZy4gdGVzdCBtb2RlXG4gICAqICB0dXJuZWQgb2ZmIHdoaWxlIGEgdGVzdC1vbmx5IHR5cGUgd2FzIGFjdGl2ZSwgb3IgYSBzY2FsYXIgdHlwZSBjYXJyaWVkIG9udG9cbiAgICogIGFuIFJHQiBpbWFnZSksIGZhbGwgYmFjayB0byB0aGUgZGVmYXVsdCAyRCBJbWFnZSB2aWV3LiAqL1xuICBwcml2YXRlIHJlY29uY2lsZVNlbGVjdGVkUGxvdFR5cGUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBsb3RUeXBlT3B0aW9ucy5zb21lKChkKSA9PiBkLnR5cGUgPT09IHRoaXMuc2VsZWN0ZWRQbG90VHlwZSkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRQbG90VHlwZSA9IFBsb3RUeXBlLklNQUdFO1xuICAgICAgdGhpcy5wbG90VHlwZSA9IFBsb3RUeXBlLklNQUdFO1xuICAgICAgdGhpcy5pc0hlYXRtYXAgPSB0cnVlO1xuICAgICAgdGhpcy5wbG90U2VydmljZS5zZXRQbG90VHlwZShQbG90VHlwZS5JTUFHRSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gSm9pbiB0aGUgbGl2ZSBzZXQ7IHRoZSBvbGRlc3QgbWVtYmVyIHJlbmRlcnMgdGhlIHNoYXJlZCBub3RpY2Ugb3V0bGV0cy5cbiAgICBWaXN1YWxpemVyQ29tcG9uZW50LmxpdmVJbnN0YW5jZXMuYWRkKHRoaXMpO1xuICAgIHRoaXMuc3RhdGUuc2V0RGlhZ3JhbSh0aGlzKTtcbiAgICB0aGlzLnNlbGVjdGVkQ29sb3JtYXAgPVxuICAgICAgdGhpcy5jb2xvcm1hcHNPcHRpb25zWzBdLmNoaWxkcmVuLmZpbmQoKGM6IGFueSkgPT4gYy5sYWJlbCA9PT0gJ0dyZXlzIEludicpID8/XG4gICAgICB0aGlzLmNvbG9ybWFwc09wdGlvbnNbMF0uY2hpbGRyZW5bMF07XG4gICAgdGhpcy5zdGFja09wdGlvbnMgPSBbXG4gICAgICB7IG5hbWU6ICdTaW5nbGUgaW1hZ2UnLCB2YWw6ICdmYWxzZScgfSxcbiAgICAgIHsgbmFtZTogJ1N0YWNrJywgdmFsOiAndHJ1ZScgfSxcbiAgICBdO1xuICAgIHRoaXMuc2VsZWN0ZWRTdGFja09wdGlvbiA9IHRoaXMuc3RhY2tPcHRpb25zWzBdO1xuICAgIHRoaXMuYXV0b3NjYWxlU3Vic2NyaXB0aW9uID0gdGhpcy5wbG90U2VydmljZS5nZXRBdXRvc2NhbGVFdmVudCgpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAvLyByZXNldCB0aGUgaW1hZ2UgbW9kZSB0byBzaW5nbGUgaW1hZ2VcbiAgICAgIHRoaXMuc2VsZWN0ZWRTdGFja09wdGlvbiA9IHsgbmFtZTogJ1NpbmdsZSBpbWFnZScsIHZhbDogJ2ZhbHNlJyB9O1xuICAgICAgdGhpcy5hY3RpdmVEcmFnTW9kZSA9IG51bGw7XG4gICAgICB0aGlzLnNlc3Npb24uc2V0QWN0aXZlVG9vbChudWxsKTtcbiAgICB9KTtcbiAgICB0aGlzLmltYWdlTG9hZGluZ1N1YnNjcmlwdGlvbiA9IHRoaXMuc3RhdGUuaXNJbWFnZUxvYWRpbmckKCkuc3Vic2NyaWJlKChpc0ltYWdlTG9hZGluZykgPT4ge1xuICAgICAgdGhpcy5pbWdMb2FkaW5nID0gaXNJbWFnZUxvYWRpbmc7XG4gICAgfSk7XG4gICAgLy8gVW5kbyBhdmFpbGFiaWxpdHkgKGppdC11aSM4NSk6IHRoZSBzaGFyZWQgUmVnaW9uU3RvcmUgZW1pdHMgd2hlbmV2ZXIgaXRzXG4gICAgLy8gaGlzdG9yeSBkZXB0aCBjaGFuZ2VzOyBncmV5cyBvdXQgdGhlIHRvb2xiYXIgVW5kbyBidXR0b24gYWNjb3JkaW5nbHkuXG4gICAgdGhpcy5wbG90U2VydmljZVxuICAgICAgLmdldENhblVuZG8kKClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3ViKSlcbiAgICAgIC5zdWJzY3JpYmUoKGNhblVuZG8pID0+IHtcbiAgICAgICAgdGhpcy5jYW5VbmRvUmVnaW9uID0gY2FuVW5kbztcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gICAgdGhpcy5wbG90U2VydmljZVxuICAgICAgLmdldENhblJlZG8kKClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3ViKSlcbiAgICAgIC5zdWJzY3JpYmUoKGNhblJlZG8pID0+IHtcbiAgICAgICAgdGhpcy5jYW5SZWRvUmVnaW9uID0gY2FuUmVkbztcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gICAgLy8gTWlycm9yIHRoZSByZWdpb24gc2VsZWN0aW9uIHNvIHRoZSByaWdodC1jbGljayBhY3Rpb24gZ3JvdXAgKGppdC11aSM4NSlcbiAgICAvLyBjYW4gcmVhZCBpdCBzeW5jaHJvbm91c2x5IHdoZW4gdGhlIG1lbnUgaXMgYnVpbHQuXG4gICAgdGhpcy5wbG90U2VydmljZVxuICAgICAgLmdldFNlbGVjdGVkU2hhcGVJbmRpY2VzJCgpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YikpXG4gICAgICAuc3Vic2NyaWJlKChpbmRpY2VzKSA9PiB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRpY2VzID0gaW5kaWNlcyB8fCBbXTtcbiAgICAgIH0pO1xuICAgIC8vIEludGVyYWN0aXZlIHBvaW50LXByb21wdCBzZWdtZW50YXRpb24gcnVucyBpbnNpZGUgdGhlIHJlbmRlcmVyIG9uIGVhY2hcbiAgICAvLyBjbGljazsgc3VyZmFjZSBpdHMgbGl2ZSBzdGF0dXMgKyBkb3dubG9hZCBwcm9ncmVzcyBpbiB0aGUgc2hhcmVkIGBzYW1gXG4gICAgLy8gdG9hc3Qgc28gdGhlIHVzZXIgc2VlcyBpdCB3b3JraW5nICh0aGUgZmlyc3QgY2xpY2sgcHVsbHMgdGhlIGVuY29kZXIpLlxuICAgIHRoaXMuc2FtUG9pbnRTdWIuYWRkKFxuICAgICAgdGhpcy5zYW1Qb2ludFRvb2wucHJvZ3Jlc3MkLnN1YnNjcmliZSgoZikgPT4ge1xuICAgICAgICB0aGlzLnNhbURvd25sb2FkaW5nID0gZiA+PSAwICYmIGYgPCAxO1xuICAgICAgICBpZiAoZiA+PSAwKSB0aGlzLnNhbVByb2dyZXNzID0gTWF0aC5taW4oMTAwLCBNYXRoLnJvdW5kKGYgKiAxMDApKTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSksXG4gICAgKTtcbiAgICB0aGlzLnNhbVBvaW50U3ViLmFkZChcbiAgICAgIHRoaXMuc2FtUG9pbnRUb29sLnN0YXR1cyQuc3Vic2NyaWJlKChtKSA9PiB7XG4gICAgICAgIHRoaXMuc2FtU3RhdHVzID0gbTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSksXG4gICAgKTtcbiAgICB0aGlzLnNhbVBvaW50U3ViLmFkZChcbiAgICAgIHRoaXMuc2FtUG9pbnRUb29sLmJ1c3kkLnN1YnNjcmliZSgoYnVzeSkgPT4ge1xuICAgICAgICB0aGlzLnNhbUJ1c3kgPSBidXN5O1xuICAgICAgICBpZiAoYnVzeSkgdGhpcy5zaG93U2FtVG9hc3QoJ1NBTSBwb2ludCBzZWdtZW50YXRpb24nKTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSksXG4gICAgKTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmdldFN0YWNrTG9hZGluZ1Byb2dyZXNzKCkuc3Vic2NyaWJlKChsb2FkaW5nUHJvZ3Jlc3MpID0+IHtcbiAgICAgIHRoaXMubG9hZGluZ1BlcmNlbnRhZ2UgPSBsb2FkaW5nUHJvZ3Jlc3M7XG4gICAgfSk7XG4gICAgdGhpcy5wbG90U2VydmljZS5pc1N0YWNrTG9hZGluZygpLnN1YnNjcmliZSgoc3RhY2tMb2FkaW5nKSA9PiB7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZyA9IHN0YWNrTG9hZGluZztcbiAgICB9KTtcbiAgICB0aGlzLnBsb3RXaWR0aFN1YnNjcmlwdGlvbiA9IHRoaXMuc3RhdGUuZ2V0UGFuZWxXaWR0aCQoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5wbG90U2VydmljZS5yZWxheW91dCgpO1xuICAgICAgLy8gVGhlIGludGVuc2l0eSBpbnNldCBpcyBhIHNlcGFyYXRlIFBsb3RseSBjaGFydCBpbiBhIGZsb2F0aW5nIHBhbmVsOyByZWZsb3dcbiAgICAgIC8vIGl0IHRvIGl0cyBjdXJyZW50IHNpemUgd2hlbiB0aGUgY2FudmFzIHJlc2l6ZXMsIGVsc2UgaXQga2VlcHMgdGhlIHN0YWxlXG4gICAgICAvLyBzaXplIGFuZCBibGFua3Mgb3V0LiBEZWZlciBhIHRpY2sgc28gdGhlIHBhbmVsIGxheW91dCBoYXMgc2V0dGxlZC5cbiAgICAgIGlmICh0aGlzLmhhc1Byb2ZpbGVzKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZW5kZXJJbnRlbnNpdHlJbnNldCgpLCAwKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmltZ0xvYWRpbmdNZXNzYWdlU3Vic2NyaXB0aW9uID0gdGhpcy5zdGF0ZS5nZXRJbWFnZUxvYWRpbmdNZXNzYWdlJCgpLnN1YnNjcmliZSgobWVzc2FnZSkgPT4ge1xuICAgICAgdGhpcy5sb2FkaW5nTWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgfSk7XG4gICAgdGhpcy5zdGF0ZVxuICAgICAgLmdldENhY2hlUHJvZ3Jlc3MkKClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3ViKSlcbiAgICAgIC5zdWJzY3JpYmUoKHByb2dyZXNzKSA9PiB7XG4gICAgICAgIHRoaXMuY2FjaGVQcm9ncmVzcyA9IHByb2dyZXNzO1xuICAgICAgfSk7XG4gICAgdGhpcy5pc1pvb21TdWJzY3JpcHRpb24gPSB0aGlzLnN0YXRlLmlzWm9vbSQoKS5zdWJzY3JpYmUoKHpvb20pID0+IHtcbiAgICAgIHRoaXMuem9vbSA9IHpvb207XG4gICAgfSk7XG4gICAgdGhpcy5maWxlbmFtZVN1YnNjcmlwdGlvbiA9IHRoaXMuc3RhdGUuZ2V0RmlsZW5hbWUkKCkuc3Vic2NyaWJlKChmaWxlbmFtZSkgPT4ge1xuICAgICAgaWYgKGZpbGVuYW1lKSB7XG4gICAgICAgIHRoaXMuZmlsZU5hbWUgPSBmaWxlbmFtZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmdldENvbG9ybWFwKCkuc3Vic2NyaWJlKChjb2xvcm1hcCkgPT4ge1xuICAgICAgdGhpcy5zZWxlY3RlZENvbG9ybWFwID0gY29sb3JtYXA7XG4gICAgfSk7XG4gICAgdGhpcy5wbG90U2VydmljZS5nZXRSZXZlcnNlU2NhbGUoKS5zdWJzY3JpYmUoKHJldmVyc2VzY2FsZSkgPT4ge1xuICAgICAgdGhpcy5yZXZlcnNlc2NhbGUgPSByZXZlcnNlc2NhbGU7XG4gICAgfSk7XG4gICAgdGhpcy5pbnRlbnNpdHlQcm9maWxlU3ViID0gdGhpcy5wbG90U2VydmljZS5nZXRJbnRlbnNpdHlQcm9maWxlJCgpLnN1YnNjcmliZSgocHJvZmlsZXMpID0+IHtcbiAgICAgIHRoaXMubGF0ZXN0UHJvZmlsZXMgPSBwcm9maWxlcztcbiAgICAgIHRoaXMuaGFzUHJvZmlsZXMgPSBwcm9maWxlcy5sZW5ndGggPiAwO1xuICAgICAgLy8gVGhlIHBhbmVsIGRpdiBpcyBiZWhpbmQgKm5nSWY9XCJoYXNQcm9maWxlc1wiLiBkZXRlY3RDaGFuZ2VzKCkgbWF0ZXJpYWxpemVzXG4gICAgICAvLyBpdCBzeW5jaHJvbm91c2x5ICh0aGUgc3Vic2NyaXB0aW9uIG1heSBmaXJlIG91dHNpZGUgQW5ndWxhcidzIHpvbmUg4oCUIGUuZy5cbiAgICAgIC8vIGZyb20gYW4gT1NEIGRyYWcg4oCUIHNvIENEIHdvdWxkbid0IHJ1biBvbiBpdHMgb3duKS4gVGhlbiByZW5kZXIgb24gdGhlIG5leHRcbiAgICAgIC8vIGFuaW1hdGlvbiBmcmFtZSwgQUZURVIgdGhlIGJyb3dzZXIgbGF5cyB0aGUgcGFuZWwgb3V0OiBhIHN5bmNocm9ub3VzIGRyYXdcbiAgICAgIC8vIGhpdHMgYSB6ZXJvLXNpemUgY29udGFpbmVyIG9uIGZpcnN0IGNyZWF0ZSBhbmQgUGxvdGx5IGtlZXBzIHRoYXQgc2l6ZSwgc29cbiAgICAgIC8vIHRoZSBpbnNldCBzdGF5cyBibGFuayBhbmQgbGl2ZSB1cGRhdGVzIHJlZHJhdyBpbnRvIHRoZSBzYW1lIHplcm8gYm94LlxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMucmVuZGVySW50ZW5zaXR5SW5zZXQoKSk7XG4gICAgfSk7XG4gICAgLy8gV2hlbiB0aGUgT1NEIHZpZXcgc2V0dGxlcyBhdCBhIG5ldyB6b29tL3BhbiwgcmUtc2FtcGxlIHRoZSBpbnRlbnNpdHkgbGluZXNcbiAgICAvLyBmcm9tIGEgY3JvcCBvZiB0aGUgdmlzaWJsZSByZWdpb24gc28gdGhlIGluc2V0IHJlZmxlY3RzIHRoZSB6b29tLWxldmVsXG4gICAgLy8gcmVzb2x1dGlvbiAoUGxvdGx5J3Mgb3duIGhpZ2gtZGVmIHpvb20gdXBkYXRlcyB0aGUgc2FtcGxpbmcgY2FjaGUgaW5saW5lKS5cbiAgICB0aGlzLnZpZXdwb3J0Q2hhbmdlU3ViID0gdGhpcy5wbG90U2VydmljZS5nZXRWaWV3cG9ydENoYW5nZSQoKS5zdWJzY3JpYmUoKHJvaSkgPT4ge1xuICAgICAgaWYgKHRoaXMuaGFzUHJvZmlsZXMgJiYgdGhpcy5pc0ltYWdlVmlldykge1xuICAgICAgICB0aGlzLnBsb3RTZXJ2aWNlLnJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaShyb2kueCwgcm9pLnksIHJvaS53aWR0aCwgcm9pLmhlaWdodCwgdGhpcy56SW5kZXgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucHJldmlld1N1YnNjcmlwdGlvbiA9IHRoaXMuc3RhdGUuZ2V0SW1hZ2VJbmZvJCgpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoaW1nSW5mbykgPT4ge1xuICAgICAgICBpZiAoaW1nSW5mbykge1xuICAgICAgICAgIHRoaXMuaW1hZ2VJbmZvID0gaW1nSW5mbztcbiAgICAgICAgICAvLyBTdGFjay1vbmx5IHBsb3QgdHlwZXMgKGlzb3N1cmZhY2UsIHNjYXR0ZXIzZCkgZGVwZW5kIG9uIHdoZXRoZXIgdGhpc1xuICAgICAgICAgIC8vIGZpbGUgaXMgYSBzdGFjayDigJQgcmVjb21wdXRlIHRoZSBzZWxlY3RvciBvcHRpb25zLlxuICAgICAgICAgIHRoaXMuY29tcHV0ZVBsb3RUeXBlT3B0aW9ucygpO1xuICAgICAgICAgIC8vIElmIHRoZSBhY3RpdmUgcGxvdCB0eXBlIGlzbid0IHZhbGlkIGZvciB0aGlzIGltYWdlIChlLmcuIGEgc2NhbGFyXG4gICAgICAgICAgLy8gdHlwZSBsaWtlIENvbnRvdXIgY2FycmllZCBvdmVyIHRvIGFuIFJHQiBpbWFnZSksIGZhbGwgYmFjayB0byBJbWFnZS5cbiAgICAgICAgICB0aGlzLnJlY29uY2lsZVNlbGVjdGVkUGxvdFR5cGUoKTtcbiAgICAgICAgICAvLyByZXNldCBzdGFjayBvcHRpb25zIHNlbGVjdGlvblxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdGFja09wdGlvbiA9IGltZ0luZm8uc2hvd1N0YWNrID8gdGhpcy5zdGFja09wdGlvbnNbMV0gOiB0aGlzLnN0YWNrT3B0aW9uc1swXTtcblxuICAgICAgICAgIHRoaXMuaXNHcmF5c2NhbGVFdmVudC5lbWl0KHRoaXMuaW1hZ2VJbmZvLmlzR3JheXNjYWxlKTtcbiAgICAgICAgICB0aGlzLmlzU3RhY2tFdmVudC5lbWl0KHRoaXMuaW1hZ2VJbmZvLmlzU3RhY2spO1xuICAgICAgICAgIC8vIFJlc2V0IHRvIHRoZSBkZWZhdWx0IDJEIEltYWdlIHZpZXcgd2hlbiBhIGRpZmZlcmVudCBpbWFnZSBpc1xuICAgICAgICAgIC8vIHNlbGVjdGVkIHdoaWxlIGEgM0QgdHlwZSBpcyBhY3RpdmUuXG4gICAgICAgICAgaWYgKCF0aGlzLmlzSGVhdG1hcCAmJiBpbWdJbmZvLmZpbGVOYW1lICE9PSB0aGlzLmxvYWRlZEZpbGVOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmlzSGVhdG1hcCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnBsb3RUeXBlID0gUGxvdFR5cGUuSU1BR0U7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUGxvdFR5cGUgPSBQbG90VHlwZS5JTUFHRTtcbiAgICAgICAgICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0UGxvdFR5cGUodGhpcy5wbG90VHlwZSk7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVN1cmZhY2UzZE1vZGUgPSAndHVybnRhYmxlJztcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5sb2FkZWRGaWxlTmFtZSA9IGltZ0luZm8uZmlsZU5hbWU7XG4gICAgICAgICAgdGhpcy5wbG90U2VydmljZS5zZXRJbWFnZU1ldGEodGhpcy5pbWFnZUluZm8uaW1hZ2VNZXRhKTtcbiAgICAgICAgICBjb25zdCB1cmxzID0gaW1nSW5mby51cmxzO1xuICAgICAgICAgIC8vIEEgbmV3ZXIgaW1hZ2UgQUxXQVlTIHByZWVtcHRzIGFuIGluLWZsaWdodCByZW5kZXIuIFRoaXMgd2FzXG4gICAgICAgICAgLy8gYGlmICghdGhpcy5ydW5uaW5nKWAsIHdoaWNoIERST1BQRUQgdGhlIG5ldyBpbWFnZSB3aGlsZSB0aGUgb2xkIG9uZVxuICAgICAgICAgIC8vIGZpbmlzaGVkOiBpZGVudGl0eSBhYm92ZSBoYWQgYWxyZWFkeSBmbGlwcGVkIHRvIHRoZSBuZXcgZmlsZSwgc28gdGhlXG4gICAgICAgICAgLy8gYXBwIHJlcG9ydGVkIGltYWdlIEIgYXMgbG9hZGVkIHdoaWxlIGltYWdlIEEgc3RheWVkIG9uIHNjcmVlbi4gV29yc2UsXG4gICAgICAgICAgLy8gYSBjb2xkIGltYWdlIGhvbGRzIHRoZSBzbG90IGZvciBpdHMgd2hvbGUgc2VydmVyLXNpZGUgY2FjaGUgZmlsbCwgc29cbiAgICAgICAgICAvLyBldmVyeSBjbGljayBmb3IgMS0yIG1pbnV0ZXMgd2FzIGRpc2NhcmRlZCBhZ2FpbnN0IGEgYmxhbmsgdmlld3BvcnRcbiAgICAgICAgICAvLyBhbmQgYSBcIkxvYWRpbmcgaW1hZ2UuLi5cIiBvdmVybGF5IHRoYXQgbmV2ZXIgcmVzb2x2ZWQuXG4gICAgICAgICAgaWYgKHVybHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gKyt0aGlzLnJlbmRlclRva2VuO1xuICAgICAgICAgICAgY29uc3QgaXNDdXJyZW50ID0gKCkgPT4gdGhpcy5yZW5kZXJUb2tlbiA9PT0gdG9rZW47XG4gICAgICAgICAgICBpZiAodGhpcy5ydW5uaW5nKSB7XG4gICAgICAgICAgICAgIC8vIFN0b3AgdGhlIHByZXZpb3VzIHJlbmRlcidzIGZyYW1lIHN0cmVhbWluZyAobmFwYXJpIHZvbHVtZS9zdXJmYWNlXG4gICAgICAgICAgICAgIC8vIHByZWxvYWQga2VlcHMgZmV0Y2hpbmcgb3RoZXJ3aXNlKSBhbmQgY2xlYXIgaXRzIHNoYXJwZW4gZmxhZy4gSXRzXG4gICAgICAgICAgICAgIC8vIGNhbGxiYWNrcyBhcmUgYWxyZWFkeSBpbmVydCB2aWEgdGhlIHRva2VuLCBzbyBpdCBjYW4gbmVpdGhlciBwYWludFxuICAgICAgICAgICAgICAvLyBub3IgcmVsZWFzZSB0aGUgb3ZlcmxheSB0aGlzIHJlbmRlciBub3cgb3ducy5cbiAgICAgICAgICAgICAgdGhpcy5wbG90U2VydmljZS5jYW5jZWxMb2FkaW5nPy4oKTtcbiAgICAgICAgICAgICAgdGhpcy5zaGFycGVuaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpbWFnZSBzaXplIOKAlCBtZWFzdXJlIHRoZSBwbG90IGRpdiBkaXJlY3RseSBzbyB0aGUgdG9vbGJhciBoZWlnaHQgaXMgZXhjbHVkZWRcbiAgICAgICAgICAgIGNvbnN0IHBsb3REaXY6IEhUTUxFbGVtZW50IHwgbnVsbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdk5hbWUpO1xuICAgICAgICAgICAgY29uc3Qgc2NyZWVuSGVpZ2h0ID0gcGxvdERpdj8ub2Zmc2V0SGVpZ2h0IHx8IDUwMDtcbiAgICAgICAgICAgIHRoaXMucGxvdFNlcnZpY2UucmVzZXQoKTtcbiAgICAgICAgICAgIHRoaXMuc3RhY2tMb2FkaW5nID0gaW1nSW5mby5pc1N0YWNrICYmIGltZ0luZm8uc2hvd1N0YWNrO1xuICAgICAgICAgICAgLy8gc2V0IG1heCBpbmRleCBvZiBzdGFjayDigJQgY29tcHV0ZWQgYmVmb3JlIHVwZGF0ZVpJbmRleCBzbyBhXG4gICAgICAgICAgICAvLyBmcmVzaCBzdGFjayAoc2hvcnRlciBvciBsb25nZXIgdGhhbiB3aGF0ZXZlciB3YXMgcHJldmlvdXNseVxuICAgICAgICAgICAgLy8gbG9hZGVkKSBjbGFtcHMgYWdhaW5zdCBJVFMgYm91bmRzLCBub3QgdGhlIHN0YWxlIG9uZXMuXG4gICAgICAgICAgICAvLyBPbmUgVVJMIHBlciBzbGljZSAoMC1pbmRleGVkKSwgc28gdGhlIGxhc3QgcmVhY2hhYmxlIGluZGV4IGlzXG4gICAgICAgICAgICAvLyBsZW5ndGgtMSDigJQgZWFybGllciBgbGVuZ3RoLTJgIGRyb3BwZWQgdGhlIGZpbmFsIHNsaWNlLlxuICAgICAgICAgICAgdGhpcy5tYXhJbmRleCA9IHVybHMubGVuZ3RoID4gMSA/IHVybHMubGVuZ3RoIC0gMSA6IDA7XG4gICAgICAgICAgICAvLyBPbmUtc2hvdCBoaW50OiBqdW1wIHN0cmFpZ2h0IHRvIGEgc3BlY2lmaWMgc2xpY2UgKGUuZy4gdGhlXG4gICAgICAgICAgICAvLyBmaWxlIHRoZSB1c2VyIGFjdHVhbGx5IGNsaWNrZWQgd2l0aGluIGEgbnVtYmVyZWQgc2VyaWVzKS5cbiAgICAgICAgICAgIC8vIENvbnN1bWVkIGltbWVkaWF0ZWx5IHNvIHJlZGVsaXZlcmluZyB0aGUgc2FtZSBJbWFnZUluZm8gbGF0ZXJcbiAgICAgICAgICAgIC8vIChhIHBsb3QtdHlwZSBzd2l0Y2gsIHJlbG9hZEFuZFBsb3QpIGRvZXNuJ3QgcmVzZXQgdGhlIHVzZXInc1xuICAgICAgICAgICAgLy8gY3VycmVudCBzY3J1YiBwb3NpdGlvbiBiYWNrIHRvIGl0LlxuICAgICAgICAgICAgaWYgKGltZ0luZm8uaW5pdGlhbFpJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHRoaXMuekluZGV4ID0gaW1nSW5mby5pbml0aWFsWkluZGV4O1xuICAgICAgICAgICAgICBpbWdJbmZvLmluaXRpYWxaSW5kZXggPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIHppbmRleCBpcyB3aXRoaW4gYm91bmRzXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVpJbmRleCh1cmxzKTtcbiAgICAgICAgICAgIHRoaXMucnVubmluZyA9IHRydWU7XG4gICAgICAgICAgICAvLyBNdWx0aS10aWVyIHJlbmRlcmluZyAoc21hbGwgYmx1cnJ5IHRpZXIgZmlyc3QsIHRoZW4gc2hhcnBlbiBpblxuICAgICAgICAgICAgLy8gcGxhY2UpIOKAlCBzZXF1ZW5jaW5nIGxpdmVzIGluIFJlbmRlck9yY2hlc3RyYXRvcjsgdGhpcyBjb21wb25lbnRcbiAgICAgICAgICAgIC8vIHN1cHBsaWVzIHRoZSBwaGFzZSByZW5kZXIgYW5kIG93bnMgdGhlIFVJIGZsYWdzIHZpYSBjYWxsYmFja3MuXG4gICAgICAgICAgICAvLyAzRCBwbG90IHR5cGVzIHJlbmRlciBzaW5nbGUtcGFzczogdGhlIGluLXBsYWNlIGxhcmdlIHBhc3MgZG9lc24ndFxuICAgICAgICAgICAgLy8gcmVidWlsZCBhIDNEIGdsLW1lc2ggaXNvc3VyZmFjZSwgc28gdGhlIHNoYXJwZW4gc3RlcCBibGFua2VkIGl0LlxuICAgICAgICAgICAgY29uc3QgaGFzU21hbGxUaWVyID1cbiAgICAgICAgICAgICAgdGhpcy5pc0hlYXRtYXAgJiZcbiAgICAgICAgICAgICAgKGltZ0luZm8uc21hbGxVcmxzPy5sZW5ndGggPz8gMCkgPT09IHVybHMubGVuZ3RoICYmXG4gICAgICAgICAgICAgIChpbWdJbmZvLnNtYWxsVXJscz8ubGVuZ3RoID8/IDApID4gMDtcbiAgICAgICAgICAgIGNvbnN0IHNtYWxsSW1nSW5mbyA9IGhhc1NtYWxsVGllciA/IHsgLi4uaW1nSW5mbywgdXJsczogaW1nSW5mby5zbWFsbFVybHMgYXMgc3RyaW5nW10gfSA6IG51bGw7XG5cbiAgICAgICAgICAgIC8vIEVudGVyIHBlci1zbGljZSBzdGFjayBtb2RlIHdpdGggdGhlIGdpdmVuIHNsaWNl4oaScmVnaW9ucyBtYXAgYW5kXG4gICAgICAgICAgICAvLyBzZWVkIHRoZSBcInByZXZpb3VzIHNoYXBlc1wiIGZyb20gdGhlIG5vdy1saXZlIHNsaWNlLiBlbnRlclN0YWNrTW9kZVxuICAgICAgICAgICAgLy8gbWFrZXMgekluZGV4J3Mgc2xpY2UgbGl2ZSBhbmQgcmVzZXRzIHVuZG8gKGppdC11aSM5MykuXG4gICAgICAgICAgICBjb25zdCBlbnRlclN0YWNrID0gKFxuICAgICAgICAgICAgICBzbGljZXM6IE1hcDxudW1iZXIsIFJlZ2lvbltdPixcbiAgICAgICAgICAgICAgbGF5b3V0OiAnY29tYmluZWQnIHwgJ3Blci1zbGljZS1maWxlJyxcbiAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnBsb3RTZXJ2aWNlLmVudGVyU3RhY2tNb2RlKHNsaWNlcywgdGhpcy56SW5kZXgsIGxheW91dCk7XG4gICAgICAgICAgICAgIGNvbnN0IHNoYXBlcyA9IHRoaXMucGxvdFNlcnZpY2VcbiAgICAgICAgICAgICAgICAuZ2V0UmVnaW9ucygpXG4gICAgICAgICAgICAgICAgLm1hcCgocmVnaW9uKSA9PiByZWdpb24uZ2V0U2hhcGUodGhpcy5wbG90U2VydmljZS5nZXRTaG93U2hhcGVMYWJlbCgpKSk7XG4gICAgICAgICAgICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0UHJldmlvdXNTaGFwZXMoc2hhcGVzKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IGFwcGx5Um9pID0gKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBGb2xkZXIgc3RhY2s6IGEgc3RhY2sgb2Ygc2VsZi1jb250YWluZWQgcGVyLXNsaWNlIGZpbGVzXG4gICAgICAgICAgICAgIC8vICh0aWxlZCA9PT0gZmFsc2U7IHNlZSBsb2FkU2VyaWVzQXNTdGFjaykuIEVhY2ggc2xpY2UtZmlsZSBtYXlcbiAgICAgICAgICAgICAgLy8gY2FycnkgaXRzIG93biBzaWJsaW5nIFwiPHN0ZW0+Lmdlb2pzb25cIiAocm9pSnNvblN0cnNbel0pLCBidXQgYVxuICAgICAgICAgICAgICAvLyBmcmVzaCBmb2xkZXIgd2l0aCBub25lIHlldCBsZWF2ZXMgcm9pSnNvblN0cnMgdW5kZWZpbmVkIOKAlCBrZXlcbiAgICAgICAgICAgICAgLy8gb2ZmIGB0aWxlZCA9PT0gZmFsc2VgLCBOT1Qgcm9pSnNvblN0cnMsIHNvIGFuIHVuYW5ub3RhdGVkXG4gICAgICAgICAgICAgIC8vIGZvbGRlciBzdGFjayBzdGlsbCBlbnRlcnMgdGhlIHBlci1zbGljZS1maWxlIGxheW91dCAoYW5kIHNhdmVzXG4gICAgICAgICAgICAgIC8vIGJhY2sgb25lIGdlb2pzb24gcGVyIHNsaWNlLWZpbGUpIHJhdGhlciB0aGFuIGZhbGxpbmcgdGhyb3VnaCB0b1xuICAgICAgICAgICAgICAvLyB0aGUgc2luZ2xlLWZpbGUgY29tYmluZWQgcGF0aCAoaml0LXVpIzkzKS5cbiAgICAgICAgICAgICAgaWYgKGltZ0luZm8uaXNTdGFjayAmJiBpbWdJbmZvLnRpbGVkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBlclNsaWNlID0gaW1nSW5mby5yb2lKc29uU3RycztcbiAgICAgICAgICAgICAgICBjb25zdCBzbGljZUNvdW50ID0gaW1nSW5mby51cmxzPy5sZW5ndGggPz8gcGVyU2xpY2U/Lmxlbmd0aCA/PyAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNsaWNlcyA9IG5ldyBNYXA8bnVtYmVyLCBSZWdpb25bXT4oKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB6ID0gMDsgeiA8IHNsaWNlQ291bnQ7IHorKykge1xuICAgICAgICAgICAgICAgICAgY29uc3QganNvbiA9IHBlclNsaWNlPy5bel0gPz8gbnVsbDtcbiAgICAgICAgICAgICAgICAgIHNsaWNlcy5zZXQoeiwganNvbiA/IHRoaXMucGxvdFNlcnZpY2UuaW1wb3J0UmVnaW9ucyhqc29uKSA6IFtdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZW50ZXJTdGFjayhzbGljZXMsICdwZXItc2xpY2UtZmlsZScpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBTaW5nbGUtZmlsZSB6LXN0YWNrOiBvbmUgc2libGluZyBnZW9qc29uIGhvbGRpbmcgZXZlcnkgc2xpY2Unc1xuICAgICAgICAgICAgICAvLyByZWdpb25zIGluZGV4ZWQgYnkgUXVQYXRoJ3MgZ2VvbWV0cnkucGxhbmUuei4gRW50ZXIgcGVyLXNsaWNlXG4gICAgICAgICAgICAgIC8vIG1vZGUgKHNhdmluZyBiYWNrIG9uZSBjb21iaW5lZCB6LWluZGV4ZWQgZ2VvanNvbikgd2hlbiB0aGVcbiAgICAgICAgICAgICAgLy8gZ2VvanNvbiBhY3R1YWxseSBjYXJyaWVzIHNsaWNlIGluZGljZXMsIG9yIHdoZW4gdGhlcmUncyBub3RoaW5nXG4gICAgICAgICAgICAgIC8vIHlldCB0byBhdXRob3IgYWdhaW5zdC4gQSBsZWdhY3kgZ2VvanNvbiB3aG9zZSByZWdpb25zIGFyZSBhbGwgb25cbiAgICAgICAgICAgICAgLy8gdGhlIGRlZmF1bHQgcGxhbmUgc3RheXMgZ2xvYmFsIChzaG93biBvbiBldmVyeSBzbGljZSkgc29cbiAgICAgICAgICAgICAgLy8gZXhpc3Rpbmcgc2luZ2xlLXBsYW5lIGFubm90YXRpb25zIGFyZW4ndCBjb25maW5lZCB0byBzbGljZSAwLlxuICAgICAgICAgICAgICBjb25zdCByb2lKc29uID0gaW1nSW5mby5yb2lKc29uU3RyO1xuICAgICAgICAgICAgICBpZiAoaW1nSW5mby5pc1N0YWNrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVnaW9ucyA9IHJvaUpzb24gPyB0aGlzLnBsb3RTZXJ2aWNlLmltcG9ydFJlZ2lvbnMocm9pSnNvbikgOiBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNTbGljZUluZm8gPSByZWdpb25zLnNvbWUoKHIpID0+IChyLnogPz8gMCkgIT09IDApO1xuICAgICAgICAgICAgICAgIGlmICghcm9pSnNvbiB8fCBoYXNTbGljZUluZm8pIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNsaWNlcyA9IG5ldyBNYXA8bnVtYmVyLCBSZWdpb25bXT4oKTtcbiAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgciBvZiByZWdpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHogPSByLnogPz8gMDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnVja2V0ID0gc2xpY2VzLmdldCh6KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1Y2tldCkgYnVja2V0LnB1c2gocik7XG4gICAgICAgICAgICAgICAgICAgIGVsc2Ugc2xpY2VzLnNldCh6LCBbcl0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZW50ZXJTdGFjayhzbGljZXMsICdjb21iaW5lZCcpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBTaW5nbGUtcGxhbmUgaW1hZ2UgKG9yIGEgbGVnYWN5IGdsb2JhbCB6LXN0YWNrIGdlb2pzb24pOiBvbmVcbiAgICAgICAgICAgICAgLy8gcmVnaW9uIHNldCBmb3IgdGhlIHdob2xlIGltYWdlLlxuICAgICAgICAgICAgICBpZiAocm9pSnNvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2lvbnMgPSB0aGlzLnBsb3RTZXJ2aWNlLmltcG9ydFJlZ2lvbnMocm9pSnNvbik7XG4gICAgICAgICAgICAgICAgdGhpcy5wbG90U2VydmljZS5zZXRSZWdpb25zKHJlZ2lvbnMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNoYXBlcyA9IHJlZ2lvbnMubWFwKChyZWdpb24pID0+XG4gICAgICAgICAgICAgICAgICByZWdpb24uZ2V0U2hhcGUodGhpcy5wbG90U2VydmljZS5nZXRTaG93U2hhcGVMYWJlbCgpKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0UHJldmlvdXNTaGFwZXMoc2hhcGVzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBMb2FkaW5nIGFuIGltYWdlJ3Mgc2F2ZWQgUk9JcyBpcyBub3QgYSB1c2VyIGVkaXQg4oCUIHN0YXJ0IHRoZVxuICAgICAgICAgICAgICAvLyB1bmRvIGhpc3RvcnkgZnJlc2ggc28gdGhlIGZpcnN0IHVuZG8gY2FuJ3Qgd2lwZSB0aGVtIChqaXQtdWkjODUpLlxuICAgICAgICAgICAgICB0aGlzLnBsb3RTZXJ2aWNlLnJlc2V0VW5kb0hpc3RvcnkoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgb3ZlcmxheVJlbGVhc2VkID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCByZWxlYXNlT3ZlcmxheSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKG92ZXJsYXlSZWxlYXNlZCkgcmV0dXJuO1xuICAgICAgICAgICAgICBvdmVybGF5UmVsZWFzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBpZiAoaW1nSW5mby5pc1N0YWNrICYmIGltZ0luZm8uc2hvd1N0YWNrKSB0aGlzLnN0YWNrTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICB0aGlzLnN0YXRlLnNldEltYWdlTG9hZGluZyhmYWxzZSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBuZXcgUmVuZGVyT3JjaGVzdHJhdG9yKHtcbiAgICAgICAgICAgICAgLy8gaW5QbGFjZT10cnVlIHVwZGF0ZXMgdGhlIGV4aXN0aW5nIHJlbmRlciBpbnN0ZWFkIG9mIHJlYnVpbGRpbmdcbiAgICAgICAgICAgICAgLy8gaXQsIHNvIHRoZSBjYW52YXMgZG9lc24ndCBibGFuayBkdXJpbmcgdGhlIHNtYWxs4oaSbGFyZ2Ugc3dhcC5cbiAgICAgICAgICAgICAgcmVuZGVyUGhhc2U6IChwaGFzZUluZm8sIGluUGxhY2UpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBTdXBlcnNlZGVkIEJFRk9SRSB0aGlzIHBoYXNlIHN0YXJ0ZWQg4oCUIGRvbid0IGV2ZW4gaXNzdWUgdGhlIGxvYWQuXG4gICAgICAgICAgICAgICAgLy8gUmVuZGVyT3JjaGVzdHJhdG9yIGNhbGxzIHJlbmRlclBoYXNlIG9uY2UgcGVyIHRpZXIgYW5kIHJldHJpZXMgdGhlXG4gICAgICAgICAgICAgICAgLy8gc2hhcnBlbiBwYXNzIG9uIGZhaWx1cmUsIHNvIGNoZWNraW5nIG9ubHkgYWZ0ZXIgdGhlIGxvYWQgcmVzb2x2ZXNcbiAgICAgICAgICAgICAgICAvLyB3b3VsZCBsZXQgYSBwcmVlbXB0ZWQgcmVuZGVyIGtlZXAgZmV0Y2hpbmcgc2xpY2VzL3RpbGVzIGZvciBhblxuICAgICAgICAgICAgICAgIC8vIGltYWdlIG5vYm9keSBpcyBsb29raW5nIGF0LlxuICAgICAgICAgICAgICAgIGlmICghaXNDdXJyZW50KCkpIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGxvdFNlcnZpY2UubG9hZChwaGFzZUluZm8sIHRoaXMuekluZGV4KS50aGVuKChsb2FkZWRJbWFnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgLy8gUHJlZW1wdGVkIHdoaWxlIHRoaXMgcGhhc2Ugd2FzIGxvYWRpbmcg4oCUIGRyb3AgaXQgb24gdGhlIGZsb29yLlxuICAgICAgICAgICAgICAgICAgaWYgKCFpc0N1cnJlbnQoKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IGEgbmV3ZXIgY2xpY2sgcmVhY2hpbmcgdXMgbWlkLXJlbmRlci5cbiAgICAgICAgICAgICAgICAgIGlmIChwaGFzZUluZm8uZmlsZU5hbWUgIT09IGxvYWRlZEltYWdlLmZpbGVuYW1lKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBsb3RTZXJ2aWNlLnBsb3QoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxvdERpdk5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGxvYWRlZEltYWdlLFxuICAgICAgICAgICAgICAgICAgICBwaGFzZUluZm8sXG4gICAgICAgICAgICAgICAgICAgIHNjcmVlbkhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbG90VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgaW5QbGFjZSxcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHNtYWxsU2hvd246ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzQ3VycmVudCgpKSByZXR1cm47IC8vIHN1cGVyc2VkZWQgYnkgYSBuZXdlciBpbWFnZVxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmaWxlIGlzIHN0aWxsIGJlaW5nIGNhY2hlZC9wcmVwYXJlZCBzZXJ2ZXItc2lkZSwga2VlcCB0aGUgZnVsbFxuICAgICAgICAgICAgICAgIC8vIGNhY2hlLXByb2dyZXNzIG92ZXJsYXkgdXAgaW5zdGVhZCBvZiBkcm9wcGluZyB0byB0aGUgdHJhbnNsdWNlbnQgXCJTaGFycGVuaW5nXG4gICAgICAgICAgICAgICAgLy8gcHJldmlldy4uLlwiIHNwaW5uZXIgb3ZlciBhIGJsYW5rIGNhbnZhcyAoYSBsYXJnZSB1bmNhY2hlZCBpbWFnZSByZW5kZXJzIGl0c1xuICAgICAgICAgICAgICAgIC8vIHNtYWxsIHByZXZpZXcgYmVmb3JlIGl0cyB0aWxlcyBleGlzdCkuIGZpbmlzaGVkKCkgcmVsZWFzZXMgdGhlIG92ZXJsYXkgb25jZVxuICAgICAgICAgICAgICAgIC8vIHRoZSByZWFsIHJlbmRlciBsYW5kcy5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0NhY2hpbmcpIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyBTbWFsbCB0aWVyIG9uIHNjcmVlbiDigJQgZHJvcCB0aGUgZnVsbCBvdmVybGF5IGJ1dCBrZWVwIGEgdHJhbnNsdWNlbnQgc3Bpbm5lciBzb1xuICAgICAgICAgICAgICAgIC8vIHRoZSBibHVycnkgcmVuZGVyIGlzbid0IG1pc3Rha2VuIGZvciB0aGUgZmluYWwgaW1hZ2UuXG4gICAgICAgICAgICAgICAgcmVsZWFzZU92ZXJsYXkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNoYXJwZW5pbmcgPSB0cnVlO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBzaGFycGVuU2V0dGxlZDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghaXNDdXJyZW50KCkpIHJldHVybjsgLy8gc3VwZXJzZWRlZCBieSBhIG5ld2VyIGltYWdlXG4gICAgICAgICAgICAgICAgdGhpcy5zaGFycGVuaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZpbmlzaGVkOiAoX3ZpYVNtYWxsLCBsb2dUYWcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzQ3VycmVudCgpKSByZXR1cm47IC8vIHN1cGVyc2VkZWQgYnkgYSBuZXdlciBpbWFnZVxuICAgICAgICAgICAgICAgIC8vIElkZW1wb3RlbnQg4oCUIHJlbGVhc2VzIG5vdyBpZiBzbWFsbFNob3duIGRlZmVycmVkIGl0IChjYWNoaW5nKSBvciB3YXMgc2tpcHBlZC5cbiAgICAgICAgICAgICAgICByZWxlYXNlT3ZlcmxheSgpO1xuICAgICAgICAgICAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGFwcGx5Um9pKCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cobG9nVGFnKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgc2hhcnBlbkZhaWxlZDogKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0N1cnJlbnQoKSkgcmV0dXJuOyAvLyBzdXBlcnNlZGVkIGJ5IGEgbmV3ZXIgaW1hZ2VcbiAgICAgICAgICAgICAgICAvLyBUaGUgc21hbGwgdGllciBzdGF5cyBvbiBzY3JlZW4gYXMgdGhlIGZhbGxiYWNrIOKAlCB0ZWxsIHRoZVxuICAgICAgICAgICAgICAgIC8vIHVzZXIgdGhlIHNoYXJwZXIgdmVyc2lvbiBpc24ndCBjb21pbmcuXG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCBlcnI/Lm1lc3NhZ2UgfHwgZXJyPy5zdGF0dXNUZXh0IHx8IFN0cmluZyhlcnIpO1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgICAgICAgIGtleTogdGhpcy52aXpBbGVydFRvYXN0S2V5LFxuICAgICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICd3YXJuJyxcbiAgICAgICAgICAgICAgICAgIHN1bW1hcnk6ICdQcmV2aWV3IG5vdCBzaGFycGVuZWQnLFxuICAgICAgICAgICAgICAgICAgZGV0YWlsOiBgVGhlIGZ1bGwtcmVzb2x1dGlvbiBwcmV2aWV3IGRpZCBub3QgbG9hZCAoJHttc2d9KS4gVGhlIGxvdy1yZXNvbHV0aW9uIHByZXZpZXcgaXMgc3RpbGwgc2hvd24uIFRyeSBjbGlja2luZyB0aGUgaW1hZ2UgYWdhaW4uYCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBhcHBseVJvaSgpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSkucmVuZGVyKGltZ0luZm8sIHNtYWxsSW1nSW5mbyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgY29uc3QgbXNnID0gZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCBlcnI/Lm1lc3NhZ2UgfHwgZXJyPy5zdGF0dXNUZXh0IHx8IFN0cmluZyhlcnIpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBvY2N1cmVkIHdoZW4gZ2V0dGluZyBpbWFnZSBpbmZvJywgZXJyKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgIGtleTogdGhpcy52aXpBbGVydFRvYXN0S2V5LFxuICAgICAgICAgIHN0aWNreTogdHJ1ZSxcbiAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICBzdW1tYXJ5OiAnQW4gZXJyb3Igb2NjdXJlZCcsXG4gICAgICAgICAgZGV0YWlsOiBgVGhlIGZvbGxvd2luZyBlcnJvciBvY2N1cmVkIHdoaWxlIGdldHRpbmcgaW1hZ2UgaW5mbzogJHttc2d9LlxuICAgICAgICAgICAgICAgICAgIFBsZWFzZSB0cnkgdG8gb3BlbiB0aGUgaW1hZ2UgYWdhaW4gdGhyb3VnaCB0aGUgZmlsZSBuYXZpZ2F0b3IuYCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc3RhY2tMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc3RhdGUuc2V0SW1hZ2VMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGxvdFNlcnZpY2UucmVzZXQoKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5wbG90Q29udGV4dE1lbnVMaXN0ZW5lciA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgY29uc3QgcGxvdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbG90RGl2TmFtZSk7XG4gICAgICBpZiAoIXBsb3RFbD8uY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpKSByZXR1cm47XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmNvbnRleHRNZW51SXRlbXMgPSB0aGlzLmJ1aWxkQ29udGV4dE1lbnVJdGVtcygpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuY29udGV4dE1lbnUuc2hvdyhldmVudCk7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIHRoaXMucGxvdENvbnRleHRNZW51TGlzdGVuZXIsIHRydWUpO1xuXG4gICAgdGhpcy5rZXlkb3duTGlzdGVuZXIgPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGlmICh0YXJnZXQudGFnTmFtZSA9PT0gJ0lOUFVUJyB8fCB0YXJnZXQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJyB8fCB0YXJnZXQuaXNDb250ZW50RWRpdGFibGUpIHJldHVybjtcbiAgICAgIC8vIFNBTSBwb2ludCBtb2RlOiBFbnRlciBjb21taXRzIHRoZSBvYmplY3QsIEVzYyBjbGVhcnMgdGhlIHByb21wdC5cbiAgICAgIGlmICh0aGlzLmFjdGl2ZURyYWdNb2RlID09PSAnc2FtUG9pbnQnICYmIChldmVudC5rZXkgPT09ICdFbnRlcicgfHwgZXZlbnQua2V5ID09PSAnRXNjYXBlJykpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB0aGlzLnBsb3RTZXJ2aWNlLmNvbW1pdFNhbVBvaW50cygpO1xuICAgICAgICAgIGVsc2UgdGhpcy5wbG90U2VydmljZS5jbGVhclNhbVBvaW50cygpO1xuICAgICAgICAgIHRoaXMuaGlkZVNhbVRvYXN0KCk7IC8vIHByb21wdCByZXNvbHZlZCDihpIgZGlzbWlzcyB0aGUgc3RhdHVzIHRvYXN0XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBSZWdpb24gaGlzdG9yeSAoaml0LXVpIzg1KTogQ3RybC9DbWQrWiB1bmRvZXM7IEN0cmwvQ21kK1NoaWZ0K1ogb3JcbiAgICAgIC8vIEN0cmwvQ21kK1kgcmVkb2VzLlxuICAgICAgaWYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkge1xuICAgICAgICBjb25zdCBrID0gZXZlbnQua2V5LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChrID09PSAneicgJiYgIWV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy51bmRvUmVnaW9uKCkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGsgPT09ICd6JyAmJiBldmVudC5zaGlmdEtleSkgfHwgayA9PT0gJ3knKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5yZWRvUmVnaW9uKCkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0RlbGV0ZScgfHwgZXZlbnQua2V5ID09PSAnQmFja3NwYWNlJyB8fCBldmVudC5rZXkgPT09ICdkJyB8fCBldmVudC5rZXkgPT09ICdEJykge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5kZWxldGVSZWdpb24oKSk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJysnIHx8IGV2ZW50LmtleSA9PT0gJz0nKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnpvb21JbigpKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnLScgfHwgZXZlbnQua2V5ID09PSAnXycpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuem9vbU91dCgpKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAncCcpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ3BhbicpKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnYicpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ3pvb21Ub0JveCcpKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAncicpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ2RyYXdyZWN0JykpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdmJykge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnZHJhd2Nsb3NlZHBhdGgnKSk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ3cnKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCd3YW5kJykpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdlJykge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnZXJhc2VWZXJ0ZXgnKSk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ3MnKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdzZWxlY3QnKSk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ2wnKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdkcmF3b3BlbnBhdGgnKSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5ZG93bkxpc3RlbmVyKTtcblxuICAgIHRoaXMud2hlZWxMaXN0ZW5lciA9IChldmVudDogV2hlZWxFdmVudCkgPT4ge1xuICAgICAgY29uc3QgcGxvdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbG90RGl2TmFtZSk7XG4gICAgICBpZiAoIXBsb3RFbD8uY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpKSByZXR1cm47XG4gICAgICAvLyBUaGUgSW1hZ2UgdmlldyBoYW5kbGVzIHNjcm9sbC16b29tIG5hdGl2ZWx5IChpdCByZXNwZWN0cyB0aGUgc2Nyb2xsXG4gICAgICAvLyBkZWx0YSkuIEludGVyY2VwdGluZyBoZXJlIHdvdWxkIGZpcmUgYSBmaXhlZCB6b29tIHN0ZXAgcGVyIHdoZWVsXG4gICAgICAvLyBldmVudCDigJQgZmFyIHRvbyBzZW5zaXRpdmUg4oCUIHNvIGxldCB0aGUgcmVuZGVyZXIgb3duIGl0LlxuICAgICAgaWYgKHRoaXMuaXNJbWFnZVZpZXcpIHJldHVybjtcbiAgICAgIC8vIDNEIHBsb3QgdHlwZXMgKHN1cmZhY2UsIHNjYXR0ZXIzZCwgaXNvc3VyZmFjZSkgcmVuZGVyIGluIGEgUGxvdGx5IHNjZW5lXG4gICAgICAvLyB0aGF0IG9yYml0cy96b29tcyBuYXRpdmVseSBvbiBzY3JvbGwuIFRoZSAyRCBzdGVwLXpvb20gZG9lc24ndCBhcHBseSBhbmRcbiAgICAgIC8vIHdvdWxkIHRocm93IChubyB4YXhpcyBvbiBhIHNjZW5lKSwgc28gbGV0IFBsb3RseSBoYW5kbGUgdGhlIHdoZWVsLlxuICAgICAgaWYgKCF0aGlzLmlzSGVhdG1hcCkgcmV0dXJuO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgaWYgKGV2ZW50LmRlbHRhWSA8IDApIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuem9vbUluKCkpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5kZWx0YVkgPiAwKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnpvb21PdXQoKSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLndoZWVsTGlzdGVuZXIsIHsgY2FwdHVyZTogdHJ1ZSwgcGFzc2l2ZTogZmFsc2UgfSk7XG5cbiAgICAvLyBEcmFnIGhhbmRsaW5nIGZvciB0aGUgZmxvYXRpbmcgaW50ZW5zaXR5LXByb2ZpbGUgcGFuZWwuXG4gICAgdGhpcy5wcm9maWxlRHJhZ01vdmVMaXN0ZW5lciA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBpZiAodGhpcy5wcm9maWxlUGFuZWxEcmFnZ2luZykge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMucHJvZmlsZVBhbmVsUG9zID0ge1xuICAgICAgICAgICAgeDogdGhpcy5wcm9maWxlUGFuZWxTdGFydC54ICsgKGUuY2xpZW50WCAtIHRoaXMucHJvZmlsZVBhbmVsU3RhcnQubXgpLFxuICAgICAgICAgICAgeTogdGhpcy5wcm9maWxlUGFuZWxTdGFydC55ICsgKGUuY2xpZW50WSAtIHRoaXMucHJvZmlsZVBhbmVsU3RhcnQubXkpLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnRvb2xiYXJEcmFnZ2luZykge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMudG9vbGJhclBvcyA9IHtcbiAgICAgICAgICAgIHg6IHRoaXMudG9vbGJhclN0YXJ0LnggKyAoZS5jbGllbnRYIC0gdGhpcy50b29sYmFyU3RhcnQubXgpLFxuICAgICAgICAgICAgeTogdGhpcy50b29sYmFyU3RhcnQueSArIChlLmNsaWVudFkgLSB0aGlzLnRvb2xiYXJTdGFydC5teSksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLnByb2ZpbGVEcmFnVXBMaXN0ZW5lciA9ICgpID0+IHtcbiAgICAgIHRoaXMucHJvZmlsZVBhbmVsRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMudG9vbGJhckRyYWdnaW5nID0gZmFsc2U7XG4gICAgfTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5wcm9maWxlRHJhZ01vdmVMaXN0ZW5lcik7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLnByb2ZpbGVEcmFnVXBMaXN0ZW5lcik7XG5cbiAgICAvLyBPbiBhbnkgd2luZG93IHJlc2l6ZSwgcmVmbG93IHRoZSBpbnRlbnNpdHkgaW5zZXQgdG8gaXRzIChmaXhlZCkgcGFuZWwgc2l6ZVxuICAgIC8vIG9uIHRoZSBuZXh0IGZyYW1lLCBvbmNlIGxheW91dCBoYXMgc2V0dGxlZC4gV2l0aG91dCB0aGlzIHRoZSBpbnNldCBjYW4gYmVcbiAgICAvLyBsZWZ0IGF0IGEgc3RhbGUvemVybyBzaXplIGJ5IGEgbWlkLXJlZmxvdyByZXNpemUgYW5kIHN0b3Agc2hvd2luZy5cbiAgICB0aGlzLnByb2ZpbGVSZXNpemVMaXN0ZW5lciA9ICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5oYXNQcm9maWxlcykgcmV0dXJuO1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMucmVuZGVySW50ZW5zaXR5SW5zZXQoKSk7XG4gICAgfTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5wcm9maWxlUmVzaXplTGlzdGVuZXIpO1xuICB9XG5cbiAgb25Qcm9maWxlUGFuZWxEcmFnU3RhcnQoZTogTW91c2VFdmVudCkge1xuICAgIHRoaXMucHJvZmlsZVBhbmVsRHJhZ2dpbmcgPSB0cnVlO1xuICAgIHRoaXMucHJvZmlsZVBhbmVsU3RhcnQgPSB7XG4gICAgICBteDogZS5jbGllbnRYLFxuICAgICAgbXk6IGUuY2xpZW50WSxcbiAgICAgIHg6IHRoaXMucHJvZmlsZVBhbmVsUG9zLngsXG4gICAgICB5OiB0aGlzLnByb2ZpbGVQYW5lbFBvcy55LFxuICAgIH07XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgLyoqIEdyYWIgdGhlIHRvb2xiYXIgaGFuZGxlOiBkZXRhY2ggaXQgaW50byBhIGZsb2F0aW5nIHdpbmRvdyAoaWYgc3RpbGwgZG9ja2VkKVxuICAgKiAgYW5kIHN0YXJ0IGRyYWdnaW5nLiAqL1xuICBvblRvb2xiYXJEcmFnU3RhcnQoZTogTW91c2VFdmVudCkge1xuICAgIGlmICghdGhpcy50b29sYmFyRmxvYXRpbmcpIHtcbiAgICAgIHRoaXMudG9vbGJhckZsb2F0aW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMudG9vbGJhclBvcyA9IHsgeDogOCwgeTogOCB9O1xuICAgIH1cbiAgICB0aGlzLnRvb2xiYXJEcmFnZ2luZyA9IHRydWU7XG4gICAgdGhpcy50b29sYmFyU3RhcnQgPSB7XG4gICAgICBteDogZS5jbGllbnRYLFxuICAgICAgbXk6IGUuY2xpZW50WSxcbiAgICAgIHg6IHRoaXMudG9vbGJhclBvcy54LFxuICAgICAgeTogdGhpcy50b29sYmFyUG9zLnksXG4gICAgfTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICAvKiogU25hcCB0aGUgZmxvYXRpbmcgdG9vbGJhciBiYWNrIHRvIGl0cyBkb2NrZWQgcG9zaXRpb24gYWNyb3NzIHRoZSB0b3AuICovXG4gIGRvY2tUb29sYmFyKCkge1xuICAgIHRoaXMudG9vbGJhckZsb2F0aW5nID0gZmFsc2U7XG4gIH1cblxuICAvKiogUmVuZGVyIHRoZSBpbnRlbnNpdHkgaW5zZXQgY2hhcnQgZnJvbSB0aGUgbGF0ZXN0IHByb2ZpbGUgZGF0YS4gVGhlIGFjdHVhbFxuICAgKiAgY2hhcnRpbmcgaXMgb3duZWQgYnkgdGhlIHZpc3VhbGl6ZXIgc2VydmljZSDigJQgdGhlIGNvbXBvbmVudCBqdXN0IGRlY2lkZXNcbiAgICogIHdoZW4gKHByb2ZpbGUgbW9kZSArIGEgZnJlc2ggcHJvZmlsZSkuICovXG4gIHByaXZhdGUgcmVuZGVySW50ZW5zaXR5SW5zZXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc1Byb2ZpbGVzKSByZXR1cm47XG4gICAgdGhpcy5wbG90U2VydmljZS5yZW5kZXJJbnRlbnNpdHlJbnNldCh0aGlzLmludGVuc2l0eUluc2V0RGl2LCB0aGlzLmxhdGVzdFByb2ZpbGVzKTtcbiAgfVxuXG4gIC8qKiBUb29sYmFyIFwiSW50ZW5zaXR5XCIgZ3JvdXA6IGFkZCBhbm90aGVyIGxpbmUgUk9JIChuZXh0IGJyaWdodCBjb2xvdXIpLiAqL1xuICBhc3luYyBhZGRQcm9maWxlTGluZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBQYXJrIHRoZSBmbG9hdGluZyBpbnNldCBuZWFyIHRoZSBwbG90J3MgdG9wLXJpZ2h0IHdoZW4gdGhlIGZpcnN0IGxpbmUgaXNcbiAgICAvLyBhZGRlZCAoaXQncyBwb3NpdGlvbjpmaXhlZCwgc28gdXNlIHZpZXdwb3J0IGNvb3JkcyBmcm9tIHRoZSBwbG90IHJlY3QpLlxuICAgIGlmICghdGhpcy5oYXNQcm9maWxlcykge1xuICAgICAgY29uc3QgcmVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdk5hbWUpPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHRoaXMucHJvZmlsZVBhbmVsUG9zID0gcmVjdFxuICAgICAgICA/IHsgeDogTWF0aC5tYXgoMTAsIHJlY3QucmlnaHQgLSAzMDApLCB5OiByZWN0LnRvcCArIDEwIH1cbiAgICAgICAgOiB7IHg6IDIwLCB5OiA3MCB9O1xuICAgIH1cbiAgICAvLyBJbWFnZSAoT1NEKSBtb2RlOiBQbG90bHkgbmV2ZXIgcmVuZGVyZWQsIHNvIGl0IGhhcyBubyBwaXhlbCBjYWNoZSAvIGV4dGVudC5cbiAgICAvLyBMb2FkIHRoZSBjdXJyZW50IHNsaWNlJ3MgZnJhbWVzIGZvciBzYW1wbGluZyArIGxpbmUgcGxhY2VtZW50IGZpcnN0LlxuICAgIGlmICh0aGlzLmlzSW1hZ2VWaWV3ICYmIHRoaXMuaW1hZ2VJbmZvKSB7XG4gICAgICBhd2FpdCB0aGlzLnBsb3RTZXJ2aWNlLmVuc3VyZUludGVuc2l0eVNhbXBsaW5nKHRoaXMuaW1hZ2VJbmZvLCB0aGlzLnpJbmRleCk7XG4gICAgfVxuICAgIGNvbnN0IHJlZ2lvbiA9IHRoaXMucGxvdFNlcnZpY2UuZ2V0SW50ZW5zaXR5Q29udHJvbHMoKT8uYWRkUHJvZmlsZUxpbmUoKTtcbiAgICAvLyBBdXRvLXNlbGVjdCB0aGUgbmV3IGxpbmUgb24gdGhlIGFjdGl2ZSBiYWNrZW5kIChQbG90bHkgaGFuZGxlcyAvIE9TRFxuICAgIC8vIGhpZ2hsaWdodCkgc28gaXQncyByZWFkeSB0byBtb3ZlIG9yIGRlbGV0ZSBpbW1lZGlhdGVseS5cbiAgICBpZiAocmVnaW9uKSB7XG4gICAgICB0aGlzLnBsb3RTZXJ2aWNlLnNlbGVjdFJlZ2lvbihyZWdpb24pO1xuICAgICAgLy8gT1NEIG9ubHkgZHJhd3MgYSBzZWxlY3RlZCByZWdpb24ncyBoYW5kbGVzIGluIGFuIGVkaXQgbW9kZSwgc28gYSBsaW5lIGluXG4gICAgICAvLyAnbm9uZScgbW9kZSBsb29rcyB1bnNlbGVjdGVkLiBTd2l0Y2ggdG8gJ3NlbGVjdCcgc28gdGhlIG5ldyBsaW5lIHNob3dzXG4gICAgICAvLyBpdHMgZW5kcG9pbnQgaGFuZGxlcyBhbmQgY2FuIGJlIGRyYWdnZWQvZGVsZXRlZCByaWdodCBhd2F5LlxuICAgICAgaWYgKHRoaXMuaXNJbWFnZVZpZXcgJiYgdGhpcy5hY3RpdmVEcmFnTW9kZSAhPT0gJ3NlbGVjdCcpIHtcbiAgICAgICAgdGhpcy50b2dnbGVEcmFnTW9kZSgnc2VsZWN0Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgLy8gTGVhdmUgdGhlIGxpdmUgc2V0IHNvIHRoZSBuZXh0LW9sZGVzdCB2aXN1YWxpemVyIHBpY2tzIHVwIHRoZSBvdXRsZXRzLlxuICAgIFZpc3VhbGl6ZXJDb21wb25lbnQubGl2ZUluc3RhbmNlcy5kZWxldGUodGhpcyk7XG4gICAgdGhpcy5zY3J1YmJlci5jYW5jZWwoKTtcbiAgICB0aGlzLnNhbVBvaW50U3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgaWYgKHRoaXMucGxvdENvbnRleHRNZW51TGlzdGVuZXIpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIHRoaXMucGxvdENvbnRleHRNZW51TGlzdGVuZXIsIHRydWUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5rZXlkb3duTGlzdGVuZXIpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlkb3duTGlzdGVuZXIpO1xuICAgIH1cbiAgICBpZiAodGhpcy53aGVlbExpc3RlbmVyKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLndoZWVsTGlzdGVuZXIsIHRydWUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcm9maWxlRHJhZ01vdmVMaXN0ZW5lcikge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMucHJvZmlsZURyYWdNb3ZlTGlzdGVuZXIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcm9maWxlRHJhZ1VwTGlzdGVuZXIpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5wcm9maWxlRHJhZ1VwTGlzdGVuZXIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcm9maWxlUmVzaXplTGlzdGVuZXIpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLnByb2ZpbGVSZXNpemVMaXN0ZW5lcik7XG4gICAgfVxuICAgIGlmICh0aGlzLmludGVuc2l0eVByb2ZpbGVTdWIpIHtcbiAgICAgIHRoaXMuaW50ZW5zaXR5UHJvZmlsZVN1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy52aWV3cG9ydENoYW5nZVN1Yikge1xuICAgICAgdGhpcy52aWV3cG9ydENoYW5nZVN1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLnVuc3ViLm5leHQoKTtcbiAgICB0aGlzLnVuc3ViLmNvbXBsZXRlKCk7XG4gICAgaWYgKHRoaXMucHJldmlld1N1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5wcmV2aWV3U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnBsb3RXaWR0aFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5wbG90V2lkdGhTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaW1hZ2VMb2FkaW5nU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmltYWdlTG9hZGluZ1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbWdMb2FkaW5nTWVzc2FnZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5pbWdMb2FkaW5nTWVzc2FnZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1pvb21TdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuaXNab29tU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmF1dG9zY2FsZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5hdXRvc2NhbGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZmlsZW5hbWVTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZmlsZW5hbWVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5wbG90U2VydmljZS51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIGhhc1JlZ2lvbnMoKTogYm9vbGVhbiB7XG4gICAgLy8gVXNlIHRoZSBjb250cmFjdCdzIGZyYW1ld29yay1uZXV0cmFsIHJlZ2lvbiBhY2Nlc3Nvciwgbm90IHRoZSByYXdcbiAgICAvLyBQbG90bHktc2hhcGVkIGdldFNoYXBlcygpIOKAlCB0aGUgY29tcG9uZW50IG9ubHkgbmVlZHMgdG8ga25vdyB3aGV0aGVyIGFueVxuICAgIC8vIHJlZ2lvbiBleGlzdHMsIGFuZCBtdXN0IG5vdCBkZXBlbmQgb24gYSBiYWNrZW5kJ3Mgd2lyZSBmb3JtYXQuXG4gICAgcmV0dXJuIHRoaXMucGxvdFNlcnZpY2UuZ2V0UmVnaW9ucygpLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGluIG1haW5GYWNhZGUuY29uZmlnUmVxdWVzdCgpIC0gRE8gTk9UIERFTEVURVxuICAgKi9cbiAgcHVibGljIGdldFJlZ2lvblBvbHlnb25zKCk6IFBvbHlnb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucGxvdFNlcnZpY2UuZ2V0UmVnaW9uUG9seWdvbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgdGhlIGNvbG9yIHNjYWxlIHR5cGU6IGNhbGxlZCBieSB0aGUgY29sb3Igc2NhbGUgc2VsZWN0IGJ1dHRvblxuICAgKiBAcGFyYW0gZXZlbnRcbiAgICovXG4gIHRvZ2dsZVJldmVyc2VTY2FsZSgpIHtcbiAgICB0aGlzLnJldmVyc2VzY2FsZSA9ICF0aGlzLnJldmVyc2VzY2FsZTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFJldmVyc2VTY2FsZSh0aGlzLnJldmVyc2VzY2FsZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IGEgY29sb3IgbWFwOiBjYWxsZWQgYnkgdGhlIGNvbG9yIG1hcCBkcm9wZG93biBidXR0b25cbiAgICogQHBhcmFtIGNvbG9ybWFwTm9kZVxuICAgKi9cbiAgc2VsZWN0Q29sb3JtYXAoY29sb3JtYXBOb2RlOiBUcmVlTm9kZSkge1xuICAgIGlmICghY29sb3JtYXBOb2RlLmNoaWxkcmVuKSB7XG4gICAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldENvbG9ybWFwKGNvbG9ybWFwTm9kZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIE9wZW4gdGhlIENoYW5uZWxzICYgSGlzdG9ncmFtIGRpYWxvZyAodG9vbGJhciBidXR0b24pLiAqL1xuICBvcGVuQ2hhbm5lbEhpc3RvZ3JhbSgpIHtcbiAgICB0aGlzLnNob3dDaGFubmVsSGlzdG9ncmFtID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBPcGVuIHRoZSBSZWdpb24gRWRpdG9yIGRpYWxvZyAodG9vbGJhciBidXR0b24pLiBUaGUgZWRpdG9yIHN0YXlzIGxpbmtlZCB0b1xuICAgKiAgdGhpcyBwbG90dGluZyBpbnN0YW5jZSB0aHJvdWdoIHRoZSByb290IFJlZ2lvblN0b3JlIHNpbmdsZXRvbiwgc28gaXQgd29ya3NcbiAgICogIHRoZSBzYW1lIGFzIHRoZSBmb3JtZXIgcmlnaHQtcGFuZWwgUmVnaW9ucyB0YWIuICovXG4gIG9wZW5SZWdpb25FZGl0b3IoKSB7XG4gICAgLy8gU2l6ZSB0aGUgZGlhbG9nIHRvIG1hdGNoIHRoZSBob3N0J3MgY29uZmlndXJlZCBlbGVtZW50IChlLmcuIHRoZSBhcHAnc1xuICAgIC8vIHJpZ2h0IHBhbmVsKSBhdCBvcGVuIHRpbWUuIE1lYXN1cmVkIG9uY2Ug4oCUIGl0IGludGVudGlvbmFsbHkgZG9lcyBub3RcbiAgICAvLyB0cmFjayBsYXRlciBicm93c2VyL3NwbGl0IHJlc2l6ZXMuIEZhbGxzIGJhY2sgdG8gYSBxdWFydGVyIG9mIHRoZSBwYWdlXG4gICAgLy8gd2hlbiBubyBzZWxlY3RvciBpcyBjb25maWd1cmVkIG9yIHRoZSBlbGVtZW50IGlzbid0IHByZXNlbnQuXG4gICAgY29uc3Qgc2VsZWN0b3IgPSB0aGlzLnZpekNvbmZpZz8ucmVnaW9uRWRpdG9yV2lkdGhTZWxlY3RvcjtcbiAgICBjb25zdCB3aWR0aCA9IHNlbGVjdG9yXG4gICAgICA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KHNlbGVjdG9yKT8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGhcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMucmVnaW9uRWRpdG9yV2lkdGggPSB3aWR0aCAmJiB3aWR0aCA+IDAgPyBgJHtNYXRoLnJvdW5kKHdpZHRoKX1weGAgOiAnMjV2dyc7XG4gICAgdGhpcy5zaG93UmVnaW9uRWRpdG9yID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYnkgdGhlIHN0YWNrL3NpbmdsZSBpbWFnZSBkcm9wZG93biBidXR0b25cbiAgICogQHBhcmFtIHNob3dzdGFja1xuICAgKi9cbiAgc2VsZWN0U3RhY2tPcHRpb24oc2VsZWN0ZWRTdGFja09wdGlvbjogYW55KSB7XG4gICAgY29uc3Qgc2hvd3N0YWNrID0gc2VsZWN0ZWRTdGFja09wdGlvbi52YWwgPT09ICd0cnVlJztcbiAgICB0aGlzLnNlbGVjdGVkU3RhY2tPcHRpb24gPSBzZWxlY3RlZFN0YWNrT3B0aW9uO1xuICAgIGNvbnNvbGUubG9nKCdzZWxlY3RlZCBzdGFjayBvcHRpb24nICsgSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3RlZFN0YWNrT3B0aW9uKSk7XG4gICAgdGhpcy5zdGFja0xvYWRpbmcgPSBzaG93c3RhY2s7XG4gICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUxvYWRpbmcoIXNob3dzdGFjayk7XG4gICAgLy8gU3RhY2sgbW9kZSBpcyBhbHdheXMgYSAyRCBoZWF0bWFwIOKAlCByZXNldCBzdXJmYWNlIG1vZGUgaWYgYWN0aXZlXG4gICAgaWYgKCF0aGlzLmlzSGVhdG1hcCkge1xuICAgICAgdGhpcy5pc0hlYXRtYXAgPSB0cnVlO1xuICAgICAgdGhpcy5wbG90VHlwZSA9IFBsb3RUeXBlLkhFQVRNQVA7XG4gICAgICB0aGlzLnNlbGVjdGVkUGxvdFR5cGUgPSBQbG90VHlwZS5IRUFUTUFQO1xuICAgICAgdGhpcy5wbG90U2VydmljZS5zZXRQbG90VHlwZSh0aGlzLnBsb3RUeXBlKTtcbiAgICB9XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRTaG93U3RhY2soc2hvd3N0YWNrKTtcbiAgfVxuXG4gIHVwZGF0ZVpJbmRleCh1cmxzPzogc3RyaW5nW10pIHtcbiAgICBpZiAodGhpcy56SW5kZXggPiB0aGlzLm1heEluZGV4KSB7XG4gICAgICB0aGlzLnpJbmRleCA9IHRoaXMubWF4SW5kZXg7XG4gICAgfVxuICAgIGlmICh0aGlzLnpJbmRleCA8IDApIHtcbiAgICAgIHRoaXMuekluZGV4ID0gMDtcbiAgICB9XG4gICAgaWYgKHVybHMpIHtcbiAgICAgIGlmICh0aGlzLnpJbmRleCA+IHVybHM/Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLnpJbmRleCA9IDA7XG4gICAgICAgIHRoaXMubWF4SW5kZXggPSB1cmxzLmxlbmd0aCAtIDE7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0WkluZGV4KHRoaXMuekluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXZlIHotc2xpY2Ugc2NydWIgZm9yIHRoZSBJbWFnZSB2aWV3OiB0aGUgcmVuZGVyZXIgc3dhcHMgdGhlIGRpc3BsYXllZFxuICAgKiBzbGljZSBpbiBwbGFjZSAobm8gcmUtbW91bnQpLCBzbyBkcmFnZ2luZyB0aGUgc2xpZGVyIHN0ZXBzIHRocm91Z2ggdGhlXG4gICAqIHN0YWNrIHRoZSBzYW1lIHdheSB0aGUgaGVhdG1hcCBmcmFtZSBzbGlkZXIgZG9lcy5cbiAgICovXG4gIG9uWlNsaWRlKHo6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh6ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICB0aGlzLnpJbmRleCA9IHo7XG4gICAgdGhpcy5zY3J1YmJlci5jb21taXQoeik7XG4gICAgLy8gS2VlcCB0aGUgaW50ZW5zaXR5IGluc2V0IGluIHN5bmMgd2l0aCB0aGUgZGlzcGxheWVkIHNsaWNlIChJbWFnZS9PU0QgbW9kZSxcbiAgICAvLyB3aGVyZSB0aGUgcHJvZmlsZSBzYW1wbGVyIGlzIGZlZCBmcm9tIHRoZSBsb2FkZWQgcHJldmlldyBmcmFtZXMpLlxuICAgIGlmICh0aGlzLmhhc1Byb2ZpbGVzICYmIHRoaXMuaXNJbWFnZVZpZXcgJiYgdGhpcy5pbWFnZUluZm8pIHtcbiAgICAgIHRoaXMucGxvdFNlcnZpY2UuZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcodGhpcy5pbWFnZUluZm8sIHopO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMaXZlIChkZWJvdW5jZWQpIHNjcnViIHdoaWxlIGRyYWdnaW5nIHRoZSBJbWFnZS12aWV3IHotc2xpZGVyOiB1cGRhdGUgdGhlXG4gICAqIHNsaWNlIGFzIHRoZSB1c2VyIGRyYWdzLCBidXQgY29hbGVzY2UgcmFwaWQgY2hhbmdlcyBzbyB3ZSBkb24ndCBmaXJlIGFcbiAgICogc2xpY2Ugc3dhcCBvbiBldmVyeSBwaXhlbC4gVGhlIGZpbmFsIHZhbHVlIGFsc28gbGFuZHMgdmlhIG9uWlNsaWRlIChvblNsaWRlRW5kKS5cbiAgICovXG4gIG9uWlNjcnViKHo6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh6ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICB0aGlzLnpJbmRleCA9IHo7XG4gICAgdGhpcy5zY3J1YmJlci5zY3J1Yih6KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBLZXlib2FyZCBzdGFjayBuYXZpZ2F0aW9uOiDihpAv4oaSIHN0ZXAgdGhlIHotc2xpY2UgaW4gdGhlIEltYWdlIHZpZXcsIHRoZSBzYW1lXG4gICAqIHdheSB0aGUgc2xpZGVyIGRvZXMuIE9ubHkgYWN0aXZlIGZvciBhIGxvYWRlZCBzdGFjayBpbiBJbWFnZSB2aWV3LCBhbmRcbiAgICogaWdub3JlZCB3aGlsZSBhIGZvcm0gZmllbGQgaXMgZm9jdXNlZCBzbyB0eXBpbmcgaXNuJ3QgaGlqYWNrZWQuIFVwL0Rvd24gYXJlXG4gICAqIGxlZnQgdG8gT3BlblNlYWRyYWdvbiAocGFubmluZykuXG4gICAqL1xuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIG9uS2V5ZG93bihlOiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGUua2V5ICE9PSAnQXJyb3dMZWZ0JyAmJiBlLmtleSAhPT0gJ0Fycm93UmlnaHQnKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmltYWdlSW5mbz8uaXNTdGFjayB8fCAhdGhpcy5pc0ltYWdlVmlldykgcmV0dXJuO1xuICAgIGNvbnN0IHQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKHQgJiYgKC9eKElOUFVUfFRFWFRBUkVBfFNFTEVDVCkkLy50ZXN0KHQudGFnTmFtZSkgfHwgdC5pc0NvbnRlbnRFZGl0YWJsZSkpIHJldHVybjtcbiAgICAvLyBUaGUgc2xpY2Ugc2xpZGVyIGhhbmRsZXMgYXJyb3dzIG5hdGl2ZWx5IHdoZW4gZm9jdXNlZCAoYWxzbyBhICsxIHN0ZXApIOKAlFxuICAgIC8vIHNraXAgaGVyZSBzbyB3ZSBkb24ndCBkb3VibGUtc3RlcCBpdC5cbiAgICBpZiAodCAmJiAodC5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PT0gJ3NsaWRlcicgfHwgdC5jbG9zZXN0KCcucC1zbGlkZXInKSkpIHJldHVybjtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5zdGVwU2xpY2UoZS5rZXkgPT09ICdBcnJvd1JpZ2h0JyA/IDEgOiAtMSk7XG4gIH1cblxuICAvKiogTW92ZSB0aGUgZGlzcGxheWVkIHNsaWNlIGJ5IGBkZWx0YWAsIGNsYW1wZWQgdG8gdGhlIHN0YWNrIGJvdW5kcy4gKi9cbiAgc3RlcFNsaWNlKGRlbHRhOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gTWF0aC5taW4odGhpcy5tYXhJbmRleCwgTWF0aC5tYXgoMCwgdGhpcy56SW5kZXggKyBkZWx0YSkpO1xuICAgIGlmIChuZXh0ID09PSB0aGlzLnpJbmRleCkgcmV0dXJuO1xuICAgIHRoaXMub25aU2xpZGUobmV4dCk7XG4gIH1cblxuICByZWxvYWRBbmRQbG90KCkge1xuICAgIHRoaXMuc3RhdGUuc2V0SW1hZ2VMb2FkaW5nKHRydWUpO1xuICAgIC8vIFJlLWRyaXZlIHRoZSByZW5kZXIgcGlwZWxpbmUgZnJvbSB0aGUgY3VycmVudCBpbWFnZSBpbmZvICh0aGUgc291cmNlIG9mXG4gICAgLy8gdHJ1dGgsIHdpdGggcmVhbCB1cmxzL2ZpbGVOYW1lKS4gRG9uJ3QgdXNlIHBsb3RTZXJ2aWNlLnJlbG9hZEFuZFBsb3QoKTpcbiAgICAvLyB0aGF0IHJlYnVpbGRzIHRoZSBpbmZvIGZyb20gdGhlIHJlbmRlcmVyJ3MgaW50ZXJuYWwgc3RhdGUsIHdoaWNoIGNhbiBiZVxuICAgIC8vIHN0YWxlIChlLmcuIGFmdGVyIHN3aXRjaGluZyBwbG90IHR5cGUgSW1hZ2UgLT4gSGVhdG1hcCkgYW5kIHJlLWVtaXRcbiAgICAvLyBlbXB0eS9vbGQgdXJscywgZmFpbGluZyB0byBoYW5kIHRoZSBkaXYgb3ZlciB0byB0aGUgbmV3IHJlbmRlcmVyLlxuICAgIGlmICh0aGlzLmltYWdlSW5mbykge1xuICAgICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUluZm8odGhpcy5pbWFnZUluZm8pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBsb3RTZXJ2aWNlLnJlbG9hZEFuZFBsb3QoKTtcbiAgICB9XG4gIH1cbiAgY2FuY2VsTG9hZGluZygpIHtcbiAgICAvLyBTdG9wIGFueSBpbi1mbGlnaHQgZnJhbWUgc3RyZWFtaW5nIChuYXBhcmktanMgdm9sdW1lL3N1cmZhY2UgcHJlbG9hZCkgc28gdGhlIGZldGNoIGxvb3BzXG4gICAgLy8gYWN0dWFsbHkgYWJvcnQg4oCUIGNsZWFyaW5nIHRoZSBmbGFnIGFsb25lIG9ubHkgcm91dGVkIHRvIFBsb3RseSBhbmQgbGVmdCBuYXBhcmkgZmV0Y2hpbmcuXG4gICAgdGhpcy5wbG90U2VydmljZS5jYW5jZWxMb2FkaW5nPy4oKTtcbiAgICB0aGlzLnN0YWNrTG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuaW1nTG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuc3RhdGUuc2V0SW1hZ2VMb2FkaW5nKGZhbHNlKTtcbiAgICB0aGlzLnpJbmRleCA9IDA7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRaSW5kZXgodGhpcy56SW5kZXgpO1xuICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0U3RhY2tMb2FkaW5nKGZhbHNlKTtcbiAgfVxuXG4gIGRvd25sb2FkSW1hZ2UoKSB7XG4gICAgdGhpcy5wbG90U2VydmljZS5kb3dubG9hZEltYWdlKCk7XG4gIH1cblxuICBhdXRvc2NhbGVJbWFnZSgpIHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmF1dG9zY2FsZSgpO1xuICB9XG5cbiAgLyoqIFRvb2xiYXIgcGl4ZWwvc21vb3RoIHRvZ2dsZTogZmxpcCBzbW9vdGhpbmcgYW5kIGFwcGx5IHRvIHRoZSBhY3RpdmUgYmFja2VuZC4gKi9cbiAgb25Ub2dnbGVJbWFnZVNtb290aGluZygpOiB2b2lkIHtcbiAgICB0aGlzLmltYWdlU21vb3RoaW5nRW5hYmxlZCA9ICF0aGlzLmltYWdlU21vb3RoaW5nRW5hYmxlZDtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldEltYWdlU21vb3RoaW5nRW5hYmxlZCh0aGlzLmltYWdlU21vb3RoaW5nRW5hYmxlZCk7XG4gIH1cblxuICByZXNldEF4ZXMoKSB7XG4gICAgdGhpcy5wbG90U2VydmljZS5yZXNldEF4ZXMoKTtcbiAgfVxuXG4gIHRvZ2dsZURyYWdNb2RlKG1vZGU6IHN0cmluZykge1xuICAgIC8vIFRvZ2dsZSBvZmYgaWYgdGhlIHNhbWUgbW9kZSBpcyByZS1zZWxlY3RlZC5cbiAgICB0aGlzLmFjdGl2ZURyYWdNb2RlID0gdGhpcy5hY3RpdmVEcmFnTW9kZSA9PT0gbW9kZSA/IG51bGwgOiBtb2RlO1xuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuYWN0aXZlRHJhZ01vZGU7XG4gICAgLy8gUmVjb3JkIHRoZSBhcm1lZCB0b29sIGluIHRoZSBzaGFyZWQgc2Vzc2lvbiBzdG9yZS5cbiAgICB0aGlzLnNlc3Npb24uc2V0QWN0aXZlVG9vbChhY3RpdmUpO1xuXG4gICAgLy8gUmVnaW9uIGRyYXcvc2VsZWN0IHJ1biB0aHJvdWdoIHRoZSByZW5kZXJlcidzIHJlZ2lvbiBvdmVybGF5LlxuICAgIHRoaXMucGxvdFNlcnZpY2VcbiAgICAgIC5nZXRSZWdpb25PdmVybGF5KClcbiAgICAgID8uc2V0TW9kZSh0aGlzLmlzUmVnaW9uTW9kZShhY3RpdmUpID8gKGFjdGl2ZSBhcyBSZWdpb25Ub29sTW9kZSkgOiAnbm9uZScpO1xuXG4gICAgLy8gVmlld3BvcnQgZHJhZyBtb2RlcyAocGFuL2JveC16b29tKS4gUmVnaW9uIG1vZGVzIG93biB0aGUgZHJhZyBtb2RlIHZpYVxuICAgIC8vIHRoZSBvdmVybGF5LCBzbyBkb24ndCBhbHNvIHNldCBvbmUgaGVyZS5cbiAgICBpZiAoIXRoaXMuaXNSZWdpb25Nb2RlKGFjdGl2ZSkpIHtcbiAgICAgIGNvbnN0IHZpZXdwb3J0RHJhZyA9IGFjdGl2ZSA9PT0gJ3BhbicgfHwgYWN0aXZlID09PSAnem9vbSc7XG4gICAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldERyYWdNb2RlKHZpZXdwb3J0RHJhZyA/IGFjdGl2ZSA6IGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBPbi1jYW52YXMgdG9vbCBvdmVybGF5cy5cbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFpvb21Ub0JveE1vZGUoYWN0aXZlID09PSAnem9vbVRvQm94Jyk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRXYW5kTW9kZShhY3RpdmUgPT09ICd3YW5kJywgeyBzZW5zaXRpdml0eTogdGhpcy53YW5kU2Vuc2l0aXZpdHkgfSk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRCcnVzaE1vZGUoYWN0aXZlID09PSAnYnJ1c2gnLCB7IHNpemU6IHRoaXMuYnJ1c2hTaXplIH0pO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0U2FtUG9pbnRNb2RlKGFjdGl2ZSA9PT0gJ3NhbVBvaW50Jyk7XG4gICAgLy8gTGVhdmluZyBwb2ludCBtb2RlIGRpc21pc3NlcyBhbnkgbGluZ2VyaW5nIHN0YXR1cyB0b2FzdC5cbiAgICBpZiAoYWN0aXZlICE9PSAnc2FtUG9pbnQnKSB0aGlzLmhpZGVTYW1Ub2FzdCgpO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0VmVydGV4RXJhc2VyTW9kZShhY3RpdmUgPT09ICdlcmFzZVZlcnRleCcpO1xuICAgIGlmIChhY3RpdmUgPT09ICdlcmFzZVZlcnRleCcpIHtcbiAgICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0VmVydGV4RXJhc2VyUmFkaXVzKHRoaXMudmVydGV4RXJhc2VyUmFkaXVzKTtcbiAgICB9XG4gIH1cblxuICAvKiogUmVnaW9uIGRyYXcvc2VsZWN0L2VkaXQgbW9kZXMgcm91dGVkIHRocm91Z2ggdGhlIHJlZ2lvbiBvdmVybGF5LiBUaGVcbiAgICogIFRoZSB2ZXJ0ZXggdG9vbHMgKGRyYXdwb2x5Z29uL2FkZHBvaW50L2RlbGV0ZXBvaW50L21vdmUpIGFyZVxuICAgKiAgaGFuZGxlZCBieSB0aGUgT3BlblNlYWRyYWdvbiBvdmVybGF5OyBQbG90bHkncyBvdmVybGF5IG1hcHMgdGhlbSB0byBuby1vcC4gKi9cbiAgcHJpdmF0ZSBpc1JlZ2lvbk1vZGUobW9kZTogc3RyaW5nIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBtb2RlID09PSAnZHJhd3JlY3QnIHx8XG4gICAgICBtb2RlID09PSAnZHJhd2Nsb3NlZHBhdGgnIHx8XG4gICAgICBtb2RlID09PSAnZHJhd29wZW5wYXRoJyB8fFxuICAgICAgbW9kZSA9PT0gJ3NlbGVjdCcgfHxcbiAgICAgIG1vZGUgPT09ICdkcmF3cG9seWdvbicgfHxcbiAgICAgIG1vZGUgPT09ICdhZGRwb2ludCcgfHxcbiAgICAgIG1vZGUgPT09ICdkZWxldGVwb2ludCcgfHxcbiAgICAgIG1vZGUgPT09ICdtb3ZlJ1xuICAgICk7XG4gIH1cblxuICAvKiogTGl2ZS11cGRhdGUgdGhlIGlzb3N1cmZhY2UgYXMgdGhlIHJhbmdlIHNsaWRlciBtb3Zlcy4gVGhlIGNvbnRyb2wgaXMgb25seVxuICAgKiAgYXZhaWxhYmxlIHdoZW4gdGhlIGFjdGl2ZSBiYWNrZW5kIHJlbmRlcnMgaXNvc3VyZmFjZXMgKElTT1NVUkZBQ0UgbW9kZSkuICovXG4gIG9uSXNvUmFuZ2VDaGFuZ2UodmFsdWVzOiBudW1iZXJbXSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICghdmFsdWVzIHx8IHZhbHVlcy5sZW5ndGggPCAyKSByZXR1cm47XG4gICAgdGhpcy5pc29SYW5nZSA9IHZhbHVlcztcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmdldElzb3N1cmZhY2VDb250cm9scygpPy5zZXRJc29SYW5nZSh2YWx1ZXNbMF0sIHZhbHVlc1sxXSk7XG4gIH1cblxuICBvbldhbmRTZW5zaXRpdml0eUNoYW5nZSh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHJldHVybjtcbiAgICB0aGlzLndhbmRTZW5zaXRpdml0eSA9IHZhbHVlO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0V2FuZE9wdGlvbnMoeyBzZW5zaXRpdml0eTogdmFsdWUgfSk7XG4gIH1cblxuICBvbkJydXNoU2l6ZUNoYW5nZSh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHJldHVybjtcbiAgICB0aGlzLmJydXNoU2l6ZSA9IHZhbHVlO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0QnJ1c2hPcHRpb25zKHsgc2l6ZTogdmFsdWUgfSk7XG4gIH1cblxuICBvblZlcnRleEVyYXNlclJhZGl1c0NoYW5nZSh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHJldHVybjtcbiAgICB0aGlzLnZlcnRleEVyYXNlclJhZGl1cyA9IHZhbHVlO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0VmVydGV4RXJhc2VyUmFkaXVzKHZhbHVlKTtcbiAgfVxuXG4gIHpvb21JbigpIHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnpvb21JbigpO1xuICB9XG5cbiAgem9vbU91dCgpIHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnpvb21PdXQoKTtcbiAgfVxuXG4gIGRlbGV0ZVJlZ2lvbigpIHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmRlbGV0ZUFjdGl2ZVNoYXBlKCk7XG4gIH1cblxuICAvKiogVW5kbyB0aGUgbW9zdCByZWNlbnQgcmVnaW9uIGFjdGlvbiAoaml0LXVpIzg1KS4gVXAgdG8gMTAgc3RlcHMgYmFjay4gKi9cbiAgdW5kb1JlZ2lvbigpIHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnVuZG8oKTtcbiAgfVxuXG4gIC8qKiBSZWRvIHRoZSBtb3N0IHJlY2VudGx5IHVuZG9uZSByZWdpb24gYWN0aW9uIChqaXQtdWkjODUpLiAqL1xuICByZWRvUmVnaW9uKCkge1xuICAgIHRoaXMucGxvdFNlcnZpY2UucmVkbygpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJlZ2lvbiBzZXQtb3BlcmF0aW9ucyBvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24gKGppdC11aSM4NSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFRoZSBjdXJyZW50bHktc2VsZWN0ZWQgcmVnaW9ucyAobGl2ZSBzdG9yZSBpbnN0YW5jZXMpLiAqL1xuICBwcml2YXRlIGdldCBzZWxlY3RlZFJlZ2lvbnMoKTogUmVnaW9uW10ge1xuICAgIGNvbnN0IGFsbCA9IHRoaXMucGxvdFNlcnZpY2UuZ2V0UmVnaW9ucygpO1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSW5kaWNlc1xuICAgICAgLm1hcCgoaSkgPT4gYWxsW2ldKVxuICAgICAgLmZpbHRlcigocik6IHIgaXMgUmVnaW9uID0+ICEhcik7XG4gIH1cblxuICAvKiogUmVnaW9ucyBlbGlnaWJsZSBmb3Igc2V0LW9wczogY2xvc2VkIGFyZWFzIChyZWN0IC8gY2xvc2VkIHBvbHlnb24gL1xuICAgKiAgbXVsdGktcG9seWdvbiksIGV4Y2x1ZGluZyBpbnRlbnNpdHktcHJvZmlsZSBsaW5lcy4gKi9cbiAgcHJpdmF0ZSBvcEVsaWdpYmxlKHJlZ2lvbnM6IFJlZ2lvbltdKTogUmVnaW9uW10ge1xuICAgIHJldHVybiByZWdpb25zLmZpbHRlcigocikgPT4gci5raW5kICE9PSAncHJvZmlsZScgJiYgKFxuICAgICAgci5ib3VuZHMgaW5zdGFuY2VvZiBSZWN0YW5nbGUgfHxcbiAgICAgIHIuYm91bmRzIGluc3RhbmNlb2YgTXVsdGlQb2x5Z29uIHx8XG4gICAgICAoci5ib3VuZHMgaW5zdGFuY2VvZiBQb2x5Z29uICYmIHIuYm91bmRzLmNsb3NlZCAhPT0gZmFsc2UpXG4gICAgKSk7XG4gIH1cblxuICAvKiogSW1hZ2UgcGl4ZWwgZGltZW5zaW9ucyBmb3IgdGhlIHJhc3RlciBvcHM7IGZhbGxzIGJhY2sgdG8gdGhlIHNlbGVjdGlvbidzXG4gICAqICBleHRlbnQgd2hlbiB0aGUgaW1hZ2Ugc2l6ZSBpc24ndCBrbm93biAoa2VlcHMgY2xhbXBpbmcgc2FuZSkuICovXG4gIHByaXZhdGUgb3BJbWFnZURpbXMocmVnaW9uczogUmVnaW9uW10pOiB7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0ge1xuICAgIGxldCBbdywgaF0gPSB0aGlzLmltYWdlSW5mbz8udHJ1ZUltYWdlU2l6ZSA/PyBbMCwgMF07XG4gICAgaWYgKCEodyA+IDApIHx8ICEoaCA+IDApKSB7XG4gICAgICBsZXQgbWF4WCA9IDAsIG1heFkgPSAwO1xuICAgICAgY29uc3Qgc2NhbiA9ICh4czogbnVtYmVyW10sIHlzOiBudW1iZXJbXSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHggb2YgeHMpIG1heFggPSBNYXRoLm1heChtYXhYLCB4KTtcbiAgICAgICAgZm9yIChjb25zdCB5IG9mIHlzKSBtYXhZID0gTWF0aC5tYXgobWF4WSwgeSk7XG4gICAgICB9O1xuICAgICAgZm9yIChjb25zdCByIG9mIHJlZ2lvbnMpIHtcbiAgICAgICAgY29uc3QgYiA9IHIuYm91bmRzO1xuICAgICAgICBpZiAoYiBpbnN0YW5jZW9mIFJlY3RhbmdsZSkgc2NhbihbYi54ICsgYi53aWR0aF0sIFtiLnkgKyBiLmhlaWdodF0pO1xuICAgICAgICBlbHNlIGlmIChiIGluc3RhbmNlb2YgUG9seWdvbikgc2NhbihiLnhwb2ludHMsIGIueXBvaW50cyk7XG4gICAgICAgIGVsc2UgaWYgKGIgaW5zdGFuY2VvZiBNdWx0aVBvbHlnb24pIGZvciAoY29uc3QgcCBvZiBiLnBvbHlnb25zKSBzY2FuKHAueHBvaW50cywgcC55cG9pbnRzKTtcbiAgICAgIH1cbiAgICAgIHcgPSBNYXRoLm1heCh3LCBNYXRoLmNlaWwobWF4WCkgKyAyKTtcbiAgICAgIGggPSBNYXRoLm1heChoLCBNYXRoLmNlaWwobWF4WSkgKyAyKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdywgaCB9O1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiDiiaUyIGVsaWdpYmxlIHJlZ2lvbnMgYXJlIHNlbGVjdGVkIChNZXJnZSBhdmFpbGFibGUpLiAqL1xuICBnZXQgY2FuTWVyZ2VSZWdpb25zKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5vcEVsaWdpYmxlKHRoaXMuc2VsZWN0ZWRSZWdpb25zKS5sZW5ndGggPj0gMjsgfVxuICAvKiogVHJ1ZSB3aGVuIGFueSBzZWxlY3RlZCByZWdpb24gaXMgbXVsdGktcGFydCAoVW5ncm91cCBhdmFpbGFibGUpLiAqL1xuICBnZXQgY2FuVW5ncm91cFJlZ2lvbnMoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnNlbGVjdGVkUmVnaW9ucy5zb21lKChyKSA9PiB0aGlzLnJlZ2lvbk9wcy5jYW5Vbmdyb3VwKHIpKTsgfVxuICAvKiogVHJ1ZSB3aGVuIOKJpTEgZWxpZ2libGUgcmVnaW9uIGlzIHNlbGVjdGVkIChJbnZlcnNlIC8gU2ltcGxpZnkgYXZhaWxhYmxlKS4gKi9cbiAgZ2V0IGhhc0VsaWdpYmxlU2VsZWN0aW9uKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5vcEVsaWdpYmxlKHRoaXMuc2VsZWN0ZWRSZWdpb25zKS5sZW5ndGggPj0gMTsgfVxuXG4gIC8qKiBTZWxlY3QgZXZlcnkgcmVnaW9uIG9uIHRoZSBpbWFnZSAoZXhjbHVkZXMgaW50ZW5zaXR5LXByb2ZpbGUgbGluZXMpLiAqL1xuICBzZWxlY3RBbGxSZWdpb25zKCk6IHZvaWQge1xuICAgIGNvbnN0IGFsbCA9IHRoaXMucGxvdFNlcnZpY2UuZ2V0UmVnaW9ucygpO1xuICAgIGNvbnN0IGluZGljZXM6IG51bWJlcltdID0gW107XG4gICAgYWxsLmZvckVhY2goKHIsIGkpID0+IHsgaWYgKHIua2luZCAhPT0gJ3Byb2ZpbGUnKSBpbmRpY2VzLnB1c2goaSk7IH0pO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoaW5kaWNlcyk7XG4gIH1cblxuICAvKiogTWVyZ2UgdGhlIHNlbGVjdGVkIHJlZ2lvbnMgaW50byBhIHNpbmdsZSAocG9zc2libHkgbXVsdGktcGFydCkgcmVnaW9uLiAqL1xuICBtZXJnZVJlZ2lvbnMoKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsID0gdGhpcy5vcEVsaWdpYmxlKHRoaXMuc2VsZWN0ZWRSZWdpb25zKTtcbiAgICBpZiAoc2VsLmxlbmd0aCA8IDIpIHJldHVybjtcbiAgICBjb25zdCB7IHcsIGggfSA9IHRoaXMub3BJbWFnZURpbXMoc2VsKTtcbiAgICBjb25zdCBtZXJnZWQgPSB0aGlzLnJlZ2lvbk9wcy5tZXJnZShzZWwsIHcsIGgpO1xuICAgIGlmIChtZXJnZWQpIHRoaXMucmVwbGFjZVJlZ2lvbnMoc2VsLCBbbWVyZ2VkXSk7XG4gIH1cblxuICAvKiogU3BsaXQgZWFjaCBzZWxlY3RlZCBtdWx0aS1wYXJ0IHJlZ2lvbiBpbnRvIG9uZSByZWdpb24gcGVyIHBhcnQuICovXG4gIHVuZ3JvdXBSZWdpb25zKCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbCA9IHRoaXMuc2VsZWN0ZWRSZWdpb25zLmZpbHRlcigocikgPT4gdGhpcy5yZWdpb25PcHMuY2FuVW5ncm91cChyKSk7XG4gICAgaWYgKHNlbC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCByZXN1bHRzOiBSZWdpb25bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgciBvZiBzZWwpIHJlc3VsdHMucHVzaCguLi50aGlzLnJlZ2lvbk9wcy51bmdyb3VwKHIpKTtcbiAgICB0aGlzLnJlcGxhY2VSZWdpb25zKHNlbCwgcmVzdWx0cyk7XG4gIH1cblxuICAvKiogUmVwbGFjZSB0aGUgc2VsZWN0aW9uIHdpdGggaXRzIGludmVyc2UgaW5zaWRlIHRoZSBpbWFnZSByZWN0YW5nbGUuICovXG4gIGludmVyc2VSZWdpb25zKCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbCA9IHRoaXMub3BFbGlnaWJsZSh0aGlzLnNlbGVjdGVkUmVnaW9ucyk7XG4gICAgaWYgKHNlbC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCB7IHcsIGggfSA9IHRoaXMub3BJbWFnZURpbXMoc2VsKTtcbiAgICBjb25zdCBpbnYgPSB0aGlzLnJlZ2lvbk9wcy5pbnZlcnNlKHNlbCwgdywgaCk7XG4gICAgaWYgKCFpbnYpIHtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAga2V5OiB0aGlzLnJlc3VsdFRvYXN0S2V5LFxuICAgICAgICBzZXZlcml0eTogJ3dhcm4nLCBzdW1tYXJ5OiAnSW52ZXJzZScsXG4gICAgICAgIGRldGFpbDogJ05vdGhpbmcgdG8gaW52ZXJ0IOKAlCBzZWxlY3Qgb25lIG9yIG1vcmUgY2xvc2VkIHJlZ2lvbnMgZmlyc3QuJyxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlcGxhY2VSZWdpb25zKHNlbCwgW2ludl0pO1xuICB9XG5cbiAgLyoqIERvdWdsYXPigJNQZXVja2VyIHNpbXBsaWZ5IGVhY2ggc2VsZWN0ZWQgcmVnaW9uIGJ5IGB0aHJlc2hvbGRQeGAuICovXG4gIHNpbXBsaWZ5UmVnaW9ucyh0aHJlc2hvbGRQeDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsID0gdGhpcy5vcEVsaWdpYmxlKHRoaXMuc2VsZWN0ZWRSZWdpb25zKTtcbiAgICBpZiAoc2VsLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIHRoaXMucmVwbGFjZVJlZ2lvbnMoc2VsLCBzZWwubWFwKChyKSA9PiB0aGlzLnJlZ2lvbk9wcy5zaW1wbGlmeShyLCB0aHJlc2hvbGRQeCkpKTtcbiAgICB0aGlzLmRpc3BsYXlTaW1wbGlmeURpYWxvZyA9IGZhbHNlO1xuICB9XG5cbiAgLyoqIE9wZW4gdGhlIGN1c3RvbS10aHJlc2hvbGQgc2ltcGxpZnkgZGlhbG9nLiAqL1xuICBvcGVuU2ltcGxpZnlEaWFsb2coKTogdm9pZCB7IHRoaXMuZGlzcGxheVNpbXBsaWZ5RGlhbG9nID0gdHJ1ZTsgfVxuXG4gIC8qKlxuICAgKiBDb21taXQgYSBzZXQtb3A6IGRyb3AgdGhlIGByZW1vdmVgIHJlZ2lvbnMsIGFwcGVuZCBgYWRkYCwgYW5kIHNlbGVjdCB0aGVcbiAgICogcmVzdWx0cy4gR29lcyB0aHJvdWdoIHNldFJlZ2lvbnMgc28gaXQncyB1bmRvLXRyYWNrZWQgYW5kIHJlLXJlbmRlcmVkO1xuICAgKiBwcm9maWxlIGxpbmVzIGFuZCB1bnNlbGVjdGVkIHJlZ2lvbnMgYXJlIHByZXNlcnZlZC5cbiAgICovXG4gIHByaXZhdGUgcmVwbGFjZVJlZ2lvbnMocmVtb3ZlOiBSZWdpb25bXSwgYWRkOiBSZWdpb25bXSk6IHZvaWQge1xuICAgIGlmIChhZGQubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgY29uc3QgcmVtb3ZlU2V0ID0gbmV3IFNldChyZW1vdmUpO1xuICAgIGNvbnN0IGtlcHQgPSB0aGlzLnBsb3RTZXJ2aWNlLmdldFJlZ2lvbnMoKS5maWx0ZXIoKHIpID0+ICFyZW1vdmVTZXQuaGFzKHIpKTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFJlZ2lvbnMoWy4uLmtlcHQsIC4uLmFkZF0pOyAvLyBtaW50cyBpZHMgb24gYGFkZGAsIHJlY29yZHMgdW5kb1xuICAgIGNvbnN0IHN0b3JlZCA9IHRoaXMucGxvdFNlcnZpY2UuZ2V0UmVnaW9ucygpO1xuICAgIGNvbnN0IHNlbCA9IGFkZC5tYXAoKHIpID0+IHN0b3JlZC5pbmRleE9mKHIpKS5maWx0ZXIoKGkpID0+IGkgPj0gMCk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyhzZWwpO1xuICB9XG5cbiAgLyoqIEJveC1wcm9tcHRlZCBTQU0gc2VnbWVudGF0aW9uIG9mIHRoZSBkcmF3biByZWN0YW5nbGVzIChqaXQtdWkjOTApLiBBIHN0aWNreVxuICAgKiAgYHNhbWAgdG9hc3Qgc2hvd3MgbGl2ZSBzdGF0dXMgKyBhIGRvd25sb2FkIHByb2dyZXNzIGJhciAoZmlyc3QgcnVuIHB1bGxzIHRoZVxuICAgKiAgZW5jb2RlciwgfjE3MCBNQik7IGl0IHN0YXlzIG9wZW4gdW50aWwgdGhlIHJ1biBmaW5pc2hlcyAoYmFyIGhpdHMgMTAwJSkuICovXG4gIGFzeW5jIHNlZ21lbnRSZWdpb25zKCkge1xuICAgIGF3YWl0IHRoaXMucnVuU2VnbWVudFdpdGhUb2FzdCgnU0FNJywgdGhpcy5zYW1Ub29sLCAoKSA9PiB0aGlzLnBsb3RTZXJ2aWNlLnNlZ21lbnRSZWN0YW5nbGVzKCkpO1xuICB9XG5cbiAgLyoqIEF1dG8tc2VnbWVudCBjZWxscyBpbnNpZGUgZWFjaCBkcmF3biByZWN0YW5nbGUgd2l0aCBjZWxscG9zZS1TQU0sIGNsaWVudC1zaWRlXG4gICAqICAoaml0LXVpIzkwKS4gRWFjaCBib3ggaXMgY3JvcHBlZCAoYnJvd3NlciBzbGlkZS1jcm9wKSB0aGVuIHJ1biB0aHJvdWdoIHRoZVxuICAgKiAgY2VsbHBvc2UtanMgbW9kZWw7IHRoZSBzYW1lIHN0aWNreSBgc2FtYCB0b2FzdCArIHByb2dyZXNzIGJhciBpcyByZXVzZWQuICovXG4gIGFzeW5jIHNlZ21lbnRDZWxscG9zZSgpIHtcbiAgICBhd2FpdCB0aGlzLnJ1blNlZ21lbnRXaXRoVG9hc3QoJ0NlbGxwb3NlJywgdGhpcy5jZWxsU2VnbWVudFRvb2wsICgpID0+XG4gICAgICB0aGlzLnBsb3RTZXJ2aWNlLnNlZ21lbnRSZWN0YW5nbGVzQ2VsbHBvc2UoKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIFBlci1tb2RlbCBkZWZhdWx0cyBmcm9tIHRoZSByZWdpc3RyeSDigJQgd2hhdCB0aGUgY2hlY2twb2ludCB3YXMgdHJhaW5lZCBmb3IuICovXG4gIHByaXZhdGUgZGVmYXVsdFlvbG9QYXJhbXMoKTogSW5zdGFuY2VTZWdtZW50T3B0aW9ucyB7XG4gICAgY29uc3QgZGVmID0gWU9MT19NT0RFTFMuZmluZCgobSkgPT4gbS5pZCA9PT0gZ2V0RGVmYXVsdFlvbG9Nb2RlbElkKCkpID8/IFlPTE9fTU9ERUxTWzBdO1xuICAgIHJldHVybiB7XG4gICAgICBtb2RlbElkOiBkZWY/LmlkLFxuICAgICAgY29uZmlkZW5jZTogZGVmPy5kZWZhdWx0cy5jb25maWRlbmNlID8/IDAuNixcbiAgICAgIGlvdVRocmVzaG9sZDogZGVmPy5kZWZhdWx0cy5pb3VUaHJlc2hvbGQgPz8gMC41LFxuICAgICAgbWVyZ2VUaHJlc2hvbGQ6IGRlZj8uZGVmYXVsdHMubWVyZ2VUaHJlc2hvbGQgPz8gMC4zLFxuICAgICAgb3ZlcmxhcFg6IGRlZj8uZGVmYXVsdHMub3ZlcmxhcFggPz8gMCxcbiAgICAgIG92ZXJsYXBZOiBkZWY/LmRlZmF1bHRzLm92ZXJsYXBZID8/IDAsXG4gICAgICB3aXRoTWFza3M6IHRydWUsXG4gICAgICBzaW1wbGlmeVRvbGVyYW5jZTogMSxcbiAgICAgIG1pbkFyZWE6IDAsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBTd2l0Y2hpbmcgY2hlY2twb2ludCByZS1zZWVkcyB0aGUgcGFyYW1ldGVycywgc2luY2UgdGhlIGRlZmF1bHRzIGJlbG9uZyB0b1xuICAgKiAgdGhlIG1vZGVsIHJhdGhlciB0aGFuIHRvIHRoZSB0b29sLiAqL1xuICBvbllvbG9Nb2RlbENoYW5nZShpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy55b2xvTW9kZWxJZCA9IGlkO1xuICAgIHNldERlZmF1bHRZb2xvTW9kZWwoaWQpO1xuICAgIHRoaXMueW9sb1BhcmFtcyA9IHsgLi4udGhpcy5kZWZhdWx0WW9sb1BhcmFtcygpLCBtb2RlbElkOiBpZCB9O1xuICB9XG5cbiAgb3BlbllvbG9QYXJhbXMoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93WW9sb1BhcmFtcyA9IHRydWU7XG4gIH1cblxuICByZXNldFlvbG9QYXJhbXMoKTogdm9pZCB7XG4gICAgdGhpcy55b2xvUGFyYW1zID0geyAuLi50aGlzLmRlZmF1bHRZb2xvUGFyYW1zKCksIG1vZGVsSWQ6IHRoaXMueW9sb01vZGVsSWQgfTtcbiAgfVxuXG4gIC8qKiBEZXRlY3Qgb2JqZWN0cyBhY3Jvc3MgdGhlIGN1cnJlbnQgdmlldy4gTm8gcHJvbXB0OiBhIGRldGVjdG9yIGZpbmRzIG9iamVjdHNcbiAgICogIGluIGEgZmllbGQgcmF0aGVyIHRoYW4gYmVpbmcgcG9pbnRlZCBhdCBvbmUuIFJldXNlcyB0aGUgc2hhcmVkIHNlZ21lbnRhdGlvblxuICAgKiAgdG9hc3Qgc28gcHJvZ3Jlc3MgYW5kIHN0YXR1cyByZWFkIHRoZSBzYW1lIGFzIHRoZSBTQU0vY2VsbHBvc2UgdG9vbHMuICovXG4gIGFzeW5jIGRldGVjdFlvbG8oKSB7XG4gICAgYXdhaXQgdGhpcy5ydW5TZWdtZW50V2l0aFRvYXN0KCdZT0xPJywgdGhpcy55b2xvRGV0ZWN0VG9vbCwgKCkgPT5cbiAgICAgIHRoaXMueW9sb0RldGVjdFRvb2wuZGV0ZWN0SW5WaWV3KHRoaXMucGxvdFNlcnZpY2UsIHRoaXMuaW5zdGFuY2VTZWdtZW50ZXIsIHtcbiAgICAgICAgLi4udGhpcy55b2xvUGFyYW1zLFxuICAgICAgICBtb2RlbElkOiB0aGlzLnlvbG9Nb2RlbElkLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBTaGFyZWQgZHJpdmVyIGZvciB0aGUgYm94LXByb21wdCBzZWdtZW50IHRvb2xzOiB3aXJlcyB0aGUgdG9vbCdzIHN0YXR1cyArXG4gICAqICBkb3dubG9hZCBwcm9ncmVzcyBpbnRvIHRoZSBzdGlja3kgYHNhbWAgdG9hc3QsIHJ1bnMgYG9wYCwgYW5kIHJlcG9ydHMgdGhlXG4gICAqICByZWdpb24gY291bnQuIEtlZXBzIHRoZSB0b2FzdCBvcGVuIHVudGlsIHRoZSBydW4gc2V0dGxlcyAoYmFyIGhpdHMgMTAwJSkuICovXG4gIHByaXZhdGUgYXN5bmMgcnVuU2VnbWVudFdpdGhUb2FzdChcbiAgICBsYWJlbDogc3RyaW5nLFxuICAgIHRvb2w6IHsgc3RhdHVzJDogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz47IHByb2dyZXNzJDogQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4gfSxcbiAgICBvcDogKCkgPT4gUHJvbWlzZTxudW1iZXI+LFxuICApIHtcbiAgICB0aGlzLnNhbVN0YXR1cyA9ICdTdGFydGluZ+KApic7XG4gICAgdGhpcy5zYW1Qcm9ncmVzcyA9IDA7XG4gICAgdGhpcy5zYW1Eb3dubG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuc2FtQnVzeSA9IHRydWU7XG4gICAgY29uc3QgcHN1YiA9IHRvb2wucHJvZ3Jlc3MkLnN1YnNjcmliZSgoZikgPT4ge1xuICAgICAgdGhpcy5zYW1Eb3dubG9hZGluZyA9IGYgPj0gMCAmJiBmIDwgMTtcbiAgICAgIGlmIChmID49IDApIHRoaXMuc2FtUHJvZ3Jlc3MgPSBNYXRoLm1pbigxMDAsIE1hdGgucm91bmQoZiAqIDEwMCkpO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0pO1xuICAgIGNvbnN0IHNzdWIgPSB0b29sLnN0YXR1cyQuc3Vic2NyaWJlKChtKSA9PiB7XG4gICAgICBpZiAobSkge1xuICAgICAgICB0aGlzLnNhbVN0YXR1cyA9IG07XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnNob3dTYW1Ub2FzdChsYWJlbCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG4gPSBhd2FpdCBvcCgpO1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICBrZXk6IHRoaXMucmVzdWx0VG9hc3RLZXksXG4gICAgICAgIHNldmVyaXR5OiBuID4gMCA/ICdzdWNjZXNzJyA6ICd3YXJuJyxcbiAgICAgICAgc3VtbWFyeTogbGFiZWwsXG4gICAgICAgIGRldGFpbDogdG9vbC5zdGF0dXMkLnZhbHVlIHx8IChuID4gMCA/IGBBZGRlZCAke259IHJlZ2lvbihzKS5gIDogJ05vIHJlZ2lvbnMgYWRkZWQuJyksXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgIGtleTogdGhpcy5yZXN1bHRUb2FzdEtleSxcbiAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6IGAke2xhYmVsfSBmYWlsZWRgLCBkZXRhaWw6IFN0cmluZyhlKSxcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBwc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICBzc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLmhpZGVTYW1Ub2FzdCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTaG93IHRoZSBzaGFyZWQgc3RpY2t5IGBzYW1gIHRvYXN0IG9uY2UgKGlkZW1wb3RlbnQg4oCUIHJlLWFkZGluZyB3b3VsZCBzdGFja1xuICAgKiAgYSBuZXcgdG9hc3Qgb24gZXZlcnkgcG9pbnQgY2xpY2spLiAqL1xuICBwcml2YXRlIHNob3dTYW1Ub2FzdChzdW1tYXJ5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zYW1Ub2FzdFNob3duKSByZXR1cm47XG4gICAgdGhpcy5zYW1Ub2FzdFNob3duID0gdHJ1ZTtcbiAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IGtleTogdGhpcy5zYW1Ub2FzdEtleSwgc3RpY2t5OiB0cnVlLCBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5IH0pO1xuICB9XG5cbiAgLyoqIERpc21pc3MgdGhlIHNoYXJlZCBgc2FtYCB0b2FzdCBhbmQgcmVzZXQgaXRzIHByb2dyZXNzL3NwaW5uZXIgc3RhdGUuICovXG4gIHByaXZhdGUgaGlkZVNhbVRvYXN0KCk6IHZvaWQge1xuICAgIHRoaXMuc2FtVG9hc3RTaG93biA9IGZhbHNlO1xuICAgIHRoaXMuc2FtQnVzeSA9IGZhbHNlO1xuICAgIHRoaXMuc2FtRG93bmxvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnNhbVByb2dyZXNzID0gMDtcbiAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmNsZWFyKHRoaXMuc2FtVG9hc3RLZXkpO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKiBQaWNrIHRoZSBTQU0gbW9kZWwgdGhlIHNlZ21lbnQgdG9vbHMgdXNlIChqaXQtdWkjOTAgUDEpLiAqL1xuICBvblNhbU1vZGVsQ2hhbmdlKGlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNhbU1vZGVsSWQgPSBpZDtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFNhbU1vZGVsKGlkKTtcbiAgfVxuXG4gIC8qKiBDb252ZXJ0IHRoZSBzZWxlY3RlZCByZWdpb24gdG8gYSBzbW9vdGggYmV6aWVyIGN1cnZlLiAqL1xuICB0b0JlemllclJlZ2lvbigpIHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmdldFJlZ2lvbk92ZXJsYXkoKT8uc2V0U2VsZWN0ZWRCZXppZXIodHJ1ZSk7XG4gIH1cblxuICAvKiogQ29udmVydCB0aGUgc2VsZWN0ZWQgcmVnaW9uIGJhY2sgdG8gYSBzdHJhaWdodC1lZGdlZCBwb2x5Z29uLiAqL1xuICB0b1BvbHlnb25SZWdpb24oKSB7XG4gICAgdGhpcy5wbG90U2VydmljZS5nZXRSZWdpb25PdmVybGF5KCk/LnNldFNlbGVjdGVkQmV6aWVyKGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbW1lZGlhdGUgcmVnaW9uIGFjdGlvbnMgb24gdGhlIGN1cnJlbnQgc2VsZWN0aW9uIChqaXQtdWkjODUpOiBtZXJnZSxcbiAgICogdW5ncm91cCwgaW52ZXJzZSwgc2ltcGxpZnksIHRoZSBCw6l6aWVyIGNvbnZlcnNpb25zLCBhbmQgZGVsZXRlIOKAlCB0aGVcbiAgICogb25lLXNob3QgZ2VvbWV0cnkgdHJhbnNmb3JtcywgZ3JvdXBlZCBhcGFydCBmcm9tIHRoZSB0b29sL21vZGUgdG9nZ2xlcyBhbmRcbiAgICogc2hvd24gb25seSB3aGVuIHNvbWV0aGluZyBpcyBzZWxlY3RlZC4gRWFjaCBpdGVtIGlzIGdhdGVkIG9uIHdoYXQgdGhlXG4gICAqIHNlbGVjdGlvbiBzdXBwb3J0cy5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRSZWdpb25BY3Rpb25JdGVtcygpOiBNZW51SXRlbVtdIHtcbiAgICBjb25zdCBhbGwgPSB0aGlzLnBsb3RTZXJ2aWNlLmdldFJlZ2lvbnMoKTtcbiAgICBjb25zdCBzZWxlY3RhYmxlID0gYWxsLmZpbHRlcigocikgPT4gci5raW5kICE9PSAncHJvZmlsZScpO1xuICAgIGlmIChzZWxlY3RhYmxlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGl0ZW1zOiBNZW51SXRlbVtdID0gW107XG5cbiAgICAvLyBTZWxlY3QgYWxsIOKAlCBhdmFpbGFibGUgd2hlbmV2ZXIgdGhlIGltYWdlIGhhcyByZWdpb25zLCByZWdhcmRsZXNzIG9mIHRoZVxuICAgIC8vIGN1cnJlbnQgc2VsZWN0aW9uLlxuICAgIGl0ZW1zLnB1c2goe1xuICAgICAgbGFiZWw6ICdTZWxlY3QgYWxsIHJlZ2lvbnMnLCBpY29uOiAncGkgcGktY2hlY2stc3F1YXJlJyxcbiAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMuc2VsZWN0QWxsUmVnaW9ucygpLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc2VsQWxsID0gdGhpcy5zZWxlY3RlZFJlZ2lvbnM7XG4gICAgaWYgKHNlbEFsbC5sZW5ndGggPT09IDApIHJldHVybiBpdGVtcztcbiAgICBjb25zdCBlbGlnaWJsZSA9IHRoaXMub3BFbGlnaWJsZShzZWxBbGwpO1xuXG4gICAgaWYgKGVsaWdpYmxlLmxlbmd0aCA+PSAyKSB7XG4gICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6ICdNZXJnZSAvIGdyb3VwJywgaWNvbjogJ3BpIHBpLWxpbmsnLCBjb21tYW5kOiAoKSA9PiB0aGlzLm1lcmdlUmVnaW9ucygpIH0pO1xuICAgIH1cbiAgICBpZiAoc2VsQWxsLnNvbWUoKHIpID0+IHRoaXMucmVnaW9uT3BzLmNhblVuZ3JvdXAocikpKSB7XG4gICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6ICdVbmdyb3VwJywgaWNvbjogJ3BpIHBpLXNpdGVtYXAnLCBjb21tYW5kOiAoKSA9PiB0aGlzLnVuZ3JvdXBSZWdpb25zKCkgfSk7XG4gICAgfVxuICAgIGlmIChlbGlnaWJsZS5sZW5ndGggPj0gMSkge1xuICAgICAgaXRlbXMucHVzaChcbiAgICAgICAgeyBsYWJlbDogJ0ludmVyc2UnLCBpY29uOiAncGkgcGktY2xvbmUnLCBjb21tYW5kOiAoKSA9PiB0aGlzLmludmVyc2VSZWdpb25zKCkgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnU2ltcGxpZnknLCBpY29uOiAncGkgcGktY2hhcnQtbGluZScsXG4gICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgIHsgbGFiZWw6ICdMaWdodCAoMSBweCknLCBjb21tYW5kOiAoKSA9PiB0aGlzLnNpbXBsaWZ5UmVnaW9ucygxKSB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ01lZGl1bSAoMyBweCknLCBjb21tYW5kOiAoKSA9PiB0aGlzLnNpbXBsaWZ5UmVnaW9ucygzKSB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ1N0cm9uZyAoOCBweCknLCBjb21tYW5kOiAoKSA9PiB0aGlzLnNpbXBsaWZ5UmVnaW9ucyg4KSB9LFxuICAgICAgICAgICAgeyBzZXBhcmF0b3I6IHRydWUgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdDdXN0b23igKYnLCBjb21tYW5kOiAoKSA9PiB0aGlzLm9wZW5TaW1wbGlmeURpYWxvZygpIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIELDqXppZXIgY29udmVyc2lvbnMgYXJlIHZlcnRleC1sZXZlbCBlZGl0cyDigJQgSW1hZ2UgKE9wZW5TZWFkcmFnb24pIHZpZXdcbiAgICAvLyBvbmx5IOKAlCBnYXRlZCBvbiB0aGUgc2VsZWN0aW9uJ3MgY3VycmVudCBmb3JtLlxuICAgIGlmICh0aGlzLnNlbGVjdGVkUGxvdFR5cGUgPT09IFBsb3RUeXBlLklNQUdFKSB7XG4gICAgICBjb25zdCBoYXNTdHJhaWdodCA9IHNlbEFsbC5zb21lKChyKSA9PlxuICAgICAgICAoci5ib3VuZHMgaW5zdGFuY2VvZiBQb2x5Z29uICYmICFyLmJvdW5kcy5iZXppZXIpIHx8IHIuYm91bmRzIGluc3RhbmNlb2YgUmVjdGFuZ2xlKTtcbiAgICAgIGNvbnN0IGhhc0JlemllciA9IHNlbEFsbC5zb21lKChyKSA9PiByLmJvdW5kcyBpbnN0YW5jZW9mIFBvbHlnb24gJiYgci5ib3VuZHMuYmV6aWVyKTtcbiAgICAgIGlmIChoYXNTdHJhaWdodCkge1xuICAgICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6ICdDb252ZXJ0IHRvIELDqXppZXInLCBpY29uOiAndG8tYmV6aWVyLWljb24nLCBjb21tYW5kOiAoKSA9PiB0aGlzLnRvQmV6aWVyUmVnaW9uKCkgfSk7XG4gICAgICB9XG4gICAgICBpZiAoaGFzQmV6aWVyKSB7XG4gICAgICAgIGl0ZW1zLnB1c2goeyBsYWJlbDogJ0NvbnZlcnQgdG8gcG9seWdvbicsIGljb246ICd0by1wb2x5Z29uLWljb24nLCBjb21tYW5kOiAoKSA9PiB0aGlzLnRvUG9seWdvblJlZ2lvbigpIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpdGVtcy5wdXNoKHsgbGFiZWw6ICdEZWxldGUgcmVnaW9uJywgaWNvbjogJ3BpIHBpLXRyYXNoJywgY29tbWFuZDogKCkgPT4gdGhpcy5kZWxldGVSZWdpb24oKSB9KTtcbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQ29udGV4dE1lbnVJdGVtcygpOiBNZW51SXRlbVtdIHtcbiAgICBjb25zdCBhY3RpdmUgPSB0aGlzLmFjdGl2ZURyYWdNb2RlO1xuICAgIGNvbnN0IGFjdGl2ZUNsYXNzID0gJ2NvbnRleHQtbWVudS1hY3RpdmUnO1xuICAgIGNvbnN0IGl0ZW1zOiBNZW51SXRlbVtdID0gW107XG4gICAgLy8gU2VsZWN0ZWQtcmVnaW9uIGFjdGlvbnMgbGVhZCB0aGUgbWVudSAoc2VwYXJhdGVkIGZyb20gdGhlIHRvb2wgdG9nZ2xlcykuXG4gICAgaWYgKHRoaXMuaXNIZWF0bWFwKSB7XG4gICAgICBjb25zdCBhY3Rpb25zID0gdGhpcy5idWlsZFJlZ2lvbkFjdGlvbkl0ZW1zKCk7XG4gICAgICBpZiAoYWN0aW9ucy5sZW5ndGgpIGl0ZW1zLnB1c2goLi4uYWN0aW9ucywgeyBzZXBhcmF0b3I6IHRydWUgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzSGVhdG1hcCkge1xuICAgICAgaXRlbXMucHVzaChcbiAgICAgICAgeyBsYWJlbDogJ0F1dG9zY2FsZScsIGljb246ICdwaSBwaS13aW5kb3ctbWF4aW1pemUnLCBjb21tYW5kOiAoKSA9PiB0aGlzLmF1dG9zY2FsZUltYWdlKCkgfSxcbiAgICAgICAgeyBzZXBhcmF0b3I6IHRydWUgfSxcbiAgICAgICk7XG4gICAgICAvLyAnWm9vbSBzZWxlY3Rpb24nIGlzIFBsb3RseSdzIHJ1YmJlci1iYW5kIHpvb207IGl0IGRvZXNuJ3QgYXBwbHkgdG8gdGhlXG4gICAgICAvLyBPcGVuU2VhZHJhZ29uLWJhY2tlZCBJbWFnZSB2aWV3ICh1c2UgJ1pvb20gdG8gYm94JyB0aGVyZSBpbnN0ZWFkKS5cbiAgICAgIGlmICghdGhpcy5pc0ltYWdlVmlldykge1xuICAgICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgICBsYWJlbDogJ1pvb20gc2VsZWN0aW9uJyxcbiAgICAgICAgICBpY29uOiAncGkgcGktc2VhcmNoJyxcbiAgICAgICAgICBzdHlsZUNsYXNzOiBhY3RpdmUgPT09ICd6b29tJyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnem9vbScpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICBsYWJlbDogJ1pvb20gdG8gYm94JyxcbiAgICAgICAgaWNvbjogJ3pvb20tYm94LW9mZi1pY29uJyxcbiAgICAgICAgc3R5bGVDbGFzczogYWN0aXZlID09PSAnem9vbVRvQm94JyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ3pvb21Ub0JveCcpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzSGVhdG1hcCkge1xuICAgICAgaXRlbXMucHVzaCh7XG4gICAgICAgIGxhYmVsOiAnUGFuJyxcbiAgICAgICAgaWNvbjogJ3BpIHBpLWFycm93cy1hbHQnLFxuICAgICAgICBzdHlsZUNsYXNzOiBhY3RpdmUgPT09ICdwYW4nID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgncGFuJyksXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgczNkID0gdGhpcy5hY3RpdmVTdXJmYWNlM2RNb2RlO1xuICAgICAgaXRlbXMucHVzaChcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnWm9vbScsXG4gICAgICAgICAgaWNvbjogJ3BpIHBpLXNlYXJjaCcsXG4gICAgICAgICAgc3R5bGVDbGFzczogczNkID09PSAnem9vbScgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlU3VyZmFjZTNkTW9kZSgnem9vbScpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdQYW4nLFxuICAgICAgICAgIGljb246ICdwaSBwaS1hcnJvd3MtYWx0JyxcbiAgICAgICAgICBzdHlsZUNsYXNzOiBzM2QgPT09ICdwYW4nID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZVN1cmZhY2UzZE1vZGUoJ3BhbicpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdPcmJpdGFsIHJvdGF0aW9uJyxcbiAgICAgICAgICBpY29uOiAncGkgcGktZ2xvYmUnLFxuICAgICAgICAgIHN0eWxlQ2xhc3M6IHMzZCA9PT0gJ29yYml0JyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVTdXJmYWNlM2RNb2RlKCdvcmJpdCcpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdUdXJudGFibGUgcm90YXRpb24nLFxuICAgICAgICAgIGljb246ICdwaSBwaS1zeW5jJyxcbiAgICAgICAgICBzdHlsZUNsYXNzOiBzM2QgPT09ICd0dXJudGFibGUnID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZVN1cmZhY2UzZE1vZGUoJ3R1cm50YWJsZScpLFxuICAgICAgICB9LFxuICAgICAgICB7IHNlcGFyYXRvcjogdHJ1ZSB9LFxuICAgICAgICB7IGxhYmVsOiAnUmVzZXQgY2FtZXJhJywgaWNvbjogJ3BpIHBpLWhvbWUnLCBjb21tYW5kOiAoKSA9PiB0aGlzLnJlc2V0U3VyZmFjZUNhbWVyYSgpIH0sXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0hlYXRtYXApIHtcbiAgICAgIGl0ZW1zLnB1c2goXG4gICAgICAgIHsgbGFiZWw6ICdab29tIGluJywgaWNvbjogJ3BpIHBpLXNlYXJjaC1wbHVzJywgY29tbWFuZDogKCkgPT4gdGhpcy56b29tSW4oKSB9LFxuICAgICAgICB7IGxhYmVsOiAnWm9vbSBvdXQnLCBpY29uOiAncGkgcGktc2VhcmNoLW1pbnVzJywgY29tbWFuZDogKCkgPT4gdGhpcy56b29tT3V0KCkgfSxcbiAgICAgICAgeyBzZXBhcmF0b3I6IHRydWUgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnU2VsZWN0JyxcbiAgICAgICAgICBpY29uOiAncGkgcGktYXJyb3ctdXAtcmlnaHQnLFxuICAgICAgICAgIHN0eWxlQ2xhc3M6IGFjdGl2ZSA9PT0gJ3NlbGVjdCcgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ3NlbGVjdCcpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdGcmVlZm9ybScsXG4gICAgICAgICAgaWNvbjogJ3BpIHBpLXBlbmNpbCcsXG4gICAgICAgICAgc3R5bGVDbGFzczogYWN0aXZlID09PSAnZHJhd2Nsb3NlZHBhdGgnID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdkcmF3Y2xvc2VkcGF0aCcpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdCcnVzaCcsXG4gICAgICAgICAgaWNvbjogJ2JydXNoLWljb24nLFxuICAgICAgICAgIHN0eWxlQ2xhc3M6IGFjdGl2ZSA9PT0gJ2JydXNoJyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnYnJ1c2gnKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnUG9seWxpbmUnLFxuICAgICAgICAgIGljb246ICdwb2x5bGluZS1pY29uJyxcbiAgICAgICAgICBzdHlsZUNsYXNzOiBhY3RpdmUgPT09ICdkcmF3b3BlbnBhdGgnID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdkcmF3b3BlbnBhdGgnKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnUmVjdGFuZ2xlJyxcbiAgICAgICAgICBpY29uOiAncGkgcGktc3RvcCcsXG4gICAgICAgICAgc3R5bGVDbGFzczogYWN0aXZlID09PSAnZHJhd3JlY3QnID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdkcmF3cmVjdCcpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdXYW5kJyxcbiAgICAgICAgICBpY29uOiAnd2FuZC1pY29uJyxcbiAgICAgICAgICBzdHlsZUNsYXNzOiBhY3RpdmUgPT09ICd3YW5kJyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnd2FuZCcpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdWZXJ0ZXggZXJhc2VyJyxcbiAgICAgICAgICBpY29uOiAncGkgcGktZXJhc2VyJyxcbiAgICAgICAgICBzdHlsZUNsYXNzOiBhY3RpdmUgPT09ICdlcmFzZVZlcnRleCcgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ2VyYXNlVmVydGV4JyksXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgLy8gVmVydGV4IGVkaXRpbmcgcnVucyBvbiB0aGUgT3BlblNlYWRyYWdvbiBvdmVybGF5LCB3aGljaFxuICAgICAgLy8gYmFja3MgdGhlIEltYWdlIHBsb3QgdHlwZS4gSGlkZGVuIGZvciBvdGhlciAyRCB0eXBlcyAoUGxvdGx5KSwgd2hlcmVcbiAgICAgIC8vIHRoZXNlIG1vZGVzIGFyZSBuby1vcHMuXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZFBsb3RUeXBlID09PSBQbG90VHlwZS5JTUFHRSkge1xuICAgICAgICBpdGVtcy5wdXNoKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnUG9seWdvbiAoY2xpY2sgdmVydGljZXMpJyxcbiAgICAgICAgICAgIGljb246ICdwb2x5Z29uLXZlcnRpY2VzLWljb24nLFxuICAgICAgICAgICAgc3R5bGVDbGFzczogYWN0aXZlID09PSAnZHJhd3BvbHlnb24nID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ2RyYXdwb2x5Z29uJyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogJ0FkZCB2ZXJ0ZXgnLFxuICAgICAgICAgICAgaWNvbjogJ3ZlcnRleC1hZGQtaWNvbicsXG4gICAgICAgICAgICBzdHlsZUNsYXNzOiBhY3RpdmUgPT09ICdhZGRwb2ludCcgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnYWRkcG9pbnQnKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnRGVsZXRlIHZlcnRleCcsXG4gICAgICAgICAgICBpY29uOiAndmVydGV4LWRlbGV0ZS1pY29uJyxcbiAgICAgICAgICAgIHN0eWxlQ2xhc3M6IGFjdGl2ZSA9PT0gJ2RlbGV0ZXBvaW50JyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdkZWxldGVwb2ludCcpLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBCw6l6aWVyIGNvbnZlcnNpb25zICsgRGVsZXRlIGFyZSBpbW1lZGlhdGUgc2VsZWN0aW9uICphY3Rpb25zKiwgbm93IGluIHRoZVxuICAgICAgLy8gXCJTZWxlY3RlZCByZWdpb24ocylcIiBncm91cCBhdCB0aGUgdG9wIChzZWUgYnVpbGRSZWdpb25BY3Rpb25JdGVtcykuXG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIHRvZ2dsZVN1cmZhY2UzZE1vZGUobW9kZTogc3RyaW5nKSB7XG4gICAgdGhpcy5hY3RpdmVTdXJmYWNlM2RNb2RlID0gbW9kZTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFN1cmZhY2VEcmFnTW9kZShtb2RlKTtcbiAgfVxuXG4gIHJlc2V0U3VyZmFjZUNhbWVyYSgpIHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnJlc2V0U3VyZmFjZUNhbWVyYSgpO1xuICB9XG5cbiAgLyoqIFRvZ2dsZSB0aGUgbmFwYXJpIDNEIGNvb3JkaW5hdGUtYXhlcyAvIHNjYWxlIGdpem1vICh2b2x1bWUvaXNvc3VyZmFjZSkuIE5vLW9wIG9uIGJhY2tlbmRzXG4gICAqICB0aGF0IGRvbid0IHJlbmRlciBvbmUgKHRoZSBjb250cm9sIG1ldGhvZCBpcyBvcHRpb25hbCkuICovXG4gIHRvZ2dsZUF4ZXMoKSB7XG4gICAgdGhpcy5heGVzVmlzaWJsZSA9ICF0aGlzLmF4ZXNWaXNpYmxlO1xuICAgIHRoaXMucGxvdFNlcnZpY2UuZ2V0U3VyZmFjZTNkQ29udHJvbHMoKT8uc2V0QXhlc1Zpc2libGU/Lih0aGlzLmF4ZXNWaXNpYmxlKTtcbiAgfVxuXG4gIC8qKiBUb2dnbGUgdGhlIG5hcGFyaSBzdXJmYWNlIHdpcmVmcmFtZSAoZWRnZXMgdnMgZmlsbGVkKS4gTm8tb3Agb24gYmFja2VuZHMgd2l0aG91dCBhIHN1cmZhY2UuICovXG4gIHRvZ2dsZVdpcmVmcmFtZSgpIHtcbiAgICB0aGlzLndpcmVmcmFtZUFjdGl2ZSA9ICF0aGlzLndpcmVmcmFtZUFjdGl2ZTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmdldFN1cmZhY2UzZENvbnRyb2xzKCk/LnNldFdpcmVmcmFtZT8uKHRoaXMud2lyZWZyYW1lQWN0aXZlKTtcbiAgfVxuXG4gIC8qKiBDaGFuZ2UgdGhlIG5hcGFyaSAzRCBkZWNpbWF0ZSBmYWN0b3IuIERlY2ltYXRpb24gY2hhbmdlcyB0aGUgZmV0Y2hlZC9hc3NlbWJsZWQgZGF0YSwgc28gdGhpc1xuICAgKiAgcmUtcGxvdHMgdGhlIGN1cnJlbnQgM0QgdHlwZSBhdCB0aGUgbmV3IHJlc29sdXRpb24gKHVubGlrZSBheGVzL3dpcmVmcmFtZSwgd2hpY2ggYXJlIGxpdmUpLiAqL1xuICBzZWxlY3RSZXNvbHV0aW9uKHNjYWxlOiBudW1iZXIpIHtcbiAgICBpZiAoc2NhbGUgPT09IHRoaXMucmVzb2x1dGlvblNjYWxlKSByZXR1cm47XG4gICAgdGhpcy5yZXNvbHV0aW9uU2NhbGUgPSBzY2FsZTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFJlc29sdXRpb25TY2FsZT8uKHNjYWxlKTtcbiAgICB0aGlzLnJlbG9hZEFuZFBsb3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2l0Y2ggdGhlIGFjdGl2ZSBwbG90IHR5cGUgKGhlYXRtYXAsIHN1cmZhY2UsIGNvbnRvdXIsIHNjYXR0ZXIsIGxpbmUsXG4gICAqIHNjYXR0ZXIzZCwgaXNvc3VyZmFjZSkuIEtlZXBzIGBpc0hlYXRtYXBgIGFzIHRoZSAyRC12cy0zRCBmbGFnIHRoZSByZXN0IG9mXG4gICAqIHRoZSB0b29sYmFyL2NvbnRleHQtbWVudSBsb2dpYyByZWxpZXMgb24sIGRlYWN0aXZhdGVzIDJELW9ubHkgdG9vbHMgd2hlblxuICAgKiBtb3ZpbmcgdG8gYSAzRCB0eXBlLCB0aGVuIHJlLXBsb3RzLlxuICAgKi9cbiAgb25TZWxlY3RQbG90VHlwZSh0eXBlOiBQbG90VHlwZSkge1xuICAgIHRoaXMucGxvdFR5cGUgPSB0eXBlO1xuICAgIHRoaXMuc2VsZWN0ZWRQbG90VHlwZSA9IHR5cGU7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IHRoaXMucGxvdFR5cGVPcHRpb25zLmZpbmQoKGQpID0+IGQudHlwZSA9PT0gdHlwZSk7XG4gICAgY29uc3QgaXMzZCA9IGRlc2NyaXB0b3I/LmRpbWVuc2lvbnMgPT09ICczZCc7XG4gICAgdGhpcy5pc0hlYXRtYXAgPSAhaXMzZDtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFBsb3RUeXBlKHR5cGUpO1xuICAgIC8vIFN3aXRjaGluZyBwbG90IHR5cGUgY2FuY2VscyB0aGUgYWN0aXZlIHRvb2wg4oCUIG5vdCBldmVyeSB0eXBlIHN1cHBvcnRzIHRoZVxuICAgIC8vIHNhbWUgdG9vbHMgKGxpbmUvc2NhdHRlciBjaGFydHMgYW5kIDNEIHNjZW5lcyBoYXZlIG5vIGJveCB6b29tIG9yIHJlZ2lvblxuICAgIC8vIGRyYXdpbmcpLCBzbyBsZWF2aW5nIGEgdG9vbCBhcm1lZCB3b3VsZCBtaXNiZWhhdmUgb24gdGhlIG5ldyBwbG90LlxuICAgIHRoaXMuZGVhY3RpdmF0ZUFjdGl2ZVRvb2woKTtcbiAgICBpZiAoaXMzZCkge1xuICAgICAgdGhpcy5hY3RpdmVTdXJmYWNlM2RNb2RlID0gJ3R1cm50YWJsZSc7XG4gICAgfVxuICAgIC8vIG5hcGFyaS1qcyB2b2x1bWUvaXNvc3VyZmFjZSBhc3NlbWJsZSB0aGVpciBvd24gM0QgdGV4dHVyZSBmcm9tIHRoZSBzbGljZSBlbmRwb2ludCwgc29cbiAgICAvLyB0aGV5IHRha2UgdGhlIG5vcm1hbCByZS1wbG90IHBhdGgg4oCUIE5PVCBQbG90bHkncyBzdGFjay1mcmFtZSBsb2FkZXIgKHdob3NlIFwiTG9hZGluZ1xuICAgIC8vIGZyYW1lc1wiIG92ZXJsYXkgd291bGQgbmV2ZXIgY2xlYXIsIHNpbmNlIFBsb3RseSBpc24ndCB0aGUgYWN0aXZlIGJhY2tlbmQpIChqaXQtdWkjMTAyKS5cbiAgICBjb25zdCBpc05hcGFyaSA9IHR5cGUgPT09IFBsb3RUeXBlLk5BUEFSSV9JTUFHRSB8fCBpc05hcGFyaTNkKHR5cGUpO1xuICAgIGlmIChkZXNjcmlwdG9yPy5yZXF1aXJlc1N0YWNrICYmICFpc05hcGFyaSkge1xuICAgICAgLy8gVm9sdW1lIHR5cGVzIChpc29zdXJmYWNlLCBzY2F0dGVyM2QpIG5lZWQgdGhlIHdob2xlIHotc3RhY2sgbG9hZGVkIGFzIGFcbiAgICAgIC8vIDNEIGFycmF5LCBhbmQgdGhleSBhbHdheXMgcmVuZGVyIG9uIFBsb3RseS4gRHJpdmUgdGhlIHN0YWNrIHJlbG9hZFxuICAgICAgLy8gZGlyZWN0bHkgdGhyb3VnaCB0aGUgaW1hZ2UtaW5mbyBzdHJlYW0gcmF0aGVyIHRoYW4gdGhlIGFjdGl2ZSByZW5kZXJlcidzXG4gICAgICAvLyBzZXRTaG93U3RhY2s6IHdoZW4gT3BlblNlYWRyYWdvbiBvd25zIHRoZSBJbWFnZSB2aWV3IGl0cyBzZXRTaG93U3RhY2sgaXNcbiAgICAgIC8vIGEgbm8tb3AsIHNvIHRoZSByZWxvYWQgbmV2ZXIgZmlyZWQgYW5kIHRoZSBsb2FkZXIgc3B1biBmb3JldmVyLiBXZSBhcm1cbiAgICAgIC8vIFBsb3RseSdzIHN0YWNrLWxvYWRpbmcgZmxhZyAoa2VlcHMgaXRzIGZyYW1lLWZldGNoIGxvb3AgYWxpdmUpIGFuZFxuICAgICAgLy8gcmUtZW1pdCB0aGUgaW1hZ2UgaW5mbyB3aXRoIHNob3dTdGFjayBvbiBzbyB0aGUgcGlwZWxpbmUgcmVsb2FkcyBvblxuICAgICAgLy8gUGxvdGx5IHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggYmFja2VuZCB3YXMgb24gc2NyZWVuLlxuICAgICAgdGhpcy5zZWxlY3RlZFN0YWNrT3B0aW9uID0gdGhpcy5zdGFja09wdGlvbnNbMV07XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZyA9IHRydWU7XG4gICAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFN0YWNrTG9hZGluZyh0cnVlKTtcbiAgICAgIGlmICh0aGlzLmltYWdlSW5mbykge1xuICAgICAgICB0aGlzLmltYWdlSW5mby5zaG93U3RhY2sgPSB0cnVlO1xuICAgICAgICB0aGlzLnN0YXRlLnNldEltYWdlSW5mbyh0aGlzLmltYWdlSW5mbyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVsb2FkQW5kUGxvdCgpO1xuICB9XG5cbiAgLyoqIERlYWN0aXZhdGUgd2hhdGV2ZXIgdG9vbCBpcyBhcm1lZCBhbmQgY2xlYXIgZXZlcnkgdG9vbCBtb2RlLiAqL1xuICBwcml2YXRlIGRlYWN0aXZhdGVBY3RpdmVUb29sKCkge1xuICAgIHRoaXMuYWN0aXZlRHJhZ01vZGUgPSBudWxsO1xuICAgIHRoaXMuc2Vzc2lvbi5zZXRBY3RpdmVUb29sKG51bGwpO1xuICAgIHRoaXMucGxvdFNlcnZpY2UuZ2V0UmVnaW9uT3ZlcmxheSgpPy5zZXRNb2RlKCdub25lJyk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXREcmFnTW9kZShmYWxzZSk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRab29tVG9Cb3hNb2RlKGZhbHNlKTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFdhbmRNb2RlKGZhbHNlKTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldEJydXNoTW9kZShmYWxzZSk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRTYW1Qb2ludE1vZGUoZmFsc2UpO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0VmVydGV4RXJhc2VyTW9kZShmYWxzZSk7XG4gIH1cbn1cblxuIiwiPCEtLSBTQU0gdG9hc3Q6IGxpdmUgc3RhdHVzICsgZW5jb2Rlci1kb3dubG9hZCBwcm9ncmVzcyBiYXIgKGppdC11aSM5MCkuIFN0aWNreVxuICAgICB3aGlsZSBhIHNlZ21lbnQgcnVuczsgc3RheXMgb3BlbiB1bnRpbCB0aGUgYmFyIHJlYWNoZXMgMTAwJSBhbmQgdGhlIHJ1biBlbmRzLiAtLT5cbjxwLXRvYXN0IFtrZXldPVwic2FtVG9hc3RLZXlcIiBwb3NpdGlvbj1cImJvdHRvbS1yaWdodFwiPlxuICA8bmctdGVtcGxhdGUgbGV0LW1lc3NhZ2UgcFRlbXBsYXRlPVwibWVzc2FnZVwiPlxuICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxOyBtaW4td2lkdGg6IDE2cmVtXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9udC1ib2xkIG1iLTFcIj57eyBtZXNzYWdlLnN1bW1hcnkgfX08L2Rpdj5cbiAgICAgIDxkaXY+e3sgc2FtU3RhdHVzIHx8IG1lc3NhZ2UuZGV0YWlsIH19PC9kaXY+XG4gICAgICA8cC1wcm9ncmVzc0JhciAqbmdJZj1cInNhbURvd25sb2FkaW5nXCIgW3ZhbHVlXT1cInNhbVByb2dyZXNzXCIgc3R5bGVDbGFzcz1cIm10LTIgc2FtLXByb2dyZXNzXCI+PC9wLXByb2dyZXNzQmFyPlxuICAgICAgPHAtcHJvZ3Jlc3NCYXIgKm5nSWY9XCJzYW1CdXN5ICYmICFzYW1Eb3dubG9hZGluZ1wiIG1vZGU9XCJpbmRldGVybWluYXRlXCIgc3R5bGVDbGFzcz1cIm10LTJcIlxuICAgICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cInsgaGVpZ2h0OiAnNHB4JyB9XCI+PC9wLXByb2dyZXNzQmFyPlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuPC9wLXRvYXN0PlxuXG48IS0tIFJlc3VsdC9lcnJvciBub3RpY2VzIGZyb20gdGhlIGxpYnJhcnkgaXRzZWxmIChzZWdtZW50YXRpb24gb3V0Y29tZSwgcmVnaW9uXG4gICAgIHZhbGlkYXRpb24pLiBSZW5kZXJlZCBoZXJlIHNvIHRoZXkgZG8gbm90IGRlcGVuZCBvbiB0aGUgaG9zdCBtb3VudGluZyBhXG4gICAgIGtleWxlc3MgPHAtdG9hc3Q+IOKAlCB3aXRob3V0IHRoaXMgdGhlIG1lc3NhZ2VzIHdlbnQgbm93aGVyZSBpbiBhbnkgaG9zdCBidXRcbiAgICAgaml0LXVpLCBhbmQgYSBmYWlsZWQgcnVuIGxvb2tlZCBsaWtlIGEgYnV0dG9uIHRoYXQgZGlkIG5vdGhpbmcuIC0tPlxuPHAtdG9hc3QgW2tleV09XCJyZXN1bHRUb2FzdEtleVwiIHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCI+PC9wLXRvYXN0PlxuXG48IS0tIFNoYXJlZCBvdXRsZXRzIGZvciBub3RpY2VzIHJhaXNlZCB3aGVyZSB0aGVyZSBpcyBubyBwZXItaW5zdGFuY2Uga2V5IHRvIHVzZTpcbiAgICAgdGhlIHJvb3QtcHJvdmlkZWQgUGxvdGx5U2VydmljZSBhbmQgdGhlIHJlZ2lvbi1lZGl0b3IgZGlhbG9nLiBSZW5kZXJlZCBieSBhXG4gICAgIHNpbmdsZSB2aXN1YWxpemVyIChvd25zU2hhcmVkVG9hc3RzKSBzbyBhIG1lc3NhZ2UgZnJvbSB0aGUgcm9vdCBzZXJ2aWNlIGlzXG4gICAgIG5vdCBzaG93biBvbmNlIHBlciBsaXZlIHZpZXdlci4gLS0+XG48cC10b2FzdCAqbmdJZj1cIm93bnNTaGFyZWRUb2FzdHNcIiBba2V5XT1cInZpelRvYXN0S2V5XCI+PC9wLXRvYXN0PlxuPHAtdG9hc3QgKm5nSWY9XCJvd25zU2hhcmVkVG9hc3RzXCIgW2tleV09XCJ2aXpBbGVydFRvYXN0S2V5XCIgcG9zaXRpb249XCJjZW50ZXJcIj48L3AtdG9hc3Q+XG5cbjwhLS0gVG9vbGJhciBkb2NrOiBkb2NrZWQgYWNyb3NzIHRoZSB0b3AgYnkgZGVmYXVsdDsgZHJhZyB0aGUgaGFuZGxlIHRvIGRldGFjaFxuICAgICBpdCBpbnRvIGEgZmxvYXRpbmcsIG1vdmFibGUgd2luZG93IChmcmVlcyB0aGUgdG9wIHJvdyBmb3IgdGhlIGltYWdlKS4gLS0+XG48ZGl2IGNsYXNzPVwidG9vbGJhci1kb2NrXCIgW2NsYXNzLmZsb2F0aW5nXT1cInRvb2xiYXJGbG9hdGluZ1wiXG4gICAgIFtzdHlsZS5sZWZ0LnB4XT1cInRvb2xiYXJGbG9hdGluZyA/IHRvb2xiYXJQb3MueCA6IG51bGxcIlxuICAgICBbc3R5bGUudG9wLnB4XT1cInRvb2xiYXJGbG9hdGluZyA/IHRvb2xiYXJQb3MueSA6IG51bGxcIj5cbiAgPGRpdiBjbGFzcz1cInRvb2xiYXItZHJhZy1oYW5kbGVcIiAobW91c2Vkb3duKT1cIm9uVG9vbGJhckRyYWdTdGFydCgkZXZlbnQpXCJcbiAgICAgICBwVG9vbHRpcD1cIkRyYWcgdG8gZmxvYXQgdGhlIHRvb2xiYXJcIiB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIj5cbiAgICA8aSBjbGFzcz1cInBpIHBpLWJhcnNcIj48L2k+XG4gIDwvZGl2PlxuPHBsb3R0aW5nLXRvb2xiYXJcbiAgW2ltYWdlSW5mb109XCJpbWFnZUluZm9cIlxuICBbcGxvdFR5cGVPcHRpb25zXT1cInBsb3RUeXBlT3B0aW9uc1wiXG4gIFtzZWxlY3RlZFBsb3RUeXBlXT1cInNlbGVjdGVkUGxvdFR5cGVcIlxuICBbaXNvUmFuZ2VdPVwiaXNvUmFuZ2VcIlxuICBbbWF4SW5kZXhdPVwibWF4SW5kZXhcIlxuICBbekluZGV4XT1cInpJbmRleFwiXG4gIFtpc0hlYXRtYXBdPVwiaXNIZWF0bWFwXCJcbiAgW2FjdGl2ZURyYWdNb2RlXT1cImFjdGl2ZURyYWdNb2RlXCJcbiAgW2FjdGl2ZVN1cmZhY2UzZE1vZGVdPVwiYWN0aXZlU3VyZmFjZTNkTW9kZVwiXG4gIFtheGVzVmlzaWJsZV09XCJheGVzVmlzaWJsZVwiXG4gIFt3aXJlZnJhbWVBY3RpdmVdPVwid2lyZWZyYW1lQWN0aXZlXCJcbiAgW3Jlc29sdXRpb25TY2FsZV09XCJyZXNvbHV0aW9uU2NhbGVcIlxuICBbd2FuZFNlbnNpdGl2aXR5XT1cIndhbmRTZW5zaXRpdml0eVwiXG4gIFticnVzaFNpemVdPVwiYnJ1c2hTaXplXCJcbiAgW3NhbU1vZGVsc109XCJzYW1Nb2RlbHNcIlxuICBbc2FtTW9kZWxJZF09XCJzYW1Nb2RlbElkXCJcbiAgW3lvbG9Nb2RlbHNdPVwieW9sb01vZGVsc1wiXG4gIFt5b2xvTW9kZWxJZF09XCJ5b2xvTW9kZWxJZFwiXG4gIFt2ZXJ0ZXhFcmFzZXJSYWRpdXNdPVwidmVydGV4RXJhc2VyUmFkaXVzXCJcbiAgW2NhblVuZG9dPVwiY2FuVW5kb1JlZ2lvblwiXG4gIFtjYW5SZWRvXT1cImNhblJlZG9SZWdpb25cIlxuICBbc3RhY2tPcHRpb25zXT1cInN0YWNrT3B0aW9uc1wiXG4gIFt0b29sc109XCJ0b29sYmFyVG9vbHNcIlxuICBbaW1hZ2VTbW9vdGhpbmdFbmFibGVkXT1cImltYWdlU21vb3RoaW5nRW5hYmxlZFwiXG4gIChzZWxlY3RQbG90VHlwZSk9XCJvblNlbGVjdFBsb3RUeXBlKCRldmVudClcIlxuICAodG9nZ2xlSW1hZ2VTbW9vdGhpbmcpPVwib25Ub2dnbGVJbWFnZVNtb290aGluZygpXCJcbiAgKGFkZFByb2ZpbGVMaW5lKT1cImFkZFByb2ZpbGVMaW5lKClcIlxuICAoaXNvUmFuZ2VDaGFuZ2UpPVwib25Jc29SYW5nZUNoYW5nZSgkZXZlbnQpXCJcbiAgKG9wZW5DaGFubmVsSGlzdG9ncmFtKT1cIm9wZW5DaGFubmVsSGlzdG9ncmFtKClcIlxuICAob3BlblJlZ2lvbkVkaXRvcik9XCJvcGVuUmVnaW9uRWRpdG9yKClcIlxuICAoc2VsZWN0U3RhY2tPcHRpb24pPVwic2VsZWN0U3RhY2tPcHRpb24oJGV2ZW50KVwiXG4gICh6U2NydWIpPVwib25aU2NydWIoJGV2ZW50KVwiXG4gICh6U2xpZGUpPVwib25aU2xpZGUoJGV2ZW50KVwiXG4gICh6SW5kZXhJbnB1dCk9XCJ6SW5kZXggPSAkZXZlbnQ7IHVwZGF0ZVpJbmRleCgpXCJcbiAgKHJlbG9hZEFuZFBsb3QpPVwicmVsb2FkQW5kUGxvdCgpXCJcbiAgKGRvd25sb2FkSW1hZ2UpPVwiZG93bmxvYWRJbWFnZSgpXCJcbiAgKGF1dG9zY2FsZUltYWdlKT1cImF1dG9zY2FsZUltYWdlKClcIlxuICAodG9nZ2xlRHJhZ01vZGUpPVwidG9nZ2xlRHJhZ01vZGUoJGV2ZW50KVwiXG4gICh6b29tSW4pPVwiem9vbUluKClcIlxuICAoem9vbU91dCk9XCJ6b29tT3V0KClcIlxuICAodG9nZ2xlU3VyZmFjZTNkTW9kZSk9XCJ0b2dnbGVTdXJmYWNlM2RNb2RlKCRldmVudClcIlxuICAocmVzZXRTdXJmYWNlQ2FtZXJhKT1cInJlc2V0U3VyZmFjZUNhbWVyYSgpXCJcbiAgKHRvZ2dsZUF4ZXMpPVwidG9nZ2xlQXhlcygpXCJcbiAgKHRvZ2dsZVdpcmVmcmFtZSk9XCJ0b2dnbGVXaXJlZnJhbWUoKVwiXG4gIChzZWxlY3RSZXNvbHV0aW9uKT1cInNlbGVjdFJlc29sdXRpb24oJGV2ZW50KVwiXG4gIChkZWxldGVSZWdpb24pPVwiZGVsZXRlUmVnaW9uKClcIlxuICAodW5kb1JlZ2lvbik9XCJ1bmRvUmVnaW9uKClcIlxuICAocmVkb1JlZ2lvbik9XCJyZWRvUmVnaW9uKClcIlxuICAoc2VnbWVudFJlZ2lvbnMpPVwic2VnbWVudFJlZ2lvbnMoKVwiXG4gIChzZWdtZW50Q2VsbHBvc2UpPVwic2VnbWVudENlbGxwb3NlKClcIlxuICAoc2FtTW9kZWxDaGFuZ2UpPVwib25TYW1Nb2RlbENoYW5nZSgkZXZlbnQpXCJcbiAgKGRldGVjdFlvbG8pPVwiZGV0ZWN0WW9sbygpXCJcbiAgKHlvbG9Nb2RlbENoYW5nZSk9XCJvbllvbG9Nb2RlbENoYW5nZSgkZXZlbnQpXCJcbiAgKG9wZW5Zb2xvUGFyYW1zKT1cIm9wZW5Zb2xvUGFyYW1zKClcIlxuICAod2FuZFNlbnNpdGl2aXR5Q2hhbmdlKT1cIm9uV2FuZFNlbnNpdGl2aXR5Q2hhbmdlKCRldmVudClcIlxuICAoYnJ1c2hTaXplQ2hhbmdlKT1cIm9uQnJ1c2hTaXplQ2hhbmdlKCRldmVudClcIlxuICAodmVydGV4RXJhc2VyUmFkaXVzQ2hhbmdlKT1cIm9uVmVydGV4RXJhc2VyUmFkaXVzQ2hhbmdlKCRldmVudClcIj5cbiAgPCEtLSBIb3N0LXByb2plY3RlZCBjdXN0b20gdG9vbGJhciBidXR0b25zLCBmb3J3YXJkZWQgaW50byB0aGUgdG9vbGJhci4gLS0+XG4gIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbjwvcGxvdHRpbmctdG9vbGJhcj5cbiAgPHAtYnV0dG9uICpuZ0lmPVwidG9vbGJhckZsb2F0aW5nXCIgY2xhc3M9XCJ0b29sYmFyLWRvY2stYnRuXCIgaWNvbj1cInBpIHBpLXRodW1idGFja1wiIHNpemU9XCJzbWFsbFwiIFt0ZXh0XT1cInRydWVcIlxuICAgICAgICAgICAgcFRvb2x0aXA9XCJEb2NrIHRvIHRvcFwiIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiIChvbkNsaWNrKT1cImRvY2tUb29sYmFyKClcIj5cbiAgPC9wLWJ1dHRvbj5cbjwvZGl2PlxuXG48cC1jb250ZXh0TWVudSAjY20gW21vZGVsXT1cImNvbnRleHRNZW51SXRlbXNcIiBhcHBlbmRUbz1cImJvZHlcIj48L3AtY29udGV4dE1lbnU+XG48IS0tIE5vIGBoLWZ1bGxgIGhlcmU6IFByaW1lRmxleCdzIGhlaWdodDoxMDAlICFpbXBvcnRhbnQgbWFkZSAjcGxvdCBhcyB0YWxsIGFzXG4gICAgIHRoZSB3aG9sZSBob3N0LCBzbyB1bmRlciB0aGUgZG9ja2VkIHRvb2xiYXIgaXRzIGJvdHRvbSB0b29sYmFyLWhlaWdodCBzdHJpcFxuICAgICAoaW5jbC4gdGhlIE9TRCBzY2FsZSBiYXIgYXQgYm90dG9tLWxlZnQpIHdhcyBjbGlwcGVkIGJ5IHRoZSBob3N0J3NcbiAgICAgb3ZlcmZsb3c6aGlkZGVuLiBUaGUgY29tcG9uZW50IHN0eWxlc2hlZXQgc2l6ZXMgaXQgKC52aXotcGxvdCB7IGZsZXg6IDEgfSkuIC0tPlxuPGRpdiBjbGFzcz1cInctZnVsbCByZWxhdGl2ZSB2aXotcGxvdFwiIFtpZF09XCJwbG90RGl2TmFtZVwiPlxuICA8ZGl2ICpuZ0lmPVwiaW1nTG9hZGluZyB8fCBzdGFja0xvYWRpbmcgfHwgaXNDYWNoaW5nXCIgaWQ9XCJvdmVybGF5XCI+XG4gICAgPCEtLSBEZXRlcm1pbmF0ZSBzdGFjay92b2x1bWUgcHJvZ3Jlc3MgdGFrZXMgcHJlY2VkZW5jZTogd2hpbGUgaXQncyBhY3RpdmUgc2hvdyBPTkxZIHRoZVxuICAgICAgICAgcHJvZ3Jlc3MgYmFyICsgXCJMb2FkaW5nIGZyYW1lcy4uLlwiLCBub3QgdGhlIGdlbmVyaWMgc3Bpbm5lci9cIkxvYWRpbmcgaW1hZ2UuLi5cIiBvbiB0b3Agb2ZcbiAgICAgICAgIGl0IChib3RoIHdlcmUgcmVuZGVyaW5nIGF0IG9uY2UgZm9yIG5hcGFyaSB2b2x1bWUvaXNvc3VyZmFjZSBsb2FkcykuIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdGFja0xvYWRpbmc7IGVsc2UgaW1nTG9hZGluZ1RwbFwiPlxuICAgICAgPHAtcHJvZ3Jlc3NCYXIgY2xhc3M9XCJwcm9ncmVzc1wiIFt2YWx1ZV09XCJsb2FkaW5nUGVyY2VudGFnZVwiPjwvcC1wcm9ncmVzc0Jhcj5cbiAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sb2FkaW5nXCI+TG9hZGluZyBmcmFtZXMuLi48L3NwYW4+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLXRlbXBsYXRlICNpbWdMb2FkaW5nVHBsPlxuICAgICAgPCEtLSBDYWNoZS1jb3B5IHByb2dyZXNzIGlzIHNob3duIHdoZW5ldmVyIGEgY2FjaGUgZG93bmxvYWQgaXMgYWN0aXZlIChpc0NhY2hpbmcpLCBpbmRlcGVuZGVudFxuICAgICAgICAgICBvZiBgaW1nTG9hZGluZ2AsIHNvIGl0J3MgbmV2ZXIgZHJvcHBlZC9tYXNrZWQgbWlkLWRvd25sb2FkLiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0NhY2hpbmc7IGVsc2Ugc3Bpbm5lckxvYWRpbmdcIj5cbiAgICAgICAgPCEtLSBTdGFnZS1hd2FyZSBtZXNzYWdlIGNvbWVzIGZyb20gQ2FjaGVQcm9ncmVzc1NlcnZpY2UgdXBkYXRpbmdcbiAgICAgICAgICAgICBpbWFnZUxvYWRpbmdNZXNzYWdlJCAoXCJDYWNoaW5nIGltYWdlLi4uXCIgZHVyaW5nIHRoZSBHQ1MgZG93bmxvYWQsXG4gICAgICAgICAgICAgdGhlbiBcIkdlbmVyYXRpbmcgcHJldmlldy4uLlwiIGR1cmluZyBwZXItc2xpY2UgdGh1bWJuYWlsIGdlbikuIE9uY2UgdGhlXG4gICAgICAgICAgICAgZG93bmxvYWQgaGl0cyAxMDAlIHRoZSByZW1haW5pbmcgd29yayAoc2VydmVyIHByZXZpZXcvdGlsZSBnZW5lcmF0aW9uKVxuICAgICAgICAgICAgIGhhcyBubyBkZXRlcm1pbmF0ZSBwcm9ncmVzcywgc28gZmFsbCB0aHJvdWdoIHRvIHRoZSBzcGlubmVyIHRlbXBsYXRlXG4gICAgICAgICAgICAgcmF0aGVyIHRoYW4gcGFya2luZyBhIGZ1bGwgYmFyIHVuZGVyIFwiTG9hZGluZyBpbWFnZS4uLlwiLiAtLT5cbiAgICAgICAgPHAtcHJvZ3Jlc3NCYXIgY2xhc3M9XCJwcm9ncmVzc1wiIFt2YWx1ZV09XCJjYWNoZVByb2dyZXNzXCI+PC9wLXByb2dyZXNzQmFyPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbG9hZGluZ1wiPnt7bG9hZGluZ01lc3NhZ2V9fTwvc3Bhbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNzcGlubmVyTG9hZGluZz5cbiAgICAgICAgPGRpdiAqbmdJZj1cImltZ0xvYWRpbmdcIiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJpbWdMb2FkaW5nICYmICF6b29tXCIgY2xhc3M9XCJ0ZXh0LWxvYWRpbmdcIj57e2xvYWRpbmdNZXNzYWdlfX08L3NwYW4+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiaW1nTG9hZGluZyAmJiB6b29tXCIgY2xhc3M9XCJ6b29tLXRleHQtbG9hZGluZ1wiPnt7bG9hZGluZ01lc3NhZ2V9fTwvc3Bhbj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8cC1idXR0b24gKm5nSWY9XCJzdGFja0xvYWRpbmcgfHwgaW1nTG9hZGluZ1wiIGNsYXNzPVwiY2FuY2VsLWxvYWRpbmcgXCIgbGFiZWw9XCJDYW5jZWxcIlxuICAgICAgICAgICAgICAob25DbGljayk9XCJjYW5jZWxMb2FkaW5nKClcIj5cbiAgICA8L3AtYnV0dG9uPlxuICA8L2Rpdj5cbiAgPCEtLSBUcmFuc2x1Y2VudCBcInNoYXJwZW5pbmdcIiBvdmVybGF5IHNob3duIGFmdGVyIHRoZSBzbWFsbC10aWVyIHByZXZpZXcgaXNcbiAgICAgICBvbiBzY3JlZW4gd2hpbGUgdGhlIGxhcmdlLXRpZXIgcmVuZGVyIGlzIHN0aWxsIGxvYWRpbmcgaW4gdGhlXG4gICAgICAgYmFja2dyb3VuZC4gTGV0cyB0aGUgdXNlciBzZWUgdGhlIGJsdXJyeSBpbWFnZSB1bmRlcm5lYXRoIGJ1dCBtYWtlc1xuICAgICAgIGl0IGNsZWFyIHNvbWV0aGluZyBpcyBzdGlsbCBsb2FkaW5nIHNvIHRoZXkgZG9uJ3QgbWlzdGFrZSB0aGVcbiAgICAgICBsb3ctcmVzIHJlbmRlciBmb3IgdGhlIGZpbmFsIGltYWdlLiAtLT5cbiAgPGRpdiAqbmdJZj1cInNoYXJwZW5pbmcgJiYgIWltZ0xvYWRpbmcgJiYgIXN0YWNrTG9hZGluZyAmJiAhaXNDYWNoaW5nXCIgaWQ9XCJzaGFycGVuaW5nLW92ZXJsYXlcIj5cbiAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lclwiPjwvZGl2PlxuICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sb2FkaW5nXCI+U2hhcnBlbmluZyBwcmV2aWV3Li4uPC9zcGFuPlxuICA8L2Rpdj5cblxuPC9kaXY+XG5cbjwhLS0gRmxvYXRpbmcsIGRyYWdnYWJsZSBpbnRlbnNpdHktcHJvZmlsZSBpbnNldC4gU2hvd24gaW4gTElORSBtb2RlOyB0aGUgY2hhcnRcbiAgICAgdXBkYXRlcyBsaXZlIGFzIHRoZSBsaW5lIFJPSSBvbiB0aGUgaW1hZ2UgaXMgbW92ZWQuIEtlcHQgT1VUU0lERSAjcGxvdCBhbmRcbiAgICAgcG9zaXRpb25lZCBmaXhlZCBzbyBpdCBmbG9hdHMgb3ZlciB0aGUgd2hvbGUgcGFnZSAobm90IGNsaXBwZWQgdG8gdGhlXG4gICAgIGRpYWdyYW0vY2FudmFzIGFyZWEpLiAtLT5cbjxkaXYgKm5nSWY9XCJoYXNQcm9maWxlc1wiIGNsYXNzPVwiaW50ZW5zaXR5LXBhbmVsXCJcbiAgICAgW3N0eWxlLmxlZnQucHhdPVwicHJvZmlsZVBhbmVsUG9zLnhcIiBbc3R5bGUudG9wLnB4XT1cInByb2ZpbGVQYW5lbFBvcy55XCI+XG4gIDxkaXYgY2xhc3M9XCJpbnRlbnNpdHktcGFuZWwtaGVhZGVyXCIgKG1vdXNlZG93bik9XCJvblByb2ZpbGVQYW5lbERyYWdTdGFydCgkZXZlbnQpXCI+XG4gICAgPHNwYW4+SW50ZW5zaXR5IHByb2ZpbGU8L3NwYW4+XG4gICAgPGkgY2xhc3M9XCJwaSBwaS1hcnJvd3MtYWx0XCI+PC9pPlxuICA8L2Rpdj5cbiAgPGRpdiBbaWRdPVwiaW50ZW5zaXR5SW5zZXREaXZcIiBjbGFzcz1cImludGVuc2l0eS1wYW5lbC1wbG90XCI+PC9kaXY+XG48L2Rpdj5cblxuPCEtLSBDaGFubmVscyAmIEhpc3RvZ3JhbTogbm9uLW1vZGFsIGZsb2F0aW5nIGRpYWxvZyBvcGVuZWQgZnJvbSB0aGUgdG9vbGJhci4gLS0+XG48Y2hhbm5lbC1oaXN0b2dyYW0gWyh2aXNpYmxlKV09XCJzaG93Q2hhbm5lbEhpc3RvZ3JhbVwiPjwvY2hhbm5lbC1oaXN0b2dyYW0+XG5cbjwhLS0gUmVnaW9uIEVkaXRvcjogbm9uLW1vZGFsLCBkcmFnZ2FibGUsIHJlc2l6YWJsZSBmbG9hdGluZyBkaWFsb2cgb3BlbmVkIGZyb21cbiAgICAgdGhlIHRvb2xiYXIgKGZvcm1lcmx5IHRoZSByaWdodC1wYW5lbCBSZWdpb25zIHRhYikuIE1vZGVsZXNzIHNvIHJlZ2lvbnMgY2FuXG4gICAgIHN0aWxsIGJlIGRyYXduL3NlbGVjdGVkIG9uIHRoZSBwbG90IHdoaWxlIGl0J3Mgb3Blbjsgc3RheXMgbGlua2VkIHRvIHRoaXNcbiAgICAgcGxvdHRpbmcgaW5zdGFuY2UgdmlhIHRoZSByb290IFJlZ2lvblN0b3JlIHNpbmdsZXRvbi4gT3BlbnMgb3ZlciB0aGUgcmlnaHRcbiAgICAgc2lkZSBvZiB0aGUgdmlldy4gLS0+XG48cC1kaWFsb2cgaGVhZGVyPVwiUmVnaW9uIEVkaXRvclwiIFsodmlzaWJsZSldPVwic2hvd1JlZ2lvbkVkaXRvclwiXG4gICAgICAgICAgW21vZGFsXT1cImZhbHNlXCIgW3Jlc2l6YWJsZV09XCJ0cnVlXCIgW2RyYWdnYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICBbbWF4aW1pemFibGVdPVwidHJ1ZVwiIGFwcGVuZFRvPVwiYm9keVwiIHBvc2l0aW9uPVwicmlnaHRcIlxuICAgICAgICAgIFtzdHlsZV09XCJ7IHdpZHRoOiByZWdpb25FZGl0b3JXaWR0aCwgaGVpZ2h0OiAnODV2aCcgfVwiXG4gICAgICAgICAgW2NvbnRlbnRTdHlsZV09XCJ7IG92ZXJmbG93OiAnYXV0bycgfVwiPlxuICA8cmVnaW9uLWVkaXRvcj48L3JlZ2lvbi1lZGl0b3I+XG48L3AtZGlhbG9nPlxuXG48IS0tIFNpbXBsaWZ5IChEb3VnbGFz4oCTUGV1Y2tlcik6IGN1c3RvbSBweC10aHJlc2hvbGQgcGlja2VyIGZvciB0aGUgc2VsZWN0ZWRcbiAgICAgcmVnaW9uKHMpLCBvcGVuZWQgZnJvbSB0aGUgcmlnaHQtY2xpY2sgXCJTaW1wbGlmeSDilrggQ3VzdG9t4oCmXCIgYWN0aW9uLiAtLT5cbjxwLWRpYWxvZyBoZWFkZXI9XCJTaW1wbGlmeSByZWdpb24ocylcIiBbKHZpc2libGUpXT1cImRpc3BsYXlTaW1wbGlmeURpYWxvZ1wiIFttb2RhbF09XCJ0cnVlXCJcbiAgICAgICAgICBbc3R5bGVdPVwie3dpZHRoOiAnMjJyZW0nfVwiIFtkcmFnZ2FibGVdPVwiZmFsc2VcIiBbcmVzaXphYmxlXT1cImZhbHNlXCI+XG4gIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sdW1uIGdhcC0yXCI+XG4gICAgPHNwYW4+QWx0aXR1ZGUgdGhyZXNob2xkOiA8Yj57eyBzaW1wbGlmeVRocmVzaG9sZCB9fSBweDwvYj48L3NwYW4+XG4gICAgPHAtc2xpZGVyIFsobmdNb2RlbCldPVwic2ltcGxpZnlUaHJlc2hvbGRcIiBbbWluXT1cIjFcIiBbbWF4XT1cIjIwXCIgW3N0ZXBdPVwiMVwiPjwvcC1zbGlkZXI+XG4gICAgPHNtYWxsPlZlcnRpY2VzIHdpdGhpbiB0aGlzIGRpc3RhbmNlIG9mIHRoZSBsaW5lIGJldHdlZW4gdGhlaXIgbmVpZ2hib3VycyBhcmUgcmVtb3ZlZC48L3NtYWxsPlxuICA8L2Rpdj5cbiAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZvb3RlclwiPlxuICAgIDxwLWJ1dHRvbiBsYWJlbD1cIkNhbmNlbFwiIFt0ZXh0XT1cInRydWVcIiAob25DbGljayk9XCJkaXNwbGF5U2ltcGxpZnlEaWFsb2cgPSBmYWxzZVwiPjwvcC1idXR0b24+XG4gICAgPHAtYnV0dG9uIGxhYmVsPVwiQXBwbHlcIiBpY29uPVwicGkgcGktY2hlY2tcIiAob25DbGljayk9XCJzaW1wbGlmeVJlZ2lvbnMoc2ltcGxpZnlUaHJlc2hvbGQpXCI+PC9wLWJ1dHRvbj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvcC1kaWFsb2c+XG5cbjwhLS0gWU9MTyBwYXJhbWV0ZXJzLiBTYW1lIHZvY2FidWxhcnkgYXMgdGhlIHBpcGVsaW5lIHN0ZXAgYW5kIHRoZSBzZXJ2ZXIgdG9vbCxcbiAgICAgc28gYSByZXN1bHQgb2J0YWluZWQgaGVyZSBpcyByZXByb2R1Y2libGUgdGhlcmUuIERlZmF1bHRzIGNvbWUgZnJvbSB0aGVcbiAgICAgYWN0aXZlIGNoZWNrcG9pbnQncyBvd24gcmVnaXN0cnkgZW50cnkuIC0tPlxuPHAtZGlhbG9nIGhlYWRlcj1cIllPTE8gcGFyYW1ldGVyc1wiIFsodmlzaWJsZSldPVwic2hvd1lvbG9QYXJhbXNcIiBbbW9kYWxdPVwidHJ1ZVwiXG4gICAgICAgICAgW3N0eWxlXT1cInt3aWR0aDogJzMwcmVtJ31cIiBbZHJhZ2dhYmxlXT1cImZhbHNlXCIgW3Jlc2l6YWJsZV09XCJmYWxzZVwiIGFwcGVuZFRvPVwiYm9keVwiPlxuICA8ZGl2IGNsYXNzPVwiZ3JpZCBmb3JtZ3JpZCBwLWZsdWlkXCI+XG4gICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC02XCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LXNtXCI+Q29uZmlkZW5jZTwvbGFiZWw+XG4gICAgICA8cC1pbnB1dE51bWJlciBbKG5nTW9kZWwpXT1cInlvbG9QYXJhbXMuY29uZmlkZW5jZVwiIFttaW5dPVwiMFwiIFttYXhdPVwiMVwiIFtzdGVwXT1cIjAuMDVcIlxuICAgICAgICAgICAgICAgICAgICAgW21pbkZyYWN0aW9uRGlnaXRzXT1cIjJcIiBbc2hvd0J1dHRvbnNdPVwidHJ1ZVwiPjwvcC1pbnB1dE51bWJlcj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTZcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtc21cIj5Jb1UgKHBlciB0aWxlKTwvbGFiZWw+XG4gICAgICA8cC1pbnB1dE51bWJlciBbKG5nTW9kZWwpXT1cInlvbG9QYXJhbXMuaW91VGhyZXNob2xkXCIgW21pbl09XCIwLjFcIiBbbWF4XT1cIjAuOTVcIiBbc3RlcF09XCIwLjA1XCJcbiAgICAgICAgICAgICAgICAgICAgIFttaW5GcmFjdGlvbkRpZ2l0c109XCIyXCIgW3Nob3dCdXR0b25zXT1cInRydWVcIj48L3AtaW5wdXROdW1iZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC02XCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LXNtXCI+TWVyZ2UgKGNyb3NzLXRpbGUpPC9sYWJlbD5cbiAgICAgIDxwLWlucHV0TnVtYmVyIFsobmdNb2RlbCldPVwieW9sb1BhcmFtcy5tZXJnZVRocmVzaG9sZFwiIFttaW5dPVwiMC4xXCIgW21heF09XCIwLjk1XCIgW3N0ZXBdPVwiMC4wNVwiXG4gICAgICAgICAgICAgICAgICAgICBbbWluRnJhY3Rpb25EaWdpdHNdPVwiMlwiIFtzaG93QnV0dG9uc109XCJ0cnVlXCI+PC9wLWlucHV0TnVtYmVyPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtNlwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1zbVwiPkRvd25zYW1wbGluZyBmYWN0b3I8L2xhYmVsPlxuICAgICAgPHAtaW5wdXROdW1iZXIgWyhuZ01vZGVsKV09XCJ5b2xvUGFyYW1zLmRvd25zYW1wbGluZ0ZhY3RvclwiIFttaW5dPVwiMVwiIFttYXhdPVwiMTBcIiBbc3RlcF09XCIxXCJcbiAgICAgICAgICAgICAgICAgICAgIFtzaG93QnV0dG9uc109XCJ0cnVlXCI+PC9wLWlucHV0TnVtYmVyPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtNlwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1zbVwiPlRpbGUgb3ZlcmxhcCBYICglKTwvbGFiZWw+XG4gICAgICA8cC1pbnB1dE51bWJlciBbKG5nTW9kZWwpXT1cInlvbG9QYXJhbXMub3ZlcmxhcFhcIiBbbWluXT1cIjBcIiBbbWF4XT1cIjkwXCIgW3N0ZXBdPVwiNVwiXG4gICAgICAgICAgICAgICAgICAgICBbc2hvd0J1dHRvbnNdPVwidHJ1ZVwiPjwvcC1pbnB1dE51bWJlcj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTZcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtc21cIj5UaWxlIG92ZXJsYXAgWSAoJSk8L2xhYmVsPlxuICAgICAgPHAtaW5wdXROdW1iZXIgWyhuZ01vZGVsKV09XCJ5b2xvUGFyYW1zLm92ZXJsYXBZXCIgW21pbl09XCIwXCIgW21heF09XCI5MFwiIFtzdGVwXT1cIjVcIlxuICAgICAgICAgICAgICAgICAgICAgW3Nob3dCdXR0b25zXT1cInRydWVcIj48L3AtaW5wdXROdW1iZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC02XCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LXNtXCI+TWluIG9iamVjdCBhcmVhIChweMKyKTwvbGFiZWw+XG4gICAgICA8cC1pbnB1dE51bWJlciBbKG5nTW9kZWwpXT1cInlvbG9QYXJhbXMubWluQXJlYVwiIFttaW5dPVwiMFwiIFttYXhdPVwiMTAwMDAwXCIgW3N0ZXBdPVwiMTBcIlxuICAgICAgICAgICAgICAgICAgICAgW3Nob3dCdXR0b25zXT1cInRydWVcIj48L3AtaW5wdXROdW1iZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC02XCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LXNtXCI+T3V0bGluZSBzaW1wbGlmaWNhdGlvbiAocHgpPC9sYWJlbD5cbiAgICAgIDxwLWlucHV0TnVtYmVyIFsobmdNb2RlbCldPVwieW9sb1BhcmFtcy5zaW1wbGlmeVRvbGVyYW5jZVwiIFttaW5dPVwiMFwiIFttYXhdPVwiMTBcIiBbc3RlcF09XCIwLjVcIlxuICAgICAgICAgICAgICAgICAgICAgW21pbkZyYWN0aW9uRGlnaXRzXT1cIjFcIiBbc2hvd0J1dHRvbnNdPVwidHJ1ZVwiPjwvcC1pbnB1dE51bWJlcj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIGZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICA8cC1jaGVja2JveCBbKG5nTW9kZWwpXT1cInlvbG9QYXJhbXMud2l0aE1hc2tzXCIgW2JpbmFyeV09XCJ0cnVlXCIgaW5wdXRJZD1cInlvbG9NYXNrc1wiPjwvcC1jaGVja2JveD5cbiAgICAgIDxsYWJlbCBmb3I9XCJ5b2xvTWFza3NcIiBjbGFzcz1cInRleHQtc20gbWItMFwiPlxuICAgICAgICBTZWdtZW50YXRpb24gbW9kZSDigJQgdHJhY2Ugb2JqZWN0IG91dGxpbmVzLiBPZmYgZGV0ZWN0cyBib3VuZGluZyBib3hlcyBvbmx5LCB3aGljaCBpc1xuICAgICAgICBjb25zaWRlcmFibHkgZmFzdGVyLlxuICAgICAgPC9sYWJlbD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJmb290ZXJcIj5cbiAgICA8cC1idXR0b24gbGFiZWw9XCJSZXNldCB0byBtb2RlbCBkZWZhdWx0c1wiIFt0ZXh0XT1cInRydWVcIiBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICAob25DbGljayk9XCJyZXNldFlvbG9QYXJhbXMoKVwiPjwvcC1idXR0b24+XG4gICAgPHAtYnV0dG9uIGxhYmVsPVwiQ2xvc2VcIiBzaXplPVwic21hbGxcIiAob25DbGljayk9XCJzaG93WW9sb1BhcmFtcyA9IGZhbHNlXCI+PC9wLWJ1dHRvbj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvcC1kaWFsb2c+XG4iXX0=
1762
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsaXplci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Zpc3VhbGl6ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vc3JjL2xpYi92aXN1YWxpemVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQWlCLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWdDLFFBQVEsRUFBRSxNQUFNLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6TSxPQUFPLEVBQW1CLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBWSxjQUFjLEVBQVksTUFBTSxhQUFhLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWxELE9BQU8sRUFBa0IsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RixPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRSxPQUFPLEVBQ0wsUUFBUSxFQUVSLFVBQVUsRUFDVix1QkFBdUIsR0FDeEIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUsYUFBYSxFQUFFLE1B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QyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUMsQ0FBQzs4R0F4d0RVLG1CQUFtQixrQkF1UXBCLGdCQUFnQixhQUNoQixVQUFVLDBPQVFWLGtCQUFrQixnRkFHTixVQUFVO2tHQW5SckIsbUJBQW1CLDJYQ3ZEaEMsZ2liQStQQTs7MkZEeE1hLG1CQUFtQjtrQkFQL0IsU0FBUzsrQkFHRSxZQUFZOzswQkEyUW5CLE1BQU07MkJBQUMsZ0JBQWdCOzswQkFDdkIsTUFBTTsyQkFBQyxVQUFVOzswQkFRakIsTUFBTTsyQkFBQyxrQkFBa0I7OzBCQUd6QixRQUFROzswQkFBSSxNQUFNOzJCQUFDLFVBQVU7eUNBOU9oQyxZQUFZO3NCQURYLE1BQU07Z0JBR1AsZ0JBQWdCO3NCQURmLE1BQU07Z0JBTUgsWUFBWTtzQkFEZixLQUFLO2dCQWNOLFFBQVE7c0JBRFAsS0FBSztnQkE2Q1csV0FBVztzQkFBM0IsU0FBUzt1QkFBQyxJQUFJO2dCQXc5QmYsU0FBUztzQkFEUixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgQWZ0ZXJWaWV3SW5pdCwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIEluamVjdCwgSW5wdXQsIE5nWm9uZSwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3B0aW9uYWwsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IE1lbnVJdGVtLCBNZXNzYWdlU2VydmljZSwgVHJlZU5vZGUgfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQgeyBDb250ZXh0TWVudSB9IGZyb20gJ3ByaW1lbmcvY29udGV4dG1lbnUnO1xuaW1wb3J0IHsgSUltYWdlSW5mbyB9IGZyb20gJy4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IEltYWdlU3RhdGVQb3J0LCBJTUFHRV9TVEFURV9QT1JUIH0gZnJvbSAnLi9jb250cmFjdHMvcG9ydHMvaW1hZ2Utc3RhdGUucG9ydCc7XG5pbXBvcnQgeyBQb2x5Z29uLCBSZWN0YW5nbGUsIE11bHRpUG9seWdvbiwgUmVnaW9uIH0gZnJvbSAnLi9tb2RlbHMvcmVnaW9uJztcbmltcG9ydCB7IFJlZ2lvbk9wc1NlcnZpY2UgfSBmcm9tICcuL3JlZ2lvbi1vcHMuc2VydmljZSc7XG5pbXBvcnQgeyBWSVpfVE9BU1RfS0VZLCBWSVpfQUxFUlRfVE9BU1RfS0VZIH0gZnJvbSAnLi90b2FzdC1vdXRsZXRzJztcbmltcG9ydCB7IFZpc3VhbGl6ZXJTdG9yZSB9IGZyb20gJy4vc3RvcmUvdmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlbmRlck9yY2hlc3RyYXRvciwgU2xpY2VTY3J1YmJlciB9IGZyb20gJy4vcmVuZGVyLW9yY2hlc3RyYXRvcic7XG5pbXBvcnQge1xuICBQbG90VHlwZSxcbiAgUGxvdFR5cGVEZXNjcmlwdG9yLFxuICBpc05hcGFyaTNkLFxuICBOQVBBUklfREVGQVVMVF9ERUNJTUFURSxcbn0gZnJvbSAnLi9jb250cmFjdHMvcGxvdC10eXBlJztcbmltcG9ydCB7IFZpZXdlckZlYXR1cmUgfSBmcm9tICcuL2NvbnRyYWN0cy9jYXBhYmlsaXRpZXMuY29udHJhY3QnO1xuaW1wb3J0IHsgSW50ZW5zaXR5UHJvZmlsZSwgSVZpc3VhbGl6ZXIsIFZJU1VBTElaRVIgfSBmcm9tICcuL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB7IFNBTV9NT0RFTFMsIGdldERlZmF1bHRTYW1Nb2RlbElkLCBpc1NhbU1vZGVsUmVhZHkgfSBmcm9tICcuL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS1tb2RlbC1yZWdpc3RyeSc7XG5pbXBvcnQgeyBTYW1Ub29sU2VydmljZSB9IGZyb20gJy4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Qb2ludFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tcG9pbnQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IENlbGxTZWdtZW50VG9vbFNlcnZpY2UgfSBmcm9tICcuL3Rvb2xiYXIvc2VnbWVudGF0aW9uL2NlbGwtc2VnbWVudC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgWW9sb0RldGVjdFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi90b29sYmFyL3NlZ21lbnRhdGlvbi95b2xvLWRldGVjdC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgWU9MT19NT0RFTFMsXG4gIGlzWW9sb01vZGVsUmVhZHksXG4gIGdldERlZmF1bHRZb2xvTW9kZWxJZCxcbiAgc2V0RGVmYXVsdFlvbG9Nb2RlbCxcbn0gZnJvbSAnLi90b29sYmFyL3NlZ21lbnRhdGlvbi95b2xvLW1vZGVsLXJlZ2lzdHJ5JztcbmltcG9ydCB7IElOU1RBTkNFX1NFR01FTlRFUiB9IGZyb20gJy4vY29udHJhY3RzL2luc3RhbmNlLXNlZ21lbnRlci5jb250cmFjdCc7XG5pbXBvcnQgdHlwZSB7XG4gIElJbnN0YW5jZVNlZ21lbnRlcixcbiAgSW5zdGFuY2VTZWdtZW50T3B0aW9ucyxcbn0gZnJvbSAnLi9jb250cmFjdHMvaW5zdGFuY2Utc2VnbWVudGVyLmNvbnRyYWN0JztcbmltcG9ydCB7IFJlZ2lvblRvb2xNb2RlIH0gZnJvbSAnLi9jb250cmFjdHMvcmVnaW9uLW92ZXJsYXkuY29udHJhY3QnO1xuaW1wb3J0IHsgVG9vbGJhclRvb2xWaXNpYmlsaXR5LCBBTExfVE9PTEJBUl9UT09MUyB9IGZyb20gJy4vY29udHJhY3RzL3Rvb2xiYXItY29uZmlnJztcbmltcG9ydCB7IFZJWl9DT05GSUcsIFZpekNvbmZpZyB9IGZyb20gJy4vY29udHJhY3RzL3Zpei1jb25maWcnO1xuXG4vKiogUGVyLWluc3RhbmNlIHBsb3QtZGl2IGlkIHNvdXJjZS4gVGhlIG1vdW50IGVsZW1lbnQncyBpZCBtdXN0IGJlIHVuaXF1ZSBzbyB0d29cbiAqICBsaXZlIHZpZXdlcnMgKGUuZy4gdGhlIG1haW4gZGlhZ3JhbSArIGEgbW9kYWwgcHJldmlldykgZG9uJ3QgY29sbGlkZSBvbiB0aGVcbiAqICBzYW1lIERPTSBpZCDigJQgYGdldEVsZW1lbnRCeUlkYCB3b3VsZCBvdGhlcndpc2UgcmV0dXJuIHdoaWNoZXZlciBjYW1lIGZpcnN0LlxuICogIFN0eWxpbmcgaGFuZ3Mgb2ZmIHRoZSBgLnZpei1wbG90YCBjbGFzcyBpbnN0ZWFkIG9mIHRoZSBpZC4gKi9cbmxldCBwbG90SW5zdGFuY2VTZXEgPSAwO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gQ2Fub25pY2FsIHByZWZpeGVkIHNlbGVjdG9yIGZpcnN0OyB0aGUgdW5wcmVmaXhlZCBvcmlnaW5hbCBpcyBrZXB0IGFzIGFuXG4gIC8vIGFsaWFzIGZvciBvbmUgcmVsZWFzZSAocHJlLXB1YmxpY2F0aW9uIGJhY2stY29tcGF0KS5cbiAgc2VsZWN0b3I6ICd2aXN1YWxpemVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Zpc3VhbGl6ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi92aXN1YWxpemVyLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFZpc3VhbGl6ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgLyoqIFBlci1pbnN0YW5jZSB0b2FzdCBrZXkuIE1lc3NhZ2VTZXJ2aWNlIGlzIGEgZ2xvYmFsIHNpbmdsZXRvbiwgc28gdHdvIGxpdmVcbiAgICogIGA8dmlzdWFsaXplcj5gIGluc3RhbmNlcyAobWFpbiB2aWV3ZXIgKyBwaXBlbGluZS1kaWFsb2cgcHJldmlldykgc2hhcmluZ1xuICAgKiAgb25lIGtleSB3b3VsZCBlYWNoIHJlbmRlciB0aGUgc2FtZSBtZXNzYWdlIOKAlCBhIGR1cGxpY2F0ZSB0b2FzdC4gQSB1bmlxdWVcbiAgICogIGtleSBwZXIgaW5zdGFuY2Ugc2NvcGVzIHRoZSB0b2FzdCB0byB0aGUgY29tcG9uZW50IHRoYXQgcmFpc2VkIGl0LiAqL1xuICBwcml2YXRlIHN0YXRpYyBuZXh0VG9hc3RJZCA9IDA7XG5cbiAgLyoqXG4gICAqIFRoZSBsaWJyYXJ5IGFsc28gcmFpc2VzIG5vdGljZXMgZnJvbSBwbGFjZXMgdGhhdCBoYXZlIG5vIGluc3RhbmNlIG9mIHRoZWlyXG4gICAqIG93biB0byBrZXkgYWdhaW5zdDoge0BsaW5rIFBsb3RseVNlcnZpY2V9IGlzIGBwcm92aWRlZEluOiAncm9vdCdgLCBhbmQgdGhlXG4gICAqIHJlZ2lvbiBlZGl0b3IgaXMgYSBjaGlsZCBkaWFsb2cuIFRob3NlIHVzZSB0aGUgZml4ZWRcbiAgICoge0BsaW5rIFZJWl9UT0FTVF9LRVl9IC8ge0BsaW5rIFZJWl9BTEVSVF9UT0FTVF9LRVl9IG91dGxldHMuXG4gICAqXG4gICAqIEZvciB0aGUgc2FtZSByZWFzb24gdGhlIHBlci1pbnN0YW5jZSBrZXkgYWJvdmUgZXhpc3RzLCBleGFjdGx5IE9ORSBtb3VudGVkXG4gICAqIHZpc3VhbGl6ZXIgbWF5IHJlbmRlciB0aG9zZSBzaGFyZWQgb3V0bGV0cyDigJQgb3RoZXJ3aXNlIGEgbWVzc2FnZSBmcm9tIHRoZVxuICAgKiByb290IHNlcnZpY2Ugd291bGQgYmUgc2hvd24gb25jZSBwZXIgbGl2ZSB2aWV3ZXIgKGppdC11aSBydW5zIGEgbWFpbiB2aWV3XG4gICAqIGFuZCBhIHBpcGVsaW5lLXByZXZpZXcgYXQgdGhlIHNhbWUgdGltZSkuIFRoZSBmaXJzdCB0byBpbml0IGNsYWltcyB0aGVtIGFuZFxuICAgKiByZWxlYXNlcyBvbiBkZXN0cm95LCBzbyB0aGUgc3Vydml2aW5nIHZpZXdlciBwaWNrcyB0aGVtIHVwLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgbGl2ZUluc3RhbmNlcyA9IG5ldyBTZXQ8VmlzdWFsaXplckNvbXBvbmVudD4oKTtcbiAgcmVhZG9ubHkgdml6VG9hc3RLZXkgPSBWSVpfVE9BU1RfS0VZO1xuICByZWFkb25seSB2aXpBbGVydFRvYXN0S2V5ID0gVklaX0FMRVJUX1RPQVNUX0tFWTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBpbnN0YW5jZSByZW5kZXJzIHRoZSBzaGFyZWQgb3V0bGV0cy4gVGhlIG93bmVyIGlzIHNpbXBseSB0aGVcbiAgICogb2xkZXN0IGxpdmUgdmlzdWFsaXplciDigJQgYSBgU2V0YCBpdGVyYXRlcyBpbiBpbnNlcnRpb24gb3JkZXIsIHNvIHdoZW4gdGhlXG4gICAqIG93bmVyIGlzIGRlc3Ryb3llZCB0aGUgbmV4dCBvbmUgdGFrZXMgb3ZlciBvbiBpdHMgZm9sbG93aW5nIGNoYW5nZS1kZXRlY3Rpb25cbiAgICogcGFzcy4gVHJhY2tpbmcgYSBzZXQgcmF0aGVyIHRoYW4gYSBzaW5nbGUgb3duZXIgbWF0dGVyczogd2l0aCBhIGxvbmVcbiAgICogYG93bmVyYCByZWZlcmVuY2UsIHRlYXJpbmcgZG93biB0aGUgb3duZXIgd2hpbGUgYSBzaWJsaW5nIHdhcyBhbHJlYWR5XG4gICAqIGluaXRpYWxpc2VkIHdvdWxkIGxlYXZlIG5vYm9keSByZW5kZXJpbmcgdGhlIG91dGxldHMsIGFuZCBldmVyeSBub3RpY2UgZnJvbVxuICAgKiB0aGUgcm9vdCBzZXJ2aWNlIHdvdWxkIHNpbGVudGx5IHZhbmlzaCBhZ2Fpbi5cbiAgICovXG4gIGdldCBvd25zU2hhcmVkVG9hc3RzKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG9sZGVzdCA9IFZpc3VhbGl6ZXJDb21wb25lbnQubGl2ZUluc3RhbmNlcy52YWx1ZXMoKS5uZXh0KCk7XG4gICAgcmV0dXJuICFvbGRlc3QuZG9uZSAmJiBvbGRlc3QudmFsdWUgPT09IHRoaXM7XG4gIH1cblxuICBAT3V0cHV0KClcbiAgaXNTdGFja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSk7XG4gIEBPdXRwdXQoKVxuICBpc0dyYXlzY2FsZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSk7XG5cbiAgLyoqIFdoaWNoIHRvb2xiYXIgZ3JvdXBzIHRvIHNob3cuIEEgcGFydGlhbCBvdmVycmlkZSBtZXJnZXMgb3ZlciB0aGUgZnVsbCBzZXQsXG4gICAqICBzbyBgeyBzcGVjaWFsVG9vbHM6IGZhbHNlIH1gIGhpZGVzIG9ubHkgdGhhdCBncm91cC4gRGVmYXVsdHMgdG8gZXZlcnl0aGluZy4gKi9cbiAgQElucHV0KClcbiAgc2V0IHRvb2xiYXJUb29scyh2OiBUb29sYmFyVG9vbFZpc2liaWxpdHkgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl90b29sYmFyVG9vbHMgPSB7IC4uLkFMTF9UT09MQkFSX1RPT0xTLCAuLi4odiA/PyB7fSkgfTtcbiAgfVxuXG4gIGdldCB0b29sYmFyVG9vbHMoKTogUmVxdWlyZWQ8VG9vbGJhclRvb2xWaXNpYmlsaXR5PiB7XG4gICAgcmV0dXJuIHRoaXMuX3Rvb2xiYXJUb29scztcbiAgfVxuICBwcml2YXRlIF90b29sYmFyVG9vbHM6IFJlcXVpcmVkPFRvb2xiYXJUb29sVmlzaWJpbGl0eT4gPSBBTExfVE9PTEJBUl9UT09MUztcblxuICAvKiogRXhwb3NlIHRlc3Qtb25seSBwbG90IG1vZGVzIGluIHRoZSBzZWxlY3RvciAoZS5nLiB0aGUgbmFwYXJpIGBJbWFnZWBcbiAgICogIG1vZGUsIG90aGVyd2lzZSBoaWRkZW4pLiBUaGUgaG9zdCBhcHAgc2V0cyB0aGlzIGZyb20gYSBgP3Rlc3Q9MWAgVVJMXG4gICAqICB0b2dnbGUuIE9mZiBieSBkZWZhdWx0LCBzbyBwcm9kdWN0aW9uIHVzZXJzIG5ldmVyIHNlZSB0aGVtLiAqL1xuICBASW5wdXQoKVxuICB0ZXN0TW9kZSA9IGZhbHNlO1xuXG4gIC8qKiBJbWFnZS1zbW9vdGhpbmcgc3RhdGUgZm9yIHRoZSB0b29sYmFyJ3MgU21vb3RoZW4gdG9nZ2xlIChPU0Qgb25seSkuXG4gICAqICBEZWZhdWx0cyB0byBgZmFsc2VgIHNvIE9TRCBzaG93cyByYXcgcGl4ZWxzIChuZWFyZXN0LW5laWdoYm91cikuICovXG4gIGltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuICBsb2FkaW5nTWVzc2FnZSA9ICdMb2FkaW5nIGltYWdlLi4uJztcbiAgem9vbSA9IGZhbHNlO1xuICBmaWxlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGxvYWRlZEZpbGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGltYWdlSW5mbzogSUltYWdlSW5mbyB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIHVuc3ViID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBwcmV2aWV3U3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIHB1YmxpYyBzdGFja0xvYWRpbmcgPSBmYWxzZTtcbiAgcHVibGljIGltZ0xvYWRpbmcgPSBmYWxzZTtcbiAgcHVibGljIGxvYWRpbmdQZXJjZW50YWdlID0gMDtcbiAgLy8gTm9uLW51bGwgKDAuLjEwMCkgd2hpbGUgaml0LXNlcnZpY2UgaXMgY29weWluZyB0aGUgc291cmNlIGZpbGUgaW50byB0aGVcbiAgLy8gbG9jYWwgY2FjaGUgUFZDIG9uIGZpcnN0IGNsaWNrLiBXaGVuIHNldCwgdGhlIGxvYWRpbmcgb3ZlcmxheSBzd2FwcyB0aGVcbiAgLy8gc3Bpbm5lciBmb3IgYSBkZXRlcm1pbmF0ZSBwcm9ncmVzcyBiYXIgd2l0aCBhIFwiQ2FjaGluZyBpbWFnZVwiIG1lc3NhZ2UuXG4gIHB1YmxpYyBjYWNoZVByb2dyZXNzOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgLy8gVHJ1ZSBiZXR3ZWVuIHRoZSBzbWFsbC10aWVyIHJlbmRlciBsYW5kaW5nIGFuZCB0aGUgbGFyZ2UtdGllciByZW5kZXJcbiAgLy8gbGFuZGluZyBpbiB0aGUgbXVsdGktdGllciByZW5kZXJpbmcgcGF0aC4gVGhlIHRlbXBsYXRlIHVzZXMgdGhpcyB0b1xuICAvLyBvdmVybGF5IGEgdHJhbnNsdWNlbnQgc3Bpbm5lciBvbiB0b3Agb2YgdGhlIGJsdXJyeSBzbWFsbC10aWVyIGltYWdlIHNvXG4gIC8vIHRoZSB1c2VyIGRvZXNuJ3QgbWlzdGFrZSBpdCBmb3IgdGhlIGZpbmFsIHByZXZpZXcuXG4gIHB1YmxpYyBzaGFycGVuaW5nID0gZmFsc2U7XG4gIC8qKiBBIGppdC1zZXJ2aWNlIGNhY2hlIGNvcHkgaXMgYWN0aXZlbHkgaW4gcHJvZ3Jlc3MgKGRldGVybWluYXRlIDAuLjk5KS4gRHJpdmVzIHRoZSBjYWNoZVxuICAgKiAgcHJvZ3Jlc3MgYmFyIGluZGVwZW5kZW50bHkgb2YgYGltZ0xvYWRpbmdgIHNvIHRoZSBiYXIgY2FuJ3QgYmUgZHJvcHBlZCDigJQgb3IgbWFza2VkIGJ5IHRoZVxuICAgKiAgXCJTaGFycGVuaW5nIHByZXZpZXcuLi5cIiBvdmVybGF5IOKAlCBtaWQtZG93bmxvYWQgaWYgdGhlIGxvYWRpbmcgZmxhZyBmbGlwcyBlYXJseS4gKi9cbiAgZ2V0IGlzQ2FjaGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jYWNoZVByb2dyZXNzICE9PSBudWxsICYmIHRoaXMuY2FjaGVQcm9ncmVzcyA8IDEwMDtcbiAgfVxuICBwcml2YXRlIHJ1bm5pbmcgPSBmYWxzZTtcblxuICAvKipcbiAgICogTW9ub3RvbmljIHJlbmRlciBnZW5lcmF0aW9uLiBCdW1wZWQgd2hlbiBhIHJlbmRlciBzdGFydHMsIHNvIGEgcmVuZGVyIHRoYXRcbiAgICogaGFzIGJlZW4gc3VwZXJzZWRlZCBieSBhIG5ld2VyIGltYWdlIGNhbiBiZSByZWNvZ25pc2VkIGFuZCBtYWRlIGluZXJ0OiBpdHNcbiAgICogY2FsbGJhY2tzIHJldHVybiBlYXJseSBpbnN0ZWFkIG9mIHBhaW50aW5nLCBjbGVhcmluZyBgcnVubmluZ2AsIHJlbGVhc2luZ1xuICAgKiB0aGUgbmV3ZXIgcmVuZGVyJ3Mgb3ZlcmxheSwgb3IgYXBwbHlpbmcgaXRzIFJPSXMuXG4gICAqL1xuICBwcml2YXRlIHJlbmRlclRva2VuID0gMDtcbiAgcHVibGljIHpJbmRleCA9IDA7XG4gIHB1YmxpYyBtYXhJbmRleCA9IDA7XG5cbiAgQFZpZXdDaGlsZCgnY20nKSBjb250ZXh0TWVudSE6IENvbnRleHRNZW51O1xuICBjb250ZXh0TWVudUl0ZW1zOiBNZW51SXRlbVtdID0gW107XG5cbiAgYWN0aXZlRHJhZ01vZGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBXaGV0aGVyIGEgcmVnaW9uIGFjdGlvbiBpcyBhdmFpbGFibGUgdG8gdW5kbyAoaml0LXVpIzg1KS4gTWlycm9ycyB0aGVcbiAgICogIHNoYXJlZCBSZWdpb25TdG9yZSdzIGhpc3RvcnkgZGVwdGg7IGRyaXZlcyB0aGUgdG9vbGJhciBVbmRvIGJ1dHRvbi4gKi9cbiAgY2FuVW5kb1JlZ2lvbiA9IGZhbHNlO1xuICAvKiogV2hldGhlciBhbiB1bmRvbmUgcmVnaW9uIGFjdGlvbiBpcyBhdmFpbGFibGUgdG8gcmVkbyAoaml0LXVpIzg1KS4gKi9cbiAgY2FuUmVkb1JlZ2lvbiA9IGZhbHNlO1xuXG4gIC8qKiBDdXN0b20tdGhyZXNob2xkIFNpbXBsaWZ5IGRpYWxvZyAoaml0LXVpIzg1KS4gKi9cbiAgZGlzcGxheVNpbXBsaWZ5RGlhbG9nID0gZmFsc2U7XG4gIHNpbXBsaWZ5VGhyZXNob2xkID0gMztcbiAgLyoqIEN1cnJlbnQgcmVnaW9uIHNlbGVjdGlvbiAoYXJyYXkgaW5kaWNlcykg4oCUIG1pcnJvcmVkIGZyb20gdGhlIHN0b3JlIHNvIHRoZVxuICAgKiAgY29udGV4dC1tZW51IHJlZ2lvbiBhY3Rpb25zIGNhbiByZWFkIGl0IHN5bmNocm9ub3VzbHkgKGppdC11aSM4NSkuICovXG4gIHByaXZhdGUgc2VsZWN0ZWRJbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuXG4gIC8qKiBXYW5kIHNlbnNpdGl2aXR5IOKAlCBoaWdoZXIgPSBzdHJpY3RlciAoc21hbGxlciBzZWxlY3Rpb24pLiBNYXRjaGVzIFF1UGF0aCBkZWZhdWx0LiAqL1xuICB3YW5kU2Vuc2l0aXZpdHkgPSAyLjA7XG4gIC8qKiBCcnVzaCBkaWFtZXRlciBpbiBpbWFnZS1waXhlbCBjb29yZGluYXRlcyAoZHJpdmVzIHRoZSBwYWludGVkIGRpc2Mgc2l6ZSkuICovXG4gIGJydXNoU2l6ZSA9IDQwO1xuICAvKiogU0FNIG1vZGVsIHBpY2tlciBvcHRpb25zICsgY3VycmVudCBzZWxlY3Rpb24gKGppdC11aSM5MCBQMSkuIE9ubHkgbW9kZWxzXG4gICAqICB3aXRoIGEgaG9zdGVkIE9OTlggcGFpciAoY29uZmlndXJlZCB2aWEgc2V0U2FtTW9kZWxVcmxzIGF0IGFwcCBpbml0KSBhcmVcbiAgICogIG9mZmVyZWQsIHNvIHRoZSBwaWNrZXIgY2FuJ3Qgc2VsZWN0IGEgbW9kZWwgdGhhdCBjYW4ndCBydW4uICovXG4gIHNhbU1vZGVscyA9IFNBTV9NT0RFTFMuZmlsdGVyKGlzU2FtTW9kZWxSZWFkeSkubWFwKChtKSA9PiAoeyBpZDogbS5pZCwgbGFiZWw6IG0ubGFiZWwgfSkpO1xuICBzYW1Nb2RlbElkID0gZ2V0RGVmYXVsdFNhbU1vZGVsSWQoKTtcblxuICAvKiogWU9MTyBjaGVja3BvaW50cyB3aXRoIGEgY29uZmlndXJlZCBVUkwsIGFuZCB0aGUgYWN0aXZlIG9uZS4gKi9cbiAgeW9sb01vZGVscyA9IFlPTE9fTU9ERUxTLmZpbHRlcigobSkgPT4gaXNZb2xvTW9kZWxSZWFkeShtLmlkKSkubWFwKChtKSA9PiAoe1xuICAgIGlkOiBtLmlkLFxuICAgIGxhYmVsOiBtLmxhYmVsLFxuICB9KSk7XG4gIHlvbG9Nb2RlbElkID0gZ2V0RGVmYXVsdFlvbG9Nb2RlbElkKCk7XG4gIC8qKiBQYXJhbWV0ZXIgZGlhbG9nIHN0YXRlLiBTZWVkZWQgZnJvbSB0aGUgYWN0aXZlIG1vZGVsJ3Mgb3duIGRlZmF1bHRzLCB3aGljaFxuICAgKiAgZW5jb2RlIHRoZSBzY2FsZSBhbmQgY3Jvd2RpbmcgZWFjaCBjaGVja3BvaW50IHdhcyB0cmFpbmVkIGZvci4gKi9cbiAgc2hvd1lvbG9QYXJhbXMgPSBmYWxzZTtcbiAgeW9sb1BhcmFtczogSW5zdGFuY2VTZWdtZW50T3B0aW9ucyA9IHRoaXMuZGVmYXVsdFlvbG9QYXJhbXMoKTtcbiAgLyoqIFNBTSBkb3dubG9hZC9zZWdtZW50IHRvYXN0IHN0YXRlIChib3VuZCBieSB0aGUgYHNhbWAgcC10b2FzdCB0ZW1wbGF0ZSkuICovXG4gIHNhbVN0YXR1cyA9ICcnO1xuICBzYW1Qcm9ncmVzcyA9IDA7IC8vIDAuLjEwMCwgZW5jb2RlciBkb3dubG9hZFxuICBzYW1Eb3dubG9hZGluZyA9IGZhbHNlO1xuICBzYW1CdXN5ID0gZmFsc2U7IC8vIGFueSBTQU0gd29yayBpbiBmbGlnaHQgKGRyaXZlcyB0aGUgaW5kZXRlcm1pbmF0ZSBzcGlubmVyKVxuICAvKiogV2hldGhlciB0aGUgc2hhcmVkIGBzYW1gIHRvYXN0IGlzIGN1cnJlbnRseSBzaG93biAoYXZvaWRzIHN0YWNraW5nIGl0IG9uXG4gICAqICBldmVyeSBwb2ludCBjbGljaywgd2hpY2ggcmUtcnVucyBpbmZlcmVuY2UpLiAqL1xuICBwcml2YXRlIHNhbVRvYXN0U2hvd24gPSBmYWxzZTtcblxuICByZWFkb25seSBzYW1Ub2FzdEtleSA9IGBzYW0tJHtWaXN1YWxpemVyQ29tcG9uZW50Lm5leHRUb2FzdElkKyt9YDtcbiAgLyoqXG4gICAqIE91dGxldCBmb3IgdGhlIGxpYnJhcnkncyBvd24gcmVzdWx0L2Vycm9yIG5vdGljZXMuXG4gICAqXG4gICAqIFByaW1lTkcgcm91dGVzIGEgbWVzc2FnZSB0byBhIGA8cC10b2FzdD5gIG9ubHkgd2hlbiB0aGUga2V5cyBtYXRjaCDigJQgYVxuICAgKiBrZXlsZXNzIG1lc3NhZ2UgcmVhY2hlcyBhIGtleWxlc3MgdG9hc3QgYW5kIG5vdGhpbmcgZWxzZS4gVGhlc2Ugbm90aWNlcyB1c2VkXG4gICAqIHRvIGJlIGVtaXR0ZWQgd2l0aCBubyBrZXksIHNvIHRoZXkgcmVuZGVyZWQgb25seSBpbiBob3N0cyB0aGF0IGhhcHBlbiB0b1xuICAgKiBtb3VudCBhIGJhcmUgYDxwLXRvYXN0PmAgKGppdC11aSBkb2VzLCBpbiBpdHMgZmlsZS10cmVlIGNvbXBvbmVudCkuIEV2ZXJ5XG4gICAqIG90aGVyIGhvc3Qg4oCUIGluY2x1ZGluZyB0aGlzIHJlcG8ncyBvd24gYnJvd3NlciBleGFtcGxlIOKAlCBkcm9wcGVkIHRoZW1cbiAgICogc2lsZW50bHksIHdoaWNoIG1hZGUgYSBmYWlsZWQgb3Igbm8tb3Agc2VnbWVudGF0aW9uIGxvb2sgbGlrZSBhIGRlYWQgYnV0dG9uOlxuICAgKiB0aGUgc3RpY2t5IHByb2dyZXNzIHRvYXN0IGlzIGNsZWFyZWQgaW4gdGhlIHNhbWUgdGljayBieSBoaWRlU2FtVG9hc3QsIGFuZFxuICAgKiB0aGUgbWVzc2FnZSBleHBsYWluaW5nIHdoeSBuZXZlciBhcHBlYXJlZCBhbnl3aGVyZS5cbiAgICpcbiAgICogS2V5ZWQgdG8gdGhpcyBjb21wb25lbnQgaW5zdGFuY2Ugc28gdGhlIGxpYnJhcnkgcmVuZGVycyBpdHMgb3duIG91dGxldCBhbmRcbiAgICogaXMgbm90IGRlcGVuZGVudCBvbiBob3N0IG1hcmt1cC4gRGVsaWJlcmF0ZWx5IE5PVCB0aGUgc3RpY2t5IHRvYXN0J3Mga2V5OlxuICAgKiB7QGxpbmsgaGlkZVNhbVRvYXN0fSBjbGVhcnMgdGhhdCBrZXkgaW4gdGhlIGBmaW5hbGx5YCwgd2hpY2ggd291bGQgd2lwZSB0aGVcbiAgICogcmVzdWx0IHRoZSBtb21lbnQgaXQgd2FzIHBvc3RlZCwgYW5kIHRoZSBzdGlja3kgdG9hc3QncyBjdXN0b20gdGVtcGxhdGUgaXNcbiAgICogYnVpbHQgZm9yIHRoZSBsaXZlIHN0YXR1cyArIHByb2dyZXNzIGJhci5cbiAgICovXG4gIHJlYWRvbmx5IHJlc3VsdFRvYXN0S2V5ID0gYCR7dGhpcy5zYW1Ub2FzdEtleX0tcmVzdWx0YDtcbiAgLyoqIFN1YnNjcmlwdGlvbnMgdG8gdGhlIHBvaW50IHRvb2wncyBsaXZlIGZlZWRzIChzdGF0dXMvYnVzeS9kb3dubG9hZCkuICovXG4gIHByaXZhdGUgc2FtUG9pbnRTdWIgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIC8qKiBWZXJ0ZXggZXJhc2VyIHJhZGl1cyBpbiBpbWFnZS1waXhlbCBjb29yZGluYXRlcy4gKi9cbiAgdmVydGV4RXJhc2VyUmFkaXVzID0gMjA7XG5cbiAgY29sb3JtYXBzT3B0aW9ucyE6IGFueTtcbiAgcmV2ZXJzZXNjYWxlID0gZmFsc2U7XG4gIHNlbGVjdGVkQ29sb3JtYXAhOiBhbnk7XG4gIC8qKiBDaGFubmVscyAmIEhpc3RvZ3JhbSBkaWFsb2cgdmlzaWJpbGl0eSAob3BlbmVkIGZyb20gdGhlIHRvb2xiYXIpLiAqL1xuICBzaG93Q2hhbm5lbEhpc3RvZ3JhbSA9IGZhbHNlO1xuICAvKiogUmVnaW9uIEVkaXRvciBkaWFsb2cgdmlzaWJpbGl0eSAob3BlbmVkIGZyb20gdGhlIHRvb2xiYXIpLiAqL1xuICBzaG93UmVnaW9uRWRpdG9yID0gZmFsc2U7XG4gIC8qKiBSZWdpb24gRWRpdG9yIGRpYWxvZyB3aWR0aC4gT24gb3BlbiBpdCBpcyBzZXQgdG8gdGhlIGNvbmZpZ3VyZWQgaG9zdFxuICAgKiAgZWxlbWVudCdzIGN1cnJlbnQgd2lkdGgsIG9yIOKAlCB3aGVuIG5vIHNlbGVjdG9yIGlzIGNvbmZpZ3VyZWQgLyB0aGUgZWxlbWVudFxuICAgKiAgaXNuJ3QgZm91bmQg4oCUIHRvIGEgcXVhcnRlciBvZiB0aGUgcGFnZSAoc2VlIG9wZW5SZWdpb25FZGl0b3IpLiAqL1xuICByZWdpb25FZGl0b3JXaWR0aCA9ICcyNXZ3JztcbiAgc3RhY2tPcHRpb25zID0gW1xuICAgIHsgbmFtZTogJ1NpbmdsZSBpbWFnZScsIHZhbDogJ2ZhbHNlJyB9LFxuICAgIHsgbmFtZTogJ1N0YWNrJywgdmFsOiAndHJ1ZScgfSxcbiAgXTtcbiAgc2VsZWN0ZWRTdGFja09wdGlvbjogeyBuYW1lOiBzdHJpbmc7IHZhbDogc3RyaW5nIH0gfCB1bmRlZmluZWQgPSB0aGlzLnN0YWNrT3B0aW9uc1swXTtcbiAgcmVhZG9ubHkgcGxvdERpdk5hbWUgPSBgdml6LXBsb3QtJHtwbG90SW5zdGFuY2VTZXErK31gO1xuICBwbG90VHlwZSA9IFBsb3RUeXBlLklNQUdFO1xuICBpc0hlYXRtYXAgPSB0cnVlO1xuICBhY3RpdmVTdXJmYWNlM2RNb2RlID0gJ3R1cm50YWJsZSc7XG4gIC8qKiBXaGV0aGVyIHRoZSBuYXBhcmkgM0QgY29vcmRpbmF0ZS1heGVzIC8gc2NhbGUgZ2l6bW8gaXMgc2hvd24gKHZvbHVtZS9pc29zdXJmYWNlKS4gKi9cbiAgYXhlc1Zpc2libGUgPSB0cnVlO1xuICB3aXJlZnJhbWVBY3RpdmUgPSBmYWxzZTtcbiAgLyoqIG5hcGFyaSAzRCBkZWNpbWF0ZSBmYWN0b3IgKDEgPSBGdWxsIOKApiA4ID0g4oWbOyBkZWZhdWx0IMK9KTsgY2hhbmdpbmcgaXQgcmUtcGxvdHMuICovXG4gIHJlc29sdXRpb25TY2FsZSA9IE5BUEFSSV9ERUZBVUxUX0RFQ0lNQVRFO1xuXG4gIC8qKiBQbG90IHR5cGVzIHRoZSBhY3RpdmUgYmFja2VuZCBhZHZlcnRpc2VzICgzRCBnYXRlZCBieSBjYXBhYmlsaXR5KS4gKi9cbiAgcGxvdFR5cGVPcHRpb25zOiBQbG90VHlwZURlc2NyaXB0b3JbXSA9IFtdO1xuICBzZWxlY3RlZFBsb3RUeXBlOiBQbG90VHlwZSA9IFBsb3RUeXBlLklNQUdFO1xuXG4gIC8qKiBGbG9hdGluZyBpbnRlbnNpdHktcHJvZmlsZSBpbnNldCAoTElORSBtb2RlKS4gKi9cbiAgcmVhZG9ubHkgaW50ZW5zaXR5SW5zZXREaXYgPSAnaW50ZW5zaXR5LWluc2V0LXBsb3QnO1xuICBwcm9maWxlUGFuZWxQb3MgPSB7IHg6IDIwLCB5OiA3MCB9O1xuICBwcml2YXRlIHByb2ZpbGVQYW5lbERyYWdnaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgcHJvZmlsZVBhbmVsU3RhcnQgPSB7IG14OiAwLCBteTogMCwgeDogMCwgeTogMCB9O1xuXG4gIC8qKiBUb29sYmFyIGRvY2tpbmc6IGRvY2tlZCBhY3Jvc3MgdGhlIHRvcCBieSBkZWZhdWx0OyBkcmFnZ2luZyBpdHMgaGFuZGxlXG4gICAqICBkZXRhY2hlcyBpdCBpbnRvIGEgZmxvYXRpbmcsIG1vdmFibGUgd2luZG93IChmcmVlcyB0aGUgdG9wIHJvdyBmb3IgdGhlXG4gICAqICB2aXN1YWxpemF0aW9uKS4gKi9cbiAgdG9vbGJhckZsb2F0aW5nID0gZmFsc2U7XG4gIHRvb2xiYXJQb3MgPSB7IHg6IDgsIHk6IDggfTtcbiAgcHJpdmF0ZSB0b29sYmFyRHJhZ2dpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSB0b29sYmFyU3RhcnQgPSB7IG14OiAwLCBteTogMCwgeDogMCwgeTogMCB9O1xuICBwcml2YXRlIGxhdGVzdFByb2ZpbGVzOiBJbnRlbnNpdHlQcm9maWxlW10gPSBbXTtcbiAgLyoqIERyaXZlcyB0aGUgaW50ZW5zaXR5IGluc2V0IHBhbmVsJ3MgdmlzaWJpbGl0eSDigJQgdHJ1ZSB3aGVuZXZlciBhbnlcbiAgICogIGludGVuc2l0eS1wcm9maWxlIGxpbmUgZXhpc3RzIChpbmRlcGVuZGVudCBvZiB0aGUgY3VycmVudCBwbG90IHR5cGUpLiAqL1xuICBoYXNQcm9maWxlcyA9IGZhbHNlO1xuICBwcml2YXRlIGludGVuc2l0eVByb2ZpbGVTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgdmlld3BvcnRDaGFuZ2VTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgcHJvZmlsZURyYWdNb3ZlTGlzdGVuZXI/OiAoZTogTW91c2VFdmVudCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBwcm9maWxlRHJhZ1VwTGlzdGVuZXI/OiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHByb2ZpbGVSZXNpemVMaXN0ZW5lcj86ICgpID0+IHZvaWQ7XG5cbiAgLyoqIExJTkUgcGxvdCB0eXBlIHNob3dzIHRoZSBpbWFnZSArIGRyYWdnYWJsZSBsaW5lIFJPSSArIGludGVuc2l0eSBpbnNldC4gKi9cbiAgZ2V0IGlzUHJvZmlsZU1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRQbG90VHlwZSA9PT0gUGxvdFR5cGUuTElORTtcbiAgfVxuXG4gIC8qKiBUcnVlIGZvciB0aGUgSW1hZ2UgcGxvdCB0eXBlLCB3aGljaCByZW5kZXJzIGFzIGEgbmF0aXZlbHkgcGFuL3pvb20tYWJsZVxuICAgKiAgcmFzdGVyIOKAlCBzbyB0aGUgYmFja2VuZC1hZ25vc3RpYyB6b29tL3BhbiB0b29sYmFyIHRvb2xzIGFyZSBoaWRkZW4uIFRoZVxuICAgKiAgY29tcG9uZW50IGRyaXZlcyB0aGlzIG9mZiB0aGUgcGxvdCB0eXBlLCBub3QgdGhlIGFjdGl2ZSBiYWNrZW5kLiAqL1xuICBnZXQgaXNJbWFnZVZpZXcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRQbG90VHlwZSA9PT0gUGxvdFR5cGUuSU1BR0U7XG4gIH1cblxuICAvKiogSXNvc3VyZmFjZSBiYW5kIGFzIGEgMOKAkzI1NSBzbGlkZXIgcG9zaXRpb24sIG1hcHBlZCBvbnRvIHRoZSB2b2x1bWUncyByZWFsXG4gICAqICBpbnRlbnNpdHkgcmFuZ2UgYnkgdGhlIHJlbmRlcmVyLiBEZWZhdWx0cyB0byB0aGUgZnVsbCByYW5nZS4gKi9cbiAgaXNvUmFuZ2U6IG51bWJlcltdID0gWzAsIDI1NV07XG5cbiAgcGxvdFdpZHRoU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBpbWFnZUxvYWRpbmdTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIGltZ0xvYWRpbmdNZXNzYWdlU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBpc1pvb21TdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIGZpbGVuYW1lU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBhdXRvc2NhbGVTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgcHJpdmF0ZSBwbG90Q29udGV4dE1lbnVMaXN0ZW5lcj86IChlOiBNb3VzZUV2ZW50KSA9PiB2b2lkO1xuICBwcml2YXRlIGtleWRvd25MaXN0ZW5lcj86IChlOiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkO1xuICBwcml2YXRlIHdoZWVsTGlzdGVuZXI/OiAoZTogV2hlZWxFdmVudCkgPT4gdm9pZDtcblxuICAvKiogRGVib3VuY2VkIHotc2xpY2Ugc2NydWJiaW5nIChzZWUgU2xpY2VTY3J1YmJlciDigJQgcmVmYWN0b3JpbmcgcGxhbiBTdGVwIDcpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNjcnViYmVyID0gbmV3IFNsaWNlU2NydWJiZXIoKHopID0+IHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFpJbmRleCh6KTtcbiAgICAvLyBJbiBhIHBlci1zbGljZSB6LXN0YWNrIHNlc3Npb24gdGhlIHN0b3JlIHN3YXBzIHRoZSBsaXZlIHJlZ2lvbiBzZXQgdG8gdGhpc1xuICAgIC8vIHNsaWNlIChwcmVzZXJ2aW5nIGVkaXRzIG1hZGUgb24gdGhlIHByZXZpb3VzIG9uZSk7IG91dHNpZGUgc3RhY2sgbW9kZSB0aGlzXG4gICAgLy8ganVzdCByZWNvcmRzIHRoZSBzbGljZSwgbGVhdmluZyBzaW5nbGUtcGxhbmUgcmVnaW9ucyB1bnRvdWNoZWQgKGppdC11aSM5MykuXG4gICAgdGhpcy5wbG90U2VydmljZS5zZXREaXNwbGF5U2xpY2Uoeik7XG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoSU1BR0VfU1RBVEVfUE9SVCkgcHJpdmF0ZSBzdGF0ZTogSW1hZ2VTdGF0ZVBvcnQsXG4gICAgQEluamVjdChWSVNVQUxJWkVSKSBwdWJsaWMgcGxvdFNlcnZpY2U6IElWaXN1YWxpemVyLFxuICAgIHB1YmxpYyBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBzZXNzaW9uOiBWaXN1YWxpemVyU3RvcmUsXG4gICAgcHJpdmF0ZSBzYW1Ub29sOiBTYW1Ub29sU2VydmljZSxcbiAgICBwcml2YXRlIGNlbGxTZWdtZW50VG9vbDogQ2VsbFNlZ21lbnRUb29sU2VydmljZSxcbiAgICBwcml2YXRlIHlvbG9EZXRlY3RUb29sOiBZb2xvRGV0ZWN0VG9vbFNlcnZpY2UsXG4gICAgQEluamVjdChJTlNUQU5DRV9TRUdNRU5URVIpIHByaXZhdGUgaW5zdGFuY2VTZWdtZW50ZXI6IElJbnN0YW5jZVNlZ21lbnRlcixcbiAgICBwcml2YXRlIHNhbVBvaW50VG9vbDogU2FtUG9pbnRUb29sU2VydmljZSxcbiAgICBwcml2YXRlIHJlZ2lvbk9wczogUmVnaW9uT3BzU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFZJWl9DT05GSUcpIHByaXZhdGUgdml6Q29uZmlnPzogVml6Q29uZmlnLFxuICApIHtcbiAgICB0aGlzLmNvbG9ybWFwc09wdGlvbnMgPSBwbG90U2VydmljZS5nZXRDb2xvcm1hcE9wdGlvbnMoKTtcbiAgICB0aGlzLmNvbXB1dGVQbG90VHlwZU9wdGlvbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbG90IHR5cGVzIG9mZmVyZWQgaW4gdGhlIHNlbGVjdG9yIGZvciB0aGUgY3VycmVudCBpbWFnZTpcbiAgICogIC0gT3V0c2lkZSAqKnRlc3QgbW9kZSoqLCBvbmx5IHRoZSBjdXJhdGVkIGRlZmF1bHQgc2V0IChkZXNjcmlwdG9ycyB3aXRoIGFcbiAgICogICAgYHByb2R1Y3Rpb25MYWJlbGApIGlzIG9mZmVyZWQsIHNob3duIHVuZGVyIHN1ZmZpeC1mcmVlIG5hbWVzIOKAlCBJbWFnZSxcbiAgICogICAgSGVhdG1hcCwgQ29udG91ciBhbmQgdGhlIG5hcGFyaSBTdXJmYWNlIC8gVm9sdW1lIC8gSXNvc3VyZmFjZS4gVGVzdCBtb2RlXG4gICAqICAgIGV4cG9zZXMgZXZlcnkgYmFja2VuZCdzIHR5cGUgdW5kZXIgaXRzIGZ1bGwgKGJhY2tlbmQtc3VmZml4ZWQpIGxhYmVsLlxuICAgKiAgLSAzRCB0eXBlcyBoaWRkZW4gd2hlbiB0aGUgYmFja2VuZCBjYW4ndCByZW5kZXIgYSAzRCBzY2VuZS5cbiAgICogIC0gc3RhY2stb25seSB0eXBlcyAodm9sdW1lLCBpc29zdXJmYWNlKSBoaWRkZW4gdW5sZXNzIHRoZSBmaWxlIGlzIGEgc3RhY2sg4oCUXG4gICAqICAgIGEgdm9sdW1lIG5lZWRzIG11bHRpcGxlIHotc2xpY2VzLlxuICAgKiAgLSBzY2FsYXItaW50ZW5zaXR5IHR5cGVzIChjb250b3VyLCBzdXJmYWNlLCBpc29zdXJmYWNlKSBoaWRkZW4gZm9yIFJHQlxuICAgKiAgICBpbWFnZXMg4oCUIHRoZXkgbWFwIGEgc2luZ2xlIGludGVuc2l0eSBwZXIgcGl4ZWwuIEltYWdlIGFuZCBIZWF0bWFwIHJlbmRlclxuICAgKiAgICBhbnkgaW1hZ2UuXG4gICAqL1xuICBwcml2YXRlIGNvbXB1dGVQbG90VHlwZU9wdGlvbnMoKSB7XG4gICAgY29uc3QgY2FwcyA9IHRoaXMucGxvdFNlcnZpY2UuY2FwYWJpbGl0aWVzO1xuICAgIGNvbnN0IGlzU3RhY2sgPSAhIXRoaXMuaW1hZ2VJbmZvPy5pc1N0YWNrO1xuICAgIGNvbnN0IGlzR3JheXNjYWxlID0gISF0aGlzLmltYWdlSW5mbz8uaXNHcmF5c2NhbGU7XG4gICAgLy8gQSBtdWx0aWNoYW5uZWwgaW1hZ2UncyBiYW5kcyBhcmUgZWFjaCBzaW5nbGUtYmFuZCAoc2NhbGFyKSwgc28gdGhlIHNjYWxhclxuICAgIC8vIHBsb3QgbW9kZXMgKEhlYXRtYXAgLyBTdXJmYWNlIC8gVm9sdW1lIC8gSXNvc3VyZmFjZSkgYXBwbHkgcGVyIGNoYW5uZWwgZXZlblxuICAgIC8vIHRob3VnaCB0aGUgUkdCIGNvbXBvc2l0ZSBpc24ndCBncmF5c2NhbGUg4oCUIGRvbid0IGdhdGUgdGhlbSBvdXQuXG4gICAgY29uc3QgbTAgPSB0aGlzLmltYWdlSW5mbz8uaW1hZ2VNZXRhPy5bMF07XG4gICAgY29uc3QgaXNNdWx0aWNoYW5uZWwgPSAobTA/LmNoYW5uZWxDb3VudCA/PyAxKSA+IDEgJiYgKG0wPy5yZ2JDaGFubmVscyA/PyAxKSA8IDM7XG4gICAgdGhpcy5wbG90VHlwZU9wdGlvbnMgPSB0aGlzLnBsb3RTZXJ2aWNlLmdldFBsb3RUeXBlRGVzY3JpcHRvcnMoKVxuICAgICAgLmZpbHRlcigoZCkgPT4ge1xuICAgICAgICAvLyBPdXRzaWRlIHRlc3QgbW9kZSwgb25seSB0aGUgY3VyYXRlZCBzZXQgKHRob3NlIHdpdGggYSBwcm9kdWN0aW9uTGFiZWwpXG4gICAgICAgIC8vIGlzIG9mZmVyZWQ7IHRlc3QgbW9kZSBleHBvc2VzIGV2ZXJ5IGJhY2tlbmQncyB0eXBlLlxuICAgICAgICBpZiAoIXRoaXMudGVzdE1vZGUgJiYgIWQucHJvZHVjdGlvbkxhYmVsKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChkLmRpbWVuc2lvbnMgPT09ICczZCcgJiYgIWNhcHMuaGFzKFZpZXdlckZlYXR1cmUuU3VyZmFjZTNEKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZC5yZXF1aXJlc1N0YWNrICYmICFpc1N0YWNrKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChkLnJlcXVpcmVzR3JheXNjYWxlICYmICFpc0dyYXlzY2FsZSAmJiAhaXNNdWx0aWNoYW5uZWwpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9KVxuICAgICAgLy8gRGVmYXVsdCBzZWxlY3RvciBzaG93cyB0aGUgc3VmZml4LWZyZWUgcHJvZHVjdGlvbkxhYmVsOyB0ZXN0IG1vZGUga2VlcHNcbiAgICAgIC8vIHRoZSBmdWxsIGJhY2tlbmQtc3VmZml4ZWQgbGFiZWwgc28gc2FtZS1uYW1lZCBtb2RlcyBzdGF5IGRpc3Rpbmd1aXNoYWJsZS5cbiAgICAgIC5tYXAoKGQpID0+ICh0aGlzLnRlc3RNb2RlID8gZCA6IHsgLi4uZCwgbGFiZWw6IGQucHJvZHVjdGlvbkxhYmVsISB9KSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgLy8gVGhlIGNvbnN0cnVjdG9yIGNvbXB1dGVzIHRoZSBvcHRpb25zIHdpdGggdGVzdE1vZGUgc3RpbGwgYXQgaXRzIGRlZmF1bHQ7XG4gICAgLy8gcmVjb21wdXRlIG9uY2UgdGhlIGhvc3QgYmluZHMgaXQgKGFuZCBvbiBhbnkgbGF0ZXIgY2hhbmdlKSBzbyB0aGUgc2VsZWN0b3JcbiAgICAvLyByZWZsZWN0cyB0ZXN0IG1vZGUgaW1tZWRpYXRlbHksIHdpdGhvdXQgd2FpdGluZyBmb3IgYW4gaW1hZ2UgdG8gKHJlKWxvYWQuXG4gICAgaWYgKGNoYW5nZXNbJ3Rlc3RNb2RlJ10pIHtcbiAgICAgIHRoaXMuY29tcHV0ZVBsb3RUeXBlT3B0aW9ucygpO1xuICAgICAgLy8gSWYgdGVzdCBtb2RlIGlzIHR1cm5lZCBvZmYgd2hpbGUgYSB0ZXN0LW9ubHkgdHlwZSAoZS5nLiBOQVBBUklfSU1BR0UpIGlzXG4gICAgICAvLyBhY3RpdmUsIHRoYXQgdHlwZSBpcyBubyBsb25nZXIgb2ZmZXJlZCDigJQgZmFsbCBiYWNrIHRvIEltYWdlLlxuICAgICAgdGhpcy5yZWNvbmNpbGVTZWxlY3RlZFBsb3RUeXBlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIElmIHRoZSBhY3RpdmUgcGxvdCB0eXBlIGlzIG5vIGxvbmdlciBpbiB0aGUgb2ZmZXJlZCBvcHRpb25zIChlLmcuIHRlc3QgbW9kZVxuICAgKiAgdHVybmVkIG9mZiB3aGlsZSBhIHRlc3Qtb25seSB0eXBlIHdhcyBhY3RpdmUsIG9yIGEgc2NhbGFyIHR5cGUgY2FycmllZCBvbnRvXG4gICAqICBhbiBSR0IgaW1hZ2UpLCBmYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQgMkQgSW1hZ2Ugdmlldy4gKi9cbiAgcHJpdmF0ZSByZWNvbmNpbGVTZWxlY3RlZFBsb3RUeXBlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wbG90VHlwZU9wdGlvbnMuc29tZSgoZCkgPT4gZC50eXBlID09PSB0aGlzLnNlbGVjdGVkUGxvdFR5cGUpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUGxvdFR5cGUgPSBQbG90VHlwZS5JTUFHRTtcbiAgICAgIHRoaXMucGxvdFR5cGUgPSBQbG90VHlwZS5JTUFHRTtcbiAgICAgIHRoaXMuaXNIZWF0bWFwID0gdHJ1ZTtcbiAgICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0UGxvdFR5cGUoUGxvdFR5cGUuSU1BR0UpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIEpvaW4gdGhlIGxpdmUgc2V0OyB0aGUgb2xkZXN0IG1lbWJlciByZW5kZXJzIHRoZSBzaGFyZWQgbm90aWNlIG91dGxldHMuXG4gICAgVmlzdWFsaXplckNvbXBvbmVudC5saXZlSW5zdGFuY2VzLmFkZCh0aGlzKTtcbiAgICB0aGlzLnN0YXRlLnNldERpYWdyYW0odGhpcyk7XG4gICAgdGhpcy5zZWxlY3RlZENvbG9ybWFwID1cbiAgICAgIHRoaXMuY29sb3JtYXBzT3B0aW9uc1swXS5jaGlsZHJlbi5maW5kKChjOiBhbnkpID0+IGMubGFiZWwgPT09ICdHcmV5cyBJbnYnKSA/P1xuICAgICAgdGhpcy5jb2xvcm1hcHNPcHRpb25zWzBdLmNoaWxkcmVuWzBdO1xuICAgIHRoaXMuc3RhY2tPcHRpb25zID0gW1xuICAgICAgeyBuYW1lOiAnU2luZ2xlIGltYWdlJywgdmFsOiAnZmFsc2UnIH0sXG4gICAgICB7IG5hbWU6ICdTdGFjaycsIHZhbDogJ3RydWUnIH0sXG4gICAgXTtcbiAgICB0aGlzLnNlbGVjdGVkU3RhY2tPcHRpb24gPSB0aGlzLnN0YWNrT3B0aW9uc1swXTtcbiAgICB0aGlzLmF1dG9zY2FsZVN1YnNjcmlwdGlvbiA9IHRoaXMucGxvdFNlcnZpY2UuZ2V0QXV0b3NjYWxlRXZlbnQoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgLy8gcmVzZXQgdGhlIGltYWdlIG1vZGUgdG8gc2luZ2xlIGltYWdlXG4gICAgICB0aGlzLnNlbGVjdGVkU3RhY2tPcHRpb24gPSB7IG5hbWU6ICdTaW5nbGUgaW1hZ2UnLCB2YWw6ICdmYWxzZScgfTtcbiAgICAgIHRoaXMuYWN0aXZlRHJhZ01vZGUgPSBudWxsO1xuICAgICAgdGhpcy5zZXNzaW9uLnNldEFjdGl2ZVRvb2wobnVsbCk7XG4gICAgfSk7XG4gICAgdGhpcy5pbWFnZUxvYWRpbmdTdWJzY3JpcHRpb24gPSB0aGlzLnN0YXRlLmlzSW1hZ2VMb2FkaW5nJCgpLnN1YnNjcmliZSgoaXNJbWFnZUxvYWRpbmcpID0+IHtcbiAgICAgIHRoaXMuaW1nTG9hZGluZyA9IGlzSW1hZ2VMb2FkaW5nO1xuICAgIH0pO1xuICAgIC8vIFVuZG8gYXZhaWxhYmlsaXR5IChqaXQtdWkjODUpOiB0aGUgc2hhcmVkIFJlZ2lvblN0b3JlIGVtaXRzIHdoZW5ldmVyIGl0c1xuICAgIC8vIGhpc3RvcnkgZGVwdGggY2hhbmdlczsgZ3JleXMgb3V0IHRoZSB0b29sYmFyIFVuZG8gYnV0dG9uIGFjY29yZGluZ2x5LlxuICAgIHRoaXMucGxvdFNlcnZpY2VcbiAgICAgIC5nZXRDYW5VbmRvJCgpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YikpXG4gICAgICAuc3Vic2NyaWJlKChjYW5VbmRvKSA9PiB7XG4gICAgICAgIHRoaXMuY2FuVW5kb1JlZ2lvbiA9IGNhblVuZG87XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pO1xuICAgIHRoaXMucGxvdFNlcnZpY2VcbiAgICAgIC5nZXRDYW5SZWRvJCgpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YikpXG4gICAgICAuc3Vic2NyaWJlKChjYW5SZWRvKSA9PiB7XG4gICAgICAgIHRoaXMuY2FuUmVkb1JlZ2lvbiA9IGNhblJlZG87XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pO1xuICAgIC8vIE1pcnJvciB0aGUgcmVnaW9uIHNlbGVjdGlvbiBzbyB0aGUgcmlnaHQtY2xpY2sgYWN0aW9uIGdyb3VwIChqaXQtdWkjODUpXG4gICAgLy8gY2FuIHJlYWQgaXQgc3luY2hyb25vdXNseSB3aGVuIHRoZSBtZW51IGlzIGJ1aWx0LlxuICAgIHRoaXMucGxvdFNlcnZpY2VcbiAgICAgIC5nZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWIpKVxuICAgICAgLnN1YnNjcmliZSgoaW5kaWNlcykgPT4ge1xuICAgICAgICB0aGlzLnNlbGVjdGVkSW5kaWNlcyA9IGluZGljZXMgfHwgW107XG4gICAgICB9KTtcbiAgICAvLyBJbnRlcmFjdGl2ZSBwb2ludC1wcm9tcHQgc2VnbWVudGF0aW9uIHJ1bnMgaW5zaWRlIHRoZSByZW5kZXJlciBvbiBlYWNoXG4gICAgLy8gY2xpY2s7IHN1cmZhY2UgaXRzIGxpdmUgc3RhdHVzICsgZG93bmxvYWQgcHJvZ3Jlc3MgaW4gdGhlIHNoYXJlZCBgc2FtYFxuICAgIC8vIHRvYXN0IHNvIHRoZSB1c2VyIHNlZXMgaXQgd29ya2luZyAodGhlIGZpcnN0IGNsaWNrIHB1bGxzIHRoZSBlbmNvZGVyKS5cbiAgICB0aGlzLnNhbVBvaW50U3ViLmFkZChcbiAgICAgIHRoaXMuc2FtUG9pbnRUb29sLnByb2dyZXNzJC5zdWJzY3JpYmUoKGYpID0+IHtcbiAgICAgICAgdGhpcy5zYW1Eb3dubG9hZGluZyA9IGYgPj0gMCAmJiBmIDwgMTtcbiAgICAgICAgaWYgKGYgPj0gMCkgdGhpcy5zYW1Qcm9ncmVzcyA9IE1hdGgubWluKDEwMCwgTWF0aC5yb3VuZChmICogMTAwKSk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgdGhpcy5zYW1Qb2ludFN1Yi5hZGQoXG4gICAgICB0aGlzLnNhbVBvaW50VG9vbC5zdGF0dXMkLnN1YnNjcmliZSgobSkgPT4ge1xuICAgICAgICB0aGlzLnNhbVN0YXR1cyA9IG07XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgdGhpcy5zYW1Qb2ludFN1Yi5hZGQoXG4gICAgICB0aGlzLnNhbVBvaW50VG9vbC5idXN5JC5zdWJzY3JpYmUoKGJ1c3kpID0+IHtcbiAgICAgICAgdGhpcy5zYW1CdXN5ID0gYnVzeTtcbiAgICAgICAgaWYgKGJ1c3kpIHRoaXMuc2hvd1NhbVRvYXN0KCdTQU0gcG9pbnQgc2VnbWVudGF0aW9uJyk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgdGhpcy5wbG90U2VydmljZS5nZXRTdGFja0xvYWRpbmdQcm9ncmVzcygpLnN1YnNjcmliZSgobG9hZGluZ1Byb2dyZXNzKSA9PiB7XG4gICAgICB0aGlzLmxvYWRpbmdQZXJjZW50YWdlID0gbG9hZGluZ1Byb2dyZXNzO1xuICAgIH0pO1xuICAgIHRoaXMucGxvdFNlcnZpY2UuaXNTdGFja0xvYWRpbmcoKS5zdWJzY3JpYmUoKHN0YWNrTG9hZGluZykgPT4ge1xuICAgICAgdGhpcy5zdGFja0xvYWRpbmcgPSBzdGFja0xvYWRpbmc7XG4gICAgfSk7XG4gICAgdGhpcy5wbG90V2lkdGhTdWJzY3JpcHRpb24gPSB0aGlzLnN0YXRlLmdldFBhbmVsV2lkdGgkKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMucGxvdFNlcnZpY2UucmVsYXlvdXQoKTtcbiAgICAgIC8vIFRoZSBpbnRlbnNpdHkgaW5zZXQgaXMgYSBzZXBhcmF0ZSBQbG90bHkgY2hhcnQgaW4gYSBmbG9hdGluZyBwYW5lbDsgcmVmbG93XG4gICAgICAvLyBpdCB0byBpdHMgY3VycmVudCBzaXplIHdoZW4gdGhlIGNhbnZhcyByZXNpemVzLCBlbHNlIGl0IGtlZXBzIHRoZSBzdGFsZVxuICAgICAgLy8gc2l6ZSBhbmQgYmxhbmtzIG91dC4gRGVmZXIgYSB0aWNrIHNvIHRoZSBwYW5lbCBsYXlvdXQgaGFzIHNldHRsZWQuXG4gICAgICBpZiAodGhpcy5oYXNQcm9maWxlcykge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMucmVuZGVySW50ZW5zaXR5SW5zZXQoKSwgMCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5pbWdMb2FkaW5nTWVzc2FnZVN1YnNjcmlwdGlvbiA9IHRoaXMuc3RhdGUuZ2V0SW1hZ2VMb2FkaW5nTWVzc2FnZSQoKS5zdWJzY3JpYmUoKG1lc3NhZ2UpID0+IHtcbiAgICAgIHRoaXMubG9hZGluZ01lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIH0pO1xuICAgIHRoaXMuc3RhdGVcbiAgICAgIC5nZXRDYWNoZVByb2dyZXNzJCgpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YikpXG4gICAgICAuc3Vic2NyaWJlKChwcm9ncmVzcykgPT4ge1xuICAgICAgICB0aGlzLmNhY2hlUHJvZ3Jlc3MgPSBwcm9ncmVzcztcbiAgICAgIH0pO1xuICAgIHRoaXMuaXNab29tU3Vic2NyaXB0aW9uID0gdGhpcy5zdGF0ZS5pc1pvb20kKCkuc3Vic2NyaWJlKCh6b29tKSA9PiB7XG4gICAgICB0aGlzLnpvb20gPSB6b29tO1xuICAgIH0pO1xuICAgIHRoaXMuZmlsZW5hbWVTdWJzY3JpcHRpb24gPSB0aGlzLnN0YXRlLmdldEZpbGVuYW1lJCgpLnN1YnNjcmliZSgoZmlsZW5hbWUpID0+IHtcbiAgICAgIGlmIChmaWxlbmFtZSkge1xuICAgICAgICB0aGlzLmZpbGVOYW1lID0gZmlsZW5hbWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5wbG90U2VydmljZS5nZXRDb2xvcm1hcCgpLnN1YnNjcmliZSgoY29sb3JtYXApID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb2xvcm1hcCA9IGNvbG9ybWFwO1xuICAgIH0pO1xuICAgIHRoaXMucGxvdFNlcnZpY2UuZ2V0UmV2ZXJzZVNjYWxlKCkuc3Vic2NyaWJlKChyZXZlcnNlc2NhbGUpID0+IHtcbiAgICAgIHRoaXMucmV2ZXJzZXNjYWxlID0gcmV2ZXJzZXNjYWxlO1xuICAgIH0pO1xuICAgIHRoaXMuaW50ZW5zaXR5UHJvZmlsZVN1YiA9IHRoaXMucGxvdFNlcnZpY2UuZ2V0SW50ZW5zaXR5UHJvZmlsZSQoKS5zdWJzY3JpYmUoKHByb2ZpbGVzKSA9PiB7XG4gICAgICB0aGlzLmxhdGVzdFByb2ZpbGVzID0gcHJvZmlsZXM7XG4gICAgICB0aGlzLmhhc1Byb2ZpbGVzID0gcHJvZmlsZXMubGVuZ3RoID4gMDtcbiAgICAgIC8vIFRoZSBwYW5lbCBkaXYgaXMgYmVoaW5kICpuZ0lmPVwiaGFzUHJvZmlsZXNcIi4gZGV0ZWN0Q2hhbmdlcygpIG1hdGVyaWFsaXplc1xuICAgICAgLy8gaXQgc3luY2hyb25vdXNseSAodGhlIHN1YnNjcmlwdGlvbiBtYXkgZmlyZSBvdXRzaWRlIEFuZ3VsYXIncyB6b25lIOKAlCBlLmcuXG4gICAgICAvLyBmcm9tIGFuIE9TRCBkcmFnIOKAlCBzbyBDRCB3b3VsZG4ndCBydW4gb24gaXRzIG93bikuIFRoZW4gcmVuZGVyIG9uIHRoZSBuZXh0XG4gICAgICAvLyBhbmltYXRpb24gZnJhbWUsIEFGVEVSIHRoZSBicm93c2VyIGxheXMgdGhlIHBhbmVsIG91dDogYSBzeW5jaHJvbm91cyBkcmF3XG4gICAgICAvLyBoaXRzIGEgemVyby1zaXplIGNvbnRhaW5lciBvbiBmaXJzdCBjcmVhdGUgYW5kIFBsb3RseSBrZWVwcyB0aGF0IHNpemUsIHNvXG4gICAgICAvLyB0aGUgaW5zZXQgc3RheXMgYmxhbmsgYW5kIGxpdmUgdXBkYXRlcyByZWRyYXcgaW50byB0aGUgc2FtZSB6ZXJvIGJveC5cbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLnJlbmRlckludGVuc2l0eUluc2V0KCkpO1xuICAgIH0pO1xuICAgIC8vIFdoZW4gdGhlIE9TRCB2aWV3IHNldHRsZXMgYXQgYSBuZXcgem9vbS9wYW4sIHJlLXNhbXBsZSB0aGUgaW50ZW5zaXR5IGxpbmVzXG4gICAgLy8gZnJvbSBhIGNyb3Agb2YgdGhlIHZpc2libGUgcmVnaW9uIHNvIHRoZSBpbnNldCByZWZsZWN0cyB0aGUgem9vbS1sZXZlbFxuICAgIC8vIHJlc29sdXRpb24gKFBsb3RseSdzIG93biBoaWdoLWRlZiB6b29tIHVwZGF0ZXMgdGhlIHNhbXBsaW5nIGNhY2hlIGlubGluZSkuXG4gICAgdGhpcy52aWV3cG9ydENoYW5nZVN1YiA9IHRoaXMucGxvdFNlcnZpY2UuZ2V0Vmlld3BvcnRDaGFuZ2UkKCkuc3Vic2NyaWJlKChyb2kpID0+IHtcbiAgICAgIGlmICh0aGlzLmhhc1Byb2ZpbGVzICYmIHRoaXMuaXNJbWFnZVZpZXcpIHtcbiAgICAgICAgdGhpcy5wbG90U2VydmljZS5yZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2kocm9pLngsIHJvaS55LCByb2kud2lkdGgsIHJvaS5oZWlnaHQsIHRoaXMuekluZGV4KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnByZXZpZXdTdWJzY3JpcHRpb24gPSB0aGlzLnN0YXRlLmdldEltYWdlSW5mbyQoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGltZ0luZm8pID0+IHtcbiAgICAgICAgaWYgKGltZ0luZm8pIHtcbiAgICAgICAgICB0aGlzLmltYWdlSW5mbyA9IGltZ0luZm87XG4gICAgICAgICAgLy8gU3RhY2stb25seSBwbG90IHR5cGVzIChpc29zdXJmYWNlLCBzY2F0dGVyM2QpIGRlcGVuZCBvbiB3aGV0aGVyIHRoaXNcbiAgICAgICAgICAvLyBmaWxlIGlzIGEgc3RhY2sg4oCUIHJlY29tcHV0ZSB0aGUgc2VsZWN0b3Igb3B0aW9ucy5cbiAgICAgICAgICB0aGlzLmNvbXB1dGVQbG90VHlwZU9wdGlvbnMoKTtcbiAgICAgICAgICAvLyBJZiB0aGUgYWN0aXZlIHBsb3QgdHlwZSBpc24ndCB2YWxpZCBmb3IgdGhpcyBpbWFnZSAoZS5nLiBhIHNjYWxhclxuICAgICAgICAgIC8vIHR5cGUgbGlrZSBDb250b3VyIGNhcnJpZWQgb3ZlciB0byBhbiBSR0IgaW1hZ2UpLCBmYWxsIGJhY2sgdG8gSW1hZ2UuXG4gICAgICAgICAgdGhpcy5yZWNvbmNpbGVTZWxlY3RlZFBsb3RUeXBlKCk7XG4gICAgICAgICAgLy8gcmVzZXQgc3RhY2sgb3B0aW9ucyBzZWxlY3Rpb25cbiAgICAgICAgICB0aGlzLnNlbGVjdGVkU3RhY2tPcHRpb24gPSBpbWdJbmZvLnNob3dTdGFjayA/IHRoaXMuc3RhY2tPcHRpb25zWzFdIDogdGhpcy5zdGFja09wdGlvbnNbMF07XG5cbiAgICAgICAgICB0aGlzLmlzR3JheXNjYWxlRXZlbnQuZW1pdCh0aGlzLmltYWdlSW5mby5pc0dyYXlzY2FsZSk7XG4gICAgICAgICAgdGhpcy5pc1N0YWNrRXZlbnQuZW1pdCh0aGlzLmltYWdlSW5mby5pc1N0YWNrKTtcbiAgICAgICAgICAvLyBSZXNldCB0byB0aGUgZGVmYXVsdCAyRCBJbWFnZSB2aWV3IHdoZW4gYSBkaWZmZXJlbnQgaW1hZ2UgaXNcbiAgICAgICAgICAvLyBzZWxlY3RlZCB3aGlsZSBhIDNEIHR5cGUgaXMgYWN0aXZlLlxuICAgICAgICAgIGlmICghdGhpcy5pc0hlYXRtYXAgJiYgaW1nSW5mby5maWxlTmFtZSAhPT0gdGhpcy5sb2FkZWRGaWxlTmFtZSkge1xuICAgICAgICAgICAgdGhpcy5pc0hlYXRtYXAgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5wbG90VHlwZSA9IFBsb3RUeXBlLklNQUdFO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFBsb3RUeXBlID0gUGxvdFR5cGUuSU1BR0U7XG4gICAgICAgICAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFBsb3RUeXBlKHRoaXMucGxvdFR5cGUpO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVTdXJmYWNlM2RNb2RlID0gJ3R1cm50YWJsZSc7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubG9hZGVkRmlsZU5hbWUgPSBpbWdJbmZvLmZpbGVOYW1lO1xuICAgICAgICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0SW1hZ2VNZXRhKHRoaXMuaW1hZ2VJbmZvLmltYWdlTWV0YSk7XG4gICAgICAgICAgY29uc3QgdXJscyA9IGltZ0luZm8udXJscztcbiAgICAgICAgICAvLyBBIG5ld2VyIGltYWdlIEFMV0FZUyBwcmVlbXB0cyBhbiBpbi1mbGlnaHQgcmVuZGVyLiBUaGlzIHdhc1xuICAgICAgICAgIC8vIGBpZiAoIXRoaXMucnVubmluZylgLCB3aGljaCBEUk9QUEVEIHRoZSBuZXcgaW1hZ2Ugd2hpbGUgdGhlIG9sZCBvbmVcbiAgICAgICAgICAvLyBmaW5pc2hlZDogaWRlbnRpdHkgYWJvdmUgaGFkIGFscmVhZHkgZmxpcHBlZCB0byB0aGUgbmV3IGZpbGUsIHNvIHRoZVxuICAgICAgICAgIC8vIGFwcCByZXBvcnRlZCBpbWFnZSBCIGFzIGxvYWRlZCB3aGlsZSBpbWFnZSBBIHN0YXllZCBvbiBzY3JlZW4uIFdvcnNlLFxuICAgICAgICAgIC8vIGEgY29sZCBpbWFnZSBob2xkcyB0aGUgc2xvdCBmb3IgaXRzIHdob2xlIHNlcnZlci1zaWRlIGNhY2hlIGZpbGwsIHNvXG4gICAgICAgICAgLy8gZXZlcnkgY2xpY2sgZm9yIDEtMiBtaW51dGVzIHdhcyBkaXNjYXJkZWQgYWdhaW5zdCBhIGJsYW5rIHZpZXdwb3J0XG4gICAgICAgICAgLy8gYW5kIGEgXCJMb2FkaW5nIGltYWdlLi4uXCIgb3ZlcmxheSB0aGF0IG5ldmVyIHJlc29sdmVkLlxuICAgICAgICAgIGlmICh1cmxzKSB7XG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9ICsrdGhpcy5yZW5kZXJUb2tlbjtcbiAgICAgICAgICAgIGNvbnN0IGlzQ3VycmVudCA9ICgpID0+IHRoaXMucmVuZGVyVG9rZW4gPT09IHRva2VuO1xuICAgICAgICAgICAgaWYgKHRoaXMucnVubmluZykge1xuICAgICAgICAgICAgICAvLyBTdG9wIHRoZSBwcmV2aW91cyByZW5kZXIncyBmcmFtZSBzdHJlYW1pbmcgKG5hcGFyaSB2b2x1bWUvc3VyZmFjZVxuICAgICAgICAgICAgICAvLyBwcmVsb2FkIGtlZXBzIGZldGNoaW5nIG90aGVyd2lzZSkgYW5kIGNsZWFyIGl0cyBzaGFycGVuIGZsYWcuIEl0c1xuICAgICAgICAgICAgICAvLyBjYWxsYmFja3MgYXJlIGFscmVhZHkgaW5lcnQgdmlhIHRoZSB0b2tlbiwgc28gaXQgY2FuIG5laXRoZXIgcGFpbnRcbiAgICAgICAgICAgICAgLy8gbm9yIHJlbGVhc2UgdGhlIG92ZXJsYXkgdGhpcyByZW5kZXIgbm93IG93bnMuXG4gICAgICAgICAgICAgIHRoaXMucGxvdFNlcnZpY2UuY2FuY2VsTG9hZGluZz8uKCk7XG4gICAgICAgICAgICAgIHRoaXMuc2hhcnBlbmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaW1hZ2Ugc2l6ZSDigJQgbWVhc3VyZSB0aGUgcGxvdCBkaXYgZGlyZWN0bHkgc28gdGhlIHRvb2xiYXIgaGVpZ2h0IGlzIGV4Y2x1ZGVkXG4gICAgICAgICAgICBjb25zdCBwbG90RGl2OiBIVE1MRWxlbWVudCB8IG51bGwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXZOYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IHNjcmVlbkhlaWdodCA9IHBsb3REaXY/Lm9mZnNldEhlaWdodCB8fCA1MDA7XG4gICAgICAgICAgICB0aGlzLnBsb3RTZXJ2aWNlLnJlc2V0KCk7XG4gICAgICAgICAgICB0aGlzLnN0YWNrTG9hZGluZyA9IGltZ0luZm8uaXNTdGFjayAmJiBpbWdJbmZvLnNob3dTdGFjaztcbiAgICAgICAgICAgIC8vIHNldCBtYXggaW5kZXggb2Ygc3RhY2sg4oCUIGNvbXB1dGVkIGJlZm9yZSB1cGRhdGVaSW5kZXggc28gYVxuICAgICAgICAgICAgLy8gZnJlc2ggc3RhY2sgKHNob3J0ZXIgb3IgbG9uZ2VyIHRoYW4gd2hhdGV2ZXIgd2FzIHByZXZpb3VzbHlcbiAgICAgICAgICAgIC8vIGxvYWRlZCkgY2xhbXBzIGFnYWluc3QgSVRTIGJvdW5kcywgbm90IHRoZSBzdGFsZSBvbmVzLlxuICAgICAgICAgICAgLy8gT25lIFVSTCBwZXIgc2xpY2UgKDAtaW5kZXhlZCksIHNvIHRoZSBsYXN0IHJlYWNoYWJsZSBpbmRleCBpc1xuICAgICAgICAgICAgLy8gbGVuZ3RoLTEg4oCUIGVhcmxpZXIgYGxlbmd0aC0yYCBkcm9wcGVkIHRoZSBmaW5hbCBzbGljZS5cbiAgICAgICAgICAgIHRoaXMubWF4SW5kZXggPSB1cmxzLmxlbmd0aCA+IDEgPyB1cmxzLmxlbmd0aCAtIDEgOiAwO1xuICAgICAgICAgICAgLy8gT25lLXNob3QgaGludDoganVtcCBzdHJhaWdodCB0byBhIHNwZWNpZmljIHNsaWNlIChlLmcuIHRoZVxuICAgICAgICAgICAgLy8gZmlsZSB0aGUgdXNlciBhY3R1YWxseSBjbGlja2VkIHdpdGhpbiBhIG51bWJlcmVkIHNlcmllcykuXG4gICAgICAgICAgICAvLyBDb25zdW1lZCBpbW1lZGlhdGVseSBzbyByZWRlbGl2ZXJpbmcgdGhlIHNhbWUgSW1hZ2VJbmZvIGxhdGVyXG4gICAgICAgICAgICAvLyAoYSBwbG90LXR5cGUgc3dpdGNoLCByZWxvYWRBbmRQbG90KSBkb2Vzbid0IHJlc2V0IHRoZSB1c2VyJ3NcbiAgICAgICAgICAgIC8vIGN1cnJlbnQgc2NydWIgcG9zaXRpb24gYmFjayB0byBpdC5cbiAgICAgICAgICAgIGlmIChpbWdJbmZvLmluaXRpYWxaSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB0aGlzLnpJbmRleCA9IGltZ0luZm8uaW5pdGlhbFpJbmRleDtcbiAgICAgICAgICAgICAgaW1nSW5mby5pbml0aWFsWkluZGV4ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSB6aW5kZXggaXMgd2l0aGluIGJvdW5kc1xuICAgICAgICAgICAgdGhpcy51cGRhdGVaSW5kZXgodXJscyk7XG4gICAgICAgICAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlO1xuICAgICAgICAgICAgLy8gTXVsdGktdGllciByZW5kZXJpbmcgKHNtYWxsIGJsdXJyeSB0aWVyIGZpcnN0LCB0aGVuIHNoYXJwZW4gaW5cbiAgICAgICAgICAgIC8vIHBsYWNlKSDigJQgc2VxdWVuY2luZyBsaXZlcyBpbiBSZW5kZXJPcmNoZXN0cmF0b3I7IHRoaXMgY29tcG9uZW50XG4gICAgICAgICAgICAvLyBzdXBwbGllcyB0aGUgcGhhc2UgcmVuZGVyIGFuZCBvd25zIHRoZSBVSSBmbGFncyB2aWEgY2FsbGJhY2tzLlxuICAgICAgICAgICAgLy8gM0QgcGxvdCB0eXBlcyByZW5kZXIgc2luZ2xlLXBhc3M6IHRoZSBpbi1wbGFjZSBsYXJnZSBwYXNzIGRvZXNuJ3RcbiAgICAgICAgICAgIC8vIHJlYnVpbGQgYSAzRCBnbC1tZXNoIGlzb3N1cmZhY2UsIHNvIHRoZSBzaGFycGVuIHN0ZXAgYmxhbmtlZCBpdC5cbiAgICAgICAgICAgIGNvbnN0IGhhc1NtYWxsVGllciA9XG4gICAgICAgICAgICAgIHRoaXMuaXNIZWF0bWFwICYmXG4gICAgICAgICAgICAgIChpbWdJbmZvLnNtYWxsVXJscz8ubGVuZ3RoID8/IDApID09PSB1cmxzLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAoaW1nSW5mby5zbWFsbFVybHM/Lmxlbmd0aCA/PyAwKSA+IDA7XG4gICAgICAgICAgICBjb25zdCBzbWFsbEltZ0luZm8gPSBoYXNTbWFsbFRpZXIgPyB7IC4uLmltZ0luZm8sIHVybHM6IGltZ0luZm8uc21hbGxVcmxzIGFzIHN0cmluZ1tdIH0gOiBudWxsO1xuXG4gICAgICAgICAgICAvLyBFbnRlciBwZXItc2xpY2Ugc3RhY2sgbW9kZSB3aXRoIHRoZSBnaXZlbiBzbGljZeKGknJlZ2lvbnMgbWFwIGFuZFxuICAgICAgICAgICAgLy8gc2VlZCB0aGUgXCJwcmV2aW91cyBzaGFwZXNcIiBmcm9tIHRoZSBub3ctbGl2ZSBzbGljZS4gZW50ZXJTdGFja01vZGVcbiAgICAgICAgICAgIC8vIG1ha2VzIHpJbmRleCdzIHNsaWNlIGxpdmUgYW5kIHJlc2V0cyB1bmRvIChqaXQtdWkjOTMpLlxuICAgICAgICAgICAgY29uc3QgZW50ZXJTdGFjayA9IChcbiAgICAgICAgICAgICAgc2xpY2VzOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4sXG4gICAgICAgICAgICAgIGxheW91dDogJ2NvbWJpbmVkJyB8ICdwZXItc2xpY2UtZmlsZScsXG4gICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5wbG90U2VydmljZS5lbnRlclN0YWNrTW9kZShzbGljZXMsIHRoaXMuekluZGV4LCBsYXlvdXQpO1xuICAgICAgICAgICAgICBjb25zdCBzaGFwZXMgPSB0aGlzLnBsb3RTZXJ2aWNlXG4gICAgICAgICAgICAgICAgLmdldFJlZ2lvbnMoKVxuICAgICAgICAgICAgICAgIC5tYXAoKHJlZ2lvbikgPT4gcmVnaW9uLmdldFNoYXBlKHRoaXMucGxvdFNlcnZpY2UuZ2V0U2hvd1NoYXBlTGFiZWwoKSkpO1xuICAgICAgICAgICAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFByZXZpb3VzU2hhcGVzKHNoYXBlcyk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBhcHBseVJvaSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgLy8gRm9sZGVyIHN0YWNrOiBhIHN0YWNrIG9mIHNlbGYtY29udGFpbmVkIHBlci1zbGljZSBmaWxlc1xuICAgICAgICAgICAgICAvLyAodGlsZWQgPT09IGZhbHNlOyBzZWUgbG9hZFNlcmllc0FzU3RhY2spLiBFYWNoIHNsaWNlLWZpbGUgbWF5XG4gICAgICAgICAgICAgIC8vIGNhcnJ5IGl0cyBvd24gc2libGluZyBcIjxzdGVtPi5nZW9qc29uXCIgKHJvaUpzb25TdHJzW3pdKSwgYnV0IGFcbiAgICAgICAgICAgICAgLy8gZnJlc2ggZm9sZGVyIHdpdGggbm9uZSB5ZXQgbGVhdmVzIHJvaUpzb25TdHJzIHVuZGVmaW5lZCDigJQga2V5XG4gICAgICAgICAgICAgIC8vIG9mZiBgdGlsZWQgPT09IGZhbHNlYCwgTk9UIHJvaUpzb25TdHJzLCBzbyBhbiB1bmFubm90YXRlZFxuICAgICAgICAgICAgICAvLyBmb2xkZXIgc3RhY2sgc3RpbGwgZW50ZXJzIHRoZSBwZXItc2xpY2UtZmlsZSBsYXlvdXQgKGFuZCBzYXZlc1xuICAgICAgICAgICAgICAvLyBiYWNrIG9uZSBnZW9qc29uIHBlciBzbGljZS1maWxlKSByYXRoZXIgdGhhbiBmYWxsaW5nIHRocm91Z2ggdG9cbiAgICAgICAgICAgICAgLy8gdGhlIHNpbmdsZS1maWxlIGNvbWJpbmVkIHBhdGggKGppdC11aSM5MykuXG4gICAgICAgICAgICAgIGlmIChpbWdJbmZvLmlzU3RhY2sgJiYgaW1nSW5mby50aWxlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwZXJTbGljZSA9IGltZ0luZm8ucm9pSnNvblN0cnM7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2xpY2VDb3VudCA9IGltZ0luZm8udXJscz8ubGVuZ3RoID8/IHBlclNsaWNlPy5sZW5ndGggPz8gMDtcbiAgICAgICAgICAgICAgICBjb25zdCBzbGljZXMgPSBuZXcgTWFwPG51bWJlciwgUmVnaW9uW10+KCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeiA9IDA7IHogPCBzbGljZUNvdW50OyB6KyspIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb24gPSBwZXJTbGljZT8uW3pdID8/IG51bGw7XG4gICAgICAgICAgICAgICAgICBzbGljZXMuc2V0KHosIGpzb24gPyB0aGlzLnBsb3RTZXJ2aWNlLmltcG9ydFJlZ2lvbnMoanNvbikgOiBbXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVudGVyU3RhY2soc2xpY2VzLCAncGVyLXNsaWNlLWZpbGUnKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gU2luZ2xlLWZpbGUgei1zdGFjazogb25lIHNpYmxpbmcgZ2VvanNvbiBob2xkaW5nIGV2ZXJ5IHNsaWNlJ3NcbiAgICAgICAgICAgICAgLy8gcmVnaW9ucyBpbmRleGVkIGJ5IFF1UGF0aCdzIGdlb21ldHJ5LnBsYW5lLnouIEVudGVyIHBlci1zbGljZVxuICAgICAgICAgICAgICAvLyBtb2RlIChzYXZpbmcgYmFjayBvbmUgY29tYmluZWQgei1pbmRleGVkIGdlb2pzb24pIHdoZW4gdGhlXG4gICAgICAgICAgICAgIC8vIGdlb2pzb24gYWN0dWFsbHkgY2FycmllcyBzbGljZSBpbmRpY2VzLCBvciB3aGVuIHRoZXJlJ3Mgbm90aGluZ1xuICAgICAgICAgICAgICAvLyB5ZXQgdG8gYXV0aG9yIGFnYWluc3QuIEEgbGVnYWN5IGdlb2pzb24gd2hvc2UgcmVnaW9ucyBhcmUgYWxsIG9uXG4gICAgICAgICAgICAgIC8vIHRoZSBkZWZhdWx0IHBsYW5lIHN0YXlzIGdsb2JhbCAoc2hvd24gb24gZXZlcnkgc2xpY2UpIHNvXG4gICAgICAgICAgICAgIC8vIGV4aXN0aW5nIHNpbmdsZS1wbGFuZSBhbm5vdGF0aW9ucyBhcmVuJ3QgY29uZmluZWQgdG8gc2xpY2UgMC5cbiAgICAgICAgICAgICAgY29uc3Qgcm9pSnNvbiA9IGltZ0luZm8ucm9pSnNvblN0cjtcbiAgICAgICAgICAgICAgaWYgKGltZ0luZm8uaXNTdGFjaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2lvbnMgPSByb2lKc29uID8gdGhpcy5wbG90U2VydmljZS5pbXBvcnRSZWdpb25zKHJvaUpzb24pIDogW107XG4gICAgICAgICAgICAgICAgY29uc3QgaGFzU2xpY2VJbmZvID0gcmVnaW9ucy5zb21lKChyKSA9PiAoci56ID8/IDApICE9PSAwKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJvaUpzb24gfHwgaGFzU2xpY2VJbmZvKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzbGljZXMgPSBuZXcgTWFwPG51bWJlciwgUmVnaW9uW10+KCk7XG4gICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHIgb2YgcmVnaW9ucykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB6ID0gci56ID8/IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1Y2tldCA9IHNsaWNlcy5nZXQoeik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChidWNrZXQpIGJ1Y2tldC5wdXNoKHIpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIHNsaWNlcy5zZXQoeiwgW3JdKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGVudGVyU3RhY2soc2xpY2VzLCAnY29tYmluZWQnKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gU2luZ2xlLXBsYW5lIGltYWdlIChvciBhIGxlZ2FjeSBnbG9iYWwgei1zdGFjayBnZW9qc29uKTogb25lXG4gICAgICAgICAgICAgIC8vIHJlZ2lvbiBzZXQgZm9yIHRoZSB3aG9sZSBpbWFnZS5cbiAgICAgICAgICAgICAgaWYgKHJvaUpzb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWdpb25zID0gdGhpcy5wbG90U2VydmljZS5pbXBvcnRSZWdpb25zKHJvaUpzb24pO1xuICAgICAgICAgICAgICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0UmVnaW9ucyhyZWdpb25zKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzaGFwZXMgPSByZWdpb25zLm1hcCgocmVnaW9uKSA9PlxuICAgICAgICAgICAgICAgICAgcmVnaW9uLmdldFNoYXBlKHRoaXMucGxvdFNlcnZpY2UuZ2V0U2hvd1NoYXBlTGFiZWwoKSksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFByZXZpb3VzU2hhcGVzKHNoYXBlcyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gTG9hZGluZyBhbiBpbWFnZSdzIHNhdmVkIFJPSXMgaXMgbm90IGEgdXNlciBlZGl0IOKAlCBzdGFydCB0aGVcbiAgICAgICAgICAgICAgLy8gdW5kbyBoaXN0b3J5IGZyZXNoIHNvIHRoZSBmaXJzdCB1bmRvIGNhbid0IHdpcGUgdGhlbSAoaml0LXVpIzg1KS5cbiAgICAgICAgICAgICAgdGhpcy5wbG90U2VydmljZS5yZXNldFVuZG9IaXN0b3J5KCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IG92ZXJsYXlSZWxlYXNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgcmVsZWFzZU92ZXJsYXkgPSAoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChvdmVybGF5UmVsZWFzZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgb3ZlcmxheVJlbGVhc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgaWYgKGltZ0luZm8uaXNTdGFjayAmJiBpbWdJbmZvLnNob3dTdGFjaykgdGhpcy5zdGFja0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUxvYWRpbmcoZmFsc2UpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgbmV3IFJlbmRlck9yY2hlc3RyYXRvcih7XG4gICAgICAgICAgICAgIC8vIGluUGxhY2U9dHJ1ZSB1cGRhdGVzIHRoZSBleGlzdGluZyByZW5kZXIgaW5zdGVhZCBvZiByZWJ1aWxkaW5nXG4gICAgICAgICAgICAgIC8vIGl0LCBzbyB0aGUgY2FudmFzIGRvZXNuJ3QgYmxhbmsgZHVyaW5nIHRoZSBzbWFsbOKGkmxhcmdlIHN3YXAuXG4gICAgICAgICAgICAgIHJlbmRlclBoYXNlOiAocGhhc2VJbmZvLCBpblBsYWNlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gU3VwZXJzZWRlZCBCRUZPUkUgdGhpcyBwaGFzZSBzdGFydGVkIOKAlCBkb24ndCBldmVuIGlzc3VlIHRoZSBsb2FkLlxuICAgICAgICAgICAgICAgIC8vIFJlbmRlck9yY2hlc3RyYXRvciBjYWxscyByZW5kZXJQaGFzZSBvbmNlIHBlciB0aWVyIGFuZCByZXRyaWVzIHRoZVxuICAgICAgICAgICAgICAgIC8vIHNoYXJwZW4gcGFzcyBvbiBmYWlsdXJlLCBzbyBjaGVja2luZyBvbmx5IGFmdGVyIHRoZSBsb2FkIHJlc29sdmVzXG4gICAgICAgICAgICAgICAgLy8gd291bGQgbGV0IGEgcHJlZW1wdGVkIHJlbmRlciBrZWVwIGZldGNoaW5nIHNsaWNlcy90aWxlcyBmb3IgYW5cbiAgICAgICAgICAgICAgICAvLyBpbWFnZSBub2JvZHkgaXMgbG9va2luZyBhdC5cbiAgICAgICAgICAgICAgICBpZiAoIWlzQ3VycmVudCgpKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBsb3RTZXJ2aWNlLmxvYWQocGhhc2VJbmZvLCB0aGlzLnpJbmRleCkudGhlbigobG9hZGVkSW1hZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgIC8vIFByZWVtcHRlZCB3aGlsZSB0aGlzIHBoYXNlIHdhcyBsb2FkaW5nIOKAlCBkcm9wIGl0IG9uIHRoZSBmbG9vci5cbiAgICAgICAgICAgICAgICAgIGlmICghaXNDdXJyZW50KCkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCBhIG5ld2VyIGNsaWNrIHJlYWNoaW5nIHVzIG1pZC1yZW5kZXIuXG4gICAgICAgICAgICAgICAgICBpZiAocGhhc2VJbmZvLmZpbGVOYW1lICE9PSBsb2FkZWRJbWFnZS5maWxlbmFtZSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wbG90U2VydmljZS5wbG90KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsb3REaXZOYW1lLFxuICAgICAgICAgICAgICAgICAgICBsb2FkZWRJbWFnZSxcbiAgICAgICAgICAgICAgICAgICAgcGhhc2VJbmZvLFxuICAgICAgICAgICAgICAgICAgICBzY3JlZW5IZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxvdFR5cGUsXG4gICAgICAgICAgICAgICAgICAgIGluUGxhY2UsXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBzbWFsbFNob3duOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0N1cnJlbnQoKSkgcmV0dXJuOyAvLyBzdXBlcnNlZGVkIGJ5IGEgbmV3ZXIgaW1hZ2VcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZmlsZSBpcyBzdGlsbCBiZWluZyBjYWNoZWQvcHJlcGFyZWQgc2VydmVyLXNpZGUsIGtlZXAgdGhlIGZ1bGxcbiAgICAgICAgICAgICAgICAvLyBjYWNoZS1wcm9ncmVzcyBvdmVybGF5IHVwIGluc3RlYWQgb2YgZHJvcHBpbmcgdG8gdGhlIHRyYW5zbHVjZW50IFwiU2hhcnBlbmluZ1xuICAgICAgICAgICAgICAgIC8vIHByZXZpZXcuLi5cIiBzcGlubmVyIG92ZXIgYSBibGFuayBjYW52YXMgKGEgbGFyZ2UgdW5jYWNoZWQgaW1hZ2UgcmVuZGVycyBpdHNcbiAgICAgICAgICAgICAgICAvLyBzbWFsbCBwcmV2aWV3IGJlZm9yZSBpdHMgdGlsZXMgZXhpc3QpLiBmaW5pc2hlZCgpIHJlbGVhc2VzIHRoZSBvdmVybGF5IG9uY2VcbiAgICAgICAgICAgICAgICAvLyB0aGUgcmVhbCByZW5kZXIgbGFuZHMuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNDYWNoaW5nKSByZXR1cm47XG4gICAgICAgICAgICAgICAgLy8gU21hbGwgdGllciBvbiBzY3JlZW4g4oCUIGRyb3AgdGhlIGZ1bGwgb3ZlcmxheSBidXQga2VlcCBhIHRyYW5zbHVjZW50IHNwaW5uZXIgc29cbiAgICAgICAgICAgICAgICAvLyB0aGUgYmx1cnJ5IHJlbmRlciBpc24ndCBtaXN0YWtlbiBmb3IgdGhlIGZpbmFsIGltYWdlLlxuICAgICAgICAgICAgICAgIHJlbGVhc2VPdmVybGF5KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zaGFycGVuaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgc2hhcnBlblNldHRsZWQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzQ3VycmVudCgpKSByZXR1cm47IC8vIHN1cGVyc2VkZWQgYnkgYSBuZXdlciBpbWFnZVxuICAgICAgICAgICAgICAgIHRoaXMuc2hhcnBlbmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBmaW5pc2hlZDogKF92aWFTbWFsbCwgbG9nVGFnKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0N1cnJlbnQoKSkgcmV0dXJuOyAvLyBzdXBlcnNlZGVkIGJ5IGEgbmV3ZXIgaW1hZ2VcbiAgICAgICAgICAgICAgICAvLyBJZGVtcG90ZW50IOKAlCByZWxlYXNlcyBub3cgaWYgc21hbGxTaG93biBkZWZlcnJlZCBpdCAoY2FjaGluZykgb3Igd2FzIHNraXBwZWQuXG4gICAgICAgICAgICAgICAgcmVsZWFzZU92ZXJsYXkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBhcHBseVJvaSgpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGxvZ1RhZyk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHNoYXJwZW5GYWlsZWQ6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghaXNDdXJyZW50KCkpIHJldHVybjsgLy8gc3VwZXJzZWRlZCBieSBhIG5ld2VyIGltYWdlXG4gICAgICAgICAgICAgICAgLy8gVGhlIHNtYWxsIHRpZXIgc3RheXMgb24gc2NyZWVuIGFzIHRoZSBmYWxsYmFjayDigJQgdGVsbCB0aGVcbiAgICAgICAgICAgICAgICAvLyB1c2VyIHRoZSBzaGFycGVyIHZlcnNpb24gaXNuJ3QgY29taW5nLlxuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyPy5tZXNzYWdlIHx8IGVycj8uc3RhdHVzVGV4dCB8fCBTdHJpbmcoZXJyKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgICAgICAgICAgICBrZXk6IHRoaXMudml6QWxlcnRUb2FzdEtleSxcbiAgICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnd2FybicsXG4gICAgICAgICAgICAgICAgICBzdW1tYXJ5OiAnUHJldmlldyBub3Qgc2hhcnBlbmVkJyxcbiAgICAgICAgICAgICAgICAgIGRldGFpbDogYFRoZSBmdWxsLXJlc29sdXRpb24gcHJldmlldyBkaWQgbm90IGxvYWQgKCR7bXNnfSkuIFRoZSBsb3ctcmVzb2x1dGlvbiBwcmV2aWV3IGlzIHN0aWxsIHNob3duLiBUcnkgY2xpY2tpbmcgdGhlIGltYWdlIGFnYWluLmAsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYXBwbHlSb2koKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pLnJlbmRlcihpbWdJbmZvLCBzbWFsbEltZ0luZm8pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnN0IG1zZyA9IGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyPy5tZXNzYWdlIHx8IGVycj8uc3RhdHVzVGV4dCB8fCBTdHJpbmcoZXJyKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igb2NjdXJlZCB3aGVuIGdldHRpbmcgaW1hZ2UgaW5mbycsIGVycik7XG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICBrZXk6IHRoaXMudml6QWxlcnRUb2FzdEtleSxcbiAgICAgICAgICBzdGlja3k6IHRydWUsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgc3VtbWFyeTogJ0FuIGVycm9yIG9jY3VyZWQnLFxuICAgICAgICAgIGRldGFpbDogYFRoZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJlZCB3aGlsZSBnZXR0aW5nIGltYWdlIGluZm86ICR7bXNnfS5cbiAgICAgICAgICAgICAgICAgICBQbGVhc2UgdHJ5IHRvIG9wZW4gdGhlIGltYWdlIGFnYWluIHRocm91Z2ggdGhlIGZpbGUgbmF2aWdhdG9yLmAsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnN0YWNrTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnN0YXRlLnNldEltYWdlTG9hZGluZyhmYWxzZSk7XG4gICAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBsb3RTZXJ2aWNlLnJlc2V0KCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMucGxvdENvbnRleHRNZW51TGlzdGVuZXIgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHBsb3RFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdk5hbWUpO1xuICAgICAgaWYgKCFwbG90RWw/LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSkgcmV0dXJuO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5jb250ZXh0TWVudUl0ZW1zID0gdGhpcy5idWlsZENvbnRleHRNZW51SXRlbXMoKTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB0aGlzLmNvbnRleHRNZW51LnNob3coZXZlbnQpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCB0aGlzLnBsb3RDb250ZXh0TWVudUxpc3RlbmVyLCB0cnVlKTtcblxuICAgIHRoaXMua2V5ZG93bkxpc3RlbmVyID0gKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBpZiAodGFyZ2V0LnRhZ05hbWUgPT09ICdJTlBVVCcgfHwgdGFyZ2V0LnRhZ05hbWUgPT09ICdURVhUQVJFQScgfHwgdGFyZ2V0LmlzQ29udGVudEVkaXRhYmxlKSByZXR1cm47XG4gICAgICAvLyBTQU0gcG9pbnQgbW9kZTogRW50ZXIgY29tbWl0cyB0aGUgb2JqZWN0LCBFc2MgY2xlYXJzIHRoZSBwcm9tcHQuXG4gICAgICBpZiAodGhpcy5hY3RpdmVEcmFnTW9kZSA9PT0gJ3NhbVBvaW50JyAmJiAoZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykgdGhpcy5wbG90U2VydmljZS5jb21taXRTYW1Qb2ludHMoKTtcbiAgICAgICAgICBlbHNlIHRoaXMucGxvdFNlcnZpY2UuY2xlYXJTYW1Qb2ludHMoKTtcbiAgICAgICAgICB0aGlzLmhpZGVTYW1Ub2FzdCgpOyAvLyBwcm9tcHQgcmVzb2x2ZWQg4oaSIGRpc21pc3MgdGhlIHN0YXR1cyB0b2FzdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gUmVnaW9uIGhpc3RvcnkgKGppdC11aSM4NSk6IEN0cmwvQ21kK1ogdW5kb2VzOyBDdHJsL0NtZCtTaGlmdCtaIG9yXG4gICAgICAvLyBDdHJsL0NtZCtZIHJlZG9lcy5cbiAgICAgIGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHtcbiAgICAgICAgY29uc3QgayA9IGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoayA9PT0gJ3onICYmICFldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMudW5kb1JlZ2lvbigpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChrID09PSAneicgJiYgZXZlbnQuc2hpZnRLZXkpIHx8IGsgPT09ICd5Jykge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMucmVkb1JlZ2lvbigpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChldmVudC5rZXkgPT09ICdEZWxldGUnIHx8IGV2ZW50LmtleSA9PT0gJ0JhY2tzcGFjZScgfHwgZXZlbnQua2V5ID09PSAnZCcgfHwgZXZlbnQua2V5ID09PSAnRCcpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuZGVsZXRlUmVnaW9uKCkpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICcrJyB8fCBldmVudC5rZXkgPT09ICc9Jykge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy56b29tSW4oKSk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJy0nIHx8IGV2ZW50LmtleSA9PT0gJ18nKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnpvb21PdXQoKSk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ3AnKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdwYW4nKSk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ2InKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCd6b29tVG9Cb3gnKSk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ3InKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdkcmF3cmVjdCcpKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnZicpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ2RyYXdjbG9zZWRwYXRoJykpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICd3Jykge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnd2FuZCcpKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnZScpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ2VyYXNlVmVydGV4JykpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdzJykge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnc2VsZWN0JykpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdsJykge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnZHJhd29wZW5wYXRoJykpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWRvd25MaXN0ZW5lcik7XG5cbiAgICB0aGlzLndoZWVsTGlzdGVuZXIgPSAoZXZlbnQ6IFdoZWVsRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHBsb3RFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdk5hbWUpO1xuICAgICAgaWYgKCFwbG90RWw/LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSkgcmV0dXJuO1xuICAgICAgLy8gVGhlIEltYWdlIHZpZXcgaGFuZGxlcyBzY3JvbGwtem9vbSBuYXRpdmVseSAoaXQgcmVzcGVjdHMgdGhlIHNjcm9sbFxuICAgICAgLy8gZGVsdGEpLiBJbnRlcmNlcHRpbmcgaGVyZSB3b3VsZCBmaXJlIGEgZml4ZWQgem9vbSBzdGVwIHBlciB3aGVlbFxuICAgICAgLy8gZXZlbnQg4oCUIGZhciB0b28gc2Vuc2l0aXZlIOKAlCBzbyBsZXQgdGhlIHJlbmRlcmVyIG93biBpdC5cbiAgICAgIGlmICh0aGlzLmlzSW1hZ2VWaWV3KSByZXR1cm47XG4gICAgICAvLyAzRCBwbG90IHR5cGVzIChzdXJmYWNlLCBzY2F0dGVyM2QsIGlzb3N1cmZhY2UpIHJlbmRlciBpbiBhIFBsb3RseSBzY2VuZVxuICAgICAgLy8gdGhhdCBvcmJpdHMvem9vbXMgbmF0aXZlbHkgb24gc2Nyb2xsLiBUaGUgMkQgc3RlcC16b29tIGRvZXNuJ3QgYXBwbHkgYW5kXG4gICAgICAvLyB3b3VsZCB0aHJvdyAobm8geGF4aXMgb24gYSBzY2VuZSksIHNvIGxldCBQbG90bHkgaGFuZGxlIHRoZSB3aGVlbC5cbiAgICAgIGlmICghdGhpcy5pc0hlYXRtYXApIHJldHVybjtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgIGlmIChldmVudC5kZWx0YVkgPCAwKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnpvb21JbigpKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZGVsdGFZID4gMCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy56b29tT3V0KCkpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgdGhpcy53aGVlbExpc3RlbmVyLCB7IGNhcHR1cmU6IHRydWUsIHBhc3NpdmU6IGZhbHNlIH0pO1xuXG4gICAgLy8gRHJhZyBoYW5kbGluZyBmb3IgdGhlIGZsb2F0aW5nIGludGVuc2l0eS1wcm9maWxlIHBhbmVsLlxuICAgIHRoaXMucHJvZmlsZURyYWdNb3ZlTGlzdGVuZXIgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgaWYgKHRoaXMucHJvZmlsZVBhbmVsRHJhZ2dpbmcpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnByb2ZpbGVQYW5lbFBvcyA9IHtcbiAgICAgICAgICAgIHg6IHRoaXMucHJvZmlsZVBhbmVsU3RhcnQueCArIChlLmNsaWVudFggLSB0aGlzLnByb2ZpbGVQYW5lbFN0YXJ0Lm14KSxcbiAgICAgICAgICAgIHk6IHRoaXMucHJvZmlsZVBhbmVsU3RhcnQueSArIChlLmNsaWVudFkgLSB0aGlzLnByb2ZpbGVQYW5lbFN0YXJ0Lm15KSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy50b29sYmFyRHJhZ2dpbmcpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnRvb2xiYXJQb3MgPSB7XG4gICAgICAgICAgICB4OiB0aGlzLnRvb2xiYXJTdGFydC54ICsgKGUuY2xpZW50WCAtIHRoaXMudG9vbGJhclN0YXJ0Lm14KSxcbiAgICAgICAgICAgIHk6IHRoaXMudG9vbGJhclN0YXJ0LnkgKyAoZS5jbGllbnRZIC0gdGhpcy50b29sYmFyU3RhcnQubXkpLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5wcm9maWxlRHJhZ1VwTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICB0aGlzLnByb2ZpbGVQYW5lbERyYWdnaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnRvb2xiYXJEcmFnZ2luZyA9IGZhbHNlO1xuICAgIH07XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMucHJvZmlsZURyYWdNb3ZlTGlzdGVuZXIpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5wcm9maWxlRHJhZ1VwTGlzdGVuZXIpO1xuXG4gICAgLy8gT24gYW55IHdpbmRvdyByZXNpemUsIHJlZmxvdyB0aGUgaW50ZW5zaXR5IGluc2V0IHRvIGl0cyAoZml4ZWQpIHBhbmVsIHNpemVcbiAgICAvLyBvbiB0aGUgbmV4dCBmcmFtZSwgb25jZSBsYXlvdXQgaGFzIHNldHRsZWQuIFdpdGhvdXQgdGhpcyB0aGUgaW5zZXQgY2FuIGJlXG4gICAgLy8gbGVmdCBhdCBhIHN0YWxlL3plcm8gc2l6ZSBieSBhIG1pZC1yZWZsb3cgcmVzaXplIGFuZCBzdG9wIHNob3dpbmcuXG4gICAgdGhpcy5wcm9maWxlUmVzaXplTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaGFzUHJvZmlsZXMpIHJldHVybjtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLnJlbmRlckludGVuc2l0eUluc2V0KCkpO1xuICAgIH07XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMucHJvZmlsZVJlc2l6ZUxpc3RlbmVyKTtcbiAgfVxuXG4gIG9uUHJvZmlsZVBhbmVsRHJhZ1N0YXJ0KGU6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLnByb2ZpbGVQYW5lbERyYWdnaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnByb2ZpbGVQYW5lbFN0YXJ0ID0ge1xuICAgICAgbXg6IGUuY2xpZW50WCxcbiAgICAgIG15OiBlLmNsaWVudFksXG4gICAgICB4OiB0aGlzLnByb2ZpbGVQYW5lbFBvcy54LFxuICAgICAgeTogdGhpcy5wcm9maWxlUGFuZWxQb3MueSxcbiAgICB9O1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIC8qKiBHcmFiIHRoZSB0b29sYmFyIGhhbmRsZTogZGV0YWNoIGl0IGludG8gYSBmbG9hdGluZyB3aW5kb3cgKGlmIHN0aWxsIGRvY2tlZClcbiAgICogIGFuZCBzdGFydCBkcmFnZ2luZy4gKi9cbiAgb25Ub29sYmFyRHJhZ1N0YXJ0KGU6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMudG9vbGJhckZsb2F0aW5nKSB7XG4gICAgICB0aGlzLnRvb2xiYXJGbG9hdGluZyA9IHRydWU7XG4gICAgICB0aGlzLnRvb2xiYXJQb3MgPSB7IHg6IDgsIHk6IDggfTtcbiAgICB9XG4gICAgdGhpcy50b29sYmFyRHJhZ2dpbmcgPSB0cnVlO1xuICAgIHRoaXMudG9vbGJhclN0YXJ0ID0ge1xuICAgICAgbXg6IGUuY2xpZW50WCxcbiAgICAgIG15OiBlLmNsaWVudFksXG4gICAgICB4OiB0aGlzLnRvb2xiYXJQb3MueCxcbiAgICAgIHk6IHRoaXMudG9vbGJhclBvcy55LFxuICAgIH07XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgLyoqIFNuYXAgdGhlIGZsb2F0aW5nIHRvb2xiYXIgYmFjayB0byBpdHMgZG9ja2VkIHBvc2l0aW9uIGFjcm9zcyB0aGUgdG9wLiAqL1xuICBkb2NrVG9vbGJhcigpIHtcbiAgICB0aGlzLnRvb2xiYXJGbG9hdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgLyoqIFJlbmRlciB0aGUgaW50ZW5zaXR5IGluc2V0IGNoYXJ0IGZyb20gdGhlIGxhdGVzdCBwcm9maWxlIGRhdGEuIFRoZSBhY3R1YWxcbiAgICogIGNoYXJ0aW5nIGlzIG93bmVkIGJ5IHRoZSB2aXN1YWxpemVyIHNlcnZpY2Ug4oCUIHRoZSBjb21wb25lbnQganVzdCBkZWNpZGVzXG4gICAqICB3aGVuIChwcm9maWxlIG1vZGUgKyBhIGZyZXNoIHByb2ZpbGUpLiAqL1xuICBwcml2YXRlIHJlbmRlckludGVuc2l0eUluc2V0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNQcm9maWxlcykgcmV0dXJuO1xuICAgIHRoaXMucGxvdFNlcnZpY2UucmVuZGVySW50ZW5zaXR5SW5zZXQodGhpcy5pbnRlbnNpdHlJbnNldERpdiwgdGhpcy5sYXRlc3RQcm9maWxlcyk7XG4gIH1cblxuICAvKiogVG9vbGJhciBcIkludGVuc2l0eVwiIGdyb3VwOiBhZGQgYW5vdGhlciBsaW5lIFJPSSAobmV4dCBicmlnaHQgY29sb3VyKS4gKi9cbiAgYXN5bmMgYWRkUHJvZmlsZUxpbmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gUGFyayB0aGUgZmxvYXRpbmcgaW5zZXQgbmVhciB0aGUgcGxvdCdzIHRvcC1yaWdodCB3aGVuIHRoZSBmaXJzdCBsaW5lIGlzXG4gICAgLy8gYWRkZWQgKGl0J3MgcG9zaXRpb246Zml4ZWQsIHNvIHVzZSB2aWV3cG9ydCBjb29yZHMgZnJvbSB0aGUgcGxvdCByZWN0KS5cbiAgICBpZiAoIXRoaXMuaGFzUHJvZmlsZXMpIHtcbiAgICAgIGNvbnN0IHJlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXZOYW1lKT8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB0aGlzLnByb2ZpbGVQYW5lbFBvcyA9IHJlY3RcbiAgICAgICAgPyB7IHg6IE1hdGgubWF4KDEwLCByZWN0LnJpZ2h0IC0gMzAwKSwgeTogcmVjdC50b3AgKyAxMCB9XG4gICAgICAgIDogeyB4OiAyMCwgeTogNzAgfTtcbiAgICB9XG4gICAgLy8gSW1hZ2UgKE9TRCkgbW9kZTogUGxvdGx5IG5ldmVyIHJlbmRlcmVkLCBzbyBpdCBoYXMgbm8gcGl4ZWwgY2FjaGUgLyBleHRlbnQuXG4gICAgLy8gTG9hZCB0aGUgY3VycmVudCBzbGljZSdzIGZyYW1lcyBmb3Igc2FtcGxpbmcgKyBsaW5lIHBsYWNlbWVudCBmaXJzdC5cbiAgICBpZiAodGhpcy5pc0ltYWdlVmlldyAmJiB0aGlzLmltYWdlSW5mbykge1xuICAgICAgYXdhaXQgdGhpcy5wbG90U2VydmljZS5lbnN1cmVJbnRlbnNpdHlTYW1wbGluZyh0aGlzLmltYWdlSW5mbywgdGhpcy56SW5kZXgpO1xuICAgIH1cbiAgICBjb25zdCByZWdpb24gPSB0aGlzLnBsb3RTZXJ2aWNlLmdldEludGVuc2l0eUNvbnRyb2xzKCk/LmFkZFByb2ZpbGVMaW5lKCk7XG4gICAgLy8gQXV0by1zZWxlY3QgdGhlIG5ldyBsaW5lIG9uIHRoZSBhY3RpdmUgYmFja2VuZCAoUGxvdGx5IGhhbmRsZXMgLyBPU0RcbiAgICAvLyBoaWdobGlnaHQpIHNvIGl0J3MgcmVhZHkgdG8gbW92ZSBvciBkZWxldGUgaW1tZWRpYXRlbHkuXG4gICAgaWYgKHJlZ2lvbikge1xuICAgICAgdGhpcy5wbG90U2VydmljZS5zZWxlY3RSZWdpb24ocmVnaW9uKTtcbiAgICAgIC8vIE9TRCBvbmx5IGRyYXdzIGEgc2VsZWN0ZWQgcmVnaW9uJ3MgaGFuZGxlcyBpbiBhbiBlZGl0IG1vZGUsIHNvIGEgbGluZSBpblxuICAgICAgLy8gJ25vbmUnIG1vZGUgbG9va3MgdW5zZWxlY3RlZC4gU3dpdGNoIHRvICdzZWxlY3QnIHNvIHRoZSBuZXcgbGluZSBzaG93c1xuICAgICAgLy8gaXRzIGVuZHBvaW50IGhhbmRsZXMgYW5kIGNhbiBiZSBkcmFnZ2VkL2RlbGV0ZWQgcmlnaHQgYXdheS5cbiAgICAgIGlmICh0aGlzLmlzSW1hZ2VWaWV3ICYmIHRoaXMuYWN0aXZlRHJhZ01vZGUgIT09ICdzZWxlY3QnKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlRHJhZ01vZGUoJ3NlbGVjdCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIC8vIExlYXZlIHRoZSBsaXZlIHNldCBzbyB0aGUgbmV4dC1vbGRlc3QgdmlzdWFsaXplciBwaWNrcyB1cCB0aGUgb3V0bGV0cy5cbiAgICBWaXN1YWxpemVyQ29tcG9uZW50LmxpdmVJbnN0YW5jZXMuZGVsZXRlKHRoaXMpO1xuICAgIHRoaXMuc2NydWJiZXIuY2FuY2VsKCk7XG4gICAgdGhpcy5zYW1Qb2ludFN1Yi51bnN1YnNjcmliZSgpO1xuICAgIGlmICh0aGlzLnBsb3RDb250ZXh0TWVudUxpc3RlbmVyKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCB0aGlzLnBsb3RDb250ZXh0TWVudUxpc3RlbmVyLCB0cnVlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMua2V5ZG93bkxpc3RlbmVyKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5ZG93bkxpc3RlbmVyKTtcbiAgICB9XG4gICAgaWYgKHRoaXMud2hlZWxMaXN0ZW5lcikge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3doZWVsJywgdGhpcy53aGVlbExpc3RlbmVyLCB0cnVlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJvZmlsZURyYWdNb3ZlTGlzdGVuZXIpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLnByb2ZpbGVEcmFnTW92ZUxpc3RlbmVyKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJvZmlsZURyYWdVcExpc3RlbmVyKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMucHJvZmlsZURyYWdVcExpc3RlbmVyKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJvZmlsZVJlc2l6ZUxpc3RlbmVyKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5wcm9maWxlUmVzaXplTGlzdGVuZXIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbnRlbnNpdHlQcm9maWxlU3ViKSB7XG4gICAgICB0aGlzLmludGVuc2l0eVByb2ZpbGVTdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudmlld3BvcnRDaGFuZ2VTdWIpIHtcbiAgICAgIHRoaXMudmlld3BvcnRDaGFuZ2VTdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy51bnN1Yi5uZXh0KCk7XG4gICAgdGhpcy51bnN1Yi5jb21wbGV0ZSgpO1xuICAgIGlmICh0aGlzLnByZXZpZXdTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMucHJldmlld1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wbG90V2lkdGhTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMucGxvdFdpZHRoU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmltYWdlTG9hZGluZ1N1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5pbWFnZUxvYWRpbmdTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaW1nTG9hZGluZ01lc3NhZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuaW1nTG9hZGluZ01lc3NhZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNab29tU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmlzWm9vbVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5hdXRvc2NhbGVTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuYXV0b3NjYWxlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmZpbGVuYW1lU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmZpbGVuYW1lU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMucGxvdFNlcnZpY2UudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBoYXNSZWdpb25zKCk6IGJvb2xlYW4ge1xuICAgIC8vIFVzZSB0aGUgY29udHJhY3QncyBmcmFtZXdvcmstbmV1dHJhbCByZWdpb24gYWNjZXNzb3IsIG5vdCB0aGUgcmF3XG4gICAgLy8gUGxvdGx5LXNoYXBlZCBnZXRTaGFwZXMoKSDigJQgdGhlIGNvbXBvbmVudCBvbmx5IG5lZWRzIHRvIGtub3cgd2hldGhlciBhbnlcbiAgICAvLyByZWdpb24gZXhpc3RzLCBhbmQgbXVzdCBub3QgZGVwZW5kIG9uIGEgYmFja2VuZCdzIHdpcmUgZm9ybWF0LlxuICAgIHJldHVybiB0aGlzLnBsb3RTZXJ2aWNlLmdldFJlZ2lvbnMoKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpbiBtYWluRmFjYWRlLmNvbmZpZ1JlcXVlc3QoKSAtIERPIE5PVCBERUxFVEVcbiAgICovXG4gIHB1YmxpYyBnZXRSZWdpb25Qb2x5Z29ucygpOiBQb2x5Z29uW10ge1xuICAgIHJldHVybiB0aGlzLnBsb3RTZXJ2aWNlLmdldFJlZ2lvblBvbHlnb25zKCk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IHRoZSBjb2xvciBzY2FsZSB0eXBlOiBjYWxsZWQgYnkgdGhlIGNvbG9yIHNjYWxlIHNlbGVjdCBidXR0b25cbiAgICogQHBhcmFtIGV2ZW50XG4gICAqL1xuICB0b2dnbGVSZXZlcnNlU2NhbGUoKSB7XG4gICAgdGhpcy5yZXZlcnNlc2NhbGUgPSAhdGhpcy5yZXZlcnNlc2NhbGU7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRSZXZlcnNlU2NhbGUodGhpcy5yZXZlcnNlc2NhbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCBhIGNvbG9yIG1hcDogY2FsbGVkIGJ5IHRoZSBjb2xvciBtYXAgZHJvcGRvd24gYnV0dG9uXG4gICAqIEBwYXJhbSBjb2xvcm1hcE5vZGVcbiAgICovXG4gIHNlbGVjdENvbG9ybWFwKGNvbG9ybWFwTm9kZTogVHJlZU5vZGUpIHtcbiAgICBpZiAoIWNvbG9ybWFwTm9kZS5jaGlsZHJlbikge1xuICAgICAgdGhpcy5wbG90U2VydmljZS5zZXRDb2xvcm1hcChjb2xvcm1hcE5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBPcGVuIHRoZSBDaGFubmVscyAmIEhpc3RvZ3JhbSBkaWFsb2cgKHRvb2xiYXIgYnV0dG9uKS4gKi9cbiAgb3BlbkNoYW5uZWxIaXN0b2dyYW0oKSB7XG4gICAgdGhpcy5zaG93Q2hhbm5lbEhpc3RvZ3JhbSA9IHRydWU7XG4gIH1cblxuICAvKiogT3BlbiB0aGUgUmVnaW9uIEVkaXRvciBkaWFsb2cgKHRvb2xiYXIgYnV0dG9uKS4gVGhlIGVkaXRvciBzdGF5cyBsaW5rZWQgdG9cbiAgICogIHRoaXMgcGxvdHRpbmcgaW5zdGFuY2UgdGhyb3VnaCB0aGUgcm9vdCBSZWdpb25TdG9yZSBzaW5nbGV0b24sIHNvIGl0IHdvcmtzXG4gICAqICB0aGUgc2FtZSBhcyB0aGUgZm9ybWVyIHJpZ2h0LXBhbmVsIFJlZ2lvbnMgdGFiLiAqL1xuICBvcGVuUmVnaW9uRWRpdG9yKCkge1xuICAgIC8vIFNpemUgdGhlIGRpYWxvZyB0byBtYXRjaCB0aGUgaG9zdCdzIGNvbmZpZ3VyZWQgZWxlbWVudCAoZS5nLiB0aGUgYXBwJ3NcbiAgICAvLyByaWdodCBwYW5lbCkgYXQgb3BlbiB0aW1lLiBNZWFzdXJlZCBvbmNlIOKAlCBpdCBpbnRlbnRpb25hbGx5IGRvZXMgbm90XG4gICAgLy8gdHJhY2sgbGF0ZXIgYnJvd3Nlci9zcGxpdCByZXNpemVzLiBGYWxscyBiYWNrIHRvIGEgcXVhcnRlciBvZiB0aGUgcGFnZVxuICAgIC8vIHdoZW4gbm8gc2VsZWN0b3IgaXMgY29uZmlndXJlZCBvciB0aGUgZWxlbWVudCBpc24ndCBwcmVzZW50LlxuICAgIGNvbnN0IHNlbGVjdG9yID0gdGhpcy52aXpDb25maWc/LnJlZ2lvbkVkaXRvcldpZHRoU2VsZWN0b3I7XG4gICAgY29uc3Qgd2lkdGggPSBzZWxlY3RvclxuICAgICAgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihzZWxlY3Rvcik/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLnJlZ2lvbkVkaXRvcldpZHRoID0gd2lkdGggJiYgd2lkdGggPiAwID8gYCR7TWF0aC5yb3VuZCh3aWR0aCl9cHhgIDogJzI1dncnO1xuICAgIHRoaXMuc2hvd1JlZ2lvbkVkaXRvciA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIGJ5IHRoZSBzdGFjay9zaW5nbGUgaW1hZ2UgZHJvcGRvd24gYnV0dG9uXG4gICAqIEBwYXJhbSBzaG93c3RhY2tcbiAgICovXG4gIHNlbGVjdFN0YWNrT3B0aW9uKHNlbGVjdGVkU3RhY2tPcHRpb246IGFueSkge1xuICAgIGNvbnN0IHNob3dzdGFjayA9IHNlbGVjdGVkU3RhY2tPcHRpb24udmFsID09PSAndHJ1ZSc7XG4gICAgdGhpcy5zZWxlY3RlZFN0YWNrT3B0aW9uID0gc2VsZWN0ZWRTdGFja09wdGlvbjtcbiAgICBjb25zb2xlLmxvZygnc2VsZWN0ZWQgc3RhY2sgb3B0aW9uJyArIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRTdGFja09wdGlvbikpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nID0gc2hvd3N0YWNrO1xuICAgIHRoaXMuc3RhdGUuc2V0SW1hZ2VMb2FkaW5nKCFzaG93c3RhY2spO1xuICAgIC8vIFN0YWNrIG1vZGUgaXMgYWx3YXlzIGEgMkQgaGVhdG1hcCDigJQgcmVzZXQgc3VyZmFjZSBtb2RlIGlmIGFjdGl2ZVxuICAgIGlmICghdGhpcy5pc0hlYXRtYXApIHtcbiAgICAgIHRoaXMuaXNIZWF0bWFwID0gdHJ1ZTtcbiAgICAgIHRoaXMucGxvdFR5cGUgPSBQbG90VHlwZS5IRUFUTUFQO1xuICAgICAgdGhpcy5zZWxlY3RlZFBsb3RUeXBlID0gUGxvdFR5cGUuSEVBVE1BUDtcbiAgICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0UGxvdFR5cGUodGhpcy5wbG90VHlwZSk7XG4gICAgfVxuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0U2hvd1N0YWNrKHNob3dzdGFjayk7XG4gIH1cblxuICB1cGRhdGVaSW5kZXgodXJscz86IHN0cmluZ1tdKSB7XG4gICAgaWYgKHRoaXMuekluZGV4ID4gdGhpcy5tYXhJbmRleCkge1xuICAgICAgdGhpcy56SW5kZXggPSB0aGlzLm1heEluZGV4O1xuICAgIH1cbiAgICBpZiAodGhpcy56SW5kZXggPCAwKSB7XG4gICAgICB0aGlzLnpJbmRleCA9IDA7XG4gICAgfVxuICAgIGlmICh1cmxzKSB7XG4gICAgICBpZiAodGhpcy56SW5kZXggPiB1cmxzPy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy56SW5kZXggPSAwO1xuICAgICAgICB0aGlzLm1heEluZGV4ID0gdXJscy5sZW5ndGggLSAxO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFpJbmRleCh0aGlzLnpJbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogTGl2ZSB6LXNsaWNlIHNjcnViIGZvciB0aGUgSW1hZ2UgdmlldzogdGhlIHJlbmRlcmVyIHN3YXBzIHRoZSBkaXNwbGF5ZWRcbiAgICogc2xpY2UgaW4gcGxhY2UgKG5vIHJlLW1vdW50KSwgc28gZHJhZ2dpbmcgdGhlIHNsaWRlciBzdGVwcyB0aHJvdWdoIHRoZVxuICAgKiBzdGFjayB0aGUgc2FtZSB3YXkgdGhlIGhlYXRtYXAgZnJhbWUgc2xpZGVyIGRvZXMuXG4gICAqL1xuICBvblpTbGlkZSh6OiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoeiA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgdGhpcy56SW5kZXggPSB6O1xuICAgIHRoaXMuc2NydWJiZXIuY29tbWl0KHopO1xuICAgIC8vIEtlZXAgdGhlIGludGVuc2l0eSBpbnNldCBpbiBzeW5jIHdpdGggdGhlIGRpc3BsYXllZCBzbGljZSAoSW1hZ2UvT1NEIG1vZGUsXG4gICAgLy8gd2hlcmUgdGhlIHByb2ZpbGUgc2FtcGxlciBpcyBmZWQgZnJvbSB0aGUgbG9hZGVkIHByZXZpZXcgZnJhbWVzKS5cbiAgICBpZiAodGhpcy5oYXNQcm9maWxlcyAmJiB0aGlzLmlzSW1hZ2VWaWV3ICYmIHRoaXMuaW1hZ2VJbmZvKSB7XG4gICAgICB0aGlzLnBsb3RTZXJ2aWNlLmVuc3VyZUludGVuc2l0eVNhbXBsaW5nKHRoaXMuaW1hZ2VJbmZvLCB6KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGl2ZSAoZGVib3VuY2VkKSBzY3J1YiB3aGlsZSBkcmFnZ2luZyB0aGUgSW1hZ2UtdmlldyB6LXNsaWRlcjogdXBkYXRlIHRoZVxuICAgKiBzbGljZSBhcyB0aGUgdXNlciBkcmFncywgYnV0IGNvYWxlc2NlIHJhcGlkIGNoYW5nZXMgc28gd2UgZG9uJ3QgZmlyZSBhXG4gICAqIHNsaWNlIHN3YXAgb24gZXZlcnkgcGl4ZWwuIFRoZSBmaW5hbCB2YWx1ZSBhbHNvIGxhbmRzIHZpYSBvblpTbGlkZSAob25TbGlkZUVuZCkuXG4gICAqL1xuICBvblpTY3J1Yih6OiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoeiA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgdGhpcy56SW5kZXggPSB6O1xuICAgIHRoaXMuc2NydWJiZXIuc2NydWIoeik7XG4gIH1cblxuICAvKipcbiAgICogS2V5Ym9hcmQgc3RhY2sgbmF2aWdhdGlvbjog4oaQL+KGkiBzdGVwIHRoZSB6LXNsaWNlIGluIHRoZSBJbWFnZSB2aWV3LCB0aGUgc2FtZVxuICAgKiB3YXkgdGhlIHNsaWRlciBkb2VzLiBPbmx5IGFjdGl2ZSBmb3IgYSBsb2FkZWQgc3RhY2sgaW4gSW1hZ2UgdmlldywgYW5kXG4gICAqIGlnbm9yZWQgd2hpbGUgYSBmb3JtIGZpZWxkIGlzIGZvY3VzZWQgc28gdHlwaW5nIGlzbid0IGhpamFja2VkLiBVcC9Eb3duIGFyZVxuICAgKiBsZWZ0IHRvIE9wZW5TZWFkcmFnb24gKHBhbm5pbmcpLlxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleWRvd24nLCBbJyRldmVudCddKVxuICBvbktleWRvd24oZTogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmIChlLmtleSAhPT0gJ0Fycm93TGVmdCcgJiYgZS5rZXkgIT09ICdBcnJvd1JpZ2h0JykgcmV0dXJuO1xuICAgIGlmICghdGhpcy5pbWFnZUluZm8/LmlzU3RhY2sgfHwgIXRoaXMuaXNJbWFnZVZpZXcpIHJldHVybjtcbiAgICBjb25zdCB0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICh0ICYmICgvXihJTlBVVHxURVhUQVJFQXxTRUxFQ1QpJC8udGVzdCh0LnRhZ05hbWUpIHx8IHQuaXNDb250ZW50RWRpdGFibGUpKSByZXR1cm47XG4gICAgLy8gVGhlIHNsaWNlIHNsaWRlciBoYW5kbGVzIGFycm93cyBuYXRpdmVseSB3aGVuIGZvY3VzZWQgKGFsc28gYSArMSBzdGVwKSDigJRcbiAgICAvLyBza2lwIGhlcmUgc28gd2UgZG9uJ3QgZG91YmxlLXN0ZXAgaXQuXG4gICAgaWYgKHQgJiYgKHQuZ2V0QXR0cmlidXRlKCdyb2xlJykgPT09ICdzbGlkZXInIHx8IHQuY2xvc2VzdCgnLnAtc2xpZGVyJykpKSByZXR1cm47XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuc3RlcFNsaWNlKGUua2V5ID09PSAnQXJyb3dSaWdodCcgPyAxIDogLTEpO1xuICB9XG5cbiAgLyoqIE1vdmUgdGhlIGRpc3BsYXllZCBzbGljZSBieSBgZGVsdGFgLCBjbGFtcGVkIHRvIHRoZSBzdGFjayBib3VuZHMuICovXG4gIHN0ZXBTbGljZShkZWx0YTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IE1hdGgubWluKHRoaXMubWF4SW5kZXgsIE1hdGgubWF4KDAsIHRoaXMuekluZGV4ICsgZGVsdGEpKTtcbiAgICBpZiAobmV4dCA9PT0gdGhpcy56SW5kZXgpIHJldHVybjtcbiAgICB0aGlzLm9uWlNsaWRlKG5leHQpO1xuICB9XG5cbiAgcmVsb2FkQW5kUGxvdCgpIHtcbiAgICB0aGlzLnN0YXRlLnNldEltYWdlTG9hZGluZyh0cnVlKTtcbiAgICAvLyBSZS1kcml2ZSB0aGUgcmVuZGVyIHBpcGVsaW5lIGZyb20gdGhlIGN1cnJlbnQgaW1hZ2UgaW5mbyAodGhlIHNvdXJjZSBvZlxuICAgIC8vIHRydXRoLCB3aXRoIHJlYWwgdXJscy9maWxlTmFtZSkuIERvbid0IHVzZSBwbG90U2VydmljZS5yZWxvYWRBbmRQbG90KCk6XG4gICAgLy8gdGhhdCByZWJ1aWxkcyB0aGUgaW5mbyBmcm9tIHRoZSByZW5kZXJlcidzIGludGVybmFsIHN0YXRlLCB3aGljaCBjYW4gYmVcbiAgICAvLyBzdGFsZSAoZS5nLiBhZnRlciBzd2l0Y2hpbmcgcGxvdCB0eXBlIEltYWdlIC0+IEhlYXRtYXApIGFuZCByZS1lbWl0XG4gICAgLy8gZW1wdHkvb2xkIHVybHMsIGZhaWxpbmcgdG8gaGFuZCB0aGUgZGl2IG92ZXIgdG8gdGhlIG5ldyByZW5kZXJlci5cbiAgICBpZiAodGhpcy5pbWFnZUluZm8pIHtcbiAgICAgIHRoaXMuc3RhdGUuc2V0SW1hZ2VJbmZvKHRoaXMuaW1hZ2VJbmZvKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wbG90U2VydmljZS5yZWxvYWRBbmRQbG90KCk7XG4gICAgfVxuICB9XG4gIGNhbmNlbExvYWRpbmcoKSB7XG4gICAgLy8gU3RvcCBhbnkgaW4tZmxpZ2h0IGZyYW1lIHN0cmVhbWluZyAobmFwYXJpLWpzIHZvbHVtZS9zdXJmYWNlIHByZWxvYWQpIHNvIHRoZSBmZXRjaCBsb29wc1xuICAgIC8vIGFjdHVhbGx5IGFib3J0IOKAlCBjbGVhcmluZyB0aGUgZmxhZyBhbG9uZSBvbmx5IHJvdXRlZCB0byBQbG90bHkgYW5kIGxlZnQgbmFwYXJpIGZldGNoaW5nLlxuICAgIHRoaXMucGxvdFNlcnZpY2UuY2FuY2VsTG9hZGluZz8uKCk7XG4gICAgdGhpcy5zdGFja0xvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmltZ0xvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnN0YXRlLnNldEltYWdlTG9hZGluZyhmYWxzZSk7XG4gICAgdGhpcy56SW5kZXggPSAwO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0WkluZGV4KHRoaXMuekluZGV4KTtcbiAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFN0YWNrTG9hZGluZyhmYWxzZSk7XG4gIH1cblxuICBkb3dubG9hZEltYWdlKCkge1xuICAgIHRoaXMucGxvdFNlcnZpY2UuZG93bmxvYWRJbWFnZSgpO1xuICB9XG5cbiAgYXV0b3NjYWxlSW1hZ2UoKSB7XG4gICAgdGhpcy5wbG90U2VydmljZS5hdXRvc2NhbGUoKTtcbiAgfVxuXG4gIC8qKiBUb29sYmFyIHBpeGVsL3Ntb290aCB0b2dnbGU6IGZsaXAgc21vb3RoaW5nIGFuZCBhcHBseSB0byB0aGUgYWN0aXZlIGJhY2tlbmQuICovXG4gIG9uVG9nZ2xlSW1hZ2VTbW9vdGhpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSAhdGhpcy5pbWFnZVNtb290aGluZ0VuYWJsZWQ7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRJbWFnZVNtb290aGluZ0VuYWJsZWQodGhpcy5pbWFnZVNtb290aGluZ0VuYWJsZWQpO1xuICB9XG5cbiAgcmVzZXRBeGVzKCkge1xuICAgIHRoaXMucGxvdFNlcnZpY2UucmVzZXRBeGVzKCk7XG4gIH1cblxuICB0b2dnbGVEcmFnTW9kZShtb2RlOiBzdHJpbmcpIHtcbiAgICAvLyBUb2dnbGUgb2ZmIGlmIHRoZSBzYW1lIG1vZGUgaXMgcmUtc2VsZWN0ZWQuXG4gICAgdGhpcy5hY3RpdmVEcmFnTW9kZSA9IHRoaXMuYWN0aXZlRHJhZ01vZGUgPT09IG1vZGUgPyBudWxsIDogbW9kZTtcbiAgICBjb25zdCBhY3RpdmUgPSB0aGlzLmFjdGl2ZURyYWdNb2RlO1xuICAgIC8vIFJlY29yZCB0aGUgYXJtZWQgdG9vbCBpbiB0aGUgc2hhcmVkIHNlc3Npb24gc3RvcmUuXG4gICAgdGhpcy5zZXNzaW9uLnNldEFjdGl2ZVRvb2woYWN0aXZlKTtcblxuICAgIC8vIFJlZ2lvbiBkcmF3L3NlbGVjdCBydW4gdGhyb3VnaCB0aGUgcmVuZGVyZXIncyByZWdpb24gb3ZlcmxheS5cbiAgICB0aGlzLnBsb3RTZXJ2aWNlXG4gICAgICAuZ2V0UmVnaW9uT3ZlcmxheSgpXG4gICAgICA/LnNldE1vZGUodGhpcy5pc1JlZ2lvbk1vZGUoYWN0aXZlKSA/IChhY3RpdmUgYXMgUmVnaW9uVG9vbE1vZGUpIDogJ25vbmUnKTtcblxuICAgIC8vIFZpZXdwb3J0IGRyYWcgbW9kZXMgKHBhbi9ib3gtem9vbSkuIFJlZ2lvbiBtb2RlcyBvd24gdGhlIGRyYWcgbW9kZSB2aWFcbiAgICAvLyB0aGUgb3ZlcmxheSwgc28gZG9uJ3QgYWxzbyBzZXQgb25lIGhlcmUuXG4gICAgaWYgKCF0aGlzLmlzUmVnaW9uTW9kZShhY3RpdmUpKSB7XG4gICAgICBjb25zdCB2aWV3cG9ydERyYWcgPSBhY3RpdmUgPT09ICdwYW4nIHx8IGFjdGl2ZSA9PT0gJ3pvb20nO1xuICAgICAgdGhpcy5wbG90U2VydmljZS5zZXREcmFnTW9kZSh2aWV3cG9ydERyYWcgPyBhY3RpdmUgOiBmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gT24tY2FudmFzIHRvb2wgb3ZlcmxheXMuXG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRab29tVG9Cb3hNb2RlKGFjdGl2ZSA9PT0gJ3pvb21Ub0JveCcpO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0V2FuZE1vZGUoYWN0aXZlID09PSAnd2FuZCcsIHsgc2Vuc2l0aXZpdHk6IHRoaXMud2FuZFNlbnNpdGl2aXR5IH0pO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0QnJ1c2hNb2RlKGFjdGl2ZSA9PT0gJ2JydXNoJywgeyBzaXplOiB0aGlzLmJydXNoU2l6ZSB9KTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFNhbVBvaW50TW9kZShhY3RpdmUgPT09ICdzYW1Qb2ludCcpO1xuICAgIC8vIExlYXZpbmcgcG9pbnQgbW9kZSBkaXNtaXNzZXMgYW55IGxpbmdlcmluZyBzdGF0dXMgdG9hc3QuXG4gICAgaWYgKGFjdGl2ZSAhPT0gJ3NhbVBvaW50JykgdGhpcy5oaWRlU2FtVG9hc3QoKTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFZlcnRleEVyYXNlck1vZGUoYWN0aXZlID09PSAnZXJhc2VWZXJ0ZXgnKTtcbiAgICBpZiAoYWN0aXZlID09PSAnZXJhc2VWZXJ0ZXgnKSB7XG4gICAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFZlcnRleEVyYXNlclJhZGl1cyh0aGlzLnZlcnRleEVyYXNlclJhZGl1cyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlZ2lvbiBkcmF3L3NlbGVjdC9lZGl0IG1vZGVzIHJvdXRlZCB0aHJvdWdoIHRoZSByZWdpb24gb3ZlcmxheS4gVGhlXG4gICAqICBUaGUgdmVydGV4IHRvb2xzIChkcmF3cG9seWdvbi9hZGRwb2ludC9kZWxldGVwb2ludC9tb3ZlKSBhcmVcbiAgICogIGhhbmRsZWQgYnkgdGhlIE9wZW5TZWFkcmFnb24gb3ZlcmxheTsgUGxvdGx5J3Mgb3ZlcmxheSBtYXBzIHRoZW0gdG8gbm8tb3AuICovXG4gIHByaXZhdGUgaXNSZWdpb25Nb2RlKG1vZGU6IHN0cmluZyB8IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgbW9kZSA9PT0gJ2RyYXdyZWN0JyB8fFxuICAgICAgbW9kZSA9PT0gJ2RyYXdjbG9zZWRwYXRoJyB8fFxuICAgICAgbW9kZSA9PT0gJ2RyYXdvcGVucGF0aCcgfHxcbiAgICAgIG1vZGUgPT09ICdzZWxlY3QnIHx8XG4gICAgICBtb2RlID09PSAnZHJhd3BvbHlnb24nIHx8XG4gICAgICBtb2RlID09PSAnYWRkcG9pbnQnIHx8XG4gICAgICBtb2RlID09PSAnZGVsZXRlcG9pbnQnIHx8XG4gICAgICBtb2RlID09PSAnbW92ZSdcbiAgICApO1xuICB9XG5cbiAgLyoqIExpdmUtdXBkYXRlIHRoZSBpc29zdXJmYWNlIGFzIHRoZSByYW5nZSBzbGlkZXIgbW92ZXMuIFRoZSBjb250cm9sIGlzIG9ubHlcbiAgICogIGF2YWlsYWJsZSB3aGVuIHRoZSBhY3RpdmUgYmFja2VuZCByZW5kZXJzIGlzb3N1cmZhY2VzIChJU09TVVJGQUNFIG1vZGUpLiAqL1xuICBvbklzb1JhbmdlQ2hhbmdlKHZhbHVlczogbnVtYmVyW10gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIXZhbHVlcyB8fCB2YWx1ZXMubGVuZ3RoIDwgMikgcmV0dXJuO1xuICAgIHRoaXMuaXNvUmFuZ2UgPSB2YWx1ZXM7XG4gICAgdGhpcy5wbG90U2VydmljZS5nZXRJc29zdXJmYWNlQ29udHJvbHMoKT8uc2V0SXNvUmFuZ2UodmFsdWVzWzBdLCB2YWx1ZXNbMV0pO1xuICB9XG5cbiAgb25XYW5kU2Vuc2l0aXZpdHlDaGFuZ2UodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8ICFOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSByZXR1cm47XG4gICAgdGhpcy53YW5kU2Vuc2l0aXZpdHkgPSB2YWx1ZTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFdhbmRPcHRpb25zKHsgc2Vuc2l0aXZpdHk6IHZhbHVlIH0pO1xuICB9XG5cbiAgb25CcnVzaFNpemVDaGFuZ2UodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8ICFOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSByZXR1cm47XG4gICAgdGhpcy5icnVzaFNpemUgPSB2YWx1ZTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldEJydXNoT3B0aW9ucyh7IHNpemU6IHZhbHVlIH0pO1xuICB9XG5cbiAgb25WZXJ0ZXhFcmFzZXJSYWRpdXNDaGFuZ2UodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8ICFOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSByZXR1cm47XG4gICAgdGhpcy52ZXJ0ZXhFcmFzZXJSYWRpdXMgPSB2YWx1ZTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFZlcnRleEVyYXNlclJhZGl1cyh2YWx1ZSk7XG4gIH1cblxuICB6b29tSW4oKSB7XG4gICAgdGhpcy5wbG90U2VydmljZS56b29tSW4oKTtcbiAgfVxuXG4gIHpvb21PdXQoKSB7XG4gICAgdGhpcy5wbG90U2VydmljZS56b29tT3V0KCk7XG4gIH1cblxuICBkZWxldGVSZWdpb24oKSB7XG4gICAgdGhpcy5wbG90U2VydmljZS5kZWxldGVBY3RpdmVTaGFwZSgpO1xuICB9XG5cbiAgLyoqIFVuZG8gdGhlIG1vc3QgcmVjZW50IHJlZ2lvbiBhY3Rpb24gKGppdC11aSM4NSkuIFVwIHRvIDEwIHN0ZXBzIGJhY2suICovXG4gIHVuZG9SZWdpb24oKSB7XG4gICAgdGhpcy5wbG90U2VydmljZS51bmRvKCk7XG4gIH1cblxuICAvKiogUmVkbyB0aGUgbW9zdCByZWNlbnRseSB1bmRvbmUgcmVnaW9uIGFjdGlvbiAoaml0LXVpIzg1KS4gKi9cbiAgcmVkb1JlZ2lvbigpIHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnJlZG8oKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZWdpb24gc2V0LW9wZXJhdGlvbnMgb24gdGhlIGN1cnJlbnQgc2VsZWN0aW9uIChqaXQtdWkjODUpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBUaGUgY3VycmVudGx5LXNlbGVjdGVkIHJlZ2lvbnMgKGxpdmUgc3RvcmUgaW5zdGFuY2VzKS4gKi9cbiAgcHJpdmF0ZSBnZXQgc2VsZWN0ZWRSZWdpb25zKCk6IFJlZ2lvbltdIHtcbiAgICBjb25zdCBhbGwgPSB0aGlzLnBsb3RTZXJ2aWNlLmdldFJlZ2lvbnMoKTtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEluZGljZXNcbiAgICAgIC5tYXAoKGkpID0+IGFsbFtpXSlcbiAgICAgIC5maWx0ZXIoKHIpOiByIGlzIFJlZ2lvbiA9PiAhIXIpO1xuICB9XG5cbiAgLyoqIFJlZ2lvbnMgZWxpZ2libGUgZm9yIHNldC1vcHM6IGNsb3NlZCBhcmVhcyAocmVjdCAvIGNsb3NlZCBwb2x5Z29uIC9cbiAgICogIG11bHRpLXBvbHlnb24pLCBleGNsdWRpbmcgaW50ZW5zaXR5LXByb2ZpbGUgbGluZXMuICovXG4gIHByaXZhdGUgb3BFbGlnaWJsZShyZWdpb25zOiBSZWdpb25bXSk6IFJlZ2lvbltdIHtcbiAgICByZXR1cm4gcmVnaW9ucy5maWx0ZXIoKHIpID0+IHIua2luZCAhPT0gJ3Byb2ZpbGUnICYmIChcbiAgICAgIHIuYm91bmRzIGluc3RhbmNlb2YgUmVjdGFuZ2xlIHx8XG4gICAgICByLmJvdW5kcyBpbnN0YW5jZW9mIE11bHRpUG9seWdvbiB8fFxuICAgICAgKHIuYm91bmRzIGluc3RhbmNlb2YgUG9seWdvbiAmJiByLmJvdW5kcy5jbG9zZWQgIT09IGZhbHNlKVxuICAgICkpO1xuICB9XG5cbiAgLyoqIEltYWdlIHBpeGVsIGRpbWVuc2lvbnMgZm9yIHRoZSByYXN0ZXIgb3BzOyBmYWxscyBiYWNrIHRvIHRoZSBzZWxlY3Rpb24nc1xuICAgKiAgZXh0ZW50IHdoZW4gdGhlIGltYWdlIHNpemUgaXNuJ3Qga25vd24gKGtlZXBzIGNsYW1waW5nIHNhbmUpLiAqL1xuICBwcml2YXRlIG9wSW1hZ2VEaW1zKHJlZ2lvbnM6IFJlZ2lvbltdKTogeyB3OiBudW1iZXI7IGg6IG51bWJlciB9IHtcbiAgICBsZXQgW3csIGhdID0gdGhpcy5pbWFnZUluZm8/LnRydWVJbWFnZVNpemUgPz8gWzAsIDBdO1xuICAgIGlmICghKHcgPiAwKSB8fCAhKGggPiAwKSkge1xuICAgICAgbGV0IG1heFggPSAwLCBtYXhZID0gMDtcbiAgICAgIGNvbnN0IHNjYW4gPSAoeHM6IG51bWJlcltdLCB5czogbnVtYmVyW10pID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB4IG9mIHhzKSBtYXhYID0gTWF0aC5tYXgobWF4WCwgeCk7XG4gICAgICAgIGZvciAoY29uc3QgeSBvZiB5cykgbWF4WSA9IE1hdGgubWF4KG1heFksIHkpO1xuICAgICAgfTtcbiAgICAgIGZvciAoY29uc3QgciBvZiByZWdpb25zKSB7XG4gICAgICAgIGNvbnN0IGIgPSByLmJvdW5kcztcbiAgICAgICAgaWYgKGIgaW5zdGFuY2VvZiBSZWN0YW5nbGUpIHNjYW4oW2IueCArIGIud2lkdGhdLCBbYi55ICsgYi5oZWlnaHRdKTtcbiAgICAgICAgZWxzZSBpZiAoYiBpbnN0YW5jZW9mIFBvbHlnb24pIHNjYW4oYi54cG9pbnRzLCBiLnlwb2ludHMpO1xuICAgICAgICBlbHNlIGlmIChiIGluc3RhbmNlb2YgTXVsdGlQb2x5Z29uKSBmb3IgKGNvbnN0IHAgb2YgYi5wb2x5Z29ucykgc2NhbihwLnhwb2ludHMsIHAueXBvaW50cyk7XG4gICAgICB9XG4gICAgICB3ID0gTWF0aC5tYXgodywgTWF0aC5jZWlsKG1heFgpICsgMik7XG4gICAgICBoID0gTWF0aC5tYXgoaCwgTWF0aC5jZWlsKG1heFkpICsgMik7XG4gICAgfVxuICAgIHJldHVybiB7IHcsIGggfTtcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4g4omlMiBlbGlnaWJsZSByZWdpb25zIGFyZSBzZWxlY3RlZCAoTWVyZ2UgYXZhaWxhYmxlKS4gKi9cbiAgZ2V0IGNhbk1lcmdlUmVnaW9ucygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMub3BFbGlnaWJsZSh0aGlzLnNlbGVjdGVkUmVnaW9ucykubGVuZ3RoID49IDI7IH1cbiAgLyoqIFRydWUgd2hlbiBhbnkgc2VsZWN0ZWQgcmVnaW9uIGlzIG11bHRpLXBhcnQgKFVuZ3JvdXAgYXZhaWxhYmxlKS4gKi9cbiAgZ2V0IGNhblVuZ3JvdXBSZWdpb25zKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5zZWxlY3RlZFJlZ2lvbnMuc29tZSgocikgPT4gdGhpcy5yZWdpb25PcHMuY2FuVW5ncm91cChyKSk7IH1cbiAgLyoqIFRydWUgd2hlbiDiiaUxIGVsaWdpYmxlIHJlZ2lvbiBpcyBzZWxlY3RlZCAoSW52ZXJzZSAvIFNpbXBsaWZ5IGF2YWlsYWJsZSkuICovXG4gIGdldCBoYXNFbGlnaWJsZVNlbGVjdGlvbigpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMub3BFbGlnaWJsZSh0aGlzLnNlbGVjdGVkUmVnaW9ucykubGVuZ3RoID49IDE7IH1cblxuICAvKiogU2VsZWN0IGV2ZXJ5IHJlZ2lvbiBvbiB0aGUgaW1hZ2UgKGV4Y2x1ZGVzIGludGVuc2l0eS1wcm9maWxlIGxpbmVzKS4gKi9cbiAgc2VsZWN0QWxsUmVnaW9ucygpOiB2b2lkIHtcbiAgICBjb25zdCBhbGwgPSB0aGlzLnBsb3RTZXJ2aWNlLmdldFJlZ2lvbnMoKTtcbiAgICBjb25zdCBpbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuICAgIGFsbC5mb3JFYWNoKChyLCBpKSA9PiB7IGlmIChyLmtpbmQgIT09ICdwcm9maWxlJykgaW5kaWNlcy5wdXNoKGkpOyB9KTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKGluZGljZXMpO1xuICB9XG5cbiAgLyoqIE1lcmdlIHRoZSBzZWxlY3RlZCByZWdpb25zIGludG8gYSBzaW5nbGUgKHBvc3NpYmx5IG11bHRpLXBhcnQpIHJlZ2lvbi4gKi9cbiAgbWVyZ2VSZWdpb25zKCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbCA9IHRoaXMub3BFbGlnaWJsZSh0aGlzLnNlbGVjdGVkUmVnaW9ucyk7XG4gICAgaWYgKHNlbC5sZW5ndGggPCAyKSByZXR1cm47XG4gICAgY29uc3QgeyB3LCBoIH0gPSB0aGlzLm9wSW1hZ2VEaW1zKHNlbCk7XG4gICAgY29uc3QgbWVyZ2VkID0gdGhpcy5yZWdpb25PcHMubWVyZ2Uoc2VsLCB3LCBoKTtcbiAgICBpZiAobWVyZ2VkKSB0aGlzLnJlcGxhY2VSZWdpb25zKHNlbCwgW21lcmdlZF0pO1xuICB9XG5cbiAgLyoqIFNwbGl0IGVhY2ggc2VsZWN0ZWQgbXVsdGktcGFydCByZWdpb24gaW50byBvbmUgcmVnaW9uIHBlciBwYXJ0LiAqL1xuICB1bmdyb3VwUmVnaW9ucygpOiB2b2lkIHtcbiAgICBjb25zdCBzZWwgPSB0aGlzLnNlbGVjdGVkUmVnaW9ucy5maWx0ZXIoKHIpID0+IHRoaXMucmVnaW9uT3BzLmNhblVuZ3JvdXAocikpO1xuICAgIGlmIChzZWwubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgY29uc3QgcmVzdWx0czogUmVnaW9uW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHIgb2Ygc2VsKSByZXN1bHRzLnB1c2goLi4udGhpcy5yZWdpb25PcHMudW5ncm91cChyKSk7XG4gICAgdGhpcy5yZXBsYWNlUmVnaW9ucyhzZWwsIHJlc3VsdHMpO1xuICB9XG5cbiAgLyoqIFJlcGxhY2UgdGhlIHNlbGVjdGlvbiB3aXRoIGl0cyBpbnZlcnNlIGluc2lkZSB0aGUgaW1hZ2UgcmVjdGFuZ2xlLiAqL1xuICBpbnZlcnNlUmVnaW9ucygpOiB2b2lkIHtcbiAgICBjb25zdCBzZWwgPSB0aGlzLm9wRWxpZ2libGUodGhpcy5zZWxlY3RlZFJlZ2lvbnMpO1xuICAgIGlmIChzZWwubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgY29uc3QgeyB3LCBoIH0gPSB0aGlzLm9wSW1hZ2VEaW1zKHNlbCk7XG4gICAgY29uc3QgaW52ID0gdGhpcy5yZWdpb25PcHMuaW52ZXJzZShzZWwsIHcsIGgpO1xuICAgIGlmICghaW52KSB7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgIGtleTogdGhpcy5yZXN1bHRUb2FzdEtleSxcbiAgICAgICAgc2V2ZXJpdHk6ICd3YXJuJywgc3VtbWFyeTogJ0ludmVyc2UnLFxuICAgICAgICBkZXRhaWw6ICdOb3RoaW5nIHRvIGludmVydCDigJQgc2VsZWN0IG9uZSBvciBtb3JlIGNsb3NlZCByZWdpb25zIGZpcnN0LicsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZXBsYWNlUmVnaW9ucyhzZWwsIFtpbnZdKTtcbiAgfVxuXG4gIC8qKiBEb3VnbGFz4oCTUGV1Y2tlciBzaW1wbGlmeSBlYWNoIHNlbGVjdGVkIHJlZ2lvbiBieSBgdGhyZXNob2xkUHhgLiAqL1xuICBzaW1wbGlmeVJlZ2lvbnModGhyZXNob2xkUHg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHNlbCA9IHRoaXMub3BFbGlnaWJsZSh0aGlzLnNlbGVjdGVkUmVnaW9ucyk7XG4gICAgaWYgKHNlbC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLnJlcGxhY2VSZWdpb25zKHNlbCwgc2VsLm1hcCgocikgPT4gdGhpcy5yZWdpb25PcHMuc2ltcGxpZnkociwgdGhyZXNob2xkUHgpKSk7XG4gICAgdGhpcy5kaXNwbGF5U2ltcGxpZnlEaWFsb2cgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKiBPcGVuIHRoZSBjdXN0b20tdGhyZXNob2xkIHNpbXBsaWZ5IGRpYWxvZy4gKi9cbiAgb3BlblNpbXBsaWZ5RGlhbG9nKCk6IHZvaWQgeyB0aGlzLmRpc3BsYXlTaW1wbGlmeURpYWxvZyA9IHRydWU7IH1cblxuICAvKipcbiAgICogQ29tbWl0IGEgc2V0LW9wOiBkcm9wIHRoZSBgcmVtb3ZlYCByZWdpb25zLCBhcHBlbmQgYGFkZGAsIGFuZCBzZWxlY3QgdGhlXG4gICAqIHJlc3VsdHMuIEdvZXMgdGhyb3VnaCBzZXRSZWdpb25zIHNvIGl0J3MgdW5kby10cmFja2VkIGFuZCByZS1yZW5kZXJlZDtcbiAgICogcHJvZmlsZSBsaW5lcyBhbmQgdW5zZWxlY3RlZCByZWdpb25zIGFyZSBwcmVzZXJ2ZWQuXG4gICAqL1xuICBwcml2YXRlIHJlcGxhY2VSZWdpb25zKHJlbW92ZTogUmVnaW9uW10sIGFkZDogUmVnaW9uW10pOiB2b2lkIHtcbiAgICBpZiAoYWRkLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IHJlbW92ZVNldCA9IG5ldyBTZXQocmVtb3ZlKTtcbiAgICBjb25zdCBrZXB0ID0gdGhpcy5wbG90U2VydmljZS5nZXRSZWdpb25zKCkuZmlsdGVyKChyKSA9PiAhcmVtb3ZlU2V0LmhhcyhyKSk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRSZWdpb25zKFsuLi5rZXB0LCAuLi5hZGRdKTsgLy8gbWludHMgaWRzIG9uIGBhZGRgLCByZWNvcmRzIHVuZG9cbiAgICBjb25zdCBzdG9yZWQgPSB0aGlzLnBsb3RTZXJ2aWNlLmdldFJlZ2lvbnMoKTtcbiAgICBjb25zdCBzZWwgPSBhZGQubWFwKChyKSA9PiBzdG9yZWQuaW5kZXhPZihyKSkuZmlsdGVyKChpKSA9PiBpID49IDApO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoc2VsKTtcbiAgfVxuXG4gIC8qKiBCb3gtcHJvbXB0ZWQgU0FNIHNlZ21lbnRhdGlvbiBvZiB0aGUgZHJhd24gcmVjdGFuZ2xlcyAoaml0LXVpIzkwKS4gQSBzdGlja3lcbiAgICogIGBzYW1gIHRvYXN0IHNob3dzIGxpdmUgc3RhdHVzICsgYSBkb3dubG9hZCBwcm9ncmVzcyBiYXIgKGZpcnN0IHJ1biBwdWxscyB0aGVcbiAgICogIGVuY29kZXIsIH4xNzAgTUIpOyBpdCBzdGF5cyBvcGVuIHVudGlsIHRoZSBydW4gZmluaXNoZXMgKGJhciBoaXRzIDEwMCUpLiAqL1xuICBhc3luYyBzZWdtZW50UmVnaW9ucygpIHtcbiAgICBhd2FpdCB0aGlzLnJ1blNlZ21lbnRXaXRoVG9hc3QoJ1NBTScsIHRoaXMuc2FtVG9vbCwgKCkgPT4gdGhpcy5wbG90U2VydmljZS5zZWdtZW50UmVjdGFuZ2xlcygpKTtcbiAgfVxuXG4gIC8qKiBBdXRvLXNlZ21lbnQgY2VsbHMgaW5zaWRlIGVhY2ggZHJhd24gcmVjdGFuZ2xlIHdpdGggY2VsbHBvc2UtU0FNLCBjbGllbnQtc2lkZVxuICAgKiAgKGppdC11aSM5MCkuIEVhY2ggYm94IGlzIGNyb3BwZWQgKGJyb3dzZXIgc2xpZGUtY3JvcCkgdGhlbiBydW4gdGhyb3VnaCB0aGVcbiAgICogIGNlbGxwb3NlLWpzIG1vZGVsOyB0aGUgc2FtZSBzdGlja3kgYHNhbWAgdG9hc3QgKyBwcm9ncmVzcyBiYXIgaXMgcmV1c2VkLiAqL1xuICBhc3luYyBzZWdtZW50Q2VsbHBvc2UoKSB7XG4gICAgYXdhaXQgdGhpcy5ydW5TZWdtZW50V2l0aFRvYXN0KCdDZWxscG9zZScsIHRoaXMuY2VsbFNlZ21lbnRUb29sLCAoKSA9PlxuICAgICAgdGhpcy5wbG90U2VydmljZS5zZWdtZW50UmVjdGFuZ2xlc0NlbGxwb3NlKCksXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBQZXItbW9kZWwgZGVmYXVsdHMgZnJvbSB0aGUgcmVnaXN0cnkg4oCUIHdoYXQgdGhlIGNoZWNrcG9pbnQgd2FzIHRyYWluZWQgZm9yLiAqL1xuICBwcml2YXRlIGRlZmF1bHRZb2xvUGFyYW1zKCk6IEluc3RhbmNlU2VnbWVudE9wdGlvbnMge1xuICAgIGNvbnN0IGRlZiA9IFlPTE9fTU9ERUxTLmZpbmQoKG0pID0+IG0uaWQgPT09IGdldERlZmF1bHRZb2xvTW9kZWxJZCgpKSA/PyBZT0xPX01PREVMU1swXTtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kZWxJZDogZGVmPy5pZCxcbiAgICAgIGNvbmZpZGVuY2U6IGRlZj8uZGVmYXVsdHMuY29uZmlkZW5jZSA/PyAwLjYsXG4gICAgICBpb3VUaHJlc2hvbGQ6IGRlZj8uZGVmYXVsdHMuaW91VGhyZXNob2xkID8/IDAuNSxcbiAgICAgIG1lcmdlVGhyZXNob2xkOiBkZWY/LmRlZmF1bHRzLm1lcmdlVGhyZXNob2xkID8/IDAuMyxcbiAgICAgIG92ZXJsYXBYOiBkZWY/LmRlZmF1bHRzLm92ZXJsYXBYID8/IDAsXG4gICAgICBvdmVybGFwWTogZGVmPy5kZWZhdWx0cy5vdmVybGFwWSA/PyAwLFxuICAgICAgLy8gRXhwb3NlZCBpbiB0aGUgZGlhbG9nLCBzbyBpdCBtdXN0IGJlIHNlZWRlZCDigJQgb3RoZXJ3aXNlIHRoZSBzY2FsZVxuICAgICAgLy8gY29udHJvbCByZWFkcyBhcyAwIGFuZCB0aGUgcmUtY3JvcCBuZXZlciBydW5zLlxuICAgICAgZG93bnNhbXBsaW5nRmFjdG9yOiA1LFxuICAgICAgd2l0aE1hc2tzOiB0cnVlLFxuICAgICAgc2ltcGxpZnlUb2xlcmFuY2U6IDEsXG4gICAgICBtaW5BcmVhOiAwLFxuICAgIH07XG4gIH1cblxuICAvKiogU3dpdGNoaW5nIGNoZWNrcG9pbnQgcmUtc2VlZHMgdGhlIHBhcmFtZXRlcnMsIHNpbmNlIHRoZSBkZWZhdWx0cyBiZWxvbmcgdG9cbiAgICogIHRoZSBtb2RlbCByYXRoZXIgdGhhbiB0byB0aGUgdG9vbC4gKi9cbiAgb25Zb2xvTW9kZWxDaGFuZ2UoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMueW9sb01vZGVsSWQgPSBpZDtcbiAgICBzZXREZWZhdWx0WW9sb01vZGVsKGlkKTtcbiAgICB0aGlzLnlvbG9QYXJhbXMgPSB7IC4uLnRoaXMuZGVmYXVsdFlvbG9QYXJhbXMoKSwgbW9kZWxJZDogaWQgfTtcbiAgfVxuXG4gIG9wZW5Zb2xvUGFyYW1zKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd1lvbG9QYXJhbXMgPSB0cnVlO1xuICB9XG5cbiAgcmVzZXRZb2xvUGFyYW1zKCk6IHZvaWQge1xuICAgIHRoaXMueW9sb1BhcmFtcyA9IHsgLi4udGhpcy5kZWZhdWx0WW9sb1BhcmFtcygpLCBtb2RlbElkOiB0aGlzLnlvbG9Nb2RlbElkIH07XG4gIH1cblxuICAvKiogRGV0ZWN0IG9iamVjdHMgYWNyb3NzIHRoZSBjdXJyZW50IHZpZXcuIE5vIHByb21wdDogYSBkZXRlY3RvciBmaW5kcyBvYmplY3RzXG4gICAqICBpbiBhIGZpZWxkIHJhdGhlciB0aGFuIGJlaW5nIHBvaW50ZWQgYXQgb25lLiBSZXVzZXMgdGhlIHNoYXJlZCBzZWdtZW50YXRpb25cbiAgICogIHRvYXN0IHNvIHByb2dyZXNzIGFuZCBzdGF0dXMgcmVhZCB0aGUgc2FtZSBhcyB0aGUgU0FNL2NlbGxwb3NlIHRvb2xzLiAqL1xuICBhc3luYyBkZXRlY3RZb2xvKCkge1xuICAgIGF3YWl0IHRoaXMucnVuU2VnbWVudFdpdGhUb2FzdCgnWU9MTycsIHRoaXMueW9sb0RldGVjdFRvb2wsICgpID0+XG4gICAgICB0aGlzLnlvbG9EZXRlY3RUb29sLmRldGVjdEluVmlldyh0aGlzLnBsb3RTZXJ2aWNlLCB0aGlzLmluc3RhbmNlU2VnbWVudGVyLCB7XG4gICAgICAgIC4uLnRoaXMueW9sb1BhcmFtcyxcbiAgICAgICAgbW9kZWxJZDogdGhpcy55b2xvTW9kZWxJZCxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvKiogU2hhcmVkIGRyaXZlciBmb3IgdGhlIGJveC1wcm9tcHQgc2VnbWVudCB0b29sczogd2lyZXMgdGhlIHRvb2wncyBzdGF0dXMgK1xuICAgKiAgZG93bmxvYWQgcHJvZ3Jlc3MgaW50byB0aGUgc3RpY2t5IGBzYW1gIHRvYXN0LCBydW5zIGBvcGAsIGFuZCByZXBvcnRzIHRoZVxuICAgKiAgcmVnaW9uIGNvdW50LiBLZWVwcyB0aGUgdG9hc3Qgb3BlbiB1bnRpbCB0aGUgcnVuIHNldHRsZXMgKGJhciBoaXRzIDEwMCUpLiAqL1xuICBwcml2YXRlIGFzeW5jIHJ1blNlZ21lbnRXaXRoVG9hc3QoXG4gICAgbGFiZWw6IHN0cmluZyxcbiAgICB0b29sOiB7IHN0YXR1cyQ6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+OyBwcm9ncmVzcyQ6IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+IH0sXG4gICAgb3A6ICgpID0+IFByb21pc2U8bnVtYmVyPixcbiAgKSB7XG4gICAgdGhpcy5zYW1TdGF0dXMgPSAnU3RhcnRpbmfigKYnO1xuICAgIHRoaXMuc2FtUHJvZ3Jlc3MgPSAwO1xuICAgIHRoaXMuc2FtRG93bmxvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnNhbUJ1c3kgPSB0cnVlO1xuICAgIGNvbnN0IHBzdWIgPSB0b29sLnByb2dyZXNzJC5zdWJzY3JpYmUoKGYpID0+IHtcbiAgICAgIHRoaXMuc2FtRG93bmxvYWRpbmcgPSBmID49IDAgJiYgZiA8IDE7XG4gICAgICBpZiAoZiA+PSAwKSB0aGlzLnNhbVByb2dyZXNzID0gTWF0aC5taW4oMTAwLCBNYXRoLnJvdW5kKGYgKiAxMDApKTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9KTtcbiAgICBjb25zdCBzc3ViID0gdG9vbC5zdGF0dXMkLnN1YnNjcmliZSgobSkgPT4ge1xuICAgICAgaWYgKG0pIHtcbiAgICAgICAgdGhpcy5zYW1TdGF0dXMgPSBtO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5zaG93U2FtVG9hc3QobGFiZWwpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBuID0gYXdhaXQgb3AoKTtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAga2V5OiB0aGlzLnJlc3VsdFRvYXN0S2V5LFxuICAgICAgICBzZXZlcml0eTogbiA+IDAgPyAnc3VjY2VzcycgOiAnd2FybicsXG4gICAgICAgIHN1bW1hcnk6IGxhYmVsLFxuICAgICAgICBkZXRhaWw6IHRvb2wuc3RhdHVzJC52YWx1ZSB8fCAobiA+IDAgPyBgQWRkZWQgJHtufSByZWdpb24ocykuYCA6ICdObyByZWdpb25zIGFkZGVkLicpLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICBrZXk6IHRoaXMucmVzdWx0VG9hc3RLZXksXG4gICAgICAgIHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiBgJHtsYWJlbH0gZmFpbGVkYCwgZGV0YWlsOiBTdHJpbmcoZSksXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcHN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgc3N1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5oaWRlU2FtVG9hc3QoKTtcbiAgICB9XG4gIH1cblxuICAvKiogU2hvdyB0aGUgc2hhcmVkIHN0aWNreSBgc2FtYCB0b2FzdCBvbmNlIChpZGVtcG90ZW50IOKAlCByZS1hZGRpbmcgd291bGQgc3RhY2tcbiAgICogIGEgbmV3IHRvYXN0IG9uIGV2ZXJ5IHBvaW50IGNsaWNrKS4gKi9cbiAgcHJpdmF0ZSBzaG93U2FtVG9hc3Qoc3VtbWFyeTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2FtVG9hc3RTaG93bikgcmV0dXJuO1xuICAgIHRoaXMuc2FtVG9hc3RTaG93biA9IHRydWU7XG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBrZXk6IHRoaXMuc2FtVG9hc3RLZXksIHN0aWNreTogdHJ1ZSwgc2V2ZXJpdHk6ICdpbmZvJywgc3VtbWFyeSB9KTtcbiAgfVxuXG4gIC8qKiBEaXNtaXNzIHRoZSBzaGFyZWQgYHNhbWAgdG9hc3QgYW5kIHJlc2V0IGl0cyBwcm9ncmVzcy9zcGlubmVyIHN0YXRlLiAqL1xuICBwcml2YXRlIGhpZGVTYW1Ub2FzdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNhbVRvYXN0U2hvd24gPSBmYWxzZTtcbiAgICB0aGlzLnNhbUJ1c3kgPSBmYWxzZTtcbiAgICB0aGlzLnNhbURvd25sb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5zYW1Qcm9ncmVzcyA9IDA7XG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5jbGVhcih0aGlzLnNhbVRvYXN0S2V5KTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKiogUGljayB0aGUgU0FNIG1vZGVsIHRoZSBzZWdtZW50IHRvb2xzIHVzZSAoaml0LXVpIzkwIFAxKS4gKi9cbiAgb25TYW1Nb2RlbENoYW5nZShpZDogc3RyaW5nKSB7XG4gICAgdGhpcy5zYW1Nb2RlbElkID0gaWQ7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRTYW1Nb2RlbChpZCk7XG4gIH1cblxuICAvKiogQ29udmVydCB0aGUgc2VsZWN0ZWQgcmVnaW9uIHRvIGEgc21vb3RoIGJlemllciBjdXJ2ZS4gKi9cbiAgdG9CZXppZXJSZWdpb24oKSB7XG4gICAgdGhpcy5wbG90U2VydmljZS5nZXRSZWdpb25PdmVybGF5KCk/LnNldFNlbGVjdGVkQmV6aWVyKHRydWUpO1xuICB9XG5cbiAgLyoqIENvbnZlcnQgdGhlIHNlbGVjdGVkIHJlZ2lvbiBiYWNrIHRvIGEgc3RyYWlnaHQtZWRnZWQgcG9seWdvbi4gKi9cbiAgdG9Qb2x5Z29uUmVnaW9uKCkge1xuICAgIHRoaXMucGxvdFNlcnZpY2UuZ2V0UmVnaW9uT3ZlcmxheSgpPy5zZXRTZWxlY3RlZEJlemllcihmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogSW1tZWRpYXRlIHJlZ2lvbiBhY3Rpb25zIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbiAoaml0LXVpIzg1KTogbWVyZ2UsXG4gICAqIHVuZ3JvdXAsIGludmVyc2UsIHNpbXBsaWZ5LCB0aGUgQsOpemllciBjb252ZXJzaW9ucywgYW5kIGRlbGV0ZSDigJQgdGhlXG4gICAqIG9uZS1zaG90IGdlb21ldHJ5IHRyYW5zZm9ybXMsIGdyb3VwZWQgYXBhcnQgZnJvbSB0aGUgdG9vbC9tb2RlIHRvZ2dsZXMgYW5kXG4gICAqIHNob3duIG9ubHkgd2hlbiBzb21ldGhpbmcgaXMgc2VsZWN0ZWQuIEVhY2ggaXRlbSBpcyBnYXRlZCBvbiB3aGF0IHRoZVxuICAgKiBzZWxlY3Rpb24gc3VwcG9ydHMuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkUmVnaW9uQWN0aW9uSXRlbXMoKTogTWVudUl0ZW1bXSB7XG4gICAgY29uc3QgYWxsID0gdGhpcy5wbG90U2VydmljZS5nZXRSZWdpb25zKCk7XG4gICAgY29uc3Qgc2VsZWN0YWJsZSA9IGFsbC5maWx0ZXIoKHIpID0+IHIua2luZCAhPT0gJ3Byb2ZpbGUnKTtcbiAgICBpZiAoc2VsZWN0YWJsZS5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICBjb25zdCBpdGVtczogTWVudUl0ZW1bXSA9IFtdO1xuXG4gICAgLy8gU2VsZWN0IGFsbCDigJQgYXZhaWxhYmxlIHdoZW5ldmVyIHRoZSBpbWFnZSBoYXMgcmVnaW9ucywgcmVnYXJkbGVzcyBvZiB0aGVcbiAgICAvLyBjdXJyZW50IHNlbGVjdGlvbi5cbiAgICBpdGVtcy5wdXNoKHtcbiAgICAgIGxhYmVsOiAnU2VsZWN0IGFsbCByZWdpb25zJywgaWNvbjogJ3BpIHBpLWNoZWNrLXNxdWFyZScsXG4gICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnNlbGVjdEFsbFJlZ2lvbnMoKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHNlbEFsbCA9IHRoaXMuc2VsZWN0ZWRSZWdpb25zO1xuICAgIGlmIChzZWxBbGwubGVuZ3RoID09PSAwKSByZXR1cm4gaXRlbXM7XG4gICAgY29uc3QgZWxpZ2libGUgPSB0aGlzLm9wRWxpZ2libGUoc2VsQWxsKTtcblxuICAgIGlmIChlbGlnaWJsZS5sZW5ndGggPj0gMikge1xuICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnTWVyZ2UgLyBncm91cCcsIGljb246ICdwaSBwaS1saW5rJywgY29tbWFuZDogKCkgPT4gdGhpcy5tZXJnZVJlZ2lvbnMoKSB9KTtcbiAgICB9XG4gICAgaWYgKHNlbEFsbC5zb21lKChyKSA9PiB0aGlzLnJlZ2lvbk9wcy5jYW5Vbmdyb3VwKHIpKSkge1xuICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnVW5ncm91cCcsIGljb246ICdwaSBwaS1zaXRlbWFwJywgY29tbWFuZDogKCkgPT4gdGhpcy51bmdyb3VwUmVnaW9ucygpIH0pO1xuICAgIH1cbiAgICBpZiAoZWxpZ2libGUubGVuZ3RoID49IDEpIHtcbiAgICAgIGl0ZW1zLnB1c2goXG4gICAgICAgIHsgbGFiZWw6ICdJbnZlcnNlJywgaWNvbjogJ3BpIHBpLWNsb25lJywgY29tbWFuZDogKCkgPT4gdGhpcy5pbnZlcnNlUmVnaW9ucygpIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1NpbXBsaWZ5JywgaWNvbjogJ3BpIHBpLWNoYXJ0LWxpbmUnLFxuICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICB7IGxhYmVsOiAnTGlnaHQgKDEgcHgpJywgY29tbWFuZDogKCkgPT4gdGhpcy5zaW1wbGlmeVJlZ2lvbnMoMSkgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdNZWRpdW0gKDMgcHgpJywgY29tbWFuZDogKCkgPT4gdGhpcy5zaW1wbGlmeVJlZ2lvbnMoMykgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdTdHJvbmcgKDggcHgpJywgY29tbWFuZDogKCkgPT4gdGhpcy5zaW1wbGlmeVJlZ2lvbnMoOCkgfSxcbiAgICAgICAgICAgIHsgc2VwYXJhdG9yOiB0cnVlIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnQ3VzdG9t4oCmJywgY29tbWFuZDogKCkgPT4gdGhpcy5vcGVuU2ltcGxpZnlEaWFsb2coKSB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBCw6l6aWVyIGNvbnZlcnNpb25zIGFyZSB2ZXJ0ZXgtbGV2ZWwgZWRpdHMg4oCUIEltYWdlIChPcGVuU2VhZHJhZ29uKSB2aWV3XG4gICAgLy8gb25seSDigJQgZ2F0ZWQgb24gdGhlIHNlbGVjdGlvbidzIGN1cnJlbnQgZm9ybS5cbiAgICBpZiAodGhpcy5zZWxlY3RlZFBsb3RUeXBlID09PSBQbG90VHlwZS5JTUFHRSkge1xuICAgICAgY29uc3QgaGFzU3RyYWlnaHQgPSBzZWxBbGwuc29tZSgocikgPT5cbiAgICAgICAgKHIuYm91bmRzIGluc3RhbmNlb2YgUG9seWdvbiAmJiAhci5ib3VuZHMuYmV6aWVyKSB8fCByLmJvdW5kcyBpbnN0YW5jZW9mIFJlY3RhbmdsZSk7XG4gICAgICBjb25zdCBoYXNCZXppZXIgPSBzZWxBbGwuc29tZSgocikgPT4gci5ib3VuZHMgaW5zdGFuY2VvZiBQb2x5Z29uICYmIHIuYm91bmRzLmJlemllcik7XG4gICAgICBpZiAoaGFzU3RyYWlnaHQpIHtcbiAgICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnQ29udmVydCB0byBCw6l6aWVyJywgaWNvbjogJ3RvLWJlemllci1pY29uJywgY29tbWFuZDogKCkgPT4gdGhpcy50b0JlemllclJlZ2lvbigpIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGhhc0Jlemllcikge1xuICAgICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6ICdDb252ZXJ0IHRvIHBvbHlnb24nLCBpY29uOiAndG8tcG9seWdvbi1pY29uJywgY29tbWFuZDogKCkgPT4gdGhpcy50b1BvbHlnb25SZWdpb24oKSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnRGVsZXRlIHJlZ2lvbicsIGljb246ICdwaSBwaS10cmFzaCcsIGNvbW1hbmQ6ICgpID0+IHRoaXMuZGVsZXRlUmVnaW9uKCkgfSk7XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZENvbnRleHRNZW51SXRlbXMoKTogTWVudUl0ZW1bXSB7XG4gICAgY29uc3QgYWN0aXZlID0gdGhpcy5hY3RpdmVEcmFnTW9kZTtcbiAgICBjb25zdCBhY3RpdmVDbGFzcyA9ICdjb250ZXh0LW1lbnUtYWN0aXZlJztcbiAgICBjb25zdCBpdGVtczogTWVudUl0ZW1bXSA9IFtdO1xuICAgIC8vIFNlbGVjdGVkLXJlZ2lvbiBhY3Rpb25zIGxlYWQgdGhlIG1lbnUgKHNlcGFyYXRlZCBmcm9tIHRoZSB0b29sIHRvZ2dsZXMpLlxuICAgIGlmICh0aGlzLmlzSGVhdG1hcCkge1xuICAgICAgY29uc3QgYWN0aW9ucyA9IHRoaXMuYnVpbGRSZWdpb25BY3Rpb25JdGVtcygpO1xuICAgICAgaWYgKGFjdGlvbnMubGVuZ3RoKSBpdGVtcy5wdXNoKC4uLmFjdGlvbnMsIHsgc2VwYXJhdG9yOiB0cnVlIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0hlYXRtYXApIHtcbiAgICAgIGl0ZW1zLnB1c2goXG4gICAgICAgIHsgbGFiZWw6ICdBdXRvc2NhbGUnLCBpY29uOiAncGkgcGktd2luZG93LW1heGltaXplJywgY29tbWFuZDogKCkgPT4gdGhpcy5hdXRvc2NhbGVJbWFnZSgpIH0sXG4gICAgICAgIHsgc2VwYXJhdG9yOiB0cnVlIH0sXG4gICAgICApO1xuICAgICAgLy8gJ1pvb20gc2VsZWN0aW9uJyBpcyBQbG90bHkncyBydWJiZXItYmFuZCB6b29tOyBpdCBkb2Vzbid0IGFwcGx5IHRvIHRoZVxuICAgICAgLy8gT3BlblNlYWRyYWdvbi1iYWNrZWQgSW1hZ2UgdmlldyAodXNlICdab29tIHRvIGJveCcgdGhlcmUgaW5zdGVhZCkuXG4gICAgICBpZiAoIXRoaXMuaXNJbWFnZVZpZXcpIHtcbiAgICAgICAgaXRlbXMucHVzaCh7XG4gICAgICAgICAgbGFiZWw6ICdab29tIHNlbGVjdGlvbicsXG4gICAgICAgICAgaWNvbjogJ3BpIHBpLXNlYXJjaCcsXG4gICAgICAgICAgc3R5bGVDbGFzczogYWN0aXZlID09PSAnem9vbScgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ3pvb20nKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgbGFiZWw6ICdab29tIHRvIGJveCcsXG4gICAgICAgIGljb246ICd6b29tLWJveC1vZmYtaWNvbicsXG4gICAgICAgIHN0eWxlQ2xhc3M6IGFjdGl2ZSA9PT0gJ3pvb21Ub0JveCcgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCd6b29tVG9Cb3gnKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0hlYXRtYXApIHtcbiAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICBsYWJlbDogJ1BhbicsXG4gICAgICAgIGljb246ICdwaSBwaS1hcnJvd3MtYWx0JyxcbiAgICAgICAgc3R5bGVDbGFzczogYWN0aXZlID09PSAncGFuJyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ3BhbicpLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHMzZCA9IHRoaXMuYWN0aXZlU3VyZmFjZTNkTW9kZTtcbiAgICAgIGl0ZW1zLnB1c2goXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1pvb20nLFxuICAgICAgICAgIGljb246ICdwaSBwaS1zZWFyY2gnLFxuICAgICAgICAgIHN0eWxlQ2xhc3M6IHMzZCA9PT0gJ3pvb20nID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZVN1cmZhY2UzZE1vZGUoJ3pvb20nKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnUGFuJyxcbiAgICAgICAgICBpY29uOiAncGkgcGktYXJyb3dzLWFsdCcsXG4gICAgICAgICAgc3R5bGVDbGFzczogczNkID09PSAncGFuJyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVTdXJmYWNlM2RNb2RlKCdwYW4nKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnT3JiaXRhbCByb3RhdGlvbicsXG4gICAgICAgICAgaWNvbjogJ3BpIHBpLWdsb2JlJyxcbiAgICAgICAgICBzdHlsZUNsYXNzOiBzM2QgPT09ICdvcmJpdCcgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlU3VyZmFjZTNkTW9kZSgnb3JiaXQnKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnVHVybnRhYmxlIHJvdGF0aW9uJyxcbiAgICAgICAgICBpY29uOiAncGkgcGktc3luYycsXG4gICAgICAgICAgc3R5bGVDbGFzczogczNkID09PSAndHVybnRhYmxlJyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVTdXJmYWNlM2RNb2RlKCd0dXJudGFibGUnKSxcbiAgICAgICAgfSxcbiAgICAgICAgeyBzZXBhcmF0b3I6IHRydWUgfSxcbiAgICAgICAgeyBsYWJlbDogJ1Jlc2V0IGNhbWVyYScsIGljb246ICdwaSBwaS1ob21lJywgY29tbWFuZDogKCkgPT4gdGhpcy5yZXNldFN1cmZhY2VDYW1lcmEoKSB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNIZWF0bWFwKSB7XG4gICAgICBpdGVtcy5wdXNoKFxuICAgICAgICB7IGxhYmVsOiAnWm9vbSBpbicsIGljb246ICdwaSBwaS1zZWFyY2gtcGx1cycsIGNvbW1hbmQ6ICgpID0+IHRoaXMuem9vbUluKCkgfSxcbiAgICAgICAgeyBsYWJlbDogJ1pvb20gb3V0JywgaWNvbjogJ3BpIHBpLXNlYXJjaC1taW51cycsIGNvbW1hbmQ6ICgpID0+IHRoaXMuem9vbU91dCgpIH0sXG4gICAgICAgIHsgc2VwYXJhdG9yOiB0cnVlIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1NlbGVjdCcsXG4gICAgICAgICAgaWNvbjogJ3BpIHBpLWFycm93LXVwLXJpZ2h0JyxcbiAgICAgICAgICBzdHlsZUNsYXNzOiBhY3RpdmUgPT09ICdzZWxlY3QnID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdzZWxlY3QnKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnRnJlZWZvcm0nLFxuICAgICAgICAgIGljb246ICdwaSBwaS1wZW5jaWwnLFxuICAgICAgICAgIHN0eWxlQ2xhc3M6IGFjdGl2ZSA9PT0gJ2RyYXdjbG9zZWRwYXRoJyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnZHJhd2Nsb3NlZHBhdGgnKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnQnJ1c2gnLFxuICAgICAgICAgIGljb246ICdicnVzaC1pY29uJyxcbiAgICAgICAgICBzdHlsZUNsYXNzOiBhY3RpdmUgPT09ICdicnVzaCcgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ2JydXNoJyksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1BvbHlsaW5lJyxcbiAgICAgICAgICBpY29uOiAncG9seWxpbmUtaWNvbicsXG4gICAgICAgICAgc3R5bGVDbGFzczogYWN0aXZlID09PSAnZHJhd29wZW5wYXRoJyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnZHJhd29wZW5wYXRoJyksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1JlY3RhbmdsZScsXG4gICAgICAgICAgaWNvbjogJ3BpIHBpLXN0b3AnLFxuICAgICAgICAgIHN0eWxlQ2xhc3M6IGFjdGl2ZSA9PT0gJ2RyYXdyZWN0JyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnZHJhd3JlY3QnKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnV2FuZCcsXG4gICAgICAgICAgaWNvbjogJ3dhbmQtaWNvbicsXG4gICAgICAgICAgc3R5bGVDbGFzczogYWN0aXZlID09PSAnd2FuZCcgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ3dhbmQnKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnVmVydGV4IGVyYXNlcicsXG4gICAgICAgICAgaWNvbjogJ3BpIHBpLWVyYXNlcicsXG4gICAgICAgICAgc3R5bGVDbGFzczogYWN0aXZlID09PSAnZXJhc2VWZXJ0ZXgnID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdlcmFzZVZlcnRleCcpLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIC8vIFZlcnRleCBlZGl0aW5nIHJ1bnMgb24gdGhlIE9wZW5TZWFkcmFnb24gb3ZlcmxheSwgd2hpY2hcbiAgICAgIC8vIGJhY2tzIHRoZSBJbWFnZSBwbG90IHR5cGUuIEhpZGRlbiBmb3Igb3RoZXIgMkQgdHlwZXMgKFBsb3RseSksIHdoZXJlXG4gICAgICAvLyB0aGVzZSBtb2RlcyBhcmUgbm8tb3BzLlxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRQbG90VHlwZSA9PT0gUGxvdFR5cGUuSU1BR0UpIHtcbiAgICAgICAgaXRlbXMucHVzaChcbiAgICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogJ1BvbHlnb24gKGNsaWNrIHZlcnRpY2VzKScsXG4gICAgICAgICAgICBpY29uOiAncG9seWdvbi12ZXJ0aWNlcy1pY29uJyxcbiAgICAgICAgICAgIHN0eWxlQ2xhc3M6IGFjdGl2ZSA9PT0gJ2RyYXdwb2x5Z29uJyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdkcmF3cG9seWdvbicpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6ICdBZGQgdmVydGV4JyxcbiAgICAgICAgICAgIGljb246ICd2ZXJ0ZXgtYWRkLWljb24nLFxuICAgICAgICAgICAgc3R5bGVDbGFzczogYWN0aXZlID09PSAnYWRkcG9pbnQnID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ2FkZHBvaW50JyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogJ0RlbGV0ZSB2ZXJ0ZXgnLFxuICAgICAgICAgICAgaWNvbjogJ3ZlcnRleC1kZWxldGUtaWNvbicsXG4gICAgICAgICAgICBzdHlsZUNsYXNzOiBhY3RpdmUgPT09ICdkZWxldGVwb2ludCcgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnZGVsZXRlcG9pbnQnKSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gQsOpemllciBjb252ZXJzaW9ucyArIERlbGV0ZSBhcmUgaW1tZWRpYXRlIHNlbGVjdGlvbiAqYWN0aW9ucyosIG5vdyBpbiB0aGVcbiAgICAgIC8vIFwiU2VsZWN0ZWQgcmVnaW9uKHMpXCIgZ3JvdXAgYXQgdGhlIHRvcCAoc2VlIGJ1aWxkUmVnaW9uQWN0aW9uSXRlbXMpLlxuICAgIH1cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICB0b2dnbGVTdXJmYWNlM2RNb2RlKG1vZGU6IHN0cmluZykge1xuICAgIHRoaXMuYWN0aXZlU3VyZmFjZTNkTW9kZSA9IG1vZGU7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRTdXJmYWNlRHJhZ01vZGUobW9kZSk7XG4gIH1cblxuICByZXNldFN1cmZhY2VDYW1lcmEoKSB7XG4gICAgdGhpcy5wbG90U2VydmljZS5yZXNldFN1cmZhY2VDYW1lcmEoKTtcbiAgfVxuXG4gIC8qKiBUb2dnbGUgdGhlIG5hcGFyaSAzRCBjb29yZGluYXRlLWF4ZXMgLyBzY2FsZSBnaXptbyAodm9sdW1lL2lzb3N1cmZhY2UpLiBOby1vcCBvbiBiYWNrZW5kc1xuICAgKiAgdGhhdCBkb24ndCByZW5kZXIgb25lICh0aGUgY29udHJvbCBtZXRob2QgaXMgb3B0aW9uYWwpLiAqL1xuICB0b2dnbGVBeGVzKCkge1xuICAgIHRoaXMuYXhlc1Zpc2libGUgPSAhdGhpcy5heGVzVmlzaWJsZTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmdldFN1cmZhY2UzZENvbnRyb2xzKCk/LnNldEF4ZXNWaXNpYmxlPy4odGhpcy5heGVzVmlzaWJsZSk7XG4gIH1cblxuICAvKiogVG9nZ2xlIHRoZSBuYXBhcmkgc3VyZmFjZSB3aXJlZnJhbWUgKGVkZ2VzIHZzIGZpbGxlZCkuIE5vLW9wIG9uIGJhY2tlbmRzIHdpdGhvdXQgYSBzdXJmYWNlLiAqL1xuICB0b2dnbGVXaXJlZnJhbWUoKSB7XG4gICAgdGhpcy53aXJlZnJhbWVBY3RpdmUgPSAhdGhpcy53aXJlZnJhbWVBY3RpdmU7XG4gICAgdGhpcy5wbG90U2VydmljZS5nZXRTdXJmYWNlM2RDb250cm9scygpPy5zZXRXaXJlZnJhbWU/Lih0aGlzLndpcmVmcmFtZUFjdGl2ZSk7XG4gIH1cblxuICAvKiogQ2hhbmdlIHRoZSBuYXBhcmkgM0QgZGVjaW1hdGUgZmFjdG9yLiBEZWNpbWF0aW9uIGNoYW5nZXMgdGhlIGZldGNoZWQvYXNzZW1ibGVkIGRhdGEsIHNvIHRoaXNcbiAgICogIHJlLXBsb3RzIHRoZSBjdXJyZW50IDNEIHR5cGUgYXQgdGhlIG5ldyByZXNvbHV0aW9uICh1bmxpa2UgYXhlcy93aXJlZnJhbWUsIHdoaWNoIGFyZSBsaXZlKS4gKi9cbiAgc2VsZWN0UmVzb2x1dGlvbihzY2FsZTogbnVtYmVyKSB7XG4gICAgaWYgKHNjYWxlID09PSB0aGlzLnJlc29sdXRpb25TY2FsZSkgcmV0dXJuO1xuICAgIHRoaXMucmVzb2x1dGlvblNjYWxlID0gc2NhbGU7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRSZXNvbHV0aW9uU2NhbGU/LihzY2FsZSk7XG4gICAgdGhpcy5yZWxvYWRBbmRQbG90KCk7XG4gIH1cblxuICAvKipcbiAgICogU3dpdGNoIHRoZSBhY3RpdmUgcGxvdCB0eXBlIChoZWF0bWFwLCBzdXJmYWNlLCBjb250b3VyLCBzY2F0dGVyLCBsaW5lLFxuICAgKiBzY2F0dGVyM2QsIGlzb3N1cmZhY2UpLiBLZWVwcyBgaXNIZWF0bWFwYCBhcyB0aGUgMkQtdnMtM0QgZmxhZyB0aGUgcmVzdCBvZlxuICAgKiB0aGUgdG9vbGJhci9jb250ZXh0LW1lbnUgbG9naWMgcmVsaWVzIG9uLCBkZWFjdGl2YXRlcyAyRC1vbmx5IHRvb2xzIHdoZW5cbiAgICogbW92aW5nIHRvIGEgM0QgdHlwZSwgdGhlbiByZS1wbG90cy5cbiAgICovXG4gIG9uU2VsZWN0UGxvdFR5cGUodHlwZTogUGxvdFR5cGUpIHtcbiAgICB0aGlzLnBsb3RUeXBlID0gdHlwZTtcbiAgICB0aGlzLnNlbGVjdGVkUGxvdFR5cGUgPSB0eXBlO1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB0aGlzLnBsb3RUeXBlT3B0aW9ucy5maW5kKChkKSA9PiBkLnR5cGUgPT09IHR5cGUpO1xuICAgIGNvbnN0IGlzM2QgPSBkZXNjcmlwdG9yPy5kaW1lbnNpb25zID09PSAnM2QnO1xuICAgIHRoaXMuaXNIZWF0bWFwID0gIWlzM2Q7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRQbG90VHlwZSh0eXBlKTtcbiAgICAvLyBTd2l0Y2hpbmcgcGxvdCB0eXBlIGNhbmNlbHMgdGhlIGFjdGl2ZSB0b29sIOKAlCBub3QgZXZlcnkgdHlwZSBzdXBwb3J0cyB0aGVcbiAgICAvLyBzYW1lIHRvb2xzIChsaW5lL3NjYXR0ZXIgY2hhcnRzIGFuZCAzRCBzY2VuZXMgaGF2ZSBubyBib3ggem9vbSBvciByZWdpb25cbiAgICAvLyBkcmF3aW5nKSwgc28gbGVhdmluZyBhIHRvb2wgYXJtZWQgd291bGQgbWlzYmVoYXZlIG9uIHRoZSBuZXcgcGxvdC5cbiAgICB0aGlzLmRlYWN0aXZhdGVBY3RpdmVUb29sKCk7XG4gICAgaWYgKGlzM2QpIHtcbiAgICAgIHRoaXMuYWN0aXZlU3VyZmFjZTNkTW9kZSA9ICd0dXJudGFibGUnO1xuICAgIH1cbiAgICAvLyBuYXBhcmktanMgdm9sdW1lL2lzb3N1cmZhY2UgYXNzZW1ibGUgdGhlaXIgb3duIDNEIHRleHR1cmUgZnJvbSB0aGUgc2xpY2UgZW5kcG9pbnQsIHNvXG4gICAgLy8gdGhleSB0YWtlIHRoZSBub3JtYWwgcmUtcGxvdCBwYXRoIOKAlCBOT1QgUGxvdGx5J3Mgc3RhY2stZnJhbWUgbG9hZGVyICh3aG9zZSBcIkxvYWRpbmdcbiAgICAvLyBmcmFtZXNcIiBvdmVybGF5IHdvdWxkIG5ldmVyIGNsZWFyLCBzaW5jZSBQbG90bHkgaXNuJ3QgdGhlIGFjdGl2ZSBiYWNrZW5kKSAoaml0LXVpIzEwMikuXG4gICAgY29uc3QgaXNOYXBhcmkgPSB0eXBlID09PSBQbG90VHlwZS5OQVBBUklfSU1BR0UgfHwgaXNOYXBhcmkzZCh0eXBlKTtcbiAgICBpZiAoZGVzY3JpcHRvcj8ucmVxdWlyZXNTdGFjayAmJiAhaXNOYXBhcmkpIHtcbiAgICAgIC8vIFZvbHVtZSB0eXBlcyAoaXNvc3VyZmFjZSwgc2NhdHRlcjNkKSBuZWVkIHRoZSB3aG9sZSB6LXN0YWNrIGxvYWRlZCBhcyBhXG4gICAgICAvLyAzRCBhcnJheSwgYW5kIHRoZXkgYWx3YXlzIHJlbmRlciBvbiBQbG90bHkuIERyaXZlIHRoZSBzdGFjayByZWxvYWRcbiAgICAgIC8vIGRpcmVjdGx5IHRocm91Z2ggdGhlIGltYWdlLWluZm8gc3RyZWFtIHJhdGhlciB0aGFuIHRoZSBhY3RpdmUgcmVuZGVyZXInc1xuICAgICAgLy8gc2V0U2hvd1N0YWNrOiB3aGVuIE9wZW5TZWFkcmFnb24gb3ducyB0aGUgSW1hZ2UgdmlldyBpdHMgc2V0U2hvd1N0YWNrIGlzXG4gICAgICAvLyBhIG5vLW9wLCBzbyB0aGUgcmVsb2FkIG5ldmVyIGZpcmVkIGFuZCB0aGUgbG9hZGVyIHNwdW4gZm9yZXZlci4gV2UgYXJtXG4gICAgICAvLyBQbG90bHkncyBzdGFjay1sb2FkaW5nIGZsYWcgKGtlZXBzIGl0cyBmcmFtZS1mZXRjaCBsb29wIGFsaXZlKSBhbmRcbiAgICAgIC8vIHJlLWVtaXQgdGhlIGltYWdlIGluZm8gd2l0aCBzaG93U3RhY2sgb24gc28gdGhlIHBpcGVsaW5lIHJlbG9hZHMgb25cbiAgICAgIC8vIFBsb3RseSByZWdhcmRsZXNzIG9mIHdoaWNoIGJhY2tlbmQgd2FzIG9uIHNjcmVlbi5cbiAgICAgIHRoaXMuc2VsZWN0ZWRTdGFja09wdGlvbiA9IHRoaXMuc3RhY2tPcHRpb25zWzFdO1xuICAgICAgdGhpcy5zdGFja0xvYWRpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5wbG90U2VydmljZS5zZXRTdGFja0xvYWRpbmcodHJ1ZSk7XG4gICAgICBpZiAodGhpcy5pbWFnZUluZm8pIHtcbiAgICAgICAgdGhpcy5pbWFnZUluZm8uc2hvd1N0YWNrID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUluZm8odGhpcy5pbWFnZUluZm8pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlbG9hZEFuZFBsb3QoKTtcbiAgfVxuXG4gIC8qKiBEZWFjdGl2YXRlIHdoYXRldmVyIHRvb2wgaXMgYXJtZWQgYW5kIGNsZWFyIGV2ZXJ5IHRvb2wgbW9kZS4gKi9cbiAgcHJpdmF0ZSBkZWFjdGl2YXRlQWN0aXZlVG9vbCgpIHtcbiAgICB0aGlzLmFjdGl2ZURyYWdNb2RlID0gbnVsbDtcbiAgICB0aGlzLnNlc3Npb24uc2V0QWN0aXZlVG9vbChudWxsKTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmdldFJlZ2lvbk92ZXJsYXkoKT8uc2V0TW9kZSgnbm9uZScpO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0RHJhZ01vZGUoZmFsc2UpO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0Wm9vbVRvQm94TW9kZShmYWxzZSk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRXYW5kTW9kZShmYWxzZSk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRCcnVzaE1vZGUoZmFsc2UpO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0U2FtUG9pbnRNb2RlKGZhbHNlKTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFZlcnRleEVyYXNlck1vZGUoZmFsc2UpO1xuICB9XG59XG5cbiIsIjwhLS0gU0FNIHRvYXN0OiBsaXZlIHN0YXR1cyArIGVuY29kZXItZG93bmxvYWQgcHJvZ3Jlc3MgYmFyIChqaXQtdWkjOTApLiBTdGlja3lcbiAgICAgd2hpbGUgYSBzZWdtZW50IHJ1bnM7IHN0YXlzIG9wZW4gdW50aWwgdGhlIGJhciByZWFjaGVzIDEwMCUgYW5kIHRoZSBydW4gZW5kcy4gLS0+XG48cC10b2FzdCBba2V5XT1cInNhbVRvYXN0S2V5XCIgcG9zaXRpb249XCJib3R0b20tcmlnaHRcIj5cbiAgPG5nLXRlbXBsYXRlIGxldC1tZXNzYWdlIHBUZW1wbGF0ZT1cIm1lc3NhZ2VcIj5cbiAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTsgbWluLXdpZHRoOiAxNnJlbVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYm9sZCBtYi0xXCI+e3sgbWVzc2FnZS5zdW1tYXJ5IH19PC9kaXY+XG4gICAgICA8ZGl2Pnt7IHNhbVN0YXR1cyB8fCBtZXNzYWdlLmRldGFpbCB9fTwvZGl2PlxuICAgICAgPHAtcHJvZ3Jlc3NCYXIgKm5nSWY9XCJzYW1Eb3dubG9hZGluZ1wiIFt2YWx1ZV09XCJzYW1Qcm9ncmVzc1wiIHN0eWxlQ2xhc3M9XCJtdC0yIHNhbS1wcm9ncmVzc1wiPjwvcC1wcm9ncmVzc0Jhcj5cbiAgICAgIDxwLXByb2dyZXNzQmFyICpuZ0lmPVwic2FtQnVzeSAmJiAhc2FtRG93bmxvYWRpbmdcIiBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiIHN0eWxlQ2xhc3M9XCJtdC0yXCJcbiAgICAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCJ7IGhlaWdodDogJzRweCcgfVwiPjwvcC1wcm9ncmVzc0Jhcj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvcC10b2FzdD5cblxuPCEtLSBSZXN1bHQvZXJyb3Igbm90aWNlcyBmcm9tIHRoZSBsaWJyYXJ5IGl0c2VsZiAoc2VnbWVudGF0aW9uIG91dGNvbWUsIHJlZ2lvblxuICAgICB2YWxpZGF0aW9uKS4gUmVuZGVyZWQgaGVyZSBzbyB0aGV5IGRvIG5vdCBkZXBlbmQgb24gdGhlIGhvc3QgbW91bnRpbmcgYVxuICAgICBrZXlsZXNzIDxwLXRvYXN0PiDigJQgd2l0aG91dCB0aGlzIHRoZSBtZXNzYWdlcyB3ZW50IG5vd2hlcmUgaW4gYW55IGhvc3QgYnV0XG4gICAgIGppdC11aSwgYW5kIGEgZmFpbGVkIHJ1biBsb29rZWQgbGlrZSBhIGJ1dHRvbiB0aGF0IGRpZCBub3RoaW5nLiAtLT5cbjxwLXRvYXN0IFtrZXldPVwicmVzdWx0VG9hc3RLZXlcIiBwb3NpdGlvbj1cImJvdHRvbS1yaWdodFwiPjwvcC10b2FzdD5cblxuPCEtLSBTaGFyZWQgb3V0bGV0cyBmb3Igbm90aWNlcyByYWlzZWQgd2hlcmUgdGhlcmUgaXMgbm8gcGVyLWluc3RhbmNlIGtleSB0byB1c2U6XG4gICAgIHRoZSByb290LXByb3ZpZGVkIFBsb3RseVNlcnZpY2UgYW5kIHRoZSByZWdpb24tZWRpdG9yIGRpYWxvZy4gUmVuZGVyZWQgYnkgYVxuICAgICBzaW5nbGUgdmlzdWFsaXplciAob3duc1NoYXJlZFRvYXN0cykgc28gYSBtZXNzYWdlIGZyb20gdGhlIHJvb3Qgc2VydmljZSBpc1xuICAgICBub3Qgc2hvd24gb25jZSBwZXIgbGl2ZSB2aWV3ZXIuIC0tPlxuPHAtdG9hc3QgKm5nSWY9XCJvd25zU2hhcmVkVG9hc3RzXCIgW2tleV09XCJ2aXpUb2FzdEtleVwiPjwvcC10b2FzdD5cbjxwLXRvYXN0ICpuZ0lmPVwib3duc1NoYXJlZFRvYXN0c1wiIFtrZXldPVwidml6QWxlcnRUb2FzdEtleVwiIHBvc2l0aW9uPVwiY2VudGVyXCI+PC9wLXRvYXN0PlxuXG48IS0tIFRvb2xiYXIgZG9jazogZG9ja2VkIGFjcm9zcyB0aGUgdG9wIGJ5IGRlZmF1bHQ7IGRyYWcgdGhlIGhhbmRsZSB0byBkZXRhY2hcbiAgICAgaXQgaW50byBhIGZsb2F0aW5nLCBtb3ZhYmxlIHdpbmRvdyAoZnJlZXMgdGhlIHRvcCByb3cgZm9yIHRoZSBpbWFnZSkuIC0tPlxuPGRpdiBjbGFzcz1cInRvb2xiYXItZG9ja1wiIFtjbGFzcy5mbG9hdGluZ109XCJ0b29sYmFyRmxvYXRpbmdcIlxuICAgICBbc3R5bGUubGVmdC5weF09XCJ0b29sYmFyRmxvYXRpbmcgPyB0b29sYmFyUG9zLnggOiBudWxsXCJcbiAgICAgW3N0eWxlLnRvcC5weF09XCJ0b29sYmFyRmxvYXRpbmcgPyB0b29sYmFyUG9zLnkgOiBudWxsXCI+XG4gIDxkaXYgY2xhc3M9XCJ0b29sYmFyLWRyYWctaGFuZGxlXCIgKG1vdXNlZG93bik9XCJvblRvb2xiYXJEcmFnU3RhcnQoJGV2ZW50KVwiXG4gICAgICAgcFRvb2x0aXA9XCJEcmFnIHRvIGZsb2F0IHRoZSB0b29sYmFyXCIgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCI+XG4gICAgPGkgY2xhc3M9XCJwaSBwaS1iYXJzXCI+PC9pPlxuICA8L2Rpdj5cbjxwbG90dGluZy10b29sYmFyXG4gIFtpbWFnZUluZm9dPVwiaW1hZ2VJbmZvXCJcbiAgW3Bsb3RUeXBlT3B0aW9uc109XCJwbG90VHlwZU9wdGlvbnNcIlxuICBbc2VsZWN0ZWRQbG90VHlwZV09XCJzZWxlY3RlZFBsb3RUeXBlXCJcbiAgW2lzb1JhbmdlXT1cImlzb1JhbmdlXCJcbiAgW21heEluZGV4XT1cIm1heEluZGV4XCJcbiAgW3pJbmRleF09XCJ6SW5kZXhcIlxuICBbaXNIZWF0bWFwXT1cImlzSGVhdG1hcFwiXG4gIFthY3RpdmVEcmFnTW9kZV09XCJhY3RpdmVEcmFnTW9kZVwiXG4gIFthY3RpdmVTdXJmYWNlM2RNb2RlXT1cImFjdGl2ZVN1cmZhY2UzZE1vZGVcIlxuICBbYXhlc1Zpc2libGVdPVwiYXhlc1Zpc2libGVcIlxuICBbd2lyZWZyYW1lQWN0aXZlXT1cIndpcmVmcmFtZUFjdGl2ZVwiXG4gIFtyZXNvbHV0aW9uU2NhbGVdPVwicmVzb2x1dGlvblNjYWxlXCJcbiAgW3dhbmRTZW5zaXRpdml0eV09XCJ3YW5kU2Vuc2l0aXZpdHlcIlxuICBbYnJ1c2hTaXplXT1cImJydXNoU2l6ZVwiXG4gIFtzYW1Nb2RlbHNdPVwic2FtTW9kZWxzXCJcbiAgW3NhbU1vZGVsSWRdPVwic2FtTW9kZWxJZFwiXG4gIFt5b2xvTW9kZWxzXT1cInlvbG9Nb2RlbHNcIlxuICBbeW9sb01vZGVsSWRdPVwieW9sb01vZGVsSWRcIlxuICBbdmVydGV4RXJhc2VyUmFkaXVzXT1cInZlcnRleEVyYXNlclJhZGl1c1wiXG4gIFtjYW5VbmRvXT1cImNhblVuZG9SZWdpb25cIlxuICBbY2FuUmVkb109XCJjYW5SZWRvUmVnaW9uXCJcbiAgW3N0YWNrT3B0aW9uc109XCJzdGFja09wdGlvbnNcIlxuICBbdG9vbHNdPVwidG9vbGJhclRvb2xzXCJcbiAgW2ltYWdlU21vb3RoaW5nRW5hYmxlZF09XCJpbWFnZVNtb290aGluZ0VuYWJsZWRcIlxuICAoc2VsZWN0UGxvdFR5cGUpPVwib25TZWxlY3RQbG90VHlwZSgkZXZlbnQpXCJcbiAgKHRvZ2dsZUltYWdlU21vb3RoaW5nKT1cIm9uVG9nZ2xlSW1hZ2VTbW9vdGhpbmcoKVwiXG4gIChhZGRQcm9maWxlTGluZSk9XCJhZGRQcm9maWxlTGluZSgpXCJcbiAgKGlzb1JhbmdlQ2hhbmdlKT1cIm9uSXNvUmFuZ2VDaGFuZ2UoJGV2ZW50KVwiXG4gIChvcGVuQ2hhbm5lbEhpc3RvZ3JhbSk9XCJvcGVuQ2hhbm5lbEhpc3RvZ3JhbSgpXCJcbiAgKG9wZW5SZWdpb25FZGl0b3IpPVwib3BlblJlZ2lvbkVkaXRvcigpXCJcbiAgKHNlbGVjdFN0YWNrT3B0aW9uKT1cInNlbGVjdFN0YWNrT3B0aW9uKCRldmVudClcIlxuICAoelNjcnViKT1cIm9uWlNjcnViKCRldmVudClcIlxuICAoelNsaWRlKT1cIm9uWlNsaWRlKCRldmVudClcIlxuICAoekluZGV4SW5wdXQpPVwiekluZGV4ID0gJGV2ZW50OyB1cGRhdGVaSW5kZXgoKVwiXG4gIChyZWxvYWRBbmRQbG90KT1cInJlbG9hZEFuZFBsb3QoKVwiXG4gIChkb3dubG9hZEltYWdlKT1cImRvd25sb2FkSW1hZ2UoKVwiXG4gIChhdXRvc2NhbGVJbWFnZSk9XCJhdXRvc2NhbGVJbWFnZSgpXCJcbiAgKHRvZ2dsZURyYWdNb2RlKT1cInRvZ2dsZURyYWdNb2RlKCRldmVudClcIlxuICAoem9vbUluKT1cInpvb21JbigpXCJcbiAgKHpvb21PdXQpPVwiem9vbU91dCgpXCJcbiAgKHRvZ2dsZVN1cmZhY2UzZE1vZGUpPVwidG9nZ2xlU3VyZmFjZTNkTW9kZSgkZXZlbnQpXCJcbiAgKHJlc2V0U3VyZmFjZUNhbWVyYSk9XCJyZXNldFN1cmZhY2VDYW1lcmEoKVwiXG4gICh0b2dnbGVBeGVzKT1cInRvZ2dsZUF4ZXMoKVwiXG4gICh0b2dnbGVXaXJlZnJhbWUpPVwidG9nZ2xlV2lyZWZyYW1lKClcIlxuICAoc2VsZWN0UmVzb2x1dGlvbik9XCJzZWxlY3RSZXNvbHV0aW9uKCRldmVudClcIlxuICAoZGVsZXRlUmVnaW9uKT1cImRlbGV0ZVJlZ2lvbigpXCJcbiAgKHVuZG9SZWdpb24pPVwidW5kb1JlZ2lvbigpXCJcbiAgKHJlZG9SZWdpb24pPVwicmVkb1JlZ2lvbigpXCJcbiAgKHNlZ21lbnRSZWdpb25zKT1cInNlZ21lbnRSZWdpb25zKClcIlxuICAoc2VnbWVudENlbGxwb3NlKT1cInNlZ21lbnRDZWxscG9zZSgpXCJcbiAgKHNhbU1vZGVsQ2hhbmdlKT1cIm9uU2FtTW9kZWxDaGFuZ2UoJGV2ZW50KVwiXG4gIChkZXRlY3RZb2xvKT1cImRldGVjdFlvbG8oKVwiXG4gICh5b2xvTW9kZWxDaGFuZ2UpPVwib25Zb2xvTW9kZWxDaGFuZ2UoJGV2ZW50KVwiXG4gIChvcGVuWW9sb1BhcmFtcyk9XCJvcGVuWW9sb1BhcmFtcygpXCJcbiAgKHdhbmRTZW5zaXRpdml0eUNoYW5nZSk9XCJvbldhbmRTZW5zaXRpdml0eUNoYW5nZSgkZXZlbnQpXCJcbiAgKGJydXNoU2l6ZUNoYW5nZSk9XCJvbkJydXNoU2l6ZUNoYW5nZSgkZXZlbnQpXCJcbiAgKHZlcnRleEVyYXNlclJhZGl1c0NoYW5nZSk9XCJvblZlcnRleEVyYXNlclJhZGl1c0NoYW5nZSgkZXZlbnQpXCI+XG4gIDwhLS0gSG9zdC1wcm9qZWN0ZWQgY3VzdG9tIHRvb2xiYXIgYnV0dG9ucywgZm9yd2FyZGVkIGludG8gdGhlIHRvb2xiYXIuIC0tPlxuICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48L3Bsb3R0aW5nLXRvb2xiYXI+XG4gIDxwLWJ1dHRvbiAqbmdJZj1cInRvb2xiYXJGbG9hdGluZ1wiIGNsYXNzPVwidG9vbGJhci1kb2NrLWJ0blwiIGljb249XCJwaSBwaS10aHVtYnRhY2tcIiBzaXplPVwic21hbGxcIiBbdGV4dF09XCJ0cnVlXCJcbiAgICAgICAgICAgIHBUb29sdGlwPVwiRG9jayB0byB0b3BcIiB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIiAob25DbGljayk9XCJkb2NrVG9vbGJhcigpXCI+XG4gIDwvcC1idXR0b24+XG48L2Rpdj5cblxuPHAtY29udGV4dE1lbnUgI2NtIFttb2RlbF09XCJjb250ZXh0TWVudUl0ZW1zXCIgYXBwZW5kVG89XCJib2R5XCI+PC9wLWNvbnRleHRNZW51PlxuPCEtLSBObyBgaC1mdWxsYCBoZXJlOiBQcmltZUZsZXgncyBoZWlnaHQ6MTAwJSAhaW1wb3J0YW50IG1hZGUgI3Bsb3QgYXMgdGFsbCBhc1xuICAgICB0aGUgd2hvbGUgaG9zdCwgc28gdW5kZXIgdGhlIGRvY2tlZCB0b29sYmFyIGl0cyBib3R0b20gdG9vbGJhci1oZWlnaHQgc3RyaXBcbiAgICAgKGluY2wuIHRoZSBPU0Qgc2NhbGUgYmFyIGF0IGJvdHRvbS1sZWZ0KSB3YXMgY2xpcHBlZCBieSB0aGUgaG9zdCdzXG4gICAgIG92ZXJmbG93OmhpZGRlbi4gVGhlIGNvbXBvbmVudCBzdHlsZXNoZWV0IHNpemVzIGl0ICgudml6LXBsb3QgeyBmbGV4OiAxIH0pLiAtLT5cbjxkaXYgY2xhc3M9XCJ3LWZ1bGwgcmVsYXRpdmUgdml6LXBsb3RcIiBbaWRdPVwicGxvdERpdk5hbWVcIj5cbiAgPGRpdiAqbmdJZj1cImltZ0xvYWRpbmcgfHwgc3RhY2tMb2FkaW5nIHx8IGlzQ2FjaGluZ1wiIGlkPVwib3ZlcmxheVwiPlxuICAgIDwhLS0gRGV0ZXJtaW5hdGUgc3RhY2svdm9sdW1lIHByb2dyZXNzIHRha2VzIHByZWNlZGVuY2U6IHdoaWxlIGl0J3MgYWN0aXZlIHNob3cgT05MWSB0aGVcbiAgICAgICAgIHByb2dyZXNzIGJhciArIFwiTG9hZGluZyBmcmFtZXMuLi5cIiwgbm90IHRoZSBnZW5lcmljIHNwaW5uZXIvXCJMb2FkaW5nIGltYWdlLi4uXCIgb24gdG9wIG9mXG4gICAgICAgICBpdCAoYm90aCB3ZXJlIHJlbmRlcmluZyBhdCBvbmNlIGZvciBuYXBhcmkgdm9sdW1lL2lzb3N1cmZhY2UgbG9hZHMpLiAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3RhY2tMb2FkaW5nOyBlbHNlIGltZ0xvYWRpbmdUcGxcIj5cbiAgICAgIDxwLXByb2dyZXNzQmFyIGNsYXNzPVwicHJvZ3Jlc3NcIiBbdmFsdWVdPVwibG9hZGluZ1BlcmNlbnRhZ2VcIj48L3AtcHJvZ3Jlc3NCYXI+XG4gICAgICA8c3BhbiBjbGFzcz1cInRleHQtbG9hZGluZ1wiPkxvYWRpbmcgZnJhbWVzLi4uPC9zcGFuPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy10ZW1wbGF0ZSAjaW1nTG9hZGluZ1RwbD5cbiAgICAgIDwhLS0gQ2FjaGUtY29weSBwcm9ncmVzcyBpcyBzaG93biB3aGVuZXZlciBhIGNhY2hlIGRvd25sb2FkIGlzIGFjdGl2ZSAoaXNDYWNoaW5nKSwgaW5kZXBlbmRlbnRcbiAgICAgICAgICAgb2YgYGltZ0xvYWRpbmdgLCBzbyBpdCdzIG5ldmVyIGRyb3BwZWQvbWFza2VkIG1pZC1kb3dubG9hZC4gLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNDYWNoaW5nOyBlbHNlIHNwaW5uZXJMb2FkaW5nXCI+XG4gICAgICAgIDwhLS0gU3RhZ2UtYXdhcmUgbWVzc2FnZSBjb21lcyBmcm9tIENhY2hlUHJvZ3Jlc3NTZXJ2aWNlIHVwZGF0aW5nXG4gICAgICAgICAgICAgaW1hZ2VMb2FkaW5nTWVzc2FnZSQgKFwiQ2FjaGluZyBpbWFnZS4uLlwiIGR1cmluZyB0aGUgR0NTIGRvd25sb2FkLFxuICAgICAgICAgICAgIHRoZW4gXCJHZW5lcmF0aW5nIHByZXZpZXcuLi5cIiBkdXJpbmcgcGVyLXNsaWNlIHRodW1ibmFpbCBnZW4pLiBPbmNlIHRoZVxuICAgICAgICAgICAgIGRvd25sb2FkIGhpdHMgMTAwJSB0aGUgcmVtYWluaW5nIHdvcmsgKHNlcnZlciBwcmV2aWV3L3RpbGUgZ2VuZXJhdGlvbilcbiAgICAgICAgICAgICBoYXMgbm8gZGV0ZXJtaW5hdGUgcHJvZ3Jlc3MsIHNvIGZhbGwgdGhyb3VnaCB0byB0aGUgc3Bpbm5lciB0ZW1wbGF0ZVxuICAgICAgICAgICAgIHJhdGhlciB0aGFuIHBhcmtpbmcgYSBmdWxsIGJhciB1bmRlciBcIkxvYWRpbmcgaW1hZ2UuLi5cIi4gLS0+XG4gICAgICAgIDxwLXByb2dyZXNzQmFyIGNsYXNzPVwicHJvZ3Jlc3NcIiBbdmFsdWVdPVwiY2FjaGVQcm9ncmVzc1wiPjwvcC1wcm9ncmVzc0Jhcj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxvYWRpbmdcIj57e2xvYWRpbmdNZXNzYWdlfX08L3NwYW4+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjc3Bpbm5lckxvYWRpbmc+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpbWdMb2FkaW5nXCIgY2xhc3M9XCJzcGlubmVyXCI+PC9kaXY+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiaW1nTG9hZGluZyAmJiAhem9vbVwiIGNsYXNzPVwidGV4dC1sb2FkaW5nXCI+e3tsb2FkaW5nTWVzc2FnZX19PC9zcGFuPlxuICAgICAgICA8c3BhbiAqbmdJZj1cImltZ0xvYWRpbmcgJiYgem9vbVwiIGNsYXNzPVwiem9vbS10ZXh0LWxvYWRpbmdcIj57e2xvYWRpbmdNZXNzYWdlfX08L3NwYW4+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPHAtYnV0dG9uICpuZ0lmPVwic3RhY2tMb2FkaW5nIHx8IGltZ0xvYWRpbmdcIiBjbGFzcz1cImNhbmNlbC1sb2FkaW5nIFwiIGxhYmVsPVwiQ2FuY2VsXCJcbiAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiY2FuY2VsTG9hZGluZygpXCI+XG4gICAgPC9wLWJ1dHRvbj5cbiAgPC9kaXY+XG4gIDwhLS0gVHJhbnNsdWNlbnQgXCJzaGFycGVuaW5nXCIgb3ZlcmxheSBzaG93biBhZnRlciB0aGUgc21hbGwtdGllciBwcmV2aWV3IGlzXG4gICAgICAgb24gc2NyZWVuIHdoaWxlIHRoZSBsYXJnZS10aWVyIHJlbmRlciBpcyBzdGlsbCBsb2FkaW5nIGluIHRoZVxuICAgICAgIGJhY2tncm91bmQuIExldHMgdGhlIHVzZXIgc2VlIHRoZSBibHVycnkgaW1hZ2UgdW5kZXJuZWF0aCBidXQgbWFrZXNcbiAgICAgICBpdCBjbGVhciBzb21ldGhpbmcgaXMgc3RpbGwgbG9hZGluZyBzbyB0aGV5IGRvbid0IG1pc3Rha2UgdGhlXG4gICAgICAgbG93LXJlcyByZW5kZXIgZm9yIHRoZSBmaW5hbCBpbWFnZS4gLS0+XG4gIDxkaXYgKm5nSWY9XCJzaGFycGVuaW5nICYmICFpbWdMb2FkaW5nICYmICFzdGFja0xvYWRpbmcgJiYgIWlzQ2FjaGluZ1wiIGlkPVwic2hhcnBlbmluZy1vdmVybGF5XCI+XG4gICAgPGRpdiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj5cbiAgICA8c3BhbiBjbGFzcz1cInRleHQtbG9hZGluZ1wiPlNoYXJwZW5pbmcgcHJldmlldy4uLjwvc3Bhbj5cbiAgPC9kaXY+XG5cbjwvZGl2PlxuXG48IS0tIEZsb2F0aW5nLCBkcmFnZ2FibGUgaW50ZW5zaXR5LXByb2ZpbGUgaW5zZXQuIFNob3duIGluIExJTkUgbW9kZTsgdGhlIGNoYXJ0XG4gICAgIHVwZGF0ZXMgbGl2ZSBhcyB0aGUgbGluZSBST0kgb24gdGhlIGltYWdlIGlzIG1vdmVkLiBLZXB0IE9VVFNJREUgI3Bsb3QgYW5kXG4gICAgIHBvc2l0aW9uZWQgZml4ZWQgc28gaXQgZmxvYXRzIG92ZXIgdGhlIHdob2xlIHBhZ2UgKG5vdCBjbGlwcGVkIHRvIHRoZVxuICAgICBkaWFncmFtL2NhbnZhcyBhcmVhKS4gLS0+XG48ZGl2ICpuZ0lmPVwiaGFzUHJvZmlsZXNcIiBjbGFzcz1cImludGVuc2l0eS1wYW5lbFwiXG4gICAgIFtzdHlsZS5sZWZ0LnB4XT1cInByb2ZpbGVQYW5lbFBvcy54XCIgW3N0eWxlLnRvcC5weF09XCJwcm9maWxlUGFuZWxQb3MueVwiPlxuICA8ZGl2IGNsYXNzPVwiaW50ZW5zaXR5LXBhbmVsLWhlYWRlclwiIChtb3VzZWRvd24pPVwib25Qcm9maWxlUGFuZWxEcmFnU3RhcnQoJGV2ZW50KVwiPlxuICAgIDxzcGFuPkludGVuc2l0eSBwcm9maWxlPC9zcGFuPlxuICAgIDxpIGNsYXNzPVwicGkgcGktYXJyb3dzLWFsdFwiPjwvaT5cbiAgPC9kaXY+XG4gIDxkaXYgW2lkXT1cImludGVuc2l0eUluc2V0RGl2XCIgY2xhc3M9XCJpbnRlbnNpdHktcGFuZWwtcGxvdFwiPjwvZGl2PlxuPC9kaXY+XG5cbjwhLS0gQ2hhbm5lbHMgJiBIaXN0b2dyYW06IG5vbi1tb2RhbCBmbG9hdGluZyBkaWFsb2cgb3BlbmVkIGZyb20gdGhlIHRvb2xiYXIuIC0tPlxuPGNoYW5uZWwtaGlzdG9ncmFtIFsodmlzaWJsZSldPVwic2hvd0NoYW5uZWxIaXN0b2dyYW1cIj48L2NoYW5uZWwtaGlzdG9ncmFtPlxuXG48IS0tIFJlZ2lvbiBFZGl0b3I6IG5vbi1tb2RhbCwgZHJhZ2dhYmxlLCByZXNpemFibGUgZmxvYXRpbmcgZGlhbG9nIG9wZW5lZCBmcm9tXG4gICAgIHRoZSB0b29sYmFyIChmb3JtZXJseSB0aGUgcmlnaHQtcGFuZWwgUmVnaW9ucyB0YWIpLiBNb2RlbGVzcyBzbyByZWdpb25zIGNhblxuICAgICBzdGlsbCBiZSBkcmF3bi9zZWxlY3RlZCBvbiB0aGUgcGxvdCB3aGlsZSBpdCdzIG9wZW47IHN0YXlzIGxpbmtlZCB0byB0aGlzXG4gICAgIHBsb3R0aW5nIGluc3RhbmNlIHZpYSB0aGUgcm9vdCBSZWdpb25TdG9yZSBzaW5nbGV0b24uIE9wZW5zIG92ZXIgdGhlIHJpZ2h0XG4gICAgIHNpZGUgb2YgdGhlIHZpZXcuIC0tPlxuPHAtZGlhbG9nIGhlYWRlcj1cIlJlZ2lvbiBFZGl0b3JcIiBbKHZpc2libGUpXT1cInNob3dSZWdpb25FZGl0b3JcIlxuICAgICAgICAgIFttb2RhbF09XCJmYWxzZVwiIFtyZXNpemFibGVdPVwidHJ1ZVwiIFtkcmFnZ2FibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgW21heGltaXphYmxlXT1cInRydWVcIiBhcHBlbmRUbz1cImJvZHlcIiBwb3NpdGlvbj1cInJpZ2h0XCJcbiAgICAgICAgICBbc3R5bGVdPVwieyB3aWR0aDogcmVnaW9uRWRpdG9yV2lkdGgsIGhlaWdodDogJzg1dmgnIH1cIlxuICAgICAgICAgIFtjb250ZW50U3R5bGVdPVwieyBvdmVyZmxvdzogJ2F1dG8nIH1cIj5cbiAgPHJlZ2lvbi1lZGl0b3I+PC9yZWdpb24tZWRpdG9yPlxuPC9wLWRpYWxvZz5cblxuPCEtLSBTaW1wbGlmeSAoRG91Z2xhc+KAk1BldWNrZXIpOiBjdXN0b20gcHgtdGhyZXNob2xkIHBpY2tlciBmb3IgdGhlIHNlbGVjdGVkXG4gICAgIHJlZ2lvbihzKSwgb3BlbmVkIGZyb20gdGhlIHJpZ2h0LWNsaWNrIFwiU2ltcGxpZnkg4pa4IEN1c3RvbeKAplwiIGFjdGlvbi4gLS0+XG48cC1kaWFsb2cgaGVhZGVyPVwiU2ltcGxpZnkgcmVnaW9uKHMpXCIgWyh2aXNpYmxlKV09XCJkaXNwbGF5U2ltcGxpZnlEaWFsb2dcIiBbbW9kYWxdPVwidHJ1ZVwiXG4gICAgICAgICAgW3N0eWxlXT1cInt3aWR0aDogJzIycmVtJ31cIiBbZHJhZ2dhYmxlXT1cImZhbHNlXCIgW3Jlc2l6YWJsZV09XCJmYWxzZVwiPlxuICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtbiBnYXAtMlwiPlxuICAgIDxzcGFuPkFsdGl0dWRlIHRocmVzaG9sZDogPGI+e3sgc2ltcGxpZnlUaHJlc2hvbGQgfX0gcHg8L2I+PC9zcGFuPlxuICAgIDxwLXNsaWRlciBbKG5nTW9kZWwpXT1cInNpbXBsaWZ5VGhyZXNob2xkXCIgW21pbl09XCIxXCIgW21heF09XCIyMFwiIFtzdGVwXT1cIjFcIj48L3Atc2xpZGVyPlxuICAgIDxzbWFsbD5WZXJ0aWNlcyB3aXRoaW4gdGhpcyBkaXN0YW5jZSBvZiB0aGUgbGluZSBiZXR3ZWVuIHRoZWlyIG5laWdoYm91cnMgYXJlIHJlbW92ZWQuPC9zbWFsbD5cbiAgPC9kaXY+XG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJmb290ZXJcIj5cbiAgICA8cC1idXR0b24gbGFiZWw9XCJDYW5jZWxcIiBbdGV4dF09XCJ0cnVlXCIgKG9uQ2xpY2spPVwiZGlzcGxheVNpbXBsaWZ5RGlhbG9nID0gZmFsc2VcIj48L3AtYnV0dG9uPlxuICAgIDxwLWJ1dHRvbiBsYWJlbD1cIkFwcGx5XCIgaWNvbj1cInBpIHBpLWNoZWNrXCIgKG9uQ2xpY2spPVwic2ltcGxpZnlSZWdpb25zKHNpbXBsaWZ5VGhyZXNob2xkKVwiPjwvcC1idXR0b24+XG4gIDwvbmctdGVtcGxhdGU+XG48L3AtZGlhbG9nPlxuXG48IS0tIFlPTE8gcGFyYW1ldGVycy4gU2FtZSB2b2NhYnVsYXJ5IGFzIHRoZSBwaXBlbGluZSBzdGVwIGFuZCB0aGUgc2VydmVyIHRvb2wsXG4gICAgIHNvIGEgcmVzdWx0IG9idGFpbmVkIGhlcmUgaXMgcmVwcm9kdWNpYmxlIHRoZXJlLiBEZWZhdWx0cyBjb21lIGZyb20gdGhlXG4gICAgIGFjdGl2ZSBjaGVja3BvaW50J3Mgb3duIHJlZ2lzdHJ5IGVudHJ5LiAtLT5cbjxwLWRpYWxvZyBoZWFkZXI9XCJZT0xPIHBhcmFtZXRlcnNcIiBbKHZpc2libGUpXT1cInNob3dZb2xvUGFyYW1zXCIgW21vZGFsXT1cInRydWVcIlxuICAgICAgICAgIFtzdHlsZV09XCJ7d2lkdGg6ICczMHJlbSd9XCIgW2RyYWdnYWJsZV09XCJmYWxzZVwiIFtyZXNpemFibGVdPVwiZmFsc2VcIiBhcHBlbmRUbz1cImJvZHlcIj5cbiAgPGRpdiBjbGFzcz1cImdyaWQgZm9ybWdyaWQgcC1mbHVpZFwiPlxuICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtNlwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1zbVwiPkNvbmZpZGVuY2U8L2xhYmVsPlxuICAgICAgPHAtaW5wdXROdW1iZXIgWyhuZ01vZGVsKV09XCJ5b2xvUGFyYW1zLmNvbmZpZGVuY2VcIiBbbWluXT1cIjBcIiBbbWF4XT1cIjFcIiBbc3RlcF09XCIwLjA1XCJcbiAgICAgICAgICAgICAgICAgICAgIFttaW5GcmFjdGlvbkRpZ2l0c109XCIyXCIgW3Nob3dCdXR0b25zXT1cInRydWVcIj48L3AtaW5wdXROdW1iZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC02XCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LXNtXCI+SW9VIChwZXIgdGlsZSk8L2xhYmVsPlxuICAgICAgPHAtaW5wdXROdW1iZXIgWyhuZ01vZGVsKV09XCJ5b2xvUGFyYW1zLmlvdVRocmVzaG9sZFwiIFttaW5dPVwiMC4xXCIgW21heF09XCIwLjk1XCIgW3N0ZXBdPVwiMC4wNVwiXG4gICAgICAgICAgICAgICAgICAgICBbbWluRnJhY3Rpb25EaWdpdHNdPVwiMlwiIFtzaG93QnV0dG9uc109XCJ0cnVlXCI+PC9wLWlucHV0TnVtYmVyPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtNlwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1zbVwiPk1lcmdlIChjcm9zcy10aWxlKTwvbGFiZWw+XG4gICAgICA8cC1pbnB1dE51bWJlciBbKG5nTW9kZWwpXT1cInlvbG9QYXJhbXMubWVyZ2VUaHJlc2hvbGRcIiBbbWluXT1cIjAuMVwiIFttYXhdPVwiMC45NVwiIFtzdGVwXT1cIjAuMDVcIlxuICAgICAgICAgICAgICAgICAgICAgW21pbkZyYWN0aW9uRGlnaXRzXT1cIjJcIiBbc2hvd0J1dHRvbnNdPVwidHJ1ZVwiPjwvcC1pbnB1dE51bWJlcj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTZcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtc21cIj5Eb3duc2FtcGxpbmcgZmFjdG9yPC9sYWJlbD5cbiAgICAgIDxwLWlucHV0TnVtYmVyIFsobmdNb2RlbCldPVwieW9sb1BhcmFtcy5kb3duc2FtcGxpbmdGYWN0b3JcIiBbbWluXT1cIjFcIiBbbWF4XT1cIjEwXCIgW3N0ZXBdPVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICBbc2hvd0J1dHRvbnNdPVwidHJ1ZVwiPjwvcC1pbnB1dE51bWJlcj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTZcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtc21cIj5UaWxlIG92ZXJsYXAgWCAoJSk8L2xhYmVsPlxuICAgICAgPHAtaW5wdXROdW1iZXIgWyhuZ01vZGVsKV09XCJ5b2xvUGFyYW1zLm92ZXJsYXBYXCIgW21pbl09XCIwXCIgW21heF09XCI5MFwiIFtzdGVwXT1cIjVcIlxuICAgICAgICAgICAgICAgICAgICAgW3Nob3dCdXR0b25zXT1cInRydWVcIj48L3AtaW5wdXROdW1iZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC02XCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LXNtXCI+VGlsZSBvdmVybGFwIFkgKCUpPC9sYWJlbD5cbiAgICAgIDxwLWlucHV0TnVtYmVyIFsobmdNb2RlbCldPVwieW9sb1BhcmFtcy5vdmVybGFwWVwiIFttaW5dPVwiMFwiIFttYXhdPVwiOTBcIiBbc3RlcF09XCI1XCJcbiAgICAgICAgICAgICAgICAgICAgIFtzaG93QnV0dG9uc109XCJ0cnVlXCI+PC9wLWlucHV0TnVtYmVyPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtNlwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1zbVwiPk1pbiBvYmplY3QgYXJlYSAocHjCsik8L2xhYmVsPlxuICAgICAgPHAtaW5wdXROdW1iZXIgWyhuZ01vZGVsKV09XCJ5b2xvUGFyYW1zLm1pbkFyZWFcIiBbbWluXT1cIjBcIiBbbWF4XT1cIjEwMDAwMFwiIFtzdGVwXT1cIjEwXCJcbiAgICAgICAgICAgICAgICAgICAgIFtzaG93QnV0dG9uc109XCJ0cnVlXCI+PC9wLWlucHV0TnVtYmVyPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtNlwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1zbVwiPk91dGxpbmUgc2ltcGxpZmljYXRpb24gKHB4KTwvbGFiZWw+XG4gICAgICA8cC1pbnB1dE51bWJlciBbKG5nTW9kZWwpXT1cInlvbG9QYXJhbXMuc2ltcGxpZnlUb2xlcmFuY2VcIiBbbWluXT1cIjBcIiBbbWF4XT1cIjEwXCIgW3N0ZXBdPVwiMC41XCJcbiAgICAgICAgICAgICAgICAgICAgIFttaW5GcmFjdGlvbkRpZ2l0c109XCIxXCIgW3Nob3dCdXR0b25zXT1cInRydWVcIj48L3AtaW5wdXROdW1iZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgPHAtY2hlY2tib3ggWyhuZ01vZGVsKV09XCJ5b2xvUGFyYW1zLndpdGhNYXNrc1wiIFtiaW5hcnldPVwidHJ1ZVwiIGlucHV0SWQ9XCJ5b2xvTWFza3NcIj48L3AtY2hlY2tib3g+XG4gICAgICA8bGFiZWwgZm9yPVwieW9sb01hc2tzXCIgY2xhc3M9XCJ0ZXh0LXNtIG1iLTBcIj5cbiAgICAgICAgU2VnbWVudGF0aW9uIG1vZGUg4oCUIHRyYWNlIG9iamVjdCBvdXRsaW5lcy4gT2ZmIGRldGVjdHMgYm91bmRpbmcgYm94ZXMgb25seSwgd2hpY2ggaXNcbiAgICAgICAgY29uc2lkZXJhYmx5IGZhc3Rlci5cbiAgICAgIDwvbGFiZWw+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZm9vdGVyXCI+XG4gICAgPHAtYnV0dG9uIGxhYmVsPVwiUmVzZXQgdG8gbW9kZWwgZGVmYXVsdHNcIiBbdGV4dF09XCJ0cnVlXCIgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgKG9uQ2xpY2spPVwicmVzZXRZb2xvUGFyYW1zKClcIj48L3AtYnV0dG9uPlxuICAgIDxwLWJ1dHRvbiBsYWJlbD1cIkNsb3NlXCIgc2l6ZT1cInNtYWxsXCIgKG9uQ2xpY2spPVwic2hvd1lvbG9QYXJhbXMgPSBmYWxzZVwiPjwvcC1idXR0b24+XG4gIDwvbmctdGVtcGxhdGU+XG48L3AtZGlhbG9nPlxuIl19