igniteui-angular 16.1.29 → 16.1.30

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.
@@ -831,12 +831,12 @@ export class IgxSliderComponent {
831
831
  this.positionHandlersAndUpdateTrack();
832
832
  this.setTickInterval();
833
833
  this.changeThumbFocusableState(this.disabled);
834
- this.subscribeTo(this.thumbFrom, this.thumbChanged.bind(this));
835
- this.subscribeTo(this.thumbTo, this.thumbChanged.bind(this));
834
+ this.subscribeToEvents(this.thumbFrom);
835
+ this.subscribeToEvents(this.thumbTo);
836
836
  this.thumbs.changes.pipe(takeUntil(this._destroyer$)).subscribe(change => {
837
837
  const thumbFrom = change.find((thumb) => thumb.type === SliderHandle.FROM);
838
838
  this.positionHandler(thumbFrom, null, this.lowerValue);
839
- this.subscribeTo(thumbFrom, this.thumbChanged.bind(this));
839
+ this.subscribeToEvents(thumbFrom);
840
840
  this.changeThumbFocusableState(this.disabled);
841
841
  });
842
842
  this.labelRefs.changes.pipe(takeUntil(this._destroyer$)).subscribe(() => {
@@ -898,7 +898,6 @@ export class IgxSliderComponent {
898
898
  // Finally do positionHandlersAndUpdateTrack the DOM
899
899
  // based on data values
900
900
  this.positionHandlersAndUpdateTrack();
901
- this._onTouchedCallback();
902
901
  }
903
902
  /**
904
903
  * @hidden
@@ -1153,13 +1152,16 @@ export class IgxSliderComponent {
1153
1152
  this.renderer.setStyle(this.trackRef.nativeElement, 'transform', `scaleX(${toPosition})`);
1154
1153
  }
1155
1154
  }
1156
- subscribeTo(thumb, callback) {
1155
+ subscribeToEvents(thumb) {
1157
1156
  if (!thumb) {
1158
1157
  return;
1159
1158
  }
1160
1159
  thumb.thumbValueChange
1161
1160
  .pipe(takeUntil(this.unsubscriber(thumb)))
1162
- .subscribe(value => callback(value, thumb.type));
1161
+ .subscribe(value => this.thumbChanged(value, thumb.type));
1162
+ thumb.thumbBlur
1163
+ .pipe(takeUntil(this.unsubscriber(thumb)))
1164
+ .subscribe(() => this._onTouchedCallback());
1163
1165
  }
1164
1166
  unsubscriber(thumb) {
1165
1167
  return merge(this._destroyer$, thumb.destroy);
@@ -1175,7 +1177,7 @@ export class IgxSliderComponent {
1175
1177
  this.valueChange.emit({ oldValue, value: this.value });
1176
1178
  }
1177
1179
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.8", ngImport: i0, type: IgxSliderComponent, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i1.IgxDirectionality }], target: i0.ɵɵFactoryTarget.Component }); }
1178
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.8", type: IgxSliderComponent, isStandalone: true, selector: "igx-slider", inputs: { id: "id", thumbLabelVisibilityDuration: "thumbLabelVisibilityDuration", type: "type", labels: "labels", step: "step", disabled: "disabled", continuous: "continuous", minValue: "minValue", maxValue: "maxValue", lowerBound: "lowerBound", upperBound: "upperBound", value: "value", primaryTicks: "primaryTicks", secondaryTicks: "secondaryTicks", showTicks: "showTicks", primaryTickLabels: "primaryTickLabels", secondaryTickLabels: "secondaryTickLabels", ticksOrientation: "ticksOrientation", tickLabelsOrientation: "tickLabelsOrientation", lowerValue: "lowerValue", upperValue: "upperValue" }, outputs: { valueChange: "valueChange", lowerValueChange: "lowerValueChange", upperValueChange: "upperValueChange", dragFinished: "dragFinished" }, host: { listeners: { "pointerdown": "onPointerDown($event)", "pointerup": "onPointerUp($event)", "focus": "onFocus()", "pan": "onPanListener($event)" }, properties: { "attr.role": "this.role", "class.igx-slider": "this.slierClass", "attr.id": "this.id", "attr.aria-valuemin": "this.valuemin", "attr.aria-valuemax": "this.valuemax", "attr.aria-readonly": "this.readonly", "class.igx-slider--disabled": "this.disabledClass" } }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: IgxSliderComponent, multi: true }], queries: [{ propertyName: "thumbFromTemplateRef", first: true, predicate: IgxThumbFromTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "thumbToTemplateRef", first: true, predicate: IgxThumbToTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "tickLabelTemplateRef", first: true, predicate: IgxTickLabelTemplateDirective, descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "trackRef", first: true, predicate: ["track"], descendants: true, static: true }, { propertyName: "ticks", first: true, predicate: ["ticks"], descendants: true, static: true }, { propertyName: "thumbs", predicate: IgxSliderThumbComponent, descendants: true }, { propertyName: "labelRefs", predicate: IgxThumbLabelComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<igx-ticks\n *ngIf=\"showTicks && showTopTicks\"\n ticksOrientation=\"top\"\n [primaryTicks]=\"primaryTicks\"\n [secondaryTicks]=\"secondaryTicks\"\n [primaryTickLabels]=\"primaryTickLabels\"\n [secondaryTickLabels]=\"secondaryTickLabels\"\n [tickLabelsOrientation]=\"tickLabelsOrientation\"\n [labelsViewEnabled]=\"labelsViewEnabled\"\n [labels]=\"labels | spreadTickLabels:secondaryTicks\"\n [tickLabelTemplateRef]=\"tickLabelTemplateRef\"\n [minValue]=\"minValue\"\n [maxValue]=\"maxValue\">\n</igx-ticks>\n<div class=\"igx-slider__track\">\n <div class=\"igx-slider__track-inactive\"></div>\n <div #track class=\"igx-slider__track-fill\"></div>\n <div class=\"igx-slider__track-steps\">\n <svg width=\"100%\" height=\"100%\">\n <line #ticks x1=\"0\" y1=\"2\" x2=\"100%\" y2=\"2\"></line>\n </svg>\n </div>\n</div>\n<div class=\"igx-slider__thumbs\">\n <igx-thumb-label\n *ngIf=\"isRange\"\n type=\"from\"\n [value]=\"lowerLabel\"\n [templateRef]=\"thumbFromTemplateRef\"\n [continuous]=\"continuous\"\n [context]=\"context\"\n [deactiveState]=\"deactivateThumbLabel\"\n [thumb]=\"thumbFrom\"></igx-thumb-label>\n\n <igx-thumb\n *ngIf=\"isRange\"\n #thumbFrom\n type=\"from\"\n [value]=\"lowerLabel\"\n [disabled]=\"disabled\"\n [continuous]=\"continuous\"\n [onPan]=\"onPan\"\n [stepDistance]=\"stepDistance\"\n [step]=\"step\"\n [templateRef]=\"thumbFromTemplateRef\"\n [context]=\"context\"\n (thumbChange)=\"onThumbChange()\"\n (hoverChange)=\"onHoverChange($event)\"\n [deactiveState]=\"deactivateThumbLabel\"\n [thumbLabelVisibilityDuration]=\"thumbLabelVisibilityDuration\"></igx-thumb>\n\n <igx-thumb-label\n [value]=\"upperLabel\"\n type=\"to\"\n [templateRef]=\"thumbToTemplateRef\"\n [continuous]=\"continuous\"\n [context]=\"context\"\n [deactiveState]=\"deactivateThumbLabel\"\n [thumb]=\"thumbTo\"></igx-thumb-label>\n\n <igx-thumb\n #thumbTo\n type=\"to\"\n [value]=\"upperLabel\"\n [disabled]=\"disabled\"\n [continuous]=\"continuous\"\n [onPan]=\"onPan\"\n [stepDistance]=\"stepDistance\"\n [step]=\"step\"\n [templateRef]=\"thumbToTemplateRef\"\n [context]=\"context\"\n (thumbChange)=\"onThumbChange()\"\n (hoverChange)=\"onHoverChange($event)\"\n [deactiveState]=\"deactivateThumbLabel\"\n [thumbLabelVisibilityDuration]=\"thumbLabelVisibilityDuration\"></igx-thumb>\n</div>\n<igx-ticks\n *ngIf=\"showTicks && showBottomTicks\"\n ticksOrientation=\"bottom\"\n [primaryTicks]=\"primaryTicks\"\n [secondaryTicks]=\"secondaryTicks\"\n [primaryTickLabels]=\"primaryTickLabels\"\n [secondaryTickLabels]=\"secondaryTickLabels\"\n [tickLabelsOrientation]=\"tickLabelsOrientation\"\n [labelsViewEnabled]=\"labelsViewEnabled\"\n [labels]=\"labels | spreadTickLabels:secondaryTicks\"\n [tickLabelTemplateRef]=\"tickLabelTemplateRef\"\n [minValue]=\"minValue\"\n [maxValue]=\"maxValue\">\n</igx-ticks>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IgxTicksComponent, selector: "igx-ticks", inputs: ["primaryTicks", "secondaryTicks", "primaryTickLabels", "secondaryTickLabels", "ticksOrientation", "tickLabelsOrientation", "maxValue", "minValue", "labelsViewEnabled", "labels", "tickLabelTemplateRef"] }, { kind: "component", type: IgxThumbLabelComponent, selector: "igx-thumb-label", inputs: ["value", "templateRef", "context", "type", "continuous", "deactiveState", "thumb"] }, { kind: "component", type: IgxSliderThumbComponent, selector: "igx-thumb", inputs: ["value", "continuous", "thumbLabelVisibilityDuration", "disabled", "onPan", "stepDistance", "step", "templateRef", "context", "type", "deactiveState"], outputs: ["thumbValueChange", "thumbChange", "hoverChange"] }, { kind: "pipe", type: IgxTickLabelsPipe, name: "spreadTickLabels" }] }); }
1180
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.8", type: IgxSliderComponent, isStandalone: true, selector: "igx-slider", inputs: { id: "id", thumbLabelVisibilityDuration: "thumbLabelVisibilityDuration", type: "type", labels: "labels", step: "step", disabled: "disabled", continuous: "continuous", minValue: "minValue", maxValue: "maxValue", lowerBound: "lowerBound", upperBound: "upperBound", value: "value", primaryTicks: "primaryTicks", secondaryTicks: "secondaryTicks", showTicks: "showTicks", primaryTickLabels: "primaryTickLabels", secondaryTickLabels: "secondaryTickLabels", ticksOrientation: "ticksOrientation", tickLabelsOrientation: "tickLabelsOrientation", lowerValue: "lowerValue", upperValue: "upperValue" }, outputs: { valueChange: "valueChange", lowerValueChange: "lowerValueChange", upperValueChange: "upperValueChange", dragFinished: "dragFinished" }, host: { listeners: { "pointerdown": "onPointerDown($event)", "pointerup": "onPointerUp($event)", "focus": "onFocus()", "pan": "onPanListener($event)" }, properties: { "attr.role": "this.role", "class.igx-slider": "this.slierClass", "attr.id": "this.id", "attr.aria-valuemin": "this.valuemin", "attr.aria-valuemax": "this.valuemax", "attr.aria-readonly": "this.readonly", "class.igx-slider--disabled": "this.disabledClass" } }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: IgxSliderComponent, multi: true }], queries: [{ propertyName: "thumbFromTemplateRef", first: true, predicate: IgxThumbFromTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "thumbToTemplateRef", first: true, predicate: IgxThumbToTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "tickLabelTemplateRef", first: true, predicate: IgxTickLabelTemplateDirective, descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "trackRef", first: true, predicate: ["track"], descendants: true, static: true }, { propertyName: "ticks", first: true, predicate: ["ticks"], descendants: true, static: true }, { propertyName: "thumbs", predicate: IgxSliderThumbComponent, descendants: true }, { propertyName: "labelRefs", predicate: IgxThumbLabelComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<igx-ticks\n *ngIf=\"showTicks && showTopTicks\"\n ticksOrientation=\"top\"\n [primaryTicks]=\"primaryTicks\"\n [secondaryTicks]=\"secondaryTicks\"\n [primaryTickLabels]=\"primaryTickLabels\"\n [secondaryTickLabels]=\"secondaryTickLabels\"\n [tickLabelsOrientation]=\"tickLabelsOrientation\"\n [labelsViewEnabled]=\"labelsViewEnabled\"\n [labels]=\"labels | spreadTickLabels:secondaryTicks\"\n [tickLabelTemplateRef]=\"tickLabelTemplateRef\"\n [minValue]=\"minValue\"\n [maxValue]=\"maxValue\">\n</igx-ticks>\n<div class=\"igx-slider__track\">\n <div class=\"igx-slider__track-inactive\"></div>\n <div #track class=\"igx-slider__track-fill\"></div>\n <div class=\"igx-slider__track-steps\">\n <svg width=\"100%\" height=\"100%\">\n <line #ticks x1=\"0\" y1=\"2\" x2=\"100%\" y2=\"2\"></line>\n </svg>\n </div>\n</div>\n<div class=\"igx-slider__thumbs\">\n <igx-thumb-label\n *ngIf=\"isRange\"\n type=\"from\"\n [value]=\"lowerLabel\"\n [templateRef]=\"thumbFromTemplateRef\"\n [continuous]=\"continuous\"\n [context]=\"context\"\n [deactiveState]=\"deactivateThumbLabel\"\n [thumb]=\"thumbFrom\"></igx-thumb-label>\n\n <igx-thumb\n *ngIf=\"isRange\"\n #thumbFrom\n type=\"from\"\n [value]=\"lowerLabel\"\n [disabled]=\"disabled\"\n [continuous]=\"continuous\"\n [onPan]=\"onPan\"\n [stepDistance]=\"stepDistance\"\n [step]=\"step\"\n [templateRef]=\"thumbFromTemplateRef\"\n [context]=\"context\"\n (thumbChange)=\"onThumbChange()\"\n (hoverChange)=\"onHoverChange($event)\"\n [deactiveState]=\"deactivateThumbLabel\"\n [thumbLabelVisibilityDuration]=\"thumbLabelVisibilityDuration\"></igx-thumb>\n\n <igx-thumb-label\n [value]=\"upperLabel\"\n type=\"to\"\n [templateRef]=\"thumbToTemplateRef\"\n [continuous]=\"continuous\"\n [context]=\"context\"\n [deactiveState]=\"deactivateThumbLabel\"\n [thumb]=\"thumbTo\"></igx-thumb-label>\n\n <igx-thumb\n #thumbTo\n type=\"to\"\n [value]=\"upperLabel\"\n [disabled]=\"disabled\"\n [continuous]=\"continuous\"\n [onPan]=\"onPan\"\n [stepDistance]=\"stepDistance\"\n [step]=\"step\"\n [templateRef]=\"thumbToTemplateRef\"\n [context]=\"context\"\n (thumbChange)=\"onThumbChange()\"\n (hoverChange)=\"onHoverChange($event)\"\n [deactiveState]=\"deactivateThumbLabel\"\n [thumbLabelVisibilityDuration]=\"thumbLabelVisibilityDuration\"></igx-thumb>\n</div>\n<igx-ticks\n *ngIf=\"showTicks && showBottomTicks\"\n ticksOrientation=\"bottom\"\n [primaryTicks]=\"primaryTicks\"\n [secondaryTicks]=\"secondaryTicks\"\n [primaryTickLabels]=\"primaryTickLabels\"\n [secondaryTickLabels]=\"secondaryTickLabels\"\n [tickLabelsOrientation]=\"tickLabelsOrientation\"\n [labelsViewEnabled]=\"labelsViewEnabled\"\n [labels]=\"labels | spreadTickLabels:secondaryTicks\"\n [tickLabelTemplateRef]=\"tickLabelTemplateRef\"\n [minValue]=\"minValue\"\n [maxValue]=\"maxValue\">\n</igx-ticks>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IgxTicksComponent, selector: "igx-ticks", inputs: ["primaryTicks", "secondaryTicks", "primaryTickLabels", "secondaryTickLabels", "ticksOrientation", "tickLabelsOrientation", "maxValue", "minValue", "labelsViewEnabled", "labels", "tickLabelTemplateRef"] }, { kind: "component", type: IgxThumbLabelComponent, selector: "igx-thumb-label", inputs: ["value", "templateRef", "context", "type", "continuous", "deactiveState", "thumb"] }, { kind: "component", type: IgxSliderThumbComponent, selector: "igx-thumb", inputs: ["value", "continuous", "thumbLabelVisibilityDuration", "disabled", "onPan", "stepDistance", "step", "templateRef", "context", "type", "deactiveState"], outputs: ["thumbValueChange", "thumbChange", "thumbBlur", "hoverChange"] }, { kind: "pipe", type: IgxTickLabelsPipe, name: "spreadTickLabels" }] }); }
1179
1181
  }
1180
1182
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.8", ngImport: i0, type: IgxSliderComponent, decorators: [{
1181
1183
  type: Component,
@@ -1285,4 +1287,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.8", ngImpor
1285
1287
  }], upperValue: [{
1286
1288
  type: Input
1287
1289
  }] } });
1288
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9zbGlkZXIvc2xpZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9zbGlkZXIvc2xpZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQ2lELFNBQVMsRUFBRSxZQUFZLEVBQWMsWUFBWSxFQUNyRyxXQUFXLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBd0MsTUFBTSxFQUFFLFNBQVMsRUFBNEIsV0FBVyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQzVKLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBYyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWpELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3ZFLE9BQU8sRUFDSCxhQUFhLEVBQUUsNkJBQTZCLEVBQzVDLDJCQUEyQixFQUFFLDZCQUE2QixFQUFrRCxZQUFZLEVBQUUscUJBQXFCLEVBQUUsZ0JBQWdCLEVBQ3BLLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDekUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENB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QkFEbEIsS0FBSztnQkFrREssVUFBVTtzQkFEcEIsS0FBSztnQkF3Q0ssVUFBVTtzQkFEcEIsS0FBSztnQkFxREssS0FBSztzQkFEZixLQUFLO2dCQWlCSyxZQUFZO3NCQUR0QixLQUFLO2dCQThCSyxjQUFjO3NCQUR4QixLQUFLO2dCQTJCQyxTQUFTO3NCQURmLEtBQUs7Z0JBVUMsaUJBQWlCO3NCQUR2QixLQUFLO2dCQVVDLG1CQUFtQjtzQkFEekIsS0FBSztnQkFhQyxnQkFBZ0I7c0JBRHRCLEtBQUs7Z0JBYUMscUJBQXFCO3NCQUQzQixLQUFLO2dCQXVCQyxXQUFXO3NCQURqQixNQUFNO2dCQWVDLGdCQUFnQjtzQkFEdEIsTUFBTTtnQkFlQyxnQkFBZ0I7c0JBRHRCLE1BQU07Z0JBZUYsWUFBWTtzQkFEbEIsTUFBTTtnQkFPQyxLQUFLO3NCQURaLFNBQVM7dUJBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFPNUIsTUFBTTtzQkFEYixZQUFZO3VCQUFDLHVCQUF1QjtnQkFPN0IsU0FBUztzQkFEaEIsWUFBWTt1QkFBQyxzQkFBc0I7Z0JBd0Q3QixhQUFhO3NCQURuQixZQUFZO3VCQUFDLGFBQWEsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFvQmhDLFdBQVc7c0JBRGpCLFlBQVk7dUJBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWlCOUIsT0FBTztzQkFEYixZQUFZO3VCQUFDLE9BQU87Z0JBU2QsYUFBYTtzQkFEbkIsWUFBWTt1QkFBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBZ0RwQixVQUFVO3NCQURwQixLQUFLO2dCQXdDSyxVQUFVO3NCQURwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIENvbnRlbnRDaGlsZCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLFxuICAgIEhvc3RCaW5kaW5nLCBIb3N0TGlzdGVuZXIsIElucHV0LCBOZ1pvbmUsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgUXVlcnlMaXN0LCBSZW5kZXJlcjIsIFNpbXBsZUNoYW5nZXMsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIFZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IG1lcmdlLCBub29wLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsLCB0aHJvdHRsZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBFZGl0b3JQcm92aWRlciB9IGZyb20gJy4uL2NvcmUvZWRpdC1wcm92aWRlcic7XG5pbXBvcnQgeyByZXNpemVPYnNlcnZhYmxlIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBJZ3hEaXJlY3Rpb25hbGl0eSB9IGZyb20gJy4uL3NlcnZpY2VzL2RpcmVjdGlvbi9kaXJlY3Rpb25hbGl0eSc7XG5pbXBvcnQgeyBJZ3hUaHVtYkxhYmVsQ29tcG9uZW50IH0gZnJvbSAnLi9sYWJlbC90aHVtYi1sYWJlbC5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgICBJZ3hTbGlkZXJUeXBlLCBJZ3hUaHVtYkZyb21UZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBJZ3hUaHVtYlRvVGVtcGxhdGVEaXJlY3RpdmUsIElneFRpY2tMYWJlbFRlbXBsYXRlRGlyZWN0aXZlLCBJUmFuZ2VTbGlkZXJWYWx1ZSwgSVNsaWRlclZhbHVlQ2hhbmdlRXZlbnRBcmdzLCBTbGlkZXJIYW5kbGUsIFRpY2tMYWJlbHNPcmllbnRhdGlvbiwgVGlja3NPcmllbnRhdGlvblxufSBmcm9tICcuL3NsaWRlci5jb21tb24nO1xuaW1wb3J0IHsgSWd4U2xpZGVyVGh1bWJDb21wb25lbnQgfSBmcm9tICcuL3RodW1iL3RodW1iLXNsaWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4VGlja0xhYmVsc1BpcGUgfSBmcm9tICcuL3RpY2tzL3RpY2sucGlwZSc7XG5pbXBvcnQgeyBJZ3hUaWNrc0NvbXBvbmVudCB9IGZyb20gJy4vdGlja3MvdGlja3MuY29tcG9uZW50JztcblxubGV0IE5FWFRfSUQgPSAwO1xuXG4vKipcbiAqICoqSWduaXRlIFVJIGZvciBBbmd1bGFyIFNsaWRlcioqIC1cbiAqIFtEb2N1bWVudGF0aW9uXShodHRwczovL3d3dy5pbmZyYWdpc3RpY3MuY29tL3Byb2R1Y3RzL2lnbml0ZS11aS1hbmd1bGFyL2FuZ3VsYXIvY29tcG9uZW50cy9zbGlkZXIvc2xpZGVyKVxuICpcbiAqIFRoZSBJZ25pdGUgVUkgU2xpZGVyIGFsbG93cyBzZWxlY3Rpb24gaW4gYSBnaXZlbiByYW5nZSBieSBtb3ZpbmcgdGhlIHRodW1iIGFsb25nIHRoZSB0cmFjay4gVGhlIHRyYWNrXG4gKiBjYW4gYmUgZGVmaW5lZCBhcyBjb250aW51b3VzIG9yIHN0ZXBwZWQsIGFuZCB5b3UgY2FuIGNob29zZSBiZXR3ZWVuIHNpbmdsZSBhbmQgcmFuZ2Ugc2xpZGVyIHR5cGVzLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGBodG1sXG4gKiA8aWd4LXNsaWRlciBpZD1cInNsaWRlclwiXG4gKiAgICAgICAgICAgIFttaW5WYWx1ZV09XCIwXCIgW21heFZhbHVlXT1cIjEwMFwiXG4gKiAgICAgICAgICAgIFtjb250aW51b3VzXT10cnVlIFsobmdNb2RlbCldPVwidm9sdW1lXCI+XG4gKiA8L2lneC1zbGlkZXI+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUiwgdXNlRXhpc3Rpbmc6IElneFNsaWRlckNvbXBvbmVudCwgbXVsdGk6IHRydWUgfV0sXG4gICAgc2VsZWN0b3I6ICdpZ3gtc2xpZGVyJyxcbiAgICB0ZW1wbGF0ZVVybDogJ3NsaWRlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbTmdJZiwgSWd4VGlja3NDb21wb25lbnQsIElneFRodW1iTGFiZWxDb21wb25lbnQsIElneFNsaWRlclRodW1iQ29tcG9uZW50LCBJZ3hUaWNrTGFiZWxzUGlwZV1cbn0pXG5leHBvcnQgY2xhc3MgSWd4U2xpZGVyQ29tcG9uZW50IGltcGxlbWVudHNcbiAgICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgICBFZGl0b3JQcm92aWRlcixcbiAgICBPbkluaXQsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBBZnRlckNvbnRlbnRJbml0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3kge1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRodW1iRnJvbSgpOiBJZ3hTbGlkZXJUaHVtYkNvbXBvbmVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLnRodW1icy5maW5kKHRodW1iID0+IHRodW1iLnR5cGUgPT09IFNsaWRlckhhbmRsZS5GUk9NKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCB0aHVtYlRvKCk6IElneFNsaWRlclRodW1iQ29tcG9uZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGh1bWJzLmZpbmQodGh1bWIgPT4gdGh1bWIudHlwZSA9PT0gU2xpZGVySGFuZGxlLlRPKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBsYWJlbEZyb20oKTogSWd4VGh1bWJMYWJlbENvbXBvbmVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLmxhYmVsUmVmcy5maW5kKGxhYmVsID0+IGxhYmVsLnR5cGUgPT09IFNsaWRlckhhbmRsZS5GUk9NKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBsYWJlbFRvKCk6IElneFRodW1iTGFiZWxDb21wb25lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5sYWJlbFJlZnMuZmluZChsYWJlbCA9PiBsYWJlbC50eXBlID09PSBTbGlkZXJIYW5kbGUuVE8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCd0cmFjaycsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHRyYWNrUmVmOiBFbGVtZW50UmVmO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4VGh1bWJGcm9tVGVtcGxhdGVEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgdGh1bWJGcm9tVGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hUaHVtYlRvVGVtcGxhdGVEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgdGh1bWJUb1RlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4VGlja0xhYmVsVGVtcGxhdGVEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogZmFsc2UgfSlcbiAgICBwdWJsaWMgdGlja0xhYmVsVGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKGBhdHRyLnJvbGVgKVxuICAgIHB1YmxpYyByb2xlID0gJ3NsaWRlcic7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtc2xpZGVyJylcbiAgICBwdWJsaWMgc2xpZXJDbGFzcyA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYGlkYCBhdHRyaWJ1dGUuXG4gICAgICogSWYgbm90IHByb3ZpZGVkIGl0IHdpbGwgYmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc2xpZGVyIFtpZF09XCInaWd4LXNsaWRlci0zMidcIiBbKG5nTW9kZWwpXT1cInRhc2sucGVyY2VudENvbXBsZXRlZFwiIFtzdGVwXT1cIjVcIiBbbG93ZXJCb3VuZF09XCIyMFwiPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaWQgPSBgaWd4LXNsaWRlci0ke05FWFRfSUQrK31gO1xuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgZHVyYXRpb24gdmlzaWJpbGl0eSBvZiB0aHVtYnMgbGFiZWxzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA3NTAgbWlsbGlzZWNvbmRzLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXNsaWRlciAjc2xpZGVyIFt0aHVtYkxhYmVsVmlzaWJpbGl0eUR1cmF0aW9uXT1cIjMwMDBcIiBbKG5nTW9kZWwpXT1cInRhc2sucGVyY2VudENvbXBsZXRlZFwiIFtzdGVwXT1cIjVcIj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB0aHVtYkxhYmVsVmlzaWJpbGl0eUR1cmF0aW9uID0gNzUwO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZyhgYXR0ci5hcmlhLXZhbHVlbWluYClcbiAgICBwdWJsaWMgZ2V0IHZhbHVlbWluKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taW5WYWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKGBhdHRyLmFyaWEtdmFsdWVtYXhgKVxuICAgIHB1YmxpYyBnZXQgdmFsdWVtYXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1heFZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoYGF0dHIuYXJpYS1yZWFkb25seWApXG4gICAgcHVibGljIGdldCByZWFkb25seSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXNsaWRlci0tZGlzYWJsZWQnKVxuICAgIHB1YmxpYyBnZXQgZGlzYWJsZWRDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgZ2V0cyB0aGUgdHlwZSBvZiB0aGUgYElneFNsaWRlckNvbXBvbmVudGAuXG4gICAgICogVGhlIHNsaWRlciBjYW4gYmUgSWd4U2xpZGVyVHlwZS5TTElERVIoZGVmYXVsdCkgb3IgSWd4U2xpZGVyVHlwZS5SQU5HRS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZChcInNsaWRlcjJcIilcbiAgICAgKiBwdWJsaWMgc2xpZGVyOiBJZ3hTbGlkZXJDb21wb25lbnQ7XG4gICAgICogbmdBZnRlclZpZXdJbml0KCl7XG4gICAgICogICAgIGxldCB0eXBlID0gdGhpcy5zbGlkZXIudHlwZTtcbiAgICAgKiB9XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90eXBlIGFzIElneFNsaWRlclR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgdHlwZSBvZiB0aGUgYElneFNsaWRlckNvbXBvbmVudGAuXG4gICAgICogVGhlIHNsaWRlciBjYW4gYmUgSWd4U2xpZGVyVHlwZS5TTElERVIoZGVmYXVsdCkgb3IgSWd4U2xpZGVyVHlwZS5SQU5HRS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogc2xpZGVyVHlwZTogSWd4U2xpZGVyVHlwZSA9IElneFNsaWRlclR5cGUuUkFOR0U7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc2xpZGVyICNzbGlkZXIyIFt0eXBlXT1cInNsaWRlclR5cGVcIiBbKG5nTW9kZWwpXT1cInJhbmdlVmFsdWVcIiBbbWluVmFsdWVdPVwiMFwiIFttYXhWYWx1ZV09XCIxMDBcIj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHR5cGUodHlwZTogSWd4U2xpZGVyVHlwZSkge1xuICAgICAgICB0aGlzLl90eXBlID0gdHlwZTtcblxuICAgICAgICBpZiAodHlwZSA9PT0gSWd4U2xpZGVyVHlwZS5TTElERVIpIHtcbiAgICAgICAgICAgIHRoaXMubG93ZXJWYWx1ZSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5faGFzVmlld0luaXQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVHJhY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBgbGFiZWxWaWV3YCwgYnkgYWNjZXB0aW5nIGEgY29sbGVjdGlvbiBvZiBwcmltaXRpdmUgdmFsdWVzIHdpdGggbW9yZSB0aGFuIG9uZSBlbGVtZW50LlxuICAgICAqIEVhY2ggZWxlbWVudCB3aWxsIGJlIGVxdWFsbHkgc3ByZWFkIG92ZXIgdGhlIHNsaWRlciBhbmQgaXQgd2lsbCBzZXJ2ZSBhcyBhIHRodW1iIGxhYmVsLlxuICAgICAqIE9uY2UgdGhlIHByb3BlcnR5IGlzIHNldCwgaXQgd2lsbCBwcmVjZW5kZW5jZSBvdmVyIHtAbGluayBtYXhWYWx1ZX0sIHtAbGluayBtaW5WYWx1ZX0sIHtAbGluayBzdGVwfS5cbiAgICAgKiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1hbmlwdWxhdGlvbiBmb3IgdGhvc2UgcHJvcGVydGllcyB3b24ndCBiZSBhbGxvd2VkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBsYWJlbHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYWJlbHM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBsYWJlbHMobGFiZWxzOiBBcnJheTxudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZD4pIHtcbiAgICAgICAgdGhpcy5fbGFiZWxzID0gbGFiZWxzO1xuXG4gICAgICAgIHRoaXMuX3BNYXggPSB0aGlzLnZhbHVlVG9GcmFjdGlvbih0aGlzLnVwcGVyQm91bmQsIDAsIDEpO1xuICAgICAgICB0aGlzLl9wTWluID0gdGhpcy52YWx1ZVRvRnJhY3Rpb24odGhpcy5sb3dlckJvdW5kLCAwLCAxKTtcblxuICAgICAgICB0aGlzLnBvc2l0aW9uSGFuZGxlcnNBbmRVcGRhdGVUcmFjaygpO1xuXG4gICAgICAgIGlmICh0aGlzLl9oYXNWaWV3SW5pdCkge1xuICAgICAgICAgICAgdGhpcy5zdGVwRGlzdGFuY2UgPSB0aGlzLmNhbGN1bGF0ZVN0ZXBEaXN0YW5jZSgpO1xuICAgICAgICAgICAgdGhpcy5zZXRUaWNrSW50ZXJ2YWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHRlbXBsYXRlIGNvbnRleHQgY29ycmVzcG9uZGluZ1xuICAgICAqIHRvIHtAbGluayBJZ3hUaHVtYkZyb21UZW1wbGF0ZURpcmVjdGl2ZX0gYW5kIHtAbGluayBJZ3hUaHVtYlRvVGVtcGxhdGVEaXJlY3RpdmV9IHRlbXBsYXRlcy5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiByZXR1cm4ge1xuICAgICAqICAkaW1wbGljaXQgLy8gcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGxhYmVsLFxuICAgICAqICBsYWJlbHMgLy8gcmV0dXJucyB0aGUgbGFiZWxzIGNvbGxlY3Rpb24gdGhlIHVzZXIgaGFzIHBhc3NlZC5cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBjb250ZXh0KCk6IGFueSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAkaW1wbGljaXQ6IHRoaXMudmFsdWUsXG4gICAgICAgICAgICBsYWJlbHM6IHRoaXMubGFiZWxzXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgaW5jcmVtZW50YWwvZGVjcmVtZW50YWwgc3RlcCBvZiB0aGUgdmFsdWUgd2hlbiBkcmFnZ2luZyB0aGUgdGh1bWIuXG4gICAgICogVGhlIGRlZmF1bHQgc3RlcCBpcyAxLCBhbmQgc3RlcCBzaG91bGQgbm90IGJlIGxlc3Mgb3IgZXF1YWwgdGhhbiAwLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXNsaWRlciAjc2xpZGVyIFsobmdNb2RlbCldPVwidGFzay5wZXJjZW50Q29tcGxldGVkXCIgW3N0ZXBdPVwiNVwiPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBzdGVwKHN0ZXA6IG51bWJlcikge1xuICAgICAgICB0aGlzLl9zdGVwID0gc3RlcDtcblxuICAgICAgICBpZiAodGhpcy5faGFzVmlld0luaXQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RlcERpc3RhbmNlID0gdGhpcy5jYWxjdWxhdGVTdGVwRGlzdGFuY2UoKTtcbiAgICAgICAgICAgIHRoaXMubm9ybWFsaXplQnlTdGVwKHRoaXMuX3ZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5fdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkhhbmRsZXJzQW5kVXBkYXRlVHJhY2soKTtcbiAgICAgICAgICAgIHRoaXMuc2V0VGlja0ludGVydmFsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpbmNyZW1lbnRhbC9kZWNyZW1lbnRhbCBkcmFnZ2luZyBzdGVwIG9mIHRoZSB7QGxpbmsgSWd4U2xpZGVyQ29tcG9uZW50fS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZChcInNsaWRlcjJcIilcbiAgICAgKiBwdWJsaWMgc2xpZGVyOiBJZ3hTbGlkZXJDb21wb25lbnQ7XG4gICAgICogbmdBZnRlclZpZXdJbml0KCl7XG4gICAgICogICAgIGxldCBzdGVwID0gdGhpcy5zbGlkZXIuc3RlcDtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBzdGVwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYWJlbHNWaWV3RW5hYmxlZCA/IDEgOiB0aGlzLl9zdGVwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgdGhlIHtAbGluayBJZ3hTbGlkZXJDb21wb25lbnR9IGlzIGRpc2FibGVkLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKFwic2xpZGVyMlwiKVxuICAgICAqIHB1YmxpYyBzbGlkZXI6IElneFNsaWRlckNvbXBvbmVudDtcbiAgICAgKiBuZ0FmdGVyVmlld0luaXQoKXtcbiAgICAgKiAgICAgbGV0IGlzRGlzYWJsZWQgPSB0aGlzLnNsaWRlci5kaXNhYmxlZDtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgZGlzYWJsZXMgb3IgZW5hYmxlcyBVSSBpbnRlcmFjdGlvbi5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1zbGlkZXIgI3NsaWRlciBbZGlzYWJsZWRdPVwiJ3RydWUnXCIgWyhuZ01vZGVsKV09XCJ0YXNrLnBlcmNlbnRDb21wbGV0ZWRcIiBbc3RlcF09XCI1XCIgW2xvd2VyQm91bmRdPVwiMjBcIj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGRpc2FibGVkKGRpc2FibGU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBkaXNhYmxlO1xuXG4gICAgICAgIGlmICh0aGlzLl9oYXNWaWV3SW5pdCkge1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VUaHVtYkZvY3VzYWJsZVN0YXRlKGRpc2FibGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUge0BsaW5rIElneFNsaWRlckNvbXBvbmVudH0gaXMgc2V0IGFzIGNvbnRpbnVvdXMuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIEBWaWV3Q2hpbGQoXCJzbGlkZXIyXCIpXG4gICAgICogcHVibGljIHNsaWRlcjogSWd4U2xpZGVyQ29tcG9uZW50O1xuICAgICAqIG5nQWZ0ZXJWaWV3SW5pdCgpe1xuICAgICAqICAgICBsZXQgY29udGludW91cyA9IHRoaXMuc2xpZGVyLmNvbnRpbnVvdXM7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBjb250aW51b3VzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGludW91cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBtYXJrcyB0aGUge0BsaW5rIElneFNsaWRlckNvbXBvbmVudH0gYXMgY29udGludW91cy5cbiAgICAgKiBCeSBkZWZhdWx0IGlzIGNvbnNpZGVyZWQgdGhhdCB0aGUge0BsaW5rIElneFNsaWRlckNvbXBvbmVudH0gaXMgZGlzY3JldGUuXG4gICAgICogRGlzY3JldGUge0BsaW5rIElneFNsaWRlckNvbXBvbmVudH0gc2xpZGVyIGhhcyBzdGVwIGluZGljYXRvcnMgb3ZlciB0aGUgdHJhY2sgYW5kIHZpc2libGUgdGh1bWIgbGFiZWxzIGR1cmluZyBpbnRlcmFjdGlvbi5cbiAgICAgKiBDb250aW51b3VzIHtAbGluayBJZ3hTbGlkZXJDb21wb25lbnR9IGRvZXMgbm90IGhhdmUgdGlja3MgYW5kIGRvZXMgbm90IHNob3cgYnViYmxlIGxhYmVscyBmb3IgdmFsdWVzLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXNsaWRlciAjc2xpZGVyIFtjb250aW51b3VzXT1cIid0cnVlJ1wiIFsobmdNb2RlbCldPVwidGFzay5wZXJjZW50Q29tcGxldGVkXCIgW3N0ZXBdPVwiNVwiIFtsb3dlckJvdW5kXT1cIjIwXCI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNldCBjb250aW51b3VzKGNvbnRpbnVvdXM6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fY29udGludW91cyA9IGNvbnRpbnVvdXM7XG4gICAgICAgIGlmICh0aGlzLl9oYXNWaWV3SW5pdCkge1xuICAgICAgICAgICAgdGhpcy5zZXRUaWNrSW50ZXJ2YWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1pbmltYWwgZGlzcGxheWVkIHRyYWNrIHZhbHVlIG9mIHRoZSBgSWd4U2xpZGVyQ29tcG9uZW50YC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIEBWaWV3Q2hpbGQoXCJzbGlkZXIyXCIpXG4gICAgICogcHVibGljIHNsaWRlcjogSWd4U2xpZGVyQ29tcG9uZW50O1xuICAgICAqIG5nQWZ0ZXJWaWV3SW5pdCgpe1xuICAgICAqICAgICBsZXQgc2xpZGVyTWluID0gdGhpcy5zbGlkZXIubWluVmFsdWU7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWluVmFsdWUoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMubGFiZWxzVmlld0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX21pblZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1pbmltYWwgZGlzcGxheWVkIHRyYWNrIHZhbHVlIGZvciB0aGUgYElneFNsaWRlckNvbXBvbmVudGAuXG4gICAgICogVGhlIGRlZmF1bHQgbWluaW1hbCB2YWx1ZSBpcyAwLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXNsaWRlciBbdHlwZV09XCJzbGlkZXJUeXBlXCIgW21pblZhbHVlXT1cIjU2XCIgW21heFZhbHVlXT1cIjEwMFwiPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBtaW5WYWx1ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICh2YWx1ZSA+PSB0aGlzLm1heFZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9taW5WYWx1ZSA9IHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID4gdGhpcy5fdXBwZXJCb3VuZCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVVcHBlckJvdW5kQW5kTWF4VHJhdmVsWm9uZSgpO1xuICAgICAgICAgICAgdGhpcy5sb3dlckJvdW5kID0gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWZyZXNoIG1pbiB0cmF2ZWwgem9uZSBsaW1pdC5cbiAgICAgICAgdGhpcy5fcE1pbiA9IDA7XG4gICAgICAgIC8vIFJlY2FsY3VsYXRlIHN0ZXAgZGlzdGFuY2UuXG4gICAgICAgIHRoaXMucG9zaXRpb25IYW5kbGVyc0FuZFVwZGF0ZVRyYWNrKCk7XG4gICAgICAgIGlmICh0aGlzLl9oYXNWaWV3SW5pdCkge1xuICAgICAgICAgICAgdGhpcy5zdGVwRGlzdGFuY2UgPSB0aGlzLmNhbGN1bGF0ZVN0ZXBEaXN0YW5jZSgpO1xuICAgICAgICAgICAgdGhpcy5zZXRUaWNrSW50ZXJ2YWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gZGlzcGxheWVkIHRyYWNrIHZhbHVlIGZvciB0aGUge0BsaW5rIElneFNsaWRlckNvbXBvbmVudH0uXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIEBWaWV3Q2hpbGQoXCJzbGlkZXJcIilcbiAgICAgKiBwdWJsaWMgc2xpZGVyOiBJZ3hTbGlkZXJDb21wb25lbnQ7XG4gICAgICogbmdBZnRlclZpZXdJbml0KCl7XG4gICAgICogICAgIGxldCBzbGlkZXJNYXggPSB0aGlzLnNsaWRlci5tYXhWYWx1ZTtcbiAgICAgKiB9XG4gICAgICogIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWF4VmFsdWUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGFiZWxzVmlld0VuYWJsZWQgP1xuICAgICAgICAgICAgdGhpcy5sYWJlbHMubGVuZ3RoIC0gMSA6XG4gICAgICAgICAgICB0aGlzLl9tYXhWYWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtYXhpbWFsIGRpc3BsYXllZCB0cmFjayB2YWx1ZSBmb3IgdGhlIGBJZ3hTbGlkZXJDb21wb25lbnRgLlxuICAgICAqIFRoZSBkZWZhdWx0IG1heGltdW0gdmFsdWUgaXMgMTAwLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXNsaWRlciBbdHlwZV09XCJzbGlkZXJUeXBlXCIgW21pblZhbHVlXT1cIjU2XCIgW21heFZhbHVlXT1cIjI1NlwiPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBtYXhWYWx1ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICh2YWx1ZSA8PSB0aGlzLl9taW5WYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fbWF4VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA8IHRoaXMuX2xvd2VyQm91bmQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTG93ZXJCb3VuZEFuZE1pblRyYXZlbFpvbmUoKTtcbiAgICAgICAgICAgIHRoaXMudXBwZXJCb3VuZCA9IHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVmcmVzaCBtYXggdHJhdmVsIHpvbmUgbGltaXRzLlxuICAgICAgICB0aGlzLl9wTWF4ID0gMTtcbiAgICAgICAgLy8gcmVjYWxjdWxhdGUgc3RlcCBkaXN0YW5jZS5cbiAgICAgICAgdGhpcy5wb3NpdGlvbkhhbmRsZXJzQW5kVXBkYXRlVHJhY2soKTtcbiAgICAgICAgaWYgKHRoaXMuX2hhc1ZpZXdJbml0KSB7XG4gICAgICAgICAgICB0aGlzLnN0ZXBEaXN0YW5jZSA9IHRoaXMuY2FsY3VsYXRlU3RlcERpc3RhbmNlKCk7XG4gICAgICAgICAgICB0aGlzLnNldFRpY2tJbnRlcnZhbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbG93ZXIgYm91bmRhcnkgb2Ygc2V0dGFibGUgdmFsdWVzIG9mIHRoZSBgSWd4U2xpZGVyQ29tcG9uZW50YC5cbiAgICAgKiBJZiBub3Qgc2V0LCB3aWxsIHJldHVybiBgbWluVmFsdWVgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKFwic2xpZGVyXCIpXG4gICAgICogcHVibGljIHNsaWRlcjogSWd4U2xpZGVyQ29tcG9uZW50O1xuICAgICAqIG5nQWZ0ZXJWaWV3SW5pdCgpe1xuICAgICAqICAgICBsZXQgc2xpZGVyTG93Qm91bmQgPSB0aGlzLnNsaWRlci5sb3dlckJvdW5kO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGxvd2VyQm91bmQoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4odGhpcy5fbG93ZXJCb3VuZCkgJiYgdGhpcy5fbG93ZXJCb3VuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZUluUmFuZ2UodGhpcy5fbG93ZXJCb3VuZCwgdGhpcy5taW5WYWx1ZSwgdGhpcy5tYXhWYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5taW5WYWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBsb3dlciBib3VuZGFyeSBvZiBzZXR0YWJsZSB2YWx1ZXMgb2YgdGhlIGBJZ3hTbGlkZXJDb21wb25lbnRgLlxuICAgICAqIElmIG5vdCBzZXQgaXMgdGhlIHNhbWUgYXMgbWluIHZhbHVlLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXNsaWRlciBbc3RlcF09XCI1XCIgW2xvd2VyQm91bmRdPVwiMjBcIj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgbG93ZXJCb3VuZCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICh2YWx1ZSA+PSB0aGlzLnVwcGVyQm91bmQgfHwgKHRoaXMubGFiZWxzVmlld0VuYWJsZWQgJiYgdmFsdWUgPCAwKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbG93ZXJCb3VuZCA9IHRoaXMudmFsdWVJblJhbmdlKHZhbHVlLCB0aGlzLm1pblZhbHVlLCB0aGlzLm1heFZhbHVlKTtcblxuICAgICAgICAvLyBSZWZyZXNoIG1pbiB0cmF2ZWwgem9uZS5cbiAgICAgICAgdGhpcy5fcE1pbiA9IHRoaXMudmFsdWVUb0ZyYWN0aW9uKHRoaXMuX2xvd2VyQm91bmQsIDAsIDEpO1xuICAgICAgICB0aGlzLnBvc2l0aW9uSGFuZGxlcnNBbmRVcGRhdGVUcmFjaygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHVwcGVyIGJvdW5kYXJ5IG9mIHNldHRhYmxlIHZhbHVlcyBvZiB0aGUgYElneFNsaWRlckNvbXBvbmVudGAuXG4gICAgICogSWYgbm90IHNldCwgd2lsbCByZXR1cm4gYG1heFZhbHVlYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKFwic2xpZGVyXCIpXG4gICAgICogcHVibGljIHNsaWRlcjogSWd4U2xpZGVyQ29tcG9uZW50O1xuICAgICAqIG5nQWZ0ZXJWaWV3SW5pdCgpe1xuICAgICAqICAgIGxldCBzbGlkZXJVcEJvdW5kID0gdGhpcy5zbGlkZXIudXBwZXJCb3VuZDtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCB1cHBlckJvdW5kKCk6IG51bWJlciB7XG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKHRoaXMuX3VwcGVyQm91bmQpICYmIHRoaXMuX3VwcGVyQm91bmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVJblJhbmdlKHRoaXMuX3VwcGVyQm91bmQsIHRoaXMubWluVmFsdWUsIHRoaXMubWF4VmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMubWF4VmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdXBwZXIgYm91bmRhcnkgb2YgdGhlIGBJZ3hTbGlkZXJDb21wb25lbnRgLlxuICAgICAqIElmIG5vdCBzZXQgaXMgdGhlIHNhbWUgYXMgbWF4IHZhbHVlLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXNsaWRlciBbc3RlcF09XCI1XCIgW3VwcGVyQm91bmRdPVwiMjBcIj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgdXBwZXJCb3VuZCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICh2YWx1ZSA8PSB0aGlzLmxvd2VyQm91bmQgfHwgKHRoaXMubGFiZWxzVmlld0VuYWJsZWQgJiYgdmFsdWUgPiB0aGlzLmxhYmVscy5sZW5ndGggLSAxKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdXBwZXJCb3VuZCA9IHRoaXMudmFsdWVJblJhbmdlKHZhbHVlLCB0aGlzLm1pblZhbHVlLCB0aGlzLm1heFZhbHVlKTtcbiAgICAgICAgLy8gUmVmcmVzaCB0aW1lIHRyYXZlbCB6b25lLlxuICAgICAgICB0aGlzLl9wTWF4ID0gdGhpcy52YWx1ZVRvRnJhY3Rpb24odGhpcy5fdXBwZXJCb3VuZCwgMCwgMSk7XG4gICAgICAgIHRoaXMucG9zaXRpb25IYW5kbGVyc0FuZFVwZGF0ZVRyYWNrKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2xpZGVyIHZhbHVlLiBJZiB0aGUgc2xpZGVyIGlzIG9mIHR5cGUge0BsaW5rIElneFNsaWRlclR5cGUuU0xJREVSfSB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgbnVtYmVyLlxuICAgICAqIElmIHRoZSBzbGlkZXIgdHlwZSBpcyB7QGxpbmsgSWd4U2xpZGVyVHlwZS5SQU5HRX0uXG4gICAgICogVGhlIHJldHVybmVkIHZhbHVlIHJlcHJlc2VudHMgYW4gb2JqZWN0IG9mIHtAbGluayBsb3dlclZhbHVlfSBhbmQge0BsaW5rIHVwcGVyVmFsdWV9LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKFwic2xpZGVyMlwiKVxuICAgICAqIHB1YmxpYyBzbGlkZXI6IElneFNsaWRlckNvbXBvbmVudDtcbiAgICAgKiBwdWJsaWMgc2xpZGVyVmFsdWUoZXZlbnQpe1xuICAgICAqICAgICBsZXQgc2xpZGVyVmFsID0gdGhpcy5zbGlkZXIudmFsdWU7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdmFsdWUoKTogbnVtYmVyIHwgSVJhbmdlU2xpZGVyVmFsdWUge1xuICAgICAgICBpZiAodGhpcy5pc1JhbmdlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGxvd2VyOiB0aGlzLnZhbHVlSW5SYW5nZSh0aGlzLmxvd2VyVmFsdWUsIHRoaXMubG93ZXJCb3VuZCwgdGhpcy51cHBlckJvdW5kKSxcbiAgICAgICAgICAgICAgICB1cHBlcjogdGhpcy52YWx1ZUluUmFuZ2UodGhpcy51cHBlclZhbHVlLCB0aGlzLmxvd2VyQm91bmQsIHRoaXMudXBwZXJCb3VuZClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZUluUmFuZ2UodGhpcy51cHBlclZhbHVlLCB0aGlzLmxvd2VyQm91bmQsIHRoaXMudXBwZXJCb3VuZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzbGlkZXIgdmFsdWUuXG4gICAgICogSWYgdGhlIHNsaWRlciBpcyBvZiB0eXBlIHtAbGluayBJZ3hTbGlkZXJUeXBlLlNMSURFUn0uXG4gICAgICogVGhlIGFyZ3VtZW50IGlzIG51bWJlci4gQnkgZGVmYXVsdCB0aGUge0BsaW5rIHZhbHVlfSBnZXRzIHRoZSB7QGxpbmsgbG93ZXJCb3VuZH0uXG4gICAgICogSWYgdGhlIHNsaWRlciB0eXBlIGlzIHtAbGluayBJZ3hTbGlkZXJUeXBlLlJBTkdFfSB0aGUgYXJndW1lbnRcbiAgICAgKiByZXByZXNlbnRzIGFuIG9iamVjdCBvZiB7QGxpbmsgbG93ZXJWYWx1ZX0gYW5kIHtAbGluayB1cHBlclZhbHVlfSBwcm9wZXJ0aWVzLlxuICAgICAqIEJ5IGRlZmF1bHQgdGhlIG9iamVjdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHtAbGluayBsb3dlckJvdW5kfSBhbmQge0BsaW5rIHVwcGVyQm91bmR9IHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogcmFuZ2VWYWx1ZSA9IHtcbiAgICAgKiAgIGxvd2VyOiAzMCxcbiAgICAgKiAgIHVwcGVyOiA2MFxuICAgICAqIH07XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc2xpZGVyIFt0eXBlXT1cInNsaWRlclR5cGVcIiBbKG5nTW9kZWwpXT1cInJhbmdlVmFsdWVcIiBbbWluVmFsdWVdPVwiNTZcIiBbbWF4VmFsdWVdPVwiMjU2XCI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBudW1iZXIgfCBJUmFuZ2VTbGlkZXJWYWx1ZSkge1xuICAgICAgICB0aGlzLm5vcm1hbGl6ZUJ5U3RlcCh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2hhc1ZpZXdJbml0KSB7XG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlKHRoaXMuX3ZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25IYW5kbGVyc0FuZFVwZGF0ZVRyYWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIHByZXNlbnRlZCBwcmltYXJ5IHRpY2tzLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBwcmltYXJ5VGlja3MgPSB0aGlzLnNsaWRlci5wcmltYXJ5VGlja3M7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHByaW1hcnlUaWNrcygpIHtcbiAgICAgICAgaWYgKHRoaXMubGFiZWxzVmlld0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcmltYXJ5VGlja3MgPSB0aGlzLmxhYmVscy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3ByaW1hcnlUaWNrcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgcHJpbWFyeSB0aWNrcy4gSWYge0BsaW5rIEBsYWJlbHN9IGlzIGVuYWJsZWQsIHRoaXMgcHJvcGVydHkgd29uJ3QgZnVuY3Rpb24uXG4gICAgICogSW5zdGVkIGVuYWJsZSB0aWNrcyBieSB7QGxpbmsgc2hvd1RpY2tzfSBwcm9wZXJ0eS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5zbGlkZXIucHJpbWFyeVRpY2tzID0gNTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHByaW1hcnlUaWNrcyh2YWw6IG51bWJlcikge1xuICAgICAgICBpZiAodmFsIDw9IDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3ByaW1hcnlUaWNrcyA9IHZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIHByZXNlbnRlZCBzZWNvbmRhcnkgdGlja3MuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHNlY29uZGFyeVRpY2tzID0gdGhpcy5zbGlkZXIuc2Vjb25kYXJ5VGlja3M7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHNlY29uZGFyeVRpY2tzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2Vjb25kYXJ5VGlja3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbnVtYmVyIG9mIHNlY29uZGFyeSB0aWNrcy4gVGhlIHByb3BlcnR5IGZ1bmN0aW9ucyBldmVuIHdoZW4ge0BsaW5rIGxhYmVsc30gaXMgZW5hYmxlZCxcbiAgICAgKiBidXQgYWxsIHNlY29uZGFyeSB0aWNrcyB3b24ndCBwcmVzZW50IGFueSB0aWNrIGxhYmVscy5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5zbGlkZXIuc2Vjb25kYXJ5VGlja3MgPSA1O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgc2Vjb25kYXJ5VGlja3ModmFsOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHZhbCA8IDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3NlY29uZGFyeVRpY2tzID0gdmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3cvaGlkZSBzbGlkZXIgdGlja3NcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1zbGllciBbc2hvd1RpY2tzXT1cInRydWVcIiBbcHJpbWFyeVRpY2tzXT1cIjVcIj48L2lneC1zbGllcj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzaG93VGlja3MgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIHNob3cvaGlkZSBwcmltYXJ5IHRpY2sgbGFiZWxzXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc2xpZGVyIFtwcmltYXJ5VGlja3NdPVwiNVwiIFtwcmltYXJ5VGlja0xhYmVsc109XCJmYWxzZVwiPjwvaWd4LXNsaWRlcj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBwcmltYXJ5VGlja0xhYmVscyA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBzaG93L2hpZGUgc2Vjb25kYXJ5IHRpY2sgbGFiZWxzXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc2xpZGVyIFtzZWNvbmRhcnlUaWNrc109XCI1XCIgW3NlY29uZGFyeVRpY2tMYWJlbHNdPVwiZmFsc2VcIj48L2lneC1zbGlkZXI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2Vjb25kYXJ5VGlja0xhYmVscyA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIHRpY2tzIG9yaWVudGF0aW9uOlxuICAgICAqIGJvdHRvbSAtIFRoZSBkZWZhdWx0IG9yaWVuYXRpb24sIGJlbG93IHRoZSBzbGlkZXIgdHJhY2suXG4gICAgICogdG9wIC0gQWJvdmUgdGhlIHNsaWRlciB0cmFja1xuICAgICAqIG1pcnJvciAtIGNvbWJpbmVzIHRvcCBhbmQgYm90dG9tIG9yaWVudGF0aW9uLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXNsaWRlciBbcHJpbWFyeVRpY2tzXT1cIjVcIiBbdGlja3NPcmllbnRhdGlvbl09XCJ0aWNrc09yaWVudGF0aW9uXCI+PC9pZ3gtc2xpZGVyPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHRpY2tzT3JpZW50YXRpb246IFRpY2tzT3JpZW50YXRpb24gPSBUaWNrc09yaWVudGF0aW9uLkJvdHRvbTtcblxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGljayBsYWJlbHMgcm90YXRpb246XG4gICAgICogaG9yaXpvbnRhbCAtIFRoZSBkZWZhdWx0IHJvdGF0aW9uXG4gICAgICogdG9wdG9ib3R0b20gLSBSb3RhdGVzIHRpY2sgbGFiZWxzIHZlcnRpY2FsbHkgdG8gOTBkZWdcbiAgICAgKiBib3R0b210b3RvcCAtIFJvdGF0ZSB0aWNrIGxhYmVscyB2ZXJ0aWNhbGx5IHRvIC05MGRlZ1xuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXNsaWRlciBbcHJpbWFyeVRpY2tzXT1cIjVcIiBbc2Vjb25kYXJ5VGlja3NdPVwiM1wiIFt0aWNrTGFiZWxzT3JpZW50YXRpb25dPVwidGlja0xhYmVsc09yaWVudGFpdG9uXCI+PC9pZ3gtc2xpZGVyPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHRpY2tMYWJlbHNPcmllbnRhdGlvbjogVGlja0xhYmVsc09yaWVudGF0aW9uID0gVGlja0xhYmVsc09yaWVudGF0aW9uLkhvcml6b250YWw7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCBkZWFjdGl2YXRlVGh1bWJMYWJlbCgpIHtcbiAgICAgICAgcmV0dXJuICgodGhpcy5wcmltYXJ5VGlja3MgJiYgdGhpcy5wcmltYXJ5VGlja0xhYmVscykgfHwgKHRoaXMuc2Vjb25kYXJ5VGlja3MgJiYgdGhpcy5zZWNvbmRhcnlUaWNrTGFiZWxzKSkgJiZcbiAgICAgICAgICAgICh0aGlzLnRpY2tzT3JpZW50YXRpb24gPT09IFRpY2tzT3JpZW50YXRpb24uVG9wIHx8IHRoaXMudGlja3NPcmllbnRhdGlvbiA9PT0gVGlja3NPcmllbnRhdGlvbi5NaXJyb3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgaXMgZW1pdHRlZCBldmVyeSB0aW1lIHRoZSB2YWx1ZSBpcyBjaGFuZ2VkLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBwdWJsaWMgY2hhbmdlKGV2ZW50KXtcbiAgICAgKiAgICBhbGVydChcIlRoZSB2YWx1ZSBoYXMgYmVlbiBjaGFuZ2VkIVwiKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc2xpZGVyICh2YWx1ZUNoYW5nZSk9XCJjaGFuZ2UoJGV2ZW50KVwiICNzbGlkZXIgWyhuZ01vZGVsKV09XCJ0YXNrLnBlcmNlbnRDb21wbGV0ZWRcIiBbc3RlcF09XCI1XCI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJU2xpZGVyVmFsdWVDaGFuZ2VFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGlzIGVtaXR0ZWQgZXZlcnkgdGltZSB0aGUgbG93ZXIgdmFsdWUgb2YgYSByYW5nZSBzbGlkZXIgaXMgY2hhbmdlZC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogcHVibGljIGNoYW5nZSh2YWx1ZSl7XG4gICAgICogICAgYWxlcnQoYFRoZSBsb3dlciB2YWx1ZSBoYXMgYmVlbiBjaGFuZ2VkIHRvICR7dmFsdWV9YCk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXNsaWRlciBbKGxvd2VyVmFsdWUpXT1cIm1vZGVsLmxvd2VydmFsdWVcIiAobG93ZXJWYWx1ZUNoYW5nZSk9XCJjaGFuZ2UoJGV2ZW50KVwiIFtzdGVwXT1cIjVcIj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAgQE91dHB1dCgpXG4gICAgIHB1YmxpYyBsb3dlclZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgICAgLyoqXG4gICAgICAqIFRoaXMgZXZlbnQgaXMgZW1pdHRlZCBldmVyeSB0aW1lIHRoZSB1cHBlciB2YWx1ZSBvZiBhIHJhbmdlIHNsaWRlciBpcyBjaGFuZ2VkLlxuICAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICAqIHB1YmxpYyBjaGFuZ2UodmFsdWUpe1xuICAgICAgKiAgICBhbGVydChgVGhlIHVwcGVyIHZhbHVlIGhhcyBiZWVuIGNoYW5nZWQgdG8gJHt2YWx1ZX1gKTtcbiAgICAgICogfVxuICAgICAgKiBgYGBcbiAgICAgICogYGBgaHRtbFxuICAgICAgKiA8aWd4LXNsaWRlciBbKHVwcGVyVmFsdWUpXT1cIm1vZGVsLnVwcGVydmFsdWVcIiAodXBwZXJWYWx1ZUNoYW5nZSk9XCJjaGFuZ2UoJGV2ZW50KVwiIFtzdGVwXT1cIjVcIj5cbiAgICAgICogYGBgXG4gICAgICAqL1xuICAgICAgQE91dHB1dCgpXG4gICAgICBwdWJsaWMgdXBwZXJWYWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBpcyBlbWl0dGVkIGF0IHRoZSBlbmQgb2YgZXZlcnkgc2xpZGUgaW50ZXJhY3Rpb24uXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHB1YmxpYyBjaGFuZ2UoZXZlbnQpe1xuICAgICAqICAgIGFsZXJ0KFwiVGhlIHZhbHVlIGhhcyBiZWVuIGNoYW5nZWQhXCIpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1zbGlkZXIgKGRyYWdGaW5pc2hlZCk9XCJjaGFuZ2UoJGV2ZW50KVwiICNzbGlkZXIgWyhuZ01vZGVsKV09XCJ0YXNrLnBlcmNlbnRDb21wbGV0ZWRcIiBbc3RlcF09XCI1XCI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGRyYWdGaW5pc2hlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyIHwgSVJhbmdlU2xpZGVyVmFsdWU+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgndGlja3MnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByaXZhdGUgdGlja3M6IEVsZW1lbnRSZWY7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQFZpZXdDaGlsZHJlbihJZ3hTbGlkZXJUaHVtYkNvbXBvbmVudClcbiAgICBwcml2YXRlIHRodW1iczogUXVlcnlMaXN0PElneFNsaWRlclRodW1iQ29tcG9uZW50PiA9IG5ldyBRdWVyeUxpc3Q8SWd4U2xpZGVyVGh1bWJDb21wb25lbnQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQFZpZXdDaGlsZHJlbihJZ3hUaHVtYkxhYmVsQ29tcG9uZW50KVxuICAgIHByaXZhdGUgbGFiZWxSZWZzOiBRdWVyeUxpc3Q8SWd4VGh1bWJMYWJlbENvbXBvbmVudD4gPSBuZXcgUXVlcnlMaXN0PElneFRodW1iTGFiZWxDb21wb25lbnQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG9uUGFuOiBTdWJqZWN0PG51bWJlcj4gPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHN0ZXBEaXN0YW5jZTogbnVtYmVyO1xuXG4gICAgLy8gTGltaXQgaGFuZGxlIHRyYXZlbCB6b25lXG4gICAgcHJpdmF0ZSBfcE1pbiA9IDA7XG4gICAgcHJpdmF0ZSBfcE1heCA9IDE7XG5cbiAgICAvLyBGcm9tL3VwcGVyVmFsdWUgaW4gcGVyY2VudCB2YWx1ZXNcbiAgICBwcml2YXRlIF9oYXNWaWV3SW5pdCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX21pblZhbHVlID0gMDtcbiAgICBwcml2YXRlIF9tYXhWYWx1ZSA9IDEwMDtcbiAgICBwcml2YXRlIF9sb3dlckJvdW5kOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfdXBwZXJCb3VuZDogbnVtYmVyO1xuICAgIHByaXZhdGUgX2xvd2VyVmFsdWU6IG51bWJlcjtcbiAgICBwcml2YXRlIF91cHBlclZhbHVlOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfY29udGludW91cyA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2Rpc2FibGVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfc3RlcCA9IDE7XG4gICAgcHJpdmF0ZSBfdmFsdWU6IG51bWJlciB8IElSYW5nZVNsaWRlclZhbHVlID0gMDtcblxuICAgIC8vIHRpY2tzXG4gICAgcHJpdmF0ZSBfcHJpbWFyeVRpY2tzID0gMDtcbiAgICBwcml2YXRlIF9zZWNvbmRhcnlUaWNrcyA9IDA7XG5cbiAgICBwcml2YXRlIF9sYWJlbHMgPSBuZXcgQXJyYXk8bnVtYmVyIHwgc3RyaW5nIHwgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQ+KCk7XG4gICAgcHJpdmF0ZSBfdHlwZTogSWd4U2xpZGVyVHlwZSA9IElneFNsaWRlclR5cGUuU0xJREVSO1xuXG4gICAgcHJpdmF0ZSBfZGVzdHJveWVyJCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG4gICAgcHJpdmF0ZSBfaW5kaWNhdG9yc0Rlc3Ryb3llciQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICAgIHByaXZhdGUgX2luZGljYXRvcnNUaW1lcjogT2JzZXJ2YWJsZTxhbnk+O1xuXG4gICAgcHJpdmF0ZSBfb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9IG5vb3A7XG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSBub29wO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgX2VsOiBFbGVtZW50UmVmLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgX2NkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBfbmdab25lOiBOZ1pvbmUsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBfZGlyOiBJZ3hEaXJlY3Rpb25hbGl0eSkge1xuICAgICAgICB0aGlzLnN0ZXBEaXN0YW5jZSA9IHRoaXMuX3N0ZXA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25Qb2ludGVyRG93bigkZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xuICAgICAgICB0aGlzLmZpbmRDbG9zZXN0VGh1bWIoJGV2ZW50KTtcblxuICAgICAgICBpZiAoIXRoaXMudGh1bWJUby5pc0FjdGl2ZSAmJiB0aGlzLnRodW1iRnJvbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhY3RpdmVUaHVtYiA9IHRoaXMudGh1bWJUby5pc0FjdGl2ZSA/IHRoaXMudGh1bWJUbyA6IHRoaXMudGh1bWJGcm9tO1xuICAgICAgICBhY3RpdmVUaHVtYi5uYXRpdmVFbGVtZW50LnNldFBvaW50ZXJDYXB0dXJlKCRldmVudC5wb2ludGVySWQpO1xuICAgICAgICB0aGlzLnNob3dTbGlkZXJJbmRpY2F0b3JzKCk7XG5cbiAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcigncG9pbnRlcnVwJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25Qb2ludGVyVXAoJGV2ZW50OiBQb2ludGVyRXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRodW1iVG8uaXNBY3RpdmUgJiYgdGhpcy50aHVtYkZyb20gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWN0aXZlVGh1bWIgPSB0aGlzLnRodW1iVG8uaXNBY3RpdmUgPyB0aGlzLnRodW1iVG8gOiB0aGlzLnRodW1iRnJvbTtcbiAgICAgICAgYWN0aXZlVGh1bWIubmF0aXZlRWxlbWVudC5yZWxlYXNlUG9pbnRlckNhcHR1cmUoJGV2ZW50LnBvaW50ZXJJZCk7XG5cbiAgICAgICAgdGhpcy5oaWRlU2xpZGVySW5kaWNhdG9ycygpO1xuICAgICAgICB0aGlzLmRyYWdGaW5pc2hlZC5lbWl0KHRoaXMudmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdmb2N1cycpXG4gICAgcHVibGljIG9uRm9jdXMoKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlU2xpZGVySW5kaWNhdG9ycygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdwYW4nLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvblBhbkxpc3RlbmVyKCRldmVudCkge1xuICAgICAgICB0aGlzLnVwZGF0ZSgkZXZlbnQuc3JjRXZlbnQuY2xpZW50WCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBgSWd4U2xpZGVyQ29tcG9uZW50YCB0eXBlIGlzIFJBTkdFLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAgQFZpZXdDaGlsZChcInNsaWRlclwiKVxuICAgICAqIHB1YmxpYyBzbGlkZXI6IElneFNsaWRlckNvbXBvbmVudDtcbiAgICAgKiBuZ0FmdGVyVmlld0luaXQoKXtcbiAgICAgKiAgICAgbGV0IHNsaWRlclJhbmdlID0gdGhpcy5zbGlkZXIuaXNSYW5nZTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc1JhbmdlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlID09PSBJZ3hTbGlkZXJUeXBlLlJBTkdFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGxvd2VyIHZhbHVlIG9mIGEgUkFOR0UgYElneFNsaWRlckNvbXBvbmVudGAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIEBWaWV3Q2hpbGQoXCJzbGlkZXJcIilcbiAgICAgKiBwdWJsaWMgc2xpZGVyOiBJZ3hTbGlkZXJDb21wb25lbnQ7XG4gICAgICogcHVibGljIGxvd1ZhbHVlKGV2ZW50KXtcbiAgICAgKiAgICBsZXQgc2xpZGVyTG93VmFsdWUgPSB0aGlzLnNsaWRlci5sb3dlclZhbHVlO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGxvd2VyVmFsdWUoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4odGhpcy5fbG93ZXJWYWx1ZSkgJiYgdGhpcy5fbG93ZXJWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuX2xvd2VyVmFsdWUgPj0gdGhpcy5sb3dlckJvdW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbG93ZXJWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmxvd2VyQm91bmQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbG93ZXIgdmFsdWUgb2YgYSBSQU5HRSBgSWd4U2xpZGVyQ29tcG9uZW50YC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZChcInNsaWRlclwiKVxuICAgICAqIHB1YmxpYyBzbGlkZXI6IElneFNsaWRlckNvbXBvbmVudDtcbiAgICAgKiBwdWJsaWMgbG93VmFsdWUoZXZlbnQpe1xuICAgICAqICAgIHRoaXMuc2xpZGVyLmxvd2VyVmFsdWUgPSB2YWx1ZTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGxvd2VyVmFsdWUodmFsdWU6IG51bWJlcikge1xuICAgICAgICBjb25zdCBhZGp1c3RlZFZhbHVlID0gdGhpcy52YWx1ZUluUmFuZ2UodmFsdWUsIHRoaXMubG93ZXJCb3VuZCwgdGhpcy51cHBlckJvdW5kKTtcbiAgICAgICAgaWYgKHRoaXMuX2xvd2VyVmFsdWUgIT09IGFkanVzdGVkVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvd2VyVmFsdWUgPSBhZGp1c3RlZFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5sb3dlclZhbHVlQ2hhbmdlLmVtaXQodGhpcy5fbG93ZXJWYWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0geyBsb3dlcjogdGhpcy5fbG93ZXJWYWx1ZSwgdXBwZXI6IHRoaXMuX3VwcGVyVmFsdWUgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHVwcGVyIHZhbHVlIG9mIGEgUkFOR0UgYElneFNsaWRlckNvbXBvbmVudGAuXG4gICAgICogUmV0dXJucyBgdmFsdWVgIG9mIGEgU0xJREVSIGBJZ3hTbGlkZXJDb21wb25lbnRgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICBAVmlld0NoaWxkKFwic2xpZGVyMlwiKVxuICAgICAqIHB1YmxpYyBzbGlkZXI6IElneFNsaWRlckNvbXBvbmVudDtcbiAgICAgKiBwdWJsaWMgdXBwZXJWYWx1ZShldmVudCl7XG4gICAgICogICAgIGxldCB1cHBlclZhbHVlID0gdGhpcy5zbGlkZXIudXBwZXJWYWx1ZTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCB1cHBlclZhbHVlKCkge1xuICAgICAgICBpZiAoIU51bWJlci5pc05hTih0aGlzLl91cHBlclZhbHVlKSAmJiB0aGlzLl91cHBlclZhbHVlICE9PSB1bmRlZmluZWQgJiYgdGhpcy5fdXBwZXJWYWx1ZSA8PSB0aGlzLnVwcGVyQm91bmQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91cHBlclZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudXBwZXJCb3VuZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB1cHBlciB2YWx1ZSBvZiBhIFJBTkdFIGBJZ3hTbGlkZXJDb21wb25lbnRgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAgQFZpZXdDaGlsZChcInNsaWRlcjJcIilcbiAgICAgKiBwdWJsaWMgc2xpZGVyOiBJZ3hTbGlkZXJDb21wb25lbnQ7XG4gICAgICogcHVibGljIHVwcGVyVmFsdWUoZXZlbnQpe1xuICAgICAqICAgICB0aGlzLnNsaWRlci51cHBlclZhbHVlID0gdmFsdWU7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCB1cHBlclZhbHVlKHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgYWRqdXN0ZWRWYWx1ZSA9IHRoaXMudmFsdWVJblJhbmdlKHZhbHVlLCB0aGlzLmxvd2VyQm91bmQsIHRoaXMudXBwZXJCb3VuZCk7XG4gICAgICAgIGlmICh0aGlzLl91cHBlclZhbHVlICE9PSBhZGp1c3RlZFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl91cHBlclZhbHVlID0gYWRqdXN0ZWRWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMudXBwZXJWYWx1ZUNoYW5nZS5lbWl0KHRoaXMuX3VwcGVyVmFsdWUpO1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHsgbG93ZXI6IHRoaXMuX2xvd2VyVmFsdWUsIHVwcGVyOiB0aGlzLl91cHBlclZhbHVlIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRoZSBsb3dlciBsYWJlbC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZChcInNsaWRlclwiKVxuICAgICAqIHB1YmxpYyBzbGlkZXI6IElneFNsaWRlckNvbXBvbmVudDtcbiAgICAgKiBsZXQgbGFiZWwgPSB0aGlzLnNsaWRlci5sb3dlckxhYmVsO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbG93ZXJMYWJlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGFiZWxzVmlld0VuYWJsZWQgPyB0aGlzLmxhYmVsc1t0aGlzLmxvd2VyVmFsdWVdIDogdGhpcy5sb3dlclZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdGhlIHVwcGVyIGxhYmVsLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKFwic2xpZGVyXCIpXG4gICAgICogcHVibGljIHNsaWRlcjogSWd4U2xpZGVyQ29tcG9uZW50O1xuICAgICAqIGxldCBsYWJlbCA9IHRoaXMuc2xpZGVyLnVwcGVyTGFiZWw7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCB1cHBlckxhYmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYWJlbHNWaWV3RW5hYmxlZCA/IHRoaXMubGFiZWxzW3RoaXMudXBwZXJWYWx1ZV0gOiB0aGlzLnVwcGVyVmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiBsYWJlbCB2aWV3IGlzIGVuYWJsZWQuXG4gICAgICogSWYgdGhlIHtAbGluayBsYWJlbHN9IGlzIHNldCwgdGhlIHZpZXcgaXMgYXV0b21hdGljYWxseSBhY3RpdmF0ZWQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIEBWaWV3Q2hpbGQoXCJzbGlkZXJcIilcbiAgICAgKiBwdWJsaWMgc2xpZGVyOiBJZ3hTbGlkZXJDb21wb25lbnQ7XG4gICAgICogbGV0IGxhYmVsVmlldyA9IHRoaXMuc2xpZGVyLmxhYmVsc1ZpZXdFbmFibGVkO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbGFiZWxzVmlld0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhISh0aGlzLmxhYmVscyAmJiB0aGlzLmxhYmVscy5sZW5ndGggPiAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaG93VG9wVGlja3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRpY2tzT3JpZW50YXRpb24gPT09IFRpY2tzT3JpZW50YXRpb24uVG9wIHx8XG4gICAgICAgICAgICB0aGlzLnRpY2tzT3JpZW50YXRpb24gPT09IFRpY2tzT3JpZW50YXRpb24uTWlycm9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNob3dCb3R0b21UaWNrcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGlja3NPcmllbnRhdGlvbiA9PT0gVGlja3NPcmllbnRhdGlvbi5Cb3R0b20gfHxcbiAgICAgICAgICAgIHRoaXMudGlja3NPcmllbnRhdGlvbiA9PT0gVGlja3NPcmllbnRhdGlvbi5NaXJyb3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzLm1pblZhbHVlICYmIGNoYW5nZXMubWF4VmFsdWUgJiZcbiAgICAgICAgICAgIGNoYW5nZXMubWluVmFsdWUuY3VycmVudFZhbHVlIDwgY2hhbmdlcy5tYXhWYWx1ZS5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX21heFZhbHVlID0gY2hhbmdlcy5tYXhWYWx1ZS5jdXJyZW50VmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9taW5WYWx1ZSA9IGNoYW5nZXMubWluVmFsdWUuY3VycmVudFZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXMuc3RlcCAmJiBjaGFuZ2VzLnN0ZXAuaXNGaXJzdENoYW5nZSgpKSB7XG4gICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZUJ5U3RlcCh0aGlzLl92YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogaWYge0BsaW5rIFNsaWRlclR5cGUuU0xJREVSfSB0aGFuIHRoZSBpbml0aWFsIHZhbHVlIHNob2xkIGJlIHRoZSBsb3dlc3Qgb25lLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKCF0aGlzLmlzUmFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwcGVyVmFsdWUgPSB0aGlzLmxvd2VyQm91bmQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdHJhY2sgdHJhdmVsIHpvbmVcbiAgICAgICAgdGhpcy5fcE1pbiA9IHRoaXMudmFsdWVUb0ZyYWN0aW9uKHRoaXMubG93ZXJCb3VuZCkgfHwgMDtcbiAgICAgICAgdGhpcy5fcE1heCA9IHRoaXMudmFsdWVUb0ZyYWN0aW9uKHRoaXMudXBwZXJCb3VuZCkgfHwgMTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgICAgICB0aGlzLnNldFZhbHVlKHRoaXMuX3ZhbHVlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMuX2hhc1ZpZXdJbml0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zdGVwRGlzdGFuY2UgPSB0aGlzLmNhbGN1bGF0ZVN0ZXBEaXN0YW5jZSgpO1xuICAgICAgICB0aGlzLnBvc2l0aW9uSGFuZGxlcnNBbmRVcGRhdGVUcmFjaygpO1xuICAgICAgICB0aGlzLnNldFRpY2tJbnRlcnZhbCgpO1xuICAgICAgICB0aGlzLmNoYW5nZVRodW1iRm9jdXNhYmxlU3RhdGUodGhpcy5kaXNhYmxlZCk7XG5cbiAgICAgICAgdGhpcy5zdWJzY3JpYmVUbyh0aGlzLnRodW1iRnJvbSwgdGhpcy50aHVtYkNoYW5nZWQuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlVG8odGhpcy50aHVtYlRvLCB0aGlzLnRodW1iQ2hhbmdlZC5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLnRodW1icy5jaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llciQpKS5zdWJzY3JpYmUoY2hhbmdlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRodW1iRnJvbSA9IGNoYW5nZS5maW5kKCh0aHVtYjogSWd4U2xpZGVyVGh1bWJDb21wb25lbnQpID0+IHRodW1iLnR5cGUgPT09IFNsaWRlckhhbmRsZS5GUk9NKTtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25IYW5kbGVyKHRodW1iRnJvbSwgbnVsbCwgdGhpcy5sb3dlclZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlVG8odGh1bWJGcm9tLCB0aGlzLnRodW1iQ2hhbmdlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlVGh1bWJGb2N1c2FibGVTdGF0ZSh0aGlzLmRpc2FibGVkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5sYWJlbFJlZnMuY2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZXIkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsRnJvbSA9IHRoaXMubGFiZWxSZWZzLmZpbmQoKGxhYmVsOiBJZ3hUaHVtYkxhYmVsQ29tcG9uZW50KSA9PiBsYWJlbC50eXBlID09PSBTbGlkZXJIYW5kbGUuRlJPTSk7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uSGFuZGxlcihudWxsLCBsYWJlbEZyb20sIHRoaXMubG93ZXJWYWx1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICByZXNpemVPYnNlcnZhYmxlKHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQpLnBpcGUoXG4gICAgICAgICAgICAgICAgdGhyb3R0bGVUaW1lKDQwKSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveWVyJCkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGVwRGlzdGFuY2UgPSB0aGlzLmNhbGN1bGF0ZVN0ZXBEaXN0YW5jZSgpO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5fZGVzdHJveWVyJC5uZXh0KHRydWUpO1xuICAgICAgICB0aGlzLl9kZXN0cm95ZXIkLmNvbXBsZXRlKCk7XG5cbiAgICAgICAgdGhpcy5faW5kaWNhdG9yc0Rlc3Ryb3llciQubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5faW5kaWNhdG9yc0Rlc3Ryb3llciQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IElSYW5nZVNsaWRlclZhbHVlIHwgbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzTnVsbGlzaEJ1dE5vdFplcm8odmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5vcm1hbGl6ZUJ5U3RlcCh2YWx1ZSk7XG4gICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5fdmFsdWUsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbkhhbmRsZXJzQW5kVXBkYXRlVHJhY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrID0gZm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrID0gZm47XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgZ2V0RWRpdEVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzUmFuZ2UgPyB0aGlzLnRodW1iRnJvbS5uYXRpdmVFbGVtZW50IDogdGhpcy50aHVtYlRvLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZShtb3VzZVgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBUby9Gcm9tIFZhbHVlc1xuICAgICAgICB0aGlzLm9uUGFuLm5leHQobW91c2VYKTtcblxuICAgICAgICAvLyBGaW5hbGx5IGRvIHBvc2l0aW9uSGFuZGxlcnNBbmRVcGRhdGVUcmFjayB0aGUgRE9NXG4gICAgICAgIC8vIGJhc2VkIG9uIGRhdGEgdmFsdWVzXG4gICAgICAgIHRoaXMucG9zaXRpb25IYW5kbGVyc0FuZFVwZGF0ZVRyYWNrKCk7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyB0aHVtYkNoYW5nZWQodmFsdWU6IG51bWJlciwgdGh1bWJUeXBlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLnZhbHVlO1xuXG4gICAgICAgIGlmICh0aGlzLmlzUmFuZ2UpIHtcbiAgICAgICAgICAgIGlmICh0aHVtYlR5cGUgPT09IFNsaWRlckhhbmRsZS5GUk9NKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubG93ZXJWYWx1ZSArIHZhbHVlID4gdGhpcy51cHBlclZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBwZXJWYWx1ZSA9IHRoaXMubG93ZXJWYWx1ZSArIHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmxvd2VyVmFsdWUgKz0gdmFsdWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnVwcGVyVmFsdWUgKyB2YWx1ZSA8IHRoaXMubG93ZXJWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvd2VyVmFsdWUgPSB0aGlzLnVwcGVyVmFsdWUgKyB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy51cHBlclZhbHVlICs9IHZhbHVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBuZXdWYWw6IElSYW5nZVNsaWRlclZhbHVlID0ge1xuICAgICAgICAgICAgICAgIGxvd2VyOiB0aGlzLmxvd2VyVmFsdWUsXG4gICAgICAgICAgICAgICAgdXBwZXI6IHRoaXMudXBwZXJWYWx1ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTd2FwIHRoZSB0aHVtYnMgaWYgYSBjb2xsaXNpb24gYXBwZWFycy5cbiAgICAgICAgICAgIC8vIGlmIChuZXdWYWwubG93ZXIgPT0gbmV3VmFsLnVwcGVyKSB7XG4gICAgICAgICAgICAvLyAgICAgdGhpcy50b2dnbGVUaHVtYigpO1xuICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gbmV3VmFsO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXdWYWwgPSAodGhpcy52YWx1ZSBhcyBudW1iZXIpICsgdmFsdWU7XG4gICAgICAgICAgICBpZiAobmV3VmFsID49IHRoaXMubG93ZXJCb3VuZCAmJiBuZXdWYWwgPD0gdGhpcy51cHBlckJvdW5kKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc1ZhbHVlQ2hhbmdlZChvbGRWYWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdFZhbHVlQ2hhbmdlKG9sZFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25UaHVtYkNoYW5nZSgpIHtcbiAgICAgICAgdGhpcy50b2dnbGVTbGlkZXJJbmRpY2F0b3JzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBvbkhvdmVyQ2hhbmdlKHN0YXRlOiBib29sZWFuKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZSA/IHRoaXMuc2hvd1NsaWRlckluZGljYXRvcnMoKSA6IHRoaXMuaGlkZVNsaWRlckluZGljYXRvcnMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0VmFsdWUodmFsdWU6IG51bWJlciB8IElSYW5nZVNsaWRlclZhbHVlLCB0cmlnZ2VyQ2hhbmdlOiBib29sZWFuKSB7XG4gICAgICAgIGxldCByZXM7XG4gICAgICAgIGlmICghdGhpcy5pc1JhbmdlKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlIGFzIG51bWJlcjtcbiAgICAgICAgICAgIGlmICghaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBwZXJWYWx1ZSA9IHZhbHVlIC0gdmFsdWUgJSB0aGlzLnN0ZXA7XG4gICAgICAgICAgICAgICAgcmVzID0gdGhpcy51cHBlclZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnZhbGlkYXRlSW5pdGlhbFZhbHVlKHZhbHVlIGFzIElSYW5nZVNsaWRlclZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuX3VwcGVyVmFsdWUgPSB2YWx1ZS51cHBlcjtcbiAgICAgICAgICAgIHRoaXMuX2xvd2VyVmFsdWUgPSB2YWx1ZS5sb3dlcjtcbiAgICAgICAgICAgIHJlcyA9IHsgbG93ZXI6IHRoaXMubG93ZXJWYWx1ZSwgdXBwZXI6IHRoaXMudXBwZXJWYWx1ZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRyaWdnZXJDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2socmVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdmFsaWRhdGVJbml0aWFsVmFsdWUodmFsdWU6IElSYW5nZVNsaWRlclZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZS51cHBlciA8IHZhbHVlLmxvd2VyKSB7XG4gICAgICAgICAgICBjb25zdCB0ZW1wID0gdmFsdWUudXBwZXI7XG4gICAgICAgICAgICB2YWx1ZS51cHBlciA9IHZhbHVlLmxvd2VyO1xuICAgICAgICAgICAgdmFsdWUubG93ZXIgPSB0ZW1wO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlLmxvd2VyIDwgdGhpcy5sb3dlckJvdW5kKSB7XG4gICAgICAgICAgICB2YWx1ZS5sb3dlciA9IHRoaXMubG93ZXJCb3VuZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZS51cHBlciA+IHRoaXMudXBwZXJCb3VuZCkge1xuICAgICAgICAgICAgdmFsdWUudXBwZXIgPSB0aGlzLnVwcGVyQm91bmQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kQ2xvc2VzdFRodW1iKGV2ZW50OiBQb2ludGVyRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNSYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZXN0SGFuZGxlKGV2ZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudGh1bWJUby5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZShldmVudC5jbGllbnRYKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUxvd2VyQm91bmRBbmRNaW5UcmF2ZWxab25lKCkge1xuICAgICAgICB0aGlzLmxvd2VyQm91bmQgPSB0aGlzLm1pblZhbHVlO1xuICAgICAgICB0aGlzLl9wTWluID0gMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVVwcGVyQm91bmRBbmRNYXhUcmF2ZWxab25lKCkge1xuICAgICAgICB0aGlzLnVwcGVyQm91bmQgPSB0aGlzLm1heFZhbHVlO1xuICAgICAgICB0aGlzLl9wTWF4ID0gMTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNhbGN1bGF0ZVN0ZXBEaXN0YW5jZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLyAodGhpcy5tYXhWYWx1ZSAtIHRoaXMubWluVmFsdWUpICogdGhpcy5zdGVwO1xuICAgIH1cblxuICAgIC8vIHByaXZhdGUgdG9nZ2xlVGh1bWIoKSB7XG4gICAgLy8gICAgIHJldHVybiB0aGlzLnRodW1iRnJvbS5pc0FjdGl2ZSA/XG4gICAgLy8gICAgICAgICB0aGlzLnRodW1iVG8ubmF0aXZlRWxlbWVudC5mb2N1cygpIDpcbiAgICAvLyAgICAgICAgIHRoaXMudGh1bWJGcm9tLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAvLyB9XG5cbiAgICBwcml2YXRlIHZhbHVlSW5SYW5nZSh2YWx1ZSwgbWluID0gMCwgbWF4ID0gMTAwKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heChNYXRoLm1pbih2YWx1ZSwgbWF4KSwgbWluKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBvc2l0aW9uSGFuZGxlcih0aHVtYkhhbmRsZTogRWxlbWVudFJlZiwgbGFiZWxIYW5kbGU6IEVsZW1lbnRSZWYsIHBvc2l0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgcGVyY2VudCA9IGAke3RoaXMudmFsdWVUb0ZyYWN0aW9uKHBvc2l0aW9uKSAqIDEwMH0lYDtcbiAgICAgICAgY29uc3QgZGlyID0gdGhpcy5fZGlyLnJ0bCA/ICdyaWdodCcgOiAnbGVmdCc7XG5cbiAgICAgICAgaWYgKHRodW1iSGFuZGxlKSB7XG4gICAgICAgICAgICB0aHVtYkhhbmRsZS5uYXRpdmVFbGVtZW50LnN0eWxlW2Rpcl0gPSBwZXJjZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxhYmVsSGFuZGxlKSB7XG4gICAgICAgICAgICBsYWJlbEhhbmRsZS5uYXRpdmVFbGVtZW50LnN0eWxlW2Rpcl0gPSBwZXJjZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwb3NpdGlvbkhhbmRsZXJzQW5kVXBkYXRlVHJhY2soKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1JhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uSGFuZGxlcih0aGlzLnRodW1iVG8sIHRoaXMubGFiZWxUbywgdGhpcy52YWx1ZSBhcyBudW1iZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkhhbmRsZXIodGhpcy50aHVtYlRvLCB0aGlzLmxhYmVsVG8sICh0aGlzLnZhbHVlIGFzIElSYW5nZVNsaWRlclZhbHVlKS51cHBlcik7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uSGFuZGxlcih0aGlzLnRodW1iRnJvbSwgdGhpcy5sYWJlbEZyb20sICh0aGlzLnZhbHVlIGFzIElSYW5nZVNsaWRlclZhbHVlKS5sb3dlcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5faGFzVmlld0luaXQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVHJhY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY2xvc2VzdEhhbmRsZShldmVudDogUG9pbnRlckV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGZyb21PZmZzZXQgPSB0aGlzLnRodW1iRnJvbS5uYXRpdmVFbGVtZW50Lm9mZnNldExlZnQgKyB0aGlzLnRodW1iRnJvbS5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoIC8gMjtcbiAgICAgICAgY29uc3QgdG9PZmZzZXQgPSB0aGlzLnRodW1iVG8ubmF0aXZlRWxlbWVudC5vZmZzZXRMZWZ0ICsgdGhpcy50aHVtYlRvLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggLyAyO1xuICAgICAgICBjb25zdCB4UG9pbnRlciA9IGV2ZW50LmNsaWVudFggLSB0aGlzLl9lbC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy5jbG9zZXN0VG8oeFBvaW50ZXIsIFtmcm9tT2Zmc2V0LCB0b09mZnNldF0pO1xuXG4gICAgICAgIGlmIChmcm9tT2Zmc2V0ID09PSB0b09mZnNldCAmJiB0b09mZnNldCA8IHhQb2ludGVyKSB7XG4gICAgICAgICAgICB0aGlzLnRodW1iVG8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9IGVsc2UgaWYgKGZyb21PZmZzZXQgPT09IHRvT2Zmc2V0ICYmIHRvT2Zmc2V0ID4geFBvaW50ZXIpIHtcbiAgICAgICAgICAgIHRoaXMudGh1bWJGcm9tLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIGlmIChtYXRjaCA9PT0gZnJvbU9mZnNldCkge1xuICAgICAgICAgICAgdGhpcy50aHVtYkZyb20ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50aHVtYlRvLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0VGlja0ludGVydmFsKCkge1xuICAgICAgICBsZXQgaW50ZXJ2YWw7XG4gICAgICAgIGNvbnN0IHRyYWNrUHJvZ3Jlc3MgPSAxMDA7XG5cbiAgICAgICAgaWYgKHRoaXMubGFiZWxzVmlld0VuYWJsZWQpIHtcbiAgICAgICAgICAgIC8vIENhbGMgdGlja3MgZGVwZW5kaW5nIG9uIHRoZSBsYWJlbHMgbGVuZ3RoO1xuICAgICAgICAgICAgaW50ZXJ2YWwgPSAoKHRyYWNrUHJvZ3Jlc3MgLyAodGhpcy5sYWJlbHMubGVuZ3RoIC0gMSkgKiAxMCkpIC8gMTA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0cmFja1JhbmdlID0gdGhpcy5tYXhWYWx1ZSAtIHRoaXMubWluVmFsdWU7XG4gICAgICAgICAgICBpbnRlcnZhbCA9IHRoaXMuc3RlcCA+IDEgP1xuICAgICAgICAgICAgICAgICh0cmFja1Byb2dyZXNzIC8gKCh0cmFja1JhbmdlIC8gdGhpcy5zdGVwKSkgKiAxMCkgLyAxMFxuICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50aWNrcy5uYXRpdmVFbGVtZW50LCAnc3Ryb2tlLWRhc2hhcnJheScsIGAwLCAke2ludGVydmFsICogTWF0aC5zcXJ0KDIpfSVgKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRpY2tzLm5hdGl2ZUVsZW1lbnQsICd2aXNpYmlsaXR5JywgdGhpcy5jb250aW51b3VzIHx8IGludGVydmFsID09PSBudWxsID8gJ2hpZGRlbicgOiAndmlzaWJsZScpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2hvd1NsaWRlckluZGljYXRvcnMoKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5faW5kaWNhdG9yc1RpbWVyKSB7XG4gICAgICAgICAgICB0aGlzLl9pbmRpY2F0b3JzRGVzdHJveWVyJC5uZXh0KHRydWUpO1xuICAgICAgICAgICAgdGhpcy5faW5kaWNhdG9yc1RpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGh1bWJUby5zaG93VGh1bWJJbmRpY2F0b3JzKCk7XG4gICAgICAgIHRoaXMubGFiZWxUby5hY3RpdmUgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy50aHVtYkZyb20pIHtcbiAgICAgICAgICAgIHRoaXMudGh1bWJGcm9tLnNob3dUaHVtYkluZGljYXRvcnMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxhYmVsRnJvbSkge1xuICAgICAgICAgICAgdGhpcy5sYWJlbEZyb20uYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoaWRlU2xpZGVySW5kaWNhdG9ycygpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2luZGljYXRvcnNUaW1lciA9IHRpbWVyKHRoaXMudGh1bWJMYWJlbFZpc2liaWxpdHlEdXJhdGlvbik7XG4gICAgICAgIHRoaXMuX2luZGljYXRvcnNUaW1lci5waXBlKHRha2VVbnRpbCh0aGlzLl9pbmRpY2F0b3JzRGVzdHJveWVyJCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRodW1iVG8uaGlkZVRodW1iSW5kaWNhdG9ycygpO1xuICAgICAgICAgICAgdGhpcy5sYWJlbFRvLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHRoaXMudGh1bWJGcm9tKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50aHVtYkZyb20uaGlkZVRodW1iSW5kaWNhdG9ycygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5sYWJlbEZyb20pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVsRnJvbS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGVTbGlkZXJJbmRpY2F0b3JzKCkge1xuICAgICAgICB0aGlzLnNob3dTbGlkZXJJbmRpY2F0b3JzKCk7XG4gICAgICAgIHRoaXMuaGlkZVNsaWRlckluZGljYXRvcnMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoYW5nZVRodW1iRm9jdXNhYmxlU3RhdGUoc3RhdGU6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBzdGF0ZSA/IC0xIDogMTtcblxuICAgICAgICBpZiAodGhpcy5pc1JhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLnRodW1iRnJvbS50YWJpbmRleCA9IHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50aHVtYlRvLnRhYmluZGV4ID0gdmFsdWU7XG5cbiAgICAgICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsb3Nlc3RUbyhnb2FsOiBudW1iZXIsIHBvc2l0aW9uczogbnVtYmVyW10pOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gcG9zaXRpb25zLnJlZHVjZSgocHJldmlvdXMsIGN1cnJlbnQpID0+IChNYXRoLmFicyhnb2FsIC0gY3VycmVudCkgPCBNYXRoLmFicyhnb2FsIC0gcHJldmlvdXMpID8gY3VycmVudCA6IHByZXZpb3VzKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2YWx1ZVRvRnJhY3Rpb24odmFsdWU6IG51bWJlciwgcE1pbiA9IHRoaXMuX3BNaW4sIHBNYXggPSB0aGlzLl9wTWF4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlSW5SYW5nZSgodmFsdWUgLSB0aGlzLm1pblZhbHVlKSAvICh0aGlzLm1heFZhbHVlIC0gdGhpcy5taW5WYWx1ZSksIHBNaW4sIHBNYXgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNOdWxsaXNoQnV0Tm90WmVybyh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdmFsdWUgJiYgdmFsdWUgIT09IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE5vcm1hbGl60LUgdGhlIHZhbHVlIHdoZW4gdHdvLXdheSBkYXRhIGJpbmQgaXMgdXNlZCBhbmQge0BsaW5rIHRoaXMuc3RlcH0gaXMgc2V0LlxuICAgICAqIEBwYXJhbSB2YWx1ZVxuICAgICAqL1xuICAgIHByaXZhdGUgbm9ybWFsaXplQnlTdGVwKHZhbHVlOiBJUmFuZ2VTbGlkZXJWYWx1ZSB8IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy5pc1JhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLl92YWx1ZSA9IHtcbiAgICAgICAgICAgICAgICBsb3dlcjogKHZhbHVlIGFzIElSYW5nZVNsaWRlclZhbHVlKS5sb3dlciAtICgodmFsdWUgYXMgSVJhbmdlU2xpZGVyVmFsdWUpLmxvd2VyICUgdGhpcy5zdGVwKSxcbiAgICAgICAgICAgICAgICB1cHBlcjogKHZhbHVlIGFzIElSYW5nZVNsaWRlclZhbHVlKS51cHBlciAtICgodmFsdWUgYXMgSVJhbmdlU2xpZGVyVmFsdWUpLnVwcGVyICUgdGhpcy5zdGVwKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gKHZhbHVlIGFzIG51bWJlcikgLSAoKHZhbHVlIGFzIG51bWJlcikgJSB0aGlzLnN0ZXApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVUcmFjaygpIHtcbiAgICAgICAgY29uc3QgZnJvbVBvc2l0aW9uID0gdGhpcy52YWx1ZVRvRnJhY3Rpb24odGhpcy5sb3dlclZhbHVlKTtcbiAgICAgICAgY29uc3QgdG9Qb3NpdGlvbiA9IHRoaXMudmFsdWVUb0ZyYWN0aW9uKHRoaXMudXBwZXJWYWx1ZSk7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uR2FwID0gdG9Qb3NpdGlvbiAtIGZyb21Qb3NpdGlvbjtcblxuICAgICAgICBsZXQgdHJhY2tMZWZ0SW5kZW50aW9uID0gZnJvbVBvc2l0aW9uO1xuICAgICAgICBpZiAodGhpcy5pc1JhbmdlKSB7XG4gICAgICAgICAgICBpZiAocG9zaXRpb25HYXApIHtcbiAgICAgICAgICAgICAgICB0cmFja0xlZnRJbmRlbnRpb24gPSBNYXRoLnJvdW5kKCgxIC8gcG9zaXRpb25HYXAgKiBmcm9tUG9zaXRpb24pICogMTAwKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdHJhY2tMZWZ0SW5kZW50aW9uID0gdGhpcy5fZGlyLnJ0bCA/IC10cmFja0xlZnRJbmRlbnRpb24gOiB0cmFja0xlZnRJbmRlbnRpb247XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudHJhY2tSZWYubmF0aXZlRWxlbWVudCwgJ3RyYW5zZm9ybScsIGBzY2FsZVgoJHtwb3NpdGlvbkdhcH0pIHRyYW5zbGF0ZVgoJHt0cmFja0xlZnRJbmRlbnRpb259JSlgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50cmFja1JlZi5uYXRpdmVFbGVtZW50LCAndHJhbnNmb3JtJywgYHNjYWxlWCgke3RvUG9zaXRpb259KWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdWJzY3JpYmVUbyh0aHVtYjogSWd4U2xpZGVyVGh1bWJDb21wb25lbnQsIGNhbGxiYWNrOiAoYTogbnVtYmVyLCBiOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgICAgICAgaWYgKCF0aHVtYikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGh1bWIudGh1bWJWYWx1ZUNoYW5nZVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmVyKHRodW1iKSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHZhbHVlID0+IGNhbGxiYWNrKHZhbHVlLCB0aHVtYi50eXBlKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1bnN1YnNjcmliZXIodGh1bWI6IElneFNsaWRlclRodW1iQ29tcG9uZW50KSB7XG4gICAgICAgIHJldHVybiBtZXJnZSh0aGlzLl9kZXN0cm95ZXIkLCB0aHVtYi5kZXN0cm95KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc1ZhbHVlQ2hhbmdlZChvbGRWYWx1ZSkge1xuICAgICAgICBjb25zdCBpc1NsaWRlcldpdGhEaWZmZXJlbnRWYWx1ZTogYm9vbGVhbiA9ICF0aGlzLmlzUmFuZ2UgJiYgb2xkVmFsdWUgIT09IHRoaXMudmFsdWU7XG4gICAgICAgIGNvbnN0IGlzUmFuZ2VXaXRoT25lRGlmZmVyZW50VmFsdWU6IGJvb2xlYW4gPSB0aGlzLmlzUmFuZ2UgJiZcbiAgICAgICAgICAgICgob2xkVmFsdWUgYXMgSVJhbmdlU2xpZGVyVmFsdWUpLmxvd2VyICE9PSAodGhpcy52YWx1ZSBhcyBJUmFuZ2VTbGlkZXJWYWx1ZSkubG93ZXIgfHxcbiAgICAgICAgICAgICAgICAob2xkVmFsdWUgYXMgSVJhbmdlU2xpZGVyVmFsdWUpLnVwcGVyICE9PSAodGhpcy52YWx1ZSBhcyBJUmFuZ2VTbGlkZXJWYWx1ZSkudXBwZXIpO1xuXG4gICAgICAgIHJldHVybiBpc1NsaWRlcldpdGhEaWZmZXJlbnRWYWx1ZSB8fCBpc1JhbmdlV2l0aE9uZURpZmZlcmVudFZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZW1pdFZhbHVlQ2hhbmdlKG9sZFZhbHVlOiBudW1iZXIgfCBJUmFuZ2VTbGlkZXJWYWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoeyBvbGRWYWx1ZSwgdmFsdWU6IHRoaXMudmFsdWUgfSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuXG4iLCI8aWd4LXRpY2tzXG4gICAgKm5nSWY9XCJzaG93VGlja3MgJiYgc2hvd1RvcFRpY2tzXCJcbiAgICB0aWNrc09yaWVudGF0aW9uPVwidG9wXCJcbiAgICBbcHJpbWFyeVRpY2tzXT1cInByaW1hcnlUaWNrc1wiXG4gICAgW3NlY29uZGFyeVRpY2tzXT1cInNlY29uZGFyeVRpY2tzXCJcbiAgICBbcHJpbWFyeVRpY2tMYWJlbHNdPVwicHJpbWFyeVRpY2tMYWJlbHNcIlxuICAgIFtzZWNvbmRhcnlUaWNrTGFiZWxzXT1cInNlY29uZGFyeVRpY2tMYWJlbHNcIlxuICAgIFt0aWNrTGFiZWxzT3JpZW50YXRpb25dPVwidGlja0xhYmVsc09yaWVudGF0aW9uXCJcbiAgICBbbGFiZWxzVmlld0VuYWJsZWRdPVwibGFiZWxzVmlld0VuYWJsZWRcIlxuICAgIFtsYWJlbHNdPVwibGFiZWxzIHwgc3ByZWFkVGlja0xhYmVsczpzZWNvbmRhcnlUaWNrc1wiXG4gICAgW3RpY2tMYWJlbFRlbXBsYXRlUmVmXT1cInRpY2tMYWJlbFRlbXBsYXRlUmVmXCJcbiAgICBbbWluVmFsdWVdPVwibWluVmFsdWVcIlxuICAgIFttYXhWYWx1ZV09XCJtYXhWYWx1ZVwiPlxuPC9pZ3gtdGlja3M+XG48ZGl2IGNsYXNzPVwiaWd4LXNsaWRlcl9fdHJhY2tcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LXNsaWRlcl9fdHJhY2staW5hY3RpdmVcIj48L2Rpdj5cbiAgICA8ZGl2ICN0cmFjayBjbGFzcz1cImlneC1zbGlkZXJfX3RyYWNrLWZpbGxcIj48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LXNsaWRlcl9fdHJhY2stc3RlcHNcIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjEwMCVcIiBoZWlnaHQ9XCIxMDAlXCI+XG4gICAgICAgICAgPGxpbmUgI3RpY2tzIHgxPVwiMFwiIHkxPVwiMlwiIHgyPVwiMTAwJVwiIHkyPVwiMlwiPjwvbGluZT5cbiAgICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJpZ3gtc2xpZGVyX190aHVtYnNcIj5cbiAgICA8aWd4LXRodW1iLWxhYmVsXG4gICAgICAgICpuZ0lmPVwiaXNSYW5nZVwiXG4gICAgICAgIHR5cGU9XCJmcm9tXCJcbiAgICAgICAgW3ZhbHVlXT1cImxvd2VyTGFiZWxcIlxuICAgICAgICBbdGVtcGxhdGVSZWZdPVwidGh1bWJGcm9tVGVtcGxhdGVSZWZcIlxuICAgICAgICBbY29udGludW91c109XCJjb250aW51b3VzXCJcbiAgICAgICAgW2NvbnRleHRdPVwiY29udGV4dFwiXG4gICAgICAgIFtkZWFjdGl2ZVN0YXRlXT1cImRlYWN0aXZhdGVUaHVtYkxhYmVsXCJcbiAgICAgICAgW3RodW1iXT1cInRodW1iRnJvbVwiPjwvaWd4LXRodW1iLWxhYmVsPlxuXG4gICAgPGlneC10aHVtYlxuICAgICAgICAqbmdJZj1cImlzUmFuZ2VcIlxuICAgICAgICAjdGh1bWJGcm9tXG4gICAgICAgIHR5cGU9XCJmcm9tXCJcbiAgICAgICAgW3ZhbHVlXT1cImxvd2VyTGFiZWxcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICBbY29udGludW91c109XCJjb250aW51b3VzXCJcbiAgICAgICAgW29uUGFuXT1cIm9uUGFuXCJcbiAgICAgICAgW3N0ZXBEaXN0YW5jZV09XCJzdGVwRGlzdGFuY2VcIlxuICAgICAgICBbc3RlcF09XCJzdGVwXCJcbiAgICAgICAgW3RlbXBsYXRlUmVmXT1cInRodW1iRnJvbVRlbXBsYXRlUmVmXCJcbiAgICAgICAgW2NvbnRleHRdPVwiY29udGV4dFwiXG4gICAgICAgICh0aHVtYkNoYW5nZSk9XCJvblRodW1iQ2hhbmdlKClcIlxuICAgICAgICAoaG92ZXJDaGFuZ2UpPVwib25Ib3ZlckNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgW2RlYWN0aXZlU3RhdGVdPVwiZGVhY3RpdmF0ZVRodW1iTGFiZWxcIlxuICAgICAgICBbdGh1bWJMYWJlbFZpc2liaWxpdHlEdXJhdGlvbl09XCJ0aHVtYkxhYmVsVmlzaWJpbGl0eUR1cmF0aW9uXCI+PC9pZ3gtdGh1bWI+XG5cbiAgICA8aWd4LXRodW1iLWxhYmVsXG4gICAgICAgIFt2YWx1ZV09XCJ1cHBlckxhYmVsXCJcbiAgICAgICAgdHlwZT1cInRvXCJcbiAgICAgICAgW3RlbXBsYXRlUmVmXT1cInRodW1iVG9UZW1wbGF0ZVJlZlwiXG4gICAgICAgIFtjb250aW51b3VzXT1cImNvbnRpbnVvdXNcIlxuICAgICAgICBbY29udGV4dF09XCJjb250ZXh0XCJcbiAgICAgICAgW2RlYWN0aXZlU3RhdGVdPVwiZGVhY3RpdmF0ZVRodW1iTGFiZWxcIlxuICAgICAgICBbdGh1bWJdPVwidGh1bWJUb1wiPjwvaWd4LXRodW1iLWxhYmVsPlxuXG4gICAgPGlneC10aHVtYlxuICAgICAgICAjdGh1bWJUb1xuICAgICAgICB0eXBlPVwidG9cIlxuICAgICAgICBbdmFsdWVdPVwidXBwZXJMYWJlbFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIFtjb250aW51b3VzXT1cImNvbnRpbnVvdXNcIlxuICAgICAgICBbb25QYW5dPVwib25QYW5cIlxuICAgICAgICBbc3RlcERpc3RhbmNlXT1cInN0ZXBEaXN0YW5jZVwiXG4gICAgICAgIFtzdGVwXT1cInN0ZXBcIlxuICAgICAgICBbdGVtcGxhdGVSZWZdPVwidGh1bWJUb1RlbXBsYXRlUmVmXCJcbiAgICAgICAgW2NvbnRleHRdPVwiY29udGV4dFwiXG4gICAgICAgICh0aHVtYkNoYW5nZSk9XCJvblRodW1iQ2hhbmdlKClcIlxuICAgICAgICAoaG92ZXJDaGFuZ2UpPVwib25Ib3ZlckNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgW2RlYWN0aXZlU3RhdGVdPVwiZGVhY3RpdmF0ZVRodW1iTGFiZWxcIlxuICAgICAgICBbdGh1bWJMYWJlbFZpc2liaWxpdHlEdXJhdGlvbl09XCJ0aHVtYkxhYmVsVmlzaWJpbGl0eUR1cmF0aW9uXCI+PC9pZ3gtdGh1bWI+XG48L2Rpdj5cbjxpZ3gtdGlja3NcbiAgICAqbmdJZj1cInNob3dUaWNrcyAmJiBzaG93Qm90dG9tVGlja3NcIlxuICAgIHRpY2tzT3JpZW50YXRpb249XCJib3R0b21cIlxuICAgIFtwcmltYXJ5VGlja3NdPVwicHJpbWFyeVRpY2tzXCJcbiAgICBbc2Vjb25kYXJ5VGlja3NdPVwic2Vjb25kYXJ5VGlja3NcIlxuICAgIFtwcmltYXJ5VGlja0xhYmVsc109XCJwcmltYXJ5VGlja0xhYmVsc1wiXG4gICAgW3NlY29uZGFyeVRpY2tMYWJlbHNdPVwic2Vjb25kYXJ5VGlja0xhYmVsc1wiXG4gICAgW3RpY2tMYWJlbHNPcmllbnRhdGlvbl09XCJ0aWNrTGFiZWxzT3JpZW50YXRpb25cIlxuICAgIFtsYWJlbHNWaWV3RW5hYmxlZF09XCJsYWJlbHNWaWV3RW5hYmxlZFwiXG4gICAgW2xhYmVsc109XCJsYWJlbHMgfCBzcHJlYWRUaWNrTGFiZWxzOnNlY29uZGFyeVRpY2tzXCJcbiAgICBbdGlja0xhYmVsVGVtcGxhdGVSZWZdPVwidGlja0xhYmVsVGVtcGxhdGVSZWZcIlxuICAgIFttaW5WYWx1ZV09XCJtaW5WYWx1ZVwiXG4gICAgW21heFZhbHVlXT1cIm1heFZhbHVlXCI+XG48L2lneC10aWNrcz5cbiJdfQ==
1290
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9zbGlkZXIvc2xpZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9zbGlkZXIvc2xpZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQ2lELFNBQVMsRUFBRSxZQUFZLEVBQWMsWUFBWSxFQUNyRyxXQUFXLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBd0MsTUFBTSxFQUFFLFNBQVMsRUFBNEIsV0FBVyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQzVKLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBYyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWpELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3ZFLE9BQU8sRUFDSCxhQUFhLEVBQUUsNkJBQTZCLEVBQzVDLDJCQUEyQixFQUFFLDZCQUE2QixFQUFrRCxZQUFZLEVBQUUscUJBQXFCLEVBQUUsZ0JBQWdCLEVBQ3BLLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDekUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENB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QkFrREssVUFBVTtzQkFEcEIsS0FBSztnQkF3Q0ssVUFBVTtzQkFEcEIsS0FBSztnQkFxREssS0FBSztzQkFEZixLQUFLO2dCQWlCSyxZQUFZO3NCQUR0QixLQUFLO2dCQThCSyxjQUFjO3NCQUR4QixLQUFLO2dCQTJCQyxTQUFTO3NCQURmLEtBQUs7Z0JBVUMsaUJBQWlCO3NCQUR2QixLQUFLO2dCQVVDLG1CQUFtQjtzQkFEekIsS0FBSztnQkFhQyxnQkFBZ0I7c0JBRHRCLEtBQUs7Z0JBYUMscUJBQXFCO3NCQUQzQixLQUFLO2dCQXVCQyxXQUFXO3NCQURqQixNQUFNO2dCQWVDLGdCQUFnQjtzQkFEdEIsTUFBTTtnQkFlQyxnQkFBZ0I7c0JBRHRCLE1BQU07Z0JBZUYsWUFBWTtzQkFEbEIsTUFBTTtnQkFPQyxLQUFLO3NCQURaLFNBQVM7dUJBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFPNUIsTUFBTTtzQkFEYixZQUFZO3VCQUFDLHVCQUF1QjtnQkFPN0IsU0FBUztzQkFEaEIsWUFBWTt1QkFBQyxzQkFBc0I7Z0JBd0Q3QixhQUFhO3NCQURuQixZQUFZO3VCQUFDLGFBQWEsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFvQmhDLFdBQVc7c0JBRGpCLFlBQVk7dUJBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWlCOUIsT0FBTztzQkFEYixZQUFZO3VCQUFDLE9BQU87Z0JBU2QsYUFBYTtzQkFEbkIsWUFBWTt1QkFBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBZ0RwQixVQUFVO3NCQURwQixLQUFLO2dCQXdDSyxVQUFVO3NCQURwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIENvbnRlbnRDaGlsZCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLFxuICAgIEhvc3RCaW5kaW5nLCBIb3N0TGlzdGVuZXIsIElucHV0LCBOZ1pvbmUsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgUXVlcnlMaXN0LCBSZW5kZXJlcjIsIFNpbXBsZUNoYW5nZXMsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIFZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IG1lcmdlLCBub29wLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsLCB0aHJvdHRsZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBFZGl0b3JQcm92aWRlciB9IGZyb20gJy4uL2NvcmUvZWRpdC1wcm92aWRlcic7XG5pbXBvcnQgeyByZXNpemVPYnNlcnZhYmxlIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBJZ3hEaXJlY3Rpb25hbGl0eSB9IGZyb20gJy4uL3NlcnZpY2VzL2RpcmVjdGlvbi9kaXJlY3Rpb25hbGl0eSc7XG5pbXBvcnQgeyBJZ3hUaHVtYkxhYmVsQ29tcG9uZW50IH0gZnJvbSAnLi9sYWJlbC90aHVtYi1sYWJlbC5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgICBJZ3hTbGlkZXJUeXBlLCBJZ3hUaHVtYkZyb21UZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBJZ3hUaHVtYlRvVGVtcGxhdGVEaXJlY3RpdmUsIElneFRpY2tMYWJlbFRlbXBsYXRlRGlyZWN0aXZlLCBJUmFuZ2VTbGlkZXJWYWx1ZSwgSVNsaWRlclZhbHVlQ2hhbmdlRXZlbnRBcmdzLCBTbGlkZXJIYW5kbGUsIFRpY2tMYWJlbHNPcmllbnRhdGlvbiwgVGlja3NPcmllbnRhdGlvblxufSBmcm9tICcuL3NsaWRlci5jb21tb24nO1xuaW1wb3J0IHsgSWd4U2xpZGVyVGh1bWJDb21wb25lbnQgfSBmcm9tICcuL3RodW1iL3RodW1iLXNsaWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4VGlja0xhYmVsc1BpcGUgfSBmcm9tICcuL3RpY2tzL3RpY2sucGlwZSc7XG5pbXBvcnQgeyBJZ3hUaWNrc0NvbXBvbmVudCB9IGZyb20gJy4vdGlja3MvdGlja3MuY29tcG9uZW50JztcblxubGV0IE5FWFRfSUQgPSAwO1xuXG4vKipcbiAqICoqSWduaXRlIFVJIGZvciBBbmd1bGFyIFNsaWRlcioqIC1cbiAqIFtEb2N1bWVudGF0aW9uXShodHRwczovL3d3dy5pbmZyYWdpc3RpY3MuY29tL3Byb2R1Y3RzL2lnbml0ZS11aS1hbmd1bGFyL2FuZ3VsYXIvY29tcG9uZW50cy9zbGlkZXIvc2xpZGVyKVxuICpcbiAqIFRoZSBJZ25pdGUgVUkgU2xpZGVyIGFsbG93cyBzZWxlY3Rpb24gaW4gYSBnaXZlbiByYW5nZSBieSBtb3ZpbmcgdGhlIHRodW1iIGFsb25nIHRoZSB0cmFjay4gVGhlIHRyYWNrXG4gKiBjYW4gYmUgZGVmaW5lZCBhcyBjb250aW51b3VzIG9yIHN0ZXBwZWQsIGFuZCB5b3UgY2FuIGNob29zZSBiZXR3ZWVuIHNpbmdsZSBhbmQgcmFuZ2Ugc2xpZGVyIHR5cGVzLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGBodG1sXG4gKiA8aWd4LXNsaWRlciBpZD1cInNsaWRlclwiXG4gKiAgICAgICAgICAgIFttaW5WYWx1ZV09XCIwXCIgW21heFZhbHVlXT1cIjEwMFwiXG4gKiAgICAgICAgICAgIFtjb250aW51b3VzXT10cnVlIFsobmdNb2RlbCldPVwidm9sdW1lXCI+XG4gKiA8L2lneC1zbGlkZXI+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUiwgdXNlRXhpc3Rpbmc6IElneFNsaWRlckNvbXBvbmVudCwgbXVsdGk6IHRydWUgfV0sXG4gICAgc2VsZWN0b3I6ICdpZ3gtc2xpZGVyJyxcbiAgICB0ZW1wbGF0ZVVybDogJ3NsaWRlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbTmdJZiwgSWd4VGlja3NDb21wb25lbnQsIElneFRodW1iTGFiZWxDb21wb25lbnQsIElneFNsaWRlclRodW1iQ29tcG9uZW50LCBJZ3hUaWNrTGFiZWxzUGlwZV1cbn0pXG5leHBvcnQgY2xhc3MgSWd4U2xpZGVyQ29tcG9uZW50IGltcGxlbWVudHNcbiAgICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgICBFZGl0b3JQcm92aWRlcixcbiAgICBPbkluaXQsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBBZnRlckNvbnRlbnRJbml0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3kge1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRodW1iRnJvbSgpOiBJZ3hTbGlkZXJUaHVtYkNvbXBvbmVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLnRodW1icy5maW5kKHRodW1iID0+IHRodW1iLnR5cGUgPT09IFNsaWRlckhhbmRsZS5GUk9NKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCB0aHVtYlRvKCk6IElneFNsaWRlclRodW1iQ29tcG9uZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGh1bWJzLmZpbmQodGh1bWIgPT4gdGh1bWIudHlwZSA9PT0gU2xpZGVySGFuZGxlLlRPKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBsYWJlbEZyb20oKTogSWd4VGh1bWJMYWJlbENvbXBvbmVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLmxhYmVsUmVmcy5maW5kKGxhYmVsID0+IGxhYmVsLnR5cGUgPT09IFNsaWRlckhhbmRsZS5GUk9NKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBsYWJlbFRvKCk6IElneFRodW1iTGFiZWxDb21wb25lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5sYWJlbFJlZnMuZmluZChsYWJlbCA9PiBsYWJlbC50eXBlID09PSBTbGlkZXJIYW5kbGUuVE8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCd0cmFjaycsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHRyYWNrUmVmOiBFbGVtZW50UmVmO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4VGh1bWJGcm9tVGVtcGxhdGVEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgdGh1bWJGcm9tVGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hUaHVtYlRvVGVtcGxhdGVEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgdGh1bWJUb1RlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4VGlja0xhYmVsVGVtcGxhdGVEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogZmFsc2UgfSlcbiAgICBwdWJsaWMgdGlja0xhYmVsVGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKGBhdHRyLnJvbGVgKVxuICAgIHB1YmxpYyByb2xlID0gJ3NsaWRlcic7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtc2xpZGVyJylcbiAgICBwdWJsaWMgc2xpZXJDbGFzcyA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYGlkYCBhdHRyaWJ1dGUuXG4gICAgICogSWYgbm90IHByb3ZpZGVkIGl0IHdpbGwgYmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc2xpZGVyIFtpZF09XCInaWd4LXNsaWRlci0zMidcIiBbKG5nTW9kZWwpXT1cInRhc2sucGVyY2VudENvbXBsZXRlZFwiIFtzdGVwXT1cIjVcIiBbbG93ZXJCb3VuZF09XCIyMFwiPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaWQgPSBgaWd4LXNsaWRlci0ke05FWFRfSUQrK31gO1xuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgZHVyYXRpb24gdmlzaWJpbGl0eSBvZiB0aHVtYnMgbGFiZWxzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA3NTAgbWlsbGlzZWNvbmRzLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXNsaWRlciAjc2xpZGVyIFt0aHVtYkxhYmVsVmlzaWJpbGl0eUR1cmF0aW9uXT1cIjMwMDBcIiBbKG5nTW9kZWwpXT1cInRhc2sucGVyY2VudENvbXBsZXRlZFwiIFtzdGVwXT1cIjVcIj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB0aHVtYkxhYmVsVmlzaWJpbGl0eUR1cmF0aW9uID0gNzUwO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZyhgYXR0ci5hcmlhLXZhbHVlbWluYClcbiAgICBwdWJsaWMgZ2V0IHZhbHVlbWluKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taW5WYWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKGBhdHRyLmFyaWEtdmFsdWVtYXhgKVxuICAgIHB1YmxpYyBnZXQgdmFsdWVtYXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1heFZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoYGF0dHIuYXJpYS1yZWFkb25seWApXG4gICAgcHVibGljIGdldCByZWFkb25seSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXNsaWRlci0tZGlzYWJsZWQnKVxuICAgIHB1YmxpYyBnZXQgZGlzYWJsZWRDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgZ2V0cyB0aGUgdHlwZSBvZiB0aGUgYElneFNsaWRlckNvbXBvbmVudGAuXG4gICAgICogVGhlIHNsaWRlciBjYW4gYmUgSWd4U2xpZGVyVHlwZS5TTElERVIoZGVmYXVsdCkgb3IgSWd4U2xpZGVyVHlwZS5SQU5HRS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZChcInNsaWRlcjJcIilcbiAgICAgKiBwdWJsaWMgc2xpZGVyOiBJZ3hTbGlkZXJDb21wb25lbnQ7XG4gICAgICogbmdBZnRlclZpZXdJbml0KCl7XG4gICAgICogICAgIGxldCB0eXBlID0gdGhpcy5zbGlkZXIudHlwZTtcbiAgICAgKiB9XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90eXBlIGFzIElneFNsaWRlclR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgdHlwZSBvZiB0aGUgYElneFNsaWRlckNvbXBvbmVudGAuXG4gICAgICogVGhlIHNsaWRlciBjYW4gYmUgSWd4U2xpZGVyVHlwZS5TTElERVIoZGVmYXVsdCkgb3IgSWd4U2xpZGVyVHlwZS5SQU5HRS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogc2xpZGVyVHlwZTogSWd4U2xpZGVyVHlwZSA9IElneFNsaWRlclR5cGUuUkFOR0U7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc2xpZGVyICNzbGlkZXIyIFt0eXBlXT1cInNsaWRlclR5cGVcIiBbKG5nTW9kZWwpXT1cInJhbmdlVmFsdWVcIiBbbWluVmFsdWVdPVwiMFwiIFttYXhWYWx1ZV09XCIxMDBcIj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHR5cGUodHlwZTogSWd4U2xpZGVyVHlwZSkge1xuICAgICAgICB0aGlzLl90eXBlID0gdHlwZTtcblxuICAgICAgICBpZiAodHlwZSA9PT0gSWd4U2xpZGVyVHlwZS5TTElERVIpIHtcbiAgICAgICAgICAgIHRoaXMubG93ZXJWYWx1ZSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5faGFzVmlld0luaXQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVHJhY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBgbGFiZWxWaWV3YCwgYnkgYWNjZXB0aW5nIGEgY29sbGVjdGlvbiBvZiBwcmltaXRpdmUgdmFsdWVzIHdpdGggbW9yZSB0aGFuIG9uZSBlbGVtZW50LlxuICAgICAqIEVhY2ggZWxlbWVudCB3aWxsIGJlIGVxdWFsbHkgc3ByZWFkIG92ZXIgdGhlIHNsaWRlciBhbmQgaXQgd2lsbCBzZXJ2ZSBhcyBhIHRodW1iIGxhYmVsLlxuICAgICAqIE9uY2UgdGhlIHByb3BlcnR5IGlzIHNldCwgaXQgd2lsbCBwcmVjZW5kZW5jZSBvdmVyIHtAbGluayBtYXhWYWx1ZX0sIHtAbGluayBtaW5WYWx1ZX0sIHtAbGluayBzdGVwfS5cbiAgICAgKiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1hbmlwdWxhdGlvbiBmb3IgdGhvc2UgcHJvcGVydGllcyB3b24ndCBiZSBhbGxvd2VkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBsYWJlbHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYWJlbHM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBsYWJlbHMobGFiZWxzOiBBcnJheTxudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZD4pIHtcbiAgICAgICAgdGhpcy5fbGFiZWxzID0gbGFiZWxzO1xuXG4gICAgICAgIHRoaXMuX3BNYXggPSB0aGlzLnZhbHVlVG9GcmFjdGlvbih0aGlzLnVwcGVyQm91bmQsIDAsIDEpO1xuICAgICAgICB0aGlzLl9wTWluID0gdGhpcy52YWx1ZVRvRnJhY3Rpb24odGhpcy5sb3dlckJvdW5kLCAwLCAxKTtcblxuICAgICAgICB0aGlzLnBvc2l0aW9uSGFuZGxlcnNBbmRVcGRhdGVUcmFjaygpO1xuXG4gICAgICAgIGlmICh0aGlzLl9oYXNWaWV3SW5pdCkge1xuICAgICAgICAgICAgdGhpcy5zdGVwRGlzdGFuY2UgPSB0aGlzLmNhbGN1bGF0ZVN0ZXBEaXN0YW5jZSgpO1xuICAgICAgICAgICAgdGhpcy5zZXRUaWNrSW50ZXJ2YWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHRlbXBsYXRlIGNvbnRleHQgY29ycmVzcG9uZGluZ1xuICAgICAqIHRvIHtAbGluayBJZ3hUaHVtYkZyb21UZW1wbGF0ZURpcmVjdGl2ZX0gYW5kIHtAbGluayBJZ3hUaHVtYlRvVGVtcGxhdGVEaXJlY3RpdmV9IHRlbXBsYXRlcy5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiByZXR1cm4ge1xuICAgICAqICAkaW1wbGljaXQgLy8gcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGxhYmVsLFxuICAgICAqICBsYWJlbHMgLy8gcmV0dXJucyB0aGUgbGFiZWxzIGNvbGxlY3Rpb24gdGhlIHVzZXIgaGFzIHBhc3NlZC5cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBjb250ZXh0KCk6IGFueSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAkaW1wbGljaXQ6IHRoaXMudmFsdWUsXG4gICAgICAgICAgICBsYWJlbHM6IHRoaXMubGFiZWxzXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgaW5jcmVtZW50YWwvZGVjcmVtZW50YWwgc3RlcCBvZiB0aGUgdmFsdWUgd2hlbiBkcmFnZ2luZyB0aGUgdGh1bWIuXG4gICAgICogVGhlIGRlZmF1bHQgc3RlcCBpcyAxLCBhbmQgc3RlcCBzaG91bGQgbm90IGJlIGxlc3Mgb3IgZXF1YWwgdGhhbiAwLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXNsaWRlciAjc2xpZGVyIFsobmdNb2RlbCldPVwidGFzay5wZXJjZW50Q29tcGxldGVkXCIgW3N0ZXBdPVwiNVwiPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBzdGVwKHN0ZXA6IG51bWJlcikge1xuICAgICAgICB0aGlzLl9zdGVwID0gc3RlcDtcblxuICAgICAgICBpZiAodGhpcy5faGFzVmlld0luaXQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RlcERpc3RhbmNlID0gdGhpcy5jYWxjdWxhdGVTdGVwRGlzdGFuY2UoKTtcbiAgICAgICAgICAgIHRoaXMubm9ybWFsaXplQnlTdGVwKHRoaXMuX3ZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5fdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkhhbmRsZXJzQW5kVXBkYXRlVHJhY2soKTtcbiAgICAgICAgICAgIHRoaXMuc2V0VGlja0ludGVydmFsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpbmNyZW1lbnRhbC9kZWNyZW1lbnRhbCBkcmFnZ2luZyBzdGVwIG9mIHRoZSB7QGxpbmsgSWd4U2xpZGVyQ29tcG9uZW50fS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZChcInNsaWRlcjJcIilcbiAgICAgKiBwdWJsaWMgc2xpZGVyOiBJZ3hTbGlkZXJDb21wb25lbnQ7XG4gICAgICogbmdBZnRlclZpZXdJbml0KCl7XG4gICAgICogICAgIGxldCBzdGVwID0gdGhpcy5zbGlkZXIuc3RlcDtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBzdGVwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYWJlbHNWaWV3RW5hYmxlZCA/IDEgOiB0aGlzLl9zdGVwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgdGhlIHtAbGluayBJZ3hTbGlkZXJDb21wb25lbnR9IGlzIGRpc2FibGVkLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKFwic2xpZGVyMlwiKVxuICAgICAqIHB1YmxpYyBzbGlkZXI6IElneFNsaWRlckNvbXBvbmVudDtcbiAgICAgKiBuZ0FmdGVyVmlld0luaXQoKXtcbiAgICAgKiAgICAgbGV0IGlzRGlzYWJsZWQgPSB0aGlzLnNsaWRlci5kaXNhYmxlZDtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgZGlzYWJsZXMgb3IgZW5hYmxlcyBVSSBpbnRlcmFjdGlvbi5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1zbGlkZXIgI3NsaWRlciBbZGlzYWJsZWRdPVwiJ3RydWUnXCIgWyhuZ01vZGVsKV09XCJ0YXNrLnBlcmNlbnRDb21wbGV0ZWRcIiBbc3RlcF09XCI1XCIgW2xvd2VyQm91bmRdPVwiMjBcIj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGRpc2FibGVkKGRpc2FibGU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBkaXNhYmxlO1xuXG4gICAgICAgIGlmICh0aGlzLl9oYXNWaWV3SW5pdCkge1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VUaHVtYkZvY3VzYWJsZVN0YXRlKGRpc2FibGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUge0BsaW5rIElneFNsaWRlckNvbXBvbmVudH0gaXMgc2V0IGFzIGNvbnRpbnVvdXMuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIEBWaWV3Q2hpbGQoXCJzbGlkZXIyXCIpXG4gICAgICogcHVibGljIHNsaWRlcjogSWd4U2xpZGVyQ29tcG9uZW50O1xuICAgICAqIG5nQWZ0ZXJWaWV3SW5pdCgpe1xuICAgICAqICAgICBsZXQgY29udGludW91cyA9IHRoaXMuc2xpZGVyLmNvbnRpbnVvdXM7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBjb250aW51b3VzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGludW91cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBtYXJrcyB0aGUge0BsaW5rIElneFNsaWRlckNvbXBvbmVudH0gYXMgY29udGludW91cy5cbiAgICAgKiBCeSBkZWZhdWx0IGlzIGNvbnNpZGVyZWQgdGhhdCB0aGUge0BsaW5rIElneFNsaWRlckNvbXBvbmVudH0gaXMgZGlzY3JldGUuXG4gICAgICogRGlzY3JldGUge0BsaW5rIElneFNsaWRlckNvbXBvbmVudH0gc2xpZGVyIGhhcyBzdGVwIGluZGljYXRvcnMgb3ZlciB0aGUgdHJhY2sgYW5kIHZpc2libGUgdGh1bWIgbGFiZWxzIGR1cmluZyBpbnRlcmFjdGlvbi5cbiAgICAgKiBDb250aW51b3VzIHtAbGluayBJZ3hTbGlkZXJDb21wb25lbnR9IGRvZXMgbm90IGhhdmUgdGlja3MgYW5kIGRvZXMgbm90IHNob3cgYnViYmxlIGxhYmVscyBmb3IgdmFsdWVzLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXNsaWRlciAjc2xpZGVyIFtjb250aW51b3VzXT1cIid0cnVlJ1wiIFsobmdNb2RlbCldPVwidGFzay5wZXJjZW50Q29tcGxldGVkXCIgW3N0ZXBdPVwiNVwiIFtsb3dlckJvdW5kXT1cIjIwXCI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNldCBjb250aW51b3VzKGNvbnRpbnVvdXM6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fY29udGludW91cyA9IGNvbnRpbnVvdXM7XG4gICAgICAgIGlmICh0aGlzLl9oYXNWaWV3SW5pdCkge1xuICAgICAgICAgICAgdGhpcy5zZXRUaWNrSW50ZXJ2YWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1pbmltYWwgZGlzcGxheWVkIHRyYWNrIHZhbHVlIG9mIHRoZSBgSWd4U2xpZGVyQ29tcG9uZW50YC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIEBWaWV3Q2hpbGQoXCJzbGlkZXIyXCIpXG4gICAgICogcHVibGljIHNsaWRlcjogSWd4U2xpZGVyQ29tcG9uZW50O1xuICAgICAqIG5nQWZ0ZXJWaWV3SW5pdCgpe1xuICAgICAqICAgICBsZXQgc2xpZGVyTWluID0gdGhpcy5zbGlkZXIubWluVmFsdWU7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWluVmFsdWUoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMubGFiZWxzVmlld0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX21pblZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1pbmltYWwgZGlzcGxheWVkIHRyYWNrIHZhbHVlIGZvciB0aGUgYElneFNsaWRlckNvbXBvbmVudGAuXG4gICAgICogVGhlIGRlZmF1bHQgbWluaW1hbCB2YWx1ZSBpcyAwLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXNsaWRlciBbdHlwZV09XCJzbGlkZXJUeXBlXCIgW21pblZhbHVlXT1cIjU2XCIgW21heFZhbHVlXT1cIjEwMFwiPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBtaW5WYWx1ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICh2YWx1ZSA+PSB0aGlzLm1heFZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9taW5WYWx1ZSA9IHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID4gdGhpcy5fdXBwZXJCb3VuZCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVVcHBlckJvdW5kQW5kTWF4VHJhdmVsWm9uZSgpO1xuICAgICAgICAgICAgdGhpcy5sb3dlckJvdW5kID0gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWZyZXNoIG1pbiB0cmF2ZWwgem9uZSBsaW1pdC5cbiAgICAgICAgdGhpcy5fcE1pbiA9IDA7XG4gICAgICAgIC8vIFJlY2FsY3VsYXRlIHN0ZXAgZGlzdGFuY2UuXG4gICAgICAgIHRoaXMucG9zaXRpb25IYW5kbGVyc0FuZFVwZGF0ZVRyYWNrKCk7XG4gICAgICAgIGlmICh0aGlzLl9oYXNWaWV3SW5pdCkge1xuICAgICAgICAgICAgdGhpcy5zdGVwRGlzdGFuY2UgPSB0aGlzLmNhbGN1bGF0ZVN0ZXBEaXN0YW5jZSgpO1xuICAgICAgICAgICAgdGhpcy5zZXRUaWNrSW50ZXJ2YWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gZGlzcGxheWVkIHRyYWNrIHZhbHVlIGZvciB0aGUge0BsaW5rIElneFNsaWRlckNvbXBvbmVudH0uXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIEBWaWV3Q2hpbGQoXCJzbGlkZXJcIilcbiAgICAgKiBwdWJsaWMgc2xpZGVyOiBJZ3hTbGlkZXJDb21wb25lbnQ7XG4gICAgICogbmdBZnRlclZpZXdJbml0KCl7XG4gICAgICogICAgIGxldCBzbGlkZXJNYXggPSB0aGlzLnNsaWRlci5tYXhWYWx1ZTtcbiAgICAgKiB9XG4gICAgICogIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWF4VmFsdWUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGFiZWxzVmlld0VuYWJsZWQgP1xuICAgICAgICAgICAgdGhpcy5sYWJlbHMubGVuZ3RoIC0gMSA6XG4gICAgICAgICAgICB0aGlzLl9tYXhWYWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtYXhpbWFsIGRpc3BsYXllZCB0cmFjayB2YWx1ZSBmb3IgdGhlIGBJZ3hTbGlkZXJDb21wb25lbnRgLlxuICAgICAqIFRoZSBkZWZhdWx0IG1heGltdW0gdmFsdWUgaXMgMTAwLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXNsaWRlciBbdHlwZV09XCJzbGlkZXJUeXBlXCIgW21pblZhbHVlXT1cIjU2XCIgW21heFZhbHVlXT1cIjI1NlwiPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBtYXhWYWx1ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICh2YWx1ZSA8PSB0aGlzLl9taW5WYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fbWF4VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA8IHRoaXMuX2xvd2VyQm91bmQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTG93ZXJCb3VuZEFuZE1pblRyYXZlbFpvbmUoKTtcbiAgICAgICAgICAgIHRoaXMudXBwZXJCb3VuZCA9IHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVmcmVzaCBtYXggdHJhdmVsIHpvbmUgbGltaXRzLlxuICAgICAgICB0aGlzLl9wTWF4ID0gMTtcbiAgICAgICAgLy8gcmVjYWxjdWxhdGUgc3RlcCBkaXN0YW5jZS5cbiAgICAgICAgdGhpcy5wb3NpdGlvbkhhbmRsZXJzQW5kVXBkYXRlVHJhY2soKTtcbiAgICAgICAgaWYgKHRoaXMuX2hhc1ZpZXdJbml0KSB7XG4gICAgICAgICAgICB0aGlzLnN0ZXBEaXN0YW5jZSA9IHRoaXMuY2FsY3VsYXRlU3RlcERpc3RhbmNlKCk7XG4gICAgICAgICAgICB0aGlzLnNldFRpY2tJbnRlcnZhbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbG93ZXIgYm91bmRhcnkgb2Ygc2V0dGFibGUgdmFsdWVzIG9mIHRoZSBgSWd4U2xpZGVyQ29tcG9uZW50YC5cbiAgICAgKiBJZiBub3Qgc2V0LCB3aWxsIHJldHVybiBgbWluVmFsdWVgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKFwic2xpZGVyXCIpXG4gICAgICogcHVibGljIHNsaWRlcjogSWd4U2xpZGVyQ29tcG9uZW50O1xuICAgICAqIG5nQWZ0ZXJWaWV3SW5pdCgpe1xuICAgICAqICAgICBsZXQgc2xpZGVyTG93Qm91bmQgPSB0aGlzLnNsaWRlci5sb3dlckJvdW5kO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGxvd2VyQm91bmQoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4odGhpcy5fbG93ZXJCb3VuZCkgJiYgdGhpcy5fbG93ZXJCb3VuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZUluUmFuZ2UodGhpcy5fbG93ZXJCb3VuZCwgdGhpcy5taW5WYWx1ZSwgdGhpcy5tYXhWYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5taW5WYWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBsb3dlciBib3VuZGFyeSBvZiBzZXR0YWJsZSB2YWx1ZXMgb2YgdGhlIGBJZ3hTbGlkZXJDb21wb25lbnRgLlxuICAgICAqIElmIG5vdCBzZXQgaXMgdGhlIHNhbWUgYXMgbWluIHZhbHVlLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXNsaWRlciBbc3RlcF09XCI1XCIgW2xvd2VyQm91bmRdPVwiMjBcIj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgbG93ZXJCb3VuZCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICh2YWx1ZSA+PSB0aGlzLnVwcGVyQm91bmQgfHwgKHRoaXMubGFiZWxzVmlld0VuYWJsZWQgJiYgdmFsdWUgPCAwKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbG93ZXJCb3VuZCA9IHRoaXMudmFsdWVJblJhbmdlKHZhbHVlLCB0aGlzLm1pblZhbHVlLCB0aGlzLm1heFZhbHVlKTtcblxuICAgICAgICAvLyBSZWZyZXNoIG1pbiB0cmF2ZWwgem9uZS5cbiAgICAgICAgdGhpcy5fcE1pbiA9IHRoaXMudmFsdWVUb0ZyYWN0aW9uKHRoaXMuX2xvd2VyQm91bmQsIDAsIDEpO1xuICAgICAgICB0aGlzLnBvc2l0aW9uSGFuZGxlcnNBbmRVcGRhdGVUcmFjaygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHVwcGVyIGJvdW5kYXJ5IG9mIHNldHRhYmxlIHZhbHVlcyBvZiB0aGUgYElneFNsaWRlckNvbXBvbmVudGAuXG4gICAgICogSWYgbm90IHNldCwgd2lsbCByZXR1cm4gYG1heFZhbHVlYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKFwic2xpZGVyXCIpXG4gICAgICogcHVibGljIHNsaWRlcjogSWd4U2xpZGVyQ29tcG9uZW50O1xuICAgICAqIG5nQWZ0ZXJWaWV3SW5pdCgpe1xuICAgICAqICAgIGxldCBzbGlkZXJVcEJvdW5kID0gdGhpcy5zbGlkZXIudXBwZXJCb3VuZDtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCB1cHBlckJvdW5kKCk6IG51bWJlciB7XG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKHRoaXMuX3VwcGVyQm91bmQpICYmIHRoaXMuX3VwcGVyQm91bmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVJblJhbmdlKHRoaXMuX3VwcGVyQm91bmQsIHRoaXMubWluVmFsdWUsIHRoaXMubWF4VmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMubWF4VmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdXBwZXIgYm91bmRhcnkgb2YgdGhlIGBJZ3hTbGlkZXJDb21wb25lbnRgLlxuICAgICAqIElmIG5vdCBzZXQgaXMgdGhlIHNhbWUgYXMgbWF4IHZhbHVlLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXNsaWRlciBbc3RlcF09XCI1XCIgW3VwcGVyQm91bmRdPVwiMjBcIj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgdXBwZXJCb3VuZCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICh2YWx1ZSA8PSB0aGlzLmxvd2VyQm91bmQgfHwgKHRoaXMubGFiZWxzVmlld0VuYWJsZWQgJiYgdmFsdWUgPiB0aGlzLmxhYmVscy5sZW5ndGggLSAxKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdXBwZXJCb3VuZCA9IHRoaXMudmFsdWVJblJhbmdlKHZhbHVlLCB0aGlzLm1pblZhbHVlLCB0aGlzLm1heFZhbHVlKTtcbiAgICAgICAgLy8gUmVmcmVzaCB0aW1lIHRyYXZlbCB6b25lLlxuICAgICAgICB0aGlzLl9wTWF4ID0gdGhpcy52YWx1ZVRvRnJhY3Rpb24odGhpcy5fdXBwZXJCb3VuZCwgMCwgMSk7XG4gICAgICAgIHRoaXMucG9zaXRpb25IYW5kbGVyc0FuZFVwZGF0ZVRyYWNrKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2xpZGVyIHZhbHVlLiBJZiB0aGUgc2xpZGVyIGlzIG9mIHR5cGUge0BsaW5rIElneFNsaWRlclR5cGUuU0xJREVSfSB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgbnVtYmVyLlxuICAgICAqIElmIHRoZSBzbGlkZXIgdHlwZSBpcyB7QGxpbmsgSWd4U2xpZGVyVHlwZS5SQU5HRX0uXG4gICAgICogVGhlIHJldHVybmVkIHZhbHVlIHJlcHJlc2VudHMgYW4gb2JqZWN0IG9mIHtAbGluayBsb3dlclZhbHVlfSBhbmQge0BsaW5rIHVwcGVyVmFsdWV9LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKFwic2xpZGVyMlwiKVxuICAgICAqIHB1YmxpYyBzbGlkZXI6IElneFNsaWRlckNvbXBvbmVudDtcbiAgICAgKiBwdWJsaWMgc2xpZGVyVmFsdWUoZXZlbnQpe1xuICAgICAqICAgICBsZXQgc2xpZGVyVmFsID0gdGhpcy5zbGlkZXIudmFsdWU7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdmFsdWUoKTogbnVtYmVyIHwgSVJhbmdlU2xpZGVyVmFsdWUge1xuICAgICAgICBpZiAodGhpcy5pc1JhbmdlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGxvd2VyOiB0aGlzLnZhbHVlSW5SYW5nZSh0aGlzLmxvd2VyVmFsdWUsIHRoaXMubG93ZXJCb3VuZCwgdGhpcy51cHBlckJvdW5kKSxcbiAgICAgICAgICAgICAgICB1cHBlcjogdGhpcy52YWx1ZUluUmFuZ2UodGhpcy51cHBlclZhbHVlLCB0aGlzLmxvd2VyQm91bmQsIHRoaXMudXBwZXJCb3VuZClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZUluUmFuZ2UodGhpcy51cHBlclZhbHVlLCB0aGlzLmxvd2VyQm91bmQsIHRoaXMudXBwZXJCb3VuZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzbGlkZXIgdmFsdWUuXG4gICAgICogSWYgdGhlIHNsaWRlciBpcyBvZiB0eXBlIHtAbGluayBJZ3hTbGlkZXJUeXBlLlNMSURFUn0uXG4gICAgICogVGhlIGFyZ3VtZW50IGlzIG51bWJlci4gQnkgZGVmYXVsdCB0aGUge0BsaW5rIHZhbHVlfSBnZXRzIHRoZSB7QGxpbmsgbG93ZXJCb3VuZH0uXG4gICAgICogSWYgdGhlIHNsaWRlciB0eXBlIGlzIHtAbGluayBJZ3hTbGlkZXJUeXBlLlJBTkdFfSB0aGUgYXJndW1lbnRcbiAgICAgKiByZXByZXNlbnRzIGFuIG9iamVjdCBvZiB7QGxpbmsgbG93ZXJWYWx1ZX0gYW5kIHtAbGluayB1cHBlclZhbHVlfSBwcm9wZXJ0aWVzLlxuICAgICAqIEJ5IGRlZmF1bHQgdGhlIG9iamVjdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHtAbGluayBsb3dlckJvdW5kfSBhbmQge0BsaW5rIHVwcGVyQm91bmR9IHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogcmFuZ2VWYWx1ZSA9IHtcbiAgICAgKiAgIGxvd2VyOiAzMCxcbiAgICAgKiAgIHVwcGVyOiA2MFxuICAgICAqIH07XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc2xpZGVyIFt0eXBlXT1cInNsaWRlclR5cGVcIiBbKG5nTW9kZWwpXT1cInJhbmdlVmFsdWVcIiBbbWluVmFsdWVdPVwiNTZcIiBbbWF4VmFsdWVdPVwiMjU2XCI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBudW1iZXIgfCBJUmFuZ2VTbGlkZXJWYWx1ZSkge1xuICAgICAgICB0aGlzLm5vcm1hbGl6ZUJ5U3RlcCh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2hhc1ZpZXdJbml0KSB7XG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlKHRoaXMuX3ZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25IYW5kbGVyc0FuZFVwZGF0ZVRyYWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIHByZXNlbnRlZCBwcmltYXJ5IHRpY2tzLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBwcmltYXJ5VGlja3MgPSB0aGlzLnNsaWRlci5wcmltYXJ5VGlja3M7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHByaW1hcnlUaWNrcygpIHtcbiAgICAgICAgaWYgKHRoaXMubGFiZWxzVmlld0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcmltYXJ5VGlja3MgPSB0aGlzLmxhYmVscy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3ByaW1hcnlUaWNrcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgcHJpbWFyeSB0aWNrcy4gSWYge0BsaW5rIEBsYWJlbHN9IGlzIGVuYWJsZWQsIHRoaXMgcHJvcGVydHkgd29uJ3QgZnVuY3Rpb24uXG4gICAgICogSW5zdGVkIGVuYWJsZSB0aWNrcyBieSB7QGxpbmsgc2hvd1RpY2tzfSBwcm9wZXJ0eS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5zbGlkZXIucHJpbWFyeVRpY2tzID0gNTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHByaW1hcnlUaWNrcyh2YWw6IG51bWJlcikge1xuICAgICAgICBpZiAodmFsIDw9IDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3ByaW1hcnlUaWNrcyA9IHZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIHByZXNlbnRlZCBzZWNvbmRhcnkgdGlja3MuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHNlY29uZGFyeVRpY2tzID0gdGhpcy5zbGlkZXIuc2Vjb25kYXJ5VGlja3M7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHNlY29uZGFyeVRpY2tzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2Vjb25kYXJ5VGlja3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbnVtYmVyIG9mIHNlY29uZGFyeSB0aWNrcy4gVGhlIHByb3BlcnR5IGZ1bmN0aW9ucyBldmVuIHdoZW4ge0BsaW5rIGxhYmVsc30gaXMgZW5hYmxlZCxcbiAgICAgKiBidXQgYWxsIHNlY29uZGFyeSB0aWNrcyB3b24ndCBwcmVzZW50IGFueSB0aWNrIGxhYmVscy5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5zbGlkZXIuc2Vjb25kYXJ5VGlja3MgPSA1O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgc2Vjb25kYXJ5VGlja3ModmFsOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHZhbCA8IDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3NlY29uZGFyeVRpY2tzID0gdmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3cvaGlkZSBzbGlkZXIgdGlja3NcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1zbGllciBbc2hvd1RpY2tzXT1cInRydWVcIiBbcHJpbWFyeVRpY2tzXT1cIjVcIj48L2lneC1zbGllcj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzaG93VGlja3MgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIHNob3cvaGlkZSBwcmltYXJ5IHRpY2sgbGFiZWxzXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc2xpZGVyIFtwcmltYXJ5VGlja3NdPVwiNVwiIFtwcmltYXJ5VGlja0xhYmVsc109XCJmYWxzZVwiPjwvaWd4LXNsaWRlcj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBwcmltYXJ5VGlja0xhYmVscyA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBzaG93L2hpZGUgc2Vjb25kYXJ5IHRpY2sgbGFiZWxzXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc2xpZGVyIFtzZWNvbmRhcnlUaWNrc109XCI1XCIgW3NlY29uZGFyeVRpY2tMYWJlbHNdPVwiZmFsc2VcIj48L2lneC1zbGlkZXI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2Vjb25kYXJ5VGlja0xhYmVscyA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIHRpY2tzIG9yaWVudGF0aW9uOlxuICAgICAqIGJvdHRvbSAtIFRoZSBkZWZhdWx0IG9yaWVuYXRpb24sIGJlbG93IHRoZSBzbGlkZXIgdHJhY2suXG4gICAgICogdG9wIC0gQWJvdmUgdGhlIHNsaWRlciB0cmFja1xuICAgICAqIG1pcnJvciAtIGNvbWJpbmVzIHRvcCBhbmQgYm90dG9tIG9yaWVudGF0aW9uLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXNsaWRlciBbcHJpbWFyeVRpY2tzXT1cIjVcIiBbdGlja3NPcmllbnRhdGlvbl09XCJ0aWNrc09yaWVudGF0aW9uXCI+PC9pZ3gtc2xpZGVyPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHRpY2tzT3JpZW50YXRpb246IFRpY2tzT3JpZW50YXRpb24gPSBUaWNrc09yaWVudGF0aW9uLkJvdHRvbTtcblxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGljayBsYWJlbHMgcm90YXRpb246XG4gICAgICogaG9yaXpvbnRhbCAtIFRoZSBkZWZhdWx0IHJvdGF0aW9uXG4gICAgICogdG9wdG9ib3R0b20gLSBSb3RhdGVzIHRpY2sgbGFiZWxzIHZlcnRpY2FsbHkgdG8gOTBkZWdcbiAgICAgKiBib3R0b210b3RvcCAtIFJvdGF0ZSB0aWNrIGxhYmVscyB2ZXJ0aWNhbGx5IHRvIC05MGRlZ1xuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXNsaWRlciBbcHJpbWFyeVRpY2tzXT1cIjVcIiBbc2Vjb25kYXJ5VGlja3NdPVwiM1wiIFt0aWNrTGFiZWxzT3JpZW50YXRpb25dPVwidGlja0xhYmVsc09yaWVudGFpdG9uXCI+PC9pZ3gtc2xpZGVyPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHRpY2tMYWJlbHNPcmllbnRhdGlvbjogVGlja0xhYmVsc09yaWVudGF0aW9uID0gVGlja0xhYmVsc09yaWVudGF0aW9uLkhvcml6b250YWw7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCBkZWFjdGl2YXRlVGh1bWJMYWJlbCgpIHtcbiAgICAgICAgcmV0dXJuICgodGhpcy5wcmltYXJ5VGlja3MgJiYgdGhpcy5wcmltYXJ5VGlja0xhYmVscykgfHwgKHRoaXMuc2Vjb25kYXJ5VGlja3MgJiYgdGhpcy5zZWNvbmRhcnlUaWNrTGFiZWxzKSkgJiZcbiAgICAgICAgICAgICh0aGlzLnRpY2tzT3JpZW50YXRpb24gPT09IFRpY2tzT3JpZW50YXRpb24uVG9wIHx8IHRoaXMudGlja3NPcmllbnRhdGlvbiA9PT0gVGlja3NPcmllbnRhdGlvbi5NaXJyb3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgaXMgZW1pdHRlZCBldmVyeSB0aW1lIHRoZSB2YWx1ZSBpcyBjaGFuZ2VkLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBwdWJsaWMgY2hhbmdlKGV2ZW50KXtcbiAgICAgKiAgICBhbGVydChcIlRoZSB2YWx1ZSBoYXMgYmVlbiBjaGFuZ2VkIVwiKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc2xpZGVyICh2YWx1ZUNoYW5nZSk9XCJjaGFuZ2UoJGV2ZW50KVwiICNzbGlkZXIgWyhuZ01vZGVsKV09XCJ0YXNrLnBlcmNlbnRDb21wbGV0ZWRcIiBbc3RlcF09XCI1XCI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJU2xpZGVyVmFsdWVDaGFuZ2VFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGlzIGVtaXR0ZWQgZXZlcnkgdGltZSB0aGUgbG93ZXIgdmFsdWUgb2YgYSByYW5nZSBzbGlkZXIgaXMgY2hhbmdlZC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogcHVibGljIGNoYW5nZSh2YWx1ZSl7XG4gICAgICogICAgYWxlcnQoYFRoZSBsb3dlciB2YWx1ZSBoYXMgYmVlbiBjaGFuZ2VkIHRvICR7dmFsdWV9YCk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXNsaWRlciBbKGxvd2VyVmFsdWUpXT1cIm1vZGVsLmxvd2VydmFsdWVcIiAobG93ZXJWYWx1ZUNoYW5nZSk9XCJjaGFuZ2UoJGV2ZW50KVwiIFtzdGVwXT1cIjVcIj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAgQE91dHB1dCgpXG4gICAgIHB1YmxpYyBsb3dlclZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgICAgLyoqXG4gICAgICAqIFRoaXMgZXZlbnQgaXMgZW1pdHRlZCBldmVyeSB0aW1lIHRoZSB1cHBlciB2YWx1ZSBvZiBhIHJhbmdlIHNsaWRlciBpcyBjaGFuZ2VkLlxuICAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICAqIHB1YmxpYyBjaGFuZ2UodmFsdWUpe1xuICAgICAgKiAgICBhbGVydChgVGhlIHVwcGVyIHZhbHVlIGhhcyBiZWVuIGNoYW5nZWQgdG8gJHt2YWx1ZX1gKTtcbiAgICAgICogfVxuICAgICAgKiBgYGBcbiAgICAgICogYGBgaHRtbFxuICAgICAgKiA8aWd4LXNsaWRlciBbKHVwcGVyVmFsdWUpXT1cIm1vZGVsLnVwcGVydmFsdWVcIiAodXBwZXJWYWx1ZUNoYW5nZSk9XCJjaGFuZ2UoJGV2ZW50KVwiIFtzdGVwXT1cIjVcIj5cbiAgICAgICogYGBgXG4gICAgICAqL1xuICAgICAgQE91dHB1dCgpXG4gICAgICBwdWJsaWMgdXBwZXJWYWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBpcyBlbWl0dGVkIGF0IHRoZSBlbmQgb2YgZXZlcnkgc2xpZGUgaW50ZXJhY3Rpb24uXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHB1YmxpYyBjaGFuZ2UoZXZlbnQpe1xuICAgICAqICAgIGFsZXJ0KFwiVGhlIHZhbHVlIGhhcyBiZWVuIGNoYW5nZWQhXCIpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1zbGlkZXIgKGRyYWdGaW5pc2hlZCk9XCJjaGFuZ2UoJGV2ZW50KVwiICNzbGlkZXIgWyhuZ01vZGVsKV09XCJ0YXNrLnBlcmNlbnRDb21wbGV0ZWRcIiBbc3RlcF09XCI1XCI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGRyYWdGaW5pc2hlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyIHwgSVJhbmdlU2xpZGVyVmFsdWU+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgndGlja3MnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByaXZhdGUgdGlja3M6IEVsZW1lbnRSZWY7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQFZpZXdDaGlsZHJlbihJZ3hTbGlkZXJUaHVtYkNvbXBvbmVudClcbiAgICBwcml2YXRlIHRodW1iczogUXVlcnlMaXN0PElneFNsaWRlclRodW1iQ29tcG9uZW50PiA9IG5ldyBRdWVyeUxpc3Q8SWd4U2xpZGVyVGh1bWJDb21wb25lbnQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQFZpZXdDaGlsZHJlbihJZ3hUaHVtYkxhYmVsQ29tcG9uZW50KVxuICAgIHByaXZhdGUgbGFiZWxSZWZzOiBRdWVyeUxpc3Q8SWd4VGh1bWJMYWJlbENvbXBvbmVudD4gPSBuZXcgUXVlcnlMaXN0PElneFRodW1iTGFiZWxDb21wb25lbnQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG9uUGFuOiBTdWJqZWN0PG51bWJlcj4gPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHN0ZXBEaXN0YW5jZTogbnVtYmVyO1xuXG4gICAgLy8gTGltaXQgaGFuZGxlIHRyYXZlbCB6b25lXG4gICAgcHJpdmF0ZSBfcE1pbiA9IDA7XG4gICAgcHJpdmF0ZSBfcE1heCA9IDE7XG5cbiAgICAvLyBGcm9tL3VwcGVyVmFsdWUgaW4gcGVyY2VudCB2YWx1ZXNcbiAgICBwcml2YXRlIF9oYXNWaWV3SW5pdCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX21pblZhbHVlID0gMDtcbiAgICBwcml2YXRlIF9tYXhWYWx1ZSA9IDEwMDtcbiAgICBwcml2YXRlIF9sb3dlckJvdW5kOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfdXBwZXJCb3VuZDogbnVtYmVyO1xuICAgIHByaXZhdGUgX2xvd2VyVmFsdWU6IG51bWJlcjtcbiAgICBwcml2YXRlIF91cHBlclZhbHVlOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfY29udGludW91cyA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2Rpc2FibGVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfc3RlcCA9IDE7XG4gICAgcHJpdmF0ZSBfdmFsdWU6IG51bWJlciB8IElSYW5nZVNsaWRlclZhbHVlID0gMDtcblxuICAgIC8vIHRpY2tzXG4gICAgcHJpdmF0ZSBfcHJpbWFyeVRpY2tzID0gMDtcbiAgICBwcml2YXRlIF9zZWNvbmRhcnlUaWNrcyA9IDA7XG5cbiAgICBwcml2YXRlIF9sYWJlbHMgPSBuZXcgQXJyYXk8bnVtYmVyIHwgc3RyaW5nIHwgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQ+KCk7XG4gICAgcHJpdmF0ZSBfdHlwZTogSWd4U2xpZGVyVHlwZSA9IElneFNsaWRlclR5cGUuU0xJREVSO1xuXG4gICAgcHJpdmF0ZSBfZGVzdHJveWVyJCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG4gICAgcHJpdmF0ZSBfaW5kaWNhdG9yc0Rlc3Ryb3llciQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICAgIHByaXZhdGUgX2luZGljYXRvcnNUaW1lcjogT2JzZXJ2YWJsZTxhbnk+O1xuXG4gICAgcHJpdmF0ZSBfb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9IG5vb3A7XG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSBub29wO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgX2VsOiBFbGVtZW50UmVmLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgX2NkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBfbmdab25lOiBOZ1pvbmUsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBfZGlyOiBJZ3hEaXJlY3Rpb25hbGl0eSkge1xuICAgICAgICB0aGlzLnN0ZXBEaXN0YW5jZSA9IHRoaXMuX3N0ZXA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25Qb2ludGVyRG93bigkZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xuICAgICAgICB0aGlzLmZpbmRDbG9zZXN0VGh1bWIoJGV2ZW50KTtcblxuICAgICAgICBpZiAoIXRoaXMudGh1bWJUby5pc0FjdGl2ZSAmJiB0aGlzLnRodW1iRnJvbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhY3RpdmVUaHVtYiA9IHRoaXMudGh1bWJUby5pc0FjdGl2ZSA/IHRoaXMudGh1bWJUbyA6IHRoaXMudGh1bWJGcm9tO1xuICAgICAgICBhY3RpdmVUaHVtYi5uYXRpdmVFbGVtZW50LnNldFBvaW50ZXJDYXB0dXJlKCRldmVudC5wb2ludGVySWQpO1xuICAgICAgICB0aGlzLnNob3dTbGlkZXJJbmRpY2F0b3JzKCk7XG5cbiAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcigncG9pbnRlcnVwJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25Qb2ludGVyVXAoJGV2ZW50OiBQb2ludGVyRXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRodW1iVG8uaXNBY3RpdmUgJiYgdGhpcy50aHVtYkZyb20gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWN0aXZlVGh1bWIgPSB0aGlzLnRodW1iVG8uaXNBY3RpdmUgPyB0aGlzLnRodW1iVG8gOiB0aGlzLnRodW1iRnJvbTtcbiAgICAgICAgYWN0aXZlVGh1bWIubmF0aXZlRWxlbWVudC5yZWxlYXNlUG9pbnRlckNhcHR1cmUoJGV2ZW50LnBvaW50ZXJJZCk7XG5cbiAgICAgICAgdGhpcy5oaWRlU2xpZGVySW5kaWNhdG9ycygpO1xuICAgICAgICB0aGlzLmRyYWdGaW5pc2hlZC5lbWl0KHRoaXMudmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdmb2N1cycpXG4gICAgcHVibGljIG9uRm9jdXMoKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlU2xpZGVySW5kaWNhdG9ycygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdwYW4nLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvblBhbkxpc3RlbmVyKCRldmVudCkge1xuICAgICAgICB0aGlzLnVwZGF0ZSgkZXZlbnQuc3JjRXZlbnQuY2xpZW50WCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBgSWd4U2xpZGVyQ29tcG9uZW50YCB0eXBlIGlzIFJBTkdFLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAgQFZpZXdDaGlsZChcInNsaWRlclwiKVxuICAgICAqIHB1YmxpYyBzbGlkZXI6IElneFNsaWRlckNvbXBvbmVudDtcbiAgICAgKiBuZ0FmdGVyVmlld0luaXQoKXtcbiAgICAgKiAgICAgbGV0IHNsaWRlclJhbmdlID0gdGhpcy5zbGlkZXIuaXNSYW5nZTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc1JhbmdlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlID09PSBJZ3hTbGlkZXJUeXBlLlJBTkdFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGxvd2VyIHZhbHVlIG9mIGEgUkFOR0UgYElneFNsaWRlckNvbXBvbmVudGAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIEBWaWV3Q2hpbGQoXCJzbGlkZXJcIilcbiAgICAgKiBwdWJsaWMgc2xpZGVyOiBJZ3hTbGlkZXJDb21wb25lbnQ7XG4gICAgICogcHVibGljIGxvd1ZhbHVlKGV2ZW50KXtcbiAgICAgKiAgICBsZXQgc2xpZGVyTG93VmFsdWUgPSB0aGlzLnNsaWRlci5sb3dlclZhbHVlO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGxvd2VyVmFsdWUoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4odGhpcy5fbG93ZXJWYWx1ZSkgJiYgdGhpcy5fbG93ZXJWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuX2xvd2VyVmFsdWUgPj0gdGhpcy5sb3dlckJvdW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbG93ZXJWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmxvd2VyQm91bmQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbG93ZXIgdmFsdWUgb2YgYSBSQU5HRSBgSWd4U2xpZGVyQ29tcG9uZW50YC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZChcInNsaWRlclwiKVxuICAgICAqIHB1YmxpYyBzbGlkZXI6IElneFNsaWRlckNvbXBvbmVudDtcbiAgICAgKiBwdWJsaWMgbG93VmFsdWUoZXZlbnQpe1xuICAgICAqICAgIHRoaXMuc2xpZGVyLmxvd2VyVmFsdWUgPSB2YWx1ZTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGxvd2VyVmFsdWUodmFsdWU6IG51bWJlcikge1xuICAgICAgICBjb25zdCBhZGp1c3RlZFZhbHVlID0gdGhpcy52YWx1ZUluUmFuZ2UodmFsdWUsIHRoaXMubG93ZXJCb3VuZCwgdGhpcy51cHBlckJvdW5kKTtcbiAgICAgICAgaWYgKHRoaXMuX2xvd2VyVmFsdWUgIT09IGFkanVzdGVkVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvd2VyVmFsdWUgPSBhZGp1c3RlZFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5sb3dlclZhbHVlQ2hhbmdlLmVtaXQodGhpcy5fbG93ZXJWYWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0geyBsb3dlcjogdGhpcy5fbG93ZXJWYWx1ZSwgdXBwZXI6IHRoaXMuX3VwcGVyVmFsdWUgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHVwcGVyIHZhbHVlIG9mIGEgUkFOR0UgYElneFNsaWRlckNvbXBvbmVudGAuXG4gICAgICogUmV0dXJucyBgdmFsdWVgIG9mIGEgU0xJREVSIGBJZ3hTbGlkZXJDb21wb25lbnRgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICBAVmlld0NoaWxkKFwic2xpZGVyMlwiKVxuICAgICAqIHB1YmxpYyBzbGlkZXI6IElneFNsaWRlckNvbXBvbmVudDtcbiAgICAgKiBwdWJsaWMgdXBwZXJWYWx1ZShldmVudCl7XG4gICAgICogICAgIGxldCB1cHBlclZhbHVlID0gdGhpcy5zbGlkZXIudXBwZXJWYWx1ZTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCB1cHBlclZhbHVlKCkge1xuICAgICAgICBpZiAoIU51bWJlci5pc05hTih0aGlzLl91cHBlclZhbHVlKSAmJiB0aGlzLl91cHBlclZhbHVlICE9PSB1bmRlZmluZWQgJiYgdGhpcy5fdXBwZXJWYWx1ZSA8PSB0aGlzLnVwcGVyQm91bmQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91cHBlclZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudXBwZXJCb3VuZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB1cHBlciB2YWx1ZSBvZiBhIFJBTkdFIGBJZ3hTbGlkZXJDb21wb25lbnRgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAgQFZpZXdDaGlsZChcInNsaWRlcjJcIilcbiAgICAgKiBwdWJsaWMgc2xpZGVyOiBJZ3hTbGlkZXJDb21wb25lbnQ7XG4gICAgICogcHVibGljIHVwcGVyVmFsdWUoZXZlbnQpe1xuICAgICAqICAgICB0aGlzLnNsaWRlci51cHBlclZhbHVlID0gdmFsdWU7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCB1cHBlclZhbHVlKHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgYWRqdXN0ZWRWYWx1ZSA9IHRoaXMudmFsdWVJblJhbmdlKHZhbHVlLCB0aGlzLmxvd2VyQm91bmQsIHRoaXMudXBwZXJCb3VuZCk7XG4gICAgICAgIGlmICh0aGlzLl91cHBlclZhbHVlICE9PSBhZGp1c3RlZFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl91cHBlclZhbHVlID0gYWRqdXN0ZWRWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMudXBwZXJWYWx1ZUNoYW5nZS5lbWl0KHRoaXMuX3VwcGVyVmFsdWUpO1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHsgbG93ZXI6IHRoaXMuX2xvd2VyVmFsdWUsIHVwcGVyOiB0aGlzLl91cHBlclZhbHVlIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRoZSBsb3dlciBsYWJlbC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZChcInNsaWRlclwiKVxuICAgICAqIHB1YmxpYyBzbGlkZXI6IElneFNsaWRlckNvbXBvbmVudDtcbiAgICAgKiBsZXQgbGFiZWwgPSB0aGlzLnNsaWRlci5sb3dlckxhYmVsO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbG93ZXJMYWJlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGFiZWxzVmlld0VuYWJsZWQgPyB0aGlzLmxhYmVsc1t0aGlzLmxvd2VyVmFsdWVdIDogdGhpcy5sb3dlclZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdGhlIHVwcGVyIGxhYmVsLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKFwic2xpZGVyXCIpXG4gICAgICogcHVibGljIHNsaWRlcjogSWd4U2xpZGVyQ29tcG9uZW50O1xuICAgICAqIGxldCBsYWJlbCA9IHRoaXMuc2xpZGVyLnVwcGVyTGFiZWw7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCB1cHBlckxhYmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYWJlbHNWaWV3RW5hYmxlZCA/IHRoaXMubGFiZWxzW3RoaXMudXBwZXJWYWx1ZV0gOiB0aGlzLnVwcGVyVmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiBsYWJlbCB2aWV3IGlzIGVuYWJsZWQuXG4gICAgICogSWYgdGhlIHtAbGluayBsYWJlbHN9IGlzIHNldCwgdGhlIHZpZXcgaXMgYXV0b21hdGljYWxseSBhY3RpdmF0ZWQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIEBWaWV3Q2hpbGQoXCJzbGlkZXJcIilcbiAgICAgKiBwdWJsaWMgc2xpZGVyOiBJZ3hTbGlkZXJDb21wb25lbnQ7XG4gICAgICogbGV0IGxhYmVsVmlldyA9IHRoaXMuc2xpZGVyLmxhYmVsc1ZpZXdFbmFibGVkO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbGFiZWxzVmlld0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhISh0aGlzLmxhYmVscyAmJiB0aGlzLmxhYmVscy5sZW5ndGggPiAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaG93VG9wVGlja3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRpY2tzT3JpZW50YXRpb24gPT09IFRpY2tzT3JpZW50YXRpb24uVG9wIHx8XG4gICAgICAgICAgICB0aGlzLnRpY2tzT3JpZW50YXRpb24gPT09IFRpY2tzT3JpZW50YXRpb24uTWlycm9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNob3dCb3R0b21UaWNrcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGlja3NPcmllbnRhdGlvbiA9PT0gVGlja3NPcmllbnRhdGlvbi5Cb3R0b20gfHxcbiAgICAgICAgICAgIHRoaXMudGlja3NPcmllbnRhdGlvbiA9PT0gVGlja3NPcmllbnRhdGlvbi5NaXJyb3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzLm1pblZhbHVlICYmIGNoYW5nZXMubWF4VmFsdWUgJiZcbiAgICAgICAgICAgIGNoYW5nZXMubWluVmFsdWUuY3VycmVudFZhbHVlIDwgY2hhbmdlcy5tYXhWYWx1ZS5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX21heFZhbHVlID0gY2hhbmdlcy5tYXhWYWx1ZS5jdXJyZW50VmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9taW5WYWx1ZSA9IGNoYW5nZXMubWluVmFsdWUuY3VycmVudFZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXMuc3RlcCAmJiBjaGFuZ2VzLnN0ZXAuaXNGaXJzdENoYW5nZSgpKSB7XG4gICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZUJ5U3RlcCh0aGlzLl92YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogaWYge0BsaW5rIFNsaWRlclR5cGUuU0xJREVSfSB0aGFuIHRoZSBpbml0aWFsIHZhbHVlIHNob2xkIGJlIHRoZSBsb3dlc3Qgb25lLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKCF0aGlzLmlzUmFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwcGVyVmFsdWUgPSB0aGlzLmxvd2VyQm91bmQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdHJhY2sgdHJhdmVsIHpvbmVcbiAgICAgICAgdGhpcy5fcE1pbiA9IHRoaXMudmFsdWVUb0ZyYWN0aW9uKHRoaXMubG93ZXJCb3VuZCkgfHwgMDtcbiAgICAgICAgdGhpcy5fcE1heCA9IHRoaXMudmFsdWVUb0ZyYWN0aW9uKHRoaXMudXBwZXJCb3VuZCkgfHwgMTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgICAgICB0aGlzLnNldFZhbHVlKHRoaXMuX3ZhbHVlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMuX2hhc1ZpZXdJbml0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zdGVwRGlzdGFuY2UgPSB0aGlzLmNhbGN1bGF0ZVN0ZXBEaXN0YW5jZSgpO1xuICAgICAgICB0aGlzLnBvc2l0aW9uSGFuZGxlcnNBbmRVcGRhdGVUcmFjaygpO1xuICAgICAgICB0aGlzLnNldFRpY2tJbnRlcnZhbCgpO1xuICAgICAgICB0aGlzLmNoYW5nZVRodW1iRm9jdXNhYmxlU3RhdGUodGhpcy5kaXNhYmxlZCk7XG5cbiAgICAgICAgdGhpcy5zdWJzY3JpYmVUb0V2ZW50cyh0aGlzLnRodW1iRnJvbSk7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlVG9FdmVudHModGhpcy50aHVtYlRvKTtcblxuICAgICAgICB0aGlzLnRodW1icy5jaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llciQpKS5zdWJzY3JpYmUoY2hhbmdlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRodW1iRnJvbSA9IGNoYW5nZS5maW5kKCh0aHVtYjogSWd4U2xpZGVyVGh1bWJDb21wb25lbnQpID0+IHRodW1iLnR5cGUgPT09IFNsaWRlckhhbmRsZS5GUk9NKTtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25IYW5kbGVyKHRodW1iRnJvbSwgbnVsbCwgdGhpcy5sb3dlclZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlVG9FdmVudHModGh1bWJGcm9tKTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlVGh1bWJGb2N1c2FibGVTdGF0ZSh0aGlzLmRpc2FibGVkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5sYWJlbFJlZnMuY2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZXIkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsRnJvbSA9IHRoaXMubGFiZWxSZWZzLmZpbmQoKGxhYmVsOiBJZ3hUaHVtYkxhYmVsQ29tcG9uZW50KSA9PiBsYWJlbC50eXBlID09PSBTbGlkZXJIYW5kbGUuRlJPTSk7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uSGFuZGxlcihudWxsLCBsYWJlbEZyb20sIHRoaXMubG93ZXJWYWx1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICByZXNpemVPYnNlcnZhYmxlKHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQpLnBpcGUoXG4gICAgICAgICAgICAgICAgdGhyb3R0bGVUaW1lKDQwKSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveWVyJCkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGVwRGlzdGFuY2UgPSB0aGlzLmNhbGN1bGF0ZVN0ZXBEaXN0YW5jZSgpO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5fZGVzdHJveWVyJC5uZXh0KHRydWUpO1xuICAgICAgICB0aGlzLl9kZXN0cm95ZXIkLmNvbXBsZXRlKCk7XG5cbiAgICAgICAgdGhpcy5faW5kaWNhdG9yc0Rlc3Ryb3llciQubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5faW5kaWNhdG9yc0Rlc3Ryb3llciQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IElSYW5nZVNsaWRlclZhbHVlIHwgbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzTnVsbGlzaEJ1dE5vdFplcm8odmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5vcm1hbGl6ZUJ5U3RlcCh2YWx1ZSk7XG4gICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5fdmFsdWUsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbkhhbmRsZXJzQW5kVXBkYXRlVHJhY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrID0gZm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrID0gZm47XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgZ2V0RWRpdEVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzUmFuZ2UgPyB0aGlzLnRodW1iRnJvbS5uYXRpdmVFbGVtZW50IDogdGhpcy50aHVtYlRvLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZShtb3VzZVgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBUby9Gcm9tIFZhbHVlc1xuICAgICAgICB0aGlzLm9uUGFuLm5leHQobW91c2VYKTtcblxuICAgICAgICAvLyBGaW5hbGx5IGRvIHBvc2l0aW9uSGFuZGxlcnNBbmRVcGRhdGVUcmFjayB0aGUgRE9NXG4gICAgICAgIC8vIGJhc2VkIG9uIGRhdGEgdmFsdWVzXG4gICAgICAgIHRoaXMucG9zaXRpb25IYW5kbGVyc0FuZFVwZGF0ZVRyYWNrKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyB0aHVtYkNoYW5nZWQodmFsdWU6IG51bWJlciwgdGh1bWJUeXBlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLnZhbHVlO1xuXG4gICAgICAgIGlmICh0aGlzLmlzUmFuZ2UpIHtcbiAgICAgICAgICAgIGlmICh0aHVtYlR5cGUgPT09IFNsaWRlckhhbmRsZS5GUk9NKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubG93ZXJWYWx1ZSArIHZhbHVlID4gdGhpcy51cHBlclZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBwZXJWYWx1ZSA9IHRoaXMubG93ZXJWYWx1ZSArIHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmxvd2VyVmFsdWUgKz0gdmFsdWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnVwcGVyVmFsdWUgKyB2YWx1ZSA8IHRoaXMubG93ZXJWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvd2VyVmFsdWUgPSB0aGlzLnVwcGVyVmFsdWUgKyB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy51cHBlclZhbHVlICs9IHZhbHVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBuZXdWYWw6IElSYW5nZVNsaWRlclZhbHVlID0ge1xuICAgICAgICAgICAgICAgIGxvd2VyOiB0aGlzLmxvd2VyVmFsdWUsXG4gICAgICAgICAgICAgICAgdXBwZXI6IHRoaXMudXBwZXJWYWx1ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTd2FwIHRoZSB0aHVtYnMgaWYgYSBjb2xsaXNpb24gYXBwZWFycy5cbiAgICAgICAgICAgIC8vIGlmIChuZXdWYWwubG93ZXIgPT0gbmV3VmFsLnVwcGVyKSB7XG4gICAgICAgICAgICAvLyAgICAgdGhpcy50b2dnbGVUaHVtYigpO1xuICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gbmV3VmFsO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXdWYWwgPSAodGhpcy52YWx1ZSBhcyBudW1iZXIpICsgdmFsdWU7XG4gICAgICAgICAgICBpZiAobmV3VmFsID49IHRoaXMubG93ZXJCb3VuZCAmJiBuZXdWYWwgPD0gdGhpcy51cHBlckJvdW5kKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc1ZhbHVlQ2hhbmdlZChvbGRWYWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdFZhbHVlQ2hhbmdlKG9sZFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25UaHVtYkNoYW5nZSgpIHtcbiAgICAgICAgdGhpcy50b2dnbGVTbGlkZXJJbmRpY2F0b3JzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBvbkhvdmVyQ2hhbmdlKHN0YXRlOiBib29sZWFuKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZSA/IHRoaXMuc2hvd1NsaWRlckluZGljYXRvcnMoKSA6IHRoaXMuaGlkZVNsaWRlckluZGljYXRvcnMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0VmFsdWUodmFsdWU6IG51bWJlciB8IElSYW5nZVNsaWRlclZhbHVlLCB0cmlnZ2VyQ2hhbmdlOiBib29sZWFuKSB7XG4gICAgICAgIGxldCByZXM7XG4gICAgICAgIGlmICghdGhpcy5pc1JhbmdlKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlIGFzIG51bWJlcjtcbiAgICAgICAgICAgIGlmICghaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBwZXJWYWx1ZSA9IHZhbHVlIC0gdmFsdWUgJSB0aGlzLnN0ZXA7XG4gICAgICAgICAgICAgICAgcmVzID0gdGhpcy51cHBlclZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnZhbGlkYXRlSW5pdGlhbFZhbHVlKHZhbHVlIGFzIElSYW5nZVNsaWRlclZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuX3VwcGVyVmFsdWUgPSB2YWx1ZS51cHBlcjtcbiAgICAgICAgICAgIHRoaXMuX2xvd2VyVmFsdWUgPSB2YWx1ZS5sb3dlcjtcbiAgICAgICAgICAgIHJlcyA9IHsgbG93ZXI6IHRoaXMubG93ZXJWYWx1ZSwgdXBwZXI6IHRoaXMudXBwZXJWYWx1ZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRyaWdnZXJDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2socmVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdmFsaWRhdGVJbml0aWFsVmFsdWUodmFsdWU6IElSYW5nZVNsaWRlclZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZS51cHBlciA8IHZhbHVlLmxvd2VyKSB7XG4gICAgICAgICAgICBjb25zdCB0ZW1wID0gdmFsdWUudXBwZXI7XG4gICAgICAgICAgICB2YWx1ZS51cHBlciA9IHZhbHVlLmxvd2VyO1xuICAgICAgICAgICAgdmFsdWUubG93ZXIgPSB0ZW1wO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlLmxvd2VyIDwgdGhpcy5sb3dlckJvdW5kKSB7XG4gICAgICAgICAgICB2YWx1ZS5sb3dlciA9IHRoaXMubG93ZXJCb3VuZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZS51cHBlciA+IHRoaXMudXBwZXJCb3VuZCkge1xuICAgICAgICAgICAgdmFsdWUudXBwZXIgPSB0aGlzLnVwcGVyQm91bmQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kQ2xvc2VzdFRodW1iKGV2ZW50OiBQb2ludGVyRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNSYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZXN0SGFuZGxlKGV2ZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudGh1bWJUby5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZShldmVudC5jbGllbnRYKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUxvd2VyQm91bmRBbmRNaW5UcmF2ZWxab25lKCkge1xuICAgICAgICB0aGlzLmxvd2VyQm91bmQgPSB0aGlzLm1pblZhbHVlO1xuICAgICAgICB0aGlzLl9wTWluID0gMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVVwcGVyQm91bmRBbmRNYXhUcmF2ZWxab25lKCkge1xuICAgICAgICB0aGlzLnVwcGVyQm91bmQgPSB0aGlzLm1heFZhbHVlO1xuICAgICAgICB0aGlzLl9wTWF4ID0gMTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNhbGN1bGF0ZVN0ZXBEaXN0YW5jZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLyAodGhpcy5tYXhWYWx1ZSAtIHRoaXMubWluVmFsdWUpICogdGhpcy5zdGVwO1xuICAgIH1cblxuICAgIC8vIHByaXZhdGUgdG9nZ2xlVGh1bWIoKSB7XG4gICAgLy8gICAgIHJldHVybiB0aGlzLnRodW1iRnJvbS5pc0FjdGl2ZSA/XG4gICAgLy8gICAgICAgICB0aGlzLnRodW1iVG8ubmF0aXZlRWxlbWVudC5mb2N1cygpIDpcbiAgICAvLyAgICAgICAgIHRoaXMudGh1bWJGcm9tLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAvLyB9XG5cbiAgICBwcml2YXRlIHZhbHVlSW5SYW5nZSh2YWx1ZSwgbWluID0gMCwgbWF4ID0gMTAwKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heChNYXRoLm1pbih2YWx1ZSwgbWF4KSwgbWluKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBvc2l0aW9uSGFuZGxlcih0aHVtYkhhbmRsZTogRWxlbWVudFJlZiwgbGFiZWxIYW5kbGU6IEVsZW1lbnRSZWYsIHBvc2l0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgcGVyY2VudCA9IGAke3RoaXMudmFsdWVUb0ZyYWN0aW9uKHBvc2l0aW9uKSAqIDEwMH0lYDtcbiAgICAgICAgY29uc3QgZGlyID0gdGhpcy5fZGlyLnJ0bCA/ICdyaWdodCcgOiAnbGVmdCc7XG5cbiAgICAgICAgaWYgKHRodW1iSGFuZGxlKSB7XG4gICAgICAgICAgICB0aHVtYkhhbmRsZS5uYXRpdmVFbGVtZW50LnN0eWxlW2Rpcl0gPSBwZXJjZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxhYmVsSGFuZGxlKSB7XG4gICAgICAgICAgICBsYWJlbEhhbmRsZS5uYXRpdmVFbGVtZW50LnN0eWxlW2Rpcl0gPSBwZXJjZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwb3NpdGlvbkhhbmRsZXJzQW5kVXBkYXRlVHJhY2soKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1JhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uSGFuZGxlcih0aGlzLnRodW1iVG8sIHRoaXMubGFiZWxUbywgdGhpcy52YWx1ZSBhcyBudW1iZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkhhbmRsZXIodGhpcy50aHVtYlRvLCB0aGlzLmxhYmVsVG8sICh0aGlzLnZhbHVlIGFzIElSYW5nZVNsaWRlclZhbHVlKS51cHBlcik7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uSGFuZGxlcih0aGlzLnRodW1iRnJvbSwgdGhpcy5sYWJlbEZyb20sICh0aGlzLnZhbHVlIGFzIElSYW5nZVNsaWRlclZhbHVlKS5sb3dlcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5faGFzVmlld0luaXQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVHJhY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY2xvc2VzdEhhbmRsZShldmVudDogUG9pbnRlckV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGZyb21PZmZzZXQgPSB0aGlzLnRodW1iRnJvbS5uYXRpdmVFbGVtZW50Lm9mZnNldExlZnQgKyB0aGlzLnRodW1iRnJvbS5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoIC8gMjtcbiAgICAgICAgY29uc3QgdG9PZmZzZXQgPSB0aGlzLnRodW1iVG8ubmF0aXZlRWxlbWVudC5vZmZzZXRMZWZ0ICsgdGhpcy50aHVtYlRvLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggLyAyO1xuICAgICAgICBjb25zdCB4UG9pbnRlciA9IGV2ZW50LmNsaWVudFggLSB0aGlzLl9lbC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy5jbG9zZXN0VG8oeFBvaW50ZXIsIFtmcm9tT2Zmc2V0LCB0b09mZnNldF0pO1xuXG4gICAgICAgIGlmIChmcm9tT2Zmc2V0ID09PSB0b09mZnNldCAmJiB0b09mZnNldCA8IHhQb2ludGVyKSB7XG4gICAgICAgICAgICB0aGlzLnRodW1iVG8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9IGVsc2UgaWYgKGZyb21PZmZzZXQgPT09IHRvT2Zmc2V0ICYmIHRvT2Zmc2V0ID4geFBvaW50ZXIpIHtcbiAgICAgICAgICAgIHRoaXMudGh1bWJGcm9tLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIGlmIChtYXRjaCA9PT0gZnJvbU9mZnNldCkge1xuICAgICAgICAgICAgdGhpcy50aHVtYkZyb20ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50aHVtYlRvLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0VGlja0ludGVydmFsKCkge1xuICAgICAgICBsZXQgaW50ZXJ2YWw7XG4gICAgICAgIGNvbnN0IHRyYWNrUHJvZ3Jlc3MgPSAxMDA7XG5cbiAgICAgICAgaWYgKHRoaXMubGFiZWxzVmlld0VuYWJsZWQpIHtcbiAgICAgICAgICAgIC8vIENhbGMgdGlja3MgZGVwZW5kaW5nIG9uIHRoZSBsYWJlbHMgbGVuZ3RoO1xuICAgICAgICAgICAgaW50ZXJ2YWwgPSAoKHRyYWNrUHJvZ3Jlc3MgLyAodGhpcy5sYWJlbHMubGVuZ3RoIC0gMSkgKiAxMCkpIC8gMTA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0cmFja1JhbmdlID0gdGhpcy5tYXhWYWx1ZSAtIHRoaXMubWluVmFsdWU7XG4gICAgICAgICAgICBpbnRlcnZhbCA9IHRoaXMuc3RlcCA+IDEgP1xuICAgICAgICAgICAgICAgICh0cmFja1Byb2dyZXNzIC8gKCh0cmFja1JhbmdlIC8gdGhpcy5zdGVwKSkgKiAxMCkgLyAxMFxuICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50aWNrcy5uYXRpdmVFbGVtZW50LCAnc3Ryb2tlLWRhc2hhcnJheScsIGAwLCAke2ludGVydmFsICogTWF0aC5zcXJ0KDIpfSVgKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRpY2tzLm5hdGl2ZUVsZW1lbnQsICd2aXNpYmlsaXR5JywgdGhpcy5jb250aW51b3VzIHx8IGludGVydmFsID09PSBudWxsID8gJ2hpZGRlbicgOiAndmlzaWJsZScpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2hvd1NsaWRlckluZGljYXRvcnMoKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5faW5kaWNhdG9yc1RpbWVyKSB7XG4gICAgICAgICAgICB0aGlzLl9pbmRpY2F0b3JzRGVzdHJveWVyJC5uZXh0KHRydWUpO1xuICAgICAgICAgICAgdGhpcy5faW5kaWNhdG9yc1RpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGh1bWJUby5zaG93VGh1bWJJbmRpY2F0b3JzKCk7XG4gICAgICAgIHRoaXMubGFiZWxUby5hY3RpdmUgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy50aHVtYkZyb20pIHtcbiAgICAgICAgICAgIHRoaXMudGh1bWJGcm9tLnNob3dUaHVtYkluZGljYXRvcnMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxhYmVsRnJvbSkge1xuICAgICAgICAgICAgdGhpcy5sYWJlbEZyb20uYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoaWRlU2xpZGVySW5kaWNhdG9ycygpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2luZGljYXRvcnNUaW1lciA9IHRpbWVyKHRoaXMudGh1bWJMYWJlbFZpc2liaWxpdHlEdXJhdGlvbik7XG4gICAgICAgIHRoaXMuX2luZGljYXRvcnNUaW1lci5waXBlKHRha2VVbnRpbCh0aGlzLl9pbmRpY2F0b3JzRGVzdHJveWVyJCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRodW1iVG8uaGlkZVRodW1iSW5kaWNhdG9ycygpO1xuICAgICAgICAgICAgdGhpcy5sYWJlbFRvLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHRoaXMudGh1bWJGcm9tKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50aHVtYkZyb20uaGlkZVRodW1iSW5kaWNhdG9ycygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5sYWJlbEZyb20pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVsRnJvbS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGVTbGlkZXJJbmRpY2F0b3JzKCkge1xuICAgICAgICB0aGlzLnNob3dTbGlkZXJJbmRpY2F0b3JzKCk7XG4gICAgICAgIHRoaXMuaGlkZVNsaWRlckluZGljYXRvcnMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoYW5nZVRodW1iRm9jdXNhYmxlU3RhdGUoc3RhdGU6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBzdGF0ZSA/IC0xIDogMTtcblxuICAgICAgICBpZiAodGhpcy5pc1JhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLnRodW1iRnJvbS50YWJpbmRleCA9IHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50aHVtYlRvLnRhYmluZGV4ID0gdmFsdWU7XG5cbiAgICAgICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsb3Nlc3RUbyhnb2FsOiBudW1iZXIsIHBvc2l0aW9uczogbnVtYmVyW10pOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gcG9zaXRpb25zLnJlZHVjZSgocHJldmlvdXMsIGN1cnJlbnQpID0+IChNYXRoLmFicyhnb2FsIC0gY3VycmVudCkgPCBNYXRoLmFicyhnb2FsIC0gcHJldmlvdXMpID8gY3VycmVudCA6IHByZXZpb3VzKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2YWx1ZVRvRnJhY3Rpb24odmFsdWU6IG51bWJlciwgcE1pbiA9IHRoaXMuX3BNaW4sIHBNYXggPSB0aGlzLl9wTWF4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlSW5SYW5nZSgodmFsdWUgLSB0aGlzLm1pblZhbHVlKSAvICh0aGlzLm1heFZhbHVlIC0gdGhpcy5taW5WYWx1ZSksIHBNaW4sIHBNYXgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNOdWxsaXNoQnV0Tm90WmVybyh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdmFsdWUgJiYgdmFsdWUgIT09IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE5vcm1hbGl60LUgdGhlIHZhbHVlIHdoZW4gdHdvLXdheSBkYXRhIGJpbmQgaXMgdXNlZCBhbmQge0BsaW5rIHRoaXMuc3RlcH0gaXMgc2V0LlxuICAgICAqIEBwYXJhbSB2YWx1ZVxuICAgICAqL1xuICAgIHByaXZhdGUgbm9ybWFsaXplQnlTdGVwKHZhbHVlOiBJUmFuZ2VTbGlkZXJWYWx1ZSB8IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy5pc1JhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLl92YWx1ZSA9IHtcbiAgICAgICAgICAgICAgICBsb3dlcjogKHZhbHVlIGFzIElSYW5nZVNsaWRlclZhbHVlKS5sb3dlciAtICgodmFsdWUgYXMgSVJhbmdlU2xpZGVyVmFsdWUpLmxvd2VyICUgdGhpcy5zdGVwKSxcbiAgICAgICAgICAgICAgICB1cHBlcjogKHZhbHVlIGFzIElSYW5nZVNsaWRlclZhbHVlKS51cHBlciAtICgodmFsdWUgYXMgSVJhbmdlU2xpZGVyVmFsdWUpLnVwcGVyICUgdGhpcy5zdGVwKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gKHZhbHVlIGFzIG51bWJlcikgLSAoKHZhbHVlIGFzIG51bWJlcikgJSB0aGlzLnN0ZXApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVUcmFjaygpIHtcbiAgICAgICAgY29uc3QgZnJvbVBvc2l0aW9uID0gdGhpcy52YWx1ZVRvRnJhY3Rpb24odGhpcy5sb3dlclZhbHVlKTtcbiAgICAgICAgY29uc3QgdG9Qb3NpdGlvbiA9IHRoaXMudmFsdWVUb0ZyYWN0aW9uKHRoaXMudXBwZXJWYWx1ZSk7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uR2FwID0gdG9Qb3NpdGlvbiAtIGZyb21Qb3NpdGlvbjtcblxuICAgICAgICBsZXQgdHJhY2tMZWZ0SW5kZW50aW9uID0gZnJvbVBvc2l0aW9uO1xuICAgICAgICBpZiAodGhpcy5pc1JhbmdlKSB7XG4gICAgICAgICAgICBpZiAocG9zaXRpb25HYXApIHtcbiAgICAgICAgICAgICAgICB0cmFja0xlZnRJbmRlbnRpb24gPSBNYXRoLnJvdW5kKCgxIC8gcG9zaXRpb25HYXAgKiBmcm9tUG9zaXRpb24pICogMTAwKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdHJhY2tMZWZ0SW5kZW50aW9uID0gdGhpcy5fZGlyLnJ0bCA/IC10cmFja0xlZnRJbmRlbnRpb24gOiB0cmFja0xlZnRJbmRlbnRpb247XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudHJhY2tSZWYubmF0aXZlRWxlbWVudCwgJ3RyYW5zZm9ybScsIGBzY2FsZVgoJHtwb3NpdGlvbkdhcH0pIHRyYW5zbGF0ZVgoJHt0cmFja0xlZnRJbmRlbnRpb259JSlgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50cmFja1JlZi5uYXRpdmVFbGVtZW50LCAndHJhbnNmb3JtJywgYHNjYWxlWCgke3RvUG9zaXRpb259KWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdWJzY3JpYmVUb0V2ZW50cyh0aHVtYjogSWd4U2xpZGVyVGh1bWJDb21wb25lbnQpIHtcbiAgICAgICAgaWYgKCF0aHVtYikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGh1bWIudGh1bWJWYWx1ZUNoYW5nZVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmVyKHRodW1iKSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHZhbHVlID0+IHRoaXMudGh1bWJDaGFuZ2VkKHZhbHVlLCB0aHVtYi50eXBlKSk7XG5cbiAgICAgICAgdGh1bWIudGh1bWJCbHVyXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZXIodGh1bWIpKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2soKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1bnN1YnNjcmliZXIodGh1bWI6IElneFNsaWRlclRodW1iQ29tcG9uZW50KSB7XG4gICAgICAgIHJldHVybiBtZXJnZSh0aGlzLl9kZXN0cm95ZXIkLCB0aHVtYi5kZXN0cm95KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc1ZhbHVlQ2hhbmdlZChvbGRWYWx1ZSkge1xuICAgICAgICBjb25zdCBpc1NsaWRlcldpdGhEaWZmZXJlbnRWYWx1ZTogYm9vbGVhbiA9ICF0aGlzLmlzUmFuZ2UgJiYgb2xkVmFsdWUgIT09IHRoaXMudmFsdWU7XG4gICAgICAgIGNvbnN0IGlzUmFuZ2VXaXRoT25lRGlmZmVyZW50VmFsdWU6IGJvb2xlYW4gPSB0aGlzLmlzUmFuZ2UgJiZcbiAgICAgICAgICAgICgob2xkVmFsdWUgYXMgSVJhbmdlU2xpZGVyVmFsdWUpLmxvd2VyICE9PSAodGhpcy52YWx1ZSBhcyBJUmFuZ2VTbGlkZXJWYWx1ZSkubG93ZXIgfHxcbiAgICAgICAgICAgICAgICAob2xkVmFsdWUgYXMgSVJhbmdlU2xpZGVyVmFsdWUpLnVwcGVyICE9PSAodGhpcy52YWx1ZSBhcyBJUmFuZ2VTbGlkZXJWYWx1ZSkudXBwZXIpO1xuXG4gICAgICAgIHJldHVybiBpc1NsaWRlcldpdGhEaWZmZXJlbnRWYWx1ZSB8fCBpc1JhbmdlV2l0aE9uZURpZmZlcmVudFZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZW1pdFZhbHVlQ2hhbmdlKG9sZFZhbHVlOiBudW1iZXIgfCBJUmFuZ2VTbGlkZXJWYWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoeyBvbGRWYWx1ZSwgdmFsdWU6IHRoaXMudmFsdWUgfSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuXG4iLCI8aWd4LXRpY2tzXG4gICAgKm5nSWY9XCJzaG93VGlja3MgJiYgc2hvd1RvcFRpY2tzXCJcbiAgICB0aWNrc09yaWVudGF0aW9uPVwidG9wXCJcbiAgICBbcHJpbWFyeVRpY2tzXT1cInByaW1hcnlUaWNrc1wiXG4gICAgW3NlY29uZGFyeVRpY2tzXT1cInNlY29uZGFyeVRpY2tzXCJcbiAgICBbcHJpbWFyeVRpY2tMYWJlbHNdPVwicHJpbWFyeVRpY2tMYWJlbHNcIlxuICAgIFtzZWNvbmRhcnlUaWNrTGFiZWxzXT1cInNlY29uZGFyeVRpY2tMYWJlbHNcIlxuICAgIFt0aWNrTGFiZWxzT3JpZW50YXRpb25dPVwidGlja0xhYmVsc09yaWVudGF0aW9uXCJcbiAgICBbbGFiZWxzVmlld0VuYWJsZWRdPVwibGFiZWxzVmlld0VuYWJsZWRcIlxuICAgIFtsYWJlbHNdPVwibGFiZWxzIHwgc3ByZWFkVGlja0xhYmVsczpzZWNvbmRhcnlUaWNrc1wiXG4gICAgW3RpY2tMYWJlbFRlbXBsYXRlUmVmXT1cInRpY2tMYWJlbFRlbXBsYXRlUmVmXCJcbiAgICBbbWluVmFsdWVdPVwibWluVmFsdWVcIlxuICAgIFttYXhWYWx1ZV09XCJtYXhWYWx1ZVwiPlxuPC9pZ3gtdGlja3M+XG48ZGl2IGNsYXNzPVwiaWd4LXNsaWRlcl9fdHJhY2tcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LXNsaWRlcl9fdHJhY2staW5hY3RpdmVcIj48L2Rpdj5cbiAgICA8ZGl2ICN0cmFjayBjbGFzcz1cImlneC1zbGlkZXJfX3RyYWNrLWZpbGxcIj48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LXNsaWRlcl9fdHJhY2stc3RlcHNcIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjEwMCVcIiBoZWlnaHQ9XCIxMDAlXCI+XG4gICAgICAgICAgPGxpbmUgI3RpY2tzIHgxPVwiMFwiIHkxPVwiMlwiIHgyPVwiMTAwJVwiIHkyPVwiMlwiPjwvbGluZT5cbiAgICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJpZ3gtc2xpZGVyX190aHVtYnNcIj5cbiAgICA8aWd4LXRodW1iLWxhYmVsXG4gICAgICAgICpuZ0lmPVwiaXNSYW5nZVwiXG4gICAgICAgIHR5cGU9XCJmcm9tXCJcbiAgICAgICAgW3ZhbHVlXT1cImxvd2VyTGFiZWxcIlxuICAgICAgICBbdGVtcGxhdGVSZWZdPVwidGh1bWJGcm9tVGVtcGxhdGVSZWZcIlxuICAgICAgICBbY29udGludW91c109XCJjb250aW51b3VzXCJcbiAgICAgICAgW2NvbnRleHRdPVwiY29udGV4dFwiXG4gICAgICAgIFtkZWFjdGl2ZVN0YXRlXT1cImRlYWN0aXZhdGVUaHVtYkxhYmVsXCJcbiAgICAgICAgW3RodW1iXT1cInRodW1iRnJvbVwiPjwvaWd4LXRodW1iLWxhYmVsPlxuXG4gICAgPGlneC10aHVtYlxuICAgICAgICAqbmdJZj1cImlzUmFuZ2VcIlxuICAgICAgICAjdGh1bWJGcm9tXG4gICAgICAgIHR5cGU9XCJmcm9tXCJcbiAgICAgICAgW3ZhbHVlXT1cImxvd2VyTGFiZWxcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICBbY29udGludW91c109XCJjb250aW51b3VzXCJcbiAgICAgICAgW29uUGFuXT1cIm9uUGFuXCJcbiAgICAgICAgW3N0ZXBEaXN0YW5jZV09XCJzdGVwRGlzdGFuY2VcIlxuICAgICAgICBbc3RlcF09XCJzdGVwXCJcbiAgICAgICAgW3RlbXBsYXRlUmVmXT1cInRodW1iRnJvbVRlbXBsYXRlUmVmXCJcbiAgICAgICAgW2NvbnRleHRdPVwiY29udGV4dFwiXG4gICAgICAgICh0aHVtYkNoYW5nZSk9XCJvblRodW1iQ2hhbmdlKClcIlxuICAgICAgICAoaG92ZXJDaGFuZ2UpPVwib25Ib3ZlckNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgW2RlYWN0aXZlU3RhdGVdPVwiZGVhY3RpdmF0ZVRodW1iTGFiZWxcIlxuICAgICAgICBbdGh1bWJMYWJlbFZpc2liaWxpdHlEdXJhdGlvbl09XCJ0aHVtYkxhYmVsVmlzaWJpbGl0eUR1cmF0aW9uXCI+PC9pZ3gtdGh1bWI+XG5cbiAgICA8aWd4LXRodW1iLWxhYmVsXG4gICAgICAgIFt2YWx1ZV09XCJ1cHBlckxhYmVsXCJcbiAgICAgICAgdHlwZT1cInRvXCJcbiAgICAgICAgW3RlbXBsYXRlUmVmXT1cInRodW1iVG9UZW1wbGF0ZVJlZlwiXG4gICAgICAgIFtjb250aW51b3VzXT1cImNvbnRpbnVvdXNcIlxuICAgICAgICBbY29udGV4dF09XCJjb250ZXh0XCJcbiAgICAgICAgW2RlYWN0aXZlU3RhdGVdPVwiZGVhY3RpdmF0ZVRodW1iTGFiZWxcIlxuICAgICAgICBbdGh1bWJdPVwidGh1bWJUb1wiPjwvaWd4LXRodW1iLWxhYmVsPlxuXG4gICAgPGlneC10aHVtYlxuICAgICAgICAjdGh1bWJUb1xuICAgICAgICB0eXBlPVwidG9cIlxuICAgICAgICBbdmFsdWVdPVwidXBwZXJMYWJlbFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIFtjb250aW51b3VzXT1cImNvbnRpbnVvdXNcIlxuICAgICAgICBbb25QYW5dPVwib25QYW5cIlxuICAgICAgICBbc3RlcERpc3RhbmNlXT1cInN0ZXBEaXN0YW5jZVwiXG4gICAgICAgIFtzdGVwXT1cInN0ZXBcIlxuICAgICAgICBbdGVtcGxhdGVSZWZdPVwidGh1bWJUb1RlbXBsYXRlUmVmXCJcbiAgICAgICAgW2NvbnRleHRdPVwiY29udGV4dFwiXG4gICAgICAgICh0aHVtYkNoYW5nZSk9XCJvblRodW1iQ2hhbmdlKClcIlxuICAgICAgICAoaG92ZXJDaGFuZ2UpPVwib25Ib3ZlckNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgW2RlYWN0aXZlU3RhdGVdPVwiZGVhY3RpdmF0ZVRodW1iTGFiZWxcIlxuICAgICAgICBbdGh1bWJMYWJlbFZpc2liaWxpdHlEdXJhdGlvbl09XCJ0aHVtYkxhYmVsVmlzaWJpbGl0eUR1cmF0aW9uXCI+PC9pZ3gtdGh1bWI+XG48L2Rpdj5cbjxpZ3gtdGlja3NcbiAgICAqbmdJZj1cInNob3dUaWNrcyAmJiBzaG93Qm90dG9tVGlja3NcIlxuICAgIHRpY2tzT3JpZW50YXRpb249XCJib3R0b21cIlxuICAgIFtwcmltYXJ5VGlja3NdPVwicHJpbWFyeVRpY2tzXCJcbiAgICBbc2Vjb25kYXJ5VGlja3NdPVwic2Vjb25kYXJ5VGlja3NcIlxuICAgIFtwcmltYXJ5VGlja0xhYmVsc109XCJwcmltYXJ5VGlja0xhYmVsc1wiXG4gICAgW3NlY29uZGFyeVRpY2tMYWJlbHNdPVwic2Vjb25kYXJ5VGlja0xhYmVsc1wiXG4gICAgW3RpY2tMYWJlbHNPcmllbnRhdGlvbl09XCJ0aWNrTGFiZWxzT3JpZW50YXRpb25cIlxuICAgIFtsYWJlbHNWaWV3RW5hYmxlZF09XCJsYWJlbHNWaWV3RW5hYmxlZFwiXG4gICAgW2xhYmVsc109XCJsYWJlbHMgfCBzcHJlYWRUaWNrTGFiZWxzOnNlY29uZGFyeVRpY2tzXCJcbiAgICBbdGlja0xhYmVsVGVtcGxhdGVSZWZdPVwidGlja0xhYmVsVGVtcGxhdGVSZWZcIlxuICAgIFttaW5WYWx1ZV09XCJtaW5WYWx1ZVwiXG4gICAgW21heFZhbHVlXT1cIm1heFZhbHVlXCI+XG48L2lneC10aWNrcz5cbiJdfQ==