@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
294 lines • 33.7 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, HostBinding, HostListener, Input, ViewChild, TemplateRef, } from '@angular/core';
import { DataType } from '../../data-operations/data-util';
import { GridBaseAPIService } from '../api.service';
import { IgxGridSelectionService, ISelectionNode } from '../selection/selection.service';
import { ROW_COLLAPSE_KEYS, ROW_EXPAND_KEYS, SUPPORTED_KEYS } from '../../core/utils';
let IgxGridGroupByRowComponent = class IgxGridGroupByRowComponent {
constructor(gridAPI, gridSelection, element, cdr) {
this.gridAPI = gridAPI;
this.gridSelection = gridSelection;
this.element = element;
this.cdr = cdr;
/**
* @hidden
*/
this.defaultCssClass = 'igx-grid__group-row';
/**
* @hidden
*/
this.paddingIndentationCssClass = 'igx-grid__group-row--padding-level';
/**
* @hidden
*/
this.isFocused = false;
/**
* @hidden
*/
this.tabindex = 0;
}
/**
* Returns whether the row is focused.
* ```
* let gridRowFocused = this.grid1.rowList.first.focused;
* ```
*/
get focused() {
return this.isFocused;
}
/**
* Returns whether the group row is expanded.
* ```typescript
* const groupRowExpanded = this.grid1.rowList.first.expanded;
* ```
*/
get expanded() {
return this.grid.isExpandedGroup(this.groupRow);
}
/**
* @hidden
*/
get describedBy() {
const grRowExpr = this.groupRow.expression !== undefined ? this.groupRow.expression.fieldName : '';
return this.gridID + '_' + grRowExpr;
}
get dataRowIndex() {
return this.index;
}
/**
* Returns a reference to the underlying HTML element.
* ```typescript
* const groupRowElement = this.nativeElement;
* ```
*/
get nativeElement() {
return this.element.nativeElement;
}
/**
* Returns the style classes applied to the group rows.
* ```typescript
* const groupCssStyles = this.grid1.rowList.first.styleClasses;
* ```
*/
get styleClasses() {
return `${this.defaultCssClass} ` + `${this.paddingIndentationCssClass}-` + this.groupRow.level +
(this.focused ? ` ${this.defaultCssClass}--active` : '');
}
/**
*@hidden
*/
onFocus() {
this.isFocused = true;
}
/**
*@hidden
*/
onBlur() {
this.isFocused = false;
}
/**
* Toggles the group row.
* ```typescript
* this.grid1.rowList.first.toggle()
* ```
*/
toggle() {
const isVirtualized = !this.grid.verticalScrollContainer.dc.instance.notVirtual;
const groupRowIndex = this.index;
this.grid.toggleGroup(this.groupRow);
if (isVirtualized) {
const groupRow = this.grid.nativeElement.querySelector(`[data-rowIndex="${groupRowIndex}"]`);
if (groupRow) {
groupRow.focus();
}
}
}
get iconTemplate() {
if (this.expanded) {
return this.grid.rowExpandedIndicatorTemplate || this.defaultGroupByExpandedTemplate;
}
else {
return this.grid.rowCollapsedIndicatorTemplate || this.defaultGroupByCollapsedTemplate;
}
}
get selectionNode() {
return {
row: this.index,
column: this.gridSelection.activeElement ? this.gridSelection.activeElement.column : 0
};
}
/**
* @hidden
*/
onKeydown(event) {
// TODO: Refactor
const key = event.key.toLowerCase();
if (!SUPPORTED_KEYS.has(key)) {
return;
}
event.stopPropagation();
const keydownArgs = { targetType: 'groupRow', target: this, event: event, cancel: false };
this.grid.onGridKeydown.emit(keydownArgs);
if (keydownArgs.cancel) {
return;
}
event.preventDefault();
if (!this.isKeySupportedInGroupRow(key, event.shiftKey, event.altKey) || event.ctrlKey) {
return;
}
if (this.isToggleKey(key, event.altKey)) {
if ((this.expanded && ROW_COLLAPSE_KEYS.has(key)) || (!this.expanded && ROW_EXPAND_KEYS.has(key))) {
this.toggle();
}
return;
}
const selection = this.gridSelection;
selection.keyboardState.shift = event.shiftKey && !(key === 'tab');
const activeNode = selection.activeElement ? Object.assign({}, selection.activeElement) : this.selectionNode;
activeNode.row = this.index;
switch (key) {
case 'arrowdown':
case 'down':
this.grid.navigation.navigateDown(this.nativeElement, activeNode);
break;
case 'arrowup':
case 'up':
this.grid.navigation.navigateUp(this.nativeElement, activeNode);
break;
case 'tab':
this.handleTabKey(event.shiftKey, activeNode);
break;
}
}
/**
* Returns a reference to the `IgxGridComponent` the `IgxGridGroupByRowComponent` belongs to.
* ```typescript
* this.grid1.rowList.first.grid;
* ```
*/
get grid() {
return this.gridAPI.grid;
}
/**
* @hidden
*/
get dataType() {
const column = this.grid.getColumnByName(this.groupRow.expression.fieldName);
return (column && column.dataType) || DataType.String;
}
handleTabKey(shift, activeNode) {
if (shift) {
this.grid.navigation.performShiftTabKey(this.nativeElement, activeNode);
}
else {
if (this.index === this.grid.dataView.length - 1 && this.grid.rootSummariesEnabled) {
this.grid.navigation.onKeydownHome(0, true);
}
else {
const orderedColumns = this.grid.navigation.gridOrderedColumns;
const lastCol = orderedColumns[orderedColumns.length - 1];
activeNode.column = lastCol.columnLayoutChild ? lastCol.parent.visibleIndex : lastCol.visibleIndex;
this.grid.navigation.performTab(this.nativeElement, activeNode);
}
}
}
isKeySupportedInGroupRow(key, shift = false, alt = false) {
if (shift) {
return ['down', 'up', 'arrowdown', 'arrowup', 'tab'].indexOf(key) !== -1;
}
return this.isToggleKey(key, alt) ? true : ['down', 'up', 'arrowdown', 'arrowup', 'tab'].indexOf(key) !== -1;
}
isToggleKey(key, altKey) {
return altKey && ['left', 'right', 'up', 'down', 'arrowleft', 'arrowright', 'arrowup', 'arrowdown'].indexOf(key) !== -1;
}
};
IgxGridGroupByRowComponent.ctorParameters = () => [
{ type: GridBaseAPIService },
{ type: IgxGridSelectionService },
{ type: ElementRef },
{ type: ChangeDetectorRef }
];
__decorate([
ViewChild('defaultGroupByExpandedTemplate', { read: TemplateRef, static: true }),
__metadata("design:type", TemplateRef)
], IgxGridGroupByRowComponent.prototype, "defaultGroupByExpandedTemplate", void 0);
__decorate([
ViewChild('defaultGroupByCollapsedTemplate', { read: TemplateRef, static: true }),
__metadata("design:type", TemplateRef)
], IgxGridGroupByRowComponent.prototype, "defaultGroupByCollapsedTemplate", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxGridGroupByRowComponent.prototype, "isFocused", void 0);
__decorate([
Input(),
__metadata("design:type", Number)
], IgxGridGroupByRowComponent.prototype, "index", void 0);
__decorate([
Input(),
__metadata("design:type", String)
], IgxGridGroupByRowComponent.prototype, "gridID", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxGridGroupByRowComponent.prototype, "groupRow", void 0);
__decorate([
ViewChild('groupContent', { static: true }),
__metadata("design:type", ElementRef)
], IgxGridGroupByRowComponent.prototype, "groupContent", void 0);
__decorate([
HostBinding('attr.aria-expanded'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxGridGroupByRowComponent.prototype, "expanded", null);
__decorate([
HostBinding('attr.tabindex'),
__metadata("design:type", Object)
], IgxGridGroupByRowComponent.prototype, "tabindex", void 0);
__decorate([
HostBinding('attr.aria-describedby'),
__metadata("design:type", String),
__metadata("design:paramtypes", [])
], IgxGridGroupByRowComponent.prototype, "describedBy", null);
__decorate([
HostBinding('attr.data-rowIndex'),
__metadata("design:type", Object),
__metadata("design:paramtypes", [])
], IgxGridGroupByRowComponent.prototype, "dataRowIndex", null);
__decorate([
HostBinding('class'),
__metadata("design:type", String),
__metadata("design:paramtypes", [])
], IgxGridGroupByRowComponent.prototype, "styleClasses", null);
__decorate([
HostListener('focus'),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], IgxGridGroupByRowComponent.prototype, "onFocus", null);
__decorate([
HostListener('blur'),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], IgxGridGroupByRowComponent.prototype, "onBlur", null);
__decorate([
HostListener('keydown', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], IgxGridGroupByRowComponent.prototype, "onKeydown", null);
IgxGridGroupByRowComponent = __decorate([
Component({
changeDetection: ChangeDetectionStrategy.OnPush,
preserveWhitespaces: false,
selector: 'igx-grid-groupby-row',
template: "<ng-container #defaultGroupRow>\n <div (click)=\"toggle()\" class=\"igx-grid__grouping-indicator\">\n <ng-container *ngTemplateOutlet=\"iconTemplate; context: { $implicit: this }\">\n </ng-container>\n </div>\n\n <div class=\"igx-grid__group-content\" #groupContent>\n <ng-container *ngTemplateOutlet=\"grid.groupRowTemplate ? grid.groupRowTemplate : defaultGroupByTemplate; context: { $implicit: groupRow }\">\n </ng-container>\n </div>\n\n <ng-template #defaultGroupByExpandedTemplate>\n <igx-icon fontSet=\"material\">expand_more</igx-icon>\n </ng-template>\n\n <ng-template #defaultGroupByCollapsedTemplate>\n <igx-icon fontSet=\"material\">chevron_right</igx-icon>\n </ng-template>\n\n\n <ng-template #defaultGroupByTemplate>\n <div class=\"igx-group-label\">\n <igx-icon fontSet=\"material\" class=\"igx-group-label__icon\">group_work</igx-icon>\n <span class=\"igx-group-label__column-name\">\n {{ groupRow.expression ? groupRow.expression.fieldName : '' }}:\n </span>\n\n <ng-container *ngIf=\"dataType === 'boolean' || dataType === 'string'; else default\" >\n <span class=\"igx-group-label__text\">{{ groupRow.value }}</span>\n </ng-container>\n <ng-template #default>\n <ng-container *ngIf=\"dataType === 'number'\">\n <span class=\"igx-group-label__text\">{{ groupRow.value | number }}</span>\n </ng-container>\n <ng-container *ngIf=\"dataType === 'date'\">\n <span class=\"igx-group-label__text\">{{ groupRow.value | date }}</span>\n </ng-container>\n </ng-template>\n\n <igx-badge [value]=\"groupRow.records ? groupRow.records.length : 0\" class='igx-group-label__count-badge'></igx-badge>\n </div>\n </ng-template>\n</ng-container>\n"
}),
__metadata("design:paramtypes", [GridBaseAPIService,
IgxGridSelectionService,
ElementRef,
ChangeDetectorRef])
], IgxGridGroupByRowComponent);
export { IgxGridGroupByRowComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXBieS1yb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9ncmlkcy9ncmlkL2dyb3VwYnktcm93LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFDTCxTQUFTLEVBQ1QsV0FBVyxHQUNkLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDekYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQVN0RixJQUFhLDBCQUEwQixHQUF2QyxNQUFhLDBCQUEwQjtJQUVuQyxZQUFtQixPQUE0RCxFQUNuRSxhQUFzQyxFQUN2QyxPQUFtQixFQUNuQixHQUFzQjtRQUhkLFlBQU8sR0FBUCxPQUFPLENBQXFEO1FBQ25FLGtCQUFhLEdBQWIsYUFBYSxDQUF5QjtRQUN2QyxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ25CLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBRWpDOztXQUVHO1FBQ08sb0JBQWUsR0FBRyxxQkFBcUIsQ0FBQztRQUVsRDs7V0FFRztRQUNPLCtCQUEwQixHQUFHLG9DQUFvQyxDQUFDO1FBYzVFOztXQUVHO1FBRU8sY0FBUyxHQUFHLEtBQUssQ0FBQztRQTJENUI7O1dBRUc7UUFFSSxhQUFRLEdBQUcsQ0FBQyxDQUFDO0lBM0ZpQixDQUFDO0lBOEJ0Qzs7Ozs7T0FLRztJQUNILElBQUksT0FBTztRQUNQLE9B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QjtBQU1EO0lBREMsWUFBWSxDQUFDLE9BQU8sQ0FBQzs7Ozt5REFHckI7QUFNRDtJQURDLFlBQVksQ0FBQyxNQUFNLENBQUM7Ozs7d0RBR3BCO0FBdUNEO0lBREMsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDOzs7OzJEQTBDbkM7QUFwT1EsMEJBQTBCO0lBTnRDLFNBQVMsQ0FBQztRQUNQLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO1FBQy9DLG1CQUFtQixFQUFFLEtBQUs7UUFDMUIsUUFBUSxFQUFFLHNCQUFzQjtRQUNoQyw4NkRBQTJDO0tBQzlDLENBQUM7cUNBRzhCLGtCQUFrQjtRQUNuQix1QkFBdUI7UUFDOUIsVUFBVTtRQUNkLGlCQUFpQjtHQUx4QiwwQkFBMEIsQ0FrUnRDO1NBbFJZLDBCQUEwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIFZpZXdDaGlsZCxcbiAgICBUZW1wbGF0ZVJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJR3JvdXBCeVJlY29yZCB9IGZyb20gJy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9ncm91cGJ5LXJlY29yZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuLi8uLi9kYXRhLW9wZXJhdGlvbnMvZGF0YS11dGlsJztcbmltcG9ydCB7IEdyaWRCYXNlQVBJU2VydmljZSB9IGZyb20gJy4uL2FwaS5zZXJ2aWNlJztcbmltcG9ydCB7IElneEdyaWRCYXNlRGlyZWN0aXZlIH0gZnJvbSAnLi4vZ3JpZC1iYXNlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hHcmlkU2VsZWN0aW9uU2VydmljZSwgSVNlbGVjdGlvbk5vZGUgfSBmcm9tICcuLi9zZWxlY3Rpb24vc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgUk9XX0NPTExBUFNFX0tFWVMsIFJPV19FWFBBTkRfS0VZUywgU1VQUE9SVEVEX0tFWVMgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IEdyaWRUeXBlIH0gZnJvbSAnLi4vY29tbW9uL2dyaWQuaW50ZXJmYWNlJztcblxuQENvbXBvbmVudCh7XG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG4gICAgc2VsZWN0b3I6ICdpZ3gtZ3JpZC1ncm91cGJ5LXJvdycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2dyb3VwYnktcm93LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hHcmlkR3JvdXBCeVJvd0NvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgZ3JpZEFQSTogR3JpZEJhc2VBUElTZXJ2aWNlPElneEdyaWRCYXNlRGlyZWN0aXZlICYgR3JpZFR5cGU+LFxuICAgICAgICBwcml2YXRlIGdyaWRTZWxlY3Rpb246IElneEdyaWRTZWxlY3Rpb25TZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgZWxlbWVudDogRWxlbWVudFJlZixcbiAgICAgICAgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHsgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBkZWZhdWx0Q3NzQ2xhc3MgPSAnaWd4LWdyaWRfX2dyb3VwLXJvdyc7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHBhZGRpbmdJbmRlbnRhdGlvbkNzc0NsYXNzID0gJ2lneC1ncmlkX19ncm91cC1yb3ctLXBhZGRpbmctbGV2ZWwnO1xuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuXG4gICAgKi9cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0R3JvdXBCeUV4cGFuZGVkVGVtcGxhdGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgZGVmYXVsdEdyb3VwQnlFeHBhbmRlZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuXG4gICAgKi9cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0R3JvdXBCeUNvbGxhcHNlZFRlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIGRlZmF1bHRHcm91cEJ5Q29sbGFwc2VkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwcm90ZWN0ZWQgaXNGb2N1c2VkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJvdyBpcyBmb2N1c2VkLlxuICAgICAqIGBgYFxuICAgICAqIGxldCBncmlkUm93Rm9jdXNlZCA9IHRoaXMuZ3JpZDEucm93TGlzdC5maXJzdC5mb2N1c2VkO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdldCBmb2N1c2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0ZvY3VzZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgaW5kZXggb2YgdGhlIHJvdy5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkLWdyb3VwYnktcm93IFtncmlkSURdPVwiaWRcIiBbaW5kZXhdPVwicm93SW5kZXhcIiBbZ3JvdXBSb3ddPVwicm93RGF0YVwiICNyb3c+PC9pZ3gtZ3JpZC1ncm91cGJ5LXJvdz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpbmRleDogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgaWQgb2YgdGhlIGdyaWQgdGhlIHJvdyBiZWxvbmdzIHRvLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQtZ3JvdXBieS1yb3cgW2dyaWRJRF09XCJpZFwiIFtpbmRleF09XCJyb3dJbmRleFwiIFtncm91cFJvd109XCJyb3dEYXRhXCIgI3Jvdz48L2lneC1ncmlkLWdyb3VwYnktcm93PlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdyaWRJRDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc3BlY2lmaWVzIHRoZSBncm91cCByZWNvcmQgdGhlIGNvbXBvbmVudCByZW5kZXJzIGZvci5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogPGlneC1ncmlkLWdyb3VwYnktcm93IFtncmlkSURdPVwiaWRcIiBbaW5kZXhdPVwicm93SW5kZXhcIiBbZ3JvdXBSb3ddPVwicm93RGF0YVwiICNyb3c+PC9pZ3gtZ3JpZC1ncm91cGJ5LXJvdz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBncm91cFJvdzogSUdyb3VwQnlSZWNvcmQ7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIG9mIHRoZSBjb250ZW50IG9mIHRoZSBncm91cC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZ3JvdXBSb3dDb250ZW50ID0gdGhpcy5ncmlkMS5yb3dMaXN0LmZpcnN0Lmdyb3VwQ29udGVudDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdncm91cENvbnRlbnQnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBncm91cENvbnRlbnQ6IEVsZW1lbnRSZWY7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdyb3VwIHJvdyBpcyBleHBhbmRlZC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZ3JvdXBSb3dFeHBhbmRlZCA9IHRoaXMuZ3JpZDEucm93TGlzdC5maXJzdC5leHBhbmRlZDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1leHBhbmRlZCcpXG4gICAgZ2V0IGV4cGFuZGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkLmlzRXhwYW5kZWRHcm91cCh0aGlzLmdyb3VwUm93KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnRhYmluZGV4JylcbiAgICBwdWJsaWMgdGFiaW5kZXggPSAwO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWRlc2NyaWJlZGJ5JylcbiAgICBnZXQgZGVzY3JpYmVkQnkoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgZ3JSb3dFeHByID0gdGhpcy5ncm91cFJvdy5leHByZXNzaW9uICE9PSB1bmRlZmluZWQgPyB0aGlzLmdyb3VwUm93LmV4cHJlc3Npb24uZmllbGROYW1lIDogJyc7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRJRCArICdfJyArIGdyUm93RXhwcjtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuZGF0YS1yb3dJbmRleCcpXG4gICAgZ2V0IGRhdGFSb3dJbmRleCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyBIVE1MIGVsZW1lbnQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGdyb3VwUm93RWxlbWVudCA9IHRoaXMubmF0aXZlRWxlbWVudDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgbmF0aXZlRWxlbWVudCgpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc3R5bGUgY2xhc3NlcyBhcHBsaWVkIHRvIHRoZSBncm91cCByb3dzLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBncm91cENzc1N0eWxlcyA9IHRoaXMuZ3JpZDEucm93TGlzdC5maXJzdC5zdHlsZUNsYXNzZXM7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXG4gICAgZ2V0IHN0eWxlQ2xhc3NlcygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5kZWZhdWx0Q3NzQ2xhc3N9IGAgKyBgJHt0aGlzLnBhZGRpbmdJbmRlbnRhdGlvbkNzc0NsYXNzfS1gICsgdGhpcy5ncm91cFJvdy5sZXZlbCArXG4gICAgICAgICAgICAodGhpcy5mb2N1c2VkID8gYCAke3RoaXMuZGVmYXVsdENzc0NsYXNzfS0tYWN0aXZlYCA6ICcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdmb2N1cycpXG4gICAgcHVibGljIG9uRm9jdXMoKSB7XG4gICAgICAgIHRoaXMuaXNGb2N1c2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdibHVyJylcbiAgICBwdWJsaWMgb25CbHVyKCkge1xuICAgICAgICB0aGlzLmlzRm9jdXNlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgdGhlIGdyb3VwIHJvdy5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkMS5yb3dMaXN0LmZpcnN0LnRvZ2dsZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZSgpIHtcbiAgICAgICAgY29uc3QgaXNWaXJ0dWFsaXplZCA9ICF0aGlzLmdyaWQudmVydGljYWxTY3JvbGxDb250YWluZXIuZGMuaW5zdGFuY2Uubm90VmlydHVhbDtcbiAgICAgICAgY29uc3QgZ3JvdXBSb3dJbmRleCA9IHRoaXMuaW5kZXg7XG4gICAgICAgIHRoaXMuZ3JpZC50b2dnbGVHcm91cCh0aGlzLmdyb3VwUm93KTtcbiAgICAgICAgaWYgKGlzVmlydHVhbGl6ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwUm93ID0gdGhpcy5ncmlkLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtcm93SW5kZXg9XCIke2dyb3VwUm93SW5kZXh9XCJdYCk7XG4gICAgICAgICAgICBpZiAoZ3JvdXBSb3cpIHtcbiAgICAgICAgICAgICAgICBncm91cFJvdy5mb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpY29uVGVtcGxhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmV4cGFuZGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ncmlkLnJvd0V4cGFuZGVkSW5kaWNhdG9yVGVtcGxhdGUgfHwgdGhpcy5kZWZhdWx0R3JvdXBCeUV4cGFuZGVkVGVtcGxhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ncmlkLnJvd0NvbGxhcHNlZEluZGljYXRvclRlbXBsYXRlIHx8IHRoaXMuZGVmYXVsdEdyb3VwQnlDb2xsYXBzZWRUZW1wbGF0ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgc2VsZWN0aW9uTm9kZSgpOiBJU2VsZWN0aW9uTm9kZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByb3c6IHRoaXMuaW5kZXgsXG4gICAgICAgICAgICBjb2x1bW46IHRoaXMuZ3JpZFNlbGVjdGlvbi5hY3RpdmVFbGVtZW50ID8gdGhpcy5ncmlkU2VsZWN0aW9uLmFjdGl2ZUVsZW1lbnQuY29sdW1uIDogMFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25LZXlkb3duKGV2ZW50KSB7XG4gICAgICAgIC8vIFRPRE86IFJlZmFjdG9yXG4gICAgICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIVNVUFBPUlRFRF9LRVlTLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGNvbnN0IGtleWRvd25BcmdzID0geyB0YXJnZXRUeXBlOiAnZ3JvdXBSb3cnLCB0YXJnZXQ6IHRoaXMsIGV2ZW50OiBldmVudCwgY2FuY2VsOiBmYWxzZSB9O1xuICAgICAgICB0aGlzLmdyaWQub25HcmlkS2V5ZG93bi5lbWl0KGtleWRvd25BcmdzKTtcbiAgICAgICAgaWYgKGtleWRvd25BcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzS2V5U3VwcG9ydGVkSW5Hcm91cFJvdyhrZXksIGV2ZW50LnNoaWZ0S2V5LCBldmVudC5hbHRLZXkpIHx8IGV2ZW50LmN0cmxLZXkpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNUb2dnbGVLZXkoa2V5LCBldmVudC5hbHRLZXkpKSB7XG4gICAgICAgICAgICBpZiAoKHRoaXMuZXhwYW5kZWQgJiYgUk9XX0NPTExBUFNFX0tFWVMuaGFzKGtleSkpIHx8ICghdGhpcy5leHBhbmRlZCAmJiBST1dfRVhQQU5EX0tFWVMuaGFzKGtleSkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuZ3JpZFNlbGVjdGlvbjtcbiAgICAgICAgc2VsZWN0aW9uLmtleWJvYXJkU3RhdGUuc2hpZnQgPSBldmVudC5zaGlmdEtleSAmJiAhKGtleSA9PT0gJ3RhYicpO1xuXG4gICAgICAgIGNvbnN0IGFjdGl2ZU5vZGUgPSBzZWxlY3Rpb24uYWN0aXZlRWxlbWVudCA/IE9iamVjdC5hc3NpZ24oe30sIHNlbGVjdGlvbi5hY3RpdmVFbGVtZW50KSA6IHRoaXMuc2VsZWN0aW9uTm9kZTtcbiAgICAgICAgYWN0aXZlTm9kZS5yb3cgPSB0aGlzLmluZGV4O1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAnYXJyb3dkb3duJzpcbiAgICAgICAgICAgIGNhc2UgJ2Rvd24nOlxuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5uYXZpZ2F0aW9uLm5hdmlnYXRlRG93bih0aGlzLm5hdGl2ZUVsZW1lbnQsIGFjdGl2ZU5vZGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYXJyb3d1cCc6XG4gICAgICAgICAgICBjYXNlICd1cCc6XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkLm5hdmlnYXRpb24ubmF2aWdhdGVVcCh0aGlzLm5hdGl2ZUVsZW1lbnQsIGFjdGl2ZU5vZGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAndGFiJzpcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRhYktleShldmVudC5zaGlmdEtleSwgYWN0aXZlTm9kZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBgSWd4R3JpZENvbXBvbmVudGAgdGhlIGBJZ3hHcmlkR3JvdXBCeVJvd0NvbXBvbmVudGAgYmVsb25ncyB0by5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkMS5yb3dMaXN0LmZpcnN0LmdyaWQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGdyaWQoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZEFQSS5ncmlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgZGF0YVR5cGUoKTogYW55IHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5ncmlkLmdldENvbHVtbkJ5TmFtZSh0aGlzLmdyb3VwUm93LmV4cHJlc3Npb24uZmllbGROYW1lKTtcbiAgICAgICAgcmV0dXJuIChjb2x1bW4gJiYgY29sdW1uLmRhdGFUeXBlKSB8fCBEYXRhVHlwZS5TdHJpbmc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVUYWJLZXkoc2hpZnQ6IGJvb2xlYW4sIGFjdGl2ZU5vZGU6IElTZWxlY3Rpb25Ob2RlKSB7XG4gICAgICAgIGlmIChzaGlmdCkge1xuICAgICAgICAgICAgdGhpcy5ncmlkLm5hdmlnYXRpb24ucGVyZm9ybVNoaWZ0VGFiS2V5KHRoaXMubmF0aXZlRWxlbWVudCwgYWN0aXZlTm9kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pbmRleCA9PT0gdGhpcy5ncmlkLmRhdGFWaWV3Lmxlbmd0aCAtIDEgJiYgdGhpcy5ncmlkLnJvb3RTdW1tYXJpZXNFbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkLm5hdmlnYXRpb24ub25LZXlkb3duSG9tZSgwLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3JkZXJlZENvbHVtbnMgPSB0aGlzLmdyaWQubmF2aWdhdGlvbi5ncmlkT3JkZXJlZENvbHVtbnM7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdENvbCA9IG9yZGVyZWRDb2x1bW5zW29yZGVyZWRDb2x1bW5zLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIGFjdGl2ZU5vZGUuY29sdW1uID0gbGFzdENvbC5jb2x1bW5MYXlvdXRDaGlsZCA/IGxhc3RDb2wucGFyZW50LnZpc2libGVJbmRleCA6IGxhc3RDb2wudmlzaWJsZUluZGV4O1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5uYXZpZ2F0aW9uLnBlcmZvcm1UYWIodGhpcy5uYXRpdmVFbGVtZW50LCBhY3RpdmVOb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaXNLZXlTdXBwb3J0ZWRJbkdyb3VwUm93KGtleSwgc2hpZnQgPSBmYWxzZSwgYWx0ID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHNoaWZ0KSB7XG4gICAgICAgICAgICByZXR1cm4gWydkb3duJywgJ3VwJywgJ2Fycm93ZG93bicsICdhcnJvd3VwJywgJ3RhYiddLmluZGV4T2Yoa2V5KSAhPT0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaXNUb2dnbGVLZXkoa2V5LCBhbHQpID8gdHJ1ZSA6IFsnZG93bicsICd1cCcsICdhcnJvd2Rvd24nLCAnYXJyb3d1cCcsICd0YWInXS5pbmRleE9mKGtleSkgIT09IC0xO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNUb2dnbGVLZXkoa2V5LCBhbHRLZXkpIHtcbiAgICAgICAgcmV0dXJuIGFsdEtleSAmJiBbJ2xlZnQnLCAncmlnaHQnLCAndXAnLCAnZG93bicsICdhcnJvd2xlZnQnLCAnYXJyb3dyaWdodCcsICdhcnJvd3VwJywgJ2Fycm93ZG93biddLmluZGV4T2Yoa2V5KSAhPT0gLTE7XG4gICAgfVxuXG59XG4iXX0=