|
(function() {
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
var __module = nodeEnv ? module : {exports:{}};
|
var __filename = 'preview-scripts/assets/Scripts/mod/chat/view/chat_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, '2a3200cqCNP0qW8Gqo7Gtmb', 'chat_window');
|
// Scripts/mod/chat/view/chat_window.js
|
|
"use strict";
|
|
var ChatConst = require("chat_const");
|
|
var ChatEvent = require("chat_event");
|
|
var ChatItem = require("chat_item");
|
|
var ChatItemController = require("chat_item_controller");
|
|
var FRIEDN_CHAT_HEIGHT = 730;
|
var NORMAL_CHAT_HEIGHT = 860;
|
var ChatWindow = cc.Class({
|
"extends": BaseView,
|
properties: {
|
role_vo: null,
|
// 角色信息
|
channel: null,
|
// 当前频道
|
last_channel: null,
|
prefabPath: null,
|
chat_taps: {
|
"default": {}
|
},
|
cut_tap: null,
|
// 当前选中的标签
|
msgs_content: cc.Node,
|
chat_items: {
|
"default": {}
|
},
|
chat_items_cache: [],
|
is_update: false,
|
// 消息列表更新中
|
update_index: 0,
|
// 消息更新序号
|
chat_msgs: {
|
"default": {}
|
},
|
content_info: {
|
// 不同channel content高度
|
"default": {}
|
},
|
channel_tg: {
|
"default": {}
|
},
|
channel_red: {
|
"default": {}
|
},
|
private_targets: null,
|
chat_friends: {
|
"default": {}
|
},
|
cur_friend: null,
|
// 当前私聊对象
|
cur_friend_tap: null,
|
// 当前私聊对象标签页面
|
chat_items_index: "",
|
// 当前聊天索引
|
scroll_dis: 0
|
},
|
ctor: function ctor() {
|
this.prefabPath = require("pathtool").getPrefabPath("chat", "chat_window");
|
this.viewTag = SCENE_TAG.top;
|
|
var RoleController = require("role_controller");
|
|
this.role_vo = RoleController.getInstance().getRoleVo();
|
this.ctrl = require("chat_controller").getInstance();
|
this.model = this.ctrl.getModel();
|
|
if (!this.timer) {
|
this.timer = gcore.Timer.set(function () {
|
this.mainLoop();
|
}.bind(this), 100, -1);
|
}
|
|
this.chat_item_ctrl = ChatItemController.getInstance();
|
},
|
openCallBack: function openCallBack() {
|
this.msg_nd = this.seekChild("msg_rt");
|
this.msg_rt = this.seekChild("msg_rt", cc.RichText); // 半透区域
|
|
this.mask_node = this.seekChild("masknd");
|
this.mask_node.scale = FIT_SCALE;
|
var graphics_cp = this.mask_node.addComponent(cc.Graphics);
|
graphics_cp.clear();
|
graphics_cp.fillColor = cc.color(0, 0, 0, 128);
|
graphics_cp.rect(-this.root_wnd.width * 0.5, -this.root_wnd.height * 0.5, this.root_wnd.width, this.root_wnd.height);
|
graphics_cp.fill(); // 聊天区域
|
|
this.contern_bg_nd = this.seekChild("contern_bg");
|
this.scrollview_nd = this.seekChild("scrollview_mgs");
|
this.scrollview_mgs_sc = this.seekChild("scrollview_mgs", cc.ScrollView);
|
this.msgs_content = this.seekChild("content_msgs");
|
this.scrollview_nd.on("scrolling", this.contentScrolling.bind(this)); // enpty
|
|
this.empty_tips_nd = this.seekChild("empty_tips");
|
this.empty_desc_lb = this.seekChild("empty_desc", cc.Label); // 私聊区域
|
|
this.private_add_bg_nd = this.seekChild("private_add_bg");
|
this.private_add_nd = this.seekChild("private_add");
|
this.private_nd = this.seekChild("friends_sv");
|
this.private_contend = this.seekChild("friends_content");
|
this.private_add_nd.on(cc.Node.EventType.TOUCH_END, this.onClickAddPriBtn, this); // 聊天标签
|
|
for (var tab_index = 1; tab_index <= 6; tab_index++) {
|
var tab_nd = this.seekChild("toggle" + tab_index);
|
tab_nd.tag_1 = tab_index;
|
tab_nd.on('toggle', this.checkToggle, this);
|
tab_nd.on(cc.Node.EventType.TOUCH_END, this.didClickTap, this);
|
var tab_lb = this.seekChild("chat_tap_" + tab_index);
|
this.chat_taps["chat_tap_" + tab_index] = tab_lb;
|
var tab_tg = tab_nd.getComponent(cc.Toggle);
|
this.channel_tg[tab_index] = tab_tg;
|
var tab_red = tab_nd.getChildByName("red");
|
var tab_red_lb = tab_red.getChildByName("red_num").getComponent(cc.Label);
|
this.channel_red[tab_index] = {
|
red: tab_red,
|
num: tab_red_lb
|
};
|
}
|
|
this.notice_node = this.seekChild("notice_node");
|
this.notice_node.active = false;
|
this.notice_lab = this.seekChild("notice_label", cc.Label);
|
this.notice_lab.string = Utils.TI18N("该频道下无法发言"); //他人@我
|
|
this.at_notice_node = this.seekChild("at_notice");
|
this.at_close = this.at_notice_node.getChildByName("at_close"); // 输入区域
|
|
var ChatInput = require("chat_input");
|
|
var chat_input_panel = this.chat_input_panel = new ChatInput(this.ctrl);
|
chat_input_panel.setParent(this.root_wnd);
|
chat_input_panel.setSendCallback(this.didiClickSendMsg.bind(this));
|
chat_input_panel.show(); // var chat_input_nd = this.chat_input_panel = new ChatInput();
|
// this.root_wnd.addChild(chat_input_nd.root_wnd, 999);
|
|
var close_btn = this.seekChild("close_btn");
|
close_btn.on(cc.Node.EventType.TOUCH_END, function () {
|
this.ctrl.closeChatPanel();
|
}.bind(this));
|
this.mask_node.on(cc.Node.EventType.TOUCH_END, function () {
|
this.ctrl.closeChatPanel();
|
}.bind(this));
|
},
|
registerEvent: function registerEvent() {
|
var RoleEvent = require("role_event");
|
|
this.role_update_event = this.role_vo.bind(RoleEvent.ROLE_EVENT_ATTR_UPDATE, function (key, val) {
|
if (key == "lev" || key == "gid") this.updateWidget();
|
}.bind(this));
|
this.addGlobalEvent(ChatEvent.MassageUpdate, function (msgData) {
|
// 为频道增加一条最新消息
|
this.addMsgs(msgData, msgData.channel);
|
}.bind(this));
|
this.addGlobalEvent(ChatEvent.MassageDelete, function (msgData) {
|
// 为频道删除一条消息
|
this.deleteMsgs(msgData);
|
}.bind(this));
|
this.addGlobalEvent(ChatEvent.PrivateMassageUpdate, function (notice_info) {
|
// 为频道增加一条私聊最新消息
|
this.addMsgs(notice_info.msg_data, notice_info.channel);
|
}.bind(this));
|
this.addGlobalEvent(ChatEvent.PrivateMassageDelete, function (notice_info) {
|
// 为频道删除一条私聊消息
|
this.deleteMsgs(notice_info.msg_data, notice_info.channel);
|
}.bind(this));
|
this.addGlobalEvent(EventId.CHAT_NEWMSG_FLAG, function () {
|
this.setAllRedStatus();
|
}, this);
|
},
|
openRootWnd: function openRootWnd(params) {
|
var channel = ChatConst.Channel.World;
|
if (params && params.channel) channel = params.channel;
|
var channel_tag = this.getChannelTag(channel);
|
|
if (channel == ChatConst.Channel.Friend) {
|
this.cur_friend = params.friend_data;
|
}
|
|
this.changeChannel(channel_tag);
|
this.updateWidget();
|
this.setAllRedStatus();
|
},
|
closeCallBack: function closeCallBack() {
|
if (this.role_vo && this.role_update_event) {
|
this.role_vo.unbind(this.role_update_event);
|
this.role_update_event = null;
|
this.role_vo = null;
|
}
|
|
if (this.chat_input_panel) this.chat_input_panel.deleteMe();
|
if (this.timer) gcore.Timer.del(this.timer);
|
this.ctrl.closeChatPanel();
|
},
|
updateWidget: function updateWidget() {
|
// 设置个频道状态
|
for (var channel_i in ChatConst.ChannelTag) {
|
var channel_status = this.checkBtnIsOpen(channel_i);
|
this.setChannelStatus(channel_i, channel_status);
|
}
|
},
|
checkBtnIsOpen: function checkBtnIsOpen(channel) {
|
if (channel == 2) {
|
if (this.role_vo.lev < 50) return false;
|
} else if (channel == 4) {
|
if (!this.role_vo.gid) return false;
|
}
|
|
return true;
|
},
|
setChannelStatus: function setChannelStatus(index, status) {
|
var chat_tap_color = this.chat_taps["chat_tap_" + index].color;
|
|
if (status) {
|
chat_tap_color.fromHEX("#FFFFFF");
|
this.channel_tg[index].interactable = true;
|
} else {
|
chat_tap_color.fromHEX("#F5E0B9");
|
this.channel_tg[index].interactable = false;
|
}
|
},
|
getChannelTag: function getChannelTag(channel) {
|
var channel_tag = null,
|
channel_index = null;
|
|
for (var channel_i in ChatConst.Channel) {
|
if (ChatConst.Channel[channel_i] === channel) channel_index = channel_i;
|
}
|
|
if (channel_index) {
|
for (var tag_i in ChatConst.ChannelTag) {
|
if (ChatConst.ChannelTag[tag_i] == channel_index) channel_tag = tag_i;
|
}
|
}
|
|
return channel_tag;
|
},
|
didiClickSendMsg: function didiClickSendMsg(msg) {
|
if (msg.length > 0) {
|
if (this.channel === ChatConst.Channel.Friend) {
|
if (this.cur_friend) this.ctrl.sendMessage(this.channel, msg, 2, this.cur_friend.srv_id, this.cur_friend.rid, this.cur_friend.name);
|
} else {
|
this.ctrl.sendMessage(this.channel, msg, 2);
|
}
|
}
|
},
|
checkToggle: function checkToggle(event) {
|
var toggle_tag_1 = event.node.tag_1;
|
if (toggle_tag_1 == this.cur_select) return;
|
this.changeChannel(toggle_tag_1);
|
},
|
// 点击标签
|
didClickTap: function didClickTap(event) {
|
if (event.target.tag_1 == 2 && this.role_vo.lev < 50) {
|
message(Utils.TI18N(Lang.CHAT_CROSS_DES));
|
}
|
|
if (event.target.tag_1 == 4 && !this.role_vo.gid) {
|
message(Utils.TI18N(Lang.CHAT_Gang_DES));
|
}
|
|
this.setRedStatus(event.target.tag_1);
|
},
|
changeChannel: function changeChannel(channel_tag) {
|
this.setRedStatus(channel_tag);
|
var channel_index = ChatConst.ChannelTag[channel_tag];
|
this.last_chat_index = this.chat_items_index;
|
this.channel = ChatConst.Channel[channel_index];
|
this.chat_input_panel.setVisible(true);
|
|
if (this.channel == ChatConst.Channel.Event || this.channel == ChatConst.Channel.System) {
|
this.chat_input_panel.setVisible(false);
|
this.notice_node.active = true;
|
} else if (this.channel == ChatConst.Channel.Province) {
|
var province_config = Config.misc_data.data_const["province_level"];
|
|
if (!province_config || this.role_vo.lev < province_config.val) {
|
this.chat_input_panel.setVisible(false);
|
this.notice_node.active = false;
|
} else {
|
this.chat_input_panel.setVisible(true);
|
this.notice_node.active = false;
|
}
|
} else {
|
this.notice_node.active = false;
|
}
|
|
if (channel_tag === 1) {
|
if (this.role_vo && this.role_vo.lev < 35) {
|
this.empty_tips_nd.active = true;
|
this.empty_desc_lb.string = Utils.TI18N("角色35级可见该频道聊天内容");
|
this.chat_input_panel.setVisible(false);
|
} else {
|
this.empty_tips_nd.active = false;
|
this.chat_input_panel.setVisible(true);
|
}
|
}
|
|
if (this.cut_tap) {
|
var cur_select = this.chat_taps["chat_tap_" + this.cut_tap].color;
|
cur_select.fromHEX(Config.color_data.data_color16[141]);
|
this.chat_taps["chat_tap_" + this.cut_tap].color = cur_select;
|
}
|
|
this.channel_tg[channel_tag].isChecked = true;
|
this.channel_tg[channel_tag].check();
|
var new_select = this.chat_taps["chat_tap_" + channel_tag].color;
|
new_select.fromHEX(Config.color_data.data_color16[254]);
|
this.chat_taps["chat_tap_" + channel_tag].color = new_select;
|
this.cut_tap = channel_tag; // 更新记录切换时的高度和位置
|
|
this.updageChannelSizeInfo();
|
this.chat_items_index = this.channel;
|
|
if (this.channel == ChatConst.Channel.Friend) {
|
if (!this.private_targets) {
|
this.private_targets = [];
|
var h_private_targets = this.model.getPrivateTargets();
|
|
if (h_private_targets.length > 0) {
|
if (!this.cur_friend) this.cur_friend = h_private_targets[0];
|
|
for (var friend_i = 0; friend_i < h_private_targets.length; friend_i++) {
|
this.addPrivateTap(h_private_targets[friend_i]);
|
}
|
}
|
}
|
|
if (this.cur_friend) {
|
this.chat_items_index = this.cur_friend.srv_id + this.cur_friend.rid;
|
this.private_add_bg_nd.active = false;
|
} else {
|
this.private_add_bg_nd.active = true;
|
}
|
} else {
|
if (this.private_add_bg_nd.active) this.private_add_bg_nd.active = false;
|
} // 清楚频道未读消息
|
|
|
this.model.cleanUnredNum(this.channel); // 更新显示区域
|
|
this.updateMsgsContent();
|
var tempStr = Utils.TI18N("请输入信息"); // 同省、跨服、世界、公会可以@人
|
|
if (channel_tag == 1 || channel_tag == 2 || channel_tag == 3 || channel_tag == 4) {
|
var data = this.model.getAtData();
|
|
if (data && Utils.next(data)) {
|
this.showAtNotice(true, data);
|
}
|
|
tempStr = Utils.TI18N("请输入信息,长按头像可快捷@人");
|
}
|
|
this.chat_input_panel.setPlacholderLabel(tempStr);
|
this.chat_input_panel.setChannel(this.channel);
|
},
|
// 更新消息容器的高度和位置
|
updageChannelSizeInfo: function updageChannelSizeInfo(is_clean) {
|
if (!this.chat_items_index) return;
|
if (!this.content_info[this.chat_items_index]) this.content_info[this.chat_items_index] = {};
|
var c_pos = this.msgs_content.y;
|
var c_height = this.msgs_content.height;
|
|
if (is_clean) {
|
c_pos = 0;
|
c_height = 0;
|
}
|
|
this.content_info[this.chat_items_index].c_pos = c_pos;
|
this.content_info[this.chat_items_index].c_height = c_height;
|
},
|
mainLoop: function mainLoop() {
|
if (!this.is_update) return;
|
|
if (this.chat_items[this.chat_items_index] && this.update_index < this.chat_items[this.chat_items_index].length) {
|
this.chat_items[this.chat_items_index][this.update_index].updateContent();
|
this.update_index++;
|
} else {
|
this.update_index = 0;
|
this.is_update = false;
|
}
|
},
|
addMsgs: function addMsgs(msg_data, channel) {
|
if (!msg_data) return;
|
channel = channel ? channel : msg_data.channel;
|
var chat_items_index = channel;
|
|
if (channel === ChatConst.Channel.Friend) {
|
chat_items_index = msg_data.srv_id + msg_data.rid;
|
}
|
|
if (!this.chat_items[chat_items_index]) {
|
if (chat_items_index == this.chat_items_index) {
|
if (this.getVisible()) {
|
this.initItems(channel, chat_items_index);
|
}
|
}
|
} else {
|
var mes_item = this.addMsgItem(msg_data, channel);
|
|
if (chat_items_index == this.chat_items_index) {
|
// if ((this.msgs_content.height - mes_item.height) - (this.scrollview_nd.height + this.msgs_content.y) < 10) {
|
if (this.msgs_content.height > this.scrollview_nd.height) {
|
this.scrollview_mgs_sc.scrollToPercentVertical(0, 0.1, true);
|
} // }
|
|
}
|
}
|
|
this.setRedStatus(channel);
|
if (channel === this.channel && this.getVisible()) this.model.cleanUnredNum(channel);
|
},
|
deleteMsgs: function deleteMsgs(msg_data, channel) {
|
if (!msg_data) return;
|
channel = channel ? channel : msg_data.channel;
|
var chat_items_index = msg_data.channel;
|
if (channel === ChatConst.Channel.Friend) chat_items_index = msg_data.srv_id + msg_data.rid;
|
|
if (this.chat_msgs && this.chat_msgs[chat_items_index]) {
|
var this_msg = this.chat_msgs[chat_items_index].shift();
|
}
|
|
if (this.chat_items && this.chat_items[chat_items_index]) {
|
var chat_item = this.chat_items[chat_items_index].shift();
|
chat_item.updateContent(true);
|
|
if (this.content_info[chat_items_index]) {
|
this.content_info[chat_items_index].c_height -= chat_item.height;
|
this.content_info[chat_items_index].c_pos -= chat_item.height;
|
}
|
|
for (var chat_i in this.chat_items[chat_items_index]) {
|
this.chat_items[chat_items_index][chat_i].pos_y -= chat_item.height;
|
}
|
|
if (chat_items_index = this.chat_items_index) {
|
this.msgs_content.y -= chat_item.height;
|
this.updateMsgsContent();
|
}
|
}
|
|
this.setRedStatus(channel);
|
},
|
// 删除、初始化消息来创建chat_item, 更新区域
|
updateMsgsContent: function updateMsgsContent() {
|
// if (!this.chat_items_index) return;
|
// 初始化当前频道信息
|
if (this.chat_items_index && !this.chat_items[this.chat_items_index]) {
|
this.updageChannelSizeInfo(true);
|
this.initItems(this.channel, this.chat_items_index);
|
}
|
|
var content_pos = 0;
|
var content_height = 0;
|
|
if (this.chat_items_index && this.content_info[this.chat_items_index]) {
|
content_pos = this.content_info[this.chat_items_index].c_pos;
|
content_height = this.content_info[this.chat_items_index].c_height;
|
} else {// 更到最底端
|
// content_height =
|
}
|
|
if (this.channel == ChatConst.Channel.Friend) {
|
// && this.cur_friend) {
|
this.contern_bg_nd.height = FRIEDN_CHAT_HEIGHT;
|
} else {
|
this.contern_bg_nd.height = NORMAL_CHAT_HEIGHT;
|
}
|
|
this.msgs_content.y = content_pos;
|
this.msgs_content.height = content_height; // 清除上个上个频道信息
|
|
this.cleanConten(); // 更新当前频道信息条目
|
|
this.updageItems();
|
},
|
addMsgItem: function addMsgItem(msg_data, channel) {
|
channel = channel ? channel : msg_data.channel;
|
var items_index = channel;
|
var chat_base_height = 100;
|
|
if (channel === ChatConst.Channel.Friend) {
|
items_index = msg_data.srv_id + msg_data.rid;
|
}
|
|
var other_height = 0;
|
if (!this.content_info[items_index]) return;
|
|
if (channel === ChatConst.Channel.System) {
|
chat_base_height = 30;
|
other_height = 10;
|
} // 解析聊天字符串,增加表情和图片高度
|
// analyzeMessage
|
|
|
var test_msg = this.chat_item_ctrl.analyzeMessage(msg_data.msg);
|
this.msg_rt.string = test_msg;
|
var msg_height = this.msg_nd.height + chat_base_height; // this.content_info[this.chat_items_index].c_height
|
|
var content_height = 0;
|
if (this.content_info[items_index]) content_height = this.content_info[items_index].c_height;
|
var msg_item = new ChatItem(this, msg_data, msg_height, content_height, channel);
|
this.content_info[items_index].c_height += msg_height;
|
this.chat_msgs[items_index].push(msg_data);
|
this.chat_items[items_index].push(msg_item); // 此条后面需要优化
|
|
if (items_index == this.chat_items_index) {
|
this.msgs_content.height += msg_height + 10;
|
|
if (this.chat_items[this.chat_items_index].length > 0) {
|
this.empty_tips_nd.active = false;
|
} else {
|
if (this.cut_tap !== 1 || this.role_vo && this.role_vo.lev > 35) {
|
this.empty_tips_nd.active = true;
|
this.empty_desc_lb.string = Utils.TI18N("暂时没有人说话");
|
}
|
}
|
|
msg_item.updateContent();
|
}
|
|
return msg_item;
|
},
|
cleanConten: function cleanConten() {
|
if (!this.last_chat_index) return;
|
this.update_index = 0;
|
|
for (var chat_i in this.chat_items[this.last_chat_index]) {
|
this.chat_items[this.last_chat_index][chat_i].updateContent(true);
|
}
|
},
|
// 在此处更新content当前位置
|
contentScrolling: function contentScrolling(event) {
|
if (this.scroll_dis == 0) {
|
this.scroll_dis = event.content.y;
|
} else {
|
if (Math.abs(Math.abs(event.content.y) - Math.abs(this.scroll_dis)) > 40) {
|
this.updageItems();
|
this.scroll_dis = 0;
|
}
|
}
|
},
|
// 初始化某个channel的消息条目
|
initItems: function initItems(channel, item_index) {
|
if (!channel) return;
|
this.msgs_content.height = 0;
|
this.msgs_content.y = 0;
|
var items_index = item_index ? item_index : channel;
|
var msgs = [];
|
this.chat_msgs[items_index] = [];
|
this.chat_items[items_index] = [];
|
|
if (channel == ChatConst.Channel.Friend && item_index) {
|
if (this.cur_friend) {
|
msgs = this.model.getPrivateMsgs(this.cur_friend.srv_id, this.cur_friend.rid);
|
this.ctrl.sender12723(this.cur_friend.srv_id, this.cur_friend.rid);
|
}
|
} else {
|
msgs = this.model.getChannelMsgs(channel);
|
}
|
|
for (var msg_i = 0; msg_i < msgs.length; msg_i++) {
|
var chat_item = this.addMsgItem(msgs[msg_i], channel);
|
}
|
|
if (this.msgs_content.height > this.scrollview_nd.height) {
|
this.scrollview_mgs_sc.scrollToBottom(0.1);
|
}
|
|
this.is_update = true;
|
this.update_index = 0;
|
},
|
// 更新条目状态
|
updageItems: function updageItems() {
|
if (this.chat_items_index) {
|
if (this.chat_items[this.chat_items_index]) {
|
for (var item_index in this.chat_items[this.chat_items_index]) {
|
this.chat_items[this.chat_items_index][item_index].updateContent();
|
} // 更新到最新位置
|
|
|
if (this.chat_items[this.chat_items_index].length > 0) {
|
this.empty_tips_nd.active = false;
|
} else {
|
if (this.cut_tap !== 1 || this.role_vo && this.role_vo.lev > 35) {
|
this.empty_tips_nd.active = true;
|
this.empty_desc_lb.string = Utils.TI18N("暂时没有人说话");
|
}
|
}
|
}
|
}
|
},
|
getChatItemNd: function getChatItemNd() {
|
if (this.chat_items_cache.length > 0) {
|
return this.chat_items_cache.shift();
|
}
|
},
|
cacheChatItemNd: function cacheChatItemNd(item_nd) {
|
this.chat_items_cache.push(item_nd);
|
},
|
getContentPos: function getContentPos() {
|
return this.msgs_content.y;
|
},
|
addPrivateTap: function addPrivateTap(friend_vo) {
|
for (var friend_i = 0; friend_i < this.private_targets.length; friend_i++) {
|
if (this.private_targets[friend_i].srv_id === friend_vo.srv_id && this.private_targets[friend_i].rid === friend_vo.rid) {
|
return;
|
}
|
}
|
|
var ChatFriend = require("chat_friend");
|
|
var is_select = false;
|
if (this.cur_friend && this.cur_friend.srv_id === friend_vo.srv_id && this.cur_friend.rid == friend_vo.rid) is_select = true;
|
var chat_friend = new ChatFriend(friend_vo, this.private_contend, is_select);
|
chat_friend.setSelectCallback(this.selectPrivate.bind(this));
|
chat_friend.setDeleteCallBack(this.deletePrivate.bind(this));
|
this.private_targets.push(friend_vo);
|
this.chat_friends[friend_vo.srv_id + friend_vo.rid] = chat_friend;
|
if (is_select) this.cur_friend_tap = chat_friend;
|
},
|
selectPrivate: function selectPrivate(private_index, friend_vo) {
|
if (private_index && friend_vo && private_index !== this.chat_items_index) {
|
// 更新记录切换时的高度和位置
|
this.updageChannelSizeInfo();
|
if (this.cur_friend_tap) this.cur_friend_tap.cancelSelcet();
|
this.cur_friend_tap = this.chat_friends[friend_vo.srv_id + friend_vo.rid];
|
this.cur_friend_tap.setSelectStatus();
|
this.cur_friend = friend_vo;
|
this.last_chat_index = this.chat_items_index;
|
this.chat_items_index = private_index;
|
this.updateMsgsContent();
|
}
|
},
|
deletePrivate: function deletePrivate(private_index, friend_vo) {
|
if (private_index && friend_vo) {
|
for (var friend_i in this.private_targets) {
|
if (this.private_targets[friend_i].rid === friend_vo.rid) {
|
this.private_targets.splice(friend_i, 1);
|
}
|
}
|
|
if (this.private_targets.length > 0) {
|
var new_friend_vo = this.private_targets[0];
|
var private_index = new_friend_vo.srv_id + new_friend_vo.rid;
|
this.selectPrivate(private_index, new_friend_vo);
|
this.private_add_bg_nd.active = false;
|
} else {
|
this.last_chat_index = friend_vo.srv_id + friend_vo.rid;
|
this.chat_items_index = null;
|
this.updateMsgsContent();
|
this.cur_friend = null;
|
this.last_chat_index = null;
|
this.private_add_bg_nd.active = true;
|
}
|
|
delete this.chat_friends[friend_vo.srv_id + friend_vo.rid];
|
this.model.deltePrivateTarget(friend_vo);
|
}
|
},
|
onClickAddPriBtn: function onClickAddPriBtn() {
|
this.ctrl.closeChatPanel();
|
|
var FriendController = require("friend_controller");
|
|
FriendController.getInstance().openFriendWindow(true);
|
},
|
//标签页红点处理
|
setRedStatus: function setRedStatus(channel) {
|
if (channel == null) return;
|
if (this.channel_red == null) return;
|
if (this.channel_red[channel] == null) return;
|
|
if (channel == 2 && this.role_vo && this.role_vo.lev < 50 || channel == 4 && this.role_vo && !this.role_vo.gid) {
|
return;
|
}
|
|
var btn = this.channel_red[channel];
|
var num = this.model.getUnreadNum(ChatConst.Channel[ChatConst.ChannelTag[channel]]);
|
|
if (num > 0) {
|
btn.red.active = true;
|
btn.num.string = num;
|
} else {
|
btn.red.active = false;
|
}
|
},
|
//所有标签页红点处理
|
setAllRedStatus: function setAllRedStatus() {
|
for (var i = 1; i <= 6; i++) {
|
this.setRedStatus(i);
|
}
|
},
|
showAtNotice: function showAtNotice(status, data) {
|
if (this.root_wnd == null) return;
|
this.at_close.targetOff(this);
|
|
var close_callback = function () {
|
this.at_notice_node.active = false;
|
this.model.setAtData({});
|
|
if (data && Utils.next(data)) {
|
this.ctrl.sender12768(data.rid, data.srv_id, data.channel, data.msg);
|
}
|
}.bind(this);
|
|
Utils.onTouchEnd(this.at_close, function () {
|
close_callback();
|
}.bind(this), 1);
|
var item = null;
|
|
if (data && Utils.next(data) != null) {
|
var id = this.ctrl.getId(this.channel, data.srv_id, data.rid, data.name, data.msg);
|
var scroll = this.chat_items[this.channel];
|
|
if (scroll) {
|
var isHave = false;
|
|
for (var i = 0, l = scroll.length; i < l; i++) {
|
if (scroll[i].getId() == id) {
|
item = scroll[i];
|
this.at_notice_node.active = status;
|
isHave = true;
|
break;
|
}
|
}
|
|
if (isHave == false) {
|
this.at_notice_node.active = false;
|
}
|
} else {
|
this.at_notice_node.active = false;
|
}
|
} else {
|
this.at_notice_node.active = false;
|
}
|
|
Utils.onTouchEnd(this.at_notice_node, function (item) {
|
if (item) {
|
var precent = (this.msgs_content.height - item.pos_y - item.height) / this.msgs_content.height;
|
|
if (precent > 1) {
|
precent = 1;
|
}
|
|
this.scrollview_mgs_sc.scrollToPercentVertical(precent, 0.1, true);
|
close_callback();
|
}
|
}.bind(this, item), 1);
|
},
|
setVisible: function setVisible(status, params) {
|
if (this.active_status == status) {
|
return;
|
}
|
|
this.active_status = status;
|
|
if (this.root_wnd) {
|
this.root_wnd.active = status;
|
} else {
|
this.fastShowThenHide = status;
|
}
|
|
if (status == true) {
|
this.openRootWnd(params);
|
} else {
|
if (this.chat_friends) {
|
for (var i in this.chat_friends) {
|
var v = this.chat_friends[i];
|
|
if (v && v.deleteMe) {
|
v.deleteMe();
|
v = null;
|
}
|
}
|
|
this.chat_friends = {};
|
this.private_targets = null;
|
}
|
}
|
}
|
});
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxjaGF0XFx2aWV3XFxjaGF0X3dpbmRvdy5qcyJdLCJuYW1lcyI6WyJDaGF0Q29uc3QiLCJyZXF1aXJlIiwiQ2hhdEV2ZW50IiwiQ2hhdEl0ZW0iLCJDaGF0SXRlbUNvbnRyb2xsZXIiLCJGUklFRE5fQ0hBVF9IRUlHSFQiLCJOT1JNQUxfQ0hBVF9IRUlHSFQiLCJDaGF0V2luZG93IiwiY2MiLCJDbGFzcyIsIkJhc2VWaWV3IiwicHJvcGVydGllcyIsInJvbGVfdm8iLCJjaGFubmVsIiwibGFzdF9jaGFubmVsIiwicHJlZmFiUGF0aCIsImNoYXRfdGFwcyIsImN1dF90YXAiLCJtc2dzX2NvbnRlbnQiLCJOb2RlIiwiY2hhdF9pdGVtcyIsImNoYXRfaXRlbXNfY2FjaGUiLCJpc191cGRhdGUiLCJ1cGRhdGVfaW5kZXgiLCJjaGF0X21zZ3MiLCJjb250ZW50X2luZm8iLCJjaGFubmVsX3RnIiwiY2hhbm5lbF9yZWQiLCJwcml2YXRlX3RhcmdldHMiLCJjaGF0X2ZyaWVuZHMiLCJjdXJfZnJpZW5kIiwiY3VyX2ZyaWVuZF90YXAiLCJjaGF0X2l0ZW1zX2luZGV4Iiwic2Nyb2xsX2RpcyIsImN0b3IiLCJnZXRQcmVmYWJQYXRoIiwidmlld1RhZyIsIlNDRU5FX1RBRyIsInRvcCIsIlJvbGVDb250cm9sbGVyIiwiZ2V0SW5zdGFuY2UiLCJnZXRSb2xlVm8iLCJjdHJsIiwibW9kZWwiLCJnZXRNb2RlbCIsInRpbWVyIiwiZ2NvcmUiLCJUaW1lciIsInNldCIsIm1haW5Mb29wIiwiYmluZCIsImNoYXRfaXRlbV9jdHJsIiwib3BlbkNhbGxCYWNrIiwibXNnX25kIiwic2Vla0NoaWxkIiwibXNnX3J0IiwiUmljaFRleHQiLCJtYXNrX25vZGUiLCJzY2FsZSIsIkZJVF9TQ0FMRSIsImdyYXBoaWNzX2NwIiwiYWRkQ29tcG9uZW50IiwiR3JhcGhpY3MiLCJjbGVhciIsImZpbGxDb2xvciIsImNvbG9yIiwicmVjdCIsInJvb3Rfd25kIiwid2lkdGgiLCJoZWlnaHQiLCJmaWxsIiwiY29udGVybl9iZ19uZCIsInNjcm9sbHZpZXdfbmQiLCJzY3JvbGx2aWV3X21nc19zYyIsIlNjcm9sbFZpZXciLCJvbiIsImNvbnRlbnRTY3JvbGxpbmciLCJlbXB0eV90aXBzX25kIiwiZW1wdHlfZGVzY19sYiIsIkxhYmVsIiwicHJpdmF0ZV9hZGRfYmdfbmQiLCJwcml2YXRlX2FkZF9uZCIsInByaXZhdGVfbmQiLCJwcml2YXRlX2NvbnRlbmQiLCJFdmVudFR5cGUiLCJUT1VDSF9FTkQiLCJvbkNsaWNrQWRkUHJpQnRuIiwidGFiX2luZGV4IiwidGFiX25kIiwidGFnXzEiLCJjaGVja1RvZ2dsZSIsImRpZENsaWNrVGFwIiwidGFiX2xiIiwidGFiX3RnIiwiZ2V0Q29tcG9uZW50IiwiVG9nZ2xlIiwidGFiX3JlZCIsImdldENoaWxkQnlOYW1lIiwidGFiX3JlZF9sYiIsInJlZCIsIm51bSIsIm5vdGljZV9ub2RlIiwiYWN0aXZlIiwibm90aWNlX2xhYiIsInN0cmluZyIsIlV0aWxzIiwiVEkxOE4iLCJhdF9ub3RpY2Vfbm9kZSIsImF0X2Nsb3NlIiwiQ2hhdElucHV0IiwiY2hhdF9pbnB1dF9wYW5lbCIsInNldFBhcmVudCIsInNldFNlbmRDYWxsYmFjayIsImRpZGlDbGlja1NlbmRNc2ciLCJzaG93IiwiY2xvc2VfYnRuIiwiY2xvc2VDaGF0UGFuZWwiLCJyZWdpc3RlckV2ZW50IiwiUm9sZUV2ZW50Iiwicm9sZV91cGRhdGVfZXZlbnQiLCJST0xFX0VWRU5UX0FUVFJfVVBEQVRFIiwia2V5IiwidmFsIiwidXBkYXRlV2lkZ2V0IiwiYWRkR2xvYmFsRXZlbnQiLCJNYXNzYWdlVXBkYXRlIiwibXNnRGF0YSIsImFkZE1zZ3MiLCJNYXNzYWdlRGVsZXRlIiwiZGVsZXRlTXNncyIsIlByaXZhdGVNYXNzYWdlVXBkYXRlIiwibm90aWNlX2luZm8iLCJtc2dfZGF0YSIsIlByaXZhdGVNYXNzYWdlRGVsZXRlIiwiRXZlbnRJZCIsIkNIQVRfTkVXTVNHX0ZMQUciLCJzZXRBbGxSZWRTdGF0dXMiLCJvcGVuUm9vdFduZCIsInBhcmFtcyIsIkNoYW5uZWwiLCJXb3JsZCIsImNoYW5uZWxfdGFnIiwiZ2V0Q2hhbm5lbFRhZyIsIkZyaWVuZCIsImZyaWVuZF9kYXRhIiwiY2hhbmdlQ2hhbm5lbCIsImNsb3NlQ2FsbEJhY2siLCJ1bmJpbmQiLCJkZWxldGVNZSIsImRlbCIsImNoYW5uZWxfaSIsIkNoYW5uZWxUYWciLCJjaGFubmVsX3N0YXR1cyIsImNoZWNrQnRuSXNPcGVuIiwic2V0Q2hhbm5lbFN0YXR1cyIsImxldiIsImdpZCIsImluZGV4Iiwic3RhdHVzIiwiY2hhdF90YXBfY29sb3IiLCJmcm9tSEVYIiwiaW50ZXJhY3RhYmxlIiwiY2hhbm5lbF9pbmRleCIsInRhZ19pIiwibXNnIiwibGVuZ3RoIiwic2VuZE1lc3NhZ2UiLCJzcnZfaWQiLCJyaWQiLCJuYW1lIiwiZXZlbnQiLCJ0b2dnbGVfdGFnXzEiLCJub2RlIiwiY3VyX3NlbGVjdCIsInRhcmdldCIsIm1lc3NhZ2UiLCJMYW5nIiwiQ0hBVF9DUk9TU19ERVMiLCJDSEFUX0dhbmdfREVTIiwic2V0UmVkU3RhdHVzIiwibGFzdF9jaGF0X2luZGV4Iiwic2V0VmlzaWJsZSIsIkV2ZW50IiwiU3lzdGVtIiwiUHJvdmluY2UiLCJwcm92aW5jZV9jb25maWciLCJDb25maWciLCJtaXNjX2RhdGEiLCJkYXRhX2NvbnN0IiwiY29sb3JfZGF0YSIsImRhdGFfY29sb3IxNiIsImlzQ2hlY2tlZCIsImNoZWNrIiwibmV3X3NlbGVjdCIsInVwZGFnZUNoYW5uZWxTaXplSW5mbyIsImhfcHJpdmF0ZV90YXJnZXRzIiwiZ2V0UHJpdmF0ZVRhcmdldHMiLCJmcmllbmRfaSIsImFkZFByaXZhdGVUYXAiLCJjbGVhblVucmVkTnVtIiwidXBkYXRlTXNnc0NvbnRlbnQiLCJ0ZW1wU3RyIiwiZGF0YSIsImdldEF0RGF0YSIsIm5leHQiLCJzaG93QXROb3RpY2UiLCJzZXRQbGFjaG9sZGVyTGFiZWwiLCJzZXRDaGFubmVsIiwiaXNfY2xlYW4iLCJjX3BvcyIsInkiLCJjX2hlaWdodCIsInVwZGF0ZUNvbnRlbnQiLCJnZXRWaXNpYmxlIiwiaW5pdEl0ZW1zIiwibWVzX2l0ZW0iLCJhZGRNc2dJdGVtIiwic2Nyb2xsVG9QZXJjZW50VmVydGljYWwiLCJ0aGlzX21zZyIsInNoaWZ0IiwiY2hhdF9pdGVtIiwiY2hhdF9pIiwicG9zX3kiLCJjb250ZW50X3BvcyIsImNvbnRlbnRfaGVpZ2h0IiwiY2xlYW5Db250ZW4iLCJ1cGRhZ2VJdGVtcyIsIml0ZW1zX2luZGV4IiwiY2hhdF9iYXNlX2hlaWdodCIsIm90aGVyX2hlaWdodCIsInRlc3RfbXNnIiwiYW5hbHl6ZU1lc3NhZ2UiLCJtc2dfaGVpZ2h0IiwibXNnX2l0ZW0iLCJwdXNoIiwiY29udGVudCIsIk1hdGgiLCJhYnMiLCJpdGVtX2luZGV4IiwibXNncyIsImdldFByaXZhdGVNc2dzIiwic2VuZGVyMTI3MjMiLCJnZXRDaGFubmVsTXNncyIsIm1zZ19pIiwic2Nyb2xsVG9Cb3R0b20iLCJnZXRDaGF0SXRlbU5kIiwiY2FjaGVDaGF0SXRlbU5kIiwiaXRlbV9uZCIsImdldENvbnRlbnRQb3MiLCJmcmllbmRfdm8iLCJDaGF0RnJpZW5kIiwiaXNfc2VsZWN0IiwiY2hhdF9mcmllbmQiLCJzZXRTZWxlY3RDYWxsYmFjayIsInNlbGVjdFByaXZhdGUiLCJzZXREZWxldGVDYWxsQmFjayIsImRlbGV0ZVByaXZhdGUiLCJwcml2YXRlX2luZGV4IiwiY2FuY2VsU2VsY2V0Iiwic2V0U2VsZWN0U3RhdHVzIiwic3BsaWNlIiwibmV3X2ZyaWVuZF92byIsImRlbHRlUHJpdmF0ZVRhcmdldCIsIkZyaWVuZENvbnRyb2xsZXIiLCJvcGVuRnJpZW5kV2luZG93IiwiYnRuIiwiZ2V0VW5yZWFkTnVtIiwiaSIsInRhcmdldE9mZiIsImNsb3NlX2NhbGxiYWNrIiwic2V0QXREYXRhIiwic2VuZGVyMTI3NjgiLCJvblRvdWNoRW5kIiwiaXRlbSIsImlkIiwiZ2V0SWQiLCJzY3JvbGwiLCJpc0hhdmUi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QUlBLENBQUMsQ0FBQ3RJLFFBQVYsRUFBbUI7QUFDbEJzSSxZQUFBQSxDQUFDLENBQUN0SSxRQUFGO0FBQ0FzSSxZQUFBQSxDQUFDLEdBQUcsSUFBSjtBQUNBO0FBQ0Q7O0FBQ0QsYUFBSzdQLFlBQUwsR0FBb0IsRUFBcEI7QUFDQSxhQUFLRCxlQUFMLEdBQXVCLElBQXZCO0FBQ0E7QUFDRDtBQUNFO0FBcHlCcUIsQ0FBVCxDQUFqQiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsidmFyIENoYXRDb25zdCAgICAgICAgICA9IHJlcXVpcmUoXCJjaGF0X2NvbnN0XCIpO1xyXG52YXIgQ2hhdEV2ZW50ICAgICAgICAgID0gcmVxdWlyZShcImNoYXRfZXZlbnRcIik7XHJcbnZhciBDaGF0SXRlbSAgICAgICAgICAgPSByZXF1aXJlKFwiY2hhdF9pdGVtXCIpO1xyXG52YXIgQ2hhdEl0ZW1Db250cm9sbGVyID0gcmVxdWlyZShcImNoYXRfaXRlbV9jb250cm9sbGVyXCIpO1xyXG5cclxudmFyIEZSSUVETl9DSEFUX0hFSUdIVCA9IDczMDtcclxudmFyIE5PUk1BTF9DSEFUX0hFSUdIVCA9IDg2MDtcclxuXHJcbnZhciBDaGF0V2luZG93ID0gY2MuQ2xhc3Moe1xyXG5cdGV4dGVuZHM6IEJhc2VWaWV3LFxyXG5cclxuXHRwcm9wZXJ0aWVzOntcclxuXHRcdHJvbGVfdm86IG51bGwsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDop5LoibLkv6Hmga9cclxuXHRcdGNoYW5uZWw6IG51bGwsICAgICAgICAgICAgICAgICAgICAvLyDlvZPliY3popHpgZNcclxuXHRcdGxhc3RfY2hhbm5lbDogbnVsbCxcclxuXHRcdHByZWZhYlBhdGg6IG51bGwsXHJcblx0XHRjaGF0X3RhcHM6IHtcclxuXHRcdFx0ZGVmYXVsdDoge31cclxuXHRcdH0sXHJcblx0XHRjdXRfdGFwOiBudWxsLCAgICAgICAgICAgICAgICAgICAgLy8g5b2T5YmN6YCJ5Lit55qE5qCH562+XHJcblx0XHRtc2dzX2NvbnRlbnQ6IGNjLk5vZGUsXHJcblx0XHRjaGF0X2l0ZW1zOiB7XHJcblx0XHRcdGRlZmF1bHQ6IHt9XHJcblx0XHR9LFxyXG5cdFx0Y2hhdF9pdGVtc19jYWNoZTogW10sXHJcblx0XHRpc191cGRhdGU6IGZhbHNlLCAgICAgICAgICAgICAgICAgLy8g5raI5oGv5YiX6KGo5pu05paw5LitXHJcblx0XHR1cGRhdGVfaW5kZXg6IDAsICAgICAgICAgICAgICAgICAgLy8g5raI5oGv5pu05paw5bqP5Y+3XHJcblx0XHRjaGF0X21zZ3M6IHtcclxuXHRcdFx0ZGVmYXVsdDoge31cclxuXHRcdH0sXHJcblx0XHRjb250ZW50X2luZm86IHsgICAgICAgICAgICAgICAgICAgLy8g5LiN5ZCMY2hhbm5lbCBjb250ZW506auY5bqmXHJcblx0XHRcdGRlZmF1bHQ6IHt9XHJcblx0XHR9LFxyXG5cdFx0Y2hhbm5lbF90Zzoge1xyXG5cdFx0XHRkZWZhdWx0OiB7fSxcclxuXHRcdH0sXHJcblx0XHRjaGFubmVsX3JlZDoge1xyXG5cdFx0XHRkZWZhdWx0OiB7fSxcclxuXHRcdH0sXHJcblx0XHRwcml2YXRlX3RhcmdldHM6IG51bGwsXHJcblx0XHRjaGF0X2ZyaWVuZHM6IHtcclxuXHRcdFx0ZGVmYXVsdDoge31cclxuXHRcdH0sXHJcblx0XHRjdXJfZnJpZW5kOiBudWxsLCAgICAgICAgICAgICAgICAgLy8g5b2T5YmN56eB6IGK5a+56LGhXHJcblx0XHRjdXJfZnJpZW5kX3RhcDogbnVsbCwgICAgICAgICAgICAgLy8g5b2T5YmN56eB6IGK5a+56LGh5qCH562+6aG16Z2iXHJcblx0XHRjaGF0X2l0ZW1zX2luZGV4OiBcIlwiLCAgICAgICAgICAgICAvLyDlvZPliY3ogYrlpKnntKLlvJVcclxuXHRcdHNjcm9sbF9kaXM6IDAsXHJcblx0fSxcclxuXHJcblx0Y3RvcjogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgdGhpcy5wcmVmYWJQYXRoID0gcmVxdWlyZShcInBhdGh0b29sXCIpLmdldFByZWZhYlBhdGgoXCJjaGF0XCIsIFwiY2hhdF93aW5kb3dcIik7XHJcbiAgICAgICAgdGhpcy52aWV3VGFnID0gU0NFTkVfVEFHLnRvcDtcclxuXHJcbiAgICAgICAgdmFyIFJvbGVDb250cm9sbGVyID0gcmVxdWlyZShcInJvbGVfY29udHJvbGxlclwiKVxyXG4gICAgICAgIHRoaXMucm9sZV92byA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XHJcblxyXG4gICAgICAgIHRoaXMuY3RybCA9IHJlcXVpcmUoXCJjaGF0X2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKTtcclxuICAgICAgICB0aGlzLm1vZGVsID0gdGhpcy5jdHJsLmdldE1vZGVsKCk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy50aW1lcil7XHJcbiAgICAgICAgICAgIHRoaXMudGltZXIgPSBnY29yZS5UaW1lci5zZXQoKGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1haW5Mb29wKCk7XHJcbiAgICAgICAgICAgIH0pLmJpbmQodGhpcyksIDEwMCwgLTEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jaGF0X2l0ZW1fY3RybCA9IENoYXRJdGVtQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpO1xyXG5cdH0sXHJcblxyXG5cdG9wZW5DYWxsQmFjazogZnVuY3Rpb24oKSB7XHJcblx0XHR0aGlzLm1zZ19uZCA9IHRoaXMuc2Vla0NoaWxkKFwibXNnX3J0XCIpO1xyXG5cdFx0dGhpcy5tc2dfcnQgPSB0aGlzLnNlZWtDaGlsZChcIm1zZ19ydFwiLCBjYy5SaWNoVGV4dClcclxuXHJcblx0XHQvLyDljYrpgI/ljLrln59cclxuXHRcdHRoaXMubWFza19ub2RlID0gdGhpcy5zZWVrQ2hpbGQoXCJtYXNrbmRcIik7XHJcbiAgICAgICAgdGhpcy5tYXNrX25vZGUuc2NhbGUgPSBGSVRfU0NBTEU7XHJcblx0XHR2YXIgZ3JhcGhpY3NfY3AgPSB0aGlzLm1hc2tfbm9kZS5hZGRDb21wb25lbnQoY2MuR3JhcGhpY3MpO1xyXG4gICAgICAgIGdyYXBoaWNzX2NwLmNsZWFyKCk7XHJcbiAgICAgICAgZ3JhcGhpY3NfY3AuZmlsbENvbG9yID0gY2MuY29sb3IoMCwgMCwgMCwgMTI4KTtcclxuICAgICAgICBncmFwaGljc19jcC5yZWN0KC10aGlzLnJvb3Rfd25kLndpZHRoICogMC41LCAgLXRoaXMucm9vdF93bmQuaGVpZ2h0ICogMC41LCB0aGlzLnJvb3Rfd25kLndpZHRoLCB0aGlzLnJvb3Rfd25kLmhlaWdodCk7XHJcbiAgICAgICAgZ3JhcGhpY3NfY3AuZmlsbCgpO1xyXG5cclxuICAgICAgICAvLyDogYrlpKnljLrln59cclxuXHRcdHRoaXMuY29udGVybl9iZ19uZCAgICAgPSB0aGlzLnNlZWtDaGlsZChcImNvbnRlcm5fYmdcIik7XHJcblx0XHR0aGlzLnNjcm9sbHZpZXdfbmQgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJzY3JvbGx2aWV3X21nc1wiKTtcclxuXHRcdHRoaXMuc2Nyb2xsdmlld19tZ3Nfc2MgPSB0aGlzLnNlZWtDaGlsZChcInNjcm9sbHZpZXdfbWdzXCIsIGNjLlNjcm9sbFZpZXcpXHJcblx0XHR0aGlzLm1zZ3NfY29udGVudCAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJjb250ZW50X21zZ3NcIik7XHJcbiAgICAgICAgdGhpcy5zY3JvbGx2aWV3X25kLm9uKFwic2Nyb2xsaW5nXCIsIHRoaXMuY29udGVudFNjcm9sbGluZy5iaW5kKHRoaXMpKVxyXG5cclxuICAgICAgICAvLyBlbnB0eVxyXG4gICAgICAgIHRoaXMuZW1wdHlfdGlwc19uZCAgICAgPSB0aGlzLnNlZWtDaGlsZChcImVtcHR5X3RpcHNcIik7XHJcbiAgICAgICAgdGhpcy5lbXB0eV9kZXNjX2xiICAgICA9IHRoaXMuc2Vla0NoaWxkKFwiZW1wdHlfZGVzY1wiLCBjYy5MYWJlbCk7XHJcblxyXG4gICAgICAgIC8vIOengeiBiuWMuuWfn1xyXG5cdFx0dGhpcy5wcml2YXRlX2FkZF9iZ19uZCA9IHRoaXMuc2Vla0NoaWxkKFwicHJpdmF0ZV9hZGRfYmdcIik7XHJcblx0XHR0aGlzLnByaXZhdGVfYWRkX25kICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJwcml2YXRlX2FkZFwiKTtcclxuXHRcdHRoaXMucHJpdmF0ZV9uZCAgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcImZyaWVuZHNfc3ZcIik7XHJcblx0XHR0aGlzLnByaXZhdGVfY29udGVuZCAgID0gdGhpcy5zZWVrQ2hpbGQoXCJmcmllbmRzX2NvbnRlbnRcIik7XHJcblx0XHR0aGlzLnByaXZhdGVfYWRkX25kLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgdGhpcy5vbkNsaWNrQWRkUHJpQnRuLCB0aGlzKTtcclxuXHJcbiAgICAgICAgLy8g6IGK5aSp5qCH562+XHJcbiAgICAgICAgZm9yICh2YXIgdGFiX2luZGV4ID0gMTsgdGFiX2luZGV4IDw9IDY7IHRhYl9pbmRleCsrKSB7XHJcbiAgICAgICAgXHR2YXIgdGFiX25kID0gdGhpcy5zZWVrQ2hpbGQoXCJ0b2dnbGVcIiArIHRhYl9pbmRleCk7XHJcbiAgICAgICAgXHR0YWJfbmQudGFnXzEgPSB0YWJfaW5kZXg7XHJcbiAgICAgICAgXHR0YWJfbmQub24oJ3RvZ2dsZScsIHRoaXMuY2hlY2tUb2dnbGUsIHRoaXMpO1xyXG4gICAgICAgIFx0dGFiX25kLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgdGhpcy5kaWRDbGlja1RhcCwgdGhpcyk7XHJcbiAgICAgICAgXHR2YXIgdGFiX2xiID0gdGhpcy5zZWVrQ2hpbGQoXCJjaGF0X3RhcF9cIiArIHRhYl9pbmRleCk7XHJcbiAgICAgICAgXHR0aGlzLmNoYXRfdGFwc1tcImNoYXRfdGFwX1wiICsgdGFiX2luZGV4XSA9IHRhYl9sYjtcclxuXHJcbiAgICAgICAgXHR2YXIgdGFiX3RnID0gdGFiX25kLmdldENvbXBvbmVudChjYy5Ub2dnbGUpO1xyXG5cdFx0XHR0aGlzLmNoYW5uZWxfdGdbdGFiX2luZGV4XSA9IHRhYl90ZztcclxuXHRcdFx0XHJcblx0XHRcdHZhciB0YWJfcmVkID0gdGFiX25kLmdldENoaWxkQnlOYW1lKFwicmVkXCIpO1xyXG5cdFx0XHR2YXIgdGFiX3JlZF9sYiA9IHRhYl9yZWQuZ2V0Q2hpbGRCeU5hbWUoXCJyZWRfbnVtXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7XHJcblx0XHRcdHRoaXMuY2hhbm5lbF9yZWRbdGFiX2luZGV4XSA9IHsgcmVkOiB0YWJfcmVkLCBudW06IHRhYl9yZWRfbGIgfTtcclxuICAgICAgICB9XHJcblxyXG5cdFx0dGhpcy5ub3RpY2Vfbm9kZSA9IHRoaXMuc2Vla0NoaWxkKFwibm90aWNlX25vZGVcIik7XHJcblx0XHR0aGlzLm5vdGljZV9ub2RlLmFjdGl2ZSA9IGZhbHNlO1xyXG5cdFx0dGhpcy5ub3RpY2VfbGFiID0gdGhpcy5zZWVrQ2hpbGQoXCJub3RpY2VfbGFiZWxcIixjYy5MYWJlbCk7XHJcblx0XHR0aGlzLm5vdGljZV9sYWIuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLor6XpopHpgZPkuIvml6Dms5Xlj5HoqIBcIik7XHJcblxyXG5cdFx0Ly/ku5bkurpA5oiRXHJcblx0XHR0aGlzLmF0X25vdGljZV9ub2RlID0gdGhpcy5zZWVrQ2hpbGQoXCJhdF9ub3RpY2VcIik7XHJcblx0XHR0aGlzLmF0X2Nsb3NlID0gdGhpcy5hdF9ub3RpY2Vfbm9kZS5nZXRDaGlsZEJ5TmFtZShcImF0X2Nsb3NlXCIpO1xyXG5cclxuICAgICAgICAvLyDovpPlhaXljLrln59cclxuICAgICAgICB2YXIgQ2hhdElucHV0ID0gcmVxdWlyZShcImNoYXRfaW5wdXRcIik7XHJcbiAgICAgICAgdmFyIGNoYXRfaW5wdXRfcGFuZWwgPSB0aGlzLmNoYXRfaW5wdXRfcGFuZWwgPSBuZXcgQ2hhdElucHV0KHRoaXMuY3RybCk7XHJcbiAgICAgICAgY2hhdF9pbnB1dF9wYW5lbC5zZXRQYXJlbnQodGhpcy5yb290X3duZCk7XHJcbiAgICAgICAgY2hhdF9pbnB1dF9wYW5lbC5zZXRTZW5kQ2FsbGJhY2sodGhpcy5kaWRpQ2xpY2tTZW5kTXNnLmJpbmQodGhpcykpO1xyXG4gICAgICAgIGNoYXRfaW5wdXRfcGFuZWwuc2hvdygpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIHZhciBjaGF0X2lucHV0X25kID0gdGhpcy5jaGF0X2lucHV0X3BhbmVsID0gbmV3IENoYXRJbnB1dCgpO1xyXG4gICAgICAgIC8vIHRoaXMucm9vdF93bmQuYWRkQ2hpbGQoY2hhdF9pbnB1dF9uZC5yb290X3duZCwgOTk5KTtcclxuXHJcbiAgICAgICAgdmFyIGNsb3NlX2J0biA9IHRoaXMuc2Vla0NoaWxkKFwiY2xvc2VfYnRuXCIpO1xyXG4gICAgICAgIGNsb3NlX2J0bi5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIFx0dGhpcy5jdHJsLmNsb3NlQ2hhdFBhbmVsKCk7XHJcblx0XHR9LmJpbmQodGhpcykpO1xyXG5cdFx0dGhpcy5tYXNrX25vZGUub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbigpIHtcclxuICAgICAgICBcdHRoaXMuY3RybC5jbG9zZUNoYXRQYW5lbCgpO1xyXG5cdFx0fS5iaW5kKHRoaXMpKTtcclxuXHR9LFxyXG5cclxuXHRyZWdpc3RlckV2ZW50OiBmdW5jdGlvbigpIHtcclxuXHRcdHZhciBSb2xlRXZlbnQgPSByZXF1aXJlKFwicm9sZV9ldmVudFwiKTtcdFx0XHJcbiAgICAgICAgdGhpcy5yb2xlX3VwZGF0ZV9ldmVudCA9IHRoaXMucm9sZV92by5iaW5kKFJvbGVFdmVudC5ST0xFX0VWRU5UX0FUVFJfVVBEQVRFLCBmdW5jdGlvbihrZXksIHZhbCl7XHJcbiAgICAgICAgXHRpZiAoa2V5ID09IFwibGV2XCIgfHwga2V5ID09IFwiZ2lkXCIpXHJcbiAgICAgICAgXHRcdHRoaXMudXBkYXRlV2lkZ2V0KClcclxuICAgICAgICB9LmJpbmQodGhpcykpO1xyXG5cclxuXHRcdHRoaXMuYWRkR2xvYmFsRXZlbnQoQ2hhdEV2ZW50Lk1hc3NhZ2VVcGRhdGUsIGZ1bmN0aW9uKG1zZ0RhdGEpIHsgICAgICAgICAgICAgICAgICAgICAgIC8vIOS4uumikemBk+WinuWKoOS4gOadoeacgOaWsOa2iOaBr1xyXG5cdFx0XHR0aGlzLmFkZE1zZ3MobXNnRGF0YSwgbXNnRGF0YS5jaGFubmVsKTtcclxuXHRcdH0uYmluZCh0aGlzKSk7XHJcblxyXG5cdFx0dGhpcy5hZGRHbG9iYWxFdmVudChDaGF0RXZlbnQuTWFzc2FnZURlbGV0ZSwgZnVuY3Rpb24obXNnRGF0YSkgeyAgICAgICAgICAgICAgICAgICAgICAgIC8vIOS4uumikemBk+WIoOmZpOS4gOadoea2iOaBr1xyXG5cdFx0XHR0aGlzLmRlbGV0ZU1zZ3MobXNnRGF0YSk7XHJcblx0XHR9LmJpbmQodGhpcykpO1xyXG5cclxuXHRcdHRoaXMuYWRkR2xvYmFsRXZlbnQoQ2hhdEV2ZW50LlByaXZhdGVNYXNzYWdlVXBkYXRlLCBmdW5jdGlvbihub3RpY2VfaW5mbykgeyAgICAgICAgICAgICAvLyDkuLrpopHpgZPlop7liqDkuIDmnaHnp4HogYrmnIDmlrDmtojmga9cclxuXHRcdFx0dGhpcy5hZGRNc2dzKG5vdGljZV9pbmZvLm1zZ19kYXRhLCBub3RpY2VfaW5mby5jaGFubmVsKTtcclxuXHRcdH0uYmluZCh0aGlzKSk7XHJcblxyXG5cdFx0dGhpcy5hZGRHbG9iYWxFdmVudChDaGF0RXZlbnQuUHJpdmF0ZU1hc3NhZ2VEZWxldGUsIGZ1bmN0aW9uKG5vdGljZV9pbmZvKSB7ICAgICAgICAgICAgIC8vIOS4uumikemBk+WIoOmZpOS4gOadoeengeiBiua2iOaBr1xyXG5cdFx0XHR0aGlzLmRlbGV0ZU1zZ3Mobm90aWNlX2luZm8ubXNnX2RhdGEsIG5vdGljZV9pbmZvLmNoYW5uZWwpO1xyXG5cdFx0fS5iaW5kKHRoaXMpKTtcclxuXHJcblx0XHR0aGlzLmFkZEdsb2JhbEV2ZW50KEV2ZW50SWQuQ0hBVF9ORVdNU0dfRkxBRyxmdW5jdGlvbigpe1xyXG5cdFx0XHR0aGlzLnNldEFsbFJlZFN0YXR1cygpO1xyXG5cdFx0fSx0aGlzKVxyXG5cdH0sXHJcblxyXG5cdG9wZW5Sb290V25kOiBmdW5jdGlvbihwYXJhbXMpIHtcclxuXHRcdHZhciBjaGFubmVsID0gQ2hhdENvbnN0LkNoYW5uZWwuV29ybGQ7XHJcblx0XHRpZiAocGFyYW1zICYmIHBhcmFtcy5jaGFubmVsKVxyXG5cdFx0XHRjaGFubmVsID0gcGFyYW1zLmNoYW5uZWw7XHJcblx0XHR2YXIgY2hhbm5lbF90YWcgPSB0aGlzLmdldENoYW5uZWxUYWcoY2hhbm5lbCk7XHJcblxyXG5cdFx0aWYgKGNoYW5uZWwgPT0gQ2hhdENvbnN0LkNoYW5uZWwuRnJpZW5kKSB7XHJcblx0XHRcdHRoaXMuY3VyX2ZyaWVuZCA9IHBhcmFtcy5mcmllbmRfZGF0YTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmNoYW5nZUNoYW5uZWwoY2hhbm5lbF90YWcpO1xyXG5cclxuXHRcdHRoaXMudXBkYXRlV2lkZ2V0KCk7XHJcblx0XHR0aGlzLnNldEFsbFJlZFN0YXR1cygpO1xyXG5cdH0sXHJcblxyXG5cdGNsb3NlQ2FsbEJhY2s6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmKHRoaXMucm9sZV92byAmJiB0aGlzLnJvbGVfdXBkYXRlX2V2ZW50KXtcclxuICAgICAgICAgICAgdGhpcy5yb2xlX3ZvLnVuYmluZCh0aGlzLnJvbGVfdXBkYXRlX2V2ZW50KTtcclxuICAgICAgICAgICAgdGhpcy5yb2xlX3VwZGF0ZV9ldmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMucm9sZV92byA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jaGF0X2lucHV0X3BhbmVsKVxyXG4gICAgICAgIFx0dGhpcy5jaGF0X2lucHV0X3BhbmVsLmRlbGV0ZU1lKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRpbWVyKVxyXG4gICAgICAgIFx0Z2NvcmUuVGltZXIuZGVsKHRoaXMudGltZXIpO1xyXG5cclxuXHRcdHRoaXMuY3RybC5jbG9zZUNoYXRQYW5lbCgpO1xyXG5cdH0sXHJcblxyXG5cdHVwZGF0ZVdpZGdldDogZnVuY3Rpb24oKSB7XHJcblx0XHQvLyDorr7nva7kuKrpopHpgZPnirbmgIFcclxuXHRcdGZvciAodmFyIGNoYW5uZWxfaSBpbiBDaGF0Q29uc3QuQ2hhbm5lbFRhZykge1xyXG5cdFx0XHR2YXIgY2hhbm5lbF9zdGF0dXMgPSB0aGlzLmNoZWNrQnRuSXNPcGVuKGNoYW5uZWxfaSk7XHJcblx0XHRcdHRoaXMuc2V0Q2hhbm5lbFN0YXR1cyhjaGFubmVsX2ksIGNoYW5uZWxfc3RhdHVzKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRjaGVja0J0bklzT3BlbjogZnVuY3Rpb24oY2hhbm5lbCkge1xyXG5cdFx0aWYgKGNoYW5uZWwgPT0gMikge1xyXG5cdFx0XHRpZih0aGlzLnJvbGVfdm8ubGV2IDwgNTApXHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fSBlbHNlIGlmIChjaGFubmVsID09IDQpIHtcclxuXHRcdFx0aWYgKCF0aGlzLnJvbGVfdm8uZ2lkKVxyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHRcdHJldHVybiB0cnVlXHJcblx0fSxcclxuXHJcblx0c2V0Q2hhbm5lbFN0YXR1czogZnVuY3Rpb24oaW5kZXgsIHN0YXR1cykge1xyXG5cdFx0dmFyIGNoYXRfdGFwX2NvbG9yID0gdGhpcy5jaGF0X3RhcHNbXCJjaGF0X3RhcF9cIiArIGluZGV4XS5jb2xvcjtcclxuXHRcdGlmIChzdGF0dXMpIHtcclxuXHRcdFx0Y2hhdF90YXBfY29sb3IuZnJvbUhFWChcIiNGRkZGRkZcIik7XHJcblx0XHRcdHRoaXMuY2hhbm5lbF90Z1tpbmRleF0uaW50ZXJhY3RhYmxlID0gdHJ1ZTtcdFx0XHRcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGNoYXRfdGFwX2NvbG9yLmZyb21IRVgoXCIjRjVFMEI5XCIpO1xyXG5cdFx0XHR0aGlzLmNoYW5uZWxfdGdbaW5kZXhdLmludGVyYWN0YWJsZSA9IGZhbHNlO1x0XHRcdFx0XHRcdFxyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdGdldENoYW5uZWxUYWc6IGZ1bmN0aW9uKGNoYW5uZWwpIHtcclxuXHRcdHZhciBjaGFubmVsX3RhZyA9IG51bGwsIGNoYW5uZWxfaW5kZXggPSBudWxsO1xyXG5cdFx0Zm9yICh2YXIgY2hhbm5lbF9pIGluIENoYXRDb25zdC5DaGFubmVsKSB7XHJcblx0XHRcdGlmIChDaGF0Q29uc3QuQ2hhbm5lbFtjaGFubmVsX2ldID09PSBjaGFubmVsKVxyXG5cdFx0XHRcdGNoYW5uZWxfaW5kZXggPSBjaGFubmVsX2k7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGNoYW5uZWxfaW5kZXgpIHtcclxuXHRcdFx0Zm9yICh2YXIgdGFnX2kgaW4gQ2hhdENvbnN0LkNoYW5uZWxUYWcpIHtcclxuXHRcdFx0XHRpZiAoQ2hhdENvbnN0LkNoYW5uZWxUYWdbdGFnX2ldID09IGNoYW5uZWxfaW5kZXgpXHJcblx0XHRcdFx0XHRjaGFubmVsX3RhZyA9IHRhZ19pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGNoYW5uZWxfdGFnO1xyXG5cdH0sXHJcblxyXG5cdGRpZGlDbGlja1NlbmRNc2c6IGZ1bmN0aW9uKG1zZykge1xyXG5cdFx0aWYgKG1zZy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdGlmICh0aGlzLmNoYW5uZWwgPT09IENoYXRDb25zdC5DaGFubmVsLkZyaWVuZCkge1xyXG5cdFx0XHRcdGlmICh0aGlzLmN1cl9mcmllbmQpXHJcblx0XHRcdFx0XHR0aGlzLmN0cmwuc2VuZE1lc3NhZ2UodGhpcy5jaGFubmVsLCBtc2csIDIsIHRoaXMuY3VyX2ZyaWVuZC5zcnZfaWQsIHRoaXMuY3VyX2ZyaWVuZC5yaWQsdGhpcy5jdXJfZnJpZW5kLm5hbWUpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMuY3RybC5zZW5kTWVzc2FnZSh0aGlzLmNoYW5uZWwsIG1zZywgMik7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRjaGVja1RvZ2dsZTogZnVuY3Rpb24oZXZlbnQpIHtcclxuXHRcdHZhciB0b2dnbGVfdGFnXzEgPSBldmVudC5ub2RlLnRhZ18xO1xyXG5cdFx0aWYgKHRvZ2dsZV90YWdfMSA9PSB0aGlzLmN1cl9zZWxlY3QpIHJldHVybjtcclxuXHJcblx0XHR0aGlzLmNoYW5nZUNoYW5uZWwodG9nZ2xlX3RhZ18xKTtcclxuXHR9LFxyXG5cclxuXHQvLyDngrnlh7vmoIfnrb5cclxuXHRkaWRDbGlja1RhcDogZnVuY3Rpb24oZXZlbnQpIHtcclxuXHRcdGlmIChldmVudC50YXJnZXQudGFnXzEgPT0gMiAmJiB0aGlzLnJvbGVfdm8ubGV2IDwgNTApIHtcclxuXHRcdFx0bWVzc2FnZShVdGlscy5USTE4TihMYW5nLkNIQVRfQ1JPU1NfREVTKSk7XHJcblx0XHR9IFxyXG5cclxuXHRcdGlmIChldmVudC50YXJnZXQudGFnXzEgPT0gNCAmJiAhdGhpcy5yb2xlX3ZvLmdpZCkge1xyXG5cdFx0XHRtZXNzYWdlKFV0aWxzLlRJMThOKExhbmcuQ0hBVF9HYW5nX0RFUykpO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5zZXRSZWRTdGF0dXMoZXZlbnQudGFyZ2V0LnRhZ18xKTtcclxuXHR9LFxyXG5cclxuXHRjaGFuZ2VDaGFubmVsOiBmdW5jdGlvbihjaGFubmVsX3RhZykge1xyXG5cdFx0dGhpcy5zZXRSZWRTdGF0dXMoY2hhbm5lbF90YWcpO1xyXG5cclxuXHRcdHZhciBjaGFubmVsX2luZGV4ID0gQ2hhdENvbnN0LkNoYW5uZWxUYWdbY2hhbm5lbF90YWddO1xyXG4gICAgICAgIHRoaXMubGFzdF9jaGF0X2luZGV4ID0gdGhpcy5jaGF0X2l0ZW1zX2luZGV4O1xyXG5cdFx0dGhpcy5jaGFubmVsID0gQ2hhdENvbnN0LkNoYW5uZWxbY2hhbm5lbF9pbmRleF07XHJcblxyXG5cdFx0dGhpcy5jaGF0X2lucHV0X3BhbmVsLnNldFZpc2libGUodHJ1ZSk7XHJcblx0XHRpZih0aGlzLmNoYW5uZWwgPT0gQ2hhdENvbnN0LkNoYW5uZWwuRXZlbnQgfHwgdGhpcy5jaGFubmVsID09IENoYXRDb25zdC5DaGFubmVsLlN5c3RlbSl7XHJcblx0XHRcdHRoaXMuY2hhdF9pbnB1dF9wYW5lbC5zZXRWaXNpYmxlKGZhbHNlKTtcclxuXHRcdFx0dGhpcy5ub3RpY2Vfbm9kZS5hY3RpdmUgPSB0cnVlO1xyXG5cdFx0fWVsc2UgaWYodGhpcy5jaGFubmVsID09IENoYXRDb25zdC5DaGFubmVsLlByb3ZpbmNlKXtcclxuXHRcdFx0dmFyIHByb3ZpbmNlX2NvbmZpZyA9IENvbmZpZy5taXNjX2RhdGEuZGF0YV9jb25zdFtcInByb3ZpbmNlX2xldmVsXCJdO1xyXG5cdFx0XHRpZighcHJvdmluY2VfY29uZmlnIHx8IHRoaXMucm9sZV92by5sZXYgPCBwcm92aW5jZV9jb25maWcudmFsKXtcclxuXHRcdFx0XHR0aGlzLmNoYXRfaW5wdXRfcGFuZWwuc2V0VmlzaWJsZShmYWxzZSk7XHJcblx0XHRcdFx0dGhpcy5ub3RpY2Vfbm9kZS5hY3RpdmUgPSBmYWxzZTtcclxuXHRcdFx0fWVsc2V7XHJcblx0XHRcdFx0dGhpcy5jaGF0X2lucHV0X3BhbmVsLnNldFZpc2libGUodHJ1ZSk7XHJcblx0XHRcdFx0dGhpcy5ub3RpY2Vfbm9kZS5hY3RpdmUgPSBmYWxzZTtcclxuXHRcdFx0fVxyXG5cdFx0fWVsc2V7XHJcblx0XHRcdHRoaXMubm90aWNlX25vZGUuYWN0aXZlID0gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGNoYW5uZWxfdGFnID09PSAxKSB7XHJcblx0XHRcdGlmICh0aGlzLnJvbGVfdm8gJiYgdGhpcy5yb2xlX3ZvLmxldiA8IDM1KSB7XHJcblx0XHRcdFx0dGhpcy5lbXB0eV90aXBzX25kLmFjdGl2ZSA9IHRydWU7XHJcblx0XHRcdFx0dGhpcy5lbXB0eV9kZXNjX2xiLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi6KeS6ImyMzXnuqflj6/op4Hor6XpopHpgZPogYrlpKnlhoXlrrlcIik7XHJcblx0XHRcdFx0dGhpcy5jaGF0X2lucHV0X3BhbmVsLnNldFZpc2libGUoZmFsc2UpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMuZW1wdHlfdGlwc19uZC5hY3RpdmUgPSBmYWxzZTtcclxuXHRcdFx0XHR0aGlzLmNoYXRfaW5wdXRfcGFuZWwuc2V0VmlzaWJsZSh0cnVlKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLmN1dF90YXApIHtcclxuXHRcdFx0dmFyIGN1cl9zZWxlY3QgPSB0aGlzLmNoYXRfdGFwc1tcImNoYXRfdGFwX1wiICsgdGhpcy5jdXRfdGFwXS5jb2xvcjtcclxuXHRcdFx0Y3VyX3NlbGVjdC5mcm9tSEVYKENvbmZpZy5jb2xvcl9kYXRhLmRhdGFfY29sb3IxNlsxNDFdKTtcclxuXHRcdFx0dGhpcy5jaGF0X3RhcHNbXCJjaGF0X3RhcF9cIiArIHRoaXMuY3V0X3RhcF0uY29sb3IgPSBjdXJfc2VsZWN0O1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuY2hhbm5lbF90Z1tjaGFubmVsX3RhZ10uaXNDaGVja2VkID0gdHJ1ZTtcclxuXHRcdHRoaXMuY2hhbm5lbF90Z1tjaGFubmVsX3RhZ10uY2hlY2soKTtcclxuXHJcblx0XHR2YXIgbmV3X3NlbGVjdCA9IHRoaXMuY2hhdF90YXBzW1wiY2hhdF90YXBfXCIgKyBjaGFubmVsX3RhZ10uY29sb3I7XHJcblx0XHRuZXdfc2VsZWN0LmZyb21IRVgoQ29uZmlnLmNvbG9yX2RhdGEuZGF0YV9jb2xvcjE2WzI1NF0pO1xyXG5cdFx0dGhpcy5jaGF0X3RhcHNbXCJjaGF0X3RhcF9cIiArIGNoYW5uZWxfdGFnXS5jb2xvciA9IG5ld19zZWxlY3Q7XHJcblx0XHR0aGlzLmN1dF90YXAgPSBjaGFubmVsX3RhZztcclxuXHJcblx0XHQvLyDmm7TmlrDorrDlvZXliIfmjaLml7bnmoTpq5jluqblkozkvY3nva4gXHJcbiAgICAgICAgdGhpcy51cGRhZ2VDaGFubmVsU2l6ZUluZm8oKTtcclxuXHJcbiAgICAgICAgdGhpcy5jaGF0X2l0ZW1zX2luZGV4ID0gdGhpcy5jaGFubmVsO1xyXG4gICAgICAgIGlmICh0aGlzLmNoYW5uZWwgPT0gQ2hhdENvbnN0LkNoYW5uZWwuRnJpZW5kKSB7XHJcbiAgICAgICAgXHRpZiAoIXRoaXMucHJpdmF0ZV90YXJnZXRzKSB7XHJcblx0XHRcdFx0dGhpcy5wcml2YXRlX3RhcmdldHMgPSBbXTtcclxuXHRcdFx0XHR2YXIgaF9wcml2YXRlX3RhcmdldHMgPSB0aGlzLm1vZGVsLmdldFByaXZhdGVUYXJnZXRzKCk7XHJcblx0XHRcdFx0aWYgKGhfcHJpdmF0ZV90YXJnZXRzLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdGlmICghdGhpcy5jdXJfZnJpZW5kKVxyXG5cdFx0XHRcdFx0XHR0aGlzLmN1cl9mcmllbmQgPSBoX3ByaXZhdGVfdGFyZ2V0c1swXTtcclxuXHRcdFx0XHRcdGZvciAodmFyIGZyaWVuZF9pID0gMDsgZnJpZW5kX2kgPCBoX3ByaXZhdGVfdGFyZ2V0cy5sZW5ndGg7IGZyaWVuZF9pKyspXHJcblx0XHRcdFx0XHRcdHRoaXMuYWRkUHJpdmF0ZVRhcChoX3ByaXZhdGVfdGFyZ2V0c1tmcmllbmRfaV0pO1xyXG5cdFx0XHRcdH1cclxuICAgICAgICBcdH1cclxuXHRcdCAgICBpZiAodGhpcy5jdXJfZnJpZW5kKSB7XHJcblx0ICAgICAgICBcdHRoaXMuY2hhdF9pdGVtc19pbmRleCA9IHRoaXMuY3VyX2ZyaWVuZC5zcnZfaWQgKyB0aGlzLmN1cl9mcmllbmQucmlkO1xyXG5cdFx0ICAgIFx0dGhpcy5wcml2YXRlX2FkZF9iZ19uZC5hY3RpdmUgPSBmYWxzZTtcclxuXHRcdCAgICB9IGVsc2Uge1xyXG5cdFx0ICAgIFx0dGhpcy5wcml2YXRlX2FkZF9iZ19uZC5hY3RpdmUgPSB0cnVlO1xyXG5cdFx0XHR9XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgXHRpZiAodGhpcy5wcml2YXRlX2FkZF9iZ19uZC5hY3RpdmUpXHJcbiAgICAgICAgXHRcdHRoaXMucHJpdmF0ZV9hZGRfYmdfbmQuYWN0aXZlID0gZmFsc2U7XHJcblx0XHR9XHJcblx0XHRcclxuXHJcbiAgICAgICAgLy8g5riF5qWa6aKR6YGT5pyq6K+75raI5oGvXHJcbiAgICAgICAgdGhpcy5tb2RlbC5jbGVhblVucmVkTnVtKHRoaXMuY2hhbm5lbCk7XHJcblx0XHQvLyDmm7TmlrDmmL7npLrljLrln59cclxuXHRcdHRoaXMudXBkYXRlTXNnc0NvbnRlbnQoKTtcclxuXHJcblx0XHR2YXIgdGVtcFN0ciA9IFV0aWxzLlRJMThOKFwi6K+36L6T5YWl5L+h5oGvXCIpO1xyXG5cdFx0Ly8gIOWQjOecgeOAgei3qOacjeOAgeS4lueVjOOAgeWFrOS8muWPr+S7pUDkurpcclxuXHRcdGlmIChjaGFubmVsX3RhZyA9PSAxIHx8IGNoYW5uZWxfdGFnID09IDIgfHwgY2hhbm5lbF90YWcgPT0gMyB8fCBjaGFubmVsX3RhZyA9PSA0KSB7XHJcblx0XHRcdHZhciBkYXRhID0gdGhpcy5tb2RlbC5nZXRBdERhdGEoKTtcclxuXHRcdFx0aWYgKGRhdGEgJiYgVXRpbHMubmV4dChkYXRhKSkge1xyXG5cdFx0XHRcdHRoaXMuc2hvd0F0Tm90aWNlKHRydWUsIGRhdGEpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRlbXBTdHIgPSBVdGlscy5USTE4TihcIuivt+i+k+WFpeS/oeaBryzplb/mjInlpLTlg4/lj6/lv6vmjbdA5Lq6XCIpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuY2hhdF9pbnB1dF9wYW5lbC5zZXRQbGFjaG9sZGVyTGFiZWwodGVtcFN0cik7XHJcblx0XHR0aGlzLmNoYXRfaW5wdXRfcGFuZWwuc2V0Q2hhbm5lbCh0aGlzLmNoYW5uZWwpO1xyXG5cdFx0XHJcblx0fSxcclxuXHJcblx0Ly8g5pu05paw5raI5oGv5a655Zmo55qE6auY5bqm5ZKM5L2N572uXHJcblx0dXBkYWdlQ2hhbm5lbFNpemVJbmZvOiBmdW5jdGlvbihpc19jbGVhbikge1xyXG5cdFx0aWYgKCF0aGlzLmNoYXRfaXRlbXNfaW5kZXgpIHJldHVybjtcclxuXHRcdGlmICghdGhpcy5jb250ZW50X2luZm9bdGhpcy5jaGF0X2l0ZW1zX2luZGV4XSkgdGhpcy5jb250ZW50X2luZm9bdGhpcy5jaGF0X2l0ZW1zX2luZGV4XSA9IHt9O1xyXG5cdFx0dmFyIGNfcG9zID0gdGhpcy5tc2dzX2NvbnRlbnQueTtcclxuXHRcdHZhciBjX2hlaWdodCA9IHRoaXMubXNnc19jb250ZW50LmhlaWdodDtcclxuXHRcdGlmIChpc19jbGVhbikge1xyXG5cdFx0XHRjX3BvcyA9IDA7XHJcblx0XHRcdGNfaGVpZ2h0ID0gMDtcclxuXHRcdH1cclxuXHRcdHRoaXMuY29udGVudF9pbmZvW3RoaXMuY2hhdF9pdGVtc19pbmRleF0uY19wb3MgPSBjX3BvcztcclxuXHRcdHRoaXMuY29udGVudF9pbmZvW3RoaXMuY2hhdF9pdGVtc19pbmRleF0uY19oZWlnaHQgPSBjX2hlaWdodDtcclxuXHR9LFxyXG5cclxuXHRtYWluTG9vcDogZnVuY3Rpb24oKSB7XHJcblx0XHRpZiAoIXRoaXMuaXNfdXBkYXRlKSByZXR1cm5cclxuXHRcdGlmICh0aGlzLmNoYXRfaXRlbXNbdGhpcy5jaGF0X2l0ZW1zX2luZGV4XSAmJiB0aGlzLnVwZGF0ZV9pbmRleCA8IHRoaXMuY2hhdF9pdGVtc1t0aGlzLmNoYXRfaXRlbXNfaW5kZXhdLmxlbmd0aCkge1xyXG5cdFx0XHR0aGlzLmNoYXRfaXRlbXNbdGhpcy5jaGF0X2l0ZW1zX2luZGV4XVt0aGlzLnVwZGF0ZV9pbmRleF0udXBkYXRlQ29udGVudCgpO1xyXG5cdFx0XHR0aGlzLnVwZGF0ZV9pbmRleCArKztcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMudXBkYXRlX2luZGV4ID0gMDtcclxuXHRcdFx0dGhpcy5pc191cGRhdGUgPSBmYWxzZTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRhZGRNc2dzOiBmdW5jdGlvbihtc2dfZGF0YSwgY2hhbm5lbCkge1xyXG5cdFx0aWYgKCFtc2dfZGF0YSkgcmV0dXJuO1xyXG5cdFx0Y2hhbm5lbCA9IGNoYW5uZWwgPyBjaGFubmVsIDogbXNnX2RhdGEuY2hhbm5lbDtcclxuXHRcdHZhciBjaGF0X2l0ZW1zX2luZGV4ID0gY2hhbm5lbDtcclxuXHRcdGlmIChjaGFubmVsID09PSBDaGF0Q29uc3QuQ2hhbm5lbC5GcmllbmQpIHtcclxuXHRcdFx0Y2hhdF9pdGVtc19pbmRleCA9IG1zZ19kYXRhLnNydl9pZCArIG1zZ19kYXRhLnJpZDtcclxuXHRcdH1cclxuXHRcdGlmICghdGhpcy5jaGF0X2l0ZW1zW2NoYXRfaXRlbXNfaW5kZXhdKSB7XHJcblx0XHRcdGlmIChjaGF0X2l0ZW1zX2luZGV4ID09IHRoaXMuY2hhdF9pdGVtc19pbmRleCkge1x0XHRcdFxyXG5cdFx0XHRcdGlmICh0aGlzLmdldFZpc2libGUoKSkge1xyXG5cdFx0XHRcdFx0dGhpcy5pbml0SXRlbXMoY2hhbm5lbCwgY2hhdF9pdGVtc19pbmRleCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR2YXIgbWVzX2l0ZW0gPSB0aGlzLmFkZE1zZ0l0ZW0obXNnX2RhdGEsIGNoYW5uZWwpO1xyXG5cdFx0XHRpZiAoY2hhdF9pdGVtc19pbmRleCA9PSB0aGlzLmNoYXRfaXRlbXNfaW5kZXgpIHtcclxuXHRcdFx0XHQvLyBpZiAoKHRoaXMubXNnc19jb250ZW50LmhlaWdodCAtIG1lc19pdGVtLmhlaWdodCkgLSAodGhpcy5zY3JvbGx2aWV3X25kLmhlaWdodCArIHRoaXMubXNnc19jb250ZW50LnkpIDwgMTApIHtcclxuXHRcdFx0XHRcdGlmICh0aGlzLm1zZ3NfY29udGVudC5oZWlnaHQgPiB0aGlzLnNjcm9sbHZpZXdfbmQuaGVpZ2h0KSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuc2Nyb2xsdmlld19tZ3Nfc2Muc2Nyb2xsVG9QZXJjZW50VmVydGljYWwoMCwgMC4xLHRydWUpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdC8vIH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuc2V0UmVkU3RhdHVzKGNoYW5uZWwpO1xyXG5cdFx0aWYgKGNoYW5uZWwgPT09IHRoaXMuY2hhbm5lbCAmJiB0aGlzLmdldFZpc2libGUoKSlcclxuXHRcdFx0dGhpcy5tb2RlbC5jbGVhblVucmVkTnVtKGNoYW5uZWwpO1xyXG5cdH0sXHJcblxyXG5cdGRlbGV0ZU1zZ3M6IGZ1bmN0aW9uKG1zZ19kYXRhLCBjaGFubmVsKSB7XHJcblx0XHRpZighbXNnX2RhdGEpIHJldHVybjtcclxuXHRcdGNoYW5uZWwgPSBjaGFubmVsID8gY2hhbm5lbCA6IG1zZ19kYXRhLmNoYW5uZWw7XHJcblx0XHR2YXIgY2hhdF9pdGVtc19pbmRleCA9IG1zZ19kYXRhLmNoYW5uZWw7XHJcblx0XHRpZiAoY2hhbm5lbCA9PT0gQ2hhdENvbnN0LkNoYW5uZWwuRnJpZW5kKVxyXG5cdFx0XHRjaGF0X2l0ZW1zX2luZGV4ID0gbXNnX2RhdGEuc3J2X2lkICsgbXNnX2RhdGEucmlkO1xyXG5cclxuXHRcdGlmKHRoaXMuY2hhdF9tc2dzICYmIHRoaXMuY2hhdF9tc2dzW2NoYXRfaXRlbXNfaW5kZXhdKXtcclxuXHRcdFx0dmFyIHRoaXNfbXNnID0gdGhpcy5jaGF0X21zZ3NbY2hhdF9pdGVtc19pbmRleF0uc2hpZnQoKTtcclxuXHRcdH1cclxuXHRcdFxyXG5cdFx0aWYodGhpcy5jaGF0X2l0ZW1zICYmIHRoaXMuY2hhdF9pdGVtc1tjaGF0X2l0ZW1zX2luZGV4XSl7XHJcblx0XHRcdHZhciBjaGF0X2l0ZW0gPSB0aGlzLmNoYXRfaXRlbXNbY2hhdF9pdGVtc19pbmRleF0uc2hpZnQoKTtcclxuXHJcblx0XHRcdGNoYXRfaXRlbS51cGRhdGVDb250ZW50KHRydWUpO1xyXG5cclxuXHRcdFx0aWYgKHRoaXMuY29udGVudF9pbmZvW2NoYXRfaXRlbXNfaW5kZXhdKSB7XHRcdFxyXG5cdFx0XHRcdHRoaXMuY29udGVudF9pbmZvW2NoYXRfaXRlbXNfaW5kZXhdLmNfaGVpZ2h0IC09IGNoYXRfaXRlbS5oZWlnaHQ7XHJcblx0XHRcdFx0dGhpcy5jb250ZW50X2luZm9bY2hhdF9pdGVtc19pbmRleF0uY19wb3MgLT0gY2hhdF9pdGVtLmhlaWdodDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Zm9yICh2YXIgY2hhdF9pIGluIHRoaXMuY2hhdF9pdGVtc1tjaGF0X2l0ZW1zX2luZGV4XSlcclxuXHRcdFx0XHR0aGlzLmNoYXRfaXRlbXNbY2hhdF9pdGVtc19pbmRleF1bY2hhdF9pXS5wb3NfeSAtPSBjaGF0X2l0ZW0uaGVpZ2h0O1xyXG5cclxuXHRcdFx0aWYgKGNoYXRfaXRlbXNfaW5kZXggPSB0aGlzLmNoYXRfaXRlbXNfaW5kZXgpIHtcclxuXHRcdFx0XHR0aGlzLm1zZ3NfY29udGVudC55IC09IGNoYXRfaXRlbS5oZWlnaHQ7XHJcblx0XHRcdFx0dGhpcy51cGRhdGVNc2dzQ29udGVudCgpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRcclxuXHJcblx0XHR0aGlzLnNldFJlZFN0YXR1cyhjaGFubmVsKTtcclxuXHR9LFxyXG5cclxuXHQvLyDliKDpmaTjgIHliJ3lp4vljJbmtojmga/mnaXliJvlu7pjaGF0X2l0ZW0sIOabtOaWsOWMuuWfn1xyXG5cdHVwZGF0ZU1zZ3NDb250ZW50OiBmdW5jdGlvbigpIHtcclxuXHRcdC8vIGlmICghdGhpcy5jaGF0X2l0ZW1zX2luZGV4KSByZXR1cm47XHJcblxyXG5cdFx0Ly8g5Yid5aeL5YyW5b2T5YmN6aKR6YGT5L+h5oGvXHJcblx0XHRpZiAodGhpcy5jaGF0X2l0ZW1zX2luZGV4ICYmICF0aGlzLmNoYXRfaXRlbXNbdGhpcy5jaGF0X2l0ZW1zX2luZGV4XSkge1xyXG5cdCAgICAgICAgdGhpcy51cGRhZ2VDaGFubmVsU2l6ZUluZm8odHJ1ZSk7XHJcblx0XHRcdHRoaXMuaW5pdEl0ZW1zKHRoaXMuY2hhbm5lbCwgdGhpcy5jaGF0X2l0ZW1zX2luZGV4KTtcclxuXHRcdH1cclxuXHJcblx0XHR2YXIgY29udGVudF9wb3MgPSAwO1xyXG5cdFx0dmFyIGNvbnRlbnRfaGVpZ2h0ID0gMDtcclxuXHJcblx0XHRpZiAodGhpcy5jaGF0X2l0ZW1zX2luZGV4ICYmIHRoaXMuY29udGVudF9pbmZvW3RoaXMuY2hhdF9pdGVtc19pbmRleF0pIHtcclxuXHRcdCAgICBjb250ZW50X3BvcyA9IHRoaXMuY29udGVudF9pbmZvW3RoaXMuY2hhdF9pdGVtc19pbmRleF0uY19wb3M7XHRcdFx0XHJcblx0XHQgICAgY29udGVudF9oZWlnaHQgPSB0aGlzLmNvbnRlbnRfaW5mb1t0aGlzLmNoYXRfaXRlbXNfaW5kZXhdLmNfaGVpZ2h0O1xyXG5cdFx0fSBlbHNlIHsgIC8vIOabtOWIsOacgOW6leerr1xyXG5cdFx0XHQvLyBjb250ZW50X2hlaWdodCA9IFxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLmNoYW5uZWwgPT0gQ2hhdENvbnN0LkNoYW5uZWwuRnJpZW5kKSB7XHJcblx0XHRcdC8vICYmIHRoaXMuY3VyX2ZyaWVuZCkge1xyXG5cdFx0XHR0aGlzLmNvbnRlcm5fYmdfbmQuaGVpZ2h0ID0gRlJJRUROX0NIQVRfSEVJR0hUO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5jb250ZXJuX2JnX25kLmhlaWdodCA9IE5PUk1BTF9DSEFUX0hFSUdIVDtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLm1zZ3NfY29udGVudC55ID0gY29udGVudF9wb3M7XHJcblx0XHR0aGlzLm1zZ3NfY29udGVudC5oZWlnaHQgPSBjb250ZW50X2hlaWdodDtcclxuXHJcbiAgICAgICAgLy8g5riF6Zmk5LiK5Liq5LiK5Liq6aKR6YGT5L+h5oGvXHJcblx0XHR0aGlzLmNsZWFuQ29udGVuKCk7XHJcblx0XHQvLyDmm7TmlrDlvZPliY3popHpgZPkv6Hmga/mnaHnm65cclxuXHRcdHRoaXMudXBkYWdlSXRlbXMoKTtcclxuXHR9LFxyXG5cclxuXHRhZGRNc2dJdGVtOiBmdW5jdGlvbihtc2dfZGF0YSwgY2hhbm5lbCkge1xyXG5cdFx0Y2hhbm5lbCA9IGNoYW5uZWwgPyBjaGFubmVsIDogbXNnX2RhdGEuY2hhbm5lbDtcclxuXHRcdHZhciBpdGVtc19pbmRleCA9IGNoYW5uZWw7XHJcblx0XHR2YXIgY2hhdF9iYXNlX2hlaWdodCA9IDEwMDtcclxuXHRcdGlmIChjaGFubmVsID09PSBDaGF0Q29uc3QuQ2hhbm5lbC5GcmllbmQpIHtcclxuXHRcdFx0aXRlbXNfaW5kZXggPSBtc2dfZGF0YS5zcnZfaWQgKyBtc2dfZGF0YS5yaWQ7XHJcblx0XHR9XHJcblx0XHR2YXIgb3RoZXJfaGVpZ2h0ID0gMDtcclxuXHJcblx0XHRpZiAoIXRoaXMuY29udGVudF9pbmZvW2l0ZW1zX2luZGV4XSkgcmV0dXJuO1xyXG5cdFx0aWYgKGNoYW5uZWwgPT09IENoYXRDb25zdC5DaGFubmVsLlN5c3RlbSkge1xyXG5cdFx0XHRjaGF0X2Jhc2VfaGVpZ2h0ID0gMzA7XHJcblx0XHRcdG90aGVyX2hlaWdodCA9IDEwO1xyXG5cdFx0fSBcclxuXHJcblx0XHQvLyDop6PmnpDogYrlpKnlrZfnrKbkuLLvvIzlop7liqDooajmg4Xlkozlm77niYfpq5jluqZcclxuXHRcdC8vIGFuYWx5emVNZXNzYWdlXHJcblx0XHR2YXIgdGVzdF9tc2cgPSB0aGlzLmNoYXRfaXRlbV9jdHJsLmFuYWx5emVNZXNzYWdlKG1zZ19kYXRhLm1zZyk7XHJcblx0XHR0aGlzLm1zZ19ydC5zdHJpbmcgPSB0ZXN0X21zZztcclxuXHJcblx0XHR2YXIgbXNnX2hlaWdodCA9IHRoaXMubXNnX25kLmhlaWdodCArIGNoYXRfYmFzZV9oZWlnaHQ7XHJcblxyXG5cdC8vIHRoaXMuY29udGVudF9pbmZvW3RoaXMuY2hhdF9pdGVtc19pbmRleF0uY19oZWlnaHRcclxuXHQgICAgdmFyIGNvbnRlbnRfaGVpZ2h0ID0gMDtcclxuXHQgICAgaWYgKHRoaXMuY29udGVudF9pbmZvW2l0ZW1zX2luZGV4XSlcclxuXHRcdFx0Y29udGVudF9oZWlnaHQgPSB0aGlzLmNvbnRlbnRfaW5mb1tpdGVtc19pbmRleF0uY19oZWlnaHRcclxuXHJcblx0XHR2YXIgbXNnX2l0ZW0gPSBuZXcgQ2hhdEl0ZW0odGhpcywgbXNnX2RhdGEsIG1zZ19oZWlnaHQsIGNvbnRlbnRfaGVpZ2h0LCBjaGFubmVsKTtcclxuXHRcdHRoaXMuY29udGVudF9pbmZvW2l0ZW1zX2luZGV4XS5jX2hlaWdodCArPSBtc2dfaGVpZ2h0O1xyXG5cclxuXHRcdHRoaXMuY2hhdF9tc2dzW2l0ZW1zX2luZGV4XS5wdXNoKG1zZ19kYXRhKTtcclxuXHRcdHRoaXMuY2hhdF9pdGVtc1tpdGVtc19pbmRleF0ucHVzaChtc2dfaXRlbSk7XHJcblxyXG5cdFx0Ly8g5q2k5p2h5ZCO6Z2i6ZyA6KaB5LyY5YyWXHJcblx0XHRpZiAoaXRlbXNfaW5kZXggPT0gdGhpcy5jaGF0X2l0ZW1zX2luZGV4KSB7XHJcblx0XHRcdHRoaXMubXNnc19jb250ZW50LmhlaWdodCArPSAobXNnX2hlaWdodCAr44CAMTApO1x0XHJcblx0XHRcdGlmICh0aGlzLmNoYXRfaXRlbXNbdGhpcy5jaGF0X2l0ZW1zX2luZGV4XS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0dGhpcy5lbXB0eV90aXBzX25kLmFjdGl2ZSA9IGZhbHNlO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGlmICh0aGlzLmN1dF90YXAgIT09IDEgfHwgKHRoaXMucm9sZV92byAmJiB0aGlzLnJvbGVfdm8ubGV2ID4gMzUpKSB7XHJcblx0XHRcdFx0XHR0aGlzLmVtcHR5X3RpcHNfbmQuYWN0aXZlID0gdHJ1ZTtcclxuXHRcdFx0XHRcdHRoaXMuZW1wdHlfZGVzY19sYi5zdHJpbmcgPSBVdGlscy5USTE4TihcIuaaguaXtuayoeacieS6uuivtOivnVwiKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cdFx0XHRcdFx0XHJcblx0XHRcdG1zZ19pdGVtLnVwZGF0ZUNvbnRlbnQoKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbXNnX2l0ZW1cclxuXHR9LFxyXG5cclxuXHRjbGVhbkNvbnRlbjogZnVuY3Rpb24oKSB7XHJcblx0XHRpZiAoIXRoaXMubGFzdF9jaGF0X2luZGV4KSByZXR1cm5cclxuXHQgICAgdGhpcy51cGRhdGVfaW5kZXggPSAwO1xyXG5cdFx0Zm9yICh2YXIgY2hhdF9pIGluIHRoaXMuY2hhdF9pdGVtc1t0aGlzLmxhc3RfY2hhdF9pbmRleF0pIHtcclxuXHRcdFx0dGhpcy5jaGF0X2l0ZW1zW3RoaXMubGFzdF9jaGF0X2luZGV4XVtjaGF0X2ldLnVwZGF0ZUNvbnRlbnQodHJ1ZSk7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0Ly8g5Zyo5q2k5aSE5pu05pawY29udGVudOW9k+WJjeS9jee9rlxyXG5cdGNvbnRlbnRTY3JvbGxpbmc6IGZ1bmN0aW9uKGV2ZW50KSB7XHJcblx0XHRpZiAodGhpcy5zY3JvbGxfZGlzID09IDApIHtcclxuXHRcdFx0dGhpcy5zY3JvbGxfZGlzID0gZXZlbnQuY29udGVudC55O1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0aWYgKE1hdGguYWJzKE1hdGguYWJzKGV2ZW50LmNvbnRlbnQueSkgLSBNYXRoLmFicyh0aGlzLnNjcm9sbF9kaXMpKSA+IDQwKSB7XHJcblx0XHRcdFx0dGhpcy51cGRhZ2VJdGVtcygpO1xyXG5cdFx0XHRcdHRoaXMuc2Nyb2xsX2RpcyA9IDA7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHQvLyDliJ3lp4vljJbmn5DkuKpjaGFubmVs55qE5raI5oGv5p2h55uuXHJcblx0aW5pdEl0ZW1zOiBmdW5jdGlvbihjaGFubmVsLCBpdGVtX2luZGV4KSB7XHJcblx0XHRpZiAoIWNoYW5uZWwpIHJldHVybjtcclxuXHJcblx0XHR0aGlzLm1zZ3NfY29udGVudC5oZWlnaHQgPSAwO1xyXG5cdFx0dGhpcy5tc2dzX2NvbnRlbnQueSA9IDA7XHJcblxyXG5cdFx0dmFyIGl0ZW1zX2luZGV4ID0gaXRlbV9pbmRleCA/IGl0ZW1faW5kZXggOiBjaGFubmVsO1xyXG5cdFx0dmFyIG1zZ3MgPSBbXTtcclxuXHRcdHRoaXMuY2hhdF9tc2dzW2l0ZW1zX2luZGV4XSA9IFtdO1xyXG5cdFx0dGhpcy5jaGF0X2l0ZW1zW2l0ZW1zX2luZGV4XSA9IFtdO1xyXG5cclxuXHRcdGlmIChjaGFubmVsID09IENoYXRDb25zdC5DaGFubmVsLkZyaWVuZCAmJiBpdGVtX2luZGV4KSB7XHJcblx0XHRcdGlmICh0aGlzLmN1cl9mcmllbmQpIHtcclxuXHRcdFx0XHRtc2dzID0gdGhpcy5tb2RlbC5nZXRQcml2YXRlTXNncyh0aGlzLmN1cl9mcmllbmQuc3J2X2lkLCB0aGlzLmN1cl9mcmllbmQucmlkKTtcclxuXHRcdFx0XHR0aGlzLmN0cmwuc2VuZGVyMTI3MjModGhpcy5jdXJfZnJpZW5kLnNydl9pZCwgdGhpcy5jdXJfZnJpZW5kLnJpZCk7XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdG1zZ3MgPSB0aGlzLm1vZGVsLmdldENoYW5uZWxNc2dzKGNoYW5uZWwpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGZvciAodmFyIG1zZ19pID0gMDsgbXNnX2kgPCBtc2dzLmxlbmd0aDsgbXNnX2krKykge1xyXG5cdFx0XHR2YXIgY2hhdF9pdGVtID0gdGhpcy5hZGRNc2dJdGVtKG1zZ3NbbXNnX2ldLCBjaGFubmVsKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZih0aGlzLm1zZ3NfY29udGVudC5oZWlnaHQgPiB0aGlzLnNjcm9sbHZpZXdfbmQuaGVpZ2h0KSB7XHJcblx0XHRcdHRoaXMuc2Nyb2xsdmlld19tZ3Nfc2Muc2Nyb2xsVG9Cb3R0b20oMC4xKTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmlzX3VwZGF0ZSA9IHRydWU7XHJcblx0XHR0aGlzLnVwZGF0ZV9pbmRleCA9IDA7XHJcblx0fSxcclxuXHJcblx0Ly8g5pu05paw5p2h55uu54q25oCBXHJcblx0dXBkYWdlSXRlbXM6IGZ1bmN0aW9uKCkge1xyXG5cdFx0aWYgKHRoaXMuY2hhdF9pdGVtc19pbmRleCkge1xyXG5cdFx0XHRpZiAodGhpcy5jaGF0X2l0ZW1zW3RoaXMuY2hhdF9pdGVtc19pbmRleF0pIHtcclxuXHRcdFx0XHRmb3IgKHZhciBpdGVtX2luZGV4IGluIHRoaXMuY2hhdF9pdGVtc1t0aGlzLmNoYXRfaXRlbXNfaW5kZXhdKSB7XHJcblx0XHRcdFx0XHR0aGlzLmNoYXRfaXRlbXNbdGhpcy5jaGF0X2l0ZW1zX2luZGV4XVtpdGVtX2luZGV4XS51cGRhdGVDb250ZW50KCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdC8vIOabtOaWsOWIsOacgOaWsOS9jee9rlxyXG5cdFx0XHRcdGlmICh0aGlzLmNoYXRfaXRlbXNbdGhpcy5jaGF0X2l0ZW1zX2luZGV4XS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0XHR0aGlzLmVtcHR5X3RpcHNfbmQuYWN0aXZlID0gZmFsc2U7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGlmICh0aGlzLmN1dF90YXAgIT09IDEgfHwgKHRoaXMucm9sZV92byAmJiB0aGlzLnJvbGVfdm8ubGV2ID4gMzUpKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuZW1wdHlfdGlwc19uZC5hY3RpdmUgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHR0aGlzLmVtcHR5X2Rlc2NfbGIuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLmmoLml7bmsqHmnInkurror7Tor51cIik7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0Z2V0Q2hhdEl0ZW1OZDogZnVuY3Rpb24oKSB7XHJcblx0XHRpZiAodGhpcy5jaGF0X2l0ZW1zX2NhY2hlLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuY2hhdF9pdGVtc19jYWNoZS5zaGlmdCgpO1x0XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0Y2FjaGVDaGF0SXRlbU5kOiBmdW5jdGlvbihpdGVtX25kKSB7XHJcblx0XHR0aGlzLmNoYXRfaXRlbXNfY2FjaGUucHVzaChpdGVtX25kKTtcclxuXHR9LFxyXG5cclxuXHRnZXRDb250ZW50UG9zOiBmdW5jdGlvbigpIHtcclxuXHRcdHJldHVybiB0aGlzLm1zZ3NfY29udGVudC55XHJcblx0fSxcclxuXHJcblx0YWRkUHJpdmF0ZVRhcDogZnVuY3Rpb24oZnJpZW5kX3ZvKSB7XHJcblx0XHRmb3IgKHZhciBmcmllbmRfaSA9IDA7IGZyaWVuZF9pIDwgdGhpcy5wcml2YXRlX3RhcmdldHMubGVuZ3RoOyBmcmllbmRfaSsrKSB7XHJcblx0XHRcdGlmICh0aGlzLnByaXZhdGVfdGFyZ2V0c1tmcmllbmRfaV0uc3J2X2lkID09PSBmcmllbmRfdm8uc3J2X2lkICYmIHRoaXMucHJpdmF0ZV90YXJnZXRzW2ZyaWVuZF9pXS5yaWQgPT09IGZyaWVuZF92by5yaWQpe1xyXG5cdFx0XHRcdHJldHVyblxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHR2YXIgQ2hhdEZyaWVuZCA9IHJlcXVpcmUoXCJjaGF0X2ZyaWVuZFwiKTtcclxuXHRcdHZhciBpc19zZWxlY3QgPSBmYWxzZTtcclxuXHRcdGlmICh0aGlzLmN1cl9mcmllbmQgJibjgIB0aGlzLmN1cl9mcmllbmQuc3J2X2lkID09PSBmcmllbmRfdm8uc3J2X2lkICYmIHRoaXMuY3VyX2ZyaWVuZC5yaWQgPT0gZnJpZW5kX3ZvLnJpZClcclxuXHRcdFx0aXNfc2VsZWN0ID0gdHJ1ZTtcclxuXHRcdHZhciBjaGF0X2ZyaWVuZCA9IG5ldyBDaGF0RnJpZW5kKGZyaWVuZF92bywgdGhpcy5wcml2YXRlX2NvbnRlbmQsIGlzX3NlbGVjdCk7XHJcblx0XHRjaGF0X2ZyaWVuZC5zZXRTZWxlY3RDYWxsYmFjayh0aGlzLnNlbGVjdFByaXZhdGUuYmluZCh0aGlzKSk7XHJcblx0XHRjaGF0X2ZyaWVuZC5zZXREZWxldGVDYWxsQmFjayh0aGlzLmRlbGV0ZVByaXZhdGUuYmluZCh0aGlzKSk7XHJcblx0XHR0aGlzLnByaXZhdGVfdGFyZ2V0cy5wdXNoKGZyaWVuZF92byk7XHJcblx0XHR0aGlzLmNoYXRfZnJpZW5kc1tmcmllbmRfdm8uc3J2X2lkICsgZnJpZW5kX3ZvLnJpZF0gPSBjaGF0X2ZyaWVuZDtcclxuXHRcdGlmIChpc19zZWxlY3QpIHRoaXMuY3VyX2ZyaWVuZF90YXAgPSBjaGF0X2ZyaWVuZDtcclxuXHR9LFxyXG5cclxuXHRzZWxlY3RQcml2YXRlOiBmdW5jdGlvbihwcml2YXRlX2luZGV4LCBmcmllbmRfdm8pIHtcclxuXHRcdGlmIChwcml2YXRlX2luZGV4ICYmIGZyaWVuZF92byAmJiBwcml2YXRlX2luZGV4ICE9PSB0aGlzLmNoYXRfaXRlbXNfaW5kZXgpIHtcclxuXHRcdFx0Ly8g5pu05paw6K6w5b2V5YiH5o2i5pe255qE6auY5bqm5ZKM5L2N572uIFxyXG5cdCAgICAgICAgdGhpcy51cGRhZ2VDaGFubmVsU2l6ZUluZm8oKTtcclxuXHRcdFx0aWYgKHRoaXMuY3VyX2ZyaWVuZF90YXApIHRoaXMuY3VyX2ZyaWVuZF90YXAuY2FuY2VsU2VsY2V0KCk7XHJcblx0XHRcdHRoaXMuY3VyX2ZyaWVuZF90YXAgPSB0aGlzLmNoYXRfZnJpZW5kc1tmcmllbmRfdm8uc3J2X2lkICsgZnJpZW5kX3ZvLnJpZF07XHJcblx0XHRcdHRoaXMuY3VyX2ZyaWVuZF90YXAuc2V0U2VsZWN0U3RhdHVzKCk7XHJcblx0XHRcdHRoaXMuY3VyX2ZyaWVuZCA9IGZyaWVuZF92bztcclxuXHRcdFx0dGhpcy5sYXN0X2NoYXRfaW5kZXggPSB0aGlzLmNoYXRfaXRlbXNfaW5kZXg7XHJcblx0XHRcdHRoaXMuY2hhdF9pdGVtc19pbmRleCA9IHByaXZhdGVfaW5kZXg7XHJcblx0XHRcdHRoaXMudXBkYXRlTXNnc0NvbnRlbnQoKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRkZWxldGVQcml2YXRlOiBmdW5jdGlvbihwcml2YXRlX2luZGV4LCBmcmllbmRfdm8pIHtcclxuXHRcdGlmIChwcml2YXRlX2luZGV4ICYmIGZyaWVuZF92bykge1xyXG5cdFx0XHRmb3IgKHZhciBmcmllbmRfaSBpbiB0aGlzLnByaXZhdGVfdGFyZ2V0cykge1xyXG5cdFx0XHRcdGlmICh0aGlzLnByaXZhdGVfdGFyZ2V0c1tmcmllbmRfaV0ucmlkID09PSBmcmllbmRfdm8ucmlkKSB7XHJcblx0XHRcdFx0XHR0aGlzLnByaXZhdGVfdGFyZ2V0cy5zcGxpY2UoZnJpZW5kX2ksIDEpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKHRoaXMucHJpdmF0ZV90YXJnZXRzLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHR2YXIgbmV3X2ZyaWVuZF92byA9IHRoaXMucHJpdmF0ZV90YXJnZXRzWzBdO1xyXG5cdFx0XHRcdHZhciBwcml2YXRlX2luZGV4ID0gbmV3X2ZyaWVuZF92by5zcnZfaWQgKyBuZXdfZnJpZW5kX3ZvLnJpZFxyXG5cdFx0XHRcdHRoaXMuc2VsZWN0UHJpdmF0ZShwcml2YXRlX2luZGV4LCBuZXdfZnJpZW5kX3ZvKTtcclxuXHRcdCAgICBcdHRoaXMucHJpdmF0ZV9hZGRfYmdfbmQuYWN0aXZlID0gZmFsc2U7XHRcdFx0XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dGhpcy5sYXN0X2NoYXRfaW5kZXggPSBmcmllbmRfdm8uc3J2X2lkICsgZnJpZW5kX3ZvLnJpZDtcclxuXHRcdFx0XHR0aGlzLmNoYXRfaXRlbXNfaW5kZXggPSBudWxsO1xyXG5cdFx0XHRcdHRoaXMudXBkYXRlTXNnc0NvbnRlbnQoKTtcclxuXHRcdFx0XHR0aGlzLmN1cl9mcmllbmQgPSBudWxsO1xyXG5cdFx0XHRcdHRoaXMubGFzdF9jaGF0X2luZGV4ID0gbnVsbDtcclxuXHRcdCAgICBcdHRoaXMucHJpdmF0ZV9hZGRfYmdfbmQuYWN0aXZlID0gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZGVsZXRlIHRoaXMuY2hhdF9mcmllbmRzW2ZyaWVuZF92by5zcnZfaWQgKyBmcmllbmRfdm8ucmlkXTtcclxuXHRcdFx0XHJcblx0XHRcdHRoaXMubW9kZWwuZGVsdGVQcml2YXRlVGFyZ2V0KGZyaWVuZF92byk7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0b25DbGlja0FkZFByaUJ0bjogZnVuY3Rpb24oKSB7XHJcbiAgICBcdHRoaXMuY3RybC5jbG9zZUNoYXRQYW5lbCgpO1xyXG4gICAgXHRcclxuXHRcdHZhciBGcmllbmRDb250cm9sbGVyID0gcmVxdWlyZShcImZyaWVuZF9jb250cm9sbGVyXCIpO1xyXG5cdFx0RnJpZW5kQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLm9wZW5GcmllbmRXaW5kb3codHJ1ZSk7XHJcblx0fSxcclxuXHJcblx0Ly/moIfnrb7pobXnuqLngrnlpITnkIZcclxuXHRzZXRSZWRTdGF0dXM6IGZ1bmN0aW9uIChjaGFubmVsKSB7XHJcblx0XHRpZiAoY2hhbm5lbCA9PSBudWxsKSByZXR1cm5cclxuXHRcdGlmICh0aGlzLmNoYW5uZWxfcmVkID09IG51bGwpIHJldHVyblxyXG5cdFx0aWYgKHRoaXMuY2hhbm5lbF9yZWRbY2hhbm5lbF0gPT0gbnVsbCkgcmV0dXJuXHJcblxyXG5cdFx0aWYgKChjaGFubmVsID09IDIgJiYgdGhpcy5yb2xlX3ZvICYmIHRoaXMucm9sZV92by5sZXYgPCA1MCkgfHwgKGNoYW5uZWwgPT0gNCAmJiB0aGlzLnJvbGVfdm8gJiYgIXRoaXMucm9sZV92by5naWQpKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRsZXQgYnRuID0gdGhpcy5jaGFubmVsX3JlZFtjaGFubmVsXTtcclxuXHRcdGxldCBudW0gPSB0aGlzLm1vZGVsLmdldFVucmVhZE51bShDaGF0Q29uc3QuQ2hhbm5lbFtDaGF0Q29uc3QuQ2hhbm5lbFRhZ1tjaGFubmVsXV0pO1xyXG5cdFx0aWYgKG51bSA+IDApIHtcclxuXHRcdFx0YnRuLnJlZC5hY3RpdmUgPSB0cnVlO1xyXG5cdFx0XHRidG4ubnVtLnN0cmluZyA9IG51bTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGJ0bi5yZWQuYWN0aXZlID0gZmFsc2U7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0Ly/miYDmnInmoIfnrb7pobXnuqLngrnlpITnkIZcclxuXHRzZXRBbGxSZWRTdGF0dXM6IGZ1bmN0aW9uICgpIHtcclxuXHRcdGZvciAobGV0IGkgPSAxOyBpIDw9IDY7IGkrKykge1xyXG5cdFx0XHR0aGlzLnNldFJlZFN0YXR1cyhpKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRzaG93QXROb3RpY2U6IGZ1bmN0aW9uKHN0YXR1cywgZGF0YSkge1xyXG5cdFx0aWYgKHRoaXMucm9vdF93bmQgPT0gbnVsbCkgcmV0dXJuO1xyXG5cclxuXHRcdHRoaXMuYXRfY2xvc2UudGFyZ2V0T2ZmKHRoaXMpO1xyXG5cclxuXHRcdHZhciBjbG9zZV9jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0dGhpcy5hdF9ub3RpY2Vfbm9kZS5hY3RpdmUgPSBmYWxzZTtcclxuXHRcdFx0dGhpcy5tb2RlbC5zZXRBdERhdGEoe30pO1xyXG5cdFx0XHRpZiAoZGF0YSAmJiBVdGlscy5uZXh0KGRhdGEpKSB7XHJcblx0XHRcdFx0dGhpcy5jdHJsLnNlbmRlcjEyNzY4KGRhdGEucmlkLCBkYXRhLnNydl9pZCwgZGF0YS5jaGFubmVsLCBkYXRhLm1zZyk7XHJcblx0XHRcdH1cclxuXHRcdH0uYmluZCh0aGlzKTtcclxuXHRcdFV0aWxzLm9uVG91Y2hFbmQodGhpcy5hdF9jbG9zZSwgZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRjbG9zZV9jYWxsYmFjaygpO1xyXG5cdFx0fS5iaW5kKHRoaXMpLCAxKTtcclxuXHJcblx0XHR2YXIgaXRlbSA9IG51bGw7XHJcblx0XHRpZiAoZGF0YSAmJiBVdGlscy5uZXh0KGRhdGEpICE9IG51bGwpIHtcclxuXHRcdFx0dmFyIGlkID0gdGhpcy5jdHJsLmdldElkKHRoaXMuY2hhbm5lbCwgZGF0YS5zcnZfaWQsIGRhdGEucmlkLCBkYXRhLm5hbWUsIGRhdGEubXNnKTtcclxuXHRcdFx0XHJcblxyXG5cdFx0XHR2YXIgc2Nyb2xsID0gdGhpcy5jaGF0X2l0ZW1zW3RoaXMuY2hhbm5lbF07XHJcblx0XHRcdGlmIChzY3JvbGwpIHtcclxuXHRcdFx0XHR2YXIgaXNIYXZlID0gZmFsc2U7XHJcblx0XHRcdFx0Zm9yICh2YXIgaSA9IDAsbCA9IHNjcm9sbC5sZW5ndGg7aTxsO2krKykge1xyXG5cdFx0XHRcdFx0aWYgKHNjcm9sbFtpXS5nZXRJZCgpID09IGlkKSB7XHJcblx0XHRcdFx0XHRcdGl0ZW0gPSBzY3JvbGxbaV07XHJcblx0XHRcdFx0XHRcdHRoaXMuYXRfbm90aWNlX25vZGUuYWN0aXZlID0gc3RhdHVzO1xyXG5cdFx0XHRcdFx0XHRpc0hhdmUgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKGlzSGF2ZSA9PSBmYWxzZSkge1xyXG5cdFx0XHRcdFx0dGhpcy5hdF9ub3RpY2Vfbm9kZS5hY3RpdmUgPSBmYWxzZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dGhpcy5hdF9ub3RpY2Vfbm9kZS5hY3RpdmUgPSBmYWxzZTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5hdF9ub3RpY2Vfbm9kZS5hY3RpdmUgPSBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHRVdGlscy5vblRvdWNoRW5kKHRoaXMuYXRfbm90aWNlX25vZGUsIGZ1bmN0aW9uIChpdGVtKSB7XHJcblx0XHRcdGlmIChpdGVtKSB7XHJcblx0XHRcdFx0dmFyIHByZWNlbnQgPSAodGhpcy5tc2dzX2NvbnRlbnQuaGVpZ2h0IC0gaXRlbS5wb3NfeS1pdGVtLmhlaWdodCkgLyB0aGlzLm1zZ3NfY29udGVudC5oZWlnaHQ7XHJcblx0XHRcdFx0aWYocHJlY2VudD4xKXtcclxuXHRcdFx0XHRcdHByZWNlbnQgPSAxO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR0aGlzLnNjcm9sbHZpZXdfbWdzX3NjLnNjcm9sbFRvUGVyY2VudFZlcnRpY2FsKHByZWNlbnQsIDAuMSx0cnVlKTtcclxuXHRcdFx0XHRjbG9zZV9jYWxsYmFjaygpO1xyXG5cdFx0XHR9XHJcblx0XHR9LmJpbmQodGhpcywgaXRlbSksIDEpO1xyXG5cdH0sXHJcblxyXG5cdHNldFZpc2libGU6IGZ1bmN0aW9uIChzdGF0dXMscGFyYW1zKSB7XHJcblx0XHRpZiAodGhpcy5hY3RpdmVfc3RhdHVzID09IHN0YXR1cykge1xyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hY3RpdmVfc3RhdHVzID0gc3RhdHVzO1xyXG4gICAgICAgIGlmICh0aGlzLnJvb3Rfd25kKSB7XHJcbiAgICAgICAgICAgIHRoaXMucm9vdF93bmQuYWN0aXZlID0gc3RhdHVzO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmFzdFNob3dUaGVuSGlkZSA9IHN0YXR1cztcclxuICAgICAgICB9XHJcblx0XHRpZihzdGF0dXMgPT0gdHJ1ZSl7XHJcblx0XHRcdHRoaXMub3BlblJvb3RXbmQocGFyYW1zKTtcclxuXHRcdH1lbHNle1xyXG5cdFx0XHRpZih0aGlzLmNoYXRfZnJpZW5kcyl7XHJcblx0XHRcdFx0Zm9yKGxldCBpIGluIHRoaXMuY2hhdF9mcmllbmRzKXtcclxuXHRcdFx0XHRcdGxldCB2ID0gdGhpcy5jaGF0X2ZyaWVuZHNbaV07XHJcblx0XHRcdFx0XHRpZih2ICYmIHYuZGVsZXRlTWUpe1xyXG5cdFx0XHRcdFx0XHR2LmRlbGV0ZU1lKCk7XHJcblx0XHRcdFx0XHRcdHYgPSBudWxsXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHRoaXMuY2hhdF9mcmllbmRzID0ge307XHJcblx0XHRcdFx0dGhpcy5wcml2YXRlX3RhcmdldHMgPSBudWxsO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcbiAgICB9LFxyXG5cclxufSk7Il19
|