|
(function() {
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
var __module = nodeEnv ? module : {exports:{}};
|
var __filename = 'preview-scripts/assets/Scripts/mod/guide/view/task_guide_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, 'f400dE4DSJL9a6LH1XJW6Eq', 'task_guide_window');
|
// Scripts/mod/guide/view/task_guide_window.js
|
|
"use strict";
|
|
// --------------------------------------------------------------------
|
// @author: xxx@syg.com(必填, 创建模块的人员)
|
// @description:
|
// 这里是描述这个窗体的作用的
|
// <br/>Create: 2019-08-16 17:09:17
|
// --------------------------------------------------------------------
|
var PathTool = require("pathtool"); // var HallowsEvent = require("hallows_event");
|
|
|
var GuideController = require("guide_controller");
|
|
var GuideConst = require("guide_const");
|
|
var GuideEvent = require("guide_event"); // var HallowsController = require("hallows_controller");
|
|
|
var TaskEvent = require("task_event");
|
|
var TaskController = require("task_controller");
|
|
var Task_guideWindow = cc.Class({
|
"extends": BaseView,
|
ctor: function ctor() {
|
this.prefabPath = PathTool.getPrefabPath("drama", "task_guide_view");
|
this.viewTag = SCENE_TAG.msg; //该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意
|
// this.win_type = WinType.Full; //是否是全屏窗体 WinType.Full, WinType.Big, WinType.Mini, WinType.Tips
|
},
|
// 初始化一些配置数据,可以用于声明一些变量之类的
|
initConfig: function initConfig() {
|
this.ctrl = GuideController.getInstance();
|
this.model = this.ctrl.getModel(); // this.hallow_ctrl = HallowsController.getInstance();
|
// this.hallow_model = this.hallow_ctrl.getModel();
|
|
this.task_ctrl = TaskController.getInstance();
|
this.task_model = this.task_ctrl.getModel();
|
this.step = 0; //步数0开始,对应数组第0个
|
|
this.timer_hander = null;
|
},
|
// 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件
|
openCallBack: function openCallBack() {
|
if (game.views_js) game.views_js.cancelTouch();
|
this.root_wg = this.root_wnd.getComponent(cc.Widget);
|
|
if (window.FIT_SCALE > 1) {
|
this.root_wg.isAlignTop = true;
|
this.root_wg.isAlignBottom = true;
|
}
|
|
this.background_nd = this.seekChild("background");
|
this.clip_con_nd = this.seekChild("clip_con");
|
this.effect_con_nd = this.seekChild("effect_con");
|
this.effect_con_sk = this.seekChild("effect_con", sp.Skeleton); // this.handleEffect(true);
|
},
|
// 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
|
registerEvent: function registerEvent() {
|
//界面点击,触发下一步特效
|
this.addGlobalEvent(GuideEvent.TaskNextStep, function (data) {
|
// cc.log(data, this.target_name)
|
// if (this.root_name == "summonshow" && data == "confirm_btn") {
|
// this.effect_con_nd.active = false;
|
// }
|
// if (this.target_name) {
|
// if (this.target_name == data) {
|
// this.step += 1;
|
// this.findRootWndByCondition();
|
// } else {
|
// this.handleEffect(false);
|
// }
|
// } else {
|
// this.handleEffect(false);
|
// }
|
if (data == "quick_btn" || data == "quick_add_btn" || data == "compound_btn") {
|
if (this.target_name == data) {
|
this.step += 1;
|
this.findRootWndByCondition();
|
} else {
|
this.handleEffect(false);
|
}
|
}
|
|
if (data == "challenge_btn") {
|
if (this.target_name == data) {
|
// this.findRootWndByCondition();
|
this.root_name = this.target_data[this.step + 1][0];
|
} else {
|
this.handleEffect(false);
|
}
|
}
|
}, this); //界面关闭,取消特效
|
|
this.addGlobalEvent(GuideEvent.CloseTaskEffect, function () {
|
this.handleEffect(false);
|
this.model.setTaskGuideLastPos(null);
|
this.step = 10;
|
window.TASK_TIPS = false;
|
}, this); // this.addGlobalEvent(HallowsEvent.UpdateHallowsTaskEvent, function () {
|
// if (this.config && this.effect_con_nd){
|
// this.effect_con_nd.active = this.hallow_model.getHallowsTaks(this.config.id).finish < 1;
|
// window.TASK_TIPS = this.effect_con_nd.active;
|
// }
|
// }, this)
|
|
this.addGlobalEvent(TaskEvent.UpdateMainQuestTask, function (data) {
|
if (this.config && this.effect_con_nd) {
|
this.effect_con_nd.active = data.finish < 1;
|
window.TASK_TIPS = this.effect_con_nd.active;
|
}
|
}, this);
|
this.addGlobalEvent(GuideEvent.OpenTaskEffect, function (node) {
|
// if (node == this.target_data[this.step + 1][0]) {
|
// cc.log("node",node)
|
// } else {
|
// this.handleEffect(false);
|
// this.model.setTaskGuideLastPos(null);
|
// this.step = 10;
|
// window.TASK_TIPS = false;
|
// }
|
if (node.task_tips) {
|
this.target_root_wnd = node;
|
this.effect_con_nd.active = false;
|
this.step += 1;
|
this.findTargetNode();
|
return;
|
}
|
|
if (node.name == "guide_main_view" || window.TASK_TIPS == false || node.name == "arena_loop_match_window") return;
|
if (this.root_name == "forge_house_window" || this.root_name == "guildboss_main_window") return;
|
this.target_root_wnd = node;
|
this.effect_con_nd.active = false;
|
this.step += 1;
|
|
if (node.name == "battle_drama_reward_window") {
|
this.step = 0;
|
}
|
|
this.findTargetNode();
|
}, this);
|
},
|
// 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了
|
openRootWnd: function openRootWnd(config) {
|
this.config = config;
|
this.target_data = config.drama_eff;
|
cc.log("target", this.target_data);
|
this.step = 0;
|
this.model.setTaskGuideLastPos(null);
|
if (this.timer_hander) this.removeTimer();
|
this.getTaskTipsEffectNd();
|
this.findRootWndByCondition();
|
},
|
setVisibleStatus: function setVisibleStatus(status, config) {
|
this.setVisible(status);
|
this.model.setTaskGuideLastPos(null); // this.handleEffect(status);
|
|
if (this.timer_hander) this.removeTimer();
|
this.config = config;
|
this.target_data = config.drama_eff;
|
cc.log("target", this.target_data);
|
this.step = 0;
|
this.getTaskTipsEffectNd();
|
this.findRootWndByCondition();
|
},
|
getTaskTipsEffectNd: function getTaskTipsEffectNd() {
|
var node = require("mainui_controller").getInstance().getTaskTipsPanel();
|
|
this.target = this.seekChild(node, "main");
|
this.drawTargetRect();
|
},
|
//手指特效显示
|
handleEffect: function handleEffect(status) {
|
if (status == false) {
|
if (this.effect_con_sk) {
|
this.effect_con_sk.setToSetupPose();
|
this.effect_con_sk.clearTracks();
|
}
|
} else {
|
if (this.effect_con_sk) {
|
var eff_res = PathTool.getEffectRes(240);
|
var eff_path = PathTool.getSpinePath(eff_res);
|
this.loadRes(eff_path, function (res_object) {
|
this.effect_con_sk.skeletonData = res_object;
|
this.effect_con_sk.setAnimation(0, PlayerAction.action_1, true);
|
}.bind(this));
|
}
|
}
|
},
|
findRootWndByCondition: function findRootWndByCondition(num) {
|
if (this.effect_con_nd.active) {
|
this.effect_con_nd.active = false;
|
}
|
|
if (!this.target_data || !this.target_data[0]) {
|
window.TASK_TIPS = false;
|
return;
|
}
|
|
if (this.target_data[this.step] == null) {
|
this.handleEffect(false);
|
window.TASK_TIPS = false;
|
return;
|
}
|
|
var root_name = this.target_data[this.step][0];
|
cc.log(root_name);
|
this.root_name = root_name;
|
var root_wnd = null;
|
|
if (root_name == "partner") {
|
var HeroController = require("hero_controller");
|
|
root_wnd = HeroController.getInstance().getHeroBagRoot();
|
} else if (root_name == "battletopscene") {
|
var BattleController = require("battle_controller");
|
|
root_wnd = BattleController.getInstance().getDramaFightUI();
|
} else if (root_name == "battlesceneview") {
|
var BattleController = require("battle_controller");
|
|
root_wnd = BattleController.getInstance().getCtrlBattleScene();
|
} else if (root_name == "adventurescene") {
|
root_wnd = AdventureController.getInstance().getAdventureRoot();
|
} else if (root_name == "partnerform") {
|
root_wnd = HeroController.getInstance().getHeroFormRoot();
|
} else if (root_name == "partnereinfoview") {
|
var HeroController = require("hero_controller");
|
|
root_wnd = HeroController.getInstance().getHeroMianInfoRoot();
|
} else if (root_name == "partnergofight") {
|
var HeroController = require("hero_controller");
|
|
root_wnd = HeroController.getInstance().getHeroGoFightRoot();
|
} else if (root_name == "adventureevtview") {
|
root_wnd = AdventureController.getInstance().getAdventureEvtRoot();
|
} else if (root_name == "esecsiceview") {
|
var EsecsiceController = require("esecsice_controller");
|
|
root_wnd = EsecsiceController.getInstance().getEsecsiceRoot();
|
} else if (root_name == "stonedunview") {
|
var Stone_dungeonController = require("stone_dungeon_controller");
|
|
root_wnd = Stone_dungeonController.getInstance().getStoneDungeonRoot();
|
} else if (root_name == "varietystoreview") {
|
var MallController = require("mall_controller");
|
|
root_wnd = MallController.getInstance().getVarietyStoreRoot();
|
} else if (root_name == "summon") {
|
var PartnersummonController = require("partnersummon_controller");
|
|
root_wnd = PartnersummonController.getInstance().getSummonItemRoot();
|
} else if (root_name == "summonshow") {
|
var PartnersummonController = require("partnersummon_controller");
|
|
root_wnd = PartnersummonController.getInstance().getSummonShowRoot();
|
} else if (root_name == "summonresult") {
|
var PartnersummonController = require("partnersummon_controller");
|
|
root_wnd = PartnersummonController.getInstance().getSummonResultRoot();
|
} else if (root_name == "arenaloopview") {
|
var ArenaController = require("arena_controller");
|
|
root_wnd = ArenaController.getInstance().getArenaRoot();
|
} else if (root_name == "voyageview") {
|
var VoyageController = require("voyage_controller");
|
|
root_wnd = VoyageController.getInstance().getVoyageMainRoot();
|
} else if (root_name == "voyagedispatchview") {
|
var VoyageController = require("voyage_controller");
|
|
root_wnd = VoyageController.getInstance().getVoyageDispatchRoot();
|
} else if (root_name == "forge_house_window") {
|
var ForgeController = require("forgehouse_controller");
|
|
root_wnd = ForgeController.getInstance().getForgeHouseRoot();
|
} else if (root_name == "forge_artifact_panel") {
|
var ForgeController = require("forgehouse_controller");
|
|
root_wnd = ForgeController.getInstance().getForgeArtifactRoot();
|
} else if (root_name == "guild_main_window") {
|
var GuildController = require("guild_controller");
|
|
root_wnd = GuildController.getInstance().getGuildMainRootWnd();
|
} else if (root_name == "guildboss_main_window") {
|
var GuildController = require("guildboss_controller");
|
|
root_wnd = GuildController.getInstance().getGuildBossMainRootWnd();
|
} else if (root_name == "battle_drama_reward_window") {
|
var BattleDramaController = require("battle_drama_controller");
|
|
root_wnd = BattleDramaController.getInstance().getDramaBattlePassRewardRoot();
|
} else if (root_name == "backpack_window_3") {
|
var BackpackController = require("backpack_controller");
|
|
root_wnd = BackpackController.getInstance().getBackpackRoot();
|
} else if (root_name == "backpack_comp_tips_window") {
|
var TipsController = require("tips_controller");
|
|
root_wnd = TipsController.getInstance().getCompTipsRoot();
|
}
|
|
this.target_root_wnd = root_wnd; // this.findTargetNode();
|
|
if (this.target_root_wnd) {
|
gcore.Timer.set(function () {
|
this.findTargetNode();
|
}.bind(this), 50, 1);
|
if (this.timer_hander) this.removeTimer();
|
} else {
|
if (!this.timer_hander) {
|
this.effect_con_nd.active = false;
|
this.timer_hander = this.startUpdate(10, this.findRootWndByCondition.bind(this), 300);
|
}
|
}
|
|
if (num && num >= 10) {
|
this.effect_con_nd.active = false;
|
this.step = 10;
|
window.TASK_TIPS = false;
|
}
|
},
|
delayPlayNextGuide: function delayPlayNextGuide(delay_time) {
|
if (this.hasTicket("delayPlayNextGuide")) {
|
this.delTicker("delayPlayNextGuide");
|
}
|
|
this.addTicket(this.findTargetNode.bind(this), delay_time, "delayPlayNextGuide");
|
},
|
removeTimer: function removeTimer() {
|
if (this.timer_hander) {
|
this.stopUpdate(this.timer_hander);
|
this.time_num = 0;
|
this.timer_hander = null;
|
}
|
},
|
//寻找目标界面的子节点
|
findTargetNode: function findTargetNode(num) {
|
if (!this.target_data[this.step]) {
|
this.effect_con_nd.active = false;
|
window.TASK_TIPS = false;
|
return;
|
}
|
|
var target_name = this.target_data[this.step][1];
|
var real_name = GuideConst.NodeKeys[target_name];
|
var name_info = GuideConst.getNameInfo(target_name);
|
if (!real_name) real_name = target_name;
|
|
if (name_info && name_info.length == 2) {
|
if (name_info[0] == "tag") {
|
this.target = this.seekChildByTag(this.target_root_wnd, name_info[1]);
|
this.target_name = name_info[1];
|
}
|
} else {
|
if (this.target_data[this.step][0] == "arenaloopview") {
|
this.target = this.seekChildByTag(this.target_root_wnd, real_name);
|
} else if (this.target_data[this.step][0] == "forge_house_window" && real_name == "tab_btn_2") {
|
var top = this.seekChild(this.target_root_wnd, "top_container");
|
this.target = this.seekChild(top, real_name);
|
} else {
|
this.target = this.seekChild(this.target_root_wnd, real_name);
|
}
|
|
this.target_name = real_name;
|
}
|
|
cc.log("targe", this.target);
|
|
if (this.target) {
|
this.removeTimer();
|
this.drawTargetRect();
|
} else {
|
if (!this.timer_hander) {
|
this.time_num = 0;
|
this.timer_hander = this.startUpdate(6, this.findTargetNode.bind(this), 1000);
|
} //
|
// return
|
|
}
|
|
if (num && num >= 5) {
|
this.removeTimer();
|
this.effect_con_nd.active = false;
|
this.model.setTaskGuideLastPos(null);
|
window.TASK_TIPS = false; // this.endPlayGuide(true);
|
}
|
},
|
drawTargetRect: function drawTargetRect() {
|
if (this.target) {
|
this.clip_con_nd.active = true;
|
this.effect_con_nd.active = true; // this.background_bi.enabled = false;
|
|
var target_pos_1 = this.target.convertToWorldSpaceAR(cc.v2(0, 0));
|
var target_pos = this.root_wnd.convertToNodeSpaceAR(target_pos_1);
|
if (target_pos.y < target_pos_1.y) target_pos.y = target_pos_1.y;
|
var final_posX = target_pos.x + (0.5 - this.target.anchorX) * this.target.width;
|
var final_posY = target_pos.y + (0.5 - this.target.anchorY) * this.target.height;
|
var final_pos = cc.v2(final_posX, final_posY);
|
cc.log(final_pos);
|
this.clip_con_nd.position = final_pos;
|
this.clip_con_nd.width = this.target.width;
|
this.clip_con_nd.height = this.target.height;
|
this.show_guide_step = true;
|
|
if (this.show_guide_step) {
|
// 显示手指
|
var last_pos = this.model.getTaskGuideLastPos(); // 显示手指
|
|
var action_name = PlayerAction.action_1;
|
if (last_pos) action_name = PlayerAction.action_2;
|
var eff_res = PathTool.getEffectRes(240);
|
var eff_path = PathTool.getSpinePath(eff_res);
|
this.loadRes(eff_path, function (action_name, eff_sd) {
|
this.effect_con_sk.skeletonData = eff_sd;
|
this.effect_con_sk.setAnimation(0, action_name, true);
|
}.bind(this, action_name));
|
this.effect_con_nd.stopAllActions();
|
|
if (last_pos) {
|
var move_dis = this.calDistanch(final_pos, last_pos);
|
var time = move_dis / GuideConst.Finger_Speed;
|
var call_func = cc.callFunc(function () {
|
this.effect_con_sk.setAnimation(0, PlayerAction.action_1, true);
|
this.finish_action = true;
|
}, this);
|
var move_act = cc.moveTo(time, final_pos);
|
var act_queqe = cc.sequence(move_act, call_func);
|
this.effect_con_nd.runAction(act_queqe);
|
this.finish_action = false;
|
} else {
|
this.effect_con_nd.position = final_pos;
|
}
|
}
|
|
this.model.setTaskGuideLastPos(final_pos);
|
}
|
},
|
calDistanch: function calDistanch(pos1, pos2) {
|
return Math.sqrt(Math.pow(pos1.x - pos2.x, 2) + Math.pow(pos1.y - pos2.y, 2));
|
},
|
playNextGuide: function playNextGuide() {
|
this.saveGuideStep();
|
|
if (!this.act_list || this.act_list.length == 0) {
|
this.endPlayGuide();
|
} else {
|
this.target_data = this.act_list.shift();
|
this.guide_step = this.guide_step + 1;
|
cc.log("当前步骤的数据");
|
cc.log(this.target_data); // 判断当前步骤是否已经做过了,
|
|
if (this.guide_cache_data[this.act_config.id] && this.guide_cache_data[this.act_config.id][this.guide_step] && !this.cur_zone_list[this.guide_step]) {
|
this.playNextGuide();
|
} else {
|
if (this.target_data) {
|
this.findRootWndByCondition();
|
}
|
}
|
}
|
},
|
endPlayGuide: function endPlayGuide(is_skip) {
|
cc.log("结束当前引导---" + this.act_config.id);
|
this.step = 0;
|
if (this.model) this.model.setTaskGuideLastPos(null);
|
},
|
saveGuideStep: function saveGuideStep() {// if (this.config && this.config.over_step && this.config.over_step == this.guide_step) {
|
// if (!this.guide_cache_data[this.config.id])
|
// this.guide_cache_data[this.config.id] = {}
|
// this.guide_cache_data[this.config.id][this.config.over_step] = true;
|
// var RoleController = require("role_controller")
|
// var role_vo = RoleController.getInstance().getRoleVo();
|
// cc.sys.localStorage.setItem("task_guide_data" + role_vo.srv_id + role_vo.rid, JSON.stringify(this.guide_cache_data));
|
// }
|
},
|
getEffectActive: function getEffectActive() {
|
if (this.effect_con_nd) {
|
return this.effect_con_nd.active;
|
}
|
|
return false;
|
},
|
// 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
|
closeCallBack: function closeCallBack() {
|
this.removeTimer();
|
this.ctrl.openTaskGuideWindow(false);
|
}
|
});
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxndWlkZVxcdmlld1xcdGFza19ndWlkZV93aW5kb3cuanMiXSwibmFtZXMiOlsiUGF0aFRvb2wiLCJyZXF1aXJlIiwiR3VpZGVDb250cm9sbGVyIiwiR3VpZGVDb25zdCIsIkd1aWRlRXZlbnQiLCJUYXNrRXZlbnQiLCJUYXNrQ29udHJvbGxlciIsIlRhc2tfZ3VpZGVXaW5kb3ciLCJjYyIsIkNsYXNzIiwiQmFzZVZpZXciLCJjdG9yIiwicHJlZmFiUGF0aCIsImdldFByZWZhYlBhdGgiLCJ2aWV3VGFnIiwiU0NFTkVfVEFHIiwibXNnIiwiaW5pdENvbmZpZyIsImN0cmwiLCJnZXRJbnN0YW5jZSIsIm1vZGVsIiwiZ2V0TW9kZWwiLCJ0YXNrX2N0cmwiLCJ0YXNrX21vZGVsIiwic3RlcCIsInRpbWVyX2hhbmRlciIsIm9wZW5DYWxsQmFjayIsImdhbWUiLCJ2aWV3c19qcyIsImNhbmNlbFRvdWNoIiwicm9vdF93ZyIsInJvb3Rfd25kIiwiZ2V0Q29tcG9uZW50IiwiV2lkZ2V0Iiwid2luZG93IiwiRklUX1NDQUxFIiwiaXNBbGlnblRvcCIsImlzQWxpZ25Cb3R0b20iLCJiYWNrZ3JvdW5kX25kIiwic2Vla0NoaWxkIiwiY2xpcF9jb25fbmQiLCJlZmZlY3RfY29uX25kIiwiZWZmZWN0X2Nvbl9zayIsInNwIiwiU2tlbGV0b24iLCJyZWdpc3RlckV2ZW50IiwiYWRkR2xvYmFsRXZlbnQiLCJUYXNrTmV4dFN0ZXAiLCJkYXRhIiwidGFyZ2V0X25hbWUiLCJmaW5kUm9vdFduZEJ5Q29uZGl0aW9uIiwiaGFuZGxlRWZmZWN0Iiwicm9vdF9uYW1lIiwidGFyZ2V0X2RhdGEiLCJDbG9zZVRhc2tFZmZlY3QiLCJzZXRUYXNrR3VpZGVMYXN0UG9zIiwiVEFTS19USVBTIiwiVXBkYXRlTWFpblF1ZXN0VGFzayIsImNvbmZpZyIsImFjdGl2ZSIsImZpbmlzaCIsIk9wZW5UYXNrRWZmZWN0Iiwibm9kZSIsInRhc2tfdGlwcyIsInRhcmdldF9yb290X3duZCIsImZpbmRUYXJnZXROb2RlIiwibmFtZSIsIm9wZW5Sb290V25kIiwiZHJhbWFfZWZmIiwibG9nIiwicmVtb3ZlVGltZXIiLCJnZXRUYXNrVGlwc0VmZmVjdE5kIiwic2V0VmlzaWJsZVN0YXR1cyIsInN0YXR1cyIsInNldFZpc2libGUiLCJnZXRUYXNrVGlwc1BhbmVsIiwidGFyZ2V0IiwiZHJhd1RhcmdldFJlY3QiLCJzZXRUb1NldHVwUG9zZSIsImNsZWFyVHJhY2tzIiwiZWZmX3JlcyIsImdldEVmZmVjdFJlcyIsImVmZl9wYXRoIiwiZ2V0U3BpbmVQYXRoIiwibG9hZFJlcyIsInJlc19vYmplY3QiLCJza2VsZXRvbkRhdGEiLCJzZXRBbmltYXRpb24iLCJQbGF5ZXJBY3Rpb24iLCJhY3Rpb25fMSIsImJpbmQiLCJudW0iLCJIZXJvQ29udHJvbGxlciIsImdldEhlcm9CYWdSb290IiwiQmF0dGxlQ29udHJvbGxlciIsImdldERyYW1hRmlnaHRVSSIsImdldEN0cmxCYXR0bGVTY2VuZSIsIkFkdmVudHVyZUNvbnRyb2xsZXIiLCJnZXRBZHZlbnR1cmVSb290IiwiZ2V0SGVyb0Zvcm1Sb290IiwiZ2V0SGVyb01pYW5JbmZvUm9vdCIsImdldEhlcm9Hb0ZpZ2h0Um9vdCIsImdldEFkdmVudHVyZUV2dFJvb3QiLCJFc2Vjc2ljZUNvbnRyb2xsZXIiLCJnZXRFc2Vjc2ljZVJvb3QiLCJTdG9uZV9kdW5nZW9uQ29udHJvbGxlciIsImdldFN0b25lRHVuZ2VvblJvb3QiLCJNYWxsQ29udHJvbGxlciIsImdldFZhcmlldHlTdG9yZVJvb3QiLCJQYXJ0bmVyc3VtbW9uQ29udHJvbGxlciIsImdldFN1bW1vbkl0ZW1Sb290IiwiZ2V0U3VtbW9uU2hvd1Jvb3QiLCJnZXRTdW1tb25SZXN1bHRSb290IiwiQXJlbmFDb250cm9sbGVyIiwiZ2V0QXJlbmFSb290IiwiVm95YWdlQ29udHJvbGxlciIsImdldFZveWFnZU1haW5Sb290IiwiZ2V0Vm95YWdlRGlzcGF0Y2hSb290IiwiRm9yZ2VDb250cm9sbGVyIiwiZ2V0Rm9yZ2VIb3VzZVJvb3QiLCJnZXRGb3JnZUFydGlmYWN0Um9vdCIsIkd1aWxkQ29udHJvbGxlciIsImdldEd1aWxkTWFpblJvb3RXbmQiLCJnZXRHdWlsZEJvc3NNYWluUm9vdFduZCIsIkJhdHRsZURyYW1hQ29udHJvbGxlciIsImdldERyYW1hQmF0dGxlUGFzc1Jld2FyZFJvb3QiLCJCYWNrcGFja0NvbnRyb2xsZXIiLCJnZXRCYWNrcGFja1Jvb3QiLCJUaXBzQ29udHJvbGxlciIsImdldENvbXBUaXBzUm9vdCIsImdjb3JlIiwiVGltZXIiLCJzZXQiLCJzdGFydFVwZGF0ZSIsImRlbGF5UGxheU5leHRHdWlkZSIsImRlbGF5X3RpbWUiLCJoYXNUaWNrZXQiLCJkZWxUaWNrZXIiLCJhZGRUaWNrZXQiLCJzdG9wVXBkYXRlIiwidGltZV9udW0iLCJyZWFsX25hbWUiLCJOb2RlS2V5cyIsIm5hbWVfaW5mbyIsImdldE5hbWVJbmZvIiwibGVuZ3RoIiwic2Vla0NoaWxkQnlUYWciLCJ0b3AiLCJ0YXJnZXRfcG9zXzEiLCJjb252ZXJ0VG9Xb3JsZFNwYWNlQVIiLCJ2MiIsInRhcmdldF9wb3MiLCJjb252ZXJ0VG9Ob2RlU3BhY2VBUiIsInkiLCJmaW5hbF9wb3NYIiwieCIsImFuY2hvclgiLCJ3aWR0aCIsImZpbmFsX3Bvc1kiLCJhbmNob3JZIiwiaGVpZ2h0IiwiZmluYWxfcG9zIiwicG9zaXRpb24iLCJzaG93X2d1aWRlX3N0ZXAiLCJsYXN0X3BvcyIsImdldFRhc2tHdWlkZUxhc3RQb3MiLCJhY3Rpb25fbmFtZSIsImFjdGlvbl8yIiwiZWZmX3NkIiwic3RvcEFsbEFjdGlvbnMiLCJtb3ZlX2RpcyIsImNhbERpc3RhbmNoIiwidGltZSIsIkZpbmdlcl9TcGVlZCIsImNhbGxfZnVuYyIsImNhbGxGdW5jIiwiZmluaXNoX2FjdGlvbiIsIm1vdmVfYWN0IiwibW92ZVRvIiwiYWN0X3F1ZXFlIiwic2VxdWVuY2UiLCJydW5BY3Rpb24iLCJwb3MxIiwicG9zMiIsIk1hdGgiLCJzcXJ0IiwicG93IiwicGxheU5leHRHdWlkZSIsInNhdmVHdWlkZVN0ZXAiLCJhY3RfbGlzdCIsImVuZFBsYXlHdWlkZSIsInNoaWZ0IiwiZ3VpZGVfc3RlcCIsImd1aWRlX2NhY2hlX2RhdGEiLCJhY3RfY29uZmlnIiwiaWQiLCJjdXJfem9uZV9saXN0IiwiaXNfc2tpcCIsImdldEVmZmVjdEFjdGl2ZSIsImNsb3NlQ2FsbEJhY2siLCJvcGVuVGFza0d1aWRlV2luZG93Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLFFBQVEsR0FBR0MsT0FBTyxDQUFDLFVBQUQsQ0FBdEIsRUFDQTs7O0FBQ0EsSUFBSUMsZUFBZSxHQUFHRCxPQUFPLENBQUMsa0JBQUQsQ0FBN0I7O0FBQ0EsSUFBSUUsVUFBVSxHQUFHRixPQUFPLENBQUMsYUFBRCxDQUF4Qjs7QUFDQSxJQUFJRyxVQUFVLEdBQUdILE9BQU8sQ0FBQyxhQUFELENBQXhCLEVBQ0E7OztBQUNBLElBQUlJLFNBQVMsR0FBR0osT0FBTyxDQUFDLFlBQUQsQ0FBdkI7O0FBQ0EsSUFBSUssY0FBYyxHQUFHTCxPQUFPLENBQUMsaUJBQUQsQ0FBNUI7O0FBRUEsSUFBSU0sZ0JBQWdCLEdBQUdDLEVBQUUsQ0FBQ0MsS0FBSCxDQUFTO0FBQzVCLGFBQVNDLFFBRG1CO0FBRTVCQyxFQUFBQSxJQUFJLEVBQUUsZ0JBQVk7QUFDZCxTQUFLQyxVQUFMLEdBQWtCWixRQUFRLENBQUNhLGFBQVQsQ0FBdUIsT0FBdkIsRUFBZ0MsaUJBQWhDLENBQWxCO0FBQ0EsU0FBS0MsT0FBTCxHQUFlQyxTQUFTLENBQUNDLEdBQXpCLENBRmMsQ0FFK0I7QUFDN0M7QUFDSCxHQU4yQjtBQVE1QjtBQUNBQyxFQUFBQSxVQUFVLEVBQUUsc0JBQVk7QUFDcEIsU0FBS0MsSUFBTCxHQUFZaEIsZUFBZSxDQUFDaUIsV0FBaEIsRUFBWjtBQUNBLFNBQUtDLEtBQUwsR0FBYSxLQUFLRixJQUFMLENBQVVHLFFBQVYs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LEVBQUUseUJBQVksQ0FDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNILEdBL2MyQjtBQWlkNUJVLEVBQUFBLGVBQWUsRUFBRSwyQkFBWTtBQUN6QixRQUFJLEtBQUs3SixhQUFULEVBQXdCO0FBQ3BCLGFBQU8sS0FBS0EsYUFBTCxDQUFtQmtCLE1BQTFCO0FBQ0g7O0FBQ0QsV0FBTyxLQUFQO0FBQ0gsR0F0ZDJCO0FBd2Q1QjtBQUNBNEksRUFBQUEsYUFBYSxFQUFFLHlCQUFZO0FBRXZCLFNBQUtqSSxXQUFMO0FBQ0EsU0FBS3BELElBQUwsQ0FBVXNMLG1CQUFWLENBQThCLEtBQTlCO0FBQ0g7QUE3ZDJCLENBQVQsQ0FBdkIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBAYXV0aG9yOiB4eHhAc3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcbi8vIEBkZXNjcmlwdGlvbjpcbi8vICAgICDov5nph4zmmK/mj4/ov7Dov5nkuKrnqpfkvZPnmoTkvZznlKjnmoRcbi8vIDxici8+Q3JlYXRlOiAyMDE5LTA4LTE2IDE3OjA5OjE3XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIFBhdGhUb29sID0gcmVxdWlyZShcInBhdGh0b29sXCIpO1xuLy8gdmFyIEhhbGxvd3NFdmVudCA9IHJlcXVpcmUoXCJoYWxsb3dzX2V2ZW50XCIpO1xudmFyIEd1aWRlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJndWlkZV9jb250cm9sbGVyXCIpO1xudmFyIEd1aWRlQ29uc3QgPSByZXF1aXJlKFwiZ3VpZGVfY29uc3RcIik7XG52YXIgR3VpZGVFdmVudCA9IHJlcXVpcmUoXCJndWlkZV9ldmVudFwiKTtcbi8vIHZhciBIYWxsb3dzQ29udHJvbGxlciA9IHJlcXVpcmUoXCJoYWxsb3dzX2NvbnRyb2xsZXJcIik7XG52YXIgVGFza0V2ZW50ID0gcmVxdWlyZShcInRhc2tfZXZlbnRcIik7XG52YXIgVGFza0NvbnRyb2xsZXIgPSByZXF1aXJlKFwidGFza19jb250cm9sbGVyXCIpO1xuXG52YXIgVGFza19ndWlkZVdpbmRvdyA9IGNjLkNsYXNzKHtcbiAgICBleHRlbmRzOiBCYXNlVmlldyxcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucHJlZmFiUGF0aCA9IFBhdGhUb29sLmdldFByZWZhYlBhdGgoXCJkcmFtYVwiLCBcInRhc2tfZ3VpZGVfdmlld1wiKTtcbiAgICAgICAgdGhpcy52aWV3VGFnID0gU0NFTkVfVEFHLm1zZzsgICAgICAgICAgICAgICAgLy/or6XnqpfkvZPmiYDlsZ51aeWxgue6pyzlhajlsY91aemcgOimgeWcqHVp5bGCLOmdnuWFqOWxj3Vp5ZyoZGlhbG9ndWXlsYIs6L+Z5Liq6KaB5rOo5oSPXG4gICAgICAgIC8vIHRoaXMud2luX3R5cGUgPSBXaW5UeXBlLkZ1bGw7ICAgICAgICAgICAgICAgLy/mmK/lkKbmmK/lhajlsY/nqpfkvZMgIFdpblR5cGUuRnVsbCwgV2luVHlwZS5CaWcsIFdpblR5cGUuTWluaSwgV2luVHlwZS5UaXBzXG4gICAgfSxcblxuICAgIC8vIOWIneWni+WMluS4gOS6m+mFjee9ruaVsOaNrizlj6/ku6XnlKjkuo7lo7DmmI7kuIDkupvlj5jph4/kuYvnsbvnmoRcbiAgICBpbml0Q29uZmlnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY3RybCA9IEd1aWRlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpO1xuICAgICAgICB0aGlzLm1vZGVsID0gdGhpcy5jdHJsLmdldE1vZGVsKCk7XG4gICAgICAgIC8vIHRoaXMuaGFsbG93X2N0cmwgPSBIYWxsb3dzQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpO1xuICAgICAgICAvLyB0aGlzLmhhbGxvd19tb2RlbCA9IHRoaXMuaGFsbG93X2N0cmwuZ2V0TW9kZWwoKTtcbiAgICAgICAgdGhpcy50YXNrX2N0cmwgPSBUYXNrQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpO1xuICAgICAgICB0aGlzLnRhc2tfbW9kZWwgPSB0aGlzLnRhc2tfY3RybC5nZXRNb2RlbCgpO1xuXG4gICAgICAgIHRoaXMuc3RlcCA9IDA7ICAvL+atpeaVsDDlvIDlp4vvvIzlr7nlupTmlbDnu4TnrKww5LiqXG4gICAgICAgIHRoaXMudGltZXJfaGFuZGVyID0gbnVsbDtcbiAgICB9LFxuXG4gICAgLy8g6aKE5Yi25L2T5Yqg6L295a6M5oiQ5LmL5ZCO55qE5Zue6LCDLOWPr+S7peWcqOi/memHjOaNleiOt+ebuOWFs+iKgueCueaIluiAhee7hOS7tlxuICAgIG9wZW5DYWxsQmFjazogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoZ2FtZS52aWV3c19qcylcbiAgICAgICAgICAgIGdhbWUudmlld3NfanMuY2FuY2VsVG91Y2goKTtcblxuICAgICAgICB0aGlzLnJvb3Rfd2cgPSB0aGlzLnJvb3Rfd25kLmdldENvbXBvbmVudChjYy5XaWRnZXQpO1xuICAgICAgICBpZiAod2luZG93LkZJVF9TQ0FMRSA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdF93Zy5pc0FsaWduVG9wID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucm9vdF93Zy5pc0FsaWduQm90dG9tID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYmFja2dyb3VuZF9uZCA9IHRoaXMuc2Vla0NoaWxkKFwiYmFja2dyb3VuZFwiKTtcbiAgICAgICAgdGhpcy5jbGlwX2Nvbl9uZCA9IHRoaXMuc2Vla0NoaWxkKFwiY2xpcF9jb25cIik7XG4gICAgICAgIHRoaXMuZWZmZWN0X2Nvbl9uZCA9IHRoaXMuc2Vla0NoaWxkKFwiZWZmZWN0X2NvblwiKTtcbiAgICAgICAgdGhpcy5lZmZlY3RfY29uX3NrID0gdGhpcy5zZWVrQ2hpbGQoXCJlZmZlY3RfY29uXCIsIHNwLlNrZWxldG9uKTtcblxuICAgICAgICAvLyB0aGlzLmhhbmRsZUVmZmVjdCh0cnVlKTtcbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM5LqL5Lu255uR5ZCs55qE5o6l5Y+jLOS4jemcgOimgeaJi+WKqOiwg+eUqCzlpoLmnpzmmK/kvb/nlKhnY29yZS5HbG9iYWxFdmVudOebkeWQrCzlj6/ku6Xnm7TmjqXosIPnlKhhZGRHbG9iYWxFdmVudFxuICAgIHJlZ2lzdGVyRXZlbnQ6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAvL+eVjOmdoueCueWHu++8jOinpuWPkeS4i+S4gOatpeeJueaViFxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEd1aWRlRXZlbnQuVGFza05leHRTdGVwLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgLy8gY2MubG9nKGRhdGEsIHRoaXMudGFyZ2V0X25hbWUpXG4gICAgICAgICAgICAvLyBpZiAodGhpcy5yb290X25hbWUgPT0gXCJzdW1tb25zaG93XCIgJiYgZGF0YSA9PSBcImNvbmZpcm1fYnRuXCIpIHtcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmVmZmVjdF9jb25fbmQuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAvLyBpZiAodGhpcy50YXJnZXRfbmFtZSkge1xuICAgICAgICAgICAgLy8gICAgIGlmICh0aGlzLnRhcmdldF9uYW1lID09IGRhdGEpIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgdGhpcy5zdGVwICs9IDE7XG4gICAgICAgICAgICAvLyAgICAgICAgIHRoaXMuZmluZFJvb3RXbmRCeUNvbmRpdGlvbigpO1xuICAgICAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyAgICAgICAgIHRoaXMuaGFuZGxlRWZmZWN0KGZhbHNlKTtcbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gICAgIHRoaXMuaGFuZGxlRWZmZWN0KGZhbHNlKTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIGlmIChkYXRhID09IFwicXVpY2tfYnRuXCIgfHwgZGF0YSA9PSBcInF1aWNrX2FkZF9idG5cIiB8fCBkYXRhID09IFwiY29tcG91bmRfYnRuXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50YXJnZXRfbmFtZSA9PSBkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RlcCArPSAxO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRSb290V25kQnlDb25kaXRpb24oKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUVmZmVjdChmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGEgPT0gXCJjaGFsbGVuZ2VfYnRuXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50YXJnZXRfbmFtZSA9PSBkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZmluZFJvb3RXbmRCeUNvbmRpdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3RfbmFtZSA9IHRoaXMudGFyZ2V0X2RhdGFbdGhpcy5zdGVwICsgMV1bMF1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUVmZmVjdChmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzKVxuXG4gICAgICAgIC8v55WM6Z2i5YWz6Zet77yM5Y+W5raI54m55pWIXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoR3VpZGVFdmVudC5DbG9zZVRhc2tFZmZlY3QsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRWZmZWN0KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2V0VGFza0d1aWRlTGFzdFBvcyhudWxsKTtcbiAgICAgICAgICAgIHRoaXMuc3RlcCA9IDEwO1xuICAgICAgICAgICAgd2luZG93LlRBU0tfVElQUyA9IGZhbHNlO1xuICAgICAgICB9LCB0aGlzKVxuIFxuICAgICAgICAvLyB0aGlzLmFkZEdsb2JhbEV2ZW50KEhhbGxvd3NFdmVudC5VcGRhdGVIYWxsb3dzVGFza0V2ZW50LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vICAgICBpZiAodGhpcy5jb25maWcgJiYgdGhpcy5lZmZlY3RfY29uX25kKXtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmVmZmVjdF9jb25fbmQuYWN0aXZlID0gdGhpcy5oYWxsb3dfbW9kZWwuZ2V0SGFsbG93c1Rha3ModGhpcy5jb25maWcuaWQpLmZpbmlzaCA8IDE7XG4gICAgICAgIC8vICAgICAgICAgd2luZG93LlRBU0tfVElQUyA9IHRoaXMuZWZmZWN0X2Nvbl9uZC5hY3RpdmU7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH0sIHRoaXMpXG5cbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChUYXNrRXZlbnQuVXBkYXRlTWFpblF1ZXN0VGFzaywgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmVmZmVjdF9jb25fbmQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVmZmVjdF9jb25fbmQuYWN0aXZlID0gZGF0YS5maW5pc2ggPCAxO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5UQVNLX1RJUFMgPSB0aGlzLmVmZmVjdF9jb25fbmQuYWN0aXZlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzKVxuXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoR3VpZGVFdmVudC5PcGVuVGFza0VmZmVjdCwgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIC8vIGlmIChub2RlID09IHRoaXMudGFyZ2V0X2RhdGFbdGhpcy5zdGVwICsgMV1bMF0pIHtcbiAgICAgICAgICAgIC8vICAgICBjYy5sb2coXCJub2RlXCIsbm9kZSlcbiAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyAgICAgdGhpcy5oYW5kbGVFZmZlY3QoZmFsc2UpO1xuICAgICAgICAgICAgLy8gICAgIHRoaXMubW9kZWwuc2V0VGFza0d1aWRlTGFzdFBvcyhudWxsKTtcbiAgICAgICAgICAgIC8vICAgICB0aGlzLnN0ZXAgPSAxMDtcbiAgICAgICAgICAgIC8vICAgICB3aW5kb3cuVEFTS19USVBTID0gZmFsc2U7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICBpZiAobm9kZS50YXNrX3RpcHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldF9yb290X3duZCA9IG5vZGU7XG4gICAgICAgICAgICAgICAgdGhpcy5lZmZlY3RfY29uX25kLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RlcCArPSAxO1xuICAgICAgICAgICAgICAgIHRoaXMuZmluZFRhcmdldE5vZGUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlLm5hbWUgPT0gXCJndWlkZV9tYWluX3ZpZXdcIiB8fCB3aW5kb3cuVEFTS19USVBTID09IGZhbHNlIHx8IG5vZGUubmFtZSA9PSBcImFyZW5hX2xvb3BfbWF0Y2hfd2luZG93XCIpIHJldHVyblxuICAgICAgICAgICAgaWYgKHRoaXMucm9vdF9uYW1lID09IFwiZm9yZ2VfaG91c2Vfd2luZG93XCIgfHwgdGhpcy5yb290X25hbWUgPT0gXCJndWlsZGJvc3NfbWFpbl93aW5kb3dcIikgcmV0dXJuXG4gICAgICAgICAgICB0aGlzLnRhcmdldF9yb290X3duZCA9IG5vZGU7XG4gICAgICAgICAgICB0aGlzLmVmZmVjdF9jb25fbmQuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnN0ZXAgKz0gMTtcbiAgICAgICAgICAgIGlmKG5vZGUubmFtZSA9PSBcImJhdHRsZV9kcmFtYV9yZXdhcmRfd2luZG93XCIpe1xuICAgICAgICAgICAgICAgIHRoaXMuc3RlcCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZpbmRUYXJnZXROb2RlKCk7XG4gICAgICAgIH0sIHRoaXMpXG4gICAgfSxcblxuICAgIC8vIOmihOWItuS9k+WKoOi9veWujOaIkOS5i+WQjizmt7vliqDliLDlr7nlupTkuLvoioLngrnkuYvlkI7nmoTlm57osIMs5Lmf5bCx5piv5LiA5Liq56qX5L2T55qE5q2j5byP5YWl5Y+jLOWPr+S7peiuvue9ruS4gOS6m+aVsOaNruS6hlxuICAgIG9wZW5Sb290V25kOiBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLnRhcmdldF9kYXRhID0gY29uZmlnLmRyYW1hX2VmZjtcbiAgICAgICAgY2MubG9nKFwidGFyZ2V0XCIsIHRoaXMudGFyZ2V0X2RhdGEpXG4gICAgICAgIHRoaXMuc3RlcCA9IDA7XG4gICAgICAgIHRoaXMubW9kZWwuc2V0VGFza0d1aWRlTGFzdFBvcyhudWxsKTtcbiAgICAgICAgaWYgKHRoaXMudGltZXJfaGFuZGVyKVxuICAgICAgICAgICAgdGhpcy5yZW1vdmVUaW1lcigpO1xuICAgICAgICB0aGlzLmdldFRhc2tUaXBzRWZmZWN0TmQoKTtcbiAgICAgICAgdGhpcy5maW5kUm9vdFduZEJ5Q29uZGl0aW9uKCk7XG4gICAgfSxcblxuICAgIHNldFZpc2libGVTdGF0dXM6IGZ1bmN0aW9uIChzdGF0dXMsIGNvbmZpZykge1xuICAgICAgICB0aGlzLnNldFZpc2libGUoc3RhdHVzKTtcbiAgICAgICAgdGhpcy5tb2RlbC5zZXRUYXNrR3VpZGVMYXN0UG9zKG51bGwpO1xuICAgICAgICAvLyB0aGlzLmhhbmRsZUVmZmVjdChzdGF0dXMpO1xuICAgICAgICBpZiAodGhpcy50aW1lcl9oYW5kZXIpXG4gICAgICAgICAgICB0aGlzLnJlbW92ZVRpbWVyKCk7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLnRhcmdldF9kYXRhID0gY29uZmlnLmRyYW1hX2VmZjtcbiAgICAgICAgY2MubG9nKFwidGFyZ2V0XCIsIHRoaXMudGFyZ2V0X2RhdGEpO1xuICAgICAgICB0aGlzLnN0ZXAgPSAwO1xuICAgICAgICB0aGlzLmdldFRhc2tUaXBzRWZmZWN0TmQoKTtcbiAgICAgICAgdGhpcy5maW5kUm9vdFduZEJ5Q29uZGl0aW9uKCk7XG4gICAgfSxcblxuICAgIGdldFRhc2tUaXBzRWZmZWN0TmQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IG5vZGUgPSByZXF1aXJlKFwibWFpbnVpX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5nZXRUYXNrVGlwc1BhbmVsKCk7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gdGhpcy5zZWVrQ2hpbGQobm9kZSwgXCJtYWluXCIpO1xuICAgICAgICB0aGlzLmRyYXdUYXJnZXRSZWN0KCk7XG4gICAgfSxcblxuICAgIC8v5omL5oyH54m55pWI5pi+56S6XG4gICAgaGFuZGxlRWZmZWN0OiBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgICAgIGlmIChzdGF0dXMgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmVmZmVjdF9jb25fc2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVmZmVjdF9jb25fc2suc2V0VG9TZXR1cFBvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVmZmVjdF9jb25fc2suY2xlYXJUcmFja3MoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmVmZmVjdF9jb25fc2spIHtcbiAgICAgICAgICAgICAgICB2YXIgZWZmX3JlcyA9IFBhdGhUb29sLmdldEVmZmVjdFJlcygyNDApO1xuICAgICAgICAgICAgICAgIHZhciBlZmZfcGF0aCA9IFBhdGhUb29sLmdldFNwaW5lUGF0aChlZmZfcmVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRSZXMoZWZmX3BhdGgsIGZ1bmN0aW9uIChyZXNfb2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X2Nvbl9zay5za2VsZXRvbkRhdGEgPSByZXNfb2JqZWN0O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVmZmVjdF9jb25fc2suc2V0QW5pbWF0aW9uKDAsIFBsYXllckFjdGlvbi5hY3Rpb25fMSwgdHJ1ZSlcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG5cbiAgICBmaW5kUm9vdFduZEJ5Q29uZGl0aW9uOiBmdW5jdGlvbiAobnVtKSB7XG4gICAgICAgIGlmICh0aGlzLmVmZmVjdF9jb25fbmQuYWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLmVmZmVjdF9jb25fbmQuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnRhcmdldF9kYXRhIHx8ICF0aGlzLnRhcmdldF9kYXRhWzBdKSB7XG4gICAgICAgICAgICB3aW5kb3cuVEFTS19USVBTID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy50YXJnZXRfZGF0YVt0aGlzLnN0ZXBdID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRWZmZWN0KGZhbHNlKTtcbiAgICAgICAgICAgIHdpbmRvdy5UQVNLX1RJUFMgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJvb3RfbmFtZSA9IHRoaXMudGFyZ2V0X2RhdGFbdGhpcy5zdGVwXVswXTtcbiAgICAgICAgY2MubG9nKHJvb3RfbmFtZSlcbiAgICAgICAgdGhpcy5yb290X25hbWUgPSByb290X25hbWU7XG4gICAgICAgIHZhciByb290X3duZCA9IG51bGw7XG4gICAgICAgIGlmIChyb290X25hbWUgPT0gXCJwYXJ0bmVyXCIpIHtcbiAgICAgICAgICAgIHZhciBIZXJvQ29udHJvbGxlciA9IHJlcXVpcmUoXCJoZXJvX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICByb290X3duZCA9IEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0SGVyb0JhZ1Jvb3QoKVxuICAgICAgICB9IGVsc2UgaWYgKHJvb3RfbmFtZSA9PSBcImJhdHRsZXRvcHNjZW5lXCIpIHtcbiAgICAgICAgICAgIHZhciBCYXR0bGVDb250cm9sbGVyID0gcmVxdWlyZShcImJhdHRsZV9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgcm9vdF93bmQgPSBCYXR0bGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0RHJhbWFGaWdodFVJKCk7XG4gICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwiYmF0dGxlc2NlbmV2aWV3XCIpIHtcbiAgICAgICAgICAgIHZhciBCYXR0bGVDb250cm9sbGVyID0gcmVxdWlyZShcImJhdHRsZV9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgcm9vdF93bmQgPSBCYXR0bGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Q3RybEJhdHRsZVNjZW5lKClcbiAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJhZHZlbnR1cmVzY2VuZVwiKSB7XG4gICAgICAgICAgICByb290X3duZCA9IEFkdmVudHVyZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRBZHZlbnR1cmVSb290KClcbiAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJwYXJ0bmVyZm9ybVwiKSB7XG4gICAgICAgICAgICByb290X3duZCA9IEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0SGVyb0Zvcm1Sb290KClcbiAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJwYXJ0bmVyZWluZm92aWV3XCIpIHtcbiAgICAgICAgICAgIHZhciBIZXJvQ29udHJvbGxlciA9IHJlcXVpcmUoXCJoZXJvX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICByb290X3duZCA9IEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0SGVyb01pYW5JbmZvUm9vdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHJvb3RfbmFtZSA9PSBcInBhcnRuZXJnb2ZpZ2h0XCIpIHtcbiAgICAgICAgICAgIHZhciBIZXJvQ29udHJvbGxlciA9IHJlcXVpcmUoXCJoZXJvX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICByb290X3duZCA9IEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0SGVyb0dvRmlnaHRSb290KClcbiAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJhZHZlbnR1cmVldnR2aWV3XCIpIHtcbiAgICAgICAgICAgIHJvb3Rfd25kID0gQWR2ZW50dXJlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldEFkdmVudHVyZUV2dFJvb3QoKVxuICAgICAgICB9IGVsc2UgaWYgKHJvb3RfbmFtZSA9PSBcImVzZWNzaWNldmlld1wiKSB7XG4gICAgICAgICAgICB2YXIgRXNlY3NpY2VDb250cm9sbGVyID0gcmVxdWlyZShcImVzZWNzaWNlX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICByb290X3duZCA9IEVzZWNzaWNlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldEVzZWNzaWNlUm9vdCgpXG4gICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwic3RvbmVkdW52aWV3XCIpIHtcbiAgICAgICAgICAgIHZhciBTdG9uZV9kdW5nZW9uQ29udHJvbGxlciA9IHJlcXVpcmUoXCJzdG9uZV9kdW5nZW9uX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICByb290X3duZCA9IFN0b25lX2R1bmdlb25Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0U3RvbmVEdW5nZW9uUm9vdCgpXG4gICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwidmFyaWV0eXN0b3Jldmlld1wiKSB7XG4gICAgICAgICAgICB2YXIgTWFsbENvbnRyb2xsZXIgPSByZXF1aXJlKFwibWFsbF9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgcm9vdF93bmQgPSBNYWxsQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFZhcmlldHlTdG9yZVJvb3QoKVxuICAgICAgICB9IGVsc2UgaWYgKHJvb3RfbmFtZSA9PSBcInN1bW1vblwiKSB7XG4gICAgICAgICAgICB2YXIgUGFydG5lcnN1bW1vbkNvbnRyb2xsZXIgPSByZXF1aXJlKFwicGFydG5lcnN1bW1vbl9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgcm9vdF93bmQgPSBQYXJ0bmVyc3VtbW9uQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFN1bW1vbkl0ZW1Sb290KCk7XG4gICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwic3VtbW9uc2hvd1wiKSB7XG4gICAgICAgICAgICB2YXIgUGFydG5lcnN1bW1vbkNvbnRyb2xsZXIgPSByZXF1aXJlKFwicGFydG5lcnN1bW1vbl9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgcm9vdF93bmQgPSBQYXJ0bmVyc3VtbW9uQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFN1bW1vblNob3dSb290KClcbiAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJzdW1tb25yZXN1bHRcIikge1xuICAgICAgICAgICAgdmFyIFBhcnRuZXJzdW1tb25Db250cm9sbGVyID0gcmVxdWlyZShcInBhcnRuZXJzdW1tb25fY29udHJvbGxlclwiKTtcbiAgICAgICAgICAgIHJvb3Rfd25kID0gUGFydG5lcnN1bW1vbkNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRTdW1tb25SZXN1bHRSb290KClcbiAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJhcmVuYWxvb3B2aWV3XCIpIHtcbiAgICAgICAgICAgIHZhciBBcmVuYUNvbnRyb2xsZXIgPSByZXF1aXJlKFwiYXJlbmFfY29udHJvbGxlclwiKTtcbiAgICAgICAgICAgIHJvb3Rfd25kID0gQXJlbmFDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0QXJlbmFSb290KClcbiAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJ2b3lhZ2V2aWV3XCIpIHtcbiAgICAgICAgICAgIHZhciBWb3lhZ2VDb250cm9sbGVyID0gcmVxdWlyZShcInZveWFnZV9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgcm9vdF93bmQgPSBWb3lhZ2VDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Vm95YWdlTWFpblJvb3QoKVxuICAgICAgICB9IGVsc2UgaWYgKHJvb3RfbmFtZSA9PSBcInZveWFnZWRpc3BhdGNodmlld1wiKSB7XG4gICAgICAgICAgICB2YXIgVm95YWdlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJ2b3lhZ2VfY29udHJvbGxlclwiKTtcbiAgICAgICAgICAgIHJvb3Rfd25kID0gVm95YWdlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFZveWFnZURpc3BhdGNoUm9vdCgpXG4gICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwiZm9yZ2VfaG91c2Vfd2luZG93XCIpIHtcbiAgICAgICAgICAgIHZhciBGb3JnZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwiZm9yZ2Vob3VzZV9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgcm9vdF93bmQgPSBGb3JnZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRGb3JnZUhvdXNlUm9vdCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJvb3RfbmFtZSA9PSBcImZvcmdlX2FydGlmYWN0X3BhbmVsXCIpIHtcbiAgICAgICAgICAgIHZhciBGb3JnZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwiZm9yZ2Vob3VzZV9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgcm9vdF93bmQgPSBGb3JnZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRGb3JnZUFydGlmYWN0Um9vdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHJvb3RfbmFtZSA9PSBcImd1aWxkX21haW5fd2luZG93XCIpIHtcbiAgICAgICAgICAgIHZhciBHdWlsZENvbnRyb2xsZXIgPSByZXF1aXJlKFwiZ3VpbGRfY29udHJvbGxlclwiKTtcbiAgICAgICAgICAgIHJvb3Rfd25kID0gR3VpbGRDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0R3VpbGRNYWluUm9vdFduZCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHJvb3RfbmFtZSA9PSBcImd1aWxkYm9zc19tYWluX3dpbmRvd1wiKSB7XG4gICAgICAgICAgICB2YXIgR3VpbGRDb250cm9sbGVyID0gcmVxdWlyZShcImd1aWxkYm9zc19jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgcm9vdF93bmQgPSBHdWlsZENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRHdWlsZEJvc3NNYWluUm9vdFduZCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHJvb3RfbmFtZSA9PSBcImJhdHRsZV9kcmFtYV9yZXdhcmRfd2luZG93XCIpIHtcbiAgICAgICAgICAgIHZhciBCYXR0bGVEcmFtYUNvbnRyb2xsZXIgPSByZXF1aXJlKFwiYmF0dGxlX2RyYW1hX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICByb290X3duZCA9IEJhdHRsZURyYW1hQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldERyYW1hQmF0dGxlUGFzc1Jld2FyZFJvb3QoKTtcbiAgICAgICAgfVxuICAgICAgICAgZWxzZSBpZiAocm9vdF9uYW1lID09IFwiYmFja3BhY2tfd2luZG93XzNcIikge1xuICAgICAgICAgICAgdmFyIEJhY2twYWNrQ29udHJvbGxlciA9IHJlcXVpcmUoXCJiYWNrcGFja19jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgcm9vdF93bmQgPSBCYWNrcGFja0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRCYWNrcGFja1Jvb3QoKTtcbiAgICAgICAgfVxuICAgICAgICAgZWxzZSBpZiAocm9vdF9uYW1lID09IFwiYmFja3BhY2tfY29tcF90aXBzX3dpbmRvd1wiKSB7XG4gICAgICAgICAgICB2YXIgVGlwc0NvbnRyb2xsZXIgPSByZXF1aXJlKFwidGlwc19jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgcm9vdF93bmQgPSBUaXBzQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldENvbXBUaXBzUm9vdCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGFyZ2V0X3Jvb3Rfd25kID0gcm9vdF93bmQ7XG5cbiAgICAgICAgLy8gdGhpcy5maW5kVGFyZ2V0Tm9kZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLnRhcmdldF9yb290X3duZCkge1xuXG4gICAgICAgICAgICBnY29yZS5UaW1lci5zZXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmluZFRhcmdldE5vZGUoKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSwgNTAsIDEpXG4gICAgICAgICAgICBpZiAodGhpcy50aW1lcl9oYW5kZXIpXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVUaW1lcigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnRpbWVyX2hhbmRlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X2Nvbl9uZC5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVyX2hhbmRlciA9IHRoaXMuc3RhcnRVcGRhdGUoMTAsIHRoaXMuZmluZFJvb3RXbmRCeUNvbmRpdGlvbi5iaW5kKHRoaXMpLCAzMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG51bSAmJiBudW0gPj0gMTApIHtcbiAgICAgICAgICAgIHRoaXMuZWZmZWN0X2Nvbl9uZC5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc3RlcCA9IDEwO1xuICAgICAgICAgICAgd2luZG93LlRBU0tfVElQUyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGRlbGF5UGxheU5leHRHdWlkZTogZnVuY3Rpb24gKGRlbGF5X3RpbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzVGlja2V0KFwiZGVsYXlQbGF5TmV4dEd1aWRlXCIpKSB7XG4gICAgICAgICAgICB0aGlzLmRlbFRpY2tlcihcImRlbGF5UGxheU5leHRHdWlkZVwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZFRpY2tldCh0aGlzLmZpbmRUYXJnZXROb2RlLmJpbmQodGhpcyksIGRlbGF5X3RpbWUsIFwiZGVsYXlQbGF5TmV4dEd1aWRlXCIpO1xuICAgIH0sXG5cbiAgICByZW1vdmVUaW1lcjogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy50aW1lcl9oYW5kZXIpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcFVwZGF0ZSh0aGlzLnRpbWVyX2hhbmRlcik7XG4gICAgICAgICAgICB0aGlzLnRpbWVfbnVtID0gMDtcbiAgICAgICAgICAgIHRoaXMudGltZXJfaGFuZGVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+Wvu+aJvuebruagh+eVjOmdoueahOWtkOiKgueCuVxuICAgIGZpbmRUYXJnZXROb2RlOiBmdW5jdGlvbiAobnVtKSB7XG4gICAgICAgIGlmICghdGhpcy50YXJnZXRfZGF0YVt0aGlzLnN0ZXBdKSB7XG4gICAgICAgICAgICB0aGlzLmVmZmVjdF9jb25fbmQuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB3aW5kb3cuVEFTS19USVBTID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBsZXQgdGFyZ2V0X25hbWUgPSB0aGlzLnRhcmdldF9kYXRhW3RoaXMuc3RlcF1bMV07XG4gICAgICAgIHZhciByZWFsX25hbWUgPSBHdWlkZUNvbnN0Lk5vZGVLZXlzW3RhcmdldF9uYW1lXTtcbiAgICAgICAgdmFyIG5hbWVfaW5mbyA9IEd1aWRlQ29uc3QuZ2V0TmFtZUluZm8odGFyZ2V0X25hbWUpO1xuXG4gICAgICAgIGlmICghcmVhbF9uYW1lKVxuICAgICAgICAgICAgcmVhbF9uYW1lID0gdGFyZ2V0X25hbWU7XG5cbiAgICAgICAgaWYgKG5hbWVfaW5mbyAmJiBuYW1lX2luZm8ubGVuZ3RoID09IDIpIHtcbiAgICAgICAgICAgIGlmIChuYW1lX2luZm9bMF0gPT0gXCJ0YWdcIikge1xuICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0ID0gdGhpcy5zZWVrQ2hpbGRCeVRhZyh0aGlzLnRhcmdldF9yb290X3duZCwgbmFtZV9pbmZvWzFdKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldF9uYW1lID0gbmFtZV9pbmZvWzFdXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy50YXJnZXRfZGF0YVt0aGlzLnN0ZXBdWzBdID09IFwiYXJlbmFsb29wdmlld1wiICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldCA9IHRoaXMuc2Vla0NoaWxkQnlUYWcodGhpcy50YXJnZXRfcm9vdF93bmQsIHJlYWxfbmFtZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudGFyZ2V0X2RhdGFbdGhpcy5zdGVwXVswXSA9PSBcImZvcmdlX2hvdXNlX3dpbmRvd1wiICYmIHJlYWxfbmFtZSA9PSBcInRhYl9idG5fMlwiKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRvcCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMudGFyZ2V0X3Jvb3Rfd25kLCBcInRvcF9jb250YWluZXJcIilcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldCA9IHRoaXMuc2Vla0NoaWxkKHRvcCwgcmVhbF9uYW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXQgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLnRhcmdldF9yb290X3duZCwgcmVhbF9uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudGFyZ2V0X25hbWUgPSByZWFsX25hbWU7XG4gICAgICAgIH1cbiAgICAgICAgY2MubG9nKFwidGFyZ2VcIiwgdGhpcy50YXJnZXQpO1xuXG4gICAgICAgIGlmICh0aGlzLnRhcmdldCkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVUaW1lcigpO1xuICAgICAgICAgICAgdGhpcy5kcmF3VGFyZ2V0UmVjdCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnRpbWVyX2hhbmRlcikge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZV9udW0gPSAwO1xuICAgICAgICAgICAgICAgIHRoaXMudGltZXJfaGFuZGVyID0gdGhpcy5zdGFydFVwZGF0ZSg2LCB0aGlzLmZpbmRUYXJnZXROb2RlLmJpbmQodGhpcyksIDEwMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG51bSAmJiBudW0gPj0gNSkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVUaW1lcigpO1xuICAgICAgICAgICAgdGhpcy5lZmZlY3RfY29uX25kLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZXRUYXNrR3VpZGVMYXN0UG9zKG51bGwpO1xuICAgICAgICAgICAgd2luZG93LlRBU0tfVElQUyA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gdGhpcy5lbmRQbGF5R3VpZGUodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZHJhd1RhcmdldFJlY3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMudGFyZ2V0KSB7XG4gICAgICAgICAgICB0aGlzLmNsaXBfY29uX25kLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmVmZmVjdF9jb25fbmQuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIHRoaXMuYmFja2dyb3VuZF9iaS5lbmFibGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHZhciB0YXJnZXRfcG9zXzEgPSB0aGlzLnRhcmdldC5jb252ZXJ0VG9Xb3JsZFNwYWNlQVIoY2MudjIoMCwgMCkpO1xuICAgICAgICAgICAgdmFyIHRhcmdldF9wb3MgPSB0aGlzLnJvb3Rfd25kLmNvbnZlcnRUb05vZGVTcGFjZUFSKHRhcmdldF9wb3NfMSk7XG4gICAgICAgICAgICBpZiAodGFyZ2V0X3Bvcy55IDwgdGFyZ2V0X3Bvc18xLnkpXG4gICAgICAgICAgICAgICAgdGFyZ2V0X3Bvcy55ID0gdGFyZ2V0X3Bvc18xLnk7XG4gICAgICAgICAgICB2YXIgZmluYWxfcG9zWCA9IHRhcmdldF9wb3MueCArICgwLjUgLSB0aGlzLnRhcmdldC5hbmNob3JYKSAqIHRoaXMudGFyZ2V0LndpZHRoO1xuICAgICAgICAgICAgdmFyIGZpbmFsX3Bvc1kgPSB0YXJnZXRfcG9zLnkgKyAoMC41IC0gdGhpcy50YXJnZXQuYW5jaG9yWSkgKiB0aGlzLnRhcmdldC5oZWlnaHQ7XG4gICAgICAgICAgICB2YXIgZmluYWxfcG9zID0gY2MudjIoZmluYWxfcG9zWCwgZmluYWxfcG9zWSk7XG5cbiAgICAgICAgICAgIGNjLmxvZyhmaW5hbF9wb3MpO1xuXG4gICAgICAgICAgICB0aGlzLmNsaXBfY29uX25kLnBvc2l0aW9uID0gZmluYWxfcG9zO1xuICAgICAgICAgICAgdGhpcy5jbGlwX2Nvbl9uZC53aWR0aCA9IHRoaXMudGFyZ2V0LndpZHRoO1xuICAgICAgICAgICAgdGhpcy5jbGlwX2Nvbl9uZC5oZWlnaHQgPSB0aGlzLnRhcmdldC5oZWlnaHQ7XG5cbiAgICAgICAgICAgIHRoaXMuc2hvd19ndWlkZV9zdGVwID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3dfZ3VpZGVfc3RlcCkgeyAgLy8g5pi+56S65omL5oyHXG4gICAgICAgICAgICAgICAgdmFyIGxhc3RfcG9zID0gdGhpcy5tb2RlbC5nZXRUYXNrR3VpZGVMYXN0UG9zKCk7XG5cbiAgICAgICAgICAgICAgICAvLyDmmL7npLrmiYvmjIdcbiAgICAgICAgICAgICAgICB2YXIgYWN0aW9uX25hbWUgPSBQbGF5ZXJBY3Rpb24uYWN0aW9uXzE7XG4gICAgICAgICAgICAgICAgaWYgKGxhc3RfcG9zKVxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25fbmFtZSA9IFBsYXllckFjdGlvbi5hY3Rpb25fMjtcbiAgICAgICAgICAgICAgICB2YXIgZWZmX3JlcyA9IFBhdGhUb29sLmdldEVmZmVjdFJlcygyNDApO1xuICAgICAgICAgICAgICAgIHZhciBlZmZfcGF0aCA9IFBhdGhUb29sLmdldFNwaW5lUGF0aChlZmZfcmVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRSZXMoZWZmX3BhdGgsIGZ1bmN0aW9uIChhY3Rpb25fbmFtZSwgZWZmX3NkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X2Nvbl9zay5za2VsZXRvbkRhdGEgPSBlZmZfc2Q7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X2Nvbl9zay5zZXRBbmltYXRpb24oMCwgYWN0aW9uX25hbWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzLCBhY3Rpb25fbmFtZSkpO1xuICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X2Nvbl9uZC5zdG9wQWxsQWN0aW9ucygpXG4gICAgICAgICAgICAgICAgaWYgKGxhc3RfcG9zKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtb3ZlX2RpcyA9IHRoaXMuY2FsRGlzdGFuY2goZmluYWxfcG9zLCBsYXN0X3Bvcyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0aW1lID0gbW92ZV9kaXMgLyBHdWlkZUNvbnN0LkZpbmdlcl9TcGVlZDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxfZnVuYyA9IGNjLmNhbGxGdW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X2Nvbl9zay5zZXRBbmltYXRpb24oMCwgUGxheWVyQWN0aW9uLmFjdGlvbl8xLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoX2FjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0sIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbW92ZV9hY3QgPSBjYy5tb3ZlVG8odGltZSwgZmluYWxfcG9zKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdF9xdWVxZSA9IGNjLnNlcXVlbmNlKG1vdmVfYWN0LCBjYWxsX2Z1bmMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVmZmVjdF9jb25fbmQucnVuQWN0aW9uKGFjdF9xdWVxZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoX2FjdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X2Nvbl9uZC5wb3NpdGlvbiA9IGZpbmFsX3BvcztcbiAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZXRUYXNrR3VpZGVMYXN0UG9zKGZpbmFsX3Bvcyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgY2FsRGlzdGFuY2g6IGZ1bmN0aW9uIChwb3MxLCBwb3MyKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3coKHBvczEueCAtIHBvczIueCksIDIpICsgTWF0aC5wb3coKHBvczEueSAtIHBvczIueSksIDIpKTtcbiAgICB9LFxuXG4gICAgcGxheU5leHRHdWlkZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnNhdmVHdWlkZVN0ZXAoKVxuICAgICAgICBpZiAoIXRoaXMuYWN0X2xpc3QgfHwgdGhpcy5hY3RfbGlzdC5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5lbmRQbGF5R3VpZGUoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50YXJnZXRfZGF0YSA9IHRoaXMuYWN0X2xpc3Quc2hpZnQoKTtcbiAgICAgICAgICAgIHRoaXMuZ3VpZGVfc3RlcCA9IHRoaXMuZ3VpZGVfc3RlcCArIDE7XG5cbiAgICAgICAgICAgIGNjLmxvZyhcIuW9k+WJjeatpemqpOeahOaVsOaNrlwiKTtcbiAgICAgICAgICAgIGNjLmxvZyh0aGlzLnRhcmdldF9kYXRhKTtcblxuICAgICAgICAgICAgLy8g5Yik5pat5b2T5YmN5q2l6aqk5piv5ZCm5bey57uP5YGa6L+H5LqGLFxuICAgICAgICAgICAgaWYgKHRoaXMuZ3VpZGVfY2FjaGVfZGF0YVt0aGlzLmFjdF9jb25maWcuaWRdICYmIHRoaXMuZ3VpZGVfY2FjaGVfZGF0YVt0aGlzLmFjdF9jb25maWcuaWRdW3RoaXMuZ3VpZGVfc3RlcF0gJiYgIXRoaXMuY3VyX3pvbmVfbGlzdFt0aGlzLmd1aWRlX3N0ZXBdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGF5TmV4dEd1aWRlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRhcmdldF9kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZFJvb3RXbmRCeUNvbmRpdGlvbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBlbmRQbGF5R3VpZGU6IGZ1bmN0aW9uIChpc19za2lwKSB7XG4gICAgICAgIGNjLmxvZyhcIue7k+adn+W9k+WJjeW8leWvvC0tLVwiICsgdGhpcy5hY3RfY29uZmlnLmlkKTtcbiAgICAgICAgdGhpcy5zdGVwID0gMDtcbiAgICAgICAgaWYgKHRoaXMubW9kZWwpXG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNldFRhc2tHdWlkZUxhc3RQb3MobnVsbCk7XG4gICAgfSxcblxuICAgIHNhdmVHdWlkZVN0ZXA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLm92ZXJfc3RlcCAmJiB0aGlzLmNvbmZpZy5vdmVyX3N0ZXAgPT0gdGhpcy5ndWlkZV9zdGVwKSB7XG4gICAgICAgIC8vICAgICBpZiAoIXRoaXMuZ3VpZGVfY2FjaGVfZGF0YVt0aGlzLmNvbmZpZy5pZF0pXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5ndWlkZV9jYWNoZV9kYXRhW3RoaXMuY29uZmlnLmlkXSA9IHt9XG4gICAgICAgIC8vICAgICB0aGlzLmd1aWRlX2NhY2hlX2RhdGFbdGhpcy5jb25maWcuaWRdW3RoaXMuY29uZmlnLm92ZXJfc3RlcF0gPSB0cnVlO1xuICAgICAgICAvLyAgICAgdmFyIFJvbGVDb250cm9sbGVyID0gcmVxdWlyZShcInJvbGVfY29udHJvbGxlclwiKVxuICAgICAgICAvLyAgICAgdmFyIHJvbGVfdm8gPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpO1xuXG4gICAgICAgIC8vICAgICBjYy5zeXMubG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJ0YXNrX2d1aWRlX2RhdGFcIiArIHJvbGVfdm8uc3J2X2lkICsgcm9sZV92by5yaWQsIEpTT04uc3RyaW5naWZ5KHRoaXMuZ3VpZGVfY2FjaGVfZGF0YSkpO1xuICAgICAgICAvLyB9XG4gICAgfSxcblxuICAgIGdldEVmZmVjdEFjdGl2ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5lZmZlY3RfY29uX25kKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lZmZlY3RfY29uX25kLmFjdGl2ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG5cbiAgICAvLyDlhbPpl63nqpfkvZPlm57osIMs6ZyA6KaB5Zyo6L+Z6YeM6LCD55So6K+l56qX5L2T5omA5bGeY29udHJvbGxlcueahGNsb3Nl5pa55rOV5rKh55So5LqO572u56m66K+l56qX5L2T5a6e5L6L5a+56LGhXG4gICAgY2xvc2VDYWxsQmFjazogZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIHRoaXMucmVtb3ZlVGltZXIoKTtcbiAgICAgICAgdGhpcy5jdHJsLm9wZW5UYXNrR3VpZGVXaW5kb3coZmFsc2UpO1xuICAgIH0sXG59KSJdfQ==
|