|
(function() {
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
var __module = nodeEnv ? module : {exports:{}};
|
var __filename = 'preview-scripts/assets/Scripts/mod/action/action_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, '3233cqURXpAKa0bpEoK/Loq', 'action_controller');
|
// Scripts/mod/action/action_controller.js
|
|
"use strict";
|
|
// --------------------------------------------------------------------
|
// @author: xxx@syg.com(必填, 创建模块的人员)
|
// @description:
|
// 这里填写详细说明,主要填写该模块的功能简要
|
// <br/>Create: 2019-03-02 16:49:03
|
// --------------------------------------------------------------------
|
var ActionConst = require("action_const");
|
|
var MainuiController = require("mainui_controller");
|
|
var MainuiConst = require("mainui_const");
|
|
var ActionEvent = require("action_event");
|
|
var RoleController = require("role_controller");
|
|
var WelfareController = require("welfare_controller");
|
|
var OrderactionConst = require("orderaction_const");
|
|
var ActionController = cc.Class({
|
"extends": BaseController,
|
ctor: function ctor() {},
|
// 初始化配置数据
|
initConfig: function initConfig() {
|
var ActionModel = require("action_model");
|
|
this.model = new ActionModel();
|
this.model.initConfig();
|
this.mainui_ctrl = MainuiController.getInstance();
|
this.holiday_list = {}; // 活动列表类型
|
|
this.holiday_del_list = {}; // -- 需要移除的标签页缓存列表
|
|
this.holiday_award_list = {}; //未领取活动奖励的列表
|
|
this.need_show_init_red = {}; //-- 登录的时候需要显示红点的列表
|
},
|
// 返回当前的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.needRequireData();
|
this.init_role_event = null; // this.requestActionStatus() //-- 请求所有活动图标
|
//超值基金
|
// this.sender24700()
|
// 七天登录红点
|
// this.cs21100();
|
// 七天目标
|
// this.cs13601();
|
}.bind(this));
|
}
|
},
|
// --- 断线重连或者0点更新或者初始化需要请求的
|
needRequireData: function needRequireData() {
|
var self = this;
|
self.openActionMainPanel(false);
|
self.holiday_list = {};
|
self.holiday_award_list = {};
|
self.need_show_init_red = {};
|
self.holiday_del_list = {};
|
self.is_init_require = true;
|
self.model.clearFundSrvData(); // 断线时需要清掉基金缓存数据
|
|
self.requestActionStatus(); // 请求所有活动图标
|
|
self.requestHolidayList(ActionConst.ActionType.Wonderful); //-- 登陆的时候请求一下精彩活动的
|
},
|
// 注册协议接受事件
|
registerProtocals: function registerProtocals() {
|
// this.RegisterProtocal(1110, this.on16602);
|
this.RegisterProtocal(10922, this.on10922); //-- 全服活动状态,服务端广播
|
|
this.RegisterProtocal(16601, this.on16601); // -- 所有子活动的显示数据,主要用于活动面板左侧标签显示,以及部分面板内容显示
|
|
this.RegisterProtocal(16603, this.on16603); // -- 请求子活动
|
|
this.RegisterProtocal(16604, this.on16604); // 领取奖励
|
|
this.RegisterProtocal(10923, this.on10923); //- 主要是用于服务段更新全服活动状态数据的
|
|
this.RegisterProtocal(10924, this.on10924); //-- 个人活动状态,服务端广播
|
|
this.RegisterProtocal(10925, this.on10925); //-- 主要是用于服务段更新个人活动状态数据的
|
|
this.RegisterProtocal(16602, this.on16602); // 请求所有活动未领取奖励
|
|
this.RegisterProtocal(16606, this.on16606); // 领取活动返回
|
|
this.RegisterProtocal(16607, this.on16607); // 0点 5点更新
|
// -- 基金相关
|
|
this.RegisterProtocal(24700, this.handle24700);
|
this.RegisterProtocal(24701, this.handle24701);
|
this.RegisterProtocal(24702, this.handle24702); //7天登录
|
|
this.RegisterProtocal(21100, this.on21100); // 7天登录信息
|
|
this.RegisterProtocal(21101, this.on21101); // 领取7天登录奖励
|
// 七天目标
|
|
this.RegisterProtocal(13601, this.handle13601);
|
this.RegisterProtocal(13602, this.handle13602); // --升级有礼
|
|
this.RegisterProtocal(21200, this.handle21200);
|
this.RegisterProtocal(21201, this.handle21201); //奖励排行信息(以后可以是活动的通用)
|
|
this.RegisterProtocal(16650, this.handle16650); // 幸运转盘
|
|
this.RegisterProtocal(16637, this.handle16637);
|
this.RegisterProtocal(16638, this.handle16638);
|
this.RegisterProtocal(16639, this.handle16639);
|
this.RegisterProtocal(16641, this.handle16641);
|
this.RegisterProtocal(16642, this.handle16642);
|
this.RegisterProtocal(16643, this.handle16643); //神秘杂货铺
|
|
this.RegisterProtocal(16688, this.handle16688);
|
this.RegisterProtocal(16689, this.handle16689); // --限时礼包入口
|
|
this.RegisterProtocal(21210, this.handle21210);
|
this.RegisterProtocal(21211, this.handle21211); //-- 推送激活了显示礼包.
|
|
this.RegisterProtocal(21016, this.handle21016);
|
this.RegisterProtocal(16687, this.handle16687); // --元宵冒险
|
|
this.RegisterProtocal(24810, this.handle24810); //--获取元宵冒险 任务信息
|
|
this.RegisterProtocal(24811, this.handle24811); //--推送任务变化"
|
|
this.RegisterProtocal(24812, this.handle24812); //--任务领取
|
//触发礼包
|
|
this.RegisterProtocal(21220, this.handle21220);
|
this.RegisterProtocal(24813, this.handle24813);
|
this.RegisterProtocal(24814, this.handle24814); //时装
|
|
this.RegisterProtocal(30101, this.handle30101);
|
this.RegisterProtocal(30100, this.handle30100);
|
this.RegisterProtocal(30102, this.handle30102);
|
},
|
requestActionStatus: function requestActionStatus() {
|
this.SendProtocal(10922, {});
|
this.SendProtocal(10924, {});
|
this.on10925(OrderactionConst.OrderActionEntranceID.entrance_id);
|
},
|
handleActionStatusData: function handleActionStatusData(data) {
|
if (data) {
|
var config = Config.function_data.data_info[data.id];
|
if (config == null) return;
|
|
if (data.status == ActionConst.ActionStatus.un_finish) {
|
this.mainui_ctrl.removeFunctionIconById(data.id);
|
} else {
|
this.mainui_ctrl.addFunctionIconById(data.id, data); // -- 如果是7天排行就请求一下任务
|
|
if (data.id == MainuiConst.icon.seven_rank) {// 7天排行
|
// self:requestSevenDaysRank()
|
} else if (data.id == MainuiConst.icon.fund) {
|
this.model.checkFundRedStatus();
|
}
|
}
|
}
|
},
|
setHolidayStatus: function setHolidayStatus(bid, status) {
|
var self = this;
|
if (self.holiday_list == null || self.holiday_list[bid] == null) return;
|
|
if (self.holiday_award_list == null) {
|
self.holiday_award_list = {};
|
}
|
|
var vo = {
|
bid: bid,
|
status: status
|
};
|
var vo1;
|
|
if (status) {
|
vo1 = {
|
bid: bid,
|
num: 1
|
};
|
} else {
|
vo1 = {
|
bid: bid,
|
num: 0
|
};
|
}
|
|
self.holiday_award_list[bid] = vo;
|
var action_sub_vo = self.holiday_list[bid];
|
var function_id = MainuiConst.icon.welfare;
|
|
if (self.isSpecialBid(bid)) {
|
self.mainui_ctrl.setFunctionTipsStatus(MainuiConst.icon.welfare, vo1);
|
} else {
|
self.mainui_ctrl.setFunctionTipsStatus(action_sub_vo.cli_type, vo1);
|
function_id = action_sub_vo.cli_type;
|
}
|
|
gcore.GlobalEvent.fire(ActionEvent.UPDATE_HOLIDAY_TAB_STATUS, function_id, vo);
|
},
|
// --desc:更新全服活动全部数据
|
on10922: function on10922(data) {
|
if (this.protocal_list_22 == null) {
|
this.protocal_list_22 = {};
|
}
|
|
if (data != null && data.act_list) {
|
for (var i = 0; i < data.act_list.length; ++i) {
|
var v = data.act_list[i];
|
this.handleActionStatusData(v); // -- 先储存一下吧
|
|
if (v.status == ActionConst.ActionStatus.un_finish) {
|
this.protocal_list_22[v.id] = null;
|
} else {
|
this.protocal_list_22[v.id] = v.id;
|
}
|
}
|
}
|
},
|
on10923: function on10923(data) {
|
this.handleActionStatusData(data);
|
|
if (data) {
|
if (this.protocal_list_22 == null) {
|
this.protocal_list_22 = {};
|
}
|
|
if (data.status == ActionConst.ActionStatus.un_finish) {
|
this.protocal_list_22[data.id] = null;
|
} else {
|
this.protocal_list_22[data.id] = data.id;
|
}
|
}
|
},
|
on10924: function on10924(data) {
|
cc.log("个人活动on10924", data);
|
|
if (data != null && data.act_list) {
|
for (var i = 0; i < data.act_list.length; ++i) {
|
var v = data.act_list[i];
|
this.handleActionStatusData(v);
|
|
if (MainuiConst.first_red_point[v.id] && v.status == 1) {
|
this.mainui_ctrl.setFunctionTipsStatus(v.id, MainuiConst.first_red_point[v.id]);
|
}
|
}
|
}
|
},
|
on10925: function on10925(data) {
|
this.handleActionStatusData(data);
|
|
if (MainuiConst.first_red_point[data.id] && data.status == 1) {
|
this.mainui_ctrl.setFunctionTipsStatus(data.id, MainuiConst.first_red_point[data.id]);
|
}
|
},
|
//请求所有活动未领取奖励状态
|
requestActionAwardStatus: function requestActionAwardStatus(type) {
|
var proto = {};
|
proto.type = type;
|
this.SendProtocal(16602, proto);
|
},
|
requestHolidayList: function requestHolidayList(type) {
|
var proto = {};
|
proto.type = type;
|
this.SendProtocal(16601, proto);
|
},
|
on16602: function on16602(data) {
|
for (var i = 0; i < data.holiday_list.length; ++i) {
|
var v = data.holiday_list[i];
|
this.setHolidayStatus(v.bid, v.can_get_num != false);
|
}
|
},
|
on16601: function on16601(data) {
|
cc.log(data, "on16601");
|
var temp_sub_vo;
|
var type_list = {};
|
|
for (var i = 0; i < data.holiday_list.length; ++i) {
|
var v = data.holiday_list[i];
|
|
if (this.holiday_del_list[v.bid] == null) {
|
temp_sub_vo = this.holiday_list[v.bid];
|
|
if (temp_sub_vo == null) {
|
var ActionSubTabVo = require("action_sub_tab_vo");
|
|
temp_sub_vo = new ActionSubTabVo();
|
this.holiday_list[v.bid] = temp_sub_vo;
|
}
|
|
temp_sub_vo = this.holiday_list[v.bid];
|
|
if (temp_sub_vo != null) {
|
temp_sub_vo.update(v);
|
} //活动类的投资计划和基金不在活动面板显示
|
|
|
if (this.isSpecialBid(v.bid)) {
|
temp_sub_vo.setShowStatus(false);
|
this.cs16603(v.bid);
|
} //判断这个活动所属的图标,并且动态设置他的名字
|
|
|
if (temp_sub_vo.cli_type != 0) {
|
if (type_list[temp_sub_vo.cli_type] == null) {
|
type_list[temp_sub_vo.cli_type] = {
|
action_num: 0,
|
action_name: ""
|
};
|
}
|
|
if (!this.isSpecialBid(temp_sub_vo.bid)) {
|
type_list[temp_sub_vo.cli_type].action_num = type_list[temp_sub_vo.cli_type].action_num + 1;
|
|
if (temp_sub_vo.cli_type_name != "" && temp_sub_vo.cli_type_name != "null" && type_list[temp_sub_vo.cli_type].action_name == "") {
|
type_list[temp_sub_vo.cli_type].action_name = temp_sub_vo.cli_type_name;
|
}
|
}
|
}
|
}
|
} // -- 初始化之后请求对应的活动红点状态
|
|
|
if (this.is_init_require == true) {
|
this.requestActionAwardStatus();
|
this.is_init_require = false;
|
} //判断是增删图标
|
|
|
for (var function_id in type_list) {
|
var object = type_list[function_id];
|
|
if (object) {
|
if (object.action_num > 0) {
|
this.mainui_ctrl.addFunctionIconById(function_id, object.action_name);
|
} else {
|
this.mainui_ctrl.removeFunctionIconById(function_id);
|
}
|
}
|
}
|
},
|
on16603: function on16603(data) {
|
//节日登录红点
|
if (data.bid == ActionConst.ActionRankCommonType.common_day || data.bid == ActionConst.ActionRankCommonType.festval_day || data.bid == ActionConst.ActionRankCommonType.lover_day) {
|
this.model.updataFestvalRedStatus(data.bid, data.aim_list);
|
} else if (data.bid == 1011) {
|
this.model.updataCombineLoginRedStatus(data.aim_list);
|
} else if (data.bid == 991014) {
|
this.model.updataPreferentialRedStatus(true, MainuiConst.icon.preferential);
|
} else if (data.bid == 91014) {
|
this.model.updataPreferentialRedStatus(true, MainuiConst.icon.other_preferential);
|
} // -- 没有子活动列表了,直接移除掉标签,下次有效(现在作废)
|
// if(data.aim_list.length == 0 ){
|
// this.handleHolidayList(0, data.bid)
|
// }
|
// -- 首充连冲
|
|
|
if (data.bid == 91005) {
|
this.handle91005Data(data);
|
} else if (data.bid == ActionConst.ActionRankCommonType.seven_charge) {} // 暂时没有
|
// this.model.setSevenChargeData(data)
|
// - 现在只要活动列表是空的,那么是投资计划后者是基金就删掉标签页
|
|
|
if (this.isSpecialBid(data.bid)) {
|
if (data.finish == 0 && this.need_show_init_red[data.bid] == null && data.aim_list.length != 0) {
|
var status = false;
|
var base_config = Config.holiday_client_data.data_info[data.bid];
|
|
if (base_config) {
|
var is_open = base_config.open_lev;
|
var role_vo = RoleController.getInstance().getRoleVo();
|
|
if (is_open && role_vo.lev) {
|
if (role_vo.lev >= is_open) {
|
status = true;
|
}
|
}
|
}
|
|
this.need_show_init_red[data.bid] = status;
|
this.setHolidayStatus(data.bid, status);
|
|
if (data.bid == ActionConst.ActionSpecialID.growfund) {
|
WelfareController.getInstance().setWelfareStatus(ActionConst.ActionSpecialID.growfund, status);
|
}
|
}
|
}
|
|
gcore.GlobalEvent.fire(ActionEvent.UPDATE_HOLIDAY_SIGNLE, data);
|
},
|
isSpecialBid: function isSpecialBid(bid) {
|
return bid == ActionConst.ActionSpecialID.invest || bid == ActionConst.ActionSpecialID.growfund;
|
},
|
//每日充值额外处理
|
handle91005Data: function handle91005Data(data) {
|
// --找出今日累充和累充天数的数据
|
if (!this.today_list) {
|
this.today_list = {};
|
}
|
|
if (data.aim_list && Utils.next(data.aim_list) != null) {
|
for (var k = 0; k < data.aim_list.length; ++k) {
|
var v = data.aim_list[k];
|
|
for (var a = 0; a < v.aim_args.length; ++a) {
|
var j = v.aim_args[a];
|
|
if (j.aim_args_key == 3) {
|
if (j.aim_args_val == 1) {
|
//--今日累充
|
this.today_list[k] = v;
|
this.today_list[k].has_num = this.has_num;
|
this.today_list[k].item_effect_list = this.item_effect_list;
|
}
|
} else if (j.aim_args_key == 4) {
|
// --需要充值多少钱
|
if (this.today_list[k]) {
|
this.today_list[k].need_charge = j.aim_args_val;
|
}
|
} else if (j.aim_args_key == 5) {
|
// --目标值 需要冲多少天
|
if (this.today_list[k]) {
|
this.today_list[k].charge_day = j.aim_args_val;
|
}
|
} else if (j.aim_args_key == 6) {
|
// --计数
|
if (this.today_list[k]) {
|
this.today_list[k].has_charge = j.aim_args_val;
|
}
|
}
|
}
|
}
|
} // this.checkShowDayCharge()
|
|
},
|
//获取指定类型和指定活动的id的子活动基础数据
|
getActionSubTabVo: function getActionSubTabVo(bid) {
|
if (this.holiday_list != null) {
|
return this.holiday_list[bid];
|
}
|
},
|
getAllActionList: function getAllActionList() {
|
return this.holiday_list;
|
},
|
// --desc:请求子活动列表
|
// --time:2017-07-26 07:56:10
|
// --@bid:子活动ID
|
// --@return
|
cs16603: function cs16603(bid) {
|
var protocal = {};
|
protocal.bid = bid;
|
this.SendProtocal(16603, protocal);
|
},
|
//领取奖励
|
cs16604: function cs16604(bid, aim, arg) {
|
var protocal = {};
|
protocal.bid = bid;
|
protocal.aim = aim;
|
protocal.arg = arg || 0;
|
this.SendProtocal(16604, protocal);
|
},
|
on16604: function on16604(data) {
|
message(data.msg); // showAssetsMsg(data.msg)
|
},
|
// ------------------@ 基金相关协议
|
// -- 请求基金开启数据
|
sender24700: function sender24700() {
|
var protocal = {};
|
this.SendProtocal(24700, protocal);
|
},
|
handle24700: function handle24700(data) {
|
if (data && data.ids) {
|
this.model.setOpenFundIds(data.ids);
|
gcore.GlobalEvent.fire(ActionEvent.UPDATA_FUND_ID_LIST_EVENT);
|
}
|
},
|
//-- 请求基金数据
|
sender24701: function sender24701(id) {
|
var protocal = {};
|
protocal.id = id;
|
this.SendProtocal(24701, protocal);
|
},
|
handle24701: function handle24701(data) {
|
if (data) {
|
this.model.setFundSrvData(data);
|
gcore.GlobalEvent.fire(ActionEvent.UPDATA_FUND_DATA_EVENT, data.id);
|
}
|
},
|
// -- 请求领取基金
|
sender24702: function sender24702(id) {
|
var protocal = {};
|
protocal.id = id;
|
this.SendProtocal(24702, protocal);
|
},
|
handle24702: function handle24702(data) {
|
if (data.msg) {
|
message(data.msg);
|
}
|
},
|
// -- 打开超值基金奖励预览界面
|
openActionFundAwardWindow: function openActionFundAwardWindow(status, group_id, fund_id) {
|
var self = this;
|
|
if (status) {
|
if (!self.fund_award_win) {
|
var actionFundAward = require("action_fund_award_window");
|
|
self.fund_award_win = new actionFundAward();
|
}
|
|
if (self.fund_award_win.isOpen() == false) {
|
self.fund_award_win.open({
|
group_id: group_id,
|
fund_id: fund_id
|
});
|
}
|
} else {
|
if (self.fund_award_win) {
|
self.fund_award_win.close();
|
self.fund_award_win = null;
|
}
|
}
|
},
|
// ==============================
|
// desc:7天登录状态
|
// ==============================
|
cs21100: function cs21100() {
|
this.SendProtocal(21100, {});
|
},
|
on21100: function on21100(data) {
|
var show_red = false;
|
|
for (var i in data.status_list) {
|
if (data.status_list[i].status == 2) {
|
this.mainui_ctrl.setFunctionTipsStatus(MainuiConst.icon.seven_login, true);
|
break;
|
}
|
}
|
|
var i = 0;
|
|
for (var k in data.status_list) {
|
if (data.status_list[k].status == 3) {
|
i = i + 1;
|
}
|
}
|
|
if (i == data.status_list.length) {
|
this.mainui_ctrl.setFunctionTipsStatus(MainuiConst.icon.seven_login, false);
|
}
|
|
this.model.updateSevenLoginData(data);
|
gcore.GlobalEvent.fire(ActionEvent.UPDATE_SEVEN_LOGIN_STATUS, data);
|
},
|
// ==============================
|
// desc:7天登录领取奖励
|
// ==============================
|
cs21101: function cs21101(day) {
|
var protocal = {};
|
protocal.day = day;
|
this.SendProtocal(21101, protocal);
|
},
|
on21101: function on21101(data) {
|
message(data.msg);
|
|
if (data.code == 1) {
|
gcore.GlobalEvent.fire(ActionEvent.UPDATE_SEVEN_LOGIN_REWARDS, data);
|
this.cs21100();
|
}
|
},
|
// 打开七天登录界面
|
openSevenLoginWin: function openSevenLoginWin(status) {
|
if (status) {
|
if (!this.seven_login_win) {
|
this.seven_login_win = Utils.createClass("action_seven_login_window", this);
|
}
|
|
if (this.seven_login_win && this.seven_login_win.isOpen() == false) {
|
this.seven_login_win.open();
|
}
|
} else {
|
if (this.seven_login_win) {
|
this.seven_login_win.close();
|
this.seven_login_win = null;
|
}
|
}
|
},
|
// 打开七天目标界面
|
openSevenGoalView: function openSevenGoalView(status) {
|
if (status) {
|
if (!this.seven_goal_win) {
|
this.seven_goal_win = Utils.createClass("action_seven_goal_window", this);
|
}
|
|
if (this.seven_goal_win && this.seven_goal_win.isOpen() == false) {
|
this.seven_goal_win.open();
|
}
|
} else {
|
if (this.seven_goal_win) {
|
this.seven_goal_win.close();
|
this.seven_goal_win = null;
|
}
|
}
|
},
|
cs13601: function cs13601() {
|
this.SendProtocal(13601, {});
|
},
|
handle13601: function handle13601(data) {
|
if (data.period == 0) return;
|
this.model.setSevenGoldPeriod(data.period || 1);
|
this.model.initSevenWalfare(data.period || 1);
|
this.model.setSevenGoalWelfareList(data.welfare_list);
|
this.model.setSevenGoalGrowList(data.grow_list);
|
this.model.setHalfGiftList(data.price_list);
|
this.model.setSevenGoalBoxList(data.finish_list, data.num);
|
this.model.checkRedPoint(data.cur_day);
|
gcore.GlobalEvent.fire(ActionEvent.UPDATE_SEVENT_GOAL, data);
|
},
|
// 请求七日活动领取
|
cs13602: function cs13602(type, day, id, item) {
|
var protocal = {};
|
protocal.type = type;
|
protocal.day_type = day;
|
protocal.id = id;
|
protocal.item = item;
|
this.SendProtocal(13602, protocal);
|
},
|
handle13602: function handle13602(data) {
|
message(data.msg);
|
|
if (data.flag == 1) {
|
gcore.GlobalEvent.fire(ActionEvent.UPDATE_SEVENT_GET, data);
|
}
|
},
|
//活动主界面
|
//属于竞猜活动 还是属于节日活动,MainuiConst.icon.action 或者 MainuiConst.icon.festival
|
openActionMainPanel: function openActionMainPanel(status, function_id, action_bid) {
|
if (status == false) {
|
if (this.action_operate != null) {
|
this.action_operate.close();
|
this.action_operate = null;
|
}
|
} else {
|
if (action_bid != null) {
|
var action_vo = this.holiday_list[action_bid];
|
|
if (action_vo) {
|
function_id = action_vo.cli_type;
|
}
|
}
|
|
if (function_id == null) {
|
function_id = MainuiConst.icon.action;
|
}
|
|
if (this.action_operate == null) {
|
this.action_operate = Utils.createClass("action_main_window");
|
}
|
|
if (this.action_operate.isOpen() == false) this.action_operate.open({
|
function_id: function_id,
|
action_bid: action_bid
|
});
|
}
|
},
|
//获得指定类型活动的所有子活动列表,用于主界面显示,这里做一个排序处理吧
|
getActionSubList: function getActionSubList(function_id) {
|
var action_sub_list = [];
|
|
if (this.holiday_list) {
|
for (var k in this.holiday_list) {
|
var v = this.holiday_list[k];
|
|
if (v.cli_type == function_id && v.isShowInAction() == true) {
|
action_sub_list.push(v);
|
}
|
}
|
}
|
|
if (Utils.next(action_sub_list) != null) {
|
action_sub_list.sort(function (a, b) {
|
return a.sort_val - b.sort_val;
|
});
|
}
|
|
return action_sub_list;
|
},
|
// -------------------------------升级有礼协议-------------------------------------
|
send21200: function send21200() {
|
var protocal = {};
|
this.SendProtocal(21200, protocal);
|
},
|
handle21200: function handle21200(data) {
|
gcore.GlobalEvent.fire(ActionEvent.UPDATE_LEVEL_UP_GIFT, data);
|
},
|
send21201: function send21201(id) {
|
var protocal = {};
|
protocal.id = id;
|
this.SendProtocal(21201, protocal);
|
},
|
handle21201: function handle21201(data) {
|
message(data.msg);
|
},
|
//获取一个指定类型活动指定子活动可领取状态数据
|
getHolidayAweradsStatus: function getHolidayAweradsStatus(bid) {
|
if (this.holiday_award_list != null && this.holiday_award_list[bid] != null) {
|
return this.holiday_award_list[bid];
|
}
|
},
|
//排行榜奖励预览协议(以后可能是活动通用排行奖励信息)
|
send16650: function send16650(bid) {
|
var protocal = {};
|
protocal.bid = bid;
|
this.SendProtocal(16650, protocal);
|
},
|
handle16650: function handle16650(data) {
|
message(data.msg);
|
gcore.GlobalEvent.fire(ActionEvent.RANK_REWARD_LIST, data);
|
},
|
// --desc:活动领取返回
|
on16606: function on16606(data) {
|
this.setHolidayStatus(data.bid, data.can_get_num != false);
|
},
|
on16607: function on16607(data) {
|
if (data && data.type == 0) {
|
//--0点更新
|
this.needRequireData(true);
|
}
|
},
|
// 幸运转盘
|
requestLucky: function requestLucky() {
|
this.SendProtocal(16637, {});
|
},
|
handle16637: function handle16637(data) {
|
this.model.setTreasureInitData(data.dial_data);
|
this.model.lucklyRedPoint();
|
gcore.GlobalEvent.fire(ActionEvent.UPDATE_LUCKYROUND_GET, data);
|
},
|
send16638: function send16638(type, count) {
|
var protocal = {};
|
protocal.type = type;
|
protocal.type2 = count;
|
this.SendProtocal(16638, protocal);
|
},
|
handle16638: function handle16638(data) {
|
gcore.GlobalEvent.fire(ActionEvent.TREASURE_SUCCESS_DATA, data);
|
},
|
handle16639: function handle16639(data) {
|
gcore.GlobalEvent.fire(ActionEvent.UPDATE_LUCKLY_DATA, data);
|
},
|
send16640: function send16640(type, id) {
|
var protocal = {};
|
protocal.type = type;
|
protocal.id = id;
|
this.SendProtocal(16640, protocal);
|
},
|
handle16641: function handle16641(data) {
|
gcore.GlobalEvent.fire(ActionEvent.UPDATA_TREASURE_LOG_DATA, data);
|
},
|
send16642: function send16642(type) {
|
var protocal = {};
|
protocal.type = type;
|
this.SendProtocal(16642, protocal);
|
},
|
handle16642: function handle16642(data) {
|
message(data.msg); // -- GlobalEvent:getInstance():Fire(ActionEvent.UPDATA_TREASURE_REFRESH, data)
|
},
|
// 弹窗的
|
send16643: function send16643(type, count) {
|
var protocal = {};
|
protocal.type = type;
|
protocal.type2 = count;
|
this.SendProtocal(16643, protocal);
|
},
|
handle16643: function handle16643(data) {
|
message(data.msg);
|
|
if (data.code == 1) {
|
gcore.GlobalEvent.fire(ActionEvent.UPDATA_TREASURE_POPUPS_SEND, data);
|
}
|
},
|
// -----打开幸运探宝界面-----
|
openLuckyTreasureWin: function openLuckyTreasureWin(status, index) {
|
index = index || 1;
|
|
if (status) {
|
var is_open = this.mainui_ctrl.checkMainFunctionOpenStatus(MainuiConst.icon.lucky_treasure, MainuiConst.function_type.other, false);
|
|
if (is_open == false) {
|
return;
|
} // 高级探宝的时候
|
|
|
if (index == 2) {
|
this.model.setBuyRewardData();
|
var open_data = this.model.getBuyRewardData(index);
|
var open = this.mainui_ctrl.checkIsOpenByActivate(open_data[1].limit_open);
|
|
if (open == false) {
|
message(Utils.TI18N("人物等级不足"));
|
return;
|
}
|
}
|
|
if (!this.treasure_win) {
|
this.treasure_win = Utils.createClass("action_treasure_window", this);
|
}
|
|
if (this.treasure_win && this.treasure_win.isOpen() == false) {
|
this.treasure_win.open(index);
|
}
|
} else {
|
if (this.treasure_win) {
|
this.treasure_win.close();
|
this.treasure_win = null;
|
}
|
}
|
},
|
getTreasureView: function getTreasureView() {
|
if (this.treasure_win) {
|
return this.treasure_win;
|
}
|
},
|
checkOpenActionLimitGiftMainWindow: function checkOpenActionLimitGiftMainWindow() {
|
var self = this;
|
|
if (self.active_limit_gift_id == 2001) {
|
//-- 18级的不提示
|
self.active_limit_gift_id = null;
|
return;
|
}
|
|
if (self.active_limit_gift_id != null) {
|
var config = Config.star_gift_data.data_limit_gift[self.active_limit_gift_id];
|
|
if (config) {
|
var gift_id = self.active_limit_gift_id;
|
|
var CommonAlert = require("commonalert");
|
|
CommonAlert.show(config.desc, Utils.TI18N('前往'), function () {
|
this.openActionLimitGiftMainWindow(true, gift_id);
|
}.bind(this), Utils.TI18N('取消'));
|
}
|
}
|
|
self.active_limit_gift_id = null;
|
},
|
// --打开限时礼包入口
|
// --打开显示礼包id
|
openActionLimitGiftMainWindow: function openActionLimitGiftMainWindow(status, id) {
|
var self = this;
|
|
if (status) {
|
if (!self.action_limit_gift) {
|
var ActionLimitGiftMainWindow = require("action_limit_gift_main_window");
|
|
self.action_limit_gift = new ActionLimitGiftMainWindow();
|
}
|
|
self.action_limit_gift.open(id);
|
} else {
|
if (self.action_limit_gift) {
|
self.action_limit_gift.close();
|
self.action_limit_gift = null;
|
}
|
}
|
},
|
send21210: function send21210() {
|
var protocal = {};
|
this.SendProtocal(21210, protocal);
|
},
|
handle21210: function handle21210(data) {
|
message(data.msg);
|
gcore.GlobalEvent.fire(ActionEvent.LIMIT_GIFT_MAIN_EVENT, data);
|
},
|
// --推送激活了显示礼包.并且在某些操作后需要显示
|
handle21211: function handle21211(data) {
|
this.active_limit_gift_id = data.id;
|
},
|
// 探宝获得物品界面
|
openTreasureGetItemWindow: function openTreasureGetItemWindow(status, data, index, count_type) {
|
if (status) {
|
if (!this.treasure_get_win) {
|
var ActionTreasureGetWindow = require("action_treasure_get_window");
|
|
this.treasure_get_win = new ActionTreasureGetWindow(this, data, index, count_type);
|
}
|
|
if (this.treasure_get_win && this.treasure_get_win.isOpen() == false) {
|
this.treasure_get_win.open();
|
}
|
} else {
|
if (this.treasure_get_win) {
|
this.treasure_get_win.close();
|
this.treasure_get_win = null;
|
}
|
}
|
},
|
getSevenLoginRoot: function getSevenLoginRoot() {
|
if (this.seven_login_win) return this.seven_login_win.root_wnd;
|
},
|
getTreasureRoot: function getTreasureRoot() {
|
if (this.treasure_win) return this.treasure_win.root_wnd;
|
},
|
//是否可以创建指定活动类型,只有活动总列表里面有这个活动类型才可以创建
|
checkCanAddWonderful: function checkCanAddWonderful(function_id) {
|
if (function_id == null) return false;
|
if (this.holiday_list == null || Utils.next(this.holiday_list) == null) return false;
|
|
for (var k in this.holiday_list) {
|
var v = this.holiday_list[k];
|
|
if (v.cli_type == function_id) {
|
return true;
|
}
|
}
|
|
return false;
|
},
|
//--------------------杂货铺协议开始-------------------------------------
|
sender16688: function sender16688() {
|
this.SendProtocal(16688, {});
|
},
|
handle16688: function handle16688(data) {
|
this.model.setStoneShopData(data.buy_info);
|
gcore.GlobalEvent.fire(ActionEvent.UPDATE_STORE_DATA_EVENT);
|
},
|
sender16689: function sender16689(id, num) {
|
var protocal = {};
|
protocal.id = id;
|
protocal.num = num;
|
this.SendProtocal(16689, protocal);
|
},
|
handle16689: function handle16689(data) {
|
message(data.msg);
|
|
if (data.code == 1) {
|
gcore.GlobalEvent.fire(ActionEvent.UPDATE_STORE_DATA_SUCCESS_EVENT, data);
|
}
|
},
|
//--------------------新服限购协议结束-------------------------------------
|
// --------------------新服限购协议开始-------------------------------------
|
// 红点
|
sender16687: function sender16687(send_protocal) {
|
var protocal = send_protocal || {};
|
var len = 0;
|
|
for (var i in send_protocal) {
|
len += 1;
|
break;
|
}
|
|
if (len == 0) {
|
protocal.bid = 91029;
|
}
|
|
this.SendProtocal(16687, protocal);
|
},
|
handle16687: function handle16687(data) {
|
var status = false;
|
|
if (data.code == 1) {
|
status = true;
|
}
|
|
data.status = status;
|
|
if (data.bid == ActionConst.ActionRankCommonType.open_server) {
|
MainuiController.getInstance().setFunctionTipsStatus(MainuiConst.icon.open_server_recharge, status);
|
} else if (data.bid == ActionConst.ActionRankCommonType.high_value_gift || data.bid == ActionConst.ActionRankCommonType.mysterious_store) {
|
this.model.updateGiftRedPointStatus(data);
|
}
|
},
|
//--------------------新服限购协议结束-------------------------------------
|
// 判断是否能充值
|
sender21016: function sender21016(charge_id) {
|
var protocal = {};
|
protocal.charge_id = charge_id;
|
this.SendProtocal(21016, protocal);
|
},
|
handle21016: function handle21016(data) {
|
gcore.GlobalEvent.fire(ActionEvent.Is_Charge_Event, data);
|
},
|
// ==============================--
|
// desc:登录时候请求一些特殊活动id的红点数据
|
// time:2017-07-18 05:15:10
|
// @return
|
// ==============================--
|
requestActionRedStatus: function requestActionRedStatus() {
|
this.sender16687({
|
bid: ActionConst.ActionRankCommonType.open_server
|
}); //小额直购请求红点
|
|
this.sender16687({
|
bid: ActionConst.ActionRankCommonType.high_value_gift
|
}); //小额礼包请求红点
|
|
this.sender16687({
|
bid: ActionConst.ActionRankCommonType.mysterious_store
|
}); //神秘杂货店请求红点
|
},
|
//--------------------元宵冒险协议开始-------------------------------------
|
// -- 请求任务信息
|
sender24810: function sender24810() {
|
var protocal = {};
|
this.SendProtocal(24810, protocal);
|
},
|
handle24810: function handle24810(data) {
|
message(data.msg);
|
gcore.GlobalEvent.fire(ActionEvent.YUAN_ZHEN_DATA_EVENT, data);
|
},
|
// --推送任务
|
handle24811: function handle24811(data) {
|
gcore.GlobalEvent.fire(ActionEvent.YUAN_ZHEN_UPDATA_EVENT, data);
|
},
|
// -- 完成任务
|
sender24812: function sender24812(id) {
|
var protocal = {};
|
protocal.id = id;
|
this.SendProtocal(24812, protocal);
|
},
|
handle24812: function handle24812(data) {
|
message(data.msg);
|
|
if (data.code == true) {
|
gcore.GlobalEvent.fire(ActionEvent.YUAN_ZHEN_TASK_EVENT, data);
|
}
|
},
|
//--------------------元宵冒险协议结束-------------------------------------
|
// 触发礼包
|
openTriggerGiftWindow: function openTriggerGiftWindow(status) {
|
if (status) {
|
if (!this.action_time_gift_big) {
|
var ActionTimeGiftBigWindow = require("action_time_gift_big_window");
|
|
this.action_time_gift_big = new ActionTimeGiftBigWindow(this);
|
}
|
|
if (this.action_time_gift_big && this.action_time_gift_big.isOpen() == false) {
|
this.action_time_gift_big.open();
|
}
|
} else {
|
if (this.action_time_gift_big) {
|
this.action_time_gift_big.close();
|
this.action_time_gift_big = null;
|
}
|
}
|
},
|
sender21220: function sender21220() {
|
this.SendProtocal(21220, {});
|
},
|
handle21220: function handle21220(data) {
|
message(data.msg);
|
gcore.GlobalEvent.fire(ActionEvent.TRIGGER_GIFT_EVENT, data);
|
},
|
// --开服超值礼包界面
|
openActionOpenServerGiftWindow: function openActionOpenServerGiftWindow(status, bid) {
|
if (status) {
|
if (!this.action_open_server_recharge) {
|
var ActionOpenServerGiftWindow = require("action_open_server_gift_window");
|
|
this.action_open_server_recharge = new ActionOpenServerGiftWindow(this);
|
}
|
|
if (this.action_open_server_recharge && this.action_open_server_recharge.isOpen() == false) {
|
this.action_open_server_recharge.open(bid);
|
}
|
} else {
|
if (this.action_open_server_recharge) {
|
this.action_open_server_recharge.close();
|
this.action_open_server_recharge = null;
|
}
|
}
|
},
|
//--试炼之境
|
sender24813: function sender24813() {
|
this.SendProtocal(24813, {});
|
},
|
handle24813: function handle24813(data) {
|
message(data.msg);
|
gcore.GlobalEvent.fire(ActionEvent.YUAN_ZHEN_DATA_EVENT, data);
|
},
|
//检查活动是否存在exist
|
//@action_bid 活动基础id
|
//@camp_id 活动id 属于可以选参数, 如果有值表示需要判定 如果为nil 表示 不需要判定
|
checkActionExistByActionBid: function checkActionExistByActionBid(action_bid) {
|
if (!action_bid) return false;
|
var tab_vo = this.getActionSubTabVo(action_bid);
|
if (tab_vo) return true;
|
return false;
|
},
|
sender24814: function sender24814(id) {
|
var protocal = {};
|
protocal.id = id;
|
this.SendProtocal(24814, protocal);
|
},
|
handle24814: function handle24814(data) {
|
message(data.msg);
|
gcore.GlobalEvent.fire(ActionEvent.YUAN_ZHEN_TASK_EVENT, data);
|
},
|
//时装---------
|
sender30101: function sender30101() {
|
this.SendProtocal(30101, {});
|
},
|
handle30101: function handle30101(data) {
|
message(data.msg);
|
gcore.GlobalEvent.fire(ActionEvent.SKIN_INFO_EVENT, data);
|
},
|
sender30100: function sender30100() {
|
this.SendProtocal(30100, {});
|
},
|
handle30100: function handle30100(data) {
|
message(data.msg);
|
},
|
handle30102: function handle30102(data) {
|
MainuiController.getInstance().setFunctionTipsStatus(MainuiConst.icon.skin, data.code == 1);
|
},
|
openBuySkinWindow: function openBuySkinWindow(status) {
|
if (status) {
|
if (!this.action_buy_skin) {
|
var ActionBuySkinWindow = require("action_buy_skin_window");
|
|
this.action_buy_skin = new ActionBuySkinWindow(this);
|
|
if (this.action_buy_skin && this.action_buy_skin.isOpen() == false) {
|
this.action_buy_skin.open();
|
}
|
}
|
} else {
|
if (this.action_buy_skin) {
|
this.action_buy_skin.close();
|
this.action_buy_skin = null;
|
}
|
}
|
}
|
});
|
module.exports = ActionController;
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxhY3Rpb25cXGFjdGlvbl9jb250cm9sbGVyLmpzIl0sIm5hbWVzIjpbIkFjdGlvbkNvbnN0IiwicmVxdWlyZSIsIk1haW51aUNvbnRyb2xsZXIiLCJNYWludWlDb25zdCIsIkFjdGlvbkV2ZW50IiwiUm9sZUNvbnRyb2xsZXIiLCJXZWxmYXJlQ29udHJvbGxlciIsIk9yZGVyYWN0aW9uQ29uc3QiLCJBY3Rpb25Db250cm9sbGVyIiwiY2MiLCJDbGFzcyIsIkJhc2VDb250cm9sbGVyIiwiY3RvciIsImluaXRDb25maWciLCJBY3Rpb25Nb2RlbCIsIm1vZGVsIiwibWFpbnVpX2N0cmwiLCJnZXRJbnN0YW5jZSIsImhvbGlkYXlfbGlzdCIsImhvbGlkYXlfZGVsX2xpc3QiLCJob2xpZGF5X2F3YXJkX2xpc3QiLCJuZWVkX3Nob3dfaW5pdF9yZWQiLCJnZXRNb2RlbCIsInJlZ2lzdGVyRXZlbnRzIiwiaW5pdF9yb2xlX2V2ZW50IiwiZ2NvcmUiLCJHbG9iYWxFdmVudCIsImJpbmQiLCJFdmVudElkIiwiRVZUX1JPTEVfQ1JFQVRFX1NVQ0NFU1MiLCJ1bmJpbmQiLCJuZWVkUmVxdWlyZURhdGEiLCJzZWxmIiwib3BlbkFjdGlvbk1haW5QYW5lbCIsImlzX2luaXRfcmVxdWlyZSIsImNsZWFyRnVuZFNydkRhdGEiLCJyZXF1ZXN0QWN0aW9uU3RhdHVzIiwicmVxdWVzdEhvbGlkYXlMaXN0IiwiQWN0aW9uVHlwZSIsIldvbmRlcmZ1bCIsInJlZ2lzdGVyUHJvdG9jYWxzIiwiUmVnaXN0ZXJQcm90b2NhbCIsIm9uMTA5MjIiLCJvbjE2NjAxIiwib24xNjYwMyIsIm9uMTY2MDQiLCJvbjEwOTIzIiwib24xMDkyNCIsIm9uMTA5MjUiLCJvbjE2NjAyIiwib24xNjYwNiIsIm9uMTY2MDciLCJoYW5kbGUyNDcwMCIsImhhbmRsZTI0NzAxIiwiaGFuZGxlMjQ3MDIiLCJvbjIxMTAwIiwib24yMTEwMSIsImhhbmRsZTEzNjAxIiwiaGFuZGxlMTM2MDIiLCJoYW5kbGUyMTIwMCIsImhhbmRsZTIxMjAxIiwiaGFuZGxlMTY2NTAiLCJoYW5kbGUxNjYzNyIsImhhbmRsZTE2NjM4IiwiaGFuZGxlMTY2MzkiLCJoYW5kbGUxNjY0MSIsImhhbmRsZTE2NjQyIiwiaGFuZGxlMTY2NDMiLCJoYW5kbGUxNjY4OCIsImhhbmRsZTE2Njg5IiwiaGFuZGxlMjEyMTAiLCJoYW5kbGUyMTIxMSIsImhhbmRsZTIxMDE2IiwiaGFuZGxlMTY2ODciLCJoYW5kbGUyNDgxMCIsImhhbmRsZTI0ODExIiwiaGFuZGxlMjQ4MTIiLCJoYW5kbGUyMTIyMCIsImhhbmRsZTI0ODEzIiwiaGFuZGxlMjQ4MTQiLCJoYW5kbGUzMDEwMSIsImhhbmRsZTMwMTAwIiwiaGFuZGxlMzAxMDIiLCJTZW5kUHJvdG9jYWwiLCJPcmRlckFjdGlvbkVudHJhbmNlSUQiLCJlbnRyYW5jZV9pZCIsImhhbmRsZUFjdGlvblN0YXR1c0RhdGEiLCJkYXRhIiwiY29uZmlnIiwiQ29uZmlnIiwiZnVuY3Rpb25fZGF0YSIsImRhdGFfaW5mbyIsImlkIiwic3RhdHVzIiwiQWN0aW9uU3RhdHVzIiwidW5fZmluaXNoIiwicmVtb3ZlRnVuY3Rpb25JY29uQnlJZCIsImFkZEZ1bmN0aW9uSWNvbkJ5SWQiLCJpY29uIiwic2V2ZW5fcmFuayIsImZ1bmQiLCJjaGVja0Z1bmRSZWRTdGF0dXMiLCJzZXRIb2xpZGF5U3RhdHVzIiwiYmlkIiwidm8iLCJ2bzEiLCJudW0iLCJhY3Rpb25fc3ViX3ZvIiwiZnVuY3Rpb25faWQiLCJ3ZWxmYXJlIiwiaXNTcGVjaWFsQmlkIiwic2V0RnVuY3Rpb25UaXBzU3RhdHVzIiwiY2xpX3R5cGUiLCJmaXJlIiwiVVBEQVRFX0hPTElEQVlfVEFCX1NUQVRVUyIsInByb3RvY2FsX2xpc3RfMjIiLCJhY3RfbGlzdCIsImkiLCJsZW5ndGgiLCJ2IiwibG9nIiwiZmlyc3RfcmVkX3BvaW50IiwicmVxdWVzdEFjdGlvbkF3YXJkU3RhdHVzIiwidHlwZSIsInByb3RvIiwiY2FuX2dldF9udW0iLCJ0ZW1wX3N1Yl92byIsInR5cGVfbGlzdCIsIkFjdGlvblN1YlRhYlZvIiwidXBkYXRlIiwic2V0U2hvd1N0YXR1cyIsImNzMTY2MDMiLCJhY3Rpb25fbnVtIiwiYWN0aW9uX25hbWUiLCJjbGlfdHlwZV9uYW1lIiwib2JqZWN0IiwiQWN0aW9uUmFua0NvbW1vblR5cGUiLCJjb21tb25fZGF5IiwiZmVzdHZhbF9kYXkiLCJsb3Zlcl9kYXkiLCJ1cGRhdGFGZXN0dmFsUmVkU3RhdHVzIiwiYWltX2xpc3QiLCJ1cGRhdGFDb21iaW5lTG9naW5SZWRTdGF0dXMiLCJ1cGRhdGFQcmVmZXJlbnRpYWxSZWRTdGF0dXMiLCJwcmVmZXJlbnRpYWwiLCJvdGhlcl9wcmVmZXJlbnRpYWwiLCJoYW5kbGU5MTAwNURhdGEiLCJzZXZlbl9jaGFyZ2UiLCJmaW5pc2giLCJiYXNlX2NvbmZpZyIsImhvbGlkYXlfY2xpZW50X2RhdGEiLCJpc19vcGVuIiwib3Blbl9sZXYiLCJyb2xlX3ZvIiwiZ2V0Um9sZVZvIiwibGV2IiwiQWN0aW9uU3BlY2lhbElEIiwiZ3Jvd2Z1bmQiLCJzZXRXZWxmYXJlU3RhdHVzIiwiVVBEQVRFX0hPTElEQVlfU0lHTkxFIiwiaW52ZXN0IiwidG9kYXlfbGlzdCIsIlV0aWxzIiwibmV4dCIsImsiLCJhIiwiYWltX2FyZ3MiLCJqIiwiYWltX2FyZ3Nfa2V5IiwiYWltX2FyZ3NfdmFsIiwiaGFzX251bSIsIml0ZW1fZWZmZWN0X2xpc3QiLCJuZWVkX2NoYXJnZSIsImNoYXJnZV9kYXkiLCJoYXNfY2hhcmdlIiwiZ2V0QWN0aW9uU3ViVGFiVm8iLCJnZXRBbGxBY3Rpb25MaXN0IiwicHJvdG9jYWwiLCJjczE2NjA0IiwiYWltIiwiYXJnIiwibWVzc2FnZSIsIm1zZyIsInNlbmRlcjI0NzAwIiwiaWRzIiwic2V0T3BlbkZ1bmRJZHMiLCJVUERBVEFfRlVORF9JRF9MSVNUX0VWRU5UIiwic2VuZGVyMjQ3MDEiLCJzZXRGdW5kU3J2RGF0YSIsIlVQREFUQV9GVU5EX0RBVEFfRVZFTlQiLCJzZW5kZXIyNDcwMiIsIm9wZW5BY3Rpb25GdW5kQXdhcmRXaW5kb3ciLCJncm91cF9pZCIsImZ1bmRfaWQiLCJmdW5kX2F3YXJkX3dpbiIsImFjdGlvbkZ1bmRBd2FyZCIsImlzT3BlbiIsIm9wZW4iLCJjbG9zZSIsImNzMjExMDAiLCJzaG93X3JlZCIsInN0YXR1c19saXN0Iiwic2V2ZW5fbG9naW4iLCJ1cGRhdGVTZXZlbkxvZ2luRGF0YSIsIlVQREFURV9TRVZFTl9MT0dJTl9TVEFUVVMiLCJjczIxMTAxIiwiZGF5IiwiY29kZSIsIlVQREFURV9TRVZFTl9MT0dJTl9SRVdBUkRTIiwib3BlblNldmVuTG9naW5XaW4iLCJzZXZlbl9sb2dpbl93aW4iLCJjcmVhdGVDbGFzcyIsIm9wZW5TZXZlbkdvYWxWaWV3Iiwic2V2ZW5fZ29hbF93aW4iLCJjczEzNjAxIiwicGVyaW9kIiwic2V0U2V2ZW5Hb2xkUGVyaW9kIiwiaW5pdFNldmVuV2FsZmFyZSIsInNldFNldmVuR29hbFdlbGZhcmVMaXN0Iiwid2VsZmFyZV9saXN0Iiwic2V0U2V2ZW5Hb2FsR3Jvd0xpc3QiLCJncm93X2xpc3QiLCJzZXRIYWxmR2lmdExpc3QiLCJwcmljZV9saXN0Iiwic2V0U2V2ZW5Hb2FsQm94TGlzdCIsImZpbmlzaF9saXN0IiwiY2hlY2tSZWRQb2ludCIsImN1cl9kYXkiLCJVUERBVEVfU0VWRU5UX0dPQUwiLCJjczEzNjAyIiwiaXRlbSIsImRheV90eXBlIiwiZmxhZyIsIlVQREFURV9TRVZFTlRfR0VUIiwiYWN0aW9uX2JpZCIsImFjdGlvbl9vcGVyYXRlIiwiYWN0aW9uX3ZvIiwiYWN0aW9uIiwiZ2V0QWN0aW9uU3ViTGlzdCIsImFjdGlvbl9zdWJfbGlzdCIsImlzU2hvd0luQWN0aW9uIiwicHVzaCIsInNvcnQiLCJiIiwic29ydF92YWwiLCJzZW5kMjEyMDAiLCJVUERBVEVfTEVWRUxfVVBfR0lGVCIsInNlbmQyMTIwMSIsImdldEhvbGlkYXlBd2VyYWRzU3RhdHVzIiwic2VuZDE2NjUwIiwiUkFOS19SRVdBUkRfTElTVCIsInJlcXVlc3RMdWNreSIsInNldFRyZWFzdXJlSW5pdERhdGEiLCJkaWFsX2RhdGEiLCJsdWNrbHlSZWRQb2ludCIsIlVQREFURV9MVUNLWVJPVU5EX0dFVCIsInNlbmQxNjYzOCIsImNvdW50IiwidHlwZTIiLCJUUkVBU1VSRV9TVUNDRVNTX0RBVEEiLCJVUERBVEVfTFVDS0xZX0RBVEEiLCJzZW5kMTY2NDAiLCJVUERBVEFfVFJFQVNVUkVfTE9HX0RBVEEiLCJzZW5kMTY2NDIiLCJzZW5kMTY2NDMiLCJVUERBVEFfVFJFQVNVUkVfUE9QVVBTX1NFTkQiLCJvcGVuTHVja3lUcmVhc3VyZVdpbiIsImluZGV4IiwiY2hlY2tNYWluRnVuY3Rpb25PcGVuU3RhdHVzIiwibHVja3lfdHJlYXN1cmUiLCJmdW5jdGlvbl90eXBlIiwib3RoZXIiLCJzZXRCdXlSZXdhcmREYXRhIiwib3Blbl9kYXRhIiwiZ2V0QnV5UmV3YXJkRGF0YSIsImNoZWNrSXNPcGVuQnlBY3RpdmF0ZSIsImxpbWl0X29wZW4iLCJUSTE4TiIsInRyZWFzdXJlX3dpbiIsImdldFRyZWFzdXJlVmlldyIsImNoZWNrT3BlbkFjdGlvbkxpbWl0R2lmdE1haW5XaW5kb3ciLCJhY3RpdmVfbGltaXRfZ2lmdF9pZCIsInN0YXJfZ2lmdF9kYXRhIiwiZGF0YV9saW1pdF9naWZ0IiwiZ2lmdF9pZCIsIkNvbW1vbkFsZXJ0Iiwic2hvdyIsImRlc2MiLCJvcGVuQWN0aW9uTGltaXRHaWZ0TWFpbldpbmRvdyIsImFjdGlvbl9saW1pdF9naWZ0IiwiQWN0aW9uTGltaXRHaWZ0TWFpbldpbmRvdyIsInNlbmQyMTIxMCIsIkxJTUlUX0dJRlRfTUFJTl9FVkVOVCIsIm9wZW5UcmVhc3VyZUdldEl0ZW1XaW5kb3ciLCJjb3VudF90eXBlIiwidHJlYXN1cmVfZ2V0X3dpbiIsIkFjdGlvblRyZWFzdXJlR2V0V2luZG93IiwiZ2V0U2V2ZW5Mb2dpblJvb3QiLCJyb290X3duZCIsImdldFRyZWFzdXJlUm9vdCIsImNoZWNrQ2FuQWRkV29uZGVyZnVsIiwic2VuZGVyMTY2ODgiLCJzZXRTdG9uZVNob3BEYXRhIiwiYnV5X2luZm8iLCJVUERBVEVfU1RPUkVfREFUQV9FVkVOVCIsInNlbmRlcjE2Njg5IiwiVVBEQVRFX1NUT1JFX0RBVEFfU1VDQ0VTU19FVkVOVCIsInNlbmRlcjE2Njg3Iiwic2VuZF9wcm90b2NhbCIsImxlbiIsIm9wZW5fc2VydmVyIiwib3Blbl9zZXJ2ZXJfcmVjaGFyZ2UiLCJoaWdoX3ZhbHVlX2dpZnQiLCJteXN0ZXJpb3VzX3N0b3JlIiwidXBkYXRlR2lmdFJlZFBvaW50U3RhdHVzIiwic2VuZGVyMjEwMTYiLCJjaGFyZ2VfaWQiLCJJc19DaGFyZ2VfRXZlbnQiLCJyZXF1ZXN0QWN0aW9uUmVkU3RhdHVzIiwic2VuZGVyMjQ4MTAiLCJZVUFOX1pIRU5fREFUQV9FVkVOVCIsIllVQU5fWkhFTl9VUERBVEFfRVZFTlQiLCJzZW5kZXIyNDgxMiIsIllVQU5fWkhFTl9UQVNLX0VWRU5UIiwib3BlblRyaWdnZXJHaWZ0V2luZG93IiwiYWN0aW9uX3RpbWVfZ2lmdF9iaWciLCJBY3Rpb25UaW1lR2lmdEJpZ1dpbmRvdyIsInNlbmRlcjIxMjIwIiwiVFJJR0dFUl9HSUZUX0VWRU5UIiwib3BlbkFjdGlvbk9wZW5TZXJ2ZXJHaWZ0V2luZG93IiwiYWN0aW9uX29wZW5fc2VydmVyX3JlY2hhcmdlIiwiQWN0aW9uT3BlblNlcnZlckdpZnRXaW5kb3ciLCJzZW5kZXIyNDgxMyIsImNoZWNrQWN0aW9uRXhpc3RCeUFjdGlvbkJpZCIsInRhYl92byIsInNlbmRlcjI0ODE0Iiwic2VuZGVyMzAxMDEiLCJTS0lOX0lORk9fRVZFTlQiLCJzZW5kZXIzMDEwMCIsInNraW4iLCJvcGVuQnV5U2tpbldpbmRvdyIsImFjdGlvbl9idXlfc2tpbiIsIkFjdGlvbkJ1eVNraW5XaW5kb3ciLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLFdBQVcsR0FBR0Ms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SSxLQUFyQjtBQUNBLGFBQUsrSSxlQUFMLEdBQXVCLElBQXZCO0FBQ0g7QUFDSjtBQUVKO0FBeGpDMkIsQ0FBVCxDQUF2QjtBQTJqQ0FFLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQmhWLGdCQUFqQiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEBhdXRob3I6IHh4eEBzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgICDov5nph4zloavlhpnor6bnu4bor7TmmI4s5Li76KaB5aGr5YaZ6K+l5qih5Z2X55qE5Yqf6IO9566A6KaBXG4vLyA8YnIvPkNyZWF0ZTogMjAxOS0wMy0wMiAxNjo0OTowM1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBBY3Rpb25Db25zdCA9IHJlcXVpcmUoXCJhY3Rpb25fY29uc3RcIik7XG52YXIgTWFpbnVpQ29udHJvbGxlciA9IHJlcXVpcmUoXCJtYWludWlfY29udHJvbGxlclwiKVxudmFyIE1haW51aUNvbnN0ID0gcmVxdWlyZShcIm1haW51aV9jb25zdFwiKVxudmFyIEFjdGlvbkV2ZW50ID0gcmVxdWlyZShcImFjdGlvbl9ldmVudFwiKTtcbnZhciBSb2xlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJyb2xlX2NvbnRyb2xsZXJcIilcbnZhciBXZWxmYXJlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJ3ZWxmYXJlX2NvbnRyb2xsZXJcIilcbnZhciBPcmRlcmFjdGlvbkNvbnN0ID0gcmVxdWlyZShcIm9yZGVyYWN0aW9uX2NvbnN0XCIpO1xudmFyIEFjdGlvbkNvbnRyb2xsZXIgPSBjYy5DbGFzcyh7XG4gICAgZXh0ZW5kczogQmFzZUNvbnRyb2xsZXIsXG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xuICAgIH0sXG5cbiAgICAvLyDliJ3lp4vljJbphY3nva7mlbDmja5cbiAgICBpbml0Q29uZmlnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBBY3Rpb25Nb2RlbCA9IHJlcXVpcmUoXCJhY3Rpb25fbW9kZWxcIik7XG5cbiAgICAgICAgdGhpcy5tb2RlbCA9IG5ldyBBY3Rpb25Nb2RlbCgpO1xuICAgICAgICB0aGlzLm1vZGVsLmluaXRDb25maWcoKTtcblxuICAgICAgICB0aGlzLm1haW51aV9jdHJsID0gTWFpbnVpQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpXG4gICAgICAgIHRoaXMuaG9saWRheV9saXN0ID0ge307ICAgICAvLyDmtLvliqjliJfooajnsbvlnotcblxuICAgICAgICB0aGlzLmhvbGlkYXlfZGVsX2xpc3QgPSB7fSAgICAgICAgICAgICAgICAgICAgLy8gIC0tIOmcgOimgeenu+mZpOeahOagh+etvumhtee8k+WtmOWIl+ihqFxuICAgICAgICB0aGlzLmhvbGlkYXlfYXdhcmRfbGlzdCA9IHt9ICAgICAgICAgICAgICAgICAgICAvL+acqumihuWPlua0u+WKqOWlluWKseeahOWIl+ihqFxuICAgICAgICB0aGlzLm5lZWRfc2hvd19pbml0X3JlZCA9IHt9ICAgICAgICAgICAgICAgICAgICAvLy0tIOeZu+W9leeahOaXtuWAmemcgOimgeaYvuekuue6oueCueeahOWIl+ihqFxuICAgIH0sXG5cbiAgICAvLyDov5Tlm57lvZPliY3nmoRtb2RlbFxuICAgIGdldE1vZGVsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsO1xuICAgIH0sXG5cbiAgICAvLyDms6jlhoznm5HlkKzkuovku7ZcbiAgICByZWdpc3RlckV2ZW50czogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pbml0X3JvbGVfZXZlbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5pbml0X3JvbGVfZXZlbnQgPSBnY29yZS5HbG9iYWxFdmVudC5iaW5kKEV2ZW50SWQuRVZUX1JPTEVfQ1JFQVRFX1NVQ0NFU1MsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC51bmJpbmQodGhpcy5pbml0X3JvbGVfZXZlbnQpXG4gICAgICAgICAgICAgICAgdGhpcy5uZWVkUmVxdWlyZURhdGEoKVxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdF9yb2xlX2V2ZW50ID0gbnVsbFxuICAgICAgICAgICAgICAgIC8vIHRoaXMucmVxdWVzdEFjdGlvblN0YXR1cygpIC8vLS0g6K+35rGC5omA5pyJ5rS75Yqo5Zu+5qCHXG4gICAgICAgICAgICAgICAgLy/otoXlgLzln7rph5FcbiAgICAgICAgICAgICAgICAvLyB0aGlzLnNlbmRlcjI0NzAwKClcbiAgICAgICAgICAgICAgICAvLyDkuIPlpKnnmbvlvZXnuqLngrlcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmNzMjExMDAoKTtcbiAgICAgICAgICAgICAgICAvLyDkuIPlpKnnm67moIdcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmNzMTM2MDEoKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLy8gLS0tIOaWree6v+mHjei/nuaIluiAhTDngrnmm7TmlrDmiJbogIXliJ3lp4vljJbpnIDopoHor7fmsYLnmoRcbiAgICBuZWVkUmVxdWlyZURhdGEoKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpc1xuICAgICAgICBzZWxmLm9wZW5BY3Rpb25NYWluUGFuZWwoZmFsc2UpXG4gICAgICAgIHNlbGYuaG9saWRheV9saXN0ID0ge31cbiAgICAgICAgc2VsZi5ob2xpZGF5X2F3YXJkX2xpc3QgPSB7fVxuICAgICAgICBzZWxmLm5lZWRfc2hvd19pbml0X3JlZCA9IHt9XG4gICAgICAgIHNlbGYuaG9saWRheV9kZWxfbGlzdCA9IHt9XG4gICAgICAgIHNlbGYuaXNfaW5pdF9yZXF1aXJlID0gdHJ1ZVxuICAgICAgICBzZWxmLm1vZGVsLmNsZWFyRnVuZFNydkRhdGEoKSAgXHRcdFx0XHRcdCAgICAvLyDmlq3nur/ml7bpnIDopoHmuIXmjonln7rph5HnvJPlrZjmlbDmja5cbiAgICAgICAgc2VsZi5yZXF1ZXN0QWN0aW9uU3RhdHVzKCkgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOivt+axguaJgOaciea0u+WKqOWbvuagh1xuICAgICAgICBzZWxmLnJlcXVlc3RIb2xpZGF5TGlzdChBY3Rpb25Db25zdC5BY3Rpb25UeXBlLldvbmRlcmZ1bCkgICAgICAgXHRcdFx0XHRcdC8vLS0g55m76ZmG55qE5pe25YCZ6K+35rGC5LiA5LiL57K+5b2p5rS75Yqo55qEXG4gICAgfSxcbiAgICAvLyDms6jlhozljY/orq7mjqXlj5fkuovku7ZcbiAgICByZWdpc3RlclByb3RvY2FsczogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTExMCwgdGhpcy5vbjE2NjAyKTtcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDEwOTIyLCB0aGlzLm9uMTA5MjIpICAgICAgICAgICAgICAvLy0tIOWFqOacjea0u+WKqOeKtuaAgSzmnI3liqHnq6/lub/mkq0gXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxNjYwMSwgdGhpcy5vbjE2NjAxKSAgICAgICAgICAgIC8vIC0tIOaJgOacieWtkOa0u+WKqOeahOaYvuekuuaVsOaNrizkuLvopoHnlKjkuo7mtLvliqjpnaLmnb/lt6bkvqfmoIfnrb7mmL7npLos5Lul5Y+K6YOo5YiG6Z2i5p2/5YaF5a655pi+56S6XG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxNjYwMywgdGhpcy5vbjE2NjAzKSAgICAgICAgICAgIC8vIC0tIOivt+axguWtkOa0u+WKqFxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTY2MDQsIHRoaXMub24xNjYwNCkgICAgICAgICAgICAgLy8gICDpooblj5blpZblirFcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDEwOTIzLCB0aGlzLm9uMTA5MjMpICAgICAgICAgICAgIC8vLSDkuLvopoHmmK/nlKjkuo7mnI3liqHmrrXmm7TmlrDlhajmnI3mtLvliqjnirbmgIHmlbDmja7nmoRcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDEwOTI0LCB0aGlzLm9uMTA5MjQpICAgICAgICAgICAgIC8vLS0g5Liq5Lq65rS75Yqo54q25oCBLOacjeWKoeerr+W5v+aSrSBcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDEwOTI1LCB0aGlzLm9uMTA5MjUpICAgICAgICAgICAgIC8vLS0g5Li76KaB5piv55So5LqO5pyN5Yqh5q615pu05paw5Liq5Lq65rS75Yqo54q25oCB5pWw5o2u55qEXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxNjYwMiwgdGhpcy5vbjE2NjAyKSAgICAgICAgICAgICAgICAvLyDor7fmsYLmiYDmnInmtLvliqjmnKrpooblj5blpZblirFcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDE2NjA2LCB0aGlzLm9uMTY2MDYpICAgICAgICAgICAgIC8vIOmihuWPlua0u+WKqOi/lOWbnlxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTY2MDcsIHRoaXMub24xNjYwNykgICAgICAgICAgICAgICAgICAvLyAw54K5IDXngrnmm7TmlrBcbiAgICAgICAgLy8gLS0g5Z+66YeR55u45YWzXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyNDcwMCwgdGhpcy5oYW5kbGUyNDcwMClcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDI0NzAxLCB0aGlzLmhhbmRsZTI0NzAxKVxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjQ3MDIsIHRoaXMuaGFuZGxlMjQ3MDIpXG4gICAgICAgIC8vN+WkqeeZu+W9lVxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjExMDAsIHRoaXMub24yMTEwMCkgICAgICAgICAgICAgIC8vIDflpKnnmbvlvZXkv6Hmga9cbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIxMTAxLCB0aGlzLm9uMjExMDEpICAgICAgICAgICAgICAvLyDpooblj5Y35aSp55m75b2V5aWW5YqxXG4gICAgICAgIC8vIOS4g+Wkqeebruagh1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTM2MDEsIHRoaXMuaGFuZGxlMTM2MDEpO1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTM2MDIsIHRoaXMuaGFuZGxlMTM2MDIpO1xuICAgICAgICAvLyAtLeWNh+e6p+acieekvFxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjEyMDAsIHRoaXMuaGFuZGxlMjEyMDApXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMTIwMSwgdGhpcy5oYW5kbGUyMTIwMSlcblxuICAgICAgICAvL+WlluWKseaOkuihjOS/oeaBryjku6XlkI7lj6/ku6XmmK/mtLvliqjnmoTpgJrnlKgpXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxNjY1MCwgdGhpcy5oYW5kbGUxNjY1MCk7XG5cbiAgICAgICAgLy8g5bm46L+Q6L2s55uYXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxNjYzNywgdGhpcy5oYW5kbGUxNjYzNyk7XG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxNjYzOCwgdGhpcy5oYW5kbGUxNjYzOCk7XG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxNjYzOSwgdGhpcy5oYW5kbGUxNjYzOSk7XG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxNjY0MSwgdGhpcy5oYW5kbGUxNjY0MSk7XG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxNjY0MiwgdGhpcy5oYW5kbGUxNjY0Mik7XG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxNjY0MywgdGhpcy5oYW5kbGUxNjY0Myk7XG5cbiAgICAgICAgLy/npZ7np5jmnYLotKfpk7pcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDE2Njg4LCB0aGlzLmhhbmRsZTE2Njg4KTtcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDE2Njg5LCB0aGlzLmhhbmRsZTE2Njg5KTtcblxuICAgICAgICAvLyAtLemZkOaXtuekvOWMheWFpeWPo1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjEyMTAsIHRoaXMuaGFuZGxlMjEyMTApXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMTIxMSwgdGhpcy5oYW5kbGUyMTIxMSkgLy8tLSDmjqjpgIHmv4DmtLvkuobmmL7npLrnpLzljIUuXG5cbiAgICAgICAgXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMTAxNiwgdGhpcy5oYW5kbGUyMTAxNilcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDE2Njg3LCB0aGlzLmhhbmRsZTE2Njg3KVxuXG4gICAgICAgIC8vIC0t5YWD5a615YaS6ZmpXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyNDgxMCwgdGhpcy5oYW5kbGUyNDgxMCkgLy8tLeiOt+WPluWFg+WuteWGkumZqSDku7vliqHkv6Hmga9cbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDI0ODExLCB0aGlzLmhhbmRsZTI0ODExKSAvLy0t5o6o6YCB5Lu75Yqh5Y+Y5YyWXCJcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDI0ODEyLCB0aGlzLmhhbmRsZTI0ODEyKSAvLy0t5Lu75Yqh6aKG5Y+WXG4gICAgICAgIFxuICAgICAgICAvL+inpuWPkeekvOWMhVxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjEyMjAsIHRoaXMuaGFuZGxlMjEyMjApXG5cbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDI0ODEzLCB0aGlzLmhhbmRsZTI0ODEzKVxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjQ4MTQsIHRoaXMuaGFuZGxlMjQ4MTQpXG5cbiAgICAgICAgLy/ml7boo4VcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDMwMTAxLCB0aGlzLmhhbmRsZTMwMTAxKVxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMzAxMDAsIHRoaXMuaGFuZGxlMzAxMDApXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgzMDEwMiwgdGhpcy5oYW5kbGUzMDEwMilcbiAgICB9LFxuICAgIHJlcXVlc3RBY3Rpb25TdGF0dXMoKSB7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDEwOTIyLCB7fSlcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTA5MjQsIHt9KVxuICAgICAgICB0aGlzLm9uMTA5MjUoT3JkZXJhY3Rpb25Db25zdC5PcmRlckFjdGlvbkVudHJhbmNlSUQuZW50cmFuY2VfaWQpO1xuICAgIH0sXG4gICAgaGFuZGxlQWN0aW9uU3RhdHVzRGF0YShkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICBsZXQgY29uZmlnID0gQ29uZmlnLmZ1bmN0aW9uX2RhdGEuZGF0YV9pbmZvW2RhdGEuaWRdO1xuICAgICAgICAgICAgaWYgKGNvbmZpZyA9PSBudWxsKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoZGF0YS5zdGF0dXMgPT0gQWN0aW9uQ29uc3QuQWN0aW9uU3RhdHVzLnVuX2ZpbmlzaCkge1xuICAgICAgICAgICAgICAgIHRoaXMubWFpbnVpX2N0cmwucmVtb3ZlRnVuY3Rpb25JY29uQnlJZChkYXRhLmlkKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1haW51aV9jdHJsLmFkZEZ1bmN0aW9uSWNvbkJ5SWQoZGF0YS5pZCwgZGF0YSlcblxuICAgICAgICAgICAgICAgIC8vIC0tIOWmguaenOaYrzflpKnmjpLooYzlsLHor7fmsYLkuIDkuIvku7vliqFcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5pZCA9PSBNYWludWlDb25zdC5pY29uLnNldmVuX3JhbmspIHsgIC8vIDflpKnmjpLooYxcbiAgICAgICAgICAgICAgICAgICAgLy8gc2VsZjpyZXF1ZXN0U2V2ZW5EYXlzUmFuaygpXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmlkID09IE1haW51aUNvbnN0Lmljb24uZnVuZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmNoZWNrRnVuZFJlZFN0YXR1cygpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBzZXRIb2xpZGF5U3RhdHVzKGJpZCwgc3RhdHVzKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpc1xuICAgICAgICBpZihzZWxmLmhvbGlkYXlfbGlzdCA9PSBudWxsIHx8IHNlbGYuaG9saWRheV9saXN0W2JpZF0gPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICBpZiAoc2VsZi5ob2xpZGF5X2F3YXJkX2xpc3QgPT0gbnVsbCkge1xuICAgICAgICAgICAgc2VsZi5ob2xpZGF5X2F3YXJkX2xpc3QgPSB7fVxuICAgICAgICB9XG4gICAgICAgIGxldCB2byA9IHsgYmlkOiBiaWQsIHN0YXR1czogc3RhdHVzIH1cblxuICAgICAgICBsZXQgdm8xXG4gICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgIHZvMSA9IHsgYmlkOiBiaWQsIG51bTogMSB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2bzEgPSB7IGJpZDogYmlkLCBudW06IDAgfVxuICAgICAgICB9XG4gICAgICAgIHNlbGYuaG9saWRheV9hd2FyZF9saXN0W2JpZF0gPSB2b1xuICAgICAgICBsZXQgYWN0aW9uX3N1Yl92byA9IHNlbGYuaG9saWRheV9saXN0W2JpZF1cblx0ICAgIGxldCBmdW5jdGlvbl9pZCA9IE1haW51aUNvbnN0Lmljb24ud2VsZmFyZVxuICAgICAgICBpZiAoc2VsZi5pc1NwZWNpYWxCaWQoYmlkKSkge1xuICAgICAgICAgICAgc2VsZi5tYWludWlfY3RybC5zZXRGdW5jdGlvblRpcHNTdGF0dXMoTWFpbnVpQ29uc3QuaWNvbi53ZWxmYXJlLCB2bzEpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWxmLm1haW51aV9jdHJsLnNldEZ1bmN0aW9uVGlwc1N0YXR1cyhhY3Rpb25fc3ViX3ZvLmNsaV90eXBlLCB2bzEpXG4gICAgICAgICAgICBmdW5jdGlvbl9pZCA9IGFjdGlvbl9zdWJfdm8uY2xpX3R5cGVcbiAgICAgICAgfVxuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEFjdGlvbkV2ZW50LlVQREFURV9IT0xJREFZX1RBQl9TVEFUVVMsIGZ1bmN0aW9uX2lkLCB2bylcbiAgICB9LFxuICAgIC8vIC0tZGVzYzrmm7TmlrDlhajmnI3mtLvliqjlhajpg6jmlbDmja5cbiAgICBvbjEwOTIyKGRhdGEpIHtcbiAgICAgICAgaWYgKHRoaXMucHJvdG9jYWxfbGlzdF8yMiA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnByb3RvY2FsX2xpc3RfMjIgPSB7fVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhLmFjdF9saXN0KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEuYWN0X2xpc3QubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBsZXQgdiA9IGRhdGEuYWN0X2xpc3RbaV1cbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUFjdGlvblN0YXR1c0RhdGEodilcbiAgICAgICAgICAgICAgICAvLyAtLSDlhYjlgqjlrZjkuIDkuIvlkKdcbiAgICAgICAgICAgICAgICBpZiAodi5zdGF0dXMgPT0gQWN0aW9uQ29uc3QuQWN0aW9uU3RhdHVzLnVuX2ZpbmlzaCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3RvY2FsX2xpc3RfMjJbdi5pZF0gPSBudWxsXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm90b2NhbF9saXN0XzIyW3YuaWRdID0gdi5pZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgb24xMDkyMyhkYXRhKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlQWN0aW9uU3RhdHVzRGF0YShkYXRhKVxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvdG9jYWxfbGlzdF8yMiA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm90b2NhbF9saXN0XzIyID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0YS5zdGF0dXMgPT0gQWN0aW9uQ29uc3QuQWN0aW9uU3RhdHVzLnVuX2ZpbmlzaCkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvdG9jYWxfbGlzdF8yMltkYXRhLmlkXSA9IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvdG9jYWxfbGlzdF8yMltkYXRhLmlkXSA9IGRhdGEuaWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgb24xMDkyNChkYXRhKSB7XG4gICAgICAgIGNjLmxvZyhcIuS4quS6uua0u+WKqG9uMTA5MjRcIixkYXRhKVxuICAgICAgICBpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEuYWN0X2xpc3QpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5hY3RfbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGxldCB2ID0gZGF0YS5hY3RfbGlzdFtpXVxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQWN0aW9uU3RhdHVzRGF0YSh2KVxuICAgICAgICAgICAgICAgIGlmKE1haW51aUNvbnN0LmZpcnN0X3JlZF9wb2ludFt2LmlkXSAmJiB2LnN0YXR1cyA9PSAxKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYWludWlfY3RybC5zZXRGdW5jdGlvblRpcHNTdGF0dXModi5pZCwgTWFpbnVpQ29uc3QuZmlyc3RfcmVkX3BvaW50W3YuaWRdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIH0sXG4gICAgb24xMDkyNShkYXRhKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlQWN0aW9uU3RhdHVzRGF0YShkYXRhKVxuICAgICAgICBpZihNYWludWlDb25zdC5maXJzdF9yZWRfcG9pbnRbZGF0YS5pZF0gJiYgZGF0YS5zdGF0dXMgPT0gMSl7XG4gICAgICAgICAgICB0aGlzLm1haW51aV9jdHJsLnNldEZ1bmN0aW9uVGlwc1N0YXR1cyhkYXRhLmlkLCBNYWludWlDb25zdC5maXJzdF9yZWRfcG9pbnRbZGF0YS5pZF0pO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvL+ivt+axguaJgOaciea0u+WKqOacqumihuWPluWlluWKseeKtuaAgVxuICAgIHJlcXVlc3RBY3Rpb25Bd2FyZFN0YXR1czogZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgdmFyIHByb3RvID0ge307XG4gICAgICAgIHByb3RvLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxNjYwMiwgcHJvdG8pXG4gICAgfSxcbiAgICByZXF1ZXN0SG9saWRheUxpc3QodHlwZSkge1xuICAgICAgICB2YXIgcHJvdG8gPSB7fTtcbiAgICAgICAgcHJvdG8udHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDE2NjAxLCBwcm90bylcbiAgICB9LFxuICAgIG9uMTY2MDI6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5ob2xpZGF5X2xpc3QubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGxldCB2ID0gZGF0YS5ob2xpZGF5X2xpc3RbaV1cbiAgICAgICAgICAgIHRoaXMuc2V0SG9saWRheVN0YXR1cyh2LmJpZCwgKHYuY2FuX2dldF9udW0gIT0gZmFsc2UpKVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIG9uMTY2MDE6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGNjLmxvZyhkYXRhLFwib24xNjYwMVwiKVxuICAgICAgICB2YXIgdGVtcF9zdWJfdm87XG4gICAgICAgIHZhciB0eXBlX2xpc3QgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgaT0wO2k8ZGF0YS5ob2xpZGF5X2xpc3QubGVuZ3RoOysraSkge1xuICAgICAgICAgICAgdmFyIHYgPSBkYXRhLmhvbGlkYXlfbGlzdFtpXTtcbiAgICAgICAgICAgIGlmICh0aGlzLmhvbGlkYXlfZGVsX2xpc3Rbdi5iaWRdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0ZW1wX3N1Yl92byA9IHRoaXMuaG9saWRheV9saXN0W3YuYmlkXTtcbiAgICAgICAgICAgICAgICBpZiAodGVtcF9zdWJfdm8gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgQWN0aW9uU3ViVGFiVm8gPSByZXF1aXJlKFwiYWN0aW9uX3N1Yl90YWJfdm9cIik7XG4gICAgICAgICAgICAgICAgICAgIHRlbXBfc3ViX3ZvID0gbmV3IEFjdGlvblN1YlRhYlZvKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaG9saWRheV9saXN0W3YuYmlkXSA9IHRlbXBfc3ViX3ZvO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0ZW1wX3N1Yl92byA9IHRoaXMuaG9saWRheV9saXN0W3YuYmlkXTtcbiAgICAgICAgICAgICAgICBpZiAodGVtcF9zdWJfdm8gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0ZW1wX3N1Yl92by51cGRhdGUodik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8v5rS75Yqo57G755qE5oqV6LWE6K6h5YiS5ZKM5Z+66YeR5LiN5Zyo5rS75Yqo6Z2i5p2/5pi+56S6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNTcGVjaWFsQmlkKHYuYmlkKSkge1xuICAgICAgICAgICAgICAgICAgICB0ZW1wX3N1Yl92by5zZXRTaG93U3RhdHVzKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jczE2NjAzKHYuYmlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy/liKTmlq3ov5nkuKrmtLvliqjmiYDlsZ7nmoTlm77moIcs5bm25LiU5Yqo5oCB6K6+572u5LuW55qE5ZCN5a2XXG4gICAgICAgICAgICAgICAgaWYgKHRlbXBfc3ViX3ZvLmNsaV90eXBlICE9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVfbGlzdFt0ZW1wX3N1Yl92by5jbGlfdHlwZV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9saXN0W3RlbXBfc3ViX3ZvLmNsaV90eXBlXSA9IHsgYWN0aW9uX251bTogMCwgYWN0aW9uX25hbWU6IFwiXCIgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNTcGVjaWFsQmlkKHRlbXBfc3ViX3ZvLmJpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfbGlzdFt0ZW1wX3N1Yl92by5jbGlfdHlwZV0uYWN0aW9uX251bSA9IHR5cGVfbGlzdFt0ZW1wX3N1Yl92by5jbGlfdHlwZV0uYWN0aW9uX251bSArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcF9zdWJfdm8uY2xpX3R5cGVfbmFtZSAhPSBcIlwiICYmIHRlbXBfc3ViX3ZvLmNsaV90eXBlX25hbWUgIT0gXCJudWxsXCIgJiYgdHlwZV9saXN0W3RlbXBfc3ViX3ZvLmNsaV90eXBlXS5hY3Rpb25fbmFtZSA9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9saXN0W3RlbXBfc3ViX3ZvLmNsaV90eXBlXS5hY3Rpb25fbmFtZSA9IHRlbXBfc3ViX3ZvLmNsaV90eXBlX25hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL1x0LS0g5Yid5aeL5YyW5LmL5ZCO6K+35rGC5a+55bqU55qE5rS75Yqo57qi54K554q25oCBXG4gICAgICAgIGlmICh0aGlzLmlzX2luaXRfcmVxdWlyZSA9PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RBY3Rpb25Bd2FyZFN0YXR1cygpO1xuICAgICAgICAgICAgdGhpcy5pc19pbml0X3JlcXVpcmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvL+WIpOaWreaYr+WinuWIoOWbvuagh1xuICAgICAgICBmb3IgKHZhciBmdW5jdGlvbl9pZCBpbiB0eXBlX2xpc3QpIHtcbiAgICAgICAgICAgIHZhciBvYmplY3QgPSB0eXBlX2xpc3RbZnVuY3Rpb25faWRdO1xuICAgICAgICAgICAgaWYgKG9iamVjdCkge1xuICAgICAgICAgICAgICAgIGlmIChvYmplY3QuYWN0aW9uX251bSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYWludWlfY3RybC5hZGRGdW5jdGlvbkljb25CeUlkKGZ1bmN0aW9uX2lkLCBvYmplY3QuYWN0aW9uX25hbWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFpbnVpX2N0cmwucmVtb3ZlRnVuY3Rpb25JY29uQnlJZChmdW5jdGlvbl9pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIG9uMTY2MDMoZGF0YSkge1xuICAgICAgICAvL+iKguaXpeeZu+W9lee6oueCuVxuICAgICAgICBpZihkYXRhLmJpZCA9PSBBY3Rpb25Db25zdC5BY3Rpb25SYW5rQ29tbW9uVHlwZS5jb21tb25fZGF5IHx8IGRhdGEuYmlkID09IEFjdGlvbkNvbnN0LkFjdGlvblJhbmtDb21tb25UeXBlLmZlc3R2YWxfZGF5IHx8IGRhdGEuYmlkID09IEFjdGlvbkNvbnN0LkFjdGlvblJhbmtDb21tb25UeXBlLmxvdmVyX2RheSl7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLnVwZGF0YUZlc3R2YWxSZWRTdGF0dXMoZGF0YS5iaWQsZGF0YS5haW1fbGlzdClcbiAgICAgICAgfWVsc2UgaWYoZGF0YS5iaWQgPT0gMTAxMSl7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLnVwZGF0YUNvbWJpbmVMb2dpblJlZFN0YXR1cyhkYXRhLmFpbV9saXN0KVxuICAgICAgICB9ZWxzZSBpZihkYXRhLmJpZCA9PSA5OTEwMTQpe1xuICAgICAgICAgICAgdGhpcy5tb2RlbC51cGRhdGFQcmVmZXJlbnRpYWxSZWRTdGF0dXModHJ1ZSwgTWFpbnVpQ29uc3QuaWNvbi5wcmVmZXJlbnRpYWwpXG4gICAgICAgIH1lbHNlIGlmKGRhdGEuYmlkID09IDkxMDE0KXtcbiAgICAgICAgICAgIHRoaXMubW9kZWwudXBkYXRhUHJlZmVyZW50aWFsUmVkU3RhdHVzKHRydWUsIE1haW51aUNvbnN0Lmljb24ub3RoZXJfcHJlZmVyZW50aWFsKVxuICAgICAgICB9XG4gICAgICAgIC8vIC0tIOayoeacieWtkOa0u+WKqOWIl+ihqOS6hiznm7TmjqXnp7vpmaTmjonmoIfnrb4s5LiL5qyh5pyJ5pWIKOeOsOWcqOS9nOW6nylcbiAgICAgICAgLy8gaWYoZGF0YS5haW1fbGlzdC5sZW5ndGggPT0gMCApe1xuICAgICAgICAvLyAgICAgdGhpcy5oYW5kbGVIb2xpZGF5TGlzdCgwLCBkYXRhLmJpZClcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyAtLSDpppblhYXov57lhrJcbiAgICAgICAgaWYgKGRhdGEuYmlkID09IDkxMDA1KSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZTkxMDA1RGF0YShkYXRhKVxuICAgICAgICB9ZWxzZSBpZihkYXRhLmJpZCA9PSBBY3Rpb25Db25zdC5BY3Rpb25SYW5rQ29tbW9uVHlwZS5zZXZlbl9jaGFyZ2Upe1xuICAgICAgICAgICAgLy8g5pqC5pe25rKh5pyJXG4gICAgICAgICAgICAvLyB0aGlzLm1vZGVsLnNldFNldmVuQ2hhcmdlRGF0YShkYXRhKVxuICAgICAgICB9XG4gICAgICAgIC8vIC0g546w5Zyo5Y+q6KaB5rS75Yqo5YiX6KGo5piv56m655qELOmCo+S5iOaYr+aKlei1hOiuoeWIkuWQjuiAheaYr+WfuumHkeWwseWIoOaOieagh+etvumhtVxuICAgICAgICBpZiAodGhpcy5pc1NwZWNpYWxCaWQoZGF0YS5iaWQpKSB7XG4gICAgICAgICAgICBpZiAoZGF0YS5maW5pc2ggPT0gMCAmJiB0aGlzLm5lZWRfc2hvd19pbml0X3JlZFtkYXRhLmJpZF0gPT0gbnVsbCAmJiBkYXRhLmFpbV9saXN0Lmxlbmd0aCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXR1cyA9IGZhbHNlXG4gICAgICAgICAgICAgICAgbGV0IGJhc2VfY29uZmlnID0gQ29uZmlnLmhvbGlkYXlfY2xpZW50X2RhdGEuZGF0YV9pbmZvW2RhdGEuYmlkXVxuICAgICAgICAgICAgICAgIGlmIChiYXNlX2NvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaXNfb3BlbiA9IGJhc2VfY29uZmlnLm9wZW5fbGV2XG4gICAgICAgICAgICAgICAgICAgIGxldCByb2xlX3ZvID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKVxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNfb3BlbiAmJiByb2xlX3ZvLmxldikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGVfdm8ubGV2ID49IGlzX29wZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5uZWVkX3Nob3dfaW5pdF9yZWRbZGF0YS5iaWRdID0gc3RhdHVzXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRIb2xpZGF5U3RhdHVzKGRhdGEuYmlkLCBzdGF0dXMpXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuYmlkID09IEFjdGlvbkNvbnN0LkFjdGlvblNwZWNpYWxJRC5ncm93ZnVuZCkge1xuICAgICAgICAgICAgICAgICAgICBXZWxmYXJlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNldFdlbGZhcmVTdGF0dXMoQWN0aW9uQ29uc3QuQWN0aW9uU3BlY2lhbElELmdyb3dmdW5kLCBzdGF0dXMpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoQWN0aW9uRXZlbnQuVVBEQVRFX0hPTElEQVlfU0lHTkxFLCBkYXRhKVxuICAgIH0sXG4gICAgaXNTcGVjaWFsQmlkOiBmdW5jdGlvbiAoYmlkKSB7XG4gICAgICAgIHJldHVybiBiaWQgPT0gQWN0aW9uQ29uc3QuQWN0aW9uU3BlY2lhbElELmludmVzdCB8fCBiaWQgPT0gQWN0aW9uQ29uc3QuQWN0aW9uU3BlY2lhbElELmdyb3dmdW5kO1xuICAgIH0sXG4gICAgLy/mr4/ml6XlhYXlgLzpop3lpJblpITnkIZcbiAgICBoYW5kbGU5MTAwNURhdGEoZGF0YSkge1xuICAgICAgICAvLyAtLeaJvuWHuuS7iuaXpee0r+WFheWSjOe0r+WFheWkqeaVsOeahOaVsOaNrlxuICAgICAgICBpZiAoIXRoaXMudG9kYXlfbGlzdCkge1xuICAgICAgICAgICAgdGhpcy50b2RheV9saXN0ID0ge31cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRhLmFpbV9saXN0ICYmIFV0aWxzLm5leHQoZGF0YS5haW1fbGlzdCkgIT0gbnVsbCkge1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBkYXRhLmFpbV9saXN0Lmxlbmd0aDsgKytrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHYgPSBkYXRhLmFpbV9saXN0W2tdXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYSA9IDA7IGEgPCB2LmFpbV9hcmdzLmxlbmd0aDsgKythKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBqID0gdi5haW1fYXJnc1thXVxuICAgICAgICAgICAgICAgICAgICBpZiAoai5haW1fYXJnc19rZXkgPT0gMykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGouYWltX2FyZ3NfdmFsID09IDEpIHsgICAgLy8tLeS7iuaXpee0r+WFhVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9kYXlfbGlzdFtrXSA9IHZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZGF5X2xpc3Rba10uaGFzX251bSA9IHRoaXMuaGFzX251bVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9kYXlfbGlzdFtrXS5pdGVtX2VmZmVjdF9saXN0ID0gdGhpcy5pdGVtX2VmZmVjdF9saXN0XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoai5haW1fYXJnc19rZXkgPT0gNCkgey8vIC0t6ZyA6KaB5YWF5YC85aSa5bCR6ZKxXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50b2RheV9saXN0W2tdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2RheV9saXN0W2tdLm5lZWRfY2hhcmdlID0gai5haW1fYXJnc192YWxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChqLmFpbV9hcmdzX2tleSA9PSA1KSB7IC8vIC0t55uu5qCH5YC8IOmcgOimgeWGsuWkmuWwkeWkqVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudG9kYXlfbGlzdFtrXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9kYXlfbGlzdFtrXS5jaGFyZ2VfZGF5ID0gai5haW1fYXJnc192YWxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChqLmFpbV9hcmdzX2tleSA9PSA2KSB7IC8vIC0t6K6h5pWwXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50b2RheV9saXN0W2tdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2RheV9saXN0W2tdLmhhc19jaGFyZ2UgPSBqLmFpbV9hcmdzX3ZhbFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHRoaXMuY2hlY2tTaG93RGF5Q2hhcmdlKClcbiAgICB9LFxuICAgIC8v6I635Y+W5oyH5a6a57G75Z6L5ZKM5oyH5a6a5rS75Yqo55qEaWTnmoTlrZDmtLvliqjln7rnoYDmlbDmja5cbiAgICBnZXRBY3Rpb25TdWJUYWJWbzogZnVuY3Rpb24gKGJpZCkge1xuICAgICAgICBpZiAodGhpcy5ob2xpZGF5X2xpc3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaG9saWRheV9saXN0W2JpZF1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgZ2V0QWxsQWN0aW9uTGlzdCgpe1xuICAgICAgICByZXR1cm4gdGhpcy5ob2xpZGF5X2xpc3RcbiAgICB9LFxuICAgIC8vIC0tZGVzYzror7fmsYLlrZDmtLvliqjliJfooahcbiAgICAvLyAtLXRpbWU6MjAxNy0wNy0yNiAwNzo1NjoxMFxuICAgIC8vIC0tQGJpZDrlrZDmtLvliqhJRFxuICAgIC8vIC0tQHJldHVybiBcbiAgICBjczE2NjAzKGJpZCkge1xuICAgICAgICBsZXQgcHJvdG9jYWwgPSB7fVxuICAgICAgICBwcm90b2NhbC5iaWQgPSBiaWRcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTY2MDMsIHByb3RvY2FsKVxuICAgIH0sXG4gICAgLy/pooblj5blpZblirFcbiAgICBjczE2NjA0KGJpZCwgYWltLCBhcmcpIHtcbiAgICAgICAgbGV0IHByb3RvY2FsID0ge31cbiAgICAgICAgcHJvdG9jYWwuYmlkID0gYmlkXG4gICAgICAgIHByb3RvY2FsLmFpbSA9IGFpbVxuICAgICAgICBwcm90b2NhbC5hcmcgPSBhcmcgfHwgMFxuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxNjYwNCwgcHJvdG9jYWwpXG4gICAgfSxcbiAgICBvbjE2NjA0KGRhdGEpIHtcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZylcbiAgICAgICAgLy8gc2hvd0Fzc2V0c01zZyhkYXRhLm1zZylcbiAgICB9LFxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tQCDln7rph5Hnm7jlhbPljY/orq5cbiAgICAvLyAtLSDor7fmsYLln7rph5HlvIDlkK/mlbDmja5cbiAgICBzZW5kZXIyNDcwMCgpIHtcbiAgICAgICAgbGV0IHByb3RvY2FsID0ge31cbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjQ3MDAsIHByb3RvY2FsKVxuICAgIH0sXG4gICAgaGFuZGxlMjQ3MDAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLmlkcykge1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZXRPcGVuRnVuZElkcyhkYXRhLmlkcylcbiAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoQWN0aW9uRXZlbnQuVVBEQVRBX0ZVTkRfSURfTElTVF9FVkVOVClcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLy8tLSDor7fmsYLln7rph5HmlbDmja5cbiAgICBzZW5kZXIyNDcwMShpZCkge1xuICAgICAgICBsZXQgcHJvdG9jYWwgPSB7fVxuICAgICAgICBwcm90b2NhbC5pZCA9IGlkXG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDI0NzAxLCBwcm90b2NhbClcbiAgICB9LFxuXG4gICAgaGFuZGxlMjQ3MDEoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZXRGdW5kU3J2RGF0YShkYXRhKVxuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShBY3Rpb25FdmVudC5VUERBVEFfRlVORF9EQVRBX0VWRU5ULCBkYXRhLmlkKVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvLyAtLSDor7fmsYLpooblj5bln7rph5FcbiAgICBzZW5kZXIyNDcwMihpZCkge1xuICAgICAgICBsZXQgcHJvdG9jYWwgPSB7fVxuICAgICAgICBwcm90b2NhbC5pZCA9IGlkXG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDI0NzAyLCBwcm90b2NhbClcbiAgICB9LFxuICAgIGhhbmRsZTI0NzAyKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEubXNnKSB7XG4gICAgICAgICAgICBtZXNzYWdlKGRhdGEubXNnKVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvLyAtLSDmiZPlvIDotoXlgLzln7rph5HlpZblirHpooTop4jnlYzpnaJcbiAgICBvcGVuQWN0aW9uRnVuZEF3YXJkV2luZG93KHN0YXR1cywgZ3JvdXBfaWQsIGZ1bmRfaWQpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzXG4gICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmICghc2VsZi5mdW5kX2F3YXJkX3dpbikge1xuICAgICAgICAgICAgICAgIGxldCBhY3Rpb25GdW5kQXdhcmQgPSByZXF1aXJlKFwiYWN0aW9uX2Z1bmRfYXdhcmRfd2luZG93XCIpXG4gICAgICAgICAgICAgICAgc2VsZi5mdW5kX2F3YXJkX3dpbiA9IG5ldyBhY3Rpb25GdW5kQXdhcmQoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlbGYuZnVuZF9hd2FyZF93aW4uaXNPcGVuKCkgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmZ1bmRfYXdhcmRfd2luLm9wZW4oeyBncm91cF9pZDogZ3JvdXBfaWQsIGZ1bmRfaWQ6IGZ1bmRfaWQgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzZWxmLmZ1bmRfYXdhcmRfd2luKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5mdW5kX2F3YXJkX3dpbi5jbG9zZSgpXG4gICAgICAgICAgICAgICAgc2VsZi5mdW5kX2F3YXJkX3dpbiA9IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBkZXNjOjflpKnnmbvlvZXnirbmgIFcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjczIxMTAwOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDIxMTAwLCB7fSk7XG4gICAgfSxcblxuICAgIG9uMjExMDA6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHZhciBzaG93X3JlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBpIGluIGRhdGEuc3RhdHVzX2xpc3QpIHtcbiAgICAgICAgICAgIGlmIChkYXRhLnN0YXR1c19saXN0W2ldLnN0YXR1cyA9PSAyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYWludWlfY3RybC5zZXRGdW5jdGlvblRpcHNTdGF0dXMoTWFpbnVpQ29uc3QuaWNvbi5zZXZlbl9sb2dpbiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICBmb3IgKHZhciBrIGluIGRhdGEuc3RhdHVzX2xpc3QpIHtcbiAgICAgICAgICAgIGlmIChkYXRhLnN0YXR1c19saXN0W2tdLnN0YXR1cyA9PSAzKSB7XG4gICAgICAgICAgICAgICAgaSA9IGkgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpID09IGRhdGEuc3RhdHVzX2xpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLm1haW51aV9jdHJsLnNldEZ1bmN0aW9uVGlwc1N0YXR1cyhNYWludWlDb25zdC5pY29uLnNldmVuX2xvZ2luLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tb2RlbC51cGRhdGVTZXZlbkxvZ2luRGF0YShkYXRhKTtcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShBY3Rpb25FdmVudC5VUERBVEVfU0VWRU5fTE9HSU5fU1RBVFVTLCBkYXRhKVxuICAgIH0sXG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBkZXNjOjflpKnnmbvlvZXpooblj5blpZblirFcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjczIxMTAxOiBmdW5jdGlvbiAoZGF5KSB7XG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9O1xuICAgICAgICBwcm90b2NhbC5kYXkgPSBkYXk7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDIxMTAxLCBwcm90b2NhbCk7XG4gICAgfSxcblxuICAgIG9uMjExMDE6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpO1xuICAgICAgICBpZiAoZGF0YS5jb2RlID09IDEpIHtcbiAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoQWN0aW9uRXZlbnQuVVBEQVRFX1NFVkVOX0xPR0lOX1JFV0FSRFMsIGRhdGEpO1xuICAgICAgICAgICAgdGhpcy5jczIxMTAwKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5omT5byA5LiD5aSp55m75b2V55WM6Z2iXG4gICAgb3BlblNldmVuTG9naW5XaW46IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnNldmVuX2xvZ2luX3dpbikge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V2ZW5fbG9naW5fd2luID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJhY3Rpb25fc2V2ZW5fbG9naW5fd2luZG93XCIsIHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuc2V2ZW5fbG9naW5fd2luICYmIHRoaXMuc2V2ZW5fbG9naW5fd2luLmlzT3BlbigpID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXZlbl9sb2dpbl93aW4ub3BlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2V2ZW5fbG9naW5fd2luKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXZlbl9sb2dpbl93aW4uY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldmVuX2xvZ2luX3dpbiA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5omT5byA5LiD5aSp55uu5qCH55WM6Z2iXG4gICAgb3BlblNldmVuR29hbFZpZXc6IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnNldmVuX2dvYWxfd2luKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXZlbl9nb2FsX3dpbiA9IFV0aWxzLmNyZWF0ZUNsYXNzKFwiYWN0aW9uX3NldmVuX2dvYWxfd2luZG93XCIsIHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuc2V2ZW5fZ29hbF93aW4gJiYgdGhpcy5zZXZlbl9nb2FsX3dpbi5pc09wZW4oKSA9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V2ZW5fZ29hbF93aW4ub3BlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2V2ZW5fZ29hbF93aW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldmVuX2dvYWxfd2luLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXZlbl9nb2FsX3dpbiA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgY3MxMzYwMTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxMzYwMSwge30pO1xuICAgIH0sXG5cbiAgICBoYW5kbGUxMzYwMTogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEucGVyaW9kID09IDApIHJldHVybjtcbiAgICAgICAgdGhpcy5tb2RlbC5zZXRTZXZlbkdvbGRQZXJpb2QoZGF0YS5wZXJpb2QgfHwgMSk7XG4gICAgICAgIHRoaXMubW9kZWwuaW5pdFNldmVuV2FsZmFyZShkYXRhLnBlcmlvZCB8fCAxKTtcblxuICAgICAgICB0aGlzLm1vZGVsLnNldFNldmVuR29hbFdlbGZhcmVMaXN0KGRhdGEud2VsZmFyZV9saXN0KTtcbiAgICAgICAgdGhpcy5tb2RlbC5zZXRTZXZlbkdvYWxHcm93TGlzdChkYXRhLmdyb3dfbGlzdCk7XG4gICAgICAgIHRoaXMubW9kZWwuc2V0SGFsZkdpZnRMaXN0KGRhdGEucHJpY2VfbGlzdCk7XG5cbiAgICAgICAgdGhpcy5tb2RlbC5zZXRTZXZlbkdvYWxCb3hMaXN0KGRhdGEuZmluaXNoX2xpc3QsIGRhdGEubnVtKTtcbiAgICAgICAgdGhpcy5tb2RlbC5jaGVja1JlZFBvaW50KGRhdGEuY3VyX2RheSk7XG5cbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShBY3Rpb25FdmVudC5VUERBVEVfU0VWRU5UX0dPQUwsIGRhdGEpO1xuICAgIH0sXG5cbiAgICAvLyDor7fmsYLkuIPml6XmtLvliqjpooblj5ZcbiAgICBjczEzNjAyOiBmdW5jdGlvbiAodHlwZSwgZGF5LCBpZCwgaXRlbSkge1xuICAgICAgICB2YXIgcHJvdG9jYWwgPSB7fTtcbiAgICAgICAgcHJvdG9jYWwudHlwZSA9IHR5cGU7XG4gICAgICAgIHByb3RvY2FsLmRheV90eXBlID0gZGF5O1xuICAgICAgICBwcm90b2NhbC5pZCA9IGlkO1xuICAgICAgICBwcm90b2NhbC5pdGVtID0gaXRlbTtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTM2MDIsIHByb3RvY2FsKTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMTM2MDI6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpO1xuICAgICAgICBpZiAoZGF0YS5mbGFnID09IDEpIHtcbiAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoQWN0aW9uRXZlbnQuVVBEQVRFX1NFVkVOVF9HRVQsIGRhdGEpO1xuICAgICAgICB9XG4gICAgfSxcblxuXG4gICAgLy/mtLvliqjkuLvnlYzpnaJcbiAgICAvL+WxnuS6juernueMnOa0u+WKqCDov5jmmK/lsZ7kuo7oioLml6XmtLvliqgsTWFpbnVpQ29uc3QuaWNvbi5hY3Rpb24g5oiW6ICFIE1haW51aUNvbnN0Lmljb24uZmVzdGl2YWxcblxuICAgIG9wZW5BY3Rpb25NYWluUGFuZWwoc3RhdHVzLCBmdW5jdGlvbl9pZCwgYWN0aW9uX2JpZCkge1xuICAgICAgICBpZiAoc3RhdHVzID09IGZhbHNlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hY3Rpb25fb3BlcmF0ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25fb3BlcmF0ZS5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uX29wZXJhdGUgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGFjdGlvbl9iaWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhciBhY3Rpb25fdm8gPSB0aGlzLmhvbGlkYXlfbGlzdFthY3Rpb25fYmlkXTtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uX3ZvKSB7XG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uX2lkID0gYWN0aW9uX3ZvLmNsaV90eXBlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmdW5jdGlvbl9pZCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb25faWQgPSBNYWludWlDb25zdC5pY29uLmFjdGlvbjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aW9uX29wZXJhdGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uX29wZXJhdGUgPSBVdGlscy5jcmVhdGVDbGFzcyhcImFjdGlvbl9tYWluX3dpbmRvd1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGlvbl9vcGVyYXRlLmlzT3BlbigpID09IGZhbHNlKVxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uX29wZXJhdGUub3Blbih7IGZ1bmN0aW9uX2lkOiBmdW5jdGlvbl9pZCwgYWN0aW9uX2JpZDogYWN0aW9uX2JpZCB9KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+iOt+W+l+aMh+Wumuexu+Wei+a0u+WKqOeahOaJgOacieWtkOa0u+WKqOWIl+ihqCznlKjkuo7kuLvnlYzpnaLmmL7npLos6L+Z6YeM5YGa5LiA5Liq5o6S5bqP5aSE55CG5ZCnXG4gICAgZ2V0QWN0aW9uU3ViTGlzdChmdW5jdGlvbl9pZCkge1xuICAgICAgICB2YXIgYWN0aW9uX3N1Yl9saXN0ID0gW107XG4gICAgICAgIGlmICh0aGlzLmhvbGlkYXlfbGlzdCkge1xuICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmhvbGlkYXlfbGlzdCkge1xuICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5ob2xpZGF5X2xpc3Rba107XG4gICAgICAgICAgICAgICAgaWYgKHYuY2xpX3R5cGUgPT0gZnVuY3Rpb25faWQgJiYgdi5pc1Nob3dJbkFjdGlvbigpID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3N1Yl9saXN0LnB1c2godik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChVdGlscy5uZXh0KGFjdGlvbl9zdWJfbGlzdCkgIT0gbnVsbCkge1xuICAgICAgICAgICAgYWN0aW9uX3N1Yl9saXN0LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5zb3J0X3ZhbCAtIGIuc29ydF92YWxcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjdGlvbl9zdWJfbGlzdFxuICAgIH0sXG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t5Y2H57qn5pyJ56S85Y2P6K6uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIHNlbmQyMTIwMCgpIHtcbiAgICAgICAgbGV0IHByb3RvY2FsID0ge31cbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjEyMDAsIHByb3RvY2FsKVxuICAgIH0sXG4gICAgaGFuZGxlMjEyMDAoZGF0YSkge1xuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEFjdGlvbkV2ZW50LlVQREFURV9MRVZFTF9VUF9HSUZULCBkYXRhKVxuICAgIH0sXG4gICAgc2VuZDIxMjAxKGlkKSB7XG4gICAgICAgIGxldCBwcm90b2NhbCA9IHt9XG4gICAgICAgIHByb3RvY2FsLmlkID0gaWRcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjEyMDEsIHByb3RvY2FsKVxuICAgIH0sXG4gICAgaGFuZGxlMjEyMDEoZGF0YSkge1xuICAgICAgICBtZXNzYWdlKGRhdGEubXNnKVxuICAgIH0sXG5cbiAgICAvL+iOt+WPluS4gOS4quaMh+Wumuexu+Wei+a0u+WKqOaMh+WumuWtkOa0u+WKqOWPr+mihuWPlueKtuaAgeaVsOaNrlxuICAgIGdldEhvbGlkYXlBd2VyYWRzU3RhdHVzOiBmdW5jdGlvbiAoYmlkKSB7XG4gICAgICAgIGlmICh0aGlzLmhvbGlkYXlfYXdhcmRfbGlzdCAhPSBudWxsICYmIHRoaXMuaG9saWRheV9hd2FyZF9saXN0W2JpZF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaG9saWRheV9hd2FyZF9saXN0W2JpZF1cbiAgICAgICAgfVxuICAgIH0sXG5cblxuICAgIC8v5o6S6KGM5qac5aWW5Yqx6aKE6KeI5Y2P6K6uKOS7peWQjuWPr+iDveaYr+a0u+WKqOmAmueUqOaOkuihjOWlluWKseS/oeaBrylcbiAgICBzZW5kMTY2NTA6IGZ1bmN0aW9uIChiaWQpIHtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLmJpZCA9IGJpZDtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTY2NTAsIHByb3RvY2FsKVxuICAgIH0sXG5cbiAgICBoYW5kbGUxNjY1MDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZyk7XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoQWN0aW9uRXZlbnQuUkFOS19SRVdBUkRfTElTVCwgZGF0YSlcbiAgICB9LFxuXG4gICAgLy8gLS1kZXNjOua0u+WKqOmihuWPlui/lOWbnlxuICAgIG9uMTY2MDYoZGF0YSkge1xuICAgICAgICB0aGlzLnNldEhvbGlkYXlTdGF0dXMoZGF0YS5iaWQsIChkYXRhLmNhbl9nZXRfbnVtICE9IGZhbHNlKSlcbiAgICB9LFxuICAgIG9uMTY2MDcoZGF0YSl7XG4gICAgICAgIGlmKGRhdGEgJiYgZGF0YS50eXBlID09IDApeyAvLy0tMOeCueabtOaWsFxuICAgICAgICAgICAgdGhpcy5uZWVkUmVxdWlyZURhdGEodHJ1ZSlcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLy8gIOW5uOi/kOi9rOebmFxuICAgIHJlcXVlc3RMdWNreTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxNjYzNywge30pO1xuICAgIH0sXG5cbiAgICBoYW5kbGUxNjYzNzogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdGhpcy5tb2RlbC5zZXRUcmVhc3VyZUluaXREYXRhKGRhdGEuZGlhbF9kYXRhKTtcbiAgICAgICAgdGhpcy5tb2RlbC5sdWNrbHlSZWRQb2ludCgpO1xuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEFjdGlvbkV2ZW50LlVQREFURV9MVUNLWVJPVU5EX0dFVCwgZGF0YSk7XG4gICAgfSxcblxuICAgIHNlbmQxNjYzODogZnVuY3Rpb24gKHR5cGUsIGNvdW50KSB7XG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9O1xuICAgICAgICBwcm90b2NhbC50eXBlID0gdHlwZTtcbiAgICAgICAgcHJvdG9jYWwudHlwZTIgPSBjb3VudDtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTY2MzgsIHByb3RvY2FsKTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMTY2Mzg6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoQWN0aW9uRXZlbnQuVFJFQVNVUkVfU1VDQ0VTU19EQVRBLCBkYXRhKTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMTY2Mzk6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoQWN0aW9uRXZlbnQuVVBEQVRFX0xVQ0tMWV9EQVRBLCBkYXRhKTtcbiAgICB9LFxuXG4gICAgc2VuZDE2NjQwOiBmdW5jdGlvbiAodHlwZSwgaWQpIHtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLnR5cGUgPSB0eXBlO1xuICAgICAgICBwcm90b2NhbC5pZCA9IGlkO1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxNjY0MCwgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICBoYW5kbGUxNjY0MTogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShBY3Rpb25FdmVudC5VUERBVEFfVFJFQVNVUkVfTE9HX0RBVEEsIGRhdGEpO1xuICAgIH0sXG5cbiAgICBzZW5kMTY2NDI6IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9O1xuICAgICAgICBwcm90b2NhbC50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTY2NDIsIHByb3RvY2FsKTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMTY2NDI6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpXG4gICAgICAgIC8vIC0tIEdsb2JhbEV2ZW50OmdldEluc3RhbmNlKCk6RmlyZShBY3Rpb25FdmVudC5VUERBVEFfVFJFQVNVUkVfUkVGUkVTSCwgZGF0YSlcbiAgICB9LFxuXG4gICAgLy8g5by556qX55qEXG4gICAgc2VuZDE2NjQzOiBmdW5jdGlvbiAodHlwZSwgY291bnQpIHtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLnR5cGUgPSB0eXBlO1xuICAgICAgICBwcm90b2NhbC50eXBlMiA9IGNvdW50O1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxNjY0MywgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICBoYW5kbGUxNjY0MzogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZyk7XG4gICAgICAgIGlmIChkYXRhLmNvZGUgPT0gMSkge1xuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShBY3Rpb25FdmVudC5VUERBVEFfVFJFQVNVUkVfUE9QVVBTX1NFTkQsIGRhdGEpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIC0tLS0t5omT5byA5bm46L+Q5o6i5a6d55WM6Z2iLS0tLS1cbiAgICBvcGVuTHVja3lUcmVhc3VyZVdpbjogZnVuY3Rpb24gKHN0YXR1cywgaW5kZXgpIHtcbiAgICAgICAgaW5kZXggPSBpbmRleCB8fCAxO1xuICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICB2YXIgaXNfb3BlbiA9IHRoaXMubWFpbnVpX2N0cmwuY2hlY2tNYWluRnVuY3Rpb25PcGVuU3RhdHVzKE1haW51aUNvbnN0Lmljb24ubHVja3lfdHJlYXN1cmUsIE1haW51aUNvbnN0LmZ1bmN0aW9uX3R5cGUub3RoZXIsIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChpc19vcGVuID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g6auY57qn5o6i5a6d55qE5pe25YCZXG4gICAgICAgICAgICBpZiAoaW5kZXggPT0gMikge1xuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuc2V0QnV5UmV3YXJkRGF0YSgpO1xuICAgICAgICAgICAgICAgIHZhciBvcGVuX2RhdGEgPSB0aGlzLm1vZGVsLmdldEJ1eVJld2FyZERhdGEoaW5kZXgpO1xuICAgICAgICAgICAgICAgIHZhciBvcGVuID0gdGhpcy5tYWludWlfY3RybC5jaGVja0lzT3BlbkJ5QWN0aXZhdGUob3Blbl9kYXRhWzFdLmxpbWl0X29wZW4pO1xuICAgICAgICAgICAgICAgIGlmIChvcGVuID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UoVXRpbHMuVEkxOE4oXCLkurrniannrYnnuqfkuI3otrNcIikpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMudHJlYXN1cmVfd2luKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmVhc3VyZV93aW4gPSBVdGlscy5jcmVhdGVDbGFzcyhcImFjdGlvbl90cmVhc3VyZV93aW5kb3dcIiwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy50cmVhc3VyZV93aW4gJiYgdGhpcy50cmVhc3VyZV93aW4uaXNPcGVuKCkgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyZWFzdXJlX3dpbi5vcGVuKGluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRyZWFzdXJlX3dpbikge1xuICAgICAgICAgICAgICAgIHRoaXMudHJlYXN1cmVfd2luLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy50cmVhc3VyZV93aW4gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBnZXRUcmVhc3VyZVZpZXc6ZnVuY3Rpb24oKXtcbiAgICAgICAgaWYgKHRoaXMudHJlYXN1cmVfd2luKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmVhc3VyZV93aW5cbiAgICAgICAgfVxuICAgIH0sXG4gICAgY2hlY2tPcGVuQWN0aW9uTGltaXRHaWZ0TWFpbldpbmRvdygpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICBpZiAoc2VsZi5hY3RpdmVfbGltaXRfZ2lmdF9pZCA9PSAyMDAxKSB7IFx0Ly8tLSAxOOe6p+eahOS4jeaPkOekulxuICAgICAgICAgICAgc2VsZi5hY3RpdmVfbGltaXRfZ2lmdF9pZCA9IG51bGxcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlbGYuYWN0aXZlX2xpbWl0X2dpZnRfaWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IGNvbmZpZyA9IENvbmZpZy5zdGFyX2dpZnRfZGF0YS5kYXRhX2xpbWl0X2dpZnRbc2VsZi5hY3RpdmVfbGltaXRfZ2lmdF9pZF1cbiAgICAgICAgICAgIGlmIChjb25maWcpIHtcbiAgICAgICAgICAgICAgICBsZXQgZ2lmdF9pZCA9IHNlbGYuYWN0aXZlX2xpbWl0X2dpZnRfaWRcbiAgICAgICAgICAgICAgICB2YXIgQ29tbW9uQWxlcnQgPSByZXF1aXJlKFwiY29tbW9uYWxlcnRcIik7XG4gICAgICAgICAgICAgICAgQ29tbW9uQWxlcnQuc2hvdyhjb25maWcuZGVzYywgVXRpbHMuVEkxOE4oJ+WJjeW+gCcpLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3BlbkFjdGlvbkxpbWl0R2lmdE1haW5XaW5kb3codHJ1ZSwgZ2lmdF9pZClcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcyksIFV0aWxzLlRJMThOKCflj5bmtognKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZWxmLmFjdGl2ZV9saW1pdF9naWZ0X2lkID0gbnVsbFxuICAgIH0sXG4gICAgLy8gLS3miZPlvIDpmZDml7bnpLzljIXlhaXlj6NcbiAgICAvLyAtLeaJk+W8gOaYvuekuuekvOWMhWlkXG4gICAgb3BlbkFjdGlvbkxpbWl0R2lmdE1haW5XaW5kb3coc3RhdHVzLCBpZCkge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmICghc2VsZi5hY3Rpb25fbGltaXRfZ2lmdCkge1xuICAgICAgICAgICAgICAgIGxldCBBY3Rpb25MaW1pdEdpZnRNYWluV2luZG93ID0gcmVxdWlyZShcImFjdGlvbl9saW1pdF9naWZ0X21haW5fd2luZG93XCIpXG4gICAgICAgICAgICAgICAgc2VsZi5hY3Rpb25fbGltaXRfZ2lmdCA9IG5ldyBBY3Rpb25MaW1pdEdpZnRNYWluV2luZG93KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlbGYuYWN0aW9uX2xpbWl0X2dpZnQub3BlbihpZClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzZWxmLmFjdGlvbl9saW1pdF9naWZ0KSB7XG4gICAgICAgICAgICAgICAgc2VsZi5hY3Rpb25fbGltaXRfZ2lmdC5jbG9zZSgpXG4gICAgICAgICAgICAgICAgc2VsZi5hY3Rpb25fbGltaXRfZ2lmdCA9IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgc2VuZDIxMjEwKCkge1xuICAgICAgICBsZXQgcHJvdG9jYWwgPSB7fVxuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgyMTIxMCwgcHJvdG9jYWwpXG4gICAgfSxcbiAgICBoYW5kbGUyMTIxMChkYXRhKSB7XG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpXG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoQWN0aW9uRXZlbnQuTElNSVRfR0lGVF9NQUlOX0VWRU5ULCBkYXRhKVxuICAgIH0sXG4gICAgLy8gLS3mjqjpgIHmv4DmtLvkuobmmL7npLrnpLzljIUu5bm25LiU5Zyo5p+Q5Lqb5pON5L2c5ZCO6ZyA6KaB5pi+56S6XG4gICAgaGFuZGxlMjEyMTEoZGF0YSkge1xuICAgICAgICB0aGlzLmFjdGl2ZV9saW1pdF9naWZ0X2lkID0gZGF0YS5pZFxuICAgIH0sXG5cbiAgICAvLyAg5o6i5a6d6I635b6X54mp5ZOB55WM6Z2iXG4gICAgb3BlblRyZWFzdXJlR2V0SXRlbVdpbmRvdzogZnVuY3Rpb24gKHN0YXR1cywgZGF0YSwgaW5kZXgsIGNvdW50X3R5cGUpIHtcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnRyZWFzdXJlX2dldF93aW4pIHtcbiAgICAgICAgICAgICAgICBsZXQgQWN0aW9uVHJlYXN1cmVHZXRXaW5kb3cgPSByZXF1aXJlKFwiYWN0aW9uX3RyZWFzdXJlX2dldF93aW5kb3dcIilcbiAgICAgICAgICAgICAgICB0aGlzLnRyZWFzdXJlX2dldF93aW4gPSBuZXcgQWN0aW9uVHJlYXN1cmVHZXRXaW5kb3codGhpcywgZGF0YSwgaW5kZXgsIGNvdW50X3R5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMudHJlYXN1cmVfZ2V0X3dpbiAmJiB0aGlzLnRyZWFzdXJlX2dldF93aW4uaXNPcGVuKCkgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyZWFzdXJlX2dldF93aW4ub3BlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMudHJlYXN1cmVfZ2V0X3dpbikge1xuICAgICAgICAgICAgICAgIHRoaXMudHJlYXN1cmVfZ2V0X3dpbi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMudHJlYXN1cmVfZ2V0X3dpbiA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0U2V2ZW5Mb2dpblJvb3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2V2ZW5fbG9naW5fd2luKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V2ZW5fbG9naW5fd2luLnJvb3Rfd25kXG4gICAgfSxcblxuICAgIGdldFRyZWFzdXJlUm9vdDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy50cmVhc3VyZV93aW4pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmVhc3VyZV93aW4ucm9vdF93bmQ7XG4gICAgfSxcblxuICAgIC8v5piv5ZCm5Y+v5Lul5Yib5bu65oyH5a6a5rS75Yqo57G75Z6LLOWPquaciea0u+WKqOaAu+WIl+ihqOmHjOmdouaciei/meS4qua0u+WKqOexu+Wei+aJjeWPr+S7peWIm+W7ulxuICAgIGNoZWNrQ2FuQWRkV29uZGVyZnVsKGZ1bmN0aW9uX2lkKSB7XG4gICAgICAgIGlmIChmdW5jdGlvbl9pZCA9PSBudWxsKSByZXR1cm4gZmFsc2VcbiAgICAgICAgaWYgKHRoaXMuaG9saWRheV9saXN0ID09IG51bGwgfHwgVXRpbHMubmV4dCh0aGlzLmhvbGlkYXlfbGlzdCkgPT0gbnVsbCkgcmV0dXJuIGZhbHNlXG4gICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5ob2xpZGF5X2xpc3QpIHtcbiAgICAgICAgICAgIHZhciB2ID0gdGhpcy5ob2xpZGF5X2xpc3Rba107XG4gICAgICAgICAgICBpZiAodi5jbGlfdHlwZSA9PSBmdW5jdGlvbl9pZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLeadgui0p+mTuuWNj+iuruW8gOWniy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBzZW5kZXIxNjY4ODogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxNjY4OCwge30pO1xuICAgIH0sXG5cbiAgICBoYW5kbGUxNjY4ODogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdGhpcy5tb2RlbC5zZXRTdG9uZVNob3BEYXRhKGRhdGEuYnV5X2luZm8pO1xuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEFjdGlvbkV2ZW50LlVQREFURV9TVE9SRV9EQVRBX0VWRU5UKTtcbiAgICB9LFxuXG4gICAgc2VuZGVyMTY2ODk6IGZ1bmN0aW9uIChpZCwgbnVtKSB7XG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9O1xuICAgICAgICBwcm90b2NhbC5pZCA9IGlkO1xuICAgICAgICBwcm90b2NhbC5udW0gPSBudW07XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDE2Njg5LCBwcm90b2NhbCk7XG4gICAgfSxcblxuICAgIGhhbmRsZTE2Njg5OiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBtZXNzYWdlKGRhdGEubXNnKTtcbiAgICAgICAgaWYgKGRhdGEuY29kZSA9PSAxKSB7XG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEFjdGlvbkV2ZW50LlVQREFURV9TVE9SRV9EQVRBX1NVQ0NFU1NfRVZFTlQsIGRhdGEpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLeaWsOacjemZkOi0reWNj+iurue7k+adny0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0t5paw5pyN6ZmQ6LSt5Y2P6K6u5byA5aeLLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIOe6oueCuVxuICAgIHNlbmRlcjE2Njg3OmZ1bmN0aW9uKHNlbmRfcHJvdG9jYWwpe1xuICAgICAgICB2YXIgcHJvdG9jYWwgPSBzZW5kX3Byb3RvY2FsIHx8IHt9O1xuICAgICAgICB2YXIgbGVuID0gMDtcbiAgICAgICAgZm9yKHZhciBpIGluIHNlbmRfcHJvdG9jYWwpe1xuICAgICAgICAgICAgbGVuKz0xO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZihsZW4gPT0gMCl7XG4gICAgICAgICAgICBwcm90b2NhbC5iaWQgPSA5MTAyOTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDE2Njg3LCBwcm90b2NhbCk7XG4gICAgfSxcblxuICAgIGhhbmRsZTE2Njg3OmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICB2YXIgc3RhdHVzID0gZmFsc2U7XG4gICAgICAgIGlmKGRhdGEuY29kZSA9PSAxKXtcbiAgICAgICAgICAgIHN0YXR1cyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YS5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIGlmKGRhdGEuYmlkID09IEFjdGlvbkNvbnN0LkFjdGlvblJhbmtDb21tb25UeXBlLm9wZW5fc2VydmVyKXtcbiAgICAgICAgICAgIE1haW51aUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5zZXRGdW5jdGlvblRpcHNTdGF0dXMoTWFpbnVpQ29uc3QuaWNvbi5vcGVuX3NlcnZlcl9yZWNoYXJnZSwgc3RhdHVzKVxuICAgICAgICB9ZWxzZSBpZihkYXRhLmJpZCA9PSBBY3Rpb25Db25zdC5BY3Rpb25SYW5rQ29tbW9uVHlwZS5oaWdoX3ZhbHVlX2dpZnQgfHwgZGF0YS5iaWQgPT0gQWN0aW9uQ29uc3QuQWN0aW9uUmFua0NvbW1vblR5cGUubXlzdGVyaW91c19zdG9yZSl7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLnVwZGF0ZUdpZnRSZWRQb2ludFN0YXR1cyhkYXRhKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0t5paw5pyN6ZmQ6LSt5Y2P6K6u57uT5p2fLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgLy8g5Yik5pat5piv5ZCm6IO95YWF5YC8XG4gICAgc2VuZGVyMjEwMTY6ZnVuY3Rpb24oY2hhcmdlX2lkKXtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLmNoYXJnZV9pZCA9IGNoYXJnZV9pZDtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjEwMTYsIHByb3RvY2FsKTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMjEwMTY6ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoQWN0aW9uRXZlbnQuSXNfQ2hhcmdlX0V2ZW50LCBkYXRhKTtcbiAgICB9LFxuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS1cbiAgICAvLyBkZXNjOueZu+W9leaXtuWAmeivt+axguS4gOS6m+eJueauiua0u+WKqGlk55qE57qi54K55pWw5o2uXG4gICAgLy8gdGltZToyMDE3LTA3LTE4IDA1OjE1OjEwXG4gICAgLy8gQHJldHVybiBcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLVxuICAgIHJlcXVlc3RBY3Rpb25SZWRTdGF0dXM6ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5zZW5kZXIxNjY4Nyh7YmlkOkFjdGlvbkNvbnN0LkFjdGlvblJhbmtDb21tb25UeXBlLm9wZW5fc2VydmVyfSkgICAgIC8v5bCP6aKd55u06LSt6K+35rGC57qi54K5XG4gICAgICAgIHRoaXMuc2VuZGVyMTY2ODcoe2JpZDpBY3Rpb25Db25zdC5BY3Rpb25SYW5rQ29tbW9uVHlwZS5oaWdoX3ZhbHVlX2dpZnR9KSAvL+Wwj+mineekvOWMheivt+axgue6oueCuVxuICAgICAgICB0aGlzLnNlbmRlcjE2Njg3KHtiaWQ6QWN0aW9uQ29uc3QuQWN0aW9uUmFua0NvbW1vblR5cGUubXlzdGVyaW91c19zdG9yZX0pIC8v56We56eY5p2C6LSn5bqX6K+35rGC57qi54K5XG4gICAgfSxcblxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS3lhYPlrrXlhpLpmanljY/orq7lvIDlp4stLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gLS0g6K+35rGC5Lu75Yqh5L+h5oGvXG4gICAgc2VuZGVyMjQ4MTAoKXtcbiAgICAgICAgbGV0IHByb3RvY2FsID0ge31cbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjQ4MTAsIHByb3RvY2FsKVxuICAgIH0sXG5cbiAgICBoYW5kbGUyNDgxMCggZGF0YSApe1xuICAgICAgICBtZXNzYWdlKGRhdGEubXNnKVxuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEFjdGlvbkV2ZW50LllVQU5fWkhFTl9EQVRBX0VWRU5ULCBkYXRhKVxuICAgIH0sXG5cbiAgICAvLyAtLeaOqOmAgeS7u+WKoVxuICAgIGhhbmRsZTI0ODExKCBkYXRhICl7XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoQWN0aW9uRXZlbnQuWVVBTl9aSEVOX1VQREFUQV9FVkVOVCwgZGF0YSlcbiAgICB9LFxuXG4gICAgLy8gLS0g5a6M5oiQ5Lu75YqhXG4gICAgc2VuZGVyMjQ4MTIoaWQpe1xuICAgICAgICBsZXQgcHJvdG9jYWwgPSB7fVxuICAgICAgICBwcm90b2NhbC5pZCA9IGlkXG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDI0ODEyLCBwcm90b2NhbClcbiAgICB9LFxuXG4gICAgaGFuZGxlMjQ4MTIoIGRhdGEgKXtcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZylcbiAgICAgICAgaWYoZGF0YS5jb2RlID09IHRydWUpe1xuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShBY3Rpb25FdmVudC5ZVUFOX1pIRU5fVEFTS19FVkVOVCwgZGF0YSlcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLeWFg+WuteWGkumZqeWNj+iurue7k+adny0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIC8vIOinpuWPkeekvOWMhVxuICAgIG9wZW5UcmlnZ2VyR2lmdFdpbmRvdzogZnVuY3Rpb24gKHN0YXR1cykge1xuICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYWN0aW9uX3RpbWVfZ2lmdF9iaWcpIHtcbiAgICAgICAgICAgICAgICBsZXQgQWN0aW9uVGltZUdpZnRCaWdXaW5kb3cgPSByZXF1aXJlKFwiYWN0aW9uX3RpbWVfZ2lmdF9iaWdfd2luZG93XCIpXG4gICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25fdGltZV9naWZ0X2JpZyA9IG5ldyBBY3Rpb25UaW1lR2lmdEJpZ1dpbmRvdyh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGlvbl90aW1lX2dpZnRfYmlnICYmIHRoaXMuYWN0aW9uX3RpbWVfZ2lmdF9iaWcuaXNPcGVuKCkgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbl90aW1lX2dpZnRfYmlnLm9wZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGlvbl90aW1lX2dpZnRfYmlnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25fdGltZV9naWZ0X2JpZy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uX3RpbWVfZ2lmdF9iaWcgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBzZW5kZXIyMTIyMCgpe1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgyMTIyMCwge30pXG4gICAgfSxcbiAgICBoYW5kbGUyMTIyMChkYXRhKXtcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZylcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShBY3Rpb25FdmVudC5UUklHR0VSX0dJRlRfRVZFTlQsIGRhdGEpXG4gICAgfSxcblx0Ly8gLS3lvIDmnI3otoXlgLznpLzljIXnlYzpnaJcbiAgICBvcGVuQWN0aW9uT3BlblNlcnZlckdpZnRXaW5kb3coc3RhdHVzLCBiaWQpe1xuICAgICAgICBpZihzdGF0dXMpe1xuICAgICAgICAgICAgaWYoIXRoaXMuYWN0aW9uX29wZW5fc2VydmVyX3JlY2hhcmdlKXtcbiAgICAgICAgICAgICAgICBsZXQgQWN0aW9uT3BlblNlcnZlckdpZnRXaW5kb3cgPSByZXF1aXJlKFwiYWN0aW9uX29wZW5fc2VydmVyX2dpZnRfd2luZG93XCIpXG4gICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25fb3Blbl9zZXJ2ZXJfcmVjaGFyZ2UgPSBuZXcgQWN0aW9uT3BlblNlcnZlckdpZnRXaW5kb3codGhpcylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGlvbl9vcGVuX3NlcnZlcl9yZWNoYXJnZSAmJiB0aGlzLmFjdGlvbl9vcGVuX3NlcnZlcl9yZWNoYXJnZS5pc09wZW4oKSA9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uX29wZW5fc2VydmVyX3JlY2hhcmdlLm9wZW4oYmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpZih0aGlzLmFjdGlvbl9vcGVuX3NlcnZlcl9yZWNoYXJnZSl7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25fb3Blbl9zZXJ2ZXJfcmVjaGFyZ2UuY2xvc2UoKVxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uX29wZW5fc2VydmVyX3JlY2hhcmdlID0gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvLy0t6K+V54K85LmL5aKDXG4gICAgc2VuZGVyMjQ4MTMoKXtcblx0ICAgIHRoaXMuU2VuZFByb3RvY2FsKDI0ODEzLCB7fSlcbiAgICB9LFxuICAgIGhhbmRsZTI0ODEzKCBkYXRhICl7XG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpXG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoQWN0aW9uRXZlbnQuWVVBTl9aSEVOX0RBVEFfRVZFTlQsIGRhdGEpXG4gICAgfSxcblxuXG5cbiAgICAvL+ajgOafpea0u+WKqOaYr+WQpuWtmOWcqGV4aXN0XG4gICAgLy9AYWN0aW9uX2JpZCDmtLvliqjln7rnoYBpZFxuICAgIC8vQGNhbXBfaWQg5rS75YqoaWQg5bGe5LqO5Y+v5Lul6YCJ5Y+C5pWwLCDlpoLmnpzmnInlgLzooajnpLrpnIDopoHliKTlrpogIOWmguaenOS4um5pbCDooajnpLog5LiN6ZyA6KaB5Yik5a6aXG4gICAgY2hlY2tBY3Rpb25FeGlzdEJ5QWN0aW9uQmlkOiBmdW5jdGlvbiAoYWN0aW9uX2JpZCkge1xuICAgICAgICBpZighYWN0aW9uX2JpZCkgcmV0dXJuIGZhbHNlXG4gICAgICAgIGxldCB0YWJfdm8gPSB0aGlzLmdldEFjdGlvblN1YlRhYlZvKGFjdGlvbl9iaWQpO1xuICAgICAgICBpZih0YWJfdm8pIHJldHVybiB0cnVlXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG4gICAgXG4gICAgc2VuZGVyMjQ4MTQoaWQpe1xuICAgICAgICBsZXQgcHJvdG9jYWwgPSB7fVxuICAgICAgICBwcm90b2NhbC5pZCA9IGlkXG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDI0ODE0LCBwcm90b2NhbClcbiAgICB9LFxuICAgIGhhbmRsZTI0ODE0KCBkYXRhICl7XG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpXG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoQWN0aW9uRXZlbnQuWVVBTl9aSEVOX1RBU0tfRVZFTlQsIGRhdGEpXG4gICAgfSxcblxuICAgIC8v5pe26KOFLS0tLS0tLS0tXG4gICAgc2VuZGVyMzAxMDEoKXtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMzAxMDEsIHt9KVxuICAgIH0sXG4gICAgaGFuZGxlMzAxMDEoIGRhdGEgKXtcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZylcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShBY3Rpb25FdmVudC5TS0lOX0lORk9fRVZFTlQsIGRhdGEpXG4gICAgfSxcbiAgICBzZW5kZXIzMDEwMCgpe1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgzMDEwMCwge30pXG4gICAgfSxcbiAgICBoYW5kbGUzMDEwMChkYXRhKXtcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZylcbiAgICB9LFxuICAgIGhhbmRsZTMwMTAyKGRhdGEpe1xuICAgICAgICBNYWludWlDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2V0RnVuY3Rpb25UaXBzU3RhdHVzKE1haW51aUNvbnN0Lmljb24uc2tpbiwgZGF0YS5jb2RlID09IDEpXG4gICAgfSxcbiAgICBvcGVuQnV5U2tpbldpbmRvdyhzdGF0dXMpe1xuICAgICAgICBpZihzdGF0dXMpe1xuICAgICAgICAgICAgaWYoIXRoaXMuYWN0aW9uX2J1eV9za2luKXtcbiAgICAgICAgICAgICAgICBsZXQgQWN0aW9uQnV5U2tpbldpbmRvdyA9IHJlcXVpcmUoXCJhY3Rpb25fYnV5X3NraW5fd2luZG93XCIpXG4gICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25fYnV5X3NraW4gPSBuZXcgQWN0aW9uQnV5U2tpbldpbmRvdyh0aGlzKVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFjdGlvbl9idXlfc2tpbiAmJiB0aGlzLmFjdGlvbl9idXlfc2tpbi5pc09wZW4oKSA9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbl9idXlfc2tpbi5vcGVuKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGlmKHRoaXMuYWN0aW9uX2J1eV9za2luKXtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbl9idXlfc2tpbi5jbG9zZSgpXG4gICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25fYnV5X3NraW4gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICB9LFxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQWN0aW9uQ29udHJvbGxlcjsiXX0=
|