@microsoft/windows-admin-center-sdk
Version:
Microsoft - Windows Admin Center Shell
190 lines • 28.1 kB
JavaScript
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=