(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/mod/mainscene/mainscene_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, '8b38cq+Ak1N4La5TaoyW4OH', 'mainscene_controller'); // Scripts/mod/mainscene/mainscene_controller.js "use strict"; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } // -------------------------------------------------------------------- // @author: xxx@syg.com(必填, 创建模块的人员) // @description: // 这里填写详细说明,主要填写该模块的功能简要 //
Create: 2018-11-23 11:43:49 // -------------------------------------------------------------------- var SceneEvent = require("mainscene_event"); var DramaEvent = require("battle_drama_event"); var RoleController = require("role_controller"); var SceneConst = require("scene_const"); var BattleConst = require("battle_const"); var CrossshowController = require("crossshow_controller"); var MainSceneController = cc.Class({ "extends": BaseController, properties: { build_list_vo: { // 建筑数据缓存 "default": {} }, has_init: false, role_vo: null, time_type: 1 }, ctor: function ctor() {}, // 初始化配置数据 initConfig: function initConfig() { // var MainSceneModel = require("mainscene_model"); this.model = Utils.createClass("mainscene_model"); this.model.initConfig(); var BattleDramaController = require("battle_drama_controller"); this.battle_drama_ctrl = BattleDramaController.getInstance(); }, // 返回当前的model getModel: function getModel() { return this.model; }, // 注册监听事件 registerEvents: function registerEvents() { this.create_role_event = gcore.GlobalEvent.bind(EventId.EVT_ROLE_CREATE_SUCCESS, function () { gcore.GlobalEvent.unbind(this.create_role_event); this.create_role_event = null; this.role_vo = RoleController.getInstance().getRoleVo(); this.creatBuildVo(); // 初始化之后,请求建筑战斗状态 this.registerProtocals(); this.role_vo.bind(EventId.UPDATE_ROLE_ATTRIBUTE, function (key, val) { if (key == "lev" || key == "open_day") this.checkBuildLockStatus(); }.bind(this)); }.bind(this)); if (!this.update_drama_max_event) { this.update_drama_max_event = gcore.GlobalEvent.bind(DramaEvent.BattleDrama_Update_Max_Id, function (max_it) { // gcore.GlobalEvent.unbind(this.update_drama_max_event); this.update_drama_max_event = null; this.checkBuildLockStatus(); // if (!this.has_init) { // this.has_init = true; // this.creatBuildVo(); // // 初始化之后,请求建筑战斗状态 // this.registerProtocals(); // } else { // // 检测建筑状态是否开启 // this.checkBuildLockStatus(); // } }.bind(this)); } // 进入战斗需要隐藏掉主城和已经打开的一些ui,但是退出之后需要重新手动打开 if (!this.battle_enter_event) { this.battle_enter_event = gcore.GlobalEvent.bind(EventId.ENTER_FIGHT, function (combat_type) { if (combat_type == BattleConst.Fight_Type.Nil) return; Utils.hideAllWindowForBattle(); this.handleSceneStatus(false); }.bind(this)); } // 退出战斗需要打开进入战斗之前的一些窗体 if (!this.battle_exit_event) { this.battle_exit_event = gcore.GlobalEvent.bind(EventId.EXIT_FIGHT, function (combat_type) { if (combat_type == BattleConst.Fight_Type.Nil) return; var need_show_scene = Utils.showAllWindowForBattle(); this.handleSceneStatus(need_show_scene); }.bind(this)); } }, // 注册协议接受事件 registerProtocals: function registerProtocals() { this.RegisterProtocal(20063, this.on20063); this.RegisterProtocal(10304, this.on10304); }, // 请求建筑气泡战斗状态 requestFightStatus: function requestFightStatus() { this.SendProtocal(20063, {}); }, // 设置战斗状态 on20063: function on20063(data) { if (!this.build_list_vo || !Utils.next(this.build_list_vo)) return; var status_list = {}; for (var build_i in Config.city_data.data_base) { status_list[build_i] = {}; } if (data.type_list) { for (var type_i in data.type_list) { var value = data.type_list[type_i]; var key = this.getBuildIdByCombat(value.combat_type); // 这个标识在战斗中 if (key) { status_list[key][value.combat_type] = true; } } } for (var status_i in status_list) { var buildvo = this.build_list_vo[status_i]; if (buildvo) { buildvo.setFightStatus(status_list[status_i]); } } // for k,v in pairs(status_list) do // local buildvo = self.build_list_vo[k] // if buildvo then // buildvo:setFightStatus(v) // end // end }, getBuildIdByCombat: function getBuildIdByCombat(combat_type) { var BattleConst = require("battle_const"); if (combat_type == BattleConst.Fight_Type.Arena) { return SceneConst.CenterSceneBuild.arena; } else if (combat_type == BattleConst.Fight_Type.StarTower) { return SceneConst.CenterSceneBuild.startower; } else if (combat_type == BattleConst.Fight_Type.Adventrue || combat_type == BattleConst.Fight_Type.ElementWar || combat_type == BattleConst.Fight_Type.HeavenWar) { return SceneConst.CenterSceneBuild.adventure; } else if (combat_type == BattleConst.Fight_Type.LadderWar || combat_type == BattleConst.Fight_Type.EliteMatchWar || combat_type == BattleConst.Fight_Type.EliteKingMatchWar || combat_type == BattleConst.Fight_Type.CrossArenaWar) { return SceneConst.CenterSceneBuild.ladder; } }, // 进入主城入口,收到这个协议开始创建主城 on10304: function on10304(data) { this.can_enter = true; // if (this.main_scene == null){ // this.enterMainScene(true) // this.enterMainScene(true) // } if (PLATFORM_TYPR == "SH_RH") { if (cli_log && cli_log.log_enter_city) { cli_log.log_enter_city(require("login_controller").getInstance().getModel().getLoginData().usrName); } ; } }, // 进入主城 enterMainScene: function enterMainScene(status) { if (this.can_enter) { if (status == false) { this.handleSceneStatus(false); } else { if (this.main_scene) { this.handleSceneStatus(true); } else { var config = Config.main_scene_data[1]; if (this.main_scene == null) { var MainScene = require("mainscene"); this.main_scene = new MainScene(config); if (this._finish_data) { this.main_scene.getBuildById(this._finish_data.id, this._finish_data.finish_cb); this._finish_data = null; } } } } } }, changeMainCityTimeType: function changeMainCityTimeType(type) { if (this.main_scene) { this.main_scene.setTimeType(type); } this.time_type = type; }, /** * 设置主城是否可见,并且同时设置主ui是否可见,这里需要设置的有打开全屏界面和关闭,进入剧情或退出 * @param {*} status */ handleSceneStatus: function handleSceneStatus(status) { if (this.main_scene) { this.main_scene_status = status; if (status == false) { this.main_scene.setVisible(status); if (this.wait_status_time_ticket) { gcore.Timer.del(this.wait_status_time_ticket); this.wait_status_time_ticket = null; } } else { if (this.wait_status_time_ticket == null) { this.wait_status_time_ticket = gcore.Timer.set(function () { if (this.main_scene_status == true) { this.main_scene.setVisible(this.main_scene_status); } gcore.Timer.del(this.wait_status_time_ticket); this.wait_status_time_ticket = null; }.bind(this), 100, 1); } } } // 主ui也做显示 var mainuiCtrl = require("mainui_controller"); mainuiCtrl.getInstance().openMainUI(status); }, checkBuildLockStatus: function checkBuildLockStatus() { var drama_data = this.battle_drama_ctrl.getModel().getDramaData(); if (!drama_data || !this.role_vo || !this.build_list_vo) return; for (var buildIndex in this.build_list_vo) { var build_vo = this.build_list_vo[buildIndex]; if (build_vo.activate && build_vo.is_lock) { var is_lock = false; for (var activateIndex in build_vo.activate) { var condition_type = build_vo.activate[activateIndex][0]; var condition_value = build_vo.activate[activateIndex][1]; var curValue = 0; switch (condition_type) { case "dun": { curValue = drama_data.max_dun_id; } break; case "lev": { curValue = this.role_vo.lev; } break; case "open_day": { curValue = this.role_vo.open_day; } break; } if (curValue >= condition_value) { is_lock = false; } else { is_lock = true; break; } } if (is_lock !== build_vo.is_lock) { build_vo.setLockStatus(is_lock); } } } }, creatBuildVo: function creatBuildVo() { if (!this.role_vo) return; var scene_config = Config.main_scene_data[1]; var drama_data = this.battle_drama_ctrl.getModel().getDramaData(); for (var buildIndex in scene_config.building_list) { var buildingitem = scene_config.building_list[buildIndex]; if (buildingitem.type == SceneConst.BuildItemType.build) { if (buildingitem.bid == 12 || buildingitem.bid == 13) continue; var city_item = Config.city_data.data_base[buildingitem.bid]; var is_lock = false; if (city_item && city_item.activate) { for (var activateIndex in city_item.activate) { var condition_type = city_item.activate[activateIndex][0]; var condition_value = city_item.activate[activateIndex][1]; var curValue = 0; switch (condition_type) { case "dun": { curValue = drama_data.max_dun_id; } break; case "lev": { curValue = this.role_vo.lev; } break; case "open_day": { curValue = this.role_vo.open_day; } break; case "world_lev": { var world_lev = RoleController.getInstance().getModel().getWorldLev(); if (world_lev) { curValue = world_lev; } } break; } if (curValue >= condition_value) { is_lock = false; } else { is_lock = true; break; } } var BuildVo = require("build_vo"); var build_vo = new BuildVo(buildingitem, is_lock, city_item.activate, city_item.desc); // 缓存的红点状态 if (this.cache_tips_list && this.cache_tips_list[buildingitem.bid]) { build_vo.setTipsStatus(this.cache_tips_list[buildingitem.bid]); this.cache_tips_list[v.bid] = null; } this.build_list_vo[buildingitem.bid] = build_vo; } } } gcore.GlobalEvent.fire(SceneEvent.CreateBuildVoOver); }, getBuildList: function getBuildList() { return this.build_list_vo; }, getBuildVo: function getBuildVo(id) { if (this.build_list_vo && this.build_list_vo[id]) return this.build_list_vo[id]; }, openBuild: function openBuild(bid, extend) { switch (bid) { case SceneConst.CenterSceneBuild.shop: { // 商店 var controller = require("mall_controller").getInstance(); controller.openMallPanel(true); } break; case SceneConst.CenterSceneBuild.seerpalace: { // 先知 var seerpalace = require("seerpalace_controller").getInstance(); seerpalace.openSeerpalaceMainWindow(true); } break; case SceneConst.CenterSceneBuild.fuse: { // 祭坛 var hero_ctl = require("hero_controller").getInstance(); hero_ctl.openHeroUpgradeStarFuseWindow(true); } break; case SceneConst.CenterSceneBuild.arena: { // 竞技 var ArenaController = require("arena_controller"); // ArenaController.getInstance().openArenaLoopMathWindow(true, this.relevance_params) ArenaController.getInstance().requestOpenArenWindow(true, extend); } break; case SceneConst.CenterSceneBuild.summon: { // 召唤 var PartnersummonController = require("partnersummon_controller"); PartnersummonController.getInstance().openPartnerSummonWindow(true); } break; case SceneConst.CenterSceneBuild.video: {// 录像 } break; case SceneConst.CenterSceneBuild.startower: { // 星命塔 var Battleconst = require("battle_const"); require("mainui_controller").getInstance().requestOpenBattleRelevanceWindow(Battleconst.Fight_Type.StarTower); } break; case SceneConst.CenterSceneBuild.mall: { // 锻造屋 var controller = require("forgehouse_controller"); controller.getInstance().openForgeHouseView(true); } break; case SceneConst.CenterSceneBuild.variety: { // 杂货店 var controller = require("mall_controller").getInstance(); controller.openVarietyStoreWindows(true); } break; case SceneConst.CenterSceneBuild.guild: { // 祭坛 var hero_ctl = require("hero_controller").getInstance(); hero_ctl.openHeroResetWindow(true); } break; case SceneConst.CenterSceneBuild.escort: {// 活动 } break; case SceneConst.CenterSceneBuild.library: { // 图书馆 require("hero_controller").getInstance().openHeroLibraryMainWindow(true); } break; case SceneConst.CenterSceneBuild.adventure: { // 冒险 require("adventureactivity_controller").getInstance().openAdventureActivityMainWindow(true); } break; case SceneConst.CenterSceneBuild.ladder: {} break; case SceneConst.CenterSceneBuild.crossshow: { CrossshowController.getInstance().openCrossshowMainWindow(true); } break; } this.relevance_params = null; }, /**@desc:设置建筑红点状态 author:{author} time:2018-05-25 16:52:47 --@id: --@data:红点状态可以是单个 boolean,也可以是 {bid=XX,status=boolean},也可以是[{bid=XX,status=boolean}, {bid=YY,status=boolean}] ,其他格式不做处理 return */ setBuildRedStatus: function setBuildRedStatus(id, data) { if (!this.build_list_vo || !this.build_list_vo[id]) { if (!this.cache_tips_list) { this.cache_tips_list = {}; } if (data instanceof Array) { if (!this.cache_tips_list[id]) { this.cache_tips_list[id] = {}; } for (var i in data) { var v = data[i]; if (v.bid != null && typeof v.bid == "number") { this.cache_tips_list[id][v.bid] = v; } } } else if (_typeof(data) == "object") { if (!this.cache_tips_list[id]) { this.cache_tips_list[id] = {}; } if (data.bid != null && typeof data.bid == "number") { this.cache_tips_list[id][data.bid] = data; } } else { this.cache_tips_list[id] = data; } // cc.log("缓存的红点状态"); // cc.log(this.cache_tips_list); } else { var build_vo = this.build_list_vo[id]; build_vo.setTipsStatus(data); } // 监测红点 var MainuiController = require("mainui_controller"); MainuiController.getInstance().checkMainSceneIconStatus(); }, //获取建筑 getBuildVoList: function getBuildVoList() { return this.build_list_vo; }, getCenterCityBuildById: function getCenterCityBuildById(id, finish_cb) { if (this.main_scene) { this.main_scene.getBuildById(id, finish_cb); } else { this._finish_data = { id: id, finish_cb: finish_cb }; } }, moveToBuild: function moveToBuild(id) { if (this.main_scene) { this.main_scene.moveToBuild(id); } } }); module.exports = MainSceneController; 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxtYWluc2NlbmVcXG1haW5zY2VuZV9jb250cm9sbGVyLmpzIl0sIm5hbWVzIjpbIlNjZW5lRXZlbnQiLCJyZXF1aXJlIiwiRHJhbWFFdmVudCIsIlJvbGVDb250cm9sbGVyIiwiU2NlbmVDb25zdCIsIkJhdHRsZUNvbnN0IiwiQ3Jvc3NzaG93Q29udHJvbGxlciIsIk1haW5TY2VuZUNvbnRyb2xsZXIiLCJjYyIsIkNsYXNzIiwiQmFzZUNvbnRyb2xsZXIiLCJwcm9wZXJ0aWVzIiwiYnVpbGRfbGlzdF92byIsImhhc19pbml0Iiwicm9sZV92byIsInRpbWVfdHlwZSIsImN0b3IiLCJpbml0Q29uZmlnIiwibW9kZWwiLCJVdGlscyIsImNyZWF0ZUNsYXNzIiwiQmF0dGxlRHJhbWFDb250cm9sbGVyIiwiYmF0dGxlX2RyYW1hX2N0cmwiLCJnZXRJbnN0YW5jZSIsImdldE1vZGVsIiwicmVnaXN0ZXJFdmVudHMiLCJjcmVhdGVfcm9sZV9ldmVudCIsImdjb3JlIiwiR2xvYmFsRXZlbnQiLCJiaW5kIiwiRXZlbnRJZCIsIkVWVF9ST0xFX0NSRUFURV9TVUNDRVNTIiwidW5iaW5kIiwiZ2V0Um9sZVZvIiwiY3JlYXRCdWlsZFZvIiwicmVnaXN0ZXJQcm90b2NhbHMiLCJVUERBVEVfUk9MRV9BVFRSSUJVVEUiLCJrZXkiLCJ2YWwiLCJjaGVja0J1aWxkTG9ja1N0YXR1cyIsInVwZGF0ZV9kcmFtYV9tYXhfZXZlbnQiLCJCYXR0bGVEcmFtYV9VcGRhdGVfTWF4X0lkIiwibWF4X2l0IiwiYmF0dGxlX2VudGVyX2V2ZW50IiwiRU5URVJfRklHSFQiLCJjb21iYXRfdHlwZSIsIkZpZ2h0X1R5cGUiLCJOaWwiLCJoaWRlQWxsV2luZG93Rm9yQmF0dGxlIiwiaGFuZGxlU2NlbmVTdGF0dXMiLCJiYXR0bGVfZXhpdF9ldmVudCIsIkVYSVRfRklHSFQiLCJuZWVkX3Nob3dfc2NlbmUiLCJzaG93QWxsV2luZG93Rm9yQmF0dGxlIiwiUmVnaXN0ZXJQcm90b2NhbCIsIm9uMjAwNjMiLCJvbjEwMzA0IiwicmVxdWVzdEZpZ2h0U3RhdHVzIiwiU2VuZFByb3RvY2FsIiwiZGF0YSIsIm5leHQiLCJzdGF0dXNfbGlzdCIsImJ1aWxkX2kiLCJDb25maWciLCJjaXR5X2RhdGEiLCJkYXRhX2Jhc2UiLCJ0eXBlX2xpc3QiLCJ0eXBlX2kiLCJ2YWx1ZSIsImdldEJ1aWxkSWRCeUNvbWJhdCIsInN0YXR1c19pIiwiYnVpbGR2byIsInNldEZpZ2h0U3RhdHVzIiwiQXJlbmEiLCJDZW50ZXJTY2VuZUJ1aWxkIiwiYXJlbmEiLCJTdGFyVG93ZXIiLCJzdGFydG93ZXIiLCJBZHZlbnRydWUiLCJFbGVtZW50V2FyIiwiSGVhdmVuV2FyIiwiYWR2ZW50dXJlIiwiTGFkZGVyV2FyIiwiRWxpdGVNYXRjaFdhciIsIkVsaXRlS2luZ01hdGNoV2FyIiwiQ3Jvc3NBcmVuYVdhciIsImxhZGRlciIsImNhbl9lbnRlciIsIlBMQVRGT1JNX1RZUFIiLCJjbGlfbG9nIiwibG9nX2VudGVyX2NpdHkiLCJnZXRMb2dpbkRhdGEiLCJ1c3JOYW1lIiwiZW50ZXJNYWluU2NlbmUiLCJzdGF0dXMiLCJtYWluX3NjZW5lIiwiY29uZmlnIiwibWFpbl9zY2VuZV9kYXRhIiwiTWFpblNjZW5lIiwiX2ZpbmlzaF9kYXRhIiwiZ2V0QnVpbGRCeUlkIiwiaWQiLCJmaW5pc2hfY2IiLCJjaGFuZ2VNYWluQ2l0eVRpbWVUeXBlIiwidHlwZSIsInNldFRpbWVUeXBlIiwibWFpbl9zY2VuZV9zdGF0dXMiLCJzZXRWaXNpYmxlIiwid2FpdF9zdGF0dXNfdGltZV90aWNrZXQiLCJUaW1lciIsImRlbCIsInNldCIsIm1haW51aUN0cmwiLCJvcGVuTWFpblVJIiwiZHJhbWFfZGF0YSIsImdldERyYW1hRGF0YSIsImJ1aWxkSW5kZXgiLCJidWlsZF92byIsImFjdGl2YXRlIiwiaXNfbG9jayIsImFjdGl2YXRlSW5kZXgiLCJjb25kaXRpb25fdHlwZSIsImNvbmRpdGlvbl92YWx1ZSIsImN1clZhbHVlIiwibWF4X2R1bl9pZCIsImxldiIsIm9wZW5fZGF5Iiwic2V0TG9ja1N0YXR1cyIsInNjZW5lX2NvbmZpZyIsImJ1aWxkaW5nX2xpc3QiLCJidWlsZGluZ2l0ZW0iLCJCdWlsZEl0ZW1UeXBlIiwiYnVpbGQiLCJiaWQiLCJjaXR5X2l0ZW0iLCJ3b3JsZF9sZXYiLCJnZXRXb3JsZExldiIsIkJ1aWxkVm8iLCJkZXNjIiwiY2FjaGVfdGlwc19saXN0Iiwic2V0VGlwc1N0YXR1cyIsInYiLCJmaXJlIiwiQ3JlYXRlQnVpbGRWb092ZXIiLCJnZXRCdWlsZExpc3QiLCJnZXRCdWlsZFZvIiwib3BlbkJ1aWxkIiwiZXh0ZW5kIiwic2hvcCIsImNvbnRyb2xsZXIiLCJvcGVuTWFsbFBhbmVsIiwic2VlcnBhbGFjZSIsIm9wZW5TZWVycGFsYWNlTWFpbldpbmRvdyIsImZ1c2UiLCJoZXJvX2N0bCIsIm9wZW5IZXJvVXBncmFkZVN0YXJGdXNlV2luZG93IiwiQXJlbmFDb250cm9sbGVyIiwicmVxdWVzdE9wZW5BcmVuV2luZG93Iiwic3VtbW9uIiwiUGFydG5lcnN1bW1vbkNvbnRyb2xsZXIiLCJvcGVuUGFydG5lclN1bW1vbldpbmRvdyIsInZpZGVvIiwiQmF0dGxlY29uc3QiLCJyZXF1ZXN0T3BlbkJhdHRsZVJlbGV2YW5jZVdpbmRvdyIsIm1hbGwiLCJvcGVuRm9yZ2VIb3VzZVZpZXciLCJ2YXJpZXR5Iiwib3BlblZhcmlldHlTdG9yZVdpbmRvd3MiLCJndWlsZCIsIm9wZW5IZXJvUmVzZXRXaW5kb3ciLCJlc2NvcnQiLCJsaWJyYXJ5Iiwib3Blbkhlcm9MaWJyYXJ5TWFpbldpbmRvdyIsIm9wZW5BZHZlbnR1cmVBY3Rpdml0eU1haW5XaW5kb3ciLCJjcm9zc3Nob3ciLCJvcGVuQ3Jvc3NzaG93TWFpbldpbmRvdyIsInJlbGV2YW5jZV9wYXJhbXMiLCJzZXRCdWlsZFJlZFN0YXR1cyIsIkFycmF5IiwiaSIsIk1haW51aUNvbnRyb2xsZXIiLCJjaGVja01haW5TY2VuZUljb25TdGF0dXMiLCJnZXRCdWlsZFZv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LEVBQUUscUJBQVVuRixFQUFWLEVBQWM7QUFDdkIsUUFBSSxLQUFLTixVQUFULEVBQXFCO0FBQ2pCLFdBQUtBLFVBQUwsQ0FBZ0J5RixXQUFoQixDQUE0Qm5GLEVBQTVCO0FBQ0g7QUFDSjtBQTljOEIsQ0FBVCxDQUExQjtBQWtkQW9GLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQm5MLG1CQUFqQiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEBhdXRob3I6IHh4eEBzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgICDov5nph4zloavlhpnor6bnu4bor7TmmI4s5Li76KaB5aGr5YaZ6K+l5qih5Z2X55qE5Yqf6IO9566A6KaBXG4vLyA8YnIvPkNyZWF0ZTogMjAxOC0xMS0yMyAxMTo0Mzo0OVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIFNjZW5lRXZlbnQgPSByZXF1aXJlKFwibWFpbnNjZW5lX2V2ZW50XCIpO1xudmFyIERyYW1hRXZlbnQgPSByZXF1aXJlKFwiYmF0dGxlX2RyYW1hX2V2ZW50XCIpO1xudmFyIFJvbGVDb250cm9sbGVyID0gcmVxdWlyZShcInJvbGVfY29udHJvbGxlclwiKVxudmFyIFNjZW5lQ29uc3QgPSByZXF1aXJlKFwic2NlbmVfY29uc3RcIik7XG52YXIgQmF0dGxlQ29uc3QgPSByZXF1aXJlKFwiYmF0dGxlX2NvbnN0XCIpO1xudmFyIENyb3Nzc2hvd0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiY3Jvc3NzaG93X2NvbnRyb2xsZXJcIik7XG5cbnZhciBNYWluU2NlbmVDb250cm9sbGVyID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VDb250cm9sbGVyLFxuXG4gICAgcHJvcGVydGllczoge1xuICAgICAgICBidWlsZF9saXN0X3ZvOiB7ICAgICAgICAgICAgIC8vIOW7uuetkeaVsOaNrue8k+WtmFxuICAgICAgICAgICAgZGVmYXVsdDoge31cbiAgICAgICAgfSxcbiAgICAgICAgaGFzX2luaXQ6IGZhbHNlLFxuICAgICAgICByb2xlX3ZvOiBudWxsLFxuICAgICAgICB0aW1lX3R5cGU6IDEsXG4gICAgfSxcblxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICB9LFxuXG4gICAgLy8g5Yid5aeL5YyW6YWN572u5pWw5o2uXG4gICAgaW5pdENvbmZpZzogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyB2YXIgTWFpblNjZW5lTW9kZWwgPSByZXF1aXJlKFwibWFpbnNjZW5lX21vZGVsXCIpO1xuICAgICAgICB0aGlzLm1vZGVsID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJtYWluc2NlbmVfbW9kZWxcIilcbiAgICAgICAgdGhpcy5tb2RlbC5pbml0Q29uZmlnKCk7XG5cbiAgICAgICAgdmFyIEJhdHRsZURyYW1hQ29udHJvbGxlciA9IHJlcXVpcmUoXCJiYXR0bGVfZHJhbWFfY29udHJvbGxlclwiKTtcbiAgICAgICAgdGhpcy5iYXR0bGVfZHJhbWFfY3RybCA9IEJhdHRsZURyYW1hQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpO1xuICAgIH0sXG5cbiAgICAvLyDov5Tlm57lvZPliY3nmoRtb2RlbFxuICAgIGdldE1vZGVsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsO1xuICAgIH0sXG5cbiAgICAvLyDms6jlhoznm5HlkKzkuovku7ZcbiAgICByZWdpc3RlckV2ZW50czogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmNyZWF0ZV9yb2xlX2V2ZW50ID0gZ2NvcmUuR2xvYmFsRXZlbnQuYmluZChFdmVudElkLkVWVF9ST0xFX0NSRUFURV9TVUNDRVNTLCAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQudW5iaW5kKHRoaXMuY3JlYXRlX3JvbGVfZXZlbnQpO1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVfcm9sZV9ldmVudCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnJvbGVfdm8gPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpO1xuICAgICAgICAgICAgdGhpcy5jcmVhdEJ1aWxkVm8oKTtcbiAgICAgICAgICAgIC8vIOWIneWni+WMluS5i+WQju+8jOivt+axguW7uuetkeaImOaWl+eKtuaAgVxuICAgICAgICAgICAgdGhpcy5yZWdpc3RlclByb3RvY2FscygpO1xuICAgICAgICAgICAgdGhpcy5yb2xlX3ZvLmJpbmQoRXZlbnRJZC5VUERBVEVfUk9MRV9BVFRSSUJVVEUsIChmdW5jdGlvbiAoa2V5LCB2YWwpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5ID09IFwibGV2XCIgfHwga2V5ID09IFwib3Blbl9kYXlcIikgdGhpcy5jaGVja0J1aWxkTG9ja1N0YXR1cygpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKSk7XG4gICAgICAgIH0pLmJpbmQodGhpcykpO1xuXG4gICAgICAgIGlmICghdGhpcy51cGRhdGVfZHJhbWFfbWF4X2V2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZV9kcmFtYV9tYXhfZXZlbnQgPSBnY29yZS5HbG9iYWxFdmVudC5iaW5kKERyYW1hRXZlbnQuQmF0dGxlRHJhbWFfVXBkYXRlX01heF9JZCwgZnVuY3Rpb24gKG1heF9pdCkge1xuICAgICAgICAgICAgICAgIC8vIGdjb3JlLkdsb2JhbEV2ZW50LnVuYmluZCh0aGlzLnVwZGF0ZV9kcmFtYV9tYXhfZXZlbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlX2RyYW1hX21heF9ldmVudCA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0J1aWxkTG9ja1N0YXR1cygpO1xuICAgICAgICAgICAgICAgIC8vIGlmICghdGhpcy5oYXNfaW5pdCkge1xuICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLmhhc19pbml0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5jcmVhdEJ1aWxkVm8oKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgLy8g5Yid5aeL5YyW5LmL5ZCO77yM6K+35rGC5bu6562R5oiY5paX54q25oCBXG4gICAgICAgICAgICAgICAgLy8gICAgIHRoaXMucmVnaXN0ZXJQcm90b2NhbHMoKTtcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgICAvLyDmo4DmtYvlu7rnrZHnirbmgIHmmK/lkKblvIDlkK9cbiAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5jaGVja0J1aWxkTG9ja1N0YXR1cygpO1xuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDov5vlhaXmiJjmlpfpnIDopoHpmpDol4/mjonkuLvln47lkozlt7Lnu4/miZPlvIDnmoTkuIDkupt1aSzkvYbmmK/pgIDlh7rkuYvlkI7pnIDopoHph43mlrDmiYvliqjmiZPlvIBcbiAgICAgICAgaWYgKCF0aGlzLmJhdHRsZV9lbnRlcl9ldmVudCkge1xuICAgICAgICAgICAgdGhpcy5iYXR0bGVfZW50ZXJfZXZlbnQgPSBnY29yZS5HbG9iYWxFdmVudC5iaW5kKEV2ZW50SWQuRU5URVJfRklHSFQsIGZ1bmN0aW9uIChjb21iYXRfdHlwZSkge1xuICAgICAgICAgICAgICAgIGlmIChjb21iYXRfdHlwZSA9PSBCYXR0bGVDb25zdC5GaWdodF9UeXBlLk5pbCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIFV0aWxzLmhpZGVBbGxXaW5kb3dGb3JCYXR0bGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVNjZW5lU3RhdHVzKGZhbHNlKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOmAgOWHuuaImOaWl+mcgOimgeaJk+W8gOi/m+WFpeaImOaWl+S5i+WJjeeahOS4gOS6m+eql+S9k1xuICAgICAgICBpZiAoIXRoaXMuYmF0dGxlX2V4aXRfZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuYmF0dGxlX2V4aXRfZXZlbnQgPSBnY29yZS5HbG9iYWxFdmVudC5iaW5kKEV2ZW50SWQuRVhJVF9GSUdIVCwgZnVuY3Rpb24gKGNvbWJhdF90eXBlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbWJhdF90eXBlID09IEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuTmlsKSByZXR1cm47XG4gICAgICAgICAgICAgICAgdmFyIG5lZWRfc2hvd19zY2VuZSA9IFV0aWxzLnNob3dBbGxXaW5kb3dGb3JCYXR0bGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVNjZW5lU3RhdHVzKG5lZWRfc2hvd19zY2VuZSk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM5Y2P6K6u5o6l5Y+X5LqL5Lu2XG4gICAgcmVnaXN0ZXJQcm90b2NhbHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIwMDYzLCB0aGlzLm9uMjAwNjMpO1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTAzMDQsIHRoaXMub24xMDMwNCk7XG4gICAgfSxcblxuICAgIC8vIOivt+axguW7uuetkeawlOazoeaImOaWl+eKtuaAgVxuICAgIHJlcXVlc3RGaWdodFN0YXR1czogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgyMDA2Mywge30pXG4gICAgfSxcblxuICAgIC8vIOiuvue9ruaImOaWl+eKtuaAgVxuICAgIG9uMjAwNjM6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmICghdGhpcy5idWlsZF9saXN0X3ZvIHx8ICFVdGlscy5uZXh0KHRoaXMuYnVpbGRfbGlzdF92bykpIHJldHVybjtcblxuICAgICAgICB2YXIgc3RhdHVzX2xpc3QgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgYnVpbGRfaSBpbiBDb25maWcuY2l0eV9kYXRhLmRhdGFfYmFzZSkge1xuICAgICAgICAgICAgc3RhdHVzX2xpc3RbYnVpbGRfaV0gPSB7fVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRhdGEudHlwZV9saXN0KSB7XG4gICAgICAgICAgICBmb3IgKHZhciB0eXBlX2kgaW4gZGF0YS50eXBlX2xpc3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBkYXRhLnR5cGVfbGlzdFt0eXBlX2ldO1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSB0aGlzLmdldEJ1aWxkSWRCeUNvbWJhdCh2YWx1ZS5jb21iYXRfdHlwZSk7IC8vIOi/meS4quagh+ivhuWcqOaImOaWl+S4rVxuICAgICAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzX2xpc3Rba2V5XVt2YWx1ZS5jb21iYXRfdHlwZV0gPSB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAgICAgICAgXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBzdGF0dXNfaSBpbiBzdGF0dXNfbGlzdCkge1xuICAgICAgICAgICAgdmFyIGJ1aWxkdm8gPSB0aGlzLmJ1aWxkX2xpc3Rfdm9bc3RhdHVzX2ldO1xuICAgICAgICAgICAgaWYgKGJ1aWxkdm8pIHtcbiAgICAgICAgICAgICAgICBidWlsZHZvLnNldEZpZ2h0U3RhdHVzKHN0YXR1c19saXN0W3N0YXR1c19pXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmb3Igayx2IGluIHBhaXJzKHN0YXR1c19saXN0KSBkb1xuICAgICAgICAvLyAgICAgbG9jYWwgYnVpbGR2byA9IHNlbGYuYnVpbGRfbGlzdF92b1trXVxuICAgICAgICAvLyAgICAgaWYgYnVpbGR2byB0aGVuXG4gICAgICAgIC8vICAgICAgICAgYnVpbGR2bzpzZXRGaWdodFN0YXR1cyh2KVxuICAgICAgICAvLyAgICAgZW5kXG4gICAgICAgIC8vIGVuZCAgICAgICAgXG4gICAgfSxcblxuXG4gICAgZ2V0QnVpbGRJZEJ5Q29tYmF0OiBmdW5jdGlvbihjb21iYXRfdHlwZSkge1xuICAgICAgICB2YXIgQmF0dGxlQ29uc3QgPSByZXF1aXJlKFwiYmF0dGxlX2NvbnN0XCIpO1xuICAgICAgICBpZiAoY29tYmF0X3R5cGUgPT0gQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5BcmVuYSkge1xuICAgICAgICAgICAgcmV0dXJuIFNjZW5lQ29uc3QuQ2VudGVyU2NlbmVCdWlsZC5hcmVuYTtcbiAgICAgICAgfSBlbHNlIGlmIChjb21iYXRfdHlwZSA9PSBCYXR0bGVDb25zdC5GaWdodF9UeXBlLlN0YXJUb3dlcikge1xuICAgICAgICAgICAgcmV0dXJuIFNjZW5lQ29uc3QuQ2VudGVyU2NlbmVCdWlsZC5zdGFydG93ZXI7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tYmF0X3R5cGUgPT0gQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5BZHZlbnRydWUgfHwgY29tYmF0X3R5cGUgPT0gQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5FbGVtZW50V2FyIHx8IGNvbWJhdF90eXBlID09IEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuSGVhdmVuV2FyKSB7XG4gICAgICAgICAgICByZXR1cm4gU2NlbmVDb25zdC5DZW50ZXJTY2VuZUJ1aWxkLmFkdmVudHVyZTtcbiAgICAgICAgfSBlbHNlIGlmIChjb21iYXRfdHlwZSA9PSBCYXR0bGVDb25zdC5GaWdodF9UeXBlLkxhZGRlcldhciB8fCBjb21iYXRfdHlwZSA9PSBCYXR0bGVDb25zdC5GaWdodF9UeXBlLkVsaXRlTWF0Y2hXYXIgfHwgY29tYmF0X3R5cGUgPT0gQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5FbGl0ZUtpbmdNYXRjaFdhciB8fCBjb21iYXRfdHlwZSA9PSBCYXR0bGVDb25zdC5GaWdodF9UeXBlLkNyb3NzQXJlbmFXYXIpIHtcbiAgICAgICAgICAgIHJldHVybiBTY2VuZUNvbnN0LkNlbnRlclNjZW5lQnVpbGQubGFkZGVyO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOi/m+WFpeS4u+WfjuWFpeWPoyzmlLbliLDov5nkuKrljY/orq7lvIDlp4vliJvlu7rkuLvln45cbiAgICBvbjEwMzA0OiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICB0aGlzLmNhbl9lbnRlciA9IHRydWU7XG4gICAgICAgIC8vIGlmICh0aGlzLm1haW5fc2NlbmUgPT0gbnVsbCl7XG4gICAgICAgIC8vICAgICB0aGlzLmVudGVyTWFpblNjZW5lKHRydWUpXG4gICAgICAgIC8vICAgICB0aGlzLmVudGVyTWFpblNjZW5lKHRydWUpXG4gICAgICAgIC8vIH1cbiAgICAgICAgaWYoUExBVEZPUk1fVFlQUiA9PSBcIlNIX1JIXCIpe1xuICAgICAgICAgICAgaWYgKGNsaV9sb2cgJiYgY2xpX2xvZy5sb2dfZW50ZXJfY2l0eSkge1xuICAgICAgICAgICAgICAgIGNsaV9sb2cubG9nX2VudGVyX2NpdHkocmVxdWlyZShcImxvZ2luX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldExvZ2luRGF0YSgpLnVzck5hbWUpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgfSxcblxuICAgIC8vIOi/m+WFpeS4u+WfjlxuICAgIGVudGVyTWFpblNjZW5lOiBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgICAgIGlmICh0aGlzLmNhbl9lbnRlcikge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU2NlbmVTdGF0dXMoZmFsc2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tYWluX3NjZW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU2NlbmVTdGF0dXModHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmZpZyA9IENvbmZpZy5tYWluX3NjZW5lX2RhdGFbMV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1haW5fc2NlbmUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIE1haW5TY2VuZSA9IHJlcXVpcmUoXCJtYWluc2NlbmVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1haW5fc2NlbmUgPSBuZXcgTWFpblNjZW5lKGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fZmluaXNoX2RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1haW5fc2NlbmUuZ2V0QnVpbGRCeUlkKHRoaXMuX2ZpbmlzaF9kYXRhLmlkLCB0aGlzLl9maW5pc2hfZGF0YS5maW5pc2hfY2IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmlzaF9kYXRhID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBjaGFuZ2VNYWluQ2l0eVRpbWVUeXBlOiBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICBpZiAodGhpcy5tYWluX3NjZW5lKSB7XG4gICAgICAgICAgICB0aGlzLm1haW5fc2NlbmUuc2V0VGltZVR5cGUodHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aW1lX3R5cGUgPSB0eXBlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDorr7nva7kuLvln47mmK/lkKblj6/op4Es5bm25LiU5ZCM5pe26K6+572u5Li7dWnmmK/lkKblj6/op4Es6L+Z6YeM6ZyA6KaB6K6+572u55qE5pyJ5omT5byA5YWo5bGP55WM6Z2i5ZKM5YWz6ZetLOi/m+WFpeWJp+aDheaIlumAgOWHulxuICAgICAqIEBwYXJhbSB7Kn0gc3RhdHVzIFxuICAgICAqL1xuICAgIGhhbmRsZVNjZW5lU3RhdHVzOiBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgICAgIGlmICh0aGlzLm1haW5fc2NlbmUpIHtcbiAgICAgICAgICAgIHRoaXMubWFpbl9zY2VuZV9zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgICAgICBpZiAoc3RhdHVzID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYWluX3NjZW5lLnNldFZpc2libGUoc3RhdHVzKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy53YWl0X3N0YXR1c190aW1lX3RpY2tldCkge1xuICAgICAgICAgICAgICAgICAgICBnY29yZS5UaW1lci5kZWwodGhpcy53YWl0X3N0YXR1c190aW1lX3RpY2tldCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMud2FpdF9zdGF0dXNfdGltZV90aWNrZXQgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMud2FpdF9zdGF0dXNfdGltZV90aWNrZXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLndhaXRfc3RhdHVzX3RpbWVfdGlja2V0ID0gZ2NvcmUuVGltZXIuc2V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1haW5fc2NlbmVfc3RhdHVzID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1haW5fc2NlbmUuc2V0VmlzaWJsZSh0aGlzLm1haW5fc2NlbmVfc3RhdHVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGdjb3JlLlRpbWVyLmRlbCh0aGlzLndhaXRfc3RhdHVzX3RpbWVfdGlja2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2FpdF9zdGF0dXNfdGltZV90aWNrZXQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcyksIDEwMCwgMSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8g5Li7dWnkuZ/lgZrmmL7npLpcbiAgICAgICAgdmFyIG1haW51aUN0cmwgPSByZXF1aXJlKFwibWFpbnVpX2NvbnRyb2xsZXJcIik7XG4gICAgICAgIG1haW51aUN0cmwuZ2V0SW5zdGFuY2UoKS5vcGVuTWFpblVJKHN0YXR1cyk7XG4gICAgfSxcblxuICAgIGNoZWNrQnVpbGRMb2NrU3RhdHVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkcmFtYV9kYXRhID0gdGhpcy5iYXR0bGVfZHJhbWFfY3RybC5nZXRNb2RlbCgpLmdldERyYW1hRGF0YSgpO1xuICAgICAgICBpZiAoIWRyYW1hX2RhdGEgfHwgIXRoaXMucm9sZV92byB8fCAhdGhpcy5idWlsZF9saXN0X3ZvKSByZXR1cm47XG5cbiAgICAgICAgZm9yICh2YXIgYnVpbGRJbmRleCBpbiB0aGlzLmJ1aWxkX2xpc3Rfdm8pIHtcbiAgICAgICAgICAgIHZhciBidWlsZF92byA9IHRoaXMuYnVpbGRfbGlzdF92b1tidWlsZEluZGV4XTtcbiAgICAgICAgICAgIGlmIChidWlsZF92by5hY3RpdmF0ZSAmJiBidWlsZF92by5pc19sb2NrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlzX2xvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBhY3RpdmF0ZUluZGV4IGluIGJ1aWxkX3ZvLmFjdGl2YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb25kaXRpb25fdHlwZSA9IGJ1aWxkX3ZvLmFjdGl2YXRlW2FjdGl2YXRlSW5kZXhdWzBdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29uZGl0aW9uX3ZhbHVlID0gYnVpbGRfdm8uYWN0aXZhdGVbYWN0aXZhdGVJbmRleF1bMV07XG4gICAgICAgICAgICAgICAgICAgIHZhciBjdXJWYWx1ZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY29uZGl0aW9uX3R5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJkdW5cIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1clZhbHVlID0gZHJhbWFfZGF0YS5tYXhfZHVuX2lkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImxldlwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyVmFsdWUgPSB0aGlzLnJvbGVfdm8ubGV2O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm9wZW5fZGF5XCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJWYWx1ZSA9IHRoaXMucm9sZV92by5vcGVuX2RheTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVmFsdWUgPj0gY29uZGl0aW9uX3ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc19sb2NrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc19sb2NrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpc19sb2NrICE9PSBidWlsZF92by5pc19sb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1aWxkX3ZvLnNldExvY2tTdGF0dXMoaXNfbG9jayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIGNyZWF0QnVpbGRWbzogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMucm9sZV92bykgcmV0dXJuO1xuICAgICAgICB2YXIgc2NlbmVfY29uZmlnID0gQ29uZmlnLm1haW5fc2NlbmVfZGF0YVsxXTtcbiAgICAgICAgdmFyIGRyYW1hX2RhdGEgPSB0aGlzLmJhdHRsZV9kcmFtYV9jdHJsLmdldE1vZGVsKCkuZ2V0RHJhbWFEYXRhKCk7XG5cbiAgICAgICAgZm9yICh2YXIgYnVpbGRJbmRleCBpbiBzY2VuZV9jb25maWcuYnVpbGRpbmdfbGlzdCkge1xuICAgICAgICAgICAgdmFyIGJ1aWxkaW5naXRlbSA9IHNjZW5lX2NvbmZpZy5idWlsZGluZ19saXN0W2J1aWxkSW5kZXhdO1xuICAgICAgICAgICAgaWYgKGJ1aWxkaW5naXRlbS50eXBlID09IFNjZW5lQ29uc3QuQnVpbGRJdGVtVHlwZS5idWlsZCkge1xuICAgICAgICAgICAgICAgIGlmKGJ1aWxkaW5naXRlbS5iaWQgPT0gMTIgfHwgYnVpbGRpbmdpdGVtLmJpZCA9PSAxMyljb250aW51ZVxuICAgICAgICAgICAgICAgIHZhciBjaXR5X2l0ZW0gPSBDb25maWcuY2l0eV9kYXRhLmRhdGFfYmFzZVtidWlsZGluZ2l0ZW0uYmlkXTtcbiAgICAgICAgICAgICAgICB2YXIgaXNfbG9jayA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNpdHlfaXRlbSAmJiBjaXR5X2l0ZW0uYWN0aXZhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYWN0aXZhdGVJbmRleCBpbiBjaXR5X2l0ZW0uYWN0aXZhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25kaXRpb25fdHlwZSA9IGNpdHlfaXRlbS5hY3RpdmF0ZVthY3RpdmF0ZUluZGV4XVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25kaXRpb25fdmFsdWUgPSBjaXR5X2l0ZW0uYWN0aXZhdGVbYWN0aXZhdGVJbmRleF1bMV07XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VyVmFsdWUgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb25kaXRpb25fdHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJkdW5cIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJWYWx1ZSA9IGRyYW1hX2RhdGEubWF4X2R1bl9pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsZXZcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJWYWx1ZSA9IHRoaXMucm9sZV92by5sZXY7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwib3Blbl9kYXlcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJWYWx1ZSA9IHRoaXMucm9sZV92by5vcGVuX2RheTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ3b3JsZF9sZXZcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgd29ybGRfbGV2ID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldFdvcmxkTGV2KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHdvcmxkX2xldil7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJWYWx1ZSA9IHdvcmxkX2xldlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJWYWx1ZSA+PSBjb25kaXRpb25fdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19sb2NrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2xvY2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIEJ1aWxkVm8gPSByZXF1aXJlKFwiYnVpbGRfdm9cIik7XG4gICAgICAgICAgICAgICAgICAgIHZhciBidWlsZF92byA9IG5ldyBCdWlsZFZvKGJ1aWxkaW5naXRlbSwgaXNfbG9jaywgY2l0eV9pdGVtLmFjdGl2YXRlLCBjaXR5X2l0ZW0uZGVzYylcbiAgICAgICAgICAgICAgICAgICAgLy8g57yT5a2Y55qE57qi54K554q25oCBXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhY2hlX3RpcHNfbGlzdCAmJiB0aGlzLmNhY2hlX3RpcHNfbGlzdFtidWlsZGluZ2l0ZW0uYmlkXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRfdm8uc2V0VGlwc1N0YXR1cyh0aGlzLmNhY2hlX3RpcHNfbGlzdFtidWlsZGluZ2l0ZW0uYmlkXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVfdGlwc19saXN0W3YuYmlkXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idWlsZF9saXN0X3ZvW2J1aWxkaW5naXRlbS5iaWRdID0gYnVpbGRfdm87XG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShTY2VuZUV2ZW50LkNyZWF0ZUJ1aWxkVm9PdmVyKTtcbiAgICB9LFxuXG4gICAgZ2V0QnVpbGRMaXN0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkX2xpc3Rfdm9cbiAgICB9LFxuXG4gICAgZ2V0QnVpbGRWbzogZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIGlmICh0aGlzLmJ1aWxkX2xpc3Rfdm8gJiYgdGhpcy5idWlsZF9saXN0X3ZvW2lkXSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkX2xpc3Rfdm9baWRdO1xuICAgIH0sXG5cbiAgICBvcGVuQnVpbGQ6IGZ1bmN0aW9uIChiaWQsIGV4dGVuZCkge1xuICAgICAgICBzd2l0Y2ggKGJpZCkge1xuICAgICAgICAgICAgY2FzZSBTY2VuZUNvbnN0LkNlbnRlclNjZW5lQnVpbGQuc2hvcDogeyAgICAgICAgICAgICAgICAgICAgIC8vIOWVhuW6l1xuICAgICAgICAgICAgICAgIHZhciBjb250cm9sbGVyID0gcmVxdWlyZShcIm1hbGxfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub3Blbk1hbGxQYW5lbCh0cnVlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFNjZW5lQ29uc3QuQ2VudGVyU2NlbmVCdWlsZC5zZWVycGFsYWNlOiB7ICAgICAgICAgICAgICAgLy8g5YWI55+lXG4gICAgICAgICAgICAgICAgbGV0IHNlZXJwYWxhY2UgPSByZXF1aXJlKFwic2VlcnBhbGFjZV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgc2VlcnBhbGFjZS5vcGVuU2VlcnBhbGFjZU1haW5XaW5kb3codHJ1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2NlbmVDb25zdC5DZW50ZXJTY2VuZUJ1aWxkLmZ1c2U6IHsgICAgICAgICAgICAgICAgICAgICAvLyDnpa3lnZtcbiAgICAgICAgICAgICAgICB2YXIgaGVyb19jdGwgPSByZXF1aXJlKFwiaGVyb19jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgaGVyb19jdGwub3Blbkhlcm9VcGdyYWRlU3RhckZ1c2VXaW5kb3codHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNjZW5lQ29uc3QuQ2VudGVyU2NlbmVCdWlsZC5hcmVuYTogeyAgICAgICAgICAgICAgICAgICAgLy8g56ue5oqAXG4gICAgICAgICAgICAgICAgdmFyIEFyZW5hQ29udHJvbGxlciA9IHJlcXVpcmUoXCJhcmVuYV9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgICAgIC8vIEFyZW5hQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLm9wZW5BcmVuYUxvb3BNYXRoV2luZG93KHRydWUsIHRoaXMucmVsZXZhbmNlX3BhcmFtcylcbiAgICAgICAgICAgICAgICBBcmVuYUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5yZXF1ZXN0T3BlbkFyZW5XaW5kb3codHJ1ZSwgZXh0ZW5kKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2VuZUNvbnN0LkNlbnRlclNjZW5lQnVpbGQuc3VtbW9uOiB7ICAgICAgICAgICAgICAgICAgIC8vIOWPrOWUpFxuICAgICAgICAgICAgICAgIHZhciBQYXJ0bmVyc3VtbW9uQ29udHJvbGxlciA9IHJlcXVpcmUoXCJwYXJ0bmVyc3VtbW9uX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICAgICAgUGFydG5lcnN1bW1vbkNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5vcGVuUGFydG5lclN1bW1vbldpbmRvdyh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2NlbmVDb25zdC5DZW50ZXJTY2VuZUJ1aWxkLnZpZGVvOiB7ICAgICAgICAgICAgICAgICAgICAvLyDlvZXlg49cblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2VuZUNvbnN0LkNlbnRlclNjZW5lQnVpbGQuc3RhcnRvd2VyOiB7ICAgICAgICAgICAgICAgIC8vIOaYn+WRveWhlFxuICAgICAgICAgICAgICAgIHZhciBCYXR0bGVjb25zdCA9IHJlcXVpcmUoXCJiYXR0bGVfY29uc3RcIik7XG4gICAgICAgICAgICAgICAgcmVxdWlyZShcIm1haW51aV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkucmVxdWVzdE9wZW5CYXR0bGVSZWxldmFuY2VXaW5kb3coQmF0dGxlY29uc3QuRmlnaHRfVHlwZS5TdGFyVG93ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2VuZUNvbnN0LkNlbnRlclNjZW5lQnVpbGQubWFsbDogeyAgICAgICAgICAgICAgICAgICAgIC8vIOmUu+mAoOWxi1xuICAgICAgICAgICAgICAgIHZhciBjb250cm9sbGVyID0gcmVxdWlyZShcImZvcmdlaG91c2VfY29udHJvbGxlclwiKVxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5vcGVuRm9yZ2VIb3VzZVZpZXcodHJ1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2NlbmVDb25zdC5DZW50ZXJTY2VuZUJ1aWxkLnZhcmlldHk6IHsgICAgICAgICAgICAgICAgICAvLyDmnYLotKflupdcbiAgICAgICAgICAgICAgICB2YXIgY29udHJvbGxlciA9IHJlcXVpcmUoXCJtYWxsX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9wZW5WYXJpZXR5U3RvcmVXaW5kb3dzKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2VuZUNvbnN0LkNlbnRlclNjZW5lQnVpbGQuZ3VpbGQ6IHsgICAgICAgICAgICAgICAgICAgIC8vIOelreWdm1xuICAgICAgICAgICAgICAgIHZhciBoZXJvX2N0bCA9IHJlcXVpcmUoXCJoZXJvX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICBoZXJvX2N0bC5vcGVuSGVyb1Jlc2V0V2luZG93KHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2VuZUNvbnN0LkNlbnRlclNjZW5lQnVpbGQuZXNjb3J0OiB7ICAgICAgICAgICAgICAgICAgIC8vIOa0u+WKqFxuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNjZW5lQ29uc3QuQ2VudGVyU2NlbmVCdWlsZC5saWJyYXJ5OiB7ICAgICAgICAgICAgICAgICAgIC8vIOWbvuS5pummhlxuICAgICAgICAgICAgICAgIHJlcXVpcmUoXCJoZXJvX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5vcGVuSGVyb0xpYnJhcnlNYWluV2luZG93KHRydWUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNjZW5lQ29uc3QuQ2VudGVyU2NlbmVCdWlsZC5hZHZlbnR1cmU6IHsgICAgICAgICAgICAgICAgICAgLy8g5YaS6ZmpXG4gICAgICAgICAgICAgICAgcmVxdWlyZShcImFkdmVudHVyZWFjdGl2aXR5X2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5vcGVuQWR2ZW50dXJlQWN0aXZpdHlNYWluV2luZG93KHRydWUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNjZW5lQ29uc3QuQ2VudGVyU2NlbmVCdWlsZC5sYWRkZXI6IHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2NlbmVDb25zdC5DZW50ZXJTY2VuZUJ1aWxkLmNyb3Nzc2hvdzoge1xuICAgICAgICAgICAgICAgIENyb3Nzc2hvd0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5vcGVuQ3Jvc3NzaG93TWFpbldpbmRvdyh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbGV2YW5jZV9wYXJhbXMgPSBudWxsO1xuICAgIH0sXG5cblxuICAgIC8qKkBkZXNjOuiuvue9ruW7uuetkee6oueCueeKtuaAgVxuICAgICAgICBhdXRob3I6e2F1dGhvcn1cbiAgICAgICAgdGltZToyMDE4LTA1LTI1IDE2OjUyOjQ3XG4gICAgICAgIC0tQGlkOlxuICAgICAgICAtLUBkYXRhOue6oueCueeKtuaAgeWPr+S7peaYr+WNleS4qiBib29sZWFuLOS5n+WPr+S7peaYryB7YmlkPVhYLHN0YXR1cz1ib29sZWFufSzkuZ/lj6/ku6XmmK9be2JpZD1YWCxzdGF0dXM9Ym9vbGVhbn0sIHtiaWQ9WVksc3RhdHVzPWJvb2xlYW59XSAs5YW25LuW5qC85byP5LiN5YGa5aSE55CGXG4gICAgICAgIHJldHVyblxuICAgICovXG4gICAgc2V0QnVpbGRSZWRTdGF0dXM6IGZ1bmN0aW9uIChpZCwgZGF0YSkge1xuICAgICAgICBpZiAoIXRoaXMuYnVpbGRfbGlzdF92byB8fCAhdGhpcy5idWlsZF9saXN0X3ZvW2lkXSkge1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuY2FjaGVfdGlwc19saXN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZV90aXBzX2xpc3QgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2FjaGVfdGlwc19saXN0W2lkXSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhY2hlX3RpcHNfbGlzdFtpZF0gPSB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2ID0gZGF0YVtpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHYuYmlkICE9IG51bGwgJiYgdHlwZW9mICh2LmJpZCkgPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZV90aXBzX2xpc3RbaWRdW3YuYmlkXSA9IHY7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2FjaGVfdGlwc19saXN0W2lkXSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhY2hlX3RpcHNfbGlzdFtpZF0gPSB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuYmlkICE9IG51bGwgJiYgdHlwZW9mIChkYXRhLmJpZCkgPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhY2hlX3RpcHNfbGlzdFtpZF1bZGF0YS5iaWRdID0gZGF0YTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVfdGlwc19saXN0W2lkXSA9IGRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjYy5sb2coXCLnvJPlrZjnmoTnuqLngrnnirbmgIFcIik7XG4gICAgICAgICAgICAvLyBjYy5sb2codGhpcy5jYWNoZV90aXBzX2xpc3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGJ1aWxkX3ZvID0gdGhpcy5idWlsZF9saXN0X3ZvW2lkXTtcbiAgICAgICAgICAgIGJ1aWxkX3ZvLnNldFRpcHNTdGF0dXMoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g55uR5rWL57qi54K5XG4gICAgICAgIHZhciBNYWludWlDb250cm9sbGVyID0gcmVxdWlyZShcIm1haW51aV9jb250cm9sbGVyXCIpXG4gICAgICAgIE1haW51aUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5jaGVja01haW5TY2VuZUljb25TdGF0dXMoKVxuICAgIH0sXG5cbiAgICAvL+iOt+WPluW7uuetkVxuICAgIGdldEJ1aWxkVm9MaXN0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkX2xpc3Rfdm9cbiAgICB9LFxuXG4gICAgZ2V0Q2VudGVyQ2l0eUJ1aWxkQnlJZDogZnVuY3Rpb24gKGlkLCBmaW5pc2hfY2IpIHtcbiAgICAgICAgaWYgKHRoaXMubWFpbl9zY2VuZSkge1xuICAgICAgICAgICAgdGhpcy5tYWluX3NjZW5lLmdldEJ1aWxkQnlJZChpZCwgZmluaXNoX2NiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpbmlzaF9kYXRhID0geyBpZDogaWQsIGZpbmlzaF9jYjogZmluaXNoX2NiIH07XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgbW92ZVRvQnVpbGQ6IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICBpZiAodGhpcy5tYWluX3NjZW5lKSB7XG4gICAgICAgICAgICB0aGlzLm1haW5fc2NlbmUubW92ZVRvQnVpbGQoaWQpO1xuICAgICAgICB9XG4gICAgfSxcblxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gTWFpblNjZW5lQ29udHJvbGxlcjtcbiJdfQ==