(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/mod/backpack/view/backpack_item.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, 'c1792XCGydEfreAmtsIWmra', 'backpack_item'); // Scripts/mod/backpack/view/backpack_item.js "use strict"; // -------------------------------------------------------------------- // @author: shiraho@syg.com(必填, 创建模块的人员) // @description: // 物品单列,显示对象 //
Create: new Date().toISOString() // -------------------------------------------------------------------- var PathTool = require("pathtool"); var GoodsVo = require("goods_vo"); var PathTool = require("pathtool"); var BackPackConst = require("backpack_const"); var BackPackItem = cc.Class({ "extends": BasePanel, ctor: function ctor() { // 可传参数,第一个是否是自己物品,只有背包或者伙伴身上才算 第二个缩放值,第三个是否点击收缩,第四是否显示tips 第五是否显示额外名字 this.prefabPath = PathTool.getPrefabPath("backpack", "goods_item"); this.scale = 1; // 缩放比 this.is_other = false; // 是否是其他人的物品,只要不是背包和自己伙伴身上的都是其他 this.effect = true; // 是否响应按钮过滤 this.is_show_tips = true; // 是否显示tips this.item_config = null; // 物品的配置数据 this.item_num = 0; // 物品数量 this.load_item_icon = {}; // 加载过的物品图标 this.before_over_set = false; // 创建完成之后是否要设置 this.star_list = []; // 星星的列表 this.show_check_box = false; // 是否需要根据数据现在复选框 if (arguments && arguments.length > 0) { this.is_other = arguments[0] || false; this.scale = arguments[1] || 1; this.effect = arguments[2] || false; this.is_show_tips = arguments[3] || false; this.is_show_name = arguments[4] || false; this.before_over_set = true; } this.isUnEnabled = false; this.isShowBiaoQian = false; //是否显示标签 this.biaoQianStr = ""; this.name_color = null; this.name_size = 18; this.isSetEffect = false; //是否手动设置特效 this.isCache = true; //缓存 this.isShowOrderWarLock = false; //是否显示战令锁 this.is_show_get_select = false; //是否显示领取状态 }, initPanel: function initPanel() { this.main_container = this.root_wnd.getChildByName("main_container"); // 点击区域 this.block_event = this.root_wnd.getComponent(cc.BlockInputEvents); this.item = this.main_container.getChildByName("icon"); this.item_icon = this.main_container.getChildByName("icon").getComponent(cc.Sprite); // 物品图标 // this.background = this.main_container.getChildByName("background"); this.quality_bg = this.main_container.getChildByName("background").getComponent(cc.Sprite); // 背景品质框 this.num_bg = this.main_container.getChildByName("num_bg"); // 数量容器 this.num_background = this.num_bg.getChildByName("background"); // 数量背景,需要根据数量做长度变换 this.num_bg_size = this.num_background.getContentSize(); this.num = this.num_bg.getChildByName("num"); // 数量节点 this.num_label = this.num.getComponent(cc.Label); // 数量文本 this.select = this.main_container.getChildByName("select"); // 选中框 this.star_node = this.main_container.getChildByName("star_node"); this.star = this.star_node.getChildByName("star"); // 星数icon this.chip = this.main_container.getChildByName("chip"); // 碎片标志 this.red_tips = this.main_container.getChildByName("red_tips"); // 红点标志 this.progress_node = this.main_container.getChildByName("progress"); // 扩展进度条 this.progress = this.progress_node.getComponent(cc.ProgressBar); // 真是进度条 this.progress_label = this.progress_node.getChildByName("label").getComponent(cc.Label); // 进度条上面的值 this.camp = this.main_container.getChildByName("camp"); // 阵营 this.camp_sprite = this.camp.getComponent(cc.Sprite); this.extend_tag = this.main_container.getChildByName("extend_tag"); this.extend_desc = this.main_container.getChildByName("extend_desc").getComponent(cc.Label); this.play_effect = this.main_container.getChildByName("play_effect").getComponent(sp.Skeleton); this.mark = this.main_container.getChildByName("mark"); // 获取选中 this.extend_label = this.seekChild(this.main_container, "extend_label", cc.Label); // 下部的额外文字描述 if (this.before_over_set) { this.initSomeSet(); this.before_over_set = false; } if (this.showItemEffect_cache) { this.showItemEffect.apply(this, this.showItemEffect_cache); this.showItemEffect_cache = null; } if (this.extend_cache) { this.setExtendTag.apply(this, this.extend_cache); this.extend_cache = null; } if (this.set_num_bg_cache) { var arr = this.set_num_bg_cache; this.setNumBgPos(arr.pos, arr.ar, arr.pos1, arr.ar1); } if (this.bg_status != null) { this.setIsShowBackground(this.bg_status); } if (this.add_btn_bool != null) { this.showAddIcon(this.add_btn_bool); } if (this.head_icon != null) { this.setItemIcon(this.head_icon); } this.setItemIconUnEnabled(this.isUnEnabled); }, registerEvent: function registerEvent() {}, init: function init() { //因为会复用需要初始化 this.setPosition(0, 0); this.setAnchorPoint(0.5, 0.5); this.scale = 1; this.item_res_path = null; this.callback = null; this.actionCallback = null; this.data = null; this.name_color = null; this.name_size = 18; if (this.extend_label) { this.extend_label.node.y = -71; this.extend_label.string = ""; } this.empty_icon_path = null; this.initConfig(false, false, null, false, false); if (this.progress_node) { this.progress_node.active = false; } this.setRedStatus(false); this.setExtendTag(false); this.showItemEffect(false); this.setDefaultTip(false, false, false, false); this.setMaskVisible(false); this.setItemIconUnEnabled(false); this.showBiaoQian(false); this.is_comp_num = null; this.holidHeroExpeditTag(false); this.showAddIcon(false); this.setIsShowBackground(true); this.setReceivedIcon(false); this.cur_visible = false; if (this.set_need_num_cache) { this.setNeedNum(0, 0, null, false); this.set_need_num_cache = null; } this.setDoubleIcon(false); this.isSummonNumber = null; this.showOrderWarLock(false); this.IsGetStatus(false); this.showWeekCardTag(false); if (this.num_label) { this.num_label.string = ""; this.num_label.node.active = true; } if (this.num_bg) { this.num_bg.active = false; this.num_bg.setPosition(51.8, -41); this.num_bg.setAnchorPoint(1, 0.5); } if (this.num_background) { this.num_background.setPosition(0, 0); this.num_background.setAnchorPoint(1, 0.5); this.num_background.setContentSize(cc.size(30, 22)); } if (this.num) { this.num.setPosition(-2.5, -0.1); this.num.setAnchorPoint(1, 0.5); } this.setSelected(false); }, /** * 初始化一些参数设置 * @param {*} is_other 自己背包或者其他部分,包含了自己伙伴身上背包 * @param {*} scale 缩放值 * @param {*} effect 是否响应按钮过滤 this.click.transition = cc.Button.Transition.NONE //SCALE * @param {*} is_show_tips 是否显示tips * @param {*} is_show_name 是否在下方显示物品名字 */ initConfig: function initConfig(is_other, scale, effect, is_show_tips, is_show_name) { this.is_other = is_other || false; this.scale = scale || 1; this.effect = effect == null ? true : effect; this.is_show_tips = is_show_tips || false; this.is_show_name = is_show_name || false; if (this.root_wnd) { this.initSomeSet(); } else { this.before_over_set = true; } }, // 初始化一些设定 initSomeSet: function initSomeSet() { if (this.root_wnd == null) return; // if (this.scale != 1) { // this.main_container.scale = this.scale this.root_wnd.scale = this.scale; // } if (this.cache_markselect_status != null) { this.setMaskVisible(this.cache_markselect_status); this.cache_markselect_status = null; } }, onShow: function onShow() { if (this.root_wnd && !this.click_event) { this.root_wnd.on(cc.Node.EventType.TOUCH_END, this.onClickRootWnd, this); this.root_wnd.on(cc.Node.EventType.TOUCH_START, this.onClickRootWnd, this); this.root_wnd.on(cc.Node.EventType.TOUCH_CANCEL, this.onClickRootWnd, this); this.click_event = true; if (this.block_event) { this.block_event.enabled = true; } } this.updateData(); }, onClickRootWnd: function onClickRootWnd(event) { if (event.type === cc.Node.EventType.TOUCH_START) { if (this.effect) { this.root_wnd.scale = (this.scale || 1) * 0.9; } } if (event.type === cc.Node.EventType.TOUCH_CANCEL) { if (this.effect) { this.root_wnd.scale = this.scale || 1; } } if (event.type === cc.Node.EventType.TOUCH_END) { if (this.effect) { this.root_wnd.scale = this.scale || 1; } if (this.callback) { this.callback.apply(null, [this]); } else { if (this.is_show_tips && this.item_config) { var TipsController = require("tips_controller"); if (BackPackConst.checkIsEquip(this.item_config.type)) { // 装备 TipsController.getInstance().showEquipTips(this.item_config); } else { var config; if (this.data.config) { config = this.data.config; } else if (this.data.bid) { config = Utils.getItemConfig(this.data.bid); } else if (this.data) { config = this.data; } if (config) { if (BackPackConst.checkoutIsWeekCard(config.type)) { TipsController.getInstance().showWeekCardTips(true, this.item_config); } else if (BackPackConst.checkIsHeroSkin(config.type)) { var HeroController = require("hero_controller"); HeroController.getInstance().openHeroSkinTipsPanel(true, this.item_config); } else { // 虽然显示物品来源,但是如果没有配置也不需要显示 if (this.is_show_source == true && config.source && Utils.next(config.source)) { var BackpackController = require("backpack_controller"); BackpackController.getInstance().openTipsSource(true, config); } else if (this.is_tips_source) { TipsController.getInstance().showGoodsTips(config, true, this.is_tips_source); } else { TipsController.getInstance().showGoodsTips(config); } if (this.source_callback) { this.source_callback(); } } } } return; } if (this.actionCallback) { this.actionCallback.apply(null, [this]); } } } }, onHide: function onHide() {}, /** * 扩展参数,只有这个对象用在 CommonScrolleView的时候用到 * @param {*} data */ setExtendData: function setExtendData(data) { this.initConfig(data.is_other, data.scale, data.effect, data.is_show_tips); // 是否显示碎片进度条 this.is_show_chip_loading = data.is_show_chip_loading || false; if (data.showCheckBox != null) { this.show_check_box = data.showCheckBox; } if (data.checkBoxClickCallBack != null) { this.click_check_callback = data.checkBoxClickCallBack; } if (data.adjustCheckBoxPos) { this.check_box_pos = data.adjustCheckBoxPos; } if (data.is_comp_num != null) { this.is_comp_num = data.is_comp_num; } if (data.is_hide_effect) { this.is_hide_effect = data.is_hide_effect; } // --背包是否显示阵营 if (data.is_camptype != null) { this.is_camptype = data.is_camptype; } if (data.isSummonNumber != null) { this.isSummonNumber = data.isSummonNumber; } }, /** * 设置左边斜角的一些戳 * @param {*} status * @param {*} desc * @param {*} extend */ setExtendTag: function setExtendTag(status, desc, extend) { if (!this.extend_tag) { this.extend_cache = [status, desc, extend]; } else if (status) { this.extend_tag.active = true; this.extend_desc.node.active = true; this.extend_desc.string = desc; } else { this.extend_tag.active = false; this.extend_desc.node.active = false; } }, setSelfEffect: function setSelfEffect(config) { if (this.isSetEffect) return; if (!this.is_hide_effect == true) { if (config && config.is_effect && config.is_effect == 1) { var effect_id = 156; var action = PlayerAction.action_2; if (config.quality >= 4) { action = PlayerAction.action_1; } this.showItemEffect(true, effect_id, action, true); } else { this.showItemEffect(false); } } else { this.showItemEffect(false); } }, /** * 效果显示 * @param {*} bool * @param {*} effect_id * @param {*} action * @param {*} is_loop * @param {*} scale */ showItemEffect: function showItemEffect(bool, effect_id, action, is_loop, scale) { if (!this.play_effect) { this.isSetEffect = true; this.showItemEffect_cache = arguments; return; } var res_id = Config.effect_data.data_effect_info[effect_id]; if (bool && res_id) { this.play_effect.node.active = true; action = action || PlayerAction.action_1; var path = cc.js.formatStr("spine/%s/action.atlas", res_id); this.loadRes(path, function (res) { this.play_effect.skeletonData = res; this.play_effect.setAnimation(0, action, is_loop); }.bind(this)); } else { this.play_effect.node.active = false; } if (scale != null) { this.play_effect.node.scale = scale; } }, addCallBack: function addCallBack(callback) { this.callback = callback; }, //用于需要根据is_show_tips状态调用callback使用 addActionCallBack: function addActionCallBack(callback) { this.actionCallback = callback; }, /** * 设置显示数据 * @param {*} data ,当前可以支持 goodsvo ,item_config ,{bid, num}, bid 以及包含 undata的object */ setData: function setData(data, is_hide_effect) { // if(!data)return; this.data = data; this.is_hide_effect = is_hide_effect || false; if (this.root_wnd) { this.root_wnd.scale = this.scale; this.updateData(); } }, // x下部的额外文字描述 setExtendLabel: function setExtendLabel(str, color, font_size) { if (color) { this.name_color = color; } if (font_size && font_size > 0) { this.name_size = font_size; } if (!this.root_wnd) { return; } str = str || ""; if (str == "") { // this.extend_label.active = false; this.extend_label.string = str; } else { // this.extend_label.active = true; this.extend_label.string = str; } if (color) { var cur_select = this.extend_label.node.color; if (typeof color == "number") { cur_select.fromHEX(Config.color_data.data_color16[color]); } else { cur_select.fromHEX(color); } this.extend_label.node.color = cur_select; } if (font_size && font_size > 0) { this.extend_label.fontSize = this.name_size; this.extend_label.lineHeight = this.name_size + 2; } }, // 区分设置进来到具体是什么数据 updateData: function updateData() { // 设置物品图标 // this.setRedStatus(false) if (this.tmp_index != null) { if (this.root_wnd) this.root_wnd.name = "backpack_item_" + (this.tmp_index + 1); } if (this.data == null) { if (this.empty_icon_path) { this.setItemIcon(); } this.suspendAllActions(); return; } else {} this.item_config = null; // 清空配置数据 var item_num = 0; if (this.data instanceof GoodsVo || this.data.type_vo == "GoodsVo") { // 直接是物品实例对象 this.item_config = this.data.config; item_num = this.data.quantity; if (this.item_config.id == "24802") this.main_container.name = "item_" + this.item_config.id; } else if (typeof this.data == "number") { // 物品bid this.item_config = Utils.getItemConfig(this.data); } else if (this.data instanceof Object) { if (this.data.bid != null && this.data.num != null) { // 基础设置 this.item_config = Utils.getItemConfig(this.data.bid); item_num = this.data.num; } else if (this.data.undata == true) {// {sort:-1, quality:-1, undata:true} 这个是需要数据,需要清掉 } else { if (this.data.id) { this.item_config = Utils.getItemConfig(this.data.id); } else { this.item_config = this.data; } } } this.setQualityBG(); // 设置背景色 this.setItemNum(item_num); // 设置当前拥有数量 this.setItemIcon(); // 设置物品图标 this.setItemChip(); // 设置碎片 this.setItemStar(); // 设置物品星数,只针对碎片,装备和符文 this.setCompNumber(); // 设置合成进度条,只在背包状态下的物品可见 this.setItemCamp(); // 设置物品阵营 this.setSelfEffect(this.item_config); //设置显示特效 //远征右上角显示 if (this.expedit_cahe) { this.holidHeroExpeditTag(this.expedit_cahe.status, this.expedit_cahe.desc); } // 是否显示下方的物品名字 if (this.is_show_name) { this.setExtendLabel(this.item_config.name, this.name_color, this.name_size); } else { this.setExtendLabel(); } if (this.data.showSellStatus != null) { this.setCheckBoxStatus(this.data.showSellStatus.status, this.data.showSellStatus.select); } //设置标签 if (this.isShowBiaoQian && this.biaoQianStr) { this.showBiaoQian(this.isShowBiaoQian, this.biaoQianStr); } if (this.cache_red_status) { this.setRedStatus(this.cache_red_status); this.cache_red_status = null; } else { this.setRedStatus(false); } if (this.receivedStatus != null) { this.setReceivedIcon(this.receivedStatus); } if (this.isSummonNumber != null) { this.setSummonNumber(); } if (this.isShowOrderWarLock == true) { this.showOrderWarLock(true); } this.IsGetStatus(this.is_show_get_select); if (this.data && this.data.bid) { this.setWeekCardData(this.data.bid); } }, setWeekCardData: function setWeekCardData(bid) { var item_config = Utils.getItemConfig(bid); if (item_config && item_config.tips_btn) { var show_type = this.checkIsWeekCard(item_config.tips_btn); if (show_type == 50) { this.showWeekCardTag(true); } } else { this.showWeekCardTag(false); } }, // 设置基础信息显示 setQualityBG: function setQualityBG(temp_quality) { var quality = 0; if (temp_quality != null) { quality = temp_quality; } else { if (this.item_config) { quality = this.item_config.quality; } } var bg_path = PathTool.getItemQualityBG(quality); if (this.bg_quality == bg_path) return; this.bg_quality = bg_path; var common_res_path = PathTool.getCommonIcomPath(this.bg_quality); LoaderManager.getInstance().loadRes(common_res_path, function (sf_obj) { if (this.root_wnd && this.root_wnd.isValid) { this.quality_bg.spriteFrame = sf_obj; } }.bind(this)); }, // 设置数量 setItemNum: function setItemNum(item_num) { if (this.is_comp_num) { this.num_bg.active = false; } else { this.num_bg.active = false; this.item_num = Utils.getMoneyString(item_num); if (item_num == null || item_num <= 1) { this.num_bg.active = false; } else { this.num_bg.active = true; this.num_label.string = this.item_num; var width = this.num.width; this.num_background.width = width + 10; } if (this.set_need_num_cache) { var arr = this.set_need_num_cache; this.setNeedNum(arr.need_num, arr.num, arr.color, arr.force); } else { this.num_label._updateRenderData(true); // Utils.delayRun(this.num_background,1/60,function(){ this.updateNumBGSize(); // }.bind(this)) } } }, // 设置物品图标 setItemIcon: function setItemIcon(head_icon) { if (this.item == null) { this.head_icon = head_icon; return; } if (head_icon) { this.empty_icon_path = head_icon; } if (this.item_config == null && !this.empty_icon_path) { this.item.active = false; return; } this.item.active = true; var item_res_path = null; if (!this.item_config) { item_res_path = this.empty_icon_path; } else { item_res_path = PathTool.getItemRes(this.item_config.icon); } if (head_icon) { item_res_path = head_icon; } if (this.item_res_path == item_res_path) return; this.item_res_path = item_res_path; this.loadRes(item_res_path, function (item_res_path, res_object) { // this.load_item_icon[item_res_path] = res_object if (this.item_res_path == item_res_path) { this.item_icon.spriteFrame = res_object; } }.bind(this, item_res_path)); }, // 设置英雄碎片 setItemChip: function setItemChip() { if (this.item_config == null || this.item_config.type != BackPackConst.item_type.PARTNER_DEBRIS) { this.chip.active = false; } else { this.chip.active = true; } }, // 设置物品的星级 setItemStar: function setItemStar() { var bool = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; for (var index = 0; index < this.star_list.length; index++) { var _star = this.star_list[index]; _star.active = false; } if (this.item_config == null) return; var eqm_star = 0; if (bool == true) { if (this.checkIsEquip(this.item_config.type)) { eqm_star = this.item_config.eqm_star; } else if (this.item_config.type == BackPackConst.item_type.PARTNER_DEBRIS) { // 英雄碎片的时候额外用这个装备阶数标识星级 eqm_star = this.item_config.eqm_jie; } else if (this.item_config.type == BackPackConst.item_type.ARTIFACTCHIPS) { // 符文比较特殊,必须是物品 if (this.data instanceof GoodsVo) { eqm_star = this.data.enchant; } } } if (eqm_star > 0) { var width = 12; var x = (1 - eqm_star) * width * 0.5; for (var _index = 0; _index < eqm_star; _index++) { if (this.star_list[_index] == null) { this.star_list[_index] = cc.instantiate(this.star); this.star_list[_index].y = this.star.y; this.star_node.addChild(this.star_list[_index]); } var star = this.star_list[_index]; star.active = true; star.x = x + _index * width; } } }, // 设置碎片合成进度条 setCompNumber: function setCompNumber() { if (!this.is_show_chip_loading || this.item_config == null || this.data == null || !(this.data instanceof GoodsVo) || this.item_config.type != BackPackConst.item_type.PARTNER_DEBRIS) { this.progress_node.active = false; } else { var config = gdata("partner_data", "data_get_compound_info", this.item_config.id); if (config == null) { this.progress_node.active = false; } else { var cur_num = this.data.quantity; // 当前数量 var max_num = config.num; // 需要数量 var per = Math.min(1, Math.max(cur_num / max_num)); this.progress.progress = per; this.progress_label.string = cur_num + "/" + max_num; this.progress_node.active = true; if (per < 1) { this.setRedStatus(false); } else { this.setRedStatus(true); } } } }, // 阵营图标显示 setItemCamp: function setItemCamp() { if (this.item_config && this.item_config.sub_type == 3 && !this.is_camptype && this.item_config.lev != 0) { this.camp.active = true; var camp = this.item_config.lev; // 取等级标识阵营 var camp_path = PathTool.getHeroCampRes(camp); if (this.camp_path == camp_path) return; this.camp_path = camp_path; var common_res_path = PathTool.getCommonIcomPath(camp_path); LoaderManager.getInstance().loadRes(common_res_path, function (sf_obj) { this.camp_sprite.spriteFrame = sf_obj; }.bind(this)); } else { this.camp.active = false; } // if (this.item_config == null || this.item_config.sub_type != BackPackConst.item_tab_type.HERO) { // this.camp.active = false // } else { // this.camp.active = true // var camp = this.item_config.lev // 取等级标识阵营 // var camp_path = PathTool.getHeroCampRes(camp) // if (this.camp_path == camp_path) return // this.camp_path = camp_path // var common_res_path = PathTool.getCommonIcomPath(camp_path); // LoaderManager.getInstance().loadRes(common_res_path, function (sf_obj) { // this.camp_sprite.spriteFrame = sf_obj; // }.bind(this)) // } }, // 监测是不是装备 checkIsEquip: function checkIsEquip(type) { return type == BackPackConst.item_type.WEAPON || type == BackPackConst.item_type.SHOE || type == BackPackConst.item_type.CLOTHES || type == BackPackConst.item_type.HAT; }, // 选中与否,有一个√的 setMaskVisible: function setMaskVisible(status) { if (this.root_wnd) { this.mark.active = status; } else { this.cache_markselect_status = status; } }, // 设置红点状态 setRedStatus: function setRedStatus(status) { if (this.red_tips) { this.red_tips.active = !!status; } else { this.cache_red_status = !!status; } }, // 返回配置数据 getItemConfig: function getItemConfig() { return this.item_config; }, // 返回物品对象 getItemData: function getItemData() { return this.data; }, // 除+号和数量以外都置灰 setItemIconUnEnabled: function setItemIconUnEnabled(bool) { this.isUnEnabled = bool; if (this.item_icon) { this.item_icon.setState(!bool ? cc.Sprite.State.NORMAL : cc.Sprite.State.GRAY); } if (this.quality_bg) { this.quality_bg.setState(!bool ? cc.Sprite.State.NORMAL : cc.Sprite.State.GRAY); } if (this.extend_tag && this.extend_tag.active) { this.extend_tag.getComponent(cc.Sprite).setState(!bool ? cc.Sprite.State.NORMAL : cc.Sprite.State.GRAY); } if (this.star_list) { for (var i in this.star_list) { this.star_list[i].getComponent(cc.Sprite).setState(!bool ? cc.Sprite.State.NORMAL : cc.Sprite.State.GRAY); } } if (this.play_effect && this.play_effect.node) { this.play_effect.node.color = !bool ? new cc.Color(255, 255, 255, 255) : new cc.Color(115, 115, 115, 255); } }, // 增加一个标签头 showBiaoQian: function showBiaoQian(bool, str) { this.isShowBiaoQian = bool; this.biaoQianStr = str; if (this.root_wnd == null) return; if (!this.qian_icon && bool) { var res = PathTool.getCommonIcomPath("common_90015"); this.qian_icon = Utils.createImage(this.main_container, null, -23, 27, cc.v2(0.5, 0.5), null, 10); this.loadRes(res, function (sf_obj) { this.qian_icon.spriteFrame = sf_obj; }.bind(this)); this.qian_label = Utils.createLabel(20, new cc.Color(0xff, 0xff, 0xff, 0xff), new cc.Color(0x0a, 0x0f, 0x0f, 0xff), 5, -5, "", this.qian_icon.node, 2, cc.v2(0.5, 0)); this.qian_label.node.rotation = -45; } if (this.qian_icon) { this.qian_icon.node.active = bool; } if (this.qian_label) { str = str || ""; this.qian_label.string = str; } }, //理论上只用于 00/11 的格式,希望不要乱用 setNeedNum: function setNeedNum(need_num, num, color, force) { if (this.set_need_num_cache == null) { this.set_need_num_cache = {}; this.set_need_num_cache.need_num = need_num; this.set_need_num_cache.num = num; this.set_need_num_cache.color = color; this.set_need_num_cache.force = force; } if (this.root_wnd == null) return; need_num = need_num || 0; var status = false; if (need_num > 0 || force == true) { status = true; } var str = need_num; if (num != null) { if (need_num > num) color = new cc.Color(0xff, 0x47, 0x47, 0xff);else color = new cc.Color(0xff, 0xff, 0xff, 0xff); // num = num; num = Utils.getMoneyString(num); need_num = Utils.getMoneyString(need_num); str = num + "/" + need_num; } this.num_label.string = str; this.num_label.node.color = color; this.num_label.node.active = status; this.num_bg.active = status; this.num_label._updateRenderData(true); // Utils.delayRun(this.num_background,1/60,function(){ this.updateNumBGSize(); // }.bind(this)) }, updateNumBGSize: function updateNumBGSize() { var size = this.num.getContentSize(); var width = size.width; if (width < 30) width = 21; this.num_background.setContentSize(cc.size(width + 12, this.num_bg_size.height + 2)); }, // 活动时候远征的物品 holidHeroExpeditTag: function holidHeroExpeditTag(status, desc) { if (status) { this.expedit_cahe = {}; this.expedit_cahe.status = status; this.expedit_cahe.desc = desc; } if (!this.root_wnd) return; if (status == false) { this.expedit_cahe = null; if (this.heroExpeditTag) { this.heroExpeditTag.node.active = status; } } else { if (this.heroExpeditTag == null) { this.heroExpeditTag = Utils.createImage(this.main_container, null, 30, 29, cc.v2(0.5, 0.5)); var res = PathTool.getCommonIcomPath("common_90081"); this.loadRes(res, function (sf_obj) { this.heroExpeditTag.spriteFrame = sf_obj; }.bind(this)); this.heroExpeditTag_desc = Utils.createLabel(16, new cc.Color(0xff, 0xff, 0xff, 0xff), new cc.Color(0xaf, 0x23, 0x3a, 0xff), 10, 12.5, "", this.heroExpeditTag.node, 2, cc.v2(0.5, 0.5)); this.heroExpeditTag_desc.node.setRotation(45); } this.heroExpeditTag.node.action = status; this.heroExpeditTag_desc.string = desc; } }, setNumBgPos: function setNumBgPos(pos, ar, pos1, ar1) { if (this.set_num_bg_cache == null) { this.set_num_bg_cache = {}; this.set_num_bg_cache.pos = pos; this.set_num_bg_cache.ar = ar; this.set_num_bg_cache.pos1 = pos1; this.set_num_bg_cache.ar1 = ar1; // return } if (this.root_wnd == null) return; if (pos) { this.num_bg.setPosition(pos.x, pos.y); } if (ar) { this.num_bg.setAnchorPoint(ar); } if (ar1) { this.num.setAnchorPoint(ar1); this.num_background.setAnchorPoint(ar1); } if (pos1) { this.num_background.setPosition(pos1.x, pos1.y); this.num.setPosition(pos1.x, pos1.y); } }, suspendAllActions: function suspendAllActions() { this.setCheckBoxStatus(false, false); // this.showAddIcon(false); this.setRedStatus(false); this.setItemStar(false); this.setQualityBG(0); this.showWeekCardTag(false); if (this.num_bg) { this.num_bg.active = false; } if (this.item) { this.item.active = false; } if (this.chip) { this.chip.active = false; } if (this.camp) { this.camp.active = false; } if (this.progress_node) { this.progress_node.active = false; } this.showItemEffect(false); this.data = null; }, /** * 显示tips的开关 * @param {*} is_show_tips * @param {*} is_show_source * @param {*} source_callback * @param {*} is_tips_source 物品信息界面,显示来源按钮(主要针对未获得的物品,却要显示来源的) */ setDefaultTip: function setDefaultTip(is_show_tips, is_show_source, source_callback, is_tips_source) { if (is_show_tips != null) { this.is_show_tips = is_show_tips; } else { this.is_show_tips = true; ; } this.is_show_source = is_show_source || false; this.source_callback = source_callback; this.is_tips_source = is_tips_source || false; }, //加号 //锁 showAddIcon: function showAddIcon(bool) { if (bool == false && !this.add_btn_sp) return; if (this.main_container == null) { this.add_btn_bool = bool; return; } if (!this.add_btn_sp) { this.add_btn_sp = Utils.createImage(this.main_container, null, 0, 0, cc.v2(0.5, 0.5)); this.loadRes(PathTool.getCommonIcomPath("common_90026"), function (sp) { if (this.add_btn_sp) { this.add_btn_sp.spriteFrame = sp; } }.bind(this)); var btn = this.add_btn_sp.node.addComponent(cc.Button); btn.transition = cc.Button.Transition.SCALE; if (this.callback) { btn.node.on(cc.Node.EventType.TOUCH_END, function () { this.callback(); }, this); } } this.add_btn_sp.node.active = bool; }, //隐藏背景框 setIsShowBackground: function setIsShowBackground(status) { this.bg_status = status; if (this.quality_bg) this.quality_bg.node.active = status; }, setEmptyIconPath: function setEmptyIconPath(icon_path) { this.empty_icon_path = icon_path; }, getData: function getData() { return this.data; }, setCheckBoxStatus: function setCheckBoxStatus(status, is_select) { if (this.show_check_box == false) return; if (status == false) { if (this.check_box != null) { this.check_box.setVisible(false); } } else { if (this.check_box == null) { var ToggleItem = require("toggle_item"); this.check_box = new ToggleItem(); if (this.check_box_pos) { this.check_box.setPosition(this.check_box_pos); } else { this.check_box.setPosition(cc.v2(25, 25)); } this.check_box.setParent(this.main_container); this.check_box.setVisible(true); this.check_box.setData(this.data.showSellStatus); this.check_box.addClickCallBack(function (isSelected) { if (this.data != null && this.data.id != null && this.data.showSellStatus) { this.data.setGoodsAttr("showSellStatus", { status: true, select: isSelected }); if (this.click_check_callback) { this.click_check_callback(isSelected, this); } } }.bind(this)); } else { this.check_box.setVisible(true); this.check_box.setData(this.data.showSellStatus); } } if (is_select == null) { is_select = false; } if (this.check_box) { this.check_box.setSelected(is_select); } }, setReceivedIcon: function setReceivedIcon(status) { this.receivedStatus = status; if (this.root_wnd) { if (status) { if (this.received_icon == null) { this.received_icon = Utils.createImage(this.root_wnd, null, 0, 0, cc.v2(0.5, 0.5)); var path = PathTool.getCommonIcomPath("common_1000"); this.loadRes(path, function (res) { this.received_icon.spriteFrame = res; }.bind(this)); } this.setItemIconUnEnabled(true); this.received_icon.node.active = true; } else { if (this.received_icon) { this.received_icon.node.active = false; } this.setItemIconUnEnabled(false); } } }, //显示双倍 setDoubleIcon: function setDoubleIcon(status) { if (status) { if (this.double_icon == null) { this.double_icon = Utils.createImage(this.main_container, null, -28, 27.5); this.loadRes(PathTool.getUIIconPath("common", "txt_cn_common_90008"), function (res) { this.double_icon.spriteFrame = res; }.bind(this)); } this.double_icon.node.active = true; } else { if (this.double_icon) { this.double_icon.node.active = false; } } }, setSummonNumber: function setSummonNumber() { if (this.root_wnd) { this.extend_label.string = Number(this.data.probability).toFixed(3) + "%"; this.extend_label.fontSize = 22; this.extend_label.lineHeight = 30; this.extend_label.node.y = -65; } }, // 战令活动的个锁 showOrderWarLock: function showOrderWarLock(bool) { this.isShowOrderWarLock = bool; if (bool == false && !this.order_war_lock) return; if (!this.root_wnd) { return; } if (!this.order_war_lock) { this.order_war_lock = Utils.createImage(this.root_wnd, PathTool.getUIIconPath("common", "common_90009"), -53, 38, cc.v2(0.5, 0.5), false); } this.order_war_lock.node.active = bool; }, // 战令活动 物品是否领取状态 IsGetStatus: function IsGetStatus(bool) { this.is_show_get_select = bool; if (bool == false && !this.is_get_select) return; if (!this.root_wnd) return; if (!this.is_get_select) { this.is_get_select = new cc.Node(); this.is_get_select.setContentSize(cc.size(120, 120)); this.is_get_select.setAnchorPoint(0.5, 0.5); this.is_get_select.setPosition(0, 0); this.root_wnd.addChild(this.is_get_select); var bg = Utils.createImage(this.is_get_select, PathTool.getUIIconPath("common", "common_1074"), 0, 0, cc.v2(0.5, 0.5), false, null, true); bg.node.setContentSize(cc.size(120, 120)); Utils.createImage(this.is_get_select, PathTool.getUIIconPath("common", "common_1043"), 0, 0, cc.v2(0.5, 0.5), false); } this.is_get_select.active = bool; }, checkIsWeekCard: function checkIsWeekCard(data) { var card_type = 0; if (data) { for (var i = 0; i < data.length; ++i) { var v = data[i]; if (v == 50) { card_type = v; break; } } } return card_type; }, showWeekCardTag: function showWeekCardTag(status) { if (status == true) { var res = PathTool.getUIIconPath("tips", "txt_cn_tips_1"); if (!this.use_week_card) { this.use_week_card = Utils.createImage(this.main_container, res, -27, 40, cc.v2(0.5, 0.5)); } this.use_week_card.node.active = true; } else { if (this.use_week_card) { this.use_week_card.node.destroy(); this.use_week_card = null; } } }, //设置选中状态 setSelected: function setSelected(status) { if (this.select) { this.select.active = status; } }, onDelete: function onDelete() { if (this.heroExpeditTag) { this.heroExpeditTag.node.destroy(); this.heroExpeditTag = null; } if (this.add_btn_sp) { this.add_btn_sp.node.destroy(); this.add_btn_sp = null; } if (this.heroExpeditTag_desc) { this.heroExpeditTag_desc.node.destroy(); this.heroExpeditTag_desc = null; } if (this.check_box) { this.check_box.deleteMe(); this.check_box = null; } this.item_num = ""; this.isSetEffect = false; if (this.item_icon) { this.item_icon.spriteFrame = null; } this.data = null; if (this.root_wnd && this.click_event) { this.root_wnd.off(cc.Node.EventType.TOUCH_END, this.onClickRootWnd, this); this.root_wnd.off(cc.Node.EventType.TOUCH_START, this.onClickRootWnd, this); this.root_wnd.off(cc.Node.EventType.TOUCH_CANCEL, this.onClickRootWnd, this); if (this.block_event) { this.block_event.enabled = false; } this.click_event = false; } ItemsPool.getInstance().cacheItem(this); } }); 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxiYWNrcGFja1xcdmlld1xcYmFja3BhY2tfaXRlbS5qcyJdLCJuYW1lcyI6WyJQYXRoVG9vbCIsInJlcXVpcmUiLCJHb29kc1ZvIiwiQmFja1BhY2tDb25zdCIsIkJhY2tQYWNrSXRlbSIsImNjIiwiQ2xhc3MiLCJCYXNlUGFuZWwiLCJjdG9yIiwicHJlZmFiUGF0aCIsImdldFByZWZhYlBhdGgiLCJzY2FsZSIsImlzX290aGVyIiwiZWZmZWN0IiwiaXNfc2hvd190aXBzIiwiaXRlbV9jb25maWciLCJpdGVtX251bSIsImxvYWRfaXRlbV9pY29uIiwiYmVmb3JlX292ZXJfc2V0Iiwic3Rhcl9saXN0Iiwic2hvd19jaGVja19ib3giLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJpc19zaG93X25hbWUiLCJpc1VuRW5hYmxlZCIsImlzU2hvd0JpYW9RaWFuIiwiYmlhb1FpYW5TdHIiLCJuYW1lX2NvbG9yIiwibmFtZV9zaXplIiwiaXNTZXRFZmZlY3QiLCJpc0NhY2hlIiwiaXNTaG93T3JkZXJXYXJMb2NrIiwiaXNfc2hvd19nZXRfc2VsZWN0IiwiaW5pdFBhbmVsIiwibWFpbl9jb250YWluZXIiLCJyb290X3duZCIsImdldENoaWxkQnlOYW1lIiwiYmxvY2tfZXZlbnQiLCJnZXRDb21wb25lbnQiLCJCbG9ja0lucHV0RXZlbnRzIiwiaXRlbSIsIml0ZW1faWNvbiIsIlNwcml0ZSIsInF1YWxpdHlfYmciLCJudW1fYmciLCJudW1fYmFja2dyb3VuZCIsIm51bV9iZ19zaXplIiwiZ2V0Q29udGVudFNpemUiLCJudW0iLCJudW1fbGFiZWwiLCJMYWJlbCIsInNlbGVjdCIsInN0YXJfbm9kZSIsInN0YXIiLCJjaGlwIiwicmVkX3RpcHMiLCJwcm9ncmVzc19ub2RlIiwicHJvZ3Jlc3MiLCJQcm9ncmVzc0JhciIsInByb2dyZXNzX2xhYmVsIiwiY2FtcCIsImNhbXBfc3ByaXRlIiwiZXh0ZW5kX3RhZyIsImV4dGVuZF9kZXNjIiwicGxheV9lZmZlY3QiLCJzcCIsIlNrZWxldG9uIiwibWFyayIsImV4dGVuZF9sYWJlbCIsInNlZWtDaGlsZCIsImluaXRTb21lU2V0Iiwic2hvd0l0ZW1FZmZlY3RfY2FjaGUiLCJzaG93SXRlbUVmZmVjdCIsImFwcGx5IiwiZXh0ZW5kX2NhY2hlIiwic2V0RXh0ZW5kVGFnIiwic2V0X251bV9iZ19jYWNoZSIsImFyciIsInNldE51bUJnUG9zIiwicG9zIiwiYXIiLCJwb3MxIiwiYXIxIiwiYmdfc3RhdHVzIiwic2V0SXNTaG93QmFja2dyb3VuZCIsImFkZF9idG5fYm9vbCIsInNob3dBZGRJY29uIiwiaGVhZF9pY29uIiwic2V0SXRlbUljb24iLCJzZXRJdGVtSWNvblVuRW5hYmxlZCIsInJlZ2lzdGVyRXZlbnQiLCJpbml0Iiwic2V0UG9zaXRpb24iLCJzZXRBbmNob3JQb2ludCIsIml0ZW1fcmVzX3BhdGgiLCJjYWxsYmFjayIsImFjdGlvbkNhbGxiYWNrIiwiZGF0YSIsIm5vZGUiLCJ5Iiwic3RyaW5nIiwiZW1wdHlfaWNvbl9wYXRoIiwiaW5pdENvbmZpZyIsImFjdGl2ZSIsInNldFJlZFN0YXR1cyIsInNldERlZmF1bHRUaXAiLCJzZXRNYXNrVmlzaWJsZSIsInNob3dCaWFvUWlhbiIsImlzX2NvbXBfbnVtIiwiaG9saWRIZXJvRXhwZWRpdFRhZyIsInNldFJlY2VpdmVkSWNvbiIsImN1cl92aXNpYmxlIiwic2V0X25lZWRfbnVtX2NhY2hlIiwic2V0TmVlZE51bSIsInNldERvdWJsZUljb24iLCJpc1N1bW1vbk51bWJlciIsInNob3dPcmRlcldhckxvY2siLCJJc0dldFN0YXR1cyIsInNob3dXZWVrQ2FyZFRhZyIsInNldENvbnRlbnRTaXplIiwic2l6ZSIsInNldFNlbGVjdGVkIiwiY2FjaGVfbWFya3NlbGVjdF9zdGF0dXMiLCJvblNob3ciLCJjbGlja19ldmVudCIsIm9uIiwiTm9kZSIsIkV2ZW50VHlwZSIsIlRPVUNIX0VORCIsIm9uQ2xpY2tSb290V25kIiwiVE9VQ0hfU1RBUlQiLCJUT1VDSF9DQU5DRUwiLCJlbmFibGVkIiwidXBkYXRlRGF0YSIsImV2ZW50IiwidHlwZSIsIlRpcHNDb250cm9sbGVyIiwiY2hlY2tJc0VxdWlwIiwiZ2V0SW5zdGFuY2UiLCJzaG93RXF1aXBUaXBzIiwiY29uZmlnIiwiYmlkIiwiVXRpbHMiLCJnZXRJdGVtQ29uZmlnIiwiY2hlY2tvdXRJc1dlZWtDYXJkIiwic2hvd1dlZWtDYXJkVGlwcyIsImNoZWNrSXNIZXJvU2tpbiIsIkhlcm9Db250cm9sbGVyIiwib3Blbkhlcm9Ta2luVGlwc1BhbmVsIiwiaXNfc2hvd19zb3VyY2UiLCJzb3VyY2UiLCJuZXh0IiwiQmFja3BhY2tDb250cm9sbGVyIiwib3BlblRpcHNTb3VyY2UiLCJpc190aXBzX3NvdXJjZSIsInNob3dHb29kc1RpcHMiLCJzb3VyY2VfY2FsbGJhY2siLCJvbkhpZGUiLCJzZXRFeHRlbmREYXRhIiwiaXNfc2hvd19jaGlwX2xvYWRpbmciLCJzaG93Q2hlY2tCb3giLCJjaGVja0JveENsaWNrQ2FsbEJhY2siLCJjbGlja19jaGVja19jYWxsYmFjayIsImFkanVzdENoZWNrQm94UG9zIiwiY2hlY2tfYm94X3BvcyIsImlzX2hpZGVfZWZmZWN0IiwiaXNfY2FtcHR5cGUiLCJzdGF0dXMiLCJkZXNjIiwiZXh0ZW5kIiwic2V0U2VsZkVmZmVjdCIsImlzX2VmZmVjdCIsImVmZmVjdF9pZCIsImFjdGlvbiIsIlBsYXllckFjdGlvbiIsImFjdGlvbl8yIiwicXVhbGl0eSIsImFjdGlvbl8xIiwiYm9vbCIsImlzX2xvb3AiLCJyZXNfaWQiLCJDb25maWciLCJlZmZlY3RfZGF0YSIsImRhdGFfZWZmZWN0X2luZm8iLCJwYXRoIiwianMiLCJmb3JtYXRTdHIiLCJsb2FkUmVzIiwicmVzIiwic2tlbGV0b25EYXRhIiwic2V0QW5pbWF0aW9uIiwiYmluZCIsImFkZENhbGxCYWNrIiwiYWRkQWN0aW9uQ2FsbEJhY2siLCJzZXREYXRhIiwic2V0RXh0ZW5kTGFiZWwiLCJzdHIiLCJjb2xvciIsImZvbnRfc2l6ZSIsImN1cl9zZWxlY3QiLCJmcm9tSEVYIiwiY29sb3JfZGF0YSIsImRhdGFfY29sb3IxNiIsImZvbnRTaXplIiwibGluZUhlaWdodCIsInRtcF9pbmRleCIsIm5hbWUiLCJzdXNwZW5kQWxsQWN0aW9ucyIsInR5cGVfdm8iLCJxdWFudGl0eSIsImlkIiwiT2JqZWN0IiwidW5kYXRhIiwic2V0UXVhbGl0eUJHIiwic2V0SXRlbU51bSIsInNldEl0ZW1DaGlwIiwic2V0SXRlbVN0YXIiLCJzZXRDb21wTnVtYmVyIiwic2V0SXRlbUNhbXAiLCJleHBlZGl0X2NhaGUiLCJzaG93U2VsbFN0YXR1cyIsInNldENoZWNrQm94U3RhdHVzIiwiY2FjaGVfcmVkX3N0YXR1cyIsInJlY2VpdmVkU3RhdHVzIiwic2V0U3VtbW9uTnVtYmVyIiwic2V0V2Vla0NhcmREYXRhIiwidGlwc19idG4iLCJzaG93X3R5cGUiLCJjaGVja0lzV2Vla0NhcmQiLCJ0ZW1wX3F1YWxpdHkiLCJiZ19wYXRoIiwiZ2V0SXRlbVF1YWxpdHlCRyIsImJnX3F1YWxpdHkiLCJjb21tb25fcmVzX3BhdGgiLCJnZXRDb21tb25JY29tUGF0aCIsIkxvYWRlck1hbmFnZXIiLCJzZl9vYmoiLCJpc1ZhbGlkIiwic3ByaXRlRnJhbWUiLCJnZXRNb25leVN0cmluZyIsIndpZHRoIiwibmVlZF9udW0iLCJmb3JjZSIsIl91cGRhdGVSZW5kZXJEYXRhIiwidXBkYXRlTnVtQkdTaXplIiwiZ2V0SXRlbVJlcyIsImljb24iLCJyZXNfb2JqZWN0IiwiaXRlbV90eXBlIiwiUEFSVE5FUl9ERUJSSVMiLCJpbmRleCIsImVxbV9zdGFyIiwiZXFtX2ppZSIsIkFSVElGQUNUQ0hJUFMiLCJlbmNoYW50IiwieCIsImluc3RhbnRpYXRlIiwiYWRkQ2hpbGQiLCJnZGF0YSIsImN1cl9udW0iLCJtYXhfbnVtIiwicGVyIiwiTWF0aCIsIm1pbiIsIm1heCIsInN1Yl90eXBlIiwibGV2IiwiY2FtcF9wYXRoIiwiZ2V0SGVyb0NhbXBSZXMiLCJXRUFQT04iLCJTSE9FIiwiQ0xPVEhFUyIsIkhBVCIsImdldEl0ZW1EYXRhIiwic2V0U3RhdGUiLCJTdGF0ZSIsIk5PUk1BTCIsIkdSQVkiLCJpIiwiQ29sb3IiLCJxaWFuX2ljb24iLCJjcmVhdGVJbWFnZSIsInYyIiwicWlhbl9sYWJlbCIsImNyZWF0ZUxhYmVsIiwicm90YXRpb24iLCJoZWlnaHQiLCJoZXJvRXhwZWRpdFRhZyIsImhlcm9FeHBlZGl0VGFnX2Rlc2MiLCJzZXRSb3RhdGlvbiIsImFkZF9idG5fc3AiLCJidG4iLCJhZGRDb21wb25lbnQiLCJCdXR0b24iLCJ0cmFuc2l0aW9uIiwiVHJhbnNpdGlvbiIsIlNDQUxFIiwic2V0RW1wdHlJY29uUGF0aCIsImljb25fcGF0aCIsImdldERhdGEiLCJpc19zZWxlY3QiLCJjaGVja19ib3giLCJzZXRWaXNpYmxlIiwiVG9nZ2xlSXRlbSIsInNldFBhcmVudCIsImFkZENsaWNrQ2FsbEJhY2siLCJpc1NlbGVjdGVkIiwic2V0R29vZHNBdHRyIiwicmVjZWl2ZWRfaWNvbiIsImRvdWJsZV9pY29uIiwiZ2V0VUlJY29uUGF0aCIsIk51bWJlciIsInByb2JhYmlsaXR5IiwidG9GaXhlZCIsIm9yZGVyX3dhcl9sb2NrIiwiaXNfZ2V0X3NlbGVjdCIsImJnIiwiY2FyZF90eXBlIiwidiIsInVzZV93ZWVrX2NhcmQiLCJkZXN0cm95Iiwib25EZWxldGUiLCJkZWxldGVNZSIsIm9mZiIsIkl0ZW1zUG9vbCIsImNhY2hlSXRlbSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQSxRQUFRLEdBQUdDLE9BQU8sQ0FBQyxVQUFELENBQXRCOztBQUNBLElBQUlDLE9BQU8sR0FBR0QsT0FBTyxDQUFDLFVBQUQsQ0FBckI7O0FBQ0EsSUFBSUQsUUFBUSxHQUFHQyxPQUFPLENBQUMsVUFBRCxDQUF0Qjs7QUFDQSxJQUFJRSxhQUFhLEdBQUdGLE9BQU8sQ0FBQyxnQkFBRCxDQUEzQjs7QUFFQSxJQUFJRyxZQUFZLEdB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LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBAYXV0aG9yOiBzaGlyYWhvQHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAgIOeJqeWTgeWNleWIlyzmmL7npLrlr7nosaFcbi8vIDxici8+Q3JlYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgUGF0aFRvb2wgPSByZXF1aXJlKFwicGF0aHRvb2xcIik7XG52YXIgR29vZHNWbyA9IHJlcXVpcmUoXCJnb29kc192b1wiKTtcbnZhciBQYXRoVG9vbCA9IHJlcXVpcmUoXCJwYXRodG9vbFwiKTtcbnZhciBCYWNrUGFja0NvbnN0ID0gcmVxdWlyZShcImJhY2twYWNrX2NvbnN0XCIpO1xuXG52YXIgQmFja1BhY2tJdGVtID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VQYW5lbCxcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7ICAgICAvLyDlj6/kvKDlj4LmlbAs56ys5LiA5Liq5piv5ZCm5piv6Ieq5bex54mp5ZOBLOWPquacieiDjOWMheaIluiAheS8meS8tOi6q+S4iuaJjeeulyDnrKzkuozkuKrnvKnmlL7lgLws56ys5LiJ5Liq5piv5ZCm54K55Ye75pS257ypLOesrOWbm+aYr+WQpuaYvuekunRpcHMg56ys5LqU5piv5ZCm5pi+56S66aKd5aSW5ZCN5a2XXG4gICAgICAgIHRoaXMucHJlZmFiUGF0aCA9IFBhdGhUb29sLmdldFByZWZhYlBhdGgoXCJiYWNrcGFja1wiLCBcImdvb2RzX2l0ZW1cIik7XG4gICAgICAgIHRoaXMuc2NhbGUgPSAxOyAgICAgICAgICAgICAgICAgICAgIC8vIOe8qeaUvuavlFxuICAgICAgICB0aGlzLmlzX290aGVyID0gZmFsc2U7ICAgICAgICAgICAgICAvLyDmmK/lkKbmmK/lhbbku5bkurrnmoTnianlk4Es5Y+q6KaB5LiN5piv6IOM5YyF5ZKM6Ieq5bex5LyZ5Ly06Lqr5LiK55qE6YO95piv5YW25LuWXG4gICAgICAgIHRoaXMuZWZmZWN0ID0gdHJ1ZTsgICAgICAgICAgICAgICAgIC8vIOaYr+WQpuWTjeW6lOaMiemSrui/h+a7pFxuICAgICAgICB0aGlzLmlzX3Nob3dfdGlwcyA9IHRydWU7ICAgICAgICAgICAvLyDmmK/lkKbmmL7npLp0aXBzXG4gICAgICAgIFxuICAgICAgICB0aGlzLml0ZW1fY29uZmlnID0gbnVsbDsgICAgICAgICAgICAvLyDnianlk4HnmoTphY3nva7mlbDmja5cbiAgICAgICAgdGhpcy5pdGVtX251bSA9IDA7ICAgICAgICAgICAgICAgICAgLy8g54mp5ZOB5pWw6YePXG5cbiAgICAgICAgdGhpcy5sb2FkX2l0ZW1faWNvbiA9IHt9OyAgICAgICAgICAgIC8vIOWKoOi9vei/h+eahOeJqeWTgeWbvuagh1xuICAgICAgICB0aGlzLmJlZm9yZV9vdmVyX3NldCA9IGZhbHNlOyAgICAgICAvLyDliJvlu7rlrozmiJDkuYvlkI7mmK/lkKbopoHorr7nva5cbiAgICAgICAgdGhpcy5zdGFyX2xpc3QgPSBbXSAgICAgICAgICAgICAgICAgLy8g5pif5pif55qE5YiX6KGoXG5cbiAgICAgICAgdGhpcy5zaG93X2NoZWNrX2JveCA9IGZhbHNlXHRcdFx0Ly8g5piv5ZCm6ZyA6KaB5qC55o2u5pWw5o2u546w5Zyo5aSN6YCJ5qGGXG5cbiAgICAgICAgaWYgKGFyZ3VtZW50cyAmJiBhcmd1bWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5pc19vdGhlciA9IGFyZ3VtZW50c1swXSB8fCBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc2NhbGUgPSBhcmd1bWVudHNbMV0gfHwgMTtcbiAgICAgICAgICAgIHRoaXMuZWZmZWN0ID0gYXJndW1lbnRzWzJdIHx8IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5pc19zaG93X3RpcHMgPSBhcmd1bWVudHNbM10gfHwgZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmlzX3Nob3dfbmFtZSA9IGFyZ3VtZW50c1s0XSB8fCBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuYmVmb3JlX292ZXJfc2V0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzVW5FbmFibGVkID0gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICB0aGlzLmlzU2hvd0JpYW9RaWFuID0gZmFsc2U7IC8v5piv5ZCm5pi+56S65qCH562+XG4gICAgICAgIHRoaXMuYmlhb1FpYW5TdHIgPSBcIlwiO1xuXG4gICAgICAgIHRoaXMubmFtZV9jb2xvciA9IG51bGw7XG4gICAgICAgIHRoaXMubmFtZV9zaXplID0gMTg7XG5cbiAgICAgICAgdGhpcy5pc1NldEVmZmVjdCA9IGZhbHNlOyAvL+aYr+WQpuaJi+WKqOiuvue9rueJueaViFxuXG4gICAgICAgIHRoaXMuaXNDYWNoZSA9IHRydWU7Ly/nvJPlrZhcblxuICAgICAgICB0aGlzLmlzU2hvd09yZGVyV2FyTG9jayA9IGZhbHNlOyAgICAgIC8v5piv5ZCm5pi+56S65oiY5Luk6ZSBXG4gICAgICAgIHRoaXMuaXNfc2hvd19nZXRfc2VsZWN0ID0gZmFsc2U7ICAgICAgIC8v5piv5ZCm5pi+56S66aKG5Y+W54q25oCBXG4gICAgfSxcblxuICAgIGluaXRQYW5lbDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm1haW5fY29udGFpbmVyID0gdGhpcy5yb290X3duZC5nZXRDaGlsZEJ5TmFtZShcIm1haW5fY29udGFpbmVyXCIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOeCueWHu+WMuuWfn1xuICAgICAgICB0aGlzLmJsb2NrX2V2ZW50ID0gIHRoaXMucm9vdF93bmQuZ2V0Q29tcG9uZW50KGNjLkJsb2NrSW5wdXRFdmVudHMpXG4gICAgICAgIHRoaXMuaXRlbSA9IHRoaXMubWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJpY29uXCIpXG4gICAgICAgIHRoaXMuaXRlbV9pY29uID0gdGhpcy5tYWluX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImljb25cIikuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSkgICAgICAgICAgICAgICAgICAgICAvLyDnianlk4Hlm77moIdcblxuICAgICAgICAvLyB0aGlzLmJhY2tncm91bmQgPSB0aGlzLm1haW5fY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiYmFja2dyb3VuZFwiKTtcbiAgICAgICAgdGhpcy5xdWFsaXR5X2JnID0gdGhpcy5tYWluX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImJhY2tncm91bmRcIikuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSkgICAgICAgICAgICAgIC8vIOiDjOaZr+WTgei0qOahhlxuXG4gICAgICAgIHRoaXMubnVtX2JnID0gdGhpcy5tYWluX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcIm51bV9iZ1wiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmlbDph4/lrrnlmahcbiAgICAgICAgdGhpcy5udW1fYmFja2dyb3VuZCA9IHRoaXMubnVtX2JnLmdldENoaWxkQnlOYW1lKFwiYmFja2dyb3VuZFwiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOaVsOmHj+iDjOaZryzpnIDopoHmoLnmja7mlbDph4/lgZrplb/luqblj5jmjaJcbiAgICAgICAgdGhpcy5udW1fYmdfc2l6ZSA9IHRoaXMubnVtX2JhY2tncm91bmQuZ2V0Q29udGVudFNpemUoKVxuICAgICAgICB0aGlzLm51bSA9IHRoaXMubnVtX2JnLmdldENoaWxkQnlOYW1lKFwibnVtXCIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5pWw6YeP6IqC54K5XG4gICAgICAgIHRoaXMubnVtX2xhYmVsID0gdGhpcy5udW0uZ2V0Q29tcG9uZW50KGNjLkxhYmVsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5pWw6YeP5paH5pysXG5cbiAgICAgICAgdGhpcy5zZWxlY3QgPSB0aGlzLm1haW5fY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwic2VsZWN0XCIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOmAieS4reahhlxuICAgICAgICB0aGlzLnN0YXJfbm9kZSA9IHRoaXMubWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJzdGFyX25vZGVcIik7XG4gICAgICAgIHRoaXMuc3RhciA9IHRoaXMuc3Rhcl9ub2RlLmdldENoaWxkQnlOYW1lKFwic3RhclwiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5pif5pWwaWNvblxuICAgICAgICB0aGlzLmNoaXAgPSB0aGlzLm1haW5fY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiY2hpcFwiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g56KO54mH5qCH5b+XXG4gICAgICAgIHRoaXMucmVkX3RpcHMgPSB0aGlzLm1haW5fY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwicmVkX3RpcHNcIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDnuqLngrnmoIflv5dcblxuICAgICAgICB0aGlzLnByb2dyZXNzX25vZGUgPSB0aGlzLm1haW5fY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwicHJvZ3Jlc3NcIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5omp5bGV6L+b5bqm5p2hXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSB0aGlzLnByb2dyZXNzX25vZGUuZ2V0Q29tcG9uZW50KGNjLlByb2dyZXNzQmFyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g55yf5piv6L+b5bqm5p2hXG4gICAgICAgIHRoaXMucHJvZ3Jlc3NfbGFiZWwgPSB0aGlzLnByb2dyZXNzX25vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJsYWJlbFwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpICAgICAgICAgICAgICAgICAvLyDov5vluqbmnaHkuIrpnaLnmoTlgLxcblxuICAgICAgICB0aGlzLmNhbXAgPSB0aGlzLm1haW5fY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiY2FtcFwiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g6Zi16JClXG4gICAgICAgIHRoaXMuY2FtcF9zcHJpdGUgPSB0aGlzLmNhbXAuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSlcblxuICAgICAgICB0aGlzLmV4dGVuZF90YWcgPSB0aGlzLm1haW5fY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiZXh0ZW5kX3RhZ1wiKTtcbiAgICAgICAgdGhpcy5leHRlbmRfZGVzYyA9IHRoaXMubWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJleHRlbmRfZGVzY1wiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xuICAgICAgICB0aGlzLnBsYXlfZWZmZWN0ID0gdGhpcy5tYWluX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcInBsYXlfZWZmZWN0XCIpLmdldENvbXBvbmVudChzcC5Ta2VsZXRvbik7XG4gICAgICAgIHRoaXMubWFyayA9IHRoaXMubWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJtYXJrXCIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDojrflj5bpgInkuK1cblxuICAgICAgICB0aGlzLmV4dGVuZF9sYWJlbCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMubWFpbl9jb250YWluZXIsIFwiZXh0ZW5kX2xhYmVsXCIsIGNjLkxhYmVsKTsgICAgICAgICAgICAgICAgICAgICAgLy8g5LiL6YOo55qE6aKd5aSW5paH5a2X5o+P6L+wICAgXG5cbiAgICAgICAgaWYgKHRoaXMuYmVmb3JlX292ZXJfc2V0KSB7XG4gICAgICAgICAgICB0aGlzLmluaXRTb21lU2V0KClcbiAgICAgICAgICAgIHRoaXMuYmVmb3JlX292ZXJfc2V0ID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zaG93SXRlbUVmZmVjdF9jYWNoZSkge1xuICAgICAgICAgICAgdGhpcy5zaG93SXRlbUVmZmVjdC5hcHBseSh0aGlzLCB0aGlzLnNob3dJdGVtRWZmZWN0X2NhY2hlKTtcbiAgICAgICAgICAgIHRoaXMuc2hvd0l0ZW1FZmZlY3RfY2FjaGUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmV4dGVuZF9jYWNoZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRFeHRlbmRUYWcuYXBwbHkodGhpcywgdGhpcy5leHRlbmRfY2FjaGUpO1xuICAgICAgICAgICAgdGhpcy5leHRlbmRfY2FjaGUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNldF9udW1fYmdfY2FjaGUpIHtcbiAgICAgICAgICAgIHZhciBhcnIgPSB0aGlzLnNldF9udW1fYmdfY2FjaGU7XG4gICAgICAgICAgICB0aGlzLnNldE51bUJnUG9zKGFyci5wb3MsIGFyci5hciwgYXJyLnBvczEsIGFyci5hcjEpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmJnX3N0YXR1cyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNldElzU2hvd0JhY2tncm91bmQodGhpcy5iZ19zdGF0dXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFkZF9idG5fYm9vbCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dBZGRJY29uKHRoaXMuYWRkX2J0bl9ib29sKTtcbiAgICAgICAgfVxuICAgICAgICBpZih0aGlzLmhlYWRfaWNvbiAhPSBudWxsKXtcbiAgICAgICAgICAgIHRoaXMuc2V0SXRlbUljb24odGhpcy5oZWFkX2ljb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRJdGVtSWNvblVuRW5hYmxlZCh0aGlzLmlzVW5FbmFibGVkKTtcbiAgICB9LFxuXG4gICAgcmVnaXN0ZXJFdmVudDogZnVuY3Rpb24gKCkge1xuICAgICAgICBcbiAgICB9LFxuICAgIGluaXQoKXtcbiAgICAgICAgLy/lm6DkuLrkvJrlpI3nlKjpnIDopoHliJ3lp4vljJZcbiAgICAgICAgdGhpcy5zZXRQb3NpdGlvbigwLDApXG4gICAgICAgIHRoaXMuc2V0QW5jaG9yUG9pbnQoMC41LDAuNSlcbiAgICAgICAgdGhpcy5zY2FsZSA9IDFcbiAgICAgICAgdGhpcy5pdGVtX3Jlc19wYXRoID0gbnVsbDtcbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IG51bGw7XG4gICAgICAgIHRoaXMuYWN0aW9uQ2FsbGJhY2sgPSBudWxsO1xuICAgICAgICB0aGlzLmRhdGEgPSBudWxsO1xuICAgICAgICB0aGlzLm5hbWVfY29sb3IgPSBudWxsO1xuICAgICAgICB0aGlzLm5hbWVfc2l6ZSA9IDE4O1xuICAgICAgICBpZih0aGlzLmV4dGVuZF9sYWJlbCl7XG4gICAgICAgICAgICB0aGlzLmV4dGVuZF9sYWJlbC5ub2RlLnkgPSAtNzFcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5kX2xhYmVsLnN0cmluZyA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbXB0eV9pY29uX3BhdGggPSBudWxsO1xuICAgICAgICB0aGlzLmluaXRDb25maWcoZmFsc2UsZmFsc2UsbnVsbCxmYWxzZSxmYWxzZSk7XG4gICAgICAgIGlmKHRoaXMucHJvZ3Jlc3Nfbm9kZSl7XG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzX25vZGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRSZWRTdGF0dXMoZmFsc2UpO1xuICAgICAgICB0aGlzLnNldEV4dGVuZFRhZyhmYWxzZSk7XG4gICAgICAgIHRoaXMuc2hvd0l0ZW1FZmZlY3QoZmFsc2UpO1xuICAgICAgICB0aGlzLnNldERlZmF1bHRUaXAoZmFsc2UsZmFsc2UsZmFsc2UsZmFsc2UpO1xuICAgICAgICB0aGlzLnNldE1hc2tWaXNpYmxlKGZhbHNlKTtcbiAgICAgICAgdGhpcy5zZXRJdGVtSWNvblVuRW5hYmxlZChmYWxzZSk7XG4gICAgICAgIHRoaXMuc2hvd0JpYW9RaWFuKGZhbHNlKTtcbiAgICAgICAgdGhpcy5pc19jb21wX251bSA9IG51bGw7XG4gICAgICAgIHRoaXMuaG9saWRIZXJvRXhwZWRpdFRhZyhmYWxzZSk7XG4gICAgICAgIHRoaXMuc2hvd0FkZEljb24oZmFsc2UpO1xuICAgICAgICB0aGlzLnNldElzU2hvd0JhY2tncm91bmQodHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0UmVjZWl2ZWRJY29uKGZhbHNlKTtcbiAgICAgICAgdGhpcy5jdXJfdmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICBpZih0aGlzLnNldF9uZWVkX251bV9jYWNoZSl7XG4gICAgICAgICAgICB0aGlzLnNldE5lZWROdW0oMCwwLG51bGwsZmFsc2UpXG4gICAgICAgICAgICB0aGlzLnNldF9uZWVkX251bV9jYWNoZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXREb3VibGVJY29uKGZhbHNlKVxuICAgICAgICB0aGlzLmlzU3VtbW9uTnVtYmVyID0gbnVsbDtcblxuICAgICAgICB0aGlzLnNob3dPcmRlcldhckxvY2soZmFsc2UpO1xuICAgICAgICB0aGlzLklzR2V0U3RhdHVzKGZhbHNlKTtcbiAgICAgICAgdGhpcy5zaG93V2Vla0NhcmRUYWcoZmFsc2UpXG4gICAgICAgIGlmKHRoaXMubnVtX2xhYmVsKXtcbiAgICAgICAgICAgIHRoaXMubnVtX2xhYmVsLnN0cmluZyA9IFwiXCI7XG4gICAgICAgICAgICB0aGlzLm51bV9sYWJlbC5ub2RlLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy5udW1fYmcpe1xuICAgICAgICAgICAgdGhpcy5udW1fYmcuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLm51bV9iZy5zZXRQb3NpdGlvbig1MS44LC00MSlcbiAgICAgICAgICAgIHRoaXMubnVtX2JnLnNldEFuY2hvclBvaW50KDEsMC41KVxuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMubnVtX2JhY2tncm91bmQpe1xuICAgICAgICAgICAgdGhpcy5udW1fYmFja2dyb3VuZC5zZXRQb3NpdGlvbigwLDApO1xuICAgICAgICAgICAgdGhpcy5udW1fYmFja2dyb3VuZC5zZXRBbmNob3JQb2ludCgxLDAuNSlcbiAgICAgICAgICAgIHRoaXMubnVtX2JhY2tncm91bmQuc2V0Q29udGVudFNpemUoY2Muc2l6ZSgzMCwyMikpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubnVtKSB7XG4gICAgICAgICAgICB0aGlzLm51bS5zZXRQb3NpdGlvbigtMi41LCAtMC4xKTtcbiAgICAgICAgICAgIHRoaXMubnVtLnNldEFuY2hvclBvaW50KDEsMC41KTsgICBcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFNlbGVjdGVkKGZhbHNlKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOWIneWni+WMluS4gOS6m+WPguaVsOiuvue9rlxuICAgICAqIEBwYXJhbSB7Kn0gaXNfb3RoZXIg6Ieq5bex6IOM5YyF5oiW6ICF5YW25LuW6YOo5YiGLOWMheWQq+S6huiHquW3seS8meS8tOi6q+S4iuiDjOWMhSBcbiAgICAgKiBAcGFyYW0geyp9IHNjYWxlIOe8qeaUvuWAvFxuICAgICAqIEBwYXJhbSB7Kn0gZWZmZWN0IOaYr+WQpuWTjeW6lOaMiemSrui/h+a7pCAgdGhpcy5jbGljay50cmFuc2l0aW9uID0gY2MuQnV0dG9uLlRyYW5zaXRpb24uTk9ORSAgLy9TQ0FMRVxuICAgICAqIEBwYXJhbSB7Kn0gaXNfc2hvd190aXBzIOaYr+WQpuaYvuekunRpcHNcbiAgICAgKiBAcGFyYW0geyp9IGlzX3Nob3dfbmFtZSDmmK/lkKblnKjkuIvmlrnmmL7npLrnianlk4HlkI3lrZdcbiAgICAgKi9cbiAgICBpbml0Q29uZmlnOiBmdW5jdGlvbiAoaXNfb3RoZXIsIHNjYWxlLCBlZmZlY3QsIGlzX3Nob3dfdGlwcywgaXNfc2hvd19uYW1lKSB7XG4gICAgICAgIHRoaXMuaXNfb3RoZXIgPSBpc19vdGhlciB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy5zY2FsZSA9IHNjYWxlIHx8IDE7XG4gICAgICAgIHRoaXMuZWZmZWN0ID0gZWZmZWN0ID09IG51bGwgPyB0cnVlIDogZWZmZWN0O1xuICAgICAgICB0aGlzLmlzX3Nob3dfdGlwcyA9IGlzX3Nob3dfdGlwcyB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy5pc19zaG93X25hbWUgPSBpc19zaG93X25hbWUgfHwgZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMucm9vdF93bmQpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdFNvbWVTZXQoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5iZWZvcmVfb3Zlcl9zZXQgPSB0cnVlXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5Yid5aeL5YyW5LiA5Lqb6K6+5a6aXG4gICAgaW5pdFNvbWVTZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMucm9vdF93bmQgPT0gbnVsbCkgcmV0dXJuXG4gICAgICAgIC8vIGlmICh0aGlzLnNjYWxlICE9IDEpIHtcbiAgICAgICAgICAgIC8vIHRoaXMubWFpbl9jb250YWluZXIuc2NhbGUgPSB0aGlzLnNjYWxlXG4gICAgICAgICAgICB0aGlzLnJvb3Rfd25kLnNjYWxlID0gdGhpcy5zY2FsZTtcbiAgICAgICAgLy8gfVxuICAgICAgICBpZiAodGhpcy5jYWNoZV9tYXJrc2VsZWN0X3N0YXR1cyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNldE1hc2tWaXNpYmxlKHRoaXMuY2FjaGVfbWFya3NlbGVjdF9zdGF0dXMpXG4gICAgICAgICAgICB0aGlzLmNhY2hlX21hcmtzZWxlY3Rfc3RhdHVzID0gbnVsbFxuICAgICAgICB9XG4gICAgfSxcblxuICAgIG9uU2hvdzogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5yb290X3duZCAmJiAhdGhpcy5jbGlja19ldmVudCkge1xuICAgICAgICAgICAgdGhpcy5yb290X3duZC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsdGhpcy5vbkNsaWNrUm9vdFduZCx0aGlzKVxuICAgICAgICAgICAgdGhpcy5yb290X3duZC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9TVEFSVCwgdGhpcy5vbkNsaWNrUm9vdFduZCwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLnJvb3Rfd25kLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0NBTkNFTCwgdGhpcy5vbkNsaWNrUm9vdFduZCwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLmNsaWNrX2V2ZW50ID0gdHJ1ZVxuICAgICAgICAgICAgaWYodGhpcy5ibG9ja19ldmVudCl7XG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja19ldmVudC5lbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZURhdGEoKTtcbiAgICB9LFxuICAgIG9uQ2xpY2tSb290V25kKGV2ZW50KXtcblxuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfU1RBUlQpIHtcbiAgICAgICAgICAgIGlmKHRoaXMuZWZmZWN0KXtcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3Rfd25kLnNjYWxlID0gKHRoaXMuc2NhbGUgfHwgMSkgKiAwLjk7XG4gICAgICAgICAgICB9IFxuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfQ0FOQ0VMKSB7XG4gICAgICAgICAgICBpZih0aGlzLmVmZmVjdCl7XG4gICAgICAgICAgICAgICAgdGhpcy5yb290X3duZC5zY2FsZSA9IHRoaXMuc2NhbGUgfHwgMTsgXG4gICAgICAgICAgICB9IFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5EKSB7XG4gICAgICAgICAgICBpZih0aGlzLmVmZmVjdCl7XG4gICAgICAgICAgICAgICAgdGhpcy5yb290X3duZC5zY2FsZSA9IHRoaXMuc2NhbGUgfHwgMTsgIFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrLmFwcGx5KG51bGwsIFt0aGlzXSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNfc2hvd190aXBzICYmIHRoaXMuaXRlbV9jb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIFRpcHNDb250cm9sbGVyID0gcmVxdWlyZShcInRpcHNfY29udHJvbGxlclwiKVxuICAgICAgICAgICAgICAgICAgICBpZiAoQmFja1BhY2tDb25zdC5jaGVja0lzRXF1aXAodGhpcy5pdGVtX2NvbmZpZy50eXBlKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g6KOF5aSHXG4gICAgICAgICAgICAgICAgICAgICAgICBUaXBzQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNob3dFcXVpcFRpcHModGhpcy5pdGVtX2NvbmZpZylcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uZmlnO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5kYXRhLmNvbmZpZyl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gdGhpcy5kYXRhLmNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKHRoaXMuZGF0YS5iaWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IFV0aWxzLmdldEl0ZW1Db25maWcodGhpcy5kYXRhLmJpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZih0aGlzLmRhdGEpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IHRoaXMuZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29uZmlnKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihCYWNrUGFja0NvbnN0LmNoZWNrb3V0SXNXZWVrQ2FyZChjb25maWcudHlwZSkpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaXBzQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNob3dXZWVrQ2FyZFRpcHModHJ1ZSx0aGlzLml0ZW1fY29uZmlnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKEJhY2tQYWNrQ29uc3QuY2hlY2tJc0hlcm9Ta2luKGNvbmZpZy50eXBlKSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBIZXJvQ29udHJvbGxlciA9IHJlcXVpcmUoXCJoZXJvX2NvbnRyb2xsZXJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGVyb0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5vcGVuSGVyb1NraW5UaXBzUGFuZWwodHJ1ZSwgdGhpcy5pdGVtX2NvbmZpZylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g6Jm954S25pi+56S654mp5ZOB5p2l5rqQLOS9huaYr+WmguaenOayoeaciemFjee9ruS5n+S4jemcgOimgeaYvuekulxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmlzX3Nob3dfc291cmNlID09IHRydWUgJiYgY29uZmlnLnNvdXJjZSAmJiBVdGlscy5uZXh0KGNvbmZpZy5zb3VyY2UpKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBCYWNrcGFja0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiYmFja3BhY2tfY29udHJvbGxlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhY2twYWNrQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLm9wZW5UaXBzU291cmNlKHRydWUsIGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKHRoaXMuaXNfdGlwc19zb3VyY2Upe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlwc0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5zaG93R29vZHNUaXBzKGNvbmZpZywgdHJ1ZSwgdGhpcy5pc190aXBzX3NvdXJjZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaXBzQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNob3dHb29kc1RpcHMoY29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnNvdXJjZV9jYWxsYmFjayApe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VfY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKHRoaXMuYWN0aW9uQ2FsbGJhY2spe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbkNhbGxiYWNrLmFwcGx5KG51bGwsIFt0aGlzXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAgIFxuICAgICAgICB9XG5cbiAgICB9LFxuICAgIG9uSGlkZTogZnVuY3Rpb24gKCkge1xuXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIOaJqeWxleWPguaVsCzlj6rmnInov5nkuKrlr7nosaHnlKjlnKggQ29tbW9uU2Nyb2xsZVZpZXfnmoTml7blgJnnlKjliLBcbiAgICAgKiBAcGFyYW0geyp9IGRhdGEgXG4gICAgICovXG4gICAgc2V0RXh0ZW5kRGF0YTogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdGhpcy5pbml0Q29uZmlnKGRhdGEuaXNfb3RoZXIsIGRhdGEuc2NhbGUsIGRhdGEuZWZmZWN0LCBkYXRhLmlzX3Nob3dfdGlwcylcblxuICAgICAgICAvLyDmmK/lkKbmmL7npLrnoo7niYfov5vluqbmnaFcbiAgICAgICAgdGhpcy5pc19zaG93X2NoaXBfbG9hZGluZyA9IGRhdGEuaXNfc2hvd19jaGlwX2xvYWRpbmcgfHwgZmFsc2VcblxuICAgICAgICBpZihkYXRhLnNob3dDaGVja0JveCE9IG51bGwpe1xuICAgICAgICAgICAgdGhpcy5zaG93X2NoZWNrX2JveCA9IGRhdGEuc2hvd0NoZWNrQm94XG4gICAgICAgIH1cbiAgICAgICAgaWYoZGF0YS5jaGVja0JveENsaWNrQ2FsbEJhY2shPSBudWxsKXtcbiAgICAgICAgICAgIHRoaXMuY2xpY2tfY2hlY2tfY2FsbGJhY2sgPSBkYXRhLmNoZWNrQm94Q2xpY2tDYWxsQmFjaztcbiAgICAgICAgfVxuICAgICAgICBpZihkYXRhLmFkanVzdENoZWNrQm94UG9zKXtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tfYm94X3BvcyA9IGRhdGEuYWRqdXN0Q2hlY2tCb3hQb3M7XG4gICAgICAgIH1cbiAgICAgICAgaWYoZGF0YS5pc19jb21wX251bSAhPSBudWxsKXtcbiAgICAgICAgICAgIHRoaXMuaXNfY29tcF9udW0gPSBkYXRhLmlzX2NvbXBfbnVtO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoZGF0YS5pc19oaWRlX2VmZmVjdCl7XG4gICAgICAgICAgICB0aGlzLmlzX2hpZGVfZWZmZWN0ID0gZGF0YS5pc19oaWRlX2VmZmVjdDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC0t6IOM5YyF5piv5ZCm5pi+56S66Zi16JClXG5cdFx0aWYoZGF0YS5pc19jYW1wdHlwZSAhPSBudWxsKXtcblx0XHRcdHRoaXMuaXNfY2FtcHR5cGUgPSBkYXRhLmlzX2NhbXB0eXBlXG4gICAgICAgIH1cblxuICAgICAgICBpZihkYXRhLmlzU3VtbW9uTnVtYmVyICE9IG51bGwpe1xuICAgICAgICAgICAgdGhpcy5pc1N1bW1vbk51bWJlciA9IGRhdGEuaXNTdW1tb25OdW1iZXJcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDorr7nva7lt6bovrnmlpzop5LnmoTkuIDkupvmiLNcbiAgICAgKiBAcGFyYW0geyp9IHN0YXR1cyBcbiAgICAgKiBAcGFyYW0geyp9IGRlc2MgXG4gICAgICogQHBhcmFtIHsqfSBleHRlbmQgXG4gICAgICovXG4gICAgc2V0RXh0ZW5kVGFnOiBmdW5jdGlvbiAoc3RhdHVzLCBkZXNjLCBleHRlbmQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmV4dGVuZF90YWcpIHtcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5kX2NhY2hlID0gW3N0YXR1cywgZGVzYywgZXh0ZW5kXTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5kX3RhZy5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5leHRlbmRfZGVzYy5ub2RlLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmV4dGVuZF9kZXNjLnN0cmluZyA9IGRlc2M7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmV4dGVuZF90YWcuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmV4dGVuZF9kZXNjLm5vZGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgc2V0U2VsZkVmZmVjdDpmdW5jdGlvbihjb25maWcpe1xuICAgICAgICBpZih0aGlzLmlzU2V0RWZmZWN0KXJldHVybjtcbiAgICAgICAgaWYoIXRoaXMuaXNfaGlkZV9lZmZlY3QgPT0gdHJ1ZSl7XG4gICAgICAgICAgICBpZihjb25maWcgJiYgY29uZmlnLmlzX2VmZmVjdCAmJiBjb25maWcuaXNfZWZmZWN0ID09IDEpe1xuICAgICAgICAgICAgICAgIHZhciBlZmZlY3RfaWQgPSAxNTY7XG4gICAgICAgICAgICAgICAgdmFyIGFjdGlvbiA9IFBsYXllckFjdGlvbi5hY3Rpb25fMjtcbiAgICAgICAgICAgICAgICBpZihjb25maWcucXVhbGl0eSA+PSA0KXtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gUGxheWVyQWN0aW9uLmFjdGlvbl8xO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dJdGVtRWZmZWN0KHRydWUsIGVmZmVjdF9pZCwgYWN0aW9uLCB0cnVlKVxuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93SXRlbUVmZmVjdChmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGhpcy5zaG93SXRlbUVmZmVjdChmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog5pWI5p6c5pi+56S6XG4gICAgICogQHBhcmFtIHsqfSBib29sIFxuICAgICAqIEBwYXJhbSB7Kn0gZWZmZWN0X2lkIFxuICAgICAqIEBwYXJhbSB7Kn0gYWN0aW9uIFxuICAgICAqIEBwYXJhbSB7Kn0gaXNfbG9vcCBcbiAgICAgKiBAcGFyYW0geyp9IHNjYWxlIFxuICAgICAqL1xuICAgIHNob3dJdGVtRWZmZWN0OiBmdW5jdGlvbiAoYm9vbCwgZWZmZWN0X2lkLCBhY3Rpb24sIGlzX2xvb3AsIHNjYWxlKSB7XG4gICAgICAgIGlmICghdGhpcy5wbGF5X2VmZmVjdCkge1xuICAgICAgICAgICAgdGhpcy5pc1NldEVmZmVjdCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnNob3dJdGVtRWZmZWN0X2NhY2hlID0gYXJndW1lbnRzO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZXNfaWQgPSBDb25maWcuZWZmZWN0X2RhdGEuZGF0YV9lZmZlY3RfaW5mb1tlZmZlY3RfaWRdO1xuICAgICAgICBpZiAoYm9vbCAmJiByZXNfaWQpIHtcbiAgICAgICAgICAgIHRoaXMucGxheV9lZmZlY3Qubm9kZS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgYWN0aW9uID0gYWN0aW9uIHx8IFBsYXllckFjdGlvbi5hY3Rpb25fMTtcbiAgICAgICAgICAgIHZhciBwYXRoID0gY2MuanMuZm9ybWF0U3RyKFwic3BpbmUvJXMvYWN0aW9uLmF0bGFzXCIsIHJlc19pZCk7XG4gICAgICAgICAgICB0aGlzLmxvYWRSZXMocGF0aCwgKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXlfZWZmZWN0LnNrZWxldG9uRGF0YSA9IHJlcztcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXlfZWZmZWN0LnNldEFuaW1hdGlvbigwLCBhY3Rpb24sIGlzX2xvb3ApO1xuICAgICAgICAgICAgfSkuYmluZCh0aGlzKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBsYXlfZWZmZWN0Lm5vZGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYoc2NhbGUgIT0gbnVsbCl7XG4gICAgICAgICAgICB0aGlzLnBsYXlfZWZmZWN0Lm5vZGUuc2NhbGUgPSBzY2FsZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBhZGRDYWxsQmFjazogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgIH0sXG5cbiAgICAvL+eUqOS6jumcgOimgeagueaNrmlzX3Nob3dfdGlwc+eKtuaAgeiwg+eUqGNhbGxiYWNr5L2/55SoXG4gICAgYWRkQWN0aW9uQ2FsbEJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLmFjdGlvbkNhbGxiYWNrID0gY2FsbGJhY2tcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog6K6+572u5pi+56S65pWw5o2uXG4gICAgICogQHBhcmFtIHsqfSBkYXRhICzlvZPliY3lj6/ku6XmlK/mjIEgZ29vZHN2byAsaXRlbV9jb25maWcgLHtiaWQsIG51bX0sIGJpZCDku6Xlj4rljIXlkKsgdW5kYXRh55qEb2JqZWN0XG4gICAgICovXG4gICAgc2V0RGF0YTogZnVuY3Rpb24gKGRhdGEsaXNfaGlkZV9lZmZlY3QpIHtcbiAgICAgICAgLy8gaWYoIWRhdGEpcmV0dXJuO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLmlzX2hpZGVfZWZmZWN0ID0gaXNfaGlkZV9lZmZlY3QgfHwgZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnJvb3Rfd25kKSB7XG4gICAgICAgICAgICB0aGlzLnJvb3Rfd25kLnNjYWxlID0gdGhpcy5zY2FsZTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRGF0YSgpXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgfSxcbiAgICAvLyB45LiL6YOo55qE6aKd5aSW5paH5a2X5o+P6L+wXG4gICAgc2V0RXh0ZW5kTGFiZWw6IGZ1bmN0aW9uIChzdHIsIGNvbG9yLGZvbnRfc2l6ZSkge1xuICAgICAgICBpZihjb2xvcil7XG4gICAgICAgICAgICB0aGlzLm5hbWVfY29sb3IgPSBjb2xvcjsgICAgICAgICAgIFxuICAgICAgICB9XG4gICAgICAgIGlmKGZvbnRfc2l6ZSAmJiBmb250X3NpemU+MCl7XG4gICAgICAgICAgICB0aGlzLm5hbWVfc2l6ZSA9IGZvbnRfc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBpZighdGhpcy5yb290X3duZCl7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc3RyID0gc3RyIHx8IFwiXCI7XG4gICAgICAgIGlmIChzdHIgPT0gXCJcIikge1xuICAgICAgICAgICAgLy8gdGhpcy5leHRlbmRfbGFiZWwuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmV4dGVuZF9sYWJlbC5zdHJpbmcgPSBzdHI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB0aGlzLmV4dGVuZF9sYWJlbC5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5leHRlbmRfbGFiZWwuc3RyaW5nID0gc3RyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoY29sb3Ipe1xuICAgICAgICAgICAgdmFyIGN1cl9zZWxlY3QgPSB0aGlzLmV4dGVuZF9sYWJlbC5ub2RlLmNvbG9yO1xuICAgICAgICAgICAgaWYodHlwZW9mKGNvbG9yKSA9PSBcIm51bWJlclwiKXtcbiAgICAgICAgICAgICAgICBjdXJfc2VsZWN0LmZyb21IRVgoQ29uZmlnLmNvbG9yX2RhdGEuZGF0YV9jb2xvcjE2W2NvbG9yXSk7XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICBjdXJfc2VsZWN0LmZyb21IRVgoY29sb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5leHRlbmRfbGFiZWwubm9kZS5jb2xvciA9IGN1cl9zZWxlY3Q7XG4gICAgICAgIH1cblxuICAgICAgICBpZihmb250X3NpemUgJiYgZm9udF9zaXplPjApe1xuICAgICAgICAgICAgdGhpcy5leHRlbmRfbGFiZWwuZm9udFNpemUgPSB0aGlzLm5hbWVfc2l6ZTtcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5kX2xhYmVsLmxpbmVIZWlnaHQgPSB0aGlzLm5hbWVfc2l6ZSsyO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOWMuuWIhuiuvue9rui/m+adpeWIsOWFt+S9k+aYr+S7gOS5iOaVsOaNrlxuICAgIHVwZGF0ZURhdGE6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8g6K6+572u54mp5ZOB5Zu+5qCHXG4gICAgICAgIC8vIHRoaXMuc2V0UmVkU3RhdHVzKGZhbHNlKVxuICAgICAgICBpZih0aGlzLnRtcF9pbmRleCE9IG51bGwpe1xuICAgICAgICAgICAgaWYodGhpcy5yb290X3duZClcbiAgICAgICAgICAgIHRoaXMucm9vdF93bmQubmFtZSA9IFwiYmFja3BhY2tfaXRlbV9cIiArICh0aGlzLnRtcF9pbmRleCArIDEpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAodGhpcy5kYXRhID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmVtcHR5X2ljb25fcGF0aCl7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRJdGVtSWNvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdXNwZW5kQWxsQWN0aW9ucygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pdGVtX2NvbmZpZyA9IG51bGwgICAgIC8vIOa4heepuumFjee9ruaVsOaNrlxuXG4gICAgICAgIHZhciBpdGVtX251bSA9IDBcbiAgICAgICAgaWYgKHRoaXMuZGF0YSBpbnN0YW5jZW9mIEdvb2RzVm8gfHwgdGhpcy5kYXRhLnR5cGVfdm8gPT0gXCJHb29kc1ZvXCIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g55u05o6l5piv54mp5ZOB5a6e5L6L5a+56LGhXG4gICAgICAgICAgICB0aGlzLml0ZW1fY29uZmlnID0gdGhpcy5kYXRhLmNvbmZpZztcbiAgICAgICAgICAgIGl0ZW1fbnVtID0gdGhpcy5kYXRhLnF1YW50aXR5O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pdGVtX2NvbmZpZy5pZCA9PSBcIjI0ODAyXCIpXG4gICAgICAgICAgICAgICAgdGhpcy5tYWluX2NvbnRhaW5lci5uYW1lID0gXCJpdGVtX1wiICsgdGhpcy5pdGVtX2NvbmZpZy5pZDtcblxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiAodGhpcy5kYXRhKSA9PSBcIm51bWJlclwiKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOeJqeWTgWJpZFxuICAgICAgICAgICAgdGhpcy5pdGVtX2NvbmZpZyA9IFV0aWxzLmdldEl0ZW1Db25maWcodGhpcy5kYXRhKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YSBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5iaWQgIT0gbnVsbCAmJiB0aGlzLmRhdGEubnVtICE9IG51bGwpIHsgICAgICAgICAgICAvLyDln7rnoYDorr7nva5cbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1fY29uZmlnID0gVXRpbHMuZ2V0SXRlbUNvbmZpZyh0aGlzLmRhdGEuYmlkKVxuICAgICAgICAgICAgICAgIGl0ZW1fbnVtID0gdGhpcy5kYXRhLm51bTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhLnVuZGF0YSA9PSB0cnVlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB7c29ydDotMSwgcXVhbGl0eTotMSwgdW5kYXRhOnRydWV9IOi/meS4quaYr+mcgOimgeaVsOaNrizpnIDopoHmuIXmjolcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbV9jb25maWcgPSBVdGlscy5nZXRJdGVtQ29uZmlnKHRoaXMuZGF0YS5pZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtX2NvbmZpZyA9IHRoaXMuZGF0YVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFF1YWxpdHlCRygpICAgICAgICAgICAgIC8vIOiuvue9ruiDjOaZr+iJslxuICAgICAgICB0aGlzLnNldEl0ZW1OdW0oaXRlbV9udW0pICAgICAgIC8vIOiuvue9ruW9k+WJjeaLpeacieaVsOmHj1xuICAgICAgICB0aGlzLnNldEl0ZW1JY29uKCkgICAgICAgICAgICAgIC8vIOiuvue9rueJqeWTgeWbvuagh1xuICAgICAgICB0aGlzLnNldEl0ZW1DaGlwKCkgICAgICAgICAgICAgIC8vIOiuvue9rueijueJh1xuICAgICAgICB0aGlzLnNldEl0ZW1TdGFyKCkgICAgICAgICAgICAgIC8vIOiuvue9rueJqeWTgeaYn+aVsCzlj6rpkojlr7nnoo7niYcs6KOF5aSH5ZKM56ym5paHXG4gICAgICAgIHRoaXMuc2V0Q29tcE51bWJlcigpICAgICAgICAgICAgLy8g6K6+572u5ZCI5oiQ6L+b5bqm5p2hLOWPquWcqOiDjOWMheeKtuaAgeS4i+eahOeJqeWTgeWPr+ingVxuICAgICAgICB0aGlzLnNldEl0ZW1DYW1wKCkgICAgICAgICAgICAgIC8vIOiuvue9rueJqeWTgemYteiQpVxuICAgICAgICB0aGlzLnNldFNlbGZFZmZlY3QodGhpcy5pdGVtX2NvbmZpZykgICAgICAvL+iuvue9ruaYvuekuueJueaViFxuXG4gICAgICAgIC8v6L+c5b6B5Y+z5LiK6KeS5pi+56S6XG4gICAgICAgIGlmKHRoaXMuZXhwZWRpdF9jYWhlKXtcbiAgICAgICAgICAgIHRoaXMuaG9saWRIZXJvRXhwZWRpdFRhZyh0aGlzLmV4cGVkaXRfY2FoZS5zdGF0dXMsdGhpcy5leHBlZGl0X2NhaGUuZGVzYylcbiAgICAgICAgfVxuICAgICAgICAvLyDmmK/lkKbmmL7npLrkuIvmlrnnmoTnianlk4HlkI3lrZdcbiAgICAgICAgaWYgKHRoaXMuaXNfc2hvd19uYW1lKSB7XG4gICAgICAgICAgICB0aGlzLnNldEV4dGVuZExhYmVsKHRoaXMuaXRlbV9jb25maWcubmFtZSx0aGlzLm5hbWVfY29sb3IsdGhpcy5uYW1lX3NpemUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRFeHRlbmRMYWJlbCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMuZGF0YS5zaG93U2VsbFN0YXR1cyE9IG51bGwpe1xuICAgICAgICAgICAgdGhpcy5zZXRDaGVja0JveFN0YXR1cyh0aGlzLmRhdGEuc2hvd1NlbGxTdGF0dXMuc3RhdHVzLCB0aGlzLmRhdGEuc2hvd1NlbGxTdGF0dXMuc2VsZWN0KVxuICAgICAgICB9XG4gICAgICAgIC8v6K6+572u5qCH562+XG4gICAgICAgIGlmKHRoaXMuaXNTaG93Qmlhb1FpYW4gJiYgdGhpcy5iaWFvUWlhblN0cil7XG4gICAgICAgICAgICB0aGlzLnNob3dCaWFvUWlhbih0aGlzLmlzU2hvd0JpYW9RaWFuLHRoaXMuYmlhb1FpYW5TdHIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2FjaGVfcmVkX3N0YXR1cykge1xuICAgICAgICAgICAgdGhpcy5zZXRSZWRTdGF0dXModGhpcy5jYWNoZV9yZWRfc3RhdHVzKVxuICAgICAgICAgICAgdGhpcy5jYWNoZV9yZWRfc3RhdHVzID0gbnVsbFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRSZWRTdGF0dXMoZmFsc2UpO1xuICAgICAgICB9ICAgICAgICBcblxuICAgICAgICBpZih0aGlzLnJlY2VpdmVkU3RhdHVzICE9IG51bGwpe1xuICAgICAgICAgICAgdGhpcy5zZXRSZWNlaXZlZEljb24odGhpcy5yZWNlaXZlZFN0YXR1cylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHRoaXMuaXNTdW1tb25OdW1iZXIgIT0gbnVsbCl7XG4gICAgICAgICAgICB0aGlzLnNldFN1bW1vbk51bWJlcigpXG4gICAgICAgIH1cblxuICAgICAgICBpZih0aGlzLmlzU2hvd09yZGVyV2FyTG9jayA9PSB0cnVlKXtcbiAgICAgICAgICAgIHRoaXMuc2hvd09yZGVyV2FyTG9jayh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLklzR2V0U3RhdHVzKHRoaXMuaXNfc2hvd19nZXRfc2VsZWN0KTtcblxuICAgICAgICBpZih0aGlzLmRhdGEgJiYgdGhpcy5kYXRhLmJpZCl7XG5cdFx0XHR0aGlzLnNldFdlZWtDYXJkRGF0YSh0aGlzLmRhdGEuYmlkKVxuICAgICAgICB9XG4gICAgfSxcbiAgICBzZXRXZWVrQ2FyZERhdGEoYmlkKXtcbiAgICAgICAgbGV0IGl0ZW1fY29uZmlnID0gVXRpbHMuZ2V0SXRlbUNvbmZpZyhiaWQpXG4gICAgICAgIGlmKGl0ZW1fY29uZmlnICYmIGl0ZW1fY29uZmlnLnRpcHNfYnRuKXtcbiAgICAgICAgICAgIGxldCBzaG93X3R5cGUgPSB0aGlzLmNoZWNrSXNXZWVrQ2FyZChpdGVtX2NvbmZpZy50aXBzX2J0bilcbiAgICAgICAgICAgIGlmKHNob3dfdHlwZSA9PSA1MCl7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93V2Vla0NhcmRUYWcodHJ1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0aGlzLnNob3dXZWVrQ2FyZFRhZyhmYWxzZSlcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLy8g6K6+572u5Z+656GA5L+h5oGv5pi+56S6XG4gICAgc2V0UXVhbGl0eUJHOiBmdW5jdGlvbiAodGVtcF9xdWFsaXR5KSB7XG4gICAgICAgIHZhciBxdWFsaXR5ID0gMDtcbiAgICAgICAgaWYodGVtcF9xdWFsaXR5IT1udWxsKXtcbiAgICAgICAgICAgIHF1YWxpdHkgPSB0ZW1wX3F1YWxpdHk7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbV9jb25maWcpIHtcbiAgICAgICAgICAgICAgICBxdWFsaXR5ID0gdGhpcy5pdGVtX2NvbmZpZy5xdWFsaXR5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB2YXIgYmdfcGF0aCA9IFBhdGhUb29sLmdldEl0ZW1RdWFsaXR5QkcocXVhbGl0eSlcbiAgICAgICAgaWYgKHRoaXMuYmdfcXVhbGl0eSA9PSBiZ19wYXRoKSByZXR1cm5cbiAgICAgICAgdGhpcy5iZ19xdWFsaXR5ID0gYmdfcGF0aFxuICAgICAgICB2YXIgY29tbW9uX3Jlc19wYXRoID0gUGF0aFRvb2wuZ2V0Q29tbW9uSWNvbVBhdGgodGhpcy5iZ19xdWFsaXR5KTtcbiAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRSZXMoY29tbW9uX3Jlc19wYXRoLCBmdW5jdGlvbiAoc2Zfb2JqKSB7XG4gICAgICAgICAgICBpZih0aGlzLnJvb3Rfd25kICYmIHRoaXMucm9vdF93bmQuaXNWYWxpZCl7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWFsaXR5X2JnLnNwcml0ZUZyYW1lID0gc2Zfb2JqO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgfSxcblxuICAgIC8vIOiuvue9ruaVsOmHj1xuICAgIHNldEl0ZW1OdW06IGZ1bmN0aW9uIChpdGVtX251bSkge1xuICAgICAgICBpZih0aGlzLmlzX2NvbXBfbnVtKXtcbiAgICAgICAgICAgIHRoaXMubnVtX2JnLmFjdGl2ZSA9IGZhbHNlXG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGhpcy5udW1fYmcuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLml0ZW1fbnVtID0gVXRpbHMuZ2V0TW9uZXlTdHJpbmcoaXRlbV9udW0pO1xuICAgICAgICAgICAgaWYgKGl0ZW1fbnVtID09IG51bGwgfHwgaXRlbV9udW0gPD0gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMubnVtX2JnLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm51bV9iZy5hY3RpdmUgPSB0cnVlXG4gICAgICAgICAgICAgICAgdGhpcy5udW1fbGFiZWwuc3RyaW5nID0gdGhpcy5pdGVtX251bTtcbiAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSB0aGlzLm51bS53aWR0aFxuICAgICAgICAgICAgICAgIHRoaXMubnVtX2JhY2tncm91bmQud2lkdGggPSB3aWR0aCArIDEwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5zZXRfbmVlZF9udW1fY2FjaGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXJyID0gdGhpcy5zZXRfbmVlZF9udW1fY2FjaGU7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXROZWVkTnVtKGFyci5uZWVkX251bSwgYXJyLm51bSwgYXJyLmNvbG9yLCBhcnIuZm9yY2UpO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgdGhpcy5udW1fbGFiZWwuX3VwZGF0ZVJlbmRlckRhdGEodHJ1ZSk7XG4gICAgICAgICAgICAgICAgLy8gVXRpbHMuZGVsYXlSdW4odGhpcy5udW1fYmFja2dyb3VuZCwxLzYwLGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTnVtQkdTaXplKCk7XG4gICAgICAgICAgICAgICAgLy8gfS5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgIH0sXG5cbiAgICAvLyDorr7nva7nianlk4Hlm77moIdcbiAgICBzZXRJdGVtSWNvbjogZnVuY3Rpb24gKGhlYWRfaWNvbikge1xuICAgICAgICBpZih0aGlzLml0ZW09PW51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuaGVhZF9pY29uID0gaGVhZF9pY29uO1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYoaGVhZF9pY29uKXtcbiAgICAgICAgICAgIHRoaXMuZW1wdHlfaWNvbl9wYXRoID0gaGVhZF9pY29uO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXRlbV9jb25maWcgPT0gbnVsbCAmJiAhdGhpcy5lbXB0eV9pY29uX3BhdGgpIHtcbiAgICAgICAgICAgIHRoaXMuaXRlbS5hY3RpdmUgPSBmYWxzZVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLml0ZW0uYWN0aXZlID0gdHJ1ZVxuICAgICAgICB2YXIgaXRlbV9yZXNfcGF0aCA9IG51bGw7XG4gICAgICAgIGlmICghdGhpcy5pdGVtX2NvbmZpZykge1xuICAgICAgICAgICAgaXRlbV9yZXNfcGF0aCA9IHRoaXMuZW1wdHlfaWNvbl9wYXRoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaXRlbV9yZXNfcGF0aCA9IFBhdGhUb29sLmdldEl0ZW1SZXModGhpcy5pdGVtX2NvbmZpZy5pY29uKVxuICAgICAgICB9XG4gICAgICAgIGlmKGhlYWRfaWNvbil7XG4gICAgICAgICAgICBpdGVtX3Jlc19wYXRoID0gaGVhZF9pY29uO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXRlbV9yZXNfcGF0aCA9PSBpdGVtX3Jlc19wYXRoKSByZXR1cm5cbiAgICAgICAgdGhpcy5pdGVtX3Jlc19wYXRoID0gaXRlbV9yZXNfcGF0aFxuICAgICAgICB0aGlzLmxvYWRSZXMoaXRlbV9yZXNfcGF0aCwgZnVuY3Rpb24gKGl0ZW1fcmVzX3BhdGgscmVzX29iamVjdCkge1xuICAgICAgICAgICAgLy8gdGhpcy5sb2FkX2l0ZW1faWNvbltpdGVtX3Jlc19wYXRoXSA9IHJlc19vYmplY3RcbiAgICAgICAgICAgIGlmKHRoaXMuaXRlbV9yZXNfcGF0aCA9PSBpdGVtX3Jlc19wYXRoKXtcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1faWNvbi5zcHJpdGVGcmFtZSA9IHJlc19vYmplY3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzLGl0ZW1fcmVzX3BhdGgpKVxuICAgIH0sXG5cbiAgICAvLyDorr7nva7oi7Hpm4Tnoo7niYdcbiAgICBzZXRJdGVtQ2hpcDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pdGVtX2NvbmZpZyA9PSBudWxsIHx8IHRoaXMuaXRlbV9jb25maWcudHlwZSAhPSBCYWNrUGFja0NvbnN0Lml0ZW1fdHlwZS5QQVJUTkVSX0RFQlJJUykge1xuICAgICAgICAgICAgdGhpcy5jaGlwLmFjdGl2ZSA9IGZhbHNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNoaXAuYWN0aXZlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOiuvue9rueJqeWTgeeahOaYn+e6p1xuICAgIHNldEl0ZW1TdGFyOiBmdW5jdGlvbiAoYm9vbCA9IHRydWUpIHtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuc3Rhcl9saXN0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3Qgc3RhciA9IHRoaXMuc3Rhcl9saXN0W2luZGV4XTtcbiAgICAgICAgICAgIHN0YXIuYWN0aXZlID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pdGVtX2NvbmZpZyA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIHZhciBlcW1fc3RhciA9IDBcbiAgICAgICAgaWYoYm9vbCA9PSB0cnVlKXtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrSXNFcXVpcCh0aGlzLml0ZW1fY29uZmlnLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgZXFtX3N0YXIgPSB0aGlzLml0ZW1fY29uZmlnLmVxbV9zdGFyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXRlbV9jb25maWcudHlwZSA9PSBCYWNrUGFja0NvbnN0Lml0ZW1fdHlwZS5QQVJUTkVSX0RFQlJJUykgeyAgICAgIC8vIOiLsembhOeijueJh+eahOaXtuWAmemineWklueUqOi/meS4quijheWkh+mYtuaVsOagh+ivhuaYn+e6p1xuICAgICAgICAgICAgICAgIGVxbV9zdGFyID0gdGhpcy5pdGVtX2NvbmZpZy5lcW1famllXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXRlbV9jb25maWcudHlwZSA9PSBCYWNrUGFja0NvbnN0Lml0ZW1fdHlwZS5BUlRJRkFDVENISVBTKSB7ICAgICAgIC8vIOespuaWh+avlOi+g+eJueauiizlv4XpobvmmK/nianlk4FcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhIGluc3RhbmNlb2YgR29vZHNWbykge1xuICAgICAgICAgICAgICAgICAgICBlcW1fc3RhciA9IHRoaXMuZGF0YS5lbmNoYW50XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoZXFtX3N0YXIgPiAwKSB7XG4gICAgICAgICAgICB2YXIgd2lkdGggPSAxMlxuICAgICAgICAgICAgdmFyIHggPSAoMSAtIGVxbV9zdGFyKSAqIHdpZHRoICogMC41XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZXFtX3N0YXI7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGFyX2xpc3RbaW5kZXhdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFyX2xpc3RbaW5kZXhdID0gY2MuaW5zdGFudGlhdGUodGhpcy5zdGFyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFyX2xpc3RbaW5kZXhdLnkgPSB0aGlzLnN0YXIueVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJfbm9kZS5hZGRDaGlsZCh0aGlzLnN0YXJfbGlzdFtpbmRleF0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBzdGFyID0gdGhpcy5zdGFyX2xpc3RbaW5kZXhdXG4gICAgICAgICAgICAgICAgc3Rhci5hY3RpdmUgPSB0cnVlXG4gICAgICAgICAgICAgICAgc3Rhci54ID0geCArIGluZGV4ICogd2lkdGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDorr7nva7noo7niYflkIjmiJDov5vluqbmnaFcbiAgICBzZXRDb21wTnVtYmVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc19zaG93X2NoaXBfbG9hZGluZyB8fCB0aGlzLml0ZW1fY29uZmlnID09IG51bGwgfHwgdGhpcy5kYXRhID09IG51bGwgfHwgISh0aGlzLmRhdGEgaW5zdGFuY2VvZiBHb29kc1ZvKSB8fCB0aGlzLml0ZW1fY29uZmlnLnR5cGUgIT0gQmFja1BhY2tDb25zdC5pdGVtX3R5cGUuUEFSVE5FUl9ERUJSSVMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3Nfbm9kZS5hY3RpdmUgPSBmYWxzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGNvbmZpZyA9IGdkYXRhKFwicGFydG5lcl9kYXRhXCIsIFwiZGF0YV9nZXRfY29tcG91bmRfaW5mb1wiLCB0aGlzLml0ZW1fY29uZmlnLmlkKTtcbiAgICAgICAgICAgIGlmIChjb25maWcgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3Nfbm9kZS5hY3RpdmUgPSBmYWxzZVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgY3VyX251bSA9IHRoaXMuZGF0YS5xdWFudGl0eTsgICAvLyDlvZPliY3mlbDph49cbiAgICAgICAgICAgICAgICB2YXIgbWF4X251bSA9IGNvbmZpZy5udW07ICAgICAgICAgICAvLyDpnIDopoHmlbDph49cbiAgICAgICAgICAgICAgICB2YXIgcGVyID0gTWF0aC5taW4oMSwgTWF0aC5tYXgoY3VyX251bSAvIG1heF9udW0pKVxuICAgICAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3MucHJvZ3Jlc3MgPSBwZXJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2dyZXNzX2xhYmVsLnN0cmluZyA9IGN1cl9udW0gKyBcIi9cIiArIG1heF9udW1cblxuICAgICAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3Nfbm9kZS5hY3RpdmUgPSB0cnVlXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYocGVyIDwgMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFJlZFN0YXR1cyhmYWxzZSlcbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRSZWRTdGF0dXModHJ1ZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g6Zi16JCl5Zu+5qCH5pi+56S6XG4gICAgc2V0SXRlbUNhbXA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYodGhpcy5pdGVtX2NvbmZpZyAmJiB0aGlzLml0ZW1fY29uZmlnLnN1Yl90eXBlID09IDMgJiYgIXRoaXMuaXNfY2FtcHR5cGUgJiYgdGhpcy5pdGVtX2NvbmZpZy5sZXYgIT0gMCl7XG4gICAgICAgICAgICB0aGlzLmNhbXAuYWN0aXZlID0gdHJ1ZVxuICAgICAgICAgICAgdmFyIGNhbXAgPSB0aGlzLml0ZW1fY29uZmlnLmxldiAgICAgLy8g5Y+W562J57qn5qCH6K+G6Zi16JClXG4gICAgICAgICAgICB2YXIgY2FtcF9wYXRoID0gUGF0aFRvb2wuZ2V0SGVyb0NhbXBSZXMoY2FtcClcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbXBfcGF0aCA9PSBjYW1wX3BhdGgpIHJldHVyblxuICAgICAgICAgICAgdGhpcy5jYW1wX3BhdGggPSBjYW1wX3BhdGhcbiAgICAgICAgICAgIHZhciBjb21tb25fcmVzX3BhdGggPSBQYXRoVG9vbC5nZXRDb21tb25JY29tUGF0aChjYW1wX3BhdGgpO1xuICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRSZXMoY29tbW9uX3Jlc19wYXRoLCBmdW5jdGlvbiAoc2Zfb2JqKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYW1wX3Nwcml0ZS5zcHJpdGVGcmFtZSA9IHNmX29iajtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0aGlzLmNhbXAuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgKHRoaXMuaXRlbV9jb25maWcgPT0gbnVsbCB8fCB0aGlzLml0ZW1fY29uZmlnLnN1Yl90eXBlICE9IEJhY2tQYWNrQ29uc3QuaXRlbV90YWJfdHlwZS5IRVJPKSB7XG4gICAgICAgIC8vICAgICB0aGlzLmNhbXAuYWN0aXZlID0gZmFsc2VcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICAgIHRoaXMuY2FtcC5hY3RpdmUgPSB0cnVlXG4gICAgICAgIC8vICAgICB2YXIgY2FtcCA9IHRoaXMuaXRlbV9jb25maWcubGV2ICAgICAvLyDlj5bnrYnnuqfmoIfor4bpmLXokKVcbiAgICAgICAgLy8gICAgIHZhciBjYW1wX3BhdGggPSBQYXRoVG9vbC5nZXRIZXJvQ2FtcFJlcyhjYW1wKVxuICAgICAgICAvLyAgICAgaWYgKHRoaXMuY2FtcF9wYXRoID09IGNhbXBfcGF0aCkgcmV0dXJuXG4gICAgICAgIC8vICAgICB0aGlzLmNhbXBfcGF0aCA9IGNhbXBfcGF0aFxuICAgICAgICAvLyAgICAgdmFyIGNvbW1vbl9yZXNfcGF0aCA9IFBhdGhUb29sLmdldENvbW1vbkljb21QYXRoKGNhbXBfcGF0aCk7XG4gICAgICAgIC8vICAgICBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZFJlcyhjb21tb25fcmVzX3BhdGgsIGZ1bmN0aW9uIChzZl9vYmopIHtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmNhbXBfc3ByaXRlLnNwcml0ZUZyYW1lID0gc2Zfb2JqO1xuICAgICAgICAvLyAgICAgfS5iaW5kKHRoaXMpKVxuXG4gICAgICAgIC8vIH1cbiAgICB9LFxuXG4gICAgLy8g55uR5rWL5piv5LiN5piv6KOF5aSHXG4gICAgY2hlY2tJc0VxdWlwOiBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICByZXR1cm4gdHlwZSA9PSBCYWNrUGFja0NvbnN0Lml0ZW1fdHlwZS5XRUFQT04gfHwgdHlwZSA9PSBCYWNrUGFja0NvbnN0Lml0ZW1fdHlwZS5TSE9FIHx8IHR5cGUgPT0gQmFja1BhY2tDb25zdC5pdGVtX3R5cGUuQ0xPVEhFUyB8fCB0eXBlID09IEJhY2tQYWNrQ29uc3QuaXRlbV90eXBlLkhBVFxuICAgIH0sXG5cbiAgICAvLyDpgInkuK3kuI7lkKYs5pyJ5LiA5Liq4oia55qEXG4gICAgc2V0TWFza1Zpc2libGU6IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgICAgICAgaWYgKHRoaXMucm9vdF93bmQpIHtcbiAgICAgICAgICAgIHRoaXMubWFyay5hY3RpdmUgPSBzdGF0dXNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVfbWFya3NlbGVjdF9zdGF0dXMgPSBzdGF0dXNcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDorr7nva7nuqLngrnnirbmgIFcbiAgICBzZXRSZWRTdGF0dXM6IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgICAgICAgaWYgKHRoaXMucmVkX3RpcHMpIHtcbiAgICAgICAgICAgIHRoaXMucmVkX3RpcHMuYWN0aXZlID0gISFzdGF0dXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNhY2hlX3JlZF9zdGF0dXMgPSAhIXN0YXR1cztcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDov5Tlm57phY3nva7mlbDmja5cbiAgICBnZXRJdGVtQ29uZmlnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW1fY29uZmlnXG4gICAgfSxcblxuICAgIC8vIOi/lOWbnueJqeWTgeWvueixoVxuICAgIGdldEl0ZW1EYXRhOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFcbiAgICB9LFxuXG4gICAgLy8g6ZmkK+WPt+WSjOaVsOmHj+S7peWklumDvee9rueBsFxuICAgIHNldEl0ZW1JY29uVW5FbmFibGVkOiBmdW5jdGlvbiAoYm9vbCkge1xuICAgICAgICB0aGlzLmlzVW5FbmFibGVkID0gYm9vbDtcbiAgICAgICAgaWYgKHRoaXMuaXRlbV9pY29uKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW1faWNvbi5zZXRTdGF0ZSghYm9vbCA/IGNjLlNwcml0ZS5TdGF0ZS5OT1JNQUwgOiBjYy5TcHJpdGUuU3RhdGUuR1JBWSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5xdWFsaXR5X2JnKSB7XG4gICAgICAgICAgICB0aGlzLnF1YWxpdHlfYmcuc2V0U3RhdGUoIWJvb2wgPyBjYy5TcHJpdGUuU3RhdGUuTk9STUFMIDogY2MuU3ByaXRlLlN0YXRlLkdSQVkpO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMuZXh0ZW5kX3RhZyAmJiB0aGlzLmV4dGVuZF90YWcuYWN0aXZlKXtcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5kX3RhZy5nZXRDb21wb25lbnQoY2MuU3ByaXRlKS5zZXRTdGF0ZSghYm9vbCA/IGNjLlNwcml0ZS5TdGF0ZS5OT1JNQUwgOiBjYy5TcHJpdGUuU3RhdGUuR1JBWSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc3Rhcl9saXN0KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMuc3Rhcl9saXN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFyX2xpc3RbaV0uZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSkuc2V0U3RhdGUoIWJvb2wgPyBjYy5TcHJpdGUuU3RhdGUuTk9STUFMIDogY2MuU3ByaXRlLlN0YXRlLkdSQVkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYodGhpcy5wbGF5X2VmZmVjdCAmJiB0aGlzLnBsYXlfZWZmZWN0Lm5vZGUpe1xuICAgICAgICAgICAgdGhpcy5wbGF5X2VmZmVjdC5ub2RlLmNvbG9yID0gIWJvb2wgPyBuZXcgY2MuQ29sb3IoMjU1LCAyNTUsIDI1NSwgMjU1KSA6IG5ldyBjYy5Db2xvcigxMTUsIDExNSwgMTE1LCAyNTUpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOWinuWKoOS4gOS4quagh+etvuWktFxuICAgIHNob3dCaWFvUWlhbjpmdW5jdGlvbihib29sLHN0cil7XG4gICAgICAgIHRoaXMuaXNTaG93Qmlhb1FpYW4gPSBib29sO1xuICAgICAgICB0aGlzLmJpYW9RaWFuU3RyID0gc3RyO1xuICAgICAgICBpZiAodGhpcy5yb290X3duZCA9PSBudWxsKSByZXR1cm5cbiAgICAgICAgaWYoIXRoaXMucWlhbl9pY29uICYmIGJvb2wpe1xuICAgICAgICAgICAgdmFyIHJlcyA9IFBhdGhUb29sLmdldENvbW1vbkljb21QYXRoKFwiY29tbW9uXzkwMDE1XCIpO1xuICAgICAgICAgICAgdGhpcy5xaWFuX2ljb24gPSBVdGlscy5jcmVhdGVJbWFnZSh0aGlzLm1haW5fY29udGFpbmVyLG51bGwsLTIzLDI3LGNjLnYyKDAuNSwwLjUpLG51bGwsMTApO1xuICAgICAgICAgICAgdGhpcy5sb2FkUmVzKHJlcywgZnVuY3Rpb24gKHNmX29iaikge1xuICAgICAgICAgICAgICAgIHRoaXMucWlhbl9pY29uLnNwcml0ZUZyYW1lID0gc2Zfb2JqO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgdGhpcy5xaWFuX2xhYmVsID0gVXRpbHMuY3JlYXRlTGFiZWwoMjAsbmV3IGNjLkNvbG9yKDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYpLG5ldyBjYy5Db2xvcigweDBhLCAweDBmLCAweDBmLCAweGZmKSw1LC01LFwiXCIsdGhpcy5xaWFuX2ljb24ubm9kZSwyLCBjYy52MigwLjUsMCkpXG4gICAgICAgICAgICB0aGlzLnFpYW5fbGFiZWwubm9kZS5yb3RhdGlvbiA9IC00NTtcbiAgICAgICAgfVxuICAgICAgICBpZih0aGlzLnFpYW5faWNvbil7XG4gICAgICAgICAgICB0aGlzLnFpYW5faWNvbi5ub2RlLmFjdGl2ZSA9IGJvb2w7XG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy5xaWFuX2xhYmVsKXtcbiAgICAgICAgICAgIHN0ciA9IHN0ciB8fCBcIlwiO1xuICAgICAgICAgICAgdGhpcy5xaWFuX2xhYmVsLnN0cmluZyA9IHN0cjtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+eQhuiuuuS4iuWPqueUqOS6jiAwMC8xMSDnmoTmoLzlvI/vvIzluIzmnJvkuI3opoHkubHnlKhcbiAgICBzZXROZWVkTnVtOiBmdW5jdGlvbiAobmVlZF9udW0sIG51bSwgY29sb3IsIGZvcmNlKSB7XG4gICAgICAgIGlmICh0aGlzLnNldF9uZWVkX251bV9jYWNoZSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNldF9uZWVkX251bV9jYWNoZSA9IHt9O1xuICAgICAgICAgICAgdGhpcy5zZXRfbmVlZF9udW1fY2FjaGUubmVlZF9udW0gPSBuZWVkX251bTtcbiAgICAgICAgICAgIHRoaXMuc2V0X25lZWRfbnVtX2NhY2hlLm51bSA9IG51bTtcbiAgICAgICAgICAgIHRoaXMuc2V0X25lZWRfbnVtX2NhY2hlLmNvbG9yID0gY29sb3I7XG4gICAgICAgICAgICB0aGlzLnNldF9uZWVkX251bV9jYWNoZS5mb3JjZSA9IGZvcmNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJvb3Rfd25kID09IG51bGwpIHJldHVyblxuICAgICAgICBuZWVkX251bSA9IG5lZWRfbnVtIHx8IDA7XG4gICAgICAgIHZhciBzdGF0dXMgPSBmYWxzZTtcbiAgICAgICAgaWYgKG5lZWRfbnVtID4gMCB8fCBmb3JjZSA9PSB0cnVlKSB7XG4gICAgICAgICAgICBzdGF0dXMgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN0ciA9IG5lZWRfbnVtO1xuICAgICAgICBpZiAobnVtICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChuZWVkX251bSA+IG51bSlcbiAgICAgICAgICAgICAgICBjb2xvciA9IG5ldyBjYy5Db2xvcigweGZmLCAweDQ3LCAweDQ3LCAweGZmKVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGNvbG9yID0gbmV3IGNjLkNvbG9yKDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYpXG4gICAgICAgICAgICAvLyBudW0gPSBudW07XG4gICAgICAgICAgICBudW0gPSBVdGlscy5nZXRNb25leVN0cmluZyhudW0pO1xuICAgICAgICAgICAgbmVlZF9udW0gPSBVdGlscy5nZXRNb25leVN0cmluZyhuZWVkX251bSk7XG4gICAgICAgICAgICBzdHIgPSBudW0gKyBcIi9cIiArIG5lZWRfbnVtO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubnVtX2xhYmVsLnN0cmluZyA9IHN0cjtcbiAgICAgICAgdGhpcy5udW1fbGFiZWwubm9kZS5jb2xvciA9IGNvbG9yO1xuICAgICAgICB0aGlzLm51bV9sYWJlbC5ub2RlLmFjdGl2ZSA9IHN0YXR1cztcbiAgICAgICAgdGhpcy5udW1fYmcuYWN0aXZlID0gc3RhdHVzO1xuICAgICAgICB0aGlzLm51bV9sYWJlbC5fdXBkYXRlUmVuZGVyRGF0YSh0cnVlKTtcbiAgICAgICAgLy8gVXRpbHMuZGVsYXlSdW4odGhpcy5udW1fYmFja2dyb3VuZCwxLzYwLGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU51bUJHU2l6ZSgpO1xuICAgICAgICAvLyB9LmJpbmQodGhpcykpXG4gICAgfSxcblxuICAgIHVwZGF0ZU51bUJHU2l6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc2l6ZSA9IHRoaXMubnVtLmdldENvbnRlbnRTaXplKCk7XG4gICAgICAgIHZhciB3aWR0aCA9IHNpemUud2lkdGg7XG4gICAgICAgIGlmICh3aWR0aCA8IDMwKVxuICAgICAgICAgICAgd2lkdGggPSAyMTtcbiAgICAgICAgdGhpcy5udW1fYmFja2dyb3VuZC5zZXRDb250ZW50U2l6ZShjYy5zaXplKHdpZHRoICsgMTIsIHRoaXMubnVtX2JnX3NpemUuaGVpZ2h0ICsgMikpXG4gICAgfSxcblxuICAgIC8vIOa0u+WKqOaXtuWAmei/nOW+geeahOeJqeWTgVxuICAgIGhvbGlkSGVyb0V4cGVkaXRUYWc6IGZ1bmN0aW9uIChzdGF0dXMsIGRlc2MpIHtcbiAgICAgICAgaWYoc3RhdHVzKXtcbiAgICAgICAgICAgIHRoaXMuZXhwZWRpdF9jYWhlID0ge31cbiAgICAgICAgICAgIHRoaXMuZXhwZWRpdF9jYWhlLnN0YXR1cyA9IHN0YXR1c1xuICAgICAgICAgICAgdGhpcy5leHBlZGl0X2NhaGUuZGVzYyA9IGRlc2NcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMucm9vdF93bmQpIHJldHVybjtcbiAgICAgICAgaWYgKHN0YXR1cyA9PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy5leHBlZGl0X2NhaGUgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHRoaXMuaGVyb0V4cGVkaXRUYWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhlcm9FeHBlZGl0VGFnLm5vZGUuYWN0aXZlID0gc3RhdHVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGVyb0V4cGVkaXRUYWcgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGVyb0V4cGVkaXRUYWcgPSBVdGlscy5jcmVhdGVJbWFnZSh0aGlzLm1haW5fY29udGFpbmVyLCBudWxsLCAzMCwgMjksIGNjLnYyKDAuNSwgMC41KSk7XG4gICAgICAgICAgICAgICAgdmFyIHJlcyA9IFBhdGhUb29sLmdldENvbW1vbkljb21QYXRoKFwiY29tbW9uXzkwMDgxXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZFJlcyhyZXMsIGZ1bmN0aW9uIChzZl9vYmopIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oZXJvRXhwZWRpdFRhZy5zcHJpdGVGcmFtZSA9IHNmX29iajtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgICAgICAgICAgdGhpcy5oZXJvRXhwZWRpdFRhZ19kZXNjID0gVXRpbHMuY3JlYXRlTGFiZWwoMTYsIG5ldyBjYy5Db2xvcigweGZmLCAweGZmLCAweGZmLCAweGZmKSwgbmV3IGNjLkNvbG9yKDB4YWYsIDB4MjMsIDB4M2EsIDB4ZmYpLCAxMCwgMTIuNSwgXCJcIiwgdGhpcy5oZXJvRXhwZWRpdFRhZy5ub2RlLCAyLCBjYy52MigwLjUsIDAuNSkpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGVyb0V4cGVkaXRUYWdfZGVzYy5ub2RlLnNldFJvdGF0aW9uKDQ1KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5oZXJvRXhwZWRpdFRhZy5ub2RlLmFjdGlvbiA9IHN0YXR1cztcbiAgICAgICAgICAgIHRoaXMuaGVyb0V4cGVkaXRUYWdfZGVzYy5zdHJpbmcgPSBkZXNjO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNldE51bUJnUG9zOiBmdW5jdGlvbiAocG9zLCBhciwgcG9zMSwgYXIxKSB7XG4gICAgICAgIGlmICh0aGlzLnNldF9udW1fYmdfY2FjaGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5zZXRfbnVtX2JnX2NhY2hlID0ge307XG4gICAgICAgICAgICB0aGlzLnNldF9udW1fYmdfY2FjaGUucG9zID0gcG9zO1xuICAgICAgICAgICAgdGhpcy5zZXRfbnVtX2JnX2NhY2hlLmFyID0gYXI7XG4gICAgICAgICAgICB0aGlzLnNldF9udW1fYmdfY2FjaGUucG9zMSA9IHBvczE7XG4gICAgICAgICAgICB0aGlzLnNldF9udW1fYmdfY2FjaGUuYXIxID0gYXIxO1xuICAgICAgICAgICAgLy8gcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucm9vdF93bmQgPT0gbnVsbCkgcmV0dXJuXG4gICAgICAgIGlmIChwb3MpIHtcbiAgICAgICAgICAgIHRoaXMubnVtX2JnLnNldFBvc2l0aW9uKHBvcy54LCBwb3MueSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFyKSB7XG4gICAgICAgICAgICB0aGlzLm51bV9iZy5zZXRBbmNob3JQb2ludChhcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFyMSkge1xuICAgICAgICAgICAgdGhpcy5udW0uc2V0QW5jaG9yUG9pbnQoYXIxKTtcbiAgICAgICAgICAgIHRoaXMubnVtX2JhY2tncm91bmQuc2V0QW5jaG9yUG9pbnQoYXIxKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zMSkge1xuICAgICAgICAgICAgdGhpcy5udW1fYmFja2dyb3VuZC5zZXRQb3NpdGlvbihwb3MxLngsIHBvczEueSk7XG4gICAgICAgICAgICB0aGlzLm51bS5zZXRQb3NpdGlvbihwb3MxLngsIHBvczEueSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgc3VzcGVuZEFsbEFjdGlvbnM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5zZXRDaGVja0JveFN0YXR1cyhmYWxzZSxmYWxzZSk7XG4gICAgICAgIC8vIHRoaXMuc2hvd0FkZEljb24oZmFsc2UpO1xuICAgICAgICB0aGlzLnNldFJlZFN0YXR1cyhmYWxzZSk7XG4gICAgICAgIHRoaXMuc2V0SXRlbVN0YXIoZmFsc2UpO1xuICAgICAgICB0aGlzLnNldFF1YWxpdHlCRygwKTtcbiAgICAgICAgdGhpcy5zaG93V2Vla0NhcmRUYWcoZmFsc2UpXG4gICAgICAgIGlmKHRoaXMubnVtX2JnKXtcbiAgICAgICAgICAgIHRoaXMubnVtX2JnLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodGhpcy5pdGVtKXtcbiAgICAgICAgICAgIHRoaXMuaXRlbS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHRoaXMuY2hpcCl7XG4gICAgICAgICAgICB0aGlzLmNoaXAuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZih0aGlzLmNhbXApe1xuICAgICAgICAgICAgdGhpcy5jYW1wLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodGhpcy5wcm9ncmVzc19ub2RlKXtcbiAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3Nfbm9kZS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2hvd0l0ZW1FZmZlY3QoZmFsc2UpO1xuICAgICAgICB0aGlzLmRhdGEgPSBudWxsO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDmmL7npLp0aXBz55qE5byA5YWzXG4gICAgICogQHBhcmFtIHsqfSBpc19zaG93X3RpcHMgXG4gICAgICogQHBhcmFtIHsqfSBpc19zaG93X3NvdXJjZSBcbiAgICAgKiBAcGFyYW0geyp9IHNvdXJjZV9jYWxsYmFjayBcbiAgICAgKiBAcGFyYW0geyp9IGlzX3RpcHNfc291cmNlICDnianlk4Hkv6Hmga/nlYzpnaLvvIzmmL7npLrmnaXmupDmjInpkq7vvIjkuLvopoHpkojlr7nmnKrojrflvpfnmoTnianlk4HvvIzljbTopoHmmL7npLrmnaXmupDnmoTvvIlcbiAgICAgKi9cbiAgICBzZXREZWZhdWx0VGlwOiBmdW5jdGlvbiAoaXNfc2hvd190aXBzLCBpc19zaG93X3NvdXJjZSwgc291cmNlX2NhbGxiYWNrLGlzX3RpcHNfc291cmNlKSB7XG4gICAgICAgIGlmKGlzX3Nob3dfdGlwcyE9bnVsbCl7XG4gICAgICAgICAgICB0aGlzLmlzX3Nob3dfdGlwcyA9IGlzX3Nob3dfdGlwcztcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0aGlzLmlzX3Nob3dfdGlwcyA9IHRydWU7O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB0aGlzLmlzX3Nob3dfc291cmNlID0gaXNfc2hvd19zb3VyY2UgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuc291cmNlX2NhbGxiYWNrID0gc291cmNlX2NhbGxiYWNrO1xuICAgICAgICB0aGlzLmlzX3RpcHNfc291cmNlID0gaXNfdGlwc19zb3VyY2UgfHwgZmFsc2U7XG4gICAgfSxcblxuXG4gICAgLy/liqDlj7dcbiAgICAvL+mUgVxuICAgIHNob3dBZGRJY29uOiBmdW5jdGlvbiAoYm9vbCkge1xuICAgICAgICBpZiAoYm9vbCA9PSBmYWxzZSAmJiAhdGhpcy5hZGRfYnRuX3NwKSByZXR1cm5cbiAgICAgICAgaWYgKHRoaXMubWFpbl9jb250YWluZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5hZGRfYnRuX2Jvb2wgPSBib29sO1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmFkZF9idG5fc3ApIHtcbiAgICAgICAgICAgIHRoaXMuYWRkX2J0bl9zcCA9IFV0aWxzLmNyZWF0ZUltYWdlKHRoaXMubWFpbl9jb250YWluZXIsIG51bGwsIDAsIDAsIGNjLnYyKDAuNSwgMC41KSk7XG4gICAgICAgICAgICB0aGlzLmxvYWRSZXMoUGF0aFRvb2wuZ2V0Q29tbW9uSWNvbVBhdGgoXCJjb21tb25fOTAwMjZcIiksIGZ1bmN0aW9uIChzcCkge1xuICAgICAgICAgICAgICAgIGlmKHRoaXMuYWRkX2J0bl9zcCl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkX2J0bl9zcC5zcHJpdGVGcmFtZSA9IHNwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgICAgIHZhciBidG4gPSB0aGlzLmFkZF9idG5fc3Aubm9kZS5hZGRDb21wb25lbnQoY2MuQnV0dG9uKTtcbiAgICAgICAgICAgIGJ0bi50cmFuc2l0aW9uID0gY2MuQnV0dG9uLlRyYW5zaXRpb24uU0NBTEU7XG4gICAgICAgICAgICBpZiAodGhpcy5jYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGJ0bi5ub2RlLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgfSwgdGhpcylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZF9idG5fc3Aubm9kZS5hY3RpdmUgPSBib29sO1xuICAgIH0sXG5cbiAgICAvL+makOiXj+iDjOaZr+ahhlxuICAgIHNldElzU2hvd0JhY2tncm91bmQ6IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgICAgICAgdGhpcy5iZ19zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIGlmICh0aGlzLnF1YWxpdHlfYmcpXG4gICAgICAgICAgICB0aGlzLnF1YWxpdHlfYmcubm9kZS5hY3RpdmUgPSBzdGF0dXM7XG4gICAgfSxcblxuICAgIHNldEVtcHR5SWNvblBhdGg6IGZ1bmN0aW9uIChpY29uX3BhdGgpIHtcbiAgICAgICAgdGhpcy5lbXB0eV9pY29uX3BhdGggPSBpY29uX3BhdGg7XG4gICAgfSxcblxuICAgIGdldERhdGE6ZnVuY3Rpb24oKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YTtcbiAgICB9LFxuXG4gICAgc2V0Q2hlY2tCb3hTdGF0dXM6IGZ1bmN0aW9uIChzdGF0dXMsIGlzX3NlbGVjdCkge1xuICAgICAgICBpZiAodGhpcy5zaG93X2NoZWNrX2JveCA9PSBmYWxzZSkgcmV0dXJuXG4gICAgICAgIGlmIChzdGF0dXMgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrX2JveCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja19ib3guc2V0VmlzaWJsZShmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jaGVja19ib3ggPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhciBUb2dnbGVJdGVtID0gcmVxdWlyZShcInRvZ2dsZV9pdGVtXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tfYm94ID0gbmV3IFRvZ2dsZUl0ZW0oKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGVja19ib3hfcG9zKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tfYm94LnNldFBvc2l0aW9uKHRoaXMuY2hlY2tfYm94X3BvcylcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrX2JveC5zZXRQb3NpdGlvbihjYy52MigyNSwyNSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrX2JveC5zZXRQYXJlbnQodGhpcy5tYWluX2NvbnRhaW5lcik7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja19ib3guc2V0VmlzaWJsZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrX2JveC5zZXREYXRhKHRoaXMuZGF0YS5zaG93U2VsbFN0YXR1cylcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrX2JveC5hZGRDbGlja0NhbGxCYWNrKGZ1bmN0aW9uIChpc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGEgIT0gbnVsbCAmJiB0aGlzLmRhdGEuaWQgIT0gbnVsbCAmJiB0aGlzLmRhdGEuc2hvd1NlbGxTdGF0dXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zZXRHb29kc0F0dHIoXCJzaG93U2VsbFN0YXR1c1wiLCB7IHN0YXR1czogdHJ1ZSwgc2VsZWN0OiBpc1NlbGVjdGVkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2xpY2tfY2hlY2tfY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWNrX2NoZWNrX2NhbGxiYWNrKGlzU2VsZWN0ZWQsIHRoaXMpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tfYm94LnNldFZpc2libGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja19ib3guc2V0RGF0YSh0aGlzLmRhdGEuc2hvd1NlbGxTdGF0dXMpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzX3NlbGVjdCA9PSBudWxsKSB7XG4gICAgICAgICAgICBpc19zZWxlY3QgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jaGVja19ib3gpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tfYm94LnNldFNlbGVjdGVkKGlzX3NlbGVjdCk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHNldFJlY2VpdmVkSWNvbihzdGF0dXMpe1xuICAgICAgICB0aGlzLnJlY2VpdmVkU3RhdHVzID0gc3RhdHVzO1xuICAgICAgICBpZih0aGlzLnJvb3Rfd25kKXtcbiAgICAgICAgICAgIGlmKHN0YXR1cyl7XG4gICAgICAgICAgICAgICAgaWYodGhpcy5yZWNlaXZlZF9pY29uID09IG51bGwpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY2VpdmVkX2ljb24gPSBVdGlscy5jcmVhdGVJbWFnZSh0aGlzLnJvb3Rfd25kLG51bGwsMCwwLGNjLnYyKDAuNSwgMC41KSlcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhdGggPSBQYXRoVG9vbC5nZXRDb21tb25JY29tUGF0aChcImNvbW1vbl8xMDAwXCIpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZFJlcyhwYXRoLGZ1bmN0aW9uKHJlcyl7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY2VpdmVkX2ljb24uc3ByaXRlRnJhbWUgPSByZXM7XG4gICAgICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRJdGVtSWNvblVuRW5hYmxlZCh0cnVlKVxuICAgICAgICAgICAgICAgIHRoaXMucmVjZWl2ZWRfaWNvbi5ub2RlLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICBpZih0aGlzLnJlY2VpdmVkX2ljb24pe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY2VpdmVkX2ljb24ubm9kZS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRJdGVtSWNvblVuRW5hYmxlZChmYWxzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgLy/mmL7npLrlj4zlgI1cbiAgICBzZXREb3VibGVJY29uKHN0YXR1cyl7XG4gICAgICAgIGlmKHN0YXR1cyl7XG4gICAgICAgICAgICBpZih0aGlzLmRvdWJsZV9pY29uID09IG51bGwpe1xuICAgICAgICAgICAgICAgIHRoaXMuZG91YmxlX2ljb24gPSBVdGlscy5jcmVhdGVJbWFnZSh0aGlzLm1haW5fY29udGFpbmVyLG51bGwsLTI4LDI3LjUpXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkUmVzKFBhdGhUb29sLmdldFVJSWNvblBhdGgoXCJjb21tb25cIixcInR4dF9jbl9jb21tb25fOTAwMDhcIiksZnVuY3Rpb24ocmVzKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb3VibGVfaWNvbi5zcHJpdGVGcmFtZSA9IHJlc1xuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZG91YmxlX2ljb24ubm9kZS5hY3RpdmUgPSB0cnVlXG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgaWYodGhpcy5kb3VibGVfaWNvbil7XG4gICAgICAgICAgICAgICAgdGhpcy5kb3VibGVfaWNvbi5ub2RlLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBzZXRTdW1tb25OdW1iZXIoKXtcbiAgICAgICAgaWYodGhpcy5yb290X3duZCl7XG4gICAgICAgICAgICB0aGlzLmV4dGVuZF9sYWJlbC5zdHJpbmcgPSBOdW1iZXIodGhpcy5kYXRhLnByb2JhYmlsaXR5KS50b0ZpeGVkKDMpICsgXCIlXCI7XG4gICAgICAgICAgICB0aGlzLmV4dGVuZF9sYWJlbC5mb250U2l6ZSA9IDIyO1xuICAgICAgICAgICAgdGhpcy5leHRlbmRfbGFiZWwubGluZUhlaWdodCA9IDMwOyBcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5kX2xhYmVsLm5vZGUueSA9IC02NVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOaImOS7pOa0u+WKqOeahOS4qumUgVxuICAgIHNob3dPcmRlcldhckxvY2s6ZnVuY3Rpb24oYm9vbCl7XG4gICAgICAgIHRoaXMuaXNTaG93T3JkZXJXYXJMb2NrID0gYm9vbDtcbiAgICAgICAgaWYoYm9vbCA9PSBmYWxzZSAmJiAhdGhpcy5vcmRlcl93YXJfbG9jaylyZXR1cm47XG4gICAgICAgIGlmKCF0aGlzLnJvb3Rfd25kKXtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZighdGhpcy5vcmRlcl93YXJfbG9jayl7XG4gICAgICAgICAgICB0aGlzLm9yZGVyX3dhcl9sb2NrID0gVXRpbHMuY3JlYXRlSW1hZ2UodGhpcy5yb290X3duZCwgUGF0aFRvb2wuZ2V0VUlJY29uUGF0aChcImNvbW1vblwiLCBcImNvbW1vbl85MDAwOVwiKSwgLTUzLDM4LCBjYy52MigwLjUsIDAuNSksIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9yZGVyX3dhcl9sb2NrLm5vZGUuYWN0aXZlID0gYm9vbDtcbiAgICB9LFxuXG4gICAgLy8g5oiY5Luk5rS75YqoIOeJqeWTgeaYr+WQpumihuWPlueKtuaAgVxuICAgIElzR2V0U3RhdHVzOmZ1bmN0aW9uKGJvb2wpe1xuICAgICAgICB0aGlzLmlzX3Nob3dfZ2V0X3NlbGVjdCA9IGJvb2w7XG4gICAgICAgIGlmKGJvb2wgPT0gZmFsc2UgJiYgIXRoaXMuaXNfZ2V0X3NlbGVjdClyZXR1cm47XG4gICAgICAgIGlmKCF0aGlzLnJvb3Rfd25kKXJldHVybjtcbiAgICAgICAgaWYoIXRoaXMuaXNfZ2V0X3NlbGVjdCl7XG4gICAgICAgICAgICB0aGlzLmlzX2dldF9zZWxlY3QgPSBuZXcgY2MuTm9kZSgpO1xuICAgICAgICAgICAgdGhpcy5pc19nZXRfc2VsZWN0LnNldENvbnRlbnRTaXplKGNjLnNpemUoMTIwLCAxMjApKVxuICAgICAgICAgICAgdGhpcy5pc19nZXRfc2VsZWN0LnNldEFuY2hvclBvaW50KDAuNSwwLjUpO1xuICAgICAgICAgICAgdGhpcy5pc19nZXRfc2VsZWN0LnNldFBvc2l0aW9uKDAsMCk7XG4gICAgICAgICAgICB0aGlzLnJvb3Rfd25kLmFkZENoaWxkKHRoaXMuaXNfZ2V0X3NlbGVjdCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciBiZyA9IFV0aWxzLmNyZWF0ZUltYWdlKHRoaXMuaXNfZ2V0X3NlbGVjdCwgUGF0aFRvb2wuZ2V0VUlJY29uUGF0aChcImNvbW1vblwiLCBcImNvbW1vbl8xMDc0XCIpLCAwLDAsIGNjLnYyKDAuNSwgMC41KSwgZmFsc2UsbnVsbCx0cnVlKTtcbiAgICAgICAgICAgIGJnLm5vZGUuc2V0Q29udGVudFNpemUoY2Muc2l6ZSgxMjAsIDEyMCkpO1xuICAgICAgICAgICAgVXRpbHMuY3JlYXRlSW1hZ2UodGhpcy5pc19nZXRfc2VsZWN0LCBQYXRoVG9vbC5nZXRVSUljb25QYXRoKFwiY29tbW9uXCIsIFwiY29tbW9uXzEwNDNcIiksIDAsMCwgY2MudjIoMC41LCAwLjUpLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc19nZXRfc2VsZWN0LmFjdGl2ZSA9IGJvb2w7XG4gICAgfSxcbiAgICBjaGVja0lzV2Vla0NhcmQoZGF0YSl7XG4gICAgICAgIGxldCBjYXJkX3R5cGUgPSAwXG4gICAgICAgIGlmKGRhdGEpe1xuICAgICAgICAgICAgZm9yKGxldCBpPTA7aTxkYXRhLmxlbmd0aDsrK2kpe1xuICAgICAgICAgICAgICAgIGxldCB2ID0gZGF0YVtpXVxuICAgICAgICAgICAgICAgIGlmKHYgPT0gNTApe1xuICAgICAgICAgICAgICAgICAgICBjYXJkX3R5cGUgPSB2XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYXJkX3R5cGVcbiAgICB9LFxuICAgIHNob3dXZWVrQ2FyZFRhZyhzdGF0dXMpe1xuICAgICAgICBpZihzdGF0dXMgPT0gdHJ1ZSl7XG4gICAgICAgICAgICBsZXQgcmVzID0gUGF0aFRvb2wuZ2V0VUlJY29uUGF0aChcInRpcHNcIixcInR4dF9jbl90aXBzXzFcIilcbiAgICAgICAgICAgIGlmKCF0aGlzLnVzZV93ZWVrX2NhcmQpe1xuICAgICAgICAgICAgICAgIHRoaXMudXNlX3dlZWtfY2FyZCA9IFV0aWxzLmNyZWF0ZUltYWdlKHRoaXMubWFpbl9jb250YWluZXIsIHJlcywtMjcsIDQwLCBjYy52MigwLjUsMC41KSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudXNlX3dlZWtfY2FyZC5ub2RlLmFjdGl2ZSA9IHRydWVcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpZih0aGlzLnVzZV93ZWVrX2NhcmQpe1xuICAgICAgICAgICAgICAgIHRoaXMudXNlX3dlZWtfY2FyZC5ub2RlLmRlc3Ryb3koKVxuICAgICAgICAgICAgICAgIHRoaXMudXNlX3dlZWtfY2FyZCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/orr7nva7pgInkuK3nirbmgIFcbiAgICBzZXRTZWxlY3RlZDpmdW5jdGlvbihzdGF0dXMpe1xuICAgICAgICBpZih0aGlzLnNlbGVjdCl7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdC5hY3RpdmUgPSBzdGF0dXM7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIFxuICAgIG9uRGVsZXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmhlcm9FeHBlZGl0VGFnKSB7XG4gICAgICAgICAgICB0aGlzLmhlcm9FeHBlZGl0VGFnLm5vZGUuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5oZXJvRXhwZWRpdFRhZyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYWRkX2J0bl9zcCkge1xuICAgICAgICAgICAgdGhpcy5hZGRfYnRuX3NwLm5vZGUuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5hZGRfYnRuX3NwID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5oZXJvRXhwZWRpdFRhZ19kZXNjKSB7XG4gICAgICAgICAgICB0aGlzLmhlcm9FeHBlZGl0VGFnX2Rlc2Mubm9kZS5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLmhlcm9FeHBlZGl0VGFnX2Rlc2MgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMuY2hlY2tfYm94KXtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tfYm94LmRlbGV0ZU1lKCk7XG4gICAgICAgICAgICB0aGlzLmNoZWNrX2JveCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLml0ZW1fbnVtID0gXCJcIjtcbiAgICAgICAgdGhpcy5pc1NldEVmZmVjdCA9IGZhbHNlO1xuICAgICAgICBpZih0aGlzLml0ZW1faWNvbil7XG4gICAgICAgICAgICB0aGlzLml0ZW1faWNvbi5zcHJpdGVGcmFtZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXRhID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMucm9vdF93bmQgJiYgdGhpcy5jbGlja19ldmVudCkge1xuICAgICAgICAgICAgdGhpcy5yb290X3duZC5vZmYoY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELHRoaXMub25DbGlja1Jvb3RXbmQsdGhpcylcbiAgICAgICAgICAgIHRoaXMucm9vdF93bmQub2ZmKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX1NUQVJULCB0aGlzLm9uQ2xpY2tSb290V25kLCB0aGlzKTtcbiAgICAgICAgICAgIHRoaXMucm9vdF93bmQub2ZmKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0NBTkNFTCwgdGhpcy5vbkNsaWNrUm9vdFduZCwgdGhpcyk7XG4gICAgICAgICAgICBpZih0aGlzLmJsb2NrX2V2ZW50KXtcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrX2V2ZW50LmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuY2xpY2tfZXZlbnQgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIEl0ZW1zUG9vbC5nZXRJbnN0YW5jZSgpLmNhY2hlSXRlbSh0aGlzKTtcbiAgICB9XG59KSJdfQ==