UNPKG

@netgrif/components-core

Version:

Netgrif Application engine frontend core Angular library

170 lines 22.5 kB
import { Component, Injector, Input, ViewChild } from '@angular/core'; import { WrappedBoolean } from './models/wrapped-boolean'; import { TemplateAppearance } from '../models/template-appearance'; import { DATA_FIELD_PORTAL_DATA } from "../models/data-field-portal-data-injection-token"; import * as i0 from "@angular/core"; import * as i1 from "../../navigation/quick-panel/components/paper-view.service"; import * as i2 from "../../configuration/configuration.service"; import * as i3 from "../../registry/component-registry.service"; /** * Provides a responsive layout to data fields where their appearance can change based on the width of space they have available. * * If the width of the available space is less than the `layoutChangeWidthBreakpoint` then the provided `dataFieldTemplate` is displayed at * 100% width. If the width is greater or equal to the breakpoint the datafield template occupies the right half and the left half contains * it's title. * * If the datafield's layout is set to `TemplateAppearance.MATERIAL` the field always occupies 100% of the available space * regardless of it's width. * * See {@link DataField} and {@link TemplateAppearance} for more information. */ export class AbstractDataFieldTemplateComponent { _paperView; _config; _componentRegistry; injector; /** * Content of the datafield that should be displayed in the template */ dataFieldTemplate; /** * If the available space has a width smaller that this breakpoint the datafield will fill 100% of the available space. * * The breakpoint is only taken into consideration if `TemplateAppearance.NETGRIF` is set on the data field. * * See [DataField.layout]{@link DataField#layout} for more information. */ layoutChangeWidthBreakpoint = 250; /** * Field offset defined by task */ offset = 0; _additionalFieldProperties; container; _dataField; _isConfiguredNetgrifTemplate = true; _isNetgrifTemplate = true; _componentPortal; /** * @ignore * The value determines whether the layout should be "small" or not. Data field fills 100% of the width in "small" layout. */ _showLargeLayout = new WrappedBoolean(); constructor(_paperView, _config, _componentRegistry, injector) { this._paperView = _paperView; this._config = _config; this._componentRegistry = _componentRegistry; this.injector = injector; const configuredTemplate = this._config.getDatafieldConfiguration(); this._isConfiguredNetgrifTemplate = configuredTemplate && configuredTemplate.template && configuredTemplate.template === TemplateAppearance.NETGRIF; } ngOnInit() { if (!!this._dataField && !!this._dataField.layout && !!this._dataField.layout.offset) { this.offset += this._dataField.layout.offset; } this._showLargeLayout.value = this.evaluateTemplate(); this._dataField.resolveAppearance(this._config); } get showLargeLayout() { return this._showLargeLayout; } /** * Datafield model object that should be displayed in the template */ set dataField(dataField) { this._dataField = dataField; if (this._dataField.layout && this._dataField.layout.template) { this._isNetgrifTemplate = this._dataField.layout.template === TemplateAppearance.NETGRIF; } else { this._isNetgrifTemplate = this._isConfiguredNetgrifTemplate; } this._componentPortal = this.resolveComponentPortal(this.dataField, this.showLargeLayout, this.dataField.formControlRef, this.additionalFieldProperties); } get dataField() { return this._dataField; } get componentPortal() { return this._componentPortal; } get additionalFieldProperties() { return this._additionalFieldProperties; } set additionalFieldProperties(value) { this._additionalFieldProperties = value; } /** * Function that is called when the Component changes dimension and * determines whether the "small" or "large" layout should be displayed. * @param event - event containing the new width of this Component */ evaluateTemplateCondition() { (this.container && this.container.nativeElement && this.container.nativeElement.offsetWidth) ? this._showLargeLayout.value = this.container.nativeElement.offsetWidth >= this.layoutChangeWidthBreakpoint && this.evaluateTemplate() : this._showLargeLayout.value = this.evaluateTemplate(); return this._showLargeLayout.value; } hasComponent() { return this._componentRegistry.contains(this.dataField.getTypedComponentType()); } resolveComponentPortal(dataField, showLargeLayout, formControlRef, additionalFieldProperties) { if (this.hasComponent()) { const portalInjector = Injector.create({ providers: [ { provide: DATA_FIELD_PORTAL_DATA, useValue: { dataField: dataField, showLargeLayout: showLargeLayout, formControlRef: formControlRef, additionalFieldProperties } } ], parent: this.injector }); return this._componentRegistry.get(this.dataField.getTypedComponentType(), portalInjector); } return undefined; } /** * @returns `false` if the data field uses the `TemplateAppearance.MATERIAL` and `true` otherwise. */ evaluateTemplate() { if (!this._dataField) { return true; } return this._isNetgrifTemplate; } isPaperView() { return this._paperView.paperView; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AbstractDataFieldTemplateComponent, deps: [{ token: i1.PaperViewService }, { token: i2.ConfigurationService }, { token: i3.ComponentRegistryService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AbstractDataFieldTemplateComponent, selector: "ncc-abstract-datafield-template", inputs: { dataFieldTemplate: "dataFieldTemplate", layoutChangeWidthBreakpoint: "layoutChangeWidthBreakpoint", offset: "offset", _additionalFieldProperties: "_additionalFieldProperties", dataField: "dataField", additionalFieldProperties: "additionalFieldProperties" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["dataFieldContainer"], descendants: true }], ngImport: i0, template: '', isInline: true }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AbstractDataFieldTemplateComponent, decorators: [{ type: Component, args: [{ selector: 'ncc-abstract-datafield-template', template: '' }] }], ctorParameters: () => [{ type: i1.PaperViewService }, { type: i2.ConfigurationService }, { type: i3.ComponentRegistryService }, { type: i0.Injector }], propDecorators: { dataFieldTemplate: [{ type: Input }], layoutChangeWidthBreakpoint: [{ type: Input }], offset: [{ type: Input }], _additionalFieldProperties: [{ type: Input }], container: [{ type: ViewChild, args: ['dataFieldContainer'] }], dataField: [{ type: Input }], additionalFieldProperties: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtZGF0YS1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZXRncmlmLWNvbXBvbmVudHMtY29yZS9zcmMvbGliL2RhdGEtZmllbGRzL2RhdGEtZmllbGQtdGVtcGxhdGUvYWJzdHJhY3QtZGF0YS1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBYyxRQUFRLEVBQUUsS0FBSyxFQUF1QixTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckcsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBRXhELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBTWpFLE9BQU8sRUFBQyxzQkFBc0IsRUFBc0IsTUFBTSxrREFBa0QsQ0FBQzs7Ozs7QUFHN0c7Ozs7Ozs7Ozs7O0dBV0c7QUFNSCxNQUFNLE9BQWdCLGtDQUFrQztJQWlDcEI7SUFDQTtJQUNBO0lBQ0E7SUFsQ2hDOztPQUVHO0lBQ2EsaUJBQWlCLENBQW1CO0lBQ3BEOzs7Ozs7T0FNRztJQUNhLDJCQUEyQixHQUFHLEdBQUcsQ0FBQztJQUNsRDs7T0FFRztJQUNhLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFFViwwQkFBMEIsQ0FBcUM7SUFFL0MsU0FBUyxDQUFhO0lBQzdDLFVBQVUsQ0FBaUI7SUFDM0IsNEJBQTRCLEdBQUcsSUFBSSxDQUFDO0lBQ3BDLGtCQUFrQixHQUFHLElBQUksQ0FBQztJQUMxQixnQkFBZ0IsQ0FBdUI7SUFFakQ7OztPQUdHO0lBQ08sZ0JBQWdCLEdBQW1CLElBQUksY0FBYyxFQUFFLENBQUM7SUFFbEUsWUFBZ0MsVUFBNEIsRUFDNUIsT0FBNkIsRUFDN0Isa0JBQTRDLEVBQzVDLFFBQWtCO1FBSGxCLGVBQVUsR0FBVixVQUFVLENBQWtCO1FBQzVC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QUEyQjtzQkFBMUMsS0FBSztnQkFJVSxNQUFNO3NCQUFyQixLQUFLO2dCQUVXLDBCQUEwQjtzQkFBMUMsS0FBSztnQkFFMkIsU0FBUztzQkFBekMsU0FBUzt1QkFBQyxvQkFBb0I7Z0JBcUNsQixTQUFTO3NCQUFyQixLQUFLO2dCQXdCRix5QkFBeUI7c0JBRDVCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0b3IsIElucHV0LCBPbkluaXQsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtXcmFwcGVkQm9vbGVhbn0gZnJvbSAnLi9tb2RlbHMvd3JhcHBlZC1ib29sZWFuJztcbmltcG9ydCB7RGF0YUZpZWxkfSBmcm9tICcuLi9tb2RlbHMvYWJzdHJhY3QtZGF0YS1maWVsZCc7XG5pbXBvcnQge1RlbXBsYXRlQXBwZWFyYW5jZX0gZnJvbSAnLi4vbW9kZWxzL3RlbXBsYXRlLWFwcGVhcmFuY2UnO1xuaW1wb3J0IHtQYXBlclZpZXdTZXJ2aWNlfSBmcm9tICcuLi8uLi9uYXZpZ2F0aW9uL3F1aWNrLXBhbmVsL2NvbXBvbmVudHMvcGFwZXItdmlldy5zZXJ2aWNlJztcbmltcG9ydCB7Q29uZmlndXJhdGlvblNlcnZpY2V9IGZyb20gJy4uLy4uL2NvbmZpZ3VyYXRpb24vY29uZmlndXJhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7Rm9ybUNvbnRyb2x9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHtDb21wb25lbnRQb3J0YWx9IGZyb20gXCJAYW5ndWxhci9jZGsvcG9ydGFsXCI7XG5pbXBvcnQge0NvbXBvbmVudFJlZ2lzdHJ5U2VydmljZX0gZnJvbSBcIi4uLy4uL3JlZ2lzdHJ5L2NvbXBvbmVudC1yZWdpc3RyeS5zZXJ2aWNlXCI7XG5pbXBvcnQge0RBVEFfRklFTERfUE9SVEFMX0RBVEEsIERhdGFGaWVsZFBvcnRhbERhdGF9IGZyb20gXCIuLi9tb2RlbHMvZGF0YS1maWVsZC1wb3J0YWwtZGF0YS1pbmplY3Rpb24tdG9rZW5cIjtcbmltcG9ydCB7QnV0dG9uRmllbGR9IGZyb20gJy4uL2J1dHRvbi1maWVsZC9tb2RlbHMvYnV0dG9uLWZpZWxkJztcblxuLyoqXG4gKiBQcm92aWRlcyBhIHJlc3BvbnNpdmUgbGF5b3V0IHRvIGRhdGEgZmllbGRzIHdoZXJlIHRoZWlyIGFwcGVhcmFuY2UgY2FuIGNoYW5nZSBiYXNlZCBvbiB0aGUgd2lkdGggb2Ygc3BhY2UgdGhleSBoYXZlIGF2YWlsYWJsZS5cbiAqXG4gKiBJZiB0aGUgd2lkdGggb2YgdGhlIGF2YWlsYWJsZSBzcGFjZSBpcyBsZXNzIHRoYW4gdGhlIGBsYXlvdXRDaGFuZ2VXaWR0aEJyZWFrcG9pbnRgIHRoZW4gdGhlIHByb3ZpZGVkIGBkYXRhRmllbGRUZW1wbGF0ZWAgaXMgZGlzcGxheWVkIGF0XG4gKiAxMDAlIHdpZHRoLiBJZiB0aGUgd2lkdGggaXMgZ3JlYXRlciBvciBlcXVhbCB0byB0aGUgYnJlYWtwb2ludCB0aGUgZGF0YWZpZWxkIHRlbXBsYXRlIG9jY3VwaWVzIHRoZSByaWdodCBoYWxmIGFuZCB0aGUgbGVmdCBoYWxmIGNvbnRhaW5zXG4gKiBpdCdzIHRpdGxlLlxuICpcbiAqIElmIHRoZSBkYXRhZmllbGQncyBsYXlvdXQgaXMgc2V0IHRvIGBUZW1wbGF0ZUFwcGVhcmFuY2UuTUFURVJJQUxgIHRoZSBmaWVsZCBhbHdheXMgb2NjdXBpZXMgMTAwJSBvZiB0aGUgYXZhaWxhYmxlIHNwYWNlXG4gKiByZWdhcmRsZXNzIG9mIGl0J3Mgd2lkdGguXG4gKlxuICogU2VlIHtAbGluayBEYXRhRmllbGR9IGFuZCB7QGxpbmsgVGVtcGxhdGVBcHBlYXJhbmNlfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqL1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25jYy1hYnN0cmFjdC1kYXRhZmllbGQtdGVtcGxhdGUnLFxuICAgIHRlbXBsYXRlOiAnJ1xufSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERhdGFGaWVsZFRlbXBsYXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgIC8qKlxuICAgICAqIENvbnRlbnQgb2YgdGhlIGRhdGFmaWVsZCB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIHRlbXBsYXRlXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIGRhdGFGaWVsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBhdmFpbGFibGUgc3BhY2UgaGFzIGEgd2lkdGggc21hbGxlciB0aGF0IHRoaXMgYnJlYWtwb2ludCB0aGUgZGF0YWZpZWxkIHdpbGwgZmlsbCAxMDAlIG9mIHRoZSBhdmFpbGFibGUgc3BhY2UuXG4gICAgICpcbiAgICAgKiBUaGUgYnJlYWtwb2ludCBpcyBvbmx5IHRha2VuIGludG8gY29uc2lkZXJhdGlvbiBpZiBgVGVtcGxhdGVBcHBlYXJhbmNlLk5FVEdSSUZgIGlzIHNldCBvbiB0aGUgZGF0YSBmaWVsZC5cbiAgICAgKlxuICAgICAqIFNlZSBbRGF0YUZpZWxkLmxheW91dF17QGxpbmsgRGF0YUZpZWxkI2xheW91dH0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIGxheW91dENoYW5nZVdpZHRoQnJlYWtwb2ludCA9IDI1MDtcbiAgICAvKipcbiAgICAgKiBGaWVsZCBvZmZzZXQgZGVmaW5lZCBieSB0YXNrXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIG9mZnNldCA9IDA7XG5cbiAgICBASW5wdXQoKSBwcml2YXRlIF9hZGRpdGlvbmFsRmllbGRQcm9wZXJ0aWVzOiB7IFsgazogc3RyaW5nIF06IHN0cmluZyB8IG51bWJlciB9O1xuXG4gICAgQFZpZXdDaGlsZCgnZGF0YUZpZWxkQ29udGFpbmVyJykgY29udGFpbmVyOiBFbGVtZW50UmVmO1xuICAgIHByb3RlY3RlZCBfZGF0YUZpZWxkOiBEYXRhRmllbGQ8YW55PjtcbiAgICBwcm90ZWN0ZWQgX2lzQ29uZmlndXJlZE5ldGdyaWZUZW1wbGF0ZSA9IHRydWU7XG4gICAgcHJvdGVjdGVkIF9pc05ldGdyaWZUZW1wbGF0ZSA9IHRydWU7XG4gICAgcHJvdGVjdGVkIF9jb21wb25lbnRQb3J0YWw6IENvbXBvbmVudFBvcnRhbDxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGlnbm9yZVxuICAgICAqIFRoZSB2YWx1ZSBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGxheW91dCBzaG91bGQgYmUgXCJzbWFsbFwiIG9yIG5vdC4gRGF0YSBmaWVsZCBmaWxscyAxMDAlIG9mIHRoZSB3aWR0aCBpbiBcInNtYWxsXCIgbGF5b3V0LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfc2hvd0xhcmdlTGF5b3V0OiBXcmFwcGVkQm9vbGVhbiA9IG5ldyBXcmFwcGVkQm9vbGVhbigpO1xuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfcGFwZXJWaWV3OiBQYXBlclZpZXdTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2NvbmZpZzogQ29uZmlndXJhdGlvblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfY29tcG9uZW50UmVnaXN0cnk6IENvbXBvbmVudFJlZ2lzdHJ5U2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3Rvcikge1xuICAgICAgICBjb25zdCBjb25maWd1cmVkVGVtcGxhdGUgPSB0aGlzLl9jb25maWcuZ2V0RGF0YWZpZWxkQ29uZmlndXJhdGlvbigpO1xuICAgICAgICB0aGlzLl9pc0NvbmZpZ3VyZWROZXRncmlmVGVtcGxhdGUgPSBjb25maWd1cmVkVGVtcGxhdGVcbiAgICAgICAgICAgICYmIGNvbmZpZ3VyZWRUZW1wbGF0ZS50ZW1wbGF0ZVxuICAgICAgICAgICAgJiYgY29uZmlndXJlZFRlbXBsYXRlLnRlbXBsYXRlID09PSBUZW1wbGF0ZUFwcGVhcmFuY2UuTkVUR1JJRjtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgICAgIGlmICghIXRoaXMuX2RhdGFGaWVsZCAmJiAhIXRoaXMuX2RhdGFGaWVsZC5sYXlvdXQgJiYgISF0aGlzLl9kYXRhRmllbGQubGF5b3V0Lm9mZnNldCkge1xuICAgICAgICAgICAgdGhpcy5vZmZzZXQgKz0gdGhpcy5fZGF0YUZpZWxkLmxheW91dC5vZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2hvd0xhcmdlTGF5b3V0LnZhbHVlID0gdGhpcy5ldmFsdWF0ZVRlbXBsYXRlKCk7XG4gICAgICAgIHRoaXMuX2RhdGFGaWVsZC5yZXNvbHZlQXBwZWFyYW5jZSh0aGlzLl9jb25maWcpO1xuICAgIH1cblxuICAgIGdldCBzaG93TGFyZ2VMYXlvdXQoKTogV3JhcHBlZEJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2hvd0xhcmdlTGF5b3V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERhdGFmaWVsZCBtb2RlbCBvYmplY3QgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIGluIHRoZSB0ZW1wbGF0ZVxuICAgICAqL1xuICAgIEBJbnB1dCgpIHNldCBkYXRhRmllbGQoZGF0YUZpZWxkOiBEYXRhRmllbGQ8YW55Pikge1xuICAgICAgICB0aGlzLl9kYXRhRmllbGQgPSBkYXRhRmllbGQ7XG4gICAgICAgIGlmICh0aGlzLl9kYXRhRmllbGQubGF5b3V0ICYmIHRoaXMuX2RhdGFGaWVsZC5sYXlvdXQudGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2lzTmV0Z3JpZlRlbXBsYXRlID0gdGhpcy5fZGF0YUZpZWxkLmxheW91dC50ZW1wbGF0ZSA9PT0gVGVtcGxhdGVBcHBlYXJhbmNlLk5FVEdSSUY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pc05ldGdyaWZUZW1wbGF0ZSA9IHRoaXMuX2lzQ29uZmlndXJlZE5ldGdyaWZUZW1wbGF0ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jb21wb25lbnRQb3J0YWwgPSB0aGlzLnJlc29sdmVDb21wb25lbnRQb3J0YWwodGhpcy5kYXRhRmllbGQsIHRoaXMuc2hvd0xhcmdlTGF5b3V0LCB0aGlzLmRhdGFGaWVsZC5mb3JtQ29udHJvbFJlZiwgdGhpcy5hZGRpdGlvbmFsRmllbGRQcm9wZXJ0aWVzKVxuICAgIH1cblxuICAgIGdldCBkYXRhRmllbGQoKTogRGF0YUZpZWxkPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YUZpZWxkO1xuICAgIH1cblxuICAgIGdldCBjb21wb25lbnRQb3J0YWwoKTogQ29tcG9uZW50UG9ydGFsPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29tcG9uZW50UG9ydGFsO1xuICAgIH1cblxuXG4gICAgZ2V0IGFkZGl0aW9uYWxGaWVsZFByb3BlcnRpZXMoKToge1trOnN0cmluZ106IHN0cmluZyB8IG51bWJlcn0ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkaXRpb25hbEZpZWxkUHJvcGVydGllcztcbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHNldCBhZGRpdGlvbmFsRmllbGRQcm9wZXJ0aWVzKHZhbHVlOiB7W2s6c3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyfSkge1xuICAgICAgICB0aGlzLl9hZGRpdGlvbmFsRmllbGRQcm9wZXJ0aWVzID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgQ29tcG9uZW50IGNoYW5nZXMgZGltZW5zaW9uIGFuZFxuICAgICAqIGRldGVybWluZXMgd2hldGhlciB0aGUgXCJzbWFsbFwiIG9yIFwibGFyZ2VcIiBsYXlvdXQgc2hvdWxkIGJlIGRpc3BsYXllZC5cbiAgICAgKiBAcGFyYW0gZXZlbnQgLSBldmVudCBjb250YWluaW5nIHRoZSBuZXcgd2lkdGggb2YgdGhpcyBDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZXZhbHVhdGVUZW1wbGF0ZUNvbmRpdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgKHRoaXMuY29udGFpbmVyICYmIHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCkgP1xuICAgICAgICAgICAgdGhpcy5fc2hvd0xhcmdlTGF5b3V0LnZhbHVlID1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoICA+PSB0aGlzLmxheW91dENoYW5nZVdpZHRoQnJlYWtwb2ludCAmJiB0aGlzLmV2YWx1YXRlVGVtcGxhdGUoKSA6XG4gICAgICAgICAgICB0aGlzLl9zaG93TGFyZ2VMYXlvdXQudmFsdWUgPSB0aGlzLmV2YWx1YXRlVGVtcGxhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nob3dMYXJnZUxheW91dC52YWx1ZTtcbiAgICB9XG5cblxuICAgIHB1YmxpYyBoYXNDb21wb25lbnQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb21wb25lbnRSZWdpc3RyeS5jb250YWlucyh0aGlzLmRhdGFGaWVsZC5nZXRUeXBlZENvbXBvbmVudFR5cGUoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlc29sdmVDb21wb25lbnRQb3J0YWwoZGF0YUZpZWxkOiBEYXRhRmllbGQ8YW55Piwgc2hvd0xhcmdlTGF5b3V0OiBXcmFwcGVkQm9vbGVhbiwgZm9ybUNvbnRyb2xSZWY6IEZvcm1Db250cm9sLCBhZGRpdGlvbmFsRmllbGRQcm9wZXJ0aWVzPzoge1trOnN0cmluZ106IHN0cmluZyB8IG51bWJlcn0pOiBDb21wb25lbnRQb3J0YWw8YW55PiB7XG4gICAgICAgIGlmICh0aGlzLmhhc0NvbXBvbmVudCgpKSB7XG4gICAgICAgICAgICBjb25zdCBwb3J0YWxJbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IERBVEFfRklFTERfUE9SVEFMX0RBVEEsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VWYWx1ZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogZGF0YUZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dMYXJnZUxheW91dDogc2hvd0xhcmdlTGF5b3V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sUmVmOiBmb3JtQ29udHJvbFJlZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsRmllbGRQcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGFzIERhdGFGaWVsZFBvcnRhbERhdGE8YW55PlxuICAgICAgICAgICAgICAgICAgICB9XSxcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IHRoaXMuaW5qZWN0b3JcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbXBvbmVudFJlZ2lzdHJ5LmdldCh0aGlzLmRhdGFGaWVsZC5nZXRUeXBlZENvbXBvbmVudFR5cGUoKSwgcG9ydGFsSW5qZWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgYGZhbHNlYCBpZiB0aGUgZGF0YSBmaWVsZCB1c2VzIHRoZSBgVGVtcGxhdGVBcHBlYXJhbmNlLk1BVEVSSUFMYCBhbmQgYHRydWVgIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZXZhbHVhdGVUZW1wbGF0ZSgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLl9kYXRhRmllbGQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9pc05ldGdyaWZUZW1wbGF0ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNQYXBlclZpZXcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXBlclZpZXcucGFwZXJWaWV3O1xuICAgIH1cbn1cbiJdfQ==