|
(function() {
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
var __module = nodeEnv ? module : {exports:{}};
|
var __filename = 'preview-scripts/assets/Scripts/mod/chat/chat_model.js';
|
var __require = nodeEnv ? function (request) {
|
return cc.require(request);
|
} : function (request) {
|
return __quick_compile_project__.require(request, __filename);
|
};
|
function __define (exports, require, module) {
|
if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict";
|
cc._RF.push(module, '0203cfpv4xJJ4a1YIssdxDX', 'chat_model');
|
// Scripts/mod/chat/chat_model.js
|
|
"use strict";
|
|
var ChatConst = require("chat_const");
|
|
var ChatEvent = require("chat_event");
|
|
var RoleController = require("role_controller");
|
|
var ChatModel = cc.Class({
|
"extends": BaseClass,
|
properties: {
|
stack_list: {
|
"default": {}
|
},
|
stack_limit: {
|
"default": {}
|
},
|
outline_msgs: {
|
"default": {}
|
},
|
private_targets: null,
|
// 私聊对象
|
role_vo: null
|
},
|
ctor: function ctor() {
|
this.ctrl = arguments[0];
|
},
|
initConfig: function initConfig() {
|
this.unread_msgs = {}; // 未读消息
|
|
for (var channel_i in ChatConst.Channel) {
|
this.unread_msgs[ChatConst.Channel[channel_i]] = 0;
|
}
|
|
for (var channelIndex in ChatConst.Channel) {
|
this.stack_list[channelIndex] = [];
|
}
|
},
|
initChatMsg: function initChatMsg() {},
|
// 添加私聊对象
|
addPrivateTarget: function addPrivateTarget(target_data) {
|
if (!target_data) return;
|
if (!this.private_targets) this.initPrivatreTargets();
|
|
for (var target_i in this.private_targets) {
|
if (this.private_targets[target_i] && this.private_targets[target_i].srv_id === target_data.srv_id && this.private_targets[target_i].rid === target_data.rid) return;
|
}
|
|
this.private_targets.push(target_data);
|
var role_vo = RoleController.getInstance().getRoleVo();
|
cc.sys.localStorage.setItem("rec_private" + role_vo.srv_id + role_vo.rid, JSON.stringify(this.private_targets));
|
},
|
deltePrivateTarget: function deltePrivateTarget(friend_vo) {
|
var role_vo = RoleController.getInstance().getRoleVo();
|
cc.sys.localStorage.removeItem("rec_private" + role_vo.srv_id + role_vo.rid);
|
var private_index = friend_vo.srv_id + friend_vo.rid;
|
var stack_list = cc.sys.localStorage.removeItem(role_vo.srv_id + role_vo.rid + private_index);
|
|
for (var target_i in this.private_targets) {
|
var target_data = this.private_targets[target_i];
|
var target_index = target_data.srv_id + target_data.rid;
|
|
if (private_index == target_index) {
|
this.private_targets.splice(target_i, 1);
|
}
|
}
|
|
delete this.stack_list[private_index];
|
},
|
getPrivateTarget: function getPrivateTarget(rid) {
|
if (rid) {
|
for (var friend_i in this.private_targets) {
|
if (this.private_targets[friend_i].rid == rid) {
|
return this.private_targets[friend_i];
|
}
|
}
|
}
|
},
|
// 获取所有私聊对象
|
getPrivateTargets: function getPrivateTargets() {
|
if (!this.private_targets) this.initPrivatreTargets();
|
cc.log(this.private_targets);
|
return this.private_targets;
|
},
|
initPrivatreTargets: function initPrivatreTargets() {
|
if (!this.private_targets) {
|
var role_vo = RoleController.getInstance().getRoleVo();
|
var targets_info = cc.sys.localStorage.getItem("rec_private" + role_vo.srv_id + role_vo.rid);
|
|
if (targets_info) {
|
this.private_targets = JSON.parse(targets_info);
|
} else {
|
this.private_targets = [];
|
}
|
}
|
},
|
// 从本地初始化私聊消息
|
initPrivateMsg: function initPrivateMsg(private_index) {
|
if (!private_index) return;
|
var role_vo = RoleController.getInstance().getRoleVo();
|
var stack_list = JSON.parse(cc.sys.localStorage.getItem(role_vo.srv_id + role_vo.rid + private_index));
|
this.stack_list[private_index] = stack_list || [];
|
},
|
// 添加通用消息
|
addNormalChatMsg: function addNormalChatMsg(channel, msgData) {
|
if (!channel || !msgData) return;
|
|
if (channel == 48) {
|
//传闻左下和顶 暂时处理为普通传闻
|
channel = ChatConst.Channel.System;
|
msgData.channel = channel;
|
}
|
|
var channel_index = this.getChannelIndex(channel);
|
if (!channel_index) return;
|
var add_unread = true;
|
|
if (this.stack_list[channel_index].length > ChatConst.ChannelLimit[channel_index]) {
|
var msg_data = this.stack_list[channel_index].shift();
|
gcore.GlobalEvent.fire(ChatEvent.MassageDelete, msg_data);
|
if (this.unread_msgs[channel] >= ChatConst.ChannelLimit[channel_index]) add_unread = false;
|
}
|
|
msgData.id = this.ctrl.getUniqueId();
|
this.stack_list[channel_index].push(msgData);
|
if (msgData.flag !== 1 && add_unread) this.addUnreadNum(channel);
|
gcore.GlobalEvent.fire(ChatEvent.MassageUpdate, msgData);
|
},
|
// 添加离线私聊消息
|
addOutlinePrivateMsg: function addOutlinePrivateMsg(msg_data) {
|
var private_index = msg_data.srv_id + msg_data.rid;
|
if (!this.outline_msgs[private_index]) this.outline_msgs[private_index] = [];
|
this.outline_msgs[private_index].push(msg_data);
|
this.addUnreadNum(ChatConst.Channel.Friend);
|
},
|
// 添加私聊消息
|
addPrivateMsg: function addPrivateMsg(msg_data, had_read) {
|
if (!msg_data) return;
|
|
if (msg_data instanceof Array) {
|
for (var msg_i in msg_data) {
|
this.addPrivateMsg(msg_data[msg_i]);
|
}
|
} else {
|
// 判断是否有私聊对象
|
var have_target = false;
|
|
for (var target_i in this.private_targets) {
|
if (this.private_targets[target_i].rid == msg_data.rid) {
|
have_target = true;
|
break;
|
}
|
}
|
|
if (!have_target) {
|
var FriendController = require("friend_controller");
|
|
var target_data = FriendController.getInstance().getModel().getFriendInfo(msg_data.srv_id, msg_data.rid);
|
|
if (target_data) {
|
this.addPrivateTarget(target_data);
|
}
|
}
|
|
var private_index = msg_data.srv_id + msg_data.rid;
|
if (!this.stack_list[private_index]) this.initPrivateMsg(private_index);
|
|
if (this.stack_list[private_index].length > ChatConst.ChannelLimit.Friend) {
|
var msg_data = this.stack_list[private_index].shift();
|
var notice_info = {};
|
notice_info.msg_data = msg_data;
|
notice_info.channel = ChatConst.Channel.Friend;
|
gcore.GlobalEvent.fire(ChatEvent.PrivateMassageDelete, notice_info);
|
}
|
|
var notice_info = {};
|
msg_data.id = this.ctrl.getUniqueId();
|
notice_info.msg_data = msg_data;
|
notice_info.channel = ChatConst.Channel.Friend;
|
this.stack_list[private_index].push(msg_data);
|
var role_vo = RoleController.getInstance().getRoleVo();
|
cc.sys.localStorage.setItem(role_vo.srv_id + role_vo.rid + private_index, JSON.stringify(this.stack_list[private_index]));
|
if (msg_data.flag !== 1 && !had_read) this.addUnreadNum(ChatConst.Channel.Friend);
|
gcore.GlobalEvent.fire(ChatEvent.PrivateMassageUpdate, notice_info);
|
}
|
},
|
// 获取私聊消息
|
getPrivateMsgs: function getPrivateMsgs(srv_id, rid) {
|
var private_index = srv_id + rid;
|
if (!this.stack_list[private_index]) this.initPrivateMsg(private_index);
|
|
if (this.outline_msgs[private_index] && this.outline_msgs[private_index].length > 0) {
|
while (this.outline_msgs[private_index].length > 0) {
|
var mes_data = this.outline_msgs[private_index].shift();
|
this.addPrivateMsg(mes_data, true);
|
}
|
|
this.ctrl.sender12723(srv_id, rid);
|
}
|
|
var sort_fun = function sort_fun(msg1, msg2) {
|
return msg1.tick - msg2.tick;
|
};
|
|
cc.log(this.stack_list[private_index].sort(sort_fun));
|
return this.stack_list[private_index].sort(sort_fun);
|
},
|
getChannelIndex: function getChannelIndex(channel) {
|
var channel_tag;
|
|
for (var channel_index in ChatConst.Channel) {
|
if (ChatConst.Channel[channel_index] == channel) channel_tag = channel_index;
|
}
|
|
return channel_tag;
|
},
|
getChannelMsgs: function getChannelMsgs(channel) {
|
var channel_index = this.getChannelIndex(channel);
|
if (this.stack_list[channel_index]) return this.stack_list[channel_index];
|
return {};
|
},
|
cleanUnredNum: function cleanUnredNum(channel) {
|
if (this.unread_msgs[channel] > 0) {
|
this.unread_msgs[channel] = 0;
|
gcore.GlobalEvent.fire(EventId.CHAT_NEWMSG_FLAG);
|
}
|
},
|
addUnreadNum: function addUnreadNum(channel, num) {
|
num = num || 1;
|
this.unread_msgs[channel] += num;
|
gcore.GlobalEvent.fire(EventId.CHAT_NEWMSG_FLAG);
|
},
|
getUnreadNum: function getUnreadNum(channel) {
|
if (channel) {
|
return this.unread_msgs[channel];
|
} else {
|
var total_num = 0;
|
var role_vo = RoleController.getInstance().getRoleVo();
|
|
for (var channel_i in this.unread_msgs) {
|
if (channel_i == 1024 && role_vo && role_vo.lev < 50 || channel_i == 4 && role_vo && !role_vo.gid) {
|
continue;
|
}
|
|
total_num += this.unread_msgs[channel_i];
|
}
|
|
return total_num;
|
}
|
|
return 0;
|
},
|
saveTalkTime: function saveTalkTime(srv_id, rid) {// var time = gcore.SmartSocket.getTime();
|
// var vo = require("role_controller").getInstance().getRoleVo();
|
// var key_str = cc.js.formatStr("%s_%s_%d","friend_info",vo.srv_id,vo.rid);
|
},
|
// 存一下最新的艾特数据
|
setAtData: function setAtData(data) {
|
this.at_data = data;
|
},
|
getAtData: function getAtData() {
|
return this.at_data;
|
}
|
});
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxjaGF0XFxjaGF0X21vZGVsLmpzIl0sIm5hbWVzIjpbIkNoYXRDb25zdCIsInJlcXVpcmUiLCJDaGF0RXZlbnQiLCJSb2xlQ29udHJvbGxlciIsIkNoYXRNb2RlbCIsImNjIiwiQ2xhc3MiLCJCYXNlQ2xhc3MiLCJwcm9wZXJ0aWVzIiwic3RhY2tfbGlzdCIsInN0YWNrX2xpbWl0Iiwib3V0bGluZV9tc2dzIiwicHJpdmF0ZV90YXJnZXRzIiwicm9sZV92byIsImN0b3IiLCJjdHJsIiwiYXJndW1lbnRzIiwiaW5pdENvbmZpZyIsInVucmVhZF9tc2dzIiwiY2hhbm5lbF9pIiwiQ2hhbm5lbCIsImNoYW5uZWxJbmRleCIsImluaXRDaGF0TXNnIiwiYWRkUHJpdmF0ZVRhcmdldCIsInRhcmdldF9kYXRhIiwiaW5pdFByaXZhdHJlVGFyZ2V0cyIsInRhcmdldF9pIiwic3J2X2lkIiwicmlkIiwicHVzaCIsImdldEluc3RhbmNlIiwiZ2V0Um9sZVZvIiwic3lzIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsIkpTT04iLCJzdHJpbmdpZnkiLCJkZWx0ZVByaXZhdGVUYXJnZXQiLCJmcmllbmRfdm8iLCJyZW1vdmVJdGVtIiwicHJpdmF0ZV9pbmRleCIsInRhcmdldF9pbmRleCIsInNwbGljZSIsImdldFByaXZhdGVUYXJnZXQiLCJmcmllbmRfaSIsImdldFByaXZhdGVUYXJnZXRzIiwibG9nIiwidGFyZ2V0c19pbmZvIiwiZ2V0SXRlbSIsInBhcnNlIiwiaW5pdFByaXZhdGVNc2ciLCJhZGROb3JtYWxDaGF0TXNnIiwiY2hhbm5lbCIsIm1zZ0RhdGEiLCJTeXN0ZW0iLCJjaGFubmVsX2luZGV4IiwiZ2V0Q2hhbm5lbEluZGV4IiwiYWRkX3VucmVhZCIsImxlbmd0aCIsIkNoYW5uZWxMaW1pdCIsIm1zZ19kYXRhIiwic2hpZnQiLCJnY29yZSIsIkdsb2JhbEV2ZW50IiwiZmlyZSIsIk1hc3NhZ2VEZWxldGUiLCJpZCIsImdldFVuaXF1ZUlkIiwiZmxhZyIsImFkZFVucmVhZE51bSIsIk1hc3NhZ2VVcGRhdGUiLCJhZGRPdXRsaW5lUHJpdmF0ZU1zZyIsIkZyaWVuZCIsImFkZFByaXZhdGVNc2ciLCJoYWRfcmVhZCIsIkFycmF5IiwibXNnX2kiLCJoYXZlX3RhcmdldCIsIkZyaWVuZENvbnRyb2xsZXIiLCJnZXRNb2RlbCIsImdldEZyaWVuZEluZm8iLCJub3RpY2VfaW5mbyIsIlByaXZhdGVNYXNzYWdlRGVsZXRlIiwiUHJpdmF0ZU1hc3NhZ2VVcGRhdGUiLCJnZXRQcml2YXRlTXNncyIsIm1lc19kYXRhIiwic2VuZGVyMTI3MjMiLCJzb3J0X2Z1biIsIm1zZzEiLCJtc2cyIiwidGljayIsInNvcnQiLCJjaGFubmVsX3RhZyIsImdldENoYW5uZWxNc2dzIiwiY2xlYW5VbnJlZE51bSIsIkV2ZW50SWQiLCJDSEFUX05FV01TR19GTEFHIiwibnVtIiwiZ2V0VW5yZWFkTnVtIiwidG90YWxfbnVtIiwibGV2IiwiZ2lkIiwic2F2ZVRhbGtUaW1lIiwic2V0QXREYXRhIiwiZGF0YSIsImF0X2RhdGEiLCJnZXRBdERhdGEiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBSUEsU0FBUyxHQUFHQyxPQUFPLENBQUMsWUFBRCxDQUF2Qjs7QUFDQSxJQUFJQyxTQUFTLEdBQUdELE9BQU8sQ0FBQyxZQUFELENBQXZCOztBQUNBLElBQUlFLGNBQWMsR0FBR0YsT0FBTyxDQUFDLGlCQUFELENBQTVCOztBQUVBLElBQUlHLFNBQVMsR0FBR0MsRUFBRSxDQUFDQyxLQUFILENBQVM7QUFDckIsYUFBU0MsU0FEWTtBQUdyQkMsRUFBQUEsVUFBVSxFQUFFO0FBQ1hDLElBQUFBLFVBQVUsRUFBRTtBQUNYLGlCQUFTO0FBREUsS0FERDtBQUlYQyxJQUFBQSxXQUFXLEVBQUU7QUFDWixpQkFBUztBQURHLEtBSkY7QUFPUkMsSUFBQUEsWUFBWSxFQUFFO0FBQ1YsaUJBQVM7QUFEQyxLQVBOO0FBVVJDLElBQUFBLGVBQWUsRUFBRSxJQVZUO0FBVWdCO0FBQ3hCQyxJQUFBQSxPQUFPLEVBQUU7QUFYRCxHQUhTO0FBaUJyQkMsRUFBQUEsSUFBSSxFQUFFLGdCQUFZO0FBQ2QsU0FBS0MsSUFBTCxHQUFZQyxTQUFTLENBQUMsQ0FBRCxDQUFyQjtBQUNILEdBbkJvQjtBQXFCckJDLEVBQUFBLFVBQVUsRUFBRSxzQkFBWTtBQUNwQixTQUFLQyxXQUFMLEdBQW1CLEVBQW5CLENBRG9CLENBQzBCOztBQUM5QyxTQUFLLElBQUlDLFNBQVQsSUFBc0JuQixTQUFTLENBQUNvQixPQUFoQyxFQUF5QztBQUNyQyxXQUFLRixXQUFMLENBQWlCbEIsU0FBUyxDQUFDb0IsT0FBVixDQUFrQkQsU0FBbEIsQ0FBakIsSUFBaUQsQ0FBakQ7QUFDSDs7QUFFRCxTQUFLLElBQUlFLFlBQVQsSUFBeUJyQixTQUFTLENBQUNvQixPQUFuQyxFQUE0QztBQUMzQyxXQUFLWCxVQUFMLENBQWdCWSxZQUFoQixJQUFnQyxFQUFoQztBQUNBO0FBQ0osR0E5Qm9CO0FBZ0NyQkMsRUFBQUEsV0FBVyxFQUFFLHVCQUFXLENBRXZCLENBbENvQjtBQW9DckI7QUFDQUMsRUFBQUEsZ0JBQWdCLEVBQUUsMEJBQVNDLFdBQVQsRUFBc0I7QUFDcEMsUUFBSSxDQUFDQSxXQUFMLEVBQWtCO0FBQ2xCLFFBQUksQ0FBQyxLQUFLWixlQUFWLEVBQTJCLEtBQUthLG1CQUFMOztBQUMzQixTQUFLLElBQUlDLFFBQVQsSUFBcUIsS0FBS2QsZUFBMUIsRUFBMkM7QUFDdkMsVUFBSSxLQUFLQSxlQUFMLENBQXFCYyxRQUFyQixLQUFrQyxLQUFLZCxlQUFMLENBQXFCYyxRQUFyQixFQUErQkMsTUFBL0IsS0FBMENILFdBQVcsQ0FBQ0csTUFBeEYsSUFBa0csS0FBS2YsZUFBTCxDQUFxQmMsUUFBckIsRUFBK0JFLEdBQS9CLEtBQXVDSixXQUFXLENBQUNJLEdBQXpKLEVBQ0k7QUFDUDs7QUFDRCxTQUFLaEIsZUFBTCxDQUFxQmlCLElBQXJCLENBQTBCTCxXQUExQjtBQUNBLFFBQUlYLE9BQU8sR0FBR1YsY0FBYyxDQUFDMkIsV0FBZixHQUE2QkMsU0FBN0IsRUFBZDtBQUNBMUIsSUFBQUEsRUFBRSxDQUFDMkIsR0FBSCxDQUFPQyxZQUFQLENBQW9CQyxPQUFwQixDQUE0QixnQkFBZ0JyQixPQUFPLENBQUNjLE1BQXhCLEdBQWlDZCxPQUFPLENBQUNlLEdBQXJFLEVBQTBFTyxJQUFJLENBQUNDLFNBQUwsQ0FBZSxLQUFLeEIsZUFBcEIsQ0FBMUU7QUFFSCxHQWhEb0I7QUFrRHJCeUIsRUFBQUEsa0JBQWtCLEVBQUUsNEJBQVNDLFNBQVQsRUFBb0I7QUFDcEMsUUFBSXpCLE9BQU8sR0FBR1YsY0FBYyxDQUFDMkIsV0FBZixHQUE2QkMsU0FBN0IsRUFBZDtBQUNBMUIsSUFBQUEsRUFBRSxDQUFDMkIsR0FBSCxDQUFPQyxZQUFQLENBQW9CTSxVQUFwQixDQUErQixnQkFBZ0IxQixPQUFPLENBQUNjLE1BQXhCLEdBQWlDZCxPQUFPLENBQUNlLEdBQXhFO0FBRUEsUUFBSVksYUFBYSxHQUFHRixTQUFTLENBQUNYLE1BQVYsR0FBbUJXLFNBQVMsQ0FBQ1YsR0FBakQ7QUFDQSxRQUFJbkIsVUFBVSxHQUFHSixFQUFFLENBQUMyQixHQUFILENBQU9DLFlBQVAsQ0FBb0JNLFVBQXBCLENBQStCMUIsT0FBTyxDQUFDYyxNQUFSLEdBQWlCZCxPQUFPLENBQUNlLEdBQXpCLEdBQStCWSxhQUE5RCxDQUFqQjs7QUFFQSxTQUFLLElBQUlkLFFBQVQsSUFBcUIsS0FBS2QsZUFBMUIsRUFBMkM7QUFDdkMsVUFBSVksV0FBVyxHQUFHLEtBQUtaLGVBQUwsQ0FBcUJjLFFBQXJCLENBQWxCO0FBQ0EsVUFBSWUsWUFBWSxHQUFHakIsV0FBVyxDQUFDRyxNQUFaLEdBQXFCSCxXQUFXLENBQUNJLEdBQXBEOztBQUNBLFVBQUlZLGFBQWEsSUFBSUMsWUFBckIsRUFBbUM7QUFDL0IsYUFBSzdCLGVBQUwsQ0FBcUI4QixNQUFyQixDQUE0QmhCLFFBQTVCLEVBQXNDLENBQXRDO0FBQ0g7QUFDSjs7QUFFRCxXQUFPLEtBQUtqQixVQUFMLENBQWdCK0IsYUFBaEIsQ0FBUDtBQUNILEdBbEVvQjtBQW9FckJHLEVBQUFBLGdCQUFnQixFQUFFLDBCQUFTZixHQUFULEVBQWM7QUFDNUIsUUFBSUEsR0FBSixFQUFTO0FBQ0wsV0FBSyxJQUFJZ0IsUUFBVCxJQUFxQixLQUFLaEMsZUFBMUIsRUFBMkM7QUFDdkMsWUFBSSxLQUFLQSxlQUFMLENBQXFCZ0MsUUFBckIsRUFBK0JoQixHQUEvQixJQUFzQ0EsR0FBMUMsRUFBK0M7QUFDM0MsaUJBQU8sS0FBS2hCLGVBQUwsQ0FBcUJnQyxRQUFyQixDQUFQO0FBQ0g7QUFDSjtBQUNKO0FBQ0osR0E1RW9CO0FBOEVyQjtBQUNBQyxFQUFBQSxpQkFBaUIsRUFBRSw2QkFBVztBQUMxQixRQUFJLENBQUMsS0FBS2pDLGVBQVYsRUFDSSxLQUFLYSxtQkFBTDtBQUVKcEIsSUFBQUEsRUFBRSxDQUFDeUMsR0FBSCxDQUFPLEtBQUtsQyxlQUFaO0FBRUEsV0FBTyxLQUFLQSxlQUFaO0FBQ0gsR0F0Rm9CO0FBd0ZyQmEsRUFBQUEsbUJBQW1CLEVBQUUsK0JBQVc7QUFFNUIsUUFBSSxDQUFDLEtBQUtiLGVBQVYsRUFBMkI7QUFDdkIsVUFBSUMsT0FBTyxHQUFHVixjQUFjLENBQUMyQixXQUFmLEdBQTZCQyxTQUE3QixFQUFkO0FBQ0EsVUFBSWdCLFlBQVksR0FBRzFDLEVBQUUsQ0FBQzJCLEdBQUgsQ0FBT0MsWUFBUCxDQUFvQmUsT0FBcEIsQ0FBNEIsZ0JBQWdCbkMsT0FBTyxDQUFDYyxNQUF4QixHQUFpQ2QsT0FBTyxDQUFDZSxHQUFyRSxDQUFuQjs7QUFDQSxVQUFJbUIsWUFBSixFQUFrQjtBQUNkLGFBQUtuQyxlQUFMLEdBQXVCdUIsSUFBSSxDQUFDYyxLQUFMLENBQVdGLFlBQVgsQ0FBdkI7QUFDSCxPQUZELE1BRU87QUFDSCxhQUFLbkMsZUFBTCxHQUF1QixFQUF2QjtBQUNIO0FBQ0o7QUFDSixHQW5Hb0I7QUFxR3JCO0FBQ0FzQyxFQUFBQSxjQUFjLEVBQUUsd0JBQVNWLGFBQVQsRUFBd0I7QUFDcEMsUUFBSSxDQUFDQSxhQUFMLEVBQW9CO0FBQ3BCLFFBQUkzQixPQUFPLEdBQUdWLGNBQWMsQ0FBQzJCLFdBQWYsR0FBNkJDLFNBQTdCLEVBQWQ7QUFDQSxRQUFJdEIsVUFBVSxHQUFHMEIsSUFBSSxDQUFDYyxLQUFMLENBQVc1QyxFQUFFLENBQUMyQixHQUFILENBQU9DLFlBQVAsQ0FBb0JlLE9BQXBCLENBQTRCbkMsT0FBTyxDQUFDYyxNQUFSLEdBQWlCZCxPQUFPLENBQUNlLEdBQXpCLEdBQStCWSxhQUEzRCxDQUFYLENBQWpCO0FBQ0EsU0FBSy9CLFVBQUwsQ0FBZ0IrQixhQUFoQixJQUFpQy9CLFVBQVUsSUFBSSxFQUEvQztBQUNILEdBM0dvQjtBQThHckI7QUFDQTBDLEVBQUFBLGdCQUFnQixFQUFFLDBCQUFTQyxPQUFULEVBQWtCQyxPQUFsQixFQUEyQjtBQUN6QyxRQUFJLENBQUNELE9BQUQsSUFBWSxDQUFDQyxPQUFqQixFQUEwQjs7QUFDMUIsUUFBR0QsT0FBTyxJQUFJLEVBQWQsRUFBaUI7QUFBQztBQUNkQSxNQUFBQSxPQUFPLEdBQUdwRCxTQUFTLENBQUNvQixPQUFWLENBQWtCa0MsTUFBNUI7QUFDQUQsTUFBQUEsT0FBTyxDQUFDRCxPQUFSLEdBQWtCQSxPQUFsQjtBQUNIOztBQUNELFFBQUlHLGFBQWEsR0FBRyxLQUFLQyxlQUFMLENBQXFCSixPQUFyQixDQUFwQjtBQUNBLFFBQUksQ0FBQ0csYUFBTCxFQUFvQjtBQUNwQixRQUFJRSxVQUFVLEdBQUcsSUFBakI7O0FBQ0EsUUFBSSxLQUFLaEQsVUFBTCxDQUFnQjhDLGFBQWhCLEVBQStCRyxNQUEvQixHQUF3QzFELFNBQVMsQ0FBQzJELFlBQVYsQ0FBdUJKLGFBQXZCLENBQTVDLEVBQW1GO0FBQy9FLFVBQUlLLFFBQVEsR0FBRyxLQUFLbkQsVUFBTCxDQUFnQjhDLGFBQWhCLEVBQStCTSxLQUEvQixFQUFmO0FBQ0FDLE1BQUFBLEtBQUssQ0FBQ0MsV0FBTixDQUFrQkMsSUFBbEIsQ0FBdUI5RCxTQUFTLENBQUMrRCxhQUFqQyxFQUFnREwsUUFBaEQ7QUFDQSxVQUFJLEtBQUsxQyxXQUFMLENBQWlCa0MsT0FBakIsS0FBNkJwRCxTQUFTLENBQUMyRCxZQUFWLENBQXVCSixhQUF2QixDQUFqQyxFQUNJRSxVQUFVLEdBQUcsS0FBYjtBQUNQOztBQUNESixJQUFBQSxPQUFPLENBQUNhLEVBQVIsR0FBYSxLQUFLbkQsSUFBTCxDQUFVb0QsV0FBVixFQUFiO0FBQ0EsU0FBSzFELFVBQUwsQ0FBZ0I4QyxhQUFoQixFQUErQjFCLElBQS9CLENBQW9Dd0IsT0FBcEM7QUFDQSxRQUFJQSxPQUFPLENBQUNlLElBQVIsS0FBaUIsQ0FBakIsSUFBc0JYLFVBQTFCLEVBQ0ksS0FBS1ksWUFBTCxDQUFrQmpCLE9BQWxCO0FBQ0pVLElBQUFBLEtBQUssQ0FBQ0MsV0FBTixDQUFrQkMsSUFBbEIsQ0FBdUI5RCxTQUFTLENBQUNvRSxhQUFqQyxFQUFnRGpCLE9BQWhEO0FBQ0gsR0FuSW9CO0FBcUlyQjtBQUNBa0IsRUFBQUEsb0JBQW9CLEVBQUUsOEJBQVNYLFFBQVQsRUFBbUI7QUFDckMsUUFBSXBCLGFBQWEsR0FBR29CLFFBQVEsQ0FBQ2pDLE1BQVQsR0FBa0JpQyxRQUFRLENBQUNoQyxHQUEvQztBQUNBLFFBQUksQ0FBQyxLQUFLakIsWUFBTCxDQUFrQjZCLGFBQWxCLENBQUwsRUFDSSxLQUFLN0IsWUFBTCxDQUFrQjZCLGFBQWxCLElBQW1DLEVBQW5DO0FBQ0osU0FBSzdCLFlBQUwsQ0FBa0I2QixhQUFsQixFQUFpQ1gsSUFBakMsQ0FBc0MrQixRQUF0QztBQUNBLFNBQUtTLFlBQUwsQ0FBa0JyRSxTQUFTLENBQUNvQixPQUFWLENBQWtCb0QsTUFBcEM7QUFDSCxHQTVJb0I7QUE4SXJCO0FBQ0FDLEVBQUFBLGFBQWEsRUFBRSx1QkFBU2IsUUFBVCxFQUFtQmMsUUFBbkIsRUFBNkI7QUFDeEMsUUFBSSxDQUFDZCxRQUFMLEVBQWU7O0FBQ2YsUUFBSUEsUUFBUSxZQUFZZSxLQUF4QixFQUErQjtBQUMzQixXQUFLLElBQUlDLEtBQVQsSUFBa0JoQixRQUFsQjtBQUNJLGFBQUthLGFBQUwsQ0FBbUJiLFFBQVEsQ0FBQ2dCLEtBQUQsQ0FBM0I7QUFESjtBQUVILEtBSEQsTUFHTztBQUNIO0FBQ0EsVUFBSUMsV0FBVyxHQUFHLEtBQWxCOztBQUNBLFdBQUssSUFBSW5ELFFBQVQsSUFBcUIsS0FBS2QsZUFBMUIsRUFBMkM7QUFDdkMsWUFBSSxLQUFLQSxlQUFMLENBQXFCYyxRQUFyQixFQUErQkUsR0FBL0IsSUFBc0NnQyxRQUFRLENBQUNoQyxHQUFuRCxFQUF3RDtBQUNwRGlELFVBQUFBLFdBQVcsR0FBRyxJQUFkO0FBQ0E7QUFDSDtBQUNKOztBQUVELFVBQUksQ0FBQ0EsV0FBTCxFQUFrQjtBQUNkLFlBQUlDLGdCQUFnQixHQUFHN0UsT0FBTyxDQUFDLG1CQUFELENBQTlCOztBQUNBLFlBQUl1QixXQUFXLEdBQUdzRCxnQkFBZ0IsQ0FBQ2hELFdBQWpCLEdBQStCaUQsUUFBL0IsR0FBMENDLGFBQTFDLENBQXdEcEIsUUFBUSxDQUFDakMsTUFBakUsRUFBeUVpQyxRQUFRLENBQUNoQyxHQUFsRixDQUFsQjs7QUFDQSxZQUFJSixXQUFKLEVBQWlCO0FBQ2IsZUFBS0QsZ0JBQUwsQ0FBc0JDLFdBQXRCO0FBQ0g7QUFDSjs7QUFFRCxVQUFJZ0IsYUFBYSxHQUFHb0IsUUFBUSxDQUFDakMsTUFBVCxHQUFrQmlDLFFBQVEsQ0FBQ2hDLEdBQS9DO0FBQ0EsVUFBSSxDQUFDLEtBQUtuQixVQUFMLENBQWdCK0IsYUFBaEIsQ0FBTCxFQUNJLEtBQUtVLGNBQUwsQ0FBb0JWLGFBQXBCOztBQUVKLFVBQUksS0FBSy9CLFVBQUwsQ0FBZ0IrQixhQUFoQixFQUErQmtCLE1BQS9CLEdBQXdDMUQsU0FBUyxDQUFDMkQsWUFBVixDQUF1QmEsTUFBbkUsRUFBMkU7QUFDdkUsWUFBSVosUUFBUSxHQUFHLEtBQUtuRCxVQUFMLENBQWdCK0IsYUFBaEIsRUFBK0JxQixLQUEvQixFQUFmO0FBQ0EsWUFBSW9CLFdBQVcsR0FBRyxFQUFsQjtBQUNBQSxRQUFBQSxXQUFXLENBQUNyQixRQUFaLEdBQXVCQSxRQUF2QjtBQUNBcUIsUUFBQUEsV0FBVyxDQUFDN0IsT0FBWixHQUFzQnBELFNBQVMsQ0FBQ29CLE9BQVYsQ0FBa0JvRCxNQUF4QztBQUNBVixRQUFBQSxLQUFLLENBQUNDLFdBQU4sQ0FBa0JDLElBQWxCLENBQXVCOUQsU0FBUyxDQUFDZ0Ysb0JBQWpDLEVBQXVERCxXQUF2RDtBQUNIOztBQUVELFVBQUlBLFdBQVcsR0FBRyxFQUFsQjtBQUNBckIsTUFBQUEsUUFBUSxDQUFDTSxFQUFULEdBQWMsS0FBS25ELElBQUwsQ0FBVW9ELFdBQVYsRUFBZDtBQUNBYyxNQUFBQSxXQUFXLENBQUNyQixRQUFaLEdBQXVCQSxRQUF2QjtBQUNBcUIsTUFBQUEsV0FBVyxDQUFDN0IsT0FBWixHQUFzQnBELFNBQVMsQ0FBQ29CLE9BQVYsQ0FBa0JvRCxNQUF4QztBQUNBLFdBQUsvRCxVQUFMLENBQWdCK0IsYUFBaEIsRUFBK0JYLElBQS9CLENBQW9DK0IsUUFBcEM7QUFFQSxVQUFJL0MsT0FBTyxHQUFHVixjQUFjLENBQUMyQixXQUFmLEdBQTZCQyxTQUE3QixFQUFkO0FBQ0ExQixNQUFBQSxFQUFFLENBQUMyQixHQUFILENBQU9DLFlBQVAsQ0FBb0JDLE9BQXBCLENBQTRCckIsT0FBTyxDQUFDYyxNQUFSLEdBQWlCZCxPQUFPLENBQUNlLEdBQXpCLEdBQStCWSxhQUEzRCxFQUEwRUwsSUFBSSxDQUFDQyxTQUFMLENBQWUsS0FBSzNCLFVBQUwsQ0FBZ0IrQixhQUFoQixDQUFmLENBQTFFO0FBRUEsVUFBSW9CLFFBQVEsQ0FBQ1EsSUFBVCxLQUFrQixDQUFsQixJQUF1QixDQUFDTSxRQUE1QixFQUNJLEtBQUtMLFlBQUwsQ0FBa0JyRSxTQUFTLENBQUNvQixPQUFWLENBQWtCb0QsTUFBcEM7QUFFSlYsTUFBQUEsS0FBSyxDQUFDQyxXQUFOLENBQWtCQyxJQUFsQixDQUF1QjlELFNBQVMsQ0FBQ2lGLG9CQUFqQyxFQUF1REYsV0FBdkQ7QUFDSDtBQUNKLEdBaE1vQjtBQWtNckI7QUFDQUcsRUFBQUEsY0FBYyxFQUFFLHdCQUFTekQsTUFBVCxFQUFpQkMsR0FBakIsRUFBc0I7QUFDbEMsUUFBSVksYUFBYSxHQUFHYixNQUFNLEdBQUdDLEdBQTdCO0FBQ0EsUUFBSSxDQUFDLEtBQUtuQixVQUFMLENBQWdCK0IsYUFBaEIsQ0FBTCxFQUNJLEtBQUtVLGNBQUwsQ0FBb0JWLGFBQXBCOztBQUVKLFFBQUksS0FBSzdCLFlBQUwsQ0FBa0I2QixhQUFsQixLQUFvQyxLQUFLN0IsWUFBTCxDQUFrQjZCLGFBQWxCLEVBQWlDa0IsTUFBakMsR0FBMEMsQ0FBbEYsRUFBcUY7QUFDakYsYUFBTSxLQUFLL0MsWUFBTCxDQUFrQjZCLGFBQWxCLEVBQWlDa0IsTUFBakMsR0FBMEMsQ0FBaEQsRUFBbUQ7QUFDL0MsWUFBSTJCLFFBQVEsR0FBRyxLQUFLMUUsWUFBTCxDQUFrQjZCLGFBQWxCLEVBQWlDcUIsS0FBakMsRUFBZjtBQUNBLGFBQUtZLGFBQUwsQ0FBbUJZLFFBQW5CLEVBQTZCLElBQTdCO0FBQ0g7O0FBQ0QsV0FBS3RFLElBQUwsQ0FBVXVFLFdBQVYsQ0FBc0IzRCxNQUF0QixFQUE4QkMsR0FBOUI7QUFDSDs7QUFFRCxRQUFJMkQsUUFBUSxHQUFHLFNBQVhBLFFBQVcsQ0FBU0MsSUFBVCxFQUFlQyxJQUFmLEVBQXFCO0FBQ2hDLGFBQU9ELElBQUksQ0FBQ0UsSUFBTCxHQUFZRCxJQUFJLENBQUNDLElBQXhCO0FBQ0gsS0FGRDs7QUFJQXJGLElBQUFBLEVBQUUsQ0FBQ3lDLEdBQUgsQ0FBTyxLQUFLckMsVUFBTCxDQUFnQitCLGFBQWhCLEVBQStCbUQsSUFBL0IsQ0FBb0NKLFFBQXBDLENBQVA7QUFDQSxXQUFPLEtBQUs5RSxVQUFMLENBQWdCK0IsYUFBaEIsRUFBK0JtRCxJQUEvQixDQUFvQ0osUUFBcEMsQ0FBUDtBQUNILEdBdE5vQjtBQXdOckIvQixFQUFBQSxlQUFlLEVBQUUseUJBQVNKLE9BQVQsRUFBa0I7QUFDbEMsUUFBSXdDLFdBQUo7O0FBQ0EsU0FBSyxJQUFJckMsYUFBVCxJQUEwQnZELFNBQVMsQ0FBQ29CLE9BQXBDLEVBQTZDO0FBQzVDLFVBQUlwQixTQUFTLENBQUNvQixPQUFWLENBQWtCbUMsYUFBbEIsS0FBb0NILE9BQXhDLEVBQWlEd0MsV0FBVyxHQUFHckMsYUFBZDtBQUNqRDs7QUFDRCxXQUFPcUMsV0FBUDtBQUNBLEdBOU5vQjtBQWdPckJDLEVBQUFBLGNBQWMsRUFBRSx3QkFBU3pDLE9BQVQsRUFBa0I7QUFDakMsUUFBSUcsYUFBYSxHQUFHLEtBQUtDLGVBQUwsQ0FBcUJKLE9BQXJCLENBQXBCO0FBQ0EsUUFBSSxLQUFLM0MsVUFBTCxDQUFnQjhDLGFBQWhCLENBQUosRUFBb0MsT0FBTyxLQUFLOUMsVUFBTCxDQUFnQjhDLGFBQWhCLENBQVA7QUFDcEMsV0FBTyxFQUFQO0FBQ0EsR0FwT29CO0FBc09yQnVDLEVBQUFBLGFBQWEsRUFBRSx1QkFBUzFDLE9BQVQsRUFBa0I7QUFDN0IsUUFBSSxLQUFLbEMsV0FBTCxDQUFpQmtDLE9BQWpCLElBQTRCLENBQWhDLEVBQW1DO0FBQy9CLFdBQUtsQyxXQUFMLENBQWlCa0MsT0FBakIsSUFBNEIsQ0FBNUI7QUFDQVUsTUFBQUEsS0FBSyxDQUFDQyxXQUFOLENBQWtCQyxJQUFsQixDQUF1QitCLE9BQU8sQ0FBQ0MsZ0JBQS9CO0FBQ0g7QUFDSixHQTNPb0I7QUE2T3JCM0IsRUFBQUEsWUFBWSxFQUFFLHNCQUFTakIsT0FBVCxFQUFrQjZDLEdBQWxCLEVBQXVCO0FBQ2pDQSxJQUFBQSxHQUFHLEdBQUdBLEdBQUcsSUFBSSxDQUFiO0FBQ0EsU0FBSy9FLFdBQUwsQ0FBaUJrQyxPQUFqQixLQUE2QjZDLEdBQTdCO0FBRUFuQyxJQUFBQSxLQUFLLENBQUNDLFdBQU4sQ0FBa0JDLElBQWxCLENBQXVCK0IsT0FBTyxDQUFDQyxnQkFBL0I7QUFDSCxHQWxQb0I7QUFvUHJCRSxFQUFBQSxZQUFZLEVBQUUsc0JBQVM5QyxPQUFULEVBQWtCO0FBQzVCLFFBQUlBLE9BQUosRUFBYTtBQUNWLGFBQU8sS0FBS2xDLFdBQUwsQ0FBaUJrQyxPQUFqQixDQUFQO0FBQ0YsS0FGRCxNQUVPO0FBQ0gsVUFBSStDLFNBQVMsR0FBRyxDQUFoQjtBQUNBLFVBQUl0RixPQUFPLEdBQUdWLGNBQWMsQ0FBQzJCLFdBQWYsR0FBNkJDLFNBQTdCLEVBQWQ7O0FBQ0EsV0FBSyxJQUFJWixTQUFULElBQXNCLEtBQUtELFdBQTNCLEVBQXdDO0FBQ3BDLFlBQUtDLFNBQVMsSUFBSSxJQUFiLElBQXFCTixPQUFyQixJQUFnQ0EsT0FBTyxDQUFDdUYsR0FBUixHQUFjLEVBQS9DLElBQXVEakYsU0FBUyxJQUFJLENBQWIsSUFBa0JOLE9BQWxCLElBQTZCLENBQUNBLE9BQU8sQ0FBQ3dGLEdBQWpHLEVBQXVHO0FBQ25HO0FBQ0g7O0FBQ0RGLFFBQUFBLFNBQVMsSUFBSSxLQUFLakYsV0FBTCxDQUFpQkMsU0FBakIsQ0FBYjtBQUNIOztBQUNELGFBQU9nRixTQUFQO0FBQ0g7O0FBQ0QsV0FBTyxDQUFQO0FBQ0gsR0FuUW9CO0FBcVFyQkcsRUFBQUEsWUFBWSxFQUFDLHNCQUFTM0UsTUFBVCxFQUFnQkMsR0FBaEIsRUFBb0IsQ0FDN0I7QUFDQTtBQUNBO0FBRUgsR0ExUW9CO0FBNFFyQjtBQUNBMkUsRUFBQUEsU0FBUyxFQUFDLG1CQUFVQyxJQUFWLEVBQWdCO0FBQ3RCLFNBQUtDLE9BQUwsR0FBZUQsSUFBZjtBQUNILEdBL1FvQjtBQWlSckJFLEVBQUFBLFNBQVMsRUFBQyxxQkFBWTtBQUNsQixXQUFPLEtBQUtELE9BQVo7QUFDSDtBQW5Sb0IsQ0FBVCxDQUFoQiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsidmFyIENoYXRDb25zdCA9IHJlcXVpcmUoXCJjaGF0X2NvbnN0XCIpO1xyXG52YXIgQ2hhdEV2ZW50ID0gcmVxdWlyZShcImNoYXRfZXZlbnRcIik7XHJcbnZhciBSb2xlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJyb2xlX2NvbnRyb2xsZXJcIilcclxuXHJcbnZhciBDaGF0TW9kZWwgPSBjYy5DbGFzcyh7XHJcbiAgICBleHRlbmRzOiBCYXNlQ2xhc3MsXHJcblxyXG4gICAgcHJvcGVydGllczoge1xyXG4gICAgXHRzdGFja19saXN0OiB7XHJcbiAgICBcdFx0ZGVmYXVsdDoge31cclxuICAgIFx0fSxcclxuICAgIFx0c3RhY2tfbGltaXQ6IHtcclxuICAgIFx0XHRkZWZhdWx0OiB7fVxyXG4gICAgXHR9LFxyXG4gICAgICAgIG91dGxpbmVfbXNnczoge1xyXG4gICAgICAgICAgICBkZWZhdWx0OiB7fVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcHJpdmF0ZV90YXJnZXRzOiBudWxsLCAgLy8g56eB6IGK5a+56LGhXHJcbiAgICAgICAgcm9sZV92bzogbnVsbCxcclxuICAgIH0sXHJcblxyXG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuY3RybCA9IGFyZ3VtZW50c1swXTtcclxuICAgIH0sXHJcblxyXG4gICAgaW5pdENvbmZpZzogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMudW5yZWFkX21zZ3MgPSB7fTsgICAgICAgICAgICAgICAgICAgICAgICAvLyDmnKror7vmtojmga9cclxuICAgICAgICBmb3IgKHZhciBjaGFubmVsX2kgaW4gQ2hhdENvbnN0LkNoYW5uZWwpIHtcclxuICAgICAgICAgICAgdGhpcy51bnJlYWRfbXNnc1tDaGF0Q29uc3QuQ2hhbm5lbFtjaGFubmVsX2ldXSA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKHZhciBjaGFubmVsSW5kZXggaW4gQ2hhdENvbnN0LkNoYW5uZWwpIHtcclxuICAgICAgICBcdHRoaXMuc3RhY2tfbGlzdFtjaGFubmVsSW5kZXhdID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBpbml0Q2hhdE1zZzogZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvLyDmt7vliqDnp4HogYrlr7nosaFcclxuICAgIGFkZFByaXZhdGVUYXJnZXQ6IGZ1bmN0aW9uKHRhcmdldF9kYXRhKSB7XHJcbiAgICAgICAgaWYgKCF0YXJnZXRfZGF0YSkgcmV0dXJuO1xyXG4gICAgICAgIGlmICghdGhpcy5wcml2YXRlX3RhcmdldHMpIHRoaXMuaW5pdFByaXZhdHJlVGFyZ2V0cygpO1xyXG4gICAgICAgIGZvciAodmFyIHRhcmdldF9pIGluIHRoaXMucHJpdmF0ZV90YXJnZXRzKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnByaXZhdGVfdGFyZ2V0c1t0YXJnZXRfaV0gJiYgdGhpcy5wcml2YXRlX3RhcmdldHNbdGFyZ2V0X2ldLnNydl9pZCA9PT0gdGFyZ2V0X2RhdGEuc3J2X2lkICYmIHRoaXMucHJpdmF0ZV90YXJnZXRzW3RhcmdldF9pXS5yaWQgPT09IHRhcmdldF9kYXRhLnJpZClcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5wcml2YXRlX3RhcmdldHMucHVzaCh0YXJnZXRfZGF0YSk7XHJcbiAgICAgICAgdmFyIHJvbGVfdm8gPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpO1xyXG4gICAgICAgIGNjLnN5cy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcInJlY19wcml2YXRlXCIgKyByb2xlX3ZvLnNydl9pZCArIHJvbGVfdm8ucmlkLCBKU09OLnN0cmluZ2lmeSh0aGlzLnByaXZhdGVfdGFyZ2V0cykpO1xyXG4gICAgICAgIFxyXG4gICAgfSxcclxuXHJcbiAgICBkZWx0ZVByaXZhdGVUYXJnZXQ6IGZ1bmN0aW9uKGZyaWVuZF92bykge1xyXG4gICAgICAgIHZhciByb2xlX3ZvID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcclxuICAgICAgICBjYy5zeXMubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJyZWNfcHJpdmF0ZVwiICsgcm9sZV92by5zcnZfaWQgKyByb2xlX3ZvLnJpZCk7XHJcblxyXG4gICAgICAgIHZhciBwcml2YXRlX2luZGV4ID0gZnJpZW5kX3ZvLnNydl9pZCArIGZyaWVuZF92by5yaWQ7XHJcbiAgICAgICAgdmFyIHN0YWNrX2xpc3QgPSBjYy5zeXMubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0ocm9sZV92by5zcnZfaWQgKyByb2xlX3ZvLnJpZCArIHByaXZhdGVfaW5kZXgpO1xyXG5cclxuICAgICAgICBmb3IgKHZhciB0YXJnZXRfaSBpbiB0aGlzLnByaXZhdGVfdGFyZ2V0cykge1xyXG4gICAgICAgICAgICB2YXIgdGFyZ2V0X2RhdGEgPSB0aGlzLnByaXZhdGVfdGFyZ2V0c1t0YXJnZXRfaV07XHJcbiAgICAgICAgICAgIHZhciB0YXJnZXRfaW5kZXggPSB0YXJnZXRfZGF0YS5zcnZfaWQgKyB0YXJnZXRfZGF0YS5yaWQ7XHJcbiAgICAgICAgICAgIGlmIChwcml2YXRlX2luZGV4ID09IHRhcmdldF9pbmRleCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcml2YXRlX3RhcmdldHMuc3BsaWNlKHRhcmdldF9pLCAxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGVsZXRlIHRoaXMuc3RhY2tfbGlzdFtwcml2YXRlX2luZGV4XVxyXG4gICAgfSxcclxuXHJcbiAgICBnZXRQcml2YXRlVGFyZ2V0OiBmdW5jdGlvbihyaWQpIHtcclxuICAgICAgICBpZiAocmlkKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGZyaWVuZF9pIGluIHRoaXMucHJpdmF0ZV90YXJnZXRzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wcml2YXRlX3RhcmdldHNbZnJpZW5kX2ldLnJpZCA9PSByaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcml2YXRlX3RhcmdldHNbZnJpZW5kX2ldXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIOiOt+WPluaJgOacieengeiBiuWvueixoVxyXG4gICAgZ2V0UHJpdmF0ZVRhcmdldHM6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5wcml2YXRlX3RhcmdldHMpXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdFByaXZhdHJlVGFyZ2V0cygpO1xyXG5cclxuICAgICAgICBjYy5sb2codGhpcy5wcml2YXRlX3RhcmdldHMpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wcml2YXRlX3RhcmdldHNcclxuICAgIH0sXHJcblxyXG4gICAgaW5pdFByaXZhdHJlVGFyZ2V0czogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICBpZiAoIXRoaXMucHJpdmF0ZV90YXJnZXRzKSB7XHJcbiAgICAgICAgICAgIHZhciByb2xlX3ZvID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcclxuICAgICAgICAgICAgdmFyIHRhcmdldHNfaW5mbyA9IGNjLnN5cy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInJlY19wcml2YXRlXCIgKyByb2xlX3ZvLnNydl9pZCArIHJvbGVfdm8ucmlkKTtcclxuICAgICAgICAgICAgaWYgKHRhcmdldHNfaW5mbykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcml2YXRlX3RhcmdldHMgPSBKU09OLnBhcnNlKHRhcmdldHNfaW5mbyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByaXZhdGVfdGFyZ2V0cyA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvLyDku47mnKzlnLDliJ3lp4vljJbnp4HogYrmtojmga8gXHJcbiAgICBpbml0UHJpdmF0ZU1zZzogZnVuY3Rpb24ocHJpdmF0ZV9pbmRleCkge1xyXG4gICAgICAgIGlmICghcHJpdmF0ZV9pbmRleCkgcmV0dXJuO1xyXG4gICAgICAgIHZhciByb2xlX3ZvID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcclxuICAgICAgICB2YXIgc3RhY2tfbGlzdCA9IEpTT04ucGFyc2UoY2Muc3lzLmxvY2FsU3RvcmFnZS5nZXRJdGVtKHJvbGVfdm8uc3J2X2lkICsgcm9sZV92by5yaWQgKyBwcml2YXRlX2luZGV4KSk7XHJcbiAgICAgICAgdGhpcy5zdGFja19saXN0W3ByaXZhdGVfaW5kZXhdID0gc3RhY2tfbGlzdCB8fCBbXTtcclxuICAgIH0sXHJcblxyXG5cclxuICAgIC8vIOa3u+WKoOmAmueUqOa2iOaBr1xyXG4gICAgYWRkTm9ybWFsQ2hhdE1zZzogZnVuY3Rpb24oY2hhbm5lbCwgbXNnRGF0YSkge1xyXG4gICAgICAgIGlmICghY2hhbm5lbCB8fCAhbXNnRGF0YSkgcmV0dXJuO1xyXG4gICAgICAgIGlmKGNoYW5uZWwgPT0gNDgpey8v5Lyg6Ze75bem5LiL5ZKM6aG2IOaaguaXtuWkhOeQhuS4uuaZrumAmuS8oOmXu1xyXG4gICAgICAgICAgICBjaGFubmVsID0gQ2hhdENvbnN0LkNoYW5uZWwuU3lzdGVtO1xyXG4gICAgICAgICAgICBtc2dEYXRhLmNoYW5uZWwgPSBjaGFubmVsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgY2hhbm5lbF9pbmRleCA9IHRoaXMuZ2V0Q2hhbm5lbEluZGV4KGNoYW5uZWwpO1xyXG4gICAgICAgIGlmICghY2hhbm5lbF9pbmRleCkgcmV0dXJuO1xyXG4gICAgICAgIHZhciBhZGRfdW5yZWFkID0gdHJ1ZTtcclxuICAgICAgICBpZiAodGhpcy5zdGFja19saXN0W2NoYW5uZWxfaW5kZXhdLmxlbmd0aCA+IENoYXRDb25zdC5DaGFubmVsTGltaXRbY2hhbm5lbF9pbmRleF0pIHtcclxuICAgICAgICAgICAgdmFyIG1zZ19kYXRhID0gdGhpcy5zdGFja19saXN0W2NoYW5uZWxfaW5kZXhdLnNoaWZ0KCk7XHJcbiAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoQ2hhdEV2ZW50Lk1hc3NhZ2VEZWxldGUsIG1zZ19kYXRhKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMudW5yZWFkX21zZ3NbY2hhbm5lbF0gPj0gQ2hhdENvbnN0LkNoYW5uZWxMaW1pdFtjaGFubmVsX2luZGV4XSlcclxuICAgICAgICAgICAgICAgIGFkZF91bnJlYWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbXNnRGF0YS5pZCA9IHRoaXMuY3RybC5nZXRVbmlxdWVJZCgpO1xyXG4gICAgICAgIHRoaXMuc3RhY2tfbGlzdFtjaGFubmVsX2luZGV4XS5wdXNoKG1zZ0RhdGEpO1xyXG4gICAgICAgIGlmIChtc2dEYXRhLmZsYWcgIT09IDEgJiYgYWRkX3VucmVhZClcclxuICAgICAgICAgICAgdGhpcy5hZGRVbnJlYWROdW0oY2hhbm5lbCk7XHJcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShDaGF0RXZlbnQuTWFzc2FnZVVwZGF0ZSwgbXNnRGF0YSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIOa3u+WKoOemu+e6v+engeiBiua2iOaBr1xyXG4gICAgYWRkT3V0bGluZVByaXZhdGVNc2c6IGZ1bmN0aW9uKG1zZ19kYXRhKSB7XHJcbiAgICAgICAgdmFyIHByaXZhdGVfaW5kZXggPSBtc2dfZGF0YS5zcnZfaWQgKyBtc2dfZGF0YS5yaWQ7XHJcbiAgICAgICAgaWYgKCF0aGlzLm91dGxpbmVfbXNnc1twcml2YXRlX2luZGV4XSlcclxuICAgICAgICAgICAgdGhpcy5vdXRsaW5lX21zZ3NbcHJpdmF0ZV9pbmRleF0gPSBbXTtcclxuICAgICAgICB0aGlzLm91dGxpbmVfbXNnc1twcml2YXRlX2luZGV4XS5wdXNoKG1zZ19kYXRhKTtcclxuICAgICAgICB0aGlzLmFkZFVucmVhZE51bShDaGF0Q29uc3QuQ2hhbm5lbC5GcmllbmQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyDmt7vliqDnp4HogYrmtojmga9cclxuICAgIGFkZFByaXZhdGVNc2c6IGZ1bmN0aW9uKG1zZ19kYXRhLCBoYWRfcmVhZCkge1xyXG4gICAgICAgIGlmICghbXNnX2RhdGEpIHJldHVyblxyXG4gICAgICAgIGlmIChtc2dfZGF0YSBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIG1zZ19pIGluIG1zZ19kYXRhKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRQcml2YXRlTXNnKG1zZ19kYXRhW21zZ19pXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8g5Yik5pat5piv5ZCm5pyJ56eB6IGK5a+56LGhXHJcbiAgICAgICAgICAgIHZhciBoYXZlX3RhcmdldCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBmb3IgKHZhciB0YXJnZXRfaSBpbiB0aGlzLnByaXZhdGVfdGFyZ2V0cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJpdmF0ZV90YXJnZXRzW3RhcmdldF9pXS5yaWQgPT0gbXNnX2RhdGEucmlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaGF2ZV90YXJnZXQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWhhdmVfdGFyZ2V0KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgRnJpZW5kQ29udHJvbGxlciA9IHJlcXVpcmUoXCJmcmllbmRfY29udHJvbGxlclwiKTtcclxuICAgICAgICAgICAgICAgIHZhciB0YXJnZXRfZGF0YSA9IEZyaWVuZENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldEZyaWVuZEluZm8obXNnX2RhdGEuc3J2X2lkLCBtc2dfZGF0YS5yaWQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldF9kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRQcml2YXRlVGFyZ2V0KHRhcmdldF9kYXRhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIHByaXZhdGVfaW5kZXggPSBtc2dfZGF0YS5zcnZfaWQgKyBtc2dfZGF0YS5yaWRcclxuICAgICAgICAgICAgaWYgKCF0aGlzLnN0YWNrX2xpc3RbcHJpdmF0ZV9pbmRleF0pXHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRQcml2YXRlTXNnKHByaXZhdGVfaW5kZXgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2tfbGlzdFtwcml2YXRlX2luZGV4XS5sZW5ndGggPiBDaGF0Q29uc3QuQ2hhbm5lbExpbWl0LkZyaWVuZCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG1zZ19kYXRhID0gdGhpcy5zdGFja19saXN0W3ByaXZhdGVfaW5kZXhdLnNoaWZ0KCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgbm90aWNlX2luZm8gPSB7fTtcclxuICAgICAgICAgICAgICAgIG5vdGljZV9pbmZvLm1zZ19kYXRhID0gbXNnX2RhdGE7XHJcbiAgICAgICAgICAgICAgICBub3RpY2VfaW5mby5jaGFubmVsID0gQ2hhdENvbnN0LkNoYW5uZWwuRnJpZW5kO1xyXG4gICAgICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShDaGF0RXZlbnQuUHJpdmF0ZU1hc3NhZ2VEZWxldGUsIG5vdGljZV9pbmZvKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIG5vdGljZV9pbmZvID0ge307XHJcbiAgICAgICAgICAgIG1zZ19kYXRhLmlkID0gdGhpcy5jdHJsLmdldFVuaXF1ZUlkKCk7XHJcbiAgICAgICAgICAgIG5vdGljZV9pbmZvLm1zZ19kYXRhID0gbXNnX2RhdGE7XHJcbiAgICAgICAgICAgIG5vdGljZV9pbmZvLmNoYW5uZWwgPSBDaGF0Q29uc3QuQ2hhbm5lbC5GcmllbmQ7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhY2tfbGlzdFtwcml2YXRlX2luZGV4XS5wdXNoKG1zZ19kYXRhKTtcclxuXHJcbiAgICAgICAgICAgIHZhciByb2xlX3ZvID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcclxuICAgICAgICAgICAgY2Muc3lzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKHJvbGVfdm8uc3J2X2lkICsgcm9sZV92by5yaWQgKyBwcml2YXRlX2luZGV4LCBKU09OLnN0cmluZ2lmeSh0aGlzLnN0YWNrX2xpc3RbcHJpdmF0ZV9pbmRleF0pKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChtc2dfZGF0YS5mbGFnICE9PSAxICYmICFoYWRfcmVhZClcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkVW5yZWFkTnVtKENoYXRDb25zdC5DaGFubmVsLkZyaWVuZCk7XHJcblxyXG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKENoYXRFdmVudC5Qcml2YXRlTWFzc2FnZVVwZGF0ZSwgbm90aWNlX2luZm8pO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLy8g6I635Y+W56eB6IGK5raI5oGvXHJcbiAgICBnZXRQcml2YXRlTXNnczogZnVuY3Rpb24oc3J2X2lkLCByaWQpIHtcclxuICAgICAgICB2YXIgcHJpdmF0ZV9pbmRleCA9IHNydl9pZCArIHJpZDtcclxuICAgICAgICBpZiAoIXRoaXMuc3RhY2tfbGlzdFtwcml2YXRlX2luZGV4XSlcclxuICAgICAgICAgICAgdGhpcy5pbml0UHJpdmF0ZU1zZyhwcml2YXRlX2luZGV4KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMub3V0bGluZV9tc2dzW3ByaXZhdGVfaW5kZXhdICYmIHRoaXMub3V0bGluZV9tc2dzW3ByaXZhdGVfaW5kZXhdLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgd2hpbGUodGhpcy5vdXRsaW5lX21zZ3NbcHJpdmF0ZV9pbmRleF0ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG1lc19kYXRhID0gdGhpcy5vdXRsaW5lX21zZ3NbcHJpdmF0ZV9pbmRleF0uc2hpZnQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkUHJpdmF0ZU1zZyhtZXNfZGF0YSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5jdHJsLnNlbmRlcjEyNzIzKHNydl9pZCwgcmlkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBzb3J0X2Z1biA9IGZ1bmN0aW9uKG1zZzEsIG1zZzIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG1zZzEudGljayAtIG1zZzIudGljaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNjLmxvZyh0aGlzLnN0YWNrX2xpc3RbcHJpdmF0ZV9pbmRleF0uc29ydChzb3J0X2Z1bikpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0YWNrX2xpc3RbcHJpdmF0ZV9pbmRleF0uc29ydChzb3J0X2Z1bik7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldENoYW5uZWxJbmRleDogZnVuY3Rpb24oY2hhbm5lbCkge1xyXG4gICAgXHR2YXIgY2hhbm5lbF90YWc7XHJcbiAgICBcdGZvciAodmFyIGNoYW5uZWxfaW5kZXggaW4gQ2hhdENvbnN0LkNoYW5uZWwpIHtcclxuICAgIFx0XHRpZiAoQ2hhdENvbnN0LkNoYW5uZWxbY2hhbm5lbF9pbmRleF0gPT0gY2hhbm5lbCkgY2hhbm5lbF90YWcgPSBjaGFubmVsX2luZGV4O1xyXG4gICAgXHR9XHJcbiAgICBcdHJldHVybiBjaGFubmVsX3RhZztcclxuICAgIH0sXHJcblxyXG4gICAgZ2V0Q2hhbm5lbE1zZ3M6IGZ1bmN0aW9uKGNoYW5uZWwpIHtcclxuICAgIFx0dmFyIGNoYW5uZWxfaW5kZXggPSB0aGlzLmdldENoYW5uZWxJbmRleChjaGFubmVsKTtcclxuICAgIFx0aWYgKHRoaXMuc3RhY2tfbGlzdFtjaGFubmVsX2luZGV4XSkgcmV0dXJuIHRoaXMuc3RhY2tfbGlzdFtjaGFubmVsX2luZGV4XTtcclxuICAgIFx0cmV0dXJuIHt9XHJcbiAgICB9LFxyXG5cclxuICAgIGNsZWFuVW5yZWROdW06IGZ1bmN0aW9uKGNoYW5uZWwpIHtcclxuICAgICAgICBpZiAodGhpcy51bnJlYWRfbXNnc1tjaGFubmVsXSA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy51bnJlYWRfbXNnc1tjaGFubmVsXSA9IDA7XHJcbiAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoRXZlbnRJZC5DSEFUX05FV01TR19GTEFHKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGFkZFVucmVhZE51bTogZnVuY3Rpb24oY2hhbm5lbCwgbnVtKSB7XHJcbiAgICAgICAgbnVtID0gbnVtIHx8IDE7XHJcbiAgICAgICAgdGhpcy51bnJlYWRfbXNnc1tjaGFubmVsXSArPSBudW07XHJcblxyXG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoRXZlbnRJZC5DSEFUX05FV01TR19GTEFHKTtcclxuICAgIH0sXHJcblxyXG4gICAgZ2V0VW5yZWFkTnVtOiBmdW5jdGlvbihjaGFubmVsKSB7XHJcbiAgICAgICAgaWYgKGNoYW5uZWwpIHtcclxuICAgICAgICAgICByZXR1cm4gdGhpcy51bnJlYWRfbXNnc1tjaGFubmVsXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgdG90YWxfbnVtID0gMDtcclxuICAgICAgICAgICAgdmFyIHJvbGVfdm8gPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBjaGFubmVsX2kgaW4gdGhpcy51bnJlYWRfbXNncykge1xyXG4gICAgICAgICAgICAgICAgaWYgKChjaGFubmVsX2kgPT0gMTAyNCAmJiByb2xlX3ZvICYmIHJvbGVfdm8ubGV2IDwgNTApIHx8IChjaGFubmVsX2kgPT0gNCAmJiByb2xlX3ZvICYmICFyb2xlX3ZvLmdpZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRvdGFsX251bSArPSB0aGlzLnVucmVhZF9tc2dzW2NoYW5uZWxfaV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRvdGFsX251bTtcclxuICAgICAgICB9IFxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfSxcclxuXHJcbiAgICBzYXZlVGFsa1RpbWU6ZnVuY3Rpb24oc3J2X2lkLHJpZCl7XHJcbiAgICAgICAgLy8gdmFyIHRpbWUgPSBnY29yZS5TbWFydFNvY2tldC5nZXRUaW1lKCk7XHJcbiAgICAgICAgLy8gdmFyIHZvID0gcmVxdWlyZShcInJvbGVfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpO1xyXG4gICAgICAgIC8vIHZhciBrZXlfc3RyID0gY2MuanMuZm9ybWF0U3RyKFwiJXNfJXNfJWRcIixcImZyaWVuZF9pbmZvXCIsdm8uc3J2X2lkLHZvLnJpZCk7XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvLyDlrZjkuIDkuIvmnIDmlrDnmoToib7nibnmlbDmja5cclxuICAgIHNldEF0RGF0YTpmdW5jdGlvbiggZGF0YSApe1xyXG4gICAgICAgIHRoaXMuYXRfZGF0YSA9IGRhdGE7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldEF0RGF0YTpmdW5jdGlvbiggICl7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXRfZGF0YTtcclxuICAgIH0sXHJcblxyXG59KSJdfQ==
|