WaterControl/temp/quick-scripts/dst/assets/Script/GameManager.js
2024-08-16 14:17:58 +08:00

1472 lines
217 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(function() {
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
var __module = nodeEnv ? module : {exports:{}};
var __filename = 'preview-scripts/assets/Script/GameManager.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, 'b0432BA295DjIOcuitdGKO1', 'GameManager');
// Script/GameManager.ts
"use strict";
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 Block_1 = require("./Block");
// 主游戏控制类
var _a = cc._decorator, ccclass = _a.ccclass, property = _a.property;
var GameManager = /** @class */ (function (_super) {
__extends(GameManager, _super);
function GameManager() {
var _this = _super !== null && _super.apply(this, arguments) || this;
_this.Map = null;
_this.Block = null;
_this.Time = null;
_this.Countdown = null;
_this.Guide = null;
return _this;
}
GameManager.prototype.onLoad = function () {
};
GameManager.prototype.start = function () {
cc.fx.GameConfig.CLICK_init();
this.fit();
this.init();
};
//处理地图数据 第一关完全随机从第二关开始赢了根据5秒洪峰来临增加难度步数输了当前难度减步数
GameManager.prototype.getMap = function () {
var custom = 0;
var map = [];
if (cc.fx.GameConfig.GM_INFO.level == 1) {
custom = Math.floor(Math.random() * cc.fx.GameConfig.LEVEL_INFO[cc.fx.GameConfig.GM_INFO.level].length);
}
else {
var arr = cc.fx.GameConfig.LEVEL_INFO[cc.fx.GameConfig.GM_INFO.level];
if (cc.fx.GameConfig.GM_INFO.min_Time == -1) {
map = this.getMapArray(arr, cc.fx.GameConfig.GM_INFO.min_Steps - 1, false);
}
else if (cc.fx.GameConfig.GM_INFO.min_Time >= 5) {
map = this.getMapArray(arr, cc.fx.GameConfig.GM_INFO.min_Steps + 2, true);
}
else {
map = this.getMapArray(arr, cc.fx.GameConfig.GM_INFO.min_Steps + 1, true);
}
var random = Math.floor(Math.random() * map.length);
custom = map[random];
// console.log(custom,map);
}
//记录当前最小步数
cc.fx.GameConfig.GM_INFO.min_Steps = cc.fx.GameConfig.LEVEL_INFO[cc.fx.GameConfig.GM_INFO.level][custom].min_steps;
cc.fx.GameConfig.GM_INFO.min_Time = 0;
return custom;
};
/**
* 获取下一关难度步数增加2或者1如果没有则降到有.
* @param arr 配置里读取当前x*x地图等级内所有地图数组
* @param min_steps 最佳步数,下一关难度或者输了降难度,根据最佳步数增加或者减少。
* @param type true为增加步数false为输了降低难度步数
*/
GameManager.prototype.getMapArray = function (arr, min_steps, type) {
var map = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i].min_steps == min_steps) {
map.push(i);
}
}
if (map.length == 0) {
if (type)
map = this.getMapArray(arr, min_steps - 1, type);
else
map = this.getMapArray(arr, min_steps + 1, type);
}
return map;
};
//初始化数据
GameManager.prototype.init = function () {
var name = cc.fx.GameConfig.GM_INFO.gameId + "_guide";
var data = JSON.parse(localStorage.getItem(name));
if (data != false) {
cc.fx.GameConfig.GM_INFO.guide = true;
cc.fx.StorageMessage.setStorage(name, cc.fx.GameConfig.GM_INFO.guide);
}
else {
cc.fx.GameConfig.GM_INFO.guide = cc.fx.StorageMessage.getStorage(name);
}
this.initMap();
this.finishiTime = 0;
this.scoreTime = 0;
this.replaceTime = 0;
this.startTime = cc.fx.GameTool.getTime();
this.countTime = cc.fx.GameConfig.TIME_INFO.totalTime;
if (this.countTime == 0) {
this.gameOver();
}
this.waterTime = cc.fx.GameConfig.TIME_INFO.waterTime[cc.fx.GameConfig.GM_INFO.level];
// if(this.countTime < this.waterTime) this.replaceTime = this.countTime;
this.Time.string = cc.fx.GameTool.getTimeMargin(this.countTime);
if (!cc.fx.GameConfig.GM_INFO.guide) {
this.Guide.active = false;
this.step = 0;
var head = this.node.getChildByName("Top").getChildByName("head");
var progress = this.node.getChildByName("Top").getChildByName("progress").getComponent(cc.Sprite);
head.runAction(cc.moveTo(this.waterTime, cc.v2(310, head.y)));
this.waterTween = cc.tween(progress)
.to(this.waterTime, { fillRange: 1 })
.start();
this.schedule(this.updateWaterTime, 1);
this.schedule(this.updateCountDownTime, 1);
}
else {
this.Guide.active = true;
this.guideNext();
}
};
//初始化地图
GameManager.prototype.initMap = function () {
cc.fx.GameConfig.GM_INFO.round += 1;
cc.fx.GameConfig.GM_INFO.fen = 0;
this.block_Array = [];
this.path_Array = [];
this.water_Array = [];
this.map_Array = [];
this.tip_Array = [];
this.plan_over = false;
this.map_Hight = 0;
this.map_Width = 0;
this.step = 0;
this.bgClick = false;
this.btnClick = false;
this.custom = 0; //9
if (!cc.fx.GameConfig.GM_INFO.guide && cc.fx.GameConfig.GM_INFO.level == 0) {
cc.fx.GameConfig.GM_INFO.level = 1;
this.custom = this.getMap();
}
else if (!cc.fx.GameConfig.GM_INFO.guide) {
this.custom = this.getMap();
}
// this.custom = 7;
// console.log(this.custom);
var arr = cc.fx.GameConfig.LEVEL_INFO[cc.fx.GameConfig.GM_INFO.level][this.custom].map;
if (cc.fx.GameConfig.GM_INFO.level == 0) {
this.Map.scale = 1.2;
}
this.node.getChildByName("Top").getChildByName("id").getComponent(cc.Label).string =
cc.fx.GameConfig.GM_INFO.score;
//将地图x,y轴切换
this.map_Array = arr[0].map(function (item, i) {
return arr.map(function (val) { return val[i]; });
});
this.map_Width = this.map_Array.length;
this.map_Hight = this.map_Array[0].length;
this.Map.x = (6 - this.map_Array.length) * 48;
this.Map.y = (this.map_Array[0].length - 6.5) * 48;
for (var i = 0; i < this.map_Array.length; i++) {
for (var j = 0; j < this.map_Array[i].length; j++) {
var block = cc.instantiate(this.Block);
block.parent = this.Map;
block.getComponent("Block").initData(this.map_Array[i][j], cc.v2(i, j), cc.v2(this.map_Width, this.map_Hight));
if (this.map_Array[i][j] == cc.Enum(Block_1.BlockType).Start) {
this.path_Array.push(cc.v3(i, j, cc.Enum(Block_1.BlockType).Nomal));
// this.water_Array.push(cc.v3(i,j,cc.Enum(BlockType).Nomal));
}
block.setPosition(cc.v2(-block.width * 2.5 + i * block.width, block.height * 4 - j * block.height));
this.block_Array.push(block);
}
}
};
/**
* 开始后,按玩家操作,将路径中地图块放入数组中
* @param data 根据当前操作,添加建筑地图数组
*/
GameManager.prototype.setMap = function (data) {
for (var i = 0; i < data.length; i++) {
var start = this.path_Array[this.path_Array.length - 1];
switch (data[i]) {
case "up":
this.path_Array.push(cc.v3(start.x, start.y - 1, cc.Enum(Block_1.BlockType).Nomal));
break;
case "down":
this.path_Array.push(cc.v3(start.x, start.y + 1, cc.Enum(Block_1.BlockType).Nomal));
break;
case "left":
this.path_Array.push(cc.v3(start.x - 1, start.y, cc.Enum(Block_1.BlockType).Nomal));
break;
case "right":
this.path_Array.push(cc.v3(start.x + 1, start.y, cc.Enum(Block_1.BlockType).Nomal));
break;
case "reinforce":
this.path_Array.push(cc.v3(start.x, start.y, cc.Enum(Block_1.BlockType).Reinforce));
break;
case "soil":
this.path_Array.push(cc.v3(start.x, start.y, cc.Enum(Block_1.BlockType).Xi_Soil));
break;
}
}
if (this.path_Array[this.path_Array.length - 1].z != 0) {
this.path_Array.pop();
}
this.runRoad(0);
};
/**
* 开始执行洪峰来了的动画
* @param order 建筑地图数组里的执行的序列号,依次往下加
*/
GameManager.prototype.runRoad = function (order) {
var _this = this;
order = parseInt(order);
if (order > 0) {
if (this.path_Array[order - 1].z == 0) {
//console.log("1正常放入",this.path_Array[order-1].x,this.path_Array[order-1].y,this.path_Array[order-1].z)
this.changeWater(cc.v3(this.path_Array[order - 1].x, this.path_Array[order - 1].y, 0));
if (order == this.path_Array.length - 1) {
this.changeWater(cc.v3(this.path_Array[order].x, this.path_Array[order].y, 0));
// console.log("最后放入",this.path_Array[order].x,this.path_Array[order].y)
}
}
else {
//console.log("2插入",this.path_Array[order].x,this.path_Array[order].y,this.path_Array[order].z)
this.changeWater(cc.v3(this.path_Array[order].x, this.path_Array[order].y, 0));
}
}
if (order <= this.path_Array.length - 1) {
var i = this.path_Array[order].x * this.map_Array[0].length + this.path_Array[order].y;
var direction = "";
var circulate = true;
//最后一步结束
if (order == this.path_Array.length - 1) {
circulate = false;
direction = "End";
// console.log("进入结束");
if (this.path_Array.length > 1) {
// console.log("准备出水");
setTimeout(function () {
if (!_this.plan_over) {
_this.plan_over = true;
var head = _this.node.getChildByName("Top").getChildByName("head");
var progress = _this.node.getChildByName("Top").getChildByName("progress").getComponent(cc.Sprite);
head.stopAllActions();
head.setPosition(310, head.y);
if (_this.waterTween)
_this.waterTween.stop();
progress.fillRange = 1;
cc.fx.GameConfig.GM_INFO.min_Time = _this.waterTime;
_this.runWater(0);
}
}, 500);
}
else {
direction = "err";
// console.log("进入结束err");
}
}
else {
if (this.path_Array[order].z == 6 && order + 1 < this.path_Array.length) {
direction = "Reinforce";
i = this.path_Array[order + 1].x * this.map_Array[0].length + this.path_Array[order + 1].y;
}
else if (order + 1 < this.path_Array.length) {
if (this.path_Array[order + 1].z == 5) {
direction = "Xi_Soil";
}
else if (this.path_Array[order + 1].z == 6 && order == 0 && order + 1 < this.path_Array.length) {
// direction = this.getDirection(order+1,this.path_Array);
direction = this.getDirection(order, this.path_Array);
}
else {
direction = this.getDirection(order, this.path_Array);
}
}
else {
direction = this.getDirection(order, this.path_Array);
}
}
// console.log(order,this.path_Array[order].x,this.path_Array[order].y,i);
// console.log("步骤:",order,"方向",direction);
var jg = this.getBoundary(order, this.path_Array[order].x, this.path_Array[order].y, direction, this.path_Array);
// if(direction == "" || jg == false) return;
if (direction == "err" || direction == "" || jg == false) {
cc.fx.Notifications.emit(cc.fx.Message.showResult, "lose");
return;
}
if (i < 0 || i > (this.block_Array.length - 1)) {
cc.fx.Notifications.emit(cc.fx.Message.showResult, "lose");
return;
}
var target = this.block_Array[i].getComponent("Block");
target.setPath(direction);
if (order > 0 && order < this.path_Array.length - 1) {
if (this.path_Array[order + 1].z == 5) {
this.set_Soil(order + 1, this.path_Array, "road");
circulate = false;
return;
}
else if (order == 1 && this.path_Array[order].z == 5) {
this.set_Soil(order, this.path_Array, "road");
circulate = false;
return;
}
}
var pos = cc.v2();
if (direction == "End") {
if (order > 0) {
// if(this.path_Array[order-1].z == 0){
pos = cc.v2(this.path_Array[order - 1].x, this.path_Array[order - 1].y);
// }
}
}
var data = {
order: order,
time: cc.fx.GameConfig.TIME_INFO.waterSpeed[cc.fx.GameConfig.GM_INFO.level],
type: this.path_Array[order].z,
circulate: circulate,
last: pos
};
target.runRoad(data);
}
};
/**
* 判断边界。或者撞山,或者湿地没有加固
* @param order 建筑地图数组里的执行的序列号
* @param x 当前操作地块横坐标
* @param y 当前操作地块纵坐标
* @param direction 当前操作方向,若不是方向则为息壤或者加固
* @param road 建筑地图数组可理解为路径数组path_Array
*/
GameManager.prototype.getBoundary = function (order, x, y, direction, road) {
var jg = true;
if (x < 0 || x >= this.map_Width || y < 0 || y >= this.map_Hight) {
jg = false;
// console.log("超过边界,游戏结束");
// alert("超过边界,治水失败");
cc.fx.Notifications.emit(cc.fx.Message.showResult, "lose");
}
else {
var i = road[order].x * this.map_Array[0].length + road[order].y;
var target = this.block_Array[i].getComponent("Block");
if (target.block_Type == 3) {
jg = false;
// console.log("修筑山峰,游戏结束");
// alert("修筑山峰,治水失败");
cc.fx.Notifications.emit(cc.fx.Message.showResult, "lose");
}
else if (target.block_Type == 2 && direction != "Reinforce") {
jg = false;
// console.log("修筑未加固湿地,游戏结束");
// alert("修筑未加固湿地,游戏结束");
cc.fx.Notifications.emit(cc.fx.Message.showResult, "lose");
}
}
return jg;
};
/**
* 开始执行洪峰来了的动画
* @param order 建筑地图数组里的执行的序列号,依次往下加
*/
GameManager.prototype.runWater = function (order) {
order = parseInt(order);
if (order <= this.water_Array.length - 1) {
var i = this.water_Array[order].x * this.map_Array[0].length + this.water_Array[order].y;
var direction = "";
var circulate = true;
//最后一步结束
if (order == this.water_Array.length - 1) {
circulate = false;
direction = "End";
}
else {
if (this.water_Array[order].z == 6 && order + 1 < this.water_Array.length && order != 1) {
direction = "Reinforce";
i = this.water_Array[order + 1].x * this.map_Array[0].length + this.water_Array[order + 1].y;
}
else if (order + 1 < this.water_Array.length) {
if (this.water_Array[order + 1].z == 5) {
direction = "Xi_Soil";
}
else if (this.water_Array[order + 1].z == 6 && order == 0) {
direction = "Reinforce";
}
else {
direction = this.getDirection(order, this.water_Array);
}
}
else {
direction = this.getDirection(order, this.water_Array);
}
}
var jg = this.getBoundary(order, this.water_Array[order].x, this.water_Array[order].y, direction, this.water_Array);
if (direction == "" || jg == false || direction == "err") {
cc.fx.Notifications.emit(cc.fx.Message.showResult, "lose");
return;
}
var target = this.block_Array[i].getComponent("Block");
target.setPath(direction);
if (order > 0 && order < this.water_Array.length - 1) {
if (this.water_Array[order + 1].z == 5) {
this.set_Soil(order + 1, this.water_Array, "water");
circulate = false;
return;
}
else if (order == 1 && this.water_Array[order].z == 5) {
this.set_Soil(order, this.water_Array, "water");
circulate = false;
return;
}
}
var pos = cc.v2();
if (direction == "End") {
if (order > 0) {
if (this.water_Array[order - 1].z == 0) {
pos = cc.v2(this.water_Array[order - 1].x, this.water_Array[order - 1].y);
}
}
}
var data = {
order: order,
time: cc.fx.GameConfig.TIME_INFO.waterSpeed[cc.fx.GameConfig.GM_INFO.level],
type: this.water_Array[order].z,
circulate: circulate,
last: pos
};
target.runWater(data);
}
};
/**
* 获取息壤的格子的方向
* @param order 建筑地图数组里的执行的序列号,依次往下加
* @param road 建筑地图数组或者洪峰路径数组可理解为路径数组path_Array water_Array
*/
GameManager.prototype.getXi_Soil = function (order, road) {
var direction = null;
//如果息壤后面还有下一步的话
if (order + 1 < road.length) {
direction = this.getDirection(order, road);
if (direction == "up" || direction == "right_up" || direction == "left_up") {
direction = "up";
}
else if (direction == "down" || direction == "left_down" || direction == "right_down") {
direction = "down";
}
else if (direction == "left" || direction == "up_left" || direction == "down_left") {
direction = "left";
}
else if (direction == "right" || direction == "up_right" || direction == "down_right") {
direction = "right";
}
}
return direction;
};
/**
* 设置息壤执行方法
* @param order 建筑地图数组里的执行的序列号,依次往下加
* @param road 建筑地图数组或者洪峰路径数组可理解为路径数组path_Array water_Array
* @param name road或者water,建筑路径或者洪峰路径
*/
GameManager.prototype.set_Soil = function (order, road, name) {
var direction = this.getXi_Soil(order, road);
var length = 0;
if (direction == "right") {
length = this.map_Width - 1;
// let temp = this.map_Width - 1;
for (var i = road[order].x; i <= length; i++) {
var n = i * this.map_Array[0].length + road[order].y;
var target = this.block_Array[n].getComponent("Block");
if (target.block_Type == 3 || target.block_Type == 4) {
length = i - 1;
if (target.block_Type == 4) {
length += 1;
}
i = 10000;
break;
}
}
}
else if (direction == "left") {
length = 0;
for (var i = road[order].x; i >= length; i--) {
var n = i * this.map_Array[0].length + road[order].y;
var target = this.block_Array[n].getComponent("Block");
if (target.block_Type == 3 || target.block_Type == 4) {
length = i + 1;
if (target.block_Type == 4) {
length -= 1;
}
i = -1;
break;
}
}
}
else if (direction == "up") {
length = 0;
for (var i = road[order].y; i >= length; i--) {
var n = road[order].x * this.map_Array[0].length + i;
var target = this.block_Array[n].getComponent("Block");
if (target.block_Type == 3 || target.block_Type == 4) {
length = i + 1;
if (target.block_Type == 4) {
length -= 1;
}
i = -1;
break;
}
}
}
else if (direction == "down") {
length = this.map_Hight - 1;
for (var i = road[order].y; i <= length; i++) {
var n = road[order].x * this.map_Array[0].length + i;
var target = this.block_Array[n].getComponent("Block");
if (target.block_Type == 3 || target.block_Type == 4) {
length = i - 1;
if (target.block_Type == 4) {
length += 1;
}
i = 10000;
break;
}
}
}
this.soil_Find(direction, order, length, road, name);
};
//查找息壤蛮遗憾路径
GameManager.prototype.soil_Find = function (direction, order, length, road, name) {
var start = road[order].x;
if (direction == "right") {
for (var i = start; i <= length; i++) {
var n = i * this.map_Array[0].length + road[order].y;
var target = this.block_Array[n].getComponent("Block");
if (i == start) {
if (i == start && i == length) {
cc.fx.Notifications.emit(cc.fx.Message.showResult, "lose");
target.set_Xi_SoilType(this.getDirection(order, road), order, name);
}
else
target.set_Xi_SoilType(this.getDirection(order, road), null, name);
var value = cc.v3(this.path_Array[order].x, this.path_Array[order].y, 0);
if (this.water_Array[this.water_Array.length - 1] != value) {
// console.log("特别插入:",this.path_Array[order].x,this.path_Array[order].y);
this.changeWater(value);
}
}
else {
var jg = null;
if (i == length) {
var number = i - start - 1;
this.changePath(order, number, false, road);
jg = order;
}
target.set_Xi_SoilType(direction, jg, name);
}
}
}
else if (direction == "left") {
for (var i = start; i >= length; i--) {
var n = i * this.map_Array[0].length + road[order].y;
var target = this.block_Array[n].getComponent("Block");
if (i == start) {
if (i == start && i == length) {
cc.fx.Notifications.emit(cc.fx.Message.showResult, "lose");
target.set_Xi_SoilType(this.getDirection(order, road), order, name);
}
else
target.set_Xi_SoilType(this.getDirection(order, road), null, name);
var value = cc.v3(this.path_Array[order].x, this.path_Array[order].y, 0);
if (this.water_Array[this.water_Array.length - 1] != value) {
// console.log("特别插入:",this.path_Array[order].x,this.path_Array[order].y);
this.changeWater(value);
}
}
else {
var jg = null;
if (i == length) {
var number = i - start + 1;
this.changePath(order, number, false, road);
jg = order;
}
target.set_Xi_SoilType(direction, jg, name);
}
}
}
else if (direction == "up") {
start = road[order].y;
for (var i = start; i >= length; i--) {
var n = road[order].x * this.map_Array[0].length + i;
var target = this.block_Array[n].getComponent("Block");
if (i == start) {
if (i == start && i == length) {
cc.fx.Notifications.emit(cc.fx.Message.showResult, "lose");
target.set_Xi_SoilType(this.getDirection(order, road), order, name);
}
else {
target.set_Xi_SoilType(this.getDirection(order, road), null, name);
}
var value = cc.v3(this.path_Array[order].x, this.path_Array[order].y, 0);
if (this.water_Array[this.water_Array.length - 1] != value) {
// console.log("特别插入:",this.path_Array[order].x,this.path_Array[order].y);
this.changeWater(value);
}
}
else {
var jg = null;
if (i == length) {
var number = i - start + 1;
this.changePath(order, number, true, road);
jg = order;
}
// console.log("想上息壤插入:",this.path_Array[order].x,i);
target.set_Xi_SoilType(direction, jg, name);
}
}
}
else if (direction == "down") {
start = road[order].y;
for (var i = start; i <= length; i++) {
var n = road[order].x * this.map_Array[0].length + i;
var target = this.block_Array[n].getComponent("Block");
if (i == start) {
if (i == start && i == length) {
cc.fx.Notifications.emit(cc.fx.Message.showResult, "lose");
target.set_Xi_SoilType(this.getDirection(order, road), order, name);
}
else
target.set_Xi_SoilType(this.getDirection(order, road), null, name);
var value = cc.v3(this.path_Array[order].x, this.path_Array[order].y, 0);
if (this.water_Array[this.water_Array.length - 1] != value) {
// console.log("特别插入:",this.path_Array[order].x,this.path_Array[order].y);
this.changeWater(value);
}
}
else {
var jg = null;
if (i == length) {
var number = i - start - 1;
this.changePath(order, number, true, road);
jg = order;
}
target.set_Xi_SoilType(direction, jg, name);
}
}
}
};
/**
* 改变水流地图
* @param value 需要根据使用息壤情况,插入到洪峰路径的点
*/
GameManager.prototype.changeWater = function (value) {
var jg = true;
if (this.water_Array.length > 0) {
if (this.water_Array[this.water_Array.length - 1].x == value.x && this.water_Array[this.water_Array.length - 1].y == value.y) {
jg = false;
}
}
if (jg)
this.water_Array.push(value);
};
/**
* 息壤过后改变修筑路径
* @param order 建筑地图数组里的执行的序列号
* @param number 息壤执行长度,改变息壤用后其他路径的X或Y值
* @param direction 只为两个方向横向false,纵向true
* @param road 建筑地图数组或者洪峰路径数组可理解为路径数组path_Array water_Array
*/
GameManager.prototype.changePath = function (order, number, direction, road) {
for (var i = (order + 1); i < road.length; i++) {
if (!direction) {
road[i].x += (number);
}
else {
road[i].y += (number);
}
}
if (direction) {
if (number < 0) {
for (var n = -number; n > 0; n--) {
this.changeWater(cc.v3(this.path_Array[order + 1].x, this.path_Array[order + 1].y + n, 0));
// console.log("1特殊放入:",this.path_Array[order+1].x,this.path_Array[order+1].y+n)
}
}
else {
for (var n = number; n > 0; n--) {
this.changeWater(cc.v3(this.path_Array[order + 1].x, this.path_Array[order + 1].y - n, 0));
// console.log("2特殊放入:",this.path_Array[order+1].x,this.path_Array[order+1].y-n)
}
}
}
else {
if (number < 0) {
for (var m = -number; m > 0; m--) {
this.changeWater(cc.v3(this.path_Array[order + 1].x + m, this.path_Array[order + 1].y, 0));
// console.log("3特殊放入:",this.path_Array[order+1].x+m,this.path_Array[order+1].y)
}
}
else {
for (var m = number; m > 0; m--) {
this.changeWater(cc.v3(this.path_Array[order + 1].x - m, this.path_Array[order + 1].y, 0));
// console.log("4特殊放入:",this.path_Array[order+1].x-m,this.path_Array[order+1].y)
}
}
}
};
/**
* 获取洪峰方向
* @param order 建筑地图数组里的执行的序列号
* @param road 建筑地图数组或者洪峰路径数组可理解为路径数组path_Array water_Array
*/
GameManager.prototype.getDirection = function (order, road) {
var name = "";
//入海口比较复杂单独判断
if (order == 0) {
if (this.path_Array[order + 1].z == 6 && road == this.path_Array)
order += 1;
var nextX = road[order + 1].x - road[order].x;
var nextY = road[order].y - road[order + 1].y;
//在底边
if (road[order].y == this.map_Array[0].length - 1) {
if (nextX == 0) {
if (nextY == 1)
name = "up";
else if (nextY == -1)
name = "err";
}
else if (nextX == 1)
name = "up_right";
else if (nextX == -1)
name = "up_left";
}
//在顶边
else if (road[order].y == 0) {
if (nextX == 0) {
if (nextY == 1)
name = "err";
else if (nextY == -1)
name = "down";
}
else if (nextX == 1)
name = "down_right";
else if (nextX == -1)
name = "down_left";
}
//在左边
else if (road[order].x == 0) {
if (nextX == 0) {
if (nextY == 1)
name = "right_up";
else if (nextY == -1)
name = "right_down";
}
else if (nextX == 1)
name = "right";
else if (nextX == -1)
name = "err";
}
//在右边
else if (road[order].x == this.map_Array.length - 1) {
if (nextX == 0) {
if (nextY == 1)
name = "left_up";
else if (nextY == -1)
name = "left_down";
}
else if (nextX == 1)
name = "err";
else if (nextX == -1)
name = "left";
}
}
//不是第一步,已经走过一步
else if (order > 0) {
var next = 1;
if (order + 2 < road.length) {
if (road[order + 1].z == 6)
next = 2;
}
//用于判断此点的上一个点,是为了判断当前方块洪水七点,以及下一个移动方向,判断洪终点方向
var nextX = road[order + next].x - road[order].x;
var nextY = road[order].y - road[order + next].y;
var previousX = road[order].x - road[order - 1].x;
var previousY = road[order - 1].y - road[order].y;
if (previousX == 0 && previousY == 0) {
if (order > 1) {
previousX = road[order].x - road[order - 2].x;
previousY = road[order - 2].y - road[order].y;
}
else if (order + 1 < road.length) {
previousX = road[order + 1].x - road[order].x;
previousY = road[order].y - road[order + 1].y;
// console.log("息壤,上下坐标差距",previousX,previousY);
}
}
if (previousX == 0 && previousY >= 1) {
if (nextX == 0) {
if (nextY == 1)
name = "up";
else if (nextY == -1)
name = "err";
}
else if (nextX == 1)
name = "up_right";
else if (nextX == -1)
name = "up_left";
}
else if (previousX == 0 && previousY <= -1) {
if (nextX == 0) {
if (nextY == 1)
name = "err";
else if (nextY == -1)
name = "down";
}
else if (nextX == 1)
name = "down_right";
else if (nextX == -1)
name = "down_left";
}
else if (previousX >= 1 && previousY == 0) {
if (nextX == 0) {
if (nextY == 1)
name = "right_up";
else if (nextY == -1)
name = "right_down";
}
else if (nextX == 1)
name = "right";
else if (nextX == -1)
name = "err";
}
else if (previousX <= -1 && previousY == 0) {
if (nextX == 0) {
if (nextY == 1)
name = "left_up";
else if (nextY == -1)
name = "left_down";
}
else if (nextX == 1)
name = "err";
else if (nextX == -1)
name = "left";
}
}
return name;
};
//根据是否全面屏,做独立适配方面
GameManager.prototype.fit = function () {
var jg = this.setFit();
if (!jg) {
this.Map.scale = 1.2;
}
else {
this.Map.scale = 1;
}
};
//判断全面屏
GameManager.prototype.getSetScreenResolutionFlag = function () {
var size = cc.winSize;
var width = size.width;
var height = size.height;
if ((height / width) > (16.2 / 9))
return false;
return true;
};
//判断全面屏适配
GameManager.prototype.setFit = function () {
var flag = this.getSetScreenResolutionFlag();
if (flag) {
}
else {
}
return flag;
};
//返回首页
GameManager.prototype.backScene = function () {
cc.director.loadScene("LoadScene");
};
/**
* 开始修筑
* @param data 记录操作的数组
*/
GameManager.prototype.startGame = function (data) {
this.unschedule(this.updateWaterTime);
for (var i = 0; i < this.block_Array.length; i++) {
this.block_Array[i].getChildByName("tipWin").active = false;
this.block_Array[i].getChildByName("tipLose").active = false;
}
this.unschedule(this.updateCountDownTime);
var now = cc.fx.GameTool.getTime();
var finishi = now - this.finishiTime;
var totalTime = now - this.startTime;
this.scoreTime = this.waterTime;
if (this.waterTime <= 0.5)
finishi = -1;
// console.log("submitTime:",finishi,this.finishiTime);
cc.fx.GameConfig.CLICK_SET("submitTime", finishi);
if (finishi == -1)
cc.fx.GameConfig.CLICK_SET("duration", cc.fx.GameConfig.TIME_INFO.waterTime[cc.fx.GameConfig.GM_INFO.level]);
else
cc.fx.GameConfig.CLICK_SET("duration", totalTime);
cc.fx.GameConfig.CLICK_SET("usedSteps", data.length);
this.setMap(data);
var arr = this.changeStep(data);
cc.fx.GameConfig.CLICK_SET("stepList", arr);
};
/**
* 用于埋点记录 转变方向名称为埋点所需要格式
* @param data 记录操作的数组
*/
GameManager.prototype.changeStep = function (data) {
var arr = [];
if (data.length > 0) {
for (var i = 0; i < data.length; i++) {
if (data[i] == "up")
arr[i] = "U";
else if (data[i] == "down")
arr[i] = "D";
else if (data[i] == "left")
arr[i] = "L";
else if (data[i] == "right")
arr[i] = "R";
else if (data[i] == "soil")
arr[i] = "X";
else if (data[i] == "reinforce")
arr[i] = "F";
}
}
return arr;
};
//洪峰倒计时,计时器
GameManager.prototype.updateWaterTime = function () {
var _this = this;
if (this.waterTime > 0) {
this.waterTime -= 1;
this.Countdown.string = cc.fx.GameTool.getTimeMargin(this.waterTime);
if (this.waterTime <= 0) {
this.unschedule(this.updateWaterTime);
if (!this.plan_over) {
this.waterTime = 0;
this.plan_over = true;
setTimeout(function () {
if (_this.water_Array.length == 0) {
cc.fx.Notifications.emit(cc.fx.Message.showResult, "lose");
}
else {
cc.fx.GameConfig.GM_INFO.min_Time = _this.waterTime;
_this.runWater(0);
}
}, 500);
}
}
}
};
//如果是倒计时 调用此方法
GameManager.prototype.updateCountDownTime = function () {
if (this.countTime > 0) {
this.countTime -= 1;
cc.fx.GameConfig.TIME_INFO.totalTime = this.countTime;
this.Time.string = cc.fx.GameTool.getTimeMargin(this.countTime);
if (this.countTime < 5) {
var over = this.node.getChildByName("Over");
cc.tween(over)
.to(0.2, { opacity: 255 })
.delay(0.1)
.to(0.2, { opacity: 0 })
.start();
}
if (this.countTime <= 0) {
this.countTime = 0;
this.setData("lose");
this.unschedule(this.updateCountDownTime);
this.gameOver();
}
}
};
//上传每次操作数据 success为成功还是失败
GameManager.prototype.setData = function (success) {
//设置埋点数据
cc.fx.GameConfig.CLICK_SET("mapId", cc.fx.GameConfig.LEVEL_INFO[cc.fx.GameConfig.GM_INFO.level][this.custom].id);
cc.fx.GameConfig.CLICK_SET("difficulty", cc.fx.GameConfig.GM_INFO.level);
cc.fx.GameConfig.CLICK_SET("optimizedSteps", cc.fx.GameConfig.LEVEL_INFO[cc.fx.GameConfig.GM_INFO.level][this.custom].min_steps);
cc.fx.GameConfig.CLICK_SET("round", cc.fx.GameConfig.GM_INFO.round);
cc.fx.GameConfig.CLICK_SET("timer", cc.fx.GameConfig.TIME_INFO.totalTime);
cc.fx.GameConfig.CLICK_SET("cumulativeScore", cc.fx.GameConfig.GM_INFO.score);
success = success == "lose" ? false : true;
if (success != null) {
cc.fx.GameConfig.CLICK_SET("success", success);
cc.fx.GameConfig.GM_INFO.fen = this.getScore();
if (!success)
cc.fx.GameConfig.GM_INFO.fen = 0;
cc.fx.GameConfig.CLICK_SET("getScore", cc.fx.GameConfig.GM_INFO.fen);
cc.fx.GameConfig.GM_INFO.score += cc.fx.GameConfig.GM_INFO.fen;
this.node.getChildByName("Top").getChildByName("id").getComponent(cc.Label).string =
cc.fx.GameConfig.GM_INFO.score;
cc.fx.GameConfig.CLICK_SET("cumulativeScore", cc.fx.GameConfig.GM_INFO.score);
if (this.countTime != 0)
cc.fx.GameConfig.GM_INFO.successList.push(success);
}
cc.fx.GameTool.setGameData();
};
//计算得分
GameManager.prototype.getScore = function () {
//最小步数
var min = cc.fx.GameConfig.LEVEL_INFO[cc.fx.GameConfig.GM_INFO.level][this.custom].min_steps;
//实际使用步数
var now = this.path_Array.length - 1;
if (now <= 0)
now = 0;
var x = (2.5 * min - now) / min;
var score = Math.pow(Math.pow(min, x), 0.5);
score = score * (this.scoreTime + 10) * 100;
return Math.floor(score);
};
//上传排行榜数据
GameManager.prototype.gameOver = function () {
var rate = 0;
var successList = cc.fx.GameConfig.GM_INFO.successList;
if (successList.length > 0) {
var success = 0;
for (var i = 0; i < successList.length; i++) {
if (successList[i] == true)
success += 1;
}
rate = success / successList.length;
}
rate = Math.floor(rate * 1000) / 10;
var data = {
score: cc.fx.GameConfig.GM_INFO.score,
rate: rate
};
cc.fx.GameTool.setRank(data);
this.node.getChildByName("GameOver").active = true;
this.node.getChildByName("GameOver").opacity = 0;
cc.tween(this.node.getChildByName("GameOver"))
.to(0.4, { opacity: 255 })
.delay(1)
.to(0.4, { opacity: 50 })
.call(function () {
cc.director.loadScene("OverScene");
})
.start();
};
//展示结果 data为成功或者失败
GameManager.prototype.showResult = function (data) {
if (this.node.getChildByName("GameOver").active == false && this.node.getChildByName("Window").active == false) {
cc.fx.Notifications.emit(cc.fx.Message.setData, data);
if (data == "lose") {
cc.fx.AudioManager._instance.playEffect("lose", null);
cc.fx.GameConfig.GM_INFO.min_Time = -1;
}
else {
cc.fx.AudioManager._instance.playEffect("win", null);
}
this.node.getChildByName("Window").active = true;
this.node.getChildByName("Window").getComponent("Window").init(data);
}
};
//记录反应时长,以及做步骤提示 data为操作名称
GameManager.prototype.clickSun = function (data) {
//如果没有记录过 回合开始到操作反应时长,则第一次记录, 后面不记录
if (cc.fx.GameConfig.CLICK_DATA.startTime == -1) {
this.finishiTime = cc.fx.GameTool.getTime();
var now = this.finishiTime - this.startTime;
// console.log("startTime:",this.finishiTime);
cc.fx.GameConfig.CLICK_SET("startTime", now);
}
if (cc.fx.GameConfig.GM_INFO.level > 3)
return;
//步骤提示
var nowPos = this.path_Array[0];
if (this.tip_Array.length != 0) {
if (this.tip_Array[this.tip_Array.length - 1] == null) {
this.tip_Array.push(null);
return;
}
nowPos = this.tip_Array[this.tip_Array.length - 1][this.tip_Array[this.tip_Array.length - 1].length - 1];
if (nowPos) {
var n = nowPos.x * this.map_Array[0].length + nowPos.y;
var targetNode = this.block_Array[n];
if (targetNode.getChildByName("tipLose").active == true) {
this.tip_Array.push(null);
return;
}
}
else {
return;
}
}
if (data == "up") {
var n = cc.v2(nowPos.x, nowPos.y - 1);
this.tipCan(n, data);
}
else if (data == "down") {
var n = cc.v2(nowPos.x, nowPos.y + 1);
this.tipCan(n, data);
}
else if (data == "left") {
var n = cc.v2(nowPos.x - 1, nowPos.y);
this.tipCan(n, data);
}
else if (data == "right") {
var n = cc.v2(nowPos.x + 1, nowPos.y);
this.tipCan(n, data);
}
else if (data == "reinforce") {
var n = cc.v3(nowPos.x, nowPos.y, 2);
this.tip_Array.push([n]);
}
else if (data == "soil") {
var n = cc.v3(nowPos.x, nowPos.y, 3);
this.tip_Array.push([n]);
}
};
//提示是否错误 只前三关有 ,pos为位置data为操作方向
GameManager.prototype.tipCan = function (pos, data) {
//先判断是否出边界
if (pos.x < 0 || pos.x > this.map_Array.length - 1 || pos.y < 0 || pos.y > this.map_Array[0].length - 1) {
this.tip_Array.push(null);
return;
}
var n = pos.x * this.map_Array[0].length + pos.y;
var target = this.block_Array[n].getComponent("Block");
target.node.getChildByName("tipWin").active = true;
//重复路回头路,或者山峰
if (target.repeatRoad(false, null) == true || target.block_Type == 3) {
this.tip_Array.push([cc.v3(pos.x, pos.y, 0)]);
target.node.getChildByName("tipLose").active = true;
target.node.getChildByName("tipWin").active = false;
}
//湿地 上一步如果没用息壤或者加固
else if (target.block_Type == 2) {
if (this.tip_Array.length > 0) {
if (this.tip_Array[this.tip_Array.length - 1][0].z == 0) {
target.node.getChildByName("tipLose").active = true;
target.node.getChildByName("tipWin").active = false;
}
else if (this.tip_Array[this.tip_Array.length - 1][0].z == 2) {
target.node.getChildByName("tipLose").active = false;
target.node.getChildByName("tipWin").active = true;
}
}
else {
target.node.getChildByName("tipLose").active = true;
target.node.getChildByName("tipWin").active = false;
}
}
if (this.tip_Array.length > 0) {
if (this.tip_Array[this.tip_Array.length - 1][0].z == 3) {
if (data == "up") {
var arr = [];
for (var i = pos.y; i >= 0; i--) {
var block = this.block_Array[pos.x * this.map_Array[0].length + i].getComponent("Block");
if (block.block_Type == 3) {
i = -10000;
}
else {
block.node.getChildByName("tipWin").active = true;
arr.push(cc.v3(pos.x, i, 0));
if (block.block_Type == 4)
i = -10000;
}
}
this.tip_Array.push(arr);
}
else if (data == "down") {
var arr = [];
for (var i = pos.y; i < this.map_Array[0].length; i++) {
var block = this.block_Array[pos.x * this.map_Array[0].length + i].getComponent("Block");
if (block.block_Type == 3) {
i = 10000;
}
else {
block.node.getChildByName("tipWin").active = true;
arr.push(cc.v3(pos.x, i, 0));
if (block.block_Type == 4)
i = 10000;
}
}
this.tip_Array.push(arr);
}
else if (data == "right") {
var arr = [];
for (var i = pos.x; i < this.map_Array.length; i++) {
var block = this.block_Array[i * this.map_Array[0].length + pos.y].getComponent("Block");
if (block.block_Type == 3) {
i = 10000;
}
else {
block.node.getChildByName("tipWin").active = true;
arr.push(cc.v3(i, pos.y, 0));
if (block.block_Type == 4)
i = 10000;
}
}
this.tip_Array.push(arr);
}
else if (data == "left") {
var arr = [];
for (var i = pos.x; i >= 0; i--) {
var block = this.block_Array[i * this.map_Array[0].length + pos.y].getComponent("Block");
if (block.block_Type == 3) {
i = -10000;
}
else {
block.node.getChildByName("tipWin").active = true;
arr.push(cc.v3(i, pos.y, 0));
if (block.block_Type == 4)
i = -10000;
}
}
this.tip_Array.push(arr);
}
}
else {
var posJg_1 = cc.v3(pos.x, pos.y, 0);
if (data == "reinforce")
pos.z = 2;
if (data == "soil")
pos.z = 3;
this.tip_Array.push([posJg_1]);
}
// console.log(this.tip_Array);
return;
}
var posJg = cc.v3(pos.x, pos.y, 0);
if (data == "reinforce")
pos.z = 2;
if (data == "soil")
pos.z = 3;
this.tip_Array.push([posJg]);
// console.log(this.tip_Array);
};
//移除提示
GameManager.prototype.removeTip = function (data) {
if (cc.fx.GameConfig.GM_INFO.level > 3)
return;
//分为撤回一步 和全部清空
if (this.tip_Array.length > 0) {
if (data == "back") {
var target = this.tip_Array[this.tip_Array.length - 1];
if (target == null) {
this.tip_Array.pop();
}
else {
this.tip_Array.pop();
for (var i = 0; i < target.length; i++) {
if (target[i]) {
if (target[0].z == 0) {
var n = target[i].x * this.map_Array[0].length + target[i].y;
var node = this.block_Array[n];
node.getChildByName("tipWin").active = false;
node.getChildByName("tipLose").active = false;
}
}
}
}
}
else if (data == "remove") {
for (var j = 0; j < this.tip_Array.length; j++) {
var target = this.tip_Array[j];
if (target != null) {
for (var i = 0; i < target.length; i++) {
if (target[i]) {
var n = target[i].x * this.map_Array[0].length + target[i].y;
var node = this.block_Array[n];
node.getChildByName("tipWin").active = false;
node.getChildByName("tipLose").active = false;
}
}
}
}
this.tip_Array = [];
}
}
};
//获取引导名字
GameManager.prototype.getGuideName = function () {
var name = "one";
switch (this.step) {
case 1:
name = "one";
this.btnClick = false;
this.bgClick = true;
break;
case 2:
name = "two";
this.btnClick = false;
this.bgClick = true;
break;
case 3:
name = "three";
this.btnClick = false;
this.bgClick = true;
break;
case 4:
name = "four";
this.btnClick = false;
this.bgClick = true;
break;
case 5:
name = "five";
this.btnClick = true;
this.bgClick = false;
break;
case 6:
name = "six";
this.btnClick = true;
this.bgClick = false;
break;
case 7:
name = "seven";
this.btnClick = false;
this.bgClick = true;
break;
case 8:
name = "eight";
this.btnClick = false;
this.bgClick = true;
break;
case 9:
name = "nine";
this.btnClick = false;
this.bgClick = true;
break;
case 10:
name = "ten";
this.btnClick = true;
this.bgClick = false;
break;
case 11:
name = "eleven";
this.btnClick = false;
this.bgClick = true;
break;
case 12:
name = "twelve";
this.btnClick = true;
this.bgClick = false;
break;
case 13:
name = "thirteen";
this.btnClick = true;
this.bgClick = false;
break;
case 14:
name = "fourteen";
this.btnClick = true;
this.bgClick = false;
break;
case 15:
name = "fiveteen";
this.btnClick = true;
this.bgClick = false;
break;
case 16:
name = "sixteen";
this.btnClick = true;
this.bgClick = false;
break;
case 17:
name = "last";
this.btnClick = true;
this.bgClick = false;
break;
}
return name;
};
//引导下一步
GameManager.prototype.guideNext = function () {
//每次先把所有的
console.log(this.step, this.Guide.children.length);
if (this.step + 1 == this.Guide.children.length) {
cc.fx.GameConfig.GM_INFO.guide = false;
// cc.director.loadScene("GameScene");
var name_1 = cc.fx.GameConfig.GM_INFO.gameId + "_guide";
cc.fx.StorageMessage.setStorage(name_1, cc.fx.GameConfig.GM_INFO.guide);
}
if (this.step > 0)
this.Guide.children[this.step - 1].active = false;
this.step += 1;
var name = this.getGuideName();
var target = this.Guide.getChildByName(name);
target.active = true;
var size = cc.winSize;
if (size.height > 1334) {
var height = (size.height - 1334) / 2;
target.getChildByName("sp").height += height;
}
};
GameManager.prototype.onEnable = function () {
cc.fx.Notifications.on(cc.fx.Message.control, this.clickSun, this);
cc.fx.Notifications.on(cc.fx.Message.next, this.runRoad, this);
cc.fx.Notifications.on(cc.fx.Message.nextWater, this.runWater, this);
cc.fx.Notifications.on(cc.fx.Message.startGame, this.startGame, this);
cc.fx.Notifications.on(cc.fx.Message.changePath, this.changePath, this);
cc.fx.Notifications.on(cc.fx.Message.setData, this.setData, this);
cc.fx.Notifications.on(cc.fx.Message.guideNext, this.guideNext, this);
cc.fx.Notifications.on(cc.fx.Message.showResult, this.showResult, this);
cc.fx.Notifications.on(cc.fx.Message.removeTip, this.removeTip, this);
};
GameManager.prototype.onDisable = function () {
cc.fx.Notifications.off(cc.fx.Message.control, this.clickSun);
cc.fx.Notifications.off(cc.fx.Message.next, this.runRoad);
cc.fx.Notifications.off(cc.fx.Message.nextWater, this.runWater);
cc.fx.Notifications.off(cc.fx.Message.startGame, this.startGame);
cc.fx.Notifications.off(cc.fx.Message.changePath, this.changePath);
cc.fx.Notifications.off(cc.fx.Message.setData, this.setData);
cc.fx.Notifications.off(cc.fx.Message.guideNext, this.guideNext);
cc.fx.Notifications.off(cc.fx.Message.showResult, this.showResult);
cc.fx.Notifications.off(cc.fx.Message.removeTip, this.removeTip);
};
GameManager.prototype.update = function (dt) {
};
__decorate([
property(cc.Node)
], GameManager.prototype, "Map", void 0);
__decorate([
property(cc.Prefab)
], GameManager.prototype, "Block", void 0);
__decorate([
property(cc.Label)
], GameManager.prototype, "Time", void 0);
__decorate([
property(cc.Label)
], GameManager.prototype, "Countdown", void 0);
__decorate([
property(cc.Node)
], GameManager.prototype, "Guide", void 0);
GameManager = __decorate([
ccclass
], GameManager);
return GameManager;
}(cc.Component));
exports.default = GameManager;
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0XFxHYW1lTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpQ0FBb0M7QUFFcEMsU0FBUztBQUNILElBQUEsS0FBc0IsRUFBRSxDQUFDLFVBQVUsRUFBbEMsT0FBTyxhQUFBLEVBQUUsUUFBUSxjQUFpQixDQUFDO0FBRTFDO0lBQXlDLCtCQUFZO0lBQXJEO1FBQUEscUVBMDRDQztRQXY0Q0csU0FBRyxHQUFZLElBQUksQ0FBQztRQUdwQixXQUFLLEdBQWMsSUFBSSxDQUFDO1FBR3hCLFVBQUksR0FBYSxJQUFJLENBQUM7UUFHdEIsZUFBUyxHQUFhLElBQUksQ0FBQztRQUczQixXQUFLLEdBQVksSUFBSSxDQUFDOztJQTIzQzFCLENBQUM7SUFsMkNHLDRCQUFNLEdBQU47SUFDQSxDQUFDO0lBQ0QsMkJBQUssR0FBTDtRQUNJLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNYLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBRUQsa0RBQWtEO0lBQ2xELDRCQUFNLEdBQU47UUFDSSxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDZixJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxFQUFDO1lBQ25DLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzFHO2FBQ0c7WUFD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SSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVU7Z0JBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQztZQUMxRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUMsS0FBSztZQUNMLElBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBQyxDQUFDLEVBQUM7Z0JBQzNDLElBQUcsS0FBSyxJQUFJLENBQUMsRUFBQztvQkFDVixJQUFHLEtBQUssSUFBSSxDQUFDO3dCQUFDLElBQUksR0FBRyxJQUFJLENBQUM7eUJBQ3JCLElBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQzt3QkFBRSxJQUFJLEdBQUcsS0FBSyxDQUFDO2lCQUNyQztxQkFDSSxJQUFHLEtBQUssSUFBSSxDQUFDO29CQUFFLElBQUksR0FBRyxVQUFVLENBQUM7cUJBQ2pDLElBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQztvQkFBRSxJQUFJLEdBQUcsU0FBUyxDQUFDO2FBQ3pDO1lBQ0QsS0FBSztpQkFDQSxJQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFDO2dCQUN2QixJQUFHLEtBQUssSUFBSSxDQUFDLEVBQUM7b0JBQ1YsSUFBRyxLQUFLLElBQUksQ0FBQzt3QkFBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO3lCQUN0QixJQUFHLEtBQUssSUFBSSxDQUFDLENBQUM7d0JBQUUsSUFBSSxHQUFHLE1BQU0sQ0FBQztpQkFDdEM7cUJBQ0ksSUFBRyxLQUFLLElBQUksQ0FBQztvQkFBRSxJQUFJLEdBQUcsWUFBWSxDQUFDO3FCQUNuQyxJQUFHLEtBQUssSUFBSSxDQUFDLENBQUM7b0JBQUUsSUFBSSxHQUFHLFdBQVcsQ0FBQzthQUMzQztZQUNELEtBQUs7aUJBQ0EsSUFBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBQztnQkFDdkIsSUFBRyxLQUFLLElBQUksQ0FBQyxFQUFDO29CQUNWLElBQUcsS0FBSyxJQUFJLENBQUM7d0JBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQzt5QkFDM0IsSUFBRyxLQUFLLElBQUksQ0FBQyxDQUFDO3dCQUFFLElBQUksR0FBRyxZQUFZLENBQUM7aUJBQzVDO3FCQUNJLElBQUcsS0FBSyxJQUFJLENBQUM7b0JBQUUsSUFBSSxHQUFHLE9BQU8sQ0FBQztxQkFDOUIsSUFBRyxLQUFLLElBQUksQ0FBQyxDQUFDO29CQUFFLElBQUksR0FBRyxLQUFLLENBQUM7YUFDckM7WUFDRCxLQUFLO2lCQUNBLElBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBQyxDQUFDLEVBQUM7Z0JBQzdDLElBQUcsS0FBSyxJQUFJLENBQUMsRUFBQztvQkFDVixJQUFHLEtBQUssSUFBSSxDQUFDO3dCQUFDLElBQUksR0FBRyxTQUFTLENBQUM7eUJBQzFCLElBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQzt3QkFBRSxJQUFJLEdBQUcsV0FBVyxDQUFDO2lCQUMzQztxQkFDSSxJQUFHLEtBQUssSUFBSSxDQUFDO29CQUFFLElBQUksR0FBRyxLQUFLLENBQUM7cUJBQzVCLElBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQztvQkFBRSxJQUFJLEdBQUcsTUFBTSxDQUFDO2FBQ3RDO1NBQ0o7UUFDRCxjQUFjO2FBQ1QsSUFBRyxLQUFLLEdBQUcsQ0FBQyxFQUFDO1lBQ2QsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQ2IsSUFBRyxLQUFLLEdBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUM7Z0JBQ3JCLElBQUcsSUFBSSxDQUFDLEtBQUssR0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztvQkFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDO2FBQ3JDO1lBRUQsNkNBQTZDO1lBQzdDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0MsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUM5QyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hELElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEQsSUFBRyxTQUFTLElBQUksQ0FBQyxJQUFJLFNBQVMsSUFBSSxDQUFDLEVBQUM7Z0JBQ2hDLElBQUcsS0FBSyxHQUFHLENBQUMsRUFBQztvQkFDVCxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDNUMsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQy9DO3FCQUNJLElBQUcsS0FBSyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFDO29CQUM1QixTQUFTLEdBQUcs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RyxLQUFLLENBQUM7Z0JBQ2IsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUNwQixNQUFNO1lBQ1YsS0FBSyxDQUFDO2dCQUNGLElBQUksR0FBRyxPQUFPLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUNwQixNQUFNO1lBQ1YsS0FBSyxDQUFDO2dCQUNGLElBQUksR0FBRyxNQUFNLENBQUM7Z0JBQ2QsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUNwQixNQUFNO1lBQ1YsS0FBSyxDQUFDO2dCQUNGLElBQUksR0FBRyxNQUFNLENBQUM7Z0JBQ2QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2dCQUNyQixNQUFNO1lBQ1YsS0FBSyxDQUFDO2dCQUNGLElBQUksR0FBRyxLQUFLLENBQUM7Z0JBQ2IsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2dCQUNyQixNQUFNO1lBQ1YsS0FBSyxDQUFDO2dCQUNGLElBQUksR0FBRyxPQUFPLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUNwQixNQUFNO1lBQ1YsS0FBSyxDQUFDO2dCQUNGLElBQUksR0FBRyxPQUFPLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUNwQixNQUFNO1lBQ1YsS0FBSyxDQUFDO2dCQUNGLElBQUksR0FBRyxNQUFNLENBQUM7Z0JBQ2Qs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LENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN4RSxFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RFLEVBQUUsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN4RSxFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUNELCtCQUFTLEdBQVQ7UUFDSSxFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5RCxFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxRCxFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRSxFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRSxFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNuRSxFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3RCxFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRSxFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNuRSxFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBQ0QsNEJBQU0sR0FBTixVQUFRLEVBQUU7SUFHVixDQUFDO0lBdDRDRDtRQURDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDOzRDQUNFO0lBR3BCO1FBREMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUM7OENBQ0k7SUFHeEI7UUFEQyxRQUFRLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQzs2Q0FDRztJQUd0QjtRQURDLFFBQVEsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO2tEQUNRO0lBRzNCO1FBREMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7OENBQ0k7SUFmTCxXQUFXO1FBRC9CLE9BQU87T0FDYSxXQUFXLENBMDRDL0I7SUFBRCxrQkFBQztDQTE0Q0QsQUEwNENDLENBMTRDd0MsRUFBRSxDQUFDLFNBQVMsR0EwNENwRDtrQkExNENvQixXQUFXIiwiZmlsZSI6IiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmxvY2tUeXBlIH0gZnJvbSBcIi4vQmxvY2tcIjtcclxuXHJcbi8vIOS4u+a4uOaIj+aOp+WItuexu1xyXG5jb25zdCB7Y2NjbGFzcywgcHJvcGVydHl9ID0gY2MuX2RlY29yYXRvcjtcclxuQGNjY2xhc3NcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2FtZU1hbmFnZXIgZXh0ZW5kcyBjYy5Db21wb25lbnQge1xyXG5cclxuICAgIEBwcm9wZXJ0eShjYy5Ob2RlKVxyXG4gICAgTWFwOiBjYy5Ob2RlID0gbnVsbDtcclxuXHJcbiAgICBAcHJvcGVydHkoY2MuUHJlZmFiKVxyXG4gICAgQmxvY2s6IGNjLlByZWZhYiA9IG51bGw7XHJcblxyXG4gICAgQHByb3BlcnR5KGNjLkxhYmVsKVxyXG4gICAgVGltZTogY2MuTGFiZWwgPSBudWxsO1xyXG5cclxuICAgIEBwcm9wZXJ0eShjYy5MYWJlbClcclxuICAgIENvdW50ZG93bjogY2MuTGFiZWwgPSBudWxsO1xyXG5cclxuICAgIEBwcm9wZXJ0eShjYy5Ob2RlKVxyXG4gICAgR3VpZGU6IGNjLk5vZGUgPSBudWxsO1xyXG5cclxuICAgIHN0ZXA6bnVtYmVyOyAgICAgICAgICAgIC8v5byV5a+85q2l6aqkXHJcbiAgICBiZ0NsaWNrOmJvb2xlYW4gICAgICAgICAvL+W8leWvvOaXtk1hc2vpga7nvanlj6/kuI3lj6/ku6Xngrnlh7tcclxuICAgIGJ0bkNsaWNrOmJvb2xlYW4gICAgICAgIC8v5byV5a+85pe277yM5oyJ6ZKu5Y+v5LiN5Y+v54K55Ye7XHJcbiAgICBjdXN0b206bnVtYmVyOyAgICAgICAgICAvL+W9k+WJjemavuW6pumaj+acuuWcsOWbvklEXHJcbiAgICBjb3VudFRpbWU6IG51bWJlcjsgICAgICAvL+aAu+WAkuiuoeaXtlxyXG4gICAgd2F0ZXJUaW1lOiBudW1iZXIgICAgICAgLy/mtKrls7DlgJLorqHml7ZcclxuICAgIHN0YXJ0VGltZTogbnVtYmVyOyAgICAgIC8v5ri45oiP5byA5aeL6K6h5pe2XHJcbiAgICByZXBsYWNlVGltZTogbnVtYmVyICAgICAvL+a0quWzsOWAkuiuoeaXtizlvZPmgLvliankvZnml7bpl7TlsI/kuo7mtKrls7DlgJLorqHml7bvvIznlKjkuo7mm7/ku6NcclxuICAgIGZpbmlzaGlUaW1lOm51bWJlcjsgICAgIC8v5o+Q5Lqk5pe26Ze0XHJcbiAgICBzY29yZVRpbWU6bnVtYmVyICAgICAgICAvL+eUqOS6juiuoeeul+aPkOS6pOWIsOa0quWzsOadpeeahOaXtumXtOW3rlxyXG4gICAgYmxvY2tfQXJyYXk6IGFueTsgICAgICAgLy/miYDmnInlnZfmlbDnu4RcclxuICAgIHBhdGhfQXJyYXk6IGFueTsgICAgICAgIC8v5L+u562R6Lev5b6EXHJcbiAgICB3YXRlcl9BcnJheTogYW55OyAgICAgICAvL+awtOa1gei3r+W+hFxyXG4gICAgbWFwX0FycmF5OiBhbnk7ICAgICAgICAgLy/lnLDlm77mlbDnu4RcclxuICAgIHdhdGVyX1BhdGhBcmF5OmFueTsgICAgIC8v5rSq5bOw6Lev5b6EXHJcbiAgICB0aXBfQXJyYXk6IGFueTsgICAgICAgICAvL+W8leWvvOaVsOe7hFxyXG4gICAgbWFwX0hpZ2h0Om51bWJlcjsgICAgICAgLy/lnLDlm77pq5jluqZcclxuICAgIG1hcF9XaWR0aDpudW1iZXI7ICAgICAgIC8v5Zyw5Zu+5a695bqmXHJcbiAgICBtaW5fVGltZTpudW1iZXI7ICAgICAgICAvL+S4iuS4gOaKiuWcsOWbvue7k+adn+aXtu+8jOi3neemu+a0quWzsOadpeS4tOaXtumXtCAoPjXnp5LmmK/kuKrliIbmsLTlsq0pXHJcbiAgICBtaW5fU3RlcHM6bnVtYmVyOyAgICAgICAvL+W9k+WJjeWcsOWbvuacgOS8mOatpeaVsFxyXG4gICAgcGxhbl9vdmVyOmJvb2xlYW47ICAgICAgLy/mmK/lkKbkv67lu7rlroxcclxuICAgIHdhdGVyVHdlZW46Y2MuVHdlZW47ICAgIC8v5rKz5rC05YCS6K6h5pe25Yqo55S7XHJcblxyXG4gICAgb25Mb2FkICgpIHtcclxuICAgIH1cclxuICAgIHN0YXJ0ICgpIHtcclxuICAgICAgICBjYy5meC5HYW1lQ29uZmlnLkNMSUNLX2luaXQoKTtcclxuICAgICAgICB0aGlzLmZpdCgpO1xyXG4gICAgICAgIHRoaXMuaW5pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8v5aSE55CG5Zyw5Zu+5pWw5o2uIOesrOS4gOWFs+WujOWFqOmaj+acuu+8jOS7juesrOS6jOWFs+W8gOWni++8jOi1ouS6huagueaNrjXnp5LmtKrls7DmnaXkuLTlop7liqDpmr7luqbmraXmlbDvvIzovpPkuoblvZPliY3pmr7luqblh4/mraXmlbBcclxuICAgIGdldE1hcCgpe1xyXG4gICAgICAgIHZhciBjdXN0b20gPSAwO1xyXG4gICAgICAgIHZhciBtYXAgPSBbXTtcclxuICAgICAgICBpZihjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8ubGV2ZWwgPT0gMSl7XHJcbiAgICAgICAgICAgIGN1c3RvbSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSogY2MuZnguR2FtZUNvbmZpZy5MRVZFTF9JTkZPW2NjLmZ4LkdhbWVDb25maWcuR01fSU5GTy5sZXZlbF0ubGVuZ3RoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgdmFyIGFyciA9IGNjLmZ4LkdhbWVDb25maWcuTEVWRUxfSU5GT1tjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8ubGV2ZWxdO1xyXG4gICAgICAgICAgICBpZihjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8ubWluX1RpbWUgPT0gLTEpe1xyXG4gICAgICAgICAgICAgICAgbWFwID0gdGhpcy5nZXRNYXBBcnJheShhcnIsY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLm1pbl9TdGVwcyAtIDEsZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYoY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLm1pbl9UaW1lID49IDUpe1xyXG4gICAgICAgICAgICAgICAgbWFwID0gdGhpcy5nZXRNYXBBcnJheShhcnIsY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLm1pbl9TdGVwcyArIDIsdHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgIG1hcCA9IHRoaXMuZ2V0TWFwQXJyYXkoYXJyLGNjLmZ4LkdhbWVDb25maWcuR01fSU5GTy5taW5fU3RlcHMgKyAxLHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciByYW5kb20gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqIG1hcC5sZW5ndGgpO1xyXG4gICAgICAgICAgICBjdXN0b20gPSBtYXBbcmFuZG9tXTtcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coY3VzdG9tLG1hcCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8v6K6w5b2V5b2T5YmN5pyA5bCP5q2l5pWwXHJcbiAgICAgICAgY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLm1pbl9TdGVwcyA9IGNjLmZ4LkdhbWVDb25maWcuTEVWRUxfSU5GT1tjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8ubGV2ZWxdW2N1c3RvbV0ubWluX3N0ZXBzO1xyXG4gICAgICAgIGNjLmZ4LkdhbWVDb25maWcuR01fSU5GTy5taW5fVGltZSA9IDA7XHJcbiAgICAgICAgcmV0dXJuIGN1c3RvbTtcclxuICAgIH1cclxuICAgICAvKipcclxuICAgICAqIOiOt+WPluS4i+S4gOWFs+mavuW6pu+8jOatpeaVsOWinuWKoDLmiJbogIUx77yM5aaC5p6c5rKh5pyJ5YiZ6ZmN5Yiw5pyJLlxyXG4gICAgICogQHBhcmFtIGFyciDphY3nva7ph4zor7vlj5bvvIzlvZPliY3vvIh4KnjvvInlnLDlm77nrYnnuqflhoXmiYDmnInlnLDlm77mlbDnu4RcclxuICAgICAqIEBwYXJhbSBtaW5fc3RlcHMg5pyA5L2z5q2l5pWw77yM5LiL5LiA5YWz6Zq+5bqm5oiW6ICF6L6T5LqG6ZmN6Zq+5bqm77yM5qC55o2u5pyA5L2z5q2l5pWw5aKe5Yqg5oiW6ICF5YeP5bCR44CCXHJcbiAgICAgKiBAcGFyYW0gdHlwZSAgdHJ1ZeS4uuWinuWKoOatpeaVsO+8jGZhbHNl5Li66L6T5LqG6ZmN5L2O6Zq+5bqm5q2l5pWwXHJcbiAgICAgKi9cclxuICAgIGdldE1hcEFycmF5KGFycixtaW5fc3RlcHMsdHlwZSl7XHJcbiAgICAgICAgdmFyIG1hcCA9IFtdO1xyXG4gICAgICAgIGZvcihsZXQgaT0wOyBpPGFyci5sZW5ndGg7IGkrKyl7XHJcbiAgICAgICAgICAgIGlmKGFycltpXS5taW5fc3RlcHMgPT0gbWluX3N0ZXBzKXtcclxuICAgICAgICAgICAgICAgIG1hcC5wdXNoKGkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKG1hcC5sZW5ndGggPT0gMCl7XHJcbiAgICAgICAgICAgIGlmKHR5cGUpICBtYXAgPSB0aGlzLmdldE1hcEFycmF5KGFycixtaW5fc3RlcHMgLSAxLHR5cGUpO1xyXG4gICAgICAgICAgICBlbHNlICBtYXAgPSB0aGlzLmdldE1hcEFycmF5KGFycixtaW5fc3RlcHMgKyAxLHR5cGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbWFwO1xyXG4gICAgfVxyXG5cclxuICAgIC8v5Yid5aeL5YyW5pWw5o2uXHJcbiAgICBpbml0KCl7XHJcbiAgICAgICAgbGV0IG5hbWUgPSBjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8uZ2FtZUlkICsgXCJfZ3VpZGVcIjtcclxuICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSkpO1xyXG5cclxuICAgICAgICBpZihkYXRhICE9IGZhbHNlKXtcclxuICAgICAgICAgICAgY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLmd1aWRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgY2MuZnguU3RvcmFnZU1lc3NhZ2Uuc2V0U3RvcmFnZShuYW1lLGNjLmZ4LkdhbWVDb25maWcuR01fSU5GTy5ndWlkZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIGNjLmZ4LkdhbWVDb25maWcuR01fSU5GTy5ndWlkZSA9IGNjLmZ4LlN0b3JhZ2VNZXNzYWdlLmdldFN0b3JhZ2UobmFtZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmluaXRNYXAoKTsgXHJcbiAgICAgICAgdGhpcy5maW5pc2hpVGltZSA9IDA7XHJcbiAgICAgICAgdGhpcy5zY29yZVRpbWUgPSAwO1xyXG4gICAgICAgIHRoaXMucmVwbGFjZVRpbWUgPSAwO1xyXG4gICAgICAgIHRoaXMuc3RhcnRUaW1lID0gY2MuZnguR2FtZVRvb2wuZ2V0VGltZSgpO1xyXG4gICAgICAgIHRoaXMuY291bnRUaW1lID0gY2MuZnguR2FtZUNvbmZpZy5USU1FX0lORk8udG90YWxUaW1lO1xyXG4gICAgICAgIGlmKHRoaXMuY291bnRUaW1lID09IDAgKXtcclxuICAgICAgICAgICAgdGhpcy5nYW1lT3ZlcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLndhdGVyVGltZSA9IGNjLmZ4LkdhbWVDb25maWcuVElNRV9JTkZPLndhdGVyVGltZVtjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8ubGV2ZWxdO1xyXG4gICAgICAgIC8vIGlmKHRoaXMuY291bnRUaW1lIDwgdGhpcy53YXRlclRpbWUpIHRoaXMucmVwbGFjZVRpbWUgPSB0aGlzLmNvdW50VGltZTtcclxuICAgICAgICB0aGlzLlRpbWUuc3RyaW5nID0gIGNjLmZ4LkdhbWVUb29sLmdldFRpbWVNYXJnaW4odGhpcy5jb3VudFRpbWUpOyAgICBcclxuXHJcbiAgICAgICAgaWYoIWNjLmZ4LkdhbWVDb25maWcuR01fSU5GTy5ndWlkZSl7XHJcbiAgICAgICAgICAgIHRoaXMuR3VpZGUuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuc3RlcCA9IDA7XHJcbiAgICAgICAgICAgIHZhciBoZWFkID0gdGhpcy5ub2RlLmdldENoaWxkQnlOYW1lKFwiVG9wXCIpLmdldENoaWxkQnlOYW1lKFwiaGVhZFwiKTtcclxuICAgICAgICAgICAgdmFyIHByb2dyZXNzID0gdGhpcy5ub2RlLmdldENoaWxkQnlOYW1lKFwiVG9wXCIpLmdldENoaWxkQnlOYW1lKFwicHJvZ3Jlc3NcIikuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSk7XHJcbiAgICAgICAgICAgIGhlYWQucnVuQWN0aW9uKGNjLm1vdmVUbyh0aGlzLndhdGVyVGltZSxjYy52MigzMTAsaGVhZC55KSkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy53YXRlclR3ZWVuID0gY2MudHdlZW4ocHJvZ3Jlc3MpXHJcbiAgICAgICAgICAgIC50byh0aGlzLndhdGVyVGltZSx7ZmlsbFJhbmdlOjF9KVxyXG4gICAgICAgICAgICAuc3RhcnQoKTtcclxuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZSh0aGlzLnVwZGF0ZVdhdGVyVGltZSwxKTtcclxuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZSh0aGlzLnVwZGF0ZUNvdW50RG93blRpbWUsMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIHRoaXMuR3VpZGUuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5ndWlkZU5leHQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG4gICAgLy/liJ3lp4vljJblnLDlm75cclxuICAgIGluaXRNYXAoKXtcclxuICAgICAgICBjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8ucm91bmQgKz0gMTtcclxuICAgICAgICBjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8uZmVuID0gMDtcclxuICAgICAgICB0aGlzLmJsb2NrX0FycmF5ID0gW107XHJcbiAgICAgICAgdGhpcy5wYXRoX0FycmF5ID0gW107XHJcbiAgICAgICAgdGhpcy53YXRlcl9BcnJheSA9IFtdO1xyXG4gICAgICAgIHRoaXMubWFwX0FycmF5ID0gW107XHJcbiAgICAgICAgdGhpcy50aXBfQXJyYXkgPSBbXTtcclxuICAgICAgICB0aGlzLnBsYW5fb3ZlciA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubWFwX0hpZ2h0ID0gMDtcclxuICAgICAgICB0aGlzLm1hcF9XaWR0aCA9IDA7XHJcbiAgICAgICAgdGhpcy5zdGVwID0gMDtcclxuICAgICAgICB0aGlzLmJnQ2xpY2sgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmJ0bkNsaWNrID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jdXN0b20gPSAwOyAvLzlcclxuICAgICAgICBpZighY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLmd1aWRlICYmY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLmxldmVsID09IDAgKXtcclxuICAgICAgICAgICAgY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLmxldmVsID0gMTtcclxuICAgICAgICAgICAgdGhpcy5jdXN0b20gPSB0aGlzLmdldE1hcCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCFjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8uZ3VpZGUpe1xyXG4gICAgICAgICAgICB0aGlzLmN1c3RvbSA9IHRoaXMuZ2V0TWFwKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoaXMuY3VzdG9tID0gNztcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmN1c3RvbSk7XHJcbiAgIFxyXG4gICAgICAgIGxldCBhcnIgPSBjYy5meC5HYW1lQ29uZmlnLkxFVkVMX0lORk9bY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLmxldmVsXVt0aGlzLmN1c3RvbV0ubWFwO1xyXG4gICAgICAgIGlmKGNjLmZ4LkdhbWVDb25maWcuR01fSU5GTy5sZXZlbCA9PSAwKXtcclxuICAgICAgICAgICAgdGhpcy5NYXAuc2NhbGUgPSAxLjI7XHJcbiAgICAgICAgfSBcclxuICAgICAgICB0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJUb3BcIikuZ2V0Q2hpbGRCeU5hbWUoXCJpZFwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpLnN0cmluZyA9IFxyXG4gICAgICAgIGNjLmZ4LkdhbWVDb25maWcuR01fSU5GTy5zY29yZTtcclxuXHJcbiAgICAgICAgLy/lsIblnLDlm754LHnovbTliIfmjaJcclxuICAgICAgICB0aGlzLm1hcF9BcnJheSA9IGFyclswXS5tYXAoKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGFyci5tYXAoKHZhbCkgPT4gdmFsW2ldKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5tYXBfV2lkdGggPSB0aGlzLm1hcF9BcnJheS5sZW5ndGg7XHJcbiAgICAgICAgdGhpcy5tYXBfSGlnaHQgPSB0aGlzLm1hcF9BcnJheVswXS5sZW5ndGg7XHJcblxyXG4gICAgICAgIHRoaXMuTWFwLnggPSg2IC0gdGhpcy5tYXBfQXJyYXkubGVuZ3RoKSo0ODtcclxuICAgICAgICB0aGlzLk1hcC55ID0gKHRoaXMubWFwX0FycmF5WzBdLmxlbmd0aCAtIDYuNSkqNDg7XHJcblxyXG4gICAgICAgIGZvcihsZXQgaT0wO2k8dGhpcy5tYXBfQXJyYXkubGVuZ3RoO2krKyl7XHJcbiAgICAgICAgICAgIGZvcihsZXQgaj0wOyBqPHRoaXMubWFwX0FycmF5IFtpXS5sZW5ndGg7aisrKXtcclxuICAgICAgICAgICAgICAgIGxldCBibG9jayA9IGNjLmluc3RhbnRpYXRlKHRoaXMuQmxvY2spO1xyXG4gICAgICAgICAgICAgICAgYmxvY2sucGFyZW50PSB0aGlzLk1hcDtcclxuICAgICAgICAgICAgICAgIGJsb2NrLmdldENvbXBvbmVudChcIkJsb2NrXCIpLmluaXREYXRhKHRoaXMubWFwX0FycmF5IFtpXVtqXSxjYy52MihpLGopLGNjLnYyKHRoaXMubWFwX1dpZHRoLHRoaXMubWFwX0hpZ2h0KSk7XHJcbiAgICAgICAgICAgICAgICBpZih0aGlzLm1hcF9BcnJheSBbaV1bal0gPT0gY2MuRW51bShCbG9ja1R5cGUpLlN0YXJ0KXtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhdGhfQXJyYXkucHVzaChjYy52MyhpLGosY2MuRW51bShCbG9ja1R5cGUpLk5vbWFsKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy53YXRlcl9BcnJheS5wdXNoKGNjLnYzKGksaixjYy5FbnVtKEJsb2NrVHlwZSkuTm9tYWwpKTtcclxuICAgICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgICAgICBibG9jay5zZXRQb3NpdGlvbihjYy52MigtYmxvY2sud2lkdGgqMi41ICsgaSpibG9jay53aWR0aCxibG9jay5oZWlnaHQqNCAtIGoqYmxvY2suaGVpZ2h0KSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrX0FycmF5LnB1c2goYmxvY2spO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuICAgICAvKipcclxuICAgICAqIOW8gOWni+WQju+8jOaMieeOqeWutuaTjeS9nO+8jOWwhui3r+W+hOS4reWcsOWbvuWdl+aUvuWFpeaVsOe7hOS4rVxyXG4gICAgICogQHBhcmFtIGRhdGEg5qC55o2u5b2T5YmN5pON5L2c77yM5re75Yqg5bu6562R5Zyw5Zu+5pWw57uEXHJcbiAgICAgKi9cclxuICAgIHNldE1hcChkYXRhKXtcclxuICAgICAgICBmb3IobGV0IGk9MDsgaTxkYXRhLmxlbmd0aDsgaSsrKXtcclxuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5wYXRoX0FycmF5W3RoaXMucGF0aF9BcnJheS5sZW5ndGgtMV07XHJcbiAgICAgICAgICAgIHN3aXRjaChkYXRhW2ldKXtcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJ1cFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGF0aF9BcnJheS5wdXNoKGNjLnYzKHN0YXJ0Lngsc3RhcnQueS0xLGNjLkVudW0oQmxvY2tUeXBlKS5Ob21hbCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcImRvd25cIjpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhdGhfQXJyYXkucHVzaChjYy52MyhzdGFydC54LHN0YXJ0LnkrMSxjYy5FbnVtKEJsb2NrVHlwZSkuTm9tYWwpKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJsZWZ0XCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXRoX0FycmF5LnB1c2goY2MudjMoc3RhcnQueC0xLHN0YXJ0LnksY2MuRW51bShCbG9ja1R5cGUpLk5vbWFsKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwicmlnaHRcIjpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhdGhfQXJyYXkucHVzaChjYy52MyhzdGFydC54KzEsc3RhcnQueSxjYy5FbnVtKEJsb2NrVHlwZSkuTm9tYWwpKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJyZWluZm9yY2VcIjpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhdGhfQXJyYXkucHVzaChjYy52MyhzdGFydC54LHN0YXJ0LnksY2MuRW51bShCbG9ja1R5cGUpLlJlaW5mb3JjZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcInNvaWxcIjpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhdGhfQXJyYXkucHVzaChjYy52MyhzdGFydC54LHN0YXJ0LnksY2MuRW51bShCbG9ja1R5cGUpLlhpX1NvaWwpKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZih0aGlzLnBhdGhfQXJyYXlbdGhpcy5wYXRoX0FycmF5Lmxlbmd0aC0xXS56ICE9IDApe1xyXG4gICAgICAgICAgICB0aGlzLnBhdGhfQXJyYXkucG9wKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucnVuUm9hZCgwKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICog5byA5aeL5omn6KGM5rSq5bOw5p2l5LqG55qE5Yqo55S7XHJcbiAgICAgKiBAcGFyYW0gb3JkZXIg5bu6562R5Zyw5Zu+5pWw57uE6YeM55qE5omn6KGM55qE5bqP5YiX5Y+377yM5L6d5qyh5b6A5LiL5YqgXHJcbiAgICAgKi9cclxuICAgIHJ1blJvYWQob3JkZXIpe1xyXG4gICAgICAgIG9yZGVyID0gcGFyc2VJbnQob3JkZXIpO1xyXG5cclxuICAgICAgICBpZihvcmRlciA+IDApe1xyXG4gICAgICAgICAgICBpZih0aGlzLnBhdGhfQXJyYXlbb3JkZXItMV0ueiA9PSAwKXtcclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCIx5q2j5bi45pS+5YWlXCIsdGhpcy5wYXRoX0FycmF5W29yZGVyLTFdLngsdGhpcy5wYXRoX0FycmF5W29yZGVyLTFdLnksdGhpcy5wYXRoX0FycmF5W29yZGVyLTFdLnopXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVdhdGVyKGNjLnYzKHRoaXMucGF0aF9BcnJheVtvcmRlci0xXS54LHRoaXMucGF0aF9BcnJheVtvcmRlci0xXS55LDApKTtcclxuICAgICAgICAgICAgICAgIGlmKG9yZGVyID09IHRoaXMucGF0aF9BcnJheS5sZW5ndGgtMSl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VXYXRlcihjYy52Myh0aGlzLnBhdGhfQXJyYXlbb3JkZXJdLngsdGhpcy5wYXRoX0FycmF5W29yZGVyXS55LDApKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIuacgOWQjuaUvuWFpVwiLHRoaXMucGF0aF9BcnJheVtvcmRlcl0ueCx0aGlzLnBhdGhfQXJyYXlbb3JkZXJdLnkpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCIy5o+S5YWlXCIsdGhpcy5wYXRoX0FycmF5W29yZGVyXS54LHRoaXMucGF0aF9BcnJheVtvcmRlcl0ueSx0aGlzLnBhdGhfQXJyYXlbb3JkZXJdLnopXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVdhdGVyKGNjLnYzKHRoaXMucGF0aF9BcnJheVtvcmRlcl0ueCx0aGlzLnBhdGhfQXJyYXlbb3JkZXJdLnksMCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBcclxuICAgXHJcbiAgICAgICAgaWYob3JkZXIgPD0gdGhpcy5wYXRoX0FycmF5Lmxlbmd0aC0xKXtcclxuICAgICAgICAgICAgbGV0IGkgPSB0aGlzLnBhdGhfQXJyYXlbb3JkZXJdLngqdGhpcy5tYXBfQXJyYXlbMF0ubGVuZ3RoK3RoaXMucGF0aF9BcnJheVtvcmRlcl0ueTtcclxuICAgICAgICAgICAgbGV0IGRpcmVjdGlvbiA9IFwiXCI7XHJcbiAgICAgICAgICAgIGxldCBjaXJjdWxhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAvL+acgOWQjuS4gOatpee7k+adn1xyXG4gICAgICAgICAgICBpZihvcmRlciA9PSB0aGlzLnBhdGhfQXJyYXkubGVuZ3RoLTEpe1xyXG4gICAgICAgICAgICAgICAgY2lyY3VsYXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBcIkVuZFwiO1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCLov5vlhaXnu5PmnZ9cIik7XHJcbiAgICAgICAgICAgICAgICBpZih0aGlzLnBhdGhfQXJyYXkubGVuZ3RoID4gMSl7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCLlh4blpIflh7rmsLRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF0aGlzLnBsYW5fb3Zlcil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYW5fb3ZlciA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVhZCA9IHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZShcIlRvcFwiKS5nZXRDaGlsZEJ5TmFtZShcImhlYWRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvZ3Jlc3MgPSB0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJUb3BcIikuZ2V0Q2hpbGRCeU5hbWUoXCJwcm9ncmVzc1wiKS5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWQuc3RvcEFsbEFjdGlvbnMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWQuc2V0UG9zaXRpb24oMzEwLGhlYWQueSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLndhdGVyVHdlZW4pIHRoaXMud2F0ZXJUd2Vlbi5zdG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcy5maWxsUmFuZ2UgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLm1pbl9UaW1lID0gdGhpcy53YXRlclRpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bldhdGVyKDApOyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIDUwMCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IFwiZXJyXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCLov5vlhaXnu5PmnZ9lcnJcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgICAgICBpZih0aGlzLnBhdGhfQXJyYXlbb3JkZXJdLnogPT0gNiAmJiBvcmRlciArIDEgPCB0aGlzLnBhdGhfQXJyYXkubGVuZ3RoICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IFwiUmVpbmZvcmNlXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgaSA9IHRoaXMucGF0aF9BcnJheVtvcmRlcisxXS54KnRoaXMubWFwX0FycmF5WzBdLmxlbmd0aCt0aGlzLnBhdGhfQXJyYXlbb3JkZXIrMV0ueTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYob3JkZXIrMSA8IHRoaXMucGF0aF9BcnJheS5sZW5ndGgpe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMucGF0aF9BcnJheVtvcmRlcisxXS56ID09IDUpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBcIlhpX1NvaWxcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZih0aGlzLnBhdGhfQXJyYXlbb3JkZXIrMV0ueiA9PSA2ICYmIG9yZGVyID09IDAgJiYgb3JkZXIgKyAxIDwgdGhpcy5wYXRoX0FycmF5Lmxlbmd0aCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpcmVjdGlvbiA9IHRoaXMuZ2V0RGlyZWN0aW9uKG9yZGVyKzEsdGhpcy5wYXRoX0FycmF5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gdGhpcy5nZXREaXJlY3Rpb24ob3JkZXIsdGhpcy5wYXRoX0FycmF5KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gdGhpcy5nZXREaXJlY3Rpb24ob3JkZXIsdGhpcy5wYXRoX0FycmF5KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IHRoaXMuZ2V0RGlyZWN0aW9uKG9yZGVyLHRoaXMucGF0aF9BcnJheSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2cob3JkZXIsdGhpcy5wYXRoX0FycmF5W29yZGVyXS54LHRoaXMucGF0aF9BcnJheVtvcmRlcl0ueSxpKTtcclxuIFxyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIuatpemqpDpcIixvcmRlcixcIuaWueWQkVwiLGRpcmVjdGlvbik7XHJcbiAgICAgICAgICAgIGxldCBqZyA9IHRoaXMuZ2V0Qm91bmRhcnkob3JkZXIsdGhpcy5wYXRoX0FycmF5W29yZGVyXS54LHRoaXMucGF0aF9BcnJheVtvcmRlcl0ueSxkaXJlY3Rpb24sdGhpcy5wYXRoX0FycmF5KTtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmKGRpcmVjdGlvbiA9PSBcIlwiIHx8IGpnID09IGZhbHNlKSByZXR1cm47XHJcbiAgICAgICAgICAgIGlmKGRpcmVjdGlvbiA9PSBcImVyclwiIHx8IGRpcmVjdGlvbiA9PSBcIlwiIHx8IGpnID09IGZhbHNlKXtcclxuICAgICAgICAgICAgICAgIGNjLmZ4Lk5vdGlmaWNhdGlvbnMuZW1pdChjYy5meC5NZXNzYWdlLnNob3dSZXN1bHQsXCJsb3NlXCIpO1xyXG4gICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCBpPDAgfHwgaSA+ICh0aGlzLmJsb2NrX0FycmF5Lmxlbmd0aC0xKSl7XHJcbiAgICAgICAgICAgICAgICBjYy5meC5Ob3RpZmljYXRpb25zLmVtaXQoY2MuZnguTWVzc2FnZS5zaG93UmVzdWx0LFwibG9zZVwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHRhcmdldCA9IHRoaXMuYmxvY2tfQXJyYXlbaV0uZ2V0Q29tcG9uZW50KFwiQmxvY2tcIik7XHJcbiAgICAgICAgICAgIHRhcmdldC5zZXRQYXRoKGRpcmVjdGlvbik7XHJcblxyXG4gICAgICAgICAgICBpZihvcmRlciA+IDAgJiYgb3JkZXIgPCB0aGlzLnBhdGhfQXJyYXkubGVuZ3RoLTEpe1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5wYXRoX0FycmF5W29yZGVyKzFdLnogPT0gNSl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRfU29pbChvcmRlcisxLHRoaXMucGF0aF9BcnJheSxcInJvYWRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgY2lyY3VsYXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmKG9yZGVyID09IDEgJiYgdGhpcy5wYXRoX0FycmF5W29yZGVyXS56ID09IDUpe1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0X1NvaWwob3JkZXIsdGhpcy5wYXRoX0FycmF5LFwicm9hZFwiKTtcclxuICAgICAgICAgICAgICAgICAgICBjaXJjdWxhdGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IHBvcyA9IGNjLnYyKCk7XHJcbiAgICAgICAgICAgIGlmKGRpcmVjdGlvbiA9PSBcIkVuZFwiKXtcclxuICAgICAgICAgICAgICAgIGlmKG9yZGVyID4gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYodGhpcy5wYXRoX0FycmF5W29yZGVyLTFdLnogPT0gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IGNjLnYyKHRoaXMucGF0aF9BcnJheVtvcmRlci0xXS54LCB0aGlzLnBhdGhfQXJyYXlbb3JkZXItMV0ueSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBkYXRhID0ge1xyXG4gICAgICAgICAgICAgICAgb3JkZXI6b3JkZXIsXHJcbiAgICAgICAgICAgICAgICB0aW1lOmNjLmZ4LkdhbWVDb25maWcuVElNRV9JTkZPLndhdGVyU3BlZWRbY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLmxldmVsXSxcclxuICAgICAgICAgICAgICAgIHR5cGU6dGhpcy5wYXRoX0FycmF5W29yZGVyXS56LFxyXG4gICAgICAgICAgICAgICAgY2lyY3VsYXRlOmNpcmN1bGF0ZSxcclxuICAgICAgICAgICAgICAgIGxhc3Q6cG9zXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIHRhcmdldC5ydW5Sb2FkKGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICog5Yik5pat6L6555WM44CC5oiW6ICF5pKe5bGx77yM5oiW6ICF5rm/5Zyw5rKh5pyJ5Yqg5Zu6XHJcbiAgICAgKiBAcGFyYW0gb3JkZXIg5bu6562R5Zyw5Zu+5pWw57uE6YeM55qE5omn6KGM55qE5bqP5YiX5Y+3XHJcbiAgICAgKiBAcGFyYW0geCDlvZPliY3mk43kvZzlnLDlnZfmqKrlnZDmoIdcclxuICAgICAqIEBwYXJhbSB5IOW9k+WJjeaTjeS9nOWcsOWdl+e6teWdkOagh1xyXG4gICAgICogQHBhcmFtIGRpcmVjdGlvbiDlvZPliY3mk43kvZzmlrnlkJHvvIzoi6XkuI3mmK/mlrnlkJHliJnkuLrmga/lo6TmiJbogIXliqDlm7pcclxuICAgICAqIEBwYXJhbSByb2FkIOW7uuetkeWcsOWbvuaVsOe7hO+8jOWPr+eQhuino+S4uui3r+W+hOaVsOe7hO+8jHBhdGhfQXJyYXlcclxuICAgICAqL1xyXG4gICAgZ2V0Qm91bmRhcnkob3JkZXIseCx5LGRpcmVjdGlvbixyb2FkKXtcclxuICAgICAgICBsZXQgamcgPSB0cnVlO1xyXG4gICAgICAgIGlmKHggPCAwIHx8IHggPj0gdGhpcy5tYXBfV2lkdGggfHwgeSA8IDAgfHwgeSA+PSB0aGlzLm1hcF9IaWdodCl7XHJcbiAgICAgICAgICAgIGpnID0gZmFsc2U7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwi6LaF6L+H6L6555WM77yM5ri45oiP57uT5p2fXCIpO1xyXG4gICAgICAgICAgICAvLyBhbGVydChcIui2hei/h+i+ueeVjO+8jOayu+awtOWksei0pVwiKTtcclxuICAgICAgICAgICAgY2MuZnguTm90aWZpY2F0aW9ucy5lbWl0KGNjLmZ4Lk1lc3NhZ2Uuc2hvd1Jlc3VsdCxcImxvc2VcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgaSA9IHJvYWRbb3JkZXJdLngqdGhpcy5tYXBfQXJyYXlbMF0ubGVuZ3RoK3JvYWRbb3JkZXJdLnk7XHJcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSB0aGlzLmJsb2NrX0FycmF5W2ldLmdldENvbXBvbmVudChcIkJsb2NrXCIpO1xyXG4gICAgICAgICAgICBpZih0YXJnZXQuYmxvY2tfVHlwZSA9PSAzKXtcclxuICAgICAgICAgICAgICAgIGpnID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIuS/ruetkeWxseWzsO+8jOa4uOaIj+e7k+adn1wiKTtcclxuICAgICAgICAgICAgICAgIC8vIGFsZXJ0KFwi5L+u562R5bGx5bOw77yM5rK75rC05aSx6LSlXCIpO1xyXG4gICAgICAgICAgICAgICAgY2MuZnguTm90aWZpY2F0aW9ucy5lbWl0KGNjLmZ4Lk1lc3NhZ2Uuc2hvd1Jlc3VsdCxcImxvc2VcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZih0YXJnZXQuYmxvY2tfVHlwZSA9PSAyICYmIGRpcmVjdGlvbiAhPSBcIlJlaW5mb3JjZVwiKXtcclxuICAgICAgICAgICAgICAgIGpnID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIuS/ruetkeacquWKoOWbuua5v+WcsCzmuLjmiI/nu5PmnZ9cIik7XHJcbiAgICAgICAgICAgICAgICAvLyBhbGVydChcIuS/ruetkeacquWKoOWbuua5v+WcsCzmuLjmiI/nu5PmnZ9cIik7XHJcbiAgICAgICAgICAgICAgICBjYy5meC5Ob3RpZmljYXRpb25zLmVtaXQoY2MuZnguTWVzc2FnZS5zaG93UmVzdWx0LFwibG9zZVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gamc7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIOW8gOWni+aJp+ihjOa0quWzsOadpeS6hueahOWKqOeUu1xyXG4gICAgICogQHBhcmFtIG9yZGVyIOW7uuetkeWcsOWbvuaVsOe7hOmHjOeahOaJp+ihjOeahOW6j+WIl+WPt++8jOS+neasoeW+gOS4i+WKoFxyXG4gICAgICovXHJcbiAgICBydW5XYXRlcihvcmRlcil7XHJcbiAgICAgICAgb3JkZXIgPSBwYXJzZUludChvcmRlcik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYob3JkZXIgPD0gdGhpcy53YXRlcl9BcnJheS5sZW5ndGgtMSl7XHJcbiAgICAgICAgICAgIGxldCBpID0gdGhpcy53YXRlcl9BcnJheVtvcmRlcl0ueCp0aGlzLm1hcF9BcnJheVswXS5sZW5ndGgrdGhpcy53YXRlcl9BcnJheVtvcmRlcl0ueTtcclxuICAgICAgICAgICAgbGV0IGRpcmVjdGlvbiA9IFwiXCI7XHJcbiAgICAgICAgICAgIGxldCBjaXJjdWxhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAvL+acgOWQjuS4gOatpee7k+adn1xyXG4gICAgICAgICAgICBpZihvcmRlciA9PSB0aGlzLndhdGVyX0FycmF5Lmxlbmd0aC0xKXtcclxuICAgICAgICAgICAgICAgIGNpcmN1bGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gXCJFbmRcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy53YXRlcl9BcnJheVtvcmRlcl0ueiA9PSA2ICYmIG9yZGVyICsgMSA8IHRoaXMud2F0ZXJfQXJyYXkubGVuZ3RoICYmIG9yZGVyIT0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gXCJSZWluZm9yY2VcIjtcclxuICAgICAgICAgICAgICAgICAgICBpID0gdGhpcy53YXRlcl9BcnJheVtvcmRlcisxXS54KnRoaXMubWFwX0FycmF5WzBdLmxlbmd0aCt0aGlzLndhdGVyX0FycmF5W29yZGVyKzFdLnk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmKG9yZGVyKzEgPCB0aGlzLndhdGVyX0FycmF5Lmxlbmd0aCl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy53YXRlcl9BcnJheVtvcmRlcisxXS56ID09IDUpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBcIlhpX1NvaWxcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZih0aGlzLndhdGVyX0FycmF5W29yZGVyKzFdLnogPT0gNiAmJiBvcmRlciA9PSAwKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gXCJSZWluZm9yY2VcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gdGhpcy5nZXREaXJlY3Rpb24ob3JkZXIsdGhpcy53YXRlcl9BcnJheSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSB0aGlzLmdldERpcmVjdGlvbihvcmRlcix0aGlzLndhdGVyX0FycmF5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgamcgPSB0aGlzLmdldEJvdW5kYXJ5KG9yZGVyLHRoaXMud2F0ZXJfQXJyYXlbb3JkZXJdLngsdGhpcy53YXRlcl9BcnJheVtvcmRlcl0ueSxkaXJlY3Rpb24sdGhpcy53YXRlcl9BcnJheSk7XHJcbiAgICAgICAgICAgIGlmKGRpcmVjdGlvbiA9PSBcIlwiIHx8IGpnID09IGZhbHNlIHx8IGRpcmVjdGlvbiA9PSBcImVyclwiKXtcclxuICAgICAgICAgICAgICAgIGNjLmZ4Lk5vdGlmaWNhdGlvbnMuZW1pdChjYy5meC5NZXNzYWdlLnNob3dSZXN1bHQsXCJsb3NlXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSB0aGlzLmJsb2NrX0FycmF5W2ldLmdldENvbXBvbmVudChcIkJsb2NrXCIpO1xyXG4gICAgICAgICAgICB0YXJnZXQuc2V0UGF0aChkaXJlY3Rpb24pO1xyXG5cclxuICAgICAgICAgICAgaWYob3JkZXIgPiAwICYmIG9yZGVyIDwgdGhpcy53YXRlcl9BcnJheS5sZW5ndGgtMSl7XHJcbiAgICAgICAgICAgICAgICBpZih0aGlzLndhdGVyX0FycmF5W29yZGVyKzFdLnogPT0gNSl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRfU29pbChvcmRlcisxLHRoaXMud2F0ZXJfQXJyYXksXCJ3YXRlclwiKTtcclxuICAgICAgICAgICAgICAgICAgICBjaXJjdWxhdGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmKG9yZGVyID09IDEgJiYgdGhpcy53YXRlcl9BcnJheVtvcmRlcl0ueiA9PSA1KXtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldF9Tb2lsKG9yZGVyLHRoaXMud2F0ZXJfQXJyYXksXCJ3YXRlclwiKTtcclxuICAgICAgICAgICAgICAgICAgICBjaXJjdWxhdGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9IFxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgcG9zID0gY2MudjIoKTtcclxuICAgICAgICAgICAgaWYoZGlyZWN0aW9uID09IFwiRW5kXCIpe1xyXG4gICAgICAgICAgICAgICAgaWYob3JkZXIgPiAwKXtcclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLndhdGVyX0FycmF5W29yZGVyLTFdLnogPT0gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IGNjLnYyKHRoaXMud2F0ZXJfQXJyYXlbb3JkZXItMV0ueCwgdGhpcy53YXRlcl9BcnJheVtvcmRlci0xXS55KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGRhdGEgPSB7XHJcbiAgICAgICAgICAgICAgICBvcmRlcjpvcmRlcixcclxuICAgICAgICAgICAgICAgIHRpbWU6Y2MuZnguR2FtZUNvbmZpZy5USU1FX0lORk8ud2F0ZXJTcGVlZFtjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8ubGV2ZWxdLFxyXG4gICAgICAgICAgICAgICAgdHlwZTp0aGlzLndhdGVyX0FycmF5W29yZGVyXS56LFxyXG4gICAgICAgICAgICAgICAgY2lyY3VsYXRlOmNpcmN1bGF0ZSxcclxuICAgICAgICAgICAgICAgIGxhc3Q6cG9zXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRhcmdldC5ydW5XYXRlcihkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPluaBr+WjpOeahOagvOWtkOeahOaWueWQkVxyXG4gICAgICogQHBhcmFtIG9yZGVyIOW7uuetkeWcsOWbvuaVsOe7hOmHjOeahOaJp+ihjOeahOW6j+WIl+WPt++8jOS+neasoeW+gOS4i+WKoFxyXG4gICAgICogQHBhcmFtIHJvYWQg5bu6562R5Zyw5Zu+5pWw57uE5oiW6ICF5rSq5bOw6Lev5b6E5pWw57uE77yM5Y+v55CG6Kej5Li66Lev5b6E5pWw57uE77yMcGF0aF9BcnJheSB3YXRlcl9BcnJheVxyXG4gICAgICovXHJcbiAgICBnZXRYaV9Tb2lsKG9yZGVyLHJvYWQpe1xyXG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSBudWxsO1xyXG4gICAgICAgIC8v5aaC5p6c5oGv5aOk5ZCO6Z2i6L+Y5pyJ5LiL5LiA5q2l55qE6K+dXHJcbiAgICAgICAgaWYob3JkZXIgKyAxIDwgcm9hZC5sZW5ndGgpe1xyXG4gICAgICAgICAgICBkaXJlY3Rpb24gPSB0aGlzLmdldERpcmVjdGlvbihvcmRlcixyb2FkKTtcclxuICAgICAgICAgICAgaWYoZGlyZWN0aW9uID09IFwidXBcIiB8fCBkaXJlY3Rpb24gPT0gXCJyaWdodF91cFwiIHx8IGRpcmVjdGlvbiA9PSBcImxlZnRfdXBcIil7XHJcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBcInVwXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZihkaXJlY3Rpb24gPT0gXCJkb3duXCIgfHwgZGlyZWN0aW9uID09IFwibGVmdF9kb3duXCIgfHwgZGlyZWN0aW9uID09IFwicmlnaHRfZG93blwiKXtcclxuICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IFwiZG93blwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYoZGlyZWN0aW9uID09IFwibGVmdFwiIHx8IGRpcmVjdGlvbiA9PSBcInVwX2xlZnRcIiB8fCBkaXJlY3Rpb24gPT0gXCJkb3duX2xlZnRcIil7XHJcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBcImxlZnRcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmKGRpcmVjdGlvbiA9PSBcInJpZ2h0XCIgfHwgZGlyZWN0aW9uID09IFwidXBfcmlnaHRcIiB8fCBkaXJlY3Rpb24gPT0gXCJkb3duX3JpZ2h0XCIpe1xyXG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gXCJyaWdodFwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSAgXHJcbiAgICAgICAgcmV0dXJuIGRpcmVjdGlvbjtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICog6K6+572u5oGv5aOk5omn6KGM5pa55rOVXHJcbiAgICAgKiBAcGFyYW0gb3JkZXIg5bu6562R5Zyw5Zu+5pWw57uE6YeM55qE5omn6KGM55qE5bqP5YiX5Y+377yM5L6d5qyh5b6A5LiL5YqgXHJcbiAgICAgKiBAcGFyYW0gcm9hZCDlu7rnrZHlnLDlm77mlbDnu4TmiJbogIXmtKrls7Dot6/lvoTmlbDnu4TvvIzlj6/nkIbop6PkuLrot6/lvoTmlbDnu4TvvIxwYXRoX0FycmF5IHdhdGVyX0FycmF5XHJcbiAgICAgKiBAcGFyYW0gbmFtZSByb2Fk5oiW6ICFd2F0ZXIs5bu6562R6Lev5b6E5oiW6ICF5rSq5bOw6Lev5b6EXHJcbiAgICAgKi9cclxuICAgIHNldF9Tb2lsKG9yZGVyLHJvYWQsbmFtZSl7XHJcbiAgICAgICAgdmFyIGRpcmVjdGlvbiA9IHRoaXMuZ2V0WGlfU29pbChvcmRlcixyb2FkKTtcclxuXHJcbiAgICAgICAgdmFyIGxlbmd0aCA9IDA7XHJcbiAgICAgICAgaWYoZGlyZWN0aW9uID09IFwicmlnaHRcIil7XHJcbiAgICAgICAgICAgIGxlbmd0aCA9IHRoaXMubWFwX1dpZHRoIC0gMTtcclxuICAgICAgICAgICAgLy8gbGV0IHRlbXAgPSB0aGlzLm1hcF9XaWR0aCAtIDE7XHJcbiAgICAgICAgICAgIGZvcihsZXQgaT1yb2FkW29yZGVyXS54O2k8PWxlbmd0aDtpKyspe1xyXG4gICAgICAgICAgICAgICAgbGV0IG4gPSBpKnRoaXMubWFwX0FycmF5WzBdLmxlbmd0aCtyb2FkW29yZGVyXS55O1xyXG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IHRoaXMuYmxvY2tfQXJyYXlbbl0uZ2V0Q29tcG9uZW50KFwiQmxvY2tcIik7XHJcbiAgICAgICAgICAgICAgICBpZih0YXJnZXQuYmxvY2tfVHlwZSA9PSAzIHx8IHRhcmdldC5ibG9ja19UeXBlID09IDQpe1xyXG4gICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IGktMTtcclxuICAgICAgICAgICAgICAgICAgICBpZih0YXJnZXQuYmxvY2tfVHlwZSA9PSA0KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoICs9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGkgPSAxMDAwMDtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gXHJcbiAgICAgICAgZWxzZSBpZihkaXJlY3Rpb24gPT0gXCJsZWZ0XCIpe1xyXG4gICAgICAgICAgICBsZW5ndGggPSAwO1xyXG4gICAgICAgICAgICBmb3IobGV0IGk9cm9hZFtvcmRlcl0ueDtpPj1sZW5ndGg7aS0tKXtcclxuICAgICAgICAgICAgICAgIGxldCBuID0gaSp0aGlzLm1hcF9BcnJheVswXS5sZW5ndGgrcm9hZFtvcmRlcl0ueTtcclxuICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSB0aGlzLmJsb2NrX0FycmF5W25dLmdldENvbXBvbmVudChcIkJsb2NrXCIpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZih0YXJnZXQuYmxvY2tfVHlwZSA9PSAzIHx8IHRhcmdldC5ibG9ja19UeXBlID09IDQpe1xyXG4gICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9ICBpICsgMTtcclxuICAgICAgICAgICAgICAgICAgICBpZih0YXJnZXQuYmxvY2tfVHlwZSA9PSA0KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoIC09IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGkgPSAtMTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gXHJcbiAgICAgICAgZWxzZSBpZihkaXJlY3Rpb24gPT0gXCJ1cFwiKXtcclxuICAgICAgICAgICAgbGVuZ3RoID0gMDtcclxuXHJcbiAgICAgICAgICAgIGZvcihsZXQgaT1yb2FkW29yZGVyXS55O2k+PWxlbmd0aDtpLS0pe1xyXG4gICAgICAgICAgICAgICAgbGV0IG4gPSByb2FkW29yZGVyXS54KnRoaXMubWFwX0FycmF5WzBdLmxlbmd0aCArIGk7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gdGhpcy5ibG9ja19BcnJheVtuXS5nZXRDb21wb25lbnQoXCJCbG9ja1wiKTtcclxuICAgICAgICAgICAgICAgIGlmKHRhcmdldC5ibG9ja19UeXBlID09IDMgfHwgdGFyZ2V0LmJsb2NrX1R5cGUgPT0gNCl7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gaSArIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYodGFyZ2V0LmJsb2NrX1R5cGUgPT0gNCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCAtPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpID0gLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IFxyXG4gICAgICAgIGVsc2UgaWYoZGlyZWN0aW9uID09IFwiZG93blwiKXtcclxuICAgICAgICAgICAgbGVuZ3RoID0gdGhpcy5tYXBfSGlnaHQgLSAxO1xyXG4gICAgICAgICAgICBmb3IobGV0IGk9cm9hZFtvcmRlcl0ueTtpPD1sZW5ndGg7aSsrKXtcclxuICAgICAgICAgICAgICAgIGxldCBuID0gcm9hZFtvcmRlcl0ueCp0aGlzLm1hcF9BcnJheVswXS5sZW5ndGggKyBpO1xyXG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IHRoaXMuYmxvY2tfQXJyYXlbbl0uZ2V0Q29tcG9uZW50KFwiQmxvY2tcIik7XHJcbiAgICAgICAgICAgICAgICBpZih0YXJnZXQuYmxvY2tfVHlwZSA9PSAzIHx8IHRhcmdldC5ibG9ja19UeXBlID09IDQpe1xyXG4gICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IGktMTtcclxuICAgICAgICAgICAgICAgICAgICBpZih0YXJnZXQuYmxvY2tfVHlwZSA9PSA0KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoICs9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGkgPSAxMDAwMDtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gXHJcblxyXG4gICAgICAgIHRoaXMuc29pbF9GaW5kKGRpcmVjdGlvbixvcmRlcixsZW5ndGgscm9hZCxuYW1lKTtcclxuICAgIH1cclxuICAgIC8v5p+l5om+5oGv5aOk6Juu6YGX5oa+6Lev5b6EXHJcbiAgICBzb2lsX0ZpbmQoZGlyZWN0aW9uLG9yZGVyLGxlbmd0aCxyb2FkLG5hbWUpe1xyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCBzdGFydCA9IHJvYWRbb3JkZXJdLng7XHJcbiAgICAgICAgaWYoZGlyZWN0aW9uID09IFwicmlnaHRcIil7XHJcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IHN0YXJ0OyBpPD1sZW5ndGg7IGkrKyl7XHJcbiAgICAgICAgICAgICAgICBsZXQgbiA9IGkqdGhpcy5tYXBfQXJyYXlbMF0ubGVuZ3RoK3JvYWRbb3JkZXJdLnk7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gdGhpcy5ibG9ja19BcnJheVtuXS5nZXRDb21wb25lbnQoXCJCbG9ja1wiKTtcclxuICAgICAgICAgICAgICAgIGlmKGkgPT0gc3RhcnQpe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGkgPT0gc3RhcnQgJiYgaT09bGVuZ3RoKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2MuZnguTm90aWZpY2F0aW9ucy5lbWl0KGNjLmZ4Lk1lc3NhZ2Uuc2hvd1Jlc3VsdCxcImxvc2VcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRfWGlfU29pbFR5cGUodGhpcy5nZXREaXJlY3Rpb24ob3JkZXIscm9hZCksb3JkZXIsbmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgdGFyZ2V0LnNldF9YaV9Tb2lsVHlwZSh0aGlzLmdldERpcmVjdGlvbihvcmRlcixyb2FkKSxudWxsLG5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGNjLnYzKHRoaXMucGF0aF9BcnJheVtvcmRlcl0ueCx0aGlzLnBhdGhfQXJyYXlbb3JkZXJdLnksMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy53YXRlcl9BcnJheVt0aGlzLndhdGVyX0FycmF5Lmxlbmd0aC0xXSAhPSB2YWx1ZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwi54m55Yir5o+S5YWlOlwiLHRoaXMucGF0aF9BcnJheVtvcmRlcl0ueCx0aGlzLnBhdGhfQXJyYXlbb3JkZXJdLnkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVdhdGVyKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9ICBcclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBqZyA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoaSA9PSBsZW5ndGgpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVtYmVyID0gaSAtIHN0YXJ0IC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVBhdGgob3JkZXIsbnVtYmVyLGZhbHNlLHJvYWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqZyA9IG9yZGVyO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldF9YaV9Tb2lsVHlwZShkaXJlY3Rpb24samcsbmFtZSk7XHJcbiAgICAgICAgICAgICAgICB9ICAgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IFxyXG4gICAgICAgIGVsc2UgaWYoZGlyZWN0aW9uID09IFwibGVmdFwiKXtcclxuICAgICAgICAgICAgZm9yKGxldCBpID0gc3RhcnQ7IGk+PWxlbmd0aDsgaS0tKXtcclxuICAgICAgICAgICAgICAgIGxldCBuID0gaSp0aGlzLm1hcF9BcnJheVswXS5sZW5ndGgrcm9hZFtvcmRlcl0ueTtcclxuICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSB0aGlzLmJsb2NrX0FycmF5W25dLmdldENvbXBvbmVudChcIkJsb2NrXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYoaSA9PSBzdGFydCl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoaSA9PSBzdGFydCAmJiBpPT1sZW5ndGgpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYy5meC5Ob3RpZmljYXRpb25zLmVtaXQoY2MuZnguTWVzc2FnZS5zaG93UmVzdWx0LFwibG9zZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldF9YaV9Tb2lsVHlwZSh0aGlzLmdldERpcmVjdGlvbihvcmRlcixyb2FkKSxvcmRlcixuYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB0YXJnZXQuc2V0X1hpX1NvaWxUeXBlKHRoaXMuZ2V0RGlyZWN0aW9uKG9yZGVyLHJvYWQpLG51bGwsbmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gY2MudjModGhpcy5wYXRoX0FycmF5W29yZGVyXS54LHRoaXMucGF0aF9BcnJheVtvcmRlcl0ueSwwKTtcclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLndhdGVyX0FycmF5W3RoaXMud2F0ZXJfQXJyYXkubGVuZ3RoLTFdICE9IHZhbHVlKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCLnibnliKvmj5LlhaU6XCIsdGhpcy5wYXRoX0FycmF5W29yZGVyXS54LHRoaXMucGF0aF9BcnJheVtvcmRlcl0ueSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlV2F0ZXIodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gIFxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGpnID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICBpZihpID09IGxlbmd0aCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW1iZXIgPSBpIC0gc3RhcnQgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVBhdGgob3JkZXIsbnVtYmVyLGZhbHNlLHJvYWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqZyA9IG9yZGVyO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldF9YaV9Tb2lsVHlwZShkaXJlY3Rpb24samcsbmFtZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IFxyXG4gICAgICAgIGVsc2UgaWYoZGlyZWN0aW9uID09IFwidXBcIil7XHJcbiAgICAgICAgICAgIHN0YXJ0ID0gcm9hZFtvcmRlcl0ueTtcclxuICAgICAgICAgICAgZm9yKGxldCBpID0gc3RhcnQ7IGk+PWxlbmd0aDsgaS0tKXtcclxuICAgICAgICAgICAgICAgIGxldCBuID0gcm9hZFtvcmRlcl0ueCp0aGlzLm1hcF9BcnJheVswXS5sZW5ndGgraTtcclxuICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSB0aGlzLmJsb2NrX0FycmF5W25dLmdldENvbXBvbmVudChcIkJsb2NrXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYoaSA9PSBzdGFydCl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoaSA9PSBzdGFydCAmJiBpPT1sZW5ndGgpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYy5meC5Ob3RpZmljYXRpb25zLmVtaXQoY2MuZnguTWVzc2FnZS5zaG93UmVzdWx0LFwibG9zZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldF9YaV9Tb2lsVHlwZSh0aGlzLmdldERpcmVjdGlvbihvcmRlcixyb2FkKSxvcmRlcixuYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICB9IFxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRfWGlfU29pbFR5cGUodGhpcy5nZXREaXJlY3Rpb24ob3JkZXIscm9hZCksbnVsbCxuYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gY2MudjModGhpcy5wYXRoX0FycmF5W29yZGVyXS54LHRoaXMucGF0aF9BcnJheVtvcmRlcl0ueSwwKTtcclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLndhdGVyX0FycmF5W3RoaXMud2F0ZXJfQXJyYXkubGVuZ3RoLTFdICE9IHZhbHVlKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCLnibnliKvmj5LlhaU6XCIsdGhpcy5wYXRoX0FycmF5W29yZGVyXS54LHRoaXMucGF0aF9BcnJheVtvcmRlcl0ueSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlV2F0ZXIodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gIFxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGpnID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICBpZihpID09IGxlbmd0aCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW1iZXIgPSBpIC0gc3RhcnQgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVBhdGgob3JkZXIsbnVtYmVyLHRydWUscm9hZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpnID0gb3JkZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBcclxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIuaDs+S4iuaBr+WjpOaPkuWFpTpcIix0aGlzLnBhdGhfQXJyYXlbb3JkZXJdLngsaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldF9YaV9Tb2lsVHlwZShkaXJlY3Rpb24samcsbmFtZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IFxyXG4gICAgICAgIGVsc2UgaWYoZGlyZWN0aW9uID09IFwiZG93blwiKXtcclxuICAgICAgICAgICAgc3RhcnQgPSByb2FkW29yZGVyXS55O1xyXG4gICAgICAgICAgICBmb3IobGV0IGkgPSBzdGFydDsgaTw9bGVuZ3RoOyBpKyspe1xyXG4gICAgICAgICAgICAgICAgbGV0IG4gPSByb2FkW29yZGVyXS54KnRoaXMubWFwX0FycmF5WzBdLmxlbmd0aCtpO1xyXG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IHRoaXMuYmxvY2tfQXJyYXlbbl0uZ2V0Q29tcG9uZW50KFwiQmxvY2tcIik7XHJcbiAgICAgICAgICAgICAgICBpZihpID09IHN0YXJ0KXtcclxuICAgICAgICAgICAgICAgICAgICBpZihpID09IHN0YXJ0ICYmIGk9PWxlbmd0aCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNjLmZ4Lk5vdGlmaWNhdGlvbnMuZW1pdChjYy5meC5NZXNzYWdlLnNob3dSZXN1bHQsXCJsb3NlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0X1hpX1NvaWxUeXBlKHRoaXMuZ2V0RGlyZWN0aW9uKG9yZGVyLHJvYWQpLG9yZGVyLG5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHRhcmdldC5zZXRfWGlfU29pbFR5cGUodGhpcy5nZXREaXJlY3Rpb24ob3JkZXIscm9hZCksbnVsbCxuYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBjYy52Myh0aGlzLnBhdGhfQXJyYXlbb3JkZXJdLngsdGhpcy5wYXRoX0FycmF5W29yZGVyXS55LDApO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMud2F0ZXJfQXJyYXlbdGhpcy53YXRlcl9BcnJheS5sZW5ndGgtMV0gIT0gdmFsdWUpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIueJueWIq+aPkuWFpTpcIix0aGlzLnBhdGhfQXJyYXlbb3JkZXJdLngsdGhpcy5wYXRoX0FycmF5W29yZGVyXS55KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VXYXRlcih2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBcclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBqZyA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoaSA9PSBsZW5ndGgpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVtYmVyID0gaSAtIHN0YXJ0IC0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VQYXRoKG9yZGVyLG51bWJlcix0cnVlLHJvYWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqZyA9IG9yZGVyO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldF9YaV9Tb2lsVHlwZShkaXJlY3Rpb24samcsbmFtZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IFxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pS55Y+Y5rC05rWB5Zyw5Zu+XHJcbiAgICAgKiBAcGFyYW0gdmFsdWUg6ZyA6KaB5qC55o2u5L2/55So5oGv5aOk5oOF5Ya177yM5o+S5YWl5Yiw5rSq5bOw6Lev5b6E55qE54K5XHJcbiAgICAgKi9cclxuICAgIGNoYW5nZVdhdGVyKHZhbHVlKXtcclxuICAgICAgICBsZXQgamcgPSB0cnVlO1xyXG4gICAgICAgIGlmKHRoaXMud2F0ZXJfQXJyYXkubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgIGlmKHRoaXMud2F0ZXJfQXJyYXlbdGhpcy53YXRlcl9BcnJheS5sZW5ndGgtMV0ueCA9PSB2YWx1ZS54ICYmIHRoaXMud2F0ZXJfQXJyYXlbdGhpcy53YXRlcl9BcnJheS5sZW5ndGgtMV0ueSA9PSB2YWx1ZS55KXtcclxuICAgICAgICAgICAgICAgIGpnID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoamcpIHRoaXMud2F0ZXJfQXJyYXkucHVzaCh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIOaBr+WjpOi/h+WQjuaUueWPmOS/ruetkei3r+W+hFxyXG4gICAgICogQHBhcmFtIG9yZGVyIOW7uuetkeWcsOWbvuaVsOe7hOmHjOeahOaJp+ihjOeahOW6j+WIl+WPt1xyXG4gICAgICogQHBhcmFtIG51bWJlciDmga/lo6TmiafooYzplb/luqYs5pS55Y+Y5oGv5aOk55So5ZCO5YW25LuW6Lev5b6E55qEWOaIllnlgLxcclxuICAgICAqIEBwYXJhbSBkaXJlY3Rpb24g5Y+q5Li65Lik5Liq5pa55ZCR77yM5qiq5ZCRZmFsc2Us57q15ZCRdHJ1ZVxyXG4gICAgICogQHBhcmFtIHJvYWQg5bu6562R5Zyw5Zu+5pWw57uE5oiW6ICF5rSq5bOw6Lev5b6E5pWw57uE77yM5Y+v55CG6Kej5Li66Lev5b6E5pWw57uE77yMcGF0aF9BcnJheSB3YXRlcl9BcnJheVxyXG4gICAgICovXHJcbiAgICBjaGFuZ2VQYXRoKG9yZGVyLG51bWJlcixkaXJlY3Rpb24scm9hZCl7XHJcbiAgXHJcbiAgICAgICAgZm9yKGxldCBpID0gKG9yZGVyKzEpOyBpPHJvYWQubGVuZ3RoOyBpKyspe1xyXG4gICAgICAgICAgICBpZighZGlyZWN0aW9uKXtcclxuICAgICAgICAgICAgICAgIHJvYWRbaV0ueCArPSAobnVtYmVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICAgICAgcm9hZFtpXS55ICs9IChudW1iZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGRpcmVjdGlvbil7XHJcbiAgICAgICAgICAgIGlmKG51bWJlciA8IDApe1xyXG4gICAgICAgICAgICAgICAgZm9yKGxldCBuPSAtbnVtYmVyOyBuPjA7IG4tLSl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VXYXRlcihjYy52Myh0aGlzLnBhdGhfQXJyYXlbb3JkZXIrMV0ueCx0aGlzLnBhdGhfQXJyYXlbb3JkZXIrMV0ueStuLDApKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjHnibnmrormlL7lhaU6XCIsdGhpcy5wYXRoX0FycmF5W29yZGVyKzFdLngsdGhpcy5wYXRoX0FycmF5W29yZGVyKzFdLnkrbilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNleyBcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgbj1udW1iZXI7IG4+MDsgbi0tKXtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVdhdGVyKGNjLnYzKHRoaXMucGF0aF9BcnJheVtvcmRlcisxXS54LHRoaXMucGF0aF9BcnJheVtvcmRlcisxXS55LW4sMCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiMueJueauiuaUvuWFpTpcIix0aGlzLnBhdGhfQXJyYXlbb3JkZXIrMV0ueCx0aGlzLnBhdGhfQXJyYXlbb3JkZXIrMV0ueS1uKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGlmKG51bWJlciA8IDApe1xyXG4gICAgICAgICAgICAgICAgZm9yKGxldCBtPSAtbnVtYmVyOyBtPjA7IG0tLSl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VXYXRlcihjYy52Myh0aGlzLnBhdGhfQXJyYXlbb3JkZXIrMV0ueCttLHRoaXMucGF0aF9BcnJheVtvcmRlcisxXS55LDApKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjPnibnmrormlL7lhaU6XCIsdGhpcy5wYXRoX0FycmF5W29yZGVyKzFdLngrbSx0aGlzLnBhdGhfQXJyYXlbb3JkZXIrMV0ueSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICAgICAgZm9yKGxldCBtPW51bWJlcjsgbT4wOyBtLS0pe1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlV2F0ZXIoY2MudjModGhpcy5wYXRoX0FycmF5W29yZGVyKzFdLngtbSx0aGlzLnBhdGhfQXJyYXlbb3JkZXIrMV0ueSwwKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI054m55q6K5pS+5YWlOlwiLHRoaXMucGF0aF9BcnJheVtvcmRlcisxXS54LW0sdGhpcy5wYXRoX0FycmF5W29yZGVyKzFdLnkpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPlua0quWzsOaWueWQkVxyXG4gICAgICogQHBhcmFtIG9yZGVyIOW7uuetkeWcsOWbvuaVsOe7hOmHjOeahOaJp+ihjOeahOW6j+WIl+WPt1xyXG4gICAgICogQHBhcmFtIHJvYWQg5bu6562R5Zyw5Zu+5pWw57uE5oiW6ICF5rSq5bOw6Lev5b6E5pWw57uE77yM5Y+v55CG6Kej5Li66Lev5b6E5pWw57uE77yMcGF0aF9BcnJheSB3YXRlcl9BcnJheVxyXG4gICAgICovXHJcbiAgICBnZXREaXJlY3Rpb24ob3JkZXIscm9hZCl7XHJcbiAgICAgICAgdmFyIG5hbWUgPSBcIlwiO1xyXG4gICAgICAgIC8v5YWl5rW35Y+j5q+U6L6D5aSN5p2C5Y2V54us5Yik5patXHJcbiAgICAgICAgaWYob3JkZXIgPT0gMCl7XHJcbiAgICAgICAgICAgIGlmKHRoaXMucGF0aF9BcnJheVtvcmRlcisxXS56ID09IDYgJiYgcm9hZCA9PSB0aGlzLnBhdGhfQXJyYXkpIG9yZGVyICs9IDE7XHJcbiAgICAgICAgICAgIGxldCBuZXh0WCA9IHJvYWRbb3JkZXIrMV0ueCAtIHJvYWRbb3JkZXJdLng7XHJcbiAgICAgICAgICAgIGxldCBuZXh0WSA9IHJvYWRbb3JkZXJdLnkgLSByb2FkW29yZGVyKzFdLnk7XHJcbiAgICAgICAgICAgIC8v5Zyo5bqV6L65XHJcbiAgICAgICAgICAgIGlmKHJvYWRbb3JkZXJdLnkgPT0gdGhpcy5tYXBfQXJyYXlbMF0ubGVuZ3RoLTEpe1xyXG4gICAgICAgICAgICAgICAgaWYobmV4dFggPT0gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYobmV4dFkgPT0gMSluYW1lID0gXCJ1cFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYobmV4dFkgPT0gLTEpIG5hbWUgPSBcImVyclwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZihuZXh0WCA9PSAxKSBuYW1lID0gXCJ1cF9yaWdodFwiO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZihuZXh0WCA9PSAtMSkgbmFtZSA9IFwidXBfbGVmdFwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8v5Zyo6aG26L65XHJcbiAgICAgICAgICAgIGVsc2UgaWYocm9hZFtvcmRlcl0ueSA9PSAwKXtcclxuICAgICAgICAgICAgICAgIGlmKG5leHRYID09IDApe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKG5leHRZID09IDEpbmFtZSA9IFwiZXJyXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihuZXh0WSA9PSAtMSkgbmFtZSA9IFwiZG93blwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZihuZXh0WCA9PSAxKSBuYW1lID0gXCJkb3duX3JpZ2h0XCI7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmKG5leHRYID09IC0xKSBuYW1lID0gXCJkb3duX2xlZnRcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL+WcqOW3pui+uVxyXG4gICAgICAgICAgICBlbHNlIGlmKHJvYWRbb3JkZXJdLnggPT0gMCl7XHJcbiAgICAgICAgICAgICAgICBpZihuZXh0WCA9PSAwKXtcclxuICAgICAgICAgICAgICAgICAgICBpZihuZXh0WSA9PSAxKW5hbWUgPSBcInJpZ2h0X3VwXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihuZXh0WSA9PSAtMSkgbmFtZSA9IFwicmlnaHRfZG93blwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZihuZXh0WCA9PSAxKSBuYW1lID0gXCJyaWdodFwiO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZihuZXh0WCA9PSAtMSkgbmFtZSA9IFwiZXJyXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy/lnKjlj7PovrlcclxuICAgICAgICAgICAgZWxzZSBpZihyb2FkW29yZGVyXS54ID09IHRoaXMubWFwX0FycmF5Lmxlbmd0aC0xKXtcclxuICAgICAgICAgICAgICAgIGlmKG5leHRYID09IDApe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKG5leHRZID09IDEpbmFtZSA9IFwibGVmdF91cFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYobmV4dFkgPT0gLTEpIG5hbWUgPSBcImxlZnRfZG93blwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZihuZXh0WCA9PSAxKSBuYW1lID0gXCJlcnJcIjtcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYobmV4dFggPT0gLTEpIG5hbWUgPSBcImxlZnRcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvL+S4jeaYr+esrOS4gOatpe+8jOW3sue7j+i1sOi/h+S4gOatpVxyXG4gICAgICAgIGVsc2UgaWYob3JkZXIgPiAwKXtcclxuICAgICAgICAgICAgdmFyIG5leHQgPSAxO1xyXG4gICAgICAgICAgICBpZihvcmRlcisyIDwgcm9hZC5sZW5ndGgpe1xyXG4gICAgICAgICAgICAgICAgaWYocm9hZFtvcmRlcisxXS56ID09IDYpIG5leHQgPSAyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgIFxyXG4gICAgICAgICAgICAvL+eUqOS6juWIpOaWreatpOeCueeahOS4iuS4gOS4queCue+8jOaYr+S4uuS6huWIpOaWreW9k+WJjeaWueWdl+a0quawtOS4g+eCue+8jOS7peWPiuS4i+S4gOS4quenu+WKqOaWueWQke+8jOWIpOaWrea0que7iOeCueaWueWQkVxyXG4gICAgICAgICAgICBsZXQgbmV4dFggPSByb2FkW29yZGVyK25leHRdLnggLSByb2FkW29yZGVyXS54O1xyXG4gICAgICAgICAgICBsZXQgbmV4dFkgPSByb2FkW29yZGVyXS55IC0gcm9hZFtvcmRlcituZXh0XS55XHJcbiAgICAgICAgICAgIGxldCBwcmV2aW91c1ggPSByb2FkW29yZGVyXS54IC0gcm9hZFtvcmRlci0xXS54O1xyXG4gICAgICAgICAgICBsZXQgcHJldmlvdXNZID0gcm9hZFtvcmRlci0xXS55IC0gcm9hZFtvcmRlcl0ueTtcclxuICAgICAgICAgICAgaWYocHJldmlvdXNYID09IDAgJiYgcHJldmlvdXNZID09IDApe1xyXG4gICAgICAgICAgICAgICAgaWYob3JkZXIgPiAxKXtcclxuICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1ggPSByb2FkW29yZGVyXS54IC0gcm9hZFtvcmRlci0yXS54O1xyXG4gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzWSA9IHJvYWRbb3JkZXItMl0ueSAtIHJvYWRbb3JkZXJdLnk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmKG9yZGVyICsgMSA8IHJvYWQubGVuZ3RoKXtcclxuICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1ggPSByb2FkW29yZGVyKzFdLnggLSByb2FkW29yZGVyXS54O1xyXG4gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzWSA9IHJvYWRbb3JkZXJdLnkgLSByb2FkW29yZGVyKzFdLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCLmga/lo6TvvIzkuIrkuIvlnZDmoIflt67ot51cIixwcmV2aW91c1gscHJldmlvdXNZKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihwcmV2aW91c1ggPT0gMCAmJiBwcmV2aW91c1kgPj0gMSl7XHJcbiAgICAgICAgICAgICAgICBpZihuZXh0WCA9PSAwKXtcclxuICAgICAgICAgICAgICAgICAgICBpZihuZXh0WSA9PSAxKW5hbWUgPSBcInVwXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihuZXh0WSA9PSAtMSkgbmFtZSA9IFwiZXJyXCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmKG5leHRYID09IDEpIG5hbWUgPSBcInVwX3JpZ2h0XCI7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmKG5leHRYID09IC0xKSBuYW1lID0gXCJ1cF9sZWZ0XCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZihwcmV2aW91c1ggPT0gMCAmJiBwcmV2aW91c1kgPD0gLTEpe1xyXG4gICAgICAgICAgICAgICAgaWYobmV4dFggPT0gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYobmV4dFkgPT0gMSluYW1lID0gXCJlcnJcIjtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKG5leHRZID09IC0xKSBuYW1lID0gXCJkb3duXCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmKG5leHRYID09IDEpIG5hbWUgPSBcImRvd25fcmlnaHRcIjtcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYobmV4dFggPT0gLTEpIG5hbWUgPSBcImRvd25fbGVmdFwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYocHJldmlvdXNYID49IDEgJiYgcHJldmlvdXNZID09IDApe1xyXG4gICAgICAgICAgICAgICAgaWYobmV4dFggPT0gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYobmV4dFkgPT0gMSluYW1lID0gXCJyaWdodF91cFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYobmV4dFkgPT0gLTEpIG5hbWUgPSBcInJpZ2h0X2Rvd25cIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYobmV4dFggPT0gMSkgbmFtZSA9IFwicmlnaHRcIjtcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYobmV4dFggPT0gLTEpIG5hbWUgPSBcImVyclwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYocHJldmlvdXNYIDw9IC0xICYmIHByZXZpb3VzWSA9PSAwKXtcclxuICAgICAgICAgICAgICAgIGlmKG5leHRYID09IDApe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKG5leHRZID09IDEpbmFtZSA9IFwibGVmdF91cFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYobmV4dFkgPT0gLTEpIG5hbWUgPSBcImxlZnRfZG93blwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZihuZXh0WCA9PSAxKSBuYW1lID0gXCJlcnJcIjtcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYobmV4dFggPT0gLTEpIG5hbWUgPSBcImxlZnRcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG5hbWUgO1xyXG4gICAgfVxyXG5cclxuICAgIC8v5qC55o2u5piv5ZCm5YWo6Z2i5bGP77yM5YGa54us56uL6YCC6YWN5pa56Z2iXHJcbiAgICBmaXQoKXtcclxuICAgICAgICB2YXIgamcgPSB0aGlzLnNldEZpdCgpO1xyXG4gICAgICAgIGlmKCFqZyl7XHJcbiAgICAgICAgICAgIHRoaXMuTWFwLnNjYWxlID0gMS4yO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICB0aGlzLk1hcC5zY2FsZSA9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy/liKTmlq3lhajpnaLlsY9cclxuICAgIGdldFNldFNjcmVlblJlc29sdXRpb25GbGFnICgpIHtcclxuICAgICAgICBsZXQgc2l6ZSA9IGNjLndpblNpemU7XHJcbiAgICAgICAgbGV0IHdpZHRoID0gc2l6ZS53aWR0aDtcclxuICAgICAgICBsZXQgaGVpZ2h0ID0gc2l6ZS5oZWlnaHQ7XHJcbiAgICAgICAgaWYgKChoZWlnaHQgLyB3aWR0aCkgPiAoMTYuMiAvIDkpKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICAvL+WIpOaWreWFqOmdouWxj+mAgumFjVxyXG4gICAgc2V0Rml0ICgpIHtcclxuICAgICAgICBsZXQgZmxhZyA9IHRoaXMuZ2V0U2V0U2NyZWVuUmVzb2x1dGlvbkZsYWcoKTtcclxuICAgICAgICBpZiAoZmxhZykge1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmbGFnO1xyXG4gICAgfVxyXG4gICAgLy/ov5Tlm57pppbpobVcclxuICAgIGJhY2tTY2VuZSgpe1xyXG4gICAgICAgIGNjLmRpcmVjdG9yLmxvYWRTY2VuZShcIkxvYWRTY2VuZVwiKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICog5byA5aeL5L+u562RXHJcbiAgICAgKiBAcGFyYW0gZGF0YSDorrDlvZXmk43kvZznmoTmlbDnu4RcclxuICAgICAqL1xyXG4gICAgc3RhcnRHYW1lKGRhdGEpe1xyXG4gICAgICAgIHRoaXMudW5zY2hlZHVsZSh0aGlzLnVwZGF0ZVdhdGVyVGltZSk7XHJcbiAgICAgICAgZm9yKGxldCBpPTA7IGk8dGhpcy5ibG9ja19BcnJheS5sZW5ndGg7aSsrKXtcclxuICAgICAgICAgICAgdGhpcy5ibG9ja19BcnJheVtpXS5nZXRDaGlsZEJ5TmFtZShcInRpcFdpblwiKS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5ibG9ja19BcnJheVtpXS5nZXRDaGlsZEJ5TmFtZShcInRpcExvc2VcIikuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudW5zY2hlZHVsZSh0aGlzLnVwZGF0ZUNvdW50RG93blRpbWUpO1xyXG4gICAgICAgIHZhciBub3cgPSBjYy5meC5HYW1lVG9vbC5nZXRUaW1lKCk7XHJcbiAgICAgICAgdmFyIGZpbmlzaGkgPSBub3cgLSB0aGlzLmZpbmlzaGlUaW1lO1xyXG4gICAgICAgIHZhciB0b3RhbFRpbWUgPSBub3cgLSB0aGlzLnN0YXJ0VGltZTtcclxuICAgICAgICB0aGlzLnNjb3JlVGltZSA9IHRoaXMud2F0ZXJUaW1lO1xyXG4gICAgICAgIGlmKHRoaXMud2F0ZXJUaW1lIDw9IDAuNSkgZmluaXNoaSA9IC0xO1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3VibWl0VGltZTpcIixmaW5pc2hpLHRoaXMuZmluaXNoaVRpbWUpO1xyXG4gICAgICAgIGNjLmZ4LkdhbWVDb25maWcuQ0xJQ0tfU0VUKFwic3VibWl0VGltZVwiLGZpbmlzaGkpO1xyXG4gICAgICAgIGlmKGZpbmlzaGkgPT0gLTEpIFxyXG4gICAgICAgICAgICBjYy5meC5HYW1lQ29uZmlnLkNMSUNLX1NFVChcImR1cmF0aW9uXCIsY2MuZnguR2FtZUNvbmZpZy5USU1FX0lORk8ud2F0ZXJUaW1lW2NjLmZ4LkdhbWVDb25maWcuR01fSU5GTy5sZXZlbF0pO1xyXG4gICAgICAgIGVsc2UgXHJcbiAgICAgICAgICAgIGNjLmZ4LkdhbWVDb25maWcuQ0xJQ0tfU0VUKFwiZHVyYXRpb25cIix0b3RhbFRpbWUpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICBjYy5meC5HYW1lQ29uZmlnLkNMSUNLX1NFVChcInVzZWRTdGVwc1wiLGRhdGEubGVuZ3RoKTtcclxuICAgICAgICB0aGlzLnNldE1hcChkYXRhKTtcclxuICBcclxuICAgICAgICB2YXIgYXJyID0gdGhpcy5jaGFuZ2VTdGVwKGRhdGEpO1xyXG4gICAgICAgIGNjLmZ4LkdhbWVDb25maWcuQ0xJQ0tfU0VUKFwic3RlcExpc3RcIixhcnIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog55So5LqO5Z+L54K56K6w5b2VIOi9rOWPmOaWueWQkeWQjeensOS4uuWfi+eCueaJgOmcgOimgeagvOW8j1xyXG4gICAgICogQHBhcmFtIGRhdGEg6K6w5b2V5pON5L2c55qE5pWw57uEXHJcbiAgICAgKi9cclxuICAgIGNoYW5nZVN0ZXAoZGF0YSl7XHJcbiAgICAgICAgdmFyIGFyciA9IFtdO1xyXG4gICAgICAgIGlmKGRhdGEubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgIGZvcihsZXQgaT0wOyBpPGRhdGEubGVuZ3RoOyBpKyspe1xyXG4gICAgICAgICAgICAgICAgaWYoZGF0YVtpXSA9PSBcInVwXCIpIGFycltpXSA9IFwiVVwiO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZihkYXRhW2ldID09IFwiZG93blwiKSBhcnJbaV0gPSBcIkRcIjtcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYoZGF0YVtpXSA9PSBcImxlZnRcIikgYXJyW2ldID0gXCJMXCI7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmKGRhdGFbaV0gPT0gXCJyaWdodFwiKSBhcnJbaV0gPSBcIlJcIjtcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYoZGF0YVtpXSA9PSBcInNvaWxcIikgYXJyW2ldID0gXCJYXCI7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmKGRhdGFbaV0gPT0gXCJyZWluZm9yY2VcIikgYXJyW2ldID0gXCJGXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFycjtcclxuICAgIH1cclxuICAgIC8v5rSq5bOw5YCS6K6h5pe277yM6K6h5pe25ZmoXHJcbiAgICB1cGRhdGVXYXRlclRpbWUoKXtcclxuICAgICAgICBpZiAodGhpcy53YXRlclRpbWUgPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMud2F0ZXJUaW1lIC09IDE7XHJcbiAgICAgICAgICAgIHRoaXMuQ291bnRkb3duLnN0cmluZyA9ICBjYy5meC5HYW1lVG9vbC5nZXRUaW1lTWFyZ2luKHRoaXMud2F0ZXJUaW1lKTtcclxuICAgICAgICAgICAgaWYodGhpcy53YXRlclRpbWUgPD0gMCl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVuc2NoZWR1bGUodGhpcy51cGRhdGVXYXRlclRpbWUpO1xyXG4gICAgICAgICAgICAgICAgaWYoIXRoaXMucGxhbl9vdmVyKXtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLndhdGVyVGltZSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGFuX292ZXIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLndhdGVyX0FycmF5Lmxlbmd0aCA9PSAwKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjLmZ4Lk5vdGlmaWNhdGlvbnMuZW1pdChjYy5meC5NZXNzYWdlLnNob3dSZXN1bHQsXCJsb3NlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8ubWluX1RpbWUgPSB0aGlzLndhdGVyVGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucnVuV2F0ZXIoMCk7IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgXHJcbiAgICAgICAgICAgICAgICAgICAgfSwgNTAwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL+WmguaenOaYr+WAkuiuoeaXtiDosIPnlKjmraTmlrnms5VcclxuICAgIHVwZGF0ZUNvdW50RG93blRpbWUgKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNvdW50VGltZSA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5jb3VudFRpbWUgLT0gMTtcclxuICAgICAgICAgICAgY2MuZnguR2FtZUNvbmZpZy5USU1FX0lORk8udG90YWxUaW1lID0gdGhpcy5jb3VudFRpbWU7XHJcbiAgICAgICAgICAgIHRoaXMuVGltZS5zdHJpbmcgPSAgY2MuZnguR2FtZVRvb2wuZ2V0VGltZU1hcmdpbih0aGlzLmNvdW50VGltZSk7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuY291bnRUaW1lIDwgNSl7XHJcbiAgICAgICAgICAgICAgICBsZXQgb3ZlciA9IHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZShcIk92ZXJcIik7XHJcbiAgICAgICAgICAgICAgICBjYy50d2VlbihvdmVyKVxyXG4gICAgICAgICAgICAgICAgLnRvKDAuMix7b3BhY2l0eToyNTV9KVxyXG4gICAgICAgICAgICAgICAgLmRlbGF5KDAuMSlcclxuICAgICAgICAgICAgICAgIC50bygwLjIse29wYWNpdHk6MH0pXHJcbiAgICAgICAgICAgICAgICAuc3RhcnQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZih0aGlzLmNvdW50VGltZSA8PSAwKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuY291bnRUaW1lID0gMDtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0RGF0YShcImxvc2VcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVuc2NoZWR1bGUodGhpcy51cGRhdGVDb3VudERvd25UaW1lKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2FtZU92ZXIoKTsgICAgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvL+S4iuS8oOavj+asoeaTjeS9nOaVsOaNriBzdWNjZXNz5Li65oiQ5Yqf6L+Y5piv5aSx6LSlXHJcbiAgICBzZXREYXRhKHN1Y2Nlc3Mpe1xyXG4gICAgICAgIC8v6K6+572u5Z+L54K55pWw5o2uXHJcbiAgICAgICAgY2MuZnguR2FtZUNvbmZpZy5DTElDS19TRVQoXCJtYXBJZFwiLGNjLmZ4LkdhbWVDb25maWcuTEVWRUxfSU5GT1tjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8ubGV2ZWxdW3RoaXMuY3VzdG9tXS5pZCk7XHJcbiAgICAgICAgY2MuZnguR2FtZUNvbmZpZy5DTElDS19TRVQoXCJkaWZmaWN1bHR5XCIsY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLmxldmVsKTtcclxuICAgICAgICBjYy5meC5HYW1lQ29uZmlnLkNMSUNLX1NFVChcIm9wdGltaXplZFN0ZXBzXCIsY2MuZnguR2FtZUNvbmZpZy5MRVZFTF9JTkZPW2NjLmZ4LkdhbWVDb25maWcuR01fSU5GTy5sZXZlbF1bdGhpcy5jdXN0b21dLm1pbl9zdGVwcyk7XHJcbiAgICAgICAgY2MuZnguR2FtZUNvbmZpZy5DTElDS19TRVQoXCJyb3VuZFwiLGNjLmZ4LkdhbWVDb25maWcuR01fSU5GTy5yb3VuZCk7XHJcbiAgICAgICAgY2MuZnguR2FtZUNvbmZpZy5DTElDS19TRVQoXCJ0aW1lclwiLGNjLmZ4LkdhbWVDb25maWcuVElNRV9JTkZPLnRvdGFsVGltZSk7XHJcbiAgICAgICAgY2MuZnguR2FtZUNvbmZpZy5DTElDS19TRVQoXCJjdW11bGF0aXZlU2NvcmVcIixjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8uc2NvcmUpO1xyXG4gICAgICAgIHN1Y2Nlc3MgPSBzdWNjZXNzID09XCJsb3NlXCI/ZmFsc2U6dHJ1ZVxyXG4gICAgICAgIGlmKHN1Y2Nlc3MgIT0gbnVsbCl7XHJcbiAgICAgICAgICAgIGNjLmZ4LkdhbWVDb25maWcuQ0xJQ0tfU0VUKFwic3VjY2Vzc1wiLHN1Y2Nlc3MpO1xyXG4gICAgICAgICAgICBjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8uZmVuID0gdGhpcy5nZXRTY29yZSgpO1xyXG4gICAgICAgICAgICBpZighc3VjY2VzcykgY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLmZlbiA9IDA7XHJcbiAgICAgICAgICAgIGNjLmZ4LkdhbWVDb25maWcuQ0xJQ0tfU0VUKFwiZ2V0U2NvcmVcIixjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8uZmVuKTtcclxuICAgICAgICAgICAgY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLnNjb3JlICs9IGNjLmZ4LkdhbWVDb25maWcuR01fSU5GTy5mZW47XHJcbiAgICAgICAgICAgIHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZShcIlRvcFwiKS5nZXRDaGlsZEJ5TmFtZShcImlkXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCkuc3RyaW5nID0gXHJcbiAgICAgICAgICAgIGNjLmZ4LkdhbWVDb25maWcuR01fSU5GTy5zY29yZTtcclxuICAgICAgICAgICAgY2MuZnguR2FtZUNvbmZpZy5DTElDS19TRVQoXCJjdW11bGF0aXZlU2NvcmVcIixjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8uc2NvcmUpO1xyXG4gICAgICAgICAgICBpZih0aGlzLmNvdW50VGltZSAhPSAwKWNjLmZ4LkdhbWVDb25maWcuR01fSU5GTy5zdWNjZXNzTGlzdC5wdXNoKHN1Y2Nlc3MpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYy5meC5HYW1lVG9vbC5zZXRHYW1lRGF0YSgpO1xyXG4gICAgICAgIFxyXG4gICAgfVxyXG4gICAgLy/orqHnrpflvpfliIZcclxuICAgIGdldFNjb3JlKCl7XHJcbiAgICAgICAgLy/mnIDlsI/mraXmlbBcclxuICAgICAgICBsZXQgbWluID0gY2MuZnguR2FtZUNvbmZpZy5MRVZFTF9JTkZPW2NjLmZ4LkdhbWVDb25maWcuR01fSU5GTy5sZXZlbF1bdGhpcy5jdXN0b21dLm1pbl9zdGVwcztcclxuICAgICAgICAvL+WunumZheS9v+eUqOatpeaVsFxyXG4gICAgICAgIGxldCBub3cgPSB0aGlzLnBhdGhfQXJyYXkubGVuZ3RoLTE7XHJcbiAgICAgICAgaWYobm93IDw9MCkgbm93ID0gMDtcclxuICAgICAgICB2YXIgeCA9ICgyLjUqbWluIC0gbm93KSAvIG1pbjtcclxuICAgICAgICBsZXQgc2NvcmUgPSBNYXRoLnBvdyhtaW4seCkgKiogMC41O1xyXG4gICAgICAgIHNjb3JlID0gc2NvcmUgKiAodGhpcy5zY29yZVRpbWUgKyAxMCkqMTAwO1xyXG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKHNjb3JlKTtcclxuICAgIH1cclxuXHJcbiAgICAvL+S4iuS8oOaOkuihjOamnOaVsOaNrlxyXG4gICAgZ2FtZU92ZXIoKXtcclxuICAgICAgICB2YXIgcmF0ZSA9IDA7XHJcbiAgICAgICAgdmFyIHN1Y2Nlc3NMaXN0ID0gY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLnN1Y2Nlc3NMaXN0O1xyXG4gICAgICAgIGlmKHN1Y2Nlc3NMaXN0Lmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICB2YXIgc3VjY2VzcyA9IDA7XHJcbiAgICAgICAgICAgIGZvcihsZXQgaT0wOyBpPHN1Y2Nlc3NMaXN0Lmxlbmd0aDsgaSsrKXtcclxuICAgICAgICAgICAgICAgIGlmKHN1Y2Nlc3NMaXN0W2ldID09IHRydWUpIHN1Y2Nlc3MgKz0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByYXRlID0gc3VjY2Vzcy9zdWNjZXNzTGlzdC5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJhdGUgPSBNYXRoLmZsb29yKHJhdGUgKiAxMDAwKS8xMDtcclxuICAgICAgICBsZXQgZGF0YSA9IHtcclxuICAgICAgICAgICAgc2NvcmU6IGNjLmZ4LkdhbWVDb25maWcuR01fSU5GTy5zY29yZSxcclxuICAgICAgICAgICAgcmF0ZTogcmF0ZVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYy5meC5HYW1lVG9vbC5zZXRSYW5rKGRhdGEpO1xyXG4gICAgICAgIHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZShcIkdhbWVPdmVyXCIpLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5ub2RlLmdldENoaWxkQnlOYW1lKFwiR2FtZU92ZXJcIikub3BhY2l0eSA9IDA7XHJcbiAgICAgICAgY2MudHdlZW4odGhpcy5ub2RlLmdldENoaWxkQnlOYW1lKFwiR2FtZU92ZXJcIikpXHJcbiAgICAgICAgLnRvKDAuNCx7b3BhY2l0eToyNTV9KVxyXG4gICAgICAgIC5kZWxheSgxKVxyXG4gICAgICAgIC50bygwLjQse29wYWNpdHk6NTB9KVxyXG4gICAgICAgIC5jYWxsKCgpID0+e1xyXG4gICAgICAgICAgICBjYy5kaXJlY3Rvci5sb2FkU2NlbmUoXCJPdmVyU2NlbmVcIik7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuc3RhcnQoKVxyXG4gICAgfVxyXG4gICAgLy/lsZXnpLrnu5PmnpwgZGF0YeS4uuaIkOWKn+aIluiAheWksei0pVxyXG4gICAgc2hvd1Jlc3VsdChkYXRhKXtcclxuICAgICAgICBpZih0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJHYW1lT3ZlclwiKS5hY3RpdmUgPT0gZmFsc2UgJiYgdGhpcy5ub2RlLmdldENoaWxkQnlOYW1lKFwiV2luZG93XCIpLmFjdGl2ZSA9PSBmYWxzZSl7XHJcbiAgICAgICAgICAgIGNjLmZ4Lk5vdGlmaWNhdGlvbnMuZW1pdChjYy5meC5NZXNzYWdlLnNldERhdGEsZGF0YSk7XHJcbiAgICAgICAgICAgIGlmKGRhdGEgPT0gXCJsb3NlXCIpe1xyXG4gICAgICAgICAgICAgICAgY2MuZnguQXVkaW9NYW5hZ2VyLl9pbnN0YW5jZS5wbGF5RWZmZWN0KFwibG9zZVwiLG51bGwpO1xyXG4gICAgICAgICAgICAgICAgY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLm1pbl9UaW1lID0gLTE7XHJcbiAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgICAgICBjYy5meC5BdWRpb01hbmFnZXIuX2luc3RhbmNlLnBsYXlFZmZlY3QoXCJ3aW5cIixudWxsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJXaW5kb3dcIikuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5ub2RlLmdldENoaWxkQnlOYW1lKFwiV2luZG93XCIpLmdldENvbXBvbmVudChcIldpbmRvd1wiKS5pbml0KGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8v6K6w5b2V5Y+N5bqU5pe26ZW/77yM5Lul5Y+K5YGa5q2l6aqk5o+Q56S6IGRhdGHkuLrmk43kvZzlkI3np7BcclxuICAgIGNsaWNrU3VuKGRhdGEpe1xyXG4gICAgICAgIC8v5aaC5p6c5rKh5pyJ6K6w5b2V6L+HIOWbnuWQiOW8gOWni+WIsOaTjeS9nOWPjeW6lOaXtumVv++8jOWImeesrOS4gOasoeiusOW9le+8jCDlkI7pnaLkuI3orrDlvZVcclxuXHJcbiAgICAgICAgaWYoY2MuZnguR2FtZUNvbmZpZy5DTElDS19EQVRBLnN0YXJ0VGltZSA9PSAtMSl7XHJcbiAgICAgICAgICAgIHRoaXMuZmluaXNoaVRpbWUgPSBjYy5meC5HYW1lVG9vbC5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIHZhciBub3cgID0gdGhpcy5maW5pc2hpVGltZSAtIHRoaXMuc3RhcnRUaW1lO1xyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN0YXJ0VGltZTpcIix0aGlzLmZpbmlzaGlUaW1lKTtcclxuICAgICAgICAgICAgY2MuZnguR2FtZUNvbmZpZy5DTElDS19TRVQoXCJzdGFydFRpbWVcIixub3cpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZihjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8ubGV2ZWwgPiAzKSByZXR1cm47XHJcbiAgICAgICAgLy/mraXpqqTmj5DnpLpcclxuICAgICAgICB2YXIgbm93UG9zID0gdGhpcy5wYXRoX0FycmF5WzBdO1xyXG4gICAgICAgIGlmKHRoaXMudGlwX0FycmF5Lmxlbmd0aCAhPSAwKXtcclxuICAgICAgICAgICAgaWYodGhpcy50aXBfQXJyYXlbdGhpcy50aXBfQXJyYXkubGVuZ3RoLTFdID09IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy50aXBfQXJyYXkucHVzaChudWxsKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBub3dQb3MgPSB0aGlzLnRpcF9BcnJheVt0aGlzLnRpcF9BcnJheS5sZW5ndGgtMV1bdGhpcy50aXBfQXJyYXlbdGhpcy50aXBfQXJyYXkubGVuZ3RoLTFdLmxlbmd0aC0xXTtcclxuICAgICAgICAgICAgaWYobm93UG9zKXtcclxuICAgICAgICAgICAgICAgIGxldCBuID0gbm93UG9zLngqdGhpcy5tYXBfQXJyYXlbMF0ubGVuZ3RoK25vd1Bvcy55O1xyXG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldE5vZGUgPSB0aGlzLmJsb2NrX0FycmF5W25dO1xyXG4gICAgICAgICAgICAgICAgaWYodGFyZ2V0Tm9kZS5nZXRDaGlsZEJ5TmFtZShcInRpcExvc2VcIikuYWN0aXZlID09IHRydWUpe1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGlwX0FycmF5LnB1c2gobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IFxyXG5cclxuICAgICAgICBpZihkYXRhID09IFwidXBcIil7XHJcbiAgICAgICAgICAgIGxldCBuID0gY2MudjIobm93UG9zLngsbm93UG9zLnktMSk7XHJcbiAgICAgICAgICAgIHRoaXMudGlwQ2FuKG4sZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoZGF0YSA9PSBcImRvd25cIil7XHJcbiAgICAgICAgICAgIGxldCBuID0gY2MudjIobm93UG9zLngsbm93UG9zLnkrMSk7XHJcbiAgICAgICAgICAgIHRoaXMudGlwQ2FuKG4sZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoZGF0YSA9PSBcImxlZnRcIil7XHJcbiAgICAgICAgICAgIGxldCBuID0gY2MudjIobm93UG9zLngtMSxub3dQb3MueSk7XHJcbiAgICAgICAgICAgIHRoaXMudGlwQ2FuKG4sZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoZGF0YSA9PSBcInJpZ2h0XCIpe1xyXG4gICAgICAgICAgICBsZXQgbiA9IGNjLnYyKG5vd1Bvcy54KzEsbm93UG9zLnkpO1xyXG4gICAgICAgICAgICB0aGlzLnRpcENhbihuLGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKGRhdGEgPT0gXCJyZWluZm9yY2VcIil7XHJcbiAgICAgICAgICAgIGxldCBuID0gY2MudjMobm93UG9zLngsbm93UG9zLnksMik7XHJcbiAgICAgICAgICAgIHRoaXMudGlwX0FycmF5LnB1c2goW25dKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZihkYXRhID09IFwic29pbFwiKXtcclxuICAgICAgICAgICAgbGV0IG4gPSBjYy52Myhub3dQb3MueCxub3dQb3MueSwzKTtcclxuICAgICAgICAgICAgdGhpcy50aXBfQXJyYXkucHVzaChbbl0pO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgfVxyXG4gICAgLy/mj5DnpLrmmK/lkKbplJnor68gIOWPquWJjeS4ieWFs+aciSAscG9z5Li65L2N572u77yMZGF0YeS4uuaTjeS9nOaWueWQkVxyXG4gICAgdGlwQ2FuKHBvcyxkYXRhKXtcclxuICAgIFxyXG4gICAgICAgIC8v5YWI5Yik5pat5piv5ZCm5Ye66L6555WMXHJcbiAgICAgICAgaWYocG9zLnggPDAgfHwgcG9zLnggPnRoaXMubWFwX0FycmF5Lmxlbmd0aC0xIHx8IHBvcy55IDwwIHx8IHBvcy55ID4gdGhpcy5tYXBfQXJyYXlbMF0ubGVuZ3RoLTEgKXtcclxuICAgICAgICAgICAgdGhpcy50aXBfQXJyYXkucHVzaChudWxsKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gICBcclxuICAgICAgICBsZXQgbiA9IHBvcy54KnRoaXMubWFwX0FycmF5WzBdLmxlbmd0aCtwb3MueTtcclxuICAgICAgICBsZXQgdGFyZ2V0ID0gdGhpcy5ibG9ja19BcnJheVtuXS5nZXRDb21wb25lbnQoXCJCbG9ja1wiKTtcclxuICAgICAgICB0YXJnZXQubm9kZS5nZXRDaGlsZEJ5TmFtZShcInRpcFdpblwiKS5hY3RpdmUgPSB0cnVlO1xyXG5cclxuICAgICAgICAvL+mHjeWkjei3r+WbnuWktOi3r++8jOaIluiAheWxseWzsFxyXG4gICAgICAgIGlmKHRhcmdldC5yZXBlYXRSb2FkKGZhbHNlLG51bGwpID09IHRydWUgfHwgdGFyZ2V0LmJsb2NrX1R5cGUgPT0gMyl7XHJcbiAgICAgICAgICAgIHRoaXMudGlwX0FycmF5LnB1c2goW2NjLnYzKHBvcy54LHBvcy55LDApXSk7XHJcbiAgICAgICAgICAgIHRhcmdldC5ub2RlLmdldENoaWxkQnlOYW1lKFwidGlwTG9zZVwiKS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICB0YXJnZXQubm9kZS5nZXRDaGlsZEJ5TmFtZShcInRpcFdpblwiKS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy/mub/lnLAg5LiK5LiA5q2l5aaC5p6c5rKh55So5oGv5aOk5oiW6ICF5Yqg5Zu6XHJcbiAgICAgICAgZWxzZSBpZih0YXJnZXQuYmxvY2tfVHlwZSA9PSAyKXtcclxuICAgICAgICAgICAgaWYodGhpcy50aXBfQXJyYXkubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICBpZih0aGlzLnRpcF9BcnJheVt0aGlzLnRpcF9BcnJheS5sZW5ndGgtMV1bMF0ueiA9PSAwKXtcclxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQubm9kZS5nZXRDaGlsZEJ5TmFtZShcInRpcExvc2VcIikuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQubm9kZS5nZXRDaGlsZEJ5TmFtZShcInRpcFdpblwiKS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYodGhpcy50aXBfQXJyYXlbdGhpcy50aXBfQXJyYXkubGVuZ3RoLTFdWzBdLnogPT0gMil7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Lm5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJ0aXBMb3NlXCIpLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5ub2RlLmdldENoaWxkQnlOYW1lKFwidGlwV2luXCIpLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgIHRhcmdldC5ub2RlLmdldENoaWxkQnlOYW1lKFwidGlwTG9zZVwiKS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0Lm5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJ0aXBXaW5cIikuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKHRoaXMudGlwX0FycmF5Lmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICBpZih0aGlzLnRpcF9BcnJheVt0aGlzLnRpcF9BcnJheS5sZW5ndGgtMV1bMF0ueiA9PSAzKXtcclxuICAgICAgICAgICAgICAgIGlmKGRhdGEgPT0gXCJ1cFwiKXtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgYXJyID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpPXBvcy55OyBpID49MDtpLS0pe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYmxvY2sgPSB0aGlzLmJsb2NrX0FycmF5W3Bvcy54KnRoaXMubWFwX0FycmF5WzBdLmxlbmd0aCtpXS5nZXRDb21wb25lbnQoXCJCbG9ja1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoYmxvY2suYmxvY2tfVHlwZSA9PSAzKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAtMTAwMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJ0aXBXaW5cIikuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyci5wdXNoKGNjLnYzKHBvcy54LGksMCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGJsb2NrLmJsb2NrX1R5cGUgPT0gNCkgaSA9IC0xMDAwMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpcF9BcnJheS5wdXNoKGFycik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmKGRhdGEgPT0gXCJkb3duXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBhcnIgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGk9cG9zLnk7IGk8dGhpcy5tYXBfQXJyYXlbMF0ubGVuZ3RoO2krKyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBibG9jayA9IHRoaXMuYmxvY2tfQXJyYXlbcG9zLngqdGhpcy5tYXBfQXJyYXlbMF0ubGVuZ3RoK2ldLmdldENvbXBvbmVudChcIkJsb2NrXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihibG9jay5ibG9ja19UeXBlID09IDMpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IDEwMDAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay5ub2RlLmdldENoaWxkQnlOYW1lKFwidGlwV2luXCIpLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIucHVzaChjYy52Myhwb3MueCxpLDApKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBibG9jay5ibG9ja19UeXBlID09IDQpIGkgPSAxMDAwMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpcF9BcnJheS5wdXNoKGFycik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmKGRhdGEgPT0gXCJyaWdodFwiKXtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgYXJyID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpPXBvcy54OyBpPHRoaXMubWFwX0FycmF5Lmxlbmd0aDtpKyspe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYmxvY2sgPSB0aGlzLmJsb2NrX0FycmF5W2kqdGhpcy5tYXBfQXJyYXlbMF0ubGVuZ3RoK3Bvcy55XS5nZXRDb21wb25lbnQoXCJCbG9ja1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoYmxvY2suYmxvY2tfVHlwZSA9PSAzKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAxMDAwMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2subm9kZS5nZXRDaGlsZEJ5TmFtZShcInRpcFdpblwiKS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnB1c2goY2MudjMoaSxwb3MueSwwKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggYmxvY2suYmxvY2tfVHlwZSA9PSA0KSBpID0gMTAwMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aXBfQXJyYXkucHVzaChhcnIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZihkYXRhID09IFwibGVmdFwiKXtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgYXJyID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpPXBvcy54OyBpPj0wIDtpLS0pe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYmxvY2sgPSB0aGlzLmJsb2NrX0FycmF5W2kqdGhpcy5tYXBfQXJyYXlbMF0ubGVuZ3RoK3Bvcy55XS5nZXRDb21wb25lbnQoXCJCbG9ja1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoYmxvY2suYmxvY2tfVHlwZSA9PSAzKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAtMTAwMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJ0aXBXaW5cIikuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyci5wdXNoKGNjLnYzKGkscG9zLnksMCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGJsb2NrLmJsb2NrX1R5cGUgPT0gNCkgaSA9IC0xMDAwMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpcF9BcnJheS5wdXNoKGFycik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgIGxldCBwb3NKZyA9IGNjLnYzKHBvcy54LHBvcy55LDApO1xyXG4gICAgICAgICAgICAgICAgaWYoZGF0YSA9PSBcInJlaW5mb3JjZVwiKSBwb3MueiA9IDI7XHJcbiAgICAgICAgICAgICAgICBpZihkYXRhID09IFwic29pbFwiKSBwb3MueiA9IDM7IFxyXG4gICAgICAgICAgICAgICAgdGhpcy50aXBfQXJyYXkucHVzaChbcG9zSmddKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnRpcF9BcnJheSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBwb3NKZyA9IGNjLnYzKHBvcy54LHBvcy55LDApO1xyXG4gICAgICAgIGlmKGRhdGEgPT0gXCJyZWluZm9yY2VcIikgcG9zLnogPSAyO1xyXG4gICAgICAgIGlmKGRhdGEgPT0gXCJzb2lsXCIpIHBvcy56ID0gMzsgXHJcbiAgICAgICAgdGhpcy50aXBfQXJyYXkucHVzaChbcG9zSmddKTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnRpcF9BcnJheSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy/np7vpmaTmj5DnpLpcclxuICAgIHJlbW92ZVRpcChkYXRhKXtcclxuICAgICAgICBpZihjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8ubGV2ZWwgPiAzKSByZXR1cm47XHJcbiAgICAgICAgLy/liIbkuLrmkqTlm57kuIDmraUg5ZKM5YWo6YOo5riF56m6XHJcbiAgICAgICAgaWYodGhpcy50aXBfQXJyYXkubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgIGlmKGRhdGEgPT0gXCJiYWNrXCIpe1xyXG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IHRoaXMudGlwX0FycmF5W3RoaXMudGlwX0FycmF5Lmxlbmd0aC0xXTtcclxuICAgICAgICAgICAgICAgIGlmKHRhcmdldCA9PSBudWxsKXtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpcF9BcnJheS5wb3AoKTtcclxuICAgICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGlwX0FycmF5LnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaT0wOyBpPHRhcmdldC5sZW5ndGg7aSsrKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYodGFyZ2V0W2ldKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0YXJnZXRbMF0ueiA9PSAwKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbiA9IHRhcmdldFtpXS54KnRoaXMubWFwX0FycmF5WzBdLmxlbmd0aCt0YXJnZXRbaV0ueTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IHRoaXMuYmxvY2tfQXJyYXlbbl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5nZXRDaGlsZEJ5TmFtZShcInRpcFdpblwiKS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmdldENoaWxkQnlOYW1lKFwidGlwTG9zZVwiKS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgIGVsc2UgaWYoZGF0YSA9PSBcInJlbW92ZVwiKXtcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgaiA9MDsgajx0aGlzLnRpcF9BcnJheS5sZW5ndGg7IGorKyl7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IHRoaXMudGlwX0FycmF5W2pdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHRhcmdldCAhPSBudWxsKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpPTA7IGk8dGFyZ2V0Lmxlbmd0aDtpKyspe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGFyZ2V0W2ldKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbiA9IHRhcmdldFtpXS54KnRoaXMubWFwX0FycmF5WzBdLmxlbmd0aCt0YXJnZXRbaV0ueTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IHRoaXMuYmxvY2tfQXJyYXlbbl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5nZXRDaGlsZEJ5TmFtZShcInRpcFdpblwiKS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmdldENoaWxkQnlOYW1lKFwidGlwTG9zZVwiKS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMudGlwX0FycmF5ID0gW107XHJcbiAgICAgICAgICAgIH0gXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8v6I635Y+W5byV5a+85ZCN5a2XXHJcbiAgICBnZXRHdWlkZU5hbWUoKXtcclxuICAgICAgICB2YXIgbmFtZSA9IFwib25lXCI7XHJcbiAgICAgICAgc3dpdGNoKHRoaXMuc3RlcCl7XHJcbiAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgIG5hbWUgPSBcIm9uZVwiO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5idG5DbGljayA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iZ0NsaWNrID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gXCJ0d29cIjtcclxuICAgICAgICAgICAgICAgIHRoaXMuYnRuQ2xpY2sgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmdDbGljayA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAzOlxyXG4gICAgICAgICAgICAgICAgbmFtZSA9IFwidGhyZWVcIjtcclxuICAgICAgICAgICAgICAgIHRoaXMuYnRuQ2xpY2sgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmdDbGljayA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSA0OlxyXG4gICAgICAgICAgICAgICAgbmFtZSA9IFwiZm91clwiO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5idG5DbGljayA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iZ0NsaWNrID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIDU6XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gXCJmaXZlXCI7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJ0bkNsaWNrID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmdDbGljayA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgNjpcclxuICAgICAgICAgICAgICAgIG5hbWUgPSBcInNpeFwiO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5idG5DbGljayA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJnQ2xpY2sgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIDc6XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gXCJzZXZlblwiO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5idG5DbGljayA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iZ0NsaWNrID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIDg6XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gXCJlaWdodFwiO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5idG5DbGljayA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iZ0NsaWNrID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIDk6XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gXCJuaW5lXCI7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJ0bkNsaWNrID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJnQ2xpY2sgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgMTA6XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gXCJ0ZW5cIjtcclxuICAgICAgICAgICAgICAgIHRoaXMuYnRuQ2xpY2sgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iZ0NsaWNrID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAxMTpcclxuICAgICAgICAgICAgICAgIG5hbWUgPSBcImVsZXZlblwiO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5idG5DbGljayA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iZ0NsaWNrID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIDEyOlxyXG4gICAgICAgICAgICAgICAgbmFtZSA9IFwidHdlbHZlXCI7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJ0bkNsaWNrID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmdDbGljayA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgMTM6XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gXCJ0aGlydGVlblwiO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5idG5DbGljayA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJnQ2xpY2sgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIDE0OlxyXG4gICAgICAgICAgICAgICAgbmFtZSA9IFwiZm91cnRlZW5cIjtcclxuICAgICAgICAgICAgICAgIHRoaXMuYnRuQ2xpY2sgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iZ0NsaWNrID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAxNTpcclxuICAgICAgICAgICAgICAgIG5hbWUgPSBcImZpdmV0ZWVuXCI7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJ0bkNsaWNrID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmdDbGljayA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgMTY6XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gXCJzaXh0ZWVuXCI7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJ0bkNsaWNrID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmdDbGljayA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgMTc6XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gXCJsYXN0XCI7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJ0bkNsaWNrID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmdDbGljayA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbmFtZTtcclxuICAgIH1cclxuICAgIC8v5byV5a+85LiL5LiA5q2lXHJcbiAgICBndWlkZU5leHQoKXtcclxuICAgICAgICAvL+avj+asoeWFiOaKiuaJgOacieeahFxyXG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMuc3RlcCx0aGlzLkd1aWRlLmNoaWxkcmVuLmxlbmd0aCk7XHJcbiAgICAgICAgaWYodGhpcy5zdGVwICsgMSAgPT0gIHRoaXMuR3VpZGUuY2hpbGRyZW4ubGVuZ3RoKXtcclxuICAgICAgICAgICAgY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLmd1aWRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIC8vIGNjLmRpcmVjdG9yLmxvYWRTY2VuZShcIkdhbWVTY2VuZVwiKTtcclxuICAgICAgICAgICAgbGV0IG5hbWUgPSBjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8uZ2FtZUlkICsgXCJfZ3VpZGVcIjtcclxuICAgICAgICAgICAgY2MuZnguU3RvcmFnZU1lc3NhZ2Uuc2V0U3RvcmFnZShuYW1lLGNjLmZ4LkdhbWVDb25maWcuR01fSU5GTy5ndWlkZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHRoaXMuc3RlcCA+IDApIHRoaXMuR3VpZGUuY2hpbGRyZW5bdGhpcy5zdGVwLTFdLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc3RlcCArPSAxO1xyXG4gICAgICAgIGxldCBuYW1lID0gdGhpcy5nZXRHdWlkZU5hbWUoKTtcclxuICAgXHJcbiAgICAgICAgdmFyIHRhcmdldCA9IHRoaXMuR3VpZGUuZ2V0Q2hpbGRCeU5hbWUobmFtZSk7XHJcbiAgICAgICAgdGFyZ2V0LmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgbGV0IHNpemUgPSBjYy53aW5TaXplO1xyXG5cclxuICAgICAgICBpZihzaXplLmhlaWdodCA+IDEzMzQpe1xyXG4gICAgICAgICAgICBsZXQgaGVpZ2h0ID0gKHNpemUuaGVpZ2h0IC0gMTMzNCkvMjtcclxuICAgICAgICAgICAgdGFyZ2V0LmdldENoaWxkQnlOYW1lKFwic3BcIikuaGVpZ2h0ICs9IGhlaWdodDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25FbmFibGUgKCkge1xyXG4gICAgICAgIGNjLmZ4Lk5vdGlmaWNhdGlvbnMub24oY2MuZnguTWVzc2FnZS5jb250cm9sLCB0aGlzLmNsaWNrU3VuLCB0aGlzKTtcclxuICAgICAgICBjYy5meC5Ob3RpZmljYXRpb25zLm9uKGNjLmZ4Lk1lc3NhZ2UubmV4dCwgdGhpcy5ydW5Sb2FkLCB0aGlzKTtcclxuICAgICAgICBjYy5meC5Ob3RpZmljYXRpb25zLm9uKGNjLmZ4Lk1lc3NhZ2UubmV4dFdhdGVyLCB0aGlzLnJ1bldhdGVyLCB0aGlzKTtcclxuICAgICAgICBjYy5meC5Ob3RpZmljYXRpb25zLm9uKGNjLmZ4Lk1lc3NhZ2Uuc3RhcnRHYW1lLCB0aGlzLnN0YXJ0R2FtZSwgdGhpcyk7XHJcbiAgICAgICAgY2MuZnguTm90aWZpY2F0aW9ucy5vbihjYy5meC5NZXNzYWdlLmNoYW5nZVBhdGgsIHRoaXMuY2hhbmdlUGF0aCwgdGhpcyk7XHJcbiAgICAgICAgY2MuZnguTm90aWZpY2F0aW9ucy5vbihjYy5meC5NZXNzYWdlLnNldERhdGEsIHRoaXMuc2V0RGF0YSwgdGhpcyk7XHJcbiAgICAgICAgY2MuZnguTm90aWZpY2F0aW9ucy5vbihjYy5meC5NZXNzYWdlLmd1aWRlTmV4dCwgdGhpcy5ndWlkZU5leHQsIHRoaXMpO1xyXG4gICAgICAgIGNjLmZ4Lk5vdGlmaWNhdGlvbnMub24oY2MuZnguTWVzc2FnZS5zaG93UmVzdWx0LCB0aGlzLnNob3dSZXN1bHQsIHRoaXMpO1xyXG4gICAgICAgIGNjLmZ4Lk5vdGlmaWNhdGlvbnMub24oY2MuZnguTWVzc2FnZS5yZW1vdmVUaXAsIHRoaXMucmVtb3ZlVGlwLCB0aGlzKTtcclxuICAgIH1cclxuICAgIG9uRGlzYWJsZSAoKSB7XHJcbiAgICAgICAgY2MuZnguTm90aWZpY2F0aW9ucy5vZmYoY2MuZnguTWVzc2FnZS5jb250cm9sLCB0aGlzLmNsaWNrU3VuKTtcclxuICAgICAgICBjYy5meC5Ob3RpZmljYXRpb25zLm9mZihjYy5meC5NZXNzYWdlLm5leHQsIHRoaXMucnVuUm9hZCk7XHJcbiAgICAgICAgY2MuZnguTm90aWZpY2F0aW9ucy5vZmYoY2MuZnguTWVzc2FnZS5uZXh0V2F0ZXIsIHRoaXMucnVuV2F0ZXIpO1xyXG4gICAgICAgIGNjLmZ4Lk5vdGlmaWNhdGlvbnMub2ZmKGNjLmZ4Lk1lc3NhZ2Uuc3RhcnRHYW1lLCB0aGlzLnN0YXJ0R2FtZSk7XHJcbiAgICAgICAgY2MuZnguTm90aWZpY2F0aW9ucy5vZmYoY2MuZnguTWVzc2FnZS5jaGFuZ2VQYXRoLCB0aGlzLmNoYW5nZVBhdGgpO1xyXG4gICAgICAgIGNjLmZ4Lk5vdGlmaWNhdGlvbnMub2ZmKGNjLmZ4Lk1lc3NhZ2Uuc2V0RGF0YSwgdGhpcy5zZXREYXRhKTtcclxuICAgICAgICBjYy5meC5Ob3RpZmljYXRpb25zLm9mZihjYy5meC5NZXNzYWdlLmd1aWRlTmV4dCwgdGhpcy5ndWlkZU5leHQpO1xyXG4gICAgICAgIGNjLmZ4Lk5vdGlmaWNhdGlvbnMub2ZmKGNjLmZ4Lk1lc3NhZ2Uuc2hvd1Jlc3VsdCwgdGhpcy5zaG93UmVzdWx0KTtcclxuICAgICAgICBjYy5meC5Ob3RpZmljYXRpb25zLm9mZihjYy5meC5NZXNzYWdlLnJlbW92ZVRpcCwgdGhpcy5yZW1vdmVUaXApO1xyXG4gICAgfVxyXG4gICAgdXBkYXRlIChkdCkge1xyXG5cclxuICAgXHJcbiAgICB9XHJcbn1cclxuIl19