423 lines
53 KiB
JavaScript
423 lines
53 KiB
JavaScript
|
||
(function() {
|
||
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
||
var __module = nodeEnv ? module : {exports:{}};
|
||
var __filename = 'preview-scripts/assets/Script/module/Tool/GameTool.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, '43bfcJ6/25Fs4fHUE0PeBOX', 'GameTool');
|
||
// Script/module/Tool/GameTool.ts
|
||
|
||
"use strict";
|
||
Object.defineProperty(exports, "__esModule", { value: true });
|
||
exports.GameTool = void 0;
|
||
//最大工具类 各种公共方法,以及处理上传,获取后端接口数据
|
||
var GameTool = {
|
||
_startTime: 0,
|
||
_endTime: 0,
|
||
_totalTime: 0,
|
||
//获取userId
|
||
Authentication: function () {
|
||
var name = "user_" + cc.fx.GameConfig.GM_INFO.gameId;
|
||
var data = JSON.parse(localStorage.getItem(name));
|
||
if (data == "undifend" || data == null || data == "") {
|
||
var url = "https://api.sparkus.cn/api/user/auth/login?domain=hui32579WdYPsgYq&callback=" + location.href;
|
||
window.location.href = url;
|
||
}
|
||
else {
|
||
cc.fx.StorageMessage.setStorage(name, data);
|
||
cc.fx.GameConfig.GM_INFO.userId = parseInt(data.userId);
|
||
}
|
||
},
|
||
//埋点上传
|
||
setGameData: function () {
|
||
//GAME_DATA 初始化 每次清零
|
||
cc.fx.GameConfig.GAME_DATA = [];
|
||
cc.fx.GameConfig.GAME_DATA.push(cc.fx.GameConfig.CLICK_DATA);
|
||
cc.fx.GameConfig.CLICK_init();
|
||
var data = cc.fx.GameConfig.GAME_DATA;
|
||
var matchId = this.getMatchId();
|
||
var postData = {
|
||
"gameId": cc.fx.GameConfig.GM_INFO.gameId,
|
||
"userId": cc.fx.GameConfig.GM_INFO.userId,
|
||
"matchId": matchId,
|
||
"data": data
|
||
};
|
||
console.log("上传数据:", postData);
|
||
cc.fx.HttpUtil.uploadUserLogData(postData, function () { });
|
||
},
|
||
//上传排行榜 type为1
|
||
setRank: function (data) {
|
||
//GAME_DATA 初始化 每次清零
|
||
var postData = {
|
||
"gameId": cc.fx.GameConfig.GM_INFO.gameId,
|
||
"userId": cc.fx.GameConfig.GM_INFO.userId,
|
||
"type": 1,
|
||
"totleTimes": data.totleTimes,
|
||
"accuracy": data.accuracy,
|
||
"success": cc.fx.GameConfig.GM_INFO.success
|
||
};
|
||
cc.fx.HttpUtil.rankData(1, function () { }, postData);
|
||
},
|
||
//获取排行榜 type为2
|
||
getRank: function (data, callback) {
|
||
var rankLength = data.length;
|
||
var postData = {
|
||
"gameId": cc.fx.GameConfig.GM_INFO.gameId,
|
||
"userId": cc.fx.GameConfig.GM_INFO.userId,
|
||
"page": 1,
|
||
"pageSize": rankLength
|
||
};
|
||
//回调进getRankData
|
||
cc.fx.HttpUtil.rankData(2, function (data) { callback(data); }, postData);
|
||
},
|
||
//获取matchId 用于上传每次点击数据里面记录id方便查询
|
||
getMatchId: function () {
|
||
var matchId = cc.sys.localStorage.getItem("matchId");
|
||
var tempId = matchId;
|
||
if (matchId == "undifend" || matchId == null) {
|
||
matchId = this.setMatchId();
|
||
}
|
||
else {
|
||
if (this.containsNanana(matchId) == true) {
|
||
matchId = this.setMatchId();
|
||
}
|
||
else {
|
||
var char = parseInt(tempId.substring(10, tempId.length));
|
||
if (cc.fx.GameConfig.GM_INFO.level == 1) {
|
||
char += 1;
|
||
matchId = tempId.slice(0, 10) + char + "";
|
||
if (this.containsNanana(matchId))
|
||
matchId = this.setMatchId();
|
||
cc.fx.GameConfig.GM_INFO.matchId = matchId;
|
||
cc.sys.localStorage.setItem("matchId", matchId);
|
||
}
|
||
}
|
||
}
|
||
if (this.containsNanana(matchId) == true) {
|
||
matchId = this.setMatchId();
|
||
}
|
||
return matchId;
|
||
},
|
||
//检测matchId 如果有缓存以前的nanana数据清除
|
||
containsNanana: function (str) {
|
||
return /na/i.test(str);
|
||
},
|
||
//重新设置MatchId
|
||
setMatchId: function () {
|
||
// 定义包含可用字符的字符集
|
||
var characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
|
||
// 创建一个数组以保存随机字符
|
||
var uuidArray = [];
|
||
// 循环10次 生成10位的UUID
|
||
for (var i = 0; i < 10; i++) {
|
||
// 生成随机索引,范围是字符集的长度
|
||
var randomIndex = Math.floor(Math.random() * characters.length);
|
||
// 从字符集中获取随机字符
|
||
var randomChar = characters.charAt(randomIndex);
|
||
// 将字符添加到数组中
|
||
uuidArray.push(randomChar);
|
||
}
|
||
var data = uuidArray.join('') + 1 + "";
|
||
cc.sys.localStorage.setItem("matchNumber", 1);
|
||
cc.sys.localStorage.setItem("matchId", data);
|
||
cc.fx.GameConfig.GM_INFO.matchId = data;
|
||
return data;
|
||
},
|
||
//截取名字
|
||
subName: function (name, length) {
|
||
if (name.length > length) {
|
||
name = name.substring(0, length) + "...";
|
||
}
|
||
return name;
|
||
},
|
||
//设置头像
|
||
setPic: function (node, pic) {
|
||
node.active = false;
|
||
var url = pic;
|
||
setTimeout(function () {
|
||
fetch(url)
|
||
.then(function (response) {
|
||
return response.headers.get('Content-Length');
|
||
})
|
||
.then(function (errNo) {
|
||
if (errNo == "5093") {
|
||
node.active = true;
|
||
}
|
||
})
|
||
.catch(function (error) {
|
||
// console.error('Error fetching X-Info:', error);
|
||
});
|
||
}, 100);
|
||
cc.assetManager.loadRemote(url, { ext: '.png' }, function (err, texture) {
|
||
if (texture) {
|
||
node.active = true;
|
||
node.getComponent(cc.Sprite).spriteFrame = new cc.SpriteFrame(texture);
|
||
}
|
||
else {
|
||
// console.log(err,texture)
|
||
}
|
||
});
|
||
},
|
||
//第一个参数把目标带进来处理,第二个参数为名字长度,不同场景不同需求
|
||
//名字4短,小排行,名字6长,大排行
|
||
getRankData: function (data, target, nameLength) {
|
||
target.listData = data.data.list;
|
||
target.selfData = data.data.info;
|
||
var rankData = [];
|
||
var self = false;
|
||
cc.fx.GameTool.setPic(target.selfNode.getChildByName("pic").getChildByName("icon"), target.selfData.pic);
|
||
for (var i = 0; i <= target.listData.length - 1; i++) {
|
||
rankData.push({ rank: (i + 1), name: target.listData[i].nickName, total: target.listData[i].accuracy, time: target.listData[i].totleTimes, pic: target.listData[i].pic });
|
||
if (cc.fx.GameConfig.GM_INFO.userId == target.listData[i].userId) {
|
||
self = true;
|
||
target.rankNumber = i;
|
||
target.selfNode.getChildByName("rankLab").getComponent(cc.Label).string = (i + 1) + "";
|
||
}
|
||
if (i == (target.listData.length - 1) && self == false) {
|
||
target.rankNumber = i;
|
||
target.selfNode.getChildByName("rankLab").getComponent(cc.Label).string = "99+";
|
||
}
|
||
}
|
||
var name = cc.fx.GameTool.subName(target.selfData.nickName, nameLength);
|
||
target.selfNode.getChildByName("nameLab").getComponent(cc.Label).string = name;
|
||
target.selfNode.getChildByName("totalLab").getComponent(cc.Label).string = target.selfData.accuracy + "%";
|
||
var timeTemp = cc.fx.GameTool.getTimeShenNong(target.selfData.totleTimes);
|
||
target.selfNode.getChildByName("timeLab").getComponent(cc.Label).string = timeTemp + "";
|
||
switch (target.selfNode.getChildByName("rankLab").getComponent(cc.Label).string) {
|
||
case "1":
|
||
target.selfNode.getChildByName("rank").getChildByName("one").active = true;
|
||
break;
|
||
case "2":
|
||
target.selfNode.getChildByName("rank").getChildByName("two").active = true;
|
||
break;
|
||
case "3":
|
||
target.selfNode.getChildByName("rank").getChildByName("three").active = true;
|
||
break;
|
||
}
|
||
// 大排行
|
||
if (nameLength == 6) {
|
||
target.rankList.setData(rankData);
|
||
target.selfNode.opacity = 255;
|
||
if (target.selfData.totalSunCount == 0)
|
||
target.selfNode.opacity = 0;
|
||
}
|
||
},
|
||
getSeedRandom: function (min, max) {
|
||
console.log("随机数:", cc.fx.GameConfig.GM_INFO.currSeed);
|
||
max = max || 1;
|
||
min = min || 0;
|
||
cc.fx.GameConfig.GM_INFO.currSeed = (cc.fx.GameConfig.GM_INFO.currSeed * 9301 + 49297) % 233280;
|
||
var rnd = cc.fx.GameConfig.GM_INFO.currSeed / 233280.0;
|
||
var tmp = min + rnd * (max - min);
|
||
return parseInt(tmp);
|
||
},
|
||
//获取关卡配置的那个关卡数
|
||
getCustom: function (type) {
|
||
var custom = cc.fx.StorageMessage.getStorage(cc.fx.storageType.storageTypeCustom);
|
||
if (custom == "undifend" || custom == null || custom == "") {
|
||
this.setCustom();
|
||
}
|
||
else {
|
||
cc.fx.GameConfig.GM_INFO_SET("custom", custom[0]);
|
||
if (custom[0] != 0 || type == true) {
|
||
custom.shift();
|
||
if (custom.length == 0) {
|
||
this.setCustom();
|
||
}
|
||
else
|
||
cc.fx.StorageMessage.setStorage(cc.fx.storageType.storageTypeCustom, custom);
|
||
}
|
||
}
|
||
},
|
||
//本地没有存储到配置,或者配置用完,重新创建配置
|
||
setCustom: function () {
|
||
var arrayLength = cc.fx.GameConfig.LEVEL_INFO.length;
|
||
var arrayList = [];
|
||
for (var i = 1; i < arrayLength; i++) {
|
||
arrayList.push(i);
|
||
}
|
||
arrayList.sort(function () { return Math.random() - 0.5; });
|
||
arrayList.unshift(0);
|
||
cc.fx.GameConfig.GM_INFO_SET("custom", arrayList[0]);
|
||
cc.fx.StorageMessage.setStorage(cc.fx.storageType.storageTypeCustom, arrayList);
|
||
},
|
||
getFoodName: function (food) {
|
||
var name = "葡萄";
|
||
switch (food) {
|
||
case "baishao":
|
||
name = "白芍";
|
||
break;
|
||
case "jingjie":
|
||
name = "荆芥";
|
||
break;
|
||
case "renshen":
|
||
name = "人参";
|
||
break;
|
||
case "danshen":
|
||
name = "丹参";
|
||
break;
|
||
case "danggui":
|
||
name = "当归";
|
||
break;
|
||
case "gouqi":
|
||
name = "枸杞";
|
||
break;
|
||
case "mudan":
|
||
name = "牡丹";
|
||
break;
|
||
case "mulan":
|
||
name = "木兰";
|
||
break;
|
||
case "pugongying":
|
||
name = "蒲公英";
|
||
break;
|
||
case "moli":
|
||
name = "茉莉";
|
||
break;
|
||
case "jinju":
|
||
name = "金桔";
|
||
break;
|
||
case "dazao":
|
||
name = "大枣";
|
||
break;
|
||
case "lizi":
|
||
name = "李子";
|
||
break;
|
||
case "lizhi":
|
||
name = "荔枝";
|
||
break;
|
||
case "taozi":
|
||
name = "桃子";
|
||
break;
|
||
case "putao":
|
||
name = "葡萄";
|
||
break;
|
||
case "muchai":
|
||
name = "木柴";
|
||
break;
|
||
case "ganjiang":
|
||
name = "干姜";
|
||
break;
|
||
case "zhuye":
|
||
name = "竹叶";
|
||
break;
|
||
case "longyan":
|
||
name = "龙眼";
|
||
break;
|
||
case "chixiaodou":
|
||
name = "赤小豆";
|
||
break;
|
||
case "gancao":
|
||
name = "甘草";
|
||
break;
|
||
case "cha":
|
||
name = "茶";
|
||
break;
|
||
}
|
||
return name;
|
||
},
|
||
getSetScreenResolutionFlag: function () {
|
||
var size = cc.winSize;
|
||
var width = size.width;
|
||
var height = size.height;
|
||
if ((height / width) > (16.2 / 9))
|
||
return false;
|
||
return true;
|
||
},
|
||
//判断全面屏适配
|
||
setFit: function (canvas) {
|
||
var flag = cc.fx.GameTool.getSetScreenResolutionFlag();
|
||
if (flag) {
|
||
// console.log("不是全面屏");
|
||
}
|
||
else {
|
||
// console.log("是全面屏");
|
||
}
|
||
return flag;
|
||
},
|
||
//获取游戏信息
|
||
getGameInfo: function (node) {
|
||
var jg = false;
|
||
return jg;
|
||
},
|
||
//设置游戏信息
|
||
setGameInfo: function (pd) {
|
||
},
|
||
//打字机效果
|
||
typingAni: function (label, text, cb, target) {
|
||
var self = target;
|
||
var html = '';
|
||
var arr = text.split('');
|
||
var len = arr.length;
|
||
var step = 0;
|
||
self.func = function () {
|
||
html += arr[step];
|
||
label.string = html;
|
||
if (++step == len) {
|
||
self.unschedule(self.func);
|
||
cb && cb();
|
||
}
|
||
};
|
||
self.schedule(self.func, 0.1, cc.macro.REPEAT_FOREVER, 0);
|
||
},
|
||
//输入秒,返回需要展示时间格式
|
||
getTimeMargin: function (second) {
|
||
var total = 0;
|
||
total = second;
|
||
var hour = 0;
|
||
hour = parseInt((total / 3600) + ""); //计算整数小时数
|
||
var afterHour = total - hour * 60 * 60; //取得算出小时数后剩余的秒数
|
||
var min = parseInt((afterHour / 60) + ""); //计算整数分
|
||
var m = "" + min;
|
||
if (min < 10)
|
||
m = "0" + min;
|
||
var afterMin = total - hour * 60 * 60 - min * 60; //取得算出分后剩余的秒数
|
||
var miao = afterMin + "";
|
||
if (afterMin < 10)
|
||
miao = "0" + afterMin;
|
||
return m + ':' + miao;
|
||
},
|
||
//输入秒,返回需要展示时间格式
|
||
getTimeShenNong: function (second) {
|
||
second = parseInt(second / 1000 + "");
|
||
var total = 0;
|
||
total = second;
|
||
var min = 0;
|
||
if (total > 60) {
|
||
min = parseInt((total / 60) + ""); //计算整数分
|
||
}
|
||
var m = min + "'";
|
||
var afterMin = total - min * 60; //取得算出分后剩余的秒数
|
||
var miao = afterMin + "''";
|
||
return m + miao;
|
||
},
|
||
//获取时间戳
|
||
getTime: function () {
|
||
var timestamp = new Date().getTime();
|
||
return timestamp;
|
||
},
|
||
pushLister: function () {
|
||
},
|
||
removeAllLister: function () {
|
||
},
|
||
};
|
||
exports.GameTool = GameTool;
|
||
|
||
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0XFxtb2R1bGVcXFRvb2xcXEdhbWVUb29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLCtCQUErQjtBQUMvQixJQUFJLFFBQVEsR0FBRztJQUNYLFVBQVUsRUFBRSxDQUFDO0lBQ2IsUUFBUSxFQUFFLENBQUM7SUFDWCxVQUFVLEVBQUUsQ0FBQztJQUNiLFVBQVU7SUFDVixjQUFjO1FBQ1YsSUFBSSxJQUFJLEdBQUcsT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDckQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbEQsSUFBRyxJQUFJLElBQUksVUFBVSxJQUFJLElBQUksSUFBRSxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUUsRUFBQztZQUM5QyxJQUFJLEdBQUcsR0FBRyw4RUFBOEUsR0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ3ZHLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztTQUM5QjthQUNHO1lBQ0EsRUFBRSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksRUFBQyxJQUFJLENBQUMsQ0FBQztZQUMzQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDM0Q7SUFDTCxDQUFDO0lBRUQsTUFBTTtJQUNOLFdBQVc7UUFDUCxvQkFBb0I7UUFDcEIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNoQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFF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QUFHLEdBQUcsSUFBSSxDQUFBO0lBQ3pCLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsZUFBZSxFQUFDLFVBQUMsTUFBTTtRQUNuQixNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sR0FBQyxJQUFJLEdBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsS0FBSyxHQUFHLE1BQU0sQ0FBQztRQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNaLElBQUcsS0FBSyxHQUFHLEVBQUUsRUFBQztZQUNWLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQSxPQUFPO1NBQzFDO1FBQ0QsSUFBSSxDQUFDLEdBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUVuQixJQUFJLFFBQVEsR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFBLGFBQWE7UUFDN0MsSUFBSSxJQUFJLEdBQUcsUUFBUSxHQUFHLElBQUksQ0FBQztRQUMzQixPQUFPLENBQUMsR0FBRyxJQUFJLENBQUE7SUFDbkIsQ0FBQztJQUVELE9BQU87SUFDUCxPQUFPO1FBQ0gsSUFBTSxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN2QyxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBQ0QsVUFBVSxFQUFDO0lBRVgsQ0FBQztJQUNELGVBQWUsRUFBQztJQUVoQixDQUFDO0NBRUosQ0FBQztBQUNPLDRCQUFRIiwiZmlsZSI6IiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbi8v5pyA5aSn5bel5YW357G7ICDlkITnp43lhazlhbHmlrnms5XvvIzku6Xlj4rlpITnkIbkuIrkvKDvvIzojrflj5blkI7nq6/mjqXlj6PmlbDmja5cclxudmFyIEdhbWVUb29sID0ge1xyXG4gICAgX3N0YXJ0VGltZTogMCxcclxuICAgIF9lbmRUaW1lOiAwLFxyXG4gICAgX3RvdGFsVGltZTogMCxcclxuICAgIC8v6I635Y+WdXNlcklkXHJcbiAgICBBdXRoZW50aWNhdGlvbigpe1xyXG4gICAgICAgIGxldCBuYW1lID0gXCJ1c2VyX1wiICsgY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLmdhbWVJZDtcclxuICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSkpO1xyXG4gICAgICAgIGlmKGRhdGEgPT0gXCJ1bmRpZmVuZFwiIHx8IGRhdGE9PW51bGwgfHwgZGF0YSA9PSBcIlwiKXtcclxuICAgICAgICAgICAgbGV0IHVybCA9IFwiaHR0cHM6Ly9hcGkuc3Bhcmt1cy5jbi9hcGkvdXNlci9hdXRoL2xvZ2luP2RvbWFpbj1odWkzMjU3OVdkWVBzZ1lxJmNhbGxiYWNrPVwiK2xvY2F0aW9uLmhyZWY7XHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICBjYy5meC5TdG9yYWdlTWVzc2FnZS5zZXRTdG9yYWdlKG5hbWUsZGF0YSk7XHJcbiAgICAgICAgICAgIGNjLmZ4LkdhbWVDb25maWcuR01fSU5GTy51c2VySWQgPSBwYXJzZUludChkYXRhLnVzZXJJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvL+Wfi+eCueS4iuS8oFxyXG4gICAgc2V0R2FtZURhdGEoKXtcclxuICAgICAgICAvL0dBTUVfREFUQSDliJ3lp4vljJYg5q+P5qyh5riF6Zu2XHJcbiAgICAgICAgY2MuZnguR2FtZUNvbmZpZy5HQU1FX0RBVEEgPSBbXTtcclxuICAgICAgICBjYy5meC5HYW1lQ29uZmlnLkdBTUVfREFUQS5wdXNoKGNjLmZ4LkdhbWVDb25maWcuQ0xJQ0tfREFUQSk7XHJcbiAgICAgICAgY2MuZnguR2FtZUNvbmZpZy5DTElDS19pbml0KCk7XHJcbiAgICAgICAgbGV0IGRhdGEgPSBjYy5meC5HYW1lQ29uZmlnLkdBTUVfREFUQTtcclxuICAgICAgICBsZXQgbWF0Y2hJZCA9IHRoaXMuZ2V0TWF0Y2hJZCgpO1xyXG4gICAgICAgIGxldCBwb3N0RGF0YSA9IHtcclxuICAgICAgICAgICAgXCJnYW1lSWRcIjpjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8uZ2FtZUlkLFxyXG4gICAgICAgICAgICBcInVzZXJJZFwiOmNjLmZ4LkdhbWVDb25maWcuR01fSU5GTy51c2VySWQsXHJcbiAgICAgICAgICAgIFwibWF0Y2hJZFwiOm1hdGNoSWQsXHJcbiAgICAgICAgICAgIFwiZGF0YVwiOiBkYXRhXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coXCLkuIrkvKDmlbDmja46XCIscG9zdERhdGEpO1xyXG4gICAgICAgIGNjLmZ4Lkh0dHBVdGlsLnVwbG9hZFVzZXJMb2dEYXRhKHBvc3REYXRhLGZ1bmN0aW9uKCl7fSlcclxuICAgIH0sXHJcbiAgICAvL+S4iuS8oOaOkuihjOamnCAgdHlwZeS4ujFcclxuICAgIHNldFJhbmsoZGF0YSl7XHJcbiAgICAgICAgLy9HQU1FX0RBVEEg5Yid5aeL5YyWIOavj+asoea4hembtlxyXG4gICAgICAgIGxldCBwb3N0RGF0YSA9IHtcclxuICAgICAgICAgICAgXCJnYW1lSWRcIjpjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8uZ2FtZUlkLFxyXG4gICAgICAgICAgICBcInVzZXJJZFwiOmNjLmZ4LkdhbWVDb25maWcuR01fSU5GTy51c2VySWQsXHJcbiAgICAgICAgICAgIFwidHlwZVwiOjEsXHJcbiAgICAgICAgICAgIFwidG90bGVUaW1lc1wiOiBkYXRhLnRvdGxlVGltZXMsXHJcbiAgICAgICAgICAgIFwiYWNjdXJhY3lcIjogZGF0YS5hY2N1cmFjeSxcclxuICAgICAgICAgICAgXCJzdWNjZXNzXCI6IGNjLmZ4LkdhbWVDb25maWcuR01fSU5GTy5zdWNjZXNzXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjYy5meC5IdHRwVXRpbC5yYW5rRGF0YSgxLGZ1bmN0aW9uKCl7fSxwb3N0RGF0YSk7XHJcbiAgICB9LFxyXG4gICAgLy/ojrflj5bmjpLooYzmppwgdHlwZeS4ujJcclxuICAgIGdldFJhbmsoZGF0YSxjYWxsYmFjayl7XHJcbiAgICAgICAgbGV0IHJhbmtMZW5ndGggPSBkYXRhLmxlbmd0aDtcclxuICAgICAgICBsZXQgcG9zdERhdGEgPSB7XHJcbiAgICAgICAgICAgIFwiZ2FtZUlkXCI6Y2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLmdhbWVJZCxcclxuICAgICAgICAgICAgXCJ1c2VySWRcIjpjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8udXNlcklkLFxyXG4gICAgICAgICAgICBcInBhZ2VcIjoxLFxyXG4gICAgICAgICAgICBcInBhZ2VTaXplXCI6cmFua0xlbmd0aFxyXG4gICAgICAgIH07IFxyXG4gICAgICAgIC8v5Zue6LCD6L+bZ2V0UmFua0RhdGFcclxuICAgICAgICBjYy5meC5IdHRwVXRpbC5yYW5rRGF0YSgyLGRhdGEgPT57Y2FsbGJhY2soZGF0YSl9LHBvc3REYXRhKTtcclxuICAgIH0sXHJcbiAgICAvL+iOt+WPlm1hdGNoSWQgIOeUqOS6juS4iuS8oOavj+asoeeCueWHu+aVsOaNrumHjOmdouiusOW9lWlk5pa55L6/5p+l6K+iXHJcbiAgICBnZXRNYXRjaElkICgpe1xyXG4gICAgICAgIGxldCBtYXRjaElkID0gY2Muc3lzLmxvY2FsU3RvcmFnZS5nZXRJdGVtKFwibWF0Y2hJZFwiKTtcclxuICAgICAgICBsZXQgdGVtcElkID0gbWF0Y2hJZDtcclxuICAgICAgICBpZihtYXRjaElkID09IFwidW5kaWZlbmRcIiB8fCBtYXRjaElkPT1udWxsKXtcclxuICAgICAgICAgICAgbWF0Y2hJZCA9ICB0aGlzLnNldE1hdGNoSWQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgaWYodGhpcy5jb250YWluc05hbmFuYShtYXRjaElkKSA9PSB0cnVlKXtcclxuICAgICAgICAgICAgICAgIG1hdGNoSWQgPSAgdGhpcy5zZXRNYXRjaElkKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgIGxldCBjaGFyID0gcGFyc2VJbnQodGVtcElkLnN1YnN0cmluZygxMCx0ZW1wSWQubGVuZ3RoKSk7XHJcbiAgICAgICAgICAgICAgICBpZihjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8ubGV2ZWwgPT0gMSl7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hhciArPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoSWQgID0gdGVtcElkLnNsaWNlKDAsIDEwKSArIGNoYXIgKyBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuY29udGFpbnNOYW5hbmEobWF0Y2hJZCkpIG1hdGNoSWQgPSB0aGlzLnNldE1hdGNoSWQoKTtcclxuICAgICAgICAgICAgICAgICAgICBjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8ubWF0Y2hJZCA9IG1hdGNoSWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY2Muc3lzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKFwibWF0Y2hJZFwiLG1hdGNoSWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZih0aGlzLmNvbnRhaW5zTmFuYW5hKG1hdGNoSWQpID09IHRydWUpe1xyXG4gICAgICAgICAgICBtYXRjaElkID0gIHRoaXMuc2V0TWF0Y2hJZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbWF0Y2hJZDtcclxuICAgIH0sXHJcbiAgICAvL+ajgOa1i21hdGNoSWQg5aaC5p6c5pyJ57yT5a2Y5Lul5YmN55qEbmFuYW5h5pWw5o2u5riF6ZmkXHJcbiAgICBjb250YWluc05hbmFuYShzdHIpIHtcclxuICAgICAgICByZXR1cm4gL25hL2kudGVzdChzdHIpO1xyXG4gICAgfSxcclxuICAgIC8v6YeN5paw6K6+572uTWF0Y2hJZFxyXG4gICAgc2V0TWF0Y2hJZCAoKXtcclxuICAgICAgICAvLyDlrprkuYnljIXlkKvlj6/nlKjlrZfnrKbnmoTlrZfnrKbpm4ZcclxuICAgICAgICBjb25zdCBjaGFyYWN0ZXJzID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5JztcclxuICAgICAgICAvLyDliJvlu7rkuIDkuKrmlbDnu4Tku6Xkv53lrZjpmo/mnLrlrZfnrKZcclxuICAgICAgICBjb25zdCB1dWlkQXJyYXkgPSBbXTtcclxuICAgICAgICAvLyDlvqrnjq8xMOasoSDnlJ/miJAxMOS9jeeahFVVSURcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIC8vIOeUn+aIkOmaj+acuue0ouW8le+8jOiMg+WbtOaYr+Wtl+espumbhueahOmVv+W6plxyXG4gICAgICAgICAgICBjb25zdCByYW5kb21JbmRleCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJhY3RlcnMubGVuZ3RoKTtcclxuICAgICAgICAgICAgLy8g5LuO5a2X56ym6ZuG5Lit6I635Y+W6ZqP5py65a2X56ymXHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmRvbUNoYXIgPSBjaGFyYWN0ZXJzLmNoYXJBdChyYW5kb21JbmRleCk7XHJcbiAgICAgICAgICAgIC8vIOWwhuWtl+espua3u+WKoOWIsOaVsOe7hOS4rVxyXG4gICAgICAgICAgICB1dWlkQXJyYXkucHVzaChyYW5kb21DaGFyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGRhdGEgPSAgdXVpZEFycmF5LmpvaW4oJycpICsgMSArIFwiXCI7XHJcbiAgICAgICAgY2Muc3lzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKFwibWF0Y2hOdW1iZXJcIiwxKTtcclxuICAgICAgICBjYy5zeXMubG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJtYXRjaElkXCIsZGF0YSk7XHJcbiAgICAgICAgY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLm1hdGNoSWQgPSBkYXRhO1xyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfSxcclxuICAgIC8v5oiq5Y+W5ZCN5a2XXHJcbiAgICBzdWJOYW1lKG5hbWUsbGVuZ3RoKXtcclxuICAgICAgICBpZihuYW1lLmxlbmd0aCA+IGxlbmd0aCl7XHJcbiAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLGxlbmd0aCkgKyBcIi4uLlwiXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuYW1lO1xyXG4gICAgfSxcclxuICAgIC8v6K6+572u5aS05YOPXHJcbiAgICBzZXRQaWMobm9kZSxwaWMpe1xyXG4gICAgICAgIG5vZGUuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IHVybCA9IHBpYztcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgZmV0Y2godXJsKVxyXG4gICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtTGVuZ3RoJyk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC50aGVuKGVyck5vID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKGVyck5vID09IFwiNTA5M1wiKXtcclxuICAgICAgICAgICAgICAgICAgICBub2RlLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBYLUluZm86JywgZXJyb3IpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgIGNjLmFzc2V0TWFuYWdlci5sb2FkUmVtb3RlKHVybCwge2V4dDonLnBuZyd9LChlcnIsIHRleHR1cmU6Y2MuVGV4dHVyZTJEKSA9PiB7XHJcbiAgICAgICAgICAgIGlmKHRleHR1cmUpe1xyXG4gICAgICAgICAgICAgICAgbm9kZS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgbm9kZS5nZXRDb21wb25lbnQoY2MuU3ByaXRlKS5zcHJpdGVGcmFtZSA9IG5ldyBjYy5TcHJpdGVGcmFtZSh0ZXh0dXJlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZXJyLHRleHR1cmUpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgfSxcclxuICAgIC8v56ys5LiA5Liq5Y+C5pWw5oqK55uu5qCH5bim6L+b5p2l5aSE55CG77yM56ys5LqM5Liq5Y+C5pWw5Li65ZCN5a2X6ZW/5bqm77yM5LiN5ZCM5Zy65pmv5LiN5ZCM6ZyA5rGCXHJcbiAgICAvL+WQjeWtlzTnn63vvIzlsI/mjpLooYzvvIzlkI3lrZc26ZW/77yM5aSn5o6S6KGMXHJcbiAgICBnZXRSYW5rRGF0YShkYXRhLHRhcmdldCxuYW1lTGVuZ3RoKXtcclxuICAgICAgICB0YXJnZXQubGlzdERhdGEgPSBkYXRhLmRhdGEubGlzdDtcclxuICAgICAgICB0YXJnZXQuc2VsZkRhdGEgPSBkYXRhLmRhdGEuaW5mbztcclxuICAgICAgICBsZXQgcmFua0RhdGEgPSBbXTtcclxuICAgICAgICBsZXQgc2VsZiA9IGZhbHNlO1xyXG4gICAgICAgICBjYy5meC5HYW1lVG9vbC5zZXRQaWModGFyZ2V0LnNlbGZOb2RlLmdldENoaWxkQnlOYW1lKFwicGljXCIpLmdldENoaWxkQnlOYW1lKFwiaWNvblwiKSx0YXJnZXQuc2VsZkRhdGEucGljKTtcclxuICAgICAgICBmb3IobGV0IGk9MDtpPD10YXJnZXQubGlzdERhdGEubGVuZ3RoLTE7aSsrKXtcclxuICAgICAgICAgICAgcmFua0RhdGEucHVzaCh7cmFuazooaSsxKSwgbmFtZTp0YXJnZXQubGlzdERhdGFbaV0ubmlja05hbWUsIHRvdGFsOnRhcmdldC5saXN0RGF0YVtpXS5hY2N1cmFjeSx0aW1lOnRhcmdldC5saXN0RGF0YVtpXS50b3RsZVRpbWVzLCBwaWM6dGFyZ2V0Lmxpc3REYXRhW2ldLnBpY30pO1xyXG4gICAgICAgICAgICBpZihjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8udXNlcklkID09IHRhcmdldC5saXN0RGF0YVtpXS51c2VySWQpe1xyXG4gICAgICAgICAgICAgICAgc2VsZiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXQucmFua051bWJlciA9IGk7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXQuc2VsZk5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJyYW5rTGFiXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCkuc3RyaW5nID0oaSsxKSArIFwiXCI7IFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKGkgPT0gKHRhcmdldC5saXN0RGF0YS5sZW5ndGgtMSkgJiYgc2VsZiA9PSBmYWxzZSl7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXQucmFua051bWJlciA9IGk7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXQuc2VsZk5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJyYW5rTGFiXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCkuc3RyaW5nID0gXCI5OStcIjsgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IG5hbWUgPSBjYy5meC5HYW1lVG9vbC5zdWJOYW1lKHRhcmdldC5zZWxmRGF0YS5uaWNrTmFtZSxuYW1lTGVuZ3RoKTtcclxuICAgICAgICB0YXJnZXQuc2VsZk5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJuYW1lTGFiXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCkuc3RyaW5nID0gbmFtZTtcclxuICAgICAgICB0YXJnZXQuc2VsZk5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJ0b3RhbExhYlwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpLnN0cmluZyA9IHRhcmdldC5zZWxmRGF0YS5hY2N1cmFjeSArIFwiJVwiO1xyXG4gICAgICAgIGxldCB0aW1lVGVtcCA9IGNjLmZ4LkdhbWVUb29sLmdldFRpbWVTaGVuTm9uZyh0YXJnZXQuc2VsZkRhdGEudG90bGVUaW1lcyk7XHJcbiAgICAgICAgdGFyZ2V0LnNlbGZOb2RlLmdldENoaWxkQnlOYW1lKFwidGltZUxhYlwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpLnN0cmluZyA9IHRpbWVUZW1wICsgXCJcIjtcclxuICAgICAgICBzd2l0Y2godGFyZ2V0LnNlbGZOb2RlLmdldENoaWxkQnlOYW1lKFwicmFua0xhYlwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpLnN0cmluZyl7XHJcbiAgICAgICAgICAgIGNhc2UgXCIxXCI6XHJcbiAgICAgICAgICAgICAgICB0YXJnZXQuc2VsZk5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJyYW5rXCIpLmdldENoaWxkQnlOYW1lKFwib25lXCIpLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIjJcIjpcclxuICAgICAgICAgICAgICAgIHRhcmdldC5zZWxmTm9kZS5nZXRDaGlsZEJ5TmFtZShcInJhbmtcIikuZ2V0Q2hpbGRCeU5hbWUoXCJ0d29cIikuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiM1wiOlxyXG4gICAgICAgICAgICAgICAgdGFyZ2V0LnNlbGZOb2RlLmdldENoaWxkQnlOYW1lKFwicmFua1wiKS5nZXRDaGlsZEJ5TmFtZShcInRocmVlXCIpLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8g5aSn5o6S6KGMXHJcbiAgICAgICAgaWYobmFtZUxlbmd0aCA9PSA2KXtcclxuICAgICAgICAgICAgdGFyZ2V0LnJhbmtMaXN0LnNldERhdGEocmFua0RhdGEpO1xyXG4gICAgICAgICAgICB0YXJnZXQuc2VsZk5vZGUub3BhY2l0eSA9IDI1NTtcclxuICAgICAgICAgICAgaWYodGFyZ2V0LnNlbGZEYXRhLnRvdGFsU3VuQ291bnQgPT0gMCkgdGFyZ2V0LnNlbGZOb2RlLm9wYWNpdHkgPSAwO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgZ2V0U2VlZFJhbmRvbTogZnVuY3Rpb24gKG1pbiwgbWF4KSB7Ly/ljIXlkKttaW4g5LiN5YyF5ZCrbWF4XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLpmo/mnLrmlbA6XCIsY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLmN1cnJTZWVkKTtcclxuICAgICAgICBtYXggPSBtYXggfHwgMTtcclxuICAgICAgICBtaW4gPSBtaW4gfHwgMDtcclxuICAgICAgICBjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8uY3VyclNlZWQgPSAoY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLmN1cnJTZWVkICogOTMwMSArIDQ5Mjk3KSAlIDIzMzI4MDtcclxuICAgICAgICBsZXQgcm5kID0gY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLmN1cnJTZWVkICAvIDIzMzI4MC4wO1xyXG4gICAgICAgIGxldCB0bXAgPSBtaW4gKyBybmQgKiAobWF4IC0gbWluKTtcclxuICAgICAgICByZXR1cm4gcGFyc2VJbnQodG1wKTtcclxuICAgIH0sXHJcbiAgICAvL+iOt+WPluWFs+WNoemFjee9rueahOmCo+S4quWFs+WNoeaVsFxyXG4gICAgZ2V0Q3VzdG9tKHR5cGUpe1xyXG4gICAgICAgIGxldCBjdXN0b20gPSBjYy5meC5TdG9yYWdlTWVzc2FnZS5nZXRTdG9yYWdlKGNjLmZ4LnN0b3JhZ2VUeXBlLnN0b3JhZ2VUeXBlQ3VzdG9tKTtcclxuICAgICAgICBpZihjdXN0b20gPT0gXCJ1bmRpZmVuZFwiIHx8IGN1c3RvbT09bnVsbCB8fCBjdXN0b20gPT0gXCJcIil7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0Q3VzdG9tKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIGNjLmZ4LkdhbWVDb25maWcuR01fSU5GT19TRVQoXCJjdXN0b21cIixjdXN0b21bMF0pO1xyXG4gICAgICAgICAgICBpZihjdXN0b21bMF0gIT0gMCB8fCB0eXBlID09ICB0cnVlKXtcclxuICAgICAgICAgICAgICAgIGN1c3RvbS5zaGlmdCgpO1xyXG4gICAgICAgICAgICAgICAgaWYoY3VzdG9tLmxlbmd0aCA9PSAwKXtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEN1c3RvbSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBjYy5meC5TdG9yYWdlTWVzc2FnZS5zZXRTdG9yYWdlKGNjLmZ4LnN0b3JhZ2VUeXBlLnN0b3JhZ2VUeXBlQ3VzdG9tLGN1c3RvbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgLy/mnKzlnLDmsqHmnInlrZjlgqjliLDphY3nva7vvIzmiJbogIXphY3nva7nlKjlrozvvIzph43mlrDliJvlu7rphY3nva5cclxuICAgIHNldEN1c3RvbSgpe1xyXG4gICAgICAgIGxldCBhcnJheUxlbmd0aCA9IGNjLmZ4LkdhbWVDb25maWcuTEVWRUxfSU5GTy5sZW5ndGg7XHJcbiAgICAgICAgbGV0IGFycmF5TGlzdCA9IFtdO1xyXG4gICAgICAgIGZvcihsZXQgaT0xOyBpPGFycmF5TGVuZ3RoO2krKyl7XHJcbiAgICAgICAgICAgIGFycmF5TGlzdC5wdXNoKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhcnJheUxpc3Quc29ydCgoKSA9PiBNYXRoLnJhbmRvbSgpIC0gMC41KTtcclxuICAgICAgICBhcnJheUxpc3QudW5zaGlmdCgwKVxyXG4gICAgICAgIGNjLmZ4LkdhbWVDb25maWcuR01fSU5GT19TRVQoXCJjdXN0b21cIixhcnJheUxpc3RbMF0pO1xyXG4gICAgICAgIGNjLmZ4LlN0b3JhZ2VNZXNzYWdlLnNldFN0b3JhZ2UoY2MuZnguc3RvcmFnZVR5cGUuc3RvcmFnZVR5cGVDdXN0b20sYXJyYXlMaXN0KTtcclxuICAgIH0sXHJcblxyXG4gICAgZ2V0Rm9vZE5hbWUoZm9vZCl7XHJcbiAgICAgICAgdmFyIG5hbWUgPSBcIuiRoeiQhFwiO1xyXG4gICAgICAgIHN3aXRjaChmb29kKXtcclxuICAgICAgICAgICAgY2FzZSBcImJhaXNoYW9cIjpcclxuICAgICAgICAgICAgICAgIG5hbWUgPSBcIueZveiKjVwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJqaW5namllXCI6XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gXCLojYboiqVcIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwicmVuc2hlblwiOlxyXG4gICAgICAgICAgICAgICAgbmFtZSA9IFwi5Lq65Y+CXCI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcImRhbnNoZW5cIjpcclxuICAgICAgICAgICAgICAgIG5hbWUgPSBcIuS4ueWPglwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJkYW5nZ3VpXCI6XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gXCLlvZPlvZJcIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiZ291cWlcIjpcclxuICAgICAgICAgICAgICAgIG5hbWUgPSBcIuaeuOadnlwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJtdWRhblwiOlxyXG4gICAgICAgICAgICAgICAgbmFtZSA9IFwi54mh5Li5XCI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIm11bGFuXCI6XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gXCLmnKjlhbBcIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwicHVnb25neWluZ1wiOlxyXG4gICAgICAgICAgICAgICAgbmFtZSA9IFwi6JKy5YWs6IuxXCI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIm1vbGlcIjpcclxuICAgICAgICAgICAgICAgIG5hbWUgPSBcIuiMieiOiVwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJqaW5qdVwiOlxyXG4gICAgICAgICAgICAgICAgbmFtZSA9IFwi6YeR5qGUXCI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcImRhemFvXCI6XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gXCLlpKfmnqNcIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwibGl6aVwiOlxyXG4gICAgICAgICAgICAgICAgbmFtZSA9IFwi5p2O5a2QXCI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcImxpemhpXCI6XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gXCLojZTmnp1cIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwidGFvemlcIjpcclxuICAgICAgICAgICAgICAgIG5hbWUgPSBcIuahg+WtkFwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwicHV0YW9cIjpcclxuICAgICAgICAgICAgICAgIG5hbWUgPSBcIuiRoeiQhFwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJtdWNoYWlcIjpcclxuICAgICAgICAgICAgICAgIG5hbWUgPSBcIuacqOaftFwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJnYW5qaWFuZ1wiOlxyXG4gICAgICAgICAgICAgICAgbmFtZSA9IFwi5bmy5aecXCI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcInpodXllXCI6XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gXCLnq7nlj7ZcIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwibG9uZ3lhblwiOlxyXG4gICAgICAgICAgICAgICAgbmFtZSA9IFwi6b6Z55y8XCI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcImNoaXhpYW9kb3VcIjpcclxuICAgICAgICAgICAgICAgIG5hbWUgPSBcIui1pOWwj+ixhlwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJnYW5jYW9cIjpcclxuICAgICAgICAgICAgICAgIG5hbWUgPSBcIueUmOiNiVwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJjaGFcIjpcclxuICAgICAgICAgICAgICAgIG5hbWUgPSBcIuiMtlwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuYW1lO1xyXG4gICAgfSxcclxuXHJcbiAgICBnZXRTZXRTY3JlZW5SZXNvbHV0aW9uRmxhZzogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGxldCBzaXplID0gY2Mud2luU2l6ZTtcclxuICAgICAgICBsZXQgd2lkdGggPSBzaXplLndpZHRoO1xyXG4gICAgICAgIGxldCBoZWlnaHQgPSBzaXplLmhlaWdodDtcclxuICAgICAgICBpZiAoKGhlaWdodCAvIHdpZHRoKSA+ICgxNi4yIC8gOSkpIHJldHVybiBmYWxzZTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0sXHJcbiAgICAvL+WIpOaWreWFqOmdouWxj+mAgumFjVxyXG4gICAgc2V0Rml0OiBmdW5jdGlvbiAoY2FudmFzKSB7XHJcbiAgICAgICAgbGV0IGZsYWcgPSAgY2MuZnguR2FtZVRvb2wuZ2V0U2V0U2NyZWVuUmVzb2x1dGlvbkZsYWcoKTtcclxuICAgICAgICBpZiAoZmxhZykge1xyXG4gICAgICAgIFx0Ly8gY29uc29sZS5sb2coXCLkuI3mmK/lhajpnaLlsY9cIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICBcdC8vIGNvbnNvbGUubG9nKFwi5piv5YWo6Z2i5bGPXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmxhZztcclxuICAgIH0sXHJcbiAgICAvL+iOt+WPlua4uOaIj+S/oeaBr1xyXG4gICAgZ2V0R2FtZUluZm86IGZ1bmN0aW9uKG5vZGUpe1xyXG4gICAgICAgIHZhciBqZyA9IGZhbHNlO1xyXG4gICAgICAgIHJldHVybiBqZztcclxuICAgIH0sXHJcbiAgICAvL+iuvue9rua4uOaIj+S/oeaBr1xyXG4gICAgc2V0R2FtZUluZm86IGZ1bmN0aW9uKHBkKXtcclxuICAgXHJcbiAgICB9LFxyXG5cclxuICAgIC8v5omT5a2X5py65pWI5p6cXHJcbiAgICB0eXBpbmdBbmkobGFiZWwsdGV4dCxjYix0YXJnZXQpe1xyXG4gICAgICAgIHZhciBzZWxmID0gdGFyZ2V0O1xyXG4gICAgICAgIHZhciBodG1sID0gJyc7XHJcbiAgICAgICAgdmFyIGFyciA9IHRleHQuc3BsaXQoJycpO1xyXG4gICAgICAgIHZhciBsZW4gPSBhcnIubGVuZ3RoO1xyXG4gICAgICAgIHZhciBzdGVwID0gMDtcclxuICAgICAgICBzZWxmLmZ1bmMgPSAoKT0+e1xyXG4gICAgICAgICAgICBodG1sICs9IGFycltzdGVwXTtcclxuICAgICAgICAgICAgbGFiZWwuc3RyaW5nID0gaHRtbDtcclxuICAgICAgICAgICAgaWYgKCsrc3RlcCA9PSBsZW4pIHtcclxuICAgICAgICAgICAgICAgIHNlbGYudW5zY2hlZHVsZShzZWxmLmZ1bmMpO1xyXG4gICAgICAgICAgICAgICAgY2IgJiYgY2IoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBzZWxmLnNjaGVkdWxlKHNlbGYuZnVuYywwLjEsIGNjLm1hY3JvLlJFUEVBVF9GT1JFVkVSLCAwKVxyXG4gICAgfSxcclxuXHJcbiAgICAvL+i+k+WFpeenkizov5Tlm57pnIDopoHlsZXnpLrml7bpl7TmoLzlvI9cclxuICAgIGdldFRpbWVNYXJnaW46KHNlY29uZCkgPT4ge1xyXG4gICAgICAgIGxldCB0b3RhbCA9IDA7XHJcbiAgICAgICAgdG90YWwgPSBzZWNvbmQ7XHJcbiAgICAgICAgbGV0IGhvdXIgPSAwO1xyXG4gICAgICAgIGhvdXIgPSBwYXJzZUludCgodG90YWwgLyAzNjAwKSArIFwiXCIpOy8v6K6h566X5pW05pWw5bCP5pe25pWwXHJcbiAgICAgICAgbGV0IGFmdGVySG91ciA9IHRvdGFsIC0gaG91ciAqIDYwICogNjA7Ly/lj5blvpfnrpflh7rlsI/ml7bmlbDlkI7liankvZnnmoTnp5LmlbBcclxuICAgICAgICBsZXQgbWluID0gcGFyc2VJbnQoKGFmdGVySG91ciAvIDYwKStcIlwiKTsvL+iuoeeul+aVtOaVsOWIhlxyXG4gICAgICAgIGxldCBtID0gXCJcIiArIG1pbjsgIFxyXG4gICAgICAgIGlmKG1pbiA8IDEwKSBtID0gXCIwXCIrbWluO1xyXG4gICAgICAgIGxldCBhZnRlck1pbiA9IHRvdGFsIC0gaG91ciAqIDYwICogNjAgLSBtaW4gKiA2MDsvL+WPluW+l+eul+WHuuWIhuWQjuWJqeS9meeahOenkuaVsFxyXG4gICAgICAgIGxldCBtaWFvID0gYWZ0ZXJNaW4gKyBcIlwiO1xyXG4gICAgICAgIGlmKGFmdGVyTWluIDwgMTApIG1pYW8gPSBcIjBcIiArIGFmdGVyTWluO1xyXG4gICAgICAgIHJldHVybiBtICsgJzonICsgbWlhb1xyXG4gICAgfSxcclxuXHJcbiAgICAvL+i+k+WFpeenkizov5Tlm57pnIDopoHlsZXnpLrml7bpl7TmoLzlvI9cclxuICAgIGdldFRpbWVTaGVuTm9uZzooc2Vjb25kKSA9PiB7XHJcbiAgICAgICAgc2Vjb25kID0gcGFyc2VJbnQoc2Vjb25kLzEwMDArXCJcIik7XHJcbiAgICAgICAgbGV0IHRvdGFsID0gMDtcclxuICAgICAgICB0b3RhbCA9IHNlY29uZDtcclxuICAgICAgICBsZXQgbWluID0gMDtcclxuICAgICAgICBpZih0b3RhbCA+IDYwKXtcclxuICAgICAgICAgICAgbWluID0gcGFyc2VJbnQoKHRvdGFsIC8gNjApK1wiXCIpOy8v6K6h566X5pW05pWw5YiGXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBtID0gIG1pbiArIFwiJ1wiOyAgXHJcblxyXG4gICAgICAgIGxldCBhZnRlck1pbiA9IHRvdGFsIC0gbWluICogNjA7Ly/lj5blvpfnrpflh7rliIblkI7liankvZnnmoTnp5LmlbBcclxuICAgICAgICBsZXQgbWlhbyA9IGFmdGVyTWluICsgXCInJ1wiO1xyXG4gICAgICAgIHJldHVybiBtICsgbWlhb1xyXG4gICAgfSxcclxuXHJcbiAgICAvL+iOt+WPluaXtumXtOaIs1xyXG4gICAgZ2V0VGltZSgpe1xyXG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgIHJldHVybiB0aW1lc3RhbXA7XHJcbiAgICB9LFxyXG4gICAgcHVzaExpc3RlcjpmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgXHJcbiAgICB9LFxyXG4gICAgcmVtb3ZlQWxsTGlzdGVyOmZ1bmN0aW9uICgpIHtcclxuICAgICAgICBcclxuICAgIH0sXHJcblxyXG59O1xyXG5leHBvcnQgeyBHYW1lVG9vbCB9OyJdfQ==
|