devextreme-angular
Version:
Angular UI and visualization components based on DevExtreme widgets
273 lines • 37 kB
JavaScript
/*!
* devextreme-angular
* Version: 25.1.4
* Build date: Tue Aug 05 2025
*
* Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file in the root of the project for details.
*
* https://github.com/DevExpress/devextreme-angular
*/
/* tslint:disable:max-line-length */
import { Component, NgModule, Host, ElementRef, Renderer2, Inject, SkipSelf, Input, ContentChildren, forwardRef, QueryList } from '@angular/core';
import { DOCUMENT } from '@angular/common';
import { DxIntegrationModule, NestedOptionHost, extractTemplate, DxTemplateHost } from 'devextreme-angular/core';
import { NestedOption } from 'devextreme-angular/core';
import { DxiDataGridAsyncRuleComponent } from './async-rule-dxi';
import { DxiDataGridCompareRuleComponent } from './compare-rule-dxi';
import { DxiDataGridCustomRuleComponent } from './custom-rule-dxi';
import { DxiDataGridEmailRuleComponent } from './email-rule-dxi';
import { DxiDataGridNumericRuleComponent } from './numeric-rule-dxi';
import { DxiDataGridPatternRuleComponent } from './pattern-rule-dxi';
import { DxiDataGridRangeRuleComponent } from './range-rule-dxi';
import { DxiDataGridRequiredRuleComponent } from './required-rule-dxi';
import { DxiDataGridStringLengthRuleComponent } from './string-length-rule-dxi';
import { DxiDataGridValidationRuleComponent } from './validation-rule-dxi';
import * as i0 from "@angular/core";
import * as i1 from "devextreme-angular/core";
export class DxoDataGridFormItemComponent extends NestedOption {
renderer;
document;
element;
get colSpan() {
return this._getOption('colSpan');
}
set colSpan(value) {
this._setOption('colSpan', value);
}
get cssClass() {
return this._getOption('cssClass');
}
set cssClass(value) {
this._setOption('cssClass', value);
}
get dataField() {
return this._getOption('dataField');
}
set dataField(value) {
this._setOption('dataField', value);
}
get editorOptions() {
return this._getOption('editorOptions');
}
set editorOptions(value) {
this._setOption('editorOptions', value);
}
get editorType() {
return this._getOption('editorType');
}
set editorType(value) {
this._setOption('editorType', value);
}
get helpText() {
return this._getOption('helpText');
}
set helpText(value) {
this._setOption('helpText', value);
}
get isRequired() {
return this._getOption('isRequired');
}
set isRequired(value) {
this._setOption('isRequired', value);
}
get itemType() {
return this._getOption('itemType');
}
set itemType(value) {
this._setOption('itemType', value);
}
get label() {
return this._getOption('label');
}
set label(value) {
this._setOption('label', value);
}
get name() {
return this._getOption('name');
}
set name(value) {
this._setOption('name', value);
}
get template() {
return this._getOption('template');
}
set template(value) {
this._setOption('template', value);
}
get validationRules() {
return this._getOption('validationRules');
}
set validationRules(value) {
this._setOption('validationRules', value);
}
get visible() {
return this._getOption('visible');
}
set visible(value) {
this._setOption('visible', value);
}
get visibleIndex() {
return this._getOption('visibleIndex');
}
set visibleIndex(value) {
this._setOption('visibleIndex', value);
}
get _optionPath() {
return 'formItem';
}
asyncRulesChildren;
compareRulesChildren;
customRulesChildren;
emailRulesChildren;
numericRulesChildren;
patternRulesChildren;
rangeRulesChildren;
requiredRulesChildren;
stringLengthRulesChildren;
validationRulesChildren;
setValidationRules() {
const q = new QueryList();
q.reset([
...this.asyncRulesChildren.toArray(),
...this.compareRulesChildren.toArray(),
...this.customRulesChildren.toArray(),
...this.emailRulesChildren.toArray(),
...this.numericRulesChildren.toArray(),
...this.patternRulesChildren.toArray(),
...this.rangeRulesChildren.toArray(),
...this.requiredRulesChildren.toArray(),
...this.stringLengthRulesChildren.toArray(),
...this.validationRulesChildren.toArray(),
]);
this.setChildren('validationRules', q);
}
constructor(parentOptionHost, optionHost, renderer, document, templateHost, element) {
super();
this.renderer = renderer;
this.document = document;
this.element = element;
parentOptionHost.setNestedOption(this);
optionHost.setHost(this, this._fullOptionPath.bind(this));
templateHost.setHost(this);
}
setTemplate(template) {
this.template = template;
}
ngAfterViewInit() {
extractTemplate(this, this.element, this.renderer, this.document);
}
ngOnInit() {
this._addRecreatedComponent();
}
ngOnDestroy() {
this._addRemovedOption(this._getOptionPath());
}
ngAfterContentInit() {
this.setValidationRules();
this.asyncRulesChildren.changes.subscribe(() => { this.setValidationRules(); });
this.compareRulesChildren.changes.subscribe(() => { this.setValidationRules(); });
this.customRulesChildren.changes.subscribe(() => { this.setValidationRules(); });
this.emailRulesChildren.changes.subscribe(() => { this.setValidationRules(); });
this.numericRulesChildren.changes.subscribe(() => { this.setValidationRules(); });
this.patternRulesChildren.changes.subscribe(() => { this.setValidationRules(); });
this.rangeRulesChildren.changes.subscribe(() => { this.setValidationRules(); });
this.requiredRulesChildren.changes.subscribe(() => { this.setValidationRules(); });
this.stringLengthRulesChildren.changes.subscribe(() => { this.setValidationRules(); });
this.validationRulesChildren.changes.subscribe(() => { this.setValidationRules(); });
}
/** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DxoDataGridFormItemComponent, deps: [{ token: i1.NestedOptionHost, host: true, skipSelf: true }, { token: i1.NestedOptionHost, host: true }, { token: i0.Renderer2 }, { token: DOCUMENT }, { token: i1.DxTemplateHost, host: true }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DxoDataGridFormItemComponent, isStandalone: true, selector: "dxo-data-grid-form-item", inputs: { colSpan: "colSpan", cssClass: "cssClass", dataField: "dataField", editorOptions: "editorOptions", editorType: "editorType", helpText: "helpText", isRequired: "isRequired", itemType: "itemType", label: "label", name: "name", template: "template", validationRules: "validationRules", visible: "visible", visibleIndex: "visibleIndex" }, providers: [NestedOptionHost, DxTemplateHost], queries: [{ propertyName: "asyncRulesChildren", predicate: i0.forwardRef(() => DxiDataGridAsyncRuleComponent) }, { propertyName: "compareRulesChildren", predicate: i0.forwardRef(() => DxiDataGridCompareRuleComponent) }, { propertyName: "customRulesChildren", predicate: i0.forwardRef(() => DxiDataGridCustomRuleComponent) }, { propertyName: "emailRulesChildren", predicate: i0.forwardRef(() => DxiDataGridEmailRuleComponent) }, { propertyName: "numericRulesChildren", predicate: i0.forwardRef(() => DxiDataGridNumericRuleComponent) }, { propertyName: "patternRulesChildren", predicate: i0.forwardRef(() => DxiDataGridPatternRuleComponent) }, { propertyName: "rangeRulesChildren", predicate: i0.forwardRef(() => DxiDataGridRangeRuleComponent) }, { propertyName: "requiredRulesChildren", predicate: i0.forwardRef(() => DxiDataGridRequiredRuleComponent) }, { propertyName: "stringLengthRulesChildren", predicate: i0.forwardRef(() => DxiDataGridStringLengthRuleComponent) }, { propertyName: "validationRulesChildren", predicate: i0.forwardRef(() => DxiDataGridValidationRuleComponent) }], usesInheritance: true, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: DxIntegrationModule }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DxoDataGridFormItemComponent, decorators: [{
type: Component,
args: [{ selector: 'dxo-data-grid-form-item', standalone: true, template: '<ng-content></ng-content>', imports: [DxIntegrationModule], providers: [NestedOptionHost, DxTemplateHost], styles: [":host{display:block}\n"] }]
}], ctorParameters: () => [{ type: i1.NestedOptionHost, decorators: [{
type: SkipSelf
}, {
type: Host
}] }, { type: i1.NestedOptionHost, decorators: [{
type: Host
}] }, { type: i0.Renderer2 }, { type: undefined, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }, { type: i1.DxTemplateHost, decorators: [{
type: Host
}] }, { type: i0.ElementRef }], propDecorators: { colSpan: [{
type: Input
}], cssClass: [{
type: Input
}], dataField: [{
type: Input
}], editorOptions: [{
type: Input
}], editorType: [{
type: Input
}], helpText: [{
type: Input
}], isRequired: [{
type: Input
}], itemType: [{
type: Input
}], label: [{
type: Input
}], name: [{
type: Input
}], template: [{
type: Input
}], validationRules: [{
type: Input
}], visible: [{
type: Input
}], visibleIndex: [{
type: Input
}], asyncRulesChildren: [{
type: ContentChildren,
args: [forwardRef(() => DxiDataGridAsyncRuleComponent)]
}], compareRulesChildren: [{
type: ContentChildren,
args: [forwardRef(() => DxiDataGridCompareRuleComponent)]
}], customRulesChildren: [{
type: ContentChildren,
args: [forwardRef(() => DxiDataGridCustomRuleComponent)]
}], emailRulesChildren: [{
type: ContentChildren,
args: [forwardRef(() => DxiDataGridEmailRuleComponent)]
}], numericRulesChildren: [{
type: ContentChildren,
args: [forwardRef(() => DxiDataGridNumericRuleComponent)]
}], patternRulesChildren: [{
type: ContentChildren,
args: [forwardRef(() => DxiDataGridPatternRuleComponent)]
}], rangeRulesChildren: [{
type: ContentChildren,
args: [forwardRef(() => DxiDataGridRangeRuleComponent)]
}], requiredRulesChildren: [{
type: ContentChildren,
args: [forwardRef(() => DxiDataGridRequiredRuleComponent)]
}], stringLengthRulesChildren: [{
type: ContentChildren,
args: [forwardRef(() => DxiDataGridStringLengthRuleComponent)]
}], validationRulesChildren: [{
type: ContentChildren,
args: [forwardRef(() => DxiDataGridValidationRuleComponent)]
}] } });
export class DxoDataGridFormItemModule {
/** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DxoDataGridFormItemModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
/** @nocollapse */ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: DxoDataGridFormItemModule, imports: [DxoDataGridFormItemComponent], exports: [DxoDataGridFormItemComponent] });
/** @nocollapse */ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DxoDataGridFormItemModule, imports: [DxoDataGridFormItemComponent] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DxoDataGridFormItemModule, decorators: [{
type: NgModule,
args: [{
imports: [
DxoDataGridFormItemComponent
],
exports: [
DxoDataGridFormItemComponent
],
}]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1pdGVtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vZGlzdC91aS9kYXRhLWdyaWQvbmVzdGVkL2Zvcm0taXRlbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7R0FXRztBQUVILG9DQUFvQztBQUdwQyxPQUFPLEVBQ0gsU0FBUyxFQUdULFFBQVEsRUFDUixJQUFJLEVBQ0osVUFBVSxFQUNWLFNBQVMsRUFDVCxNQUFNLEVBRU4sUUFBUSxFQUNSLEtBQUssRUFDTCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFNBQVMsRUFFWixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFPM0MsT0FBTyxFQUNILG1CQUFtQixFQUNuQixnQkFBZ0IsRUFDaEIsZUFBZSxFQUdmLGNBQWMsRUFDakIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakUsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckUsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkUsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakUsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckUsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckUsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakUsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkUsT0FBTyxFQUFFLG9DQUFvQyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEYsT0FBTyxF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RUFBRSxDQUFDLG9DQUFvQyxDQUFDO2dCQUVBLHVCQUF1QjtzQkFBN0YsZUFBZTt1QkFBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsa0NBQWtDLENBQUM7O0FBa0Z6RSxNQUFNLE9BQU8seUJBQXlCOzJIQUF6Qix5QkFBeUI7NEhBQXpCLHlCQUF5QixZQTVOekIsNEJBQTRCLGFBQTVCLDRCQUE0Qjs0SEE0TjVCLHlCQUF5QixZQU5sQyw0QkFBNEI7OzRGQU1uQix5QkFBeUI7a0JBUnJDLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFO3dCQUNQLDRCQUE0QjtxQkFDN0I7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLDRCQUE0QjtxQkFDN0I7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIGRldmV4dHJlbWUtYW5ndWxhclxuICogVmVyc2lvbjogMjUuMS40XG4gKiBCdWlsZCBkYXRlOiBUdWUgQXVnIDA1IDIwMjVcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTIgLSAyMDI1IERldmVsb3BlciBFeHByZXNzIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRFxuICpcbiAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXNcbiAqIG9mIHRoZSBNSVQgbGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHByb2plY3QgZm9yIGRldGFpbHMuXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL0RldkV4cHJlc3MvZGV2ZXh0cmVtZS1hbmd1bGFyXG4gKi9cblxuLyogdHNsaW50OmRpc2FibGU6bWF4LWxpbmUtbGVuZ3RoICovXHJcblxyXG5cclxuaW1wb3J0IHtcclxuICAgIENvbXBvbmVudCxcclxuICAgIE9uSW5pdCxcclxuICAgIE9uRGVzdHJveSxcclxuICAgIE5nTW9kdWxlLFxyXG4gICAgSG9zdCxcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBSZW5kZXJlcjIsXHJcbiAgICBJbmplY3QsXHJcbiAgICBBZnRlclZpZXdJbml0LFxyXG4gICAgU2tpcFNlbGYsXHJcbiAgICBJbnB1dCxcclxuICAgIENvbnRlbnRDaGlsZHJlbixcclxuICAgIGZvcndhcmRSZWYsXHJcbiAgICBRdWVyeUxpc3QsXHJcbiAgICBBZnRlckNvbnRlbnRJbml0XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcblxyXG5cclxuaW1wb3J0ICogYXMgQ29tbW9uVHlwZXMgZnJvbSAnZGV2ZXh0cmVtZS9jb21tb24nO1xyXG5pbXBvcnQgeyBGb3JtSXRlbUNvbXBvbmVudCwgRm9ybUl0ZW1UeXBlLCBMYWJlbExvY2F0aW9uIH0gZnJvbSAnZGV2ZXh0cmVtZS91aS9mb3JtJztcclxuaW1wb3J0IHsgSG9yaXpvbnRhbEFsaWdubWVudCB9IGZyb20gJ2RldmV4dHJlbWUvY29tbW9uJztcclxuXHJcbmltcG9ydCB7XHJcbiAgICBEeEludGVncmF0aW9uTW9kdWxlLFxyXG4gICAgTmVzdGVkT3B0aW9uSG9zdCxcclxuICAgIGV4dHJhY3RUZW1wbGF0ZSxcclxuICAgIER4VGVtcGxhdGVEaXJlY3RpdmUsXHJcbiAgICBJRHhUZW1wbGF0ZUhvc3QsXHJcbiAgICBEeFRlbXBsYXRlSG9zdFxyXG59IGZyb20gJ2RldmV4dHJlbWUtYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTmVzdGVkT3B0aW9uIH0gZnJvbSAnZGV2ZXh0cmVtZS1hbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEeGlEYXRhR3JpZEFzeW5jUnVsZUNvbXBvbmVudCB9IGZyb20gJy4vYXN5bmMtcnVsZS1keGknO1xyXG5pbXBvcnQgeyBEeGlEYXRhR3JpZENvbXBhcmVSdWxlQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wYXJlLXJ1bGUtZHhpJztcclxuaW1wb3J0IHsgRHhpRGF0YUdyaWRDdXN0b21SdWxlQ29tcG9uZW50IH0gZnJvbSAnLi9jdXN0b20tcnVsZS1keGknO1xyXG5pbXBvcnQgeyBEeGlEYXRhR3JpZEVtYWlsUnVsZUNvbXBvbmVudCB9IGZyb20gJy4vZW1haWwtcnVsZS1keGknO1xyXG5pbXBvcnQgeyBEeGlEYXRhR3JpZE51bWVyaWNSdWxlQ29tcG9uZW50IH0gZnJvbSAnLi9udW1lcmljLXJ1bGUtZHhpJztcclxuaW1wb3J0IHsgRHhpRGF0YUdyaWRQYXR0ZXJuUnVsZUNvbXBvbmVudCB9IGZyb20gJy4vcGF0dGVybi1ydWxlLWR4aSc7XHJcbmltcG9ydCB7IER4aURhdGFHcmlkUmFuZ2VSdWxlQ29tcG9uZW50IH0gZnJvbSAnLi9yYW5nZS1ydWxlLWR4aSc7XHJcbmltcG9ydCB7IER4aURhdGFHcmlkUmVxdWlyZWRSdWxlQ29tcG9uZW50IH0gZnJvbSAnLi9yZXF1aXJlZC1ydWxlLWR4aSc7XHJcbmltcG9ydCB7IER4aURhdGFHcmlkU3RyaW5nTGVuZ3RoUnVsZUNvbXBvbmVudCB9IGZyb20gJy4vc3RyaW5nLWxlbmd0aC1ydWxlLWR4aSc7XHJcbmltcG9ydCB7IER4aURhdGFHcmlkVmFsaWRhdGlvblJ1bGVDb21wb25lbnQgfSBmcm9tICcuL3ZhbGlkYXRpb24tcnVsZS1keGknO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdkeG8tZGF0YS1ncmlkLWZvcm0taXRlbScsXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gICAgdGVtcGxhdGU6ICc8bmctY29udGVudD48L25nLWNvbnRlbnQ+JyxcclxuICAgIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXHJcbiAgICBpbXBvcnRzOiBbIER4SW50ZWdyYXRpb25Nb2R1bGUgXSxcclxuICAgIHByb3ZpZGVyczogW05lc3RlZE9wdGlvbkhvc3QsIER4VGVtcGxhdGVIb3N0XVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRHhvRGF0YUdyaWRGb3JtSXRlbUNvbXBvbmVudCBleHRlbmRzIE5lc3RlZE9wdGlvbiBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25Jbml0LFxyXG4gICAgSUR4VGVtcGxhdGVIb3N0LCBBZnRlckNvbnRlbnRJbml0ICB7XHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IGNvbFNwYW4oKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0T3B0aW9uKCdjb2xTcGFuJyk7XHJcbiAgICB9XHJcbiAgICBzZXQgY29sU3Bhbih2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5fc2V0T3B0aW9uKCdjb2xTcGFuJywgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgY3NzQ2xhc3MoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0T3B0aW9uKCdjc3NDbGFzcycpO1xyXG4gICAgfVxyXG4gICAgc2V0IGNzc0NsYXNzKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aGlzLl9zZXRPcHRpb24oJ2Nzc0NsYXNzJywgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgZGF0YUZpZWxkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE9wdGlvbignZGF0YUZpZWxkJyk7XHJcbiAgICB9XHJcbiAgICBzZXQgZGF0YUZpZWxkKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aGlzLl9zZXRPcHRpb24oJ2RhdGFGaWVsZCcsIHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IGVkaXRvck9wdGlvbnMoKTogYW55IHwgdW5kZWZpbmVkIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0T3B0aW9uKCdlZGl0b3JPcHRpb25zJyk7XHJcbiAgICB9XHJcbiAgICBzZXQgZWRpdG9yT3B0aW9ucyh2YWx1ZTogYW55IHwgdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5fc2V0T3B0aW9uKCdlZGl0b3JPcHRpb25zJywgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgZWRpdG9yVHlwZSgpOiBGb3JtSXRlbUNvbXBvbmVudCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE9wdGlvbignZWRpdG9yVHlwZScpO1xyXG4gICAgfVxyXG4gICAgc2V0IGVkaXRvclR5cGUodmFsdWU6IEZvcm1JdGVtQ29tcG9uZW50KSB7XHJcbiAgICAgICAgdGhpcy5fc2V0T3B0aW9uKCdlZGl0b3JUeXBlJywgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgaGVscFRleHQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0T3B0aW9uKCdoZWxwVGV4dCcpO1xyXG4gICAgfVxyXG4gICAgc2V0IGhlbHBUZXh0KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aGlzLl9zZXRPcHRpb24oJ2hlbHBUZXh0JywgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgaXNSZXF1aXJlZCgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0T3B0aW9uKCdpc1JlcXVpcmVkJyk7XHJcbiAgICB9XHJcbiAgICBzZXQgaXNSZXF1aXJlZCh2YWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMuX3NldE9wdGlvbignaXNSZXF1aXJlZCcsIHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IGl0ZW1UeXBlKCk6IEZvcm1JdGVtVHlwZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE9wdGlvbignaXRlbVR5cGUnKTtcclxuICAgIH1cclxuICAgIHNldCBpdGVtVHlwZSh2YWx1ZTogRm9ybUl0ZW1UeXBlKSB7XHJcbiAgICAgICAgdGhpcy5fc2V0T3B0aW9uKCdpdGVtVHlwZScsIHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IGxhYmVsKCk6IHsgYWxpZ25tZW50PzogSG9yaXpvbnRhbEFsaWdubWVudCwgbG9jYXRpb24/OiBMYWJlbExvY2F0aW9uLCBzaG93Q29sb24/OiBib29sZWFuLCB0ZW1wbGF0ZT86IGFueSwgdGV4dD86IHN0cmluZyB8IHVuZGVmaW5lZCwgdmlzaWJsZT86IGJvb2xlYW4gfSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE9wdGlvbignbGFiZWwnKTtcclxuICAgIH1cclxuICAgIHNldCBsYWJlbCh2YWx1ZTogeyBhbGlnbm1lbnQ/OiBIb3Jpem9udGFsQWxpZ25tZW50LCBsb2NhdGlvbj86IExhYmVsTG9jYXRpb24sIHNob3dDb2xvbj86IGJvb2xlYW4sIHRlbXBsYXRlPzogYW55LCB0ZXh0Pzogc3RyaW5nIHwgdW5kZWZpbmVkLCB2aXNpYmxlPzogYm9vbGVhbiB9KSB7XHJcbiAgICAgICAgdGhpcy5fc2V0T3B0aW9uKCdsYWJlbCcsIHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IG5hbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0T3B0aW9uKCduYW1lJyk7XHJcbiAgICB9XHJcbiAgICBzZXQgbmFtZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5fc2V0T3B0aW9uKCduYW1lJywgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgdGVtcGxhdGUoKTogYW55IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0T3B0aW9uKCd0ZW1wbGF0ZScpO1xyXG4gICAgfVxyXG4gICAgc2V0IHRlbXBsYXRlKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLl9zZXRPcHRpb24oJ3RlbXBsYXRlJywgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgdmFsaWRhdGlvblJ1bGVzKCk6IEFycmF5PENvbW1vblR5cGVzLlZhbGlkYXRpb25SdWxlPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE9wdGlvbigndmFsaWRhdGlvblJ1bGVzJyk7XHJcbiAgICB9XHJcbiAgICBzZXQgdmFsaWRhdGlvblJ1bGVzKHZhbHVlOiBBcnJheTxDb21tb25UeXBlcy5WYWxpZGF0aW9uUnVsZT4pIHtcclxuICAgICAgICB0aGlzLl9zZXRPcHRpb24oJ3ZhbGlkYXRpb25SdWxlcycsIHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE9wdGlvbigndmlzaWJsZScpO1xyXG4gICAgfVxyXG4gICAgc2V0IHZpc2libGUodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLl9zZXRPcHRpb24oJ3Zpc2libGUnLCB2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIGdldCB2aXNpYmxlSW5kZXgoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0T3B0aW9uKCd2aXNpYmxlSW5kZXgnKTtcclxuICAgIH1cclxuICAgIHNldCB2aXNpYmxlSW5kZXgodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMuX3NldE9wdGlvbigndmlzaWJsZUluZGV4JywgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0IF9vcHRpb25QYXRoKCkge1xyXG4gICAgICAgIHJldHVybiAnZm9ybUl0ZW0nO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBAQ29udGVudENoaWxkcmVuKGZvcndhcmRSZWYoKCkgPT4gRHhpRGF0YUdyaWRBc3luY1J1bGVDb21wb25lbnQpKSBhc3luY1J1bGVzQ2hpbGRyZW4hOiBRdWVyeUxpc3Q8RHhpRGF0YUdyaWRBc3luY1J1bGVDb21wb25lbnQ+XHJcbiAgICBcclxuICAgIEBDb250ZW50Q2hpbGRyZW4oZm9yd2FyZFJlZigoKSA9PiBEeGlEYXRhR3JpZENvbXBhcmVSdWxlQ29tcG9uZW50KSkgY29tcGFyZVJ1bGVzQ2hpbGRyZW4hOiBRdWVyeUxpc3Q8RHhpRGF0YUdyaWRDb21wYXJlUnVsZUNvbXBvbmVudD5cclxuICAgIFxyXG4gICAgQENvbnRlbnRDaGlsZHJlbihmb3J3YXJkUmVmKCgpID0+IER4aURhdGFHcmlkQ3VzdG9tUnVsZUNvbXBvbmVudCkpIGN1c3RvbVJ1bGVzQ2hpbGRyZW4hOiBRdWVyeUxpc3Q8RHhpRGF0YUdyaWRDdXN0b21SdWxlQ29tcG9uZW50PlxyXG4gICAgXHJcbiAgICBAQ29udGVudENoaWxkcmVuKGZvcndhcmRSZWYoKCkgPT4gRHhpRGF0YUdyaWRFbWFpbFJ1bGVDb21wb25lbnQpKSBlbWFpbFJ1bGVzQ2hpbGRyZW4hOiBRdWVyeUxpc3Q8RHhpRGF0YUdyaWRFbWFpbFJ1bGVDb21wb25lbnQ+XHJcbiAgICBcclxuICAgIEBDb250ZW50Q2hpbGRyZW4oZm9yd2FyZFJlZigoKSA9PiBEeGlEYXRhR3JpZE51bWVyaWNSdWxlQ29tcG9uZW50KSkgbnVtZXJpY1J1bGVzQ2hpbGRyZW4hOiBRdWVyeUxpc3Q8RHhpRGF0YUdyaWROdW1lcmljUnVsZUNvbXBvbmVudD5cclxuICAgIFxyXG4gICAgQENvbnRlbnRDaGlsZHJlbihmb3J3YXJkUmVmKCgpID0+IER4aURhdGFHcmlkUGF0dGVyblJ1bGVDb21wb25lbnQpKSBwYXR0ZXJuUnVsZXNDaGlsZHJlbiE6IFF1ZXJ5TGlzdDxEeGlEYXRhR3JpZFBhdHRlcm5SdWxlQ29tcG9uZW50PlxyXG4gICAgXHJcbiAgICBAQ29udGVudENoaWxkcmVuKGZvcndhcmRSZWYoKCkgPT4gRHhpRGF0YUdyaWRSYW5nZVJ1bGVDb21wb25lbnQpKSByYW5nZVJ1bGVzQ2hpbGRyZW4hOiBRdWVyeUxpc3Q8RHhpRGF0YUdyaWRSYW5nZVJ1bGVDb21wb25lbnQ+XHJcbiAgICBcclxuICAgIEBDb250ZW50Q2hpbGRyZW4oZm9yd2FyZFJlZigoKSA9PiBEeGlEYXRhR3JpZFJlcXVpcmVkUnVsZUNvbXBvbmVudCkpIHJlcXVpcmVkUnVsZXNDaGlsZHJlbiE6IFF1ZXJ5TGlzdDxEeGlEYXRhR3JpZFJlcXVpcmVkUnVsZUNvbXBvbmVudD5cclxuICAgIFxyXG4gICAgQENvbnRlbnRDaGlsZHJlbihmb3J3YXJkUmVmKCgpID0+IER4aURhdGFHcmlkU3RyaW5nTGVuZ3RoUnVsZUNvbXBvbmVudCkpIHN0cmluZ0xlbmd0aFJ1bGVzQ2hpbGRyZW4hOiBRdWVyeUxpc3Q8RHhpRGF0YUdyaWRTdHJpbmdMZW5ndGhSdWxlQ29tcG9uZW50PlxyXG4gICAgXHJcbiAgICBAQ29udGVudENoaWxkcmVuKGZvcndhcmRSZWYoKCkgPT4gRHhpRGF0YUdyaWRWYWxpZGF0aW9uUnVsZUNvbXBvbmVudCkpIHZhbGlkYXRpb25SdWxlc0NoaWxkcmVuITogUXVlcnlMaXN0PER4aURhdGFHcmlkVmFsaWRhdGlvblJ1bGVDb21wb25lbnQ+XHJcbiAgICBcclxuICAgIHNldFZhbGlkYXRpb25SdWxlcygpIHtcclxuICAgICAgICBjb25zdCBxOiBRdWVyeUxpc3Q8YW55PiA9IG5ldyBRdWVyeUxpc3QoKTtcclxuICAgICAgICBxLnJlc2V0KFtcclxuICAgICAgICAgICAgLi4udGhpcy5hc3luY1J1bGVzQ2hpbGRyZW4udG9BcnJheSgpLFxyXG4gICAgICAgICAgICAuLi50aGlzLmNvbXBhcmVSdWxlc0NoaWxkcmVuLnRvQXJyYXkoKSxcclxuICAgICAgICAgICAgLi4udGhpcy5jdXN0b21SdWxlc0NoaWxkcmVuLnRvQXJyYXkoKSxcclxuICAgICAgICAgICAgLi4udGhpcy5lbWFpbFJ1bGVzQ2hpbGRyZW4udG9BcnJheSgpLFxyXG4gICAgICAgICAgICAuLi50aGlzLm51bWVyaWNSdWxlc0NoaWxkcmVuLnRvQXJyYXkoKSxcclxuICAgICAgICAgICAgLi4udGhpcy5wYXR0ZXJuUnVsZXNDaGlsZHJlbi50b0FycmF5KCksXHJcbiAgICAgICAgICAgIC4uLnRoaXMucmFuZ2VSdWxlc0NoaWxkcmVuLnRvQXJyYXkoKSxcclxuICAgICAgICAgICAgLi4udGhpcy5yZXF1aXJlZFJ1bGVzQ2hpbGRyZW4udG9BcnJheSgpLFxyXG4gICAgICAgICAgICAuLi50aGlzLnN0cmluZ0xlbmd0aFJ1bGVzQ2hpbGRyZW4udG9BcnJheSgpLFxyXG4gICAgICAgICAgICAuLi50aGlzLnZhbGlkYXRpb25SdWxlc0NoaWxkcmVuLnRvQXJyYXkoKSxcclxuICAgICAgICBdKTtcclxuICAgICAgICB0aGlzLnNldENoaWxkcmVuKCd2YWxpZGF0aW9uUnVsZXMnLCBxKTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4gICAgY29uc3RydWN0b3IoQFNraXBTZWxmKCkgQEhvc3QoKSBwYXJlbnRPcHRpb25Ib3N0OiBOZXN0ZWRPcHRpb25Ib3N0LFxyXG4gICAgICAgICAgICBASG9zdCgpIG9wdGlvbkhvc3Q6IE5lc3RlZE9wdGlvbkhvc3QsXHJcbiAgICAgICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgICAgICAgICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogYW55LFxyXG4gICAgICAgICAgICBASG9zdCgpIHRlbXBsYXRlSG9zdDogRHhUZW1wbGF0ZUhvc3QsXHJcbiAgICAgICAgICAgIHByaXZhdGUgZWxlbWVudDogRWxlbWVudFJlZikge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgcGFyZW50T3B0aW9uSG9zdC5zZXROZXN0ZWRPcHRpb24odGhpcyk7XHJcbiAgICAgICAgb3B0aW9uSG9zdC5zZXRIb3N0KHRoaXMsIHRoaXMuX2Z1bGxPcHRpb25QYXRoLmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRlbXBsYXRlSG9zdC5zZXRIb3N0KHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFRlbXBsYXRlKHRlbXBsYXRlOiBEeFRlbXBsYXRlRGlyZWN0aXZlKSB7XHJcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IHRlbXBsYXRlO1xyXG4gICAgfVxyXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIGV4dHJhY3RUZW1wbGF0ZSh0aGlzLCB0aGlzLmVsZW1lbnQsIHRoaXMucmVuZGVyZXIsIHRoaXMuZG9jdW1lbnQpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLl9hZGRSZWNyZWF0ZWRDb21wb25lbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICB0aGlzLl9hZGRSZW1vdmVkT3B0aW9uKHRoaXMuX2dldE9wdGlvblBhdGgoKSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcclxuICAgICAgICB0aGlzLnNldFZhbGlkYXRpb25SdWxlcygpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuYXN5bmNSdWxlc0NoaWxkcmVuLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHsgdGhpcy5zZXRWYWxpZGF0aW9uUnVsZXMoKSB9KTtcclxuICAgICAgICB0aGlzLmNvbXBhcmVSdWxlc0NoaWxkcmVuLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHsgdGhpcy5zZXRWYWxpZGF0aW9uUnVsZXMoKSB9KTtcclxuICAgICAgICB0aGlzLmN1c3RvbVJ1bGVzQ2hpbGRyZW4uY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4geyB0aGlzLnNldFZhbGlkYXRpb25SdWxlcygpIH0pO1xyXG4gICAgICAgIHRoaXMuZW1haWxSdWxlc0NoaWxkcmVuLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHsgdGhpcy5zZXRWYWxpZGF0aW9uUnVsZXMoKSB9KTtcclxuICAgICAgICB0aGlzLm51bWVyaWNSdWxlc0NoaWxkcmVuLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHsgdGhpcy5zZXRWYWxpZGF0aW9uUnVsZXMoKSB9KTtcclxuICAgICAgICB0aGlzLnBhdHRlcm5SdWxlc0NoaWxkcmVuLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHsgdGhpcy5zZXRWYWxpZGF0aW9uUnVsZXMoKSB9KTtcclxuICAgICAgICB0aGlzLnJhbmdlUnVsZXNDaGlsZHJlbi5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7IHRoaXMuc2V0VmFsaWRhdGlvblJ1bGVzKCkgfSk7XHJcbiAgICAgICAgdGhpcy5yZXF1aXJlZFJ1bGVzQ2hpbGRyZW4uY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4geyB0aGlzLnNldFZhbGlkYXRpb25SdWxlcygpIH0pO1xyXG4gICAgICAgIHRoaXMuc3RyaW5nTGVuZ3RoUnVsZXNDaGlsZHJlbi5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7IHRoaXMuc2V0VmFsaWRhdGlvblJ1bGVzKCkgfSk7XHJcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uUnVsZXNDaGlsZHJlbi5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7IHRoaXMuc2V0VmFsaWRhdGlvblJ1bGVzKCkgfSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgaW1wb3J0czogW1xyXG4gICAgRHhvRGF0YUdyaWRGb3JtSXRlbUNvbXBvbmVudFxyXG4gIF0sXHJcbiAgZXhwb3J0czogW1xyXG4gICAgRHhvRGF0YUdyaWRGb3JtSXRlbUNvbXBvbmVudFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEeG9EYXRhR3JpZEZvcm1JdGVtTW9kdWxlIHsgfVxyXG4iXX0=