|
(function() {
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
var __module = nodeEnv ? module : {exports:{}};
|
var __filename = 'preview-scripts/assets/Scripts/mod/guildwar/guildwar_controller.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, '0425f3UaltIrbxpcLSkBcOr', 'guildwar_controller');
|
// Scripts/mod/guildwar/guildwar_controller.js
|
|
"use strict";
|
|
// --------------------------------------------------------------------
|
// @author: xxx@syg.com(必填, 创建模块的人员)
|
// @description:
|
// 这里填写详细说明,主要填写该模块的功能简要
|
// <br/>Create: 2019-05-06 17:56:47
|
// --------------------------------------------------------------------
|
var RoleController = require("role_controller");
|
|
var GuildwarEvent = require("guildwar_event");
|
|
var GuildwarController = cc.Class({
|
"extends": BaseController,
|
ctor: function ctor() {},
|
// 初始化配置数据
|
initConfig: function initConfig() {
|
var Guild_warModel = require("guildwar_model");
|
|
this.model = new Guild_warModel(this);
|
this.model.initConfig();
|
},
|
// 返回当前的model
|
getModel: function getModel() {
|
return this.model;
|
},
|
// 注册监听事件
|
registerEvents: function registerEvents() {
|
if (this.init_role_event == null) {
|
this.init_role_event = gcore.GlobalEvent.bind(EventId.EVT_ROLE_CREATE_SUCCESS, function () {
|
gcore.GlobalEvent.unbind(this.init_role_event);
|
this.init_role_event = null;
|
this.role_vo = RoleController.getInstance().getRoleVo();
|
|
if (this.role_vo != null) {
|
if (this.role_assets_event == null) {
|
this.role_assets_event = this.role_vo.bind(EventId.UPDATE_ROLE_ATTRIBUTE, function (key, value) {
|
if (key == "guild_lev") {
|
if (value == 0) {
|
//退出联盟,清掉数据
|
this.model.initConfig();
|
}
|
}
|
}, this);
|
}
|
}
|
}, this);
|
}
|
},
|
//登陆时、联盟等级变化时请求
|
requestInitProtocal: function requestInitProtocal() {
|
this.reqestGuildWarStatus();
|
this.requestAwardBoxData(); //公会宝箱红点用到
|
},
|
//请求联盟战详细数据
|
requestGuildWarData: function requestGuildWarData() {
|
this.SendProtocal(24200, {});
|
},
|
//请求敌方单个据点数据
|
requestEnemyPositionData: function requestEnemyPositionData(pos) {
|
if (!pos) return;
|
var protocal = {};
|
protocal.pos = pos;
|
this.SendProtocal(24201, protocal);
|
},
|
//发起战斗
|
requestGuildWarFighting: function requestGuildWarFighting(pos, hp, flag) {
|
if (!pos) return;
|
var protocal = {};
|
protocal.pos = pos;
|
protocal.hp = hp;
|
protocal.flag = flag;
|
this.SendProtocal(24202, protocal);
|
},
|
//请求联盟战状态
|
reqestGuildWarStatus: function reqestGuildWarStatus() {
|
this.SendProtocal(24204, {});
|
},
|
//请求对战列表数据
|
requestGuildWarBattleList: function requestGuildWarBattleList() {
|
this.SendProtocal(24205, {});
|
},
|
//请求本方联盟战据点数据
|
requestMyGuildPositionData: function requestMyGuildPositionData() {
|
this.SendProtocal(24208, {});
|
},
|
//请求据点防守记录
|
requestPositionDefendData: function requestPositionDefendData(g_id1, g_sid1, pos) {
|
var protocal = {};
|
protocal.pos = pos;
|
protocal.g_id1 = g_id1;
|
protocal.g_sid1 = g_sid1;
|
this.SendProtocal(24209, protocal);
|
},
|
//请求战场日志
|
requestBattleLogData: function requestBattleLogData() {
|
this.SendProtocal(24212, {});
|
},
|
//请求联盟战详细排名数据
|
requestGuildWarRankData: function requestGuildWarRankData() {
|
this.SendProtocal(24213, {});
|
},
|
//请求宝箱数据
|
requestAwardBoxData: function requestAwardBoxData() {
|
this.SendProtocal(24220, {});
|
},
|
//请求领取宝箱数据
|
requestGetBoxAward: function requestGetBoxAward(order) {
|
var protocal = {};
|
protocal.order = order;
|
this.SendProtocal(24221, protocal);
|
},
|
// 注册协议接受事件
|
registerProtocals: function registerProtocals() {
|
this.RegisterProtocal(24200, this.handle24200); // 联盟战详细信息
|
|
this.RegisterProtocal(24201, this.handle24201); // 敌方单个据点信息
|
|
this.RegisterProtocal(24202, this.handle24202); // 发起战斗
|
|
this.RegisterProtocal(24203, this.handle24203); // 战斗结果
|
|
this.RegisterProtocal(24204, this.handle24204); // 联盟战的状态
|
|
this.RegisterProtocal(24205, this.handle24205); // 对战列表
|
|
this.RegisterProtocal(24206, this.handle24206); // 据点数据更新(只更新有变化的)
|
|
this.RegisterProtocal(24207, this.handle24207); // 联盟战基础数据更新(星数、buff等)
|
|
this.RegisterProtocal(24208, this.handle24208); // 本方联盟战据点数据
|
|
this.RegisterProtocal(24209, this.handle24209); // 防守记录
|
|
this.RegisterProtocal(24210, this.handle24210); // 有新的日志产生
|
|
this.RegisterProtocal(24212, this.handle24212); // 战场日志
|
|
this.RegisterProtocal(24213, this.handle24213); // 联盟战详细排名
|
|
this.RegisterProtocal(24214, this.handle24214); // 联盟战结果
|
|
this.RegisterProtocal(24220, this.handle24220); // 联盟战宝箱数据
|
|
this.RegisterProtocal(24221, this.handle24221); // 领取联盟战宝箱
|
|
this.RegisterProtocal(24223, this.handle24223); // 更新单个联盟战宝箱
|
},
|
//联盟战数据
|
handle24200: function handle24200(data) {
|
data = data || {};
|
|
if (data.count) {
|
//已挑战次数
|
this.model.setGuildWarChallengeCount(data.count);
|
}
|
|
if (data.result) {
|
this.model.setGuildWarResult(data.result);
|
}
|
|
if (data.ranks) {
|
this.model.setGuildWarTopThreeRank(data.ranks);
|
} //我方联盟基础信息
|
|
|
var myBaseInfo = {};
|
myBaseInfo.gname = data.gname1;
|
myBaseInfo.hp = data.hp1;
|
myBaseInfo.buff_lev = data.buff_lev1;
|
this.model.setMyGuildWarBaseInfo(myBaseInfo); //敌方联盟数据
|
|
this.model.setEnemyGuildWarData(data);
|
gcore.GlobalEvent.fire(GuildwarEvent.GuildWarEnemyPositionDataInitEvent);
|
},
|
//敌方单个据点数据
|
handle24201: function handle24201(data) {
|
if (data && this.attk_position_window) {
|
this.attk_position_window.setData(data);
|
}
|
},
|
//发起战斗
|
handle24202: function handle24202(data) {
|
message(data.msg);
|
|
if (data.code == 1) {
|
this.model.setGuildWarChallengeCount(data.count);
|
gcore.GlobalEvent.fire(GuildwarEvent.UpdateGuildwarChallengeCountEvent);
|
this.openAttkPositionWindow(false);
|
this.openAttkLookWindow(false);
|
}
|
},
|
//挑战据点的战斗结果
|
handle24203: function handle24203(data) {
|
var BattleConst = require("battle_const");
|
|
require("battle_controller").getInstance().openFinishView(true, BattleConst.Fight_Type.GuildWar, data);
|
},
|
//联盟战状态
|
handle24204: function handle24204(data) {
|
if (data) {
|
this.model.setGuildWarStatus(data);
|
gcore.GlobalEvent.fire(GuildwarEvent.UpdateGuildWarStatusEvent, data.status, data.flag);
|
}
|
},
|
//联盟战对阵列表
|
handle24205: function handle24205(data) {
|
if (data && this.battle_list_window) {
|
this.battle_list_window.setData(data);
|
}
|
},
|
//据点数据更新(本方与对方都走这里,变量更)
|
handle24206: function handle24206(data) {
|
if (data) {
|
if (data.flag && data.flag == 1) {
|
this.model.updateMyGuildWarPositionData(data.defense);
|
} else {
|
this.model.updateEnemyGuildWarPositionData(data.defense);
|
}
|
}
|
},
|
//联盟战基础数据更新(星数、buff等)
|
handle24207: function handle24207(data) {
|
if (data) {
|
if (data.result) {
|
this.model.setGuildWarResult(data.result);
|
}
|
|
if (data.hp && data.buff_lev) {
|
var myBaseInfo = {};
|
myBaseInfo.hp = data.hp;
|
myBaseInfo.buff_lev = data.buff_lev;
|
this.model.updateMyGuildWarBaseInfo(myBaseInfo);
|
}
|
|
if (data.hp2) {
|
this.model.updateEnemyGuildWarBaseInfo(data.hp2);
|
}
|
|
if (data.ranks) {
|
this.model.setGuildWarTopThreeRank(data.ranks);
|
}
|
|
gcore.GlobalEvent.fire(GuildwarEvent.UpdateGuildWarBaseInfoEvent);
|
}
|
},
|
//本方据点数据
|
handle24208: function handle24208(data) {
|
if (data) {
|
this.model.setMyGuildWarPositionData(data.defense);
|
gcore.GlobalEvent.fire(GuildwarEvent.GetGuildWarMyPositionDataEvent);
|
}
|
},
|
//防守记录
|
handle24209: function handle24209(data) {
|
if (data && this.defend_look_window) {
|
this.defend_look_window.setData(data);
|
}
|
},
|
//有新的日志产生
|
handle24210: function handle24210() {
|
var GuildConst = require("guild_const");
|
|
this.model.updateGuildWarRedStatus(GuildConst.red_index.guildwar_log, true, true);
|
},
|
//战场日志
|
handle24212: function handle24212(data) {
|
if (this.battle_log_window && data) {
|
this.battle_log_window.setData(data.guild_war_log);
|
}
|
},
|
//联盟战详细排名
|
handle24213: function handle24213(data) {
|
if (data) {
|
gcore.GlobalEvent.fire(GuildwarEvent.UpdateGuildWarRankDataEvent, data.ranks);
|
}
|
},
|
//联盟战结果
|
handle24214: function handle24214(data) {
|
if (data && data.result) {
|
this.model.setGuildWarResult(data.result);
|
gcore.GlobalEvent.fire(GuildwarEvent.UpdateGuildWarBaseInfoEvent);
|
}
|
},
|
//联盟战宝箱数据
|
handle24220: function handle24220(data) {
|
if (data) {
|
this.model.setGuildWarBoxData(data);
|
gcore.GlobalEvent.fire(GuildwarEvent.UpdateGuildWarBoxDataEvent, data);
|
}
|
},
|
//领取宝箱
|
handle24221: function handle24221(data) {
|
message(data.msg);
|
},
|
//更新单个宝箱数据
|
handle24223: function handle24223(data) {
|
if (data) {
|
this.model.updateGuildWarBoxData(data); //判断一下是否为玩家自己领取了宝箱,更新界面领取状态
|
|
if (this.role_vo && data.rid == this.role_vo.rid && data.sid == this.role_vo.srv_id) {
|
gcore.GlobalEvent.fire(GuildwarEvent.UpdateMyAwardBoxEvent);
|
}
|
}
|
},
|
//-----------------------------------------------界面
|
//打开联盟战主界面
|
openMainWindow: function openMainWindow(status) {
|
if (status == false) {
|
if (this.main_window) {
|
this.main_window.close();
|
this.main_window = null;
|
}
|
} else {
|
if (IS_SHOW_CHARGE == false) {
|
message(Utils.TI18N("功能暂未开放,敬请期待"));
|
return;
|
}
|
|
if (this.role_vo == null || this.role_vo.gid == 0) {
|
message(Utils.TI18N("您当前未加入任何公会,加入公会后才能参与该玩法!"));
|
return;
|
}
|
|
var config = Config.guild_war_data.data_const.limit_lev;
|
|
if (config == null) {
|
message(Utils.TI18N("公会战数据异常!"));
|
return;
|
}
|
|
if (this.role_vo.guild_lev < config.val) {
|
message(Utils.TI18N("您所在的公会未达参赛条件,不能参与哦,请努力提高公会等级!"));
|
return;
|
}
|
|
if (this.main_window == null) {
|
this.main_window = Utils.createClass("guildwar_main_window");
|
}
|
|
this.main_window.open();
|
}
|
},
|
//打开进攻一览
|
openAttkLookWindow: function openAttkLookWindow(status) {
|
if (status == false) {
|
if (this.attk_look_window) {
|
this.attk_look_window.close();
|
this.attk_look_window = null;
|
}
|
} else {
|
if (this.attk_look_window == null) {
|
this.attk_look_window = Utils.createClass("guildwar_attk_look_window");
|
}
|
|
this.attk_look_window.open();
|
}
|
},
|
//打开防守记录
|
openDefendLookWindow: function openDefendLookWindow(status, g_id, g_sid, pos) {
|
if (status == false) {
|
if (this.defend_look_window) {
|
this.defend_look_window.close();
|
this.defend_look_window = null;
|
}
|
} else {
|
if (this.defend_look_window == null) {
|
this.defend_look_window = Utils.createClass("guildwar_defend_look_window");
|
}
|
|
this.defend_look_window.open({
|
g_id: g_id,
|
g_sid: g_sid,
|
pos: pos
|
});
|
}
|
},
|
//打开对阵列表
|
openBattleListWindow: function openBattleListWindow(status) {
|
if (status == false) {
|
if (this.battle_list_window) {
|
this.battle_list_window.close();
|
this.battle_list_window = null;
|
}
|
} else {
|
if (this.battle_list_window == null) {
|
this.battle_list_window = Utils.createClass("guildwar_battle_list_window");
|
}
|
|
this.battle_list_window.open();
|
}
|
},
|
//打开战场日志
|
openBattleLogWindow: function openBattleLogWindow(status) {
|
if (status == false) {
|
if (this.battle_log_window) {
|
this.battle_log_window.close();
|
this.battle_log_window = null;
|
}
|
} else {
|
if (this.battle_log_window == null) {
|
this.battle_log_window = Utils.createClass("guildwar_battle_log_window");
|
}
|
|
this.battle_log_window.open();
|
}
|
},
|
//打开战绩奖励
|
openGuildWarAwardWindow: function openGuildWarAwardWindow(status) {
|
if (status == false) {
|
if (this.guildwar_award_window) {
|
this.guildwar_award_window.close();
|
this.guildwar_award_window = null;
|
}
|
} else {
|
if (this.guildwar_award_window == null) {
|
this.guildwar_award_window = Utils.createClass("guildwar_award_window");
|
}
|
|
this.guildwar_award_window.open();
|
}
|
},
|
//打开挑战据点界面
|
openAttkPositionWindow: function openAttkPositionWindow(status, pos) {
|
if (status == false) {
|
if (this.attk_position_window) {
|
this.attk_position_window.close();
|
this.attk_position_window = null;
|
}
|
} else {
|
if (this.attk_position_window == null) {
|
this.attk_position_window = Utils.createClass("guildwar_attk_position_window");
|
}
|
|
this.attk_position_window.open(pos);
|
}
|
},
|
//打开战绩排行榜界面
|
openGuildWarRankView: function openGuildWarRankView(status, pos) {
|
if (status == false) {
|
if (this.guildwar_rank_window) {
|
this.guildwar_rank_window.close();
|
this.guildwar_rank_window = null;
|
}
|
} else {
|
if (this.guildwar_rank_window == null) {
|
this.guildwar_rank_window = Utils.createClass("guildwar_rank_window");
|
}
|
|
this.guildwar_rank_window.open(pos);
|
}
|
},
|
//判断是否开启联盟战
|
checkIsCanOpenGuildWarWindow: function checkIsCanOpenGuildWarWindow(not_tips) {
|
var isOpen = true;
|
var limit_lev = Config.guild_war_data.data_const.limit_lev.val;
|
var config_day = Config.guild_war_data.data_const.limit_open_time; //开服天数限制
|
|
var role_vo = RoleController.getInstance().getRoleVo();
|
var open_srv_day = RoleController.getInstance().getModel().getOpenSrvDay();
|
|
if (!role_vo.isHasGuild()) {
|
if (!not_tips) {
|
message(Utils.TI18N("您当前未加入任何公会,加入公会后才能参与该玩法!"));
|
}
|
|
isOpen = false;
|
} else if (role_vo.guild_lev < limit_lev) {
|
if (!not_tips) {
|
message(Utils.TI18N("您所在的公会未达参赛条件,不能参与哦,请努力提高公会等级!"));
|
}
|
|
isOpen = false;
|
} else if (open_srv_day <= config_day.val) {
|
if (!not_tips) {
|
message(config_day.desc);
|
}
|
|
isOpen = false;
|
}
|
|
return isOpen, limit_lev;
|
},
|
//打开公会战宝箱奖励
|
openAwardBoxWindow: function openAwardBoxWindow(status) {
|
if (status == false) {
|
if (this.award_box_window) {
|
this.award_box_window.close();
|
this.award_box_window = null;
|
}
|
} else {
|
if (this.award_box_window == null) {
|
this.award_box_window = Utils.createClass("guildwar_award_box_window");
|
}
|
|
this.award_box_window.open();
|
}
|
},
|
//打开宝箱奖励预览
|
openAwardBoxPreview: function openAwardBoxPreview(status) {
|
if (status == false) {
|
if (this.award_box_preview) {
|
this.award_box_preview.close();
|
this.award_box_preview = null;
|
}
|
} else {
|
if (this.award_box_preview == null) {
|
this.award_box_preview = Utils.createClass("guildwar_award_box_preview");
|
}
|
|
this.award_box_preview.open();
|
}
|
}
|
});
|
module.exports = GuildwarController;
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxndWlsZHdhclxcZ3VpbGR3YXJfY29udHJvbGxlci5qcyJdLCJuYW1lcyI6WyJSb2xlQ29udHJvbGxlciIsInJlcXVpcmUiLCJHdWlsZHdhckV2ZW50IiwiR3VpbGR3YXJDb250cm9sbGVyIiwiY2MiLCJDbGFzcyIsIkJhc2VDb250cm9sbGVyIiwiY3RvciIsImluaXRDb25maWciLCJHdWlsZF93YXJNb2RlbCIsIm1vZGVsIiwiZ2V0TW9kZWwiLCJyZWdpc3RlckV2ZW50cyIsImluaXRfcm9sZV9ldmVudCIsImdjb3JlIiwiR2xvYmFsRXZlbnQiLCJiaW5kIiwiRXZlbnRJZCIsIkVWVF9ST0xFX0NSRUFURV9TVUNDRVNTIiwidW5iaW5kIiwicm9sZV92byIsImdldEluc3RhbmNlIiwiZ2V0Um9sZVZvIiwicm9sZV9hc3NldHNfZXZlbnQiLCJVUERBVEVfUk9MRV9BVFRSSUJVVEUiLCJrZXkiLCJ2YWx1ZSIsInJlcXVlc3RJbml0UHJvdG9jYWwiLCJyZXFlc3RHdWlsZFdhclN0YXR1cyIsInJlcXVlc3RBd2FyZEJveERhdGEiLCJyZXF1ZXN0R3VpbGRXYXJEYXRhIiwiU2VuZFByb3RvY2FsIiwicmVxdWVzdEVuZW15UG9zaXRpb25EYXRhIiwicG9zIiwicHJvdG9jYWwiLCJyZXF1ZXN0R3VpbGRXYXJGaWdodGluZyIsImhwIiwiZmxhZyIsInJlcXVlc3RHdWlsZFdhckJhdHRsZUxpc3QiLCJyZXF1ZXN0TXlHdWlsZFBvc2l0aW9uRGF0YSIsInJlcXVlc3RQb3NpdGlvbkRlZmVuZERhdGEiLCJnX2lkMSIsImdfc2lkMSIsInJlcXVlc3RCYXR0bGVMb2dEYXRhIiwicmVxdWVzdEd1aWxkV2FyUmFua0RhdGEiLCJyZXF1ZXN0R2V0Qm94QXdhcmQiLCJvcmRlciIsInJlZ2lzdGVyUHJvdG9jYWxzIiwiUmVnaXN0ZXJQcm90b2NhbCIsImhhbmRsZTI0MjAwIiwiaGFuZGxlMjQyMDEiLCJoYW5kbGUyNDIwMiIsImhhbmRsZTI0MjAzIiwiaGFuZGxlMjQyMDQiLCJoYW5kbGUyNDIwNSIsImhhbmRsZTI0MjA2IiwiaGFuZGxlMjQyMDciLCJoYW5kbGUyNDIwOCIsImhhbmRsZTI0MjA5IiwiaGFuZGxlMjQyMTAiLCJoYW5kbGUyNDIxMiIsImhhbmRsZTI0MjEzIiwiaGFuZGxlMjQyMTQiLCJoYW5kbGUyNDIyMCIsImhhbmRsZTI0MjIxIiwiaGFuZGxlMjQyMjMiLCJkYXRhIiwiY291bnQiLCJzZXRHdWlsZFdhckNoYWxsZW5nZUNvdW50IiwicmVzdWx0Iiwic2V0R3VpbGRXYXJSZXN1bHQiLCJyYW5rcyIsInNldEd1aWxkV2FyVG9wVGhyZWVSYW5rIiwibXlCYXNlSW5mbyIsImduYW1lIiwiZ25hbWUxIiwiaHAxIiwiYnVmZl9sZXYiLCJidWZmX2xldjEiLCJzZXRNeUd1aWxkV2FyQmFzZUluZm8iLCJzZXRFbmVteUd1aWxkV2FyRGF0YSIsImZpcmUiLCJHdWlsZFdhckVuZW15UG9zaXRpb25EYXRhSW5pdEV2ZW50IiwiYXR0a19wb3NpdGlvbl93aW5kb3ciLCJzZXREYXRhIiwibWVzc2FnZSIsIm1zZyIsImNvZGUiLCJVcGRhdGVHdWlsZHdhckNoYWxsZW5nZUNvdW50RXZlbnQiLCJvcGVuQXR0a1Bvc2l0aW9uV2luZG93Iiwib3BlbkF0dGtMb29rV2luZG93IiwiQmF0dGxlQ29uc3QiLCJvcGVuRmluaXNoVmlldyIsIkZpZ2h0X1R5cGUiLCJHdWlsZFdhciIsInNldEd1aWxkV2FyU3RhdHVzIiwiVXBkYXRlR3VpbGRXYXJTdGF0dXNFdmVudCIsInN0YXR1cyIsImJhdHRsZV9saXN0X3dpbmRvdyIsInVwZGF0ZU15R3VpbGRXYXJQb3NpdGlvbkRhdGEiLCJkZWZlbnNlIiwidXBkYXRlRW5lbXlHdWlsZFdhclBvc2l0aW9uRGF0YSIsInVwZGF0ZU15R3VpbGRXYXJCYXNlSW5mbyIsImhwMiIsInVwZGF0ZUVuZW15R3VpbGRXYXJCYXNlSW5mbyIsIlVwZGF0ZUd1aWxkV2FyQmFzZUluZm9FdmVudCIsInNldE15R3VpbGRXYXJQb3NpdGlvbkRhdGEiLCJHZXRHdWlsZFdhck15UG9zaXRpb25EYXRhRXZlbnQiLCJkZWZlbmRfbG9va193aW5kb3ciLCJHdWlsZENvbnN0IiwidXBkYXRlR3VpbGRXYXJSZWRTdGF0dXMiLCJyZWRfaW5kZXgiLCJndWlsZHdhcl9sb2ciLCJiYXR0bGVfbG9nX3dpbmRvdyIsImd1aWxkX3dhcl9sb2ciLCJVcGRhdGVHdWlsZFdhclJhbmtEYXRhRXZlbnQiLCJzZXRHdWlsZFdhckJveERhdGEiLCJVcGRhdGVHdWlsZFdhckJveERhdGFFdmVudCIsInVwZGF0ZUd1aWxkV2FyQm94RGF0YSIsInJpZCIsInNpZCIsInNydl9pZCIsIlVwZGF0ZU15QXdhcmRCb3hFdmVudCIsIm9wZW5NYWluV2luZG93IiwibWFpbl93aW5kb3ciLCJjbG9zZSIsIklTX1NIT1dfQ0hBUkdFIiwiVXRpbHMiLCJUSTE4TiIsImdpZCIsImNvbmZpZyIsIkNvbmZpZyIsImd1aWxkX3dhcl9kYXRhIiwiZGF0YV9jb25zdCIsImxpbWl0X2xldiIsImd1aWxkX2xldiIsInZhbCIsImNyZWF0ZUNsYXNzIiwib3BlbiIsImF0dGtfbG9va193aW5kb3ciLCJvcGVuRGVmZW5kTG9va1dpbmRvdyIsImdfaWQiLCJnX3NpZCIsIm9wZW5CYXR0bGVMaXN0V2luZG93Iiwib3BlbkJhdHRsZUxvZ1dpbmRvdyIsIm9wZW5HdWlsZFdhckF3YXJkV2luZG93IiwiZ3VpbGR3YXJfYXdhcmRfd2luZG93Iiwib3Blbkd1aWxkV2FyUmFua1ZpZXciLCJndWlsZHdhcl9yYW5rX3dpbmRvdyIsImNoZWNrSXNDYW5PcGVuR3VpbGRXYXJXaW5kb3ciLCJub3RfdGlwcyIsImlzT3BlbiIsImNvbmZpZ19kYXkiLCJsaW1pdF9vcGVuX3RpbWUiLCJvcGVuX3Nydl9kYXkiLCJnZXRPcGVuU3J2RGF5IiwiaXNIYXNHdWlsZCIsImRlc2MiLCJvcGVuQXdhcmRCb3hXaW5kb3ciLCJhd2FyZF9ib3hfd2luZG93Iiwib3BlbkF3YXJkQm94UHJldmlldyIsImF3YXJkX2JveF9wcmV2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QUUsNkJBQVUvRCxNQUFWLEVBQWtCO0FBQ25DLFFBQUlBLE1BQU0sSUFBSSxLQUFkLEVBQXFCO0FBQ2pCLFVBQUksS0FBS2dFLGlCQUFULEVBQTRCO0FBQ3hCLGFBQUtBLGlCQUFMLENBQXVCcEMsS0FBdkI7QUFDQSxhQUFLb0MsaUJBQUwsR0FBeUIsSUFBekI7QUFDSDtBQUNKLEtBTEQsTUFLTztBQUNILFVBQUksS0FBS0EsaUJBQUwsSUFBMEIsSUFBOUIsRUFBb0M7QUFDaEMsYUFBS0EsaUJBQUwsR0FBeUJsQyxLQUFLLENBQUNVLFdBQU4sQ0FBa0IsNEJBQWxCLENBQXpCO0FBQ0g7O0FBQ0QsV0FBS3dCLGlCQUFMLENBQXVCdkIsSUFBdkI7QUFDSDtBQUNKO0FBM2U2QixDQUFULENBQXpCO0FBOGVBd0IsTUFBTSxDQUFDQyxPQUFQLEdBQWlCaEssa0JBQWpCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAgIOi/memHjOWhq+WGmeivpue7huivtOaYjizkuLvopoHloavlhpnor6XmqKHlnZfnmoTlip/og73nroDopoFcbi8vIDxici8+Q3JlYXRlOiAyMDE5LTA1LTA2IDE3OjU2OjQ3XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIFJvbGVDb250cm9sbGVyID0gcmVxdWlyZShcInJvbGVfY29udHJvbGxlclwiKTtcbnZhciBHdWlsZHdhckV2ZW50ID0gcmVxdWlyZShcImd1aWxkd2FyX2V2ZW50XCIpO1xuXG52YXIgR3VpbGR3YXJDb250cm9sbGVyID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VDb250cm9sbGVyLFxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICB9LFxuXG4gICAgLy8g5Yid5aeL5YyW6YWN572u5pWw5o2uXG4gICAgaW5pdENvbmZpZzogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgR3VpbGRfd2FyTW9kZWwgPSByZXF1aXJlKFwiZ3VpbGR3YXJfbW9kZWxcIik7XG5cbiAgICAgICAgdGhpcy5tb2RlbCA9IG5ldyBHdWlsZF93YXJNb2RlbCh0aGlzKTtcbiAgICAgICAgdGhpcy5tb2RlbC5pbml0Q29uZmlnKCk7XG4gICAgfSxcblxuICAgIC8vIOi/lOWbnuW9k+WJjeeahG1vZGVsXG4gICAgZ2V0TW9kZWw6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWw7XG4gICAgfSxcblxuICAgIC8vIOazqOWGjOebkeWQrOS6i+S7tlxuICAgIHJlZ2lzdGVyRXZlbnRzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmluaXRfcm9sZV9ldmVudCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRfcm9sZV9ldmVudCA9IGdjb3JlLkdsb2JhbEV2ZW50LmJpbmQoRXZlbnRJZC5FVlRfUk9MRV9DUkVBVEVfU1VDQ0VTUywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LnVuYmluZCh0aGlzLmluaXRfcm9sZV9ldmVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0X3JvbGVfZXZlbnQgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5yb2xlX3ZvID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yb2xlX3ZvICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucm9sZV9hc3NldHNfZXZlbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb2xlX2Fzc2V0c19ldmVudCA9IHRoaXMucm9sZV92by5iaW5kKEV2ZW50SWQuVVBEQVRFX1JPTEVfQVRUUklCVVRFLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gXCJndWlsZF9sZXZcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gMCkgeyAvL+mAgOWHuuiBlOebnyzmuIXmjonmlbDmja5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuaW5pdENvbmZpZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcylcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHRoaXMpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/nmbvpmYbml7bjgIHogZTnm5/nrYnnuqflj5jljJbml7bor7fmsYJcbiAgICByZXF1ZXN0SW5pdFByb3RvY2FsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucmVxZXN0R3VpbGRXYXJTdGF0dXMoKVxuICAgICAgICB0aGlzLnJlcXVlc3RBd2FyZEJveERhdGEoKSAvL+WFrOS8muWuneeusee6oueCueeUqOWIsFxuICAgIH0sXG5cbiAgICAvL+ivt+axguiBlOebn+aImOivpue7huaVsOaNrlxuICAgIHJlcXVlc3RHdWlsZFdhckRhdGE6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjQyMDAsIHt9KTtcbiAgICB9LFxuXG4gICAgLy/or7fmsYLmlYzmlrnljZXkuKrmja7ngrnmlbDmja5cbiAgICByZXF1ZXN0RW5lbXlQb3NpdGlvbkRhdGE6IGZ1bmN0aW9uIChwb3MpIHtcbiAgICAgICAgaWYgKCFwb3MpIHJldHVyblxuICAgICAgICB2YXIgcHJvdG9jYWwgPSB7fTtcbiAgICAgICAgcHJvdG9jYWwucG9zID0gcG9zO1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgyNDIwMSwgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICAvL+WPkei1t+aImOaWl1xuICAgIHJlcXVlc3RHdWlsZFdhckZpZ2h0aW5nOiBmdW5jdGlvbiAocG9zLCBocCwgZmxhZykge1xuICAgICAgICBpZiAoIXBvcykgcmV0dXJuXG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9O1xuICAgICAgICBwcm90b2NhbC5wb3MgPSBwb3M7XG4gICAgICAgIHByb3RvY2FsLmhwID0gaHA7XG4gICAgICAgIHByb3RvY2FsLmZsYWcgPSBmbGFnO1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgyNDIwMiwgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICAvL+ivt+axguiBlOebn+aImOeKtuaAgVxuICAgIHJlcWVzdEd1aWxkV2FyU3RhdHVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDI0MjA0LCB7fSk7XG4gICAgfSxcblxuICAgIC8v6K+35rGC5a+55oiY5YiX6KGo5pWw5o2uXG4gICAgcmVxdWVzdEd1aWxkV2FyQmF0dGxlTGlzdDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgyNDIwNSwge30pO1xuICAgIH0sXG5cbiAgICAvL+ivt+axguacrOaWueiBlOebn+aImOaNrueCueaVsOaNrlxuICAgIHJlcXVlc3RNeUd1aWxkUG9zaXRpb25EYXRhOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDI0MjA4LCB7fSk7XG4gICAgfSxcblxuICAgIC8v6K+35rGC5o2u54K56Ziy5a6I6K6w5b2VXG4gICAgcmVxdWVzdFBvc2l0aW9uRGVmZW5kRGF0YTogZnVuY3Rpb24gKGdfaWQxLCBnX3NpZDEsIHBvcykge1xuICAgICAgICB2YXIgcHJvdG9jYWwgPSB7fTtcbiAgICAgICAgcHJvdG9jYWwucG9zID0gcG9zO1xuICAgICAgICBwcm90b2NhbC5nX2lkMSA9IGdfaWQxO1xuICAgICAgICBwcm90b2NhbC5nX3NpZDEgPSBnX3NpZDE7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDI0MjA5LCBwcm90b2NhbCk7XG4gICAgfSxcblxuICAgIC8v6K+35rGC5oiY5Zy65pel5b+XXG4gICAgcmVxdWVzdEJhdHRsZUxvZ0RhdGE6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjQyMTIsIHt9KTtcbiAgICB9LFxuXG4gICAgLy/or7fmsYLogZTnm5/miJjor6bnu4bmjpLlkI3mlbDmja5cbiAgICByZXF1ZXN0R3VpbGRXYXJSYW5rRGF0YTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgyNDIxMywge30pO1xuICAgIH0sXG5cbiAgICAvL+ivt+axguWuneeuseaVsOaNrlxuICAgIHJlcXVlc3RBd2FyZEJveERhdGE6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjQyMjAsIHt9KTtcbiAgICB9LFxuXG4gICAgLy/or7fmsYLpooblj5blrp3nrrHmlbDmja5cbiAgICByZXF1ZXN0R2V0Qm94QXdhcmQ6IGZ1bmN0aW9uIChvcmRlcikge1xuICAgICAgICB2YXIgcHJvdG9jYWwgPSB7fTtcbiAgICAgICAgcHJvdG9jYWwub3JkZXIgPSBvcmRlcjtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjQyMjEsIHByb3RvY2FsKTtcbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM5Y2P6K6u5o6l5Y+X5LqL5Lu2XG4gICAgcmVnaXN0ZXJQcm90b2NhbHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDI0MjAwLCB0aGlzLmhhbmRsZTI0MjAwKSAgICAgLy8g6IGU55uf5oiY6K+m57uG5L+h5oGvXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyNDIwMSwgdGhpcy5oYW5kbGUyNDIwMSkgICAgIC8vIOaVjOaWueWNleS4quaNrueCueS/oeaBr1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjQyMDIsIHRoaXMuaGFuZGxlMjQyMDIpICAgICAvLyDlj5HotbfmiJjmlpdcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDI0MjAzLCB0aGlzLmhhbmRsZTI0MjAzKSAgICAgLy8g5oiY5paX57uT5p6cXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyNDIwNCwgdGhpcy5oYW5kbGUyNDIwNCkgICAgIC8vIOiBlOebn+aImOeahOeKtuaAgVxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjQyMDUsIHRoaXMuaGFuZGxlMjQyMDUpICAgICAvLyDlr7nmiJjliJfooahcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDI0MjA2LCB0aGlzLmhhbmRsZTI0MjA2KSAgICAgLy8g5o2u54K55pWw5o2u5pu05pawKOWPquabtOaWsOacieWPmOWMlueahClcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDI0MjA3LCB0aGlzLmhhbmRsZTI0MjA3KSAgICAgLy8g6IGU55uf5oiY5Z+656GA5pWw5o2u5pu05paw77yI5pif5pWw44CBYnVmZuetie+8iVxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjQyMDgsIHRoaXMuaGFuZGxlMjQyMDgpICAgICAvLyDmnKzmlrnogZTnm5/miJjmja7ngrnmlbDmja5cbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDI0MjA5LCB0aGlzLmhhbmRsZTI0MjA5KSAgICAgLy8g6Ziy5a6I6K6w5b2VXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyNDIxMCwgdGhpcy5oYW5kbGUyNDIxMCkgICAgIC8vIOacieaWsOeahOaXpeW/l+S6p+eUn1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjQyMTIsIHRoaXMuaGFuZGxlMjQyMTIpICAgICAvLyDmiJjlnLrml6Xlv5dcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDI0MjEzLCB0aGlzLmhhbmRsZTI0MjEzKSAgICAgLy8g6IGU55uf5oiY6K+m57uG5o6S5ZCNXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyNDIxNCwgdGhpcy5oYW5kbGUyNDIxNCkgICAgIC8vIOiBlOebn+aImOe7k+aenFxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjQyMjAsIHRoaXMuaGFuZGxlMjQyMjApICAgICAvLyDogZTnm5/miJjlrp3nrrHmlbDmja5cbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDI0MjIxLCB0aGlzLmhhbmRsZTI0MjIxKSAgICAgLy8g6aKG5Y+W6IGU55uf5oiY5a6d566xXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyNDIyMywgdGhpcy5oYW5kbGUyNDIyMykgICAgIC8vIOabtOaWsOWNleS4quiBlOebn+aImOWuneeusVxuICAgIH0sXG5cbiAgICAvL+iBlOebn+aImOaVsOaNrlxuICAgIGhhbmRsZTI0MjAwOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBkYXRhID0gZGF0YSB8fCB7fTtcbiAgICAgICAgaWYgKGRhdGEuY291bnQpIHsgICAgIC8v5bey5oyR5oiY5qyh5pWwXG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNldEd1aWxkV2FyQ2hhbGxlbmdlQ291bnQoZGF0YS5jb3VudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEucmVzdWx0KSB7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNldEd1aWxkV2FyUmVzdWx0KGRhdGEucmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5yYW5rcykge1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZXRHdWlsZFdhclRvcFRocmVlUmFuayhkYXRhLnJhbmtzKTtcbiAgICAgICAgfVxuICAgICAgICAvL+aIkeaWueiBlOebn+WfuuehgOS/oeaBr1xuICAgICAgICB2YXIgbXlCYXNlSW5mbyA9IHt9O1xuICAgICAgICBteUJhc2VJbmZvLmduYW1lID0gZGF0YS5nbmFtZTE7XG4gICAgICAgIG15QmFzZUluZm8uaHAgPSBkYXRhLmhwMTtcbiAgICAgICAgbXlCYXNlSW5mby5idWZmX2xldiA9IGRhdGEuYnVmZl9sZXYxO1xuICAgICAgICB0aGlzLm1vZGVsLnNldE15R3VpbGRXYXJCYXNlSW5mbyhteUJhc2VJbmZvKTtcbiAgICAgICAgLy/mlYzmlrnogZTnm5/mlbDmja5cbiAgICAgICAgdGhpcy5tb2RlbC5zZXRFbmVteUd1aWxkV2FyRGF0YShkYXRhKTtcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShHdWlsZHdhckV2ZW50Lkd1aWxkV2FyRW5lbXlQb3NpdGlvbkRhdGFJbml0RXZlbnQpO1xuICAgIH0sXG5cbiAgICAvL+aVjOaWueWNleS4quaNrueCueaVsOaNrlxuICAgIGhhbmRsZTI0MjAxOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YSAmJiB0aGlzLmF0dGtfcG9zaXRpb25fd2luZG93KSB7XG4gICAgICAgICAgICB0aGlzLmF0dGtfcG9zaXRpb25fd2luZG93LnNldERhdGEoZGF0YSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/lj5HotbfmiJjmlpdcbiAgICBoYW5kbGUyNDIwMjogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZyk7XG4gICAgICAgIGlmIChkYXRhLmNvZGUgPT0gMSkge1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZXRHdWlsZFdhckNoYWxsZW5nZUNvdW50KGRhdGEuY291bnQpO1xuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShHdWlsZHdhckV2ZW50LlVwZGF0ZUd1aWxkd2FyQ2hhbGxlbmdlQ291bnRFdmVudCk7XG4gICAgICAgICAgICB0aGlzLm9wZW5BdHRrUG9zaXRpb25XaW5kb3coZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5vcGVuQXR0a0xvb2tXaW5kb3coZmFsc2UpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5oyR5oiY5o2u54K555qE5oiY5paX57uT5p6cXG4gICAgaGFuZGxlMjQyMDM6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHZhciBCYXR0bGVDb25zdCA9IHJlcXVpcmUoXCJiYXR0bGVfY29uc3RcIik7XG4gICAgICAgIHJlcXVpcmUoXCJiYXR0bGVfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLm9wZW5GaW5pc2hWaWV3KHRydWUsIEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuR3VpbGRXYXIsIGRhdGEpXG4gICAgfSxcblxuICAgIC8v6IGU55uf5oiY54q25oCBXG4gICAgaGFuZGxlMjQyMDQ6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNldEd1aWxkV2FyU3RhdHVzKGRhdGEpO1xuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShHdWlsZHdhckV2ZW50LlVwZGF0ZUd1aWxkV2FyU3RhdHVzRXZlbnQsIGRhdGEuc3RhdHVzLCBkYXRhLmZsYWcpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/ogZTnm5/miJjlr7npmLXliJfooahcbiAgICBoYW5kbGUyNDIwNTogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEgJiYgdGhpcy5iYXR0bGVfbGlzdF93aW5kb3cpIHtcbiAgICAgICAgICAgIHRoaXMuYmF0dGxlX2xpc3Rfd2luZG93LnNldERhdGEoZGF0YSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/mja7ngrnmlbDmja7mm7TmlrAo5pys5pa55LiO5a+55pa56YO96LWw6L+Z6YeM77yM5Y+Y6YeP5pu0KVxuICAgIGhhbmRsZTI0MjA2OiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgaWYgKGRhdGEuZmxhZyAmJiBkYXRhLmZsYWcgPT0gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwudXBkYXRlTXlHdWlsZFdhclBvc2l0aW9uRGF0YShkYXRhLmRlZmVuc2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnVwZGF0ZUVuZW15R3VpbGRXYXJQb3NpdGlvbkRhdGEoZGF0YS5kZWZlbnNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+iBlOebn+aImOWfuuehgOaVsOaNruabtOaWsCjmmJ/mlbDjgIFidWZm562JKVxuICAgIGhhbmRsZTI0MjA3OiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgaWYgKGRhdGEucmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5zZXRHdWlsZFdhclJlc3VsdChkYXRhLnJlc3VsdClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhLmhwICYmIGRhdGEuYnVmZl9sZXYpIHtcbiAgICAgICAgICAgICAgICB2YXIgbXlCYXNlSW5mbyA9IHt9O1xuICAgICAgICAgICAgICAgIG15QmFzZUluZm8uaHAgPSBkYXRhLmhwO1xuICAgICAgICAgICAgICAgIG15QmFzZUluZm8uYnVmZl9sZXYgPSBkYXRhLmJ1ZmZfbGV2O1xuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwudXBkYXRlTXlHdWlsZFdhckJhc2VJbmZvKG15QmFzZUluZm8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGEuaHAyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC51cGRhdGVFbmVteUd1aWxkV2FyQmFzZUluZm8oZGF0YS5ocDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGEucmFua3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnNldEd1aWxkV2FyVG9wVGhyZWVSYW5rKGRhdGEucmFua3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShHdWlsZHdhckV2ZW50LlVwZGF0ZUd1aWxkV2FyQmFzZUluZm9FdmVudClcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+acrOaWueaNrueCueaVsOaNrlxuICAgIGhhbmRsZTI0MjA4OiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZXRNeUd1aWxkV2FyUG9zaXRpb25EYXRhKGRhdGEuZGVmZW5zZSk7XG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEd1aWxkd2FyRXZlbnQuR2V0R3VpbGRXYXJNeVBvc2l0aW9uRGF0YUV2ZW50KVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v6Ziy5a6I6K6w5b2VXG4gICAgaGFuZGxlMjQyMDk6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhICYmIHRoaXMuZGVmZW5kX2xvb2tfd2luZG93KSB7XG4gICAgICAgICAgICB0aGlzLmRlZmVuZF9sb29rX3dpbmRvdy5zZXREYXRhKGRhdGEpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5pyJ5paw55qE5pel5b+X5Lqn55SfXG4gICAgaGFuZGxlMjQyMTA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEd1aWxkQ29uc3QgPSByZXF1aXJlKFwiZ3VpbGRfY29uc3RcIik7XG4gICAgICAgIHRoaXMubW9kZWwudXBkYXRlR3VpbGRXYXJSZWRTdGF0dXMoR3VpbGRDb25zdC5yZWRfaW5kZXguZ3VpbGR3YXJfbG9nLCB0cnVlLCB0cnVlKVxuICAgIH0sXG5cbiAgICAvL+aImOWcuuaXpeW/l1xuICAgIGhhbmRsZTI0MjEyOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAodGhpcy5iYXR0bGVfbG9nX3dpbmRvdyAmJiBkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmJhdHRsZV9sb2dfd2luZG93LnNldERhdGEoZGF0YS5ndWlsZF93YXJfbG9nKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+iBlOebn+aImOivpue7huaOkuWQjVxuICAgIGhhbmRsZTI0MjEzOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShHdWlsZHdhckV2ZW50LlVwZGF0ZUd1aWxkV2FyUmFua0RhdGFFdmVudCwgZGF0YS5yYW5rcyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/ogZTnm5/miJjnu5PmnpxcbiAgICBoYW5kbGUyNDIxNDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5yZXN1bHQpIHtcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2V0R3VpbGRXYXJSZXN1bHQoZGF0YS5yZXN1bHQpO1xuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShHdWlsZHdhckV2ZW50LlVwZGF0ZUd1aWxkV2FyQmFzZUluZm9FdmVudClcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+iBlOebn+aImOWuneeuseaVsOaNrlxuICAgIGhhbmRsZTI0MjIwOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZXRHdWlsZFdhckJveERhdGEoZGF0YSk7XG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEd1aWxkd2FyRXZlbnQuVXBkYXRlR3VpbGRXYXJCb3hEYXRhRXZlbnQsIGRhdGEpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v6aKG5Y+W5a6d566xXG4gICAgaGFuZGxlMjQyMjE6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpO1xuICAgIH0sXG5cbiAgICAvL+abtOaWsOWNleS4quWuneeuseaVsOaNrlxuICAgIGhhbmRsZTI0MjIzOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5tb2RlbC51cGRhdGVHdWlsZFdhckJveERhdGEoZGF0YSk7XG4gICAgICAgICAgICAvL+WIpOaWreS4gOS4i+aYr+WQpuS4uueOqeWutuiHquW3semihuWPluS6huWuneeuse+8jOabtOaWsOeVjOmdoumihuWPlueKtuaAgVxuICAgICAgICAgICAgaWYgKHRoaXMucm9sZV92byAmJiBkYXRhLnJpZCA9PSB0aGlzLnJvbGVfdm8ucmlkICYmIGRhdGEuc2lkID09IHRoaXMucm9sZV92by5zcnZfaWQpIHtcbiAgICAgICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEd1aWxkd2FyRXZlbnQuVXBkYXRlTXlBd2FyZEJveEV2ZW50KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS3nlYzpnaJcbiAgICAvL+aJk+W8gOiBlOebn+aImOS4u+eVjOmdolxuICAgIG9wZW5NYWluV2luZG93OiBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgICAgIGlmIChzdGF0dXMgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1haW5fd2luZG93KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYWluX3dpbmRvdy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMubWFpbl93aW5kb3cgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKElTX1NIT1dfQ0hBUkdFID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZShVdGlscy5USTE4TihcIuWKn+iDveaaguacquW8gOaUvu+8jOaVrOivt+acn+W+hVwiKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5yb2xlX3ZvID09IG51bGwgfHwgdGhpcy5yb2xlX3ZvLmdpZCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZShVdGlscy5USTE4TihcIuaCqOW9k+WJjeacquWKoOWFpeS7u+S9leWFrOS8mu+8jOWKoOWFpeWFrOS8muWQjuaJjeiDveWPguS4juivpeeOqeazle+8gVwiKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY29uZmlnID0gQ29uZmlnLmd1aWxkX3dhcl9kYXRhLmRhdGFfY29uc3QubGltaXRfbGV2O1xuICAgICAgICAgICAgaWYgKGNvbmZpZyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZShVdGlscy5USTE4TihcIuWFrOS8muaImOaVsOaNruW8guW4uCFcIikpO1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMucm9sZV92by5ndWlsZF9sZXYgPCBjb25maWcudmFsKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZShVdGlscy5USTE4TihcIuaCqOaJgOWcqOeahOWFrOS8muacqui+vuWPgui1m+adoeS7tu+8jOS4jeiDveWPguS4juWTpu+8jOivt+WKquWKm+aPkOmrmOWFrOS8muetiee6p++8gVwiKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5tYWluX3dpbmRvdyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYWluX3dpbmRvdyA9IFV0aWxzLmNyZWF0ZUNsYXNzKFwiZ3VpbGR3YXJfbWFpbl93aW5kb3dcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1haW5fd2luZG93Lm9wZW4oKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+aJk+W8gOi/m+aUu+S4gOiniFxuICAgIG9wZW5BdHRrTG9va1dpbmRvdzogZnVuY3Rpb24gKHN0YXR1cykge1xuICAgICAgICBpZiAoc3RhdHVzID09IGZhbHNlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hdHRrX2xvb2tfd2luZG93KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hdHRrX2xvb2tfd2luZG93LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hdHRrX2xvb2tfd2luZG93ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmF0dGtfbG9va193aW5kb3cgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXR0a19sb29rX3dpbmRvdyA9IFV0aWxzLmNyZWF0ZUNsYXNzKFwiZ3VpbGR3YXJfYXR0a19sb29rX3dpbmRvd1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYXR0a19sb29rX3dpbmRvdy5vcGVuKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/miZPlvIDpmLLlrojorrDlvZVcbiAgICBvcGVuRGVmZW5kTG9va1dpbmRvdzogZnVuY3Rpb24gKHN0YXR1cywgZ19pZCwgZ19zaWQsIHBvcykge1xuICAgICAgICBpZiAoc3RhdHVzID09IGZhbHNlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kZWZlbmRfbG9va193aW5kb3cpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmVuZF9sb29rX3dpbmRvdy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmZW5kX2xvb2tfd2luZG93ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlZmVuZF9sb29rX3dpbmRvdyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZlbmRfbG9va193aW5kb3cgPSBVdGlscy5jcmVhdGVDbGFzcyhcImd1aWxkd2FyX2RlZmVuZF9sb29rX3dpbmRvd1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGVmZW5kX2xvb2tfd2luZG93Lm9wZW4oe2dfaWQ6Z19pZCwgZ19zaWQ6Z19zaWQsIHBvczpwb3N9KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+aJk+W8gOWvuemYteWIl+ihqFxuICAgIG9wZW5CYXR0bGVMaXN0V2luZG93OiBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgICAgIGlmIChzdGF0dXMgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmJhdHRsZV9saXN0X3dpbmRvdykge1xuICAgICAgICAgICAgICAgIHRoaXMuYmF0dGxlX2xpc3Rfd2luZG93LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXR0bGVfbGlzdF93aW5kb3cgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuYmF0dGxlX2xpc3Rfd2luZG93ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJhdHRsZV9saXN0X3dpbmRvdyA9IFV0aWxzLmNyZWF0ZUNsYXNzKFwiZ3VpbGR3YXJfYmF0dGxlX2xpc3Rfd2luZG93XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5iYXR0bGVfbGlzdF93aW5kb3cub3BlbigpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5omT5byA5oiY5Zy65pel5b+XXG4gICAgb3BlbkJhdHRsZUxvZ1dpbmRvdzogZnVuY3Rpb24gKHN0YXR1cykge1xuICAgICAgICBpZiAoc3RhdHVzID09IGZhbHNlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5iYXR0bGVfbG9nX3dpbmRvdykge1xuICAgICAgICAgICAgICAgIHRoaXMuYmF0dGxlX2xvZ193aW5kb3cuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJhdHRsZV9sb2dfd2luZG93ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmJhdHRsZV9sb2dfd2luZG93ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJhdHRsZV9sb2dfd2luZG93ID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJndWlsZHdhcl9iYXR0bGVfbG9nX3dpbmRvd1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYmF0dGxlX2xvZ193aW5kb3cub3BlbigpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5omT5byA5oiY57up5aWW5YqxXG4gICAgb3Blbkd1aWxkV2FyQXdhcmRXaW5kb3c6IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgICAgICAgaWYgKHN0YXR1cyA9PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZ3VpbGR3YXJfYXdhcmRfd2luZG93KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ndWlsZHdhcl9hd2FyZF93aW5kb3cuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmd1aWxkd2FyX2F3YXJkX3dpbmRvdyA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ndWlsZHdhcl9hd2FyZF93aW5kb3cgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3VpbGR3YXJfYXdhcmRfd2luZG93ID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJndWlsZHdhcl9hd2FyZF93aW5kb3dcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmd1aWxkd2FyX2F3YXJkX3dpbmRvdy5vcGVuKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/miZPlvIDmjJHmiJjmja7ngrnnlYzpnaJcbiAgICBvcGVuQXR0a1Bvc2l0aW9uV2luZG93OiBmdW5jdGlvbiAoc3RhdHVzLCBwb3MpIHtcbiAgICAgICAgaWYgKHN0YXR1cyA9PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYXR0a19wb3NpdGlvbl93aW5kb3cpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF0dGtfcG9zaXRpb25fd2luZG93LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hdHRrX3Bvc2l0aW9uX3dpbmRvdyA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hdHRrX3Bvc2l0aW9uX3dpbmRvdyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hdHRrX3Bvc2l0aW9uX3dpbmRvdyA9IFV0aWxzLmNyZWF0ZUNsYXNzKFwiZ3VpbGR3YXJfYXR0a19wb3NpdGlvbl93aW5kb3dcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmF0dGtfcG9zaXRpb25fd2luZG93Lm9wZW4ocG9zKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+aJk+W8gOaImOe7qeaOkuihjOamnOeVjOmdolxuICAgIG9wZW5HdWlsZFdhclJhbmtWaWV3OiBmdW5jdGlvbiAoc3RhdHVzLCBwb3MpIHtcbiAgICAgICAgaWYgKHN0YXR1cyA9PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZ3VpbGR3YXJfcmFua193aW5kb3cpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmd1aWxkd2FyX3Jhbmtfd2luZG93LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5ndWlsZHdhcl9yYW5rX3dpbmRvdyA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ndWlsZHdhcl9yYW5rX3dpbmRvdyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ndWlsZHdhcl9yYW5rX3dpbmRvdyA9IFV0aWxzLmNyZWF0ZUNsYXNzKFwiZ3VpbGR3YXJfcmFua193aW5kb3dcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmd1aWxkd2FyX3Jhbmtfd2luZG93Lm9wZW4ocG9zKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+WIpOaWreaYr+WQpuW8gOWQr+iBlOebn+aImFxuICAgIGNoZWNrSXNDYW5PcGVuR3VpbGRXYXJXaW5kb3c6IGZ1bmN0aW9uIChub3RfdGlwcykge1xuICAgICAgICB2YXIgaXNPcGVuID0gdHJ1ZTtcbiAgICAgICAgdmFyIGxpbWl0X2xldiA9IENvbmZpZy5ndWlsZF93YXJfZGF0YS5kYXRhX2NvbnN0LmxpbWl0X2xldi52YWw7XG4gICAgICAgIHZhciBjb25maWdfZGF5ID0gQ29uZmlnLmd1aWxkX3dhcl9kYXRhLmRhdGFfY29uc3QubGltaXRfb3Blbl90aW1lOyAgICAgIC8v5byA5pyN5aSp5pWw6ZmQ5Yi2XG4gICAgICAgIHZhciByb2xlX3ZvID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcbiAgICAgICAgdmFyIG9wZW5fc3J2X2RheSA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5nZXRPcGVuU3J2RGF5KCk7XG4gICAgICAgIGlmICghcm9sZV92by5pc0hhc0d1aWxkKCkpIHtcbiAgICAgICAgICAgIGlmICghbm90X3RpcHMpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlKFV0aWxzLlRJMThOKFwi5oKo5b2T5YmN5pyq5Yqg5YWl5Lu75L2V5YWs5Lya77yM5Yqg5YWl5YWs5Lya5ZCO5omN6IO95Y+C5LiO6K+l546p5rOV77yBXCIpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXNPcGVuID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAocm9sZV92by5ndWlsZF9sZXYgPCBsaW1pdF9sZXYpIHtcbiAgICAgICAgICAgIGlmICghbm90X3RpcHMpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlKFV0aWxzLlRJMThOKFwi5oKo5omA5Zyo55qE5YWs5Lya5pyq6L6+5Y+C6LWb5p2h5Lu277yM5LiN6IO95Y+C5LiO5ZOm77yM6K+35Yqq5Yqb5o+Q6auY5YWs5Lya562J57qn77yBXCIpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXNPcGVuID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAob3Blbl9zcnZfZGF5IDw9IGNvbmZpZ19kYXkudmFsKSB7XG4gICAgICAgICAgICBpZiAoIW5vdF90aXBzKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZShjb25maWdfZGF5LmRlc2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXNPcGVuID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzT3BlbiwgbGltaXRfbGV2XG4gICAgfSxcblxuICAgIC8v5omT5byA5YWs5Lya5oiY5a6d566x5aWW5YqxXG4gICAgb3BlbkF3YXJkQm94V2luZG93OiBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgICAgIGlmIChzdGF0dXMgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmF3YXJkX2JveF93aW5kb3cpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF3YXJkX2JveF93aW5kb3cuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmF3YXJkX2JveF93aW5kb3cgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuYXdhcmRfYm94X3dpbmRvdyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hd2FyZF9ib3hfd2luZG93ID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJndWlsZHdhcl9hd2FyZF9ib3hfd2luZG93XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hd2FyZF9ib3hfd2luZG93Lm9wZW4oKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+aJk+W8gOWuneeuseWlluWKsemihOiniFxuICAgIG9wZW5Bd2FyZEJveFByZXZpZXc6IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgICAgICAgaWYgKHN0YXR1cyA9PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYXdhcmRfYm94X3ByZXZpZXcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF3YXJkX2JveF9wcmV2aWV3LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hd2FyZF9ib3hfcHJldmlldyA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hd2FyZF9ib3hfcHJldmlldyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hd2FyZF9ib3hfcHJldmlldyA9IFV0aWxzLmNyZWF0ZUNsYXNzKFwiZ3VpbGR3YXJfYXdhcmRfYm94X3ByZXZpZXdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmF3YXJkX2JveF9wcmV2aWV3Lm9wZW4oKTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEd1aWxkd2FyQ29udHJvbGxlcjsiXX0=
|