UNPKG

@microsoft/windows-admin-center-sdk

Version:

Microsoft - Windows Admin Center Shell

214 lines 28.8 kB
import { __decorate, __metadata } from "tslib"; import { Component, EventEmitter, Injector, Input, Output } from '@angular/core'; import { Debounce } from '@microsoft/windows-admin-center-sdk/core/base/decorators/debounce.decorators'; import { ToolTipFocusEvent, ToolTipMouseEvent } from '../../../tooltip/tooltip.directive'; import { SmeInternalFormFieldComponent } from '../form-field.component'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "../../../icon/icon-text/icon-text.component"; import * as i3 from "../../../../directives/disabled/disabled.directive"; import * as i4 from "../../../tooltip/tooltip.directive"; import * as i5 from "../../validation-alert/validation-alert.component"; import * as i6 from "../../form-field-layout/form-field-layout.component"; const _c0 = ["type", "readonly"]; function ReadonlyFormFieldComponent_button_3_Template(rf, ctx) { if (rf & 1) { const _r3 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "button", 6); i0.ɵɵlistener("click", function ReadonlyFormFieldComponent_button_3_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.copyToClipboardInternal($event)); })("toolTipFocusEventTriggered", function ReadonlyFormFieldComponent_button_3_Template_button_toolTipFocusEventTriggered_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.onToolTipFocusEventTriggered($event)); })("toolTipMouseEventTriggered", function ReadonlyFormFieldComponent_button_3_Template_button_toolTipMouseEventTriggered_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r5 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r5.onToolTipMouseEventTriggered($event)); }); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵproperty("title", ctx_r0.fieldCopyText)("smeTooltipEnableEvents", true); i0.ɵɵattribute("aria-label", ctx_r0.fieldCopyText ? ctx_r0.fieldCopyText : null); } } function ReadonlyFormFieldComponent_button_4_Template(rf, ctx) { if (rf & 1) { const _r7 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "button", 7); i0.ɵɵlistener("click", function ReadonlyFormFieldComponent_button_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r6 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r6.onFieldAction()); }); i0.ɵɵelement(1, "span"); i0.ɵɵelementStart(2, "span"); i0.ɵɵtext(3); i0.ɵɵelementEnd()(); } if (rf & 2) { const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵproperty("smeDisabled", ctx_r1.loadingOrDisabled || ctx_r1.pending || !ctx_r1.isValid()); i0.ɵɵadvance(1); i0.ɵɵclassMapInterpolate1("sme-icon ", ctx_r1.fieldActionIconClass, ""); i0.ɵɵclassProp("sme-margin-right-xs", !!ctx_r1.fieldActionText); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate(ctx_r1.fieldActionText); } } /** * Accessible Implementation of a readonly form field */ export class ReadonlyFormFieldComponent extends SmeInternalFormFieldComponent { /** * Initializes a new instance of the ToggleSwitchFormFieldComponent */ constructor(injector) { super(injector); /** * The output for when the field action is activated */ this.fieldAction = new EventEmitter(); /** * Timer to guarantee mouse leave time to reset context from copied to default. */ this.copiedTextToDefaultTimer = 2000; /** * The lock for dealing with clicking events that causes focus lost of the button. */ this.focusEventLock = false; this.fieldCopyText = this.strings.MsftSmeShell.Angular.Form.Actions.copy; } /** * The source name to use for logging */ get logSourceName() { return 'ReadonlyFormFieldComponent'; } ngOnInit() { this.setFieldCopyTextBackUp(this.fieldCopyText); } /** * Executes the field action */ onFieldAction() { this.fieldAction.emit(this.value); } /** * On click function for copy to clipboard. */ copyToClipboardInternal($event) { if (!$event) { return; } // For the keyboard press, make sure to not lost focus. // By default the focus would be landing on the tooltip for reading the content out, // In our case, we force the focus to stay on the button and read internal aria label. if ($event.pointerId === -1) { this.focusEventLock = false; $event.preventDefault(); $event.stopPropagation(); setTimeout(() => { $event.target.focus(); this.fieldCopyText = this.strings.MsftSmeShell.Angular.Form.Actions.copied; }); } else { // mouse click this.focusEventLock = true; setTimeout(() => { this.fieldCopyText = this.strings.MsftSmeShell.Angular.Form.Actions.copied; }); } super.copyToClipboard(); } /** * It handles the event from the tooltip about focus in/out of bound. * Adding debounce to only process the last signal within debounce timer. * * @param $event The tool tip focus in/out event. */ onToolTipFocusEventTriggered($event) { if (!$event) { return; } if ($event === ToolTipFocusEvent.focusOut) { if (!this.focusEventLock) { this.fieldCopyText = this.fieldCopyTextBackUp; } } } /** * It handles the event from the tooltip about mouse enter/leave event. * Adding debounce to only process the last signal within debounce timer. * * @param $event The tool tip mouse enter/leave event. */ onToolTipMouseEventTriggered($event) { if (!$event) { return; } if ($event === ToolTipMouseEvent.mouseLeave) { this.copiedTextToDefaultTimeoutObject = setTimeout(() => { this.fieldCopyText = this.fieldCopyTextBackUp; }, this.copiedTextToDefaultTimer); } else if ($event === ToolTipMouseEvent.mouseEnter) { if (this.copiedTextToDefaultTimeoutObject) { clearTimeout(this.copiedTextToDefaultTimeoutObject); } } } /** * It updates the default copy text. Can be useful when the tooltip text will change from external. * @param input the string for the copy text */ setFieldCopyTextBackUp(input) { this.fieldCopyTextBackUp = input; } /** * Creates the idBag used by this component to store unique element ids. * id values will be assigned be the @see BaseComponent super class. */ createIdBag() { return { detailsSpan: '' }; } } /** @nocollapse */ ReadonlyFormFieldComponent.ɵfac = function ReadonlyFormFieldComponent_Factory(t) { return new (t || ReadonlyFormFieldComponent)(i0.ɵɵdirectiveInject(i0.Injector)); }; /** @nocollapse */ ReadonlyFormFieldComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: ReadonlyFormFieldComponent, selectors: [["sme-form-field", "type", "readonly"]], inputs: { smeIconClassName: "smeIconClassName", urlIcon: "urlIcon", showCopyAction: "showCopyAction", fieldCopyText: "fieldCopyText", showFieldAction: "showFieldAction", fieldActionText: "fieldActionText", fieldActionIconClass: "fieldActionIconClass" }, outputs: { fieldAction: "fieldAction" }, features: [i0.ɵɵInheritDefinitionFeature], attrs: _c0, decls: 6, vars: 13, consts: [[3, "formField"], [1, "sme-arrange-stack-h", "sme-form-field-editor"], [1, "sme-arrange-stack-h", 3, "smeIconClassName", "urlIcon", "readOnlyFormFieldLabel", "title", "readOnlyFormField"], ["type", "button", "class", "sme-button-read-only-copy sme-position-flex-none sme-button-auto-width sme-form-field-height sme-icon sme-icon-copy sme-margin-right-xs", 3, "title", "smeTooltipEnableEvents", "click", "toolTipFocusEventTriggered", "toolTipMouseEventTriggered", 4, "ngIf"], ["type", "button", "class", "sme-button-read-only-copy sme-position-flex-none sme-button-auto-width sme-form-field-height", 3, "smeDisabled", "click", 4, "ngIf"], [3, "alert"], ["type", "button", 1, "sme-button-read-only-copy", "sme-position-flex-none", "sme-button-auto-width", "sme-form-field-height", "sme-icon", "sme-icon-copy", "sme-margin-right-xs", 3, "title", "smeTooltipEnableEvents", "click", "toolTipFocusEventTriggered", "toolTipMouseEventTriggered"], ["type", "button", 1, "sme-button-read-only-copy", "sme-position-flex-none", "sme-button-auto-width", "sme-form-field-height", 3, "smeDisabled", "click"]], template: function ReadonlyFormFieldComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "sme-form-field-layout", 0)(1, "div", 1); i0.ɵɵelement(2, "sme-icon-text", 2); i0.ɵɵtemplate(3, ReadonlyFormFieldComponent_button_3_Template, 1, 3, "button", 3); i0.ɵɵtemplate(4, ReadonlyFormFieldComponent_button_4_Template, 4, 7, "button", 4); i0.ɵɵelementEnd(); i0.ɵɵelement(5, "sme-validation-alert", 5); i0.ɵɵelementEnd(); } if (rf & 2) { i0.ɵɵproperty("formField", ctx); i0.ɵɵadvance(2); i0.ɵɵclassProp("sme-position-stretch-h", !ctx.showCopyAction && !ctx.showFieldAction && !ctx.urlIcon)("sme-padding-right-lg", ctx.smeIconClassName || ctx.urlIcon); i0.ɵɵproperty("smeIconClassName", ctx.smeIconClassName)("urlIcon", ctx.urlIcon)("readOnlyFormFieldLabel", ctx.label)("title", ctx.value)("readOnlyFormField", true); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx.showCopyAction); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx.showFieldAction); i0.ɵɵadvance(1); i0.ɵɵproperty("alert", ctx.alert); } }, dependencies: [i1.NgIf, i2.IconTextComponent, i3.DisabledDirective, i4.TooltipDirective, i5.ValidationAlertComponent, i6.FormFieldLayoutComponent], encapsulation: 2 }); __decorate([ Debounce(), __metadata("design:type", Function), __metadata("design:paramtypes", [ToolTipFocusEvent]), __metadata("design:returntype", void 0) ], ReadonlyFormFieldComponent.prototype, "onToolTipFocusEventTriggered", null); __decorate([ Debounce(), __metadata("design:type", Function), __metadata("design:paramtypes", [ToolTipMouseEvent]), __metadata("design:returntype", void 0) ], ReadonlyFormFieldComponent.prototype, "onToolTipMouseEventTriggered", null); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ReadonlyFormFieldComponent, [{ type: Component, args: [{ selector: 'sme-form-field[type="readonly"]', template: "<sme-form-field-layout [formField]=\"this\">\r\n <div class=\"sme-arrange-stack-h sme-form-field-editor\">\r\n <sme-icon-text class=\"sme-arrange-stack-h\" [class.sme-position-stretch-h]=\"!showCopyAction && !showFieldAction && !urlIcon\" [class.sme-padding-right-lg]=\"smeIconClassName || urlIcon\"\r\n [smeIconClassName]=\"smeIconClassName\"\r\n [urlIcon]=\"urlIcon\"\r\n [readOnlyFormFieldLabel]=\"label\"\r\n [title]=\"value\"\r\n [readOnlyFormField]=\"true\">\r\n </sme-icon-text>\r\n <button *ngIf=\"showCopyAction\" type=\"button\"\r\n class=\"sme-button-read-only-copy sme-position-flex-none sme-button-auto-width sme-form-field-height sme-icon sme-icon-copy sme-margin-right-xs\"\r\n (click)=\"copyToClipboardInternal($event)\"\r\n (toolTipFocusEventTriggered)=\"onToolTipFocusEventTriggered($event)\"\r\n (toolTipMouseEventTriggered)=\"onToolTipMouseEventTriggered($event)\"\r\n [attr.aria-label]=\"fieldCopyText ? fieldCopyText : null\"\r\n [title]=\"fieldCopyText\"\r\n [smeTooltipEnableEvents]=\"true\">\r\n </button>\r\n <button *ngIf=\"showFieldAction\" type=\"button\"\r\n class=\"sme-button-read-only-copy sme-position-flex-none sme-button-auto-width sme-form-field-height\"\r\n (click)=\"onFieldAction()\"\r\n [smeDisabled]=\"loadingOrDisabled || pending || !isValid()\">\r\n <span class=\"sme-icon {{fieldActionIconClass}}\" [class.sme-margin-right-xs]=\"!!fieldActionText\"></span>\r\n <span>{{ fieldActionText }}</span>\r\n </button>\r\n </div>\r\n <sme-validation-alert [alert]=\"alert\"></sme-validation-alert>\r\n</sme-form-field-layout>\r\n" }] }], function () { return [{ type: i0.Injector }]; }, { smeIconClassName: [{ type: Input }], urlIcon: [{ type: Input }], showCopyAction: [{ type: Input }], fieldCopyText: [{ type: Input }], showFieldAction: [{ type: Input }], fieldActionText: [{ type: Input }], fieldActionIconClass: [{ type: Input }], fieldAction: [{ type: Output }], onToolTipFocusEventTriggered: [], onToolTipMouseEventTriggered: [] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZG9ubHktZm9ybS1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9mb3JtL2Zvcm0tZmllbGQvcmVhZG9ubHkvcmVhZG9ubHktZm9ybS1maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9mb3JtL2Zvcm0tZmllbGQvcmVhZG9ubHkvcmVhZG9ubHktZm9ybS1maWVsZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDhFQUE4RSxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzFGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHlCQUF5QixDQUFDOzs7Ozs7Ozs7OztJQ01wRSxpQ0FPa0M7SUFMaEMsZ0xBQVMsZUFBQSxzQ0FBK0IsQ0FBQSxJQUFDLDZNQUNYLGVBQUEsMkNBQW9DLENBQUEsSUFEekIsNk1BRVgsZUFBQSwyQ0FBb0MsQ0FBQSxJQUZ6QjtJQU0zQyxpQkFBUzs7O0lBRlAsNENBQXVCLGdDQUFBO0lBRHZCLGdGQUF3RDs7OztJQUkxRCxpQ0FHNkQ7SUFEM0QsMEtBQVMsZUFBQSxzQkFBZSxDQUFBLElBQUM7SUFFekIsdUJBQXVHO0lBQ3ZHLDRCQUFNO0lBQUEsWUFBcUI7SUFBQSxpQkFBTyxFQUFBOzs7SUFGbEMsNkZBQTBEO0lBQ3BELGVBQXlDO0lBQXpDLHVFQUF5QztJQUFDLCtEQUErQztJQUN6RixlQUFxQjtJQUFyQiw0Q0FBcUI7O0FEbEJq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SW5qZWN0b3IsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEZWJvdW5jZSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvYmFzZS9kZWNvcmF0b3JzL2RlYm91bmNlLmRlY29yYXRvcnMnO1xyXG5pbXBvcnQgeyBUb29sVGlwRm9jdXNFdmVudCwgVG9vbFRpcE1vdXNlRXZlbnQgfSBmcm9tICcuLi8uLi8uLi90b29sdGlwL3Rvb2x0aXAuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgU21lSW50ZXJuYWxGb3JtRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9mb3JtLWZpZWxkLmNvbXBvbmVudCc7XHJcblxyXG4vKipcclxuICogQWNjZXNzaWJsZSBJbXBsZW1lbnRhdGlvbiBvZiBhIHJlYWRvbmx5IGZvcm0gZmllbGRcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdzbWUtZm9ybS1maWVsZFt0eXBlPVwicmVhZG9ubHlcIl0nLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL3JlYWRvbmx5LWZvcm0tZmllbGQuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSZWFkb25seUZvcm1GaWVsZENvbXBvbmVudCBleHRlbmRzIFNtZUludGVybmFsRm9ybUZpZWxkQ29tcG9uZW50PHN0cmluZz4gaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHNvdXJjZSBuYW1lIHRvIHVzZSBmb3IgbG9nZ2luZ1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgZ2V0IGxvZ1NvdXJjZU5hbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuICdSZWFkb25seUZvcm1GaWVsZENvbXBvbmVudCc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc21lIGljb24gY2xhc3MgZm9yIE1ETCBpY29uc1xyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNtZUljb25DbGFzc05hbWU6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzbWUgaWNvbiBjbGFzcyBmb3IgVVJMIGljb25zXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgdXJsSWNvbjogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGNvcHkgYWN0aW9uIHNob3VsZCBiZSBzaG93blxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNob3dDb3B5QWN0aW9uOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRleHQgZm9yIHRoZSBjb3B5IGFjdGlvblxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGZpZWxkQ29weVRleHQ6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBmaWVsZCBhY3Rpb24gc2hvdWxkIGJlIHNob3duXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2hvd0ZpZWxkQWN0aW9uOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRleHQgZm9yIHRoZSBmaWVsZCBhY3Rpb25cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBmaWVsZEFjdGlvblRleHQ6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpY29uIGNsYXNzIGZvciB0aGUgZmllbGQgYWN0aW9uXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZmllbGRBY3Rpb25JY29uQ2xhc3M6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBvdXRwdXQgZm9yIHdoZW4gdGhlIGZpZWxkIGFjdGlvbiBpcyBhY3RpdmF0ZWRcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgZmllbGRBY3Rpb246IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaW1lciB0byBndWFyYW50ZWUgbW91c2UgbGVhdmUgdGltZSB0byByZXNldCBjb250ZXh0IGZyb20gY29waWVkIHRvIGRlZmF1bHQuXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCByZWFkb25seSBjb3BpZWRUZXh0VG9EZWZhdWx0VGltZXIgPSAyMDAwO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG9iamVjdCB0byBob2xkIHRoZSBzZXRUaW1lb3V0IG9iamVjdCBmb3IgY2xlYXJpbmcgdGltZW91dC5cclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGNvcGllZFRleHRUb0RlZmF1bHRUaW1lb3V0T2JqZWN0OiBhbnk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbG9jayBmb3IgZGVhbGluZyB3aXRoIGNsaWNraW5nIGV2ZW50cyB0aGF0IGNhdXNlcyBmb2N1cyBsb3N0IG9mIHRoZSBidXR0b24uXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBmb2N1c0V2ZW50TG9jayA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGJhY2stdXAgcGFyYW1ldGVyIGZvciB0aGUgY29weSB0ZXh0O1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGZpZWxkQ29weVRleHRCYWNrVXA6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBUb2dnbGVTd2l0Y2hGb3JtRmllbGRDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgaW5qZWN0b3I6IEluamVjdG9yXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcihpbmplY3Rvcik7XHJcbiAgICAgICAgdGhpcy5maWVsZENvcHlUZXh0ID0gdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkZvcm0uQWN0aW9ucy5jb3B5O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLnNldEZpZWxkQ29weVRleHRCYWNrVXAodGhpcy5maWVsZENvcHlUZXh0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEV4ZWN1dGVzIHRoZSBmaWVsZCBhY3Rpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uRmllbGRBY3Rpb24oKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5maWVsZEFjdGlvbi5lbWl0KHRoaXMudmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT24gY2xpY2sgZnVuY3Rpb24gZm9yIGNvcHkgdG8gY2xpcGJvYXJkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29weVRvQ2xpcGJvYXJkSW50ZXJuYWwoJGV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCEkZXZlbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRm9yIHRoZSBrZXlib2FyZCBwcmVzcywgbWFrZSBzdXJlIHRvIG5vdCBsb3N0IGZvY3VzLlxyXG4gICAgICAgIC8vIEJ5IGRlZmF1bHQgdGhlIGZvY3VzIHdvdWxkIGJlIGxhbmRpbmcgb24gdGhlIHRvb2x0aXAgZm9yIHJlYWRpbmcgdGhlIGNvbnRlbnQgb3V0LFxyXG4gICAgICAgIC8vIEluIG91ciBjYXNlLCB3ZSBmb3JjZSB0aGUgZm9jdXMgdG8gc3RheSBvbiB0aGUgYnV0dG9uIGFuZCByZWFkIGludGVybmFsIGFyaWEgbGFiZWwuXHJcbiAgICAgICAgaWYgKCRldmVudC5wb2ludGVySWQgPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZm9jdXNFdmVudExvY2sgPSBmYWxzZTtcclxuICAgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAkZXZlbnQudGFyZ2V0LmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpZWxkQ29weVRleHQgPSB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRm9ybS5BY3Rpb25zLmNvcGllZDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gbW91c2UgY2xpY2tcclxuICAgICAgICAgICAgdGhpcy5mb2N1c0V2ZW50TG9jayA9IHRydWU7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maWVsZENvcHlUZXh0ID0gdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkZvcm0uQWN0aW9ucy5jb3BpZWQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3VwZXIuY29weVRvQ2xpcGJvYXJkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBoYW5kbGVzIHRoZSBldmVudCBmcm9tIHRoZSB0b29sdGlwIGFib3V0IGZvY3VzIGluL291dCBvZiBib3VuZC5cclxuICAgICAqIEFkZGluZyBkZWJvdW5jZSB0byBvbmx5IHByb2Nlc3MgdGhlIGxhc3Qgc2lnbmFsIHdpdGhpbiBkZWJvdW5jZSB0aW1lci5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gJGV2ZW50IFRoZSB0b29sIHRpcCBmb2N1cyBpbi9vdXQgZXZlbnQuXHJcbiAgICAgKi9cclxuICAgIEBEZWJvdW5jZSgpXHJcbiAgICBwdWJsaWMgb25Ub29sVGlwRm9jdXNFdmVudFRyaWdnZXJlZCgkZXZlbnQ6IFRvb2xUaXBGb2N1c0V2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCEkZXZlbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCRldmVudCA9PT0gVG9vbFRpcEZvY3VzRXZlbnQuZm9jdXNPdXQpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmZvY3VzRXZlbnRMb2NrKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpZWxkQ29weVRleHQgPSB0aGlzLmZpZWxkQ29weVRleHRCYWNrVXA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBoYW5kbGVzIHRoZSBldmVudCBmcm9tIHRoZSB0b29sdGlwIGFib3V0IG1vdXNlIGVudGVyL2xlYXZlIGV2ZW50LlxyXG4gICAgICogQWRkaW5nIGRlYm91bmNlIHRvIG9ubHkgcHJvY2VzcyB0aGUgbGFzdCBzaWduYWwgd2l0aGluIGRlYm91bmNlIHRpbWVyLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSAkZXZlbnQgVGhlIHRvb2wgdGlwIG1vdXNlIGVudGVyL2xlYXZlIGV2ZW50LlxyXG4gICAgICovXHJcbiAgICBARGVib3VuY2UoKVxyXG4gICAgcHVibGljIG9uVG9vbFRpcE1vdXNlRXZlbnRUcmlnZ2VyZWQoJGV2ZW50OiBUb29sVGlwTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghJGV2ZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICgkZXZlbnQgPT09IFRvb2xUaXBNb3VzZUV2ZW50Lm1vdXNlTGVhdmUpIHtcclxuICAgICAgICAgICAgdGhpcy5jb3BpZWRUZXh0VG9EZWZhdWx0VGltZW91dE9iamVjdCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maWVsZENvcHlUZXh0ID0gdGhpcy5maWVsZENvcHlUZXh0QmFja1VwO1xyXG4gICAgICAgICAgICB9LCB0aGlzLmNvcGllZFRleHRUb0RlZmF1bHRUaW1lcik7XHJcbiAgICAgICAgfSBlbHNlIGlmICgkZXZlbnQgPT09IFRvb2xUaXBNb3VzZUV2ZW50Lm1vdXNlRW50ZXIpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29waWVkVGV4dFRvRGVmYXVsdFRpbWVvdXRPYmplY3QpIHtcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmNvcGllZFRleHRUb0RlZmF1bHRUaW1lb3V0T2JqZWN0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IHVwZGF0ZXMgdGhlIGRlZmF1bHQgY29weSB0ZXh0LiBDYW4gYmUgdXNlZnVsIHdoZW4gdGhlIHRvb2x0aXAgdGV4dCB3aWxsIGNoYW5nZSBmcm9tIGV4dGVybmFsLlxyXG4gICAgICogQHBhcmFtIGlucHV0IHRoZSBzdHJpbmcgZm9yIHRoZSBjb3B5IHRleHRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldEZpZWxkQ29weVRleHRCYWNrVXAoaW5wdXQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZmllbGRDb3B5VGV4dEJhY2tVcCA9IGlucHV0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyB0aGUgaWRCYWcgdXNlZCBieSB0aGlzIGNvbXBvbmVudCB0byBzdG9yZSB1bmlxdWUgZWxlbWVudCBpZHMuXHJcbiAgICAgKiBpZCB2YWx1ZXMgd2lsbCBiZSBhc3NpZ25lZCBiZSB0aGUgQHNlZSBCYXNlQ29tcG9uZW50IHN1cGVyIGNsYXNzLlxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgY3JlYXRlSWRCYWcoKTogTXNmdFNtZS5TdHJpbmdNYXA8c3RyaW5nPiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZGV0YWlsc1NwYW46ICcnXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG4iLCI8c21lLWZvcm0tZmllbGQtbGF5b3V0IFtmb3JtRmllbGRdPVwidGhpc1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJzbWUtYXJyYW5nZS1zdGFjay1oIHNtZS1mb3JtLWZpZWxkLWVkaXRvclwiPlxyXG4gICAgPHNtZS1pY29uLXRleHQgY2xhc3M9XCJzbWUtYXJyYW5nZS1zdGFjay1oXCIgW2NsYXNzLnNtZS1wb3NpdGlvbi1zdHJldGNoLWhdPVwiIXNob3dDb3B5QWN0aW9uICYmICFzaG93RmllbGRBY3Rpb24gJiYgIXVybEljb25cIiBbY2xhc3Muc21lLXBhZGRpbmctcmlnaHQtbGddPVwic21lSWNvbkNsYXNzTmFtZSB8fCB1cmxJY29uXCJcclxuICAgICAgW3NtZUljb25DbGFzc05hbWVdPVwic21lSWNvbkNsYXNzTmFtZVwiXHJcbiAgICAgIFt1cmxJY29uXT1cInVybEljb25cIlxyXG4gICAgICBbcmVhZE9ubHlGb3JtRmllbGRMYWJlbF09XCJsYWJlbFwiXHJcbiAgICAgIFt0aXRsZV09XCJ2YWx1ZVwiXHJcbiAgICAgIFtyZWFkT25seUZvcm1GaWVsZF09XCJ0cnVlXCI+XHJcbiAgICA8L3NtZS1pY29uLXRleHQ+XHJcbiAgICA8YnV0dG9uICpuZ0lmPVwic2hvd0NvcHlBY3Rpb25cIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgY2xhc3M9XCJzbWUtYnV0dG9uLXJlYWQtb25seS1jb3B5IHNtZS1wb3NpdGlvbi1mbGV4LW5vbmUgc21lLWJ1dHRvbi1hdXRvLXdpZHRoIHNtZS1mb3JtLWZpZWxkLWhlaWdodCBzbWUtaWNvbiBzbWUtaWNvbi1jb3B5IHNtZS1tYXJnaW4tcmlnaHQteHNcIlxyXG4gICAgICAoY2xpY2spPVwiY29weVRvQ2xpcGJvYXJkSW50ZXJuYWwoJGV2ZW50KVwiXHJcbiAgICAgICh0b29sVGlwRm9jdXNFdmVudFRyaWdnZXJlZCk9XCJvblRvb2xUaXBGb2N1c0V2ZW50VHJpZ2dlcmVkKCRldmVudClcIlxyXG4gICAgICAodG9vbFRpcE1vdXNlRXZlbnRUcmlnZ2VyZWQpPVwib25Ub29sVGlwTW91c2VFdmVudFRyaWdnZXJlZCgkZXZlbnQpXCJcclxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJmaWVsZENvcHlUZXh0ID8gZmllbGRDb3B5VGV4dCA6IG51bGxcIlxyXG4gICAgICBbdGl0bGVdPVwiZmllbGRDb3B5VGV4dFwiXHJcbiAgICAgIFtzbWVUb29sdGlwRW5hYmxlRXZlbnRzXT1cInRydWVcIj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiAqbmdJZj1cInNob3dGaWVsZEFjdGlvblwiIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICBjbGFzcz1cInNtZS1idXR0b24tcmVhZC1vbmx5LWNvcHkgc21lLXBvc2l0aW9uLWZsZXgtbm9uZSBzbWUtYnV0dG9uLWF1dG8td2lkdGggc21lLWZvcm0tZmllbGQtaGVpZ2h0XCJcclxuICAgICAgKGNsaWNrKT1cIm9uRmllbGRBY3Rpb24oKVwiXHJcbiAgICAgIFtzbWVEaXNhYmxlZF09XCJsb2FkaW5nT3JEaXNhYmxlZCB8fCBwZW5kaW5nIHx8ICFpc1ZhbGlkKClcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJzbWUtaWNvbiB7e2ZpZWxkQWN0aW9uSWNvbkNsYXNzfX1cIiBbY2xhc3Muc21lLW1hcmdpbi1yaWdodC14c109XCIhIWZpZWxkQWN0aW9uVGV4dFwiPjwvc3Bhbj5cclxuICAgICAgPHNwYW4+e3sgZmllbGRBY3Rpb25UZXh0IH19PC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9kaXY+XHJcbiAgPHNtZS12YWxpZGF0aW9uLWFsZXJ0IFthbGVydF09XCJhbGVydFwiPjwvc21lLXZhbGlkYXRpb24tYWxlcnQ+XHJcbjwvc21lLWZvcm0tZmllbGQtbGF5b3V0PlxyXG4iXX0=