UNPKG

@senx/warpview

Version:
203 lines 36.6 kB
/* * Copyright 2021 SenX S.A.S. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ import { Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core'; import { DataModel } from '../../model/dataModel'; import { Logger } from '../../utils/logger'; import { GTSLib } from '../../utils/gts.lib'; import { WarpViewModalComponent } from '../warp-view-modal/warp-view-modal.component'; import { Param } from '../../model/param'; import deepEqual from 'deep-equal'; import { ChartLib } from '../../utils/chart-lib'; import * as i0 from "@angular/core"; import * as i1 from "../warp-view-modal/warp-view-modal.component"; import * as i2 from "../warp-view-gts-tree/warp-view-chip/warp-view-chip.component"; import * as i3 from "@angular/common"; /** * */ export class WarpViewGtsPopupComponent { constructor() { this.maxToShow = 5; this.warpViewSelectedGTS = new EventEmitter(); this.warpViewModalOpen = new EventEmitter(); this.warpViewModalClose = new EventEmitter(); this.current = 0; // tslint:disable-next-line:variable-name this._gts = []; this._options = new Param(); // tslint:disable-next-line:variable-name this._kbdLastKeyPressed = []; // tslint:disable-next-line:variable-name this._hiddenData = []; // tslint:disable-next-line:variable-name this._debug = false; this.displayed = []; this.modalOpenned = false; this.LOG = new Logger(WarpViewGtsPopupComponent, this.debug); } set options(options) { this.LOG.debug(['onOptions'], options); if (typeof options === 'string') { options = JSON.parse(options); } if (!deepEqual(options, this._options)) { this.LOG.debug(['options', 'changed'], options); this._options = ChartLib.mergeDeep(this._options, options); this.prepareData(); } } set gtsList(gtsList) { this._gtsList = gtsList; this.LOG.debug(['_gtsList'], this._gtsList); this.prepareData(); } get gtslist() { return this._gtsList; } set debug(debug) { this._debug = debug; this.LOG.setDebug(debug); } get debug() { return this._debug; } set data(data) { this.LOG.debug(['data'], data); if (data) { this._data = data; } } get data() { return this._data; } set hiddenData(hiddenData) { this._hiddenData = hiddenData; this.prepareData(); } get hiddenData() { return this._hiddenData; } set kbdLastKeyPressed(kbdLastKeyPressed) { this._kbdLastKeyPressed = kbdLastKeyPressed; if (kbdLastKeyPressed[0] === 's' && !this.modalOpenned) { this.showPopup(); } else if (this.modalOpenned) { switch (kbdLastKeyPressed[0]) { case 'ArrowUp': case 'j': this.current = Math.max(0, this.current - 1); this.prepareData(); break; case 'ArrowDown': case 'k': this.current = Math.min(this._gts.length - 1, this.current + 1); this.prepareData(); break; case ' ': this.warpViewSelectedGTS.emit({ gts: this._gts[this.current], selected: this.hiddenData.indexOf(this._gts[this.current].id) > -1 }); break; default: return; } } } get kbdLastKeyPressed() { return this._kbdLastKeyPressed; } ngAfterViewInit() { this.prepareData(); } onWarpViewModalOpen() { this.modalOpenned = true; this.warpViewModalOpen.emit({}); } onWarpViewModalClose() { this.modalOpenned = false; this.warpViewModalClose.emit({}); } isOpened() { return this.modal.isOpened(); } showPopup() { this.current = 0; this.modal.open(); this.prepareData(); } close() { this.modal.close(); } prepareData() { if (this._gtsList && this._gtsList.data) { this._gts = GTSLib.flatDeep([this._gtsList.data]); const size = this._gts.length; const min = Math.max(0, Math.min(this.current - this.maxToShow, size - 2 * this.maxToShow)); const max = Math.min(size, this.current + this.maxToShow + Math.abs(Math.min(this.current - this.maxToShow, 0))); this.displayed = this._gts.slice(min, max); this.LOG.debug(['prepareData'], this.displayed); } } isHidden(gts) { return !this.displayed.find(g => !!gts ? gts.id === g.id : false); } identify(index, item) { return index; } } WarpViewGtsPopupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: WarpViewGtsPopupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); WarpViewGtsPopupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.1", type: WarpViewGtsPopupComponent, selector: "warpview-gts-popup", inputs: { options: "options", gtsList: "gtsList", debug: "debug", data: "data", hiddenData: "hiddenData", maxToShow: "maxToShow", kbdLastKeyPressed: "kbdLastKeyPressed" }, outputs: { warpViewSelectedGTS: "warpViewSelectedGTS", warpViewModalOpen: "warpViewModalOpen", warpViewModalClose: "warpViewModalClose" }, viewQueries: [{ propertyName: "modal", first: true, predicate: ["modal"], descendants: true, static: true }], ngImport: i0, template: "<!--\n ~ Copyright 2021 SenX S.A.S.\n ~\n ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ http://www.apache.org/licenses/LICENSE-2.0\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n ~\n -->\n\n<warpview-modal [kbdLastKeyPressed]=\"kbdLastKeyPressed\"\n modalTitle=\"GTS Selector\"\n #modal\n (warpViewModalClose)=\"onWarpViewModalClose()\"\n (warpViewModalOpen)=\"onWarpViewModalOpen()\">\n <div class=\"up-arrow\" *ngIf=\"this.current > 0\"></div>\n <div style=\"max-height: 50vh; overflow-x: hidden; overflow-y: auto\">\n <ul>\n <li *ngFor=\"let g of _gts; index as index; trackBy:identify\"\n [ngClass]=\"{ selected: current == index, hidden: isHidden(g.id) }\"\n >\n <warpview-chip [node]=\"{gts: g}\" [hiddenData]=\"hiddenData\" [options]=\"_options\"></warpview-chip>\n </li>\n </ul>\n </div>\n <div class=\"down-arrow\" *ngIf=\"current < _gts.length - 1\"></div>\n</warpview-modal>\n", styles: ["/*!\n * Copyright 2021 SenX S.A.S.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */:root{--warp-view-chart-width: 100%;--warp-view-chart-height: 100%;--warp-view-datagrid-cell-padding: 5px;--warp-view-map-margin: 0;--warp-view-switch-height: 30px;--warp-view-switch-width: 100px;--warp-view-switch-radius: 18px;--warp-view-plot-chart-height: 100%;--warp-view-slider-pointer-size: 65px;--warp-view-resize-handle-height: 10px;--warp-view-tile-width: 100%;--warp-view-tile-height: 100%;--warp-view-font-color: #000000;--warp-view-bar-color: #dc3545;--warp-view-datagrid-odd-bg-color: #ffffff;--warp-view-datagrid-odd-color: #404040;--warp-view-datagrid-even-bg-color: #c0c0c0;--warp-view-datagrid-even-color: #000000;--warp-view-pagination-border-color: #c0c0c0;--warp-view-pagination-bg-color: #ffffff;--warp-view-pagination-active-bg-color: #4CAF50;--warp-view-pagination-active-color: #ffffff;--warp-view-pagination-active-border-color: #4CAF50;--warp-view-pagination-hover-bg-color: #c0c0c0;--warp-view-pagination-hover-color: #000000;--warp-view-pagination-hover-border-color: #c0c0c0;--warp-view-pagination-disabled-color: #c0c0c0;--warp-view-switch-inset-color: #c0c0c0;--warp-view-switch-inset-checked-color: #00cd00;--warp-view-switch-handle-color: radial-gradient(#ffffff 15%, #c0c0c0 100%);--warp-view-switch-handle-checked-color: radial-gradient(#ffffff 15%, #00cd00 100%);--warp-view-resize-handle-color: #c0c0c0;--warp-view-chart-legend-bg: #ffffff;--warp-view-chart-legend-color: #404040;--gts-classname-font-color: #004eff;--gts-labelname-font-color: #19A979;--gts-attrname-font-color: #ED4A7B;--gts-separator-font-color: #a0a0a0;--gts-labelvalue-font-color: #000000;--gts-attrvalue-font-color: #000000;--gts-stack-font-color: #000000;--gts-tree-expanded-icon: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA7klEQVQ4T82TMW7CQBBF/0g+QOpINEkVCmpaLoBm5COk5QYoaeAY3MDSei2LGu4QKakiBA1tCpTK8kS2sLVe2xSh8XSrnf9m/s4s4c6gO/UYGEBEXlT1bK396bFGIjIJguA7iqJLkVNbYOZXItoQ0QHAzBhz9CCFeAVgCeAjy7Jpmqa/NUBEEgDzktqGuOKKO47j+KsGhGH4lOf5HsDIg5ycyqVYVd+steuGheLAzM9EtPMgW1VdVGWJ6N0YU1gpozVGH+K+gy/uBHR1crXUqNzbQXXhduJ69sd7cxOZ+UFVH5Mk+exb+YGt8n9+5h8up1sReYC0WAAAAABJRU5ErkJggg==);--gts-tree-collapsed-icon: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA0UlEQVQ4T6WTUW7CQAxEPQdozxYb9Qb94Aj9gQSoVCp6lMr21doDZFCQiFCU3YDY//d2PeOFPHnwJC+zAlVdA/jp+/6YmZ+1S0qCPxF5HUAAO3fvSpKS4ENEvm6gfUS0c5JiBma2Ibm/QiQPmbmdSqohquoA7GqSxRaapmkBjBkAeHP336t0UWBmHcnb+VcR4XcJpjDJLjPHkS4tleqZubmNiDHU6gumDQDYuvvh7hpV9V9EXgaA5Ka2jbMjmNk7yZOIfEfE8eFVfuSDLda4JDsD3FNdEckTC0YAAAAASUVORK5CYII=);--warp-view-popup-bg-color: #ffffff;--warp-view-popup-border-color: rgba(0, 0, 0, .2);--warp-view-popup-header-bg-color: #c0c0c0;--warp-view-popup-title-color: #404040;--warp-view-popup-close-color: #404040;--warp-view-popup-body-bg-color: #ffffff;--warp-view-popup-body-color: #000000;--warp-view-annotationtooltip-value-font-color: #004eff;--warp-view-annotationtooltip-font-color: #404040;--warp-view-spinner-color: #ff9900;--warp-view-tooltip-bg: #ffffff;--warp-view-tooltip-color: #000000;--warp-slider-connect-color: #ff9900;--warp-slider-handle-bg-color: #ffffff;--warp-slider-handle-color: #004eff;--warp-slider-handle-shadow: inset 0 0 1px #ffffff, inset 0 1px 7px #c0c0c0, 0 3px 6px -3px #a0a0a0}.noData{width:100%;text-align:center;color:var(--warp-view-chart-legend-color);position:relative}.js-plotly-plot .plotly .cursor-ew-resize{cursor:default!important}\n"], components: [{ type: i1.WarpViewModalComponent, selector: "warpview-modal", inputs: ["modalTitle", "kbdLastKeyPressed"], outputs: ["warpViewModalOpen", "warpViewModalClose"] }, { type: i2.WarpViewChipComponent, selector: "warpview-chip", inputs: ["node", "param", "options", "events", "debug", "hiddenData", "gtsFilter"], outputs: ["warpViewSelectedGTS"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], encapsulation: i0.ViewEncapsulation.ShadowDom }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: WarpViewGtsPopupComponent, decorators: [{ type: Component, args: [{ selector: 'warpview-gts-popup', encapsulation: ViewEncapsulation.ShadowDom, template: "<!--\n ~ Copyright 2021 SenX S.A.S.\n ~\n ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ http://www.apache.org/licenses/LICENSE-2.0\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n ~\n -->\n\n<warpview-modal [kbdLastKeyPressed]=\"kbdLastKeyPressed\"\n modalTitle=\"GTS Selector\"\n #modal\n (warpViewModalClose)=\"onWarpViewModalClose()\"\n (warpViewModalOpen)=\"onWarpViewModalOpen()\">\n <div class=\"up-arrow\" *ngIf=\"this.current > 0\"></div>\n <div style=\"max-height: 50vh; overflow-x: hidden; overflow-y: auto\">\n <ul>\n <li *ngFor=\"let g of _gts; index as index; trackBy:identify\"\n [ngClass]=\"{ selected: current == index, hidden: isHidden(g.id) }\"\n >\n <warpview-chip [node]=\"{gts: g}\" [hiddenData]=\"hiddenData\" [options]=\"_options\"></warpview-chip>\n </li>\n </ul>\n </div>\n <div class=\"down-arrow\" *ngIf=\"current < _gts.length - 1\"></div>\n</warpview-modal>\n", styles: ["/*!\n * Copyright 2021 SenX S.A.S.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */:root{--warp-view-chart-width: 100%;--warp-view-chart-height: 100%;--warp-view-datagrid-cell-padding: 5px;--warp-view-map-margin: 0;--warp-view-switch-height: 30px;--warp-view-switch-width: 100px;--warp-view-switch-radius: 18px;--warp-view-plot-chart-height: 100%;--warp-view-slider-pointer-size: 65px;--warp-view-resize-handle-height: 10px;--warp-view-tile-width: 100%;--warp-view-tile-height: 100%;--warp-view-font-color: #000000;--warp-view-bar-color: #dc3545;--warp-view-datagrid-odd-bg-color: #ffffff;--warp-view-datagrid-odd-color: #404040;--warp-view-datagrid-even-bg-color: #c0c0c0;--warp-view-datagrid-even-color: #000000;--warp-view-pagination-border-color: #c0c0c0;--warp-view-pagination-bg-color: #ffffff;--warp-view-pagination-active-bg-color: #4CAF50;--warp-view-pagination-active-color: #ffffff;--warp-view-pagination-active-border-color: #4CAF50;--warp-view-pagination-hover-bg-color: #c0c0c0;--warp-view-pagination-hover-color: #000000;--warp-view-pagination-hover-border-color: #c0c0c0;--warp-view-pagination-disabled-color: #c0c0c0;--warp-view-switch-inset-color: #c0c0c0;--warp-view-switch-inset-checked-color: #00cd00;--warp-view-switch-handle-color: radial-gradient(#ffffff 15%, #c0c0c0 100%);--warp-view-switch-handle-checked-color: radial-gradient(#ffffff 15%, #00cd00 100%);--warp-view-resize-handle-color: #c0c0c0;--warp-view-chart-legend-bg: #ffffff;--warp-view-chart-legend-color: #404040;--gts-classname-font-color: #004eff;--gts-labelname-font-color: #19A979;--gts-attrname-font-color: #ED4A7B;--gts-separator-font-color: #a0a0a0;--gts-labelvalue-font-color: #000000;--gts-attrvalue-font-color: #000000;--gts-stack-font-color: #000000;--gts-tree-expanded-icon: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA7klEQVQ4T82TMW7CQBBF/0g+QOpINEkVCmpaLoBm5COk5QYoaeAY3MDSei2LGu4QKakiBA1tCpTK8kS2sLVe2xSh8XSrnf9m/s4s4c6gO/UYGEBEXlT1bK396bFGIjIJguA7iqJLkVNbYOZXItoQ0QHAzBhz9CCFeAVgCeAjy7Jpmqa/NUBEEgDzktqGuOKKO47j+KsGhGH4lOf5HsDIg5ycyqVYVd+steuGheLAzM9EtPMgW1VdVGWJ6N0YU1gpozVGH+K+gy/uBHR1crXUqNzbQXXhduJ69sd7cxOZ+UFVH5Mk+exb+YGt8n9+5h8up1sReYC0WAAAAABJRU5ErkJggg==);--gts-tree-collapsed-icon: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA0UlEQVQ4T6WTUW7CQAxEPQdozxYb9Qb94Aj9gQSoVCp6lMr21doDZFCQiFCU3YDY//d2PeOFPHnwJC+zAlVdA/jp+/6YmZ+1S0qCPxF5HUAAO3fvSpKS4ENEvm6gfUS0c5JiBma2Ibm/QiQPmbmdSqohquoA7GqSxRaapmkBjBkAeHP336t0UWBmHcnb+VcR4XcJpjDJLjPHkS4tleqZubmNiDHU6gumDQDYuvvh7hpV9V9EXgaA5Ka2jbMjmNk7yZOIfEfE8eFVfuSDLda4JDsD3FNdEckTC0YAAAAASUVORK5CYII=);--warp-view-popup-bg-color: #ffffff;--warp-view-popup-border-color: rgba(0, 0, 0, .2);--warp-view-popup-header-bg-color: #c0c0c0;--warp-view-popup-title-color: #404040;--warp-view-popup-close-color: #404040;--warp-view-popup-body-bg-color: #ffffff;--warp-view-popup-body-color: #000000;--warp-view-annotationtooltip-value-font-color: #004eff;--warp-view-annotationtooltip-font-color: #404040;--warp-view-spinner-color: #ff9900;--warp-view-tooltip-bg: #ffffff;--warp-view-tooltip-color: #000000;--warp-slider-connect-color: #ff9900;--warp-slider-handle-bg-color: #ffffff;--warp-slider-handle-color: #004eff;--warp-slider-handle-shadow: inset 0 0 1px #ffffff, inset 0 1px 7px #c0c0c0, 0 3px 6px -3px #a0a0a0}.noData{width:100%;text-align:center;color:var(--warp-view-chart-legend-color);position:relative}.js-plotly-plot .plotly .cursor-ew-resize{cursor:default!important}\n"] }] }], ctorParameters: function () { return []; }, propDecorators: { modal: [{ type: ViewChild, args: ['modal', { static: true }] }], options: [{ type: Input, args: ['options'] }], gtsList: [{ type: Input, args: ['gtsList'] }], debug: [{ type: Input, args: ['debug'] }], data: [{ type: Input, args: ['data'] }], hiddenData: [{ type: Input, args: ['hiddenData'] }], maxToShow: [{ type: Input, args: ['maxToShow'] }], kbdLastKeyPressed: [{ type: Input, args: ['kbdLastKeyPressed'] }], warpViewSelectedGTS: [{ type: Output, args: ['warpViewSelectedGTS'] }], warpViewModalOpen: [{ type: Output, args: ['warpViewModalOpen'] }], warpViewModalClose: [{ type: Output, args: ['warpViewModalClose'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FycC12aWV3LWd0cy1wb3B1cC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy93YXJwdmlldy1uZy9zcmMvbGliL2VsZW1lbnRzL3dhcnAtdmlldy1ndHMtcG9wdXAvd2FycC12aWV3LWd0cy1wb3B1cC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy93YXJwdmlldy1uZy9zcmMvbGliL2VsZW1lbnRzL3dhcnAtdmlldy1ndHMtcG9wdXAvd2FycC12aWV3LWd0cy1wb3B1cC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWdCLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEgsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2hELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUMxQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDM0MsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sOENBQThDLENBQUM7QUFDcEYsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ3hDLE9BQU8sU0FBUyxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7Ozs7O0FBRS9DOztHQUVHO0FBT0gsTUFBTSxPQUFPLHlCQUF5QjtJQWdIcEM7UUF6RG9CLGNBQVMsR0FBRyxDQUFDLENBQUM7UUFrQ0gsd0JBQW1CLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUNoRCxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQzNDLHVC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QkFBQyxZQUFZO2dCQVNDLFNBQVM7c0JBQTVCLEtBQUs7dUJBQUMsV0FBVztnQkFFYyxpQkFBaUI7c0JBQWhELEtBQUs7dUJBQUMsbUJBQW1CO2dCQWdDSyxtQkFBbUI7c0JBQWpELE1BQU07dUJBQUMscUJBQXFCO2dCQUNBLGlCQUFpQjtzQkFBN0MsTUFBTTt1QkFBQyxtQkFBbUI7Z0JBQ0csa0JBQWtCO3NCQUEvQyxNQUFNO3VCQUFDLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiAgQ29weXJpZ2h0IDIwMjEgIFNlblggUy5BLlMuXG4gKlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKi9cblxuaW1wb3J0IHtBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0RhdGFNb2RlbH0gZnJvbSAnLi4vLi4vbW9kZWwvZGF0YU1vZGVsJztcbmltcG9ydCB7TG9nZ2VyfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXInO1xuaW1wb3J0IHtHVFNMaWJ9IGZyb20gJy4uLy4uL3V0aWxzL2d0cy5saWInO1xuaW1wb3J0IHtXYXJwVmlld01vZGFsQ29tcG9uZW50fSBmcm9tICcuLi93YXJwLXZpZXctbW9kYWwvd2FycC12aWV3LW1vZGFsLmNvbXBvbmVudCc7XG5pbXBvcnQge1BhcmFtfSBmcm9tICcuLi8uLi9tb2RlbC9wYXJhbSc7XG5pbXBvcnQgZGVlcEVxdWFsIGZyb20gJ2RlZXAtZXF1YWwnO1xuaW1wb3J0IHtDaGFydExpYn0gZnJvbSAnLi4vLi4vdXRpbHMvY2hhcnQtbGliJztcblxuLyoqXG4gKlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd3YXJwdmlldy1ndHMtcG9wdXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vd2FycC12aWV3LWd0cy1wb3B1cC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3dhcnAtdmlldy1ndHMtcG9wdXAuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uU2hhZG93RG9tXG59KVxuZXhwb3J0IGNsYXNzIFdhcnBWaWV3R3RzUG9wdXBDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgQFZpZXdDaGlsZCgnbW9kYWwnLCB7c3RhdGljOiB0cnVlfSkgbW9kYWw6IFdhcnBWaWV3TW9kYWxDb21wb25lbnQ7XG5cbiAgQElucHV0KCdvcHRpb25zJykgc2V0IG9wdGlvbnMob3B0aW9uczogUGFyYW0gfCBzdHJpbmcpIHtcbiAgICB0aGlzLkxPRy5kZWJ1ZyhbJ29uT3B0aW9ucyddLCBvcHRpb25zKTtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBvcHRpb25zID0gSlNPTi5wYXJzZShvcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKCFkZWVwRXF1YWwob3B0aW9ucywgdGhpcy5fb3B0aW9ucykpIHtcbiAgICAgIHRoaXMuTE9HLmRlYnVnKFsnb3B0aW9ucycsICdjaGFuZ2VkJ10sIG9wdGlvbnMpO1xuICAgICAgdGhpcy5fb3B0aW9ucyA9IENoYXJ0TGliLm1lcmdlRGVlcCh0aGlzLl9vcHRpb25zLCBvcHRpb25zIGFzIFBhcmFtKSBhcyBQYXJhbTtcbiAgICAgIHRoaXMucHJlcGFyZURhdGEoKTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoJ2d0c0xpc3QnKSBzZXQgZ3RzTGlzdChndHNMaXN0OiBEYXRhTW9kZWwpIHtcbiAgICB0aGlzLl9ndHNMaXN0ID0gZ3RzTGlzdDtcbiAgICB0aGlzLkxPRy5kZWJ1ZyhbJ19ndHNMaXN0J10sIHRoaXMuX2d0c0xpc3QpO1xuICAgIHRoaXMucHJlcGFyZURhdGEoKTtcbiAgfVxuXG4gIGdldCBndHNsaXN0KCk6IERhdGFNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMuX2d0c0xpc3Q7XG4gIH1cblxuICBASW5wdXQoJ2RlYnVnJykgc2V0IGRlYnVnKGRlYnVnOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGVidWcgPSBkZWJ1ZztcbiAgICB0aGlzLkxPRy5zZXREZWJ1ZyhkZWJ1Zyk7XG4gIH1cblxuICBnZXQgZGVidWcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlYnVnO1xuICB9XG5cbiAgQElucHV0KCdkYXRhJykgc2V0IGRhdGEoZGF0YTogRGF0YU1vZGVsKSB7XG4gICAgdGhpcy5MT0cuZGVidWcoWydkYXRhJ10sIGRhdGEpO1xuICAgIGlmIChkYXRhKSB7XG4gICAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgICB9XG4gIH1cblxuICBnZXQgZGF0YSgpOiBEYXRhTW9kZWwge1xuICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICB9XG5cblxuICBASW5wdXQoJ2hpZGRlbkRhdGEnKSBzZXQgaGlkZGVuRGF0YShoaWRkZW5EYXRhOiBudW1iZXJbXSkge1xuICAgIHRoaXMuX2hpZGRlbkRhdGEgPSBoaWRkZW5EYXRhO1xuICAgIHRoaXMucHJlcGFyZURhdGEoKTtcbiAgfVxuXG4gIGdldCBoaWRkZW5EYXRhKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gdGhpcy5faGlkZGVuRGF0YTtcbiAgfVxuXG4gIEBJbnB1dCgnbWF4VG9TaG93JykgbWF4VG9TaG93ID0gNTtcblxuICBASW5wdXQoJ2tiZExhc3RLZXlQcmVzc2VkJykgc2V0IGtiZExhc3RLZXlQcmVzc2VkKGtiZExhc3RLZXlQcmVzc2VkOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2tiZExhc3RLZXlQcmVzc2VkID0ga2JkTGFzdEtleVByZXNzZWQ7XG4gICAgaWYgKGtiZExhc3RLZXlQcmVzc2VkWzBdID09PSAncycgJiYgIXRoaXMubW9kYWxPcGVubmVkKSB7XG4gICAgICB0aGlzLnNob3dQb3B1cCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tb2RhbE9wZW5uZWQpIHtcbiAgICAgIHN3aXRjaCAoa2JkTGFzdEtleVByZXNzZWRbMF0pIHtcbiAgICAgICAgY2FzZSdBcnJvd1VwJzpcbiAgICAgICAgY2FzZSdqJzpcbiAgICAgICAgICB0aGlzLmN1cnJlbnQgPSBNYXRoLm1heCgwLCB0aGlzLmN1cnJlbnQgLSAxKTtcbiAgICAgICAgICB0aGlzLnByZXBhcmVEYXRhKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgIGNhc2UgJ2snOlxuICAgICAgICAgIHRoaXMuY3VycmVudCA9IE1hdGgubWluKHRoaXMuX2d0cy5sZW5ndGggLSAxLCB0aGlzLmN1cnJlbnQgKyAxKTtcbiAgICAgICAgICB0aGlzLnByZXBhcmVEYXRhKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJyAnOlxuICAgICAgICAgIHRoaXMud2FycFZpZXdTZWxlY3RlZEdUUy5lbWl0KHtcbiAgICAgICAgICAgIGd0czogdGhpcy5fZ3RzW3RoaXMuY3VycmVudF0sXG4gICAgICAgICAgICBzZWxlY3RlZDogdGhpcy5oaWRkZW5EYXRhLmluZGV4T2YodGhpcy5fZ3RzW3RoaXMuY3VycmVudF0uaWQpID4gLTFcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IGtiZExhc3RLZXlQcmVzc2VkKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fa2JkTGFzdEtleVByZXNzZWQ7XG4gIH1cblxuICBAT3V0cHV0KCd3YXJwVmlld1NlbGVjdGVkR1RTJykgd2FycFZpZXdTZWxlY3RlZEdUUyA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCd3YXJwVmlld01vZGFsT3BlbicpIHdhcnBWaWV3TW9kYWxPcGVuID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoJ3dhcnBWaWV3TW9kYWxDbG9zZScpIHdhcnBWaWV3TW9kYWxDbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIGN1cnJlbnQgPSAwO1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuICBfZ3RzOiBhbnlbXSA9IFtdO1xuICBfb3B0aW9uczogUGFyYW0gPSBuZXcgUGFyYW0oKTtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuICBwcml2YXRlIF9rYmRMYXN0S2V5UHJlc3NlZDogc3RyaW5nW10gPSBbXTtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbiAgcHJpdmF0ZSBfaGlkZGVuRGF0YTogbnVtYmVyW10gPSBbXTtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbiAgcHJpdmF0ZSBfZGVidWcgPSBmYWxzZTtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbiAgcHJpdmF0ZSBfZ3RzTGlzdDogRGF0YU1vZGVsO1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuICBwcml2YXRlIF9kYXRhOiBEYXRhTW9kZWw7XG4gIHByaXZhdGUgZGlzcGxheWVkOiBhbnlbXSA9IFtdO1xuICBwcml2YXRlIG1vZGFsT3Blbm5lZCA9IGZhbHNlO1xuICBwcml2YXRlIExPRzogTG9nZ2VyO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuTE9HID0gbmV3IExvZ2dlcihXYXJwVmlld0d0c1BvcHVwQ29tcG9uZW50LCB0aGlzLmRlYnVnKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnByZXBhcmVEYXRhKCk7XG4gIH1cblxuICBvbldhcnBWaWV3TW9kYWxPcGVuKCkge1xuICAgIHRoaXMubW9kYWxPcGVubmVkID0gdHJ1ZTtcbiAgICB0aGlzLndhcnBWaWV3TW9kYWxPcGVuLmVtaXQoe30pO1xuICB9XG5cbiAgb25XYXJwVmlld01vZGFsQ2xvc2UoKSB7XG4gICAgdGhpcy5tb2RhbE9wZW5uZWQgPSBmYWxzZTtcbiAgICB0aGlzLndhcnBWaWV3TW9kYWxDbG9zZS5lbWl0KHt9KTtcbiAgfVxuXG4gIHB1YmxpYyBpc09wZW5lZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5tb2RhbC5pc09wZW5lZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93UG9wdXAoKSB7XG4gICAgdGhpcy5jdXJyZW50ID0gMDtcbiAgICB0aGlzLm1vZGFsLm9wZW4oKTtcbiAgICB0aGlzLnByZXBhcmVEYXRhKCk7XG4gIH1cblxuICBwdWJsaWMgY2xvc2UoKSB7XG4gICAgdGhpcy5tb2RhbC5jbG9zZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVwYXJlRGF0YSgpIHtcbiAgICBpZiAodGhpcy5fZ3RzTGlzdCAmJiB0aGlzLl9ndHNMaXN0LmRhdGEpIHtcbiAgICAgIHRoaXMuX2d0cyA9IEdUU0xpYi5mbGF0RGVlcChbdGhpcy5fZ3RzTGlzdC5kYXRhXSk7XG4gICAgICBjb25zdCBzaXplID0gdGhpcy5fZ3RzLmxlbmd0aDtcbiAgICAgIGNvbnN0IG1pbiA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMuY3VycmVudCAtIHRoaXMubWF4VG9TaG93LCBzaXplIC0gMiAqIHRoaXMubWF4VG9TaG93KSk7XG4gICAgICBjb25zdCBtYXggPSBNYXRoLm1pbihzaXplLCB0aGlzLmN1cnJlbnQgKyB0aGlzLm1heFRvU2hvdyArIE1hdGguYWJzKE1hdGgubWluKHRoaXMuY3VycmVudCAtIHRoaXMubWF4VG9TaG93LCAwKSkpO1xuICAgICAgdGhpcy5kaXNwbGF5ZWQgPSB0aGlzLl9ndHMuc2xpY2UobWluLCBtYXgpO1xuICAgICAgdGhpcy5MT0cuZGVidWcoWydwcmVwYXJlRGF0YSddLCB0aGlzLmRpc3BsYXllZCk7XG4gICAgfVxuICB9XG5cbiAgaXNIaWRkZW4oZ3RzKSB7XG4gICAgcmV0dXJuICF0aGlzLmRpc3BsYXllZC5maW5kKGcgPT4gISFndHMgPyBndHMuaWQgPT09IGcuaWQgOiBmYWxzZSk7XG4gIH1cblxuICBpZGVudGlmeShpbmRleCwgaXRlbSkge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxufVxuIiwiPCEtLVxuICB+ICBDb3B5cmlnaHQgMjAyMSAgU2VuWCBTLkEuUy5cbiAgflxuICB+ICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB+ICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIH4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICB+XG4gIH4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIH5cbiAgfiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICB+ICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIH4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICB+ICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIH4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICB+XG4gIC0tPlxuXG48d2FycHZpZXctbW9kYWwgW2tiZExhc3RLZXlQcmVzc2VkXT1cImtiZExhc3RLZXlQcmVzc2VkXCJcbiAgICAgICAgICAgICAgICBtb2RhbFRpdGxlPVwiR1RTIFNlbGVjdG9yXCJcbiAgICAgICAgICAgICAgICAjbW9kYWxcbiAgICAgICAgICAgICAgICAod2FycFZpZXdNb2RhbENsb3NlKT1cIm9uV2FycFZpZXdNb2RhbENsb3NlKClcIlxuICAgICAgICAgICAgICAgICh3YXJwVmlld01vZGFsT3Blbik9XCJvbldhcnBWaWV3TW9kYWxPcGVuKClcIj5cbiAgPGRpdiBjbGFzcz1cInVwLWFycm93XCIgKm5nSWY9XCJ0aGlzLmN1cnJlbnQgPiAwXCI+PC9kaXY+XG4gIDxkaXYgc3R5bGU9XCJtYXgtaGVpZ2h0OiA1MHZoOyBvdmVyZmxvdy14OiBoaWRkZW47IG92ZXJmbG93LXk6IGF1dG9cIj5cbiAgICA8dWw+XG4gICAgICA8bGkgKm5nRm9yPVwibGV0IGcgb2YgX2d0czsgaW5kZXggYXMgaW5kZXg7IHRyYWNrQnk6aWRlbnRpZnlcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsgc2VsZWN0ZWQ6IGN1cnJlbnQgPT0gaW5kZXgsIGhpZGRlbjogaXNIaWRkZW4oZy5pZCkgfVwiXG4gICAgICA+XG4gICAgICAgIDx3YXJwdmlldy1jaGlwIFtub2RlXT1cIntndHM6IGd9XCIgW2hpZGRlbkRhdGFdPVwiaGlkZGVuRGF0YVwiIFtvcHRpb25zXT1cIl9vcHRpb25zXCI+PC93YXJwdmlldy1jaGlwPlxuICAgICAgPC9saT5cbiAgICA8L3VsPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImRvd24tYXJyb3dcIiAqbmdJZj1cImN1cnJlbnQgPCBfZ3RzLmxlbmd0aCAtIDFcIj48L2Rpdj5cbjwvd2FycHZpZXctbW9kYWw+XG4iXX0=