|
(function() {
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
var __module = nodeEnv ? module : {exports:{}};
|
var __filename = 'preview-scripts/assets/Scripts/mod/battle/view/battle_mvp_window.js';
|
var __require = nodeEnv ? function (request) {
|
return cc.require(request);
|
} : function (request) {
|
return __quick_compile_project__.require(request, __filename);
|
};
|
function __define (exports, require, module) {
|
if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict";
|
cc._RF.push(module, '4df38kJPb9CAIn5r/BxCTI3', 'battle_mvp_window');
|
// Scripts/mod/battle/view/battle_mvp_window.js
|
|
"use strict";
|
|
// --------------------------------------------------------------------
|
// @author: xxx@syg.com(必填, 创建模块的人员)
|
// @description:
|
// 这里是描述这个窗体的作用的
|
// <br/>Create: 2019-03-22 11:57:11
|
// --------------------------------------------------------------------
|
var PathTool = require("pathtool");
|
|
var BattleConst = require("battle_const");
|
|
var PlayerHead = require("playerhead");
|
|
var RoleController = require("role_controller");
|
|
var BattleController = require("battle_controller");
|
|
var BattleEvent = require("battle_event");
|
|
var CommonScrollView = require("common_scrollview");
|
|
var BattleDramaHookRewardListPanel = require("battle_drama_hook_reward_list_panel");
|
|
var Battle_mvpWindow = cc.Class({
|
"extends": BaseView,
|
ctor: function ctor() {
|
this.prefabPath = PathTool.getPrefabPath("battle", "battle_mvp_view");
|
this.viewTag = SCENE_TAG.dialogue; //该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意
|
|
this.win_type = WinType.Mini; //是否是全屏窗体 WinType.Full, WinType.Big, WinType.Mini, WinType.Tips
|
|
this.data = arguments[0];
|
var data = this.data;
|
this.result = data.result;
|
this.reward_list = data.item_rewards || {};
|
this.fight_type = data.combat_type || BattleConst.Fight_Type.Darma;
|
this.partner_bid = data.partner_bid || 0;
|
this.partner_hurt = data.partner_hurt || 0;
|
this.partner_total_hurt = data.partner_total_hurt || 0;
|
this.role_exp = data.exp || 0;
|
this.role_lv = data.lev || 1;
|
this.role_nowlv = data.new_lev || 1;
|
this.role_nowexp = data.new_exp || 0;
|
this.use_skin = data.use_skin || 0;
|
},
|
// 初始化一些配置数据,可以用于声明一些变量之类的
|
initConfig: function initConfig() {
|
this.ani_isover = false;
|
this.item_list = {};
|
this.role_vo = RoleController.getInstance().getRoleVo();
|
this.ctrl = BattleController.getInstance();
|
this.model = this.ctrl.getModel();
|
},
|
// 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件
|
openCallBack: function openCallBack() {
|
this.main_container = this.seekChild("container");
|
this.main_container.zIndex = 1;
|
this.containerSize = this.main_container.getContentSize();
|
this.background = this.root_wnd.getChildByName("background");
|
this.background.scale = FIT_SCALE;
|
this.auto_combat_num_lb = this.seekChild(this.main_container, "auto_combat_num", cc.Label);
|
this.auto_combat_num_lb.node.active = false;
|
this.seekChild("pic_mvp").zIndex = 1;
|
this.time_label_rt = this.seekChild(this.main_container, "time_label", cc.RichText);
|
this.time_label_rt.string = Utils.TI18N("5秒后关闭");
|
this.time_label_rt.node.active = false;
|
this.comfirm_btn = this.seekChild(this.main_container, "comfirm_btn");
|
this.harm_btn = this.seekChild(this.main_container, "harm_btn");
|
|
if (this.data && Utils.next(this.data) != null) {
|
this.harm_btn.active = true;
|
} else {
|
this.harm_btn.active = false;
|
}
|
|
this.special_sk = this.seekChild(this.main_container, "play_effect", sp.Skeleton); //进度条
|
|
this.progress_bg_nd = this.seekChild(this.main_container, "sprite_3");
|
this.sprite_4_nd = this.seekChild(this.main_container, "sprite_4");
|
this.progress_pb = this.seekChild(this.main_container, "sprite_3", cc.ProgressBar);
|
this.progress_pb.progress = 0;
|
this.proTxt_lb = this.seekChild(this.main_container, "proTxt", cc.Label);
|
this.progress_bg_nd.active = false; //延迟0.3秒显示进度条动画
|
|
Utils.delayRun(this.root_wnd, 0.3, function () {
|
this.showProgressEffect();
|
}.bind(this)); //头像
|
|
var sp_2 = this.seekChild(this.main_container, "sprite_2");
|
this.head_icon = new PlayerHead();
|
this.head_icon.setParent(sp_2);
|
this.head_icon.show();
|
this.head_icon.setScale(0.8);
|
this.head_icon.setPosition(0, 0);
|
this.head_icon.setHeadRes(this.role_vo.face_id); //等级
|
|
this.roleLvTxt_lb = this.seekChild(this.main_container, "roleLvTxt", cc.Label);
|
this.roleLvTxt_lb.string = cc.js.formatStr("Lv.%d", this.role_nowlv);
|
var partner_config = Config.partner_data.data_partner_base[this.partner_bid];
|
var skin_config = Config.partner_skin_data.data_skin_info[this.use_skin];
|
this.mvp_con_nd = this.seekChild("mvp_con"); //名称和立绘
|
|
var pic_bg = this.seekChild(this.mvp_con_nd, "pic_bg");
|
this.bust_icon_sp = this.seekChild("bustIcon", cc.Sprite);
|
pic_bg.zIndex = 1;
|
this.roleNameTxt_lb = this.seekChild(pic_bg, "roleNameTxt", cc.Label);
|
|
if (partner_config) {
|
this.roleNameTxt_lb.string = partner_config.name;
|
var bustid = null;
|
|
if (skin_config) {
|
bustid = skin_config.bustid;
|
} else {
|
bustid = partner_config.bustid;
|
}
|
|
var bust_res = PathTool.getPartnerBustRes(bustid);
|
this.loadRes(bust_res, function (bg_sf) {
|
this.bust_icon_sp.spriteFrame = bg_sf;
|
}.bind(this));
|
} //伤害输出
|
|
|
var hurtTxt_lb = this.seekChild(pic_bg, "hurtTxt", cc.Label);
|
var hurtPercent = cc.js.formatStr("%s", Math.floor(this.partner_hurt / this.partner_total_hurt * 100)) + "%";
|
hurtTxt_lb.string = cc.js.formatStr("%d(%s)", Math.ceil(Number(this.partner_hurt)), hurtPercent); //显示特效
|
|
this.handleEffect(true);
|
this.scroll_con_nd = this.seekChild(this.main_container, "scroll_con");
|
var tab_size = this.scroll_con_nd.getContentSize();
|
var setting = {
|
item_class: BattleDramaHookRewardListPanel,
|
// 单元类
|
start_x: 94,
|
// 第一个单元的X起点
|
space_x: 20,
|
// x方向的间隔
|
start_y: 0,
|
// 第一个单元的Y起点
|
space_y: 0,
|
// y方向的间隔
|
item_width: 120,
|
// 单元的尺寸width
|
item_height: 180,
|
// 单元的尺寸height
|
row: 1,
|
// 行数,作用于水平滚动类型
|
col: 4,
|
// 列数,作用于垂直滚动类型
|
need_dynamic: true
|
};
|
this.scroll_view = new CommonScrollView();
|
this.scroll_view.createScroll(this.scroll_con_nd, cc.v2(0, 0), ScrollViewDir.vertical, ScrollViewStartPos.top, tab_size, setting, cc.v2(0.5, 0.5));
|
this.rewardViewUI();
|
},
|
// 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
|
registerEvent: function registerEvent() {
|
Utils.onTouchEnd(this.comfirm_btn, function () {
|
if (this.ani_isover) {
|
this.ctrl.openFinishView(false, this.fight_type);
|
}
|
}.bind(this), 1);
|
Utils.onTouchEnd(this.harm_btn, function () {
|
if (this.data && Utils.next(this.data) != null) {
|
this.ctrl.openBattleHarmInfoView(true, this.data);
|
}
|
}.bind(this), 1);
|
},
|
showProgressEffect: function showProgressEffect() {
|
var baseCurMaxExp = Config.role_data.data_role_attr[this.role_lv].exp_max;
|
var basePercent = this.role_exp / baseCurMaxExp;
|
var maxPercent = this.role_nowexp / baseCurMaxExp;
|
|
if (this.role_lv != this.role_nowlv) {
|
//有升级
|
maxPercent = 1;
|
}
|
|
if (this.data.auto_num && this.data.auto_num > 0) {
|
this.auto_combat_num_lb.node.active = true;
|
this.auto_combat_num_lb.string = cc.js.formatStr(Utils.TI18N("已连续通过关卡数:%s"), this.data.auto_num);
|
}
|
|
this.progress_pb.progress = basePercent;
|
this.proTxt_lb.string = cc.js.formatStr("%d/%d", Number(this.role_exp), Number(baseCurMaxExp));
|
this.progress_bg_nd.active = true;
|
|
var call_back = function () {
|
basePercent = basePercent + 0.01;
|
|
if (basePercent > maxPercent) {
|
if (this.role_lv == this.role_nowlv) {
|
baseCurMaxExp = Config.role_data.data_role_attr[this.role_nowlv].exp_max;
|
basePercent = this.role_nowexp / baseCurMaxExp;
|
this.progress_pb.progress = basePercent;
|
this.proTxt_lb.string = cc.js.formatStr("%d/%d", this.role_nowexp, Number(baseCurMaxExp));
|
gcore.Timer.del("mvp_progress_timer");
|
} else {
|
//播放升级特效
|
if (this.progressEffect == null) {
|
this.progressEffect = this.seekChild(this.sprite_4_nd, "effect", sp.Skeleton);
|
var res = cc.js.formatStr("spine/%s/action.atlas", PathTool.getEffectRes(275));
|
this.loadRes(res, function (res_object) {
|
this.progressEffect.skeletonData = res_object;
|
this.progressEffect.setAnimation(0, PlayerAction.action, false);
|
}.bind(this));
|
} else {
|
this.progressEffect.setAnimation(0, PlayerAction.action, false);
|
}
|
|
this.role_lv = this.role_lv + 1;
|
basePercent = 0;
|
maxPercent = 1;
|
baseCurMaxExp = Config.role_data.data_role_attr[this.role_lv].exp_max;
|
|
if (this.role_lv == this.role_nowlv) {
|
maxPercent = this.role_nowexp / Config.role_data.data_role_attr[this.role_nowlv].exp_max;
|
}
|
}
|
} else {
|
this.progress_pb.progress = basePercent;
|
this.proTxt_lb.string = cc.js.formatStr("%d/%d", Math.ceil(baseCurMaxExp * basePercent), Number(baseCurMaxExp));
|
}
|
}.bind(this);
|
|
gcore.Timer.set(call_back, 10, -1, "mvp_progress_timer");
|
},
|
handleEffect: function handleEffect(status) {
|
if (status == false) {
|
if (this.special_sk) {
|
this.special_sk.setToSetupPose();
|
this.special_sk.clearTracks();
|
this.special_sk.node.active = false;
|
}
|
|
if (this.progressEffect) {
|
this.progressEffect.setToSetupPose();
|
this.progressEffect.clearTracks();
|
this.progressEffect.node.active = false;
|
}
|
} else {
|
if (this.special_sk) {
|
this.special_sk.node.active = true;
|
var res = cc.js.formatStr("spine/%s/action.atlas", PathTool.getEffectRes(274));
|
this.loadRes(res, function (res_object) {
|
this.special_sk.skeletonData = res_object;
|
this.special_sk.setAnimation(1, PlayerAction.action_1, false);
|
}.bind(this));
|
}
|
}
|
},
|
//奖励界面
|
rewardViewUI: function rewardViewUI() {
|
if (!this.reward_list) return;
|
this.scroll_view.setData(this.reward_list, null, {
|
is_show_name: true
|
});
|
Utils.delayRun(this.main_container, 0.5, function () {
|
this.ani_isover = true;
|
this.updateTimer();
|
}.bind(this));
|
},
|
updateTimer: function updateTimer() {
|
this.time_label_rt.node.active = true;
|
this.comfirm_btn.active = true;
|
var time = 5;
|
|
var call_back = function () {
|
time = time - 1;
|
var new_time = Math.ceil(time);
|
var str = new_time + Utils.TI18N("秒后关闭");
|
|
if (this.time_label_rt) {
|
this.time_label_rt.string = str;
|
}
|
|
if (new_time <= 0) {
|
gcore.Timer.del("mvp_close_timer");
|
this.ctrl.openFinishView(false, this.fight_type);
|
}
|
}.bind(this);
|
|
gcore.Timer.set(call_back, 1000, -1, "mvp_close_timer");
|
},
|
// 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了
|
openRootWnd: function openRootWnd() {},
|
// 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
|
closeCallBack: function closeCallBack() {
|
this.root_wnd.stopAllActions();
|
this.main_container.stopAllActions();
|
gcore.Timer.del("mvp_close_timer");
|
gcore.Timer.del("mvp_progress_timer");
|
|
require("hero_controller").getInstance().openEquipTips(false);
|
|
require("tips_controller").getInstance().closeAllTips();
|
|
if (this.fight_type == BattleConst.Fight_Type.Darma) {
|
gcore.GlobalEvent.fire(BattleEvent.MOVE_DRAMA_EVENT, this.fight_type);
|
}
|
|
this.handleEffect(false);
|
|
if (this.model.getBattleScene() && this.ctrl.getIsSameBattleType(this.fight_type)) {
|
this.model.result(this.data, null);
|
}
|
|
if (this.scroll_view) {
|
this.scroll_view.deleteMe();
|
this.scroll_view = null;
|
}
|
|
this.ctrl.openFinishView(false, this.fight_type);
|
gcore.Timer.set(function () {
|
gcore.GlobalEvent.fire(BattleEvent.CLOSE_RESULT_VIEW, this.fight_type);
|
}.bind(this), 200, 1);
|
}
|
});
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxiYXR0bGVcXHZpZXdcXGJhdHRsZV9tdnBfd2luZG93LmpzIl0sIm5hbWVzIjpbIlBhdGhUb29sIiwicmVxdWlyZSIsIkJhdHRsZUNvbnN0IiwiUGxheWVySGVhZCIsIlJvbGVDb250cm9sbGVyIiwiQmF0dGxlQ29udHJvbGxlciIsIkJhdHRsZUV2ZW50IiwiQ29tbW9uU2Nyb2xsVmlldyIsIkJhdHRsZURyYW1hSG9va1Jld2FyZExpc3RQYW5lbCIsIkJhdHRsZV9tdnBXaW5kb3ciLCJjYyIsIkNsYXNzIiwiQmFzZVZpZXciLCJjdG9yIiwicHJlZmFiUGF0aCIsImdldFByZWZhYlBhdGgiLCJ2aWV3VGFnIiwiU0NFTkVfVEFHIiwiZGlhbG9ndWUiLCJ3aW5fdHlwZSIsIldpblR5cGUiLCJNaW5pIiwiZGF0YSIsImFyZ3VtZW50cyIsInJlc3VsdCIsInJld2FyZF9saXN0IiwiaXRlbV9yZXdhcmRzIiwiZmlnaHRfdHlwZSIsImNvbWJhdF90eXBlIiwiRmlnaHRfVHlwZSIsIkRhcm1hIiwicGFydG5lcl9iaWQiLCJwYXJ0bmVyX2h1cnQiLCJwYXJ0bmVyX3RvdGFsX2h1cnQiLCJyb2xlX2V4cCIsImV4cCIsInJvbGVfbHYiLCJsZXYiLCJyb2xlX25vd2x2IiwibmV3X2xldiIsInJvbGVfbm93ZXhwIiwibmV3X2V4cCIsInVzZV9za2luIiwiaW5pdENvbmZpZyIsImFuaV9pc292ZXIiLCJpdGVtX2xpc3QiLCJyb2xlX3ZvIiwiZ2V0SW5zdGFuY2UiLCJnZXRSb2xlVm8iLCJjdHJsIiwibW9kZWwiLCJnZXRNb2RlbCIsIm9wZW5DYWxsQmFjayIsIm1haW5fY29udGFpbmVyIiwic2Vla0NoaWxkIiwiekluZGV4IiwiY29udGFpbmVyU2l6ZSIsImdldENvbnRlbnRTaXplIiwiYmFja2dyb3VuZCIsInJvb3Rfd25kIiwiZ2V0Q2hpbGRCeU5hbWUiLCJzY2FsZSIsIkZJVF9TQ0FMRSIsImF1dG9fY29tYmF0X251bV9sYiIsIkxhYmVsIiwibm9kZSIsImFjdGl2ZSIsInRpbWVfbGFiZWxfcnQiLCJSaWNoVGV4dCIsInN0cmluZyIsIlV0aWxzIiwiVEkxOE4iLCJjb21maXJtX2J0biIsImhhcm1fYnRuIiwibmV4dCIsInNwZWNpYWxfc2siLCJzcCIsIlNrZWxldG9uIiwicHJvZ3Jlc3NfYmdfbmQiLCJzcHJpdGVfNF9uZCIsInByb2dyZXNzX3BiIiwiUHJvZ3Jlc3NCYXIiLCJwcm9ncmVzcyIsInByb1R4dF9sYiIsImRlbGF5UnVuIiwic2hvd1Byb2dyZXNzRWZmZWN0IiwiYmluZCIsInNwXzIiLCJoZWFkX2ljb24iLCJzZXRQYXJlbnQiLCJzaG93Iiwic2V0U2NhbGUiLCJzZXRQb3NpdGlvbiIsInNldEhlYWRSZXMiLCJmYWNlX2lkIiwicm9sZUx2VHh0X2xiIiwianMiLCJmb3JtYXRTdHIiLCJwYXJ0bmVyX2NvbmZpZyIsIkNvbmZpZyIsInBhcnRuZXJfZGF0YSIsImRhdGFfcGFydG5lcl9iYXNlIiwic2tpbl9jb25maWciLCJwYXJ0bmVyX3NraW5fZGF0YSIsImRhdGFfc2tpbl9pbmZvIiwibXZwX2Nvbl9uZCIsInBpY19iZyIsImJ1c3RfaWNvbl9zcCIsIlNwcml0ZSIsInJvbGVOYW1lVHh0X2xiIiwibmFtZSIsImJ1c3RpZCIsImJ1c3RfcmVzIiwiZ2V0UGFydG5lckJ1c3RSZXMiLCJsb2FkUmVzIiwiYmdfc2YiLCJzcHJpdGVGcmFtZSIsImh1cnRUeHRfbGIiLCJodXJ0UGVyY2VudCIsIk1hdGgiLCJmbG9vciIsImNlaWwiLCJOdW1iZXIiLCJoYW5kbGVFZmZlY3QiLCJzY3JvbGxfY29uX25kIiwidGFiX3NpemUiLCJzZXR0aW5nIiwiaXRlbV9jbGFzcyIsInN0YXJ0X3giLCJzcGFjZV94Iiwic3RhcnRfeSIsInNwYWNlX3kiLCJpdGVtX3dpZHRoIiwiaXRlbV9oZWlnaHQiLCJyb3ciLCJjb2wiLCJuZWVkX2R5bmFtaWMiLCJzY3JvbGxfdmlldyIsImNyZWF0ZVNjcm9sbCIsInYyIiwiU2Nyb2xsVmlld0RpciIsInZlcnRpY2FsIiwiU2Nyb2xsVmlld1N0YXJ0UG9zIiwidG9wIiwicmV3YXJkVmlld1VJIiwicmVnaXN0ZXJFdmVudCIsIm9uVG91Y2hFbmQiLCJvcGVuRmluaXNoVmlldyIsIm9wZW5CYXR0bGVIYXJtSW5mb1ZpZXciLCJiYXNlQ3VyTWF4RXhwIiwicm9sZV9kYXRhIiwiZGF0YV9yb2xlX2F0dHIiLCJleHBfbWF4IiwiYmFzZVBlcmNlbnQiLCJtYXhQZXJjZW50IiwiYXV0b19udW0iLCJjYWxsX2JhY2siLCJnY29yZSIsIlRpbWVyIiwiZGVsIiwicHJvZ3Jlc3NFZmZlY3QiLCJyZXMiLCJnZXRFZmZlY3RSZXMiLCJyZXNfb2JqZWN0Iiwic2tlbGV0b25EYXRhIiwic2V0QW5pbWF0aW9uIiwiUGxheWVyQWN0aW9uIiwiYWN0aW9uIiwic2V0Iiwic3RhdHVzIiwic2V0VG9TZXR1cFBvc2UiLCJjbGVhclRyYWNrcyIsImFjdGlvbl8xIiwic2V0RGF0YSIsImlzX3Nob3dfbmFtZSIsInVwZGF0ZVRpbWVyIiwidGltZSIsIm5ld190aW1lIiwic3RyIiwib3BlblJvb3RXbmQiLCJjbG9zZUNhbGxCYWNrIiwic3RvcEFsbEFjdGlvbnMiLCJvcGVuRXF1aXBUaXBzIiwiY2xvc2VBbGxUaXBzIiwiR2xvYmFsRXZlbnQiLCJmaXJlIiwiTU9WRV9EUkFNQV9FVkVOVCIsImdldEJhdHRsZVNjZW5lIiwiZ2V0SXNTYW1lQmF0dGxlVHlwZSIsImRlbGV0ZU1lIiwiQ0xPU0VfUkVTVUxUX1ZJRVciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUEsUUFBUSxHQUFHQyxPQUFPLENBQUMsVUFBRCxDQUF0Qjs7QUFDQSxJQUFJQyxXQUFXLEdBQUdELE9BQU8sQ0FBQyxjQUFELENBQXpCOztBQUNBLElBQUlFLFVBQVUsR0FBR0YsT0FBTyxDQUFDLFlBQUQsQ0FBeEI7O0FBQ0EsSUFBSUcsY0FBYyxHQUFHSCxPQUFPLENBQUMsaUJBQUQsQ0FBNUI7O0FBQ0Es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eEYsSUFBTCxDQUFVa0csY0FBVixDQUF5QixLQUF6QixFQUFnQyxLQUFLeEgsVUFBckM7QUFDQWtJLElBQUFBLEtBQUssQ0FBQ0MsS0FBTixDQUFZVSxHQUFaLENBQWdCLFlBQVc7QUFDdkJYLE1BQUFBLEtBQUssQ0FBQzJCLFdBQU4sQ0FBa0JDLElBQWxCLENBQXVCbkwsV0FBVyxDQUFDd0wsaUJBQW5DLEVBQXNELEtBQUtuSyxVQUEzRDtBQUNILEtBRmUsQ0FFZDJELElBRmMsQ0FFVCxJQUZTLENBQWhCLEVBRWMsR0FGZCxFQUVtQixDQUZuQjtBQUlIO0FBcFMyQixDQUFULENBQXZCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAg6L+Z6YeM5piv5o+P6L+w6L+Z5Liq56qX5L2T55qE5L2c55So55qEXG4vLyA8YnIvPkNyZWF0ZTogMjAxOS0wMy0yMiAxMTo1NzoxMVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBQYXRoVG9vbCA9IHJlcXVpcmUoXCJwYXRodG9vbFwiKTtcbnZhciBCYXR0bGVDb25zdCA9IHJlcXVpcmUoXCJiYXR0bGVfY29uc3RcIik7XG52YXIgUGxheWVySGVhZCA9IHJlcXVpcmUoXCJwbGF5ZXJoZWFkXCIpO1xudmFyIFJvbGVDb250cm9sbGVyID0gcmVxdWlyZShcInJvbGVfY29udHJvbGxlclwiKTtcbnZhciBCYXR0bGVDb250cm9sbGVyID0gcmVxdWlyZShcImJhdHRsZV9jb250cm9sbGVyXCIpO1xudmFyIEJhdHRsZUV2ZW50ID0gcmVxdWlyZShcImJhdHRsZV9ldmVudFwiKTtcbnZhciBDb21tb25TY3JvbGxWaWV3ID0gcmVxdWlyZShcImNvbW1vbl9zY3JvbGx2aWV3XCIpO1xudmFyIEJhdHRsZURyYW1hSG9va1Jld2FyZExpc3RQYW5lbCA9IHJlcXVpcmUoXCJiYXR0bGVfZHJhbWFfaG9va19yZXdhcmRfbGlzdF9wYW5lbFwiKTtcblxudmFyIEJhdHRsZV9tdnBXaW5kb3cgPSBjYy5DbGFzcyh7XG4gICAgZXh0ZW5kczogQmFzZVZpZXcsXG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnByZWZhYlBhdGggPSBQYXRoVG9vbC5nZXRQcmVmYWJQYXRoKFwiYmF0dGxlXCIsIFwiYmF0dGxlX212cF92aWV3XCIpO1xuICAgICAgICB0aGlzLnZpZXdUYWcgPSBTQ0VORV9UQUcuZGlhbG9ndWU7ICAgICAgICAgICAgICAgIC8v6K+l56qX5L2T5omA5bGedWnlsYLnuqcs5YWo5bGPdWnpnIDopoHlnKh1aeWxgizpnZ7lhajlsY91aeWcqGRpYWxvZ3Vl5bGCLOi/meS4quimgeazqOaEj1xuICAgICAgICB0aGlzLndpbl90eXBlID0gV2luVHlwZS5NaW5pOyAgICAgICAgICAgICAgIC8v5piv5ZCm5piv5YWo5bGP56qX5L2TICBXaW5UeXBlLkZ1bGwsIFdpblR5cGUuQmlnLCBXaW5UeXBlLk1pbmksIFdpblR5cGUuVGlwc1xuICAgICAgICB0aGlzLmRhdGEgPSBhcmd1bWVudHNbMF07XG5cbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIHRoaXMucmVzdWx0ID0gZGF0YS5yZXN1bHRcbiAgICAgICAgdGhpcy5yZXdhcmRfbGlzdCA9IGRhdGEuaXRlbV9yZXdhcmRzIHx8IHt9XG4gICAgICAgIHRoaXMuZmlnaHRfdHlwZSA9IGRhdGEuY29tYmF0X3R5cGUgfHwgQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5EYXJtYVxuICAgICAgICB0aGlzLnBhcnRuZXJfYmlkID0gZGF0YS5wYXJ0bmVyX2JpZCB8fCAwXG4gICAgICAgIHRoaXMucGFydG5lcl9odXJ0ID0gZGF0YS5wYXJ0bmVyX2h1cnQgfHwgMFxuICAgICAgICB0aGlzLnBhcnRuZXJfdG90YWxfaHVydCA9IGRhdGEucGFydG5lcl90b3RhbF9odXJ0IHx8IDBcbiAgICAgICAgdGhpcy5yb2xlX2V4cCA9IGRhdGEuZXhwIHx8IDBcbiAgICAgICAgdGhpcy5yb2xlX2x2ID0gZGF0YS5sZXYgfHwgMVxuICAgICAgICB0aGlzLnJvbGVfbm93bHYgPSBkYXRhLm5ld19sZXYgfHwgMVxuICAgICAgICB0aGlzLnJvbGVfbm93ZXhwID0gZGF0YS5uZXdfZXhwIHx8IDA7XG4gICAgICAgIHRoaXMudXNlX3NraW4gPSBkYXRhLnVzZV9za2luIHx8IDA7XG4gICAgfSxcblxuICAgIC8vIOWIneWni+WMluS4gOS6m+mFjee9ruaVsOaNrizlj6/ku6XnlKjkuo7lo7DmmI7kuIDkupvlj5jph4/kuYvnsbvnmoRcbiAgICBpbml0Q29uZmlnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYW5pX2lzb3ZlciA9IGZhbHNlXG4gICAgICAgIHRoaXMuaXRlbV9saXN0ID0ge31cblxuICAgICAgICB0aGlzLnJvbGVfdm8gPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpO1xuICAgICAgICB0aGlzLmN0cmwgPSBCYXR0bGVDb250cm9sbGVyLmdldEluc3RhbmNlKCk7XG4gICAgICAgIHRoaXMubW9kZWwgPSB0aGlzLmN0cmwuZ2V0TW9kZWwoKTtcbiAgICB9LFxuXG4gICAgLy8g6aKE5Yi25L2T5Yqg6L295a6M5oiQ5LmL5ZCO55qE5Zue6LCDLOWPr+S7peWcqOi/memHjOaNleiOt+ebuOWFs+iKgueCueaIluiAhee7hOS7tlxuICAgIG9wZW5DYWxsQmFjazogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm1haW5fY29udGFpbmVyID0gdGhpcy5zZWVrQ2hpbGQoXCJjb250YWluZXJcIik7XG4gICAgICAgIHRoaXMubWFpbl9jb250YWluZXIuekluZGV4ID0gMTtcbiAgICAgICAgdGhpcy5jb250YWluZXJTaXplID0gdGhpcy5tYWluX2NvbnRhaW5lci5nZXRDb250ZW50U2l6ZSgpO1xuXG4gICAgICAgIHRoaXMuYmFja2dyb3VuZCA9IHRoaXMucm9vdF93bmQuZ2V0Q2hpbGRCeU5hbWUoXCJiYWNrZ3JvdW5kXCIpO1xuICAgICAgICB0aGlzLmJhY2tncm91bmQuc2NhbGUgPSBGSVRfU0NBTEU7XG5cbiAgICAgICAgdGhpcy5hdXRvX2NvbWJhdF9udW1fbGIgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fY29udGFpbmVyLCBcImF1dG9fY29tYmF0X251bVwiLCBjYy5MYWJlbCk7XG4gICAgICAgIHRoaXMuYXV0b19jb21iYXRfbnVtX2xiLm5vZGUuYWN0aXZlID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5zZWVrQ2hpbGQoXCJwaWNfbXZwXCIpLnpJbmRleCA9IDE7XG5cbiAgICAgICAgdGhpcy50aW1lX2xhYmVsX3J0ID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJ0aW1lX2xhYmVsXCIsIGNjLlJpY2hUZXh0KTtcbiAgICAgICAgdGhpcy50aW1lX2xhYmVsX3J0LnN0cmluZyA9IFV0aWxzLlRJMThOKFwiNeenkuWQjuWFs+mXrVwiKTtcbiAgICAgICAgdGhpcy50aW1lX2xhYmVsX3J0Lm5vZGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29tZmlybV9idG4gPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fY29udGFpbmVyLCBcImNvbWZpcm1fYnRuXCIpO1xuICAgICAgICB0aGlzLmhhcm1fYnRuID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJoYXJtX2J0blwiKTtcblxuICAgICAgICBpZiAodGhpcy5kYXRhICYmIFV0aWxzLm5leHQodGhpcy5kYXRhKSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmhhcm1fYnRuLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhcm1fYnRuLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zcGVjaWFsX3NrID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJwbGF5X2VmZmVjdFwiLCBzcC5Ta2VsZXRvbik7XG5cblxuICAgICAgICAvL+i/m+W6puadoVxuICAgICAgICB0aGlzLnByb2dyZXNzX2JnX25kID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJzcHJpdGVfM1wiKTtcbiAgICAgICAgdGhpcy5zcHJpdGVfNF9uZCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMubWFpbl9jb250YWluZXIsIFwic3ByaXRlXzRcIik7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3NfcGIgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fY29udGFpbmVyLCBcInNwcml0ZV8zXCIsIGNjLlByb2dyZXNzQmFyKTtcbiAgICAgICAgdGhpcy5wcm9ncmVzc19wYi5wcm9ncmVzcyA9IDA7XG4gICAgICAgIHRoaXMucHJvVHh0X2xiID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJwcm9UeHRcIiwgY2MuTGFiZWwpO1xuICAgICAgICB0aGlzLnByb2dyZXNzX2JnX25kLmFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgICAgIC8v5bu26L+fMC4z56eS5pi+56S66L+b5bqm5p2h5Yqo55S7XG4gICAgICAgIFV0aWxzLmRlbGF5UnVuKHRoaXMucm9vdF93bmQsIDAuMywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5zaG93UHJvZ3Jlc3NFZmZlY3QoKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKVxuXG4gICAgICAgIC8v5aS05YOPXG4gICAgICAgIHZhciBzcF8yID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJzcHJpdGVfMlwiKTtcbiAgICAgICAgdGhpcy5oZWFkX2ljb24gPSBuZXcgUGxheWVySGVhZCgpO1xuICAgICAgICB0aGlzLmhlYWRfaWNvbi5zZXRQYXJlbnQoc3BfMik7XG4gICAgICAgIHRoaXMuaGVhZF9pY29uLnNob3coKTtcbiAgICAgICAgdGhpcy5oZWFkX2ljb24uc2V0U2NhbGUoMC44KTtcbiAgICAgICAgdGhpcy5oZWFkX2ljb24uc2V0UG9zaXRpb24oMCwgMCk7XG4gICAgICAgIHRoaXMuaGVhZF9pY29uLnNldEhlYWRSZXModGhpcy5yb2xlX3ZvLmZhY2VfaWQpO1xuXG4gICAgICAgIC8v562J57qnXG4gICAgICAgIHRoaXMucm9sZUx2VHh0X2xiID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJyb2xlTHZUeHRcIiwgY2MuTGFiZWwpO1xuICAgICAgICB0aGlzLnJvbGVMdlR4dF9sYi5zdHJpbmcgPSBjYy5qcy5mb3JtYXRTdHIoXCJMdi4lZFwiLCB0aGlzLnJvbGVfbm93bHYpO1xuXG4gICAgICAgIHZhciBwYXJ0bmVyX2NvbmZpZyA9IENvbmZpZy5wYXJ0bmVyX2RhdGEuZGF0YV9wYXJ0bmVyX2Jhc2VbdGhpcy5wYXJ0bmVyX2JpZF07XG4gICAgICAgIGxldCBza2luX2NvbmZpZyA9IENvbmZpZy5wYXJ0bmVyX3NraW5fZGF0YS5kYXRhX3NraW5faW5mb1t0aGlzLnVzZV9za2luXTtcblxuICAgICAgICB0aGlzLm12cF9jb25fbmQgPSB0aGlzLnNlZWtDaGlsZChcIm12cF9jb25cIik7XG5cbiAgICAgICAgLy/lkI3np7Dlkoznq4vnu5hcbiAgICAgICAgdmFyIHBpY19iZyA9IHRoaXMuc2Vla0NoaWxkKHRoaXMubXZwX2Nvbl9uZCwgXCJwaWNfYmdcIik7XG4gICAgICAgIHRoaXMuYnVzdF9pY29uX3NwID0gdGhpcy5zZWVrQ2hpbGQoXCJidXN0SWNvblwiLCBjYy5TcHJpdGUpO1xuICAgICAgICBwaWNfYmcuekluZGV4ID0gMTtcbiAgICAgICAgdGhpcy5yb2xlTmFtZVR4dF9sYiA9IHRoaXMuc2Vla0NoaWxkKHBpY19iZywgXCJyb2xlTmFtZVR4dFwiLCBjYy5MYWJlbCk7XG4gICAgICAgIGlmIChwYXJ0bmVyX2NvbmZpZykge1xuICAgICAgICAgICAgdGhpcy5yb2xlTmFtZVR4dF9sYi5zdHJpbmcgPSBwYXJ0bmVyX2NvbmZpZy5uYW1lO1xuICAgICAgICAgICAgdmFyIGJ1c3RpZCA9IG51bGw7XG4gICAgICAgICAgICBpZihza2luX2NvbmZpZyl7XG4gICAgICAgICAgICAgICAgYnVzdGlkID0gc2tpbl9jb25maWcuYnVzdGlkO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgYnVzdGlkID0gcGFydG5lcl9jb25maWcuYnVzdGlkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgYnVzdF9yZXMgPSBQYXRoVG9vbC5nZXRQYXJ0bmVyQnVzdFJlcyhidXN0aWQpO1xuICAgICAgICAgICAgdGhpcy5sb2FkUmVzKGJ1c3RfcmVzLCBmdW5jdGlvbiAoYmdfc2YpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1c3RfaWNvbl9zcC5zcHJpdGVGcmFtZSA9IGJnX3NmO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8v5Lyk5a6z6L6T5Ye6XG4gICAgICAgIHZhciBodXJ0VHh0X2xiID0gdGhpcy5zZWVrQ2hpbGQocGljX2JnLCBcImh1cnRUeHRcIiwgY2MuTGFiZWwpO1xuICAgICAgICB2YXIgaHVydFBlcmNlbnQgPSBjYy5qcy5mb3JtYXRTdHIoXCIlc1wiLCBNYXRoLmZsb29yKHRoaXMucGFydG5lcl9odXJ0IC8gdGhpcy5wYXJ0bmVyX3RvdGFsX2h1cnQgKiAxMDApKSArIFwiJVwiO1xuICAgICAgICBodXJ0VHh0X2xiLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihcIiVkKCVzKVwiLCBNYXRoLmNlaWwoTnVtYmVyKHRoaXMucGFydG5lcl9odXJ0KSksIGh1cnRQZXJjZW50KTtcblxuICAgICAgICAvL+aYvuekuueJueaViFxuICAgICAgICB0aGlzLmhhbmRsZUVmZmVjdCh0cnVlKTtcblxuICAgICAgICB0aGlzLnNjcm9sbF9jb25fbmQgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fY29udGFpbmVyLCBcInNjcm9sbF9jb25cIik7XG4gICAgICAgIHZhciB0YWJfc2l6ZSA9IHRoaXMuc2Nyb2xsX2Nvbl9uZC5nZXRDb250ZW50U2l6ZSgpO1xuICAgICAgICB2YXIgc2V0dGluZyA9IHtcbiAgICAgICAgICAgIGl0ZW1fY2xhc3M6IEJhdHRsZURyYW1hSG9va1Jld2FyZExpc3RQYW5lbCwgICAgICAvLyDljZXlhYPnsbtcbiAgICAgICAgICAgIHN0YXJ0X3g6IDk0LCAgICAgICAgICAgICAgICAgICAgLy8g56ys5LiA5Liq5Y2V5YWD55qEWOi1t+eCuVxuICAgICAgICAgICAgc3BhY2VfeDogMjAsICAgICAgICAgICAgICAgICAgICAvLyB45pa55ZCR55qE6Ze06ZqUXG4gICAgICAgICAgICBzdGFydF95OiAwLCAgICAgICAgICAgICAgICAgICAgLy8g56ys5LiA5Liq5Y2V5YWD55qEWei1t+eCuVxuICAgICAgICAgICAgc3BhY2VfeTogMCwgICAgICAgICAgICAgICAgICAgLy8geeaWueWQkeeahOmXtOmalFxuICAgICAgICAgICAgaXRlbV93aWR0aDogMTIwLCAgICAgICAgICAgICAgIC8vIOWNleWFg+eahOWwuuWvuHdpZHRoXG4gICAgICAgICAgICBpdGVtX2hlaWdodDogMTgwLCAgICAgICAgICAgICAgLy8g5Y2V5YWD55qE5bC65a+4aGVpZ2h0XG4gICAgICAgICAgICByb3c6IDEsICAgICAgICAgICAgICAgICAgICAgICAgLy8g6KGM5pWw77yM5L2c55So5LqO5rC05bmz5rua5Yqo57G75Z6LXG4gICAgICAgICAgICBjb2w6IDQsICAgICAgICAgICAgICAgICAgICAgICAgLy8g5YiX5pWw77yM5L2c55So5LqO5Z6C55u05rua5Yqo57G75Z6LXG4gICAgICAgICAgICBuZWVkX2R5bmFtaWM6IHRydWVcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNjcm9sbF92aWV3ID0gbmV3IENvbW1vblNjcm9sbFZpZXcoKTtcbiAgICAgICAgdGhpcy5zY3JvbGxfdmlldy5jcmVhdGVTY3JvbGwodGhpcy5zY3JvbGxfY29uX25kLCBjYy52MigwLCAwKSwgU2Nyb2xsVmlld0Rpci52ZXJ0aWNhbCwgU2Nyb2xsVmlld1N0YXJ0UG9zLnRvcCwgdGFiX3NpemUsIHNldHRpbmcsIGNjLnYyKDAuNSwgMC41KSlcbiAgICAgICAgdGhpcy5yZXdhcmRWaWV3VUkoKTtcbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM5LqL5Lu255uR5ZCs55qE5o6l5Y+jLOS4jemcgOimgeaJi+WKqOiwg+eUqCzlpoLmnpzmmK/kvb/nlKhnY29yZS5HbG9iYWxFdmVudOebkeWQrCzlj6/ku6Xnm7TmjqXosIPnlKhhZGRHbG9iYWxFdmVudFxuICAgIHJlZ2lzdGVyRXZlbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLmNvbWZpcm1fYnRuLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hbmlfaXNvdmVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5GaW5pc2hWaWV3KGZhbHNlLCB0aGlzLmZpZ2h0X3R5cGUpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKSwgMSlcbiAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLmhhcm1fYnRuLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhICYmIFV0aWxzLm5leHQodGhpcy5kYXRhKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5CYXR0bGVIYXJtSW5mb1ZpZXcodHJ1ZSwgdGhpcy5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfS5iaW5kKHRoaXMpLCAxKVxuICAgIH0sXG5cbiAgICBzaG93UHJvZ3Jlc3NFZmZlY3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJhc2VDdXJNYXhFeHAgPSBDb25maWcucm9sZV9kYXRhLmRhdGFfcm9sZV9hdHRyW3RoaXMucm9sZV9sdl0uZXhwX21heDtcbiAgICAgICAgdmFyIGJhc2VQZXJjZW50ID0gdGhpcy5yb2xlX2V4cCAvIGJhc2VDdXJNYXhFeHA7XG4gICAgICAgIHZhciBtYXhQZXJjZW50ID0gdGhpcy5yb2xlX25vd2V4cCAvIGJhc2VDdXJNYXhFeHA7XG4gICAgICAgIGlmICh0aGlzLnJvbGVfbHYgIT0gdGhpcy5yb2xlX25vd2x2KSB7Ly/mnInljYfnuqdcbiAgICAgICAgICAgIG1heFBlcmNlbnQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRhdGEuYXV0b19udW0gJiYgdGhpcy5kYXRhLmF1dG9fbnVtID4gMCkge1xuICAgICAgICAgICAgdGhpcy5hdXRvX2NvbWJhdF9udW1fbGIubm9kZS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5hdXRvX2NvbWJhdF9udW1fbGIuc3RyaW5nID0gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwi5bey6L+e57ut6YCa6L+H5YWz5Y2h5pWw77yaJXNcIiksIHRoaXMuZGF0YS5hdXRvX251bSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnByb2dyZXNzX3BiLnByb2dyZXNzID0gYmFzZVBlcmNlbnQ7XG4gICAgICAgIHRoaXMucHJvVHh0X2xiLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihcIiVkLyVkXCIsIE51bWJlcih0aGlzLnJvbGVfZXhwKSwgTnVtYmVyKGJhc2VDdXJNYXhFeHApKTtcbiAgICAgICAgdGhpcy5wcm9ncmVzc19iZ19uZC5hY3RpdmUgPSB0cnVlO1xuXG4gICAgICAgIHZhciBjYWxsX2JhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBiYXNlUGVyY2VudCA9IGJhc2VQZXJjZW50ICsgMC4wMTtcbiAgICAgICAgICAgIGlmIChiYXNlUGVyY2VudCA+IG1heFBlcmNlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yb2xlX2x2ID09IHRoaXMucm9sZV9ub3dsdikge1xuICAgICAgICAgICAgICAgICAgICBiYXNlQ3VyTWF4RXhwID0gQ29uZmlnLnJvbGVfZGF0YS5kYXRhX3JvbGVfYXR0clt0aGlzLnJvbGVfbm93bHZdLmV4cF9tYXg7XG4gICAgICAgICAgICAgICAgICAgIGJhc2VQZXJjZW50ID0gdGhpcy5yb2xlX25vd2V4cCAvIGJhc2VDdXJNYXhFeHA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NfcGIucHJvZ3Jlc3MgPSBiYXNlUGVyY2VudDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9UeHRfbGIuc3RyaW5nID0gY2MuanMuZm9ybWF0U3RyKFwiJWQvJWRcIiwgdGhpcy5yb2xlX25vd2V4cCwgTnVtYmVyKGJhc2VDdXJNYXhFeHApKVxuICAgICAgICAgICAgICAgICAgICBnY29yZS5UaW1lci5kZWwoXCJtdnBfcHJvZ3Jlc3NfdGltZXJcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy/mkq3mlL7ljYfnuqfnibnmlYhcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvZ3Jlc3NFZmZlY3QgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9ncmVzc0VmZmVjdCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuc3ByaXRlXzRfbmQsIFwiZWZmZWN0XCIsIHNwLlNrZWxldG9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXMgPSBjYy5qcy5mb3JtYXRTdHIoXCJzcGluZS8lcy9hY3Rpb24uYXRsYXNcIiwgUGF0aFRvb2wuZ2V0RWZmZWN0UmVzKDI3NSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkUmVzKHJlcywgZnVuY3Rpb24gKHJlc19vYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2dyZXNzRWZmZWN0LnNrZWxldG9uRGF0YSA9IHJlc19vYmplY3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9ncmVzc0VmZmVjdC5zZXRBbmltYXRpb24oMCwgUGxheWVyQWN0aW9uLmFjdGlvbiwgZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2dyZXNzRWZmZWN0LnNldEFuaW1hdGlvbigwLCBQbGF5ZXJBY3Rpb24uYWN0aW9uLCBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvbGVfbHYgPSB0aGlzLnJvbGVfbHYgKyAxO1xuICAgICAgICAgICAgICAgICAgICBiYXNlUGVyY2VudCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIG1heFBlcmNlbnQgPSAxO1xuICAgICAgICAgICAgICAgICAgICBiYXNlQ3VyTWF4RXhwID0gQ29uZmlnLnJvbGVfZGF0YS5kYXRhX3JvbGVfYXR0clt0aGlzLnJvbGVfbHZdLmV4cF9tYXg7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvbGVfbHYgPT0gdGhpcy5yb2xlX25vd2x2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhQZXJjZW50ID0gdGhpcy5yb2xlX25vd2V4cCAvIENvbmZpZy5yb2xlX2RhdGEuZGF0YV9yb2xlX2F0dHJbdGhpcy5yb2xlX25vd2x2XS5leHBfbWF4O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2dyZXNzX3BiLnByb2dyZXNzID0gYmFzZVBlcmNlbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9UeHRfbGIuc3RyaW5nID0gY2MuanMuZm9ybWF0U3RyKFwiJWQvJWRcIiwgTWF0aC5jZWlsKGJhc2VDdXJNYXhFeHAgKiBiYXNlUGVyY2VudCksIE51bWJlcihiYXNlQ3VyTWF4RXhwKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgIGdjb3JlLlRpbWVyLnNldChjYWxsX2JhY2ssIDEwLCAtMSwgXCJtdnBfcHJvZ3Jlc3NfdGltZXJcIik7XG4gICAgfSxcblxuICAgIGhhbmRsZUVmZmVjdDogZnVuY3Rpb24gKHN0YXR1cykge1xuICAgICAgICBpZiAoc3RhdHVzID09IGZhbHNlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zcGVjaWFsX3NrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zcGVjaWFsX3NrLnNldFRvU2V0dXBQb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zcGVjaWFsX3NrLmNsZWFyVHJhY2tzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zcGVjaWFsX3NrLm5vZGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9ncmVzc0VmZmVjdCkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NFZmZlY3Quc2V0VG9TZXR1cFBvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2dyZXNzRWZmZWN0LmNsZWFyVHJhY2tzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9ncmVzc0VmZmVjdC5ub2RlLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3BlY2lhbF9zaykge1xuICAgICAgICAgICAgICAgIHRoaXMuc3BlY2lhbF9zay5ub2RlLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdmFyIHJlcyA9IGNjLmpzLmZvcm1hdFN0cihcInNwaW5lLyVzL2FjdGlvbi5hdGxhc1wiLCBQYXRoVG9vbC5nZXRFZmZlY3RSZXMoMjc0KSlcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRSZXMocmVzLCBmdW5jdGlvbiAocmVzX29iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNwZWNpYWxfc2suc2tlbGV0b25EYXRhID0gcmVzX29iamVjdDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGVjaWFsX3NrLnNldEFuaW1hdGlvbigxLCBQbGF5ZXJBY3Rpb24uYWN0aW9uXzEsIGZhbHNlKVxuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+WlluWKseeVjOmdolxuICAgIHJld2FyZFZpZXdVSTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMucmV3YXJkX2xpc3QpIHJldHVyblxuICAgICAgICB0aGlzLnNjcm9sbF92aWV3LnNldERhdGEodGhpcy5yZXdhcmRfbGlzdCwgbnVsbCwgeyBpc19zaG93X25hbWU6IHRydWUgfSk7XG5cbiAgICAgICAgVXRpbHMuZGVsYXlSdW4odGhpcy5tYWluX2NvbnRhaW5lciwgMC41LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmFuaV9pc292ZXIgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUaW1lcigpO1xuICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgfSxcblxuICAgIHVwZGF0ZVRpbWVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudGltZV9sYWJlbF9ydC5ub2RlLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIHRoaXMuY29tZmlybV9idG4uYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgdmFyIHRpbWUgPSA1O1xuICAgICAgICB2YXIgY2FsbF9iYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGltZSA9IHRpbWUgLSAxXG4gICAgICAgICAgICB2YXIgbmV3X3RpbWUgPSBNYXRoLmNlaWwodGltZSk7XG4gICAgICAgICAgICB2YXIgc3RyID0gbmV3X3RpbWUgKyBVdGlscy5USTE4TihcIuenkuWQjuWFs+mXrVwiKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnRpbWVfbGFiZWxfcnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVfbGFiZWxfcnQuc3RyaW5nID0gc3RyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5ld190aW1lIDw9IDApIHtcbiAgICAgICAgICAgICAgICBnY29yZS5UaW1lci5kZWwoXCJtdnBfY2xvc2VfdGltZXJcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5GaW5pc2hWaWV3KGZhbHNlLCB0aGlzLmZpZ2h0X3R5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgZ2NvcmUuVGltZXIuc2V0KGNhbGxfYmFjaywgMTAwMCwgLTEsIFwibXZwX2Nsb3NlX3RpbWVyXCIpO1xuICAgIH0sXG5cbiAgICAvLyDpooTliLbkvZPliqDovb3lrozmiJDkuYvlkI4s5re75Yqg5Yiw5a+55bqU5Li76IqC54K55LmL5ZCO55qE5Zue6LCDLOS5n+WwseaYr+S4gOS4queql+S9k+eahOato+W8j+WFpeWPoyzlj6/ku6Xorr7nva7kuIDkupvmlbDmja7kuoZcbiAgICBvcGVuUm9vdFduZDogZnVuY3Rpb24gKCkge1xuXG4gICAgfSxcblxuICAgIC8vIOWFs+mXreeql+S9k+WbnuiwgyzpnIDopoHlnKjov5nph4zosIPnlKjor6XnqpfkvZPmiYDlsZ5jb250cm9sbGVy55qEY2xvc2Xmlrnms5XmsqHnlKjkuo7nva7nqbror6XnqpfkvZPlrp7kvovlr7nosaFcbiAgICBjbG9zZUNhbGxCYWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucm9vdF93bmQuc3RvcEFsbEFjdGlvbnMoKTtcbiAgICAgICAgdGhpcy5tYWluX2NvbnRhaW5lci5zdG9wQWxsQWN0aW9ucygpO1xuXG4gICAgICAgIGdjb3JlLlRpbWVyLmRlbChcIm12cF9jbG9zZV90aW1lclwiKTtcbiAgICAgICAgZ2NvcmUuVGltZXIuZGVsKFwibXZwX3Byb2dyZXNzX3RpbWVyXCIpO1xuICAgICAgICByZXF1aXJlKFwiaGVyb19jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3BlbkVxdWlwVGlwcyhmYWxzZSlcbiAgICAgICAgcmVxdWlyZShcInRpcHNfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLmNsb3NlQWxsVGlwcygpO1xuICAgICAgICBcblxuICAgICAgICBpZiAodGhpcy5maWdodF90eXBlID09IEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuRGFybWEpIHtcbiAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoQmF0dGxlRXZlbnQuTU9WRV9EUkFNQV9FVkVOVCwgdGhpcy5maWdodF90eXBlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhhbmRsZUVmZmVjdChmYWxzZSlcbiAgICAgICAgaWYgKHRoaXMubW9kZWwuZ2V0QmF0dGxlU2NlbmUoKSAmJiB0aGlzLmN0cmwuZ2V0SXNTYW1lQmF0dGxlVHlwZSh0aGlzLmZpZ2h0X3R5cGUpKSB7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLnJlc3VsdCh0aGlzLmRhdGEsIG51bGwpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsX3ZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsX3ZpZXcuZGVsZXRlTWUoKTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsX3ZpZXcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3RybC5vcGVuRmluaXNoVmlldyhmYWxzZSwgdGhpcy5maWdodF90eXBlKVxuICAgICAgICBnY29yZS5UaW1lci5zZXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEJhdHRsZUV2ZW50LkNMT1NFX1JFU1VMVF9WSUVXLCB0aGlzLmZpZ2h0X3R5cGUpO1xuICAgICAgICB9LmJpbmQodGhpcyksIDIwMCwgMSlcbiAgICAgICBcbiAgICB9LFxufSkiXX0=
|