UNPKG

@blare/angular2gridster

Version:

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

526 lines 41 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ export class GridListItem { /** * @return {?} */ get $element() { return this.getItem().$element; } /** * @return {?} */ get x() { /** @type {?} */ const item = this.getItem(); /** @type {?} */ const breakpoint = item.gridster ? item.gridster.options.breakpoint : null; return this.getValueX(breakpoint); } /** * @param {?} value * @return {?} */ set x(value) { /** @type {?} */ const item = this.getItem(); /** @type {?} */ const breakpoint = item.gridster ? item.gridster.options.breakpoint : null; this.setValueX(value, breakpoint); } /** * @return {?} */ get y() { /** @type {?} */ const item = this.getItem(); /** @type {?} */ const breakpoint = item.gridster ? item.gridster.options.breakpoint : null; return this.getValueY(breakpoint); } /** * @param {?} value * @return {?} */ set y(value) { /** @type {?} */ const item = this.getItem(); /** @type {?} */ const breakpoint = item.gridster ? item.gridster.options.breakpoint : null; this.setValueY(value, breakpoint); } /** * @return {?} */ get w() { /** @type {?} */ const item = this.getItem(); /** @type {?} */ const breakpoint = item.gridster ? item.gridster.options.breakpoint : null; return this.getValueW(breakpoint); } /** * @param {?} value * @return {?} */ set w(value) { /** @type {?} */ const item = this.getItem(); /** @type {?} */ const breakpoint = item.gridster ? item.gridster.options.breakpoint : null; this.setValueW(value, breakpoint); } /** * @return {?} */ get h() { /** @type {?} */ const item = this.getItem(); /** @type {?} */ const breakpoint = item.gridster ? item.gridster.options.breakpoint : null; return this.getValueH(breakpoint); } /** * @param {?} value * @return {?} */ set h(value) { /** @type {?} */ const item = this.getItem(); /** @type {?} */ const breakpoint = item.gridster ? item.gridster.options.breakpoint : null; this.setValueH(value, breakpoint); } /** * @return {?} */ get autoSize() { return this.getItem().autoSize; } /** * @param {?} value * @return {?} */ set autoSize(value) { this.getItem().autoSize = value; } /** * @return {?} */ get dragAndDrop() { return !!this.getItem().dragAndDrop; } /** * @return {?} */ get resizable() { return !!this.getItem().resizable; } /** * @return {?} */ get positionX() { /** @type {?} */ const item = this.itemComponent || this.itemPrototype; if (!item) { return null; } return item.positionX; } /** * @return {?} */ get positionY() { /** @type {?} */ const item = this.itemComponent || this.itemPrototype; if (!item) { return null; } return item.positionY; } /** * @param {?} item * @return {?} */ setFromGridsterItem(item) { if (this.isItemSet()) { throw new Error('GridListItem is already set.'); } this.itemComponent = item; return this; } /** * @param {?} item * @return {?} */ setFromGridsterItemPrototype(item) { if (this.isItemSet()) { throw new Error('GridListItem is already set.'); } this.itemPrototype = item; return this; } /** * @param {?} item * @return {?} */ setFromObjectLiteral(item) { if (this.isItemSet()) { throw new Error('GridListItem is already set.'); } this.itemObject = item; return this; } /** * @return {?} */ copy() { /** @type {?} */ 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 }); } /** * @param {?=} breakpoint * @return {?} */ copyForBreakpoint(breakpoint) { /** @type {?} */ 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 }); } /** * @param {?=} breakpoint * @return {?} */ getValueX(breakpoint) { /** @type {?} */ const item = this.getItem(); return item[this.getXProperty(breakpoint)]; } /** * @param {?=} breakpoint * @return {?} */ getValueY(breakpoint) { /** @type {?} */ const item = this.getItem(); return item[this.getYProperty(breakpoint)]; } /** * @param {?=} breakpoint * @return {?} */ getValueW(breakpoint) { /** @type {?} */ const item = this.getItem(); return item[this.getWProperty(breakpoint)] || 1; } /** * @param {?=} breakpoint * @return {?} */ getValueH(breakpoint) { /** @type {?} */ const item = this.getItem(); return item[this.getHProperty(breakpoint)] || 1; } /** * @param {?} value * @param {?=} breakpoint * @return {?} */ setValueX(value, breakpoint) { /** @type {?} */ const item = this.getItem(); item[this.getXProperty(breakpoint)] = value; } /** * @param {?} value * @param {?=} breakpoint * @return {?} */ setValueY(value, breakpoint) { /** @type {?} */ const item = this.getItem(); item[this.getYProperty(breakpoint)] = value; } /** * @param {?} value * @param {?=} breakpoint * @return {?} */ setValueW(value, breakpoint) { /** @type {?} */ const item = this.getItem(); item[this.getWProperty(breakpoint)] = value; } /** * @param {?} value * @param {?=} breakpoint * @return {?} */ setValueH(value, breakpoint) { /** @type {?} */ const item = this.getItem(); item[this.getHProperty(breakpoint)] = value; } /** * @param {?=} breakpoint * @return {?} */ triggerChangeX(breakpoint) { /** @type {?} */ const item = this.itemComponent; if (item) { item[this.getXProperty(breakpoint) + 'Change'].emit(this.getValueX(breakpoint)); } } /** * @param {?=} breakpoint * @return {?} */ triggerChangeY(breakpoint) { /** @type {?} */ const item = this.itemComponent; if (item) { item[this.getYProperty(breakpoint) + 'Change'].emit(this.getValueY(breakpoint)); } } /** * @param {?=} breakpoint * @return {?} */ triggerChangeW(breakpoint) { /** @type {?} */ const item = this.itemComponent; if (item) { item[this.getWProperty(breakpoint) + 'Change'].emit(this.getValueW(breakpoint)); } } /** * @param {?=} breakpoint * @return {?} */ triggerChangeH(breakpoint) { /** @type {?} */ const item = this.itemComponent; if (item) { item[this.getHProperty(breakpoint) + 'Change'].emit(this.getValueH(breakpoint)); } } /** * @param {?=} breakpoint * @return {?} */ hasPositions(breakpoint) { /** @type {?} */ const x = this.getValueX(breakpoint); /** @type {?} */ const y = this.getValueY(breakpoint); return (x || x === 0) && (y || y === 0); } /** * @param {?=} gridster * @return {?} */ applyPosition(gridster) { /** @type {?} */ const position = this.calculatePosition(gridster); this.itemComponent.positionX = position.left; this.itemComponent.positionY = position.top; this.itemComponent.updateElemenetPosition(); } /** * @param {?=} gridster * @return {?} */ 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 }; } /** * @param {?=} gridster * @return {?} */ applySize(gridster) { /** @type {?} */ const size = this.calculateSize(gridster); this.$element.style.width = size.width + 'px'; this.$element.style.height = size.height + 'px'; } /** * @param {?=} gridster * @return {?} */ calculateSize(gridster) { if (!gridster && !this.itemComponent) { return { width: 0, height: 0 }; } gridster = gridster || this.itemComponent.gridster; /** @type {?} */ let width = this.getValueW(gridster.options.breakpoint); /** @type {?} */ 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 }; } /** * @param {?=} breakpoint * @return {?} */ getXProperty(breakpoint) { if (breakpoint && this.itemComponent) { return GridListItem.X_PROPERTY_MAP[breakpoint]; } else { return 'x'; } } /** * @param {?=} breakpoint * @return {?} */ getYProperty(breakpoint) { if (breakpoint && this.itemComponent) { return GridListItem.Y_PROPERTY_MAP[breakpoint]; } else { return 'y'; } } /** * @param {?=} breakpoint * @return {?} */ getWProperty(breakpoint) { if (this.itemPrototype) { return this.itemPrototype[GridListItem.W_PROPERTY_MAP[breakpoint]] ? GridListItem.W_PROPERTY_MAP[breakpoint] : 'w'; } /** @type {?} */ const item = this.getItem(); /** @type {?} */ const responsiveSizes = item.gridster && item.gridster.options.responsiveSizes; if (breakpoint && responsiveSizes) { return GridListItem.W_PROPERTY_MAP[breakpoint]; } else { return 'w'; } } /** * @param {?=} breakpoint * @return {?} */ getHProperty(breakpoint) { if (this.itemPrototype) { return this.itemPrototype[GridListItem.H_PROPERTY_MAP[breakpoint]] ? GridListItem.H_PROPERTY_MAP[breakpoint] : 'h'; } /** @type {?} */ const item = this.getItem(); /** @type {?} */ const responsiveSizes = item.gridster && item.gridster.options.responsiveSizes; if (breakpoint && responsiveSizes) { return GridListItem.H_PROPERTY_MAP[breakpoint]; } else { return 'h'; } } /** * @return {?} */ getItem() { /** @type {?} */ const item = this.itemComponent || this.itemPrototype || this.itemObject; if (!item) { throw new Error('GridListItem is not set.'); } return item; } /** * @return {?} */ 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' }; if (false) { /** @type {?} */ GridListItem.BREAKPOINTS; /** @type {?} */ GridListItem.X_PROPERTY_MAP; /** @type {?} */ GridListItem.Y_PROPERTY_MAP; /** @type {?} */ GridListItem.W_PROPERTY_MAP; /** @type {?} */ GridListItem.H_PROPERTY_MAP; /** @type {?} */ GridListItem.prototype.itemComponent; /** @type {?} */ GridListItem.prototype.itemPrototype; /** @type {?} */ GridListItem.prototype.itemObject; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JpZExpc3RJdGVtLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGJsYXJlL2FuZ3VsYXIyZ3JpZHN0ZXIvIiwic291cmNlcyI6WyJsaWIvZ3JpZExpc3QvR3JpZExpc3RJdGVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFJQSxNQUFNLE9BQU8sWUFBWTs7OztJQWtDckIsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO0lBQ25DLENBQUM7Ozs7SUFFRCxJQUFJLENBQUM7O2NBQ0ssSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUU7O2NBQ3JCLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUk7UUFFMUUsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Ozs7O0lBQ0QsSUFBSSxDQUFDLENBQUUsS0FBYTs7Y0FDVixJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRTs7Y0FDckIsVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSTtRQUUxRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN0QyxDQUFDOzs7O0lBRUQsSUFBSSxDQUFDOztjQUNLLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFOztjQUNyQixVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJO1FBRTFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN0QyxDQUFDOzs7OztJQUNELElBQUksQ0FBQyxDQUFFLEtBQWE7O2NBQ1YsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUU7O2NBQ3JCLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUk7UUFFMUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDdEMsQ0FBQzs7OztJQUVELElBQUksQ0FBQzs7Y0FDSyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRTs7Y0FDckIsVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSTtRQUUxRSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdEMsQ0FBQzs7Ozs7SUFDRCxJQUFJLENBQUMsQ0FBRSxLQUFhOztjQUNWLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFOztjQUNyQixVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJO1FBRTFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Ozs7SUFFRCxJQUFJLENBQUM7O2NBQ0ssSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUU7O2NBQ3JCLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUk7UUFFMUUsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Ozs7O0lBQ0QsSUFBSSxDQUFDLENBQUUsS0FBYTs7Y0FDVixJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRTs7Y0FDckIsVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSTtRQUUxRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN0QyxDQUFDOzs7O0lBRUQsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO0lBQ25DLENBQUM7Ozs7O0lBQ0QsSUFBSSxRQUFRLENBQUUsS0FBYztRQUN4QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNwQyxDQUFDOzs7O0lBRUQsSUFBSSxXQUFXO1FBQ1gsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFdBQVcsQ0FBQztJQUN4QyxDQUFDOzs7O0lBRUQsSUFBSSxTQUFTO1FBQ1QsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQztJQUN0QyxDQUFDOzs7O0lBRUQsSUFBSSxTQUFTOztjQUNILElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhO1FBRXJELElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDUCxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7Ozs7SUFFRCxJQUFJLFNBQVM7O2NBQ0gsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGFBQWE7UUFFckQsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNQLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDMUIsQ0FBQzs7Ozs7SUFFTSxtQkFBbUIsQ0FBRSxJQUEyQjtRQUNuRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7U0FDbkQ7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDOzs7OztJQUVNLDRCQUE0QixDQUFFLElBQW9DO1FBQ3JFLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztTQUNuRDtRQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Ozs7O0lBRU0sb0JBQW9CLENBQUUsSUFBWTtRQUNyQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7U0FDbkQ7UUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDOzs7O0lBRU0sSUFBSTs7Y0FDRCxRQUFRLEdBQUcsSUFBSSxZQUFZLEVBQUU7UUFFbkMsT0FBTyxRQUFRLENBQUMsb0JBQW9CLENBQUM7WUFDakMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNULENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNULENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNULENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNULFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDN0IsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1NBQzVCLENBQUMsQ0FBQztJQUNQLENBQUM7Ozs7O0lBRU0saUJBQWlCLENBQUMsVUFBVzs7Y0FDMUIsUUFBUSxHQUFHLElBQUksWUFBWSxFQUFFO1FBRW5DLE9BQU8sUUFBUSxDQUFDLG9CQUFvQixDQUFDO1lBQ2pDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7WUFDN0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO1lBQzdCLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQztZQUM3QixDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7WUFDN0IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7U0FDNUIsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs7Ozs7SUFFTSxTQUFTLENBQUMsVUFBVzs7Y0FDbEIsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUU7UUFFM0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7Ozs7O0lBRU0sU0FBUyxDQUFDLFVBQVc7O2NBQ2xCLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFO1FBRTNCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUMvQyxDQUFDOzs7OztJQUVNLFNBQVMsQ0FBQyxVQUFXOztjQUNsQixJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRTtRQUUzQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BELENBQUM7Ozs7O0lBRU0sU0FBUyxDQUFDLFVBQVc7O2NBQ2xCLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFO1FBRTNCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEQsQ0FBQzs7Ozs7O0lBRU0sU0FBUyxDQUFDLEtBQWEsRUFBRSxVQUFXOztjQUNqQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRTtRQUUzQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNoRCxDQUFDOzs7Ozs7SUFFTSxTQUFTLENBQUMsS0FBYSxFQUFFLFVBQVc7O2NBQ2pDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFO1FBRTNCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ2hELENBQUM7Ozs7OztJQUVNLFNBQVMsQ0FBQyxLQUFhLEVBQUUsVUFBVzs7Y0FDakMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUU7UUFFM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDaEQsQ0FBQzs7Ozs7O0lBRU0sU0FBUyxDQUFDLEtBQWEsRUFBRSxVQUFXOztjQUNqQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRTtRQUUzQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNoRCxDQUFDOzs7OztJQUVNLGNBQWMsQ0FBQyxVQUFXOztjQUN2QixJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWE7UUFDL0IsSUFBSSxJQUFJLEVBQUU7WUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1NBQ25GO0lBQ0wsQ0FBQzs7Ozs7SUFFTSxjQUFjLENBQUMsVUFBVzs7Y0FDdkIsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhO1FBQy9CLElBQUksSUFBSSxFQUFFO1lBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztTQUNuRjtJQUNMLENBQUM7Ozs7O0lBRU0sY0FBYyxDQUFDLFVBQVc7O2NBQ3ZCLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYTtRQUMvQixJQUFJLElBQUksRUFBRTtZQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7U0FDbkY7SUFDTCxDQUFDOzs7OztJQUVNLGNBQWMsQ0FBQyxVQUFXOztjQUN2QixJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWE7UUFDL0IsSUFBSSxJQUFJLEVBQUU7WUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1NBQ25GO0lBQ0wsQ0FBQzs7Ozs7SUFFTSxZQUFZLENBQUMsVUFBVzs7Y0FDckIsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDOztjQUM5QixDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7UUFFcEMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7Ozs7O0lBRU0sYUFBYSxDQUFDLFFBQTBCOztjQUNyQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQztRQUVqRCxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQzdDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFDNUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2hELENBQUM7Ozs7O0lBRU0saUJBQWlCLENBQUMsUUFBMEI7UUFDL0MsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDbEMsT0FBTyxFQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBQyxDQUFDO1NBQzVCO1FBQ0QsUUFBUSxHQUFHLFFBQVEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQztRQUVuRCxPQUFPO1lBQ0gsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLFNBQVM7WUFDakMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLFVBQVU7U0FDcEMsQ0FBQztJQUNOLENBQUM7Ozs7O0lBRU0sU0FBUyxDQUFDLFFBQTBCOztjQUNqQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUM7UUFFekMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQzlDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNwRCxDQUFDOzs7OztJQUVNLGFBQWEsQ0FBQyxRQUEwQjtRQUMzQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNsQyxPQUFPLEVBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFDLENBQUM7U0FDaEM7UUFDRCxRQUFRLEdBQUcsUUFBUSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDOztZQUUvQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQzs7WUFDbkQsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7UUFFeEQsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLFNBQVMsS0FBSyxVQUFVLEVBQUU7WUFDM0MsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDbkQ7UUFDRCxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsU0FBUyxLQUFLLFlBQVksRUFBRTtZQUM3QyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNyRDtRQUVELE9BQU87WUFDSCxLQUFLLEVBQUUsS0FBSyxHQUFHLFFBQVEsQ0FBQyxTQUFTO1lBQ2pDLE1BQU0sRUFBRSxNQUFNLEdBQUcsUUFBUSxDQUFDLFVBQVU7U0FDdkMsQ0FBQztJQUNOLENBQUM7Ozs7O0lBRU8sWUFBWSxDQUFDLFVBQW1CO1FBRXBDLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDbEMsT0FBTyxZQUFZLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ2xEO2FBQU07WUFDSCxPQUFPLEdBQUcsQ0FBQztTQUNkO0lBQ0wsQ0FBQzs7Ozs7SUFFTyxZQUFZLENBQUMsVUFBbUI7UUFFcEMsSUFBSSxVQUFVLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNsQyxPQUFPLFlBQVksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDbEQ7YUFBTTtZQUNILE9BQU8sR0FBRyxDQUFDO1NBQ2Q7SUFDTCxDQUFDOzs7OztJQUVPLFlBQVksQ0FBQyxVQUFtQjtRQUNwQyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDcEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoRSxZQUFZLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7U0FDckQ7O2NBRUssSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUU7O2NBQ3JCLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGVBQWU7UUFFOUUsSUFBSSxVQUFVLElBQUksZUFBZSxFQUFFO1lBQy9CLE9BQU8sWUFBWSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUNsRDthQUFNO1lBQ0gsT0FBTyxHQUFHLENBQUM7U0FDZDtJQUNMLENBQUM7Ozs7O0lBRU8sWUFBWSxDQUFDLFVBQW1CO1FBQ3BDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNwQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hFLFlBQVksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztTQUNyRDs7Y0FFSyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRTs7Y0FDckIsZUFBZSxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsZUFBZTtRQUU5RSxJQUFJLFVBQVUsSUFBSSxlQUFlLEVBQUU7WUFDL0IsT0FBTyxZQUFZLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ2xEO2FBQU07WUFDSCxPQUFPLEdBQUcsQ0FBQztTQUNkO0lBQ0wsQ0FBQzs7OztJQUVPLE9BQU87O2NBQ0wsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsVUFBVTtRQUV4RSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1NBQy9DO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQzs7OztJQUVPLFNBQVM7UUFDYixPQUFPLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3ZFLENBQUM7O0FBblhNLHdCQUFXLEdBQWtCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdEQsMkJBQWMsR0FBUTtJQUN6QixFQUFFLEVBQUUsS0FBSztJQUNULEVBQUUsRUFBRSxLQUFLO0lBQ1QsRUFBRSxFQUFFLEtBQUs7SUFDVCxFQUFFLEVBQUUsS0FBSztDQUNaLENBQUM7QUFFSywyQkFBYyxHQUFRO0lBQ3pCLEVBQUUsRUFBRSxLQUFLO0lBQ1QsRUFBRSxFQUFFLEtBQUs7SUFDVCxFQUFFLEVBQUUsS0FBSztJQUNULEVBQUUsRUFBRSxLQUFLO0NBQ1osQ0FBQztBQUVLLDJCQUFjLEdBQVE7SUFDekIsRUFBRSxFQUFFLEtBQUs7SUFDVCxFQUFFLEVBQUUsS0FBSztJQUNULEVBQUUsRUFBRSxLQUFLO0lBQ1QsRUFBRSxFQUFFLEtBQUs7Q0FDWixDQUFDO0FBRUssMkJBQWMsR0FBUTtJQUN6QixFQUFFLEVBQUUsS0FBSztJQUNULEVBQUUsRUFBRSxLQUFLO0lBQ1QsRUFBRSxFQUFFLEtBQUs7SUFDVCxFQUFFLEVBQUUsS0FBSztDQUNaLENBQUM7OztJQTNCRix5QkFBNkQ7O0lBQzdELDRCQUtFOztJQUVGLDRCQUtFOztJQUVGLDRCQUtFOztJQUVGLDRCQUtFOztJQUVGLHFDQUFxQzs7SUFDckMscUNBQThDOztJQUM5QyxrQ0FBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBHcmlkc3Rlckl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi9ncmlkc3Rlci1pdGVtL2dyaWRzdGVyLWl0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7IEdyaWRzdGVySXRlbVByb3RvdHlwZURpcmVjdGl2ZSB9IGZyb20gJy4uL2dyaWRzdGVyLXByb3RvdHlwZS9ncmlkc3Rlci1pdGVtLXByb3RvdHlwZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgR3JpZHN0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vZ3JpZHN0ZXIuc2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBHcmlkTGlzdEl0ZW0ge1xuICAgIHN0YXRpYyBCUkVBS1BPSU5UUzogQXJyYXk8c3RyaW5nPiA9IFsnc20nLCAnbWQnLCAnbGcnLCAneGwnXTtcbiAgICBzdGF0aWMgWF9QUk9QRVJUWV9NQVA6IGFueSA9IHtcbiAgICAgICAgc206ICd4U20nLFxuICAgICAgICBtZDogJ3hNZCcsXG4gICAgICAgIGxnOiAneExnJyxcbiAgICAgICAgeGw6ICd4WGwnXG4gICAgfTtcblxuICAgIHN0YXRpYyBZX1BST1BFUlRZX01BUDogYW55ID0ge1xuICAgICAgICBzbTogJ3lTbScsXG4gICAgICAgIG1kOiAneU1kJyxcbiAgICAgICAgbGc6ICd5TGcnLFxuICAgICAgICB4bDogJ3lYbCdcbiAgICB9O1xuXG4gICAgc3RhdGljIFdfUFJPUEVSVFlfTUFQOiBhbnkgPSB7XG4gICAgICAgIHNtOiAnd1NtJyxcbiAgICAgICAgbWQ6ICd3TWQnLFxuICAgICAgICBsZzogJ3dMZycsXG4gICAgICAgIHhsOiAnd1hsJ1xuICAgIH07XG5cbiAgICBzdGF0aWMgSF9QUk9QRVJUWV9NQVA6IGFueSA9IHtcbiAgICAgICAgc206ICdoU20nLFxuICAgICAgICBtZDogJ2hNZCcsXG4gICAgICAgIGxnOiAnaExnJyxcbiAgICAgICAgeGw6ICdoWGwnXG4gICAgfTtcblxuICAgIGl0ZW1Db21wb25lbnQ6IEdyaWRzdGVySXRlbUNvbXBvbmVudDtcbiAgICBpdGVtUHJvdG90eXBlOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmU7XG4gICAgaXRlbU9iamVjdDogYW55O1xuXG4gICAgZ2V0ICRlbGVtZW50ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SXRlbSgpLiRlbGVtZW50O1xuICAgIH1cblxuICAgIGdldCB4ICgpIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbSgpO1xuICAgICAgICBjb25zdCBicmVha3BvaW50ID0gaXRlbS5ncmlkc3RlciA/IGl0ZW0uZ3JpZHN0ZXIub3B0aW9ucy5icmVha3BvaW50IDogbnVsbDtcblxuICAgICAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZVgoYnJlYWtwb2ludCk7XG4gICAgfVxuICAgIHNldCB4ICh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0oKTtcbiAgICAgICAgY29uc3QgYnJlYWtwb2ludCA9IGl0ZW0uZ3JpZHN0ZXIgPyBpdGVtLmdyaWRzdGVyLm9wdGlvbnMuYnJlYWtwb2ludCA6IG51bGw7XG5cbiAgICAgICAgdGhpcy5zZXRWYWx1ZVgodmFsdWUsIGJyZWFrcG9pbnQpO1xuICAgIH1cblxuICAgIGdldCB5ICgpIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbSgpO1xuICAgICAgICBjb25zdCBicmVha3BvaW50ID0gaXRlbS5ncmlkc3RlciA/IGl0ZW0uZ3JpZHN0ZXIub3B0aW9ucy5icmVha3BvaW50IDogbnVsbDtcblxuICAgICAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZVkoYnJlYWtwb2ludCk7XG4gICAgfVxuICAgIHNldCB5ICh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0oKTtcbiAgICAgICAgY29uc3QgYnJlYWtwb2ludCA9IGl0ZW0uZ3JpZHN0ZXIgPyBpdGVtLmdyaWRzdGVyLm9wdGlvbnMuYnJlYWtwb2ludCA6IG51bGw7XG5cbiAgICAgICAgdGhpcy5zZXRWYWx1ZVkodmFsdWUsIGJyZWFrcG9pbnQpO1xuICAgIH1cblxuICAgIGdldCB3ICgpIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbSgpO1xuICAgICAgICBjb25zdCBicmVha3BvaW50ID0gaXRlbS5ncmlkc3RlciA/IGl0ZW0uZ3JpZHN0ZXIub3B0aW9ucy5icmVha3BvaW50IDogbnVsbDtcblxuICAgICAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZVcoYnJlYWtwb2ludCk7XG4gICAgfVxuICAgIHNldCB3ICh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0oKTtcbiAgICAgICAgY29uc3QgYnJlYWtwb2ludCA9IGl0ZW0uZ3JpZHN0ZXIgPyBpdGVtLmdyaWRzdGVyLm9wdGlvbnMuYnJlYWtwb2ludCA6IG51bGw7XG5cbiAgICAgICAgdGhpcy5zZXRWYWx1ZVcodmFsdWUsIGJyZWFrcG9pbnQpO1xuICAgIH1cblxuICAgIGdldCBoICgpIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbSgpO1xuICAgICAgICBjb25zdCBicmVha3BvaW50ID0gaXRlbS5ncmlkc3RlciA/IGl0ZW0uZ3JpZHN0ZXIub3B0aW9ucy5icmVha3BvaW50IDogbnVsbDtcblxuICAgICAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZUgoYnJlYWtwb2ludCk7XG4gICAgfVxuICAgIHNldCBoICh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0oKTtcbiAgICAgICAgY29uc3QgYnJlYWtwb2ludCA9IGl0ZW0uZ3JpZHN0ZXIgPyBpdGVtLmdyaWRzdGVyLm9wdGlvbnMuYnJlYWtwb2ludCA6IG51bGw7XG5cbiAgICAgICAgdGhpcy5zZXRWYWx1ZUgodmFsdWUsIGJyZWFrcG9pbnQpO1xuICAgIH1cblxuICAgIGdldCBhdXRvU2l6ZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEl0ZW0oKS5hdXRvU2l6ZTtcbiAgICB9XG4gICAgc2V0IGF1dG9TaXplICh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmdldEl0ZW0oKS5hdXRvU2l6ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGdldCBkcmFnQW5kRHJvcCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5nZXRJdGVtKCkuZHJhZ0FuZERyb3A7XG4gICAgfVxuXG4gICAgZ2V0IHJlc2l6YWJsZSgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5nZXRJdGVtKCkucmVzaXphYmxlO1xuICAgIH1cblxuICAgIGdldCBwb3NpdGlvblgoKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1Db21wb25lbnQgfHwgdGhpcy5pdGVtUHJvdG90eXBlO1xuXG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXRlbS5wb3NpdGlvblg7XG4gICAgfVxuXG4gICAgZ2V0IHBvc2l0aW9uWSgpIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbUNvbXBvbmVudCB8fCB0aGlzLml0ZW1Qcm90b3R5cGU7XG5cbiAgICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpdGVtLnBvc2l0aW9uWTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RnJvbUdyaWRzdGVySXRlbSAoaXRlbTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50KTogR3JpZExpc3RJdGVtIHtcbiAgICAgICAgaWYgKHRoaXMuaXNJdGVtU2V0KCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignR3JpZExpc3RJdGVtIGlzIGFscmVhZHkgc2V0LicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXRlbUNvbXBvbmVudCA9IGl0ZW07XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRGcm9tR3JpZHN0ZXJJdGVtUHJvdG90eXBlIChpdGVtOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUpOiBHcmlkTGlzdEl0ZW0ge1xuICAgICAgICBpZiAodGhpcy5pc0l0ZW1TZXQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHcmlkTGlzdEl0ZW0gaXMgYWxyZWFkeSBzZXQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pdGVtUHJvdG90eXBlID0gaXRlbTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldEZyb21PYmplY3RMaXRlcmFsIChpdGVtOiBPYmplY3QpOiBHcmlkTGlzdEl0ZW0ge1xuICAgICAgICBpZiAodGhpcy5pc0l0ZW1TZXQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHcmlkTGlzdEl0ZW0gaXMgYWxyZWFkeSBzZXQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pdGVtT2JqZWN0ID0gaXRlbTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGNvcHkoKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1Db3B5ID0gbmV3IEdyaWRMaXN0SXRlbSgpO1xuXG4gICAgICAgIHJldHVybiBpdGVtQ29weS5zZXRGcm9tT2JqZWN0TGl0ZXJhbCh7XG4gICAgICAgICAgICAkZWxlbWVudDogdGhpcy4kZWxlbWVudCxcbiAgICAgICAgICAgIHg6IHRoaXMueCxcbiAgICAgICAgICAgIHk6IHRoaXMueSxcbiAgICAgICAgICAgIHc6IHRoaXMudyxcbiAgICAgICAgICAgIGg6IHRoaXMuaCxcbiAgICAgICAgICAgIGF1dG9TaXplOiB0aGlzLmF1dG9TaXplLFxuICAgICAgICAgICAgZHJhZ0FuZERyb3A6IHRoaXMuZHJhZ0FuZERyb3AsXG4gICAgICAgICAgICByZXNpemFibGU6IHRoaXMucmVzaXphYmxlXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb3B5Rm9yQnJlYWtwb2ludChicmVha3BvaW50Pykge1xuICAgICAgICBjb25zdCBpdGVtQ29weSA9IG5ldyBHcmlkTGlzdEl0ZW0oKTtcblxuICAgICAgICByZXR1cm4gaXRlbUNvcHkuc2V0RnJvbU9iamVjdExpdGVyYWwoe1xuICAgICAgICAgICAgJGVsZW1lbnQ6IHRoaXMuJGVsZW1lbnQsXG4gICAgICAgICAgICB4OiB0aGlzLmdldFZhbHVlWChicmVha3BvaW50KSxcbiAgICAgICAgICAgIHk6IHRoaXMuZ2V0VmFsdWVZKGJyZWFrcG9pbnQpLFxuICAgICAgICAgICAgdzogdGhpcy5nZXRWYWx1ZVcoYnJlYWtwb2ludCksXG4gICAgICAgICAgICBoOiB0aGlzLmdldFZhbHVlSChicmVha3BvaW50KSxcbiAgICAgICAgICAgIGF1dG9TaXplOiB0aGlzLmF1dG9TaXplLFxuICAgICAgICAgICAgZHJhZ0FuZERyb3A6IHRoaXMuZHJhZ0FuZERyb3AsXG4gICAgICAgICAgICByZXNpemFibGU6IHRoaXMucmVzaXphYmxlXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRWYWx1ZVgoYnJlYWtwb2ludD8pIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbSgpO1xuXG4gICAgICAgIHJldHVybiBpdGVtW3RoaXMuZ2V0WFByb3BlcnR5KGJyZWFrcG9pbnQpXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VmFsdWVZKGJyZWFrcG9pbnQ/KSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0oKTtcblxuICAgICAgICByZXR1cm4gaXRlbVt0aGlzLmdldFlQcm9wZXJ0eShicmVha3BvaW50KV07XG4gICAgfVxuXG4gICAgcHVibGljIGdldFZhbHVlVyhicmVha3BvaW50Pykge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKCk7XG5cbiAgICAgICAgcmV0dXJuIGl0ZW1bdGhpcy5nZXRXUHJvcGVydHkoYnJlYWtwb2ludCldIHx8IDE7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFZhbHVlSChicmVha3BvaW50Pykge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKCk7XG5cbiAgICAgICAgcmV0dXJuIGl0ZW1bdGhpcy5nZXRIUHJvcGVydHkoYnJlYWtwb2ludCldIHx8IDE7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFZhbHVlWCh2YWx1ZTogbnVtYmVyLCBicmVha3BvaW50Pykge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKCk7XG5cbiAgICAgICAgaXRlbVt0aGlzLmdldFhQcm9wZXJ0eShicmVha3BvaW50KV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0VmFsdWVZKHZhbHVlOiBudW1iZXIsIGJyZWFrcG9pbnQ/KSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0oKTtcblxuICAgICAgICBpdGVtW3RoaXMuZ2V0WVByb3BlcnR5KGJyZWFrcG9pbnQpXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRWYWx1ZVcodmFsdWU6IG51bWJlciwgYnJlYWtwb2ludD8pIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbSgpO1xuXG4gICAgICAgIGl0ZW1bdGhpcy5nZXRXUHJvcGVydHkoYnJlYWtwb2ludCldID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFZhbHVlSCh2YWx1ZTogbnVtYmVyLCBicmVha3BvaW50Pykge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKCk7XG5cbiAgICAgICAgaXRlbVt0aGlzLmdldEhQcm9wZXJ0eShicmVha3BvaW50KV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdHJpZ2dlckNoYW5nZVgoYnJlYWtwb2ludD8pIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbUNvbXBvbmVudDtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW1bdGhpcy5nZXRYUHJvcGVydHkoYnJlYWtwb2ludCkgKyAnQ2hhbmdlJ10uZW1pdCh0aGlzLmdldFZhbHVlWChicmVha3BvaW50KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdHJpZ2dlckNoYW5nZVkoYnJlYWtwb2ludD8pIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbUNvbXBvbmVudDtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW1bdGhpcy5nZXRZUHJvcGVydHkoYnJlYWtwb2ludCkgKyAnQ2hhbmdlJ10uZW1pdCh0aGlzLmdldFZhbHVlWShicmVha3BvaW50KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdHJpZ2dlckNoYW5nZVcoYnJlYWtwb2ludD8pIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbUNvbXBvbmVudDtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW1bdGhpcy5nZXRXUHJvcGVydHkoYnJlYWtwb2ludCkgKyAnQ2hhbmdlJ10uZW1pdCh0aGlzLmdldFZhbHVlVyhicmVha3BvaW50KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdHJpZ2dlckNoYW5nZUgoYnJlYWtwb2ludD8pIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbUNvbXBvbmVudDtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW1bdGhpcy5nZXRIUHJvcGVydHkoYnJlYWtwb2ludCkgKyAnQ2hhbmdlJ10uZW1pdCh0aGlzLmdldFZhbHVlSChicmVha3BvaW50KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzUG9zaXRpb25zKGJyZWFrcG9pbnQ/KSB7XG4gICAgICAgIGNvbnN0IHggPSB0aGlzLmdldFZhbHVlWChicmVha3BvaW50KTtcbiAgICAgICAgY29uc3QgeSA9IHRoaXMuZ2V0VmFsdWVZKGJyZWFrcG9pbnQpO1xuXG4gICAgICAgIHJldHVybiAoeCB8fCB4ID09PSAwKSAmJiAoeSB8fCB5ID09PSAwKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXBwbHlQb3NpdGlvbihncmlkc3Rlcj86IEdyaWRzdGVyU2VydmljZSkge1xuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuY2FsY3VsYXRlUG9zaXRpb24oZ3JpZHN0ZXIpO1xuXG4gICAgICAgIHRoaXMuaXRlbUNvbXBvbmVudC5wb3NpdGlvblggPSBwb3NpdGlvbi5sZWZ0O1xuICAgICAgICB0aGlzLml0ZW1Db21wb25lbnQucG9zaXRpb25ZID0gcG9zaXRpb24udG9wO1xuICAgICAgICB0aGlzLml0ZW1Db21wb25lbnQudXBkYXRlRWxlbWVuZXRQb3NpdGlvbigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjYWxjdWxhdGVQb3NpdGlvbihncmlkc3Rlcj86IEdyaWRzdGVyU2VydmljZSk6IHtsZWZ0OiBudW1iZXIsIHRvcDogbnVtYmVyfSB7XG4gICAgICAgIGlmICghZ3JpZHN0ZXIgJiYgIXRoaXMuaXRlbUNvbXBvbmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHtsZWZ0OiAwLCB0b3A6IDB9O1xuICAgICAgICB9XG4gICAgICAgIGdyaWRzdGVyID0gZ3JpZHN0ZXIgfHwgdGhpcy5pdGVtQ29tcG9uZW50LmdyaWRzdGVyO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZWZ0OiB0aGlzLnggKiBncmlkc3Rlci5jZWxsV2lkdGgsXG4gICAgICAgICAgICB0b3A6IHRoaXMueSAqIGdyaWRzdGVyLmNlbGxIZWlnaHRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXBwbHlTaXplKGdyaWRzdGVyPzogR3JpZHN0ZXJTZXJ2aWNlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLmNhbGN1bGF0ZVNpemUoZ3JpZHN0ZXIpO1xuXG4gICAgICAgIHRoaXMuJGVsZW1lbnQuc3R5bGUud2lkdGggPSBzaXplLndpZHRoICsgJ3B4JztcbiAgICAgICAgdGhpcy4kZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBzaXplLmhlaWdodCArICdweCc7XG4gICAgfVxuXG4gICAgcHVibGljIGNhbGN1bGF0ZVNpemUoZ3JpZHN0ZXI/OiBHcmlkc3RlclNlcnZpY2UpOiB7d2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXJ9IHtcbiAgICAgICAgaWYgKCFncmlkc3RlciAmJiAhdGhpcy5pdGVtQ29tcG9uZW50KSB7XG4gICAgICAgICAgICByZXR1cm4ge3dpZHRoOiAwLCBoZWlnaHQ6IDB9O1xuICAgICAgICB9XG4gICAgICAgIGdyaWRzdGVyID0gZ3JpZHN0ZXIgfHwgdGhpcy5pdGVtQ29tcG9uZW50LmdyaWRzdGVyO1xuXG4gICAgICAgIGxldCB3aWR0aCA9IHRoaXMuZ2V0VmFsdWVXKGdyaWRzdGVyLm9wdGlvbnMuYnJlYWtwb2ludCk7XG4gICAgICAgIGxldCBoZWlnaHQgPSB0aGlzLmdldFZhbHVlSChncmlkc3Rlci5vcHRpb25zLmJyZWFrcG9pbnQpO1xuXG4gICAgICAgIGlmIChncmlkc3Rlci5vcHRpb25zLmRpcmVjdGlvbiA9PT0gJ3ZlcnRpY2FsJykge1xuICAgICAgICAgICAgd2lkdGggPSBNYXRoLm1pbih3aWR0aCwgZ3JpZHN0ZXIub3B0aW9ucy5sYW5lcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdyaWRzdGVyLm9wdGlvbnMuZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcpIHtcbiAgICAgICAgICAgIGhlaWdodCA9IE1hdGgubWluKGhlaWdodCwgZ3JpZHN0ZXIub3B0aW9ucy5sYW5lcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd2lkdGg6IHdpZHRoICogZ3JpZHN0ZXIuY2VsbFdpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQgKiBncmlkc3Rlci5jZWxsSGVpZ2h0XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRYUHJvcGVydHkoYnJlYWtwb2ludD86IHN0cmluZykge1xuXG4gICAgICAgIGlmIChicmVha3BvaW50ICYmIHRoaXMuaXRlbUNvbXBvbmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIEdyaWRMaXN0SXRlbS5YX1BST1BFUlRZX01BUFticmVha3BvaW50XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAneCc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFlQcm9wZXJ0eShicmVha3BvaW50Pzogc3RyaW5nKSB7XG5cbiAgICAgICAgaWYgKGJyZWFrcG9pbnQgJiYgdGhpcy5pdGVtQ29tcG9uZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gR3JpZExpc3RJdGVtLllfUFJPUEVSVFlfTUFQW2JyZWFrcG9pbnRdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICd5JztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0V1Byb3BlcnR5KGJyZWFrcG9pbnQ/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuaXRlbVByb3RvdHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXRlbVByb3RvdHlwZVtHcmlkTGlzdEl0ZW0uV19QUk9QRVJUWV9NQVBbYnJlYWtwb2ludF1dID9cbiAgICAgICAgICAgICAgICBHcmlkTGlzdEl0ZW0uV19QUk9QRVJUWV9NQVBbYnJlYWtwb2ludF0gOiAndyc7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNpdmVTaXplcyA9IGl0ZW0uZ3JpZHN0ZXIgJiYgaXRlbS5ncmlkc3Rlci5vcHRpb25zLnJlc3BvbnNpdmVTaXplcztcblxuICAgICAgICBpZiAoYnJlYWtwb2ludCAmJiByZXNwb25zaXZlU2l6ZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBHcmlkTGlzdEl0ZW0uV19QUk9QRVJUWV9NQVBbYnJlYWtwb2ludF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gJ3cnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRIUHJvcGVydHkoYnJlYWtwb2ludD86IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5pdGVtUHJvdG90eXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pdGVtUHJvdG90eXBlW0dyaWRMaXN0SXRlbS5IX1BST1BFUlRZX01BUFticmVha3BvaW50XV0gP1xuICAgICAgICAgICAgICAgIEdyaWRMaXN0SXRlbS5IX1BST1BFUlRZX01BUFticmVha3BvaW50XSA6ICdoJztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0oKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2l2ZVNpemVzID0gaXRlbS5ncmlkc3RlciAmJiBpdGVtLmdyaWRzdGVyLm9wdGlvbnMucmVzcG9uc2l2ZVNpemVzO1xuXG4gICAgICAgIGlmIChicmVha3BvaW50ICYmIHJlc3BvbnNpdmVTaXplcykge1xuICAgICAgICAgICAgcmV0dXJuIEdyaWRMaXN0SXRlbS5IX1BST1BFUlRZX01BUFticmVha3BvaW50XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAnaCc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEl0ZW0oKTogYW55IHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbUNvbXBvbmVudCB8fCB0aGlzLml0ZW1Qcm90b3R5cGUgfHwgdGhpcy5pdGVtT2JqZWN0O1xuXG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHcmlkTGlzdEl0ZW0gaXMgbm90IHNldC4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzSXRlbVNldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbUNvbXBvbmVudCB8fCB0aGlzLml0ZW1Qcm90b3R5cGUgfHwgdGhpcy5pdGVtT2JqZWN0O1xuICAgIH1cbn1cbiJdfQ==