devextreme-angular
Version:
Angular UI and visualization components based on DevExtreme widgets
246 lines • 32.8 kB
JavaScript
/*!
* devextreme-angular
* Version: 22.1.14
* Build date: Mon Apr 29 2024
*
* Copyright (c) 2012 - 2024 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
*/
import { Component, PLATFORM_ID, Inject, EventEmitter } from '@angular/core';
import { isPlatformServer } from '@angular/common';
import { makeStateKey } from '@angular/platform-browser';
import { EmitterHelper, NgEventsStrategy } from './events-strategy';
import domAdapter from 'devextreme/core/dom_adapter';
import { triggerHandler } from 'devextreme/events';
import { CollectionNestedOptionContainerImpl } from './nested-option';
import * as i0 from "@angular/core";
import * as i1 from "./template-host";
import * as i2 from "./watcher-helper";
import * as i3 from "@angular/platform-browser";
let serverStateKey;
export const getServerStateKey = () => {
if (!serverStateKey) {
serverStateKey = makeStateKey('DX_isPlatformServer');
}
return serverStateKey;
};
export class DxComponent {
constructor(element, ngZone, templateHost, watcherHelper, transferState, platformId) {
this.element = element;
this.ngZone = ngZone;
this.watcherHelper = watcherHelper;
this.transferState = transferState;
this.platformId = platformId;
this._initialOptions = {};
this._optionsToUpdate = {};
this.optionChangedHandlers = new EventEmitter();
this.isLinked = true;
this.changedOptions = {};
this.removedNestedComponents = [];
this.widgetUpdateLocked = false;
this.templateUpdateRequired = false;
this.templates = [];
templateHost.setHost(this);
this._collectionContainerImpl = new CollectionNestedOptionContainerImpl(this._setOption.bind(this));
this.eventHelper = new EmitterHelper(ngZone, this);
}
_updateTemplates() {
if (this.templates.length && this.templateUpdateRequired) {
let updatedTemplates = {};
this.templates.forEach(template => {
updatedTemplates[template.name] = template;
});
this.instance.option('integrationOptions.templates', updatedTemplates);
this.templates = Object.values(updatedTemplates);
this.templateUpdateRequired = false;
}
}
_initEvents() {
this.instance.on('optionChanged', (e) => {
this.changedOptions[e.name] = e.value;
const value = e.name === e.fullName ? e.value : e.component.option(e.name);
this.eventHelper.fireNgEvent(e.name + 'Change', [value]);
this.optionChangedHandlers.emit(e);
});
}
_initOptions() {
this._initialOptions.integrationOptions.watchMethod = this.watcherHelper.getWatchMethod();
}
_initPlatform() {
if (this.transferState.hasKey(getServerStateKey())) {
this._initialOptions.integrationOptions.renderedOnServer = this.transferState.get(getServerStateKey(), null);
}
else if (isPlatformServer(this.platformId)) {
this.transferState.set(getServerStateKey(), true);
}
}
_createEventEmitters(events) {
const zone = this.ngZone;
this.eventHelper.createEmitters(events);
this._initialOptions.eventsStrategy = (instance) => {
let strategy = new NgEventsStrategy(instance, zone);
events.filter(event => event.subscribe).forEach(event => {
strategy.addEmitter(event.subscribe, this[event.emit]);
});
return strategy;
};
this._initialOptions.nestedComponentOptions = function (component) {
return {
eventsStrategy: (instance) => { return new NgEventsStrategy(instance, zone); },
nestedComponentOptions: component.option('nestedComponentOptions')
};
};
}
_shouldOptionChange(name, value) {
if (this.changedOptions.hasOwnProperty(name)) {
const prevValue = this.changedOptions[name];
delete this.changedOptions[name];
return value !== prevValue;
}
return true;
}
clearChangedOptions() {
this.changedOptions = {};
}
_getOption(name) {
return this.instance ?
this.instance.option(name) :
this._initialOptions[name];
}
lockWidgetUpdate() {
if (!this.widgetUpdateLocked && this.instance) {
this.instance.beginUpdate();
this.widgetUpdateLocked = true;
}
}
unlockWidgetUpdate() {
if (this.widgetUpdateLocked) {
this.widgetUpdateLocked = false;
this.instance.endUpdate();
}
}
_setOption(name, value) {
this.lockWidgetUpdate();
if (!this._shouldOptionChange(name, value)) {
return;
}
if (this.instance) {
this.instance.option(name, value);
}
else {
this._initialOptions[name] = value;
}
}
_createWidget(element) {
this._initialOptions.integrationOptions = {};
this._initPlatform();
this._initOptions();
this._initialOptions.onInitializing = function () {
this.beginUpdate();
};
this.instance = this._createInstance(element, this._initialOptions);
this._initEvents();
this._initialOptions = {};
}
_destroyWidget() {
this.removedNestedComponents = [];
if (this.instance) {
let element = this.instance.element();
triggerHandler(element, 'dxremove', { _angularIntegration: true });
this.instance.dispose();
domAdapter.removeElement(element);
}
}
ngOnChanges(changes) {
for (let key in changes) {
let change = changes[key];
if (change.currentValue !== this[key]) {
this._optionsToUpdate[key] = changes[key].currentValue;
}
}
}
ngOnInit() {
this._createWidget(this.element.nativeElement);
}
ngDoCheck() {
this.applyOptions();
}
ngAfterContentChecked() {
this._updateTemplates();
this.applyOptions();
this.resetOptions();
this.unlockWidgetUpdate();
}
ngAfterViewInit() {
this._updateTemplates();
this.instance.endUpdate();
this.recreatedNestedComponents = [];
}
applyOptions() {
if (Object.keys(this._optionsToUpdate).length) {
if (this.instance) {
this.instance.option(this._optionsToUpdate);
}
this._optionsToUpdate = {};
}
}
resetOptions(collectionName) {
if (this.instance) {
this.removedNestedComponents.filter(option => option &&
!this.isRecreated(option) &&
collectionName ? option.startsWith(collectionName) : true)
.forEach(option => {
this.instance.resetOption(option);
});
this.removedNestedComponents = [];
this.recreatedNestedComponents = [];
}
}
isRecreated(name) {
return this.recreatedNestedComponents &&
this.recreatedNestedComponents.some(nestedComponent => nestedComponent.getOptionPath() === name);
}
setTemplate(template) {
this.templates.push(template);
this.templateUpdateRequired = true;
}
setChildren(propertyName, items) {
this.resetOptions(propertyName);
return this._collectionContainerImpl.setChildren(propertyName, items);
}
}
/** @nocollapse */ DxComponent.ɵfac = function DxComponent_Factory(t) { return new (t || DxComponent)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(i1.DxTemplateHost), i0.ɵɵdirectiveInject(i2.WatcherHelper), i0.ɵɵdirectiveInject(i3.TransferState), i0.ɵɵdirectiveInject(PLATFORM_ID)); };
/** @nocollapse */ DxComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: DxComponent, selectors: [["ng-component"]], features: [i0.ɵɵNgOnChangesFeature], decls: 0, vars: 0, template: function DxComponent_Template(rf, ctx) { }, encapsulation: 2 });
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DxComponent, [{
type: Component,
args: [{
template: ''
}]
}], function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i1.DxTemplateHost }, { type: i2.WatcherHelper }, { type: i3.TransferState }, { type: undefined, decorators: [{
type: Inject,
args: [PLATFORM_ID]
}] }]; }, null); })();
export class DxComponentExtension extends DxComponent {
createInstance(element) {
this._createWidget(element);
}
ngOnInit() {
}
ngAfterViewInit() {
this._createWidget(this.element.nativeElement);
this.instance.endUpdate();
}
}
/** @nocollapse */ DxComponentExtension.ɵfac = /** @pureOrBreakMyCode */ function () { let ɵDxComponentExtension_BaseFactory; return function DxComponentExtension_Factory(t) { return (ɵDxComponentExtension_BaseFactory || (ɵDxComponentExtension_BaseFactory = i0.ɵɵgetInheritedFactory(DxComponentExtension)))(t || DxComponentExtension); }; }();
/** @nocollapse */ DxComponentExtension.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: DxComponentExtension, selectors: [["ng-component"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function DxComponentExtension_Template(rf, ctx) { }, encapsulation: 2 });
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DxComponentExtension, [{
type: Component,
args: [{
template: ''
}]
}], null, null); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vZGlzdC9jb3JlL2NvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7R0FXRztBQUVILE9BQU8sRUFDSCxTQUFTLEVBS1QsV0FBVyxFQUNYLE1BQU0sRUFDTixZQUFZLEVBT2YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFpQixZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUl4RSxPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFcEUsT0FBTyxVQUFVLE1BQU0sNkJBQTZCLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRW5ELE9BQU8sRUFJSCxtQ0FBbUMsRUFDdEMsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7QUFFekIsSUFBSSxjQUFjLENBQUM7QUFDbkIsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxFQUFFO0lBQ2xDLElBQUksQ0FBQyxjQUFjLEVBQUU7UUFDakIsY0FBYyxHQUFHLFlBQVksQ0FBTSxxQkFBcUIsQ0FBQyxDQUFDO0tBQzdEO0lBRUQsT0FBTyxjQUFjLENBQUM7QUFDMUIsQ0FBQyxDQUFDO0FBS0YsTUFBTSxPQUFnQixXQUFXO0lBaUo3QixZQUFzQixPQUFtQixFQUM3QixNQUFjLEVBQ3RCLFlBQTRCLEVBQ3BCLGFBQTRCLEVBQzVCLGFBQTRCLEVBQ1AsVUFBZTtRQUwxQixZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQzdCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFFZCxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUNQLGVBQVUsR0FBVixVQUFVLENBQUs7UUFwSnhDLG9CQUFlLEdB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QUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzlCLENBQUM7OzJSQVhpQixvQkFBb0IsU0FBcEIsb0JBQW9CO3NHQUFwQixvQkFBb0I7dUZBQXBCLG9CQUFvQjtjQUh6QyxTQUFTO2VBQUM7Z0JBQ1AsUUFBUSxFQUFFLEVBQUU7YUFDZiIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogZGV2ZXh0cmVtZS1hbmd1bGFyXG4gKiBWZXJzaW9uOiAyMi4xLjE0XG4gKiBCdWlsZCBkYXRlOiBNb24gQXByIDI5IDIwMjRcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTIgLSAyMDI0IERldmVsb3BlciBFeHByZXNzIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRFxuICpcbiAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXNcbiAqIG9mIHRoZSBNSVQgbGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHByb2plY3QgZm9yIGRldGFpbHMuXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL0RldkV4cHJlc3MvZGV2ZXh0cmVtZS1hbmd1bGFyXG4gKi9cblxuaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBOZ1pvbmUsXG4gICAgUXVlcnlMaXN0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgUExBVEZPUk1fSUQsXG4gICAgSW5qZWN0LFxuICAgIEV2ZW50RW1pdHRlcixcblxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkluaXQsXG4gICAgRG9DaGVjayxcbiAgICBBZnRlckNvbnRlbnRDaGVja2VkLFxuICAgIEFmdGVyVmlld0luaXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IGlzUGxhdGZvcm1TZXJ2ZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgVHJhbnNmZXJTdGF0ZSwgbWFrZVN0YXRlS2V5IH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbmltcG9ydCB7IER4VGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tICcuL3RlbXBsYXRlJztcbmltcG9ydCB7IElEeFRlbXBsYXRlSG9zdCwgRHhUZW1wbGF0ZUhvc3QgfSBmcm9tICcuL3RlbXBsYXRlLWhvc3QnO1xuaW1wb3J0IHsgRW1pdHRlckhlbHBlciwgTmdFdmVudHNTdHJhdGVneSB9IGZyb20gJy4vZXZlbnRzLXN0cmF0ZWd5JztcbmltcG9ydCB7IFdhdGNoZXJIZWxwZXIgfSBmcm9tICcuL3dhdGNoZXItaGVscGVyJztcbmltcG9ydCBkb21BZGFwdGVyIGZyb20gJ2RldmV4dHJlbWUvY29yZS9kb21fYWRhcHRlcic7XG5pbXBvcnQgeyB0cmlnZ2VySGFuZGxlciB9IGZyb20gJ2RldmV4dHJlbWUvZXZlbnRzJztcblxuaW1wb3J0IHtcbiAgICBJTmVzdGVkT3B0aW9uQ29udGFpbmVyLFxuICAgIElDb2xsZWN0aW9uTmVzdGVkT3B0aW9uLFxuICAgIElDb2xsZWN0aW9uTmVzdGVkT3B0aW9uQ29udGFpbmVyLFxuICAgIENvbGxlY3Rpb25OZXN0ZWRPcHRpb25Db250YWluZXJJbXBsXG59IGZyb20gJy4vbmVzdGVkLW9wdGlvbic7XG5cbmxldCBzZXJ2ZXJTdGF0ZUtleTtcbmV4cG9ydCBjb25zdCBnZXRTZXJ2ZXJTdGF0ZUtleSA9ICgpID0+IHtcbiAgICBpZiAoIXNlcnZlclN0YXRlS2V5KSB7XG4gICAgICAgIHNlcnZlclN0YXRlS2V5ID0gbWFrZVN0YXRlS2V5PGFueT4oJ0RYX2lzUGxhdGZvcm1TZXJ2ZXInKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VydmVyU3RhdGVLZXk7XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgICB0ZW1wbGF0ZTogJydcbn0pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRHhDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCwgRG9DaGVjaywgQWZ0ZXJDb250ZW50Q2hlY2tlZCwgQWZ0ZXJWaWV3SW5pdCxcbiAgICBJTmVzdGVkT3B0aW9uQ29udGFpbmVyLCBJQ29sbGVjdGlvbk5lc3RlZE9wdGlvbkNvbnRhaW5lciwgSUR4VGVtcGxhdGVIb3N0IHtcbiAgICBwcml2YXRlIF9pbml0aWFsT3B0aW9uczogYW55ID0ge307XG4gICAgcHJvdGVjdGVkIF9vcHRpb25zVG9VcGRhdGU6IGFueSA9IHt9O1xuICAgIHByaXZhdGUgX2NvbGxlY3Rpb25Db250YWluZXJJbXBsOiBJQ29sbGVjdGlvbk5lc3RlZE9wdGlvbkNvbnRhaW5lcjtcbiAgICBldmVudEhlbHBlcjogRW1pdHRlckhlbHBlcjtcbiAgICBvcHRpb25DaGFuZ2VkSGFuZGxlcnM6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRlbXBsYXRlczogRHhUZW1wbGF0ZURpcmVjdGl2ZVtdO1xuICAgIGluc3RhbmNlOiBhbnk7XG4gICAgaXNMaW5rZWQgPSB0cnVlO1xuICAgIGNoYW5nZWRPcHRpb25zID0ge307XG4gICAgcmVtb3ZlZE5lc3RlZENvbXBvbmVudHMgPSBbXTtcbiAgICByZWNyZWF0ZWROZXN0ZWRDb21wb25lbnRzOiBhbnlbXTtcbiAgICB3aWRnZXRVcGRhdGVMb2NrZWQgPSBmYWxzZTtcbiAgICB0ZW1wbGF0ZVVwZGF0ZVJlcXVpcmVkID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIF91cGRhdGVUZW1wbGF0ZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLnRlbXBsYXRlcy5sZW5ndGggJiYgdGhpcy50ZW1wbGF0ZVVwZGF0ZVJlcXVpcmVkKSB7XG4gICAgICAgICAgICBsZXQgdXBkYXRlZFRlbXBsYXRlcyA9IHt9O1xuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXMuZm9yRWFjaCh0ZW1wbGF0ZSA9PiB7XG4gICAgICAgICAgICAgICAgdXBkYXRlZFRlbXBsYXRlc1t0ZW1wbGF0ZS5uYW1lXSA9IHRlbXBsYXRlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlLm9wdGlvbignaW50ZWdyYXRpb25PcHRpb25zLnRlbXBsYXRlcycsIHVwZGF0ZWRUZW1wbGF0ZXMpO1xuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXMgPSBPYmplY3QudmFsdWVzKHVwZGF0ZWRUZW1wbGF0ZXMpO1xuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVVwZGF0ZVJlcXVpcmVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9pbml0RXZlbnRzKCkge1xuICAgICAgICB0aGlzLmluc3RhbmNlLm9uKCdvcHRpb25DaGFuZ2VkJywgKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZE9wdGlvbnNbZS5uYW1lXSA9IGUudmFsdWU7XG5cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZS5uYW1lID09PSBlLmZ1bGxOYW1lID8gZS52YWx1ZSA6IGUuY29tcG9uZW50Lm9wdGlvbihlLm5hbWUpO1xuICAgICAgICAgICAgdGhpcy5ldmVudEhlbHBlci5maXJlTmdFdmVudChlLm5hbWUgKyAnQ2hhbmdlJywgW3ZhbHVlXSk7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbkNoYW5nZWRIYW5kbGVycy5lbWl0KGUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pbml0T3B0aW9ucygpIHtcbiAgICAgICAgdGhpcy5faW5pdGlhbE9wdGlvbnMuaW50ZWdyYXRpb25PcHRpb25zLndhdGNoTWV0aG9kID0gdGhpcy53YXRjaGVySGVscGVyLmdldFdhdGNoTWV0aG9kKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaW5pdFBsYXRmb3JtKCkge1xuICAgICAgICBpZiAodGhpcy50cmFuc2ZlclN0YXRlLmhhc0tleShnZXRTZXJ2ZXJTdGF0ZUtleSgpKSkge1xuICAgICAgICAgICAgdGhpcy5faW5pdGlhbE9wdGlvbnMuaW50ZWdyYXRpb25PcHRpb25zLnJlbmRlcmVkT25TZXJ2ZXIgPSB0aGlzLnRyYW5zZmVyU3RhdGUuZ2V0KGdldFNlcnZlclN0YXRlS2V5KCksIG51bGwpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzUGxhdGZvcm1TZXJ2ZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgICAgICAgdGhpcy50cmFuc2ZlclN0YXRlLnNldChnZXRTZXJ2ZXJTdGF0ZUtleSgpLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBfY3JlYXRlRXZlbnRFbWl0dGVycyhldmVudHMpIHtcbiAgICAgICAgY29uc3Qgem9uZSA9IHRoaXMubmdab25lO1xuICAgICAgICB0aGlzLmV2ZW50SGVscGVyLmNyZWF0ZUVtaXR0ZXJzKGV2ZW50cyk7XG5cbiAgICAgICAgdGhpcy5faW5pdGlhbE9wdGlvbnMuZXZlbnRzU3RyYXRlZ3kgPSAoaW5zdGFuY2UpID0+IHtcbiAgICAgICAgICAgIGxldCBzdHJhdGVneSA9IG5ldyBOZ0V2ZW50c1N0cmF0ZWd5KGluc3RhbmNlLCB6b25lKTtcblxuICAgICAgICAgICAgZXZlbnRzLmZpbHRlcihldmVudCA9PiBldmVudC5zdWJzY3JpYmUpLmZvckVhY2goZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHN0cmF0ZWd5LmFkZEVtaXR0ZXIoZXZlbnQuc3Vic2NyaWJlLCB0aGlzW2V2ZW50LmVtaXRdKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gc3RyYXRlZ3k7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5faW5pdGlhbE9wdGlvbnMubmVzdGVkQ29tcG9uZW50T3B0aW9ucyA9IGZ1bmN0aW9uIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZXZlbnRzU3RyYXRlZ3k6IChpbnN0YW5jZSkgPT4geyByZXR1cm4gbmV3IE5nRXZlbnRzU3RyYXRlZ3koaW5zdGFuY2UsIHpvbmUpOyB9LFxuICAgICAgICAgICAgICAgIG5lc3RlZENvbXBvbmVudE9wdGlvbnM6IGNvbXBvbmVudC5vcHRpb24oJ25lc3RlZENvbXBvbmVudE9wdGlvbnMnKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBfc2hvdWxkT3B0aW9uQ2hhbmdlKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5jaGFuZ2VkT3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgICAgY29uc3QgcHJldlZhbHVlID0gdGhpcy5jaGFuZ2VkT3B0aW9uc1tuYW1lXTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoYW5nZWRPcHRpb25zW25hbWVdO1xuXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgIT09IHByZXZWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjbGVhckNoYW5nZWRPcHRpb25zKCkge1xuICAgICAgICB0aGlzLmNoYW5nZWRPcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9nZXRPcHRpb24obmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlID9cbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2Uub3B0aW9uKG5hbWUpIDpcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxPcHRpb25zW25hbWVdO1xuICAgIH1cblxuICAgIGxvY2tXaWRnZXRVcGRhdGUoKSB7XG4gICAgICAgIGlmICghdGhpcy53aWRnZXRVcGRhdGVMb2NrZWQgJiYgdGhpcy5pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5iZWdpblVwZGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy53aWRnZXRVcGRhdGVMb2NrZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdW5sb2NrV2lkZ2V0VXBkYXRlKCkge1xuICAgICAgICBpZiAodGhpcy53aWRnZXRVcGRhdGVMb2NrZWQpIHtcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0VXBkYXRlTG9ja2VkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlLmVuZFVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9zZXRPcHRpb24obmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMubG9ja1dpZGdldFVwZGF0ZSgpO1xuXG4gICAgICAgIGlmICghdGhpcy5fc2hvdWxkT3B0aW9uQ2hhbmdlKG5hbWUsIHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2Uub3B0aW9uKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxPcHRpb25zW25hbWVdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgX2NyZWF0ZUluc3RhbmNlKGVsZW1lbnQsIG9wdGlvbnMpXG5cbiAgICBwcm90ZWN0ZWQgX2NyZWF0ZVdpZGdldChlbGVtZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5faW5pdGlhbE9wdGlvbnMuaW50ZWdyYXRpb25PcHRpb25zID0ge307XG4gICAgICAgIHRoaXMuX2luaXRQbGF0Zm9ybSgpO1xuICAgICAgICB0aGlzLl9pbml0T3B0aW9ucygpO1xuXG4gICAgICAgIHRoaXMuX2luaXRpYWxPcHRpb25zLm9uSW5pdGlhbGl6aW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5iZWdpblVwZGF0ZSgpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmluc3RhbmNlID0gdGhpcy5fY3JlYXRlSW5zdGFuY2UoZWxlbWVudCwgdGhpcy5faW5pdGlhbE9wdGlvbnMpO1xuICAgICAgICB0aGlzLl9pbml0RXZlbnRzKCk7XG4gICAgICAgIHRoaXMuX2luaXRpYWxPcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9kZXN0cm95V2lkZ2V0KCkge1xuICAgICAgICB0aGlzLnJlbW92ZWROZXN0ZWRDb21wb25lbnRzID0gW107XG4gICAgICAgIGlmICh0aGlzLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBsZXQgZWxlbWVudCA9IHRoaXMuaW5zdGFuY2UuZWxlbWVudCgpO1xuICAgICAgICAgICAgdHJpZ2dlckhhbmRsZXIoZWxlbWVudCwgJ2R4cmVtb3ZlJywgeyBfYW5ndWxhckludGVncmF0aW9uOiB0cnVlIH0pO1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5kaXNwb3NlKCk7XG4gICAgICAgICAgICBkb21BZGFwdGVyLnJlbW92ZUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgZWxlbWVudDogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICAgICAgdGVtcGxhdGVIb3N0OiBEeFRlbXBsYXRlSG9zdCxcbiAgICAgICAgcHJpdmF0ZSB3YXRjaGVySGVscGVyOiBXYXRjaGVySGVscGVyLFxuICAgICAgICBwcml2YXRlIHRyYW5zZmVyU3RhdGU6IFRyYW5zZmVyU3RhdGUsXG4gICAgICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogYW55KSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVzID0gW107XG4gICAgICAgIHRlbXBsYXRlSG9zdC5zZXRIb3N0KHRoaXMpO1xuICAgICAgICB0aGlzLl9jb2xsZWN0aW9uQ29udGFpbmVySW1wbCA9IG5ldyBDb2xsZWN0aW9uTmVzdGVkT3B0aW9uQ29udGFpbmVySW1wbCh0aGlzLl9zZXRPcHRpb24uYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuZXZlbnRIZWxwZXIgPSBuZXcgRW1pdHRlckhlbHBlcihuZ1pvbmUsIHRoaXMpO1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGNoYW5nZXMpIHtcbiAgICAgICAgICAgIGxldCBjaGFuZ2UgPSBjaGFuZ2VzW2tleV07XG4gICAgICAgICAgICBpZiAoY2hhbmdlLmN1cnJlbnRWYWx1ZSAhPT0gdGhpc1trZXldKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9uc1RvVXBkYXRlW2tleV0gPSBjaGFuZ2VzW2tleV0uY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuX2NyZWF0ZVdpZGdldCh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgbmdEb0NoZWNrKCkge1xuICAgICAgICB0aGlzLmFwcGx5T3B0aW9ucygpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlVGVtcGxhdGVzKCk7XG4gICAgICAgIHRoaXMuYXBwbHlPcHRpb25zKCk7XG4gICAgICAgIHRoaXMucmVzZXRPcHRpb25zKCk7XG4gICAgICAgIHRoaXMudW5sb2NrV2lkZ2V0VXBkYXRlKCk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLl91cGRhdGVUZW1wbGF0ZXMoKTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZS5lbmRVcGRhdGUoKTtcbiAgICAgICAgdGhpcy5yZWNyZWF0ZWROZXN0ZWRDb21wb25lbnRzID0gW107XG4gICAgfVxuXG4gICAgYXBwbHlPcHRpb25zKCkge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fb3B0aW9uc1RvVXBkYXRlKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5vcHRpb24odGhpcy5fb3B0aW9uc1RvVXBkYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX29wdGlvbnNUb1VwZGF0ZSA9IHt9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXRPcHRpb25zKGNvbGxlY3Rpb25OYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmluc3RhbmNlKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZWROZXN0ZWRDb21wb25lbnRzLmZpbHRlcihvcHRpb24gPT4gb3B0aW9uICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuaXNSZWNyZWF0ZWQob3B0aW9uKSAmJlxuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25OYW1lID8gb3B0aW9uLnN0YXJ0c1dpdGgoY29sbGVjdGlvbk5hbWUpIDogdHJ1ZSlcbiAgICAgICAgICAgICAgICAuZm9yRWFjaChvcHRpb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluc3RhbmNlLnJlc2V0T3B0aW9uKG9wdGlvbik7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMucmVtb3ZlZE5lc3RlZENvbXBvbmVudHMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMucmVjcmVhdGVkTmVzdGVkQ29tcG9uZW50cyA9IFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNSZWNyZWF0ZWQobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlY3JlYXRlZE5lc3RlZENvbXBvbmVudHMgJiZcbiAgICAgICAgICAgIHRoaXMucmVjcmVhdGVkTmVzdGVkQ29tcG9uZW50cy5zb21lKG5lc3RlZENvbXBvbmVudCA9PiBuZXN0ZWRDb21wb25lbnQuZ2V0T3B0aW9uUGF0aCgpID09PSBuYW1lKTtcbiAgICB9XG5cbiAgICBzZXRUZW1wbGF0ZSh0ZW1wbGF0ZTogRHhUZW1wbGF0ZURpcmVjdGl2ZSkge1xuICAgICAgICB0aGlzLnRlbXBsYXRlcy5wdXNoKHRlbXBsYXRlKTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVVwZGF0ZVJlcXVpcmVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBzZXRDaGlsZHJlbjxUIGV4dGVuZHMgSUNvbGxlY3Rpb25OZXN0ZWRPcHRpb24+KHByb3BlcnR5TmFtZTogc3RyaW5nLCBpdGVtczogUXVlcnlMaXN0PFQ+KSB7XG4gICAgICAgIHRoaXMucmVzZXRPcHRpb25zKHByb3BlcnR5TmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2xsZWN0aW9uQ29udGFpbmVySW1wbC5zZXRDaGlsZHJlbihwcm9wZXJ0eU5hbWUsIGl0ZW1zKTtcbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHRlbXBsYXRlOiAnJ1xufSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEeENvbXBvbmVudEV4dGVuc2lvbiBleHRlbmRzIER4Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgICBjcmVhdGVJbnN0YW5jZShlbGVtZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5fY3JlYXRlV2lkZ2V0KGVsZW1lbnQpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5fY3JlYXRlV2lkZ2V0KHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZS5lbmRVcGRhdGUoKTtcbiAgICB9XG59XG4iXX0=