carbon-components-angular
Version:
Next generation components
324 lines • 30.2 kB
JavaScript
import { Component, Input, Output, EventEmitter, HostBinding, ViewChild } from "@angular/core";
import { map } from "rxjs/operators";
import * as i0 from "@angular/core";
import * as i1 from "carbon-components-angular/i18n";
import * as i2 from "@angular/common";
import * as i3 from "carbon-components-angular/icon";
import * as i4 from "./table-head-cell-label.directive";
export class TableHeadCell {
constructor(i18n) {
this.i18n = i18n;
this.skeleton = false;
this.sortable = true;
/**
* Notifies that the column should be sorted
*/
this.sort = new EventEmitter();
this.theadAction = false;
this._sortDescendingLabel = this.i18n.getOverridable("TABLE.SORT_DESCENDING");
this._sortAscendingLabel = this.i18n.getOverridable("TABLE.SORT_ASCENDING");
this._filterTitle = this.i18n.getOverridable("TABLE.FILTER");
}
set sortDescendingLabel(value) {
this._sortDescendingLabel.override(value);
}
get sortDescendingLabel() {
return this._sortDescendingLabel.value;
}
set sortAscendingLabel(value) {
this._sortAscendingLabel.override(value);
}
get sortAscendingLabel() {
return this._sortAscendingLabel.value;
}
set filterTitle(value) {
this._filterTitle.override(value);
}
get filterTitle() {
return this._filterTitle.value;
}
get sortHeaderHost() {
return this.sortable && this.sort.observers.length > 0 && this.column?.sortable;
}
get sortHeaderAILabelHost() {
return this.column?.hasAILabelHeader && this.sortHeaderHost;
}
get sortHeaderDecoratorHost() {
return this.column?.hasAILabelHeader && this.column?.template && this.sortHeaderHost;
}
/**
* When the column uses a separate template for the slug/AI: label text + sort icons + `cds--table-header-label--decorator-inner`.
*/
get headerAILabelDecoratorLayout() {
return !!(this.column?.hasAILabelHeader && this.column?.template);
}
ngOnChanges() {
this.theadAction = !!(this.column && this.column.filterTemplate) || this.sort.observers.length > 0;
}
/**
* Text label for the column when `hasAILabelHeader` uses a separate `template` for the slug.
*/
getHeaderLabelText() {
if (!this.column) {
return "";
}
const d = this.column.data;
if (d != null && typeof d === "object" && "label" in d && d.label != null) {
return String(d.label);
}
if (typeof d === "string") {
return d;
}
return "";
}
getSortDescendingLabel() {
return this._sortDescendingLabel.subject.pipe(this.sortLabelMap());
}
getSortAscendingLabel() {
return this._sortAscendingLabel.subject.pipe(this.sortLabelMap());
}
/**
* Prevent focus from moving to parent button when click on decorator
*/
onDecoratorRegionClick(event) {
event.preventDefault();
event.stopPropagation();
}
onClick(event) {
if (this.skeleton) {
return;
}
if (this.column?.hasAILabelHeader &&
this.decoratorInnerRef?.nativeElement?.contains(event.target)) {
return;
}
this.sort.emit();
}
sortLabelMap() {
return map((str) => {
if (this.column.ariaSortLabel) {
return this.column.ariaSortLabel;
}
if (this.column.formatSortLabel) {
return this.column.formatSortLabel(str, this.column.ariaSortLabel);
}
const header = this.getHeaderLabelText() ||
(typeof this.column.data === "string" ? this.column.data : "");
return `${header} - ${str}`;
});
}
}
TableHeadCell.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TableHeadCell, deps: [{ token: i1.I18n }], target: i0.ɵɵFactoryTarget.Component });
TableHeadCell.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TableHeadCell, selector: "[cdsTableHeadCell], [ibmTableHeadCell]", inputs: { column: "column", skeleton: "skeleton", sortable: "sortable", sortDescendingLabel: "sortDescendingLabel", sortAscendingLabel: "sortAscendingLabel", filterTitle: "filterTitle" }, outputs: { sort: "sort" }, host: { properties: { "class.thead_action": "this.theadAction", "class.cds--table-sort__header": "this.sortHeaderHost", "class.cds--table-sort__header--ai-label": "this.sortHeaderAILabelHost", "class.cds--table-sort__header--decorator": "this.sortHeaderDecoratorHost" } }, viewQueries: [{ propertyName: "decoratorInnerRef", first: true, predicate: ["decoratorInner"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
<button
class="cds--table-sort"
*ngIf="sortable && this.sort.observers.length > 0 && column.sortable"
[attr.aria-label]="(column.sorted && column.ascending ? getSortDescendingLabel() : getSortAscendingLabel()) | async"
aria-live="polite"
[ngClass]="{
'cds--table-sort--active': column.sorted,
'cds--table-sort--descending': column.ascending
}"
(click)="onClick($event)">
<span
*ngIf="headerAILabelDecoratorLayout"
class="cds--table-sort__flex"
[title]="column.title"
tabindex="-1">
<div cdsTableHeadCellLabel>{{ getHeaderLabelText() }}</div>
<svg *ngIf="!skeleton" class="cds--table-sort__icon" cdsIcon="arrow--down"></svg>
<svg *ngIf="!skeleton" class="cds--table-sort__icon-unsorted" cdsIcon="arrows--vertical"></svg>
<div
#decoratorInner
class="cds--table-header-label--decorator-inner"
(click)="onDecoratorRegionClick($event)">
<ng-template
[ngTemplateOutlet]="column.template"
[ngTemplateOutletContext]="{data: column.data}">
</ng-template>
</div>
</span>
<span
*ngIf="!headerAILabelDecoratorLayout"
class="cds--table-sort__flex"
[title]="column.title"
tabindex="-1">
<div
*ngIf="!skeleton && !column.template"
cdsTableHeadCellLabel
[class.cds--table-header-label--ai-label]="column.hasAILabelHeader"
[class.cds--table-header-label--slug]="column.hasAILabelHeader">
{{column.data}}
</div>
<div
*ngIf="!skeleton && column.template"
cdsTableHeadCellLabel
[class.cds--table-header-label--ai-label]="column.hasAILabelHeader"
[class.cds--table-header-label--slug]="column.hasAILabelHeader">
<ng-template
[ngTemplateOutlet]="column.template"
[ngTemplateOutletContext]="{data: column.data}">
</ng-template>
</div>
<svg *ngIf="!skeleton" class="cds--table-sort__icon" cdsIcon="arrow--down"></svg>
<svg *ngIf="!skeleton" class="cds--table-sort__icon-unsorted" cdsIcon="arrows--vertical"></svg>
</span>
</button>
<div
*ngIf="headerAILabelDecoratorLayout && ((!skeleton && sort.observers.length === 0) || (sort.observers.length > 0 && !column.sortable) || !sortable)"
class="cds--table-header-label"
[ngClass]="{
'cds--table-header-label--ai-label': column.hasAILabelHeader,
'cds--table-header-label--slug': column.hasAILabelHeader,
'cds--table-header-label--decorator': column.hasAILabelHeader
}">
<span *ngIf="getHeaderLabelText()">{{ getHeaderLabelText() }}</span>
<div class="cds--table-header-label--decorator-inner">
<ng-template
[ngTemplateOutlet]="column.template"
[ngTemplateOutletContext]="{data: column.data}">
</ng-template>
</div>
</div>
<div
class="cds--table-header-label"
*ngIf="!headerAILabelDecoratorLayout && ((!skeleton && sort.observers.length === 0) || (sort.observers.length > 0 && !column.sortable) || !sortable)"
[ngClass]="{
'cds--table-header-label--ai-label': column.hasAILabelHeader,
'cds--table-header-label--slug': column.hasAILabelHeader
}">
<span *ngIf="!column.template" [title]="column.data">
<ng-container *ngIf="!skeleton">
{{column.data}}
</ng-container>
</span>
<ng-template
[ngTemplateOutlet]="column.template" [ngTemplateOutletContext]="{data: column.data}">
</ng-template>
</div>
`, isInline: true, dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "directive", type: i4.TableHeadCellLabel, selector: "[cdsTableHeadCellLabel], [ibmTableHeadCellLabel]" }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TableHeadCell, decorators: [{
type: Component,
args: [{
// tslint:disable-next-line: component-selector
selector: "[cdsTableHeadCell], [ibmTableHeadCell]",
template: `
<button
class="cds--table-sort"
*ngIf="sortable && this.sort.observers.length > 0 && column.sortable"
[attr.aria-label]="(column.sorted && column.ascending ? getSortDescendingLabel() : getSortAscendingLabel()) | async"
aria-live="polite"
[ngClass]="{
'cds--table-sort--active': column.sorted,
'cds--table-sort--descending': column.ascending
}"
(click)="onClick($event)">
<span
*ngIf="headerAILabelDecoratorLayout"
class="cds--table-sort__flex"
[title]="column.title"
tabindex="-1">
<div cdsTableHeadCellLabel>{{ getHeaderLabelText() }}</div>
<svg *ngIf="!skeleton" class="cds--table-sort__icon" cdsIcon="arrow--down"></svg>
<svg *ngIf="!skeleton" class="cds--table-sort__icon-unsorted" cdsIcon="arrows--vertical"></svg>
<div
#decoratorInner
class="cds--table-header-label--decorator-inner"
(click)="onDecoratorRegionClick($event)">
<ng-template
[ngTemplateOutlet]="column.template"
[ngTemplateOutletContext]="{data: column.data}">
</ng-template>
</div>
</span>
<span
*ngIf="!headerAILabelDecoratorLayout"
class="cds--table-sort__flex"
[title]="column.title"
tabindex="-1">
<div
*ngIf="!skeleton && !column.template"
cdsTableHeadCellLabel
[class.cds--table-header-label--ai-label]="column.hasAILabelHeader"
[class.cds--table-header-label--slug]="column.hasAILabelHeader">
{{column.data}}
</div>
<div
*ngIf="!skeleton && column.template"
cdsTableHeadCellLabel
[class.cds--table-header-label--ai-label]="column.hasAILabelHeader"
[class.cds--table-header-label--slug]="column.hasAILabelHeader">
<ng-template
[ngTemplateOutlet]="column.template"
[ngTemplateOutletContext]="{data: column.data}">
</ng-template>
</div>
<svg *ngIf="!skeleton" class="cds--table-sort__icon" cdsIcon="arrow--down"></svg>
<svg *ngIf="!skeleton" class="cds--table-sort__icon-unsorted" cdsIcon="arrows--vertical"></svg>
</span>
</button>
<div
*ngIf="headerAILabelDecoratorLayout && ((!skeleton && sort.observers.length === 0) || (sort.observers.length > 0 && !column.sortable) || !sortable)"
class="cds--table-header-label"
[ngClass]="{
'cds--table-header-label--ai-label': column.hasAILabelHeader,
'cds--table-header-label--slug': column.hasAILabelHeader,
'cds--table-header-label--decorator': column.hasAILabelHeader
}">
<span *ngIf="getHeaderLabelText()">{{ getHeaderLabelText() }}</span>
<div class="cds--table-header-label--decorator-inner">
<ng-template
[ngTemplateOutlet]="column.template"
[ngTemplateOutletContext]="{data: column.data}">
</ng-template>
</div>
</div>
<div
class="cds--table-header-label"
*ngIf="!headerAILabelDecoratorLayout && ((!skeleton && sort.observers.length === 0) || (sort.observers.length > 0 && !column.sortable) || !sortable)"
[ngClass]="{
'cds--table-header-label--ai-label': column.hasAILabelHeader,
'cds--table-header-label--slug': column.hasAILabelHeader
}">
<span *ngIf="!column.template" [title]="column.data">
<ng-container *ngIf="!skeleton">
{{column.data}}
</ng-container>
</span>
<ng-template
[ngTemplateOutlet]="column.template" [ngTemplateOutletContext]="{data: column.data}">
</ng-template>
</div>
`
}]
}], ctorParameters: function () { return [{ type: i1.I18n }]; }, propDecorators: { column: [{
type: Input
}], skeleton: [{
type: Input
}], sortable: [{
type: Input
}], sortDescendingLabel: [{
type: Input
}], sortAscendingLabel: [{
type: Input
}], filterTitle: [{
type: Input
}], sort: [{
type: Output
}], decoratorInnerRef: [{
type: ViewChild,
args: ["decoratorInner"]
}], theadAction: [{
type: HostBinding,
args: ["class.thead_action"]
}], sortHeaderHost: [{
type: HostBinding,
args: ["class.cds--table-sort__header"]
}], sortHeaderAILabelHost: [{
type: HostBinding,
args: ["class.cds--table-sort__header--ai-label"]
}], sortHeaderDecoratorHost: [{
type: HostBinding,
args: ["class.cds--table-sort__header--decorator"]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtaGVhZC1jZWxsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90YWJsZS9oZWFkL3RhYmxlLWhlYWQtY2VsbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixXQUFXLEVBRVgsU0FBUyxFQUNULE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBK0ZyQyxNQUFNLE9BQU8sYUFBYTtJQWtFekIsWUFBc0IsSUFBVTtRQUFWLFNBQUksR0FBSixJQUFJLENBQU07UUEvRHZCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFakIsYUFBUSxHQUFHLElBQUksQ0FBQztRQTZCekI7O1dBRUc7UUFDTyxTQUFJLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUlELGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBcUI3Qyx5QkFBb0IsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3pFLHdCQUFtQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDdkUsaUJBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUU5QixDQUFDO0lBM0RyQyxJQUNJLG1CQUFtQixDQUFDLEtBQWtDO1FBQ3pELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELElBQUksbUJBQW1CO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQztJQUN4QyxDQUFDO0lBRUQsSUFDSSxrQkFBa0IsQ0FBQyxLQUFrQztRQUN4RCxJQUFJLENB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TTtzQkFBZCxLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFHRixtQkFBbUI7c0JBRHRCLEtBQUs7Z0JBVUYsa0JBQWtCO3NCQURyQixLQUFLO2dCQVVGLFdBQVc7c0JBRGQsS0FBSztnQkFZSSxJQUFJO3NCQUFiLE1BQU07Z0JBRXNCLGlCQUFpQjtzQkFBN0MsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBRVEsV0FBVztzQkFBN0MsV0FBVzt1QkFBQyxvQkFBb0I7Z0JBRWlCLGNBQWM7c0JBQS9ELFdBQVc7dUJBQUMsK0JBQStCO2dCQUlnQixxQkFBcUI7c0JBQWhGLFdBQVc7dUJBQUMseUNBQXlDO2dCQUlPLHVCQUF1QjtzQkFBbkYsV0FBVzt1QkFBQywwQ0FBMEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRDb21wb25lbnQsXG5cdEVsZW1lbnRSZWYsXG5cdElucHV0LFxuXHRPdXRwdXQsXG5cdEV2ZW50RW1pdHRlcixcblx0SG9zdEJpbmRpbmcsXG5cdE9uQ2hhbmdlcyxcblx0Vmlld0NoaWxkXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBPcGVyYXRvckZ1bmN0aW9uIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IEkxOG4sIE92ZXJyaWRhYmxlIH0gZnJvbSBcImNhcmJvbi1jb21wb25lbnRzLWFuZ3VsYXIvaTE4blwiO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBUYWJsZUhlYWRlckl0ZW0gfSBmcm9tIFwiLi4vdGFibGUtaGVhZGVyLWl0ZW0uY2xhc3NcIjtcblxuQENvbXBvbmVudCh7XG5cdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogY29tcG9uZW50LXNlbGVjdG9yXG5cdHNlbGVjdG9yOiBcIltjZHNUYWJsZUhlYWRDZWxsXSwgW2libVRhYmxlSGVhZENlbGxdXCIsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PGJ1dHRvblxuXHRcdFx0Y2xhc3M9XCJjZHMtLXRhYmxlLXNvcnRcIlxuXHRcdFx0Km5nSWY9XCJzb3J0YWJsZSAmJiB0aGlzLnNvcnQub2JzZXJ2ZXJzLmxlbmd0aCA+IDAgJiYgY29sdW1uLnNvcnRhYmxlXCJcblx0XHRcdFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbHVtbi5zb3J0ZWQgJiYgY29sdW1uLmFzY2VuZGluZyA/IGdldFNvcnREZXNjZW5kaW5nTGFiZWwoKSA6IGdldFNvcnRBc2NlbmRpbmdMYWJlbCgpKSB8IGFzeW5jXCJcblx0XHRcdGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG5cdFx0XHRbbmdDbGFzc109XCJ7XG5cdFx0XHRcdCdjZHMtLXRhYmxlLXNvcnQtLWFjdGl2ZSc6IGNvbHVtbi5zb3J0ZWQsXG5cdFx0XHRcdCdjZHMtLXRhYmxlLXNvcnQtLWRlc2NlbmRpbmcnOiBjb2x1bW4uYXNjZW5kaW5nXG5cdFx0XHR9XCJcblx0XHRcdChjbGljayk9XCJvbkNsaWNrKCRldmVudClcIj5cblx0XHRcdDxzcGFuXG5cdFx0XHRcdCpuZ0lmPVwiaGVhZGVyQUlMYWJlbERlY29yYXRvckxheW91dFwiXG5cdFx0XHRcdGNsYXNzPVwiY2RzLS10YWJsZS1zb3J0X19mbGV4XCJcblx0XHRcdFx0W3RpdGxlXT1cImNvbHVtbi50aXRsZVwiXG5cdFx0XHRcdHRhYmluZGV4PVwiLTFcIj5cblx0XHRcdFx0PGRpdiBjZHNUYWJsZUhlYWRDZWxsTGFiZWw+e3sgZ2V0SGVhZGVyTGFiZWxUZXh0KCkgfX08L2Rpdj5cblx0XHRcdFx0PHN2ZyAqbmdJZj1cIiFza2VsZXRvblwiIGNsYXNzPVwiY2RzLS10YWJsZS1zb3J0X19pY29uXCIgY2RzSWNvbj1cImFycm93LS1kb3duXCI+PC9zdmc+XG5cdFx0XHRcdDxzdmcgKm5nSWY9XCIhc2tlbGV0b25cIiBjbGFzcz1cImNkcy0tdGFibGUtc29ydF9faWNvbi11bnNvcnRlZFwiIGNkc0ljb249XCJhcnJvd3MtLXZlcnRpY2FsXCI+PC9zdmc+XG5cdFx0XHQ8ZGl2XG5cdFx0XHRcdCNkZWNvcmF0b3JJbm5lclxuXHRcdFx0XHRjbGFzcz1cImNkcy0tdGFibGUtaGVhZGVyLWxhYmVsLS1kZWNvcmF0b3ItaW5uZXJcIlxuXHRcdFx0XHQoY2xpY2spPVwib25EZWNvcmF0b3JSZWdpb25DbGljaygkZXZlbnQpXCI+XG5cdFx0XHRcdDxuZy10ZW1wbGF0ZVxuXHRcdFx0XHRcdFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbHVtbi50ZW1wbGF0ZVwiXG5cdFx0XHRcdFx0W25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntkYXRhOiBjb2x1bW4uZGF0YX1cIj5cblx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHRcdDwvZGl2PlxuXHRcdFx0PC9zcGFuPlxuXHRcdFx0PHNwYW5cblx0XHRcdFx0Km5nSWY9XCIhaGVhZGVyQUlMYWJlbERlY29yYXRvckxheW91dFwiXG5cdFx0XHRcdGNsYXNzPVwiY2RzLS10YWJsZS1zb3J0X19mbGV4XCJcblx0XHRcdFx0W3RpdGxlXT1cImNvbHVtbi50aXRsZVwiXG5cdFx0XHRcdHRhYmluZGV4PVwiLTFcIj5cblx0XHRcdFx0PGRpdlxuXHRcdFx0XHRcdCpuZ0lmPVwiIXNrZWxldG9uICYmICFjb2x1bW4udGVtcGxhdGVcIlxuXHRcdFx0XHRcdGNkc1RhYmxlSGVhZENlbGxMYWJlbFxuXHRcdFx0XHRcdFtjbGFzcy5jZHMtLXRhYmxlLWhlYWRlci1sYWJlbC0tYWktbGFiZWxdPVwiY29sdW1uLmhhc0FJTGFiZWxIZWFkZXJcIlxuXHRcdFx0XHRcdFtjbGFzcy5jZHMtLXRhYmxlLWhlYWRlci1sYWJlbC0tc2x1Z109XCJjb2x1bW4uaGFzQUlMYWJlbEhlYWRlclwiPlxuXHRcdFx0XHRcdHt7Y29sdW1uLmRhdGF9fVxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PGRpdlxuXHRcdFx0XHRcdCpuZ0lmPVwiIXNrZWxldG9uICYmIGNvbHVtbi50ZW1wbGF0ZVwiXG5cdFx0XHRcdFx0Y2RzVGFibGVIZWFkQ2VsbExhYmVsXG5cdFx0XHRcdFx0W2NsYXNzLmNkcy0tdGFibGUtaGVhZGVyLWxhYmVsLS1haS1sYWJlbF09XCJjb2x1bW4uaGFzQUlMYWJlbEhlYWRlclwiXG5cdFx0XHRcdFx0W2NsYXNzLmNkcy0tdGFibGUtaGVhZGVyLWxhYmVsLS1zbHVnXT1cImNvbHVtbi5oYXNBSUxhYmVsSGVhZGVyXCI+XG5cdFx0XHRcdFx0PG5nLXRlbXBsYXRlXG5cdFx0XHRcdFx0XHRbbmdUZW1wbGF0ZU91dGxldF09XCJjb2x1bW4udGVtcGxhdGVcIlxuXHRcdFx0XHRcdFx0W25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntkYXRhOiBjb2x1bW4uZGF0YX1cIj5cblx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PHN2ZyAqbmdJZj1cIiFza2VsZXRvblwiIGNsYXNzPVwiY2RzLS10YWJsZS1zb3J0X19pY29uXCIgY2RzSWNvbj1cImFycm93LS1kb3duXCI+PC9zdmc+XG5cdFx0XHRcdDxzdmcgKm5nSWY9XCIhc2tlbGV0b25cIiBjbGFzcz1cImNkcy0tdGFibGUtc29ydF9faWNvbi11bnNvcnRlZFwiIGNkc0ljb249XCJhcnJvd3MtLXZlcnRpY2FsXCI+PC9zdmc+XG5cdFx0XHQ8L3NwYW4+XG5cdFx0PC9idXR0b24+XG5cdFx0PGRpdlxuXHRcdFx0Km5nSWY9XCJoZWFkZXJBSUxhYmVsRGVjb3JhdG9yTGF5b3V0ICYmICgoIXNrZWxldG9uICYmIHNvcnQub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMCkgfHwgKHNvcnQub2JzZXJ2ZXJzLmxlbmd0aCA+IDAgJiYgIWNvbHVtbi5zb3J0YWJsZSkgfHwgIXNvcnRhYmxlKVwiXG5cdFx0XHRjbGFzcz1cImNkcy0tdGFibGUtaGVhZGVyLWxhYmVsXCJcblx0XHRcdFtuZ0NsYXNzXT1cIntcblx0XHRcdFx0J2Nkcy0tdGFibGUtaGVhZGVyLWxhYmVsLS1haS1sYWJlbCc6IGNvbHVtbi5oYXNBSUxhYmVsSGVhZGVyLFxuXHRcdFx0XHQnY2RzLS10YWJsZS1oZWFkZXItbGFiZWwtLXNsdWcnOiBjb2x1bW4uaGFzQUlMYWJlbEhlYWRlcixcblx0XHRcdFx0J2Nkcy0tdGFibGUtaGVhZGVyLWxhYmVsLS1kZWNvcmF0b3InOiBjb2x1bW4uaGFzQUlMYWJlbEhlYWRlclxuXHRcdFx0fVwiPlxuXHRcdFx0PHNwYW4gKm5nSWY9XCJnZXRIZWFkZXJMYWJlbFRleHQoKVwiPnt7IGdldEhlYWRlckxhYmVsVGV4dCgpIH19PC9zcGFuPlxuXHRcdFx0PGRpdiBjbGFzcz1cImNkcy0tdGFibGUtaGVhZGVyLWxhYmVsLS1kZWNvcmF0b3ItaW5uZXJcIj5cblx0XHRcdFx0PG5nLXRlbXBsYXRlXG5cdFx0XHRcdFx0W25nVGVtcGxhdGVPdXRsZXRdPVwiY29sdW1uLnRlbXBsYXRlXCJcblx0XHRcdFx0XHRbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2RhdGE6IGNvbHVtbi5kYXRhfVwiPlxuXHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdFx0PC9kaXY+XG5cdFx0PC9kaXY+XG5cdFx0PGRpdlxuXHRcdFx0Y2xhc3M9XCJjZHMtLXRhYmxlLWhlYWRlci1sYWJlbFwiXG5cdFx0XHQqbmdJZj1cIiFoZWFkZXJBSUxhYmVsRGVjb3JhdG9yTGF5b3V0ICYmICgoIXNrZWxldG9uICYmIHNvcnQub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMCkgfHwgKHNvcnQub2JzZXJ2ZXJzLmxlbmd0aCA+IDAgJiYgIWNvbHVtbi5zb3J0YWJsZSkgfHwgIXNvcnRhYmxlKVwiXG5cdFx0XHRbbmdDbGFzc109XCJ7XG5cdFx0XHRcdCdjZHMtLXRhYmxlLWhlYWRlci1sYWJlbC0tYWktbGFiZWwnOiBjb2x1bW4uaGFzQUlMYWJlbEhlYWRlcixcblx0XHRcdFx0J2Nkcy0tdGFibGUtaGVhZGVyLWxhYmVsLS1zbHVnJzogY29sdW1uLmhhc0FJTGFiZWxIZWFkZXJcblx0XHRcdH1cIj5cblx0XHRcdDxzcGFuICpuZ0lmPVwiIWNvbHVtbi50ZW1wbGF0ZVwiIFt0aXRsZV09XCJjb2x1bW4uZGF0YVwiPlxuXHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uXCI+XG5cdFx0XHRcdFx0e3tjb2x1bW4uZGF0YX19XG5cdFx0XHRcdDwvbmctY29udGFpbmVyPlxuXHRcdFx0PC9zcGFuPlxuXHRcdFx0PG5nLXRlbXBsYXRlXG5cdFx0XHRcdFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbHVtbi50ZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ZGF0YTogY29sdW1uLmRhdGF9XCI+XG5cdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdDwvZGl2PlxuXHRgXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlSGVhZENlbGwgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuXHRASW5wdXQoKSBjb2x1bW46IFRhYmxlSGVhZGVySXRlbTtcblxuXHRASW5wdXQoKSBza2VsZXRvbiA9IGZhbHNlO1xuXG5cdEBJbnB1dCgpIHNvcnRhYmxlID0gdHJ1ZTtcblxuXHRASW5wdXQoKVxuXHRzZXQgc29ydERlc2NlbmRpbmdMYWJlbCh2YWx1ZTogc3RyaW5nIHwgT2JzZXJ2YWJsZTxzdHJpbmc+KSB7XG5cdFx0dGhpcy5fc29ydERlc2NlbmRpbmdMYWJlbC5vdmVycmlkZSh2YWx1ZSk7XG5cdH1cblxuXHRnZXQgc29ydERlc2NlbmRpbmdMYWJlbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fc29ydERlc2NlbmRpbmdMYWJlbC52YWx1ZTtcblx0fVxuXG5cdEBJbnB1dCgpXG5cdHNldCBzb3J0QXNjZW5kaW5nTGFiZWwodmFsdWU6IHN0cmluZyB8IE9ic2VydmFibGU8c3RyaW5nPikge1xuXHRcdHRoaXMuX3NvcnRBc2NlbmRpbmdMYWJlbC5vdmVycmlkZSh2YWx1ZSk7XG5cdH1cblxuXHRnZXQgc29ydEFzY2VuZGluZ0xhYmVsKCkge1xuXHRcdHJldHVybiB0aGlzLl9zb3J0QXNjZW5kaW5nTGFiZWwudmFsdWU7XG5cdH1cblxuXHRASW5wdXQoKVxuXHRzZXQgZmlsdGVyVGl0bGUodmFsdWU6IHN0cmluZyB8IE9ic2VydmFibGU8c3RyaW5nPikge1xuXHRcdHRoaXMuX2ZpbHRlclRpdGxlLm92ZXJyaWRlKHZhbHVlKTtcblx0fVxuXG5cdGdldCBmaWx0ZXJUaXRsZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5fZmlsdGVyVGl0bGUudmFsdWU7XG5cdH1cblxuXHQvKipcblx0ICogTm90aWZpZXMgdGhhdCB0aGUgY29sdW1uIHNob3VsZCBiZSBzb3J0ZWRcblx0ICovXG5cdEBPdXRwdXQoKSBzb3J0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdEBWaWV3Q2hpbGQoXCJkZWNvcmF0b3JJbm5lclwiKSBkZWNvcmF0b3JJbm5lclJlZjogRWxlbWVudFJlZjtcblxuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy50aGVhZF9hY3Rpb25cIikgdGhlYWRBY3Rpb24gPSBmYWxzZTtcblxuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLXRhYmxlLXNvcnRfX2hlYWRlclwiKSBnZXQgc29ydEhlYWRlckhvc3QoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc29ydGFibGUgJiYgdGhpcy5zb3J0Lm9ic2VydmVycy5sZW5ndGggPiAwICYmIHRoaXMuY29sdW1uPy5zb3J0YWJsZTtcblx0fVxuXG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tdGFibGUtc29ydF9faGVhZGVyLS1haS1sYWJlbFwiKSBnZXQgc29ydEhlYWRlckFJTGFiZWxIb3N0KCkge1xuXHRcdHJldHVybiB0aGlzLmNvbHVtbj8uaGFzQUlMYWJlbEhlYWRlciAmJiB0aGlzLnNvcnRIZWFkZXJIb3N0O1xuXHR9XG5cblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS10YWJsZS1zb3J0X19oZWFkZXItLWRlY29yYXRvclwiKSBnZXQgc29ydEhlYWRlckRlY29yYXRvckhvc3QoKSB7XG5cdFx0cmV0dXJuIHRoaXMuY29sdW1uPy5oYXNBSUxhYmVsSGVhZGVyICYmIHRoaXMuY29sdW1uPy50ZW1wbGF0ZSAmJiB0aGlzLnNvcnRIZWFkZXJIb3N0O1xuXHR9XG5cblx0LyoqXG5cdCAqIFdoZW4gdGhlIGNvbHVtbiB1c2VzIGEgc2VwYXJhdGUgdGVtcGxhdGUgZm9yIHRoZSBzbHVnL0FJOiBsYWJlbCB0ZXh0ICsgc29ydCBpY29ucyArIGBjZHMtLXRhYmxlLWhlYWRlci1sYWJlbC0tZGVjb3JhdG9yLWlubmVyYC5cblx0ICovXG5cdGdldCBoZWFkZXJBSUxhYmVsRGVjb3JhdG9yTGF5b3V0KCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAhISh0aGlzLmNvbHVtbj8uaGFzQUlMYWJlbEhlYWRlciAmJiB0aGlzLmNvbHVtbj8udGVtcGxhdGUpO1xuXHR9XG5cblx0cHJvdGVjdGVkIF9zb3J0RGVzY2VuZGluZ0xhYmVsID0gdGhpcy5pMThuLmdldE92ZXJyaWRhYmxlKFwiVEFCTEUuU09SVF9ERVNDRU5ESU5HXCIpO1xuXHRwcm90ZWN0ZWQgX3NvcnRBc2NlbmRpbmdMYWJlbCA9IHRoaXMuaTE4bi5nZXRPdmVycmlkYWJsZShcIlRBQkxFLlNPUlRfQVNDRU5ESU5HXCIpO1xuXHRwcm90ZWN0ZWQgX2ZpbHRlclRpdGxlID0gdGhpcy5pMThuLmdldE92ZXJyaWRhYmxlKFwiVEFCTEUuRklMVEVSXCIpO1xuXG5cdGNvbnN0cnVjdG9yKHByb3RlY3RlZCBpMThuOiBJMThuKSB7IH1cblxuXHRuZ09uQ2hhbmdlcygpIHtcblx0XHR0aGlzLnRoZWFkQWN0aW9uID0gISEodGhpcy5jb2x1bW4gJiYgdGhpcy5jb2x1bW4uZmlsdGVyVGVtcGxhdGUpIHx8IHRoaXMuc29ydC5vYnNlcnZlcnMubGVuZ3RoID4gMDtcblx0fVxuXG5cdC8qKlxuXHQgKiBUZXh0IGxhYmVsIGZvciB0aGUgY29sdW1uIHdoZW4gYGhhc0FJTGFiZWxIZWFkZXJgIHVzZXMgYSBzZXBhcmF0ZSBgdGVtcGxhdGVgIGZvciB0aGUgc2x1Zy5cblx0ICovXG5cdGdldEhlYWRlckxhYmVsVGV4dCgpOiBzdHJpbmcge1xuXHRcdGlmICghdGhpcy5jb2x1bW4pIHtcblx0XHRcdHJldHVybiBcIlwiO1xuXHRcdH1cblx0XHRjb25zdCBkID0gdGhpcy5jb2x1bW4uZGF0YTtcblx0XHRpZiAoZCAhPSBudWxsICYmIHR5cGVvZiBkID09PSBcIm9iamVjdFwiICYmIFwibGFiZWxcIiBpbiBkICYmIChkIGFzIHsgbGFiZWw/OiB1bmtub3duIH0pLmxhYmVsICE9IG51bGwpIHtcblx0XHRcdHJldHVybiBTdHJpbmcoKGQgYXMgeyBsYWJlbDogdW5rbm93biB9KS5sYWJlbCk7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgZCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0cmV0dXJuIGQ7XG5cdFx0fVxuXHRcdHJldHVybiBcIlwiO1xuXHR9XG5cblx0Z2V0U29ydERlc2NlbmRpbmdMYWJlbCgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuXHRcdHJldHVybiB0aGlzLl9zb3J0RGVzY2VuZGluZ0xhYmVsLnN1YmplY3QucGlwZSh0aGlzLnNvcnRMYWJlbE1hcCgpKTtcblx0fVxuXG5cdGdldFNvcnRBc2NlbmRpbmdMYWJlbCgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuXHRcdHJldHVybiB0aGlzLl9zb3J0QXNjZW5kaW5nTGFiZWwuc3ViamVjdC5waXBlKHRoaXMuc29ydExhYmVsTWFwKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByZXZlbnQgZm9jdXMgZnJvbSBtb3ZpbmcgdG8gcGFyZW50IGJ1dHRvbiB3aGVuIGNsaWNrIG9uIGRlY29yYXRvclxuXHQgKi9cblx0b25EZWNvcmF0b3JSZWdpb25DbGljayhldmVudDogTW91c2VFdmVudCkge1xuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdH1cblxuXHRvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG5cdFx0aWYgKHRoaXMuc2tlbGV0b24pIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKFxuXHRcdFx0dGhpcy5jb2x1bW4/Lmhhc0FJTGFiZWxIZWFkZXIgJiZcblx0XHRcdHRoaXMuZGVjb3JhdG9ySW5uZXJSZWY/Lm5hdGl2ZUVsZW1lbnQ/LmNvbnRhaW5zKGV2ZW50LnRhcmdldClcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy5zb3J0LmVtaXQoKTtcblx0fVxuXG5cdHByb3RlY3RlZCBzb3J0TGFiZWxNYXAoKTogT3BlcmF0b3JGdW5jdGlvbjxzdHJpbmcsIHN0cmluZz4ge1xuXHRcdHJldHVybiBtYXAoKHN0cjogc3RyaW5nKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5jb2x1bW4uYXJpYVNvcnRMYWJlbCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5jb2x1bW4uYXJpYVNvcnRMYWJlbDtcblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLmNvbHVtbi5mb3JtYXRTb3J0TGFiZWwpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuY29sdW1uLmZvcm1hdFNvcnRMYWJlbChzdHIsIHRoaXMuY29sdW1uLmFyaWFTb3J0TGFiZWwpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgaGVhZGVyID1cblx0XHRcdFx0dGhpcy5nZXRIZWFkZXJMYWJlbFRleHQoKSB8fFxuXHRcdFx0XHQodHlwZW9mIHRoaXMuY29sdW1uLmRhdGEgPT09IFwic3RyaW5nXCIgPyB0aGlzLmNvbHVtbi5kYXRhIDogXCJcIik7XG5cdFx0XHRyZXR1cm4gYCR7aGVhZGVyfSAtICR7c3RyfWA7XG5cdFx0fSk7XG5cdH1cbn1cbiJdfQ==