(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/mod/hero/hero_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, 'cab3eqqKGZLUJgBvXKUXy/7', 'hero_model'); // Scripts/mod/hero/hero_model.js "use strict"; // -------------------------------------------------------------------- // @author: xxx@syg.com(必填, 创建模块的人员) // @description: // 这里填写详细说明,主要填写该模块的功能简要 //
Create: {DATE} // -------------------------------------------------------------------- var HeroConst = require("hero_const"); var PartnerConst = require("partner_const"); var HeroEvent = require("hero_event"); var PartnerCalculate = require("partner_calculate"); var HeroCalculate = require("hero_calculate"); var HeroController = require("hero_controller"); var BackpackController = require("backpack_controller"); var HeroModel = cc.Class({ "extends": BaseClass, ctor: function ctor() { this.ctrl = arguments[0]; }, properties: {}, initConfig: function initConfig() { // 伙伴数据列表 (id :英雄唯一标识) // 结构 this.hero_list[id] = hero_vo this.hero_list = {}; // 伙伴bid列表的 // 结构 this.hero_bid_list[bid] = {hero_vo1,hero_vo2} this.hero_bid_list = {}; // 伙伴数据数组形式存储,便于排序 this.hero_array = []; // 标志第一次初始 this.is_init = true; // 英雄上限 this.hero_max_count = 0; // 英雄已激活上限次数 this.buy_num = 0; //皮肤数据 结构: self.hero_skin_list[皮肤id] = 皮肤结束时间 (如果时间 == 0 表永久) this.hero_skin_list = null; // 英雄图书馆信息 this.dic_pokedex_info = null; // 英雄图书馆信息 [bid] = 数据 this.dic_pokedex_bid = {}; // 熔炼祭坛的列表 this.dic_fuse_info = null; // 已拥过有英雄id [bid] = 1 this.dic_had_hero_info = {}; // 布阵站位信息 this.pos_list[布阵类型][pos] = id this.pos_list = {}; this.expedit_list = null; // 阵法类型 this.use_formation_type = 1; // 使用的圣器id this.use_hallows_id = 0; // 装备红点背包已更新 记录 this.is_equip_redpoint_bag_update = true; // 装备红点英雄已更新 记录 this.is_equip_redpoint_hero_update = true; // 是否延迟红点更新中 例子:this.is_delay_redpoint_update[HeroConst.RedPointType.eRPLevelUp] = true // 目前只有升级红点用 this.is_delay_redpoint_update = {}; // 进阶和升星材料消耗 只能写死 如果策划改了.跟着改吧 this.upgrade_star_cost_id = 10001; // 升星红点背包已更新 记录 this.is_upgradestar_redpoint_bag_update = true; // 升星红点英雄已更新 记录 this.is_upgradestar_redpoint_hero_update = true; // 阵法 红点 (一次性的) this.is_redpoint_form = false; // 圣器 红点 (一次性的) this.is_redpoint_hallows = false; // 记录登陆时候角色的等级 判断阵法是否新解锁用 this.record_login_lev = 0; // 符文解锁条件信息 // var artifact_one = Config.partner_data.data_partner_const["artifact_one"].val; // var artifact_two = Config.partner_data.data_partner_const["artifact_two"].val; // this.artifact_lock_list = {"1":artifact_one, "2":artifact_two}; this.artifact_lucky = 0; // 符文祝福值 this.artifact_lucky_red = false; // 祝福值红点 // 英雄信息界面 升星页签的参数 6星才限时页签(后面策划要求熔炼祭坛的也加入) this.hero_info_upgrade_star_param = 6; this.hero_info_upgrade_star_param2 = 10; this.hero_info_upgrade_star_param3 = 11; // --英雄信息界面 天赋页签的参数 6星才限时页签 this.hero_info_talent_skill_param = Config.partner_skill_data.data_partner_skill_const["skill_slot"].val; // --天赋技能升星的材料 this.talent_skill_cost_id = 10450; // --天赋技能可学习的列表 用于红点 结构 self.dic_hero_talent_skill_learn_redpoint[skill_id] = 1 this.dic_hero_talent_skill_learn_redpoint = {}; this.is_need_update_talent_redpoint = true; }, setHeroMaxCount: function setHeroMaxCount(max_count) { if (typeof max_count == "number") { this.hero_max_count = max_count; } }, // 获取英雄上上限 getHeroMaxCount: function getHeroMaxCount() { var max_count = this.hero_max_count || 0; var have_coutn = this.hero_array.length; return { max_count: max_count, have_coutn: have_coutn }; }, setHeroBuyNum: function setHeroBuyNum(buy_num) { this.buy_num = Number(buy_num); }, getHeroBuyNum: function getHeroBuyNum() { return this.buy_num || 0; }, /** * 更新英雄列表 * @author zhanghuxing 2019-01-24 * @param {[type]} not_show_power 不显示战力变化提示 */ updateHeroList: function updateHeroList(hero_list, is_add, not_show_power) { if (!hero_list) return; for (var hero_i in hero_list) { this.updateHeroVo(hero_list[hero_i], not_show_power); } // 熔炼祭坛的红点 新增需要重新算红点 if (is_add) { HeroCalculate.getInstance().clearAllStarFuseRedpointRecord(); gcore.GlobalEvent.fire(HeroEvent.Hero_Data_Add, hero_list); } this.is_init = false; }, /** * 更新单个英雄信息,如果没有则是新增; */ updateHeroVo: function updateHeroVo(info, not_show_power) { if (!info) return; info.id = info.partner_id; var bid = info.partner_bid || info.bid; if (!bid && this.hero_list[info.id]) bid = this.hero_list[info.id].bid; var par_cfg = Config.partner_data.data_partner_base[bid]; if (!par_cfg) return; var is_add = false; var hero_vo = this.hero_list[info.id]; if (!hero_vo) { is_add = true; var HeroVo = require("hero_vo"); hero_vo = this.hero_list[info.id] = new HeroVo(); for (var config_k in par_cfg) { if (config_k !== "skills") info[config_k] = par_cfg[config_k]; } // 设置角色id var RoleController = require("role_controller"); var role_vo = RoleController.getInstance().getRoleVo(); if (role_vo) { info.rid = role_vo.rid; info.srv_id = role_vo.srv_id; } } // 旧数据 var old_vo = null; var open_type = 0; if (!is_add) { // 处理战力提升特效 if (!not_show_power && hero_vo.power < info.power) { GlobalMessageMgr.getInstance().showPowerMove(info.power - hero_vo.power, null, hero_vo.power); } // 处理升星、进阶 if (info.star && hero_vo.star < info.star) { // 升星 open_type = 1; old_vo = Utils.deepCopy(hero_vo); if (hero_vo.star == this.hero_info_talent_skill_param[1] - 1) { hero_vo.is_open_talent = true; } } else if (info.break_lev && hero_vo.break_lev < info.break_lev) { // 进阶 open_type = 2; old_vo = Utils.deepCopy(hero_vo); } } else {} // 更新最大星级 var cur_star = info.star || par_cfg.init_star; if (this.dic_had_hero_info[bid]) { if (this.dic_had_hero_info[bid] < cur_star) this.dic_had_hero_info[bid] = cur_star; } else { this.dic_had_hero_info[bid] = cur_star; } hero_vo.updateHeroVo(info); if (is_add) { this.hero_array.push(hero_vo); if (!this.hero_bid_list[hero_vo.bid]) { this.hero_bid_list[hero_vo.bid] = []; } this.hero_bid_list[hero_vo.bid].push(hero_vo); } else { if (open_type == 1 && old_vo) { // 打开升星成功界面 this.ctrl.openHeroUpgradeStarExhibitionPanel(true, old_vo, hero_vo); HeroCalculate.getInstance().clearAllHeroRecordByRedPointType(HeroConst.RedPointType.eRPStar); } else if (open_type == 2 && old_vo) { // 打开进阶成功界面 this.ctrl.openBreakExhibitionWindow(true, old_vo, hero_vo); } gcore.GlobalEvent.fire(HeroEvent.Hero_Data_Update, hero_vo); } HeroCalculate.getInstance().checkHeroRedPointByRedPointType(HeroConst.RedPointType.eRPLevelUp); cc.log("updateHeroVo"); }, // 获取单个伙伴数据,id // @id 是英雄唯一标识id getHeroById: function getHeroById(partner_id) { if (!this.hero_list) return; if (!partner_id || typeof partner_id != "number") return; return this.hero_list[partner_id] || {}; }, // 删除英雄 delHeroDataList: function delHeroDataList(list) { if (!list) return; cc.log("delHeroDataList"); for (var hero_i in list) { var v = list[hero_i]; var temp_bid = this.hero_list[v.partner_id].bid; delete this.hero_list[list[hero_i].partner_id]; // --同时从bid英雄列表删除该英雄记录 var bidlist = this.hero_bid_list[temp_bid]; if (bidlist) { for (var i = 0; i < bidlist.length; ++i) { var hero_vo = bidlist[i]; if (hero_vo.partner_id == v.partner_id) { bidlist.splice(i, 1); } } } } this.hero_array = []; for (var hero_i in this.hero_list) { this.hero_array.push(this.hero_list[hero_i]); } // 消除熔炼祭坛的红点 删除也要重新算 HeroCalculate.getInstance().clearAllStarFuseRedpointRecord(); // 升星红点 this.is_upgradestar_redpoint_hero_update = true; this.checkUpgradeStarRedPointUpdate(); gcore.GlobalEvent.fire(HeroEvent.Del_Hero_Event, list); }, // --更新天赋信息 updateHeroVoTalent: function updateHeroVoTalent(data_list, is_not_check) { var is_team = false; var self = this; for (var i = 0; i < data_list.length; ++i) { var v = data_list[i]; if (self.hero_list[v.partner_id]) { self.hero_list[v.partner_id].updateSkill(v.dower_skill); if (!is_team) { if (self.hero_list[v.partner_id].isFormDrama()) { is_team = true; } } } } if (is_team && !is_not_check) { // --如果有剧情阵容的英雄..需要检查红点 // --检测红点 HeroCalculate.getInstance().checkAllHeroRedPoint(); } }, getHeroList: function getHeroList() { return this.hero_list || {}; }, getAllHeroArray: function getAllHeroArray() { return this.hero_array; }, // 根据阵容获取英雄列表 getHeroListByCamp: function getHeroListByCamp(camp) { if (typeof camp !== "number") return; var hero_list = []; for (var hero_i in this.hero_array) { if (camp === HeroConst.CampType.eNone || camp === this.hero_array[hero_i].camp_type) { // hero_list.push(Utils.deepCopy(this.hero_array[hero_i])); hero_list.push(this.hero_array[hero_i]); } } var hero_sort = this.getHeroSortFunc(); return hero_list.sort(hero_sort); }, // 根据阵容获取英雄列表 getDeepHeroListByCamp: function getDeepHeroListByCamp(camp) { if (typeof camp !== "number") return; var hero_list = []; for (var hero_i in this.hero_array) { if (camp === HeroConst.CampType.eNone || camp === this.hero_array[hero_i].camp_type) { // hero_list.push(Utils.deepCopy(this.hero_array[hero_i])); hero_list.push(this.hero_array[hero_i]); } } var hero_sort = this.getHeroSortFunc(); return Utils.deepCopy(hero_list.sort(hero_sort)); }, getRestHeroListByCamp: function getRestHeroListByCamp(camp) { if (typeof camp !== "number") return; var hero_list = []; for (var hero_i in this.hero_array) { if (camp === HeroConst.CampType.eNone || camp === this.hero_array[hero_i].camp_type) { hero_list.push(this.hero_array[hero_i]); } } var rest_hero_list = Utils.deepCopy(hero_list); for (var hero_i in rest_hero_list) { var hero_vo = rest_hero_list[hero_i]; if (hero_vo.is_in_form > 0 || hero_vo.is_lock) { hero_vo.is_ui_lock = true; } } var hero_sort = function hero_sort(role_vo1, role_vo2) { if (!role_vo1.is_ui_lock && !role_vo2.is_ui_lock || role_vo1.is_ui_lock && role_vo2.is_ui_lock) { if (role_vo1.star === role_vo2.star) { if (role_vo1.power == role_vo2.power) { if (role_vo1.lev == role_vo2.lev) { return role_vo2.sort_order - role_vo1.sort_order; } else { return role_vo1.lev - role_vo2.lev; } } else { return role_vo1.power - role_vo2.power; } } else { return role_vo1.star - role_vo2.star; } } else { if (role_vo1.is_ui_lock) return 1; return -1; } }; return rest_hero_list.sort(hero_sort); }, setHadHeroInfo: function setHadHeroInfo(list) { if (!list) return; for (var hero_i in list) { this.dic_had_hero_info[list[hero_i].partner_id] = list[hero_i].max_star; } }, // 初始化图鉴数据 getHeroPokedexList: function getHeroPokedexList(camp) { if (!this.dic_pokedex_info) { this.dic_pokedex_info = {}; for (var camp_i in HeroConst.CampType) { if (camp_i !== "eNone") this.dic_pokedex_info[HeroConst.CampType[camp_i]] = []; } var pokedex_cfg = Config.partner_data.data_partner_pokedex; if (pokedex_cfg) { for (var bid in pokedex_cfg) { var par_cfg = Config.partner_data.data_partner_base[bid]; for (var star_i in pokedex_cfg[bid]) { var star = pokedex_cfg[bid][star_i].star; var key = bid + "_" + star; var info = this.getHeroPokedexByBid(key); if (info) { this.dic_pokedex_info[info.camp_type].push(info); } } } } var sort_function = function sort_function(dic_pokedex_1, dic_pokedex_2) { if (dic_pokedex_1.star === dic_pokedex_2.star) { return dic_pokedex_1.bid - dic_pokedex_2.bid; } else { return dic_pokedex_1.star - dic_pokedex_2.star; } }; // 排序 for (var dic_pokedex_i in this.dic_pokedex_info) { this.dic_pokedex_info[dic_pokedex_i].sort(sort_function); } } return this.dic_pokedex_info[camp]; }, getHeroPokedexByBid: function getHeroPokedexByBid(key) { if (this.dic_pokedex_bid[key]) return this.dic_pokedex_bid[key]; var par_show_cfg = gdata("partner_data", "data_partner_show", key); if (!par_show_cfg) { return null; } var par_base_cfg = Config.partner_data.data_partner_base[par_show_cfg.bid]; if (par_base_cfg) { var break_lev = this.getHeroMaxBreakCountByInitStar(par_show_cfg.star); par_show_cfg.hp_max = par_show_cfg.hp; // 为了计算战力用的 par_show_cfg.power = PartnerCalculate.calculatePower(par_show_cfg); par_show_cfg.camp_type = par_base_cfg.camp_type; par_show_cfg.name = par_base_cfg.name; par_show_cfg.init_star = par_base_cfg.init_star; par_show_cfg.type = par_base_cfg.type; par_show_cfg.break_id = par_base_cfg.break_id; par_show_cfg.break_lev = break_lev; par_show_cfg.partner_id = par_show_cfg.bid * 10 + par_show_cfg.star; // 定义一个唯一id par_show_cfg.is_pokedex = true; // 是不是图鉴 this.dic_pokedex_bid[key] = par_show_cfg; return this.dic_pokedex_bid[key]; } return null; }, // 根据初始星级 或者对应英雄最大进阶次数 getHeroMaxBreakCountByInitStar: function getHeroMaxBreakCountByInitStar(init_star) { if (!this.dic_max_break) { var val = Config.partner_data.data_partner_const.advanced_limit.val; this.dic_max_break = {}; for (var val_i in val) { this.dic_max_break[val[val_i][0]] = val[val_i][1]; } } return this.dic_max_break[init_star] || 0; }, // 根据品质获取默认头像 getRandomHeroHeadByQuality: function getRandomHeroHeadByQuality(quality) { if (!this.dic_random_hero_head) { var val = Config.partner_data.data_partner_const.random_hero_icon.val; this.dic_random_hero_head = {}; for (var val_i in val) { var item_config = gdata("item_data", "data_unit5", val[val_i][1]); if (item_config) this.dic_random_hero_head[val[val_i][0]] = item_config.icon; } } var quality = quality || 0; if (quality > 5) quality = 5; return this.dic_random_hero_head[quality]; }, getHadHeroInfo: function getHadHeroInfo() { return this.dic_had_hero_info || {}; }, getHadHeroStarBybid: function getHadHeroStarBybid(bid) { if (this.dic_had_hero_info && this.dic_had_hero_info[bid]) { return this.dic_had_hero_info[bid]; } return null; }, isOpenTanlentByHerovo: function isOpenTanlentByHerovo(hero_vo) { if (hero_vo[this.hero_info_talent_skill_param[0]]) { if (hero_vo[this.hero_info_talent_skill_param[0]] >= this.hero_info_talent_skill_param[1]) { return true; } } return false; }, /************阵法相关************/ setFormList: function setFormList(data) { var form_type = data.type >= 0 ? data.type : PartnerConst.Fun_Form.Drama; if (this.pos_list[form_type]) { for (var form_i in this.pos_list[form_type]) { var vo = this.getHeroById(this.pos_list[form_type][form_i].id); if (vo && vo.updateFormPos) { vo.updateFormPos(0, form_type); } } } this.pos_list[form_type] = {}; for (var pos_i in data.pos_info) { this.pos_list[form_type][data.pos_info[pos_i].pos] = data.pos_info[pos_i]; var vo = this.getHeroById(data.pos_info[pos_i].id); // 容错处理 bugly出现说 updateFormPos 这个是 (a nil value) if (vo && vo.updateFormPos) vo.updateFormPos(data.pos_info[pos_i].pos, form_type); } // 剧情阵法逻辑 if (form_type == PartnerConst.Fun_Form.Drama) { this.form_power = data.power || 0; // 阵法类型 this.use_formation_type = data.formation_type; // 使用的圣器id this.use_hallows_id = data.hallows_id; // GlobalEvent:getInstance():Fire(HeroEvent.Form_Drama_Event,data) var calculate = HeroCalculate.getInstance(); RedMgr.getInstance().addCalHandler(calculate.checkAllHeroRedPoint.bind(calculate), RedIds.HeroAll); // 检测红点 // HeroCalculate.getInstance().checkAllHeroRedPoint(); var list = []; for (var k in this.pos_list[form_type]) { var v = this.pos_list[form_type][k]; list.push({ partner_id: v.id }); } // --请求天赋的 HeroController.getInstance().sender11099(list); } }, // 获取最高战力的英雄战力 getMaxFight: function getMaxFight() { if (this.hero_array) { this.hero_array.sort(Utils.tableUpperSorter(["power"])); var hero_vo = this.hero_array[0]; if (hero_vo) { return hero_vo.power; } } return 0; }, //通过bid获取等级最高的英雄信息 getTopLevHeroInfoByBid: function getTopLevHeroInfoByBid(bid) { if (!bid) return; var list = this.hero_bid_list[bid]; if (list) { list.sort(Utils.tableUpperSorter(["lev", "power"])); return list[0]; } return null; }, //雇佣的 getExpeditHeroData: function getExpeditHeroData() { var hero_list = this.getAllHeroArray(); var list = []; for (var i = 0; i < hero_list.length; i++) { var tab = {}; tab.power = hero_list[i].power; tab.name = hero_list[i].name; tab.bid = hero_list[i].bid; tab.index = i; tab.rid = hero_list[i].rid; tab.srv_id = hero_list[i].srv_id; tab.id = hero_list[i].id; tab.star = hero_list[i].star; tab.lev = hero_list[i].lev; tab.use_skin = hero_list[i].use_skin; list.push(tab); } list.sort(function (a, b) { return b.power < a.power; }); return list; }, // 获取自己的队伍阵法站位 getMyPosList: function getMyPosList() { return this.pos_list[PartnerConst.Fun_Form.Drama] || {}; }, getHeroSortFunc: function getHeroSortFunc() { var hero_sort = function hero_sort(role_vo1, role_vo2) { if (role_vo1.star === role_vo2.star) { if (role_vo1.power == role_vo2.power) { if (role_vo1.lev == role_vo2.lev) { return role_vo1.sort_order - role_vo2.sort_order; } else { return role_vo2.lev - role_vo1.lev; } } else { return role_vo2.power - role_vo1.power; } } else { return role_vo2.star - role_vo1.star; } }; return hero_sort; }, isMaxStarHero: function isMaxStarHero(bid, star) { if (!bid || !star) return false; var max_star = Config.partner_data.data_partner_max_star[bid]; if (max_star && star >= max_star) { return true; } if (star >= this.hero_info_upgrade_star_param) { if (star == this.hero_info_upgrade_star_param2) { // --10级升11有世界等级要求 return !this.checkOpenStar11(); } } return false; }, getStarFuseList: function getStarFuseList(camp_type) { camp_type = camp_type || 0; var camp_fuse_list = []; var fuse_cfg = Config.partner_data.data_partner_fuse_star; if (!fuse_cfg) return; for (var cfg_i in fuse_cfg) { var fuse_cfg_item = fuse_cfg[cfg_i]; var base_config = Config.partner_data.data_partner_base[cfg_i]; for (var item_i in fuse_cfg_item) { var star = fuse_cfg_item[item_i].star; var key = cfg_i + "_" + star; var star_config = gdata("partner_data", "data_partner_star", key); // Config.partner_data.data_partner_star[key]; if (base_config && (base_config.camp_type == camp_type || camp_type === 0)) { if (base_config && star_config && star_config.expend1.length > 0) { var fuse_data = {}; fuse_data.base_config = base_config; fuse_data.star_config = star_config; fuse_data.camp_type = base_config.camp_type; fuse_data.bid = cfg_i; fuse_data.star = star; camp_fuse_list.push(fuse_data); } } } } return camp_fuse_list; }, // --根据bid 获取一个模拟herovo对象..属性都是1级的 getMockHeroVoByBid: function getMockHeroVoByBid(bid) { var base_config = Config.partner_data.data_partner_base[bid]; var attr_config = Config.partner_data.data_partner_attr[bid]; if (!base_config || !attr_config) { return; } var hero_vo = Utils.deepCopy(base_config); hero_vo.star = base_config.init_star; //--默认星数 hero_vo.break_lev = 0; //--默认进阶 for (var k in attr_config) { // k,v in pairs(attr_config) do var v = attr_config[k]; if (!hero_vo[k]) { hero_vo[k] = v; } } hero_vo.hp = attr_config.hp_max; //--血量等于最大血量 hero_vo.power = PartnerCalculate.calculatePower(hero_vo); return hero_vo; }, /****************装备相关******************/ updateHeroEquipList: function updateHeroEquipList(data) { var partner_id = data.partner_id; if (partner_id && this.hero_list[partner_id]) { var hero_vo = this.hero_list[partner_id]; if (hero_vo.power < data.power) GlobalMessageMgr.getInstance().showPowerMove(data.power - hero_vo.power, null, hero_vo.power); // 判断战力变化 this.hero_list[partner_id].updateHeroVo(data); } }, getHeroEquipList: function getHeroEquipList(parener_id) { if (this.hero_list[parener_id]) { return this.hero_list[parener_id].eqm_list; } }, //----------------------------符文锻造相关------------------------ //获取符文祝福红点状态 getArtifactLuckyRedStatus: function getArtifactLuckyRedStatus() { return this.artifact_lucky_red; }, //符文祝福值 setArtifactLucky: function setArtifactLucky(value) { this.artifact_lucky = value; RedMgr.getInstance().addCalHandler(this.updateArtifactLuckyRed.bind(this)); }, getArtifactLucky: function getArtifactLucky() { return this.artifact_lucky || 0; }, //祝福值红点 updateArtifactLuckyRed: function updateArtifactLuckyRed() { var max_lucky = 0; var lucky_cfg = Config.partner_artifact_data.data_artifact_const["change_condition"]; if (lucky_cfg && lucky_cfg.val != null) { max_lucky = lucky_cfg.val; } if (this.artifact_lucky >= max_lucky) { this.artifact_lucky_red = true; } else { this.artifact_lucky_red = false; } gcore.GlobalEvent.fire(HeroEvent.Artifact_Lucky_Red_Event); var SceneConst = require("scene_const"); require("mainscene_controller").getInstance().setBuildRedStatus(SceneConst.CenterSceneBuild.mall, this.artifact_lucky_red); }, updatePartnerArtifactList: function updatePartnerArtifactList(data) { var id = data.partner_id || 0; if (this.hero_list[id]) { var hero_vo = this.hero_list[id]; if (hero_vo) { if (hero_vo.power < data.power) { GlobalMessageMgr.getInstance().showPowerMove(data.power - hero_vo.power, null, hero_vo.power); } this.hero_list[id].updateHeroVo(data); gcore.GlobalEvent.fire(HeroEvent.Artifact_Update_Event, hero_vo); // let is_artifact = PartnerCalculate.getIsCanClothArtifact(hero_vo.bid); // hero_vo.updateRedPoint(PartnerConst.Vo_Red_Type.Artifact,false) } } }, getPartnerArtifactList: function getPartnerArtifactList(id) { if (this.hero_list[id]) { return this.hero_list[id].artifact_list || []; } return []; }, //---------------------------符文锻造相关end------------------------- setLockByPartnerid: function setLockByPartnerid(partner_id, is_lock) { if (this.hero_list[partner_id]) { this.hero_list[partner_id].is_lock = is_lock || 0; } }, // 活动英雄列表 根据匹配信息 熔炼祭坛用 // @dic_the_conditions 指定匹配 dic_the_conditions[bid][star] = 数量 // @dic_random_conditions 随机阵容匹配 dic_the_conditions[camp][star] = 数量 // @dic_hero_id 标志已用 // return // @ count 拥有不重复英雄总数量 getHeroListByMatchInfo: function getHeroListByMatchInfo(dic_the_conditions, dic_random_conditions, dic_hero_id) { // 找不重复的数量 var count = 0; var dic_hero_id = dic_hero_id || {}; var dic_count = {}; var _setDicCount = function _setDicCount(partner_id, str, max) { // 判断是否重复 if (!dic_hero_id[partner_id]) { if (!dic_count[str]) dic_count[str] = 0; if (dic_count[str] < max) { dic_count[str] = dic_count[str] + 1; count = count + 1; dic_hero_id[partner_id] = 1; } } }; for (var hero_i in this.hero_list) { var hero = this.hero_list[hero_i]; if (dic_the_conditions && dic_the_conditions[hero.bid] && dic_the_conditions[hero.bid][hero.star]) { var str = cc.js.formatStr("%s%s", hero.bid, hero.star); _setDicCount(hero.partner_id, str, dic_the_conditions[hero.bid][hero.star]); } if (dic_random_conditions) { // 0表示所有阵营的合适 if (dic_random_conditions[0] && dic_random_conditions[0][hero.star]) { // if (dic_random_conditions[0][hero.star]) { var str = cc.js.formatStr("_%s%s", 0, hero.star); _setDicCount(hero.partner_id, str, dic_random_conditions[0][hero.star]); // } } else { if (dic_random_conditions[hero.camp_type] && dic_random_conditions[hero.camp_type][hero.star]) { var str = cc.js.formatStr("_%s%s", hero.camp_type, hero.star); _setDicCount(hero.partner_id, str, dic_random_conditions[hero.camp_type][hero.star]); } } } } return count; }, /***********************************红点检查********************************/ // 检测升级红点更新 checkLevelRedPointUpdate: function checkLevelRedPointUpdate() { // GlobalEvent:getInstance():Fire(HeroEvent.Level_RedPoint_Event) // if (this.is_delay_redpoint_update[HeroConst.RedPointType.eRPLevelUp]) // return // this.is_delay_redpoint_update[HeroConst.RedPointType.eRPLevelUp] = true; // 清除升级红点记录 HeroCalculate.getInstance().clearAllHeroRecordByRedPointType(HeroConst.RedPointType.eRPLevelUp, true); }, // 检查阵法解锁 checkUnlockFormRedPoint: function checkUnlockFormRedPoint() {}, // 设置更新equip红点的记录 setEquipUpdateRecord: function setEquipUpdateRecord(bool) { this.is_equip_redpoint_bag_update = bool; this.is_equip_redpoint_hero_update = bool; }, // 检查装备红点 checkEquipRedPointUpdate: function checkEquipRedPointUpdate() { // 需要 背包 返回 和 英雄更新返回 才处理红点计算 if (this.is_equip_redpoint_bag_update && this.is_equip_redpoint_hero_update) { //清除装备红点记录 HeroCalculate.getInstance().clearAllHeroRecordByRedPointType(HeroConst.RedPointType.eRPEquip); gcore.GlobalEvent.fire(HeroEvent.Equip_RedPoint_Event); } }, // 设置更新升星红点的记录 setUpgradeStarUpdateRecord: function setUpgradeStarUpdateRecord(bool) { this.is_upgradestar_redpoint_bag_update = bool; this.is_upgradestar_redpoint_hero_update = bool; }, // 升星红点检查 checkUpgradeStarRedPointUpdate: function checkUpgradeStarRedPointUpdate() { // 需要 背包 返回 和 英雄更新返回 才处理红点计算 if (this.is_upgradestar_redpoint_bag_update && this.is_upgradestar_redpoint_hero_update) { HeroCalculate.getInstance().clearAllHeroRecordByRedPointType(HeroConst.RedPointType.eRPStar); } }, // 检查圣器解锁 checkUnlockHallowsRedPoint: function checkUnlockHallowsRedPoint() {}, checkOpenStar11: function checkOpenStar11() { var config = Config.partner_data.data_partner_const.staropen11_world_lev; if (config) { if (config.val[0] == "world_lev") { var RoleController = require("role_controller"); var world_lev = RoleController.getInstance().getModel().getWorldLev() || 0; if (world_lev < config.val[1]) { return false; } } } return true; }, //---------------------天赋技能--------------------------- // --设置更新天赋红点 setUpdateTalentRedpoint: function setUpdateTalentRedpoint() { this.is_need_update_talent_redpoint = true; }, getTalentRedpointRecord: function getTalentRedpointRecord() { var self = this; if (self.is_need_update_talent_redpoint) { var dic_config = Config.partner_skill_data.data_partner_skill_learn; if (dic_config) { var is_enough; for (var k in dic_config) { var config = dic_config[k]; self.dic_hero_talent_skill_learn_redpoint[config.id] = null; is_enough = true; for (var i = 0; i < config.expend.length; ++i) { var v = config.expend[i]; var count = BackpackController.getInstance().getModel().getItemNumByBid(v[0]); if (count < v[1]) { is_enough = false; break; } } if (is_enough) { self.dic_hero_talent_skill_learn_redpoint[config.id] = config.id; } } } } self.is_need_update_talent_redpoint = false; if (!Utils.next(self.dic_hero_talent_skill_learn_redpoint)) { self.dic_hero_talent_skill_learn_redpoint = {}; } return self.dic_hero_talent_skill_learn_redpoint; }, // --检测天赋红点更新 checkTalentRedPointUpdate: function checkTalentRedPointUpdate() { if (this.is_delay_redpoint_update[HeroConst.RedPointType.eRPTalent]) { return; } this.is_delay_redpoint_update[HeroConst.RedPointType.eRPTalent] = true; // --清除天赋红点记录 HeroCalculate.getInstance().clearAllHeroRecordByRedPointType(HeroConst.RedPointType.eRPTalent, true); }, // --增加详细信息 updateHeroVoDetailedInfo: function updateHeroVoDetailedInfo(info) { if (!info) return; if (this.hero_list[info.partner_id]) { cc.log(this.hero_list[info.partner_id], info); for (var k in info) { var v = info[k]; this.hero_list[info.partner_id][k] = v; } this.hero_list[info.partner_id].is_had_detailed = true; gcore.GlobalEvent.fire(HeroEvent.Hero_Vo_Detailed_info, this.hero_list[info.partner_id]); } }, //初始化皮肤 信息英雄皮肤 initHeroSkin: function initHeroSkin(data) { if (!data) return; //判定是否要显示卡片展示界面 if (this.hero_skin_list) { var show_skin_id = null; for (var i in data.partner_skins) { var v = data.partner_skins[i]; if (this.hero_skin_list[v.id] == null) { show_skin_id = v.id; break; } } if (show_skin_id) { //显示 var skin_config = Config.partner_skin_data.data_skin_info[show_skin_id]; if (skin_config) { var setting = {}; setting.partner_bid = skin_config.bid; setting.is_chips = 1; setting.init_star = 5; setting.status = 1; setting.show_type = require("partnersummon_const").Gain_Show_Type.Skin_show; setting.skin_id = show_skin_id; require("partnersummon_controller").getInstance().openSummonGainShowWindow(true, [setting], null, 2); } } } this.hero_skin_list = {}; for (var _i in data.partner_skins) { var _v = data.partner_skins[_i]; this.hero_skin_list[_v.id] = _v.end_time; } gcore.GlobalEvent.fire(HeroEvent.Hero_Skin_Info_Event, data); }, //根据皮肤id 返回皮肤数据 //@return 皮肤有效时间点.. 如果永久返回 0 如果返回nil 表示 没有解锁该皮肤 getHeroSkinInfoBySkinID: function getHeroSkinInfoBySkinID(skin_id) { if (this.hero_skin_list && this.hero_skin_list[skin_id] != null) { return this.hero_skin_list[skin_id]; } }, //--是否解锁该皮肤 //is_check_time:判断是否过期 isUnlockHeroSkin: function isUnlockHeroSkin(skin_id, is_check_time) { if (this.hero_skin_list && this.hero_skin_list[skin_id] != null) { if (is_check_time) { if (this.hero_skin_list[skin_id] > 0) { return false; } } return true; } return false; } }); 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxoZXJvXFxoZXJvX21vZGVsLmpzIl0sIm5hbWVzIjpbIkhlcm9Db25zdCIsInJlcXVpcmUiLCJQYXJ0bmVyQ29uc3QiLCJIZXJvRXZlbnQiLCJQYXJ0bmVyQ2FsY3VsYXRlIiwiSGVyb0NhbGN1bGF0ZSIsIkhlcm9Db250cm9sbGVyIiwiQmFja3BhY2tDb250cm9sbGVyIiwiSGVyb01vZGVsIiwiY2MiLCJDbGFzcyIsIkJhc2VDbGFzcyIsImN0b3IiLCJjdHJsIiwiYXJndW1lbnRzIiwicHJvcGVydGllcyIsImluaXRDb25maWciLCJoZXJvX2xpc3QiLCJoZXJvX2JpZF9saXN0IiwiaGVyb19hcnJheSIsImlzX2luaXQiLCJoZXJvX21heF9jb3VudCIsImJ1eV9udW0iLCJoZXJvX3NraW5fbGlzdCIsImRpY19wb2tlZGV4X2luZm8iLCJkaWNfcG9rZWRleF9iaWQiLCJkaWNfZnVzZV9pbmZvIiwiZGljX2hhZF9oZXJvX2luZm8iLCJwb3NfbGlzdCIsImV4cGVkaXRfbGlzdCIsInVzZV9mb3JtYXRpb25fdHlwZSIsInVzZV9oYWxsb3dzX2lkIiwiaXNfZXF1aXBfcmVkcG9pbnRfYmFnX3VwZGF0ZSIsImlzX2VxdWlwX3JlZHBvaW50X2hlcm9fdXBkYXRlIiwiaXNfZGVsYXlfcmVkcG9pbnRfdXBkYXRlIiwidXBncmFkZV9zdGFyX2Nvc3RfaWQiLCJpc191cGdyYWRlc3Rhcl9yZWRwb2ludF9iYWdfdXBkYXRlIiwiaXNfdXBncmFkZXN0YXJfcmVkcG9pbnRfaGVyb191cGRhdGUiLCJpc19yZWRwb2ludF9mb3JtIiwiaXNfcmVkcG9pbnRfaGFsbG93cyIsInJlY29yZF9sb2dpbl9sZXYiLCJhcnRpZmFjdF9sdWNreSIsImFydGlmYWN0X2x1Y2t5X3JlZCIsImhlcm9faW5mb191cGdyYWRlX3N0YXJfcGFyYW0iLCJoZXJvX2luZm9fdXBncmFkZV9zdGFyX3BhcmFtMiIsImhlcm9faW5mb191cGdyYWRlX3N0YXJfcGFyYW0zIiwiaGVyb19pbmZvX3RhbGVudF9za2lsbF9wYXJhbSIsIkNvbmZpZyIsInBhcnRuZXJfc2tpbGxfZGF0YSIsImRhdGFfcGFydG5lcl9za2lsbF9jb25zdCIsInZhbCIsInRhbGVudF9za2lsbF9jb3N0X2lkIiwiZGljX2hlcm9fdGFsZW50X3NraWxsX2xlYXJuX3JlZHBvaW50IiwiaXNfbmVlZF91cGRhdGVfdGFsZW50X3JlZHBvaW50Iiwic2V0SGVyb01heENvdW50IiwibWF4X2NvdW50IiwiZ2V0SGVyb01heENvdW50IiwiaGF2ZV9jb3V0biIsImxlbmd0aCIsInNldEhlcm9CdXlOdW0iLCJOdW1iZXIiLCJnZXRIZXJvQnV5TnVtIiwidXBkYXRlSGVyb0xpc3QiLCJpc19hZGQiLCJub3Rfc2hvd19wb3dlciIsImhlcm9faSIsInVwZGF0ZUhlcm9WbyIsImdldEluc3RhbmNlIiwiY2xlYXJBbGxTdGFyRnVzZVJlZHBvaW50UmVjb3JkIiwiZ2NvcmUiLCJHbG9iYWxFdmVudCIsImZpcmUiLCJIZXJvX0RhdGFfQWRkIiwiaW5mbyIsImlkIiwicGFydG5lcl9pZCIsImJpZCIsInBhcnRuZXJfYmlkIiwicGFyX2NmZyIsInBhcnRuZXJfZGF0YSIsImRhdGFfcGFydG5lcl9iYXNlIiwiaGVyb192byIsIkhlcm9WbyIsImNvbmZpZ19rIiwiUm9sZUNvbnRyb2xsZXIiLCJyb2xlX3ZvIiwiZ2V0Um9sZVZvIiwicmlkIiwic3J2X2lkIiwib2xkX3ZvIiwib3Blbl90eXBlIiwicG93ZXIiLCJHbG9iYWxNZXNzYWdlTWdyIiwic2hvd1Bvd2VyTW92ZSIsInN0YXIiLCJVdGlscyIsImRlZXBDb3B5IiwiaXNfb3Blbl90YWxlbnQiLCJicmVha19sZXYiLCJjdXJfc3RhciIsImluaXRfc3RhciIsInB1c2giLCJvcGVuSGVyb1VwZ3JhZGVTdGFyRXhoaWJpdGlvblBhbmVsIiwiY2xlYXJBbGxIZXJvUmVjb3JkQnlSZWRQb2ludFR5cGUiLCJSZWRQb2ludFR5cGUiLCJlUlBTdGFyIiwib3BlbkJyZWFrRXhoaWJpdGlvbldpbmRvdyIsIkhlcm9fRGF0YV9VcGRhdGUiLCJjaGVja0hlcm9SZWRQb2ludEJ5UmVkUG9pbnRUeXBlIiwiZVJQTGV2ZWxVcCIsImxvZyIsImdldEhlcm9CeUlkIiwiZGVsSGVyb0RhdGFMaXN0IiwibGlzdCIsInYiLCJ0ZW1wX2JpZCIsImJpZGxpc3QiLCJpIiwic3BsaWNlIiwiY2hlY2tVcGdyYWRlU3RhclJlZFBvaW50VXBkYXRlIiwiRGVsX0hlcm9fRXZlbnQiLCJ1cGRhdGVIZXJvVm9UYWxlbnQiLCJkYXRhX2xpc3QiLCJpc19ub3RfY2hlY2siLCJpc190ZWFtIiwic2VsZiIsInVwZGF0ZVNraWxsIiwiZG93ZXJfc2tpbGwiLCJpc0Zvcm1EcmFtYSIsImNoZWNrQWxsSGVyb1JlZFBvaW50IiwiZ2V0SGVyb0xpc3QiLCJnZXRBbGxIZXJvQXJyYXkiLCJnZXRIZXJvTGlzdEJ5Q2FtcCIsImNhbXAiLCJDYW1wVHlwZSIsImVOb25lIiwiY2FtcF90eXBlIiwiaGVyb19zb3J0IiwiZ2V0SGVyb1NvcnRGdW5jIiwic29ydCIsImdldERlZXBIZXJvTGlzdEJ5Q2FtcCIsImdldFJlc3RIZXJvTGlzdEJ5Q2FtcCIsInJlc3RfaGVyb19saXN0IiwiaXNfaW5fZm9ybSIsImlzX2xvY2siLCJpc191aV9sb2NrIiwicm9sZV92bzEiLCJyb2xlX3ZvMiIsImxldiIsInNvcnRfb3JkZXIiLCJzZXRIYWRIZXJvSW5mbyIsIm1heF9zdGFyIiwiZ2V0SGVyb1Bva2VkZXhMaXN0IiwiY2FtcF9pIiwicG9rZWRleF9jZmciLCJkYXRhX3BhcnRuZXJfcG9rZWRleCIsInN0YXJfaSIsImtleSIsImdldEhlcm9Qb2tlZGV4QnlCaWQiLCJzb3J0X2Z1bmN0aW9uIiwiZGljX3Bva2VkZXhfMSIsImRpY19wb2tlZGV4XzIiLCJkaWNfcG9rZWRleF9pIiwicGFyX3Nob3dfY2ZnIiwiZ2RhdGEiLCJwYXJfYmFzZV9jZmciLCJnZXRIZXJvTWF4QnJlYWtDb3VudEJ5SW5pdFN0YXIiLCJocF9tYXgiLCJocCIsImNhbGN1bGF0ZVBvd2VyIiwibmFtZSIsInR5cGUiLCJicmVha19pZCIsImlzX3Bva2VkZXgiLCJkaWNfbWF4X2JyZWFrIiwiZGF0YV9wYXJ0bmVyX2NvbnN0IiwiYWR2YW5jZWRfbGltaXQiLCJ2YWxfaSIsImdldFJhbmRvbUhlcm9IZWFkQnlRdWFsaXR5IiwicXVhbGl0eSIsImRpY19yYW5kb21faGVyb19oZWFkIiwicmFuZG9tX2hlcm9faWNvbiIsIml0ZW1fY29uZmlnIiwiaWNvbiIsImdldEhhZEhlcm9JbmZvIiwiZ2V0SGFkSGVyb1N0YXJCeWJpZCIsImlzT3BlblRhbmxlbnRCeUhlcm92byIsInNldEZvcm1MaXN0IiwiZGF0YSIsImZvcm1fdHlwZSIsIkZ1bl9Gb3JtIiwiRHJhbWEiLCJmb3JtX2kiLCJ2byIsInVwZGF0ZUZvcm1Qb3MiLCJwb3NfaSIsInBvc19pbmZvIiwicG9zIiwiZm9ybV9wb3dlciIsImZvcm1hdGlvbl90eXBlIiwiaGFsbG93c19pZCIsImNhbGN1bGF0ZSIsIlJlZE1nciIsImFkZENhbEhhbmRsZXIiLCJiaW5kIiwiUmVkSWRzIiwiSGVyb0FsbCIsImsiLCJzZW5kZXIxMTA5OSIsImdldE1heEZpZ2h0IiwidGFibGVVcHBlclNvcnRlciIsImdldFRvcExldkhlcm9JbmZvQnlCaWQiLCJnZXRFeHBlZGl0SGVyb0RhdGEiLCJ0YWIiLCJpbmRleCIsInVzZV9za2luIiwiYSIsImIiLCJnZXRNeVBvc0xpc3QiLCJpc01heFN0YXJIZXJvIiwiZGF0YV9wYXJ0bmVyX21heF9zdGFyIiwiY2hlY2tPcGVuU3RhcjExIiwiZ2V0U3RhckZ1c2VMaXN0IiwiY2FtcF9mdXNlX2xpc3QiLCJmdXNlX2NmZyIsImRhdGFfcGFydG5lcl9mdXNlX3N0YXIiLCJjZmdfaSIsImZ1c2VfY2ZnX2l0ZW0iLCJiYXNlX2NvbmZpZyIsIml0ZW1faSIsInN0YXJfY29uZmlnIiwiZXhwZW5kMSIsImZ1c2VfZGF0YSIsImdldE1vY2tIZXJvVm9CeUJpZCIsImF0dHJfY29uZmlnIiwiZGF0YV9wYXJ0bmVyX2F0dHIiLCJ1cGRhdGVIZXJvRXF1aXBMaXN0IiwiZ2V0SGVyb0VxdWlwTGlzdCIsInBhcmVuZXJfaWQiLCJlcW1fbGlzdCIsImdldEFydGlmYWN0THVja3lSZWRTdGF0dXMiLCJzZXRBcnRpZmFjdEx1Y2t5IiwidmFsdWUiLCJ1cGRhdGVBcnRpZmFjdEx1Y2t5UmVkIiwiZ2V0QXJ0aWZhY3RMdWNreSIsIm1heF9sdWNreSIsImx1Y2t5X2NmZyIsInBhcnRuZXJfYXJ0aWZhY3RfZGF0YSIsImRhdGFfYXJ0aWZhY3RfY29uc3QiLCJBcnRpZmFjdF9MdWNreV9SZWRfRXZlbnQiLCJTY2VuZUNvbnN0Iiwic2V0QnVpbGRSZWRTdGF0dXMiLCJDZW50ZXJTY2VuZUJ1aWxkIiwibWFsbCIsInVwZGF0ZVBhcnRuZXJBcnRpZmFjdExpc3QiLCJBcnRpZmFjdF9VcGRhdGVfRXZlbnQiLCJnZXRQYXJ0bmVyQXJ0aWZhY3RMaXN0IiwiYXJ0aWZhY3RfbGlzdCIsInNldExvY2tCeVBhcnRuZXJpZCIsImdldEhlcm9MaXN0QnlNYXRjaEluZm8iLCJkaWNfdGhlX2NvbmRpdGlvbnMiLCJkaWNfcmFuZG9tX2NvbmRpdGlvbnMiLCJkaWNfaGVyb19pZCIsImNvdW50IiwiZGljX2NvdW50IiwiX3NldERpY0NvdW50Iiwic3RyIiwibWF4IiwiaGVybyIsImpzIiwiZm9ybWF0U3RyIiwiY2hlY2tMZXZlbFJlZFBvaW50VXBkYXRlIiwiY2hlY2tVbmxvY2tGb3JtUmVkUG9pbnQiLCJzZXRFcXVpcFVwZGF0ZVJlY29yZCIsImJvb2wiLCJjaGVja0VxdWlwUmVkUG9pbnRVcGRhdGUiLCJlUlBFcXVpcCIsIkVxdWlwX1JlZFBvaW50X0V2ZW50Iiwic2V0VXBncmFkZVN0YXJVcGRhdGVSZWNvcmQiLCJjaGVja1VubG9ja0hhbGxvd3NSZWRQb2ludCIsImNvbmZpZyIsInN0YXJvcGVuMTFfd29ybGRfbGV2Iiwid29ybGRfbGV2IiwiZ2V0TW9kZWwiLCJnZXRXb3JsZExldiIsInNldFVwZGF0ZVRhbGVudFJlZHBvaW50IiwiZ2V0VGFsZW50UmVkcG9pbnRSZWNvcmQiLCJkaWNfY29uZmlnIiwiZGF0YV9wYXJ0bmVyX3NraWxsX2xlYXJuIiwiaXNfZW5vdWdoIiwiZXhwZW5kIiwiZ2V0SXRlbU51bUJ5QmlkIiwibmV4dCIsImNoZWNrVGFsZW50UmVkUG9pbnRVcGRhdGUiLCJlUlBUYWxlbnQiLCJ1cGRhdGVIZXJvVm9EZXRhaWxlZEluZm8iLCJpc19oYWRfZGV0YWlsZWQiLCJIZXJvX1ZvX0RldGFpbGVkX2luZm8iLCJpbml0SGVyb1NraW4iLCJzaG93X3NraW5faWQiLCJwYXJ0bmVyX3NraW5zIiwic2tpbl9jb25maWciLCJwYXJ0bmVyX3NraW5fZGF0YSIsImRhdGFfc2tpbl9pbmZvIiwic2V0dGluZyIsImlzX2NoaXBzIiwic3RhdHVzIiwic2hvd190eXBlIiwiR2Fpbl9TaG93X1R5cGUiLCJTa2luX3Nob3ciLCJza2luX2lkIiwib3BlblN1bW1vbkdhaW5TaG93V2luZG93IiwiZW5kX3RpbWUiLCJIZXJvX1NraW5fSW5mb19FdmVudCIsImdldEhlcm9Ta2luSW5mb0J5U2tpbklEIiwiaXNVbmxvY2tIZXJvU2tpbiIsImlzX2NoZWNrX3RpbWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUEsU0FBUyxHQUFHQyxPQUFPLENBQUMsWUFBRCxDQUF2Qjs7QUFDQSxJQUFJQyxZQUFZLEdBQUdELE9BQU8sQ0FBQyxlQUFELENBQTFCOztBQUNBLElBQUlFLFNBQVMsR0FBR0YsT0FBTyxDQUFDLFlBQUQsQ0FBdkI7O0FBQ0EsSUFBSUcsZ0JBQWdCLEdBQUdILE9BQU8sQ0FBQyxtQkFBRCxDQUE5Qjs7QUFDQSxJQUFJSSxhQUFhLEdBQUdKLE9BQU8sQ0FBQyxnQkFBRCxDQUEzQjs7QUFDQSxJQUFJSyxjQUFjLEdBQUdMLE9BQU8sQ0FBQyxpQkFBRCxDQUE1Qjs7QUFDQSxJQUFJTSxrQkFBa0IsR0FBR04sT0FBTyxDQUFDLHFCQUFELENBQWhDOztBQUNBLElBQUlPLFNBQVMsR0FBR0Ms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QUFDbkMsaUJBQU8sS0FBUDtBQUNBO0FBQ0Q7O0FBQ0QsYUFBTyxJQUFQO0FBQ0E7O0FBQ0QsV0FBTyxLQUFQO0FBQ0E7QUF6K0J1QixDQUFULENBQWhCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAgIOi/memHjOWhq+WGmeivpue7huivtOaYjizkuLvopoHloavlhpnor6XmqKHlnZfnmoTlip/og73nroDopoFcbi8vIDxici8+Q3JlYXRlOiB7REFURX1cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgSGVyb0NvbnN0ID0gcmVxdWlyZShcImhlcm9fY29uc3RcIik7XG52YXIgUGFydG5lckNvbnN0ID0gcmVxdWlyZShcInBhcnRuZXJfY29uc3RcIik7XG52YXIgSGVyb0V2ZW50ID0gcmVxdWlyZShcImhlcm9fZXZlbnRcIik7XG52YXIgUGFydG5lckNhbGN1bGF0ZSA9IHJlcXVpcmUoXCJwYXJ0bmVyX2NhbGN1bGF0ZVwiKTtcbnZhciBIZXJvQ2FsY3VsYXRlID0gcmVxdWlyZShcImhlcm9fY2FsY3VsYXRlXCIpO1xudmFyIEhlcm9Db250cm9sbGVyID0gcmVxdWlyZShcImhlcm9fY29udHJvbGxlclwiKVxudmFyIEJhY2twYWNrQ29udHJvbGxlciA9IHJlcXVpcmUoXCJiYWNrcGFja19jb250cm9sbGVyXCIpXG52YXIgSGVyb01vZGVsID0gY2MuQ2xhc3Moe1xuXHRleHRlbmRzOiBCYXNlQ2xhc3MsXG5cdGN0b3I6IGZ1bmN0aW9uICgpIHtcblx0XHR0aGlzLmN0cmwgPSBhcmd1bWVudHNbMF07XG5cdH0sXG5cblx0cHJvcGVydGllczoge1xuXHR9LFxuXG5cdGluaXRDb25maWc6IGZ1bmN0aW9uICgpIHtcblx0XHQvLyDkvJnkvLTmlbDmja7liJfooaggKGlkIDroi7Hpm4TllK/kuIDmoIfor4YpXG5cdFx0Ly8g57uT5p6EIHRoaXMuaGVyb19saXN0W2lkXSA9IGhlcm9fdm9cblx0XHR0aGlzLmhlcm9fbGlzdCA9IHt9O1xuXHRcdC8vICDkvJnkvLRiaWTliJfooajnmoQgIFxuXHRcdC8vIOe7k+aehCB0aGlzLmhlcm9fYmlkX2xpc3RbYmlkXSA9IHtoZXJvX3ZvMSxoZXJvX3ZvMn1cblx0XHR0aGlzLmhlcm9fYmlkX2xpc3QgPSB7fTtcblx0XHQvLyDkvJnkvLTmlbDmja7mlbDnu4TlvaLlvI/lrZjlgqjvvIzkvr/kuo7mjpLluo9cblx0XHR0aGlzLmhlcm9fYXJyYXkgPSBbXTtcblxuXHRcdC8vIOagh+W/l+esrOS4gOasoeWIneWni1xuXHRcdHRoaXMuaXNfaW5pdCA9IHRydWU7XG5cblx0XHQvLyDoi7Hpm4TkuIrpmZBcblx0XHR0aGlzLmhlcm9fbWF4X2NvdW50ID0gMDtcblx0XHQvLyDoi7Hpm4Tlt7Lmv4DmtLvkuIrpmZDmrKHmlbAgXG5cdFx0dGhpcy5idXlfbnVtID0gMDtcblxuXHRcdC8v55qu6IKk5pWw5o2uICDnu5PmnoQ6IHNlbGYuaGVyb19za2luX2xpc3Rb55qu6IKkaWRdID0g55qu6IKk57uT5p2f5pe26Ze0ICAgKOWmguaenOaXtumXtCA9PSAwIOihqOawuOS5hSlcblx0XHR0aGlzLmhlcm9fc2tpbl9saXN0ID0gbnVsbDtcblxuXHRcdC8vIOiLsembhOWbvuS5pummhuS/oeaBr1xuXHRcdHRoaXMuZGljX3Bva2VkZXhfaW5mbyA9IG51bGw7XG5cdFx0Ly8g6Iux6ZuE5Zu+5Lmm6aaG5L+h5oGvIFtiaWRdID0g5pWw5o2uXG5cdFx0dGhpcy5kaWNfcG9rZWRleF9iaWQgPSB7fTtcblxuXHRcdC8vIOeGlOeCvOelreWdm+eahOWIl+ihqFxuXHRcdHRoaXMuZGljX2Z1c2VfaW5mbyA9IG51bGw7XG5cblx0XHQvLyDlt7Lmi6Xov4fmnInoi7Hpm4RpZCBbYmlkXSA9IDFcblx0XHR0aGlzLmRpY19oYWRfaGVyb19pbmZvID0ge307XG5cblx0XHQvLyDluIPpmLXnq5nkvY3kv6Hmga8gdGhpcy5wb3NfbGlzdFvluIPpmLXnsbvlnotdW3Bvc10gPSBpZFxuXHRcdHRoaXMucG9zX2xpc3QgPSB7fTtcblxuXHRcdHRoaXMuZXhwZWRpdF9saXN0ID0gbnVsbDtcblx0XHQvLyDpmLXms5Xnsbvlnotcblx0XHR0aGlzLnVzZV9mb3JtYXRpb25fdHlwZSA9IDE7XG5cdFx0Ly8g5L2/55So55qE5Zyj5ZmoaWRcblx0XHR0aGlzLnVzZV9oYWxsb3dzX2lkID0gMDtcblxuXHRcdC8vIOijheWkh+e6oueCueiDjOWMheW3suabtOaWsCDorrDlvZVcblx0XHR0aGlzLmlzX2VxdWlwX3JlZHBvaW50X2JhZ191cGRhdGUgPSB0cnVlO1xuXHRcdC8vIOijheWkh+e6oueCueiLsembhOW3suabtOaWsCDorrDlvZVcblx0XHR0aGlzLmlzX2VxdWlwX3JlZHBvaW50X2hlcm9fdXBkYXRlID0gdHJ1ZTtcblxuXHRcdC8vIOaYr+WQpuW7tui/n+e6oueCueabtOaWsOS4rSDkvovlrZA6dGhpcy5pc19kZWxheV9yZWRwb2ludF91cGRhdGVbSGVyb0NvbnN0LlJlZFBvaW50VHlwZS5lUlBMZXZlbFVwXSA9IHRydWVcblx0XHQvLyDnm67liY3lj6rmnInljYfnuqfnuqLngrnnlKhcblx0XHR0aGlzLmlzX2RlbGF5X3JlZHBvaW50X3VwZGF0ZSA9IHt9O1xuXG5cdFx0Ly8g6L+b6Zi25ZKM5Y2H5pif5p2Q5paZ5raI6ICXIOWPquiDveWGmeatuyDlpoLmnpznrZbliJLmlLnkuoYu6Lef552A5pS55ZCnXG5cdFx0dGhpcy51cGdyYWRlX3N0YXJfY29zdF9pZCA9IDEwMDAxO1xuXG5cdFx0Ly8g5Y2H5pif57qi54K56IOM5YyF5bey5pu05pawIOiusOW9lVxuXHRcdHRoaXMuaXNfdXBncmFkZXN0YXJfcmVkcG9pbnRfYmFnX3VwZGF0ZSA9IHRydWU7XG5cdFx0Ly8g5Y2H5pif57qi54K56Iux6ZuE5bey5pu05pawIOiusOW9lVxuXHRcdHRoaXMuaXNfdXBncmFkZXN0YXJfcmVkcG9pbnRfaGVyb191cGRhdGUgPSB0cnVlO1xuXG5cdFx0Ly8g6Zi15rOVIOe6oueCuSAo5LiA5qyh5oCn55qEKVxuXHRcdHRoaXMuaXNfcmVkcG9pbnRfZm9ybSA9IGZhbHNlO1xuXHRcdC8vIOWco+WZqCDnuqLngrkgKOS4gOasoeaAp+eahClcblx0XHR0aGlzLmlzX3JlZHBvaW50X2hhbGxvd3MgPSBmYWxzZTtcblxuXHRcdC8vIOiusOW9leeZu+mZhuaXtuWAmeinkuiJsueahOetiee6pyDliKTmlq3pmLXms5XmmK/lkKbmlrDop6PplIHnlKhcblx0XHR0aGlzLnJlY29yZF9sb2dpbl9sZXYgPSAwO1xuXG5cdFx0Ly8g56ym5paH6Kej6ZSB5p2h5Lu25L+h5oGvXG5cdFx0Ly8gdmFyIGFydGlmYWN0X29uZSAgICAgICAgPSBDb25maWcucGFydG5lcl9kYXRhLmRhdGFfcGFydG5lcl9jb25zdFtcImFydGlmYWN0X29uZVwiXS52YWw7IFxuXHRcdC8vIHZhciBhcnRpZmFjdF90d28gICAgICAgID0gQ29uZmlnLnBhcnRuZXJfZGF0YS5kYXRhX3BhcnRuZXJfY29uc3RbXCJhcnRpZmFjdF90d29cIl0udmFsO1xuXHRcdC8vIHRoaXMuYXJ0aWZhY3RfbG9ja19saXN0ID0ge1wiMVwiOmFydGlmYWN0X29uZSwgXCIyXCI6YXJ0aWZhY3RfdHdvfTtcblx0XHR0aGlzLmFydGlmYWN0X2x1Y2t5ID0gMDsgLy8g56ym5paH56Wd56aP5YC8XG5cdFx0dGhpcy5hcnRpZmFjdF9sdWNreV9yZWQgPSBmYWxzZTsgLy8g56Wd56aP5YC857qi54K5XG5cblx0XHQvLyDoi7Hpm4Tkv6Hmga/nlYzpnaIg5Y2H5pif6aG1562+55qE5Y+C5pWwICA25pif5omN6ZmQ5pe26aG1562+KOWQjumdouetluWIkuimgeaxgueGlOeCvOelreWdm+eahOS5n+WKoOWFpSlcblx0XHR0aGlzLmhlcm9faW5mb191cGdyYWRlX3N0YXJfcGFyYW0gPSA2O1xuXG5cdFx0dGhpcy5oZXJvX2luZm9fdXBncmFkZV9zdGFyX3BhcmFtMiA9IDEwO1x0XHRcblx0XHR0aGlzLmhlcm9faW5mb191cGdyYWRlX3N0YXJfcGFyYW0zID0gMTE7XG5cblx0XHQvLyAtLeiLsembhOS/oeaBr+eVjOmdoiDlpKnotYvpobXnrb7nmoTlj4LmlbAgIDbmmJ/miY3pmZDml7bpobXnrb5cblx0XHR0aGlzLmhlcm9faW5mb190YWxlbnRfc2tpbGxfcGFyYW0gPSAgQ29uZmlnLnBhcnRuZXJfc2tpbGxfZGF0YS5kYXRhX3BhcnRuZXJfc2tpbGxfY29uc3RbXCJza2lsbF9zbG90XCJdLnZhbCAgIFxuXHRcdFxuXHRcdC8vIC0t5aSp6LWL5oqA6IO95Y2H5pif55qE5p2Q5paZXG5cdFx0dGhpcy50YWxlbnRfc2tpbGxfY29zdF9pZCA9IDEwNDUwXG5cdFx0Ly8gLS3lpKnotYvmioDog73lj6/lrabkuaDnmoTliJfooagg55So5LqO57qi54K5IOe7k+aehCBzZWxmLmRpY19oZXJvX3RhbGVudF9za2lsbF9sZWFybl9yZWRwb2ludFtza2lsbF9pZF0gPSAxXG5cdFx0dGhpcy5kaWNfaGVyb190YWxlbnRfc2tpbGxfbGVhcm5fcmVkcG9pbnQgID0ge31cblx0XG5cdFx0dGhpcy5pc19uZWVkX3VwZGF0ZV90YWxlbnRfcmVkcG9pbnQgPSB0cnVlXG5cdH0sXG5cblx0c2V0SGVyb01heENvdW50OiBmdW5jdGlvbiAobWF4X2NvdW50KSB7XG5cdFx0aWYgKHR5cGVvZiBtYXhfY291bnQgPT0gXCJudW1iZXJcIikge1xuXHRcdFx0dGhpcy5oZXJvX21heF9jb3VudCA9IG1heF9jb3VudDtcblx0XHR9XG5cdH0sXG5cblx0Ly8g6I635Y+W6Iux6ZuE5LiK5LiK6ZmQXG5cdGdldEhlcm9NYXhDb3VudDogZnVuY3Rpb24gKCkge1xuXHRcdHZhciBtYXhfY291bnQgPSB0aGlzLmhlcm9fbWF4X2NvdW50IHx8IDA7XG5cdFx0dmFyIGhhdmVfY291dG4gPSB0aGlzLmhlcm9fYXJyYXkubGVuZ3RoO1xuXHRcdHJldHVybiB7IG1heF9jb3VudDogbWF4X2NvdW50LCBoYXZlX2NvdXRuOiBoYXZlX2NvdXRuIH07XG5cdH0sXG5cblx0c2V0SGVyb0J1eU51bTogZnVuY3Rpb24gKGJ1eV9udW0pIHtcblx0XHR0aGlzLmJ1eV9udW0gPSBOdW1iZXIoYnV5X251bSk7XG5cdH0sXG5cblx0Z2V0SGVyb0J1eU51bTogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLmJ1eV9udW0gfHwgMDtcblx0fSxcblxuXHQvKipcblx0ICog5pu05paw6Iux6ZuE5YiX6KGoXG5cdCAqIEBhdXRob3IgemhhbmdodXhpbmcgMjAxOS0wMS0yNFxuXHQgKiBAcGFyYW0gIHtbdHlwZV19ICBub3Rfc2hvd19wb3dlciDkuI3mmL7npLrmiJjlipvlj5jljJbmj5DnpLpcblx0ICovXG5cdHVwZGF0ZUhlcm9MaXN0OiBmdW5jdGlvbiAoaGVyb19saXN0LCBpc19hZGQsIG5vdF9zaG93X3Bvd2VyKSB7XG5cdFx0aWYgKCFoZXJvX2xpc3QpIHJldHVybjtcblx0XHRmb3IgKHZhciBoZXJvX2kgaW4gaGVyb19saXN0KSB7XG5cdFx0XHR0aGlzLnVwZGF0ZUhlcm9WbyhoZXJvX2xpc3RbaGVyb19pXSwgbm90X3Nob3dfcG93ZXIpO1xuXHRcdH1cblxuXHRcdC8vIOeGlOeCvOelreWdm+eahOe6oueCuSDmlrDlop7pnIDopoHph43mlrDnrpfnuqLngrlcblx0XHRpZiAoaXNfYWRkKSB7XG5cdCAgICAgICAgSGVyb0NhbGN1bGF0ZS5nZXRJbnN0YW5jZSgpLmNsZWFyQWxsU3RhckZ1c2VSZWRwb2ludFJlY29yZCgpO1xuXHRcdFx0Z2NvcmUuR2xvYmFsRXZlbnQuZmlyZShIZXJvRXZlbnQuSGVyb19EYXRhX0FkZCwgaGVyb19saXN0KTtcblx0XHR9XG5cblx0XHR0aGlzLmlzX2luaXQgPSBmYWxzZTtcblx0fSxcblxuXHQvKipcblx0ICog5pu05paw5Y2V5Liq6Iux6ZuE5L+h5oGv77yM5aaC5p6c5rKh5pyJ5YiZ5piv5paw5aKe77ybXG5cdCAqL1xuXHR1cGRhdGVIZXJvVm86IGZ1bmN0aW9uIChpbmZvLCBub3Rfc2hvd19wb3dlcikge1xuXHRcdGlmICghaW5mbykgcmV0dXJuO1xuXHRcdGluZm8uaWQgPSBpbmZvLnBhcnRuZXJfaWQ7XG5cdFx0dmFyIGJpZCA9IGluZm8ucGFydG5lcl9iaWQgfHwgaW5mby5iaWQ7XG5cdFx0aWYgKCFiaWQgJiYgdGhpcy5oZXJvX2xpc3RbaW5mby5pZF0pXG5cdFx0XHRiaWQgPSB0aGlzLmhlcm9fbGlzdFtpbmZvLmlkXS5iaWQ7XG5cblx0XHR2YXIgcGFyX2NmZyA9IENvbmZpZy5wYXJ0bmVyX2RhdGEuZGF0YV9wYXJ0bmVyX2Jhc2VbYmlkXTtcblx0XHRpZiAoIXBhcl9jZmcpIHJldHVybjtcblxuXHRcdHZhciBpc19hZGQgPSBmYWxzZTtcblx0XHR2YXIgaGVyb192byA9IHRoaXMuaGVyb19saXN0W2luZm8uaWRdO1xuXHRcdGlmICghaGVyb192bykge1xuXHRcdFx0aXNfYWRkID0gdHJ1ZTtcblx0XHRcdHZhciBIZXJvVm8gPSByZXF1aXJlKFwiaGVyb192b1wiKTtcblx0XHRcdGhlcm9fdm8gPSB0aGlzLmhlcm9fbGlzdFtpbmZvLmlkXSA9IG5ldyBIZXJvVm8oKTtcblxuXHRcdFx0Zm9yICh2YXIgY29uZmlnX2sgaW4gcGFyX2NmZykge1xuXHRcdFx0XHRpZiAoY29uZmlnX2sgIT09IFwic2tpbGxzXCIpXG5cdFx0XHRcdFx0aW5mb1tjb25maWdfa10gPSBwYXJfY2ZnW2NvbmZpZ19rXTtcblx0XHRcdH1cblxuXHRcdFx0Ly8g6K6+572u6KeS6ImyaWRcblx0XHRcdHZhciBSb2xlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJyb2xlX2NvbnRyb2xsZXJcIik7XG5cdFx0XHR2YXIgcm9sZV92byA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XG5cdFx0XHRpZiAocm9sZV92bykge1xuXHRcdFx0XHRpbmZvLnJpZCA9IHJvbGVfdm8ucmlkO1xuXHRcdFx0XHRpbmZvLnNydl9pZCA9IHJvbGVfdm8uc3J2X2lkO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIOaXp+aVsOaNrlxuXHRcdHZhciBvbGRfdm8gPSBudWxsO1xuXHRcdHZhciBvcGVuX3R5cGUgPSAwXG5cdFx0aWYgKCFpc19hZGQpIHtcblx0XHRcdC8vIOWkhOeQhuaImOWKm+aPkOWNh+eJueaViFxuXHRcdFx0aWYgKCFub3Rfc2hvd19wb3dlciAmJiBoZXJvX3ZvLnBvd2VyIDwgaW5mby5wb3dlcikge1xuXHRcdFx0XHRHbG9iYWxNZXNzYWdlTWdyLmdldEluc3RhbmNlKCkuc2hvd1Bvd2VyTW92ZShpbmZvLnBvd2VyIC0gaGVyb192by5wb3dlciwgbnVsbCwgaGVyb192by5wb3dlcik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIOWkhOeQhuWNh+aYn+OAgei/m+mYtlxuXHRcdFx0aWYgKGluZm8uc3RhciAmJiBoZXJvX3ZvLnN0YXIgPCBpbmZvLnN0YXIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDljYfmmJ9cblx0XHRcdFx0b3Blbl90eXBlID0gMTtcblx0XHRcdFx0b2xkX3ZvID0gVXRpbHMuZGVlcENvcHkoaGVyb192byk7XG5cdFx0XHRcdGlmKGhlcm9fdm8uc3RhciA9PSB0aGlzLmhlcm9faW5mb190YWxlbnRfc2tpbGxfcGFyYW1bMV0gLSAxKXtcblx0XHRcdFx0XHRoZXJvX3ZvLmlzX29wZW5fdGFsZW50ID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChpbmZvLmJyZWFrX2xldiAmJiBoZXJvX3ZvLmJyZWFrX2xldiA8IGluZm8uYnJlYWtfbGV2KSB7ICAgICAvLyDov5vpmLZcblx0XHRcdFx0b3Blbl90eXBlID0gMjtcblx0XHRcdFx0b2xkX3ZvID0gVXRpbHMuZGVlcENvcHkoaGVyb192byk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblxuXHRcdH1cblxuXHRcdC8vIOabtOaWsOacgOWkp+aYn+e6p1xuXHRcdHZhciBjdXJfc3RhciA9IGluZm8uc3RhciB8fCBwYXJfY2ZnLmluaXRfc3Rhcjtcblx0XHRpZiAodGhpcy5kaWNfaGFkX2hlcm9faW5mb1tiaWRdKSB7XG5cdFx0XHRpZiAodGhpcy5kaWNfaGFkX2hlcm9faW5mb1tiaWRdIDwgY3VyX3N0YXIpXG5cdFx0XHRcdHRoaXMuZGljX2hhZF9oZXJvX2luZm9bYmlkXSA9IGN1cl9zdGFyO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmRpY19oYWRfaGVyb19pbmZvW2JpZF0gPSBjdXJfc3Rhcjtcblx0XHR9XG5cdFx0aGVyb192by51cGRhdGVIZXJvVm8oaW5mbyk7XG5cdFx0aWYgKGlzX2FkZCkge1xuXHRcdFx0dGhpcy5oZXJvX2FycmF5LnB1c2goaGVyb192byk7XG5cdFx0XHRpZighdGhpcy5oZXJvX2JpZF9saXN0W2hlcm9fdm8uYmlkXSl7XG5cdFx0XHRcdHRoaXMuaGVyb19iaWRfbGlzdFtoZXJvX3ZvLmJpZF0gPSBbXVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5oZXJvX2JpZF9saXN0W2hlcm9fdm8uYmlkXS5wdXNoKGhlcm9fdm8pXG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChvcGVuX3R5cGUgPT0gMSAmJiBvbGRfdm8pIHsgICAgICAgICAgLy8g5omT5byA5Y2H5pif5oiQ5Yqf55WM6Z2iXG5cdFx0XHRcdHRoaXMuY3RybC5vcGVuSGVyb1VwZ3JhZGVTdGFyRXhoaWJpdGlvblBhbmVsKHRydWUsIG9sZF92bywgaGVyb192byk7XG5cdFx0XHRcdEhlcm9DYWxjdWxhdGUuZ2V0SW5zdGFuY2UoKS5jbGVhckFsbEhlcm9SZWNvcmRCeVJlZFBvaW50VHlwZShIZXJvQ29uc3QuUmVkUG9pbnRUeXBlLmVSUFN0YXIpXG5cdFx0XHR9IGVsc2UgaWYgKG9wZW5fdHlwZSA9PSAyICYmIG9sZF92bykgeyAgIC8vIOaJk+W8gOi/m+mYtuaIkOWKn+eVjOmdolxuXHRcdFx0XHR0aGlzLmN0cmwub3BlbkJyZWFrRXhoaWJpdGlvbldpbmRvdyh0cnVlLCBvbGRfdm8sIGhlcm9fdm8pO1xuXHRcdFx0fVxuXHRcdFx0Z2NvcmUuR2xvYmFsRXZlbnQuZmlyZShIZXJvRXZlbnQuSGVyb19EYXRhX1VwZGF0ZSwgaGVyb192byk7XG5cdFx0fVxuXHRcdEhlcm9DYWxjdWxhdGUuZ2V0SW5zdGFuY2UoKS5jaGVja0hlcm9SZWRQb2ludEJ5UmVkUG9pbnRUeXBlKEhlcm9Db25zdC5SZWRQb2ludFR5cGUuZVJQTGV2ZWxVcClcblx0XHRjYy5sb2coXCJ1cGRhdGVIZXJvVm9cIilcblx0fSxcblxuXHQvLyDojrflj5bljZXkuKrkvJnkvLTmlbDmja4saWRcblx0Ly8gQGlkIOaYr+iLsembhOWUr+S4gOagh+ivhmlkIFxuXHRnZXRIZXJvQnlJZDogZnVuY3Rpb24gKHBhcnRuZXJfaWQpIHtcblx0XHRpZiAoIXRoaXMuaGVyb19saXN0KSByZXR1cm47XG5cdFx0aWYgKCFwYXJ0bmVyX2lkIHx8IHR5cGVvZiBwYXJ0bmVyX2lkICE9IFwibnVtYmVyXCIpIHJldHVybjtcblx0XHRyZXR1cm4gdGhpcy5oZXJvX2xpc3RbcGFydG5lcl9pZF0gfHwge31cblx0fSxcblxuXHQvLyDliKDpmaToi7Hpm4QgXG5cdGRlbEhlcm9EYXRhTGlzdDogZnVuY3Rpb24gKGxpc3QpIHtcblx0XHRpZiAoIWxpc3QpIHJldHVybjtcblx0XHRjYy5sb2coXCJkZWxIZXJvRGF0YUxpc3RcIilcblx0XHRmb3IgKHZhciBoZXJvX2kgaW4gbGlzdCkge1xuXHRcdFx0bGV0IHYgPSBsaXN0W2hlcm9faV1cblx0XHRcdGxldCB0ZW1wX2JpZCA9IHRoaXMuaGVyb19saXN0W3YucGFydG5lcl9pZF0uYmlkXG5cdFx0XHRkZWxldGUgdGhpcy5oZXJvX2xpc3RbbGlzdFtoZXJvX2ldLnBhcnRuZXJfaWRdXG5cdFx0XHQvLyAtLeWQjOaXtuS7jmJpZOiLsembhOWIl+ihqOWIoOmZpOivpeiLsembhOiusOW9lVxuXHRcdFx0bGV0IGJpZGxpc3QgPSB0aGlzLmhlcm9fYmlkX2xpc3RbdGVtcF9iaWRdXG5cdFx0XHRpZihiaWRsaXN0KXtcblx0XHRcdFx0Zm9yKGxldCBpPTA7aTxiaWRsaXN0Lmxlbmd0aDsrK2kpe1xuXHRcdFx0XHRcdGxldCBoZXJvX3ZvID0gYmlkbGlzdFtpXVxuXHRcdFx0XHRcdGlmKGhlcm9fdm8ucGFydG5lcl9pZCA9PSB2LnBhcnRuZXJfaWQpe1xuXHRcdFx0XHRcdFx0YmlkbGlzdC5zcGxpY2UoaSwxKVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRcblx0XHR0aGlzLmhlcm9fYXJyYXkgPSBbXTtcblx0XHRmb3IgKHZhciBoZXJvX2kgaW4gdGhpcy5oZXJvX2xpc3QpIHtcblx0XHRcdHRoaXMuaGVyb19hcnJheS5wdXNoKHRoaXMuaGVyb19saXN0W2hlcm9faV0pO1xuXHRcdH1cblxuXHQgICAgLy8g5raI6Zmk54aU54K856Wt5Z2b55qE57qi54K5IOWIoOmZpOS5n+imgemHjeaWsOeul1xuXHQgICAgSGVyb0NhbGN1bGF0ZS5nZXRJbnN0YW5jZSgpLmNsZWFyQWxsU3RhckZ1c2VSZWRwb2ludFJlY29yZCgpO1xuXG5cdCAgICAvLyDljYfmmJ/nuqLngrlcblx0ICAgIHRoaXMuaXNfdXBncmFkZXN0YXJfcmVkcG9pbnRfaGVyb191cGRhdGUgPSB0cnVlXG5cdCAgICB0aGlzLmNoZWNrVXBncmFkZVN0YXJSZWRQb2ludFVwZGF0ZSgpXG5cblx0XHRnY29yZS5HbG9iYWxFdmVudC5maXJlKEhlcm9FdmVudC5EZWxfSGVyb19FdmVudCwgbGlzdCk7XG5cdH0sXG5cdC8vIC0t5pu05paw5aSp6LWL5L+h5oGvXG5cdHVwZGF0ZUhlcm9Wb1RhbGVudChkYXRhX2xpc3QsIGlzX25vdF9jaGVjayl7XG5cdFx0bGV0IGlzX3RlYW0gPSBmYWxzZVxuXHRcdHZhciBzZWxmID0gdGhpc1xuXHRcdGZvcihsZXQgaT0wO2k8ZGF0YV9saXN0Lmxlbmd0aDsrK2kpe1xuXHRcdFx0bGV0IHYgPSBkYXRhX2xpc3RbaV1cblx0XHRcdGlmKHNlbGYuaGVyb19saXN0W3YucGFydG5lcl9pZF0pe1xuXHRcdFx0XHRzZWxmLmhlcm9fbGlzdFt2LnBhcnRuZXJfaWRdLnVwZGF0ZVNraWxsKHYuZG93ZXJfc2tpbGwpXG5cdFx0XHRcdGlmKCFpc190ZWFtKXtcblx0XHRcdFx0XHRpZihzZWxmLmhlcm9fbGlzdFt2LnBhcnRuZXJfaWRdLmlzRm9ybURyYW1hKCkpe1xuXHRcdFx0XHRcdFx0aXNfdGVhbSA9IHRydWVcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0aWYoaXNfdGVhbSAmJiAhaXNfbm90X2NoZWNrKXtcblx0XHRcdC8vIC0t5aaC5p6c5pyJ5Ymn5oOF6Zi15a6555qE6Iux6ZuELi7pnIDopoHmo4Dmn6XnuqLngrlcblx0XHRcdC8vIC0t5qOA5rWL57qi54K5XG5cdFx0XHRIZXJvQ2FsY3VsYXRlLmdldEluc3RhbmNlKCkuY2hlY2tBbGxIZXJvUmVkUG9pbnQoKSAgICBcblx0XHR9XG5cdH0sXG5cdGdldEhlcm9MaXN0OiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuaGVyb19saXN0IHx8IHt9XG5cdH0sXG5cblx0Z2V0QWxsSGVyb0FycmF5OiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuaGVyb19hcnJheTtcblx0fSxcblxuXHQvLyDmoLnmja7pmLXlrrnojrflj5boi7Hpm4TliJfooahcblx0Z2V0SGVyb0xpc3RCeUNhbXA6IGZ1bmN0aW9uIChjYW1wKSB7XG5cdFx0aWYgKHR5cGVvZiBjYW1wICE9PSBcIm51bWJlclwiKSByZXR1cm47XG5cdFx0dmFyIGhlcm9fbGlzdCA9IFtdO1xuXG5cdFx0Zm9yICh2YXIgaGVyb19pIGluIHRoaXMuaGVyb19hcnJheSkge1xuXHRcdFx0aWYgKGNhbXAgPT09IEhlcm9Db25zdC5DYW1wVHlwZS5lTm9uZSB8fCBjYW1wID09PSB0aGlzLmhlcm9fYXJyYXlbaGVyb19pXS5jYW1wX3R5cGUpIHtcblx0XHRcdFx0Ly8gaGVyb19saXN0LnB1c2goVXRpbHMuZGVlcENvcHkodGhpcy5oZXJvX2FycmF5W2hlcm9faV0pKTtcblx0XHRcdFx0aGVyb19saXN0LnB1c2godGhpcy5oZXJvX2FycmF5W2hlcm9faV0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHZhciBoZXJvX3NvcnQgPSB0aGlzLmdldEhlcm9Tb3J0RnVuYygpO1xuXHRcdHJldHVybiBoZXJvX2xpc3Quc29ydChoZXJvX3NvcnQpO1xuXHR9LFxuXG5cdC8vIOagueaNrumYteWuueiOt+WPluiLsembhOWIl+ihqFxuXHRnZXREZWVwSGVyb0xpc3RCeUNhbXA6IGZ1bmN0aW9uIChjYW1wKSB7XG5cdFx0aWYgKHR5cGVvZiBjYW1wICE9PSBcIm51bWJlclwiKSByZXR1cm47XG5cdFx0dmFyIGhlcm9fbGlzdCA9IFtdO1xuXG5cdFx0Zm9yICh2YXIgaGVyb19pIGluIHRoaXMuaGVyb19hcnJheSkge1xuXHRcdFx0aWYgKGNhbXAgPT09IEhlcm9Db25zdC5DYW1wVHlwZS5lTm9uZSB8fCBjYW1wID09PSB0aGlzLmhlcm9fYXJyYXlbaGVyb19pXS5jYW1wX3R5cGUpIHtcblx0XHRcdFx0Ly8gaGVyb19saXN0LnB1c2goVXRpbHMuZGVlcENvcHkodGhpcy5oZXJvX2FycmF5W2hlcm9faV0pKTtcblx0XHRcdFx0aGVyb19saXN0LnB1c2godGhpcy5oZXJvX2FycmF5W2hlcm9faV0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHZhciBoZXJvX3NvcnQgPSB0aGlzLmdldEhlcm9Tb3J0RnVuYygpO1xuXHRcdHJldHVybiBVdGlscy5kZWVwQ29weShoZXJvX2xpc3Quc29ydChoZXJvX3NvcnQpKTtcblx0fSxcblxuXHRnZXRSZXN0SGVyb0xpc3RCeUNhbXA6IGZ1bmN0aW9uIChjYW1wKSB7XG5cdFx0aWYgKHR5cGVvZiBjYW1wICE9PSBcIm51bWJlclwiKSByZXR1cm47XG5cdFx0dmFyIGhlcm9fbGlzdCA9IFtdO1xuXHRcdGZvciAodmFyIGhlcm9faSBpbiB0aGlzLmhlcm9fYXJyYXkpIHtcblx0XHRcdGlmIChjYW1wID09PSBIZXJvQ29uc3QuQ2FtcFR5cGUuZU5vbmUgfHwgY2FtcCA9PT0gdGhpcy5oZXJvX2FycmF5W2hlcm9faV0uY2FtcF90eXBlKSB7XG5cdFx0XHRcdGhlcm9fbGlzdC5wdXNoKHRoaXMuaGVyb19hcnJheVtoZXJvX2ldKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR2YXIgcmVzdF9oZXJvX2xpc3QgPSBVdGlscy5kZWVwQ29weShoZXJvX2xpc3QpO1xuXHRcdGZvciAodmFyIGhlcm9faSBpbiByZXN0X2hlcm9fbGlzdCkge1xuXHRcdFx0dmFyIGhlcm9fdm8gPSByZXN0X2hlcm9fbGlzdFtoZXJvX2ldO1xuXHRcdFx0aWYgKGhlcm9fdm8uaXNfaW5fZm9ybSA+IDAgfHwgaGVyb192by5pc19sb2NrKSB7XG5cdFx0XHRcdGhlcm9fdm8uaXNfdWlfbG9jayA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dmFyIGhlcm9fc29ydCA9IGZ1bmN0aW9uIChyb2xlX3ZvMSwgcm9sZV92bzIpIHtcblx0XHRcdGlmICgoIXJvbGVfdm8xLmlzX3VpX2xvY2sgJiYgIXJvbGVfdm8yLmlzX3VpX2xvY2spIHx8IChyb2xlX3ZvMS5pc191aV9sb2NrICYmIHJvbGVfdm8yLmlzX3VpX2xvY2spKSB7XG5cdFx0XHRcdGlmIChyb2xlX3ZvMS5zdGFyID09PSByb2xlX3ZvMi5zdGFyKSB7XG5cdFx0XHRcdFx0aWYgKHJvbGVfdm8xLnBvd2VyID09IHJvbGVfdm8yLnBvd2VyKSB7XG5cdFx0XHRcdFx0XHRpZiAocm9sZV92bzEubGV2ID09IHJvbGVfdm8yLmxldikge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcm9sZV92bzIuc29ydF9vcmRlciAtIHJvbGVfdm8xLnNvcnRfb3JkZXI7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcm9sZV92bzEubGV2IC0gcm9sZV92bzIubGV2O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcm9sZV92bzEucG93ZXIgLSByb2xlX3ZvMi5wb3dlcjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJvbGVfdm8xLnN0YXIgLSByb2xlX3ZvMi5zdGFyO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAocm9sZV92bzEuaXNfdWlfbG9jaylcblx0XHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN0X2hlcm9fbGlzdC5zb3J0KGhlcm9fc29ydCk7XG5cdH0sXG5cblx0c2V0SGFkSGVyb0luZm86IGZ1bmN0aW9uIChsaXN0KSB7XG5cdFx0aWYgKCFsaXN0KSByZXR1cm47XG5cdFx0Zm9yICh2YXIgaGVyb19pIGluIGxpc3QpXG5cdFx0XHR0aGlzLmRpY19oYWRfaGVyb19pbmZvW2xpc3RbaGVyb19pXS5wYXJ0bmVyX2lkXSA9IGxpc3RbaGVyb19pXS5tYXhfc3Rhcjtcblx0fSxcblxuXHQvLyDliJ3lp4vljJblm77pibTmlbDmja5cblx0Z2V0SGVyb1Bva2VkZXhMaXN0OiBmdW5jdGlvbiAoY2FtcCkge1xuXHRcdGlmICghdGhpcy5kaWNfcG9rZWRleF9pbmZvKSB7XG5cdFx0XHR0aGlzLmRpY19wb2tlZGV4X2luZm8gPSB7fTtcblx0XHRcdGZvciAodmFyIGNhbXBfaSBpbiBIZXJvQ29uc3QuQ2FtcFR5cGUpIHtcblx0XHRcdFx0aWYgKGNhbXBfaSAhPT0gXCJlTm9uZVwiKVxuXHRcdFx0XHRcdHRoaXMuZGljX3Bva2VkZXhfaW5mb1tIZXJvQ29uc3QuQ2FtcFR5cGVbY2FtcF9pXV0gPSBbXTtcblx0XHRcdH1cblx0XHRcdHZhciBwb2tlZGV4X2NmZyA9IENvbmZpZy5wYXJ0bmVyX2RhdGEuZGF0YV9wYXJ0bmVyX3Bva2VkZXg7XG5cdFx0XHRpZiAocG9rZWRleF9jZmcpIHtcblx0XHRcdFx0Zm9yICh2YXIgYmlkIGluIHBva2VkZXhfY2ZnKSB7XG5cdFx0XHRcdFx0dmFyIHBhcl9jZmcgPSBDb25maWcucGFydG5lcl9kYXRhLmRhdGFfcGFydG5lcl9iYXNlW2JpZF07XG5cdFx0XHRcdFx0Zm9yICh2YXIgc3Rhcl9pIGluIHBva2VkZXhfY2ZnW2JpZF0pIHtcblx0XHRcdFx0XHRcdHZhciBzdGFyID0gcG9rZWRleF9jZmdbYmlkXVtzdGFyX2ldLnN0YXI7XG5cdFx0XHRcdFx0XHR2YXIga2V5ID0gYmlkICsgXCJfXCIgKyBzdGFyO1xuXHRcdFx0XHRcdFx0dmFyIGluZm8gPSB0aGlzLmdldEhlcm9Qb2tlZGV4QnlCaWQoa2V5KTtcblx0XHRcdFx0XHRcdGlmIChpbmZvKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuZGljX3Bva2VkZXhfaW5mb1tpbmZvLmNhbXBfdHlwZV0ucHVzaChpbmZvKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dmFyIHNvcnRfZnVuY3Rpb24gPSBmdW5jdGlvbiAoZGljX3Bva2VkZXhfMSwgZGljX3Bva2VkZXhfMikge1xuXHRcdFx0XHRpZiAoZGljX3Bva2VkZXhfMS5zdGFyID09PSBkaWNfcG9rZWRleF8yLnN0YXIpIHtcblx0XHRcdFx0XHRyZXR1cm4gZGljX3Bva2VkZXhfMS5iaWQgLSBkaWNfcG9rZWRleF8yLmJpZDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gZGljX3Bva2VkZXhfMS5zdGFyIC0gZGljX3Bva2VkZXhfMi5zdGFyO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyDmjpLluo9cblx0XHRcdGZvciAodmFyIGRpY19wb2tlZGV4X2kgaW4gdGhpcy5kaWNfcG9rZWRleF9pbmZvKSB7XG5cdFx0XHRcdHRoaXMuZGljX3Bva2VkZXhfaW5mb1tkaWNfcG9rZWRleF9pXS5zb3J0KHNvcnRfZnVuY3Rpb24pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmRpY19wb2tlZGV4X2luZm9bY2FtcF1cblx0fSxcblxuXHRnZXRIZXJvUG9rZWRleEJ5QmlkOiBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0aWYgKHRoaXMuZGljX3Bva2VkZXhfYmlkW2tleV0pIHJldHVybiB0aGlzLmRpY19wb2tlZGV4X2JpZFtrZXldO1xuXG5cdFx0dmFyIHBhcl9zaG93X2NmZyA9IGdkYXRhKFwicGFydG5lcl9kYXRhXCIsIFwiZGF0YV9wYXJ0bmVyX3Nob3dcIiwga2V5KTtcblx0XHRpZiAoIXBhcl9zaG93X2NmZykge1xuXHRcdFx0cmV0dXJuIG51bGxcblx0XHR9XG5cblx0XHR2YXIgcGFyX2Jhc2VfY2ZnID0gQ29uZmlnLnBhcnRuZXJfZGF0YS5kYXRhX3BhcnRuZXJfYmFzZVtwYXJfc2hvd19jZmcuYmlkXTtcblx0XHRpZiAocGFyX2Jhc2VfY2ZnKSB7XG5cdFx0XHR2YXIgYnJlYWtfbGV2ID0gdGhpcy5nZXRIZXJvTWF4QnJlYWtDb3VudEJ5SW5pdFN0YXIocGFyX3Nob3dfY2ZnLnN0YXIpO1xuXHRcdFx0cGFyX3Nob3dfY2ZnLmhwX21heCA9IHBhcl9zaG93X2NmZy5ocCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDkuLrkuoborqHnrpfmiJjlipvnlKjnmoQgXG5cdFx0XHRwYXJfc2hvd19jZmcucG93ZXIgPSBQYXJ0bmVyQ2FsY3VsYXRlLmNhbGN1bGF0ZVBvd2VyKHBhcl9zaG93X2NmZyk7XG5cdFx0XHRwYXJfc2hvd19jZmcuY2FtcF90eXBlID0gcGFyX2Jhc2VfY2ZnLmNhbXBfdHlwZTtcblx0XHRcdHBhcl9zaG93X2NmZy5uYW1lID0gcGFyX2Jhc2VfY2ZnLm5hbWU7XG5cdFx0XHRwYXJfc2hvd19jZmcuaW5pdF9zdGFyID0gcGFyX2Jhc2VfY2ZnLmluaXRfc3Rhcjtcblx0XHRcdHBhcl9zaG93X2NmZy50eXBlID0gcGFyX2Jhc2VfY2ZnLnR5cGU7XG5cdFx0XHRwYXJfc2hvd19jZmcuYnJlYWtfaWQgPSBwYXJfYmFzZV9jZmcuYnJlYWtfaWQ7XG5cdFx0XHRwYXJfc2hvd19jZmcuYnJlYWtfbGV2ID0gYnJlYWtfbGV2O1xuXHRcdFx0cGFyX3Nob3dfY2ZnLnBhcnRuZXJfaWQgPSBwYXJfc2hvd19jZmcuYmlkICogMTAgKyBwYXJfc2hvd19jZmcuc3RhcjsgICAgICAgICAgLy8g5a6a5LmJ5LiA5Liq5ZSv5LiAaWRcdCAgXG5cdFx0XHRwYXJfc2hvd19jZmcuaXNfcG9rZWRleCA9IHRydWU7ICAvLyDmmK/kuI3mmK/lm77pibQgIFx0XG5cdFx0XHR0aGlzLmRpY19wb2tlZGV4X2JpZFtrZXldID0gcGFyX3Nob3dfY2ZnO1xuXHRcdFx0cmV0dXJuIHRoaXMuZGljX3Bva2VkZXhfYmlkW2tleV07XG5cdFx0fVxuXHRcdHJldHVybiBudWxsXG5cdH0sXG5cblx0Ly8g5qC55o2u5Yid5aeL5pif57qnIOaIluiAheWvueW6lOiLsembhOacgOWkp+i/m+mYtuasoeaVsFxuXHRnZXRIZXJvTWF4QnJlYWtDb3VudEJ5SW5pdFN0YXI6IGZ1bmN0aW9uIChpbml0X3N0YXIpIHtcblx0XHRpZiAoIXRoaXMuZGljX21heF9icmVhaykge1xuXHRcdFx0dmFyIHZhbCA9IENvbmZpZy5wYXJ0bmVyX2RhdGEuZGF0YV9wYXJ0bmVyX2NvbnN0LmFkdmFuY2VkX2xpbWl0LnZhbFxuXHRcdFx0dGhpcy5kaWNfbWF4X2JyZWFrID0ge31cblx0XHRcdGZvciAodmFyIHZhbF9pIGluIHZhbCkge1xuXHRcdFx0XHR0aGlzLmRpY19tYXhfYnJlYWtbdmFsW3ZhbF9pXVswXV0gPSB2YWxbdmFsX2ldWzFdO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5kaWNfbWF4X2JyZWFrW2luaXRfc3Rhcl0gfHwgMFxuXHR9LFxuXG5cdC8vIOagueaNruWTgei0qOiOt+WPlum7mOiupOWktOWDj1xuXHRnZXRSYW5kb21IZXJvSGVhZEJ5UXVhbGl0eTogZnVuY3Rpb24gKHF1YWxpdHkpIHtcblx0XHRpZiAoIXRoaXMuZGljX3JhbmRvbV9oZXJvX2hlYWQpIHtcblx0XHRcdHZhciB2YWwgPSBDb25maWcucGFydG5lcl9kYXRhLmRhdGFfcGFydG5lcl9jb25zdC5yYW5kb21faGVyb19pY29uLnZhbDtcblx0XHRcdHRoaXMuZGljX3JhbmRvbV9oZXJvX2hlYWQgPSB7fVxuXHRcdFx0Zm9yICh2YXIgdmFsX2kgaW4gdmFsKSB7XG5cdFx0XHRcdHZhciBpdGVtX2NvbmZpZyA9IGdkYXRhKFwiaXRlbV9kYXRhXCIsIFwiZGF0YV91bml0NVwiLCB2YWxbdmFsX2ldWzFdKTtcblx0XHRcdFx0aWYgKGl0ZW1fY29uZmlnKVxuXHRcdFx0XHRcdHRoaXMuZGljX3JhbmRvbV9oZXJvX2hlYWRbdmFsW3ZhbF9pXVswXV0gPSBpdGVtX2NvbmZpZy5pY29uO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHZhciBxdWFsaXR5ID0gcXVhbGl0eSB8fCAwO1xuXHRcdGlmIChxdWFsaXR5ID4gNSlcblx0XHRcdHF1YWxpdHkgPSA1O1xuXHRcdHJldHVybiB0aGlzLmRpY19yYW5kb21faGVyb19oZWFkW3F1YWxpdHldXG5cdH0sXG5cblx0Z2V0SGFkSGVyb0luZm86IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy5kaWNfaGFkX2hlcm9faW5mbyB8fCB7fVxuXHR9LFxuXG5cdGdldEhhZEhlcm9TdGFyQnliaWQ6IGZ1bmN0aW9uIChiaWQpIHtcblx0XHRpZiAodGhpcy5kaWNfaGFkX2hlcm9faW5mbyAmJiB0aGlzLmRpY19oYWRfaGVyb19pbmZvW2JpZF0pIHtcblx0XHRcdHJldHVybiB0aGlzLmRpY19oYWRfaGVyb19pbmZvW2JpZF1cblx0XHR9XG5cdFx0cmV0dXJuIG51bGxcblx0fSxcblxuXG5cdGlzT3BlblRhbmxlbnRCeUhlcm92byhoZXJvX3ZvKXtcblx0XHRpZihoZXJvX3ZvW3RoaXMuaGVyb19pbmZvX3RhbGVudF9za2lsbF9wYXJhbVswXV0pe1xuXHRcdFx0aWYoaGVyb192b1t0aGlzLmhlcm9faW5mb190YWxlbnRfc2tpbGxfcGFyYW1bMF1dID49IHRoaXMuaGVyb19pbmZvX3RhbGVudF9za2lsbF9wYXJhbVsxXSl7XG5cdFx0XHRcdHJldHVybiB0cnVlXG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZVxuXHR9LFxuXHQvKioqKioqKioqKioq6Zi15rOV55u45YWzKioqKioqKioqKioqL1xuXHRzZXRGb3JtTGlzdDogZnVuY3Rpb24gKGRhdGEpIHtcblx0XHR2YXIgZm9ybV90eXBlID0gZGF0YS50eXBlID49IDAgPyBkYXRhLnR5cGUgOiBQYXJ0bmVyQ29uc3QuRnVuX0Zvcm0uRHJhbWE7XG5cdFx0aWYgKHRoaXMucG9zX2xpc3RbZm9ybV90eXBlXSkge1xuXHRcdCAgICBmb3IgKHZhciBmb3JtX2kgaW4gdGhpcy5wb3NfbGlzdFtmb3JtX3R5cGVdKSB7XG5cdFx0ICAgICAgICB2YXIgdm8gPSB0aGlzLmdldEhlcm9CeUlkKHRoaXMucG9zX2xpc3RbZm9ybV90eXBlXVtmb3JtX2ldLmlkKVxuXHRcdCAgICAgICAgaWYgKHZvICYmIHZvLnVwZGF0ZUZvcm1Qb3MpIHtcblx0XHQgICAgICAgICAgICB2by51cGRhdGVGb3JtUG9zKDAsIGZvcm1fdHlwZSlcblx0XHQgICAgICAgIH1cblx0XHQgICAgfVxuXHRcdH1cblxuXHRcdHRoaXMucG9zX2xpc3RbZm9ybV90eXBlXSA9IHt9XG5cdFx0Zm9yICh2YXIgcG9zX2kgaW4gZGF0YS5wb3NfaW5mbykge1xuXHRcdFx0dGhpcy5wb3NfbGlzdFtmb3JtX3R5cGVdW2RhdGEucG9zX2luZm9bcG9zX2ldLnBvc10gPSBkYXRhLnBvc19pbmZvW3Bvc19pXTtcblx0XHRcdHZhciB2byA9IHRoaXMuZ2V0SGVyb0J5SWQoZGF0YS5wb3NfaW5mb1twb3NfaV0uaWQpXG5cdFx0XHQvLyDlrrnplJnlpITnkIYgIGJ1Z2x55Ye6546w6K+0ICB1cGRhdGVGb3JtUG9zIOi/meS4quaYryAoYSBuaWwgdmFsdWUpXG5cdFx0XHRpZiAodm8gJiYgdm8udXBkYXRlRm9ybVBvcylcblx0XHRcdFx0dm8udXBkYXRlRm9ybVBvcyhkYXRhLnBvc19pbmZvW3Bvc19pXS5wb3MsIGZvcm1fdHlwZSk7XG5cdFx0fVxuXG5cdFx0Ly8g5Ymn5oOF6Zi15rOV6YC76L6RXG5cdFx0aWYgKGZvcm1fdHlwZSA9PSBQYXJ0bmVyQ29uc3QuRnVuX0Zvcm0uRHJhbWEpIHtcblx0XHRcdHRoaXMuZm9ybV9wb3dlciA9IGRhdGEucG93ZXIgfHwgMDtcblx0XHRcdC8vIOmYteazleexu+Wei1xuXHRcdFx0dGhpcy51c2VfZm9ybWF0aW9uX3R5cGUgPSBkYXRhLmZvcm1hdGlvbl90eXBlO1xuXHRcdFx0Ly8g5L2/55So55qE5Zyj5ZmoaWRcblx0XHRcdHRoaXMudXNlX2hhbGxvd3NfaWQgPSBkYXRhLmhhbGxvd3NfaWQ7XG5cblx0XHRcdC8vIEdsb2JhbEV2ZW50OmdldEluc3RhbmNlKCk6RmlyZShIZXJvRXZlbnQuRm9ybV9EcmFtYV9FdmVudCxkYXRhKVxuXHRcdFx0dmFyIGNhbGN1bGF0ZSA9IEhlcm9DYWxjdWxhdGUuZ2V0SW5zdGFuY2UoKTtcblx0XHRcdFJlZE1nci5nZXRJbnN0YW5jZSgpLmFkZENhbEhhbmRsZXIoY2FsY3VsYXRlLmNoZWNrQWxsSGVyb1JlZFBvaW50LmJpbmQoY2FsY3VsYXRlKSwgUmVkSWRzLkhlcm9BbGwpO1xuXG5cdFx0XHQvLyDmo4DmtYvnuqLngrlcblx0XHRcdC8vIEhlcm9DYWxjdWxhdGUuZ2V0SW5zdGFuY2UoKS5jaGVja0FsbEhlcm9SZWRQb2ludCgpO1xuXHRcdFx0bGV0IGxpc3QgPSBbXVxuXHRcdFx0Zm9yKGxldCBrIGluIHRoaXMucG9zX2xpc3RbZm9ybV90eXBlXSl7XG5cdFx0XHRcdGxldCB2ID0gdGhpcy5wb3NfbGlzdFtmb3JtX3R5cGVdW2tdXG5cdFx0XHRcdGxpc3QucHVzaCh7cGFydG5lcl9pZCA6IHYuaWR9KVxuXHRcdFx0fVxuXHRcdFx0Ly8gLS3or7fmsYLlpKnotYvnmoRcblx0XHRcdEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkuc2VuZGVyMTEwOTkobGlzdClcblx0XHR9XG5cdH0sXG5cblx0Ly8g6I635Y+W5pyA6auY5oiY5Yqb55qE6Iux6ZuE5oiY5YqbXG5cdGdldE1heEZpZ2h0OiBmdW5jdGlvbiAoKSB7XG5cdFx0aWYgKHRoaXMuaGVyb19hcnJheSkge1xuXHRcdFx0dGhpcy5oZXJvX2FycmF5LnNvcnQoVXRpbHMudGFibGVVcHBlclNvcnRlcihbXCJwb3dlclwiXSkpO1xuXHRcdFx0dmFyIGhlcm9fdm8gPSB0aGlzLmhlcm9fYXJyYXlbMF07XG5cdFx0XHRpZiAoaGVyb192bykge1xuXHRcdFx0XHRyZXR1cm4gaGVyb192by5wb3dlclxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gMFxuXHR9LFxuXHQvL+mAmui/h2JpZOiOt+WPluetiee6p+acgOmrmOeahOiLsembhOS/oeaBr1xuXHRnZXRUb3BMZXZIZXJvSW5mb0J5QmlkKGJpZCl7XG5cdFx0aWYgKCFiaWQpIHJldHVybiA7XG5cdFx0bGV0IGxpc3QgPSB0aGlzLmhlcm9fYmlkX2xpc3RbYmlkXVxuXHRcdGlmIChsaXN0KXtcblx0XHRcdGxpc3Quc29ydChVdGlscy50YWJsZVVwcGVyU29ydGVyKFtcImxldlwiLCBcInBvd2VyXCJdKSlcblx0XHRcdHJldHVybiBsaXN0WzBdXG5cdFx0fVxuXHRcdHJldHVybiBudWxsXG5cdH0sXG5cdC8v6ZuH5L2j55qEXG5cdGdldEV4cGVkaXRIZXJvRGF0YTogZnVuY3Rpb24gKCkge1xuXHRcdHZhciBoZXJvX2xpc3QgPSB0aGlzLmdldEFsbEhlcm9BcnJheSgpO1xuXHRcdHZhciBsaXN0ID0gW107XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBoZXJvX2xpc3QubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciB0YWIgPSB7fVxuXHRcdFx0dGFiLnBvd2VyID0gaGVyb19saXN0W2ldLnBvd2VyO1xuXHRcdFx0dGFiLm5hbWUgPSBoZXJvX2xpc3RbaV0ubmFtZTtcblx0XHRcdHRhYi5iaWQgPSBoZXJvX2xpc3RbaV0uYmlkO1xuXHRcdFx0dGFiLmluZGV4ID0gaTtcblxuXHRcdFx0dGFiLnJpZCA9IGhlcm9fbGlzdFtpXS5yaWQ7XG5cdFx0XHR0YWIuc3J2X2lkID0gaGVyb19saXN0W2ldLnNydl9pZDtcblx0XHRcdHRhYi5pZCA9IGhlcm9fbGlzdFtpXS5pZDtcblx0XHRcdHRhYi5zdGFyID0gaGVyb19saXN0W2ldLnN0YXI7XG5cdFx0XHR0YWIubGV2ID0gaGVyb19saXN0W2ldLmxldjtcblx0XHRcdHRhYi51c2Vfc2tpbiA9IGhlcm9fbGlzdFtpXS51c2Vfc2tpbjtcblx0XHRcdFxuXHRcdFx0bGlzdC5wdXNoKHRhYik7XG5cdFx0fVxuXHRcdGxpc3Quc29ydChmdW5jdGlvbiAoYSwgYikge1xuXHRcdFx0cmV0dXJuIGIucG93ZXIgPCBhLnBvd2VyO1xuXHRcdH0pO1xuXHRcdHJldHVybiBsaXN0XG5cdH0sXG5cblx0Ly8g6I635Y+W6Ieq5bex55qE6Zif5LyN6Zi15rOV56uZ5L2NXG5cdGdldE15UG9zTGlzdDogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLnBvc19saXN0W1BhcnRuZXJDb25zdC5GdW5fRm9ybS5EcmFtYV0gfHwge31cblx0fSxcblxuXHRnZXRIZXJvU29ydEZ1bmM6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgaGVyb19zb3J0ID0gZnVuY3Rpb24gKHJvbGVfdm8xLCByb2xlX3ZvMikge1xuXHRcdFx0aWYgKHJvbGVfdm8xLnN0YXIgPT09IHJvbGVfdm8yLnN0YXIpIHtcblx0XHRcdFx0aWYgKHJvbGVfdm8xLnBvd2VyID09IHJvbGVfdm8yLnBvd2VyKSB7XG5cdFx0XHRcdFx0aWYgKHJvbGVfdm8xLmxldiA9PSByb2xlX3ZvMi5sZXYpIHtcblx0XHRcdFx0XHRcdHJldHVybiByb2xlX3ZvMS5zb3J0X29yZGVyIC0gcm9sZV92bzIuc29ydF9vcmRlcjtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJvbGVfdm8yLmxldiAtIHJvbGVfdm8xLmxldlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gcm9sZV92bzIucG93ZXIgLSByb2xlX3ZvMS5wb3dlclxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gcm9sZV92bzIuc3RhciAtIHJvbGVfdm8xLnN0YXJcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGhlcm9fc29ydFxuXHR9LFxuXG5cdGlzTWF4U3Rhckhlcm86IGZ1bmN0aW9uIChiaWQsIHN0YXIpIHtcblx0XHRpZiAoIWJpZCB8fCAhc3RhcikgcmV0dXJuIGZhbHNlO1xuXHRcdHZhciBtYXhfc3RhciA9IENvbmZpZy5wYXJ0bmVyX2RhdGEuZGF0YV9wYXJ0bmVyX21heF9zdGFyW2JpZF07XG5cdFx0aWYgKG1heF9zdGFyICYmIHN0YXIgPj0gbWF4X3N0YXIpIHtcblx0XHRcdHJldHVybiB0cnVlXG5cdFx0fVxuXHRcdGlmIChzdGFyID49IHRoaXMuaGVyb19pbmZvX3VwZ3JhZGVfc3Rhcl9wYXJhbSl7XG5cdFx0XHRpZihzdGFyID09IHRoaXMuaGVyb19pbmZvX3VwZ3JhZGVfc3Rhcl9wYXJhbTIpe1xuICAgICAgICAgICAgXHQvLyAtLTEw57qn5Y2HMTHmnInkuJbnlYznrYnnuqfopoHmsYJcblx0XHRcdFx0cmV0dXJuICF0aGlzLmNoZWNrT3BlblN0YXIxMSgpXG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblxuXHRnZXRTdGFyRnVzZUxpc3Q6IGZ1bmN0aW9uIChjYW1wX3R5cGUpIHtcblx0XHRjYW1wX3R5cGUgPSBjYW1wX3R5cGUgfHwgMDtcblx0XHR2YXIgY2FtcF9mdXNlX2xpc3QgPSBbXTtcblx0XHR2YXIgZnVzZV9jZmcgPSBDb25maWcucGFydG5lcl9kYXRhLmRhdGFfcGFydG5lcl9mdXNlX3N0YXI7XG5cdFx0aWYgKCFmdXNlX2NmZykgcmV0dXJuXG5cdFx0Zm9yICh2YXIgY2ZnX2kgaW4gZnVzZV9jZmcpIHtcblx0XHRcdHZhciBmdXNlX2NmZ19pdGVtID0gZnVzZV9jZmdbY2ZnX2ldO1xuXHRcdFx0dmFyIGJhc2VfY29uZmlnID0gQ29uZmlnLnBhcnRuZXJfZGF0YS5kYXRhX3BhcnRuZXJfYmFzZVtjZmdfaV07XG5cdFx0XHRmb3IgKHZhciBpdGVtX2kgaW4gZnVzZV9jZmdfaXRlbSkge1xuXHRcdFx0XHR2YXIgc3RhciA9IGZ1c2VfY2ZnX2l0ZW1baXRlbV9pXS5zdGFyO1xuXHRcdFx0XHR2YXIga2V5ID0gY2ZnX2kgKyBcIl9cIiArIHN0YXI7XG5cdFx0XHRcdHZhciBzdGFyX2NvbmZpZyA9IGdkYXRhKFwicGFydG5lcl9kYXRhXCIsIFwiZGF0YV9wYXJ0bmVyX3N0YXJcIiwga2V5KTtcblx0XHRcdFx0Ly8gQ29uZmlnLnBhcnRuZXJfZGF0YS5kYXRhX3BhcnRuZXJfc3RhcltrZXldO1xuXG5cdFx0XHRcdGlmIChiYXNlX2NvbmZpZyAmJiAoYmFzZV9jb25maWcuY2FtcF90eXBlID09IGNhbXBfdHlwZSB8fCBjYW1wX3R5cGUgPT09IDApKSB7XG5cdFx0XHRcdFx0aWYgKGJhc2VfY29uZmlnICYmIHN0YXJfY29uZmlnICYmIHN0YXJfY29uZmlnLmV4cGVuZDEubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0dmFyIGZ1c2VfZGF0YSA9IHt9O1xuXHRcdFx0XHRcdFx0ZnVzZV9kYXRhLmJhc2VfY29uZmlnID0gYmFzZV9jb25maWc7XG5cdFx0XHRcdFx0XHRmdXNlX2RhdGEuc3Rhcl9jb25maWcgPSBzdGFyX2NvbmZpZztcblx0XHRcdFx0XHRcdGZ1c2VfZGF0YS5jYW1wX3R5cGUgPSBiYXNlX2NvbmZpZy5jYW1wX3R5cGU7XG5cdFx0XHRcdFx0XHRmdXNlX2RhdGEuYmlkID0gY2ZnX2k7XG5cdFx0XHRcdFx0XHRmdXNlX2RhdGEuc3RhciA9IHN0YXI7XG5cdFx0XHRcdFx0XHRjYW1wX2Z1c2VfbGlzdC5wdXNoKGZ1c2VfZGF0YSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNhbXBfZnVzZV9saXN0XG5cdH0sXG5cblx0Ly8gLS3moLnmja5iaWQg6I635Y+W5LiA5Liq5qih5oufaGVyb3Zv5a+56LGhLi7lsZ7mgKfpg73mmK8x57qn55qEXG5cdGdldE1vY2tIZXJvVm9CeUJpZChiaWQpIHtcblx0XHRsZXQgYmFzZV9jb25maWcgPSBDb25maWcucGFydG5lcl9kYXRhLmRhdGFfcGFydG5lcl9iYXNlW2JpZF1cblx0XHRsZXQgYXR0cl9jb25maWcgPSBDb25maWcucGFydG5lcl9kYXRhLmRhdGFfcGFydG5lcl9hdHRyW2JpZF1cblx0XHRpZiAoIWJhc2VfY29uZmlnIHx8ICFhdHRyX2NvbmZpZykge1xuXHRcdFx0cmV0dXJuXG5cdFx0fVxuXG5cdFx0bGV0IGhlcm9fdm8gPSBVdGlscy5kZWVwQ29weShiYXNlX2NvbmZpZylcblx0XHRoZXJvX3ZvLnN0YXIgPSBiYXNlX2NvbmZpZy5pbml0X3N0YXIgLy8tLem7mOiupOaYn+aVsFxuXHRcdGhlcm9fdm8uYnJlYWtfbGV2ID0gMCAvLy0t6buY6K6k6L+b6Zi2XG5cdFx0Zm9yIChsZXQgayBpbiBhdHRyX2NvbmZpZykgeyAvLyBrLHYgaW4gcGFpcnMoYXR0cl9jb25maWcpIGRvXG5cdFx0XHRsZXQgdiA9IGF0dHJfY29uZmlnW2tdXG5cdFx0XHRpZiAoIWhlcm9fdm9ba10pIHtcblx0XHRcdFx0aGVyb192b1trXSA9IHZcblx0XHRcdH1cblx0XHR9XG5cdFx0aGVyb192by5ocCA9IGF0dHJfY29uZmlnLmhwX21heCAvLy0t6KGA6YeP562J5LqO5pyA5aSn6KGA6YePXG5cdFx0aGVyb192by5wb3dlciA9IFBhcnRuZXJDYWxjdWxhdGUuY2FsY3VsYXRlUG93ZXIoaGVyb192bylcblx0XHRyZXR1cm4gaGVyb192b1xuXHR9LFxuXHQvKioqKioqKioqKioqKioqKuijheWkh+ebuOWFsyoqKioqKioqKioqKioqKioqKi9cblx0dXBkYXRlSGVyb0VxdWlwTGlzdDogZnVuY3Rpb24gKGRhdGEpIHtcblx0XHR2YXIgcGFydG5lcl9pZCA9IGRhdGEucGFydG5lcl9pZDtcblx0XHRpZiAocGFydG5lcl9pZCAmJiB0aGlzLmhlcm9fbGlzdFtwYXJ0bmVyX2lkXSkge1xuXHRcdFx0dmFyIGhlcm9fdm8gPSB0aGlzLmhlcm9fbGlzdFtwYXJ0bmVyX2lkXTtcblx0XHRcdGlmIChoZXJvX3ZvLnBvd2VyIDwgZGF0YS5wb3dlcilcblx0XHRcdFx0R2xvYmFsTWVzc2FnZU1nci5nZXRJbnN0YW5jZSgpLnNob3dQb3dlck1vdmUoZGF0YS5wb3dlciAtIGhlcm9fdm8ucG93ZXIsIG51bGwsIGhlcm9fdm8ucG93ZXIpO1xuXHRcdFx0Ly8g5Yik5pat5oiY5Yqb5Y+Y5YyWXG5cdFx0XHR0aGlzLmhlcm9fbGlzdFtwYXJ0bmVyX2lkXS51cGRhdGVIZXJvVm8oZGF0YSk7XG5cdFx0fVxuXHR9LFxuXG5cdGdldEhlcm9FcXVpcExpc3Q6IGZ1bmN0aW9uIChwYXJlbmVyX2lkKSB7XG5cdFx0aWYgKHRoaXMuaGVyb19saXN0W3BhcmVuZXJfaWRdKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5oZXJvX2xpc3RbcGFyZW5lcl9pZF0uZXFtX2xpc3Q7XG5cdFx0fVxuXHR9LFxuXG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t56ym5paH6ZS76YCg55u45YWzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuXHQvL+iOt+WPluespuaWh+elneemj+e6oueCueeKtuaAgVxuXHRnZXRBcnRpZmFjdEx1Y2t5UmVkU3RhdHVzOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuYXJ0aWZhY3RfbHVja3lfcmVkXG5cdH0sXG5cblx0Ly/nrKbmlofnpZ3npo/lgLxcblx0c2V0QXJ0aWZhY3RMdWNreTogZnVuY3Rpb24gKHZhbHVlKSB7XG5cdFx0dGhpcy5hcnRpZmFjdF9sdWNreSA9IHZhbHVlO1xuXHRcdFJlZE1nci5nZXRJbnN0YW5jZSgpLmFkZENhbEhhbmRsZXIodGhpcy51cGRhdGVBcnRpZmFjdEx1Y2t5UmVkLmJpbmQodGhpcykpXG5cdH0sXG5cblx0Z2V0QXJ0aWZhY3RMdWNreTogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLmFydGlmYWN0X2x1Y2t5IHx8IDBcblx0fSxcblxuXHQvL+elneemj+WAvOe6oueCuVxuXHR1cGRhdGVBcnRpZmFjdEx1Y2t5UmVkOiBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIG1heF9sdWNreSA9IDA7XG5cdFx0dmFyIGx1Y2t5X2NmZyA9IENvbmZpZy5wYXJ0bmVyX2FydGlmYWN0X2RhdGEuZGF0YV9hcnRpZmFjdF9jb25zdFtcImNoYW5nZV9jb25kaXRpb25cIl07XG5cdFx0aWYgKGx1Y2t5X2NmZyAmJiBsdWNreV9jZmcudmFsICE9IG51bGwpIHtcblx0XHRcdG1heF9sdWNreSA9IGx1Y2t5X2NmZy52YWw7XG5cdFx0fVxuXHRcdGlmICh0aGlzLmFydGlmYWN0X2x1Y2t5ID49IG1heF9sdWNreSkge1xuXHRcdFx0dGhpcy5hcnRpZmFjdF9sdWNreV9yZWQgPSB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmFydGlmYWN0X2x1Y2t5X3JlZCA9IGZhbHNlO1xuXHRcdH1cblx0XHRnY29yZS5HbG9iYWxFdmVudC5maXJlKEhlcm9FdmVudC5BcnRpZmFjdF9MdWNreV9SZWRfRXZlbnQpO1xuXHRcdHZhciBTY2VuZUNvbnN0ID0gcmVxdWlyZShcInNjZW5lX2NvbnN0XCIpO1xuXHRcdHJlcXVpcmUoXCJtYWluc2NlbmVfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLnNldEJ1aWxkUmVkU3RhdHVzKFNjZW5lQ29uc3QuQ2VudGVyU2NlbmVCdWlsZC5tYWxsLCB0aGlzLmFydGlmYWN0X2x1Y2t5X3JlZClcblx0fSxcblxuXHR1cGRhdGVQYXJ0bmVyQXJ0aWZhY3RMaXN0OiBmdW5jdGlvbiAoZGF0YSkge1xuXHRcdHZhciBpZCA9IGRhdGEucGFydG5lcl9pZCB8fCAwO1xuXHRcdGlmICh0aGlzLmhlcm9fbGlzdFtpZF0pIHtcblx0XHRcdHZhciBoZXJvX3ZvID0gdGhpcy5oZXJvX2xpc3RbaWRdO1xuXHRcdFx0aWYgKGhlcm9fdm8pIHtcblx0XHRcdFx0aWYgKGhlcm9fdm8ucG93ZXIgPCBkYXRhLnBvd2VyKSB7XG5cdFx0XHRcdFx0R2xvYmFsTWVzc2FnZU1nci5nZXRJbnN0YW5jZSgpLnNob3dQb3dlck1vdmUoZGF0YS5wb3dlci1oZXJvX3ZvLnBvd2VyICxudWxsLGhlcm9fdm8ucG93ZXIpXG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5oZXJvX2xpc3RbaWRdLnVwZGF0ZUhlcm9WbyhkYXRhKTtcblx0XHRcdFx0Z2NvcmUuR2xvYmFsRXZlbnQuZmlyZShIZXJvRXZlbnQuQXJ0aWZhY3RfVXBkYXRlX0V2ZW50LCBoZXJvX3ZvKTtcblx0XHQgICAgICAgIC8vIGxldCBpc19hcnRpZmFjdCA9ICBQYXJ0bmVyQ2FsY3VsYXRlLmdldElzQ2FuQ2xvdGhBcnRpZmFjdChoZXJvX3ZvLmJpZCk7XHRcdFx0XHRcblx0XHRcdFx0Ly8gaGVyb192by51cGRhdGVSZWRQb2ludChQYXJ0bmVyQ29uc3QuVm9fUmVkX1R5cGUuQXJ0aWZhY3QsZmFsc2UpXG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdGdldFBhcnRuZXJBcnRpZmFjdExpc3Q6IGZ1bmN0aW9uIChpZCkge1xuXHRcdGlmICh0aGlzLmhlcm9fbGlzdFtpZF0pIHtcblx0XHRcdHJldHVybiB0aGlzLmhlcm9fbGlzdFtpZF0uYXJ0aWZhY3RfbGlzdCB8fCBbXVxuXHRcdH1cblx0XHRyZXR1cm4gW11cblx0fSxcblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLeespuaWh+mUu+mAoOebuOWFs2VuZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRzZXRMb2NrQnlQYXJ0bmVyaWQ6IGZ1bmN0aW9uIChwYXJ0bmVyX2lkLCBpc19sb2NrKSB7XG5cdFx0aWYgKHRoaXMuaGVyb19saXN0W3BhcnRuZXJfaWRdKSB7XG5cdFx0XHR0aGlzLmhlcm9fbGlzdFtwYXJ0bmVyX2lkXS5pc19sb2NrID0gaXNfbG9jayB8fCAwO1xuXHRcdH1cblx0fSxcblxuXHQvLyDmtLvliqjoi7Hpm4TliJfooagg5qC55o2u5Yy56YWN5L+h5oGvIOeGlOeCvOelreWdm+eUqFxuXHQvLyBAZGljX3RoZV9jb25kaXRpb25zIOaMh+WumuWMuemFjSBkaWNfdGhlX2NvbmRpdGlvbnNbYmlkXVtzdGFyXSA9IOaVsOmHj1xuXHQvLyBAZGljX3JhbmRvbV9jb25kaXRpb25zIOmaj+acuumYteWuueWMuemFjSBkaWNfdGhlX2NvbmRpdGlvbnNbY2FtcF1bc3Rhcl0gPSDmlbDph49cblx0Ly8gQGRpY19oZXJvX2lkIOagh+W/l+W3sueUqFxuXHQvLyByZXR1cm5cblx0Ly8gQCBjb3VudCDmi6XmnInkuI3ph43lpI3oi7Hpm4TmgLvmlbDph49cblx0Z2V0SGVyb0xpc3RCeU1hdGNoSW5mbzogZnVuY3Rpb24gKGRpY190aGVfY29uZGl0aW9ucywgZGljX3JhbmRvbV9jb25kaXRpb25zLCBkaWNfaGVyb19pZCkge1xuXHRcdC8vIOaJvuS4jemHjeWkjeeahOaVsOmHj1xuXHRcdHZhciBjb3VudCA9IDA7XG5cdFx0dmFyIGRpY19oZXJvX2lkID0gZGljX2hlcm9faWQgfHwge307XG5cdFx0dmFyIGRpY19jb3VudCA9IHt9O1xuXG5cdFx0dmFyIF9zZXREaWNDb3VudCA9IGZ1bmN0aW9uIChwYXJ0bmVyX2lkLCBzdHIsIG1heCkge1xuXHRcdFx0Ly8g5Yik5pat5piv5ZCm6YeN5aSNXG5cdFx0XHRpZiAoIWRpY19oZXJvX2lkW3BhcnRuZXJfaWRdKSB7XG5cdFx0XHRcdGlmICghZGljX2NvdW50W3N0cl0pXG5cdFx0XHRcdFx0ZGljX2NvdW50W3N0cl0gPSAwO1xuXHRcdFx0XHRpZiAoZGljX2NvdW50W3N0cl0gPCBtYXgpIHtcblx0XHRcdFx0XHRkaWNfY291bnRbc3RyXSA9IGRpY19jb3VudFtzdHJdICsgMTtcblx0XHRcdFx0XHRjb3VudCA9IGNvdW50ICsgMTtcblx0XHRcdFx0XHRkaWNfaGVyb19pZFtwYXJ0bmVyX2lkXSA9IDE7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRmb3IgKHZhciBoZXJvX2kgaW4gdGhpcy5oZXJvX2xpc3QpIHtcblx0XHRcdHZhciBoZXJvID0gdGhpcy5oZXJvX2xpc3RbaGVyb19pXTtcblx0XHRcdGlmIChkaWNfdGhlX2NvbmRpdGlvbnMgJiYgZGljX3RoZV9jb25kaXRpb25zW2hlcm8uYmlkXSAmJiBkaWNfdGhlX2NvbmRpdGlvbnNbaGVyby5iaWRdW2hlcm8uc3Rhcl0pIHtcblx0XHRcdFx0dmFyIHN0ciA9IGNjLmpzLmZvcm1hdFN0cihcIiVzJXNcIiwgaGVyby5iaWQsIGhlcm8uc3Rhcik7XG5cdFx0XHRcdF9zZXREaWNDb3VudChoZXJvLnBhcnRuZXJfaWQsIHN0ciwgZGljX3RoZV9jb25kaXRpb25zW2hlcm8uYmlkXVtoZXJvLnN0YXJdKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGRpY19yYW5kb21fY29uZGl0aW9ucykge1xuXHRcdFx0XHQvLyAw6KGo56S65omA5pyJ6Zi16JCl55qE5ZCI6YCCXG5cdFx0XHRcdGlmIChkaWNfcmFuZG9tX2NvbmRpdGlvbnNbMF0gJiYgZGljX3JhbmRvbV9jb25kaXRpb25zWzBdW2hlcm8uc3Rhcl0pIHtcblx0XHRcdFx0XHQvLyBpZiAoZGljX3JhbmRvbV9jb25kaXRpb25zWzBdW2hlcm8uc3Rhcl0pIHtcblx0XHRcdFx0XHRcdHZhciBzdHIgPSBjYy5qcy5mb3JtYXRTdHIoXCJfJXMlc1wiLCAwLCBoZXJvLnN0YXIpXG5cdFx0XHRcdFx0XHRfc2V0RGljQ291bnQoaGVyby5wYXJ0bmVyX2lkLCBzdHIsIGRpY19yYW5kb21fY29uZGl0aW9uc1swXVtoZXJvLnN0YXJdKTtcblx0XHRcdFx0XHQvLyB9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWYgKGRpY19yYW5kb21fY29uZGl0aW9uc1toZXJvLmNhbXBfdHlwZV0gJiYgZGljX3JhbmRvbV9jb25kaXRpb25zW2hlcm8uY2FtcF90eXBlXVtoZXJvLnN0YXJdKSB7XG5cdFx0XHRcdFx0XHR2YXIgc3RyID0gY2MuanMuZm9ybWF0U3RyKFwiXyVzJXNcIiwgaGVyby5jYW1wX3R5cGUsIGhlcm8uc3Rhcik7XG5cdFx0XHRcdFx0XHRfc2V0RGljQ291bnQoaGVyby5wYXJ0bmVyX2lkLCBzdHIsIGRpY19yYW5kb21fY29uZGl0aW9uc1toZXJvLmNhbXBfdHlwZV1baGVyby5zdGFyXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvdW50XG5cdH0sXG5cblx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq57qi54K55qOA5p+lKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cblxuXG5cdC8vIOajgOa1i+WNh+e6p+e6oueCueabtOaWsFxuXHRjaGVja0xldmVsUmVkUG9pbnRVcGRhdGU6IGZ1bmN0aW9uKCkge1xuXHQgICAgLy8gR2xvYmFsRXZlbnQ6Z2V0SW5zdGFuY2UoKTpGaXJlKEhlcm9FdmVudC5MZXZlbF9SZWRQb2ludF9FdmVudCkgXG5cblx0ICAgIC8vIGlmICh0aGlzLmlzX2RlbGF5X3JlZHBvaW50X3VwZGF0ZVtIZXJvQ29uc3QuUmVkUG9pbnRUeXBlLmVSUExldmVsVXBdKVxuXHQgICAgLy8gICAgIHJldHVyblxuXG5cdCAgICAvLyB0aGlzLmlzX2RlbGF5X3JlZHBvaW50X3VwZGF0ZVtIZXJvQ29uc3QuUmVkUG9pbnRUeXBlLmVSUExldmVsVXBdID0gdHJ1ZTtcblx0ICAgIC8vIOa4hemZpOWNh+e6p+e6oueCueiusOW9lVxuXHQgICAgSGVyb0NhbGN1bGF0ZS5nZXRJbnN0YW5jZSgpLmNsZWFyQWxsSGVyb1JlY29yZEJ5UmVkUG9pbnRUeXBlKEhlcm9Db25zdC5SZWRQb2ludFR5cGUuZVJQTGV2ZWxVcCwgdHJ1ZSlcblx0fSxcblxuXHQvLyDmo4Dmn6XpmLXms5Xop6PplIEgXG5cdGNoZWNrVW5sb2NrRm9ybVJlZFBvaW50OiBmdW5jdGlvbigpIHtcblxuXHR9LFxuXG5cdC8vIOiuvue9ruabtOaWsGVxdWlw57qi54K555qE6K6w5b2VXG5cdHNldEVxdWlwVXBkYXRlUmVjb3JkOiBmdW5jdGlvbiAoYm9vbCkge1xuXHRcdHRoaXMuaXNfZXF1aXBfcmVkcG9pbnRfYmFnX3VwZGF0ZSA9IGJvb2w7XG5cdFx0dGhpcy5pc19lcXVpcF9yZWRwb2ludF9oZXJvX3VwZGF0ZSA9IGJvb2w7XG5cdH0sXG5cblx0Ly8g5qOA5p+l6KOF5aSH57qi54K5IFxuXHRjaGVja0VxdWlwUmVkUG9pbnRVcGRhdGU6IGZ1bmN0aW9uKCkge1xuXHQgICAgLy8g6ZyA6KaBIOiDjOWMhSDov5Tlm54g5ZKMIOiLsembhOabtOaWsOi/lOWbniDmiY3lpITnkIbnuqLngrnorqHnrpdcblx0ICAgIGlmICh0aGlzLmlzX2VxdWlwX3JlZHBvaW50X2JhZ191cGRhdGUgJiYgdGhpcy5pc19lcXVpcF9yZWRwb2ludF9oZXJvX3VwZGF0ZSkge1xuXHQgICAgICAgIC8v5riF6Zmk6KOF5aSH57qi54K56K6w5b2VXG5cdCAgICAgICAgSGVyb0NhbGN1bGF0ZS5nZXRJbnN0YW5jZSgpLmNsZWFyQWxsSGVyb1JlY29yZEJ5UmVkUG9pbnRUeXBlKEhlcm9Db25zdC5SZWRQb2ludFR5cGUuZVJQRXF1aXApO1xuXHQgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoSGVyb0V2ZW50LkVxdWlwX1JlZFBvaW50X0V2ZW50KTtcblx0ICAgIH1cblx0fSxcblxuXHQvLyDorr7nva7mm7TmlrDljYfmmJ/nuqLngrnnmoTorrDlvZVcblx0c2V0VXBncmFkZVN0YXJVcGRhdGVSZWNvcmQ6IGZ1bmN0aW9uKGJvb2wpIHtcblx0ICAgIHRoaXMuaXNfdXBncmFkZXN0YXJfcmVkcG9pbnRfYmFnX3VwZGF0ZSA9IGJvb2w7XG5cdCAgICB0aGlzLmlzX3VwZ3JhZGVzdGFyX3JlZHBvaW50X2hlcm9fdXBkYXRlID0gYm9vbDtcblx0fSxcblxuXHQvLyDljYfmmJ/nuqLngrnmo4Dmn6Vcblx0Y2hlY2tVcGdyYWRlU3RhclJlZFBvaW50VXBkYXRlOiBmdW5jdGlvbigpIHtcblx0XHQvLyDpnIDopoEg6IOM5YyFIOi/lOWbniDlkowg6Iux6ZuE5pu05paw6L+U5ZueIOaJjeWkhOeQhue6oueCueiuoeeul1xuXHRcdGlmICh0aGlzLmlzX3VwZ3JhZGVzdGFyX3JlZHBvaW50X2JhZ191cGRhdGUgJiYgdGhpcy5pc191cGdyYWRlc3Rhcl9yZWRwb2ludF9oZXJvX3VwZGF0ZSkge1xuXHQgICAgICAgIEhlcm9DYWxjdWxhdGUuZ2V0SW5zdGFuY2UoKS5jbGVhckFsbEhlcm9SZWNvcmRCeVJlZFBvaW50VHlwZShIZXJvQ29uc3QuUmVkUG9pbnRUeXBlLmVSUFN0YXIpO1xuXHRcdH0gXG5cdH0sXG5cblx0Ly8g5qOA5p+l5Zyj5Zmo6Kej6ZSBXG5cdGNoZWNrVW5sb2NrSGFsbG93c1JlZFBvaW50OiBmdW5jdGlvbigpIHtcblxuXHR9LFxuXG5cdGNoZWNrT3BlblN0YXIxMTogZnVuY3Rpb24oKSB7XG5cdFx0bGV0IGNvbmZpZyA9IENvbmZpZy5wYXJ0bmVyX2RhdGEuZGF0YV9wYXJ0bmVyX2NvbnN0LnN0YXJvcGVuMTFfd29ybGRfbGV2XG5cdFx0aWYoY29uZmlnKXtcblx0XHRcdGlmKGNvbmZpZy52YWxbMF0gPT0gXCJ3b3JsZF9sZXZcIil7XG5cdFx0XHRcdHZhciBSb2xlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJyb2xlX2NvbnRyb2xsZXJcIik7XG5cdFx0XHRcdGxldCB3b3JsZF9sZXYgPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0V29ybGRMZXYoKSB8fCAwXG5cdFx0XHRcdGlmKHdvcmxkX2xldiA8IGNvbmZpZy52YWxbMV0pe1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcblx0XHRyZXR1cm4gdHJ1ZVxuXHR9LFxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLeWkqei1i+aKgOiDvS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyAtLeiuvue9ruabtOaWsOWkqei1i+e6oueCuVxuXHRzZXRVcGRhdGVUYWxlbnRSZWRwb2ludCgpe1xuICAgIFx0dGhpcy5pc19uZWVkX3VwZGF0ZV90YWxlbnRfcmVkcG9pbnQgPSB0cnVlXG5cdH0sXG5cdGdldFRhbGVudFJlZHBvaW50UmVjb3JkKCl7XG5cdFx0dmFyIHNlbGYgPSB0aGlzXG5cdFx0aWYoc2VsZi5pc19uZWVkX3VwZGF0ZV90YWxlbnRfcmVkcG9pbnQpe1xuXHRcdFx0bGV0IGRpY19jb25maWcgPSBDb25maWcucGFydG5lcl9za2lsbF9kYXRhLmRhdGFfcGFydG5lcl9za2lsbF9sZWFyblxuXHRcdFx0aWYoZGljX2NvbmZpZyl7XG5cdFx0XHRcdGxldCBpc19lbm91Z2hcblx0XHRcdFx0Zm9yKGxldCBrIGluIGRpY19jb25maWcpe1xuXHRcdFx0XHRcdGxldCBjb25maWcgPSBkaWNfY29uZmlnW2tdXG5cdFx0XHRcdFx0c2VsZi5kaWNfaGVyb190YWxlbnRfc2tpbGxfbGVhcm5fcmVkcG9pbnRbY29uZmlnLmlkXSA9IG51bGxcblx0XHRcdFx0XHRpc19lbm91Z2ggPSB0cnVlXG5cdFx0XHRcdFx0Zm9yKGxldCBpPTA7aTxjb25maWcuZXhwZW5kLmxlbmd0aDsrK2kpe1xuXHRcdFx0XHRcdFx0bGV0IHYgPSBjb25maWcuZXhwZW5kW2ldXG5cdFx0XHRcdFx0XHRsZXQgY291bnQgPSBCYWNrcGFja0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldEl0ZW1OdW1CeUJpZCh2WzBdKVxuXHRcdFx0XHRcdFx0aWYoY291bnQgPCB2WzFdKXtcblx0XHRcdFx0XHRcdFx0aXNfZW5vdWdoID0gZmFsc2Vcblx0XHRcdFx0XHRcdFx0YnJlYWtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYoaXNfZW5vdWdoKXtcblx0XHRcdFx0XHRcdHNlbGYuZGljX2hlcm9fdGFsZW50X3NraWxsX2xlYXJuX3JlZHBvaW50W2NvbmZpZy5pZF0gPSBjb25maWcuaWRcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0c2VsZi5pc19uZWVkX3VwZGF0ZV90YWxlbnRfcmVkcG9pbnQgPSBmYWxzZVxuXHRcdGlmKCFVdGlscy5uZXh0KHNlbGYuZGljX2hlcm9fdGFsZW50X3NraWxsX2xlYXJuX3JlZHBvaW50KSl7XG5cdFx0XHRzZWxmLmRpY19oZXJvX3RhbGVudF9za2lsbF9sZWFybl9yZWRwb2ludCA9IHt9XG5cdFx0fVxuXHRcdHJldHVybiBzZWxmLmRpY19oZXJvX3RhbGVudF9za2lsbF9sZWFybl9yZWRwb2ludFxuXHR9LFxuXHQvLyAtLeajgOa1i+Wkqei1i+e6oueCueabtOaWsFxuXHRjaGVja1RhbGVudFJlZFBvaW50VXBkYXRlKCl7IFxuXHRcdGlmKHRoaXMuaXNfZGVsYXlfcmVkcG9pbnRfdXBkYXRlW0hlcm9Db25zdC5SZWRQb2ludFR5cGUuZVJQVGFsZW50XSl7XG5cdFx0XHRyZXR1cm5cblx0XHR9XG5cdFx0dGhpcy5pc19kZWxheV9yZWRwb2ludF91cGRhdGVbSGVyb0NvbnN0LlJlZFBvaW50VHlwZS5lUlBUYWxlbnRdID0gdHJ1ZVxuXHRcdC8vIC0t5riF6Zmk5aSp6LWL57qi54K56K6w5b2VXG5cdFx0SGVyb0NhbGN1bGF0ZS5nZXRJbnN0YW5jZSgpLmNsZWFyQWxsSGVyb1JlY29yZEJ5UmVkUG9pbnRUeXBlKEhlcm9Db25zdC5SZWRQb2ludFR5cGUuZVJQVGFsZW50LCB0cnVlKVxuXHRcdFxuXHR9LFxuXHQvLyAtLeWinuWKoOivpue7huS/oeaBr1xuXHR1cGRhdGVIZXJvVm9EZXRhaWxlZEluZm8oaW5mbyl7XG5cdFx0aWYoIWluZm8pcmV0dXJuXG5cdFx0aWYodGhpcy5oZXJvX2xpc3RbaW5mby5wYXJ0bmVyX2lkXSl7XG5cdFx0XHRjYy5sb2codGhpcy5oZXJvX2xpc3RbaW5mby5wYXJ0bmVyX2lkXSxpbmZvKVxuXHRcdFx0Zm9yKGxldCBrIGluIGluZm8pe1xuXHRcdFx0XHRsZXQgdiA9IGluZm9ba11cblx0XHRcdFx0dGhpcy5oZXJvX2xpc3RbaW5mby5wYXJ0bmVyX2lkXVtrXSA9IHZcblx0XHRcdH1cblx0XHRcdHRoaXMuaGVyb19saXN0W2luZm8ucGFydG5lcl9pZF0uaXNfaGFkX2RldGFpbGVkID0gdHJ1ZVxuXHRcdFx0Z2NvcmUuR2xvYmFsRXZlbnQuZmlyZShIZXJvRXZlbnQuSGVyb19Wb19EZXRhaWxlZF9pbmZvLCB0aGlzLmhlcm9fbGlzdFtpbmZvLnBhcnRuZXJfaWRdKVxuXHRcdH1cblx0fSxcblxuXG5cdC8v5Yid5aeL5YyW55qu6IKkIOS/oeaBr+iLsembhOearuiCpCBcblx0aW5pdEhlcm9Ta2luOmZ1bmN0aW9uKGRhdGEpe1xuXHRcdGlmKCFkYXRhKSByZXR1cm5cblx0XHQvL+WIpOWumuaYr+WQpuimgeaYvuekuuWNoeeJh+WxleekuueVjOmdolxuXHRcdGlmKHRoaXMuaGVyb19za2luX2xpc3Qpe1xuXHRcdFx0bGV0IHNob3dfc2tpbl9pZCA9IG51bGw7XG5cdFx0XHRmb3IobGV0IGkgaW4gZGF0YS5wYXJ0bmVyX3NraW5zKXtcblx0XHRcdFx0bGV0IHYgPSBkYXRhLnBhcnRuZXJfc2tpbnNbaV07XG5cdFx0XHRcdGlmKHRoaXMuaGVyb19za2luX2xpc3Rbdi5pZF0gPT0gbnVsbCl7XG5cdFx0XHRcdFx0c2hvd19za2luX2lkID0gdi5pZDtcblx0XHRcdFx0XHRicmVha1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZihzaG93X3NraW5faWQpe1xuXHRcdFx0XHQvL+aYvuekulxuXHRcdFx0XHRsZXQgc2tpbl9jb25maWcgPSBDb25maWcucGFydG5lcl9za2luX2RhdGEuZGF0YV9za2luX2luZm9bc2hvd19za2luX2lkXTtcblx0XHRcdFx0aWYoc2tpbl9jb25maWcpe1xuXHRcdFx0XHRcdGxldCBzZXR0aW5nID0ge307XG5cdFx0XHRcdFx0c2V0dGluZy5wYXJ0bmVyX2JpZCA9IHNraW5fY29uZmlnLmJpZDtcblx0XHRcdFx0XHRzZXR0aW5nLmlzX2NoaXBzID0gMTtcblx0XHRcdFx0XHRzZXR0aW5nLmluaXRfc3RhciA9IDU7XG5cdFx0XHRcdFx0c2V0dGluZy5zdGF0dXMgPSAxO1xuXHRcdFx0XHRcdHNldHRpbmcuc2hvd190eXBlID0gcmVxdWlyZShcInBhcnRuZXJzdW1tb25fY29uc3RcIikuR2Fpbl9TaG93X1R5cGUuU2tpbl9zaG93O1xuXHRcdFx0XHRcdHNldHRpbmcuc2tpbl9pZCA9IHNob3dfc2tpbl9pZDtcblx0XHRcdFx0XHRyZXF1aXJlKFwicGFydG5lcnN1bW1vbl9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3BlblN1bW1vbkdhaW5TaG93V2luZG93KHRydWUsIFtzZXR0aW5nXSxudWxsLCAyKVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5oZXJvX3NraW5fbGlzdCA9IHt9O1xuXG5cdFx0Zm9yKGxldCBpIGluIGRhdGEucGFydG5lcl9za2lucyl7XG5cdFx0XHRsZXQgdiA9IGRhdGEucGFydG5lcl9za2luc1tpXTtcblx0XHRcdHRoaXMuaGVyb19za2luX2xpc3Rbdi5pZF0gPSB2LmVuZF90aW1lO1xuXHRcdH1cblxuXHRcdGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoSGVyb0V2ZW50Lkhlcm9fU2tpbl9JbmZvX0V2ZW50LCBkYXRhKTtcblx0fSxcblxuXHQvL+agueaNruearuiCpGlkIOi/lOWbnuearuiCpOaVsOaNriAgXG5cdC8vQHJldHVybiDnmq7ogqTmnInmlYjml7bpl7TngrkuLiAg5aaC5p6c5rC45LmF6L+U5ZueIDAg5aaC5p6c6L+U5ZuebmlsIOihqOekuiDmsqHmnInop6PplIHor6Xnmq7ogqRcblx0Z2V0SGVyb1NraW5JbmZvQnlTa2luSUQ6ZnVuY3Rpb24oc2tpbl9pZCl7XG5cdFx0aWYodGhpcy5oZXJvX3NraW5fbGlzdCAmJiB0aGlzLmhlcm9fc2tpbl9saXN0W3NraW5faWRdICE9IG51bGwpe1xuXHRcdFx0cmV0dXJuIHRoaXMuaGVyb19za2luX2xpc3Rbc2tpbl9pZF1cblx0XHR9XG5cdH0sXG5cblx0Ly8tLeaYr+WQpuino+mUgeivpeearuiCpFxuXHQvL2lzX2NoZWNrX3RpbWU65Yik5pat5piv5ZCm6L+H5pyfXG5cdGlzVW5sb2NrSGVyb1NraW46ZnVuY3Rpb24oc2tpbl9pZCwgaXNfY2hlY2tfdGltZSl7XG5cdFx0aWYodGhpcy5oZXJvX3NraW5fbGlzdCAmJiB0aGlzLmhlcm9fc2tpbl9saXN0W3NraW5faWRdICE9IG51bGwpe1xuXHRcdFx0aWYoaXNfY2hlY2tfdGltZSl7XG5cdFx0XHRcdGlmKHRoaXMuaGVyb19za2luX2xpc3Rbc2tpbl9pZF0gPiAwKXtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWVcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlXG5cdH0sXG5cbn0pOyJdfQ==