@iotize/ionic
Version:
Iotize specific building blocks on top of @ionic/angular.
162 lines • 21.7 kB
JavaScript
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 {
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();
}
}
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;
}
constructor() {
/** Table columns */
this.columns = undefined;
this.dataSource = new MonitoringTableComponentDataSource();
/** Column definitions in order */
this.displayedColumns = [];
this.date = true;
}
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 */ MonitoringTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MonitoringTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ MonitoringTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", 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: ["sticky", "cdkColumnDef", "stickyEnd"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", 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: function () { return []; }, 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 {
constructor(options = {
max: -1,
newItemOnTop: true,
}) {
super();
this.options = options;
this._data = [];
this._subject = new Subject();
}
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uaXRvcmluZy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pb3RpemUtaW9uaWMvbW9uaXRvcmluZy9zcmMvbGliL3VpLWNvbXBvbmVudHMvbW9uaXRvcmluZy10YWJsZS9tb25pdG9yaW5nLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9tb25pdG9yaW5nL3NyYy9saWIvdWktY29tcG9uZW50cy9tb25pdG9yaW5nLXRhYmxlL21vbml0b3JpbmctdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUxRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDOzs7OztBQWtCcEMsTUFBTSxPQUFPLHdCQUF3QjtJQU1uQyxJQUFhLFVBQVUsQ0FBQyxPQUFrQztRQUN4RCxJQUFJLE9BQU8sRUFBRTtZQUNYLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNqQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7YUFDckI7WUFDRCxLQUFLLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRTtnQkFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLEdBQUcsQ0FBQyxFQUFFO29CQUN6RCxLQUFLLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxtQkFBbUIsRUFBRSxJQUFJ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QyxDQUFDO1FBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxPQUFPO1FBQ0wsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsVUFBVSxLQUFJLENBQUM7SUFFZixLQUFLO1FBQ0gsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9jZGsvdGFibGUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgY29tYmluZUxhdGVzdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQWJzdHJhY3RWYXJpYWJsZSB9IGZyb20gJ0Bpb3RpemUvdGFwL2RhdGEnO1xuaW1wb3J0IHsgZGVidWcgfSBmcm9tICcuLi8uLi9kZWJ1Zyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVEYXRhRW50cnkge1xuICBfX2RhdGU/OiBudW1iZXI7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUYWJsZUNvbHVtblR5cGUge1xuICBoZWFkZXI6IHN0cmluZztcbiAgY29sdW1uRGVmOiBzdHJpbmc7XG4gIGNlbGw6IChyb3c6IGFueSkgPT4gc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0YXAtYXBwLW1vbml0b3JpbmctdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vbW9uaXRvcmluZy10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21vbml0b3JpbmctdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgTW9uaXRvcmluZ1RhYmxlQ29tcG9uZW50IHtcbiAgLyoqIFRhYmxlIGNvbHVtbnMgKi9cbiAgQElucHV0KCkgY29sdW1ucz86IFRhYmxlQ29sdW1uVHlwZVtdID0gdW5kZWZpbmVkO1xuXG4gIEBJbnB1dCgpIGRhdGFTb3VyY2UgPSBuZXcgTW9uaXRvcmluZ1RhYmxlQ29tcG9uZW50RGF0YVNvdXJjZSgpO1xuXG4gIEBJbnB1dCgpIHNldCBjb2x1bW5zTWFwKG1hcHBpbmc6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pIHtcbiAgICBpZiAobWFwcGluZykge1xuICAgICAgaWYgKCF0aGlzLmNvbHVtbnMpIHtcbiAgICAgICAgdGhpcy5zZXR1cENvbHVtbnMoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIG1hcHBpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbHVtbnM/LmZpbmQoKGluZm8pID0+IGluZm8uY29sdW1uRGVmID09PSBrZXkpKSB7XG4gICAgICAgICAgZGVidWcoJ0NvbHVtbiAnLCBrZXksICdpcyBub3QgaW4gY29sdW1ucycsIHRoaXMuY29sdW1ucyk7XG4gICAgICAgICAgdGhpcy5hZGRDb2x1bW4oa2V5LCBtYXBwaW5nW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBSZW1vdmluZyBvbGQgY29sdW1uc1xuICAgICAgY29uc3QgdG9SZW1vdmU6IG51bWJlcltdID0gW107XG4gICAgICB0aGlzLmNvbHVtbnM/LmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKCEoY29sdW1uLmNvbHVtbkRlZiBpbiBtYXBwaW5nKSkge1xuICAgICAgICAgIGRlYnVnKCdEZWxldGluZyBjb2x1bW46ICcsIGNvbHVtbik7XG4gICAgICAgICAgdG9SZW1vdmUucHVzaChpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdG9SZW1vdmUucmV2ZXJzZSgpLmZvckVhY2goKGluZGV4KSA9PiB0aGlzLmNvbHVtbnM/LnNwbGljZShpbmRleCwgMSkpO1xuICAgICAgLy8gZGVidWcoYENPTFVNTlM6YCwgdGhpcy5jb2x1bW5zKVxuICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gdGhpcy5jb2x1bW5zPy5tYXAoKHgpID0+IHguY29sdW1uRGVmKTtcblxuICAgICAgLy8gcmVmcmVzaCBkYXRhXG4gICAgICB0aGlzLmRhdGFTb3VyY2UucmVmcmVzaCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDb2x1bW4gZGVmaW5pdGlvbnMgaW4gb3JkZXIgKi9cbiAgQElucHV0KCkgZGlzcGxheWVkQ29sdW1uczogc3RyaW5nW10gfCB1bmRlZmluZWQgPSBbXTtcblxuICBASW5wdXQoKSBzZXQgdmFyaWFibGVzKHZhcmlhYmxlczogQWJzdHJhY3RWYXJpYWJsZTxhbnk+W10pIHtcbiAgICBjb21iaW5lTGF0ZXN0KHZhcmlhYmxlcy5tYXAoKHZhcmlhYmxlKSA9PiB2YXJpYWJsZS52YWx1ZXMpKS5zdWJzY3JpYmUoXG4gICAgICAodmFsdWVzKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNvbHVtbnMpIHtcbiAgICAgICAgICBjb25zdCBpdGVtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbHVtbiwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbHVtbi5jb2x1bW5EZWYgPT09ICdfX2RhdGUnKSB7XG4gICAgICAgICAgICAgIGl0ZW1bY29sdW1uLmNvbHVtbkRlZl0gPSBuZXcgRGF0ZSgpLnRvTG9jYWxlVGltZVN0cmluZygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaXRlbVtjb2x1bW4uY29sdW1uRGVmXSA9IHZhbHVlc1tpbmRleCAtICh0aGlzLmRhdGUgPyAxIDogMCldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5hZGQoaXRlbSBhcyBUYWJsZURhdGFFbnRyeSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGRhdGEkKHN0cmVhbTogT2JzZXJ2YWJsZTxhbnk+KSB7XG4gICAgaWYgKHN0cmVhbSkge1xuICAgICAgc3RyZWFtLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY29sdW1ucykge1xuICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5hZGQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZGF0YShkYXRhOiBUYWJsZURhdGFFbnRyeVtdKSB7XG4gICAgZGVidWcoJ1NldHRpbmcgdGFibGUgZGF0YTogJywgZGF0YSk7XG4gICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBkYXRhO1xuICB9XG5cbiAgQElucHV0KCkgZGF0ZSA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIHByaXZhdGUgc2V0dXBDb2x1bW5zKCkge1xuICAgIGRlYnVnKCdzZXR1cENvbHVtbnMnKTtcbiAgICBpZiAodGhpcy5jb2x1bW5zKSB7XG4gICAgICB0aGlzLmNvbHVtbnMuc3BsaWNlKDAsIHRoaXMuY29sdW1ucy5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbHVtbnMgPSBbXTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0ZSkge1xuICAgICAgdGhpcy5hZGRDb2x1bW4oJ19fZGF0ZScsICdEYXRlJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRDb2x1bW4oaWQ6IHN0cmluZywgaGVhZGVyOiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghdGhpcy5jb2x1bW5zKSB7XG4gICAgICB0aGlzLmNvbHVtbnMgPSBbXTtcbiAgICB9XG4gICAgY29uc3QgY29sdW1uSW5mbyA9IHtcbiAgICAgIGhlYWRlcjogaGVhZGVyLFxuICAgICAgY29sdW1uRGVmOiBpZCxcbiAgICAgIGNlbGw6IChyb3c6IGFueSkgPT4gYCR7cm93W2lkXX1gLFxuICAgIH07XG4gICAgdGhpcy5jb2x1bW5zLnB1c2goY29sdW1uSW5mbyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1vbml0b3JpbmdUYWJsZUNvbXBvbmVudERhdGFTb3VyY2UgZXh0ZW5kcyBEYXRhU291cmNlPFRhYmxlRGF0YUVudHJ5PiB7XG4gIF9kYXRhOiBUYWJsZURhdGFFbnRyeVtdID0gW107XG5cbiAgcHJpdmF0ZSBfc3ViamVjdCA9IG5ldyBTdWJqZWN0PFRhYmxlRGF0YUVudHJ5W10+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG9wdGlvbnM6IHtcbiAgICAgIG1heDogbnVtYmVyO1xuICAgICAgbmV3SXRlbU9uVG9wOiBib29sZWFuO1xuICAgIH0gPSB7XG4gICAgICBtYXg6IC0xLFxuICAgICAgbmV3SXRlbU9uVG9wOiB0cnVlLFxuICAgIH1cbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIGFkZChpdGVtOiBUYWJsZURhdGFFbnRyeSkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMubmV3SXRlbU9uVG9wKSB7XG4gICAgICB0aGlzLl9kYXRhLnVuc2hpZnQoaXRlbSk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm1heCA+PSAwICYmIHRoaXMuX2RhdGEubGVuZ3RoID4gdGhpcy5vcHRpb25zLm1heCkge1xuICAgICAgICB0aGlzLl9kYXRhLnBvcCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9kYXRhLnB1c2goaXRlbSk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm1heCA+PSAwICYmIHRoaXMuX2RhdGEubGVuZ3RoID4gdGhpcy5vcHRpb25zLm1heCkge1xuICAgICAgICB0aGlzLl9kYXRhLnNoaWZ0KCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3N1YmplY3QubmV4dCh0aGlzLl9kYXRhKTtcbiAgICAvLyBkZWJ1ZyhgQWRkaW5nIHZhbHVlczogYCwgaXRlbSlcbiAgfVxuXG4gIHNldCBkYXRhKGQ6IFRhYmxlRGF0YUVudHJ5W10pIHtcbiAgICB0aGlzLl9kYXRhID0gZDtcbiAgICB0aGlzLl9zdWJqZWN0Lm5leHQodGhpcy5fZGF0YSk7XG4gIH1cblxuICBjb25uZWN0KCk6IE9ic2VydmFibGU8VGFibGVEYXRhRW50cnlbXT4ge1xuICAgIHJldHVybiB0aGlzLl9zdWJqZWN0O1xuICB9XG5cbiAgcmVmcmVzaCgpIHtcbiAgICB0aGlzLl9kYXRhID0gWy4uLnRoaXMuX2RhdGFdO1xuICAgIHRoaXMuX3N1YmplY3QubmV4dCh0aGlzLl9kYXRhKTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3QoKSB7fVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuX2RhdGEgPSBbXTtcbiAgICB0aGlzLl9zdWJqZWN0Lm5leHQodGhpcy5fZGF0YSk7XG4gIH1cbn1cbiIsIjxtYXQtdGFibGVcbiAgKm5nSWY9XCJjb2x1bW5zICYmIGNvbHVtbnMubGVuZ3RoID4gMFwiXG4gIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIlxuICAjdGFibGVcbj5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uc1wiXG4gICAgW2Nka0NvbHVtbkRlZl09XCJjb2x1bW4uY29sdW1uRGVmXCJcbiAgPlxuICAgIDxtYXQtaGVhZGVyLWNlbGwgKmNka0hlYWRlckNlbGxEZWY+e3sgY29sdW1uLmhlYWRlciB9fTwvbWF0LWhlYWRlci1jZWxsPlxuICAgIDxtYXQtY2VsbCAqY2RrQ2VsbERlZj1cImxldCByb3dcIj57eyBjb2x1bW4uY2VsbChyb3cpIH19PC9tYXQtY2VsbD5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCI+PC9tYXQtaGVhZGVyLXJvdz5cbiAgPG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnNcIj48L21hdC1yb3c+XG48L21hdC10YWJsZT5cbiJdfQ==