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
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/battle/view/battle_scene.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, 'fae59zxS/NOQYmCXYS0lKcJ', 'battle_scene');
// Scripts/mod/battle/view/battle_scene.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: shiraho@syg.com(必填, 创建模块的人员)
// @description:
//      战斗场景
// <br/>Create: new Date().toISOString()
// --------------------------------------------------------------------
var BattleConst = require("battle_const");
 
var LoaderManager = require("loadermanager");
 
var PathTool = require("pathtool");
 
var AdventureController = require("adventure_controller");
 
var BattleScene = cc.Class({
  "extends": BaseClass,
  // extends: cc.Component,
  ctor: function ctor() {
    this.initConfig();
    this.createRootWnd();
    this.registerEvent();
  },
  // 初始化配置数据
  initConfig: function initConfig() {
    this.battle_controller = require("battle_controller").getInstance();
    this.battle_model = this.battle_controller.getModel();
    this.battle_hook_model = this.battle_controller.getHookModel();
    this.battle_drama_model = require("battle_drama_controller").getInstance().getModel();
    this.main_size = cc.size(SCREEN_WIDTH, SCREEN_HEIGHT); // this.main_size = cc.director.getVisibleSize();
 
    this.flayer_init_y = 716; //地图前景层
 
    this.map_init_y = 260; //角色和特效初始Y
 
    this.slayer_init_y = 0; //地图背景层
    // this.top_size_height = 400            //预留给剧情上面的可以滑动高度
 
    this.battle_res_id = 0; //当前战斗背景资源
 
    this.need_run_map = true; //是否需要移动地图
 
    this.f_speed = 0.4; //地图移动速率
 
    this.bg_speed = 2; // 背景层移动速率
 
    this.combat_type = BattleConst.Fight_Type.Nil; // 当前战斗类型
 
    this.real_role_list = {}; // 当前真实战斗的单位列表
 
    this.resources_list = {}; // 下载资源
  },
  setVisible: function setVisible(status) {
    if (this.root) {
      this.root.active = status;
    }
  },
  // 改变状态
  changeVisible: function changeVisible(status) {
    if (this.root) {
      if (!status) {
        this.root.x = 10000;
      } else {
        this.root.x = 0;
      }
    }
  },
  // 创建地图节点
  createRootWnd: function createRootWnd() {
    this.root = new cc.Node("base_root");
    this.root.setAnchorPoint(0.5, 0.5);
    this.root.setContentSize(this.main_size);
    this.root.setPosition(0, 0); // this.root.addComponent(cc.Mask);    // 设置剪辑区域
 
    ViewManager.getInstance().addToSceneNode(this.root, SCENE_TAG.battle);
    var layer_size = cc.size(SCREEN_WIDTH * FIT_SCALE, SCREEN_HEIGHT); // 场景主节点                         
 
    this.main_layer = new cc.Node();
    this.main_layer.setContentSize(layer_size);
    this.main_layer.setAnchorPoint(0.5, 0.5);
    this.main_layer.setPosition(0, 0);
    this.root.addChild(this.main_layer); // 远景层,
 
    this.map_fLayer = new cc.Node();
    this.map_fLayer.y = -layer_size.height * 0.5 + this.flayer_init_y;
    this.map_fLayer.x = -layer_size.width * 0.5;
    this.map_fLayer.setAnchorPoint(0, 0);
    this.map_fLayer.scale = FIT_SCALE;
    this.main_layer.addChild(this.map_fLayer, BATTLE_VIEW_BLACK_LAYER_Z0); // 前景层
 
    this.map_sLayer = new cc.Node();
    this.map_sLayer.setName("map_sLayer");
    this.map_sLayer.setAnchorPoint(0, 0);
    this.map_sLayer.setPosition(-layer_size.width * 0.5, -layer_size.height * 0.5 * FIT_SCALE);
    this.map_sLayer.scale = FIT_SCALE;
    this.main_layer.addChild(this.map_sLayer, BATTLE_VIEW_BLACK_LAYER_Z0 + 1); // 单张场景
 
    this.map_oLayer = new cc.Node(); // var layer_wdg = map_oLayer.addComponent(cc.Widget);
    // layer_wdg.isAlignHorizontalCenter = true;
 
    this.map_oLayer.setName("map_oLayer");
    this.map_oLayer.setAnchorPoint(0, 0);
    this.map_oLayer.setPosition(-layer_size.width * 0.5, -layer_size.height * 0.5 * FIT_SCALE);
    this.map_oLayer.scale = FIT_SCALE * 1.43;
    this.main_layer.addChild(this.map_oLayer, BATTLE_VIEW_BLACK_LAYER_Z0 + 1); // 战斗
 
    this.battle_layer = new cc.Node();
    this.battle_layer.setName("battle_layer");
    this.battle_layer.setAnchorPoint(0, 0);
    this.battle_layer.setPosition(-SCREEN_WIDTH * 0.5, -SCREEN_HEIGHT * 0.5);
    this.main_layer.addChild(this.battle_layer, BATTLE_VIEW_BLACK_LAYER_Z0 + 1); // 特效层
 
    this.effect_layer_1 = new cc.Node();
    this.effect_layer_1.y = this.map_init_y;
    this.effect_layer_1.setAnchorPoint(0, 0);
    this.battle_layer.addChild(this.effect_layer_1, BATTLE_VIEW_ROLE_LAYER_Z + 1); // 特效层2
 
    this.effect_layer_2 = new cc.Node();
    this.effect_layer_2.y = this.map_init_y;
    this.effect_layer_2.setAnchorPoint(0, 0);
    this.battle_layer.addChild(this.effect_layer_2, BATTLE_VIEW_ROLE_LAYER_Z - 1); // 角色层, 角色层是加载 特效2 和特效1志健
 
    this.role_layer = new cc.Node();
    this.role_layer.y = this.map_init_y;
    this.role_layer.setAnchorPoint(0, 0);
    this.battle_layer.addChild(this.role_layer, BATTLE_VIEW_ROLE_LAYER_Z);
  },
  // 监听一些事件
  registerEvent: function registerEvent() {},
 
  /**
   * 更新或者创建战斗场景
   * @param {*} is_real 
   */
  updateBattleScene: function updateBattleScene(is_real) {
    this.is_real_fight = is_real; // 更新战斗地图
 
    this.changeBattleScene(is_real); // 初始化战斗单位
 
    if (is_real == true) {
      // 创建真战斗的角色
      var need_enter = this.battle_model.needPlayEnterAction();
 
      if (need_enter == true) {
        // 如果是初始化战斗的话,需要播放进场动画
        this.floorTips();
      } else {
        this.battle_model.createRoleList();
      }
 
      this.update_drama_battle = false;
      this.init_drama_finish = false;
      this.battle_res_id = null;
    } else {
      this.update_drama_battle = true; // 创建假战斗的角色
 
      if (this.init_drama_finish) this.battle_hook_model.prepareStarBattle(this.initDramaFinish.bind(this));
    }
  },
  // 判断是否需要播放进出场的boss来袭或者是pk的VS动画
  floorTips: function floorTips() {
    var battle_data = this.battle_model.getCurBattleData();
    if (battle_data == null) return;
    var combat_config = Config.combat_type_data.data_fight_list[battle_data.combat_type];
 
    if (combat_config) {
      if (BattleConst.isNeedSpecStart(battle_data.combat_type)) {
        // 显示PK动画
        this.showSpecStart();
      } else {
        // 显示BOSS来袭动画
        var start_effect = combat_config.start_effect;
 
        if (battle_data.combat_type == BattleConst.Fight_Type.Darma) {
          var drama_data = this.battle_drama_model.getDramaData();
 
          if (drama_data && drama_data.dun_id) {
            var dun_config = Config.dungeon_data.data_drama_dungeon_info[drama_data.dun_id];
 
            if (dun_config && dun_config.is_big != 1) {
              start_effect = "E51147";
            }
          }
        }
 
        Utils.playEffectOnce(start_effect, this.main_size.width * 0.5, 770 - this.map_init_y, this.effect_layer_1, function () {
          this.battle_model.createRoleList();
        }.bind(this), PlayerAction.action, 1);
      }
    } else {
      this.battle_model.createRoleList();
    }
  },
  // pk战斗的进场动画
  showSpecStart: function showSpecStart() {
    if (this.specail_enter) return;
    if (this.is_play_enter == true) return;
    this.is_play_enter = true;
    var prefab_path = PathTool.getPrefabPath("battle", "battle_pk_enter_node");
    this.loadRes(prefab_path, function (res_object) {
      if (res_object) {
        this.playSpecialEnterAction(res_object);
      }
    }.bind(this));
  },
  // 播放pk进场动画
  playSpecialEnterAction: function playSpecialEnterAction(res_object) {
    this.specail_enter = res_object; // this.specail_enter.x = this.main_size.width * 0.5;
    // this.specail_enter.y = this.main_size.height * 0.5 - this.map_init_y;
    // this.effect_layer_1.addChild(this.specail_enter);
 
    this.specail_enter.x = SCREEN_WIDTH * 0.5;
    this.specail_enter.y = SCREEN_HEIGHT * 0.5;
    ViewManager.getInstance().addToSceneNode(this.specail_enter, SCENE_TAG.win);
    var center_spine = this.specail_enter.getChildByName("center_spine").getComponent(sp.Skeleton);
    var background = this.specail_enter.getChildByName("background");
    background.scale = FIT_SCALE;
    var left_bg = this.specail_enter.getChildByName("left_bg");
    var left_spine = left_bg.getChildByName("spine").getComponent(sp.Skeleton);
    var left_form = left_bg.getChildByName("form_container");
    var left_icon = left_form.getChildByName("icon").getComponent(cc.Sprite);
    var left_name = left_bg.getChildByName("role_name").getComponent(cc.Label);
    var right_bg = this.specail_enter.getChildByName("right_bg");
    var right_spine = right_bg.getChildByName("spine").getComponent(sp.Skeleton);
    var right_form = right_bg.getChildByName("form_container");
    var right_icon = right_form.getChildByName("icon").getComponent(cc.Sprite);
    var right_name = right_bg.getChildByName("role_name").getComponent(cc.Label);
    left_bg.runAction(cc.sequence(cc.moveTo(0.4, -100, 100), cc.callFunc(function () {
      this.showLeftEffect(center_spine, left_spine, right_spine);
    }.bind(this)), cc.delayTime(2), cc.callFunc(function () {
      // 这里还需要释放掉这个预制
      if (this.specail_enter) {
        // this.specail_enter.destroyAllChildren()
        this.specail_enter.destroy();
        this.specail_enter = null;
      }
 
      this.battle_model.createRoleList();
    }.bind(this))));
    right_bg.runAction(cc.sequence(cc.moveTo(0.4, 100, -100), cc.callFunc(function () {}.bind(this))));
    var battle_data = this.battle_model.getCurBattleData();
 
    if (battle_data) {
      // 设置名字
      var left_is_friend = this.battle_model.isFriend(BattleConst.Group_Type.Friend);
      var left_form = null;
      var right_form = null;
 
      if (left_is_friend == true) {
        left_name.string = battle_data.actor_role_name;
        right_name.string = battle_data.target_role_name;
        left_form = battle_data.formation[1];
        right_form = battle_data.formation[2];
      } else {
        left_name.string = battle_data.target_role_name;
        right_name.string = battle_data.actor_role_name;
        left_form = battle_data.formation[2];
        right_form = battle_data.formation[1];
      } // 设置阵法
 
 
      if (left_form) {
        var res_path = PathTool.getBattleFormIcon(left_form.formation_type);
        this.loadRes(res_path, function (res_object) {
          left_icon.spriteFrame = res_object;
        }.bind(this));
      }
 
      if (right_form) {
        var res_path = PathTool.getBattleFormIcon(right_form.formation_type);
        this.loadRes(res_path, function (res_object) {
          right_icon.spriteFrame = res_object;
        }.bind(this));
      }
    }
  },
  // pk特效加载
  showLeftEffect: function showLeftEffect(center_spine, left_spine, right_spine) {
    if (center_spine == null || left_spine == null) return;
    var skeleton_path = PathTool.getSpinePath("E51141");
    this.loadRes(skeleton_path, function (res_object) {
      center_spine.skeletonData = res_object;
      left_spine.skeletonData = res_object;
      right_spine.skeletonData = res_object;
      center_spine.setAnimation(0, PlayerAction.action_2, true);
      left_spine.setAnimation(0, PlayerAction.action_1, false);
      right_spine.setAnimation(0, PlayerAction.action_1, false);
    }.bind(this));
  },
  // 获取当前战斗的资源
  curBattleResId: function curBattleResId(combat_type) {
    var battle_res_id = 10001;
 
    if (combat_type == BattleConst.Fight_Type.Darma) {
      var drama_data = this.battle_drama_model.getDramaData();
 
      if (drama_data && drama_data.mode && drama_data.chapter_id) {
        var drama_config = Config.dungeon_data.data_drama_world_info[drama_data.mode][drama_data.chapter_id];
        battle_res_id = drama_config.map_id;
      }
    } else {
      var base_config = Config.battle_bg_data.data_info[combat_type];
 
      if (base_config == null) {
        base_config = Config.battle_bg_data.data_info[BattleConst.Fight_Type.Default];
      }
 
      if (base_config == null) {
        battle_res_id = 10001;
      } else {
        battle_res_id = base_config.bid;
      } // 冒险战斗后面加
 
 
      if (combat_type == BattleConst.Fight_Type.Adventrue) {
        var base_data = AdventureController.getInstance().getModel().getAdventureBaseData();
 
        if (base_data) {
          var config = Config.adventure_data.data_battle_res[base_data.id];
 
          if (config && config.battle_res_id) {
            battle_res_id = config.battle_res_id;
          }
        }
      }
    }
 
    return battle_res_id;
  },
  // 更新战斗背景
  changeBattleScene: function changeBattleScene(is_real) {
    var battle_data = this.battle_model.getCurBattleData();
    var unreal_battle_data = this.battle_hook_model.getUnrealBattleData();
 
    if (battle_data == null && unreal_battle_data == null) {
      return;
    }
 
    var combat_type = BattleConst.Fight_Type.Nil;
 
    if (is_real == true) {
      combat_type = battle_data.combat_type; // 如果是真实战斗,并且是剧情战斗的话,就要去当前剧情id然后获取资源
    } else {
      combat_type = BattleConst.Fight_Type.Darma;
    }
 
    this.combat_type = combat_type; // 整场战斗唯一,也是判断的依据
 
    this.need_run_map = !is_real; // 非真实战斗才需要移动地图
 
    var battle_res_id = this.curBattleResId(combat_type);
    this.loaderBattleScene(battle_res_id); // 切换战斗背景资源
    // 这里做一次音乐的播放处理
 
    var music_config = null;
 
    if (this.combat_type == BattleConst.Fight_Type.Darma) {
      var config = Config.battle_bg_data.data_info2[this.combat_type];
 
      if (config && config[battle_res_id]) {
        music_config = config[battle_res_id];
      }
    } else {
      music_config = Config.battle_bg_data.data_info[this.combat_type];
    }
 
    if (music_config && music_config.bg_music != "") {
      Utils.playMusic(AUDIO_TYPE.BATTLE, music_config.bg_music, true);
    }
  },
  // 创建战斗背景,也用于更新下一章节的时候切换假战斗资源
  loaderBattleScene: function loaderBattleScene(battle_res_id) {
    if (battle_res_id == 0) return;
 
    if (this.battle_res_id != battle_res_id) {
      this.battle_res_id = battle_res_id;
 
      if (this.combat_type == BattleConst.Fight_Type.Darma) {
        var res_object = PathTool.getBattleDrameBg(battle_res_id);
 
        if (battle_res_id) {
          this.createDramaScene(battle_res_id);
        }
      } else {
        this.createSingleScene(battle_res_id);
      }
    }
  },
  // 创建剧情副本的背景资源
  // s_parh:string 背景资源 f_path:string 前景资源
  createDramaScene: function createDramaScene(battle_res_id) {
    var bg_1_f = false;
    var bg_2_f = false;
    var drama_paths = PathTool.getBattleDrameBg(battle_res_id);
    LoaderManager.getInstance().loadRes(drama_paths.s, function (res_object) {
      if (this.root && this.root.isValid == false) return;
 
      if (res_object) {
        if (this.drama_s_bg == null) {
          this.drama_s_bg = new cc.Node();
          this.drama_s_bg.scale = 1.43;
          this.drama_s_bg.setAnchorPoint(0, 0);
          this.drama_s_bg.setPosition(0, this.slayer_init_y);
          this.map_sLayer.addChild(this.drama_s_bg, BATTLE_VIEW_BACK_LAYER_Z);
          this.drama_s_bg_frame = this.drama_s_bg.addComponent(cc.Sprite); // 创建第二张,
 
          this.drama_s_bg_2 = cc.instantiate(this.drama_s_bg);
          this.drama_s_bg_frame_2 = this.drama_s_bg_2.getComponent(cc.Sprite);
          this.map_sLayer.addChild(this.drama_s_bg_2, BATTLE_VIEW_BACK_LAYER_Z);
        }
 
        this.drama_s_bg_frame.spriteFrame = res_object;
        this.drama_s_bg_frame_2.spriteFrame = res_object; // 设置第二张坐标
 
        if (this.drama_s_bg_width == null) {
          this.drama_s_bg_width = this.drama_s_bg.getContentSize().width * 1.43;
          this.drama_s_bg_2.setPosition(this.drama_s_bg.x + this.drama_s_bg_width, this.slayer_init_y);
        }
      }
 
      bg_1_f = true;
 
      if (bg_2_f) {
        if (this.update_drama_battle && !this.init_drama_finish) {
          this.battle_hook_model.prepareStarBattle(this.initDramaFinish.bind(this));
        } // this.init_drama_finish = true;
 
      }
    }.bind(this));
    LoaderManager.getInstance().loadRes(drama_paths.f, function (res_object) {
      if (res_object) {
        if (this.root && this.root.isValid == false) return;
 
        if (this.drama_f_bg == null) {
          this.drama_f_bg = new cc.Node();
          this.drama_f_bg.setAnchorPoint(0, 0);
          this.drama_f_bg.scale = 1.43;
          this.map_fLayer.addChild(this.drama_f_bg, BATTLE_VIEW_BACK_LAYER_Z);
          this.drama_f_bg_frame = this.drama_f_bg.addComponent(cc.Sprite); // 创建第二张,
 
          this.drama_f_bg_2 = cc.instantiate(this.drama_f_bg);
          this.drama_f_bg_frame_2 = this.drama_f_bg_2.getComponent(cc.Sprite);
          this.map_fLayer.addChild(this.drama_f_bg_2, BATTLE_VIEW_BACK_LAYER_Z);
        }
 
        this.drama_f_bg_frame.spriteFrame = res_object;
        this.drama_f_bg_frame_2.spriteFrame = res_object; // 设置第二张坐标
 
        if (this.drama_f_bg_width == null) {
          this.drama_f_bg_width = this.drama_f_bg.getContentSize().width * 1.43;
          this.drama_f_bg_2.x = this.drama_f_bg.x + this.drama_f_bg_width;
        }
 
        bg_2_f = true;
 
        if (bg_1_f) {
          if (this.update_drama_battle && !this.init_drama_finish) {
            this.battle_hook_model.prepareStarBattle(this.initDramaFinish.bind(this));
          } // this.init_drama_finish = true;
 
        }
      }
    }.bind(this));
  },
  initDramaFinish: function initDramaFinish() {
    this.init_drama_finish = true;
  },
  // 创建单张战斗背景的
  createSingleScene: function createSingleScene(res_id) {
    if (this.map_sLayer_frame == null) {
      this.map_sLayer_frame = this.map_oLayer.addComponent(cc.Sprite);
    }
 
    var res_path = PathTool.getBattleSingleBg(res_id);
    this.loadRes(res_path, function (res_object) {
      this.map_sLayer_frame.spriteFrame = res_object;
    }.bind(this));
  },
  // 打开定帧处理
  mapMovescheduleUpdate: function mapMovescheduleUpdate() {
    if (this.need_run_map && this.init_drama_finish) {
      this.moveMap();
    }
  },
  // 设置是否移动地图,只有剧情战斗才需要做这个处理
  changeMoveMapStatus: function changeMoveMapStatus(status) {
    if (this.combat_type == BattleConst.Fight_Type.Darma) {
      this.need_run_map = status;
    }
  },
  // 移动地图
  moveMap: function moveMap() {
    if (this.drama_s_bg == null || this.drama_f_bg == null) {
      return;
    }
 
    this.drama_s_bg.x = this.drama_s_bg.x - this.bg_speed;
    this.drama_s_bg_2.x = this.drama_s_bg_2.x - this.bg_speed;
    this.drama_f_bg.x = this.drama_f_bg.x - this.f_speed;
    this.drama_f_bg_2.x = this.drama_f_bg_2.x - this.f_speed; // 移动背景层
 
    this.changeBgPosition(this.drama_s_bg, this.drama_s_bg_2, this.drama_s_bg_width);
    this.changeBgPosition(this.drama_s_bg_2, this.drama_s_bg, this.drama_s_bg_width); // 移动前景层
 
    this.changeBgPosition(this.drama_f_bg, this.drama_f_bg_2, this.drama_f_bg_width);
    this.changeBgPosition(this.drama_f_bg_2, this.drama_f_bg, this.drama_f_bg_width);
  },
  // 设置地图位置可能移动越界了
  changeBgPosition: function changeBgPosition(cur_bg, target_bg, width) {
    if (cur_bg == null || target_bg == null) {
      return;
    }
 
    if (cur_bg.x <= -width) {
      cur_bg.x = target_bg.x + width;
    }
  },
  // 更新回合
  updateRound: function updateRound(round) {// local fight_list_config = Config.combat_type_data.data_fight_list
    // if fight_list_config == nil or fight_list_config[self.battle_type] == nil then return end
    // local total_round = fight_list_config[self.battle_type].max_action_count or 0
    // if not _tolua_isnull(self.round_label) then
    //     self.round_label:setString(string.format(TI18N("第%d/%d回合"), round, total_round))
    // end
  },
  // 单位被动技能喊招
  showPassiveSkillName: function showPassiveSkillName(battle_role, callback) {
    if (callback) {
      callback();
    }
  },
  // 获取战斗的特效层
  getBattleEffectLayer: function getBattleEffectLayer(index) {
    if (index == 1) {
      return this.effect_layer_1;
    } else {
      return this.effect_layer_2;
    }
  },
  // 返回角色层
  getBattleRoleLayer: function getBattleRoleLayer() {
    return this.role_layer;
  },
  loadRes: function loadRes(res, callback) {
    if (res == null || res == "") return;
    if (callback == null) return;
    LoaderManager.getInstance().loadRes(res, function (res_object) {
      if (this.resources_list[res] == null) {
        this.resources_list[res] = res;
      }
 
      callback(res_object);
    }.bind(this));
  },
  // 释放掉战斗场景相关信息
  deleteMe: function deleteMe() {
    if (this.black_layer) {
      this.black_layer.stopAllActions();
    }
 
    if (this.specail_enter) {
      this.specail_enter.destroy();
      this.specail_enter = null;
    }
 
    for (var key in this.resources_list) {
      LoaderManager.getInstance().releaseRes(key);
    }
 
    this.root.destroy();
  },
  // 设置黑屏,战斗效果播放
  setBlack: function setBlack(status, alpha) {
    if (!status) {
      if (this.black_layer) {
        this.black_layer.stopAllActions();
        this.black_layer.active = false;
        this.black_on_show = false;
      }
    } else {
      if (this.black_on_show == true) return;
      this.black_on_show = true;
 
      if (this.black_layer) {
        this.black_layer.active = true;
      } else {
        this.black_layer = new cc.Node();
        this.black_layer.setAnchorPoint(0, 0);
        this.black_layer.setContentSize(this.main_size.width + 200, this.main_size.height + 200);
        this.black_layer.setPosition(-100, -100);
        this.black_layer.scale = FIT_SCALE;
        this.battle_layer.addChild(this.black_layer, 1);
        var graphics_cp = this.black_layer.addComponent(cc.Graphics);
        graphics_cp.clear();
        graphics_cp.fillColor = cc.color(0, 0, 0, 168);
        graphics_cp.rect(0, 0, this.main_size.width + 200, this.main_size.height + 200);
        graphics_cp.fill();
      }
 
      this.black_layer.opacity = 0;
      this.black_layer.runAction(cc.fadeIn(0.2));
    }
  },
  // 震屏,战斗效果播放
  shakeScreen: function shakeScreen(shake_id) {
    var _this = this;
 
    if (this.is_shake) return;
    if (shake_id == null) return;
    var data_config = Config.skill_data.data_get_shake_data[shake_id];
    if (data_config == null) return;
    this.is_shake = true;
    this.main_layer.stopAllActions();
    this.main_layer.setPosition(0, 0); // 重置位置
 
    var returnPos = function () {
      this.is_shake = false;
      this.main_layer.setPosition(0, 0);
    }.bind(this);
 
    var order = [0, 3, 6, 4, 7, 8, 5, 2, 1];
    var str = data_config.shake_strength; // 振幅,单位像素
 
    var step = data_config.shake_rate * 0.001; // 振幅间隔,单位秒
 
    var shakeTime = data_config.shake_time; // 振动次数
 
    var shakeXTime = 0.25; // 横向加倍
 
    var shakeYTime = 0.25; // 纵向加倍
 
    var xy_list = [[-0.7, 0.7], [0, 1], [0.7, 0.7], [-1, 0], [0, 0], [1, 0], [-0.7, -0.7], [0, -1], [0.7, -0.7]]; // 随机设置坐标
 
    var setRandomPos = function (index) {
      var pos_x = str * shakeYTime * xy_list[order[index]][0];
      var pos_y = -str * shakeXTime * xy_list[order[index]][1];
      this.main_layer.setPosition(pos_x, pos_y);
    }.bind(this);
 
    var base_call = null;
 
    for (var times = 0; times < shakeTime; times++) {
      var _loop = function _loop(index) {
        delay = cc.delayTime(step);
 
        if (base_call == null) {
          base_call = cc.sequence(cc.callFunc(function () {
            setRandomPos(index);
          }.bind(_this)), delay);
        } else {
          base_call = cc.sequence(base_call, cc.callFunc(function () {
            setRandomPos(index);
          }.bind(_this), delay));
        }
      };
 
      for (var index = 0; index < order.length; index++) {
        var delay;
 
        _loop(index);
      }
 
      str = str - 3;
    }
 
    if (base_call) {
      base_call = cc.sequence(base_call, cc.callFunc(returnPos));
      this.main_layer.runAction(base_call);
    }
  }
});
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxiYXR0bGVcXHZpZXdcXGJhdHRsZV9zY2VuZS5qcyJdLCJuYW1lcyI6WyJCYXR0bGVDb25zdCIsInJlcXVpcmUiLCJMb2FkZXJNYW5hZ2VyIiwiUGF0aFRvb2wiLCJBZHZlbnR1cmVDb250cm9sbGVyIiwiQmF0dGxlU2NlbmUiLCJjYyIsIkNsYXNzIiwiQmFzZUNsYXNzIiwiY3RvciIsImluaXRDb25maWciLCJjcmVhdGVSb290V25kIiwicmVnaXN0ZXJFdmVudCIsImJhdHRsZV9jb250cm9sbGVyIiwiZ2V0SW5zdGFuY2UiLCJiYXR0bGVfbW9kZWwiLCJnZXRNb2RlbCIsImJhdHRsZV9ob29rX21vZGVsIiwiZ2V0SG9va01vZGVsIiwiYmF0dGxlX2RyYW1hX21vZGVsIiwibWFpbl9zaXplIiwic2l6ZSIsIlNDUkVFTl9XSURUSCIsIlNDUkVFTl9IRUlHSFQiLCJmbGF5ZXJfaW5pdF95IiwibWFwX2luaXRfeSIsInNsYXllcl9pbml0X3kiLCJiYXR0bGVfcmVzX2lkIiwibmVlZF9ydW5fbWFwIiwiZl9zcGVlZCIsImJnX3NwZWVkIiwiY29tYmF0X3R5cGUiLCJGaWdodF9UeXBlIiwiTmlsIiwicmVhbF9yb2xlX2xpc3QiLCJyZXNvdXJjZXNfbGlzdCIsInNldFZpc2libGUiLCJzdGF0dXMiLCJyb290IiwiYWN0aXZlIiwiY2hhbmdlVmlzaWJsZSIsIngiLCJOb2RlIiwic2V0QW5jaG9yUG9pbnQiLCJzZXRDb250ZW50U2l6ZSIsInNldFBvc2l0aW9uIiwiVmlld01hbmFnZXIiLCJhZGRUb1NjZW5lTm9kZSIsIlNDRU5FX1RBRyIsImJhdHRsZSIsImxheWVyX3NpemUiLCJGSVRfU0NBTEUiLCJtYWluX2xheWVyIiwiYWRkQ2hpbGQiLCJtYXBfZkxheWVyIiwieSIsImhlaWdodCIsIndpZHRoIiwic2NhbGUiLCJCQVRUTEVfVklFV19CTEFDS19MQVlFUl9aMCIsIm1hcF9zTGF5ZXIiLCJzZXROYW1lIiwibWFwX29MYXllciIsImJhdHRsZV9sYXllciIsImVmZmVjdF9sYXllcl8xIiwiQkFUVExFX1ZJRVdfUk9MRV9MQVlFUl9aIiwiZWZmZWN0X2xheWVyXzIiLCJyb2xlX2xheWVyIiwidXBkYXRlQmF0dGxlU2NlbmUiLCJpc19yZWFsIiwiaXNfcmVhbF9maWdodCIsImNoYW5nZUJhdHRsZVNjZW5lIiwibmVlZF9lbnRlciIsIm5lZWRQbGF5RW50ZXJBY3Rpb24iLCJmbG9vclRpcHMiLCJjcmVhdGVSb2xlTGlzdCIsInVwZGF0ZV9kcmFtYV9iYXR0bGUiLCJpbml0X2RyYW1hX2ZpbmlzaCIsInByZXBhcmVTdGFyQmF0dGxlIiwiaW5pdERyYW1hRmluaXNoIiwiYmluZCIsImJhdHRsZV9kYXRhIiwiZ2V0Q3VyQmF0dGxlRGF0YSIsImNvbWJhdF9jb25maWciLCJDb25maWciLCJjb21iYXRfdHlwZV9kYXRhIiwiZGF0YV9maWdodF9saXN0IiwiaXNOZWVkU3BlY1N0YXJ0Iiwic2hvd1NwZWNTdGFydCIsInN0YXJ0X2VmZmVjdCIsIkRhcm1hIiwiZHJhbWFfZGF0YSIsImdldERyYW1hRGF0YSIsImR1bl9pZCIsImR1bl9jb25maWciLCJkdW5nZW9uX2RhdGEiLCJkYXRhX2RyYW1hX2R1bmdlb25faW5mbyIsImlzX2JpZyIsIlV0aWxzIiwicGxheUVmZmVjdE9uY2UiLCJQbGF5ZXJBY3Rpb24iLCJhY3Rpb24iLCJzcGVjYWlsX2VudGVyIiwiaXNfcGxheV9lbnRlciIsInByZWZhYl9wYXRoIiwiZ2V0UHJlZmFiUGF0aCIsImxvYWRSZXMiLCJyZXNfb2JqZWN0IiwicGxheVNwZWNpYWxFbnRlckFjdGlvbiIsIndpbiIsImNlbnRlcl9zcGluZSIsImdldENoaWxkQnlOYW1lIiwiZ2V0Q29tcG9uZW50Iiwic3AiLCJTa2VsZXRvbiIsImJhY2tncm91bmQiLCJsZWZ0X2JnIiwibGVmdF9zcGluZSIsImxlZnRfZm9ybSIsImxlZnRfaWNvbiIsIlNwcml0ZSIsImxlZnRfbmFtZSIsIkxhYmVsIiwicmlnaHRfYmciLCJyaWdodF9zcGluZSIsInJpZ2h0X2Zvcm0iLCJyaWdodF9pY29uIiwicmlnaHRfbmFtZSIsInJ1bkFjdGlvbiIsInNlcXVlbmNlIiwibW92ZVRvIiwiY2FsbEZ1bmMiLCJzaG93TGVmdEVmZmVjdCIsImRlbGF5VGltZSIsImRlc3Ryb3kiLCJsZWZ0X2lzX2ZyaWVuZCIsImlzRnJpZW5kIiwiR3JvdXBfVHlwZSIsIkZyaWVuZCIsInN0cmluZyIsImFjdG9yX3JvbGVfbmFtZSIsInRhcmdldF9yb2xlX25hbWUiLCJmb3JtYXRpb24iLCJyZXNfcGF0aCIsImdldEJhdHRsZUZvcm1JY29uIiwiZm9ybWF0aW9uX3R5cGUiLCJzcHJpdGVGcmFtZSIsInNrZWxldG9uX3BhdGgiLCJnZXRTcGluZVBhdGgiLCJza2VsZXRvbkRhdGEiLCJzZXRBbmltYXRpb24iLCJhY3Rpb25fMiIsImFjdGlvbl8xIiwiY3VyQmF0dGxlUmVzSWQiLCJtb2RlIiwiY2hhcHRlcl9pZCIsImRyYW1hX2NvbmZpZyIsImRhdGFfZHJhbWFfd29ybGRfaW5mbyIsIm1hcF9pZCIsImJhc2VfY29uZmlnIiwiYmF0dGxlX2JnX2RhdGEiLCJkYXRhX2luZm8iLCJEZWZhdWx0IiwiYmlkIiwiQWR2ZW50cnVlIiwiYmFzZV9kYXRhIiwiZ2V0QWR2ZW50dXJlQmFzZURhdGEiLCJjb25maWciLCJhZHZlbnR1cmVfZGF0YSIsImRhdGFfYmF0dGxlX3JlcyIsImlkIiwidW5yZWFsX2JhdHRsZV9kYXRhIiwiZ2V0VW5yZWFsQmF0dGxlRGF0YSIsImxvYWRlckJhdHRsZVNjZW5lIiwibXVzaWNfY29uZmlnIiwiZGF0YV9pbmZvMiIsImJnX211c2ljIiwicGxheU11c2ljIiwiQVVESU9fVFlQRSIsIkJBVFRMRSIsImdldEJhdHRsZURyYW1lQmciLCJjcmVhdGVEcmFtYVNjZW5lIiwiY3JlYXRlU2luZ2xlU2NlbmUiLCJiZ18xX2YiLCJiZ18yX2YiLCJkcmFtYV9wYXRocyIsInMiLCJpc1ZhbGlkIiwiZHJhbWFfc19iZyIsIkJBVFRMRV9WSUVXX0JBQ0tfTEFZRVJfWiIsImRyYW1hX3NfYmdfZnJhbWUiLCJhZGRDb21wb25lbnQiLCJkcmFtYV9zX2JnXzIiLCJpbnN0YW50aWF0ZSIsImRyYW1hX3NfYmdfZnJhbWVfMiIsImRyYW1hX3NfYmdfd2lkdGgiLCJnZXRDb250ZW50U2l6ZSIsImYiLCJkcmFtYV9mX2JnIiwiZHJhbWFfZl9iZ19mcmFtZSIsImRyYW1hX2ZfYmdfMiIsImRyYW1hX2ZfYmdfZnJhbWVfMiIsImRyYW1hX2ZfYmdfd2lkdGgiLCJyZXNfaWQiLCJtYXBfc0xheWVyX2ZyYW1lIiwiZ2V0QmF0dGxlU2luZ2xlQmciLCJtYXBNb3Zlc2NoZWR1bGVVcGRhdGUiLCJtb3ZlTWFwIiwiY2hhbmdlTW92ZU1hcFN0YXR1cyIsImNoYW5nZUJnUG9zaXRpb24iLCJjdXJfYmciLCJ0YXJnZXRfYmciLCJ1cGRhdGVSb3VuZCIsInJvdW5kIiwic2hvd1Bhc3NpdmVTa2lsbE5hbWUiLCJiYXR0bGVfcm9sZSIsImNhbGxiYWNrIiwiZ2V0QmF0dGxlRWZmZWN0TGF5ZXIiLCJpbmRleCIsImdldEJhdHRsZVJvbGVMYXllciIsInJlcyIsImRlbGV0ZU1lIiwiYmxhY2tfbGF5ZXIiLCJzdG9wQWxsQWN0aW9ucyIsImtleSIsInJlbGVhc2VSZXMiLCJzZXRCbGFjayIsImFscGhhIiwiYmxhY2tfb25fc2hvdyIsImdyYXBoaWNzX2NwIiwiR3JhcGhpY3MiLCJjbGVhciIsImZpbGxDb2xvciIsImNvbG9yIiwicmVjdCIsImZpbGwiLCJvcGFjaXR5IiwiZmFkZUluIiwic2hha2VTY3JlZW4iLCJzaGFrZV9pZCIsImlzX3NoYWtlIiwiZGF0YV9jb25maWciLCJza2lsbF9kYXRhIiwiZGF0YV9nZXRfc2hha2VfZGF0YSIsInJldHVyblBvcyIsIm9yZGVyIiwic3RyIiwic2hha2Vfc3RyZW5ndGgiLCJzdGVwIiwic2hha2VfcmF0ZSIsInNoYWtlVGltZSIsInNoYWtlX3RpbWUiLCJzaGFrZVhUaW1lIiwic2hha2VZVGltZSIsInh5X2xpc3QiLCJzZXRSYW5kb21Qb3MiLCJwb3NfeCIsInBvc195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Q0gsV0FGbUMsQ0FFbEMxSSxJQUZrQyxDQUU3QixLQUY2QixDQUFaLENBQVosRUFFR29MLEtBRkgsQ0FBWjtBQUdILFNBSkQsTUFJSztBQUNERixVQUFBQSxTQUFTLEdBQUc1UCxFQUFFLENBQUMySCxRQUFILENBQVlpSSxTQUFaLEVBQXVCNVAsRUFBRSxDQUFDNkgsUUFBSCxDQUFZLFlBQVU7QUFDckQ0SCxZQUFBQSxZQUFZLENBQUNyQyxLQUFELENBQVo7QUFDSCxXQUY4QyxDQUU3QzFJLElBRjZDLENBRXhDLEtBRndDLENBQVosRUFFckJvTCxLQUZxQixDQUF2QixDQUFaO0FBR0g7QUFYdUM7O0FBQzVDLFdBQUssSUFBSTFDLEtBQUssR0FBRyxDQUFqQixFQUFvQkEsS0FBSyxHQUFHMkIsS0FBSyxDQUFDZ0IsTUFBbEMsRUFBMEMzQyxLQUFLLEVBQS9DLEVBQW1EO0FBQUEsWUFDM0MwQyxLQUQyQzs7QUFBQSxjQUExQzFDLEtBQTBDO0FBV2xEOztBQUNENEIsTUFBQUEsR0FBRyxHQUFHQSxHQUFHLEdBQUcsQ0FBWjtBQUNIOztBQUNELFFBQUlZLFNBQUosRUFBYztBQUNWQSxNQUFBQSxTQUFTLEdBQUc1UCxFQUFFLENBQUMySCxRQUFILENBQVlpSSxTQUFaLEVBQXVCNVAsRUFBRSxDQUFDNkgsUUFBSCxDQUFZaUgsU0FBWixDQUF2QixDQUFaO0FBQ0EsV0FBS2hNLFVBQUwsQ0FBZ0I0RSxTQUFoQixDQUEwQmtJLFNBQTFCO0FBQ0g7QUFDSjtBQWxvQnNCLENBQVQsQ0FBbEIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBAYXV0aG9yOiBzaGlyYWhvQHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAgIOaImOaWl+WcuuaZr1xuLy8gPGJyLz5DcmVhdGU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIEJhdHRsZUNvbnN0ID0gcmVxdWlyZShcImJhdHRsZV9jb25zdFwiKTtcbnZhciBMb2FkZXJNYW5hZ2VyID0gcmVxdWlyZShcImxvYWRlcm1hbmFnZXJcIik7XG52YXIgUGF0aFRvb2wgPSByZXF1aXJlKFwicGF0aHRvb2xcIik7XG52YXIgQWR2ZW50dXJlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJhZHZlbnR1cmVfY29udHJvbGxlclwiKTtcblxudmFyIEJhdHRsZVNjZW5lID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VDbGFzcyxcbiAgICAvLyBleHRlbmRzOiBjYy5Db21wb25lbnQsXG4gICAgY3RvcjogZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5pbml0Q29uZmlnKCk7XG4gICAgICAgIHRoaXMuY3JlYXRlUm9vdFduZCgpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyRXZlbnQoKTtcbiAgICB9LFxuICAgIC8vIOWIneWni+WMlumFjee9ruaVsOaNrlxuICAgIGluaXRDb25maWc6ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5iYXR0bGVfY29udHJvbGxlciA9IHJlcXVpcmUoXCJiYXR0bGVfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpO1xuICAgICAgICB0aGlzLmJhdHRsZV9tb2RlbCA9IHRoaXMuYmF0dGxlX2NvbnRyb2xsZXIuZ2V0TW9kZWwoKTtcbiAgICAgICAgdGhpcy5iYXR0bGVfaG9va19tb2RlbCA9IHRoaXMuYmF0dGxlX2NvbnRyb2xsZXIuZ2V0SG9va01vZGVsKClcblxuICAgICAgICB0aGlzLmJhdHRsZV9kcmFtYV9tb2RlbCA9IHJlcXVpcmUoXCJiYXR0bGVfZHJhbWFfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCk7XG5cbiAgICAgICAgdGhpcy5tYWluX3NpemUgPSBjYy5zaXplKFNDUkVFTl9XSURUSCwgU0NSRUVOX0hFSUdIVClcbiAgICAgICAgLy8gdGhpcy5tYWluX3NpemUgPSBjYy5kaXJlY3Rvci5nZXRWaXNpYmxlU2l6ZSgpO1xuICAgICAgICB0aGlzLmZsYXllcl9pbml0X3kgPSA3MTZcdFx0XHRcdC8v5Zyw5Zu+5YmN5pmv5bGCXG4gICAgICAgIHRoaXMubWFwX2luaXRfeSA9IDI2MFx0XHRcdFx0Ly/op5LoibLlkoznibnmlYjliJ3lp4tZXG4gICAgICAgIHRoaXMuc2xheWVyX2luaXRfeSA9IDBcdFx0XHQvL+WcsOWbvuiDjOaZr+WxglxuICAgICAgICAvLyB0aGlzLnRvcF9zaXplX2hlaWdodCA9IDQwMFx0XHRcdC8v6aKE55WZ57uZ5Ymn5oOF5LiK6Z2i55qE5Y+v5Lul5ruR5Yqo6auY5bqmXG5cbiAgICAgICAgdGhpcy5iYXR0bGVfcmVzX2lkID0gMCAgICAgICAgICAgICAgLy/lvZPliY3miJjmlpfog4zmma/otYTmupBcblxuICAgICAgICB0aGlzLm5lZWRfcnVuX21hcCA9IHRydWUgICAgICAgICAgICAvL+aYr+WQpumcgOimgeenu+WKqOWcsOWbvlxuICAgICAgICB0aGlzLmZfc3BlZWQgPSAwLjQgICAgICAgICAgICAgICAgICAgIC8v5Zyw5Zu+56e75Yqo6YCf546HXG4gICAgICAgIHRoaXMuYmdfc3BlZWQgPSAyICAgICAgICAgICAgICAgICAvLyDog4zmma/lsYLnp7vliqjpgJ/njodcblxuICAgICAgICB0aGlzLmNvbWJhdF90eXBlID0gQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5OaWwgICAvLyDlvZPliY3miJjmlpfnsbvlnotcblxuICAgICAgICB0aGlzLnJlYWxfcm9sZV9saXN0ID0ge30gICAgICAgICAgICAvLyDlvZPliY3nnJ/lrp7miJjmlpfnmoTljZXkvY3liJfooahcblxuICAgICAgICB0aGlzLnJlc291cmNlc19saXN0ID0ge30gICAgICAgICAgICAvLyDkuIvovb3otYTmupBcbiAgICB9LFxuXG4gICAgc2V0VmlzaWJsZTpmdW5jdGlvbihzdGF0dXMpe1xuICAgICAgICBpZiAodGhpcy5yb290KXtcbiAgICAgICAgICAgIHRoaXMucm9vdC5hY3RpdmUgPSBzdGF0dXNcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDmlLnlj5jnirbmgIFcbiAgICBjaGFuZ2VWaXNpYmxlOmZ1bmN0aW9uKHN0YXR1cyl7XG4gICAgICAgIGlmKHRoaXMucm9vdCl7XG4gICAgICAgICAgICBpZighc3RhdHVzKXtcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3QueCA9IDEwMDAwO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgdGhpcy5yb290LnggPSAwXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5Yib5bu65Zyw5Zu+6IqC54K5XG4gICAgY3JlYXRlUm9vdFduZDpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLnJvb3QgPSBuZXcgY2MuTm9kZShcImJhc2Vfcm9vdFwiKTtcbiAgICAgICAgdGhpcy5yb290LnNldEFuY2hvclBvaW50KDAuNSwgMC41KTtcbiAgICAgICAgdGhpcy5yb290LnNldENvbnRlbnRTaXplKHRoaXMubWFpbl9zaXplKTtcbiAgICAgICAgdGhpcy5yb290LnNldFBvc2l0aW9uKDAsIDApO1xuICAgICAgICAvLyB0aGlzLnJvb3QuYWRkQ29tcG9uZW50KGNjLk1hc2spOyAgICAvLyDorr7nva7liarovpHljLrln59cbiAgICAgICAgVmlld01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRUb1NjZW5lTm9kZSh0aGlzLnJvb3QsIFNDRU5FX1RBRy5iYXR0bGUpXG5cbiAgICAgICAgdmFyIGxheWVyX3NpemUgPSBjYy5zaXplKFNDUkVFTl9XSURUSCAqIEZJVF9TQ0FMRSwgU0NSRUVOX0hFSUdIVClcblxuICAgICAgICAvLyDlnLrmma/kuLvoioLngrkgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgIHRoaXMubWFpbl9sYXllciA9IG5ldyBjYy5Ob2RlKCk7XG5cdFx0dGhpcy5tYWluX2xheWVyLnNldENvbnRlbnRTaXplKGxheWVyX3NpemUpO1xuXHRcdHRoaXMubWFpbl9sYXllci5zZXRBbmNob3JQb2ludCgwLjUsIDAuNSlcblx0XHR0aGlzLm1haW5fbGF5ZXIuc2V0UG9zaXRpb24oMCwgMClcblx0XHR0aGlzLnJvb3QuYWRkQ2hpbGQodGhpcy5tYWluX2xheWVyKVxuXG4gICAgICAgIC8vIOi/nOaZr+WxgixcbiAgICAgICAgdGhpcy5tYXBfZkxheWVyID0gbmV3IGNjLk5vZGUoKVxuICAgICAgICB0aGlzLm1hcF9mTGF5ZXIueSA9ICgtbGF5ZXJfc2l6ZS5oZWlnaHQgKiAwLjUgKyB0aGlzLmZsYXllcl9pbml0X3kpO1xuICAgICAgICB0aGlzLm1hcF9mTGF5ZXIueCA9IC1sYXllcl9zaXplLndpZHRoICogMC41O1xuICAgICAgICB0aGlzLm1hcF9mTGF5ZXIuc2V0QW5jaG9yUG9pbnQoMCwgMClcbiAgICAgICAgdGhpcy5tYXBfZkxheWVyLnNjYWxlID0gRklUX1NDQUxFO1xuICAgICAgICB0aGlzLm1haW5fbGF5ZXIuYWRkQ2hpbGQodGhpcy5tYXBfZkxheWVyLCBCQVRUTEVfVklFV19CTEFDS19MQVlFUl9aMClcblxuICAgICAgICAvLyDliY3mma/lsYJcbiAgICAgICAgdGhpcy5tYXBfc0xheWVyID0gbmV3IGNjLk5vZGUoKTtcdFx0XHRcdCAgICBcbiAgICAgICAgdGhpcy5tYXBfc0xheWVyLnNldE5hbWUoXCJtYXBfc0xheWVyXCIpXG4gICAgICAgIHRoaXMubWFwX3NMYXllci5zZXRBbmNob3JQb2ludCgwLCAwKVxuICAgICAgICB0aGlzLm1hcF9zTGF5ZXIuc2V0UG9zaXRpb24oLWxheWVyX3NpemUud2lkdGgqMC41LCAtbGF5ZXJfc2l6ZS5oZWlnaHQqMC41ICogRklUX1NDQUxFKVxuICAgICAgICB0aGlzLm1hcF9zTGF5ZXIuc2NhbGUgPSBGSVRfU0NBTEU7ICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgdGhpcy5tYWluX2xheWVyLmFkZENoaWxkKHRoaXMubWFwX3NMYXllciwgQkFUVExFX1ZJRVdfQkxBQ0tfTEFZRVJfWjAgKyAxKVxuXG4gICAgICAgIC8vIOWNleW8oOWcuuaZr1xuICAgICAgICB0aGlzLm1hcF9vTGF5ZXIgPSBuZXcgY2MuTm9kZSgpOyBcbiAgICAgICAgLy8gdmFyIGxheWVyX3dkZyA9IG1hcF9vTGF5ZXIuYWRkQ29tcG9uZW50KGNjLldpZGdldCk7XG4gICAgICAgIC8vIGxheWVyX3dkZy5pc0FsaWduSG9yaXpvbnRhbENlbnRlciA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5tYXBfb0xheWVyLnNldE5hbWUoXCJtYXBfb0xheWVyXCIpXG4gICAgICAgIHRoaXMubWFwX29MYXllci5zZXRBbmNob3JQb2ludCgwLCAwKVxuICAgICAgICB0aGlzLm1hcF9vTGF5ZXIuc2V0UG9zaXRpb24oLWxheWVyX3NpemUud2lkdGgqMC41LCAtbGF5ZXJfc2l6ZS5oZWlnaHQqMC41ICogRklUX1NDQUxFKVxuICAgICAgICB0aGlzLm1hcF9vTGF5ZXIuc2NhbGUgPSBGSVRfU0NBTEUgKiAxLjQzOyAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgIHRoaXMubWFpbl9sYXllci5hZGRDaGlsZCh0aGlzLm1hcF9vTGF5ZXIsIEJBVFRMRV9WSUVXX0JMQUNLX0xBWUVSX1owICsgMSlcblxuICAgICAgICAvLyDmiJjmlpdcbiAgICAgICAgdGhpcy5iYXR0bGVfbGF5ZXIgPSBuZXcgY2MuTm9kZSgpOyAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgIHRoaXMuYmF0dGxlX2xheWVyLnNldE5hbWUoXCJiYXR0bGVfbGF5ZXJcIilcbiAgICAgICAgdGhpcy5iYXR0bGVfbGF5ZXIuc2V0QW5jaG9yUG9pbnQoMCwgMClcbiAgICAgICAgdGhpcy5iYXR0bGVfbGF5ZXIuc2V0UG9zaXRpb24oLVNDUkVFTl9XSURUSCowLjUsIC1TQ1JFRU5fSEVJR0hUKjAuNSlcbiAgICAgICAgdGhpcy5tYWluX2xheWVyLmFkZENoaWxkKHRoaXMuYmF0dGxlX2xheWVyLCBCQVRUTEVfVklFV19CTEFDS19MQVlFUl9aMCArIDEpXG4gICAgICAgIFxuICAgICAgICAvLyDnibnmlYjlsYJcbiAgICAgICAgdGhpcy5lZmZlY3RfbGF5ZXJfMSA9IG5ldyBjYy5Ob2RlKClcbiAgICAgICAgdGhpcy5lZmZlY3RfbGF5ZXJfMS55ID0gdGhpcy5tYXBfaW5pdF95XG4gICAgICAgIHRoaXMuZWZmZWN0X2xheWVyXzEuc2V0QW5jaG9yUG9pbnQoMCwgMClcblx0XHR0aGlzLmJhdHRsZV9sYXllci5hZGRDaGlsZCh0aGlzLmVmZmVjdF9sYXllcl8xLCBCQVRUTEVfVklFV19ST0xFX0xBWUVSX1ogKyAxKVxuXHRcdFxuICAgICAgICAvLyDnibnmlYjlsYIyXG5cdFx0dGhpcy5lZmZlY3RfbGF5ZXJfMiA9IG5ldyBjYy5Ob2RlKClcbiAgICAgICAgdGhpcy5lZmZlY3RfbGF5ZXJfMi55ID0gdGhpcy5tYXBfaW5pdF95XG4gICAgICAgIHRoaXMuZWZmZWN0X2xheWVyXzIuc2V0QW5jaG9yUG9pbnQoMCwgMClcbiAgICAgICAgdGhpcy5iYXR0bGVfbGF5ZXIuYWRkQ2hpbGQodGhpcy5lZmZlY3RfbGF5ZXJfMiwgQkFUVExFX1ZJRVdfUk9MRV9MQVlFUl9aIC0gMSlcblxuICAgICAgICAvLyDop5LoibLlsYIsIOinkuiJsuWxguaYr+WKoOi9vSDnibnmlYgyIOWSjOeJueaViDHlv5flgaVcbiAgICAgICAgdGhpcy5yb2xlX2xheWVyID0gbmV3IGNjLk5vZGUoKVxuICAgICAgICB0aGlzLnJvbGVfbGF5ZXIueSA9IHRoaXMubWFwX2luaXRfeVxuICAgICAgICB0aGlzLnJvbGVfbGF5ZXIuc2V0QW5jaG9yUG9pbnQoMCwgMClcblx0XHR0aGlzLmJhdHRsZV9sYXllci5hZGRDaGlsZCh0aGlzLnJvbGVfbGF5ZXIsIEJBVFRMRV9WSUVXX1JPTEVfTEFZRVJfWilcbiAgICB9LFxuXG4gICAgLy8g55uR5ZCs5LiA5Lqb5LqL5Lu2XG4gICAgcmVnaXN0ZXJFdmVudDpmdW5jdGlvbigpe1xuXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIOabtOaWsOaIluiAheWIm+W7uuaImOaWl+WcuuaZr1xuICAgICAqIEBwYXJhbSB7Kn0gaXNfcmVhbCBcbiAgICAgKi9cbiAgICB1cGRhdGVCYXR0bGVTY2VuZTogZnVuY3Rpb24gKGlzX3JlYWwpIHtcbiAgICAgICAgdGhpcy5pc19yZWFsX2ZpZ2h0ID0gaXNfcmVhbFxuICAgICAgICAvLyDmm7TmlrDmiJjmlpflnLDlm75cbiAgICAgICAgdGhpcy5jaGFuZ2VCYXR0bGVTY2VuZShpc19yZWFsKTtcbiAgICAgICAgLy8g5Yid5aeL5YyW5oiY5paX5Y2V5L2NXG4gICAgICAgIGlmIChpc19yZWFsID09IHRydWUpIHtcbiAgICAgICAgICAgIC8vIOWIm+W7uuecn+aImOaWl+eahOinkuiJslxuICAgICAgICAgICAgdmFyIG5lZWRfZW50ZXIgPSB0aGlzLmJhdHRsZV9tb2RlbC5uZWVkUGxheUVudGVyQWN0aW9uKCk7XG4gICAgICAgICAgICBpZiAobmVlZF9lbnRlciA9PSB0cnVlKXsgICAgLy8g5aaC5p6c5piv5Yid5aeL5YyW5oiY5paX55qE6K+dLOmcgOimgeaSreaUvui/m+WcuuWKqOeUu1xuICAgICAgICAgICAgICAgIHRoaXMuZmxvb3JUaXBzKCk7XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICB0aGlzLmJhdHRsZV9tb2RlbC5jcmVhdGVSb2xlTGlzdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy51cGRhdGVfZHJhbWFfYmF0dGxlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmluaXRfZHJhbWFfZmluaXNoID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmJhdHRsZV9yZXNfaWQgPSBudWxsO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZV9kcmFtYV9iYXR0bGUgPSB0cnVlO1xuICAgICAgICAgICAgLy8g5Yib5bu65YGH5oiY5paX55qE6KeS6ImyXG4gICAgICAgICAgICBpZiAodGhpcy5pbml0X2RyYW1hX2ZpbmlzaClcbiAgICAgICAgICAgICAgICB0aGlzLmJhdHRsZV9ob29rX21vZGVsLnByZXBhcmVTdGFyQmF0dGxlKHRoaXMuaW5pdERyYW1hRmluaXNoLmJpbmQodGhpcykpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5Yik5pat5piv5ZCm6ZyA6KaB5pKt5pS+6L+b5Ye65Zy655qEYm9zc+adpeiireaIluiAheaYr3Br55qEVlPliqjnlLtcbiAgICBmbG9vclRpcHM6ZnVuY3Rpb24oKXtcbiAgICAgICAgdmFyIGJhdHRsZV9kYXRhID0gdGhpcy5iYXR0bGVfbW9kZWwuZ2V0Q3VyQmF0dGxlRGF0YSgpO1xuICAgICAgICBpZiAoYmF0dGxlX2RhdGEgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICB2YXIgY29tYmF0X2NvbmZpZyA9IENvbmZpZy5jb21iYXRfdHlwZV9kYXRhLmRhdGFfZmlnaHRfbGlzdFtiYXR0bGVfZGF0YS5jb21iYXRfdHlwZV07XG4gICAgICAgIGlmIChjb21iYXRfY29uZmlnKXtcbiAgICAgICAgICAgIGlmIChCYXR0bGVDb25zdC5pc05lZWRTcGVjU3RhcnQoYmF0dGxlX2RhdGEuY29tYmF0X3R5cGUpKSB7ICAvLyDmmL7npLpQS+WKqOeUu1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1NwZWNTdGFydCgpO1xuICAgICAgICAgICAgfWVsc2V7ICAvLyDmmL7npLpCT1NT5p2l6KKt5Yqo55S7XG4gICAgICAgICAgICAgICAgdmFyIHN0YXJ0X2VmZmVjdCA9IGNvbWJhdF9jb25maWcuc3RhcnRfZWZmZWN0O1xuICAgICAgICAgICAgICAgIGlmIChiYXR0bGVfZGF0YS5jb21iYXRfdHlwZSA9PSBCYXR0bGVDb25zdC5GaWdodF9UeXBlLkRhcm1hKXtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRyYW1hX2RhdGEgPSB0aGlzLmJhdHRsZV9kcmFtYV9tb2RlbC5nZXREcmFtYURhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRyYW1hX2RhdGEgJiYgZHJhbWFfZGF0YS5kdW5faWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGR1bl9jb25maWcgPSBDb25maWcuZHVuZ2Vvbl9kYXRhLmRhdGFfZHJhbWFfZHVuZ2Vvbl9pbmZvW2RyYW1hX2RhdGEuZHVuX2lkXVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR1bl9jb25maWcgJiYgZHVuX2NvbmZpZy5pc19iaWcgIT0gMSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfZWZmZWN0ID0gXCJFNTExNDdcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBVdGlscy5wbGF5RWZmZWN0T25jZShzdGFydF9lZmZlY3QsIHRoaXMubWFpbl9zaXplLndpZHRoICogMC41LCA3NzAgLSB0aGlzLm1hcF9pbml0X3ksIHRoaXMuZWZmZWN0X2xheWVyXzEsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXR0bGVfbW9kZWwuY3JlYXRlUm9sZUxpc3QoKTtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcyksIFBsYXllckFjdGlvbi5hY3Rpb24sIDEpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICB0aGlzLmJhdHRsZV9tb2RlbC5jcmVhdGVSb2xlTGlzdCgpOyBcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBwa+aImOaWl+eahOi/m+WcuuWKqOeUu1xuICAgIHNob3dTcGVjU3RhcnQ6ZnVuY3Rpb24oKXtcbiAgICAgICAgaWYgKHRoaXMuc3BlY2FpbF9lbnRlcikgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5pc19wbGF5X2VudGVyID09IHRydWUpIHJldHVybjtcbiAgICAgICAgdGhpcy5pc19wbGF5X2VudGVyID0gdHJ1ZTtcbiAgICAgICAgdmFyIHByZWZhYl9wYXRoID0gUGF0aFRvb2wuZ2V0UHJlZmFiUGF0aChcImJhdHRsZVwiLCBcImJhdHRsZV9wa19lbnRlcl9ub2RlXCIpO1xuICAgICAgICB0aGlzLmxvYWRSZXMocHJlZmFiX3BhdGgsIGZ1bmN0aW9uIChyZXNfb2JqZWN0KXtcbiAgICAgICAgICAgIGlmIChyZXNfb2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGF5U3BlY2lhbEVudGVyQWN0aW9uKHJlc19vYmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgfSxcblxuICAgIC8vIOaSreaUvnBr6L+b5Zy65Yqo55S7XG4gICAgcGxheVNwZWNpYWxFbnRlckFjdGlvbjpmdW5jdGlvbihyZXNfb2JqZWN0KXtcbiAgICAgICAgdGhpcy5zcGVjYWlsX2VudGVyID0gcmVzX29iamVjdDtcbiAgICAgICAgLy8gdGhpcy5zcGVjYWlsX2VudGVyLnggPSB0aGlzLm1haW5fc2l6ZS53aWR0aCAqIDAuNTtcbiAgICAgICAgLy8gdGhpcy5zcGVjYWlsX2VudGVyLnkgPSB0aGlzLm1haW5fc2l6ZS5oZWlnaHQgKiAwLjUgLSB0aGlzLm1hcF9pbml0X3k7XG4gICAgICAgIC8vIHRoaXMuZWZmZWN0X2xheWVyXzEuYWRkQ2hpbGQodGhpcy5zcGVjYWlsX2VudGVyKTtcbiAgICAgICAgdGhpcy5zcGVjYWlsX2VudGVyLnggPSBTQ1JFRU5fV0lEVEgqMC41O1xuICAgICAgICB0aGlzLnNwZWNhaWxfZW50ZXIueSA9IFNDUkVFTl9IRUlHSFQqMC41O1xuICAgICAgICBWaWV3TWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFRvU2NlbmVOb2RlKHRoaXMuc3BlY2FpbF9lbnRlciwgU0NFTkVfVEFHLndpbik7XG4gICAgICAgIHZhciBjZW50ZXJfc3BpbmUgPSB0aGlzLnNwZWNhaWxfZW50ZXIuZ2V0Q2hpbGRCeU5hbWUoXCJjZW50ZXJfc3BpbmVcIikuZ2V0Q29tcG9uZW50KHNwLlNrZWxldG9uKTtcblxuICAgICAgICB2YXIgYmFja2dyb3VuZCA9IHRoaXMuc3BlY2FpbF9lbnRlci5nZXRDaGlsZEJ5TmFtZShcImJhY2tncm91bmRcIilcbiAgICAgICAgYmFja2dyb3VuZC5zY2FsZSA9IEZJVF9TQ0FMRTtcblxuICAgICAgICB2YXIgbGVmdF9iZyA9IHRoaXMuc3BlY2FpbF9lbnRlci5nZXRDaGlsZEJ5TmFtZShcImxlZnRfYmdcIik7XG4gICAgICAgIHZhciBsZWZ0X3NwaW5lID0gbGVmdF9iZy5nZXRDaGlsZEJ5TmFtZShcInNwaW5lXCIpLmdldENvbXBvbmVudChzcC5Ta2VsZXRvbik7XG4gICAgICAgIHZhciBsZWZ0X2Zvcm0gPSBsZWZ0X2JnLmdldENoaWxkQnlOYW1lKFwiZm9ybV9jb250YWluZXJcIik7XG4gICAgICAgIHZhciBsZWZ0X2ljb24gPSBsZWZ0X2Zvcm0uZ2V0Q2hpbGRCeU5hbWUoXCJpY29uXCIpLmdldENvbXBvbmVudChjYy5TcHJpdGUpO1xuICAgICAgICB2YXIgbGVmdF9uYW1lID0gbGVmdF9iZy5nZXRDaGlsZEJ5TmFtZShcInJvbGVfbmFtZVwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xuXG4gICAgICAgIHZhciByaWdodF9iZyA9IHRoaXMuc3BlY2FpbF9lbnRlci5nZXRDaGlsZEJ5TmFtZShcInJpZ2h0X2JnXCIpO1xuICAgICAgICB2YXIgcmlnaHRfc3BpbmUgPSByaWdodF9iZy5nZXRDaGlsZEJ5TmFtZShcInNwaW5lXCIpLmdldENvbXBvbmVudChzcC5Ta2VsZXRvbik7XG4gICAgICAgIHZhciByaWdodF9mb3JtID0gcmlnaHRfYmcuZ2V0Q2hpbGRCeU5hbWUoXCJmb3JtX2NvbnRhaW5lclwiKTtcbiAgICAgICAgdmFyIHJpZ2h0X2ljb24gPSByaWdodF9mb3JtLmdldENoaWxkQnlOYW1lKFwiaWNvblwiKS5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgdmFyIHJpZ2h0X25hbWUgPSByaWdodF9iZy5nZXRDaGlsZEJ5TmFtZShcInJvbGVfbmFtZVwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xuXG4gICAgICAgIGxlZnRfYmcucnVuQWN0aW9uKGNjLnNlcXVlbmNlKGNjLm1vdmVUbygwLjQsIC0xMDAsIDEwMCksIGNjLmNhbGxGdW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0xlZnRFZmZlY3QoY2VudGVyX3NwaW5lLCBsZWZ0X3NwaW5lLCByaWdodF9zcGluZSk7XG4gICAgICAgIH0uYmluZCh0aGlzKSksIGNjLmRlbGF5VGltZSgyKSwgY2MuY2FsbEZ1bmMoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8g6L+Z6YeM6L+Y6ZyA6KaB6YeK5pS+5o6J6L+Z5Liq6aKE5Yi2XG4gICAgICAgICAgICBpZiAodGhpcy5zcGVjYWlsX2VudGVyKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5zcGVjYWlsX2VudGVyLmRlc3Ryb3lBbGxDaGlsZHJlbigpXG4gICAgICAgICAgICAgICAgdGhpcy5zcGVjYWlsX2VudGVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNwZWNhaWxfZW50ZXIgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5iYXR0bGVfbW9kZWwuY3JlYXRlUm9sZUxpc3QoKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKSkpXG5cbiAgICAgICAgcmlnaHRfYmcucnVuQWN0aW9uKGNjLnNlcXVlbmNlKGNjLm1vdmVUbygwLjQsIDEwMCwgLTEwMCksIGNjLmNhbGxGdW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgfS5iaW5kKHRoaXMpKSkpXG5cbiAgICAgICAgdmFyIGJhdHRsZV9kYXRhID0gdGhpcy5iYXR0bGVfbW9kZWwuZ2V0Q3VyQmF0dGxlRGF0YSgpO1xuICAgICAgICBpZiAoYmF0dGxlX2RhdGEpe1xuICAgICAgICAgICAgLy8g6K6+572u5ZCN5a2XXG4gICAgICAgICAgICB2YXIgbGVmdF9pc19mcmllbmQgPSB0aGlzLmJhdHRsZV9tb2RlbC5pc0ZyaWVuZChCYXR0bGVDb25zdC5Hcm91cF9UeXBlLkZyaWVuZClcbiAgICAgICAgICAgIHZhciBsZWZ0X2Zvcm0gPSBudWxsO1xuICAgICAgICAgICAgdmFyIHJpZ2h0X2Zvcm0gPSBudWxsO1xuICAgICAgICAgICAgaWYgKGxlZnRfaXNfZnJpZW5kID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBsZWZ0X25hbWUuc3RyaW5nID0gYmF0dGxlX2RhdGEuYWN0b3Jfcm9sZV9uYW1lO1xuICAgICAgICAgICAgICAgIHJpZ2h0X25hbWUuc3RyaW5nID0gYmF0dGxlX2RhdGEudGFyZ2V0X3JvbGVfbmFtZTtcbiAgICAgICAgICAgICAgICBsZWZ0X2Zvcm0gPSBiYXR0bGVfZGF0YS5mb3JtYXRpb25bMV07XG4gICAgICAgICAgICAgICAgcmlnaHRfZm9ybSA9IGJhdHRsZV9kYXRhLmZvcm1hdGlvblsyXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGVmdF9uYW1lLnN0cmluZyA9IGJhdHRsZV9kYXRhLnRhcmdldF9yb2xlX25hbWU7XG4gICAgICAgICAgICAgICAgcmlnaHRfbmFtZS5zdHJpbmcgPSBiYXR0bGVfZGF0YS5hY3Rvcl9yb2xlX25hbWU7XG4gICAgICAgICAgICAgICAgbGVmdF9mb3JtID0gYmF0dGxlX2RhdGEuZm9ybWF0aW9uWzJdO1xuICAgICAgICAgICAgICAgIHJpZ2h0X2Zvcm0gPSBiYXR0bGVfZGF0YS5mb3JtYXRpb25bMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDorr7nva7pmLXms5VcbiAgICAgICAgICAgIGlmIChsZWZ0X2Zvcm0pIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzX3BhdGggPSBQYXRoVG9vbC5nZXRCYXR0bGVGb3JtSWNvbihsZWZ0X2Zvcm0uZm9ybWF0aW9uX3R5cGUpXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkUmVzKHJlc19wYXRoLCBmdW5jdGlvbiAocmVzX29iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBsZWZ0X2ljb24uc3ByaXRlRnJhbWUgPSByZXNfb2JqZWN0O1xuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyaWdodF9mb3JtKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc19wYXRoID0gUGF0aFRvb2wuZ2V0QmF0dGxlRm9ybUljb24ocmlnaHRfZm9ybS5mb3JtYXRpb25fdHlwZSlcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRSZXMocmVzX3BhdGgsIGZ1bmN0aW9uIChyZXNfb2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0X2ljb24uc3ByaXRlRnJhbWUgPSByZXNfb2JqZWN0O1xuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBwa+eJueaViOWKoOi9vVxuICAgIHNob3dMZWZ0RWZmZWN0OmZ1bmN0aW9uKGNlbnRlcl9zcGluZSwgbGVmdF9zcGluZSwgcmlnaHRfc3BpbmUpe1xuICAgICAgICBpZiAoY2VudGVyX3NwaW5lID09IG51bGwgfHwgbGVmdF9zcGluZSA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIHZhciBza2VsZXRvbl9wYXRoID0gUGF0aFRvb2wuZ2V0U3BpbmVQYXRoKFwiRTUxMTQxXCIpO1xuICAgICAgICB0aGlzLmxvYWRSZXMoc2tlbGV0b25fcGF0aCwgZnVuY3Rpb24ocmVzX29iamVjdCl7XG4gICAgICAgICAgICBjZW50ZXJfc3BpbmUuc2tlbGV0b25EYXRhID0gcmVzX29iamVjdDtcbiAgICAgICAgICAgIGxlZnRfc3BpbmUuc2tlbGV0b25EYXRhID0gcmVzX29iamVjdDtcbiAgICAgICAgICAgIHJpZ2h0X3NwaW5lLnNrZWxldG9uRGF0YSA9IHJlc19vYmplY3Q7XG5cbiAgICAgICAgICAgIGNlbnRlcl9zcGluZS5zZXRBbmltYXRpb24oMCwgUGxheWVyQWN0aW9uLmFjdGlvbl8yLCB0cnVlKTtcbiAgICAgICAgICAgIGxlZnRfc3BpbmUuc2V0QW5pbWF0aW9uKDAsIFBsYXllckFjdGlvbi5hY3Rpb25fMSwgZmFsc2UpO1xuICAgICAgICAgICAgcmlnaHRfc3BpbmUuc2V0QW5pbWF0aW9uKDAsIFBsYXllckFjdGlvbi5hY3Rpb25fMSwgZmFsc2UpO1xuXG4gICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICB9LFxuXG4gICAgLy8g6I635Y+W5b2T5YmN5oiY5paX55qE6LWE5rqQXG4gICAgY3VyQmF0dGxlUmVzSWQ6ZnVuY3Rpb24oY29tYmF0X3R5cGUpe1xuICAgICAgICB2YXIgYmF0dGxlX3Jlc19pZCA9IDEwMDAxXG4gICAgICAgIGlmIChjb21iYXRfdHlwZSA9PSBCYXR0bGVDb25zdC5GaWdodF9UeXBlLkRhcm1hKSB7XG4gICAgICAgICAgICB2YXIgZHJhbWFfZGF0YSA9IHRoaXMuYmF0dGxlX2RyYW1hX21vZGVsLmdldERyYW1hRGF0YSgpO1xuICAgICAgICAgICAgaWYgKGRyYW1hX2RhdGEgJiYgZHJhbWFfZGF0YS5tb2RlICYmIGRyYW1hX2RhdGEuY2hhcHRlcl9pZCl7XG4gICAgICAgICAgICAgICAgdmFyIGRyYW1hX2NvbmZpZyA9IENvbmZpZy5kdW5nZW9uX2RhdGEuZGF0YV9kcmFtYV93b3JsZF9pbmZvW2RyYW1hX2RhdGEubW9kZV1bZHJhbWFfZGF0YS5jaGFwdGVyX2lkXTtcbiAgICAgICAgICAgICAgICBiYXR0bGVfcmVzX2lkID0gZHJhbWFfY29uZmlnLm1hcF9pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgdmFyIGJhc2VfY29uZmlnID0gQ29uZmlnLmJhdHRsZV9iZ19kYXRhLmRhdGFfaW5mb1tjb21iYXRfdHlwZV07XG4gICAgICAgICAgICBpZiAoYmFzZV9jb25maWcgPT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgYmFzZV9jb25maWcgPSBDb25maWcuYmF0dGxlX2JnX2RhdGEuZGF0YV9pbmZvW0JhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuRGVmYXVsdF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmKGJhc2VfY29uZmlnID09IG51bGwpe1xuICAgICAgICAgICAgICAgIGJhdHRsZV9yZXNfaWQgPSAxMDAwMTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIGJhdHRsZV9yZXNfaWQgPSBiYXNlX2NvbmZpZy5iaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDlhpLpmanmiJjmlpflkI7pnaLliqBcbiAgICAgICAgICAgIGlmIChjb21iYXRfdHlwZSA9PSBCYXR0bGVDb25zdC5GaWdodF9UeXBlLkFkdmVudHJ1ZSl7XG4gICAgICAgICAgICAgICAgdmFyIGJhc2VfZGF0YSA9IEFkdmVudHVyZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldEFkdmVudHVyZUJhc2VEYXRhKCk7XG4gICAgICAgICAgICAgICAgaWYoYmFzZV9kYXRhKXtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmZpZyA9IENvbmZpZy5hZHZlbnR1cmVfZGF0YS5kYXRhX2JhdHRsZV9yZXNbYmFzZV9kYXRhLmlkXTtcbiAgICAgICAgICAgICAgICAgICAgaWYoY29uZmlnICYmIGNvbmZpZy5iYXR0bGVfcmVzX2lkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhdHRsZV9yZXNfaWQgPSBjb25maWcuYmF0dGxlX3Jlc19pZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmF0dGxlX3Jlc19pZDtcbiAgICB9LFxuXG4gICAgLy8g5pu05paw5oiY5paX6IOM5pmvXG4gICAgY2hhbmdlQmF0dGxlU2NlbmU6ZnVuY3Rpb24oaXNfcmVhbCl7XG4gICAgICAgIHZhciBiYXR0bGVfZGF0YSA9IHRoaXMuYmF0dGxlX21vZGVsLmdldEN1ckJhdHRsZURhdGEoKTtcbiAgICAgICAgdmFyIHVucmVhbF9iYXR0bGVfZGF0YSA9IHRoaXMuYmF0dGxlX2hvb2tfbW9kZWwuZ2V0VW5yZWFsQmF0dGxlRGF0YSgpO1xuICAgICAgICBpZiAoYmF0dGxlX2RhdGEgPT0gbnVsbCAmJiB1bnJlYWxfYmF0dGxlX2RhdGEgPT0gbnVsbCkgeyByZXR1cm47IH1cblxuICAgICAgICB2YXIgY29tYmF0X3R5cGUgPSBCYXR0bGVDb25zdC5GaWdodF9UeXBlLk5pbDtcblxuICAgICAgICBpZiAoaXNfcmVhbCA9PSB0cnVlKSB7XG4gICAgICAgICAgICBjb21iYXRfdHlwZSA9IGJhdHRsZV9kYXRhLmNvbWJhdF90eXBlOyAvLyDlpoLmnpzmmK/nnJ/lrp7miJjmlpcs5bm25LiU5piv5Ymn5oOF5oiY5paX55qE6K+dLOWwseimgeWOu+W9k+WJjeWJp+aDhWlk54S25ZCO6I635Y+W6LWE5rqQXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb21iYXRfdHlwZSA9IEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuRGFybWFcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbWJhdF90eXBlID0gY29tYmF0X3R5cGU7ICAgICAgICAgLy8g5pW05Zy65oiY5paX5ZSv5LiALOS5n+aYr+WIpOaWreeahOS+neaNrlxuICAgICAgICB0aGlzLm5lZWRfcnVuX21hcCA9ICFpc19yZWFsOyAgICAgICAgICAgLy8g6Z2e55yf5a6e5oiY5paX5omN6ZyA6KaB56e75Yqo5Zyw5Zu+XG5cbiAgICAgICAgdmFyIGJhdHRsZV9yZXNfaWQgPSB0aGlzLmN1ckJhdHRsZVJlc0lkKGNvbWJhdF90eXBlKTtcbiAgICAgICAgdGhpcy5sb2FkZXJCYXR0bGVTY2VuZShiYXR0bGVfcmVzX2lkKTsgIC8vIOWIh+aNouaImOaWl+iDjOaZr+i1hOa6kFxuXG4gICAgICAgIC8vIOi/memHjOWBmuS4gOasoemfs+S5kOeahOaSreaUvuWkhOeQhlxuICAgICAgICB2YXIgbXVzaWNfY29uZmlnID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuY29tYmF0X3R5cGUgPT0gQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5EYXJtYSl7XG4gICAgICAgICAgICB2YXIgY29uZmlnID0gQ29uZmlnLmJhdHRsZV9iZ19kYXRhLmRhdGFfaW5mbzJbdGhpcy5jb21iYXRfdHlwZV07XG4gICAgICAgICAgICBpZihjb25maWcgJiYgY29uZmlnW2JhdHRsZV9yZXNfaWRdKXtcbiAgICAgICAgICAgICAgICBtdXNpY19jb25maWcgPSBjb25maWdbYmF0dGxlX3Jlc19pZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgbXVzaWNfY29uZmlnID0gQ29uZmlnLmJhdHRsZV9iZ19kYXRhLmRhdGFfaW5mb1t0aGlzLmNvbWJhdF90eXBlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobXVzaWNfY29uZmlnICYmIG11c2ljX2NvbmZpZy5iZ19tdXNpYyAhPSBcIlwiKXtcbiAgICAgICAgICAgIFV0aWxzLnBsYXlNdXNpYyhBVURJT19UWVBFLkJBVFRMRSwgbXVzaWNfY29uZmlnLmJnX211c2ljLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDliJvlu7rmiJjmlpfog4zmma8s5Lmf55So5LqO5pu05paw5LiL5LiA56ug6IqC55qE5pe25YCZ5YiH5o2i5YGH5oiY5paX6LWE5rqQXG4gICAgbG9hZGVyQmF0dGxlU2NlbmU6IGZ1bmN0aW9uIChiYXR0bGVfcmVzX2lkKSB7XG4gICAgICAgIGlmIChiYXR0bGVfcmVzX2lkID09IDApIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuYmF0dGxlX3Jlc19pZCAhPSBiYXR0bGVfcmVzX2lkKSB7XG4gICAgICAgICAgICB0aGlzLmJhdHRsZV9yZXNfaWQgPSBiYXR0bGVfcmVzX2lkO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29tYmF0X3R5cGUgPT0gQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5EYXJtYSkge1xuICAgICAgICAgICAgICAgIHZhciByZXNfb2JqZWN0ID0gUGF0aFRvb2wuZ2V0QmF0dGxlRHJhbWVCZyhiYXR0bGVfcmVzX2lkKTtcbiAgICAgICAgICAgICAgICBpZiAoYmF0dGxlX3Jlc19pZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZURyYW1hU2NlbmUoYmF0dGxlX3Jlc19pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVNpbmdsZVNjZW5lKGJhdHRsZV9yZXNfaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuXG4gICAgLy8g5Yib5bu65Ymn5oOF5Ymv5pys55qE6IOM5pmv6LWE5rqQXG4gICAgLy8gc19wYXJoOnN0cmluZyDog4zmma/otYTmupAgZl9wYXRoOnN0cmluZyDliY3mma/otYTmupBcbiAgICBjcmVhdGVEcmFtYVNjZW5lOiBmdW5jdGlvbiAoYmF0dGxlX3Jlc19pZCkge1xuICAgICAgICB2YXIgYmdfMV9mID0gZmFsc2U7XG4gICAgICAgIHZhciBiZ18yX2YgPSBmYWxzZTtcbiAgICAgICAgdmFyIGRyYW1hX3BhdGhzID0gUGF0aFRvb2wuZ2V0QmF0dGxlRHJhbWVCZyhiYXR0bGVfcmVzX2lkKTsgICBcblxuXG4gICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2FkUmVzKGRyYW1hX3BhdGhzLnMsIGZ1bmN0aW9uIChyZXNfb2JqZWN0KSB7XG4gICAgICAgICAgICBpZih0aGlzLnJvb3QgJiYgdGhpcy5yb290LmlzVmFsaWQgPT0gZmFsc2UpcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHJlc19vYmplY3QpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kcmFtYV9zX2JnID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFtYV9zX2JnID0gbmV3IGNjLk5vZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFtYV9zX2JnLnNjYWxlID0gMS40MztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFtYV9zX2JnLnNldEFuY2hvclBvaW50KDAsIDApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYW1hX3NfYmcuc2V0UG9zaXRpb24oMCwgdGhpcy5zbGF5ZXJfaW5pdF95KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBfc0xheWVyLmFkZENoaWxkKHRoaXMuZHJhbWFfc19iZywgQkFUVExFX1ZJRVdfQkFDS19MQVlFUl9aKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFtYV9zX2JnX2ZyYW1lID0gdGhpcy5kcmFtYV9zX2JnLmFkZENvbXBvbmVudChjYy5TcHJpdGUpO1xuICAgICAgICAgICAgICAgICAgICAvLyDliJvlu7rnrKzkuozlvKAsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhbWFfc19iZ18yID0gY2MuaW5zdGFudGlhdGUodGhpcy5kcmFtYV9zX2JnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFtYV9zX2JnX2ZyYW1lXzIgPSB0aGlzLmRyYW1hX3NfYmdfMi5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBfc0xheWVyLmFkZENoaWxkKHRoaXMuZHJhbWFfc19iZ18yLCBCQVRUTEVfVklFV19CQUNLX0xBWUVSX1opO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmRyYW1hX3NfYmdfZnJhbWUuc3ByaXRlRnJhbWUgPSByZXNfb2JqZWN0O1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhbWFfc19iZ19mcmFtZV8yLnNwcml0ZUZyYW1lID0gcmVzX29iamVjdDtcbiAgICAgICAgICAgICAgICAvLyDorr7nva7nrKzkuozlvKDlnZDmoIdcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kcmFtYV9zX2JnX3dpZHRoID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFtYV9zX2JnX3dpZHRoID0gdGhpcy5kcmFtYV9zX2JnLmdldENvbnRlbnRTaXplKCkud2lkdGggKiAxLjQzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYW1hX3NfYmdfMi5zZXRQb3NpdGlvbih0aGlzLmRyYW1hX3NfYmcueCArIHRoaXMuZHJhbWFfc19iZ193aWR0aCwgdGhpcy5zbGF5ZXJfaW5pdF95KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJnXzFfZiA9IHRydWU7XG4gICAgICAgICAgICBpZiAoYmdfMl9mKSB7IFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnVwZGF0ZV9kcmFtYV9iYXR0bGUgJiYgIXRoaXMuaW5pdF9kcmFtYV9maW5pc2gpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXR0bGVfaG9va19tb2RlbC5wcmVwYXJlU3RhckJhdHRsZSh0aGlzLmluaXREcmFtYUZpbmlzaC5iaW5kKHRoaXMpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5pbml0X2RyYW1hX2ZpbmlzaCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKSlcblxuICAgICAgICBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZFJlcyhkcmFtYV9wYXRocy5mLCBmdW5jdGlvbiAocmVzX29iamVjdCkge1xuICAgICAgICAgICAgaWYgKHJlc19vYmplY3QpIHtcbiAgICAgICAgICAgICAgICBpZih0aGlzLnJvb3QgJiYgdGhpcy5yb290LmlzVmFsaWQgPT0gZmFsc2UpcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRyYW1hX2ZfYmcgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYW1hX2ZfYmcgPSBuZXcgY2MuTm9kZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYW1hX2ZfYmcuc2V0QW5jaG9yUG9pbnQoMCwgMCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhbWFfZl9iZy5zY2FsZSA9IDEuNDM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFwX2ZMYXllci5hZGRDaGlsZCh0aGlzLmRyYW1hX2ZfYmcsIEJBVFRMRV9WSUVXX0JBQ0tfTEFZRVJfWik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhbWFfZl9iZ19mcmFtZSA9IHRoaXMuZHJhbWFfZl9iZy5hZGRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8g5Yib5bu656ys5LqM5bygLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYW1hX2ZfYmdfMiA9IGNjLmluc3RhbnRpYXRlKHRoaXMuZHJhbWFfZl9iZyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhbWFfZl9iZ19mcmFtZV8yID0gdGhpcy5kcmFtYV9mX2JnXzIuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFwX2ZMYXllci5hZGRDaGlsZCh0aGlzLmRyYW1hX2ZfYmdfMiwgQkFUVExFX1ZJRVdfQkFDS19MQVlFUl9aKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5kcmFtYV9mX2JnX2ZyYW1lLnNwcml0ZUZyYW1lID0gcmVzX29iamVjdFxuICAgICAgICAgICAgICAgIHRoaXMuZHJhbWFfZl9iZ19mcmFtZV8yLnNwcml0ZUZyYW1lID0gcmVzX29iamVjdDtcbiAgICAgICAgICAgICAgICAvLyDorr7nva7nrKzkuozlvKDlnZDmoIdcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kcmFtYV9mX2JnX3dpZHRoID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFtYV9mX2JnX3dpZHRoID0gdGhpcy5kcmFtYV9mX2JnLmdldENvbnRlbnRTaXplKCkud2lkdGggKiAxLjQzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYW1hX2ZfYmdfMi54ID0gdGhpcy5kcmFtYV9mX2JnLnggKyB0aGlzLmRyYW1hX2ZfYmdfd2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYmdfMl9mID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoYmdfMV9mKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnVwZGF0ZV9kcmFtYV9iYXR0bGUgJiYgIXRoaXMuaW5pdF9kcmFtYV9maW5pc2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmF0dGxlX2hvb2tfbW9kZWwucHJlcGFyZVN0YXJCYXR0bGUodGhpcy5pbml0RHJhbWFGaW5pc2guYmluZCh0aGlzKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuaW5pdF9kcmFtYV9maW5pc2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgfSxcblxuICAgIGluaXREcmFtYUZpbmlzaDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuaW5pdF9kcmFtYV9maW5pc2ggPSB0cnVlO1xuICAgIH0sXG5cbiAgICAvLyDliJvlu7rljZXlvKDmiJjmlpfog4zmma/nmoRcbiAgICBjcmVhdGVTaW5nbGVTY2VuZTpmdW5jdGlvbihyZXNfaWQpe1xuICAgICAgICBpZiAodGhpcy5tYXBfc0xheWVyX2ZyYW1lID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMubWFwX3NMYXllcl9mcmFtZSA9IHRoaXMubWFwX29MYXllci5hZGRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzX3BhdGggPSBQYXRoVG9vbC5nZXRCYXR0bGVTaW5nbGVCZyhyZXNfaWQpO1xuICAgICAgICB0aGlzLmxvYWRSZXMocmVzX3BhdGgsIGZ1bmN0aW9uIChyZXNfb2JqZWN0KSB7XG4gICAgICAgICAgICB0aGlzLm1hcF9zTGF5ZXJfZnJhbWUuc3ByaXRlRnJhbWUgPSByZXNfb2JqZWN0O1xuICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgfSxcblxuICAgIC8vIOaJk+W8gOWumuW4p+WkhOeQhlxuICAgIG1hcE1vdmVzY2hlZHVsZVVwZGF0ZTpmdW5jdGlvbigpe1xuICAgICAgICBpZiAodGhpcy5uZWVkX3J1bl9tYXAgJiYgdGhpcy5pbml0X2RyYW1hX2ZpbmlzaCl7XG4gICAgICAgICAgICB0aGlzLm1vdmVNYXAoKVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOiuvue9ruaYr+WQpuenu+WKqOWcsOWbvizlj6rmnInliafmg4XmiJjmlpfmiY3pnIDopoHlgZrov5nkuKrlpITnkIZcbiAgICBjaGFuZ2VNb3ZlTWFwU3RhdHVzOmZ1bmN0aW9uKHN0YXR1cyl7XG4gICAgICAgIGlmICh0aGlzLmNvbWJhdF90eXBlID09IEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuRGFybWEpe1xuICAgICAgICAgICAgdGhpcy5uZWVkX3J1bl9tYXAgPSBzdGF0dXM7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g56e75Yqo5Zyw5Zu+XG4gICAgbW92ZU1hcDpmdW5jdGlvbigpe1xuICAgICAgICBpZiAodGhpcy5kcmFtYV9zX2JnID09IG51bGwgfHwgdGhpcy5kcmFtYV9mX2JnID09IG51bGwpIHsgcmV0dXJuOyB9XG4gICAgICAgIHRoaXMuZHJhbWFfc19iZy54ID0gdGhpcy5kcmFtYV9zX2JnLnggLSB0aGlzLmJnX3NwZWVkO1xuICAgICAgICB0aGlzLmRyYW1hX3NfYmdfMi54ID0gdGhpcy5kcmFtYV9zX2JnXzIueCAtIHRoaXMuYmdfc3BlZWQ7XG4gICAgICAgIHRoaXMuZHJhbWFfZl9iZy54ID0gdGhpcy5kcmFtYV9mX2JnLnggLSB0aGlzLmZfc3BlZWQ7XG4gICAgICAgIHRoaXMuZHJhbWFfZl9iZ18yLnggPSB0aGlzLmRyYW1hX2ZfYmdfMi54IC0gdGhpcy5mX3NwZWVkO1xuICAgICAgICAvLyDnp7vliqjog4zmma/lsYJcbiAgICAgICAgdGhpcy5jaGFuZ2VCZ1Bvc2l0aW9uKHRoaXMuZHJhbWFfc19iZywgdGhpcy5kcmFtYV9zX2JnXzIsIHRoaXMuZHJhbWFfc19iZ193aWR0aClcbiAgICAgICAgdGhpcy5jaGFuZ2VCZ1Bvc2l0aW9uKHRoaXMuZHJhbWFfc19iZ18yLCB0aGlzLmRyYW1hX3NfYmcsIHRoaXMuZHJhbWFfc19iZ193aWR0aClcbiAgICAgICAgLy8g56e75Yqo5YmN5pmv5bGCXG4gICAgICAgIHRoaXMuY2hhbmdlQmdQb3NpdGlvbih0aGlzLmRyYW1hX2ZfYmcsIHRoaXMuZHJhbWFfZl9iZ18yLCB0aGlzLmRyYW1hX2ZfYmdfd2lkdGgpXG4gICAgICAgIHRoaXMuY2hhbmdlQmdQb3NpdGlvbih0aGlzLmRyYW1hX2ZfYmdfMiwgdGhpcy5kcmFtYV9mX2JnLCB0aGlzLmRyYW1hX2ZfYmdfd2lkdGgpXG4gICAgfSxcblxuICAgIC8vIOiuvue9ruWcsOWbvuS9jee9ruWPr+iDveenu+WKqOi2iueVjOS6hlxuICAgIGNoYW5nZUJnUG9zaXRpb246ZnVuY3Rpb24oY3VyX2JnLCB0YXJnZXRfYmcsIHdpZHRoKXtcbiAgICAgICAgaWYgKGN1cl9iZyA9PSBudWxsIHx8IHRhcmdldF9iZyA9PSBudWxsKSB7IHJldHVybjsgfVxuICAgICAgICBpZiAoY3VyX2JnLnggPD0gLXdpZHRoKXtcbiAgICAgICAgICAgIGN1cl9iZy54ID0gdGFyZ2V0X2JnLnggKyB3aWR0aFxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOabtOaWsOWbnuWQiFxuICAgIHVwZGF0ZVJvdW5kOmZ1bmN0aW9uKHJvdW5kKXtcbiAgICAgICAgLy8gbG9jYWwgZmlnaHRfbGlzdF9jb25maWcgPSBDb25maWcuY29tYmF0X3R5cGVfZGF0YS5kYXRhX2ZpZ2h0X2xpc3RcbiAgICAgICAgLy8gaWYgZmlnaHRfbGlzdF9jb25maWcgPT0gbmlsIG9yIGZpZ2h0X2xpc3RfY29uZmlnW3NlbGYuYmF0dGxlX3R5cGVdID09IG5pbCB0aGVuIHJldHVybiBlbmRcbiAgICAgICAgXG4gICAgICAgIC8vIGxvY2FsIHRvdGFsX3JvdW5kID0gZmlnaHRfbGlzdF9jb25maWdbc2VsZi5iYXR0bGVfdHlwZV0ubWF4X2FjdGlvbl9jb3VudCBvciAwXG4gICAgICAgIC8vIGlmIG5vdCBfdG9sdWFfaXNudWxsKHNlbGYucm91bmRfbGFiZWwpIHRoZW5cbiAgICAgICAgLy8gICAgIHNlbGYucm91bmRfbGFiZWw6c2V0U3RyaW5nKHN0cmluZy5mb3JtYXQoVEkxOE4oXCLnrKwlZC8lZOWbnuWQiFwiKSwgcm91bmQsIHRvdGFsX3JvdW5kKSlcbiAgICAgICAgLy8gZW5kXG4gICAgfSxcblxuICAgIC8vIOWNleS9jeiiq+WKqOaKgOiDveWWiuaLm1xuICAgIHNob3dQYXNzaXZlU2tpbGxOYW1lOmZ1bmN0aW9uKGJhdHRsZV9yb2xlLCBjYWxsYmFjayl7XG4gICAgICAgIGlmKGNhbGxiYWNrKXtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g6I635Y+W5oiY5paX55qE54m55pWI5bGCXG4gICAgZ2V0QmF0dGxlRWZmZWN0TGF5ZXI6ZnVuY3Rpb24oaW5kZXgpe1xuICAgICAgICBpZihpbmRleCA9PSAxKXtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVmZmVjdF9sYXllcl8xO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVmZmVjdF9sYXllcl8yO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOi/lOWbnuinkuiJsuWxglxuICAgIGdldEJhdHRsZVJvbGVMYXllcjpmdW5jdGlvbigpe1xuICAgICAgICByZXR1cm4gdGhpcy5yb2xlX2xheWVyXG4gICAgfSxcblxuICAgIGxvYWRSZXM6ZnVuY3Rpb24ocmVzLCBjYWxsYmFjayl7XG4gICAgICAgIGlmIChyZXMgPT0gbnVsbCB8fCByZXMgPT0gXCJcIikgcmV0dXJuO1xuICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZFJlcyhyZXMsIChmdW5jdGlvbiAocmVzX29iamVjdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVzb3VyY2VzX2xpc3RbcmVzXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNvdXJjZXNfbGlzdFtyZXNdID0gcmVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2socmVzX29iamVjdCk7XG4gICAgICAgIH0pLmJpbmQodGhpcykpO1xuICAgIH0sXG5cbiAgICAvLyDph4rmlL7mjonmiJjmlpflnLrmma/nm7jlhbPkv6Hmga9cbiAgICBkZWxldGVNZTpmdW5jdGlvbigpe1xuICAgICAgICBpZiAodGhpcy5ibGFja19sYXllcil7XG4gICAgICAgICAgICB0aGlzLmJsYWNrX2xheWVyLnN0b3BBbGxBY3Rpb25zKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc3BlY2FpbF9lbnRlcil7XG4gICAgICAgICAgICB0aGlzLnNwZWNhaWxfZW50ZXIuZGVzdHJveSgpXG4gICAgICAgICAgICB0aGlzLnNwZWNhaWxfZW50ZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGZvcih2YXIga2V5IGluIHRoaXMucmVzb3VyY2VzX2xpc3Qpe1xuICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbGVhc2VSZXMoa2V5KVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucm9vdC5kZXN0cm95KCk7XG4gICAgfSxcblxuICAgIC8vIOiuvue9rum7keWxjyzmiJjmlpfmlYjmnpzmkq3mlL5cbiAgICBzZXRCbGFjazpmdW5jdGlvbihzdGF0dXMsIGFscGhhKXtcbiAgICAgICAgaWYgKCFzdGF0dXMpe1xuICAgICAgICAgICAgaWYgKHRoaXMuYmxhY2tfbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJsYWNrX2xheWVyLnN0b3BBbGxBY3Rpb25zKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5ibGFja19sYXllci5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmJsYWNrX29uX3Nob3cgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmJsYWNrX29uX3Nob3cgPT0gdHJ1ZSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5ibGFja19vbl9zaG93ID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuYmxhY2tfbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJsYWNrX2xheWVyLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYmxhY2tfbGF5ZXIgPSBuZXcgY2MuTm9kZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYmxhY2tfbGF5ZXIuc2V0QW5jaG9yUG9pbnQoMCwgMCk7XG4gICAgICAgICAgICAgICAgdGhpcy5ibGFja19sYXllci5zZXRDb250ZW50U2l6ZSh0aGlzLm1haW5fc2l6ZS53aWR0aCArIDIwMCwgdGhpcy5tYWluX3NpemUuaGVpZ2h0ICsgMjAwKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJsYWNrX2xheWVyLnNldFBvc2l0aW9uKC0xMDAsIC0xMDApO1xuICAgICAgICAgICAgICAgIHRoaXMuYmxhY2tfbGF5ZXIuc2NhbGUgPSBGSVRfU0NBTEU7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXR0bGVfbGF5ZXIuYWRkQ2hpbGQodGhpcy5ibGFja19sYXllciwgMSk7XG5cbiAgICAgICAgICAgICAgICB2YXIgZ3JhcGhpY3NfY3AgPSB0aGlzLmJsYWNrX2xheWVyLmFkZENvbXBvbmVudChjYy5HcmFwaGljcyk7XG4gICAgICAgICAgICAgICAgZ3JhcGhpY3NfY3AuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICBncmFwaGljc19jcC5maWxsQ29sb3IgPSBjYy5jb2xvcigwLCAwLCAwLCAxNjgpO1xuICAgICAgICAgICAgICAgIGdyYXBoaWNzX2NwLnJlY3QoMCwgMCwgdGhpcy5tYWluX3NpemUud2lkdGggKyAyMDAsIHRoaXMubWFpbl9zaXplLmhlaWdodCArIDIwMCk7XG4gICAgICAgICAgICAgICAgZ3JhcGhpY3NfY3AuZmlsbCgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmJsYWNrX2xheWVyLm9wYWNpdHkgPSAwO1xuICAgICAgICAgICAgdGhpcy5ibGFja19sYXllci5ydW5BY3Rpb24oY2MuZmFkZUluKDAuMikpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOmch+WxjyzmiJjmlpfmlYjmnpzmkq3mlL5cbiAgICBzaGFrZVNjcmVlbjpmdW5jdGlvbihzaGFrZV9pZCl7XG4gICAgICAgIGlmICh0aGlzLmlzX3NoYWtlKSByZXR1cm47XG4gICAgICAgIGlmIChzaGFrZV9pZCA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIHZhciBkYXRhX2NvbmZpZyA9IENvbmZpZy5za2lsbF9kYXRhLmRhdGFfZ2V0X3NoYWtlX2RhdGFbc2hha2VfaWRdO1xuICAgICAgICBpZiAoZGF0YV9jb25maWcgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmlzX3NoYWtlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5tYWluX2xheWVyLnN0b3BBbGxBY3Rpb25zKCk7XG4gICAgICAgIHRoaXMubWFpbl9sYXllci5zZXRQb3NpdGlvbigwLCAwKTtcbiAgICAgICAgLy8g6YeN572u5L2N572uXG4gICAgICAgIHZhciByZXR1cm5Qb3MgPSBmdW5jdGlvbigpe1xuICAgICAgICAgICAgdGhpcy5pc19zaGFrZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5tYWluX2xheWVyLnNldFBvc2l0aW9uKDAsIDApO1xuICAgICAgICB9LmJpbmQodGhpcyk7XG5cbiAgICAgICAgdmFyIG9yZGVyID0gWzAsIDMsIDYsIDQsIDcsIDgsIDUsIDIsIDFdO1xuICAgICAgICB2YXIgc3RyID0gZGF0YV9jb25maWcuc2hha2Vfc3RyZW5ndGg7ICAgICAgICAgICAvLyDmjK/luYUs5Y2V5L2N5YOP57SgXG4gICAgICAgIHZhciBzdGVwID0gZGF0YV9jb25maWcuc2hha2VfcmF0ZSAqIDAuMDAxOyAgICAgIC8vIOaMr+W5hemXtOmalCzljZXkvY3np5JcbiAgICAgICAgdmFyIHNoYWtlVGltZSA9IGRhdGFfY29uZmlnLnNoYWtlX3RpbWU7ICAgICAgICAgLy8g5oyv5Yqo5qyh5pWwXG4gICAgICAgIHZhciBzaGFrZVhUaW1lID0gMC4yNTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOaoquWQkeWKoOWAjVxuICAgICAgICB2YXIgc2hha2VZVGltZSA9IDAuMjU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDnurXlkJHliqDlgI1cblx0ICAgIHZhciB4eV9saXN0ID0gW1stMC43LCAwLjddLCBbMCwgMV0sIFswLjcsIDAuN10sIFstMSwgMF0sIFswLCAwXSwgWzEsIDBdLCBbLTAuNywgLTAuN10sIFswLCAtMV0sIFswLjcsIC0wLjddXTtcblxuICAgICAgICAvLyDpmo/mnLrorr7nva7lnZDmoIdcbiAgICAgICAgdmFyIHNldFJhbmRvbVBvcyA9IGZ1bmN0aW9uIChpbmRleCl7XG4gICAgICAgICAgICB2YXIgcG9zX3ggPSBzdHIgKiBzaGFrZVlUaW1lICogeHlfbGlzdFtvcmRlcltpbmRleF1dWzBdO1xuICAgICAgICAgICAgdmFyIHBvc195ID0gLXN0ciAqIHNoYWtlWFRpbWUgKiB4eV9saXN0W29yZGVyW2luZGV4XV1bMV07XG4gICAgICAgICAgICB0aGlzLm1haW5fbGF5ZXIuc2V0UG9zaXRpb24ocG9zX3gsIHBvc195KTtcbiAgICAgICAgfS5iaW5kKHRoaXMpO1xuXG4gICAgICAgIHZhciBiYXNlX2NhbGwgPSBudWxsO1xuICAgICAgICBmb3IgKGxldCB0aW1lcyA9IDA7IHRpbWVzIDwgc2hha2VUaW1lOyB0aW1lcysrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgb3JkZXIubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRlbGF5ID0gY2MuZGVsYXlUaW1lKHN0ZXApO1xuICAgICAgICAgICAgICAgIGlmIChiYXNlX2NhbGwgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBiYXNlX2NhbGwgPSBjYy5zZXF1ZW5jZShjYy5jYWxsRnVuYyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRSYW5kb21Qb3MoaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpLCBkZWxheSk7XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIGJhc2VfY2FsbCA9IGNjLnNlcXVlbmNlKGJhc2VfY2FsbCwgY2MuY2FsbEZ1bmMoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFJhbmRvbVBvcyhpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSwgZGVsYXkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdHIgPSBzdHIgLSAzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiYXNlX2NhbGwpe1xuICAgICAgICAgICAgYmFzZV9jYWxsID0gY2Muc2VxdWVuY2UoYmFzZV9jYWxsLCBjYy5jYWxsRnVuYyhyZXR1cm5Qb3MpKTtcbiAgICAgICAgICAgIHRoaXMubWFpbl9sYXllci5ydW5BY3Rpb24oYmFzZV9jYWxsKTtcbiAgICAgICAgfVxuICAgIH0sXG59KTsiXX0=