UNPKG

@blare/angular2gridster

Version:

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

665 lines 71.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ import { Injectable } from '@angular/core'; import { Subject } from 'rxjs'; import { debounceTime } from 'rxjs/operators'; import { GridList } from './gridList/gridList'; export class GridsterService { constructor() { this.items = []; this._items = []; this._itemsMap = {}; this.disabledItems = []; this.debounceRenderSubject = new Subject(); this.itemRemoveSubject = new Subject(); this.isInit = false; this.itemRemoveSubject.pipe(debounceTime(0)).subscribe(() => { this.gridList.pullItemsToLeft(); this.render(); this.updateCachedItems(); }); this.debounceRenderSubject.pipe(debounceTime(0)).subscribe(() => this.render()); } /** * @return {?} */ isInitialized() { return this.isInit; } /** * Must be called before init * @param {?} item * @return {?} */ registerItem(item) { this.items.push(item); return item; } /** * @param {?} gridsterComponent * @return {?} */ init(gridsterComponent) { this.gridsterComponent = gridsterComponent; this.draggableOptions = gridsterComponent.draggableOptions; this.gridsterOptions = gridsterComponent.gridsterOptions; } /** * @return {?} */ start() { this.updateMaxItemSize(); // Used to highlight a position an element will land on upon drop if (this.$positionHighlight) { this.removePositionHighlight(); } this.initGridList(); this.isInit = true; setTimeout(() => { this.copyItems(); this.fixItemsPositions(); this.gridsterComponent.reflowGridster(true); this.gridsterComponent.setReady(); }); } /** * @return {?} */ initGridList() { // Create instance of GridList (decoupled lib for handling the grid // positioning and sorting post-drag and dropping) this.gridList = new GridList(this.items, this.options); } /** * @return {?} */ render() { this.updateMaxItemSize(); this.gridList.generateGrid(); this.applySizeToItems(); this.applyPositionToItems(); this.refreshLines(); } /** * @return {?} */ reflow() { this.calculateCellSize(); this.render(); } /** * @return {?} */ fixItemsPositions() { if (this.options.responsiveSizes) { this.gridList.fixItemsPositions(this.options); } else { this.gridList.fixItemsPositions(this.gridsterOptions.basicOptions); this.gridsterOptions.responsiveOptions.forEach((options) => { this.gridList.fixItemsPositions(options); }); } this.updateCachedItems(); } /** * @param {?} item * @return {?} */ removeItem(item) { /** @type {?} */ const idx = this.items.indexOf(item); if (idx >= 0) { this.items.splice(this.items.indexOf(item), 1); } this.gridList.deleteItemPositionFromGrid(item); this.removeItemFromCache(item); } /** * @param {?} item * @return {?} */ onResizeStart(item) { this.currentElement = item.$element; this.copyItems(); this._maxGridCols = this.gridList.grid.length; this.highlightPositionForItem(item); this.gridsterComponent.isResizing = true; this.refreshLines(); } /** * @param {?} item * @return {?} */ onResizeDrag(item) { /** @type {?} */ const newSize = this.snapItemSizeToGrid(item); /** @type {?} */ const sizeChanged = this.dragSizeChanged(newSize); /** @type {?} */ const newPosition = this.snapItemPositionToGrid(item); /** @type {?} */ const positionChanged = this.dragPositionChanged(newPosition); if (sizeChanged || positionChanged) { // Regenerate the grid with the positions from when the drag started this.restoreCachedItems(); this.gridList.generateGrid(); this.previousDragPosition = newPosition; this.previousDragSize = newSize; this.gridList.moveAndResize(item, newPosition, { w: newSize[0], h: newSize[1] }); // Visually update item positions and highlight shape this.applyPositionToItems(true); this.highlightPositionForItem(item); } } /** * @param {?} item * @return {?} */ onResizeStop(item) { this.currentElement = undefined; this.updateCachedItems(); this.previousDragSize = null; this.removePositionHighlight(); this.gridsterComponent.isResizing = false; this.gridList.pullItemsToLeft(item); this.debounceRenderSubject.next(); this.fixItemsPositions(); } /** * @param {?} item * @return {?} */ onStart(item) { this.currentElement = item.$element; // itemCtrl.isDragging = true; // Create a deep copy of the items; we use them to revert the item // positions after each drag change, making an entire drag operation less // distructable this.copyItems(); // Since dragging actually alters the grid, we need to establish the number // of cols (+1 extra) before the drag starts this._maxGridCols = this.gridList.grid.length; this.gridsterComponent.isDragging = true; this.gridsterComponent.updateGridsterElementData(); this.refreshLines(); } /** * @param {?} item * @return {?} */ onDrag(item) { /** @type {?} */ const newPosition = this.snapItemPositionToGrid(item); if (this.dragPositionChanged(newPosition)) { // Regenerate the grid with the positions from when the drag started this.restoreCachedItems(); this.gridList.generateGrid(); this.previousDragPosition = newPosition; if (this.options.direction === 'none' && !this.gridList.checkItemAboveEmptyArea(item, { x: newPosition[0], y: newPosition[1] })) { return; } // Since the items list is a deep copy, we need to fetch the item // corresponding to this drag action again this.gridList.moveItemToPosition(item, newPosition); // Visually update item positions and highlight shape this.applyPositionToItems(true); this.highlightPositionForItem(item); } } /** * @return {?} */ cancel() { this.restoreCachedItems(); this.previousDragPosition = null; this.updateMaxItemSize(); this.applyPositionToItems(); this.removePositionHighlight(); this.currentElement = undefined; this.gridsterComponent.isDragging = false; } /** * @param {?} item * @return {?} */ onDragOut(item) { this.cancel(); /** @type {?} */ const idx = this.items.indexOf(item); if (idx >= 0) { this.items.splice(idx, 1); } this.gridList.pullItemsToLeft(); this.render(); } /** * @param {?} item * @return {?} */ onStop(item) { this.currentElement = undefined; this.updateCachedItems(); this.previousDragPosition = null; this.removePositionHighlight(); this.gridList.pullItemsToLeft(item); this.gridsterComponent.isDragging = false; this.refreshLines(); } /** * @return {?} */ calculateCellSize() { if (this.options.direction === 'horizontal') { this.cellHeight = this.calculateCellHeight(); this.cellWidth = this.options.cellWidth || this.cellHeight * this.options.widthHeightRatio; } else { this.cellWidth = this.calculateCellWidth(); this.cellHeight = this.options.cellHeight || this.cellWidth / this.options.widthHeightRatio; } if (this.options.heightToFontSizeRatio) { this._fontSize = this.cellHeight * this.options.heightToFontSizeRatio; } } /** * @param {?=} increaseGridsterSize * @return {?} */ applyPositionToItems(increaseGridsterSize) { if (!this.options.shrink) { increaseGridsterSize = true; } // TODO: Implement group separators for (let i = 0; i < this.items.length; i++) { // Don't interfere with the positions of the dragged items if (this.isCurrentElement(this.items[i].$element)) { continue; } this.items[i].applyPosition(this); } /** @type {?} */ const child = (/** @type {?} */ (this.gridsterComponent.$element.firstChild)); // Update the width of the entire grid container with enough room on the // right to allow dragging items to the end of the grid. if (this.options.direction === 'horizontal') { /** @type {?} */ const increaseWidthWith = (increaseGridsterSize) ? this.maxItemWidth : 0; child.style.height = ''; child.style.width = ((this.gridList.grid.length + increaseWidthWith) * this.cellWidth) + 'px'; } else if (this.gridList.grid.length) { /** @type {?} */ const increaseHeightWith = (increaseGridsterSize) ? this.maxItemHeight : 0; child.style.height = ((this.gridList.grid.length + increaseHeightWith) * this.cellHeight) + 'px'; child.style.width = ''; } } /** * @return {?} */ refreshLines() { /** @type {?} */ const gridsterContainer = (/** @type {?} */ (this.gridsterComponent.$element.firstChild)); if (this.options.lines && this.options.lines.visible && (this.gridsterComponent.isDragging || this.gridsterComponent.isResizing || this.options.lines.always)) { /** @type {?} */ const linesColor = this.options.lines.color || '#d8d8d8'; /** @type {?} */ const linesBgColor = this.options.lines.backgroundColor || 'transparent'; /** @type {?} */ const linesWidth = this.options.lines.width || 1; /** @type {?} */ const bgPosition = linesWidth / 2; gridsterContainer.style.backgroundSize = `${this.cellWidth}px ${this.cellHeight}px`; gridsterContainer.style.backgroundPosition = `-${bgPosition}px -${bgPosition}px`; gridsterContainer.style.backgroundImage = ` linear-gradient(to right, ${linesColor} ${linesWidth}px, ${linesBgColor} ${linesWidth}px), linear-gradient(to bottom, ${linesColor} ${linesWidth}px, ${linesBgColor} ${linesWidth}px) `; } else { gridsterContainer.style.backgroundSize = ''; gridsterContainer.style.backgroundPosition = ''; gridsterContainer.style.backgroundImage = ''; } } /** * @param {?} item * @return {?} */ removeItemFromCache(item) { this._items = this._items .filter(cachedItem => cachedItem.$element !== item.$element); Object.keys(this._itemsMap) .forEach((breakpoint) => { this._itemsMap[breakpoint] = this._itemsMap[breakpoint] .filter(cachedItem => cachedItem.$element !== item.$element); }); } /** * @return {?} */ copyItems() { this._items = this.items .filter(item => this.isValidGridItem(item)) .map((item) => { return item.copyForBreakpoint(null); }); this.gridsterOptions.responsiveOptions.forEach((options) => { this._itemsMap[options.breakpoint] = this.items .filter(item => this.isValidGridItem(item)) .map((item) => { return item.copyForBreakpoint(options.breakpoint); }); }); } /** * Update maxItemWidth and maxItemHeight vales according to current state of items * @return {?} */ updateMaxItemSize() { this.maxItemWidth = Math.max.apply(null, this.items.map((item) => { return item.w; })); this.maxItemHeight = Math.max.apply(null, this.items.map((item) => { return item.h; })); } /** * Update items properties of previously cached items * @return {?} */ restoreCachedItems() { /** @type {?} */ const items = this.options.breakpoint ? this._itemsMap[this.options.breakpoint] : this._items; this.items .filter(item => this.isValidGridItem(item)) .forEach((item) => { /** @type {?} */ const cachedItem = items.filter(cachedItm => { return cachedItm.$element === item.$element; })[0]; item.x = cachedItem.x; item.y = cachedItem.y; item.w = cachedItem.w; item.h = cachedItem.h; item.autoSize = cachedItem.autoSize; }); } /** * If item should react on grid * @param {?} item * @return {?} boolean */ isValidGridItem(item) { if (this.options.direction === 'none') { return !!item.itemComponent; } return true; } /** * @return {?} */ calculateCellWidth() { /** @type {?} */ const gridsterWidth = parseFloat(window.getComputedStyle(this.gridsterComponent.$element).width); return Math.floor(gridsterWidth / this.options.lanes); } /** * @return {?} */ calculateCellHeight() { /** @type {?} */ const gridsterHeight = parseFloat(window.getComputedStyle(this.gridsterComponent.$element).height); return Math.floor(gridsterHeight / this.options.lanes); } /** * @return {?} */ applySizeToItems() { for (let i = 0; i < this.items.length; i++) { this.items[i].applySize(); if (this.options.heightToFontSizeRatio) { this.items[i].$element.style['font-size'] = this._fontSize; } } } /** * @param {?} element * @return {?} */ isCurrentElement(element) { if (!this.currentElement) { return false; } return element === this.currentElement; } /** * @param {?} item * @return {?} */ snapItemSizeToGrid(item) { /** @type {?} */ const itemSize = { width: parseInt(item.$element.style.width, 10) - 1, height: parseInt(item.$element.style.height, 10) - 1 }; /** @type {?} */ let colSize = Math.round(itemSize.width / this.cellWidth); /** @type {?} */ let rowSize = Math.round(itemSize.height / this.cellHeight); // Keep item minimum 1 colSize = Math.max(colSize, 1); rowSize = Math.max(rowSize, 1); // check if element is pinned if (this.gridList.isOverFixedArea(item.x, item.y, colSize, rowSize, item)) { return [item.w, item.h]; } return [colSize, rowSize]; } /** * @param {?} item * @return {?} */ generateItemPosition(item) { /** @type {?} */ let position; if (item.itemPrototype) { /** @type {?} */ const coords = item.itemPrototype.getPositionToGridster(this); position = { x: Math.round(coords.x / this.cellWidth), y: Math.round(coords.y / this.cellHeight) }; } else { position = { x: Math.round(item.positionX / this.cellWidth), y: Math.round(item.positionY / this.cellHeight) }; } return position; } /** * @param {?} item * @return {?} */ snapItemPositionToGrid(item) { /** @type {?} */ const position = this.generateItemPosition(item); /** @type {?} */ let col = position.x; /** @type {?} */ let row = position.y; // Keep item position within the grid and don't let the item create more // than one extra column col = Math.max(col, 0); row = Math.max(row, 0); if (this.options.direction === 'horizontal') { col = Math.min(col, this._maxGridCols); } else { col = Math.min(col, Math.max(0, this.options.lanes - item.w)); } // check if element is pinned if (this.gridList.isOverFixedArea(col, row, item.w, item.h)) { return [item.x, item.y]; } return [col, row]; } /** * @param {?} newSize * @return {?} */ dragSizeChanged(newSize) { if (!this.previousDragSize) { return true; } return (newSize[0] !== this.previousDragSize[0] || newSize[1] !== this.previousDragSize[1]); } /** * @param {?} newPosition * @return {?} */ dragPositionChanged(newPosition) { if (!this.previousDragPosition) { return true; } return (newPosition[0] !== this.previousDragPosition[0] || newPosition[1] !== this.previousDragPosition[1]); } /** * @param {?} item * @return {?} */ highlightPositionForItem(item) { /** @type {?} */ const size = item.calculateSize(this); /** @type {?} */ const position = item.calculatePosition(this); this.$positionHighlight.style.width = size.width + 'px'; this.$positionHighlight.style.height = size.height + 'px'; this.$positionHighlight.style.left = position.left + 'px'; this.$positionHighlight.style.top = position.top + 'px'; this.$positionHighlight.style.display = ''; if (this.options.heightToFontSizeRatio) { this.$positionHighlight.style['font-size'] = this._fontSize; } } /** * @return {?} */ updateCachedItems() { // Notify the user with the items that changed since the previous snapshot this.triggerOnChange(null); this.gridsterOptions.responsiveOptions.forEach((options) => { this.triggerOnChange(options.breakpoint); }); this.copyItems(); } /** * @param {?=} breakpoint * @return {?} */ triggerOnChange(breakpoint) { /** @type {?} */ const items = breakpoint ? this._itemsMap[breakpoint] : this._items; /** @type {?} */ const changeItems = this.gridList.getChangedItems(items || [], breakpoint); changeItems .filter((itemChange) => { return itemChange.item.itemComponent; }) .forEach((itemChange) => { if (itemChange.changes.indexOf('x') >= 0) { itemChange.item.triggerChangeX(breakpoint); } if (itemChange.changes.indexOf('y') >= 0) { itemChange.item.triggerChangeY(breakpoint); } if (itemChange.changes.indexOf('w') >= 0) { itemChange.item.triggerChangeW(breakpoint); } if (itemChange.changes.indexOf('h') >= 0) { itemChange.item.triggerChangeH(breakpoint); } // should be called only once (not for each breakpoint) itemChange.item.itemComponent.change.emit({ item: itemChange.item, oldValues: itemChange.oldValues || {}, isNew: itemChange.isNew, changes: itemChange.changes, breakpoint: breakpoint }); }); } /** * @return {?} */ removePositionHighlight() { this.$positionHighlight.style.display = 'none'; } } GridsterService.decorators = [ { type: Injectable } ]; /** @nocollapse */ GridsterService.ctorParameters = () => []; if (false) { /** @type {?} */ GridsterService.prototype.$element; /** @type {?} */ GridsterService.prototype.gridList; /** @type {?} */ GridsterService.prototype.items; /** @type {?} */ GridsterService.prototype._items; /** @type {?} */ GridsterService.prototype._itemsMap; /** @type {?} */ GridsterService.prototype.disabledItems; /** @type {?} */ GridsterService.prototype.options; /** @type {?} */ GridsterService.prototype.draggableOptions; /** @type {?} */ GridsterService.prototype.gridsterRect; /** @type {?} */ GridsterService.prototype.gridsterScrollData; /** @type {?} */ GridsterService.prototype.gridsterOptions; /** @type {?} */ GridsterService.prototype.gridsterComponent; /** @type {?} */ GridsterService.prototype.debounceRenderSubject; /** @type {?} */ GridsterService.prototype.$positionHighlight; /** @type {?} */ GridsterService.prototype.maxItemWidth; /** @type {?} */ GridsterService.prototype.maxItemHeight; /** @type {?} */ GridsterService.prototype.cellWidth; /** @type {?} */ GridsterService.prototype.cellHeight; /** @type {?} */ GridsterService.prototype.itemRemoveSubject; /** @type {?} */ GridsterService.prototype._fontSize; /** @type {?} */ GridsterService.prototype.previousDragPosition; /** @type {?} */ GridsterService.prototype.previousDragSize; /** @type {?} */ GridsterService.prototype.currentElement; /** @type {?} */ GridsterService.prototype._maxGridCols; /** @type {?} */ GridsterService.prototype.isInit; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BibGFyZS9hbmd1bGFyMmdyaWRzdGVyLyIsInNvdXJjZXMiOlsibGliL2dyaWRzdGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBUS9DLE1BQU0sT0FBTyxlQUFlO0lBMkN4QjtRQXRDQSxVQUFLLEdBQXdCLEVBQUUsQ0FBQztRQUNoQyxXQUFNLEdBQXdCLEVBQUUsQ0FBQztRQUNqQyxjQUFTLEdBQWtELEVBQUUsQ0FBQztRQUM5RCxrQkFBYSxHQUF3QixFQUFFLENBQUM7UUFZeEMsMEJBQXFCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQVUvQixzQkFBaUIsR0FBMEIsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQVd4RCxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBR25CLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUN4RCxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDcEYsQ0FBQzs7OztJQUVELGFBQWE7UUFDVCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDdkIsQ0FBQzs7Ozs7O0lBTUQsWUFBWSxDQUFDLElBQWtCO1FBRTNCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Ozs7O0lBRUQsSUFBSSxDQUFDLGlCQUFvQztRQUVyQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUM7UUFFM0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDO1FBRTNELElBQUksQ0FBQyxlQUFlLEdBQUcsaUJBQWlCLENBQUMsZUFBZSxDQUFDO0lBQzdELENBQUM7Ozs7SUFFRCxLQUFLO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFekIsaUVBQWlFO1FBQ2pFLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQ3pCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1NBQ2xDO1FBRUQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXBCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBRW5CLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFFekIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOzs7O0lBRUQsWUFBWTtRQUNSLG1FQUFtRTtRQUNuRSxrREFBa0Q7UUFDbEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzRCxDQUFDOzs7O0lBRUQsTUFBTTtRQUNGLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3hCLENBQUM7Ozs7SUFFRCxNQUFNO1FBQ0YsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2xCLENBQUM7Ozs7SUFFRCxpQkFBaUI7UUFDYixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFO1lBQzlCLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2pEO2FBQU07WUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDbkUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUF5QixFQUFFLEVBQUU7Z0JBQ3pFLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDN0MsQ0FBQyxDQUFDLENBQUM7U0FDTjtRQUVELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7Ozs7O0lBRUQsVUFBVSxDQUFDLElBQWtCOztjQUNuQixHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBRXBDLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRTtZQUNWLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ2xEO1FBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQzs7Ozs7SUFFRCxhQUFhLENBQUMsSUFBa0I7UUFDNUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBRXBDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUVqQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUU5QyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFcEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFFekMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3hCLENBQUM7Ozs7O0lBRUQsWUFBWSxDQUFDLElBQWtCOztjQUNyQixPQUFPLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQzs7Y0FDdkMsV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDOztjQUMzQyxXQUFXLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQzs7Y0FDL0MsZUFBZSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUM7UUFFN0QsSUFBSSxXQUFXLElBQUksZUFBZSxFQUFFO1lBQ2hDLG9FQUFvRTtZQUNwRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRTdCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxXQUFXLENBQUM7WUFDeEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE9BQU8sQ0FBQztZQUVoQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLEVBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQztZQUUvRSxxREFBcUQ7WUFDckQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN2QztJQUNMLENBQUM7Ozs7O0lBRUQsWUFBWSxDQUFDLElBQWtCO1FBQzNCLElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFFN0IsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFFL0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFFMUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRSxDQUFDO1FBRWxDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7Ozs7O0lBRUQsT0FBTyxDQUFDLElBQWtCO1FBQ3RCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNwQyw4QkFBOEI7UUFDOUIsa0VBQWtFO1FBQ2xFLHlFQUF5RTtRQUN6RSxlQUFlO1FBQ2YsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRWpCLDJFQUEyRTtRQUMzRSw0Q0FBNEM7UUFFNUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFFOUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDekMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFFbkQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3hCLENBQUM7Ozs7O0lBRUQsTUFBTSxDQUFDLElBQWtCOztjQUNmLFdBQVcsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDO1FBRXJELElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBRXZDLG9FQUFvRTtZQUNwRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRTdCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxXQUFXLENBQUM7WUFDeEMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsS0FBSyxNQUFNO2dCQUNqQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLEVBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBRTtnQkFDdEYsT0FBTzthQUNWO1lBRUQsaUVBQWlFO1lBQ2pFLDBDQUEwQztZQUMxQyxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztZQUVwRCxxREFBcUQ7WUFDckQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN2QztJQUNMLENBQUM7Ozs7SUFFRCxNQUFNO1FBQ0YsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUNqQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQztRQUNoQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUM5QyxDQUFDOzs7OztJQUVELFNBQVMsQ0FBRSxJQUFrQjtRQUV6QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7O2NBRVIsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUNwQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUU7WUFDVixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDN0I7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNsQixDQUFDOzs7OztJQUVELE1BQU0sQ0FBQyxJQUFrQjtRQUNyQixJQUFJLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQztRQUNoQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1FBRWpDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBRS9CLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXBDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBRTFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN4QixDQUFDOzs7O0lBRUQsaUJBQWlCO1FBQ2IsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsS0FBSyxZQUFZLEVBQUU7WUFDekMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUM3QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztTQUM5RjthQUFNO1lBQ0gsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztTQUMvRjtRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRTtZQUNwQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQztTQUN6RTtJQUNMLENBQUM7Ozs7O0lBRUQsb0JBQW9CLENBQUMsb0JBQXFCO1FBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUN0QixvQkFBb0IsR0FBRyxJQUFJLENBQUM7U0FDL0I7UUFDRCxtQ0FBbUM7UUFDbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3hDLDBEQUEwRDtZQUMxRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUMvQyxTQUFTO2FBQ1o7WUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNyQzs7Y0FFSyxLQUFLLEdBQUcsbUJBQWEsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUE7UUFDckUsd0VBQXdFO1FBQ3hFLHdEQUF3RDtRQUN4RCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxLQUFLLFlBQVksRUFBRTs7a0JBQ25DLGlCQUFpQixHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4RSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDeEIsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUM7U0FFakc7YUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTs7a0JBQzVCLGtCQUFrQixHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxRSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLGtCQUFrQixDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUNqRyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7U0FDMUI7SUFDTCxDQUFDOzs7O0lBRUQsWUFBWTs7Y0FDRixpQkFBaUIsR0FBRyxtQkFBYSxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBQTtRQUVqRixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU87WUFDaEQsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7O2tCQUNqRyxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLFNBQVM7O2tCQUNsRCxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsZUFBZSxJQUFJLGFBQWE7O2tCQUNsRSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLENBQUM7O2tCQUMxQyxVQUFVLEdBQUcsVUFBVSxHQUFHLENBQUM7WUFFakMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLGNBQWMsR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLE1BQU0sSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDO1lBQ3BGLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLFVBQVUsT0FBTyxVQUFVLElBQUksQ0FBQztZQUNqRixpQkFBaUIsQ0FBQyxLQUFLLENBQUMsZUFBZSxHQUFHOzRDQUNWLFVBQVUsSUFBSSxVQUFVLE9BQU8sWUFBWSxJQUFJLFVBQVU7NkNBQ3hELFVBQVUsSUFBSSxVQUFVLE9BQU8sWUFBWSxJQUFJLFVBQVU7YUFDekYsQ0FBQztTQUNMO2FBQU07WUFDSCxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztZQUM1QyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDO1lBQ2hELGlCQUFpQixDQUFDLEtBQUssQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1NBQ2hEO0lBQ0wsQ0FBQzs7Ozs7SUFFTyxtQkFBbUIsQ0FBQyxJQUFrQjtRQUMxQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNO2FBQ3BCLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRWpFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQzthQUN0QixPQUFPLENBQUMsQ0FBQyxVQUFrQixFQUFFLEVBQUU7WUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQztpQkFDbEQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckUsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDOzs7O0lBRU8sU0FBUztRQUNiLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUs7YUFDbkIsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMxQyxHQUFHLENBQUMsQ0FBQyxJQUFrQixFQUFFLEVBQUU7WUFDeEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsQ0FBQyxDQUFDLENBQUM7UUFFUCxJQUFJLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQXlCLEVBQUUsRUFBRTtZQUN6RSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSztpQkFDMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDMUMsR0FBRyxDQUFDLENBQUMsSUFBa0IsRUFBRSxFQUFFO2dCQUN4QixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdEQsQ0FBQyxDQUFDLENBQUM7UUFDWCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7Ozs7O0lBS08saUJBQWlCO1FBQ3JCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQzlCLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQzFCLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1IsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FDL0IsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDMUIsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDOzs7OztJQUtPLGtCQUFrQjs7Y0FDaEIsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNO1FBRTdGLElBQUksQ0FBQyxLQUFLO2FBQ0wsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMxQyxPQUFPLENBQUMsQ0FBQyxJQUFrQixFQUFFLEVBQUU7O2tCQUN0QixVQUFVLEdBQWlCLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ3RELE9BQU8sU0FBUyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ2hELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVMLElBQUksQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFFdEIsSUFBSSxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUM7UUFDeEMsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDOzs7Ozs7SUFPTyxlQUFlLENBQUMsSUFBa0I7UUFDdEMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsS0FBSyxNQUFNLEVBQUU7WUFDbkMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztTQUMvQjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Ozs7SUFFTyxrQkFBa0I7O2NBQ2hCLGFBQWEsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFFaEcsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFELENBQUM7Ozs7SUFFTyxtQkFBbUI7O2NBQ2pCLGNBQWMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFFbEcsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNELENBQUM7Ozs7SUFFTyxnQkFBZ0I7UUFDcEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3hDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7WUFFMUIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFO2dCQUNwQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQzthQUM5RDtTQUNKO0lBQ0wsQ0FBQzs7Ozs7SUFFTyxnQkFBZ0IsQ0FBQyxPQUFPO1FBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3RCLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsT0FBTyxPQUFPLEtBQUssSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUMzQyxDQUFDOzs7OztJQUVPLGtCQUFrQixDQUFDLElBQWtCOztjQUNuQyxRQUFRLEdBQUc7WUFDYixLQUFLLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDO1lBQ2xELE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUM7U0FDdkQ7O1lBRUcsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDOztZQUNyRCxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFFM0Qsc0JBQXNCO1FBQ3RCLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvQixPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFL0IsNkJBQTZCO1FBQzdCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDdkUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzNCO1FBRUQsT0FBTyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM5QixDQUFDOzs7OztJQUVPLG9CQUFvQixDQUFDLElBQWtCOztZQUN2QyxRQUFRO1FBRVosSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFOztrQkFDZCxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUM7WUFDN0QsUUFBUSxHQUFHO2dCQUNQLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDeEMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO2FBQzVDLENBQUM7U0FDTDthQUFNO1lBQ0gsUUFBUSxHQUFHO2dCQUNQLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDOUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO2FBQ2xELENBQUM7U0FDTDtRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7Ozs7O0lBRU8sc0JBQXNCLENBQUMsSUFBa0I7O2NBQ3ZDLFFBQVEsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDOztZQUM1QyxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUM7O1lBQ2hCLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQztRQUVwQix3RUFBd0U7UUFDeEUsd0JBQXdCO1FBQ3hCLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2QixHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFdkIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsS0FBSyxZQUFZLEVBQUU7WUFDekMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUMxQzthQUFNO1lBQ0gsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2pFO1FBRUQsNkJBQTZCO1FBQzdCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUN6RCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDM0I7UUFFRCxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7Ozs7O0lBRU8sZUFBZSxDQUFDLE9BQU87UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN4QixPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBQzNDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDOzs7OztJQUVPLG1CQUFtQixDQUFDLFdBQVc7UUFDbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUM1QixPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO1lBQ25ELFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDOzs7OztJQUVPLHdCQUF3QixDQUFDLElBQUk7O2NBQzNCLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQzs7Y0FDL0IsUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7UUFFN0MsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDeEQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDMUQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDMUQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFDeEQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBRTNDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRTtZQUNwQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7U0FDL0Q7SUFDTCxDQUFDOzs7O0lBRU0saUJBQWlCO1FBQ3BCLDBFQUEwRTtRQUMxRSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBeUIsRUFBRSxFQUFFO1lBQ3pFLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3JCLENBQUM7Ozs7O0lBRU8sZUFBZSxDQUFDLFVBQVc7O2NBQ3pCLEtBQUssR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNOztjQUM3RCxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBRSxVQUFVLENBQUM7UUFFMUUsV0FBVzthQUNOLE1BQU0sQ0FBQyxDQUFDLFVBQWUsRUFBRSxFQUFFO1lBQ3hCLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDekMsQ0FBQyxDQUFDO2FBQ0QsT0FBTyxDQUFDLENBQUMsVUFBZSxFQUFFLEVBQUU7WUFFekIsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3RDLFVBQVUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQzlDO1lBQ0QsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3RDLFVBQVUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQzlDO1lBQ0QsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3RDLFVBQVUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQzlDO1lBQ0QsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3RDLFVBQVUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQzlDO1lBQ0QsdURBQXVEO1lBQ3ZELFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ3RDLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSTtnQkFDckIsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTLElBQUksRUFBRTtnQkFDckMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLO2dCQUN2QixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU87Z0JBQzNCLFVBQVUsRUFBRSxVQUFVO2FBQ3pCLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQzs7OztJQUVPLHVCQUF1QjtRQUMzQixJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7SUFDbkQsQ0FBQzs7O1lBcmtCSixVQUFVOzs7Ozs7SUFFUCxtQ0FBc0I7O0lBRXRCLG1DQUFtQjs7SUFFbkIsZ0NBQWdDOztJQUNoQyxpQ0FBaUM7O0lBQ2pDLG9DQUE4RDs7SUFDOUQsd0NBQXdDOztJQUV4QyxrQ0FBMEI7O0lBQzFCLDJDQUE0Qzs7SUFFNUMsdUNBQXlCOztJQUN6Qiw2Q0FBOEQ7O0lBRTlELDBDQUFpQzs7SUFFakMsNENBQXFDOztJQUVyQyxnREFBc0M7O0lBRXRDLDZDQUF1Qzs7SUFFdkMsdUNBQTRCOztJQUM1Qix3Q0FBNkI7O0lBRTdCLG9DQUF5Qjs7SUFDekIscUNBQTBCOztJQUUxQiw0Q0FBZ0U7O0lBRWhFLG9DQUEwQjs7SUFFMUIsK0NBQTRDOztJQUM1QywyQ0FBd0M7O0lBRXhDLHlDQUFvQzs7SUFFcEMsdUNBQTZCOztJQUU3QixpQ0FBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEdyaWRMaXN0IH0gZnJvbSAnLi9ncmlkTGlzdC9ncmlkTGlzdCc7XG5pbXBvcnQgeyBJR3JpZHN0ZXJPcHRpb25zIH0gZnJvbSAnLi9JR3JpZHN0ZXJPcHRpb25zJztcbmltcG9ydCB7IElHcmlkc3RlckRyYWdnYWJsZU9wdGlvbnMgfSBmcm9tICcuL0lHcmlkc3RlckRyYWdnYWJsZU9wdGlvbnMnO1xuaW1wb3J0IHsgR3JpZExpc3RJdGVtIH0gZnJvbSAnLi9ncmlkTGlzdC9HcmlkTGlzdEl0ZW0nO1xuaW1wb3J0IHsgR3JpZHN0ZXJDb21wb25lbnQgfSBmcm9tICcuL2dyaWRzdGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHcmlkc3Rlck9wdGlvbnMgfSBmcm9tICcuL0dyaWRzdGVyT3B0aW9ucyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBHcmlkc3RlclNlcnZpY2Uge1xuICAgICRlbGVtZW50OiBIVE1MRWxlbWVudDtcblxuICAgIGdyaWRMaXN0OiBHcmlkTGlzdDtcblxuICAgIGl0ZW1zOiBBcnJheTxHcmlkTGlzdEl0ZW0+ID0gW107XG4gICAgX2l0ZW1zOiBBcnJheTxHcmlkTGlzdEl0ZW0+ID0gW107XG4gICAgX2l0ZW1zTWFwOiB7IFticmVha3BvaW50OiBzdHJpbmddOiBBcnJheTxHcmlkTGlzdEl0ZW0+IH0gPSB7fTtcbiAgICBkaXNhYmxlZEl0ZW1zOiBBcnJheTxHcmlkTGlzdEl0ZW0+ID0gW107XG5cbiAgICBvcHRpb25zOiBJR3JpZHN0ZXJPcHRpb25zO1xuICAgIGRyYWdnYWJsZU9wdGlvbnM6IElHcmlkc3RlckRyYWdnYWJsZU9wdGlvbnM7XG5cbiAgICBncmlkc3RlclJlY3Q6IENsaWVudFJlY3Q7XG4gICAgZ3JpZHN0ZXJTY3JvbGxEYXRhOiB7IHNjcm9sbFRvcDogbnVtYmVyLCBzY3JvbGxMZWZ0OiBudW1iZXIgfTtcblxuICAgIGdyaWRzdGVyT3B0aW9uczogR3JpZHN0ZXJPcHRpb25zO1xuXG4gICAgZ3JpZHN0ZXJDb21wb25lbnQ6IEdyaWRzdGVyQ29tcG9uZW50O1xuXG4gICAgZGVib3VuY2VSZW5kZXJTdWJqZWN0ID0gbmV3IFN1YmplY3QoKTtcblxuICAgIHB1YmxpYyAkcG9zaXRpb25IaWdobGlnaHQ6IEhUTUxFbGVtZW50O1xuXG4gICAgcHVibGljIG1heEl0ZW1XaWR0aDogbnVtYmVyO1xuICAgIHB1YmxpYyBtYXhJdGVtSGVpZ2h0OiBudW1iZXI7XG5cbiAgICBwdWJsaWMgY2VsbFdpZHRoOiBudW1iZXI7XG4gICAgcHVibGljIGNlbGxIZWlnaHQ6IG51bWJlcjtcblxuICAgIHB1YmxpYyBpdGVtUmVtb3ZlU3ViamVjdDogU3ViamVjdDxHcmlkTGlzdEl0ZW0+ID0gbmV3IFN1YmplY3QoKTtcblxuICAgIHByaXZhdGUgX2ZvbnRTaXplOiBudW1iZXI7XG5cbiAgICBwcml2YXRlIHByZXZpb3VzRHJhZ1Bvc2l0aW9uOiBBcnJheTxudW1iZXI+O1xuICAgIHByaXZhdGUgcHJldmlvdXNEcmFnU2l6ZTogQXJyYXk8bnVtYmVyPjtcblxuICAgIHByaXZhdGUgY3VycmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuXG4gICAgcHJpdmF0ZSBfbWF4R3JpZENvbHM6IG51bWJlcjtcblxuICAgIHByaXZhdGUgaXNJbml0ID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5pdGVtUmVtb3ZlU3ViamVjdC5waXBlKGRlYm91bmNlVGltZSgwKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZ3JpZExpc3QucHVsbEl0ZW1zVG9MZWZ0KCk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDYWNoZWRJdGVtcygpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmRlYm91bmNlUmVuZGVyU3ViamVjdC5waXBlKGRlYm91bmNlVGltZSgwKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMucmVuZGVyKCkpO1xuICAgIH1cblxuICAgIGlzSW5pdGlhbGl6ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzSW5pdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgaW5pdFxuICAgICAqIEBwYXJhbSBpdGVtXG4gICAgICovXG4gICAgcmVnaXN0ZXJJdGVtKGl0ZW06IEdyaWRMaXN0SXRlbSkge1xuXG4gICAgICAgIHRoaXMuaXRlbXMucHVzaChpdGVtKTtcbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfVxuXG4gICAgaW5pdChncmlkc3RlckNvbXBvbmVudDogR3JpZHN0ZXJDb21wb25lbnQpIHtcblxuICAgICAgICB0aGlzLmdyaWRzdGVyQ29tcG9uZW50ID0gZ3JpZHN0ZXJDb21wb25lbnQ7XG5cbiAgICAgICAgdGhpcy5kcmFnZ2FibGVPcHRpb25zID0gZ3JpZHN0ZXJDb21wb25lbnQuZHJhZ2dhYmxlT3B0aW9ucztcblxuICAgICAgICB0aGlzLmdyaWRzdGVyT3B0aW9ucyA9IGdyaWRzdGVyQ29tcG9uZW50LmdyaWRzdGVyT3B0aW9ucztcbiAgICB9XG5cbiAgICBzdGFydCgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVNYXhJdGVtU2l6ZSgpO1xuXG4gICAgICAgIC8vIFVzZWQgdG8gaGlnaGxpZ2h0IGEgcG9zaXRpb24gYW4gZWxlbWVudCB3aWxsIGxhbmQgb24gdXBvbiBkcm9wXG4gICAgICAgIGlmICh0aGlzLiRwb3NpdGlvbkhpZ2hsaWdodCkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVQb3NpdGlvbkhpZ2hsaWdodCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbml0R3JpZExpc3QoKTtcblxuICAgICAgICB0aGlzLmlzSW5pdCA9IHRydWU7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvcHlJdGVtcygpO1xuICAgICAgICAgICAgdGhpcy5maXhJdGVtc1Bvc2l0aW9ucygpO1xuXG4gICAgICAgICAgICB0aGlzLmdyaWRzdGVyQ29tcG9uZW50LnJlZmxvd0dyaWRzdGVyKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5ncmlkc3RlckNvbXBvbmVudC5zZXRSZWFkeSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpbml0R3JpZExpc3QoKSB7XG4gICAgICAgIC8vIENyZWF0ZSBpbnN0YW5jZSBvZiBHcmlkTGlzdCAoZGVjb3VwbGVkIGxpYiBmb3IgaGFuZGxpbmcgdGhlIGdyaWRcbiAgICAgICAgLy8gcG9zaXRpb25pbmcgYW5kIHNvcnRpbmcgcG9zdC1kcmFnIGFuZCBkcm9wcGluZylcbiAgICAgICAgdGhpcy5ncmlkTGlzdCA9IG5ldyBHcmlkTGlzdCh0aGlzLml0ZW1zLCB0aGlzLm9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgdGhpcy51cGRhdGVNYXhJdGVtU2l6ZSgpO1xuICAgICAgICB0aGlzLmdyaWRMaXN0LmdlbmVyYXRlR3JpZCgpO1xuICAgICAgICB0aGlzLmFwcGx5U2l6ZVRvSXRlbXMoKTtcbiAgICAgICAgdGhpcy5hcHBseVBvc2l0aW9uVG9JdGVtcygpO1xuICAgICAgICB0aGlzLnJlZnJlc2hMaW5lcygpO1xuICAgIH1cblxuICAgIHJlZmxvdygpIHtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVDZWxsU2l6ZSgpO1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgIH1cblxuICAgIGZpeEl0ZW1zUG9zaXRpb25zKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlc3BvbnNpdmVTaXplcykge1xuICAgICAgICAgICAgdGhpcy5ncmlkTGlzdC5maXhJdGVtc1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ncmlkTGlzdC5maXhJdGVtc1Bvc2l0aW9ucyh0aGlzLmdyaWRzdGVyT3B0aW9ucy5iYXNpY09wdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5ncmlkc3Rlck9wdGlvbnMucmVzcG9uc2l2ZU9wdGlvbnMuZm9yRWFjaCgob3B0aW9uczogSUdyaWRzdGVyT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZExpc3QuZml4SXRlbXNQb3NpdGlvbnMob3B0aW9ucyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlQ2FjaGVkSXRlbXMoKTtcbiAgICB9XG5cbiAgICByZW1vdmVJdGVtKGl0ZW06IEdyaWRMaXN0SXRlbSkge1xuICAgICAgICBjb25zdCBpZHggPSB0aGlzLml0ZW1zLmluZGV4T2YoaXRlbSk7XG5cbiAgICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW1zLnNwbGljZSh0aGlzLml0ZW1zLmluZGV4T2YoaXRlbSksIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ncmlkTGlzdC5kZWxldGVJdGVtUG9zaXRpb25Gcm9tR3JpZChpdGVtKTtcbiAgICAgICAgdGhpcy5yZW1vdmVJdGVtRnJvbUNhY2hlKGl0Z