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
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/primus/view/primus_challenge_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, 'bc034lVSFJIUoazB/hWXMt2', 'primus_challenge_window');
// Scripts/mod/primus/view/primus_challenge_window.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//     这里是描述这个窗体的作用的
// <br/>Create: 2019-03-16 10:26:46
// --------------------------------------------------------------------
var PathTool = require("pathtool");
 
var RoleController = require("role_controller");
 
var ArenaController = require("arena_controller");
 
var PlayerHead = require("playerhead");
 
var FriendController = require("friend_controller");
 
var PartnerCalculate = require("partner_calculate");
 
var BaseRole = require("baserole");
 
var Primus_challengeWindow = cc.Class({
  "extends": BaseView,
  ctor: function ctor() {
    this.prefabPath = PathTool.getPrefabPath("primus", "primus_challenge_panel");
    this.viewTag = SCENE_TAG.ui; //该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意
 
    this.win_type = WinType.Mini; //是否是全屏窗体  WinType.Full, WinType.Big, WinType.Mini, WinType.Tips
 
    this.ctrl = arguments[0];
    this.model = this.ctrl.getModel();
  },
  // 初始化一些配置数据,可以用于声明一些变量之类的
  initConfig: function initConfig() {
    // 属性列表
    this.attr_label_list = [];
    this.attr_icon_list = []; // 复选框
 
    this.checkbox_list = [];
    this.checkbox_counts = [1, 5, 10]; // boss 主动技能
 
    this.act_skill_item_list = []; // boss 被动技能
 
    this.passive_skill_item_list = []; // 技能宽高
 
    this.skill_width = 88;
  },
  // 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件
  openCallBack: function openCallBack() {
    this.background = this.root_wnd.getChildByName("background");
    this.background.scale = FIT_SCALE;
    this.main_container = this.root_wnd.getChildByName("main_container");
    this.main_panel = this.main_container.getChildByName("main_panel");
    this.close_btn = this.main_panel.getChildByName("close_btn");
    this.win_title = this.main_panel.getChildByName("win_title").getComponent(cc.Label);
    this.win_title.string = Utils.TI18N("神殿挑战");
    this.primus_bigbg_3_node = this.main_panel.getChildByName("primus_bigbg_3");
    this.primus_bigbg_3_node.scale = 2;
    this.primus_bigbg_3 = this.primus_bigbg_3_node.getComponent(cc.Sprite);
    this.loadRes(PathTool.getBigBg("primus_bigbg_3", null, "primus"), function (resObject) {
      if (this.primus_bigbg_3) {
        this.primus_bigbg_3.spriteFrame = resObject;
      }
    }.bind(this));
    this.record_btn = this.main_panel.getChildByName("record_btn"); // 站台
 
    var station_lay = this.main_panel.getChildByName("station_lay");
    this.mode_node = station_lay.getChildByName("mode_node");
    this.occupant_tips = station_lay.getChildByName("occupant_tips").getComponent(cc.Label);
    this.tips_node = station_lay.getChildByName("tips_node");
    this.head_node = station_lay.getChildByName("head_node");
    this.title_img = station_lay.getChildByName("title_img").getComponent(cc.Sprite);
    this.name = station_lay.getChildByName("name").getComponent(cc.Label);
    this.name_bg = station_lay.getChildByName("name_bg"); // boss技能
 
    var boss_panel = this.main_panel.getChildByName("boss_panel");
    var desc_label = boss_panel.getChildByName("desc_label").getComponent(cc.Label);
    var desc_label_1 = boss_panel.getChildByName("desc_label_1").getComponent(cc.Label);
    var desc_label_2 = boss_panel.getChildByName("desc_label_2").getComponent(cc.Label);
    desc_label.string = Utils.TI18N("Boss技能");
    desc_label_1.string = Utils.TI18N("主动技能");
    desc_label_2.string = Utils.TI18N("被动技能"); // 主动技能scrollview
 
    this.item_container_1 = boss_panel.getChildByName("item_container_1").getChildByName("content"); // 被动技能scrollview
 
    this.item_container_2 = boss_panel.getChildByName("item_container_2").getChildByName("content"); // 属性
 
    this.attr_panel = this.main_panel.getChildByName("attr_panel");
    this.arrt_title = this.attr_panel.getChildByName("title").getComponent(cc.Label);
 
    for (var i = 0; i < 4; i++) {
      this.attr_label_list[i] = this.attr_panel.getChildByName("attr_label" + (i + 1)).getComponent(cc.Label);
      this.attr_icon_list[i] = this.attr_panel.getChildByName("attr_icon" + (i + 1)).getComponent(cc.Sprite);
    }
 
    this.arrt_title.string = Utils.TI18N("神位称号属性加成"); // 复选框
 
    var box_panel = this.main_panel.getChildByName("box_panel");
    this.checkbox_list[0] = box_panel.getChildByName("checkbox1");
    this.checkbox_list[1] = box_panel.getChildByName("checkbox5");
    this.checkbox_list[2] = box_panel.getChildByName("checkbox10");
    var name = this.checkbox_list[0].getChildByName("name").getComponent(cc.Label);
    name.string = cc.js.formatStr(Utils.TI18N("进化%s次"), this.checkbox_counts[0]);
    name = this.checkbox_list[1].getChildByName("name").getComponent(cc.Label);
    name.string = cc.js.formatStr(Utils.TI18N("进化%s次"), this.checkbox_counts[1]);
    name = this.checkbox_list[2].getChildByName("name").getComponent(cc.Label);
    name.string = cc.js.formatStr(Utils.TI18N("进化%s次"), this.checkbox_counts[2]);
    this.select_checkbox = 0;
    this.warning_tips = box_panel.getChildByName("warning_tips").getComponent(cc.Label);
    this.warning_tips.string = Utils.TI18N("(难度大请谨慎)");
    this.tips_name = this.main_panel.getChildByName("tips_name").getComponent(cc.Label);
    this.challenge_btn = this.main_panel.getChildByName("challenge_btn");
    var goto_node = this.main_panel.getChildByName("goto_node");
    this.gotoe_label = Utils.createRichLabel(24, new cc.Color(36, 144, 3, 255), cc.v2(0, 0.5), cc.v2(0, 0), 30, 125);
    this.gotoe_label.horizontalAlign = cc.macro.TextAlignment.LEFT;
    this.gotoe_label.string = cc.js.formatStr("<u>%s</u>", Utils.TI18N("前往竞技场"));
    goto_node.addChild(this.gotoe_label.node);
    var tips_node = this.main_panel.getChildByName("tips_node");
    this.tips_label = Utils.createRichLabel(22, new cc.Color(169, 95, 16, 255), cc.v2(0.5, 0.5), cc.v2(0, 0), 30, 1280);
    tips_node.addChild(this.tips_label.node);
  },
  // 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
  registerEvent: function registerEvent() {
    Utils.onTouchEnd(this.gotoe_label.node, function () {
      var ArenaController = require("arena_controller");
 
      ArenaController.getInstance().requestOpenArenWindow();
      this.ctrl.openPrimusChallengePanel(false);
    }.bind(this), 1);
    Utils.onTouchEnd(this.close_btn, function () {
      this.ctrl.openPrimusChallengePanel(false);
    }.bind(this), 2);
    Utils.onTouchEnd(this.record_btn, function () {
      this._onClickChallengeRecordBtn();
    }.bind(this), 2);
    Utils.onTouchEnd(this.challenge_btn, function () {
      this._onClickChallengeBtn();
    }.bind(this), 2);
 
    for (var i in this.checkbox_list) {
      Utils.onTouchEnd(this.checkbox_list[i], function (i) {
        if (this.sever_data) {
          this.select_checkbox = i;
          this.setSelectCheckBox();
          var num = this.sever_data.num + this.checkbox_counts[i];
          this.initBossSkill(num);
        }
      }.bind(this, i), 1);
    } // -- this:addGlobalEvent(TaskEvent.UpdateUIRedStatus, function(key, value)
    // --     this:updateUIRedStatus(key)
    // -- end)
 
  },
  // 去挑战去
  _onClickChallengeBtn: function _onClickChallengeBtn() {
    if (!this.sever_data) return;
 
    var _send20702 = function () {
      var num = this.checkbox_counts[this.select_checkbox];
      this.ctrl.sender20702(this.sever_data.pos, num);
    }.bind(this);
 
    if (this.is_have_title) {
      var CommonAlert = require("commonalert");
 
      CommonAlert.show(Utils.TI18N("您当前已占有一个神位,若挑战其他神位成功,将失去原有神位,是否继续挑战?"), Utils.TI18N("确定"), _send20702, Utils.TI18N("取消"));
    } else {
      _send20702();
    }
  },
  // 查看挑战记录
  _onClickChallengeRecordBtn: function _onClickChallengeRecordBtn() {
    if (!this.sever_data) return;
    this.ctrl.sender20703(this.sever_data.pos);
  },
  // 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了
  openRootWnd: function openRootWnd(data) {
    if (!data) return;
    if (data.length < 2) return;
    this.is_have_title = data[1];
    this.sever_data = data[0];
    this.var_data = Config.primus_data.data_upgrade[this.sever_data.pos];
    var honor_data = Config.honor_data.data_title[this.var_data.honor_id];
 
    if (honor_data && this.title_img) {
      var res = PathTool.getHonorRes(honor_data.res_id);
      this.loadRes(res, function (resObject) {
        if (this.title_img) {
          this.title_img.spriteFrame = resObject;
        }
      }.bind(this));
    }
 
    if (this.tips_node && this.var_data) {
      var str = cc.js.formatStr(Utils.TI18N("<color=#ffffff>已进化<color=#14ff32>%s</color>次</color>"), this.sever_data.num);
      var label = Utils.createRichLabel(24, new cc.Color(0xff, 0xff, 0xff, 0xff), cc.v2(0.5, 0.5), cc.v2(0, 0), 30);
      label.string = str;
      this.tips_node.addChild(label.node);
    }
 
    if (this.sever_data.name != null || this.sever_data.name != "") {
      var roleVo = RoleController.getInstance().getRoleVo();
 
      if (roleVo && this.sever_data.rid == roleVo.rid && this.sever_data.srv_id == roleVo.srv_id) {
        // 是自己
        this.tips_name.string = Utils.TI18N("已占领神位");
        this.challenge_btn.active = false;
        this.gotoe_label.node.active = false;
      }
    } // 更新模型
 
 
    if (this.var_data) {
      this.updateSpine(this.var_data.look_id);
    } // 头像
 
 
    this.initHeadUi(); // boss技能
 
    this.initBossSkill(this.sever_data.num); // 称号属性
 
    this.initHonorAttribute();
    this.setSelectCheckBox();
    this.updateTipsLabel();
  },
  updateTipsLabel: function updateTipsLabel() {
    var my_data = ArenaController.getInstance().getModel().getMyLoopData();
 
    if (this.tips_label && this.var_data) {
      if (my_data && my_data.rank && my_data.rank > 0) {
        this.tips_label.string = cc.js.formatStr(Utils.TI18N("挑战条件:当前竞技场处于前%s名(我的排名:<color=#249003>%s</color>)"), this.var_data.arena_rank, my_data.rank);
      } else {
        this.tips_label.string = cc.js.formatStr(Utils.TI18N("挑战条件:当前竞技场处于前%s名(我的排名:<color=#249003>无</color>)"), this.var_data.arena_rank);
      }
    }
  },
  // 初始化头像ui
  initHeadUi: function initHeadUi() {
    if (!this.sever_data) return;
 
    if (this.sever_data.name == null || this.sever_data.name == "") {
      this.occupant_tips.string = Utils.TI18N("虚位以待");
      this.name_bg.active = false;
      this.name.node.active = false;
      return;
    } // 头像
 
 
    this.play_head = new PlayerHead(); //cc.size(96,96)
 
    this.play_head.setPosition(0, 0); // this.play_head.setScale(0.95);
 
    if (this.sever_data.lev) {
      this.play_head.setLev(this.sever_data.lev);
    }
 
    this.play_head.setParent(this.head_node);
    this.play_head.show();
    this.play_head.setHeadRes(this.sever_data.face_id);
    this.name.string = this.sever_data.name;
    this.play_head.addCallBack(function () {
      FriendController.getInstance().openFriendCheckPanel(true, {
        srv_id: this.sever_data.srv_id,
        rid: this.sever_data.rid
      });
    }.bind(this));
  },
  initHonorAttribute: function initHonorAttribute() {
    if (!this.var_data) return;
    if (!this.attr_label_list) return;
    if (!this.attr_icon_list) return;
    var honor_data = Config.honor_data.data_title[this.var_data.honor_id];
 
    if (honor_data) {
      for (var i in this.attr_label_list) {
        var icon = this.attr_icon_list[i];
 
        if (honor_data.attr[i]) {
          this.attr_label_list[i].node.active = true;
          var atrr_name = Config.attr_data.data_key_to_name[honor_data.attr[i][0]];
 
          if (PartnerCalculate.isShowPerByStr(honor_data.attr[i][0])) {
            var value = honor_data.attr[i][1] / 10;
            this.attr_label_list[i].string = cc.js.formatStr("%s + %s%", Utils.TI18N(atrr_name), value);
          } else {
            this.attr_label_list[i].string = cc.js.formatStr("%s + %s ", Utils.TI18N(atrr_name), honor_data.attr[i][1]);
          }
 
          if (icon) {
            icon.node.active = true;
            var res_id = PathTool.getAttrIconByStr(honor_data.attr[i][0]);
            var res = PathTool.getCommonIcomPath(res_id);
            this.loadRes(res, function (icon, resObject) {
              if (icon) {
                icon.spriteFrame = resObject;
              }
            }.bind(this, icon));
          }
        } else {
          this.attr_label_list[i].node.active = false;
 
          if (icon) {
            icon.node.active = false;
          }
        }
      }
    }
  },
  initBossSkill: function initBossSkill(num) {
    if (this.unit_data_list == null) {
      this.unit_data_list = [];
 
      for (var i in Config.primus_data.data_unitdata) {
        if (this.sever_data.pos == Config.primus_data.data_unitdata[i].pos) {
          this.unit_data_list.push(Config.primus_data.data_unitdata[i]);
        }
      }
    }
 
    var cur_data = null;
    var length = this.unit_data_list.length;
 
    for (var j in this.unit_data_list) {
      if (num >= this.unit_data_list[j].min && num <= this.unit_data_list[j].max) {
        cur_data = this.unit_data_list[j];
        break;
      }
 
      if (j + 1 == length) {
        cur_data = this.unit_data_list[j];
      }
    }
 
    if (cur_data == null) {
      return;
    }
 
    if (this.cur_unit_data && this.cur_unit_data.min == cur_data.min) {
      // 同一个对象.不用初始化
      return;
    }
 
    this.cur_unit_data = cur_data;
    var act_skill = cur_data.act_skill;
    var passive_skill = cur_data.passive_skill; // 主动技能
 
    var item_width = this.skill_width * act_skill.length;
    var max_width = Math.max(this.item_container_1.getContentSize().width, item_width);
    this.item_container_1.setContentSize(cc.size(max_width, this.item_container_1.getContentSize().height));
 
    for (var i in act_skill) {
      var vo = gdata("skill_data", "data_get_skill", act_skill[i]);
 
      if (vo) {
        if (this.act_skill_item_list[i] == null) {
          this.act_skill_item_list[i] = {};
          this.act_skill_item_list[i] = this.updateSkillItem(vo, this.act_skill_item_list[i], true);
          this.item_container_1.addChild(this.act_skill_item_list[i].con);
        } else {
          this.updateSkillItem(vo, this.act_skill_item_list[i]);
        }
 
        this.act_skill_item_list[i].con.setPosition((this.skill_width + 5) * i + this.skill_width / 2, this.skill_width / 2);
      } else {
        console.log(cc.js.formatStr("技能表id: %s 没发现", act_skill[i].toString()));
      }
    } // 被动技能
 
 
    var item_width = this.skill_width * passive_skill.length;
    var max_width = Math.max(this.item_container_2.getContentSize().width, item_width);
    this.item_container_2.setContentSize(cc.size(max_width, this.item_container_2.getContentSize().height));
 
    for (var i in passive_skill) {
      var vo = gdata("skill_data", "data_get_skill", passive_skill[i]);
 
      if (vo) {
        if (this.passive_skill_item_list[i] == null) {
          this.passive_skill_item_list[i] = {};
          this.passive_skill_item_list[i] = this.updateSkillItem(vo, this.passive_skill_item_list[i], false);
          this.item_container_2.addChild(this.passive_skill_item_list[i].con);
        } else {
          this.updateSkillItem(vo, this.passive_skill_item_list[i]);
        }
 
        this.passive_skill_item_list[i].con.setPosition((this.skill_width + 5) * i + this.skill_width / 2, this.skill_width / 2);
      } else {
        console.log(cc.js.formatStr("技能表id: %s 没发现", passive_skill[i].toString()));
      }
    }
  },
  updateSpine: function updateSpine(look_id) {
    if (!look_id) return;
 
    var fun = function () {
      if (!this.spine) {
        this.spine = new BaseRole(); // this.spine:setCascade(true)
 
        this.spine.setParent(this.mode_node);
        this.spine.node.setPosition(0, 76);
        this.spine.node.setAnchorPoint(cc.v2(0.5, 0.5)); // this.spine:setOpacity(0)
        // var action = cc.fadeIn(0.2);
        // this.spine.runAction(action);
 
        this.spine.setData(BaseRole.type.role, look_id, PlayerAction.show, true, 0.75);
      }
    }.bind(this);
 
    if (this.spine) {
      // this.spine:setCascade(true)
      var action = cc.fadeOut(0.2);
      this.spine.node.runAction(cc.sequence(action, cc.CallFunc(function () {
        this.spine.node.stopAllActions();
        this.spine.deleteMe();
        this.spine = null;
        fun();
      })));
    } else {
      fun();
    }
  },
  // @is_act 是否主动技能
  updateSkillItem: function updateSkillItem(config, skill_item, is_act) {
    var size = cc.size(this.skill_width, this.skill_width);
    var skill_size = cc.size(this.skill_width - 4, this.skill_width - 4);
    skill_item.config = config;
 
    if (skill_item.con == null) {
      var con = new cc.Node();
      con.setContentSize(size);
      con.scale = 0.75;
      Utils.onTouchEnd(con, function () {
        if (skill_item.config) {
          var TipsController = require("tips_controller");
 
          TipsController.getInstance().showSkillTips(skill_item.config);
        }
      }.bind(this), 1);
      skill_item.con = con; // 背景
 
      var res = PathTool.getCommonIcomPath("common_1005");
      var bg = Utils.createImage(con, null, 0, 0, cc.v2(0.5, 0.5), true, 0);
      this.loadRes(res, function (bg, resObject) {
        if (bg) {
          bg.spriteFrame = resObject;
        }
      }.bind(this, bg));
    } // 技能icon 
 
 
    var res = PathTool.getIconPath("skillicon", config.icon);
 
    if (skill_item.icon == null) {
      skill_item.icon = Utils.createImage(skill_item.con, null, 0, 0, cc.v2(0.5, 0.5), false, 0, false);
      this.loadRes(res, function (resObject) {
        if (skill_item && skill_item.icon) {
          skill_item.icon.spriteFrame = resObject;
        }
      }.bind(this));
    } else {
      this.loadRes(res, function (resObject) {
        if (skill_item && skill_item.icon) {
          skill_item.icon.spriteFrame = resObject;
        }
      }.bind(this));
    } // 技能等级
 
 
    if (skill_item.lev_label == null) {
      skill_item.lev_label = Utils.createLabel(26, new cc.Color(0xff, 0xff, 0xff, 0xff), new cc.Color(0x00, 0x00, 0x00, 0xff), this.skill_width / 2 + 10, -this.skill_width / 2 - 20, config.level.toString(), skill_item.con, 2, cc.v2(1, 0));
    } else {
      skill_item.lev_label.string = config.level.toString();
    }
 
    return skill_item;
  },
  // 设置选择框
  setSelectCheckBox: function setSelectCheckBox() {
    if (!this.select_checkbox) return;
    if (!this.checkbox_list) return;
 
    for (var i in this.checkbox_list) {
      if (this.select_checkbox == i) {
        this.checkbox_list[i].getComponent(cc.Toggle).check();
      } else {
        this.checkbox_list[i].getComponent(cc.Toggle).uncheck();
      }
    }
  },
  // 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
  closeCallBack: function closeCallBack() {
    if (this.spine) {
      this.spine.deleteMe();
      this.spine = null;
    }
 
    if (this.play_head) {
      this.play_head.deleteMe();
      this.play_head = null;
    }
 
    this.ctrl.openPrimusChallengePanel(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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxwcmltdXNcXHZpZXdcXHByaW11c19jaGFsbGVuZ2Vfd2luZG93LmpzIl0sIm5hbWVzIjpbIlBhdGhUb29sIiwicmVxdWlyZSIsIlJvbGVDb250cm9sbGVyIiwiQXJlbmFDb250cm9sbGVyIiwiUGxheWVySGVhZCIsIkZyaWVuZENvbnRyb2xsZXIiLCJQYXJ0bmVyQ2FsY3VsYXRlIiwiQmFzZVJvbGUiLCJQcmltdXNfY2hhbGxlbmdlV2luZG93IiwiY2MiLCJDbGFzcyIsIkJhc2VWaWV3IiwiY3RvciIsInByZWZhYlBhdGgiLCJnZXRQcmVmYWJQYXRoIiwidmlld1RhZyIsIlNDRU5FX1RBRyIsInVpIiwid2luX3R5cGUiLCJXaW5UeXBlIiwiTWluaSIsImN0cmwiLCJhcmd1bWVudHMiLCJtb2RlbCIsImdldE1vZGVsIiwiaW5pdENvbmZpZyIsImF0dHJfbGFiZWxfbGlzdCIsImF0dHJfaWNvbl9saXN0IiwiY2hlY2tib3hfbGlzdCIsImNoZWNrYm94X2NvdW50cyIsImFjdF9za2lsbF9pdGVtX2xpc3QiLCJwYXNzaXZlX3NraWxsX2l0ZW1fbGlzdCIsInNraWxsX3dpZHRoIiwib3BlbkNhbGxCYWNrIiwiYmFja2dyb3VuZCIsInJvb3Rfd25kIiwiZ2V0Q2hpbGRCeU5hbWUiLCJzY2FsZSIsIkZJVF9TQ0FMRSIsIm1haW5fY29udGFpbmVyIiwibWFpbl9wYW5lbCIsImNsb3NlX2J0biIsIndpbl90aXRsZSIsImdldENvbXBvbmVudCIsIkxhYmVsIiwic3RyaW5nIiwiVXRpbHMiLCJUSTE4TiIsInByaW11c19iaWdiZ18zX25vZGUiLCJwcmltdXNfYmlnYmdfMyIsIlNwcml0ZSIsImxvYWRSZXMiLCJnZXRCaWdCZyIsInJlc09iamVjdCIsInNwcml0ZUZyYW1lIiwiYmluZCIsInJlY29yZF9idG4iLCJzdGF0aW9uX2xheSIsIm1vZGVfbm9kZSIsIm9jY3VwYW50X3RpcHMiLCJ0aXBzX25vZGUiLCJoZWFkX25vZGUiLCJ0aXRsZV9pbWciLCJuYW1lIiwibmFtZV9iZyIsImJvc3NfcGFuZWwiLCJkZXNjX2xhYmVsIiwiZGVzY19sYWJlbF8xIiwiZGVzY19sYWJlbF8yIiwiaXRlbV9jb250YWluZXJfMSIsIml0ZW1fY29udGFpbmVyXzIiLCJhdHRyX3BhbmVsIiwiYXJydF90aXRsZSIsImkiLCJib3hfcGFuZWwiLCJqcyIsImZvcm1hdFN0ciIsInNlbGVjdF9jaGVja2JveCIsIndhcm5pbmdfdGlwcyIsInRpcHNfbmFtZSIsImNoYWxsZW5nZV9idG4iLCJnb3RvX25vZGUiLCJnb3RvZV9sYWJlbCIsImNyZWF0ZVJpY2hMYWJlbCIsIkNvbG9yIiwidjIiLCJob3Jpem9udGFsQWxpZ24iLCJtYWNybyIsIlRleHRBbGlnbm1lbnQiLCJMRUZUIiwiYWRkQ2hpbGQiLCJub2RlIiwidGlwc19sYWJlbCIsInJlZ2lzdGVyRXZlbnQiLCJvblRvdWNoRW5kIiwiZ2V0SW5zdGFuY2UiLCJyZXF1ZXN0T3BlbkFyZW5XaW5kb3ciLCJvcGVuUHJpbXVzQ2hhbGxlbmdlUGFuZWwiLCJfb25DbGlja0NoYWxsZW5nZVJlY29yZEJ0biIsIl9vbkNsaWNrQ2hhbGxlbmdlQnRuIiwic2V2ZXJfZGF0YSIsInNldFNlbGVjdENoZWNrQm94IiwibnVtIiwiaW5pdEJvc3NTa2lsbCIsIl9zZW5kMjA3MDIiLCJzZW5kZXIyMDcwMiIsInBvcyIsImlzX2hhdmVfdGl0bGUiLCJDb21tb25BbGVydCIsInNob3ciLCJzZW5kZXIyMDcwMyIsIm9wZW5Sb290V25kIiwiZGF0YSIsImxlbmd0aCIsInZhcl9kYXRhIiwiQ29uZmlnIiwicHJpbXVzX2RhdGEiLCJkYXRhX3VwZ3JhZGUiLCJob25vcl9kYXRhIiwiZGF0YV90aXRsZSIsImhvbm9yX2lkIiwicmVzIiwiZ2V0SG9ub3JSZXMiLCJyZXNfaWQiLCJzdHIiLCJsYWJlbCIsInJvbGVWbyIsImdldFJvbGVWbyIsInJpZCIsInNydl9pZCIsImFjdGl2ZSIsInVwZGF0ZVNwaW5lIiwibG9va19pZCIsImluaXRIZWFkVWkiLCJpbml0SG9ub3JBdHRyaWJ1dGUiLCJ1cGRhdGVUaXBzTGFiZWwiLCJteV9kYXRhIiwiZ2V0TXlMb29wRGF0YSIsInJhbmsiLCJhcmVuYV9yYW5rIiwicGxheV9oZWFkIiwic2V0UG9zaXRpb24iLCJsZXYiLCJzZXRMZXYiLCJzZXRQYXJlbnQiLCJzZXRIZWFkUmVzIiwiZmFjZV9pZCIsImFkZENhbGxCYWNrIiwib3BlbkZyaWVuZENoZWNrUGFuZWwiLCJpY29uIiwiYXR0ciIsImF0cnJfbmFtZSIsImF0dHJfZGF0YSIsImRhdGFfa2V5X3RvX25hbWUiLCJpc1Nob3dQZXJCeVN0ciIsInZhbHVlIiwiZ2V0QXR0ckljb25CeVN0ciIsImdldENvbW1vbkljb21QYXRoIiwidW5pdF9kYXRhX2xpc3QiLCJkYXRhX3VuaXRkYXRhIiwicHVzaCIsImN1cl9kYXRhIiwiaiIsIm1pbiIsIm1heCIsImN1cl91bml0X2RhdGEiLCJhY3Rfc2tpbGwiLCJwYXNzaXZlX3NraWxsIiwiaXRlbV93aWR0aCIsIm1heF93aWR0aCIsIk1hdGgiLCJnZXRDb250ZW50U2l6ZSIsIndpZHRoIiwic2V0Q29udGVudFNpemUiLCJzaXplIiwiaGVpZ2h0Iiwidm8iLCJnZGF0YSIsInVwZGF0ZVNraWxsSXRlbSIsImNvbiIsImNvbnNvbGUiLCJsb2ciLCJ0b1N0cmluZyIsImZ1biIsInNwaW5lIiwic2V0QW5jaG9yUG9pbnQiLCJzZXREYXRhIiwidHlwZSIsInJvbGUiLCJQbGF5ZXJBY3Rpb24iLCJhY3Rpb24iLCJmYWRlT3V0IiwicnVuQWN0aW9uIiwic2VxdWVuY2UiLCJDYWxsRnVuYyIsInN0b3BBbGxBY3Rpb25zIiwiZGVsZXRlTWUiLCJjb25maWciLCJza2lsbF9pdGVtIiwiaXNfYWN0Iiwic2tpbGxfc2l6ZSIsIk5vZGUiLCJUaXBzQ29udHJvbGxlciIsInNob3dTa2lsbFRpcHMiLCJiZyIsImNyZWF0ZUltYWdlIiwiZ2V0SWNvblBhdGgiLCJsZXZfbGFiZWwiLCJjcmVhdGVMYWJlbCIsImxldmVsIiwiVG9nZ2xlIiwi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QUNIOztBQUNELFdBQU9nQixVQUFQO0FBQ0gsR0EzY2lDO0FBNmNsQztBQUNBakcsRUFBQUEsaUJBQWlCLEVBQUMsNkJBQVU7QUFDeEIsUUFBRyxDQUFDLEtBQUt4QixlQUFULEVBQXlCO0FBQ3pCLFFBQUcsQ0FBQyxLQUFLakQsYUFBVCxFQUF1Qjs7QUFDdkIsU0FBSSxJQUFJNkMsQ0FBUixJQUFhLEtBQUs3QyxhQUFsQixFQUFnQztBQUM1QixVQUFHLEtBQUtpRCxlQUFMLElBQXdCSixDQUEzQixFQUE2QjtBQUN6QixhQUFLN0MsYUFBTCxDQUFtQjZDLENBQW5CLEVBQXNCOUIsWUFBdEIsQ0FBbUNsQyxFQUFFLENBQUN5TSxNQUF0QyxFQUE4Q0MsS0FBOUM7QUFDSCxPQUZELE1BRUs7QUFDRCxhQUFLdkwsYUFBTCxDQUFtQjZDLENBQW5CLEVBQXNCOUIsWUFBdEIsQ0FBbUNsQyxFQUFFLENBQUN5TSxNQUF0QyxFQUE4Q0UsT0FBOUM7QUFDSDtBQUNKO0FBQ0osR0F4ZGlDO0FBMmRsQztBQUNBQyxFQUFBQSxhQUFhLEVBQUMseUJBQVU7QUFDcEIsUUFBRyxLQUFLN0IsS0FBUixFQUFjO0FBQ1YsV0FBS0EsS0FBTCxDQUFXWSxRQUFYO0FBQ0EsV0FBS1osS0FBTCxHQUFhLElBQWI7QUFDSDs7QUFFRCxRQUFHLEtBQUs1QyxTQUFSLEVBQWtCO0FBQ2QsV0FBS0EsU0FBTCxDQUFld0QsUUFBZjtBQUNBLFdBQUt4RCxTQUFMLEdBQWlCLElBQWpCO0FBQ0g7O0FBQ0QsU0FBS3ZILElBQUwsQ0FBVTRFLHdCQUFWLENBQW1DLEtBQW5DO0FBQ0g7QUF2ZWlDLENBQVQsQ0FBN0IiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBAYXV0aG9yOiB4eHhAc3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcbi8vIEBkZXNjcmlwdGlvbjpcbi8vICAgICDov5nph4zmmK/mj4/ov7Dov5nkuKrnqpfkvZPnmoTkvZznlKjnmoRcbi8vIDxici8+Q3JlYXRlOiAyMDE5LTAzLTE2IDEwOjI2OjQ2XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIFBhdGhUb29sID0gcmVxdWlyZShcInBhdGh0b29sXCIpO1xudmFyIFJvbGVDb250cm9sbGVyID0gcmVxdWlyZShcInJvbGVfY29udHJvbGxlclwiKTtcbnZhciBBcmVuYUNvbnRyb2xsZXIgPSByZXF1aXJlKFwiYXJlbmFfY29udHJvbGxlclwiKTtcbnZhciBQbGF5ZXJIZWFkID0gcmVxdWlyZShcInBsYXllcmhlYWRcIik7XG52YXIgRnJpZW5kQ29udHJvbGxlciA9IHJlcXVpcmUoXCJmcmllbmRfY29udHJvbGxlclwiKTtcbnZhciBQYXJ0bmVyQ2FsY3VsYXRlID0gcmVxdWlyZShcInBhcnRuZXJfY2FsY3VsYXRlXCIpO1xudmFyIEJhc2VSb2xlID0gcmVxdWlyZShcImJhc2Vyb2xlXCIpO1xuXG52YXIgUHJpbXVzX2NoYWxsZW5nZVdpbmRvdyA9IGNjLkNsYXNzKHtcbiAgICBleHRlbmRzOiBCYXNlVmlldyxcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucHJlZmFiUGF0aCA9IFBhdGhUb29sLmdldFByZWZhYlBhdGgoXCJwcmltdXNcIiwgXCJwcmltdXNfY2hhbGxlbmdlX3BhbmVsXCIpO1xuICAgICAgICB0aGlzLnZpZXdUYWcgPSBTQ0VORV9UQUcudWk7ICAgICAgICAgICAgICAgIC8v6K+l56qX5L2T5omA5bGedWnlsYLnuqcs5YWo5bGPdWnpnIDopoHlnKh1aeWxgizpnZ7lhajlsY91aeWcqGRpYWxvZ3Vl5bGCLOi/meS4quimgeazqOaEj1xuICAgICAgICB0aGlzLndpbl90eXBlID0gV2luVHlwZS5NaW5pOyAgICAgICAgICAgICAgIC8v5piv5ZCm5piv5YWo5bGP56qX5L2TICBXaW5UeXBlLkZ1bGwsIFdpblR5cGUuQmlnLCBXaW5UeXBlLk1pbmksIFdpblR5cGUuVGlwc1xuICAgICAgICB0aGlzLmN0cmwgPSBhcmd1bWVudHNbMF07XG4gICAgICAgIHRoaXMubW9kZWwgPSB0aGlzLmN0cmwuZ2V0TW9kZWwoKTtcbiAgICB9LFxuXG4gICAgLy8g5Yid5aeL5YyW5LiA5Lqb6YWN572u5pWw5o2uLOWPr+S7peeUqOS6juWjsOaYjuS4gOS6m+WPmOmHj+S5i+exu+eahFxuICAgIGluaXRDb25maWc6ZnVuY3Rpb24oKXtcbiAgICAgICAgLy8g5bGe5oCn5YiX6KGoXG4gICAgICAgIHRoaXMuYXR0cl9sYWJlbF9saXN0ID0gW107XG4gICAgICAgIHRoaXMuYXR0cl9pY29uX2xpc3QgPSBbXTtcbiAgICAgICAgLy8g5aSN6YCJ5qGGXG4gICAgICAgIHRoaXMuY2hlY2tib3hfbGlzdCA9IFtdO1xuICAgICAgICB0aGlzLmNoZWNrYm94X2NvdW50cyA9IFsxLDUsMTBdO1xuICAgICAgICAvLyBib3NzIOS4u+WKqOaKgOiDvVxuICAgICAgICB0aGlzLmFjdF9za2lsbF9pdGVtX2xpc3QgPSBbXTtcbiAgICAgICAgLy8gYm9zcyDooqvliqjmioDog71cbiAgICAgICAgdGhpcy5wYXNzaXZlX3NraWxsX2l0ZW1fbGlzdCA9IFtdO1xuICAgIFxuICAgICAgICAvLyDmioDog73lrr3pq5hcbiAgICAgICAgdGhpcy5za2lsbF93aWR0aCA9IDg4XG4gICAgfSxcblxuICAgIC8vIOmihOWItuS9k+WKoOi9veWujOaIkOS5i+WQjueahOWbnuiwgyzlj6/ku6XlnKjov5nph4zmjZXojrfnm7jlhbPoioLngrnmiJbogIXnu4Tku7ZcbiAgICBvcGVuQ2FsbEJhY2s6ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kID0gdGhpcy5yb290X3duZC5nZXRDaGlsZEJ5TmFtZShcImJhY2tncm91bmRcIik7XG4gICAgICAgIHRoaXMuYmFja2dyb3VuZC5zY2FsZSA9IEZJVF9TQ0FMRTtcbiAgICAgICAgdGhpcy5tYWluX2NvbnRhaW5lciA9IHRoaXMucm9vdF93bmQuZ2V0Q2hpbGRCeU5hbWUoXCJtYWluX2NvbnRhaW5lclwiKTtcbiAgICAgICAgdGhpcy5tYWluX3BhbmVsID0gdGhpcy5tYWluX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcIm1haW5fcGFuZWxcIik7XG4gICAgICAgIHRoaXMuY2xvc2VfYnRuID0gdGhpcy5tYWluX3BhbmVsLmdldENoaWxkQnlOYW1lKFwiY2xvc2VfYnRuXCIpO1xuICAgICAgICB0aGlzLndpbl90aXRsZSA9IHRoaXMubWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcIndpbl90aXRsZVwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xuICAgICAgICB0aGlzLndpbl90aXRsZS5zdHJpbmcgPSBVdGlscy5USTE4TihcIuelnuauv+aMkeaImFwiKTtcbiAgICAgICAgdGhpcy5wcmltdXNfYmlnYmdfM19ub2RlID0gdGhpcy5tYWluX3BhbmVsLmdldENoaWxkQnlOYW1lKFwicHJpbXVzX2JpZ2JnXzNcIik7XG4gICAgICAgIHRoaXMucHJpbXVzX2JpZ2JnXzNfbm9kZS5zY2FsZSA9IDI7XG4gICAgICAgIHRoaXMucHJpbXVzX2JpZ2JnXzMgPSB0aGlzLnByaW11c19iaWdiZ18zX25vZGUuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSk7XG5cbiAgICAgICAgdGhpcy5sb2FkUmVzKFBhdGhUb29sLmdldEJpZ0JnKFwicHJpbXVzX2JpZ2JnXzNcIixudWxsLFwicHJpbXVzXCIpLCAoZnVuY3Rpb24ocmVzT2JqZWN0KXtcbiAgICAgICAgICAgIGlmKHRoaXMucHJpbXVzX2JpZ2JnXzMpe1xuICAgICAgICAgICAgICAgIHRoaXMucHJpbXVzX2JpZ2JnXzMuc3ByaXRlRnJhbWUgPSByZXNPYmplY3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMucmVjb3JkX2J0biAgICAgPSB0aGlzLm1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJyZWNvcmRfYnRuXCIpO1xuICAgICAgICAvLyDnq5nlj7BcbiAgICAgICAgdmFyIHN0YXRpb25fbGF5ICAgPSB0aGlzLm1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJzdGF0aW9uX2xheVwiKTtcbiAgICAgICAgdGhpcy5tb2RlX25vZGUgICAgICA9IHN0YXRpb25fbGF5LmdldENoaWxkQnlOYW1lKFwibW9kZV9ub2RlXCIpXG4gICAgICAgIHRoaXMub2NjdXBhbnRfdGlwcyAgPSBzdGF0aW9uX2xheS5nZXRDaGlsZEJ5TmFtZShcIm9jY3VwYW50X3RpcHNcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcbiAgICAgICAgdGhpcy50aXBzX25vZGUgICAgPSBzdGF0aW9uX2xheS5nZXRDaGlsZEJ5TmFtZShcInRpcHNfbm9kZVwiKVxuICAgICAgICB0aGlzLmhlYWRfbm9kZSAgICAgID0gc3RhdGlvbl9sYXkuZ2V0Q2hpbGRCeU5hbWUoXCJoZWFkX25vZGVcIikgXG4gICAgICAgIHRoaXMudGl0bGVfaW1nICAgICAgPSBzdGF0aW9uX2xheS5nZXRDaGlsZEJ5TmFtZShcInRpdGxlX2ltZ1wiKS5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICBcbiAgICAgICAgdGhpcy5uYW1lICAgICAgICAgICA9IHN0YXRpb25fbGF5LmdldENoaWxkQnlOYW1lKFwibmFtZVwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xuICAgICAgICB0aGlzLm5hbWVfYmcgICAgICAgID0gc3RhdGlvbl9sYXkuZ2V0Q2hpbGRCeU5hbWUoXCJuYW1lX2JnXCIpO1xuICAgICAgICAvLyBib3Nz5oqA6IO9XG4gICAgICAgIHZhciBib3NzX3BhbmVsICAgID0gdGhpcy5tYWluX3BhbmVsLmdldENoaWxkQnlOYW1lKFwiYm9zc19wYW5lbFwiKTtcbiAgICAgICAgdmFyIGRlc2NfbGFiZWwgICAgID0gYm9zc19wYW5lbC5nZXRDaGlsZEJ5TmFtZShcImRlc2NfbGFiZWxcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcbiAgICAgICAgdmFyIGRlc2NfbGFiZWxfMSAgID0gYm9zc19wYW5lbC5nZXRDaGlsZEJ5TmFtZShcImRlc2NfbGFiZWxfMVwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xuICAgICAgICB2YXIgZGVzY19sYWJlbF8yICAgPSBib3NzX3BhbmVsLmdldENoaWxkQnlOYW1lKFwiZGVzY19sYWJlbF8yXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7XG4gICAgICAgIGRlc2NfbGFiZWwuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCJCb3Nz5oqA6IO9XCIpO1xuICAgICAgICBkZXNjX2xhYmVsXzEuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLkuLvliqjmioDog71cIik7XG4gICAgICAgIGRlc2NfbGFiZWxfMi5zdHJpbmcgPSBVdGlscy5USTE4TihcIuiiq+WKqOaKgOiDvVwiKTtcblxuICAgICAgICAvLyDkuLvliqjmioDog71zY3JvbGx2aWV3XG4gICAgICAgIHRoaXMuaXRlbV9jb250YWluZXJfMSA9IGJvc3NfcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJpdGVtX2NvbnRhaW5lcl8xXCIpLmdldENoaWxkQnlOYW1lKFwiY29udGVudFwiKTtcbiAgICAgICAgXG4gICAgICAgIC8vIOiiq+WKqOaKgOiDvXNjcm9sbHZpZXdcbiAgICAgICAgdGhpcy5pdGVtX2NvbnRhaW5lcl8yID0gYm9zc19wYW5lbC5nZXRDaGlsZEJ5TmFtZShcIml0ZW1fY29udGFpbmVyXzJcIikuZ2V0Q2hpbGRCeU5hbWUoXCJjb250ZW50XCIpO1xuXG4gICAgICAgIC8vIOWxnuaAp1xuICAgICAgICB0aGlzLmF0dHJfcGFuZWwgICAgID0gdGhpcy5tYWluX3BhbmVsLmdldENoaWxkQnlOYW1lKFwiYXR0cl9wYW5lbFwiKVxuICAgICAgICB0aGlzLmFycnRfdGl0bGUgICAgID0gdGhpcy5hdHRyX3BhbmVsLmdldENoaWxkQnlOYW1lKFwidGl0bGVcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcblxuICAgICAgICBmb3IodmFyIGkgPSAwO2k8NDtpKyspe1xuICAgICAgICAgICAgdGhpcy5hdHRyX2xhYmVsX2xpc3RbaV0gPSB0aGlzLmF0dHJfcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJhdHRyX2xhYmVsXCIrKGkrMSkpLmdldENvbXBvbmVudChjYy5MYWJlbCk7XG4gICAgICAgICAgICB0aGlzLmF0dHJfaWNvbl9saXN0W2ldID0gdGhpcy5hdHRyX3BhbmVsLmdldENoaWxkQnlOYW1lKFwiYXR0cl9pY29uXCIrKGkrMSkpLmdldENvbXBvbmVudChjYy5TcHJpdGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXJydF90aXRsZS5zdHJpbmcgPSBVdGlscy5USTE4TihcIuelnuS9jeensOWPt+WxnuaAp+WKoOaIkFwiKTtcblxuICAgICAgICAvLyDlpI3pgInmoYZcbiAgICAgICAgdmFyIGJveF9wYW5lbCAgICAgPSB0aGlzLm1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJib3hfcGFuZWxcIilcbiAgICAgICAgdGhpcy5jaGVja2JveF9saXN0WzBdID0gYm94X3BhbmVsLmdldENoaWxkQnlOYW1lKFwiY2hlY2tib3gxXCIpXG4gICAgICAgIHRoaXMuY2hlY2tib3hfbGlzdFsxXSA9IGJveF9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcImNoZWNrYm94NVwiKVxuICAgICAgICB0aGlzLmNoZWNrYm94X2xpc3RbMl0gPSBib3hfcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJjaGVja2JveDEwXCIpXG4gICAgICAgIHZhciBuYW1lID0gdGhpcy5jaGVja2JveF9saXN0WzBdLmdldENoaWxkQnlOYW1lKFwibmFtZVwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xuICAgICAgICBuYW1lLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIui/m+WMliVz5qyhXCIpLHRoaXMuY2hlY2tib3hfY291bnRzWzBdKTtcbiAgICAgICAgbmFtZSA9IHRoaXMuY2hlY2tib3hfbGlzdFsxXS5nZXRDaGlsZEJ5TmFtZShcIm5hbWVcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcbiAgICAgICAgbmFtZS5zdHJpbmcgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCLov5vljJYlc+asoVwiKSx0aGlzLmNoZWNrYm94X2NvdW50c1sxXSk7XG4gICAgICAgIG5hbWUgPSB0aGlzLmNoZWNrYm94X2xpc3RbMl0uZ2V0Q2hpbGRCeU5hbWUoXCJuYW1lXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7XG4gICAgICAgIG5hbWUuc3RyaW5nID0gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwi6L+b5YyWJXPmrKFcIiksdGhpcy5jaGVja2JveF9jb3VudHNbMl0pO1xuICAgICAgICB0aGlzLnNlbGVjdF9jaGVja2JveCA9IDA7XG5cbiAgICAgICAgdGhpcy53YXJuaW5nX3RpcHMgPSBib3hfcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJ3YXJuaW5nX3RpcHNcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcbiAgICAgICAgdGhpcy53YXJuaW5nX3RpcHMuc3RyaW5nICA9IFV0aWxzLlRJMThOKFwiKOmavuW6puWkp+ivt+iwqOaFjilcIik7XG4gICAgICAgIFxuICAgICAgICB0aGlzLnRpcHNfbmFtZSA9IHRoaXMubWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcInRpcHNfbmFtZVwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xuICAgICAgICB0aGlzLmNoYWxsZW5nZV9idG4gPSB0aGlzLm1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJjaGFsbGVuZ2VfYnRuXCIpO1xuXG4gICAgICAgIHZhciBnb3RvX25vZGUgPSB0aGlzLm1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJnb3RvX25vZGVcIik7XG4gICAgICAgIHRoaXMuZ290b2VfbGFiZWwgPSBVdGlscy5jcmVhdGVSaWNoTGFiZWwoMjQsIG5ldyBjYy5Db2xvcigzNiwgMTQ0LCAzLCAyNTUpLCBjYy52MigwLCAwLjUpLCBjYy52MigwLCAwKSwzMCwxMjUpO1xuICAgICAgICB0aGlzLmdvdG9lX2xhYmVsLmhvcml6b250YWxBbGlnbiA9IGNjLm1hY3JvLlRleHRBbGlnbm1lbnQuTEVGVDtcbiAgICAgICAgdGhpcy5nb3RvZV9sYWJlbC5zdHJpbmcgPSBjYy5qcy5mb3JtYXRTdHIoXCI8dT4lczwvdT5cIiwgVXRpbHMuVEkxOE4oXCLliY3lvoDnq57mioDlnLpcIikpO1xuICAgICAgICBcbiAgICAgICAgZ290b19ub2RlLmFkZENoaWxkKHRoaXMuZ290b2VfbGFiZWwubm9kZSk7XG5cbiAgICAgICAgdmFyIHRpcHNfbm9kZSA9IHRoaXMubWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcInRpcHNfbm9kZVwiKTtcbiAgICAgICAgdGhpcy50aXBzX2xhYmVsID0gVXRpbHMuY3JlYXRlUmljaExhYmVsKDIyLCBuZXcgY2MuQ29sb3IoMTY5LCA5NSwgMTYsIDI1NSksIGNjLnYyKDAuNSwgMC41KSwgY2MudjIoMCwgMCksMzAsMTI4MCk7XG4gICAgICAgIHRpcHNfbm9kZS5hZGRDaGlsZCh0aGlzLnRpcHNfbGFiZWwubm9kZSk7XG4gICAgfSxcblxuICAgIC8vIOazqOWGjOS6i+S7tuebkeWQrOeahOaOpeWPoyzkuI3pnIDopoHmiYvliqjosIPnlKgs5aaC5p6c5piv5L2/55SoZ2NvcmUuR2xvYmFsRXZlbnTnm5HlkKws5Y+v5Lul55u05o6l6LCD55SoYWRkR2xvYmFsRXZlbnRcbiAgICByZWdpc3RlckV2ZW50OmZ1bmN0aW9uKCl7XG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy5nb3RvZV9sYWJlbC5ub2RlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgQXJlbmFDb250cm9sbGVyID0gcmVxdWlyZShcImFyZW5hX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICBBcmVuYUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5yZXF1ZXN0T3BlbkFyZW5XaW5kb3coKSAgIFxuICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5QcmltdXNDaGFsbGVuZ2VQYW5lbChmYWxzZSk7ICAgICBcbiAgICAgICAgfS5iaW5kKHRoaXMpLCAxKTtcblxuICAgICAgICBVdGlscy5vblRvdWNoRW5kKHRoaXMuY2xvc2VfYnRuLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmN0cmwub3BlblByaW11c0NoYWxsZW5nZVBhbmVsKGZhbHNlKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpLCAyKTtcblxuICAgICAgICBVdGlscy5vblRvdWNoRW5kKHRoaXMucmVjb3JkX2J0biwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5fb25DbGlja0NoYWxsZW5nZVJlY29yZEJ0bigpO1xuICAgICAgICB9LmJpbmQodGhpcyksIDIpO1xuICAgICAgICBcbiAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLmNoYWxsZW5nZV9idG4sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuX29uQ2xpY2tDaGFsbGVuZ2VCdG4oKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpLCAyKTtcblxuICAgICAgICBmb3IodmFyIGkgaW4gdGhpcy5jaGVja2JveF9saXN0KXtcbiAgICAgICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy5jaGVja2JveF9saXN0W2ldLCBmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgICAgIGlmKHRoaXMuc2V2ZXJfZGF0YSl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0X2NoZWNrYm94ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RDaGVja0JveCgpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbnVtID0gdGhpcy5zZXZlcl9kYXRhLm51bSArIHRoaXMuY2hlY2tib3hfY291bnRzW2ldXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdEJvc3NTa2lsbChudW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzLGkpLCAxKTtcbiAgICAgICAgfVxuICAgIFxuICAgICAgICAvLyAtLSB0aGlzOmFkZEdsb2JhbEV2ZW50KFRhc2tFdmVudC5VcGRhdGVVSVJlZFN0YXR1cywgZnVuY3Rpb24oa2V5LCB2YWx1ZSlcbiAgICAgICAgLy8gLS0gICAgIHRoaXM6dXBkYXRlVUlSZWRTdGF0dXMoa2V5KVxuICAgICAgICAvLyAtLSBlbmQpXG4gICAgfSxcblxuICAgIC8vIOWOu+aMkeaImOWOu1xuICAgIF9vbkNsaWNrQ2hhbGxlbmdlQnRuOmZ1bmN0aW9uKCl7XG4gICAgICAgIGlmKCF0aGlzLnNldmVyX2RhdGEpcmV0dXJuO1xuICAgICAgICB2YXIgX3NlbmQyMDcwMiA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICB2YXIgbnVtID0gdGhpcy5jaGVja2JveF9jb3VudHNbdGhpcy5zZWxlY3RfY2hlY2tib3hdO1xuICAgICAgICAgICAgdGhpcy5jdHJsLnNlbmRlcjIwNzAyKHRoaXMuc2V2ZXJfZGF0YS5wb3MgLG51bSk7XG4gICAgICAgIH0uYmluZCh0aGlzKTtcbiAgICAgICAgaWYodGhpcy5pc19oYXZlX3RpdGxlKXtcbiAgICAgICAgICAgIHZhciBDb21tb25BbGVydCA9IHJlcXVpcmUoXCJjb21tb25hbGVydFwiKTtcbiAgICAgICAgICAgIENvbW1vbkFsZXJ0LnNob3coVXRpbHMuVEkxOE4oXCLmgqjlvZPliY3lt7LljaDmnInkuIDkuKrnpZ7kvY3vvIzoi6XmjJHmiJjlhbbku5bnpZ7kvY3miJDlip/vvIzlsIblpLHljrvljp/mnInnpZ7kvY3vvIzmmK/lkKbnu6fnu63mjJHmiJjvvJ9cIiksVXRpbHMuVEkxOE4oXCLnoa7lrppcIiksIF9zZW5kMjA3MDIsVXRpbHMuVEkxOE4oXCLlj5bmtohcIikpO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIF9zZW5kMjA3MDIoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDmn6XnnIvmjJHmiJjorrDlvZVcbiAgICBfb25DbGlja0NoYWxsZW5nZVJlY29yZEJ0bjpmdW5jdGlvbigpe1xuICAgICAgICBpZighdGhpcy5zZXZlcl9kYXRhKXJldHVybjtcbiAgICAgICAgdGhpcy5jdHJsLnNlbmRlcjIwNzAzKHRoaXMuc2V2ZXJfZGF0YS5wb3MpO1xuICAgIH0sXG5cbiAgICAvLyDpooTliLbkvZPliqDovb3lrozmiJDkuYvlkI4s5re75Yqg5Yiw5a+55bqU5Li76IqC54K55LmL5ZCO55qE5Zue6LCDLOS5n+WwseaYr+S4gOS4queql+S9k+eahOato+W8j+WFpeWPoyzlj6/ku6Xorr7nva7kuIDkupvmlbDmja7kuoZcbiAgICBvcGVuUm9vdFduZDpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgaWYoIWRhdGEpcmV0dXJuO1xuICAgICAgICBpZihkYXRhLmxlbmd0aDwyKXJldHVybjtcbiAgICAgICAgdGhpcy5pc19oYXZlX3RpdGxlID0gZGF0YVsxXTtcbiAgICAgICAgdGhpcy5zZXZlcl9kYXRhID0gZGF0YVswXTtcbiAgICAgICAgdGhpcy52YXJfZGF0YSA9IENvbmZpZy5wcmltdXNfZGF0YS5kYXRhX3VwZ3JhZGVbdGhpcy5zZXZlcl9kYXRhLnBvc107XG5cbiAgICAgICAgdmFyIGhvbm9yX2RhdGEgPSBDb25maWcuaG9ub3JfZGF0YS5kYXRhX3RpdGxlW3RoaXMudmFyX2RhdGEuaG9ub3JfaWRdO1xuICAgICAgICBpZihob25vcl9kYXRhICYmIHRoaXMudGl0bGVfaW1nKXtcbiAgICAgICAgICAgIHZhciByZXMgPSBQYXRoVG9vbC5nZXRIb25vclJlcyhob25vcl9kYXRhLnJlc19pZCk7XG4gICAgICAgICAgICB0aGlzLmxvYWRSZXMocmVzLCAoZnVuY3Rpb24ocmVzT2JqZWN0KXtcbiAgICAgICAgICAgICAgICBpZih0aGlzLnRpdGxlX2ltZyl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGl0bGVfaW1nLnNwcml0ZUZyYW1lID0gcmVzT2JqZWN0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLmJpbmQodGhpcykpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodGhpcy50aXBzX25vZGUgJiYgdGhpcy52YXJfZGF0YSl7XG4gICAgICAgICAgICB2YXIgc3RyID0gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwiPGNvbG9yPSNmZmZmZmY+5bey6L+b5YyWPGNvbG9yPSMxNGZmMzI+JXM8L2NvbG9yPuasoTwvY29sb3I+XCIpLCB0aGlzLnNldmVyX2RhdGEubnVtKVxuICAgICAgICAgICAgdmFyIGxhYmVsID0gVXRpbHMuY3JlYXRlUmljaExhYmVsKDI0LCBuZXcgY2MuQ29sb3IoMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiksIGNjLnYyKDAuNSwgMC41KSwgY2MudjIoMCwgMCksMzApO1xuICAgICAgICAgICAgbGFiZWwuc3RyaW5nID0gc3RyO1xuICAgICAgICAgICAgdGhpcy50aXBzX25vZGUuYWRkQ2hpbGQobGFiZWwubm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZih0aGlzLnNldmVyX2RhdGEubmFtZSAhPSBudWxsIHx8IHRoaXMuc2V2ZXJfZGF0YS5uYW1lICE9IFwiXCIpe1xuICAgICAgICAgICAgdmFyIHJvbGVWbyA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XG4gICAgICAgICAgICBpZihyb2xlVm8gJiYgdGhpcy5zZXZlcl9kYXRhLnJpZCA9PSByb2xlVm8ucmlkICYmIHRoaXMuc2V2ZXJfZGF0YS5zcnZfaWQgPT0gcm9sZVZvLnNydl9pZCl7XG4gICAgICAgICAgICAgICAgLy8g5piv6Ieq5bexXG4gICAgICAgICAgICAgICAgdGhpcy50aXBzX25hbWUuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLlt7LljaDpoobnpZ7kvY1cIik7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFsbGVuZ2VfYnRuLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuZ290b2VfbGFiZWwubm9kZS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOabtOaWsOaooeWei1xuICAgICAgICBpZih0aGlzLnZhcl9kYXRhKXtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3BpbmUodGhpcy52YXJfZGF0YS5sb29rX2lkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOWktOWDj1xuICAgICAgICB0aGlzLmluaXRIZWFkVWkoKTtcblxuICAgICAgICAvLyBib3Nz5oqA6IO9XG4gICAgICAgIHRoaXMuaW5pdEJvc3NTa2lsbCh0aGlzLnNldmVyX2RhdGEubnVtKTtcbiAgICAgICAgLy8g56ew5Y+35bGe5oCnXG4gICAgICAgIHRoaXMuaW5pdEhvbm9yQXR0cmlidXRlKCk7XG5cbiAgICAgICAgdGhpcy5zZXRTZWxlY3RDaGVja0JveCgpO1xuXG4gICAgICAgIHRoaXMudXBkYXRlVGlwc0xhYmVsKCk7XG4gICAgfSxcblxuICAgIHVwZGF0ZVRpcHNMYWJlbDpmdW5jdGlvbigpe1xuICAgICAgICB2YXIgbXlfZGF0YSA9IEFyZW5hQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0TXlMb29wRGF0YSgpO1xuICAgICAgICBpZih0aGlzLnRpcHNfbGFiZWwgJiYgdGhpcy52YXJfZGF0YSl7XG4gICAgICAgICAgICBpZihteV9kYXRhICYmIG15X2RhdGEucmFuayAmJiBteV9kYXRhLnJhbmsgPiAwKXtcbiAgICAgICAgICAgICAgICB0aGlzLnRpcHNfbGFiZWwuc3RyaW5nID0gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwi5oyR5oiY5p2h5Lu2OuW9k+WJjeernuaKgOWcuuWkhOS6juWJjSVz5ZCNKOaIkeeahOaOkuWQjTo8Y29sb3I9IzI0OTAwMz4lczwvY29sb3I+KVwiKSwgdGhpcy52YXJfZGF0YS5hcmVuYV9yYW5rLCBteV9kYXRhLnJhbmspO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgdGhpcy50aXBzX2xhYmVsLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIuaMkeaImOadoeS7tjrlvZPliY3nq57mioDlnLrlpITkuo7liY0lc+WQjSjmiJHnmoTmjpLlkI06PGNvbG9yPSMyNDkwMDM+5pegPC9jb2xvcj4pXCIpLCB0aGlzLnZhcl9kYXRhLmFyZW5hX3JhbmspO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOWIneWni+WMluWktOWDj3VpXG4gICAgaW5pdEhlYWRVaTpmdW5jdGlvbigpe1xuICAgICAgICBpZighdGhpcy5zZXZlcl9kYXRhKXJldHVybjtcbiAgICAgICAgaWYodGhpcy5zZXZlcl9kYXRhLm5hbWUgPT0gbnVsbCB8fCB0aGlzLnNldmVyX2RhdGEubmFtZSA9PSBcIlwiKXtcbiAgICAgICAgICAgIHRoaXMub2NjdXBhbnRfdGlwcy5zdHJpbmcgPSBVdGlscy5USTE4TihcIuiZmuS9jeS7peW+hVwiKTtcbiAgICAgICAgICAgIHRoaXMubmFtZV9iZy5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMubmFtZS5ub2RlLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgLy8g5aS05YOPXG4gICAgICAgIHRoaXMucGxheV9oZWFkID0gbmV3IFBsYXllckhlYWQoKTsvL2NjLnNpemUoOTYsOTYpXG4gICAgICAgIHRoaXMucGxheV9oZWFkLnNldFBvc2l0aW9uKDAsIDApO1xuICAgICAgICAvLyB0aGlzLnBsYXlfaGVhZC5zZXRTY2FsZSgwLjk1KTtcbiAgICAgICAgaWYodGhpcy5zZXZlcl9kYXRhLmxldil7XG4gICAgICAgICAgICB0aGlzLnBsYXlfaGVhZC5zZXRMZXYodGhpcy5zZXZlcl9kYXRhLmxldik7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHRoaXMucGxheV9oZWFkLnNldFBhcmVudCh0aGlzLmhlYWRfbm9kZSk7XG4gICAgICAgIHRoaXMucGxheV9oZWFkLnNob3coKTtcbiAgICAgICAgdGhpcy5wbGF5X2hlYWQuc2V0SGVhZFJlcyh0aGlzLnNldmVyX2RhdGEuZmFjZV9pZCk7XG4gICAgICAgIHRoaXMubmFtZS5zdHJpbmcgPSB0aGlzLnNldmVyX2RhdGEubmFtZTtcbiAgICAgICAgdGhpcy5wbGF5X2hlYWQuYWRkQ2FsbEJhY2soZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIEZyaWVuZENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5vcGVuRnJpZW5kQ2hlY2tQYW5lbCh0cnVlLCB7c3J2X2lkOiB0aGlzLnNldmVyX2RhdGEuc3J2X2lkLCByaWQ6IHRoaXMuc2V2ZXJfZGF0YS5yaWR9KVxuICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgIH0sXG5cbiAgICBpbml0SG9ub3JBdHRyaWJ1dGU6ZnVuY3Rpb24oKXtcbiAgICAgICAgaWYoIXRoaXMudmFyX2RhdGEpcmV0dXJuO1xuICAgICAgICBpZighdGhpcy5hdHRyX2xhYmVsX2xpc3QpcmV0dXJuO1xuICAgICAgICBpZighdGhpcy5hdHRyX2ljb25fbGlzdClyZXR1cm47XG4gICAgICAgIHZhciBob25vcl9kYXRhID0gQ29uZmlnLmhvbm9yX2RhdGEuZGF0YV90aXRsZVt0aGlzLnZhcl9kYXRhLmhvbm9yX2lkXTtcbiAgICAgICAgaWYoaG9ub3JfZGF0YSl7XG4gICAgICAgICAgICBmb3IodmFyIGkgaW4gdGhpcy5hdHRyX2xhYmVsX2xpc3Qpe1xuICAgICAgICAgICAgICAgIHZhciBpY29uID0gdGhpcy5hdHRyX2ljb25fbGlzdFtpXTtcbiAgICAgICAgICAgICAgICBpZihob25vcl9kYXRhLmF0dHJbaV0pe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF0dHJfbGFiZWxfbGlzdFtpXS5ub2RlLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhdHJyX25hbWUgPSBDb25maWcuYXR0cl9kYXRhLmRhdGFfa2V5X3RvX25hbWVbaG9ub3JfZGF0YS5hdHRyW2ldWzBdXTtcbiAgICAgICAgICAgICAgICAgICAgaWYoUGFydG5lckNhbGN1bGF0ZS5pc1Nob3dQZXJCeVN0cihob25vcl9kYXRhLmF0dHJbaV1bMF0pKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGhvbm9yX2RhdGEuYXR0cltpXVsxXS8xMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXR0cl9sYWJlbF9saXN0W2ldLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihcIiVzICsgJXMlXCIsIFV0aWxzLlRJMThOKGF0cnJfbmFtZSksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF0dHJfbGFiZWxfbGlzdFtpXS5zdHJpbmcgPSBjYy5qcy5mb3JtYXRTdHIoXCIlcyArICVzIFwiLCBVdGlscy5USTE4TihhdHJyX25hbWUpLCBob25vcl9kYXRhLmF0dHJbaV1bMV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmKGljb24pe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbi5ub2RlLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzX2lkID0gUGF0aFRvb2wuZ2V0QXR0ckljb25CeVN0cihob25vcl9kYXRhLmF0dHJbaV1bMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlcyA9IFBhdGhUb29sLmdldENvbW1vbkljb21QYXRoKHJlc19pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRSZXMocmVzLCAoZnVuY3Rpb24oaWNvbixyZXNPYmplY3Qpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGljb24pe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uLnNwcml0ZUZyYW1lID0gcmVzT2JqZWN0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmJpbmQodGhpcyxpY29uKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdHRyX2xhYmVsX2xpc3RbaV0ubm9kZS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYoaWNvbil7XG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uLm5vZGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgaW5pdEJvc3NTa2lsbDpmdW5jdGlvbihudW0pe1xuICAgICAgICBpZih0aGlzLnVuaXRfZGF0YV9saXN0ID09IG51bGwpe1xuICAgICAgICAgICAgdGhpcy51bml0X2RhdGFfbGlzdCA9IFtdO1xuICAgICAgICAgICAgZm9yKHZhciBpIGluIENvbmZpZy5wcmltdXNfZGF0YS5kYXRhX3VuaXRkYXRhKXtcbiAgICAgICAgICAgICAgICBpZih0aGlzLnNldmVyX2RhdGEucG9zID09IENvbmZpZy5wcmltdXNfZGF0YS5kYXRhX3VuaXRkYXRhW2ldLnBvcyl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudW5pdF9kYXRhX2xpc3QucHVzaChDb25maWcucHJpbXVzX2RhdGEuZGF0YV91bml0ZGF0YVtpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBjdXJfZGF0YSA9IG51bGw7XG4gICAgICAgIHZhciBsZW5ndGggPSB0aGlzLnVuaXRfZGF0YV9saXN0Lmxlbmd0aDtcbiAgICAgICAgZm9yKHZhciBqIGluIHRoaXMudW5pdF9kYXRhX2xpc3Qpe1xuICAgICAgICAgICAgaWYobnVtID49IHRoaXMudW5pdF9kYXRhX2xpc3Rbal0ubWluICYmIG51bSA8PSB0aGlzLnVuaXRfZGF0YV9saXN0W2pdLm1heCl7XG4gICAgICAgICAgICAgICAgY3VyX2RhdGEgPSB0aGlzLnVuaXRfZGF0YV9saXN0W2pdO1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihqKzEgPT0gbGVuZ3RoKXtcbiAgICAgICAgICAgICAgICBjdXJfZGF0YSA9IHRoaXMudW5pdF9kYXRhX2xpc3Rbal07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZihjdXJfZGF0YSA9PSBudWxsKXtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHRoaXMuY3VyX3VuaXRfZGF0YSAmJiB0aGlzLmN1cl91bml0X2RhdGEubWluID09IGN1cl9kYXRhLm1pbil7XG4gICAgICAgICAgICAvLyDlkIzkuIDkuKrlr7nosaEu5LiN55So5Yid5aeL5YyWXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmN1cl91bml0X2RhdGEgPSBjdXJfZGF0YTtcbiAgICAgICAgdmFyIGFjdF9za2lsbCA9IGN1cl9kYXRhLmFjdF9za2lsbDtcbiAgICAgICAgdmFyIHBhc3NpdmVfc2tpbGwgPSBjdXJfZGF0YS5wYXNzaXZlX3NraWxsO1xuXG4gICAgICAgIC8vIOS4u+WKqOaKgOiDvVxuICAgICAgICB2YXIgaXRlbV93aWR0aCA9IHRoaXMuc2tpbGxfd2lkdGggKiBhY3Rfc2tpbGwubGVuZ3RoO1xuICAgICAgICB2YXIgbWF4X3dpZHRoID0gTWF0aC5tYXgodGhpcy5pdGVtX2NvbnRhaW5lcl8xLmdldENvbnRlbnRTaXplKCkud2lkdGgsIGl0ZW1fd2lkdGgpXG4gICAgICAgIHRoaXMuaXRlbV9jb250YWluZXJfMS5zZXRDb250ZW50U2l6ZShjYy5zaXplKG1heF93aWR0aCwgdGhpcy5pdGVtX2NvbnRhaW5lcl8xLmdldENvbnRlbnRTaXplKCkuaGVpZ2h0KSk7XG5cbiAgICAgICAgZm9yKHZhciBpIGluIGFjdF9za2lsbCl7XG4gICAgICAgICAgICB2YXIgdm8gPSBnZGF0YShcInNraWxsX2RhdGFcIixcImRhdGFfZ2V0X3NraWxsXCIsYWN0X3NraWxsW2ldKTtcbiAgICAgICAgICAgIGlmKHZvKXtcbiAgICAgICAgICAgICAgICBpZih0aGlzLmFjdF9za2lsbF9pdGVtX2xpc3RbaV0gPT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0X3NraWxsX2l0ZW1fbGlzdFtpXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdF9za2lsbF9pdGVtX2xpc3RbaV0gPSB0aGlzLnVwZGF0ZVNraWxsSXRlbSh2bywgdGhpcy5hY3Rfc2tpbGxfaXRlbV9saXN0W2ldLCB0cnVlKSBcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtX2NvbnRhaW5lcl8xLmFkZENoaWxkKHRoaXMuYWN0X3NraWxsX2l0ZW1fbGlzdFtpXS5jb24pO1xuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNraWxsSXRlbSh2bywgdGhpcy5hY3Rfc2tpbGxfaXRlbV9saXN0W2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5hY3Rfc2tpbGxfaXRlbV9saXN0W2ldLmNvbi5zZXRQb3NpdGlvbigodGhpcy5za2lsbF93aWR0aCArIDUpICogaSt0aGlzLnNraWxsX3dpZHRoLzIsIHRoaXMuc2tpbGxfd2lkdGgvMik7XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjYy5qcy5mb3JtYXRTdHIoXCLmioDog73ooahpZDogJXMg5rKh5Y+R546wXCIsYWN0X3NraWxsW2ldLnRvU3RyaW5nKCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOiiq+WKqOaKgOiDvVxuICAgICAgICB2YXIgaXRlbV93aWR0aCA9IHRoaXMuc2tpbGxfd2lkdGggKiBwYXNzaXZlX3NraWxsLmxlbmd0aDtcbiAgICAgICAgdmFyIG1heF93aWR0aCA9IE1hdGgubWF4KHRoaXMuaXRlbV9jb250YWluZXJfMi5nZXRDb250ZW50U2l6ZSgpLndpZHRoLCBpdGVtX3dpZHRoKTtcbiAgICAgICAgdGhpcy5pdGVtX2NvbnRhaW5lcl8yLnNldENvbnRlbnRTaXplKGNjLnNpemUobWF4X3dpZHRoLCB0aGlzLml0ZW1fY29udGFpbmVyXzIuZ2V0Q29udGVudFNpemUoKS5oZWlnaHQpKTtcblxuICAgICAgICBmb3IodmFyIGkgaW4gcGFzc2l2ZV9za2lsbCl7XG4gICAgICAgICAgICB2YXIgdm8gPSBnZGF0YShcInNraWxsX2RhdGFcIixcImRhdGFfZ2V0X3NraWxsXCIscGFzc2l2ZV9za2lsbFtpXSk7XG4gICAgICAgICAgICBpZih2byl7XG4gICAgICAgICAgICAgICAgaWYodGhpcy5wYXNzaXZlX3NraWxsX2l0ZW1fbGlzdFtpXSA9PSBudWxsKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXNzaXZlX3NraWxsX2l0ZW1fbGlzdFtpXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhc3NpdmVfc2tpbGxfaXRlbV9saXN0W2ldID0gdGhpcy51cGRhdGVTa2lsbEl0ZW0odm8sIHRoaXMucGFzc2l2ZV9za2lsbF9pdGVtX2xpc3RbaV0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtX2NvbnRhaW5lcl8yLmFkZENoaWxkKHRoaXMucGFzc2l2ZV9za2lsbF9pdGVtX2xpc3RbaV0uY29uKTtcbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTa2lsbEl0ZW0odm8sIHRoaXMucGFzc2l2ZV9za2lsbF9pdGVtX2xpc3RbaV0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucGFzc2l2ZV9za2lsbF9pdGVtX2xpc3RbaV0uY29uLnNldFBvc2l0aW9uKCh0aGlzLnNraWxsX3dpZHRoICsgNSkgKiBpK3RoaXMuc2tpbGxfd2lkdGgvMix0aGlzLnNraWxsX3dpZHRoLzIpO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coY2MuanMuZm9ybWF0U3RyKFwi5oqA6IO96KGoaWQ6ICVzIOayoeWPkeeOsFwiLHBhc3NpdmVfc2tpbGxbaV0udG9TdHJpbmcoKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIHVwZGF0ZVNwaW5lOmZ1bmN0aW9uKGxvb2tfaWQpe1xuICAgICAgICBpZighbG9va19pZClyZXR1cm47XG4gICAgICAgIHZhciBmdW4gPSBmdW5jdGlvbigpe1xuICAgICAgICAgICAgaWYoIXRoaXMuc3BpbmUpe1xuICAgICAgICAgICAgICAgIHRoaXMuc3BpbmUgPSBuZXcgQmFzZVJvbGUoKTtcbiAgICAgICAgICAgICAgICAvLyB0aGlzLnNwaW5lOnNldENhc2NhZGUodHJ1ZSlcbiAgICAgICAgICAgICAgICB0aGlzLnNwaW5lLnNldFBhcmVudCh0aGlzLm1vZGVfbm9kZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zcGluZS5ub2RlLnNldFBvc2l0aW9uKDAsNzYpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3BpbmUubm9kZS5zZXRBbmNob3JQb2ludChjYy52MigwLjUsMC41KSk7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5zcGluZTpzZXRPcGFjaXR5KDApXG4gICAgICAgICAgICAgICAgLy8gdmFyIGFjdGlvbiA9IGNjLmZhZGVJbigwLjIpO1xuICAgICAgICAgICAgICAgIC8vIHRoaXMuc3BpbmUucnVuQWN0aW9uKGFjdGlvbik7XG4gICAgICAgICAgICAgICAgdGhpcy5zcGluZS5zZXREYXRhKEJhc2VSb2xlLnR5cGUucm9sZSwgbG9va19pZCwgUGxheWVyQWN0aW9uLnNob3csIHRydWUsMC43NSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfS5iaW5kKHRoaXMpO1xuXG4gICAgICAgIGlmKHRoaXMuc3BpbmUpe1xuICAgICAgICAgICAgLy8gdGhpcy5zcGluZTpzZXRDYXNjYWRlKHRydWUpXG4gICAgICAgICAgICB2YXIgYWN0aW9uID0gY2MuZmFkZU91dCgwLjIpO1xuICAgICAgICAgICAgdGhpcy5zcGluZS5ub2RlLnJ1bkFjdGlvbihjYy5zZXF1ZW5jZShhY3Rpb24sIGNjLkNhbGxGdW5jKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgdGhpcy5zcGluZS5ub2RlLnN0b3BBbGxBY3Rpb25zKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zcGluZS5kZWxldGVNZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3BpbmUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGZ1bigpO1xuICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9KSkpXG4gICAgICAgICAgICBcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBmdW4oKVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEBpc19hY3Qg5piv5ZCm5Li75Yqo5oqA6IO9XG4gICAgdXBkYXRlU2tpbGxJdGVtOmZ1bmN0aW9uKGNvbmZpZywgc2tpbGxfaXRlbSwgaXNfYWN0KXtcbiAgICAgICAgdmFyIHNpemUgPSBjYy5zaXplKHRoaXMuc2tpbGxfd2lkdGgsdGhpcy5za2lsbF93aWR0aCk7XG4gICAgICAgIHZhciBza2lsbF9zaXplID0gY2Muc2l6ZSh0aGlzLnNraWxsX3dpZHRoIC0gNCAsdGhpcy5za2lsbF93aWR0aCAtIDQpO1xuICAgIFxuICAgICAgICBza2lsbF9pdGVtLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgaWYoc2tpbGxfaXRlbS5jb24gPT0gbnVsbCl7XG4gICAgICAgICAgICB2YXIgY29uID0gbmV3IGNjLk5vZGUoKTtcbiAgICAgICAgICAgIGNvbi5zZXRDb250ZW50U2l6ZShzaXplKTtcbiAgICAgICAgICAgIGNvbi5zY2FsZSA9IDAuNzU7XG5cbiAgICAgICAgICAgIFV0aWxzLm9uVG91Y2hFbmQoY29uLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYoc2tpbGxfaXRlbS5jb25maWcpe1xuICAgICAgICAgICAgICAgICAgICB2YXIgVGlwc0NvbnRyb2xsZXIgPSByZXF1aXJlKFwidGlwc19jb250cm9sbGVyXCIpXG4gICAgICAgICAgICAgICAgICAgIFRpcHNDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2hvd1NraWxsVGlwcyhza2lsbF9pdGVtLmNvbmZpZylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LmJpbmQodGhpcyksIDEpO1xuICAgICAgICAgICAgc2tpbGxfaXRlbS5jb24gPSBjb247XG4gICAgICAgICAgICAvLyDog4zmma9cbiAgICAgICAgICAgIHZhciByZXMgPSBQYXRoVG9vbC5nZXRDb21tb25JY29tUGF0aChcImNvbW1vbl8xMDA1XCIpO1xuICAgICAgICAgICAgdmFyIGJnID0gVXRpbHMuY3JlYXRlSW1hZ2UoY29uLG51bGwsMCwwLGNjLnYyKDAuNSwgMC41KSx0cnVlLCAwKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5sb2FkUmVzKHJlcywgKGZ1bmN0aW9uKGJnLHJlc09iamVjdCl7XG4gICAgICAgICAgICAgICAgaWYoYmcpe1xuICAgICAgICAgICAgICAgICAgICBiZy5zcHJpdGVGcmFtZSA9IHJlc09iamVjdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KS5iaW5kKHRoaXMsYmcpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyDmioDog71pY29uIFxuICAgICAgICB2YXIgcmVzID0gUGF0aFRvb2wuZ2V0SWNvblBhdGgoXCJza2lsbGljb25cIiwgY29uZmlnLmljb24pO1xuICAgICAgICBpZihza2lsbF9pdGVtLmljb24gPT0gbnVsbCl7XG4gICAgICAgICAgICBza2lsbF9pdGVtLmljb24gPSBVdGlscy5jcmVhdGVJbWFnZShza2lsbF9pdGVtLmNvbixudWxsLDAsMCxjYy52MigwLjUsIDAuNSksZmFsc2UsIDAsIGZhbHNlKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5sb2FkUmVzKHJlcywgKGZ1bmN0aW9uKHJlc09iamVjdCl7XG4gICAgICAgICAgICAgICAgaWYoc2tpbGxfaXRlbSAmJiBza2lsbF9pdGVtLmljb24pe1xuICAgICAgICAgICAgICAgICAgICBza2lsbF9pdGVtLmljb24uc3ByaXRlRnJhbWUgPSByZXNPYmplY3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkuYmluZCh0aGlzKSk7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGhpcy5sb2FkUmVzKHJlcywgKGZ1bmN0aW9uKHJlc09iamVjdCl7XG4gICAgICAgICAgICAgICAgaWYoc2tpbGxfaXRlbSAmJiBza2lsbF9pdGVtLmljb24pe1xuICAgICAgICAgICAgICAgICAgICBza2lsbF9pdGVtLmljb24uc3ByaXRlRnJhbWUgPSByZXNPYmplY3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICBcbiAgICAgICAgfVxuICAgICAgICAvLyDmioDog73nrYnnuqdcbiAgICAgICAgaWYoc2tpbGxfaXRlbS5sZXZfbGFiZWwgPT0gbnVsbCl7XG4gICAgICAgICAgICBza2lsbF9pdGVtLmxldl9sYWJlbCA9IFV0aWxzLmNyZWF0ZUxhYmVsKDI2LG5ldyBjYy5Db2xvcigweGZmLDB4ZmYsMHhmZiwweGZmKSxuZXcgY2MuQ29sb3IoMHgwMCwweDAwLDB4MDAsMHhmZiksdGhpcy5za2lsbF93aWR0aC8yKzEwLC10aGlzLnNraWxsX3dpZHRoLzItMjAsY29uZmlnLmxldmVsLnRvU3RyaW5nKCksc2tpbGxfaXRlbS5jb24sMixjYy52MigxLCAwKSk7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgc2tpbGxfaXRlbS5sZXZfbGFiZWwuc3RyaW5nID0gY29uZmlnLmxldmVsLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNraWxsX2l0ZW07XG4gICAgfSxcblxuICAgIC8vIOiuvue9rumAieaLqeahhlxuICAgIHNldFNlbGVjdENoZWNrQm94OmZ1bmN0aW9uKCl7XG4gICAgICAgIGlmKCF0aGlzLnNlbGVjdF9jaGVja2JveClyZXR1cm47XG4gICAgICAgIGlmKCF0aGlzLmNoZWNrYm94X2xpc3QpcmV0dXJuO1xuICAgICAgICBmb3IodmFyIGkgaW4gdGhpcy5jaGVja2JveF9saXN0KXtcbiAgICAgICAgICAgIGlmKHRoaXMuc2VsZWN0X2NoZWNrYm94ID09IGkpe1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tib3hfbGlzdFtpXS5nZXRDb21wb25lbnQoY2MuVG9nZ2xlKS5jaGVjaygpO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja2JveF9saXN0W2ldLmdldENvbXBvbmVudChjYy5Ub2dnbGUpLnVuY2hlY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cblxuICAgIC8vIOWFs+mXreeql+S9k+WbnuiwgyzpnIDopoHlnKjov5nph4zosIPnlKjor6XnqpfkvZPmiYDlsZ5jb250cm9sbGVy55qEY2xvc2Xmlrnms5XmsqHnlKjkuo7nva7nqbror6XnqpfkvZPlrp7kvovlr7nosaFcbiAgICBjbG9zZUNhbGxCYWNrOmZ1bmN0aW9uKCl7XG4gICAgICAgIGlmKHRoaXMuc3BpbmUpe1xuICAgICAgICAgICAgdGhpcy5zcGluZS5kZWxldGVNZSgpO1xuICAgICAgICAgICAgdGhpcy5zcGluZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZih0aGlzLnBsYXlfaGVhZCl7XG4gICAgICAgICAgICB0aGlzLnBsYXlfaGVhZC5kZWxldGVNZSgpO1xuICAgICAgICAgICAgdGhpcy5wbGF5X2hlYWQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3RybC5vcGVuUHJpbXVzQ2hhbGxlbmdlUGFuZWwoZmFsc2UpO1xuICAgIH0sXG59KSJdfQ==