(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/mod/backpack/view/backpack_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, '5b39cJSdOdAzKauqpdNdx1I', 'backpack_window'); // Scripts/mod/backpack/view/backpack_window.js "use strict"; // -------------------------------------------------------------------- // @author: shiraho@syg.com(必填, 创建模块的人员) // @description: // 背包主界面 //
Create: new Date().toISOString() // -------------------------------------------------------------------- var PathTool = require("pathtool"); var BackPackController = require("backpack_controller"); var BackPackConst = require("backpack_const"); var CommonScrollView = require("common_scrollview"); var TipsConst = require("tips_const"); var BackpackEvent = require("backpack_event"); var GuideController = require("guide_controller"); var BackPackWindow = cc.Class({ "extends": BaseView, ctor: function ctor() { this.rleasePrefab = false; this.prefabPath = PathTool.getPrefabPath("backpack", "backpack_window"); this.viewTag = SCENE_TAG.ui; this.win_type = WinType.Full; }, initConfig: function initConfig() { this.panel_list = {}; this.tab_list = {}; this.min_size = 30; // 每一页最小的物品数目 this.col_size = 5; // 一行最多 this.normal_color = new cc.Color(0xd3, 0xb4, 0x9b, 0xff); this.normal_outlinecolor = new cc.Color(0x40, 0x22, 0x15, 0xff); this.select_color = new cc.Color(0xff, 0xff, 0xff, 0xff); this.select_outlinecolor = new cc.Color(0x6d, 0x35, 0x07, 0xff); }, openCallBack: function openCallBack() { var title_list = [Utils.TI18N("装备"), Utils.TI18N("道具"), Utils.TI18N("碎片"), Utils.TI18N("特殊")]; this.mainContainer = this.root_wnd.getChildByName("main_container"); this.title_effect = this.mainContainer.getChildByName("title_img").getComponent(sp.Skeleton); var anima_path = PathTool.getSpinePath(PathTool.getEffectRes(640), "action"); this.loadRes(anima_path, function (ske_data) { this.title_effect.skeletonData = ske_data; this.title_effect.setAnimation(0, PlayerAction.stand, true); }.bind(this)); this.background = this.seekChild("background"); this.background.scale = FIT_SCALE; var tab_container = this.seekChild("tab_container"); for (var index = 0; index < 4; index++) { var object = {}; var new_index = index + 1; object.btn = tab_container.getChildByName("tab_btn_" + new_index); //获取主节点 object.normal = object.btn.getChildByName("normal"); //普通状态 object.select = object.btn.getChildByName("select"); //选中状态 object.red_point = object.btn.getChildByName("red_point"); //红点 object.title = object.btn.getChildByName("label"); //label对象 object.title_label = object.title.getComponent(cc.Label); //label object.title_outline = object.title.getComponent(cc.LabelOutline); //描边 object.title_label.string = title_list[index]; object.index = new_index; this.tab_list[new_index] = object; } var container = this.seekChild("container"); var scroll_view_size = cc.size(620, 600); var setting = { item_class: "backpack_item", // 单元类 start_x: 0, // 第一个单元的X起点 space_x: 4, // x方向的间隔 start_y: 0, // 第一个单元的Y起点 space_y: 10, // y方向的间隔 item_width: 120, // 单元的尺寸width item_height: 120, // 单元的尺寸height row: 5, // 行数,作用于水平滚动类型 col: 5, // 列数,作用于垂直滚动类型 once_num: 5, need_dynamic: true }; this.item_scrollview = new CommonScrollView(); this.item_scrollview.createScroll(container, cc.v2(0, -30), ScrollViewDir.vertical, ScrollViewStartPos.top, scroll_view_size, setting, cc.v2(0.5, 0.5)); if (GuideController.getInstance().isInGuide()) this.item_scrollview.setClickEnabled(false); }, registerEvent: function registerEvent() { var _this = this; var _loop = function _loop() { var element = _this.tab_list[key]; if (element.btn) { element.btn.on(cc.Node.EventType.TOUCH_END, function (event) { this.changeTabView(element.index); }.bind(_this)); } }; for (var key in this.tab_list) { _loop(); } this.addGlobalEvent(EventId.ADD_GOODS, function (bag_code, item_list) { this.updateBackPack(bag_code, item_list); }.bind(this)); this.addGlobalEvent(EventId.DELETE_GOODS, function (bag_code, item_list) { this.updateBackPack(bag_code, item_list); }.bind(this)); this.addGlobalEvent(EventId.MODIFY_GOODS_NUM, function (bag_code, item_list) { this.updateBackPack(bag_code, item_list); if (this.cur_index == 3) { this.isCompRedPoint(); } }.bind(this)); this.addGlobalEvent(BackpackEvent.Compose_BackPack_Success, function () { this.isCompRedPoint(); this.setPanelData(); }.bind(this)); }, openRootWnd: function openRootWnd(params) { var index = params || BackPackConst.item_tab_type.EQUIPS; this.changeTabView(index); this.isCompRedPoint(); }, // --判断碎片是否显示红点 isCompRedPoint: function isCompRedPoint() { var self = this; var item_list = BackPackController.getInstance().getModel().getAllBackPackArray(3); var status = false; var partner_config = Config.partner_data.data_get_compound_info; for (var i = 0; i < item_list.length; ++i) { var v = item_list[i]; if (v.quality != -1 && v.base_id) { if (partner_config[v.base_id]) { if (v.quantity >= partner_config[v.base_id].num) { status = true; break; } } // --神器的时候 // let hallow_list = BackpackController:getModel():getHallowsCompData(v.base_id) // if hallow_list and next(hallow_list) ~= nil then // if v.quantity >= hallow_list.num then // status = true // break // end // end } } self.tab_list[3].red_point.active = status; //--仅碎片需要红点显示 }, /** * 切换标签页 * @param {*} index */ changeTabView: function changeTabView(index) { if (this.cur_index == index) { return; } if (this.cur_tab) { this.cur_tab.select.active = false; this.cur_tab.title.color = this.normal_color; this.cur_tab.title_outline.color = this.normal_outlinecolor; } this.cur_index = index; this.cur_tab = this.tab_list[index]; if (this.cur_tab) { this.cur_tab.select.active = true; this.cur_tab.title.color = this.select_color; this.cur_tab.title_outline.color = this.select_outlinecolor; } this.setPanelData(); }, /** * 设置当前显示标签页内容 */ setPanelData: function setPanelData() { if (this.cur_index == null) { return; } if (this.cur_index == BackPackConst.item_tab_type.HERO) { this.item_scrollview.setSpaceY(30, true); } else { this.item_scrollview.setSpaceY(10); } var item_list = BackPackController.getInstance().getModel().getAllBackPackArray(this.cur_index); // 这个是一个数组 var item_total_length = item_list.length; // 不足30个补满30个.不足5的倍数,补满5的倍数 this.min_size = item_total_length; if (this.min_size < 30) { this.min_size = 30; } else if (this.min_size % this.col_size != 0) { this.min_size = this.min_size + this.col_size - this.min_size % this.col_size; } // 需要填充的数量 var fill_num = this.min_size - item_total_length; if (fill_num > 0) { for (var index = 0; index < fill_num; index++) { item_list.push({ sort: -1, quality: -1, undata: true }); } } var callback = function (cell) { this.selectedItem(cell); }.bind(this); var sort_func = null; if (this.cur_index == BackPackConst.item_tab_type.EQUIPS) { sort_func = Utils.tableUpperSorter(["quality", "sort"]); } else if (this.cur_index == BackPackConst.item_tab_type.PROPS) { sort_func = Utils.tableUpperSorter(["quality", "sort", "base_id"]); } else if (this.cur_index == BackPackConst.item_tab_type.SPECIAL) { // 特殊分页只有符文,星级越大的放前面 sort_func = function sort_func(objA, objB) { return objA.quality > objB.quality ? -1 : 1; }; } else if (this.cur_index == BackPackConst.item_tab_type.HERO) { var checkIsFull = function checkIsFull(data) { var is_full = false; if (data.quality != -1 && data.base_id) { if (Config.partner_data.data_get_compound_info[data.base_id]) { if (data.quantity >= Config.partner_data.data_get_compound_info[data.base_id].num) { is_full = true; } } } return is_full; }; var sortFunc = function sortFunc(objA, objB) { if (checkIsFull(objA) && !checkIsFull(objB)) { return -1; } else if (!checkIsFull(objA) && checkIsFull(objB)) { return 1; } else { if (objA.quality != -1 && objA.base_id && objB.quality != -1 && objB.base_id) { if (objA.quality == objB.quality) { return objA.base_id < objB.base_id ? -1 : 1; } else { return objA.quality > objB.quality ? -1 : 1; } } else if (objA.quality != -1 && objA.base_id && objB.quality == -1) { return -1; } else if (objA.quality == -1 && objB.quality != -1 && objB.base_id) { return 1; } else { return 1; } } }; sort_func = sortFunc; // --英雄碎片需要取消红点 var MainuiController = require("mainui_controller"); var MainuiConst = require("mainui_const"); MainuiController.getInstance().setBtnRedPoint(MainuiConst.btn_index.backpack, false); } else { sort_func = Utils.tableUpperSorter(["sort", "quality"]); } item_list.sort(sort_func); var ext = { is_other: false, scale: 1, effect: false, is_show_tips: false, is_show_chip_loading: true }; if (this.cur_index == 3) { ext.is_comp_num = true; } else { ext.is_comp_num = false; } this.item_scrollview.setData(item_list, callback, ext); }, // 点击返回,显示tips selectedItem: function selectedItem(cell) { if (cell == null) return; var data = cell.getItemData(); if (data == null) return; var data_config = cell.getItemConfig(); if (data_config == null) return; var TipsController = require("tips_controller"); if (BackPackConst.checkIsEquip(data_config.type)) { // 装备 TipsController.getInstance().showEquipTips(data, TipsConst.eqmTips.backpack); } else if (data_config.type == BackPackConst.item_type.ARTIFACTCHIPS) { // 符文 var PartnerConst = require("partner_const"); require("hero_controller").getInstance().openArtifactTipsWindow(true, data, PartnerConst.ArtifactTips.backpack); } else if (data_config.sub_type == BackPackConst.item_tab_type.HERO) { // 碎片 TipsController.getInstance().showBackPackCompTips(true, data.base_id); } else if (BackPackConst.checkIsHeroSkin(data_config.type)) { var HeroController = require("hero_controller"); var PartnerConst = require("partner_const"); //皮肤 HeroController.getInstance().openHeroSkinTipsPanel(true, data, PartnerConst.EqmTips.backpack); } else { TipsController.getInstance().showGoodsTips(data, true); } }, updateBackPack: function updateBackPack(bag_code, item_list) { if (this.cur_index == null) return; if (this.cur_index == BackPackConst.item_tab_type.EQUIPS) { if (bag_code != BackPackConst.Bag_Code.EQUIPS) return; } else { if (bag_code == BackPackConst.Bag_Code.EQUIPS) return; } if (item_list == null || Object.keys(item_list).length == 0) return; var can_update = false; for (var key in item_list) { var vo = item_list[key]; if (vo.sub_type == this.cur_index) { can_update = true; break; } } if (can_update) { this.setPanelData(); } }, closeCallBack: function closeCallBack() { BackPackController.getInstance().openMainWindow(false); if (this.item_scrollview) { this.item_scrollview.DeleteMe(); } this.item_scrollview = null; } }); 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxiYWNrcGFja1xcdmlld1xcYmFja3BhY2tfd2luZG93LmpzIl0sIm5hbWVzIjpbIlBhdGhUb29sIiwicmVxdWlyZSIsIkJhY2tQYWNrQ29udHJvbGxlciIsIkJhY2tQYWNrQ29uc3QiLCJDb21tb25TY3JvbGxWaWV3IiwiVGlwc0NvbnN0IiwiQmFja3BhY2tFdmVudCIsIkd1aWRlQ29udHJvbGxlciIsIkJhY2tQYWNrV2luZG93IiwiY2MiLCJDbGFzcyIsIkJhc2VWaWV3IiwiY3RvciIsInJsZWFzZVByZWZhYiIsInByZWZhYlBhdGgiLCJnZXRQcmVmYWJQYXRoIiwidmlld1RhZyIsIlNDRU5FX1RBRyIsInVpIiwid2luX3R5cGUiLCJXaW5UeXBlIiwiRnVsbCIsImluaXRDb25maWciLCJwYW5lbF9saXN0IiwidGFiX2xpc3QiLCJtaW5fc2l6ZSIsImNvbF9zaXplIiwibm9ybWFsX2NvbG9yIiwiQ29sb3IiLCJub3JtYWxfb3V0bGluZWNvbG9yIiwic2VsZWN0X2NvbG9yIiwic2VsZWN0X291dGxpbmVjb2xvciIsIm9wZW5DYWxsQmFjayIsInRpdGxlX2xpc3QiLCJVdGlscyIsIlRJMThOIiwibWFpbkNvbnRhaW5lciIsInJvb3Rfd25kIiwiZ2V0Q2hpbGRCeU5hbWUiLCJ0aXRsZV9lZmZlY3QiLCJnZXRDb21wb25lbnQiLCJzcCIsIlNrZWxldG9uIiwiYW5pbWFfcGF0aCIsImdldFNwaW5lUGF0aCIsImdldEVmZmVjdFJlcyIsImxvYWRSZXMiLCJza2VfZGF0YSIsInNrZWxldG9uRGF0YSIsInNldEFuaW1hdGlvbiIsIlBsYXllckFjdGlvbiIsInN0YW5kIiwiYmluZCIsImJhY2tncm91bmQiLCJzZWVrQ2hpbGQiLCJzY2FsZSIsIkZJVF9TQ0FMRSIsInRhYl9jb250YWluZXIiLCJpbmRleCIsIm9iamVjdCIsIm5ld19pbmRleCIsImJ0biIsIm5vcm1hbCIsInNlbGVjdCIsInJlZF9wb2ludCIsInRpdGxlIiwidGl0bGVfbGFiZWwiLCJMYWJlbCIsInRpdGxlX291dGxpbmUiLCJMYWJlbE91dGxpbmUiLCJzdHJpbmciLCJjb250YWluZXIiLCJzY3JvbGxfdmlld19zaXplIiwic2l6ZSIsInNldHRpbmciLCJpdGVtX2NsYXNzIiwic3RhcnRfeCIsInNwYWNlX3giLCJzdGFydF95Iiwic3BhY2VfeSIsIml0ZW1fd2lkdGgiLCJpdGVtX2hlaWdodCIsInJvdyIsImNvbCIsIm9uY2VfbnVtIiwibmVlZF9keW5hbWljIiwiaXRlbV9zY3JvbGx2aWV3IiwiY3JlYXRlU2Nyb2xsIiwidjIiLCJTY3JvbGxWaWV3RGlyIiwidmVydGljYWwiLCJTY3JvbGxWaWV3U3RhcnRQb3MiLCJ0b3AiLCJnZXRJbnN0YW5jZSIsImlzSW5HdWlkZSIsInNldENsaWNrRW5hYmxlZCIsInJlZ2lzdGVyRXZlbnQiLCJlbGVtZW50Iiwia2V5Iiwib24iLCJOb2RlIiwiRXZlbnRUeXBlIiwiVE9VQ0hfRU5EIiwiZXZlbnQiLCJjaGFuZ2VUYWJWaWV3IiwiYWRkR2xvYmFsRXZlbnQiLCJFdmVudElkIiwiQUREX0dPT0RTIiwiYmFnX2NvZGUiLCJpdGVtX2xpc3QiLCJ1cGRhdGVCYWNrUGFjayIsIkRFTEVURV9HT09EUyIsIk1PRElGWV9HT09EU19OVU0iLCJjdXJfaW5kZXgiLCJpc0NvbXBSZWRQb2ludCIsIkNvbXBvc2VfQmFja1BhY2tfU3VjY2VzcyIsInNldFBhbmVsRGF0YSIsIm9wZW5Sb290V25kIiwicGFyYW1zIiwiaXRlbV90YWJfdHlwZSIsIkVRVUlQUyIsInNlbGYiLCJnZXRNb2RlbCIsImdldEFsbEJhY2tQYWNrQXJyYXkiLCJzdGF0dXMiLCJwYXJ0bmVyX2NvbmZpZyIsIkNvbmZpZyIsInBhcnRuZXJfZGF0YSIsImRhdGFfZ2V0X2NvbXBvdW5kX2luZm8iLCJpIiwibGVuZ3RoIiwidiIsInF1YWxpdHkiLCJiYXNlX2lkIiwicXVhbnRpdHkiLCJudW0iLCJhY3RpdmUiLCJjdXJfdGFiIiwiY29sb3IiLCJIRVJPIiwic2V0U3BhY2VZIiwiaXRlbV90b3RhbF9sZW5ndGgiLCJmaWxsX251bSIsInB1c2giLCJzb3J0IiwidW5kYXRhIiwiY2FsbGJhY2siLCJjZWxsIiwic2VsZWN0ZWRJdGVtIiwic29ydF9mdW5jIiwidGFibGVVcHBlclNvcnRlciIsIlBST1BTIiwiU1BFQ0lBTCIsIm9iakEiLCJvYmpCIiwiY2hlY2tJc0Z1bGwiLCJkYXRhIiwiaXNfZnVsbCIsInNvcnRGdW5jIiwiTWFpbnVpQ29udHJvbGxlciIsIk1haW51aUNvbnN0Iiwic2V0QnRuUmVkUG9pbnQiLCJidG5faW5kZXgiLCJiYWNrcGFjayIsImV4dCIsImlzX290aGVyIiwiZWZmZWN0IiwiaXNfc2hvd190aXBzIiwiaXNfc2hvd19jaGlwX2xvYWRpbmciLCJpc19jb21wX251bSIsInNldERhdGEiLCJnZXRJdGVtRGF0YSIsImRhdGFfY29uZmlnIiwiZ2V0SXRlbUNvbmZpZyIsIlRpcHNDb250cm9sbGVyIiwiY2hlY2tJc0VxdWlwIiwidHlwZSIsInNob3dFcXVpcFRpcHMiLCJlcW1UaXBzIiwiaXRlbV90eXBlIiwiQVJUSUZBQ1RDSElQUyIsIlBhcnRuZXJDb25zdCIsIm9wZW5BcnRpZmFjdFRpcHNXaW5kb3ciLCJBcnRpZmFjdFRpcHMiLCJzdWJfdHlwZSIsInNob3dCYWNrUGFja0NvbXBUaXBzIiwiY2hlY2tJc0hlcm9Ta2luIiwiSGVyb0NvbnRyb2xsZXIiLCJvcGVuSGVyb1NraW5UaXBzUGFuZWwiLCJFcW1UaXBzIiwic2hvd0dvb2RzVGlwcyIsIkJhZ19Db2RlIiwiT2JqZWN0Iiwia2V5cyIsImNhbl91cGRhdGUiLCJ2byIsImNsb3NlQ2FsbEJhY2siLCJvcGVuTWFpbldpbmRvdyIsIkRlbGV0ZU1lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLFFBQVEsR0FBR0MsT0FBTyxDQUFDLFVBQUQsQ0FBdEI7O0FBQ0EsSUFBSUMsa0JBQWtCLEdBQUdELE9BQU8sQ0FBQyxxQkFBRCxDQUFo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Q0g7QUFyVHlCLENBQVQsQ0FBckIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBAYXV0aG9yOiBzaGlyYWhvQHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAgIOiDjOWMheS4u+eVjOmdolxuLy8gPGJyLz5DcmVhdGU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBQYXRoVG9vbCA9IHJlcXVpcmUoXCJwYXRodG9vbFwiKTtcbnZhciBCYWNrUGFja0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiYmFja3BhY2tfY29udHJvbGxlclwiKTtcbnZhciBCYWNrUGFja0NvbnN0ID0gcmVxdWlyZShcImJhY2twYWNrX2NvbnN0XCIpO1xudmFyIENvbW1vblNjcm9sbFZpZXcgPSByZXF1aXJlKFwiY29tbW9uX3Njcm9sbHZpZXdcIik7XG52YXIgVGlwc0NvbnN0ID0gcmVxdWlyZShcInRpcHNfY29uc3RcIik7XG52YXIgQmFja3BhY2tFdmVudCA9IHJlcXVpcmUoXCJiYWNrcGFja19ldmVudFwiKTtcbnZhciBHdWlkZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwiZ3VpZGVfY29udHJvbGxlclwiKTtcblxudmFyIEJhY2tQYWNrV2luZG93ID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VWaWV3LFxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5ybGVhc2VQcmVmYWIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wcmVmYWJQYXRoID0gUGF0aFRvb2wuZ2V0UHJlZmFiUGF0aChcImJhY2twYWNrXCIsIFwiYmFja3BhY2tfd2luZG93XCIpO1xuICAgICAgICB0aGlzLnZpZXdUYWcgPSBTQ0VORV9UQUcudWk7XG4gICAgICAgIHRoaXMud2luX3R5cGUgPSBXaW5UeXBlLkZ1bGw7XG4gICAgfSxcblxuICAgIGluaXRDb25maWc6IGZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMucGFuZWxfbGlzdCA9IHt9O1xuICAgICAgICB0aGlzLnRhYl9saXN0ID0ge307XG4gICAgICAgIHRoaXMubWluX3NpemUgPSAzMDsgICAgIC8vIOavj+S4gOmhteacgOWwj+eahOeJqeWTgeaVsOebrlxuICAgICAgICB0aGlzLmNvbF9zaXplID0gNTsgICAgICAvLyDkuIDooYzmnIDlpJpcbiAgICAgICAgdGhpcy5ub3JtYWxfY29sb3IgPSBuZXcgY2MuQ29sb3IoMHhkMywgMHhiNCwgMHg5YiwgMHhmZilcbiAgICAgICAgdGhpcy5ub3JtYWxfb3V0bGluZWNvbG9yID0gbmV3IGNjLkNvbG9yKDB4NDAsIDB4MjIsIDB4MTUsIDB4ZmYpXG4gICAgICAgIHRoaXMuc2VsZWN0X2NvbG9yID0gbmV3IGNjLkNvbG9yKDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYpXG4gICAgICAgIHRoaXMuc2VsZWN0X291dGxpbmVjb2xvciA9IG5ldyBjYy5Db2xvcigweDZkLCAweDM1LCAweDA3LCAweGZmKVxuICAgIH0sXG5cbiAgICBvcGVuQ2FsbEJhY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHRpdGxlX2xpc3QgPSBbVXRpbHMuVEkxOE4oXCLoo4XlpIdcIiksIFV0aWxzLlRJMThOKFwi6YGT5YW3XCIpLCBVdGlscy5USTE4TihcIueijueJh1wiKSwgVXRpbHMuVEkxOE4oXCLnibnmropcIildXG4gICAgICAgIFxuICAgICAgICB0aGlzLm1haW5Db250YWluZXIgPSB0aGlzLnJvb3Rfd25kLmdldENoaWxkQnlOYW1lKFwibWFpbl9jb250YWluZXJcIik7XG4gICAgICAgIHRoaXMudGl0bGVfZWZmZWN0ID0gdGhpcy5tYWluQ29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwidGl0bGVfaW1nXCIpLmdldENvbXBvbmVudChzcC5Ta2VsZXRvbik7XG4gICAgICAgIHZhciBhbmltYV9wYXRoID0gUGF0aFRvb2wuZ2V0U3BpbmVQYXRoKFBhdGhUb29sLmdldEVmZmVjdFJlcyg2NDApLCBcImFjdGlvblwiKTtcbiAgICAgICAgdGhpcy5sb2FkUmVzKGFuaW1hX3BhdGgsIGZ1bmN0aW9uKHNrZV9kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnRpdGxlX2VmZmVjdC5za2VsZXRvbkRhdGEgPSBza2VfZGF0YTtcbiAgICAgICAgICAgIHRoaXMudGl0bGVfZWZmZWN0LnNldEFuaW1hdGlvbigwLCBQbGF5ZXJBY3Rpb24uc3RhbmQsIHRydWUpO1xuICAgICAgICB9LmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuYmFja2dyb3VuZCA9IHRoaXMuc2Vla0NoaWxkKFwiYmFja2dyb3VuZFwiKTtcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kLnNjYWxlID0gRklUX1NDQUxFO1xuXG4gICAgICAgIHZhciB0YWJfY29udGFpbmVyID0gdGhpcy5zZWVrQ2hpbGQoXCJ0YWJfY29udGFpbmVyXCIpXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCA0OyBpbmRleCsrKSB7XG4gICAgICAgICAgICB2YXIgb2JqZWN0ID0ge31cbiAgICAgICAgICAgIHZhciBuZXdfaW5kZXggPSBpbmRleCArIDFcbiAgICAgICAgICAgIG9iamVjdC5idG4gPSB0YWJfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwidGFiX2J0bl9cIiArIG5ld19pbmRleCkgICAgICAgLy/ojrflj5bkuLvoioLngrlcbiAgICAgICAgICAgIG9iamVjdC5ub3JtYWwgPSBvYmplY3QuYnRuLmdldENoaWxkQnlOYW1lKFwibm9ybWFsXCIpICAgICAgICAgICAgICAgICAgICAgLy/mma7pgJrnirbmgIFcbiAgICAgICAgICAgIG9iamVjdC5zZWxlY3QgPSBvYmplY3QuYnRuLmdldENoaWxkQnlOYW1lKFwic2VsZWN0XCIpICAgICAgICAgICAgICAgICAgICAgLy/pgInkuK3nirbmgIFcbiAgICAgICAgICAgIG9iamVjdC5yZWRfcG9pbnQgPSBvYmplY3QuYnRuLmdldENoaWxkQnlOYW1lKFwicmVkX3BvaW50XCIpICAgICAgICAgICAgICAgLy/nuqLngrlcbiAgICAgICAgICAgIG9iamVjdC50aXRsZSA9IG9iamVjdC5idG4uZ2V0Q2hpbGRCeU5hbWUoXCJsYWJlbFwiKSAgICAgICAgICAgICAgICAgICAgICAgLy9sYWJlbOWvueixoVxuICAgICAgICAgICAgb2JqZWN0LnRpdGxlX2xhYmVsID0gb2JqZWN0LnRpdGxlLmdldENvbXBvbmVudChjYy5MYWJlbCkgICAgICAgICAgICAgICAgLy9sYWJlbFxuICAgICAgICAgICAgb2JqZWN0LnRpdGxlX291dGxpbmUgPSBvYmplY3QudGl0bGUuZ2V0Q29tcG9uZW50KGNjLkxhYmVsT3V0bGluZSkgICAgICAgLy/mj4/ovrlcbiAgICAgICAgICAgIG9iamVjdC50aXRsZV9sYWJlbC5zdHJpbmcgPSB0aXRsZV9saXN0W2luZGV4XVxuICAgICAgICAgICAgb2JqZWN0LmluZGV4ID0gbmV3X2luZGV4XG4gICAgICAgICAgICB0aGlzLnRhYl9saXN0W25ld19pbmRleF0gPSBvYmplY3Q7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5zZWVrQ2hpbGQoXCJjb250YWluZXJcIilcbiAgICAgICAgdmFyIHNjcm9sbF92aWV3X3NpemUgPSBjYy5zaXplKDYyMCw2MDApXG4gICAgICAgIHZhciBzZXR0aW5nID0ge1xuICAgICAgICAgICAgaXRlbV9jbGFzczogXCJiYWNrcGFja19pdGVtXCIsICAgICAgLy8g5Y2V5YWD57G7XG4gICAgICAgICAgICBzdGFydF94OiAwLCAgICAgICAgICAgICAgICAgICAgLy8g56ys5LiA5Liq5Y2V5YWD55qEWOi1t+eCuVxuICAgICAgICAgICAgc3BhY2VfeDogNCwgICAgICAgICAgICAgICAgICAgIC8vIHjmlrnlkJHnmoTpl7TpmpRcbiAgICAgICAgICAgIHN0YXJ0X3k6IDAsICAgICAgICAgICAgICAgICAgICAvLyDnrKzkuIDkuKrljZXlhYPnmoRZ6LW354K5XG4gICAgICAgICAgICBzcGFjZV95OiAxMCwgICAgICAgICAgICAgICAgICAgLy8geeaWueWQkeeahOmXtOmalFxuICAgICAgICAgICAgaXRlbV93aWR0aDogMTIwLCAgICAgICAgICAgICAgIC8vIOWNleWFg+eahOWwuuWvuHdpZHRoXG4gICAgICAgICAgICBpdGVtX2hlaWdodDogMTIwLCAgICAgICAgICAgICAgLy8g5Y2V5YWD55qE5bC65a+4aGVpZ2h0XG4gICAgICAgICAgICByb3c6IDUsICAgICAgICAgICAgICAgICAgICAgICAgLy8g6KGM5pWw77yM5L2c55So5LqO5rC05bmz5rua5Yqo57G75Z6LXG4gICAgICAgICAgICBjb2w6IDUsICAgICAgICAgICAgICAgICAgICAgICAgLy8g5YiX5pWw77yM5L2c55So5LqO5Z6C55u05rua5Yqo57G75Z6LXG4gICAgICAgICAgICBvbmNlX251bTogNSxcbiAgICAgICAgICAgIG5lZWRfZHluYW1pYzogdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXRlbV9zY3JvbGx2aWV3ID0gbmV3IENvbW1vblNjcm9sbFZpZXcoKVxuICAgICAgICB0aGlzLml0ZW1fc2Nyb2xsdmlldy5jcmVhdGVTY3JvbGwoY29udGFpbmVyLCBjYy52MigwLCAtMzApLCBTY3JvbGxWaWV3RGlyLnZlcnRpY2FsLCBTY3JvbGxWaWV3U3RhcnRQb3MudG9wLCBzY3JvbGxfdmlld19zaXplLCBzZXR0aW5nLCBjYy52MigwLjUsMC41KSlcblxuICAgICAgICBpZiAoR3VpZGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuaXNJbkd1aWRlKCkpXG4gICAgICAgICAgICB0aGlzLml0ZW1fc2Nyb2xsdmlldy5zZXRDbGlja0VuYWJsZWQoZmFsc2UpO1xuICAgIH0sXG5cbiAgICByZWdpc3RlckV2ZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvcih2YXIga2V5IGluIHRoaXMudGFiX2xpc3Qpe1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMudGFiX2xpc3Rba2V5XVxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuYnRuKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5idG4ub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCAoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlVGFiVmlldyhlbGVtZW50LmluZGV4KVxuICAgICAgICAgICAgICAgIH0pLmJpbmQodGhpcykpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChFdmVudElkLkFERF9HT09EUywgZnVuY3Rpb24gKGJhZ19jb2RlLCBpdGVtX2xpc3Qpe1xuICAgICAgICAgICAgdGhpcy51cGRhdGVCYWNrUGFjayhiYWdfY29kZSwgaXRlbV9saXN0KVxuICAgICAgICB9LmJpbmQodGhpcykpXG5cbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChFdmVudElkLkRFTEVURV9HT09EUywgZnVuY3Rpb24gKGJhZ19jb2RlLCBpdGVtX2xpc3QpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQmFja1BhY2soYmFnX2NvZGUsIGl0ZW1fbGlzdClcbiAgICAgICAgfS5iaW5kKHRoaXMpKVxuXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoRXZlbnRJZC5NT0RJRllfR09PRFNfTlVNLCBmdW5jdGlvbiAoYmFnX2NvZGUsIGl0ZW1fbGlzdCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVCYWNrUGFjayhiYWdfY29kZSwgaXRlbV9saXN0KVxuICAgICAgICAgICAgaWYodGhpcy5jdXJfaW5kZXggPT0gMyl7IFxuICAgICAgICAgICAgICAgIHRoaXMuaXNDb21wUmVkUG9pbnQoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9LmJpbmQodGhpcykpXG5cbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChCYWNrcGFja0V2ZW50LkNvbXBvc2VfQmFja1BhY2tfU3VjY2VzcywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5pc0NvbXBSZWRQb2ludCgpO1xuICAgICAgICAgICAgdGhpcy5zZXRQYW5lbERhdGEoKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgIH0sXG5cbiAgICBvcGVuUm9vdFduZDogZnVuY3Rpb24gKHBhcmFtcyl7XG4gICAgICAgIHZhciBpbmRleCA9IHBhcmFtcyB8fCBCYWNrUGFja0NvbnN0Lml0ZW1fdGFiX3R5cGUuRVFVSVBTXG4gICAgICAgIHRoaXMuY2hhbmdlVGFiVmlldyhpbmRleClcbiAgICAgICAgdGhpcy5pc0NvbXBSZWRQb2ludCgpXG4gICAgfSxcbiAgICAvLyAtLeWIpOaWreeijueJh+aYr+WQpuaYvuekuue6oueCuVxuICAgIGlzQ29tcFJlZFBvaW50KCl7XG4gICAgICAgIHZhciBzZWxmID0gdGhpc1xuICAgICAgICBsZXQgaXRlbV9saXN0ID0gQmFja1BhY2tDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5nZXRBbGxCYWNrUGFja0FycmF5KDMpXG4gICAgICAgIGxldCBzdGF0dXMgPSBmYWxzZVxuICAgICAgICBsZXQgcGFydG5lcl9jb25maWcgPSBDb25maWcucGFydG5lcl9kYXRhLmRhdGFfZ2V0X2NvbXBvdW5kX2luZm9cbiAgICAgICAgZm9yKGxldCBpPTA7aTxpdGVtX2xpc3QubGVuZ3RoOysraSl7XG4gICAgICAgICAgICBsZXQgdiA9IGl0ZW1fbGlzdFtpXVxuICAgICAgICAgICAgaWYodi5xdWFsaXR5ICE9IC0xICYmIHYuYmFzZV9pZCl7XG4gICAgICAgICAgICAgICAgaWYocGFydG5lcl9jb25maWdbdi5iYXNlX2lkXSl7XG4gICAgICAgICAgICAgICAgICAgIGlmKHYucXVhbnRpdHkgPj0gcGFydG5lcl9jb25maWdbdi5iYXNlX2lkXS5udW0pe1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyAtLeelnuWZqOeahOaXtuWAmVxuICAgICAgICAgICAgICAgIC8vIGxldCBoYWxsb3dfbGlzdCA9IEJhY2twYWNrQ29udHJvbGxlcjpnZXRNb2RlbCgpOmdldEhhbGxvd3NDb21wRGF0YSh2LmJhc2VfaWQpXG4gICAgICAgICAgICAgICAgLy8gaWYgaGFsbG93X2xpc3QgYW5kIG5leHQoaGFsbG93X2xpc3QpIH49IG5pbCB0aGVuXG4gICAgICAgICAgICAgICAgLy8gICAgIGlmIHYucXVhbnRpdHkgPj0gaGFsbG93X2xpc3QubnVtIHRoZW5cbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIHN0YXR1cyA9IHRydWVcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgLy8gICAgIGVuZFxuICAgICAgICAgICAgICAgIC8vIGVuZFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNlbGYudGFiX2xpc3RbM10ucmVkX3BvaW50LmFjdGl2ZSA9IHN0YXR1cyAvLy0t5LuF56KO54mH6ZyA6KaB57qi54K55pi+56S6XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDliIfmjaLmoIfnrb7pobVcbiAgICAgKiBAcGFyYW0geyp9IGluZGV4IFxuICAgICAqL1xuICAgIGNoYW5nZVRhYlZpZXc6ZnVuY3Rpb24oaW5kZXgpe1xuICAgICAgICBpZih0aGlzLmN1cl9pbmRleCA9PSBpbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmN1cl90YWIpe1xuICAgICAgICAgICAgdGhpcy5jdXJfdGFiLnNlbGVjdC5hY3RpdmUgPSBmYWxzZVxuICAgICAgICAgICAgdGhpcy5jdXJfdGFiLnRpdGxlLmNvbG9yID0gdGhpcy5ub3JtYWxfY29sb3JcbiAgICAgICAgICAgIHRoaXMuY3VyX3RhYi50aXRsZV9vdXRsaW5lLmNvbG9yID0gdGhpcy5ub3JtYWxfb3V0bGluZWNvbG9yXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdXJfaW5kZXggPSBpbmRleFxuICAgICAgICB0aGlzLmN1cl90YWIgPSB0aGlzLnRhYl9saXN0W2luZGV4XVxuICAgICAgICBpZiAodGhpcy5jdXJfdGFiKSB7XG4gICAgICAgICAgICB0aGlzLmN1cl90YWIuc2VsZWN0LmFjdGl2ZSA9IHRydWVcbiAgICAgICAgICAgIHRoaXMuY3VyX3RhYi50aXRsZS5jb2xvciA9IHRoaXMuc2VsZWN0X2NvbG9yXG4gICAgICAgICAgICB0aGlzLmN1cl90YWIudGl0bGVfb3V0bGluZS5jb2xvciA9IHRoaXMuc2VsZWN0X291dGxpbmVjb2xvclxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0UGFuZWxEYXRhKClcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog6K6+572u5b2T5YmN5pi+56S65qCH562+6aG15YaF5a65XG4gICAgICovXG4gICAgc2V0UGFuZWxEYXRhOmZ1bmN0aW9uKCl7XG4gICAgICAgIGlmKHRoaXMuY3VyX2luZGV4ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jdXJfaW5kZXggPT0gQmFja1BhY2tDb25zdC5pdGVtX3RhYl90eXBlLkhFUk8pIHtcbiAgICAgICAgICAgIHRoaXMuaXRlbV9zY3JvbGx2aWV3LnNldFNwYWNlWSgzMCx0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaXRlbV9zY3JvbGx2aWV3LnNldFNwYWNlWSgxMCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaXRlbV9saXN0ID0gQmFja1BhY2tDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5nZXRBbGxCYWNrUGFja0FycmF5KHRoaXMuY3VyX2luZGV4KSAgICAgLy8g6L+Z5Liq5piv5LiA5Liq5pWw57uEXG4gICAgICAgIHZhciBpdGVtX3RvdGFsX2xlbmd0aCA9IGl0ZW1fbGlzdC5sZW5ndGhcblxuICAgICAgICAvLyDkuI3otrMzMOS4quihpea7oTMw5LiqLuS4jei2szXnmoTlgI3mlbAs6KGl5ruhNeeahOWAjeaVsFxuICAgICAgICB0aGlzLm1pbl9zaXplID0gaXRlbV90b3RhbF9sZW5ndGhcbiAgICAgICAgaWYgKHRoaXMubWluX3NpemUgPCAzMCl7XG4gICAgICAgICAgICB0aGlzLm1pbl9zaXplID0gMzBcbiAgICAgICAgfWVsc2UgaWYoKHRoaXMubWluX3NpemUgJSB0aGlzLmNvbF9zaXplKSAhPSAwKXtcbiAgICAgICAgICAgIHRoaXMubWluX3NpemUgPSB0aGlzLm1pbl9zaXplICsgdGhpcy5jb2xfc2l6ZSAtIHRoaXMubWluX3NpemUgJSB0aGlzLmNvbF9zaXplIFxuICAgICAgICB9XG4gICAgICAgIC8vIOmcgOimgeWhq+WFheeahOaVsOmHj1xuICAgICAgICB2YXIgZmlsbF9udW0gPSB0aGlzLm1pbl9zaXplIC0gaXRlbV90b3RhbF9sZW5ndGhcbiAgICAgICAgaWYgKGZpbGxfbnVtID4gMCl7XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZmlsbF9udW07IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBpdGVtX2xpc3QucHVzaCh7c29ydDotMSwgcXVhbGl0eTotMSwgdW5kYXRhOnRydWV9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uKGNlbGwpe1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0oY2VsbClcbiAgICAgICAgfS5iaW5kKHRoaXMpXG5cbiAgICAgICAgdmFyIHNvcnRfZnVuYyA9IG51bGw7XG4gICAgICAgIGlmKHRoaXMuY3VyX2luZGV4ID09IEJhY2tQYWNrQ29uc3QuaXRlbV90YWJfdHlwZS5FUVVJUFMpe1xuICAgICAgICAgICAgc29ydF9mdW5jID0gVXRpbHMudGFibGVVcHBlclNvcnRlcihbXCJxdWFsaXR5XCIsXCJzb3J0XCJdKTtcbiAgICAgICAgfWVsc2UgaWYgKHRoaXMuY3VyX2luZGV4ID09IEJhY2tQYWNrQ29uc3QuaXRlbV90YWJfdHlwZS5QUk9QUyl7XG4gICAgICAgICAgICBzb3J0X2Z1bmMgPSBVdGlscy50YWJsZVVwcGVyU29ydGVyKFtcInF1YWxpdHlcIixcInNvcnRcIixcImJhc2VfaWRcIl0pO1xuICAgICAgICB9ZWxzZSBpZih0aGlzLmN1cl9pbmRleCA9PSBCYWNrUGFja0NvbnN0Lml0ZW1fdGFiX3R5cGUuU1BFQ0lBTCl7XG4gICAgICAgICAgICAvLyDnibnmrorliIbpobXlj6rmnInnrKbmlofvvIzmmJ/nuqfotorlpKfnmoTmlL7liY3pnaJcbiAgICAgICAgICAgIHNvcnRfZnVuYyA9IGZ1bmN0aW9uICggb2JqQSwgb2JqQiApe1xuICAgICAgICAgICAgICAgIHJldHVybiBvYmpBLnF1YWxpdHkgPiBvYmpCLnF1YWxpdHk/LTE6MTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1lbHNlIGlmKHRoaXMuY3VyX2luZGV4ID09IEJhY2tQYWNrQ29uc3QuaXRlbV90YWJfdHlwZS5IRVJPKXtcbiAgICAgICAgICAgIHZhciBjaGVja0lzRnVsbCA9IGZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICAgICAgICAgIHZhciBpc19mdWxsID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYoZGF0YS5xdWFsaXR5ICE9IC0xICYmIGRhdGEuYmFzZV9pZCl7XG4gICAgICAgICAgICAgICAgICAgIGlmKENvbmZpZy5wYXJ0bmVyX2RhdGEuZGF0YV9nZXRfY29tcG91bmRfaW5mb1tkYXRhLmJhc2VfaWRdKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGEucXVhbnRpdHkgPj0gQ29uZmlnLnBhcnRuZXJfZGF0YS5kYXRhX2dldF9jb21wb3VuZF9pbmZvW2RhdGEuYmFzZV9pZF0ubnVtKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19mdWxsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gaXNfZnVsbDtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHZhciBzb3J0RnVuYyA9IGZ1bmN0aW9uKG9iakEsIG9iakIpe1xuICAgICAgICAgICAgICAgIGlmKGNoZWNrSXNGdWxsKG9iakEpICYmICFjaGVja0lzRnVsbChvYmpCKSl7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZighY2hlY2tJc0Z1bGwob2JqQSkgJiYgY2hlY2tJc0Z1bGwob2JqQikpe1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgaWYob2JqQS5xdWFsaXR5ICE9IC0xICYmIG9iakEuYmFzZV9pZCAmJiBvYmpCLnF1YWxpdHkgIT0gLTEgJiYgb2JqQi5iYXNlX2lkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKG9iakEucXVhbGl0eSA9PSBvYmpCLnF1YWxpdHkpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmpBLmJhc2VfaWQgPCBvYmpCLmJhc2VfaWQ/LTE6MTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmpBLnF1YWxpdHkgPiBvYmpCLnF1YWxpdHk/LTE6MTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYob2JqQS5xdWFsaXR5ICE9IC0xICYmIG9iakEuYmFzZV9pZCAmJiBvYmpCLnF1YWxpdHkgPT0gLTEpe1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihvYmpBLnF1YWxpdHkgPT0gLTEgJiYgb2JqQi5xdWFsaXR5ICE9IC0xICYmIG9iakIuYmFzZV9pZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHNvcnRfZnVuYyA9IHNvcnRGdW5jO1xuICAgICAgICAgICAgLy8gLS3oi7Hpm4Tnoo7niYfpnIDopoHlj5bmtojnuqLngrlcbiAgICAgICAgICAgIHZhciBNYWludWlDb250cm9sbGVyID0gcmVxdWlyZShcIm1haW51aV9jb250cm9sbGVyXCIpXG4gICAgICAgICAgICB2YXIgTWFpbnVpQ29uc3QgPSByZXF1aXJlKFwibWFpbnVpX2NvbnN0XCIpXG4gICAgICAgICAgICBNYWludWlDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2V0QnRuUmVkUG9pbnQoTWFpbnVpQ29uc3QuYnRuX2luZGV4LmJhY2twYWNrLCBmYWxzZSlcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBzb3J0X2Z1bmMgPSBVdGlscy50YWJsZVVwcGVyU29ydGVyKFtcInNvcnRcIiwgXCJxdWFsaXR5XCJdKTtcbiAgICAgICAgfVxuICAgICAgICBpdGVtX2xpc3Quc29ydChzb3J0X2Z1bmMpO1xuXG4gICAgICAgIHZhciBleHQgPSB7aXNfb3RoZXI6ZmFsc2UsIHNjYWxlOjEsIGVmZmVjdDpmYWxzZSwgaXNfc2hvd190aXBzOmZhbHNlLCBpc19zaG93X2NoaXBfbG9hZGluZzp0cnVlfTtcbiAgICAgICAgaWYodGhpcy5jdXJfaW5kZXggPT0gMyl7XG4gICAgICAgICAgICBleHQuaXNfY29tcF9udW0gPSB0cnVlO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGV4dC5pc19jb21wX251bSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXRlbV9zY3JvbGx2aWV3LnNldERhdGEoaXRlbV9saXN0LCBjYWxsYmFjaywgZXh0KTtcbiAgICB9LFxuXG4gICAgLy8g54K55Ye76L+U5ZueLOaYvuekunRpcHNcbiAgICBzZWxlY3RlZEl0ZW06ZnVuY3Rpb24oY2VsbCl7XG4gICAgICAgIGlmIChjZWxsID09IG51bGwpIHJldHVybjtcbiAgICAgICAgdmFyIGRhdGEgPSBjZWxsLmdldEl0ZW1EYXRhKClcbiAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICB2YXIgZGF0YV9jb25maWcgPSBjZWxsLmdldEl0ZW1Db25maWcoKVxuICAgICAgICBpZiAoZGF0YV9jb25maWcgPT0gbnVsbCkgcmV0dXJuO1xuXG4gICAgICAgIHZhciBUaXBzQ29udHJvbGxlciA9IHJlcXVpcmUoXCJ0aXBzX2NvbnRyb2xsZXJcIilcbiAgICAgICAgaWYgKEJhY2tQYWNrQ29uc3QuY2hlY2tJc0VxdWlwKGRhdGFfY29uZmlnLnR5cGUpKXsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOijheWkh1xuICAgICAgICAgICAgVGlwc0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5zaG93RXF1aXBUaXBzKGRhdGEsIFRpcHNDb25zdC5lcW1UaXBzLmJhY2twYWNrKVxuICAgICAgICB9ZWxzZSBpZihkYXRhX2NvbmZpZy50eXBlID09IEJhY2tQYWNrQ29uc3QuaXRlbV90eXBlLkFSVElGQUNUQ0hJUFMpeyAgICAgICAgLy8g56ym5paHXG4gICAgICAgICAgICB2YXIgUGFydG5lckNvbnN0ID0gcmVxdWlyZShcInBhcnRuZXJfY29uc3RcIik7XG4gICAgICAgICAgICByZXF1aXJlKFwiaGVyb19jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3BlbkFydGlmYWN0VGlwc1dpbmRvdyh0cnVlLCBkYXRhLCBQYXJ0bmVyQ29uc3QuQXJ0aWZhY3RUaXBzLmJhY2twYWNrKVxuICAgICAgICB9ZWxzZSBpZihkYXRhX2NvbmZpZy5zdWJfdHlwZSA9PSBCYWNrUGFja0NvbnN0Lml0ZW1fdGFiX3R5cGUuSEVSTyl7ICAgICAgICAgLy8g56KO54mHXG4gICAgICAgICAgICBUaXBzQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNob3dCYWNrUGFja0NvbXBUaXBzKHRydWUsZGF0YS5iYXNlX2lkKVxuICAgICAgICB9ZWxzZSBpZihCYWNrUGFja0NvbnN0LmNoZWNrSXNIZXJvU2tpbihkYXRhX2NvbmZpZy50eXBlKSl7ICAgICAgXG4gICAgICAgICAgICB2YXIgSGVyb0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiaGVyb19jb250cm9sbGVyXCIpICAgICAgXG4gICAgICAgICAgICB2YXIgUGFydG5lckNvbnN0ID0gcmVxdWlyZShcInBhcnRuZXJfY29uc3RcIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/nmq7ogqRcbiAgICAgICAgICAgIEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkub3Blbkhlcm9Ta2luVGlwc1BhbmVsKHRydWUsIGRhdGEsIFBhcnRuZXJDb25zdC5FcW1UaXBzLmJhY2twYWNrKVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIFRpcHNDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2hvd0dvb2RzVGlwcyhkYXRhLCB0cnVlKSBcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB1cGRhdGVCYWNrUGFjazpmdW5jdGlvbihiYWdfY29kZSwgaXRlbV9saXN0KXtcbiAgICAgICAgaWYgKHRoaXMuY3VyX2luZGV4ID09IG51bGwpIHJldHVybjtcblxuICAgICAgICBpZih0aGlzLmN1cl9pbmRleCA9PSBCYWNrUGFja0NvbnN0Lml0ZW1fdGFiX3R5cGUuRVFVSVBTKXtcbiAgICAgICAgICAgIGlmKGJhZ19jb2RlICE9IEJhY2tQYWNrQ29uc3QuQmFnX0NvZGUuRVFVSVBTKXJldHVybjtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpZihiYWdfY29kZSA9PSBCYWNrUGFja0NvbnN0LkJhZ19Db2RlLkVRVUlQUylyZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChpdGVtX2xpc3QgPT0gbnVsbCB8fCBPYmplY3Qua2V5cyhpdGVtX2xpc3QpLmxlbmd0aCA9PSAwKSByZXR1cm47XG4gICAgICAgIHZhciBjYW5fdXBkYXRlID0gZmFsc2VcbiAgICAgICAgZm9yKHZhciBrZXkgaW4gaXRlbV9saXN0KXtcbiAgICAgICAgICAgIHZhciB2byA9IGl0ZW1fbGlzdFtrZXldXG4gICAgICAgICAgICBpZiAodm8uc3ViX3R5cGUgPT0gdGhpcy5jdXJfaW5kZXgpe1xuICAgICAgICAgICAgICAgIGNhbl91cGRhdGUgPSB0cnVlXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FuX3VwZGF0ZSl7XG4gICAgICAgICAgICB0aGlzLnNldFBhbmVsRGF0YSgpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgY2xvc2VDYWxsQmFjazogZnVuY3Rpb24oKXtcbiAgICAgICAgQmFja1BhY2tDb250cm9sbGVyLmdldEluc3RhbmNlKCkub3Blbk1haW5XaW5kb3coZmFsc2UpXG4gICAgICAgIGlmICh0aGlzLml0ZW1fc2Nyb2xsdmlldyl7XG4gICAgICAgICAgICB0aGlzLml0ZW1fc2Nyb2xsdmlldy5EZWxldGVNZSgpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pdGVtX3Njcm9sbHZpZXcgPSBudWxsXG4gICAgfSxcbn0pOyJdfQ==