(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/script/utils/ScrollFinal.js'; var __require = nodeEnv ? function (request) { return cc.require(request); } : function (request) { return __quick_compile_project__.require(request, __filename); }; function __define (exports, require, module) { if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict"; cc._RF.push(module, '2f09cXFfgJER7l59b1/4lNF', 'ScrollFinal'); // script/utils/ScrollFinal.ts "use strict"; /** * @Author huangxin * @ctime 2020-06-10 * @Version * ScrollFinal1.0 2020-06-10 beta升级,使用挂载预制体 * ScrollFinal1.1 2020-08-11 新增对象池类大法 * ScrollFinal1.2 2020-08-17 1.新增延迟刷新item,防止在某一帧生成过量item导致卡顿的问题 * 2.初始的控件属性设置(init方法)改为由initScrollView触发(原本的onLoad触发在适配模式下会不准确) * ScrollFinal1.3 2021-05-26 现在的滚动节点不需要手动添加scrollView组件了 * ScrollFinal1.4 2022-04-14 现在可以在初始化或refresh时,立刻滚动到某个位置了 * ScrollFinal1.5 2023-06-22 新增 adapterItem , 可在index首次出现时设定它的高度(后续把动态修改补上) * @Tips * 复用滚动轴 用来减少drawcall * 与cc.ScrollView组件一同挂载在一个节点上 * item挂载的脚本必须添加setData方法,用来传递数据 * item锚点应该在中心 * 目前Grid类型只支持从左上到右下模式(垂直滚动),其他奇葩模式自己搞定 * 滚动轴的锚点必须放在滚动列表的起始位置(比如背包grid模式在左上角,成就列表在左上角) * * @adapterItem item如有不定高度时,编辑器中设定的item需要为最小高度,确保instance的个数最大值是正确的 * 支持不规则高度item 谨用,有缺陷: * 1.同一个item再次设置不同高度时会出现问题(若要修改,需要做一个链表来关联前后item) * 2.仅支持垂直和水平模式,背包模式不支持(水平模式未测试) */ var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); var gameMethod_1 = require("../common/gameMethod"); var TypeConst_1 = require("../data/const/TypeConst"); var ScrollInner_1 = require("./ScrollInner"); var ScrollOut_1 = require("./ScrollOut"); // 对象池类型 var PoolEnum = cc.Enum({ /**通用道具 */ ITEM_BASE: 0, /**背包道具 */ ITEM_BAG: 1, }); // 滚动类型 var ScrollDirEnum = cc.Enum({ /**垂直*/ VERTICAL: 0, /**水平*/ HORIZONTAL: 1, /**背包*/ GRID: 2 }); // 滚动类型 var ScrollOutInner = cc.Enum({ /**外层scroll*/ DEFAULT: 0, /**外层scroll*/ OUT: 1, /**内层scroll*/ INNER: 2, }); var _a = cc._decorator, ccclass = _a.ccclass, property = _a.property, menu = _a.menu; var ScrollFinal = /** @class */ (function (_super) { __extends(ScrollFinal, _super); function ScrollFinal() { var _this = _super !== null && _super.apply(this, arguments) || this; // @property(cc.ScrollView) // scroll: cc.ScrollView | null = null _this.useNodePool = false; _this.poolType = PoolEnum.ITEM_BASE; _this.scrollDir = ScrollDirEnum.VERTICAL; // 滚动类型 _this.outInner = ScrollOutInner.DEFAULT; _this.padingX = 10; _this.padingY = 10; _this.padingY2 = 0; _this.spacingX = 20; _this.spacingY = 20; _this.itemPrefab = null; // item资源加载地址 _this.itemScript = ""; // item挂在的脚本名 _this.itemScale = 1; // item缩放比例 _this.inertia = true; _this.brake = 0.75; _this.elastic = true; _this.cancelInnerEvents = true; _this.adapterItem = false; _this.adapterList = {}; // 记录适配的坐标列表 _this.adapterContentLength = 0; // 激活适配后的content高度 // @property({ // tooltip: "启动widget模式(注意激活后不可与原生cc.widget同时使用)" // }) // useWidget: boolean = false // @property({ tooltip: "适配顶部", visible: function () { return this.useWidget == true } }) // useAlignTop: boolean = false // @property({ tooltip: "距离父节点顶部", visible: function () { return this.useAlignTop == true } }) // widgetTop: number = 0 // @property({ tooltip: "适配底部", visible: function () { return this.useWidget == true } }) // useAlignBottom: boolean = false // @property({ tooltip: "距离父节点底部", visible: function () { return this.useAlignBottom == true } }) // widgetBottom: number = 0 // @property({ tooltip: "适配左侧", visible: function () { return this.useWidget == true } }) // useAlignLeft: boolean = false // @property({ tooltip: "距离父节点左侧", visible: function () { return this.useAlignLeft == true } }) // widgetLeft: number = 0 // @property({ tooltip: "适配右侧", visible: function () { return this.useWidget == true } }) // useAlignRight: boolean = false // @property({ tooltip: "距离父节点右侧", visible: function () { return this.useAlignRight == true } }) // widgetRight: number = 0 _this.showAnim = 0; _this.animSpeed = 0.15; _this.ctime = 0; _this.cnumber = 1; _this.isScrollUp = false; // 当前往哪个方向滚动 左和上是true _this._itemDataList = []; // 当前显示阵营的所有数据 _this.extraParams = []; // 额外数据 _this.itemList = []; // 实例化的item列表 _this.instantiateCount = 0; // item实例化数量 _this.hangCount = 0; // 行个数 _this.lieCount = 0; // 列个数 _this.itemDistanceX = 0; // item中心点之间的距离 _this.itemDistanceY = 0; // item中心点之间的距离 _this.scrollMaxOffsetX = 0; // 最大可滚动区域X _this.scrollMaxOffsetY = 0; // 最大可滚动区域Y _this.scrollIndex = -1; // scroll参数 _this.lastScrollPos = 0; //上一次的滚动位置 _this.curScrollPos = 0; // 当前滚动位置 _this.itemWidth = 10; // item宽度 _this.itemHeight = 10; // item高度 _this.tagLang = 0; _this.tagIndex = -999; // 999 表示清0状态,此时无【插入标签】,-1表示标签置顶,其他即当前标签的下方(右侧)显示 _this.canCreateItem = false; // 可以生成item _this.createIndex = 0; // 生成item的数据标签 _this.life = 0; // 生成item的时间 _this.baseIndex = 0; // 基础标签位置 _this.hasInit = false; return _this; } ScrollFinal.prototype.onLoad = function () { // if (this.node.getComponent(cc.ScrollView) != null) { // console.error("滚动节点无需挂载scrollView组件了") // return // } this.init(); }; ScrollFinal.prototype.resetSize = function () { if (this.mask) { this.mask.setContentSize(this.node.getContentSize()); } if (this.content) { // this.content.setContentSize(this.node.getContentSize()) this.setScrollContentSize(); } this.setInstantCount(); }; ScrollFinal.prototype.init = function () { if (this.hasInit) { return; } /////////////// 构建滚动轴 /////////////// this.scrollView = this.outInner == ScrollOutInner.DEFAULT ? this.addComponent(cc.ScrollView) : this.outInner == ScrollOutInner.OUT ? this.addComponent(ScrollOut_1.default) : this.addComponent(ScrollInner_1.default); // this.scrollView = this.addComponent(cc.ScrollView) this.scrollView.horizontal = this.scrollDir == ScrollDirEnum.HORIZONTAL; this.scrollView.vertical = this.scrollDir != ScrollDirEnum.HORIZONTAL; this.scrollView.inertia = this.inertia; this.scrollView.brake = this.brake; this.scrollView.elastic = this.elastic; this.scrollView.cancelInnerEvents = this.cancelInnerEvents; /////////////// 检测是否需要重新适配 /////////////// if (this.node.getComponent(cc.Widget)) { this.node.getComponent(cc.Widget).updateAlignment(); } /////////////// 构建滚动遮罩 /////////////// this.mask = new cc.Node(); this.mask.parent = this.node; this.mask.name = "scrollMask"; this.mask.setContentSize(this.node.getContentSize()); this.mask.addComponent(cc.Widget); this.mask.getComponent(cc.Widget).isAlignTop = true; this.mask.getComponent(cc.Widget).isAlignBottom = true; this.mask.getComponent(cc.Widget).top = 0; this.mask.getComponent(cc.Widget).bottom = 0; this.mask.addComponent(cc.Mask); this.mask.getComponent(cc.Mask).type = cc.Mask.Type.RECT; this.mask.anchorX = this.node.anchorX; this.mask.anchorY = this.node.anchorY; this.mask.x = 0; this.mask.y = 0; // widget不需要加了 // let maskWidget = mask.addComponent(cc.Widget) // maskWidget.isAlignTop = true // maskWidget.isAlignBottom = true // maskWidget.isAlignLeft = true // maskWidget.isAlignRight = true // maskWidget.top = 0 // maskWidget.bottom = 0 // maskWidget.left = 0 // maskWidget.right = 0 /////////////// 构建滚动内容器 /////////////// this.content = new cc.Node(); this.content.parent = this.mask; this.content.name = "scrollContent"; this.scrollView.content = this.content; this.content.setContentSize(this.node.getContentSize()); this.content.anchorX = this.node.anchorX; this.content.anchorY = this.node.anchorY; this.content.x = 0; this.content.y = 0; this.hasInit = true; this.itemWidth = this.itemPrefab.data.getContentSize().width; this.itemHeight = this.itemPrefab.data.getContentSize().height; // SCROLL_BOUNCE_BOTTOM = 'bounce-bottom',//滚动视图滚动到顶部边界并且开始回弹时发出的事件 // SCROLL_BOUNCE_LEFT = 'bounce-left',//滚动视图滚动到底部边界并且开始回弹时发出的事件 // SCROLL_BOUNCE_RIGHT = 'bounce-right',//滚动视图滚动到左边界并且开始回弹时发出的事件 // SCROLL_BOUNCE_TOP = 'bounce-top',//滚动视图滚动到右边界并且开始回弹时发出的事件 this.scrollView.node.on(TypeConst_1.CC_NODE_EVENT.SCROLLING, this.onScroll, this); this.scrollView.node.on(TypeConst_1.CC_NODE_EVENT.SCROLL_BEGAN, this.onScrollBegan, this); this.scrollView.node.on(TypeConst_1.CC_NODE_EVENT.SCROLL_BOUNCE_TOP, this.onBounceTop, this); this.scrollView.node.on(TypeConst_1.CC_NODE_EVENT.SCROLL_BOUNCE_BOTTOM, function () { }, this); this.scrollView.node.on(TypeConst_1.CC_NODE_EVENT.SCROLL_BOUNCE_LEFT, function () { }, this); this.scrollView.node.on(TypeConst_1.CC_NODE_EVENT.SCROLL_BOUNCE_RIGHT, function () { }, this); this.scrollView.node.on(TypeConst_1.CC_NODE_EVENT.SCROLL_BOUNCE_TOP, function () { }, this); this.itemDistanceX = this.realItemWidth + this.spacingX; this.itemDistanceY = this.realItemHeight + this.spacingY; this.setInstantCount(); // //看下有没有不应该有的组件 // // Layout // if (this.scrollView.content.getComponent(cc.Layout)) { // console.error("scrollFinal 与 layout 冲突,清删除 content 中的 layout 组件") // } // // Widget // if (this.scrollView.node.getComponent(cc.Widget)) { // if (this.scrollView.node.getComponent(cc.Widget).isAlignTop && // this.scrollView.node.getComponent(cc.Widget).isAlignBottom) { // console.error("不能用widget做长度适配(因为Widget的延迟),只可用作坐标适配") // } // } }; ScrollFinal.prototype.setInstantCount = function () { if (this.scrollView == null) { return; } switch (this.scrollDir) { case ScrollDirEnum.VERTICAL: this.hangCount = 1; this.lieCount = Math.ceil(this.scrollView.node.height / (this.itemDistanceY)) + 1; this.instantiateCount = this.lieCount; break; case ScrollDirEnum.HORIZONTAL: this.hangCount = Math.ceil(this.scrollView.node.width / (this.itemDistanceX)) + 1; this.lieCount = 1; this.instantiateCount = this.hangCount; break; case ScrollDirEnum.GRID: this.hangCount = Math.floor(this.scrollView.node.width / (this.itemDistanceX)); this.lieCount = Math.ceil(this.scrollView.node.height / (this.itemDistanceY)) + 1; this.instantiateCount = this.hangCount * this.lieCount; break; } }; ScrollFinal.prototype.initScrollView = function (list) { if (list === void 0) { list = []; } var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } // this.scheduleOnce(() => { this.init(); this.clear(); this.clearTag(); this.adapterList = {}; this.itemDataList = list; this.extraParams = args; if (this.outInner == ScrollOutInner.OUT) { this.extraParams.push(this.scrollView); } this.scrollView.stopAutoScroll(); this.showUI(); // }, 0) }; Object.defineProperty(ScrollFinal.prototype, "itemDataList", { get: function () { return this._itemDataList; }, set: function (list) { this._itemDataList = list; if (!this.adapterItem) { return; } // 适配模式,需要去掉记录的信息 var newAdapterList = {}; for (var index = 0; index < list.length; index++) { if (this.adapterList[index]) { newAdapterList[index] = this.adapterList[index]; } } this.adapterList = newAdapterList; switch (this.scrollDir) { case ScrollDirEnum.VERTICAL: this.adapterContentLength = 0; for (var idx in this.adapterList) { this.adapterContentLength = Math.max(Math.abs(this.adapterList[idx].y) + this.adapterList[idx].height / 2); } break; case ScrollDirEnum.HORIZONTAL: this.adapterContentLength = 0; for (var idx in this.adapterList) { this.adapterContentLength = Math.max(this.adapterList[idx].x + this.adapterList[idx].width / 2); } break; } }, enumerable: false, configurable: true }); ScrollFinal.prototype.getPositionInView = function (item) { if (this.scrollView == null) { return cc.v2(0, 0); } var worldPos = item.parent.convertToWorldSpaceAR(item.position); var viewPos = this.scrollView.node.convertToNodeSpaceAR(worldPos); return viewPos; }; ScrollFinal.prototype.onBounceTop = function () { switch (this.scrollDir) { case ScrollDirEnum.HORIZONTAL: break; case ScrollDirEnum.VERTICAL: case ScrollDirEnum.GRID: this.checkScrollState(); if (this.adapterItem) { // @TODO } break; } this.scrollIndex = -1; }; ScrollFinal.prototype.onScroll = function () { var _this = this; this.curScrollPos = 0; if (this.scrollDir == ScrollDirEnum.HORIZONTAL) { this.curScrollPos = this.scrollView.getScrollOffset().x; this.isScrollUp = this.curScrollPos < this.lastScrollPos; } else { this.curScrollPos = this.scrollView.getScrollOffset().y; this.isScrollUp = this.curScrollPos > this.lastScrollPos; } this.lastScrollPos = this.curScrollPos; if (this.scrollView == null) { return; } this.itemList.forEach(function (ele) { _this.tryResetItem(ele); }); }; ScrollFinal.prototype.tryResetItem = function (ele) { switch (this.scrollDir) { case ScrollDirEnum.HORIZONTAL: if (this.curScrollPos >= 0 || this.curScrollPos <= this.scrollMaxOffsetX) { return; } break; case ScrollDirEnum.VERTICAL: case ScrollDirEnum.GRID: if (this.curScrollPos <= -this.realItemHeight / 2 || this.curScrollPos >= this.scrollMaxOffsetY + this.realItemHeight / 2) { return; } } var scrollWidth = this.scrollView.node.width; var scrollHeight = this.scrollView.node.height; var element = ele.node; switch (this.scrollDir) { case ScrollDirEnum.HORIZONTAL: if (this.isScrollUp && this.getPositionInView(element).x < -(scrollWidth * this.node.anchorX + ele.node.width / 2)) { // 超出左边界显示区域 var idx = ele.index + this.instantiateCount; if (idx < this.itemDataList.length) { this.setItemData(element, this.itemDataList[idx], idx); // element.x = element.x + this.hangCount * ele.node.width ele.index = idx; this.setPosX(idx, element); } } else if (!this.isScrollUp && this.getPositionInView(element).x > scrollWidth * (1 - this.node.anchorX) + ele.node.width / 2) { // 超出右边界显示区域 var idx = ele.index - this.instantiateCount; if (idx >= 0) { this.setItemData(element, this.itemDataList[idx], idx); // element.x = element.x - this.hangCount * ele.node.width ele.index = idx; this.setPosX(idx, element); } } break; case ScrollDirEnum.VERTICAL: case ScrollDirEnum.GRID: if (this.isScrollUp && this.getPositionInView(element).y > scrollHeight * (1 - this.node.anchorY) + ele.node.height / 2) { // 超出上边界显示区域 var idx = ele.index + this.instantiateCount; if (idx < this.itemDataList.length && this.isScrollUp) { this.setItemData(element, this.itemDataList[idx], idx); ele.index = idx; this.setPosY(idx, element); } } else if (!this.isScrollUp && this.curScrollPos > -ele.node.height / 2 && this.getPositionInView(element).y < -(scrollHeight * this.node.anchorY + ele.node.height / 2)) { // 超出下边界显示区域 var idx = ele.index - this.instantiateCount; if (idx >= 0 && this.isScrollUp == false) { this.setItemData(element, this.itemDataList[idx], idx); ele.index = idx; this.setPosY(idx, element); } } break; } }; ScrollFinal.prototype.setPosX = function (index, node) { var x = 0; if (this.adapterItem) { if (this.adapterList[index] && this.adapterList[index].x != null) { if (node) { node.x = this.adapterList[index].x; } return this.adapterList[index].x; } else { var lastX = index == 0 ? 0 : this.adapterList[index - 1].x; var lastWidth = index == 0 ? 0 : this.adapterList[index - 1].width; // 上一个坐标 + 当前node偏移量 switch (this.scrollDir) { case ScrollDirEnum.VERTICAL: x = this.scrollView.content.width / 2 + this.padingX; //this.realItemWidth / 2 + this.padingX break; case ScrollDirEnum.HORIZONTAL: x += node.width / 2 + this.padingX + lastX + lastWidth / 2 + this.spacingX; this.adapterContentLength = Math.max(x + node.width / 2); this.setScrollContentSize(); break; case ScrollDirEnum.GRID: x = index % this.hangCount * this.itemDistanceX + this.realItemWidth / 2 + this.padingX; break; } if (this.adapterList[index] == null) { this.adapterList[index] = { x: null, y: null, width: null, height: null }; } this.adapterList[index].x = x; this.adapterList[index].width = node.width; if (node) { node.x = x; } return x; } } else { switch (this.scrollDir) { case ScrollDirEnum.VERTICAL: x = this.scrollView.content.width / 2 + this.padingX; //this.realItemWidth / 2 + this.padingX break; case ScrollDirEnum.HORIZONTAL: x = index * this.itemDistanceX + this.realItemWidth / 2 + this.padingX; if (this.tagIndex >= -1 && index > this.tagIndex) { x += this.tagLang; } break; case ScrollDirEnum.GRID: x = index % this.hangCount * this.itemDistanceX + this.realItemWidth / 2 + this.padingX; break; } if (node) { node.x = x; } return x; } }; ScrollFinal.prototype.setPosY = function (index, node) { var y = 0; if (this.adapterItem) { if (this.adapterList[index] && this.adapterList[index].y != null) { if (node) { node.y = this.adapterList[index].y; } return this.adapterList[index].y; } else { var lastY = index == 0 ? 0 : this.adapterList[index - 1].y; var lastHeight = index == 0 ? 0 : this.adapterList[index - 1].height; switch (this.scrollDir) { case ScrollDirEnum.VERTICAL: y = lastY - this.padingY - node.height / 2 - lastHeight / 2 - this.spacingY; this.adapterContentLength = Math.max(Math.abs(y) + node.height / 2); this.setScrollContentSize(); // y = -index * this.itemDistanceY - this.realItemHeight / 2 - this.padingY // if (this.tagIndex >= -1 && index > this.tagIndex) { // y -= this.tagLang // } break; case ScrollDirEnum.HORIZONTAL: y = -this.scrollView.content.height / 2 + this.padingY; //-this.realItemHeight / 2 - this.padingY break; case ScrollDirEnum.GRID: y = -Math.floor((index) / this.hangCount) * this.itemDistanceY - this.realItemHeight / 2 - this.padingY; if (this.tagIndex >= -1 && (Math.floor(index / this.hangCount)) > this.tagIndex) { y -= this.tagLang; } break; } if (this.adapterList[index] == null) { this.adapterList[index] = { x: null, y: null, width: null, height: null }; } this.adapterList[index].y = y; this.adapterList[index].height = node.height; if (node) { node.y = y; } return y; } } else { switch (this.scrollDir) { case ScrollDirEnum.VERTICAL: y = -index * this.itemDistanceY - this.realItemHeight / 2 - this.padingY; if (this.tagIndex >= -1 && index > this.tagIndex) { y -= this.tagLang; } break; case ScrollDirEnum.HORIZONTAL: y = -this.scrollView.content.height / 2 + this.padingY; //-this.realItemHeight / 2 - this.padingY break; case ScrollDirEnum.GRID: y = -Math.floor((index) / this.hangCount) * this.itemDistanceY - this.realItemHeight / 2 - this.padingY; if (this.tagIndex >= -1 && (Math.floor(index / this.hangCount)) > this.tagIndex) { y -= this.tagLang; } break; } if (node) { node.y = y; } return y; } }; ScrollFinal.prototype.setItemData = function (itemNode, data, index) { try { itemNode.getComponent(this.itemScript).setData(data, index, this.extraParams); } catch (error) { console.error("脚本中缺少setData方法,或者方法报错", error); } }; // refreshItems调用,在刷新时可能需要重置item的index标签 ScrollFinal.prototype.resetIndex = function (index) { if (this.itemDataList[index] != null) { return index; } return this.resetIndex(index - this.instantiateCount); }; // 刷新单独的item ScrollFinal.prototype.refreshItem = function (index, data) { if (this.itemDataList[index] == null) { return; } this.itemDataList[index] = data; if (this.getItem(index) == null) { return; } this.setItemData(this.getItem(index), this.itemDataList[index], index); }; // refreshItem(index: number) { // this.setItemData(this.getItem(index), this.itemDataList[index], index) // } ScrollFinal.prototype.refreshItems = function (itemDataList) { var _this = this; var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } this.itemDataList = itemDataList; if (args.length > 0) { this.extraParams = args; } if (this.outInner == ScrollOutInner.OUT) { this.extraParams.push(this.scrollView); } this.fixItemNodes(); // 最终构造完整的 itemList 列表,刷新数据 this.itemList.forEach(function (element) { try { var newIndex = _this.resetIndex(element.index); element.index = newIndex; _this.setItemData(element.node, _this.itemDataList[element.index], element.index); _this.setPosX(element.index, element.node); _this.setPosY(element.index, element.node); // element.node.getComponent(this.itemScript).setData(this.itemDataList[element.index], element.index, this.extraParams) } catch (error) { console.warn("脚本中缺少refreshItem方法,或者方法报错", error); } }); }; // 数据新增或减少时,增加或减少item ScrollFinal.prototype.fixItemNodes = function () { // 判断是否需要删除 itemList 里的数据 if (this.itemDataList.length < this.instantiateCount && this.itemList.length > this.itemDataList.length) { var needDeleteCount = this.itemList.length - this.itemDataList.length; for (var index = this.itemDataList.length; index < this.itemDataList.length + needDeleteCount; index++) { this.itemList[index].node.destroy(); } this.itemList.splice(this.itemDataList.length, needDeleteCount); // 判断是否需要增加 itemList 里的数据 } else if (this.itemList.length < this.instantiateCount && this.itemList.length < this.itemDataList.length) { var addCount = Math.min(this.instantiateCount - this.itemList.length, this.itemDataList.length - this.itemList.length); var startIndex_1 = 0; this.itemList.forEach(function (element) { startIndex_1 = Math.max(element.index + 1, startIndex_1); }); for (var addIndex = startIndex_1; addIndex < (startIndex_1 + addCount); addIndex++) { this.addItemNode(addIndex, this.itemDataList[addIndex], true); } } if (this.content) { this.setScrollContentSize(); } }; Object.defineProperty(ScrollFinal.prototype, "realItemWidth", { get: function () { return this.itemWidth * this.itemScale; }, enumerable: false, configurable: true }); Object.defineProperty(ScrollFinal.prototype, "realItemHeight", { get: function () { return this.itemHeight * this.itemScale; }, enumerable: false, configurable: true }); ScrollFinal.prototype.initItemNode = function () { if (this.useNodePool) { // @TODO PoolManager return cc.instantiate(this.itemPrefab); // if (this.poolType == PoolEnum.ITEM_BAG) { // return PoolManager.getItemBag(this.itemPrefab) // } else if (this.poolType == PoolEnum.ITEM_BASE) { // return PoolManager.getItemBase(this.itemPrefab) // } } else { return cc.instantiate(this.itemPrefab); } }; // back ScrollFinal.prototype.onScrollBegan = function () { this.scrollIndex = 0; }; ScrollFinal.prototype.showUI = function () { if (this.itemPrefab == null) { console.error("item预制体加载失败"); return; } if (this.scrollView == null) { console.error("没有绑定scroll"); return; } this.setCreateItems(true); this.scrollIndex = -1; this.scrollView.content.setAnchorPoint(0, 1); this.scrollView.content.setPosition(-this.scrollView.node.width / 2, this.scrollView.node.height / 2); this.setScrollContentSize(); switch (this.scrollDir) { case ScrollDirEnum.VERTICAL: this.scrollView.scrollToTop(); break; case ScrollDirEnum.HORIZONTAL: this.scrollView.scrollToLeft(); break; case ScrollDirEnum.GRID: this.scrollView.scrollToTop(); break; } }; ScrollFinal.prototype.setCreateItems = function (bool) { if (bool) { this.scrollView.enabled = false; this.canCreateItem = true; this.createIndex = 0; this.baseIndex = 0; this.life = 0; } else { this.scrollView.enabled = true; this.canCreateItem = false; this.createIndex = 0; this.baseIndex = 0; this.life = 0; } }; ScrollFinal.prototype.update = function (dt) { if (this.scrollIndex >= 0) { this.scrollIndex += dt; } if (!this.canCreateItem) { return; } for (var index = 0; index < this.cnumber; index++) { this.updateForCreateItem(dt); } }; ScrollFinal.prototype.updateForCreateItem = function (dt) { if (!this.canCreateItem) { return; } if (this.life == 0) { // 生 var _itemData = this.itemDataList[this.baseIndex]; if (this.createIndex >= this.instantiateCount || _itemData == null) { this.setCreateItems(false); return; } this.addItemNode(this.baseIndex, _itemData); this.createIndex += 1; this.baseIndex += 1; } this.life += dt; if (this.life >= this.ctime) { this.life = 0; } }; ScrollFinal.prototype.setScrollContentSize = function () { if (this.adapterItem) { switch (this.scrollDir) { case ScrollDirEnum.VERTICAL: this.scrollView.content.setContentSize(this.scrollView.node.width, this.adapterContentLength); break; case ScrollDirEnum.HORIZONTAL: this.scrollView.content.setContentSize(this.adapterContentLength, this.scrollView.node.height); break; case ScrollDirEnum.GRID: this.scrollView.content.setContentSize(this.scrollView.node.width, this.itemDistanceY * Math.ceil(this.itemDataList.length / this.hangCount) + this.padingY + this.tagLang + this.padingY2); break; } } else { switch (this.scrollDir) { case ScrollDirEnum.VERTICAL: this.scrollView.content.setContentSize(this.scrollView.node.width, this.itemDistanceY * this.itemDataList.length + this.padingY + this.tagLang + this.padingY2 - this.spacingY); break; case ScrollDirEnum.HORIZONTAL: this.scrollView.content.setContentSize(this.itemDistanceX * this.itemDataList.length + this.padingX + this.tagLang - this.spacingX, this.scrollView.node.height); break; case ScrollDirEnum.GRID: this.scrollView.content.setContentSize(this.scrollView.node.width, this.itemDistanceY * Math.ceil(this.itemDataList.length / this.hangCount) + this.padingY + this.tagLang + this.padingY2 - this.spacingY); break; } } this.scrollMaxOffsetX = -this.scrollView.getMaxScrollOffset().x; this.scrollMaxOffsetY = this.scrollView.getMaxScrollOffset().y; // console.log("---重新设置了滚动区域", this.scrollView.content.height) }; /** * 弹出详情标签,将会重设后续item的坐标。 * @param index item标签 * @param lang 坐标偏移量 */ ScrollFinal.prototype.setTag = function (index, lang) { var _this = this; this.tagLang = lang; switch (this.scrollDir) { case ScrollDirEnum.VERTICAL: case ScrollDirEnum.HORIZONTAL: this.tagIndex = index; break; case ScrollDirEnum.GRID: this.tagIndex = Math.floor(index / this.hangCount); break; } this.setScrollContentSize(); this.itemList.forEach(function (element) { _this.setPosX(element.index, element.node); _this.setPosY(element.index, element.node); }); }; /**清除详情标签,恢复item默认坐标 */ ScrollFinal.prototype.clearTag = function () { var _this = this; this.setTag(-999, 0); // 修正index和坐标 var scrollHeight = this.scrollView.node.height; this.itemList.forEach(function (ele) { // 判断是否超出边界 if (_this.getPositionInView(ele.node).y > scrollHeight * (1 - _this.node.anchorY) + _this.itemDistanceY / 2) { if (ele.index + _this.instantiateCount < _this.itemDataList.length) { ele.index += _this.instantiateCount; } _this.setPosY(ele.index, ele.node); _this.setItemData(ele.node, _this.itemDataList[ele.index], ele.index); } else if (_this.getPositionInView(ele.node).y < -(scrollHeight * _this.node.anchorY + _this.itemDistanceY / 2)) { if (ele.index - _this.instantiateCount >= 0) { ele.index -= _this.instantiateCount; } _this.setPosY(ele.index, ele.node); _this.setItemData(ele.node, _this.itemDataList[ele.index], ele.index); } }); this.setScrollContentSize(); }; /**删除某个元素 */ ScrollFinal.prototype.del = function (index) { var _this = this; if (this.itemDataList.length < index) { return; } this.itemDataList.splice(index, 1); // // 判断下是否需要删除节点 if (this.itemList.length > this.itemDataList.length) { this.itemList.pop().node.destroy(); } this.setScrollContentSize(); for (var index_1 = 0; index_1 < this.itemList.length; index_1++) { var element = this.itemList[index_1]; if (this.itemDataList[element.index] == null) { element.index -= this.instantiateCount; break; } } this.itemList.forEach(function (element) { _this.setPosX(element.index, element.node); _this.setPosY(element.index, element.node); _this.setItemData(element.node, _this.itemDataList[element.index], element.index); }); }; /**在末尾添加一个元素 */ ScrollFinal.prototype.add = function (data) { this.itemDataList.push(data); // 判断是否需要增加item if (this.itemList.length >= this.instantiateCount) { // 不需要 // 判断下是否需要把最前面的放到最后面:1 var needUpdate = false; for (var index = 0; index < this.itemList.length; index++) { if (this.itemList[index].index == this.itemDataList.length - 2) { needUpdate = true; break; } } if (needUpdate) { var minIndex = 1000; //这个是最小值 var minUpdateIndex = 0; // 这个是最小值的标签 for (var i = 0; i < this.itemList.length; i++) { if (this.itemList[i].index < minIndex) { minIndex = this.itemList[i].index; minUpdateIndex = i; } } // 判断下是否需要把最前面的放到最后面:2 var _nodePos = 0; var _offset = 0; var needUpdate2 = false; switch (this.scrollDir) { case ScrollDirEnum.HORIZONTAL: _nodePos = this.itemList[minUpdateIndex].node.x; _offset = this.scrollView.getScrollOffset().x; needUpdate2 = _nodePos + _offset > this.itemWidth / 2; break; case ScrollDirEnum.VERTICAL: case ScrollDirEnum.GRID: _nodePos = this.itemList[minUpdateIndex].node.y; _offset = this.scrollView.getScrollOffset().y; needUpdate2 = _nodePos + _offset > this.itemHeight / 2; break; } if (needUpdate2) { this.itemList[minUpdateIndex].index += this.instantiateCount; this.setItemData(this.itemList[minUpdateIndex].node, data, this.itemList[minUpdateIndex].index); this.setPosX(this.itemList[minUpdateIndex].index, this.itemList[minUpdateIndex].node); this.setPosY(this.itemList[minUpdateIndex].index, this.itemList[minUpdateIndex].node); } } } else { // 需要 var index = this.itemDataList.length - 1; this.addItemNode(index, data); } this.setScrollContentSize(); }; ScrollFinal.prototype.addItemNode = function (index, data, isRefresh) { if (isRefresh === void 0) { isRefresh = false; } var _node = this.initItemNode(); // add放在前面.先激活onLoad方法,再走setData this.scrollView.content.addChild(_node); this.setItemData(_node, data, index); this.itemList.push({ index: index, node: _node }); this.setPosX(index, _node); this.setPosY(index, _node); if (isRefresh || this.showAnim == 0) { _node.scale = this.itemScale; } else if (this.showAnim == 1) { _node.scale = 0; cc.tween(_node). to(this.animSpeed, { scale: this.itemScale + 0.1 }). to(this.animSpeed, { scale: this.itemScale }). start(); } else if (this.showAnim == 2) { _node.scale = this.itemScale; var delayTime = index % this.hangCount / 20 + 0.1; _node.x -= _node.width / 2; _node.scaleX = 0; cc.tween(_node).delay(delayTime).to(this.animSpeed, { x: _node.x + _node.width / 2, scaleX: this.itemScale }).start(); } else if (this.showAnim == 3) { //@TODO _node.scale = this.itemScale; var delayTime = index % this.hangCount / 20 + 0.1; _node.y += _node.height / 2; _node.scaleY = 0; cc.tween(_node).delay(delayTime).to(this.animSpeed, { y: _node.y - _node.height / 2, scaleY: this.itemScale }).start(); } else if (this.showAnim == 4) { _node.scale = 0; cc.tween(_node). to(this.animSpeed, { scale: this.itemScale }). start(); } else { _node.scale = this.itemScale; } }; /** * @param val 立刻滚动到目标标签,目标标签将在顶部|左侧出现 * @param type 滚到哪里的类型(1.居中 2.顶部|左侧 3.底部|右侧) */ ScrollFinal.prototype.scrollToIndexNow = function (val, type) { if (type === void 0) { type = 1; } var args = []; for (var _i = 2; _i < arguments.length; _i++) { args[_i - 2] = arguments[_i]; } if (this.adapterItem && this.adapterList[val] == null) { console.warn("未展示过,无法移动"); return; } if (val >= this.itemDataList.length) { val = this.itemDataList.length - 1; } if (val < 0) { this.refreshItems(this.itemDataList); return; } this.scrollView.stopAutoScroll(); this.baseIndex = val; var scrollPosIndex = this.baseIndex; if (this.itemDataList.length - this.baseIndex < this.instantiateCount) { this.baseIndex -= this.instantiateCount - (this.itemDataList.length - this.baseIndex); } else { if (type == 1) { this.baseIndex -= Math.ceil(this.instantiateCount / 2); } else if (type == 3) { this.baseIndex -= (this.lieCount - 1) * this.hangCount; } } if (this.scrollDir == ScrollDirEnum.GRID) { this.baseIndex -= this.baseIndex % this.hangCount; } this.baseIndex = Math.max(this.baseIndex, 0); var _itemWidth = this.adapterItem ? this.adapterList[val].width : this.itemWidth; var _itemHeight = this.adapterItem ? this.adapterList[val].height : this.itemHeight; // 从第几个标签开始显示 switch (this.scrollDir) { case ScrollDirEnum.HORIZONTAL: var _x = -(this.setPosX(scrollPosIndex) - (_itemWidth * this.itemScale + this.spacingX) / 2); // 判断是否超过边界 if (_x < this.scrollMaxOffsetX) { scrollPosIndex = this.itemDataList.length - this.instantiateCount; this.scrollView.content.x = this.scrollMaxOffsetX; } else { if (type == 1) { this.scrollView.content.x = Math.min(-(this.setPosX(scrollPosIndex) - this.scrollView.node.width / 2), 0); if (-(this.setPosX(scrollPosIndex) - this.scrollView.node.width / 2) >= 0) { this.baseIndex = 0; } } else if (type == 2) { this.scrollView.content.x = -(this.setPosX(scrollPosIndex) - (_itemWidth * this.itemScale + this.spacingX) / 2); } else { scrollPosIndex++; this.scrollView.content.x = Math.min(-(this.setPosX(scrollPosIndex) - this.scrollView.node.width - _itemWidth / 2 - this.spacingY), 0); if (-(this.setPosX(scrollPosIndex) - this.scrollView.node.width - _itemWidth / 2 - this.spacingY) >= 0) { this.baseIndex = 0; } } } break; case ScrollDirEnum.VERTICAL: case ScrollDirEnum.GRID: var _y = (Math.abs(this.setPosY(scrollPosIndex)) - (_itemHeight * this.itemScale + this.spacingY) / 2); if (_y > this.scrollMaxOffsetY) { scrollPosIndex = this.itemDataList.length - this.instantiateCount; this.scrollView.content.y = this.scrollMaxOffsetY; } else { if (type == 1) { this.scrollView.content.y = Math.max(Math.abs(this.setPosY(scrollPosIndex)) - this.scrollView.node.height / 2, 0); if (Math.abs(this.setPosY(scrollPosIndex)) - this.scrollView.node.height / 2 <= 0) { this.baseIndex = 0; } } else if (type == 2) { this.scrollView.content.y = Math.abs(this.setPosY(scrollPosIndex)) - (_itemHeight * this.itemScale + this.spacingY) / 2; } else { scrollPosIndex = this.scrollDir == ScrollDirEnum.VERTICAL ? (scrollPosIndex + 1) : scrollPosIndex + this.hangCount; this.scrollView.content.y = Math.max(Math.abs(this.setPosY(scrollPosIndex)) - this.scrollView.node.height - _itemHeight / 2 - this.spacingY, 0); if (Math.abs(this.setPosY(scrollPosIndex)) - this.scrollView.node.height - _itemHeight / 2 - this.spacingY <= 0) { this.baseIndex = 0; } } } break; } if (args.length > 0) { this.extraParams = args; } this.fixItemNodes(); // 如果content有子项目,则重制目标点位置 if (this.itemList.length > 0) { for (var index = 0; index < this.itemList.length; index++) { // let i = this.baseIndex + index var elemnet = this.itemList[index]; elemnet.index = this.baseIndex + index; this.setPosX(elemnet.index, elemnet.node); this.setPosY(elemnet.index, elemnet.node); if (gameMethod_1.gameMethod.isEmpty(this.itemDataList[elemnet.index])) { continue; } this.setItemData(elemnet.node, this.itemDataList[elemnet.index], elemnet.index); } } }; /** * 尝试滚动到滚动视图中心 * @param index 标签 * @param type 滚到哪里的类型(1.居中 2.顶部|左侧 3.底部|右侧) * @param time */ ScrollFinal.prototype.scrollToIndex = function (index, type, time, offsetY) { if (type === void 0) { type = 1; } if (time === void 0) { time = 1; } if (offsetY === void 0) { offsetY = 0; } if (this.itemDataList[index] == null) { console.error("不存在此标签"); return; } switch (this.scrollDir) { case ScrollDirEnum.HORIZONTAL: if (type == 1) { this.scrollView.scrollToOffset(cc.v2(this.setPosX(index) - this.scrollView.node.width / 2, this.scrollView.getScrollOffset().y), time); } else if (type == 2) { this.scrollView.scrollToOffset(cc.v2(this.setPosX(index) - this.itemDistanceX / 2, this.scrollView.getScrollOffset().y), time); } else { index++; this.scrollView.scrollToOffset(cc.v2(this.setPosX(index) - this.scrollView.node.width, this.scrollView.getScrollOffset().y - this.itemWidth / 2 - this.spacingX), time); } break; case ScrollDirEnum.VERTICAL: case ScrollDirEnum.GRID: if (type == 1) { this.scrollView.scrollToOffset(cc.v2(this.scrollView.getScrollOffset().x, Math.abs(this.setPosY(index)) - this.scrollView.node.height / 2 - offsetY), time); } else if (type == 2) { this.scrollView.scrollToOffset(cc.v2(this.scrollView.getScrollOffset().x, Math.abs(this.setPosY(index)) - this.itemDistanceY / 2 - offsetY), time); } else { index = this.scrollDir == ScrollDirEnum.VERTICAL ? (index + 1) : index + this.hangCount; this.scrollView.scrollToOffset(cc.v2(this.scrollView.getScrollOffset().x, Math.abs(this.setPosY(index)) - this.scrollView.node.height - this.itemHeight / 2 - this.spacingY - offsetY), time); } break; } // this.scheduleOnce(() => { // this.refreshItem(index) // }, time) }; ScrollFinal.prototype.getItem = function (index) { for (var key in this.itemList) { if (this.itemList[key].index == index) { return this.itemList[key].node; } } return; }; ScrollFinal.prototype.checkScrollState = function () { if (this.scrollIndex > this.itemDataList.length) { this.scrollView.stopAutoScroll(); this.scrollView.scrollToOffset(cc.v2(0, this.scrollMaxOffsetY / 2)); } }; // 使用对象池时,在切换界面时必须使用这个方法,将所有对象放到池中 ScrollFinal.prototype.clear = function () { // @TODO PoolManager if (this.scrollView && this.scrollView.content) { this.scrollView.content.removeAllChildren(); } // if (this.useNodePool) { // this.itemList.forEach(element => { // if (this.poolType == PoolEnum.ITEM_BAG) { // PoolManager.putItemBag(element.node) // } else if (this.poolType == PoolEnum.ITEM_BASE) { // PoolManager.putItemBase(element.node) // } // }); // } else { // if (this.scrollView && this.scrollView.content) { // this.scrollView.content.removeAllChildren() // } // } this.itemDataList = []; this.itemList = []; }; __decorate([ property({ tooltip: "使用对象池" }) ], ScrollFinal.prototype, "useNodePool", void 0); __decorate([ property({ type: PoolEnum, visible: function () { return this.useNodePool; }, tooltip: "对象池类型" }) ], ScrollFinal.prototype, "poolType", void 0); __decorate([ property({ type: ScrollDirEnum, visible: function () { return true; }, tooltip: "滚动类型" }) ], ScrollFinal.prototype, "scrollDir", void 0); __decorate([ property({ type: ScrollOutInner, tooltip: "0=>常规scroll\n1=>外层scroll\n2=>内层scroll" }) ], ScrollFinal.prototype, "outInner", void 0); __decorate([ property({ tooltip: "与滚动层的边界-左" }) ], ScrollFinal.prototype, "padingX", void 0); __decorate([ property({ tooltip: "与滚动层的边界-上" }) ], ScrollFinal.prototype, "padingY", void 0); __decorate([ property({ tooltip: "与滚动层的边界-下" }) ], ScrollFinal.prototype, "padingY2", void 0); __decorate([ property({ visible: function () { return this.scrollDir != ScrollDirEnum.VERTICAL; }, tooltip: "item行间距" }) ], ScrollFinal.prototype, "spacingX", void 0); __decorate([ property({ visible: function () { return this.scrollDir != ScrollDirEnum.HORIZONTAL; }, tooltip: "item列间距" }) ], ScrollFinal.prototype, "spacingY", void 0); __decorate([ property(cc.Prefab) ], ScrollFinal.prototype, "itemPrefab", void 0); __decorate([ property ], ScrollFinal.prototype, "itemScript", void 0); __decorate([ property ], ScrollFinal.prototype, "itemScale", void 0); __decorate([ property({ tooltip: "是否开启滚动惯性" }) ], ScrollFinal.prototype, "inertia", void 0); __decorate([ property({ tooltip: "开启惯性后,在用户停止触摸后滚动多块停止,0表示永不停止,1表示立即停止", visible: function () { return this.inertia == true; }, }) ], ScrollFinal.prototype, "brake", void 0); __decorate([ property({ tooltip: "是否允许滚动内容超过边界,并在停止触摸后回弹" }) ], ScrollFinal.prototype, "elastic", void 0); __decorate([ property({ tooltip: "滚动行为是否会取消子节点上注册的触摸事件", }) ], ScrollFinal.prototype, "cancelInnerEvents", void 0); __decorate([ property({ tooltip: "不支持背包,默认不激活", displayName: "不固定item尺寸" }) ], ScrollFinal.prototype, "adapterItem", void 0); __decorate([ property({ tooltip: "展示生产动画\n0->不展示\n1->缩放动画\n2->x方向压扁拉伸\n3->y方向压扁拉伸\n4->慢缩放" }) ], ScrollFinal.prototype, "showAnim", void 0); __decorate([ property({ tooltip: "单个动画播放速度\n最佳播放速度参考:\n缩放动画->0.1\nx方向压扁拉伸->0.1\ny方向压扁拉伸->0.25\n慢缩放->0.3" }) ], ScrollFinal.prototype, "animSpeed", void 0); __decorate([ property({ tooltip: "创建item的延迟时间,设为0则为每帧生成。\n注意:在所有item刷新完之前,scroll组件的滚动功能将被关闭" }) ], ScrollFinal.prototype, "ctime", void 0); __decorate([ property({ tooltip: "每帧生成item的个数" }) ], ScrollFinal.prototype, "cnumber", void 0); ScrollFinal = __decorate([ ccclass, menu('Scroll/ScrollFinal') ], ScrollFinal); return ScrollFinal; }(cc.Component)); exports.default = ScrollFinal; cc._RF.pop(); } if (nodeEnv) { __define(__module.exports, __require, __module); } else { __quick_compile_project__.registerModuleFunc(__filename, function () { __define(__module.exports, __require, __module); }); } })(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0cy9zY3JpcHQvdXRpbHMvU2Nyb2xsRmluYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsbURBQWtEO0FBQ2xELHFEQUF3RDtBQUN4RCw2Q0FBd0M7QUFDeEMseUNBQW9DO0FBRXBDLFFBQVE7QUFDUixJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ25CLFVBQVU7SUFDVixTQUFTLEVBQUUsQ0FBQztJQUNaLFVBQVU7SUFDVixRQUFRLEVBQUUsQ0FBQztDQUdkLENBQUMsQ0FBQTtBQUVGLE9BQU87QUFDUCxJQUFJLGFBQWEsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ3hCLE9BQU87SUFDUCxRQUFRLEVBQUUsQ0FBQztJQUNYLE9BQU87SUFDUCxVQUFVLEVBQUUsQ0FBQztJQUNiLE9BQU87SUFDUCxJQUFJLEVBQUUsQ0FBQztDQUNWLENBQUMsQ0FBQTtBQUVGLE9BQU87QUFDUCxJQUFJLGNBQWMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ3pCLGFBQWE7SUFDYixPQUFPLEVBQUUsQ0FBQztJQUNWLGFBQWE7SUFDYixHQUFHLEVBQUUsQ0FBQztJQUNOLGFBQWE7SUFDYixLQUFLLEVBQUUsQ0FBQztDQUNYLENBQUMsQ0FBQTtBQVdJLElBQUEsS0FBOEIsRUFBRSxDQUFDLFVBQVUsRUFBekMsT0FBTyxhQUFBLEVBQUUsUUFBUSxjQUFBLEVBQUUsSUFBSSxVQUFrQixDQUFDO0FBR2xEO0lBQXlDLCtCQUFZO0lBQXJEO1FBQUEscUVBNmtDQztRQTVrQ0csMkJBQTJCO1FBQzNCLHNDQUFzQztRQUl0QyxpQkFBVyxHQUFZLEtBQUssQ0FBQTtRQU1wQixjQUFRLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQTtRQVM3QixlQUFTLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQSxDQUFFLE9BQU87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QTdrQ0QsQUE2a0NDLENBN2tDd0MsRUFBRSxDQUFDLFNBQVMsR0E2a0NwRDtrQkE3a0NvQixXQUFXIiwiZmlsZSI6IiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFxuICogQEF1dGhvciAgaHVhbmd4aW4gXG4gKiBAY3RpbWUgICAyMDIwLTA2LTEwXG4gKiBAVmVyc2lvbiBcbiAqICAgICAgU2Nyb2xsRmluYWwxLjAgICAyMDIwLTA2LTEwIGJldGHljYfnuqfvvIzkvb/nlKjmjILovb3pooTliLbkvZNcbiAqICAgICAgU2Nyb2xsRmluYWwxLjEgICAyMDIwLTA4LTExIOaWsOWinuWvueixoeaxoOexu+Wkp+azlVxuICogICAgICBTY3JvbGxGaW5hbDEuMiAgIDIwMjAtMDgtMTcgMS7mlrDlop7lu7bov5/liLfmlrBpdGVt77yM6Ziy5q2i5Zyo5p+Q5LiA5bin55Sf5oiQ6L+H6YePaXRlbeWvvOiHtOWNoemhv+eahOmXrumimFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi7liJ3lp4vnmoTmjqfku7blsZ7mgKforr7nva4oaW5pdOaWueazlSnmlLnkuLrnlLFpbml0U2Nyb2xsVmlld+inpuWPkSjljp/mnKznmoRvbkxvYWTop6blj5HlnKjpgILphY3mqKHlvI/kuIvkvJrkuI3lh4bnoa4pXG4gKiAgICAgIFNjcm9sbEZpbmFsMS4zICAgMjAyMS0wNS0yNiDnjrDlnKjnmoTmu5rliqjoioLngrnkuI3pnIDopoHmiYvliqjmt7vliqBzY3JvbGxWaWV357uE5Lu25LqGXG4gKiAgICAgIFNjcm9sbEZpbmFsMS40ICAgMjAyMi0wNC0xNCDnjrDlnKjlj6/ku6XlnKjliJ3lp4vljJbmiJZyZWZyZXNo5pe2LOeri+WIu+a7muWKqOWIsOafkOS4quS9jee9ruS6hlxuICogICAgICBTY3JvbGxGaW5hbDEuNSAgIDIwMjMtMDYtMjIg5paw5aKeIGFkYXB0ZXJJdGVtICwg5Y+v5ZyoaW5kZXjpppbmrKHlh7rnjrDml7borr7lrprlroPnmoTpq5jluqYo5ZCO57ut5oqK5Yqo5oCB5L+u5pS56KGl5LiKKVxuICogQFRpcHNcbiAqICAgICAg5aSN55So5rua5Yqo6L20IOeUqOadpeWHj+WwkWRyYXdjYWxsXG4gKiAgICAgIOS4jmNjLlNjcm9sbFZpZXfnu4Tku7bkuIDlkIzmjILovb3lnKjkuIDkuKroioLngrnkuIpcbiAqICAgICAgaXRlbeaMgui9veeahOiEmuacrOW/hemhu+a3u+WKoHNldERhdGHmlrnms5XvvIznlKjmnaXkvKDpgJLmlbDmja5cbiAqICAgICAgaXRlbemUmueCueW6lOivpeWcqOS4reW/g1xuICogICAgICDnm67liY1Hcmlk57G75Z6L5Y+q5pSv5oyB5LuO5bem5LiK5Yiw5Y+z5LiL5qih5byPKOWeguebtOa7muWKqCnvvIzlhbbku5blpYfokanmqKHlvI/oh6rlt7HmkJ7lrppcbiAqICAgICAg5rua5Yqo6L2055qE6ZSa54K55b+F6aG75pS+5Zyo5rua5Yqo5YiX6KGo55qE6LW35aeL5L2N572uKOavlOWmguiDjOWMhWdyaWTmqKHlvI/lnKjlt6bkuIrop5LvvIzmiJDlsLHliJfooajlnKjlt6bkuIrop5IpXG4gKiBcbiAqIEBhZGFwdGVySXRlbSAgaXRlbeWmguacieS4jeWumumrmOW6puaXtiznvJbovpHlmajkuK3orr7lrprnmoRpdGVt6ZyA6KaB5Li65pyA5bCP6auY5bqmLOehruS/nWluc3RhbmNl55qE5Liq5pWw5pyA5aSn5YC85piv5q2j56Gu55qEXG4gKiAgICAgIOaUr+aMgeS4jeinhOWImemrmOW6pml0ZW0g6LCo55SoLOaciee8uumZtzpcbiAqICAgICAgMS7lkIzkuIDkuKppdGVt5YaN5qyh6K6+572u5LiN5ZCM6auY5bqm5pe25Lya5Ye6546w6Zeu6aKYKOiLpeimgeS/ruaUuSzpnIDopoHlgZrkuIDkuKrpk77ooajmnaXlhbPogZTliY3lkI5pdGVtKVxuICogICAgICAyLuS7heaUr+aMgeWeguebtOWSjOawtOW5s+aooeW8jyzog4zljIXmqKHlvI/kuI3mlK/mjIEo5rC05bmz5qih5byP5pyq5rWL6K+VKVxuICovXG5cbmltcG9ydCB7IGdhbWVNZXRob2QgfSBmcm9tIFwiLi4vY29tbW9uL2dhbWVNZXRob2RcIjtcbmltcG9ydCB7IENDX05PREVfRVZFTlQgfSBmcm9tIFwiLi4vZGF0YS9jb25zdC9UeXBlQ29uc3RcIjtcbmltcG9ydCBTY3JvbGxJbm5lciBmcm9tIFwiLi9TY3JvbGxJbm5lclwiO1xuaW1wb3J0IFNjcm9sbE91dCBmcm9tIFwiLi9TY3JvbGxPdXRcIjtcblxuLy8g5a+56LGh5rGg57G75Z6LXG5sZXQgUG9vbEVudW0gPSBjYy5FbnVtKHtcbiAgICAvKirpgJrnlKjpgZPlhbcgKi9cbiAgICBJVEVNX0JBU0U6IDAsXG4gICAgLyoq6IOM5YyF6YGT5YW3ICovXG4gICAgSVRFTV9CQUc6IDEsXG4gICAgLy8gLyoq5ZCI5oiQ6YGT5YW3ICovXG4gICAgLy8gSVRFTV9DT01QT1NFOiAyLFxufSlcblxuLy8g5rua5Yqo57G75Z6LXG5sZXQgU2Nyb2xsRGlyRW51bSA9IGNjLkVudW0oe1xuICAgIC8qKuWeguebtCovXG4gICAgVkVSVElDQUw6IDAsXG4gICAgLyoq5rC05bmzKi9cbiAgICBIT1JJWk9OVEFMOiAxLFxuICAgIC8qKuiDjOWMhSovXG4gICAgR1JJRDogMlxufSlcblxuLy8g5rua5Yqo57G75Z6LXG5sZXQgU2Nyb2xsT3V0SW5uZXIgPSBjYy5FbnVtKHtcbiAgICAvKirlpJblsYJzY3JvbGwqL1xuICAgIERFRkFVTFQ6IDAsXG4gICAgLyoq5aSW5bGCc2Nyb2xsKi9cbiAgICBPVVQ6IDEsXG4gICAgLyoq5YaF5bGCc2Nyb2xsKi9cbiAgICBJTk5FUjogMixcbn0pXG5cbmludGVyZmFjZSBBZGFwdGVyTGlzdCB7XG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlcixcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyXG59XG5cbnR5cGUgSXRlbUxpc3QgPSB7IGluZGV4OiBudW1iZXIsIG5vZGU6IGNjLk5vZGUgfVxuXG5jb25zdCB7IGNjY2xhc3MsIHByb3BlcnR5LCBtZW51IH0gPSBjYy5fZGVjb3JhdG9yO1xuQGNjY2xhc3NcbkBtZW51KCdTY3JvbGwvU2Nyb2xsRmluYWwnKVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2Nyb2xsRmluYWwgZXh0ZW5kcyBjYy5Db21wb25lbnQge1xuICAgIC8vIEBwcm9wZXJ0eShjYy5TY3JvbGxWaWV3KVxuICAgIC8vIHNjcm9sbDogY2MuU2Nyb2xsVmlldyB8IG51bGwgPSBudWxsXG4gICAgQHByb3BlcnR5KHtcbiAgICAgICAgdG9vbHRpcDogXCLkvb/nlKjlr7nosaHmsaBcIlxuICAgIH0pXG4gICAgdXNlTm9kZVBvb2w6IGJvb2xlYW4gPSBmYWxzZVxuICAgIEBwcm9wZXJ0eSh7XG4gICAgICAgIHR5cGU6IFBvb2xFbnVtLFxuICAgICAgICB2aXNpYmxlOiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnVzZU5vZGVQb29sIH0sXG4gICAgICAgIHRvb2x0aXA6IFwi5a+56LGh5rGg57G75Z6LXCJcbiAgICB9KVxuICAgIHByaXZhdGUgcG9vbFR5cGUgPSBQb29sRW51bS5JVEVNX0JBU0VcblxuICAgIEBwcm9wZXJ0eSh7XG4gICAgICAgIHR5cGU6IFNjcm9sbERpckVudW0sXG4gICAgICAgIHZpc2libGU6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIHRvb2x0aXA6IFwi5rua5Yqo57G75Z6LXCJcbiAgICB9KVxuICAgIHByaXZhdGUgc2Nyb2xsRGlyID0gU2Nyb2xsRGlyRW51bS5WRVJUSUNBTCAgLy8g5rua5Yqo57G75Z6LXG5cbiAgICBAcHJvcGVydHkoe1xuICAgICAgICB0eXBlOiBTY3JvbGxPdXRJbm5lcixcbiAgICAgICAgdG9vbHRpcDogXCIwPT7luLjop4RzY3JvbGxcXG4xPT7lpJblsYJzY3JvbGxcXG4yPT7lhoXlsYJzY3JvbGxcIlxuICAgIH0pXG4gICAgcHJpdmF0ZSBvdXRJbm5lciA9IFNjcm9sbE91dElubmVyLkRFRkFVTFRcblxuICAgIEBwcm9wZXJ0eSh7IHRvb2x0aXA6IFwi5LiO5rua5Yqo5bGC55qE6L6555WMLeW3plwiIH0pXG4gICAgcGFkaW5nWDogbnVtYmVyID0gMTBcbiAgICBAcHJvcGVydHkoeyB0b29sdGlwOiBcIuS4jua7muWKqOWxgueahOi+ueeVjC3kuIpcIiB9KVxuICAgIHBhZGluZ1k6IG51bWJlciA9IDEwXG4gICAgQHByb3BlcnR5KHsgdG9vbHRpcDogXCLkuI7mu5rliqjlsYLnmoTovrnnlYwt5LiLXCIgfSlcbiAgICBwYWRpbmdZMjogbnVtYmVyID0gMFxuICAgIEBwcm9wZXJ0eSh7XG4gICAgICAgIHZpc2libGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuc2Nyb2xsRGlyICE9IFNjcm9sbERpckVudW0uVkVSVElDQUwgfSwgdG9vbHRpcDogXCJpdGVt6KGM6Ze06LedXCJcbiAgICB9KVxuICAgIHNwYWNpbmdYOiBudW1iZXIgPSAyMFxuICAgIEBwcm9wZXJ0eSh7XG4gICAgICAgIHZpc2libGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuc2Nyb2xsRGlyICE9IFNjcm9sbERpckVudW0uSE9SSVpPTlRBTCB9LCB0b29sdGlwOiBcIml0ZW3liJfpl7Tot51cIlxuICAgIH0pXG4gICAgc3BhY2luZ1k6IG51bWJlciA9IDIwXG5cbiAgICBAcHJvcGVydHkoY2MuUHJlZmFiKVxuICAgIGl0ZW1QcmVmYWI6IGNjLlByZWZhYiA9IG51bGwgICAgLy8gaXRlbei1hOa6kOWKoOi9veWcsOWdgFxuICAgIEBwcm9wZXJ0eVxuICAgIGl0ZW1TY3JpcHQ6IHN0cmluZyA9IFwiXCIgLy8gaXRlbeaMguWcqOeahOiEmuacrOWQjVxuICAgIEBwcm9wZXJ0eVxuICAgIGl0ZW1TY2FsZTogbnVtYmVyID0gMSAgICAvLyBpdGVt57yp5pS+5q+U5L6LXG5cbiAgICBAcHJvcGVydHkoe1xuICAgICAgICB0b29sdGlwOiBcIuaYr+WQpuW8gOWQr+a7muWKqOaDr+aAp1wiXG4gICAgfSlcbiAgICBpbmVydGlhOiBib29sZWFuID0gdHJ1ZVxuICAgIEBwcm9wZXJ0eSh7XG4gICAgICAgIHRvb2x0aXA6IFwi5byA5ZCv5oOv5oCn5ZCOLOWcqOeUqOaIt+WBnOatouinpuaRuOWQjua7muWKqOWkmuWdl+WBnOatoiww6KGo56S65rC45LiN5YGc5q2iLDHooajnpLrnq4vljbPlgZzmraJcIixcbiAgICAgICAgdmlzaWJsZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5pbmVydGlhID09IHRydWUgfSxcbiAgICB9KVxuICAgIGJyYWtlOiBudW1iZXIgPSAwLjc1XG4gICAgQHByb3BlcnR5KHtcbiAgICAgICAgdG9vbHRpcDogXCLmmK/lkKblhYHorrjmu5rliqjlhoXlrrnotoXov4fovrnnlYws5bm25Zyo5YGc5q2i6Kem5pG45ZCO5Zue5by5XCJcbiAgICB9KVxuICAgIGVsYXN0aWM6IGJvb2xlYW4gPSB0cnVlXG4gICAgQHByb3BlcnR5KHtcbiAgICAgICAgdG9vbHRpcDogXCLmu5rliqjooYzkuLrmmK/lkKbkvJrlj5bmtojlrZDoioLngrnkuIrms6jlhoznmoTop6bmkbjkuovku7ZcIixcbiAgICB9KVxuICAgIGNhbmNlbElubmVyRXZlbnRzOiBib29sZWFuID0gdHJ1ZVxuXG4gICAgQHByb3BlcnR5KHtcbiAgICAgICAgdG9vbHRpcDogXCLkuI3mlK/mjIHog4zljIUs6buY6K6k5LiN5r+A5rS7XCIsIC8vIOa/gOa0u+WQjizml6Dms5XlnKjliJ3lp4vljJbml7bnm7TmjqXmu5rliqjliLDmnKrlsZXnpLrov4fnmoRpbmRleOagh+etvuS9jee9rizljbMgc2Nyb2xsVG9JbmRleE5vd+S8muWPl+WIsOmZkOWItlxuICAgICAgICBkaXNwbGF5TmFtZTogXCLkuI3lm7rlrpppdGVt5bC65a+4XCJcbiAgICB9KVxuICAgIGFkYXB0ZXJJdGVtOiBib29sZWFuID0gZmFsc2VcbiAgICBhZGFwdGVyTGlzdDogeyBbaWR4OiBzdHJpbmddOiBBZGFwdGVyTGlzdCB9ID0ge30gLy8g6K6w5b2V6YCC6YWN55qE5Z2Q5qCH5YiX6KGoXG4gICAgYWRhcHRlckNvbnRlbnRMZW5ndGg6IG51bWJlciA9IDAgLy8g5r+A5rS76YCC6YWN5ZCO55qEY29udGVudOmrmOW6plxuXG5cblxuXG4gICAgLy8gQHByb3BlcnR5KHtcbiAgICAvLyAgICAgdG9vbHRpcDogXCLlkK/liqh3aWRnZXTmqKHlvI8o5rOo5oSP5r+A5rS75ZCO5LiN5Y+v5LiO5Y6f55SfY2Mud2lkZ2V05ZCM5pe25L2/55SoKVwiXG4gICAgLy8gfSlcbiAgICAvLyB1c2VXaWRnZXQ6IGJvb2xlYW4gPSBmYWxzZVxuXG4gICAgLy8gQHByb3BlcnR5KHsgdG9vbHRpcDogXCLpgILphY3pobbpg6hcIiwgdmlzaWJsZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy51c2VXaWRnZXQgPT0gdHJ1ZSB9IH0pXG4gICAgLy8gdXNlQWxpZ25Ub3A6IGJvb2xlYW4gPSBmYWxzZVxuICAgIC8vIEBwcm9wZXJ0eSh7IHRvb2x0aXA6IFwi6Led56a754i26IqC54K56aG26YOoXCIsIHZpc2libGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMudXNlQWxpZ25Ub3AgPT0gdHJ1ZSB9IH0pXG4gICAgLy8gd2lkZ2V0VG9wOiBudW1iZXIgPSAwXG4gICAgLy8gQHByb3BlcnR5KHsgdG9vbHRpcDogXCLpgILphY3lupXpg6hcIiwgdmlzaWJsZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy51c2VXaWRnZXQgPT0gdHJ1ZSB9IH0pXG4gICAgLy8gdXNlQWxpZ25Cb3R0b206IGJvb2xlYW4gPSBmYWxzZVxuICAgIC8vIEBwcm9wZXJ0eSh7IHRvb2x0aXA6IFwi6Led56a754i26IqC54K55bqV6YOoXCIsIHZpc2libGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMudXNlQWxpZ25Cb3R0b20gPT0gdHJ1ZSB9IH0pXG4gICAgLy8gd2lkZ2V0Qm90dG9tOiBudW1iZXIgPSAwXG4gICAgLy8gQHByb3BlcnR5KHsgdG9vbHRpcDogXCLpgILphY3lt6bkvqdcIiwgdmlzaWJsZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy51c2VXaWRnZXQgPT0gdHJ1ZSB9IH0pXG4gICAgLy8gdXNlQWxpZ25MZWZ0OiBib29sZWFuID0gZmFsc2VcbiAgICAvLyBAcHJvcGVydHkoeyB0b29sdGlwOiBcIui3neemu+eItuiKgueCueW3puS+p1wiLCB2aXNpYmxlOiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnVzZUFsaWduTGVmdCA9PSB0cnVlIH0gfSlcbiAgICAvLyB3aWRnZXRMZWZ0OiBudW1iZXIgPSAwXG4gICAgLy8gQHByb3BlcnR5KHsgdG9vbHRpcDogXCLpgILphY3lj7PkvqdcIiwgdmlzaWJsZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy51c2VXaWRnZXQgPT0gdHJ1ZSB9IH0pXG4gICAgLy8gdXNlQWxpZ25SaWdodDogYm9vbGVhbiA9IGZhbHNlXG4gICAgLy8gQHByb3BlcnR5KHsgdG9vbHRpcDogXCLot53nprvniLboioLngrnlj7PkvqdcIiwgdmlzaWJsZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy51c2VBbGlnblJpZ2h0ID09IHRydWUgfSB9KVxuICAgIC8vIHdpZGdldFJpZ2h0OiBudW1iZXIgPSAwXG5cbiAgICBAcHJvcGVydHkoe1xuICAgICAgICB0b29sdGlwOiBcIuWxleekuueUn+S6p+WKqOeUu1xcbjAtPuS4jeWxleekulxcbjEtPue8qeaUvuWKqOeUu1xcbjItPnjmlrnlkJHljovmiYHmi4nkvLhcXG4zLT555pa55ZCR5Y6L5omB5ouJ5Ly4XFxuNC0+5oWi57yp5pS+XCJcbiAgICB9KVxuICAgIHNob3dBbmltOiBudW1iZXIgPSAwXG4gICAgQHByb3BlcnR5KHtcbiAgICAgICAgdG9vbHRpcDogXCLljZXkuKrliqjnlLvmkq3mlL7pgJ/luqZcXG7mnIDkvbPmkq3mlL7pgJ/luqblj4LogIPvvJpcXG7nvKnmlL7liqjnlLstPjAuMVxcbnjmlrnlkJHljovmiYHmi4nkvLgtPjAuMVxcbnnmlrnlkJHljovmiYHmi4nkvLgtPjAuMjVcXG7mhaLnvKnmlL4tPjAuM1wiXG4gICAgfSlcbiAgICBhbmltU3BlZWQ6IG51bWJlciA9IDAuMTVcbiAgICBAcHJvcGVydHkoe1xuICAgICAgICB0b29sdGlwOiBcIuWIm+W7uml0ZW3nmoTlu7bov5/ml7bpl7Qs6K6+5Li6MOWImeS4uuavj+W4p+eUn+aIkOOAglxcbuazqOaEjzrlnKjmiYDmnIlpdGVt5Yi35paw5a6M5LmL5YmNLHNjcm9sbOe7hOS7tueahOa7muWKqOWKn+iDveWwhuiiq+WFs+mXrVwiXG4gICAgfSlcbiAgICBjdGltZTogbnVtYmVyID0gMFxuICAgIEBwcm9wZXJ0eSh7XG4gICAgICAgIHRvb2x0aXA6IFwi5q+P5bin55Sf5oiQaXRlbeeahOS4quaVsFwiXG4gICAgfSlcbiAgICBjbnVtYmVyOiBudW1iZXIgPSAxXG5cbiAgICBzY3JvbGxWaWV3OiBjYy5TY3JvbGxWaWV3IHwgU2Nyb2xsT3V0IHwgU2Nyb2xsSW5uZXJcbiAgICBtYXNrOiBjYy5Ob2RlXG4gICAgY29udGVudDogY2MuTm9kZVxuXG4gICAgaXNTY3JvbGxVcDogYm9vbGVhbiA9IGZhbHNlICAgICAgIC8vIOW9k+WJjeW+gOWTquS4quaWueWQkea7muWKqCAgIOW3puWSjOS4iuaYr3RydWVcbiAgICBwcml2YXRlIF9pdGVtRGF0YUxpc3Q6IGFueVtdID0gW10gICAvLyDlvZPliY3mmL7npLrpmLXokKXnmoTmiYDmnInmlbDmja5cbiAgICBwcml2YXRlIGV4dHJhUGFyYW1zOiBhbnlbXSA9IFtdICAgICAvLyDpop3lpJbmlbDmja5cbiAgICBwcml2YXRlIGl0ZW1MaXN0OiBJdGVtTGlzdFtdID0gW10gICAvLyDlrp7kvovljJbnmoRpdGVt5YiX6KGoXG5cbiAgICBwcml2YXRlIGluc3RhbnRpYXRlQ291bnQ6IG51bWJlciA9IDAgICAgLy8gaXRlbeWunuS+i+WMluaVsOmHj1xuICAgIHByaXZhdGUgaGFuZ0NvdW50OiBudW1iZXIgPSAwICAgICAgICAgICAvLyDooYzkuKrmlbBcbiAgICBwcml2YXRlIGxpZUNvdW50OiBudW1iZXIgPSAwICAgICAgICAgICAgLy8g5YiX5Liq5pWwXG4gICAgcHJpdmF0ZSBpdGVtRGlzdGFuY2VYOiBudW1iZXIgPSAwICAgICAgIC8vIGl0ZW3kuK3lv4PngrnkuYvpl7TnmoTot53nprtcbiAgICBwcml2YXRlIGl0ZW1EaXN0YW5jZVk6IG51bWJlciA9IDAgICAgICAgLy8gaXRlbeS4reW/g+eCueS5i+mXtOeahOi3neemu1xuICAgIHByaXZhdGUgc2Nyb2xsTWF4T2Zmc2V0WDogbnVtYmVyID0gMCAgICAvLyDmnIDlpKflj6/mu5rliqjljLrln59YXG4gICAgcHJpdmF0ZSBzY3JvbGxNYXhPZmZzZXRZOiBudW1iZXIgPSAwICAgIC8vIOacgOWkp+WPr+a7muWKqOWMuuWfn1lcbiAgICBwcml2YXRlIHNjcm9sbEluZGV4OiBudW1iZXIgPSAtMSAgICAgICAgIC8vIHNjcm9sbOWPguaVsFxuXG4gICAgcHJpdmF0ZSBsYXN0U2Nyb2xsUG9zOiBudW1iZXIgPSAwICAgICAgIC8v5LiK5LiA5qyh55qE5rua5Yqo5L2N572uXG4gICAgcHJpdmF0ZSBjdXJTY3JvbGxQb3M6IG51bWJlciA9IDAgICAgICAgIC8vIOW9k+WJjea7muWKqOS9jee9rlxuXG4gICAgcHJpdmF0ZSBpdGVtV2lkdGg6IG51bWJlciA9IDEwICAvLyBpdGVt5a695bqmXG4gICAgcHJpdmF0ZSBpdGVtSGVpZ2h0OiBudW1iZXIgPSAxMCAvLyBpdGVt6auY5bqmXG5cbiAgICBwcml2YXRlIHRhZ0xhbmc6IG51bWJlciA9IDBcbiAgICBwcml2YXRlIHRhZ0luZGV4OiBudW1iZXIgPSAtOTk5IC8vIDk5OSDooajnpLrmuIUw54q25oCB77yM5q2k5pe25peg44CQ5o+S5YWl5qCH562+44CRLFxiLTHooajnpLrmoIfnrb7nva7pobbvvIzlhbbku5bljbPlvZPliY3moIfnrb7nmoTkuIvmlrko5Y+z5L6nKeaYvuekulxuXG4gICAgcHJpdmF0ZSBjYW5DcmVhdGVJdGVtOiBib29sZWFuID0gZmFsc2UgIC8vIOWPr+S7peeUn+aIkGl0ZW1cbiAgICBwcml2YXRlIGNyZWF0ZUluZGV4OiBudW1iZXIgPSAwIC8vIOeUn+aIkGl0ZW3nmoTmlbDmja7moIfnrb5cbiAgICBwcml2YXRlIGxpZmU6IG51bWJlciA9IDAgLy8g55Sf5oiQaXRlbeeahOaXtumXtFxuICAgIHByaXZhdGUgYmFzZUluZGV4OiBudW1iZXIgPSAwIC8vIOWfuuehgOagh+etvuS9jee9rlxuXG4gICAgcHJpdmF0ZSBoYXNJbml0OiBib29sZWFuID0gZmFsc2VcblxuICAgIG9uTG9hZCgpIHtcbiAgICAgICAgLy8gaWYgKHRoaXMubm9kZS5nZXRDb21wb25lbnQoY2MuU2Nyb2xsVmlldykgIT0gbnVsbCkge1xuICAgICAgICAvLyAgICAgY29uc29sZS5lcnJvcihcIua7muWKqOiKgueCueaXoOmcgOaMgui9vXNjcm9sbFZpZXfnu4Tku7bkuoZcIilcbiAgICAgICAgLy8gICAgIHJldHVyblxuICAgICAgICAvLyB9XG4gICAgICAgIHRoaXMuaW5pdCgpXG4gICAgfVxuXG4gICAgcmVzZXRTaXplKCkge1xuICAgICAgICBpZiAodGhpcy5tYXNrKSB7XG4gICAgICAgICAgICB0aGlzLm1hc2suc2V0Q29udGVudFNpemUodGhpcy5ub2RlLmdldENvbnRlbnRTaXplKCkpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgICAgICAgLy8gdGhpcy5jb250ZW50LnNldENvbnRlbnRTaXplKHRoaXMubm9kZS5nZXRDb250ZW50U2l6ZSgpKVxuICAgICAgICAgICAgdGhpcy5zZXRTY3JvbGxDb250ZW50U2l6ZSgpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRJbnN0YW50Q291bnQoKVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzSW5pdCkgeyByZXR1cm4gfVxuICAgICAgICAvLy8vLy8vLy8vLy8vLy8g5p6E5bu65rua5Yqo6L20IC8vLy8vLy8vLy8vLy8vL1xuICAgICAgICB0aGlzLnNjcm9sbFZpZXcgPSB0aGlzLm91dElubmVyID09IFNjcm9sbE91dElubmVyLkRFRkFVTFQgPyB0aGlzLmFkZENvbXBvbmVudChjYy5TY3JvbGxWaWV3KSA6XG4gICAgICAgICAgICB0aGlzLm91dElubmVyID09IFNjcm9sbE91dElubmVyLk9VVCA/IHRoaXMuYWRkQ29tcG9uZW50KFNjcm9sbE91dCkgOiB0aGlzLmFkZENvbXBvbmVudChTY3JvbGxJbm5lcilcbiAgICAgICAgLy8gdGhpcy5zY3JvbGxWaWV3ID0gdGhpcy5hZGRDb21wb25lbnQoY2MuU2Nyb2xsVmlldylcbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3Lmhvcml6b250YWwgPSB0aGlzLnNjcm9sbERpciA9PSBTY3JvbGxEaXJFbnVtLkhPUklaT05UQUxcbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3LnZlcnRpY2FsID0gdGhpcy5zY3JvbGxEaXIgIT0gU2Nyb2xsRGlyRW51bS5IT1JJWk9OVEFMXG4gICAgICAgIHRoaXMuc2Nyb2xsVmlldy5pbmVydGlhID0gdGhpcy5pbmVydGlhXG4gICAgICAgIHRoaXMuc2Nyb2xsVmlldy5icmFrZSA9IHRoaXMuYnJha2VcbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3LmVsYXN0aWMgPSB0aGlzLmVsYXN0aWNcbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3LmNhbmNlbElubmVyRXZlbnRzID0gdGhpcy5jYW5jZWxJbm5lckV2ZW50c1xuICAgICAgICAvLy8vLy8vLy8vLy8vLy8g5qOA5rWL5piv5ZCm6ZyA6KaB6YeN5paw6YCC6YWNIC8vLy8vLy8vLy8vLy8vL1xuICAgICAgICBpZiAodGhpcy5ub2RlLmdldENvbXBvbmVudChjYy5XaWRnZXQpKSB7XG4gICAgICAgICAgICB0aGlzLm5vZGUuZ2V0Q29tcG9uZW50KGNjLldpZGdldCkudXBkYXRlQWxpZ25tZW50KClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vLy8vLy8vLy8vLy8vLyDmnoTlu7rmu5rliqjpga7nvakgLy8vLy8vLy8vLy8vLy8vXG4gICAgICAgIHRoaXMubWFzayA9IG5ldyBjYy5Ob2RlKClcbiAgICAgICAgdGhpcy5tYXNrLnBhcmVudCA9IHRoaXMubm9kZVxuICAgICAgICB0aGlzLm1hc2submFtZSA9IFwic2Nyb2xsTWFza1wiXG4gICAgICAgIHRoaXMubWFzay5zZXRDb250ZW50U2l6ZSh0aGlzLm5vZGUuZ2V0Q29udGVudFNpemUoKSlcbiAgICAgICAgdGhpcy5tYXNrLmFkZENvbXBvbmVudChjYy5XaWRnZXQpXG4gICAgICAgIHRoaXMubWFzay5nZXRDb21wb25lbnQoY2MuV2lkZ2V0KS5pc0FsaWduVG9wID0gdHJ1ZVxuICAgICAgICB0aGlzLm1hc2suZ2V0Q29tcG9uZW50KGNjLldpZGdldCkuaXNBbGlnbkJvdHRvbSA9IHRydWVcbiAgICAgICAgdGhpcy5tYXNrLmdldENvbXBvbmVudChjYy5XaWRnZXQpLnRvcCA9IDBcbiAgICAgICAgdGhpcy5tYXNrLmdldENvbXBvbmVudChjYy5XaWRnZXQpLmJvdHRvbSA9IDBcblxuICAgICAgICB0aGlzLm1hc2suYWRkQ29tcG9uZW50KGNjLk1hc2spXG4gICAgICAgIHRoaXMubWFzay5nZXRDb21wb25lbnQoY2MuTWFzaykudHlwZSA9IGNjLk1hc2suVHlwZS5SRUNUXG4gICAgICAgIHRoaXMubWFzay5hbmNob3JYID0gdGhpcy5ub2RlLmFuY2hvclhcbiAgICAgICAgdGhpcy5tYXNrLmFuY2hvclkgPSB0aGlzLm5vZGUuYW5jaG9yWVxuICAgICAgICB0aGlzLm1hc2sueCA9IDBcbiAgICAgICAgdGhpcy5tYXNrLnkgPSAwXG4gICAgICAgIC8vIHdpZGdldOS4jemcgOimgeWKoOS6hlxuICAgICAgICAvLyBsZXQgbWFza1dpZGdldCA9IG1hc2suYWRkQ29tcG9uZW50KGNjLldpZGdldClcbiAgICAgICAgLy8gbWFza1dpZGdldC5pc0FsaWduVG9wID0gdHJ1ZVxuICAgICAgICAvLyBtYXNrV2lkZ2V0LmlzQWxpZ25Cb3R0b20gPSB0cnVlXG4gICAgICAgIC8vIG1hc2tXaWRnZXQuaXNBbGlnbkxlZnQgPSB0cnVlXG4gICAgICAgIC8vIG1hc2tXaWRnZXQuaXNBbGlnblJpZ2h0ID0gdHJ1ZVxuICAgICAgICAvLyBtYXNrV2lkZ2V0LnRvcCA9IDBcbiAgICAgICAgLy8gbWFza1dpZGdldC5ib3R0b20gPSAwXG4gICAgICAgIC8vIG1hc2tXaWRnZXQubGVmdCA9IDBcbiAgICAgICAgLy8gbWFza1dpZGdldC5yaWdodCA9IDBcbiAgICAgICAgLy8vLy8vLy8vLy8vLy8vIOaehOW7uua7muWKqOWGheWuueWZqCAvLy8vLy8vLy8vLy8vLy9cbiAgICAgICAgdGhpcy5jb250ZW50ID0gbmV3IGNjLk5vZGUoKVxuICAgICAgICB0aGlzLmNvbnRlbnQucGFyZW50ID0gdGhpcy5tYXNrXG4gICAgICAgIHRoaXMuY29udGVudC5uYW1lID0gXCJzY3JvbGxDb250ZW50XCJcbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3LmNvbnRlbnQgPSB0aGlzLmNvbnRlbnRcbiAgICAgICAgdGhpcy5jb250ZW50LnNldENvbnRlbnRTaXplKHRoaXMubm9kZS5nZXRDb250ZW50U2l6ZSgpKVxuICAgICAgICB0aGlzLmNvbnRlbnQuYW5jaG9yWCA9IHRoaXMubm9kZS5hbmNob3JYXG4gICAgICAgIHRoaXMuY29udGVudC5hbmNob3JZID0gdGhpcy5ub2RlLmFuY2hvcllcbiAgICAgICAgdGhpcy5jb250ZW50LnggPSAwXG4gICAgICAgIHRoaXMuY29udGVudC55ID0gMFxuXG4gICAgICAgIHRoaXMuaGFzSW5pdCA9IHRydWVcblxuXG4gICAgICAgIHRoaXMuaXRlbVdpZHRoID0gdGhpcy5pdGVtUHJlZmFiLmRhdGEuZ2V0Q29udGVudFNpemUoKS53aWR0aFxuICAgICAgICB0aGlzLml0ZW1IZWlnaHQgPSB0aGlzLml0ZW1QcmVmYWIuZGF0YS5nZXRDb250ZW50U2l6ZSgpLmhlaWdodFxuXG5cbiAgICAgICAgLy8gU0NST0xMX0JPVU5DRV9CT1RUT00gPSAnYm91bmNlLWJvdHRvbScsLy/mu5rliqjop4blm77mu5rliqjliLDpobbpg6jovrnnlYzlubbkuJTlvIDlp4vlm57lvLnml7blj5Hlh7rnmoTkuovku7ZcbiAgICAgICAgLy8gU0NST0xMX0JPVU5DRV9MRUZUID0gJ2JvdW5jZS1sZWZ0JywvL+a7muWKqOinhuWbvua7muWKqOWIsOW6lemDqOi+ueeVjOW5tuS4lOW8gOWni+WbnuW8ueaXtuWPkeWHuueahOS6i+S7tlxuICAgICAgICAvLyBTQ1JPTExfQk9VTkNFX1JJR0hUID0gJ2JvdW5jZS1yaWdodCcsLy/mu5rliqjop4blm77mu5rliqjliLDlt6bovrnnlYzlubbkuJTlvIDlp4vlm57lvLnml7blj5Hlh7rnmoTkuovku7ZcbiAgICAgICAgLy8gU0NST0xMX0JPVU5DRV9UT1AgPSAnYm91bmNlLXRvcCcsLy/mu5rliqjop4blm77mu5rliqjliLDlj7PovrnnlYzlubbkuJTlvIDlp4vlm57lvLnml7blj5Hlh7rnmoTkuovku7ZcblxuICAgICAgICB0aGlzLnNjcm9sbFZpZXcubm9kZS5vbihDQ19OT0RFX0VWRU5ULlNDUk9MTElORywgdGhpcy5vblNjcm9sbCwgdGhpcylcbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3Lm5vZGUub24oQ0NfTk9ERV9FVkVOVC5TQ1JPTExfQkVHQU4sIHRoaXMub25TY3JvbGxCZWdhbiwgdGhpcylcbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3Lm5vZGUub24oQ0NfTk9ERV9FVkVOVC5TQ1JPTExfQk9VTkNFX1RPUCwgdGhpcy5vbkJvdW5jZVRvcCwgdGhpcylcbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3Lm5vZGUub24oQ0NfTk9ERV9FVkVOVC5TQ1JPTExfQk9VTkNFX0JPVFRPTSwgKCkgPT4geyB9LCB0aGlzKVxuICAgICAgICB0aGlzLnNjcm9sbFZpZXcubm9kZS5vbihDQ19OT0RFX0VWRU5ULlNDUk9MTF9CT1VOQ0VfTEVGVCwgKCkgPT4geyB9LCB0aGlzKVxuICAgICAgICB0aGlzLnNjcm9sbFZpZXcubm9kZS5vbihDQ19OT0RFX0VWRU5ULlNDUk9MTF9CT1VOQ0VfUklHSFQsICgpID0+IHsgfSwgdGhpcylcbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3Lm5vZGUub24oQ0NfTk9ERV9FVkVOVC5TQ1JPTExfQk9VTkNFX1RPUCwgKCkgPT4geyB9LCB0aGlzKVxuICAgICAgICB0aGlzLml0ZW1EaXN0YW5jZVggPSB0aGlzLnJlYWxJdGVtV2lkdGggKyB0aGlzLnNwYWNpbmdYXG4gICAgICAgIHRoaXMuaXRlbURpc3RhbmNlWSA9IHRoaXMucmVhbEl0ZW1IZWlnaHQgKyB0aGlzLnNwYWNpbmdZXG5cbiAgICAgICAgdGhpcy5zZXRJbnN0YW50Q291bnQoKVxuXG4gICAgICAgIC8vIC8v55yL5LiL5pyJ5rKh5pyJ5LiN5bqU6K+l5pyJ55qE57uE5Lu2XG4gICAgICAgIC8vIC8vIExheW91dFxuICAgICAgICAvLyBpZiAodGhpcy5zY3JvbGxWaWV3LmNvbnRlbnQuZ2V0Q29tcG9uZW50KGNjLkxheW91dCkpIHtcbiAgICAgICAgLy8gICAgIGNvbnNvbGUuZXJyb3IoXCJzY3JvbGxGaW5hbCDkuI4gbGF5b3V0IOWGsueqgSzmuIXliKDpmaQgY29udGVudCDkuK3nmoQgbGF5b3V0IOe7hOS7tlwiKVxuICAgICAgICAvLyB9XG4gICAgICAgIC8vIC8vIFdpZGdldFxuICAgICAgICAvLyBpZiAodGhpcy5zY3JvbGxWaWV3Lm5vZGUuZ2V0Q29tcG9uZW50KGNjLldpZGdldCkpIHtcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLnNjcm9sbFZpZXcubm9kZS5nZXRDb21wb25lbnQoY2MuV2lkZ2V0KS5pc0FsaWduVG9wICYmXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5zY3JvbGxWaWV3Lm5vZGUuZ2V0Q29tcG9uZW50KGNjLldpZGdldCkuaXNBbGlnbkJvdHRvbSkge1xuICAgICAgICAvLyAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCLkuI3og73nlKh3aWRnZXTlgZrplb/luqbpgILphY0o5Zug5Li6V2lkZ2V055qE5bu26L+fKSzlj6rlj6/nlKjkvZzlnZDmoIfpgILphY1cIilcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuICAgIH1cbiAgICBwcml2YXRlIHNldEluc3RhbnRDb3VudCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsVmlldyA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHRoaXMuc2Nyb2xsRGlyKSB7XG4gICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uVkVSVElDQUw6XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5nQ291bnQgPSAxXG4gICAgICAgICAgICAgICAgdGhpcy5saWVDb3VudCA9IE1hdGguY2VpbCh0aGlzLnNjcm9sbFZpZXcubm9kZS5oZWlnaHQgLyAodGhpcy5pdGVtRGlzdGFuY2VZKSkgKyAxXG4gICAgICAgICAgICAgICAgdGhpcy5pbnN0YW50aWF0ZUNvdW50ID0gdGhpcy5saWVDb3VudFxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uSE9SSVpPTlRBTDpcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmdDb3VudCA9IE1hdGguY2VpbCh0aGlzLnNjcm9sbFZpZXcubm9kZS53aWR0aCAvICh0aGlzLml0ZW1EaXN0YW5jZVgpKSArIDFcbiAgICAgICAgICAgICAgICB0aGlzLmxpZUNvdW50ID0gMVxuICAgICAgICAgICAgICAgIHRoaXMuaW5zdGFudGlhdGVDb3VudCA9IHRoaXMuaGFuZ0NvdW50XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5HUklEOlxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZ0NvdW50ID0gTWF0aC5mbG9vcih0aGlzLnNjcm9sbFZpZXcubm9kZS53aWR0aCAvICh0aGlzLml0ZW1EaXN0YW5jZVgpKVxuICAgICAgICAgICAgICAgIHRoaXMubGllQ291bnQgPSBNYXRoLmNlaWwodGhpcy5zY3JvbGxWaWV3Lm5vZGUuaGVpZ2h0IC8gKHRoaXMuaXRlbURpc3RhbmNlWSkpICsgMVxuICAgICAgICAgICAgICAgIHRoaXMuaW5zdGFudGlhdGVDb3VudCA9IHRoaXMuaGFuZ0NvdW50ICogdGhpcy5saWVDb3VudFxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbml0U2Nyb2xsVmlldyhsaXN0OiBhbnlbXSA9IFtdLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAvLyB0aGlzLnNjaGVkdWxlT25jZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuaW5pdCgpXG4gICAgICAgIHRoaXMuY2xlYXIoKVxuICAgICAgICB0aGlzLmNsZWFyVGFnKClcbiAgICAgICAgdGhpcy5hZGFwdGVyTGlzdCA9IHt9XG4gICAgICAgIHRoaXMuaXRlbURhdGFMaXN0ID0gbGlzdFxuICAgICAgICB0aGlzLmV4dHJhUGFyYW1zID0gYXJnc1xuICAgICAgICBpZiAodGhpcy5vdXRJbm5lciA9PSBTY3JvbGxPdXRJbm5lci5PVVQpIHtcbiAgICAgICAgICAgIHRoaXMuZXh0cmFQYXJhbXMucHVzaCh0aGlzLnNjcm9sbFZpZXcpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3LnN0b3BBdXRvU2Nyb2xsKClcbiAgICAgICAgdGhpcy5zaG93VUkoKVxuICAgICAgICAvLyB9LCAwKVxuICAgIH1cblxuICAgIHNldCBpdGVtRGF0YUxpc3QobGlzdDogYW55W10pIHtcbiAgICAgICAgdGhpcy5faXRlbURhdGFMaXN0ID0gbGlzdFxuICAgICAgICBpZiAoIXRoaXMuYWRhcHRlckl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIC8vIOmAgumFjeaooeW8jyzpnIDopoHljrvmjonorrDlvZXnmoTkv6Hmga9cbiAgICAgICAgbGV0IG5ld0FkYXB0ZXJMaXN0OiB7IFtpZHg6IHN0cmluZ106IEFkYXB0ZXJMaXN0IH0gPSB7fVxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGlzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFkYXB0ZXJMaXN0W2luZGV4XSkge1xuICAgICAgICAgICAgICAgIG5ld0FkYXB0ZXJMaXN0W2luZGV4XSA9IHRoaXMuYWRhcHRlckxpc3RbaW5kZXhdXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGFwdGVyTGlzdCA9IG5ld0FkYXB0ZXJMaXN0XG4gICAgICAgIHN3aXRjaCAodGhpcy5zY3JvbGxEaXIpIHtcbiAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5WRVJUSUNBTDpcbiAgICAgICAgICAgICAgICB0aGlzLmFkYXB0ZXJDb250ZW50TGVuZ3RoID0gMFxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaWR4IGluIHRoaXMuYWRhcHRlckxpc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGFwdGVyQ29udGVudExlbmd0aCA9IE1hdGgubWF4KE1hdGguYWJzKHRoaXMuYWRhcHRlckxpc3RbaWR4XS55KSArIHRoaXMuYWRhcHRlckxpc3RbaWR4XS5oZWlnaHQgLyAyKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgY2FzZSBTY3JvbGxEaXJFbnVtLkhPUklaT05UQUw6XG4gICAgICAgICAgICAgICAgdGhpcy5hZGFwdGVyQ29udGVudExlbmd0aCA9IDBcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGlkeCBpbiB0aGlzLmFkYXB0ZXJMaXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRhcHRlckNvbnRlbnRMZW5ndGggPSBNYXRoLm1heCh0aGlzLmFkYXB0ZXJMaXN0W2lkeF0ueCArIHRoaXMuYWRhcHRlckxpc3RbaWR4XS53aWR0aCAvIDIpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGl0ZW1EYXRhTGlzdCgpOiBhbnlbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pdGVtRGF0YUxpc3RcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFBvc2l0aW9uSW5WaWV3KGl0ZW06IGNjLk5vZGUpOiB7IHg6IG51bWJlciwgeTogbnVtYmVyIH0ge1xuICAgICAgICBpZiAodGhpcy5zY3JvbGxWaWV3ID09IG51bGwpIHsgcmV0dXJuIGNjLnYyKDAsIDApIH1cbiAgICAgICAgbGV0IHdvcmxkUG9zID0gaXRlbS5wYXJlbnQuY29udmVydFRvV29ybGRTcGFjZUFSKGl0ZW0ucG9zaXRpb24pO1xuICAgICAgICBsZXQgdmlld1BvcyA9IHRoaXMuc2Nyb2xsVmlldy5ub2RlLmNvbnZlcnRUb05vZGVTcGFjZUFSKHdvcmxkUG9zKTtcbiAgICAgICAgcmV0dXJuIHZpZXdQb3M7XG4gICAgfVxuICAgIHByaXZhdGUgb25Cb3VuY2VUb3AoKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5zY3JvbGxEaXIpIHtcbiAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5IT1JJWk9OVEFMOlxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uVkVSVElDQUw6XG4gICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uR1JJRDpcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrU2Nyb2xsU3RhdGUoKVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFkYXB0ZXJJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEBUT0RPXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zY3JvbGxJbmRleCA9IC0xXG4gICAgfVxuICAgIHByaXZhdGUgb25TY3JvbGwoKSB7XG4gICAgICAgIHRoaXMuY3VyU2Nyb2xsUG9zID0gMFxuICAgICAgICBpZiAodGhpcy5zY3JvbGxEaXIgPT0gU2Nyb2xsRGlyRW51bS5IT1JJWk9OVEFMKSB7XG4gICAgICAgICAgICB0aGlzLmN1clNjcm9sbFBvcyA9IHRoaXMuc2Nyb2xsVmlldy5nZXRTY3JvbGxPZmZzZXQoKS54XG4gICAgICAgICAgICB0aGlzLmlzU2Nyb2xsVXAgPSB0aGlzLmN1clNjcm9sbFBvcyA8IHRoaXMubGFzdFNjcm9sbFBvc1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdXJTY3JvbGxQb3MgPSB0aGlzLnNjcm9sbFZpZXcuZ2V0U2Nyb2xsT2Zmc2V0KCkueVxuICAgICAgICAgICAgdGhpcy5pc1Njcm9sbFVwID0gdGhpcy5jdXJTY3JvbGxQb3MgPiB0aGlzLmxhc3RTY3JvbGxQb3NcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxhc3RTY3JvbGxQb3MgPSB0aGlzLmN1clNjcm9sbFBvc1xuXG4gICAgICAgIGlmICh0aGlzLnNjcm9sbFZpZXcgPT0gbnVsbCkgeyByZXR1cm4gfVxuXG4gICAgICAgIHRoaXMuaXRlbUxpc3QuZm9yRWFjaChlbGUgPT4ge1xuICAgICAgICAgICAgdGhpcy50cnlSZXNldEl0ZW0oZWxlKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHByaXZhdGUgdHJ5UmVzZXRJdGVtKGVsZTogSXRlbUxpc3QpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnNjcm9sbERpcikge1xuICAgICAgICAgICAgY2FzZSBTY3JvbGxEaXJFbnVtLkhPUklaT05UQUw6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VyU2Nyb2xsUG9zID49IDAgfHwgdGhpcy5jdXJTY3JvbGxQb3MgPD0gdGhpcy5zY3JvbGxNYXhPZmZzZXRYKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgY2FzZSBTY3JvbGxEaXJFbnVtLlZFUlRJQ0FMOlxuICAgICAgICAgICAgY2FzZSBTY3JvbGxEaXJFbnVtLkdSSUQ6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VyU2Nyb2xsUG9zIDw9IC10aGlzLnJlYWxJdGVtSGVpZ2h0IC8gMiB8fCB0aGlzLmN1clNjcm9sbFBvcyA+PSB0aGlzLnNjcm9sbE1heE9mZnNldFkgKyB0aGlzLnJlYWxJdGVtSGVpZ2h0IC8gMikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNjcm9sbFdpZHRoID0gdGhpcy5zY3JvbGxWaWV3Lm5vZGUud2lkdGhcbiAgICAgICAgbGV0IHNjcm9sbEhlaWdodCA9IHRoaXMuc2Nyb2xsVmlldy5ub2RlLmhlaWdodFxuICAgICAgICBsZXQgZWxlbWVudCA9IGVsZS5ub2RlXG4gICAgICAgIHN3aXRjaCAodGhpcy5zY3JvbGxEaXIpIHtcbiAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5IT1JJWk9OVEFMOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzU2Nyb2xsVXAgJiYgdGhpcy5nZXRQb3NpdGlvbkluVmlldyhlbGVtZW50KS54IDwgLShzY3JvbGxXaWR0aCAqIHRoaXMubm9kZS5hbmNob3JYICsgZWxlLm5vZGUud2lkdGggLyAyKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyDotoXlh7rlt6bovrnnlYzmmL7npLrljLrln59cbiAgICAgICAgICAgICAgICAgICAgbGV0IGlkeCA9IGVsZS5pbmRleCArIHRoaXMuaW5zdGFudGlhdGVDb3VudFxuICAgICAgICAgICAgICAgICAgICBpZiAoaWR4IDwgdGhpcy5pdGVtRGF0YUxpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEl0ZW1EYXRhKGVsZW1lbnQsIHRoaXMuaXRlbURhdGFMaXN0W2lkeF0sIGlkeClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnQueCA9IGVsZW1lbnQueCArIHRoaXMuaGFuZ0NvdW50ICogZWxlLm5vZGUud2lkdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZS5pbmRleCA9IGlkeFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRQb3NYKGlkeCwgZWxlbWVudClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNTY3JvbGxVcCAmJiB0aGlzLmdldFBvc2l0aW9uSW5WaWV3KGVsZW1lbnQpLnggPiBzY3JvbGxXaWR0aCAqICgxIC0gdGhpcy5ub2RlLmFuY2hvclgpICsgZWxlLm5vZGUud2lkdGggLyAyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIOi2heWHuuWPs+i+ueeVjOaYvuekuuWMuuWfn1xuICAgICAgICAgICAgICAgICAgICBsZXQgaWR4ID0gZWxlLmluZGV4IC0gdGhpcy5pbnN0YW50aWF0ZUNvdW50XG4gICAgICAgICAgICAgICAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRJdGVtRGF0YShlbGVtZW50LCB0aGlzLml0ZW1EYXRhTGlzdFtpZHhdLCBpZHgpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50LnggPSBlbGVtZW50LnggLSB0aGlzLmhhbmdDb3VudCAqIGVsZS5ub2RlLndpZHRoXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGUuaW5kZXggPSBpZHhcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UG9zWChpZHgsIGVsZW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5WRVJUSUNBTDpcbiAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5HUklEOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzU2Nyb2xsVXAgJiYgdGhpcy5nZXRQb3NpdGlvbkluVmlldyhlbGVtZW50KS55ID4gc2Nyb2xsSGVpZ2h0ICogKDEgLSB0aGlzLm5vZGUuYW5jaG9yWSkgKyBlbGUubm9kZS5oZWlnaHQgLyAyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIOi2heWHuuS4iui+ueeVjOaYvuekuuWMuuWfn1xuICAgICAgICAgICAgICAgICAgICBsZXQgaWR4ID0gZWxlLmluZGV4ICsgdGhpcy5pbnN0YW50aWF0ZUNvdW50XG4gICAgICAgICAgICAgICAgICAgIGlmIChpZHggPCB0aGlzLml0ZW1EYXRhTGlzdC5sZW5ndGggJiYgdGhpcy5pc1Njcm9sbFVwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEl0ZW1EYXRhKGVsZW1lbnQsIHRoaXMuaXRlbURhdGFMaXN0W2lkeF0sIGlkeClcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZS5pbmRleCA9IGlkeFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRQb3NZKGlkeCwgZWxlbWVudClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNTY3JvbGxVcCAmJiB0aGlzLmN1clNjcm9sbFBvcyA+IC1lbGUubm9kZS5oZWlnaHQgLyAyICYmIHRoaXMuZ2V0UG9zaXRpb25JblZpZXcoZWxlbWVudCkueSA8IC0oc2Nyb2xsSGVpZ2h0ICogdGhpcy5ub2RlLmFuY2hvclkgKyBlbGUubm9kZS5oZWlnaHQgLyAyKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyDotoXlh7rkuIvovrnnlYzmmL7npLrljLrln59cbiAgICAgICAgICAgICAgICAgICAgbGV0IGlkeCA9IGVsZS5pbmRleCAtIHRoaXMuaW5zdGFudGlhdGVDb3VudFxuICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ID49IDAgJiYgdGhpcy5pc1Njcm9sbFVwID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEl0ZW1EYXRhKGVsZW1lbnQsIHRoaXMuaXRlbURhdGFMaXN0W2lkeF0sIGlkeClcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZS5pbmRleCA9IGlkeFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRQb3NZKGlkeCwgZWxlbWVudClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIHNldFBvc1goaW5kZXg6IG51bWJlciwgbm9kZT86IGNjLk5vZGUpOiBudW1iZXIge1xuICAgICAgICBsZXQgeCA9IDBcbiAgICAgICAgaWYgKHRoaXMuYWRhcHRlckl0ZW0pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFkYXB0ZXJMaXN0W2luZGV4XSAmJiB0aGlzLmFkYXB0ZXJMaXN0W2luZGV4XS54ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLnggPSB0aGlzLmFkYXB0ZXJMaXN0W2luZGV4XS54XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXJMaXN0W2luZGV4XS54XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBsYXN0WCA9IGluZGV4ID09IDAgPyAwIDogdGhpcy5hZGFwdGVyTGlzdFtpbmRleCAtIDFdLnhcbiAgICAgICAgICAgICAgICBsZXQgbGFzdFdpZHRoID0gaW5kZXggPT0gMCA/IDAgOiB0aGlzLmFkYXB0ZXJMaXN0W2luZGV4IC0gMV0ud2lkdGhcbiAgICAgICAgICAgICAgICAvLyDkuIrkuIDkuKrlnZDmoIcgKyDlvZPliY1ub2Rl5YGP56e76YePXG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLnNjcm9sbERpcikge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uVkVSVElDQUw6XG4gICAgICAgICAgICAgICAgICAgICAgICB4ID0gdGhpcy5zY3JvbGxWaWV3LmNvbnRlbnQud2lkdGggLyAyICsgdGhpcy5wYWRpbmdYLy90aGlzLnJlYWxJdGVtV2lkdGggLyAyICsgdGhpcy5wYWRpbmdYXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uSE9SSVpPTlRBTDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHggKz0gbm9kZS53aWR0aCAvIDIgKyB0aGlzLnBhZGluZ1ggKyBsYXN0WCArIGxhc3RXaWR0aCAvIDIgKyB0aGlzLnNwYWNpbmdYXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkYXB0ZXJDb250ZW50TGVuZ3RoID0gTWF0aC5tYXgoeCArIG5vZGUud2lkdGggLyAyKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTY3JvbGxDb250ZW50U2l6ZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uR1JJRDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBpbmRleCAlIHRoaXMuaGFuZ0NvdW50ICogdGhpcy5pdGVtRGlzdGFuY2VYICsgdGhpcy5yZWFsSXRlbVdpZHRoIC8gMiArIHRoaXMucGFkaW5nWFxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWRhcHRlckxpc3RbaW5kZXhdID09IG51bGwpIHsgdGhpcy5hZGFwdGVyTGlzdFtpbmRleF0gPSB7IHg6IG51bGwsIHk6IG51bGwsIHdpZHRoOiBudWxsLCBoZWlnaHQ6IG51bGwgfSB9XG4gICAgICAgICAgICAgICAgdGhpcy5hZGFwdGVyTGlzdFtpbmRleF0ueCA9IHhcbiAgICAgICAgICAgICAgICB0aGlzLmFkYXB0ZXJMaXN0W2luZGV4XS53aWR0aCA9IG5vZGUud2lkdGhcbiAgICAgICAgICAgICAgICBpZiAobm9kZSkgeyBub2RlLnggPSB4IH1cbiAgICAgICAgICAgICAgICByZXR1cm4geFxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnNjcm9sbERpcikge1xuICAgICAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5WRVJUSUNBTDpcbiAgICAgICAgICAgICAgICAgICAgeCA9IHRoaXMuc2Nyb2xsVmlldy5jb250ZW50LndpZHRoIC8gMiArIHRoaXMucGFkaW5nWC8vdGhpcy5yZWFsSXRlbVdpZHRoIC8gMiArIHRoaXMucGFkaW5nWFxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5IT1JJWk9OVEFMOlxuICAgICAgICAgICAgICAgICAgICB4ID0gaW5kZXggKiB0aGlzLml0ZW1EaXN0YW5jZVggKyB0aGlzLnJlYWxJdGVtV2lkdGggLyAyICsgdGhpcy5wYWRpbmdYXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRhZ0luZGV4ID49IC0xICYmIGluZGV4ID4gdGhpcy50YWdJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgeCArPSB0aGlzLnRhZ0xhbmdcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5HUklEOlxuICAgICAgICAgICAgICAgICAgICB4ID0gaW5kZXggJSB0aGlzLmhhbmdDb3VudCAqIHRoaXMuaXRlbURpc3RhbmNlWCArIHRoaXMucmVhbEl0ZW1XaWR0aCAvIDIgKyB0aGlzLnBhZGluZ1hcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICAgICAgbm9kZS54ID0geFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHhcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIHNldFBvc1koaW5kZXg6IG51bWJlciwgbm9kZT86IGNjLk5vZGUpOiBudW1iZXIge1xuICAgICAgICBsZXQgeSA9IDBcbiAgICAgICAgaWYgKHRoaXMuYWRhcHRlckl0ZW0pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFkYXB0ZXJMaXN0W2luZGV4XSAmJiB0aGlzLmFkYXB0ZXJMaXN0W2luZGV4XS55ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLnkgPSB0aGlzLmFkYXB0ZXJMaXN0W2luZGV4XS55XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXJMaXN0W2luZGV4XS55XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBsYXN0WSA9IGluZGV4ID09IDAgPyAwIDogdGhpcy5hZGFwdGVyTGlzdFtpbmRleCAtIDFdLnlcbiAgICAgICAgICAgICAgICBsZXQgbGFzdEhlaWdodCA9IGluZGV4ID09IDAgPyAwIDogdGhpcy5hZGFwdGVyTGlzdFtpbmRleCAtIDFdLmhlaWdodFxuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zY3JvbGxEaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBTY3JvbGxEaXJFbnVtLlZFUlRJQ0FMOlxuICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGxhc3RZIC0gdGhpcy5wYWRpbmdZIC0gbm9kZS5oZWlnaHQgLyAyIC0gbGFzdEhlaWdodCAvIDIgLSB0aGlzLnNwYWNpbmdZXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkYXB0ZXJDb250ZW50TGVuZ3RoID0gTWF0aC5tYXgoTWF0aC5hYnMoeSkgKyBub2RlLmhlaWdodCAvIDIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFNjcm9sbENvbnRlbnRTaXplKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHkgPSAtaW5kZXggKiB0aGlzLml0ZW1EaXN0YW5jZVkgLSB0aGlzLnJlYWxJdGVtSGVpZ2h0IC8gMiAtIHRoaXMucGFkaW5nWVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHRoaXMudGFnSW5kZXggPj0gLTEgJiYgaW5kZXggPiB0aGlzLnRhZ0luZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgeSAtPSB0aGlzLnRhZ0xhbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5IT1JJWk9OVEFMOlxuICAgICAgICAgICAgICAgICAgICAgICAgeSA9IC10aGlzLnNjcm9sbFZpZXcuY29udGVudC5oZWlnaHQgLyAyICsgdGhpcy5wYWRpbmdZLy8tdGhpcy5yZWFsSXRlbUhlaWdodCAvIDIgLSB0aGlzLnBhZGluZ1lcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5HUklEOlxuICAgICAgICAgICAgICAgICAgICAgICAgeSA9IC1NYXRoLmZsb29yKChpbmRleCkgLyB0aGlzLmhhbmdDb3VudCkgKiB0aGlzLml0ZW1EaXN0YW5jZVkgLSB0aGlzLnJlYWxJdGVtSGVpZ2h0IC8gMiAtIHRoaXMucGFkaW5nWVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGFnSW5kZXggPj0gLTEgJiYgKE1hdGguZmxvb3IoaW5kZXggLyB0aGlzLmhhbmdDb3VudCkpID4gdGhpcy50YWdJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgLT0gdGhpcy50YWdMYW5nXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hZGFwdGVyTGlzdFtpbmRleF0gPT0gbnVsbCkgeyB0aGlzLmFkYXB0ZXJMaXN0W2luZGV4XSA9IHsgeDogbnVsbCwgeTogbnVsbCwgd2lkdGg6IG51bGwsIGhlaWdodDogbnVsbCB9IH1cbiAgICAgICAgICAgICAgICB0aGlzLmFkYXB0ZXJMaXN0W2luZGV4XS55ID0geVxuICAgICAgICAgICAgICAgIHRoaXMuYWRhcHRlckxpc3RbaW5kZXhdLmhlaWdodCA9IG5vZGUuaGVpZ2h0XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUpIHsgbm9kZS55ID0geSB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zY3JvbGxEaXIpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uVkVSVElDQUw6XG4gICAgICAgICAgICAgICAgICAgIHkgPSAtaW5kZXggKiB0aGlzLml0ZW1EaXN0YW5jZVkgLSB0aGlzLnJlYWxJdGVtSGVpZ2h0IC8gMiAtIHRoaXMucGFkaW5nWVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50YWdJbmRleCA+PSAtMSAmJiBpbmRleCA+IHRoaXMudGFnSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHkgLT0gdGhpcy50YWdMYW5nXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uSE9SSVpPTlRBTDpcbiAgICAgICAgICAgICAgICAgICAgeSA9IC10aGlzLnNjcm9sbFZpZXcuY29udGVudC5oZWlnaHQgLyAyICsgdGhpcy5wYWRpbmdZLy8tdGhpcy5yZWFsSXRlbUhlaWdodCAvIDIgLSB0aGlzLnBhZGluZ1lcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uR1JJRDpcbiAgICAgICAgICAgICAgICAgICAgeSA9IC1NYXRoLmZsb29yKChpbmRleCkgLyB0aGlzLmhhbmdDb3VudCkgKiB0aGlzLml0ZW1EaXN0YW5jZVkgLSB0aGlzLnJlYWxJdGVtSGVpZ2h0IC8gMiAtIHRoaXMucGFkaW5nWVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50YWdJbmRleCA+PSAtMSAmJiAoTWF0aC5mbG9vcihpbmRleCAvIHRoaXMuaGFuZ0NvdW50KSkgPiB0aGlzLnRhZ0luZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB5IC09IHRoaXMudGFnTGFuZ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgIG5vZGUueSA9IHlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB5XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEl0ZW1EYXRhKGl0ZW1Ob2RlOiBjYy5Ob2RlLCBkYXRhOiBhbnksIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGl0ZW1Ob2RlLmdldENvbXBvbmVudCh0aGlzLml0ZW1TY3JpcHQpLnNldERhdGEoZGF0YSwgaW5kZXgsIHRoaXMuZXh0cmFQYXJhbXMpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwi6ISa5pys5Lit57y65bCRc2V0RGF0YeaWueazle+8jOaIluiAheaWueazleaKpemUmVwiLCBlcnJvcilcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJlZnJlc2hJdGVtc+iwg+eUqO+8jOWcqOWIt+aWsOaXtuWPr+iDvemcgOimgemHjee9rml0ZW3nmoRpbmRleOagh+etvlxuICAgIHByaXZhdGUgcmVzZXRJbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMuaXRlbURhdGFMaXN0W2luZGV4XSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5kZXhcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yZXNldEluZGV4KGluZGV4IC0gdGhpcy5pbnN0YW50aWF0ZUNvdW50KVxuICAgIH1cblxuICAgIC8vIOWIt+aWsOWNleeLrOeahGl0ZW1cbiAgICByZWZyZXNoSXRlbShpbmRleDogbnVtYmVyLCBkYXRhKSB7XG4gICAgICAgIGlmICh0aGlzLml0ZW1EYXRhTGlzdFtpbmRleF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pdGVtRGF0YUxpc3RbaW5kZXhdID0gZGF0YVxuICAgICAgICBpZiAodGhpcy5nZXRJdGVtKGluZGV4KSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldEl0ZW1EYXRhKHRoaXMuZ2V0SXRlbShpbmRleCksIHRoaXMuaXRlbURhdGFMaXN0W2luZGV4XSwgaW5kZXgpXG4gICAgfVxuICAgIC8vIHJlZnJlc2hJdGVtKGluZGV4OiBudW1iZXIpIHtcbiAgICAvLyAgICAgdGhpcy5zZXRJdGVtRGF0YSh0aGlzLmdldEl0ZW0oaW5kZXgpLCB0aGlzLml0ZW1EYXRhTGlzdFtpbmRleF0sIGluZGV4KVxuICAgIC8vIH1cbiAgICByZWZyZXNoSXRlbXMoaXRlbURhdGFMaXN0OiBhbnlbXSwgLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgdGhpcy5pdGVtRGF0YUxpc3QgPSBpdGVtRGF0YUxpc3RcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5leHRyYVBhcmFtcyA9IGFyZ3NcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vdXRJbm5lciA9PSBTY3JvbGxPdXRJbm5lci5PVVQpIHtcbiAgICAgICAgICAgIHRoaXMuZXh0cmFQYXJhbXMucHVzaCh0aGlzLnNjcm9sbFZpZXcpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maXhJdGVtTm9kZXMoKVxuICAgICAgICAvLyDmnIDnu4jmnoTpgKDlrozmlbTnmoQgaXRlbUxpc3Qg5YiX6KGoLOWIt+aWsOaVsOaNrlxuICAgICAgICB0aGlzLml0ZW1MaXN0LmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBuZXdJbmRleCA9IHRoaXMucmVzZXRJbmRleChlbGVtZW50LmluZGV4KVxuICAgICAgICAgICAgICAgIGVsZW1lbnQuaW5kZXggPSBuZXdJbmRleFxuICAgICAgICAgICAgICAgIHRoaXMuc2V0SXRlbURhdGEoZWxlbWVudC5ub2RlLCB0aGlzLml0ZW1EYXRhTGlzdFtlbGVtZW50LmluZGV4XSwgZWxlbWVudC5pbmRleClcbiAgICAgICAgICAgICAgICB0aGlzLnNldFBvc1goZWxlbWVudC5pbmRleCwgZWxlbWVudC5ub2RlKVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0UG9zWShlbGVtZW50LmluZGV4LCBlbGVtZW50Lm5vZGUpXG4gICAgICAgICAgICAgICAgLy8gZWxlbWVudC5ub2RlLmdldENvbXBvbmVudCh0aGlzLml0ZW1TY3JpcHQpLnNldERhdGEodGhpcy5pdGVtRGF0YUxpc3RbZWxlbWVudC5pbmRleF0sIGVsZW1lbnQuaW5kZXgsIHRoaXMuZXh0cmFQYXJhbXMpXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIuiEmuacrOS4ree8uuWwkXJlZnJlc2hJdGVt5pa55rOV77yM5oiW6ICF5pa55rOV5oql6ZSZXCIsIGVycm9yKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8vIOaVsOaNruaWsOWinuaIluWHj+WwkeaXtizlop7liqDmiJblh4/lsJFpdGVtXG4gICAgZml4SXRlbU5vZGVzKCkge1xuICAgICAgICAvLyDliKTmlq3mmK/lkKbpnIDopoHliKDpmaQgaXRlbUxpc3Qg6YeM55qE5pWw5o2uXG4gICAgICAgIGlmICh0aGlzLml0ZW1EYXRhTGlzdC5sZW5ndGggPCB0aGlzLmluc3RhbnRpYXRlQ291bnQgJiYgdGhpcy5pdGVtTGlzdC5sZW5ndGggPiB0aGlzLml0ZW1EYXRhTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBuZWVkRGVsZXRlQ291bnQgPSB0aGlzLml0ZW1MaXN0Lmxlbmd0aCAtIHRoaXMuaXRlbURhdGFMaXN0Lmxlbmd0aFxuICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSB0aGlzLml0ZW1EYXRhTGlzdC5sZW5ndGg7IGluZGV4IDwgdGhpcy5pdGVtRGF0YUxpc3QubGVuZ3RoICsgbmVlZERlbGV0ZUNvdW50OyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtTGlzdFtpbmRleF0ubm9kZS5kZXN0cm95KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaXRlbUxpc3Quc3BsaWNlKHRoaXMuaXRlbURhdGFMaXN0Lmxlbmd0aCwgbmVlZERlbGV0ZUNvdW50KVxuICAgICAgICAgICAgLy8g5Yik5pat5piv5ZCm6ZyA6KaB5aKe5YqgIGl0ZW1MaXN0IOmHjOeahOaVsOaNrlxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXRlbUxpc3QubGVuZ3RoIDwgdGhpcy5pbnN0YW50aWF0ZUNvdW50ICYmIHRoaXMuaXRlbUxpc3QubGVuZ3RoIDwgdGhpcy5pdGVtRGF0YUxpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgYWRkQ291bnQgPSBNYXRoLm1pbih0aGlzLmluc3RhbnRpYXRlQ291bnQgLSB0aGlzLml0ZW1MaXN0Lmxlbmd0aCwgdGhpcy5pdGVtRGF0YUxpc3QubGVuZ3RoIC0gdGhpcy5pdGVtTGlzdC5sZW5ndGgpXG4gICAgICAgICAgICBsZXQgc3RhcnRJbmRleCA9IDBcbiAgICAgICAgICAgIHRoaXMuaXRlbUxpc3QuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gTWF0aC5tYXgoZWxlbWVudC5pbmRleCArIDEsIHN0YXJ0SW5kZXgpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGZvciAobGV0IGFkZEluZGV4ID0gc3RhcnRJbmRleDsgYWRkSW5kZXggPCAoc3RhcnRJbmRleCArIGFkZENvdW50KTsgYWRkSW5kZXgrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkSXRlbU5vZGUoYWRkSW5kZXgsIHRoaXMuaXRlbURhdGFMaXN0W2FkZEluZGV4XSwgdHJ1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICAgICAgICB0aGlzLnNldFNjcm9sbENvbnRlbnRTaXplKClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IHJlYWxJdGVtV2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbVdpZHRoICogdGhpcy5pdGVtU2NhbGVcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCByZWFsSXRlbUhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVtSGVpZ2h0ICogdGhpcy5pdGVtU2NhbGVcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRJdGVtTm9kZSgpOiBjYy5Ob2RlIHtcbiAgICAgICAgaWYgKHRoaXMudXNlTm9kZVBvb2wpIHtcbiAgICAgICAgICAgIC8vIEBUT0RPIFBvb2xNYW5hZ2VyXG4gICAgICAgICAgICByZXR1cm4gY2MuaW5zdGFudGlhdGUodGhpcy5pdGVtUHJlZmFiKVxuICAgICAgICAgICAgLy8gaWYgKHRoaXMucG9vbFR5cGUgPT0gUG9vbEVudW0uSVRFTV9CQUcpIHtcbiAgICAgICAgICAgIC8vICAgICByZXR1cm4gUG9vbE1hbmFnZXIuZ2V0SXRlbUJhZyh0aGlzLml0ZW1QcmVmYWIpXG4gICAgICAgICAgICAvLyB9IGVsc2UgaWYgKHRoaXMucG9vbFR5cGUgPT0gUG9vbEVudW0uSVRFTV9CQVNFKSB7XG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuIFBvb2xNYW5hZ2VyLmdldEl0ZW1CYXNlKHRoaXMuaXRlbVByZWZhYilcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjYy5pbnN0YW50aWF0ZSh0aGlzLml0ZW1QcmVmYWIpXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gYmFjayBcbiAgICBwcml2YXRlIG9uU2Nyb2xsQmVnYW4oKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsSW5kZXggPSAwXG4gICAgfVxuICAgIHByaXZhdGUgc2hvd1VJKCkge1xuICAgICAgICBpZiAodGhpcy5pdGVtUHJlZmFiID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJpdGVt6aKE5Yi25L2T5Yqg6L295aSx6LSlXCIpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zY3JvbGxWaWV3ID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCLmsqHmnInnu5HlrppzY3JvbGxcIilcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRDcmVhdGVJdGVtcyh0cnVlKVxuICAgICAgICB0aGlzLnNjcm9sbEluZGV4ID0gLTFcbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3LmNvbnRlbnQuc2V0QW5jaG9yUG9pbnQoMCwgMSlcbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3LmNvbnRlbnQuc2V0UG9zaXRpb24oLXRoaXMuc2Nyb2xsVmlldy5ub2RlLndpZHRoIC8gMiwgdGhpcy5zY3JvbGxWaWV3Lm5vZGUuaGVpZ2h0IC8gMilcblxuICAgICAgICB0aGlzLnNldFNjcm9sbENvbnRlbnRTaXplKClcbiAgICAgICAgc3dpdGNoICh0aGlzLnNjcm9sbERpcikge1xuICAgICAgICAgICAgY2FzZSBTY3JvbGxEaXJFbnVtLlZFUlRJQ0FMOlxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldy5zY3JvbGxUb1RvcCgpXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5IT1JJWk9OVEFMOlxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldy5zY3JvbGxUb0xlZnQoKVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uR1JJRDpcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFZpZXcuc2Nyb2xsVG9Ub3AoKVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldENyZWF0ZUl0ZW1zKGJvb2w6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKGJvb2wpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldy5lbmFibGVkID0gZmFsc2VcbiAgICAgICAgICAgIHRoaXMuY2FuQ3JlYXRlSXRlbSA9IHRydWVcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlSW5kZXggPSAwXG4gICAgICAgICAgICB0aGlzLmJhc2VJbmRleCA9IDBcbiAgICAgICAgICAgIHRoaXMubGlmZSA9IDBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldy5lbmFibGVkID0gdHJ1ZVxuICAgICAgICAgICAgdGhpcy5jYW5DcmVhdGVJdGVtID0gZmFsc2VcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlSW5kZXggPSAwXG4gICAgICAgICAgICB0aGlzLmJhc2VJbmRleCA9IDBcbiAgICAgICAgICAgIHRoaXMubGlmZSA9IDBcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZShkdDogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbEluZGV4ID49IDApIHsgdGhpcy5zY3JvbGxJbmRleCArPSBkdCB9XG4gICAgICAgIGlmICghdGhpcy5jYW5DcmVhdGVJdGVtKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5jbnVtYmVyOyBpbmRleCsrKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZvckNyZWF0ZUl0ZW0oZHQpXG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSB1cGRhdGVGb3JDcmVhdGVJdGVtKGR0OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhbkNyZWF0ZUl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxpZmUgPT0gMCkge1xuICAgICAgICAgICAgLy8g55SfXG4gICAgICAgICAgICBsZXQgX2l0ZW1EYXRhID0gdGhpcy5pdGVtRGF0YUxpc3RbdGhpcy5iYXNlSW5kZXhdXG4gICAgICAgICAgICBpZiAodGhpcy5jcmVhdGVJbmRleCA+PSB0aGlzLmluc3RhbnRpYXRlQ291bnQgfHwgX2l0ZW1EYXRhID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldENyZWF0ZUl0ZW1zKGZhbHNlKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hZGRJdGVtTm9kZSh0aGlzLmJhc2VJbmRleCwgX2l0ZW1EYXRhKVxuICAgICAgICAgICAgdGhpcy5jcmVhdGVJbmRleCArPSAxXG4gICAgICAgICAgICB0aGlzLmJhc2VJbmRleCArPSAxXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5saWZlICs9IGR0XG4gICAgICAgIGlmICh0aGlzLmxpZmUgPj0gdGhpcy5jdGltZSkge1xuICAgICAgICAgICAgdGhpcy5saWZlID0gMFxuICAgICAgICB9XG4gICAgfVxuICAgIHNldFNjcm9sbENvbnRlbnRTaXplKCkge1xuICAgICAgICBpZiAodGhpcy5hZGFwdGVySXRlbSkge1xuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnNjcm9sbERpcikge1xuICAgICAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5WRVJUSUNBTDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxWaWV3LmNvbnRlbnQuc2V0Q29udGVudFNpemUodGhpcy5zY3JvbGxWaWV3Lm5vZGUud2lkdGgsIHRoaXMuYWRhcHRlckNvbnRlbnRMZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgY2FzZSBTY3JvbGxEaXJFbnVtLkhPUklaT05UQUw6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldy5jb250ZW50LnNldENvbnRlbnRTaXplKHRoaXMuYWRhcHRlckNvbnRlbnRMZW5ndGgsIHRoaXMuc2Nyb2xsVmlldy5ub2RlLmhlaWdodClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uR1JJRDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxWaWV3LmNvbnRlbnQuc2V0Q29udGVudFNpemUodGhpcy5zY3JvbGxWaWV3Lm5vZGUud2lkdGgsIHRoaXMuaXRlbURpc3RhbmNlWSAqIE1hdGguY2VpbCh0aGlzLml0ZW1EYXRhTGlzdC5sZW5ndGggLyB0aGlzLmhhbmdDb3VudCkgKyB0aGlzLnBhZGluZ1kgKyB0aGlzLnRhZ0xhbmcgKyB0aGlzLnBhZGluZ1kyKVxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnNjcm9sbERpcikge1xuICAgICAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5WRVJUSUNBTDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxWaWV3LmNvbnRlbnQuc2V0Q29udGVudFNpemUodGhpcy5zY3JvbGxWaWV3Lm5vZGUud2lkdGgsIHRoaXMuaXRlbURpc3RhbmNlWSAqIHRoaXMuaXRlbURhdGFMaXN0Lmxlbmd0aCArIHRoaXMucGFkaW5nWSArIHRoaXMudGFnTGFuZyArIHRoaXMucGFkaW5nWTIgLSB0aGlzLnNwYWNpbmdZKVxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5IT1JJWk9OVEFMOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFZpZXcuY29udGVudC5zZXRDb250ZW50U2l6ZSh0aGlzLml0ZW1EaXN0YW5jZVggKiB0aGlzLml0ZW1EYXRhTGlzdC5sZW5ndGggKyB0aGlzLnBhZGluZ1ggKyB0aGlzLnRhZ0xhbmcgLSB0aGlzLnNwYWNpbmdYLCB0aGlzLnNjcm9sbFZpZXcubm9kZS5oZWlnaHQpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgY2FzZSBTY3JvbGxEaXJFbnVtLkdSSUQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldy5jb250ZW50LnNldENvbnRlbnRTaXplKHRoaXMuc2Nyb2xsVmlldy5ub2RlLndpZHRoLCB0aGlzLml0ZW1EaXN0YW5jZVkgKiBNYXRoLmNlaWwodGhpcy5pdGVtRGF0YUxpc3QubGVuZ3RoIC8gdGhpcy5oYW5nQ291bnQpICsgdGhpcy5wYWRpbmdZICsgdGhpcy50YWdMYW5nICsgdGhpcy5wYWRpbmdZMiAtIHRoaXMuc3BhY2luZ1kpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zY3JvbGxNYXhPZmZzZXRYID0gLXRoaXMuc2Nyb2xsVmlldy5nZXRNYXhTY3JvbGxPZmZzZXQoKS54XG4gICAgICAgIHRoaXMuc2Nyb2xsTWF4T2Zmc2V0WSA9IHRoaXMuc2Nyb2xsVmlldy5nZXRNYXhTY3JvbGxPZmZzZXQoKS55XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coXCItLS3ph43mlrDorr7nva7kuobmu5rliqjljLrln59cIiwgdGhpcy5zY3JvbGxWaWV3LmNvbnRlbnQuaGVpZ2h0KVxuICAgIH1cbiAgICAvKipcbiAgICAgKiDlvLnlh7ror6bmg4XmoIfnrb7vvIzlsIbkvJrph43orr7lkI7nu61pdGVt55qE5Z2Q5qCH44CCXG4gICAgICogQHBhcmFtIGluZGV4IGl0ZW3moIfnrb5cbiAgICAgKiBAcGFyYW0gbGFuZyDlnZDmoIflgY/np7vph49cbiAgICAgKi9cbiAgICBzZXRUYWcoaW5kZXg6IG51bWJlciwgbGFuZzogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMudGFnTGFuZyA9IGxhbmdcbiAgICAgICAgc3dpdGNoICh0aGlzLnNjcm9sbERpcikge1xuICAgICAgICAgICAgY2FzZSBTY3JvbGxEaXJFbnVtLlZFUlRJQ0FMOlxuICAgICAgICAgICAgY2FzZSBTY3JvbGxEaXJFbnVtLkhPUklaT05UQUw6XG4gICAgICAgICAgICAgICAgdGhpcy50YWdJbmRleCA9IGluZGV4XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5HUklEOlxuICAgICAgICAgICAgICAgIHRoaXMudGFnSW5kZXggPSBNYXRoLmZsb29yKGluZGV4IC8gdGhpcy5oYW5nQ291bnQpXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFNjcm9sbENvbnRlbnRTaXplKClcbiAgICAgICAgdGhpcy5pdGVtTGlzdC5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldFBvc1goZWxlbWVudC5pbmRleCwgZWxlbWVudC5ub2RlKVxuICAgICAgICAgICAgdGhpcy5zZXRQb3NZKGVsZW1lbnQuaW5kZXgsIGVsZW1lbnQubm9kZSlcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKua4hemZpOivpuaDheagh+etvu+8jOaBouWkjWl0ZW3pu5jorqTlnZDmoIcgKi9cbiAgICBjbGVhclRhZygpIHtcbiAgICAgICAgdGhpcy5zZXRUYWcoLTk5OSwgMClcbiAgICAgICAgLy8g5L+u5q2jaW5kZXjlkozlnZDmoIdcbiAgICAgICAgbGV0IHNjcm9sbEhlaWdodCA9IHRoaXMuc2Nyb2xsVmlldy5ub2RlLmhlaWdodFxuICAgICAgICB0aGlzLml0ZW1MaXN0LmZvckVhY2goZWxlID0+IHtcbiAgICAgICAgICAgIC8vIOWIpOaWreaYr+WQpui2heWHuui+ueeVjFxuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0UG9zaXRpb25JblZpZXcoZWxlLm5vZGUpLnkgPiBzY3JvbGxIZWlnaHQgKiAoMSAtIHRoaXMubm9kZS5hbmNob3JZKSArIHRoaXMuaXRlbURpc3RhbmNlWSAvIDIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlLmluZGV4ICsgdGhpcy5pbnN0YW50aWF0ZUNvdW50IDwgdGhpcy5pdGVtRGF0YUxpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZS5pbmRleCArPSB0aGlzLmluc3RhbnRpYXRlQ291bnRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQb3NZKGVsZS5pbmRleCwgZWxlLm5vZGUpXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRJdGVtRGF0YShlbGUubm9kZSwgdGhpcy5pdGVtRGF0YUxpc3RbZWxlLmluZGV4XSwgZWxlLmluZGV4KVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmdldFBvc2l0aW9uSW5WaWV3KGVsZS5ub2RlKS55IDwgLShzY3JvbGxIZWlnaHQgKiB0aGlzLm5vZGUuYW5jaG9yWSArIHRoaXMuaXRlbURpc3RhbmNlWSAvIDIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZS5pbmRleCAtIHRoaXMuaW5zdGFudGlhdGVDb3VudCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZS5pbmRleCAtPSB0aGlzLmluc3RhbnRpYXRlQ291bnRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQb3NZKGVsZS5pbmRleCwgZWxlLm5vZGUpXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRJdGVtRGF0YShlbGUubm9kZSwgdGhpcy5pdGVtRGF0YUxpc3RbZWxlLmluZGV4XSwgZWxlLmluZGV4KVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLnNldFNjcm9sbENvbnRlbnRTaXplKClcbiAgICB9XG4gICAgLyoq5Yig6Zmk5p+Q5Liq5YWD57SgICovXG4gICAgZGVsKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuaXRlbURhdGFMaXN0Lmxlbmd0aCA8IGluZGV4KSB7IHJldHVybiB9XG4gICAgICAgIHRoaXMuaXRlbURhdGFMaXN0LnNwbGljZShpbmRleCwgMSlcbiAgICAgICAgLy8gLy8g5Yik5pat5LiL5piv5ZCm6ZyA6KaB5Yig6Zmk6IqC54K5XG4gICAgICAgIGlmICh0aGlzLml0ZW1MaXN0Lmxlbmd0aCA+IHRoaXMuaXRlbURhdGFMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5pdGVtTGlzdC5wb3AoKS5ub2RlLmRlc3Ryb3koKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U2Nyb2xsQ29udGVudFNpemUoKVxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5pdGVtTGlzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGxldCBlbGVtZW50ID0gdGhpcy5pdGVtTGlzdFtpbmRleF1cbiAgICAgICAgICAgIGlmICh0aGlzLml0ZW1EYXRhTGlzdFtlbGVtZW50LmluZGV4XSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5pbmRleCAtPSB0aGlzLmluc3RhbnRpYXRlQ291bnRcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXRlbUxpc3QuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRQb3NYKGVsZW1lbnQuaW5kZXgsIGVsZW1lbnQubm9kZSlcbiAgICAgICAgICAgIHRoaXMuc2V0UG9zWShlbGVtZW50LmluZGV4LCBlbGVtZW50Lm5vZGUpXG4gICAgICAgICAgICB0aGlzLnNldEl0ZW1EYXRhKGVsZW1lbnQubm9kZSwgdGhpcy5pdGVtRGF0YUxpc3RbZWxlbWVudC5pbmRleF0sIGVsZW1lbnQuaW5kZXgpXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKirlnKjmnKvlsL7mt7vliqDkuIDkuKrlhYPntKAgKi9cbiAgICBhZGQoZGF0YTogYW55KSB7XG4gICAgICAgIHRoaXMuaXRlbURhdGFMaXN0LnB1c2goZGF0YSlcbiAgICAgICAgLy8g5Yik5pat5piv5ZCm6ZyA6KaB5aKe5YqgaXRlbVxuICAgICAgICBpZiAodGhpcy5pdGVtTGlzdC5sZW5ndGggPj0gdGhpcy5pbnN0YW50aWF0ZUNvdW50KSB7XG4gICAgICAgICAgICAvLyDkuI3pnIDopoFcbiAgICAgICAgICAgIC8vIOWIpOaWreS4i+aYr+WQpumcgOimgeaKiuacgOWJjemdoueahOaUvuWIsOacgOWQjumdojoxXG4gICAgICAgICAgICBsZXQgbmVlZFVwZGF0ZSA9IGZhbHNlXG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5pdGVtTGlzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pdGVtTGlzdFtpbmRleF0uaW5kZXggPT0gdGhpcy5pdGVtRGF0YUxpc3QubGVuZ3RoIC0gMikge1xuICAgICAgICAgICAgICAgICAgICBuZWVkVXBkYXRlID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZWVkVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1pbkluZGV4ID0gMTAwMCAvL+i/meS4quaYr+acgOWwj+WAvFxuICAgICAgICAgICAgICAgIGxldCBtaW5VcGRhdGVJbmRleCA9IDAvLyDov5nkuKrmmK/mnIDlsI/lgLznmoTmoIfnrb5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaXRlbUxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXRlbUxpc3RbaV0uaW5kZXggPCBtaW5JbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWluSW5kZXggPSB0aGlzLml0ZW1MaXN0W2ldLmluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5VcGRhdGVJbmRleCA9IGlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyDliKTmlq3kuIvmmK/lkKbpnIDopoHmiormnIDliY3pnaLnmoTmlL7liLDmnIDlkI7pnaI6MlxuICAgICAgICAgICAgICAgIGxldCBfbm9kZVBvcyA9IDBcbiAgICAgICAgICAgICAgICBsZXQgX29mZnNldCA9IDBcbiAgICAgICAgICAgICAgICBsZXQgbmVlZFVwZGF0ZTIgPSBmYWxzZVxuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zY3JvbGxEaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBTY3JvbGxEaXJFbnVtLkhPUklaT05UQUw6XG4gICAgICAgICAgICAgICAgICAgICAgICBfbm9kZVBvcyA9IHRoaXMuaXRlbUxpc3RbbWluVXBkYXRlSW5kZXhdLm5vZGUueFxuICAgICAgICAgICAgICAgICAgICAgICAgX29mZnNldCA9IHRoaXMuc2Nyb2xsVmlldy5nZXRTY3JvbGxPZmZzZXQoKS54XG4gICAgICAgICAgICAgICAgICAgICAgICBuZWVkVXBkYXRlMiA9IF9ub2RlUG9zICsgX29mZnNldCA+IHRoaXMuaXRlbVdpZHRoIC8gMlxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBTY3JvbGxEaXJFbnVtLlZFUlRJQ0FMOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uR1JJRDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9ub2RlUG9zID0gdGhpcy5pdGVtTGlzdFttaW5VcGRhdGVJbmRleF0ubm9kZS55XG4gICAgICAgICAgICAgICAgICAgICAgICBfb2Zmc2V0ID0gdGhpcy5zY3JvbGxWaWV3LmdldFNjcm9sbE9mZnNldCgpLnlcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRVcGRhdGUyID0gX25vZGVQb3MgKyBfb2Zmc2V0ID4gdGhpcy5pdGVtSGVpZ2h0IC8gMlxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5lZWRVcGRhdGUyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbUxpc3RbbWluVXBkYXRlSW5kZXhdLmluZGV4ICs9IHRoaXMuaW5zdGFudGlhdGVDb3VudFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEl0ZW1EYXRhKHRoaXMuaXRlbUxpc3RbbWluVXBkYXRlSW5kZXhdLm5vZGUsIGRhdGEsIHRoaXMuaXRlbUxpc3RbbWluVXBkYXRlSW5kZXhdLmluZGV4KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFBvc1godGhpcy5pdGVtTGlzdFttaW5VcGRhdGVJbmRleF0uaW5kZXgsIHRoaXMuaXRlbUxpc3RbbWluVXBkYXRlSW5kZXhdLm5vZGUpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UG9zWSh0aGlzLml0ZW1MaXN0W21pblVwZGF0ZUluZGV4XS5pbmRleCwgdGhpcy5pdGVtTGlzdFttaW5VcGRhdGVJbmRleF0ubm9kZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyDpnIDopoFcbiAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuaXRlbURhdGFMaXN0Lmxlbmd0aCAtIDFcbiAgICAgICAgICAgIHRoaXMuYWRkSXRlbU5vZGUoaW5kZXgsIGRhdGEpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRTY3JvbGxDb250ZW50U2l6ZSgpXG4gICAgfVxuXG4gICAgYWRkSXRlbU5vZGUoaW5kZXg6IG51bWJlciwgZGF0YTogYW55LCBpc1JlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICBsZXQgX25vZGUgPSB0aGlzLmluaXRJdGVtTm9kZSgpXG4gICAgICAgIC8vIGFkZOaUvuWcqOWJjemdoi7lhYjmv4DmtLtvbkxvYWTmlrnms5Us5YaN6LWwc2V0RGF0YVxuICAgICAgICB0aGlzLnNjcm9sbFZpZXcuY29udGVudC5hZGRDaGlsZChfbm9kZSlcbiAgICAgICAgdGhpcy5zZXRJdGVtRGF0YShfbm9kZSwgZGF0YSwgaW5kZXgpXG4gICAgICAgIHRoaXMuaXRlbUxpc3QucHVzaCh7IGluZGV4OiBpbmRleCwgbm9kZTogX25vZGUgfSlcbiAgICAgICAgdGhpcy5zZXRQb3NYKGluZGV4LCBfbm9kZSlcbiAgICAgICAgdGhpcy5zZXRQb3NZKGluZGV4LCBfbm9kZSlcblxuICAgICAgICBpZiAoaXNSZWZyZXNoIHx8IHRoaXMuc2hvd0FuaW0gPT0gMCkge1xuICAgICAgICAgICAgX25vZGUuc2NhbGUgPSB0aGlzLml0ZW1TY2FsZVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2hvd0FuaW0gPT0gMSkge1xuICAgICAgICAgICAgX25vZGUuc2NhbGUgPSAwXG4gICAgICAgICAgICBjYy50d2Vlbihfbm9kZSkuXG4gICAgICAgICAgICAgICAgdG8odGhpcy5hbmltU3BlZWQsIHsgc2NhbGU6IHRoaXMuaXRlbVNjYWxlICsgMC4xIH0pLlxuICAgICAgICAgICAgICAgIHRvKHRoaXMuYW5pbVNwZWVkLCB7IHNjYWxlOiB0aGlzLml0ZW1TY2FsZSB9KS5cbiAgICAgICAgICAgICAgICBzdGFydCgpXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zaG93QW5pbSA9PSAyKSB7XG4gICAgICAgICAgICBfbm9kZS5zY2FsZSA9IHRoaXMuaXRlbVNjYWxlXG4gICAgICAgICAgICBsZXQgZGVsYXlUaW1lID0gaW5kZXggJSB0aGlzLmhhbmdDb3VudCAvIDIwICsgMC4xXG4gICAgICAgICAgICBfbm9kZS54IC09IF9ub2RlLndpZHRoIC8gMlxuICAgICAgICAgICAgX25vZGUuc2NhbGVYID0gMFxuICAgICAgICAgICAgY2MudHdlZW4oX25vZGUpLmRlbGF5KGRlbGF5VGltZSkudG8odGhpcy5hbmltU3BlZWQsIHsgeDogX25vZGUueCArIF9ub2RlLndpZHRoIC8gMiwgc2NhbGVYOiB0aGlzLml0ZW1TY2FsZSB9KS5zdGFydCgpXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zaG93QW5pbSA9PSAzKSB7XG4gICAgICAgICAgICAvL0BUT0RPXG4gICAgICAgICAgICBfbm9kZS5zY2FsZSA9IHRoaXMuaXRlbVNjYWxlXG4gICAgICAgICAgICBsZXQgZGVsYXlUaW1lID0gaW5kZXggJSB0aGlzLmhhbmdDb3VudCAvIDIwICsgMC4xXG4gICAgICAgICAgICBfbm9kZS55ICs9IF9ub2RlLmhlaWdodCAvIDJcbiAgICAgICAgICAgIF9ub2RlLnNjYWxlWSA9IDBcbiAgICAgICAgICAgIGNjLnR3ZWVuKF9ub2RlKS5kZWxheShkZWxheVRpbWUpLnRvKHRoaXMuYW5pbVNwZWVkLCB7IHk6IF9ub2RlLnkgLSBfbm9kZS5oZWlnaHQgLyAyLCBzY2FsZVk6IHRoaXMuaXRlbVNjYWxlIH0pLnN0YXJ0KClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNob3dBbmltID09IDQpIHtcbiAgICAgICAgICAgIF9ub2RlLnNjYWxlID0gMFxuICAgICAgICAgICAgY2MudHdlZW4oX25vZGUpLlxuICAgICAgICAgICAgICAgIHRvKHRoaXMuYW5pbVNwZWVkLCB7IHNjYWxlOiB0aGlzLml0ZW1TY2FsZSB9KS5cbiAgICAgICAgICAgICAgICBzdGFydCgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfbm9kZS5zY2FsZSA9IHRoaXMuaXRlbVNjYWxlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdmFsIOeri+WIu+a7muWKqOWIsOebruagh+agh+etviznm67moIfmoIfnrb7lsIblnKjpobbpg6h85bem5L6n5Ye6546wXG4gICAgICogQHBhcmFtIHR5cGUgIOa7muWIsOWTqumHjOeahOexu+WeiygxLuWxheS4rSAyLumhtumDqHzlt6bkvqcgMy7lupXpg6jvvZzlj7PkvqcpXG4gICAgICovXG4gICAgc2Nyb2xsVG9JbmRleE5vdyh2YWw6IG51bWJlciwgdHlwZTogbnVtYmVyID0gMSwgLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgaWYgKHRoaXMuYWRhcHRlckl0ZW0gJiYgdGhpcy5hZGFwdGVyTGlzdFt2YWxdID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIuacquWxleekuui/hyzml6Dms5Xnp7vliqhcIilcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWwgPj0gdGhpcy5pdGVtRGF0YUxpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YWwgPSB0aGlzLml0ZW1EYXRhTGlzdC5sZW5ndGggLSAxXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbCA8IDApIHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaEl0ZW1zKHRoaXMuaXRlbURhdGFMaXN0KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3LnN0b3BBdXRvU2Nyb2xsKClcbiAgICAgICAgdGhpcy5iYXNlSW5kZXggPSB2YWxcblxuICAgICAgICBsZXQgc2Nyb2xsUG9zSW5kZXggPSB0aGlzLmJhc2VJbmRleFxuICAgICAgICBpZiAodGhpcy5pdGVtRGF0YUxpc3QubGVuZ3RoIC0gdGhpcy5iYXNlSW5kZXggPCB0aGlzLmluc3RhbnRpYXRlQ291bnQpIHtcbiAgICAgICAgICAgIHRoaXMuYmFzZUluZGV4IC09IHRoaXMuaW5zdGFudGlhdGVDb3VudCAtICh0aGlzLml0ZW1EYXRhTGlzdC5sZW5ndGggLSB0aGlzLmJhc2VJbmRleClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0eXBlID09IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJhc2VJbmRleCAtPSBNYXRoLmNlaWwodGhpcy5pbnN0YW50aWF0ZUNvdW50IC8gMilcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSAzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXNlSW5kZXggLT0gKHRoaXMubGllQ291bnQgLSAxKSAqIHRoaXMuaGFuZ0NvdW50XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsRGlyID09IFNjcm9sbERpckVudW0uR1JJRCkge1xuICAgICAgICAgICAgdGhpcy5iYXNlSW5kZXggLT0gdGhpcy5iYXNlSW5kZXggJSB0aGlzLmhhbmdDb3VudFxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmFzZUluZGV4ID0gTWF0aC5tYXgodGhpcy5iYXNlSW5kZXgsIDApXG5cbiAgICAgICAgbGV0IF9pdGVtV2lkdGggPSB0aGlzLmFkYXB0ZXJJdGVtID8gdGhpcy5hZGFwdGVyTGlzdFt2YWxdLndpZHRoIDogdGhpcy5pdGVtV2lkdGhcbiAgICAgICAgbGV0IF9pdGVtSGVpZ2h0ID0gdGhpcy5hZGFwdGVySXRlbSA/IHRoaXMuYWRhcHRlckxpc3RbdmFsXS5oZWlnaHQgOiB0aGlzLml0ZW1IZWlnaHRcbiAgICAgICAgLy8g5LuO56ys5Yeg5Liq5qCH562+5byA5aeL5pi+56S6XG4gICAgICAgIHN3aXRjaCAodGhpcy5zY3JvbGxEaXIpIHtcbiAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5IT1JJWk9OVEFMOlxuICAgICAgICAgICAgICAgIGxldCBfeCA9IC0odGhpcy5zZXRQb3NYKHNjcm9sbFBvc0luZGV4KSAtIChfaXRlbVdpZHRoICogdGhpcy5pdGVtU2NhbGUgKyB0aGlzLnNwYWNpbmdYKSAvIDIpXG4gICAgICAgICAgICAgICAgLy8g5Yik5pat5piv5ZCm6LaF6L+H6L6555WMXG4gICAgICAgICAgICAgICAgaWYgKF94IDwgdGhpcy5zY3JvbGxNYXhPZmZzZXRYKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbFBvc0luZGV4ID0gdGhpcy5pdGVtRGF0YUxpc3QubGVuZ3RoIC0gdGhpcy5pbnN0YW50aWF0ZUNvdW50XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldy5jb250ZW50LnggPSB0aGlzLnNjcm9sbE1heE9mZnNldFhcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFZpZXcuY29udGVudC54ID0gTWF0aC5taW4oLSh0aGlzLnNldFBvc1goc2Nyb2xsUG9zSW5kZXgpIC0gdGhpcy5zY3JvbGxWaWV3Lm5vZGUud2lkdGggLyAyKSwgMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgtKHRoaXMuc2V0UG9zWChzY3JvbGxQb3NJbmRleCkgLSB0aGlzLnNjcm9sbFZpZXcubm9kZS53aWR0aCAvIDIpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhc2VJbmRleCA9IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldy5jb250ZW50LnggPSAtKHRoaXMuc2V0UG9zWChzY3JvbGxQb3NJbmRleCkgLSAoX2l0ZW1XaWR0aCAqIHRoaXMuaXRlbVNjYWxlICsgdGhpcy5zcGFjaW5nWCkgLyAyKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsUG9zSW5kZXgrK1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxWaWV3LmNvbnRlbnQueCA9IE1hdGgubWluKC0odGhpcy5zZXRQb3NYKHNjcm9sbFBvc0luZGV4KSAtIHRoaXMuc2Nyb2xsVmlldy5ub2RlLndpZHRoIC0gX2l0ZW1XaWR0aCAvIDIgLSB0aGlzLnNwYWNpbmdZKSwgMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgtKHRoaXMuc2V0UG9zWChzY3JvbGxQb3NJbmRleCkgLSB0aGlzLnNjcm9sbFZpZXcubm9kZS53aWR0aCAtIF9pdGVtV2lkdGggLyAyIC0gdGhpcy5zcGFjaW5nWSkgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZUluZGV4ID0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uVkVSVElDQUw6XG4gICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uR1JJRDpcbiAgICAgICAgICAgICAgICBsZXQgX3kgPSAoTWF0aC5hYnModGhpcy5zZXRQb3NZKHNjcm9sbFBvc0luZGV4KSkgLSAoX2l0ZW1IZWlnaHQgKiB0aGlzLml0ZW1TY2FsZSArIHRoaXMuc3BhY2luZ1kpIC8gMilcbiAgICAgICAgICAgICAgICBpZiAoX3kgPiB0aGlzLnNjcm9sbE1heE9mZnNldFkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsUG9zSW5kZXggPSB0aGlzLml0ZW1EYXRhTGlzdC5sZW5ndGggLSB0aGlzLmluc3RhbnRpYXRlQ291bnRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxWaWV3LmNvbnRlbnQueSA9IHRoaXMuc2Nyb2xsTWF4T2Zmc2V0WVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldy5jb250ZW50LnkgPSBNYXRoLm1heChNYXRoLmFicyh0aGlzLnNldFBvc1koc2Nyb2xsUG9zSW5kZXgpKSAtIHRoaXMuc2Nyb2xsVmlldy5ub2RlLmhlaWdodCAvIDIsIDApXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnModGhpcy5zZXRQb3NZKHNjcm9sbFBvc0luZGV4KSkgLSB0aGlzLnNjcm9sbFZpZXcubm9kZS5oZWlnaHQgLyAyIDw9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhc2VJbmRleCA9IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldy5jb250ZW50LnkgPSBNYXRoLmFicyh0aGlzLnNldFBvc1koc2Nyb2xsUG9zSW5kZXgpKSAtIChfaXRlbUhlaWdodCAqIHRoaXMuaXRlbVNjYWxlICsgdGhpcy5zcGFjaW5nWSkgLyAyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxQb3NJbmRleCA9IHRoaXMuc2Nyb2xsRGlyID09IFNjcm9sbERpckVudW0uVkVSVElDQUwgPyAoc2Nyb2xsUG9zSW5kZXggKyAxKSA6IHNjcm9sbFBvc0luZGV4ICsgdGhpcy5oYW5nQ291bnRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldy5jb250ZW50LnkgPSBNYXRoLm1heChNYXRoLmFicyh0aGlzLnNldFBvc1koc2Nyb2xsUG9zSW5kZXgpKSAtIHRoaXMuc2Nyb2xsVmlldy5ub2RlLmhlaWdodCAtIF9pdGVtSGVpZ2h0IC8gMiAtIHRoaXMuc3BhY2luZ1ksIDApXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnModGhpcy5zZXRQb3NZKHNjcm9sbFBvc0luZGV4KSkgLSB0aGlzLnNjcm9sbFZpZXcubm9kZS5oZWlnaHQgLSBfaXRlbUhlaWdodCAvIDIgLSB0aGlzLnNwYWNpbmdZIDw9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhc2VJbmRleCA9IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZXh0cmFQYXJhbXMgPSBhcmdzXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maXhJdGVtTm9kZXMoKVxuICAgICAgICAvLyDlpoLmnpxjb250ZW505pyJ5a2Q6aG555uuLOWImemHjeWItuebruagh+eCueS9jee9rlxuICAgICAgICBpZiAodGhpcy5pdGVtTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5pdGVtTGlzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAvLyBsZXQgaSA9IHRoaXMuYmFzZUluZGV4ICsgaW5kZXhcbiAgICAgICAgICAgICAgICBsZXQgZWxlbW5ldCA9IHRoaXMuaXRlbUxpc3RbaW5kZXhdXG4gICAgICAgICAgICAgICAgZWxlbW5ldC5pbmRleCA9IHRoaXMuYmFzZUluZGV4ICsgaW5kZXhcbiAgICAgICAgICAgICAgICB0aGlzLnNldFBvc1goZWxlbW5ldC5pbmRleCwgZWxlbW5ldC5ub2RlKVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0UG9zWShlbGVtbmV0LmluZGV4LCBlbGVtbmV0Lm5vZGUpXG4gICAgICAgICAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eSh0aGlzLml0ZW1EYXRhTGlzdFtlbGVtbmV0LmluZGV4XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRJdGVtRGF0YShlbGVtbmV0Lm5vZGUsIHRoaXMuaXRlbURhdGFMaXN0W2VsZW1uZXQuaW5kZXhdLCBlbGVtbmV0LmluZGV4KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5bCd6K+V5rua5Yqo5Yiw5rua5Yqo6KeG5Zu+5Lit5b+DXG4gICAgICogQHBhcmFtIGluZGV4IOagh+etvlxuICAgICAqIEBwYXJhbSB0eXBlICDmu5rliLDlk6rph4znmoTnsbvlnosoMS7lsYXkuK0gMi7pobbpg6h85bem5L6nIDMu5bqV6YOo772c5Y+z5L6nKVxuICAgICAqIEBwYXJhbSB0aW1lIFxuICAgICAqL1xuICAgIHNjcm9sbFRvSW5kZXgoaW5kZXg6IG51bWJlciwgdHlwZTogbnVtYmVyID0gMSwgdGltZTogbnVtYmVyID0gMSwgb2Zmc2V0WTogbnVtYmVyID0gMCkge1xuICAgICAgICBpZiAodGhpcy5pdGVtRGF0YUxpc3RbaW5kZXhdID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCLkuI3lrZjlnKjmraTmoIfnrb5cIilcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodGhpcy5zY3JvbGxEaXIpIHtcbiAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5IT1JJWk9OVEFMOlxuICAgICAgICAgICAgICAgIGlmICh0eXBlID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxWaWV3LnNjcm9sbFRvT2Zmc2V0KGNjLnYyKHRoaXMuc2V0UG9zWChpbmRleCkgLSB0aGlzLnNjcm9sbFZpZXcubm9kZS53aWR0aCAvIDIsIHRoaXMuc2Nyb2xsVmlldy5nZXRTY3JvbGxPZmZzZXQoKS55KSwgdGltZSlcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gMikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFZpZXcuc2Nyb2xsVG9PZmZzZXQoY2MudjIodGhpcy5zZXRQb3NYKGluZGV4KSAtIHRoaXMuaXRlbURpc3RhbmNlWCAvIDIsIHRoaXMuc2Nyb2xsVmlldy5nZXRTY3JvbGxPZmZzZXQoKS55KSwgdGltZSlcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpbmRleCsrXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldy5zY3JvbGxUb09mZnNldChjYy52Mih0aGlzLnNldFBvc1goaW5kZXgpIC0gdGhpcy5zY3JvbGxWaWV3Lm5vZGUud2lkdGgsIHRoaXMuc2Nyb2xsVmlldy5nZXRTY3JvbGxPZmZzZXQoKS55IC0gdGhpcy5pdGVtV2lkdGggLyAyIC0gdGhpcy5zcGFjaW5nWCksIHRpbWUpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uVkVSVElDQUw6XG4gICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uR1JJRDpcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldy5zY3JvbGxUb09mZnNldChjYy52Mih0aGlzLnNjcm9sbFZpZXcuZ2V0U2Nyb2xsT2Zmc2V0KCkueCwgTWF0aC5hYnModGhpcy5zZXRQb3NZKGluZGV4KSkgLSB0aGlzLnNjcm9sbFZpZXcubm9kZS5oZWlnaHQgLyAyIC0gb2Zmc2V0WSksIHRpbWUpXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxWaWV3LnNjcm9sbFRvT2Zmc2V0KGNjLnYyKHRoaXMuc2Nyb2xsVmlldy5nZXRTY3JvbGxPZmZzZXQoKS54LCBNYXRoLmFicyh0aGlzLnNldFBvc1koaW5kZXgpKSAtIHRoaXMuaXRlbURpc3RhbmNlWSAvIDIgLSBvZmZzZXRZKSwgdGltZSlcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHRoaXMuc2Nyb2xsRGlyID09IFNjcm9sbERpckVudW0uVkVSVElDQUwgPyAoaW5kZXggKyAxKSA6IGluZGV4ICsgdGhpcy5oYW5nQ291bnRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxWaWV3LnNjcm9sbFRvT2Zmc2V0KGNjLnYyKHRoaXMuc2Nyb2xsVmlldy5nZXRTY3JvbGxPZmZzZXQoKS54LCBNYXRoLmFicyh0aGlzLnNldFBvc1koaW5kZXgpKSAtIHRoaXMuc2Nyb2xsVmlldy5ub2RlLmhlaWdodCAtIHRoaXMuaXRlbUhlaWdodCAvIDIgLSB0aGlzLnNwYWNpbmdZIC0gb2Zmc2V0WSksIHRpbWUpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhpcy5zY2hlZHVsZU9uY2UoKCkgPT4ge1xuICAgICAgICAvLyAgICAgdGhpcy5yZWZyZXNoSXRlbShpbmRleClcbiAgICAgICAgLy8gfSwgdGltZSlcbiAgICB9XG5cbiAgICBnZXRJdGVtKGluZGV4OiBudW1iZXIpOiBjYy5Ob2RlIHwgbnVsbCB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuaXRlbUxpc3QpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLml0ZW1MaXN0W2tleV0uaW5kZXggPT0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pdGVtTGlzdFtrZXldLm5vZGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgY2hlY2tTY3JvbGxTdGF0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsSW5kZXggPiB0aGlzLml0ZW1EYXRhTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldy5zdG9wQXV0b1Njcm9sbCgpXG4gICAgICAgICAgICB0aGlzLnNjcm9sbFZpZXcuc2Nyb2xsVG9PZmZzZXQoY2MudjIoMCwgdGhpcy5zY3JvbGxNYXhPZmZzZXRZIC8gMikpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDkvb/nlKjlr7nosaHmsaDml7bvvIzlnKjliIfmjaLnlYzpnaLml7blv4Xpobvkvb/nlKjov5nkuKrmlrnms5XvvIzlsIbmiYDmnInlr7nosaHmlL7liLDmsaDkuK1cbiAgICBjbGVhcigpIHtcbiAgICAgICAgLy8gQFRPRE8gUG9vbE1hbmFnZXJcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsVmlldyAmJiB0aGlzLnNjcm9sbFZpZXcuY29udGVudCkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxWaWV3LmNvbnRlbnQucmVtb3ZlQWxsQ2hpbGRyZW4oKVxuICAgICAgICB9XG4gICAgICAgIC8vIGlmICh0aGlzLnVzZU5vZGVQb29sKSB7XG4gICAgICAgIC8vICAgICB0aGlzLml0ZW1MaXN0LmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgIC8vICAgICAgICAgaWYgKHRoaXMucG9vbFR5cGUgPT0gUG9vbEVudW0uSVRFTV9CQUcpIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgUG9vbE1hbmFnZXIucHV0SXRlbUJhZyhlbGVtZW50Lm5vZGUpXG4gICAgICAgIC8vICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBvb2xUeXBlID09IFBvb2xFbnVtLklURU1fQkFTRSkge1xuICAgICAgICAvLyAgICAgICAgICAgICBQb29sTWFuYWdlci5wdXRJdGVtQmFzZShlbGVtZW50Lm5vZGUpXG4gICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAvLyAgICAgfSk7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICBpZiAodGhpcy5zY3JvbGxWaWV3ICYmIHRoaXMuc2Nyb2xsVmlldy5jb250ZW50KSB7XG4gICAgICAgIC8vICAgICAgICAgdGhpcy5zY3JvbGxWaWV3LmNvbnRlbnQucmVtb3ZlQWxsQ2hpbGRyZW4oKVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG4gICAgICAgIHRoaXMuaXRlbURhdGFMaXN0ID0gW11cbiAgICAgICAgdGhpcy5pdGVtTGlzdCA9IFtdXG4gICAgfVxufVxuIl19