UNPKG

@rybos/angular2gridster

Version:

[![npm version](https://badge.fury.io/js/angular2gridster.svg)](https://badge.fury.io/js/angular2gridster)

298 lines 38.4 kB
export class GridListItem { get $element() { return this.getItem().$element; } get x() { const item = this.getItem(); const breakpoint = item.gridster ? item.gridster.options.breakpoint : null; return this.getValueX(breakpoint); } set x(value) { const item = this.getItem(); const breakpoint = item.gridster ? item.gridster.options.breakpoint : null; this.setValueX(value, breakpoint); } get y() { const item = this.getItem(); const breakpoint = item.gridster ? item.gridster.options.breakpoint : null; return this.getValueY(breakpoint); } set y(value) { const item = this.getItem(); const breakpoint = item.gridster ? item.gridster.options.breakpoint : null; this.setValueY(value, breakpoint); } get w() { const item = this.getItem(); const breakpoint = item.gridster ? item.gridster.options.breakpoint : null; return this.getValueW(breakpoint); } set w(value) { const item = this.getItem(); const breakpoint = item.gridster ? item.gridster.options.breakpoint : null; this.setValueW(value, breakpoint); } get h() { const item = this.getItem(); const breakpoint = item.gridster ? item.gridster.options.breakpoint : null; return this.getValueH(breakpoint); } set h(value) { const item = this.getItem(); const breakpoint = item.gridster ? item.gridster.options.breakpoint : null; this.setValueH(value, breakpoint); } get autoSize() { return this.getItem().autoSize; } set autoSize(value) { this.getItem().autoSize = value; } get dragAndDrop() { return !!this.getItem().dragAndDrop; } get resizable() { return !!this.getItem().resizable; } get positionX() { const item = this.itemComponent || this.itemPrototype; if (!item) { return null; } return item.positionX; } get positionY() { const item = this.itemComponent || this.itemPrototype; if (!item) { return null; } return item.positionY; } setFromGridsterItem(item) { if (this.isItemSet()) { throw new Error('GridListItem is already set.'); } this.itemComponent = item; return this; } setFromGridsterItemPrototype(item) { if (this.isItemSet()) { throw new Error('GridListItem is already set.'); } this.itemPrototype = item; return this; } setFromObjectLiteral(item) { if (this.isItemSet()) { throw new Error('GridListItem is already set.'); } this.itemObject = item; return this; } copy() { const itemCopy = new GridListItem(); return itemCopy.setFromObjectLiteral({ $element: this.$element, x: this.x, y: this.y, w: this.w, h: this.h, autoSize: this.autoSize, dragAndDrop: this.dragAndDrop, resizable: this.resizable }); } copyForBreakpoint(breakpoint) { const itemCopy = new GridListItem(); return itemCopy.setFromObjectLiteral({ $element: this.$element, x: this.getValueX(breakpoint), y: this.getValueY(breakpoint), w: this.getValueW(breakpoint), h: this.getValueH(breakpoint), autoSize: this.autoSize, dragAndDrop: this.dragAndDrop, resizable: this.resizable }); } getValueX(breakpoint) { const item = this.getItem(); return item[this.getXProperty(breakpoint)]; } getValueY(breakpoint) { const item = this.getItem(); return item[this.getYProperty(breakpoint)]; } getValueW(breakpoint) { const item = this.getItem(); return item[this.getWProperty(breakpoint)] || 1; } getValueH(breakpoint) { const item = this.getItem(); return item[this.getHProperty(breakpoint)] || 1; } setValueX(value, breakpoint) { const item = this.getItem(); item[this.getXProperty(breakpoint)] = value; } setValueY(value, breakpoint) { const item = this.getItem(); item[this.getYProperty(breakpoint)] = value; } setValueW(value, breakpoint) { const item = this.getItem(); item[this.getWProperty(breakpoint)] = value; } setValueH(value, breakpoint) { const item = this.getItem(); item[this.getHProperty(breakpoint)] = value; } triggerChangeX(breakpoint) { const item = this.itemComponent; if (item) { item[this.getXProperty(breakpoint) + 'Change'].emit(this.getValueX(breakpoint)); } } triggerChangeY(breakpoint) { const item = this.itemComponent; if (item) { item[this.getYProperty(breakpoint) + 'Change'].emit(this.getValueY(breakpoint)); } } triggerChangeW(breakpoint) { const item = this.itemComponent; if (item) { item[this.getWProperty(breakpoint) + 'Change'].emit(this.getValueW(breakpoint)); } } triggerChangeH(breakpoint) { const item = this.itemComponent; if (item) { item[this.getHProperty(breakpoint) + 'Change'].emit(this.getValueH(breakpoint)); } } hasPositions(breakpoint) { const x = this.getValueX(breakpoint); const y = this.getValueY(breakpoint); return (x || x === 0) && (y || y === 0); } applyPosition(gridster) { const position = this.calculatePosition(gridster); this.itemComponent.positionX = position.left; this.itemComponent.positionY = position.top; this.itemComponent.updateElemenetPosition(); } calculatePosition(gridster) { if (!gridster && !this.itemComponent) { return { left: 0, top: 0 }; } gridster = gridster || this.itemComponent.gridster; return { left: this.x * gridster.cellWidth, top: this.y * gridster.cellHeight }; } applySize(gridster) { const size = this.calculateSize(gridster); this.$element.style.width = size.width + 'px'; this.$element.style.height = size.height + 'px'; } calculateSize(gridster) { if (!gridster && !this.itemComponent) { return { width: 0, height: 0 }; } gridster = gridster || this.itemComponent.gridster; let width = this.getValueW(gridster.options.breakpoint); let height = this.getValueH(gridster.options.breakpoint); if (gridster.options.direction === 'vertical') { width = Math.min(width, gridster.options.lanes); } if (gridster.options.direction === 'horizontal') { height = Math.min(height, gridster.options.lanes); } return { width: width * gridster.cellWidth, height: height * gridster.cellHeight }; } getXProperty(breakpoint) { if (breakpoint && this.itemComponent) { return GridListItem.X_PROPERTY_MAP[breakpoint]; } else { return 'x'; } } getYProperty(breakpoint) { if (breakpoint && this.itemComponent) { return GridListItem.Y_PROPERTY_MAP[breakpoint]; } else { return 'y'; } } getWProperty(breakpoint) { if (this.itemPrototype) { return this.itemPrototype[GridListItem.W_PROPERTY_MAP[breakpoint]] ? GridListItem.W_PROPERTY_MAP[breakpoint] : 'w'; } const item = this.getItem(); const responsiveSizes = item.gridster && item.gridster.options.responsiveSizes; if (breakpoint && responsiveSizes) { return GridListItem.W_PROPERTY_MAP[breakpoint]; } else { return 'w'; } } getHProperty(breakpoint) { if (this.itemPrototype) { return this.itemPrototype[GridListItem.H_PROPERTY_MAP[breakpoint]] ? GridListItem.H_PROPERTY_MAP[breakpoint] : 'h'; } const item = this.getItem(); const responsiveSizes = item.gridster && item.gridster.options.responsiveSizes; if (breakpoint && responsiveSizes) { return GridListItem.H_PROPERTY_MAP[breakpoint]; } else { return 'h'; } } getItem() { const item = this.itemComponent || this.itemPrototype || this.itemObject; if (!item) { throw new Error('GridListItem is not set.'); } return item; } isItemSet() { return this.itemComponent || this.itemPrototype || this.itemObject; } } GridListItem.BREAKPOINTS = ['sm', 'md', 'lg', 'xl']; GridListItem.X_PROPERTY_MAP = { sm: 'xSm', md: 'xMd', lg: 'xLg', xl: 'xXl' }; GridListItem.Y_PROPERTY_MAP = { sm: 'ySm', md: 'yMd', lg: 'yLg', xl: 'yXl' }; GridListItem.W_PROPERTY_MAP = { sm: 'wSm', md: 'wMd', lg: 'wLg', xl: 'wXl' }; GridListItem.H_PROPERTY_MAP = { sm: 'hSm', md: 'hMd', lg: 'hLg', xl: 'hXl' }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JpZExpc3RJdGVtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhcjJncmlkc3Rlci9zcmMvbGliL2dyaWRMaXN0L0dyaWRMaXN0SXRlbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxNQUFNLE9BQU8sWUFBWTtJQWtDckIsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO0lBQ25DLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDNUIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFM0UsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFDRCxJQUFJLENBQUMsQ0FBRSxLQUFhO1FBQ2hCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM1QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUUzRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzVCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBRTNFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBQ0QsSUFBSSxDQUFDLENBQUUsS0FBYTtRQUNoQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDNUIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFM0UsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQUksQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM1QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUUzRSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUNELElBQUksQ0FBQyxDQUFFLEtBQWE7UUFDaEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzVCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBRTNFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDNUIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFM0UsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFDRCxJQUFJLENBQUMsQ0FBRSxLQUFhO1FBQ2hCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM1QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUUzRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO0lBQ25DLENBQUM7SUFDRCxJQUFJLFFBQVEsQ0FBRSxLQUFjO1FBQ3hCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFJLFdBQVc7UUFDWCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsV0FBVyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDVCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDVCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUM7UUFFdEQsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNQLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksU0FBUztRQUNULE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUV0RCxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1AsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRU0sbUJBQW1CLENBQUUsSUFBMkI7UUFDbkQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1NBQ25EO1FBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLDRCQUE0QixDQUFFLElBQW9DO1FBQ3JFLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztTQUNuRDtRQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxvQkFBb0IsQ0FBRSxJQUFZO1FBQ3JDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztTQUNuRDtRQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxJQUFJO1FBQ1AsTUFBTSxRQUFRLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVwQyxPQUFPLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQztZQUNqQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ1QsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ1QsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ1QsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ1QsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7U0FDNUIsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLGlCQUFpQixDQUFDLFVBQVc7UUFDaEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVwQyxPQUFPLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQztZQUNqQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO1lBQzdCLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQztZQUM3QixDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7WUFDN0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO1lBQzdCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDN0IsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1NBQzVCLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxTQUFTLENBQUMsVUFBVztRQUN4QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFNUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFTSxTQUFTLENBQUMsVUFBVztRQUN4QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFNUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFTSxTQUFTLENBQUMsVUFBVztRQUN4QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFNUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRU0sU0FBUyxDQUFDLFVBQVc7UUFDeEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRTVCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVNLFNBQVMsQ0FBQyxLQUFhLEVBQUUsVUFBVztRQUN2QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDaEQsQ0FBQztJQUVNLFNBQVMsQ0FBQyxLQUFhLEVBQUUsVUFBVztRQUN2QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDaEQsQ0FBQztJQUVNLFNBQVMsQ0FBQyxLQUFhLEVBQUUsVUFBVztRQUN2QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDaEQsQ0FBQztJQUVNLFNBQVMsQ0FBQyxLQUFhLEVBQUUsVUFBVztRQUN2QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDaEQsQ0FBQztJQUVNLGNBQWMsQ0FBQyxVQUFXO1FBQzdCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDaEMsSUFBSSxJQUFJLEVBQUU7WUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1NBQ25GO0lBQ0wsQ0FBQztJQUVNLGNBQWMsQ0FBQyxVQUFXO1FBQzdCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDaEMsSUFBSSxJQUFJLEVBQUU7WUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1NBQ25GO0lBQ0wsQ0FBQztJQUVNLGNBQWMsQ0FBQyxVQUFXO1FBQzdCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDaEMsSUFBSSxJQUFJLEVBQUU7WUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1NBQ25GO0lBQ0wsQ0FBQztJQUVNLGNBQWMsQ0FBQyxVQUFXO1FBQzdCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDaEMsSUFBSSxJQUFJLEVBQUU7WUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1NBQ25GO0lBQ0wsQ0FBQztJQUVNLFlBQVksQ0FBQyxVQUFXO1FBQzNCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVyQyxPQUFPLENBQUMsQ0FBQyxJQUFJ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LENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBHcmlkc3Rlckl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi9ncmlkc3Rlci1pdGVtL2dyaWRzdGVyLWl0ZW0uY29tcG9uZW50JztcclxuaW1wb3J0IHsgR3JpZHN0ZXJJdGVtUHJvdG90eXBlRGlyZWN0aXZlIH0gZnJvbSAnLi4vZ3JpZHN0ZXItcHJvdG90eXBlL2dyaWRzdGVyLWl0ZW0tcHJvdG90eXBlLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IEdyaWRzdGVyU2VydmljZSB9IGZyb20gJy4uL2dyaWRzdGVyLnNlcnZpY2UnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEdyaWRMaXN0SXRlbSB7XHJcbiAgICBzdGF0aWMgQlJFQUtQT0lOVFM6IEFycmF5PHN0cmluZz4gPSBbJ3NtJywgJ21kJywgJ2xnJywgJ3hsJ107XHJcbiAgICBzdGF0aWMgWF9QUk9QRVJUWV9NQVA6IGFueSA9IHtcclxuICAgICAgICBzbTogJ3hTbScsXHJcbiAgICAgICAgbWQ6ICd4TWQnLFxyXG4gICAgICAgIGxnOiAneExnJyxcclxuICAgICAgICB4bDogJ3hYbCdcclxuICAgIH07XHJcblxyXG4gICAgc3RhdGljIFlfUFJPUEVSVFlfTUFQOiBhbnkgPSB7XHJcbiAgICAgICAgc206ICd5U20nLFxyXG4gICAgICAgIG1kOiAneU1kJyxcclxuICAgICAgICBsZzogJ3lMZycsXHJcbiAgICAgICAgeGw6ICd5WGwnXHJcbiAgICB9O1xyXG5cclxuICAgIHN0YXRpYyBXX1BST1BFUlRZX01BUDogYW55ID0ge1xyXG4gICAgICAgIHNtOiAnd1NtJyxcclxuICAgICAgICBtZDogJ3dNZCcsXHJcbiAgICAgICAgbGc6ICd3TGcnLFxyXG4gICAgICAgIHhsOiAnd1hsJ1xyXG4gICAgfTtcclxuXHJcbiAgICBzdGF0aWMgSF9QUk9QRVJUWV9NQVA6IGFueSA9IHtcclxuICAgICAgICBzbTogJ2hTbScsXHJcbiAgICAgICAgbWQ6ICdoTWQnLFxyXG4gICAgICAgIGxnOiAnaExnJyxcclxuICAgICAgICB4bDogJ2hYbCdcclxuICAgIH07XHJcblxyXG4gICAgaXRlbUNvbXBvbmVudDogR3JpZHN0ZXJJdGVtQ29tcG9uZW50O1xyXG4gICAgaXRlbVByb3RvdHlwZTogR3JpZHN0ZXJJdGVtUHJvdG90eXBlRGlyZWN0aXZlO1xyXG4gICAgaXRlbU9iamVjdDogYW55O1xyXG5cclxuICAgIGdldCAkZWxlbWVudCAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SXRlbSgpLiRlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB4ICgpIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKCk7XHJcbiAgICAgICAgY29uc3QgYnJlYWtwb2ludCA9IGl0ZW0uZ3JpZHN0ZXIgPyBpdGVtLmdyaWRzdGVyLm9wdGlvbnMuYnJlYWtwb2ludCA6IG51bGw7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFZhbHVlWChicmVha3BvaW50KTtcclxuICAgIH1cclxuICAgIHNldCB4ICh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbSgpO1xyXG4gICAgICAgIGNvbnN0IGJyZWFrcG9pbnQgPSBpdGVtLmdyaWRzdGVyID8gaXRlbS5ncmlkc3Rlci5vcHRpb25zLmJyZWFrcG9pbnQgOiBudWxsO1xyXG5cclxuICAgICAgICB0aGlzLnNldFZhbHVlWCh2YWx1ZSwgYnJlYWtwb2ludCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHkgKCkge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0oKTtcclxuICAgICAgICBjb25zdCBicmVha3BvaW50ID0gaXRlbS5ncmlkc3RlciA/IGl0ZW0uZ3JpZHN0ZXIub3B0aW9ucy5icmVha3BvaW50IDogbnVsbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWVZKGJyZWFrcG9pbnQpO1xyXG4gICAgfVxyXG4gICAgc2V0IHkgKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKCk7XHJcbiAgICAgICAgY29uc3QgYnJlYWtwb2ludCA9IGl0ZW0uZ3JpZHN0ZXIgPyBpdGVtLmdyaWRzdGVyLm9wdGlvbnMuYnJlYWtwb2ludCA6IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0VmFsdWVZKHZhbHVlLCBicmVha3BvaW50KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgdyAoKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbSgpO1xyXG4gICAgICAgIGNvbnN0IGJyZWFrcG9pbnQgPSBpdGVtLmdyaWRzdGVyID8gaXRlbS5ncmlkc3Rlci5vcHRpb25zLmJyZWFrcG9pbnQgOiBudWxsO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZVcoYnJlYWtwb2ludCk7XHJcbiAgICB9XHJcbiAgICBzZXQgdyAodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0oKTtcclxuICAgICAgICBjb25zdCBicmVha3BvaW50ID0gaXRlbS5ncmlkc3RlciA/IGl0ZW0uZ3JpZHN0ZXIub3B0aW9ucy5icmVha3BvaW50IDogbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRWYWx1ZVcodmFsdWUsIGJyZWFrcG9pbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBoICgpIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKCk7XHJcbiAgICAgICAgY29uc3QgYnJlYWtwb2ludCA9IGl0ZW0uZ3JpZHN0ZXIgPyBpdGVtLmdyaWRzdGVyLm9wdGlvbnMuYnJlYWtwb2ludCA6IG51bGw7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFZhbHVlSChicmVha3BvaW50KTtcclxuICAgIH1cclxuICAgIHNldCBoICh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbSgpO1xyXG4gICAgICAgIGNvbnN0IGJyZWFrcG9pbnQgPSBpdGVtLmdyaWRzdGVyID8gaXRlbS5ncmlkc3Rlci5vcHRpb25zLmJyZWFrcG9pbnQgOiBudWxsO1xyXG5cclxuICAgICAgICB0aGlzLnNldFZhbHVlSCh2YWx1ZSwgYnJlYWtwb2ludCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGF1dG9TaXplICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRJdGVtKCkuYXV0b1NpemU7XHJcbiAgICB9XHJcbiAgICBzZXQgYXV0b1NpemUgKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5nZXRJdGVtKCkuYXV0b1NpemUgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZHJhZ0FuZERyb3AoKSB7XHJcbiAgICAgICAgcmV0dXJuICEhdGhpcy5nZXRJdGVtKCkuZHJhZ0FuZERyb3A7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJlc2l6YWJsZSgpIHtcclxuICAgICAgICByZXR1cm4gISF0aGlzLmdldEl0ZW0oKS5yZXNpemFibGU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHBvc2l0aW9uWCgpIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtQ29tcG9uZW50IHx8IHRoaXMuaXRlbVByb3RvdHlwZTtcclxuXHJcbiAgICAgICAgaWYgKCFpdGVtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGl0ZW0ucG9zaXRpb25YO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwb3NpdGlvblkoKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbUNvbXBvbmVudCB8fCB0aGlzLml0ZW1Qcm90b3R5cGU7XHJcblxyXG4gICAgICAgIGlmICghaXRlbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBpdGVtLnBvc2l0aW9uWTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0RnJvbUdyaWRzdGVySXRlbSAoaXRlbTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50KTogR3JpZExpc3RJdGVtIHtcclxuICAgICAgICBpZiAodGhpcy5pc0l0ZW1TZXQoKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dyaWRMaXN0SXRlbSBpcyBhbHJlYWR5IHNldC4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pdGVtQ29tcG9uZW50ID0gaXRlbTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0RnJvbUdyaWRzdGVySXRlbVByb3RvdHlwZSAoaXRlbTogR3JpZHN0ZXJJdGVtUHJvdG90eXBlRGlyZWN0aXZlKTogR3JpZExpc3RJdGVtIHtcclxuICAgICAgICBpZiAodGhpcy5pc0l0ZW1TZXQoKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dyaWRMaXN0SXRlbSBpcyBhbHJlYWR5IHNldC4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pdGVtUHJvdG90eXBlID0gaXRlbTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0RnJvbU9iamVjdExpdGVyYWwgKGl0ZW06IE9iamVjdCk6IEdyaWRMaXN0SXRlbSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNJdGVtU2V0KCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHcmlkTGlzdEl0ZW0gaXMgYWxyZWFkeSBzZXQuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXRlbU9iamVjdCA9IGl0ZW07XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNvcHkoKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbUNvcHkgPSBuZXcgR3JpZExpc3RJdGVtKCk7XHJcblxyXG4gICAgICAgIHJldHVybiBpdGVtQ29weS5zZXRGcm9tT2JqZWN0TGl0ZXJhbCh7XHJcbiAgICAgICAgICAgICRlbGVtZW50OiB0aGlzLiRlbGVtZW50LFxyXG4gICAgICAgICAgICB4OiB0aGlzLngsXHJcbiAgICAgICAgICAgIHk6IHRoaXMueSxcclxuICAgICAgICAgICAgdzogdGhpcy53LFxyXG4gICAgICAgICAgICBoOiB0aGlzLmgsXHJcbiAgICAgICAgICAgIGF1dG9TaXplOiB0aGlzLmF1dG9TaXplLFxyXG4gICAgICAgICAgICBkcmFnQW5kRHJvcDogdGhpcy5kcmFnQW5kRHJvcCxcclxuICAgICAgICAgICAgcmVzaXphYmxlOiB0aGlzLnJlc2l6YWJsZVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjb3B5Rm9yQnJlYWtwb2ludChicmVha3BvaW50Pykge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1Db3B5ID0gbmV3IEdyaWRMaXN0SXRlbSgpO1xyXG5cclxuICAgICAgICByZXR1cm4gaXRlbUNvcHkuc2V0RnJvbU9iamVjdExpdGVyYWwoe1xyXG4gICAgICAgICAgICAkZWxlbWVudDogdGhpcy4kZWxlbWVudCxcclxuICAgICAgICAgICAgeDogdGhpcy5nZXRWYWx1ZVgoYnJlYWtwb2ludCksXHJcbiAgICAgICAgICAgIHk6IHRoaXMuZ2V0VmFsdWVZKGJyZWFrcG9pbnQpLFxyXG4gICAgICAgICAgICB3OiB0aGlzLmdldFZhbHVlVyhicmVha3BvaW50KSxcclxuICAgICAgICAgICAgaDogdGhpcy5nZXRWYWx1ZUgoYnJlYWtwb2ludCksXHJcbiAgICAgICAgICAgIGF1dG9TaXplOiB0aGlzLmF1dG9TaXplLFxyXG4gICAgICAgICAgICBkcmFnQW5kRHJvcDogdGhpcy5kcmFnQW5kRHJvcCxcclxuICAgICAgICAgICAgcmVzaXphYmxlOiB0aGlzLnJlc2l6YWJsZVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRWYWx1ZVgoYnJlYWtwb2ludD8pIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKCk7XHJcblxyXG4gICAgICAgIHJldHVybiBpdGVtW3RoaXMuZ2V0WFByb3BlcnR5KGJyZWFrcG9pbnQpXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0VmFsdWVZKGJyZWFrcG9pbnQ/KSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbSgpO1xyXG5cclxuICAgICAgICByZXR1cm4gaXRlbVt0aGlzLmdldFlQcm9wZXJ0eShicmVha3BvaW50KV07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFZhbHVlVyhicmVha3BvaW50Pykge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0oKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGl0ZW1bdGhpcy5nZXRXUHJvcGVydHkoYnJlYWtwb2ludCldIHx8IDE7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFZhbHVlSChicmVha3BvaW50Pykge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0oKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGl0ZW1bdGhpcy5nZXRIUHJvcGVydHkoYnJlYWtwb2ludCldIHx8IDE7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldFZhbHVlWCh2YWx1ZTogbnVtYmVyLCBicmVha3BvaW50Pykge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0oKTtcclxuXHJcbiAgICAgICAgaXRlbVt0aGlzLmdldFhQcm9wZXJ0eShicmVha3BvaW50KV0gPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0VmFsdWVZKHZhbHVlOiBudW1iZXIsIGJyZWFrcG9pbnQ/KSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbSgpO1xyXG5cclxuICAgICAgICBpdGVtW3RoaXMuZ2V0WVByb3BlcnR5KGJyZWFrcG9pbnQpXSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRWYWx1ZVcodmFsdWU6IG51bWJlciwgYnJlYWtwb2ludD8pIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKCk7XHJcblxyXG4gICAgICAgIGl0ZW1bdGhpcy5nZXRXUHJvcGVydHkoYnJlYWtwb2ludCldID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldFZhbHVlSCh2YWx1ZTogbnVtYmVyLCBicmVha3BvaW50Pykge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0oKTtcclxuXHJcbiAgICAgICAgaXRlbVt0aGlzLmdldEhQcm9wZXJ0eShicmVha3BvaW50KV0gPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdHJpZ2dlckNoYW5nZVgoYnJlYWtwb2ludD8pIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtQ29tcG9uZW50O1xyXG4gICAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgICAgIGl0ZW1bdGhpcy5nZXRYUHJvcGVydHkoYnJlYWtwb2ludCkgKyAnQ2hhbmdlJ10uZW1pdCh0aGlzLmdldFZhbHVlWChicmVha3BvaW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB0cmlnZ2VyQ2hhbmdlWShicmVha3BvaW50Pykge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1Db21wb25lbnQ7XHJcbiAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgaXRlbVt0aGlzLmdldFlQcm9wZXJ0eShicmVha3BvaW50KSArICdDaGFuZ2UnXS5lbWl0KHRoaXMuZ2V0VmFsdWVZKGJyZWFrcG9pbnQpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHRyaWdnZXJDaGFuZ2VXKGJyZWFrcG9pbnQ/KSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbUNvbXBvbmVudDtcclxuICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICBpdGVtW3RoaXMuZ2V0V1Byb3BlcnR5KGJyZWFrcG9pbnQpICsgJ0NoYW5nZSddLmVtaXQodGhpcy5nZXRWYWx1ZVcoYnJlYWtwb2ludCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdHJpZ2dlckNoYW5nZUgoYnJlYWtwb2ludD8pIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtQ29tcG9uZW50O1xyXG4gICAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgICAgIGl0ZW1bdGhpcy5nZXRIUHJvcGVydHkoYnJlYWtwb2ludCkgKyAnQ2hhbmdlJ10uZW1pdCh0aGlzLmdldFZhbHVlSChicmVha3BvaW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoYXNQb3NpdGlvbnMoYnJlYWtwb2ludD8pIHtcclxuICAgICAgICBjb25zdCB4ID0gdGhpcy5nZXRWYWx1ZVgoYnJlYWtwb2ludCk7XHJcbiAgICAgICAgY29uc3QgeSA9IHRoaXMuZ2V0VmFsdWVZKGJyZWFrcG9pbnQpO1xyXG5cclxuICAgICAgICByZXR1cm4gKHggfHwgeCA9PT0gMCkgJiYgKHkgfHwgeSA9PT0gMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFwcGx5UG9zaXRpb24oZ3JpZHN0ZXI/OiBHcmlkc3RlclNlcnZpY2UpIHtcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuY2FsY3VsYXRlUG9zaXRpb24oZ3JpZHN0ZXIpO1xyXG5cclxuICAgICAgICB0aGlzLml0ZW1Db21wb25lbnQucG9zaXRpb25YID0gcG9zaXRpb24ubGVmdDtcclxuICAgICAgICB0aGlzLml0ZW1Db21wb25lbnQucG9zaXRpb25ZID0gcG9zaXRpb24udG9wO1xyXG4gICAgICAgIHRoaXMuaXRlbUNvbXBvbmVudC51cGRhdGVFbGVtZW5ldFBvc2l0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNhbGN1bGF0ZVBvc2l0aW9uKGdyaWRzdGVyPzogR3JpZHN0ZXJTZXJ2aWNlKToge2xlZnQ6IG51bWJlciwgdG9wOiBudW1iZXJ9IHtcclxuICAgICAgICBpZiAoIWdyaWRzdGVyICYmICF0aGlzLml0ZW1Db21wb25lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtsZWZ0OiAwLCB0b3A6IDB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBncmlkc3RlciA9IGdyaWRzdGVyIHx8IHRoaXMuaXRlbUNvbXBvbmVudC5ncmlkc3RlcjtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbGVmdDogdGhpcy54ICogZ3JpZHN0ZXIuY2VsbFdpZHRoLFxyXG4gICAgICAgICAgICB0b3A6IHRoaXMueSAqIGdyaWRzdGVyLmNlbGxIZWlnaHRcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhcHBseVNpemUoZ3JpZHN0ZXI/OiBHcmlkc3RlclNlcnZpY2UpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5jYWxjdWxhdGVTaXplKGdyaWRzdGVyKTtcclxuXHJcbiAgICAgICAgdGhpcy4kZWxlbWVudC5zdHlsZS53aWR0aCA9IHNpemUud2lkdGggKyAncHgnO1xyXG4gICAgICAgIHRoaXMuJGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gc2l6ZS5oZWlnaHQgKyAncHgnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjYWxjdWxhdGVTaXplKGdyaWRzdGVyPzogR3JpZHN0ZXJTZXJ2aWNlKToge3dpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyfSB7XHJcbiAgICAgICAgaWYgKCFncmlkc3RlciAmJiAhdGhpcy5pdGVtQ29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7d2lkdGg6IDAsIGhlaWdodDogMH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGdyaWRzdGVyID0gZ3JpZHN0ZXIgfHwgdGhpcy5pdGVtQ29tcG9uZW50LmdyaWRzdGVyO1xyXG5cclxuICAgICAgICBsZXQgd2lkdGggPSB0aGlzLmdldFZhbHVlVyhncmlkc3Rlci5vcHRpb25zLmJyZWFrcG9pbnQpO1xyXG4gICAgICAgIGxldCBoZWlnaHQgPSB0aGlzLmdldFZhbHVlSChncmlkc3Rlci5vcHRpb25zLmJyZWFrcG9pbnQpO1xyXG5cclxuICAgICAgICBpZiAoZ3JpZHN0ZXIub3B0aW9ucy5kaXJlY3Rpb24gPT09ICd2ZXJ0aWNhbCcpIHtcclxuICAgICAgICAgICAgd2lkdGggPSBNYXRoLm1pbih3aWR0aCwgZ3JpZHN0ZXIub3B0aW9ucy5sYW5lcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChncmlkc3Rlci5vcHRpb25zLmRpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnKSB7XHJcbiAgICAgICAgICAgIGhlaWdodCA9IE1hdGgubWluKGhlaWdodCwgZ3JpZHN0ZXIub3B0aW9ucy5sYW5lcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB3aWR0aDogd2lkdGggKiBncmlkc3Rlci5jZWxsV2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0ICogZ3JpZHN0ZXIuY2VsbEhlaWdodFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRYUHJvcGVydHkoYnJlYWtwb2ludD86IHN0cmluZykge1xyXG5cclxuICAgICAgICBpZiAoYnJlYWtwb2ludCAmJiB0aGlzLml0ZW1Db21wb25lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIEdyaWRMaXN0SXRlbS5YX1BST1BFUlRZX01BUFticmVha3BvaW50XTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gJ3gnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFlQcm9wZXJ0eShicmVha3BvaW50Pzogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIGlmIChicmVha3BvaW50ICYmIHRoaXMuaXRlbUNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gR3JpZExpc3RJdGVtLllfUFJPUEVSVFlfTUFQW2JyZWFrcG9pbnRdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAneSc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0V1Byb3BlcnR5KGJyZWFrcG9pbnQ/OiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodGhpcy5pdGVtUHJvdG90eXBlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLml0ZW1Qcm90b3R5cGVbR3JpZExpc3RJdGVtLldfUFJPUEVSVFlfTUFQW2JyZWFrcG9pbnRdXSA/XHJcbiAgICAgICAgICAgICAgICBHcmlkTGlzdEl0ZW0uV19QUk9QRVJUWV9NQVBbYnJlYWtwb2ludF0gOiAndyc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKCk7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2l2ZVNpemVzID0gaXRlbS5ncmlkc3RlciAmJiBpdGVtLmdyaWRzdGVyLm9wdGlvbnMucmVzcG9uc2l2ZVNpemVzO1xyXG5cclxuICAgICAgICBpZiAoYnJlYWtwb2ludCAmJiByZXNwb25zaXZlU2l6ZXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIEdyaWRMaXN0SXRlbS5XX1BST1BFUlRZX01BUFticmVha3BvaW50XTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gJ3cnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEhQcm9wZXJ0eShicmVha3BvaW50Pzogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXRlbVByb3RvdHlwZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pdGVtUHJvdG90eXBlW0dyaWRMaXN0SXRlbS5IX1BST1BFUlRZX01BUFticmVha3BvaW50XV0gP1xyXG4gICAgICAgICAgICAgICAgR3JpZExpc3RJdGVtLkhfUFJPUEVSVFlfTUFQW2JyZWFrcG9pbnRdIDogJ2gnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbSgpO1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNpdmVTaXplcyA9IGl0ZW0uZ3JpZHN0ZXIgJiYgaXRlbS5ncmlkc3Rlci5vcHRpb25zLnJlc3BvbnNpdmVTaXplcztcclxuXHJcbiAgICAgICAgaWYgKGJyZWFrcG9pbnQgJiYgcmVzcG9uc2l2ZVNpemVzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBHcmlkTGlzdEl0ZW0uSF9QUk9QRVJUWV9NQVBbYnJlYWtwb2ludF07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuICdoJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRJdGVtKCk6IGFueSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbUNvbXBvbmVudCB8fCB0aGlzLml0ZW1Qcm90b3R5cGUgfHwgdGhpcy5pdGVtT2JqZWN0O1xyXG5cclxuICAgICAgICBpZiAoIWl0ZW0pIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHcmlkTGlzdEl0ZW0gaXMgbm90IHNldC4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpc0l0ZW1TZXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbUNvbXBvbmVudCB8fCB0aGlzLml0ZW1Qcm90b3R5cGUgfHwgdGhpcy5pdGVtT2JqZWN0O1xyXG4gICAgfVxyXG59XHJcbiJdfQ==