(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 = "http://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("上传数据:") 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, "reactionTime": data, "totalSunCount": cc.fx.GameConfig.GM_INFO.total, "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"); if (matchId == "undifend" || matchId == null) { matchId = this.setMatchId(); } else { if (this.containsNanana(matchId) == true) { matchId = this.setMatchId(); } else { var char = parseInt(matchId[10]); if (this.level == 1) { char += 1; } matchId = matchId.slice(0, 10) + char + ""; cc.fx.GameConfig.GM_INFO.matchId = matchId; cc.sys.localStorage.setItem("matchId", matchId); } } 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: '.jpg' }, 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].totalSunCount, 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+"; } } cc.fx.GameTool.subName(target.selfData.nickName, nameLength); target.selfNode.getChildByName("nameLab").getComponent(cc.Label).string = target.selfData.nickName; target.selfNode.getChildByName("totalLab").getComponent(cc.Label).string = target.selfData.totalSunCount; 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; } }, 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) { }, //输入秒,返回需要展示时间格式 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; }, //获取时间戳 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0XFxtb2R1bGVcXFRvb2xcXEdhbWVUb29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLCtCQUErQjtBQUMvQixJQUFJLFFBQVEsR0FBRztJQUNYLFVBQVUsRUFBRSxDQUFDO0lBQ2IsUUFBUSxFQUFFLENBQUM7SUFDWCxVQUFVLEVBQUUsQ0FBQztJQUNiLFVBQVU7SUFDVixjQUFjO1FBQ1YsSUFBSSxJQUFJLEdBQUcsT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDckQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbEQsSUFBRyxJQUFJLElBQUksVUFBVSxJQUFJLElBQUksSUFBRSxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUUsRUFBQztZQUM5QyxJQUFJLEdBQUcsR0FBRyw2RUFBNkUsR0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ3RHLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztTQUM5QjthQUNHO1lBQ0EsRUFBRSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksRUFBQyxJQUFJLENBQUMsQ0FBQztZQUMzQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDM0Q7SUFDTCxDQUFDO0lBRUQsTUFBTTtJQUNOLFdBQVc7UUFDUCxvQkFBb0I7UUFDcEIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNoQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFF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RyxFQUFFLENBQUMsR0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBLE9BQU87UUFDL0MsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztRQUNqQixJQUFHLEdBQUcsR0FBRyxFQUFFO1lBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBQyxHQUFHLENBQUM7UUFDekIsSUFBSSxRQUFRLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQSxhQUFhO1FBQzlELElBQUksSUFBSSxHQUFHLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBRyxRQUFRLEdBQUcsRUFBRTtZQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsUUFBUSxDQUFDO1FBQ3hDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUE7SUFDekIsQ0FBQztJQUVELE9BQU87SUFDUCxPQUFPO1FBQ0gsSUFBTSxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN2QyxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBQ0QsVUFBVSxFQUFDO0lBRVgsQ0FBQztJQUNELGVBQWUsRUFBQztJQUVoQixDQUFDO0NBRUosQ0FBQztBQUNPLDRCQUFRIiwiZmlsZSI6IiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbi8v5pyA5aSn5bel5YW357G7ICDlkITnp43lhazlhbHmlrnms5XvvIzku6Xlj4rlpITnkIbkuIrkvKDvvIzojrflj5blkI7nq6/mjqXlj6PmlbDmja5cclxudmFyIEdhbWVUb29sID0ge1xyXG4gICAgX3N0YXJ0VGltZTogMCxcclxuICAgIF9lbmRUaW1lOiAwLFxyXG4gICAgX3RvdGFsVGltZTogMCxcclxuICAgIC8v6I635Y+WdXNlcklkXHJcbiAgICBBdXRoZW50aWNhdGlvbigpe1xyXG4gICAgICAgIGxldCBuYW1lID0gXCJ1c2VyX1wiICsgY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLmdhbWVJZDtcclxuICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSkpO1xyXG4gICAgICAgIGlmKGRhdGEgPT0gXCJ1bmRpZmVuZFwiIHx8IGRhdGE9PW51bGwgfHwgZGF0YSA9PSBcIlwiKXtcclxuICAgICAgICAgICAgbGV0IHVybCA9IFwiaHR0cDovL2FwaS5zcGFya3VzLmNuL2FwaS91c2VyL2F1dGgvbG9naW4/ZG9tYWluPWh1aTMyNTc5V2RZUHNnWXEmY2FsbGJhY2s9XCIrbG9jYXRpb24uaHJlZjtcclxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIGNjLmZ4LlN0b3JhZ2VNZXNzYWdlLnNldFN0b3JhZ2UobmFtZSxkYXRhKTtcclxuICAgICAgICAgICAgY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLnVzZXJJZCA9IHBhcnNlSW50KGRhdGEudXNlcklkKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8v5Z+L54K55LiK5LygXHJcbiAgICBzZXRHYW1lRGF0YSgpe1xyXG4gICAgICAgIC8vR0FNRV9EQVRBIOWIneWni+WMliDmr4/mrKHmuIXpm7ZcclxuICAgICAgICBjYy5meC5HYW1lQ29uZmlnLkdBTUVfREFUQSA9IFtdO1xyXG4gICAgICAgIGNjLmZ4LkdhbWVDb25maWcuR0FNRV9EQVRBLnB1c2goY2MuZnguR2FtZUNvbmZpZy5DTElDS19EQVRBKTtcclxuICAgICAgICBjYy5meC5HYW1lQ29uZmlnLkNMSUNLX2luaXQoKTtcclxuICAgICAgICBsZXQgZGF0YSA9IGNjLmZ4LkdhbWVDb25maWcuR0FNRV9EQVRBO1xyXG4gICAgICAgIGxldCBtYXRjaElkID0gdGhpcy5nZXRNYXRjaElkKCk7XHJcbiAgICAgICAgbGV0IHBvc3REYXRhID0ge1xyXG4gICAgICAgICAgICBcImdhbWVJZFwiOmNjLmZ4LkdhbWVDb25maWcuR01fSU5GTy5nYW1lSWQsXHJcbiAgICAgICAgICAgIFwidXNlcklkXCI6Y2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLnVzZXJJZCxcclxuICAgICAgICAgICAgXCJtYXRjaElkXCI6bWF0Y2hJZCxcclxuICAgICAgICAgICAgXCJkYXRhXCI6IGRhdGFcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIuS4iuS8oOaVsOaNrjpcIilcclxuICAgICAgICBjYy5meC5IdHRwVXRpbC51cGxvYWRVc2VyTG9nRGF0YShwb3N0RGF0YSxmdW5jdGlvbigpe30pXHJcbiAgICB9LFxyXG4gICAgLy/kuIrkvKDmjpLooYzmppwgIHR5cGXkuLoxXHJcbiAgICBzZXRSYW5rKGRhdGEpe1xyXG4gICAgICAgIC8vR0FNRV9EQVRBIOWIneWni+WMliDmr4/mrKHmuIXpm7ZcclxuICAgICAgICBsZXQgcG9zdERhdGEgPSB7XHJcbiAgICAgICAgICAgIFwiZ2FtZUlkXCI6Y2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLmdhbWVJZCxcclxuICAgICAgICAgICAgXCJ1c2VySWRcIjpjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8udXNlcklkLFxyXG4gICAgICAgICAgICBcInR5cGVcIjoxLFxyXG4gICAgICAgICAgICBcInJlYWN0aW9uVGltZVwiOiBkYXRhLFxyXG4gICAgICAgICAgICBcInRvdGFsU3VuQ291bnRcIjogY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLnRvdGFsLFxyXG4gICAgICAgICAgICBcInN1Y2Nlc3NcIjogY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLnN1Y2Nlc3NcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNjLmZ4Lkh0dHBVdGlsLnJhbmtEYXRhKDEsZnVuY3Rpb24oKXt9LHBvc3REYXRhKTtcclxuICAgIH0sXHJcbiAgICAvL+iOt+WPluaOkuihjOamnCB0eXBl5Li6MlxyXG4gICAgZ2V0UmFuayhkYXRhLGNhbGxiYWNrKXtcclxuICAgICAgICBsZXQgcmFua0xlbmd0aCA9IGRhdGEubGVuZ3RoO1xyXG4gICAgICAgIGxldCBwb3N0RGF0YSA9IHtcclxuICAgICAgICAgICAgXCJnYW1lSWRcIjpjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8uZ2FtZUlkLFxyXG4gICAgICAgICAgICBcInVzZXJJZFwiOmNjLmZ4LkdhbWVDb25maWcuR01fSU5GTy51c2VySWQsXHJcbiAgICAgICAgICAgIFwicGFnZVwiOjEsXHJcbiAgICAgICAgICAgIFwicGFnZVNpemVcIjpyYW5rTGVuZ3RoXHJcbiAgICAgICAgfTsgXHJcbiAgICAgICAgLy/lm57osIPov5tnZXRSYW5rRGF0YVxyXG4gICAgICAgIGNjLmZ4Lkh0dHBVdGlsLnJhbmtEYXRhKDIsZGF0YSA9PntjYWxsYmFjayhkYXRhKX0scG9zdERhdGEpO1xyXG4gICAgfSxcclxuICAgIC8v6I635Y+WbWF0Y2hJZCAg55So5LqO5LiK5Lyg5q+P5qyh54K55Ye75pWw5o2u6YeM6Z2i6K6w5b2VaWTmlrnkvr/mn6Xor6JcclxuICAgIGdldE1hdGNoSWQgKCl7XHJcbiAgICAgICAgbGV0IG1hdGNoSWQgPSBjYy5zeXMubG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJtYXRjaElkXCIpO1xyXG4gICAgICAgIGlmKG1hdGNoSWQgPT0gXCJ1bmRpZmVuZFwiIHx8IG1hdGNoSWQ9PW51bGwpe1xyXG4gICAgICAgICAgICBtYXRjaElkID0gIHRoaXMuc2V0TWF0Y2hJZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICBpZih0aGlzLmNvbnRhaW5zTmFuYW5hKG1hdGNoSWQpID09IHRydWUpe1xyXG4gICAgICAgICAgICAgICAgbWF0Y2hJZCA9ICB0aGlzLnNldE1hdGNoSWQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICAgICAgbGV0IGNoYXIgPSBwYXJzZUludChtYXRjaElkWzEwXSk7XHJcbiAgICAgICAgICAgICAgICBpZih0aGlzLmxldmVsID09IDEpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNoYXIgKz0gMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG1hdGNoSWQgID0gbWF0Y2hJZC5zbGljZSgwLCAxMCkgKyBjaGFyICsgXCJcIjtcclxuICAgICAgICAgICAgICAgIGNjLmZ4LkdhbWVDb25maWcuR01fSU5GTy5tYXRjaElkID0gbWF0Y2hJZDtcclxuICAgICAgICAgICAgICAgIGNjLnN5cy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIm1hdGNoSWRcIixtYXRjaElkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbWF0Y2hJZDtcclxuICAgIH0sXHJcbiAgICAvL+ajgOa1i21hdGNoSWQg5aaC5p6c5pyJ57yT5a2Y5Lul5YmN55qEbmFuYW5h5pWw5o2u5riF6ZmkXHJcbiAgICBjb250YWluc05hbmFuYShzdHIpIHtcclxuICAgICAgICByZXR1cm4gL25hL2kudGVzdChzdHIpO1xyXG4gICAgfSxcclxuICAgIC8v6YeN5paw6K6+572uTWF0Y2hJZFxyXG4gICAgc2V0TWF0Y2hJZCAoKXtcclxuICAgICAgICAvLyDlrprkuYnljIXlkKvlj6/nlKjlrZfnrKbnmoTlrZfnrKbpm4ZcclxuICAgICAgICBjb25zdCBjaGFyYWN0ZXJzID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5JztcclxuICAgICAgICAvLyDliJvlu7rkuIDkuKrmlbDnu4Tku6Xkv53lrZjpmo/mnLrlrZfnrKZcclxuICAgICAgICBjb25zdCB1dWlkQXJyYXkgPSBbXTtcclxuICAgICAgICAvLyDlvqrnjq8xMOasoSDnlJ/miJAxMOS9jeeahFVVSURcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIC8vIOeUn+aIkOmaj+acuue0ouW8le+8jOiMg+WbtOaYr+Wtl+espumbhueahOmVv+W6plxyXG4gICAgICAgICAgICBjb25zdCByYW5kb21JbmRleCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJhY3RlcnMubGVuZ3RoKTtcclxuICAgICAgICAgICAgLy8g5LuO5a2X56ym6ZuG5Lit6I635Y+W6ZqP5py65a2X56ymXHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmRvbUNoYXIgPSBjaGFyYWN0ZXJzLmNoYXJBdChyYW5kb21JbmRleCk7XHJcbiAgICAgICAgICAgIC8vIOWwhuWtl+espua3u+WKoOWIsOaVsOe7hOS4rVxyXG4gICAgICAgICAgICB1dWlkQXJyYXkucHVzaChyYW5kb21DaGFyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGRhdGEgPSAgdXVpZEFycmF5LmpvaW4oJycpICsgMSArIFwiXCI7XHJcbiAgICAgICAgY2Muc3lzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKFwibWF0Y2hOdW1iZXJcIiwxKTtcclxuICAgICAgICBjYy5zeXMubG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJtYXRjaElkXCIsZGF0YSk7XHJcbiAgICAgICAgY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLm1hdGNoSWQgPSBkYXRhO1xyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfSxcclxuICAgIC8v5oiq5Y+W5ZCN5a2XXHJcbiAgICBzdWJOYW1lKG5hbWUsbGVuZ3RoKXtcclxuICAgICAgICBpZihuYW1lLmxlbmd0aCA+IGxlbmd0aCl7XHJcbiAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLGxlbmd0aCkgKyBcIi4uLlwiXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuYW1lO1xyXG4gICAgfSxcclxuICAgIC8v6K6+572u5aS05YOPXHJcbiAgICBzZXRQaWMobm9kZSxwaWMpe1xyXG4gICAgICAgIG5vZGUuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IHVybCA9IHBpYztcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgZmV0Y2godXJsKVxyXG4gICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtTGVuZ3RoJyk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC50aGVuKGVyck5vID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKGVyck5vID09IFwiNTA5M1wiKXtcclxuICAgICAgICAgICAgICAgICAgICBub2RlLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBYLUluZm86JywgZXJyb3IpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgIGNjLmFzc2V0TWFuYWdlci5sb2FkUmVtb3RlKHVybCwge2V4dDonLmpwZyd9LChlcnIsIHRleHR1cmU6Y2MuVGV4dHVyZTJEKSA9PiB7XHJcbiAgICAgICAgICAgIGlmKHRleHR1cmUpe1xyXG4gICAgICAgICAgICAgICAgbm9kZS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgbm9kZS5nZXRDb21wb25lbnQoY2MuU3ByaXRlKS5zcHJpdGVGcmFtZSA9IG5ldyBjYy5TcHJpdGVGcmFtZSh0ZXh0dXJlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyLHRleHR1cmUpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgfSxcclxuICAgIC8v56ys5LiA5Liq5Y+C5pWw5oqK55uu5qCH5bim6L+b5p2l5aSE55CG77yM56ys5LqM5Liq5Y+C5pWw5Li65ZCN5a2X6ZW/5bqm77yM5LiN5ZCM5Zy65pmv5LiN5ZCM6ZyA5rGCXHJcbiAgICAvL+WQjeWtlzTnn63vvIzlsI/mjpLooYzvvIzlkI3lrZc26ZW/77yM5aSn5o6S6KGMXHJcbiAgICBnZXRSYW5rRGF0YShkYXRhLHRhcmdldCxuYW1lTGVuZ3RoKXtcclxuICAgICAgICB0YXJnZXQubGlzdERhdGEgPSBkYXRhLmRhdGEubGlzdDtcclxuICAgICAgICB0YXJnZXQuc2VsZkRhdGEgPSBkYXRhLmRhdGEuaW5mbztcclxuICAgICAgICBsZXQgcmFua0RhdGEgPSBbXTtcclxuICAgICAgICBsZXQgc2VsZiA9IGZhbHNlO1xyXG4gICAgICAgICBjYy5meC5HYW1lVG9vbC5zZXRQaWModGFyZ2V0LnNlbGZOb2RlLmdldENoaWxkQnlOYW1lKFwicGljXCIpLmdldENoaWxkQnlOYW1lKFwiaWNvblwiKSx0YXJnZXQuc2VsZkRhdGEucGljKTtcclxuICAgICAgICBmb3IobGV0IGk9MDtpPD10YXJnZXQubGlzdERhdGEubGVuZ3RoLTE7aSsrKXtcclxuICAgICAgICAgICAgcmFua0RhdGEucHVzaCh7cmFuazooaSsxKSwgbmFtZTp0YXJnZXQubGlzdERhdGFbaV0ubmlja05hbWUsIHRvdGFsOnRhcmdldC5saXN0RGF0YVtpXS50b3RhbFN1bkNvdW50LCBwaWM6dGFyZ2V0Lmxpc3REYXRhW2ldLnBpY30pO1xyXG4gICAgICAgICAgICBpZihjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8udXNlcklkID09IHRhcmdldC5saXN0RGF0YVtpXS51c2VySWQpe1xyXG4gICAgICAgICAgICAgICAgc2VsZiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXQucmFua051bWJlciA9IGk7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXQuc2VsZk5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJyYW5rTGFiXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCkuc3RyaW5nID0oaSsxKSArIFwiXCI7IFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKGkgPT0gKHRhcmdldC5saXN0RGF0YS5sZW5ndGgtMSkgJiYgc2VsZiA9PSBmYWxzZSl7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXQucmFua051bWJlciA9IGk7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXQuc2VsZk5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJyYW5rTGFiXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCkuc3RyaW5nID0gXCI5OStcIjsgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgIGNjLmZ4LkdhbWVUb29sLnN1Yk5hbWUodGFyZ2V0LnNlbGZEYXRhLm5pY2tOYW1lLG5hbWVMZW5ndGgpO1xyXG4gICAgICAgIHRhcmdldC5zZWxmTm9kZS5nZXRDaGlsZEJ5TmFtZShcIm5hbWVMYWJcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKS5zdHJpbmcgPSB0YXJnZXQuc2VsZkRhdGEubmlja05hbWU7XHJcbiAgICAgICAgdGFyZ2V0LnNlbGZOb2RlLmdldENoaWxkQnlOYW1lKFwidG90YWxMYWJcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKS5zdHJpbmcgPSB0YXJnZXQuc2VsZkRhdGEudG90YWxTdW5Db3VudDtcclxuICAgICAgICBzd2l0Y2godGFyZ2V0LnNlbGZOb2RlLmdldENoaWxkQnlOYW1lKFwicmFua0xhYlwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpLnN0cmluZyl7XHJcbiAgICAgICAgICAgIGNhc2UgXCIxXCI6XHJcbiAgICAgICAgICAgICAgICB0YXJnZXQuc2VsZk5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJyYW5rXCIpLmdldENoaWxkQnlOYW1lKFwib25lXCIpLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIjJcIjpcclxuICAgICAgICAgICAgICAgIHRhcmdldC5zZWxmTm9kZS5nZXRDaGlsZEJ5TmFtZShcInJhbmtcIikuZ2V0Q2hpbGRCeU5hbWUoXCJ0d29cIikuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiM1wiOlxyXG4gICAgICAgICAgICAgICAgdGFyZ2V0LnNlbGZOb2RlLmdldENoaWxkQnlOYW1lKFwicmFua1wiKS5nZXRDaGlsZEJ5TmFtZShcInRocmVlXCIpLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIOWkp+aOkuihjFxyXG4gICAgICAgIGlmKG5hbWVMZW5ndGggPT0gNil7XHJcbiAgICAgICAgICAgIHRhcmdldC5yYW5rTGlzdC5zZXREYXRhKHJhbmtEYXRhKTtcclxuICAgICAgICAgICAgdGFyZ2V0LnNlbGZOb2RlLm9wYWNpdHkgPSAyNTU7XHJcbiAgICAgICAgICAgIGlmKHRhcmdldC5zZWxmRGF0YS50b3RhbFN1bkNvdW50ID09IDApIHRhcmdldC5zZWxmTm9kZS5vcGFjaXR5ID0gMDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGdldFNldFNjcmVlblJlc29sdXRpb25GbGFnOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IHNpemUgPSBjYy53aW5TaXplO1xyXG4gICAgICAgIGxldCB3aWR0aCA9IHNpemUud2lkdGg7XHJcbiAgICAgICAgbGV0IGhlaWdodCA9IHNpemUuaGVpZ2h0O1xyXG4gICAgICAgIGlmICgoaGVpZ2h0IC8gd2lkdGgpID4gKDE2LjIgLyA5KSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSxcclxuICAgIC8v5Yik5pat5YWo6Z2i5bGP6YCC6YWNXHJcbiAgICBzZXRGaXQ6IGZ1bmN0aW9uIChjYW52YXMpIHtcclxuICAgICAgICBsZXQgZmxhZyA9ICBjYy5meC5HYW1lVG9vbC5nZXRTZXRTY3JlZW5SZXNvbHV0aW9uRmxhZygpO1xyXG4gICAgICAgIGlmIChmbGFnKSB7XHJcbiAgICAgICAgXHQvLyBjb25zb2xlLmxvZyhcIuS4jeaYr+WFqOmdouWxj1wiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgIFx0Ly8gY29uc29sZS5sb2coXCLmmK/lhajpnaLlsY9cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmbGFnO1xyXG4gICAgfSxcclxuICAgIC8v6I635Y+W5ri45oiP5L+h5oGvXHJcbiAgICBnZXRHYW1lSW5mbzogZnVuY3Rpb24obm9kZSl7XHJcbiAgICAgICAgdmFyIGpnID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIGpnO1xyXG4gICAgfSxcclxuICAgIC8v6K6+572u5ri45oiP5L+h5oGvXHJcbiAgICBzZXRHYW1lSW5mbzogZnVuY3Rpb24ocGQpe1xyXG4gICBcclxuICAgIH0sXHJcbiAgICAvL+i+k+WFpeenkizov5Tlm57pnIDopoHlsZXnpLrml7bpl7TmoLzlvI9cclxuICAgIGdldFRpbWVNYXJnaW46KHNlY29uZCkgPT4ge1xyXG4gICAgICAgIGxldCB0b3RhbCA9IDA7XHJcbiAgICAgICAgdG90YWwgPSBzZWNvbmQ7XHJcbiAgICAgICAgbGV0IGhvdXIgPSAwO1xyXG4gICAgICAgIGhvdXIgPSBwYXJzZUludCgodG90YWwgLyAzNjAwKSArIFwiXCIpOy8v6K6h566X5pW05pWw5bCP5pe25pWwXHJcbiAgICAgICAgbGV0IGFmdGVySG91ciA9IHRvdGFsIC0gaG91ciAqIDYwICogNjA7Ly/lj5blvpfnrpflh7rlsI/ml7bmlbDlkI7liankvZnnmoTnp5LmlbBcclxuICAgICAgICBsZXQgbWluID0gcGFyc2VJbnQoKGFmdGVySG91ciAvIDYwKStcIlwiKTsvL+iuoeeul+aVtOaVsOWIhlxyXG4gICAgICAgIGxldCBtID0gXCJcIiArIG1pbjsgIFxyXG4gICAgICAgIGlmKG1pbiA8IDEwKSBtID0gXCIwXCIrbWluO1xyXG4gICAgICAgIGxldCBhZnRlck1pbiA9IHRvdGFsIC0gaG91ciAqIDYwICogNjAgLSBtaW4gKiA2MDsvL+WPluW+l+eul+WHuuWIhuWQjuWJqeS9meeahOenkuaVsFxyXG4gICAgICAgIGxldCBtaWFvID0gYWZ0ZXJNaW4gKyBcIlwiO1xyXG4gICAgICAgIGlmKGFmdGVyTWluIDwgMTApIG1pYW8gPSBcIjBcIiArIGFmdGVyTWluO1xyXG4gICAgICAgIHJldHVybiBtICsgJzonICsgbWlhb1xyXG4gICAgfSxcclxuXHJcbiAgICAvL+iOt+WPluaXtumXtOaIs1xyXG4gICAgZ2V0VGltZSgpe1xyXG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgIHJldHVybiB0aW1lc3RhbXA7XHJcbiAgICB9LFxyXG4gICAgcHVzaExpc3RlcjpmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgXHJcbiAgICB9LFxyXG4gICAgcmVtb3ZlQWxsTGlzdGVyOmZ1bmN0aW9uICgpIHtcclxuICAgICAgICBcclxuICAgIH0sXHJcblxyXG59O1xyXG5leHBvcnQgeyBHYW1lVG9vbCB9OyJdfQ==