ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
317 lines (316 loc) • 23 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, Input, Output, EventEmitter, TemplateRef, HostBinding } from '@angular/core';
var GridComponent = /** @class */ (function () {
function GridComponent() {
this.wrapCls = {};
this.itemCls = {};
this.carouselProps = {
dots: false,
dragging: false
};
this.defaultProps = {
data: [],
hasLine: true,
isCarousel: false,
columnNum: 4,
carouselMaxRow: 2,
prefixCls: 'am-grid',
square: true,
itemStyle: {}
};
this.carouselData = [];
this.carouselDataTmp = [];
this.gridData = [];
this._data = [];
this.columnNum = 4;
this.carouselMaxRow = 2;
this.itemStyle = {};
this.square = true;
this.hasLine = true;
this.activeStyle = true;
this.OnClick = new EventEmitter();
this.amGrid = true;
}
Object.defineProperty(GridComponent.prototype, "isCarousel", {
get: /**
* @return {?}
*/
function () {
return this.defaultProps.isCarousel;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this.defaultProps.isCarousel = value;
this.init();
},
enumerable: true,
configurable: true
});
Object.defineProperty(GridComponent.prototype, "data", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._data = value;
this.init();
},
enumerable: true,
configurable: true
});
Object.defineProperty(GridComponent.prototype, "amGridSquare", {
get: /**
* @return {?}
*/
function () {
return true === this.square;
},
enumerable: true,
configurable: true
});
Object.defineProperty(GridComponent.prototype, "amGridLine", {
get: /**
* @return {?}
*/
function () {
return true === this.hasLine;
},
enumerable: true,
configurable: true
});
Object.defineProperty(GridComponent.prototype, "amGridCarousel", {
get: /**
* @return {?}
*/
function () {
return true === this.isCarousel;
},
enumerable: true,
configurable: true
});
/**
* @param {?} value
* @return {?}
*/
GridComponent.prototype.isTemplateRef = /**
* @param {?} value
* @return {?}
*/
function (value) {
return value instanceof TemplateRef;
};
/**
* @param {?} value
* @return {?}
*/
GridComponent.prototype.isURL = /**
* @param {?} value
* @return {?}
*/
function (value) {
if (value) {
return value.indexOf('http') >= 0;
}
else {
return false;
}
};
/**
* @return {?}
*/
GridComponent.prototype.init = /**
* @return {?}
*/
function () {
/** @type {?} */
var dataLength = (this._data && this._data.length) || 0;
/** @type {?} */
var rowCount = Math.ceil(dataLength / this.columnNum);
/** @type {?} */
var rowsArr;
if (this.defaultProps.isCarousel) {
if (rowCount % this.carouselMaxRow !== 0) {
rowCount = rowCount + this.carouselMaxRow - (rowCount % this.carouselMaxRow);
}
/** @type {?} */
var pageCount = Math.ceil(rowCount / this.carouselMaxRow);
rowsArr = this.getRows(rowCount, dataLength);
if (pageCount <= 1) {
this.carouselProps = {
dots: false,
dragging: false
};
}
else {
this.carouselProps = {
dots: true,
dragging: true
};
}
this.carouselDataTmp = this.getCarouselData(rowsArr, pageCount, rowCount);
}
else {
this.gridData = this.getRows(rowCount, dataLength);
}
};
/**
* @param {?} rowsArr
* @param {?} pageCount
* @param {?} rowCount
* @return {?}
*/
GridComponent.prototype.getCarouselData = /**
* @param {?} rowsArr
* @param {?} pageCount
* @param {?} rowCount
* @return {?}
*/
function (rowsArr, pageCount, rowCount) {
/** @type {?} */
var pagesArr = [];
for (var pageIndex = 0; pageIndex < pageCount; pageIndex++) {
/** @type {?} */
var pageRows = [];
for (var ii = 0; ii < this.carouselMaxRow; ii++) {
/** @type {?} */
var rowIndex = pageIndex * this.carouselMaxRow + ii;
if (rowIndex < rowCount) {
pageRows.push(rowsArr[rowIndex]);
}
else {
// 空节点为了确保末尾页的最后未到底的行有底线(样式中last-child会没线)
pageRows.push(null);
}
}
pagesArr.push(pageRows);
}
return pagesArr;
};
/**
* @param {?} rowCount
* @param {?} dataLength
* @return {?}
*/
GridComponent.prototype.getRows = /**
* @param {?} rowCount
* @param {?} dataLength
* @return {?}
*/
function (rowCount, dataLength) {
/** @type {?} */
var columnNum = this.columnNum;
/** @type {?} */
var rowArr = new Array();
for (var i = 0; i < rowCount; i++) {
rowArr[i] = new Array();
for (var j = 0; j < columnNum; j++) {
/** @type {?} */
var dataIndex = i * columnNum + j;
if (dataIndex < dataLength) {
rowArr[i][j] = this._data[dataIndex];
}
else {
rowArr[i][j] = null;
}
}
}
return rowArr;
};
/**
* @param {?} data
* @param {?} index
* @return {?}
*/
GridComponent.prototype.click = /**
* @param {?} data
* @param {?} index
* @return {?}
*/
function (data, index) {
/** @type {?} */
var outputData = {
data: data,
index: index
};
this.OnClick.emit(outputData);
};
/**
* @return {?}
*/
GridComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _a;
this.itemCls = (_a = {},
_a[this.defaultProps.prefixCls + "-item"] = true,
_a[this.defaultProps.prefixCls + "-active-item"] = false,
_a);
};
GridComponent.decorators = [
{ type: Component, args: [{
selector: 'Grid, nzm-grid',
template: "<ng-container *ngIf=\"!isCarousel\">\n <Flex *ngFor=\"let item of gridData; let i = index;\"\n [justify]=\"'center'\"\n [align]=\"'stretch'\"\n >\n <FlexItem TouchFeedback\n *ngFor=\"let subItem of item; let j = index;\"\n [ngClass]=\"itemCls\"\n [ngStyle]=\"itemStyle\"\n [className]=\"['am-grid-item-active']\"\n [activeStyle]=\"activeStyle\"\n >\n <div *ngIf=\"subItem !== null\"\n class=\"{{defaultProps.prefixCls}}-item-content\"\n (click)=\"click(subItem,i * columnNum + j)\"\n >\n <div class=\"{{defaultProps.prefixCls}}-item-inner-content column-num-{{columnNum}}\">\n <img *ngIf=\"subItem.icon && isURL(subItem.icon)\"\n src=\"{{subItem.icon}}\"\n class=\"{{defaultProps.prefixCls}}-icon\"\n >\n <Icon *ngIf=\"subItem.icon && !isURL(subItem.icon)\"\n [type]=\"subItem.icon\"\n [size]=\"subItem.size\"\n ></Icon>\n <div class=\"{{defaultProps.prefixCls}}-text\">{{subItem.text}}</div>\n </div>\n </div>\n <div *ngIf=\"subItem === null\" class=\"{{defaultProps.prefixCls}}-null-item\"></div>\n </FlexItem>\n <ng-content></ng-content>\n </Flex>\n</ng-container>\n\n<Carousel *ngIf=\"isCarousel && carouselDataTmp.length > 0\"\n [autoplay]=\"false\"\n [infinite]=\"true\"\n [selectedIndex]=\"0\"\n [autoplayInterval]='3000'\n [dots]=\"carouselProps.dots\"\n [dragging]=\"carouselProps.dragging\"\n>\n <CarouselSlide *ngFor=\"let gridData of carouselDataTmp\"\n class=\"{{defaultProps.prefixCls}}-carousel-page\"\n style=\"display: block;\"\n >\n <Flex *ngFor=\"let item of gridData; let i = index;\"\n [justify]=\"'center'\"\n [align]=\"'stretch'\"\n >\n <FlexItem TouchFeedback\n *ngFor=\"let subItem of item; let j = index;\"\n class=\"{{defaultProps.prefixCls}}-item\"\n [ngStyle]=\"itemStyle\"\n [className]=\"['am-grid-item-active']\"\n >\n <div *ngIf=\"subItem !== null\"\n class=\"{{defaultProps.prefixCls}}-item-content\"\n (click)=\"click(subItem,i * columnNum + j)\"\n >\n <div class=\"{{defaultProps.prefixCls}}-item-inner-content column-num-4\">\n <img class=\"{{defaultProps.prefixCls}}-icon\" src=\"{{subItem.icon}}\">\n <div class=\"{{defaultProps.prefixCls}}-text\">{{subItem.text}}</div>\n </div>\n </div>\n <div *ngIf=\"subItem === null\" class=\"{{defaultProps.prefixCls}}-null-item\"></div>\n </FlexItem>\n </Flex>\n </CarouselSlide>\n</Carousel>"
}] }
];
/** @nocollapse */
GridComponent.ctorParameters = function () { return []; };
GridComponent.propDecorators = {
columnNum: [{ type: Input }],
carouselMaxRow: [{ type: Input }],
itemStyle: [{ type: Input }],
square: [{ type: Input }],
hasLine: [{ type: Input }],
isCarousel: [{ type: Input }],
activeStyle: [{ type: Input }],
data: [{ type: Input }],
OnClick: [{ type: Output }],
amGrid: [{ type: HostBinding, args: ['class.am-grid',] }],
amGridSquare: [{ type: HostBinding, args: ['class.am-grid-square',] }],
amGridLine: [{ type: HostBinding, args: ['class.am-grid-line',] }],
amGridCarousel: [{ type: HostBinding, args: ['class.am-grid-carousel',] }]
};
return GridComponent;
}());
export { GridComponent };
if (false) {
/** @type {?} */
GridComponent.prototype.wrapCls;
/** @type {?} */
GridComponent.prototype.itemCls;
/** @type {?} */
GridComponent.prototype.carouselProps;
/** @type {?} */
GridComponent.prototype.defaultProps;
/** @type {?} */
GridComponent.prototype.carouselData;
/** @type {?} */
GridComponent.prototype.carouselDataTmp;
/** @type {?} */
GridComponent.prototype.gridData;
/** @type {?} */
GridComponent.prototype._data;
/** @type {?} */
GridComponent.prototype.columnNum;
/** @type {?} */
GridComponent.prototype.carouselMaxRow;
/** @type {?} */
GridComponent.prototype.itemStyle;
/** @type {?} */
GridComponent.prototype.square;
/** @type {?} */
GridComponent.prototype.hasLine;
/** @type {?} */
GridComponent.prototype.activeStyle;
/** @type {?} */
GridComponent.prototype.OnClick;
/** @type {?} */
GridComponent.prototype.amGrid;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS8iLCJzb3VyY2VzIjpbImdyaWQvZ3JpZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFjLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7SUF3RW5IO3VCQWpFVSxFQUFFO3VCQUNGLEVBQUU7NkJBQ0k7WUFDZCxJQUFJLEVBQUUsS0FBSztZQUNYLFFBQVEsRUFBRSxLQUFLO1NBQ2hCOzRCQUNjO1lBQ2IsSUFBSSxFQUFFLEVBQUU7WUFDUixPQUFPLEVBQUUsSUFBSTtZQUNiLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLFNBQVMsRUFBRSxDQUFDO1lBQ1osY0FBYyxFQUFFLENBQUM7WUFDakIsU0FBUyxFQUFFLFNBQVM7WUFDcEIsTUFBTSxFQUFFLElBQUk7WUFDWixTQUFTLEVBQUUsRUFBRTtTQUNkOzRCQUNjLEVBQUU7K0JBQ0MsRUFBRTt3QkFDVCxFQUFFO3FCQUVHLEVBQUU7eUJBR0UsQ0FBQzs4QkFFSSxDQUFDO3lCQUVOLEVBQUU7c0JBRUosSUFBSTt1QkFFSCxJQUFJOzJCQVVBLElBQUk7dUJBT0UsSUFBSSxZQUFZLEVBQUU7c0JBRzdCLElBQUk7S0FjTjtJQWpDaEIsc0JBQ0kscUNBQVU7Ozs7UUFEZDtZQUVFLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUM7U0FDckM7Ozs7O1FBQ0QsVUFBZ0IsS0FBYztZQUM1QixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDckMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ2I7OztPQUpBO0lBT0Qsc0JBQ0ksK0JBQUk7Ozs7O1FBRFIsVUFDUyxLQUFpQjtZQUN4QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUNu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QUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztLQUMvQjs7OztJQUVELGdDQUFROzs7SUFBUjs7UUFDRSxJQUFJLENBQUMsT0FBTztZQUNWLEdBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLFVBQU8sSUFBRyxJQUFJO1lBQzdDLEdBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLGlCQUFjLElBQUcsS0FBSztlQUN0RCxDQUFDO0tBQ0g7O2dCQS9KRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLGdCQUFnQjtvQkFDMUIsaXdGQUFvQztpQkFDckM7Ozs7OzRCQXdCRSxLQUFLO2lDQUVMLEtBQUs7NEJBRUwsS0FBSzt5QkFFTCxLQUFLOzBCQUVMLEtBQUs7NkJBRUwsS0FBSzs4QkFRTCxLQUFLO3VCQUVMLEtBQUs7MEJBS0wsTUFBTTt5QkFHTixXQUFXLFNBQUMsZUFBZTsrQkFFM0IsV0FBVyxTQUFDLHNCQUFzQjs2QkFJbEMsV0FBVyxTQUFDLG9CQUFvQjtpQ0FJaEMsV0FBVyxTQUFDLHdCQUF3Qjs7d0JBbkV2Qzs7U0FNYSxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVGVtcGxhdGVSZWYsIEVsZW1lbnRSZWYsIEhvc3RCaW5kaW5nIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ0dyaWQsIG56bS1ncmlkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2dyaWQuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIEdyaWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICB3cmFwQ2xzID0ge307XG4gIGl0ZW1DbHMgPSB7fTtcbiAgY2Fyb3VzZWxQcm9wcyA9IHtcbiAgICBkb3RzOiBmYWxzZSxcbiAgICBkcmFnZ2luZzogZmFsc2VcbiAgfTtcbiAgZGVmYXVsdFByb3BzID0ge1xuICAgIGRhdGE6IFtdLFxuICAgIGhhc0xpbmU6IHRydWUsXG4gICAgaXNDYXJvdXNlbDogZmFsc2UsXG4gICAgY29sdW1uTnVtOiA0LFxuICAgIGNhcm91c2VsTWF4Um93OiAyLFxuICAgIHByZWZpeENsczogJ2FtLWdyaWQnLFxuICAgIHNxdWFyZTogdHJ1ZSxcbiAgICBpdGVtU3R5bGU6IHt9XG4gIH07XG4gIGNhcm91c2VsRGF0YSA9IFtdO1xuICBjYXJvdXNlbERhdGFUbXAgPSBbXTtcbiAgZ3JpZERhdGEgPSBbXTtcblxuICBwcml2YXRlIF9kYXRhID0gW107XG5cbiAgQElucHV0KClcbiAgY29sdW1uTnVtOiBudW1iZXIgPSA0O1xuICBASW5wdXQoKVxuICBjYXJvdXNlbE1heFJvdzogbnVtYmVyID0gMjtcbiAgQElucHV0KClcbiAgaXRlbVN0eWxlOiBvYmplY3QgPSB7fTtcbiAgQElucHV0KClcbiAgc3F1YXJlOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgaGFzTGluZTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpXG4gIGdldCBpc0Nhcm91c2VsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRlZmF1bHRQcm9wcy5pc0Nhcm91c2VsO1xuICB9XG4gIHNldCBpc0Nhcm91c2VsICh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuZGVmYXVsdFByb3BzLmlzQ2Fyb3VzZWwgPSB2YWx1ZTtcbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuICBASW5wdXQoKVxuICBhY3RpdmVTdHlsZTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpXG4gIHNldCBkYXRhKHZhbHVlOiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5fZGF0YSA9IHZhbHVlO1xuICAgIHRoaXMuaW5pdCgpO1xuICB9XG4gIEBPdXRwdXQoKVxuICBPbkNsaWNrOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWdyaWQnKVxuICBhbUdyaWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWdyaWQtc3F1YXJlJylcbiAgZ2V0IGFtR3JpZFNxdWFyZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZSA9PT0gdGhpcy5zcXVhcmU7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1ncmlkLWxpbmUnKVxuICBnZXQgYW1HcmlkTGluZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZSA9PT0gdGhpcy5oYXNMaW5lO1xuICB9XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tZ3JpZC1jYXJvdXNlbCcpXG4gIGdldCBhbUdyaWRDYXJvdXNlbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZSA9PT0gdGhpcy5pc0Nhcm91c2VsO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIGlzVGVtcGxhdGVSZWYodmFsdWU6IHt9KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgVGVtcGxhdGVSZWY7XG4gIH1cblxuICBpc1VSTCh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUuaW5kZXhPZignaHR0cCcpID49IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBpbml0KCkge1xuICAgIGNvbnN0IGRhdGFMZW5ndGggPSAodGhpcy5fZGF0YSAmJiB0aGlzLl9kYXRhLmxlbmd0aCkgfHwgMDtcbiAgICBsZXQgcm93Q291bnQgPSBNYXRoLmNlaWwoZGF0YUxlbmd0aCAvIHRoaXMuY29sdW1uTnVtKTtcbiAgICBsZXQgcm93c0FycjtcbiAgICBpZiAodGhpcy5kZWZhdWx0UHJvcHMuaXNDYXJvdXNlbCkge1xuICAgICAgaWYgKHJvd0NvdW50ICUgdGhpcy5jYXJvdXNlbE1heFJvdyAhPT0gMCkge1xuICAgICAgICByb3dDb3VudCA9IHJvd0NvdW50ICsgdGhpcy5jYXJvdXNlbE1heFJvdyAtIChyb3dDb3VudCAlIHRoaXMuY2Fyb3VzZWxNYXhSb3cpO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFnZUNvdW50ID0gTWF0aC5jZWlsKHJvd0NvdW50IC8gdGhpcy5jYXJvdXNlbE1heFJvdyk7XG4gICAgICByb3dzQXJyID0gdGhpcy5nZXRSb3dzKHJvd0NvdW50LCBkYXRhTGVuZ3RoKTtcbiAgICAgIGlmIChwYWdlQ291bnQgPD0gMSkge1xuICAgICAgICB0aGlzLmNhcm91c2VsUHJvcHMgPSB7XG4gICAgICAgICAgZG90czogZmFsc2UsXG4gICAgICAgICAgZHJhZ2dpbmc6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNhcm91c2VsUHJvcHMgPSB7XG4gICAgICAgICAgZG90czogdHJ1ZSxcbiAgICAgICAgICBkcmFnZ2luZzogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdGhpcy5jYXJvdXNlbERhdGFUbXAgPSB0aGlzLmdldENhcm91c2VsRGF0YShyb3dzQXJyLCBwYWdlQ291bnQsIHJvd0NvdW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ncmlkRGF0YSA9IHRoaXMuZ2V0Um93cyhyb3dDb3VudCwgZGF0YUxlbmd0aCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q2Fyb3VzZWxEYXRhKHJvd3NBcnI6IGFueVtdLCBwYWdlQ291bnQ6IG51bWJlciwgcm93Q291bnQ6IG51bWJlcikge1xuICAgIGNvbnN0IHBhZ2VzQXJyOiBhbnlbXSA9IFtdO1xuICAgIGZvciAobGV0IHBhZ2VJbmRleCA9IDA7IHBhZ2VJbmRleCA8IHBhZ2VDb3VudDsgcGFnZUluZGV4KyspIHtcbiAgICAgIGNvbnN0IHBhZ2VSb3dzOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaWkgPSAwOyBpaSA8IHRoaXMuY2Fyb3VzZWxNYXhSb3c7IGlpKyspIHtcbiAgICAgICAgY29uc3Qgcm93SW5kZXggPSBwYWdlSW5kZXggKiB0aGlzLmNhcm91c2VsTWF4Um93ICsgaWk7XG4gICAgICAgIGlmIChyb3dJbmRleCA8IHJvd0NvdW50KSB7XG4gICAgICAgICAgcGFnZVJvd3MucHVzaChyb3dzQXJyW3Jvd0luZGV4XSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8g56m66IqC54K55Li65LqG56Gu5L+d5pyr5bC+6aG155qE5pyA5ZCO5pyq5Yiw5bqV55qE6KGM5pyJ5bqV57q/KOagt+W8j+S4rWxhc3QtY2hpbGTkvJrmsqHnur8pXG4gICAgICAgICAgcGFnZVJvd3MucHVzaChudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcGFnZXNBcnIucHVzaChwYWdlUm93cyk7XG4gICAgfVxuICAgIHJldHVybiBwYWdlc0FycjtcbiAgfVxuXG4gIGdldFJvd3Mocm93Q291bnQ6IG51bWJlciwgZGF0YUxlbmd0aDogbnVtYmVyKSB7XG4gICAgY29uc3QgY29sdW1uTnVtID0gdGhpcy5jb2x1bW5OdW07XG4gICAgY29uc3Qgcm93QXJyID0gbmV3IEFycmF5KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dDb3VudDsgaSsrKSB7XG4gICAgICByb3dBcnJbaV0gPSBuZXcgQXJyYXkoKTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29sdW1uTnVtOyBqKyspIHtcbiAgICAgICAgY29uc3QgZGF0YUluZGV4ID0gaSAqIGNvbHVtbk51bSArIGo7XG4gICAgICAgIGlmIChkYXRhSW5kZXggPCBkYXRhTGVuZ3RoKSB7XG4gICAgICAgICAgcm93QXJyW2ldW2pdID0gdGhpcy5fZGF0YVtkYXRhSW5kZXhdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJvd0FycltpXVtqXSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvd0FycjtcbiAgfVxuXG4gIGNsaWNrKGRhdGEsIGluZGV4KSB7XG4gICAgY29uc3Qgb3V0cHV0RGF0YSA9IHtcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgICBpbmRleDogaW5kZXhcbiAgICB9O1xuICAgIHRoaXMuT25DbGljay5lbWl0KG91dHB1dERhdGEpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pdGVtQ2xzID0ge1xuICAgICAgW2Ake3RoaXMuZGVmYXVsdFByb3BzLnByZWZpeENsc30taXRlbWBdOiB0cnVlLFxuICAgICAgW2Ake3RoaXMuZGVmYXVsdFByb3BzLnByZWZpeENsc30tYWN0aXZlLWl0ZW1gXTogZmFsc2VcbiAgICB9O1xuICB9XG59XG4iXX0=