|
(function() {
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
var __module = nodeEnv ? module : {exports:{}};
|
var __filename = 'preview-scripts/assets/Scripts/mod/guildskill/view/guildskill_main_window.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, '0f5dfetmPZI+oE1UBgFLTXJ', 'guildskill_main_window');
|
// Scripts/mod/guildskill/view/guildskill_main_window.js
|
|
"use strict";
|
|
// --------------------------------------------------------------------
|
// @author: shiraho@syg.com(必填, 创建模块的人员)
|
// @description:
|
// 公会技能的主界面
|
// <br/>Create: new Date().toISOString()
|
// --------------------------------------------------------------------
|
var PathTool = require("pathtool");
|
|
var GuildskillController = require("guildskill_controller");
|
|
var GuildskillEvent = require("guildskill_event");
|
|
var GuildskillConst = require("guildskill_const");
|
|
var BackpackConst = require("backpack_const");
|
|
var BackpackController = require("backpack_controller");
|
|
var GuildConst = require("guild_const");
|
|
var RoleController = require("role_controller");
|
|
var GuildSkillAttrItem = require("guildskill_item");
|
|
var GuildEvent = require("guild_event");
|
|
var PartnerCalculate = require("partner_calculate");
|
|
var GuildskillMainWindow = cc.Class({
|
"extends": BaseView,
|
ctor: function ctor() {
|
this.prefabPath = PathTool.getPrefabPath("guildskill", "guildskill_main_window");
|
this.win_type = WinType.Big;
|
this.viewTag = SCENE_TAG.dialogue;
|
this.ctrl = GuildskillController.getInstance();
|
this.model = this.ctrl.getModel();
|
this.tab_list = {}; // 标签页
|
|
this.attr_list = {}; // 综述性加成
|
|
this.item_list = {}; // 6个单元集合
|
|
this.singe_att_list = {}; // 单个的属性加成
|
|
this.attr_value_list = {}; // 当前所累积属性的列表
|
|
this.cur_info_group_id = 0; // 更新判断依据
|
|
this.backpack_item_list = {}; // 物品图标实例
|
|
this.upgrade_cost_list = {}; // 点亮需要消耗的物品和资产
|
|
this.cur_index = 1;
|
this.role_vo = RoleController.getInstance().getRoleVo();
|
},
|
openCallBack: function openCallBack() {
|
this.background = this.seekChild("background");
|
var main_panel = this.seekChild("main_panel");
|
this.background.scale = FIT_SCALE;
|
this.career_desc = this.seekChild(main_panel, "career_desc", cc.RichText);
|
this.close_btn = this.seekChild(main_panel, "close_btn");
|
this.explain_btn = this.seekChild(main_panel, "explain_btn"); // this.total_power_value = this.seekChild(main_panel, "total_power_value");
|
|
this.cost_container = this.seekChild(main_panel, "cost_container");
|
this.handle_btn = this.seekChild(main_panel, "handle_btn");
|
this.handle_btn_label = this.seekChild(this.handle_btn, "label", cc.Label);
|
this.handle_btn_label_outline = this.seekChild(this.handle_btn, "label", cc.LabelOutline);
|
this.handle_btn_label.string = Utils.TI18N("点亮");
|
this.condition_value = this.seekChild(this.cost_container, "condition_value", cc.Label);
|
var cost_node = this.seekChild(this.cost_container, "cost_node");
|
cost_node.active = false;
|
this.cost_item_icon = this.seekChild(cost_node, "item_img");
|
this.cost_item_value = this.seekChild(cost_node, "cost_value");
|
this.auto_buy_label = this.seekChild(main_panel, "auto_buy_label", cc.RichText);
|
this.auto_buy_label.node.active = false;
|
var tab_container = this.seekChild(main_panel, "tab_container");
|
|
for (var i = 1; i < 5; i++) {
|
var tab_btn = tab_container.getChildByName("tab_btn_" + i);
|
|
if (tab_btn) {
|
var title = tab_btn.getChildByName("title").getComponent(cc.Label);
|
var tips = tab_btn.getChildByName("tips");
|
|
if (i == 1) {
|
title.string = Utils.TI18N("战士职业");
|
} else if (i == 2) {
|
title.string = Utils.TI18N("法师职业");
|
} else if (i == 3) {
|
title.string = Utils.TI18N("坦克职业");
|
} else if (i == 4) {
|
title.string = Utils.TI18N("辅助职业");
|
}
|
|
var career = this.getType(i);
|
tab_btn.career = career;
|
tab_btn.label = title;
|
tab_btn.label.node.color = new cc.Color(0xcf, 0xb5, 0x93, 0xff);
|
tab_btn.tips = tips;
|
tab_btn.index = i;
|
tab_btn.btn = tab_btn.getComponent(cc.Button);
|
tab_btn.btn.interactable = false;
|
this.tab_list[career] = tab_btn;
|
}
|
}
|
|
this.scroll_view = this.seekChild(main_panel, "scroll_view");
|
this.scroll_view_con = this.seekChild(this.scroll_view, "content");
|
var size = this.scroll_view.getContentSize();
|
var attr_container = this.seekChild(main_panel, "attr_container");
|
attr_container.active = false; //配置显示综述性条目
|
|
var config = gdata("guild_skill_data", "data_const", ["attr_show_" + this.cur_index]);
|
|
var _x, _y;
|
|
if (config && config.val) {
|
var list_size = Math.ceil(config.val.length / 3);
|
var width = 180;
|
var height = 24;
|
var space_x = 10;
|
var space_y = 13;
|
var max_height = list_size * height + (list_size + 1) * space_y;
|
max_height = Math.max(max_height, size.height);
|
|
for (var i in config.val) {
|
var v = config.val[i];
|
var node = cc.instantiate(attr_container);
|
node.active = true;
|
var attr_item = new GuildSkillAttrItem(node, v);
|
node.setParent(this.scroll_view_con);
|
_x = -size.width / 2 + i % 3 * (width + space_x);
|
_y = -(7 + height * 0.5 + Math.floor(i / 3) * (height + space_y));
|
node.setPosition(_x, _y);
|
this.attr_list[i] = attr_item;
|
}
|
}
|
|
this.selected = this.seekChild(main_panel, "selected");
|
CommonAction.breatheShineAction3(this.selected);
|
|
for (var i = 1; i < 7; i++) {
|
var object = {};
|
var item = main_panel.getChildByName("item_" + i).getComponent(cc.Sprite);
|
var item_lev = main_panel.getChildByName("item_lev_" + i).getComponent(cc.Label);
|
|
if (item) {
|
object.node = item;
|
object.lev = item_lev;
|
object.index = i;
|
object.x = item.node.x;
|
object.y = item.node.y;
|
object.status = null;
|
object.data = null;
|
object.config = null;
|
this.item_list[i] = object;
|
}
|
} //单个单元的属性加成展示
|
|
|
this.single_item_attr_container = this.seekChild(main_panel, "single_item_attr_container");
|
|
for (var i = 1; i < 3; i++) {
|
var object = {};
|
object.attr_title = this.single_item_attr_container.getChildByName("attr_title_" + i).getComponent(cc.Label);
|
object.attr_value = this.single_item_attr_container.getChildByName("attr_value_" + i).getComponent(cc.Label);
|
object.attr_title.node.active = false;
|
object.attr_value.node.active = false;
|
this.singe_att_list[i] = object;
|
}
|
|
this.lev_upgrade_model = this.seekChild(main_panel, "lev_upgrade_model");
|
this.main_panel = main_panel;
|
},
|
registerEvent: function registerEvent() {
|
if (this.background) {
|
this.background.on(cc.Node.EventType.TOUCH_END, function () {
|
this.ctrl.openGuildSkillMainWindow(false);
|
}, this);
|
}
|
|
if (this.close_btn) {
|
this.close_btn.on(cc.Node.EventType.TOUCH_END, function () {
|
this.ctrl.openGuildSkillMainWindow(false);
|
Utils.playButtonSound(2);
|
}, this);
|
}
|
|
this.explain_btn.on(cc.Node.EventType.TOUCH_END, function (event) {
|
var config = Config.guild_skill_data.data_const.game_rule;
|
Utils.playButtonSound(1);
|
var pos = event.touch.getLocation();
|
|
require("tips_controller").getInstance().showCommonTips(config.desc, pos, null, null, 500);
|
}, this);
|
|
for (var k in this.tab_list) {
|
var tab_btn = this.tab_list[k];
|
tab_btn.on(cc.Node.EventType.TOUCH_END, function (event) {
|
var sender = event.currentTarget;
|
this.changeSelectedTab(sender.career, sender.index);
|
}, this);
|
}
|
|
this.handle_btn.on(cc.Node.EventType.TOUCH_END, function () {
|
if (this.selected_item && this.selected_item.data) {
|
if (this.auto_buy_item_bid && this.auto_buy_item_price && this.auto_buy_item_price > 0 && !this.auto_buy_label.active) {
|
var item_config = Utils.getItemConfig(this.auto_buy_item_bid);
|
BackpackController.getInstance().openTipsSource(true, item_config);
|
message(Utils.TI18N("道具不足,无法点亮"));
|
return;
|
}
|
|
this.ctrl.requestActivitySkill(this.selected_item.data.id);
|
}
|
}, this); //初始化的时候做的,可能切换标签,或者第一次打开
|
|
this.addGlobalEvent(GuildskillEvent.UpdateGuildSkillEvent, function (career) {
|
if (this.selected_tab && this.selected_tab.career == career) this.updateSkillList(career);
|
}, this);
|
this.addGlobalEvent(GuildskillEvent.UpdateSkillStatusEvent, function (career, skill_id) {
|
if (this.selected_tab && this.selected_tab.career == career) this.updateSkillItemById(skill_id);
|
}, this);
|
this.addGlobalEvent(GuildskillEvent.UpdateSkilUpgradeEvent, function (career, group_id) {
|
if (this.selected_tab && this.selected_tab.career == career) this.updateSkillList(career, true);
|
}, this);
|
this.addGlobalEvent(GuildEvent.UpdateGuildRedStatus, function (bid, status) {
|
this.updateGuildSkillRed(bid, status);
|
}, this);
|
this.addGlobalEvent(EventId.ADD_GOODS, function (bag_code, del_list) {
|
if (bag_code != BackpackConst.Bag_Code.BACKPACK) return;
|
this.changeNeedItemInfo(del_list);
|
}, this);
|
this.addGlobalEvent(EventId.MODIFY_GOODS_NUM, function (bag_code, change_list) {
|
if (bag_code != BackpackConst.Bag_Code.BACKPACK) return;
|
this.changeNeedItemInfo(change_list);
|
}, this);
|
|
if (this.role_vo) {
|
if (this.update_role_assets_event == null) {
|
this.update_role_assets_event = this.role_vo.bind(EventId.UPDATE_ROLE_ATTRIBUTE, function (key, value) {
|
if (this.selected_item && this.upgrade_cost_list) {
|
if (this.upgrade_cost_list.base_list && this.upgrade_cost_list.base_list[key]) {
|
this.setUpgradeCostStatus(0);
|
} else if (this.upgrade_cost_list.asset_list && this.upgrade_cost_list.asset_list[key]) {
|
this.setUpgradeCostStatus(1);
|
}
|
}
|
}, this);
|
}
|
}
|
},
|
openRootWnd: function openRootWnd(career) {
|
career = career || GuildskillConst.index.physics;
|
this.changeSelectedTab(career, this.cur_index);
|
this.updateGuildSkillRed();
|
},
|
//更新红点
|
updateGuildSkillRed: function updateGuildSkillRed(bid, status) {
|
if (bid == null) {
|
for (var k in this.tab_list) {
|
var tab_btn = this.tab_list[k];
|
var status = this.model.getRedStatus(tab_btn.career);
|
if (tab_btn.tips) tab_btn.tips.active = status;
|
}
|
} else if (bid == GuildConst.red_index.skill_2) {
|
var tab_btn = this.tab_list[GuildskillConst.index.magic];
|
if (tab_btn && tab_btn.tips) tab_btn.tips.active = status;
|
} else if (bid == GuildConst.red_index.skill_3) {
|
var tab_btn = this.tab_list[GuildskillConst.index.physics];
|
if (tab_btn && tab_btn.tips) tab_btn.tips.active = status;
|
} else if (bid == GuildConst.red_index.skill_4) {
|
var tab_btn = this.tab_list[GuildskillConst.index.defence];
|
if (tab_btn && tab_btn.tips) tab_btn.tips.active = status;
|
} else if (bid == GuildConst.red_index.skill_5) {
|
var tab_btn = this.tab_list[GuildskillConst.index.assist];
|
if (tab_btn && tab_btn.tips) tab_btn.tips.active = status;
|
}
|
},
|
//标签页选中
|
changeSelectedTab: function changeSelectedTab(career, index) {
|
if (this.selected_tab != null) {
|
if (this.selected_tab.career == career) return;
|
}
|
|
this.cur_index = index;
|
|
if (this.selected_tab) {
|
this.selected_tab.label.node.color = new cc.Color(0xcf, 0xb5, 0x93, 0xff);
|
this.selected_tab.btn.interactable = false;
|
this.selected_tab = null;
|
}
|
|
this.selected_tab = this.tab_list[career];
|
|
if (this.selected_tab) {
|
this.selected_tab.label.node.color = new cc.Color(0xff, 0xed, 0xd6, 0xff);
|
;
|
this.selected_tab.btn.interactable = true;
|
} //做全部属性显示切换
|
|
|
var object = this.model.getCareerSkillInfo(career);
|
if (object == null) this.ctrl.requestCareerSkillInfo(career);else this.updateSkillList(career); //关闭红点
|
|
var bid = this.model.getCareerKey(career);
|
this.model.updateGuildRedStatus(bid, false); //设置显示
|
|
var item_res_id = "";
|
|
for (var i in this.item_list) {
|
var v = this.item_list[i];
|
item_res_id = cc.js.formatStr("guildskill_%s_%s", career, v.index);
|
|
if (v.node) {
|
this.loadRes(PathTool.getUIIconPath("guildskill", item_res_id), function (sf_obj) {
|
v.node.spriteFrame = sf_obj;
|
}.bind(this));
|
}
|
}
|
},
|
//刷新属性名称显示
|
updateSkillAttrNameAndVal: function updateSkillAttrNameAndVal() {
|
var config_str = "attr_show_" + this.cur_index;
|
var config = gdata("guild_skill_data", "data_const", [config_str]);
|
|
if (config && config.val) {
|
for (var i in config.val) {
|
var v = config.val[i];
|
var attr_item = this.attr_list[i];
|
|
if (attr_item) {
|
var attr_key = v;
|
var attr_value = this.attr_value_list[attr_key];
|
attr_item.setData(attr_value, attr_key);
|
}
|
}
|
}
|
},
|
//设置指定技能id的状态
|
updateSkillItemById: function updateSkillItemById(skill_id) {
|
if (skill_id == null) return;
|
var update_list = [];
|
|
for (var i in this.item_list) {
|
var item = this.item_list[i];
|
|
if (item.data && item.data.id == skill_id && item.node) {
|
if (item.status != item.data.status) {
|
item.status = item.data.status;
|
var bool = item.status == GuildskillConst.status.activity;
|
item.node.setState(bool ? cc.Sprite.State.NORMAL : cc.Sprite.State.GRAY);
|
} //这里在吧这个技能的属性累加到当前总记录的里面去,并且更新制动的汇总技能
|
|
|
if (item.config) {
|
for (var i in item.config.attr_list) {
|
var v = item.config.attr_list[i];
|
|
if (v instanceof Array && v.length >= 2) {
|
if (this.attr_value_list[v[0]] == null) this.attr_value_list[v[0]] = 0;
|
this.attr_value_list[v[0]] = this.attr_value_list[v[0]] + v[1]; //存储需要更新的属性key
|
|
update_list.push(v[0]);
|
}
|
}
|
}
|
|
break;
|
}
|
} //做属性的更新
|
|
|
this.updateSkillAttrNameAndVal(); //升级特效
|
|
if (this.selected_item && this.selected_item.node) {
|
var _x = this.selected_item.node.x;
|
var _y = this.selected_item.node.y;
|
this.handleUpgradeEffect(true, cc.v2(_x, _y));
|
} //重新选择一下下一个待点亮的
|
|
|
var index = 0;
|
|
if (this.cur_skill_info && this.cur_skill_info.skill_ids) {
|
for (var i in this.cur_skill_info.skill_ids) {
|
var item = this.cur_skill_info.skill_ids[i];
|
|
if (item.status == GuildskillConst.status.un_activity) {
|
if (index == 0 || index > item.index) {
|
index = item.index;
|
}
|
}
|
}
|
|
this.changeSelectedItem(index, true);
|
} //这里计算一下总战力
|
// var total_power = PartnerCalculate.calculatePower(self.attr_value_list)
|
// this.total_power_value.string = Math.floor(total_power);
|
|
},
|
//播放特效
|
handleUpgradeEffect: function handleUpgradeEffect(status, pos) {
|
if (status == false) {
|
if (this.upgrade_effect != null) {
|
this.upgrade_effect.removeFromParent();
|
this.upgrade_effect = null;
|
}
|
} else {
|
var finish_func = function finish_func() {
|
if (this.upgrade_effect) {
|
this.upgrade_effect.active = false;
|
}
|
};
|
|
if (this.upgrade_effect == null) {
|
if (this.main_panel) {}
|
}
|
}
|
},
|
//技能组升级的特效
|
handleLevUpgradeEffect: function handleLevUpgradeEffect(status) {
|
if (status == false) {}
|
},
|
//初始化技能列表
|
updateSkillList: function updateSkillList(career, is_upgrade) {
|
if (career == null) return;
|
var object = this.model.getCareerSkillInfo(career);
|
|
if (object) {
|
if (this.cur_info_group_id == object.group_id) return;
|
this.cur_info_group_id = object.group_id;
|
this.cur_skill_info = object; //下一块开启的描述显示
|
|
var group_config = gdata("guild_skill_data", "data_group", [Utils.getNorKey(career, object.group_id)]);
|
|
if (group_config != null) {
|
var max_group = this.model.getCareerGroupMax(career);
|
this.career_desc.string = cc.js.formatStr("%s<color=#249003>(%s/%s)</c>", group_config.group_name, group_config.group_seq, max_group);
|
} //给显示单位储存数据结构
|
|
|
if (object.skill_ids) {
|
var index = 0;
|
var skill_item = null;
|
var config = null;
|
|
for (var i in object.skill_ids) {
|
//存储对应技能单位属性
|
var item = object.skill_ids[i];
|
skill_item = this.item_list[item.index];
|
config = gdata("guild_skill_data", "data_info", [item.id]);
|
|
if (skill_item && config) {
|
skill_item.data = item;
|
skill_item.config = config; //设置显示状态
|
|
if (skill_item.node) {
|
if (skill_item.status != item.status) {
|
skill_item.status = item.status;
|
var bool = item.status == GuildskillConst.status.activity;
|
skill_item.node.setState(bool ? cc.Sprite.State.NORMAL : cc.Sprite.State.GRAY);
|
}
|
} //设置技能等级
|
|
|
if (skill_item.lev) {
|
skill_item.lev.string = config.lev;
|
}
|
} //选中当前待升级的那个
|
|
|
if (item.status == GuildskillConst.status.un_activity) {
|
if (index == 0 || index > item.index) {
|
index = item.index;
|
}
|
}
|
} //如果遍历完了还是0,其实这个时候已经是最高等级了,那就随便选中一个
|
|
|
if (Number(index) == 0) {
|
index = 1;
|
}
|
|
this.changeSelectedItem(index, true);
|
}
|
|
this.calculateTotalAttr();
|
} //如果是升级,播放升级特效
|
|
|
if (is_upgrade == true) this.handleLevUpgradeEffect(true);
|
},
|
//计算当前总属性,这边会缓存属性,下一次点亮之后只需要累加处理
|
calculateTotalAttr: function calculateTotalAttr() {
|
if (this.cur_skill_info == null) return;
|
var activity_skill_list = []; //已经激活的技能
|
|
if (this.cur_skill_info.group_ids && Utils.next(this.cur_skill_info.group_ids)) {
|
//首先把已经激活的技能组里面包含的所有技能储存起来
|
for (var i in this.cur_skill_info.group_ids) {
|
var v = this.cur_skill_info.group_ids[i];
|
var group_config = gdata("guild_skill_data", "data_info_group", [v.group_id]);
|
if (group_config == null) return;
|
|
for (var n in group_config) {
|
activity_skill_list.push(group_config[n].id);
|
}
|
}
|
} //储存当前的技能组已经激活的技能
|
|
|
if (this.cur_skill_info.skill_ids && Utils.next(this.cur_skill_info.skill_ids)) {
|
for (var i in this.cur_skill_info.skill_ids) {
|
var v = this.cur_skill_info.skill_ids[i];
|
|
if (v.status == GuildskillConst.status.activity) {
|
activity_skill_list.push(v.id);
|
}
|
}
|
}
|
|
var activity_attr_dic = [];
|
|
for (var i in activity_skill_list) {
|
var v = activity_skill_list[i];
|
var skill_config = gdata("guild_skill_data", "data_info", [v]);
|
|
if (skill_config != null) {
|
for (var n in skill_config.attr_list) {
|
var m = skill_config.attr_list[n];
|
|
if (activity_attr_dic[m[0]] == null) {
|
activity_attr_dic[m[0]] = 0;
|
}
|
|
activity_attr_dic[m[0]] = activity_attr_dic[m[0]] + m[1];
|
}
|
}
|
} //这里是判断所有的数据
|
|
|
this.attr_value_list = activity_attr_dic;
|
this.updateSkillAttrNameAndVal(); //这里计算一下总战力
|
// local total_power = PartnerCalculate.calculatePower(self.attr_value_list)
|
// self.total_power_value:setString(math.floor( total_power ))
|
},
|
//单元选中
|
changeSelectedItem: function changeSelectedItem(index, force) {
|
if (this.selected_item && !force) {
|
if (this.selected_item.index == index) return;
|
}
|
|
this.selected_item = this.item_list[index];
|
if (this.selected_item == null) return;
|
|
if (this.selected_item.node) {
|
this.selected.setPosition(this.selected_item.x, this.selected_item.y); // this.selected.x = this.selected_item.x;
|
// this.selected.y = this.selected_item.y;
|
} //做显示属性切换
|
|
|
var config = this.selected_item.config;
|
|
if (config) {
|
var attr_key = null;
|
var attr_name = null;
|
|
for (var i in config.attr_list) {
|
var v = config.attr_list[i];
|
|
if (v instanceof Array && v.length >= 2) {
|
var show_object = this.singe_att_list[Number(i) + 1];
|
|
if (show_object) {
|
attr_key = v[0];
|
attr_name = gdata("attr_data", "data_key_to_name", [attr_key]);
|
|
if (attr_name) {
|
show_object.attr_title.node.active = true;
|
show_object.attr_title.string = attr_name; //如果是百分比数值
|
|
show_object.attr_value.node.active = true;
|
show_object.attr_value.string = v[1];
|
|
if (PartnerCalculate.isShowPerByStr(attr_key) == true) {
|
show_object.attr_value.string = "+" + v[1] * 0.1 + "%";
|
} else {
|
show_object.attr_value.string = "+" + v[1];
|
}
|
}
|
}
|
}
|
}
|
|
this.setUpgradeCost();
|
}
|
},
|
//点亮消耗
|
setUpgradeCost: function setUpgradeCost() {
|
if (this.selected_item == null || this.selected_item.config == null || this.selected_item.data == null) return;
|
var config = this.selected_item.config;
|
var data = this.selected_item.data;
|
|
if (config.lev >= 20 && data.status == GuildskillConst.status.activity) {
|
this.cost_container.active = false;
|
|
if (this.max_lev_label == null) {
|
self.max_lev_label = Utils.createLabel(28, 175, null, 338, 96, Utils.TI18N("该技能已满级!"), this.main_panel, 0, cc.v2(0.5, 0.5));
|
}
|
|
this.max_lev_label.active = true;
|
} else {
|
this.cost_container.active = true;
|
if (this.max_lev_label) this.max_lev_label.active = false;
|
|
if (config.loss) {
|
var base_cost = {};
|
var item_config = null;
|
|
if (this.upgrade_cost_list == null) {
|
this.upgrade_cost_list = {};
|
}
|
|
this.upgrade_cost_list.base_list = {}; // 基础消耗
|
|
this.upgrade_cost_list.item_list = {}; // 物品
|
|
this.upgrade_cost_list.asset_list = {}; // 资产物品
|
|
if (base_cost && base_cost[0] && base_cost[1]) {
|
item_config = Utils.getItemConfig(base_cost[0]);
|
|
if (item_config) {}
|
|
var asset_key = gdata("item_data", "data_assets_id2label", [base_cost[0]]);
|
|
if (asset_key) {
|
this.upgrade_cost_list.base_list[asset_key] = {
|
need_num: base_cost[1],
|
condition_status: false,
|
item: self.cost_item_value
|
};
|
}
|
} //因为第一个已经被提出掉了,所以这不做处理了
|
|
|
for (var k in this.backpack_item_list) {
|
this.backpack_item_list[k].setVisible(false);
|
}
|
|
var index = 1;
|
var _x = 94;
|
var _y = 80;
|
|
for (var i in config.loss) {
|
var v = config.loss[i];
|
|
if (v[0] != null && v[1] != null) {
|
var backpack_item = this.backpack_item_list[index];
|
|
if (backpack_item == null) {
|
backpack_item = ItemsPool.getInstance().getItem("backpack_item");
|
backpack_item.initConfig(false, 1, false, false);
|
backpack_item.show();
|
this.backpack_item_list[index] = backpack_item;
|
backpack_item.setParent(this.cost_container);
|
_x = -300 + (index - 1) * (BackPackItem.Width + 28) + BackPackItem.Width * 0.5;
|
backpack_item.setPosition(_x, _y);
|
backpack_item.setNumBgPos(cc.v2(0, -74), cc.v2(0.5, 0.5), cc.v2(0, 0), cc.v2(0.5, 0.5));
|
}
|
|
backpack_item.setData({
|
bid: v[0],
|
num: 0
|
});
|
backpack_item.setVisible(true);
|
index = index + 1;
|
var asset_key = gdata("item_data", "data_assets_id2label", [v[0]]);
|
|
if (asset_key != null) {
|
this.upgrade_cost_list.asset_list[asset_key] = {
|
need_num: v[1],
|
condition_status: false,
|
item: backpack_item
|
};
|
} else {
|
this.upgrade_cost_list.item_list[v[0]] = {
|
need_num: v[1],
|
condition_status: false,
|
item: backpack_item
|
};
|
}
|
}
|
}
|
|
this.setUpgradeCostStatus();
|
}
|
}
|
},
|
//更新消耗状态
|
//null的话就标识全部判断,0标识判断基础,1标识判断扩展资产,2标识判断物品
|
setUpgradeCostStatus: function setUpgradeCostStatus(type) {
|
//这里是资产
|
for (var k in this.upgrade_cost_list.base_list) {
|
var v = this.upgrade_cost_list.base_list[k];
|
|
if (v.need_num && v.item) {
|
var sum = this.role_vo[k] || 0;
|
|
if (sum >= v.need_num) {
|
v.condition_status = true;
|
v.item.color = new cc.Color(0x68, 0x45, 0x2a, 0xff);
|
} else {
|
v.condition_status = false;
|
v.item.color = new cc.Color(0xd9, 0x50, 0x14, 0xff);
|
}
|
|
v.item.string = v.need_num;
|
}
|
} //这里是扩展资产
|
|
|
for (var k in this.upgrade_cost_list.asset_list) {
|
var v = this.upgrade_cost_list.asset_list[k];
|
|
if (v.item && v.item.setNeedNum) {
|
var sum = this.role_vo[k] || 0;
|
v.item.setNeedNum(v.need_num, sum);
|
if (sum < v.need_num) v.condition_status = false;else v.condition_status = true;
|
}
|
} //这里是需求道具
|
|
|
this.auto_buy_item_price = 0;
|
this.auto_buy_item_bid = 0;
|
|
for (var k in this.upgrade_cost_list.item_list) {
|
var sum = BackpackController.getInstance().getModel().getBackPackItemNumByBid(k);
|
var v = this.upgrade_cost_list.item_list[k];
|
|
if (v.item && v.item.setNeedNum) {
|
v.item.setNeedNum(v.need_num, sum);
|
|
if (sum < v.need_num) {
|
this.auto_buy_item_price = this.auto_buy_item_price + this.getItemPrice(k) * (v.need_num - sum);
|
this.auto_buy_item_bid = k;
|
v.condition_status = true;
|
} else {
|
v.condition_status = true;
|
}
|
}
|
}
|
|
this.checkUpgradeCostStatus();
|
},
|
//获取物品价格
|
getItemPrice: function getItemPrice(bid) {
|
for (var i in Config.exchange_data.data_shop_exchange_guild) {
|
var v = Config.exchange_data.data_shop_exchange_guild[i];
|
if (v.item_bid == bid) return v.price;
|
}
|
|
return 0;
|
},
|
//设置更新状态
|
checkUpgradeCostStatus: function checkUpgradeCostStatus() {
|
if (this.upgrade_cost_list == null) return;
|
if (this.selected_item == null || this.selected_item.config == null) return;
|
var config = this.selected_item.config;
|
var condition_status = true;
|
|
for (var k in this.upgrade_cost_list) {
|
var list = this.upgrade_cost_list[k];
|
|
for (var n in list) {
|
var item = list[n];
|
|
if (item.condition_status == false) {
|
condition_status = false;
|
break;
|
}
|
}
|
}
|
|
var condition_type = 0; //1:消耗不足 2:满足 3:条件不足
|
|
if (this.role_vo.guild_lev >= config.guild_lev) {
|
if (condition_status == false) condition_type = 1;else condition_type = 2;
|
} else condition_type = 3;
|
|
if (this.condition_type != condition_type) {
|
this.condition_type = condition_type;
|
|
if (condition_type == 1) {
|
// this.check_box.active = false;
|
this.condition_value.active = false;
|
Utils.setGreyButton(this.handle_btn);
|
this.handle_btn_label_outline.enabled = false;
|
Utils.setGreyButton(this.handle_btn.getComponent(cc.Button));
|
this.handle_btn_label.string = Utils.TI18N("消耗不足");
|
} else if (condition_type == 2) {
|
// if (this.auto_buy_item_price > 0)
|
// this.check_box.active = true;
|
// else
|
// this.check_box.active = false;
|
this.condition_value.active = false;
|
Utils.setGreyButton(this.handle_btn, false);
|
this.handle_btn_label_outline.enabled = true;
|
Utils.setGreyButton(this.handle_btn.getComponent(cc.Button), false);
|
this.handle_btn_label_outline.color = new cc.Color(0xc4, 0x5a, 0x14, 0xff);
|
this.handle_btn_label.string = Utils.TI18N("点亮");
|
} else if (condition_type == 3) {
|
// this.check_box.active = false;
|
this.condition_value.active = true;
|
this.condition_value.string = cc.js.formatStr(Utils.TI18N("需要公会到达%s级"), config.guild_lev);
|
Utils.setGreyButton(this.handle_btn, true);
|
this.handle_btn_label_outline.enabled = false;
|
Utils.setGreyButton(this.handle_btn.getComponent(cc.Button));
|
this.handle_btn_label.string = Utils.TI18N("条件不足");
|
}
|
}
|
|
this.updateAutoBuyInfo();
|
},
|
updateAutoBuyInfo: function updateAutoBuyInfo() {},
|
//物品增删的时候处理
|
changeNeedItemInfo: function changeNeedItemInfo(list) {
|
if (this.upgrade_cost_list == null || this.upgrade_cost_list.item_list == null) return;
|
if (list == null || Utils.next(list) == null) return;
|
var list_dict = {};
|
|
for (var i in list) {
|
var vo = list[i];
|
if (vo.base_id) list_dict[vo.base_id] = true;
|
}
|
|
var need_update = false;
|
this.auto_buy_item_price = 0;
|
|
for (var k in this.upgrade_cost_list.item_list) {
|
if (list_dict[k] == true) {
|
need_update = true;
|
var sum = BackpackController.getInstance().getModel().getBackPackItemNumByBid(k);
|
|
if (v.item && v.item.setNeedNum) {
|
v.item.setNeedNum(v.need_num, sum);
|
|
if (sum < v.need_num) {
|
this.auto_buy_item_price = this.auto_buy_item_price + this.getItemPrice(k) * (v.need_num - sum);
|
v.condition_status = true;
|
} else {
|
v.condition_status = true;
|
}
|
}
|
}
|
}
|
|
if (need_update == true) this.checkUpgradeCostStatus();
|
},
|
//标签页对应的伙伴职业类型
|
getType: function getType(index) {
|
if (index == 1) {
|
return GuildskillConst.index.physics;
|
} else if (index == 2) {
|
return GuildskillConst.index.magic;
|
} else if (index == 3) {
|
return GuildskillConst.index.defence;
|
} else if (index == 4) {
|
return GuildskillConst.index.assist;
|
}
|
},
|
closeCallBack: function closeCallBack() {
|
this.ctrl.openGuildSkillMainWindow(false);
|
this.handleUpgradeEffect(false);
|
this.handleLevUpgradeEffect(false); // if (this.selected) {
|
// this.selected.stopAllActions();
|
// }
|
|
if (this.fight_label) {
|
this.fight_label.deleteMe();
|
this.fight_label = null;
|
}
|
|
for (var k in this.backpack_item_list) {
|
this.backpack_item_list[k].deleteMe();
|
this.backpack_item_list[k] = null;
|
}
|
|
this.backpack_item_list = {};
|
|
if (this.role_vo) {
|
if (this.update_role_assets_event != null) {
|
this.role_vo.unbind(this.update_role_assets_event);
|
this.update_role_assets_event = null;
|
}
|
}
|
}
|
});
|
module.exports = GuildskillMainWindow;
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxndWlsZHNraWxsXFx2aWV3XFxndWlsZHNraWxsX21haW5fd2luZG93LmpzIl0sIm5hbWVzIjpbIlBhdGhUb29sIiwicmVxdWlyZSIsIkd1aWxkc2tpbGxDb250cm9sbGVyIiwiR3VpbGRza2lsbEV2ZW50IiwiR3VpbGRza2lsbENvbnN0IiwiQmFja3BhY2tDb25zdCIsIkJhY2twYWNrQ29udHJvbGxlciIsIkd1aWxkQ29uc3QiLCJSb2xlQ29udHJvbGxlciIsIkd1aWxkU2tpbGxBdHRySXRlbSIsIkd1aWxkRXZlbnQiLCJQYXJ0bmVyQ2FsY3VsYXRlIiwiR3VpbGRza2lsbE1haW5XaW5kb3ciLCJjYyIsIkNsYXNzIiwiQmFzZVZpZXciLCJjdG9yIiwicHJlZmFiUGF0aCIsImdldFByZWZhYlBhdGgiLCJ3aW5fdHlwZSIsIldpblR5cGUiLCJCaWciLCJ2aWV3VGFnIiwiU0NFTkVfVEFHIiwiZGlhbG9ndWUiLCJjdHJsIiwiZ2V0SW5zdGFuY2UiLCJtb2RlbCIsImdldE1vZGVsIiwidGFiX2xpc3QiLCJhdHRyX2xpc3QiLCJpdGVtX2xpc3QiLCJzaW5nZV9hdHRfbGlzdCIsImF0dHJfdmFsdWVfbGlzdCIsImN1cl9pbmZvX2dyb3VwX2lkIiwiYmFja3BhY2tfaXRlbV9saXN0IiwidXBncmFkZV9jb3N0X2xpc3QiLCJjdXJfaW5kZXgiLCJyb2xlX3ZvIiwiZ2V0Um9sZVZvIiwib3BlbkNhbGxCYWNrIiwiYmFja2dyb3VuZCIsInNlZWtDaGlsZCIsIm1haW5fcGFuZWwiLCJzY2FsZSIsIkZJVF9TQ0FMRSIsImNhcmVlcl9kZXNjIiwiUmljaFRleHQiLCJjbG9zZV9idG4iLCJleHBsYWluX2J0biIsImNvc3RfY29udGFpbmVyIiwiaGFuZGxlX2J0biIsImhhbmRsZV9idG5fbGFiZWwiLCJMYWJlbCIsImhhbmRsZV9idG5fbGFiZWxfb3V0bGluZSIsIkxhYmVsT3V0bGluZSIsInN0cmluZyIsIlV0aWxzIiwiVEkxOE4iLCJjb25kaXRpb25fdmFsdWUiLCJjb3N0X25vZGUiLCJhY3RpdmUiLCJjb3N0X2l0ZW1faWNvbiIsImNvc3RfaXRlbV92YWx1ZSIsImF1dG9fYnV5X2xhYmVsIiwibm9kZSIsInRhYl9jb250YWluZXIiLCJpIiwidGFiX2J0biIsImdldENoaWxkQnlOYW1lIiwidGl0bGUiLCJnZXRDb21wb25lbnQiLCJ0aXBzIiwiY2FyZWVyIiwiZ2V0VHlwZSIsImxhYmVsIiwiY29sb3IiLCJDb2xvciIsImluZGV4IiwiYnRuIiwiQnV0dG9uIiwiaW50ZXJhY3RhYmxlIiwic2Nyb2xsX3ZpZXciLCJzY3JvbGxfdmlld19jb24iLCJzaXplIiwiZ2V0Q29udGVudFNpemUiLCJhdHRyX2NvbnRhaW5lciIsImNvbmZpZyIsImdkYXRhIiwiX3giLCJfeSIsInZhbCIsImxpc3Rfc2l6ZSIsIk1hdGgiLCJjZWlsIiwibGVuZ3RoIiwid2lkdGgiLCJoZWlnaHQiLCJzcGFjZV94Iiwic3BhY2VfeSIsIm1heF9oZWlnaHQiLCJtYXgiLCJ2IiwiaW5zdGFudGlhdGUiLCJhdHRyX2l0ZW0iLCJzZXRQYXJlbnQiLCJmbG9vciIsInNldFBvc2l0aW9uIiwic2VsZWN0ZWQiLCJDb21tb25BY3Rpb24iLCJicmVhdGhlU2hpbmVBY3Rpb24zIiwib2JqZWN0IiwiaXRlbSIsIlNwcml0ZSIsIml0ZW1fbGV2IiwibGV2IiwieCIsInkiLCJzdGF0dXMiLCJkYXRhIiwic2luZ2xlX2l0ZW1fYXR0cl9jb250YWluZXIiLCJhdHRyX3RpdGxlIiwiYXR0cl92YWx1ZSIsImxldl91cGdyYWRlX21vZGVsIiwicmVnaXN0ZXJFdmVudCIsIm9uIiwiTm9kZSIsIkV2ZW50VHlwZSIsIlRPVUNIX0VORCIsIm9wZW5HdWlsZFNraWxsTWFpbldpbmRvdyIsInBsYXlCdXR0b25Tb3VuZCIsImV2ZW50IiwiQ29uZmlnIiwiZ3VpbGRfc2tpbGxfZGF0YSIsImRhdGFfY29uc3QiLCJnYW1lX3J1bGUiLCJwb3MiLCJ0b3VjaCIsImdldExvY2F0aW9uIiwic2hvd0NvbW1vblRpcHMiLCJkZXNjIiwiayIsInNlbmRlciIsImN1cnJlbnRUYXJnZXQiLCJjaGFuZ2VTZWxlY3RlZFRhYiIsInNlbGVjdGVkX2l0ZW0iLCJhdXRvX2J1eV9pdGVtX2JpZCIsImF1dG9fYnV5X2l0ZW1fcHJpY2UiLCJpdGVtX2NvbmZpZyIsImdldEl0ZW1Db25maWciLCJvcGVuVGlwc1NvdXJjZSIsIm1lc3NhZ2UiLCJyZXF1ZXN0QWN0aXZpdHlTa2lsbCIsImlkIiwiYWRkR2xvYmFsRXZlbnQiLCJVcGRhdGVHdWlsZFNraWxsRXZlbnQiLCJzZWxlY3RlZF90YWIiLCJ1cGRhdGVTa2lsbExpc3QiLCJVcGRhdGVTa2lsbFN0YXR1c0V2ZW50Iiwic2tpbGxfaWQiLCJ1cGRhdGVTa2lsbEl0ZW1CeUlkIiwiVXBkYXRlU2tpbFVwZ3JhZGVFdmVudCIsImdyb3VwX2lkIiwiVXBkYXRlR3VpbGRSZWRTdGF0dXMiLCJiaWQiLCJ1cGRhdGVHdWlsZFNraWxsUmVkIiwiRXZlbnRJZCIsIkFERF9HT09EUyIsImJhZ19jb2RlIiwiZGVsX2xpc3QiLCJCYWdfQ29kZSIsIkJBQ0tQQUNLIiwiY2hhbmdlTmVlZEl0ZW1JbmZvIiwiTU9ESUZZX0dPT0RTX05VTSIsImNoYW5nZV9saXN0IiwidXBkYXRlX3JvbGVfYXNzZXRzX2V2ZW50IiwiYmluZCIsIlVQREFURV9ST0xFX0FUVFJJQlVURSIsImtleSIsInZhbHVlIiwiYmFzZV9saXN0Iiwic2V0VXBncmFkZUNvc3RTdGF0dXMiLCJhc3NldF9saXN0Iiwib3BlblJvb3RXbmQiLCJwaHlzaWNzIiwiZ2V0UmVkU3RhdHVzIiwicmVkX2luZGV4Iiwic2tpbGxfMiIsIm1hZ2ljIiwic2tpbGxfMyIsInNraWxsXzQiLCJkZWZlbmNlIiwic2tpbGxfNSIsImFzc2lzdCIsImdldENhcmVlclNraWxsSW5mbyIsInJlcXVlc3RDYXJlZXJTa2lsbEluZm8iLCJnZXRDYXJlZXJLZXkiLCJ1cGRhdGVHdWlsZFJlZFN0YXR1cyIsIml0ZW1fcmVzX2lkIiwianMiLCJmb3JtYXRTdHIiLCJsb2FkUmVzIiwiZ2V0VUlJY29uUGF0aCIsInNmX29iaiIsInNwcml0ZUZyYW1lIiwidXBkYXRlU2tpbGxBdHRyTmFtZUFuZFZhbCIsImNvbmZpZ19zdHIiLCJhdHRyX2tleSIsInNldERhdGEiLCJ1cGRhdGVfbGlzdCIsImJvb2wiLCJhY3Rpdml0eSIsInNldFN0YXRlIiwiU3RhdGUiLCJOT1JNQUwiLCJHUkFZIiwiQXJyYXkiLCJwdXNoIiwiaGFuZGxlVXBncmFkZUVmZmVjdCIsInYyIiwiY3VyX3NraWxsX2luZm8iLCJza2lsbF9pZHMiLCJ1bl9hY3Rpdml0eSIsImNoYW5nZVNlbGVjdGVkSXRlbSIsInVwZ3JhZGVfZWZmZWN0IiwicmVtb3ZlRnJvbVBhcmVudCIsImZpbmlzaF9mdW5jIiwiaGFuZGxlTGV2VXBncmFkZUVmZmVjdCIsImlzX3VwZ3JhZGUiLCJncm91cF9jb25maWciLCJnZXROb3JLZXkiLCJtYXhfZ3JvdXAiLCJnZXRDYXJlZXJHcm91cE1heCIsImdyb3VwX25hbWUiLCJncm91cF9zZXEiLCJza2lsbF9pdGVtIiwiTnVtYmVyIiwiY2FsY3VsYXRlVG90YWxBdHRyIiwiYWN0aXZpdHlfc2tpbGxfbGlzdCIsImdyb3VwX2lkcyIsIm5leHQiLCJuIiwiYWN0aXZpdHlfYXR0cl9kaWMiLCJza2lsbF9jb25maWciLCJtIiwiZm9yY2UiLCJhdHRyX25hbWUiLCJzaG93X29iamVjdCIsImlzU2hvd1BlckJ5U3RyIiwic2V0VXBncmFkZUNvc3QiLCJtYXhfbGV2X2xhYmVsIiwic2VsZiIsImNyZWF0ZUxhYmVsIiwibG9zcyIsImJhc2VfY29zdCIsImFzc2V0X2tleSIsIm5lZWRfbnVtIiwiY29uZGl0aW9uX3N0YXR1cyIsInNldFZpc2libGUiLCJiYWNrcGFja19pdGVtIiwiSXRlbXNQb29sIiwiZ2V0SXRlbSIsImluaXRDb25maWciLCJzaG93IiwiQmFja1BhY2tJdGVtIiwiV2lkdGgiLCJzZXROdW1CZ1BvcyIsIm51bSIsInR5cGUiLCJzdW0iLCJzZXROZWVkTnVtIiwiZ2V0QmFja1BhY2tJdGVtTnVtQnlCaWQiLCJnZXRJdGVtUHJpY2UiLCJjaGVja1VwZ3JhZGVDb3N0U3RhdHVzIiwiZXhjaGFuZ2VfZGF0YSIsImRhdGFfc2hvcF9leGNoYW5nZV9ndWlsZCIsIml0ZW1fYmlkIiwicHJpY2UiLCJsaXN0IiwiY29uZGl0aW9uX3R5cGUiLCJndWlsZF9sZXYiLCJzZXRHcmV5QnV0dG9uIiwiZW5hYmxlZCIsInVwZGF0ZUF1dG9CdXlJbmZvIiwibGlzdF9kaWN0Iiwidm8iLCJiYXNlX2lkIiwibmVlZF91cGRhdGUiLCJjbG9zZUNhbGxCYWNrIiwiZmlnaHRfbGFiZWwiLCJkZWxldGVNZSIsInVuYmluZCIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsSUFBSUEsUUFBUSxHQUFHQyxPQUFPLENBQUMsVUFBRCxDQUF0Qjs7QUFDQSxJQUFJQyxvQkFBb0IsR0FBR0QsT0FBTyxDQUFDLHVCQUFELENBQWxDOztBQUNBLElBQUlFLGVBQWUsR0FBR0YsT0FBTyxDQUFDLGtCQUFELENBQTdCOztBQUNBLElBQUlHLGVBQWUsR0FBR0gsT0FBTyxDQUFDLGtCQUFELENBQTdCOztBQUNBLElBQUlJLGFBQWEsR0FBR0osT0FBTyxDQUFDLGdCQUFELENBQTNCOztBQUNBLElBQUlLLGtCQUFrQixHQUFHTCxPQUFPLENBQUMscUJBQUQsQ0FBaEM7O0FBQ0EsSUFBSU0sVUFBVSxHQUFHTixPQUFPLENBQUMsYUFBRCxDQUF4Qjs7QUFDQSxJQUFJTyxjQUFjLEdBQUdQLE9BQU8sQ0FBQyxpQkFBRCxDQUE1Qjs7QUFDQSxJQUFJUSxrQkFBa0IsR0FBR1IsT0FBTyxDQUFDLGlCQUFELENBQWhDOztBQUNBLElBQUlTLFVBQVUsR0FBR1QsT0FBTyxDQUFDLGFBQUQsQ0FBeEI7O0FBQ0EsSUFBSVUsZ0JBQWdCLEdBQUdWLE9BQU8sQ0FBQyxtQkFBRCxDQUE5Qjs7QUFFQSxJQUFJVyxvQkFBb0IsR0FBR0MsRUFBRSxDQUFD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QmlILE9BQTdCO0FBQ0gsS0FGTSxNQUVBLElBQUlqSCxLQUFLLElBQUksQ0FBYixFQUFnQjtBQUNuQixhQUFPMUUsZUFBZSxDQUFDMEUsS0FBaEIsQ0FBc0JtSCxNQUE3QjtBQUNIO0FBQ0osR0FwekIrQjtBQXN6QmhDK0YsRUFBQUEsYUFBYSxFQUFFLHlCQUFZO0FBQ3ZCLFNBQUt2USxJQUFMLENBQVV3Ryx3QkFBVixDQUFtQyxLQUFuQztBQUNBLFNBQUt5RixtQkFBTCxDQUF5QixLQUF6QjtBQUNBLFNBQUtTLHNCQUFMLENBQTRCLEtBQTVCLEVBSHVCLENBS3ZCO0FBQ0E7QUFDQTs7QUFFQSxRQUFJLEtBQUs4RCxXQUFULEVBQXNCO0FBQ2xCLFdBQUtBLFdBQUwsQ0FBaUJDLFFBQWpCO0FBQ0EsV0FBS0QsV0FBTCxHQUFtQixJQUFuQjtBQUNIOztBQUVELFNBQUssSUFBSXBKLENBQVQsSUFBYyxLQUFLMUcsa0JBQW5CLEVBQXVDO0FBQ25DLFdBQUtBLGtCQUFMLENBQXdCMEcsQ0FBeEIsRUFBMkJxSixRQUEzQjtBQUNBLFdBQUsvUCxrQkFBTCxDQUF3QjBHLENBQXhCLElBQTZCLElBQTdCO0FBQ0g7O0FBQ0QsU0FBSzFHLGtCQUFMLEdBQTBCLEVBQTFCOztBQUdBLFFBQUksS0FBS0csT0FBVCxFQUFrQjtBQUNkLFVBQUksS0FBS3lJLHdCQUFMLElBQWlDLElBQXJDLEVBQTJDO0FBQ3ZDLGFBQUt6SSxPQUFMLENBQWE2UCxNQUFiLENBQW9CLEtBQUtwSCx3QkFBekI7QUFDQSxhQUFLQSx3QkFBTCxHQUFnQyxJQUFoQztBQUNIO0FBQ0o7QUFDSjtBQWoxQitCLENBQVQsQ0FBM0I7QUFxMUJBcUgsTUFBTSxDQUFDQyxPQUFQLEdBQWlCelIsb0JBQWpCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyBAYXV0aG9yOiBzaGlyYWhvQHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXHJcbi8vIEBkZXNjcmlwdGlvbjpcclxuLy8gICAgICDlhazkvJrmioDog73nmoTkuLvnlYzpnaJcclxuLy8gPGJyLz5DcmVhdGU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxudmFyIFBhdGhUb29sID0gcmVxdWlyZShcInBhdGh0b29sXCIpO1xyXG52YXIgR3VpbGRza2lsbENvbnRyb2xsZXIgPSByZXF1aXJlKFwiZ3VpbGRza2lsbF9jb250cm9sbGVyXCIpO1xyXG52YXIgR3VpbGRza2lsbEV2ZW50ID0gcmVxdWlyZShcImd1aWxkc2tpbGxfZXZlbnRcIik7XHJcbnZhciBHdWlsZHNraWxsQ29uc3QgPSByZXF1aXJlKFwiZ3VpbGRza2lsbF9jb25zdFwiKTtcclxudmFyIEJhY2twYWNrQ29uc3QgPSByZXF1aXJlKFwiYmFja3BhY2tfY29uc3RcIik7XHJcbnZhciBCYWNrcGFja0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiYmFja3BhY2tfY29udHJvbGxlclwiKTtcclxudmFyIEd1aWxkQ29uc3QgPSByZXF1aXJlKFwiZ3VpbGRfY29uc3RcIik7XHJcbnZhciBSb2xlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJyb2xlX2NvbnRyb2xsZXJcIik7XHJcbnZhciBHdWlsZFNraWxsQXR0ckl0ZW0gPSByZXF1aXJlKFwiZ3VpbGRza2lsbF9pdGVtXCIpO1xyXG52YXIgR3VpbGRFdmVudCA9IHJlcXVpcmUoXCJndWlsZF9ldmVudFwiKTtcclxudmFyIFBhcnRuZXJDYWxjdWxhdGUgPSByZXF1aXJlKFwicGFydG5lcl9jYWxjdWxhdGVcIik7XHJcblxyXG52YXIgR3VpbGRza2lsbE1haW5XaW5kb3cgPSBjYy5DbGFzcyh7XHJcbiAgICBleHRlbmRzOiBCYXNlVmlldyxcclxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLnByZWZhYlBhdGggPSBQYXRoVG9vbC5nZXRQcmVmYWJQYXRoKFwiZ3VpbGRza2lsbFwiLCBcImd1aWxkc2tpbGxfbWFpbl93aW5kb3dcIik7XHJcbiAgICAgICAgdGhpcy53aW5fdHlwZSA9IFdpblR5cGUuQmlnO1xyXG4gICAgICAgIHRoaXMudmlld1RhZyA9IFNDRU5FX1RBRy5kaWFsb2d1ZTtcclxuICAgICAgICB0aGlzLmN0cmwgPSBHdWlsZHNraWxsQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpO1xyXG4gICAgICAgIHRoaXMubW9kZWwgPSB0aGlzLmN0cmwuZ2V0TW9kZWwoKTtcclxuXHJcbiAgICAgICAgdGhpcy50YWJfbGlzdCA9IHt9OyAgICAgICAgICAgIC8vIOagh+etvumhtVxyXG4gICAgICAgIHRoaXMuYXR0cl9saXN0ID0ge307ICAgICAgICAgICAgLy8g57u86L+w5oCn5Yqg5oiQXHJcbiAgICAgICAgdGhpcy5pdGVtX2xpc3QgPSB7fTsgICAgICAgICAgICAvLyA25Liq5Y2V5YWD6ZuG5ZCIXHJcbiAgICAgICAgdGhpcy5zaW5nZV9hdHRfbGlzdCA9IHt9OyAgICAgICAgICAgIC8vIOWNleS4queahOWxnuaAp+WKoOaIkFxyXG4gICAgICAgIHRoaXMuYXR0cl92YWx1ZV9saXN0ID0ge307ICAgICAgICAgICAgLy8g5b2T5YmN5omA57Sv56ev5bGe5oCn55qE5YiX6KGoXHJcbiAgICAgICAgdGhpcy5jdXJfaW5mb19ncm91cF9pZCA9IDAgICAgICAgICAgICAgLy8g5pu05paw5Yik5pat5L6d5o2uXHJcbiAgICAgICAgdGhpcy5iYWNrcGFja19pdGVtX2xpc3QgPSB7fTsgICAgICAgICAgICAvLyDnianlk4Hlm77moIflrp7kvotcclxuXHJcbiAgICAgICAgdGhpcy51cGdyYWRlX2Nvc3RfbGlzdCA9IHt9OyAgICAgICAgICAgIC8vIOeCueS6rumcgOimgea2iOiAl+eahOeJqeWTgeWSjOi1hOS6p1xyXG4gICAgICAgIHRoaXMuY3VyX2luZGV4ID0gMTtcclxuICAgICAgICB0aGlzLnJvbGVfdm8gPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpO1xyXG4gICAgfSxcclxuXHJcblxyXG4gICAgb3BlbkNhbGxCYWNrOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kID0gdGhpcy5zZWVrQ2hpbGQoXCJiYWNrZ3JvdW5kXCIpO1xyXG4gICAgICAgIHZhciBtYWluX3BhbmVsID0gdGhpcy5zZWVrQ2hpbGQoXCJtYWluX3BhbmVsXCIpO1xyXG4gICAgICAgIHRoaXMuYmFja2dyb3VuZC5zY2FsZSA9IEZJVF9TQ0FMRTtcclxuICAgICAgICB0aGlzLmNhcmVlcl9kZXNjID0gdGhpcy5zZWVrQ2hpbGQobWFpbl9wYW5lbCwgXCJjYXJlZXJfZGVzY1wiLCBjYy5SaWNoVGV4dCk7XHJcbiAgICAgICAgdGhpcy5jbG9zZV9idG4gPSB0aGlzLnNlZWtDaGlsZChtYWluX3BhbmVsLCBcImNsb3NlX2J0blwiKTtcclxuICAgICAgICB0aGlzLmV4cGxhaW5fYnRuID0gdGhpcy5zZWVrQ2hpbGQobWFpbl9wYW5lbCwgXCJleHBsYWluX2J0blwiKTtcclxuICAgICAgICAvLyB0aGlzLnRvdGFsX3Bvd2VyX3ZhbHVlID0gdGhpcy5zZWVrQ2hpbGQobWFpbl9wYW5lbCwgXCJ0b3RhbF9wb3dlcl92YWx1ZVwiKTtcclxuICAgICAgICB0aGlzLmNvc3RfY29udGFpbmVyID0gdGhpcy5zZWVrQ2hpbGQobWFpbl9wYW5lbCwgXCJjb3N0X2NvbnRhaW5lclwiKTtcclxuICAgICAgICB0aGlzLmhhbmRsZV9idG4gPSB0aGlzLnNlZWtDaGlsZChtYWluX3BhbmVsLCBcImhhbmRsZV9idG5cIik7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVfYnRuX2xhYmVsID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5oYW5kbGVfYnRuLCBcImxhYmVsXCIsIGNjLkxhYmVsKTtcclxuICAgICAgICB0aGlzLmhhbmRsZV9idG5fbGFiZWxfb3V0bGluZSA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuaGFuZGxlX2J0biwgXCJsYWJlbFwiLCBjYy5MYWJlbE91dGxpbmUpO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlX2J0bl9sYWJlbC5zdHJpbmcgPSBVdGlscy5USTE4TihcIueCueS6rlwiKTtcclxuICAgICAgICB0aGlzLmNvbmRpdGlvbl92YWx1ZSA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuY29zdF9jb250YWluZXIsIFwiY29uZGl0aW9uX3ZhbHVlXCIsIGNjLkxhYmVsKTtcclxuXHJcbiAgICAgICAgdmFyIGNvc3Rfbm9kZSA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuY29zdF9jb250YWluZXIsIFwiY29zdF9ub2RlXCIpO1xyXG4gICAgICAgIGNvc3Rfbm9kZS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNvc3RfaXRlbV9pY29uID0gdGhpcy5zZWVrQ2hpbGQoY29zdF9ub2RlLCBcIml0ZW1faW1nXCIpO1xyXG4gICAgICAgIHRoaXMuY29zdF9pdGVtX3ZhbHVlID0gdGhpcy5zZWVrQ2hpbGQoY29zdF9ub2RlLCBcImNvc3RfdmFsdWVcIik7XHJcblxyXG4gICAgICAgIHRoaXMuYXV0b19idXlfbGFiZWwgPSB0aGlzLnNlZWtDaGlsZChtYWluX3BhbmVsLCBcImF1dG9fYnV5X2xhYmVsXCIsIGNjLlJpY2hUZXh0KTtcclxuICAgICAgICB0aGlzLmF1dG9fYnV5X2xhYmVsLm5vZGUuYWN0aXZlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHZhciB0YWJfY29udGFpbmVyID0gdGhpcy5zZWVrQ2hpbGQobWFpbl9wYW5lbCwgXCJ0YWJfY29udGFpbmVyXCIpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgNTsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciB0YWJfYnRuID0gdGFiX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcInRhYl9idG5fXCIgKyBpKTtcclxuICAgICAgICAgICAgaWYgKHRhYl9idG4pIHtcclxuICAgICAgICAgICAgICAgIHZhciB0aXRsZSA9IHRhYl9idG4uZ2V0Q2hpbGRCeU5hbWUoXCJ0aXRsZVwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHRpcHMgPSB0YWJfYnRuLmdldENoaWxkQnlOYW1lKFwidGlwc1wiKTtcclxuICAgICAgICAgICAgICAgIGlmIChpID09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aXRsZS5zdHJpbmcgPSBVdGlscy5USTE4TihcIuaImOWjq+iBjOS4mlwiKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSAyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGUuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLms5XluIjogYzkuJpcIik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi5Z2m5YWL6IGM5LiaXCIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpID09IDQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aXRsZS5zdHJpbmcgPSBVdGlscy5USTE4TihcIui+heWKqeiBjOS4mlwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZhciBjYXJlZXIgPSB0aGlzLmdldFR5cGUoaSk7XHJcbiAgICAgICAgICAgICAgICB0YWJfYnRuLmNhcmVlciA9IGNhcmVlcjtcclxuICAgICAgICAgICAgICAgIHRhYl9idG4ubGFiZWwgPSB0aXRsZTtcclxuICAgICAgICAgICAgICAgIHRhYl9idG4ubGFiZWwubm9kZS5jb2xvciA9IG5ldyBjYy5Db2xvcigweGNmLCAweGI1LCAweDkzLCAweGZmKTtcclxuICAgICAgICAgICAgICAgIHRhYl9idG4udGlwcyA9IHRpcHM7XHJcbiAgICAgICAgICAgICAgICB0YWJfYnRuLmluZGV4ID0gaTtcclxuICAgICAgICAgICAgICAgIHRhYl9idG4uYnRuID0gdGFiX2J0bi5nZXRDb21wb25lbnQoY2MuQnV0dG9uKTtcclxuICAgICAgICAgICAgICAgIHRhYl9idG4uYnRuLmludGVyYWN0YWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy50YWJfbGlzdFtjYXJlZXJdID0gdGFiX2J0bjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zY3JvbGxfdmlldyA9IHRoaXMuc2Vla0NoaWxkKG1haW5fcGFuZWwsIFwic2Nyb2xsX3ZpZXdcIik7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxfdmlld19jb24gPSB0aGlzLnNlZWtDaGlsZCh0aGlzLnNjcm9sbF92aWV3LCBcImNvbnRlbnRcIik7XHJcbiAgICAgICAgdmFyIHNpemUgPSB0aGlzLnNjcm9sbF92aWV3LmdldENvbnRlbnRTaXplKCk7XHJcblxyXG4gICAgICAgIHZhciBhdHRyX2NvbnRhaW5lciA9IHRoaXMuc2Vla0NoaWxkKG1haW5fcGFuZWwsIFwiYXR0cl9jb250YWluZXJcIik7XHJcbiAgICAgICAgYXR0cl9jb250YWluZXIuYWN0aXZlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8v6YWN572u5pi+56S657u86L+w5oCn5p2h55uuXHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IGdkYXRhKFwiZ3VpbGRfc2tpbGxfZGF0YVwiLCBcImRhdGFfY29uc3RcIiwgW1wiYXR0cl9zaG93X1wiICsgdGhpcy5jdXJfaW5kZXhdKTtcclxuICAgICAgICB2YXIgX3gsIF95O1xyXG4gICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLnZhbCkge1xyXG4gICAgICAgICAgICB2YXIgbGlzdF9zaXplID0gTWF0aC5jZWlsKGNvbmZpZy52YWwubGVuZ3RoIC8gMyk7XHJcbiAgICAgICAgICAgIHZhciB3aWR0aCA9IDE4MDtcclxuICAgICAgICAgICAgdmFyIGhlaWdodCA9IDI0O1xyXG4gICAgICAgICAgICB2YXIgc3BhY2VfeCA9IDEwO1xyXG4gICAgICAgICAgICB2YXIgc3BhY2VfeSA9IDEzO1xyXG4gICAgICAgICAgICB2YXIgbWF4X2hlaWdodCA9IGxpc3Rfc2l6ZSAqIGhlaWdodCArIChsaXN0X3NpemUgKyAxKSAqIHNwYWNlX3k7XHJcbiAgICAgICAgICAgIG1heF9oZWlnaHQgPSBNYXRoLm1heChtYXhfaGVpZ2h0LCBzaXplLmhlaWdodCk7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gY29uZmlnLnZhbCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHYgPSBjb25maWcudmFsW2ldO1xyXG4gICAgICAgICAgICAgICAgdmFyIG5vZGUgPSBjYy5pbnN0YW50aWF0ZShhdHRyX2NvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICBub2RlLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB2YXIgYXR0cl9pdGVtID0gbmV3IEd1aWxkU2tpbGxBdHRySXRlbShub2RlLCB2KTtcclxuICAgICAgICAgICAgICAgIG5vZGUuc2V0UGFyZW50KHRoaXMuc2Nyb2xsX3ZpZXdfY29uKTtcclxuICAgICAgICAgICAgICAgIF94ID0gLXNpemUud2lkdGggLyAyICsgKGkgJSAzKSAqICh3aWR0aCArIHNwYWNlX3gpO1xyXG4gICAgICAgICAgICAgICAgX3kgPSAtICg3ICsgaGVpZ2h0ICogMC41ICsgKE1hdGguZmxvb3IoaSAvIDMpKSAqIChoZWlnaHQgKyBzcGFjZV95KSk7XHJcbiAgICAgICAgICAgICAgICBub2RlLnNldFBvc2l0aW9uKF94LCBfeSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmF0dHJfbGlzdFtpXSA9IGF0dHJfaXRlbTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuc2Vla0NoaWxkKG1haW5fcGFuZWwsIFwic2VsZWN0ZWRcIik7XHJcbiAgICAgICAgQ29tbW9uQWN0aW9uLmJyZWF0aGVTaGluZUFjdGlvbjModGhpcy5zZWxlY3RlZClcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCA3OyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIG9iamVjdCA9IHt9O1xyXG4gICAgICAgICAgICB2YXIgaXRlbSA9IG1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJpdGVtX1wiICsgaSkuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSk7XHJcbiAgICAgICAgICAgIHZhciBpdGVtX2xldiA9IG1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJpdGVtX2xldl9cIiArIGkpLmdldENvbXBvbmVudChjYy5MYWJlbCk7XHJcbiAgICAgICAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICBvYmplY3Qubm9kZSA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICBvYmplY3QubGV2ID0gaXRlbV9sZXY7XHJcbiAgICAgICAgICAgICAgICBvYmplY3QuaW5kZXggPSBpO1xyXG4gICAgICAgICAgICAgICAgb2JqZWN0LnggPSBpdGVtLm5vZGUueDtcclxuICAgICAgICAgICAgICAgIG9iamVjdC55ID0gaXRlbS5ub2RlLnk7XHJcbiAgICAgICAgICAgICAgICBvYmplY3Quc3RhdHVzID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIG9iamVjdC5kYXRhID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIG9iamVjdC5jb25maWcgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtX2xpc3RbaV0gPSBvYmplY3Q7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8v5Y2V5Liq5Y2V5YWD55qE5bGe5oCn5Yqg5oiQ5bGV56S6XHJcbiAgICAgICAgdGhpcy5zaW5nbGVfaXRlbV9hdHRyX2NvbnRhaW5lciA9IHRoaXMuc2Vla0NoaWxkKG1haW5fcGFuZWwsIFwic2luZ2xlX2l0ZW1fYXR0cl9jb250YWluZXJcIik7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCAzOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIG9iamVjdCA9IHt9O1xyXG4gICAgICAgICAgICBvYmplY3QuYXR0cl90aXRsZSA9IHRoaXMuc2luZ2xlX2l0ZW1fYXR0cl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJhdHRyX3RpdGxlX1wiICsgaSkuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcclxuICAgICAgICAgICAgb2JqZWN0LmF0dHJfdmFsdWUgPSB0aGlzLnNpbmdsZV9pdGVtX2F0dHJfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiYXR0cl92YWx1ZV9cIiArIGkpLmdldENvbXBvbmVudChjYy5MYWJlbCk7XHJcbiAgICAgICAgICAgIG9iamVjdC5hdHRyX3RpdGxlLm5vZGUuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIG9iamVjdC5hdHRyX3ZhbHVlLm5vZGUuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuc2luZ2VfYXR0X2xpc3RbaV0gPSBvYmplY3Q7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmxldl91cGdyYWRlX21vZGVsID0gdGhpcy5zZWVrQ2hpbGQobWFpbl9wYW5lbCwgXCJsZXZfdXBncmFkZV9tb2RlbFwiKTtcclxuICAgICAgICB0aGlzLm1haW5fcGFuZWwgPSBtYWluX3BhbmVsO1xyXG4gICAgfSxcclxuXHJcblxyXG5cclxuICAgIHJlZ2lzdGVyRXZlbnQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAodGhpcy5iYWNrZ3JvdW5kKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmFja2dyb3VuZC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3RybC5vcGVuR3VpbGRTa2lsbE1haW5XaW5kb3coZmFsc2UpO1xyXG4gICAgICAgICAgICB9LCB0aGlzKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VfYnRuKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2VfYnRuLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5HdWlsZFNraWxsTWFpbldpbmRvdyhmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoMik7XHJcbiAgICAgICAgICAgIH0sIHRoaXMpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmV4cGxhaW5fYnRuLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIHZhciBjb25maWcgPSBDb25maWcuZ3VpbGRfc2tpbGxfZGF0YS5kYXRhX2NvbnN0LmdhbWVfcnVsZTtcclxuICAgICAgICAgICAgVXRpbHMucGxheUJ1dHRvblNvdW5kKDEpO1xyXG4gICAgICAgICAgICB2YXIgcG9zID0gZXZlbnQudG91Y2guZ2V0TG9jYXRpb24oKTtcclxuICAgICAgICAgICAgcmVxdWlyZShcInRpcHNfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLnNob3dDb21tb25UaXBzKGNvbmZpZy5kZXNjLCBwb3MsbnVsbCxudWxsLDUwMCk7XHJcbiAgICAgICAgfSwgdGhpcylcclxuXHJcbiAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLnRhYl9saXN0KSB7XHJcbiAgICAgICAgICAgIHZhciB0YWJfYnRuID0gdGhpcy50YWJfbGlzdFtrXTtcclxuICAgICAgICAgICAgdGFiX2J0bi5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHNlbmRlciA9IGV2ZW50LmN1cnJlbnRUYXJnZXRcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlU2VsZWN0ZWRUYWIoc2VuZGVyLmNhcmVlciwgc2VuZGVyLmluZGV4KTtcclxuICAgICAgICAgICAgfSwgdGhpcylcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaGFuZGxlX2J0bi5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRfaXRlbSAmJiB0aGlzLnNlbGVjdGVkX2l0ZW0uZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXV0b19idXlfaXRlbV9iaWQgJiYgdGhpcy5hdXRvX2J1eV9pdGVtX3ByaWNlICYmIHRoaXMuYXV0b19idXlfaXRlbV9wcmljZSA+IDAgJiYgIXRoaXMuYXV0b19idXlfbGFiZWwuYWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW1fY29uZmlnID0gVXRpbHMuZ2V0SXRlbUNvbmZpZyh0aGlzLmF1dG9fYnV5X2l0ZW1fYmlkKTtcclxuICAgICAgICAgICAgICAgICAgICBCYWNrcGFja0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5vcGVuVGlwc1NvdXJjZSh0cnVlLCBpdGVtX2NvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZShVdGlscy5USTE4TihcIumBk+WFt+S4jei2s++8jOaXoOazleeCueS6rlwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN0cmwucmVxdWVzdEFjdGl2aXR5U2tpbGwodGhpcy5zZWxlY3RlZF9pdGVtLmRhdGEuaWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgdGhpcylcclxuXHJcbiAgICAgICAgLy/liJ3lp4vljJbnmoTml7blgJnlgZrnmoTvvIzlj6/og73liIfmjaLmoIfnrb7vvIzmiJbogIXnrKzkuIDmrKHmiZPlvIBcclxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEd1aWxkc2tpbGxFdmVudC5VcGRhdGVHdWlsZFNraWxsRXZlbnQsIGZ1bmN0aW9uIChjYXJlZXIpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRfdGFiICYmIHRoaXMuc2VsZWN0ZWRfdGFiLmNhcmVlciA9PSBjYXJlZXIpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNraWxsTGlzdChjYXJlZXIpO1xyXG4gICAgICAgIH0sIHRoaXMpXHJcblxyXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoR3VpbGRza2lsbEV2ZW50LlVwZGF0ZVNraWxsU3RhdHVzRXZlbnQsIGZ1bmN0aW9uIChjYXJlZXIsIHNraWxsX2lkKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkX3RhYiAmJiB0aGlzLnNlbGVjdGVkX3RhYi5jYXJlZXIgPT0gY2FyZWVyKVxyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTa2lsbEl0ZW1CeUlkKHNraWxsX2lkKTtcclxuICAgICAgICB9LCB0aGlzKVxyXG5cclxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEd1aWxkc2tpbGxFdmVudC5VcGRhdGVTa2lsVXBncmFkZUV2ZW50LCBmdW5jdGlvbiAoY2FyZWVyLCBncm91cF9pZCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZF90YWIgJiYgdGhpcy5zZWxlY3RlZF90YWIuY2FyZWVyID09IGNhcmVlcilcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2tpbGxMaXN0KGNhcmVlciwgdHJ1ZSk7XHJcbiAgICAgICAgfSwgdGhpcylcclxuXHJcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChHdWlsZEV2ZW50LlVwZGF0ZUd1aWxkUmVkU3RhdHVzLCBmdW5jdGlvbiAoYmlkLCBzdGF0dXMpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVHdWlsZFNraWxsUmVkKGJpZCwgc3RhdHVzKTtcclxuICAgICAgICB9LCB0aGlzKVxyXG5cclxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEV2ZW50SWQuQUREX0dPT0RTLCBmdW5jdGlvbiAoYmFnX2NvZGUsIGRlbF9saXN0KSB7XHJcbiAgICAgICAgICAgIGlmIChiYWdfY29kZSAhPSBCYWNrcGFja0NvbnN0LkJhZ19Db2RlLkJBQ0tQQUNLKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlTmVlZEl0ZW1JbmZvKGRlbF9saXN0KTtcclxuICAgICAgICB9LCB0aGlzKVxyXG5cclxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEV2ZW50SWQuTU9ESUZZX0dPT0RTX05VTSwgZnVuY3Rpb24gKGJhZ19jb2RlLCBjaGFuZ2VfbGlzdCkge1xyXG4gICAgICAgICAgICBpZiAoYmFnX2NvZGUgIT0gQmFja3BhY2tDb25zdC5CYWdfQ29kZS5CQUNLUEFDSylcclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZU5lZWRJdGVtSW5mbyhjaGFuZ2VfbGlzdCk7XHJcbiAgICAgICAgfSwgdGhpcylcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucm9sZV92bykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy51cGRhdGVfcm9sZV9hc3NldHNfZXZlbnQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVfcm9sZV9hc3NldHNfZXZlbnQgPSB0aGlzLnJvbGVfdm8uYmluZChFdmVudElkLlVQREFURV9ST0xFX0FUVFJJQlVURSwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZF9pdGVtICYmIHRoaXMudXBncmFkZV9jb3N0X2xpc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXBncmFkZV9jb3N0X2xpc3QuYmFzZV9saXN0ICYmIHRoaXMudXBncmFkZV9jb3N0X2xpc3QuYmFzZV9saXN0W2tleV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VXBncmFkZUNvc3RTdGF0dXMoMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy51cGdyYWRlX2Nvc3RfbGlzdC5hc3NldF9saXN0ICYmIHRoaXMudXBncmFkZV9jb3N0X2xpc3QuYXNzZXRfbGlzdFtrZXldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFVwZ3JhZGVDb3N0U3RhdHVzKDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwgdGhpcylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgb3BlblJvb3RXbmQ6IGZ1bmN0aW9uIChjYXJlZXIpIHtcclxuICAgICAgICBjYXJlZXIgPSBjYXJlZXIgfHwgR3VpbGRza2lsbENvbnN0LmluZGV4LnBoeXNpY3M7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VTZWxlY3RlZFRhYihjYXJlZXIsIHRoaXMuY3VyX2luZGV4KTtcclxuICAgICAgICB0aGlzLnVwZGF0ZUd1aWxkU2tpbGxSZWQoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy/mm7TmlrDnuqLngrlcclxuICAgIHVwZGF0ZUd1aWxkU2tpbGxSZWQ6IGZ1bmN0aW9uIChiaWQsIHN0YXR1cykge1xyXG4gICAgICAgIGlmIChiaWQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMudGFiX2xpc3QpIHtcclxuICAgICAgICAgICAgICAgIHZhciB0YWJfYnRuID0gdGhpcy50YWJfbGlzdFtrXTtcclxuICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLm1vZGVsLmdldFJlZFN0YXR1cyh0YWJfYnRuLmNhcmVlcik7XHJcbiAgICAgICAgICAgICAgICBpZiAodGFiX2J0bi50aXBzKVxyXG4gICAgICAgICAgICAgICAgICAgIHRhYl9idG4udGlwcy5hY3RpdmUgPSBzdGF0dXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKGJpZCA9PSBHdWlsZENvbnN0LnJlZF9pbmRleC5za2lsbF8yKSB7XHJcbiAgICAgICAgICAgIHZhciB0YWJfYnRuID0gdGhpcy50YWJfbGlzdFtHdWlsZHNraWxsQ29uc3QuaW5kZXgubWFnaWNdO1xyXG4gICAgICAgICAgICBpZiAodGFiX2J0biAmJiB0YWJfYnRuLnRpcHMpXHJcbiAgICAgICAgICAgICAgICB0YWJfYnRuLnRpcHMuYWN0aXZlID0gc3RhdHVzO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoYmlkID09IEd1aWxkQ29uc3QucmVkX2luZGV4LnNraWxsXzMpIHtcclxuICAgICAgICAgICAgdmFyIHRhYl9idG4gPSB0aGlzLnRhYl9saXN0W0d1aWxkc2tpbGxDb25zdC5pbmRleC5waHlzaWNzXTtcclxuICAgICAgICAgICAgaWYgKHRhYl9idG4gJiYgdGFiX2J0bi50aXBzKVxyXG4gICAgICAgICAgICAgICAgdGFiX2J0bi50aXBzLmFjdGl2ZSA9IHN0YXR1cztcclxuICAgICAgICB9IGVsc2UgaWYgKGJpZCA9PSBHdWlsZENvbnN0LnJlZF9pbmRleC5za2lsbF80KSB7XHJcbiAgICAgICAgICAgIHZhciB0YWJfYnRuID0gdGhpcy50YWJfbGlzdFtHdWlsZHNraWxsQ29uc3QuaW5kZXguZGVmZW5jZV07XHJcbiAgICAgICAgICAgIGlmICh0YWJfYnRuICYmIHRhYl9idG4udGlwcylcclxuICAgICAgICAgICAgICAgIHRhYl9idG4udGlwcy5hY3RpdmUgPSBzdGF0dXM7XHJcbiAgICAgICAgfSBlbHNlIGlmIChiaWQgPT0gR3VpbGRDb25zdC5yZWRfaW5kZXguc2tpbGxfNSkge1xyXG4gICAgICAgICAgICB2YXIgdGFiX2J0biA9IHRoaXMudGFiX2xpc3RbR3VpbGRza2lsbENvbnN0LmluZGV4LmFzc2lzdF07XHJcbiAgICAgICAgICAgIGlmICh0YWJfYnRuICYmIHRhYl9idG4udGlwcylcclxuICAgICAgICAgICAgICAgIHRhYl9idG4udGlwcy5hY3RpdmUgPSBzdGF0dXM7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvL+agh+etvumhtemAieS4rVxyXG4gICAgY2hhbmdlU2VsZWN0ZWRUYWI6IGZ1bmN0aW9uIChjYXJlZXIsIGluZGV4KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRfdGFiICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRfdGFiLmNhcmVlciA9PSBjYXJlZXIpXHJcbiAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jdXJfaW5kZXggPSBpbmRleDtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZF90YWIpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZF90YWIubGFiZWwubm9kZS5jb2xvciA9IG5ldyBjYy5Db2xvcigweGNmLCAweGI1LCAweDkzLCAweGZmKTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZF90YWIuYnRuLmludGVyYWN0YWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkX3RhYiA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRfdGFiID0gdGhpcy50YWJfbGlzdFtjYXJlZXJdO1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkX3RhYikge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkX3RhYi5sYWJlbC5ub2RlLmNvbG9yID0gbmV3IGNjLkNvbG9yKDB4ZmYsIDB4ZWQsIDB4ZDYsIDB4ZmYpOztcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZF90YWIuYnRuLmludGVyYWN0YWJsZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL+WBmuWFqOmDqOWxnuaAp+aYvuekuuWIh+aNolxyXG4gICAgICAgIHZhciBvYmplY3QgPSB0aGlzLm1vZGVsLmdldENhcmVlclNraWxsSW5mbyhjYXJlZXIpO1xyXG4gICAgICAgIGlmIChvYmplY3QgPT0gbnVsbClcclxuICAgICAgICAgICAgdGhpcy5jdHJsLnJlcXVlc3RDYXJlZXJTa2lsbEluZm8oY2FyZWVyKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2tpbGxMaXN0KGNhcmVlcik7XHJcbiAgICAgICAgLy/lhbPpl63nuqLngrlcclxuICAgICAgICB2YXIgYmlkID0gdGhpcy5tb2RlbC5nZXRDYXJlZXJLZXkoY2FyZWVyKTtcclxuICAgICAgICB0aGlzLm1vZGVsLnVwZGF0ZUd1aWxkUmVkU3RhdHVzKGJpZCwgZmFsc2UpO1xyXG5cclxuICAgICAgICAvL+iuvue9ruaYvuekulxyXG4gICAgICAgIHZhciBpdGVtX3Jlc19pZCA9IFwiXCI7XHJcbiAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLml0ZW1fbGlzdCkge1xyXG4gICAgICAgICAgICB2YXIgdiA9IHRoaXMuaXRlbV9saXN0W2ldO1xyXG4gICAgICAgICAgICBpdGVtX3Jlc19pZCA9IGNjLmpzLmZvcm1hdFN0cihcImd1aWxkc2tpbGxfJXNfJXNcIiwgY2FyZWVyLCB2LmluZGV4KTtcclxuICAgICAgICAgICAgaWYgKHYubm9kZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkUmVzKFBhdGhUb29sLmdldFVJSWNvblBhdGgoXCJndWlsZHNraWxsXCIsIGl0ZW1fcmVzX2lkKSwgZnVuY3Rpb24gKHNmX29iaikge1xyXG4gICAgICAgICAgICAgICAgICAgIHYubm9kZS5zcHJpdGVGcmFtZSA9IHNmX29iajtcclxuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLy/liLfmlrDlsZ7mgKflkI3np7DmmL7npLpcclxuICAgIHVwZGF0ZVNraWxsQXR0ck5hbWVBbmRWYWw6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgY29uZmlnX3N0ciA9IFwiYXR0cl9zaG93X1wiICsgdGhpcy5jdXJfaW5kZXg7XHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IGdkYXRhKFwiZ3VpbGRfc2tpbGxfZGF0YVwiLCBcImRhdGFfY29uc3RcIiwgW2NvbmZpZ19zdHJdKTtcclxuICAgICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy52YWwpIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBjb25maWcudmFsKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdiA9IGNvbmZpZy52YWxbaV07XHJcbiAgICAgICAgICAgICAgICB2YXIgYXR0cl9pdGVtID0gdGhpcy5hdHRyX2xpc3RbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoYXR0cl9pdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJfa2V5ID0gdjtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cl92YWx1ZSA9IHRoaXMuYXR0cl92YWx1ZV9saXN0W2F0dHJfa2V5XTtcclxuICAgICAgICAgICAgICAgICAgICBhdHRyX2l0ZW0uc2V0RGF0YShhdHRyX3ZhbHVlLCBhdHRyX2tleSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8v6K6+572u5oyH5a6a5oqA6IO9aWTnmoTnirbmgIFcclxuICAgIHVwZGF0ZVNraWxsSXRlbUJ5SWQ6IGZ1bmN0aW9uIChza2lsbF9pZCkge1xyXG4gICAgICAgIGlmIChza2lsbF9pZCA9PSBudWxsKVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB2YXIgdXBkYXRlX2xpc3QgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMuaXRlbV9saXN0KSB7XHJcbiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5pdGVtX2xpc3RbaV07XHJcbiAgICAgICAgICAgIGlmIChpdGVtLmRhdGEgJiYgaXRlbS5kYXRhLmlkID09IHNraWxsX2lkICYmIGl0ZW0ubm9kZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0uc3RhdHVzICE9IGl0ZW0uZGF0YS5zdGF0dXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLnN0YXR1cyA9IGl0ZW0uZGF0YS5zdGF0dXM7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJvb2wgPSBpdGVtLnN0YXR1cyA9PSBHdWlsZHNraWxsQ29uc3Quc3RhdHVzLmFjdGl2aXR5XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5ub2RlLnNldFN0YXRlKGJvb2wgPyBjYy5TcHJpdGUuU3RhdGUuTk9STUFMIDogY2MuU3ByaXRlLlN0YXRlLkdSQVkpXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy/ov5nph4zlnKjlkKfov5nkuKrmioDog73nmoTlsZ7mgKfntK/liqDliLDlvZPliY3mgLvorrDlvZXnmoTph4zpnaLljrvvvIzlubbkuJTmm7TmlrDliLbliqjnmoTmsYfmgLvmioDog71cclxuICAgICAgICAgICAgICAgIGlmIChpdGVtLmNvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gaXRlbS5jb25maWcuYXR0cl9saXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2ID0gaXRlbS5jb25maWcuYXR0cl9saXN0W2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodiBpbnN0YW5jZW9mIEFycmF5ICYmICh2Lmxlbmd0aCA+PSAyKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYXR0cl92YWx1ZV9saXN0W3ZbMF1dID09IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdHRyX3ZhbHVlX2xpc3RbdlswXV0gPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdHRyX3ZhbHVlX2xpc3RbdlswXV0gPSB0aGlzLmF0dHJfdmFsdWVfbGlzdFt2WzBdXSArIHZbMV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+WtmOWCqOmcgOimgeabtOaWsOeahOWxnuaAp2tleVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlX2xpc3QucHVzaCh2WzBdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8v5YGa5bGe5oCn55qE5pu05pawXHJcbiAgICAgICAgdGhpcy51cGRhdGVTa2lsbEF0dHJOYW1lQW5kVmFsKCk7XHJcblxyXG4gICAgICAgIC8v5Y2H57qn54m55pWIXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRfaXRlbSAmJiB0aGlzLnNlbGVjdGVkX2l0ZW0ubm9kZSkge1xyXG4gICAgICAgICAgICB2YXIgX3ggPSB0aGlzLnNlbGVjdGVkX2l0ZW0ubm9kZS54O1xyXG4gICAgICAgICAgICB2YXIgX3kgPSB0aGlzLnNlbGVjdGVkX2l0ZW0ubm9kZS55O1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZVVwZ3JhZGVFZmZlY3QodHJ1ZSwgY2MudjIoX3gsIF95KSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL+mHjeaWsOmAieaLqeS4gOS4i+S4i+S4gOS4quW+heeCueS6rueahFxyXG4gICAgICAgIHZhciBpbmRleCA9IDA7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VyX3NraWxsX2luZm8gJiYgdGhpcy5jdXJfc2tpbGxfaW5mby5za2lsbF9pZHMpIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLmN1cl9za2lsbF9pbmZvLnNraWxsX2lkcykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmN1cl9za2lsbF9pbmZvLnNraWxsX2lkc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtLnN0YXR1cyA9PSBHdWlsZHNraWxsQ29uc3Quc3RhdHVzLnVuX2FjdGl2aXR5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IDAgfHwgaW5kZXggPiBpdGVtLmluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaXRlbS5pbmRleDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VTZWxlY3RlZEl0ZW0oaW5kZXgsIHRydWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy/ov5nph4zorqHnrpfkuIDkuIvmgLvmiJjliptcclxuICAgICAgICAvLyB2YXIgdG90YWxfcG93ZXIgPSBQYXJ0bmVyQ2FsY3VsYXRlLmNhbGN1bGF0ZVBvd2VyKHNlbGYuYXR0cl92YWx1ZV9saXN0KVxyXG4gICAgICAgIC8vIHRoaXMudG90YWxfcG93ZXJfdmFsdWUuc3RyaW5nID0gTWF0aC5mbG9vcih0b3RhbF9wb3dlcik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8v5pKt5pS+54m55pWIXHJcbiAgICBoYW5kbGVVcGdyYWRlRWZmZWN0OiBmdW5jdGlvbiAoc3RhdHVzLCBwb3MpIHtcclxuICAgICAgICBpZiAoc3RhdHVzID09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnVwZ3JhZGVfZWZmZWN0ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBncmFkZV9lZmZlY3QucmVtb3ZlRnJvbVBhcmVudCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGdyYWRlX2VmZmVjdCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgZmluaXNoX2Z1bmMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy51cGdyYWRlX2VmZmVjdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBncmFkZV9lZmZlY3QuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMudXBncmFkZV9lZmZlY3QgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWFpbl9wYW5lbCkge1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvL+aKgOiDvee7hOWNh+e6p+eahOeJueaViFxyXG4gICAgaGFuZGxlTGV2VXBncmFkZUVmZmVjdDogZnVuY3Rpb24gKHN0YXR1cykge1xyXG4gICAgICAgIGlmIChzdGF0dXMgPT0gZmFsc2UpIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvL+WIneWni+WMluaKgOiDveWIl+ihqFxyXG4gICAgdXBkYXRlU2tpbGxMaXN0OiBmdW5jdGlvbiAoY2FyZWVyLCBpc191cGdyYWRlKSB7XHJcbiAgICAgICAgaWYgKGNhcmVlciA9PSBudWxsKVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB2YXIgb2JqZWN0ID0gdGhpcy5tb2RlbC5nZXRDYXJlZXJTa2lsbEluZm8oY2FyZWVyKTtcclxuICAgICAgICBpZiAob2JqZWN0KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cl9pbmZvX2dyb3VwX2lkID09IG9iamVjdC5ncm91cF9pZClcclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICB0aGlzLmN1cl9pbmZvX2dyb3VwX2lkID0gb2JqZWN0Lmdyb3VwX2lkO1xyXG4gICAgICAgICAgICB0aGlzLmN1cl9za2lsbF9pbmZvID0gb2JqZWN0O1xyXG4gICAgICAgICAgICAvL+S4i+S4gOWdl+W8gOWQr+eahOaPj+i/sOaYvuekulxyXG4gICAgICAgICAgICB2YXIgZ3JvdXBfY29uZmlnID0gZ2RhdGEoXCJndWlsZF9za2lsbF9kYXRhXCIsIFwiZGF0YV9ncm91cFwiLCBbVXRpbHMuZ2V0Tm9yS2V5KGNhcmVlciwgb2JqZWN0Lmdyb3VwX2lkKV0pO1xyXG4gICAgICAgICAgICBpZiAoZ3JvdXBfY29uZmlnICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHZhciBtYXhfZ3JvdXAgPSB0aGlzLm1vZGVsLmdldENhcmVlckdyb3VwTWF4KGNhcmVlcik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhcmVlcl9kZXNjLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihcIiVzPGNvbG9yPSMyNDkwMDM+KCVzLyVzKTwvYz5cIiwgZ3JvdXBfY29uZmlnLmdyb3VwX25hbWUsIGdyb3VwX2NvbmZpZy5ncm91cF9zZXEsIG1heF9ncm91cCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy/nu5nmmL7npLrljZXkvY3lgqjlrZjmlbDmja7nu5PmnoRcclxuICAgICAgICAgICAgaWYgKG9iamVjdC5za2lsbF9pZHMpIHtcclxuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IDA7XHJcbiAgICAgICAgICAgICAgICB2YXIgc2tpbGxfaXRlbSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB2YXIgY29uZmlnID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gb2JqZWN0LnNraWxsX2lkcykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8v5a2Y5YKo5a+55bqU5oqA6IO95Y2V5L2N5bGe5oCnXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBvYmplY3Quc2tpbGxfaWRzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIHNraWxsX2l0ZW0gPSB0aGlzLml0ZW1fbGlzdFtpdGVtLmluZGV4XTtcclxuICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBnZGF0YShcImd1aWxkX3NraWxsX2RhdGFcIiwgXCJkYXRhX2luZm9cIiwgW2l0ZW0uaWRdKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2tpbGxfaXRlbSAmJiBjb25maWcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2tpbGxfaXRlbS5kYXRhID0gaXRlbTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2tpbGxfaXRlbS5jb25maWcgPSBjb25maWc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8v6K6+572u5pi+56S654q25oCBXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChza2lsbF9pdGVtLm5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChza2lsbF9pdGVtLnN0YXR1cyAhPSBpdGVtLnN0YXR1cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraWxsX2l0ZW0uc3RhdHVzID0gaXRlbS5zdGF0dXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJvb2wgPSBpdGVtLnN0YXR1cyA9PSBHdWlsZHNraWxsQ29uc3Quc3RhdHVzLmFjdGl2aXR5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpbGxfaXRlbS5ub2RlLnNldFN0YXRlKGJvb2wgPyBjYy5TcHJpdGUuU3RhdGUuTk9STUFMIDogY2MuU3ByaXRlLlN0YXRlLkdSQVkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8v6K6+572u5oqA6IO9562J57qnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChza2lsbF9pdGVtLmxldikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpbGxfaXRlbS5sZXYuc3RyaW5nID0gY29uZmlnLmxldjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy/pgInkuK3lvZPliY3lvoXljYfnuqfnmoTpgqPkuKpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5zdGF0dXMgPT0gR3VpbGRza2lsbENvbnN0LnN0YXR1cy51bl9hY3Rpdml0eSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gMCB8fCBpbmRleCA+IGl0ZW0uaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaXRlbS5pbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8v5aaC5p6c6YGN5Y6G5a6M5LqG6L+Y5pivMO+8jOWFtuWunui/meS4quaXtuWAmeW3sue7j+aYr+acgOmrmOetiee6p+S6hu+8jOmCo+Wwsemaj+S+v+mAieS4reS4gOS4qlxyXG4gICAgICAgICAgICAgICAgaWYgKE51bWJlcihpbmRleCkgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gMVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VTZWxlY3RlZEl0ZW0oaW5kZXgsIHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBdHRyKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL+WmguaenOaYr+WNh+e6p++8jOaSreaUvuWNh+e6p+eJueaViFxyXG4gICAgICAgIGlmIChpc191cGdyYWRlID09IHRydWUpXHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlTGV2VXBncmFkZUVmZmVjdCh0cnVlKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy/orqHnrpflvZPliY3mgLvlsZ7mgKfvvIzov5novrnkvJrnvJPlrZjlsZ7mgKfvvIzkuIvkuIDmrKHngrnkuq7kuYvlkI7lj6rpnIDopoHntK/liqDlpITnkIZcclxuICAgIGNhbGN1bGF0ZVRvdGFsQXR0cjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmN1cl9za2lsbF9pbmZvID09IG51bGwpXHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIHZhciBhY3Rpdml0eV9za2lsbF9saXN0ID0gW107ICAgICAgIC8v5bey57uP5r+A5rS755qE5oqA6IO9XHJcbiAgICAgICAgaWYgKHRoaXMuY3VyX3NraWxsX2luZm8uZ3JvdXBfaWRzICYmIFV0aWxzLm5leHQodGhpcy5jdXJfc2tpbGxfaW5mby5ncm91cF9pZHMpKSB7XHJcbiAgICAgICAgICAgIC8v6aaW5YWI5oqK5bey57uP5r+A5rS755qE5oqA6IO957uE6YeM6Z2i5YyF5ZCr55qE5omA5pyJ5oqA6IO95YKo5a2Y6LW35p2lXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5jdXJfc2tpbGxfaW5mby5ncm91cF9pZHMpIHtcclxuICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jdXJfc2tpbGxfaW5mby5ncm91cF9pZHNbaV07XHJcbiAgICAgICAgICAgICAgICB2YXIgZ3JvdXBfY29uZmlnID0gZ2RhdGEoXCJndWlsZF9za2lsbF9kYXRhXCIsIFwiZGF0YV9pbmZvX2dyb3VwXCIsIFt2Lmdyb3VwX2lkXSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXBfY29uZmlnID09IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIGdyb3VwX2NvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3NraWxsX2xpc3QucHVzaChncm91cF9jb25maWdbbl0uaWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL+WCqOWtmOW9k+WJjeeahOaKgOiDvee7hOW3sue7j+a/gOa0u+eahOaKgOiDvVxyXG4gICAgICAgIGlmICh0aGlzLmN1cl9za2lsbF9pbmZvLnNraWxsX2lkcyAmJiBVdGlscy5uZXh0KHRoaXMuY3VyX3NraWxsX2luZm8uc2tpbGxfaWRzKSkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMuY3VyX3NraWxsX2luZm8uc2tpbGxfaWRzKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMuY3VyX3NraWxsX2luZm8uc2tpbGxfaWRzW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKHYuc3RhdHVzID09IEd1aWxkc2tpbGxDb25zdC5zdGF0dXMuYWN0aXZpdHkpIHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eV9za2lsbF9saXN0LnB1c2godi5pZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBhY3Rpdml0eV9hdHRyX2RpYyA9IFtdO1xyXG4gICAgICAgIGZvciAodmFyIGkgaW4gYWN0aXZpdHlfc2tpbGxfbGlzdCkge1xyXG4gICAgICAgICAgICB2YXIgdiA9IGFjdGl2aXR5X3NraWxsX2xpc3RbaV07XHJcbiAgICAgICAgICAgIHZhciBza2lsbF9jb25maWcgPSBnZGF0YShcImd1aWxkX3NraWxsX2RhdGFcIiwgXCJkYXRhX2luZm9cIiwgW3ZdKTtcclxuICAgICAgICAgICAgaWYgKHNraWxsX2NvbmZpZyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIHNraWxsX2NvbmZpZy5hdHRyX2xpc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbSA9IHNraWxsX2NvbmZpZy5hdHRyX2xpc3Rbbl07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2aXR5X2F0dHJfZGljW21bMF1dID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHlfYXR0cl9kaWNbbVswXV0gPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eV9hdHRyX2RpY1ttWzBdXSA9IGFjdGl2aXR5X2F0dHJfZGljW21bMF1dICsgbVsxXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy/ov5nph4zmmK/liKTmlq3miYDmnInnmoTmlbDmja5cclxuICAgICAgICB0aGlzLmF0dHJfdmFsdWVfbGlzdCA9IGFjdGl2aXR5X2F0dHJfZGljO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2tpbGxBdHRyTmFtZUFuZFZhbCgpO1xyXG5cclxuICAgICAgICAvL+i/memHjOiuoeeul+S4gOS4i+aAu+aImOWKm1xyXG4gICAgICAgIC8vIGxvY2FsIHRvdGFsX3Bvd2VyID0gUGFydG5lckNhbGN1bGF0ZS5jYWxjdWxhdGVQb3dlcihzZWxmLmF0dHJfdmFsdWVfbGlzdClcclxuICAgICAgICAvLyBzZWxmLnRvdGFsX3Bvd2VyX3ZhbHVlOnNldFN0cmluZyhtYXRoLmZsb29yKCB0b3RhbF9wb3dlciApKVxyXG4gICAgfSxcclxuXHJcbiAgICAvL+WNleWFg+mAieS4rVxyXG4gICAgY2hhbmdlU2VsZWN0ZWRJdGVtOiBmdW5jdGlvbiAoaW5kZXgsIGZvcmNlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRfaXRlbSAmJiAhZm9yY2UpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRfaXRlbS5pbmRleCA9PSBpbmRleClcclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlbGVjdGVkX2l0ZW0gPSB0aGlzLml0ZW1fbGlzdFtpbmRleF07XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRfaXRlbSA9PSBudWxsKVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZF9pdGVtLm5vZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZC5zZXRQb3NpdGlvbih0aGlzLnNlbGVjdGVkX2l0ZW0ueCwgdGhpcy5zZWxlY3RlZF9pdGVtLnkpO1xyXG4gICAgICAgICAgICAvLyB0aGlzLnNlbGVjdGVkLnggPSB0aGlzLnNlbGVjdGVkX2l0ZW0ueDtcclxuICAgICAgICAgICAgLy8gdGhpcy5zZWxlY3RlZC55ID0gdGhpcy5zZWxlY3RlZF9pdGVtLnk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL+WBmuaYvuekuuWxnuaAp+WIh+aNolxyXG4gICAgICAgIHZhciBjb25maWcgPSB0aGlzLnNlbGVjdGVkX2l0ZW0uY29uZmlnO1xyXG4gICAgICAgIGlmIChjb25maWcpIHtcclxuICAgICAgICAgICAgdmFyIGF0dHJfa2V5ID0gbnVsbDtcclxuICAgICAgICAgICAgdmFyIGF0dHJfbmFtZSA9IG51bGw7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gY29uZmlnLmF0dHJfbGlzdCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHYgPSBjb25maWcuYXR0cl9saXN0W2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBBcnJheSAmJiB2Lmxlbmd0aCA+PSAyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNob3dfb2JqZWN0ID0gdGhpcy5zaW5nZV9hdHRfbGlzdFtOdW1iZXIoaSkgKyAxXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2hvd19vYmplY3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl9rZXkgPSB2WzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyX25hbWUgPSBnZGF0YShcImF0dHJfZGF0YVwiLCBcImRhdGFfa2V5X3RvX25hbWVcIiwgW2F0dHJfa2V5XSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyX25hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfb2JqZWN0LmF0dHJfdGl0bGUubm9kZS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19vYmplY3QuYXR0cl90aXRsZS5zdHJpbmcgPSBhdHRyX25hbWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/lpoLmnpzmmK/nmb7liIbmr5TmlbDlgLxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfb2JqZWN0LmF0dHJfdmFsdWUubm9kZS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19vYmplY3QuYXR0cl92YWx1ZS5zdHJpbmcgPSB2WzFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFBhcnRuZXJDYWxjdWxhdGUuaXNTaG93UGVyQnlTdHIoYXR0cl9rZXkpID09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X29iamVjdC5hdHRyX3ZhbHVlLnN0cmluZyA9IChcIitcIiArICh2WzFdICogMC4xKSArIFwiJVwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19vYmplY3QuYXR0cl92YWx1ZS5zdHJpbmcgPSAoXCIrXCIgKyB2WzFdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNldFVwZ3JhZGVDb3N0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvL+eCueS6rua2iOiAl1xyXG4gICAgc2V0VXBncmFkZUNvc3Q6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZF9pdGVtID09IG51bGwgfHwgdGhpcy5zZWxlY3RlZF9pdGVtLmNvbmZpZyA9PSBudWxsIHx8IHRoaXMuc2VsZWN0ZWRfaXRlbS5kYXRhID09IG51bGwpXHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIHZhciBjb25maWcgPSB0aGlzLnNlbGVjdGVkX2l0ZW0uY29uZmlnO1xyXG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5zZWxlY3RlZF9pdGVtLmRhdGE7XHJcbiAgICAgICAgaWYgKGNvbmZpZy5sZXYgPj0gMjAgJiYgZGF0YS5zdGF0dXMgPT0gR3VpbGRza2lsbENvbnN0LnN0YXR1cy5hY3Rpdml0eSkge1xyXG4gICAgICAgICAgICB0aGlzLmNvc3RfY29udGFpbmVyLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5tYXhfbGV2X2xhYmVsID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHNlbGYubWF4X2xldl9sYWJlbCA9IFV0aWxzLmNyZWF0ZUxhYmVsKDI4LCAxNzUsbnVsbCwzMzgsIDk2LCBVdGlscy5USTE4TihcIuivpeaKgOiDveW3sua7oee6pyFcIiksIHRoaXMubWFpbl9wYW5lbCwwLCBjYy52MigwLjUsMC41KSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLm1heF9sZXZfbGFiZWwuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmNvc3RfY29udGFpbmVyLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm1heF9sZXZfbGFiZWwpXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1heF9sZXZfbGFiZWwuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmIChjb25maWcubG9zcykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGJhc2VfY29zdCA9IHt9O1xyXG4gICAgICAgICAgICAgICAgdmFyIGl0ZW1fY29uZmlnID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnVwZ3JhZGVfY29zdF9saXN0ID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZ3JhZGVfY29zdF9saXN0ID0ge307XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZ3JhZGVfY29zdF9saXN0LmJhc2VfbGlzdCA9IHt9ICAgICAgIC8vIOWfuuehgOa2iOiAl1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGdyYWRlX2Nvc3RfbGlzdC5pdGVtX2xpc3QgPSB7fSAgICAgICAvLyDnianlk4FcclxuICAgICAgICAgICAgICAgIHRoaXMudXBncmFkZV9jb3N0X2xpc3QuYXNzZXRfbGlzdCA9IHt9ICAgICAgLy8g6LWE5Lqn54mp5ZOBICAgIFxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChiYXNlX2Nvc3QgJiYgYmFzZV9jb3N0WzBdICYmIGJhc2VfY29zdFsxXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1fY29uZmlnID0gVXRpbHMuZ2V0SXRlbUNvbmZpZyhiYXNlX2Nvc3RbMF0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtX2NvbmZpZykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFzc2V0X2tleSA9IGdkYXRhKFwiaXRlbV9kYXRhXCIsIFwiZGF0YV9hc3NldHNfaWQybGFiZWxcIiwgW2Jhc2VfY29zdFswXV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhc3NldF9rZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGdyYWRlX2Nvc3RfbGlzdC5iYXNlX2xpc3RbYXNzZXRfa2V5XSA9IHsgbmVlZF9udW06IGJhc2VfY29zdFsxXSwgY29uZGl0aW9uX3N0YXR1czogZmFsc2UsIGl0ZW06IHNlbGYuY29zdF9pdGVtX3ZhbHVlIH07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8v5Zug5Li656ys5LiA5Liq5bey57uP6KKr5o+Q5Ye65o6J5LqG77yM5omA5Lul6L+Z5LiN5YGa5aSE55CG5LqGXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMuYmFja3BhY2tfaXRlbV9saXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYWNrcGFja19pdGVtX2xpc3Rba10uc2V0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gMTtcclxuICAgICAgICAgICAgICAgIHZhciBfeCA9IDk0O1xyXG4gICAgICAgICAgICAgICAgdmFyIF95ID0gODA7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIGNvbmZpZy5sb3NzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBjb25maWcubG9zc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodlswXSE9IG51bGwgJiYgdlsxXSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiYWNrcGFja19pdGVtID0gdGhpcy5iYWNrcGFja19pdGVtX2xpc3RbaW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFja3BhY2tfaXRlbSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrcGFja19pdGVtID0gSXRlbXNQb29sLmdldEluc3RhbmNlKCkuZ2V0SXRlbShcImJhY2twYWNrX2l0ZW1cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrcGFja19pdGVtLmluaXRDb25maWcoZmFsc2UsIDEsIGZhbHNlLCBmYWxzZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2twYWNrX2l0ZW0uc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iYWNrcGFja19pdGVtX2xpc3RbaW5kZXhdID0gYmFja3BhY2tfaXRlbTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2twYWNrX2l0ZW0uc2V0UGFyZW50KHRoaXMuY29zdF9jb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ggPSAtMzAwICsgKGluZGV4IC0gMSkgKiAoQmFja1BhY2tJdGVtLldpZHRoICsgMjgpICsgQmFja1BhY2tJdGVtLldpZHRoICogMC41O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3BhY2tfaXRlbS5zZXRQb3NpdGlvbihfeCwgX3kpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3BhY2tfaXRlbS5zZXROdW1CZ1BvcyhjYy52MigwLCAtNzQpLCBjYy52MigwLjUsIDAuNSksIGNjLnYyKDAsIDApLCBjYy52MigwLjUsIDAuNSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2twYWNrX2l0ZW0uc2V0RGF0YSh7IGJpZDogdlswXSwgbnVtOiAwIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiYWNrcGFja19pdGVtLnNldFZpc2libGUodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaW5kZXggKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXNzZXRfa2V5ID0gZ2RhdGEoXCJpdGVtX2RhdGFcIiwgXCJkYXRhX2Fzc2V0c19pZDJsYWJlbFwiLCBbdlswXV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXNzZXRfa2V5ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBncmFkZV9jb3N0X2xpc3QuYXNzZXRfbGlzdFthc3NldF9rZXldID0geyBuZWVkX251bTogdlsxXSwgY29uZGl0aW9uX3N0YXR1czogZmFsc2UsIGl0ZW06IGJhY2twYWNrX2l0ZW0gfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBncmFkZV9jb3N0X2xpc3QuaXRlbV9saXN0W3ZbMF1dID0geyBuZWVkX251bTogdlsxXSwgY29uZGl0aW9uX3N0YXR1czogZmFsc2UsIGl0ZW06IGJhY2twYWNrX2l0ZW0gfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0VXBncmFkZUNvc3RTdGF0dXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLy/mm7TmlrDmtojogJfnirbmgIFcclxuICAgIC8vbnVsbOeahOivneWwseagh+ivhuWFqOmDqOWIpOaWre+8jDDmoIfor4bliKTmlq3ln7rnoYDvvIwx5qCH6K+G5Yik5pat5omp5bGV6LWE5Lqn77yMMuagh+ivhuWIpOaWreeJqeWTgVxyXG4gICAgc2V0VXBncmFkZUNvc3RTdGF0dXM6IGZ1bmN0aW9uICh0eXBlKSB7XHJcbiAgICAgICAgLy/ov5nph4zmmK/otYTkuqdcclxuICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMudXBncmFkZV9jb3N0X2xpc3QuYmFzZV9saXN0KSB7XHJcbiAgICAgICAgICAgIHZhciB2ID0gdGhpcy51cGdyYWRlX2Nvc3RfbGlzdC5iYXNlX2xpc3Rba107XHJcbiAgICAgICAgICAgIGlmICh2Lm5lZWRfbnVtICYmIHYuaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHN1bSA9IHRoaXMucm9sZV92b1trXSB8fCAwO1xyXG4gICAgICAgICAgICAgICAgaWYgKHN1bSA+PSB2Lm5lZWRfbnVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdi5jb25kaXRpb25fc3RhdHVzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB2Lml0ZW0uY29sb3IgPSBuZXcgY2MuQ29sb3IoMHg2OCwgMHg0NSwgMHgyYSwgMHhmZik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHYuY29uZGl0aW9uX3N0YXR1cyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHYuaXRlbS5jb2xvciA9IG5ldyBjYy5Db2xvcigweGQ5LCAweDUwLCAweDE0LCAweGZmKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHYuaXRlbS5zdHJpbmcgPSB2Lm5lZWRfbnVtO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL+i/memHjOaYr+aJqeWxlei1hOS6p1xyXG4gICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy51cGdyYWRlX2Nvc3RfbGlzdC5hc3NldF9saXN0KSB7XHJcbiAgICAgICAgICAgIHZhciB2ID0gdGhpcy51cGdyYWRlX2Nvc3RfbGlzdC5hc3NldF9saXN0W2tdO1xyXG4gICAgICAgICAgICBpZiAodi5pdGVtICYmIHYuaXRlbS5zZXROZWVkTnVtKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgc3VtID0gdGhpcy5yb2xlX3ZvW2tdIHx8IDA7XHJcbiAgICAgICAgICAgICAgICB2Lml0ZW0uc2V0TmVlZE51bSh2Lm5lZWRfbnVtLCBzdW0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHN1bSA8IHYubmVlZF9udW0pXHJcbiAgICAgICAgICAgICAgICAgICAgdi5jb25kaXRpb25fc3RhdHVzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgdi5jb25kaXRpb25fc3RhdHVzID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy/ov5nph4zmmK/pnIDmsYLpgZPlhbdcclxuICAgICAgICB0aGlzLmF1dG9fYnV5X2l0ZW1fcHJpY2UgPSAwO1xyXG4gICAgICAgIHRoaXMuYXV0b19idXlfaXRlbV9iaWQgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMudXBncmFkZV9jb3N0X2xpc3QuaXRlbV9saXN0KSB7XHJcbiAgICAgICAgICAgIHZhciBzdW0gPSBCYWNrcGFja0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldEJhY2tQYWNrSXRlbU51bUJ5QmlkKGspO1xyXG4gICAgICAgICAgICB2YXIgdiA9IHRoaXMudXBncmFkZV9jb3N0X2xpc3QuaXRlbV9saXN0W2tdO1xyXG4gICAgICAgICAgICBpZiAodi5pdGVtICYmIHYuaXRlbS5zZXROZWVkTnVtKSB7XHJcbiAgICAgICAgICAgICAgICB2Lml0ZW0uc2V0TmVlZE51bSh2Lm5lZWRfbnVtLCBzdW0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHN1bSA8IHYubmVlZF9udW0pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dG9fYnV5X2l0ZW1fcHJpY2UgPSB0aGlzLmF1dG9fYnV5X2l0ZW1fcHJpY2UgKyB0aGlzLmdldEl0ZW1QcmljZShrKSAqICh2Lm5lZWRfbnVtIC0gc3VtKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dG9fYnV5X2l0ZW1fYmlkID0gaztcclxuICAgICAgICAgICAgICAgICAgICB2LmNvbmRpdGlvbl9zdGF0dXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2LmNvbmRpdGlvbl9zdGF0dXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2hlY2tVcGdyYWRlQ29zdFN0YXR1cygpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvL+iOt+WPlueJqeWTgeS7t+agvFxyXG4gICAgZ2V0SXRlbVByaWNlOiBmdW5jdGlvbiAoYmlkKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSBpbiBDb25maWcuZXhjaGFuZ2VfZGF0YS5kYXRhX3Nob3BfZXhjaGFuZ2VfZ3VpbGQpIHtcclxuICAgICAgICAgICAgdmFyIHYgPSBDb25maWcuZXhjaGFuZ2VfZGF0YS5kYXRhX3Nob3BfZXhjaGFuZ2VfZ3VpbGRbaV07XHJcbiAgICAgICAgICAgIGlmICh2Lml0ZW1fYmlkID09IGJpZClcclxuICAgICAgICAgICAgICAgIHJldHVybiB2LnByaWNlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAwXHJcbiAgICB9LFxyXG5cclxuICAgIC8v6K6+572u5pu05paw54q25oCBXHJcbiAgICBjaGVja1VwZ3JhZGVDb3N0U3RhdHVzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudXBncmFkZV9jb3N0X2xpc3QgPT0gbnVsbClcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRfaXRlbSA9PSBudWxsIHx8IHRoaXMuc2VsZWN0ZWRfaXRlbS5jb25maWcgPT0gbnVsbClcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMuc2VsZWN0ZWRfaXRlbS5jb25maWc7XHJcbiAgICAgICAgdmFyIGNvbmRpdGlvbl9zdGF0dXMgPSB0cnVlO1xyXG4gICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy51cGdyYWRlX2Nvc3RfbGlzdCkge1xyXG4gICAgICAgICAgICB2YXIgbGlzdCA9IHRoaXMudXBncmFkZV9jb3N0X2xpc3Rba107XHJcbiAgICAgICAgICAgIGZvciAodmFyIG4gaW4gbGlzdCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBsaXN0W25dO1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0uY29uZGl0aW9uX3N0YXR1cyA9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbl9zdGF0dXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgY29uZGl0aW9uX3R5cGUgPSAwOyAgICAgLy8x77ya5raI6ICX5LiN6LazIDLvvJrmu6HotrMgM++8muadoeS7tuS4jei2s1xyXG4gICAgICAgIGlmICh0aGlzLnJvbGVfdm8uZ3VpbGRfbGV2ID49IGNvbmZpZy5ndWlsZF9sZXYpIHtcclxuICAgICAgICAgICAgaWYgKGNvbmRpdGlvbl9zdGF0dXMgPT0gZmFsc2UpXHJcbiAgICAgICAgICAgICAgICBjb25kaXRpb25fdHlwZSA9IDE7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIGNvbmRpdGlvbl90eXBlID0gMjtcclxuICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgY29uZGl0aW9uX3R5cGUgPSAzO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jb25kaXRpb25fdHlwZSAhPSBjb25kaXRpb25fdHlwZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbmRpdGlvbl90eXBlID0gY29uZGl0aW9uX3R5cGU7XHJcbiAgICAgICAgICAgIGlmIChjb25kaXRpb25fdHlwZSA9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmNoZWNrX2JveC5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uX3ZhbHVlLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgVXRpbHMuc2V0R3JleUJ1dHRvbih0aGlzLmhhbmRsZV9idG4pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVfYnRuX2xhYmVsX291dGxpbmUuZW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgVXRpbHMuc2V0R3JleUJ1dHRvbih0aGlzLmhhbmRsZV9idG4uZ2V0Q29tcG9uZW50KGNjLkJ1dHRvbikpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZV9idG5fbGFiZWwuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLmtojogJfkuI3otrNcIik7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZGl0aW9uX3R5cGUgPT0gMikge1xyXG4gICAgICAgICAgICAgICAgLy8gaWYgKHRoaXMuYXV0b19idXlfaXRlbV9wcmljZSA+IDApXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5jaGVja19ib3guYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIC8vIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmNoZWNrX2JveC5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uX3ZhbHVlLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgVXRpbHMuc2V0R3JleUJ1dHRvbih0aGlzLmhhbmRsZV9idG4sIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlX2J0bl9sYWJlbF9vdXRsaW5lLmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgVXRpbHMuc2V0R3JleUJ1dHRvbih0aGlzLmhhbmRsZV9idG4uZ2V0Q29tcG9uZW50KGNjLkJ1dHRvbiksZmFsc2UpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZV9idG5fbGFiZWxfb3V0bGluZS5jb2xvciA9IG5ldyBjYy5Db2xvcigweGM0LCAweDVhLCAweDE0LCAweGZmKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVfYnRuX2xhYmVsLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi54K55LquXCIpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmRpdGlvbl90eXBlID09IDMpIHtcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMuY2hlY2tfYm94LmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25kaXRpb25fdmFsdWUuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uX3ZhbHVlLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIumcgOimgeWFrOS8muWIsOi+viVz57qnXCIpLCBjb25maWcuZ3VpbGRfbGV2KVxyXG4gICAgICAgICAgICAgICAgVXRpbHMuc2V0R3JleUJ1dHRvbih0aGlzLmhhbmRsZV9idG4sIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVfYnRuX2xhYmVsX291dGxpbmUuZW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgVXRpbHMuc2V0R3JleUJ1dHRvbih0aGlzLmhhbmRsZV9idG4uZ2V0Q29tcG9uZW50KGNjLkJ1dHRvbikpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZV9idG5fbGFiZWwuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLmnaHku7bkuI3otrNcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy51cGRhdGVBdXRvQnV5SW5mbygpO1xyXG4gICAgfSxcclxuXHJcbiAgICB1cGRhdGVBdXRvQnV5SW5mbzogZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLy/nianlk4Hlop7liKDnmoTml7blgJnlpITnkIZcclxuICAgIGNoYW5nZU5lZWRJdGVtSW5mbzogZnVuY3Rpb24gKGxpc3QpIHtcclxuICAgICAgICBpZiAodGhpcy51cGdyYWRlX2Nvc3RfbGlzdCA9PSBudWxsIHx8IHRoaXMudXBncmFkZV9jb3N0X2xpc3QuaXRlbV9saXN0ID09IG51bGwpXHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIGlmIChsaXN0ID09IG51bGwgfHwgVXRpbHMubmV4dChsaXN0KSA9PSBudWxsKVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB2YXIgbGlzdF9kaWN0ID0ge307XHJcbiAgICAgICAgZm9yICh2YXIgaSBpbiBsaXN0KSB7XHJcbiAgICAgICAgICAgIHZhciB2byA9IGxpc3RbaV07XHJcbiAgICAgICAgICAgIGlmICh2by5iYXNlX2lkKVxyXG4gICAgICAgICAgICAgICAgbGlzdF9kaWN0W3ZvLmJhc2VfaWRdID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIG5lZWRfdXBkYXRlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5hdXRvX2J1eV9pdGVtX3ByaWNlID0gMDtcclxuICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMudXBncmFkZV9jb3N0X2xpc3QuaXRlbV9saXN0KSB7XHJcbiAgICAgICAgICAgIGlmIChsaXN0X2RpY3Rba10gPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgbmVlZF91cGRhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdmFyIHN1bSA9IEJhY2twYWNrQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0QmFja1BhY2tJdGVtTnVtQnlCaWQoayk7XHJcbiAgICAgICAgICAgICAgICBpZiAodi5pdGVtICYmIHYuaXRlbS5zZXROZWVkTnVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdi5pdGVtLnNldE5lZWROdW0odi5uZWVkX251bSwgc3VtKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3VtIDwgdi5uZWVkX251bSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dG9fYnV5X2l0ZW1fcHJpY2UgPSB0aGlzLmF1dG9fYnV5X2l0ZW1fcHJpY2UgKyB0aGlzLmdldEl0ZW1QcmljZShrKSAqICh2Lm5lZWRfbnVtIC0gc3VtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdi5jb25kaXRpb25fc3RhdHVzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2LmNvbmRpdGlvbl9zdGF0dXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmVlZF91cGRhdGUgPT0gdHJ1ZSlcclxuICAgICAgICAgICAgdGhpcy5jaGVja1VwZ3JhZGVDb3N0U3RhdHVzKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8v5qCH562+6aG15a+55bqU55qE5LyZ5Ly06IGM5Lia57G75Z6LXHJcbiAgICBnZXRUeXBlOiBmdW5jdGlvbiAoaW5kZXgpIHtcclxuICAgICAgICBpZiAoaW5kZXggPT0gMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gR3VpbGRza2lsbENvbnN0LmluZGV4LnBoeXNpY3M7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpbmRleCA9PSAyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBHdWlsZHNraWxsQ29uc3QuaW5kZXgubWFnaWM7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpbmRleCA9PSAzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBHdWlsZHNraWxsQ29uc3QuaW5kZXguZGVmZW5jZTtcclxuICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID09IDQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIEd1aWxkc2tpbGxDb25zdC5pbmRleC5hc3Npc3Q7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBjbG9zZUNhbGxCYWNrOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5jdHJsLm9wZW5HdWlsZFNraWxsTWFpbldpbmRvdyhmYWxzZSlcclxuICAgICAgICB0aGlzLmhhbmRsZVVwZ3JhZGVFZmZlY3QoZmFsc2UpXHJcbiAgICAgICAgdGhpcy5oYW5kbGVMZXZVcGdyYWRlRWZmZWN0KGZhbHNlKVxyXG5cclxuICAgICAgICAvLyBpZiAodGhpcy5zZWxlY3RlZCkge1xyXG4gICAgICAgIC8vICAgICB0aGlzLnNlbGVjdGVkLnN0b3BBbGxBY3Rpb25zKCk7XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5maWdodF9sYWJlbCkge1xyXG4gICAgICAgICAgICB0aGlzLmZpZ2h0X2xhYmVsLmRlbGV0ZU1lKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZmlnaHRfbGFiZWwgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmJhY2twYWNrX2l0ZW1fbGlzdCkge1xyXG4gICAgICAgICAgICB0aGlzLmJhY2twYWNrX2l0ZW1fbGlzdFtrXS5kZWxldGVNZSgpO1xyXG4gICAgICAgICAgICB0aGlzLmJhY2twYWNrX2l0ZW1fbGlzdFtrXSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYmFja3BhY2tfaXRlbV9saXN0ID0ge307XHJcblxyXG5cclxuICAgICAgICBpZiAodGhpcy5yb2xlX3ZvKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnVwZGF0ZV9yb2xlX2Fzc2V0c19ldmVudCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJvbGVfdm8udW5iaW5kKHRoaXMudXBkYXRlX3JvbGVfYXNzZXRzX2V2ZW50KTtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlX3JvbGVfYXNzZXRzX2V2ZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHdWlsZHNraWxsTWFpbldpbmRvdzsiXX0=
|