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
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/hero/view/hero_exhibition_item.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, '88431Z3SJVGCqdRuthx3n7Z', 'hero_exhibition_item');
// Scripts/mod/hero/view/hero_exhibition_item.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//     这里是描述这个窗体的作用的
// <br/>Create: 2019-01-24 11:43:27
// --------------------------------------------------------------------
var PathTool = require("pathtool");
 
var HeroConst = require("hero_const");
 
var HeroCalculate = require("hero_calculate");
 
var ExhibitionItem = cc.Class({
  "extends": BasePanel,
  ctor: function ctor() {
    this.rleasePrefab = false;
    this.prefabPath = PathTool.getPrefabPath("hero", "hero_exhibition_item");
 
    var HeroBagController = require("hero_controller");
 
    this.ctrl = HeroBagController.getInstance();
    this.model = this.ctrl.getModel();
    this.isCache = true; //缓存
  },
  // 可以初始化声明一些变量的
  initConfig: function initConfig() {
    this.scale = 1;
    this.data = null;
    this.id = null;
    this.is_allow_select = true; // 是否允许选中和取消选中
 
    this.is_ui_select = false;
    this.percent = null;
    this.percent_lab = null;
    this.str_tips_obj = null;
    this.effect = true; // 是否响应按钮过滤
  },
  // 初始化一些配置数据,可以用于声明一些变量之类的
  initPanel: function initPanel() {
    if (this.cur_pos) {
      this.setPosition(this.cur_pos.x, this.cur_pos.y);
      this.cur_pos = null;
    }
 
    if (this.scale) {
      this.root_wnd.scale = this.scale;
    }
 
    this.star_item_nd = this.seekChild("star_item");
    this.stars_container_nd = this.seekChild("stars_container");
    this.head_icon_nd = this.seekChild("head_icon");
    this.head_icon_sp = this.seekChild("head_icon", cc.Sprite);
    this.comp_type_nd = this.seekChild("comp_type");
    this.comp_type_sp = this.seekChild("comp_type", cc.Sprite);
    this.background_sp = this.seekChild("background", cc.Sprite);
    this.level_lb = this.seekChild("level", cc.Label);
    this.fight_nd = this.seekChild("fight");
    this.select_item_nd = this.seekChild("select_item");
    this.lock_item_nd = this.seekChild("lock_item");
    this.lock_item_sp = this.seekChild("lock_item", cc.Sprite);
    this.red_icon_nd = this.seekChild("red_icon");
    this.chip_icon_nd = this.seekChild("chip_icon");
    this.special_nd = this.seekChild("special");
    this.special_sp = this.seekChild("special", cc.Sprite);
    this.comp_type_sp.spriteFrame = null;
    this.level_lb.string = "";
    this.red_icon_nd.active = this.red_status || false;
 
    if (this.data) {
      this.setData(this.data);
    } else if (this.id != null) {
      this.setUnitData(this.id);
    }
  },
  // 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
  registerEvent: function registerEvent() {},
  // 预制体加载完成之后,添加到对应主节点之后的回调可以设置一些数据了
  onShow: function onShow(params) {
    if (this.root_wnd && !this.click_event) {
      this.root_wnd.on(cc.Node.EventType.TOUCH_END, this.onClickRootWnd, this);
      this.root_wnd.on(cc.Node.EventType.TOUCH_START, this.onClickRootWnd, this);
      this.root_wnd.on(cc.Node.EventType.TOUCH_CANCEL, this.onClickRootWnd, this);
      this.click_event = true;
    }
  },
  // 面板设置不可见的回调,这里做一些不可见的屏蔽处理
  onHide: function onHide() {},
  // 当面板从主节点释放掉的调用接口,需要手动调用,而且也一定要调用
  onDelete: function onDelete() {
    this.unBindEvent();
 
    if (this.head_icon_sp) {
      this.head_icon_sp.spriteFrame = null;
    }
 
    if (this.root_wnd && this.click_event) {
      this.root_wnd.off(cc.Node.EventType.TOUCH_END, this.onClickRootWnd, this);
      this.root_wnd.off(cc.Node.EventType.TOUCH_START, this.onClickRootWnd, this);
      this.root_wnd.off(cc.Node.EventType.TOUCH_CANCEL, this.onClickRootWnd, this);
      this.click_event = false;
    }
 
    ItemsPool.getInstance().cacheItem(this);
  },
  addCallBack: function addCallBack(click_cb) {
    this.click_cb = click_cb;
  },
  addTouchCb: function addTouchCb(touch_cb) {
    this.touch_cb = touch_cb;
  },
  onClickRootWnd: function onClickRootWnd(event) {
    var is_callback = true;
 
    if (this.from_type == HeroConst.ExhibitionItemType.eFormFight) {
      if (!this.data) is_callback = false;
    }
 
    if (event.type === cc.Node.EventType.TOUCH_START) {
      if (this.effect) {
        this.root_wnd.scale = (this.scale || 1) * 0.9;
      }
 
      if (this.touch_cb && is_callback) this.touch_cb(this);
    }
 
    if (event.type === cc.Node.EventType.TOUCH_CANCEL) {
      if (this.effect) {
        this.root_wnd.scale = this.scale || 1;
      }
    }
 
    if (event.type === cc.Node.EventType.TOUCH_END) {
      if (this.effect) {
        this.root_wnd.scale = this.scale || 1;
      }
 
      if (this.click_cb && is_callback) {
        Utils.playButtonSound(3);
        this.click_cb(this);
      }
    }
  },
  setButtonEffect: function setButtonEffect(status) {
    this.effect = status;
  },
  setExtendData: function setExtendData(extend_data) {
    if (!extend_data) return;
    this.scale = extend_data.scale || 1;
    this.can_click = extend_data.can_click || false;
    this.from_type = extend_data.from_type || HeroConst.ExhibitionItemType.eNone;
    this.boold_type = extend_data.boold_type || null;
    this.click_delay = extend_data.click_delay || 0;
    this.hide_star = extend_data.hide_star || false;
  },
  // ==============================--
  // desc:根据单位id设置相关现实
  // @id:
  // @return 
  // ==============================--
  setUnitData: function setUnitData(id) {
    this.id = id;
    if (!this.root_wnd) return;
    id = id || 0;
    var config = Utils.getUnitConfig(id);
 
    if (config == null) {
      this.head_icon_nd.active = false;
      this.stars_container_nd.active = false;
      this.level_lb.string = "";
      var background_res = PathTool.getItemQualityBG(0);
      var common_res_path = PathTool.getCommonIcomPath(background_res);
      this.loadRes(common_res_path, function (sf_obj) {
        this.background_sp.spriteFrame = sf_obj;
      }.bind(this));
 
      if (this.comp_type_nd) {
        this.comp_type_nd.active = false;
      }
    } else {
      this.head_icon_nd.active = true;
      this.stars_container_nd.active = true;
      var monster_id = config.monster3;
 
      if (monster_id) {
        var monster_config = Utils.getUnitConfig(monster_id);
 
        if (monster_config) {
          // 设置头像
          var head_res_path = PathTool.getHeadRes(monster_config.head_icon);
          this.loadRes(head_res_path, function (head_sf) {
            this.head_icon_sp.spriteFrame = head_sf;
          }.bind(this)); // 设置品质框
 
          var background_res = PathTool.getItemQualityBG(monster_config.star);
          var common_res_path = PathTool.getCommonIcomPath(background_res);
          this.loadRes(common_res_path, function (sf_obj) {
            this.background_sp.spriteFrame = sf_obj;
          }.bind(this)); // 设置阵营
 
          var camp_res = PathTool.getHeroCampRes(monster_config.camp_type);
          var common_res_path = PathTool.getUIIconPath("common", camp_res);
          this.loadRes(common_res_path, function (sf_obj) {
            this.comp_type_sp.spriteFrame = sf_obj;
          }.bind(this)); // -- 设置星数
 
          this.updateStars(monster_config.star); // 设置等级
 
          this.level_lb.string = monster_config.lev.toString();
        }
      }
    }
  },
  //头像
  setHeadImg: function setHeadImg(head_icon) {
    var head_res_path = PathTool.getHeadRes(head_icon);
    this.loadRes(head_res_path, function (head_sf) {
      this.head_icon_sp.spriteFrame = head_sf;
    }.bind(this));
  },
  //品质框
  setQualityImg: function setQualityImg(quality) {
    var background_res = PathTool.getItemQualityBG(quality);
    var common_res_path = PathTool.getCommonIcomPath(background_res);
    this.loadRes(common_res_path, function (sf_obj) {
      this.background_sp.spriteFrame = sf_obj;
    }.bind(this));
  },
  //阵营
  setCampImg: function setCampImg(camp_type) {
    var camp_res = PathTool.getHeroCampRes(camp_type);
    var common_res_path = PathTool.getUIIconPath("common", camp_res);
    this.loadRes(common_res_path, function (sf_obj) {
      this.comp_type_sp.spriteFrame = sf_obj;
    }.bind(this));
  },
  //等级
  setLev: function setLev(lev) {
    this.level_lb.string = lev.toString();
  },
  init: function init() {
    this.setRootScale(1);
    this.cur_pos = null;
    this.setPosition(0, 0);
    this.setData(null);
    this.setExtendData({});
    this.record_res_id = null;
    this.showChipIcon(false); // this.setHeadUnEnabled(true)
 
    this.showRedPoint(false);
 
    if (this.bgImg) {
      this.bgImg.node.active = false;
    }
 
    if (this.barNode) {
      this.barNode.active = false;
    }
 
    if (this.lock_icon) {
      this.lock_icon.node.active = false;
    }
 
    this.showLockIcon(false);
    this.setSelected(false);
 
    if (this.hireHero) {
      this.hireHero.node.active = false;
    }
 
    this.showStrTips(false);
    this.showHelpImg(false);
 
    if (this.fight_nd) {
      this.fight_nd.active = false;
    }
 
    this.str_tips_obj = null;
    this.cur_visible = false;
    this.id = null;
    this.is_allow_select = true; // 是否允许选中和取消选中
 
    this.is_ui_select = false;
    this.percent = null;
    this.percent_lab = null;
    this.effect = true;
    this.addCallBack(null);
    this.addTouchCb(null);
 
    if (this.special_nd) {
      this.special_nd.active = false;
    }
 
    if (this.root_wnd_cb) {
      this.root_wnd_cb = null;
    }
 
    if (this.head_icon_nd) {
      this.head_icon_nd.active = true;
    }
 
    if (this.root_wnd) {
      Utils.setChildUnEnabled(this.root_wnd, false);
    }
  },
  setData: function setData(data) {
    if (this.data && this.item_update_event) {
      this.data.unbind(this.item_update_event);
      this.item_update_event = null;
    }
 
    this.data = data;
 
    if (this.root_wnd) {
      if (!data) {
        this.head_icon_nd.active = false;
        this.head_icon_sp.spriteFrame = null;
        this.stars_container_nd.active = false;
        this.level_lb.string = "";
        this.comp_type_sp.spriteFrame = null;
        var background_res = this.record_res_id = PathTool.getItemQualityBG(0);
        var common_res_path = PathTool.getCommonIcomPath(background_res);
        this.loadRes(common_res_path, function (sf_obj) {
          this.background_sp.spriteFrame = sf_obj;
        }.bind(this));
 
        if (this.special_nd.active) {
          this.special_nd.active = false;
        }
      } else {
        this.head_icon_nd.active = true;
        this.stars_container_nd.active = true;
      }
 
      this.setRootScale(this.scale);
      this.updateWidget(data);
    }
 
    ;
    if (this.data && this.data.UPDATE_PARTNER_ATTR) this.addVoBindEvent();
  },
  updateWidget: function updateWidget(info) {
    if (!info) {
      this.setSelected(false);
      return;
    }
 
    var data = info;
 
    if (typeof info == "number") {
      data = Config.partner_data.data_partner_base[data];
      if (!data) return;
    } else {
      if (info.data) data = info.data;
    }
 
    if (!data || data.bid === undefined) return;
    var star = data.star || data.init_star; // 根节点名称
 
    this.root_wnd.name = "hero" + "_" + data.bid; // 头像
 
    this.record_head_id = null;
    var head_res_path = null;
 
    if (data.bid === 0) {
      if (this.default_path) {
        head_res_path = this.default_path;
      } else if (data.icon) {
        head_res_path = PathTool.getIconPath("item", data.icon);
      }
    } else {
      var use_skin = this.findUseSkin(info);
 
      if (use_skin != null && use_skin != 0) {
        var skin_config = Config.partner_skin_data.data_skin_info[use_skin];
 
        if (skin_config) {
          head_res_path = PathTool.getHeadRes(skin_config.head_id);
        }
      } else {
        var star_key = data.bid + "_" + star;
        var star_cfg = gdata("partner_data", "data_partner_star", star_key);
 
        if (star_cfg) {
          var shwo_head_id = star_cfg.head_id;
 
          if (!this.record_head_id || this.record_head_id !== shwo_head_id) {
            this.record_head_id = shwo_head_id;
            head_res_path = PathTool.getHeadRes(this.record_head_id); // if (data.item_id) {
            //     var item_cfg = gdata("item_data", "data_unit5", data.item_id);
            //     head_res_path = PathTool.getIconPath("item", item_cfg.icon);
            // }
          }
        }
      }
    }
 
    if (head_res_path) {
      this.loadRes(head_res_path, function (head_sf) {
        if (this.root_wnd && this.root_wnd.isValid) {
          this.head_icon_sp.spriteFrame = head_sf;
        }
      }.bind(this));
    } // 背景
 
 
    var background_res = PathTool.getItemQualityBG(star - 1);
 
    if (!this.record_res_id || this.record_res_id != background_res) {
      this.record_res_id = background_res;
      var common_res_path = PathTool.getCommonIcomPath(background_res);
      this.loadRes(common_res_path, function (sf_obj) {
        if (this.root_wnd && this.root_wnd.isValid) {
          this.background_sp.spriteFrame = sf_obj;
        }
      }.bind(this));
    } // 阵营
 
 
    var camp_type;
    var par_config = Config.partner_data.data_partner_base[data.bid];
 
    if (par_config) {
      camp_type = par_config.camp_type;
    }
 
    if (data.bid == 0 && data.camp_type) {
      camp_type = data.camp_type;
    }
 
    if (camp_type === 0) {
      this.comp_type_nd.active = false;
    } else {
      if (camp_type && this.comp_type_nd) {
        this.comp_type_nd.active = true;
        var camp_res = PathTool.getHeroCampRes(camp_type);
        var common_res_path = PathTool.getUIIconPath("common", camp_res);
        this.loadRes(common_res_path, function (sf_obj) {
          if (this.root_wnd && this.root_wnd.isValid) {
            this.comp_type_sp.spriteFrame = sf_obj;
          }
        }.bind(this));
      }
    } //碎片
 
 
    if (this.chip_status != null) {
      this.showChipIcon(this.chip_status);
    } // 星星
 
 
    if (this.hide_star) {
      this.stars_container_nd.active = false;
    } else {
      this.stars_container_nd.active = true;
      this.updateStars(data.star);
    } // 等级
 
 
    if (data.lev) {
      this.level_lb.string = data.lev;
    } else {
      this.level_lb.string = "";
    } // 图鉴显示变灰逻辑
 
 
    this.setHeadUnEnabled(true);
 
    if (this.red_status != null) {
      this.showRedPoint(this.red_status);
    } else {
      this.showRedPoint(false);
    }
 
    this.fight_nd.active = false;
 
    if (this.bgImg) {
      this.bgImg.node.active = false;
    }
 
    if (this.barNode) {
      this.barNode.active = false;
    }
 
    if (this.lock_icon) {
      this.lock_icon.node.active = false;
    }
 
    if (this.from_type == HeroConst.ExhibitionItemType.eHeroBag) {
      // 英雄界面判断红点
      this.setSelected(false);
      this.showRedPoint(false);
 
      if (HeroCalculate.getInstance().isCheckHeroRedPointByHeroVo(data)) {
        var is_redpoint = HeroCalculate.getInstance().checkSingleHeroRedPoint(data);
        this.showRedPoint(is_redpoint);
      }
 
      this.fight_nd.active = this.data.isFormDrama();
    } else if (this.from_type == HeroConst.ExhibitionItemType.eHeroChange) {
      // 英雄转换界面
      if (this.lock_icon) {
        this.lock_icon.node.destroy();
        this.lock_icon = null;
      }
 
      if (this.lock_label) {
        this.lock_label.node.destroy();
        this.lock_label = null;
      } // --设置锁住状态
 
 
      this.showLockIcon(data.is_locked || false, data.lock_str); // --设置选中状态 
 
      this.setSelected(data.is_ui_select == true);
    } else if (this.from_type == HeroConst.ExhibitionItemType.ePokedex) {
      // 图鉴界面是否置灰
      this.showRedPoint(false);
      var is_have = false;
      var par_max_star = this.model.getHadHeroStarBybid(data.bid);
      if (!par_max_star || par_max_star < data.star) this.setHeadUnEnabled(false);
    } else if (this.from_type == HeroConst.ExhibitionItemType.eFormFight) {
      // 布阵
      this.setSelected(data.is_ui_select);
    } else if (this.from_type == HeroConst.ExhibitionItemType.eHeroSelect) {
      // 
      this.setSelected(data.is_ui_select);
      this.showLockIcon(data.is_ui_lock);
    } else if (this.from_type == HeroConst.ExhibitionItemType.eUpStar) {
      // 英雄生星
      this.setGrayHead(data.head_gray);
    } else if (this.from_type == HeroConst.ExhibitionItemType.eHeroReset) {
      // 英雄分解
      if (!data.is_ui_lock) {
        this.setSelected(data.is_ui_select);
      }
 
      this.showLockIcon(data.is_ui_lock);
    } else if (this.from_type == HeroConst.ExhibitionItemType.eExpeditFight) {
      //远征
      // 血条
      var blood = 100;
 
      if (this.boold_type == true) {
        var HeroExpeditController = require("heroexpedit_controller");
 
        var partner_id = data.partner_id;
 
        if (data.partner_id > 100000) {
          partner_id = data.partner_id - 100000;
        }
 
        blood = HeroExpeditController.getInstance().getModel().getHeroBloodById(partner_id, data.rid, data.srv_id);
        var status = false;
        status = HeroExpeditController.getInstance().getModel().getHireHero(partner_id, data.rid, data.srv_id);
 
        if (status == true && data.is_used != null) {
          // -- self:showHelpImg(true)
          // --远征的支援标志......2019.1.28。20:37  晓勤特地叫改回来的
          if (!this.hireHero) {
            this.hireHero = Utils.createImage(this.root_wnd, null, 20, -63, cc.v2(0, 0));
          } else {
            this.hireHero.node.active = true;
          }
 
          this.loadRes(PathTool.getUIIconPath("heroexpedit", "txt_heroexpedit_1"), function (resObject) {
            this.hireHero.spriteFrame = resObject;
          }.bind(this));
        } else {
          if (this.hireHero) {
            this.hireHero.node.active = false;
          }
        }
      } else {
        blood = data.blood || 0;
      }
 
      this.showProgressbar(blood);
 
      if (blood <= 0) {
        this.showStrTips(true, Utils.TI18N("已阵亡"), {
          c3b: new cc.Color(255, 255, 255, 255)
        });
      } else {
        this.showStrTips(false);
      } // 设置选中状态 
 
 
      this.setSelected(data.is_ui_select == true);
    } else if (this.from_type == HeroConst.ExhibitionItemType.eEndLessHero) {
      // 设置选中状态 
      this.setSelected(data.is_ui_select == true); // 是雇佣兵
 
      if (data.is_endless) {
        this.showHelpImg(true);
      } else {
        this.showHelpImg(false);
      }
 
      if (data.hp_per != null) {
        this.showProgressbar(data.hp_per);
 
        if (data.hp_per <= 0) {
          this.showStrTips(true, Utils.TI18N("已阵亡"), {
            c3b: new cc.Color(255, 255, 255, 255)
          });
        } else {
          this.showStrTips(false);
        }
      }
    } else if (this.from_type == HeroConst.ExhibitionItemType.eHeroFuse) {
      var need_count = data.need_count || 0;
      var total_count = data.total_count || 0;
      var label = cc.js.formatStr("%s/%s", total_count, need_count);
 
      if (data.cur_redpoint === 1) {
        this.showRedPoint(true);
      } else {
        this.showRedPoint(false);
      }
 
      this.showProgressbar(total_count / need_count * 100, label);
      this.setSelected(data.is_ui_select == true);
    } else if (this.from_type == HeroConst.ExhibitionItemType.eVoyage) {
      //远航
      this.showStrTips(data.in_task, Utils.TI18N("任务中"));
    } else {
      this.setSelected(this.is_ui_select);
 
      if (this.percent != null) {
        this.showProgressbar(this.percent, this.percent_lab);
      }
 
      if (this.str_tips_obj) {
        this.showStrTips(this.str_tips_obj.status, this.str_tips_obj.str, this.str_tips_obj.color);
      }
    }
  },
  unBindEvent: function unBindEvent() {
    if (this.data && this.item_update_event) {
      this.data.unbind(this.item_update_event);
      this.item_update_event = null;
    }
  },
  updateStars: function updateStars(star_num) {
    var star_res = "";
    var star_scal = 1;
    var star;
    this.special_nd.active = false;
    this.stars_container_nd.width = 0;
    this.stars_container_nd.removeAllChildren();
 
    if (star_num > 0 && star_num <= 5) {
      star_res = "common_90074";
    } else if (star_num > 5 && star_num <= 9) {
      star_num = star_num - 5;
      star_res = "common_90075";
    } else if (star_num > 9) {
      star = star_num - 10;
      star_num = 1;
      star_res = "common_90073";
      star_scal = 1.2;
      this.special_nd.active = true;
      var path;
 
      if (star > 0) {
        path = PathTool.getUIIconPath("common", "common_90084");
      } else {
        path = PathTool.getUIIconPath("common", "common_90076");
      }
 
      this.loadRes(path, function (res) {
        this.special_sp.spriteFrame = res;
      }.bind(this));
    }
 
    for (var star_i = 0; star_i < star_num; star_i++) {
      var star_nd = cc.instantiate(this.star_item_nd);
      star_nd.scale = star_scal;
      var star_sp = star_nd.getComponent(cc.Sprite);
      var common_res_path = PathTool.getCommonIcomPath(star_res);
      this.loadRes(common_res_path, function (star_sp, sf_obj) {
        star_sp.spriteFrame = sf_obj;
      }.bind(this, star_sp));
      this.stars_container_nd.addChild(star_nd);
 
      if (star) {
        var node = new cc.Node();
        node.y = -1;
        var lab = node.addComponent(cc.Label);
        lab.string = star;
        lab.fontSize = 15;
        lab.lineHeight = 16;
        lab.horizontalAlign = cc.macro.TextAlignment.CENTER;
        lab.verticalAlign = cc.macro.TextAlignment.CENTER;
        node.addComponent(cc.LabelOutline).color = new cc.color(0, 0, 0);
        star_nd.addChild(node);
      }
    }
  },
  setHeadUnEnabled: function setHeadUnEnabled(status) {
    var sp_status = cc.Sprite.State.NORMAL;
 
    if (!status) {
      sp_status = cc.Sprite.State.GRAY;
    }
 
    if (this.head_icon_sp) {
      this.head_icon_sp.setState(sp_status);
    }
 
    if (this.comp_type_sp) {
      this.comp_type_sp.setState(sp_status);
    }
  },
  setSelected: function setSelected(status) {
    if (!this.is_allow_select) return;
    this.is_ui_select = status;
 
    if (this.root_wnd == null) {
      return;
    }
 
    if (status) {
      this.select_item_nd.active = true;
    } else {
      this.select_item_nd.active = false;
    }
  },
  setRootPosition: function setRootPosition(pos) {
    if (!pos) return;
 
    if (this.root_wnd) {
      this.setPosition(pos.x, pos.y);
    } else {
      this.cur_pos = pos;
    }
  },
  setRootScale: function setRootScale(scale) {
    if (!scale) return;
    this.scale = scale;
 
    if (this.root_wnd) {
      this.root_wnd.scale = scale;
    }
  },
  getWorldPos: function getWorldPos() {
    if (this.root_wnd) {
      return this.root_wnd.convertToWorldSpaceAR(cc.v2(0, 0));
    }
 
    return null;
  },
  updagePositon: function updagePositon(new_pos) {
    if (!new_pos) return;
    if (this.root_wnd) this.root_wnd.setPosition(new_pos);
  },
  addVoBindEvent: function addVoBindEvent() {
    if (this.data && this.data.id) {
      if (this.item_update_event) return;
      this.item_update_event = this.data.bind(this.data.UPDATE_PARTNER_ATTR, function (hero_vo) {
        if (this.root_wnd) this.setData(hero_vo);
      }.bind(this));
    }
  },
  setDefaultHead: function setDefaultHead(icon_path) {
    if (icon_path) this.default_path = icon_path;
  },
  setGrayHead: function setGrayHead(status) {
    var sp_state = cc.Sprite.State.NORMAL;
 
    if (status) {
      sp_state = cc.Sprite.State.GRAY;
    }
 
    this.head_icon_sp.setState(sp_state);
  },
  // --设置锁
  showLockIcon: function showLockIcon(bool, str) {
    var self = this;
    if (bool == false && !self.lock_icon) return;
 
    if (!self.lock_icon) {
      var res = PathTool.getUIIconPath("common", "common_90009");
 
      var _size = cc.size(this.root_wnd.width, this.root_wnd.height);
 
      self.lock_icon = Utils.createImage(self.root_wnd, res, 0, 0, cc.v2(0.5, 0.5), true, 0, false);
      this.loadRes(res, function (resObject) {
        self.lock_icon.spriteFrame = resObject;
      }.bind(this));
    }
 
    if (str) {
      if (!self.lock_label) {
        self.lock_label = Utils.createLabel(22, Config.color_data.data_color16[1], Config.color_data.data_color4[9], size.width / 2, 22, "", this.root_wnd, 2, cc.v2(0.5, 0));
      }
 
      self.lock_label.string = str;
    }
 
    self.lock_icon.node.active = bool; // -- 锁住的时候某些部分要置灰
 
    self.setHeadUnEnabled(!bool);
 
    if (self.partner_type) {// setChildUnEnabled(bool, self.partner_type)
    }
 
    if (self.lock_label) {
      self.lock_label.node.active = bool;
    }
  },
  // 显示支援图片
  showHelpImg: function showHelpImg(bool) {
    if (bool == false && !this.help_img) return;
 
    if (!this.help_img) {
      var res = PathTool.getCommonIcomPath("txt_cn_common_90014");
      this.help_img = Utils.createImage(this.root_wnd, res, -this.root_wnd.width / 2 + 20, -this.root_wnd.height / 2 + 20, cc.v2(0.5, 0.5), true, 0, false);
      this.loadRes(res, function (resObject) {
        this.help_img.spriteFrame = resObject;
      }.bind(this));
    }
 
    this.help_img.node.active = bool;
  },
  // @percent 百分比
  // @label 进度条中间文字描述
  showProgressbar: function showProgressbar(percent, label) {
    this.percent = percent;
    this.percent_lab = label;
    if (!this.root_wnd) return;
    var size = cc.size(118, 15);
 
    if (this.bgImg) {
      this.bgImg.node.active = true;
    }
 
    if (this.barNode) {
      this.barNode.active = true;
    }
 
    if (!this.comp_bar) {
      var res = PathTool.getCommonIcomPath("common_90005");
      var res1 = PathTool.getCommonIcomPath("common_90006");
      this.bgImg = Utils.createImage(this.root_wnd, null, 0, -this.root_wnd.height / 2 - size.height / 2 - 2, cc.v2(0.5, 0.5), true, 0, true);
      this.bgImg.node.setContentSize(size.width + 2, size.height + 2);
      this.loadRes(res, function (resObject) {
        this.bgImg.spriteFrame = resObject;
      }.bind(this));
      this.barNode = new cc.Node();
      this.barNode.setAnchorPoint(cc.v2(0.5, 0.5));
      this.barNode.setContentSize(size);
      this.barNode.setPosition(0, -this.root_wnd.height / 2 - size.height / 2 - 2);
      this.root_wnd.addChild(this.barNode);
      var barImg = this.barNode.addComponent(cc.Sprite);
      barImg.type = cc.Sprite.Type.SLICED;
      barImg.sizeMode = cc.Sprite.SizeMode.CUSTOM;
      this.loadRes(res1, function (resObject) {
        barImg.spriteFrame = resObject;
      }.bind(this));
      var comp_bar = this.barNode.addComponent(cc.ProgressBar);
      comp_bar.barSprite = barImg;
      comp_bar.mode = cc.ProgressBar.Mode.HORIZONTAL;
      comp_bar.totalLength = size.width;
      this.comp_bar = comp_bar;
    }
 
    if (this.comp_bar_label) {
      this.comp_bar_label.string = "";
    }
 
    if (label) {
      if (!this.comp_bar_label) {
        var text_color = new cc.Color(255, 255, 255, 255);
        var line_color = new cc.Color(0, 0, 0, 255);
        var size = cc.size(118, 19);
        this.comp_bar_label = Utils.createLabel(18, text_color, line_color, size.width / 2, 0, "", this.comp_bar.node, 2, cc.v2(0.5, 0.5));
      }
 
      this.comp_bar_label.string = label;
    }
 
    this.comp_bar.progress = percent / 100;
  },
  //  显示文字提示
  showStrTips: function showStrTips(status, str, color) {
    this.str_tips_obj = {
      status: status,
      str: str,
      color: color
    };
    if (!this.root_wnd) return;
 
    if (status) {
      if (this.lay_tips == null) {
        this.lay_tips = new cc.Node();
        this.lay_tips.setAnchorPoint(cc.v2(0.5, 0.5));
        var size = this.root_wnd.getContentSize();
        this.lay_tips.setContentSize(size);
        this.lay_tips.setPosition(0, 0);
        var graphics_cp = this.lay_tips.addComponent(cc.Graphics);
        graphics_cp.clear();
        graphics_cp.fillColor = cc.color(0, 0, 0, 150);
        graphics_cp.rect(-size.width / 2, -size.height / 2, size.width, size.height);
        graphics_cp.fill();
        var c3b = new cc.Color(255, 255, 255, 255);
        var enable = new cc.Color(132, 0, 0, 255);
 
        if (color) {
          c3b = color.c3b || c3b;
          enable = color.enable || enable;
        }
 
        var tips_text = Utils.createLabel(26, c3b, enable, 0, 0, str, this.lay_tips, 1, cc.v2(0.5, 0.5));
        this.root_wnd.addChild(this.lay_tips);
      }
 
      this.lay_tips.active = true;
    } else {
      if (this.lay_tips) {
        this.lay_tips.active = false;
      }
    }
  },
  findUseSkin: function findUseSkin(info) {
    if (info.ext_data) {
      var ext = info.ext_data || {};
 
      for (var i in ext) {
        var v = ext[i];
 
        if (v.key == 5) {
          return v.val;
        }
      }
    }
 
    if (info.ext != null) {
      var _ext = info.ext || {};
 
      for (var _i in _ext) {
        var _v = _ext[_i];
 
        if (_v.key == 5) {
          return _v.val;
        }
      }
    }
 
    if (info.use_skin) {
      return info.use_skin;
    }
 
    return 0;
  },
  getData: function getData() {
    return this.data || {};
  },
  showRedPoint: function showRedPoint(status) {
    this.red_status = status;
    if (this.red_icon_nd) this.red_icon_nd.active = !!status;
  },
  showChipIcon: function showChipIcon(status) {
    this.chip_status = status;
 
    if (this.chip_icon_nd) {
      this.chip_icon_nd.active = status;
    }
  } // showLockIcon: function(status) {
  //     this.lock_item_nd.active = status;
  //     this.lock_item_sp.setState(!status);
  //     if (status) {
  //         this.setHeadUnEnabled(false);
  //     } else {
  //         this.setHeadUnEnabled(true);
  //     }
  // },
 
});
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxoZXJvXFx2aWV3XFxoZXJvX2V4aGliaXRpb25faXRlbS5qcyJdLCJuYW1lcyI6WyJQYXRoVG9vbCIsInJlcXVpcmUiLCJIZXJvQ29uc3QiLCJIZXJvQ2FsY3VsYXRlIiwiRXhoaWJpdGlvbkl0ZW0iLCJjYyIsIkNsYXNzIiwiQmFzZVBhbmVsIiwiY3RvciIsInJsZWFzZVByZWZhYiIsInByZWZhYlBhdGgiLCJnZXRQcmVmYWJQYXRoIiwiSGVyb0JhZ0NvbnRyb2xsZXIiLCJjdHJsIiwiZ2V0SW5zdGFuY2UiLCJtb2RlbCIsImdldE1vZGVsIiwiaXNDYWNoZSIsImluaXRDb25maWciLCJzY2FsZSIsImRhdGEiLCJpZCIsImlzX2FsbG93X3NlbGVjdCIsImlzX3VpX3NlbGVjdCIsInBlcmNlbnQiLCJwZXJjZW50X2xhYiIsInN0cl90aXBzX29iaiIsImVmZmVjdCIsImluaXRQYW5lbCIsImN1cl9wb3MiLCJzZXRQb3NpdGlvbiIsIngiLCJ5Iiwicm9vdF93bmQiLCJzdGFyX2l0ZW1fbmQiLCJzZWVrQ2hpbGQiLCJzdGFyc19jb250YWluZXJfbmQiLCJoZWFkX2ljb25fbmQiLCJoZWFkX2ljb25fc3AiLCJTcHJpdGUiLCJjb21wX3R5cGVfbmQiLCJjb21wX3R5cGVfc3AiLCJiYWNrZ3JvdW5kX3NwIiwibGV2ZWxfbGIiLCJMYWJlbCIsImZpZ2h0X25kIiwic2VsZWN0X2l0ZW1fbmQiLCJsb2NrX2l0ZW1fbmQiLCJsb2NrX2l0ZW1fc3AiLCJyZWRfaWNvbl9uZCIsImNoaXBfaWNvbl9uZCIsInNwZWNpYWxfbmQiLCJzcGVjaWFsX3NwIiwic3ByaXRlRnJhbWUiLCJzdHJpbmciLCJhY3RpdmUiLCJyZWRfc3RhdHVzIiwic2V0RGF0YSIsInNldFVuaXREYXRhIiwicmVnaXN0ZXJFdmVudCIsIm9uU2hvdyIsInBhcmFtcyIsImNsaWNrX2V2ZW50Iiwib24iLCJOb2RlIiwiRXZlbnRUeXBlIiwiVE9VQ0hfRU5EIiwib25DbGlja1Jvb3RXbmQiLCJUT1VDSF9TVEFSVCIsIlRPVUNIX0NBTkNFTCIsIm9uSGlkZSIsIm9uRGVsZXRlIiwidW5CaW5kRXZlbnQiLCJvZmYiLCJJdGVtc1Bvb2wiLCJjYWNoZUl0ZW0iLCJhZGRDYWxsQmFjayIsImNsaWNrX2NiIiwiYWRkVG91Y2hDYiIsInRvdWNoX2NiIiwiZXZlbnQiLCJpc19jYWxsYmFjayIsImZyb21fdHlwZSIsIkV4aGliaXRpb25JdGVtVHlwZSIsImVGb3JtRmlnaHQiLCJ0eXBlIiwiVXRpbHMiLCJwbGF5QnV0dG9uU291bmQiLCJzZXRCdXR0b25FZmZlY3QiLCJzdGF0dXMiLCJzZXRFeHRlbmREYXRhIiwiZXh0ZW5kX2RhdGEiLCJjYW5fY2xpY2siLCJlTm9uZSIsImJvb2xkX3R5cGUiLCJjbGlja19kZWxheSIsImhpZGVfc3RhciIsImNvbmZpZyIsImdldFVuaXRDb25maWciLCJiYWNrZ3JvdW5kX3JlcyIsImdldEl0ZW1RdWFsaXR5QkciLCJjb21tb25fcmVzX3BhdGgiLCJnZXRDb21tb25JY29tUGF0aCIsImxvYWRSZXMiLCJzZl9vYmoiLCJiaW5kIiwibW9uc3Rlcl9pZCIsIm1vbnN0ZXIzIiwibW9uc3Rlcl9jb25maWciLCJoZWFkX3Jlc19wYXRoIiwiZ2V0SGVhZFJlcyIsImhlYWRfaWNvbiIsImhlYWRfc2YiLCJzdGFyIiwiY2FtcF9yZXMiLCJnZXRIZXJvQ2FtcFJlcyIsImNhbXBfdHlwZSIsImdldFVJSWNvblBhdGgiLCJ1cGRhdGVTdGFycyIsImxldiIsInRvU3RyaW5nIiwic2V0SGVhZEltZyIsInNldFF1YWxpdHlJbWciLCJxdWFsaXR5Iiwic2V0Q2FtcEltZyIsInNldExldiIsImluaXQiLCJzZXRSb290U2NhbGUiLCJyZWNvcmRfcmVzX2lkIiwic2hvd0NoaXBJY29uIiwic2hvd1JlZFBvaW50IiwiYmdJbWciLCJub2RlIiwiYmFyTm9kZSIsImxvY2tfaWNvbiIsInNob3dMb2NrSWNvbiIsInNldFNlbGVjdGVkIiwiaGlyZUhlcm8iLCJzaG93U3RyVGlwcyIsInNob3dIZWxwSW1nIiwiY3VyX3Zpc2libGUiLCJyb290X3duZF9jYiIsInNldENoaWxkVW5FbmFibGVkIiwiaXRlbV91cGRhdGVfZXZlbnQiLCJ1bmJpbmQiLCJ1cGRhdGVXaWRnZXQiLCJVUERBVEVfUEFSVE5FUl9BVFRSIiwiYWRkVm9CaW5kRXZlbnQiLCJpbmZvIiwiQ29uZmlnIiwicGFydG5lcl9kYXRhIiwiZGF0YV9wYXJ0bmVyX2Jhc2UiLCJiaWQiLCJ1bmRlZmluZWQiLCJpbml0X3N0YXIiLCJuYW1lIiwicmVjb3JkX2hlYWRfaWQiLCJkZWZhdWx0X3BhdGgiLCJpY29uIiwiZ2V0SWNvblBhdGgiLCJ1c2Vfc2tpbiIsImZpbmRVc2VTa2luIiwic2tpbl9jb25maWciLCJwYXJ0bmVyX3NraW5fZGF0YSIsImRhdGFfc2tpbl9pbmZvIiwiaGVhZF9pZCIsInN0YXJfa2V5Iiwic3Rhcl9jZmciLCJnZGF0YSIsInNod29faGVhZF9pZCIsImlzVmFsaWQiLCJwYXJfY29uZmlnIiwiY2hpcF9zdGF0dXMiLCJzZXRIZWFkVW5FbmFibGVkIiwiZUhlcm9CYWciLCJpc0NoZWNrSGVyb1JlZFBvaW50QnlIZXJvVm8iLCJpc19yZWRwb2ludCIsImNoZWNrU2luZ2xlSGVyb1JlZFBvaW50IiwiaXNGb3JtRHJhbWEiLCJlSGVyb0NoYW5nZSIsImRlc3Ryb3kiLCJsb2NrX2xhYmVsIiwiaXNfbG9ja2VkIiwibG9ja19zdHIiLCJlUG9rZWRleCIsImlzX2hhdmUiLCJwYXJfbWF4X3N0YXIiLCJnZXRIYWRIZXJvU3RhckJ5YmlkIiwiZUhlcm9TZWxlY3QiLCJpc191aV9sb2NrIiwiZVVwU3RhciIsInNldEdyYXlIZWFkIiwiaGVhZF9ncmF5IiwiZUhlcm9SZXNldCIsImVFeHBlZGl0RmlnaHQiLCJibG9vZCIsIkhlcm9FeHBlZGl0Q29udHJvbGxlciIsInBhcnRuZXJfaWQiLCJnZXRIZXJvQmxvb2RCeUlkIiwicmlkIiwic3J2X2lkIiwiZ2V0SGlyZUhlcm8iLCJpc191c2VkIiwiY3JlYXRlSW1hZ2UiLCJ2MiIsInJlc09iamVjdCIsInNob3dQcm9ncmVzc2JhciIsIlRJMThOIiwiYzNiIiwiQ29sb3IiLCJlRW5kTGVzc0hlcm8iLCJpc19lbmRsZXNzIiwiaHBfcGVyIiwiZUhlcm9GdXNlIiwibmVlZF9jb3VudCIsInRvdGFsX2NvdW50IiwibGFiZWwiLCJqcyIsImZvcm1hdFN0ciIsImN1cl9yZWRwb2ludCIsImVWb3lhZ2UiLCJpbl90YXNrIiwic3RyIiwiY29sb3IiLCJzdGFyX251bSIsInN0YXJfcmVzIiwic3Rhcl9zY2FsIiwid2lkdGgiLCJyZW1vdmVBbGxDaGlsZHJlbiIsInBhdGgiLCJyZXMiLCJzdGFyX2kiLCJzdGFyX25kIiwiaW5zdGFudGlhdGUiLCJzdGFyX3NwIiwiZ2V0Q29tcG9uZW50IiwiYWRkQ2hpbGQiLCJsYWIiLCJhZGRDb21wb25lbnQiLCJmb250U2l6ZSIsImxpbmVIZWlnaHQiLCJob3Jpem9udGFsQWxpZ24iLCJtYWNybyIsIlRleHRBbGlnbm1lbnQiLCJDRU5URVIiLCJ2ZXJ0aWNhbEFsaWduIiwiTGFiZWxPdXRsaW5lIiwic3Bfc3RhdHVzIiwiU3RhdGUiLCJOT1JNQUwiLCJHUkFZIiwic2V0U3RhdGUiLCJzZXRSb290UG9zaXRpb24iLCJwb3MiLCJnZXRXb3JsZFBvcyIsImNvbnZlcnRUb1dvcmxkU3BhY2VBUiIsInVwZGFnZVBvc2l0b24iLCJuZXdfcG9zIiwiaGVyb192byIsInNldERlZmF1bHRIZWFkIiwiaWNvbl9wYXRoIiwic3Bfc3RhdGUiLCJib29sIiwic2VsZiIsInNpemUiLCJoZWlnaHQiLCJjcmVhdGVMYWJlbCIsImNvbG9yX2RhdGEiLCJkYXRhX2NvbG9yMTYiLCJkYXRhX2NvbG9yNCIsInBhcnRuZXJfdHlwZSIsImhlbHBfaW1nIiwiY29tcF9iYXIiLCJyZXMxIiwic2V0Q29udGVudFNpemUiLCJzZXRBbmNob3JQb2ludCIsImJhckltZyIsIlR5cGUiLCJTTElDRUQiLCJzaXplTW9kZSIsIlNpemVNb2RlIiwiQ1VTVE9NIiwiUHJvZ3Jlc3NCYXIiLCJiYXJTcHJpdGUiLCJtb2RlIiwiTW9kZSIsIkhPUklaT05UQUwiLCJ0b3RhbExlbmd0aCIsImNvbXBfYmFyX2xhYmVsIiwidGV4dF9jb2xvciIsImxpbmVfY29sb3IiLCJwcm9ncmVzcyIsImxheV90aXBzIiwiZ2V0Q29udGVudFNpemUiLCJncmFwaGljc19jcCIsIkdyYXBoaWNzIiwiY2xlYXIiLCJmaWxsQ29sb3IiLCJyZWN0IiwiZmlsbCIsImVuYWJsZSIsInRpcHNfdGV4dCIsImV4dF9kYXRhIiwiZXh0IiwiaSIsInYiLCJrZXkiLCJ2YWwiLCJnZXREYXRhIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLFFBQVEsR0FBR0MsT0FBTyxDQUFDLFVBQUQsQ0FBdEI7O0FBQ0EsSUFBSUMsU0FBUyxHQUFHRCxPQUFPLENBQUMsWUFBRCxDQUF2Qjs7QUFDQSxJQUFJRSxhQUFhLEdBQUdGLE9BQU8sQ0FBQyxnQkFBRCxDQUEzQjs7QUFFQSxJQUFJRyxjQUFjLEdBQUdDLEVBQUUsQ0FBQ0MsS0FBSCxDQUFTO0FBQzFCLGFBQVNDLFNBRGlCO0FBRTFCQyxFQUFBQSxJQUFJLEVBQUUsZ0JBQVk7QUFDZCxTQUFLQyxZQUFMLEdBQW9CLEtBQXBCO0FBQ0EsU0FBS0MsVUFBTCxHQUFrQlYsUUFBUSxDQUFDVyxhQUFULENBQXVCLE1BQXZCLEVBQStCLHNCQUEvQixDQUFsQjs7QUFDQSxRQUFJQyxpQkFBaUIsR0FBR1gsT0FBTyxDQUFDLGlCQUFELENBQS9COztBQUNBLFNBQUtZLElBQUwsR0FBWUQsaUJBQWlCLENBQUNFLFdBQWxCLEVBQVo7QUFDQSxTQUFLQyxLQUFMLEdBQWEsS0FBS0YsSUFBTCxDQUFVRyxRQUFWLEVBQWI7QUFDQSxTQUFLQyxPQUFMLEdBQWUsSUFBZixDQU5jLENBTU07QUFDdkIsR0FUeUI7QUFXMUI7QUFDQUMsRUFBQUEsVUFBVSxFQUFDLHNCQUFVO0FBQ2pCLFNBQUtDLEtBQUwsR0FBYSxDQUFiO0FBQ0EsU0FBS0MsSUFBTCxHQUFZLElBQVo7QUFDQSxTQUFLQyxFQUFMLEdBQVUsSUFBVjtBQUNBLFNBQUtDLGVBQUwsR0FBdUIsSUFBdkIsQ0FKaUIsQ0FJc0I7O0FBQ3ZDLFNBQUtDLFlBQUwsR0FBb0IsS0FBcEI7QUFDQSxTQUFLQyxPQUFMLEdBQWUsSUFBZjtBQUNBLFNBQUtDLFdBQUwsR0FBbUIsSUFBbkI7QUFDQSxTQUFLQyxZQUFMLEdBQW9CLElBQXBCO0FBQ0EsU0FBS0MsTUFBTCxHQUFjLElBQWQsQ0FUaUIsQ0FTbUI7QUFDdkMsR0F0QnlCO0FBd0IxQjtBQUNBQyxFQUFBQSxTQUFTLEVBQUMscUJBQVU7QUFDaEIsUUFBSSxLQUFLQyxPQUFULEVBQWtCO0FBQ2QsV0FBS0MsV0FBTCxDQUFpQixLQUFLRCxPQUFMLENBQWFFLENBQTlCLEVBQWdDLEtBQUtGLE9BQUwsQ0FBYUcsQ0FBN0M7QUFDQSxXQUFLSCxPQUFMLEdBQWUsSUFBZjtBQUNIOztBQUVELFFBQUcsS0FBS1YsS0FBUixFQUFjO0FBQ1YsV0FBS2MsUUFBTCxDQUFjZCxLQUFkLEdBQXNCLEtBQUtBLEtBQTNCO0FBQ0g7O0FBRUQsU0FBS2UsWUFBTCxHQUEwQixLQUFLQyxTQUFMLENBQWUsV0FBZixDQUExQjtBQUNBLFNBQUtDLGtCQUFMLEdBQTBCLEtBQUtELFNBQUwsQ0FBZSxpQkFBZixDQUExQjtBQUNBLFNBQUtFLFlBQUwsR0FBMEIsS0FBS0YsU0FBTCxDQUFlLFdBQWYsQ0FBMUI7QUFDQSxTQUFLRyxZQUFMLEdBQTBCLEtBQUtILFNBQUwsQ0FBZSxXQUFmLEVBQTRCOUIsRUFBRSxDQUFDa0MsTUFBL0IsQ0FBMUI7QUFDQSxTQUFLQyxZQUFMLEdBQTBCLEtBQUtMLFNBQUwsQ0FBZSxXQUFmLENBQTFCO0FBQ0EsU0FBS00sWUFBTCxHQUEwQixLQUFLTixTQUFMLENBQWUsV0FBZixFQUE0QjlCLEVBQUUsQ0FBQ2tDLE1BQS9CLENBQTFCO0FBQ0EsU0FBS0csYUFBTCxHQUEwQixLQUFLUCxTQUFMLENBQWUsWUFBZixFQUE2QjlCLEVBQUUsQ0FBQ2tDLE1BQWhDLENBQTFCO0FBQ0EsU0FBS0ksUUFBTCxHQUEwQixLQUFLUixTQUFMLENBQWUsT0FBZixFQUF3QjlCLEVBQUUsQ0FBQ3VDLEtBQTNCLENBQTFCO0FBQ0EsU0FBS0MsUUFBTCxHQUEwQixLQUFLVixTQUFMLENBQWUsT0FBZixDQUExQjtBQUNBLFNBQUtXLGNBQUwsR0FBMEIsS0FBS1gsU0FBTCxDQUFlLGFBQWYsQ0FBMUI7QUFDQSxTQUFLWSxZQUFMLEdBQTBCLEtBQUtaLFNBQUwsQ0FBZSxXQUFmLENBQTFCO0FBQ0EsU0FBS2EsWUFBTCxHQUEwQixLQUFLYixTQUFMLENBQWUsV0FBZixFQUE0QjlCLEVBQUUsQ0FBQ2tDLE1BQS9CLENBQTFCO0FBQ0EsU0FBS1UsV0FBTCxHQUEwQixLQUFLZCxTQUFMLENBQWUsVUFBZixDQUExQjtBQUNBLFNBQUtlLFlBQUwsR0FBMEIsS0FBS2YsU0FBTCxDQUFlLFdBQWYsQ0FBMUI7QUFDQSxTQUFLZ0IsVUFBTCxHQUEwQixLQUFLaEIsU0FBTCxDQUFlLFNBQWYsQ0FBMUI7QUFDQSxTQUFLaUIsVUFBTCxHQUEwQixLQUFLakIsU0FBTCxDQUFlLFNBQWYsRUFBeUI5QixFQUFFLENBQUNrQyxNQUE1QixDQUExQjtBQUdBLFNBQUtFLFlBQUwsQ0FBa0JZLFdBQWxCLEdBQWdDLElBQWhDO0FBQ0EsU0FBS1YsUUFBTCxDQUFjVyxNQUFkLEdBQXVCLEVBQXZCO0FBRUEsU0FBS0wsV0FBTCxDQUFpQk0sTUFBakIsR0FBMEIsS0FBS0MsVUFBTCxJQUFtQixLQUE3Qzs7QUFFQSxRQUFJLEtBQUtwQyxJQUFULEVBQWU7QUFDWCxXQUFLcUMsT0FBTCxDQUFhLEtBQUtyQyxJQUFsQjtBQUNILEtBRkQsTUFFTSxJQUFHLEtBQUtDLEVBQUwsSUFBUyxJQUFaLEVBQWlCO0FBQ25CLFdBQUtxQyxXQUFMLENBQWlCLEtBQUtyQyxFQUF0QjtBQUNIO0FBQ0osR0EvRHlCO0FBaUUxQjtBQUNBc0MsRUFBQUEsYUFBYSxFQUFDLHlCQUFXLENBRXhCLENBcEV5QjtBQXNFMUI7QUFDQUMsRUFBQUEsTUFBTSxFQUFDLGdCQUFTQyxNQUFULEVBQWdCO0FBQ25CLFFBQUksS0FBSzVCLFFBQUwsSUFBaUIsQ0FBQyxLQUFLNkIsV0FBM0IsRUFBd0M7QUFDcEMsV0FBSzdCLFFBQUwsQ0FBYzhCLEVBQWQsQ0FBaUIxRCxFQUFFLENBQUMyRCxJQUFILENBQVFDLFNBQVIsQ0FBa0JDLFNBQW5DLEVBQThDLEtBQUtDLGNBQW5ELEVBQW1FLElBQW5FO0FBQ0EsV0FBS2xDLFFBQUwsQ0FBYzhCLEVBQWQsQ0FBaUIxRCxFQUFFLENBQUMyRCxJQUFILENBQVFDLFNBQVIsQ0FBa0JHLFdBQW5DLEVBQWdELEtBQUtELGNBQXJELEVBQXFFLElBQXJFO0FBQ0EsV0FBS2xDLFFBQUwsQ0FBYzhCLEVBQWQsQ0FBaUIxRCxFQUFFLENBQUMyRCxJQUFILENBQVFDLFNBQVIsQ0FBa0JJLFlBQW5DLEVBQWlELEtBQUtGLGNBQXRELEVBQXNFLElBQXRFO0FBQ0EsV0FBS0wsV0FBTCxHQUFtQixJQUFuQjtBQUNIO0FBQ0osR0E5RXlCO0FBZ0YxQjtBQUNBUSxFQUFBQSxNQUFNLEVBQUMsa0JBQVUsQ0FFaEIsQ0FuRnlCO0FBcUYxQjtBQUNBQyxFQUFBQSxRQUFRLEVBQUMsb0JBQVU7QUFDZixTQUFLQyxXQUFMOztBQUNBLFFBQUcsS0FBS2xDLFlBQVIsRUFBcUI7QUFDakIsV0FBS0EsWUFBTCxDQUFrQmUsV0FBbEIsR0FBZ0MsSUFBaEM7QUFDSDs7QUFFRCxRQUFJLEtBQUtwQixRQUFMLElBQWlCLEtBQUs2QixXQUExQixFQUF1QztBQUNuQyxXQUFLN0IsUUFBTCxDQUFjd0MsR0FBZCxDQUFrQnBFLEVBQUUsQ0FBQzJELElBQUgsQ0FBUUMsU0FBUixDQUFrQkMsU0FBcEMsRUFBK0MsS0FBS0MsY0FBcEQsRUFBb0UsSUFBcEU7QUFDQSxXQUFLbEMsUUFBTCxDQUFjd0MsR0FBZCxDQUFrQnBFLEVBQUUsQ0FBQzJELElBQUgsQ0FBUUMsU0FBUixDQUFrQkcsV0FBcEMsRUFBaUQsS0FBS0QsY0FBdEQsRUFBc0UsSUFBdEU7QUFDQSxXQUFLbEMsUUFBTCxDQUFjd0MsR0FBZCxDQUFrQnBFLEVBQUUsQ0FBQzJELElBQUgsQ0FBUUMsU0FBUixDQUFrQkksWUFBcEMsRUFBa0QsS0FBS0YsY0FBdkQsRUFBdUUsSUFBdkU7QUFDQSxXQUFLTCxXQUFMLEdBQW1CLEtBQW5CO0FBQ0g7O0FBQ0RZLElBQUFBLFNBQVMsQ0FBQzVELFdBQVYsR0FBd0I2RCxTQUF4QixDQUFrQyxJQUFsQztBQUVILEdBcEd5QjtBQXNHMUJDLEVBQUFBLFdBQVcsRUFBRSxxQkFBU0MsUUFBVCxFQUFtQjtBQUM1QixTQUFLQSxRQUFMLEdBQWdCQSxRQUFoQjtBQUNILEdBeEd5QjtBQTBHMUJDLEVBQUFBLFVBQVUsRUFBRSxvQkFBU0MsUUFBVCxFQUFtQjtBQUMzQixTQUFLQSxRQUFMLEdBQWdCQSxRQUFoQjtBQUNILEdBNUd5QjtBQThHMUJaLEVBQUFBLGNBQWMsRUFBRSx3QkFBU2EsS0FBVCxFQUFnQjtBQUM1QixRQUFJQyxXQUFXLEdBQUcsSUFBbEI7O0FBQ0EsUUFBSSxLQUFLQyxTQUFMLElBQWtCaEYsU0FBUyxDQUFDaUYsa0JBQVYsQ0FBNkJDLFVBQW5ELEVBQStEO0FBQzNELFVBQUksQ0FBQyxLQUFLaEUsSUFBVixFQUNJNkQsV0FBVyxHQUFHLEtBQWQ7QUFDUDs7QUFFRCxRQUFJRCxLQUFLLENBQUNLLElBQU4sS0FBZWhGLEVBQUUsQ0FBQzJELElBQUgsQ0FBUUMsU0FBUixDQUFrQkcsV0FBckMsRUFBa0Q7QUFDOUMsVUFBRyxLQUFLekMsTUFBUixFQUFlO0FBQ1gsYUFBS00sUUFBTCxDQUFjZCxLQUFkLEdBQXNCLENBQUMsS0FBS0EsS0FBTCxJQUFjLENBQWYsSUFBb0IsR0FBMUM7QUFDSDs7QUFDRCxVQUFJLEtBQUs0RCxRQUFMLElBQWlCRSxXQUFyQixFQUNJLEtBQUtGLFFBQUwsQ0FBYyxJQUFkO0FBQ1A7O0FBRUQsUUFBSUMsS0FBSyxDQUFDSyxJQUFOLEtBQWVoRixFQUFFLENBQUMyRCxJQUFILENBQVFDLFNBQVIsQ0FBa0JJLFlBQXJDLEVBQW1EO0FBQy9DLFVBQUcsS0FBSzFDLE1BQVIsRUFBZTtBQUNYLGFBQUtNLFFBQUwsQ0FBY2QsS0FBZCxHQUFzQixLQUFLQSxLQUFMLElBQWMsQ0FBcEM7QUFDSDtBQUNKOztBQUVELFFBQUk2RCxLQUFLLENBQUNLLElBQU4sS0FBZWhGLEVBQUUsQ0FBQzJELElBQUgsQ0FBUUMsU0FBUixDQUFrQkMsU0FBckMsRUFBZ0Q7QUFDNUMsVUFBRyxLQUFLdkMsTUFBUixFQUFlO0FBQ1gsYUFBS00sUUFBTCxDQUFjZCxLQUFkLEdBQXNCLEtBQUtBLEtBQUwsSUFBYyxDQUFwQztBQUNIOztBQUNELFVBQUksS0FBSzBELFFBQUwsSUFBaUJJLFdBQXJCLEVBQWtDO0FBQzlCSyxRQUFBQSxLQUFLLENBQUNDLGVBQU4sQ0FBc0IsQ0FBdEI7QUFDQSxhQUFLVixRQUFMLENBQWMsSUFBZDtBQUNIO0FBQ0o7QUFDSixHQTVJeUI7QUE2STFCVyxFQUFBQSxlQTdJMEIsMkJBNklWQyxNQTdJVSxFQTZJSDtBQUNuQixTQUFLOUQsTUFBTCxHQUFjOEQsTUFBZDtBQUNILEdBL0l5QjtBQWdKMUJDLEVBQUFBLGFBQWEsRUFBRSx1QkFBU0MsV0FBVCxFQUFzQjtBQUNqQyxRQUFJLENBQUNBLFdBQUwsRUFBa0I7QUFDbEIsU0FBS3hFLEtBQUwsR0FBYXdFLFdBQVcsQ0FBQ3hFLEtBQVosSUFBcUIsQ0FBbEM7QUFDQSxTQUFLeUUsU0FBTCxHQUFpQkQsV0FBVyxDQUFDQyxTQUFaLElBQXlCLEtBQTFDO0FBQ0EsU0FBS1YsU0FBTCxHQUFpQlMsV0FBVyxDQUFDVCxTQUFaLElBQXlCaEYsU0FBUyxDQUFDaUYsa0JBQVYsQ0FBNkJVLEtBQXZFO0FBQ0EsU0FBS0MsVUFBTCxHQUFrQkgsV0FBVyxDQUFDRyxVQUFaLElBQTBCLElBQTVDO0FBQ0EsU0FBS0MsV0FBTCxHQUFtQkosV0FBVyxDQUFDSSxXQUFaLElBQTJCLENBQTlDO0FBQ0EsU0FBS0MsU0FBTCxHQUFpQkwsV0FBVyxDQUFDSyxTQUFaLElBQXlCLEtBQTFDO0FBQ0gsR0F4SnlCO0FBMEoxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0F0QyxFQUFBQSxXQUFXLEVBQUMscUJBQVNyQyxFQUFULEVBQVk7QUFDcEIsU0FBS0EsRUFBTCxHQUFVQSxFQUFWO0FBQ0EsUUFBRyxDQUFDLEtBQUtZLFFBQVQsRUFBa0I7QUFDbEJaLElBQUFBLEVBQUUsR0FBR0EsRUFBRSxJQUFJLENBQVg7QUFDQSxRQUFJNEUsTUFBTSxHQUFHWCxLQUFLLENBQUNZLGFBQU4sQ0FBb0I3RSxFQUFwQixDQUFiOztBQUNBLFFBQUc0RSxNQUFNLElBQUksSUFBYixFQUFrQjtBQUNkLFdBQUs1RCxZQUFMLENBQWtCa0IsTUFBbEIsR0FBMEIsS0FBMUI7QUFDQSxXQUFLbkIsa0JBQUwsQ0FBd0JtQixNQUF4QixHQUFpQyxLQUFqQztBQUNBLFdBQUtaLFFBQUwsQ0FBY1csTUFBZCxHQUF1QixFQUF2QjtBQUNBLFVBQUk2QyxjQUFjLEdBQUduRyxRQUFRLENBQUNvRyxnQkFBVCxDQUEwQixDQUExQixDQUFyQjtBQUNBLFVBQUlDLGVBQWUsR0FBR3JHLFFBQVEsQ0FBQ3NHLGlCQUFULENBQTJCSCxjQUEzQixDQUF0QjtBQUNBLFdBQUtJLE9BQUwsQ0FBYUYsZUFBYixFQUE4QixVQUFTRyxNQUFULEVBQWdCO0FBQzFDLGFBQUs5RCxhQUFMLENBQW1CVyxXQUFuQixHQUFpQ21ELE1BQWpDO0FBQ0gsT0FGNkIsQ0FFNUJDLElBRjRCLENBRXZCLElBRnVCLENBQTlCOztBQUlBLFVBQUcsS0FBS2pFLFlBQVIsRUFBcUI7QUFDakIsYUFBS0EsWUFBTCxDQUFrQmUsTUFBbEIsR0FBMkIsS0FBM0I7QUFDSDtBQUNKLEtBYkQsTUFhSztBQUNELFdBQUtsQixZQUFMLENBQWtCa0IsTUFBbEIsR0FBMEIsSUFBMUI7QUFDQSxXQUFLbkIsa0JBQUwsQ0FBd0JtQixNQUF4QixHQUFpQyxJQUFqQztBQUVBLFVBQUltRCxVQUFVLEdBQUdULE1BQU0sQ0FBQ1UsUUFBeEI7O0FBQ0EsVUFBR0QsVUFBSCxFQUFjO0FBQ1YsWUFBSUUsY0FBYyxHQUFHdEIsS0FBSyxDQUFDWSxhQUFOLENBQW9CUSxVQUFwQixDQUFyQjs7QUFDQSxZQUFHRSxjQUFILEVBQWtCO0FBQ2Q7QUFDQSxjQUFJQyxhQUFhLEdBQUc3RyxRQUFRLENBQUM4RyxVQUFULENBQW9CRixjQUFjLENBQUNHLFNBQW5DLENBQXBCO0FBQ0EsZUFBS1IsT0FBTCxDQUFhTSxhQUFiLEVBQTRCLFVBQVNHLE9BQVQsRUFBa0I7QUFDMUMsaUJBQUsxRSxZQUFMLENBQWtCZSxXQUFsQixHQUFnQzJELE9BQWhDO0FBQ0gsV0FGMkIsQ0FFMUJQLElBRjBCLENBRXJCLElBRnFCLENBQTVCLEVBSGMsQ0FPZDs7QUFDQSxjQUFJTixjQUFjLEdBQUduRyxRQUFRLENBQUNvRyxnQkFBVCxDQUEwQlEsY0FBYyxDQUFDSyxJQUF6QyxDQUFyQjtBQUNBLGNBQUlaLGVBQWUsR0FBR3JHLFFBQVEsQ0FBQ3NHLGlCQUFULENBQTJCSCxjQUEzQixDQUF0QjtBQUNBLGVBQUtJLE9BQUwsQ0FBYUYsZUFBYixFQUE4QixVQUFTRyxNQUFULEVBQWdCO0FBQzFDLGlCQUFLOUQsYUFBTCxDQUFtQlcsV0FBbkIsR0FBaUNtRCxNQUFqQztBQUNILFdBRjZCLENBRTVCQyxJQUY0QixDQUV2QixJQUZ1QixDQUE5QixFQVZjLENBY2Q7O0FBQ0EsY0FBSVMsUUFBUSxHQUFHbEgsUUFBUSxDQUFDbUgsY0FBVCxDQUF3QlAsY0FBYyxDQUFDUSxTQUF2QyxDQUFmO0FBQ0EsY0FBSWYsZUFBZSxHQUFHckcsUUFBUSxDQUFDcUgsYUFBVCxDQUF1QixRQUF2QixFQUFpQ0gsUUFBakMsQ0FBdEI7QUFDQSxlQUFLWCxPQUFMLENBQWFGLGVBQWIsRUFBOEIsVUFBU0csTUFBVCxFQUFnQjtBQUMxQyxpQkFBSy9ELFlBQUwsQ0FBa0JZLFdBQWxCLEdBQWdDbUQsTUFBaEM7QUFDSCxXQUY2QixDQUU1QkMsSUFGNEIsQ0FFdkIsSUFGdUIsQ0FBOUIsRUFqQmMsQ0FxQmQ7O0FBQ0EsZUFBS2EsV0FBTCxDQUFpQlYsY0FBYyxDQUFDSyxJQUFoQyxFQXRCYyxDQXVCZDs7QUFDQSxlQUFLdEUsUUFBTCxDQUFjVyxNQUFkLEdBQXVCc0QsY0FBYyxDQUFDVyxHQUFmLENBQW1CQyxRQUFuQixFQUF2QjtBQUNIO0FBQ0o7QUFDSjtBQUNKLEdBcE55QjtBQXFOMUI7QUFDQUMsRUFBQUEsVUF0TjBCLHNCQXNOZlYsU0F0TmUsRUFzTkw7QUFDakIsUUFBSUYsYUFBYSxHQUFHN0csUUFBUSxDQUFDOEcsVUFBVCxDQUFvQkMsU0FBcEIsQ0FBcEI7QUFDQSxTQUFLUixPQUFMLENBQWFNLGFBQWIsRUFBNEIsVUFBU0csT0FBVCxFQUFrQjtBQUMxQyxXQUFLMUUsWUFBTCxDQUFrQmUsV0FBbEIsR0FBZ0MyRCxPQUFoQztBQUNILEtBRjJCLENBRTFCUCxJQUYwQixDQUVyQixJQUZxQixDQUE1QjtBQUdILEdBM055QjtBQTROMUI7QUFDQWlCLEVBQUFBLGFBN04wQix5QkE2TlpDLE9BN05ZLEVBNk5KO0FBQ2xCLFFBQUl4QixjQUFjLEdBQUduRyxRQUFRLENBQUNvRyxnQkFBVCxDQUEwQnVCLE9BQTFCLENBQXJCO0FBQ0EsUUFBSXRCLGVBQWUsR0FBR3JHLFFBQVEsQ0FBQ3NHLGlCQUFULENBQTJCSCxjQUEzQixDQUF0QjtBQUNBLFNBQUtJLE9BQUwsQ0FBYUYsZUFBYixFQUE4QixVQUFTRyxNQUFULEVBQWdCO0FBQzFDLFdBQUs5RCxhQUFMLENBQW1CVyxXQUFuQixHQUFpQ21ELE1BQWpDO0FBQ0gsS0FGNkIsQ0FFNUJDLElBRjRCLENBRXZCLElBRnVCLENBQTlCO0FBR0gsR0FuT3lCO0FBb08xQjtBQUNBbUIsRUFBQUEsVUFyTzBCLHNCQXFPZlIsU0FyT2UsRUFxT0w7QUFDakIsUUFBSUYsUUFBUSxHQUFHbEgsUUFBUSxDQUFDbUgsY0FBVCxDQUF3QkMsU0FBeEIsQ0FBZjtBQUNBLFFBQUlmLGVBQWUsR0FBR3JHLFFBQVEsQ0FBQ3FILGFBQVQsQ0FBdUIsUUFBdkIsRUFBaUNILFFBQWpDLENBQXRCO0FBQ0EsU0FBS1gsT0FBTCxDQUFhRixlQUFiLEVBQThCLFVBQVNHLE1BQVQsRUFBZ0I7QUFDMUMsV0FBSy9ELFlBQUwsQ0FBa0JZLFdBQWxCLEdBQWdDbUQsTUFBaEM7QUFDSCxLQUY2QixDQUU1QkMsSUFGNEIsQ0FFdkIsSUFGdUIsQ0FBOUI7QUFHSCxHQTNPeUI7QUE0TzFCO0FBQ0FvQixFQUFBQSxNQTdPMEIsa0JBNk9uQk4sR0E3T21CLEVBNk9mO0FBQ1AsU0FBSzVFLFFBQUwsQ0FBY1csTUFBZCxHQUF1QmlFLEdBQUcsQ0FBQ0MsUUFBSixFQUF2QjtBQUNILEdBL095QjtBQWdQMUJNLEVBQUFBLElBaFAwQixrQkFnUHBCO0FBQ0YsU0FBS0MsWUFBTCxDQUFrQixDQUFsQjtBQUNBLFNBQUtsRyxPQUFMLEdBQWUsSUFBZjtBQUNBLFNBQUtDLFdBQUwsQ0FBaUIsQ0FBakIsRUFBbUIsQ0FBbkI7QUFDQSxTQUFLMkIsT0FBTCxDQUFhLElBQWI7QUFDQSxTQUFLaUMsYUFBTCxDQUFtQixFQUFuQjtBQUNBLFNBQUtzQyxhQUFMLEdBQXFCLElBQXJCO0FBQ0EsU0FBS0MsWUFBTCxDQUFrQixLQUFsQixFQVBFLENBUUY7O0FBQ0EsU0FBS0MsWUFBTCxDQUFrQixLQUFsQjs7QUFDQSxRQUFHLEtBQUtDLEtBQVIsRUFBYztBQUNWLFdBQUtBLEtBQUwsQ0FBV0MsSUFBWCxDQUFnQjdFLE1BQWhCLEdBQXlCLEtBQXpCO0FBQ0g7O0FBQ0QsUUFBRyxLQUFLOEUsT0FBUixFQUFnQjtBQUNaLFdBQUtBLE9BQUwsQ0FBYTlFLE1BQWIsR0FBc0IsS0FBdEI7QUFDSDs7QUFDRCxRQUFHLEtBQUsrRSxTQUFSLEVBQWtCO0FBQ2QsV0FBS0EsU0FBTCxDQUFlRixJQUFmLENBQW9CN0UsTUFBcEIsR0FBNkIsS0FBN0I7QUFDSDs7QUFDRCxTQUFLZ0YsWUFBTCxDQUFrQixLQUFsQjtBQUNBLFNBQUtDLFdBQUwsQ0FBaUIsS0FBakI7O0FBQ0EsUUFBRyxLQUFLQyxRQUFSLEVBQWlCO0FBQ2IsV0FBS0EsUUFBTCxDQUFjTCxJQUFkLENBQW1CN0UsTUFBbkIsR0FBNEIsS0FBNUI7QUFDSDs7QUFDRCxTQUFLbUYsV0FBTCxDQUFpQixLQUFqQjtBQUNBLFNBQUtDLFdBQUwsQ0FBaUIsS0FBakI7O0FBQ0EsUUFBRyxLQUFLOUYsUUFBUixFQUFpQjtBQUNiLFdBQUtBLFFBQUwsQ0FBY1UsTUFBZCxHQUF1QixLQUF2QjtBQUNIOztBQUVELFNBQUs3QixZQUFMLEdBQW9CLElBQXBCO0FBQ0EsU0FBS2tILFdBQUwsR0FBbUIsS0FBbkI7QUFDQSxTQUFLdkgsRUFBTCxHQUFVLElBQVY7QUFDQSxTQUFLQyxlQUFMLEdBQXVCLElBQXZCLENBakNFLENBaUNxQzs7QUFDdkMsU0FBS0MsWUFBTCxHQUFvQixLQUFwQjtBQUNBLFNBQUtDLE9BQUwsR0FBZSxJQUFmO0FBQ0EsU0FBS0MsV0FBTCxHQUFtQixJQUFuQjtBQUNBLFNBQUtFLE1BQUwsR0FBYyxJQUFkO0FBQ0EsU0FBS2lELFdBQUwsQ0FBaUIsSUFBakI7QUFDQSxTQUFLRSxVQUFMLENBQWdCLElBQWhCOztBQUNBLFFBQUcsS0FBSzNCLFVBQVIsRUFBbUI7QUFDZixXQUFLQSxVQUFMLENBQWdCSSxNQUFoQixHQUF5QixLQUF6QjtBQUNIOztBQUNELFFBQUcsS0FBS3NGLFdBQVIsRUFBb0I7QUFDaEIsV0FBS0EsV0FBTCxHQUFtQixJQUFuQjtBQUNIOztBQUNELFFBQUcsS0FBS3hHLFlBQVIsRUFBcUI7QUFDakIsV0FBS0EsWUFBTCxDQUFrQmtCLE1BQWxCLEdBQTJCLElBQTNCO0FBQ0g7O0FBQ0QsUUFBRyxLQUFLdEIsUUFBUixFQUFpQjtBQUNicUQsTUFBQUEsS0FBSyxDQUFDd0QsaUJBQU4sQ0FBd0IsS0FBSzdHLFFBQTdCLEVBQXNDLEtBQXRDO0FBQ0g7QUFDSixHQXBTeUI7QUFxUzFCd0IsRUFBQUEsT0FBTyxFQUFFLGlCQUFTckMsSUFBVCxFQUFlO0FBQ3BCLFFBQUksS0FBS0EsSUFBTCxJQUFZLEtBQUsySCxpQkFBckIsRUFBd0M7QUFDcEMsV0FBSzNILElBQUwsQ0FBVTRILE1BQVYsQ0FBaUIsS0FBS0QsaUJBQXRCO0FBQ0EsV0FBS0EsaUJBQUwsR0FBeUIsSUFBekI7QUFDSDs7QUFFRCxTQUFLM0gsSUFBTCxHQUFZQSxJQUFaOztBQUNBLFFBQUksS0FBS2EsUUFBVCxFQUFtQjtBQUNmLFVBQUksQ0FBQ2IsSUFBTCxFQUFXO0FBQ1AsYUFBS2lCLFlBQUwsQ0FBa0JrQixNQUFsQixHQUEyQixLQUEzQjtBQUNBLGFBQUtqQixZQUFMLENBQWtCZSxXQUFsQixHQUFnQyxJQUFoQztBQUNBLGFBQUtqQixrQkFBTCxDQUF3Qm1CLE1BQXhCLEdBQWlDLEtBQWpDO0FBQ0EsYUFBS1osUUFBTCxDQUFjVyxNQUFkLEdBQXVCLEVBQXZCO0FBQ0EsYUFBS2IsWUFBTCxDQUFrQlksV0FBbEIsR0FBZ0MsSUFBaEM7QUFDQSxZQUFJOEMsY0FBYyxHQUFHLEtBQUs2QixhQUFMLEdBQXFCaEksUUFBUSxDQUFDb0csZ0JBQVQsQ0FBMEIsQ0FBMUIsQ0FBMUM7QUFDQSxZQUFJQyxlQUFlLEdBQUdyRyxRQUFRLENBQUNzRyxpQkFBVCxDQUEyQkgsY0FBM0IsQ0FBdEI7QUFDQSxhQUFLSSxPQUFMLENBQWFGLGVBQWIsRUFBOEIsVUFBU0csTUFBVCxFQUFnQjtBQUMxQyxlQUFLOUQsYUFBTCxDQUFtQlcsV0FBbkIsR0FBaUNtRCxNQUFqQztBQUNILFNBRjZCLENBRTVCQyxJQUY0QixDQUV2QixJQUZ1QixDQUE5Qjs7QUFHQSxZQUFHLEtBQUt0RCxVQUFMLENBQWdCSSxNQUFuQixFQUEwQjtBQUN0QixlQUFLSixVQUFMLENBQWdCSSxNQUFoQixHQUF5QixLQUF6QjtBQUNIO0FBQ0osT0FkRCxNQWNPO0FBQ0gsYUFBS2xCLFlBQUwsQ0FBa0JrQixNQUFsQixHQUEyQixJQUEzQjtBQUNBLGFBQUtuQixrQkFBTCxDQUF3Qm1CLE1BQXhCLEdBQWlDLElBQWpDO0FBQ0g7O0FBQ0QsV0FBS3dFLFlBQUwsQ0FBa0IsS0FBSzVHLEtBQXZCO0FBQ0EsV0FBSzhILFlBQUwsQ0FBa0I3SCxJQUFsQjtBQUNIOztBQUFBO0FBQ0QsUUFBSSxLQUFLQSxJQUFMLElBQWEsS0FBS0EsSUFBTCxDQUFVOEgsbUJBQTNCLEVBQ0ksS0FBS0MsY0FBTDtBQUNQLEdBcFV5QjtBQXNVMUJGLEVBQUFBLFlBQVksRUFBRSxzQkFBU0csSUFBVCxFQUFlO0FBQ3pCLFFBQUksQ0FBQ0EsSUFBTCxFQUFXO0FBQ1AsV0FBS1osV0FBTCxDQUFpQixLQUFqQjtBQUNBO0FBQ0g7O0FBQ0QsUUFBSXBILElBQUksR0FBR2dJLElBQVg7O0FBQ0EsUUFBSSxPQUFPQSxJQUFQLElBQWUsUUFBbkIsRUFBNkI7QUFDekJoSSxNQUFBQSxJQUFJLEdBQUdpSSxNQUFNLENBQUNDLFlBQVAsQ0FBb0JDLGlCQUFwQixDQUFzQ25JLElBQXRDLENBQVA7QUFDQSxVQUFJLENBQUNBLElBQUwsRUFBVztBQUNkLEtBSEQsTUFHTztBQUNILFVBQUlnSSxJQUFJLENBQUNoSSxJQUFULEVBQ0lBLElBQUksR0FBR2dJLElBQUksQ0FBQ2hJLElBQVo7QUFDUDs7QUFDRCxRQUFJLENBQUNBLElBQUQsSUFBU0EsSUFBSSxDQUFDb0ksR0FBTCxLQUFhQyxTQUExQixFQUFxQztBQUVyQyxRQUFJeEMsSUFBSSxHQUFHN0YsSUFBSSxDQUFDNkYsSUFBTCxJQUFhN0YsSUFBSSxDQUFDc0ksU0FBN0IsQ0FmeUIsQ0FnQnpCOztBQUNBLFNBQUt6SCxRQUFMLENBQWMwSCxJQUFkLEdBQXFCLFNBQVMsR0FBVCxHQUFldkksSUFBSSxDQUFDb0ksR0FBekMsQ0FqQnlCLENBbUJ6Qjs7QUFDQSxTQUFLSSxjQUFMLEdBQXNCLElBQXRCO0FBQ0EsUUFBSS9DLGFBQWEsR0FBRyxJQUFwQjs7QUFDQSxRQUFJekYsSUFBSSxDQUFDb0ksR0FBTCxLQUFhLENBQWpCLEVBQW9CO0FBQ2hCLFVBQUksS0FBS0ssWUFBVCxFQUFzQjtBQUNsQmhELFFBQUFBLGFBQWEsR0FBRyxLQUFLZ0QsWUFBckI7QUFDSCxPQUZELE1BRU0sSUFBR3pJLElBQUksQ0FBQzBJLElBQVIsRUFBYTtBQUNmakQsUUFBQUEsYUFBYSxHQUFHN0csUUFBUSxDQUFDK0osV0FBVCxDQUFxQixNQUFyQixFQUE2QjNJLElBQUksQ0FBQzBJLElBQWxDLENBQWhCO0FBQ0g7QUFDSixLQU5ELE1BTU87QUFDSCxVQUFJRSxRQUFRLEdBQUcsS0FBS0MsV0FBTCxDQUFpQmIsSUFBakIsQ0FBZjs7QUFDQSxVQUFHWSxRQUFRLElBQUksSUFBWixJQUFvQkEsUUFBUSxJQUFJLENBQW5DLEVBQXFDO0FBQ2pDLFlBQUlFLFdBQVcsR0FBR2IsTUFBTSxDQUFDYyxpQkFBUCxDQUF5QkMsY0FBekIsQ0FBd0NKLFFBQXhDLENBQWxCOztBQUNBLFlBQUdFLFdBQUgsRUFBZTtBQUNYckQsVUFBQUEsYUFBYSxHQUFHN0csUUFBUSxDQUFDOEcsVUFBVCxDQUFvQm9ELFdBQVcsQ0FBQ0csT0FBaEMsQ0FBaEI7QUFDSDtBQUNKLE9BTEQsTUFLSztBQUNELFlBQUlDLFFBQVEsR0FBR2xKLElBQUksQ0FBQ29JLEdBQUwsR0FBVyxHQUFYLEdBQWlCdkMsSUFBaEM7QUFDQSxZQUFJc0QsUUFBUSxHQUFHQyxLQUFLLENBQUMsY0FBRCxFQUFpQixtQkFBakIsRUFBc0NGLFFBQXRDLENBQXBCOztBQUNBLFlBQUlDLFFBQUosRUFBYztBQUNWLGNBQUlFLFlBQVksR0FBR0YsUUFBUSxDQUFDRixPQUE1Qjs7QUFDQSxjQUFJLENBQUMsS0FBS1QsY0FBTixJQUF3QixLQUFLQSxjQUFMLEtBQXdCYSxZQUFwRCxFQUFrRTtBQUM5RCxpQkFBS2IsY0FBTCxHQUFzQmEsWUFBdEI7QUFDQTVELFlBQUFBLGFBQWEsR0FBRzdHLFFBQVEsQ0FBQzhHLFVBQVQsQ0FBb0IsS0FBSzhDLGNBQXpCLENBQWhCLENBRjhELENBRzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0g7QUFDSjtBQUNKO0FBQ0o7O0FBRUQsUUFBSS9DLGFBQUosRUFBbUI7QUFDZixXQUFLTixPQUFMLENBQWFNLGFBQWIsRUFBNEIsVUFBU0csT0FBVCxFQUFrQjtBQUMxQyxZQUFHLEtBQUsvRSxRQUFMLElBQWlCLEtBQUtBLFFBQUwsQ0FBY3lJLE9BQWxDLEVBQTBDO0FBQ3RDLGVBQUtwSSxZQUFMLENBQWtCZSxXQUFsQixHQUFnQzJELE9BQWhDO0FBQ0g7QUFDSixPQUoyQixDQUkxQlAsSUFKMEIsQ0FJckIsSUFKcUIsQ0FBNUI7QUFLSCxLQTFEd0IsQ0E0RHpCOzs7QUFDQSxRQUFJTixjQUFjLEdBQUluRyxRQUFRLENBQUNvRyxnQkFBVCxDQUEwQmEsSUFBSSxHQUFFLENBQWhDLENBQXRCOztBQUNBLFFBQUksQ0FBQyxLQUFLZSxhQUFOLElBQXVCLEtBQUtBLGFBQUwsSUFBc0I3QixjQUFqRCxFQUFpRTtBQUM3RCxXQUFLNkIsYUFBTCxHQUFxQjdCLGNBQXJCO0FBQ0EsVUFBSUUsZUFBZSxHQUFHckcsUUFBUSxDQUFDc0csaUJBQVQsQ0FBMkJILGNBQTNCLENBQXRCO0FBQ0EsV0FBS0ksT0FBTCxDQUFhRixlQUFiLEVBQThCLFVBQVNHLE1BQVQsRUFBZ0I7QUFDMUMsWUFBRyxLQUFLdkUsUUFBTCxJQUFpQixLQUFLQSxRQUFMLENBQWN5SSxPQUFsQyxFQUEwQztBQUN0QyxlQUFLaEksYUFBTCxDQUFtQlcsV0FBbkIsR0FBaUNtRCxNQUFqQztBQUNIO0FBQ0osT0FKNkIsQ0FJNUJDLElBSjRCLENBSXZCLElBSnVCLENBQTlCO0FBS0gsS0F0RXdCLENBd0V6Qjs7O0FBQ0EsUUFBSVcsU0FBSjtBQUNBLFFBQUl1RCxVQUFVLEdBQUd0QixNQUFNLENBQUNDLFlBQVAsQ0FBb0JDLGlCQUFwQixDQUFzQ25JLElBQUksQ0FBQ29JLEdBQTNDLENBQWpCOztBQUNBLFFBQUltQixVQUFKLEVBQWU7QUFDWHZELE1BQUFBLFNBQVMsR0FBR3VELFVBQVUsQ0FBQ3ZELFNBQXZCO0FBQ0g7O0FBQ0QsUUFBR2hHLElBQUksQ0FBQ29JLEdBQUwsSUFBWSxDQUFaLElBQWlCcEksSUFBSSxDQUFDZ0csU0FBekIsRUFBbUM7QUFDL0JBLE1BQUFBLFNBQVMsR0FBR2hHLElBQUksQ0FBQ2dHLFNBQWpCO0FBQ0g7O0FBQ0QsUUFBSUEsU0FBUyxLQUFLLENBQWxCLEVBQXFCO0FBQ2pCLFdBQUs1RSxZQUFMLENBQWtCZSxNQUFsQixHQUEyQixLQUEzQjtBQUNILEtBRkQsTUFFTztBQUNILFVBQUk2RCxTQUFTLElBQUksS0FBSzVFLFlBQXRCLEVBQW9DO0FBQ2hDLGFBQUtBLFlBQUwsQ0FBa0JlLE1BQWxCLEdBQTJCLElBQTNCO0FBQ0EsWUFBSTJELFFBQVEsR0FBR2xILFFBQVEsQ0FBQ21ILGNBQVQsQ0FBd0JDLFNBQXhCLENBQWY7QUFDQSxZQUFJZixlQUFlLEdBQUdyRyxRQUFRLENBQUNxSCxhQUFULENBQXVCLFFBQXZCLEVBQWlDSCxRQUFqQyxDQUF0QjtBQUNBLGFBQUtYLE9BQUwsQ0FBYUYsZUFBYixFQUE4QixVQUFTRyxNQUFULEVBQWdCO0FBQzFDLGNBQUcsS0FBS3ZFLFFBQUwsSUFBaUIsS0FBS0EsUUFBTCxDQUFjeUksT0FBbEMsRUFBMEM7QUFDdEMsaUJBQUtqSSxZQUFMLENBQWtCWSxXQUFsQixHQUFnQ21ELE1BQWhDO0FBQ0g7QUFDSixTQUo2QixDQUk1QkMsSUFKNEIsQ0FJdkIsSUFKdUIsQ0FBOUI7QUFLSDtBQUNKLEtBOUZ3QixDQStGekI7OztBQUNBLFFBQUcsS0FBS21FLFdBQUwsSUFBb0IsSUFBdkIsRUFBNEI7QUFDeEIsV0FBSzNDLFlBQUwsQ0FBa0IsS0FBSzJDLFdBQXZCO0FBQ0gsS0FsR3dCLENBbUd6Qjs7O0FBQ0EsUUFBSSxLQUFLNUUsU0FBVCxFQUFvQjtBQUNoQixXQUFLNUQsa0JBQUwsQ0FBd0JtQixNQUF4QixHQUFpQyxLQUFqQztBQUNILEtBRkQsTUFFTztBQUNILFdBQUtuQixrQkFBTCxDQUF3Qm1CLE1BQXhCLEdBQWlDLElBQWpDO0FBQ0EsV0FBSytELFdBQUwsQ0FBaUJsRyxJQUFJLENBQUM2RixJQUF0QjtBQUNILEtBekd3QixDQTJHekI7OztBQUNBLFFBQUk3RixJQUFJLENBQUNtRyxHQUFULEVBQWM7QUFDVixXQUFLNUUsUUFBTCxDQUFjVyxNQUFkLEdBQXVCbEMsSUFBSSxDQUFDbUcsR0FBNUI7QUFDSCxLQUZELE1BRU87QUFDSCxXQUFLNUUsUUFBTCxDQUFjVyxNQUFkLEdBQXVCLEVBQXZCO0FBQ0gsS0FoSHdCLENBaUh6Qjs7O0FBQ0EsU0FBS3VILGdCQUFMLENBQXNCLElBQXRCOztBQUNBLFFBQUcsS0FBS3JILFVBQUwsSUFBbUIsSUFBdEIsRUFBMkI7QUFDdkIsV0FBSzBFLFlBQUwsQ0FBa0IsS0FBSzFFLFVBQXZCO0FBQ0gsS0FGRCxNQUVLO0FBQ0QsV0FBSzBFLFlBQUwsQ0FBa0IsS0FBbEI7QUFDSDs7QUFDRCxTQUFLckYsUUFBTCxDQUFjVSxNQUFkLEdBQXVCLEtBQXZCOztBQUNBLFFBQUcsS0FBSzRFLEtBQVIsRUFBYztBQUNWLFdBQUtBLEtBQUwsQ0FBV0MsSUFBWCxDQUFnQjdFLE1BQWhCLEdBQXlCLEtBQXpCO0FBQ0g7O0FBQ0QsUUFBRyxLQUFLOEUsT0FBUixFQUFnQjtBQUNaLFdBQUtBLE9BQUwsQ0FBYTlFLE1BQWIsR0FBc0IsS0FBdEI7QUFDSDs7QUFDRCxRQUFHLEtBQUsrRSxTQUFSLEVBQWtCO0FBQ2QsV0FBS0EsU0FBTCxDQUFlRixJQUFmLENBQW9CN0UsTUFBcEIsR0FBNkIsS0FBN0I7QUFDSDs7QUFDRCxRQUFJLEtBQUsyQixTQUFMLElBQWtCaEYsU0FBUyxDQUFDaUYsa0JBQVYsQ0FBNkIyRixRQUFuRCxFQUE2RDtBQUFZO0FBQ3JFLFdBQUt0QyxXQUFMLENBQWlCLEtBQWpCO0FBQ0EsV0FBS04sWUFBTCxDQUFrQixLQUFsQjs7QUFDQSxVQUFJL0gsYUFBYSxDQUFDVyxXQUFkLEdBQTRCaUssMkJBQTVCLENBQXdEM0osSUFBeEQsQ0FBSixFQUFtRTtBQUMvRCxZQUFJNEosV0FBVyxHQUFHN0ssYUFBYSxDQUFDVyxXQUFkLEdBQTRCbUssdUJBQTVCLENBQW9EN0osSUFBcEQsQ0FBbEI7QUFDQSxhQUFLOEcsWUFBTCxDQUFrQjhDLFdBQWxCO0FBQ0g7O0FBQ0QsV0FBS25JLFFBQUwsQ0FBY1UsTUFBZCxHQUF1QixLQUFLbkMsSUFBTCxDQUFVOEosV0FBVixFQUF2QjtBQUVILEtBVEQsTUFTTSxJQUFHLEtBQUtoRyxTQUFMLElBQWtCaEYsU0FBUyxDQUFDaUYsa0JBQVYsQ0FBNkJnRyxXQUFsRCxFQUE4RDtBQUFNO0FBQ3RFLFVBQUcsS0FBSzdDLFNBQVIsRUFBa0I7QUFDZCxhQUFLQSxTQUFMLENBQWVGLElBQWYsQ0FBb0JnRCxPQUFwQjtBQUNBLGFBQUs5QyxTQUFMLEdBQWlCLElBQWpCO0FBQ0g7O0FBQ0QsVUFBRyxLQUFLK0MsVUFBUixFQUFtQjtBQUNmLGFBQUtBLFVBQUwsQ0FBZ0JqRCxJQUFoQixDQUFxQmdELE9BQXJCO0FBQ0EsYUFBS0MsVUFBTCxHQUFrQixJQUFsQjtBQUNILE9BUitELENBU2hFOzs7QUFDQSxXQUFLOUMsWUFBTCxDQUFrQm5ILElBQUksQ0FBQ2tLLFNBQUwsSUFBa0IsS0FBcEMsRUFBMkNsSyxJQUFJLENBQUNtSyxRQUFoRCxFQVZnRSxDQVdoRTs7QUFDQSxXQUFLL0MsV0FBTCxDQUFpQnBILElBQUksQ0FBQ0csWUFBTCxJQUFxQixJQUF0QztBQUNILEtBYkssTUFhQyxJQUFJLEtBQUsyRCxTQUFMLElBQWtCaEYsU0FBUyxDQUFDaUYsa0JBQVYsQ0FBNkJxRyxRQUFuRCxFQUE2RDtBQUFLO0FBQ3JFLFdBQUt0RCxZQUFMLENBQWtCLEtBQWxCO0FBQ0EsVUFBSXVELE9BQU8sR0FBRyxLQUFkO0FBQ0EsVUFBSUMsWUFBWSxHQUFHLEtBQUszSyxLQUFMLENBQVc0SyxtQkFBWCxDQUErQnZLLElBQUksQ0FBQ29JLEdBQXBDLENBQW5CO0FBQ0EsVUFBSSxDQUFDa0MsWUFBRCxJQUFpQkEsWUFBWSxHQUFHdEssSUFBSSxDQUFDNkYsSUFBekMsRUFDSSxLQUFLNEQsZ0JBQUwsQ0FBc0IsS0FBdEI7QUFDUCxLQU5NLE1BTUEsSUFBSSxLQUFLM0YsU0FBTCxJQUFrQmhGLFNBQVMsQ0FBQ2lGLGtCQUFWLENBQTZCQyxVQUFuRCxFQUErRDtBQUFHO0FBQ3JFLFdBQUtvRCxXQUFMLENBQWlCcEgsSUFBSSxDQUFDRyxZQUF0QjtBQUNILEtBRk0sTUFFQSxJQUFJLEtBQUsyRCxTQUFMLElBQWtCaEYsU0FBUyxDQUFDaUYsa0JBQVYsQ0FBNkJ5RyxXQUFuRCxFQUFnRTtBQUFFO0FBQ3JFLFdBQUtwRCxXQUFMLENBQWlCcEgsSUFBSSxDQUFDRyxZQUF0QjtBQUNBLFdBQUtnSCxZQUFMLENBQWtCbkgsSUFBSSxDQUFDeUssVUFBdkI7QUFDSCxLQUhNLE1BR0EsSUFBSSxLQUFLM0csU0FBTCxJQUFrQmhGLFNBQVMsQ0FBQ2lGLGtCQUFWLENBQTZCMkcsT0FBbkQsRUFBNEQ7QUFBTTtBQUNyRSxXQUFLQyxXQUFMLENBQWlCM0ssSUFBSSxDQUFDNEssU0FBdEI7QUFDSCxLQUZNLE1BRUEsSUFBSSxLQUFLOUcsU0FBTCxJQUFtQmhGLFNBQVMsQ0FBQ2lGLGtCQUFWLENBQTZCOEcsVUFBcEQsRUFBZ0U7QUFBRztBQUN0RSxVQUFJLENBQUM3SyxJQUFJLENBQUN5SyxVQUFWLEVBQXNCO0FBQ2xCLGFBQUtyRCxXQUFMLENBQWlCcEgsSUFBSSxDQUFDRyxZQUF0QjtBQUNIOztBQUNELFdBQUtnSCxZQUFMLENBQWtCbkgsSUFBSSxDQUFDeUssVUFBdkI7QUFDSCxLQUxNLE1BS0QsSUFBRyxLQUFLM0csU0FBTCxJQUFrQmhGLFNBQVMsQ0FBQ2lGLGtCQUFWLENBQTZCK0csYUFBbEQsRUFBZ0U7QUFBRTtBQUNwRTtBQUNBLFVBQUlDLEtBQUssR0FBRyxHQUFaOztBQUNBLFVBQUcsS0FBS3JHLFVBQUwsSUFBbUIsSUFBdEIsRUFBMkI7QUFDdkIsWUFBSXNHLHFCQUFxQixHQUFHbk0sT0FBTyxDQUFDLHdCQUFELENBQW5DOztBQUNBLFlBQUlvTSxVQUFVLEdBQUdqTCxJQUFJLENBQUNpTCxVQUF0Qjs7QUFDQSxZQUFHakwsSUFBSSxDQUFDaUwsVUFBTCxHQUFnQixNQUFuQixFQUEwQjtBQUN0QkEsVUFBQUEsVUFBVSxHQUFHakwsSUFBSSxDQUFDaUwsVUFBTCxHQUFnQixNQUE3QjtBQUNIOztBQUVERixRQUFBQSxLQUFLLEdBQUdDLHFCQUFxQixDQUFDdEwsV0FBdEIsR0FBb0NFLFFBQXBDLEdBQStDc0wsZ0JBQS9DLENBQWdFRCxVQUFoRSxFQUE0RWpMLElBQUksQ0FBQ21MLEdBQWpGLEVBQXNGbkwsSUFBSSxDQUFDb0wsTUFBM0YsQ0FBUjtBQUNBLFlBQUkvRyxNQUFNLEdBQUcsS0FBYjtBQUNBQSxRQUFBQSxNQUFNLEdBQUcyRyxxQkFBcUIsQ0FBQ3RMLFdBQXRCLEdBQW9DRSxRQUFwQyxHQUErQ3lMLFdBQS9DLENBQTJESixVQUEzRCxFQUF1RWpMLElBQUksQ0FBQ21MLEdBQTVFLEVBQWlGbkwsSUFBSSxDQUFDb0wsTUFBdEYsQ0FBVDs7QUFDQSxZQUFHL0csTUFBTSxJQUFJLElBQVYsSUFBa0JyRSxJQUFJLENBQUNzTCxPQUFMLElBQWMsSUFBbkMsRUFBd0M7QUFDcEM7QUFDQTtBQUNBLGNBQUcsQ0FBQyxLQUFLakUsUUFBVCxFQUFrQjtBQUNkLGlCQUFLQSxRQUFMLEdBQWdCbkQsS0FBSyxDQUFDcUgsV0FBTixDQUFrQixLQUFLMUssUUFBdkIsRUFBaUMsSUFBakMsRUFBc0MsRUFBdEMsRUFBMEMsQ0FBQyxFQUEzQyxFQUErQzVCLEVBQUUsQ0FBQ3VNLEVBQUgsQ0FBTSxDQUFOLEVBQVEsQ0FBUixDQUEvQyxDQUFoQjtBQUVILFdBSEQsTUFHSztBQUNELGlCQUFLbkUsUUFBTCxDQUFjTCxJQUFkLENBQW1CN0UsTUFBbkIsR0FBNEIsSUFBNUI7QUFDSDs7QUFDRCxlQUFLZ0QsT0FBTCxDQUFhdkcsUUFBUSxDQUFDcUgsYUFBVCxDQUF1QixhQUF2QixFQUFxQyxtQkFBckMsQ0FBYixFQUF5RSxVQUFTd0YsU0FBVCxFQUFtQjtBQUN4RixpQkFBS3BFLFFBQUwsQ0FBY3BGLFdBQWQsR0FBNEJ3SixTQUE1QjtBQUNILFdBRnVFLENBRXJFcEcsSUFGcUUsQ0FFaEUsSUFGZ0UsQ0FBeEU7QUFHSCxTQVpELE1BWUs7QUFDRCxjQUFHLEtBQUtnQyxRQUFSLEVBQWlCO0FBQ2IsaUJBQUtBLFFBQUwsQ0FBY0wsSUFBZCxDQUFtQjdFLE1BQW5CLEdBQTRCLEtBQTVCO0FBQ0g7QUFDSjtBQUNKLE9BM0JELE1BMkJLO0FBQ0Q0SSxRQUFBQSxLQUFLLEdBQUcvSyxJQUFJLENBQUMrSyxLQUFMLElBQWMsQ0FBdEI7QUFDSDs7QUFFRCxXQUFLVyxlQUFMLENBQXFCWCxLQUFyQjs7QUFDQSxVQUFHQSxLQUFLLElBQUksQ0FBWixFQUFjO0FBQ1YsYUFBS3pELFdBQUwsQ0FBaUIsSUFBakIsRUFBc0JwRCxLQUFLLENBQUN5SCxLQUFOLENBQVksS0FBWixDQUF0QixFQUF5QztBQUFDQyxVQUFBQSxHQUFHLEVBQUUsSUFBSTNNLEVBQUUsQ0FBQzRNLEtBQVAsQ0FBYSxHQUFiLEVBQWlCLEdBQWpCLEVBQXFCLEdBQXJCLEVBQXlCLEdBQXpCO0FBQU4sU0FBekM7QUFDSCxPQUZELE1BRUs7QUFDRCxhQUFLdkUsV0FBTCxDQUFpQixLQUFqQjtBQUNILE9BdkNpRSxDQXdDbEU7OztBQUNBLFdBQUtGLFdBQUwsQ0FBaUJwSCxJQUFJLENBQUNHLFlBQUwsSUFBcUIsSUFBdEM7QUFDSCxLQTFDSyxNQTBDQSxJQUFHLEtBQUsyRCxTQUFMLElBQWtCaEYsU0FBUyxDQUFDaUYsa0JBQVYsQ0FBNkIrSCxZQUFsRCxFQUErRDtBQUNqRTtBQUNBLFdBQUsxRSxXQUFMLENBQWlCcEgsSUFBSSxDQUFDRyxZQUFMLElBQXFCLElBQXRDLEVBRmlFLENBR2pFOztBQUNBLFVBQUdILElBQUksQ0FBQytMLFVBQVIsRUFBbUI7QUFDZixhQUFLeEUsV0FBTCxDQUFpQixJQUFqQjtBQUNILE9BRkQsTUFFSztBQUNELGFBQUtBLFdBQUwsQ0FBaUIsS0FBakI7QUFDSDs7QUFFRCxVQUFHdkgsSUFBSSxDQUFDZ00sTUFBTCxJQUFhLElBQWhCLEVBQXFCO0FBQ2pCLGFBQUtOLGVBQUwsQ0FBcUIxTCxJQUFJLENBQUNnTSxNQUExQjs7QUFDQSxZQUFHaE0sSUFBSSxDQUFDZ00sTUFBTCxJQUFlLENBQWxCLEVBQW9CO0FBQ2hCLGVBQUsxRSxXQUFMLENBQWlCLElBQWpCLEVBQXNCcEQsS0FBSyxDQUFDeUgsS0FBTixDQUFZLEtBQVosQ0FBdEIsRUFBeUM7QUFBQ0MsWUFBQUEsR0FBRyxFQUFFLElBQUkzTSxFQUFFLENBQUM0TSxLQUFQLENBQWEsR0FBYixFQUFpQixHQUFqQixFQUFxQixHQUFyQixFQUF5QixHQUF6QjtBQUFOLFdBQXpDO0FBQ0gsU0FGRCxNQUVLO0FBQ0QsZUFBS3ZFLFdBQUwsQ0FBaUIsS0FBakI7QUFDSDtBQUNKO0FBQ0osS0FsQkssTUFrQkMsSUFBRyxLQUFLeEQsU0FBTCxJQUFrQmhGLFNBQVMsQ0FBQ2lGLGtCQUFWLENBQTZCa0ksU0FBbEQsRUFBNEQ7QUFDL0QsVUFBSUMsVUFBVSxHQUFHbE0sSUFBSSxDQUFDa00sVUFBTCxJQUFtQixDQUFwQztBQUNBLFVBQUlDLFdBQVcsR0FBR25NLElBQUksQ0FBQ21NLFdBQUwsSUFBcUIsQ0FBdkM7QUFDQSxVQUFJQyxLQUFLLEdBQUduTixFQUFFLENBQUNvTixFQUFILENBQU1DLFNBQU4sQ0FBZ0IsT0FBaEIsRUFBeUJILFdBQXpCLEVBQXNDRCxVQUF0QyxDQUFaOztBQUVBLFVBQUlsTSxJQUFJLENBQUN1TSxZQUFMLEtBQXNCLENBQTFCLEVBQTZCO0FBQ3pCLGFBQUt6RixZQUFMLENBQWtCLElBQWxCO0FBQ0gsT0FGRCxNQUVPO0FBQ0gsYUFBS0EsWUFBTCxDQUFrQixLQUFsQjtBQUNIOztBQUVELFdBQUs0RSxlQUFMLENBQXFCUyxXQUFXLEdBQUdELFVBQWQsR0FBMkIsR0FBaEQsRUFBcURFLEtBQXJEO0FBQ0EsV0FBS2hGLFdBQUwsQ0FBaUJwSCxJQUFJLENBQUNHLFlBQUwsSUFBcUIsSUFBdEM7QUFDSCxLQWJNLE1BYUQsSUFBSSxLQUFLMkQsU0FBTCxJQUFrQmhGLFNBQVMsQ0FBQ2lGLGtCQUFWLENBQTZCeUksT0FBbkQsRUFBMkQ7QUFBRztBQUNoRSxXQUFLbEYsV0FBTCxDQUFpQnRILElBQUksQ0FBQ3lNLE9BQXRCLEVBQThCdkksS0FBSyxDQUFDeUgsS0FBTixDQUFZLEtBQVosQ0FBOUI7QUFDSCxLQUZLLE1BR0Y7QUFDQSxXQUFLdkUsV0FBTCxDQUFpQixLQUFLakgsWUFBdEI7O0FBQ0EsVUFBRyxLQUFLQyxPQUFMLElBQWMsSUFBakIsRUFBc0I7QUFDbEIsYUFBS3NMLGVBQUwsQ0FBcUIsS0FBS3RMLE9BQTFCLEVBQWtDLEtBQUtDLFdBQXZDO0FBQ0g7O0FBQ0QsVUFBRyxLQUFLQyxZQUFSLEVBQXFCO0FBQ2pCLGFBQUtnSCxXQUFMLENBQWlCLEtBQUtoSCxZQUFMLENBQWtCK0QsTUFBbkMsRUFBMkMsS0FBSy9ELFlBQUwsQ0FBa0JvTSxHQUE3RCxFQUFrRSxLQUFLcE0sWUFBTCxDQUFrQnFNLEtBQXBGO0FBQ0g7QUFDSjtBQUNKLEdBcmtCeUI7QUF1a0IxQnZKLEVBQUFBLFdBQVcsRUFBRSx1QkFBVztBQUNwQixRQUFJLEtBQUtwRCxJQUFMLElBQWEsS0FBSzJILGlCQUF0QixFQUF5QztBQUNyQyxXQUFLM0gsSUFBTCxDQUFVNEgsTUFBVixDQUFpQixLQUFLRCxpQkFBdEI7QUFDQSxXQUFLQSxpQkFBTCxHQUF5QixJQUF6QjtBQUNIO0FBQ0osR0E1a0J5QjtBQThrQjFCekIsRUFBQUEsV0FBVyxFQUFFLHFCQUFTMEcsUUFBVCxFQUFtQjtBQUM1QixRQUFJQyxRQUFRLEdBQUcsRUFBZjtBQUNBLFFBQUlDLFNBQVMsR0FBRyxDQUFoQjtBQUNBLFFBQUlqSCxJQUFKO0FBQ0EsU0FBSzlELFVBQUwsQ0FBZ0JJLE1BQWhCLEdBQXlCLEtBQXpCO0FBQ0EsU0FBS25CLGtCQUFMLENBQXdCK0wsS0FBeEIsR0FBZ0MsQ0FBaEM7QUFDQSxTQUFLL0wsa0JBQUwsQ0FBd0JnTSxpQkFBeEI7O0FBQ0EsUUFBSUosUUFBUSxHQUFHLENBQVgsSUFBZ0JBLFFBQVEsSUFBSSxDQUFoQyxFQUFtQztBQUMvQkMsTUFBQUEsUUFBUSxHQUFHLGNBQVg7QUFDSCxLQUZELE1BRU8sSUFBSUQsUUFBUSxHQUFHLENBQVgsSUFBZ0JBLFFBQVEsSUFBSSxDQUFoQyxFQUFtQztBQUN0Q0EsTUFBQUEsUUFBUSxHQUFHQSxRQUFRLEdBQUcsQ0FBdEI7QUFDQUMsTUFBQUEsUUFBUSxHQUFHLGNBQVg7QUFDSCxLQUhNLE1BR0EsSUFBSUQsUUFBUSxHQUFHLENBQWYsRUFBa0I7QUFDckIvRyxNQUFBQSxJQUFJLEdBQUcrRyxRQUFRLEdBQUcsRUFBbEI7QUFDQUEsTUFBQUEsUUFBUSxHQUFHLENBQVg7QUFDQUMsTUFBQUEsUUFBUSxHQUFHLGNBQVg7QUFDQUMsTUFBQUEsU0FBUyxHQUFHLEdBQVo7QUFDQSxXQUFLL0ssVUFBTCxDQUFnQkksTUFBaEIsR0FBeUIsSUFBekI7QUFDQSxVQUFJOEssSUFBSjs7QUFDQSxVQUFHcEgsSUFBSSxHQUFHLENBQVYsRUFBWTtBQUNSb0gsUUFBQUEsSUFBSSxHQUFHck8sUUFBUSxDQUFDcUgsYUFBVCxDQUF1QixRQUF2QixFQUFnQyxjQUFoQyxDQUFQO0FBQ0gsT0FGRCxNQUVLO0FBQ0RnSCxRQUFBQSxJQUFJLEdBQUdyTyxRQUFRLENBQUNxSCxhQUFULENBQXVCLFFBQXZCLEVBQWdDLGNBQWhDLENBQVA7QUFDSDs7QUFDRCxXQUFLZCxPQUFMLENBQWE4SCxJQUFiLEVBQWtCLFVBQVNDLEdBQVQsRUFBYTtBQUMzQixhQUFLbEwsVUFBTCxDQUFnQkMsV0FBaEIsR0FBOEJpTCxHQUE5QjtBQUNILE9BRmlCLENBRWhCN0gsSUFGZ0IsQ0FFWCxJQUZXLENBQWxCO0FBR0g7O0FBRUQsU0FBSyxJQUFJOEgsTUFBTSxHQUFHLENBQWxCLEVBQXFCQSxNQUFNLEdBQUdQLFFBQTlCLEVBQXdDTyxNQUFNLEVBQTlDLEVBQWtEO0FBQzlDLFVBQUlDLE9BQU8sR0FBR25PLEVBQUUsQ0FBQ29PLFdBQUgsQ0FBZSxLQUFLdk0sWUFBcEIsQ0FBZDtBQUNBc00sTUFBQUEsT0FBTyxDQUFDck4sS0FBUixHQUFnQitNLFNBQWhCO0FBQ0EsVUFBSVEsT0FBTyxHQUFHRixPQUFPLENBQUNHLFlBQVIsQ0FBcUJ0TyxFQUFFLENBQUNrQyxNQUF4QixDQUFkO0FBQ0EsVUFBSThELGVBQWUsR0FBR3JHLFFBQVEsQ0FBQ3NHLGlCQUFULENBQTJCMkgsUUFBM0IsQ0FBdEI7QUFDQSxXQUFLMUgsT0FBTCxDQUFhRixlQUFiLEVBQThCLFVBQVNxSSxPQUFULEVBQWtCbEksTUFBbEIsRUFBeUI7QUFDbkRrSSxRQUFBQSxPQUFPLENBQUNyTCxXQUFSLEdBQXNCbUQsTUFBdEI7QUFDSCxPQUY2QixDQUU1QkMsSUFGNEIsQ0FFdkIsSUFGdUIsRUFFakJpSSxPQUZpQixDQUE5QjtBQUlBLFdBQUt0TSxrQkFBTCxDQUF3QndNLFFBQXhCLENBQWlDSixPQUFqQzs7QUFDQSxVQUFHdkgsSUFBSCxFQUFRO0FBQ0osWUFBSW1CLElBQUksR0FBRyxJQUFJL0gsRUFBRSxDQUFDMkQsSUFBUCxFQUFYO0FBQ0FvRSxRQUFBQSxJQUFJLENBQUNwRyxDQUFMLEdBQVMsQ0FBQyxDQUFWO0FBQ0EsWUFBSTZNLEdBQUcsR0FBR3pHLElBQUksQ0FBQzBHLFlBQUwsQ0FBa0J6TyxFQUFFLENBQUN1QyxLQUFyQixDQUFWO0FBQ0FpTSxRQUFBQSxHQUFHLENBQUN2TCxNQUFKLEdBQWEyRCxJQUFiO0FBQ0E0SCxRQUFBQSxHQUFHLENBQUNFLFFBQUosR0FBZSxFQUFmO0FBQ0FGLFFBQUFBLEdBQUcsQ0FBQ0csVUFBSixHQUFpQixFQUFqQjtBQUNBSCxRQUFBQSxHQUFHLENBQUNJLGVBQUosR0FBc0I1TyxFQUFFLENBQUM2TyxLQUFILENBQVNDLGFBQVQsQ0FBdUJDLE1BQTdDO0FBQ0FQLFFBQUFBLEdBQUcsQ0FBQ1EsYUFBSixHQUFvQmhQLEVBQUUsQ0FBQzZPLEtBQUgsQ0FBU0MsYUFBVCxDQUF1QkMsTUFBM0M7QUFDQWhILFFBQUFBLElBQUksQ0FBQzBHLFlBQUwsQ0FBa0J6TyxFQUFFLENBQUNpUCxZQUFyQixFQUFtQ3ZCLEtBQW5DLEdBQTJDLElBQUkxTixFQUFFLENBQUMwTixLQUFQLENBQWEsQ0FBYixFQUFlLENBQWYsRUFBaUIsQ0FBakIsQ0FBM0M7QUFDQVMsUUFBQUEsT0FBTyxDQUFDSSxRQUFSLENBQWlCeEcsSUFBakI7QUFDSDtBQUNKO0FBQ0osR0Fsb0J5QjtBQW9vQjFCeUMsRUFBQUEsZ0JBQWdCLEVBQUUsMEJBQVNwRixNQUFULEVBQWlCO0FBQy9CLFFBQUk4SixTQUFTLEdBQUdsUCxFQUFFLENBQUNrQyxNQUFILENBQVVpTixLQUFWLENBQWdCQyxNQUFoQzs7QUFDQSxRQUFJLENBQUNoSyxNQUFMLEVBQWE7QUFDVDhKLE1BQUFBLFNBQVMsR0FBR2xQLEVBQUUsQ0FBQ2tDLE1BQUgsQ0FBVWlOLEtBQVYsQ0FBZ0JFLElBQTVCO0FBQ0g7O0FBQ0QsUUFBRyxLQUFLcE4sWUFBUixFQUFxQjtBQUNqQixXQUFLQSxZQUFMLENBQWtCcU4sUUFBbEIsQ0FBMkJKLFNBQTNCO0FBQ0g7O0FBQ0QsUUFBRyxLQUFLOU0sWUFBUixFQUFxQjtBQUNqQixXQUFLQSxZQUFMLENBQWtCa04sUUFBbEIsQ0FBMkJKLFNBQTNCO0FBQ0g7QUFFSixHQWhwQnlCO0FBa3BCMUIvRyxFQUFBQSxXQUFXLEVBQUUscUJBQVMvQyxNQUFULEVBQWlCO0FBQzFCLFFBQUksQ0FBQyxLQUFLbkUsZUFBVixFQUEyQjtBQUMzQixTQUFLQyxZQUFMLEdBQW9Ca0UsTUFBcEI7O0FBQ0EsUUFBRyxLQUFLeEQsUUFBTCxJQUFlLElBQWxCLEVBQXVCO0FBQ25CO0FBQ0g7O0FBQ0QsUUFBSXdELE1BQUosRUFBWTtBQUNSLFdBQUszQyxjQUFMLENBQW9CUyxNQUFwQixHQUE2QixJQUE3QjtBQUNILEtBRkQsTUFFTztBQUNILFdBQUtULGNBQUwsQ0FBb0JTLE1BQXBCLEdBQTZCLEtBQTdCO0FBQ0g7QUFDSixHQTdwQnlCO0FBK3BCMUJxTSxFQUFBQSxlQUFlLEVBQUUseUJBQVNDLEdBQVQsRUFBYztBQUMzQixRQUFJLENBQUNBLEdBQUwsRUFBVTs7QUFDVixRQUFJLEtBQUs1TixRQUFULEVBQW1CO0FBQ2YsV0FBS0gsV0FBTCxDQUFpQitOLEdBQUcsQ0FBQzlOLENBQXJCLEVBQXVCOE4sR0FBRyxDQUFDN04sQ0FBM0I7QUFDSCxLQUZELE1BRU87QUFDSCxXQUFLSCxPQUFMLEdBQWVnTyxHQUFmO0FBQ0g7QUFDSixHQXRxQnlCO0FBd3FCMUI5SCxFQUFBQSxZQUFZLEVBQUUsc0JBQVM1RyxLQUFULEVBQWdCO0FBQzFCLFFBQUksQ0FBQ0EsS0FBTCxFQUFZO0FBQ1osU0FBS0EsS0FBTCxHQUFhQSxLQUFiOztBQUNBLFFBQUksS0FBS2MsUUFBVCxFQUFtQjtBQUNmLFdBQUtBLFFBQUwsQ0FBY2QsS0FBZCxHQUFzQkEsS0FBdEI7QUFDSDtBQUNKLEdBOXFCeUI7QUFnckIxQjJPLEVBQUFBLFdBQVcsRUFBRSx1QkFBVztBQUNwQixRQUFJLEtBQUs3TixRQUFULEVBQW1CO0FBQ2YsYUFBTyxLQUFLQSxRQUFMLENBQWM4TixxQkFBZCxDQUFvQzFQLEVBQUUsQ0FBQ3VNLEVBQUgsQ0FBTSxDQUFOLEVBQVMsQ0FBVCxDQUFwQyxDQUFQO0FBQ0g7O0FBQ0QsV0FBTyxJQUFQO0FBQ0gsR0FyckJ5QjtBQXVyQjFCb0QsRUFBQUEsYUFBYSxFQUFFLHVCQUFTQyxPQUFULEVBQWtCO0FBQzdCLFFBQUksQ0FBQ0EsT0FBTCxFQUFjO0FBQ2QsUUFBSSxLQUFLaE8sUUFBVCxFQUNJLEtBQUtBLFFBQUwsQ0FBY0gsV0FBZCxDQUEwQm1PLE9BQTFCO0FBQ1AsR0EzckJ5QjtBQTZyQjFCOUcsRUFBQUEsY0FBYyxFQUFFLDBCQUFXO0FBQ3ZCLFFBQUksS0FBSy9ILElBQUwsSUFBYSxLQUFLQSxJQUFMLENBQVVDLEVBQTNCLEVBQStCO0FBQzNCLFVBQUksS0FBSzBILGlCQUFULEVBQTRCO0FBQzVCLFdBQUtBLGlCQUFMLEdBQTBCLEtBQUszSCxJQUFMLENBQVVxRixJQUFWLENBQWUsS0FBS3JGLElBQUwsQ0FBVThILG1CQUF6QixFQUE4QyxVQUFTZ0gsT0FBVCxFQUFrQjtBQUN0RixZQUFJLEtBQUtqTyxRQUFULEVBQ0ksS0FBS3dCLE9BQUwsQ0FBYXlNLE9BQWI7QUFDUCxPQUh1RSxDQUd0RXpKLElBSHNFLENBR2pFLElBSGlFLENBQTlDLENBQTFCO0FBSUg7QUFDSixHQXJzQnlCO0FBdXNCMUIwSixFQUFBQSxjQUFjLEVBQUUsd0JBQVNDLFNBQVQsRUFBb0I7QUFDaEMsUUFBSUEsU0FBSixFQUNJLEtBQUt2RyxZQUFMLEdBQW9CdUcsU0FBcEI7QUFDUCxHQTFzQnlCO0FBNHNCMUJyRSxFQUFBQSxXQUFXLEVBQUUscUJBQVN0RyxNQUFULEVBQWlCO0FBQzFCLFFBQUk0SyxRQUFRLEdBQUloUSxFQUFFLENBQUNrQyxNQUFILENBQVVpTixLQUFWLENBQWdCQyxNQUFoQzs7QUFDQSxRQUFJaEssTUFBSixFQUFZO0FBQ1A0SyxNQUFBQSxRQUFRLEdBQUdoUSxFQUFFLENBQUNrQyxNQUFILENBQVVpTixLQUFWLENBQWdCRSxJQUEzQjtBQUNKOztBQUNELFNBQUtwTixZQUFMLENBQWtCcU4sUUFBbEIsQ0FBMkJVLFFBQTNCO0FBQ0gsR0FsdEJ5QjtBQW10QjFCO0FBQ0E5SCxFQUFBQSxZQXB0QjBCLHdCQW90QmIrSCxJQXB0QmEsRUFvdEJSeEMsR0FwdEJRLEVBb3RCSjtBQUNsQixRQUFJeUMsSUFBSSxHQUFHLElBQVg7QUFDQSxRQUFJRCxJQUFJLElBQUksS0FBUixJQUFpQixDQUFDQyxJQUFJLENBQUNqSSxTQUEzQixFQUFzQzs7QUFDdEMsUUFBSSxDQUFDaUksSUFBSSxDQUFDakksU0FBVixFQUFvQjtBQUNoQixVQUFJZ0csR0FBRyxHQUFHdE8sUUFBUSxDQUFDcUgsYUFBVCxDQUF1QixRQUF2QixFQUFnQyxjQUFoQyxDQUFWOztBQUNBLFVBQUltSixLQUFJLEdBQUduUSxFQUFFLENBQUNtUSxJQUFILENBQVEsS0FBS3ZPLFFBQUwsQ0FBY2tNLEtBQXRCLEVBQTRCLEtBQUtsTSxRQUFMLENBQWN3TyxNQUExQyxDQUFYOztBQUNBRixNQUFBQSxJQUFJLENBQUNqSSxTQUFMLEdBQWlCaEQsS0FBSyxDQUFDcUgsV0FBTixDQUFrQjRELElBQUksQ0FBQ3RPLFFBQXZCLEVBQWdDcU0sR0FBaEMsRUFBb0MsQ0FBcEMsRUFBc0MsQ0FBdEMsRUFBd0NqTyxFQUFFLENBQUN1TSxFQUFILENBQU0sR0FBTixFQUFVLEdBQVYsQ0FBeEMsRUFBdUQsSUFBdkQsRUFBNEQsQ0FBNUQsRUFBOEQsS0FBOUQsQ0FBakI7QUFDQSxXQUFLckcsT0FBTCxDQUFhK0gsR0FBYixFQUFtQixVQUFTekIsU0FBVCxFQUFtQjtBQUNsQzBELFFBQUFBLElBQUksQ0FBQ2pJLFNBQUwsQ0FBZWpGLFdBQWYsR0FBNkJ3SixTQUE3QjtBQUNILE9BRmlCLENBRWZwRyxJQUZlLENBRVYsSUFGVSxDQUFsQjtBQUdIOztBQUNELFFBQUlxSCxHQUFKLEVBQVE7QUFDSixVQUFJLENBQUN5QyxJQUFJLENBQUNsRixVQUFWLEVBQXFCO0FBQ2pCa0YsUUFBQUEsSUFBSSxDQUFDbEYsVUFBTCxHQUFrQi9GLEtBQUssQ0FBQ29MLFdBQU4sQ0FBa0IsRUFBbEIsRUFBcUJySCxNQUFNLENBQUNzSCxVQUFQLENBQWtCQyxZQUFsQixDQUErQixDQUEvQixDQUFyQixFQUF1RHZILE1BQU0sQ0FBQ3NILFVBQVAsQ0FBa0JFLFdBQWxCLENBQThCLENBQTlCLENBQXZELEVBQXdGTCxJQUFJLENBQUNyQyxLQUFMLEdBQVcsQ0FBbkcsRUFBcUcsRUFBckcsRUFBd0csRUFBeEcsRUFBMkcsS0FBS2xNLFFBQWhILEVBQXlILENBQXpILEVBQTRINUIsRUFBRSxDQUFDdU0sRUFBSCxDQUFNLEdBQU4sRUFBVSxDQUFWLENBQTVILENBQWxCO0FBQ0g7O0FBQ0QyRCxNQUFBQSxJQUFJLENBQUNsRixVQUFMLENBQWdCL0gsTUFBaEIsR0FBeUJ3SyxHQUF6QjtBQUNIOztBQUVEeUMsSUFBQUEsSUFBSSxDQUFDakksU0FBTCxDQUFlRixJQUFmLENBQW9CN0UsTUFBcEIsR0FBNkIrTSxJQUE3QixDQWxCa0IsQ0FvQmxCOztBQUNBQyxJQUFBQSxJQUFJLENBQUMxRixnQkFBTCxDQUFzQixDQUFDeUYsSUFBdkI7O0FBQ0EsUUFBSUMsSUFBSSxDQUFDTyxZQUFULEVBQXNCLENBQ2xCO0FBQ0g7O0FBQ0QsUUFBSVAsSUFBSSxDQUFDbEYsVUFBVCxFQUFvQjtBQUNoQmtGLE1BQUFBLElBQUksQ0FBQ2xGLFVBQUwsQ0FBZ0JqRCxJQUFoQixDQUFxQjdFLE1BQXJCLEdBQThCK00sSUFBOUI7QUFDSDtBQUNKLEdBaHZCeUI7QUFrdkIxQjtBQUNBM0gsRUFBQUEsV0FBVyxFQUFDLHFCQUFTMkgsSUFBVCxFQUFjO0FBQ3RCLFFBQUdBLElBQUksSUFBSSxLQUFSLElBQWlCLENBQUMsS0FBS1MsUUFBMUIsRUFBbUM7O0FBQ25DLFFBQUcsQ0FBQyxLQUFLQSxRQUFULEVBQWtCO0FBQ2QsVUFBSXpDLEdBQUcsR0FBR3RPLFFBQVEsQ0FBQ3NHLGlCQUFULENBQTJCLHFCQUEzQixDQUFWO0FBQ0EsV0FBS3lLLFFBQUwsR0FBZ0J6TCxLQUFLLENBQUNxSCxXQUFOLENBQWtCLEtBQUsxSyxRQUF2QixFQUFnQ3FNLEdBQWhDLEVBQW9DLENBQUMsS0FBS3JNLFFBQUwsQ0FBY2tNLEtBQWYsR0FBcUIsQ0FBckIsR0FBdUIsRUFBM0QsRUFBK0QsQ0FBQyxLQUFLbE0sUUFBTCxDQUFjd08sTUFBZixHQUFzQixDQUF0QixHQUF3QixFQUF2RixFQUEwRnBRLEVBQUUsQ0FBQ3VNLEVBQUgsQ0FBTSxHQUFOLEVBQVUsR0FBVixDQUExRixFQUF5RyxJQUF6RyxFQUE4RyxDQUE5RyxFQUFnSCxLQUFoSCxDQUFoQjtBQUNBLFdBQUtyRyxPQUFMLENBQWErSCxHQUFiLEVBQW1CLFVBQVN6QixTQUFULEVBQW1CO0FBQ2xDLGFBQUtrRSxRQUFMLENBQWMxTixXQUFkLEdBQTRCd0osU0FBNUI7QUFDSCxPQUZpQixDQUVmcEcsSUFGZSxDQUVWLElBRlUsQ0FBbEI7QUFHSDs7QUFDRCxTQUFLc0ssUUFBTCxDQUFjM0ksSUFBZCxDQUFtQjdFLE1BQW5CLEdBQTRCK00sSUFBNUI7QUFDSCxHQTd2QnlCO0FBK3ZCMUI7QUFDQTtBQUNBeEQsRUFBQUEsZUFBZSxFQUFDLHlCQUFTdEwsT0FBVCxFQUFrQmdNLEtBQWxCLEVBQXdCO0FBQ3BDLFNBQUtoTSxPQUFMLEdBQWVBLE9BQWY7QUFDQSxTQUFLQyxXQUFMLEdBQW1CK0wsS0FBbkI7QUFFQSxRQUFHLENBQUMsS0FBS3ZMLFFBQVQsRUFBa0I7QUFFbEIsUUFBSXVPLElBQUksR0FBR25RLEVBQUUsQ0FBQ21RLElBQUgsQ0FBUSxHQUFSLEVBQWEsRUFBYixDQUFYOztBQUNBLFFBQUcsS0FBS3JJLEtBQVIsRUFBYztBQUNWLFdBQUtBLEtBQUwsQ0FBV0MsSUFBWCxDQUFnQjdFLE1BQWhCLEdBQXlCLElBQXpCO0FBQ0g7O0FBQ0QsUUFBRyxLQUFLOEUsT0FBUixFQUFnQjtBQUNaLFdBQUtBLE9BQUwsQ0FBYTlFLE1BQWIsR0FBc0IsSUFBdEI7QUFDSDs7QUFDRCxRQUFHLENBQUMsS0FBS3lOLFFBQVQsRUFBa0I7QUFDZCxVQUFJMUMsR0FBRyxHQUFHdE8sUUFBUSxDQUFDc0csaUJBQVQsQ0FBMkIsY0FBM0IsQ0FBVjtBQUNBLFVBQUkySyxJQUFJLEdBQUdqUixRQUFRLENBQUNzRyxpQkFBVCxDQUEyQixjQUEzQixDQUFYO0FBRUEsV0FBSzZCLEtBQUwsR0FBYTdDLEtBQUssQ0FBQ3FILFdBQU4sQ0FBa0IsS0FBSzFLLFFBQXZCLEVBQWdDLElBQWhDLEVBQXFDLENBQXJDLEVBQXVDLENBQUMsS0FBS0EsUUFBTCxDQUFjd08sTUFBZixHQUFzQixDQUF0QixHQUF3QkQsSUFBSSxDQUFDQyxNQUFMLEdBQVksQ0FBcEMsR0FBc0MsQ0FBN0UsRUFBK0VwUSxFQUFFLENBQUN1TSxFQUFILENBQU0sR0FBTixFQUFVLEdBQVYsQ0FBL0UsRUFBOEYsSUFBOUYsRUFBbUcsQ0FBbkcsRUFBcUcsSUFBckcsQ0FBYjtBQUNBLFdBQUt6RSxLQUFMLENBQVdDLElBQVgsQ0FBZ0I4SSxjQUFoQixDQUErQlYsSUFBSSxDQUFDckMsS0FBTCxHQUFXLENBQTFDLEVBQTRDcUMsSUFBSSxDQUFDQyxNQUFMLEdBQVksQ0FBeEQ7QUFDQSxXQUFLbEssT0FBTCxDQUFhK0gsR0FBYixFQUFtQixVQUFTekIsU0FBVCxFQUFtQjtBQUNsQyxhQUFLMUUsS0FBTCxDQUFXOUUsV0FBWCxHQUF5QndKLFNBQXpCO0FBQ0gsT0FGa0IsQ0FFakJwRyxJQUZpQixDQUVaLElBRlksQ0FBbkI7QUFJQSxXQUFLNEIsT0FBTCxHQUFlLElBQUloSSxFQUFFLENBQUMyRCxJQUFQLEVBQWY7QUFDQSxXQUFLcUUsT0FBTCxDQUFhOEksY0FBYixDQUE0QjlRLEVBQUUsQ0FBQ3VNLEVBQUgsQ0FBTSxHQUFOLEVBQVUsR0FBVixDQUE1QjtBQUNBLFdBQUt2RSxPQUFMLENBQWE2SSxjQUFiLENBQTRCVixJQUE1QjtBQUNBLFdBQUtuSSxPQUFMLENBQWF2RyxXQUFiLENBQXlCLENBQXpCLEVBQTJCLENBQUMsS0FBS0csUUFBTCxDQUFjd08sTUFBZixHQUFzQixDQUF0QixHQUF3QkQsSUFBSSxDQUFDQyxNQUFMLEdBQVksQ0FBcEMsR0FBc0MsQ0FBakU7QUFDQSxXQUFLeE8sUUFBTCxDQUFjMk0sUUFBZCxDQUF1QixLQUFLdkcsT0FBNUI7QUFFQSxVQUFJK0ksTUFBTSxHQUFHLEtBQUsvSSxPQUFMLENBQWF5RyxZQUFiLENBQTBCek8sRUFBRSxDQUFDa0MsTUFBN0IsQ0FBYjtBQUNBNk8sTUFBQUEsTUFBTSxDQUFDL0wsSUFBUCxHQUFjaEYsRUFBRSxDQUFDa0MsTUFBSCxDQUFVOE8sSUFBVixDQUFlQyxNQUE3QjtBQUNBRixNQUFBQSxNQUFNLENBQUNHLFFBQVAsR0FBa0JsUixFQUFFLENBQUNrQyxNQUFILENBQVVpUCxRQUFWLENBQW1CQyxNQUFyQztBQUVBLFdBQUtsTCxPQUFMLENBQWEwSyxJQUFiLEVBQW9CLFVBQVNwRSxTQUFULEVBQW1CO0FBQ25DdUUsUUFBQUEsTUFBTSxDQUFDL04sV0FBUCxHQUFxQndKLFNBQXJCO0FBQ0gsT0FGbUIsQ0FFbEJwRyxJQUZrQixDQUViLElBRmEsQ0FBcEI7QUFJQSxVQUFJdUssUUFBUSxHQUFHLEtBQUszSSxPQUFMLENBQWF5RyxZQUFiLENBQTBCek8sRUFBRSxDQUFDcVIsV0FBN0IsQ0FBZjtBQUNBVixNQUFBQSxRQUFRLENBQUNXLFNBQVQsR0FBcUJQLE1BQXJCO0FBQ0FKLE1BQUFBLFFBQVEsQ0FBQ1ksSUFBVCxHQUFnQnZSLEVBQUUsQ0FBQ3FSLFdBQUgsQ0FBZUcsSUFBZixDQUFvQkMsVUFBcEM7QUFDQWQsTUFBQUEsUUFBUSxDQUFDZSxXQUFULEdBQXVCdkIsSUFBSSxDQUFDckMsS0FBNUI7QUFDQSxXQUFLNkMsUUFBTCxHQUFnQkEsUUFBaEI7QUFDSDs7QUFDRCxRQUFHLEtBQUtnQixjQUFSLEVBQXVCO0FBQ25CLFdBQUtBLGNBQUwsQ0FBb0IxTyxNQUFwQixHQUE2QixFQUE3QjtBQUNIOztBQUNELFFBQUdrSyxLQUFILEVBQVM7QUFDTCxVQUFHLENBQUMsS0FBS3dFLGNBQVQsRUFBd0I7QUFDcEIsWUFBSUMsVUFBVSxHQUFHLElBQUk1UixFQUFFLENBQUM0TSxLQUFQLENBQWEsR0FBYixFQUFpQixHQUFqQixFQUFxQixHQUFyQixFQUF5QixHQUF6QixDQUFqQjtBQUNBLFlBQUlpRixVQUFVLEdBQUcsSUFBSTdSLEVBQUUsQ0FBQzRNLEtBQVAsQ0FBYSxDQUFiLEVBQWUsQ0FBZixFQUFpQixDQUFqQixFQUFtQixHQUFuQixDQUFqQjtBQUNBLFlBQUl1RCxJQUFJLEdBQUduUSxFQUFFLENBQUNtUSxJQUFILENBQVEsR0FBUixFQUFhLEVBQWIsQ0FBWDtBQUNBLGFBQUt3QixjQUFMLEdBQXNCMU0sS0FBSyxDQUFDb0wsV0FBTixDQUFrQixFQUFsQixFQUFxQnVCLFVBQXJCLEVBQWlDQyxVQUFqQyxFQUE0QzFCLElBQUksQ0FBQ3JDLEtBQUwsR0FBVyxDQUF2RCxFQUEwRCxDQUExRCxFQUE0RCxFQUE1RCxFQUErRCxLQUFLNkMsUUFBTCxDQUFjNUksSUFBN0UsRUFBa0YsQ0FBbEYsRUFBb0YvSCxFQUFFLENBQUN1TSxFQUFILENBQU0sR0FBTixFQUFXLEdBQVgsQ0FBcEYsQ0FBdEI7QUFDSDs7QUFDRCxXQUFLb0YsY0FBTCxDQUFvQjFPLE1BQXBCLEdBQTZCa0ssS0FBN0I7QUFDSDs7QUFDRCxTQUFLd0QsUUFBTCxDQUFjbUIsUUFBZCxHQUF5QjNRLE9BQU8sR0FBQyxHQUFqQztBQUNILEdBenpCeUI7QUEyekIxQjtBQUNBa0gsRUFBQUEsV0FBVyxFQUFDLHFCQUFVakQsTUFBVixFQUFrQnFJLEdBQWxCLEVBQXVCQyxLQUF2QixFQUE4QjtBQUN0QyxTQUFLck0sWUFBTCxHQUFvQjtBQUFDK0QsTUFBQUEsTUFBTSxFQUFDQSxNQUFSO0FBQWVxSSxNQUFBQSxHQUFHLEVBQUNBLEdBQW5CO0FBQXVCQyxNQUFBQSxLQUFLLEVBQUNBO0FBQTdCLEtBQXBCO0FBQ0EsUUFBRyxDQUFDLEtBQUs5TCxRQUFULEVBQWtCOztBQUNsQixRQUFHd0QsTUFBSCxFQUFVO0FBQ04sVUFBRyxLQUFLMk0sUUFBTCxJQUFpQixJQUFwQixFQUF5QjtBQUNyQixhQUFLQSxRQUFMLEdBQWdCLElBQUkvUixFQUFFLENBQUMyRCxJQUFQLEVBQWhCO0FBQ0EsYUFBS29PLFFBQUwsQ0FBY2pCLGNBQWQsQ0FBNkI5USxFQUFFLENBQUN1TSxFQUFILENBQU0sR0FBTixFQUFVLEdBQVYsQ0FBN0I7QUFDQSxZQUFJNEQsSUFBSSxHQUFHLEtBQUt2TyxRQUFMLENBQWNvUSxjQUFkLEVBQVg7QUFDQSxhQUFLRCxRQUFMLENBQWNsQixjQUFkLENBQTZCVixJQUE3QjtBQUNBLGFBQUs0QixRQUFMLENBQWN0USxXQUFkLENBQTBCLENBQTFCLEVBQTRCLENBQTVCO0FBQ0EsWUFBSXdRLFdBQVcsR0FBRyxLQUFLRixRQUFMLENBQWN0RCxZQUFkLENBQTJCek8sRUFBRSxDQUFDa1MsUUFBOUIsQ0FBbEI7QUFDQUQsUUFBQUEsV0FBVyxDQUFDRSxLQUFaO0FBQ0FGLFFBQUFBLFdBQVcsQ0FBQ0csU0FBWixHQUF3QnBTLEVBQUUsQ0FBQzBOLEtBQUgsQ0FBUyxDQUFULEVBQVksQ0FBWixFQUFlLENBQWYsRUFBa0IsR0FBbEIsQ0FBeEI7QUFDQXVFLFFBQUFBLFdBQVcsQ0FBQ0ksSUFBWixDQUFpQixDQUFDbEMsSUFBSSxDQUFDckMsS0FBTixHQUFZLENBQTdCLEVBQWdDLENBQUNxQyxJQUFJLENBQUNDLE1BQU4sR0FBYSxDQUE3QyxFQUFnREQsSUFBSSxDQUFDckMsS0FBckQsRUFBNERxQyxJQUFJLENBQUNDLE1BQWpFO0FBQ0E2QixRQUFBQSxXQUFXLENBQUNLLElBQVo7QUFFQSxZQUFJM0YsR0FBRyxHQUFHLElBQUkzTSxFQUFFLENBQUM0TSxLQUFQLENBQWEsR0FBYixFQUFpQixHQUFqQixFQUFxQixHQUFyQixFQUF5QixHQUF6QixDQUFWO0FBQ0EsWUFBSTJGLE1BQU0sR0FBRyxJQUFJdlMsRUFBRSxDQUFDNE0sS0FBUCxDQUFhLEdBQWIsRUFBaUIsQ0FBakIsRUFBbUIsQ0FBbkIsRUFBcUIsR0FBckIsQ0FBYjs7QUFDQSxZQUFHYyxLQUFILEVBQVM7QUFDTGYsVUFBQUEsR0FBRyxHQUFHZSxLQUFLLENBQUNmLEdBQU4sSUFBYUEsR0FBbkI7QUFDQTRGLFVBQUFBLE1BQU0sR0FBRzdFLEtBQUssQ0FBQzZFLE1BQU4sSUFBZ0JBLE1BQXpCO0FBQ0g7O0FBRUQsWUFBSUMsU0FBUyxHQUFHdk4sS0FBSyxDQUFDb0wsV0FBTixDQUFrQixFQUFsQixFQUFxQjFELEdBQXJCLEVBQXlCNEYsTUFBekIsRUFBZ0MsQ0FBaEMsRUFBa0MsQ0FBbEMsRUFBb0M5RSxHQUFwQyxFQUF3QyxLQUFLc0UsUUFBN0MsRUFBc0QsQ0FBdEQsRUFBd0QvUixFQUFFLENBQUN1TSxFQUFILENBQU0sR0FBTixFQUFXLEdBQVgsQ0FBeEQsQ0FBaEI7QUFDQSxhQUFLM0ssUUFBTCxDQUFjMk0sUUFBZCxDQUF1QixLQUFLd0QsUUFBNUI7QUFDSDs7QUFDRCxXQUFLQSxRQUFMLENBQWM3TyxNQUFkLEdBQXVCLElBQXZCO0FBQ0gsS0F4QkQsTUF3Qks7QUFDRCxVQUFHLEtBQUs2TyxRQUFSLEVBQWlCO0FBQ2IsYUFBS0EsUUFBTCxDQUFjN08sTUFBZCxHQUF1QixLQUF2QjtBQUNIO0FBQ0o7QUFDSixHQTUxQnlCO0FBODFCMUIwRyxFQUFBQSxXQUFXLEVBQUMscUJBQVNiLElBQVQsRUFBYztBQUN0QixRQUFHQSxJQUFJLENBQUMwSixRQUFSLEVBQWlCO0FBQ2IsVUFBSUMsR0FBRyxHQUFHM0osSUFBSSxDQUFDMEosUUFBTCxJQUFpQixFQUEzQjs7QUFDQSxXQUFJLElBQUlFLENBQVIsSUFBYUQsR0FBYixFQUFpQjtBQUNiLFlBQUlFLENBQUMsR0FBR0YsR0FBRyxDQUFDQyxDQUFELENBQVg7O0FBQ0EsWUFBR0MsQ0FBQyxDQUFDQyxHQUFGLElBQVMsQ0FBWixFQUFjO0FBQ1YsaUJBQU9ELENBQUMsQ0FBQ0UsR0FBVDtBQUNIO0FBQ0o7QUFDSjs7QUFDRCxRQUFHL0osSUFBSSxDQUFDMkosR0FBTCxJQUFZLElBQWYsRUFBb0I7QUFDaEIsVUFBSUEsSUFBRyxHQUFHM0osSUFBSSxDQUFDMkosR0FBTCxJQUFZLEVBQXRCOztBQUNBLFdBQUksSUFBSUMsRUFBUixJQUFhRCxJQUFiLEVBQWlCO0FBQ2IsWUFBSUUsRUFBQyxHQUFHRixJQUFHLENBQUNDLEVBQUQsQ0FBWDs7QUFDQSxZQUFHQyxFQUFDLENBQUNDLEdBQUYsSUFBUyxDQUFaLEVBQWM7QUFDVixpQkFBT0QsRUFBQyxDQUFDRSxHQUFUO0FBQ0g7QUFDSjtBQUNKOztBQUNELFFBQUcvSixJQUFJLENBQUNZLFFBQVIsRUFBaUI7QUFDYixhQUFPWixJQUFJLENBQUNZLFFBQVo7QUFDSDs7QUFDRCxXQUFPLENBQVA7QUFDSCxHQXIzQnlCO0FBdTNCMUJvSixFQUFBQSxPQXYzQjBCLHFCQXUzQmpCO0FBQ0wsV0FBTyxLQUFLaFMsSUFBTCxJQUFhLEVBQXBCO0FBQ0gsR0F6M0J5QjtBQTIzQjFCOEcsRUFBQUEsWUFBWSxFQUFFLHNCQUFTekMsTUFBVCxFQUFpQjtBQUMzQixTQUFLakMsVUFBTCxHQUFrQmlDLE1BQWxCO0FBQ0EsUUFBSSxLQUFLeEMsV0FBVCxFQUNJLEtBQUtBLFdBQUwsQ0FBaUJNLE1BQWpCLEdBQTBCLENBQUMsQ0FBQ2tDLE1BQTVCO0FBQ1AsR0EvM0J5QjtBQWk0QjFCd0MsRUFBQUEsWUFqNEIwQix3QkFpNEJieEMsTUFqNEJhLEVBaTRCTjtBQUNoQixTQUFLbUYsV0FBTCxHQUFtQm5GLE1BQW5COztBQUNBLFFBQUcsS0FBS3ZDLFlBQVIsRUFBcUI7QUFDakIsV0FBS0EsWUFBTCxDQUFrQkssTUFBbEIsR0FBMkJrQyxNQUEzQjtBQUNIO0FBQ0osR0F0NEJ5QixDQXU0QjFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUEvNEIwQixDQUFULENBQXJCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAg6L+Z6YeM5piv5o+P6L+w6L+Z5Liq56qX5L2T55qE5L2c55So55qEXG4vLyA8YnIvPkNyZWF0ZTogMjAxOS0wMS0yNCAxMTo0MzoyN1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBQYXRoVG9vbCA9IHJlcXVpcmUoXCJwYXRodG9vbFwiKTtcbnZhciBIZXJvQ29uc3QgPSByZXF1aXJlKFwiaGVyb19jb25zdFwiKTtcbnZhciBIZXJvQ2FsY3VsYXRlID0gcmVxdWlyZShcImhlcm9fY2FsY3VsYXRlXCIpO1xuXG52YXIgRXhoaWJpdGlvbkl0ZW0gPSBjYy5DbGFzcyh7XG4gICAgZXh0ZW5kczogQmFzZVBhbmVsLFxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5ybGVhc2VQcmVmYWIgPSBmYWxzZTsgICAgICAgIFxuICAgICAgICB0aGlzLnByZWZhYlBhdGggPSBQYXRoVG9vbC5nZXRQcmVmYWJQYXRoKFwiaGVyb1wiLCBcImhlcm9fZXhoaWJpdGlvbl9pdGVtXCIpO1xuICAgICAgICB2YXIgSGVyb0JhZ0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiaGVyb19jb250cm9sbGVyXCIpO1xuICAgICAgICB0aGlzLmN0cmwgPSBIZXJvQmFnQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpO1xuICAgICAgICB0aGlzLm1vZGVsID0gdGhpcy5jdHJsLmdldE1vZGVsKCk7XG4gICAgICAgIHRoaXMuaXNDYWNoZSA9IHRydWU7Ly/nvJPlrZhcbiAgICB9LFxuXG4gICAgLy8g5Y+v5Lul5Yid5aeL5YyW5aOw5piO5LiA5Lqb5Y+Y6YeP55qEXG4gICAgaW5pdENvbmZpZzpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLnNjYWxlID0gMVxuICAgICAgICB0aGlzLmRhdGEgPSBudWxsO1xuICAgICAgICB0aGlzLmlkID0gbnVsbDtcbiAgICAgICAgdGhpcy5pc19hbGxvd19zZWxlY3QgPSB0cnVlOyAgICAgICAgICAgLy8g5piv5ZCm5YWB6K646YCJ5Lit5ZKM5Y+W5raI6YCJ5LitXG4gICAgICAgIHRoaXMuaXNfdWlfc2VsZWN0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGVyY2VudCA9IG51bGw7XG4gICAgICAgIHRoaXMucGVyY2VudF9sYWIgPSBudWxsO1xuICAgICAgICB0aGlzLnN0cl90aXBzX29iaiA9IG51bGw7XG4gICAgICAgIHRoaXMuZWZmZWN0ID0gdHJ1ZTsgICAgICAgICAgICAgICAgIC8vIOaYr+WQpuWTjeW6lOaMiemSrui/h+a7pFxuICAgIH0sXG5cbiAgICAvLyDliJ3lp4vljJbkuIDkupvphY3nva7mlbDmja4s5Y+v5Lul55So5LqO5aOw5piO5LiA5Lqb5Y+Y6YeP5LmL57G755qEXG4gICAgaW5pdFBhbmVsOmZ1bmN0aW9uKCl7XG4gICAgICAgIGlmICh0aGlzLmN1cl9wb3MpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0UG9zaXRpb24odGhpcy5jdXJfcG9zLngsdGhpcy5jdXJfcG9zLnkpO1xuICAgICAgICAgICAgdGhpcy5jdXJfcG9zID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHRoaXMuc2NhbGUpe1xuICAgICAgICAgICAgdGhpcy5yb290X3duZC5zY2FsZSA9IHRoaXMuc2NhbGU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0YXJfaXRlbV9uZCAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwic3Rhcl9pdGVtXCIpO1xuICAgICAgICB0aGlzLnN0YXJzX2NvbnRhaW5lcl9uZCA9IHRoaXMuc2Vla0NoaWxkKFwic3RhcnNfY29udGFpbmVyXCIpO1xuICAgICAgICB0aGlzLmhlYWRfaWNvbl9uZCAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwiaGVhZF9pY29uXCIpO1xuICAgICAgICB0aGlzLmhlYWRfaWNvbl9zcCAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwiaGVhZF9pY29uXCIsIGNjLlNwcml0ZSk7XG4gICAgICAgIHRoaXMuY29tcF90eXBlX25kICAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJjb21wX3R5cGVcIik7XG4gICAgICAgIHRoaXMuY29tcF90eXBlX3NwICAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJjb21wX3R5cGVcIiwgY2MuU3ByaXRlKTtcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kX3NwICAgICAgPSB0aGlzLnNlZWtDaGlsZChcImJhY2tncm91bmRcIiwgY2MuU3ByaXRlKTtcbiAgICAgICAgdGhpcy5sZXZlbF9sYiAgICAgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcImxldmVsXCIsIGNjLkxhYmVsKTtcbiAgICAgICAgdGhpcy5maWdodF9uZCAgICAgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcImZpZ2h0XCIpO1xuICAgICAgICB0aGlzLnNlbGVjdF9pdGVtX25kICAgICA9IHRoaXMuc2Vla0NoaWxkKFwic2VsZWN0X2l0ZW1cIik7XG4gICAgICAgIHRoaXMubG9ja19pdGVtX25kICAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJsb2NrX2l0ZW1cIik7XG4gICAgICAgIHRoaXMubG9ja19pdGVtX3NwICAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJsb2NrX2l0ZW1cIiwgY2MuU3ByaXRlKTtcbiAgICAgICAgdGhpcy5yZWRfaWNvbl9uZCAgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcInJlZF9pY29uXCIpO1xuICAgICAgICB0aGlzLmNoaXBfaWNvbl9uZCAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwiY2hpcF9pY29uXCIpXG4gICAgICAgIHRoaXMuc3BlY2lhbF9uZCAgICAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJzcGVjaWFsXCIpXG4gICAgICAgIHRoaXMuc3BlY2lhbF9zcCAgICAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJzcGVjaWFsXCIsY2MuU3ByaXRlKVxuICAgICAgIFxuXG4gICAgICAgIHRoaXMuY29tcF90eXBlX3NwLnNwcml0ZUZyYW1lID0gbnVsbDtcbiAgICAgICAgdGhpcy5sZXZlbF9sYi5zdHJpbmcgPSBcIlwiO1xuXG4gICAgICAgIHRoaXMucmVkX2ljb25fbmQuYWN0aXZlID0gdGhpcy5yZWRfc3RhdHVzIHx8IGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLmRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0YSh0aGlzLmRhdGEpO1xuICAgICAgICB9ZWxzZSBpZih0aGlzLmlkIT1udWxsKXtcbiAgICAgICAgICAgIHRoaXMuc2V0VW5pdERhdGEodGhpcy5pZCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM5LqL5Lu255uR5ZCs55qE5o6l5Y+jLOS4jemcgOimgeaJi+WKqOiwg+eUqCzlpoLmnpzmmK/kvb/nlKhnY29yZS5HbG9iYWxFdmVudOebkeWQrCzlj6/ku6Xnm7TmjqXosIPnlKhhZGRHbG9iYWxFdmVudFxuICAgIHJlZ2lzdGVyRXZlbnQ6ZnVuY3Rpb24oKSB7XG5cbiAgICB9LFxuXG4gICAgLy8g6aKE5Yi25L2T5Yqg6L295a6M5oiQ5LmL5ZCOLOa3u+WKoOWIsOWvueW6lOS4u+iKgueCueS5i+WQjueahOWbnuiwg+WPr+S7peiuvue9ruS4gOS6m+aVsOaNruS6hlxuICAgIG9uU2hvdzpmdW5jdGlvbihwYXJhbXMpe1xuICAgICAgICBpZiAodGhpcy5yb290X3duZCAmJiAhdGhpcy5jbGlja19ldmVudCkge1xuICAgICAgICAgICAgdGhpcy5yb290X3duZC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIHRoaXMub25DbGlja1Jvb3RXbmQsIHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5yb290X3duZC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9TVEFSVCwgdGhpcy5vbkNsaWNrUm9vdFduZCwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLnJvb3Rfd25kLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0NBTkNFTCwgdGhpcy5vbkNsaWNrUm9vdFduZCwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLmNsaWNrX2V2ZW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDpnaLmnb/orr7nva7kuI3lj6/op4HnmoTlm57osIMs6L+Z6YeM5YGa5LiA5Lqb5LiN5Y+v6KeB55qE5bGP6JS95aSE55CGXG4gICAgb25IaWRlOmZ1bmN0aW9uKCl7XG5cbiAgICB9LFxuXG4gICAgLy8g5b2T6Z2i5p2/5LuO5Li76IqC54K56YeK5pS+5o6J55qE6LCD55So5o6l5Y+jLOmcgOimgeaJi+WKqOiwg+eUqCzogIzkuJTkuZ/kuIDlrpropoHosIPnlKhcbiAgICBvbkRlbGV0ZTpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLnVuQmluZEV2ZW50KCk7XG4gICAgICAgIGlmKHRoaXMuaGVhZF9pY29uX3NwKXtcbiAgICAgICAgICAgIHRoaXMuaGVhZF9pY29uX3NwLnNwcml0ZUZyYW1lID0gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucm9vdF93bmQgJiYgdGhpcy5jbGlja19ldmVudCkge1xuICAgICAgICAgICAgdGhpcy5yb290X3duZC5vZmYoY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCB0aGlzLm9uQ2xpY2tSb290V25kLCB0aGlzKTtcbiAgICAgICAgICAgIHRoaXMucm9vdF93bmQub2ZmKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX1NUQVJULCB0aGlzLm9uQ2xpY2tSb290V25kLCB0aGlzKTtcbiAgICAgICAgICAgIHRoaXMucm9vdF93bmQub2ZmKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0NBTkNFTCwgdGhpcy5vbkNsaWNrUm9vdFduZCwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLmNsaWNrX2V2ZW50ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgSXRlbXNQb29sLmdldEluc3RhbmNlKCkuY2FjaGVJdGVtKHRoaXMpO1xuXG4gICAgfSxcblxuICAgIGFkZENhbGxCYWNrOiBmdW5jdGlvbihjbGlja19jYikge1xuICAgICAgICB0aGlzLmNsaWNrX2NiID0gY2xpY2tfY2JcbiAgICB9LFxuXG4gICAgYWRkVG91Y2hDYjogZnVuY3Rpb24odG91Y2hfY2IpIHtcbiAgICAgICAgdGhpcy50b3VjaF9jYiA9IHRvdWNoX2NiO1xuICAgIH0sXG5cbiAgICBvbkNsaWNrUm9vdFduZDogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgdmFyIGlzX2NhbGxiYWNrID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuZnJvbV90eXBlID09IEhlcm9Db25zdC5FeGhpYml0aW9uSXRlbVR5cGUuZUZvcm1GaWdodCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGEpIFxuICAgICAgICAgICAgICAgIGlzX2NhbGxiYWNrID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfU1RBUlQpIHtcbiAgICAgICAgICAgIGlmKHRoaXMuZWZmZWN0KXtcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3Rfd25kLnNjYWxlID0gKHRoaXMuc2NhbGUgfHwgMSkgKiAwLjk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy50b3VjaF9jYiAmJiBpc19jYWxsYmFjaylcbiAgICAgICAgICAgICAgICB0aGlzLnRvdWNoX2NiKHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0NBTkNFTCkge1xuICAgICAgICAgICAgaWYodGhpcy5lZmZlY3Qpe1xuICAgICAgICAgICAgICAgIHRoaXMucm9vdF93bmQuc2NhbGUgPSB0aGlzLnNjYWxlIHx8IDE7ICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5EKSB7XG4gICAgICAgICAgICBpZih0aGlzLmVmZmVjdCl7XG4gICAgICAgICAgICAgICAgdGhpcy5yb290X3duZC5zY2FsZSA9IHRoaXMuc2NhbGUgfHwgMTsgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5jbGlja19jYiAmJiBpc19jYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIFV0aWxzLnBsYXlCdXR0b25Tb3VuZCgzKVxuICAgICAgICAgICAgICAgIHRoaXMuY2xpY2tfY2IodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHNldEJ1dHRvbkVmZmVjdChzdGF0dXMpe1xuICAgICAgICB0aGlzLmVmZmVjdCA9IHN0YXR1c1xuICAgIH0sXG4gICAgc2V0RXh0ZW5kRGF0YTogZnVuY3Rpb24oZXh0ZW5kX2RhdGEpIHtcbiAgICAgICAgaWYgKCFleHRlbmRfZGF0YSkgcmV0dXJuO1xuICAgICAgICB0aGlzLnNjYWxlID0gZXh0ZW5kX2RhdGEuc2NhbGUgfHwgMTtcbiAgICAgICAgdGhpcy5jYW5fY2xpY2sgPSBleHRlbmRfZGF0YS5jYW5fY2xpY2sgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuZnJvbV90eXBlID0gZXh0ZW5kX2RhdGEuZnJvbV90eXBlIHx8IEhlcm9Db25zdC5FeGhpYml0aW9uSXRlbVR5cGUuZU5vbmU7XG4gICAgICAgIHRoaXMuYm9vbGRfdHlwZSA9IGV4dGVuZF9kYXRhLmJvb2xkX3R5cGUgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5jbGlja19kZWxheSA9IGV4dGVuZF9kYXRhLmNsaWNrX2RlbGF5IHx8IDA7XG4gICAgICAgIHRoaXMuaGlkZV9zdGFyID0gZXh0ZW5kX2RhdGEuaGlkZV9zdGFyIHx8IGZhbHNlO1xuICAgIH0sXG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLVxuICAgIC8vIGRlc2M65qC55o2u5Y2V5L2NaWTorr7nva7nm7jlhbPnjrDlrp5cbiAgICAvLyBAaWQ6XG4gICAgLy8gQHJldHVybiBcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLVxuICAgIHNldFVuaXREYXRhOmZ1bmN0aW9uKGlkKXtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICBpZighdGhpcy5yb290X3duZClyZXR1cm47XG4gICAgICAgIGlkID0gaWQgfHwgMDtcbiAgICAgICAgdmFyIGNvbmZpZyA9IFV0aWxzLmdldFVuaXRDb25maWcoaWQpO1xuICAgICAgICBpZihjb25maWcgPT0gbnVsbCl7XG4gICAgICAgICAgICB0aGlzLmhlYWRfaWNvbl9uZC5hY3RpdmUgPWZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zdGFyc19jb250YWluZXJfbmQuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmxldmVsX2xiLnN0cmluZyA9IFwiXCI7XG4gICAgICAgICAgICB2YXIgYmFja2dyb3VuZF9yZXMgPSBQYXRoVG9vbC5nZXRJdGVtUXVhbGl0eUJHKDApO1xuICAgICAgICAgICAgdmFyIGNvbW1vbl9yZXNfcGF0aCA9IFBhdGhUb29sLmdldENvbW1vbkljb21QYXRoKGJhY2tncm91bmRfcmVzKTtcbiAgICAgICAgICAgIHRoaXMubG9hZFJlcyhjb21tb25fcmVzX3BhdGgsIGZ1bmN0aW9uKHNmX29iail7XG4gICAgICAgICAgICAgICAgdGhpcy5iYWNrZ3JvdW5kX3NwLnNwcml0ZUZyYW1lID0gc2Zfb2JqO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKTtcblxuICAgICAgICAgICAgaWYodGhpcy5jb21wX3R5cGVfbmQpe1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcF90eXBlX25kLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHRoaXMuaGVhZF9pY29uX25kLmFjdGl2ZSA9dHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnNfY29udGFpbmVyX25kLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIFxuICAgICAgICAgICAgdmFyIG1vbnN0ZXJfaWQgPSBjb25maWcubW9uc3RlcjM7XG4gICAgICAgICAgICBpZihtb25zdGVyX2lkKXtcbiAgICAgICAgICAgICAgICB2YXIgbW9uc3Rlcl9jb25maWcgPSBVdGlscy5nZXRVbml0Q29uZmlnKG1vbnN0ZXJfaWQpO1xuICAgICAgICAgICAgICAgIGlmKG1vbnN0ZXJfY29uZmlnKXtcbiAgICAgICAgICAgICAgICAgICAgLy8g6K6+572u5aS05YOPXG4gICAgICAgICAgICAgICAgICAgIHZhciBoZWFkX3Jlc19wYXRoID0gUGF0aFRvb2wuZ2V0SGVhZFJlcyhtb25zdGVyX2NvbmZpZy5oZWFkX2ljb24pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRSZXMoaGVhZF9yZXNfcGF0aCwgZnVuY3Rpb24oaGVhZF9zZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWFkX2ljb25fc3Auc3ByaXRlRnJhbWUgPSBoZWFkX3NmO1xuICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIOiuvue9ruWTgei0qOahhlxuICAgICAgICAgICAgICAgICAgICB2YXIgYmFja2dyb3VuZF9yZXMgPSBQYXRoVG9vbC5nZXRJdGVtUXVhbGl0eUJHKG1vbnN0ZXJfY29uZmlnLnN0YXIpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29tbW9uX3Jlc19wYXRoID0gUGF0aFRvb2wuZ2V0Q29tbW9uSWNvbVBhdGgoYmFja2dyb3VuZF9yZXMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRSZXMoY29tbW9uX3Jlc19wYXRoLCBmdW5jdGlvbihzZl9vYmope1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iYWNrZ3JvdW5kX3NwLnNwcml0ZUZyYW1lID0gc2Zfb2JqO1xuICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIOiuvue9rumYteiQpVxuICAgICAgICAgICAgICAgICAgICB2YXIgY2FtcF9yZXMgPSBQYXRoVG9vbC5nZXRIZXJvQ2FtcFJlcyhtb25zdGVyX2NvbmZpZy5jYW1wX3R5cGUpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29tbW9uX3Jlc19wYXRoID0gUGF0aFRvb2wuZ2V0VUlJY29uUGF0aChcImNvbW1vblwiLCBjYW1wX3Jlcyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZFJlcyhjb21tb25fcmVzX3BhdGgsIGZ1bmN0aW9uKHNmX29iail7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBfdHlwZV9zcC5zcHJpdGVGcmFtZSA9IHNmX29iajtcbiAgICAgICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIC0tIOiuvue9ruaYn+aVsFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXJzKG1vbnN0ZXJfY29uZmlnLnN0YXIpOyBcbiAgICAgICAgICAgICAgICAgICAgLy8g6K6+572u562J57qnXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGV2ZWxfbGIuc3RyaW5nID0gbW9uc3Rlcl9jb25maWcubGV2LnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvL+WktOWDj1xuICAgIHNldEhlYWRJbWcoaGVhZF9pY29uKXtcbiAgICAgICAgdmFyIGhlYWRfcmVzX3BhdGggPSBQYXRoVG9vbC5nZXRIZWFkUmVzKGhlYWRfaWNvbik7XG4gICAgICAgIHRoaXMubG9hZFJlcyhoZWFkX3Jlc19wYXRoLCBmdW5jdGlvbihoZWFkX3NmKSB7XG4gICAgICAgICAgICB0aGlzLmhlYWRfaWNvbl9zcC5zcHJpdGVGcmFtZSA9IGhlYWRfc2Y7XG4gICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgfSxcbiAgICAvL+WTgei0qOahhlxuICAgIHNldFF1YWxpdHlJbWcocXVhbGl0eSl7XG4gICAgICAgIHZhciBiYWNrZ3JvdW5kX3JlcyA9IFBhdGhUb29sLmdldEl0ZW1RdWFsaXR5QkcocXVhbGl0eSk7XG4gICAgICAgIHZhciBjb21tb25fcmVzX3BhdGggPSBQYXRoVG9vbC5nZXRDb21tb25JY29tUGF0aChiYWNrZ3JvdW5kX3Jlcyk7XG4gICAgICAgIHRoaXMubG9hZFJlcyhjb21tb25fcmVzX3BhdGgsIGZ1bmN0aW9uKHNmX29iail7XG4gICAgICAgICAgICB0aGlzLmJhY2tncm91bmRfc3Auc3ByaXRlRnJhbWUgPSBzZl9vYmo7XG4gICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgfSxcbiAgICAvL+mYteiQpVxuICAgIHNldENhbXBJbWcoY2FtcF90eXBlKXtcbiAgICAgICAgdmFyIGNhbXBfcmVzID0gUGF0aFRvb2wuZ2V0SGVyb0NhbXBSZXMoY2FtcF90eXBlKTtcbiAgICAgICAgdmFyIGNvbW1vbl9yZXNfcGF0aCA9IFBhdGhUb29sLmdldFVJSWNvblBhdGgoXCJjb21tb25cIiwgY2FtcF9yZXMpO1xuICAgICAgICB0aGlzLmxvYWRSZXMoY29tbW9uX3Jlc19wYXRoLCBmdW5jdGlvbihzZl9vYmope1xuICAgICAgICAgICAgdGhpcy5jb21wX3R5cGVfc3Auc3ByaXRlRnJhbWUgPSBzZl9vYmo7XG4gICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICB9LFxuICAgIC8v562J57qnXG4gICAgc2V0TGV2KGxldil7XG4gICAgICAgIHRoaXMubGV2ZWxfbGIuc3RyaW5nID0gbGV2LnRvU3RyaW5nKCk7XG4gICAgfSxcbiAgICBpbml0KCl7XG4gICAgICAgIHRoaXMuc2V0Um9vdFNjYWxlKDEpXG4gICAgICAgIHRoaXMuY3VyX3BvcyA9IG51bGw7XG4gICAgICAgIHRoaXMuc2V0UG9zaXRpb24oMCwwKVxuICAgICAgICB0aGlzLnNldERhdGEobnVsbClcbiAgICAgICAgdGhpcy5zZXRFeHRlbmREYXRhKHt9KVxuICAgICAgICB0aGlzLnJlY29yZF9yZXNfaWQgPSBudWxsO1xuICAgICAgICB0aGlzLnNob3dDaGlwSWNvbihmYWxzZSlcbiAgICAgICAgLy8gdGhpcy5zZXRIZWFkVW5FbmFibGVkKHRydWUpXG4gICAgICAgIHRoaXMuc2hvd1JlZFBvaW50KGZhbHNlKVxuICAgICAgICBpZih0aGlzLmJnSW1nKXtcbiAgICAgICAgICAgIHRoaXMuYmdJbWcubm9kZS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZih0aGlzLmJhck5vZGUpe1xuICAgICAgICAgICAgdGhpcy5iYXJOb2RlLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMubG9ja19pY29uKXtcbiAgICAgICAgICAgIHRoaXMubG9ja19pY29uLm5vZGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zaG93TG9ja0ljb24oZmFsc2UpXG4gICAgICAgIHRoaXMuc2V0U2VsZWN0ZWQoZmFsc2UpXG4gICAgICAgIGlmKHRoaXMuaGlyZUhlcm8pe1xuICAgICAgICAgICAgdGhpcy5oaXJlSGVyby5ub2RlLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2hvd1N0clRpcHMoZmFsc2UpO1xuICAgICAgICB0aGlzLnNob3dIZWxwSW1nKGZhbHNlKVxuICAgICAgICBpZih0aGlzLmZpZ2h0X25kKXtcbiAgICAgICAgICAgIHRoaXMuZmlnaHRfbmQuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0cl90aXBzX29iaiA9IG51bGw7XG4gICAgICAgIHRoaXMuY3VyX3Zpc2libGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pZCA9IG51bGw7XG4gICAgICAgIHRoaXMuaXNfYWxsb3dfc2VsZWN0ID0gdHJ1ZTsgICAgICAgICAgIC8vIOaYr+WQpuWFgeiuuOmAieS4reWSjOWPlua2iOmAieS4rVxuICAgICAgICB0aGlzLmlzX3VpX3NlbGVjdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBlcmNlbnQgPSBudWxsO1xuICAgICAgICB0aGlzLnBlcmNlbnRfbGFiID0gbnVsbDtcbiAgICAgICAgdGhpcy5lZmZlY3QgPSB0cnVlOyAgICAgIFxuICAgICAgICB0aGlzLmFkZENhbGxCYWNrKG51bGwpO1xuICAgICAgICB0aGlzLmFkZFRvdWNoQ2IobnVsbClcbiAgICAgICAgaWYodGhpcy5zcGVjaWFsX25kKXtcbiAgICAgICAgICAgIHRoaXMuc3BlY2lhbF9uZC5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZih0aGlzLnJvb3Rfd25kX2NiKXtcbiAgICAgICAgICAgIHRoaXMucm9vdF93bmRfY2IgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMuaGVhZF9pY29uX25kKXtcbiAgICAgICAgICAgIHRoaXMuaGVhZF9pY29uX25kLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy5yb290X3duZCl7XG4gICAgICAgICAgICBVdGlscy5zZXRDaGlsZFVuRW5hYmxlZCh0aGlzLnJvb3Rfd25kLGZhbHNlKVxuICAgICAgICB9XG4gICAgfSxcbiAgICBzZXREYXRhOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGEgJiZ0aGlzLml0ZW1fdXBkYXRlX2V2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEudW5iaW5kKHRoaXMuaXRlbV91cGRhdGVfZXZlbnQpO1xuICAgICAgICAgICAgdGhpcy5pdGVtX3VwZGF0ZV9ldmVudCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICBpZiAodGhpcy5yb290X3duZCkge1xuICAgICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oZWFkX2ljb25fbmQuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5oZWFkX2ljb25fc3Auc3ByaXRlRnJhbWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnNfY29udGFpbmVyX25kLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMubGV2ZWxfbGIuc3RyaW5nID0gXCJcIjtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBfdHlwZV9zcC5zcHJpdGVGcmFtZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgdmFyIGJhY2tncm91bmRfcmVzID0gdGhpcy5yZWNvcmRfcmVzX2lkID0gUGF0aFRvb2wuZ2V0SXRlbVF1YWxpdHlCRygwKTtcbiAgICAgICAgICAgICAgICB2YXIgY29tbW9uX3Jlc19wYXRoID0gUGF0aFRvb2wuZ2V0Q29tbW9uSWNvbVBhdGgoYmFja2dyb3VuZF9yZXMpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZFJlcyhjb21tb25fcmVzX3BhdGgsIGZ1bmN0aW9uKHNmX29iail7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmFja2dyb3VuZF9zcC5zcHJpdGVGcmFtZSA9IHNmX29iajtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgICAgICAgICAgaWYodGhpcy5zcGVjaWFsX25kLmFjdGl2ZSl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3BlY2lhbF9uZC5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaGVhZF9pY29uX25kLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFyc19jb250YWluZXJfbmQuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0Um9vdFNjYWxlKHRoaXMuc2NhbGUpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldChkYXRhKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEuVVBEQVRFX1BBUlRORVJfQVRUUilcbiAgICAgICAgICAgIHRoaXMuYWRkVm9CaW5kRXZlbnQoKTtcbiAgICB9LFxuXG4gICAgdXBkYXRlV2lkZ2V0OiBmdW5jdGlvbihpbmZvKSB7XG4gICAgICAgIGlmICghaW5mbykge1xuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZChmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRhdGEgPSBpbmZvO1xuICAgICAgICBpZiAodHlwZW9mIGluZm8gPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgZGF0YSA9IENvbmZpZy5wYXJ0bmVyX2RhdGEuZGF0YV9wYXJ0bmVyX2Jhc2VbZGF0YV07XG4gICAgICAgICAgICBpZiAoIWRhdGEpIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpbmZvLmRhdGEpXG4gICAgICAgICAgICAgICAgZGF0YSA9IGluZm8uZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRhdGEgfHwgZGF0YS5iaWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG4gICAgICAgIGxldCBzdGFyID0gZGF0YS5zdGFyIHx8IGRhdGEuaW5pdF9zdGFyXG4gICAgICAgIC8vIOagueiKgueCueWQjeensFxuICAgICAgICB0aGlzLnJvb3Rfd25kLm5hbWUgPSBcImhlcm9cIiArIFwiX1wiICsgZGF0YS5iaWRcblxuICAgICAgICAvLyDlpLTlg49cbiAgICAgICAgdGhpcy5yZWNvcmRfaGVhZF9pZCA9IG51bGw7XG4gICAgICAgIHZhciBoZWFkX3Jlc19wYXRoID0gbnVsbDtcbiAgICAgICAgaWYgKGRhdGEuYmlkID09PSAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kZWZhdWx0X3BhdGgpe1xuICAgICAgICAgICAgICAgIGhlYWRfcmVzX3BhdGggPSB0aGlzLmRlZmF1bHRfcGF0aDtcbiAgICAgICAgICAgIH1lbHNlIGlmKGRhdGEuaWNvbil7XG4gICAgICAgICAgICAgICAgaGVhZF9yZXNfcGF0aCA9IFBhdGhUb29sLmdldEljb25QYXRoKFwiaXRlbVwiLCBkYXRhLmljb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHVzZV9za2luID0gdGhpcy5maW5kVXNlU2tpbihpbmZvKTtcbiAgICAgICAgICAgIGlmKHVzZV9za2luICE9IG51bGwgJiYgdXNlX3NraW4gIT0gMCl7XG4gICAgICAgICAgICAgICAgbGV0IHNraW5fY29uZmlnID0gQ29uZmlnLnBhcnRuZXJfc2tpbl9kYXRhLmRhdGFfc2tpbl9pbmZvW3VzZV9za2luXTtcbiAgICAgICAgICAgICAgICBpZihza2luX2NvbmZpZyl7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRfcmVzX3BhdGggPSBQYXRoVG9vbC5nZXRIZWFkUmVzKHNraW5fY29uZmlnLmhlYWRfaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIHZhciBzdGFyX2tleSA9IGRhdGEuYmlkICsgXCJfXCIgKyBzdGFyO1xuICAgICAgICAgICAgICAgIHZhciBzdGFyX2NmZyA9IGdkYXRhKFwicGFydG5lcl9kYXRhXCIsIFwiZGF0YV9wYXJ0bmVyX3N0YXJcIiwgc3Rhcl9rZXkpO1xuICAgICAgICAgICAgICAgIGlmIChzdGFyX2NmZykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2h3b19oZWFkX2lkID0gc3Rhcl9jZmcuaGVhZF9pZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnJlY29yZF9oZWFkX2lkIHx8IHRoaXMucmVjb3JkX2hlYWRfaWQgIT09IHNod29faGVhZF9pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvcmRfaGVhZF9pZCA9IHNod29faGVhZF9pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRfcmVzX3BhdGggPSBQYXRoVG9vbC5nZXRIZWFkUmVzKHRoaXMucmVjb3JkX2hlYWRfaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAoZGF0YS5pdGVtX2lkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgdmFyIGl0ZW1fY2ZnID0gZ2RhdGEoXCJpdGVtX2RhdGFcIiwgXCJkYXRhX3VuaXQ1XCIsIGRhdGEuaXRlbV9pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgaGVhZF9yZXNfcGF0aCA9IFBhdGhUb29sLmdldEljb25QYXRoKFwiaXRlbVwiLCBpdGVtX2NmZy5pY29uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gICAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhlYWRfcmVzX3BhdGgpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZFJlcyhoZWFkX3Jlc19wYXRoLCBmdW5jdGlvbihoZWFkX3NmKSB7XG4gICAgICAgICAgICAgICAgaWYodGhpcy5yb290X3duZCAmJiB0aGlzLnJvb3Rfd25kLmlzVmFsaWQpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhlYWRfaWNvbl9zcC5zcHJpdGVGcmFtZSA9IGhlYWRfc2Y7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOiDjOaZr1xuICAgICAgICB2YXIgYmFja2dyb3VuZF9yZXMgPSAgUGF0aFRvb2wuZ2V0SXRlbVF1YWxpdHlCRyhzdGFyIC0xKTtcbiAgICAgICAgaWYgKCF0aGlzLnJlY29yZF9yZXNfaWQgfHwgdGhpcy5yZWNvcmRfcmVzX2lkICE9IGJhY2tncm91bmRfcmVzKSB7XG4gICAgICAgICAgICB0aGlzLnJlY29yZF9yZXNfaWQgPSBiYWNrZ3JvdW5kX3JlcztcbiAgICAgICAgICAgIHZhciBjb21tb25fcmVzX3BhdGggPSBQYXRoVG9vbC5nZXRDb21tb25JY29tUGF0aChiYWNrZ3JvdW5kX3Jlcyk7XG4gICAgICAgICAgICB0aGlzLmxvYWRSZXMoY29tbW9uX3Jlc19wYXRoLCBmdW5jdGlvbihzZl9vYmope1xuICAgICAgICAgICAgICAgIGlmKHRoaXMucm9vdF93bmQgJiYgdGhpcy5yb290X3duZC5pc1ZhbGlkKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYWNrZ3JvdW5kX3NwLnNwcml0ZUZyYW1lID0gc2Zfb2JqO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8v44CA6Zi16JClXG4gICAgICAgIHZhciBjYW1wX3R5cGVcbiAgICAgICAgdmFyIHBhcl9jb25maWcgPSBDb25maWcucGFydG5lcl9kYXRhLmRhdGFfcGFydG5lcl9iYXNlW2RhdGEuYmlkXTsgXG4gICAgICAgIGlmIChwYXJfY29uZmlnKXtcbiAgICAgICAgICAgIGNhbXBfdHlwZSA9IHBhcl9jb25maWcuY2FtcF90eXBlXG4gICAgICAgIH1cbiAgICAgICAgaWYoZGF0YS5iaWQgPT0gMCAmJiBkYXRhLmNhbXBfdHlwZSl7XG4gICAgICAgICAgICBjYW1wX3R5cGUgPSBkYXRhLmNhbXBfdHlwZVxuICAgICAgICB9XG4gICAgICAgIGlmIChjYW1wX3R5cGUgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuY29tcF90eXBlX25kLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNhbXBfdHlwZSAmJiB0aGlzLmNvbXBfdHlwZV9uZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcF90eXBlX25kLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdmFyIGNhbXBfcmVzID0gUGF0aFRvb2wuZ2V0SGVyb0NhbXBSZXMoY2FtcF90eXBlKTtcbiAgICAgICAgICAgICAgICB2YXIgY29tbW9uX3Jlc19wYXRoID0gUGF0aFRvb2wuZ2V0VUlJY29uUGF0aChcImNvbW1vblwiLCBjYW1wX3Jlcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkUmVzKGNvbW1vbl9yZXNfcGF0aCwgZnVuY3Rpb24oc2Zfb2JqKXtcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5yb290X3duZCAmJiB0aGlzLnJvb3Rfd25kLmlzVmFsaWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wX3R5cGVfc3Auc3ByaXRlRnJhbWUgPSBzZl9vYmo7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy/noo7niYdcbiAgICAgICAgaWYodGhpcy5jaGlwX3N0YXR1cyAhPSBudWxsKXtcbiAgICAgICAgICAgIHRoaXMuc2hvd0NoaXBJY29uKHRoaXMuY2hpcF9zdGF0dXMpXG4gICAgICAgIH1cbiAgICAgICAgLy8g5pif5pifXG4gICAgICAgIGlmICh0aGlzLmhpZGVfc3Rhcikge1xuICAgICAgICAgICAgdGhpcy5zdGFyc19jb250YWluZXJfbmQuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJzX2NvbnRhaW5lcl9uZC5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTdGFycyhkYXRhLnN0YXIpOyAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgLy8g562J57qnXG4gICAgICAgIGlmIChkYXRhLmxldikge1xuICAgICAgICAgICAgdGhpcy5sZXZlbF9sYi5zdHJpbmcgPSBkYXRhLmxldjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGV2ZWxfbGIuc3RyaW5nID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICAvLyDlm77pibTmmL7npLrlj5jngbDpgLvovpFcbiAgICAgICAgdGhpcy5zZXRIZWFkVW5FbmFibGVkKHRydWUpO1xuICAgICAgICBpZih0aGlzLnJlZF9zdGF0dXMgIT0gbnVsbCl7XG4gICAgICAgICAgICB0aGlzLnNob3dSZWRQb2ludCh0aGlzLnJlZF9zdGF0dXMpXG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGhpcy5zaG93UmVkUG9pbnQoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlnaHRfbmQuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIGlmKHRoaXMuYmdJbWcpe1xuICAgICAgICAgICAgdGhpcy5iZ0ltZy5ub2RlLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMuYmFyTm9kZSl7XG4gICAgICAgICAgICB0aGlzLmJhck5vZGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy5sb2NrX2ljb24pe1xuICAgICAgICAgICAgdGhpcy5sb2NrX2ljb24ubm9kZS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5mcm9tX3R5cGUgPT0gSGVyb0NvbnN0LkV4aGliaXRpb25JdGVtVHlwZS5lSGVyb0JhZykgeyAgICAgICAgICAgLy8g6Iux6ZuE55WM6Z2i5Yik5pat57qi54K5XG4gICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkKGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuc2hvd1JlZFBvaW50KGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChIZXJvQ2FsY3VsYXRlLmdldEluc3RhbmNlKCkuaXNDaGVja0hlcm9SZWRQb2ludEJ5SGVyb1ZvKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlzX3JlZHBvaW50ID0gSGVyb0NhbGN1bGF0ZS5nZXRJbnN0YW5jZSgpLmNoZWNrU2luZ2xlSGVyb1JlZFBvaW50KGRhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1JlZFBvaW50KGlzX3JlZHBvaW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZmlnaHRfbmQuYWN0aXZlID0gdGhpcy5kYXRhLmlzRm9ybURyYW1hKCk7XG5cbiAgICAgICAgfWVsc2UgaWYodGhpcy5mcm9tX3R5cGUgPT0gSGVyb0NvbnN0LkV4aGliaXRpb25JdGVtVHlwZS5lSGVyb0NoYW5nZSl7ICAgICAvLyDoi7Hpm4TovazmjaLnlYzpnaJcbiAgICAgICAgICAgIGlmKHRoaXMubG9ja19pY29uKXtcbiAgICAgICAgICAgICAgICB0aGlzLmxvY2tfaWNvbi5ub2RlLmRlc3Ryb3koKVxuICAgICAgICAgICAgICAgIHRoaXMubG9ja19pY29uID0gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYodGhpcy5sb2NrX2xhYmVsKXtcbiAgICAgICAgICAgICAgICB0aGlzLmxvY2tfbGFiZWwubm9kZS5kZXN0cm95KClcbiAgICAgICAgICAgICAgICB0aGlzLmxvY2tfbGFiZWwgPSBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAtLeiuvue9rumUgeS9j+eKtuaAgVxuICAgICAgICAgICAgdGhpcy5zaG93TG9ja0ljb24oZGF0YS5pc19sb2NrZWQgfHwgZmFsc2UsIGRhdGEubG9ja19zdHIpXG4gICAgICAgICAgICAvLyAtLeiuvue9rumAieS4reeKtuaAgSBcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWQoZGF0YS5pc191aV9zZWxlY3QgPT0gdHJ1ZSlcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZyb21fdHlwZSA9PSBIZXJvQ29uc3QuRXhoaWJpdGlvbkl0ZW1UeXBlLmVQb2tlZGV4KSB7ICAgIC8vIOWbvumJtOeVjOmdouaYr+WQpue9rueBsFxuICAgICAgICAgICAgdGhpcy5zaG93UmVkUG9pbnQoZmFsc2UpO1xuICAgICAgICAgICAgdmFyIGlzX2hhdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciBwYXJfbWF4X3N0YXIgPSB0aGlzLm1vZGVsLmdldEhhZEhlcm9TdGFyQnliaWQoZGF0YS5iaWQpO1xuICAgICAgICAgICAgaWYgKCFwYXJfbWF4X3N0YXIgfHwgcGFyX21heF9zdGFyIDwgZGF0YS5zdGFyKVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVhZFVuRW5hYmxlZChmYWxzZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5mcm9tX3R5cGUgPT0gSGVyb0NvbnN0LkV4aGliaXRpb25JdGVtVHlwZS5lRm9ybUZpZ2h0KSB7ICAvLyDluIPpmLVcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWQoZGF0YS5pc191aV9zZWxlY3QpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZnJvbV90eXBlID09IEhlcm9Db25zdC5FeGhpYml0aW9uSXRlbVR5cGUuZUhlcm9TZWxlY3QpIHsgLy8gXG4gICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkKGRhdGEuaXNfdWlfc2VsZWN0KTtcbiAgICAgICAgICAgIHRoaXMuc2hvd0xvY2tJY29uKGRhdGEuaXNfdWlfbG9jayk7ICAgICAgICAgICAgXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5mcm9tX3R5cGUgPT0gSGVyb0NvbnN0LkV4aGliaXRpb25JdGVtVHlwZS5lVXBTdGFyKSB7ICAgICAvLyDoi7Hpm4TnlJ/mmJ9cbiAgICAgICAgICAgIHRoaXMuc2V0R3JheUhlYWQoZGF0YS5oZWFkX2dyYXkpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZnJvbV90eXBlID09ICBIZXJvQ29uc3QuRXhoaWJpdGlvbkl0ZW1UeXBlLmVIZXJvUmVzZXQpIHsgIC8vIOiLsembhOWIhuino1xuICAgICAgICAgICAgaWYgKCFkYXRhLmlzX3VpX2xvY2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkKGRhdGEuaXNfdWlfc2VsZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2hvd0xvY2tJY29uKGRhdGEuaXNfdWlfbG9jayk7XG4gICAgICAgIH1lbHNlIGlmKHRoaXMuZnJvbV90eXBlID09IEhlcm9Db25zdC5FeGhpYml0aW9uSXRlbVR5cGUuZUV4cGVkaXRGaWdodCl7IC8v6L+c5b6BXG4gICAgICAgICAgICAvLyDooYDmnaFcbiAgICAgICAgICAgIHZhciBibG9vZCA9IDEwMDtcbiAgICAgICAgICAgIGlmKHRoaXMuYm9vbGRfdHlwZSA9PSB0cnVlKXtcbiAgICAgICAgICAgICAgICB2YXIgSGVyb0V4cGVkaXRDb250cm9sbGVyID0gcmVxdWlyZShcImhlcm9leHBlZGl0X2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICAgICAgdmFyIHBhcnRuZXJfaWQgPSBkYXRhLnBhcnRuZXJfaWQ7XG4gICAgICAgICAgICAgICAgaWYoZGF0YS5wYXJ0bmVyX2lkPjEwMDAwMCl7XG4gICAgICAgICAgICAgICAgICAgIHBhcnRuZXJfaWQgPSBkYXRhLnBhcnRuZXJfaWQtMTAwMDAwOyBcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBibG9vZCA9IEhlcm9FeHBlZGl0Q29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0SGVyb0Jsb29kQnlJZChwYXJ0bmVyX2lkLCBkYXRhLnJpZCwgZGF0YS5zcnZfaWQpO1xuICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBzdGF0dXMgPSBIZXJvRXhwZWRpdENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldEhpcmVIZXJvKHBhcnRuZXJfaWQsIGRhdGEucmlkLCBkYXRhLnNydl9pZClcbiAgICAgICAgICAgICAgICBpZihzdGF0dXMgPT0gdHJ1ZSAmJiBkYXRhLmlzX3VzZWQhPW51bGwpe1xuICAgICAgICAgICAgICAgICAgICAvLyAtLSBzZWxmOnNob3dIZWxwSW1nKHRydWUpXG4gICAgICAgICAgICAgICAgICAgIC8vIC0t6L+c5b6B55qE5pSv5o+05qCH5b+XLi4uLi4uMjAxOS4xLjI444CCMjA6MzcgIOaZk+WLpOeJueWcsOWPq+aUueWbnuadpeeahFxuICAgICAgICAgICAgICAgICAgICBpZighdGhpcy5oaXJlSGVybyl7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpcmVIZXJvID0gVXRpbHMuY3JlYXRlSW1hZ2UodGhpcy5yb290X3duZCwgbnVsbCwyMCwgLTYzLCBjYy52MigwLDApKVxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaXJlSGVyby5ub2RlLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkUmVzKFBhdGhUb29sLmdldFVJSWNvblBhdGgoXCJoZXJvZXhwZWRpdFwiLFwidHh0X2hlcm9leHBlZGl0XzFcIiksIChmdW5jdGlvbihyZXNPYmplY3Qpe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaXJlSGVyby5zcHJpdGVGcmFtZSA9IHJlc09iamVjdDtcbiAgICAgICAgICAgICAgICAgICAgfSkuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuaGlyZUhlcm8pe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaXJlSGVyby5ub2RlLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgYmxvb2QgPSBkYXRhLmJsb29kIHx8IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc2hvd1Byb2dyZXNzYmFyKGJsb29kKVxuICAgICAgICAgICAgaWYoYmxvb2QgPD0gMCl7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93U3RyVGlwcyh0cnVlLFV0aWxzLlRJMThOKFwi5bey6Zi15LqhXCIpLHtjM2I6IG5ldyBjYy5Db2xvcigyNTUsMjU1LDI1NSwyNTUpfSlcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1N0clRpcHMoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g6K6+572u6YCJ5Lit54q25oCBIFxuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZChkYXRhLmlzX3VpX3NlbGVjdCA9PSB0cnVlKTtcbiAgICAgICAgfWVsc2UgaWYodGhpcy5mcm9tX3R5cGUgPT0gSGVyb0NvbnN0LkV4aGliaXRpb25JdGVtVHlwZS5lRW5kTGVzc0hlcm8pe1xuICAgICAgICAgICAgLy8g6K6+572u6YCJ5Lit54q25oCBIFxuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZChkYXRhLmlzX3VpX3NlbGVjdCA9PSB0cnVlKTtcbiAgICAgICAgICAgIC8vIOaYr+mbh+S9o+WFtVxuICAgICAgICAgICAgaWYoZGF0YS5pc19lbmRsZXNzKXtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dIZWxwSW1nKHRydWUpO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93SGVscEltZyhmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmKGRhdGEuaHBfcGVyIT1udWxsKXtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dQcm9ncmVzc2JhcihkYXRhLmhwX3Blcik7XG4gICAgICAgICAgICAgICAgaWYoZGF0YS5ocF9wZXIgPD0gMCl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd1N0clRpcHModHJ1ZSxVdGlscy5USTE4TihcIuW3sumYteS6oVwiKSx7YzNiOiBuZXcgY2MuQ29sb3IoMjU1LDI1NSwyNTUsMjU1KX0pXG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd1N0clRpcHMoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmKHRoaXMuZnJvbV90eXBlID09IEhlcm9Db25zdC5FeGhpYml0aW9uSXRlbVR5cGUuZUhlcm9GdXNlKXtcbiAgICAgICAgICAgIHZhciBuZWVkX2NvdW50ID0gZGF0YS5uZWVkX2NvdW50IHx8IDA7XG4gICAgICAgICAgICB2YXIgdG90YWxfY291bnQgPSBkYXRhLnRvdGFsX2NvdW50ICB8fCAwO1xuICAgICAgICAgICAgdmFyIGxhYmVsID0gY2MuanMuZm9ybWF0U3RyKFwiJXMvJXNcIiwgdG90YWxfY291bnQsIG5lZWRfY291bnQpO1xuXG4gICAgICAgICAgICBpZiAoZGF0YS5jdXJfcmVkcG9pbnQgPT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dSZWRQb2ludCh0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93UmVkUG9pbnQoZmFsc2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnNob3dQcm9ncmVzc2Jhcih0b3RhbF9jb3VudCAvIG5lZWRfY291bnQgKiAxMDAsIGxhYmVsKTsgIFxuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZChkYXRhLmlzX3VpX3NlbGVjdCA9PSB0cnVlKVxuICAgICAgICB9ZWxzZSBpZiAodGhpcy5mcm9tX3R5cGUgPT0gSGVyb0NvbnN0LkV4aGliaXRpb25JdGVtVHlwZS5lVm95YWdlKXsgIC8v6L+c6IiqXG4gICAgICAgICAgICB0aGlzLnNob3dTdHJUaXBzKGRhdGEuaW5fdGFzayxVdGlscy5USTE4TihcIuS7u+WKoeS4rVwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWQodGhpcy5pc191aV9zZWxlY3QpO1xuICAgICAgICAgICAgaWYodGhpcy5wZXJjZW50IT1udWxsKXtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dQcm9ncmVzc2Jhcih0aGlzLnBlcmNlbnQsdGhpcy5wZXJjZW50X2xhYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZih0aGlzLnN0cl90aXBzX29iail7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93U3RyVGlwcyh0aGlzLnN0cl90aXBzX29iai5zdGF0dXMsIHRoaXMuc3RyX3RpcHNfb2JqLnN0ciwgdGhpcy5zdHJfdGlwc19vYmouY29sb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIHVuQmluZEV2ZW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YSAmJiB0aGlzLml0ZW1fdXBkYXRlX2V2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEudW5iaW5kKHRoaXMuaXRlbV91cGRhdGVfZXZlbnQpO1xuICAgICAgICAgICAgdGhpcy5pdGVtX3VwZGF0ZV9ldmVudCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgdXBkYXRlU3RhcnM6IGZ1bmN0aW9uKHN0YXJfbnVtKSB7XG4gICAgICAgIHZhciBzdGFyX3JlcyA9IFwiXCI7XG4gICAgICAgIHZhciBzdGFyX3NjYWwgPSAxO1xuICAgICAgICBsZXQgc3RhclxuICAgICAgICB0aGlzLnNwZWNpYWxfbmQuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc3RhcnNfY29udGFpbmVyX25kLndpZHRoID0gMDtcbiAgICAgICAgdGhpcy5zdGFyc19jb250YWluZXJfbmQucmVtb3ZlQWxsQ2hpbGRyZW4oKTtcbiAgICAgICAgaWYgKHN0YXJfbnVtID4gMCAmJiBzdGFyX251bSA8PSA1KSB7XG4gICAgICAgICAgICBzdGFyX3JlcyA9IFwiY29tbW9uXzkwMDc0XCI7XG4gICAgICAgIH0gZWxzZSBpZiAoc3Rhcl9udW0gPiA1ICYmIHN0YXJfbnVtIDw9IDkpIHtcbiAgICAgICAgICAgIHN0YXJfbnVtID0gc3Rhcl9udW0gLSA1O1xuICAgICAgICAgICAgc3Rhcl9yZXMgPSBcImNvbW1vbl85MDA3NVwiO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXJfbnVtID4gOSkge1xuICAgICAgICAgICAgc3RhciA9IHN0YXJfbnVtIC0gMTBcbiAgICAgICAgICAgIHN0YXJfbnVtID0gMTtcbiAgICAgICAgICAgIHN0YXJfcmVzID0gXCJjb21tb25fOTAwNzNcIjtcbiAgICAgICAgICAgIHN0YXJfc2NhbCA9IDEuMjtcbiAgICAgICAgICAgIHRoaXMuc3BlY2lhbF9uZC5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgbGV0IHBhdGhcbiAgICAgICAgICAgIGlmKHN0YXIgPiAwKXtcbiAgICAgICAgICAgICAgICBwYXRoID0gUGF0aFRvb2wuZ2V0VUlJY29uUGF0aChcImNvbW1vblwiLFwiY29tbW9uXzkwMDg0XCIpXG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICBwYXRoID0gUGF0aFRvb2wuZ2V0VUlJY29uUGF0aChcImNvbW1vblwiLFwiY29tbW9uXzkwMDc2XCIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmxvYWRSZXMocGF0aCxmdW5jdGlvbihyZXMpe1xuICAgICAgICAgICAgICAgIHRoaXMuc3BlY2lhbF9zcC5zcHJpdGVGcmFtZSA9IHJlc1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgc3Rhcl9pID0gMDsgc3Rhcl9pIDwgc3Rhcl9udW07IHN0YXJfaSsrKSB7XG4gICAgICAgICAgICB2YXIgc3Rhcl9uZCA9IGNjLmluc3RhbnRpYXRlKHRoaXMuc3Rhcl9pdGVtX25kKTtcbiAgICAgICAgICAgIHN0YXJfbmQuc2NhbGUgPSBzdGFyX3NjYWw7XG4gICAgICAgICAgICB2YXIgc3Rhcl9zcCA9IHN0YXJfbmQuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSk7XG4gICAgICAgICAgICB2YXIgY29tbW9uX3Jlc19wYXRoID0gUGF0aFRvb2wuZ2V0Q29tbW9uSWNvbVBhdGgoc3Rhcl9yZXMpO1xuICAgICAgICAgICAgdGhpcy5sb2FkUmVzKGNvbW1vbl9yZXNfcGF0aCwgZnVuY3Rpb24oc3Rhcl9zcCwgc2Zfb2JqKXtcbiAgICAgICAgICAgICAgICBzdGFyX3NwLnNwcml0ZUZyYW1lID0gc2Zfb2JqO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMsIHN0YXJfc3ApKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5zdGFyc19jb250YWluZXJfbmQuYWRkQ2hpbGQoc3Rhcl9uZCk7XG4gICAgICAgICAgICBpZihzdGFyKXtcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IG5ldyBjYy5Ob2RlKCkgXG4gICAgICAgICAgICAgICAgbm9kZS55ID0gLTFcbiAgICAgICAgICAgICAgICBsZXQgbGFiID0gbm9kZS5hZGRDb21wb25lbnQoY2MuTGFiZWwpXG4gICAgICAgICAgICAgICAgbGFiLnN0cmluZyA9IHN0YXIgXG4gICAgICAgICAgICAgICAgbGFiLmZvbnRTaXplID0gMTU7XG4gICAgICAgICAgICAgICAgbGFiLmxpbmVIZWlnaHQgPSAxNjtcbiAgICAgICAgICAgICAgICBsYWIuaG9yaXpvbnRhbEFsaWduID0gY2MubWFjcm8uVGV4dEFsaWdubWVudC5DRU5URVI7XG4gICAgICAgICAgICAgICAgbGFiLnZlcnRpY2FsQWxpZ24gPSBjYy5tYWNyby5UZXh0QWxpZ25tZW50LkNFTlRFUjtcbiAgICAgICAgICAgICAgICBub2RlLmFkZENvbXBvbmVudChjYy5MYWJlbE91dGxpbmUpLmNvbG9yID0gbmV3IGNjLmNvbG9yKDAsMCwwKTtcbiAgICAgICAgICAgICAgICBzdGFyX25kLmFkZENoaWxkKG5vZGUpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgc2V0SGVhZFVuRW5hYmxlZDogZnVuY3Rpb24oc3RhdHVzKSB7XG4gICAgICAgIHZhciBzcF9zdGF0dXMgPSBjYy5TcHJpdGUuU3RhdGUuTk9STUFMO1xuICAgICAgICBpZiAoIXN0YXR1cykge1xuICAgICAgICAgICAgc3Bfc3RhdHVzID0gY2MuU3ByaXRlLlN0YXRlLkdSQVk7XG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy5oZWFkX2ljb25fc3Ape1xuICAgICAgICAgICAgdGhpcy5oZWFkX2ljb25fc3Auc2V0U3RhdGUoc3Bfc3RhdHVzKTtcbiAgICAgICAgfVxuICAgICAgICBpZih0aGlzLmNvbXBfdHlwZV9zcCl7XG4gICAgICAgICAgICB0aGlzLmNvbXBfdHlwZV9zcC5zZXRTdGF0ZShzcF9zdGF0dXMpO1xuICAgICAgICB9XG5cbiAgICB9LFxuXG4gICAgc2V0U2VsZWN0ZWQ6IGZ1bmN0aW9uKHN0YXR1cykge1xuICAgICAgICBpZiAoIXRoaXMuaXNfYWxsb3dfc2VsZWN0KSByZXR1cm47XG4gICAgICAgIHRoaXMuaXNfdWlfc2VsZWN0ID0gc3RhdHVzXG4gICAgICAgIGlmKHRoaXMucm9vdF93bmQ9PW51bGwpe1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RfaXRlbV9uZC5hY3RpdmUgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RfaXRlbV9uZC5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXRSb290UG9zaXRpb246IGZ1bmN0aW9uKHBvcykge1xuICAgICAgICBpZiAoIXBvcykgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5yb290X3duZCkge1xuICAgICAgICAgICAgdGhpcy5zZXRQb3NpdGlvbihwb3MueCxwb3MueSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VyX3BvcyA9IHBvcztcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXRSb290U2NhbGU6IGZ1bmN0aW9uKHNjYWxlKSB7XG4gICAgICAgIGlmICghc2NhbGUpIHJldHVybjtcbiAgICAgICAgdGhpcy5zY2FsZSA9IHNjYWxlO1xuICAgICAgICBpZiAodGhpcy5yb290X3duZCkge1xuICAgICAgICAgICAgdGhpcy5yb290X3duZC5zY2FsZSA9IHNjYWxlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldFdvcmxkUG9zOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMucm9vdF93bmQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3Rfd25kLmNvbnZlcnRUb1dvcmxkU3BhY2VBUihjYy52MigwLCAwKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcblxuICAgIHVwZGFnZVBvc2l0b246IGZ1bmN0aW9uKG5ld19wb3MpIHtcbiAgICAgICAgaWYgKCFuZXdfcG9zKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLnJvb3Rfd25kKVxuICAgICAgICAgICAgdGhpcy5yb290X3duZC5zZXRQb3NpdGlvbihuZXdfcG9zKTtcbiAgICB9LFxuXG4gICAgYWRkVm9CaW5kRXZlbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5kYXRhICYmIHRoaXMuZGF0YS5pZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbV91cGRhdGVfZXZlbnQpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMuaXRlbV91cGRhdGVfZXZlbnQgPSAgdGhpcy5kYXRhLmJpbmQodGhpcy5kYXRhLlVQREFURV9QQVJUTkVSX0FUVFIsIGZ1bmN0aW9uKGhlcm9fdm8pIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yb290X3duZClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXREYXRhKGhlcm9fdm8pO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNldERlZmF1bHRIZWFkOiBmdW5jdGlvbihpY29uX3BhdGgpIHtcbiAgICAgICAgaWYgKGljb25fcGF0aClcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdF9wYXRoID0gaWNvbl9wYXRoO1xuICAgIH0sXG5cbiAgICBzZXRHcmF5SGVhZDogZnVuY3Rpb24oc3RhdHVzKSB7XG4gICAgICAgIHZhciBzcF9zdGF0ZSAgPSBjYy5TcHJpdGUuU3RhdGUuTk9STUFMO1xuICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICAgc3Bfc3RhdGUgPSBjYy5TcHJpdGUuU3RhdGUuR1JBWTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhlYWRfaWNvbl9zcC5zZXRTdGF0ZShzcF9zdGF0ZSk7XG4gICAgfSxcbiAgICAvLyAtLeiuvue9rumUgVxuICAgIHNob3dMb2NrSWNvbihib29sLHN0cil7XG4gICAgICAgIHZhciBzZWxmID0gdGhpc1xuICAgICAgICBpZiAoYm9vbCA9PSBmYWxzZSAmJiAhc2VsZi5sb2NrX2ljb24pIHJldHVybiBcbiAgICAgICAgaWYgKCFzZWxmLmxvY2tfaWNvbil7XG4gICAgICAgICAgICBsZXQgcmVzID0gUGF0aFRvb2wuZ2V0VUlJY29uUGF0aChcImNvbW1vblwiLFwiY29tbW9uXzkwMDA5XCIpXG4gICAgICAgICAgICBsZXQgc2l6ZSA9IGNjLnNpemUodGhpcy5yb290X3duZC53aWR0aCx0aGlzLnJvb3Rfd25kLmhlaWdodClcbiAgICAgICAgICAgIHNlbGYubG9ja19pY29uID0gVXRpbHMuY3JlYXRlSW1hZ2Uoc2VsZi5yb290X3duZCxyZXMsMCwwLGNjLnYyKDAuNSwwLjUpLHRydWUsMCxmYWxzZSlcbiAgICAgICAgICAgIHRoaXMubG9hZFJlcyhyZXMsIChmdW5jdGlvbihyZXNPYmplY3Qpe1xuICAgICAgICAgICAgICAgIHNlbGYubG9ja19pY29uLnNwcml0ZUZyYW1lID0gcmVzT2JqZWN0O1xuICAgICAgICAgICAgfSkuYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0cil7XG4gICAgICAgICAgICBpZiAoIXNlbGYubG9ja19sYWJlbCl7IFxuICAgICAgICAgICAgICAgIHNlbGYubG9ja19sYWJlbCA9IFV0aWxzLmNyZWF0ZUxhYmVsKDIyLENvbmZpZy5jb2xvcl9kYXRhLmRhdGFfY29sb3IxNlsxXSxDb25maWcuY29sb3JfZGF0YS5kYXRhX2NvbG9yNFs5XSxzaXplLndpZHRoLzIsMjIsXCJcIix0aGlzLnJvb3Rfd25kLDIsIGNjLnYyKDAuNSwwKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlbGYubG9ja19sYWJlbC5zdHJpbmcgPSBzdHIgXG4gICAgICAgIH1cblxuICAgICAgICBzZWxmLmxvY2tfaWNvbi5ub2RlLmFjdGl2ZSA9IGJvb2xcblxuICAgICAgICAvLyAtLSDplIHkvY/nmoTml7blgJnmn5Dkupvpg6jliIbopoHnva7ngbBcbiAgICAgICAgc2VsZi5zZXRIZWFkVW5FbmFibGVkKCFib29sKVxuICAgICAgICBpZiAoc2VsZi5wYXJ0bmVyX3R5cGUpe1xuICAgICAgICAgICAgLy8gc2V0Q2hpbGRVbkVuYWJsZWQoYm9vbCwgc2VsZi5wYXJ0bmVyX3R5cGUpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlbGYubG9ja19sYWJlbCl7ICBcbiAgICAgICAgICAgIHNlbGYubG9ja19sYWJlbC5ub2RlLmFjdGl2ZSA9IGJvb2xcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDmmL7npLrmlK/mj7Tlm77niYdcbiAgICBzaG93SGVscEltZzpmdW5jdGlvbihib29sKXtcbiAgICAgICAgaWYoYm9vbCA9PSBmYWxzZSAmJiAhdGhpcy5oZWxwX2ltZylyZXR1cm47XG4gICAgICAgIGlmKCF0aGlzLmhlbHBfaW1nKXtcbiAgICAgICAgICAgIHZhciByZXMgPSBQYXRoVG9vbC5nZXRDb21tb25JY29tUGF0aChcInR4dF9jbl9jb21tb25fOTAwMTRcIilcbiAgICAgICAgICAgIHRoaXMuaGVscF9pbWcgPSBVdGlscy5jcmVhdGVJbWFnZSh0aGlzLnJvb3Rfd25kLHJlcywtdGhpcy5yb290X3duZC53aWR0aC8yKzIwLCAtdGhpcy5yb290X3duZC5oZWlnaHQvMisyMCxjYy52MigwLjUsMC41KSx0cnVlLDAsZmFsc2UpXG4gICAgICAgICAgICB0aGlzLmxvYWRSZXMocmVzLCAoZnVuY3Rpb24ocmVzT2JqZWN0KXtcbiAgICAgICAgICAgICAgICB0aGlzLmhlbHBfaW1nLnNwcml0ZUZyYW1lID0gcmVzT2JqZWN0O1xuICAgICAgICAgICAgfSkuYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oZWxwX2ltZy5ub2RlLmFjdGl2ZSA9IGJvb2w7XG4gICAgfSxcblxuICAgIC8vIEBwZXJjZW50IOeZvuWIhuavlFxuICAgIC8vIEBsYWJlbCDov5vluqbmnaHkuK3pl7TmloflrZfmj4/ov7BcbiAgICBzaG93UHJvZ3Jlc3NiYXI6ZnVuY3Rpb24ocGVyY2VudCwgbGFiZWwpe1xuICAgICAgICB0aGlzLnBlcmNlbnQgPSBwZXJjZW50O1xuICAgICAgICB0aGlzLnBlcmNlbnRfbGFiID0gbGFiZWw7XG5cbiAgICAgICAgaWYoIXRoaXMucm9vdF93bmQpcmV0dXJuO1xuXG4gICAgICAgIHZhciBzaXplID0gY2Muc2l6ZSgxMTgsIDE1KVxuICAgICAgICBpZih0aGlzLmJnSW1nKXtcbiAgICAgICAgICAgIHRoaXMuYmdJbWcubm9kZS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMuYmFyTm9kZSl7XG4gICAgICAgICAgICB0aGlzLmJhck5vZGUuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZighdGhpcy5jb21wX2Jhcil7XG4gICAgICAgICAgICB2YXIgcmVzID0gUGF0aFRvb2wuZ2V0Q29tbW9uSWNvbVBhdGgoXCJjb21tb25fOTAwMDVcIilcbiAgICAgICAgICAgIHZhciByZXMxID0gUGF0aFRvb2wuZ2V0Q29tbW9uSWNvbVBhdGgoXCJjb21tb25fOTAwMDZcIilcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5iZ0ltZyA9IFV0aWxzLmNyZWF0ZUltYWdlKHRoaXMucm9vdF93bmQsbnVsbCwwLC10aGlzLnJvb3Rfd25kLmhlaWdodC8yLXNpemUuaGVpZ2h0LzItMixjYy52MigwLjUsMC41KSx0cnVlLDAsdHJ1ZSlcbiAgICAgICAgICAgIHRoaXMuYmdJbWcubm9kZS5zZXRDb250ZW50U2l6ZShzaXplLndpZHRoKzIsc2l6ZS5oZWlnaHQrMik7XG4gICAgICAgICAgICB0aGlzLmxvYWRSZXMocmVzLCAoZnVuY3Rpb24ocmVzT2JqZWN0KXtcbiAgICAgICAgICAgICAgICB0aGlzLmJnSW1nLnNwcml0ZUZyYW1lID0gcmVzT2JqZWN0O1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKSlcblxuICAgICAgICAgICAgdGhpcy5iYXJOb2RlID0gbmV3IGNjLk5vZGUoKTtcbiAgICAgICAgICAgIHRoaXMuYmFyTm9kZS5zZXRBbmNob3JQb2ludChjYy52MigwLjUsMC41KSk7XG4gICAgICAgICAgICB0aGlzLmJhck5vZGUuc2V0Q29udGVudFNpemUoc2l6ZSk7XG4gICAgICAgICAgICB0aGlzLmJhck5vZGUuc2V0UG9zaXRpb24oMCwtdGhpcy5yb290X3duZC5oZWlnaHQvMi1zaXplLmhlaWdodC8yLTIpO1xuICAgICAgICAgICAgdGhpcy5yb290X3duZC5hZGRDaGlsZCh0aGlzLmJhck5vZGUpO1xuXG4gICAgICAgICAgICB2YXIgYmFySW1nID0gdGhpcy5iYXJOb2RlLmFkZENvbXBvbmVudChjYy5TcHJpdGUpO1xuICAgICAgICAgICAgYmFySW1nLnR5cGUgPSBjYy5TcHJpdGUuVHlwZS5TTElDRUQ7XG4gICAgICAgICAgICBiYXJJbWcuc2l6ZU1vZGUgPSBjYy5TcHJpdGUuU2l6ZU1vZGUuQ1VTVE9NO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLmxvYWRSZXMocmVzMSwgKGZ1bmN0aW9uKHJlc09iamVjdCl7XG4gICAgICAgICAgICAgICAgYmFySW1nLnNwcml0ZUZyYW1lID0gcmVzT2JqZWN0O1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKSk7XG5cbiAgICAgICAgICAgIHZhciBjb21wX2JhciA9IHRoaXMuYmFyTm9kZS5hZGRDb21wb25lbnQoY2MuUHJvZ3Jlc3NCYXIpO1xuICAgICAgICAgICAgY29tcF9iYXIuYmFyU3ByaXRlID0gYmFySW1nO1xuICAgICAgICAgICAgY29tcF9iYXIubW9kZSA9IGNjLlByb2dyZXNzQmFyLk1vZGUuSE9SSVpPTlRBTDtcbiAgICAgICAgICAgIGNvbXBfYmFyLnRvdGFsTGVuZ3RoID0gc2l6ZS53aWR0aDtcbiAgICAgICAgICAgIHRoaXMuY29tcF9iYXIgPSBjb21wX2JhcjtcbiAgICAgICAgfVxuICAgICAgICBpZih0aGlzLmNvbXBfYmFyX2xhYmVsKXtcbiAgICAgICAgICAgIHRoaXMuY29tcF9iYXJfbGFiZWwuc3RyaW5nID0gXCJcIlxuICAgICAgICB9XG4gICAgICAgIGlmKGxhYmVsKXtcbiAgICAgICAgICAgIGlmKCF0aGlzLmNvbXBfYmFyX2xhYmVsKXtcbiAgICAgICAgICAgICAgICB2YXIgdGV4dF9jb2xvciA9IG5ldyBjYy5Db2xvcigyNTUsMjU1LDI1NSwyNTUpXG4gICAgICAgICAgICAgICAgdmFyIGxpbmVfY29sb3IgPSBuZXcgY2MuQ29sb3IoMCwwLDAsMjU1KVxuICAgICAgICAgICAgICAgIHZhciBzaXplID0gY2Muc2l6ZSgxMTgsIDE5KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBfYmFyX2xhYmVsID0gVXRpbHMuY3JlYXRlTGFiZWwoMTgsdGV4dF9jb2xvciwgbGluZV9jb2xvcixzaXplLndpZHRoLzIsIDAsXCJcIix0aGlzLmNvbXBfYmFyLm5vZGUsMixjYy52MigwLjUsIDAuNSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb21wX2Jhcl9sYWJlbC5zdHJpbmcgPSBsYWJlbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbXBfYmFyLnByb2dyZXNzID0gcGVyY2VudC8xMDA7XG4gICAgfSxcblxuICAgIC8vICDmmL7npLrmloflrZfmj5DnpLpcbiAgICBzaG93U3RyVGlwczpmdW5jdGlvbiggc3RhdHVzLCBzdHIsIGNvbG9yICl7XG4gICAgICAgIHRoaXMuc3RyX3RpcHNfb2JqID0ge3N0YXR1czpzdGF0dXMsc3RyOnN0cixjb2xvcjpjb2xvcn07XG4gICAgICAgIGlmKCF0aGlzLnJvb3Rfd25kKXJldHVybjtcbiAgICAgICAgaWYoc3RhdHVzKXtcbiAgICAgICAgICAgIGlmKHRoaXMubGF5X3RpcHMgPT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXlfdGlwcyA9IG5ldyBjYy5Ob2RlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXlfdGlwcy5zZXRBbmNob3JQb2ludChjYy52MigwLjUsMC41KSlcbiAgICAgICAgICAgICAgICB2YXIgc2l6ZSA9IHRoaXMucm9vdF93bmQuZ2V0Q29udGVudFNpemUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxheV90aXBzLnNldENvbnRlbnRTaXplKHNpemUpXG4gICAgICAgICAgICAgICAgdGhpcy5sYXlfdGlwcy5zZXRQb3NpdGlvbigwLDApIFxuICAgICAgICAgICAgICAgIHZhciBncmFwaGljc19jcCA9IHRoaXMubGF5X3RpcHMuYWRkQ29tcG9uZW50KGNjLkdyYXBoaWNzKTtcbiAgICAgICAgICAgICAgICBncmFwaGljc19jcC5jbGVhcigpO1xuICAgICAgICAgICAgICAgIGdyYXBoaWNzX2NwLmZpbGxDb2xvciA9IGNjLmNvbG9yKDAsIDAsIDAsIDE1MCk7XG4gICAgICAgICAgICAgICAgZ3JhcGhpY3NfY3AucmVjdCgtc2l6ZS53aWR0aC8yLCAtc2l6ZS5oZWlnaHQvMiwgc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpO1xuICAgICAgICAgICAgICAgIGdyYXBoaWNzX2NwLmZpbGwoKTtcblxuICAgICAgICAgICAgICAgIHZhciBjM2IgPSBuZXcgY2MuQ29sb3IoMjU1LDI1NSwyNTUsMjU1KTtcbiAgICAgICAgICAgICAgICB2YXIgZW5hYmxlID0gbmV3IGNjLkNvbG9yKDEzMiwwLDAsMjU1KTtcbiAgICAgICAgICAgICAgICBpZihjb2xvcil7XG4gICAgICAgICAgICAgICAgICAgIGMzYiA9IGNvbG9yLmMzYiB8fCBjM2I7XG4gICAgICAgICAgICAgICAgICAgIGVuYWJsZSA9IGNvbG9yLmVuYWJsZSB8fCBlbmFibGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHZhciB0aXBzX3RleHQgPSBVdGlscy5jcmVhdGVMYWJlbCgyNixjM2IsZW5hYmxlLDAsMCxzdHIsdGhpcy5sYXlfdGlwcywxLGNjLnYyKDAuNSwgMC41KSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yb290X3duZC5hZGRDaGlsZCh0aGlzLmxheV90aXBzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5sYXlfdGlwcy5hY3RpdmUgPSB0cnVlO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGlmKHRoaXMubGF5X3RpcHMpe1xuICAgICAgICAgICAgICAgIHRoaXMubGF5X3RpcHMuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZmluZFVzZVNraW46ZnVuY3Rpb24oaW5mbyl7XG4gICAgICAgIGlmKGluZm8uZXh0X2RhdGEpe1xuICAgICAgICAgICAgbGV0IGV4dCA9IGluZm8uZXh0X2RhdGEgfHwge307XG4gICAgICAgICAgICBmb3IobGV0IGkgaW4gZXh0KXtcbiAgICAgICAgICAgICAgICBsZXQgdiA9IGV4dFtpXTtcbiAgICAgICAgICAgICAgICBpZih2LmtleSA9PSA1KXtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYudmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZihpbmZvLmV4dCAhPSBudWxsKXtcbiAgICAgICAgICAgIGxldCBleHQgPSBpbmZvLmV4dCB8fCB7fTtcbiAgICAgICAgICAgIGZvcihsZXQgaSBpbiBleHQpe1xuICAgICAgICAgICAgICAgIGxldCB2ID0gZXh0W2ldO1xuICAgICAgICAgICAgICAgIGlmKHYua2V5ID09IDUpe1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdi52YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBcbiAgICAgICAgfVxuICAgICAgICBpZihpbmZvLnVzZV9za2luKXtcbiAgICAgICAgICAgIHJldHVybiBpbmZvLnVzZV9za2luXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDBcbiAgICB9LFxuXG4gICAgZ2V0RGF0YSgpe1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhIHx8IHt9XG4gICAgfSxcblxuICAgIHNob3dSZWRQb2ludDogZnVuY3Rpb24oc3RhdHVzKSB7XG4gICAgICAgIHRoaXMucmVkX3N0YXR1cyA9IHN0YXR1cztcbiAgICAgICAgaWYgKHRoaXMucmVkX2ljb25fbmQpXG4gICAgICAgICAgICB0aGlzLnJlZF9pY29uX25kLmFjdGl2ZSA9ICEhc3RhdHVzO1xuICAgIH0sXG5cbiAgICBzaG93Q2hpcEljb24oc3RhdHVzKXtcbiAgICAgICAgdGhpcy5jaGlwX3N0YXR1cyA9IHN0YXR1c1xuICAgICAgICBpZih0aGlzLmNoaXBfaWNvbl9uZCl7XG4gICAgICAgICAgICB0aGlzLmNoaXBfaWNvbl9uZC5hY3RpdmUgPSBzdGF0dXM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gc2hvd0xvY2tJY29uOiBmdW5jdGlvbihzdGF0dXMpIHtcbiAgICAvLyAgICAgdGhpcy5sb2NrX2l0ZW1fbmQuYWN0aXZlID0gc3RhdHVzO1xuICAgIC8vICAgICB0aGlzLmxvY2tfaXRlbV9zcC5zZXRTdGF0ZSghc3RhdHVzKTtcbiAgICAvLyAgICAgaWYgKHN0YXR1cykge1xuICAgIC8vICAgICAgICAgdGhpcy5zZXRIZWFkVW5FbmFibGVkKGZhbHNlKTtcbiAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAvLyAgICAgICAgIHRoaXMuc2V0SGVhZFVuRW5hYmxlZCh0cnVlKTtcbiAgICAvLyAgICAgfVxuICAgIC8vIH0sXG5cbn0pIl19