UNPKG

@microsoft/windows-admin-center-sdk

Version:

Microsoft - Windows Admin Center Shell

190 lines 28.1 kB
import { Component, Injector, ViewChild } from '@angular/core'; import { DateTime } from '@microsoft/windows-admin-center-sdk/core/base/date/date-time'; import { DateType } from '@microsoft/windows-admin-center-sdk/core/base/date/date-type'; import { KeyCode } from '@microsoft/windows-admin-center-sdk/core/data/accessibility-manager'; import { Globalization } from '@microsoft/windows-admin-center-sdk/core/data/globalization'; import { DropdownComponent } from '../../../dropdown/dropdown.component'; import { CalendarFormFieldComponent } from '../calendar/calendar-form-field.component'; import { DateLikeFormFieldComponent } from '../date-like/date-like-form-field.component'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "../../../dropdown/dropdown.component"; import * as i3 from "../calendar/calendar-form-field.component"; import * as i4 from "../../validation-alert/validation-alert.component"; import * as i5 from "../form-field-accessor.directive"; import * as i6 from "../form-field-validator.directive"; import * as i7 from "../../form-field-layout/form-field-layout.component"; const _c0 = ["dropDown"]; const _c1 = ["calendar"]; const _c2 = ["type", "date"]; /** * Date Form Field Component */ export class DateFormFieldComponent extends DateLikeFormFieldComponent { /** * Initializes a new instance of the @see DateFormFieldComponent class. * @param injector The angular injection service. required by @see SmeInjectableBase decorator in the @see BaseComponent class */ constructor(injector) { super(injector); this.displayValueValid = false; } /** * The source name to use for logging */ get logSourceName() { return 'DateFormFieldComponent'; } /** * Handles toggled state changes */ onDropdownToggled(expanded) { if (expanded) { this.calendar.focus(); } else { this.focus(); } } /** * Handles keydown events on the dropdown toggle */ onToggleKeydown(event) { switch (event.keyCode) { case KeyCode.Enter: { this.dropDown.onToggleClick(event, true); event.stopImmediatePropagation(); event.stopPropagation(); event.preventDefault(); return; } case KeyCode.DownArrow: { if (event.altKey) { this.dropDown.onToggleClick(event, true); } return; } default: { return; } } } /** * Handles value changes from the date input */ commitDisplayValue() { const displayDate = new Date(this.displayValue); this.displayValueValid = !isNaN(displayDate.getTime()); this.expectValueChange = true; this.markAsDirty(); if (this.displayValueValid) { const valueAsDate = DateType.convert(this.value, DateType.Date); DateTime.copyDate(displayDate, valueAsDate); const dateType = MsftSme.isNullOrUndefined(this.dateType) ? this.detectedDateType : this.dateType; this.value = DateType.convert(valueAsDate, dateType); } else { this.ngModel.control.updateValueAndValidity(); } } /** * Occurs every time the value of the control changes, in the UI or programmatically. * @param value the value of the form control */ onValueChanged(value) { super.onValueChanged(value); if (!this.expectValueChange) { if (!value) { this.displayValue = ''; } else { const valueAsDate = DateType.convert(value, DateType.Date); this.displayValue = valueAsDate.toLocaleDateString(Globalization.localeId); } if (!this.displayValueValid) { this.displayValueValid = true; this.ngModel.control.updateValueAndValidity(); } } this.expectValueChange = false; } /** * Performs validation that is internal to this control * @param c The form control attached to this instance */ validate(c) { if (!this.displayValueValid) { return { invalidDisplayValue: { message: this.strings.MsftSmeShell.Angular.Form.Date.InvalidDate.format(DateTime.getLocaleDateStringFormat(Globalization.localeId.toLowerCase())) } }; } return this.validateAsDate(c) || super.validate(c); } /** * 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: '', dropDownContent: '' }; } } /** @nocollapse */ DateFormFieldComponent.ɵfac = function DateFormFieldComponent_Factory(t) { return new (t || DateFormFieldComponent)(i0.ɵɵdirectiveInject(i0.Injector)); }; /** @nocollapse */ DateFormFieldComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: DateFormFieldComponent, selectors: [["sme-form-field", "type", "date"]], viewQuery: function DateFormFieldComponent_Query(rf, ctx) { if (rf & 1) { i0.ɵɵviewQuery(_c0, 5); i0.ɵɵviewQuery(_c1, 5); } if (rf & 2) { let _t; i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.dropDown = _t.first); i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.calendar = _t.first); } }, features: [i0.ɵɵInheritDefinitionFeature], attrs: _c2, decls: 15, vars: 22, consts: [[3, "formField"], [1, "sme-arrange-stack-h", "sme-focus-zone", "sme-form-field-editor"], [1, "sme-combobox", 3, "autoToggle", "disabled", "autoWidth", "toggled"], ["dropDown", ""], [1, "sme-combobox-header", "sme-dropdown-toggle", 3, "keydown"], ["dropdownHeader", ""], ["type", "text", "role", "combobox", "spellcheck", "false", "autocapitalize", "off", "autocomplete", "off", 3, "ngModel", "placeholder", "ngModelChange"], ["textInput", ""], ["type", "button", "tabindex", "-1", "role", "presentation", "aria-hidden", "true", 1, "sme-button-trigger", "sme-button-auto-width", 3, "click"], ["dropDownButton", ""], [1, "sme-icon", "sme-icon-calendar"], [1, "sme-dropdown-content", "sme-dropdown-interaction-enabled", 3, "id"], ["type", "calendar", "orientation", "vertical", 1, "sme-padding-squish-v-sm", 3, "ngModel", "required", "hideHeader", "ngModelChange"], ["calendar", ""], [3, "alert"]], template: function DateFormFieldComponent_Template(rf, ctx) { if (rf & 1) { const _r5 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "sme-form-field-layout", 0)(1, "div", 1)(2, "sme-dropdown", 2, 3); i0.ɵɵlistener("toggled", function DateFormFieldComponent_Template_sme_dropdown_toggled_2_listener($event) { return ctx.onDropdownToggled($event); }); i0.ɵɵelementStart(4, "div", 4, 5); i0.ɵɵlistener("keydown", function DateFormFieldComponent_Template_div_keydown_4_listener($event) { return ctx.onToggleKeydown($event); }); i0.ɵɵelementStart(6, "input", 6, 7); i0.ɵɵlistener("ngModelChange", function DateFormFieldComponent_Template_input_ngModelChange_6_listener($event) { return ctx.displayValue = $event; })("ngModelChange", function DateFormFieldComponent_Template_input_ngModelChange_6_listener() { return ctx.commitDisplayValue(); }); i0.ɵɵelementEnd(); i0.ɵɵelementStart(8, "button", 8, 9); i0.ɵɵlistener("click", function DateFormFieldComponent_Template_button_click_8_listener($event) { i0.ɵɵrestoreView(_r5); const _r0 = i0.ɵɵreference(3); return i0.ɵɵresetView(_r0.onToggleClick($event, true)); }); i0.ɵɵelement(10, "span", 10); i0.ɵɵelementEnd()(); i0.ɵɵelementStart(11, "div", 11)(12, "sme-form-field", 12, 13); i0.ɵɵlistener("ngModelChange", function DateFormFieldComponent_Template_sme_form_field_ngModelChange_12_listener($event) { return ctx.value = $event; }); i0.ɵɵelementEnd()()()(); i0.ɵɵelement(14, "sme-validation-alert", 14); i0.ɵɵelementEnd(); } if (rf & 2) { const _r0 = i0.ɵɵreference(3); i0.ɵɵproperty("formField", ctx); i0.ɵɵadvance(2); i0.ɵɵproperty("autoToggle", false)("disabled", ctx.disabled)("autoWidth", true); i0.ɵɵadvance(4); i0.ɵɵproperty("ngModel", ctx.displayValue)("placeholder", ctx.placeholder); i0.ɵɵattribute("aria-required", ctx.required)("aria-controls", ctx.idBag.dropDownContent)("aria-label", ctx.label)("disabled", ctx.loadingOrDisabled ? true : null)("aria-owns", ctx.idBag.dropDownContent)("aria-expanded", _r0.isOpen)("aria-autocomplete", "none"); i0.ɵɵadvance(2); i0.ɵɵclassProp("sme-toggled", _r0.isOpen); i0.ɵɵattribute("disabled", ctx.loadingOrDisabled ? true : null)("aria-pressed", _r0.isOpen); i0.ɵɵadvance(3); i0.ɵɵproperty("id", ctx.idBag.dropDownContent); i0.ɵɵadvance(1); i0.ɵɵproperty("ngModel", ctx.value)("required", true)("hideHeader", true); i0.ɵɵadvance(2); i0.ɵɵproperty("alert", ctx.alert); } }, dependencies: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.RequiredValidator, i1.NgModel, i2.DropdownComponent, i3.CalendarFormFieldComponent, i4.ValidationAlertComponent, i5.FormFieldAccessorDirective, i6.FormFieldValidatorDirective, i7.FormFieldLayoutComponent], encapsulation: 2 }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DateFormFieldComponent, [{ type: Component, args: [{ selector: 'sme-form-field[type="date"]', template: "<sme-form-field-layout [formField]=\"this\">\r\n <div class=\"sme-arrange-stack-h sme-focus-zone sme-form-field-editor\">\r\n <sme-dropdown #dropDown [autoToggle]=\"false\" class=\"sme-combobox\" [disabled]=\"disabled\" [autoWidth]=\"true\"\r\n (toggled)=\"onDropdownToggled($event)\">\r\n <div #dropdownHeader class=\"sme-combobox-header sme-dropdown-toggle\" (keydown)=\"onToggleKeydown($event)\">\r\n <input #textInput type=\"text\"\r\n [attr.aria-required]=\"required\"\r\n role=\"combobox\" [(ngModel)]=\"displayValue\" (ngModelChange)=\"commitDisplayValue()\"\r\n [attr.aria-controls]=\"idBag.dropDownContent\" [attr.aria-label]=\"label\" [attr.disabled]=\"loadingOrDisabled ? true : null\"\r\n [attr.aria-owns]=\"idBag.dropDownContent\" [attr.aria-expanded]=\"dropDown.isOpen\"\r\n [attr.aria-autocomplete]=\"'none'\" spellcheck=\"false\" autocapitalize=\"off\" autocomplete=\"off\" [placeholder]=\"placeholder\" />\r\n <button #dropDownButton type=\"button\" [attr.disabled]=\"loadingOrDisabled ? true : null\" tabindex=\"-1\" role=\"presentation\"\r\n aria-hidden=\"true\" [attr.aria-pressed]=\"dropDown.isOpen\" [class.sme-toggled]=\"dropDown.isOpen\"\r\n class=\"sme-button-trigger sme-button-auto-width\" (click)=\"dropDown.onToggleClick($event, true)\">\r\n <span class=\"sme-icon sme-icon-calendar\"></span>\r\n </button>\r\n </div>\r\n <div class=\"sme-dropdown-content sme-dropdown-interaction-enabled\" [id]=\"idBag.dropDownContent\">\r\n <sme-form-field #calendar type=\"calendar\" [(ngModel)]=\"value\" [required]=\"true\" [hideHeader]=\"true\" orientation=\"vertical\"\r\n class=\"sme-padding-squish-v-sm\"></sme-form-field>\r\n </div>\r\n </sme-dropdown>\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 }]; }, { dropDown: [{ type: ViewChild, args: ['dropDown'] }], calendar: [{ type: ViewChild, args: ['calendar'] }] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1mb3JtLWZpZWxkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL2Zvcm0vZm9ybS1maWVsZC9kYXRlL2RhdGUtZm9ybS1maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9mb3JtL2Zvcm0tZmllbGQvZGF0ZS9kYXRlLWZvcm0tZmllbGQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRy9ELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw4REFBOEQsQ0FBQztBQUN4RixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOERBQThELENBQUM7QUFDeEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFFQUFxRSxDQUFDO0FBQzlGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUM1RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUV6RSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUN2RixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQzs7Ozs7Ozs7Ozs7O0FBRXpGOztHQUVHO0FBS0gsTUFBTSxPQUFPLHNCQUF1QixTQUFRLDBCQUEwQjtJQThCbEU7OztPQUdHO0lBQ0gsWUFBWSxRQUFrQjtRQUMxQixLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztJQUNuQyxDQUFDO0lBbkNEOztPQUVHO0lBQ0gsSUFBYyxhQUFhO1FBQ3ZCLE9BQU8sd0JBQXdCLENBQUM7SUFDcEMs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LDBCQUFBLG1CQUFBO1FBS2xCLGVBQTBCO1FBQTFCLDBDQUEwQixnQ0FBQTtRQUQxQyw2Q0FBK0IsNENBQUEseUJBQUEsaURBQUEsd0NBQUEsNkJBQUEsNkJBQUE7UUFNNEIsZUFBcUM7UUFBckMseUNBQXFDO1FBRGhFLCtEQUFpRCw0QkFBQTtRQU10QixlQUE0QjtRQUE1Qiw4Q0FBNEI7UUFDbkQsZUFBbUI7UUFBbkIsbUNBQW1CLGtCQUFBLG9CQUFBO1FBSzdDLGVBQWU7UUFBZixpQ0FBZTs7dUZESjFCLHNCQUFzQjtjQUpsQyxTQUFTOzJCQUNJLDZCQUE2QjsyREFhaEMsUUFBUTtrQkFEZCxTQUFTO21CQUFDLFVBQVU7WUFJZCxRQUFRO2tCQURkLFNBQVM7bUJBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0b3IsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgRGF0ZUxpa2UgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2Jhc2UvZGF0ZS9kYXRlLWxpa2UnO1xyXG5pbXBvcnQgeyBEYXRlVGltZSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvYmFzZS9kYXRlL2RhdGUtdGltZSc7XHJcbmltcG9ydCB7IERhdGVUeXBlIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9iYXNlL2RhdGUvZGF0ZS10eXBlJztcclxuaW1wb3J0IHsgS2V5Q29kZSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZGF0YS9hY2Nlc3NpYmlsaXR5LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBHbG9iYWxpemF0aW9uIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kYXRhL2dsb2JhbGl6YXRpb24nO1xyXG5pbXBvcnQgeyBEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2Ryb3Bkb3duL2Ryb3Bkb3duLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFZhbGlkYXRpb25BbGVydHMgfSBmcm9tICcuLi8uLi92YWxpZGF0aW9uLWFsZXJ0L3ZhbGlkYXRpb24tYWxlcnQnO1xyXG5pbXBvcnQgeyBDYWxlbmRhckZvcm1GaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2NhbGVuZGFyL2NhbGVuZGFyLWZvcm0tZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRGF0ZUxpa2VGb3JtRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9kYXRlLWxpa2UvZGF0ZS1saWtlLWZvcm0tZmllbGQuY29tcG9uZW50JztcclxuXHJcbi8qKlxyXG4gKiBEYXRlIEZvcm0gRmllbGQgQ29tcG9uZW50XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnc21lLWZvcm0tZmllbGRbdHlwZT1cImRhdGVcIl0nLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RhdGUtZm9ybS1maWVsZC5jb21wb25lbnQuaHRtbCdcclxufSlcclxuZXhwb3J0IGNsYXNzIERhdGVGb3JtRmllbGRDb21wb25lbnQgZXh0ZW5kcyBEYXRlTGlrZUZvcm1GaWVsZENvbXBvbmVudCB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc291cmNlIG5hbWUgdG8gdXNlIGZvciBsb2dnaW5nXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXQgbG9nU291cmNlTmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gJ0RhdGVGb3JtRmllbGRDb21wb25lbnQnO1xyXG4gICAgfVxyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ2Ryb3BEb3duJylcclxuICAgIHB1YmxpYyBkcm9wRG93bjogRHJvcGRvd25Db21wb25lbnQ7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnY2FsZW5kYXInKVxyXG4gICAgcHVibGljIGNhbGVuZGFyOiBDYWxlbmRhckZvcm1GaWVsZENvbXBvbmVudDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBjdXJyZW50IGVkaXRhYmxlIGRpc3BsYXkgdmFsdWUgb2YgdGhpcyBmaWVsZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGlzcGxheVZhbHVlOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBpbmRpY2F0ZXMgaWYgdGhlIGRpc3BsYXkgdmFsdWUgaXMgdmFsaWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRpc3BsYXlWYWx1ZVZhbGlkOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogaW5kaWNhdGVzIGlmIGEgdmFsdWUgY2hhbmdlIGlzIGV4cGVjdGVkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBleHBlY3RWYWx1ZUNoYW5nZTogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBAc2VlIERhdGVGb3JtRmllbGRDb21wb25lbnQgY2xhc3MuXHJcbiAgICAgKiBAcGFyYW0gaW5qZWN0b3IgVGhlIGFuZ3VsYXIgaW5qZWN0aW9uIHNlcnZpY2UuIHJlcXVpcmVkIGJ5IEBzZWUgU21lSW5qZWN0YWJsZUJhc2UgZGVjb3JhdG9yIGluIHRoZSBAc2VlIEJhc2VDb21wb25lbnQgY2xhc3NcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoaW5qZWN0b3I6IEluamVjdG9yKSB7XHJcbiAgICAgICAgc3VwZXIoaW5qZWN0b3IpO1xyXG4gICAgICAgIHRoaXMuZGlzcGxheVZhbHVlVmFsaWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhbmRsZXMgdG9nZ2xlZCBzdGF0ZSBjaGFuZ2VzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkRyb3Bkb3duVG9nZ2xlZChleHBhbmRlZDogYm9vbGVhbikge1xyXG4gICAgICAgIGlmIChleHBhbmRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmNhbGVuZGFyLmZvY3VzKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhbmRsZXMga2V5ZG93biBldmVudHMgb24gdGhlIGRyb3Bkb3duIHRvZ2dsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25Ub2dnbGVLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5FbnRlcjoge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kcm9wRG93bi5vblRvZ2dsZUNsaWNrKGV2ZW50LCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5Eb3duQXJyb3c6IHtcclxuICAgICAgICAgICAgICAgIGlmIChldmVudC5hbHRLZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyb3BEb3duLm9uVG9nZ2xlQ2xpY2soZXZlbnQsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHsgcmV0dXJuOyB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlcyB2YWx1ZSBjaGFuZ2VzIGZyb20gdGhlIGRhdGUgaW5wdXRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbW1pdERpc3BsYXlWYWx1ZSgpIHtcclxuICAgICAgICBjb25zdCBkaXNwbGF5RGF0ZSA9IG5ldyBEYXRlKHRoaXMuZGlzcGxheVZhbHVlKTtcclxuICAgICAgICB0aGlzLmRpc3BsYXlWYWx1ZVZhbGlkID0gIWlzTmFOKGRpc3BsYXlEYXRlLmdldFRpbWUoKSk7XHJcbiAgICAgICAgdGhpcy5leHBlY3RWYWx1ZUNoYW5nZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICAgIGlmICh0aGlzLmRpc3BsYXlWYWx1ZVZhbGlkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlQXNEYXRlID0gRGF0ZVR5cGUuY29udmVydCh0aGlzLnZhbHVlLCBEYXRlVHlwZS5EYXRlKTtcclxuICAgICAgICAgICAgRGF0ZVRpbWUuY29weURhdGUoZGlzcGxheURhdGUsIHZhbHVlQXNEYXRlKTtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZVR5cGUgPSBNc2Z0U21lLmlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuZGF0ZVR5cGUpID8gdGhpcy5kZXRlY3RlZERhdGVUeXBlIDogdGhpcy5kYXRlVHlwZTtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IERhdGVUeXBlLmNvbnZlcnQodmFsdWVBc0RhdGUsIGRhdGVUeXBlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm5nTW9kZWwuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2NjdXJzIGV2ZXJ5IHRpbWUgdGhlIHZhbHVlIG9mIHRoZSBjb250cm9sIGNoYW5nZXMsIGluIHRoZSBVSSBvciBwcm9ncmFtbWF0aWNhbGx5LlxyXG4gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgZm9ybSBjb250cm9sXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBvblZhbHVlQ2hhbmdlZCh2YWx1ZTogRGF0ZUxpa2UpIHtcclxuICAgICAgICBzdXBlci5vblZhbHVlQ2hhbmdlZCh2YWx1ZSk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmV4cGVjdFZhbHVlQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheVZhbHVlID0gJyc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZUFzRGF0ZSA9IERhdGVUeXBlLmNvbnZlcnQodmFsdWUsIERhdGVUeXBlLkRhdGUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5VmFsdWUgPSB2YWx1ZUFzRGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoR2xvYmFsaXphdGlvbi5sb2NhbGVJZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmRpc3BsYXlWYWx1ZVZhbGlkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlWYWx1ZVZhbGlkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMubmdNb2RlbC5jb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmV4cGVjdFZhbHVlQ2hhbmdlID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQZXJmb3JtcyB2YWxpZGF0aW9uIHRoYXQgaXMgaW50ZXJuYWwgdG8gdGhpcyBjb250cm9sXHJcbiAgICAgKiBAcGFyYW0gYyBUaGUgZm9ybSBjb250cm9sIGF0dGFjaGVkIHRvIHRoaXMgaW5zdGFuY2VcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHZhbGlkYXRlKGM6IEZvcm1Db250cm9sKTogVmFsaWRhdGlvbkFsZXJ0cyB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRpc3BsYXlWYWx1ZVZhbGlkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBpbnZhbGlkRGlzcGxheVZhbHVlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkZvcm0uRGF0ZS5JbnZhbGlkRGF0ZS5mb3JtYXQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIERhdGVUaW1lLmdldExvY2FsZURhdGVTdHJpbmdGb3JtYXQoR2xvYmFsaXphdGlvbi5sb2NhbGVJZC50b0xvd2VyQ2FzZSgpKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVBc0RhdGUoYykgfHwgc3VwZXIudmFsaWRhdGUoYyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIHRoZSBpZEJhZyB1c2VkIGJ5IHRoaXMgY29tcG9uZW50IHRvIHN0b3JlIHVuaXF1ZSBlbGVtZW50IGlkcy5cclxuICAgICAqIGlkIHZhbHVlcyB3aWxsIGJlIGFzc2lnbmVkIGJlIHRoZSBAc2VlIEJhc2VDb21wb25lbnQgc3VwZXIgY2xhc3MuXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBjcmVhdGVJZEJhZygpOiBNc2Z0U21lLlN0cmluZ01hcDxzdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBkZXRhaWxzU3BhbjogJycsXHJcbiAgICAgICAgICAgIGRyb3BEb3duQ29udGVudDogJydcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbiIsIjxzbWUtZm9ybS1maWVsZC1sYXlvdXQgW2Zvcm1GaWVsZF09XCJ0aGlzXCI+XHJcbiAgPGRpdiBjbGFzcz1cInNtZS1hcnJhbmdlLXN0YWNrLWggc21lLWZvY3VzLXpvbmUgc21lLWZvcm0tZmllbGQtZWRpdG9yXCI+XHJcbiAgICA8c21lLWRyb3Bkb3duICNkcm9wRG93biBbYXV0b1RvZ2dsZV09XCJmYWxzZVwiIGNsYXNzPVwic21lLWNvbWJvYm94XCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgW2F1dG9XaWR0aF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgKHRvZ2dsZWQpPVwib25Ecm9wZG93blRvZ2dsZWQoJGV2ZW50KVwiPlxyXG4gICAgICA8ZGl2ICNkcm9wZG93bkhlYWRlciBjbGFzcz1cInNtZS1jb21ib2JveC1oZWFkZXIgc21lLWRyb3Bkb3duLXRvZ2dsZVwiIChrZXlkb3duKT1cIm9uVG9nZ2xlS2V5ZG93bigkZXZlbnQpXCI+XHJcbiAgICAgICAgPGlucHV0ICN0ZXh0SW5wdXQgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxyXG4gICAgICAgICAgICAgIHJvbGU9XCJjb21ib2JveFwiIFsobmdNb2RlbCldPVwiZGlzcGxheVZhbHVlXCIgKG5nTW9kZWxDaGFuZ2UpPVwiY29tbWl0RGlzcGxheVZhbHVlKClcIlxyXG4gICAgICAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cImlkQmFnLmRyb3BEb3duQ29udGVudFwiIFthdHRyLmFyaWEtbGFiZWxdPVwibGFiZWxcIiBbYXR0ci5kaXNhYmxlZF09XCJsb2FkaW5nT3JEaXNhYmxlZCA/IHRydWUgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1vd25zXT1cImlkQmFnLmRyb3BEb3duQ29udGVudFwiIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiZHJvcERvd24uaXNPcGVuXCJcclxuICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1hdXRvY29tcGxldGVdPVwiJ25vbmUnXCIgc3BlbGxjaGVjaz1cImZhbHNlXCIgYXV0b2NhcGl0YWxpemU9XCJvZmZcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIiAvPlxyXG4gICAgICAgIDxidXR0b24gI2Ryb3BEb3duQnV0dG9uIHR5cGU9XCJidXR0b25cIiBbYXR0ci5kaXNhYmxlZF09XCJsb2FkaW5nT3JEaXNhYmxlZCA/IHRydWUgOiBudWxsXCIgdGFiaW5kZXg9XCItMVwiIHJvbGU9XCJwcmVzZW50YXRpb25cIlxyXG4gICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCIgW2F0dHIuYXJpYS1wcmVzc2VkXT1cImRyb3BEb3duLmlzT3BlblwiIFtjbGFzcy5zbWUtdG9nZ2xlZF09XCJkcm9wRG93bi5pc09wZW5cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtYnV0dG9uLXRyaWdnZXIgc21lLWJ1dHRvbi1hdXRvLXdpZHRoXCIgKGNsaWNrKT1cImRyb3BEb3duLm9uVG9nZ2xlQ2xpY2soJGV2ZW50LCB0cnVlKVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzbWUtaWNvbiBzbWUtaWNvbi1jYWxlbmRhclwiPjwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzbWUtZHJvcGRvd24tY29udGVudCBzbWUtZHJvcGRvd24taW50ZXJhY3Rpb24tZW5hYmxlZFwiIFtpZF09XCJpZEJhZy5kcm9wRG93bkNvbnRlbnRcIj5cclxuICAgICAgICA8c21lLWZvcm0tZmllbGQgI2NhbGVuZGFyIHR5cGU9XCJjYWxlbmRhclwiIFsobmdNb2RlbCldPVwidmFsdWVcIiBbcmVxdWlyZWRdPVwidHJ1ZVwiIFtoaWRlSGVhZGVyXT1cInRydWVcIiBvcmllbnRhdGlvbj1cInZlcnRpY2FsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtcGFkZGluZy1zcXVpc2gtdi1zbVwiPjwvc21lLWZvcm0tZmllbGQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9zbWUtZHJvcGRvd24+XHJcbiAgPC9kaXY+XHJcbiAgPHNtZS12YWxpZGF0aW9uLWFsZXJ0IFthbGVydF09XCJhbGVydFwiPjwvc21lLXZhbGlkYXRpb24tYWxlcnQ+XHJcbjwvc21lLWZvcm0tZmllbGQtbGF5b3V0PlxyXG4iXX0=