UNPKG

@iotize/ionic

Version:

Iotize specific building blocks on top of @ionic/angular.

162 lines 21.7 kB
import { Component, Input } from '@angular/core'; import { DataSource } from '@angular/cdk/table'; import { Observable, Subject, combineLatest } from 'rxjs'; import { debug } from '../../debug'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@angular/material/table"; import * as i3 from "@angular/cdk/table"; export class MonitoringTableComponent { /** Table columns */ columns = undefined; dataSource = new MonitoringTableComponentDataSource(); set columnsMap(mapping) { if (mapping) { if (!this.columns) { this.setupColumns(); } for (const key in mapping) { if (!this.columns?.find((info) => info.columnDef === key)) { debug('Column ', key, 'is not in columns', this.columns); this.addColumn(key, mapping[key]); } } // Removing old columns const toRemove = []; this.columns?.forEach((column, index) => { if (!(column.columnDef in mapping)) { debug('Deleting column: ', column); toRemove.push(index); } }); toRemove.reverse().forEach((index) => this.columns?.splice(index, 1)); // debug(`COLUMNS:`, this.columns) this.displayedColumns = this.columns?.map((x) => x.columnDef); // refresh data this.dataSource.refresh(); } } /** Column definitions in order */ displayedColumns = []; set variables(variables) { combineLatest(variables.map((variable) => variable.values)).subscribe((values) => { if (this.columns) { const item = {}; this.columns.forEach((column, index) => { if (column.columnDef === '__date') { item[column.columnDef] = new Date().toLocaleTimeString(); } else { item[column.columnDef] = values[index - (this.date ? 1 : 0)]; } }); this.dataSource.add(item); } }); } set data$(stream) { if (stream) { stream.subscribe((value) => { if (this.columns) { this.dataSource.add(value); } }); } } set data(data) { debug('Setting table data: ', data); this.dataSource.data = data; } date = true; constructor() { } setupColumns() { debug('setupColumns'); if (this.columns) { this.columns.splice(0, this.columns.length); } else { this.columns = []; } if (this.date) { this.addColumn('__date', 'Date'); } } addColumn(id, header) { if (!this.columns) { this.columns = []; } const columnInfo = { header: header, columnDef: id, cell: (row) => `${row[id]}`, }; this.columns.push(columnInfo); } /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MonitoringTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MonitoringTableComponent, selector: "tap-app-monitoring-table", inputs: { columns: "columns", dataSource: "dataSource", columnsMap: "columnsMap", displayedColumns: "displayedColumns", variables: "variables", data$: "data$", data: "data", date: "date" }, ngImport: i0, template: "<mat-table\n *ngIf=\"columns && columns.length > 0\"\n [dataSource]=\"dataSource\"\n #table\n>\n <ng-container\n *ngFor=\"let column of columns\"\n [cdkColumnDef]=\"column.columnDef\"\n >\n <mat-header-cell *cdkHeaderCellDef>{{ column.header }}</mat-header-cell>\n <mat-cell *cdkCellDef=\"let row\">{{ column.cell(row) }}</mat-cell>\n </ng-container>\n\n <mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: displayedColumns\"></mat-row>\n</mat-table>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i2.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i2.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i2.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i2.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i3.CdkCellDef, selector: "[cdkCellDef]" }, { kind: "directive", type: i3.CdkHeaderCellDef, selector: "[cdkHeaderCellDef]" }, { kind: "directive", type: i3.CdkColumnDef, selector: "[cdkColumnDef]", inputs: ["cdkColumnDef", "sticky", "stickyEnd"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MonitoringTableComponent, decorators: [{ type: Component, args: [{ selector: 'tap-app-monitoring-table', template: "<mat-table\n *ngIf=\"columns && columns.length > 0\"\n [dataSource]=\"dataSource\"\n #table\n>\n <ng-container\n *ngFor=\"let column of columns\"\n [cdkColumnDef]=\"column.columnDef\"\n >\n <mat-header-cell *cdkHeaderCellDef>{{ column.header }}</mat-header-cell>\n <mat-cell *cdkCellDef=\"let row\">{{ column.cell(row) }}</mat-cell>\n </ng-container>\n\n <mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: displayedColumns\"></mat-row>\n</mat-table>\n" }] }], ctorParameters: () => [], propDecorators: { columns: [{ type: Input }], dataSource: [{ type: Input }], columnsMap: [{ type: Input }], displayedColumns: [{ type: Input }], variables: [{ type: Input }], data$: [{ type: Input }], data: [{ type: Input }], date: [{ type: Input }] } }); export class MonitoringTableComponentDataSource extends DataSource { options; _data = []; _subject = new Subject(); constructor(options = { max: -1, newItemOnTop: true, }) { super(); this.options = options; } add(item) { if (this.options.newItemOnTop) { this._data.unshift(item); if (this.options.max >= 0 && this._data.length > this.options.max) { this._data.pop(); } } else { this._data.push(item); if (this.options.max >= 0 && this._data.length > this.options.max) { this._data.shift(); } } this._subject.next(this._data); // debug(`Adding values: `, item) } set data(d) { this._data = d; this._subject.next(this._data); } connect() { return this._subject; } refresh() { this._data = [...this._data]; this._subject.next(this._data); } disconnect() { } clear() { this._data = []; this._subject.next(this._data); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uaXRvcmluZy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pb3RpemUtaW9uaWMvbW9uaXRvcmluZy9zcmMvbGliL3VpLWNvbXBvbmVudHMvbW9uaXRvcmluZy10YWJsZS9tb25pdG9yaW5nLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9tb25pdG9yaW5nL3NyYy9saWIvdWktY29tcG9uZW50cy9tb25pdG9yaW5nLXRhYmxlL21vbml0b3JpbmctdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUxRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDOzs7OztBQWtCcEMsTUFBTSxPQUFPLHdCQUF3QjtJQUNuQyxvQkFBb0I7SUFDWCxPQUFPLEdBQXVCLFNBQVMsQ0FBQztJQUV4QyxVQUFVLEdBQUcsSUFBSSxrQ0FBa0MsRUFBRSxDQUFDO0lBRS9ELElBQWEsVUFBVSxDQUFDLE9BQWtDO1FBQ3hELElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNsQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsQ0FBQztZQUNELEtBQUssTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxF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QUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDckIsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsaUNBQWlDO0lBQ25DLENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQyxDQUFtQjtRQUMxQixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELFVBQVUsS0FBSSxDQUFDO0lBRWYsS0FBSztRQUNILElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3RhYmxlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIGNvbWJpbmVMYXRlc3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFic3RyYWN0VmFyaWFibGUgfSBmcm9tICdAaW90aXplL3RhcC9kYXRhJztcbmltcG9ydCB7IGRlYnVnIH0gZnJvbSAnLi4vLi4vZGVidWcnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlRGF0YUVudHJ5IHtcbiAgX19kYXRlPzogbnVtYmVyO1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVDb2x1bW5UeXBlIHtcbiAgaGVhZGVyOiBzdHJpbmc7XG4gIGNvbHVtbkRlZjogc3RyaW5nO1xuICBjZWxsOiAocm93OiBhbnkpID0+IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGFwLWFwcC1tb25pdG9yaW5nLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21vbml0b3JpbmctdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tb25pdG9yaW5nLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIE1vbml0b3JpbmdUYWJsZUNvbXBvbmVudCB7XG4gIC8qKiBUYWJsZSBjb2x1bW5zICovXG4gIEBJbnB1dCgpIGNvbHVtbnM/OiBUYWJsZUNvbHVtblR5cGVbXSA9IHVuZGVmaW5lZDtcblxuICBASW5wdXQoKSBkYXRhU291cmNlID0gbmV3IE1vbml0b3JpbmdUYWJsZUNvbXBvbmVudERhdGFTb3VyY2UoKTtcblxuICBASW5wdXQoKSBzZXQgY29sdW1uc01hcChtYXBwaW5nOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KSB7XG4gICAgaWYgKG1hcHBpbmcpIHtcbiAgICAgIGlmICghdGhpcy5jb2x1bW5zKSB7XG4gICAgICAgIHRoaXMuc2V0dXBDb2x1bW5zKCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBtYXBwaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy5jb2x1bW5zPy5maW5kKChpbmZvKSA9PiBpbmZvLmNvbHVtbkRlZiA9PT0ga2V5KSkge1xuICAgICAgICAgIGRlYnVnKCdDb2x1bW4gJywga2V5LCAnaXMgbm90IGluIGNvbHVtbnMnLCB0aGlzLmNvbHVtbnMpO1xuICAgICAgICAgIHRoaXMuYWRkQ29sdW1uKGtleSwgbWFwcGluZ1trZXldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gUmVtb3Zpbmcgb2xkIGNvbHVtbnNcbiAgICAgIGNvbnN0IHRvUmVtb3ZlOiBudW1iZXJbXSA9IFtdO1xuICAgICAgdGhpcy5jb2x1bW5zPy5mb3JFYWNoKChjb2x1bW4sIGluZGV4KSA9PiB7XG4gICAgICAgIGlmICghKGNvbHVtbi5jb2x1bW5EZWYgaW4gbWFwcGluZykpIHtcbiAgICAgICAgICBkZWJ1ZygnRGVsZXRpbmcgY29sdW1uOiAnLCBjb2x1bW4pO1xuICAgICAgICAgIHRvUmVtb3ZlLnB1c2goaW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRvUmVtb3ZlLnJldmVyc2UoKS5mb3JFYWNoKChpbmRleCkgPT4gdGhpcy5jb2x1bW5zPy5zcGxpY2UoaW5kZXgsIDEpKTtcbiAgICAgIC8vIGRlYnVnKGBDT0xVTU5TOmAsIHRoaXMuY29sdW1ucylcbiAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IHRoaXMuY29sdW1ucz8ubWFwKCh4KSA9PiB4LmNvbHVtbkRlZik7XG5cbiAgICAgIC8vIHJlZnJlc2ggZGF0YVxuICAgICAgdGhpcy5kYXRhU291cmNlLnJlZnJlc2goKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ29sdW1uIGRlZmluaXRpb25zIGluIG9yZGVyICovXG4gIEBJbnB1dCgpIGRpc3BsYXllZENvbHVtbnM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkID0gW107XG5cbiAgQElucHV0KCkgc2V0IHZhcmlhYmxlcyh2YXJpYWJsZXM6IEFic3RyYWN0VmFyaWFibGU8YW55PltdKSB7XG4gICAgY29tYmluZUxhdGVzdCh2YXJpYWJsZXMubWFwKCh2YXJpYWJsZSkgPT4gdmFyaWFibGUudmFsdWVzKSkuc3Vic2NyaWJlKFxuICAgICAgKHZhbHVlcykgPT4ge1xuICAgICAgICBpZiAodGhpcy5jb2x1bW5zKSB7XG4gICAgICAgICAgY29uc3QgaXRlbTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKChjb2x1bW4sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGlmIChjb2x1bW4uY29sdW1uRGVmID09PSAnX19kYXRlJykge1xuICAgICAgICAgICAgICBpdGVtW2NvbHVtbi5jb2x1bW5EZWZdID0gbmV3IERhdGUoKS50b0xvY2FsZVRpbWVTdHJpbmcoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGl0ZW1bY29sdW1uLmNvbHVtbkRlZl0gPSB2YWx1ZXNbaW5kZXggLSAodGhpcy5kYXRlID8gMSA6IDApXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UuYWRkKGl0ZW0gYXMgVGFibGVEYXRhRW50cnkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBkYXRhJChzdHJlYW06IE9ic2VydmFibGU8YW55Pikge1xuICAgIGlmIChzdHJlYW0pIHtcbiAgICAgIHN0cmVhbS5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNvbHVtbnMpIHtcbiAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UuYWRkKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgQElucHV0KCkgc2V0IGRhdGEoZGF0YTogVGFibGVEYXRhRW50cnlbXSkge1xuICAgIGRlYnVnKCdTZXR0aW5nIHRhYmxlIGRhdGE6ICcsIGRhdGEpO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gZGF0YTtcbiAgfVxuXG4gIEBJbnB1dCgpIGRhdGUgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBwcml2YXRlIHNldHVwQ29sdW1ucygpIHtcbiAgICBkZWJ1Zygnc2V0dXBDb2x1bW5zJyk7XG4gICAgaWYgKHRoaXMuY29sdW1ucykge1xuICAgICAgdGhpcy5jb2x1bW5zLnNwbGljZSgwLCB0aGlzLmNvbHVtbnMubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2x1bW5zID0gW107XG4gICAgfVxuICAgIGlmICh0aGlzLmRhdGUpIHtcbiAgICAgIHRoaXMuYWRkQ29sdW1uKCdfX2RhdGUnLCAnRGF0ZScpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkQ29sdW1uKGlkOiBzdHJpbmcsIGhlYWRlcjogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoIXRoaXMuY29sdW1ucykge1xuICAgICAgdGhpcy5jb2x1bW5zID0gW107XG4gICAgfVxuICAgIGNvbnN0IGNvbHVtbkluZm8gPSB7XG4gICAgICBoZWFkZXI6IGhlYWRlcixcbiAgICAgIGNvbHVtbkRlZjogaWQsXG4gICAgICBjZWxsOiAocm93OiBhbnkpID0+IGAke3Jvd1tpZF19YCxcbiAgICB9O1xuICAgIHRoaXMuY29sdW1ucy5wdXNoKGNvbHVtbkluZm8pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNb25pdG9yaW5nVGFibGVDb21wb25lbnREYXRhU291cmNlIGV4dGVuZHMgRGF0YVNvdXJjZTxUYWJsZURhdGFFbnRyeT4ge1xuICBfZGF0YTogVGFibGVEYXRhRW50cnlbXSA9IFtdO1xuXG4gIHByaXZhdGUgX3N1YmplY3QgPSBuZXcgU3ViamVjdDxUYWJsZURhdGFFbnRyeVtdPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBvcHRpb25zOiB7XG4gICAgICBtYXg6IG51bWJlcjtcbiAgICAgIG5ld0l0ZW1PblRvcDogYm9vbGVhbjtcbiAgICB9ID0ge1xuICAgICAgbWF4OiAtMSxcbiAgICAgIG5ld0l0ZW1PblRvcDogdHJ1ZSxcbiAgICB9XG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBhZGQoaXRlbTogVGFibGVEYXRhRW50cnkpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLm5ld0l0ZW1PblRvcCkge1xuICAgICAgdGhpcy5fZGF0YS51bnNoaWZ0KGl0ZW0pO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5tYXggPj0gMCAmJiB0aGlzLl9kYXRhLmxlbmd0aCA+IHRoaXMub3B0aW9ucy5tYXgpIHtcbiAgICAgICAgdGhpcy5fZGF0YS5wb3AoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZGF0YS5wdXNoKGl0ZW0pO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5tYXggPj0gMCAmJiB0aGlzLl9kYXRhLmxlbmd0aCA+IHRoaXMub3B0aW9ucy5tYXgpIHtcbiAgICAgICAgdGhpcy5fZGF0YS5zaGlmdCgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9zdWJqZWN0Lm5leHQodGhpcy5fZGF0YSk7XG4gICAgLy8gZGVidWcoYEFkZGluZyB2YWx1ZXM6IGAsIGl0ZW0pXG4gIH1cblxuICBzZXQgZGF0YShkOiBUYWJsZURhdGFFbnRyeVtdKSB7XG4gICAgdGhpcy5fZGF0YSA9IGQ7XG4gICAgdGhpcy5fc3ViamVjdC5uZXh0KHRoaXMuX2RhdGEpO1xuICB9XG5cbiAgY29ubmVjdCgpOiBPYnNlcnZhYmxlPFRhYmxlRGF0YUVudHJ5W10+IHtcbiAgICByZXR1cm4gdGhpcy5fc3ViamVjdDtcbiAgfVxuXG4gIHJlZnJlc2goKSB7XG4gICAgdGhpcy5fZGF0YSA9IFsuLi50aGlzLl9kYXRhXTtcbiAgICB0aGlzLl9zdWJqZWN0Lm5leHQodGhpcy5fZGF0YSk7XG4gIH1cblxuICBkaXNjb25uZWN0KCkge31cblxuICBjbGVhcigpIHtcbiAgICB0aGlzLl9kYXRhID0gW107XG4gICAgdGhpcy5fc3ViamVjdC5uZXh0KHRoaXMuX2RhdGEpO1xuICB9XG59XG4iLCI8bWF0LXRhYmxlXG4gICpuZ0lmPVwiY29sdW1ucyAmJiBjb2x1bW5zLmxlbmd0aCA+IDBcIlxuICBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCJcbiAgI3RhYmxlXG4+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnNcIlxuICAgIFtjZGtDb2x1bW5EZWZdPVwiY29sdW1uLmNvbHVtbkRlZlwiXG4gID5cbiAgICA8bWF0LWhlYWRlci1jZWxsICpjZGtIZWFkZXJDZWxsRGVmPnt7IGNvbHVtbi5oZWFkZXIgfX08L21hdC1oZWFkZXItY2VsbD5cbiAgICA8bWF0LWNlbGwgKmNka0NlbGxEZWY9XCJsZXQgcm93XCI+e3sgY29sdW1uLmNlbGwocm93KSB9fTwvbWF0LWNlbGw+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1uc1wiPjwvbWF0LWhlYWRlci1yb3c+XG4gIDxtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zXCI+PC9tYXQtcm93PlxuPC9tYXQtdGFibGU+XG4iXX0=