@noaestudio/forms
Version:
Dynamic forms extension for Covalent
273 lines (272 loc) • 29 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Injectable, SkipSelf, Optional } from '@angular/core';
import { Validators, FormControl } from '@angular/forms';
import { TdDynamicInputComponent } from '../dynamic-elements/dynamic-input/dynamic-input.component';
import { TdDynamicFileInputComponent } from '../dynamic-elements/dynamic-file-input/dynamic-file-input.component';
import { TdDynamicTextareaComponent } from '../dynamic-elements/dynamic-textarea/dynamic-textarea.component';
import { TdDynamicSlideToggleComponent } from '../dynamic-elements/dynamic-slide-toggle/dynamic-slide-toggle.component';
import { TdDynamicCheckboxComponent } from '../dynamic-elements/dynamic-checkbox/dynamic-checkbox.component';
import { TdDynamicSliderComponent } from '../dynamic-elements/dynamic-slider/dynamic-slider.component';
import { TdDynamicSelectComponent } from '../dynamic-elements/dynamic-select/dynamic-select.component';
import { TdDynamicDatepickerComponent } from '../dynamic-elements/dynamic-datepicker/dynamic-datepicker.component';
import { TextEditorComponent } from '../dynamic-elements/text-editor/text-editor.component';
import { ColorPickerComponent } from '../dynamic-elements/color-picker/color-picker.component';
import { TimePickerComponent } from '../dynamic-elements/time-picker/time-picker.component';
import { DateTimePickerComponent } from '../dynamic-elements/date-time-picker/date-time-picker.component';
import { TranslateComponent } from '../dynamic-elements/translatable/translate.component';
import { FormOrganizationComponent } from '../dynamic-elements/form-organization/form-organization.component';
import { GallerySelectorComponent } from '../dynamic-elements/gallery-selector/gallery-selector.component';
import { TreeSelectorComponent } from '../dynamic-elements/tree-selector/tree-selector.component';
import { EditableTableComponent } from '../dynamic-elements/editable-table/editable-table.component';
import { ChipSelectorComponent } from '../dynamic-elements/chip-selector/chip-selector.component';
/** @enum {string} */
const TdDynamicType = {
Text: 'text',
Boolean: 'boolean',
Number: 'number',
Array: 'array',
Date: 'date',
};
export { TdDynamicType };
/** @enum {string} */
const TdDynamicElement = {
Input: 'input',
Datepicker: 'datepicker',
Password: 'password',
Textarea: 'textarea',
Slider: 'slider',
SlideToggle: 'slide-toggle',
Checkbox: 'checkbox',
Select: 'select',
FileInput: 'file-input',
TextEditor: 'text-editor',
ColorPicker: 'color-picker',
TimePicker: 'time-picker',
DateTimePicker: 'date-time-picker',
Organization: 'organization',
GallerySelector: 'gallery-selector',
TreeSelector: 'tree-selector',
EditableTable: 'editable-table',
ChipSelector: 'chip-selector',
};
export { TdDynamicElement };
/** @enum {number} */
const Visibility = {
None: -1,
All: 0,
Add: 1,
Edit: 2,
};
export { Visibility };
Visibility[Visibility.None] = "None";
Visibility[Visibility.All] = "All";
Visibility[Visibility.Add] = "Add";
Visibility[Visibility.Edit] = "Edit";
/**
* @record
*/
export function ITdDynamicElementValidator() { }
function ITdDynamicElementValidator_tsickle_Closure_declarations() {
/** @type {?} */
ITdDynamicElementValidator.prototype.validator;
}
/**
* @record
*/
export function ITdDynamicElementConfig() { }
function ITdDynamicElementConfig_tsickle_Closure_declarations() {
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.label;
/** @type {?} */
ITdDynamicElementConfig.prototype.name;
/** @type {?} */
ITdDynamicElementConfig.prototype.type;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.required;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.disabled;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.hidden;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.min;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.max;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.minLength;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.maxLength;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.step;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.selections;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.default;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.flex;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.validators;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.visibility;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.selectComplex;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.selectMultiple;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.searchable;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.translate;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.treeItems;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.action;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.schema;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.draggable;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.extras;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.extraFields;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.chips;
}
export const /** @type {?} */ DYNAMIC_ELEMENT_NAME_REGEX = /^[^0-9][^\@]*$/;
export class TdDynamicFormsService {
/**
* Method to validate if the [name] is a proper element name.
* Throws error if name is not valid.
* @param {?} name
* @return {?}
*/
validateDynamicElementName(name) {
if (!DYNAMIC_ELEMENT_NAME_REGEX.test(name)) {
throw new Error('Dynamic element name: "${name}" is not valid.');
}
}
/**
* Gets component to be rendered depending on [TdDynamicElement | TdDynamicType]
* Throws error if it does not exists or not supported.
* @param {?} element
* @param {?=} translate
* @return {?}
*/
getDynamicElement(element, translate = false) {
if (translate) {
return TranslateComponent;
}
switch (element) {
case TdDynamicType.Text:
case TdDynamicType.Number:
case TdDynamicElement.Input:
case TdDynamicElement.Password:
return TdDynamicInputComponent;
case TdDynamicElement.Textarea:
return TdDynamicTextareaComponent;
case TdDynamicType.Boolean:
case TdDynamicElement.SlideToggle:
return TdDynamicSlideToggleComponent;
case TdDynamicElement.Checkbox:
return TdDynamicCheckboxComponent;
case TdDynamicElement.Slider:
return TdDynamicSliderComponent;
case TdDynamicType.Array:
case TdDynamicElement.Select:
return TdDynamicSelectComponent;
case TdDynamicElement.FileInput:
return TdDynamicFileInputComponent;
case TdDynamicElement.Datepicker:
case TdDynamicType.Date:
return TdDynamicDatepickerComponent;
case TdDynamicElement.TextEditor:
return TextEditorComponent;
case TdDynamicElement.ColorPicker:
return ColorPickerComponent;
case TdDynamicElement.TimePicker:
return TimePickerComponent;
case TdDynamicElement.DateTimePicker:
return DateTimePickerComponent;
case TdDynamicElement.Organization:
return FormOrganizationComponent;
case TdDynamicElement.GallerySelector:
return GallerySelectorComponent;
case TdDynamicElement.TreeSelector:
return TreeSelectorComponent;
case TdDynamicElement.EditableTable:
return EditableTableComponent;
case TdDynamicElement.ChipSelector:
return ChipSelectorComponent;
default:
throw new Error(`Error: type ${element} does not exist or not supported.`);
}
}
/**
* Creates form control for element depending [ITdDynamicElementConfig] properties.
* @param {?} config
* @return {?}
*/
createFormControl(config) {
let /** @type {?} */ validator = this.createValidators(config);
return new FormControl({ value: config.default, disabled: config.disabled }, validator);
}
/**
* Creates form validationdepending [ITdDynamicElementConfig] properties.
* @param {?} config
* @return {?}
*/
createValidators(config) {
let /** @type {?} */ validator;
if (config.required) {
validator = Validators.required;
}
if (config.max || config.max === 0) {
validator = Validators.compose([validator, Validators.max(parseFloat(config.max))]);
}
if (config.min || config.min === 0) {
validator = Validators.compose([validator, Validators.min(parseFloat(config.min))]);
}
if (config.maxLength || config.maxLength === 0) {
validator = Validators.compose([validator, Validators.maxLength(parseFloat(config.maxLength))]);
}
if (config.minLength || config.minLength === 0) {
validator = Validators.compose([validator, Validators.minLength(parseFloat(config.minLength))]);
}
// Add provided custom validators to the validator function
if (config.validators) {
config.validators.forEach((validatorConfig) => {
validator = Validators.compose([validator, validatorConfig.validator]);
});
}
return validator;
}
}
TdDynamicFormsService.decorators = [
{ type: Injectable },
];
/** @nocollapse */
TdDynamicFormsService.ctorParameters = () => [];
function TdDynamicFormsService_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
TdDynamicFormsService.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
TdDynamicFormsService.ctorParameters;
}
/**
* @param {?} parent
* @return {?}
*/
export function DYNAMIC_FORMS_PROVIDER_FACTORY(parent) {
return parent || new TdDynamicFormsService();
}
export const /** @type {?} */ DYNAMIC_FORMS_PROVIDER = {
// If there is already a service available, use that. Otherwise, provide a new one.
provide: TdDynamicFormsService,
deps: [[new Optional(), new SkipSelf(), TdDynamicFormsService]],
useFactory: DYNAMIC_FORMS_PROVIDER_FACTORY,
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3Jtcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvdmFsZW50L2R5bmFtaWMtZm9ybXMvIiwic291cmNlcyI6WyJzZXJ2aWNlcy9keW5hbWljLWZvcm1zLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQVksUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RSxPQUFPLEVBQUUsVUFBVSxFQUFlLFdBQVcsRUFBbUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2RixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUNwRyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxxRUFBcUUsQ0FBQztBQUNsSCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpRUFBaUUsQ0FBQztBQUM3RyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSx5RUFBeUUsQ0FBQztBQUN4SCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpRUFBaUUsQ0FBQztBQUM3RyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUN2RyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUN2RyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxxRUFBcUUsQ0FBQztBQUVuSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUM1RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5REFBeUQsQ0FBQztBQUMvRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUM1RixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxpRUFBaUUsQ0FBQztBQUMxRyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUMxRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxtRUFBbUUsQ0FBQztBQUM5RyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxpRUFBaUUsQ0FBQztBQUMzRyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUNsRyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUNyRyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQzs7O1VBRzFGLE1BQU07YUFDSCxTQUFTO1lBQ1YsUUFBUTtXQUNULE9BQU87VUFDUixNQUFNOzs7OztXQUlMLE9BQU87Z0JBQ0YsWUFBWTtjQUNkLFVBQVU7Y0FDVixVQUFVO1lBQ1osUUFBUTtpQkFDSCxjQUFjO2NBQ2pCLFVBQVU7WUFDWixRQUFRO2VBQ0wsWUFBWTtnQkFDWCxhQUFhO2lCQUNaLGNBQWM7Z0JBQ2YsYUFBYTtvQkFDVCxrQkFBa0I7a0JBQ3BCLGNBQWM7cUJBQ1gsa0JBQWtCO2tCQUNyQixlQUFlO21CQUNkLGdCQUFnQjtrQkFDakIsZUFBZTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE0Qy9CLE1BQU0sQ0FBQyx1QkFBTSwwQkFBMEIsR0FBVyxnQkFBZ0IsQ0FBQztBQUduRSxNQUFNOzs7Ozs7O0lBTUwsMEJBQTBCLENBQUMsSUFBWTtRQUN0QyxFQUFFLENBQUMsQ0FBQyxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUMsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO1NBQ2pFO0tBQ0Q7Ozs7Ozs7O0lBTUQsaUJBQWlCLENBQUMsT0FBeUMsRUFBRSxZQUFzQixLQUFLO1FBQ3ZGLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDZixNQUFNLENBQUMsa0JBQWtCLENBQUM7U0FDMUI7UUFFRCxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2pCLEtBQUssYUFBYSxDQUFDLElBQUksQ0FBQztZQUN4QixLQUFLLGFBQWEsQ0FBQyxNQUFNLENBQUM7WUFDMUIsS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUM7WUFDNUIsS0FBSyxnQkFBZ0IsQ0FBQyxRQUFRO2dCQUM3QixNQUFNLENBQUMsdUJBQXVCLENBQUM7WUFDaEMsS0FBSyxnQkFBZ0IsQ0FBQyxRQUFRO2dCQUM3QixNQUFNLENBQUMsMEJBQTBCLENBQUM7WUFDbkMsS0FBSyxhQUFhLENBQUMsT0FBTyxDQUFDO1lBQzNCLEtBQUssZ0JBQWdCLENBQUMsV0FBVztnQkFDaEMsTUFBTSxDQUFDLDZCQUE2QixDQUFDO1lBQ3RDLEtBQUssZ0JBQWdCLENBQUMsUUFBUTtnQkFDN0IsTUFBTSxDQUFDLDBCQUEwQixDQUFDO1lBQ25DLEtBQUssZ0JBQWdCLENBQUMsTUFBTTtnQkFDM0IsTUFBTSxDQUFDLHdCQUF3QixDQUFDO1lBQ2pDLEtBQUssYUFBYSxDQUFDLEtBQUssQ0FBQztZQUN6QixLQUFLLGdCQUFnQixDQUFDLE1BQU07Z0JBQzNCLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQztZQUNqQyxLQUFLLGdCQUFnQixDQUFDLFNBQVM7Z0JBQzlCLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQztZQUNwQyxLQUFLLGdCQUFnQixDQUFDLFVBQVUsQ0FBQztZQUNqQyxLQUFLLGFBQWEsQ0FBQyxJQUFJO2dCQUN0QixNQUFNLENBQUMsNEJBQTRCLENBQUM7WUFDckMsS0FBSyxnQkFBZ0IsQ0FBQyxVQUFVO2dCQUMvQixNQUFNLENBQUMsbUJBQW1CLENBQUM7WUFDNUIsS0FBSyxnQkFBZ0IsQ0FBQyxXQUFXO2dCQUNoQyxNQUFNLENBQUMsb0JBQW9CLENBQUM7WUFDN0IsS0FBSyxnQkFBZ0IsQ0FBQyxVQUFVO2dCQUMvQixNQUFNLENBQUMsbUJBQW1CLENBQUM7WUFDNUIsS0FBSyxnQkFBZ0IsQ0FBQyxjQUFjO2dCQUNuQyxNQUFNLENBQUMsdUJBQXVCLENBQUM7WUFDaEMsS0FBSyxnQkFBZ0IsQ0FBQyxZQUFZO2dCQUNqQyxNQUFNLENBQUMseUJBQXlCLENBQUM7WUFDbEMsS0FBSyxnQkFBZ0IsQ0FBQyxlQUFlO2dCQUNwQyxNQUFNLENBQUMsd0JBQXdCLENBQUM7WUFDakMsS0FBSyxnQkFBZ0IsQ0FBQyxZQUFZO2dCQUNqQyxNQUFNLENBQUMscUJBQXFCLENBQUM7WUFDOUIsS0FBSyxnQkFBZ0IsQ0FBQyxhQUFhO2dCQUNsQyxNQUFNLENBQUMsc0JBQXNCLENBQUM7WUFDL0IsS0FBSyxnQkFBZ0IsQ0FBQyxZQUFZO2dCQUNqQyxNQUFNLENBQUMscUJBQXFCLENBQUM7WUFDOUI7Z0JBQ0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLE9BQU8sbUNBQW1DLENBQUMsQ0FBQztTQUM1RTtLQUNEOzs7Ozs7SUFLRCxpQkFBaUIsQ0FBQyxNQUErQjtRQUNoRCxxQkFBSSxTQUFTLEdBQWdCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzRCxNQUFNLENBQUMsSUFBSSxXQUFXLENBQUMsRUFBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0tBQ3RGOzs7Ozs7SUFLRCxnQkFBZ0IsQ0FBQyxNQUErQjtRQUMvQyxxQkFBSSxTQUFzQixDQUFDO1FBQzNCLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLFNBQVMsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDO1NBQ2hDO1FBQ0QsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3BGO1FBQ0QsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3BGO1FBQ0QsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEQsU0FBUyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2hHO1FBQ0QsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEQsU0FBUyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2hHOztRQUVELEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsZUFBMkMsRUFBRSxFQUFFO2dCQUN6RSxTQUFTLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQzthQUN2RSxDQUFDLENBQUM7U0FDSDtRQUNELE1BQU0sQ0FBQyxTQUFTLENBQUM7S0FDakI7OztZQXZHRCxVQUFVOzs7Ozs7Ozs7Ozs7Ozs7OztBQTBHWCxNQUFNLHlDQUNMLE1BQTZCO0lBQzVCLE1BQU0sQ0FBQyxNQUFNLElBQUksSUFBSSxxQkFBcUIsRUFBRSxDQUFDO0NBQzdDO0FBRUQsTUFBTSxDQUFDLHVCQUFNLHNCQUFzQixHQUFhOztJQUUvQyxPQUFPLEVBQUUscUJBQXFCO0lBQzlCLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxRQUFRLEVBQUUsRUFBRSxJQUFJLFFBQVEsRUFBRSxFQUFFLHFCQUFxQixDQUFDLENBQUM7SUFDL0QsVUFBVSxFQUFFLDhCQUE4QjtDQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgUHJvdmlkZXIsIFNraXBTZWxmLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBWYWxpZGF0b3JzLCBWYWxpZGF0b3JGbiwgRm9ybUNvbnRyb2wsIEFic3RyYWN0Q29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbmltcG9ydCB7IFRkRHluYW1pY0lucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vZHluYW1pYy1lbGVtZW50cy9keW5hbWljLWlucHV0L2R5bmFtaWMtaW5wdXQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVGREeW5hbWljRmlsZUlucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vZHluYW1pYy1lbGVtZW50cy9keW5hbWljLWZpbGUtaW5wdXQvZHluYW1pYy1maWxlLWlucHV0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRkRHluYW1pY1RleHRhcmVhQ29tcG9uZW50IH0gZnJvbSAnLi4vZHluYW1pYy1lbGVtZW50cy9keW5hbWljLXRleHRhcmVhL2R5bmFtaWMtdGV4dGFyZWEuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVGREeW5hbWljU2xpZGVUb2dnbGVDb21wb25lbnQgfSBmcm9tICcuLi9keW5hbWljLWVsZW1lbnRzL2R5bmFtaWMtc2xpZGUtdG9nZ2xlL2R5bmFtaWMtc2xpZGUtdG9nZ2xlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRkRHluYW1pY0NoZWNrYm94Q29tcG9uZW50IH0gZnJvbSAnLi4vZHluYW1pYy1lbGVtZW50cy9keW5hbWljLWNoZWNrYm94L2R5bmFtaWMtY2hlY2tib3guY29tcG9uZW50JztcclxuaW1wb3J0IHsgVGREeW5hbWljU2xpZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vZHluYW1pYy1lbGVtZW50cy9keW5hbWljLXNsaWRlci9keW5hbWljLXNsaWRlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUZER5bmFtaWNTZWxlY3RDb21wb25lbnQgfSBmcm9tICcuLi9keW5hbWljLWVsZW1lbnRzL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRkRHluYW1pY0RhdGVwaWNrZXJDb21wb25lbnQgfSBmcm9tICcuLi9keW5hbWljLWVsZW1lbnRzL2R5bmFtaWMtZGF0ZXBpY2tlci9keW5hbWljLWRhdGVwaWNrZXIuY29tcG9uZW50JztcclxuXHJcbmltcG9ydCB7IFRleHRFZGl0b3JDb21wb25lbnQgfSBmcm9tICcuLi9keW5hbWljLWVsZW1lbnRzL3RleHQtZWRpdG9yL3RleHQtZWRpdG9yLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvbG9yUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vZHluYW1pYy1lbGVtZW50cy9jb2xvci1waWNrZXIvY29sb3ItcGlja2VyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRpbWVQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuLi9keW5hbWljLWVsZW1lbnRzL3RpbWUtcGlja2VyL3RpbWUtcGlja2VyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERhdGVUaW1lUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vZHluYW1pYy1lbGVtZW50cy9kYXRlLXRpbWUtcGlja2VyL2RhdGUtdGltZS1waWNrZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVHJhbnNsYXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vZHluYW1pYy1lbGVtZW50cy90cmFuc2xhdGFibGUvdHJhbnNsYXRlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZvcm1Pcmdhbml6YXRpb25Db21wb25lbnQgfSBmcm9tICcuLi9keW5hbWljLWVsZW1lbnRzL2Zvcm0tb3JnYW5pemF0aW9uL2Zvcm0tb3JnYW5pemF0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEdhbGxlcnlTZWxlY3RvckNvbXBvbmVudCB9IGZyb20gJy4uL2R5bmFtaWMtZWxlbWVudHMvZ2FsbGVyeS1zZWxlY3Rvci9nYWxsZXJ5LXNlbGVjdG9yLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRyZWVTZWxlY3RvckNvbXBvbmVudCB9IGZyb20gJy4uL2R5bmFtaWMtZWxlbWVudHMvdHJlZS1zZWxlY3Rvci90cmVlLXNlbGVjdG9yLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEVkaXRhYmxlVGFibGVDb21wb25lbnQgfSBmcm9tICcuLi9keW5hbWljLWVsZW1lbnRzL2VkaXRhYmxlLXRhYmxlL2VkaXRhYmxlLXRhYmxlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENoaXBTZWxlY3RvckNvbXBvbmVudCB9IGZyb20gJy4uL2R5bmFtaWMtZWxlbWVudHMvY2hpcC1zZWxlY3Rvci9jaGlwLXNlbGVjdG9yLmNvbXBvbmVudCc7XHJcblxyXG5leHBvcnQgZW51bSBUZER5bmFtaWNUeXBlIHtcclxuXHRUZXh0ID0gJ3RleHQnLFxyXG5cdEJvb2xlYW4gPSAnYm9vbGVhbicsXHJcblx0TnVtYmVyID0gJ251bWJlcicsXHJcblx0QXJyYXkgPSAnYXJyYXknLFxyXG5cdERhdGUgPSAnZGF0ZSdcclxufVxyXG5cclxuZXhwb3J0IGVudW0gVGREeW5hbWljRWxlbWVudCB7XHJcblx0SW5wdXQgPSAnaW5wdXQnLFxyXG5cdERhdGVwaWNrZXIgPSAnZGF0ZXBpY2tlcicsXHJcblx0UGFzc3dvcmQgPSAncGFzc3dvcmQnLFxyXG5cdFRleHRhcmVhID0gJ3RleHRhcmVhJyxcclxuXHRTbGlkZXIgPSAnc2xpZGVyJyxcclxuXHRTbGlkZVRvZ2dsZSA9ICdzbGlkZS10b2dnbGUnLFxyXG5cdENoZWNrYm94ID0gJ2NoZWNrYm94JyxcclxuXHRTZWxlY3QgPSAnc2VsZWN0JyxcclxuXHRGaWxlSW5wdXQgPSAnZmlsZS1pbnB1dCcsXHJcblx0VGV4dEVkaXRvciA9ICd0ZXh0LWVkaXRvcicsXHJcblx0Q29sb3JQaWNrZXIgPSAnY29sb3ItcGlja2VyJyxcclxuXHRUaW1lUGlja2VyID0gJ3RpbWUtcGlja2VyJyxcclxuXHREYXRlVGltZVBpY2tlciA9ICdkYXRlLXRpbWUtcGlja2VyJyxcclxuXHRPcmdhbml6YXRpb24gPSAnb3JnYW5pemF0aW9uJyxcclxuXHRHYWxsZXJ5U2VsZWN0b3IgPSAnZ2FsbGVyeS1zZWxlY3RvcicsXHJcblx0VHJlZVNlbGVjdG9yID0gJ3RyZWUtc2VsZWN0b3InLFxyXG5cdEVkaXRhYmxlVGFibGUgPSAnZWRpdGFibGUtdGFibGUnLFxyXG5cdENoaXBTZWxlY3RvciA9ICdjaGlwLXNlbGVjdG9yJ1xyXG59XHJcblxyXG5leHBvcnQgZW51bSBWaXNpYmlsaXR5IHtcclxuXHROb25lID0gLTEsXHJcblx0QWxsID0gMCxcclxuXHRBZGQgPSAxLFxyXG5cdEVkaXQgPSAyXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVRkRHluYW1pY0VsZW1lbnRWYWxpZGF0b3Ige1xyXG5cdHZhbGlkYXRvcjogVmFsaWRhdG9yRm47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVRkRHluYW1pY0VsZW1lbnRDb25maWcge1xyXG5cdGxhYmVsPzogc3RyaW5nO1xyXG5cdG5hbWU6IHN0cmluZztcclxuXHR0eXBlOiBUZER5bmFtaWNUeXBlIHwgVGREeW5hbWljRWxlbWVudDtcclxuXHRyZXF1aXJlZD86IGJvb2xlYW47XHJcblx0ZGlzYWJsZWQ/OiBib29sZWFuO1xyXG5cdGhpZGRlbj86IGJvb2xlYW47XHJcblx0bWluPzogYW55O1xyXG5cdG1heD86IGFueTtcclxuXHRtaW5MZW5ndGg/OiBhbnk7XHJcblx0bWF4TGVuZ3RoPzogYW55O1xyXG5cdHN0ZXA/OiBudW1iZXIsXHJcblx0c2VsZWN0aW9ucz86IHN0cmluZ1tdIHwgeyB2YWx1ZTogYW55LCBsYWJlbDogc3RyaW5nIH1bXTtcclxuXHRkZWZhdWx0PzogYW55O1xyXG5cdGZsZXg/OiBudW1iZXI7XHJcblx0dmFsaWRhdG9ycz86IElUZER5bmFtaWNFbGVtZW50VmFsaWRhdG9yW107XHJcblx0dmlzaWJpbGl0eT8gOiBWaXNpYmlsaXR5O1xyXG5cdHNlbGVjdENvbXBsZXg/IDogYm9vbGVhbjtcclxuXHRzZWxlY3RNdWx0aXBsZT8gOiBib29sZWFuO1xyXG5cdHNlYXJjaGFibGU/OiBib29sZWFuO1xyXG5cdHRyYW5zbGF0ZT8gOiBib29sZWFuO1xyXG5cdHRyZWVJdGVtcz86IGFueTtcclxuXHRhY3Rpb24/IDogKHZhbHVlPyA6IGFueSkgPT4gUHJvbWlzZTxhbnk+O1xyXG5cdHNjaGVtYT8gOiBhbnk7XHJcblx0ZHJhZ2dhYmxlPyA6IGFueTtcclxuXHRleHRyYXM/IDogYW55O1xyXG5cdGV4dHJhRmllbGRzPzogc3RyaW5nW107XHJcblx0Y2hpcHM/IDogeyB2YWx1ZSA6IGFueSAsIGxhYmVsIDogc3RyaW5nLCBhY3RpdmUgOiBib29sZWFufVtdO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgRFlOQU1JQ19FTEVNRU5UX05BTUVfUkVHRVg6IFJlZ0V4cCA9IC9eW14wLTldW15cXEBdKiQvO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgVGREeW5hbWljRm9ybXNTZXJ2aWNlIHtcclxuXHJcblx0LyoqXHJcblx0KiBNZXRob2QgdG8gdmFsaWRhdGUgaWYgdGhlIFtuYW1lXSBpcyBhIHByb3BlciBlbGVtZW50IG5hbWUuXHJcblx0KiBUaHJvd3MgZXJyb3IgaWYgbmFtZSBpcyBub3QgdmFsaWQuXHJcblx0Ki9cclxuXHR2YWxpZGF0ZUR5bmFtaWNFbGVtZW50TmFtZShuYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuXHRcdGlmICghRFlOQU1JQ19FTEVNRU5UX05BTUVfUkVHRVgudGVzdChuYW1lKSkge1xyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0R5bmFtaWMgZWxlbWVudCBuYW1lOiBcIiR7bmFtZX1cIiBpcyBub3QgdmFsaWQuJyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQqIEdldHMgY29tcG9uZW50IHRvIGJlIHJlbmRlcmVkIGRlcGVuZGluZyBvbiBbVGREeW5hbWljRWxlbWVudCB8IFRkRHluYW1pY1R5cGVdXHJcblx0KiBUaHJvd3MgZXJyb3IgaWYgaXQgZG9lcyBub3QgZXhpc3RzIG9yIG5vdCBzdXBwb3J0ZWQuXHJcblx0Ki9cclxuXHRnZXREeW5hbWljRWxlbWVudChlbGVtZW50OiBUZER5bmFtaWNFbGVtZW50IHwgVGREeW5hbWljVHlwZSwgdHJhbnNsYXRlIDogYm9vbGVhbiA9IGZhbHNlKTogYW55IHtcclxuXHRcdGlmICh0cmFuc2xhdGUpIHtcclxuXHRcdFx0cmV0dXJuIFRyYW5zbGF0ZUNvbXBvbmVudDtcclxuXHRcdH1cclxuXHJcblx0XHRzd2l0Y2ggKGVsZW1lbnQpIHtcclxuXHRcdFx0Y2FzZSBUZER5bmFtaWNUeXBlLlRleHQ6XHJcblx0XHRcdGNhc2UgVGREeW5hbWljVHlwZS5OdW1iZXI6XHJcblx0XHRcdGNhc2UgVGREeW5hbWljRWxlbWVudC5JbnB1dDpcclxuXHRcdFx0Y2FzZSBUZER5bmFtaWNFbGVtZW50LlBhc3N3b3JkOlxyXG5cdFx0XHRcdHJldHVybiBUZER5bmFtaWNJbnB1dENvbXBvbmVudDtcclxuXHRcdFx0Y2FzZSBUZER5bmFtaWNFbGVtZW50LlRleHRhcmVhOlxyXG5cdFx0XHRcdHJldHVybiBUZER5bmFtaWNUZXh0YXJlYUNvbXBvbmVudDtcclxuXHRcdFx0Y2FzZSBUZER5bmFtaWNUeXBlLkJvb2xlYW46XHJcblx0XHRcdGNhc2UgVGREeW5hbWljRWxlbWVudC5TbGlkZVRvZ2dsZTpcclxuXHRcdFx0XHRyZXR1cm4gVGREeW5hbWljU2xpZGVUb2dnbGVDb21wb25lbnQ7XHJcblx0XHRcdGNhc2UgVGREeW5hbWljRWxlbWVudC5DaGVja2JveDpcclxuXHRcdFx0XHRyZXR1cm4gVGREeW5hbWljQ2hlY2tib3hDb21wb25lbnQ7XHJcblx0XHRcdGNhc2UgVGREeW5hbWljRWxlbWVudC5TbGlkZXI6XHJcblx0XHRcdFx0cmV0dXJuIFRkRHluYW1pY1NsaWRlckNvbXBvbmVudDtcclxuXHRcdFx0Y2FzZSBUZER5bmFtaWNUeXBlLkFycmF5OlxyXG5cdFx0XHRjYXNlIFRkRHluYW1pY0VsZW1lbnQuU2VsZWN0OlxyXG5cdFx0XHRcdHJldHVybiBUZER5bmFtaWNTZWxlY3RDb21wb25lbnQ7XHJcblx0XHRcdGNhc2UgVGREeW5hbWljRWxlbWVudC5GaWxlSW5wdXQ6XHJcblx0XHRcdFx0cmV0dXJuIFRkRHluYW1pY0ZpbGVJbnB1dENvbXBvbmVudDtcclxuXHRcdFx0Y2FzZSBUZER5bmFtaWNFbGVtZW50LkRhdGVwaWNrZXI6XHJcblx0XHRcdGNhc2UgVGREeW5hbWljVHlwZS5EYXRlOlxyXG5cdFx0XHRcdHJldHVybiBUZER5bmFtaWNEYXRlcGlja2VyQ29tcG9uZW50O1xyXG5cdFx0XHRjYXNlIFRkRHluYW1pY0VsZW1lbnQuVGV4dEVkaXRvcjpcclxuXHRcdFx0XHRyZXR1cm4gVGV4dEVkaXRvckNvbXBvbmVudDtcclxuXHRcdFx0Y2FzZSBUZER5bmFtaWNFbGVtZW50LkNvbG9yUGlja2VyOlxyXG5cdFx0XHRcdHJldHVybiBDb2xvclBpY2tlckNvbXBvbmVudDtcclxuXHRcdFx0Y2FzZSBUZER5bmFtaWNFbGVtZW50LlRpbWVQaWNrZXI6XHJcblx0XHRcdFx0cmV0dXJuIFRpbWVQaWNrZXJDb21wb25lbnQ7XHJcblx0XHRcdGNhc2UgVGREeW5hbWljRWxlbWVudC5EYXRlVGltZVBpY2tlcjpcclxuXHRcdFx0XHRyZXR1cm4gRGF0ZVRpbWVQaWNrZXJDb21wb25lbnQ7XHJcblx0XHRcdGNhc2UgVGREeW5hbWljRWxlbWVudC5Pcmdhbml6YXRpb246XHJcblx0XHRcdFx0cmV0dXJuIEZvcm1Pcmdhbml6YXRpb25Db21wb25lbnQ7XHJcblx0XHRcdGNhc2UgVGREeW5hbWljRWxlbWVudC5HYWxsZXJ5U2VsZWN0b3I6XHJcblx0XHRcdFx0cmV0dXJuIEdhbGxlcnlTZWxlY3RvckNvbXBvbmVudDtcclxuXHRcdFx0Y2FzZSBUZER5bmFtaWNFbGVtZW50LlRyZWVTZWxlY3RvcjpcclxuXHRcdFx0XHRyZXR1cm4gVHJlZVNlbGVjdG9yQ29tcG9uZW50O1xyXG5cdFx0XHRjYXNlIFRkRHluYW1pY0VsZW1lbnQuRWRpdGFibGVUYWJsZTpcclxuXHRcdFx0XHRyZXR1cm4gRWRpdGFibGVUYWJsZUNvbXBvbmVudDtcclxuXHRcdFx0Y2FzZSBUZER5bmFtaWNFbGVtZW50LkNoaXBTZWxlY3RvcjpcclxuXHRcdFx0XHRyZXR1cm4gQ2hpcFNlbGVjdG9yQ29tcG9uZW50O1xyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgRXJyb3I6IHR5cGUgJHtlbGVtZW50fSBkb2VzIG5vdCBleGlzdCBvciBub3Qgc3VwcG9ydGVkLmApO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0KiBDcmVhdGVzIGZvcm0gY29udHJvbCBmb3IgZWxlbWVudCBkZXBlbmRpbmcgW0lUZER5bmFtaWNFbGVtZW50Q29uZmlnXSBwcm9wZXJ0aWVzLlxyXG5cdCovXHJcblx0Y3JlYXRlRm9ybUNvbnRyb2woY29uZmlnOiBJVGREeW5hbWljRWxlbWVudENvbmZpZyk6IEZvcm1Db250cm9sIHtcclxuXHRcdGxldCB2YWxpZGF0b3I6IFZhbGlkYXRvckZuID0gdGhpcy5jcmVhdGVWYWxpZGF0b3JzKGNvbmZpZyk7XHJcblx0XHRyZXR1cm4gbmV3IEZvcm1Db250cm9sKHt2YWx1ZTogY29uZmlnLmRlZmF1bHQsIGRpc2FibGVkOiBjb25maWcuZGlzYWJsZWR9LCB2YWxpZGF0b3IpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0KiBDcmVhdGVzIGZvcm0gdmFsaWRhdGlvbmRlcGVuZGluZyBbSVRkRHluYW1pY0VsZW1lbnRDb25maWddIHByb3BlcnRpZXMuXHJcblx0Ki9cclxuXHRjcmVhdGVWYWxpZGF0b3JzKGNvbmZpZzogSVRkRHluYW1pY0VsZW1lbnRDb25maWcpOiBWYWxpZGF0b3JGbiB7XHJcblx0XHRsZXQgdmFsaWRhdG9yOiBWYWxpZGF0b3JGbjtcclxuXHRcdGlmIChjb25maWcucmVxdWlyZWQpIHtcclxuXHRcdFx0dmFsaWRhdG9yID0gVmFsaWRhdG9ycy5yZXF1aXJlZDtcclxuXHRcdH1cclxuXHRcdGlmIChjb25maWcubWF4IHx8IGNvbmZpZy5tYXggPT09IDApIHtcclxuXHRcdFx0dmFsaWRhdG9yID0gVmFsaWRhdG9ycy5jb21wb3NlKFt2YWxpZGF0b3IsIFZhbGlkYXRvcnMubWF4KHBhcnNlRmxvYXQoY29uZmlnLm1heCkpXSk7XHJcblx0XHR9XHJcblx0XHRpZiAoY29uZmlnLm1pbiB8fCBjb25maWcubWluID09PSAwKSB7XHJcblx0XHRcdHZhbGlkYXRvciA9IFZhbGlkYXRvcnMuY29tcG9zZShbdmFsaWRhdG9yLCBWYWxpZGF0b3JzLm1pbihwYXJzZUZsb2F0KGNvbmZpZy5taW4pKV0pO1xyXG5cdFx0fVxyXG5cdFx0aWYgKGNvbmZpZy5tYXhMZW5ndGggfHwgY29uZmlnLm1heExlbmd0aCA9PT0gMCkge1xyXG5cdFx0XHR2YWxpZGF0b3IgPSBWYWxpZGF0b3JzLmNvbXBvc2UoW3ZhbGlkYXRvciwgVmFsaWRhdG9ycy5tYXhMZW5ndGgocGFyc2VGbG9hdChjb25maWcubWF4TGVuZ3RoKSldKTtcclxuXHRcdH1cclxuXHRcdGlmIChjb25maWcubWluTGVuZ3RoIHx8IGNvbmZpZy5taW5MZW5ndGggPT09IDApIHtcclxuXHRcdFx0dmFsaWRhdG9yID0gVmFsaWRhdG9ycy5jb21wb3NlKFt2YWxpZGF0b3IsIFZhbGlkYXRvcnMubWluTGVuZ3RoKHBhcnNlRmxvYXQoY29uZmlnLm1pbkxlbmd0aCkpXSk7XHJcblx0XHR9XHJcblx0XHQvLyBBZGQgcHJvdmlkZWQgY3VzdG9tIHZhbGlkYXRvcnMgdG8gdGhlIHZhbGlkYXRvciBmdW5jdGlvblxyXG5cdFx0aWYgKGNvbmZpZy52YWxpZGF0b3JzKSB7XHJcblx0XHRcdGNvbmZpZy52YWxpZGF0b3JzLmZvckVhY2goKHZhbGlkYXRvckNvbmZpZzogSVRkRHluYW1pY0VsZW1lbnRWYWxpZGF0b3IpID0+IHtcclxuXHRcdFx0XHR2YWxpZGF0b3IgPSBWYWxpZGF0b3JzLmNvbXBvc2UoW3ZhbGlkYXRvciwgdmFsaWRhdG9yQ29uZmlnLnZhbGlkYXRvcl0pO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHRcdHJldHVybiB2YWxpZGF0b3I7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gRFlOQU1JQ19GT1JNU19QUk9WSURFUl9GQUNUT1JZKFxyXG5cdHBhcmVudDogVGREeW5hbWljRm9ybXNTZXJ2aWNlKTogVGREeW5hbWljRm9ybXNTZXJ2aWNlIHtcclxuXHRcdHJldHVybiBwYXJlbnQgfHwgbmV3IFRkRHluYW1pY0Zvcm1zU2VydmljZSgpO1xyXG5cdH1cclxuXHJcblx0ZXhwb3J0IGNvbnN0IERZTkFNSUNfRk9STVNfUFJPVklERVI6IFByb3ZpZGVyID0ge1xyXG5cdFx0Ly8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhIHNlcnZpY2UgYXZhaWxhYmxlLCB1c2UgdGhhdC4gT3RoZXJ3aXNlLCBwcm92aWRlIGEgbmV3IG9uZS5cclxuXHRcdHByb3ZpZGU6IFRkRHluYW1pY0Zvcm1zU2VydmljZSxcclxuXHRcdGRlcHM6IFtbbmV3IE9wdGlvbmFsKCksIG5ldyBTa2lwU2VsZigpLCBUZER5bmFtaWNGb3Jtc1NlcnZpY2VdXSxcclxuXHRcdHVzZUZhY3Rvcnk6IERZTkFNSUNfRk9STVNfUFJPVklERVJfRkFDVE9SWSxcclxuXHR9O1xyXG4iXX0=