Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
motif-web-admin-core / esm2015 / lib / sections / Configuration / components / configuration-section-component.js
Size: Mime:
/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
 */
import * as tslib_1 from "tslib";
import { ConfirmationDialogComponent } from '../../../components/ConfirmationDialog/confirmation-dialog-component';
import { Component, ViewChild, Input, ElementRef, Renderer } from '@angular/core';
import { PluginView } from 'web-console-core';
import { NGXLogger } from 'web-console-core';
import { SettingsService, ConfigurationsService } from '@wa-motif-open-api/configuration-service';
import { ConfigurationRow } from '../data/model';
import { ComboBoxComponent } from '@progress/kendo-angular-dropdowns';
import * as FileSaver from 'file-saver';
import { WCEditService } from 'web-console-ui-kit';
import { GridComponent } from '@progress/kendo-angular-grid';
import { process } from '@progress/kendo-data-query';
import { map } from 'rxjs/operators/map';
import { FormBuilder } from '@angular/forms';
import { forkJoin } from 'rxjs/observable/forkJoin';
import { faFileImport, faDownload } from '@fortawesome/free-solid-svg-icons';
import { WCNotificationCenter, NotificationType } from 'web-console-ui-kit';
import { NewConfigurationParamDialogComponent } from './dialog/new-configuration-param-dialog';
import { WCSubscriptionHandler } from '../../../components/Commons/wc-subscription-handler';
import * as _ from 'lodash';
import { dataTypesInfo } from './shared/shared';
import { MotifACLService } from 'web-console-motif-acl';
/** @type {?} */
const LOG_TAG = '[ConfigurationSection]';
let ConfigurationSectionComponent = class ConfigurationSectionComponent {
    /**
     * @param {?} logger
     * @param {?} motifACLService
     * @param {?} settingsService
     * @param {?} configurationService
     * @param {?} editService
     * @param {?} formBuilder
     * @param {?} renderer
     * @param {?} notificationCenter
     * @param {?} elem
     */
    constructor(logger, motifACLService, settingsService, configurationService, editService, formBuilder, renderer, notificationCenter, elem) {
        this.logger = logger;
        this.motifACLService = motifACLService;
        this.settingsService = settingsService;
        this.configurationService = configurationService;
        this.editService = editService;
        this.formBuilder = formBuilder;
        this.renderer = renderer;
        this.notificationCenter = notificationCenter;
        this.elem = elem;
        this.faFileImport = faFileImport;
        this.faDownload = faDownload;
        this.typesInfo = dataTypesInfo;
        this.gridState = {
            sort: []
        };
        this.changes = {};
        this.dropDownBooleanValues = [
            'true',
            'false'
        ];
        // Data binding
        this.loading = false;
        // Buttons
        this.canSave = false;
        this.canRefresh = false;
        this.canAddProperty = false;
        // the combobox selection
        this._editServiceConfig = { idField: 'name', dirtyField: 'dirty', isNewField: 'isNew' };
        this._subHandler = new WCSubscriptionHandler();
        this.editService.init();
        this.logger.debug(LOG_TAG, 'Opening...');
    }
    /**
     * Angular ngOnInit
     * @return {?}
     */
    ngOnInit() {
        this.logger.debug(LOG_TAG, 'Initializing...');
        this.view = this.editService.pipe(map((/**
         * @param {?} data
         * @return {?}
         */
        data => process(data, this.gridState))));
    }
    /**
     * @return {?}
     */
    ngOnDestroy() {
        this.logger.debug(LOG_TAG, 'ngOnDestroy ');
        this.freeMem();
    }
    /**
     * @return {?}
     */
    freeMem() {
        this.view = null;
        this.editDataItem = null;
        this._selectedService = null;
        this._editServiceConfig = null;
        this._subHandler.unsubscribe();
        this._subHandler = null;
    }
    /**
     * Triggered by the grid component
     * @param {?} state
     * @return {?}
     */
    onStateChange(state) {
        this.gridState = state;
        this.logger.debug(LOG_TAG, 'onStateChange: ', state);
    }
    /**
     * Reload the list of parameters for a given service
     * @private
     * @param {?} service
     * @return {?}
     */
    reloadConfigurationParamsForService(service) {
        this.logger.debug(LOG_TAG, 'Reloading paramters for service:', service);
        if (service) {
            this.loading = true;
            this._subHandler.add(this.settingsService.getSettings(service.name).subscribe((/**
             * @param {?} data
             * @return {?}
             */
            (data) => {
                this.logger.debug(LOG_TAG, 'reloadConfigurationParamsForService done: ', data);
                _.forEach(data, (/**
                 * @param {?} item
                 * @return {?}
                 */
                item => {
                    switch (item.type) {
                        case 'java.lang.Short':
                        case 'java.lang.Integer':
                        case 'java.lang.Long':
                        case 'java.lang.Double':
                        case 'java.lang.Float':
                            item.value = Number(item.value);
                            break;
                        default:
                            break;
                    }
                }));
                this.editService.cancelChanges();
                this.editService.read(data, this._editServiceConfig);
                this.loading = false;
            }), (/**
             * @param {?} error
             * @return {?}
             */
            (error) => {
                this.logger.error(LOG_TAG, 'reloadConfigurationParamsForService error: ', error);
                this.loading = false;
                this.notificationCenter.post({
                    name: 'LoadConfigurationError',
                    title: 'Load Configuration',
                    message: 'Error loading configuration settings:',
                    type: NotificationType.Error,
                    error: error,
                    closable: true
                });
            })));
        }
        else {
            this.editService.read([], this._editServiceConfig);
        }
        this.setOptions(true, true, true);
    }
    /**
     * User selection from Combobox
     * @param {?} service
     * @return {?}
     */
    set selectedService(service) {
        this._selectedService = service;
        this.reloadConfigurationParams();
        if (service) {
            this.setOptions(true, true, true);
        }
        else {
            this.setOptions(false, false, false);
        }
    }
    /**
     * @return {?}
     */
    get selectedService() {
        return this._selectedService;
    }
    /**
     * Reload current configuration for the current selected service
     * @private
     * @return {?}
     */
    reloadConfigurationParams() {
        return this.reloadConfigurationParamsForService(this._selectedService);
    }
    /**
     * User selection on click
     * triggered by the grid
     * @param {?} __0
     * @return {?}
     */
    cellClickHandler({ sender, rowIndex, columnIndex, dataItem, isEdited }) {
        if (!isEdited) {
            sender.editCell(rowIndex, columnIndex, this.createFormGroupForEdit(dataItem));
        }
    }
    /**
     * triggered by the grid
     * @param {?} args
     * @return {?}
     */
    cellCloseHandler(args) {
        const { formGroup, dataItem } = args;
        if (!formGroup.valid) {
            // prevent closing the edited cell if there are invalid values.
            args.preventDefault();
        }
        else if (formGroup.dirty) {
            this.editService.assignValues(dataItem, formGroup.value);
            this.editService.update(dataItem);
        }
    }
    /**
     * Prepare edit form for inline editing
     * @param {?} dataItem
     * @return {?}
     */
    createFormGroupForEdit(dataItem) {
        this.logger.debug(LOG_TAG, 'createFormGroupForEdit:', dataItem.value);
        return this.formBuilder.group({
            'value': dataItem.value
        });
    }
    /**
     * Export current configuration
     * @private
     * @return {?}
     */
    exportConfigurationFile() {
        this._subHandler.add(this.configurationService.downloadXml().subscribe((/**
         * @param {?} data
         * @return {?}
         */
        (data) => {
            this.logger.debug(LOG_TAG, 'Export done:', data);
            /** @type {?} */
            const fileName = 'motif_configuration_' + new Date().getTime() + '.xml';
            FileSaver.saveAs(data, fileName);
            this.logger.debug(LOG_TAG, 'Configuration saved: ', fileName);
            this.notificationCenter.post({
                name: 'ConfigurationExportSuccess',
                title: 'Configuration Export',
                message: 'The configuration has been exported successfully.',
                type: NotificationType.Success
            });
        }), (/**
         * @param {?} error
         * @return {?}
         */
        (error) => {
            this.logger.error(LOG_TAG, 'Export error:', error);
            this.notificationCenter.post({
                name: 'ConfigurationExportError',
                title: 'Export Configuration',
                message: 'Error exporting configuration:',
                type: NotificationType.Error,
                error: error,
                closable: true
            });
        })));
    }
    /**
     * Event emitted by the editor form
     * @return {?}
     */
    onEditCancel() {
        this.logger.debug(LOG_TAG, 'On Edit Cancelled');
        this.editDataItem = undefined;
    }
    /**
     * Button event
     * @return {?}
     */
    onRefreshClicked() {
        if (this.editService.hasChanges()) {
            this.confirmationDialog.open('Pending Changes', 
            // tslint:disable-next-line:max-line-length
            'Attention, in the configuration there are unsaved changes. Proceeding with the refresh these changes will be lost. Do you want to continue?', { 'action': 'refresh' });
        }
        else {
            this.reloadConfigurationParams();
        }
    }
    /**
     * Button event
     * @return {?}
     */
    onSaveClicked() {
        this.logger.debug(LOG_TAG, 'Save clicked');
        this._subHandler.add(this.saveAllChanges().subscribe((/**
         * @param {?} responses
         * @return {?}
         */
        (responses) => {
            this.reloadConfigurationParams();
            this.logger.debug(LOG_TAG, 'Settings saved successfully: ', responses);
            this.notificationCenter.post({
                name: 'SettingsSaveSuccess',
                title: 'Settings Save',
                message: 'The configuration settings have been saved correctly',
                type: NotificationType.Success
            });
        }), (/**
         * @param {?} error
         * @return {?}
         */
        (error) => {
            this.logger.debug(LOG_TAG, 'Error saving settings: ', error);
            this.notificationCenter.post({
                name: 'SettingsSaveError',
                title: 'Configuration Save',
                message: 'Error saving configuration settings:',
                type: NotificationType.Error,
                error: error,
                closable: true
            });
        })));
    }
    /**
     * Save all pending chenges remotely
     * @private
     * @return {?}
     */
    saveAllChanges() {
        this.logger.debug(LOG_TAG, 'Saving all changes...');
        /** @type {?} */
        const itemsToAdd = this.editService.createdItems;
        /** @type {?} */
        const itemsToUpdate = this.editService.updatedItems;
        /** @type {?} */
        const itemsToRemove = this.editService.deletedItems;
        /** @type {?} */
        const responses = [];
        /** @type {?} */
        let i = 0;
        // Add new
        for (i = 0; i < itemsToAdd.length; i++) {
            /** @type {?} */
            const settingCreate = {
                name: itemsToAdd[i].name,
                crypted: itemsToAdd[i].crypted,
                dynamic: itemsToAdd[i].dynamic,
                type: itemsToAdd[i].type,
                value: itemsToAdd[i].value
            };
            /** @type {?} */
            const response = this.settingsService.createSetting(this.selectedService.name, settingCreate);
            responses.push(response);
        }
        // Update existing
        for (i = 0; i < itemsToUpdate.length; i++) {
            /** @type {?} */
            const settingName = itemsToUpdate[i].name;
            /** @type {?} */
            const settingUpdate = {
                crypted: itemsToUpdate[i].crypted,
                dynamic: itemsToUpdate[i].dynamic,
                type: itemsToUpdate[i].type,
                value: itemsToUpdate[i].value
            };
            /** @type {?} */
            const response = this.settingsService.updateSetting(this.selectedService.name, settingName, settingUpdate);
            responses.push(response);
        }
        // Delete existing
        for (i = 0; i < itemsToRemove.length; i++) {
            /** @type {?} */
            const settingName = itemsToRemove[i].name;
            /** @type {?} */
            const response = this.settingsService.deleteSetting(this.selectedService.name, settingName);
            responses.push(response);
        }
        this.logger.debug(LOG_TAG, 'Waiting for all changes commit.');
        return forkJoin(responses);
    }
    /**
     * Button Event
     * @return {?}
     */
    onDiscardClicked() {
        if (this.editService.hasChanges()) {
            this.confirmationDialog.open('Pending Changes', 
            // tslint:disable-next-line:max-line-length
            'Attention, in the configuration there are unsaved changes. If you proceed all these changes will be lost.\n\nDo you want to continue?', { 'action': 'discardChanges' });
        }
        else {
            this.reloadConfigurationParams();
        }
    }
    /**
     * Button event
     * @return {?}
     */
    onExportClicked() {
        this.logger.debug(LOG_TAG, 'Export clicked');
        this.exportConfigurationFile();
    }
    /**
     * Button event
     * @return {?}
     */
    onImportClicked() {
        this.logger.debug(LOG_TAG, 'Import clicked:', this.xmlFileImportEl);
        // trigger mouse click
        /** @type {?} */
        const event = new MouseEvent('click', { bubbles: true });
        this.renderer.invokeElementMethod(this.xmlFileImportEl.nativeElement, 'dispatchEvent', [event]);
    }
    /**
     * Button event
     * @return {?}
     */
    onAddPropertyClicked() {
        // display new item dialog
        this.propertyEditorDialog.show();
    }
    /**
     * Event emitted by the confirmation dialog
     * @param {?} userData
     * @return {?}
     */
    onConfirmationCancel(userData) {
        this.logger.debug(LOG_TAG, 'onConfirmationCancel for:', userData);
    }
    /**
     * Event emitted by the confirmation dialog
     * @param {?} userData
     * @return {?}
     */
    onConfirmationOK(userData) {
        this.logger.debug(LOG_TAG, 'onConfirmationOK for:', userData);
        if (userData && userData.action === 'refresh') {
            this.reloadConfigurationParams();
        }
        if (userData && userData.action === 'discardChanges') {
            this.editService.cancelChanges();
        }
    }
    /**
     * Triggered by the new Property Editor Dialog
     * @param {?} newConfigurationRow
     * @return {?}
     */
    onEditCommit(newConfigurationRow) {
        this.logger.debug(LOG_TAG, 'onEditCommit new row:', newConfigurationRow);
        this.editService.create(newConfigurationRow);
    }
    /**
     * Enable or disable buttons
     * @private
     * @param {?} canSave
     * @param {?} canRefresh
     * @param {?} canAddProperty
     * @return {?}
     */
    setOptions(canSave, canRefresh, canAddProperty) {
        this.canRefresh = canRefresh;
        this._subHandler.add(forkJoin(this.motifACLService.can('com.vipera.osgi.core.config.service.api.rest.CfgApi:UPDATE:updateSetting'), this.motifACLService.can('com.vipera.osgi.core.config.service.api.rest.CfgApi:CREATE:createSetting'))
            .subscribe((/**
         * @param {?} canDoIt
         * @return {?}
         */
        (canDoIt) => {
            this.canSave = canSave && canDoIt[0];
            this.canAddProperty = canAddProperty && canDoIt[1];
        }), (/**
         * @param {?} error
         * @return {?}
         */
        error => {
            this.logger.error(LOG_TAG, 'cannot retrieve permissions: ', error);
        })));
    }
    /**
     * Triggered by the grid delete button
     * @param {?} dataItem
     * @return {?}
     */
    onDeleteOKPressed(dataItem) {
        this.logger.debug(LOG_TAG, 'onDeleteOKPressed for item: ', dataItem);
        this.editService.remove(dataItem);
    }
    /**
     * Triggered by the input tag
     * @param {?} event
     * @return {?}
     */
    onUploadFileSelected(event) {
        /** @type {?} */
        const reader = new FileReader();
        if (event.target.files && event.target.files.length > 0) {
            /** @type {?} */
            const file = event.target.files[0];
            reader.onloadend = (/**
             * @return {?}
             */
            () => {
                this.uploadConfiguration(reader.result);
            });
            reader.onerror = (/**
             * @param {?} error
             * @return {?}
             */
            (error) => {
                this.logger.error(LOG_TAG, 'onUploadFileSelected error: ', error);
                this.notificationCenter.post({
                    name: 'ReadingConfigurationError',
                    title: 'Configuration Upload',
                    message: 'Error reading configuration file:',
                    type: NotificationType.Error,
                    error: error,
                    closable: true
                });
            });
            reader.readAsText(file);
        }
    }
    /**
     * Upload the blob file to server
     * @param {?} blob
     * @return {?}
     */
    uploadConfiguration(blob) {
        this.notificationCenter.post({
            name: 'ConfigurationUpload',
            title: 'Configuration Upload',
            message: 'Uploading configuration...',
            type: NotificationType.Info
        });
        this._subHandler.add(this.configurationService.uploadXml(blob, false).subscribe((/**
         * @param {?} data
         * @return {?}
         */
        (data) => {
            this.logger.info(LOG_TAG, 'Import xml done:', data);
            this.notificationCenter.post({
                name: 'ConfigurationUploadSuccess',
                title: 'Configuration Upload',
                message: 'The configuration has been successfully uloaded.',
                type: NotificationType.Success
            });
            this.reloadConfigurationParams();
        }), (/**
         * @param {?} error
         * @return {?}
         */
        (error) => {
            this.logger.error(LOG_TAG, 'Import xml configuration error:', error);
            this.notificationCenter.post({
                name: 'ConfigurationUploadError',
                title: 'Configuration Upload',
                message: 'Error uploading configuration:',
                type: NotificationType.Error,
                error: error,
                closable: true
            });
        })));
    }
    /**
     * @param {?} dialogResult
     * @return {?}
     */
    onAddNewPropertyConfirmed(dialogResult) {
        /** @type {?} */
        const newConfigurationRow = new ConfigurationRow();
        newConfigurationRow.name = dialogResult.name;
        newConfigurationRow.crypted = dialogResult.encrypted;
        newConfigurationRow.isNew = true;
        newConfigurationRow.dynamic = dialogResult.dynamic;
        newConfigurationRow.type = dialogResult.type;
        newConfigurationRow.value = dialogResult.value;
        this.onEditCommit(newConfigurationRow);
    }
};
ConfigurationSectionComponent.decorators = [
    { type: Component, args: [{
                selector: 'wa-configuration-section',
                template: "<wc-loading-overlay [visible]='loading'></wc-loading-overlay>\n\n<wc-dashboard-header [title]=\"'Configuration'\"></wc-dashboard-header>\n\n<wc-confirmation-dialog (cancel)=\"onConfirmationCancel($event)\" (confirm)=\"onConfirmationOK($event)\"></wc-confirmation-dialog>\n\n<input type=\"file\" id=\"xmlFileImport\" name=\"xmlFileImport\"  accept=\"application/xml\" (input)=\"onUploadFileSelected($event)\" #xmlFileImport>\n\n<div class=\"row spread\">\n\n    <div class=\"flex-toolbar\" style=\"display:flex;align-items: center;\">\n       <div style=\"margin-right:10px;width:60%;max-width: 400px;min-width: 250px;\">\n            <label>Service</label>\n            <wc-services-selector-combobox [(ngModel)]=\"selectedService\"></wc-services-selector-combobox>\n        </div>\n        \n        <div>\n            <label>&nbsp;</label>\n            <kendo-buttongroup look=\"flat\">\n                <button kendoButton [toggleable]=\"false\" [icon]=\"'save'\" (click)=\"onSaveClicked()\" [disabled]=\"!editService.hasChanges() || !canSave\">Save</button>\n                <button kendoButton [toggleable]=\"false\" [icon]=\"'track-changes-reject'\" (click)=\"onDiscardClicked()\" [disabled]=\"!editService.hasChanges()\">Discard Changes</button>\n                <button kendoButton [toggleable]=\"false\" [icon]=\"'filter-add-expression'\" (click)=\"onAddPropertyClicked()\" [disabled]=\"!canAddProperty\">Add Property</button>\n            </kendo-buttongroup>\n        </div>\n    </div>\n\n    <div class=\"flex-cmd\">\n        <kendo-buttongroup look=\"flat\">\n            <button kendoButton \n                motif-acl=\"com.vipera.osgi.core.config.service.api.rest.CfgApi:READ:downloadXml\"\n                [toggleable]=\"false\" (click)=\"onExportClicked()\"><fa-icon [icon]=\"faDownload\"></fa-icon>Export</button>\n            <button kendoButton \n                motif-acl=\"com.vipera.osgi.core.config.service.api.rest.CfgApi:UPDATE:uploadXml\"\n                kendofileselect tyle=\"file\" [toggleable]=\"false\" (click)=\"onImportClicked()\"><fa-icon [icon]=\"faFileImport\"></fa-icon>Import</button>\n            <button kendoButton [toggleable]=\"false\" [icon]=\"'refresh'\" (click)=\"onRefreshClicked()\" [disabled]=\"!canRefresh\">Refresh</button>\n        </kendo-buttongroup>\n    </div>\n\n</div>\n\n<div class=\"row fill\">\n\n        <kendo-grid #datagrid [data]=\"view | async\" \n                (cellClick)=\"cellClickHandler($event)\"\n                (cellClose)=\"cellCloseHandler($event)\"\n                (dataStateChange)=\"onStateChange($event)\"\n                (cellClose)=\"cellCloseHandler($event)\"\n                [navigable]=\"true\"> \n\n                <kendo-grid-column\n                    field=\"name\" title=\"Name\" width=\"360\">\n                    <ng-template kendoGridCellTemplate let-dataItem>\n                        <label class=\"k-icon grid-cell-dirty grid-cell-dirty-{{dataItem.dirty}}\"></label>\n                        {{dataItem.name}}\n                    </ng-template>\n                </kendo-grid-column>\n\n                <kendo-grid-column field=\"value\" title=\"Value\" >\n                    <ng-template kendoGridEditTemplate let-dataItem=\"dataItem\" let-formGroup=\"formGroup\">\n                        <input *ngIf=\"dataItem.type==='java.lang.String'\" class=\"k-textbox\" [formControl]=\"formGroup.get('value')\">\n                        <kendo-numerictextbox *ngIf=\"dataItem.type==='java.lang.Short' || dataItem.type==='java.lang.Integer' || \n                            dataItem.type==='java.lang.Long' || dataItem.type==='java.lang.Float' || dataItem.type==='java.lang.Double'\" \n                            [format]=\"typesInfo[dataItem.type].format\" \n                            [decimals]=\"typesInfo[dataItem.type].decimals\" \n                            [value]=\"dataItem.value\" \n                            [formControl]=\"formGroup.get('value')\"></kendo-numerictextbox>\n                        <kendo-dropdownlist *ngIf=\"dataItem.type==='java.lang.Boolean'\" \n                            [data]=\"dropDownBooleanValues\"\n                            [formControl]=\"formGroup.get('value')\"></kendo-dropdownlist>\n                    </ng-template>\n                </kendo-grid-column>\n                <kendo-grid-column field=\"type\" title=\"Type\" width=\"150\">\n                </kendo-grid-column>\n                <kendo-grid-column\n                    media=\"(min-width: 80px)\"\n                    title=\"Dynamic\" width=\"80\">\n                    <ng-template kendoGridCellTemplate let-dataItem>\n                        <label class=\"k-icon grid-cell-checkbox grid-cell-checkbox-{{dataItem.dynamic}}\"></label>\n                    </ng-template>\n               </kendo-grid-column>\n\n               <kendo-grid-column\n                    media=\"(min-width: 80px)\"\n                    title=\"Crypted\" width=\"80\">\n                    <ng-template kendoGridCellTemplate let-dataItem>\n                        <label class=\"k-icon grid-cell-checkbox grid-cell-checkbox-{{dataItem.crypted}}\"></label>\n                    </ng-template>\n                </kendo-grid-column>\n\n                <kendo-grid-column title=\"\" width=\"150\" minResizableWidth=\"140\">\n                    <ng-template kendoGridCellTemplate let-dataItem let-columnIndex=\"columnIndex\" let-rowIndex=\"rowIndex\" let-column=\"column\">\n                            <wc-grid-editor-command\n                                motif-acl=\"com.vipera.osgi.core.config.service.api.rest.CfgApi:DELETE:deleteSetting\"\n                                motif-acl-hidden=\"true\"\n                                [alignMode]=\"'end'\"\n                                [hasConfirmation]=\"true\"\n                                [confirmationTitle]=\"'Delete ?'\"\n                                [rowIndex]=\"rowIndex\" \n                                [columnIndex]=\"columnIndex\" \n                                [column]=\"column\" \n                                [commandIcon]=\"'wa-ico-no'\"\n                                [dataItem]=\"dataItem\"\n                                (commandConfirm)=\"onDeleteOKPressed(dataItem)\"  \n                                >\n                            </wc-grid-editor-command>\n                    </ng-template>\n                </kendo-grid-column>\n\n            </kendo-grid>\n\n            <wa-configuration-section-new-config-param-dialog #newPropertyDialog (confirm)=\"onAddNewPropertyConfirmed($event)\"></wa-configuration-section-new-config-param-dialog>\n\n\n</div>\n",
                styles: [":host{display:flex;flex:1;flex-direction:column}:host ::ng-deep .grid-btn-editor.wc-table-delete-command{justify-content:center}"]
            }] }
];
/** @nocollapse */
ConfigurationSectionComponent.ctorParameters = () => [
    { type: NGXLogger },
    { type: MotifACLService },
    { type: SettingsService },
    { type: ConfigurationsService },
    { type: WCEditService },
    { type: FormBuilder },
    { type: Renderer },
    { type: WCNotificationCenter },
    { type: ElementRef }
];
ConfigurationSectionComponent.propDecorators = {
    confirmationDialog: [{ type: ViewChild, args: [ConfirmationDialogComponent,] }],
    servicesComboBox: [{ type: ViewChild, args: [ComboBoxComponent,] }],
    grid: [{ type: ViewChild, args: ['datagrid',] }],
    propertyEditorDialog: [{ type: ViewChild, args: ['newPropertyDialog',] }],
    xmlFileImportEl: [{ type: ViewChild, args: ['xmlFileImport',] }],
    selectedService: [{ type: Input }]
};
ConfigurationSectionComponent = tslib_1.__decorate([
    PluginView('Configuration', {
        iconName: 'wa-ico-configuration',
        userData: {
            acl: {
                permissions: ["com.vipera.osgi.core.config.service.api.rest.CfgApi:READ:getServices",
                    "com.vipera.osgi.core.config.service.api.rest.CfgApi:READ:getSettings"]
            }
        }
    }),
    tslib_1.__metadata("design:paramtypes", [NGXLogger,
        MotifACLService,
        SettingsService,
        ConfigurationsService,
        WCEditService,
        FormBuilder,
        Renderer,
        WCNotificationCenter,
        ElementRef])
], ConfigurationSectionComponent);
export { ConfigurationSectionComponent };
if (false) {
    /** @type {?} */
    ConfigurationSectionComponent.prototype.faFileImport;
    /** @type {?} */
    ConfigurationSectionComponent.prototype.faDownload;
    /** @type {?} */
    ConfigurationSectionComponent.prototype.typesInfo;
    /** @type {?} */
    ConfigurationSectionComponent.prototype.view;
    /** @type {?} */
    ConfigurationSectionComponent.prototype.gridState;
    /** @type {?} */
    ConfigurationSectionComponent.prototype.changes;
    /** @type {?} */
    ConfigurationSectionComponent.prototype.dropDownBooleanValues;
    /** @type {?} */
    ConfigurationSectionComponent.prototype.loading;
    /** @type {?} */
    ConfigurationSectionComponent.prototype.editDataItem;
    /** @type {?} */
    ConfigurationSectionComponent.prototype.confirmationDialog;
    /** @type {?} */
    ConfigurationSectionComponent.prototype.servicesComboBox;
    /** @type {?} */
    ConfigurationSectionComponent.prototype.grid;
    /** @type {?} */
    ConfigurationSectionComponent.prototype.propertyEditorDialog;
    /** @type {?} */
    ConfigurationSectionComponent.prototype.xmlFileImportEl;
    /** @type {?} */
    ConfigurationSectionComponent.prototype.canSave;
    /** @type {?} */
    ConfigurationSectionComponent.prototype.canRefresh;
    /** @type {?} */
    ConfigurationSectionComponent.prototype.canAddProperty;
    /**
     * @type {?}
     * @private
     */
    ConfigurationSectionComponent.prototype._selectedService;
    /**
     * @type {?}
     * @private
     */
    ConfigurationSectionComponent.prototype._editServiceConfig;
    /**
     * @type {?}
     * @private
     */
    ConfigurationSectionComponent.prototype._subHandler;
    /**
     * @type {?}
     * @private
     */
    ConfigurationSectionComponent.prototype.logger;
    /**
     * @type {?}
     * @private
     */
    ConfigurationSectionComponent.prototype.motifACLService;
    /**
     * @type {?}
     * @private
     */
    ConfigurationSectionComponent.prototype.settingsService;
    /**
     * @type {?}
     * @private
     */
    ConfigurationSectionComponent.prototype.configurationService;
    /** @type {?} */
    ConfigurationSectionComponent.prototype.editService;
    /**
     * @type {?}
     * @private
     */
    ConfigurationSectionComponent.prototype.formBuilder;
    /**
     * @type {?}
     * @private
     */
    ConfigurationSectionComponent.prototype.renderer;
    /**
     * @type {?}
     * @private
     */
    ConfigurationSectionComponent.prototype.notificationCenter;
    /**
     * @type {?}
     * @private
     */
    ConfigurationSectionComponent.prototype.elem;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi1zZWN0aW9uLWNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL21vdGlmLXdlYi1hZG1pbi1jb3JlLyIsInNvdXJjZXMiOlsibGliL3NlY3Rpb25zL0NvbmZpZ3VyYXRpb24vY29tcG9uZW50cy9jb25maWd1cmF0aW9uLXNlY3Rpb24tY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sc0VBQXNFLENBQUM7QUFDbkgsT0FBTyxFQUFFLFNBQVMsRUFBcUIsU0FBUyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JHLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsU0FBUyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxxQkFBcUIsRUFBZ0MsTUFBTSwwQ0FBMEMsQ0FBQztBQUNoSSxPQUFPLEVBQWdCLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3RFLE9BQU8sS0FBSyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxhQUFhLEVBQThCLE1BQU0sb0JBQW9CLENBQUM7QUFDL0UsT0FBTyxFQUFFLGFBQWEsRUFBa0IsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RSxPQUFPLEVBQVMsT0FBTyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxXQUFXLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVB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QkFDRCxXQUFXLEVBQUUsQ0FBQyxzRUFBc0U7b0JBQ3BFLHNFQUFzRSxDQUFDO2FBQzFGO1NBQ0o7S0FDRixDQUFDOzZDQXNDNEIsU0FBUztRQUNSLGVBQWU7UUFDZixlQUFlO1FBQ1YscUJBQXFCO1FBQy9CLGFBQWE7UUFDWixXQUFXO1FBQ2QsUUFBUTtRQUNFLG9CQUFvQjtRQUNsQyxVQUFVO0dBN0NuQiw2QkFBNkIsQ0FxZnpDO1NBcmZZLDZCQUE2Qjs7O0lBRXRDLHFEQUE0Qjs7SUFDNUIsbURBQXdCOztJQUN4QixrREFBMEI7O0lBRTFCLDZDQUF3Qzs7SUFDeEMsa0RBRUU7O0lBQ0YsZ0RBQXlCOztJQUV6Qiw4REFHRTs7SUFHRixnREFBdUI7O0lBQ3ZCLHFEQUFzQzs7SUFFdEMsMkRBQXdGOztJQUN4Rix5REFBa0U7O0lBQ2xFLDZDQUEyQzs7SUFDM0MsNkRBQTJGOztJQUMzRix3REFBd0Q7O0lBR3hELGdEQUF1Qjs7SUFDdkIsbURBQTBCOztJQUMxQix1REFBOEI7Ozs7O0lBRzlCLHlEQUF1Qzs7Ozs7SUFDdkMsMkRBQXVIOzs7OztJQUN2SCxvREFBeUU7Ozs7O0lBRTdELCtDQUF5Qjs7Ozs7SUFDakMsd0RBQXdDOzs7OztJQUN4Qyx3REFBd0M7Ozs7O0lBQ3hDLDZEQUFtRDs7SUFDbkQsb0RBQWlDOzs7OztJQUNqQyxvREFBZ0M7Ozs7O0lBQ2hDLGlEQUEwQjs7Ozs7SUFDMUIsMkRBQWdEOzs7OztJQUNoRCw2Q0FBd0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25maXJtYXRpb25EaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL0NvbmZpcm1hdGlvbkRpYWxvZy9jb25maXJtYXRpb24tZGlhbG9nLWNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95LCBWaWV3Q2hpbGQsIElucHV0LCBFbGVtZW50UmVmLCBSZW5kZXJlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUGx1Z2luVmlldyB9IGZyb20gJ3dlYi1jb25zb2xlLWNvcmUnO1xuaW1wb3J0IHsgTkdYTG9nZ2VyfSBmcm9tICd3ZWItY29uc29sZS1jb3JlJztcbmltcG9ydCB7IFNldHRpbmdzU2VydmljZSwgQ29uZmlndXJhdGlvbnNTZXJ2aWNlLCBTZXR0aW5nVXBkYXRlLCBTZXR0aW5nQ3JlYXRlIH0gZnJvbSAnQHdhLW1vdGlmLW9wZW4tYXBpL2NvbmZpZ3VyYXRpb24tc2VydmljZSc7XG5pbXBvcnQgeyBNb3RpZlNlcnZpY2UsIENvbmZpZ3VyYXRpb25Sb3cgfSBmcm9tICcuLi9kYXRhL21vZGVsJztcbmltcG9ydCB7IENvbWJvQm94Q29tcG9uZW50IH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZHJvcGRvd25zJztcbmltcG9ydCAqIGFzIEZpbGVTYXZlciBmcm9tICdmaWxlLXNhdmVyJztcbmltcG9ydCB7IFdDRWRpdFNlcnZpY2UsIFdDRWRpdFNlcnZpY2VDb25maWd1cmF0aW9uIH0gZnJvbSAnd2ViLWNvbnNvbGUtdWkta2l0JztcbmltcG9ydCB7IEdyaWRDb21wb25lbnQsIEdyaWREYXRhUmVzdWx0IH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZ3JpZCc7XG5pbXBvcnQgeyBTdGF0ZSwgcHJvY2VzcyB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1kYXRhLXF1ZXJ5JztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzL21hcCc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMvT2JzZXJ2YWJsZSc7XG5pbXBvcnQgeyBmb3JrSm9pbiB9IGZyb20gJ3J4anMvb2JzZXJ2YWJsZS9mb3JrSm9pbic7XG5pbXBvcnQgeyBmYUZpbGVJbXBvcnQsIGZhRG93bmxvYWQgfSBmcm9tICdAZm9ydGF3ZXNvbWUvZnJlZS1zb2xpZC1zdmctaWNvbnMnO1xuaW1wb3J0IHsgV0NOb3RpZmljYXRpb25DZW50ZXIsIE5vdGlmaWNhdGlvblR5cGUgfSBmcm9tICd3ZWItY29uc29sZS11aS1raXQnO1xuaW1wb3J0IHsgTmV3Q29uZmlndXJhdGlvblBhcmFtRGlhbG9nQ29tcG9uZW50LCBOZXdQYXJhbURpYWxvZ1Jlc3VsdCB9IGZyb20gJy4vZGlhbG9nL25ldy1jb25maWd1cmF0aW9uLXBhcmFtLWRpYWxvZyc7XG5pbXBvcnQgeyBXQ1N1YnNjcmlwdGlvbkhhbmRsZXIgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL0NvbW1vbnMvd2Mtc3Vic2NyaXB0aW9uLWhhbmRsZXInO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZGF0YVR5cGVzSW5mbyB9IGZyb20gJy4vc2hhcmVkL3NoYXJlZCc7XG5pbXBvcnQgeyBNb3RpZkFDTFNlcnZpY2UgfSBmcm9tICd3ZWItY29uc29sZS1tb3RpZi1hY2wnO1xuXG5jb25zdCBMT0dfVEFHID0gJ1tDb25maWd1cmF0aW9uU2VjdGlvbl0nO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3dhLWNvbmZpZ3VyYXRpb24tc2VjdGlvbicsXG4gICAgc3R5bGVVcmxzOiBbICcuL2NvbmZpZ3VyYXRpb24tc2VjdGlvbi5jb21wb25lbnQuc2NzcycgXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vY29uZmlndXJhdGlvbi1zZWN0aW9uLmNvbXBvbmVudC5odG1sJ1xuICB9KVxuICBAUGx1Z2luVmlldygnQ29uZmlndXJhdGlvbicsIHtcbiAgICBpY29uTmFtZTogJ3dhLWljby1jb25maWd1cmF0aW9uJyxcbiAgICB1c2VyRGF0YToge1xuICAgICAgICBhY2w6IHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiBbXCJjb20udmlwZXJhLm9zZ2kuY29yZS5jb25maWcuc2VydmljZS5hcGkucmVzdC5DZmdBcGk6UkVBRDpnZXRTZXJ2aWNlc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29tLnZpcGVyYS5vc2dpLmNvcmUuY29uZmlnLnNlcnZpY2UuYXBpLnJlc3QuQ2ZnQXBpOlJFQUQ6Z2V0U2V0dGluZ3NcIl1cbiAgICAgICAgfVxuICAgIH1cbiAgfSlcbmV4cG9ydCBjbGFzcyBDb25maWd1cmF0aW9uU2VjdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAgIGZhRmlsZUltcG9ydCA9IGZhRmlsZUltcG9ydDtcbiAgICBmYURvd25sb2FkID0gZmFEb3dubG9hZDtcbiAgICB0eXBlc0luZm8gPSBkYXRhVHlwZXNJbmZvO1xuXG4gICAgcHVibGljIHZpZXc6IE9ic2VydmFibGU8R3JpZERhdGFSZXN1bHQ+O1xuICAgIHB1YmxpYyBncmlkU3RhdGU6IFN0YXRlID0ge1xuICAgICAgICBzb3J0OiBbXVxuICAgIH07XG4gICAgcHVibGljIGNoYW5nZXM6IGFueSA9IHt9O1xuXG4gICAgcHVibGljIGRyb3BEb3duQm9vbGVhblZhbHVlczogQXJyYXk8c3RyaW5nPiA9IFtcbiAgICAgICAgJ3RydWUnLFxuICAgICAgICAnZmFsc2UnXG4gICAgXTtcblxuICAgIC8vIERhdGEgYmluZGluZ1xuICAgIHB1YmxpYyBsb2FkaW5nID0gZmFsc2U7XG4gICAgcHVibGljIGVkaXREYXRhSXRlbTogQ29uZmlndXJhdGlvblJvdztcblxuICAgIEBWaWV3Q2hpbGQoQ29uZmlybWF0aW9uRGlhbG9nQ29tcG9uZW50KSBjb25maXJtYXRpb25EaWFsb2c6IENvbmZpcm1hdGlvbkRpYWxvZ0NvbXBvbmVudDtcbiAgICBAVmlld0NoaWxkKENvbWJvQm94Q29tcG9uZW50KSBzZXJ2aWNlc0NvbWJvQm94OiBDb21ib0JveENvbXBvbmVudDtcbiAgICBAVmlld0NoaWxkKCdkYXRhZ3JpZCcpIGdyaWQ6IEdyaWRDb21wb25lbnQ7XG4gICAgQFZpZXdDaGlsZCgnbmV3UHJvcGVydHlEaWFsb2cnKSBwcm9wZXJ0eUVkaXRvckRpYWxvZzogTmV3Q29uZmlndXJhdGlvblBhcmFtRGlhbG9nQ29tcG9uZW50O1xuICAgIEBWaWV3Q2hpbGQoJ3htbEZpbGVJbXBvcnQnKSB4bWxGaWxlSW1wb3J0RWw6IEVsZW1lbnRSZWY7XG5cbiAgICAvLyBCdXR0b25zXG4gICAgcHVibGljIGNhblNhdmUgPSBmYWxzZTtcbiAgICBwdWJsaWMgY2FuUmVmcmVzaCA9IGZhbHNlO1xuICAgIHB1YmxpYyBjYW5BZGRQcm9wZXJ0eSA9IGZhbHNlO1xuXG4gICAgLy8gaW50ZXJuYWxcbiAgICBwcml2YXRlIF9zZWxlY3RlZFNlcnZpY2U6IE1vdGlmU2VydmljZTsgLy8gdGhlIGNvbWJvYm94IHNlbGVjdGlvblxuICAgIHByaXZhdGUgX2VkaXRTZXJ2aWNlQ29uZmlnOiBXQ0VkaXRTZXJ2aWNlQ29uZmlndXJhdGlvbiA9IHsgaWRGaWVsZDogJ25hbWUnICwgZGlydHlGaWVsZDogJ2RpcnR5JywgaXNOZXdGaWVsZDogJ2lzTmV3J307XG4gICAgcHJpdmF0ZSBfc3ViSGFuZGxlcjogV0NTdWJzY3JpcHRpb25IYW5kbGVyID0gbmV3IFdDU3Vic2NyaXB0aW9uSGFuZGxlcigpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBsb2dnZXI6IE5HWExvZ2dlcixcbiAgICAgICAgcHJpdmF0ZSBtb3RpZkFDTFNlcnZpY2U6IE1vdGlmQUNMU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBzZXR0aW5nc1NlcnZpY2U6IFNldHRpbmdzU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjb25maWd1cmF0aW9uU2VydmljZTogQ29uZmlndXJhdGlvbnNTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgZWRpdFNlcnZpY2U6IFdDRWRpdFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcixcbiAgICAgICAgcHJpdmF0ZSBub3RpZmljYXRpb25DZW50ZXI6IFdDTm90aWZpY2F0aW9uQ2VudGVyLFxuICAgICAgICBwcml2YXRlIGVsZW06IEVsZW1lbnRSZWYpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdFNlcnZpY2UuaW5pdCgpO1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRyAsICdPcGVuaW5nLi4uJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW5ndWxhciBuZ09uSW5pdFxuICAgICAqL1xuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHICwgJ0luaXRpYWxpemluZy4uLicpO1xuICAgICAgICB0aGlzLnZpZXcgPSB0aGlzLmVkaXRTZXJ2aWNlLnBpcGUobWFwKGRhdGEgPT4gcHJvY2VzcyhkYXRhLCB0aGlzLmdyaWRTdGF0ZSkpKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRyAsICduZ09uRGVzdHJveSAnKTtcbiAgICAgICAgdGhpcy5mcmVlTWVtKCk7XG4gICAgfVxuXG4gICAgZnJlZU1lbSgpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gbnVsbDtcbiAgICAgICAgdGhpcy5lZGl0RGF0YUl0ZW0gPSBudWxsO1xuICAgICAgICB0aGlzLl9zZWxlY3RlZFNlcnZpY2UgPSBudWxsO1xuICAgICAgICB0aGlzLl9lZGl0U2VydmljZUNvbmZpZyA9IG51bGw7XG4gICAgICAgIHRoaXMuX3N1YkhhbmRsZXIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5fc3ViSGFuZGxlciA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIGJ5IHRoZSBncmlkIGNvbXBvbmVudFxuICAgICAqIEBwYXJhbSBzdGF0ZVxuICAgICAqL1xuICAgIHB1YmxpYyBvblN0YXRlQ2hhbmdlKHN0YXRlOiBTdGF0ZSkge1xuICAgICAgICB0aGlzLmdyaWRTdGF0ZSA9IHN0YXRlO1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHICwgJ29uU3RhdGVDaGFuZ2U6ICcsIHN0YXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWxvYWQgdGhlIGxpc3Qgb2YgcGFyYW1ldGVycyBmb3IgYSBnaXZlbiBzZXJ2aWNlXG4gICAgICogQHBhcmFtIHNlcnZpY2VcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbG9hZENvbmZpZ3VyYXRpb25QYXJhbXNGb3JTZXJ2aWNlKHNlcnZpY2U6IE1vdGlmU2VydmljZSkge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHLCAnUmVsb2FkaW5nIHBhcmFtdGVycyBmb3Igc2VydmljZTonLCBzZXJ2aWNlKTtcbiAgICAgICAgaWYgKHNlcnZpY2UpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9zdWJIYW5kbGVyLmFkZCh0aGlzLnNldHRpbmdzU2VydmljZS5nZXRTZXR0aW5ncyhzZXJ2aWNlLm5hbWUpLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcgLCAncmVsb2FkQ29uZmlndXJhdGlvblBhcmFtc0ZvclNlcnZpY2UgZG9uZTogJywgZGF0YSk7XG4gICAgICAgICAgICAgICAgXy5mb3JFYWNoKGRhdGEsIGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGl0ZW0udHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnamF2YS5sYW5nLlNob3J0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2phdmEubGFuZy5JbnRlZ2VyJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2phdmEubGFuZy5Mb25nJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2phdmEubGFuZy5Eb3VibGUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnamF2YS5sYW5nLkZsb2F0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnZhbHVlID0gTnVtYmVyKGl0ZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZWRpdFNlcnZpY2UuY2FuY2VsQ2hhbmdlcygpO1xuICAgICAgICAgICAgICAgIHRoaXMuZWRpdFNlcnZpY2UucmVhZChkYXRhLCB0aGlzLl9lZGl0U2VydmljZUNvbmZpZyk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihMT0dfVEFHICwgJ3JlbG9hZENvbmZpZ3VyYXRpb25QYXJhbXNGb3JTZXJ2aWNlIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbkNlbnRlci5wb3N0KHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0xvYWRDb25maWd1cmF0aW9uRXJyb3InLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ0xvYWQgQ29uZmlndXJhdGlvbicsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdFcnJvciBsb2FkaW5nIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3M6JyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogTm90aWZpY2F0aW9uVHlwZS5FcnJvcixcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yLFxuICAgICAgICAgICAgICAgICAgICBjbG9zYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVkaXRTZXJ2aWNlLnJlYWQoW10sIHRoaXMuX2VkaXRTZXJ2aWNlQ29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldE9wdGlvbnModHJ1ZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlciBzZWxlY3Rpb24gZnJvbSBDb21ib2JveFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBzZWxlY3RlZFNlcnZpY2Uoc2VydmljZTogTW90aWZTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkU2VydmljZSA9IHNlcnZpY2U7XG4gICAgICAgIHRoaXMucmVsb2FkQ29uZmlndXJhdGlvblBhcmFtcygpO1xuICAgICAgICBpZiAoc2VydmljZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRPcHRpb25zKHRydWUsIHRydWUsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRPcHRpb25zKGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzZWxlY3RlZFNlcnZpY2UoKTogTW90aWZTZXJ2aWNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkU2VydmljZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWxvYWQgY3VycmVudCBjb25maWd1cmF0aW9uIGZvciB0aGUgY3VycmVudCBzZWxlY3RlZCBzZXJ2aWNlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWxvYWRDb25maWd1cmF0aW9uUGFyYW1zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWxvYWRDb25maWd1cmF0aW9uUGFyYW1zRm9yU2VydmljZSh0aGlzLl9zZWxlY3RlZFNlcnZpY2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZXIgc2VsZWN0aW9uIG9uIGNsaWNrXG4gICAgICogdHJpZ2dlcmVkIGJ5IHRoZSBncmlkXG4gICAgICogQHBhcmFtIHBhcmFtMFxuICAgICAqL1xuICAgIHB1YmxpYyBjZWxsQ2xpY2tIYW5kbGVyKHsgc2VuZGVyLCByb3dJbmRleCwgY29sdW1uSW5kZXgsIGRhdGFJdGVtLCBpc0VkaXRlZCB9KTogdm9pZCB7XG4gICAgICAgIGlmICghaXNFZGl0ZWQpIHtcbiAgICAgICAgICAgIHNlbmRlci5lZGl0Q2VsbChyb3dJbmRleCwgY29sdW1uSW5kZXgsIHRoaXMuY3JlYXRlRm9ybUdyb3VwRm9yRWRpdChkYXRhSXRlbSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdHJpZ2dlcmVkIGJ5IHRoZSBncmlkXG4gICAgICovXG4gICAgcHVibGljIGNlbGxDbG9zZUhhbmRsZXIoYXJnczogYW55KSB7XG4gICAgICAgIGNvbnN0IHsgZm9ybUdyb3VwLCBkYXRhSXRlbSB9ID0gYXJncztcbiAgICAgICAgaWYgKCFmb3JtR3JvdXAudmFsaWQpIHtcbiAgICAgICAgICAgICAvLyBwcmV2ZW50IGNsb3NpbmcgdGhlIGVkaXRlZCBjZWxsIGlmIHRoZXJlIGFyZSBpbnZhbGlkIHZhbHVlcy5cbiAgICAgICAgICAgIGFyZ3MucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3JtR3JvdXAuZGlydHkpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdFNlcnZpY2UuYXNzaWduVmFsdWVzKGRhdGFJdGVtLCBmb3JtR3JvdXAudmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5lZGl0U2VydmljZS51cGRhdGUoZGF0YUl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJlcGFyZSBlZGl0IGZvcm0gZm9yIGlubGluZSBlZGl0aW5nXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZUZvcm1Hcm91cEZvckVkaXQoZGF0YUl0ZW06IENvbmZpZ3VyYXRpb25Sb3cpOiBGb3JtR3JvdXAge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHLCAnY3JlYXRlRm9ybUdyb3VwRm9yRWRpdDonLCBkYXRhSXRlbS52YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgICAgICAgICd2YWx1ZSc6IGRhdGFJdGVtLnZhbHVlXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4cG9ydCBjdXJyZW50IGNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBwcml2YXRlIGV4cG9ydENvbmZpZ3VyYXRpb25GaWxlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zdWJIYW5kbGVyLmFkZCh0aGlzLmNvbmZpZ3VyYXRpb25TZXJ2aWNlLmRvd25sb2FkWG1sKCkuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHICwgJ0V4cG9ydCBkb25lOicsIGRhdGEpO1xuXG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9ICdtb3RpZl9jb25maWd1cmF0aW9uXycgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKSArICcueG1sJztcbiAgICAgICAgICAgIEZpbGVTYXZlci5zYXZlQXMoZGF0YSwgZmlsZU5hbWUpO1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRyAsICdDb25maWd1cmF0aW9uIHNhdmVkOiAnLCBmaWxlTmFtZSk7XG5cbiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uQ2VudGVyLnBvc3Qoe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdDb25maWd1cmF0aW9uRXhwb3J0U3VjY2VzcycsXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdDb25maWd1cmF0aW9uIEV4cG9ydCcsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ1RoZSBjb25maWd1cmF0aW9uIGhhcyBiZWVuIGV4cG9ydGVkIHN1Y2Nlc3NmdWxseS4nLFxuICAgICAgICAgICAgICAgIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUuU3VjY2Vzc1xuICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKExPR19UQUcgLCAnRXhwb3J0IGVycm9yOicsIGVycm9yKTtcblxuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25DZW50ZXIucG9zdCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0NvbmZpZ3VyYXRpb25FeHBvcnRFcnJvcicsXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdFeHBvcnQgQ29uZmlndXJhdGlvbicsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ0Vycm9yIGV4cG9ydGluZyBjb25maWd1cmF0aW9uOicsXG4gICAgICAgICAgICAgICAgdHlwZTogTm90aWZpY2F0aW9uVHlwZS5FcnJvcixcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IsXG4gICAgICAgICAgICAgICAgY2xvc2FibGU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXZlbnQgZW1pdHRlZCBieSB0aGUgZWRpdG9yIGZvcm1cbiAgICAgKi9cbiAgICBvbkVkaXRDYW5jZWwoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcgLCAnT24gRWRpdCBDYW5jZWxsZWQnKTtcbiAgICAgICAgdGhpcy5lZGl0RGF0YUl0ZW0gPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnV0dG9uIGV2ZW50XG4gICAgICovXG4gICAgb25SZWZyZXNoQ2xpY2tlZCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZWRpdFNlcnZpY2UuaGFzQ2hhbmdlcygpKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpcm1hdGlvbkRpYWxvZy5vcGVuKCdQZW5kaW5nIENoYW5nZXMnLFxuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgICAgICAgICAgICAnQXR0ZW50aW9uLCBpbiB0aGUgY29uZmlndXJhdGlvbiB0aGVyZSBhcmUgdW5zYXZlZCBjaGFuZ2VzLiBQcm9jZWVkaW5nIHdpdGggdGhlIHJlZnJlc2ggdGhlc2UgY2hhbmdlcyB3aWxsIGJlIGxvc3QuIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlPycsXG4gICAgICAgICAgICAgICAgeyAnYWN0aW9uJyA6ICdyZWZyZXNoJyB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVsb2FkQ29uZmlndXJhdGlvblBhcmFtcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnV0dG9uIGV2ZW50XG4gICAgICovXG4gICAgb25TYXZlQ2xpY2tlZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRyAsICdTYXZlIGNsaWNrZWQnKTtcbiAgICAgICAgdGhpcy5fc3ViSGFuZGxlci5hZGQodGhpcy5zYXZlQWxsQ2hhbmdlcygpLnN1YnNjcmliZSgocmVzcG9uc2VzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbG9hZENvbmZpZ3VyYXRpb25QYXJhbXMoKTtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcsICdTZXR0aW5ncyBzYXZlZCBzdWNjZXNzZnVsbHk6ICcsIHJlc3BvbnNlcyk7XG5cbiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uQ2VudGVyLnBvc3Qoe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdTZXR0aW5nc1NhdmVTdWNjZXNzJyxcbiAgICAgICAgICAgICAgICB0aXRsZTogJ1NldHRpbmdzIFNhdmUnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdUaGUgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBoYXZlIGJlZW4gc2F2ZWQgY29ycmVjdGx5JyxcbiAgICAgICAgICAgICAgICB0eXBlOiBOb3RpZmljYXRpb25UeXBlLlN1Y2Nlc3NcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRyAsICdFcnJvciBzYXZpbmcgc2V0dGluZ3M6ICcsIGVycm9yKTtcblxuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25DZW50ZXIucG9zdCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1NldHRpbmdzU2F2ZUVycm9yJyxcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0NvbmZpZ3VyYXRpb24gU2F2ZScsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ0Vycm9yIHNhdmluZyBjb25maWd1cmF0aW9uIHNldHRpbmdzOicsXG4gICAgICAgICAgICAgICAgdHlwZTogTm90aWZpY2F0aW9uVHlwZS5FcnJvcixcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IsXG4gICAgICAgICAgICAgICAgY2xvc2FibGU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTYXZlIGFsbCBwZW5kaW5nIGNoZW5nZXMgcmVtb3RlbHlcbiAgICAgKi9cbiAgICBwcml2YXRlIHNhdmVBbGxDaGFuZ2VzKCk6IE9ic2VydmFibGU8YW55W10+IHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRywgJ1NhdmluZyBhbGwgY2hhbmdlcy4uLicpO1xuXG4gICAgICAgIGNvbnN0IGl0ZW1zVG9BZGQgPSB0aGlzLmVkaXRTZXJ2aWNlLmNyZWF0ZWRJdGVtcztcbiAgICAgICAgY29uc3QgaXRlbXNUb1VwZGF0ZSA9IHRoaXMuZWRpdFNlcnZpY2UudXBkYXRlZEl0ZW1zO1xuICAgICAgICBjb25zdCBpdGVtc1RvUmVtb3ZlID0gdGhpcy5lZGl0U2VydmljZS5kZWxldGVkSXRlbXM7XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2VzID0gW107XG5cbiAgICAgICAgbGV0IGkgPSAwO1xuXG4gICAgICAgIC8vIEFkZCBuZXdcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zVG9BZGQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmdDcmVhdGU6IFNldHRpbmdDcmVhdGUgPSB7XG4gICAgICAgICAgICAgICAgbmFtZSA6IGl0ZW1zVG9BZGRbaV0ubmFtZSxcbiAgICAgICAgICAgICAgICBjcnlwdGVkIDogaXRlbXNUb0FkZFtpXS5jcnlwdGVkLFxuICAgICAgICAgICAgICAgIGR5bmFtaWMgOiBpdGVtc1RvQWRkW2ldLmR5bmFtaWMsXG4gICAgICAgICAgICAgICAgdHlwZSA6IGl0ZW1zVG9BZGRbaV0udHlwZSxcbiAgICAgICAgICAgICAgICB2YWx1ZSA6IGl0ZW1zVG9BZGRbaV0udmFsdWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHRoaXMuc2V0dGluZ3NTZXJ2aWNlLmNyZWF0ZVNldHRpbmcodGhpcy5zZWxlY3RlZFNlcnZpY2UubmFtZSwgc2V0dGluZ0NyZWF0ZSk7XG4gICAgICAgICAgICByZXNwb25zZXMucHVzaChyZXNwb25zZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgZXhpc3RpbmdcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zVG9VcGRhdGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmdOYW1lID0gaXRlbXNUb1VwZGF0ZVtpXS5uYW1lO1xuICAgICAgICAgICAgY29uc3Qgc2V0dGluZ1VwZGF0ZTogU2V0dGluZ1VwZGF0ZSA9IHtcbiAgICAgICAgICAgICAgICBjcnlwdGVkIDogaXRlbXNUb1VwZGF0ZVtpXS5jcnlwdGVkLFxuICAgICAgICAgICAgICAgIGR5bmFtaWMgOiBpdGVtc1RvVXBkYXRlW2ldLmR5bmFtaWMsXG4gICAgICAgICAgICAgICAgdHlwZSA6IGl0ZW1zVG9VcGRhdGVbaV0udHlwZSxcbiAgICAgICAgICAgICAgICB2YWx1ZSA6IGl0ZW1zVG9VcGRhdGVbaV0udmFsdWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHRoaXMuc2V0dGluZ3NTZXJ2aWNlLnVwZGF0ZVNldHRpbmcodGhpcy5zZWxlY3RlZFNlcnZpY2UubmFtZSwgc2V0dGluZ05hbWUsIHNldHRpbmdVcGRhdGUpO1xuICAgICAgICAgICAgcmVzcG9uc2VzLnB1c2gocmVzcG9uc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVsZXRlIGV4aXN0aW5nXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtc1RvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzZXR0aW5nTmFtZSA9IGl0ZW1zVG9SZW1vdmVbaV0ubmFtZTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gdGhpcy5zZXR0aW5nc1NlcnZpY2UuZGVsZXRlU2V0dGluZyh0aGlzLnNlbGVjdGVkU2VydmljZS5uYW1lLCBzZXR0aW5nTmFtZSk7XG4gICAgICAgICAgICByZXNwb25zZXMucHVzaChyZXNwb25zZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHLCAnV2FpdGluZyBmb3IgYWxsIGNoYW5nZXMgY29tbWl0LicpO1xuICAgICAgICByZXR1cm4gZm9ya0pvaW4ocmVzcG9uc2VzKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEJ1dHRvbiBFdmVudFxuICAgICAqL1xuICAgIG9uRGlzY2FyZENsaWNrZWQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmVkaXRTZXJ2aWNlLmhhc0NoYW5nZXMoKSkge1xuICAgICAgICAgICAgdGhpcy5jb25maXJtYXRpb25EaWFsb2cub3BlbignUGVuZGluZyBDaGFuZ2VzJyxcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgICAgICAgICAgJ0F0dGVudGlvbiwgaW4gdGhlIGNvbmZpZ3VyYXRpb24gdGhlcmUgYXJlIHVuc2F2ZWQgY2hhbmdlcy4gSWYgeW91IHByb2NlZWQgYWxsIHRoZXNlIGNoYW5nZXMgd2lsbCBiZSBsb3N0LlxcblxcbkRvIHlvdSB3YW50IHRvIGNvbnRpbnVlPycsXG4gICAgICAgICAgICAgICAgeyAnYWN0aW9uJyA6ICdkaXNjYXJkQ2hhbmdlcycgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlbG9hZENvbmZpZ3VyYXRpb25QYXJhbXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1dHRvbiBldmVudFxuICAgICAqL1xuICAgIG9uRXhwb3J0Q2xpY2tlZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRyAsICdFeHBvcnQgY2xpY2tlZCcpO1xuICAgICAgICB0aGlzLmV4cG9ydENvbmZpZ3VyYXRpb25GaWxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnV0dG9uIGV2ZW50XG4gICAgICovXG4gICAgb25JbXBvcnRDbGlja2VkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHICwgJ0ltcG9ydCBjbGlja2VkOicsIHRoaXMueG1sRmlsZUltcG9ydEVsKTtcbiAgICAgICAgLy8gdHJpZ2dlciBtb3VzZSBjbGlja1xuICAgICAgICBjb25zdCBldmVudCA9IG5ldyBNb3VzZUV2ZW50KCdjbGljaycsIHtidWJibGVzOiB0cnVlfSk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuaW52b2tlRWxlbWVudE1ldGhvZChcbiAgICAgICAgdGhpcy54bWxGaWxlSW1wb3J0RWwubmF0aXZlRWxlbWVudCwgJ2Rpc3BhdGNoRXZlbnQnLCBbZXZlbnRdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCdXR0b24gZXZlbnRcbiAgICAgKi9cbiAgICBvbkFkZFByb3BlcnR5Q2xpY2tlZCgpOiB2b2lkIHtcbiAgICAgICAgLy8gZGlzcGxheSBuZXcgaXRlbSBkaWFsb2dcbiAgICAgICAgdGhpcy5wcm9wZXJ0eUVkaXRvckRpYWxvZy5zaG93KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXZlbnQgZW1pdHRlZCBieSB0aGUgY29uZmlybWF0aW9uIGRpYWxvZ1xuICAgICAqIEBwYXJhbSB1c2VyRGF0YVxuICAgICAqL1xuICAgIG9uQ29uZmlybWF0aW9uQ2FuY2VsKHVzZXJEYXRhKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcgLCAnb25Db25maXJtYXRpb25DYW5jZWwgZm9yOicsIHVzZXJEYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBlbWl0dGVkIGJ5IHRoZSBjb25maXJtYXRpb24gZGlhbG9nXG4gICAgICogQHBhcmFtIHVzZXJEYXRhXG4gICAgICovXG4gICAgb25Db25maXJtYXRpb25PSyh1c2VyRGF0YSk6IHZvaWQge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHICwgJ29uQ29uZmlybWF0aW9uT0sgZm9yOicsIHVzZXJEYXRhKTtcblxuICAgICAgICBpZiAodXNlckRhdGEgJiYgdXNlckRhdGEuYWN0aW9uID09PSAncmVmcmVzaCcpIHtcbiAgICAgICAgICAgIHRoaXMucmVsb2FkQ29uZmlndXJhdGlvblBhcmFtcygpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1c2VyRGF0YSAmJiB1c2VyRGF0YS5hY3Rpb24gPT09ICdkaXNjYXJkQ2hhbmdlcycpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdFNlcnZpY2UuY2FuY2VsQ2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIGJ5IHRoZSBuZXcgUHJvcGVydHkgRWRpdG9yIERpYWxvZ1xuICAgICAqIEBwYXJhbSBldmVudFxuICAgICAqL1xuICAgIG9uRWRpdENvbW1pdChuZXdDb25maWd1cmF0aW9uUm93OiBDb25maWd1cmF0aW9uUm93KTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcgLCAnb25FZGl0Q29tbWl0IG5ldyByb3c6JywgbmV3Q29uZmlndXJhdGlvblJvdyk7XG4gICAgICAgIHRoaXMuZWRpdFNlcnZpY2UuY3JlYXRlKG5ld0NvbmZpZ3VyYXRpb25Sb3cpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZSBvciBkaXNhYmxlIGJ1dHRvbnNcbiAgICAgKi9cbiAgICBwcml2YXRlIHNldE9wdGlvbnMoY2FuU2F2ZTogYm9vbGVhbiwgY2FuUmVmcmVzaDogYm9vbGVhbiwgY2FuQWRkUHJvcGVydHk6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jYW5SZWZyZXNoID0gY2FuUmVmcmVzaDtcblxuICAgICAgICB0aGlzLl9zdWJIYW5kbGVyLmFkZChmb3JrSm9pbih0aGlzLm1vdGlmQUNMU2VydmljZS5jYW4oJ2NvbS52aXBlcmEub3NnaS5jb3JlLmNvbmZpZy5zZXJ2aWNlLmFwaS5yZXN0LkNmZ0FwaTpVUERBVEU6dXBkYXRlU2V0dGluZycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3RpZkFDTFNlcnZpY2UuY2FuKCdjb20udmlwZXJhLm9zZ2kuY29yZS5jb25maWcuc2VydmljZS5hcGkucmVzdC5DZmdBcGk6Q1JFQVRFOmNyZWF0ZVNldHRpbmcnKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGNhbkRvSXQ6IEFycmF5PGJvb2xlYW4+KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNhblNhdmUgPSBjYW5TYXZlICYmIGNhbkRvSXRbMF07XG4gICAgICAgICAgICB0aGlzLmNhbkFkZFByb3BlcnR5ID0gY2FuQWRkUHJvcGVydHkgJiYgY2FuRG9JdFsxXTtcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoTE9HX1RBRyAsICdjYW5ub3QgcmV0cmlldmUgcGVybWlzc2lvbnM6ICcsIGVycm9yKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCBieSB0aGUgZ3JpZCBkZWxldGUgYnV0dG9uXG4gICAgICogQHBhcmFtIGRhdGFJdGVtXG4gICAgICovXG4gICAgb25EZWxldGVPS1ByZXNzZWQoZGF0YUl0ZW06IENvbmZpZ3VyYXRpb25Sb3cpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRyAsICdvbkRlbGV0ZU9LUHJlc3NlZCBmb3IgaXRlbTogJywgZGF0YUl0ZW0pO1xuICAgICAgICB0aGlzLmVkaXRTZXJ2aWNlLnJlbW92ZShkYXRhSXRlbSk7XG4gICAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCBieSB0aGUgaW5wdXQgdGFnXG4gICAgICogQHBhcmFtIGV2ZW50XG4gICAgICovXG4gICAgb25VcGxvYWRGaWxlU2VsZWN0ZWQoZXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldC5maWxlcyAmJiBldmVudC50YXJnZXQuZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNbMF07XG4gICAgICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy51cGxvYWRDb25maWd1cmF0aW9uKHJlYWRlci5yZXN1bHQpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKExPR19UQUcgLCAnb25VcGxvYWRGaWxlU2VsZWN0ZWQgZXJyb3I6ICcsIGVycm9yKTtcblxuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25DZW50ZXIucG9zdCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1JlYWRpbmdDb25maWd1cmF0aW9uRXJyb3InLFxuICAgICAgICAgICAgICAgIHRpdGxlOiAnQ29uZmlndXJhdGlvbiBVcGxvYWQnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdFcnJvciByZWFkaW5nIGNvbmZpZ3VyYXRpb24gZmlsZTonLFxuICAgICAgICAgICAgICAgIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUuRXJyb3IsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yLFxuICAgICAgICAgICAgICAgIGNsb3NhYmxlOiB0cnVlXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIH07XG4gICAgICAgICAgcmVhZGVyLnJlYWRBc1RleHQoZmlsZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGxvYWQgdGhlIGJsb2IgZmlsZSB0byBzZXJ2ZXJcbiAgICAgKiBAcGFyYW0gYmxvYlxuICAgICAqL1xuICAgIHVwbG9hZENvbmZpZ3VyYXRpb24oYmxvYik6IHZvaWQge1xuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbkNlbnRlci5wb3N0KHtcbiAgICAgICAgICAgIG5hbWU6ICdDb25maWd1cmF0aW9uVXBsb2FkJyxcbiAgICAgICAgICAgIHRpdGxlOiAnQ29uZmlndXJhdGlvbiBVcGxvYWQnLFxuICAgICAgICAgICAgbWVzc2FnZTogJ1VwbG9hZGluZyBjb25maWd1cmF0aW9uLi4uJyxcbiAgICAgICAgICAgIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUuSW5mb1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9zdWJIYW5kbGVyLmFkZCh0aGlzLmNvbmZpZ3VyYXRpb25TZXJ2aWNlLnVwbG9hZFhtbChibG9iLCBmYWxzZSkuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKExPR19UQUcgLCAnSW1wb3J0IHhtbCBkb25lOicsIGRhdGEpO1xuXG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbkNlbnRlci5wb3N0KHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQ29uZmlndXJhdGlvblVwbG9hZFN1Y2Nlc3MnLFxuICAgICAgICAgICAgICAgIHRpdGxlOiAnQ29uZmlndXJhdGlvbiBVcGxvYWQnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdUaGUgY29uZmlndXJhdGlvbiBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdWxvYWRlZC4nLFxuICAgICAgICAgICAgICAgIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUuU3VjY2Vzc1xuICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICAgICAgdGhpcy5yZWxvYWRDb25maWd1cmF0aW9uUGFyYW1zKCk7XG4gICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihMT0dfVEFHLCAnSW1wb3J0IHhtbCBjb25maWd1cmF0aW9uIGVycm9yOicsIGVycm9yKTtcblxuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25DZW50ZXIucG9zdCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0NvbmZpZ3VyYXRpb25VcGxvYWRFcnJvcicsXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdDb25maWd1cmF0aW9uIFVwbG9hZCcsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ0Vycm9yIHVwbG9hZGluZyBjb25maWd1cmF0aW9uOicsXG4gICAgICAgICAgICAgICAgdHlwZTogTm90aWZpY2F0aW9uVHlwZS5FcnJvcixcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IsXG4gICAgICAgICAgICAgICAgY2xvc2FibGU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBvbkFkZE5ld1Byb3BlcnR5Q29uZmlybWVkKGRpYWxvZ1Jlc3VsdDogTmV3UGFyYW1EaWFsb2dSZXN1bHQpIHtcbiAgICAgICAgY29uc3QgbmV3Q29uZmlndXJhdGlvblJvdyA9IG5ldyBDb25maWd1cmF0aW9uUm93KCk7XG4gICAgICAgIG5ld0NvbmZpZ3VyYXRpb25Sb3cubmFtZSA9IGRpYWxvZ1Jlc3VsdC5uYW1lO1xuICAgICAgICBuZXdDb25maWd1cmF0aW9uUm93LmNyeXB0ZWQgPSBkaWFsb2dSZXN1bHQuZW5jcnlwdGVkO1xuICAgICAgICBuZXdDb25maWd1cmF0aW9uUm93LmlzTmV3ID0gdHJ1ZTtcbiAgICAgICAgbmV3Q29uZmlndXJhdGlvblJvdy5keW5hbWljID0gZGlhbG9nUmVzdWx0LmR5bmFtaWM7XG4gICAgICAgIG5ld0NvbmZpZ3VyYXRpb25Sb3cudHlwZSA9IGRpYWxvZ1Jlc3VsdC50eXBlO1xuICAgICAgICBuZXdDb25maWd1cmF0aW9uUm93LnZhbHVlID0gZGlhbG9nUmVzdWx0LnZhbHVlO1xuICAgICAgICB0aGlzLm9uRWRpdENvbW1pdChuZXdDb25maWd1cmF0aW9uUm93KTtcbiAgICB9XG59XG4iXX0=