ngx-mat-multi-sort-fork
Version:
An extension for the angular material table to support multi-sorting.
89 lines • 19.2 kB
JavaScript
import { Component, Input, Optional, Inject, HostListener, HostBinding, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';
import { matSortAnimations, MatSortHeader } from '@angular/material/sort';
import * as i0 from "@angular/core";
import * as i1 from "@angular/material/sort";
import * as i2 from "../mat-multi-sort.directive";
import * as i3 from "@angular/cdk/a11y";
import * as i4 from "@angular/common";
export class MatMultiSortHeaderComponent extends MatSortHeader {
constructor(_intl, changeDetectorRef, _sort, _columnDef, _focusMonitor, _elementRef) {
super(_intl, changeDetectorRef, _sort, _columnDef, _focusMonitor, _elementRef);
this._intl = _intl;
this._sort = _sort;
this._columnDef = _columnDef;
this.start = 'asc';
}
__setIndicatorHintVisible(visible) {
super._setIndicatorHintVisible(visible);
}
_handleClick() {
this._sort.direction = this.getSortDirection();
super._handleClick();
}
_isSorted() {
return this._sort.actives.findIndex(activeId => activeId === this.id) > -1;
}
_sortId() {
return this._sort.actives.findIndex(activeId => activeId === this.id) + 1;
}
_updateArrowDirection() {
this._arrowDirection = this.getSortDirection();
}
_getAriaSortAttribute() {
if (!this._isSorted()) {
return 'none';
}
return this.getSortDirection() === 'asc' ? 'ascending' : 'descending';
}
_renderArrow() {
return !this._isDisabled() || this._isSorted();
}
getSortDirection() {
const i = this._sort.actives.findIndex(activeIds => activeIds === this.id);
const direction = this._sort.directions[i];
return this._isSorted() ? direction : (this.start || this._sort.start);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.5", ngImport: i0, type: MatMultiSortHeaderComponent, deps: [{ token: i1.MatSortHeaderIntl }, { token: i0.ChangeDetectorRef }, { token: i2.MatMultiSort, optional: true }, { token: 'C2_SORT_HEADER_COLUMN_DEF', optional: true }, { token: i3.FocusMonitor }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.5", type: MatMultiSortHeaderComponent, selector: "[mat-multi-sort-header]", inputs: { id: ["mat-multi-sort-header", "id"] }, host: { listeners: { "mouseenter": "__setIndicatorHintVisible(true)", "longpress": "__setIndicatorHintVisible(true)", "mouseleave": "__setIndicatorHintVisible(false)" }, properties: { "attr.aria-sort": "this._getAriaSortAttribute" } }, exportAs: ["matMultiSortHeader"], usesInheritance: true, ngImport: i0, template: "<div class=\"mat-sort-header-container\"\r\n [class.mat-sort-header-sorted]=\"_isSorted()\"\r\n [class.mat-sort-header-position-before]=\"arrowPosition == 'before'\">\r\n\r\n <div class=\"mat-sort-header-content\">\r\n <ng-content></ng-content>\r\n </div>\r\n\r\n <!-- Disable animations while a current animation is running -->\r\n <div class=\"mat-sort-header-arrow\"\r\n *ngIf=\"_renderArrow()\"\r\n [@arrowOpacity]=\"_getArrowViewState()\"\r\n [@arrowPosition]=\"_getArrowViewState()\"\r\n [@allowChildren]=\"_getArrowDirectionState()\"\r\n (@arrowPosition.start)=\"_disableViewStateAnimation = true\"\r\n (@arrowPosition.done)=\"_disableViewStateAnimation = false\">\r\n <div class=\"mat-sort-header-stem\"></div>\r\n <div class=\"mat-sort-header-indicator\" [@indicator]=\"_getArrowDirectionState()\">\r\n <div class=\"mat-sort-header-pointer-left\" [@leftPointer]=\"_getArrowDirectionState()\"></div>\r\n <div class=\"mat-sort-header-pointer-right\" [@rightPointer]=\"_getArrowDirectionState()\"></div>\r\n <div class=\"mat-sort-header-pointer-middle\"></div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"_isSorted()\">{{_sortId()}}</div>\r\n</div>\r\n", styles: [".mat-sort-header-container{display:flex;cursor:pointer;align-items:center}.mat-sort-header-disabled .mat-sort-header-container{cursor:default}.mat-sort-header-position-before{flex-direction:row-reverse}.mat-sort-header-content{text-align:center;display:flex;align-items:center}.mat-sort-header-arrow{height:12px;width:12px;min-width:12px;position:relative;display:flex;opacity:0}.mat-sort-header-arrow,[dir=rtl] .mat-sort-header-position-before .mat-sort-header-arrow{margin:0 0 0 6px}.mat-sort-header-position-before .mat-sort-header-arrow,[dir=rtl] .mat-sort-header-arrow{margin:0 6px 0 0}.mat-sort-header-stem{background:currentColor;height:10px;width:2px;margin:auto;display:flex;align-items:center}.mat-sort-header-indicator{width:100%;height:2px;display:flex;align-items:center;position:absolute;top:0;left:0}.mat-sort-header-pointer-middle{margin:auto;height:2px;width:2px;background:currentColor;transform:rotate(45deg)}.mat-sort-header-pointer-left,.mat-sort-header-pointer-right{background:currentColor;width:6px;height:2px;position:absolute;top:0}.mat-sort-header-pointer-left{transform-origin:right;left:0}.mat-sort-header-pointer-right{transform-origin:left;right:0}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], animations: [
matSortAnimations.indicator,
matSortAnimations.leftPointer,
matSortAnimations.rightPointer,
matSortAnimations.arrowOpacity,
matSortAnimations.arrowPosition,
matSortAnimations.allowChildren
], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.5", ngImport: i0, type: MatMultiSortHeaderComponent, decorators: [{
type: Component,
args: [{ selector: '[mat-multi-sort-header]', exportAs: 'matMultiSortHeader', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, animations: [
matSortAnimations.indicator,
matSortAnimations.leftPointer,
matSortAnimations.rightPointer,
matSortAnimations.arrowOpacity,
matSortAnimations.arrowPosition,
matSortAnimations.allowChildren
], template: "<div class=\"mat-sort-header-container\"\r\n [class.mat-sort-header-sorted]=\"_isSorted()\"\r\n [class.mat-sort-header-position-before]=\"arrowPosition == 'before'\">\r\n\r\n <div class=\"mat-sort-header-content\">\r\n <ng-content></ng-content>\r\n </div>\r\n\r\n <!-- Disable animations while a current animation is running -->\r\n <div class=\"mat-sort-header-arrow\"\r\n *ngIf=\"_renderArrow()\"\r\n [@arrowOpacity]=\"_getArrowViewState()\"\r\n [@arrowPosition]=\"_getArrowViewState()\"\r\n [@allowChildren]=\"_getArrowDirectionState()\"\r\n (@arrowPosition.start)=\"_disableViewStateAnimation = true\"\r\n (@arrowPosition.done)=\"_disableViewStateAnimation = false\">\r\n <div class=\"mat-sort-header-stem\"></div>\r\n <div class=\"mat-sort-header-indicator\" [@indicator]=\"_getArrowDirectionState()\">\r\n <div class=\"mat-sort-header-pointer-left\" [@leftPointer]=\"_getArrowDirectionState()\"></div>\r\n <div class=\"mat-sort-header-pointer-right\" [@rightPointer]=\"_getArrowDirectionState()\"></div>\r\n <div class=\"mat-sort-header-pointer-middle\"></div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"_isSorted()\">{{_sortId()}}</div>\r\n</div>\r\n", styles: [".mat-sort-header-container{display:flex;cursor:pointer;align-items:center}.mat-sort-header-disabled .mat-sort-header-container{cursor:default}.mat-sort-header-position-before{flex-direction:row-reverse}.mat-sort-header-content{text-align:center;display:flex;align-items:center}.mat-sort-header-arrow{height:12px;width:12px;min-width:12px;position:relative;display:flex;opacity:0}.mat-sort-header-arrow,[dir=rtl] .mat-sort-header-position-before .mat-sort-header-arrow{margin:0 0 0 6px}.mat-sort-header-position-before .mat-sort-header-arrow,[dir=rtl] .mat-sort-header-arrow{margin:0 6px 0 0}.mat-sort-header-stem{background:currentColor;height:10px;width:2px;margin:auto;display:flex;align-items:center}.mat-sort-header-indicator{width:100%;height:2px;display:flex;align-items:center;position:absolute;top:0;left:0}.mat-sort-header-pointer-middle{margin:auto;height:2px;width:2px;background:currentColor;transform:rotate(45deg)}.mat-sort-header-pointer-left,.mat-sort-header-pointer-right{background:currentColor;width:6px;height:2px;position:absolute;top:0}.mat-sort-header-pointer-left{transform-origin:right;left:0}.mat-sort-header-pointer-right{transform-origin:left;right:0}\n"] }]
}], ctorParameters: () => [{ type: i1.MatSortHeaderIntl }, { type: i0.ChangeDetectorRef }, { type: i2.MatMultiSort, decorators: [{
type: Optional
}] }, { type: undefined, decorators: [{
type: Inject,
args: ['C2_SORT_HEADER_COLUMN_DEF']
}, {
type: Optional
}] }, { type: i3.FocusMonitor }, { type: i0.ElementRef }], propDecorators: { id: [{
type: Input,
args: ['mat-multi-sort-header']
}], __setIndicatorHintVisible: [{
type: HostListener,
args: ['mouseenter', ['true']]
}, {
type: HostListener,
args: ['longpress', ['true']]
}, {
type: HostListener,
args: ['mouseleave', ['false']]
}], _getAriaSortAttribute: [{
type: HostBinding,
args: ['attr.aria-sort']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0LW11bHRpLXNvcnQtaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21hdC1tdWx0aS1zb3J0L3NyYy9saWIvbWF0LW11bHRpLXNvcnQtaGVhZGVyL21hdC1tdWx0aS1zb3J0LWhlYWRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXQtbXVsdGktc29ydC9zcmMvbGliL21hdC1tdWx0aS1zb3J0LWhlYWRlci9tYXQtbXVsdGktc29ydC1oZWFkZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBRUwsUUFBUSxFQUNSLE1BQU0sRUFDTixZQUFZLEVBQ1osV0FBVyxFQUNYLGlCQUFpQixFQUNqQix1QkFBdUIsRUFFeEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBcUIsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7O0FBeUI3RixNQUFNLE9BQU8sMkJBQTRCLFNBQVEsYUFBYTtJQUk1RCxZQUFtQixLQUF3QixFQUN6QyxpQkFBb0MsRUFDakIsS0FBbUIsRUFDa0IsVUFBb0MsRUFDNUYsYUFBMkIsRUFDM0IsV0FBb0M7UUFDcEMsS0FBSyxDQUFDLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQztRQU45RCxVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUV0QixVQUFLLEdBQUwsS0FBSyxDQUFjO1FBQ2tCLGVBQVUsR0FBVixVQUFVLENBQTBCO1FBTjlGLFVBQUssR0FBRyxLQUF1QixDQUFDO0lBVWhDLENBQUM7SUFLRCx5QkFBeUIsQ0FBQyxPQUF5QjtRQUNqRCxLQUFLLENBQUMsd0JBQXdCLENBQUMsT0FBa0IsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCxZQUFZ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bnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgSW5wdXQsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgT3B0aW9uYWwsXHJcbiAgSW5qZWN0LFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBIb3N0QmluZGluZyxcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBFbGVtZW50UmVmXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IG1hdFNvcnRBbmltYXRpb25zLCBNYXRTb3J0SGVhZGVyLCBNYXRTb3J0SGVhZGVySW50bCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xyXG5pbXBvcnQgeyBNYXRNdWx0aVNvcnQgfSBmcm9tICcuLi9tYXQtbXVsdGktc29ydC5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBGb2N1c01vbml0b3IgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XHJcblxyXG4vKiogQ29sdW1uIGRlZmluaXRpb24gYXNzb2NpYXRlZCB3aXRoIGEgYE1hdFNvcnRIZWFkZXJgLiAqL1xyXG5pbnRlcmZhY2UgQzJNYXRTb3J0SGVhZGVyQ29sdW1uRGVmIHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnW21hdC1tdWx0aS1zb3J0LWhlYWRlcl0nLFxyXG4gIGV4cG9ydEFzOiAnbWF0TXVsdGlTb3J0SGVhZGVyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbWF0LW11bHRpLXNvcnQtaGVhZGVyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9tYXQtbXVsdGktc29ydC1oZWFkZXIuY29tcG9uZW50LnNjc3MnXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIGFuaW1hdGlvbnM6IFtcclxuICAgIG1hdFNvcnRBbmltYXRpb25zLmluZGljYXRvcixcclxuICAgIG1hdFNvcnRBbmltYXRpb25zLmxlZnRQb2ludGVyLFxyXG4gICAgbWF0U29ydEFuaW1hdGlvbnMucmlnaHRQb2ludGVyLFxyXG4gICAgbWF0U29ydEFuaW1hdGlvbnMuYXJyb3dPcGFjaXR5LFxyXG4gICAgbWF0U29ydEFuaW1hdGlvbnMuYXJyb3dQb3NpdGlvbixcclxuICAgIG1hdFNvcnRBbmltYXRpb25zLmFsbG93Q2hpbGRyZW5cclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNYXRNdWx0aVNvcnRIZWFkZXJDb21wb25lbnQgZXh0ZW5kcyBNYXRTb3J0SGVhZGVyIHtcclxuICBzdGFydCA9ICdhc2MnIGFzICdhc2MnIHwgJ2Rlc2MnO1xyXG4gIEBJbnB1dCgnbWF0LW11bHRpLXNvcnQtaGVhZGVyJykgaWQhOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBfaW50bDogTWF0U29ydEhlYWRlckludGwsXHJcbiAgICBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBAT3B0aW9uYWwoKSBwdWJsaWMgX3NvcnQ6IE1hdE11bHRpU29ydCxcclxuICAgIEBJbmplY3QoJ0MyX1NPUlRfSEVBREVSX0NPTFVNTl9ERUYnKSBAT3B0aW9uYWwoKSBwdWJsaWMgX2NvbHVtbkRlZjogQzJNYXRTb3J0SGVhZGVyQ29sdW1uRGVmLFxyXG4gICAgX2ZvY3VzTW9uaXRvcjogRm9jdXNNb25pdG9yLFxyXG4gICAgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KSB7XHJcbiAgICBzdXBlcihfaW50bCwgY2hhbmdlRGV0ZWN0b3JSZWYsIF9zb3J0LCBfY29sdW1uRGVmLCBfZm9jdXNNb25pdG9yLCBfZWxlbWVudFJlZik7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdtb3VzZWVudGVyJywgWyd0cnVlJ10pXHJcbiAgQEhvc3RMaXN0ZW5lcignbG9uZ3ByZXNzJywgWyd0cnVlJ10pXHJcbiAgQEhvc3RMaXN0ZW5lcignbW91c2VsZWF2ZScsIFsnZmFsc2UnXSlcclxuICBfX3NldEluZGljYXRvckhpbnRWaXNpYmxlKHZpc2libGU6IHN0cmluZyB8IGJvb2xlYW4pIHtcclxuICAgIHN1cGVyLl9zZXRJbmRpY2F0b3JIaW50VmlzaWJsZSh2aXNpYmxlIGFzIGJvb2xlYW4pO1xyXG4gIH1cclxuXHJcbiAgX2hhbmRsZUNsaWNrKCkge1xyXG4gICAgdGhpcy5fc29ydC5kaXJlY3Rpb24gPSB0aGlzLmdldFNvcnREaXJlY3Rpb24oKTtcclxuICAgIHN1cGVyLl9oYW5kbGVDbGljaygpO1xyXG4gIH1cclxuXHJcbiAgX2lzU29ydGVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NvcnQuYWN0aXZlcy5maW5kSW5kZXgoYWN0aXZlSWQgPT4gYWN0aXZlSWQgPT09IHRoaXMuaWQpID4gLTE7XHJcbiAgfVxyXG5cclxuICBfc29ydElkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NvcnQuYWN0aXZlcy5maW5kSW5kZXgoYWN0aXZlSWQgPT4gYWN0aXZlSWQgPT09IHRoaXMuaWQpICsgMTtcclxuICB9XHJcblxyXG4gIF91cGRhdGVBcnJvd0RpcmVjdGlvbigpIHtcclxuICAgIHRoaXMuX2Fycm93RGlyZWN0aW9uID0gdGhpcy5nZXRTb3J0RGlyZWN0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1zb3J0JylcclxuICBfZ2V0QXJpYVNvcnRBdHRyaWJ1dGUoKSB7XHJcbiAgICBpZiAoIXRoaXMuX2lzU29ydGVkKCkpIHtcclxuICAgICAgcmV0dXJuICdub25lJztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5nZXRTb3J0RGlyZWN0aW9uKCkgPT09ICdhc2MnID8gJ2FzY2VuZGluZycgOiAnZGVzY2VuZGluZyc7XHJcbiAgfVxyXG5cclxuICBfcmVuZGVyQXJyb3coKSB7XHJcbiAgICByZXR1cm4gIXRoaXMuX2lzRGlzYWJsZWQoKSB8fCB0aGlzLl9pc1NvcnRlZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0U29ydERpcmVjdGlvbigpOiAnYXNjJyB8ICdkZXNjJyB8ICcnIHtcclxuICAgIGNvbnN0IGkgPSB0aGlzLl9zb3J0LmFjdGl2ZXMuZmluZEluZGV4KGFjdGl2ZUlkcyA9PiBhY3RpdmVJZHMgPT09IHRoaXMuaWQpO1xyXG4gICAgY29uc3QgZGlyZWN0aW9uID0gdGhpcy5fc29ydC5kaXJlY3Rpb25zW2ldO1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzU29ydGVkKCkgPyBkaXJlY3Rpb24gOiAodGhpcy5zdGFydCB8fCB0aGlzLl9zb3J0LnN0YXJ0KTtcclxuICB9XHJcblxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJtYXQtc29ydC1oZWFkZXItY29udGFpbmVyXCJcclxuICAgICBbY2xhc3MubWF0LXNvcnQtaGVhZGVyLXNvcnRlZF09XCJfaXNTb3J0ZWQoKVwiXHJcbiAgICAgW2NsYXNzLm1hdC1zb3J0LWhlYWRlci1wb3NpdGlvbi1iZWZvcmVdPVwiYXJyb3dQb3NpdGlvbiA9PSAnYmVmb3JlJ1wiPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwibWF0LXNvcnQtaGVhZGVyLWNvbnRlbnRcIj5cclxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBEaXNhYmxlIGFuaW1hdGlvbnMgd2hpbGUgYSBjdXJyZW50IGFuaW1hdGlvbiBpcyBydW5uaW5nIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJtYXQtc29ydC1oZWFkZXItYXJyb3dcIlxyXG4gICAgICAgKm5nSWY9XCJfcmVuZGVyQXJyb3coKVwiXHJcbiAgICAgICBbQGFycm93T3BhY2l0eV09XCJfZ2V0QXJyb3dWaWV3U3RhdGUoKVwiXHJcbiAgICAgICBbQGFycm93UG9zaXRpb25dPVwiX2dldEFycm93Vmlld1N0YXRlKClcIlxyXG4gICAgICAgW0BhbGxvd0NoaWxkcmVuXT1cIl9nZXRBcnJvd0RpcmVjdGlvblN0YXRlKClcIlxyXG4gICAgICAgKEBhcnJvd1Bvc2l0aW9uLnN0YXJ0KT1cIl9kaXNhYmxlVmlld1N0YXRlQW5pbWF0aW9uID0gdHJ1ZVwiXHJcbiAgICAgICAoQGFycm93UG9zaXRpb24uZG9uZSk9XCJfZGlzYWJsZVZpZXdTdGF0ZUFuaW1hdGlvbiA9IGZhbHNlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWF0LXNvcnQtaGVhZGVyLXN0ZW1cIj48L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJtYXQtc29ydC1oZWFkZXItaW5kaWNhdG9yXCIgW0BpbmRpY2F0b3JdPVwiX2dldEFycm93RGlyZWN0aW9uU3RhdGUoKVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWF0LXNvcnQtaGVhZGVyLXBvaW50ZXItbGVmdFwiIFtAbGVmdFBvaW50ZXJdPVwiX2dldEFycm93RGlyZWN0aW9uU3RhdGUoKVwiPjwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWF0LXNvcnQtaGVhZGVyLXBvaW50ZXItcmlnaHRcIiBbQHJpZ2h0UG9pbnRlcl09XCJfZ2V0QXJyb3dEaXJlY3Rpb25TdGF0ZSgpXCI+PC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYXQtc29ydC1oZWFkZXItcG9pbnRlci1taWRkbGVcIj48L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgKm5nSWY9XCJfaXNTb3J0ZWQoKVwiPnt7X3NvcnRJZCgpfX08L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==