igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
341 lines • 31.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, HostBinding, HostListener, Input, ViewChild, } from '@angular/core';
import { GridBaseAPIService } from '../api.service';
import { IgxGridSelectionService } from '../../core/grid-selection';
import { ROW_COLLAPSE_KEYS, ROW_EXPAND_KEYS, SUPPORTED_KEYS } from '../../core/utils';
export class IgxGridGroupByRowComponent {
/**
* @param {?} gridAPI
* @param {?} gridSelection
* @param {?} element
* @param {?} cdr
*/
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;
* ```
* @return {?}
*/
get focused() {
return this.isFocused;
}
/**
* Returns whether the group row is expanded.
* ```typescript
* const groupRowExpanded = this.grid1.rowList.first.expanded;
* ```
* @return {?}
*/
get expanded() {
return this.grid.isExpandedGroup(this.groupRow);
}
/**
* @hidden
* @return {?}
*/
get describedBy() {
/** @type {?} */
const grRowExpr = this.groupRow.expression !== undefined ? this.groupRow.expression.fieldName : '';
return this.gridID + '_' + grRowExpr;
}
/**
* @return {?}
*/
get dataRowIndex() {
return this.index;
}
/**
* Returns a reference to the underlying HTML element.
* ```typescript
* const groupRowElement = this.nativeElement;
* ```
* @return {?}
*/
get nativeElement() {
return this.element.nativeElement;
}
/**
* Returns the style classes applied to the group rows.
* ```typescript
* const groupCssStyles = this.grid1.rowList.first.styleClasses;
* ```
* @return {?}
*/
get styleClasses() {
return `${this.defaultCssClass} ` + `${this.paddingIndentationCssClass}-` + this.groupRow.level +
(this.focused ? ` ${this.defaultCssClass}--active` : '');
}
/**
* @hidden
* @return {?}
*/
onFocus() {
this.isFocused = true;
}
/**
* @hidden
* @return {?}
*/
onBlur() {
this.isFocused = false;
}
/**
* Toggles the group row.
* ```typescript
* this.grid1.rowList.first.toggle()
* ```
* @return {?}
*/
toggle() {
/** @type {?} */
const isVirtualized = !this.grid.verticalScrollContainer.dc.instance.notVirtual;
/** @type {?} */
const groupRowIndex = this.index;
this.grid.toggleGroup(this.groupRow);
if (isVirtualized) {
/** @type {?} */
const groupRow = this.grid.nativeElement.querySelector(`[data-rowIndex="${groupRowIndex}"]`);
if (groupRow) {
groupRow.focus();
}
}
}
/**
* @hidden
* @param {?} event
* @return {?}
*/
onKeydown(event) {
// TODO: Refactor
/** @type {?} */
const key = event.key.toLowerCase();
if (!SUPPORTED_KEYS.has(key)) {
return;
}
event.stopPropagation();
/** @type {?} */
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;
}
// TODO: to be deleted when onFocusChange event is removed #4054
/** @type {?} */
const args = { cell: this, groupRow: null, event: event, cancel: false };
this.grid.onFocusChange.emit(args);
if (args.cancel) {
return;
}
/** @type {?} */
const selection = this.gridSelection;
selection.keyboardState.shift = event.shiftKey && !(key === 'tab');
/** @type {?} */
const visibleColumnIndex = selection.activeElement && this.grid.columnList.filter(col => !col.hidden).map(c => c.visibleIndex)
.indexOf(selection.activeElement.column) !== -1 ? selection.activeElement.column : 0;
switch (key) {
case 'arrowdown':
case 'down':
this.grid.navigation.navigateDown(this.nativeElement, this.index, visibleColumnIndex);
break;
case 'arrowup':
case 'up':
this.grid.navigation.navigateUp(this.nativeElement, this.index, visibleColumnIndex);
break;
case 'tab':
this.handleTabKey(event.shiftKey);
break;
}
}
/**
* Returns a reference to the `IgxGridComponent` the `IgxGridGroupByRowComponent` belongs to.
* ```typescript
* this.grid1.rowList.first.grid;
* ```
* @return {?}
*/
get grid() {
return this.gridAPI.grid;
}
/**
* @hidden
* @return {?}
*/
get dataType() {
return this.grid.getColumnByName(this.groupRow.expression.fieldName).dataType;
}
/**
* @private
* @param {?} shift
* @return {?}
*/
handleTabKey(shift) {
if (shift) {
this.grid.navigation.performShiftTabKey(this.nativeElement, this.index, 0);
}
else {
if (this.index === this.grid.verticalScrollContainer.igxForOf.length - 1 && this.grid.rootSummariesEnabled) {
this.grid.navigation.onKeydownHome(0, true);
}
else {
this.grid.navigation.navigateDown(this.nativeElement, this.index, 0);
}
}
}
/**
* @private
* @param {?} key
* @param {?=} shift
* @param {?=} alt
* @return {?}
*/
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;
}
/**
* @private
* @param {?} key
* @param {?} altKey
* @return {?}
*/
isToggleKey(key, altKey) {
return altKey && ['left', 'right', 'up', 'down', 'arrowleft', 'arrowright', 'arrowup', 'arrowdown'].indexOf(key) !== -1;
}
}
IgxGridGroupByRowComponent.decorators = [
{ type: Component, args: [{
changeDetection: ChangeDetectionStrategy.OnPush,
preserveWhitespaces: false,
selector: 'igx-grid-groupby-row',
template: "<ng-container #defaultGroupRow>\n <div (click)=\"toggle()\" class=\"igx-grid__grouping-indicator\">\n <igx-icon *ngIf=\"!expanded\" fontSet=\"material\">expand_more</igx-icon>\n <igx-icon *ngIf=\"expanded\" fontSet=\"material\">expand_less</igx-icon>\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 #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"
}] }
];
/** @nocollapse */
IgxGridGroupByRowComponent.ctorParameters = () => [
{ type: GridBaseAPIService },
{ type: IgxGridSelectionService },
{ type: ElementRef },
{ type: ChangeDetectorRef }
];
IgxGridGroupByRowComponent.propDecorators = {
isFocused: [{ type: Input }],
index: [{ type: Input }],
gridID: [{ type: Input }],
groupRow: [{ type: Input }],
groupContent: [{ type: ViewChild, args: ['groupContent',] }],
expanded: [{ type: HostBinding, args: ['attr.aria-expanded',] }],
tabindex: [{ type: HostBinding, args: ['attr.tabindex',] }],
describedBy: [{ type: HostBinding, args: ['attr.aria-describedby',] }],
dataRowIndex: [{ type: HostBinding, args: ['attr.data-rowIndex',] }],
styleClasses: [{ type: HostBinding, args: ['class',] }],
onFocus: [{ type: HostListener, args: ['focus',] }],
onBlur: [{ type: HostListener, args: ['blur',] }],
onKeydown: [{ type: HostListener, args: ['keydown', ['$event'],] }]
};
if (false) {
/**
* @hidden
* @type {?}
* @protected
*/
IgxGridGroupByRowComponent.prototype.defaultCssClass;
/**
* @hidden
* @type {?}
* @protected
*/
IgxGridGroupByRowComponent.prototype.paddingIndentationCssClass;
/**
* @hidden
* @type {?}
* @protected
*/
IgxGridGroupByRowComponent.prototype.isFocused;
/**
* An \@Input property that sets the index of the row.
* ```html
* <igx-grid-groupby-row [gridID]="id" [index]="rowIndex" [groupRow]="rowData" #row></igx-grid-groupby-row>
* ```
* @type {?}
*/
IgxGridGroupByRowComponent.prototype.index;
/**
* An \@Input property that sets the id of the grid the row belongs to.
* ```html
* <igx-grid-groupby-row [gridID]="id" [index]="rowIndex" [groupRow]="rowData" #row></igx-grid-groupby-row>
* ```
* @type {?}
*/
IgxGridGroupByRowComponent.prototype.gridID;
/**
* An \@Input property that specifies the group record the component renders for.
* ```typescript
* <igx-grid-groupby-row [gridID]="id" [index]="rowIndex" [groupRow]="rowData" #row></igx-grid-groupby-row>
* ```
* @type {?}
*/
IgxGridGroupByRowComponent.prototype.groupRow;
/**
* Returns a reference of the content of the group.
* ```typescript
* const groupRowContent = this.grid1.rowList.first.groupContent;
* ```
* @type {?}
*/
IgxGridGroupByRowComponent.prototype.groupContent;
/**
* @hidden
* @type {?}
*/
IgxGridGroupByRowComponent.prototype.tabindex;
/** @type {?} */
IgxGridGroupByRowComponent.prototype.gridAPI;
/**
* @type {?}
* @private
*/
IgxGridGroupByRowComponent.prototype.gridSelection;
/** @type {?} */
IgxGridGroupByRowComponent.prototype.element;
/** @type {?} */
IgxGridGroupByRowComponent.prototype.cdr;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXBieS1yb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9ncmlkcy9ncmlkL2dyb3VwYnktcm93LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFDTCxTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFcEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQVF0RixNQUFNLE9BQU8sMEJBQTBCOzs7Ozs7O0lBRW5DLFlBQW1CLE9BQXFFLEVBQzVFLGFBQXNDLEVBQ3ZDLE9BQW1CLEVBQ25CLEdBQXNCO1FBSGQsWUFBTyxHQUFQLE9BQU8sQ0FBOEQ7UUFDNUUsa0JBQWEsR0FBYixhQUFhLENBQXlCO1FBQ3ZDLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFDbkIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7Ozs7UUFLdkIsb0JBQWUsR0FBRyxxQkFBcUIsQ0FBQzs7OztRQUt4QywrQkFBMEIsR0FBRyxvQ0FBb0MsQ0FBQzs7OztRQU1sRSxjQUFTLEdBQUcsS0FBSyxDQUFDOzs7O1FBK0RyQixhQUFRLEdBQUcsQ0FBQyxDQUFDO0lBL0VpQixDQUFDOzs7Ozs7OztJQXdCdEMsSUFBSSxPQUFPO1FBQ1AsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7Ozs7Ozs7O0lBNENELElBQ0ksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFD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V0FBVyxTQUFDLHVCQUF1QjsyQkFNbkMsV0FBVyxTQUFDLG9CQUFvQjsyQkFxQmhDLFdBQVcsU0FBQyxPQUFPO3NCQVNuQixZQUFZLFNBQUMsT0FBTztxQkFRcEIsWUFBWSxTQUFDLE1BQU07d0JBMEJuQixZQUFZLFNBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDOzs7Ozs7OztJQXJKbkMscURBQWtEOzs7Ozs7SUFLbEQsZ0VBQTRFOzs7Ozs7SUFLNUUsK0NBQzRCOzs7Ozs7OztJQWtCNUIsMkNBQ3FCOzs7Ozs7OztJQVFyQiw0Q0FDc0I7Ozs7Ozs7O0lBUXRCLDhDQUNnQzs7Ozs7Ozs7SUFRaEMsa0RBQ2dDOzs7OztJQWdCaEMsOENBQ29COztJQWxGUiw2Q0FBNEU7Ozs7O0lBQ3BGLG1EQUE4Qzs7SUFDOUMsNkNBQTBCOztJQUMxQix5Q0FBNkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbnB1dCxcbiAgICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSUdyb3VwQnlSZWNvcmQgfSBmcm9tICcuLi8uLi9kYXRhLW9wZXJhdGlvbnMvZ3JvdXBieS1yZWNvcmQuaW50ZXJmYWNlJztcbmltcG9ydCB7IEdyaWRCYXNlQVBJU2VydmljZSB9IGZyb20gJy4uL2FwaS5zZXJ2aWNlJztcbmltcG9ydCB7IElneEdyaWRCYXNlQ29tcG9uZW50LCBJR3JpZERhdGFCaW5kYWJsZSB9IGZyb20gJy4uL2dyaWQtYmFzZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4R3JpZFNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL2dyaWQtc2VsZWN0aW9uJztcbmltcG9ydCB7IFJPV19DT0xMQVBTRV9LRVlTLCBST1dfRVhQQU5EX0tFWVMsIFNVUFBPUlRFRF9LRVlTIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscyc7XG5cbkBDb21wb25lbnQoe1xuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICAgIHNlbGVjdG9yOiAnaWd4LWdyaWQtZ3JvdXBieS1yb3cnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9ncm91cGJ5LXJvdy5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgSWd4R3JpZEdyb3VwQnlSb3dDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGdyaWRBUEk6IEdyaWRCYXNlQVBJU2VydmljZTxJZ3hHcmlkQmFzZUNvbXBvbmVudCAmIElHcmlkRGF0YUJpbmRhYmxlPixcbiAgICAgICAgcHJpdmF0ZSBncmlkU2VsZWN0aW9uOiBJZ3hHcmlkU2VsZWN0aW9uU2VydmljZSxcbiAgICAgICAgcHVibGljIGVsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgICAgIHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7IH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZGVmYXVsdENzc0NsYXNzID0gJ2lneC1ncmlkX19ncm91cC1yb3cnO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwYWRkaW5nSW5kZW50YXRpb25Dc3NDbGFzcyA9ICdpZ3gtZ3JpZF9fZ3JvdXAtcm93LS1wYWRkaW5nLWxldmVsJztcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHByb3RlY3RlZCBpc0ZvY3VzZWQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgcm93IGlzIGZvY3VzZWQuXG4gICAgICogYGBgXG4gICAgICogbGV0IGdyaWRSb3dGb2N1c2VkID0gdGhpcy5ncmlkMS5yb3dMaXN0LmZpcnN0LmZvY3VzZWQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGZvY3VzZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzRm9jdXNlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIHRoZSBpbmRleCBvZiB0aGUgcm93LlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQtZ3JvdXBieS1yb3cgW2dyaWRJRF09XCJpZFwiIFtpbmRleF09XCJyb3dJbmRleFwiIFtncm91cFJvd109XCJyb3dEYXRhXCIgI3Jvdz48L2lneC1ncmlkLWdyb3VwYnktcm93PlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGluZGV4OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIHRoZSBpZCBvZiB0aGUgZ3JpZCB0aGUgcm93IGJlbG9uZ3MgdG8uXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZC1ncm91cGJ5LXJvdyBbZ3JpZElEXT1cImlkXCIgW2luZGV4XT1cInJvd0luZGV4XCIgW2dyb3VwUm93XT1cInJvd0RhdGFcIiAjcm93PjwvaWd4LWdyaWQtZ3JvdXBieS1yb3c+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ3JpZElEOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzcGVjaWZpZXMgdGhlIGdyb3VwIHJlY29yZCB0aGUgY29tcG9uZW50IHJlbmRlcnMgZm9yLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiA8aWd4LWdyaWQtZ3JvdXBieS1yb3cgW2dyaWRJRF09XCJpZFwiIFtpbmRleF09XCJyb3dJbmRleFwiIFtncm91cFJvd109XCJyb3dEYXRhXCIgI3Jvdz48L2lneC1ncmlkLWdyb3VwYnktcm93PlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdyb3VwUm93OiBJR3JvdXBCeVJlY29yZDtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSByZWZlcmVuY2Ugb2YgdGhlIGNvbnRlbnQgb2YgdGhlIGdyb3VwLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBncm91cFJvd0NvbnRlbnQgPSB0aGlzLmdyaWQxLnJvd0xpc3QuZmlyc3QuZ3JvdXBDb250ZW50O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2dyb3VwQ29udGVudCcpXG4gICAgcHVibGljIGdyb3VwQ29udGVudDogRWxlbWVudFJlZjtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZ3JvdXAgcm93IGlzIGV4cGFuZGVkLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBncm91cFJvd0V4cGFuZGVkID0gdGhpcy5ncmlkMS5yb3dMaXN0LmZpcnN0LmV4cGFuZGVkO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWV4cGFuZGVkJylcbiAgICBnZXQgZXhwYW5kZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWQuaXNFeHBhbmRlZEdyb3VwKHRoaXMuZ3JvdXBSb3cpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIudGFiaW5kZXgnKVxuICAgIHB1YmxpYyB0YWJpbmRleCA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtZGVzY3JpYmVkYnknKVxuICAgIGdldCBkZXNjcmliZWRCeSgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBnclJvd0V4cHIgPSB0aGlzLmdyb3VwUm93LmV4cHJlc3Npb24gIT09IHVuZGVmaW5lZCA/IHRoaXMuZ3JvdXBSb3cuZXhwcmVzc2lvbi5maWVsZE5hbWUgOiAnJztcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZElEICsgJ18nICsgZ3JSb3dFeHByO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnYXR0ci5kYXRhLXJvd0luZGV4JylcbiAgICBnZXQgZGF0YVJvd0luZGV4KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmRleDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSB1bmRlcmx5aW5nIEhUTUwgZWxlbWVudC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZ3JvdXBSb3dFbGVtZW50ID0gdGhpcy5uYXRpdmVFbGVtZW50O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdldCBuYXRpdmVFbGVtZW50KCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBjbGFzc2VzIGFwcGxpZWQgdG8gdGhlIGdyb3VwIHJvd3MuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGdyb3VwQ3NzU3R5bGVzID0gdGhpcy5ncmlkMS5yb3dMaXN0LmZpcnN0LnN0eWxlQ2xhc3NlcztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgICBnZXQgc3R5bGVDbGFzc2VzKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLmRlZmF1bHRDc3NDbGFzc30gYCArIGAke3RoaXMucGFkZGluZ0luZGVudGF0aW9uQ3NzQ2xhc3N9LWAgKyB0aGlzLmdyb3VwUm93LmxldmVsICtcbiAgICAgICAgICAgICh0aGlzLmZvY3VzZWQgPyBgICR7dGhpcy5kZWZhdWx0Q3NzQ2xhc3N9LS1hY3RpdmVgIDogJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2ZvY3VzJylcbiAgICBwdWJsaWMgb25Gb2N1cygpIHtcbiAgICAgICAgdGhpcy5pc0ZvY3VzZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2JsdXInKVxuICAgIHB1YmxpYyBvbkJsdXIoKSB7XG4gICAgICAgIHRoaXMuaXNGb2N1c2VkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgZ3JvdXAgcm93LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQxLnJvd0xpc3QuZmlyc3QudG9nZ2xlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlKCkge1xuICAgICAgICBjb25zdCBpc1ZpcnR1YWxpemVkID0gIXRoaXMuZ3JpZC52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5kYy5pbnN0YW5jZS5ub3RWaXJ0dWFsO1xuICAgICAgICBjb25zdCBncm91cFJvd0luZGV4ID0gdGhpcy5pbmRleDtcbiAgICAgICAgdGhpcy5ncmlkLnRvZ2dsZUdyb3VwKHRoaXMuZ3JvdXBSb3cpO1xuICAgICAgICBpZiAoaXNWaXJ0dWFsaXplZCkge1xuICAgICAgICAgICAgY29uc3QgZ3JvdXBSb3cgPSB0aGlzLmdyaWQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1yb3dJbmRleD1cIiR7Z3JvdXBSb3dJbmRleH1cIl1gKTtcbiAgICAgICAgICAgIGlmIChncm91cFJvdykge1xuICAgICAgICAgICAgICAgIGdyb3VwUm93LmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uS2V5ZG93bihldmVudCkge1xuICAgICAgICAvLyBUT0RPOiBSZWZhY3RvclxuICAgICAgICBjb25zdCBrZXkgPSBldmVudC5rZXkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCFTVVBQT1JURURfS0VZUy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBjb25zdCBrZXlkb3duQXJncyA9IHsgdGFyZ2V0VHlwZTogJ2dyb3VwUm93JywgdGFyZ2V0OiB0aGlzLCBldmVudDogZXZlbnQsIGNhbmNlbDogZmFsc2UgfTtcbiAgICAgICAgdGhpcy5ncmlkLm9uR3JpZEtleWRvd24uZW1pdChrZXlkb3duQXJncyk7XG4gICAgICAgIGlmIChrZXlkb3duQXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGlmICghdGhpcy5pc0tleVN1cHBvcnRlZEluR3JvdXBSb3coa2V5LCBldmVudC5zaGlmdEtleSwgZXZlbnQuYWx0S2V5KSB8fCBldmVudC5jdHJsS2V5KSB7IHJldHVybjsgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzVG9nZ2xlS2V5KGtleSwgZXZlbnQuYWx0S2V5KSkge1xuICAgICAgICAgICAgaWYgKCh0aGlzLmV4cGFuZGVkICYmIFJPV19DT0xMQVBTRV9LRVlTLmhhcyhrZXkpKSB8fCAoIXRoaXMuZXhwYW5kZWQgJiYgUk9XX0VYUEFORF9LRVlTLmhhcyhrZXkpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETzogdG8gYmUgZGVsZXRlZCB3aGVuIG9uRm9jdXNDaGFuZ2UgZXZlbnQgaXMgcmVtb3ZlZCAjNDA1NFxuICAgICAgICBjb25zdCBhcmdzID0geyBjZWxsOiB0aGlzLCBncm91cFJvdzogbnVsbCwgZXZlbnQ6IGV2ZW50LCBjYW5jZWw6IGZhbHNlIH07XG4gICAgICAgIHRoaXMuZ3JpZC5vbkZvY3VzQ2hhbmdlLmVtaXQoYXJncyk7XG4gICAgICAgIGlmIChhcmdzLmNhbmNlbCkgeyByZXR1cm47IH1cblxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmdyaWRTZWxlY3Rpb247XG4gICAgICAgIHNlbGVjdGlvbi5rZXlib2FyZFN0YXRlLnNoaWZ0ID0gZXZlbnQuc2hpZnRLZXkgJiYgIShrZXkgPT09ICd0YWInKTtcblxuICAgICAgICBjb25zdCB2aXNpYmxlQ29sdW1uSW5kZXggPSBzZWxlY3Rpb24uYWN0aXZlRWxlbWVudCAmJiB0aGlzLmdyaWQuY29sdW1uTGlzdC5maWx0ZXIoY29sID0+ICFjb2wuaGlkZGVuKS5tYXAoYyA9PiBjLnZpc2libGVJbmRleClcbiAgICAgICAgICAgICAgICAuaW5kZXhPZihzZWxlY3Rpb24uYWN0aXZlRWxlbWVudC5jb2x1bW4pICE9PSAtMSA/IHNlbGVjdGlvbi5hY3RpdmVFbGVtZW50LmNvbHVtbiA6IDA7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdhcnJvd2Rvd24nOlxuICAgICAgICAgICAgY2FzZSAnZG93bic6XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkLm5hdmlnYXRpb24ubmF2aWdhdGVEb3duKHRoaXMubmF0aXZlRWxlbWVudCwgdGhpcy5pbmRleCwgdmlzaWJsZUNvbHVtbkluZGV4KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2Fycm93dXAnOlxuICAgICAgICAgICAgY2FzZSAndXAnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5uYXZpZ2F0aW9uLm5hdmlnYXRlVXAodGhpcy5uYXRpdmVFbGVtZW50LCB0aGlzLmluZGV4LCB2aXNpYmxlQ29sdW1uSW5kZXgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAndGFiJzpcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRhYktleShldmVudC5zaGlmdEtleSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBgSWd4R3JpZENvbXBvbmVudGAgdGhlIGBJZ3hHcmlkR3JvdXBCeVJvd0NvbXBvbmVudGAgYmVsb25ncyB0by5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkMS5yb3dMaXN0LmZpcnN0LmdyaWQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGdyaWQoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZEFQSS5ncmlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgZGF0YVR5cGUoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5nZXRDb2x1bW5CeU5hbWUodGhpcy5ncm91cFJvdy5leHByZXNzaW9uLmZpZWxkTmFtZSkuZGF0YVR5cGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVUYWJLZXkoc2hpZnQpIHtcbiAgICAgICAgaWYgKHNoaWZ0KSB7XG4gICAgICAgICAgICB0aGlzLmdyaWQubmF2aWdhdGlvbi5wZXJmb3JtU2hpZnRUYWJLZXkodGhpcy5uYXRpdmVFbGVtZW50LCB0aGlzLmluZGV4LCAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmluZGV4ID09PSB0aGlzLmdyaWQudmVydGljYWxTY3JvbGxDb250YWluZXIuaWd4Rm9yT2YubGVuZ3RoIC0gMSAmJiB0aGlzLmdyaWQucm9vdFN1bW1hcmllc0VuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWQubmF2aWdhdGlvbi5vbktleWRvd25Ib21lKDAsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWQubmF2aWdhdGlvbi5uYXZpZ2F0ZURvd24odGhpcy5uYXRpdmVFbGVtZW50LCB0aGlzLmluZGV4LCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaXNLZXlTdXBwb3J0ZWRJbkdyb3VwUm93KGtleSwgc2hpZnQgPSBmYWxzZSwgYWx0ID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHNoaWZ0KSB7XG4gICAgICAgICAgICByZXR1cm4gWydkb3duJywgJ3VwJywgJ2Fycm93ZG93bicsICdhcnJvd3VwJywgJ3RhYiddLmluZGV4T2Yoa2V5KSAhPT0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaXNUb2dnbGVLZXkoa2V5LCBhbHQpID8gdHJ1ZSA6IFsnZG93bicsICd1cCcsICdhcnJvd2Rvd24nLCAnYXJyb3d1cCcsICd0YWInXS5pbmRleE9mKGtleSkgIT09IC0xO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNUb2dnbGVLZXkoa2V5LCBhbHRLZXkpIHtcbiAgICAgICAgcmV0dXJuIGFsdEtleSAmJiBbJ2xlZnQnLCAncmlnaHQnLCAndXAnLCAnZG93bicsICdhcnJvd2xlZnQnLCAnYXJyb3dyaWdodCcsICdhcnJvd3VwJywgJ2Fycm93ZG93biddLmluZGV4T2Yoa2V5KSAhPT0gLTE7XG4gICAgfVxuXG59XG4iXX0=