|
(function() {
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
var __module = nodeEnv ? module : {exports:{}};
|
var __filename = 'preview-scripts/assets/Scripts/mod/hero/view/hero_reset_window.js';
|
var __require = nodeEnv ? function (request) {
|
return cc.require(request);
|
} : function (request) {
|
return __quick_compile_project__.require(request, __filename);
|
};
|
function __define (exports, require, module) {
|
if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict";
|
cc._RF.push(module, '7daa2efbh5I7Jx/f+dWAmsi', 'hero_reset_window');
|
// Scripts/mod/hero/view/hero_reset_window.js
|
|
"use strict";
|
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
// --------------------------------------------------------------------
|
// @author: xxx@syg.com(必填, 创建模块的人员)
|
// @description:
|
// 这里是描述这个窗体的作用的
|
// <br/>Create: 2019-03-02 15:13:30
|
// --------------------------------------------------------------------
|
var PathTool = require("pathtool");
|
|
var HeroConst = require("hero_const");
|
|
var HeroEvent = require("hero_event");
|
|
var MallController = require("mall_controller");
|
|
var MallConst = require("mall_const");
|
|
var BackpackController = require("backpack_controller");
|
|
var BackPackConst = require("backpack_const");
|
|
var BackpackEvent = require("backpack_event");
|
|
var HeroResetWindow = cc.Class({
|
"extends": BaseView,
|
ctor: function ctor() {
|
this.prefabPath = PathTool.getPrefabPath("hero", "hero_reset_window");
|
this.viewTag = SCENE_TAG.ui; //该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意
|
|
this.win_type = WinType.Full; //是否是全屏窗体 WinType.Full, WinType.Big, WinType.Mini, WinType.Tips
|
|
this.ctrl = arguments[0];
|
this.model = this.ctrl.getModel();
|
},
|
// 初始化一些配置数据,可以用于声明一些变量之类的
|
initConfig: function initConfig() {
|
this.cur_camp = 0;
|
this.select_heros = []; //最多选择10个
|
|
this.select_max_count = 10;
|
this.is_send_proto = false;
|
},
|
// 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件
|
openCallBack: function openCallBack() {
|
var _tab_name_list,
|
_this = this;
|
|
this.main_panel_nd = this.seekChild("main_container");
|
this.close_btn_nd = this.seekChild("close_btn");
|
this.camp_node_nd = this.seekChild("camp_node");
|
this.img_select_nd = this.seekChild("img_select");
|
this.hero_list_nd = this.seekChild("hero_list");
|
this.no_vedio_image_nd = this.seekChild("no_vedio_image");
|
this.tips_lb = this.seekChild(this.no_vedio_image_nd, "no_vedio_label", cc.Label);
|
this.putin_btn_nd = this.seekChild("putin_btn");
|
this.disband_btn_nd = this.seekChild("disband_btn");
|
this.partner_btn_nd = this.seekChild("partner_btn");
|
this.tip_btn_nd = this.seekChild("tip_btn");
|
this.look_btn_nd = this.seekChild("look_btn");
|
this.hero_count_lb = this.seekChild("hero_count", cc.Label);
|
this.input_count_lb = this.seekChild("input_count", cc.Label);
|
this.tab_container_nd = this.seekChild("tab_container");
|
this.hero_tab = this.seekChild("hero_xianji");
|
this.debris_tab = this.seekChild("debris_xianji");
|
this.resolve_count_lb = this.seekChild(this.debris_tab, "resolve_count", cc.EditBox);
|
this.redu_btn = this.seekChild(this.debris_tab, "redu_btn", cc.Button);
|
this.add_btn = this.seekChild(this.debris_tab, "add_btn", cc.Button);
|
this.max_btn = this.seekChild(this.debris_tab, "max_btn", cc.Button);
|
this.debris_btn = this.seekChild(this.debris_tab, "debris_btn", cc.Button);
|
this.redu_lb = this.redu_btn.node.getChildByName("Label").getComponent(cc.LabelOutline);
|
this.add_lb = this.add_btn.node.getChildByName("Label").getComponent(cc.LabelOutline);
|
this.max_lb = this.max_btn.node.getChildByName("Label").getComponent(cc.LabelOutline);
|
this.resolve_count_lb.node.on('text-changed', function (editbox) {
|
if (!this.selectChipIndex || this.selectChipIndex == -1) {
|
editbox.string = "0";
|
return;
|
}
|
|
if (editbox.string.length > 1 && editbox.string[0] == "0") {
|
editbox.string = editbox.string.slice(1, editbox.string.length);
|
return;
|
}
|
|
var num = Number(editbox.string);
|
|
if (num > this.chipMaxNum) {
|
editbox.string = this.chipMaxNum;
|
}
|
|
this.checkBtnState();
|
}, this);
|
this.redu_btn.node.on("click", this.onClickBtnRedu, this);
|
this.add_btn.node.on("click", this.onClickBtnAdd, this);
|
this.max_btn.node.on("click", this.onClickBtnMax, this);
|
this.debris_btn.node.on("click", this.onDisbandChip, this);
|
var tab_name_list = (_tab_name_list = {}, _defineProperty(_tab_name_list, 1, Utils.TI18N("英雄献祭")), _defineProperty(_tab_name_list, 2, Utils.TI18N("碎片献祭")), _tab_name_list);
|
this.tab_list = {};
|
|
var _loop = function _loop(i) {
|
var object = {};
|
object.tab_btn = _this.tab_container_nd.getChildByName("toggle" + i);
|
object.index = i;
|
object.toggle = object.tab_btn.getComponent(cc.Toggle);
|
object.tab_btn.getChildByName("title").getComponent(cc.Label).string = tab_name_list[i];
|
object.tab_btn.on("toggle", function () {
|
Utils.playButtonSound(1);
|
this.changeSelectedTab(i);
|
}, _this);
|
_this.tab_list[i] = object;
|
};
|
|
for (var i = 1; i <= 2; ++i) {
|
_loop(i);
|
}
|
|
this.input_count_lb.string = Utils.TI18N("已放入英雄:" + "0/" + this.select_max_count); // this.anima_sk = this.seekChild("anima", sp.Skeleton);
|
// this.anima_sk.setCompleteListener(this.onAnimaFinish.bind(this));
|
|
var bg = this.seekChild("bg", cc.Sprite);
|
bg.node.scale = FIT_SCALE * 2;
|
this.loadRes(PathTool.getBigBg("hero/hero_reset_bg"), function (res) {
|
bg.spriteFrame = res;
|
}.bind(this));
|
this.reset_effect = this.seekChild("play_effect1", sp.Skeleton);
|
this.reset_effect.setCompleteListener(this.onAnimaFinish.bind(this));
|
var sketon_path = PathTool.getSpinePath("E24121", "action");
|
this.loadRes(sketon_path, function (skeleton_data) {
|
this.reset_effect.skeletonData = skeleton_data;
|
this.reset_effect.setAnimation(0, PlayerAction.action_1, true);
|
}.bind(this));
|
this.camp_btns = {};
|
|
for (var camp_i = 0; camp_i < 6; camp_i++) {
|
this.camp_btns[camp_i] = this.camp_node_nd.getChildByName("camp_btn" + camp_i);
|
this.camp_btns[camp_i].camp_tag = camp_i;
|
var camp_sp = this.camp_btns[camp_i].getComponent(cc.Sprite);
|
this.camp_btns[camp_i].on(cc.Node.EventType.TOUCH_END, this.didClickCamp, this);
|
}
|
|
this.close_btn_nd.on(cc.Node.EventType.TOUCH_END, this.onClickCloseBtn, this);
|
this.putin_btn_nd.on(cc.Node.EventType.TOUCH_END, this.onClickPutinBtn, this);
|
this.disband_btn_nd.on(cc.Node.EventType.TOUCH_END, this.onClickDisbandBtn, this);
|
this.partner_btn_nd.on(cc.Node.EventType.TOUCH_END, this.onClickPartnerBtn, this);
|
this.tip_btn_nd.on(cc.Node.EventType.TOUCH_END, this.onClickTipBtn, this);
|
this.look_btn_nd.on(cc.Node.EventType.TOUCH_END, this.onClickLookBtn, this); // this.bigbg_56_1 = this.seekChild("bigbg_56_1",cc.Sprite);
|
// this.loadRes(PathTool.getBigBg("bigbg_62"),function(sp){
|
// this.bigbg_56_1.spriteFrame = sp;
|
// }.bind(this))
|
|
this.initHeroList();
|
},
|
// 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
|
registerEvent: function registerEvent() {
|
// 删除英雄
|
this.addGlobalEvent(HeroEvent.Del_Hero_Event, function (hero_list) {
|
this.select_heros = [];
|
this.updateCamp();
|
this.input_count_lb.string = Utils.TI18N("已放入英雄:" + "0/" + this.select_max_count);
|
this.is_send_proto = false;
|
}.bind(this));
|
this.addGlobalEvent(BackpackEvent.ADD_GOODS, function (bag_code, add_list) {
|
if (bag_code != BackPackConst.Bag_Code.BACKPACK) {
|
return;
|
}
|
|
if (!add_list || Utils.next(add_list) == null || this.select_index != HeroConst.SacrificeType.eChipSacrifice) return;
|
var need_update = false;
|
|
for (var i in add_list) {
|
var v = add_list[i];
|
|
if (v.config && v.config.sub_type == BackPackConst.item_tab_type.HERO) {
|
need_update = true;
|
break;
|
}
|
}
|
|
if (need_update) {
|
this.chipListCamp();
|
}
|
}.bind(this));
|
this.addGlobalEvent(BackpackEvent.DELETE_GOODS, function (bag_code, del_list) {
|
this.is_send_proto = false;
|
|
if (bag_code != BackPackConst.Bag_Code.BACKPACK) {
|
return;
|
}
|
|
if (!del_list || Utils.next(del_list) == null || this.select_index != HeroConst.SacrificeType.eChipSacrifice) return;
|
var need_update = false;
|
|
for (var i in del_list) {
|
var v = del_list[i];
|
|
if (BackPackConst.item_tab_type.HERO == v.config.sub_type) {
|
need_update = true;
|
break;
|
}
|
}
|
|
if (need_update) {
|
this.chipListCamp();
|
}
|
}.bind(this));
|
this.addGlobalEvent(BackpackEvent.MODIFY_GOODS_NUM, function (bag_code, change_list) {
|
this.is_send_proto = false;
|
|
if (bag_code != BackPackConst.Bag_Code.BACKPACK) {
|
return;
|
}
|
|
if (!change_list || Utils.next(change_list) == null || this.select_index != HeroConst.SacrificeType.eChipSacrifice) return;
|
var need_update = false;
|
|
for (var i in change_list) {
|
var v = change_list[i];
|
|
if (v.config && BackPackConst.item_tab_type.HERO == v.config.sub_type) {
|
need_update = true;
|
break;
|
}
|
}
|
|
if (need_update) {
|
this.chipListCamp();
|
}
|
}.bind(this));
|
},
|
// 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了
|
openRootWnd: function openRootWnd(index) {
|
this.select_index = index || HeroConst.SacrificeType.eHeroSacrifice;
|
this.tab_list[this.select_index].toggle.check();
|
|
if (this.select_index == HeroConst.SacrificeType.eHeroSacrifice) {
|
this.changeSelectedTab(this.select_index);
|
} // this.updateWidgets();
|
|
},
|
// 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
|
closeCallBack: function closeCallBack() {
|
if (this.item_scrollview) this.item_scrollview.deleteMe();
|
this.ctrl.openHeroResetWindow(false);
|
},
|
updateWidgets: function updateWidgets() {
|
// var effect_name = PathTool.getEffectRes(548);
|
// var effect_path = PathTool.getSpinePath(effect_name);
|
// this.loadRes(effect_path, function(anima_sd) {
|
// this.anima_sk.skeletonData = anima_sd;
|
// this.anima_sk.setAnimation(0, "action1", true);
|
// }.bind(this));
|
this.updateCamp();
|
},
|
didClickCamp: function didClickCamp(event) {
|
var cur_camp = event.target.camp_tag;
|
if (cur_camp === this.cur_camp) return;
|
this.cur_camp = cur_camp;
|
this.img_select_nd.parent = this.camp_btns[cur_camp];
|
|
if (this.select_index == HeroConst.SacrificeType.eHeroSacrifice) {
|
this.updateCamp();
|
} else if (this.select_index == HeroConst.SacrificeType.eChipSacrifice) {
|
this.chipListCamp();
|
}
|
},
|
onClickCloseBtn: function onClickCloseBtn(event) {
|
Utils.playButtonSound(2);
|
this.ctrl.openHeroResetWindow(false);
|
},
|
initHeroList: function initHeroList() {
|
var CommonScrollView = require("common_scrollview");
|
|
var scroll_view_size = cc.size(this.hero_list_nd.width, this.hero_list_nd.height);
|
var setting = {
|
item_class: "hero_exhibition_item",
|
// 单元类
|
start_x: 0,
|
// 第一个单元的X起点
|
space_x: 0,
|
// x方向的间隔
|
start_y: 4,
|
// 第一个单元的Y起点
|
space_y: 0,
|
// y方向的间隔
|
item_width: 125,
|
// 单元的尺寸width
|
item_height: 122,
|
// 单元的尺寸height
|
col: 5,
|
// 列数,作用于垂直滚动类型
|
once_num: 5,
|
need_dynamic: true
|
};
|
this.item_scrollview = new CommonScrollView();
|
this.item_scrollview.createScroll(this.hero_list_nd, cc.v2(0, 0), ScrollViewDir.vertical, ScrollViewStartPos.top, scroll_view_size, setting, cc.v2(0.5, 0.5));
|
},
|
updateCamp: function updateCamp() {
|
this.cur_role_list = Utils.deepCopy(this.model.getRestHeroListByCamp(this.cur_camp));
|
this.hero_count_lb.string = Utils.TI18N("可献祭英雄:" + this.cur_role_list.length);
|
|
if (this.cur_role_list.length > 0) {
|
this.no_vedio_image_nd.active = false;
|
} else {
|
this.no_vedio_image_nd.active = true;
|
this.tips_lb.string = "暂无可献祭英雄";
|
} // 检查是否选中
|
|
|
for (var hero_i = 0; hero_i < this.cur_role_list.length; ++hero_i) {
|
for (var selec_hero_i = 0; selec_hero_i < this.select_heros.length; ++selec_hero_i) {
|
if (this.select_heros[selec_hero_i].partner_id === this.cur_role_list[hero_i].partner_id) {
|
this.cur_role_list[hero_i].is_ui_select = true;
|
break;
|
}
|
}
|
}
|
|
this.item_scrollview.addEndCallBack(function () {
|
var list = this.item_scrollview.getItemList();
|
|
for (var i = 0; i < list.length; ++i) {
|
var v = list[i];
|
v.showChipIcon(false);
|
}
|
}.bind(this));
|
this.item_scrollview.space_y = 0;
|
this.item_scrollview.setData(this.cur_role_list, this.onClickHeroExhibiton.bind(this), {
|
scale: 0.9,
|
can_click: true,
|
from_type: HeroConst.ExhibitionItemType.eHeroReset
|
});
|
this.input_count_lb.string = Utils.TI18N("已放入英雄:" + "0/" + this.select_max_count);
|
},
|
onClickHeroExhibiton: function onClickHeroExhibiton(hero_item) {
|
if (this.is_send_proto) return;
|
var hero_vo = hero_item.data; // if (hero_vo.star > 6) {
|
// message("7星及以上英雄无法献祭")
|
// return
|
// } else {
|
|
var result = hero_vo.checkHeroLockTips(true);
|
if (result) return; // }
|
|
this.selectHero(hero_item.data);
|
},
|
selectHero: function selectHero(hero_vo) {
|
if (!hero_vo) return;
|
var select_index = -1;
|
|
for (var hero_i in this.select_heros) {
|
if (this.select_heros[hero_i].partner_id == hero_vo.partner_id) {
|
select_index = hero_i;
|
break;
|
}
|
}
|
|
if (select_index > -1) {
|
var hero_index = this.getListIndex(hero_vo.partner_id);
|
|
if (this.cur_role_list[hero_index]) {
|
this.cur_role_list[hero_index].is_ui_select = false;
|
this.item_scrollview.updateItemData(hero_index, this.cur_role_list[hero_index]);
|
}
|
|
this.select_heros.splice(select_index, 1);
|
} else {
|
if (this.select_heros.length < this.select_max_count) {
|
this.select_heros.push(hero_vo);
|
var hero_index = this.getListIndex(hero_vo.partner_id);
|
|
if (this.cur_role_list[hero_index]) {
|
this.cur_role_list[hero_index].is_ui_select = true;
|
this.item_scrollview.updateItemData(hero_index, this.cur_role_list[hero_index]);
|
}
|
} else {
|
message(Utils.TI18N("每次最多可献祭" + this.select_max_count + "个英雄"));
|
}
|
}
|
|
this.input_count_lb.string = Utils.TI18N("已放入英雄:" + this.select_heros.length + "/" + this.select_max_count);
|
},
|
getListIndex: function getListIndex(partner_id) {
|
for (var role_i in this.cur_role_list) {
|
if (this.cur_role_list[role_i].partner_id === partner_id) return role_i;
|
}
|
|
return -1;
|
},
|
onClickPutinBtn: function onClickPutinBtn() {
|
Utils.playButtonSound(1);
|
|
if (this.select_heros.length >= this.select_max_count) {
|
message(Utils.TI18N("每次最多可献祭" + this.select_max_count + "个英雄"));
|
return;
|
}
|
|
var select_index = 0;
|
var cur_select = [];
|
|
while (this.select_heros.length < this.select_max_count) {
|
if (select_index == this.cur_role_list.length) break;
|
var hero_vo = this.checkHero(select_index);
|
|
if (hero_vo) {
|
this.select_heros.push(hero_vo);
|
cur_select.push(hero_vo);
|
}
|
|
select_index++;
|
}
|
|
for (var hero_i in cur_select) {
|
var list_index = this.getListIndex(cur_select[hero_i].partner_id);
|
|
if (this.cur_role_list[list_index]) {
|
this.cur_role_list[list_index].is_ui_select = true;
|
this.item_scrollview.updateItemData(list_index, this.cur_role_list[list_index]);
|
}
|
}
|
|
this.input_count_lb.string = Utils.TI18N("已放入英雄:" + this.select_heros.length + "/" + this.select_max_count);
|
|
if (this.select_heros.length == 0) {
|
message(Utils.TI18N("暂无可放入的英雄"));
|
}
|
},
|
checkHero: function checkHero(index) {
|
if (this.cur_role_list[index]) {
|
var have_select = false;
|
|
for (var heor_i in this.select_heros) {
|
if (this.cur_role_list[index].partner_id === this.select_heros[heor_i].partner_id) {
|
have_select = true;
|
break;
|
}
|
}
|
|
if (!have_select && this.cur_role_list[index].star < 4 && this.cur_role_list[index].is_in_form <= 0) return this.cur_role_list[index];
|
}
|
|
return null;
|
},
|
onClickDisbandBtn: function onClickDisbandBtn(event) {
|
Utils.playButtonSound(1);
|
if (this.is_send_proto) return;
|
|
if (this.select_heros.length > 0) {
|
this.hero_list_info = [];
|
var is_show_tip = false;
|
|
for (var hero_i = 0; hero_i < this.select_heros.length; ++hero_i) {
|
var partner_data = {};
|
var v = this.select_heros[hero_i];
|
partner_data.partner_id = v.partner_id;
|
|
if (v.star >= 5) {
|
is_show_tip = true;
|
}
|
|
this.hero_list_info.push(partner_data);
|
}
|
|
if (this.hero_list_info.length > 0) {
|
this.ctrl.openHeroResetOfferPanel(true, this.hero_list_info, is_show_tip, this.onCloseOfferPanel.bind(this), HeroConst.ResetType.eHeroReset);
|
}
|
} else {
|
message(Utils.TI18N("没有选中英雄"));
|
}
|
},
|
onCloseOfferPanel: function onCloseOfferPanel() {
|
// this.anima_sk.setAnimation(0, "action2", false);
|
if (this.is_send_proto) return;
|
this.reset_effect.setAnimation(0, PlayerAction.action_2, false);
|
this.playEffect();
|
this.is_send_proto = true;
|
Utils.delayRun(this.main_panel_nd, 1.2, function () {
|
this.ctrl.sender11076(this.hero_list_info);
|
}.bind(this));
|
},
|
onAnimaFinish: function onAnimaFinish(track_data) {
|
if (track_data && track_data.animation) {
|
if (track_data.animation.name == PlayerAction.action_2) {
|
this.reset_effect.setAnimation(0, PlayerAction.action_1, true);
|
}
|
}
|
},
|
requestReset: function requestReset() {
|
this.ctrl.sender11076(this.hero_list_info);
|
},
|
onClickPartnerBtn: function onClickPartnerBtn() {
|
Utils.playButtonSound(1);
|
MallController.getInstance().openMallPanel(true, MallConst.MallType.Recovery);
|
},
|
onClickTipBtn: function onClickTipBtn(event) {
|
Utils.playButtonSound(1);
|
var tip_des = Config.partner_data.data_partner_const.game_rule1.desc;
|
|
require("tips_controller").getInstance().showCommonTips(tip_des, event.touch.getLocation());
|
},
|
onClickLookBtn: function onClickLookBtn() {
|
Utils.playButtonSound(1);
|
|
if (this.select_heros.length > 0) {
|
var hero_list_info = [];
|
|
for (var hero_i = 0; hero_i < this.select_heros.length; ++hero_i) {
|
var partner_data = {};
|
partner_data.partner_id = this.select_heros[hero_i].partner_id;
|
hero_list_info.push(partner_data);
|
}
|
|
if (hero_list_info.length > 0) {
|
this.ctrl.openHeroResetReturnPanel(true, hero_list_info);
|
}
|
} else {
|
message(Utils.TI18N("没有选中英雄"));
|
}
|
},
|
changeSelectedTab: function changeSelectedTab(index) {
|
this.select_index = index;
|
this.cur_camp = 0;
|
this.img_select_nd.parent = this.camp_btns[0];
|
this.show_list = [];
|
this.select_heros = [];
|
|
if (index == HeroConst.SacrificeType.eHeroSacrifice) {
|
this.hero_tab.active = true;
|
this.debris_tab.active = false;
|
this.look_btn_nd.active = true;
|
this.updateCamp();
|
} else if (index == HeroConst.SacrificeType.eChipSacrifice) {
|
this.hero_tab.active = false;
|
this.debris_tab.active = true;
|
this.hero_count_lb.string = Utils.TI18N("选择一种碎片后,请再选择数量");
|
this.look_btn_nd.active = false;
|
this.selectChipIndex = -1;
|
this.chipListCamp();
|
this.buttonReset();
|
}
|
},
|
buttonReset: function buttonReset() {
|
this.resolve_count_lb.string = "0";
|
this.checkBtnState();
|
},
|
chipListCamp: function chipListCamp() {
|
var chipID;
|
|
if (this.selectChipIndex != -1) {
|
// 只是刷新
|
var index = this.selectChipIndex;
|
chipID = this.show_list[index].id;
|
this.selectChipIndex = -1;
|
}
|
|
var data = this.getChipListByCamp(this.cur_camp);
|
this.show_list = Utils.deepCopy(data);
|
|
if (this.show_list.length > 0) {
|
this.no_vedio_image_nd.active = false;
|
} else {
|
this.no_vedio_image_nd.active = true;
|
this.tips_lb.string = "暂无可献祭碎片";
|
}
|
|
if (chipID != null) {
|
for (var i = 0; i < this.show_list.length; ++i) {
|
if (this.show_list[i].id == chipID) {
|
this.selectChipIndex = i;
|
this.show_list[i].is_ui_select = true;
|
this.chipMaxNum = this.show_list[i].total_count;
|
break;
|
}
|
} // if(this.selectChipIndex == -1){
|
// this.chipMaxNum = 0;
|
// }
|
|
|
this.buttonReset();
|
}
|
|
this.item_scrollview.addEndCallBack(function () {
|
var list = this.item_scrollview.getItemList();
|
|
for (var _i = 0; _i < list.length; ++_i) {
|
var v = list[_i];
|
v.showChipIcon(true);
|
}
|
}.bind(this));
|
this.item_scrollview.space_y = 10;
|
this.item_scrollview.setData(this.show_list, this.selectChip.bind(this), {
|
scale: 0.9,
|
can_click: true,
|
from_type: HeroConst.ExhibitionItemType.eHeroFuse
|
});
|
},
|
//获取碎片信息
|
getChipListByCamp: function getChipListByCamp(select_camp) {
|
// --碎片获取以后优化
|
var hero_chip_list = BackpackController.getInstance().getModel().getAllBackPackArray(BackPackConst.item_tab_type.HERO) || [];
|
var show_list = [];
|
var cur_select_chip_data = null;
|
var partner_config = Config.partner_data.data_get_compound_info;
|
|
for (var i = 0; i < hero_chip_list.length; ++i) {
|
var v = hero_chip_list[i];
|
var config = v.config;
|
|
if (config && (select_camp == 0 || select_camp == config.lev)) {
|
var data = {};
|
data.id = v.id;
|
data.bid = 0;
|
data.need_count = partner_config[v.base_id].num;
|
data.base_id = config.id;
|
data.star = config.eqm_jie; //--星级
|
|
data.camp_type = config.lev; //--阵营
|
|
data.icon = config.icon; //--图片
|
|
data.total_count = v.quantity;
|
data.quality = v.quality;
|
data.config = config;
|
var status = BackpackController.getInstance().getModel().checkHeroChipRedPoint(v);
|
|
if (status) {
|
//可以合成
|
data.sort_order = 1;
|
} else {
|
data.sort_order = 0;
|
}
|
|
if (v.quantity > 0) {
|
show_list.push(data);
|
} // --查找已经选中
|
|
|
if (this.select_chip_data && this.select_chip_data.id == data.id) {
|
cur_select_chip_data = data;
|
}
|
}
|
}
|
|
var sort_func = Utils.tableCommonSorter([["sort_order", true], ["quality", true], ["base_id", false]]);
|
show_list.sort(sort_func);
|
return show_list;
|
},
|
selectChip: function selectChip(hero_vo) {
|
if (this.is_send_proto) return;
|
if (!hero_vo) return;
|
|
if (this.selectChipIndex != null && this.selectChipIndex > -1 && this.show_list[this.selectChipIndex].base_id != hero_vo.getData().base_id) {
|
this.show_list[this.selectChipIndex].is_ui_select = !this.show_list[this.selectChipIndex].is_ui_select;
|
this.item_scrollview.updateItemData(this.selectChipIndex, this.show_list[this.selectChipIndex]);
|
}
|
|
var select_index = -1;
|
|
for (var hero_i = 0; hero_i < this.show_list.length; ++hero_i) {
|
if (this.show_list[hero_i].base_id == hero_vo.getData().base_id) {
|
this.show_list[hero_i].is_ui_select = !this.show_list[hero_i].is_ui_select;
|
this.item_scrollview.updateItemData(hero_i, this.show_list[hero_i]);
|
|
if (this.show_list[hero_i].is_ui_select) {
|
select_index = hero_i;
|
}
|
|
break;
|
}
|
}
|
|
this.selectChipIndex = select_index;
|
|
if (select_index == -1) {
|
this.buttonReset();
|
} else {
|
var max = hero_vo.getData().total_count;
|
this.setChipCount(max);
|
}
|
},
|
setChipCount: function setChipCount(num) {
|
this.chipMaxNum = num;
|
this.resolve_count_lb.string = "1";
|
this.max_btn.interactable = true;
|
this.max_btn.enableAutoGrayEffect = false;
|
this.max_lb.enabled = true;
|
this.checkBtnState();
|
},
|
onClickBtnMax: function onClickBtnMax() {
|
this.resolve_count_lb.string = this.chipMaxNum;
|
this.checkBtnState();
|
},
|
onClickBtnAdd: function onClickBtnAdd() {
|
var num = Number(this.resolve_count_lb.string);
|
num += 1;
|
this.resolve_count_lb.string = num;
|
this.checkBtnState();
|
},
|
onClickBtnRedu: function onClickBtnRedu() {
|
var num = Number(this.resolve_count_lb.string);
|
num -= 1;
|
this.resolve_count_lb.string = num;
|
this.checkBtnState();
|
},
|
checkBtnState: function checkBtnState() {
|
var num = Number(this.resolve_count_lb.string);
|
|
if (this.selectChipIndex == -1) {
|
this.redu_btn.interactable = false;
|
this.redu_btn.enableAutoGrayEffect = true;
|
this.add_btn.interactable = false;
|
this.add_btn.enableAutoGrayEffect = true;
|
this.max_btn.interactable = false;
|
this.max_btn.enableAutoGrayEffect = true;
|
this.redu_lb.enabled = false;
|
this.add_lb.enabled = false;
|
this.max_lb.enabled = false;
|
} else if (num <= 0) {
|
this.redu_btn.interactable = false;
|
this.redu_btn.enableAutoGrayEffect = true;
|
this.redu_lb.enabled = false;
|
this.add_btn.interactable = true;
|
this.add_btn.enableAutoGrayEffect = false;
|
this.add_lb.enabled = true;
|
} else if (num >= this.chipMaxNum) {
|
this.redu_btn.interactable = true;
|
this.redu_btn.enableAutoGrayEffect = false;
|
this.redu_lb.enabled = false;
|
this.add_btn.interactable = false;
|
this.add_btn.enableAutoGrayEffect = true;
|
this.add_lb.enabled = false;
|
} else {
|
this.redu_btn.interactable = true;
|
this.redu_btn.enableAutoGrayEffect = false;
|
this.redu_lb.enabled = true;
|
this.add_btn.interactable = true;
|
this.add_btn.enableAutoGrayEffect = false;
|
this.add_lb.enabled = true;
|
}
|
},
|
onDisbandChip: function onDisbandChip() {
|
Utils.playButtonSound(1);
|
if (this.is_send_proto) return;
|
|
if (this.selectChipIndex == -1) {
|
message(Utils.TI18N("没有选中英雄碎片"));
|
return;
|
}
|
|
var count = Number(this.resolve_count_lb.string);
|
|
if (count <= 0) {
|
message(Utils.TI18N("没有放入英雄碎片"));
|
return;
|
}
|
|
if (count > this.chipMaxNum) {
|
message(Utils.TI18N("超过已拥有碎片上限"));
|
return;
|
}
|
|
var data = this.show_list[this.selectChipIndex];
|
var config = data.config;
|
var is_show_tip = data.sort_order == 1;
|
var color = BackPackConst.getWhiteQualityColorStr(config.quality);
|
var item_list = [];
|
|
for (var i = 0; i < config.value.length; ++i) {
|
var v = config.value[i];
|
var id = v[0];
|
var num = v[1] || 0;
|
num = num * count;
|
|
if (id != null) {
|
item_list.push({
|
id: id,
|
num: num
|
});
|
}
|
}
|
|
var sell_data = {
|
id: data.id,
|
bid: data.base_id,
|
num: count
|
};
|
|
if (item_list.length) {
|
var str = cc.js.formatStr("本次分解 <color=#289b14>%s</color> 个<color=%s>【%s】</color>可获得以下资源:", count, color, config.name);
|
this.ctrl.openHeroResetOfferPanel(true, item_list, is_show_tip, function () {
|
this.reset_effect.setAnimation(0, PlayerAction.action_2, false);
|
this.playEffect();
|
this.is_send_proto = true;
|
Utils.delayRun(this.main_panel_nd, 1.2, function () {
|
BackpackController.getInstance().sender10522(BackPackConst.Bag_Code.BACKPACK, [sell_data]);
|
}.bind(this));
|
}.bind(this), HeroConst.ResetType.eChipReset, str);
|
}
|
},
|
// --播放火花的效果
|
playEffect: function playEffect() {
|
if (this.play_effect2 == null) {
|
this.play_effect2 = this.seekChild("play_effect2", sp.Skeleton);
|
var sketon_path = PathTool.getSpinePath("E24122", "action");
|
this.loadRes(sketon_path, function (skeleton_data) {
|
this.play_effect2.skeletonData = skeleton_data;
|
this.play_effect2.setAnimation(0, PlayerAction.action, false);
|
}.bind(this));
|
} else {
|
this.play_effect2.setAnimation(0, PlayerAction.action, false);
|
}
|
}
|
});
|
|
cc._RF.pop();
|
}
|
if (nodeEnv) {
|
__define(__module.exports, __require, __module);
|
}
|
else {
|
__quick_compile_project__.registerModuleFunc(__filename, function () {
|
__define(__module.exports, __require, __module);
|
});
|
}
|
})();
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxoZXJvXFx2aWV3XFxoZXJvX3Jlc2V0X3dpbmRvdy5qcyJdLCJuYW1lcyI6WyJQYXRoVG9vbCIsInJlcXVpcmUiLCJIZXJvQ29uc3QiLCJIZXJvRXZlbnQiLCJNYWxsQ29udHJvbGxlciIsIk1hbGxDb25zdCIsIkJhY2twYWNrQ29udHJvbGxlciIsIkJhY2tQYWNrQ29uc3QiLCJCYWNrcGFja0V2ZW50IiwiSGVyb1Jlc2V0V2luZG93IiwiY2MiLCJDbGFzcyIsIkJhc2VWaWV3IiwiY3RvciIsInByZWZhYlBhdGgiLCJnZXRQcmVmYWJQYXRoIiwidmlld1RhZyIsIlNDRU5FX1RBRyIsInVpIiwid2luX3R5cGUiLCJXaW5UeXBlIiwiRnVsbCIsImN0cmwiLCJhcmd1bWVudHMiLCJtb2RlbCIsImdldE1vZGVsIiwiaW5pdENvbmZpZyIsImN1cl9jYW1wIiwic2VsZWN0X2hlcm9zIiwic2VsZWN0X21heF9jb3VudCIsImlzX3NlbmRfcHJvdG8iLCJvcGVuQ2FsbEJhY2siLCJtYWluX3BhbmVsX25kIiwic2Vla0NoaWxkIiwiY2xvc2VfYnRuX25kIiwiY2FtcF9ub2RlX25kIiwiaW1nX3NlbGVjdF9uZCIsImhlcm9fbGlzdF9uZCIsIm5vX3ZlZGlvX2ltYWdlX25kIiwidGlwc19sYiIsIkxhYmVsIiwicHV0aW5fYnRuX25kIiwiZGlzYmFuZF9idG5fbmQiLCJwYXJ0bmVyX2J0bl9uZCIsInRpcF9idG5fbmQiLCJsb29rX2J0bl9uZCIsImhlcm9fY291bnRfbGIiLCJpbnB1dF9jb3VudF9sYiIsInRhYl9jb250YWluZXJfbmQiLCJoZXJvX3RhYiIsImRlYnJpc190YWIiLCJyZXNvbHZlX2NvdW50X2xiIiwiRWRpdEJveCIsInJlZHVfYnRuIiwiQnV0dG9uIiwiYWRkX2J0biIsIm1heF9idG4iLCJkZWJyaXNfYnRuIiwicmVkdV9sYiIsIm5vZGUiLCJnZXRDaGlsZEJ5TmFtZSIsImdldENvbXBvbmVudCIsIkxhYmVsT3V0bGluZSIsImFkZF9sYiIsIm1heF9sYiIsIm9uIiwiZWRpdGJveCIsInNlbGVjdENoaXBJbmRleCIsInN0cmluZyIsImxlbmd0aCIsInNsaWNlIiwibnVtIiwiTnVtYmVyIiwiY2hpcE1heE51bSIsImNoZWNrQnRuU3RhdGUiLCJvbkNsaWNrQnRuUmVkdSIsIm9uQ2xpY2tCdG5BZGQiLCJvbkNsaWNrQnRuTWF4Iiwib25EaXNiYW5kQ2hpcCIsInRhYl9uYW1lX2xpc3QiLCJVdGlscyIsIlRJMThOIiwidGFiX2xpc3QiLCJpIiwib2JqZWN0IiwidGFiX2J0biIsImluZGV4IiwidG9nZ2xlIiwiVG9nZ2xlIiwicGxheUJ1dHRvblNvdW5kIiwiY2hhbmdlU2VsZWN0ZWRUYWIiLCJiZyIsIlNwcml0ZSIsInNjYWxlIiwiRklUX1NDQUxFIiwibG9hZFJlcyIsImdldEJpZ0JnIiwicmVzIiwic3ByaXRlRnJhbWUiLCJiaW5kIiwicmVzZXRfZWZmZWN0Iiwic3AiLCJTa2VsZXRvbiIsInNldENvbXBsZXRlTGlzdGVuZXIiLCJvbkFuaW1hRmluaXNoIiwic2tldG9uX3BhdGgiLCJnZXRTcGluZVBhdGgiLCJza2VsZXRvbl9kYXRhIiwic2tlbGV0b25EYXRhIiwic2V0QW5pbWF0aW9uIiwiUGxheWVyQWN0aW9uIiwiYWN0aW9uXzEiLCJjYW1wX2J0bnMiLCJjYW1wX2kiLCJjYW1wX3RhZyIsImNhbXBfc3AiLCJOb2RlIiwiRXZlbnRUeXBlIiwiVE9VQ0hfRU5EIiwiZGlkQ2xpY2tDYW1wIiwib25DbGlja0Nsb3NlQnRuIiwib25DbGlja1B1dGluQnRuIiwib25DbGlja0Rpc2JhbmRCdG4iLCJvbkNsaWNrUGFydG5lckJ0biIsIm9uQ2xpY2tUaXBCdG4iLCJvbkNsaWNrTG9va0J0biIsImluaXRIZXJvTGlzdCIsInJlZ2lzdGVyRXZlbnQiLCJhZGRHbG9iYWxFdmVudCIsIkRlbF9IZXJvX0V2ZW50IiwiaGVyb19saXN0IiwidXBkYXRlQ2FtcCIsIkFERF9HT09EUyIsImJhZ19jb2RlIiwiYWRkX2xpc3QiLCJCYWdfQ29kZSIsIkJBQ0tQQUNLIiwibmV4dCIsInNlbGVjdF9pbmRleCIsIlNhY3JpZmljZVR5cGUiLCJlQ2hpcFNhY3JpZmljZSIsIm5lZWRfdXBkYXRlIiwidiIsImNvbmZpZyIsInN1Yl90eXBlIiwiaXRlbV90YWJfdHlwZSIsIkhFUk8iLCJjaGlwTGlzdENhbXAiLCJERUxFVEVfR09PRFMiLCJkZWxfbGlzdCIsIk1PRElGWV9HT09EU19OVU0iLCJjaGFuZ2VfbGlzdCIsIm9wZW5Sb290V25kIiwiZUhlcm9TYWNyaWZpY2UiLCJjaGVjayIsImNsb3NlQ2FsbEJhY2siLCJpdGVtX3Njcm9sbHZpZXciLCJkZWxldGVNZSIsIm9wZW5IZXJvUmVzZXRXaW5kb3ciLCJ1cGRhdGVXaWRnZXRzIiwiZXZlbnQiLCJ0YXJnZXQiLCJwYXJlbnQiLCJDb21tb25TY3JvbGxWaWV3Iiwic2Nyb2xsX3ZpZXdfc2l6ZSIsInNpemUiLCJ3aWR0aCIsImhlaWdodCIsInNldHRpbmciLCJpdGVtX2NsYXNzIiwic3RhcnRfeCIsInNwYWNlX3giLCJzdGFydF95Iiwic3BhY2VfeSIsIml0ZW1fd2lkdGgiLCJpdGVtX2hlaWdodCIsImNvbCIsIm9uY2VfbnVtIiwibmVlZF9keW5hbWljIiwiY3JlYXRlU2Nyb2xsIiwidjIiLCJTY3JvbGxWaWV3RGlyIiwidmVydGljYWwiLCJTY3JvbGxWaWV3U3RhcnRQb3MiLCJ0b3AiLCJjdXJfcm9sZV9saXN0IiwiZGVlcENvcHkiLCJnZXRSZXN0SGVyb0xpc3RCeUNhbXAiLCJhY3RpdmUiLCJoZXJvX2kiLCJzZWxlY19oZXJvX2kiLCJwYXJ0bmVyX2lkIiwiaXNfdWlfc2VsZWN0IiwiYWRkRW5kQ2FsbEJhY2siLCJsaXN0IiwiZ2V0SXRlbUxpc3QiLCJzaG93Q2hpcEljb24iLCJzZXREYXRhIiwib25DbGlja0hlcm9FeGhpYml0b24iLCJjYW5fY2xpY2siLCJmcm9tX3R5cGUiLCJFeGhpYml0aW9uSXRlbVR5cGUiLCJlSGVyb1Jlc2V0IiwiaGVyb19pdGVtIiwiaGVyb192byIsImRhdGEiLCJyZXN1bHQiLCJjaGVja0hlcm9Mb2NrVGlwcyIsInNlbGVjdEhlcm8iLCJoZXJvX2luZGV4IiwiZ2V0TGlzdEluZGV4IiwidXBkYXRlSXRlbURhdGEiLCJzcGxpY2UiLCJwdXNoIiwibWVzc2FnZSIsInJvbGVfaSIsImN1cl9zZWxlY3QiLCJjaGVja0hlcm8iLCJsaXN0X2luZGV4IiwiaGF2ZV9zZWxlY3QiLCJoZW9yX2kiLCJzdGFyIiwiaXNfaW5fZm9ybSIsImhlcm9fbGlzdF9pbmZvIiwiaXNfc2hvd190aXAiLCJwYXJ0bmVyX2RhdGEiLCJvcGVuSGVyb1Jlc2V0T2ZmZXJQYW5lbCIsIm9uQ2xvc2VPZmZlclBhbmVsIiwiUmVzZXRUeXBlIiwiYWN0aW9uXzIiLCJwbGF5RWZmZWN0IiwiZGVsYXlSdW4iLCJzZW5kZXIxMTA3NiIsInRyYWNrX2RhdGEiLCJhbmltYXRpb24iLCJuYW1lIiwicmVxdWVzdFJlc2V0IiwiZ2V0SW5zdGFuY2UiLCJvcGVuTWFsbFBhbmVsIiwiTWFsbFR5cGUiLCJSZWNvdmVyeSIsInRpcF9kZXMiLCJDb25maWciLCJkYXRhX3BhcnRuZXJfY29uc3QiLCJnYW1lX3J1bGUxIiwiZGVzYyIsInNob3dDb21tb25UaXBzIiwidG91Y2giLCJnZXRMb2NhdGlvbiIsIm9wZW5IZXJvUmVzZXRSZXR1cm5QYW5lbCIsInNob3dfbGlzdCIsImJ1dHRvblJlc2V0IiwiY2hpcElEIiwiaWQiLCJnZXRDaGlwTGlzdEJ5Q2FtcCIsInRvdGFsX2NvdW50Iiwic2VsZWN0Q2hpcCIsImVIZXJvRnVzZSIsInNlbGVjdF9jYW1wIiwiaGVyb19jaGlwX2xpc3QiLCJnZXRBbGxCYWNrUGFja0FycmF5IiwiY3VyX3NlbGVjdF9jaGlwX2RhdGEiLCJwYXJ0bmVyX2NvbmZpZyIsImRhdGFfZ2V0X2NvbXBvdW5kX2luZm8iLCJsZXYiLCJiaWQiLCJuZWVkX2NvdW50IiwiYmFzZV9pZCIsImVxbV9qaWUiLCJjYW1wX3R5cGUiLCJpY29uIiwicXVhbnRpdHkiLCJxdWFsaXR5Iiwic3RhdHVzIiwiY2hlY2tIZXJvQ2hpcFJlZFBvaW50Iiwic29ydF9vcmRlciIsInNlbGVjdF9jaGlwX2RhdGEiLCJzb3J0X2Z1bmMiLCJ0YWJsZUNvbW1vblNvcnRlciIsInNvcnQiLCJnZXREYXRhIiwibWF4Iiwic2V0Q2hpcENvdW50IiwiaW50ZXJhY3RhYmxlIiwiZW5hYmxlQXV0b0dyYXlFZmZlY3QiLCJlbmFibGVkIiwiY291bnQiLCJjb2xvciIsImdldFdoaXRlUXVhbGl0eUNvbG9yU3RyIiwiaXRlbV9saXN0IiwidmFsdWUiLCJzZWxsX2RhdGEiLCJzdHIiLCJqcyIsImZvcm1hdFN0ciIsInNlbmRlcjEwNTIyIiwiZUNoaXBSZXNldCIsInBsYXlfZWZmZWN0MiIsImFjdGlvbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLFFBQVEsR0FBR0MsT0FBTyxDQUFDLFVBQUQsQ0FBdEI7O0FBQ0EsSUFBSUMsU0FBUyxHQUFHRCxPQUFPLENBQUMsWUFBRCxDQUF2Qjs7QUFDQSxJQUFJRSxTQUFTLEdBQUdGLE9BQU8sQ0FBQyxZQUFELENBQXZCOztBQUNBLElBQUlHLGNBQWMsR0FBR0gsT0FBTyxDQUFDLGlCQUFELENBQTVCOztBQUNBLElBQUlJLFNBQVMsR0FBUUosT0FBTyxDQUFDLFlBQUQsQ0FBNUI7O0FBQ0EsSUFBSUssa0JBQWtCLEdBQUdMLE9BQU8sQ0FBQyxxQkFBRCxDQUFoQzs7QUFDQSxJQUFJTSxhQUFhLEdBQUdOLE9BQU8sQ0FBQyxnQkFBRCxDQUEzQjs7QUFDQSxJQUFJTyxhQUFhLEdBQUdQLE9BQU8sQ0FBQyxnQkFBRCxDQUEzQjs7QUFDQSxJQUFJUSxlQUFlLEdBQUdDLEVBQUUsQ0FBQ0MsS0FBSCxDQUFTO0FBQzNCLGFBQVNDLFFBRGtCO0FBRTNCQyxFQUFBQSxJQUFJLEVBQUUsZ0JBQVk7QUFDZCxTQUFLQyxVQUFMLEdBQWtCZCxRQUFRLENBQUNlLGFBQVQsQ0FBdUIsTUFBdkIsRUFBK0IsbUJBQS9CLENBQWxCO0FBQ0EsU0FBS0MsT0FBTCxHQUFlQyxTQUFTLENBQUNDLEVBQXpCLENBRmMsQ0FFOEI7O0FBQzVDLFNBQUtDLFFBQUwsR0FBZ0JDLE9BQU8sQ0FBQ0MsSUFBeEIsQ0FIYyxDQUc4Qjs7QUFFNUMsU0FBS0MsSUFBTCxHQUFZQyxTQUFTLENBQUMsQ0FBRCxDQUFyQjtBQUNBLFNBQUtDLEtBQUwsR0FBYSxLQUFLRixJQUFMLENBQVVHLFFBQVYsRUFBYjtBQUNILEdBVDBCO0FBVzNCO0FBQ0FDLEVBQUFBLFVBQVUsRUFBQyxzQkFBVTtBQUNqQixTQUFLQyxRQUFMLEdBQWdCLENBQWhCO0FBQ0EsU0FBS0MsWUFBTCxHQUFvQixFQUFwQixDQUZpQixDQUdqQjs7QUFDQSxTQUFLQyxnQkFBTCxHQUF3QixFQUF4QjtBQUNBLFNBQUtDLGFBQUwsR0FBcUIsS0FBckI7QUFDSCxHQWxCMEI7QUFvQjNCO0FBQ0FDLEVBQUFBLFlBQVksRUFBQyx3QkFBVTtBQUFBO0FBQUE7O0FBQ25CLFNBQUtDLGFBQUwsR0FBeUIsS0FBS0MsU0FBTCxDQUFlLGdCQUFmLENBQXpCO0FBQ0EsU0FBS0MsWUFBTCxHQUF5QixLQUFLRCxTQUFMLENBQWUsV0FBZixDQUF6QjtBQUNBLFNBQUtFLFlBQUwsR0FBeUIsS0FBS0YsU0FBTCxDQUFlLFdBQWYsQ0FBekI7QUFDQSxTQUFLRyxhQUFMLEdBQXlCLEtBQUtILFNBQUwsQ0FBZSxZQUFmLENBQXpCO0FBQ0EsU0FBS0ksWUFBTCxHQUF5QixLQUFLSixTQUFMLENBQWUsV0FBZixDQUF6QjtBQUNBLFNBQUtLLGlCQUFMLEdBQXlCLEtBQUtMLFNBQUwsQ0FBZSxnQkFBZixDQUF6QjtBQUNBLFNBQUtNLE9BQUwsR0FBeUIsS0FBS04sU0FBTCxDQUFlLEtBQUtLLGlCQUFwQixFQUFzQyxnQkFBdEMsRUFBdUQ1QixFQUFFLENBQUM4QixLQUExRCxDQUF6QjtBQUNBLFNBQUtDLFlBQUwsR0FBeUIsS0FBS1IsU0FBTCxDQUFlLFdBQWYsQ0FBekI7QUFDQSxTQUFLUyxjQUFMLEdBQXlCLEtBQUtULFNBQUwsQ0FBZSxhQUFmLENBQXpCO0FBQ0EsU0FBS1UsY0FBTCxHQUF5QixLQUFLVixTQUFMLENBQWUsYUFBZixDQUF6QjtBQUNBLFNBQUtXLFVBQUwsR0FBeUIsS0FBS1gsU0FBTCxDQUFlLFNBQWYsQ0FBekI7QUFDQSxTQUFLWSxXQUFMLEdBQXlCLEtBQUtaLFNBQUwsQ0FBZSxVQUFmLENBQXpCO0FBRUEsU0FBS2EsYUFBTCxHQUFzQixLQUFLYixTQUFMLENBQWUsWUFBZixFQUE2QnZCLEVBQUUsQ0FBQzhCLEtBQWhDLENBQXRCO0FBQ0EsU0FBS08sY0FBTCxHQUFzQixLQUFLZCxTQUFMLENBQWUsYUFBZixFQUE4QnZCLEVBQUUsQ0FBQzhCLEtBQWpDLENBQXRCO0FBQ0EsU0FBS1EsZ0JBQUwsR0FBd0IsS0FBS2YsU0FBTCxDQUFlLGVBQWYsQ0FBeEI7QUFDQSxTQUFLZ0IsUUFBTCxHQUFnQixLQUFLaEIsU0FBTCxDQUFlLGFBQWYsQ0FBaEI7QUFDQSxTQUFLaUIsVUFBTCxHQUFrQixLQUFLakIsU0FBTCxDQUFlLGVBQWYsQ0FBbEI7QUFDQSxTQUFLa0IsZ0JBQUwsR0FBd0IsS0FBS2xCLFNBQUwsQ0FBZSxLQUFLaUIsVUFBcEIsRUFBK0IsZUFBL0IsRUFBK0N4QyxFQUFFLENBQUMwQyxPQUFsRCxDQUF4QjtBQUNBLFNBQUtDLFFBQUwsR0FBZ0IsS0FBS3BCLFNBQUwsQ0FBZSxLQUFLaUIsVUFBcEIsRUFBK0IsVUFBL0IsRUFBMEN4QyxFQUFFLENBQUM0QyxNQUE3QyxDQUFoQjtBQUNBLFNBQUtDLE9BQUwsR0FBZSxLQUFLdEIsU0FBTCxDQUFlLEtBQUtpQixVQUFwQixFQUErQixTQUEvQixFQUF5Q3hDLEVBQUUsQ0FBQzRDLE1BQTVDLENBQWY7QUFDQSxTQUFLRSxPQUFMLEdBQWUsS0FBS3ZCLFNBQUwsQ0FBZSxLQUFLaUIsVUFBcEIsRUFBK0IsU0FBL0IsRUFBeUN4QyxFQUFFLENBQUM0QyxNQUE1QyxDQUFmO0FBQ0EsU0FBS0csVUFBTCxHQUFrQixLQUFLeEIsU0FBTCxDQUFlLEtBQUtpQixVQUFwQixFQUErQixZQUEvQixFQUE0Q3hDLEVBQUUsQ0FBQzRDLE1BQS9DLENBQWxCO0FBQ0EsU0FBS0ksT0FBTCxHQUFlLEtBQUtMLFFBQUwsQ0FBY00sSUFBZCxDQUFtQkMsY0FBbkIsQ0FBa0MsT0FBbEMsRUFBMkNDLFlBQTNDLENBQXdEbkQsRUFBRSxDQUFDb0QsWUFBM0QsQ0FBZjtBQUNBLFNBQUtDLE1BQUwsR0FBYyxLQUFLUixPQUFMLENBQWFJLElBQWIsQ0FBa0JDLGNBQWxCLENBQWlDLE9BQWpDLEVBQTBDQyxZQUExQyxDQUF1RG5ELEVBQUUsQ0FBQ29ELFlBQTFELENBQWQ7QUFDQSxTQUFLRSxNQUFMLEdBQWMsS0FBS1IsT0FBTCxDQUFhRyxJQUFiLENBQWtCQyxjQUFsQixDQUFpQyxPQUFqQyxFQUEwQ0MsWUFBMUMsQ0FBdURuRCxFQUFFLENBQUNvRCxZQUExRCxDQUFkO0FBQ0EsU0FBS1gsZ0JBQUwsQ0FBc0JRLElBQXRCLENBQTJCTSxFQUEzQixDQUE4QixjQUE5QixFQUE4QyxVQUFTQyxPQUFULEVBQWlCO0FBQzNELFVBQUcsQ0FBQyxLQUFLQyxlQUFOLElBQXlCLEtBQUtBLGVBQUwsSUFBd0IsQ0FBQyxDQUFyRCxFQUF1RDtBQUNuREQsUUFBQUEsT0FBTyxDQUFDRSxNQUFSLEdBQWlCLEdBQWpCO0FBQ0E7QUFDSDs7QUFDRCxVQUFHRixPQUFPLENBQUNFLE1BQVIsQ0FBZUMsTUFBZixHQUF3QixDQUF4QixJQUE2QkgsT0FBTyxDQUFDRSxNQUFSLENBQWUsQ0FBZixLQUFxQixHQUFyRCxFQUF5RDtBQUNyREYsUUFBQUEsT0FBTyxDQUFDRSxNQUFSLEdBQWlCRixPQUFPLENBQUNFLE1BQVIsQ0FBZUUsS0FBZixDQUFxQixDQUFyQixFQUF1QkosT0FBTyxDQUFDRSxNQUFSLENBQWVDLE1BQXRDLENBQWpCO0FBQ0E7QUFDSDs7QUFDRCxVQUFJRSxHQUFHLEdBQUdDLE1BQU0sQ0FBQ04sT0FBTyxDQUFDRSxNQUFULENBQWhCOztBQUNBLFVBQUdHLEdBQUcsR0FBRyxLQUFLRSxVQUFkLEVBQXlCO0FBQ3JCUCxRQUFBQSxPQUFPLENBQUNFLE1BQVIsR0FBaUIsS0FBS0ssVUFBdEI7QUFDSDs7QUFDRCxXQUFLQyxhQUFMO0FBQ0gsS0FkRCxFQWNHLElBZEg7QUFlQSxTQUFLckIsUUFBTCxDQUFjTSxJQUFkLENBQW1CTSxFQUFuQixDQUFzQixPQUF0QixFQUE4QixLQUFLVSxjQUFuQyxFQUFrRCxJQUFsRDtBQUNBLFNBQUtwQixPQUFMLENBQWFJLElBQWIsQ0FBa0JNLEVBQWxCLENBQXFCLE9BQXJCLEVBQTZCLEtBQUtXLGFBQWxDLEVBQWdELElBQWhEO0FBQ0EsU0FBS3BCLE9BQUwsQ0FBYUcsSUFBYixDQUFrQk0sRUFBbEIsQ0FBcUIsT0FBckIsRUFBNkIsS0FBS1ksYUFBbEMsRUFBZ0QsSUFBaEQ7QUFDQSxTQUFLcEIsVUFBTCxDQUFnQkUsSUFBaEIsQ0FBcUJNLEVBQXJCLENBQXdCLE9BQXhCLEVBQWdDLEtBQUthLGFBQXJDLEVBQW1ELElBQW5EO0FBQ0EsUUFBSUMsYUFBYSx5REFDWixDQURZLEVBQ1BDLEtBQUssQ0FBQ0MsS0FBTixDQUFZLE1BQVosQ0FETyxtQ0FFWixDQUZZLEVBRVBELEtBQUssQ0FBQ0MsS0FBTixDQUFZLE1BQVosQ0FGTyxrQkFBakI7QUFJQSxTQUFLQyxRQUFMLEdBQWdCLEVBQWhCOztBQWxEbUIsK0JBbURYQyxDQW5EVztBQW9EZixVQUFJQyxNQUFNLEdBQUcsRUFBYjtBQUNBQSxNQUFBQSxNQUFNLENBQUNDLE9BQVAsR0FBaUIsS0FBSSxDQUFDckMsZ0JBQUwsQ0FBc0JZLGNBQXRCLENBQXFDLFdBQVN1QixDQUE5QyxDQUFqQjtBQUNBQyxNQUFBQSxNQUFNLENBQUNFLEtBQVAsR0FBZUgsQ0FBZjtBQUNBQyxNQUFBQSxNQUFNLENBQUNHLE1BQVAsR0FBZ0JILE1BQU0sQ0FBQ0MsT0FBUCxDQUFleEIsWUFBZixDQUE0Qm5ELEVBQUUsQ0FBQzhFLE1BQS9CLENBQWhCO0FBQ0FKLE1BQUFBLE1BQU0sQ0FBQ0MsT0FBUCxDQUFlekIsY0FBZixDQUE4QixPQUE5QixFQUF1Q0MsWUFBdkMsQ0FBb0RuRCxFQUFFLENBQUM4QixLQUF2RCxFQUE4RDRCLE1BQTlELEdBQXVFVyxhQUFhLENBQUNJLENBQUQsQ0FBcEY7QUFDQUMsTUFBQUEsTUFBTSxDQUFDQyxPQUFQLENBQWVwQixFQUFmLENBQWtCLFFBQWxCLEVBQTJCLFlBQVU7QUFDakNlLFFBQUFBLEtBQUssQ0FBQ1MsZUFBTixDQUFzQixDQUF0QjtBQUNBLGFBQUtDLGlCQUFMLENBQXVCUCxDQUF2QjtBQUNILE9BSEQsRUFHRSxLQUhGO0FBSUEsTUFBQSxLQUFJLENBQUNELFFBQUwsQ0FBY0MsQ0FBZCxJQUFtQkMsTUFBbkI7QUE3RGU7O0FBbURuQixTQUFJLElBQUlELENBQUMsR0FBQyxDQUFWLEVBQVlBLENBQUMsSUFBRSxDQUFmLEVBQWlCLEVBQUVBLENBQW5CLEVBQXFCO0FBQUEsWUFBYkEsQ0FBYTtBQVdwQjs7QUFDRCxTQUFLcEMsY0FBTCxDQUFvQnFCLE1BQXBCLEdBQTZCWSxLQUFLLENBQUNDLEtBQU4sQ0FBWSxXQUFTLElBQVQsR0FBYyxLQUFLcEQsZ0JBQS9CLENBQTdCLENBL0RtQixDQWdFbkI7QUFDQTs7QUFDQSxRQUFJOEQsRUFBRSxHQUFHLEtBQUsxRCxTQUFMLENBQWUsSUFBZixFQUFxQnZCLEVBQUUsQ0FBQ2tGLE1BQXhCLENBQVQ7QUFDQUQsSUFBQUEsRUFBRSxDQUFDaEMsSUFBSCxDQUFRa0MsS0FBUixHQUFnQkMsU0FBUyxHQUFHLENBQTVCO0FBQ0EsU0FBS0MsT0FBTCxDQUFhL0YsUUFBUSxDQUFDZ0csUUFBVCxDQUFrQixvQkFBbEIsQ0FBYixFQUFxRCxVQUFTQyxHQUFULEVBQWE7QUFDOUROLE1BQUFBLEVBQUUsQ0FBQ08sV0FBSCxHQUFpQkQsR0FBakI7QUFDSCxLQUZvRCxDQUVuREUsSUFGbUQsQ0FFOUMsSUFGOEMsQ0FBckQ7QUFHQSxTQUFLQyxZQUFMLEdBQW9CLEtBQUtuRSxTQUFMLENBQWUsY0FBZixFQUErQm9FLEVBQUUsQ0FBQ0MsUUFBbEMsQ0FBcEI7QUFDQSxTQUFLRixZQUFMLENBQWtCRyxtQkFBbEIsQ0FBc0MsS0FBS0MsYUFBTCxDQUFtQkwsSUFBbkIsQ0FBd0IsSUFBeEIsQ0FBdEM7QUFDQSxRQUFJTSxXQUFXLEdBQUd6RyxRQUFRLENBQUMwRyxZQUFULENBQXNCLFFBQXRCLEVBQWdDLFFBQWhDLENBQWxCO0FBQ0EsU0FBS1gsT0FBTCxDQUFhVSxXQUFiLEVBQXlCLFVBQVNFLGFBQVQsRUFBdUI7QUFDNUMsV0FBS1AsWUFBTCxDQUFrQlEsWUFBbEIsR0FBaUNELGFBQWpDO0FBQ0EsV0FBS1AsWUFBTCxDQUFrQlMsWUFBbEIsQ0FBK0IsQ0FBL0IsRUFBa0NDLFlBQVksQ0FBQ0MsUUFBL0MsRUFBeUQsSUFBekQ7QUFDSCxLQUh3QixDQUd2QlosSUFIdUIsQ0FHbEIsSUFIa0IsQ0FBekI7QUFJQSxTQUFLYSxTQUFMLEdBQWlCLEVBQWpCOztBQUNBLFNBQUssSUFBSUMsTUFBTSxHQUFHLENBQWxCLEVBQXFCQSxNQUFNLEdBQUcsQ0FBOUIsRUFBaUNBLE1BQU0sRUFBdkMsRUFBMkM7QUFDdkMsV0FBS0QsU0FBTCxDQUFlQyxNQUFmLElBQTBCLEtBQUs5RSxZQUFMLENBQWtCeUIsY0FBbEIsQ0FBaUMsYUFBYXFELE1BQTlDLENBQTFCO0FBQ0EsV0FBS0QsU0FBTCxDQUFlQyxNQUFmLEVBQXVCQyxRQUF2QixHQUFrQ0QsTUFBbEM7QUFDQSxVQUFJRSxPQUFPLEdBQUcsS0FBS0gsU0FBTCxDQUFlQyxNQUFmLEVBQXVCcEQsWUFBdkIsQ0FBb0NuRCxFQUFFLENBQUNrRixNQUF2QyxDQUFkO0FBQ0EsV0FBS29CLFNBQUwsQ0FBZUMsTUFBZixFQUF1QmhELEVBQXZCLENBQTBCdkQsRUFBRSxDQUFDMEcsSUFBSCxDQUFRQyxTQUFSLENBQWtCQyxTQUE1QyxFQUF1RCxLQUFLQyxZQUE1RCxFQUEwRSxJQUExRTtBQUNIOztBQUVELFNBQUtyRixZQUFMLENBQWtCK0IsRUFBbEIsQ0FBcUJ2RCxFQUFFLENBQUMwRyxJQUFILENBQVFDLFNBQVIsQ0FBa0JDLFNBQXZDLEVBQWtELEtBQUtFLGVBQXZELEVBQXdFLElBQXhFO0FBQ0EsU0FBSy9FLFlBQUwsQ0FBa0J3QixFQUFsQixDQUFxQnZELEVBQUUsQ0FBQzBHLElBQUgsQ0FBUUMsU0FBUixDQUFrQkMsU0FBdkMsRUFBa0QsS0FBS0csZUFBdkQsRUFBd0UsSUFBeEU7QUFDQSxTQUFLL0UsY0FBTCxDQUFvQnVCLEVBQXBCLENBQXVCdkQsRUFBRSxDQUFDMEcsSUFBSCxDQUFRQyxTQUFSLENBQWtCQyxTQUF6QyxFQUFvRCxLQUFLSSxpQkFBekQsRUFBNEUsSUFBNUU7QUFDQSxTQUFLL0UsY0FBTCxDQUFvQnNCLEVBQXBCLENBQXVCdkQsRUFBRSxDQUFDMEcsSUFBSCxDQUFRQyxTQUFSLENBQWtCQyxTQUF6QyxFQUFvRCxLQUFLSyxpQkFBekQsRUFBNEUsSUFBNUU7QUFDQSxTQUFLL0UsVUFBTCxDQUFnQnFCLEVBQWhCLENBQW1CdkQsRUFBRSxDQUFDMEcsSUFBSCxDQUFRQyxTQUFSLENBQWtCQyxTQUFyQyxFQUFnRCxLQUFLTSxhQUFyRCxFQUFvRSxJQUFwRTtBQUNBLFNBQUsvRSxXQUFMLENBQWlCb0IsRUFBakIsQ0FBb0J2RCxFQUFFLENBQUMwRyxJQUFILENBQVFDLFNBQVIsQ0FBa0JDLFNBQXRDLEVBQWlELEtBQUtPLGNBQXRELEVBQXNFLElBQXRFLEVBM0ZtQixDQTZGbkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBS0MsWUFBTDtBQUNILEdBeEgwQjtBQTJIM0I7QUFDQUMsRUFBQUEsYUFBYSxFQUFDLHlCQUFVO0FBQ3BCO0FBQ0EsU0FBS0MsY0FBTCxDQUFvQjdILFNBQVMsQ0FBQzhILGNBQTlCLEVBQThDLFVBQVNDLFNBQVQsRUFBb0I7QUFDOUQsV0FBS3RHLFlBQUwsR0FBb0IsRUFBcEI7QUFDQSxXQUFLdUcsVUFBTDtBQUNBLFdBQUtwRixjQUFMLENBQW9CcUIsTUFBcEIsR0FBNkJZLEtBQUssQ0FBQ0MsS0FBTixDQUFZLFdBQVMsSUFBVCxHQUFnQixLQUFLcEQsZ0JBQWpDLENBQTdCO0FBQ0EsV0FBS0MsYUFBTCxHQUFxQixLQUFyQjtBQUNILEtBTDZDLENBSzVDcUUsSUFMNEMsQ0FLdkMsSUFMdUMsQ0FBOUM7QUFNQSxTQUFLNkIsY0FBTCxDQUFvQnhILGFBQWEsQ0FBQzRILFNBQWxDLEVBQTZDLFVBQVNDLFFBQVQsRUFBa0JDLFFBQWxCLEVBQTJCO0FBQ3BFLFVBQUdELFFBQVEsSUFBSTlILGFBQWEsQ0FBQ2dJLFFBQWQsQ0FBdUJDLFFBQXRDLEVBQStDO0FBQzNDO0FBQ0g7O0FBQ0QsVUFBRyxDQUFDRixRQUFELElBQVl0RCxLQUFLLENBQUN5RCxJQUFOLENBQVdILFFBQVgsS0FBd0IsSUFBcEMsSUFBNEMsS0FBS0ksWUFBTCxJQUFxQnhJLFNBQVMsQ0FBQ3lJLGFBQVYsQ0FBd0JDLGNBQTVGLEVBQTJHO0FBQzNHLFVBQUlDLFdBQVcsR0FBRyxLQUFsQjs7QUFDQSxXQUFJLElBQUkxRCxDQUFSLElBQWFtRCxRQUFiLEVBQXNCO0FBQ2xCLFlBQUlRLENBQUMsR0FBR1IsUUFBUSxDQUFDbkQsQ0FBRCxDQUFoQjs7QUFDQSxZQUFHMkQsQ0FBQyxDQUFDQyxNQUFGLElBQVlELENBQUMsQ0FBQ0MsTUFBRixDQUFTQyxRQUFULElBQXFCekksYUFBYSxDQUFDMEksYUFBZCxDQUE0QkMsSUFBaEUsRUFBcUU7QUFDakVMLFVBQUFBLFdBQVcsR0FBRyxJQUFkO0FBQ0E7QUFDSDtBQUNKOztBQUNELFVBQUdBLFdBQUgsRUFBZTtBQUNYLGFBQUtNLFlBQUw7QUFDSDtBQUNKLEtBaEI0QyxDQWdCM0NoRCxJQWhCMkMsQ0FnQnRDLElBaEJzQyxDQUE3QztBQWlCQSxTQUFLNkIsY0FBTCxDQUFvQnhILGFBQWEsQ0FBQzRJLFlBQWxDLEVBQWdELFVBQVNmLFFBQVQsRUFBa0JnQixRQUFsQixFQUEyQjtBQUN2RSxXQUFLdkgsYUFBTCxHQUFxQixLQUFyQjs7QUFDQSxVQUFHdUcsUUFBUSxJQUFJOUgsYUFBYSxDQUFDZ0ksUUFBZCxDQUF1QkMsUUFBdEMsRUFBK0M7QUFDM0M7QUFDSDs7QUFDRCxVQUFHLENBQUNhLFFBQUQsSUFBWXJFLEtBQUssQ0FBQ3lELElBQU4sQ0FBV1ksUUFBWCxLQUF3QixJQUFwQyxJQUE0QyxLQUFLWCxZQUFMLElBQXFCeEksU0FBUyxDQUFDeUksYUFBVixDQUF3QkMsY0FBNUYsRUFBMkc7QUFDM0csVUFBSUMsV0FBVyxHQUFHLEtBQWxCOztBQUNBLFdBQUksSUFBSTFELENBQVIsSUFBYWtFLFFBQWIsRUFBc0I7QUFDbEIsWUFBSVAsQ0FBQyxHQUFHTyxRQUFRLENBQUNsRSxDQUFELENBQWhCOztBQUNBLFlBQUc1RSxhQUFhLENBQUMwSSxhQUFkLENBQTRCQyxJQUE1QixJQUFvQ0osQ0FBQyxDQUFDQyxNQUFGLENBQVNDLFFBQWhELEVBQXlEO0FBQ3JESCxVQUFBQSxXQUFXLEdBQUcsSUFBZDtBQUNBO0FBQ0g7QUFDSjs7QUFDRCxVQUFHQSxXQUFILEVBQWU7QUFDWCxhQUFLTSxZQUFMO0FBQ0g7QUFDSixLQWpCK0MsQ0FpQjlDaEQsSUFqQjhDLENBaUJ6QyxJQWpCeUMsQ0FBaEQ7QUFrQkEsU0FBSzZCLGNBQUwsQ0FBb0J4SCxhQUFhLENBQUM4SSxnQkFBbEMsRUFBbUQsVUFBU2pCLFFBQVQsRUFBa0JrQixXQUFsQixFQUE4QjtBQUM3RSxXQUFLekgsYUFBTCxHQUFxQixLQUFyQjs7QUFDQSxVQUFHdUcsUUFBUSxJQUFJOUgsYUFBYSxDQUFDZ0ksUUFBZCxDQUF1QkMsUUFBdEMsRUFBK0M7QUFDM0M7QUFDSDs7QUFDRCxVQUFHLENBQUNlLFdBQUQsSUFBZ0J2RSxLQUFLLENBQUN5RCxJQUFOLENBQVdjLFdBQVgsS0FBMkIsSUFBM0MsSUFBbUQsS0FBS2IsWUFBTCxJQUFxQnhJLFNBQVMsQ0FBQ3lJLGFBQVYsQ0FBd0JDLGNBQW5HLEVBQWtIO0FBQ2xILFVBQUlDLFdBQVcsR0FBRyxLQUFsQjs7QUFDQSxXQUFJLElBQUkxRCxDQUFSLElBQWFvRSxXQUFiLEVBQXlCO0FBQ3JCLFlBQUlULENBQUMsR0FBR1MsV0FBVyxDQUFDcEUsQ0FBRCxDQUFuQjs7QUFDQSxZQUFHMkQsQ0FBQyxDQUFDQyxNQUFGLElBQVl4SSxhQUFhLENBQUMwSSxhQUFkLENBQTRCQyxJQUE1QixJQUFvQ0osQ0FBQyxDQUFDQyxNQUFGLENBQVNDLFFBQTVELEVBQXFFO0FBQ2pFSCxVQUFBQSxXQUFXLEdBQUcsSUFBZDtBQUNBO0FBQ0g7QUFDSjs7QUFDRCxVQUFHQSxXQUFILEVBQWU7QUFDWCxhQUFLTSxZQUFMO0FBQ0g7QUFDSixLQWpCa0QsQ0FpQmpEaEQsSUFqQmlELENBaUI1QyxJQWpCNEMsQ0FBbkQ7QUFrQkgsR0F6TDBCO0FBMkwzQjtBQUNBcUQsRUFBQUEsV0FBVyxFQUFDLHFCQUFTbEUsS0FBVCxFQUFnQjtBQUN4QixTQUFLb0QsWUFBTCxHQUFxQnBELEtBQUssSUFBSXBGLFNBQVMsQ0FBQ3lJLGFBQVYsQ0FBd0JjLGNBQXREO0FBQ0EsU0FBS3ZFLFFBQUwsQ0FBYyxLQUFLd0QsWUFBbkIsRUFBaUNuRCxNQUFqQyxDQUF3Q21FLEtBQXhDOztBQUNBLFFBQUcsS0FBS2hCLFlBQUwsSUFBcUJ4SSxTQUFTLENBQUN5SSxhQUFWLENBQXdCYyxjQUFoRCxFQUErRDtBQUMzRCxXQUFLL0QsaUJBQUwsQ0FBdUIsS0FBS2dELFlBQTVCO0FBQ0gsS0FMdUIsQ0FNeEI7O0FBQ0gsR0FuTTBCO0FBcU0zQjtBQUNBaUIsRUFBQUEsYUFBYSxFQUFDLHlCQUFXO0FBQ3JCLFFBQUksS0FBS0MsZUFBVCxFQUNJLEtBQUtBLGVBQUwsQ0FBcUJDLFFBQXJCO0FBQ0osU0FBS3ZJLElBQUwsQ0FBVXdJLG1CQUFWLENBQThCLEtBQTlCO0FBQ0gsR0ExTTBCO0FBNE0zQkMsRUFBQUEsYUFBYSxFQUFFLHlCQUFXO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLFNBQUs1QixVQUFMO0FBQ0gsR0FyTjBCO0FBdU4zQlosRUFBQUEsWUFBWSxFQUFFLHNCQUFTeUMsS0FBVCxFQUFnQjtBQUMxQixRQUFJckksUUFBUSxHQUFHcUksS0FBSyxDQUFDQyxNQUFOLENBQWEvQyxRQUE1QjtBQUNBLFFBQUl2RixRQUFRLEtBQUssS0FBS0EsUUFBdEIsRUFBZ0M7QUFDaEMsU0FBS0EsUUFBTCxHQUFnQkEsUUFBaEI7QUFDQSxTQUFLUyxhQUFMLENBQW1COEgsTUFBbkIsR0FBNEIsS0FBS2xELFNBQUwsQ0FBZXJGLFFBQWYsQ0FBNUI7O0FBQ0EsUUFBRyxLQUFLK0csWUFBTCxJQUFxQnhJLFNBQVMsQ0FBQ3lJLGFBQVYsQ0FBd0JjLGNBQWhELEVBQStEO0FBQzNELFdBQUt0QixVQUFMO0FBQ0gsS0FGRCxNQUVNLElBQUcsS0FBS08sWUFBTCxJQUFxQnhJLFNBQVMsQ0FBQ3lJLGFBQVYsQ0FBd0JDLGNBQWhELEVBQStEO0FBQ2pFLFdBQUtPLFlBQUw7QUFDSDtBQUVKLEdBbE8wQjtBQW9PM0IzQixFQUFBQSxlQUFlLEVBQUUseUJBQVN3QyxLQUFULEVBQWdCO0FBQzdCaEYsSUFBQUEsS0FBSyxDQUFDUyxlQUFOLENBQXNCLENBQXRCO0FBQ0EsU0FBS25FLElBQUwsQ0FBVXdJLG1CQUFWLENBQThCLEtBQTlCO0FBQ0gsR0F2TzBCO0FBeU8zQmhDLEVBQUFBLFlBQVksRUFBRSx3QkFBVztBQUNyQixRQUFJcUMsZ0JBQWdCLEdBQUdsSyxPQUFPLENBQUMsbUJBQUQsQ0FBOUI7O0FBQ0EsUUFBSW1LLGdCQUFnQixHQUFHMUosRUFBRSxDQUFDMkosSUFBSCxDQUFRLEtBQUtoSSxZQUFMLENBQWtCaUksS0FBMUIsRUFBaUMsS0FBS2pJLFlBQUwsQ0FBa0JrSSxNQUFuRCxDQUF2QjtBQUNBLFFBQUlDLE9BQU8sR0FBRztBQUNWQyxNQUFBQSxVQUFVLEVBQUUsc0JBREY7QUFDK0I7QUFDekNDLE1BQUFBLE9BQU8sRUFBRSxDQUZDO0FBRXFCO0FBQy9CQyxNQUFBQSxPQUFPLEVBQUUsQ0FIQztBQUdxQjtBQUMvQkMsTUFBQUEsT0FBTyxFQUFFLENBSkM7QUFJcUI7QUFDL0JDLE1BQUFBLE9BQU8sRUFBRSxDQUxDO0FBS29CO0FBQzlCQyxNQUFBQSxVQUFVLEVBQUUsR0FORjtBQU1xQjtBQUMvQkMsTUFBQUEsV0FBVyxFQUFFLEdBUEg7QUFPcUI7QUFDL0JDLE1BQUFBLEdBQUcsRUFBRSxDQVJLO0FBUXFCO0FBQy9CQyxNQUFBQSxRQUFRLEVBQUUsQ0FUQTtBQVVWQyxNQUFBQSxZQUFZLEVBQUU7QUFWSixLQUFkO0FBWUEsU0FBS3RCLGVBQUwsR0FBdUIsSUFBSU8sZ0JBQUosRUFBdkI7QUFDQSxTQUFLUCxlQUFMLENBQXFCdUIsWUFBckIsQ0FBa0MsS0FBSzlJLFlBQXZDLEVBQXFEM0IsRUFBRSxDQUFDMEssRUFBSCxDQUFNLENBQU4sRUFBUyxDQUFULENBQXJELEVBQWtFQyxhQUFhLENBQUNDLFFBQWhGLEVBQTBGQyxrQkFBa0IsQ0FBQ0MsR0FBN0csRUFBa0hwQixnQkFBbEgsRUFBb0lJLE9BQXBJLEVBQTZJOUosRUFBRSxDQUFDMEssRUFBSCxDQUFNLEdBQU4sRUFBVSxHQUFWLENBQTdJO0FBQ0gsR0ExUDBCO0FBNFAzQmpELEVBQUFBLFVBQVUsRUFBRSxzQkFBVztBQUNuQixTQUFLc0QsYUFBTCxHQUFxQnpHLEtBQUssQ0FBQzBHLFFBQU4sQ0FBZSxLQUFLbEssS0FBTCxDQUFXbUsscUJBQVgsQ0FBaUMsS0FBS2hLLFFBQXRDLENBQWYsQ0FBckI7QUFDQSxTQUFLbUIsYUFBTCxDQUFtQnNCLE1BQW5CLEdBQTRCWSxLQUFLLENBQUNDLEtBQU4sQ0FBWSxXQUFTLEtBQUt3RyxhQUFMLENBQW1CcEgsTUFBeEMsQ0FBNUI7O0FBRUEsUUFBSSxLQUFLb0gsYUFBTCxDQUFtQnBILE1BQW5CLEdBQTRCLENBQWhDLEVBQW1DO0FBQy9CLFdBQUsvQixpQkFBTCxDQUF1QnNKLE1BQXZCLEdBQWdDLEtBQWhDO0FBQ0gsS0FGRCxNQUVPO0FBQ0gsV0FBS3RKLGlCQUFMLENBQXVCc0osTUFBdkIsR0FBZ0MsSUFBaEM7QUFDQSxXQUFLckosT0FBTCxDQUFhNkIsTUFBYixHQUFzQixTQUF0QjtBQUNILEtBVGtCLENBV25COzs7QUFDQSxTQUFLLElBQUl5SCxNQUFNLEdBQUcsQ0FBbEIsRUFBb0JBLE1BQU0sR0FBQyxLQUFLSixhQUFMLENBQW1CcEgsTUFBOUMsRUFBcUQsRUFBRXdILE1BQXZELEVBQStEO0FBQzNELFdBQUssSUFBSUMsWUFBWSxHQUFHLENBQXhCLEVBQTBCQSxZQUFZLEdBQUcsS0FBS2xLLFlBQUwsQ0FBa0J5QyxNQUEzRCxFQUFrRSxFQUFFeUgsWUFBcEUsRUFBa0Y7QUFDOUUsWUFBSSxLQUFLbEssWUFBTCxDQUFrQmtLLFlBQWxCLEVBQWdDQyxVQUFoQyxLQUErQyxLQUFLTixhQUFMLENBQW1CSSxNQUFuQixFQUEyQkUsVUFBOUUsRUFBMEY7QUFDdEYsZUFBS04sYUFBTCxDQUFtQkksTUFBbkIsRUFBMkJHLFlBQTNCLEdBQTBDLElBQTFDO0FBQ0E7QUFDSDtBQUNKO0FBQ0o7O0FBQ0QsU0FBS3BDLGVBQUwsQ0FBcUJxQyxjQUFyQixDQUFvQyxZQUFVO0FBQzFDLFVBQUlDLElBQUksR0FBRyxLQUFLdEMsZUFBTCxDQUFxQnVDLFdBQXJCLEVBQVg7O0FBQ0EsV0FBSSxJQUFJaEgsQ0FBQyxHQUFDLENBQVYsRUFBWUEsQ0FBQyxHQUFDK0csSUFBSSxDQUFDN0gsTUFBbkIsRUFBMEIsRUFBRWMsQ0FBNUIsRUFBOEI7QUFDMUIsWUFBSTJELENBQUMsR0FBR29ELElBQUksQ0FBQy9HLENBQUQsQ0FBWjtBQUNBMkQsUUFBQUEsQ0FBQyxDQUFDc0QsWUFBRixDQUFlLEtBQWY7QUFDSDtBQUNKLEtBTm1DLENBTWxDakcsSUFOa0MsQ0FNN0IsSUFONkIsQ0FBcEM7QUFPQSxTQUFLeUQsZUFBTCxDQUFxQmlCLE9BQXJCLEdBQStCLENBQS9CO0FBQ0EsU0FBS2pCLGVBQUwsQ0FBcUJ5QyxPQUFyQixDQUE2QixLQUFLWixhQUFsQyxFQUFpRCxLQUFLYSxvQkFBTCxDQUEwQm5HLElBQTFCLENBQStCLElBQS9CLENBQWpELEVBQXVGO0FBQUNOLE1BQUFBLEtBQUssRUFBQyxHQUFQO0FBQVkwRyxNQUFBQSxTQUFTLEVBQUUsSUFBdkI7QUFBNkJDLE1BQUFBLFNBQVMsRUFBRXRNLFNBQVMsQ0FBQ3VNLGtCQUFWLENBQTZCQztBQUFyRSxLQUF2RjtBQUNBLFNBQUszSixjQUFMLENBQW9CcUIsTUFBcEIsR0FBNkJZLEtBQUssQ0FBQ0MsS0FBTixDQUFZLFdBQVMsSUFBVCxHQUFnQixLQUFLcEQsZ0JBQWpDLENBQTdCO0FBQ0gsR0ExUjBCO0FBNFIzQnlLLEVBQUFBLG9CQUFvQixFQUFFLDhCQUFTSyxTQUFULEVBQW9CO0FBQ3RDLFFBQUcsS0FBSzdLLGFBQVIsRUFBc0I7QUFDdEIsUUFBSThLLE9BQU8sR0FBSUQsU0FBUyxDQUFDRSxJQUF6QixDQUZzQyxDQUd0QztBQUNBO0FBQ0E7QUFDQTs7QUFDSSxRQUFJQyxNQUFNLEdBQUdGLE9BQU8sQ0FBQ0csaUJBQVIsQ0FBMEIsSUFBMUIsQ0FBYjtBQUNBLFFBQUlELE1BQUosRUFBWSxPQVJzQixDQVN0Qzs7QUFFQSxTQUFLRSxVQUFMLENBQWdCTCxTQUFTLENBQUNFLElBQTFCO0FBQ0gsR0F4UzBCO0FBMFMzQkcsRUFBQUEsVUFBVSxFQUFFLG9CQUFTSixPQUFULEVBQWtCO0FBQzFCLFFBQUksQ0FBQ0EsT0FBTCxFQUFjO0FBRWQsUUFBSWxFLFlBQVksR0FBRyxDQUFDLENBQXBCOztBQUNBLFNBQUssSUFBSW1ELE1BQVQsSUFBbUIsS0FBS2pLLFlBQXhCLEVBQXNDO0FBQ2xDLFVBQUksS0FBS0EsWUFBTCxDQUFrQmlLLE1BQWxCLEVBQTBCRSxVQUExQixJQUF3Q2EsT0FBTyxDQUFDYixVQUFwRCxFQUErRDtBQUMzRHJELFFBQUFBLFlBQVksR0FBR21ELE1BQWY7QUFDQTtBQUNIO0FBQ0o7O0FBRUQsUUFBSW5ELFlBQVksR0FBRyxDQUFDLENBQXBCLEVBQXVCO0FBQ25CLFVBQUl1RSxVQUFVLEdBQUcsS0FBS0MsWUFBTCxDQUFrQk4sT0FBTyxDQUFDYixVQUExQixDQUFqQjs7QUFDQSxVQUFJLEtBQUtOLGFBQUwsQ0FBbUJ3QixVQUFuQixDQUFKLEVBQW9DO0FBQ2hDLGFBQUt4QixhQUFMLENBQW1Cd0IsVUFBbkIsRUFBK0JqQixZQUEvQixHQUE4QyxLQUE5QztBQUNBLGFBQUtwQyxlQUFMLENBQXFCdUQsY0FBckIsQ0FBb0NGLFVBQXBDLEVBQWdELEtBQUt4QixhQUFMLENBQW1Cd0IsVUFBbkIsQ0FBaEQ7QUFDSDs7QUFDRCxXQUFLckwsWUFBTCxDQUFrQndMLE1BQWxCLENBQXlCMUUsWUFBekIsRUFBdUMsQ0FBdkM7QUFDSCxLQVBELE1BT087QUFDSCxVQUFJLEtBQUs5RyxZQUFMLENBQWtCeUMsTUFBbEIsR0FBMkIsS0FBS3hDLGdCQUFwQyxFQUFzRDtBQUNsRCxhQUFLRCxZQUFMLENBQWtCeUwsSUFBbEIsQ0FBdUJULE9BQXZCO0FBQ0EsWUFBSUssVUFBVSxHQUFHLEtBQUtDLFlBQUwsQ0FBa0JOLE9BQU8sQ0FBQ2IsVUFBMUIsQ0FBakI7O0FBQ0EsWUFBSSxLQUFLTixhQUFMLENBQW1Cd0IsVUFBbkIsQ0FBSixFQUFvQztBQUNoQyxlQUFLeEIsYUFBTCxDQUFtQndCLFVBQW5CLEVBQStCakIsWUFBL0IsR0FBOEMsSUFBOUM7QUFDQSxlQUFLcEMsZUFBTCxDQUFxQnVELGNBQXJCLENBQW9DRixVQUFwQyxFQUFnRCxLQUFLeEIsYUFBTCxDQUFtQndCLFVBQW5CLENBQWhEO0FBQ0g7QUFDSixPQVBELE1BT087QUFDSEssUUFBQUEsT0FBTyxDQUFDdEksS0FBSyxDQUFDQyxLQUFOLENBQVksWUFBVSxLQUFLcEQsZ0JBQWYsR0FBZ0MsS0FBNUMsQ0FBRCxDQUFQO0FBQ0g7QUFDSjs7QUFFRCxTQUFLa0IsY0FBTCxDQUFvQnFCLE1BQXBCLEdBQTZCWSxLQUFLLENBQUNDLEtBQU4sQ0FBWSxXQUFTLEtBQUtyRCxZQUFMLENBQWtCeUMsTUFBM0IsR0FBb0MsR0FBcEMsR0FBMEMsS0FBS3hDLGdCQUEzRCxDQUE3QjtBQUNILEdBMVUwQjtBQTRVM0JxTCxFQUFBQSxZQUFZLEVBQUUsc0JBQVNuQixVQUFULEVBQXFCO0FBQy9CLFNBQUssSUFBSXdCLE1BQVQsSUFBbUIsS0FBSzlCLGFBQXhCLEVBQXVDO0FBQ25DLFVBQUksS0FBS0EsYUFBTCxDQUFtQjhCLE1BQW5CLEVBQTJCeEIsVUFBM0IsS0FBMENBLFVBQTlDLEVBQ0ksT0FBT3dCLE1BQVA7QUFDUDs7QUFDRCxXQUFPLENBQUMsQ0FBUjtBQUNILEdBbFYwQjtBQW9WM0I5RixFQUFBQSxlQUFlLEVBQUUsMkJBQVc7QUFDeEJ6QyxJQUFBQSxLQUFLLENBQUNTLGVBQU4sQ0FBc0IsQ0FBdEI7O0FBQ0EsUUFBRyxLQUFLN0QsWUFBTCxDQUFrQnlDLE1BQWxCLElBQTRCLEtBQUt4QyxnQkFBcEMsRUFBcUQ7QUFDakR5TCxNQUFBQSxPQUFPLENBQUN0SSxLQUFLLENBQUNDLEtBQU4sQ0FBWSxZQUFVLEtBQUtwRCxnQkFBZixHQUFnQyxLQUE1QyxDQUFELENBQVA7QUFDQTtBQUNIOztBQUNELFFBQUk2RyxZQUFZLEdBQUcsQ0FBbkI7QUFDQSxRQUFJOEUsVUFBVSxHQUFHLEVBQWpCOztBQUNBLFdBQU0sS0FBSzVMLFlBQUwsQ0FBa0J5QyxNQUFsQixHQUEyQixLQUFLeEMsZ0JBQXRDLEVBQXdEO0FBQ3BELFVBQUk2RyxZQUFZLElBQUksS0FBSytDLGFBQUwsQ0FBbUJwSCxNQUF2QyxFQUNJO0FBQ0osVUFBSXVJLE9BQU8sR0FBRyxLQUFLYSxTQUFMLENBQWUvRSxZQUFmLENBQWQ7O0FBRUEsVUFBSWtFLE9BQUosRUFBYTtBQUNULGFBQUtoTCxZQUFMLENBQWtCeUwsSUFBbEIsQ0FBdUJULE9BQXZCO0FBQ0FZLFFBQUFBLFVBQVUsQ0FBQ0gsSUFBWCxDQUFnQlQsT0FBaEI7QUFDSDs7QUFFRGxFLE1BQUFBLFlBQVk7QUFDZjs7QUFFRCxTQUFLLElBQUltRCxNQUFULElBQW1CMkIsVUFBbkIsRUFBK0I7QUFDM0IsVUFBSUUsVUFBVSxHQUFHLEtBQUtSLFlBQUwsQ0FBa0JNLFVBQVUsQ0FBQzNCLE1BQUQsQ0FBVixDQUFtQkUsVUFBckMsQ0FBakI7O0FBQ0EsVUFBSSxLQUFLTixhQUFMLENBQW1CaUMsVUFBbkIsQ0FBSixFQUFvQztBQUNoQyxhQUFLakMsYUFBTCxDQUFtQmlDLFVBQW5CLEVBQStCMUIsWUFBL0IsR0FBOEMsSUFBOUM7QUFDQSxhQUFLcEMsZUFBTCxDQUFxQnVELGNBQXJCLENBQW9DTyxVQUFwQyxFQUFnRCxLQUFLakMsYUFBTCxDQUFtQmlDLFVBQW5CLENBQWhEO0FBQ0g7QUFDSjs7QUFDRCxTQUFLM0ssY0FBTCxDQUFvQnFCLE1BQXBCLEdBQTZCWSxLQUFLLENBQUNDLEtBQU4sQ0FBWSxXQUFVLEtBQUtyRCxZQUFMLENBQWtCeUMsTUFBNUIsR0FBcUMsR0FBckMsR0FBMkMsS0FBS3hDLGdCQUE1RCxDQUE3Qjs7QUFFQSxRQUFJLEtBQUtELFlBQUwsQ0FBa0J5QyxNQUFsQixJQUE0QixDQUFoQyxFQUFtQztBQUMvQmlKLE1BQUFBLE9BQU8sQ0FBQ3RJLEtBQUssQ0FBQ0MsS0FBTixDQUFZLFVBQVosQ0FBRCxDQUFQO0FBQ0g7QUFDSixHQXJYMEI7QUF1WDNCd0ksRUFBQUEsU0FBUyxFQUFFLG1CQUFTbkksS0FBVCxFQUFnQjtBQUN2QixRQUFJLEtBQUttRyxhQUFMLENBQW1CbkcsS0FBbkIsQ0FBSixFQUErQjtBQUMzQixVQUFJcUksV0FBVyxHQUFHLEtBQWxCOztBQUNBLFdBQUssSUFBSUMsTUFBVCxJQUFtQixLQUFLaE0sWUFBeEIsRUFBc0M7QUFDbEMsWUFBSSxLQUFLNkosYUFBTCxDQUFtQm5HLEtBQW5CLEVBQTBCeUcsVUFBMUIsS0FBeUMsS0FBS25LLFlBQUwsQ0FBa0JnTSxNQUFsQixFQUEwQjdCLFVBQXZFLEVBQW1GO0FBQy9FNEIsVUFBQUEsV0FBVyxHQUFHLElBQWQ7QUFDQTtBQUNIO0FBQ0o7O0FBQ0QsVUFBSSxDQUFDQSxXQUFELElBQWdCLEtBQUtsQyxhQUFMLENBQW1CbkcsS0FBbkIsRUFBMEJ1SSxJQUExQixHQUFpQyxDQUFqRCxJQUFzRCxLQUFLcEMsYUFBTCxDQUFtQm5HLEtBQW5CLEVBQTBCd0ksVUFBMUIsSUFBd0MsQ0FBbEcsRUFDSSxPQUFPLEtBQUtyQyxhQUFMLENBQW1CbkcsS0FBbkIsQ0FBUDtBQUNQOztBQUNELFdBQU8sSUFBUDtBQUNILEdBcFkwQjtBQXNZM0JvQyxFQUFBQSxpQkFBaUIsRUFBRSwyQkFBU3NDLEtBQVQsRUFBZ0I7QUFDL0JoRixJQUFBQSxLQUFLLENBQUNTLGVBQU4sQ0FBc0IsQ0FBdEI7QUFDQSxRQUFHLEtBQUszRCxhQUFSLEVBQXNCOztBQUN0QixRQUFJLEtBQUtGLFlBQUwsQ0FBa0J5QyxNQUFsQixHQUEyQixDQUEvQixFQUFrQztBQUM5QixXQUFLMEosY0FBTCxHQUFzQixFQUF0QjtBQUNBLFVBQUlDLFdBQVcsR0FBRyxLQUFsQjs7QUFDQSxXQUFLLElBQUluQyxNQUFNLEdBQUcsQ0FBbEIsRUFBcUJBLE1BQU0sR0FBRyxLQUFLakssWUFBTCxDQUFrQnlDLE1BQWhELEVBQXlELEVBQUV3SCxNQUEzRCxFQUFtRTtBQUMvRCxZQUFJb0MsWUFBWSxHQUFHLEVBQW5CO0FBQ0EsWUFBSW5GLENBQUMsR0FBRyxLQUFLbEgsWUFBTCxDQUFrQmlLLE1BQWxCLENBQVI7QUFDQW9DLFFBQUFBLFlBQVksQ0FBQ2xDLFVBQWIsR0FBMEJqRCxDQUFDLENBQUNpRCxVQUE1Qjs7QUFDQSxZQUFHakQsQ0FBQyxDQUFDK0UsSUFBRixJQUFVLENBQWIsRUFBZTtBQUNYRyxVQUFBQSxXQUFXLEdBQUcsSUFBZDtBQUNIOztBQUNELGFBQUtELGNBQUwsQ0FBb0JWLElBQXBCLENBQXlCWSxZQUF6QjtBQUNIOztBQUVELFVBQUksS0FBS0YsY0FBTCxDQUFvQjFKLE1BQXBCLEdBQTZCLENBQWpDLEVBQW9DO0FBQ2hDLGFBQUsvQyxJQUFMLENBQVU0TSx1QkFBVixDQUFrQyxJQUFsQyxFQUF3QyxLQUFLSCxjQUE3QyxFQUE0REMsV0FBNUQsRUFBd0UsS0FBS0csaUJBQUwsQ0FBdUJoSSxJQUF2QixDQUE0QixJQUE1QixDQUF4RSxFQUEwR2pHLFNBQVMsQ0FBQ2tPLFNBQVYsQ0FBb0IxQixVQUE5SDtBQUNIO0FBQ0osS0FoQkQsTUFnQk87QUFDSFksTUFBQUEsT0FBTyxDQUFDdEksS0FBSyxDQUFDQyxLQUFOLENBQVksUUFBWixDQUFELENBQVA7QUFDSDtBQUNKLEdBNVowQjtBQThaM0JrSixFQUFBQSxpQkFBaUIsRUFBRSw2QkFBVztBQUMxQjtBQUNBLFFBQUcsS0FBS3JNLGFBQVIsRUFBc0I7QUFDdEIsU0FBS3NFLFlBQUwsQ0FBa0JTLFlBQWxCLENBQStCLENBQS9CLEVBQWtDQyxZQUFZLENBQUN1SCxRQUEvQyxFQUF5RCxLQUF6RDtBQUNBLFNBQUtDLFVBQUw7QUFDQSxTQUFLeE0sYUFBTCxHQUFxQixJQUFyQjtBQUNBa0QsSUFBQUEsS0FBSyxDQUFDdUosUUFBTixDQUFlLEtBQUt2TSxhQUFwQixFQUFrQyxHQUFsQyxFQUFzQyxZQUFVO0FBQzVDLFdBQUtWLElBQUwsQ0FBVWtOLFdBQVYsQ0FBc0IsS0FBS1QsY0FBM0I7QUFDSCxLQUZxQyxDQUVwQzVILElBRm9DLENBRS9CLElBRitCLENBQXRDO0FBSUgsR0F4YTBCO0FBMGEzQkssRUFBQUEsYUFBYSxFQUFFLHVCQUFTaUksVUFBVCxFQUFxQjtBQUNoQyxRQUFJQSxVQUFVLElBQUlBLFVBQVUsQ0FBQ0MsU0FBN0IsRUFBd0M7QUFDcEMsVUFBSUQsVUFBVSxDQUFDQyxTQUFYLENBQXFCQyxJQUFyQixJQUE2QjdILFlBQVksQ0FBQ3VILFFBQTlDLEVBQXdEO0FBQ3BELGFBQUtqSSxZQUFMLENBQWtCUyxZQUFsQixDQUErQixDQUEvQixFQUFrQ0MsWUFBWSxDQUFDQyxRQUEvQyxFQUF5RCxJQUF6RDtBQUNIO0FBQ0o7QUFDSixHQWhiMEI7QUFrYjNCNkgsRUFBQUEsWUFBWSxFQUFFLHdCQUFXO0FBQ3JCLFNBQUt0TixJQUFMLENBQVVrTixXQUFWLENBQXNCLEtBQUtULGNBQTNCO0FBQ0gsR0FwYjBCO0FBc2IzQnBHLEVBQUFBLGlCQUFpQixFQUFFLDZCQUFXO0FBQzFCM0MsSUFBQUEsS0FBSyxDQUFDUyxlQUFOLENBQXNCLENBQXRCO0FBQ0FyRixJQUFBQSxjQUFjLENBQUN5TyxXQUFmLEdBQTZCQyxhQUE3QixDQUEyQyxJQUEzQyxFQUFpRHpPLFNBQVMsQ0FBQzBPLFFBQVYsQ0FBbUJDLFFBQXBFO0FBQ0gsR0F6YjBCO0FBMmIzQnBILEVBQUFBLGFBQWEsRUFBRSx1QkFBU29DLEtBQVQsRUFBZ0I7QUFDM0JoRixJQUFBQSxLQUFLLENBQUNTLGVBQU4sQ0FBc0IsQ0FBdEI7QUFDQSxRQUFJd0osT0FBTyxHQUFHQyxNQUFNLENBQUNqQixZQUFQLENBQW9Ca0Isa0JBQXBCLENBQXVDQyxVQUF2QyxDQUFrREMsSUFBaEU7O0FBQ0FwUCxJQUFBQSxPQUFPLENBQUMsaUJBQUQsQ0FBUCxDQUEyQjRPLFdBQTNCLEdBQXlDUyxjQUF6QyxDQUF3REwsT0FBeEQsRUFBaUVqRixLQUFLLENBQUN1RixLQUFOLENBQVlDLFdBQVosRUFBakU7QUFDSCxHQS9iMEI7QUFpYzNCM0gsRUFBQUEsY0FBYyxFQUFFLDBCQUFXO0FBQ3ZCN0MsSUFBQUEsS0FBSyxDQUFDUyxlQUFOLENBQXNCLENBQXRCOztBQUNBLFFBQUksS0FBSzdELFlBQUwsQ0FBa0J5QyxNQUFsQixHQUEyQixDQUEvQixFQUFrQztBQUM5QixVQUFJMEosY0FBYyxHQUFHLEVBQXJCOztBQUNBLFdBQUssSUFBSWxDLE1BQU0sR0FBQyxDQUFoQixFQUFrQkEsTUFBTSxHQUFHLEtBQUtqSyxZQUFMLENBQWtCeUMsTUFBN0MsRUFBb0QsRUFBRXdILE1BQXRELEVBQThEO0FBQzFELFlBQUlvQyxZQUFZLEdBQUcsRUFBbkI7QUFDQUEsUUFBQUEsWUFBWSxDQUFDbEMsVUFBYixHQUEwQixLQUFLbkssWUFBTCxDQUFrQmlLLE1BQWxCLEVBQTBCRSxVQUFwRDtBQUNBZ0MsUUFBQUEsY0FBYyxDQUFDVixJQUFmLENBQW9CWSxZQUFwQjtBQUNIOztBQUVELFVBQUlGLGNBQWMsQ0FBQzFKLE1BQWYsR0FBd0IsQ0FBNUIsRUFBK0I7QUFDM0IsYUFBSy9DLElBQUwsQ0FBVW1PLHdCQUFWLENBQW1DLElBQW5DLEVBQXlDMUIsY0FBekM7QUFDSDtBQUNKLEtBWEQsTUFXTztBQUNIVCxNQUFBQSxPQUFPLENBQUN0SSxLQUFLLENBQUNDLEtBQU4sQ0FBWSxRQUFaLENBQUQsQ0FBUDtBQUNIO0FBQ0osR0FqZDBCO0FBa2QzQlMsRUFBQUEsaUJBbGQyQiw2QkFrZFRKLEtBbGRTLEVBa2RIO0FBQ3BCLFNBQUtvRCxZQUFMLEdBQW9CcEQsS0FBcEI7QUFDQSxTQUFLM0QsUUFBTCxHQUFnQixDQUFoQjtBQUNBLFNBQUtTLGFBQUwsQ0FBbUI4SCxNQUFuQixHQUE0QixLQUFLbEQsU0FBTCxDQUFlLENBQWYsQ0FBNUI7QUFDQSxTQUFLMEksU0FBTCxHQUFpQixFQUFqQjtBQUNBLFNBQUs5TixZQUFMLEdBQW9CLEVBQXBCOztBQUNBLFFBQUcwRCxLQUFLLElBQUlwRixTQUFTLENBQUN5SSxhQUFWLENBQXdCYyxjQUFwQyxFQUFtRDtBQUMvQyxXQUFLeEcsUUFBTCxDQUFjMkksTUFBZCxHQUF1QixJQUF2QjtBQUNBLFdBQUsxSSxVQUFMLENBQWdCMEksTUFBaEIsR0FBeUIsS0FBekI7QUFDQSxXQUFLL0ksV0FBTCxDQUFpQitJLE1BQWpCLEdBQTBCLElBQTFCO0FBQ0EsV0FBS3pELFVBQUw7QUFDSCxLQUxELE1BS00sSUFBRzdDLEtBQUssSUFBSXBGLFNBQVMsQ0FBQ3lJLGFBQVYsQ0FBd0JDLGNBQXBDLEVBQW1EO0FBQ3JELFdBQUszRixRQUFMLENBQWMySSxNQUFkLEdBQXVCLEtBQXZCO0FBQ0EsV0FBSzFJLFVBQUwsQ0FBZ0IwSSxNQUFoQixHQUF5QixJQUF6QjtBQUNBLFdBQUs5SSxhQUFMLENBQW1Cc0IsTUFBbkIsR0FBNEJZLEtBQUssQ0FBQ0MsS0FBTixDQUFZLGdCQUFaLENBQTVCO0FBQ0EsV0FBS3BDLFdBQUwsQ0FBaUIrSSxNQUFqQixHQUEwQixLQUExQjtBQUNBLFdBQUt6SCxlQUFMLEdBQXVCLENBQUMsQ0FBeEI7QUFDQSxXQUFLZ0YsWUFBTDtBQUNBLFdBQUt3RyxXQUFMO0FBQ0g7QUFDSixHQXRlMEI7QUF1ZTNCQSxFQUFBQSxXQXZlMkIseUJBdWVkO0FBQ1QsU0FBS3hNLGdCQUFMLENBQXNCaUIsTUFBdEIsR0FBK0IsR0FBL0I7QUFDQSxTQUFLTSxhQUFMO0FBQ0gsR0ExZTBCO0FBMmUzQnlFLEVBQUFBLFlBM2UyQiwwQkEyZWI7QUFDVixRQUFJeUcsTUFBSjs7QUFDQSxRQUFHLEtBQUt6TCxlQUFMLElBQXdCLENBQUMsQ0FBNUIsRUFBOEI7QUFDMUI7QUFDQSxVQUFJbUIsS0FBSyxHQUFHLEtBQUtuQixlQUFqQjtBQUNBeUwsTUFBQUEsTUFBTSxHQUFHLEtBQUtGLFNBQUwsQ0FBZXBLLEtBQWYsRUFBc0J1SyxFQUEvQjtBQUNBLFdBQUsxTCxlQUFMLEdBQXVCLENBQUMsQ0FBeEI7QUFDSDs7QUFDRCxRQUFJMEksSUFBSSxHQUFHLEtBQUtpRCxpQkFBTCxDQUF1QixLQUFLbk8sUUFBNUIsQ0FBWDtBQUNBLFNBQUsrTixTQUFMLEdBQWlCMUssS0FBSyxDQUFDMEcsUUFBTixDQUFlbUIsSUFBZixDQUFqQjs7QUFDQSxRQUFHLEtBQUs2QyxTQUFMLENBQWVyTCxNQUFmLEdBQXdCLENBQTNCLEVBQTZCO0FBQ3pCLFdBQUsvQixpQkFBTCxDQUF1QnNKLE1BQXZCLEdBQWdDLEtBQWhDO0FBQ0gsS0FGRCxNQUVLO0FBQ0QsV0FBS3RKLGlCQUFMLENBQXVCc0osTUFBdkIsR0FBZ0MsSUFBaEM7QUFDQSxXQUFLckosT0FBTCxDQUFhNkIsTUFBYixHQUFzQixTQUF0QjtBQUNIOztBQUNELFFBQUd3TCxNQUFNLElBQUksSUFBYixFQUFrQjtBQUNkLFdBQUksSUFBSXpLLENBQUMsR0FBQyxDQUFWLEVBQVlBLENBQUMsR0FBQyxLQUFLdUssU0FBTCxDQUFlckwsTUFBN0IsRUFBb0MsRUFBRWMsQ0FBdEMsRUFBd0M7QUFDcEMsWUFBRyxLQUFLdUssU0FBTCxDQUFldkssQ0FBZixFQUFrQjBLLEVBQWxCLElBQXdCRCxNQUEzQixFQUFrQztBQUM5QixlQUFLekwsZUFBTCxHQUF1QmdCLENBQXZCO0FBQ0EsZUFBS3VLLFNBQUwsQ0FBZXZLLENBQWYsRUFBa0I2RyxZQUFsQixHQUFpQyxJQUFqQztBQUNBLGVBQUt2SCxVQUFMLEdBQWtCLEtBQUtpTCxTQUFMLENBQWV2SyxDQUFmLEVBQWtCNEssV0FBcEM7QUFDQTtBQUNIO0FBQ0osT0FSYSxDQVNkO0FBQ0E7QUFDQTs7O0FBQ0EsV0FBS0osV0FBTDtBQUNIOztBQUNELFNBQUsvRixlQUFMLENBQXFCcUMsY0FBckIsQ0FBb0MsWUFBVTtBQUMxQyxVQUFJQyxJQUFJLEdBQUcsS0FBS3RDLGVBQUwsQ0FBcUJ1QyxXQUFyQixFQUFYOztBQUNBLFdBQUksSUFBSWhILEVBQUMsR0FBQyxDQUFWLEVBQVlBLEVBQUMsR0FBQytHLElBQUksQ0FBQzdILE1BQW5CLEVBQTBCLEVBQUVjLEVBQTVCLEVBQThCO0FBQzFCLFlBQUkyRCxDQUFDLEdBQUdvRCxJQUFJLENBQUMvRyxFQUFELENBQVo7QUFDQTJELFFBQUFBLENBQUMsQ0FBQ3NELFlBQUYsQ0FBZSxJQUFmO0FBQ0g7QUFDSixLQU5tQyxDQU1sQ2pHLElBTmtDLENBTTdCLElBTjZCLENBQXBDO0FBT0EsU0FBS3lELGVBQUwsQ0FBcUJpQixPQUFyQixHQUErQixFQUEvQjtBQUNBLFNBQUtqQixlQUFMLENBQXFCeUMsT0FBckIsQ0FBNkIsS0FBS3FELFNBQWxDLEVBQTRDLEtBQUtNLFVBQUwsQ0FBZ0I3SixJQUFoQixDQUFxQixJQUFyQixDQUE1QyxFQUF3RTtBQUFDTixNQUFBQSxLQUFLLEVBQUMsR0FBUDtBQUFZMEcsTUFBQUEsU0FBUyxFQUFFLElBQXZCO0FBQTZCQyxNQUFBQSxTQUFTLEVBQUV0TSxTQUFTLENBQUN1TSxrQkFBVixDQUE2QndEO0FBQXJFLEtBQXhFO0FBRUgsR0FuaEIwQjtBQW9oQjNCO0FBQ0FILEVBQUFBLGlCQXJoQjJCLDZCQXFoQlRJLFdBcmhCUyxFQXFoQkc7QUFDMUI7QUFDQSxRQUFJQyxjQUFjLEdBQUc3UCxrQkFBa0IsQ0FBQ3VPLFdBQW5CLEdBQWlDcE4sUUFBakMsR0FBNEMyTyxtQkFBNUMsQ0FBZ0U3UCxhQUFhLENBQUMwSSxhQUFkLENBQTRCQyxJQUE1RixLQUFxRyxFQUExSDtBQUNBLFFBQUl3RyxTQUFTLEdBQUcsRUFBaEI7QUFDQSxRQUFJVyxvQkFBb0IsR0FBRyxJQUEzQjtBQUNBLFFBQUlDLGNBQWMsR0FBR3BCLE1BQU0sQ0FBQ2pCLFlBQVAsQ0FBb0JzQyxzQkFBekM7O0FBQ0EsU0FBSSxJQUFJcEwsQ0FBQyxHQUFDLENBQVYsRUFBWUEsQ0FBQyxHQUFDZ0wsY0FBYyxDQUFDOUwsTUFBN0IsRUFBb0MsRUFBRWMsQ0FBdEMsRUFBd0M7QUFDcEMsVUFBSTJELENBQUMsR0FBR3FILGNBQWMsQ0FBQ2hMLENBQUQsQ0FBdEI7QUFDQSxVQUFJNEQsTUFBTSxHQUFHRCxDQUFDLENBQUNDLE1BQWY7O0FBQ0EsVUFBR0EsTUFBTSxLQUFLbUgsV0FBVyxJQUFJLENBQWYsSUFBb0JBLFdBQVcsSUFBSW5ILE1BQU0sQ0FBQ3lILEdBQS9DLENBQVQsRUFBNkQ7QUFDekQsWUFBSTNELElBQUksR0FBRyxFQUFYO0FBQ0FBLFFBQUFBLElBQUksQ0FBQ2dELEVBQUwsR0FBVS9HLENBQUMsQ0FBQytHLEVBQVo7QUFDQWhELFFBQUFBLElBQUksQ0FBQzRELEdBQUwsR0FBVyxDQUFYO0FBQ0E1RCxRQUFBQSxJQUFJLENBQUM2RCxVQUFMLEdBQWtCSixjQUFjLENBQUN4SCxDQUFDLENBQUM2SCxPQUFILENBQWQsQ0FBMEJwTSxHQUE1QztBQUNBc0ksUUFBQUEsSUFBSSxDQUFDOEQsT0FBTCxHQUFlNUgsTUFBTSxDQUFDOEcsRUFBdEI7QUFDQWhELFFBQUFBLElBQUksQ0FBQ2dCLElBQUwsR0FBWTlFLE1BQU0sQ0FBQzZILE9BQW5CLENBTnlELENBTTlCOztBQUMzQi9ELFFBQUFBLElBQUksQ0FBQ2dFLFNBQUwsR0FBaUI5SCxNQUFNLENBQUN5SCxHQUF4QixDQVB5RCxDQU83Qjs7QUFDNUIzRCxRQUFBQSxJQUFJLENBQUNpRSxJQUFMLEdBQVkvSCxNQUFNLENBQUMrSCxJQUFuQixDQVJ5RCxDQVFqQzs7QUFDeEJqRSxRQUFBQSxJQUFJLENBQUNrRCxXQUFMLEdBQW1CakgsQ0FBQyxDQUFDaUksUUFBckI7QUFDQWxFLFFBQUFBLElBQUksQ0FBQ21FLE9BQUwsR0FBZWxJLENBQUMsQ0FBQ2tJLE9BQWpCO0FBQ0FuRSxRQUFBQSxJQUFJLENBQUM5RCxNQUFMLEdBQWNBLE1BQWQ7QUFDQSxZQUFJa0ksTUFBTSxHQUFHM1Esa0JBQWtCLENBQUN1TyxXQUFuQixHQUFpQ3BOLFFBQWpDLEdBQTRDeVAscUJBQTVDLENBQWtFcEksQ0FBbEUsQ0FBYjs7QUFDQSxZQUFHbUksTUFBSCxFQUFVO0FBQUU7QUFDUnBFLFVBQUFBLElBQUksQ0FBQ3NFLFVBQUwsR0FBa0IsQ0FBbEI7QUFDSCxTQUZELE1BRUs7QUFDRHRFLFVBQUFBLElBQUksQ0FBQ3NFLFVBQUwsR0FBa0IsQ0FBbEI7QUFDSDs7QUFDRCxZQUFHckksQ0FBQyxDQUFDaUksUUFBRixHQUFhLENBQWhCLEVBQWtCO0FBQ2RyQixVQUFBQSxTQUFTLENBQUNyQyxJQUFWLENBQWVSLElBQWY7QUFDSCxTQXBCd0QsQ0FxQnpEOzs7QUFDQSxZQUFHLEtBQUt1RSxnQkFBTCxJQUF5QixLQUFLQSxnQkFBTCxDQUFzQnZCLEVBQXRCLElBQTRCaEQsSUFBSSxDQUFDZ0QsRUFBN0QsRUFBZ0U7QUFDNURRLFVBQUFBLG9CQUFvQixHQUFHeEQsSUFBdkI7QUFDSDtBQUNKO0FBQ0o7O0FBRUQsUUFBSXdFLFNBQVMsR0FBR3JNLEtBQUssQ0FBQ3NNLGlCQUFOLENBQXdCLENBQUMsQ0FBQyxZQUFELEVBQWUsSUFBZixDQUFELEVBQXVCLENBQUMsU0FBRCxFQUFZLElBQVosQ0FBdkIsRUFBMEMsQ0FBQyxTQUFELEVBQVksS0FBWixDQUExQyxDQUF4QixDQUFoQjtBQUNBNUIsSUFBQUEsU0FBUyxDQUFDNkIsSUFBVixDQUFlRixTQUFmO0FBQ0EsV0FBTzNCLFNBQVA7QUFDSCxHQTdqQjBCO0FBOGpCM0JNLEVBQUFBLFVBOWpCMkIsc0JBOGpCaEJwRCxPQTlqQmdCLEVBOGpCUjtBQUNmLFFBQUcsS0FBSzlLLGFBQVIsRUFBc0I7QUFDdEIsUUFBSSxDQUFDOEssT0FBTCxFQUFjOztBQUNkLFFBQUcsS0FBS3pJLGVBQUwsSUFBd0IsSUFBeEIsSUFBZ0MsS0FBS0EsZUFBTCxHQUFzQixDQUFDLENBQXZELElBQTRELEtBQUt1TCxTQUFMLENBQWUsS0FBS3ZMLGVBQXBCLEVBQXFDd00sT0FBckMsSUFBZ0QvRCxPQUFPLENBQUM0RSxPQUFSLEdBQWtCYixPQUFqSSxFQUF5STtBQUNySSxXQUFLakIsU0FBTCxDQUFlLEtBQUt2TCxlQUFwQixFQUFxQzZILFlBQXJDLEdBQW9ELENBQUMsS0FBSzBELFNBQUwsQ0FBZSxLQUFLdkwsZUFBcEIsRUFBcUM2SCxZQUExRjtBQUNBLFdBQUtwQyxlQUFMLENBQXFCdUQsY0FBckIsQ0FBb0MsS0FBS2hKLGVBQXpDLEVBQTBELEtBQUt1TCxTQUFMLENBQWUsS0FBS3ZMLGVBQXBCLENBQTFEO0FBQ0g7O0FBQ0QsUUFBSXVFLFlBQVksR0FBRyxDQUFDLENBQXBCOztBQUNBLFNBQUssSUFBSW1ELE1BQU0sR0FBQyxDQUFoQixFQUFrQkEsTUFBTSxHQUFDLEtBQUs2RCxTQUFMLENBQWVyTCxNQUF4QyxFQUErQyxFQUFFd0gsTUFBakQsRUFBeUQ7QUFDckQsVUFBSSxLQUFLNkQsU0FBTCxDQUFlN0QsTUFBZixFQUF1QjhFLE9BQXZCLElBQWtDL0QsT0FBTyxDQUFDNEUsT0FBUixHQUFrQmIsT0FBeEQsRUFBZ0U7QUFDNUQsYUFBS2pCLFNBQUwsQ0FBZTdELE1BQWYsRUFBdUJHLFlBQXZCLEdBQXNDLENBQUMsS0FBSzBELFNBQUwsQ0FBZTdELE1BQWYsRUFBdUJHLFlBQTlEO0FBQ0EsYUFBS3BDLGVBQUwsQ0FBcUJ1RCxjQUFyQixDQUFvQ3RCLE1BQXBDLEVBQTRDLEtBQUs2RCxTQUFMLENBQWU3RCxNQUFmLENBQTVDOztBQUNBLFlBQUcsS0FBSzZELFNBQUwsQ0FBZTdELE1BQWYsRUFBdUJHLFlBQTFCLEVBQXVDO0FBQ25DdEQsVUFBQUEsWUFBWSxHQUFHbUQsTUFBZjtBQUNIOztBQUNEO0FBQ0g7QUFDSjs7QUFDRCxTQUFLMUgsZUFBTCxHQUF1QnVFLFlBQXZCOztBQUNBLFFBQUdBLFlBQVksSUFBSSxDQUFDLENBQXBCLEVBQXNCO0FBQ2xCLFdBQUtpSCxXQUFMO0FBQ0gsS0FGRCxNQUVLO0FBQ0QsVUFBSThCLEdBQUcsR0FBRzdFLE9BQU8sQ0FBQzRFLE9BQVIsR0FBa0J6QixXQUE1QjtBQUNBLFdBQUsyQixZQUFMLENBQWtCRCxHQUFsQjtBQUNIO0FBRUosR0F4bEIwQjtBQXlsQjNCQyxFQUFBQSxZQXpsQjJCLHdCQXlsQmRuTixHQXpsQmMsRUF5bEJWO0FBQ2IsU0FBS0UsVUFBTCxHQUFrQkYsR0FBbEI7QUFDQSxTQUFLcEIsZ0JBQUwsQ0FBc0JpQixNQUF0QixHQUErQixHQUEvQjtBQUNBLFNBQUtaLE9BQUwsQ0FBYW1PLFlBQWIsR0FBNEIsSUFBNUI7QUFDQSxTQUFLbk8sT0FBTCxDQUFhb08sb0JBQWIsR0FBb0MsS0FBcEM7QUFDQSxTQUFLNU4sTUFBTCxDQUFZNk4sT0FBWixHQUFzQixJQUF0QjtBQUNBLFNBQUtuTixhQUFMO0FBQ0gsR0FobUIwQjtBQWltQjNCRyxFQUFBQSxhQWptQjJCLDJCQWltQlo7QUFDWCxTQUFLMUIsZ0JBQUwsQ0FBc0JpQixNQUF0QixHQUErQixLQUFLSyxVQUFwQztBQUNBLFNBQUtDLGFBQUw7QUFDSCxHQXBtQjBCO0FBcW1CM0JFLEVBQUFBLGFBcm1CMkIsMkJBcW1CWjtBQUNYLFFBQUlMLEdBQUcsR0FBR0MsTUFBTSxDQUFDLEtBQUtyQixnQkFBTCxDQUFzQmlCLE1BQXZCLENBQWhCO0FBQ0FHLElBQUFBLEdBQUcsSUFBRSxDQUFMO0FBQ0EsU0FBS3BCLGdCQUFMLENBQXNCaUIsTUFBdEIsR0FBK0JHLEdBQS9CO0FBQ0EsU0FBS0csYUFBTDtBQUNILEdBMW1CMEI7QUEybUIzQkMsRUFBQUEsY0EzbUIyQiw0QkEybUJYO0FBQ1osUUFBSUosR0FBRyxHQUFHQyxNQUFNLENBQUMsS0FBS3JCLGdCQUFMLENBQXNCaUIsTUFBdkIsQ0FBaEI7QUFDQUcsSUFBQUEsR0FBRyxJQUFFLENBQUw7QUFDQSxTQUFLcEIsZ0JBQUwsQ0FBc0JpQixNQUF0QixHQUErQkcsR0FBL0I7QUFDQSxTQUFLRyxhQUFMO0FBQ0gsR0FobkIwQjtBQWluQjNCQSxFQUFBQSxhQWpuQjJCLDJCQWluQlo7QUFDWCxRQUFJSCxHQUFHLEdBQUdDLE1BQU0sQ0FBQyxLQUFLckIsZ0JBQUwsQ0FBc0JpQixNQUF2QixDQUFoQjs7QUFDQSxRQUFHLEtBQUtELGVBQUwsSUFBd0IsQ0FBQyxDQUE1QixFQUE4QjtBQUMxQixXQUFLZCxRQUFMLENBQWNzTyxZQUFkLEdBQTZCLEtBQTdCO0FBQ0EsV0FBS3RPLFFBQUwsQ0FBY3VPLG9CQUFkLEdBQXFDLElBQXJDO0FBQ0EsV0FBS3JPLE9BQUwsQ0FBYW9PLFlBQWIsR0FBNEIsS0FBNUI7QUFDQSxXQUFLcE8sT0FBTCxDQUFhcU8sb0JBQWIsR0FBb0MsSUFBcEM7QUFDQSxXQUFLcE8sT0FBTCxDQUFhbU8sWUFBYixHQUE0QixLQUE1QjtBQUNBLFdBQUtuTyxPQUFMLENBQWFvTyxvQkFBYixHQUFvQyxJQUFwQztBQUNBLFdBQUtsTyxPQUFMLENBQWFtTyxPQUFiLEdBQXVCLEtBQXZCO0FBQ0EsV0FBSzlOLE1BQUwsQ0FBWThOLE9BQVosR0FBc0IsS0FBdEI7QUFDQSxXQUFLN04sTUFBTCxDQUFZNk4sT0FBWixHQUFzQixLQUF0QjtBQUNILEtBVkQsTUFVTSxJQUFHdE4sR0FBRyxJQUFJLENBQVYsRUFBWTtBQUNkLFdBQUtsQixRQUFMLENBQWNzTyxZQUFkLEdBQTZCLEtBQTdCO0FBQ0EsV0FBS3RPLFFBQUwsQ0FBY3VPLG9CQUFkLEdBQXFDLElBQXJDO0FBQ0EsV0FBS2xPLE9BQUwsQ0FBYW1PLE9BQWIsR0FBdUIsS0FBdkI7QUFDQSxXQUFLdE8sT0FBTCxDQUFhb08sWUFBYixHQUE0QixJQUE1QjtBQUNBLFdBQUtwTyxPQUFMLENBQWFxTyxvQkFBYixHQUFvQyxLQUFwQztBQUNBLFdBQUs3TixNQUFMLENBQVk4TixPQUFaLEdBQXNCLElBQXRCO0FBQ0gsS0FQSyxNQU9BLElBQUd0TixHQUFHLElBQUksS0FBS0UsVUFBZixFQUEwQjtBQUM1QixXQUFLcEIsUUFBTCxDQUFjc08sWUFBZCxHQUE2QixJQUE3QjtBQUNBLFdBQUt0TyxRQUFMLENBQWN1TyxvQkFBZCxHQUFxQyxLQUFyQztBQUNBLFdBQUtsTyxPQUFMLENBQWFtTyxPQUFiLEdBQXVCLEtBQXZCO0FBQ0EsV0FBS3RPLE9BQUwsQ0FBYW9PLFlBQWIsR0FBNEIsS0FBNUI7QUFDQSxXQUFLcE8sT0FBTCxDQUFhcU8sb0JBQWIsR0FBb0MsSUFBcEM7QUFDQSxXQUFLN04sTUFBTCxDQUFZOE4sT0FBWixHQUFzQixLQUF0QjtBQUNILEtBUEssTUFPRDtBQUNELFdBQUt4TyxRQUFMLENBQWNzTyxZQUFkLEdBQTZCLElBQTdCO0FBQ0EsV0FBS3RPLFFBQUwsQ0FBY3VPLG9CQUFkLEdBQXFDLEtBQXJDO0FBQ0EsV0FBS2xPLE9BQUwsQ0FBYW1PLE9BQWIsR0FBdUIsSUFBdkI7QUFDQSxXQUFLdE8sT0FBTCxDQUFhb08sWUFBYixHQUE0QixJQUE1QjtBQUNBLFdBQUtwTyxPQUFMLENBQWFxTyxvQkFBYixHQUFvQyxLQUFwQztBQUNBLFdBQUs3TixNQUFMLENBQVk4TixPQUFaLEdBQXNCLElBQXRCO0FBQ0g7QUFDSixHQW5wQjBCO0FBb3BCM0IvTSxFQUFBQSxhQXBwQjJCLDJCQW9wQlo7QUFDWEUsSUFBQUEsS0FBSyxDQUFDUyxlQUFOLENBQXNCLENBQXRCO0FBQ0EsUUFBRyxLQUFLM0QsYUFBUixFQUFzQjs7QUFDdEIsUUFBRyxLQUFLcUMsZUFBTCxJQUF3QixDQUFDLENBQTVCLEVBQThCO0FBQzFCbUosTUFBQUEsT0FBTyxDQUFDdEksS0FBSyxDQUFDQyxLQUFOLENBQVksVUFBWixDQUFELENBQVA7QUFDQTtBQUNIOztBQUNELFFBQUk2TSxLQUFLLEdBQUd0TixNQUFNLENBQUMsS0FBS3JCLGdCQUFMLENBQXNCaUIsTUFBdkIsQ0FBbEI7O0FBQ0EsUUFBRzBOLEtBQUssSUFBSSxDQUFaLEVBQWM7QUFDVnhFLE1BQUFBLE9BQU8sQ0FBQ3RJLEtBQUssQ0FBQ0MsS0FBTixDQUFZLFVBQVosQ0FBRCxDQUFQO0FBQ0E7QUFDSDs7QUFDRCxRQUFHNk0sS0FBSyxHQUFHLEtBQUtyTixVQUFoQixFQUEyQjtBQUN2QjZJLE1BQUFBLE9BQU8sQ0FBQ3RJLEtBQUssQ0FBQ0MsS0FBTixDQUFZLFdBQVosQ0FBRCxDQUFQO0FBQ0E7QUFDSDs7QUFDRCxRQUFJNEgsSUFBSSxHQUFHLEtBQUs2QyxTQUFMLENBQWUsS0FBS3ZMLGVBQXBCLENBQVg7QUFDQSxRQUFJNEUsTUFBTSxHQUFHOEQsSUFBSSxDQUFDOUQsTUFBbEI7QUFDQSxRQUFJaUYsV0FBVyxHQUFHbkIsSUFBSSxDQUFDc0UsVUFBTCxJQUFtQixDQUFyQztBQUNBLFFBQUlZLEtBQUssR0FBR3hSLGFBQWEsQ0FBQ3lSLHVCQUFkLENBQXNDakosTUFBTSxDQUFDaUksT0FBN0MsQ0FBWjtBQUNBLFFBQUlpQixTQUFTLEdBQUcsRUFBaEI7O0FBQ0EsU0FBSSxJQUFJOU0sQ0FBQyxHQUFDLENBQVYsRUFBWUEsQ0FBQyxHQUFDNEQsTUFBTSxDQUFDbUosS0FBUCxDQUFhN04sTUFBM0IsRUFBa0MsRUFBRWMsQ0FBcEMsRUFBc0M7QUFDbEMsVUFBSTJELENBQUMsR0FBR0MsTUFBTSxDQUFDbUosS0FBUCxDQUFhL00sQ0FBYixDQUFSO0FBQ0EsVUFBSTBLLEVBQUUsR0FBRy9HLENBQUMsQ0FBQyxDQUFELENBQVY7QUFDQSxVQUFJdkUsR0FBRyxHQUFHdUUsQ0FBQyxDQUFDLENBQUQsQ0FBRCxJQUFRLENBQWxCO0FBQ0F2RSxNQUFBQSxHQUFHLEdBQUdBLEdBQUcsR0FBR3VOLEtBQVo7O0FBQ0EsVUFBR2pDLEVBQUUsSUFBSSxJQUFULEVBQWM7QUFDVm9DLFFBQUFBLFNBQVMsQ0FBQzVFLElBQVYsQ0FBZTtBQUFDd0MsVUFBQUEsRUFBRSxFQUFHQSxFQUFOO0FBQVV0TCxVQUFBQSxHQUFHLEVBQUdBO0FBQWhCLFNBQWY7QUFDSDtBQUNKOztBQUNELFFBQUk0TixTQUFTLEdBQUc7QUFBQ3RDLE1BQUFBLEVBQUUsRUFBRWhELElBQUksQ0FBQ2dELEVBQVY7QUFBYVksTUFBQUEsR0FBRyxFQUFDNUQsSUFBSSxDQUFDOEQsT0FBdEI7QUFBOEJwTSxNQUFBQSxHQUFHLEVBQUN1TjtBQUFsQyxLQUFoQjs7QUFDQSxRQUFHRyxTQUFTLENBQUM1TixNQUFiLEVBQW9CO0FBQ2hCLFVBQUkrTixHQUFHLEdBQUkxUixFQUFFLENBQUMyUixFQUFILENBQU1DLFNBQU4sQ0FBZ0IsZ0VBQWhCLEVBQWlGUixLQUFqRixFQUF1RkMsS0FBdkYsRUFBNkZoSixNQUFNLENBQUM0RixJQUFwRyxDQUFYO0FBQ0EsV0FBS3JOLElBQUwsQ0FBVTRNLHVCQUFWLENBQWtDLElBQWxDLEVBQXdDK0QsU0FBeEMsRUFBa0RqRSxXQUFsRCxFQUE4RCxZQUFVO0FBQ3BFLGFBQUs1SCxZQUFMLENBQWtCUyxZQUFsQixDQUErQixDQUEvQixFQUFrQ0MsWUFBWSxDQUFDdUgsUUFBL0MsRUFBeUQsS0FBekQ7QUFDQSxhQUFLQyxVQUFMO0FBQ0EsYUFBS3hNLGFBQUwsR0FBcUIsSUFBckI7QUFDQWtELFFBQUFBLEtBQUssQ0FBQ3VKLFFBQU4sQ0FBZSxLQUFLdk0sYUFBcEIsRUFBa0MsR0FBbEMsRUFBc0MsWUFBVTtBQUM1QzFCLFVBQUFBLGtCQUFrQixDQUFDdU8sV0FBbkIsR0FBaUMwRCxXQUFqQyxDQUE2Q2hTLGFBQWEsQ0FBQ2dJLFFBQWQsQ0FBdUJDLFFBQXBFLEVBQTZFLENBQUMySixTQUFELENBQTdFO0FBQ0gsU0FGcUMsQ0FFcENoTSxJQUZvQyxDQUUvQixJQUYrQixDQUF0QztBQUdILE9BUDZELENBTzVEQSxJQVA0RCxDQU92RCxJQVB1RCxDQUE5RCxFQU9jakcsU0FBUyxDQUFDa08sU0FBVixDQUFvQm9FLFVBUGxDLEVBTzZDSixHQVA3QztBQVFIO0FBQ0osR0E5ckIwQjtBQStyQjNCO0FBQ0E5RCxFQUFBQSxVQWhzQjJCLHdCQWdzQmY7QUFDUixRQUFHLEtBQUttRSxZQUFMLElBQXFCLElBQXhCLEVBQTZCO0FBQ3pCLFdBQUtBLFlBQUwsR0FBb0IsS0FBS3hRLFNBQUwsQ0FBZSxjQUFmLEVBQStCb0UsRUFBRSxDQUFDQyxRQUFsQyxDQUFwQjtBQUNBLFVBQUlHLFdBQVcsR0FBR3pHLFFBQVEsQ0FBQzBHLFlBQVQsQ0FBc0IsUUFBdEIsRUFBZ0MsUUFBaEMsQ0FBbEI7QUFDQSxXQUFLWCxPQUFMLENBQWFVLFdBQWIsRUFBeUIsVUFBU0UsYUFBVCxFQUF1QjtBQUM1QyxhQUFLOEwsWUFBTCxDQUFrQjdMLFlBQWxCLEdBQWlDRCxhQUFqQztBQUNBLGFBQUs4TCxZQUFMLENBQWtCNUwsWUFBbEIsQ0FBK0IsQ0FBL0IsRUFBa0NDLFlBQVksQ0FBQzRMLE1BQS9DLEVBQXdELEtBQXhEO0FBQ0gsT0FId0IsQ0FHdkJ2TSxJQUh1QixDQUdsQixJQUhrQixDQUF6QjtBQUlILEtBUEQsTUFPSztBQUNELFdBQUtzTSxZQUFMLENBQWtCNUwsWUFBbEIsQ0FBK0IsQ0FBL0IsRUFBa0NDLFlBQVksQ0FBQzRMLE1BQS9DLEVBQXdELEtBQXhEO0FBQ0g7QUFDSjtBQTNzQjBCLENBQVQsQ0FBdEIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBAYXV0aG9yOiB4eHhAc3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcbi8vIEBkZXNjcmlwdGlvbjpcbi8vICAgICDov5nph4zmmK/mj4/ov7Dov5nkuKrnqpfkvZPnmoTkvZznlKjnmoRcbi8vIDxici8+Q3JlYXRlOiAyMDE5LTAzLTAyIDE1OjEzOjMwXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIFBhdGhUb29sID0gcmVxdWlyZShcInBhdGh0b29sXCIpO1xudmFyIEhlcm9Db25zdCA9IHJlcXVpcmUoXCJoZXJvX2NvbnN0XCIpO1xudmFyIEhlcm9FdmVudCA9IHJlcXVpcmUoXCJoZXJvX2V2ZW50XCIpO1xudmFyIE1hbGxDb250cm9sbGVyID0gcmVxdWlyZShcIm1hbGxfY29udHJvbGxlclwiKTtcbnZhciBNYWxsQ29uc3QgICAgICA9IHJlcXVpcmUoXCJtYWxsX2NvbnN0XCIpO1xudmFyIEJhY2twYWNrQ29udHJvbGxlciA9IHJlcXVpcmUoXCJiYWNrcGFja19jb250cm9sbGVyXCIpXG52YXIgQmFja1BhY2tDb25zdCA9IHJlcXVpcmUoXCJiYWNrcGFja19jb25zdFwiKVxudmFyIEJhY2twYWNrRXZlbnQgPSByZXF1aXJlKFwiYmFja3BhY2tfZXZlbnRcIilcbnZhciBIZXJvUmVzZXRXaW5kb3cgPSBjYy5DbGFzcyh7XG4gICAgZXh0ZW5kczogQmFzZVZpZXcsXG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnByZWZhYlBhdGggPSBQYXRoVG9vbC5nZXRQcmVmYWJQYXRoKFwiaGVyb1wiLCBcImhlcm9fcmVzZXRfd2luZG93XCIpO1xuICAgICAgICB0aGlzLnZpZXdUYWcgPSBTQ0VORV9UQUcudWk7ICAgICAgICAgICAgICAgIC8v6K+l56qX5L2T5omA5bGedWnlsYLnuqcs5YWo5bGPdWnpnIDopoHlnKh1aeWxgizpnZ7lhajlsY91aeWcqGRpYWxvZ3Vl5bGCLOi/meS4quimgeazqOaEj1xuICAgICAgICB0aGlzLndpbl90eXBlID0gV2luVHlwZS5GdWxsOyAgICAgICAgICAgICAgIC8v5piv5ZCm5piv5YWo5bGP56qX5L2TICBXaW5UeXBlLkZ1bGwsIFdpblR5cGUuQmlnLCBXaW5UeXBlLk1pbmksIFdpblR5cGUuVGlwc1xuXG4gICAgICAgIHRoaXMuY3RybCA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgdGhpcy5tb2RlbCA9IHRoaXMuY3RybC5nZXRNb2RlbCgpO1xuICAgIH0sXG5cbiAgICAvLyDliJ3lp4vljJbkuIDkupvphY3nva7mlbDmja4s5Y+v5Lul55So5LqO5aOw5piO5LiA5Lqb5Y+Y6YeP5LmL57G755qEXG4gICAgaW5pdENvbmZpZzpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLmN1cl9jYW1wID0gMDtcbiAgICAgICAgdGhpcy5zZWxlY3RfaGVyb3MgPSBbXTtcbiAgICAgICAgLy/mnIDlpJrpgInmi6kxMOS4qlxuICAgICAgICB0aGlzLnNlbGVjdF9tYXhfY291bnQgPSAxMFxuICAgICAgICB0aGlzLmlzX3NlbmRfcHJvdG8gPSBmYWxzZTtcbiAgICB9LFxuXG4gICAgLy8g6aKE5Yi25L2T5Yqg6L295a6M5oiQ5LmL5ZCO55qE5Zue6LCDLOWPr+S7peWcqOi/memHjOaNleiOt+ebuOWFs+iKgueCueaIluiAhee7hOS7tlxuICAgIG9wZW5DYWxsQmFjazpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLm1haW5fcGFuZWxfbmQgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJtYWluX2NvbnRhaW5lclwiKVxuICAgICAgICB0aGlzLmNsb3NlX2J0bl9uZCAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJjbG9zZV9idG5cIik7XG4gICAgICAgIHRoaXMuY2FtcF9ub2RlX25kICAgICAgPSB0aGlzLnNlZWtDaGlsZChcImNhbXBfbm9kZVwiKTtcbiAgICAgICAgdGhpcy5pbWdfc2VsZWN0X25kICAgICA9IHRoaXMuc2Vla0NoaWxkKFwiaW1nX3NlbGVjdFwiKTtcbiAgICAgICAgdGhpcy5oZXJvX2xpc3RfbmQgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwiaGVyb19saXN0XCIpO1xuICAgICAgICB0aGlzLm5vX3ZlZGlvX2ltYWdlX25kID0gdGhpcy5zZWVrQ2hpbGQoXCJub192ZWRpb19pbWFnZVwiKTtcbiAgICAgICAgdGhpcy50aXBzX2xiICAgICAgICAgICA9IHRoaXMuc2Vla0NoaWxkKHRoaXMubm9fdmVkaW9faW1hZ2VfbmQsXCJub192ZWRpb19sYWJlbFwiLGNjLkxhYmVsKTtcbiAgICAgICAgdGhpcy5wdXRpbl9idG5fbmQgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwicHV0aW5fYnRuXCIpO1xuICAgICAgICB0aGlzLmRpc2JhbmRfYnRuX25kICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJkaXNiYW5kX2J0blwiKTtcbiAgICAgICAgdGhpcy5wYXJ0bmVyX2J0bl9uZCAgICA9IHRoaXMuc2Vla0NoaWxkKFwicGFydG5lcl9idG5cIik7XG4gICAgICAgIHRoaXMudGlwX2J0bl9uZCAgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcInRpcF9idG5cIik7XG4gICAgICAgIHRoaXMubG9va19idG5fbmQgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcImxvb2tfYnRuXCIpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5oZXJvX2NvdW50X2xiICA9IHRoaXMuc2Vla0NoaWxkKFwiaGVyb19jb3VudFwiLCBjYy5MYWJlbCk7XG4gICAgICAgIHRoaXMuaW5wdXRfY291bnRfbGIgPSB0aGlzLnNlZWtDaGlsZChcImlucHV0X2NvdW50XCIsIGNjLkxhYmVsKTtcbiAgICAgICAgdGhpcy50YWJfY29udGFpbmVyX25kID0gdGhpcy5zZWVrQ2hpbGQoXCJ0YWJfY29udGFpbmVyXCIpO1xuICAgICAgICB0aGlzLmhlcm9fdGFiID0gdGhpcy5zZWVrQ2hpbGQoXCJoZXJvX3hpYW5qaVwiKVxuICAgICAgICB0aGlzLmRlYnJpc190YWIgPSB0aGlzLnNlZWtDaGlsZChcImRlYnJpc194aWFuamlcIilcbiAgICAgICAgdGhpcy5yZXNvbHZlX2NvdW50X2xiID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5kZWJyaXNfdGFiLFwicmVzb2x2ZV9jb3VudFwiLGNjLkVkaXRCb3gpXG4gICAgICAgIHRoaXMucmVkdV9idG4gPSB0aGlzLnNlZWtDaGlsZCh0aGlzLmRlYnJpc190YWIsXCJyZWR1X2J0blwiLGNjLkJ1dHRvbik7XG4gICAgICAgIHRoaXMuYWRkX2J0biA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuZGVicmlzX3RhYixcImFkZF9idG5cIixjYy5CdXR0b24pO1xuICAgICAgICB0aGlzLm1heF9idG4gPSB0aGlzLnNlZWtDaGlsZCh0aGlzLmRlYnJpc190YWIsXCJtYXhfYnRuXCIsY2MuQnV0dG9uKTtcbiAgICAgICAgdGhpcy5kZWJyaXNfYnRuID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5kZWJyaXNfdGFiLFwiZGVicmlzX2J0blwiLGNjLkJ1dHRvbilcbiAgICAgICAgdGhpcy5yZWR1X2xiID0gdGhpcy5yZWR1X2J0bi5ub2RlLmdldENoaWxkQnlOYW1lKFwiTGFiZWxcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsT3V0bGluZSlcbiAgICAgICAgdGhpcy5hZGRfbGIgPSB0aGlzLmFkZF9idG4ubm9kZS5nZXRDaGlsZEJ5TmFtZShcIkxhYmVsXCIpLmdldENvbXBvbmVudChjYy5MYWJlbE91dGxpbmUpXG4gICAgICAgIHRoaXMubWF4X2xiID0gdGhpcy5tYXhfYnRuLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJMYWJlbFwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWxPdXRsaW5lKVxuICAgICAgICB0aGlzLnJlc29sdmVfY291bnRfbGIubm9kZS5vbigndGV4dC1jaGFuZ2VkJywgZnVuY3Rpb24oZWRpdGJveCl7XG4gICAgICAgICAgICBpZighdGhpcy5zZWxlY3RDaGlwSW5kZXggfHwgdGhpcy5zZWxlY3RDaGlwSW5kZXggPT0gLTEpe1xuICAgICAgICAgICAgICAgIGVkaXRib3guc3RyaW5nID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihlZGl0Ym94LnN0cmluZy5sZW5ndGggPiAxICYmIGVkaXRib3guc3RyaW5nWzBdID09IFwiMFwiKXtcbiAgICAgICAgICAgICAgICBlZGl0Ym94LnN0cmluZyA9IGVkaXRib3guc3RyaW5nLnNsaWNlKDEsZWRpdGJveC5zdHJpbmcubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBudW0gPSBOdW1iZXIoZWRpdGJveC5zdHJpbmcpXG4gICAgICAgICAgICBpZihudW0gPiB0aGlzLmNoaXBNYXhOdW0pe1xuICAgICAgICAgICAgICAgIGVkaXRib3guc3RyaW5nID0gdGhpcy5jaGlwTWF4TnVtXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNoZWNrQnRuU3RhdGUoKVxuICAgICAgICB9LCB0aGlzKTtcbiAgICAgICAgdGhpcy5yZWR1X2J0bi5ub2RlLm9uKFwiY2xpY2tcIix0aGlzLm9uQ2xpY2tCdG5SZWR1LHRoaXMpXG4gICAgICAgIHRoaXMuYWRkX2J0bi5ub2RlLm9uKFwiY2xpY2tcIix0aGlzLm9uQ2xpY2tCdG5BZGQsdGhpcylcbiAgICAgICAgdGhpcy5tYXhfYnRuLm5vZGUub24oXCJjbGlja1wiLHRoaXMub25DbGlja0J0bk1heCx0aGlzKVxuICAgICAgICB0aGlzLmRlYnJpc19idG4ubm9kZS5vbihcImNsaWNrXCIsdGhpcy5vbkRpc2JhbmRDaGlwLHRoaXMpXG4gICAgICAgIGxldCB0YWJfbmFtZV9saXN0ID0ge1xuICAgICAgICAgICAgWzFdIDogVXRpbHMuVEkxOE4oXCLoi7Hpm4TnjK7npa1cIiksXG4gICAgICAgICAgICBbMl0gOiBVdGlscy5USTE4TihcIueijueJh+eMruelrVwiKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudGFiX2xpc3QgPSB7fTtcbiAgICAgICAgZm9yKGxldCBpPTE7aTw9MjsrK2kpe1xuICAgICAgICAgICAgbGV0IG9iamVjdCA9IHt9O1xuICAgICAgICAgICAgb2JqZWN0LnRhYl9idG4gPSB0aGlzLnRhYl9jb250YWluZXJfbmQuZ2V0Q2hpbGRCeU5hbWUoXCJ0b2dnbGVcIitpKTtcbiAgICAgICAgICAgIG9iamVjdC5pbmRleCA9IGk7XG4gICAgICAgICAgICBvYmplY3QudG9nZ2xlID0gb2JqZWN0LnRhYl9idG4uZ2V0Q29tcG9uZW50KGNjLlRvZ2dsZSk7XG4gICAgICAgICAgICBvYmplY3QudGFiX2J0bi5nZXRDaGlsZEJ5TmFtZShcInRpdGxlXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCkuc3RyaW5nID0gdGFiX25hbWVfbGlzdFtpXTtcbiAgICAgICAgICAgIG9iamVjdC50YWJfYnRuLm9uKFwidG9nZ2xlXCIsZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoMSlcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVNlbGVjdGVkVGFiKGkpXG4gICAgICAgICAgICB9LHRoaXMpXG4gICAgICAgICAgICB0aGlzLnRhYl9saXN0W2ldID0gb2JqZWN0XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnB1dF9jb3VudF9sYi5zdHJpbmcgPSBVdGlscy5USTE4TihcIuW3suaUvuWFpeiLsembhDpcIitcIjAvXCIrdGhpcy5zZWxlY3RfbWF4X2NvdW50KTtcbiAgICAgICAgLy8gdGhpcy5hbmltYV9zayAgICAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwiYW5pbWFcIiwgc3AuU2tlbGV0b24pO1xuICAgICAgICAvLyB0aGlzLmFuaW1hX3NrLnNldENvbXBsZXRlTGlzdGVuZXIodGhpcy5vbkFuaW1hRmluaXNoLmJpbmQodGhpcykpO1xuICAgICAgICBsZXQgYmcgPSB0aGlzLnNlZWtDaGlsZChcImJnXCIsIGNjLlNwcml0ZSk7XG4gICAgICAgIGJnLm5vZGUuc2NhbGUgPSBGSVRfU0NBTEUgKiAyXG4gICAgICAgIHRoaXMubG9hZFJlcyhQYXRoVG9vbC5nZXRCaWdCZyhcImhlcm8vaGVyb19yZXNldF9iZ1wiKSxmdW5jdGlvbihyZXMpe1xuICAgICAgICAgICAgYmcuc3ByaXRlRnJhbWUgPSByZXNcbiAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICB0aGlzLnJlc2V0X2VmZmVjdCA9IHRoaXMuc2Vla0NoaWxkKFwicGxheV9lZmZlY3QxXCIsIHNwLlNrZWxldG9uKTtcbiAgICAgICAgdGhpcy5yZXNldF9lZmZlY3Quc2V0Q29tcGxldGVMaXN0ZW5lcih0aGlzLm9uQW5pbWFGaW5pc2guYmluZCh0aGlzKSk7XG4gICAgICAgIGxldCBza2V0b25fcGF0aCA9IFBhdGhUb29sLmdldFNwaW5lUGF0aChcIkUyNDEyMVwiLCBcImFjdGlvblwiKTtcbiAgICAgICAgdGhpcy5sb2FkUmVzKHNrZXRvbl9wYXRoLGZ1bmN0aW9uKHNrZWxldG9uX2RhdGEpe1xuICAgICAgICAgICAgdGhpcy5yZXNldF9lZmZlY3Quc2tlbGV0b25EYXRhID0gc2tlbGV0b25fZGF0YTtcbiAgICAgICAgICAgIHRoaXMucmVzZXRfZWZmZWN0LnNldEFuaW1hdGlvbigwLCBQbGF5ZXJBY3Rpb24uYWN0aW9uXzEsIHRydWUpOyAgICAgICBcbiAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICB0aGlzLmNhbXBfYnRucyA9IHt9O1xuICAgICAgICBmb3IgKHZhciBjYW1wX2kgPSAwOyBjYW1wX2kgPCA2OyBjYW1wX2krKykge1xuICAgICAgICAgICAgdGhpcy5jYW1wX2J0bnNbY2FtcF9pXSAgPSB0aGlzLmNhbXBfbm9kZV9uZC5nZXRDaGlsZEJ5TmFtZShcImNhbXBfYnRuXCIgKyBjYW1wX2kpO1xuICAgICAgICAgICAgdGhpcy5jYW1wX2J0bnNbY2FtcF9pXS5jYW1wX3RhZyA9IGNhbXBfaTtcbiAgICAgICAgICAgIHZhciBjYW1wX3NwID0gdGhpcy5jYW1wX2J0bnNbY2FtcF9pXS5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgICAgIHRoaXMuY2FtcF9idG5zW2NhbXBfaV0ub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCB0aGlzLmRpZENsaWNrQ2FtcCwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHRoaXMuY2xvc2VfYnRuX25kLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgdGhpcy5vbkNsaWNrQ2xvc2VCdG4sIHRoaXMpO1xuICAgICAgICB0aGlzLnB1dGluX2J0bl9uZC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIHRoaXMub25DbGlja1B1dGluQnRuLCB0aGlzKTtcbiAgICAgICAgdGhpcy5kaXNiYW5kX2J0bl9uZC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIHRoaXMub25DbGlja0Rpc2JhbmRCdG4sIHRoaXMpO1xuICAgICAgICB0aGlzLnBhcnRuZXJfYnRuX25kLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgdGhpcy5vbkNsaWNrUGFydG5lckJ0biwgdGhpcyk7XG4gICAgICAgIHRoaXMudGlwX2J0bl9uZC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIHRoaXMub25DbGlja1RpcEJ0biwgdGhpcyk7XG4gICAgICAgIHRoaXMubG9va19idG5fbmQub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCB0aGlzLm9uQ2xpY2tMb29rQnRuLCB0aGlzKTtcblxuICAgICAgICAvLyB0aGlzLmJpZ2JnXzU2XzEgPSB0aGlzLnNlZWtDaGlsZChcImJpZ2JnXzU2XzFcIixjYy5TcHJpdGUpO1xuICAgICAgICAvLyB0aGlzLmxvYWRSZXMoUGF0aFRvb2wuZ2V0QmlnQmcoXCJiaWdiZ182MlwiKSxmdW5jdGlvbihzcCl7XG4gICAgICAgIC8vICAgICB0aGlzLmJpZ2JnXzU2XzEuc3ByaXRlRnJhbWUgPSBzcDtcbiAgICAgICAgLy8gfS5iaW5kKHRoaXMpKVxuXG4gICAgICAgIHRoaXMuaW5pdEhlcm9MaXN0KCk7XG4gICAgfSxcblxuXG4gICAgLy8g5rOo5YaM5LqL5Lu255uR5ZCs55qE5o6l5Y+jLOS4jemcgOimgeaJi+WKqOiwg+eUqCzlpoLmnpzmmK/kvb/nlKhnY29yZS5HbG9iYWxFdmVudOebkeWQrCzlj6/ku6Xnm7TmjqXosIPnlKhhZGRHbG9iYWxFdmVudFxuICAgIHJlZ2lzdGVyRXZlbnQ6ZnVuY3Rpb24oKXtcbiAgICAgICAgLy8g5Yig6Zmk6Iux6ZuEXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoSGVyb0V2ZW50LkRlbF9IZXJvX0V2ZW50LCBmdW5jdGlvbihoZXJvX2xpc3QpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0X2hlcm9zID0gW107XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhbXAoKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRfY291bnRfbGIuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLlt7LmlL7lhaXoi7Hpm4Q6XCIrXCIwL1wiICsgdGhpcy5zZWxlY3RfbWF4X2NvdW50KTtcbiAgICAgICAgICAgIHRoaXMuaXNfc2VuZF9wcm90byA9IGZhbHNlO1xuICAgICAgICB9LmJpbmQodGhpcykpICAgXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoQmFja3BhY2tFdmVudC5BRERfR09PRFMsIGZ1bmN0aW9uKGJhZ19jb2RlLGFkZF9saXN0KXtcbiAgICAgICAgICAgIGlmKGJhZ19jb2RlICE9IEJhY2tQYWNrQ29uc3QuQmFnX0NvZGUuQkFDS1BBQ0spe1xuICAgICAgICAgICAgICAgIHJldHVybiBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKCFhZGRfbGlzdHx8IFV0aWxzLm5leHQoYWRkX2xpc3QpID09IG51bGwgfHwgdGhpcy5zZWxlY3RfaW5kZXggIT0gSGVyb0NvbnN0LlNhY3JpZmljZVR5cGUuZUNoaXBTYWNyaWZpY2UpcmV0dXJuXG4gICAgICAgICAgICBsZXQgbmVlZF91cGRhdGUgPSBmYWxzZVxuICAgICAgICAgICAgZm9yKGxldCBpIGluIGFkZF9saXN0KXtcbiAgICAgICAgICAgICAgICBsZXQgdiA9IGFkZF9saXN0W2ldO1xuICAgICAgICAgICAgICAgIGlmKHYuY29uZmlnICYmIHYuY29uZmlnLnN1Yl90eXBlID09IEJhY2tQYWNrQ29uc3QuaXRlbV90YWJfdHlwZS5IRVJPKXtcbiAgICAgICAgICAgICAgICAgICAgbmVlZF91cGRhdGUgPSB0cnVlXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYobmVlZF91cGRhdGUpe1xuICAgICAgICAgICAgICAgIHRoaXMuY2hpcExpc3RDYW1wKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEJhY2twYWNrRXZlbnQuREVMRVRFX0dPT0RTLCBmdW5jdGlvbihiYWdfY29kZSxkZWxfbGlzdCl7XG4gICAgICAgICAgICB0aGlzLmlzX3NlbmRfcHJvdG8gPSBmYWxzZVxuICAgICAgICAgICAgaWYoYmFnX2NvZGUgIT0gQmFja1BhY2tDb25zdC5CYWdfQ29kZS5CQUNLUEFDSyl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoIWRlbF9saXN0fHwgVXRpbHMubmV4dChkZWxfbGlzdCkgPT0gbnVsbCB8fCB0aGlzLnNlbGVjdF9pbmRleCAhPSBIZXJvQ29uc3QuU2FjcmlmaWNlVHlwZS5lQ2hpcFNhY3JpZmljZSlyZXR1cm5cbiAgICAgICAgICAgIGxldCBuZWVkX3VwZGF0ZSA9IGZhbHNlXG4gICAgICAgICAgICBmb3IobGV0IGkgaW4gZGVsX2xpc3Qpe1xuICAgICAgICAgICAgICAgIGxldCB2ID0gZGVsX2xpc3RbaV07XG4gICAgICAgICAgICAgICAgaWYoQmFja1BhY2tDb25zdC5pdGVtX3RhYl90eXBlLkhFUk8gPT0gdi5jb25maWcuc3ViX3R5cGUpe1xuICAgICAgICAgICAgICAgICAgICBuZWVkX3VwZGF0ZSA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihuZWVkX3VwZGF0ZSl7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGlwTGlzdENhbXAoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoQmFja3BhY2tFdmVudC5NT0RJRllfR09PRFNfTlVNLGZ1bmN0aW9uKGJhZ19jb2RlLGNoYW5nZV9saXN0KXtcbiAgICAgICAgICAgIHRoaXMuaXNfc2VuZF9wcm90byA9IGZhbHNlXG4gICAgICAgICAgICBpZihiYWdfY29kZSAhPSBCYWNrUGFja0NvbnN0LkJhZ19Db2RlLkJBQ0tQQUNLKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZighY2hhbmdlX2xpc3QgfHwgVXRpbHMubmV4dChjaGFuZ2VfbGlzdCkgPT0gbnVsbCB8fCB0aGlzLnNlbGVjdF9pbmRleCAhPSBIZXJvQ29uc3QuU2FjcmlmaWNlVHlwZS5lQ2hpcFNhY3JpZmljZSlyZXR1cm5cbiAgICAgICAgICAgIGxldCBuZWVkX3VwZGF0ZSA9IGZhbHNlXG4gICAgICAgICAgICBmb3IobGV0IGkgaW4gY2hhbmdlX2xpc3Qpe1xuICAgICAgICAgICAgICAgIGxldCB2ID0gY2hhbmdlX2xpc3RbaV07XG4gICAgICAgICAgICAgICAgaWYodi5jb25maWcgJiYgQmFja1BhY2tDb25zdC5pdGVtX3RhYl90eXBlLkhFUk8gPT0gdi5jb25maWcuc3ViX3R5cGUpe1xuICAgICAgICAgICAgICAgICAgICBuZWVkX3VwZGF0ZSA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihuZWVkX3VwZGF0ZSl7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGlwTGlzdENhbXAoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgfSxcblxuICAgIC8vIOmihOWItuS9k+WKoOi9veWujOaIkOS5i+WQjizmt7vliqDliLDlr7nlupTkuLvoioLngrnkuYvlkI7nmoTlm57osIMs5Lmf5bCx5piv5LiA5Liq56qX5L2T55qE5q2j5byP5YWl5Y+jLOWPr+S7peiuvue9ruS4gOS6m+aVsOaNruS6hlxuICAgIG9wZW5Sb290V25kOmZ1bmN0aW9uKGluZGV4KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0X2luZGV4ID0gIGluZGV4IHx8IEhlcm9Db25zdC5TYWNyaWZpY2VUeXBlLmVIZXJvU2FjcmlmaWNlO1xuICAgICAgICB0aGlzLnRhYl9saXN0W3RoaXMuc2VsZWN0X2luZGV4XS50b2dnbGUuY2hlY2soKVxuICAgICAgICBpZih0aGlzLnNlbGVjdF9pbmRleCA9PSBIZXJvQ29uc3QuU2FjcmlmaWNlVHlwZS5lSGVyb1NhY3JpZmljZSl7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZVNlbGVjdGVkVGFiKHRoaXMuc2VsZWN0X2luZGV4KVxuICAgICAgICB9XG4gICAgICAgIC8vIHRoaXMudXBkYXRlV2lkZ2V0cygpO1xuICAgIH0sXG5cbiAgICAvLyDlhbPpl63nqpfkvZPlm57osIMs6ZyA6KaB5Zyo6L+Z6YeM6LCD55So6K+l56qX5L2T5omA5bGeY29udHJvbGxlcueahGNsb3Nl5pa55rOV5rKh55So5LqO572u56m66K+l56qX5L2T5a6e5L6L5a+56LGhXG4gICAgY2xvc2VDYWxsQmFjazpmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuaXRlbV9zY3JvbGx2aWV3KVxuICAgICAgICAgICAgdGhpcy5pdGVtX3Njcm9sbHZpZXcuZGVsZXRlTWUoKTtcbiAgICAgICAgdGhpcy5jdHJsLm9wZW5IZXJvUmVzZXRXaW5kb3coZmFsc2UpO1xuICAgIH0sXG5cbiAgICB1cGRhdGVXaWRnZXRzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gdmFyIGVmZmVjdF9uYW1lID0gUGF0aFRvb2wuZ2V0RWZmZWN0UmVzKDU0OCk7XG4gICAgICAgIC8vIHZhciBlZmZlY3RfcGF0aCA9IFBhdGhUb29sLmdldFNwaW5lUGF0aChlZmZlY3RfbmFtZSk7XG4gICAgICAgIC8vIHRoaXMubG9hZFJlcyhlZmZlY3RfcGF0aCwgZnVuY3Rpb24oYW5pbWFfc2QpIHtcbiAgICAgICAgLy8gICAgIHRoaXMuYW5pbWFfc2suc2tlbGV0b25EYXRhID0gYW5pbWFfc2Q7XG4gICAgICAgIC8vICAgICB0aGlzLmFuaW1hX3NrLnNldEFuaW1hdGlvbigwLCBcImFjdGlvbjFcIiwgdHJ1ZSk7XG4gICAgICAgIC8vIH0uYmluZCh0aGlzKSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVDYW1wKCk7XG4gICAgfSxcblxuICAgIGRpZENsaWNrQ2FtcDogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgdmFyIGN1cl9jYW1wID0gZXZlbnQudGFyZ2V0LmNhbXBfdGFnO1xuICAgICAgICBpZiAoY3VyX2NhbXAgPT09IHRoaXMuY3VyX2NhbXApIHJldHVybjtcbiAgICAgICAgdGhpcy5jdXJfY2FtcCA9IGN1cl9jYW1wO1xuICAgICAgICB0aGlzLmltZ19zZWxlY3RfbmQucGFyZW50ID0gdGhpcy5jYW1wX2J0bnNbY3VyX2NhbXBdO1xuICAgICAgICBpZih0aGlzLnNlbGVjdF9pbmRleCA9PSBIZXJvQ29uc3QuU2FjcmlmaWNlVHlwZS5lSGVyb1NhY3JpZmljZSl7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhbXAoKTtcbiAgICAgICAgfWVsc2UgaWYodGhpcy5zZWxlY3RfaW5kZXggPT0gSGVyb0NvbnN0LlNhY3JpZmljZVR5cGUuZUNoaXBTYWNyaWZpY2Upe1xuICAgICAgICAgICAgdGhpcy5jaGlwTGlzdENhbXAoKVxuICAgICAgICB9XG5cbiAgICB9LFxuXG4gICAgb25DbGlja0Nsb3NlQnRuOiBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoMilcbiAgICAgICAgdGhpcy5jdHJsLm9wZW5IZXJvUmVzZXRXaW5kb3coZmFsc2UpO1xuICAgIH0sXG5cbiAgICBpbml0SGVyb0xpc3Q6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgQ29tbW9uU2Nyb2xsVmlldyA9IHJlcXVpcmUoXCJjb21tb25fc2Nyb2xsdmlld1wiKTtcbiAgICAgICAgdmFyIHNjcm9sbF92aWV3X3NpemUgPSBjYy5zaXplKHRoaXMuaGVyb19saXN0X25kLndpZHRoLCB0aGlzLmhlcm9fbGlzdF9uZC5oZWlnaHQpXG4gICAgICAgIHZhciBzZXR0aW5nID0ge1xuICAgICAgICAgICAgaXRlbV9jbGFzczogXCJoZXJvX2V4aGliaXRpb25faXRlbVwiLCAgICAgIC8vIOWNleWFg+exu1xuICAgICAgICAgICAgc3RhcnRfeDogMCwgICAgICAgICAgICAgICAgICAgIC8vIOesrOS4gOS4quWNleWFg+eahFjotbfngrlcbiAgICAgICAgICAgIHNwYWNlX3g6IDAsICAgICAgICAgICAgICAgICAgICAvLyB45pa55ZCR55qE6Ze06ZqUXG4gICAgICAgICAgICBzdGFydF95OiA0LCAgICAgICAgICAgICAgICAgICAgLy8g56ys5LiA5Liq5Y2V5YWD55qEWei1t+eCuVxuICAgICAgICAgICAgc3BhY2VfeTogMCwgICAgICAgICAgICAgICAgICAgLy8geeaWueWQkeeahOmXtOmalFxuICAgICAgICAgICAgaXRlbV93aWR0aDogMTI1LCAgICAgICAgICAgICAgIC8vIOWNleWFg+eahOWwuuWvuHdpZHRoXG4gICAgICAgICAgICBpdGVtX2hlaWdodDogMTIyLCAgICAgICAgICAgICAgLy8g5Y2V5YWD55qE5bC65a+4aGVpZ2h0XG4gICAgICAgICAgICBjb2w6IDUsICAgICAgICAgICAgICAgICAgICAgICAgLy8g5YiX5pWw77yM5L2c55So5LqO5Z6C55u05rua5Yqo57G75Z6LXG4gICAgICAgICAgICBvbmNlX251bTogNSxcbiAgICAgICAgICAgIG5lZWRfZHluYW1pYzogdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXRlbV9zY3JvbGx2aWV3ID0gbmV3IENvbW1vblNjcm9sbFZpZXcoKTtcbiAgICAgICAgdGhpcy5pdGVtX3Njcm9sbHZpZXcuY3JlYXRlU2Nyb2xsKHRoaXMuaGVyb19saXN0X25kLCBjYy52MigwLCAwKSwgU2Nyb2xsVmlld0Rpci52ZXJ0aWNhbCwgU2Nyb2xsVmlld1N0YXJ0UG9zLnRvcCwgc2Nyb2xsX3ZpZXdfc2l6ZSwgc2V0dGluZywgY2MudjIoMC41LDAuNSkpO1xuICAgIH0sXG5cbiAgICB1cGRhdGVDYW1wOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5jdXJfcm9sZV9saXN0ID0gVXRpbHMuZGVlcENvcHkodGhpcy5tb2RlbC5nZXRSZXN0SGVyb0xpc3RCeUNhbXAodGhpcy5jdXJfY2FtcCkpO1xuICAgICAgICB0aGlzLmhlcm9fY291bnRfbGIuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLlj6/njK7npa3oi7Hpm4Q6XCIrdGhpcy5jdXJfcm9sZV9saXN0Lmxlbmd0aCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY3VyX3JvbGVfbGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLm5vX3ZlZGlvX2ltYWdlX25kLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ub192ZWRpb19pbWFnZV9uZC5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy50aXBzX2xiLnN0cmluZyA9IFwi5pqC5peg5Y+v54yu56Wt6Iux6ZuEXCJcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOajgOafpeaYr+WQpumAieS4rVxuICAgICAgICBmb3IgKHZhciBoZXJvX2kgPSAwO2hlcm9faTx0aGlzLmN1cl9yb2xlX2xpc3QubGVuZ3RoOysraGVyb19pKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBzZWxlY19oZXJvX2kgPSAwO3NlbGVjX2hlcm9faSA8IHRoaXMuc2VsZWN0X2hlcm9zLmxlbmd0aDsrK3NlbGVjX2hlcm9faSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdF9oZXJvc1tzZWxlY19oZXJvX2ldLnBhcnRuZXJfaWQgPT09IHRoaXMuY3VyX3JvbGVfbGlzdFtoZXJvX2ldLnBhcnRuZXJfaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJfcm9sZV9saXN0W2hlcm9faV0uaXNfdWlfc2VsZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXRlbV9zY3JvbGx2aWV3LmFkZEVuZENhbGxCYWNrKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBsZXQgbGlzdCA9IHRoaXMuaXRlbV9zY3JvbGx2aWV3LmdldEl0ZW1MaXN0KCk7XG4gICAgICAgICAgICBmb3IobGV0IGk9MDtpPGxpc3QubGVuZ3RoOysraSl7XG4gICAgICAgICAgICAgICAgbGV0IHYgPSBsaXN0W2ldXG4gICAgICAgICAgICAgICAgdi5zaG93Q2hpcEljb24oZmFsc2UpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgdGhpcy5pdGVtX3Njcm9sbHZpZXcuc3BhY2VfeSA9IDA7XG4gICAgICAgIHRoaXMuaXRlbV9zY3JvbGx2aWV3LnNldERhdGEodGhpcy5jdXJfcm9sZV9saXN0LCB0aGlzLm9uQ2xpY2tIZXJvRXhoaWJpdG9uLmJpbmQodGhpcyksIHtzY2FsZTowLjksIGNhbl9jbGljazogdHJ1ZSwgZnJvbV90eXBlOiBIZXJvQ29uc3QuRXhoaWJpdGlvbkl0ZW1UeXBlLmVIZXJvUmVzZXR9KTtcbiAgICAgICAgdGhpcy5pbnB1dF9jb3VudF9sYi5zdHJpbmcgPSBVdGlscy5USTE4TihcIuW3suaUvuWFpeiLsembhDpcIitcIjAvXCIgKyB0aGlzLnNlbGVjdF9tYXhfY291bnQpO1xuICAgIH0sXG5cbiAgICBvbkNsaWNrSGVyb0V4aGliaXRvbjogZnVuY3Rpb24oaGVyb19pdGVtKSB7XG4gICAgICAgIGlmKHRoaXMuaXNfc2VuZF9wcm90bylyZXR1cm5cbiAgICAgICAgdmFyIGhlcm9fdm8gID0gaGVyb19pdGVtLmRhdGE7XG4gICAgICAgIC8vIGlmIChoZXJvX3ZvLnN0YXIgPiA2KSB7XG4gICAgICAgIC8vICAgICBtZXNzYWdlKFwiN+aYn+WPiuS7peS4iuiLsembhOaXoOazleeMruelrVwiKVxuICAgICAgICAvLyAgICAgcmV0dXJuXG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gaGVyb192by5jaGVja0hlcm9Mb2NrVGlwcyh0cnVlKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHJldHVybjtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIHRoaXMuc2VsZWN0SGVybyhoZXJvX2l0ZW0uZGF0YSk7XG4gICAgfSxcblxuICAgIHNlbGVjdEhlcm86IGZ1bmN0aW9uKGhlcm9fdm8pIHtcbiAgICAgICAgaWYgKCFoZXJvX3ZvKSByZXR1cm47XG5cbiAgICAgICAgdmFyIHNlbGVjdF9pbmRleCA9IC0xO1xuICAgICAgICBmb3IgKHZhciBoZXJvX2kgaW4gdGhpcy5zZWxlY3RfaGVyb3MpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdF9oZXJvc1toZXJvX2ldLnBhcnRuZXJfaWQgPT0gaGVyb192by5wYXJ0bmVyX2lkKXtcbiAgICAgICAgICAgICAgICBzZWxlY3RfaW5kZXggPSBoZXJvX2k7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VsZWN0X2luZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIHZhciBoZXJvX2luZGV4ID0gdGhpcy5nZXRMaXN0SW5kZXgoaGVyb192by5wYXJ0bmVyX2lkKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cl9yb2xlX2xpc3RbaGVyb19pbmRleF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cl9yb2xlX2xpc3RbaGVyb19pbmRleF0uaXNfdWlfc2VsZWN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtX3Njcm9sbHZpZXcudXBkYXRlSXRlbURhdGEoaGVyb19pbmRleCwgdGhpcy5jdXJfcm9sZV9saXN0W2hlcm9faW5kZXhdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2VsZWN0X2hlcm9zLnNwbGljZShzZWxlY3RfaW5kZXgsIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0X2hlcm9zLmxlbmd0aCA8IHRoaXMuc2VsZWN0X21heF9jb3VudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0X2hlcm9zLnB1c2goaGVyb192byk7XG4gICAgICAgICAgICAgICAgdmFyIGhlcm9faW5kZXggPSB0aGlzLmdldExpc3RJbmRleChoZXJvX3ZvLnBhcnRuZXJfaWQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cl9yb2xlX2xpc3RbaGVyb19pbmRleF0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJfcm9sZV9saXN0W2hlcm9faW5kZXhdLmlzX3VpX3NlbGVjdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbV9zY3JvbGx2aWV3LnVwZGF0ZUl0ZW1EYXRhKGhlcm9faW5kZXgsIHRoaXMuY3VyX3JvbGVfbGlzdFtoZXJvX2luZGV4XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlKFV0aWxzLlRJMThOKFwi5q+P5qyh5pyA5aSa5Y+v54yu56WtXCIrdGhpcy5zZWxlY3RfbWF4X2NvdW50K1wi5Liq6Iux6ZuEXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSAgIFxuXG4gICAgICAgIHRoaXMuaW5wdXRfY291bnRfbGIuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLlt7LmlL7lhaXoi7Hpm4Q6XCIrdGhpcy5zZWxlY3RfaGVyb3MubGVuZ3RoICsgXCIvXCIgKyB0aGlzLnNlbGVjdF9tYXhfY291bnQpO1xuICAgIH0sXG5cbiAgICBnZXRMaXN0SW5kZXg6IGZ1bmN0aW9uKHBhcnRuZXJfaWQpIHtcbiAgICAgICAgZm9yICh2YXIgcm9sZV9pIGluIHRoaXMuY3VyX3JvbGVfbGlzdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VyX3JvbGVfbGlzdFtyb2xlX2ldLnBhcnRuZXJfaWQgPT09IHBhcnRuZXJfaWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJvbGVfaTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfSxcblxuICAgIG9uQ2xpY2tQdXRpbkJ0bjogZnVuY3Rpb24oKSB7XG4gICAgICAgIFV0aWxzLnBsYXlCdXR0b25Tb3VuZCgxKVxuICAgICAgICBpZih0aGlzLnNlbGVjdF9oZXJvcy5sZW5ndGggPj0gdGhpcy5zZWxlY3RfbWF4X2NvdW50KXtcbiAgICAgICAgICAgIG1lc3NhZ2UoVXRpbHMuVEkxOE4oXCLmr4/mrKHmnIDlpJrlj6/njK7npa1cIit0aGlzLnNlbGVjdF9tYXhfY291bnQrXCLkuKroi7Hpm4RcIikpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB2YXIgc2VsZWN0X2luZGV4ID0gMDtcbiAgICAgICAgdmFyIGN1cl9zZWxlY3QgPSBbXTtcbiAgICAgICAgd2hpbGUodGhpcy5zZWxlY3RfaGVyb3MubGVuZ3RoIDwgdGhpcy5zZWxlY3RfbWF4X2NvdW50KSB7XG4gICAgICAgICAgICBpZiAoc2VsZWN0X2luZGV4ID09IHRoaXMuY3VyX3JvbGVfbGlzdC5sZW5ndGgpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB2YXIgaGVyb192byA9IHRoaXMuY2hlY2tIZXJvKHNlbGVjdF9pbmRleCk7XG5cbiAgICAgICAgICAgIGlmIChoZXJvX3ZvKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RfaGVyb3MucHVzaChoZXJvX3ZvKTtcbiAgICAgICAgICAgICAgICBjdXJfc2VsZWN0LnB1c2goaGVyb192byk7ICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZWxlY3RfaW5kZXggKys7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBoZXJvX2kgaW4gY3VyX3NlbGVjdCkge1xuICAgICAgICAgICAgdmFyIGxpc3RfaW5kZXggPSB0aGlzLmdldExpc3RJbmRleChjdXJfc2VsZWN0W2hlcm9faV0ucGFydG5lcl9pZCk7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXJfcm9sZV9saXN0W2xpc3RfaW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJfcm9sZV9saXN0W2xpc3RfaW5kZXhdLmlzX3VpX3NlbGVjdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtX3Njcm9sbHZpZXcudXBkYXRlSXRlbURhdGEobGlzdF9pbmRleCwgdGhpcy5jdXJfcm9sZV9saXN0W2xpc3RfaW5kZXhdKTtcbiAgICAgICAgICAgIH0gICAgICAgICAgICBcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlucHV0X2NvdW50X2xiLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi5bey5pS+5YWl6Iux6ZuEOlwiKyB0aGlzLnNlbGVjdF9oZXJvcy5sZW5ndGggKyBcIi9cIiArIHRoaXMuc2VsZWN0X21heF9jb3VudCk7XG5cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0X2hlcm9zLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICBtZXNzYWdlKFV0aWxzLlRJMThOKFwi5pqC5peg5Y+v5pS+5YWl55qE6Iux6ZuEXCIpKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBjaGVja0hlcm86IGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLmN1cl9yb2xlX2xpc3RbaW5kZXhdKSB7XG4gICAgICAgICAgICB2YXIgaGF2ZV9zZWxlY3QgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAodmFyIGhlb3JfaSBpbiB0aGlzLnNlbGVjdF9oZXJvcykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cl9yb2xlX2xpc3RbaW5kZXhdLnBhcnRuZXJfaWQgPT09IHRoaXMuc2VsZWN0X2hlcm9zW2hlb3JfaV0ucGFydG5lcl9pZCkge1xuICAgICAgICAgICAgICAgICAgICBoYXZlX3NlbGVjdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFoYXZlX3NlbGVjdCAmJuOAgHRoaXMuY3VyX3JvbGVfbGlzdFtpbmRleF0uc3RhcuOAgDwgNCAmJiB0aGlzLmN1cl9yb2xlX2xpc3RbaW5kZXhdLmlzX2luX2Zvcm0gPD0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jdXJfcm9sZV9saXN0W2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuXG4gICAgb25DbGlja0Rpc2JhbmRCdG46IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIFV0aWxzLnBsYXlCdXR0b25Tb3VuZCgxKVxuICAgICAgICBpZih0aGlzLmlzX3NlbmRfcHJvdG8pcmV0dXJuXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdF9oZXJvcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmhlcm9fbGlzdF9pbmZvID0gW107XG4gICAgICAgICAgICBsZXQgaXNfc2hvd190aXAgPSBmYWxzZVxuICAgICAgICAgICAgZm9yICh2YXIgaGVyb19pID0gMDsgaGVyb19pIDwgdGhpcy5zZWxlY3RfaGVyb3MubGVuZ3RoIDsgKytoZXJvX2kpIHtcbiAgICAgICAgICAgICAgICB2YXIgcGFydG5lcl9kYXRhID0ge307XG4gICAgICAgICAgICAgICAgbGV0IHYgPSB0aGlzLnNlbGVjdF9oZXJvc1toZXJvX2ldXG4gICAgICAgICAgICAgICAgcGFydG5lcl9kYXRhLnBhcnRuZXJfaWQgPSB2LnBhcnRuZXJfaWQ7XG4gICAgICAgICAgICAgICAgaWYodi5zdGFyID49IDUpe1xuICAgICAgICAgICAgICAgICAgICBpc19zaG93X3RpcCA9IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5oZXJvX2xpc3RfaW5mby5wdXNoKHBhcnRuZXJfZGF0YSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmhlcm9fbGlzdF9pbmZvLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN0cmwub3Blbkhlcm9SZXNldE9mZmVyUGFuZWwodHJ1ZSwgdGhpcy5oZXJvX2xpc3RfaW5mbyxpc19zaG93X3RpcCx0aGlzLm9uQ2xvc2VPZmZlclBhbmVsLmJpbmQodGhpcyksSGVyb0NvbnN0LlJlc2V0VHlwZS5lSGVyb1Jlc2V0KTtcbiAgICAgICAgICAgIH0gICAgICAgICAgICBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1lc3NhZ2UoVXRpbHMuVEkxOE4oXCLmsqHmnInpgInkuK3oi7Hpm4RcIikpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIG9uQ2xvc2VPZmZlclBhbmVsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gdGhpcy5hbmltYV9zay5zZXRBbmltYXRpb24oMCwgXCJhY3Rpb24yXCIsIGZhbHNlKTtcbiAgICAgICAgaWYodGhpcy5pc19zZW5kX3Byb3RvKXJldHVyblxuICAgICAgICB0aGlzLnJlc2V0X2VmZmVjdC5zZXRBbmltYXRpb24oMCwgUGxheWVyQWN0aW9uLmFjdGlvbl8yLCBmYWxzZSlcbiAgICAgICAgdGhpcy5wbGF5RWZmZWN0KClcbiAgICAgICAgdGhpcy5pc19zZW5kX3Byb3RvID0gdHJ1ZTtcbiAgICAgICAgVXRpbHMuZGVsYXlSdW4odGhpcy5tYWluX3BhbmVsX25kLDEuMixmdW5jdGlvbigpe1xuICAgICAgICAgICAgdGhpcy5jdHJsLnNlbmRlcjExMDc2KHRoaXMuaGVyb19saXN0X2luZm8pO1xuICAgICAgICB9LmJpbmQodGhpcykpXG5cbiAgICB9LFxuXG4gICAgb25BbmltYUZpbmlzaDogZnVuY3Rpb24odHJhY2tfZGF0YSkge1xuICAgICAgICBpZiAodHJhY2tfZGF0YSAmJiB0cmFja19kYXRhLmFuaW1hdGlvbikge1xuICAgICAgICAgICAgaWYgKHRyYWNrX2RhdGEuYW5pbWF0aW9uLm5hbWUgPT0gUGxheWVyQWN0aW9uLmFjdGlvbl8yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldF9lZmZlY3Quc2V0QW5pbWF0aW9uKDAsIFBsYXllckFjdGlvbi5hY3Rpb25fMSwgdHJ1ZSk7IFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIHJlcXVlc3RSZXNldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuY3RybC5zZW5kZXIxMTA3Nih0aGlzLmhlcm9fbGlzdF9pbmZvKTtcbiAgICB9LFxuXG4gICAgb25DbGlja1BhcnRuZXJCdG46IGZ1bmN0aW9uKCkge1xuICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoMSlcbiAgICAgICAgTWFsbENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5vcGVuTWFsbFBhbmVsKHRydWUsIE1hbGxDb25zdC5NYWxsVHlwZS5SZWNvdmVyeSk7XG4gICAgfSxcblxuICAgIG9uQ2xpY2tUaXBCdG46IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIFV0aWxzLnBsYXlCdXR0b25Tb3VuZCgxKVxuICAgICAgICB2YXIgdGlwX2RlcyA9IENvbmZpZy5wYXJ0bmVyX2RhdGEuZGF0YV9wYXJ0bmVyX2NvbnN0LmdhbWVfcnVsZTEuZGVzYztcbiAgICAgICAgcmVxdWlyZShcInRpcHNfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLnNob3dDb21tb25UaXBzKHRpcF9kZXMsIGV2ZW50LnRvdWNoLmdldExvY2F0aW9uKCkpO1xuICAgIH0sXG5cbiAgICBvbkNsaWNrTG9va0J0bjogZnVuY3Rpb24oKSB7XG4gICAgICAgIFV0aWxzLnBsYXlCdXR0b25Tb3VuZCgxKVxuICAgICAgICBpZiAodGhpcy5zZWxlY3RfaGVyb3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFyIGhlcm9fbGlzdF9pbmZvID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBoZXJvX2k9MDtoZXJvX2kgPCB0aGlzLnNlbGVjdF9oZXJvcy5sZW5ndGg7KytoZXJvX2kpIHtcbiAgICAgICAgICAgICAgICB2YXIgcGFydG5lcl9kYXRhID0ge307XG4gICAgICAgICAgICAgICAgcGFydG5lcl9kYXRhLnBhcnRuZXJfaWQgPSB0aGlzLnNlbGVjdF9oZXJvc1toZXJvX2ldLnBhcnRuZXJfaWQ7XG4gICAgICAgICAgICAgICAgaGVyb19saXN0X2luZm8ucHVzaChwYXJ0bmVyX2RhdGEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaGVyb19saXN0X2luZm8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3RybC5vcGVuSGVyb1Jlc2V0UmV0dXJuUGFuZWwodHJ1ZSwgaGVyb19saXN0X2luZm8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWVzc2FnZShVdGlscy5USTE4TihcIuayoeaciemAieS4reiLsembhFwiKSk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGNoYW5nZVNlbGVjdGVkVGFiKGluZGV4KXtcbiAgICAgICAgdGhpcy5zZWxlY3RfaW5kZXggPSBpbmRleFxuICAgICAgICB0aGlzLmN1cl9jYW1wID0gMDtcbiAgICAgICAgdGhpcy5pbWdfc2VsZWN0X25kLnBhcmVudCA9IHRoaXMuY2FtcF9idG5zWzBdO1xuICAgICAgICB0aGlzLnNob3dfbGlzdCA9IFtdO1xuICAgICAgICB0aGlzLnNlbGVjdF9oZXJvcyA9IFtdO1xuICAgICAgICBpZihpbmRleCA9PSBIZXJvQ29uc3QuU2FjcmlmaWNlVHlwZS5lSGVyb1NhY3JpZmljZSl7XG4gICAgICAgICAgICB0aGlzLmhlcm9fdGFiLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmRlYnJpc190YWIuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmxvb2tfYnRuX25kLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhbXAoKTtcbiAgICAgICAgfWVsc2UgaWYoaW5kZXggPT0gSGVyb0NvbnN0LlNhY3JpZmljZVR5cGUuZUNoaXBTYWNyaWZpY2Upe1xuICAgICAgICAgICAgdGhpcy5oZXJvX3RhYi5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZGVicmlzX3RhYi5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5oZXJvX2NvdW50X2xiLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi6YCJ5oup5LiA56eN56KO54mH5ZCOLOivt+WGjemAieaLqeaVsOmHj1wiKVxuICAgICAgICAgICAgdGhpcy5sb29rX2J0bl9uZC5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0Q2hpcEluZGV4ID0gLTE7XG4gICAgICAgICAgICB0aGlzLmNoaXBMaXN0Q2FtcCgpXG4gICAgICAgICAgICB0aGlzLmJ1dHRvblJlc2V0KClcbiAgICAgICAgfVxuICAgIH0sXG4gICAgYnV0dG9uUmVzZXQoKXtcbiAgICAgICAgdGhpcy5yZXNvbHZlX2NvdW50X2xiLnN0cmluZyA9IFwiMFwiO1xuICAgICAgICB0aGlzLmNoZWNrQnRuU3RhdGUoKVxuICAgIH0sXG4gICAgY2hpcExpc3RDYW1wKCl7XG4gICAgICAgIGxldCBjaGlwSURcbiAgICAgICAgaWYodGhpcy5zZWxlY3RDaGlwSW5kZXggIT0gLTEpe1xuICAgICAgICAgICAgLy8g5Y+q5piv5Yi35pawXG4gICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLnNlbGVjdENoaXBJbmRleFxuICAgICAgICAgICAgY2hpcElEID0gdGhpcy5zaG93X2xpc3RbaW5kZXhdLmlkXG4gICAgICAgICAgICB0aGlzLnNlbGVjdENoaXBJbmRleCA9IC0xXG4gICAgICAgIH1cbiAgICAgICAgbGV0IGRhdGEgPSB0aGlzLmdldENoaXBMaXN0QnlDYW1wKHRoaXMuY3VyX2NhbXApXG4gICAgICAgIHRoaXMuc2hvd19saXN0ID0gVXRpbHMuZGVlcENvcHkoZGF0YSk7XG4gICAgICAgIGlmKHRoaXMuc2hvd19saXN0Lmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgdGhpcy5ub192ZWRpb19pbWFnZV9uZC5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0aGlzLm5vX3ZlZGlvX2ltYWdlX25kLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnRpcHNfbGIuc3RyaW5nID0gXCLmmoLml6Dlj6/njK7npa3noo7niYdcIlxuICAgICAgICB9XG4gICAgICAgIGlmKGNoaXBJRCAhPSBudWxsKXtcbiAgICAgICAgICAgIGZvcihsZXQgaT0wO2k8dGhpcy5zaG93X2xpc3QubGVuZ3RoOysraSl7XG4gICAgICAgICAgICAgICAgaWYodGhpcy5zaG93X2xpc3RbaV0uaWQgPT0gY2hpcElEKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RDaGlwSW5kZXggPSBpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dfbGlzdFtpXS5pc191aV9zZWxlY3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoaXBNYXhOdW0gPSB0aGlzLnNob3dfbGlzdFtpXS50b3RhbF9jb3VudFxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlmKHRoaXMuc2VsZWN0Q2hpcEluZGV4ID09IC0xKXtcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmNoaXBNYXhOdW0gPSAwO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgdGhpcy5idXR0b25SZXNldCgpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pdGVtX3Njcm9sbHZpZXcuYWRkRW5kQ2FsbEJhY2soZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIGxldCBsaXN0ID0gdGhpcy5pdGVtX3Njcm9sbHZpZXcuZ2V0SXRlbUxpc3QoKTtcbiAgICAgICAgICAgIGZvcihsZXQgaT0wO2k8bGlzdC5sZW5ndGg7KytpKXtcbiAgICAgICAgICAgICAgICBsZXQgdiA9IGxpc3RbaV1cbiAgICAgICAgICAgICAgICB2LnNob3dDaGlwSWNvbih0cnVlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgIHRoaXMuaXRlbV9zY3JvbGx2aWV3LnNwYWNlX3kgPSAxMDtcbiAgICAgICAgdGhpcy5pdGVtX3Njcm9sbHZpZXcuc2V0RGF0YSh0aGlzLnNob3dfbGlzdCx0aGlzLnNlbGVjdENoaXAuYmluZCh0aGlzKSwge3NjYWxlOjAuOSwgY2FuX2NsaWNrOiB0cnVlLCBmcm9tX3R5cGU6IEhlcm9Db25zdC5FeGhpYml0aW9uSXRlbVR5cGUuZUhlcm9GdXNlfSlcblxuICAgIH0sXG4gICAgLy/ojrflj5bnoo7niYfkv6Hmga9cbiAgICBnZXRDaGlwTGlzdEJ5Q2FtcChzZWxlY3RfY2FtcCl7XG4gICAgICAgIC8vIC0t56KO54mH6I635Y+W5Lul5ZCO5LyY5YyWXG4gICAgICAgIGxldCBoZXJvX2NoaXBfbGlzdCA9IEJhY2twYWNrQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0QWxsQmFja1BhY2tBcnJheShCYWNrUGFja0NvbnN0Lml0ZW1fdGFiX3R5cGUuSEVSTykgfHwgW11cbiAgICAgICAgbGV0IHNob3dfbGlzdCA9IFtdXG4gICAgICAgIGxldCBjdXJfc2VsZWN0X2NoaXBfZGF0YSA9IG51bGxcbiAgICAgICAgbGV0IHBhcnRuZXJfY29uZmlnID0gQ29uZmlnLnBhcnRuZXJfZGF0YS5kYXRhX2dldF9jb21wb3VuZF9pbmZvXG4gICAgICAgIGZvcihsZXQgaT0wO2k8aGVyb19jaGlwX2xpc3QubGVuZ3RoOysraSl7XG4gICAgICAgICAgICBsZXQgdiA9IGhlcm9fY2hpcF9saXN0W2ldXG4gICAgICAgICAgICBsZXQgY29uZmlnID0gdi5jb25maWdcbiAgICAgICAgICAgIGlmKGNvbmZpZyAmJiAoc2VsZWN0X2NhbXAgPT0gMCB8fCBzZWxlY3RfY2FtcCA9PSBjb25maWcubGV2KSl7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSB7fVxuICAgICAgICAgICAgICAgIGRhdGEuaWQgPSB2LmlkXG4gICAgICAgICAgICAgICAgZGF0YS5iaWQgPSAwIFxuICAgICAgICAgICAgICAgIGRhdGEubmVlZF9jb3VudCA9IHBhcnRuZXJfY29uZmlnW3YuYmFzZV9pZF0ubnVtXG4gICAgICAgICAgICAgICAgZGF0YS5iYXNlX2lkID0gY29uZmlnLmlkXG4gICAgICAgICAgICAgICAgZGF0YS5zdGFyID0gY29uZmlnLmVxbV9qaWUgLy8tLeaYn+e6p1xuICAgICAgICAgICAgICAgIGRhdGEuY2FtcF90eXBlID0gY29uZmlnLmxldiAvLy0t6Zi16JClXG4gICAgICAgICAgICAgICAgZGF0YS5pY29uID0gY29uZmlnLmljb24gLy8tLeWbvueJh1xuICAgICAgICAgICAgICAgIGRhdGEudG90YWxfY291bnQgPSB2LnF1YW50aXR5XG4gICAgICAgICAgICAgICAgZGF0YS5xdWFsaXR5ID0gdi5xdWFsaXR5XG4gICAgICAgICAgICAgICAgZGF0YS5jb25maWcgPSBjb25maWdcbiAgICAgICAgICAgICAgICBsZXQgc3RhdHVzID0gQmFja3BhY2tDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5jaGVja0hlcm9DaGlwUmVkUG9pbnQodilcbiAgICAgICAgICAgICAgICBpZihzdGF0dXMpeyAvL+WPr+S7peWQiOaIkFxuICAgICAgICAgICAgICAgICAgICBkYXRhLnNvcnRfb3JkZXIgPSAxXG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuc29ydF9vcmRlciA9IDBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYodi5xdWFudGl0eSA+IDApe1xuICAgICAgICAgICAgICAgICAgICBzaG93X2xpc3QucHVzaChkYXRhKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyAtLeafpeaJvuW3sue7j+mAieS4rVxuICAgICAgICAgICAgICAgIGlmKHRoaXMuc2VsZWN0X2NoaXBfZGF0YSAmJiB0aGlzLnNlbGVjdF9jaGlwX2RhdGEuaWQgPT0gZGF0YS5pZCl7XG4gICAgICAgICAgICAgICAgICAgIGN1cl9zZWxlY3RfY2hpcF9kYXRhID0gZGF0YVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzb3J0X2Z1bmMgPSBVdGlscy50YWJsZUNvbW1vblNvcnRlcihbW1wic29ydF9vcmRlclwiLCB0cnVlXSwgW1wicXVhbGl0eVwiLCB0cnVlXSwgW1wiYmFzZV9pZFwiLCBmYWxzZV1dKVxuICAgICAgICBzaG93X2xpc3Quc29ydChzb3J0X2Z1bmMpXG4gICAgICAgIHJldHVybiBzaG93X2xpc3RcbiAgICB9LFxuICAgIHNlbGVjdENoaXAoaGVyb192byl7XG4gICAgICAgIGlmKHRoaXMuaXNfc2VuZF9wcm90bylyZXR1cm47XG4gICAgICAgIGlmICghaGVyb192bykgcmV0dXJuO1xuICAgICAgICBpZih0aGlzLnNlbGVjdENoaXBJbmRleCAhPSBudWxsICYmIHRoaXMuc2VsZWN0Q2hpcEluZGV4ID4tMSAmJiB0aGlzLnNob3dfbGlzdFt0aGlzLnNlbGVjdENoaXBJbmRleF0uYmFzZV9pZCAhPSBoZXJvX3ZvLmdldERhdGEoKS5iYXNlX2lkKXtcbiAgICAgICAgICAgIHRoaXMuc2hvd19saXN0W3RoaXMuc2VsZWN0Q2hpcEluZGV4XS5pc191aV9zZWxlY3QgPSAhdGhpcy5zaG93X2xpc3RbdGhpcy5zZWxlY3RDaGlwSW5kZXhdLmlzX3VpX3NlbGVjdDtcbiAgICAgICAgICAgIHRoaXMuaXRlbV9zY3JvbGx2aWV3LnVwZGF0ZUl0ZW1EYXRhKHRoaXMuc2VsZWN0Q2hpcEluZGV4LCB0aGlzLnNob3dfbGlzdFt0aGlzLnNlbGVjdENoaXBJbmRleF0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzZWxlY3RfaW5kZXggPSAtMTtcbiAgICAgICAgZm9yICh2YXIgaGVyb19pPTA7aGVyb19pPHRoaXMuc2hvd19saXN0Lmxlbmd0aDsrK2hlcm9faSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2hvd19saXN0W2hlcm9faV0uYmFzZV9pZCA9PSBoZXJvX3ZvLmdldERhdGEoKS5iYXNlX2lkKXtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dfbGlzdFtoZXJvX2ldLmlzX3VpX3NlbGVjdCA9ICF0aGlzLnNob3dfbGlzdFtoZXJvX2ldLmlzX3VpX3NlbGVjdDtcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1fc2Nyb2xsdmlldy51cGRhdGVJdGVtRGF0YShoZXJvX2ksIHRoaXMuc2hvd19saXN0W2hlcm9faV0pO1xuICAgICAgICAgICAgICAgIGlmKHRoaXMuc2hvd19saXN0W2hlcm9faV0uaXNfdWlfc2VsZWN0KXtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0X2luZGV4ID0gaGVyb19pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdENoaXBJbmRleCA9IHNlbGVjdF9pbmRleDtcbiAgICAgICAgaWYoc2VsZWN0X2luZGV4ID09IC0xKXtcbiAgICAgICAgICAgIHRoaXMuYnV0dG9uUmVzZXQoKVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGxldCBtYXggPSBoZXJvX3ZvLmdldERhdGEoKS50b3RhbF9jb3VudFxuICAgICAgICAgICAgdGhpcy5zZXRDaGlwQ291bnQobWF4KVxuICAgICAgICB9XG5cbiAgICB9LFxuICAgIHNldENoaXBDb3VudChudW0pe1xuICAgICAgICB0aGlzLmNoaXBNYXhOdW0gPSBudW07XG4gICAgICAgIHRoaXMucmVzb2x2ZV9jb3VudF9sYi5zdHJpbmcgPSBcIjFcIjsgICAgXG4gICAgICAgIHRoaXMubWF4X2J0bi5pbnRlcmFjdGFibGUgPSB0cnVlO1xuICAgICAgICB0aGlzLm1heF9idG4uZW5hYmxlQXV0b0dyYXlFZmZlY3QgPSBmYWxzZTsgXG4gICAgICAgIHRoaXMubWF4X2xiLmVuYWJsZWQgPSB0cnVlOyBcbiAgICAgICAgdGhpcy5jaGVja0J0blN0YXRlKCkgIFxuICAgIH0sXG4gICAgb25DbGlja0J0bk1heCgpe1xuICAgICAgICB0aGlzLnJlc29sdmVfY291bnRfbGIuc3RyaW5nID0gdGhpcy5jaGlwTWF4TnVtOyAgICBcbiAgICAgICAgdGhpcy5jaGVja0J0blN0YXRlKClcbiAgICB9LFxuICAgIG9uQ2xpY2tCdG5BZGQoKXtcbiAgICAgICAgbGV0IG51bSA9IE51bWJlcih0aGlzLnJlc29sdmVfY291bnRfbGIuc3RyaW5nKTtcbiAgICAgICAgbnVtKz0xXG4gICAgICAgIHRoaXMucmVzb2x2ZV9jb3VudF9sYi5zdHJpbmcgPSBudW07XG4gICAgICAgIHRoaXMuY2hlY2tCdG5TdGF0ZSgpXG4gICAgfSxcbiAgICBvbkNsaWNrQnRuUmVkdSgpe1xuICAgICAgICBsZXQgbnVtID0gTnVtYmVyKHRoaXMucmVzb2x2ZV9jb3VudF9sYi5zdHJpbmcpO1xuICAgICAgICBudW0tPTFcbiAgICAgICAgdGhpcy5yZXNvbHZlX2NvdW50X2xiLnN0cmluZyA9IG51bTtcbiAgICAgICAgdGhpcy5jaGVja0J0blN0YXRlKClcbiAgICB9LFxuICAgIGNoZWNrQnRuU3RhdGUoKXtcbiAgICAgICAgbGV0IG51bSA9IE51bWJlcih0aGlzLnJlc29sdmVfY291bnRfbGIuc3RyaW5nKVxuICAgICAgICBpZih0aGlzLnNlbGVjdENoaXBJbmRleCA9PSAtMSl7XG4gICAgICAgICAgICB0aGlzLnJlZHVfYnRuLmludGVyYWN0YWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5yZWR1X2J0bi5lbmFibGVBdXRvR3JheUVmZmVjdCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmFkZF9idG4uaW50ZXJhY3RhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmFkZF9idG4uZW5hYmxlQXV0b0dyYXlFZmZlY3QgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5tYXhfYnRuLmludGVyYWN0YWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5tYXhfYnRuLmVuYWJsZUF1dG9HcmF5RWZmZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucmVkdV9sYi5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmFkZF9sYi5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLm1heF9sYi5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgIH1lbHNlIGlmKG51bSA8PSAwKXtcbiAgICAgICAgICAgIHRoaXMucmVkdV9idG4uaW50ZXJhY3RhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnJlZHVfYnRuLmVuYWJsZUF1dG9HcmF5RWZmZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucmVkdV9sYi5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmFkZF9idG4uaW50ZXJhY3RhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuYWRkX2J0bi5lbmFibGVBdXRvR3JheUVmZmVjdCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5hZGRfbGIuZW5hYmxlZCA9IHRydWVcbiAgICAgICAgfWVsc2UgaWYobnVtID49IHRoaXMuY2hpcE1heE51bSl7XG4gICAgICAgICAgICB0aGlzLnJlZHVfYnRuLmludGVyYWN0YWJsZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnJlZHVfYnRuLmVuYWJsZUF1dG9HcmF5RWZmZWN0ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnJlZHVfbGIuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5hZGRfYnRuLmludGVyYWN0YWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5hZGRfYnRuLmVuYWJsZUF1dG9HcmF5RWZmZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuYWRkX2xiLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0aGlzLnJlZHVfYnRuLmludGVyYWN0YWJsZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnJlZHVfYnRuLmVuYWJsZUF1dG9HcmF5RWZmZWN0ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnJlZHVfbGIuZW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmFkZF9idG4uaW50ZXJhY3RhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuYWRkX2J0bi5lbmFibGVBdXRvR3JheUVmZmVjdCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5hZGRfbGIuZW5hYmxlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIG9uRGlzYmFuZENoaXAoKXtcbiAgICAgICAgVXRpbHMucGxheUJ1dHRvblNvdW5kKDEpXG4gICAgICAgIGlmKHRoaXMuaXNfc2VuZF9wcm90bylyZXR1cm5cbiAgICAgICAgaWYodGhpcy5zZWxlY3RDaGlwSW5kZXggPT0gLTEpe1xuICAgICAgICAgICAgbWVzc2FnZShVdGlscy5USTE4TihcIuayoeaciemAieS4reiLsembhOeijueJh1wiKSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGxldCBjb3VudCA9IE51bWJlcih0aGlzLnJlc29sdmVfY291bnRfbGIuc3RyaW5nKVxuICAgICAgICBpZihjb3VudCA8PSAwKXtcbiAgICAgICAgICAgIG1lc3NhZ2UoVXRpbHMuVEkxOE4oXCLmsqHmnInmlL7lhaXoi7Hpm4Tnoo7niYdcIikpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZihjb3VudCA+IHRoaXMuY2hpcE1heE51bSl7XG4gICAgICAgICAgICBtZXNzYWdlKFV0aWxzLlRJMThOKFwi6LaF6L+H5bey5oul5pyJ56KO54mH5LiK6ZmQXCIpKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgbGV0IGRhdGEgPSB0aGlzLnNob3dfbGlzdFt0aGlzLnNlbGVjdENoaXBJbmRleF1cbiAgICAgICAgbGV0IGNvbmZpZyA9IGRhdGEuY29uZmlnXG4gICAgICAgIGxldCBpc19zaG93X3RpcCA9IGRhdGEuc29ydF9vcmRlciA9PSAxO1xuICAgICAgICBsZXQgY29sb3IgPSBCYWNrUGFja0NvbnN0LmdldFdoaXRlUXVhbGl0eUNvbG9yU3RyKGNvbmZpZy5xdWFsaXR5KVxuICAgICAgICBsZXQgaXRlbV9saXN0ID0gW11cbiAgICAgICAgZm9yKGxldCBpPTA7aTxjb25maWcudmFsdWUubGVuZ3RoOysraSl7XG4gICAgICAgICAgICBsZXQgdiA9IGNvbmZpZy52YWx1ZVtpXTtcbiAgICAgICAgICAgIGxldCBpZCA9IHZbMF1cbiAgICAgICAgICAgIGxldCBudW0gPSB2WzFdIHx8IDBcbiAgICAgICAgICAgIG51bSA9IG51bSAqIGNvdW50XG4gICAgICAgICAgICBpZihpZCAhPSBudWxsKXtcbiAgICAgICAgICAgICAgICBpdGVtX2xpc3QucHVzaCh7aWQgOiBpZCwgbnVtIDogbnVtfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgc2VsbF9kYXRhID0ge2lkIDpkYXRhLmlkLGJpZDpkYXRhLmJhc2VfaWQsbnVtOmNvdW50fVxuICAgICAgICBpZihpdGVtX2xpc3QubGVuZ3RoKXtcbiAgICAgICAgICAgIGxldCBzdHIgPSAgY2MuanMuZm9ybWF0U3RyKFwi5pys5qyh5YiG6KejIDxjb2xvcj0jMjg5YjE0PiVzPC9jb2xvcj4g5LiqPGNvbG9yPSVzPuOAkCVz44CRPC9jb2xvcj7lj6/ojrflvpfku6XkuIvotYTmupA6XCIsY291bnQsY29sb3IsY29uZmlnLm5hbWUpXG4gICAgICAgICAgICB0aGlzLmN0cmwub3Blbkhlcm9SZXNldE9mZmVyUGFuZWwodHJ1ZSwgaXRlbV9saXN0LGlzX3Nob3dfdGlwLGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldF9lZmZlY3Quc2V0QW5pbWF0aW9uKDAsIFBsYXllckFjdGlvbi5hY3Rpb25fMiwgZmFsc2UpXG4gICAgICAgICAgICAgICAgdGhpcy5wbGF5RWZmZWN0KClcbiAgICAgICAgICAgICAgICB0aGlzLmlzX3NlbmRfcHJvdG8gPSB0cnVlO1xuICAgICAgICAgICAgICAgIFV0aWxzLmRlbGF5UnVuKHRoaXMubWFpbl9wYW5lbF9uZCwxLjIsZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgQmFja3BhY2tDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2VuZGVyMTA1MjIoQmFja1BhY2tDb25zdC5CYWdfQ29kZS5CQUNLUEFDSyxbc2VsbF9kYXRhXSk7XG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpLCBIZXJvQ29uc3QuUmVzZXRUeXBlLmVDaGlwUmVzZXQsc3RyKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLy8gLS3mkq3mlL7ngavoirHnmoTmlYjmnpxcbiAgICBwbGF5RWZmZWN0KCl7XG4gICAgICAgIGlmKHRoaXMucGxheV9lZmZlY3QyID09IG51bGwpe1xuICAgICAgICAgICAgdGhpcy5wbGF5X2VmZmVjdDIgPSB0aGlzLnNlZWtDaGlsZChcInBsYXlfZWZmZWN0MlwiLCBzcC5Ta2VsZXRvbik7XG4gICAgICAgICAgICBsZXQgc2tldG9uX3BhdGggPSBQYXRoVG9vbC5nZXRTcGluZVBhdGgoXCJFMjQxMjJcIiwgXCJhY3Rpb25cIik7XG4gICAgICAgICAgICB0aGlzLmxvYWRSZXMoc2tldG9uX3BhdGgsZnVuY3Rpb24oc2tlbGV0b25fZGF0YSl7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGF5X2VmZmVjdDIuc2tlbGV0b25EYXRhID0gc2tlbGV0b25fZGF0YTtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXlfZWZmZWN0Mi5zZXRBbmltYXRpb24oMCwgUGxheWVyQWN0aW9uLmFjdGlvbiAsIGZhbHNlKTsgICAgICAgXG4gICAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGhpcy5wbGF5X2VmZmVjdDIuc2V0QW5pbWF0aW9uKDAsIFBsYXllckFjdGlvbi5hY3Rpb24gLCBmYWxzZSk7ICAgICAgIFxuICAgICAgICB9XG4gICAgfVxufSkiXX0=
|