angular2-collapsible
Version:
Angular collapsible component styled with Materialize CSS.
644 lines • 65.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/collapsible-table/collapsible-table.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, HostBinding, HostListener, ElementRef, ContentChildren } from '@angular/core';
import { CollapsibleTableRowComponent } from '../collapsible-table-row/collapsible-table-row.component';
import { CollapsibleService } from '../services/collapsible.service';
var CollapsibleTableComponent = /** @class */ (function () {
function CollapsibleTableComponent(el, collapsibleService) {
this.el = el;
this.collapsibleService = collapsibleService;
// allows navigation between table rows using arrow keys
this.allowKeyboardNavigation = true;
this.fixedTableHeight = 'auto';
this.tabindex = 0;
this.selectedRows = [];
// specifies collapsible type. Can be either 'accordion' or 'expandable'
this.type = 'accordion';
this.mouseDownHold = false;
}
/**
* @return {?}
*/
CollapsibleTableComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
};
/**
* @return {?}
*/
CollapsibleTableComponent.prototype.ngAfterContentInit = /**
* @return {?}
*/
function () {
// this.updateFixedTableHeight();
/*
LOG(`CollapsibleTableComponent::ngOnInit()\n` +
`this = {\n` +
`bordered = ${this.bordered}\n` +
`borderedHorizontally = ${this.borderedHorizontally}\n` +
`borderedVertically = ${this.borderedVertically}\n` +
`striped = ${this.striped}\n` +
`stripedOddColor = ${this.stripedOddColor}\n` +
`stripedEvenColor = ${this.stripedEvenColor}\n` +
`highlight = ${this.highlight}\n` +
`highlightColor = ${this.highlightColor}\n` +
`highlightTextColor = ${this.highlightTextColor}\n` +
`activeColor = ${this.activeColor}\n` +
`activeTextColor = ${this.activeTextColor}\n` +
`centered = ${this.centered}\n` +
`responsive = ${this.responsive}\n` +
`select = ${this.select}\n` +
`selectColor = ${this.selectColor}\n` +
`selectTextColor = ${this.selectTextColor}\n` +
`selectMultipleRows = ${this.selectMultipleRows}\n` +
`noTextSelect = ${this.noTextSelect}\n` +
`}`);
*/
};
/**
* @param {?} changes
* @return {?}
*/
CollapsibleTableComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
for (var change in changes) {
if (changes.hasOwnProperty(change)) {
if (this.collapsibleTableRows != null) {
switch (change) {
case 'striped':
case 'stripedOddColor':
case 'stripedOddTextColor':
case 'stripedEvenColor':
case 'stripedEvenTextColor':
this.updateTable('striped');
break;
case 'highlight':
case 'highlightColor':
case 'highlightTextColor':
this.updateTable('highlight');
break;
case 'activeColor':
case 'activeTextColor':
this.updateTable('active');
break;
case 'select':
case 'selectColor':
case 'selectTextColor':
case 'selectMultipleRows':
case 'allowDeselectingRows':
this.updateTable('select');
break;
}
}
// update collapsible table type in CollapsibleService
if (change === 'type') {
this.type = changes.type.currentValue;
this.collapsibleService.setType(this.type);
}
}
}
this.collapsibleService.setCollapsibleTable(this);
};
/**
* @return {?}
*/
CollapsibleTableComponent.prototype.focus = /**
* @return {?}
*/
function () {
this.el.nativeElement.focus();
};
/**
* @param {?} index
* @return {?}
*/
CollapsibleTableComponent.prototype.addSelectedRow = /**
* @param {?} index
* @return {?}
*/
function (index) {
switch (true) {
case this.selectMultipleRows && this.selectedRows.indexOf(index) === -1:
this.selectedRows.push(index);
this.selectedRows.sort((/**
* @param {?} a
* @param {?} b
* @return {?}
*/
function (a, b) { return a - b; }));
break;
case !this.selectMultipleRows:
this.selectedRows = [];
this.deselectAllRows();
this.selectedRows.push(index);
this.selectedRows.sort((/**
* @param {?} a
* @param {?} b
* @return {?}
*/
function (a, b) { return a - b; }));
break;
}
};
/**
* @param {?} index
* @return {?}
*/
CollapsibleTableComponent.prototype.removeSelectedRow = /**
* @param {?} index
* @return {?}
*/
function (index) {
if (this.selectedRows.indexOf(index) !== -1) {
this.selectedRows.splice(this.selectedRows.indexOf(index), 1);
}
};
/**
* @return {?}
*/
CollapsibleTableComponent.prototype.clearSelectedRows = /**
* @return {?}
*/
function () {
this.selectedRows = [];
};
/**
* @return {?}
*/
CollapsibleTableComponent.prototype.deselectAllRows = /**
* @return {?}
*/
function () {
this.collapsibleTableRows.forEach((/**
* @param {?} row
* @return {?}
*/
function (row) {
row.selected = false;
row.updateRow();
}));
};
/**
* @param {?} index
* @return {?}
*/
CollapsibleTableComponent.prototype.selectRow = /**
* @param {?} index
* @return {?}
*/
function (index) {
var _this = this;
if (this.select) {
switch (true) {
case index === 0:
this.selectRow(1);
break;
case index === this.collapsibleTableRows.length:
this.selectRow(this.collapsibleTableRows.length - 1);
break;
case 0 < index && index <= this.collapsibleTableRows.length - 1:
this.addSelectedRow(index);
this.collapsibleTableRows.forEach((/**
* @param {?} row
* @param {?} i
* @return {?}
*/
function (row, i) {
if (index !== i) {
if (!_this.selectMultipleRows) {
row.selected = false;
}
}
else {
row.selected = true;
}
row.updateRow();
}));
break;
}
}
};
/**
* @param {?} firstRowIndex
* @param {?} lastRowIndex
* @return {?}
*/
CollapsibleTableComponent.prototype.selectRows = /**
* @param {?} firstRowIndex
* @param {?} lastRowIndex
* @return {?}
*/
function (firstRowIndex, lastRowIndex) {
var _this = this;
if (this.selectMultipleRows &&
0 < firstRowIndex && firstRowIndex < lastRowIndex &&
lastRowIndex <= this.collapsibleTableRows.length - 1) {
this.clearSelectedRows();
this.collapsibleTableRows.forEach((/**
* @param {?} row
* @param {?} i
* @return {?}
*/
function (row, i) {
if (firstRowIndex <= i && i <= lastRowIndex) {
_this.addSelectedRow(i);
row.selected = true;
}
else {
row.selected = false;
}
row.updateRow();
}));
}
};
/**
* @param {?} index
* @return {?}
*/
CollapsibleTableComponent.prototype.toggleRowSelection = /**
* @param {?} index
* @return {?}
*/
function (index) {
var _this = this;
if (this.select &&
0 < index && index <= this.collapsibleTableRows.length - 1) {
this.collapsibleTableRows.forEach((/**
* @param {?} row
* @param {?} i
* @return {?}
*/
function (row, i) {
if (index === i) {
if (row.selected) {
_this.removeSelectedRow(index);
}
else {
_this.addSelectedRow(index);
}
row.selected = !row.selected;
row.updateRow();
}
}));
}
};
/*updateFixedTableHeight() {
this.fixedTableHeight = this.el.nativeElement.offsetHeight + 'px';
let elem: Element = this.el.nativeElement;
let rowHeights = 0;
if (this.collapsibleTableRowComponent != null) {
this.collapsibleTableRowComponent.forEach(row => {
});
}
}*/
/*updateFixedTableHeight() {
this.fixedTableHeight = this.el.nativeElement.offsetHeight + 'px';
let elem: Element = this.el.nativeElement;
let rowHeights = 0;
if (this.collapsibleTableRowComponent != null) {
this.collapsibleTableRowComponent.forEach(row => {
});
}
}*/
/**
* @param {?} row
* @return {?}
*/
CollapsibleTableComponent.prototype.updateStriped = /*updateFixedTableHeight() {
this.fixedTableHeight = this.el.nativeElement.offsetHeight + 'px';
let elem: Element = this.el.nativeElement;
let rowHeights = 0;
if (this.collapsibleTableRowComponent != null) {
this.collapsibleTableRowComponent.forEach(row => {
});
}
}*/
/**
* @param {?} row
* @return {?}
*/
function (row) {
if (this.striped && row.isBodyRow) {
row.isParentStriped = true;
if (row.isOddRow) {
row.parentStripedRowBackgroundColor = this.stripedOddColor || CollapsibleTableRowComponent.DEFAULT_STRIPED_ODD_ROW_COLOR;
row.parentStripedRowTextColor = this.stripedOddTextColor || CollapsibleTableRowComponent.DEFAULT_ROW_TEXT_COLOR;
row.rowBackgroundColor = row.parentStripedRowBackgroundColor;
row.rowTextColor = row.parentStripedRowTextColor;
}
else {
row.parentStripedRowBackgroundColor = this.stripedEvenColor || CollapsibleTableRowComponent.DEFAULT_STRIPED_EVEN_ROW_COLOR;
row.parentStripedRowTextColor = this.stripedEvenTextColor || CollapsibleTableRowComponent.DEFAULT_ROW_TEXT_COLOR;
row.rowBackgroundColor = row.parentStripedRowBackgroundColor;
row.rowTextColor = row.parentStripedRowTextColor;
}
}
else {
row.isParentStriped = false;
row.rowBackgroundColor = undefined;
row.rowTextColor = undefined;
}
};
/**
* @param {?} row
* @return {?}
*/
CollapsibleTableComponent.prototype.updateHighlight = /**
* @param {?} row
* @return {?}
*/
function (row) {
row.isParentHighlight = this.highlight;
row.parentHighlightRowBackgroundColor = this.highlightColor || CollapsibleTableRowComponent.DEFAULT_HIGHLIGHT_ROW_COLOR;
row.parentHighlightRowTextColor = this.highlightTextColor || CollapsibleTableRowComponent.DEFAULT_ROW_TEXT_COLOR;
};
/**
* @param {?} row
* @return {?}
*/
CollapsibleTableComponent.prototype.updateActive = /**
* @param {?} row
* @return {?}
*/
function (row) {
row.activeRowBackgroundColor = this.activeColor || CollapsibleTableRowComponent.DEFAULT_ACTIVE_ROW_COLOR;
row.activeRowTextColor = this.activeTextColor || CollapsibleTableRowComponent.DEFAULT_ROW_TEXT_COLOR;
};
/**
* @param {?} row
* @return {?}
*/
CollapsibleTableComponent.prototype.updateSelect = /**
* @param {?} row
* @return {?}
*/
function (row) {
row.parentAllowsSelect = this.select;
row.parentAllowsSelectMultipleRows = this.selectMultipleRows;
row.parentAllowsDeselectingRows = this.allowDeselectingRows;
if (row.selected) {
row.selectedRowBackgroundColor = this.selectColor || CollapsibleTableRowComponent.DEFAULT_SELECTED_ROW_COLOR;
row.selectedRowTextColor = this.selectTextColor || CollapsibleTableRowComponent.DEFAULT_ROW_TEXT_COLOR;
row.rowBackgroundColor = row.selectedRowBackgroundColor;
row.rowTextColor = row.selectedRowTextColor;
}
};
/**
* @param {?=} change
* @return {?}
*/
CollapsibleTableComponent.prototype.updateTable = /**
* @param {?=} change
* @return {?}
*/
function (change) {
var _this = this;
if (this.collapsibleTableRows != null) {
if (change != null) {
switch (change) {
case 'striped':
// propagate changes to each of the CollapsibleTableRowComponent children
this.collapsibleTableRows.forEach((/**
* @param {?} row
* @return {?}
*/
function (row) { _this.updateStriped(row); }));
break;
case 'highlight':
this.collapsibleTableRows.forEach((/**
* @param {?} row
* @return {?}
*/
function (row) { _this.updateHighlight(row); }));
break;
case 'active':
this.collapsibleTableRows.forEach((/**
* @param {?} row
* @return {?}
*/
function (row) { _this.updateActive(row); }));
break;
case 'select':
this.collapsibleTableRows.forEach((/**
* @param {?} row
* @return {?}
*/
function (row) { _this.updateSelect(row); }));
break;
}
}
else {
// propagate changes to each of the CollapsibleTableRowComponent children
this.collapsibleTableRows.forEach((/**
* @param {?} row
* @return {?}
*/
function (row) {
_this.updateStriped(row);
_this.updateHighlight(row);
_this.updateSelect(row);
_this.updateActive(row);
}));
}
}
};
/**
* @param {?} event
* @return {?}
*/
CollapsibleTableComponent.prototype.keydown = /**
* @param {?} event
* @return {?}
*/
function (event) {
// select a row only if 'select' property is set to 'true'
if (this.select && this.allowKeyboardNavigation) {
/** @enum {number} */
var Key = {
arrowUp: 38,
arrowDown: 40,
home: 36,
end: 35,
};
Key[Key.arrowUp] = 'arrowUp';
Key[Key.arrowDown] = 'arrowDown';
Key[Key.home] = 'home';
Key[Key.end] = 'end';
/** @type {?} */
var index = 1;
/** @type {?} */
var whichKey = event['which'];
if (Key[whichKey] != null) {
event.preventDefault();
event.stopPropagation();
switch (whichKey) {
case Key.arrowUp:
// select previous row
if (this.selectedRows.length > 0) {
index = this.selectedRows[this.selectedRows.length - 1];
index--;
}
break;
case Key.arrowDown:
// select next row
if (this.selectedRows.length > 0) {
index = this.selectedRows[this.selectedRows.length - 1];
index++;
}
break;
case Key.home:
index = 1;
break;
case Key.end:
index = this.collapsibleTableRows.length - 1;
break;
}
this.clearSelectedRows();
this.deselectAllRows();
this.selectRow(index);
this.updateTable();
}
}
};
/**
* @return {?}
*/
CollapsibleTableComponent.prototype.mousedown = /**
* @return {?}
*/
function () {
this.mouseDownHold = true;
};
/**
* @return {?}
*/
CollapsibleTableComponent.prototype.mouseup = /**
* @return {?}
*/
function () {
this.mouseDownHold = false;
};
CollapsibleTableComponent.decorators = [
{ type: Component, args: [{
selector: 'collapsible-table',
template: "<ng-content></ng-content>",
providers: [
CollapsibleService
],
styles: ["\n :host {\n display: table;\n position: relative;\n width: 100%;\n border-collapse: collapse;\n }\n\n :host thead {\n border-bottom: 1px solid #d0d0d0;\n }\n\n :host /deep/ tbody /deep/ collapsible-table-row {\n cursor: pointer;\n }\n\n :host /deep/ collapsible-table-row th,\n :host /deep/ collapsible-table-row td {\n border-radius: 0;\n }\n\n :host[bordered='true'] {\n border-top: 1px solid #d0d0d0;\n border-right: 1px solid #d0d0d0;\n border-left: 1px solid #d0d0d0;\n }\n\n :host[bordered='true'] /deep/ collapsible-table-row,\n :host[borderedHorizontally='true'] /deep/ collapsible-table-row {\n border-bottom: 1px solid #d0d0d0;\n }\n\n :host[bordered='true'] /deep/ collapsible-table-row th,\n :host[bordered='true'] /deep/ collapsible-table-row td,\n :host[borderedVertically='true'] /deep/ collapsible-table-row th:not(:last-child),\n :host[borderedVertically='true'] /deep/ collapsible-table-row td:not(:last-child) {\n border-right: 1px solid #d0d0d0;\n }\n\n :host(.centered) /deep/ * {\n text-align: center;\n }\n\n :host(.noTextSelect) /deep/ collapsible-table-row th,\n :host(.noTextSelect) /deep/ collapsible-table-row td {\n user-select: none;\n }\n "]
}] }
];
/** @nocollapse */
CollapsibleTableComponent.ctorParameters = function () { return [
{ type: ElementRef },
{ type: CollapsibleService }
]; };
CollapsibleTableComponent.propDecorators = {
bordered: [{ type: Input }, { type: HostBinding, args: ['attr.bordered',] }],
borderedHorizontally: [{ type: Input }, { type: HostBinding, args: ['attr.borderedHorizontally',] }],
borderedVertically: [{ type: Input }, { type: HostBinding, args: ['attr.borderedVertically',] }],
striped: [{ type: Input }, { type: HostBinding, args: ['attr.striped',] }],
stripedOddColor: [{ type: Input }, { type: HostBinding, args: ['attr.stripedOddColor',] }],
stripedOddTextColor: [{ type: Input }, { type: HostBinding, args: ['attr.stripedOddTextColor',] }],
stripedEvenColor: [{ type: Input }, { type: HostBinding, args: ['attr.stripedEvenColor',] }],
stripedEvenTextColor: [{ type: Input }, { type: HostBinding, args: ['attr.stripedEvenTextColor',] }],
highlight: [{ type: Input }, { type: HostBinding, args: ['attr.highlight',] }],
highlightColor: [{ type: Input }, { type: HostBinding, args: ['attr.highlightColor',] }],
highlightTextColor: [{ type: Input }, { type: HostBinding, args: ['attr.highlightTextColor',] }],
activeColor: [{ type: Input }, { type: HostBinding, args: ['attr.activeColor',] }],
activeTextColor: [{ type: Input }, { type: HostBinding, args: ['attr.activeTextColor',] }],
centered: [{ type: Input }, { type: HostBinding, args: ['class.centered',] }, { type: HostBinding, args: ['attr.centered',] }],
responsive: [{ type: Input }, { type: HostBinding, args: ['attr.responsive',] }],
select: [{ type: Input }, { type: HostBinding, args: ['attr.select',] }],
selectMultipleRows: [{ type: Input }, { type: HostBinding, args: ['attr.selectMultipleRows',] }],
selectColor: [{ type: Input }, { type: HostBinding, args: ['attr.selectColor',] }],
selectTextColor: [{ type: Input }, { type: HostBinding, args: ['attr.selectTextColor',] }],
allowDeselectingRows: [{ type: Input }, { type: HostBinding, args: ['attr.allowDeselectingRows',] }],
allowKeyboardNavigation: [{ type: Input }, { type: HostBinding, args: ['attr.allowKeyboardNavigation',] }],
noTextSelect: [{ type: Input }, { type: HostBinding, args: ['class.noTextSelect',] }, { type: HostBinding, args: ['attr.noTextSelect',] }],
tabindex: [{ type: HostBinding, args: ['attr.tabindex',] }],
type: [{ type: Input }, { type: HostBinding, args: ['attr.type',] }],
collapsibleTableRows: [{ type: ContentChildren, args: [CollapsibleTableRowComponent,] }],
keydown: [{ type: HostListener, args: ['keydown', ['$event'],] }],
mousedown: [{ type: HostListener, args: ['mousedown',] }],
mouseup: [{ type: HostListener, args: ['mouseup',] }]
};
return CollapsibleTableComponent;
}());
export { CollapsibleTableComponent };
if (false) {
/** @type {?} */
CollapsibleTableComponent.prototype.bordered;
/** @type {?} */
CollapsibleTableComponent.prototype.borderedHorizontally;
/** @type {?} */
CollapsibleTableComponent.prototype.borderedVertically;
/** @type {?} */
CollapsibleTableComponent.prototype.striped;
/** @type {?} */
CollapsibleTableComponent.prototype.stripedOddColor;
/** @type {?} */
CollapsibleTableComponent.prototype.stripedOddTextColor;
/** @type {?} */
CollapsibleTableComponent.prototype.stripedEvenColor;
/** @type {?} */
CollapsibleTableComponent.prototype.stripedEvenTextColor;
/** @type {?} */
CollapsibleTableComponent.prototype.highlight;
/** @type {?} */
CollapsibleTableComponent.prototype.highlightColor;
/** @type {?} */
CollapsibleTableComponent.prototype.highlightTextColor;
/** @type {?} */
CollapsibleTableComponent.prototype.activeColor;
/** @type {?} */
CollapsibleTableComponent.prototype.activeTextColor;
/** @type {?} */
CollapsibleTableComponent.prototype.centered;
/** @type {?} */
CollapsibleTableComponent.prototype.responsive;
/** @type {?} */
CollapsibleTableComponent.prototype.select;
/** @type {?} */
CollapsibleTableComponent.prototype.selectMultipleRows;
/** @type {?} */
CollapsibleTableComponent.prototype.selectColor;
/** @type {?} */
CollapsibleTableComponent.prototype.selectTextColor;
/** @type {?} */
CollapsibleTableComponent.prototype.allowDeselectingRows;
/** @type {?} */
CollapsibleTableComponent.prototype.allowKeyboardNavigation;
/** @type {?} */
CollapsibleTableComponent.prototype.noTextSelect;
/** @type {?} */
CollapsibleTableComponent.prototype.fixedTableHeight;
/** @type {?} */
CollapsibleTableComponent.prototype.tabindex;
/** @type {?} */
CollapsibleTableComponent.prototype.selectedRows;
/** @type {?} */
CollapsibleTableComponent.prototype.type;
/** @type {?} */
CollapsibleTableComponent.prototype.collapsibleTableRows;
/** @type {?} */
CollapsibleTableComponent.prototype.mouseDownHold;
/**
* @type {?}
* @private
*/
CollapsibleTableComponent.prototype.el;
/**
* @type {?}
* @private
*/
CollapsibleTableComponent.prototype.collapsibleService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGFwc2libGUtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhcjItY29sbGFwc2libGUvIiwic291cmNlcyI6WyJsaWIvY29sbGFwc2libGUtdGFibGUvY29sbGFwc2libGUtdGFibGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNILFNBQVMsRUFFVCxLQUFLLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFDaEMsVUFBVSxFQUFFLGVBQWUsRUFDOUIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sMERBQTBELENBQUM7QUFDeEcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFckU7SUFtS0ksbUNBQ1ksRUFBYyxFQUNkLGtCQUFzQztRQUR0QyxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQ2QsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjs7UUF2QmxELDRCQUF1QixHQUFHLElBQUksQ0FBQztRQU8vQixxQkFBZ0IsR0FBRyxNQUFNLENBQUM7UUFFSSxhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBRTNDLGlCQUFZLEdBQWtCLEVBQUUsQ0FBQzs7UUFJUCxTQUFJLEdBQStCLFdBQVcsQ0FBQztRQUl6RSxrQkFBYSxHQUFHLEtBQUssQ0FBQztJQUlnQyxDQUFDOzs7O0lBRXZELDRDQUFROzs7SUFBUjtJQUNBLENBQUM7Ozs7SUFFRCxzREFBa0I7OztJQUFsQjtRQUNJLGlDQUFpQztRQUNqQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztjQXNCTTtJQUNWLENBQUM7Ozs7O0lBRUQsK0NBQVc7Ozs7SUFBWCxVQUFZLE9BQXNCO1FBQzlCLEtBQUssSUFBTSxNQUFNLElBQUksT0FBTyxFQUFFO1lBQzFCLElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDaEMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLElBQUks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QUdyRSxxREFDK0Q7O0lBRy9ELHlEQUN1RTs7SUFHdkUsOENBQ2tEOztJQUdsRCxtREFDMkQ7O0lBRzNELHVEQUNtRTs7SUFHbkUsZ0RBQ3FEOztJQUdyRCxvREFDNkQ7O0lBRzdELDZDQUVnRDs7SUFHaEQsK0NBQ29EOztJQUdwRCwyQ0FDNEM7O0lBRzVDLHVEQUNvRTs7SUFHcEUsZ0RBQ3FEOztJQUdyRCxvREFDNkQ7O0lBRzdELHlEQUN3RTs7SUFHeEUsNERBRStCOztJQUcvQixpREFFd0Q7O0lBRXhELHFEQUEwQjs7SUFFMUIsNkNBQTJDOztJQUUzQyxpREFBaUM7O0lBR2pDLHlDQUN5RTs7SUFFekUseURBQXlHOztJQUV6RyxrREFBc0I7Ozs7O0lBR2xCLHVDQUFzQjs7Ozs7SUFDdEIsdURBQThDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIENvbXBvbmVudCxcclxuICAgIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBBZnRlckNvbnRlbnRJbml0LFxyXG4gICAgSW5wdXQsIEhvc3RCaW5kaW5nLCBIb3N0TGlzdGVuZXIsXHJcbiAgICBFbGVtZW50UmVmLCBDb250ZW50Q2hpbGRyZW5cclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IENvbGxhcHNpYmxlVGFibGVSb3dDb21wb25lbnQgfSBmcm9tICcuLi9jb2xsYXBzaWJsZS10YWJsZS1yb3cvY29sbGFwc2libGUtdGFibGUtcm93LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvbGxhcHNpYmxlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2NvbGxhcHNpYmxlLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2NvbGxhcHNpYmxlLXRhYmxlJyxcclxuICAgIHRlbXBsYXRlOiBgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PmAsXHJcbiAgICBzdHlsZXM6IFtgXHJcbiAgICAgICAgOmhvc3Qge1xyXG4gICAgICAgICAgICBkaXNwbGF5OiB0YWJsZTtcclxuICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIDpob3N0IHRoZWFkIHtcclxuICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkMGQwZDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA6aG9zdCAvZGVlcC8gdGJvZHkgL2RlZXAvIGNvbGxhcHNpYmxlLXRhYmxlLXJvdyB7XHJcbiAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIDpob3N0IC9kZWVwLyBjb2xsYXBzaWJsZS10YWJsZS1yb3cgdGgsXHJcbiAgICAgICAgOmhvc3QgL2RlZXAvIGNvbGxhcHNpYmxlLXRhYmxlLXJvdyB0ZCB7XHJcbiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA6aG9zdFtib3JkZXJlZD0ndHJ1ZSddIHtcclxuICAgICAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkMGQwZDA7XHJcbiAgICAgICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkMGQwZDA7XHJcbiAgICAgICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2QwZDBkMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIDpob3N0W2JvcmRlcmVkPSd0cnVlJ10gL2RlZXAvIGNvbGxhcHNpYmxlLXRhYmxlLXJvdyxcclxuICAgICAgICA6aG9zdFtib3JkZXJlZEhvcml6b250YWxseT0ndHJ1ZSddIC9kZWVwLyBjb2xsYXBzaWJsZS10YWJsZS1yb3cge1xyXG4gICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2QwZDBkMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIDpob3N0W2JvcmRlcmVkPSd0cnVlJ10gL2RlZXAvIGNvbGxhcHNpYmxlLXRhYmxlLXJvdyB0aCxcclxuICAgICAgICA6aG9zdFtib3JkZXJlZD0ndHJ1ZSddIC9kZWVwLyBjb2xsYXBzaWJsZS10YWJsZS1yb3cgdGQsXHJcbiAgICAgICAgOmhvc3RbYm9yZGVyZWRWZXJ0aWNhbGx5PSd0cnVlJ10gL2RlZXAvIGNvbGxhcHNpYmxlLXRhYmxlLXJvdyB0aDpub3QoOmxhc3QtY2hpbGQpLFxyXG4gICAgICAgIDpob3N0W2JvcmRlcmVkVmVydGljYWxseT0ndHJ1ZSddIC9kZWVwLyBjb2xsYXBzaWJsZS10YWJsZS1yb3cgdGQ6bm90KDpsYXN0LWNoaWxkKSB7XHJcbiAgICAgICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkMGQwZDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA6aG9zdCguY2VudGVyZWQpIC9kZWVwLyAqIHtcclxuICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgOmhvc3QoLm5vVGV4dFNlbGVjdCkgL2RlZXAvIGNvbGxhcHNpYmxlLXRhYmxlLXJvdyB0aCxcclxuICAgICAgICA6aG9zdCgubm9UZXh0U2VsZWN0KSAvZGVlcC8gY29sbGFwc2libGUtdGFibGUtcm93IHRkIHtcclxuICAgICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XHJcbiAgICAgICAgfVxyXG4gICAgYF0sXHJcbiAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICBDb2xsYXBzaWJsZVNlcnZpY2VcclxuICAgIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIENvbGxhcHNpYmxlVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJDb250ZW50SW5pdCB7XHJcbiAgICAvLyBjb21wb25lbnQgb3B0aW9uc1xyXG4gICAgLy9cclxuICAgIC8vIG1ha2VzIHRoZSB0YWJsZSBib3JkZXJlZFxyXG4gICAgQElucHV0KClcclxuICAgIEBIb3N0QmluZGluZygnYXR0ci5ib3JkZXJlZCcpIGJvcmRlcmVkOiBib29sZWFuO1xyXG5cclxuICAgIC8vIG1ha2VzIHRoZSB0YWJsZSBib3JkZXJlZCBob3Jpem9udGFsbHkgb25seVxyXG4gICAgQElucHV0KClcclxuICAgIEBIb3N0QmluZGluZygnYXR0ci5ib3JkZXJlZEhvcml6b250YWxseScpIGJvcmRlcmVkSG9yaXpvbnRhbGx5OiBib29sZWFuO1xyXG5cclxuICAgIC8vIG1ha2VzIHRoZSB0YWJsZSBib3JkZXJlZCB2ZXJ0aWNhbGx5IG9ubHlcclxuICAgIEBJbnB1dCgpXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYm9yZGVyZWRWZXJ0aWNhbGx5JykgYm9yZGVyZWRWZXJ0aWNhbGx5OiBib29sZWFuO1xyXG5cclxuICAgIC8vIG1ha2VzIHRoZSB0YWJsZSBzdHJpcGVkXHJcbiAgICBASW5wdXQoKVxyXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnN0cmlwZWQnKSBzdHJpcGVkOiBib29sZWFuO1xyXG5cclxuICAgIC8vIGEgY29sb3Igb2YgYW4gb2RkIHN0cmlwZWQgcm93XHJcbiAgICBASW5wdXQoKVxyXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnN0cmlwZWRPZGRDb2xvcicpIHN0cmlwZWRPZGRDb2xvcjogc3RyaW5nO1xyXG5cclxuICAgIC8vIGEgdGV4dCBjb2xvciBvZiBhbiBvZGQgc3RyaXBlZCByb3dcclxuICAgIEBJbnB1dCgpXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuc3RyaXBlZE9kZFRleHRDb2xvcicpIHN0cmlwZWRPZGRUZXh0Q29sb3I6IHN0cmluZztcclxuXHJcbiAgICAvLyBhIGNvbG9yIG9mIGFuIGV2ZW4gc3RyaXBlZCByb3dcclxuICAgIEBJbnB1dCgpXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuc3RyaXBlZEV2ZW5Db2xvcicpIHN0cmlwZWRFdmVuQ29sb3I6IHN0cmluZztcclxuXHJcbiAgICAvLyBhIHRleHQgY29sb3Igb2YgYW4gZXZlbiBzdHJpcGVkIHJvd1xyXG4gICAgQElucHV0KClcclxuICAgIEBIb3N0QmluZGluZygnYXR0ci5zdHJpcGVkRXZlblRleHRDb2xvcicpIHN0cmlwZWRFdmVuVGV4dENvbG9yOiBzdHJpbmc7XHJcblxyXG4gICAgLy8gaGlnaGxpZ2h0IHRhYmxlIHJvd3Mgb24gbW91c2UgaG92ZXJcclxuICAgIEBJbnB1dCgpXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuaGlnaGxpZ2h0JykgaGlnaGxpZ2h0OiBib29sZWFuO1xyXG5cclxuICAgIC8vIGEgY29sb3Igb2YgYSBoaWdobGlnaHRlZCByb3dcclxuICAgIEBJbnB1dCgpXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuaGlnaGxpZ2h0Q29sb3InKSBoaWdobGlnaHRDb2xvcjogc3RyaW5nO1xyXG5cclxuICAgIC8vIGEgdGV4dCBjb2xvciBvZiBhIGhpZ2hsaWdodGVkIHJvd1xyXG4gICAgQElucHV0KClcclxuICAgIEBIb3N0QmluZGluZygnYXR0ci5oaWdobGlnaHRUZXh0Q29sb3InKSBoaWdobGlnaHRUZXh0Q29sb3I6IHN0cmluZztcclxuXHJcbiAgICAvLyBhIGNvbG9yIG9mIGFuIGFjdGl2ZSByb3dcclxuICAgIEBJbnB1dCgpXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYWN0aXZlQ29sb3InKSBhY3RpdmVDb2xvcjogc3RyaW5nO1xyXG5cclxuICAgIC8vIGEgdGV4dCBjb2xvciBvZiBhbiBhY3RpdmUgcm93XHJcbiAgICBASW5wdXQoKVxyXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmFjdGl2ZVRleHRDb2xvcicpIGFjdGl2ZVRleHRDb2xvcjogc3RyaW5nO1xyXG5cclxuICAgIC8vIGNlbnRlciBhbGlnbiBhbGwgdGhlIHRleHQgaW4gdGhlIHRhYmxlXHJcbiAgICBASW5wdXQoKVxyXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5jZW50ZXJlZCcpXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuY2VudGVyZWQnKSBjZW50ZXJlZDogYm9vbGVhbjtcclxuXHJcbiAgICAvLyBtYWtlcyB0aGUgdGFibGUgaG9yaXpvbnRhbGx5IHNjcm9sbGFibGUgb24gc21hbGxlciBzY3JlZW4gd2lkdGhzXHJcbiAgICBASW5wdXQoKVxyXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnJlc3BvbnNpdmUnKSByZXNwb25zaXZlOiBib29sZWFuO1xyXG5cclxuICAgIC8vIGFsbG93cyB0byBzZWxlY3Qgcm93c1xyXG4gICAgQElucHV0KClcclxuICAgIEBIb3N0QmluZGluZygnYXR0ci5zZWxlY3QnKSBzZWxlY3Q6IGJvb2xlYW47XHJcblxyXG4gICAgLy8gYWxsb3dzIHRvIHNlbGVjdCBtdWx0aXBsZSByb3dzXHJcbiAgICBASW5wdXQoKVxyXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnNlbGVjdE11bHRpcGxlUm93cycpIHNlbGVjdE11bHRpcGxlUm93czogYm9vbGVhbjtcclxuXHJcbiAgICAvLyBhIGNvbG9yIG9mIGEgc2VsZWN0ZWQgcm93XHJcbiAgICBASW5wdXQoKVxyXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnNlbGVjdENvbG9yJykgc2VsZWN0Q29sb3I6IHN0cmluZztcclxuXHJcbiAgICAvLyBhIHRleHQgY29sb3Igb2YgYSBzZWxlY3RlZCByb3dcclxuICAgIEBJbnB1dCgpXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuc2VsZWN0VGV4dENvbG9yJykgc2VsZWN0VGV4dENvbG9yOiBzdHJpbmc7XHJcblxyXG4gICAgLy8gYWxsb3dzIGRlc2VsZWN0aW5nIHNlbGVjdGVkIHJvd3NcclxuICAgIEBJbnB1dCgpXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYWxsb3dEZXNlbGVjdGluZ1Jvd3MnKSBhbGxvd0Rlc2VsZWN0aW5nUm93czogYm9vbGVhbjtcclxuXHJcbiAgICAvLyBhbGxvd3MgbmF2aWdhdGlvbiBiZXR3ZWVuIHRhYmxlIHJvd3MgdXNpbmcgYXJyb3cga2V5c1xyXG4gICAgQElucHV0KClcclxuICAgIEBIb3N0QmluZGluZygnYXR0ci5hbGxvd0tleWJvYXJkTmF2aWdhdGlvbicpXHJcbiAgICBhbGxvd0tleWJvYXJkTmF2aWdhdGlvbiA9IHRydWU7XHJcblxyXG4gICAgLy8gZGlzYWJsZXMgdXNlciBzZWxlY3Qgd2l0aGluZyB0aGUgdGFibGVcclxuICAgIEBJbnB1dCgpXHJcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm5vVGV4dFNlbGVjdCcpXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIubm9UZXh0U2VsZWN0Jykgbm9UZXh0U2VsZWN0OiBib29sZWFuO1xyXG5cclxuICAgIGZpeGVkVGFibGVIZWlnaHQgPSAnYXV0byc7XHJcblxyXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnRhYmluZGV4JykgdGFiaW5kZXggPSAwO1xyXG5cclxuICAgIHNlbGVjdGVkUm93czogQXJyYXk8bnVtYmVyPiA9IFtdO1xyXG5cclxuICAgIC8vIHNwZWNpZmllcyBjb2xsYXBzaWJsZSB0eXBlLiBDYW4gYmUgZWl0aGVyICdhY2NvcmRpb24nIG9yICdleHBhbmRhYmxlJ1xyXG4gICAgQElucHV0KClcclxuICAgIEBIb3N0QmluZGluZygnYXR0ci50eXBlJykgdHlwZTogJ2FjY29yZGlvbicgfCAnZXhwYW5kYWJsZScgPSAnYWNjb3JkaW9uJztcclxuXHJcbiAgICBAQ29udGVudENoaWxkcmVuKENvbGxhcHNpYmxlVGFibGVSb3dDb21wb25lbnQpIGNvbGxhcHNpYmxlVGFibGVSb3dzOiBBcnJheTxDb2xsYXBzaWJsZVRhYmxlUm93Q29tcG9uZW50PjtcclxuXHJcbiAgICBtb3VzZURvd25Ib2xkID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcclxuICAgICAgICBwcml2YXRlIGNvbGxhcHNpYmxlU2VydmljZTogQ29sbGFwc2libGVTZXJ2aWNlKSB7IH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XHJcbiAgICAgICAgLy8gdGhpcy51cGRhdGVGaXhlZFRhYmxlSGVpZ2h0KCk7XHJcbiAgICAgICAgLypcclxuICAgICAgICBMT0coYENvbGxhcHNpYmxlVGFibGVDb21wb25lbnQ6Om5nT25Jbml0KClcXG5gICtcclxuICAgICAgICAgICAgYHRoaXMgPSB7XFxuYCArXHJcbiAgICAgICAgICAgIGBib3JkZXJlZCA9ICR7dGhpcy5ib3JkZXJlZH1cXG5gICtcclxuICAgICAgICAgICAgYGJvcmRlcmVkSG9yaXpvbnRhbGx5ID0gJHt0aGlzLmJvcmRlcmVkSG9yaXpvbnRhbGx5fVxcbmAgK1xyXG4gICAgICAgICAgICBgYm9yZGVyZWRWZXJ0aWNhbGx5ID0gJHt0aGlzLmJvcmRlcmVkVmVydGljYWxseX1cXG5gICtcclxuICAgICAgICAgICAgYHN0cmlwZWQgPSAke3RoaXMuc3RyaXBlZH1cXG5gICtcclxuICAgICAgICAgICAgYHN0cmlwZWRPZGRDb2xvciA9ICR7dGhpcy5zdHJpcGVkT2RkQ29sb3J9XFxuYCArXHJcbiAgICAgICAgICAgIGBzdHJpcGVkRXZlbkNvbG9yID0gJHt0aGlzLnN0cmlwZWRFdmVuQ29sb3J9XFxuYCArXHJcbiAgICAgICAgICAgIGBoaWdobGlnaHQgPSAke3RoaXMuaGlnaGxpZ2h0fVxcbmAgK1xyXG4gICAgICAgICAgICBgaGlnaGxpZ2h0Q29sb3IgPSAke3RoaXMuaGlnaGxpZ2h0Q29sb3J9XFxuYCArXHJcbiAgICAgICAgICAgIGBoaWdobGlnaHRUZXh0Q29sb3IgPSAke3RoaXMuaGlnaGxpZ2h0VGV4dENvbG9yfVxcbmAgK1xyXG4gICAgICAgICAgICBgYWN0aXZlQ29sb3IgPSAke3RoaXMuYWN0aXZlQ29sb3J9XFxuYCArXHJcbiAgICAgICAgICAgIGBhY3RpdmVUZXh0Q29sb3IgPSAke3RoaXMuYWN0aXZlVGV4dENvbG9yfVxcbmAgK1xyXG4gICAgICAgICAgICBgY2VudGVyZWQgPSAke3RoaXMuY2VudGVyZWR9XFxuYCArXHJcbiAgICAgICAgICAgIGByZXNwb25zaXZlID0gJHt0aGlzLnJlc3BvbnNpdmV9XFxuYCArXHJcbiAgICAgICAgICAgIGBzZWxlY3QgPSAke3RoaXMuc2VsZWN0fVxcbmAgK1xyXG4gICAgICAgICAgICBgc2VsZWN0Q29sb3IgPSAke3RoaXMuc2VsZWN0Q29sb3J9XFxuYCArXHJcbiAgICAgICAgICAgIGBzZWxlY3RUZXh0Q29sb3IgPSAke3RoaXMuc2VsZWN0VGV4dENvbG9yfVxcbmAgK1xyXG4gICAgICAgICAgICBgc2VsZWN0TXVsdGlwbGVSb3dzID0gJHt0aGlzLnNlbGVjdE11bHRpcGxlUm93c31cXG5gICtcclxuICAgICAgICAgICAgYG5vVGV4dFNlbGVjdCA9ICR7dGhpcy5ub1RleHRTZWxlY3R9XFxuYCArXHJcbiAgICAgICAgICAgIGB9YCk7XHJcbiAgICAgICAgICAgICovXHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgICAgIGZvciAoY29uc3QgY2hhbmdlIGluIGNoYW5nZXMpIHtcclxuICAgICAgICAgICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoY2hhbmdlKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29sbGFwc2libGVUYWJsZVJvd3MgIT0gbnVsbCkge1xyXG4gI