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