difenduandada
2024-12-31 34abe6963b344c882358274957f4b992456fee40
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/battle/view/battle_mvp_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, '4df38kJPb9CAIn5r/BxCTI3', 'battle_mvp_window');
// Scripts/mod/battle/view/battle_mvp_window.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//     这里是描述这个窗体的作用的
// <br/>Create: 2019-03-22 11:57:11
// --------------------------------------------------------------------
var PathTool = require("pathtool");
 
var BattleConst = require("battle_const");
 
var PlayerHead = require("playerhead");
 
var RoleController = require("role_controller");
 
var BattleController = require("battle_controller");
 
var BattleEvent = require("battle_event");
 
var CommonScrollView = require("common_scrollview");
 
var BattleDramaHookRewardListPanel = require("battle_drama_hook_reward_list_panel");
 
var Battle_mvpWindow = cc.Class({
  "extends": BaseView,
  ctor: function ctor() {
    this.prefabPath = PathTool.getPrefabPath("battle", "battle_mvp_view");
    this.viewTag = SCENE_TAG.dialogue; //该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意
 
    this.win_type = WinType.Mini; //是否是全屏窗体  WinType.Full, WinType.Big, WinType.Mini, WinType.Tips
 
    this.data = arguments[0];
    var data = this.data;
    this.result = data.result;
    this.reward_list = data.item_rewards || {};
    this.fight_type = data.combat_type || BattleConst.Fight_Type.Darma;
    this.partner_bid = data.partner_bid || 0;
    this.partner_hurt = data.partner_hurt || 0;
    this.partner_total_hurt = data.partner_total_hurt || 0;
    this.role_exp = data.exp || 0;
    this.role_lv = data.lev || 1;
    this.role_nowlv = data.new_lev || 1;
    this.role_nowexp = data.new_exp || 0;
    this.use_skin = data.use_skin || 0;
  },
  // 初始化一些配置数据,可以用于声明一些变量之类的
  initConfig: function initConfig() {
    this.ani_isover = false;
    this.item_list = {};
    this.role_vo = RoleController.getInstance().getRoleVo();
    this.ctrl = BattleController.getInstance();
    this.model = this.ctrl.getModel();
  },
  // 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件
  openCallBack: function openCallBack() {
    this.main_container = this.seekChild("container");
    this.main_container.zIndex = 1;
    this.containerSize = this.main_container.getContentSize();
    this.background = this.root_wnd.getChildByName("background");
    this.background.scale = FIT_SCALE;
    this.auto_combat_num_lb = this.seekChild(this.main_container, "auto_combat_num", cc.Label);
    this.auto_combat_num_lb.node.active = false;
    this.seekChild("pic_mvp").zIndex = 1;
    this.time_label_rt = this.seekChild(this.main_container, "time_label", cc.RichText);
    this.time_label_rt.string = Utils.TI18N("5秒后关闭");
    this.time_label_rt.node.active = false;
    this.comfirm_btn = this.seekChild(this.main_container, "comfirm_btn");
    this.harm_btn = this.seekChild(this.main_container, "harm_btn");
 
    if (this.data && Utils.next(this.data) != null) {
      this.harm_btn.active = true;
    } else {
      this.harm_btn.active = false;
    }
 
    this.special_sk = this.seekChild(this.main_container, "play_effect", sp.Skeleton); //进度条
 
    this.progress_bg_nd = this.seekChild(this.main_container, "sprite_3");
    this.sprite_4_nd = this.seekChild(this.main_container, "sprite_4");
    this.progress_pb = this.seekChild(this.main_container, "sprite_3", cc.ProgressBar);
    this.progress_pb.progress = 0;
    this.proTxt_lb = this.seekChild(this.main_container, "proTxt", cc.Label);
    this.progress_bg_nd.active = false; //延迟0.3秒显示进度条动画
 
    Utils.delayRun(this.root_wnd, 0.3, function () {
      this.showProgressEffect();
    }.bind(this)); //头像
 
    var sp_2 = this.seekChild(this.main_container, "sprite_2");
    this.head_icon = new PlayerHead();
    this.head_icon.setParent(sp_2);
    this.head_icon.show();
    this.head_icon.setScale(0.8);
    this.head_icon.setPosition(0, 0);
    this.head_icon.setHeadRes(this.role_vo.face_id); //等级
 
    this.roleLvTxt_lb = this.seekChild(this.main_container, "roleLvTxt", cc.Label);
    this.roleLvTxt_lb.string = cc.js.formatStr("Lv.%d", this.role_nowlv);
    var partner_config = Config.partner_data.data_partner_base[this.partner_bid];
    var skin_config = Config.partner_skin_data.data_skin_info[this.use_skin];
    this.mvp_con_nd = this.seekChild("mvp_con"); //名称和立绘
 
    var pic_bg = this.seekChild(this.mvp_con_nd, "pic_bg");
    this.bust_icon_sp = this.seekChild("bustIcon", cc.Sprite);
    pic_bg.zIndex = 1;
    this.roleNameTxt_lb = this.seekChild(pic_bg, "roleNameTxt", cc.Label);
 
    if (partner_config) {
      this.roleNameTxt_lb.string = partner_config.name;
      var bustid = null;
 
      if (skin_config) {
        bustid = skin_config.bustid;
      } else {
        bustid = partner_config.bustid;
      }
 
      var bust_res = PathTool.getPartnerBustRes(bustid);
      this.loadRes(bust_res, function (bg_sf) {
        this.bust_icon_sp.spriteFrame = bg_sf;
      }.bind(this));
    } //伤害输出
 
 
    var hurtTxt_lb = this.seekChild(pic_bg, "hurtTxt", cc.Label);
    var hurtPercent = cc.js.formatStr("%s", Math.floor(this.partner_hurt / this.partner_total_hurt * 100)) + "%";
    hurtTxt_lb.string = cc.js.formatStr("%d(%s)", Math.ceil(Number(this.partner_hurt)), hurtPercent); //显示特效
 
    this.handleEffect(true);
    this.scroll_con_nd = this.seekChild(this.main_container, "scroll_con");
    var tab_size = this.scroll_con_nd.getContentSize();
    var setting = {
      item_class: BattleDramaHookRewardListPanel,
      // 单元类
      start_x: 94,
      // 第一个单元的X起点
      space_x: 20,
      // x方向的间隔
      start_y: 0,
      // 第一个单元的Y起点
      space_y: 0,
      // y方向的间隔
      item_width: 120,
      // 单元的尺寸width
      item_height: 180,
      // 单元的尺寸height
      row: 1,
      // 行数,作用于水平滚动类型
      col: 4,
      // 列数,作用于垂直滚动类型
      need_dynamic: true
    };
    this.scroll_view = new CommonScrollView();
    this.scroll_view.createScroll(this.scroll_con_nd, cc.v2(0, 0), ScrollViewDir.vertical, ScrollViewStartPos.top, tab_size, setting, cc.v2(0.5, 0.5));
    this.rewardViewUI();
  },
  // 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
  registerEvent: function registerEvent() {
    Utils.onTouchEnd(this.comfirm_btn, function () {
      if (this.ani_isover) {
        this.ctrl.openFinishView(false, this.fight_type);
      }
    }.bind(this), 1);
    Utils.onTouchEnd(this.harm_btn, function () {
      if (this.data && Utils.next(this.data) != null) {
        this.ctrl.openBattleHarmInfoView(true, this.data);
      }
    }.bind(this), 1);
  },
  showProgressEffect: function showProgressEffect() {
    var baseCurMaxExp = Config.role_data.data_role_attr[this.role_lv].exp_max;
    var basePercent = this.role_exp / baseCurMaxExp;
    var maxPercent = this.role_nowexp / baseCurMaxExp;
 
    if (this.role_lv != this.role_nowlv) {
      //有升级
      maxPercent = 1;
    }
 
    if (this.data.auto_num && this.data.auto_num > 0) {
      this.auto_combat_num_lb.node.active = true;
      this.auto_combat_num_lb.string = cc.js.formatStr(Utils.TI18N("已连续通过关卡数:%s"), this.data.auto_num);
    }
 
    this.progress_pb.progress = basePercent;
    this.proTxt_lb.string = cc.js.formatStr("%d/%d", Number(this.role_exp), Number(baseCurMaxExp));
    this.progress_bg_nd.active = true;
 
    var call_back = function () {
      basePercent = basePercent + 0.01;
 
      if (basePercent > maxPercent) {
        if (this.role_lv == this.role_nowlv) {
          baseCurMaxExp = Config.role_data.data_role_attr[this.role_nowlv].exp_max;
          basePercent = this.role_nowexp / baseCurMaxExp;
          this.progress_pb.progress = basePercent;
          this.proTxt_lb.string = cc.js.formatStr("%d/%d", this.role_nowexp, Number(baseCurMaxExp));
          gcore.Timer.del("mvp_progress_timer");
        } else {
          //播放升级特效
          if (this.progressEffect == null) {
            this.progressEffect = this.seekChild(this.sprite_4_nd, "effect", sp.Skeleton);
            var res = cc.js.formatStr("spine/%s/action.atlas", PathTool.getEffectRes(275));
            this.loadRes(res, function (res_object) {
              this.progressEffect.skeletonData = res_object;
              this.progressEffect.setAnimation(0, PlayerAction.action, false);
            }.bind(this));
          } else {
            this.progressEffect.setAnimation(0, PlayerAction.action, false);
          }
 
          this.role_lv = this.role_lv + 1;
          basePercent = 0;
          maxPercent = 1;
          baseCurMaxExp = Config.role_data.data_role_attr[this.role_lv].exp_max;
 
          if (this.role_lv == this.role_nowlv) {
            maxPercent = this.role_nowexp / Config.role_data.data_role_attr[this.role_nowlv].exp_max;
          }
        }
      } else {
        this.progress_pb.progress = basePercent;
        this.proTxt_lb.string = cc.js.formatStr("%d/%d", Math.ceil(baseCurMaxExp * basePercent), Number(baseCurMaxExp));
      }
    }.bind(this);
 
    gcore.Timer.set(call_back, 10, -1, "mvp_progress_timer");
  },
  handleEffect: function handleEffect(status) {
    if (status == false) {
      if (this.special_sk) {
        this.special_sk.setToSetupPose();
        this.special_sk.clearTracks();
        this.special_sk.node.active = false;
      }
 
      if (this.progressEffect) {
        this.progressEffect.setToSetupPose();
        this.progressEffect.clearTracks();
        this.progressEffect.node.active = false;
      }
    } else {
      if (this.special_sk) {
        this.special_sk.node.active = true;
        var res = cc.js.formatStr("spine/%s/action.atlas", PathTool.getEffectRes(274));
        this.loadRes(res, function (res_object) {
          this.special_sk.skeletonData = res_object;
          this.special_sk.setAnimation(1, PlayerAction.action_1, false);
        }.bind(this));
      }
    }
  },
  //奖励界面
  rewardViewUI: function rewardViewUI() {
    if (!this.reward_list) return;
    this.scroll_view.setData(this.reward_list, null, {
      is_show_name: true
    });
    Utils.delayRun(this.main_container, 0.5, function () {
      this.ani_isover = true;
      this.updateTimer();
    }.bind(this));
  },
  updateTimer: function updateTimer() {
    this.time_label_rt.node.active = true;
    this.comfirm_btn.active = true;
    var time = 5;
 
    var call_back = function () {
      time = time - 1;
      var new_time = Math.ceil(time);
      var str = new_time + Utils.TI18N("秒后关闭");
 
      if (this.time_label_rt) {
        this.time_label_rt.string = str;
      }
 
      if (new_time <= 0) {
        gcore.Timer.del("mvp_close_timer");
        this.ctrl.openFinishView(false, this.fight_type);
      }
    }.bind(this);
 
    gcore.Timer.set(call_back, 1000, -1, "mvp_close_timer");
  },
  // 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了
  openRootWnd: function openRootWnd() {},
  // 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
  closeCallBack: function closeCallBack() {
    this.root_wnd.stopAllActions();
    this.main_container.stopAllActions();
    gcore.Timer.del("mvp_close_timer");
    gcore.Timer.del("mvp_progress_timer");
 
    require("hero_controller").getInstance().openEquipTips(false);
 
    require("tips_controller").getInstance().closeAllTips();
 
    if (this.fight_type == BattleConst.Fight_Type.Darma) {
      gcore.GlobalEvent.fire(BattleEvent.MOVE_DRAMA_EVENT, this.fight_type);
    }
 
    this.handleEffect(false);
 
    if (this.model.getBattleScene() && this.ctrl.getIsSameBattleType(this.fight_type)) {
      this.model.result(this.data, null);
    }
 
    if (this.scroll_view) {
      this.scroll_view.deleteMe();
      this.scroll_view = null;
    }
 
    this.ctrl.openFinishView(false, this.fight_type);
    gcore.Timer.set(function () {
      gcore.GlobalEvent.fire(BattleEvent.CLOSE_RESULT_VIEW, this.fight_type);
    }.bind(this), 200, 1);
  }
});
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxiYXR0bGVcXHZpZXdcXGJhdHRsZV9tdnBfd2luZG93LmpzIl0sIm5hbWVzIjpbIlBhdGhUb29sIiwicmVxdWlyZSIsIkJhdHRsZUNvbnN0IiwiUGxheWVySGVhZCIsIlJvbGVDb250cm9sbGVyIiwiQmF0dGxlQ29udHJvbGxlciIsIkJhdHRsZUV2ZW50IiwiQ29tbW9uU2Nyb2xsVmlldyIsIkJhdHRsZURyYW1hSG9va1Jld2FyZExpc3RQYW5lbCIsIkJhdHRsZV9tdnBXaW5kb3ciLCJjYyIsIkNsYXNzIiwiQmFzZVZpZXciLCJjdG9yIiwicHJlZmFiUGF0aCIsImdldFByZWZhYlBhdGgiLCJ2aWV3VGFnIiwiU0NFTkVfVEFHIiwiZGlhbG9ndWUiLCJ3aW5fdHlwZSIsIldpblR5cGUiLCJNaW5pIiwiZGF0YSIsImFyZ3VtZW50cyIsInJlc3VsdCIsInJld2FyZF9saXN0IiwiaXRlbV9yZXdhcmRzIiwiZmlnaHRfdHlwZSIsImNvbWJhdF90eXBlIiwiRmlnaHRfVHlwZSIsIkRhcm1hIiwicGFydG5lcl9iaWQiLCJwYXJ0bmVyX2h1cnQiLCJwYXJ0bmVyX3RvdGFsX2h1cnQiLCJyb2xlX2V4cCIsImV4cCIsInJvbGVfbHYiLCJsZXYiLCJyb2xlX25vd2x2IiwibmV3X2xldiIsInJvbGVfbm93ZXhwIiwibmV3X2V4cCIsInVzZV9za2luIiwiaW5pdENvbmZpZyIsImFuaV9pc292ZXIiLCJpdGVtX2xpc3QiLCJyb2xlX3ZvIiwiZ2V0SW5zdGFuY2UiLCJnZXRSb2xlVm8iLCJjdHJsIiwibW9kZWwiLCJnZXRNb2RlbCIsIm9wZW5DYWxsQmFjayIsIm1haW5fY29udGFpbmVyIiwic2Vla0NoaWxkIiwiekluZGV4IiwiY29udGFpbmVyU2l6ZSIsImdldENvbnRlbnRTaXplIiwiYmFja2dyb3VuZCIsInJvb3Rfd25kIiwiZ2V0Q2hpbGRCeU5hbWUiLCJzY2FsZSIsIkZJVF9TQ0FMRSIsImF1dG9fY29tYmF0X251bV9sYiIsIkxhYmVsIiwibm9kZSIsImFjdGl2ZSIsInRpbWVfbGFiZWxfcnQiLCJSaWNoVGV4dCIsInN0cmluZyIsIlV0aWxzIiwiVEkxOE4iLCJjb21maXJtX2J0biIsImhhcm1fYnRuIiwibmV4dCIsInNwZWNpYWxfc2siLCJzcCIsIlNrZWxldG9uIiwicHJvZ3Jlc3NfYmdfbmQiLCJzcHJpdGVfNF9uZCIsInByb2dyZXNzX3BiIiwiUHJvZ3Jlc3NCYXIiLCJwcm9ncmVzcyIsInByb1R4dF9sYiIsImRlbGF5UnVuIiwic2hvd1Byb2dyZXNzRWZmZWN0IiwiYmluZCIsInNwXzIiLCJoZWFkX2ljb24iLCJzZXRQYXJlbnQiLCJzaG93Iiwic2V0U2NhbGUiLCJzZXRQb3NpdGlvbiIsInNldEhlYWRSZXMiLCJmYWNlX2lkIiwicm9sZUx2VHh0X2xiIiwianMiLCJmb3JtYXRTdHIiLCJwYXJ0bmVyX2NvbmZpZyIsIkNvbmZpZyIsInBhcnRuZXJfZGF0YSIsImRhdGFfcGFydG5lcl9iYXNlIiwic2tpbl9jb25maWciLCJwYXJ0bmVyX3NraW5fZGF0YSIsImRhdGFfc2tpbl9pbmZvIiwibXZwX2Nvbl9uZCIsInBpY19iZyIsImJ1c3RfaWNvbl9zcCIsIlNwcml0ZSIsInJvbGVOYW1lVHh0X2xiIiwibmFtZSIsImJ1c3RpZCIsImJ1c3RfcmVzIiwiZ2V0UGFydG5lckJ1c3RSZXMiLCJsb2FkUmVzIiwiYmdfc2YiLCJzcHJpdGVGcmFtZSIsImh1cnRUeHRfbGIiLCJodXJ0UGVyY2VudCIsIk1hdGgiLCJmbG9vciIsImNlaWwiLCJOdW1iZXIiLCJoYW5kbGVFZmZlY3QiLCJzY3JvbGxfY29uX25kIiwidGFiX3NpemUiLCJzZXR0aW5nIiwiaXRlbV9jbGFzcyIsInN0YXJ0X3giLCJzcGFjZV94Iiwic3RhcnRfeSIsInNwYWNlX3kiLCJpdGVtX3dpZHRoIiwiaXRlbV9oZWlnaHQiLCJyb3ciLCJjb2wiLCJuZWVkX2R5bmFtaWMiLCJzY3JvbGxfdmlldyIsImNyZWF0ZVNjcm9sbCIsInYyIiwiU2Nyb2xsVmlld0RpciIsInZlcnRpY2FsIiwiU2Nyb2xsVmlld1N0YXJ0UG9zIiwidG9wIiwicmV3YXJkVmlld1VJIiwicmVnaXN0ZXJFdmVudCIsIm9uVG91Y2hFbmQiLCJvcGVuRmluaXNoVmlldyIsIm9wZW5CYXR0bGVIYXJtSW5mb1ZpZXciLCJiYXNlQ3VyTWF4RXhwIiwicm9sZV9kYXRhIiwiZGF0YV9yb2xlX2F0dHIiLCJleHBfbWF4IiwiYmFzZVBlcmNlbnQiLCJtYXhQZXJjZW50IiwiYXV0b19udW0iLCJjYWxsX2JhY2siLCJnY29yZSIsIlRpbWVyIiwiZGVsIiwicHJvZ3Jlc3NFZmZlY3QiLCJyZXMiLCJnZXRFZmZlY3RSZXMiLCJyZXNfb2JqZWN0Iiwic2tlbGV0b25EYXRhIiwic2V0QW5pbWF0aW9uIiwiUGxheWVyQWN0aW9uIiwiYWN0aW9uIiwic2V0Iiwic3RhdHVzIiwic2V0VG9TZXR1cFBvc2UiLCJjbGVhclRyYWNrcyIsImFjdGlvbl8xIiwic2V0RGF0YSIsImlzX3Nob3dfbmFtZSIsInVwZGF0ZVRpbWVyIiwidGltZSIsIm5ld190aW1lIiwic3RyIiwib3BlblJvb3RXbmQiLCJjbG9zZUNhbGxCYWNrIiwic3RvcEFsbEFjdGlvbnMiLCJvcGVuRXF1aXBUaXBzIiwiY2xvc2VBbGxUaXBzIiwiR2xvYmFsRXZlbnQiLCJmaXJlIiwiTU9WRV9EUkFNQV9FVkVOVCIsImdldEJhdHRsZVNjZW5lIiwiZ2V0SXNTYW1lQmF0dGxlVHlwZSIsImRlbGV0ZU1lIiwiQ0xPU0VfUkVTVUxUX1ZJRVciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUEsUUFBUSxHQUFHQyxPQUFPLENBQUMsVUFBRCxDQUF0Qjs7QUFDQSxJQUFJQyxXQUFXLEdBQUdELE9BQU8sQ0FBQyxjQUFELENBQXpCOztBQUNBLElBQUlFLFVBQVUsR0FBR0YsT0FBTyxDQUFDLFlBQUQsQ0FBeEI7O0FBQ0EsSUFBSUcsY0FBYyxHQUFHSCxPQUFPLENBQUMsaUJBQUQsQ0FBNUI7O0FBQ0Es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eEYsSUFBTCxDQUFVa0csY0FBVixDQUF5QixLQUF6QixFQUFnQyxLQUFLeEgsVUFBckM7QUFDQWtJLElBQUFBLEtBQUssQ0FBQ0MsS0FBTixDQUFZVSxHQUFaLENBQWdCLFlBQVc7QUFDdkJYLE1BQUFBLEtBQUssQ0FBQzJCLFdBQU4sQ0FBa0JDLElBQWxCLENBQXVCbkwsV0FBVyxDQUFDd0wsaUJBQW5DLEVBQXNELEtBQUtuSyxVQUEzRDtBQUNILEtBRmUsQ0FFZDJELElBRmMsQ0FFVCxJQUZTLENBQWhCLEVBRWMsR0FGZCxFQUVtQixDQUZuQjtBQUlIO0FBcFMyQixDQUFULENBQXZCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAg6L+Z6YeM5piv5o+P6L+w6L+Z5Liq56qX5L2T55qE5L2c55So55qEXG4vLyA8YnIvPkNyZWF0ZTogMjAxOS0wMy0yMiAxMTo1NzoxMVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBQYXRoVG9vbCA9IHJlcXVpcmUoXCJwYXRodG9vbFwiKTtcbnZhciBCYXR0bGVDb25zdCA9IHJlcXVpcmUoXCJiYXR0bGVfY29uc3RcIik7XG52YXIgUGxheWVySGVhZCA9IHJlcXVpcmUoXCJwbGF5ZXJoZWFkXCIpO1xudmFyIFJvbGVDb250cm9sbGVyID0gcmVxdWlyZShcInJvbGVfY29udHJvbGxlclwiKTtcbnZhciBCYXR0bGVDb250cm9sbGVyID0gcmVxdWlyZShcImJhdHRsZV9jb250cm9sbGVyXCIpO1xudmFyIEJhdHRsZUV2ZW50ID0gcmVxdWlyZShcImJhdHRsZV9ldmVudFwiKTtcbnZhciBDb21tb25TY3JvbGxWaWV3ID0gcmVxdWlyZShcImNvbW1vbl9zY3JvbGx2aWV3XCIpO1xudmFyIEJhdHRsZURyYW1hSG9va1Jld2FyZExpc3RQYW5lbCA9IHJlcXVpcmUoXCJiYXR0bGVfZHJhbWFfaG9va19yZXdhcmRfbGlzdF9wYW5lbFwiKTtcblxudmFyIEJhdHRsZV9tdnBXaW5kb3cgPSBjYy5DbGFzcyh7XG4gICAgZXh0ZW5kczogQmFzZVZpZXcsXG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnByZWZhYlBhdGggPSBQYXRoVG9vbC5nZXRQcmVmYWJQYXRoKFwiYmF0dGxlXCIsIFwiYmF0dGxlX212cF92aWV3XCIpO1xuICAgICAgICB0aGlzLnZpZXdUYWcgPSBTQ0VORV9UQUcuZGlhbG9ndWU7ICAgICAgICAgICAgICAgIC8v6K+l56qX5L2T5omA5bGedWnlsYLnuqcs5YWo5bGPdWnpnIDopoHlnKh1aeWxgizpnZ7lhajlsY91aeWcqGRpYWxvZ3Vl5bGCLOi/meS4quimgeazqOaEj1xuICAgICAgICB0aGlzLndpbl90eXBlID0gV2luVHlwZS5NaW5pOyAgICAgICAgICAgICAgIC8v5piv5ZCm5piv5YWo5bGP56qX5L2TICBXaW5UeXBlLkZ1bGwsIFdpblR5cGUuQmlnLCBXaW5UeXBlLk1pbmksIFdpblR5cGUuVGlwc1xuICAgICAgICB0aGlzLmRhdGEgPSBhcmd1bWVudHNbMF07XG5cbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIHRoaXMucmVzdWx0ID0gZGF0YS5yZXN1bHRcbiAgICAgICAgdGhpcy5yZXdhcmRfbGlzdCA9IGRhdGEuaXRlbV9yZXdhcmRzIHx8IHt9XG4gICAgICAgIHRoaXMuZmlnaHRfdHlwZSA9IGRhdGEuY29tYmF0X3R5cGUgfHwgQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5EYXJtYVxuICAgICAgICB0aGlzLnBhcnRuZXJfYmlkID0gZGF0YS5wYXJ0bmVyX2JpZCB8fCAwXG4gICAgICAgIHRoaXMucGFydG5lcl9odXJ0ID0gZGF0YS5wYXJ0bmVyX2h1cnQgfHwgMFxuICAgICAgICB0aGlzLnBhcnRuZXJfdG90YWxfaHVydCA9IGRhdGEucGFydG5lcl90b3RhbF9odXJ0IHx8IDBcbiAgICAgICAgdGhpcy5yb2xlX2V4cCA9IGRhdGEuZXhwIHx8IDBcbiAgICAgICAgdGhpcy5yb2xlX2x2ID0gZGF0YS5sZXYgfHwgMVxuICAgICAgICB0aGlzLnJvbGVfbm93bHYgPSBkYXRhLm5ld19sZXYgfHwgMVxuICAgICAgICB0aGlzLnJvbGVfbm93ZXhwID0gZGF0YS5uZXdfZXhwIHx8IDA7XG4gICAgICAgIHRoaXMudXNlX3NraW4gPSBkYXRhLnVzZV9za2luIHx8IDA7XG4gICAgfSxcblxuICAgIC8vIOWIneWni+WMluS4gOS6m+mFjee9ruaVsOaNrizlj6/ku6XnlKjkuo7lo7DmmI7kuIDkupvlj5jph4/kuYvnsbvnmoRcbiAgICBpbml0Q29uZmlnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYW5pX2lzb3ZlciA9IGZhbHNlXG4gICAgICAgIHRoaXMuaXRlbV9saXN0ID0ge31cblxuICAgICAgICB0aGlzLnJvbGVfdm8gPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpO1xuICAgICAgICB0aGlzLmN0cmwgPSBCYXR0bGVDb250cm9sbGVyLmdldEluc3RhbmNlKCk7XG4gICAgICAgIHRoaXMubW9kZWwgPSB0aGlzLmN0cmwuZ2V0TW9kZWwoKTtcbiAgICB9LFxuXG4gICAgLy8g6aKE5Yi25L2T5Yqg6L295a6M5oiQ5LmL5ZCO55qE5Zue6LCDLOWPr+S7peWcqOi/memHjOaNleiOt+ebuOWFs+iKgueCueaIluiAhee7hOS7tlxuICAgIG9wZW5DYWxsQmFjazogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm1haW5fY29udGFpbmVyID0gdGhpcy5zZWVrQ2hpbGQoXCJjb250YWluZXJcIik7XG4gICAgICAgIHRoaXMubWFpbl9jb250YWluZXIuekluZGV4ID0gMTtcbiAgICAgICAgdGhpcy5jb250YWluZXJTaXplID0gdGhpcy5tYWluX2NvbnRhaW5lci5nZXRDb250ZW50U2l6ZSgpO1xuXG4gICAgICAgIHRoaXMuYmFja2dyb3VuZCA9IHRoaXMucm9vdF93bmQuZ2V0Q2hpbGRCeU5hbWUoXCJiYWNrZ3JvdW5kXCIpO1xuICAgICAgICB0aGlzLmJhY2tncm91bmQuc2NhbGUgPSBGSVRfU0NBTEU7XG5cbiAgICAgICAgdGhpcy5hdXRvX2NvbWJhdF9udW1fbGIgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fY29udGFpbmVyLCBcImF1dG9fY29tYmF0X251bVwiLCBjYy5MYWJlbCk7XG4gICAgICAgIHRoaXMuYXV0b19jb21iYXRfbnVtX2xiLm5vZGUuYWN0aXZlID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5zZWVrQ2hpbGQoXCJwaWNfbXZwXCIpLnpJbmRleCA9IDE7XG5cbiAgICAgICAgdGhpcy50aW1lX2xhYmVsX3J0ID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJ0aW1lX2xhYmVsXCIsIGNjLlJpY2hUZXh0KTtcbiAgICAgICAgdGhpcy50aW1lX2xhYmVsX3J0LnN0cmluZyA9IFV0aWxzLlRJMThOKFwiNeenkuWQjuWFs+mXrVwiKTtcbiAgICAgICAgdGhpcy50aW1lX2xhYmVsX3J0Lm5vZGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29tZmlybV9idG4gPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fY29udGFpbmVyLCBcImNvbWZpcm1fYnRuXCIpO1xuICAgICAgICB0aGlzLmhhcm1fYnRuID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJoYXJtX2J0blwiKTtcblxuICAgICAgICBpZiAodGhpcy5kYXRhICYmIFV0aWxzLm5leHQodGhpcy5kYXRhKSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmhhcm1fYnRuLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhcm1fYnRuLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zcGVjaWFsX3NrID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJwbGF5X2VmZmVjdFwiLCBzcC5Ta2VsZXRvbik7XG5cblxuICAgICAgICAvL+i/m+W6puadoVxuICAgICAgICB0aGlzLnByb2dyZXNzX2JnX25kID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJzcHJpdGVfM1wiKTtcbiAgICAgICAgdGhpcy5zcHJpdGVfNF9uZCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMubWFpbl9jb250YWluZXIsIFwic3ByaXRlXzRcIik7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3NfcGIgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fY29udGFpbmVyLCBcInNwcml0ZV8zXCIsIGNjLlByb2dyZXNzQmFyKTtcbiAgICAgICAgdGhpcy5wcm9ncmVzc19wYi5wcm9ncmVzcyA9IDA7XG4gICAgICAgIHRoaXMucHJvVHh0X2xiID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJwcm9UeHRcIiwgY2MuTGFiZWwpO1xuICAgICAgICB0aGlzLnByb2dyZXNzX2JnX25kLmFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgICAgIC8v5bu26L+fMC4z56eS5pi+56S66L+b5bqm5p2h5Yqo55S7XG4gICAgICAgIFV0aWxzLmRlbGF5UnVuKHRoaXMucm9vdF93bmQsIDAuMywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5zaG93UHJvZ3Jlc3NFZmZlY3QoKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKVxuXG4gICAgICAgIC8v5aS05YOPXG4gICAgICAgIHZhciBzcF8yID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJzcHJpdGVfMlwiKTtcbiAgICAgICAgdGhpcy5oZWFkX2ljb24gPSBuZXcgUGxheWVySGVhZCgpO1xuICAgICAgICB0aGlzLmhlYWRfaWNvbi5zZXRQYXJlbnQoc3BfMik7XG4gICAgICAgIHRoaXMuaGVhZF9pY29uLnNob3coKTtcbiAgICAgICAgdGhpcy5oZWFkX2ljb24uc2V0U2NhbGUoMC44KTtcbiAgICAgICAgdGhpcy5oZWFkX2ljb24uc2V0UG9zaXRpb24oMCwgMCk7XG4gICAgICAgIHRoaXMuaGVhZF9pY29uLnNldEhlYWRSZXModGhpcy5yb2xlX3ZvLmZhY2VfaWQpO1xuXG4gICAgICAgIC8v562J57qnXG4gICAgICAgIHRoaXMucm9sZUx2VHh0X2xiID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJyb2xlTHZUeHRcIiwgY2MuTGFiZWwpO1xuICAgICAgICB0aGlzLnJvbGVMdlR4dF9sYi5zdHJpbmcgPSBjYy5qcy5mb3JtYXRTdHIoXCJMdi4lZFwiLCB0aGlzLnJvbGVfbm93bHYpO1xuXG4gICAgICAgIHZhciBwYXJ0bmVyX2NvbmZpZyA9IENvbmZpZy5wYXJ0bmVyX2RhdGEuZGF0YV9wYXJ0bmVyX2Jhc2VbdGhpcy5wYXJ0bmVyX2JpZF07XG4gICAgICAgIGxldCBza2luX2NvbmZpZyA9IENvbmZpZy5wYXJ0bmVyX3NraW5fZGF0YS5kYXRhX3NraW5faW5mb1t0aGlzLnVzZV9za2luXTtcblxuICAgICAgICB0aGlzLm12cF9jb25fbmQgPSB0aGlzLnNlZWtDaGlsZChcIm12cF9jb25cIik7XG5cbiAgICAgICAgLy/lkI3np7Dlkoznq4vnu5hcbiAgICAgICAgdmFyIHBpY19iZyA9IHRoaXMuc2Vla0NoaWxkKHRoaXMubXZwX2Nvbl9uZCwgXCJwaWNfYmdcIik7XG4gICAgICAgIHRoaXMuYnVzdF9pY29uX3NwID0gdGhpcy5zZWVrQ2hpbGQoXCJidXN0SWNvblwiLCBjYy5TcHJpdGUpO1xuICAgICAgICBwaWNfYmcuekluZGV4ID0gMTtcbiAgICAgICAgdGhpcy5yb2xlTmFtZVR4dF9sYiA9IHRoaXMuc2Vla0NoaWxkKHBpY19iZywgXCJyb2xlTmFtZVR4dFwiLCBjYy5MYWJlbCk7XG4gICAgICAgIGlmIChwYXJ0bmVyX2NvbmZpZykge1xuICAgICAgICAgICAgdGhpcy5yb2xlTmFtZVR4dF9sYi5zdHJpbmcgPSBwYXJ0bmVyX2NvbmZpZy5uYW1lO1xuICAgICAgICAgICAgdmFyIGJ1c3RpZCA9IG51bGw7XG4gICAgICAgICAgICBpZihza2luX2NvbmZpZyl7XG4gICAgICAgICAgICAgICAgYnVzdGlkID0gc2tpbl9jb25maWcuYnVzdGlkO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgYnVzdGlkID0gcGFydG5lcl9jb25maWcuYnVzdGlkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgYnVzdF9yZXMgPSBQYXRoVG9vbC5nZXRQYXJ0bmVyQnVzdFJlcyhidXN0aWQpO1xuICAgICAgICAgICAgdGhpcy5sb2FkUmVzKGJ1c3RfcmVzLCBmdW5jdGlvbiAoYmdfc2YpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1c3RfaWNvbl9zcC5zcHJpdGVGcmFtZSA9IGJnX3NmO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8v5Lyk5a6z6L6T5Ye6XG4gICAgICAgIHZhciBodXJ0VHh0X2xiID0gdGhpcy5zZWVrQ2hpbGQocGljX2JnLCBcImh1cnRUeHRcIiwgY2MuTGFiZWwpO1xuICAgICAgICB2YXIgaHVydFBlcmNlbnQgPSBjYy5qcy5mb3JtYXRTdHIoXCIlc1wiLCBNYXRoLmZsb29yKHRoaXMucGFydG5lcl9odXJ0IC8gdGhpcy5wYXJ0bmVyX3RvdGFsX2h1cnQgKiAxMDApKSArIFwiJVwiO1xuICAgICAgICBodXJ0VHh0X2xiLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihcIiVkKCVzKVwiLCBNYXRoLmNlaWwoTnVtYmVyKHRoaXMucGFydG5lcl9odXJ0KSksIGh1cnRQZXJjZW50KTtcblxuICAgICAgICAvL+aYvuekuueJueaViFxuICAgICAgICB0aGlzLmhhbmRsZUVmZmVjdCh0cnVlKTtcblxuICAgICAgICB0aGlzLnNjcm9sbF9jb25fbmQgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fY29udGFpbmVyLCBcInNjcm9sbF9jb25cIik7XG4gICAgICAgIHZhciB0YWJfc2l6ZSA9IHRoaXMuc2Nyb2xsX2Nvbl9uZC5nZXRDb250ZW50U2l6ZSgpO1xuICAgICAgICB2YXIgc2V0dGluZyA9IHtcbiAgICAgICAgICAgIGl0ZW1fY2xhc3M6IEJhdHRsZURyYW1hSG9va1Jld2FyZExpc3RQYW5lbCwgICAgICAvLyDljZXlhYPnsbtcbiAgICAgICAgICAgIHN0YXJ0X3g6IDk0LCAgICAgICAgICAgICAgICAgICAgLy8g56ys5LiA5Liq5Y2V5YWD55qEWOi1t+eCuVxuICAgICAgICAgICAgc3BhY2VfeDogMjAsICAgICAgICAgICAgICAgICAgICAvLyB45pa55ZCR55qE6Ze06ZqUXG4gICAgICAgICAgICBzdGFydF95OiAwLCAgICAgICAgICAgICAgICAgICAgLy8g56ys5LiA5Liq5Y2V5YWD55qEWei1t+eCuVxuICAgICAgICAgICAgc3BhY2VfeTogMCwgICAgICAgICAgICAgICAgICAgLy8geeaWueWQkeeahOmXtOmalFxuICAgICAgICAgICAgaXRlbV93aWR0aDogMTIwLCAgICAgICAgICAgICAgIC8vIOWNleWFg+eahOWwuuWvuHdpZHRoXG4gICAgICAgICAgICBpdGVtX2hlaWdodDogMTgwLCAgICAgICAgICAgICAgLy8g5Y2V5YWD55qE5bC65a+4aGVpZ2h0XG4gICAgICAgICAgICByb3c6IDEsICAgICAgICAgICAgICAgICAgICAgICAgLy8g6KGM5pWw77yM5L2c55So5LqO5rC05bmz5rua5Yqo57G75Z6LXG4gICAgICAgICAgICBjb2w6IDQsICAgICAgICAgICAgICAgICAgICAgICAgLy8g5YiX5pWw77yM5L2c55So5LqO5Z6C55u05rua5Yqo57G75Z6LXG4gICAgICAgICAgICBuZWVkX2R5bmFtaWM6IHRydWVcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNjcm9sbF92aWV3ID0gbmV3IENvbW1vblNjcm9sbFZpZXcoKTtcbiAgICAgICAgdGhpcy5zY3JvbGxfdmlldy5jcmVhdGVTY3JvbGwodGhpcy5zY3JvbGxfY29uX25kLCBjYy52MigwLCAwKSwgU2Nyb2xsVmlld0Rpci52ZXJ0aWNhbCwgU2Nyb2xsVmlld1N0YXJ0UG9zLnRvcCwgdGFiX3NpemUsIHNldHRpbmcsIGNjLnYyKDAuNSwgMC41KSlcbiAgICAgICAgdGhpcy5yZXdhcmRWaWV3VUkoKTtcbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM5LqL5Lu255uR5ZCs55qE5o6l5Y+jLOS4jemcgOimgeaJi+WKqOiwg+eUqCzlpoLmnpzmmK/kvb/nlKhnY29yZS5HbG9iYWxFdmVudOebkeWQrCzlj6/ku6Xnm7TmjqXosIPnlKhhZGRHbG9iYWxFdmVudFxuICAgIHJlZ2lzdGVyRXZlbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLmNvbWZpcm1fYnRuLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hbmlfaXNvdmVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5GaW5pc2hWaWV3KGZhbHNlLCB0aGlzLmZpZ2h0X3R5cGUpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKSwgMSlcbiAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLmhhcm1fYnRuLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhICYmIFV0aWxzLm5leHQodGhpcy5kYXRhKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5CYXR0bGVIYXJtSW5mb1ZpZXcodHJ1ZSwgdGhpcy5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfS5iaW5kKHRoaXMpLCAxKVxuICAgIH0sXG5cbiAgICBzaG93UHJvZ3Jlc3NFZmZlY3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJhc2VDdXJNYXhFeHAgPSBDb25maWcucm9sZV9kYXRhLmRhdGFfcm9sZV9hdHRyW3RoaXMucm9sZV9sdl0uZXhwX21heDtcbiAgICAgICAgdmFyIGJhc2VQZXJjZW50ID0gdGhpcy5yb2xlX2V4cCAvIGJhc2VDdXJNYXhFeHA7XG4gICAgICAgIHZhciBtYXhQZXJjZW50ID0gdGhpcy5yb2xlX25vd2V4cCAvIGJhc2VDdXJNYXhFeHA7XG4gICAgICAgIGlmICh0aGlzLnJvbGVfbHYgIT0gdGhpcy5yb2xlX25vd2x2KSB7Ly/mnInljYfnuqdcbiAgICAgICAgICAgIG1heFBlcmNlbnQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRhdGEuYXV0b19udW0gJiYgdGhpcy5kYXRhLmF1dG9fbnVtID4gMCkge1xuICAgICAgICAgICAgdGhpcy5hdXRvX2NvbWJhdF9udW1fbGIubm9kZS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5hdXRvX2NvbWJhdF9udW1fbGIuc3RyaW5nID0gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwi5bey6L+e57ut6YCa6L+H5YWz5Y2h5pWw77yaJXNcIiksIHRoaXMuZGF0YS5hdXRvX251bSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnByb2dyZXNzX3BiLnByb2dyZXNzID0gYmFzZVBlcmNlbnQ7XG4gICAgICAgIHRoaXMucHJvVHh0X2xiLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihcIiVkLyVkXCIsIE51bWJlcih0aGlzLnJvbGVfZXhwKSwgTnVtYmVyKGJhc2VDdXJNYXhFeHApKTtcbiAgICAgICAgdGhpcy5wcm9ncmVzc19iZ19uZC5hY3RpdmUgPSB0cnVlO1xuXG4gICAgICAgIHZhciBjYWxsX2JhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBiYXNlUGVyY2VudCA9IGJhc2VQZXJjZW50ICsgMC4wMTtcbiAgICAgICAgICAgIGlmIChiYXNlUGVyY2VudCA+IG1heFBlcmNlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yb2xlX2x2ID09IHRoaXMucm9sZV9ub3dsdikge1xuICAgICAgICAgICAgICAgICAgICBiYXNlQ3VyTWF4RXhwID0gQ29uZmlnLnJvbGVfZGF0YS5kYXRhX3JvbGVfYXR0clt0aGlzLnJvbGVfbm93bHZdLmV4cF9tYXg7XG4gICAgICAgICAgICAgICAgICAgIGJhc2VQZXJjZW50ID0gdGhpcy5yb2xlX25vd2V4cCAvIGJhc2VDdXJNYXhFeHA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NfcGIucHJvZ3Jlc3MgPSBiYXNlUGVyY2VudDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9UeHRfbGIuc3RyaW5nID0gY2MuanMuZm9ybWF0U3RyKFwiJWQvJWRcIiwgdGhpcy5yb2xlX25vd2V4cCwgTnVtYmVyKGJhc2VDdXJNYXhFeHApKVxuICAgICAgICAgICAgICAgICAgICBnY29yZS5UaW1lci5kZWwoXCJtdnBfcHJvZ3Jlc3NfdGltZXJcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy/mkq3mlL7ljYfnuqfnibnmlYhcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvZ3Jlc3NFZmZlY3QgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9ncmVzc0VmZmVjdCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuc3ByaXRlXzRfbmQsIFwiZWZmZWN0XCIsIHNwLlNrZWxldG9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXMgPSBjYy5qcy5mb3JtYXRTdHIoXCJzcGluZS8lcy9hY3Rpb24uYXRsYXNcIiwgUGF0aFRvb2wuZ2V0RWZmZWN0UmVzKDI3NSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkUmVzKHJlcywgZnVuY3Rpb24gKHJlc19vYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2dyZXNzRWZmZWN0LnNrZWxldG9uRGF0YSA9IHJlc19vYmplY3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9ncmVzc0VmZmVjdC5zZXRBbmltYXRpb24oMCwgUGxheWVyQWN0aW9uLmFjdGlvbiwgZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2dyZXNzRWZmZWN0LnNldEFuaW1hdGlvbigwLCBQbGF5ZXJBY3Rpb24uYWN0aW9uLCBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvbGVfbHYgPSB0aGlzLnJvbGVfbHYgKyAxO1xuICAgICAgICAgICAgICAgICAgICBiYXNlUGVyY2VudCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIG1heFBlcmNlbnQgPSAxO1xuICAgICAgICAgICAgICAgICAgICBiYXNlQ3VyTWF4RXhwID0gQ29uZmlnLnJvbGVfZGF0YS5kYXRhX3JvbGVfYXR0clt0aGlzLnJvbGVfbHZdLmV4cF9tYXg7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvbGVfbHYgPT0gdGhpcy5yb2xlX25vd2x2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhQZXJjZW50ID0gdGhpcy5yb2xlX25vd2V4cCAvIENvbmZpZy5yb2xlX2RhdGEuZGF0YV9yb2xlX2F0dHJbdGhpcy5yb2xlX25vd2x2XS5leHBfbWF4O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2dyZXNzX3BiLnByb2dyZXNzID0gYmFzZVBlcmNlbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9UeHRfbGIuc3RyaW5nID0gY2MuanMuZm9ybWF0U3RyKFwiJWQvJWRcIiwgTWF0aC5jZWlsKGJhc2VDdXJNYXhFeHAgKiBiYXNlUGVyY2VudCksIE51bWJlcihiYXNlQ3VyTWF4RXhwKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgIGdjb3JlLlRpbWVyLnNldChjYWxsX2JhY2ssIDEwLCAtMSwgXCJtdnBfcHJvZ3Jlc3NfdGltZXJcIik7XG4gICAgfSxcblxuICAgIGhhbmRsZUVmZmVjdDogZnVuY3Rpb24gKHN0YXR1cykge1xuICAgICAgICBpZiAoc3RhdHVzID09IGZhbHNlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zcGVjaWFsX3NrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zcGVjaWFsX3NrLnNldFRvU2V0dXBQb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zcGVjaWFsX3NrLmNsZWFyVHJhY2tzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zcGVjaWFsX3NrLm5vZGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9ncmVzc0VmZmVjdCkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NFZmZlY3Quc2V0VG9TZXR1cFBvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2dyZXNzRWZmZWN0LmNsZWFyVHJhY2tzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9ncmVzc0VmZmVjdC5ub2RlLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3BlY2lhbF9zaykge1xuICAgICAgICAgICAgICAgIHRoaXMuc3BlY2lhbF9zay5ub2RlLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdmFyIHJlcyA9IGNjLmpzLmZvcm1hdFN0cihcInNwaW5lLyVzL2FjdGlvbi5hdGxhc1wiLCBQYXRoVG9vbC5nZXRFZmZlY3RSZXMoMjc0KSlcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRSZXMocmVzLCBmdW5jdGlvbiAocmVzX29iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNwZWNpYWxfc2suc2tlbGV0b25EYXRhID0gcmVzX29iamVjdDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGVjaWFsX3NrLnNldEFuaW1hdGlvbigxLCBQbGF5ZXJBY3Rpb24uYWN0aW9uXzEsIGZhbHNlKVxuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+WlluWKseeVjOmdolxuICAgIHJld2FyZFZpZXdVSTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMucmV3YXJkX2xpc3QpIHJldHVyblxuICAgICAgICB0aGlzLnNjcm9sbF92aWV3LnNldERhdGEodGhpcy5yZXdhcmRfbGlzdCwgbnVsbCwgeyBpc19zaG93X25hbWU6IHRydWUgfSk7XG5cbiAgICAgICAgVXRpbHMuZGVsYXlSdW4odGhpcy5tYWluX2NvbnRhaW5lciwgMC41LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmFuaV9pc292ZXIgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUaW1lcigpO1xuICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgfSxcblxuICAgIHVwZGF0ZVRpbWVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudGltZV9sYWJlbF9ydC5ub2RlLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIHRoaXMuY29tZmlybV9idG4uYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgdmFyIHRpbWUgPSA1O1xuICAgICAgICB2YXIgY2FsbF9iYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGltZSA9IHRpbWUgLSAxXG4gICAgICAgICAgICB2YXIgbmV3X3RpbWUgPSBNYXRoLmNlaWwodGltZSk7XG4gICAgICAgICAgICB2YXIgc3RyID0gbmV3X3RpbWUgKyBVdGlscy5USTE4TihcIuenkuWQjuWFs+mXrVwiKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnRpbWVfbGFiZWxfcnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVfbGFiZWxfcnQuc3RyaW5nID0gc3RyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5ld190aW1lIDw9IDApIHtcbiAgICAgICAgICAgICAgICBnY29yZS5UaW1lci5kZWwoXCJtdnBfY2xvc2VfdGltZXJcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5GaW5pc2hWaWV3KGZhbHNlLCB0aGlzLmZpZ2h0X3R5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgZ2NvcmUuVGltZXIuc2V0KGNhbGxfYmFjaywgMTAwMCwgLTEsIFwibXZwX2Nsb3NlX3RpbWVyXCIpO1xuICAgIH0sXG5cbiAgICAvLyDpooTliLbkvZPliqDovb3lrozmiJDkuYvlkI4s5re75Yqg5Yiw5a+55bqU5Li76IqC54K55LmL5ZCO55qE5Zue6LCDLOS5n+WwseaYr+S4gOS4queql+S9k+eahOato+W8j+WFpeWPoyzlj6/ku6Xorr7nva7kuIDkupvmlbDmja7kuoZcbiAgICBvcGVuUm9vdFduZDogZnVuY3Rpb24gKCkge1xuXG4gICAgfSxcblxuICAgIC8vIOWFs+mXreeql+S9k+WbnuiwgyzpnIDopoHlnKjov5nph4zosIPnlKjor6XnqpfkvZPmiYDlsZ5jb250cm9sbGVy55qEY2xvc2Xmlrnms5XmsqHnlKjkuo7nva7nqbror6XnqpfkvZPlrp7kvovlr7nosaFcbiAgICBjbG9zZUNhbGxCYWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucm9vdF93bmQuc3RvcEFsbEFjdGlvbnMoKTtcbiAgICAgICAgdGhpcy5tYWluX2NvbnRhaW5lci5zdG9wQWxsQWN0aW9ucygpO1xuXG4gICAgICAgIGdjb3JlLlRpbWVyLmRlbChcIm12cF9jbG9zZV90aW1lclwiKTtcbiAgICAgICAgZ2NvcmUuVGltZXIuZGVsKFwibXZwX3Byb2dyZXNzX3RpbWVyXCIpO1xuICAgICAgICByZXF1aXJlKFwiaGVyb19jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3BlbkVxdWlwVGlwcyhmYWxzZSlcbiAgICAgICAgcmVxdWlyZShcInRpcHNfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLmNsb3NlQWxsVGlwcygpO1xuICAgICAgICBcblxuICAgICAgICBpZiAodGhpcy5maWdodF90eXBlID09IEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuRGFybWEpIHtcbiAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoQmF0dGxlRXZlbnQuTU9WRV9EUkFNQV9FVkVOVCwgdGhpcy5maWdodF90eXBlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhhbmRsZUVmZmVjdChmYWxzZSlcbiAgICAgICAgaWYgKHRoaXMubW9kZWwuZ2V0QmF0dGxlU2NlbmUoKSAmJiB0aGlzLmN0cmwuZ2V0SXNTYW1lQmF0dGxlVHlwZSh0aGlzLmZpZ2h0X3R5cGUpKSB7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLnJlc3VsdCh0aGlzLmRhdGEsIG51bGwpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsX3ZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsX3ZpZXcuZGVsZXRlTWUoKTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsX3ZpZXcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3RybC5vcGVuRmluaXNoVmlldyhmYWxzZSwgdGhpcy5maWdodF90eXBlKVxuICAgICAgICBnY29yZS5UaW1lci5zZXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEJhdHRsZUV2ZW50LkNMT1NFX1JFU1VMVF9WSUVXLCB0aGlzLmZpZ2h0X3R5cGUpO1xuICAgICAgICB9LmJpbmQodGhpcyksIDIwMCwgMSlcbiAgICAgICBcbiAgICB9LFxufSkiXX0=