carbon-components-angular
Version:
Next generation components
236 lines • 21.5 kB
JavaScript
import { Component, Input, EventEmitter, Output } from "@angular/core";
import * as i0 from "@angular/core";
import * as i1 from "carbon-components-angular/i18n";
import * as i2 from "@angular/common";
import * as i3 from "../expanded-row-hover.directive";
import * as i4 from "./table-row.component";
import * as i5 from "./table-expanded-row.component";
export class TableBody {
constructor(i18n) {
this.i18n = i18n;
/**
* Controls whether to enable multiple or single row selection.
*/
this.enableSingleSelect = false;
/**
* Controls whether to show the selection checkboxes column or not.
*/
this.showSelectionColumn = true;
/**
* Size of the table rows.
*/
this.size = "md";
this.skeleton = false;
/**
* Enables Carbon styles when the first column is an AI decorator column (`TableItem.hasAILabelDecorator`).
*/
this.withRowAILabels = false;
/**
* Emits if a single row is selected.
*
* @param ({model: this.model, selectedRowIndex: index})
*/
this.selectRow = new EventEmitter();
/**
* Emits if a single row is deselected.
*
* @param ({model: this.model, deselectedRowIndex: index})
*/
this.deselectRow = new EventEmitter();
/**
* Emits if a row item excluding expandButtons, checkboxes, or radios is clicked.
*/
this.rowClick = new EventEmitter();
this._checkboxRowLabel = this.i18n.getOverridable("TABLE.CHECKBOX_ROW");
this._expandButtonAriaLabel = this.i18n.getOverridable("TABLE.EXPAND_BUTTON");
}
set expandButtonAriaLabel(value) {
this._expandButtonAriaLabel.override(value);
}
get expandButtonAriaLabel() {
return this._expandButtonAriaLabel.value;
}
set checkboxRowLabel(value) {
this._checkboxRowLabel.override(value);
}
get checkboxRowLabel() {
return this._checkboxRowLabel.value;
}
/**
* Triggered when a single row is clicked.
* Updates the header checkbox state.
* Emits the `selectRow` or `deselectRow` event.
*/
onRowCheckboxChange(index) {
if (this.model.isRowSelected(index)) {
this.deselectRow.emit({ model: this.model, deselectedRowIndex: index });
}
else {
this.selectRow.emit({ model: this.model, selectedRowIndex: index });
}
}
onRowClick(index) {
this.rowClick.emit(index);
}
getCheckboxRowLabel() {
return this._checkboxRowLabel.subject;
}
getExpandButtonAriaLabel() {
return this._expandButtonAriaLabel.subject;
}
firstExpandedDataInRow(row) {
const found = row.find(d => d.expandedData);
if (found) {
return found.expandedData;
}
return found;
}
shouldExpandAsTable(row) {
return row.some(d => d.expandAsTable);
}
}
TableBody.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TableBody, deps: [{ token: i1.I18n }], target: i0.ɵɵFactoryTarget.Component });
TableBody.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TableBody, selector: "[cdsTableBody], [ibmTableBody]", inputs: { model: "model", enableSingleSelect: "enableSingleSelect", expandButtonAriaLabel: "expandButtonAriaLabel", checkboxRowLabel: "checkboxRowLabel", showSelectionColumn: "showSelectionColumn", size: "size", selectionLabelColumn: "selectionLabelColumn", skeleton: "skeleton", withRowAILabels: "withRowAILabels" }, outputs: { selectRow: "selectRow", deselectRow: "deselectRow", rowClick: "rowClick" }, ngImport: i0, template: `
<ng-container *ngIf="model">
<ng-container *ngFor="let row of model.data; let i = index">
<tr
cdsTableRow
[model]="model"
[row]="row"
[size]="size"
[selected]="model.isRowSelected(i)"
[expandable]="model.isRowExpandable(i)"
[expanded]="model.isRowExpanded(i)"
[checkboxLabel]="getCheckboxRowLabel()"
[expandButtonAriaLabel]="getExpandButtonAriaLabel()"
[showSelectionColumn]="showSelectionColumn"
[enableSingleSelect]="enableSingleSelect"
[skeleton]="skeleton"
[withRowAILabels]="withRowAILabels"
(selectRow)="onRowCheckboxChange(i)"
(deselectRow)="onRowCheckboxChange(i)"
(expandRow)="model.expandRow(i, !model.isRowExpanded(i))"
(rowClick)="onRowClick(i)"
*ngIf="!model.isRowFiltered(i)"
[class]="(model.rowsClass[i] ? model.rowsClass[i] : null)"
[ngClass]="{
'tbody_row--success': !model.isRowSelected(i) && model.getRowContext(i) === 'success',
'tbody_row--warning': !model.isRowSelected(i) && model.getRowContext(i) === 'warning',
'tbody_row--info': !model.isRowSelected(i) && model.getRowContext(i) === 'info',
'tbody_row--error': !model.isRowSelected(i) && model.getRowContext(i) === 'error'
}">
</tr>
<tr
*ngIf="model.isRowExpandable(i) && !shouldExpandAsTable(row) && !model.isRowFiltered(i)"
cdsTableExpandedRow
cdsExpandedRowHover
[row]="row"
[expanded]="model.isRowExpanded(i)"
[skeleton]="skeleton">
</tr>
<ng-container
*ngIf="model.isRowExpandable(i) && shouldExpandAsTable(row) && model.isRowExpanded(i) && !model.isRowFiltered(i)">
<tr
*ngFor="let expandedDataRow of firstExpandedDataInRow(row)"
cdsTableRow
[model]="model"
[showSelectionColumnCheckbox]="false"
[showSelectionColumn]="showSelectionColumn"
[row]="expandedDataRow"
[size]="size"
[skeleton]="skeleton"
[withRowAILabels]="withRowAILabels">
</tr>
</ng-container>
</ng-container>
</ng-container>
<ng-content></ng-content>
`, isInline: true, dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ExpandedRowHover, selector: "[cdsExpandedRowHover], [ibmExpandedRowHover]" }, { kind: "component", type: i4.TableRowComponent, selector: "[cdsTableRow], [ibmTableRow]", inputs: ["model", "row", "expanded", "expandable", "selected", "size", "enableSingleSelect", "expandButtonAriaLabel", "checkboxLabel", "showSelectionColumn", "showSelectionColumnCheckbox", "selectionLabelColumn", "skeleton", "withRowAILabels"], outputs: ["selectRow", "deselectRow", "expandRow", "rowClick"] }, { kind: "component", type: i5.TableExpandedRow, selector: "[cdsTableExpandedRow], [ibmTableExpandedRow]", inputs: ["row", "skeleton", "expanded"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TableBody, decorators: [{
type: Component,
args: [{
// tslint:disable-next-line: component-selector
selector: "[cdsTableBody], [ibmTableBody]",
template: `
<ng-container *ngIf="model">
<ng-container *ngFor="let row of model.data; let i = index">
<tr
cdsTableRow
[model]="model"
[row]="row"
[size]="size"
[selected]="model.isRowSelected(i)"
[expandable]="model.isRowExpandable(i)"
[expanded]="model.isRowExpanded(i)"
[checkboxLabel]="getCheckboxRowLabel()"
[expandButtonAriaLabel]="getExpandButtonAriaLabel()"
[showSelectionColumn]="showSelectionColumn"
[enableSingleSelect]="enableSingleSelect"
[skeleton]="skeleton"
[withRowAILabels]="withRowAILabels"
(selectRow)="onRowCheckboxChange(i)"
(deselectRow)="onRowCheckboxChange(i)"
(expandRow)="model.expandRow(i, !model.isRowExpanded(i))"
(rowClick)="onRowClick(i)"
*ngIf="!model.isRowFiltered(i)"
[class]="(model.rowsClass[i] ? model.rowsClass[i] : null)"
[ngClass]="{
'tbody_row--success': !model.isRowSelected(i) && model.getRowContext(i) === 'success',
'tbody_row--warning': !model.isRowSelected(i) && model.getRowContext(i) === 'warning',
'tbody_row--info': !model.isRowSelected(i) && model.getRowContext(i) === 'info',
'tbody_row--error': !model.isRowSelected(i) && model.getRowContext(i) === 'error'
}">
</tr>
<tr
*ngIf="model.isRowExpandable(i) && !shouldExpandAsTable(row) && !model.isRowFiltered(i)"
cdsTableExpandedRow
cdsExpandedRowHover
[row]="row"
[expanded]="model.isRowExpanded(i)"
[skeleton]="skeleton">
</tr>
<ng-container
*ngIf="model.isRowExpandable(i) && shouldExpandAsTable(row) && model.isRowExpanded(i) && !model.isRowFiltered(i)">
<tr
*ngFor="let expandedDataRow of firstExpandedDataInRow(row)"
cdsTableRow
[model]="model"
[showSelectionColumnCheckbox]="false"
[showSelectionColumn]="showSelectionColumn"
[row]="expandedDataRow"
[size]="size"
[skeleton]="skeleton"
[withRowAILabels]="withRowAILabels">
</tr>
</ng-container>
</ng-container>
</ng-container>
<ng-content></ng-content>
`
}]
}], ctorParameters: function () { return [{ type: i1.I18n }]; }, propDecorators: { model: [{
type: Input
}], enableSingleSelect: [{
type: Input
}], expandButtonAriaLabel: [{
type: Input
}], checkboxRowLabel: [{
type: Input
}], showSelectionColumn: [{
type: Input
}], size: [{
type: Input
}], selectionLabelColumn: [{
type: Input
}], skeleton: [{
type: Input
}], withRowAILabels: [{
type: Input
}], selectRow: [{
type: Output
}], deselectRow: [{
type: Output
}], rowClick: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtYm9keS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdGFibGUvYm9keS90YWJsZS1ib2R5LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sU0FBUyxFQUNULEtBQUssRUFDTCxZQUFZLEVBQ1osTUFBTSxFQUNOLE1BQU0sZUFBZSxDQUFDOzs7Ozs7O0FBa0V2QixNQUFNLE9BQU8sU0FBUztJQTZFckIsWUFBc0IsSUFBVTtRQUFWLFNBQUksR0FBSixJQUFJLENBQU07UUExRWhDOztXQUVHO1FBQ00sdUJBQWtCLEdBQUcsS0FBSyxDQUFDO1FBb0JwQzs7V0FFRztRQUNNLHdCQUFtQixHQUFHLElBQUksQ0FBQztRQUVwQzs7V0FFRztRQUNNLFNBQUksR0FBaUIsSUFBSSxDQUFDO1FBYzFCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFMUI7O1dBRUc7UUFDTSxvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUVqQzs7OztXQUlHO1FBQ08sY0FBUyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFFakQ7Ozs7V0FJRztRQUNPLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUVuRDs7V0FFRztRQUNPLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRXRDLHNCQUFpQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDbkUsMkJBQXNCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUUvQyxDQUFDO0lBckVyQyxJQUNJLHFCQUFxQixDQUFDLEtBQWtDO1FBQzNELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELElBQUkscUJBQXFCO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFDSSxnQkFBZ0IsQ0FBQyxLQUFrQztRQUN0RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxJQUFJLGdCQUFnQjtRQUNuQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUM7SUFDckMsQ0FBQztJQXVERDs7OztPQUlHO0lBQ0gsbUJBQW1CLENBQUMsS0FBYTtRQUNoQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUN4RTthQUFNO1lBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQ3BFO0lBQ0YsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFhO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRCxtQkFBbUI7UUFDbEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCx3QkFBd0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDO0lBQzVDLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxHQUFHO1FBQ3pCLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDNUMsSUFBSSxLQUFLLEVBQUU7WUFDVixPQUFPLEtBQUssQ0FBQyxZQUFZLENBQUM7U0FDMUI7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNkLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxHQUFHO1FBQ3RCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN2QyxDQUFDOztzR0FsSFcsU0FBUzswRkFBVCxTQUFTLDJkQXpEWDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXVEVDsyRkFFVyxTQUFTO2tCQTVEckIsU0FBUzttQkFBQztvQkFDViwrQ0FBK0M7b0JBQy9DLFFBQVEsRUFBRSxnQ0FBZ0M7b0JBQzFDLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXVEVDtpQkFDRDsyRkFFUyxLQUFLO3NCQUFiLEtBQUs7Z0JBS0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUdGLHFCQUFxQjtzQkFEeEIsS0FBSztnQkFVRixnQkFBZ0I7c0JBRG5CLEtBQUs7Z0JBWUcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUtHLElBQUk7c0JBQVosS0FBSztnQkFZRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFLRyxlQUFlO3NCQUF2QixLQUFLO2dCQU9JLFNBQVM7c0JBQWxCLE1BQU07Z0JBT0csV0FBVztzQkFBcEIsTUFBTTtnQkFLRyxRQUFRO3NCQUFqQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q29tcG9uZW50LFxuXHRJbnB1dCxcblx0RXZlbnRFbWl0dGVyLFxuXHRPdXRwdXRcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFRhYmxlTW9kZWwgfSBmcm9tIFwiLi4vdGFibGUtbW9kZWwuY2xhc3NcIjtcbmltcG9ydCB7IEkxOG4sIE92ZXJyaWRhYmxlIH0gZnJvbSBcImNhcmJvbi1jb21wb25lbnRzLWFuZ3VsYXIvaTE4blwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBUYWJsZVJvd1NpemUgfSBmcm9tIFwiLi4vdGFibGUudHlwZXNcIjtcblxuQENvbXBvbmVudCh7XG5cdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogY29tcG9uZW50LXNlbGVjdG9yXG5cdHNlbGVjdG9yOiBcIltjZHNUYWJsZUJvZHldLCBbaWJtVGFibGVCb2R5XVwiLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJtb2RlbFwiPlxuXHRcdFx0PG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcm93IG9mIG1vZGVsLmRhdGE7IGxldCBpID0gaW5kZXhcIj5cblx0XHRcdFx0PHRyXG5cdFx0XHRcdFx0Y2RzVGFibGVSb3dcblx0XHRcdFx0XHRbbW9kZWxdPVwibW9kZWxcIlxuXHRcdFx0XHRcdFtyb3ddPVwicm93XCJcblx0XHRcdFx0XHRbc2l6ZV09XCJzaXplXCJcblx0XHRcdFx0XHRbc2VsZWN0ZWRdPVwibW9kZWwuaXNSb3dTZWxlY3RlZChpKVwiXG5cdFx0XHRcdFx0W2V4cGFuZGFibGVdPVwibW9kZWwuaXNSb3dFeHBhbmRhYmxlKGkpXCJcblx0XHRcdFx0XHRbZXhwYW5kZWRdPVwibW9kZWwuaXNSb3dFeHBhbmRlZChpKVwiXG5cdFx0XHRcdFx0W2NoZWNrYm94TGFiZWxdPVwiZ2V0Q2hlY2tib3hSb3dMYWJlbCgpXCJcblx0XHRcdFx0XHRbZXhwYW5kQnV0dG9uQXJpYUxhYmVsXT1cImdldEV4cGFuZEJ1dHRvbkFyaWFMYWJlbCgpXCJcblx0XHRcdFx0XHRbc2hvd1NlbGVjdGlvbkNvbHVtbl09XCJzaG93U2VsZWN0aW9uQ29sdW1uXCJcblx0XHRcdFx0XHRbZW5hYmxlU2luZ2xlU2VsZWN0XT1cImVuYWJsZVNpbmdsZVNlbGVjdFwiXG5cdFx0XHRcdFx0W3NrZWxldG9uXT1cInNrZWxldG9uXCJcblx0XHRcdFx0XHRbd2l0aFJvd0FJTGFiZWxzXT1cIndpdGhSb3dBSUxhYmVsc1wiXG5cdFx0XHRcdFx0KHNlbGVjdFJvdyk9XCJvblJvd0NoZWNrYm94Q2hhbmdlKGkpXCJcblx0XHRcdFx0XHQoZGVzZWxlY3RSb3cpPVwib25Sb3dDaGVja2JveENoYW5nZShpKVwiXG5cdFx0XHRcdFx0KGV4cGFuZFJvdyk9XCJtb2RlbC5leHBhbmRSb3coaSwgIW1vZGVsLmlzUm93RXhwYW5kZWQoaSkpXCJcblx0XHRcdFx0XHQocm93Q2xpY2spPVwib25Sb3dDbGljayhpKVwiXG5cdFx0XHRcdFx0Km5nSWY9XCIhbW9kZWwuaXNSb3dGaWx0ZXJlZChpKVwiXG5cdFx0XHRcdFx0W2NsYXNzXT1cIihtb2RlbC5yb3dzQ2xhc3NbaV0gPyBtb2RlbC5yb3dzQ2xhc3NbaV0gOiBudWxsKVwiXG5cdFx0XHRcdFx0W25nQ2xhc3NdPVwie1xuXHRcdFx0XHRcdFx0J3Rib2R5X3Jvdy0tc3VjY2Vzcyc6ICFtb2RlbC5pc1Jvd1NlbGVjdGVkKGkpICYmIG1vZGVsLmdldFJvd0NvbnRleHQoaSkgPT09ICdzdWNjZXNzJyxcblx0XHRcdFx0XHRcdCd0Ym9keV9yb3ctLXdhcm5pbmcnOiAhbW9kZWwuaXNSb3dTZWxlY3RlZChpKSAmJiBtb2RlbC5nZXRSb3dDb250ZXh0KGkpID09PSAnd2FybmluZycsXG5cdFx0XHRcdFx0XHQndGJvZHlfcm93LS1pbmZvJzogIW1vZGVsLmlzUm93U2VsZWN0ZWQoaSkgJiYgbW9kZWwuZ2V0Um93Q29udGV4dChpKSA9PT0gJ2luZm8nLFxuXHRcdFx0XHRcdFx0J3Rib2R5X3Jvdy0tZXJyb3InOiAhbW9kZWwuaXNSb3dTZWxlY3RlZChpKSAmJiBtb2RlbC5nZXRSb3dDb250ZXh0KGkpID09PSAnZXJyb3InXG5cdFx0XHRcdFx0fVwiPlxuXHRcdFx0XHQ8L3RyPlxuXHRcdFx0XHQ8dHJcblx0XHRcdFx0XHQqbmdJZj1cIm1vZGVsLmlzUm93RXhwYW5kYWJsZShpKSAmJiAhc2hvdWxkRXhwYW5kQXNUYWJsZShyb3cpICYmICFtb2RlbC5pc1Jvd0ZpbHRlcmVkKGkpXCJcblx0XHRcdFx0XHRjZHNUYWJsZUV4cGFuZGVkUm93XG5cdFx0XHRcdFx0Y2RzRXhwYW5kZWRSb3dIb3ZlclxuXHRcdFx0XHRcdFtyb3ddPVwicm93XCJcblx0XHRcdFx0XHRbZXhwYW5kZWRdPVwibW9kZWwuaXNSb3dFeHBhbmRlZChpKVwiXG5cdFx0XHRcdFx0W3NrZWxldG9uXT1cInNrZWxldG9uXCI+XG5cdFx0XHRcdDwvdHI+XG5cdFx0XHRcdDxuZy1jb250YWluZXJcblx0XHRcdFx0XHQqbmdJZj1cIm1vZGVsLmlzUm93RXhwYW5kYWJsZShpKSAmJiBzaG91bGRFeHBhbmRBc1RhYmxlKHJvdykgJiYgbW9kZWwuaXNSb3dFeHBhbmRlZChpKSAmJiAhbW9kZWwuaXNSb3dGaWx0ZXJlZChpKVwiPlxuXHRcdFx0XHRcdDx0clxuXHRcdFx0XHRcdFx0Km5nRm9yPVwibGV0IGV4cGFuZGVkRGF0YVJvdyBvZiBmaXJzdEV4cGFuZGVkRGF0YUluUm93KHJvdylcIlxuXHRcdFx0XHRcdFx0Y2RzVGFibGVSb3dcblx0XHRcdFx0XHRcdFttb2RlbF09XCJtb2RlbFwiXG5cdFx0XHRcdFx0XHRbc2hvd1NlbGVjdGlvbkNvbHVtbkNoZWNrYm94XT1cImZhbHNlXCJcblx0XHRcdFx0XHRcdFtzaG93U2VsZWN0aW9uQ29sdW1uXT1cInNob3dTZWxlY3Rpb25Db2x1bW5cIlxuXHRcdFx0XHRcdFx0W3Jvd109XCJleHBhbmRlZERhdGFSb3dcIlxuXHRcdFx0XHRcdFx0W3NpemVdPVwic2l6ZVwiXG5cdFx0XHRcdFx0XHRbc2tlbGV0b25dPVwic2tlbGV0b25cIlxuXHRcdFx0XHRcdFx0W3dpdGhSb3dBSUxhYmVsc109XCJ3aXRoUm93QUlMYWJlbHNcIj5cblx0XHRcdFx0XHQ8L3RyPlxuXHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cblx0XHRcdDwvbmctY29udGFpbmVyPlxuXHRcdDwvbmctY29udGFpbmVyPlxuXHRcdDxuZy1jb250ZW50PjwvbmctY29udGVudD5cblx0YFxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZUJvZHkge1xuXHRASW5wdXQoKSBtb2RlbDogVGFibGVNb2RlbDtcblxuXHQvKipcblx0ICogQ29udHJvbHMgd2hldGhlciB0byBlbmFibGUgbXVsdGlwbGUgb3Igc2luZ2xlIHJvdyBzZWxlY3Rpb24uXG5cdCAqL1xuXHRASW5wdXQoKSBlbmFibGVTaW5nbGVTZWxlY3QgPSBmYWxzZTtcblxuXHRASW5wdXQoKVxuXHRzZXQgZXhwYW5kQnV0dG9uQXJpYUxhYmVsKHZhbHVlOiBzdHJpbmcgfCBPYnNlcnZhYmxlPHN0cmluZz4pIHtcblx0XHR0aGlzLl9leHBhbmRCdXR0b25BcmlhTGFiZWwub3ZlcnJpZGUodmFsdWUpO1xuXHR9XG5cblx0Z2V0IGV4cGFuZEJ1dHRvbkFyaWFMYWJlbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fZXhwYW5kQnV0dG9uQXJpYUxhYmVsLnZhbHVlO1xuXHR9XG5cblx0QElucHV0KClcblx0c2V0IGNoZWNrYm94Um93TGFiZWwodmFsdWU6IHN0cmluZyB8IE9ic2VydmFibGU8c3RyaW5nPikge1xuXHRcdHRoaXMuX2NoZWNrYm94Um93TGFiZWwub3ZlcnJpZGUodmFsdWUpO1xuXHR9XG5cblx0Z2V0IGNoZWNrYm94Um93TGFiZWwoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2NoZWNrYm94Um93TGFiZWwudmFsdWU7XG5cdH1cblxuXHQvKipcblx0ICogQ29udHJvbHMgd2hldGhlciB0byBzaG93IHRoZSBzZWxlY3Rpb24gY2hlY2tib3hlcyBjb2x1bW4gb3Igbm90LlxuXHQgKi9cblx0QElucHV0KCkgc2hvd1NlbGVjdGlvbkNvbHVtbiA9IHRydWU7XG5cblx0LyoqXG5cdCAqIFNpemUgb2YgdGhlIHRhYmxlIHJvd3MuXG5cdCAqL1xuXHRASW5wdXQoKSBzaXplOiBUYWJsZVJvd1NpemUgPSBcIm1kXCI7XG5cblx0LyoqXG5cdCAqIFVzZWQgdG8gcG9wdWxhdGUgdGhlIHJvdyBzZWxlY3Rpb24gY2hlY2tib3ggbGFiZWwgd2l0aCBhIHVzZWZ1bCB2YWx1ZSBpZiBzZXQuXG5cdCAqXG5cdCAqIEV4YW1wbGU6XG5cdCAqIGBgYFxuXHQgKiA8Y2RzLXRhYmxlIFtzZWxlY3Rpb25MYWJlbENvbHVtbl09XCIwXCI+PC9jZHMtdGFibGU+XG5cdCAqIDwhLS0gcmVzdWx0cyBpbiBhcmlhLWxhYmVsPVwiU2VsZWN0IGZpcnN0IGNvbHVtbiB2YWx1ZVwiXG5cdCAqICh3aGVyZSBcImZpcnN0IGNvbHVtbiB2YWx1ZVwiIGlzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgY29sdW1uIGluIHRoZSByb3cgLS0+XG5cdCAqIGBgYFxuXHQgKi9cblx0QElucHV0KCkgc2VsZWN0aW9uTGFiZWxDb2x1bW46IG51bWJlcjtcblxuXHRASW5wdXQoKSBza2VsZXRvbiA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBFbmFibGVzIENhcmJvbiBzdHlsZXMgd2hlbiB0aGUgZmlyc3QgY29sdW1uIGlzIGFuIEFJIGRlY29yYXRvciBjb2x1bW4gKGBUYWJsZUl0ZW0uaGFzQUlMYWJlbERlY29yYXRvcmApLlxuXHQgKi9cblx0QElucHV0KCkgd2l0aFJvd0FJTGFiZWxzID0gZmFsc2U7XG5cblx0LyoqXG5cdCAqIEVtaXRzIGlmIGEgc2luZ2xlIHJvdyBpcyBzZWxlY3RlZC5cblx0ICpcblx0ICogQHBhcmFtICh7bW9kZWw6IHRoaXMubW9kZWwsIHNlbGVjdGVkUm93SW5kZXg6IGluZGV4fSlcblx0ICovXG5cdEBPdXRwdXQoKSBzZWxlY3RSb3cgPSBuZXcgRXZlbnRFbWl0dGVyPE9iamVjdD4oKTtcblxuXHQvKipcblx0ICogRW1pdHMgaWYgYSBzaW5nbGUgcm93IGlzIGRlc2VsZWN0ZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSAoe21vZGVsOiB0aGlzLm1vZGVsLCBkZXNlbGVjdGVkUm93SW5kZXg6IGluZGV4fSlcblx0ICovXG5cdEBPdXRwdXQoKSBkZXNlbGVjdFJvdyA9IG5ldyBFdmVudEVtaXR0ZXI8T2JqZWN0PigpO1xuXG5cdC8qKlxuXHQgKiBFbWl0cyBpZiBhIHJvdyBpdGVtIGV4Y2x1ZGluZyBleHBhbmRCdXR0b25zLCBjaGVja2JveGVzLCBvciByYWRpb3MgaXMgY2xpY2tlZC5cblx0ICovXG5cdEBPdXRwdXQoKSByb3dDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG5cdHByb3RlY3RlZCBfY2hlY2tib3hSb3dMYWJlbCA9IHRoaXMuaTE4bi5nZXRPdmVycmlkYWJsZShcIlRBQkxFLkNIRUNLQk9YX1JPV1wiKTtcblx0cHJvdGVjdGVkIF9leHBhbmRCdXR0b25BcmlhTGFiZWwgPSB0aGlzLmkxOG4uZ2V0T3ZlcnJpZGFibGUoXCJUQUJMRS5FWFBBTkRfQlVUVE9OXCIpO1xuXG5cdGNvbnN0cnVjdG9yKHByb3RlY3RlZCBpMThuOiBJMThuKSB7IH1cblxuXHQvKipcblx0ICogVHJpZ2dlcmVkIHdoZW4gYSBzaW5nbGUgcm93IGlzIGNsaWNrZWQuXG5cdCAqIFVwZGF0ZXMgdGhlIGhlYWRlciBjaGVja2JveCBzdGF0ZS5cblx0ICogRW1pdHMgdGhlIGBzZWxlY3RSb3dgIG9yIGBkZXNlbGVjdFJvd2AgZXZlbnQuXG5cdCAqL1xuXHRvblJvd0NoZWNrYm94Q2hhbmdlKGluZGV4OiBudW1iZXIpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5pc1Jvd1NlbGVjdGVkKGluZGV4KSkge1xuXHRcdFx0dGhpcy5kZXNlbGVjdFJvdy5lbWl0KHsgbW9kZWw6IHRoaXMubW9kZWwsIGRlc2VsZWN0ZWRSb3dJbmRleDogaW5kZXggfSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2VsZWN0Um93LmVtaXQoeyBtb2RlbDogdGhpcy5tb2RlbCwgc2VsZWN0ZWRSb3dJbmRleDogaW5kZXggfSk7XG5cdFx0fVxuXHR9XG5cblx0b25Sb3dDbGljayhpbmRleDogbnVtYmVyKSB7XG5cdFx0dGhpcy5yb3dDbGljay5lbWl0KGluZGV4KTtcblx0fVxuXG5cdGdldENoZWNrYm94Um93TGFiZWwoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcblx0XHRyZXR1cm4gdGhpcy5fY2hlY2tib3hSb3dMYWJlbC5zdWJqZWN0O1xuXHR9XG5cblx0Z2V0RXhwYW5kQnV0dG9uQXJpYUxhYmVsKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG5cdFx0cmV0dXJuIHRoaXMuX2V4cGFuZEJ1dHRvbkFyaWFMYWJlbC5zdWJqZWN0O1xuXHR9XG5cblx0Zmlyc3RFeHBhbmRlZERhdGFJblJvdyhyb3cpIHtcblx0XHRjb25zdCBmb3VuZCA9IHJvdy5maW5kKGQgPT4gZC5leHBhbmRlZERhdGEpO1xuXHRcdGlmIChmb3VuZCkge1xuXHRcdFx0cmV0dXJuIGZvdW5kLmV4cGFuZGVkRGF0YTtcblx0XHR9XG5cdFx0cmV0dXJuIGZvdW5kO1xuXHR9XG5cblx0c2hvdWxkRXhwYW5kQXNUYWJsZShyb3cpIHtcblx0XHRyZXR1cm4gcm93LnNvbWUoZCA9PiBkLmV4cGFuZEFzVGFibGUpO1xuXHR9XG59XG4iXX0=