UNPKG

angular2gridsterv3

Version:
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JpZExpc3RJdGVtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhcjJncmlkc3RlcnYzL3NyYy9saWIvZ3JpZExpc3QvR3JpZExpc3RJdGVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE1BQU0sT0FBTyxZQUFZO0lBa0NyQixJQUFJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQUksQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM1QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUUzRSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUNELElBQUksQ0FBQyxDQUFFLEtBQWE7UUFDaEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzVCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBRTNFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDNUIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFM0UsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFDRCxJQUFJLENBQUMsQ0FBRSxLQUFhO1FBQ2hCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM1QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUUzRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzVCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBRTNFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBQ0QsSUFBSSxDQUFDLENBQUUsS0FBYTtRQUNoQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDNUIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFM0UsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQUksQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM1QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUUzRSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUNELElBQUksQ0FBQyxDQUFFLEtBQWE7UUFDaEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzVCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBRTNFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7SUFDbkMsQ0FBQztJQUNELElBQUksUUFBUSxDQUFFLEtBQWM7UUFDeEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDcEMsQ0FBQztJQUVELElBQUksV0FBVztRQUNYLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxXQUFXLENBQUM7SUFDeEMsQ0FBQztJQUVELElBQUksU0FBUztRQUNULE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQUksU0FBUztRQUNULE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUV0RCxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1AsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDO1FBRXRELElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDUCxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFFTSxtQkFBbUIsQ0FBRSxJQUEyQjtRQUNuRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7U0FDbkQ7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU0sNEJBQTRCLENBQUUsSUFBb0M7UUFDckUsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1NBQ25EO1FBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLG9CQUFvQixDQUFFLElBQVk7UUFDckMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1NBQ25EO1FBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLElBQUk7UUFDUCxNQUFNLFFBQVEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXBDLE9BQU8sUUFBUSxDQUFDLG9CQUFvQixDQUFDO1lBQ2pDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDVCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDVCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDVCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDVCxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztTQUM1QixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU0saUJBQWlCLENBQUMsVUFBVztRQUNoQyxNQUFNLFFBQVEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXBDLE9BQU8sUUFBUSxDQUFDLG9CQUFvQixDQUFDO1lBQ2pDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7WUFDN0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO1lBQzdCLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQztZQUM3QixDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7WUFDN0IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7U0FDNUIsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLFNBQVMsQ0FBQyxVQUFXO1FBQ3hCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUU1QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVNLFNBQVMsQ0FBQyxVQUFXO1FBQ3hCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUU1QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVNLFNBQVMsQ0FBQyxVQUFXO1FBQ3hCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUU1QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFTSxTQUFTLENBQUMsVUFBVztRQUN4QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFNUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRU0sU0FBUyxDQUFDLEtBQWEsRUFBRSxVQUFXO1FBQ3ZDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUU1QixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNoRCxDQUFDO0lBRU0sU0FBUyxDQUFDLEtBQWEsRUFBRSxVQUFXO1FBQ3ZDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUU1QixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNoRCxDQUFDO0lBRU0sU0FBUyxDQUFDLEtBQWEsRUFBRSxVQUFXO1FBQ3ZDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUU1QixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNoRCxDQUFDO0lBRU0sU0FBUyxDQUFDLEtBQWEsRUFBRSxVQUFXO1FBQ3ZDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUU1QixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNoRCxDQUFDO0lBRU0sY0FBYyxDQUFDLFVBQVc7UUFDN0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNoQyxJQUFJLElBQUksRUFBRTtZQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7U0FDbkY7SUFDTCxDQUFDO0lBRU0sY0FBYyxDQUFDLFVBQVc7UUFDN0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNoQyxJQUFJLElBQUksRUFBRTtZQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7U0FDbkY7SUFDTCxDQUFDO0lBRU0sY0FBYyxDQUFDLFVBQVc7UUFDN0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNoQyxJQUFJLElBQUksRUFBRTtZQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7U0FDbkY7SUFDTCxDQUFDO0lBRU0sY0FBYyxDQUFDLFVBQVc7UUFDN0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNoQyxJQUFJLElBQUksRUFBRTtZQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7U0FDbkY7SUFDTCxDQUFDO0lBRU0sWUFBWSxDQUFDLFVBQVc7UUFDM0IsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXJDLE9BQU8sQ0FBQyxDQUFDLElB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Q1osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEdyaWRzdGVySXRlbUNvbXBvbmVudCB9IGZyb20gJy4uL2dyaWRzdGVyLWl0ZW0vZ3JpZHN0ZXItaXRlbS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUgfSBmcm9tICcuLi9ncmlkc3Rlci1wcm90b3R5cGUvZ3JpZHN0ZXItaXRlbS1wcm90b3R5cGUuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgR3JpZHN0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vZ3JpZHN0ZXIuc2VydmljZSc7XHJcblxyXG5leHBvcnQgY2xhc3MgR3JpZExpc3RJdGVtIHtcclxuICAgIHN0YXRpYyBCUkVBS1BPSU5UUzogQXJyYXk8c3RyaW5nPiA9IFsnc20nLCAnbWQnLCAnbGcnLCAneGwnXTtcclxuICAgIHN0YXRpYyBYX1BST1BFUlRZX01BUDogYW55ID0ge1xyXG4gICAgICAgIHNtOiAneFNtJyxcclxuICAgICAgICBtZDogJ3hNZCcsXHJcbiAgICAgICAgbGc6ICd4TGcnLFxyXG4gICAgICAgIHhsOiAneFhsJ1xyXG4gICAgfTtcclxuXHJcbiAgICBzdGF0aWMgWV9QUk9QRVJUWV9NQVA6IGFueSA9IHtcclxuICAgICAgICBzbTogJ3lTbScsXHJcbiAgICAgICAgbWQ6ICd5TWQnLFxyXG4gICAgICAgIGxnOiAneUxnJyxcclxuICAgICAgICB4bDogJ3lYbCdcclxuICAgIH07XHJcblxyXG4gICAgc3RhdGljIFdfUFJPUEVSVFlfTUFQOiBhbnkgPSB7XHJcbiAgICAgICAgc206ICd3U20nLFxyXG4gICAgICAgIG1kOiAnd01kJyxcclxuICAgICAgICBsZzogJ3dMZycsXHJcbiAgICAgICAgeGw6ICd3WGwnXHJcbiAgICB9O1xyXG5cclxuICAgIHN0YXRpYyBIX1BST1BFUlRZX01BUDogYW55ID0ge1xyXG4gICAgICAgIHNtOiAnaFNtJyxcclxuICAgICAgICBtZDogJ2hNZCcsXHJcbiAgICAgICAgbGc6ICdoTGcnLFxyXG4gICAgICAgIHhsOiAnaFhsJ1xyXG4gICAgfTtcclxuXHJcbiAgICBpdGVtQ29tcG9uZW50OiBHcmlkc3Rlckl0ZW1Db21wb25lbnQ7XHJcbiAgICBpdGVtUHJvdG90eXBlOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmU7XHJcbiAgICBpdGVtT2JqZWN0OiBhbnk7XHJcblxyXG4gICAgZ2V0ICRlbGVtZW50ICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRJdGVtKCkuJGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHggKCkge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0oKTtcclxuICAgICAgICBjb25zdCBicmVha3BvaW50ID0gaXRlbS5ncmlkc3RlciA/IGl0ZW0uZ3JpZHN0ZXIub3B0aW9ucy5icmVha3BvaW50IDogbnVsbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWVYKGJyZWFrcG9pbnQpO1xyXG4gICAgfVxyXG4gICAgc2V0IHggKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKCk7XHJcbiAgICAgICAgY29uc3QgYnJlYWtwb2ludCA9IGl0ZW0uZ3JpZHN0ZXIgPyBpdGVtLmdyaWRzdGVyLm9wdGlvbnMuYnJlYWtwb2ludCA6IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0VmFsdWVYKHZhbHVlLCBicmVha3BvaW50KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgeSAoKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbSgpO1xyXG4gICAgICAgIGNvbnN0IGJyZWFrcG9pbnQgPSBpdGVtLmdyaWRzdGVyID8gaXRlbS5ncmlkc3Rlci5vcHRpb25zLmJyZWFrcG9pbnQgOiBudWxsO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZVkoYnJlYWtwb2ludCk7XHJcbiAgICB9XHJcbiAgICBzZXQgeSAodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0oKTtcclxuICAgICAgICBjb25zdCBicmVha3BvaW50ID0gaXRlbS5ncmlkc3RlciA/IGl0ZW0uZ3JpZHN0ZXIub3B0aW9ucy5icmVha3BvaW50IDogbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRWYWx1ZVkodmFsdWUsIGJyZWFrcG9pbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB3ICgpIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKCk7XHJcbiAgICAgICAgY29uc3QgYnJlYWtwb2ludCA9IGl0ZW0uZ3JpZHN0ZXIgPyBpdGVtLmdyaWRzdGVyLm9wdGlvbnMuYnJlYWtwb2ludCA6IG51bGw7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFZhbHVlVyhicmVha3BvaW50KTtcclxuICAgIH1cclxuICAgIHNldCB3ICh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbSgpO1xyXG4gICAgICAgIGNvbnN0IGJyZWFrcG9pbnQgPSBpdGVtLmdyaWRzdGVyID8gaXRlbS5ncmlkc3Rlci5vcHRpb25zLmJyZWFrcG9pbnQgOiBudWxsO1xyXG5cclxuICAgICAgICB0aGlzLnNldFZhbHVlVyh2YWx1ZSwgYnJlYWtwb2ludCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGggKCkge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0oKTtcclxuICAgICAgICBjb25zdCBicmVha3BvaW50ID0gaXRlbS5ncmlkc3RlciA/IGl0ZW0uZ3JpZHN0ZXIub3B0aW9ucy5icmVha3BvaW50IDogbnVsbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWVIKGJyZWFrcG9pbnQpO1xyXG4gICAgfVxyXG4gICAgc2V0IGggKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKCk7XHJcbiAgICAgICAgY29uc3QgYnJlYWtwb2ludCA9IGl0ZW0uZ3JpZHN0ZXIgPyBpdGVtLmdyaWRzdGVyLm9wdGlvbnMuYnJlYWtwb2ludCA6IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0VmFsdWVIKHZhbHVlLCBicmVha3BvaW50KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgYXV0b1NpemUgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEl0ZW0oKS5hdXRvU2l6ZTtcclxuICAgIH1cclxuICAgIHNldCBhdXRvU2l6ZSAodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLmdldEl0ZW0oKS5hdXRvU2l6ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkcmFnQW5kRHJvcCgpIHtcclxuICAgICAgICByZXR1cm4gISF0aGlzLmdldEl0ZW0oKS5kcmFnQW5kRHJvcDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcmVzaXphYmxlKCkge1xyXG4gICAgICAgIHJldHVybiAhIXRoaXMuZ2V0SXRlbSgpLnJlc2l6YWJsZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcG9zaXRpb25YKCkge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1Db21wb25lbnQgfHwgdGhpcy5pdGVtUHJvdG90eXBlO1xyXG5cclxuICAgICAgICBpZiAoIWl0ZW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaXRlbS5wb3NpdGlvblg7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHBvc2l0aW9uWSgpIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtQ29tcG9uZW50IHx8IHRoaXMuaXRlbVByb3RvdHlwZTtcclxuXHJcbiAgICAgICAgaWYgKCFpdGVtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGl0ZW0ucG9zaXRpb25ZO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRGcm9tR3JpZHN0ZXJJdGVtIChpdGVtOiBHcmlkc3Rlckl0ZW1Db21wb25lbnQpOiBHcmlkTGlzdEl0ZW0ge1xyXG4gICAgICAgIGlmICh0aGlzLmlzSXRlbVNldCgpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignR3JpZExpc3RJdGVtIGlzIGFscmVhZHkgc2V0LicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLml0ZW1Db21wb25lbnQgPSBpdGVtO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRGcm9tR3JpZHN0ZXJJdGVtUHJvdG90eXBlIChpdGVtOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUpOiBHcmlkTGlzdEl0ZW0ge1xyXG4gICAgICAgIGlmICh0aGlzLmlzSXRlbVNldCgpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignR3JpZExpc3RJdGVtIGlzIGFscmVhZHkgc2V0LicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLml0ZW1Qcm90b3R5cGUgPSBpdGVtO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRGcm9tT2JqZWN0TGl0ZXJhbCAoaXRlbTogT2JqZWN0KTogR3JpZExpc3RJdGVtIHtcclxuICAgICAgICBpZiAodGhpcy5pc0l0ZW1TZXQoKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dyaWRMaXN0SXRlbSBpcyBhbHJlYWR5IHNldC4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pdGVtT2JqZWN0ID0gaXRlbTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY29weSgpIHtcclxuICAgICAgICBjb25zdCBpdGVtQ29weSA9IG5ldyBHcmlkTGlzdEl0ZW0oKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGl0ZW1Db3B5LnNldEZyb21PYmplY3RMaXRlcmFsKHtcclxuICAgICAgICAgICAgJGVsZW1lbnQ6IHRoaXMuJGVsZW1lbnQsXHJcbiAgICAgICAgICAgIHg6IHRoaXMueCxcclxuICAgICAgICAgICAgeTogdGhpcy55LFxyXG4gICAgICAgICAgICB3OiB0aGlzLncsXHJcbiAgICAgICAgICAgIGg6IHRoaXMuaCxcclxuICAgICAgICAgICAgYXV0b1NpemU6IHRoaXMuYXV0b1NpemUsXHJcbiAgICAgICAgICAgIGRyYWdBbmREcm9wOiB0aGlzLmRyYWdBbmREcm9wLFxyXG4gICAgICAgICAgICByZXNpemFibGU6IHRoaXMucmVzaXphYmxlXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNvcHlGb3JCcmVha3BvaW50KGJyZWFrcG9pbnQ/KSB7XHJcbiAgICAgICAgY29uc3QgaXRlbUNvcHkgPSBuZXcgR3JpZExpc3RJdGVtKCk7XHJcblxyXG4gICAgICAgIHJldHVybiBpdGVtQ29weS5zZXRGcm9tT2JqZWN0TGl0ZXJhbCh7XHJcbiAgICAgICAgICAgICRlbGVtZW50OiB0aGlzLiRlbGVtZW50LFxyXG4gICAgICAgICAgICB4OiB0aGlzLmdldFZhbHVlWChicmVha3BvaW50KSxcclxuICAgICAgICAgICAgeTogdGhpcy5nZXRWYWx1ZVkoYnJlYWtwb2ludCksXHJcbiAgICAgICAgICAgIHc6IHRoaXMuZ2V0VmFsdWVXKGJyZWFrcG9pbnQpLFxyXG4gICAgICAgICAgICBoOiB0aGlzLmdldFZhbHVlSChicmVha3BvaW50KSxcclxuICAgICAgICAgICAgYXV0b1NpemU6IHRoaXMuYXV0b1NpemUsXHJcbiAgICAgICAgICAgIGRyYWdBbmREcm9wOiB0aGlzLmRyYWdBbmREcm9wLFxyXG4gICAgICAgICAgICByZXNpemFibGU6IHRoaXMucmVzaXphYmxlXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFZhbHVlWChicmVha3BvaW50Pykge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0oKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGl0ZW1bdGhpcy5nZXRYUHJvcGVydHkoYnJlYWtwb2ludCldO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRWYWx1ZVkoYnJlYWtwb2ludD8pIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKCk7XHJcblxyXG4gICAgICAgIHJldHVybiBpdGVtW3RoaXMuZ2V0WVByb3BlcnR5KGJyZWFrcG9pbnQpXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0VmFsdWVXKGJyZWFrcG9pbnQ/KSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbSgpO1xyXG5cclxuICAgICAgICByZXR1cm4gaXRlbVt0aGlzLmdldFdQcm9wZXJ0eShicmVha3BvaW50KV0gfHwgMTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0VmFsdWVIKGJyZWFrcG9pbnQ/KSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbSgpO1xyXG5cclxuICAgICAgICByZXR1cm4gaXRlbVt0aGlzLmdldEhQcm9wZXJ0eShicmVha3BvaW50KV0gfHwgMTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0VmFsdWVYKHZhbHVlOiBudW1iZXIsIGJyZWFrcG9pbnQ/KSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbSgpO1xyXG5cclxuICAgICAgICBpdGVtW3RoaXMuZ2V0WFByb3BlcnR5KGJyZWFrcG9pbnQpXSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRWYWx1ZVkodmFsdWU6IG51bWJlciwgYnJlYWtwb2ludD8pIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKCk7XHJcblxyXG4gICAgICAgIGl0ZW1bdGhpcy5nZXRZUHJvcGVydHkoYnJlYWtwb2ludCldID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldFZhbHVlVyh2YWx1ZTogbnVtYmVyLCBicmVha3BvaW50Pykge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0oKTtcclxuXHJcbiAgICAgICAgaXRlbVt0aGlzLmdldFdQcm9wZXJ0eShicmVha3BvaW50KV0gPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0VmFsdWVIKHZhbHVlOiBudW1iZXIsIGJyZWFrcG9pbnQ/KSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbSgpO1xyXG5cclxuICAgICAgICBpdGVtW3RoaXMuZ2V0SFByb3BlcnR5KGJyZWFrcG9pbnQpXSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB0cmlnZ2VyQ2hhbmdlWChicmVha3BvaW50Pykge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1Db21wb25lbnQ7XHJcbiAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgaXRlbVt0aGlzLmdldFhQcm9wZXJ0eShicmVha3BvaW50KSArICdDaGFuZ2UnXS5lbWl0KHRoaXMuZ2V0VmFsdWVYKGJyZWFrcG9pbnQpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHRyaWdnZXJDaGFuZ2VZKGJyZWFrcG9pbnQ/KSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbUNvbXBvbmVudDtcclxuICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICBpdGVtW3RoaXMuZ2V0WVByb3BlcnR5KGJyZWFrcG9pbnQpICsgJ0NoYW5nZSddLmVtaXQodGhpcy5nZXRWYWx1ZVkoYnJlYWtwb2ludCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdHJpZ2dlckNoYW5nZVcoYnJlYWtwb2ludD8pIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtQ29tcG9uZW50O1xyXG4gICAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgICAgIGl0ZW1bdGhpcy5nZXRXUHJvcGVydHkoYnJlYWtwb2ludCkgKyAnQ2hhbmdlJ10uZW1pdCh0aGlzLmdldFZhbHVlVyhicmVha3BvaW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB0cmlnZ2VyQ2hhbmdlSChicmVha3BvaW50Pykge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1Db21wb25lbnQ7XHJcbiAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgaXRlbVt0aGlzLmdldEhQcm9wZXJ0eShicmVha3BvaW50KSArICdDaGFuZ2UnXS5lbWl0KHRoaXMuZ2V0VmFsdWVIKGJyZWFrcG9pbnQpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhc1Bvc2l0aW9ucyhicmVha3BvaW50Pykge1xyXG4gICAgICAgIGNvbnN0IHggPSB0aGlzLmdldFZhbHVlWChicmVha3BvaW50KTtcclxuICAgICAgICBjb25zdCB5ID0gdGhpcy5nZXRWYWx1ZVkoYnJlYWtwb2ludCk7XHJcblxyXG4gICAgICAgIHJldHVybiAoeCB8fCB4ID09PSAwKSAmJiAoeSB8fCB5ID09PSAwKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXBwbHlQb3NpdGlvbihncmlkc3Rlcj86IEdyaWRzdGVyU2VydmljZSkge1xyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5jYWxjdWxhdGVQb3NpdGlvbihncmlkc3Rlcik7XHJcblxyXG4gICAgICAgIHRoaXMuaXRlbUNvbXBvbmVudC5wb3NpdGlvblggPSBwb3NpdGlvbi5sZWZ0O1xyXG4gICAgICAgIHRoaXMuaXRlbUNvbXBvbmVudC5wb3NpdGlvblkgPSBwb3NpdGlvbi50b3A7XHJcbiAgICAgICAgdGhpcy5pdGVtQ29tcG9uZW50LnVwZGF0ZUVsZW1lbmV0UG9zaXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2FsY3VsYXRlUG9zaXRpb24oZ3JpZHN0ZXI/OiBHcmlkc3RlclNlcnZpY2UpOiB7bGVmdDogbnVtYmVyLCB0b3A6IG51bWJlcn0ge1xyXG4gICAgICAgIGlmICghZ3JpZHN0ZXIgJiYgIXRoaXMuaXRlbUNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4ge2xlZnQ6IDAsIHRvcDogMH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGdyaWRzdGVyID0gZ3JpZHN0ZXIgfHwgdGhpcy5pdGVtQ29tcG9uZW50LmdyaWRzdGVyO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBsZWZ0OiB0aGlzLnggKiBncmlkc3Rlci5jZWxsV2lkdGgsXHJcbiAgICAgICAgICAgIHRvcDogdGhpcy55ICogZ3JpZHN0ZXIuY2VsbEhlaWdodFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFwcGx5U2l6ZShncmlkc3Rlcj86IEdyaWRzdGVyU2VydmljZSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLmNhbGN1bGF0ZVNpemUoZ3JpZHN0ZXIpO1xyXG5cclxuICAgICAgICB0aGlzLiRlbGVtZW50LnN0eWxlLndpZHRoID0gc2l6ZS53aWR0aCArICdweCc7XHJcbiAgICAgICAgdGhpcy4kZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBzaXplLmhlaWdodCArICdweCc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNhbGN1bGF0ZVNpemUoZ3JpZHN0ZXI/OiBHcmlkc3RlclNlcnZpY2UpOiB7d2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXJ9IHtcclxuICAgICAgICBpZiAoIWdyaWRzdGVyICYmICF0aGlzLml0ZW1Db21wb25lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHt3aWR0aDogMCwgaGVpZ2h0OiAwfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZ3JpZHN0ZXIgPSBncmlkc3RlciB8fCB0aGlzLml0ZW1Db21wb25lbnQuZ3JpZHN0ZXI7XHJcblxyXG4gICAgICAgIGxldCB3aWR0aCA9IHRoaXMuZ2V0VmFsdWVXKGdyaWRzdGVyLm9wdGlvbnMuYnJlYWtwb2ludCk7XHJcbiAgICAgICAgbGV0IGhlaWdodCA9IHRoaXMuZ2V0VmFsdWVIKGdyaWRzdGVyLm9wdGlvbnMuYnJlYWtwb2ludCk7XHJcblxyXG4gICAgICAgIGlmIChncmlkc3Rlci5vcHRpb25zLmRpcmVjdGlvbiA9PT0gJ3ZlcnRpY2FsJykge1xyXG4gICAgICAgICAgICB3aWR0aCA9IE1hdGgubWluKHdpZHRoLCBncmlkc3Rlci5vcHRpb25zLmxhbmVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGdyaWRzdGVyLm9wdGlvbnMuZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcpIHtcclxuICAgICAgICAgICAgaGVpZ2h0ID0gTWF0aC5taW4oaGVpZ2h0LCBncmlkc3Rlci5vcHRpb25zLmxhbmVzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHdpZHRoOiB3aWR0aCAqIGdyaWRzdGVyLmNlbGxXaWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQgKiBncmlkc3Rlci5jZWxsSGVpZ2h0XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFhQcm9wZXJ0eShicmVha3BvaW50Pzogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIGlmIChicmVha3BvaW50ICYmIHRoaXMuaXRlbUNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gR3JpZExpc3RJdGVtLlhfUFJPUEVSVFlfTUFQW2JyZWFrcG9pbnRdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAneCc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0WVByb3BlcnR5KGJyZWFrcG9pbnQ/OiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgaWYgKGJyZWFrcG9pbnQgJiYgdGhpcy5pdGVtQ29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBHcmlkTGlzdEl0ZW0uWV9QUk9QRVJUWV9NQVBbYnJlYWtwb2ludF07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuICd5JztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRXUHJvcGVydHkoYnJlYWtwb2ludD86IHN0cmluZykge1xyXG4gICAgICAgIGlmICh0aGlzLml0ZW1Qcm90b3R5cGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXRlbVByb3RvdHlwZVtHcmlkTGlzdEl0ZW0uV19QUk9QRVJUWV9NQVBbYnJlYWtwb2ludF1dID9cclxuICAgICAgICAgICAgICAgIEdyaWRMaXN0SXRlbS5XX1BST1BFUlRZX01BUFticmVha3BvaW50XSA6ICd3JztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0oKTtcclxuICAgICAgICBjb25zdCByZXNwb25zaXZlU2l6ZXMgPSBpdGVtLmdyaWRzdGVyICYmIGl0ZW0uZ3JpZHN0ZXIub3B0aW9ucy5yZXNwb25zaXZlU2l6ZXM7XHJcblxyXG4gICAgICAgIGlmIChicmVha3BvaW50ICYmIHJlc3BvbnNpdmVTaXplcykge1xyXG4gICAgICAgICAgICByZXR1cm4gR3JpZExpc3RJdGVtLldfUFJPUEVSVFlfTUFQW2JyZWFrcG9pbnRdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAndyc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0SFByb3BlcnR5KGJyZWFrcG9pbnQ/OiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodGhpcy5pdGVtUHJvdG90eXBlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLml0ZW1Qcm90b3R5cGVbR3JpZExpc3RJdGVtLkhfUFJPUEVSVFlfTUFQW2JyZWFrcG9pbnRdXSA/XHJcbiAgICAgICAgICAgICAgICBHcmlkTGlzdEl0ZW0uSF9QUk9QRVJUWV9NQVBbYnJlYWtwb2ludF0gOiAnaCc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKCk7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2l2ZVNpemVzID0gaXRlbS5ncmlkc3RlciAmJiBpdGVtLmdyaWRzdGVyLm9wdGlvbnMucmVzcG9uc2l2ZVNpemVzO1xyXG5cclxuICAgICAgICBpZiAoYnJlYWtwb2ludCAmJiByZXNwb25zaXZlU2l6ZXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIEdyaWRMaXN0SXRlbS5IX1BST1BFUlRZX01BUFticmVha3BvaW50XTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gJ2gnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEl0ZW0oKTogYW55IHtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtQ29tcG9uZW50IHx8IHRoaXMuaXRlbVByb3RvdHlwZSB8fCB0aGlzLml0ZW1PYmplY3Q7XHJcblxyXG4gICAgICAgIGlmICghaXRlbSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dyaWRMaXN0SXRlbSBpcyBub3Qgc2V0LicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzSXRlbVNldCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pdGVtQ29tcG9uZW50IHx8IHRoaXMuaXRlbVByb3RvdHlwZSB8fCB0aGlzLml0ZW1PYmplY3Q7XHJcbiAgICB9XHJcbn1cclxuIl19