(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/mod/hallows/hallows_model.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, '186e0AtYd5Fi5LuGWBDvVMY', 'hallows_model'); // Scripts/mod/hallows/hallows_model.js "use strict"; // -------------------------------------------------------------------- // @author: xxx@syg.com(必填, 创建模块的人员) // @description: // 这里填写详细说明,主要填写该模块的功能简要 //
Create: 2019-02-18 14:15:05 // -------------------------------------------------------------------- var HallowsVo = require("hallows_vo"); var MainuiController = require("mainui_controller"); var HeroController = require("hero_controller"); var RoleController = require("role_controller"); var BackpackController = require("backpack_controller"); var HallowsEvent = require("hallows_event"); var HallowsConst = require("hallows_const"); var MainuiConst = require("mainui_const"); var HallowsModel = cc.Class({ "extends": BaseClass, ctor: function ctor() { this.ctrl = require("hallows_controller").getInstance(); this.initConfig(); }, properties: {}, initConfig: function initConfig() { this.hallows_list = []; this.open_flag = false; // 该玩家是否打开过神器界面 this.had_request = false; this.attr_ratio_list = []; this.hallows_red_list = []; // 红点数据 }, //更新圣器数据 updateHallowsInfo: function updateHallowsInfo(data) { if (!data) return; for (var i in data.hallows) { var hallows_vo = this.hallows_list[data.hallows[i].id]; if (!hallows_vo) { hallows_vo = new HallowsVo(); this.hallows_list[data.hallows[i].id] = hallows_vo; } hallows_vo.initAttributeData(data.hallows[i]); } //计算神器红点 this.updateRedPoint(); }, //新增或者更新一个圣器 updateHallowsData: function updateHallowsData(data) { var hallows_vo = this.getHallowsById(data.id); if (!hallows_vo) { hallows_vo = new HallowsVo(); this.hallows_list[data.id] = hallows_vo; } hallows_vo.initAttributeData(data); // 计算神器红点 this.updateRedPoint(); }, //监测红点 updateHallowsRedStatus: function updateHallowsRedStatus(bid, status) { var _status = this.hallows_red_list[bid]; if (_status == status) return; this.hallows_red_list[bid] = status; MainuiController.getInstance().setBtnRedPoint(MainuiConst.btn_index.hallows, { bid: bid, status: status }); gcore.GlobalEvent.fire(HallowsEvent.HallowsRedStatus, bid, status); }, // 根据红点类型判断是否显示红点 checkRedIsShowByRedType: function checkRedIsShowByRedType(redType) { return this.hallows_red_list[redType] || false; }, //判断神器是否有红点 getHallowsRedStatus: function getHallowsRedStatus() { var red_status = false; for (var i in this.hallows_red_list) { if (this.hallows_red_list[i]) { red_status = true; break; } } return red_status; }, updateRedPoint: function updateRedPoint() { RedMgr.getInstance().addCalHandler(this.checkHallowsRedStatus.bind(this), RedIds.Hallow); }, checkHallowsRedStatus: function checkHallowsRedStatus() { var show_red = false; if (this.checkIsHaveAllHallows()) { //是否激活所有神器 //按照等级、进度、id排序,取出第一个神器来判断红点 var sort_func = function sort_func(objA, objB) { if (objA.step != objB.step) { return objB.step - objA.step; } else if (objA.lucky != objB.lucky) { return objB.lucky - objA.lucky; } else { return objB.id - objA.id; } }; var hallows_list = Utils.deepCopy(this.hallows_list); hallows_list.sort(sort_func); var hallows_vo = hallows_list[0]; if (hallows_vo) { this.setRedHallowsId(hallows_vo.id); var role_vo = RoleController.getInstance().getRoleVo(); // 神器升级 var hallows_config = gdata("hallows_data", "data_info", Utils.getNorKey(hallows_vo.id, hallows_vo.step)); var cost_config = hallows_config.loss; if (cost_config && Utils.next(cost_config) != null) { for (var i in cost_config) { var bid = cost_config[i][0]; var num = cost_config[i][1]; var have_num = 0; var assert = Config.item_data.data_assets_id2label[bid]; if (assert) { have_num = role_vo[assert]; } else { have_num = BackpackController.getInstance().getModel().getItemNumByBid(bid); } if (have_num < num) { show_red = false; break; } else { show_red = true; } } } this.updateHallowsRedStatus(HallowsConst.Red_Index.hallows_lvup, show_red); // 神器技能升级 show_red = false; // 神器技能升级 var skill_config = gdata("hallows_data", "data_skill_up", Utils.getNorKey(hallows_vo.id, hallows_vo.skill_lev)); if (skill_config && skill_config.lev_limit != 0 && skill_config.lev_limit <= hallows_vo.step) { var cost_config = skill_config.lose; if (cost_config && Utils.next(cost_config) != null) { for (var j in cost_config) { var bid = cost_config[j][0]; var num = cost_config[j][1]; var have_num = 0; var assert = Config.item_data.data_assets_id2label[bid]; if (assert) { have_num = role_vo[assert]; } else { have_num = BackpackController.getInstance().getModel().getItemNumByBid(bid); } if (have_num < num) { show_red = false; break; } else { show_red = true; } } } } this.updateHallowsRedStatus(HallowsConst.Red_Index.skill_lvup, show_red); // 是否可以使用圣印石 show_red = false; var trace_config = gdata("hallows_data", "data_trace_cost", Utils.getNorKey(hallows_vo.id, hallows_vo.step)); var id_stone_config = Config.hallows_data.data_const["id_stone"]; if (trace_config && id_stone_config) { var have_num = BackpackController.getInstance().getModel().getBackPackItemNumByBid(id_stone_config.val); if (hallows_vo.seal < trace_config.num && have_num > 0) { show_red = true; } } this.updateHallowsRedStatus(HallowsConst.Red_Index.stone_use, show_red); } // 当从神器任务界面变为神器界面时,要先清一下任务的红点 if (this.checkRedIsShowByRedType(HallowsConst.Red_Index.task_award)) { this.updateHallowsRedStatus(HallowsConst.Red_Index.task_award, false); } } else { show_red = this.checkHallowsAwardTips(); this.updateHallowsRedStatus(HallowsConst.Red_Index.task_award, show_red); } }, // 保存一下显示红点的神器id(等级最高的) setRedHallowsId: function setRedHallowsId(id) { var old_id = this.red_hallows_id; this.red_hallows_id = id; if (old_id != this.red_hallows_id) { gcore.GlobalEvent.fire(HallowsEvent.HallowsRedStatus); } }, getRedHallowsId: function getRedHallowsId() { return this.red_hallows_id; }, //返回圣器数据 getHallowsById: function getHallowsById(id) { return this.hallows_list[id]; }, //当前总结束 curTotalStep: function curTotalStep() { var step = 0; for (var i in this.hallows_list) { step = step + this.hallows_list[i].step; } return step; }, //获取圣器列表 getHallowsList: function getHallowsList() { var list = []; for (var i in this.hallows_list) { list.push(this.hallows_list[i]); } return list; }, //圣器共鸣等级 getResonateLev: function getResonateLev() { return 0; //return self.resonate_lev }, //获取上阵伙伴数据 getFormInfo: function getFormInfo() { if (Utils.next(this.attr_ratio_list) == null) { for (var i in Config.hallows_data.data_attr_radio) { var info = Config.hallows_data.data_attr_radio[i]; for (var j in info.ratio) { var attr_key = info.ratio[i][0]; var ratio = info.ratio[i][1]; this.attr_ratio_list[Utils.getNorKey(info.type, attr_key)] = ratio; } } } var type_list = {}; var partner_model = HeroController.getInstance().getModel(); if (partner_model) { var form_pos_list = partner_model.getMyPosList(); for (var k in form_pos_list) { var vo = partner_model.getHeroById(form_pos_list[k].id); if (vo) { if (type_list[vo.type] == null) { type_list[vo.type] = 0; } type_list[vo.type] = type_list[vo.type] + 1; } } } return type_list; }, getRatio: function getRatio(type, attr_key) { return this.attr_ratio_list[Utils.getNorKey(type, attr_key)]; }, // 圣器任务列表 updateHallowsTask: function updateHallowsTask(list) { if (list == null || Utils.next(list) == null) return; if (this.hallows_task_list == null) { this.hallows_task_list = {}; } for (var i in list) { this.hallows_task_list[list[i].id] = list[i]; } this.updateRedPoint(); gcore.GlobalEvent.fire(HallowsEvent.UpdateHallowsTaskEvent); }, // 获取指定圣器的任务列表, 这个id是圣器的id, getHallowsTaskList: function getHallowsTaskList(id) { var task_list = []; var hallows_task_config = Config.hallows_data.data_task; if (this.hallows_task_list) { for (var i in this.hallows_task_list) { var config = hallows_task_config[this.hallows_task_list[i].id]; if (config.hid == id) { this.hallows_task_list[i].sort = config.sort; task_list.push(this.hallows_task_list[i]); } } } if (Utils.next(task_list)) { task_list.sort(function (a, b) { return a.id - b.id; }); } return task_list; }, // 获取指定任务数据 getHallowsTaks: function getHallowsTaks(id) { if (this.hallows_task_list) { return this.hallows_task_list[id]; } }, // 获取当前待激活的圣器id getCurActivityHallowsId: function getCurActivityHallowsId() { if (this.hallows_list == null || Utils.next(this.hallows_list) == null) { //-- 第一个圣器 return 1; } var next_id = 0; for (var i in this.hallows_list) { if (next_id < this.hallows_list[i].id) { next_id = this.hallows_list[i].id; } } return next_id + 1; // 取出当前待激活的圣器的id }, // 当前待激活的神器是否有可领取的任务奖励 checkHallowsAwardTips: function checkHallowsAwardTips() { if (this.hallows_task_list == null || Utils.next(this.hallows_task_list) == null) { return false; } var cur_hallows_id = this.getCurActivityHallowsId(); var task_list = this.getHallowsTaskList(cur_hallows_id); if (task_list == null || Utils.next(task_list) == null) { return false; } for (var i in task_list) { if (task_list[i].finish == 1) { return true; } } return false; }, // 获取当前是否已经激活所有神器 checkIsHaveAllHallows: function checkIsHaveAllHallows() { var max_count = Config.hallows_data.data_base_length; var cur_count = 0; for (var i in this.hallows_list) { cur_count = cur_count + 1; } return cur_count >= max_count; }, // 设置是否打开过神器界面的标记 setOpenHallowsFlag: function setOpenHallowsFlag(flag) { this.open_flag = flag; }, //1 为打开过,2为没打开过 getHallowsOpenFlag: function getHallowsOpenFlag() { return this.open_flag; }, // 根据神器id,从配置表数据中获取该神器最高属性数据 makeHighestHallowVo: function makeHighestHallowVo(hallows_id) { if (hallows_id) { var hallows_vo = new HallowsVo(); var max_lv = Config.hallows_data.data_max_lev[hallows_id]; var max_skill_lv = Config.hallows_data.data_skill_max_lev[hallows_id]; var config_info = gdata("hallows_data", "data_info", Utils.getNorKey(hallows_id, max_lv)); var config_skill = gdata("hallows_data", "data_skill_up", Utils.getNorKey(hallows_id, max_skill_lv)); ; var attr_data = []; for (var i in config_info.attr) { var attr_str = config_info.attr[i][0]; var attr_temp = {}; attr_temp.attr_id = Config.attr_data.data_key_to_id[attr_str]; attr_temp.attr_val = config_info.attr[i][1]; attr_data.push(attr_temp); } hallows_vo.id = hallows_id; hallows_vo.step = max_lv; hallows_vo.add_attr = attr_data; hallows_vo.skill_bid = config_skill.skill_bid; hallows_vo.skill_lev = max_skill_lv; return hallows_vo; } }, __delete: function __delete() {} }); 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxoYWxsb3dzXFxoYWxsb3dzX21vZGVsLmpzIl0sIm5hbWVzIjpbIkhhbGxvd3NWbyIsInJlcXVpcmUiLCJNYWludWlDb250cm9sbGVyIiwiSGVyb0NvbnRyb2xsZXIiLCJSb2xlQ29udHJvbGxlciIsIkJhY2twYWNrQ29udHJvbGxlciIsIkhhbGxvd3NFdmVudCIsIkhhbGxvd3NDb25zdCIsIk1haW51aUNvbnN0IiwiSGFsbG93c01vZGVsIiwiY2MiLCJDbGFzcyIsIkJhc2VDbGFzcyIsImN0b3IiLCJjdHJsIiwiZ2V0SW5zdGFuY2UiLCJpbml0Q29uZmlnIiwicHJvcGVydGllcyIsImhhbGxvd3NfbGlzdCIsIm9wZW5fZmxhZyIsImhhZF9yZXF1ZXN0IiwiYXR0cl9yYXRpb19saXN0IiwiaGFsbG93c19yZWRfbGlzdCIsInVwZGF0ZUhhbGxvd3NJbmZvIiwiZGF0YSIsImkiLCJoYWxsb3dzIiwiaGFsbG93c192byIsImlkIiwiaW5pdEF0dHJpYnV0ZURhdGEiLCJ1cGRhdGVSZWRQb2ludCIsInVwZGF0ZUhhbGxvd3NEYXRhIiwiZ2V0SGFsbG93c0J5SWQiLCJ1cGRhdGVIYWxsb3dzUmVkU3RhdHVzIiwiYmlkIiwic3RhdHVzIiwiX3N0YXR1cyIsInNldEJ0blJlZFBvaW50IiwiYnRuX2luZGV4IiwiZ2NvcmUiLCJHbG9iYWxFdmVudCIsImZpcmUiLCJIYWxsb3dzUmVkU3RhdHVzIiwiY2hlY2tSZWRJc1Nob3dCeVJlZFR5cGUiLCJyZWRUeXBlIiwiZ2V0SGFsbG93c1JlZFN0YXR1cyIsInJlZF9zdGF0dXMiLCJSZWRNZ3IiLCJhZGRDYWxIYW5kbGVyIiwiY2hlY2tIYWxsb3dzUmVkU3RhdHVzIiwiYmluZCIsIlJlZElkcyIsIkhhbGxvdyIsInNob3dfcmVkIiwiY2hlY2tJc0hhdmVBbGxIYWxsb3dzIiwic29ydF9mdW5jIiwib2JqQSIsIm9iakIiLCJzdGVwIiwibHVja3kiLCJVdGlscyIsImRlZXBDb3B5Iiwic29ydCIsInNldFJlZEhhbGxvd3NJZCIsInJvbGVfdm8iLCJnZXRSb2xlVm8iLCJoYWxsb3dzX2NvbmZpZyIsImdkYXRhIiwiZ2V0Tm9yS2V5IiwiY29zdF9jb25maWciLCJsb3NzIiwibmV4dCIsIm51bSIsImhhdmVfbnVtIiwiYXNzZXJ0IiwiQ29uZmlnIiwiaXRlbV9kYXRhIiwiZGF0YV9hc3NldHNfaWQybGFiZWwiLCJnZXRNb2RlbCIsImdldEl0ZW1OdW1CeUJpZCIsIlJlZF9JbmRleCIsImhhbGxvd3NfbHZ1cCIsInNraWxsX2NvbmZpZyIsInNraWxsX2xldiIsImxldl9saW1pdCIsImxvc2UiLCJqIiwic2tpbGxfbHZ1cCIsInRyYWNlX2NvbmZpZyIsImlkX3N0b25lX2NvbmZpZyIsImhhbGxvd3NfZGF0YSIsImRhdGFfY29uc3QiLCJnZXRCYWNrUGFja0l0ZW1OdW1CeUJpZCIsInZhbCIsInNlYWwiLCJzdG9uZV91c2UiLCJ0YXNrX2F3YXJkIiwiY2hlY2tIYWxsb3dzQXdhcmRUaXBzIiwib2xkX2lkIiwicmVkX2hhbGxvd3NfaWQiLCJnZXRSZWRIYWxsb3dzSWQiLCJjdXJUb3RhbFN0ZXAiLCJnZXRIYWxsb3dzTGlzdCIsImxpc3QiLCJwdXNoIiwiZ2V0UmVzb25hdGVMZXYiLCJnZXRGb3JtSW5mbyIsImRhdGFfYXR0cl9yYWRpbyIsImluZm8iLCJyYXRpbyIsImF0dHJfa2V5IiwidHlwZSIsInR5cGVfbGlzdCIsInBhcnRuZXJfbW9kZWwiLCJmb3JtX3Bvc19saXN0IiwiZ2V0TXlQb3NMaXN0IiwiayIsInZvIiwiZ2V0SGVyb0J5SWQiLCJnZXRSYXRpbyIsInVwZGF0ZUhhbGxvd3NUYXNrIiwiaGFsbG93c190YXNrX2xpc3QiLCJVcGRhdGVIYWxsb3dzVGFza0V2ZW50IiwiZ2V0SGFsbG93c1Rhc2tMaXN0IiwidGFza19saXN0IiwiaGFsbG93c190YXNrX2NvbmZpZyIsImRhdGFfdGFzayIsImNvbmZpZyIsImhpZCIsImEiLCJiIiwiZ2V0SGFsbG93c1Rha3MiLCJnZXRDdXJBY3Rpdml0eUhhbGxvd3NJZCIsIm5leHRfaWQiLCJjdXJfaGFsbG93c19pZCIsImZpbmlzaCIsIm1heF9jb3VudCIsImRhdGFfYmFzZV9sZW5ndGgiLCJjdXJfY291bnQiLCJzZXRPcGVuSGFsbG93c0ZsYWciLCJmbGFnIiwiZ2V0SGFsbG93c09wZW5GbGFnIiwibWFrZUhpZ2hlc3RIYWxsb3dWbyIsImhhbGxvd3NfaWQiLCJtYXhfbHYiLCJkYXRhX21heF9sZXYiLCJtYXhfc2tpbGxfbHYiLCJkYXRhX3NraWxsX21heF9sZXYiLCJjb25maWdfaW5mbyIsImNvbmZpZ19za2lsbCIsImF0dHJfZGF0YSIsImF0dHIiLCJhdHRyX3N0ciIsImF0dHJfdGVtcCIsImF0dHJfaWQiLCJkYXRhX2tleV90b19pZCIsImF0dHJfdmFsIiwiYWRkX2F0dHIiLCJza2lsbF9iaWQiLCJfX2RlbGV0ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQSxTQUFTLEdBQUdDLE9BQU8sQ0FBQyxZQUFELENBQXZCOztBQUNBLElBQUlDLGdCQUFnQixHQUFHRCxPQUFPLENBQUMsbUJBQUQsQ0FBOUI7O0FBQ0EsSUFBSUUsY0FBYyxHQUFHRixPQUFPLENBQUMsaUJBQUQsQ0FBNUI7O0FBQ0EsSUFBSUcsY0FBYyxHQUFHSCxPQUFPLENBQUMsaUJBQUQsQ0FBNUI7O0FBQ0EsSUFBSUksa0JBQWtCLEdBQUdKLE9BQU8sQ0FBQyxxQkFBRCxDQUFoQzs7QUFDQSxJQUFJSyxZQUFZLEdBQUdMLE9BQU8sQ0FBQyxlQUFELENBQTFCOztBQUNBLElBQUlNLFlBQVksR0FBR04sT0FBTyxDQUFDLGVBQUQsQ0FBMUI7O0FBQ0EsSUFBSU8sV0FBVyxHQUFHUCxPQUFPLENBQUMsY0FBRCxDQUF6Qjs7QUFFQSxJQUFJUSxZQUFZLEdBQUdDLEVBQUUsQ0FBQ0MsS0FBSCxDQUFTO0FBQ3hCLGFBQVNDLFNBRGU7QUFFeEJDLEVBQUFBLElBQUksRUFBRSxnQkFBWTtBQUNkLFNBQUtDLElBQUws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LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBAYXV0aG9yOiB4eHhAc3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcbi8vIEBkZXNjcmlwdGlvbjpcbi8vICAgICAg6L+Z6YeM5aGr5YaZ6K+m57uG6K+05piOLOS4u+imgeWhq+WGmeivpeaooeWdl+eahOWKn+iDveeugOimgVxuLy8gPGJyLz5DcmVhdGU6IDIwMTktMDItMTggMTQ6MTU6MDVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgSGFsbG93c1ZvID0gcmVxdWlyZShcImhhbGxvd3Nfdm9cIik7XG52YXIgTWFpbnVpQ29udHJvbGxlciA9IHJlcXVpcmUoXCJtYWludWlfY29udHJvbGxlclwiKTtcbnZhciBIZXJvQ29udHJvbGxlciA9IHJlcXVpcmUoXCJoZXJvX2NvbnRyb2xsZXJcIik7XG52YXIgUm9sZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwicm9sZV9jb250cm9sbGVyXCIpO1xudmFyIEJhY2twYWNrQ29udHJvbGxlciA9IHJlcXVpcmUoXCJiYWNrcGFja19jb250cm9sbGVyXCIpO1xudmFyIEhhbGxvd3NFdmVudCA9IHJlcXVpcmUoXCJoYWxsb3dzX2V2ZW50XCIpO1xudmFyIEhhbGxvd3NDb25zdCA9IHJlcXVpcmUoXCJoYWxsb3dzX2NvbnN0XCIpO1xudmFyIE1haW51aUNvbnN0ID0gcmVxdWlyZShcIm1haW51aV9jb25zdFwiKTtcblxudmFyIEhhbGxvd3NNb2RlbCA9IGNjLkNsYXNzKHtcbiAgICBleHRlbmRzOiBCYXNlQ2xhc3MsXG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmN0cmwgPSByZXF1aXJlKFwiaGFsbG93c19jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCk7XG4gICAgICAgIHRoaXMuaW5pdENvbmZpZygpO1xuICAgIH0sXG5cbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgfSxcblxuICAgIGluaXRDb25maWc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5oYWxsb3dzX2xpc3QgPSBbXTtcblxuICAgICAgICB0aGlzLm9wZW5fZmxhZyA9IGZhbHNlOyAgLy8g6K+l546p5a625piv5ZCm5omT5byA6L+H56We5Zmo55WM6Z2iXG4gICAgICAgIHRoaXMuaGFkX3JlcXVlc3QgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hdHRyX3JhdGlvX2xpc3QgPSBbXTtcbiAgICBcbiAgICAgICAgdGhpcy5oYWxsb3dzX3JlZF9saXN0ID0gW107IC8vIOe6oueCueaVsOaNrlxuICAgIH0sXG5cbiAgICAvL+abtOaWsOWco+WZqOaVsOaNrlxuICAgIHVwZGF0ZUhhbGxvd3NJbmZvOmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICBpZighZGF0YSlyZXR1cm47XG4gICAgICAgIGZvcih2YXIgaSBpbiBkYXRhLmhhbGxvd3Mpe1xuICAgICAgICAgICAgdmFyIGhhbGxvd3Nfdm8gPSB0aGlzLmhhbGxvd3NfbGlzdFtkYXRhLmhhbGxvd3NbaV0uaWRdO1xuICAgICAgICAgICAgaWYoIWhhbGxvd3Nfdm8pe1xuICAgICAgICAgICAgICAgIGhhbGxvd3Nfdm8gPSBuZXcgSGFsbG93c1ZvKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5oYWxsb3dzX2xpc3RbZGF0YS5oYWxsb3dzW2ldLmlkXSA9IGhhbGxvd3Nfdm87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYWxsb3dzX3ZvLmluaXRBdHRyaWJ1dGVEYXRhKGRhdGEuaGFsbG93c1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgLy/orqHnrpfnpZ7lmajnuqLngrlcbiAgICAgICAgdGhpcy51cGRhdGVSZWRQb2ludCgpXG4gICAgfSxcblxuICAgIC8v5paw5aKe5oiW6ICF5pu05paw5LiA5Liq5Zyj5ZmoXG4gICAgdXBkYXRlSGFsbG93c0RhdGE6ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIHZhciBoYWxsb3dzX3ZvID0gdGhpcy5nZXRIYWxsb3dzQnlJZChkYXRhLmlkKTtcbiAgICAgICAgaWYoIWhhbGxvd3Nfdm8pe1xuICAgICAgICAgICAgaGFsbG93c192byA9IG5ldyBIYWxsb3dzVm8oKTtcbiAgICAgICAgICAgIHRoaXMuaGFsbG93c19saXN0W2RhdGEuaWRdID0gaGFsbG93c192byA7XG4gICAgICAgIH1cbiAgICAgICAgaGFsbG93c192by5pbml0QXR0cmlidXRlRGF0YShkYXRhKTtcbiAgICAgICAgLy8g6K6h566X56We5Zmo57qi54K5XG4gICAgICAgIHRoaXMudXBkYXRlUmVkUG9pbnQoKVxuICAgIH0sXG5cbiAgICAvL+ebkea1i+e6oueCuVxuICAgIHVwZGF0ZUhhbGxvd3NSZWRTdGF0dXM6ZnVuY3Rpb24oIGJpZCwgc3RhdHVzICl7XG4gICAgICAgIHZhciBfc3RhdHVzID0gdGhpcy5oYWxsb3dzX3JlZF9saXN0W2JpZF07XG4gICAgICAgIGlmKF9zdGF0dXMgPT0gc3RhdHVzKXJldHVybjtcbiAgICAgICAgdGhpcy5oYWxsb3dzX3JlZF9saXN0W2JpZF0gPSBzdGF0dXM7XG5cbiAgICAgICAgTWFpbnVpQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNldEJ0blJlZFBvaW50KE1haW51aUNvbnN0LmJ0bl9pbmRleC5oYWxsb3dzLCB7IGJpZDogYmlkLCBzdGF0dXM6IHN0YXR1cyB9KTtcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShIYWxsb3dzRXZlbnQuSGFsbG93c1JlZFN0YXR1cywgYmlkLCBzdGF0dXMpO1xuICAgIH0sXG5cbiAgICAvLyDmoLnmja7nuqLngrnnsbvlnovliKTmlq3mmK/lkKbmmL7npLrnuqLngrlcbiAgICBjaGVja1JlZElzU2hvd0J5UmVkVHlwZTpmdW5jdGlvbiggcmVkVHlwZSApe1xuICAgICAgICByZXR1cm4gdGhpcy5oYWxsb3dzX3JlZF9saXN0W3JlZFR5cGVdIHx8IGZhbHNlO1xuICAgIH0sXG5cbiAgICAvL+WIpOaWreelnuWZqOaYr+WQpuaciee6oueCuVxuICAgIGdldEhhbGxvd3NSZWRTdGF0dXM6ZnVuY3Rpb24oICApe1xuICAgICAgICB2YXIgcmVkX3N0YXR1cyA9IGZhbHNlO1xuICAgICAgICBmb3IodmFyIGkgaW4gdGhpcy5oYWxsb3dzX3JlZF9saXN0KXtcbiAgICAgICAgICAgIGlmKHRoaXMuaGFsbG93c19yZWRfbGlzdFtpXSl7XG4gICAgICAgICAgICAgICAgcmVkX3N0YXR1cyA9IHRydWVcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWRfc3RhdHVzXG4gICAgfSxcblxuICAgIHVwZGF0ZVJlZFBvaW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgUmVkTWdyLmdldEluc3RhbmNlKCkuYWRkQ2FsSGFuZGxlcih0aGlzLmNoZWNrSGFsbG93c1JlZFN0YXR1cy5iaW5kKHRoaXMpLCBSZWRJZHMuSGFsbG93KTtcbiAgICB9LFxuXG4gICAgY2hlY2tIYWxsb3dzUmVkU3RhdHVzOmZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciBzaG93X3JlZCA9IGZhbHNlOyAgICBcbiAgICAgICAgaWYodGhpcy5jaGVja0lzSGF2ZUFsbEhhbGxvd3MoKSl7Ly/mmK/lkKbmv4DmtLvmiYDmnInnpZ7lmahcbiAgICAgICAgICAgLy/mjInnhafnrYnnuqfjgIHov5vluqbjgIFpZOaOkuW6j++8jOWPluWHuuesrOS4gOS4quelnuWZqOadpeWIpOaWree6oueCuVxuICAgICAgICAgICAgdmFyIHNvcnRfZnVuYyA9IGZ1bmN0aW9uKG9iakEsIG9iakIpe1xuICAgICAgICAgICAgICAgIGlmKG9iakEuc3RlcCE9b2JqQi5zdGVwKXtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iakIuc3RlcCAtIG9iakEuc3RlcDtcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZihvYmpBLmx1Y2t5ICE9IG9iakIubHVja3kpe1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqQi5sdWNreSAtIG9iakEubHVja3k7XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmpCLmlkIC0gb2JqQS5pZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaGFsbG93c19saXN0ID0gVXRpbHMuZGVlcENvcHkodGhpcy5oYWxsb3dzX2xpc3QpO1xuICAgICAgICAgICAgaGFsbG93c19saXN0LnNvcnQoc29ydF9mdW5jKTtcbiAgICAgICAgICAgIHZhciBoYWxsb3dzX3ZvID0gaGFsbG93c19saXN0WzBdO1xuICAgICAgICAgICAgaWYoaGFsbG93c192byl7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRSZWRIYWxsb3dzSWQoaGFsbG93c192by5pZCk7XG4gICAgICAgICAgICAgICAgdmFyIHJvbGVfdm8gPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpO1xuICAgICAgICAgICAgICAgIC8vIOelnuWZqOWNh+e6p1xuICAgICAgICAgICAgICAgIHZhciBoYWxsb3dzX2NvbmZpZyA9IGdkYXRhKFwiaGFsbG93c19kYXRhXCIsXCJkYXRhX2luZm9cIixVdGlscy5nZXROb3JLZXkoaGFsbG93c192by5pZCwgaGFsbG93c192by5zdGVwKSk7XG4gICAgICAgICAgICAgICAgdmFyIGNvc3RfY29uZmlnID0gaGFsbG93c19jb25maWcubG9zcztcbiAgICAgICAgICAgICAgICBpZihjb3N0X2NvbmZpZyAmJiBVdGlscy5uZXh0KGNvc3RfY29uZmlnKSE9bnVsbCl7XG4gICAgICAgICAgICAgICAgICAgIGZvcih2YXIgaSBpbiBjb3N0X2NvbmZpZyl7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmlkID0gY29zdF9jb25maWdbaV1bMF07XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbnVtID0gY29zdF9jb25maWdbaV1bMV07XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGF2ZV9udW0gPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFzc2VydCA9IENvbmZpZy5pdGVtX2RhdGEuZGF0YV9hc3NldHNfaWQybGFiZWxbYmlkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFzc2VydCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZV9udW0gPSByb2xlX3ZvW2Fzc2VydF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlX251bSA9IEJhY2twYWNrQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0SXRlbU51bUJ5QmlkKGJpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihoYXZlX251bSA8IG51bSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19yZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19yZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUhhbGxvd3NSZWRTdGF0dXMoSGFsbG93c0NvbnN0LlJlZF9JbmRleC5oYWxsb3dzX2x2dXAsIHNob3dfcmVkKTtcbiAgICAgICAgICAgICAgICAvLyDnpZ7lmajmioDog73ljYfnuqdcbiAgICAgICAgICAgICAgICBzaG93X3JlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIC8vIOelnuWZqOaKgOiDveWNh+e6p1xuICAgICAgICAgICAgICAgIHZhciBza2lsbF9jb25maWcgPSBnZGF0YShcImhhbGxvd3NfZGF0YVwiLFwiZGF0YV9za2lsbF91cFwiLFV0aWxzLmdldE5vcktleShoYWxsb3dzX3ZvLmlkLCBoYWxsb3dzX3ZvLnNraWxsX2xldikpO1xuICAgICAgICAgICAgICAgIGlmKHNraWxsX2NvbmZpZyAmJiBza2lsbF9jb25maWcubGV2X2xpbWl0ICE9IDAgJiYgc2tpbGxfY29uZmlnLmxldl9saW1pdCA8PSBoYWxsb3dzX3ZvLnN0ZXApe1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29zdF9jb25maWcgPSBza2lsbF9jb25maWcubG9zZTtcbiAgICAgICAgICAgICAgICAgICAgaWYoY29zdF9jb25maWcgJiYgVXRpbHMubmV4dChjb3N0X2NvbmZpZykhPW51bGwpe1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yKHZhciBqIGluIGNvc3RfY29uZmlnKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmlkID0gY29zdF9jb25maWdbal1bMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG51bSA9IGNvc3RfY29uZmlnW2pdWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoYXZlX251bSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFzc2VydCA9IENvbmZpZy5pdGVtX2RhdGEuZGF0YV9hc3NldHNfaWQybGFiZWxbYmlkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhc3NlcnQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlX251bSA9IHJvbGVfdm9bYXNzZXJ0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZV9udW0gPSBCYWNrcGFja0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldEl0ZW1OdW1CeUJpZChiaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGhhdmVfbnVtIDwgbnVtKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19yZWQgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X3JlZCA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVIYWxsb3dzUmVkU3RhdHVzKEhhbGxvd3NDb25zdC5SZWRfSW5kZXguc2tpbGxfbHZ1cCwgc2hvd19yZWQpO1xuXG4gICAgICAgICAgICAgICAgLy8g5piv5ZCm5Y+v5Lul5L2/55So5Zyj5Y2w55+zXG4gICAgICAgICAgICAgICAgc2hvd19yZWQgPSBmYWxzZVxuICAgICAgICAgICAgICAgIHZhciB0cmFjZV9jb25maWcgPSBnZGF0YShcImhhbGxvd3NfZGF0YVwiLFwiZGF0YV90cmFjZV9jb3N0XCIsVXRpbHMuZ2V0Tm9yS2V5KGhhbGxvd3Nfdm8uaWQsIGhhbGxvd3Nfdm8uc3RlcCkpO1xuICAgICAgICAgICAgICAgIHZhciBpZF9zdG9uZV9jb25maWcgPSBDb25maWcuaGFsbG93c19kYXRhLmRhdGFfY29uc3RbXCJpZF9zdG9uZVwiXTtcbiAgICAgICAgICAgICAgICBpZih0cmFjZV9jb25maWcgJiYgaWRfc3RvbmVfY29uZmlnKXtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGhhdmVfbnVtID0gQmFja3BhY2tDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5nZXRCYWNrUGFja0l0ZW1OdW1CeUJpZChpZF9zdG9uZV9jb25maWcudmFsKTtcbiAgICAgICAgICAgICAgICAgICAgaWYoaGFsbG93c192by5zZWFsIDwgdHJhY2VfY29uZmlnLm51bSAmJiBoYXZlX251bSA+IDApe1xuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19yZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlSGFsbG93c1JlZFN0YXR1cyhIYWxsb3dzQ29uc3QuUmVkX0luZGV4LnN0b25lX3VzZSwgc2hvd19yZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g5b2T5LuO56We5Zmo5Lu75Yqh55WM6Z2i5Y+Y5Li656We5Zmo55WM6Z2i5pe277yM6KaB5YWI5riF5LiA5LiL5Lu75Yqh55qE57qi54K5XG4gICAgICAgICAgICBpZih0aGlzLmNoZWNrUmVkSXNTaG93QnlSZWRUeXBlKEhhbGxvd3NDb25zdC5SZWRfSW5kZXgudGFza19hd2FyZCkpe1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlSGFsbG93c1JlZFN0YXR1cyhIYWxsb3dzQ29uc3QuUmVkX0luZGV4LnRhc2tfYXdhcmQsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBzaG93X3JlZCA9IHRoaXMuY2hlY2tIYWxsb3dzQXdhcmRUaXBzKCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUhhbGxvd3NSZWRTdGF0dXMoSGFsbG93c0NvbnN0LlJlZF9JbmRleC50YXNrX2F3YXJkLCBzaG93X3JlZClcbiAgICAgICAgfVxuICAgIH0sXG5cblxuICAgIC8vIOS/neWtmOS4gOS4i+aYvuekuue6oueCueeahOelnuWZqGlkKOetiee6p+acgOmrmOeahClcbiAgICBzZXRSZWRIYWxsb3dzSWQ6ZnVuY3Rpb24oIGlkICl7XG4gICAgICAgIHZhciBvbGRfaWQgPSB0aGlzLnJlZF9oYWxsb3dzX2lkO1xuICAgICAgICB0aGlzLnJlZF9oYWxsb3dzX2lkID0gaWQ7XG4gICAgICAgIFxuICAgICAgICBpZihvbGRfaWQgIT0gdGhpcy5yZWRfaGFsbG93c19pZCl7XG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEhhbGxvd3NFdmVudC5IYWxsb3dzUmVkU3RhdHVzKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICB9LFxuXG4gICAgZ2V0UmVkSGFsbG93c0lkOmZ1bmN0aW9uKCAgKXtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVkX2hhbGxvd3NfaWQ7XG4gICAgfSxcbiAgICBcbiAgICAvL+i/lOWbnuWco+WZqOaVsOaNrlxuICAgIGdldEhhbGxvd3NCeUlkOmZ1bmN0aW9uKGlkKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFsbG93c19saXN0W2lkXTtcbiAgICB9LFxuXG4gICAgLy/lvZPliY3mgLvnu5PmnZ9cbiAgICBjdXJUb3RhbFN0ZXA6ZnVuY3Rpb24oKXtcbiAgICAgICAgdmFyIHN0ZXAgPSAwO1xuICAgICAgICBmb3IodmFyIGkgaW4gdGhpcy5oYWxsb3dzX2xpc3Qpe1xuICAgICAgICAgICAgc3RlcCA9IHN0ZXAgKyB0aGlzLmhhbGxvd3NfbGlzdFtpXS5zdGVwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGVwO1xuICAgIH0sXG4gICAgXG4gICAgLy/ojrflj5blnKPlmajliJfooahcbiAgICBnZXRIYWxsb3dzTGlzdDpmdW5jdGlvbigpe1xuICAgICAgICB2YXIgbGlzdCA9IFtdO1xuICAgICAgICBmb3IodmFyIGkgaW4gdGhpcy5oYWxsb3dzX2xpc3Qpe1xuICAgICAgICAgICAgbGlzdC5wdXNoKHRoaXMuaGFsbG93c19saXN0W2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGlzdDtcbiAgICB9LFxuXG4gICAgLy/lnKPlmajlhbHpuKPnrYnnuqdcbiAgICBnZXRSZXNvbmF0ZUxldjpmdW5jdGlvbigpe1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgLy9yZXR1cm4gc2VsZi5yZXNvbmF0ZV9sZXYgXG4gICAgfSxcblxuICAgIC8v6I635Y+W5LiK6Zi15LyZ5Ly05pWw5o2uXG4gICAgZ2V0Rm9ybUluZm86ZnVuY3Rpb24oKXtcbiAgICAgICAgaWYoVXRpbHMubmV4dCh0aGlzLmF0dHJfcmF0aW9fbGlzdCkgPT0gbnVsbCl7XG4gICAgICAgICAgICBmb3IodmFyIGkgaW4gQ29uZmlnLmhhbGxvd3NfZGF0YS5kYXRhX2F0dHJfcmFkaW8pe1xuICAgICAgICAgICAgICAgIHZhciBpbmZvID0gQ29uZmlnLmhhbGxvd3NfZGF0YS5kYXRhX2F0dHJfcmFkaW9baV07XG4gICAgICAgICAgICAgICAgZm9yKHZhciBqIGluIGluZm8ucmF0aW8pe1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cl9rZXkgPSBpbmZvLnJhdGlvW2ldWzBdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmF0aW8gPSBpbmZvLnJhdGlvW2ldWzFdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF0dHJfcmF0aW9fbGlzdFtVdGlscy5nZXROb3JLZXkoaW5mby50eXBlLCBhdHRyX2tleSldID0gcmF0aW9cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHR5cGVfbGlzdCA9IHt9O1xuICAgICAgICB2YXIgcGFydG5lcl9tb2RlbCA9IEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKTtcbiAgICAgICAgaWYocGFydG5lcl9tb2RlbCl7XG4gICAgICAgICAgICB2YXIgZm9ybV9wb3NfbGlzdCA9IHBhcnRuZXJfbW9kZWwuZ2V0TXlQb3NMaXN0KCk7XG4gICAgICAgICAgICBmb3IodmFyIGsgaW4gZm9ybV9wb3NfbGlzdCl7XG4gICAgICAgICAgICAgICAgdmFyIHZvID0gcGFydG5lcl9tb2RlbC5nZXRIZXJvQnlJZChmb3JtX3Bvc19saXN0W2tdLmlkKTtcbiAgICAgICAgICAgICAgICBpZih2byl7XG4gICAgICAgICAgICAgICAgICAgIGlmKHR5cGVfbGlzdFt2by50eXBlXSA9PSBudWxsKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfbGlzdFt2by50eXBlXSA9IDBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0eXBlX2xpc3Rbdm8udHlwZV0gPSB0eXBlX2xpc3Rbdm8udHlwZV0gKyAxXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0eXBlX2xpc3Q7XG4gICAgfSxcblxuICAgIGdldFJhdGlvOmZ1bmN0aW9uKHR5cGUsIGF0dHJfa2V5KXtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXR0cl9yYXRpb19saXN0W1V0aWxzLmdldE5vcktleSh0eXBlLCBhdHRyX2tleSldXG4gICAgfSxcblxuICAgIC8vIOWco+WZqOS7u+WKoeWIl+ihqFxuICAgIHVwZGF0ZUhhbGxvd3NUYXNrOmZ1bmN0aW9uKGxpc3Qpe1xuICAgICAgICBpZihsaXN0ID09IG51bGwgfHwgVXRpbHMubmV4dChsaXN0KSA9PSBudWxsKXJldHVybjtcbiAgICAgICAgaWYodGhpcy5oYWxsb3dzX3Rhc2tfbGlzdCA9PSBudWxsKXtcbiAgICAgICAgICAgIHRoaXMuaGFsbG93c190YXNrX2xpc3QgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBmb3IodmFyIGkgaW4gbGlzdCl7XG4gICAgICAgICAgICB0aGlzLmhhbGxvd3NfdGFza19saXN0W2xpc3RbaV0uaWRdID0gbGlzdFtpXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZVJlZFBvaW50KCk7XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoSGFsbG93c0V2ZW50LlVwZGF0ZUhhbGxvd3NUYXNrRXZlbnQpO1xuICAgIH0sXG5cbiAgICAvLyDojrflj5bmjIflrprlnKPlmajnmoTku7vliqHliJfooagsIOi/meS4qmlk5piv5Zyj5Zmo55qEaWQsXG4gICAgZ2V0SGFsbG93c1Rhc2tMaXN0OmZ1bmN0aW9uKGlkKXtcbiAgICAgICAgdmFyIHRhc2tfbGlzdCA9IFtdO1xuICAgICAgICB2YXIgaGFsbG93c190YXNrX2NvbmZpZyA9IENvbmZpZy5oYWxsb3dzX2RhdGEuZGF0YV90YXNrO1xuICAgICAgICBpZih0aGlzLmhhbGxvd3NfdGFza19saXN0KXtcbiAgICAgICAgICAgIGZvcih2YXIgaSBpbiB0aGlzLmhhbGxvd3NfdGFza19saXN0KXtcbiAgICAgICAgICAgICAgICB2YXIgY29uZmlnID0gaGFsbG93c190YXNrX2NvbmZpZ1t0aGlzLmhhbGxvd3NfdGFza19saXN0W2ldLmlkXTtcbiAgICAgICAgICAgICAgICBpZihjb25maWcuaGlkID09IGlkKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYWxsb3dzX3Rhc2tfbGlzdFtpXS5zb3J0ID0gY29uZmlnLnNvcnQ7XG4gICAgICAgICAgICAgICAgICAgIHRhc2tfbGlzdC5wdXNoKHRoaXMuaGFsbG93c190YXNrX2xpc3RbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZihVdGlscy5uZXh0KHRhc2tfbGlzdCkpe1xuICAgICAgICAgICAgdGFza19saXN0LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5pZCAtIGIuaWQ7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXNrX2xpc3Q7XG4gICAgfSxcblxuICAgIC8vIOiOt+WPluaMh+WumuS7u+WKoeaVsOaNrlxuICAgIGdldEhhbGxvd3NUYWtzOmZ1bmN0aW9uKGlkKXtcbiAgICAgICAgaWYodGhpcy5oYWxsb3dzX3Rhc2tfbGlzdCl7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYWxsb3dzX3Rhc2tfbGlzdFtpZF07XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g6I635Y+W5b2T5YmN5b6F5r+A5rS755qE5Zyj5ZmoaWRcbiAgICBnZXRDdXJBY3Rpdml0eUhhbGxvd3NJZDpmdW5jdGlvbigpe1xuICAgICAgICBpZih0aGlzLmhhbGxvd3NfbGlzdCA9PSBudWxsIHx8IFV0aWxzLm5leHQodGhpcy5oYWxsb3dzX2xpc3QpID09IG51bGwpey8vLS0g56ys5LiA5Liq5Zyj5ZmoXG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbmV4dF9pZCA9IDA7XG4gICAgICAgIGZvcih2YXIgaSBpbiB0aGlzLmhhbGxvd3NfbGlzdCl7XG4gICAgICAgICAgICBpZihuZXh0X2lkPHRoaXMuaGFsbG93c19saXN0W2ldLmlkKXtcbiAgICAgICAgICAgICAgICBuZXh0X2lkID0gdGhpcy5oYWxsb3dzX2xpc3RbaV0uaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChuZXh0X2lkICsgMSkgICAgICAgICAgICAvLyDlj5blh7rlvZPliY3lvoXmv4DmtLvnmoTlnKPlmajnmoRpZFxuICAgIH0sXG5cbiAgICAvLyDlvZPliY3lvoXmv4DmtLvnmoTnpZ7lmajmmK/lkKbmnInlj6/pooblj5bnmoTku7vliqHlpZblirFcbiAgICBjaGVja0hhbGxvd3NBd2FyZFRpcHM6ZnVuY3Rpb24oKXtcbiAgICAgICAgaWYodGhpcy5oYWxsb3dzX3Rhc2tfbGlzdCA9PSBudWxsIHx8IFV0aWxzLm5leHQodGhpcy5oYWxsb3dzX3Rhc2tfbGlzdCkgPT0gbnVsbCl7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGN1cl9oYWxsb3dzX2lkID0gdGhpcy5nZXRDdXJBY3Rpdml0eUhhbGxvd3NJZCgpO1xuICAgICAgICB2YXIgdGFza19saXN0ID0gdGhpcy5nZXRIYWxsb3dzVGFza0xpc3QoY3VyX2hhbGxvd3NfaWQpO1xuICAgICAgICBpZih0YXNrX2xpc3QgPT0gbnVsbCB8fCBVdGlscy5uZXh0KHRhc2tfbGlzdCkgPT0gbnVsbCl7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yKHZhciBpIGluIHRhc2tfbGlzdCl7XG4gICAgICAgICAgICBpZih0YXNrX2xpc3RbaV0uZmluaXNoID09IDEpe1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuXG4gICAgLy8g6I635Y+W5b2T5YmN5piv5ZCm5bey57uP5r+A5rS75omA5pyJ56We5ZmoXG4gICAgY2hlY2tJc0hhdmVBbGxIYWxsb3dzOmZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciBtYXhfY291bnQgPSBDb25maWcuaGFsbG93c19kYXRhLmRhdGFfYmFzZV9sZW5ndGg7XG4gICAgICAgIHZhciBjdXJfY291bnQgPSAwO1xuICAgICAgICBmb3IodmFyIGkgaW4gdGhpcy5oYWxsb3dzX2xpc3Qpe1xuICAgICAgICAgICAgY3VyX2NvdW50ID0gY3VyX2NvdW50ICsgMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGN1cl9jb3VudD49bWF4X2NvdW50KTtcbiAgICB9LFxuICAgIFxuICAgIC8vIOiuvue9ruaYr+WQpuaJk+W8gOi/h+elnuWZqOeVjOmdoueahOagh+iusFxuICAgIHNldE9wZW5IYWxsb3dzRmxhZzpmdW5jdGlvbiggZmxhZyApe1xuICAgICAgICB0aGlzLm9wZW5fZmxhZyA9IGZsYWc7XG4gICAgfSxcblxuICAgIC8vMSDkuLrmiZPlvIDov4fvvIwy5Li65rKh5omT5byA6L+HXG4gICAgZ2V0SGFsbG93c09wZW5GbGFnOmZ1bmN0aW9uKCAgKXtcbiAgICAgICAgcmV0dXJuIHRoaXMub3Blbl9mbGFnO1xuICAgIH0sXG5cbiAgICAvLyDmoLnmja7npZ7lmahpZO+8jOS7jumFjee9ruihqOaVsOaNruS4reiOt+WPluivpeelnuWZqOacgOmrmOWxnuaAp+aVsOaNrlxuICAgIG1ha2VIaWdoZXN0SGFsbG93Vm86ZnVuY3Rpb24oIGhhbGxvd3NfaWQgKXtcbiAgICAgICAgaWYoaGFsbG93c19pZCl7XG4gICAgICAgICAgICB2YXIgaGFsbG93c192byA9IG5ldyBIYWxsb3dzVm8oKTtcbiAgICAgICAgICAgIHZhciBtYXhfbHYgPSBDb25maWcuaGFsbG93c19kYXRhLmRhdGFfbWF4X2xldltoYWxsb3dzX2lkXTtcbiAgICAgICAgICAgIHZhciBtYXhfc2tpbGxfbHYgPSBDb25maWcuaGFsbG93c19kYXRhLmRhdGFfc2tpbGxfbWF4X2xldltoYWxsb3dzX2lkXTtcbiAgICAgICAgICAgIHZhciBjb25maWdfaW5mbyA9IGdkYXRhKFwiaGFsbG93c19kYXRhXCIsXCJkYXRhX2luZm9cIixVdGlscy5nZXROb3JLZXkoaGFsbG93c19pZCwgbWF4X2x2KSk7XG4gICAgICAgICAgICB2YXIgY29uZmlnX3NraWxsID0gZ2RhdGEoXCJoYWxsb3dzX2RhdGFcIixcImRhdGFfc2tpbGxfdXBcIixVdGlscy5nZXROb3JLZXkoaGFsbG93c19pZCwgbWF4X3NraWxsX2x2KSk7O1xuICAgICAgICAgICAgdmFyIGF0dHJfZGF0YSA9IFtdO1xuICAgICAgICAgICAgZm9yKHZhciBpIGluIGNvbmZpZ19pbmZvLmF0dHIpe1xuICAgICAgICAgICAgICAgIHZhciBhdHRyX3N0ciA9IGNvbmZpZ19pbmZvLmF0dHJbaV1bMF07XG4gICAgICAgICAgICAgICAgdmFyIGF0dHJfdGVtcCA9IHt9XG4gICAgICAgICAgICAgICAgYXR0cl90ZW1wLmF0dHJfaWQgPSBDb25maWcuYXR0cl9kYXRhLmRhdGFfa2V5X3RvX2lkW2F0dHJfc3RyXVxuICAgICAgICAgICAgICAgIGF0dHJfdGVtcC5hdHRyX3ZhbCA9IGNvbmZpZ19pbmZvLmF0dHJbaV1bMV1cbiAgICAgICAgICAgICAgICBhdHRyX2RhdGEucHVzaChhdHRyX3RlbXApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFsbG93c192by5pZCA9IGhhbGxvd3NfaWQ7XG4gICAgICAgICAgICBoYWxsb3dzX3ZvLnN0ZXAgPSBtYXhfbHY7XG4gICAgICAgICAgICBoYWxsb3dzX3ZvLmFkZF9hdHRyID0gYXR0cl9kYXRhO1xuICAgICAgICAgICAgaGFsbG93c192by5za2lsbF9iaWQgPSBjb25maWdfc2tpbGwuc2tpbGxfYmlkO1xuICAgICAgICAgICAgaGFsbG93c192by5za2lsbF9sZXYgPSBtYXhfc2tpbGxfbHY7XG4gICAgXG4gICAgICAgICAgICByZXR1cm4gaGFsbG93c192bztcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfX2RlbGV0ZTpmdW5jdGlvbigpe1xuXG4gICAgfSxcbn0pOyJdfQ==