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
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/mainui/view/mainui_view.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, '38ef2+1QgRNDLjp7wanRv/f', 'mainui_view');
// Scripts/mod/mainui/view/mainui_view.js
 
"use strict";
 
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
 
// --------------------------------------------------------------------
// @author: shiraho@syg.com(必填, 创建模块的人员)
// @description:
//      主界面控制
// <br/>Create: new Date().toISOString()
// --------------------------------------------------------------------
var LoaderManager = require("loadermanager");
 
var PathTool = require("pathtool");
 
var PlayerHead = require("playerhead");
 
var MainUiConst = require("mainui_const");
 
var BattleConst = require("battle_const");
 
var RoleController = require("role_controller");
 
var ExchangeController = require("exchange_controller");
 
var FunctionIconVo = require("function_icon_vo");
 
var ChatController = require("chat_controller");
 
var ExchangeEvent = require("exchange_event");
 
var LoginController = require("login_controller");
 
var MainuiEvent = require("mainui_event");
 
var PromptEvent = require("prompt_event");
 
var PromptController = require("prompt_controller");
 
var MainUIView = cc.Class({
  "extends": BaseClass,
  ctor: function ctor() {
    this.rleasePrefab = false;
    this.initConfig();
    this.createRootWnd();
  },
  // cc.sys.getSafeAreaRect()
  initConfig: function initConfig() {
    this.bottom_btn_list = []; // 下面7个标签页
 
    this.cur_select_index = 0;
    this.render_list = []; // 待添加的实例对象
 
    this.render_list_dic = {}; // 但添加实例字典
 
    this.function_list = {}; //显示的实例对象
 
    this.icon_container_list = {}; //根据方位保存需要储存的图标的父节点
 
    this.icon_widget_list = {}; //根据方位保存需要储存的图标的widget节点
 
    this.btn_cache_tips = {}; //红点缓存
 
    this.left_off = 20;
    this.right_off = 20;
    this.left_max_sum = 7;
    this.is_in_shrink = false;
    this.is_shrink = false;
    this.layout_list = {};
  },
  createRootWnd: function createRootWnd() {
    // this.node = new cc.Node("base_root");
    // this.node.setAnchorPoint(0, 0);
    // this.node.setContentSize(SCREEN_WIDTH, SCREEN_HEIGHT);
    // this.node.setPosition(-SCREEN_WIDTH * 0.5, -SCREEN_HEIGHT * 0.5);
    // ViewManager.getInstance().addToSceneNode(this.node, SCENE_TAG.top)
    // 获取一些需要使用的单例
    this.mainui_controller = require("mainui_controller").getInstance();
    this.battle_controller = require("battle_controller").getInstance();
    var prefabPath = PathTool.getPrefabPath("mainui", "mainui_view");
    LoaderManager.getInstance().loadRes(prefabPath, function (res_object) {
      this.initMainUI(res_object);
    }.bind(this));
  },
  initMainUI: function initMainUI(res_object) {
    var _this = this;
 
    this.root_wnd = res_object;
 
    if (!window.isMobile) {
      this.root_wnd.getComponent(cc.Widget).enabled = false;
    }
 
    this.root_wnd.setPosition(-SCREEN_WIDTH * 0.5, -SCREEN_HEIGHT * 0.5); // this.node.addChild(this.root_wnd);
 
    ViewManager.getInstance().addToSceneNode(this.root_wnd, SCENE_TAG.top);
    if (this.root_wnd_cb) this.root_wnd_cb(this.root_wnd); // 下部分的7个按钮
 
    this.bottom_container = this.root_wnd.getChildByName("bottom_container");
    this.btn_con = this.bottom_container.getChildByName("bnt_con"); // gcore.Timer.set(function(){        
    //     var btn_lo =  this.btn_con.getComponent(cc.Layout);
    //     var spcingX = (this.btn_con.width - btn_lo.paddingLeft - btn_lo.paddingRight - (93 * 6 + 105))/6;
    //     btn_lo.spacingX = spcingX;
    //     cc.log(spcingX);
    // }.bind(this), 0.2)
 
    if (window.isMobile && window.FIT_HEIDGHT) {
      var btn_lo = this.btn_con.getComponent(cc.Layout);
      var spcingX = (SCREEN_WIDTH * FIT_SCALE - btn_lo.paddingLeft - btn_lo.paddingRight - (93 * 6 + 105)) / 6;
      btn_lo.spacingX = spcingX;
    }
 
    var _loop = function _loop(index) {
      btn = _this.btn_con.getChildByName("mainui_tab_" + (index + 1));
 
      if (btn) {
        tips_point = btn.getChildByName("tips_point");
        normal = btn.getChildByName("normal");
        selected = btn.getChildByName("selected");
        icon = btn.getChildByName("icon");
        notice = btn.getChildByName("notice");
        init_x = btn.getPosition().x;
        init_y = btn.getPosition().y;
        _this.bottom_btn_list[index] = {
          btn: btn,
          index: index,
          tips_point: tips_point,
          normal: normal,
          selected: selected,
          icon: icon,
          notice: notice,
          tips_status: false,
          init_x: init_x,
          init_y: init_y
        };
        var config = Config.function_data.data_base[index + 1];
 
        if (config && config.activate) {
          _this.bottom_btn_list[index].config = config;
 
          if (_this.bottom_btn_list[index].notice) {
            _this.bottom_btn_list[index].notice.getComponent(cc.Label).string = config.label;
          }
        }
 
        btn.on(cc.Node.EventType.TOUCH_END, function (event) {
          this.changeMainUiStatus(index);
        }.bind(_this));
 
        if (index == MainUiConst.btn_index.main_scene) {
          _this.setMaiuiBtnStatus(index);
        } else if (index == MainUiConst.btn_index.drama_scene) {
          _this.bottom_btn_list[index].skeleton = icon.getComponent(sp.Skeleton);
        }
 
        if (index == 0) {
          _this.cur_select_index = index;
          _this.cur_select_btn = _this.bottom_btn_list[index];
          _this.cur_select_btn.normal.active = false;
          _this.cur_select_btn.selected.active = true;
          btn.y = _this.bottom_btn_list[index].init_y + 10;
        }
      }
    };
 
    for (var index = 0; index < 7; index++) {
      var btn;
      var tips_point;
      var normal;
      var selected;
      var icon;
      var notice;
      var init_x;
      var init_y;
 
      _loop(index);
    } // 上部分的显示
 
 
    this.top_container = this.root_wnd.getChildByName("top_container");
    this.exp_bar = this.top_container.getChildByName("exp_bar");
    var exp_nd = this.top_container.getChildByName("exp_bar");
    gcore.Timer.set(function () {
      var exp_wdg = exp_nd.getComponent(cc.Widget);
      this.exp_bar.width = this.root_wnd.width - exp_wdg.left;
    }.bind(this), 0.1);
    this.fight_con = this.top_container.getChildByName("fight_con");
    this.coin_touch = this.top_container.getChildByName("coin_touch"); // 金币点击区域
 
    this.gold_touch = this.top_container.getChildByName("gold_touch"); // 钻石点击区域
 
    this.Sprite_8 = this.coin_touch.getChildByName("Sprite_8"); // 金币加号
 
    this.Sprite_10 = this.gold_touch.getChildByName("Sprite_10"); // 钻石加号
 
    this.coin_redpoint = this.coin_touch.getChildByName("Sprite_8").getChildByName("redPoint"); //点金红点
 
    this.coin_redpoint.active = ExchangeController.getInstance().getModel().getRedStatus();
    this.head_container = this.top_container.getChildByName("head_container"); // 头像部分
 
    this.player_head = new PlayerHead();
    this.player_head.setParent(this.head_container);
    this.player_head.show();
    this.info_container = this.top_container.getChildByName("info_container");
    this.lev_label = this.info_container.getChildByName("lev_label").getComponent(cc.Label); // 角色等级
 
    this.name_label = this.info_container.getChildByName("name_label").getComponent(cc.Label); // 角色名字
 
    this.coin_label_nd = this.coin_touch.getChildByName("wealth_label_1"); // 金币数量
 
    this.gold_label_nd = this.gold_touch.getChildByName("wealth_label_2"); // 钻石数量
 
    this.coin_label = this.coin_label_nd.getComponent(cc.Label); // 金币数量
 
    this.gold_label = this.gold_label_nd.getComponent(cc.Label); // 钻石数量
 
    this.fight_label = this.fight_con.getChildByName("fight_label").getComponent(cc.Label); // 战力
 
    this.coin_nd = this.coin_touch.getChildByName("Sprite_2"); // 金币node
 
    this.gold_nd = this.gold_touch.getChildByName("Sprite_4"); // 钻石node
 
    this.coin_sp = this.coin_nd.getComponent(cc.Sprite); // 金币图标
 
    this.gold_sp = this.gold_nd.getComponent(cc.Sprite); // 钻石图标
 
    this.hide_container = this.root_wnd.getChildByName("hide_container");
    this.handle_btn = this.hide_container.getChildByName("handle_btn"); //系统提示
 
    this.prompt_container = this.hide_container.getChildByName("prompt_container");
    this.prompt_tips_layout = this.prompt_container.getChildByName("tips_layout");
    this.prompt_bubble_layout = this.prompt_container.getChildByName("bubble_layout");
    this.prompt_tips_btn = this.prompt_container.getChildByName("tips_btn");
    this.prompt_desc = this.prompt_bubble_layout.getChildByName("desc").getComponent(cc.Label);
    this.prompt_bubble = this.prompt_bubble_layout.getChildByName("bubble");
    this.prompt_bubble_size = this.prompt_bubble.getContentSize();
    this.prompt_tips_scroll = this.prompt_tips_layout.getChildByName("tips_scroll");
    this.prompt_tips_scroll_size = this.prompt_tips_scroll.getContentSize();
    this.count_size_label = this.prompt_tips_layout.getChildByName("count_size_label").getComponent(cc.Label);
    this.prompt_tips_bg = this.prompt_tips_layout.getChildByName("tips_bg");
    this.prompt_tips_bg_size = this.prompt_tips_bg.getContentSize();
    this.prompt_tips_btn.active = false;
    this.prompt_tips_layout.active = false;
    this.prompt_mask = this.hide_container.getChildByName("prompt_mask"); // 可控部分,需要隐藏或者显示
 
    this.hide_container = this.root_wnd.getChildByName("hide_container"); // 可隐藏部分
 
    this.handle_btn = this.hide_container.getChildByName("handle_btn"); // 下面控制按钮
    //创建聊天按钮
 
    this.creatorChatBtn(); // this.chat_btn_nd = this.hide_container.getChildByName("chat_btn");
 
    RedMgr.getInstance().addCalHandler(this.updateChatMsgNum.bind(this)); // 战力相关
    // this.power_show_nd = this.root_wnd.getChildByName("power_show");
    // this.power_sk = this.power_show_nd.getChildByName("ani_con").getComponent(sp.Skeleton);
    // var tex_con_nd = this.power_show_nd.getChildByName("txt_con");
    // this.old_power_rb = tex_con_nd.getChildByName("old_power").getComponent(cc.RichText);
    // this.add_power_lb = tex_con_nd.getChildByName("add_power").getComponent(cc.Label);
 
    this.updateHandleBtnShowStatus(); // this.chat_red_bg = this.chat_btn_nd.getChildByName("chat_red_bg");
    // this.chat_red_num = this.chat_red_bg.getChildByName("chat_red_num").getComponent(cc.Label);
 
    if (USE_SDK == true && PLATFORM_TYPR == "SH_SDK") {
      //创建深海小程序客服浮标 
      this.creatorCustomerServiceBtn();
    }
 
    this.image_2 = this.top_container.getChildByName("Image_2");
    this.vip_label = this.image_2.getChildByName("vip_label").getComponent("CusRichText");
 
    for (var k in FunctionIconVo.type) {
      var v = FunctionIconVo.type[k];
      var icon_container = this.hide_container.getChildByName("icon_container_" + v);
 
      if (icon_container) {
        this.icon_container_list[v] = icon_container;
        var _x = 0;
        var _y = 0;
 
        if (v == FunctionIconVo.type.right_top_1) {
          _x = -8;
          _y = this.top_container.getContentSize().height + 15;
        } else if (v == FunctionIconVo.type.right_top_2) {
          _x = -8;
          _y = this.top_container.getContentSize().height - 100;
        } else if (v == FunctionIconVo.type.right_bottom_1) {
          _x = -45 - 57; // _y = this.bottom_container.getContentSize().height + 60;
 
          _y = icon_container.y;
        } else if (v == FunctionIconVo.type.right_bottom_2) {
          _x = 320.5; // _y = this.bottom_container.getContentSize().height + 60 + 55;
 
          _y = -367;
        } // icon_container.setPosition(_x, _y);
 
 
        var icon_widget = icon_container.getComponent(cc.Widget);
 
        if (icon_widget) {
          this.icon_widget_list[v] = icon_widget;
        }
      }
    }
 
    this.role_vo = RoleController.getInstance().getRoleVo();
    LoaderManager.getInstance().loadRes(PathTool.getItemRes("1"), function (res) {
      this.coin_sp.spriteFrame = res;
    }.bind(this));
    LoaderManager.getInstance().loadRes(PathTool.getItemRes("3"), function (res) {
      this.gold_sp.spriteFrame = res;
    }.bind(this)); // 加载完成之后注册监听
 
    this.registerEvent(); // 创建挑战按钮
 
    this.createChallengeEffect();
    this.updateRoleData();
    this.max_dun_id = this.mainui_controller.max_dun_id;
 
    if (this.max_dun_id != null) {
      this.checkUnLockStatus(this.max_dun_id);
    } // -- 判断等级解锁主按钮
 
 
    this.checkUnLockStatusByLev(); // -- 所有活动的时间倒计时,统一用一个定时器在这里做处理
 
    if (this.function_time_ticket == null) {
      this.action_list = require("action_controller").getInstance().getAllActionList();
      this.function_time_ticket = gcore.Timer.set(function () {
        this.functionTimeTicketList();
      }.bind(this), 1000, -1);
    }
 
    if (USE_SDK == true && NEED_ADAPTIVE_SDK[window.PLATFORM_TYPR]) {
      this.coin_nd.x = -28; // this.gold_nd.x = -28;
 
      this.coin_label_nd.x = 29; // this.gold_label_nd.x = 29;
 
      this.Sprite_8.x = -60; // this.Sprite_10.x = -60;
 
      this.Sprite_10.active = false;
    } // 小游戏需要调整顶部栏
 
 
    if (window.PLATFORM_TYPR == "WX_SDK" || window.PLATFORM_TYPR == "SH_SDK" || PLATFORM_TYPR == "QQ_SDK") {
      if (window.WX_FIT) {
        var add_val = this.root_wnd.height * window.WX_FIT;
        cc.log("微信小游戏适配菜单栏");
        console.log("add_val");
        var top_wdg = this.top_container.getComponent(cc.Widget);
        var con1_wdg = this.icon_container_list[1].getComponent(cc.Widget);
        top_wdg.top += add_val;
        con1_wdg.top += add_val;
      }
    } // 关闭loading界面
 
 
    LoginController.getInstance().updateLoading(1);
    this.close_login_ticket = gcore.Timer.set(function () {
      LoginController.getInstance().openLoginWindow(false);
      gcore.Timer.del(this.close_login_ticket);
      IS_LOADING = false;
 
      if (PLATFORM_TYPR == "SH_RH" || PLATFORM_TYPR == "SH_SDK") {
        SDK.submitLogin();
 
        if (USE_SDK == true && PLATFORM_TYPR == "SH_SDK") {
          SDK.dataPlacement(90500);
        }
      } else if (USE_SDK == true && PLATFORM_TYPR == "WX_SDK") {
        SDK.loginLog();
      }
 
      gcore.GlobalEvent.fire(MainuiEvent.LOADING_ENTER_SCENE);
    }.bind(this), 200, 1); //背包红点
 
    var BackpackController = require("backpack_controller");
 
    BackpackController.getInstance().getModel().getHeroChipRedPoint(); //红点
 
    var ctrlCachesRed = this.mainui_controller.getCachesBtnRed();
 
    if (ctrlCachesRed) {
      for (var i = 0; i < ctrlCachesRed.length; ++i) {
        this.updateBtnTipsPoint(ctrlCachesRed[i][0], ctrlCachesRed[i][1]);
      }
 
      this.mainui_controller.resetCachesRetData();
    }
 
    this.updateShenqi();
    var Widget = this.prompt_container.getComponent(cc.Widget);
 
    if (this.task_tips_panel == null) {
      Widget.bottom = 144;
    } else {
      Widget.bottom = 334.28;
    }
 
    Widget.updateAlignment();
  },
  //神器任务
  updateShenqi: function updateShenqi() {
    var task_container = this.hide_container.getChildByName("task_container"); // let hallows_status = require("hallows_controller").getInstance().getModel().checkIsHaveAllHallows();
    // let limit_dun = Config.function_data.data_base[7].activate[0][1];
 
    var limit_lev = 6;
 
    if (Config.quest_data.data_const) {
      limit_lev = Config.quest_data.data_const.task_open.val[1];
    }
 
    var role_vo = RoleController.getInstance().getRoleVo();
 
    if (this.task_tips_panel == null && role_vo.lev >= limit_lev) {
      var TaskTipsPanel = require("task_tips_panel");
 
      this.task_tips_panel = new TaskTipsPanel(this);
      this.task_tips_panel.setParent(task_container);
      this.task_tips_panel.show();
      var Widget = this.prompt_container.getComponent(cc.Widget);
      Widget.bottom = 334.28;
      Widget.updateAlignment();
    }
  },
  deleteTaskTip: function deleteTaskTip() {
    if (this.task_tips_panel) {
      this.task_tips_panel.deleteMe();
      this.task_tips_panel = null;
    }
 
    var Widget = this.prompt_container.getComponent(cc.Widget);
    Widget.bottom = 144;
    Widget.updateAlignment();
  },
  getTaskTipsPanel: function getTaskTipsPanel() {
    return this.task_tips_panel.root_wnd;
  },
  // 创建挑战动画
  createChallengeEffect: function createChallengeEffect() {
    var btn_object = this.bottom_btn_list[MainUiConst.btn_index.drama_scene];
 
    if (btn_object == null) {
      return;
    }
 
    LoaderManager.getInstance().loadRes("spine/E51130/action.atlas", function (res) {
      btn_object.skeleton.skeletonData = res;
      btn_object.skeleton.setAnimation(0, "action1", true);
    }.bind(this));
  },
  registerEvent: function registerEvent() {
    this.prompt_tips_btn.on('click', function () {
      this._onClickPromptTips();
    }, this);
    this.head_container.on(cc.Node.EventType.TOUCH_END, function (event) {
      RoleController.getInstance().openRoleInfoView(true);
    }, this);
    this.coin_touch.on(cc.Node.EventType.TOUCH_END, function (event) {
      ExchangeController.getInstance().openExchangeMainView(true);
    }, this);
    this.gold_touch.on(cc.Node.EventType.TOUCH_END, function (event) {
      if (!this.is_hero_panel) {
        require("vip_controller").getInstance().openVipMainWindow(true, VIPTABCONST.CHARGE);
      } else {
        var BackpackController = require("backpack_controller");
 
        BackpackController.getInstance().openTipsSource(true, Utils.getItemConfig(22));
      }
    }, this);
    this.handle_btn.on(cc.Node.EventType.TOUCH_END, function (event) {
      this.shrinkBtnContainer();
    }.bind(this)); // 聊天
 
    this.chat_newmsg_event = gcore.GlobalEvent.bind(EventId.CHAT_NEWMSG_FLAG, function () {
      RedMgr.getInstance().addCalHandler(this.updateChatMsgNum.bind(this));
    }.bind(this)); //点金红点
 
    this.coin_touch_redpoint = gcore.GlobalEvent.bind(ExchangeEvent.Extra_Reward, function (data) {
      this.coin_redpoint.active = ExchangeController.getInstance().getModel().getRedStatus();
    }.bind(this));
    this.role_vo.bind(EventId.UPDATE_ROLE_ATTRIBUTE, function (key, val) {
      switch (key) {
        case "power":
          this.updateRolePower();
          break;
 
        case "lev":
          this.updateRoleLev();
          this.checkUnLockStatusByLev(val);
          break;
 
        case "name":
          this.updateRoleName();
          break;
 
        case "coin":
          this.updateRoleCoin();
          break;
 
        case "gold":
          this.updateRoleGold();
          break;
 
        case "face_id":
          this.player_head.setHeadRes(val);
          break;
 
        case "avatar_base_id":
          this.player_head.setFrameRes(val);
          break;
 
        case "vip_lev":
          this.updateRoleVip();
          break;
 
        case "exp":
          this.updateRoleExp();
          break;
 
        case "exp_max":
          this.updateRoleExp();
          break;
 
        case "hero_exp":
          this.updateHeroExp();
          break;
 
        default:
          break;
      }
    }, this); //系统提示增加
 
    if (!this.update_prompt_tips) {
      this.update_prompt_tips = gcore.GlobalEvent.bind(PromptEvent.ADD_PROMPT_DATA, function (data) {
        // -- 主城正在显示且不在聊天界面才显示气泡
        if (this.is_open && !ChatController.getInstance().isChatOpen()) {
          this.showPromptBubble(data);
          var model = PromptController.getInstance().getModel();
          var list = model.getPromptList();
 
          if (Utils.getArrLen(list) > 0) {
            this.showPromptTips(true, list);
          }
        }
      }.bind(this));
    } //系统提示移除
 
 
    if (!this.remove_prompt_tips) {
      this.remove_prompt_tips = gcore.GlobalEvent.bind(PromptEvent.REMOVE_PROMPT_DATA, function () {
        var model = PromptController.getInstance().getModel();
        var list = model.getPromptList();
 
        if (Utils.getArrLen(list) > 0) {
          this.showPromptTips(true, list);
        } else {
          this.showPromptTips(false);
        }
      }.bind(this));
    }
 
    this.prompt_mask.on('touchend', function () {
      this.prompt_mask.active = false;
      this.prompt_tips_layout.active = false;
    }, this);
  },
  open: function open() {
    if (this.root_wnd) {
      this.handleHideContainer(true);
      this.checkShowNewPromptBubble();
    }
  },
  // 打开显示的时候不需要马上显示出来,因为可能从一个界面切换到另外一个界面 这个时候不需要显示
  handleHideContainer: function handleHideContainer(status) {
    this.hide_container_status = status;
 
    if (this.wait_update == null) {
      this.wait_update = gcore.Timer.set(function () {
        if (this.hide_container_status == true) {
          this.is_open = this.hide_container_status;
          this.hide_container.active = this.is_open;
          this.functionUpdateList();
          gcore.Timer.del(this.wait_update);
          this.wait_update = null;
        }
      }.bind(this), 200, -1);
    }
  },
  getHideContainerStatus: function getHideContainerStatus() {
    return this.hide_container_status;
  },
  close: function close() {
    if (this.hide_container) {
      this.is_open = false;
      this.hide_container_status = false;
      this.hide_container.active = false;
    } // if(this.function_time_ticket){
    // gcore.Timer.del(this.function_time_ticket);
    // this.function_time_ticket = null;
    // }
 
  },
  // 切换主ui的状态
  changeMainUiStatus: function changeMainUiStatus(index, sub_type, extend_data) {
    var btn_object = this.bottom_btn_list[index];
 
    if (btn_object == null || !btn_object.is_unlock) {
      message(btn_object.config.desc);
      return;
    } // 切磋中的时候,不需要切换
 
 
    if (this.checkFightClickStatus()) {
      return;
    } // 如果待选中的是同一个
 
 
    if (this.cur_select_index == index && index != MainUiConst.btn_index.main_scene) {
      if (index == MainUiConst.btn_index.drama_scene) {
        Utils.closeAllWindow();
      }
 
      return;
    }
 
    this.setMaiuiBtnStatus(index); // 关闭所有窗体
 
    Utils.closeAllWindow(); // 只要不是剧情副本,都切出战斗
 
    if (index != MainUiConst.btn_index.Darma) {
      this.battle_controller.requestCutOutBattle();
      this.battle_controller.getModel().clearBattleScene(); // clearBattleScene
 
      this.changeBackgroundMusic();
    }
 
    if (index == MainUiConst.btn_index.main_scene) {
      var mainSceneCtrl = require("mainscene_controller").getInstance();
 
      mainSceneCtrl.enterMainScene(true);
    } else if (index == MainUiConst.btn_index.partner) {
      var hero_controller = require("hero_controller").getInstance();
 
      hero_controller.openHeroBagWindow(true, sub_type);
    } else if (index == MainUiConst.btn_index.backpack) {
      var controller = require("backpack_controller").getInstance();
 
      controller.openMainWindow(true, sub_type);
    } else if (index == MainUiConst.btn_index.drama_scene) {
      this.mainui_controller.requestOpenBattleRelevanceWindow(BattleConst.Fight_Type.Darma);
    } else if (index == MainUiConst.btn_index.esecsice) {
      require("esecsice_controller").getInstance().openEsecsiceView(true);
    } else if (index == MainUiConst.btn_index.guild) {
      require("guild_controller").getInstance().checkOpenGuildWindow(); //  清楚主界面上面的红点
 
 
      var GuildskillController = require("guildskill_controller");
 
      GuildskillController.getInstance().getModel().clearGuildSkillIconRed();
    } else if (index == MainUiConst.btn_index.hallows) {
      var controller = require("hallows_controller").getInstance();
 
      if (extend_data) {
        var hallows_id = extend_data[0];
        var index = extend_data[1];
        var magic_id = extend_data[2];
        controller.openHallowsMainWindow(true, hallows_id, index, magic_id);
      } else {
        controller.openHallowsMainWindow(true);
      }
    }
 
    this.doChangeBySubType(index, sub_type, extend_data);
  },
  // 只要不是剧情战斗,都切刀指定音乐
  changeBackgroundMusic: function changeBackgroundMusic() {
    Utils.playMusic(AUDIO_TYPE.SCENE, "s_002", true);
  },
  //跳转处理
  doChangeBySubType: function doChangeBySubType(main_type, sub_type, extend_data) {
    if (main_type == null || sub_type == null) return;
    this.sub_type = sub_type;
    gcore.Timer.set(function () {
      if (this.sub_type && this.sub_type != sub_type) return;
 
      if (main_type == MainUiConst.btn_index.main_scene) {
        if (sub_type == MainUiConst.sub_type.arena_call) {
          var SceneConst = require("scene_const");
 
          var ArenaConst = require("arena_const");
 
          require("mainscene_controller").getInstance().openBuild(SceneConst.CenterSceneBuild.arena, ArenaConst.arena_type.loop);
        } else if (sub_type == MainUiConst.sub_type.champion_call) {
          var SceneConst = require("scene_const");
 
          var ArenaConst = require("arena_const");
 
          require("mainscene_controller").getInstance().openBuild(SceneConst.CenterSceneBuild.arena, ArenaConst.arena_type.rank);
        } else if (sub_type == MainUiConst.sub_type.guild_boss) {
          if (this.role_vo && this.role_vo.gid == 0) {
            message(Utils.TI18N("您暂时还没有加入公会"));
          } else {
            this.mainui_controller.requestOpenBattleRelevanceWindow(BattleConst.Fight_Type.GuildDun);
          }
        } else if (sub_type == MainUiConst.sub_type.startower) {
          this.mainui_controller.requestOpenBattleRelevanceWindow(BattleConst.Fight_Type.StarTower);
        } else if (sub_type == MainUiConst.sub_type.partnersummon) {
          require("partnersummon_controller").getInstance().openPartnerSummonWindow(true);
        } else if (sub_type == MainUiConst.sub_type.escort) {
          this.mainui_controller.requestOpenBattleRelevanceWindow(BattleConst.Fight_Type.Escort, extend_data);
        } else if (sub_type == MainUiConst.sub_type.wonderful) {
          if (typeof extend_data == "number") {
            var ActionConst = require("action_const");
 
            require("action_controller").getInstance().openActionMainPanel(true, ActionConst.ActionType.Wonderful, extend_data);
          }
        } else if (sub_type == MainUiConst.sub_type.godbattle) {
          this.mainui_controller.requestOpenBattleRelevanceWindow(BattleConst.Fight_Type.Godbattle);
        } else if (sub_type == MainUiConst.sub_type.world_boss) {
          this.mainui_controller.requestOpenBattleRelevanceWindow(BattleConst.Fight_Type.WorldBoss);
        } else if (sub_type == MainUiConst.sub_type.function_icon) {
          this.mainui_controller.iconClickHandle(extend_data);
        } else if (sub_type == MainUiConst.sub_type.guildwar) {
          this.mainui_controller.requestOpenBattleRelevanceWindow(BattleConst.Fight_Type.GuildWar);
        } else if (sub_type == MainUiConst.sub_type.ladderwar) {
          this.mainui_controller.requestOpenBattleRelevanceWindow(BattleConst.Fight_Type.LadderWar);
        } else if (sub_type == MainUiConst.sub_type.primuswar) {
          this.mainui_controller.requestOpenBattleRelevanceWindow(BattleConst.Fight_Type.PrimusWar);
        } else if (sub_type == MainUiConst.sub_type.expedit_fight) {
          this.mainui_controller.requestOpenBattleRelevanceWindow(BattleConst.Fight_Type.ExpeditFight);
        } else if (sub_type == MainUiConst.sub_type.endless) {
          this.mainui_controller.requestOpenBattleRelevanceWindow(BattleConst.Fight_Type.Endless);
        } else if (sub_type == MainUiConst.sub_type.dungeonstone) {
          this.mainui_controller.requestOpenBattleRelevanceWindow(BattleConst.Fight_Type.DungeonStone, extend_data);
        } else if (sub_type == MainUiConst.sub_type.seerpalace) {
          // -- 先知殿
          if (extend_data && typeof extend_data == "number") {
            require("seerpalace_controller").getInstance().openSeerpalaceMainWindow(true, extend_data);
          } else {
            require("seerpalace_controller").getInstance().openSeerpalaceMainWindow(true);
          }
        } else if (sub_type == MainUiConst.sub_type.adventure) {
          // -- 跳转神界冒险
          require("adventure_controller").getInstance().requestEnterAdventure();
        } else if (sub_type == MainUiConst.sub_type.forge_house) {
          //锻造屋
          if (extend_data && typeof extend_data == "number") {
            require("forgehouse_controller").getInstance().openForgeHouseView(true, extend_data);
          } else {
            require("forgehouse_controller").getInstance().openForgeHouseView(true);
          }
        }
      } else if (main_type == MainUiConst.btn_index.drama_scene) {
        if (sub_type == MainUiConst.sub_type.dungeon_auto) {
          var battle_drama_model = BattleDramaController.getInstance().getModel();
          var drama_data = battle_drama_model.getDramaData();
 
          if (battle_drama_model && drama_data) {
            var data = battle_drama_model.getSingleBossData(drama_data.max_dun_id);
            BattleDramaController.getInstance().openDramBossInfoView(true, data);
          }
        }
      }
    }.bind(this), 200, 1);
  },
  // 是否在观战或者切磋,这个时候出二级提示,退出
  checkFightClickStatus: function checkFightClickStatus() {
    var BattleController = require("battle_controller");
 
    var is_click_status = BattleController.getInstance().getIsClickStatus();
    var combat_type = BattleController.getInstance().getModel().getCombatType();
 
    if (is_click_status) {
      var BattleConst = require("battle_const");
 
      var str = Utils.TI18N("正在观看录像或切磋中,是否退出?");
 
      if (combat_type == BattleConst.Fight_Type.HeroTestWar) {
        str = Utils.TI18N("正在观看战斗演示,是否切换界面?");
      }
 
      var comfire_fun = function () {
        BattleController.getInstance().csFightExit();
      }.bind(this);
 
      var CommonAlert = require("commonalert");
 
      CommonAlert.show(str, "确定", comfire_fun, "取消");
    } else {}
 
    return is_click_status;
  },
  // 改变按钮状态
  setMaiuiBtnStatus: function setMaiuiBtnStatus(index) {
    if (this.cur_select_index == index) {
      return;
    }
 
    if (this.cur_select_btn) {
      if (this.cur_select_index == MainUiConst.btn_index.drama_scene) {
        if (this.cur_select_btn.skeleton && this.cur_select_btn.skeleton.skeletonData) {
          this.cur_select_btn.skeleton.setAnimation(0, "action1", true);
        }
      } else {
        this.cur_select_btn.normal.active = true;
        this.cur_select_btn.selected.active = false;
        this.cur_select_btn.btn.setPosition(this.cur_select_btn.init_x, this.cur_select_btn.init_y);
      }
    }
 
    this.cur_select_index = index;
    var btn_object = this.bottom_btn_list[index];
    this.cur_select_btn = btn_object;
 
    if (btn_object) {
      if (this.cur_select_index == MainUiConst.btn_index.drama_scene) {
        if (this.cur_select_btn.skeleton && this.cur_select_btn.skeleton.skeletonData) {
          this.cur_select_btn.skeleton.setAnimation(0, "action2", true);
        }
      } else {
        btn_object.normal.active = false;
        btn_object.selected.active = true;
        btn_object.btn.setPosition(btn_object.init_x, btn_object.init_y + 10);
      }
    } // 设置选中的ui战斗类型,这里是需要记录的.要不然可能战斗和ui对不上
 
 
    var fight_type = this.getUIFightByIndex(index);
    this.mainui_controller.setUIFightType(fight_type);
  },
  // 根据主ui下面的标识,设置当前ui的战斗类型
  getUIFightByIndex: function getUIFightByIndex(index) {
    switch (index) {
      case MainUiConst.btn_index.main_scene:
        return MainUiConst.ui_fight_type.main_scene;
 
      case MainUiConst.btn_index.partner:
        return MainUiConst.ui_fight_type.partner;
 
      case MainUiConst.btn_index.backpack:
        return MainUiConst.ui_fight_type.backpack;
 
      case MainUiConst.btn_index.drama_scene:
        return MainUiConst.ui_fight_type.drama_scene;
 
      case MainUiConst.btn_index.esecsice:
        return MainUiConst.ui_fight_type.esecsice;
 
      case MainUiConst.btn_index.guild:
        return MainUiConst.ui_fight_type.guild;
 
      case MainUiConst.btn_index.hallows:
        return MainUiConst.ui_fight_type.hallows;
 
      default:
        return MainUiConst.ui_fight_type.main_scene;
    }
  },
  // 当前所处的主城主按钮标签
  getMainUIIndex: function getMainUIIndex() {
    return this.cur_select_index;
  },
  // 更新聊天num
  updateChatMsgNum: function updateChatMsgNum() {
    var chat_model = ChatController.getInstance().getModel();
    var red_num = chat_model.getUnreadNum();
 
    if (red_num > 0) {
      this.chat_red_bg.active = true;
      if (red_num > 99) red_num = "+99";
      this.chat_red_num.string = red_num;
    } else {
      this.chat_red_bg.active = false;
    }
  },
  // 更新角色数据
  updateRoleData: function updateRoleData() {
    this.updateRoleName();
    this.updateRoleLev();
    this.updateRoleCoin();
    this.updateRoleGold();
    this.updateRolePower();
    this.updateRoleHead();
    this.updateRoleVip();
    this.updateRoleExp();
    this.updateRoleHeadFrame();
  },
  updateRoleName: function updateRoleName() {
    this.name_label.string = this.role_vo.name;
  },
  updateRoleLev: function updateRoleLev() {
    this.lev_label.string = this.role_vo.lev;
  },
  updateRoleCoin: function updateRoleCoin() {
    this.coin_label.string = Utils.getMoneyString(this.role_vo.coin);
  },
  updateRoleGold: function updateRoleGold() {
    if (!this.is_hero_panel) this.gold_label.string = Utils.getMoneyString(this.role_vo.gold);
  },
  updateRolePower: function updateRolePower() {
    this.fight_label.string = this.role_vo.power;
  },
  updateRoleHead: function updateRoleHead() {
    this.player_head.setHeadRes(this.role_vo.face_id);
  },
  updateRoleHeadFrame: function updateRoleHeadFrame() {
    this.player_head.setFrameRes(this.role_vo.avatar_base_id);
  },
  updateRoleExp: function updateRoleExp() {
    if (this.role_vo == null || this.role_vo.exp == null || this.role_vo.exp_max == null) return;
    var pro = this.role_vo.exp / this.role_vo.exp_max;
    this.exp_bar.scaleX = pro;
  },
  // 剧情章节变化的时候,开启下面图标
  checkUnLockStatus: function checkUnLockStatus(max_dun_id) {
    if (max_dun_id == null) return;
    this.max_dun_id = max_dun_id;
    var is_unlock = false;
 
    for (var k = 0; k < this.bottom_btn_list.length; ++k) {
      var btn = this.bottom_btn_list[k];
 
      if (btn.config && btn.config.activate) {
        var activate = btn.config.activate[0];
 
        if (activate[0] == "dun") {
          is_unlock = max_dun_id >= activate[1];
 
          if (is_unlock != btn.is_unlock) {
            btn.is_unlock = is_unlock;
 
            if (btn.notice) {
              btn.notice.active = !is_unlock;
            } // if(is_unlock == false){
            //     setChildUnEnabled(true, btn)
            // }else{
            //     setChildUnEnabled(false, btn)
            // }
 
          }
        }
      }
    }
 
    this.updateShenqi();
  },
  //升级的时候判断等级开启
  checkUnLockStatusByLev: function checkUnLockStatusByLev(lev) {
    if (this.role_vo == null) return;
    var is_unlock = false;
 
    for (var k = 0; k < this.bottom_btn_list.length; ++k) {
      var btn = this.bottom_btn_list[k];
 
      if (btn.config && btn.config.activate) {
        var activate = btn.config.activate[0];
 
        if (activate[0] == "lev") {
          is_unlock = this.role_vo.lev >= activate[1];
 
          if (is_unlock != btn.is_unlock) {
            btn.is_unlock = is_unlock;
 
            if (btn.notice) {
              btn.notice.active = !is_unlock;
            } // if(is_unlock == false){
            //     setChildUnEnabled(true, btn)
            // }else{
            //     setChildUnEnabled(false, btn)
            // }
 
          }
        }
      }
    }
 
    if (this.task_tips_panel == null) {
      this.updateShenqi();
    }
  },
  // ---------------------- 图标部分 start---------------------- --
  //初始化技能图标列表
  addIconList: function addIconList(list) {
    if (list == null || Utils.next(list) == null) return;
 
    for (var k in list) {
      var vo = list[k];
 
      if (vo != null && vo.config != null) {
        if (!this.checkIconIn(vo.config.id)) {
          this.render_list_dic[vo.config.id] = vo;
          this.render_list.push(vo);
        }
      }
    } //这里先做一个排序
 
 
    if (this.render_list != null && Utils.next(this.render_list != null)) {
      this.render_list.sort(Utils.tableLowerSorter(["pos", "sort"]));
    } //开启计时器,准备创建图表f
 
 
    if (this.add_function_timer == null) {
      this.add_function_timer = gcore.Timer.set(function () {
        this.createFunctionIcon();
      }.bind(this), 2 / 60, -1);
    }
  },
  //动态添加一个图标
  addIcon: function addIcon(vo) {
    if (vo == null || vo.config == null || this.checkIconIn(vo.config.id)) return;
    this.render_list_dic[vo.config.id] = vo;
    this.render_list.push(vo);
    this.render_list.sort(Utils.tableLowerSorter(["pos", "sort"])); //开启计时器,准备创建图标
 
    if (this.add_function_timer == null) {
      this.add_function_timer = gcore.Timer.set(function () {
        this.createFunctionIcon();
      }.bind(this), 2 / 60, -1);
    }
  },
  //监测一个图标是否存在
  checkIconIn: function checkIconIn(id) {
    if (this.function_list[id] != null || this.render_list_dic[id] != null) {
      return true;
    }
 
    return false;
  },
  //动态移除一个图标
  removeIcon: function removeIcon(id) {
    var config = gdata("function_data", "data_info", [id]);
    if (config == null) return;
 
    if (this.function_list[id] != null) {
      if (this.function_list[id].deleteMe) {
        this.function_list[id].deleteMe();
        this.function_list[id] = null;
      }
    }
 
    for (var i in this.render_list) {
      if (this.render_list[i].config.id == id) {
        this.render_list.splice(i, 1);
        break;
      }
    }
 
    this.render_list_dic[id] = null;
    if (this.layout_list == null || this.layout_list[config.type] == null) return;
 
    for (var i in this.layout_list[config.type]) {
      var v = this.layout_list[config.type][i];
 
      if (v && v.config.id == id) {
        this.layout_list[config.type].splice(i, 1);
        break;
      }
    }
 
    this.updateIconLayout(config.type);
  },
  //创建一个图标
  createFunctionIcon: function createFunctionIcon() {
    if (!this.root_wnd) return;
 
    if (this.render_list == null || Utils.next(this.render_list) == null) {
      if (this.add_function_timer != null) {
        gcore.Timer.del(this.add_function_timer);
        this.add_function_timer = null;
      }
 
      return;
    } // var data = this.render_list.shift();
 
 
    var data = this.render_list.splice(0, 1)[0];
    if (data == null) return;
    this.render_list_dic[data.config.id] = null; //这类图标不需要在主界面显示
 
    if (data.config && data.config.is_show == 0) return;
    this.addItemToTabArray(data);
  },
  //将图标添加到父节点容器
  addItemToTabArray: function addItemToTabArray(data) {
    if (data == null || data.config == null) return;
 
    if (this.layout_list == null) {
      this.layout_list = {};
    }
 
    if (this.layout_list[data.config.type] == null) {
      this.layout_list[data.config.type] = [];
    }
 
    var is_new = true;
 
    for (var k in this.layout_list[data.config.type]) {
      var v = this.layout_list[data.config.type][k];
 
      if (v.config.id == data.config.id) {
        v = data;
        is_new = false;
        break;
      }
    }
 
    data.is_new = is_new;
    this.layout_list[data.config.type].push(data);
    this.layout_list[data.config.type].sort(Utils.tableLowerSorter(["sort"]));
    this.updateIconLayout(data.config.type);
  },
  //更新图标位置
  updateIconLayout: function updateIconLayout(type) {
    if (this.layout_list == null || this.layout_list[type] == null || Utils.next(this.layout_list[type]) == null) return;
    var layout = this.getContainerByType(type);
    if (layout == null) return;
    var len = Utils.getArrLen(this.layout_list[type]);
    var icon = null;
 
    for (var i = 0; i < len; i++) {
      var data = this.layout_list[type][i];
 
      if (data && data.config) {
        if (this.function_list[data.config.id] == null) {
          if (data.is_new == true) {
            data.is_new = false;
 
            var FunctionIcon = require("function_icon_panel");
 
            icon = new FunctionIcon(data);
            icon.show();
            icon.setParent(layout);
            this.function_list[data.config.id] = icon;
          }
        }
 
        icon = this.function_list[data.config.id];
 
        if (icon != null) {
          this.setIconPosition(icon, i, layout, type);
        }
      }
    }
 
    if (this.root_wnd) {
      this.updateHandleBtnShowStatus();
    }
  },
  updateHandleBtnShowStatus: function updateHandleBtnShowStatus() {
    var right_bottom_1 = this.layout_list[FunctionIconVo.type.right_bottom_1];
    var right_bottom_2 = this.layout_list[FunctionIconVo.type.right_bottom_2];
 
    if (right_bottom_1 || right_bottom_2) {
      if (right_bottom_1 && right_bottom_1.length || right_bottom_2 && right_bottom_2.length) {
        this.handle_btn.active = true;
      }
    } else {
      this.handle_btn.active = false;
    }
  },
  //根据位置获取图标父节点信息
  getContainerByType: function getContainerByType(type) {
    if (this.icon_container_list != null) {
      return this.icon_container_list[type];
    }
  },
  //设置图标的位置
  setIconPosition: function setIconPosition(icon, index, layout, type) {
    var size = layout.getContentSize();
    var _x = 0;
    var _y = 0;
    var off_height = 10;
 
    if (type == FunctionIconVo.type.right_top_1) {
      // 右上,从右往左
      _x = -icon.width * 0.5 - index % this.left_max_sum * (this.left_off + icon.width);
      _y = -icon.height * 0.5 - Math.floor(index / this.left_max_sum) * (off_height + icon.height);
    } else if (type == FunctionIconVo.type.right_bottom_1) {
      // 右下,从右往左
      _x = -icon.width * 0.5 - index % this.left_max_sum * (this.left_off + icon.width);
    } else if (type == FunctionIconVo.type.right_bottom_2) {
      // 右下,从下往上
      _y = icon.height * 0.5 + index * (icon.height + this.right_off);
    } else if (type == FunctionIconVo.type.right_top_2) {
      // 右上,从上往下
      _x = -icon.width * 0.5;
      _y = -icon.height * 0.5 - index * (icon.height + off_height);
    }
 
    if (icon.original == null || Utils.getNorKey(icon.original.x, icon.original.y) != Utils.getNorKey(_x, _y)) {
      icon.setPosition(_x, _y);
      icon.original = cc.v2(_x, _y);
    } //动态调整 right_top_2 的位置
 
 
    var off_y = 0;
 
    if (type == FunctionIconVo.type.right_top_1) {
      off_y = Math.abs(_y - off_height - icon.height * 0.5); // 算出总高度
    } else if (type == FunctionIconVo.type.right_top_2) {
      var layout_list = this.layout_list[FunctionIconVo.type.right_top_1];
 
      if (layout_list) {
        var len = Utils.getArrLen(layout_list);
        var temp_y = icon.height * 0.5 - Math.ceil(len / this.left_max_sum) * (off_height + icon.height);
        off_y = Math.abs(temp_y - off_height - icon.height * 0.5);
      }
    }
 
    if (off_y != 0 && this.top_2_off_y != off_y) {
      this.top_2_off_y = off_y;
      var top_1 = this.icon_container_list[FunctionIconVo.type.right_top_1];
      var top_2 = this.icon_container_list[FunctionIconVo.type.right_top_2];
 
      if (top_1 && top_2) {
        top_2.y = top_1.y - off_y;
      }
    }
  },
  //定时器的统一倒计时
  functionTimeTicketList: function functionTimeTicketList() {
    if (this.function_list && Utils.next(this.function_list) != null) {
      for (var k in this.function_list) {
        var icon = this.function_list[k];
 
        if (icon && icon.data && icon.data.end_time && icon.data.end_time > 0) {
          if (icon.updateTime) {
            icon.updateTime();
          }
        }
      }
    }
 
    if (this.action_list && Utils.next(this.action_list) != null) {
      for (var i in this.action_list) {
        var _icon = this.action_list[i];
 
        if (_icon && _icon.updateTime && _icon.remain_sec && _icon.remain_sec > 0) {
          _icon.updateTime();
        }
      }
    }
  },
  //更新icon列表
  functionUpdateList: function functionUpdateList() {
    if (this.function_list && Utils.next(this.function_list) != null) {
      for (var k in this.function_list) {
        var icon = this.function_list[k];
 
        if (icon && icon.updateIconRes) {
          icon.updateIconRes();
        }
      }
    }
  },
  setBottomStatus: function setBottomStatus(status) {
    if (this.bottom_container) this.bottom_container.active = status;
  },
  setTopStatus: function setTopStatus(status) {
    if (this.top_container) this.top_container.active = status;
  },
  updateRoleVip: function updateRoleVip() {
    this.vip_label.setNum(this.role_vo.vip_lev);
  },
  // --==============================--
  // --@id:下面按钮序号
  // --@data:data 可以是单纯bool值,或者是table形式{[1]={id=xxx,status=false}}
  // --@return 
  // --==============================--
  updateBtnTipsPoint: function updateBtnTipsPoint(id, data) {
    if (!this.bottom_btn_list[id]) return;
 
    if (data == null) {
      this.btn_cache_tips[id] = null;
    } else {
      if (_typeof(data) != "object") {
        this.btn_cache_tips[id] = data;
      } else {
        if (this.btn_cache_tips[id] == null) {
          this.btn_cache_tips[id] = {};
        }
 
        if (data.bid != null) {
          this.btn_cache_tips[id][data.bid] = data.status;
        } else {
          for (var i in data) {
            if (data[i].bid != null) {
              this.btn_cache_tips[id][data[i].bid] = data[i].status;
            }
          }
        }
      }
    }
 
    var bool = false;
 
    if (this.btn_cache_tips[id]) {
      if (_typeof(this.btn_cache_tips[id]) == "object") {
        for (var i in this.btn_cache_tips[id]) {
          if (this.btn_cache_tips[id][i] == true) {
            bool = true;
            break;
          }
        }
      } else {
        bool = this.btn_cache_tips[id];
      }
    }
 
    var btn_object = this.bottom_btn_list[id];
 
    if (btn_object && btn_object.tips_status != bool) {
      btn_object.tips_status = bool;
 
      if (btn_object.tips_point) {
        btn_object.tips_point.active = bool;
      }
    }
  },
  getRootWnd: function getRootWnd(cb) {
    this.root_wnd_cb = cb;
    if (this.root_wnd) this.root_wnd_cb(this.root_wnd);
  },
  // ---------------------- 图标部分 end---------------------- --
  //收缩右下角的图标
  shrinkBtnContainer: function shrinkBtnContainer() {
    if (this.is_in_shrink == true) return;
    this.is_in_shrink = true;
    var layout_1 = this.icon_container_list[FunctionIconVo.type.right_bottom_1];
    var layout_2 = this.icon_container_list[FunctionIconVo.type.right_bottom_2];
    this.is_shrink = !this.is_shrink;
    layout_1.active = true;
    layout_2.active = true;
    var len = 100;
    var move_by_1 = null;
    var move_by_2 = null;
    var fade_1 = null;
    var fade_2 = null;
 
    if (this.is_shrink == true) {
      move_by_1 = cc.moveBy(0.1, cc.v2(len, 0));
      move_by_2 = cc.moveBy(0.1, cc.v2(0, -len));
      fade_1 = cc.fadeOut(0.1);
      fade_2 = cc.fadeOut(0.1);
    } else {
      move_by_1 = cc.moveBy(0.1, cc.v2(-len, 0));
      move_by_2 = cc.moveBy(0.1, cc.v2(0, len));
      fade_1 = cc.fadeIn(0.1);
      fade_2 = cc.fadeIn(0.1);
    }
 
    var call_fun_1 = cc.callFunc(function () {
      this.is_in_shrink = false;
 
      if (this.is_shrink == true) {
        layout_1.active = false;
      }
    }.bind(this));
    var call_fun_2 = cc.callFunc(function () {
      if (this.is_shrink == true) {
        layout_2.active = false;
      }
    }.bind(this));
    layout_1.runAction(cc.sequence(cc.spawn(move_by_1, fade_1), call_fun_1));
    layout_2.runAction(cc.sequence(cc.spawn(move_by_2, fade_2), call_fun_2));
  },
  showPower: function showPower(power_add, last_power) {
    if (!power_add || !last_power) return;
 
    if (this.power_show_nd == null) {
      LoaderManager.getInstance().loadRes(PathTool.getPrefabPath("mainui", "power_show"), function (Prefab) {
        if (this.power_show_nd) {
          this.runPowerAction(power_add, last_power);
          return;
        }
 
        this.power_show_nd = Prefab;
        ViewManager.getInstance().addToSceneNode(this.power_show_nd, SCENE_TAG.dialogue);
        this.power_show_nd.setPosition(-SCREEN_WIDTH * 0.5, -SCREEN_HEIGHT * 0.5);
        var power_show_nd = this.power_show_nd.getChildByName("container");
        this.power_show_nd.power_sk = power_show_nd.getChildByName("ani_con").getComponent(sp.Skeleton);
        var tex_con_nd = power_show_nd.getChildByName("txt_con");
        this.power_show_nd.old_power_rb = tex_con_nd.getChildByName("old_power").getComponent(cc.RichText);
 
        if (cc.sys.browserType == cc.sys.BROWSER_TYPE_IE) {
          this.power_show_nd.old_power_rb.lineHeight = 60;
        }
 
        this.power_show_nd.add_power_lb = tex_con_nd.getChildByName("add_power").getComponent(cc.Label);
        var anima_res = PathTool.getEffectRes(179);
        var anima_path = PathTool.getSpinePath(anima_res);
        LoaderManager.getInstance().loadRes(anima_path, function (power_sd) {
          this.power_show_nd.power_sk.skeletonData = power_sd;
          this.runPowerAction(power_add, last_power);
        }.bind(this));
      }.bind(this));
    } else {
      this.runPowerAction(power_add, last_power);
    } // this.power_show_nd = this.root_wnd.getChildByName("power_show");
    // this.power_sk = this.power_show_nd.getChildByName("ani_con").getComponent(sp.Skeleton);
    // var tex_con_nd = this.power_show_nd.getChildByName("txt_con");
    // this.old_power_rb = tex_con_nd.getChildByName("old_power").getComponent(cc.RichText);
    // this.add_power_lb = tex_con_nd.getChildByName("add_power").getComponent(cc.Label);
    // if (this.power_sk.skeletonData) {
    //     this.runPowerAction(power_add, last_power);
    // } else {
    //     var anima_res = PathTool.getEffectRes(179);
    //     var anima_path = PathTool.getSpinePath(anima_res);
    //     LoaderManager.getInstance().loadRes(anima_path, function(power_sd) {
    //         this.power_sk.skeletonData = power_sd;
    //         this.runPowerAction(power_add, last_power);
    //     }.bind(this))
    // }
 
  },
  runPowerAction: function runPowerAction(power_add, last_power) {
    this.power_show_nd.power_sk.setAnimation(0, "action", false);
 
    if (this.add_timer) {
      gcore.Timer.del(this.add_timer);
      this.add_timer = null;
    }
 
    this.power_show_nd.stopAllActions();
    var last_power_str = last_power + "";
    var last_power_ds = "";
 
    if (cc.sys.browserType == cc.sys.BROWSER_TYPE_IE) {
      last_power_ds = last_power_str;
    } else {
      for (var item_i in last_power_str) {
        last_power_ds += "<img src='type23_" + last_power_str[item_i] + "'/>";
      }
    }
 
    this.calcu_num = 0;
    this.add_timer = gcore.Timer.set(function (power_add) {
      this.calcu_num += 1;
 
      if (this.calcu_num < 5) {
        this.power_show_nd.add_power_lb.string = "+" + Math.ceil(this.calcu_num * 0.2 * power_add);
      } else {
        this.power_show_nd.add_power_lb.string = "+" + power_add;
      }
    }.bind(this, power_add), 200, 5);
    this.power_show_nd.old_power_rb.string = last_power_ds;
    this.power_show_nd.opacity = 255;
    console.log("输出字符串", this.power_show_nd.old_power_rb.string);
    console.log("输出字符串", last_power_ds);
    var delay_time = new cc.delayTime(1);
    var action = new cc.fadeOut(1);
    var finish_cb = new cc.callFunc(function () {
      if (this.add_timer) {
        gcore.Timer.del(this.add_timer);
        this.add_timer = null;
      }
 
      if (this.power_show_nd) {
        this.power_show_nd.destroy();
        this.power_show_nd = null;
      }
    }.bind(this));
    var power_act = cc.sequence(delay_time, action, finish_cb);
    this.power_show_nd.runAction(power_act);
  },
  updateHeroExp: function updateHeroExp() {
    if (this.is_hero_panel) this.gold_label.string = Utils.getMoneyString(this.role_vo.hero_exp);
  },
  changeHeroStatus: function changeHeroStatus(is_hero) {
    this.is_hero_panel = is_hero;
 
    if (is_hero) {
      LoaderManager.getInstance().loadRes(PathTool.getItemRes("22"), function (res) {
        this.gold_sp.spriteFrame = res;
      }.bind(this));
      this.gold_label.string = Utils.getMoneyString(this.role_vo.hero_exp);
    } else {
      LoaderManager.getInstance().loadRes(PathTool.getItemRes("3"), function (res) {
        this.gold_sp.spriteFrame = res;
      }.bind(this));
      this.gold_label.string = Utils.getMoneyString(this.role_vo.gold);
    }
  },
  creatorChatBtn: function creatorChatBtn() {
    this.chat_btn_nd = new cc.Node("chat_btn");
    var widget = this.chat_btn_nd.addComponent(cc.Widget);
    widget.isAlignBottom = true;
    widget.bottom = 367;
    this.chat_btn_nd.x = 317;
    ViewManager.getInstance().addToSceneNode(this.chat_btn_nd, SCENE_TAG.top);
    var btn = this.chat_btn_nd.addComponent(cc.Button);
    btn.transition = cc.Button.Transition.SCALE;
    btn.zoomScale = 0.9;
    btn.duration = 0.1;
    LoaderManager.getInstance().loadRes(PathTool.getUIIconPath("mainui", "mainui_chat_main_icon"), function (res_object) {
      this.chat_btn_nd.addComponent(cc.Sprite).spriteFrame = res_object;
    }.bind(this));
    this.chat_red_bg = new cc.Node("chat_red_bg");
    LoaderManager.getInstance().loadRes(PathTool.getUIIconPath("mainui", "mainui_1034"), function (res_object) {
      this.chat_red_bg.addComponent(cc.Sprite).spriteFrame = res_object;
    }.bind(this));
    this.chat_btn_nd.addChild(this.chat_red_bg);
    this.chat_red_bg.setPosition(23, 25);
    this.chat_red_bg.active = false;
    this.chat_red_num = new cc.Node("chat_red_num").addComponent(cc.Label);
    this.chat_red_num.fontSize = 18;
    this.chat_red_num.lineHeight = 18;
    this.chat_red_num.horizontalAlign = cc.macro.TextAlignment.CENTER;
    this.chat_red_num.verticalAlign = cc.macro.TextAlignment.CENTER;
    this.chat_red_bg.addChild(this.chat_red_num.node);
    var touch_began = cc.v2();
    var is_move = false;
    this.chat_btn_nd.on("touchstart", function (event) {
      is_move = false;
      touch_began = event.getLocation();
    }, this);
    this.chat_btn_nd.on("touchmove", function (event) {
      var pos = event.getLocation();
 
      if (!is_move) {
        var is_click = Math.abs(pos.x - touch_began.x) <= 30 && Math.abs(pos.y - touch_began.y) <= 30;
 
        if (is_click == false) {
          is_move = true;
        }
      }
 
      if (is_move) {
        pos = ViewManager.getInstance().getSceneNode(SCENE_TAG.top).convertToNodeSpaceAR(pos);
        if (!this.checkPosInRect(pos)) return;
        this.chat_btn_nd.setPosition(pos);
      }
    }, this);
    this.chat_btn_nd.on("touchend", function (event) {
      if (is_move == false) {
        Utils.playButtonSound(1);
 
        var ChatCtrl = require("chat_controller");
 
        ChatCtrl.getInstance().openChatPanel();
        this.showChatBtn(false);
      }
    }, this);
 
    var GuideController = require("guide_controller");
 
    if (GuideController.getInstance().isInGuide()) {
      this.setMainUIChatBubbleStatus(false);
    }
  },
  setMainUIChatBubbleStatus: function setMainUIChatBubbleStatus(status) {
    this.chat_bubble_status = status;
    this.chat_btn_nd.stopAllActions();
 
    if (status) {
      this.root_wnd.runAction(cc.sequence(cc.delayTime(0.2), cc.callFunc(function () {
        if (this.chat_bubble_status == true) {
          this.showChatBtn(this.chat_bubble_status);
        }
      }, this)));
    } else {
      this.showChatBtn(this.chat_bubble_status);
    }
  },
  checkPosInRect: function checkPosInRect(pos) {
    // let width = cc.winSize.width > SCREEN_WIDTH ? SCREEN_WIDTH : cc.winSize.width;
    // let size = cc.size(width,cc.winSize.height)
    var size = this.root_wnd.getContentSize();
    var left_x = -(size.width / 2) + 40;
    var right_x = size.width / 2 - 40;
    var top_y = size.height / 2 - (this.top_container.height + 60);
    var bottom_y = -(size.height / 2) + (this.bottom_container.height + 60);
    if (pos.x < left_x) return false;
    if (pos.y < bottom_y) return false;
    if (pos.x > right_x) return false;
    if (pos.y > top_y) return false;
    return true;
  },
  showChatBtn: function showChatBtn(status) {
    if (this.chat_btn_nd) {
      this.chat_btn_nd.active = status;
    }
  },
  // 检测是否有新的气泡提示
  checkShowNewPromptBubble: function checkShowNewPromptBubble() {
    var model = PromptController.getInstance().getModel();
    var data = model.getNotBubblePrompt();
 
    if (data) {
      this.showPromptBubble(data);
    }
 
    var list = model.getPromptList();
 
    if (Utils.getArrLen(list) > 0) {
      this.showPromptTips(true, list);
    }
  },
  // -- 显示系统提示气泡
  showPromptBubble: function showPromptBubble(data) {
    if (data) {
      data.setShowBubbleStatus(true);
      this.prompt_bubble_layout.stopAllActions();
      this.prompt_tips_btn.active = true;
      this.prompt_bubble_layout.active = true;
      this.prompt_desc.string = data.name;
 
      this.prompt_desc._updateRenderData(true);
 
      var size = this.prompt_desc.node.getContentSize();
      this.prompt_bubble.setContentSize(cc.size(size.width + 60, this.prompt_bubble_size.height));
      var fadein = cc.fadeIn(0.7);
      var fadeout = cc.fadeOut(0.7);
      this.prompt_bubble_layout.runAction(cc.sequence(fadein, fadeout));
    }
  },
  // -- 显示系统提示
  showPromptTips: function showPromptTips(status, list) {
    var _this2 = this;
 
    cc.log(status, list, "showPromptTips");
 
    if (status == true && list && Utils.next(list) != null) {
      this.prompt_tips_btn.active = true;
      this.prompt_tips_scroll.destroyAllChildren();
      var max_width = 0;
 
      for (var k = 0; k < list.length; ++k) {
        var v = list[k];
        this.count_size_label.string = v.name;
 
        this.count_size_label._updateRenderData(true);
 
        var size = this.count_size_label.node.getContentSize();
 
        if (max_width < size.width) {
          max_width = size.width;
        }
      }
 
      if (max_width < 168) {
        max_width = 168; //原本的大小
      } // --字的宽度和按钮的宽度相差20
 
 
      max_width = max_width + 20;
      var len = Utils.getArrLen(list);
      var button_height = 49;
      var button_height_space = 12;
      var res = PathTool.getUIIconPath("mainui", "mainui_tips_bg1");
      var max_height = Math.max(this.prompt_tips_scroll_size.height, len * (button_height_space + button_height));
      var scroll_height = Math.min(len * (button_height_space + button_height), 160); // --根据大小调整下scroll和背景大小
 
      var tips_scroll_width = max_width + 4;
      var tips_bg_width = tips_scroll_width + (this.prompt_tips_bg_size.width - this.prompt_tips_scroll_size.width);
      this.prompt_tips_scroll.setContentSize(cc.size(tips_scroll_width, scroll_height)); // this.prompt_tips_scroll:setInnerContainerSize(cc.size(tips_scroll_width, scroll_height))
 
      this.prompt_tips_bg.setContentSize(cc.size(tips_bg_width, scroll_height + 60));
 
      if (scroll_height > 160) {
        this.prompt_tips_scroll.setContentSize(cc.size(tips_scroll_width, max_height));
      }
 
      var _loop2 = function _loop2(i) {
        var v = list[i];
        var item = new cc.Node();
        var image = item.addComponent(cc.Sprite);
        image.type = cc.Sprite.Type.SLICED;
        image.sizeMode = cc.Sprite.SizeMode.CUSTOM;
        item.setPosition(tips_scroll_width / 2, 5 + (button_height_space + button_height) * i);
        item.setContentSize(cc.size(max_width, button_height));
        item.setAnchorPoint(0.5, 0);
        LoaderManager.getInstance().loadRes(res, function (SpriteFrame) {
          image.spriteFrame = SpriteFrame;
        }.bind(_this2));
 
        _this2.prompt_tips_scroll.addChild(item);
 
        var label = new cc.Node().addComponent(cc.Label);
        label.node.color = new cc.Color().fromHEX(Config.color_data.data_color16[175]);
        label.string = v.name;
        label.fontSize = 22;
        label.lineHeight = 26;
        label.node.y = button_height / 2;
        item.addChild(label.node);
        var btn = item.addComponent(cc.Button);
        btn.transition = cc.Button.Transition.SCALE;
        btn.duration = 0.1;
        btn.zoomScale = 0.9;
        item.on('touchend', function () {
          this.prompt_mask.active = false;
          this.mainui_controller.onClickPromptTipsItem(v);
          this.prompt_tips_layout.active = false;
        }, _this2);
      };
 
      for (var i = 0; i < list.length; ++i) {
        _loop2(i);
      }
    } else {
      this.prompt_tips_btn.active = false;
      this.prompt_tips_layout.active = false;
 
      if (this.prompt_mask) {
        this.prompt_mask.active = false;
      }
    }
  },
  _onClickPromptTips: function _onClickPromptTips() {
    if (this.prompt_tips_layout.active) {
      this.prompt_tips_layout.active = false;
 
      if (this.prompt_mask) {
        this.prompt_mask.active = false;
      }
    } else {
      this.prompt_tips_layout.active = true;
 
      if (this.prompt_mask) {
        this.prompt_mask.active = true;
      }
    }
  },
  //创建深海小程序客服浮标
  creatorCustomerServiceBtn: function creatorCustomerServiceBtn() {
    if (this.customer_service) {
      this.customer_service.deleteMe();
      this.customer_service = null;
    }
 
    this.customer_service = Utils.createClass("customer_service_window");
 
    var container = require("viewmanager").getInstance().getSceneNode(SCENE_TAG.loading);
 
    this.customer_service.setParent(container);
    this.customer_service.show();
  }
});
module.exports = MainUIView;
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxtYWludWlcXHZpZXdcXG1haW51aV92aWV3LmpzIl0sIm5hbWVzIjpbIkxvYWRlck1hbmFnZXIiLCJyZXF1aXJlIiwiUGF0aFRvb2wiLCJQbGF5ZXJIZWFkIiwiTWFpblVpQ29uc3QiLCJCYXR0bGVDb25zdCIsIlJvbGVDb250cm9sbGVyIiwiRXhjaGFuZ2VDb250cm9sbGVyIiwiRnVuY3Rpb25JY29uVm8iLCJDaGF0Q29udHJvbGxlciIsIkV4Y2hhbmdlRXZlbnQiLCJMb2dpbkNvbnRyb2xsZXIiLCJNYWludWlFdmVudCIsIlByb21wdEV2ZW50IiwiUHJvbXB0Q29udHJvbGxlciIsIk1haW5VSVZpZXciLCJjYyIsIkNsYXNzIiwiQmFzZUNsYXNzIiwiY3RvciIsInJsZWFzZVByZWZhYiIsImluaXRDb25maWciLCJjcmVhdGVSb290V25kIiwiYm90dG9tX2J0bl9saXN0IiwiY3VyX3NlbGVjdF9pbmRleCIsInJlbmRlcl9saXN0IiwicmVuZGVyX2xpc3RfZGljIiwiZnVuY3Rpb25fbGlzdCIsImljb25fY29udGFpbmVyX2xpc3QiLCJpY29uX3dpZGdldF9saXN0IiwiYnRuX2NhY2hlX3RpcHMiLCJsZWZ0X29mZiIsInJpZ2h0X29mZiIsImxlZnRfbWF4X3N1bSIsImlzX2luX3NocmluayIsImlzX3NocmluayIsImxheW91dF9saXN0IiwibWFpbnVpX2NvbnRyb2xsZXIiLCJnZXRJbnN0YW5jZSIsImJhdHRsZV9jb250cm9sbGVyIiwicHJlZmFiUGF0aCIsImdldFByZWZhYlBhdGgiLCJsb2FkUmVzIiwicmVzX29iamVjdCIsImluaXRNYWluVUkiLCJiaW5kIiwicm9vdF93bmQiLCJ3aW5kb3ciLCJpc01vYmlsZSIsImdldENvbXBvbmVudCIsIldpZGdldCIsImVuYWJsZWQiLCJzZXRQb3NpdGlvbiIsIlNDUkVFTl9XSURUSCIsIlNDUkVFTl9IRUlHSFQiLCJWaWV3TWFuYWdlciIsImFkZFRvU2NlbmVOb2RlIiwiU0NFTkVfVEFHIiwidG9wIiwicm9vdF93bmRfY2IiLCJib3R0b21fY29udGFpbmVyIiwiZ2V0Q2hpbGRCeU5hbWUiLCJidG5fY29uIiwiRklUX0hFSURHSFQiLCJidG5fbG8iLCJMYXlvdXQiLCJzcGNpbmdYIiwiRklUX1NDQUxFIiwicGFkZGluZ0xlZnQiLCJwYWRkaW5nUmlnaHQiLCJzcGFjaW5nWCIsImluZGV4IiwiYnRuIiwidGlwc19wb2ludCIsIm5vcm1hbCIsInNlbGVjdGVkIiwiaWNvbiIsIm5vdGljZSIsImluaXRfeCIsImdldFBvc2l0aW9uIiwieCIsImluaXRfeSIsInkiLCJ0aXBzX3N0YXR1cyIsImNvbmZpZyIsIkNvbmZpZyIsImZ1bmN0aW9uX2RhdGEiLCJkYXRhX2Jhc2UiLCJhY3RpdmF0ZSIsIkxhYmVsIiwic3RyaW5nIiwibGFiZWwiLCJvbiIsIk5vZGUiLCJFdmVudFR5cGUiLCJUT1VDSF9FTkQiLCJldmVudCIsImNoYW5nZU1haW5VaVN0YXR1cyIsImJ0bl9pbmRleCIsIm1haW5fc2NlbmUiLCJzZXRNYWl1aUJ0blN0YXR1cyIsImRyYW1hX3NjZW5lIiwic2tlbGV0b24iLCJzcCIsIlNrZWxldG9uIiwiY3VyX3NlbGVjdF9idG4iLCJhY3RpdmUiLCJ0b3BfY29udGFpbmVyIiwiZXhwX2JhciIsImV4cF9uZCIsImdjb3JlIiwiVGltZXIiLCJzZXQiLCJleHBfd2RnIiwid2lkdGgiLCJsZWZ0IiwiZmlnaHRfY29uIiwiY29pbl90b3VjaCIsImdvbGRfdG91Y2giLCJTcHJpdGVfOCIsIlNwcml0ZV8xMCIsImNvaW5fcmVkcG9pbnQiLCJnZXRNb2RlbCIsImdldFJlZFN0YXR1cyIsImhlYWRfY29udGFpbmVyIiwicGxheWVyX2hlYWQiLCJzZXRQYXJlbnQiLCJzaG93IiwiaW5mb19jb250YWluZXIiLCJsZXZfbGFiZWwiLCJuYW1lX2xhYmVsIiwiY29pbl9sYWJlbF9uZCIsImdvbGRfbGFiZWxfbmQiLCJjb2luX2xhYmVsIiwiZ29sZF9sYWJlbCIsImZpZ2h0X2xhYmVsIiwiY29pbl9uZCIsImdvbGRfbmQiLCJjb2luX3NwIiwiU3ByaXRlIiwiZ29sZF9zcCIsImhpZGVfY29udGFpbmVyIiwiaGFuZGxlX2J0biIsInByb21wdF9jb250YWluZXIiLCJwcm9tcHRfdGlwc19sYXlvdXQiLCJwcm9tcHRfYnViYmxlX2xheW91dCIsInByb21wdF90aXBzX2J0biIsInByb21wdF9kZXNjIiwicHJvbXB0X2J1YmJsZSIsInByb21wdF9idWJibGVfc2l6ZSIsImdldENvbnRlbnRTaXplIiwicHJvbXB0X3RpcHNfc2Nyb2xsIiwicHJvbXB0X3RpcHNfc2Nyb2xsX3NpemUiLCJjb3VudF9zaXplX2xhYmVsIiwicHJvbXB0X3RpcHNfYmciLCJwcm9tcHRfdGlwc19iZ19zaXplIiwicHJvbXB0X21hc2siLCJjcmVhdG9yQ2hhdEJ0biIsIlJlZE1nciIsImFkZENhbEhhbmRsZXIiLCJ1cGRhdGVDaGF0TXNnTnVtIiwidXBkYXRlSGFuZGxlQnRuU2hvd1N0YXR1cyIsIlVTRV9TREsiLCJQTEFURk9STV9UWVBSIiwiY3JlYXRvckN1c3RvbWVyU2VydmljZUJ0biIsImltYWdlXzIiLCJ2aXBfbGFiZWwiLCJrIiwidHlwZSIsInYiLCJpY29uX2NvbnRhaW5lciIsIl94IiwiX3kiLCJyaWdodF90b3BfMSIsImhlaWdodCIsInJpZ2h0X3RvcF8yIiwicmlnaHRfYm90dG9tXzEiLCJyaWdodF9ib3R0b21fMiIsImljb25fd2lkZ2V0Iiwicm9sZV92byIsImdldFJvbGVWbyIsImdldEl0ZW1SZXMiLCJyZXMiLCJzcHJpdGVGcmFtZSIsInJlZ2lzdGVyRXZlbnQiLCJjcmVhdGVDaGFsbGVuZ2VFZmZlY3QiLCJ1cGRhdGVSb2xlRGF0YSIsIm1heF9kdW5faWQiLCJjaGVja1VuTG9ja1N0YXR1cyIsImNoZWNrVW5Mb2NrU3RhdHVzQnlMZXYiLCJmdW5jdGlvbl90aW1lX3RpY2tldCIsImFjdGlvbl9saXN0IiwiZ2V0QWxsQWN0aW9uTGlzdCIsImZ1bmN0aW9uVGltZVRpY2tldExpc3QiLCJORUVEX0FEQVBUSVZFX1NESyIsIldYX0ZJVCIsImFkZF92YWwiLCJsb2ciLCJjb25zb2xlIiwidG9wX3dkZyIsImNvbjFfd2RnIiwidXBkYXRlTG9hZGluZyIsImNsb3NlX2xvZ2luX3RpY2tldCIsIm9wZW5Mb2dpbldpbmRvdyIsImRlbCIsIklTX0xPQURJTkciLCJTREsiLCJzdWJtaXRMb2dpbiIsImRhdGFQbGFjZW1lbnQiLCJsb2dpbkxvZyIsIkdsb2JhbEV2ZW50IiwiZmlyZSIsIkxPQURJTkdfRU5URVJfU0NFTkUiLCJCYWNrcGFja0NvbnRyb2xsZXIiLCJnZXRIZXJvQ2hpcFJlZFBvaW50IiwiY3RybENhY2hlc1JlZCIsImdldENhY2hlc0J0blJlZCIsImkiLCJsZW5ndGgiLCJ1cGRhdGVCdG5UaXBzUG9pbnQiLCJyZXNldENhY2hlc1JldERhdGEiLCJ1cGRhdGVTaGVucWkiLCJ0YXNrX3RpcHNfcGFuZWwiLCJib3R0b20iLCJ1cGRhdGVBbGlnbm1lbnQiLCJ0YXNrX2NvbnRhaW5lciIsImxpbWl0X2xldiIsInF1ZXN0X2RhdGEiLCJkYXRhX2NvbnN0IiwidGFza19vcGVuIiwidmFsIiwibGV2IiwiVGFza1RpcHNQYW5lbCIsImRlbGV0ZVRhc2tUaXAiLCJkZWxldGVNZSIsImdldFRhc2tUaXBzUGFuZWwiLCJidG5fb2JqZWN0Iiwic2tlbGV0b25EYXRhIiwic2V0QW5pbWF0aW9uIiwiX29uQ2xpY2tQcm9tcHRUaXBzIiwib3BlblJvbGVJbmZvVmlldyIsIm9wZW5FeGNoYW5nZU1haW5WaWV3IiwiaXNfaGVyb19wYW5lbCIsIm9wZW5WaXBNYWluV2luZG93IiwiVklQVEFCQ09OU1QiLCJDSEFSR0UiLCJvcGVuVGlwc1NvdXJjZSIsIlV0aWxzIiwiZ2V0SXRlbUNvbmZpZyIsInNocmlua0J0bkNvbnRhaW5lciIsImNoYXRfbmV3bXNnX2V2ZW50IiwiRXZlbnRJZCIsIkNIQVRfTkVXTVNHX0ZMQUciLCJjb2luX3RvdWNoX3JlZHBvaW50IiwiRXh0cmFfUmV3YXJkIiwiZGF0YSIsIlVQREFURV9ST0xFX0FUVFJJQlVURSIsImtleSIsInVwZGF0ZVJvbGVQb3dlciIsInVwZGF0ZVJvbGVMZXYiLCJ1cGRhdGVSb2xlTmFtZSIsInVwZGF0ZVJvbGVDb2luIiwidXBkYXRlUm9sZUdvbGQiLCJzZXRIZWFkUmVzIiwic2V0RnJhbWVSZXMiLCJ1cGRhdGVSb2xlVmlwIiwidXBkYXRlUm9sZUV4cCIsInVwZGF0ZUhlcm9FeHAiLCJ1cGRhdGVfcHJvbXB0X3RpcHMiLCJBRERfUFJPTVBUX0RBVEEiLCJpc19vcGVuIiwiaXNDaGF0T3BlbiIsInNob3dQcm9tcHRCdWJibGUiLCJtb2RlbCIsImxpc3QiLCJnZXRQcm9tcHRMaXN0IiwiZ2V0QXJyTGVuIiwic2hvd1Byb21wdFRpcHMiLCJyZW1vdmVfcHJvbXB0X3RpcHMiLCJSRU1PVkVfUFJPTVBUX0RBVEEiLCJvcGVuIiwiaGFuZGxlSGlkZUNvbnRhaW5lciIsImNoZWNrU2hvd05ld1Byb21wdEJ1YmJsZSIsInN0YXR1cyIsImhpZGVfY29udGFpbmVyX3N0YXR1cyIsIndhaXRfdXBkYXRlIiwiZnVuY3Rpb25VcGRhdGVMaXN0IiwiZ2V0SGlkZUNvbnRhaW5lclN0YXR1cyIsImNsb3NlIiwic3ViX3R5cGUiLCJleHRlbmRfZGF0YSIsImlzX3VubG9jayIsIm1lc3NhZ2UiLCJkZXNjIiwiY2hlY2tGaWdodENsaWNrU3RhdHVzIiwiY2xvc2VBbGxXaW5kb3ciLCJEYXJtYSIsInJlcXVlc3RDdXRPdXRCYXR0bGUiLCJjbGVhckJhdHRsZVNjZW5lIiwiY2hhbmdlQmFja2dyb3VuZE11c2ljIiwibWFpblNjZW5lQ3RybCIsImVudGVyTWFpblNjZW5lIiwicGFydG5lciIsImhlcm9fY29udHJvbGxlciIsIm9wZW5IZXJvQmFnV2luZG93IiwiYmFja3BhY2siLCJjb250cm9sbGVyIiwib3Blbk1haW5XaW5kb3ciLCJyZXF1ZXN0T3BlbkJhdHRsZVJlbGV2YW5jZVdpbmRvdyIsIkZpZ2h0X1R5cGUiLCJlc2Vjc2ljZSIsIm9wZW5Fc2Vjc2ljZVZpZXciLCJndWlsZCIsImNoZWNrT3Blbkd1aWxkV2luZG93IiwiR3VpbGRza2lsbENvbnRyb2xsZXIiLCJjbGVhckd1aWxkU2tpbGxJY29uUmVkIiwiaGFsbG93cyIsImhhbGxvd3NfaWQiLCJtYWdpY19pZCIsIm9wZW5IYWxsb3dzTWFpbldpbmRvdyIsImRvQ2hhbmdlQnlTdWJUeXBlIiwicGxheU11c2ljIiwiQVVESU9fVFlQRSIsIlNDRU5FIiwibWFpbl90eXBlIiwiYXJlbmFfY2FsbCIsIlNjZW5lQ29uc3QiLCJBcmVuYUNvbnN0Iiwib3BlbkJ1aWxkIiwiQ2VudGVyU2NlbmVCdWlsZCIsImFyZW5hIiwiYXJlbmFfdHlwZSIsImxvb3AiLCJjaGFtcGlvbl9jYWxsIiwicmFuayIsImd1aWxkX2Jvc3MiLCJnaWQiLCJUSTE4TiIsIkd1aWxkRHVuIiwic3RhcnRvd2VyIiwiU3RhclRvd2VyIiwicGFydG5lcnN1bW1vbiIsIm9wZW5QYXJ0bmVyU3VtbW9uV2luZG93IiwiZXNjb3J0IiwiRXNjb3J0Iiwid29uZGVyZnVsIiwiQWN0aW9uQ29uc3QiLCJvcGVuQWN0aW9uTWFpblBhbmVsIiwiQWN0aW9uVHlwZSIsIldvbmRlcmZ1bCIsImdvZGJhdHRsZSIsIkdvZGJhdHRsZSIsIndvcmxkX2Jvc3MiLCJXb3JsZEJvc3MiLCJmdW5jdGlvbl9pY29uIiwiaWNvbkNsaWNrSGFuZGxlIiwiZ3VpbGR3YXIiLCJHdWlsZFdhciIsImxhZGRlcndhciIsIkxhZGRlcldhciIsInByaW11c3dhciIsIlByaW11c1dhciIsImV4cGVkaXRfZmlnaHQiLCJFeHBlZGl0RmlnaHQiLCJlbmRsZXNzIiwiRW5kbGVzcyIsImR1bmdlb25zdG9uZSIsIkR1bmdlb25TdG9uZSIsInNlZXJwYWxhY2UiLCJvcGVuU2VlcnBhbGFjZU1haW5XaW5kb3ciLCJhZHZlbnR1cmUiLCJyZXF1ZXN0RW50ZXJBZHZlbnR1cmUiLCJmb3JnZV9ob3VzZSIsIm9wZW5Gb3JnZUhvdXNlVmlldyIsImR1bmdlb25fYXV0byIsImJhdHRsZV9kcmFtYV9tb2RlbCIsIkJhdHRsZURyYW1hQ29udHJvbGxlciIsImRyYW1hX2RhdGEiLCJnZXREcmFtYURhdGEiLCJnZXRTaW5nbGVCb3NzRGF0YSIsIm9wZW5EcmFtQm9zc0luZm9WaWV3IiwiQmF0dGxlQ29udHJvbGxlciIsImlzX2NsaWNrX3N0YXR1cyIsImdldElzQ2xpY2tTdGF0dXMiLCJjb21iYXRfdHlwZSIsImdldENvbWJhdFR5cGUiLCJzdHIiLCJIZXJvVGVzdFdhciIsImNvbWZpcmVfZnVuIiwiY3NGaWdodEV4aXQiLCJDb21tb25BbGVydCIsImZpZ2h0X3R5cGUiLCJnZXRVSUZpZ2h0QnlJbmRleCIsInNldFVJRmlnaHRUeXBlIiwidWlfZmlnaHRfdHlwZSIsImdldE1haW5VSUluZGV4IiwiY2hhdF9tb2RlbCIsInJlZF9udW0iLCJnZXRVbnJlYWROdW0iLCJjaGF0X3JlZF9iZyIsImNoYXRfcmVkX251bSIsInVwZGF0ZVJvbGVIZWFkIiwidXBkYXRlUm9sZUhlYWRGcmFtZSIsIm5hbWUiLCJnZXRNb25leVN0cmluZyIsImNvaW4iLCJnb2xkIiwicG93ZXIiLCJmYWNlX2lkIiwiYXZhdGFyX2Jhc2VfaWQiLCJleHAiLCJleHBfbWF4IiwicHJvIiwic2NhbGVYIiwiYWRkSWNvbkxpc3QiLCJuZXh0Iiwidm8iLCJjaGVja0ljb25JbiIsImlkIiwicHVzaCIsInNvcnQiLCJ0YWJsZUxvd2VyU29ydGVyIiwiYWRkX2Z1bmN0aW9uX3RpbWVyIiwiY3JlYXRlRnVuY3Rpb25JY29uIiwiYWRkSWNvbiIsInJlbW92ZUljb24iLCJnZGF0YSIsInNwbGljZSIsInVwZGF0ZUljb25MYXlvdXQiLCJpc19zaG93IiwiYWRkSXRlbVRvVGFiQXJyYXkiLCJpc19uZXciLCJsYXlvdXQiLCJnZXRDb250YWluZXJCeVR5cGUiLCJsZW4iLCJGdW5jdGlvbkljb24iLCJzZXRJY29uUG9zaXRpb24iLCJzaXplIiwib2ZmX2hlaWdodCIsIk1hdGgiLCJmbG9vciIsIm9yaWdpbmFsIiwiZ2V0Tm9yS2V5IiwidjIiLCJvZmZfeSIsImFicyIsInRlbXBfeSIsImNlaWwiLCJ0b3BfMl9vZmZfeSIsInRvcF8xIiwidG9wXzIiLCJlbmRfdGltZSIsInVwZGF0ZVRpbWUiLCJyZW1haW5fc2VjIiwidXBkYXRlSWNvblJlcyIsInNldEJvdHRvbVN0YXR1cyIsInNldFRvcFN0YXR1cyIsInNldE51bSIsInZpcF9sZXYiLCJiaWQiLCJib29sIiwiZ2V0Um9vdFduZCIsImNiIiwibGF5b3V0XzEiLCJsYXlvdXRfMiIsIm1vdmVfYnlfMSIsIm1vdmVfYnlfMiIsImZhZGVfMSIsImZhZGVfMiIsIm1vdmVCeSIsImZhZGVPdXQiLCJmYWRlSW4iLCJjYWxsX2Z1bl8xIiwiY2FsbEZ1bmMiLCJjYWxsX2Z1bl8yIiwicnVuQWN0aW9uIiwic2VxdWVuY2UiLCJzcGF3biIsInNob3dQb3dlciIsInBvd2VyX2FkZCIsImxhc3RfcG93ZXIiLCJwb3dlcl9zaG93X25kIiwiUHJlZmFiIiwicnVuUG93ZXJBY3Rpb24iLCJkaWFsb2d1ZSIsInBvd2VyX3NrIiwidGV4X2Nvbl9uZCIsIm9sZF9wb3dlcl9yYiIsIlJpY2hUZXh0Iiwic3lzIiwiYnJvd3NlclR5cGUiLCJCUk9XU0VSX1RZUEVfSUUiLCJsaW5lSGVpZ2h0IiwiYWRkX3Bvd2VyX2xiIiwiYW5pbWFfcmVzIiwiZ2V0RWZmZWN0UmVzIiwiYW5pbWFfcGF0aCIsImdldFNwaW5lUGF0aCIsInBvd2VyX3NkIiwiYWRkX3RpbWVyIiwic3RvcEFsbEFjdGlvbnMiLCJsYXN0X3Bvd2VyX3N0ciIsImxhc3RfcG93ZXJfZHMiLCJpdGVtX2kiLCJjYWxjdV9udW0iLCJvcGFjaXR5IiwiZGVsYXlfdGltZSIsImRlbGF5VGltZSIsImFjdGlvbiIsImZpbmlzaF9jYiIsImRlc3Ryb3kiLCJwb3dlcl9hY3QiLCJoZXJvX2V4cCIsImNoYW5nZUhlcm9TdGF0dXMiLCJpc19oZXJvIiwiY2hhdF9idG5fbmQiLCJ3aWRnZXQiLCJhZGRDb21wb25lbnQiLCJpc0FsaWduQm90dG9tIiwiQnV0dG9uIiwidHJhbnNpdGlvbiIsIlRyYW5zaXRpb24iLCJTQ0FMRSIsInpvb21TY2FsZSIsImR1cmF0aW9uIiwiZ2V0VUlJY29uUGF0aCIsImFkZENoaWxkIiwiZm9udFNpemUiLCJob3Jpem9udGFsQWxpZ24iLCJtYWNybyIsIlRleHRBbGlnbm1lbnQiLCJDRU5URVIiLCJ2ZXJ0aWNhbEFsaWduIiwibm9kZSIsInRvdWNoX2JlZ2FuIiwiaXNfbW92ZSIsImdldExvY2F0aW9uIiwicG9zIiwiaXNfY2xpY2siLCJnZXRTY2VuZU5vZGUiLCJjb252ZXJ0VG9Ob2RlU3BhY2VBUiIsImNoZWNrUG9zSW5SZWN0IiwicGxheUJ1dHRvblNvdW5kIiwiQ2hhdEN0cmwiLCJvcGVuQ2hhdFBhbmVsIiwic2hvd0NoYXRCdG4iLCJHdWlkZUNvbnRyb2xsZXIiLCJpc0luR3VpZGUiLCJzZXRNYWluVUlDaGF0QnViYmxlU3RhdHVzIiwiY2hhdF9idWJibGVfc3RhdHVzIiwibGVmdF94IiwicmlnaHRfeCIsInRvcF95IiwiYm90dG9tX3kiLCJnZXROb3RCdWJibGVQcm9tcHQiLCJzZXRTaG93QnViYmxlU3RhdHVzIiwiX3VwZGF0ZVJlbmRlckRhdGEiLCJzZXRDb250ZW50U2l6ZSIsImZhZGVpbiIsImZhZGVvdXQiLCJkZXN0cm95QWxsQ2hpbGRyZW4iLCJtYXhfd2lkdGgiLCJidXR0b25faGVpZ2h0IiwiYnV0dG9uX2hlaWdodF9zcGFjZSIsIm1heF9oZWlnaHQiLCJtYXgiLCJzY3JvbGxfaGVpZ2h0IiwibWluIiwidGlwc19zY3JvbGxfd2lkdGgiLCJ0aXBzX2JnX3dpZHRoIiwiaXRlbSIsImltYWdlIiwiVHlwZSIsIlNMSUNFRCIsInNpemVNb2RlIiwiU2l6ZU1vZGUiLCJDVVNUT00iLCJzZXRBbmNob3JQb2ludCIsIlNwcml0ZUZyYW1lIiwiY29sb3IiLCJDb2xvciIsImZyb21IRVgiLCJjb2xvcl9kYXRhIiwiZGF0YV9jb2xvcjE2Iiwib25DbGlja1Byb21wdFRpcHNJdGVtIiwiY3VzdG9tZXJfc2VydmljZSIsImNyZWF0ZUNsYXNzIiwiY29udGFpbmVyIiwibG9hZGluZyIsIm1vZHVsZSIsImV4cG9ydHMiXSwi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S0FBakM7O0FBQ0EsVUFBSSxLQUFLa0QsV0FBVCxFQUFzQjtBQUNsQixhQUFLQSxXQUFMLENBQWlCbEQsTUFBakIsR0FBMEIsS0FBMUI7QUFDSDtBQUNKLEtBTEQsTUFLTztBQUNILFdBQUtzQyxrQkFBTCxDQUF3QnRDLE1BQXhCLEdBQWtDLElBQWxDOztBQUNBLFVBQUksS0FBS2tELFdBQVQsRUFBc0I7QUFDbEIsYUFBS0EsV0FBTCxDQUFpQmxELE1BQWpCLEdBQTBCLElBQTFCO0FBQ0g7QUFDSjtBQUNKLEdBMWdEcUI7QUEyZ0R0QjtBQUNBMEQsRUFBQUEseUJBQXlCLEVBQUUscUNBQVk7QUFDbkMsUUFBSSxLQUFLcWEsZ0JBQVQsRUFBMkI7QUFDdkIsV0FBS0EsZ0JBQUwsQ0FBc0IvVixRQUF0QjtBQUNBLFdBQUsrVixnQkFBTCxHQUF3QixJQUF4QjtBQUNIOztBQUNELFNBQUtBLGdCQUFMLEdBQXdCbFYsS0FBSyxDQUFDbVYsV0FBTixDQUFrQix5QkFBbEIsQ0FBeEI7O0FBQ0EsUUFBSUMsU0FBUyxHQUFHMWtCLE9BQU8sQ0FBQyxhQUFELENBQVAsQ0FBdUJxQyxXQUF2QixHQUFxQ3FmLFlBQXJDLENBQWtEbGUsU0FBUyxDQUFDbWhCLE9BQTVELENBQWhCOztBQUVBLFNBQUtILGdCQUFMLENBQXNCM2MsU0FBdEIsQ0FBZ0M2YyxTQUFoQztBQUNBLFNBQUtGLGdCQUFMLENBQXNCMWMsSUFBdEI7QUFDSDtBQXRoRHFCLENBQVQsQ0FBakI7QUEyaERBOGMsTUFBTSxDQUFDQyxPQUFQLEdBQWlCL2pCLFVBQWpCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogc2hpcmFob0BzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgICDkuLvnlYzpnaLmjqfliLZcbi8vIDxici8+Q3JlYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgTG9hZGVyTWFuYWdlciA9IHJlcXVpcmUoXCJsb2FkZXJtYW5hZ2VyXCIpO1xudmFyIFBhdGhUb29sID0gcmVxdWlyZShcInBhdGh0b29sXCIpO1xudmFyIFBsYXllckhlYWQgPSByZXF1aXJlKFwicGxheWVyaGVhZFwiKTtcbnZhciBNYWluVWlDb25zdCA9IHJlcXVpcmUoXCJtYWludWlfY29uc3RcIik7XG52YXIgQmF0dGxlQ29uc3QgPSByZXF1aXJlKFwiYmF0dGxlX2NvbnN0XCIpO1xudmFyIFJvbGVDb250cm9sbGVyID0gcmVxdWlyZShcInJvbGVfY29udHJvbGxlclwiKTtcbnZhciBFeGNoYW5nZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwiZXhjaGFuZ2VfY29udHJvbGxlclwiKTtcbnZhciBGdW5jdGlvbkljb25WbyA9IHJlcXVpcmUoXCJmdW5jdGlvbl9pY29uX3ZvXCIpO1xudmFyIENoYXRDb250cm9sbGVyID0gcmVxdWlyZShcImNoYXRfY29udHJvbGxlclwiKTtcbnZhciBFeGNoYW5nZUV2ZW50ID0gcmVxdWlyZShcImV4Y2hhbmdlX2V2ZW50XCIpXG52YXIgTG9naW5Db250cm9sbGVyID0gcmVxdWlyZShcImxvZ2luX2NvbnRyb2xsZXJcIik7XG52YXIgTWFpbnVpRXZlbnQgPSByZXF1aXJlKFwibWFpbnVpX2V2ZW50XCIpO1xudmFyIFByb21wdEV2ZW50ID0gcmVxdWlyZShcInByb21wdF9ldmVudFwiKVxudmFyIFByb21wdENvbnRyb2xsZXIgPSByZXF1aXJlKFwicHJvbXB0X2NvbnRyb2xsZXJcIilcbnZhciBNYWluVUlWaWV3ID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VDbGFzcyxcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucmxlYXNlUHJlZmFiID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaW5pdENvbmZpZygpO1xuICAgICAgICB0aGlzLmNyZWF0ZVJvb3RXbmQoKTtcbiAgICB9LFxuICAgIC8vIGNjLnN5cy5nZXRTYWZlQXJlYVJlY3QoKVxuICAgIGluaXRDb25maWc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5ib3R0b21fYnRuX2xpc3QgPSBbXTsgICAgICAgICAgLy8g5LiL6Z2iN+S4quagh+etvumhtVxuICAgICAgICB0aGlzLmN1cl9zZWxlY3RfaW5kZXggPSAwO1xuICAgICAgICB0aGlzLnJlbmRlcl9saXN0ID0gW11cdFx0XHRcdFx0XHQvLyDlvoXmt7vliqDnmoTlrp7kvovlr7nosaFcbiAgICAgICAgdGhpcy5yZW5kZXJfbGlzdF9kaWMgPSB7fVx0XHRcdFx0XHQvLyDkvYbmt7vliqDlrp7kvovlrZflhbhcbiAgICAgICAgdGhpcy5mdW5jdGlvbl9saXN0ID0ge307ICAgICAgICAgICAgICAgICAgICAvL+aYvuekuueahOWunuS+i+WvueixoVxuICAgICAgICB0aGlzLmljb25fY29udGFpbmVyX2xpc3QgPSB7fTsgICAgICAgICAgICAgIC8v5qC55o2u5pa55L2N5L+d5a2Y6ZyA6KaB5YKo5a2Y55qE5Zu+5qCH55qE54i26IqC54K5XG4gICAgICAgIHRoaXMuaWNvbl93aWRnZXRfbGlzdCA9IHt9OyAgICAgICAgICAgICAgICAgLy/moLnmja7mlrnkvY3kv53lrZjpnIDopoHlgqjlrZjnmoTlm77moIfnmoR3aWRnZXToioLngrlcblxuICAgICAgICB0aGlzLmJ0bl9jYWNoZV90aXBzID0ge30gICAgICAgICAgICAvL+e6oueCuee8k+WtmFxuXG4gICAgICAgIHRoaXMubGVmdF9vZmYgPSAyMFxuICAgICAgICB0aGlzLnJpZ2h0X29mZiA9IDIwXG4gICAgICAgIHRoaXMubGVmdF9tYXhfc3VtID0gNztcbiAgICAgICAgdGhpcy5pc19pbl9zaHJpbmsgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc19zaHJpbmsgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sYXlvdXRfbGlzdCA9IHt9XG4gICAgfSxcblxuICAgIGNyZWF0ZVJvb3RXbmQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gdGhpcy5ub2RlID0gbmV3IGNjLk5vZGUoXCJiYXNlX3Jvb3RcIik7XG4gICAgICAgIC8vIHRoaXMubm9kZS5zZXRBbmNob3JQb2ludCgwLCAwKTtcbiAgICAgICAgLy8gdGhpcy5ub2RlLnNldENvbnRlbnRTaXplKFNDUkVFTl9XSURUSCwgU0NSRUVOX0hFSUdIVCk7XG4gICAgICAgIC8vIHRoaXMubm9kZS5zZXRQb3NpdGlvbigtU0NSRUVOX1dJRFRIICogMC41LCAtU0NSRUVOX0hFSUdIVCAqIDAuNSk7XG4gICAgICAgIC8vIFZpZXdNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkVG9TY2VuZU5vZGUodGhpcy5ub2RlLCBTQ0VORV9UQUcudG9wKVxuXG4gICAgICAgIC8vIOiOt+WPluS4gOS6m+mcgOimgeS9v+eUqOeahOWNleS+i1xuICAgICAgICB0aGlzLm1haW51aV9jb250cm9sbGVyID0gcmVxdWlyZShcIm1haW51aV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCk7XG4gICAgICAgIHRoaXMuYmF0dGxlX2NvbnRyb2xsZXIgPSByZXF1aXJlKFwiYmF0dGxlX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKTtcblxuICAgICAgICB2YXIgcHJlZmFiUGF0aCA9IFBhdGhUb29sLmdldFByZWZhYlBhdGgoXCJtYWludWlcIiwgXCJtYWludWlfdmlld1wiKTtcbiAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRSZXMocHJlZmFiUGF0aCwgZnVuY3Rpb24gKHJlc19vYmplY3QpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdE1haW5VSShyZXNfb2JqZWN0KTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICB9LFxuXG4gICAgaW5pdE1haW5VSTogZnVuY3Rpb24gKHJlc19vYmplY3QpIHtcbiAgICAgICAgdGhpcy5yb290X3duZCA9IHJlc19vYmplY3Q7XG5cbiAgICAgICAgaWYgKCF3aW5kb3cuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdF93bmQuZ2V0Q29tcG9uZW50KGNjLldpZGdldCkuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yb290X3duZC5zZXRQb3NpdGlvbigtU0NSRUVOX1dJRFRIICogMC41LCAtU0NSRUVOX0hFSUdIVCAqIDAuNSlcbiAgICAgICAgLy8gdGhpcy5ub2RlLmFkZENoaWxkKHRoaXMucm9vdF93bmQpO1xuICAgICAgICBWaWV3TWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFRvU2NlbmVOb2RlKHRoaXMucm9vdF93bmQsIFNDRU5FX1RBRy50b3ApXG5cbiAgICAgICAgaWYgKHRoaXMucm9vdF93bmRfY2IpXG4gICAgICAgICAgICB0aGlzLnJvb3Rfd25kX2NiKHRoaXMucm9vdF93bmQpO1xuXG4gICAgICAgIC8vIOS4i+mDqOWIhueahDfkuKrmjInpkq5cbiAgICAgICAgdGhpcy5ib3R0b21fY29udGFpbmVyID0gdGhpcy5yb290X3duZC5nZXRDaGlsZEJ5TmFtZShcImJvdHRvbV9jb250YWluZXJcIik7XG4gICAgICAgIHRoaXMuYnRuX2NvbiA9IHRoaXMuYm90dG9tX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImJudF9jb25cIik7XG4gICAgICAgIC8vIGdjb3JlLlRpbWVyLnNldChmdW5jdGlvbigpeyAgICAgICAgXG4gICAgICAgIC8vICAgICB2YXIgYnRuX2xvID0gIHRoaXMuYnRuX2Nvbi5nZXRDb21wb25lbnQoY2MuTGF5b3V0KTtcbiAgICAgICAgLy8gICAgIHZhciBzcGNpbmdYID0gKHRoaXMuYnRuX2Nvbi53aWR0aCAtIGJ0bl9sby5wYWRkaW5nTGVmdCAtIGJ0bl9sby5wYWRkaW5nUmlnaHQgLSAoOTMgKiA2ICsgMTA1KSkvNjtcbiAgICAgICAgLy8gICAgIGJ0bl9sby5zcGFjaW5nWCA9IHNwY2luZ1g7XG4gICAgICAgIC8vICAgICBjYy5sb2coc3BjaW5nWCk7XG4gICAgICAgIC8vIH0uYmluZCh0aGlzKSwgMC4yKVxuICAgICAgICBpZiAod2luZG93LmlzTW9iaWxlICYmIHdpbmRvdy5GSVRfSEVJREdIVCkge1xuICAgICAgICAgICAgdmFyIGJ0bl9sbyA9IHRoaXMuYnRuX2Nvbi5nZXRDb21wb25lbnQoY2MuTGF5b3V0KTtcbiAgICAgICAgICAgIHZhciBzcGNpbmdYID0gKFNDUkVFTl9XSURUSCAqIEZJVF9TQ0FMRSAtIGJ0bl9sby5wYWRkaW5nTGVmdCAtIGJ0bl9sby5wYWRkaW5nUmlnaHQgLSAoOTMgKiA2ICsgMTA1KSkgLyA2O1xuICAgICAgICAgICAgYnRuX2xvLnNwYWNpbmdYID0gc3BjaW5nWDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCA3OyBpbmRleCsrKSB7XG4gICAgICAgICAgICB2YXIgYnRuID0gdGhpcy5idG5fY29uLmdldENoaWxkQnlOYW1lKFwibWFpbnVpX3RhYl9cIiArIChpbmRleCArIDEpKTtcblxuICAgICAgICAgICAgaWYgKGJ0bikge1xuICAgICAgICAgICAgICAgIHZhciB0aXBzX3BvaW50ID0gYnRuLmdldENoaWxkQnlOYW1lKFwidGlwc19wb2ludFwiKTtcbiAgICAgICAgICAgICAgICB2YXIgbm9ybWFsID0gYnRuLmdldENoaWxkQnlOYW1lKFwibm9ybWFsXCIpO1xuICAgICAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IGJ0bi5nZXRDaGlsZEJ5TmFtZShcInNlbGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIHZhciBpY29uID0gYnRuLmdldENoaWxkQnlOYW1lKFwiaWNvblwiKTtcbiAgICAgICAgICAgICAgICB2YXIgbm90aWNlID0gYnRuLmdldENoaWxkQnlOYW1lKFwibm90aWNlXCIpXG4gICAgICAgICAgICAgICAgdmFyIGluaXRfeCA9IGJ0bi5nZXRQb3NpdGlvbigpLnhcbiAgICAgICAgICAgICAgICB2YXIgaW5pdF95ID0gYnRuLmdldFBvc2l0aW9uKCkueVxuXG4gICAgICAgICAgICAgICAgdGhpcy5ib3R0b21fYnRuX2xpc3RbaW5kZXhdID0geyBidG46IGJ0biwgaW5kZXg6IGluZGV4LCB0aXBzX3BvaW50OiB0aXBzX3BvaW50LCBub3JtYWw6IG5vcm1hbCwgc2VsZWN0ZWQ6IHNlbGVjdGVkLCBpY29uOiBpY29uLCBub3RpY2U6IG5vdGljZSwgdGlwc19zdGF0dXM6IGZhbHNlLCBpbml0X3g6IGluaXRfeCwgaW5pdF95OiBpbml0X3kgfVxuICAgICAgICAgICAgICAgIGxldCBjb25maWcgPSBDb25maWcuZnVuY3Rpb25fZGF0YS5kYXRhX2Jhc2VbaW5kZXggKyAxXVxuICAgICAgICAgICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLmFjdGl2YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYm90dG9tX2J0bl9saXN0W2luZGV4XS5jb25maWcgPSBjb25maWdcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYm90dG9tX2J0bl9saXN0W2luZGV4XS5ub3RpY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYm90dG9tX2J0bl9saXN0W2luZGV4XS5ub3RpY2UuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKS5zdHJpbmcgPSBjb25maWcubGFiZWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnRuLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZU1haW5VaVN0YXR1cyhpbmRleCk7XG4gICAgICAgICAgICAgICAgfSkuYmluZCh0aGlzKSlcblxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSBNYWluVWlDb25zdC5idG5faW5kZXgubWFpbl9zY2VuZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldE1haXVpQnRuU3RhdHVzKGluZGV4KVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT0gTWFpblVpQ29uc3QuYnRuX2luZGV4LmRyYW1hX3NjZW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYm90dG9tX2J0bl9saXN0W2luZGV4XS5za2VsZXRvbiA9IGljb24uZ2V0Q29tcG9uZW50KHNwLlNrZWxldG9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJfc2VsZWN0X2luZGV4ID0gaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJfc2VsZWN0X2J0biA9IHRoaXMuYm90dG9tX2J0bl9saXN0W2luZGV4XVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cl9zZWxlY3RfYnRuLm5vcm1hbC5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJfc2VsZWN0X2J0bi5zZWxlY3RlZC5hY3RpdmUgPSB0cnVlXG4gICAgICAgICAgICAgICAgICAgIGJ0bi55ID0gdGhpcy5ib3R0b21fYnRuX2xpc3RbaW5kZXhdLmluaXRfeSArIDEwXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIOS4iumDqOWIhueahOaYvuekulxuICAgICAgICB0aGlzLnRvcF9jb250YWluZXIgPSB0aGlzLnJvb3Rfd25kLmdldENoaWxkQnlOYW1lKFwidG9wX2NvbnRhaW5lclwiKTtcbiAgICAgICAgdGhpcy5leHBfYmFyID0gdGhpcy50b3BfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiZXhwX2JhclwiKVxuICAgICAgICB2YXIgZXhwX25kID0gdGhpcy50b3BfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiZXhwX2JhclwiKTtcblxuICAgICAgICBnY29yZS5UaW1lci5zZXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGV4cF93ZGcgPSBleHBfbmQuZ2V0Q29tcG9uZW50KGNjLldpZGdldCk7XG4gICAgICAgICAgICB0aGlzLmV4cF9iYXIud2lkdGggPSB0aGlzLnJvb3Rfd25kLndpZHRoIC0gZXhwX3dkZy5sZWZ0O1xuICAgICAgICB9LmJpbmQodGhpcyksIDAuMSlcblxuICAgICAgICB0aGlzLmZpZ2h0X2NvbiA9IHRoaXMudG9wX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImZpZ2h0X2NvblwiKTtcbiAgICAgICAgdGhpcy5jb2luX3RvdWNoID0gdGhpcy50b3BfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiY29pbl90b3VjaFwiKTsgICAgICAgICAgICAgICAgICAgICAvLyDph5HluIHngrnlh7vljLrln59cbiAgICAgICAgdGhpcy5nb2xkX3RvdWNoID0gdGhpcy50b3BfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiZ29sZF90b3VjaFwiKTsgICAgICAgICAgICAgICAgICAgICAvLyDpkrvnn7Pngrnlh7vljLrln59cbiAgICAgICAgdGhpcy5TcHJpdGVfOCA9IHRoaXMuY29pbl90b3VjaC5nZXRDaGlsZEJ5TmFtZShcIlNwcml0ZV84XCIpOyAgICAgICAgICAgICAgICAgICAgIC8vIOmHkeW4geWKoOWPt1xuICAgICAgICB0aGlzLlNwcml0ZV8xMCA9IHRoaXMuZ29sZF90b3VjaC5nZXRDaGlsZEJ5TmFtZShcIlNwcml0ZV8xMFwiKTsgICAgICAgICAgICAgICAgICAgICAvLyDpkrvnn7PliqDlj7dcbiAgICAgICAgdGhpcy5jb2luX3JlZHBvaW50ID0gdGhpcy5jb2luX3RvdWNoLmdldENoaWxkQnlOYW1lKFwiU3ByaXRlXzhcIikuZ2V0Q2hpbGRCeU5hbWUoXCJyZWRQb2ludFwiKSAvL+eCuemHkee6oueCuVxuICAgICAgICB0aGlzLmNvaW5fcmVkcG9pbnQuYWN0aXZlID0gRXhjaGFuZ2VDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5nZXRSZWRTdGF0dXMoKTtcblxuICAgICAgICB0aGlzLmhlYWRfY29udGFpbmVyID0gdGhpcy50b3BfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiaGVhZF9jb250YWluZXJcIik7ICAgICAgICAgICAgICAgLy8g5aS05YOP6YOo5YiGXG4gICAgICAgIHRoaXMucGxheWVyX2hlYWQgPSBuZXcgUGxheWVySGVhZCgpO1xuICAgICAgICB0aGlzLnBsYXllcl9oZWFkLnNldFBhcmVudCh0aGlzLmhlYWRfY29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5wbGF5ZXJfaGVhZC5zaG93KClcblxuICAgICAgICB0aGlzLmluZm9fY29udGFpbmVyID0gdGhpcy50b3BfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiaW5mb19jb250YWluZXJcIik7XG4gICAgICAgIHRoaXMubGV2X2xhYmVsID0gdGhpcy5pbmZvX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImxldl9sYWJlbFwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpOyAgICAgICAgICAgICAgICAgICAgICAgLy8g6KeS6Imy562J57qnXG4gICAgICAgIHRoaXMubmFtZV9sYWJlbCA9IHRoaXMuaW5mb19jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJuYW1lX2xhYmVsXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7ICAgICAgICAgICAgICAgICAgICAgLy8g6KeS6Imy5ZCN5a2XXG4gICAgICAgIHRoaXMuY29pbl9sYWJlbF9uZCA9IHRoaXMuY29pbl90b3VjaC5nZXRDaGlsZEJ5TmFtZShcIndlYWx0aF9sYWJlbF8xXCIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDph5HluIHmlbDph49cbiAgICAgICAgdGhpcy5nb2xkX2xhYmVsX25kID0gdGhpcy5nb2xkX3RvdWNoLmdldENoaWxkQnlOYW1lKFwid2VhbHRoX2xhYmVsXzJcIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOmSu+efs+aVsOmHj1xuICAgICAgICB0aGlzLmNvaW5fbGFiZWwgPSB0aGlzLmNvaW5fbGFiZWxfbmQuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTsgICAgICAgICAgICAgICAgIC8vIOmHkeW4geaVsOmHj1xuICAgICAgICB0aGlzLmdvbGRfbGFiZWwgPSB0aGlzLmdvbGRfbGFiZWxfbmQuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTsgICAgICAgICAgICAgICAgIC8vIOmSu+efs+aVsOmHj1xuICAgICAgICB0aGlzLmZpZ2h0X2xhYmVsID0gdGhpcy5maWdodF9jb24uZ2V0Q2hpbGRCeU5hbWUoXCJmaWdodF9sYWJlbFwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpOyAgICAgICAgICAgICAgICAgICAvLyDmiJjliptcbiAgICAgICAgdGhpcy5jb2luX25kID0gdGhpcy5jb2luX3RvdWNoLmdldENoaWxkQnlOYW1lKFwiU3ByaXRlXzJcIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g6YeR5biBbm9kZVxuICAgICAgICB0aGlzLmdvbGRfbmQgPSB0aGlzLmdvbGRfdG91Y2guZ2V0Q2hpbGRCeU5hbWUoXCJTcHJpdGVfNFwiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDpkrvnn7Nub2RlXG4gICAgICAgIHRoaXMuY29pbl9zcCA9IHRoaXMuY29pbl9uZC5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g6YeR5biB5Zu+5qCHXG4gICAgICAgIHRoaXMuZ29sZF9zcCA9IHRoaXMuZ29sZF9uZC5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g6ZK755+z5Zu+5qCHXG5cbiAgICAgICAgdGhpcy5oaWRlX2NvbnRhaW5lciA9IHRoaXMucm9vdF93bmQuZ2V0Q2hpbGRCeU5hbWUoXCJoaWRlX2NvbnRhaW5lclwiKVxuICAgICAgICB0aGlzLmhhbmRsZV9idG4gPSB0aGlzLmhpZGVfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiaGFuZGxlX2J0blwiKVxuICAgICAgICAvL+ezu+e7n+aPkOekulxuICAgICAgICB0aGlzLnByb21wdF9jb250YWluZXIgPSB0aGlzLmhpZGVfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwicHJvbXB0X2NvbnRhaW5lclwiKVxuICAgICAgICB0aGlzLnByb21wdF90aXBzX2xheW91dCA9IHRoaXMucHJvbXB0X2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcInRpcHNfbGF5b3V0XCIpXG4gICAgICAgIHRoaXMucHJvbXB0X2J1YmJsZV9sYXlvdXQgPSB0aGlzLnByb21wdF9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJidWJibGVfbGF5b3V0XCIpXG4gICAgICAgIHRoaXMucHJvbXB0X3RpcHNfYnRuID0gdGhpcy5wcm9tcHRfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwidGlwc19idG5cIilcbiAgICAgICAgdGhpcy5wcm9tcHRfZGVzYyA9IHRoaXMucHJvbXB0X2J1YmJsZV9sYXlvdXQuZ2V0Q2hpbGRCeU5hbWUoXCJkZXNjXCIpLmdldENvbXBvbmVudChjYy5MYWJlbClcbiAgICAgICAgdGhpcy5wcm9tcHRfYnViYmxlID0gdGhpcy5wcm9tcHRfYnViYmxlX2xheW91dC5nZXRDaGlsZEJ5TmFtZShcImJ1YmJsZVwiKVxuICAgICAgICB0aGlzLnByb21wdF9idWJibGVfc2l6ZSA9IHRoaXMucHJvbXB0X2J1YmJsZS5nZXRDb250ZW50U2l6ZSgpXG5cbiAgICAgICAgdGhpcy5wcm9tcHRfdGlwc19zY3JvbGwgPSB0aGlzLnByb21wdF90aXBzX2xheW91dC5nZXRDaGlsZEJ5TmFtZShcInRpcHNfc2Nyb2xsXCIpXG4gICAgICAgIHRoaXMucHJvbXB0X3RpcHNfc2Nyb2xsX3NpemUgPSB0aGlzLnByb21wdF90aXBzX3Njcm9sbC5nZXRDb250ZW50U2l6ZSgpXG4gICAgICAgIHRoaXMuY291bnRfc2l6ZV9sYWJlbCA9IHRoaXMucHJvbXB0X3RpcHNfbGF5b3V0LmdldENoaWxkQnlOYW1lKFwiY291bnRfc2l6ZV9sYWJlbFwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpXG5cbiAgICAgICAgdGhpcy5wcm9tcHRfdGlwc19iZyA9IHRoaXMucHJvbXB0X3RpcHNfbGF5b3V0LmdldENoaWxkQnlOYW1lKFwidGlwc19iZ1wiKVxuICAgICAgICB0aGlzLnByb21wdF90aXBzX2JnX3NpemUgPSB0aGlzLnByb21wdF90aXBzX2JnLmdldENvbnRlbnRTaXplKClcbiAgICAgICAgdGhpcy5wcm9tcHRfdGlwc19idG4uYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMucHJvbXB0X3RpcHNfbGF5b3V0LmFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMucHJvbXB0X21hc2sgPSB0aGlzLmhpZGVfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwicHJvbXB0X21hc2tcIilcbiAgICAgICAgLy8g5Y+v5o6n6YOo5YiGLOmcgOimgemakOiXj+aIluiAheaYvuekulxuICAgICAgICB0aGlzLmhpZGVfY29udGFpbmVyID0gdGhpcy5yb290X3duZC5nZXRDaGlsZEJ5TmFtZShcImhpZGVfY29udGFpbmVyXCIpICAgICAgICAgICAgICAgICAgICAvLyDlj6/pmpDol4/pg6jliIZcbiAgICAgICAgdGhpcy5oYW5kbGVfYnRuID0gdGhpcy5oaWRlX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImhhbmRsZV9idG5cIikgICAgICAgICAgICAgICAgICAgICAgLy8g5LiL6Z2i5o6n5Yi25oyJ6ZKuXG4gICAgICAgIC8v5Yib5bu66IGK5aSp5oyJ6ZKuXG4gICAgICAgIHRoaXMuY3JlYXRvckNoYXRCdG4oKVxuICAgICAgICAvLyB0aGlzLmNoYXRfYnRuX25kID0gdGhpcy5oaWRlX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImNoYXRfYnRuXCIpO1xuICAgICAgICBSZWRNZ3IuZ2V0SW5zdGFuY2UoKS5hZGRDYWxIYW5kbGVyKHRoaXMudXBkYXRlQ2hhdE1zZ051bS5iaW5kKHRoaXMpKTtcbiAgICAgICAgLy8g5oiY5Yqb55u45YWzXG4gICAgICAgIC8vIHRoaXMucG93ZXJfc2hvd19uZCA9IHRoaXMucm9vdF93bmQuZ2V0Q2hpbGRCeU5hbWUoXCJwb3dlcl9zaG93XCIpO1xuICAgICAgICAvLyB0aGlzLnBvd2VyX3NrID0gdGhpcy5wb3dlcl9zaG93X25kLmdldENoaWxkQnlOYW1lKFwiYW5pX2NvblwiKS5nZXRDb21wb25lbnQoc3AuU2tlbGV0b24pO1xuICAgICAgICAvLyB2YXIgdGV4X2Nvbl9uZCA9IHRoaXMucG93ZXJfc2hvd19uZC5nZXRDaGlsZEJ5TmFtZShcInR4dF9jb25cIik7XG4gICAgICAgIC8vIHRoaXMub2xkX3Bvd2VyX3JiID0gdGV4X2Nvbl9uZC5nZXRDaGlsZEJ5TmFtZShcIm9sZF9wb3dlclwiKS5nZXRDb21wb25lbnQoY2MuUmljaFRleHQpO1xuICAgICAgICAvLyB0aGlzLmFkZF9wb3dlcl9sYiA9IHRleF9jb25fbmQuZ2V0Q2hpbGRCeU5hbWUoXCJhZGRfcG93ZXJcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUhhbmRsZUJ0blNob3dTdGF0dXMoKVxuICAgICAgICAvLyB0aGlzLmNoYXRfcmVkX2JnID0gdGhpcy5jaGF0X2J0bl9uZC5nZXRDaGlsZEJ5TmFtZShcImNoYXRfcmVkX2JnXCIpO1xuICAgICAgICAvLyB0aGlzLmNoYXRfcmVkX251bSA9IHRoaXMuY2hhdF9yZWRfYmcuZ2V0Q2hpbGRCeU5hbWUoXCJjaGF0X3JlZF9udW1cIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcbiAgICAgICAgaWYgKFVTRV9TREsgPT0gdHJ1ZSAmJiBQTEFURk9STV9UWVBSID09IFwiU0hfU0RLXCIpIHtcbiAgICAgICAgICAgIC8v5Yib5bu65rex5rW35bCP56iL5bqP5a6i5pyN5rWu5qCHIFxuICAgICAgICAgICAgdGhpcy5jcmVhdG9yQ3VzdG9tZXJTZXJ2aWNlQnRuKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmltYWdlXzIgPSB0aGlzLnRvcF9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJJbWFnZV8yXCIpXG4gICAgICAgIHRoaXMudmlwX2xhYmVsID0gdGhpcy5pbWFnZV8yLmdldENoaWxkQnlOYW1lKFwidmlwX2xhYmVsXCIpLmdldENvbXBvbmVudChcIkN1c1JpY2hUZXh0XCIpXG5cblxuXG4gICAgICAgIGZvciAodmFyIGsgaW4gRnVuY3Rpb25JY29uVm8udHlwZSkge1xuICAgICAgICAgICAgdmFyIHYgPSBGdW5jdGlvbkljb25Wby50eXBlW2tdO1xuICAgICAgICAgICAgdmFyIGljb25fY29udGFpbmVyID0gdGhpcy5oaWRlX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImljb25fY29udGFpbmVyX1wiICsgdik7XG4gICAgICAgICAgICBpZiAoaWNvbl9jb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmljb25fY29udGFpbmVyX2xpc3Rbdl0gPSBpY29uX2NvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICB2YXIgX3ggPSAwO1xuICAgICAgICAgICAgICAgIHZhciBfeSA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKHYgPT0gRnVuY3Rpb25JY29uVm8udHlwZS5yaWdodF90b3BfMSkge1xuICAgICAgICAgICAgICAgICAgICBfeCA9IC04O1xuICAgICAgICAgICAgICAgICAgICBfeSA9IHRoaXMudG9wX2NvbnRhaW5lci5nZXRDb250ZW50U2l6ZSgpLmhlaWdodCArIDE1O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodiA9PSBGdW5jdGlvbkljb25Wby50eXBlLnJpZ2h0X3RvcF8yKSB7XG4gICAgICAgICAgICAgICAgICAgIF94ID0gLTg7XG4gICAgICAgICAgICAgICAgICAgIF95ID0gdGhpcy50b3BfY29udGFpbmVyLmdldENvbnRlbnRTaXplKCkuaGVpZ2h0IC0gMTAwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodiA9PSBGdW5jdGlvbkljb25Wby50eXBlLnJpZ2h0X2JvdHRvbV8xKSB7XG4gICAgICAgICAgICAgICAgICAgIF94ID0gLTQ1IC0gNTc7XG4gICAgICAgICAgICAgICAgICAgIC8vIF95ID0gdGhpcy5ib3R0b21fY29udGFpbmVyLmdldENvbnRlbnRTaXplKCkuaGVpZ2h0ICsgNjA7XG4gICAgICAgICAgICAgICAgICAgIF95ID0gaWNvbl9jb250YWluZXIueTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHYgPT0gRnVuY3Rpb25JY29uVm8udHlwZS5yaWdodF9ib3R0b21fMikge1xuICAgICAgICAgICAgICAgICAgICBfeCA9IDMyMC41O1xuICAgICAgICAgICAgICAgICAgICAvLyBfeSA9IHRoaXMuYm90dG9tX2NvbnRhaW5lci5nZXRDb250ZW50U2l6ZSgpLmhlaWdodCArIDYwICsgNTU7XG4gICAgICAgICAgICAgICAgICAgIF95ID0gLTM2N1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBpY29uX2NvbnRhaW5lci5zZXRQb3NpdGlvbihfeCwgX3kpO1xuICAgICAgICAgICAgICAgIHZhciBpY29uX3dpZGdldCA9IGljb25fY29udGFpbmVyLmdldENvbXBvbmVudChjYy5XaWRnZXQpO1xuICAgICAgICAgICAgICAgIGlmIChpY29uX3dpZGdldCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmljb25fd2lkZ2V0X2xpc3Rbdl0gPSBpY29uX3dpZGdldDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJvbGVfdm8gPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpO1xuICAgICAgICBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZFJlcyhQYXRoVG9vbC5nZXRJdGVtUmVzKFwiMVwiKSwgZnVuY3Rpb24gKHJlcykge1xuICAgICAgICAgICAgdGhpcy5jb2luX3NwLnNwcml0ZUZyYW1lID0gcmVzXG4gICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRSZXMoUGF0aFRvb2wuZ2V0SXRlbVJlcyhcIjNcIiksIGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZ29sZF9zcC5zcHJpdGVGcmFtZSA9IHJlc1xuICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgIC8vIOWKoOi9veWujOaIkOS5i+WQjuazqOWGjOebkeWQrFxuICAgICAgICB0aGlzLnJlZ2lzdGVyRXZlbnQoKTtcbiAgICAgICAgLy8g5Yib5bu65oyR5oiY5oyJ6ZKuXG4gICAgICAgIHRoaXMuY3JlYXRlQ2hhbGxlbmdlRWZmZWN0KCk7XG4gICAgICAgIHRoaXMudXBkYXRlUm9sZURhdGEoKTtcbiAgICAgICAgdGhpcy5tYXhfZHVuX2lkID0gdGhpcy5tYWludWlfY29udHJvbGxlci5tYXhfZHVuX2lkXG4gICAgICAgIGlmICh0aGlzLm1heF9kdW5faWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja1VuTG9ja1N0YXR1cyh0aGlzLm1heF9kdW5faWQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIC0tIOWIpOaWreetiee6p+ino+mUgeS4u+aMiemSrlxuICAgICAgICB0aGlzLmNoZWNrVW5Mb2NrU3RhdHVzQnlMZXYoKVxuICAgICAgICAvLyAtLSDmiYDmnInmtLvliqjnmoTml7bpl7TlgJLorqHml7Ys57uf5LiA55So5LiA5Liq5a6a5pe25Zmo5Zyo6L+Z6YeM5YGa5aSE55CGXG4gICAgICAgIGlmICh0aGlzLmZ1bmN0aW9uX3RpbWVfdGlja2V0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uX2xpc3QgPSByZXF1aXJlKFwiYWN0aW9uX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5nZXRBbGxBY3Rpb25MaXN0KClcbiAgICAgICAgICAgIHRoaXMuZnVuY3Rpb25fdGltZV90aWNrZXQgPSBnY29yZS5UaW1lci5zZXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZnVuY3Rpb25UaW1lVGlja2V0TGlzdCgpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpLCAxMDAwLCAtMSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChVU0VfU0RLID09IHRydWUgJiYgTkVFRF9BREFQVElWRV9TREtbd2luZG93LlBMQVRGT1JNX1RZUFJdKSB7XG4gICAgICAgICAgICB0aGlzLmNvaW5fbmQueCA9IC0yODtcbiAgICAgICAgICAgIC8vIHRoaXMuZ29sZF9uZC54ID0gLTI4O1xuICAgICAgICAgICAgdGhpcy5jb2luX2xhYmVsX25kLnggPSAyOTtcbiAgICAgICAgICAgIC8vIHRoaXMuZ29sZF9sYWJlbF9uZC54ID0gMjk7XG4gICAgICAgICAgICB0aGlzLlNwcml0ZV84LnggPSAtNjA7XG4gICAgICAgICAgICAvLyB0aGlzLlNwcml0ZV8xMC54ID0gLTYwO1xuICAgICAgICAgICAgdGhpcy5TcHJpdGVfMTAuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIOWwj+a4uOaIj+mcgOimgeiwg+aVtOmhtumDqOagj1xuICAgICAgICBpZiAod2luZG93LlBMQVRGT1JNX1RZUFIgPT0gXCJXWF9TREtcIiB8fCB3aW5kb3cuUExBVEZPUk1fVFlQUiA9PSBcIlNIX1NES1wiIHx8IFBMQVRGT1JNX1RZUFIgPT0gXCJRUV9TREtcIikge1xuICAgICAgICAgICAgaWYgKHdpbmRvdy5XWF9GSVQpIHtcbiAgICAgICAgICAgICAgICB2YXIgYWRkX3ZhbCA9IHRoaXMucm9vdF93bmQuaGVpZ2h0ICogd2luZG93LldYX0ZJVDtcbiAgICAgICAgICAgICAgICBjYy5sb2coXCLlvq7kv6HlsI/muLjmiI/pgILphY3oj5zljZXmoI9cIik7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJhZGRfdmFsXCIpO1xuICAgICAgICAgICAgICAgIHZhciB0b3Bfd2RnID0gdGhpcy50b3BfY29udGFpbmVyLmdldENvbXBvbmVudChjYy5XaWRnZXQpO1xuICAgICAgICAgICAgICAgIHZhciBjb24xX3dkZyA9IHRoaXMuaWNvbl9jb250YWluZXJfbGlzdFsxXS5nZXRDb21wb25lbnQoY2MuV2lkZ2V0KTtcbiAgICAgICAgICAgICAgICB0b3Bfd2RnLnRvcCArPSBhZGRfdmFsO1xuICAgICAgICAgICAgICAgIGNvbjFfd2RnLnRvcCArPSBhZGRfdmFsO1xuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyDlhbPpl61sb2FkaW5n55WM6Z2iXG4gICAgICAgIExvZ2luQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnVwZGF0ZUxvYWRpbmcoMSk7XG4gICAgICAgIHRoaXMuY2xvc2VfbG9naW5fdGlja2V0ID0gZ2NvcmUuVGltZXIuc2V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIExvZ2luQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLm9wZW5Mb2dpbldpbmRvdyhmYWxzZSk7XG4gICAgICAgICAgICBnY29yZS5UaW1lci5kZWwodGhpcy5jbG9zZV9sb2dpbl90aWNrZXQpO1xuICAgICAgICAgICAgSVNfTE9BRElORyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKFBMQVRGT1JNX1RZUFIgPT0gXCJTSF9SSFwiIHx8IFBMQVRGT1JNX1RZUFIgPT0gXCJTSF9TREtcIikge1xuICAgICAgICAgICAgICAgIFNESy5zdWJtaXRMb2dpbigpO1xuICAgICAgICAgICAgICAgIGlmIChVU0VfU0RLID09IHRydWUgJiYgUExBVEZPUk1fVFlQUiA9PSBcIlNIX1NES1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIFNESy5kYXRhUGxhY2VtZW50KDkwNTAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFVTRV9TREsgPT0gdHJ1ZSAmJiBQTEFURk9STV9UWVBSID09IFwiV1hfU0RLXCIpIHtcbiAgICAgICAgICAgICAgICBTREsubG9naW5Mb2coKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoTWFpbnVpRXZlbnQuTE9BRElOR19FTlRFUl9TQ0VORSk7XG4gICAgICAgIH0uYmluZCh0aGlzKSwgMjAwLCAxKVxuXG4gICAgICAgIC8v6IOM5YyF57qi54K5XG4gICAgICAgIGxldCBCYWNrcGFja0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiYmFja3BhY2tfY29udHJvbGxlclwiKVxuICAgICAgICBCYWNrcGFja0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldEhlcm9DaGlwUmVkUG9pbnQoKVxuXG4gICAgICAgIC8v57qi54K5XG4gICAgICAgIGxldCBjdHJsQ2FjaGVzUmVkID0gdGhpcy5tYWludWlfY29udHJvbGxlci5nZXRDYWNoZXNCdG5SZWQoKVxuICAgICAgICBpZiAoY3RybENhY2hlc1JlZCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdHJsQ2FjaGVzUmVkLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVCdG5UaXBzUG9pbnQoY3RybENhY2hlc1JlZFtpXVswXSwgY3RybENhY2hlc1JlZFtpXVsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1haW51aV9jb250cm9sbGVyLnJlc2V0Q2FjaGVzUmV0RGF0YSgpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVNoZW5xaSgpO1xuXG4gICAgICAgIGxldCBXaWRnZXQgPSB0aGlzLnByb21wdF9jb250YWluZXIuZ2V0Q29tcG9uZW50KGNjLldpZGdldClcbiAgICAgICAgaWYgKHRoaXMudGFza190aXBzX3BhbmVsID09IG51bGwpIHtcbiAgICAgICAgICAgIFdpZGdldC5ib3R0b20gPSAxNDRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFdpZGdldC5ib3R0b20gPSAzMzQuMjg7XG4gICAgICAgIH1cbiAgICAgICAgV2lkZ2V0LnVwZGF0ZUFsaWdubWVudCgpXG4gICAgfSxcblxuICAgIC8v56We5Zmo5Lu75YqhXG4gICAgdXBkYXRlU2hlbnFpOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCB0YXNrX2NvbnRhaW5lciA9IHRoaXMuaGlkZV9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJ0YXNrX2NvbnRhaW5lclwiKTtcbiAgICAgICAgLy8gbGV0IGhhbGxvd3Nfc3RhdHVzID0gcmVxdWlyZShcImhhbGxvd3NfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuY2hlY2tJc0hhdmVBbGxIYWxsb3dzKCk7XG4gICAgICAgIC8vIGxldCBsaW1pdF9kdW4gPSBDb25maWcuZnVuY3Rpb25fZGF0YS5kYXRhX2Jhc2VbN10uYWN0aXZhdGVbMF1bMV07XG4gICAgICAgIGxldCBsaW1pdF9sZXYgPSA2O1xuICAgICAgICBpZiAoQ29uZmlnLnF1ZXN0X2RhdGEuZGF0YV9jb25zdCkge1xuICAgICAgICAgICAgbGltaXRfbGV2ID0gQ29uZmlnLnF1ZXN0X2RhdGEuZGF0YV9jb25zdC50YXNrX29wZW4udmFsWzFdO1xuICAgICAgICB9XG4gICAgICAgIGxldCByb2xlX3ZvID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcbiAgICAgICAgaWYgKHRoaXMudGFza190aXBzX3BhbmVsID09IG51bGwgJiYgcm9sZV92by5sZXYgPj0gbGltaXRfbGV2KSB7XG4gICAgICAgICAgICBsZXQgVGFza1RpcHNQYW5lbCA9IHJlcXVpcmUoXCJ0YXNrX3RpcHNfcGFuZWxcIik7XG4gICAgICAgICAgICB0aGlzLnRhc2tfdGlwc19wYW5lbCA9IG5ldyBUYXNrVGlwc1BhbmVsKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy50YXNrX3RpcHNfcGFuZWwuc2V0UGFyZW50KHRhc2tfY29udGFpbmVyKTtcbiAgICAgICAgICAgIHRoaXMudGFza190aXBzX3BhbmVsLnNob3coKTtcbiAgICAgICAgICAgIGxldCBXaWRnZXQgPSB0aGlzLnByb21wdF9jb250YWluZXIuZ2V0Q29tcG9uZW50KGNjLldpZGdldClcbiAgICAgICAgICAgIFdpZGdldC5ib3R0b20gPSAzMzQuMjg7XG4gICAgICAgICAgICBXaWRnZXQudXBkYXRlQWxpZ25tZW50KClcbiAgICAgICAgfVxuICAgIH0sXG4gICAgZGVsZXRlVGFza1RpcCgpIHtcbiAgICAgICAgaWYgKHRoaXMudGFza190aXBzX3BhbmVsKSB7XG4gICAgICAgICAgICB0aGlzLnRhc2tfdGlwc19wYW5lbC5kZWxldGVNZSgpXG4gICAgICAgICAgICB0aGlzLnRhc2tfdGlwc19wYW5lbCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IFdpZGdldCA9IHRoaXMucHJvbXB0X2NvbnRhaW5lci5nZXRDb21wb25lbnQoY2MuV2lkZ2V0KVxuICAgICAgICBXaWRnZXQuYm90dG9tID0gMTQ0XG4gICAgICAgIFdpZGdldC51cGRhdGVBbGlnbm1lbnQoKVxuICAgIH0sXG4gICAgZ2V0VGFza1RpcHNQYW5lbDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YXNrX3RpcHNfcGFuZWwucm9vdF93bmQ7XG4gICAgfSxcblxuICAgIC8vIOWIm+W7uuaMkeaImOWKqOeUu1xuICAgIGNyZWF0ZUNoYWxsZW5nZUVmZmVjdDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYnRuX29iamVjdCA9IHRoaXMuYm90dG9tX2J0bl9saXN0W01haW5VaUNvbnN0LmJ0bl9pbmRleC5kcmFtYV9zY2VuZV07XG4gICAgICAgIGlmIChidG5fb2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZFJlcyhcInNwaW5lL0U1MTEzMC9hY3Rpb24uYXRsYXNcIiwgKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgICAgIGJ0bl9vYmplY3Quc2tlbGV0b24uc2tlbGV0b25EYXRhID0gcmVzO1xuICAgICAgICAgICAgYnRuX29iamVjdC5za2VsZXRvbi5zZXRBbmltYXRpb24oMCwgXCJhY3Rpb24xXCIsIHRydWUpO1xuICAgICAgICB9KS5iaW5kKHRoaXMpKVxuICAgIH0sXG5cbiAgICByZWdpc3RlckV2ZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucHJvbXB0X3RpcHNfYnRuLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuX29uQ2xpY2tQcm9tcHRUaXBzKClcbiAgICAgICAgfSwgdGhpcylcbiAgICAgICAgdGhpcy5oZWFkX2NvbnRhaW5lci5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5vcGVuUm9sZUluZm9WaWV3KHRydWUpO1xuICAgICAgICB9LCB0aGlzKTtcbiAgICAgICAgdGhpcy5jb2luX3RvdWNoLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBFeGNoYW5nZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5vcGVuRXhjaGFuZ2VNYWluVmlldyh0cnVlKTtcbiAgICAgICAgfSwgdGhpcyk7XG4gICAgICAgIHRoaXMuZ29sZF90b3VjaC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzX2hlcm9fcGFuZWwpIHtcbiAgICAgICAgICAgICAgICByZXF1aXJlKFwidmlwX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5vcGVuVmlwTWFpbldpbmRvdyh0cnVlLCBWSVBUQUJDT05TVC5DSEFSR0UpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBCYWNrcGFja0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiYmFja3BhY2tfY29udHJvbGxlclwiKTtcbiAgICAgICAgICAgICAgICBCYWNrcGFja0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5vcGVuVGlwc1NvdXJjZSh0cnVlLCBVdGlscy5nZXRJdGVtQ29uZmlnKDIyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMpO1xuICAgICAgICB0aGlzLmhhbmRsZV9idG4ub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuc2hyaW5rQnRuQ29udGFpbmVyKCk7XG4gICAgICAgIH0uYmluZCh0aGlzKSk7XG5cbiAgICAgICAgLy8g6IGK5aSpXG4gICAgICAgIHRoaXMuY2hhdF9uZXdtc2dfZXZlbnQgPSBnY29yZS5HbG9iYWxFdmVudC5iaW5kKEV2ZW50SWQuQ0hBVF9ORVdNU0dfRkxBRywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgUmVkTWdyLmdldEluc3RhbmNlKCkuYWRkQ2FsSGFuZGxlcih0aGlzLnVwZGF0ZUNoYXRNc2dOdW0uYmluZCh0aGlzKSk7XG4gICAgICAgIH0uYmluZCh0aGlzKSk7XG5cbiAgICAgICAgLy/ngrnph5HnuqLngrlcbiAgICAgICAgdGhpcy5jb2luX3RvdWNoX3JlZHBvaW50ID0gZ2NvcmUuR2xvYmFsRXZlbnQuYmluZChFeGNoYW5nZUV2ZW50LkV4dHJhX1Jld2FyZCwgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuY29pbl9yZWRwb2ludC5hY3RpdmUgPSBFeGNoYW5nZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldFJlZFN0YXR1cygpO1xuICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgIHRoaXMucm9sZV92by5iaW5kKEV2ZW50SWQuVVBEQVRFX1JPTEVfQVRUUklCVVRFLCAoZnVuY3Rpb24gKGtleSwgdmFsKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJwb3dlclwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVJvbGVQb3dlcigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibGV2XCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUm9sZUxldigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrVW5Mb2NrU3RhdHVzQnlMZXYodmFsKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibmFtZVwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVJvbGVOYW1lKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJjb2luXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUm9sZUNvaW4oKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImdvbGRcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVSb2xlR29sZCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZmFjZV9pZFwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXllcl9oZWFkLnNldEhlYWRSZXModmFsKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImF2YXRhcl9iYXNlX2lkXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxheWVyX2hlYWQuc2V0RnJhbWVSZXModmFsKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInZpcF9sZXZcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVSb2xlVmlwKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJleHBcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVSb2xlRXhwKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJleHBfbWF4XCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUm9sZUV4cCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiaGVyb19leHBcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVIZXJvRXhwKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSwgdGhpcyk7XG5cbiAgICAgICAgLy/ns7vnu5/mj5DnpLrlop7liqBcbiAgICAgICAgaWYgKCF0aGlzLnVwZGF0ZV9wcm9tcHRfdGlwcykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVfcHJvbXB0X3RpcHMgPSBnY29yZS5HbG9iYWxFdmVudC5iaW5kKFByb21wdEV2ZW50LkFERF9QUk9NUFRfREFUQSwgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAvLyAtLSDkuLvln47mraPlnKjmmL7npLrkuJTkuI3lnKjogYrlpKnnlYzpnaLmiY3mmL7npLrmsJTms6FcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc19vcGVuICYmICFDaGF0Q29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmlzQ2hhdE9wZW4oKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dQcm9tcHRCdWJibGUoZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1vZGVsID0gUHJvbXB0Q29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKClcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxpc3QgPSBtb2RlbC5nZXRQcm9tcHRMaXN0KClcbiAgICAgICAgICAgICAgICAgICAgaWYgKFV0aWxzLmdldEFyckxlbihsaXN0KSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd1Byb21wdFRpcHModHJ1ZSwgbGlzdClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgfVxuICAgICAgICAvL+ezu+e7n+aPkOekuuenu+mZpFxuICAgICAgICBpZiAoIXRoaXMucmVtb3ZlX3Byb21wdF90aXBzKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZV9wcm9tcHRfdGlwcyA9IGdjb3JlLkdsb2JhbEV2ZW50LmJpbmQoUHJvbXB0RXZlbnQuUkVNT1ZFX1BST01QVF9EQVRBLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1vZGVsID0gUHJvbXB0Q29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKClcbiAgICAgICAgICAgICAgICBsZXQgbGlzdCA9IG1vZGVsLmdldFByb21wdExpc3QoKVxuICAgICAgICAgICAgICAgIGlmIChVdGlscy5nZXRBcnJMZW4obGlzdCkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd1Byb21wdFRpcHModHJ1ZSwgbGlzdClcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dQcm9tcHRUaXBzKGZhbHNlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb21wdF9tYXNrLm9uKCd0b3VjaGVuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMucHJvbXB0X21hc2suYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnByb21wdF90aXBzX2xheW91dC5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfSwgdGhpcylcbiAgICB9LFxuXG4gICAgb3BlbjogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5yb290X3duZCkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVIaWRlQ29udGFpbmVyKHRydWUpXG4gICAgICAgICAgICB0aGlzLmNoZWNrU2hvd05ld1Byb21wdEJ1YmJsZSgpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5omT5byA5pi+56S655qE5pe25YCZ5LiN6ZyA6KaB6ams5LiK5pi+56S65Ye65p2lLOWboOS4uuWPr+iDveS7juS4gOS4queVjOmdouWIh+aNouWIsOWPpuWkluS4gOS4queVjOmdoiDov5nkuKrml7blgJnkuI3pnIDopoHmmL7npLpcbiAgICBoYW5kbGVIaWRlQ29udGFpbmVyOiBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgICAgIHRoaXMuaGlkZV9jb250YWluZXJfc3RhdHVzID0gc3RhdHVzXG4gICAgICAgIGlmICh0aGlzLndhaXRfdXBkYXRlID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMud2FpdF91cGRhdGUgPSBnY29yZS5UaW1lci5zZXQoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oaWRlX2NvbnRhaW5lcl9zdGF0dXMgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzX29wZW4gPSB0aGlzLmhpZGVfY29udGFpbmVyX3N0YXR1c1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGVfY29udGFpbmVyLmFjdGl2ZSA9IHRoaXMuaXNfb3BlblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZ1bmN0aW9uVXBkYXRlTGlzdCgpO1xuICAgICAgICAgICAgICAgICAgICBnY29yZS5UaW1lci5kZWwodGhpcy53YWl0X3VwZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMud2FpdF91cGRhdGUgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLmJpbmQodGhpcyksIDIwMCwgLTEpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldEhpZGVDb250YWluZXJTdGF0dXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGlkZV9jb250YWluZXJfc3RhdHVzO1xuICAgIH0sXG5cbiAgICBjbG9zZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5oaWRlX2NvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5pc19vcGVuID0gZmFsc2VcbiAgICAgICAgICAgIHRoaXMuaGlkZV9jb250YWluZXJfc3RhdHVzID0gZmFsc2VcbiAgICAgICAgICAgIHRoaXMuaGlkZV9jb250YWluZXIuYWN0aXZlID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICAvLyBpZih0aGlzLmZ1bmN0aW9uX3RpbWVfdGlja2V0KXtcbiAgICAgICAgLy8gZ2NvcmUuVGltZXIuZGVsKHRoaXMuZnVuY3Rpb25fdGltZV90aWNrZXQpO1xuICAgICAgICAvLyB0aGlzLmZ1bmN0aW9uX3RpbWVfdGlja2V0ID0gbnVsbDtcbiAgICAgICAgLy8gfVxuICAgIH0sXG5cbiAgICAvLyDliIfmjaLkuLt1aeeahOeKtuaAgVxuICAgIGNoYW5nZU1haW5VaVN0YXR1czogZnVuY3Rpb24gKGluZGV4LCBzdWJfdHlwZSwgZXh0ZW5kX2RhdGEpIHtcbiAgICAgICAgdmFyIGJ0bl9vYmplY3QgPSB0aGlzLmJvdHRvbV9idG5fbGlzdFtpbmRleF07XG4gICAgICAgIGlmIChidG5fb2JqZWN0ID09IG51bGwgfHwgIWJ0bl9vYmplY3QuaXNfdW5sb2NrKSB7XG4gICAgICAgICAgICBtZXNzYWdlKGJ0bl9vYmplY3QuY29uZmlnLmRlc2MpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICAvLyDliIfno4vkuK3nmoTml7blgJks5LiN6ZyA6KaB5YiH5o2iXG4gICAgICAgIGlmICh0aGlzLmNoZWNrRmlnaHRDbGlja1N0YXR1cygpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8g5aaC5p6c5b6F6YCJ5Lit55qE5piv5ZCM5LiA5LiqXG4gICAgICAgIGlmICgodGhpcy5jdXJfc2VsZWN0X2luZGV4ID09IGluZGV4KSAmJiAoaW5kZXggIT0gTWFpblVpQ29uc3QuYnRuX2luZGV4Lm1haW5fc2NlbmUpKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT0gTWFpblVpQ29uc3QuYnRuX2luZGV4LmRyYW1hX3NjZW5lKSB7XG4gICAgICAgICAgICAgICAgVXRpbHMuY2xvc2VBbGxXaW5kb3coKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldE1haXVpQnRuU3RhdHVzKGluZGV4KTtcblxuICAgICAgICAvLyDlhbPpl63miYDmnInnqpfkvZNcbiAgICAgICAgVXRpbHMuY2xvc2VBbGxXaW5kb3coKTtcblxuICAgICAgICAvLyDlj6ropoHkuI3mmK/liafmg4Xlia/mnKws6YO95YiH5Ye65oiY5paXXG4gICAgICAgIGlmIChpbmRleCAhPSBNYWluVWlDb25zdC5idG5faW5kZXguRGFybWEpIHtcbiAgICAgICAgICAgIHRoaXMuYmF0dGxlX2NvbnRyb2xsZXIucmVxdWVzdEN1dE91dEJhdHRsZSgpXG4gICAgICAgICAgICB0aGlzLmJhdHRsZV9jb250cm9sbGVyLmdldE1vZGVsKCkuY2xlYXJCYXR0bGVTY2VuZSgpO1xuICAgICAgICAgICAgLy8gY2xlYXJCYXR0bGVTY2VuZVxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VCYWNrZ3JvdW5kTXVzaWMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmRleCA9PSBNYWluVWlDb25zdC5idG5faW5kZXgubWFpbl9zY2VuZSkge1xuICAgICAgICAgICAgdmFyIG1haW5TY2VuZUN0cmwgPSByZXF1aXJlKFwibWFpbnNjZW5lX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgICAgIG1haW5TY2VuZUN0cmwuZW50ZXJNYWluU2NlbmUodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT0gTWFpblVpQ29uc3QuYnRuX2luZGV4LnBhcnRuZXIpIHtcbiAgICAgICAgICAgIHZhciBoZXJvX2NvbnRyb2xsZXIgPSByZXF1aXJlKFwiaGVyb19jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCk7XG4gICAgICAgICAgICBoZXJvX2NvbnRyb2xsZXIub3Blbkhlcm9CYWdXaW5kb3codHJ1ZSwgc3ViX3R5cGUpXG4gICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT0gTWFpblVpQ29uc3QuYnRuX2luZGV4LmJhY2twYWNrKSB7XG4gICAgICAgICAgICB2YXIgY29udHJvbGxlciA9IHJlcXVpcmUoXCJiYWNrcGFja19jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKClcbiAgICAgICAgICAgIGNvbnRyb2xsZXIub3Blbk1haW5XaW5kb3codHJ1ZSwgc3ViX3R5cGUpXG4gICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT0gTWFpblVpQ29uc3QuYnRuX2luZGV4LmRyYW1hX3NjZW5lKSB7XG4gICAgICAgICAgICB0aGlzLm1haW51aV9jb250cm9sbGVyLnJlcXVlc3RPcGVuQmF0dGxlUmVsZXZhbmNlV2luZG93KEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuRGFybWEpXG4gICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT0gTWFpblVpQ29uc3QuYnRuX2luZGV4LmVzZWNzaWNlKSB7XG4gICAgICAgICAgICByZXF1aXJlKFwiZXNlY3NpY2VfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLm9wZW5Fc2Vjc2ljZVZpZXcodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT0gTWFpblVpQ29uc3QuYnRuX2luZGV4Lmd1aWxkKSB7XG4gICAgICAgICAgICByZXF1aXJlKFwiZ3VpbGRfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLmNoZWNrT3Blbkd1aWxkV2luZG93KClcbiAgICAgICAgICAgIC8vICDmuIXmpZrkuLvnlYzpnaLkuIrpnaLnmoTnuqLngrlcbiAgICAgICAgICAgIHZhciBHdWlsZHNraWxsQ29udHJvbGxlciA9IHJlcXVpcmUoXCJndWlsZHNraWxsX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICBHdWlsZHNraWxsQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuY2xlYXJHdWlsZFNraWxsSWNvblJlZCgpO1xuICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID09IE1haW5VaUNvbnN0LmJ0bl9pbmRleC5oYWxsb3dzKSB7XG4gICAgICAgICAgICB2YXIgY29udHJvbGxlciA9IHJlcXVpcmUoXCJoYWxsb3dzX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgICAgIGlmIChleHRlbmRfZGF0YSkge1xuICAgICAgICAgICAgICAgIHZhciBoYWxsb3dzX2lkID0gZXh0ZW5kX2RhdGFbMF07XG4gICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gZXh0ZW5kX2RhdGFbMV07XG4gICAgICAgICAgICAgICAgdmFyIG1hZ2ljX2lkID0gZXh0ZW5kX2RhdGFbMl07XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5vcGVuSGFsbG93c01haW5XaW5kb3codHJ1ZSwgaGFsbG93c19pZCwgaW5kZXgsIG1hZ2ljX2lkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5vcGVuSGFsbG93c01haW5XaW5kb3codHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRvQ2hhbmdlQnlTdWJUeXBlKGluZGV4LCBzdWJfdHlwZSwgZXh0ZW5kX2RhdGEpO1xuICAgIH0sXG5cbiAgICAvLyDlj6ropoHkuI3mmK/liafmg4XmiJjmlpcs6YO95YiH5YiA5oyH5a6a6Z+z5LmQXG4gICAgY2hhbmdlQmFja2dyb3VuZE11c2ljOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIFV0aWxzLnBsYXlNdXNpYyhBVURJT19UWVBFLlNDRU5FLCBcInNfMDAyXCIsIHRydWUpO1xuICAgIH0sXG5cbiAgICAvL+i3s+i9rOWkhOeQhlxuICAgIGRvQ2hhbmdlQnlTdWJUeXBlOiBmdW5jdGlvbiAobWFpbl90eXBlLCBzdWJfdHlwZSwgZXh0ZW5kX2RhdGEpIHtcbiAgICAgICAgaWYgKG1haW5fdHlwZSA9PSBudWxsIHx8IHN1Yl90eXBlID09IG51bGwpIHJldHVyblxuICAgICAgICB0aGlzLnN1Yl90eXBlID0gc3ViX3R5cGU7XG4gICAgICAgIGdjb3JlLlRpbWVyLnNldChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdWJfdHlwZSAmJiB0aGlzLnN1Yl90eXBlICE9IHN1Yl90eXBlKSByZXR1cm5cbiAgICAgICAgICAgIGlmIChtYWluX3R5cGUgPT0gTWFpblVpQ29uc3QuYnRuX2luZGV4Lm1haW5fc2NlbmUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3ViX3R5cGUgPT0gTWFpblVpQ29uc3Quc3ViX3R5cGUuYXJlbmFfY2FsbCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgU2NlbmVDb25zdCA9IHJlcXVpcmUoXCJzY2VuZV9jb25zdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIEFyZW5hQ29uc3QgPSByZXF1aXJlKFwiYXJlbmFfY29uc3RcIik7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoXCJtYWluc2NlbmVfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLm9wZW5CdWlsZChTY2VuZUNvbnN0LkNlbnRlclNjZW5lQnVpbGQuYXJlbmEsIEFyZW5hQ29uc3QuYXJlbmFfdHlwZS5sb29wKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViX3R5cGUgPT0gTWFpblVpQ29uc3Quc3ViX3R5cGUuY2hhbXBpb25fY2FsbCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgU2NlbmVDb25zdCA9IHJlcXVpcmUoXCJzY2VuZV9jb25zdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIEFyZW5hQ29uc3QgPSByZXF1aXJlKFwiYXJlbmFfY29uc3RcIik7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoXCJtYWluc2NlbmVfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLm9wZW5CdWlsZChTY2VuZUNvbnN0LkNlbnRlclNjZW5lQnVpbGQuYXJlbmEsIEFyZW5hQ29uc3QuYXJlbmFfdHlwZS5yYW5rKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViX3R5cGUgPT0gTWFpblVpQ29uc3Quc3ViX3R5cGUuZ3VpbGRfYm9zcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yb2xlX3ZvICYmIHRoaXMucm9sZV92by5naWQgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZShVdGlscy5USTE4TihcIuaCqOaaguaXtui/mOayoeacieWKoOWFpeWFrOS8mlwiKSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFpbnVpX2NvbnRyb2xsZXIucmVxdWVzdE9wZW5CYXR0bGVSZWxldmFuY2VXaW5kb3coQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5HdWlsZER1bilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViX3R5cGUgPT0gTWFpblVpQ29uc3Quc3ViX3R5cGUuc3RhcnRvd2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFpbnVpX2NvbnRyb2xsZXIucmVxdWVzdE9wZW5CYXR0bGVSZWxldmFuY2VXaW5kb3coQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5TdGFyVG93ZXIpXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJfdHlwZSA9PSBNYWluVWlDb25zdC5zdWJfdHlwZS5wYXJ0bmVyc3VtbW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoXCJwYXJ0bmVyc3VtbW9uX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5vcGVuUGFydG5lclN1bW1vbldpbmRvdyh0cnVlKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViX3R5cGUgPT0gTWFpblVpQ29uc3Quc3ViX3R5cGUuZXNjb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFpbnVpX2NvbnRyb2xsZXIucmVxdWVzdE9wZW5CYXR0bGVSZWxldmFuY2VXaW5kb3coQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5Fc2NvcnQsIGV4dGVuZF9kYXRhKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViX3R5cGUgPT0gTWFpblVpQ29uc3Quc3ViX3R5cGUud29uZGVyZnVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKGV4dGVuZF9kYXRhKSA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgQWN0aW9uQ29uc3QgPSByZXF1aXJlKFwiYWN0aW9uX2NvbnN0XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZShcImFjdGlvbl9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3BlbkFjdGlvbk1haW5QYW5lbCh0cnVlLCBBY3Rpb25Db25zdC5BY3Rpb25UeXBlLldvbmRlcmZ1bCwgZXh0ZW5kX2RhdGEpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1Yl90eXBlID09IE1haW5VaUNvbnN0LnN1Yl90eXBlLmdvZGJhdHRsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1haW51aV9jb250cm9sbGVyLnJlcXVlc3RPcGVuQmF0dGxlUmVsZXZhbmNlV2luZG93KEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuR29kYmF0dGxlKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViX3R5cGUgPT0gTWFpblVpQ29uc3Quc3ViX3R5cGUud29ybGRfYm9zcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1haW51aV9jb250cm9sbGVyLnJlcXVlc3RPcGVuQmF0dGxlUmVsZXZhbmNlV2luZG93KEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuV29ybGRCb3NzKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViX3R5cGUgPT0gTWFpblVpQ29uc3Quc3ViX3R5cGUuZnVuY3Rpb25faWNvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1haW51aV9jb250cm9sbGVyLmljb25DbGlja0hhbmRsZShleHRlbmRfZGF0YSlcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1Yl90eXBlID09IE1haW5VaUNvbnN0LnN1Yl90eXBlLmd1aWxkd2FyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFpbnVpX2NvbnRyb2xsZXIucmVxdWVzdE9wZW5CYXR0bGVSZWxldmFuY2VXaW5kb3coQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5HdWlsZFdhcilcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1Yl90eXBlID09IE1haW5VaUNvbnN0LnN1Yl90eXBlLmxhZGRlcndhcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1haW51aV9jb250cm9sbGVyLnJlcXVlc3RPcGVuQmF0dGxlUmVsZXZhbmNlV2luZG93KEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuTGFkZGVyV2FyKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViX3R5cGUgPT0gTWFpblVpQ29uc3Quc3ViX3R5cGUucHJpbXVzd2FyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFpbnVpX2NvbnRyb2xsZXIucmVxdWVzdE9wZW5CYXR0bGVSZWxldmFuY2VXaW5kb3coQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5QcmltdXNXYXIpXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJfdHlwZSA9PSBNYWluVWlDb25zdC5zdWJfdHlwZS5leHBlZGl0X2ZpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFpbnVpX2NvbnRyb2xsZXIucmVxdWVzdE9wZW5CYXR0bGVSZWxldmFuY2VXaW5kb3coQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5FeHBlZGl0RmlnaHQpXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJfdHlwZSA9PSBNYWluVWlDb25zdC5zdWJfdHlwZS5lbmRsZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFpbnVpX2NvbnRyb2xsZXIucmVxdWVzdE9wZW5CYXR0bGVSZWxldmFuY2VXaW5kb3coQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5FbmRsZXNzKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViX3R5cGUgPT0gTWFpblVpQ29uc3Quc3ViX3R5cGUuZHVuZ2VvbnN0b25lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFpbnVpX2NvbnRyb2xsZXIucmVxdWVzdE9wZW5CYXR0bGVSZWxldmFuY2VXaW5kb3coQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5EdW5nZW9uU3RvbmUsIGV4dGVuZF9kYXRhKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViX3R5cGUgPT0gTWFpblVpQ29uc3Quc3ViX3R5cGUuc2VlcnBhbGFjZSkgeyAvLyAtLSDlhYjnn6Xmrr9cbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVuZF9kYXRhICYmIHR5cGVvZiAoZXh0ZW5kX2RhdGEpID09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoXCJzZWVycGFsYWNlX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5vcGVuU2VlcnBhbGFjZU1haW5XaW5kb3codHJ1ZSwgZXh0ZW5kX2RhdGEpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKFwic2VlcnBhbGFjZV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3BlblNlZXJwYWxhY2VNYWluV2luZG93KHRydWUpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1Yl90eXBlID09IE1haW5VaUNvbnN0LnN1Yl90eXBlLmFkdmVudHVyZSkgeyAvLyAtLSDot7PovaznpZ7nlYzlhpLpmalcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZShcImFkdmVudHVyZV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkucmVxdWVzdEVudGVyQWR2ZW50dXJlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJfdHlwZSA9PSBNYWluVWlDb25zdC5zdWJfdHlwZS5mb3JnZV9ob3VzZSkgey8v6ZS76YCg5bGLXG4gICAgICAgICAgICAgICAgICAgIGlmIChleHRlbmRfZGF0YSAmJiB0eXBlb2YgKGV4dGVuZF9kYXRhKSA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKFwiZm9yZ2Vob3VzZV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3BlbkZvcmdlSG91c2VWaWV3KHRydWUsIGV4dGVuZF9kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoXCJmb3JnZWhvdXNlX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5vcGVuRm9yZ2VIb3VzZVZpZXcodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1haW5fdHlwZSA9PSBNYWluVWlDb25zdC5idG5faW5kZXguZHJhbWFfc2NlbmUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3ViX3R5cGUgPT0gTWFpblVpQ29uc3Quc3ViX3R5cGUuZHVuZ2Vvbl9hdXRvKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBiYXR0bGVfZHJhbWFfbW9kZWwgPSBCYXR0bGVEcmFtYUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpXG4gICAgICAgICAgICAgICAgICAgIHZhciBkcmFtYV9kYXRhID0gYmF0dGxlX2RyYW1hX21vZGVsLmdldERyYW1hRGF0YSgpXG4gICAgICAgICAgICAgICAgICAgIGlmIChiYXR0bGVfZHJhbWFfbW9kZWwgJiYgZHJhbWFfZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBiYXR0bGVfZHJhbWFfbW9kZWwuZ2V0U2luZ2xlQm9zc0RhdGEoZHJhbWFfZGF0YS5tYXhfZHVuX2lkKVxuICAgICAgICAgICAgICAgICAgICAgICAgQmF0dGxlRHJhbWFDb250cm9sbGVyLmdldEluc3RhbmNlKCkub3BlbkRyYW1Cb3NzSW5mb1ZpZXcodHJ1ZSwgZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfS5iaW5kKHRoaXMpLCAyMDAsIDEpXG4gICAgfSxcblxuICAgIC8vIOaYr+WQpuWcqOinguaImOaIluiAheWIh+ejiyzov5nkuKrml7blgJnlh7rkuoznuqfmj5DnpLos6YCA5Ye6XG4gICAgY2hlY2tGaWdodENsaWNrU3RhdHVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBCYXR0bGVDb250cm9sbGVyID0gcmVxdWlyZShcImJhdHRsZV9jb250cm9sbGVyXCIpO1xuICAgICAgICB2YXIgaXNfY2xpY2tfc3RhdHVzID0gQmF0dGxlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldElzQ2xpY2tTdGF0dXMoKTtcbiAgICAgICAgdmFyIGNvbWJhdF90eXBlID0gQmF0dGxlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0Q29tYmF0VHlwZSgpO1xuICAgICAgICBpZiAoaXNfY2xpY2tfc3RhdHVzKSB7XG4gICAgICAgICAgICB2YXIgQmF0dGxlQ29uc3QgPSByZXF1aXJlKFwiYmF0dGxlX2NvbnN0XCIpO1xuICAgICAgICAgICAgdmFyIHN0ciA9IFV0aWxzLlRJMThOKFwi5q2j5Zyo6KeC55yL5b2V5YOP5oiW5YiH56OL5Lit77yM5piv5ZCm6YCA5Ye6P1wiKVxuICAgICAgICAgICAgaWYgKGNvbWJhdF90eXBlID09IEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuSGVyb1Rlc3RXYXIpIHtcbiAgICAgICAgICAgICAgICBzdHIgPSBVdGlscy5USTE4TihcIuato+WcqOingueci+aImOaWl+a8lOekuu+8jOaYr+WQpuWIh+aNoueVjOmdoj9cIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBjb21maXJlX2Z1biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBCYXR0bGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuY3NGaWdodEV4aXQoKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKTtcbiAgICAgICAgICAgIHZhciBDb21tb25BbGVydCA9IHJlcXVpcmUoXCJjb21tb25hbGVydFwiKTtcbiAgICAgICAgICAgIENvbW1vbkFsZXJ0LnNob3coc3RyLCBcIuehruWumlwiLCBjb21maXJlX2Z1biwgXCLlj5bmtohcIik7XG4gICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNfY2xpY2tfc3RhdHVzO1xuICAgIH0sXG5cbiAgICAvLyDmlLnlj5jmjInpkq7nirbmgIFcbiAgICBzZXRNYWl1aUJ0blN0YXR1czogZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLmN1cl9zZWxlY3RfaW5kZXggPT0gaW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jdXJfc2VsZWN0X2J0bikge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VyX3NlbGVjdF9pbmRleCA9PSBNYWluVWlDb25zdC5idG5faW5kZXguZHJhbWFfc2NlbmUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJfc2VsZWN0X2J0bi5za2VsZXRvbiAmJiB0aGlzLmN1cl9zZWxlY3RfYnRuLnNrZWxldG9uLnNrZWxldG9uRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cl9zZWxlY3RfYnRuLnNrZWxldG9uLnNldEFuaW1hdGlvbigwLCBcImFjdGlvbjFcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cl9zZWxlY3RfYnRuLm5vcm1hbC5hY3RpdmUgPSB0cnVlXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJfc2VsZWN0X2J0bi5zZWxlY3RlZC5hY3RpdmUgPSBmYWxzZVxuICAgICAgICAgICAgICAgIHRoaXMuY3VyX3NlbGVjdF9idG4uYnRuLnNldFBvc2l0aW9uKHRoaXMuY3VyX3NlbGVjdF9idG4uaW5pdF94LCB0aGlzLmN1cl9zZWxlY3RfYnRuLmluaXRfeSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cl9zZWxlY3RfaW5kZXggPSBpbmRleDtcbiAgICAgICAgdmFyIGJ0bl9vYmplY3QgPSB0aGlzLmJvdHRvbV9idG5fbGlzdFtpbmRleF07XG4gICAgICAgIHRoaXMuY3VyX3NlbGVjdF9idG4gPSBidG5fb2JqZWN0XG4gICAgICAgIGlmIChidG5fb2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXJfc2VsZWN0X2luZGV4ID09IE1haW5VaUNvbnN0LmJ0bl9pbmRleC5kcmFtYV9zY2VuZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cl9zZWxlY3RfYnRuLnNrZWxldG9uICYmIHRoaXMuY3VyX3NlbGVjdF9idG4uc2tlbGV0b24uc2tlbGV0b25EYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VyX3NlbGVjdF9idG4uc2tlbGV0b24uc2V0QW5pbWF0aW9uKDAsIFwiYWN0aW9uMlwiLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJ0bl9vYmplY3Qubm9ybWFsLmFjdGl2ZSA9IGZhbHNlXG4gICAgICAgICAgICAgICAgYnRuX29iamVjdC5zZWxlY3RlZC5hY3RpdmUgPSB0cnVlXG4gICAgICAgICAgICAgICAgYnRuX29iamVjdC5idG4uc2V0UG9zaXRpb24oYnRuX29iamVjdC5pbml0X3gsIGJ0bl9vYmplY3QuaW5pdF95ICsgMTApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyDorr7nva7pgInkuK3nmoR1aeaImOaWl+exu+Weiyzov5nph4zmmK/pnIDopoHorrDlvZXnmoQu6KaB5LiN54S25Y+v6IO95oiY5paX5ZKMdWnlr7nkuI3kuIpcbiAgICAgICAgdmFyIGZpZ2h0X3R5cGUgPSB0aGlzLmdldFVJRmlnaHRCeUluZGV4KGluZGV4KTtcbiAgICAgICAgdGhpcy5tYWludWlfY29udHJvbGxlci5zZXRVSUZpZ2h0VHlwZShmaWdodF90eXBlKTtcbiAgICB9LFxuXG4gICAgLy8g5qC55o2u5Li7dWnkuIvpnaLnmoTmoIfor4Ys6K6+572u5b2T5YmNdWnnmoTmiJjmlpfnsbvlnotcbiAgICBnZXRVSUZpZ2h0QnlJbmRleDogZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHN3aXRjaCAoaW5kZXgpIHtcbiAgICAgICAgICAgIGNhc2UgTWFpblVpQ29uc3QuYnRuX2luZGV4Lm1haW5fc2NlbmU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1haW5VaUNvbnN0LnVpX2ZpZ2h0X3R5cGUubWFpbl9zY2VuZTtcbiAgICAgICAgICAgIGNhc2UgTWFpblVpQ29uc3QuYnRuX2luZGV4LnBhcnRuZXI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1haW5VaUNvbnN0LnVpX2ZpZ2h0X3R5cGUucGFydG5lcjtcbiAgICAgICAgICAgIGNhc2UgTWFpblVpQ29uc3QuYnRuX2luZGV4LmJhY2twYWNrOlxuICAgICAgICAgICAgICAgIHJldHVybiBNYWluVWlDb25zdC51aV9maWdodF90eXBlLmJhY2twYWNrO1xuICAgICAgICAgICAgY2FzZSBNYWluVWlDb25zdC5idG5faW5kZXguZHJhbWFfc2NlbmU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1haW5VaUNvbnN0LnVpX2ZpZ2h0X3R5cGUuZHJhbWFfc2NlbmU7XG4gICAgICAgICAgICBjYXNlIE1haW5VaUNvbnN0LmJ0bl9pbmRleC5lc2Vjc2ljZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gTWFpblVpQ29uc3QudWlfZmlnaHRfdHlwZS5lc2Vjc2ljZTtcbiAgICAgICAgICAgIGNhc2UgTWFpblVpQ29uc3QuYnRuX2luZGV4Lmd1aWxkOlxuICAgICAgICAgICAgICAgIHJldHVybiBNYWluVWlDb25zdC51aV9maWdodF90eXBlLmd1aWxkO1xuICAgICAgICAgICAgY2FzZSBNYWluVWlDb25zdC5idG5faW5kZXguaGFsbG93czpcbiAgICAgICAgICAgICAgICByZXR1cm4gTWFpblVpQ29uc3QudWlfZmlnaHRfdHlwZS5oYWxsb3dzO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gTWFpblVpQ29uc3QudWlfZmlnaHRfdHlwZS5tYWluX3NjZW5lO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOW9k+WJjeaJgOWkhOeahOS4u+WfjuS4u+aMiemSruagh+etvlxuICAgIGdldE1haW5VSUluZGV4OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cl9zZWxlY3RfaW5kZXg7XG4gICAgfSxcblxuICAgIC8vIOabtOaWsOiBiuWkqW51bVxuICAgIHVwZGF0ZUNoYXRNc2dOdW06IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNoYXRfbW9kZWwgPSBDaGF0Q29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCk7XG4gICAgICAgIHZhciByZWRfbnVtID0gY2hhdF9tb2RlbC5nZXRVbnJlYWROdW0oKTtcbiAgICAgICAgaWYgKHJlZF9udW0gPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmNoYXRfcmVkX2JnLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICBpZiAocmVkX251bSA+IDk5KVxuICAgICAgICAgICAgICAgIHJlZF9udW0gPSBcIis5OVwiO1xuICAgICAgICAgICAgdGhpcy5jaGF0X3JlZF9udW0uc3RyaW5nID0gcmVkX251bTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2hhdF9yZWRfYmcuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5pu05paw6KeS6Imy5pWw5o2uXG4gICAgdXBkYXRlUm9sZURhdGE6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVSb2xlTmFtZSgpO1xuICAgICAgICB0aGlzLnVwZGF0ZVJvbGVMZXYoKTtcbiAgICAgICAgdGhpcy51cGRhdGVSb2xlQ29pbigpO1xuICAgICAgICB0aGlzLnVwZGF0ZVJvbGVHb2xkKCk7XG4gICAgICAgIHRoaXMudXBkYXRlUm9sZVBvd2VyKCk7XG4gICAgICAgIHRoaXMudXBkYXRlUm9sZUhlYWQoKTtcbiAgICAgICAgdGhpcy51cGRhdGVSb2xlVmlwKCk7XG4gICAgICAgIHRoaXMudXBkYXRlUm9sZUV4cCgpO1xuICAgICAgICB0aGlzLnVwZGF0ZVJvbGVIZWFkRnJhbWUoKTtcbiAgICB9LFxuXG4gICAgdXBkYXRlUm9sZU5hbWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5uYW1lX2xhYmVsLnN0cmluZyA9IHRoaXMucm9sZV92by5uYW1lO1xuICAgIH0sXG5cbiAgICB1cGRhdGVSb2xlTGV2OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubGV2X2xhYmVsLnN0cmluZyA9IHRoaXMucm9sZV92by5sZXY7XG4gICAgfSxcblxuICAgIHVwZGF0ZVJvbGVDb2luOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY29pbl9sYWJlbC5zdHJpbmcgPSBVdGlscy5nZXRNb25leVN0cmluZyh0aGlzLnJvbGVfdm8uY29pbik7XG4gICAgfSxcblxuICAgIHVwZGF0ZVJvbGVHb2xkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc19oZXJvX3BhbmVsKVxuICAgICAgICAgICAgdGhpcy5nb2xkX2xhYmVsLnN0cmluZyA9IFV0aWxzLmdldE1vbmV5U3RyaW5nKHRoaXMucm9sZV92by5nb2xkKTtcbiAgICB9LFxuXG4gICAgdXBkYXRlUm9sZVBvd2VyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZmlnaHRfbGFiZWwuc3RyaW5nID0gdGhpcy5yb2xlX3ZvLnBvd2VyO1xuICAgIH0sXG5cbiAgICB1cGRhdGVSb2xlSGVhZDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnBsYXllcl9oZWFkLnNldEhlYWRSZXModGhpcy5yb2xlX3ZvLmZhY2VfaWQpO1xuICAgIH0sXG5cbiAgICB1cGRhdGVSb2xlSGVhZEZyYW1lOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucGxheWVyX2hlYWQuc2V0RnJhbWVSZXModGhpcy5yb2xlX3ZvLmF2YXRhcl9iYXNlX2lkKTtcbiAgICB9LFxuXG4gICAgdXBkYXRlUm9sZUV4cDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5yb2xlX3ZvID09IG51bGwgfHwgdGhpcy5yb2xlX3ZvLmV4cCA9PSBudWxsIHx8IHRoaXMucm9sZV92by5leHBfbWF4ID09IG51bGwpIHJldHVyblxuICAgICAgICB2YXIgcHJvID0gdGhpcy5yb2xlX3ZvLmV4cCAvIHRoaXMucm9sZV92by5leHBfbWF4O1xuICAgICAgICB0aGlzLmV4cF9iYXIuc2NhbGVYID0gcHJvO1xuICAgIH0sXG5cbiAgICAvLyDliafmg4Xnq6DoioLlj5jljJbnmoTml7blgJks5byA5ZCv5LiL6Z2i5Zu+5qCHXG4gICAgY2hlY2tVbkxvY2tTdGF0dXM6IGZ1bmN0aW9uIChtYXhfZHVuX2lkKSB7XG4gICAgICAgIGlmIChtYXhfZHVuX2lkID09IG51bGwpIHJldHVybjtcbiAgICAgICAgdGhpcy5tYXhfZHVuX2lkID0gbWF4X2R1bl9pZDtcbiAgICAgICAgbGV0IGlzX3VubG9jayA9IGZhbHNlXG4gICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgdGhpcy5ib3R0b21fYnRuX2xpc3QubGVuZ3RoOyArK2spIHtcbiAgICAgICAgICAgIGxldCBidG4gPSB0aGlzLmJvdHRvbV9idG5fbGlzdFtrXVxuICAgICAgICAgICAgaWYgKGJ0bi5jb25maWcgJiYgYnRuLmNvbmZpZy5hY3RpdmF0ZSkge1xuICAgICAgICAgICAgICAgIGxldCBhY3RpdmF0ZSA9IGJ0bi5jb25maWcuYWN0aXZhdGVbMF1cbiAgICAgICAgICAgICAgICBpZiAoYWN0aXZhdGVbMF0gPT0gXCJkdW5cIikge1xuICAgICAgICAgICAgICAgICAgICBpc191bmxvY2sgPSAobWF4X2R1bl9pZCA+PSBhY3RpdmF0ZVsxXSlcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzX3VubG9jayAhPSBidG4uaXNfdW5sb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBidG4uaXNfdW5sb2NrID0gaXNfdW5sb2NrXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnRuLm5vdGljZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0bi5ub3RpY2UuYWN0aXZlID0gKCFpc191bmxvY2spXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZihpc191bmxvY2sgPT0gZmFsc2Upe1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHNldENoaWxkVW5FbmFibGVkKHRydWUsIGJ0bilcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHNldENoaWxkVW5FbmFibGVkKGZhbHNlLCBidG4pXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVTaGVucWkoKTtcbiAgICB9LFxuICAgIC8v5Y2H57qn55qE5pe25YCZ5Yik5pat562J57qn5byA5ZCvXG4gICAgY2hlY2tVbkxvY2tTdGF0dXNCeUxldihsZXYpIHtcbiAgICAgICAgaWYgKHRoaXMucm9sZV92byA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIGxldCBpc191bmxvY2sgPSBmYWxzZVxuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHRoaXMuYm90dG9tX2J0bl9saXN0Lmxlbmd0aDsgKytrKSB7XG4gICAgICAgICAgICBsZXQgYnRuID0gdGhpcy5ib3R0b21fYnRuX2xpc3Rba11cbiAgICAgICAgICAgIGlmIChidG4uY29uZmlnICYmIGJ0bi5jb25maWcuYWN0aXZhdGUpIHtcbiAgICAgICAgICAgICAgICBsZXQgYWN0aXZhdGUgPSBidG4uY29uZmlnLmFjdGl2YXRlWzBdXG4gICAgICAgICAgICAgICAgaWYgKGFjdGl2YXRlWzBdID09IFwibGV2XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNfdW5sb2NrID0gKHRoaXMucm9sZV92by5sZXYgPj0gYWN0aXZhdGVbMV0pXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc191bmxvY2sgIT0gYnRuLmlzX3VubG9jaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnRuLmlzX3VubG9jayA9IGlzX3VubG9ja1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ0bi5ub3RpY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidG4ubm90aWNlLmFjdGl2ZSA9ICghaXNfdW5sb2NrKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYoaXNfdW5sb2NrID09IGZhbHNlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBzZXRDaGlsZFVuRW5hYmxlZCh0cnVlLCBidG4pXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBzZXRDaGlsZFVuRW5hYmxlZChmYWxzZSwgYnRuKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnRhc2tfdGlwc19wYW5lbCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNoZW5xaSgpXG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0g5Zu+5qCH6YOo5YiGIHN0YXJ0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLVxuICAgIC8v5Yid5aeL5YyW5oqA6IO95Zu+5qCH5YiX6KGoXG4gICAgYWRkSWNvbkxpc3Q6IGZ1bmN0aW9uIChsaXN0KSB7XG4gICAgICAgIGlmIChsaXN0ID09IG51bGwgfHwgVXRpbHMubmV4dChsaXN0KSA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIGZvciAodmFyIGsgaW4gbGlzdCkge1xuICAgICAgICAgICAgdmFyIHZvID0gbGlzdFtrXTtcbiAgICAgICAgICAgIGlmICh2byAhPSBudWxsICYmIHZvLmNvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNoZWNrSWNvbkluKHZvLmNvbmZpZy5pZCkpIHtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcl9saXN0X2RpY1t2by5jb25maWcuaWRdID0gdm87XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyX2xpc3QucHVzaCh2byk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8v6L+Z6YeM5YWI5YGa5LiA5Liq5o6S5bqPXG4gICAgICAgIGlmICh0aGlzLnJlbmRlcl9saXN0ICE9IG51bGwgJiYgVXRpbHMubmV4dCh0aGlzLnJlbmRlcl9saXN0ICE9IG51bGwpKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcl9saXN0LnNvcnQoVXRpbHMudGFibGVMb3dlclNvcnRlcihbXCJwb3NcIiwgXCJzb3J0XCJdKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvL+W8gOWQr+iuoeaXtuWZqO+8jOWHhuWkh+WIm+W7uuWbvuihqGZcbiAgICAgICAgaWYgKHRoaXMuYWRkX2Z1bmN0aW9uX3RpbWVyID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkX2Z1bmN0aW9uX3RpbWVyID0gZ2NvcmUuVGltZXIuc2V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUZ1bmN0aW9uSWNvbigpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpLCAyIC8gNjAsIC0xKVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5Yqo5oCB5re75Yqg5LiA5Liq5Zu+5qCHXG4gICAgYWRkSWNvbjogZnVuY3Rpb24gKHZvKSB7XG4gICAgICAgIGlmICh2byA9PSBudWxsIHx8IHZvLmNvbmZpZyA9PSBudWxsIHx8IHRoaXMuY2hlY2tJY29uSW4odm8uY29uZmlnLmlkKSkgcmV0dXJuXG4gICAgICAgIHRoaXMucmVuZGVyX2xpc3RfZGljW3ZvLmNvbmZpZy5pZF0gPSB2bztcbiAgICAgICAgdGhpcy5yZW5kZXJfbGlzdC5wdXNoKHZvKTtcbiAgICAgICAgdGhpcy5yZW5kZXJfbGlzdC5zb3J0KFV0aWxzLnRhYmxlTG93ZXJTb3J0ZXIoW1wicG9zXCIsIFwic29ydFwiXSkpO1xuXG4gICAgICAgIC8v5byA5ZCv6K6h5pe25ZmoLOWHhuWkh+WIm+W7uuWbvuagh1xuICAgICAgICBpZiAodGhpcy5hZGRfZnVuY3Rpb25fdGltZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5hZGRfZnVuY3Rpb25fdGltZXIgPSBnY29yZS5UaW1lci5zZXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlRnVuY3Rpb25JY29uKCk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcyksIDIgLyA2MCwgLTEpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/nm5HmtYvkuIDkuKrlm77moIfmmK/lkKblrZjlnKhcbiAgICBjaGVja0ljb25JbjogZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIGlmICh0aGlzLmZ1bmN0aW9uX2xpc3RbaWRdICE9IG51bGwgfHwgdGhpcy5yZW5kZXJfbGlzdF9kaWNbaWRdICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIC8v5Yqo5oCB56e76Zmk5LiA5Liq5Zu+5qCHXG4gICAgcmVtb3ZlSWNvbjogZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHZhciBjb25maWcgPSBnZGF0YShcImZ1bmN0aW9uX2RhdGFcIiwgXCJkYXRhX2luZm9cIiwgW2lkXSk7XG4gICAgICAgIGlmIChjb25maWcgPT0gbnVsbCkgcmV0dXJuXG4gICAgICAgIGlmICh0aGlzLmZ1bmN0aW9uX2xpc3RbaWRdICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZ1bmN0aW9uX2xpc3RbaWRdLmRlbGV0ZU1lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mdW5jdGlvbl9saXN0W2lkXS5kZWxldGVNZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZnVuY3Rpb25fbGlzdFtpZF0gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5yZW5kZXJfbGlzdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyX2xpc3RbaV0uY29uZmlnLmlkID09IGlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJfbGlzdC5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbmRlcl9saXN0X2RpY1tpZF0gPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5sYXlvdXRfbGlzdCA9PSBudWxsIHx8IHRoaXMubGF5b3V0X2xpc3RbY29uZmlnLnR5cGVdID09IG51bGwpIHJldHVyblxuICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMubGF5b3V0X2xpc3RbY29uZmlnLnR5cGVdKSB7XG4gICAgICAgICAgICB2YXIgdiA9IHRoaXMubGF5b3V0X2xpc3RbY29uZmlnLnR5cGVdW2ldO1xuICAgICAgICAgICAgaWYgKHYgJiYgdi5jb25maWcuaWQgPT0gaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxheW91dF9saXN0W2NvbmZpZy50eXBlXS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUljb25MYXlvdXQoY29uZmlnLnR5cGUpO1xuICAgIH0sXG5cbiAgICAvL+WIm+W7uuS4gOS4quWbvuagh1xuICAgIGNyZWF0ZUZ1bmN0aW9uSWNvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMucm9vdF93bmQpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMucmVuZGVyX2xpc3QgPT0gbnVsbCB8fCBVdGlscy5uZXh0KHRoaXMucmVuZGVyX2xpc3QpID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFkZF9mdW5jdGlvbl90aW1lciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZ2NvcmUuVGltZXIuZGVsKHRoaXMuYWRkX2Z1bmN0aW9uX3RpbWVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZF9mdW5jdGlvbl90aW1lciA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICAvLyB2YXIgZGF0YSA9IHRoaXMucmVuZGVyX2xpc3Quc2hpZnQoKTtcbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLnJlbmRlcl9saXN0LnNwbGljZSgwLCAxKVswXTtcbiAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgcmV0dXJuXG4gICAgICAgIHRoaXMucmVuZGVyX2xpc3RfZGljW2RhdGEuY29uZmlnLmlkXSA9IG51bGw7XG4gICAgICAgIC8v6L+Z57G75Zu+5qCH5LiN6ZyA6KaB5Zyo5Li755WM6Z2i5pi+56S6XG4gICAgICAgIGlmIChkYXRhLmNvbmZpZyAmJiBkYXRhLmNvbmZpZy5pc19zaG93ID09IDApIHJldHVyblxuICAgICAgICB0aGlzLmFkZEl0ZW1Ub1RhYkFycmF5KGRhdGEpO1xuICAgIH0sXG5cbiAgICAvL+WwhuWbvuagh+a3u+WKoOWIsOeItuiKgueCueWuueWZqFxuICAgIGFkZEl0ZW1Ub1RhYkFycmF5OiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YSA9PSBudWxsIHx8IGRhdGEuY29uZmlnID09IG51bGwpIHJldHVyblxuICAgICAgICBpZiAodGhpcy5sYXlvdXRfbGlzdCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dF9saXN0ID0ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubGF5b3V0X2xpc3RbZGF0YS5jb25maWcudHlwZV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5sYXlvdXRfbGlzdFtkYXRhLmNvbmZpZy50eXBlXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpc19uZXcgPSB0cnVlO1xuICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMubGF5b3V0X2xpc3RbZGF0YS5jb25maWcudHlwZV0pIHtcbiAgICAgICAgICAgIHZhciB2ID0gdGhpcy5sYXlvdXRfbGlzdFtkYXRhLmNvbmZpZy50eXBlXVtrXTtcbiAgICAgICAgICAgIGlmICh2LmNvbmZpZy5pZCA9PSBkYXRhLmNvbmZpZy5pZCkge1xuICAgICAgICAgICAgICAgIHYgPSBkYXRhO1xuICAgICAgICAgICAgICAgIGlzX25ldyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGF0YS5pc19uZXcgPSBpc19uZXc7XG4gICAgICAgIHRoaXMubGF5b3V0X2xpc3RbZGF0YS5jb25maWcudHlwZV0ucHVzaChkYXRhKTtcbiAgICAgICAgdGhpcy5sYXlvdXRfbGlzdFtkYXRhLmNvbmZpZy50eXBlXS5zb3J0KFV0aWxzLnRhYmxlTG93ZXJTb3J0ZXIoW1wic29ydFwiXSkpO1xuICAgICAgICB0aGlzLnVwZGF0ZUljb25MYXlvdXQoZGF0YS5jb25maWcudHlwZSk7XG4gICAgfSxcblxuICAgIC8v5pu05paw5Zu+5qCH5L2N572uXG4gICAgdXBkYXRlSWNvbkxheW91dDogZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgaWYgKHRoaXMubGF5b3V0X2xpc3QgPT0gbnVsbCB8fCB0aGlzLmxheW91dF9saXN0W3R5cGVdID09IG51bGwgfHwgVXRpbHMubmV4dCh0aGlzLmxheW91dF9saXN0W3R5cGVdKSA9PSBudWxsKSByZXR1cm5cbiAgICAgICAgdmFyIGxheW91dCA9IHRoaXMuZ2V0Q29udGFpbmVyQnlUeXBlKHR5cGUpO1xuICAgICAgICBpZiAobGF5b3V0ID09IG51bGwpIHJldHVyblxuICAgICAgICB2YXIgbGVuID0gVXRpbHMuZ2V0QXJyTGVuKHRoaXMubGF5b3V0X2xpc3RbdHlwZV0pO1xuICAgICAgICB2YXIgaWNvbiA9IG51bGw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdGhpcy5sYXlvdXRfbGlzdFt0eXBlXVtpXTtcbiAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEuY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZnVuY3Rpb25fbGlzdFtkYXRhLmNvbmZpZy5pZF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5pc19uZXcgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5pc19uZXcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBGdW5jdGlvbkljb24gPSByZXF1aXJlKFwiZnVuY3Rpb25faWNvbl9wYW5lbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb24gPSBuZXcgRnVuY3Rpb25JY29uKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbi5zaG93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uLnNldFBhcmVudChsYXlvdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mdW5jdGlvbl9saXN0W2RhdGEuY29uZmlnLmlkXSA9IGljb247XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWNvbiA9IHRoaXMuZnVuY3Rpb25fbGlzdFtkYXRhLmNvbmZpZy5pZF07XG4gICAgICAgICAgICAgICAgaWYgKGljb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEljb25Qb3NpdGlvbihpY29uLCBpLCBsYXlvdXQsIHR5cGUpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJvb3Rfd25kKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUhhbmRsZUJ0blNob3dTdGF0dXMoKVxuICAgICAgICB9XG4gICAgfSxcbiAgICB1cGRhdGVIYW5kbGVCdG5TaG93U3RhdHVzKCkge1xuICAgICAgICBsZXQgcmlnaHRfYm90dG9tXzEgPSB0aGlzLmxheW91dF9saXN0W0Z1bmN0aW9uSWNvblZvLnR5cGUucmlnaHRfYm90dG9tXzFdXG4gICAgICAgIGxldCByaWdodF9ib3R0b21fMiA9IHRoaXMubGF5b3V0X2xpc3RbRnVuY3Rpb25JY29uVm8udHlwZS5yaWdodF9ib3R0b21fMl1cbiAgICAgICAgaWYgKHJpZ2h0X2JvdHRvbV8xIHx8IHJpZ2h0X2JvdHRvbV8yKSB7XG4gICAgICAgICAgICBpZiAoKHJpZ2h0X2JvdHRvbV8xICYmIHJpZ2h0X2JvdHRvbV8xLmxlbmd0aCkgfHwgKHJpZ2h0X2JvdHRvbV8yICYmIHJpZ2h0X2JvdHRvbV8yLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZV9idG4uYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlX2J0bi5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLy/moLnmja7kvY3nva7ojrflj5blm77moIfniLboioLngrnkv6Hmga9cbiAgICBnZXRDb250YWluZXJCeVR5cGU6IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgIGlmICh0aGlzLmljb25fY29udGFpbmVyX2xpc3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaWNvbl9jb250YWluZXJfbGlzdFt0eXBlXTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+iuvue9ruWbvuagh+eahOS9jee9rlxuICAgIHNldEljb25Qb3NpdGlvbjogZnVuY3Rpb24gKGljb24sIGluZGV4LCBsYXlvdXQsIHR5cGUpIHtcbiAgICAgICAgdmFyIHNpemUgPSBsYXlvdXQuZ2V0Q29udGVudFNpemUoKTtcbiAgICAgICAgdmFyIF94ID0gMDtcbiAgICAgICAgdmFyIF95ID0gMDtcbiAgICAgICAgdmFyIG9mZl9oZWlnaHQgPSAxMDtcbiAgICAgICAgaWYgKHR5cGUgPT0gRnVuY3Rpb25JY29uVm8udHlwZS5yaWdodF90b3BfMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5Y+z5LiKLOS7juWPs+W+gOW3plxuICAgICAgICAgICAgX3ggPSAtaWNvbi53aWR0aCAqIDAuNSAtIChpbmRleCAlIHRoaXMubGVmdF9tYXhfc3VtKSAqICh0aGlzLmxlZnRfb2ZmICsgaWNvbi53aWR0aCk7XG4gICAgICAgICAgICBfeSA9IC1pY29uLmhlaWdodCAqIDAuNSAtIE1hdGguZmxvb3IoaW5kZXggLyB0aGlzLmxlZnRfbWF4X3N1bSkgKiAob2ZmX2hlaWdodCArIGljb24uaGVpZ2h0KTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IEZ1bmN0aW9uSWNvblZvLnR5cGUucmlnaHRfYm90dG9tXzEpIHsgICAgICAgICAgICAgICAgLy8g5Y+z5LiLLOS7juWPs+W+gOW3plxuICAgICAgICAgICAgX3ggPSAtaWNvbi53aWR0aCAqIDAuNSAtIChpbmRleCAlIHRoaXMubGVmdF9tYXhfc3VtKSAqICh0aGlzLmxlZnRfb2ZmICsgaWNvbi53aWR0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBGdW5jdGlvbkljb25Wby50eXBlLnJpZ2h0X2JvdHRvbV8yKSB7ICAgICAgICAgICAgICAgIC8vIOWPs+S4iyzku47kuIvlvoDkuIpcbiAgICAgICAgICAgIF95ID0gaWNvbi5oZWlnaHQgKiAwLjUgKyBpbmRleCAqIChpY29uLmhlaWdodCArIHRoaXMucmlnaHRfb2ZmKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IEZ1bmN0aW9uSWNvblZvLnR5cGUucmlnaHRfdG9wXzIpIHsgICAgICAgICAgICAgICAgICAgLy8g5Y+z5LiKLOS7juS4iuW+gOS4i1xuICAgICAgICAgICAgX3ggPSAtaWNvbi53aWR0aCAqIDAuNTtcbiAgICAgICAgICAgIF95ID0gLWljb24uaGVpZ2h0ICogMC41IC0gaW5kZXggKiAoaWNvbi5oZWlnaHQgKyBvZmZfaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaWNvbi5vcmlnaW5hbCA9PSBudWxsIHx8IFV0aWxzLmdldE5vcktleShpY29uLm9yaWdpbmFsLngsIGljb24ub3JpZ2luYWwueSkgIT0gVXRpbHMuZ2V0Tm9yS2V5KF94LCBfeSkpIHtcbiAgICAgICAgICAgIGljb24uc2V0UG9zaXRpb24oX3gsIF95KTtcbiAgICAgICAgICAgIGljb24ub3JpZ2luYWwgPSBjYy52MihfeCwgX3kpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy/liqjmgIHosIPmlbQgcmlnaHRfdG9wXzIg55qE5L2N572uXG4gICAgICAgIHZhciBvZmZfeSA9IDA7XG4gICAgICAgIGlmICh0eXBlID09IEZ1bmN0aW9uSWNvblZvLnR5cGUucmlnaHRfdG9wXzEpIHtcbiAgICAgICAgICAgIG9mZl95ID0gTWF0aC5hYnMoX3kgLSBvZmZfaGVpZ2h0IC0gaWNvbi5oZWlnaHQgKiAwLjUpOyAgICAgICAgICAgICAvLyDnrpflh7rmgLvpq5jluqZcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IEZ1bmN0aW9uSWNvblZvLnR5cGUucmlnaHRfdG9wXzIpIHtcbiAgICAgICAgICAgIHZhciBsYXlvdXRfbGlzdCA9IHRoaXMubGF5b3V0X2xpc3RbRnVuY3Rpb25JY29uVm8udHlwZS5yaWdodF90b3BfMV07XG4gICAgICAgICAgICBpZiAobGF5b3V0X2xpc3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgbGVuID0gVXRpbHMuZ2V0QXJyTGVuKGxheW91dF9saXN0KTtcbiAgICAgICAgICAgICAgICB2YXIgdGVtcF95ID0gaWNvbi5oZWlnaHQgKiAwLjUgLSBNYXRoLmNlaWwobGVuIC8gdGhpcy5sZWZ0X21heF9zdW0pICogKG9mZl9oZWlnaHQgKyBpY29uLmhlaWdodCk7XG4gICAgICAgICAgICAgICAgb2ZmX3kgPSBNYXRoLmFicyh0ZW1wX3kgLSBvZmZfaGVpZ2h0IC0gaWNvbi5oZWlnaHQgKiAwLjUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChvZmZfeSAhPSAwICYmIHRoaXMudG9wXzJfb2ZmX3kgIT0gb2ZmX3kpIHtcbiAgICAgICAgICAgIHRoaXMudG9wXzJfb2ZmX3kgPSBvZmZfeTtcbiAgICAgICAgICAgIHZhciB0b3BfMSA9IHRoaXMuaWNvbl9jb250YWluZXJfbGlzdFtGdW5jdGlvbkljb25Wby50eXBlLnJpZ2h0X3RvcF8xXTtcbiAgICAgICAgICAgIHZhciB0b3BfMiA9IHRoaXMuaWNvbl9jb250YWluZXJfbGlzdFtGdW5jdGlvbkljb25Wby50eXBlLnJpZ2h0X3RvcF8yXTtcbiAgICAgICAgICAgIGlmICh0b3BfMSAmJiB0b3BfMikge1xuICAgICAgICAgICAgICAgIHRvcF8yLnkgPSB0b3BfMS55IC0gb2ZmX3k7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/lrprml7blmajnmoTnu5/kuIDlgJLorqHml7ZcbiAgICBmdW5jdGlvblRpbWVUaWNrZXRMaXN0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmZ1bmN0aW9uX2xpc3QgJiYgVXRpbHMubmV4dCh0aGlzLmZ1bmN0aW9uX2xpc3QpICE9IG51bGwpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5mdW5jdGlvbl9saXN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGljb24gPSB0aGlzLmZ1bmN0aW9uX2xpc3Rba107XG4gICAgICAgICAgICAgICAgaWYgKGljb24gJiYgaWNvbi5kYXRhICYmIGljb24uZGF0YS5lbmRfdGltZSAmJiBpY29uLmRhdGEuZW5kX3RpbWUgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpY29uLnVwZGF0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb24udXBkYXRlVGltZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFjdGlvbl9saXN0ICYmIFV0aWxzLm5leHQodGhpcy5hY3Rpb25fbGlzdCkgIT0gbnVsbCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSBpbiB0aGlzLmFjdGlvbl9saXN0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGljb24gPSB0aGlzLmFjdGlvbl9saXN0W2ldXG4gICAgICAgICAgICAgICAgaWYgKGljb24gJiYgaWNvbi51cGRhdGVUaW1lICYmIGljb24ucmVtYWluX3NlYyAmJiBpY29uLnJlbWFpbl9zZWMgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGljb24udXBkYXRlVGltZSgpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5pu05pawaWNvbuWIl+ihqFxuICAgIGZ1bmN0aW9uVXBkYXRlTGlzdDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5mdW5jdGlvbl9saXN0ICYmIFV0aWxzLm5leHQodGhpcy5mdW5jdGlvbl9saXN0KSAhPSBudWxsKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMuZnVuY3Rpb25fbGlzdCkge1xuICAgICAgICAgICAgICAgIHZhciBpY29uID0gdGhpcy5mdW5jdGlvbl9saXN0W2tdO1xuICAgICAgICAgICAgICAgIGlmIChpY29uICYmIGljb24udXBkYXRlSWNvblJlcykge1xuICAgICAgICAgICAgICAgICAgICBpY29uLnVwZGF0ZUljb25SZXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgc2V0Qm90dG9tU3RhdHVzOiBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgICAgIGlmICh0aGlzLmJvdHRvbV9jb250YWluZXIpXG4gICAgICAgICAgICB0aGlzLmJvdHRvbV9jb250YWluZXIuYWN0aXZlID0gc3RhdHVzO1xuICAgIH0sXG5cbiAgICBzZXRUb3BTdGF0dXM6IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgICAgICAgaWYgKHRoaXMudG9wX2NvbnRhaW5lcilcbiAgICAgICAgICAgIHRoaXMudG9wX2NvbnRhaW5lci5hY3RpdmUgPSBzdGF0dXM7XG4gICAgfSxcblxuICAgIHVwZGF0ZVJvbGVWaXA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy52aXBfbGFiZWwuc2V0TnVtKHRoaXMucm9sZV92by52aXBfbGV2KTtcbiAgICB9LFxuXG4gICAgLy8gLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLVxuICAgIC8vIC0tQGlkOuS4i+mdouaMiemSruW6j+WPt1xuICAgIC8vIC0tQGRhdGE6ZGF0YSDlj6/ku6XmmK/ljZXnuq9ib29s5YC877yM5oiW6ICF5pivdGFibGXlvaLlvI97WzFdPXtpZD14eHgsc3RhdHVzPWZhbHNlfX1cbiAgICAvLyAtLUByZXR1cm4gXG4gICAgLy8gLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLVxuICAgIHVwZGF0ZUJ0blRpcHNQb2ludDogZnVuY3Rpb24gKGlkLCBkYXRhKSB7XG4gICAgICAgIGlmICghdGhpcy5ib3R0b21fYnRuX2xpc3RbaWRdKSByZXR1cm47XG4gICAgICAgIGlmIChkYXRhID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuYnRuX2NhY2hlX3RpcHNbaWRdID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGRhdGEpICE9IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ0bl9jYWNoZV90aXBzW2lkXSA9IGRhdGE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmJ0bl9jYWNoZV90aXBzW2lkXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnRuX2NhY2hlX3RpcHNbaWRdID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkYXRhLmJpZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnRuX2NhY2hlX3RpcHNbaWRdW2RhdGEuYmlkXSA9IGRhdGEuc3RhdHVzO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFbaV0uYmlkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ0bl9jYWNoZV90aXBzW2lkXVtkYXRhW2ldLmJpZF0gPSBkYXRhW2ldLnN0YXR1cztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBib29sID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmJ0bl9jYWNoZV90aXBzW2lkXSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5idG5fY2FjaGVfdGlwc1tpZF0pID09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMuYnRuX2NhY2hlX3RpcHNbaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmJ0bl9jYWNoZV90aXBzW2lkXVtpXSA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib29sID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBib29sID0gdGhpcy5idG5fY2FjaGVfdGlwc1tpZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJ0bl9vYmplY3QgPSB0aGlzLmJvdHRvbV9idG5fbGlzdFtpZF07XG4gICAgICAgIGlmIChidG5fb2JqZWN0ICYmIGJ0bl9vYmplY3QudGlwc19zdGF0dXMgIT0gYm9vbCkge1xuICAgICAgICAgICAgYnRuX29iamVjdC50aXBzX3N0YXR1cyA9IGJvb2w7XG4gICAgICAgICAgICBpZiAoYnRuX29iamVjdC50aXBzX3BvaW50KSB7XG4gICAgICAgICAgICAgICAgYnRuX29iamVjdC50aXBzX3BvaW50LmFjdGl2ZSA9IGJvb2w7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0Um9vdFduZDogZnVuY3Rpb24gKGNiKSB7XG4gICAgICAgIHRoaXMucm9vdF93bmRfY2IgPSBjYjtcbiAgICAgICAgaWYgKHRoaXMucm9vdF93bmQpXG4gICAgICAgICAgICB0aGlzLnJvb3Rfd25kX2NiKHRoaXMucm9vdF93bmQpO1xuICAgIH0sXG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIOWbvuagh+mDqOWIhiBlbmQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tXG4gICAgLy/mlLbnvKnlj7PkuIvop5LnmoTlm77moIdcbiAgICBzaHJpbmtCdG5Db250YWluZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNfaW5fc2hyaW5rID09IHRydWUpIHJldHVyblxuICAgICAgICB0aGlzLmlzX2luX3NocmluayA9IHRydWU7XG5cbiAgICAgICAgdmFyIGxheW91dF8xID0gdGhpcy5pY29uX2NvbnRhaW5lcl9saXN0W0Z1bmN0aW9uSWNvblZvLnR5cGUucmlnaHRfYm90dG9tXzFdO1xuICAgICAgICB2YXIgbGF5b3V0XzIgPSB0aGlzLmljb25fY29udGFpbmVyX2xpc3RbRnVuY3Rpb25JY29uVm8udHlwZS5yaWdodF9ib3R0b21fMl07XG4gICAgICAgIHRoaXMuaXNfc2hyaW5rID0gIXRoaXMuaXNfc2hyaW5rO1xuXG4gICAgICAgIGxheW91dF8xLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIGxheW91dF8yLmFjdGl2ZSA9IHRydWU7XG5cbiAgICAgICAgdmFyIGxlbiA9IDEwMDtcbiAgICAgICAgdmFyIG1vdmVfYnlfMSA9IG51bGw7XG4gICAgICAgIHZhciBtb3ZlX2J5XzIgPSBudWxsO1xuICAgICAgICB2YXIgZmFkZV8xID0gbnVsbDtcbiAgICAgICAgdmFyIGZhZGVfMiA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNfc2hyaW5rID09IHRydWUpIHtcbiAgICAgICAgICAgIG1vdmVfYnlfMSA9IGNjLm1vdmVCeSgwLjEsIGNjLnYyKGxlbiwgMCkpO1xuICAgICAgICAgICAgbW92ZV9ieV8yID0gY2MubW92ZUJ5KDAuMSwgY2MudjIoMCwgLWxlbikpO1xuICAgICAgICAgICAgZmFkZV8xID0gY2MuZmFkZU91dCgwLjEpO1xuICAgICAgICAgICAgZmFkZV8yID0gY2MuZmFkZU91dCgwLjEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbW92ZV9ieV8xID0gY2MubW92ZUJ5KDAuMSwgY2MudjIoLWxlbiwgMCkpO1xuICAgICAgICAgICAgbW92ZV9ieV8yID0gY2MubW92ZUJ5KDAuMSwgY2MudjIoMCwgbGVuKSk7XG4gICAgICAgICAgICBmYWRlXzEgPSBjYy5mYWRlSW4oMC4xKTtcbiAgICAgICAgICAgIGZhZGVfMiA9IGNjLmZhZGVJbigwLjEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNhbGxfZnVuXzEgPSBjYy5jYWxsRnVuYyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmlzX2luX3NocmluayA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNfc2hyaW5rID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBsYXlvdXRfMS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICB2YXIgY2FsbF9mdW5fMiA9IGNjLmNhbGxGdW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzX3NocmluayA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgbGF5b3V0XzIuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgbGF5b3V0XzEucnVuQWN0aW9uKGNjLnNlcXVlbmNlKGNjLnNwYXduKG1vdmVfYnlfMSwgZmFkZV8xKSwgY2FsbF9mdW5fMSkpO1xuICAgICAgICBsYXlvdXRfMi5ydW5BY3Rpb24oY2Muc2VxdWVuY2UoY2Muc3Bhd24obW92ZV9ieV8yLCBmYWRlXzIpLCBjYWxsX2Z1bl8yKSk7XG4gICAgfSxcblxuXG4gICAgc2hvd1Bvd2VyOiBmdW5jdGlvbiAocG93ZXJfYWRkLCBsYXN0X3Bvd2VyKSB7XG4gICAgICAgIGlmICghcG93ZXJfYWRkIHx8ICFsYXN0X3Bvd2VyKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLnBvd2VyX3Nob3dfbmQgPT0gbnVsbCkge1xuICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRSZXMoUGF0aFRvb2wuZ2V0UHJlZmFiUGF0aChcIm1haW51aVwiLCBcInBvd2VyX3Nob3dcIiksIGZ1bmN0aW9uIChQcmVmYWIpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wb3dlcl9zaG93X25kKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucnVuUG93ZXJBY3Rpb24ocG93ZXJfYWRkLCBsYXN0X3Bvd2VyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucG93ZXJfc2hvd19uZCA9IFByZWZhYjtcbiAgICAgICAgICAgICAgICBWaWV3TWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFRvU2NlbmVOb2RlKHRoaXMucG93ZXJfc2hvd19uZCwgU0NFTkVfVEFHLmRpYWxvZ3VlKVxuICAgICAgICAgICAgICAgIHRoaXMucG93ZXJfc2hvd19uZC5zZXRQb3NpdGlvbigtU0NSRUVOX1dJRFRIICogMC41LCAtU0NSRUVOX0hFSUdIVCAqIDAuNSlcbiAgICAgICAgICAgICAgICBsZXQgcG93ZXJfc2hvd19uZCA9IHRoaXMucG93ZXJfc2hvd19uZC5nZXRDaGlsZEJ5TmFtZShcImNvbnRhaW5lclwiKVxuICAgICAgICAgICAgICAgIHRoaXMucG93ZXJfc2hvd19uZC5wb3dlcl9zayA9IHBvd2VyX3Nob3dfbmQuZ2V0Q2hpbGRCeU5hbWUoXCJhbmlfY29uXCIpLmdldENvbXBvbmVudChzcC5Ta2VsZXRvbilcbiAgICAgICAgICAgICAgICBsZXQgdGV4X2Nvbl9uZCA9IHBvd2VyX3Nob3dfbmQuZ2V0Q2hpbGRCeU5hbWUoXCJ0eHRfY29uXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMucG93ZXJfc2hvd19uZC5vbGRfcG93ZXJfcmIgPSB0ZXhfY29uX25kLmdldENoaWxkQnlOYW1lKFwib2xkX3Bvd2VyXCIpLmdldENvbXBvbmVudChjYy5SaWNoVGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKGNjLnN5cy5icm93c2VyVHlwZSA9PSBjYy5zeXMuQlJPV1NFUl9UWVBFX0lFKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG93ZXJfc2hvd19uZC5vbGRfcG93ZXJfcmIubGluZUhlaWdodCA9IDYwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnBvd2VyX3Nob3dfbmQuYWRkX3Bvd2VyX2xiID0gdGV4X2Nvbl9uZC5nZXRDaGlsZEJ5TmFtZShcImFkZF9wb3dlclwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xuICAgICAgICAgICAgICAgIHZhciBhbmltYV9yZXMgPSBQYXRoVG9vbC5nZXRFZmZlY3RSZXMoMTc5KTtcbiAgICAgICAgICAgICAgICB2YXIgYW5pbWFfcGF0aCA9IFBhdGhUb29sLmdldFNwaW5lUGF0aChhbmltYV9yZXMpO1xuICAgICAgICAgICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2FkUmVzKGFuaW1hX3BhdGgsIGZ1bmN0aW9uIChwb3dlcl9zZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvd2VyX3Nob3dfbmQucG93ZXJfc2suc2tlbGV0b25EYXRhID0gcG93ZXJfc2Q7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucnVuUG93ZXJBY3Rpb24ocG93ZXJfYWRkLCBsYXN0X3Bvd2VyKTtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJ1blBvd2VyQWN0aW9uKHBvd2VyX2FkZCwgbGFzdF9wb3dlcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aGlzLnBvd2VyX3Nob3dfbmQgPSB0aGlzLnJvb3Rfd25kLmdldENoaWxkQnlOYW1lKFwicG93ZXJfc2hvd1wiKTtcbiAgICAgICAgLy8gdGhpcy5wb3dlcl9zayA9IHRoaXMucG93ZXJfc2hvd19uZC5nZXRDaGlsZEJ5TmFtZShcImFuaV9jb25cIikuZ2V0Q29tcG9uZW50KHNwLlNrZWxldG9uKTtcbiAgICAgICAgLy8gdmFyIHRleF9jb25fbmQgPSB0aGlzLnBvd2VyX3Nob3dfbmQuZ2V0Q2hpbGRCeU5hbWUoXCJ0eHRfY29uXCIpO1xuICAgICAgICAvLyB0aGlzLm9sZF9wb3dlcl9yYiA9IHRleF9jb25fbmQuZ2V0Q2hpbGRCeU5hbWUoXCJvbGRfcG93ZXJcIikuZ2V0Q29tcG9uZW50KGNjLlJpY2hUZXh0KTtcbiAgICAgICAgLy8gdGhpcy5hZGRfcG93ZXJfbGIgPSB0ZXhfY29uX25kLmdldENoaWxkQnlOYW1lKFwiYWRkX3Bvd2VyXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7XG4gICAgICAgIC8vIGlmICh0aGlzLnBvd2VyX3NrLnNrZWxldG9uRGF0YSkge1xuICAgICAgICAvLyAgICAgdGhpcy5ydW5Qb3dlckFjdGlvbihwb3dlcl9hZGQsIGxhc3RfcG93ZXIpO1xuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgdmFyIGFuaW1hX3JlcyA9IFBhdGhUb29sLmdldEVmZmVjdFJlcygxNzkpO1xuICAgICAgICAvLyAgICAgdmFyIGFuaW1hX3BhdGggPSBQYXRoVG9vbC5nZXRTcGluZVBhdGgoYW5pbWFfcmVzKTtcbiAgICAgICAgLy8gICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2FkUmVzKGFuaW1hX3BhdGgsIGZ1bmN0aW9uKHBvd2VyX3NkKSB7XG4gICAgICAgIC8vICAgICAgICAgdGhpcy5wb3dlcl9zay5za2VsZXRvbkRhdGEgPSBwb3dlcl9zZDtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLnJ1blBvd2VyQWN0aW9uKHBvd2VyX2FkZCwgbGFzdF9wb3dlcik7XG4gICAgICAgIC8vICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgIC8vIH1cbiAgICB9LFxuXG4gICAgcnVuUG93ZXJBY3Rpb246IGZ1bmN0aW9uIChwb3dlcl9hZGQsIGxhc3RfcG93ZXIpIHtcbiAgICAgICAgdGhpcy5wb3dlcl9zaG93X25kLnBvd2VyX3NrLnNldEFuaW1hdGlvbigwLCBcImFjdGlvblwiLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuYWRkX3RpbWVyKSB7XG4gICAgICAgICAgICBnY29yZS5UaW1lci5kZWwodGhpcy5hZGRfdGltZXIpO1xuICAgICAgICAgICAgdGhpcy5hZGRfdGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucG93ZXJfc2hvd19uZC5zdG9wQWxsQWN0aW9ucygpO1xuXG4gICAgICAgIHZhciBsYXN0X3Bvd2VyX3N0ciA9IGxhc3RfcG93ZXIgKyBcIlwiO1xuICAgICAgICB2YXIgbGFzdF9wb3dlcl9kcyA9IFwiXCI7XG4gICAgICAgIGlmKGNjLnN5cy5icm93c2VyVHlwZSA9PSBjYy5zeXMuQlJPV1NFUl9UWVBFX0lFKXtcbiAgICAgICAgICAgIGxhc3RfcG93ZXJfZHMgPSBsYXN0X3Bvd2VyX3N0cjtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBmb3IgKHZhciBpdGVtX2kgaW4gbGFzdF9wb3dlcl9zdHIpIHtcbiAgICAgICAgICAgICAgICBsYXN0X3Bvd2VyX2RzICs9IFwiPGltZyBzcmM9J3R5cGUyM19cIiArIGxhc3RfcG93ZXJfc3RyW2l0ZW1faV0gKyBcIicvPlwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWxjdV9udW0gPSAwO1xuICAgICAgICB0aGlzLmFkZF90aW1lciA9IGdjb3JlLlRpbWVyLnNldChmdW5jdGlvbiAocG93ZXJfYWRkKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGN1X251bSArPSAxO1xuICAgICAgICAgICAgaWYgKHRoaXMuY2FsY3VfbnVtIDwgNSkge1xuICAgICAgICAgICAgICAgIHRoaXMucG93ZXJfc2hvd19uZC5hZGRfcG93ZXJfbGIuc3RyaW5nID0gXCIrXCIgKyBNYXRoLmNlaWwodGhpcy5jYWxjdV9udW0gKiAwLjIgKiBwb3dlcl9hZGQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvd2VyX3Nob3dfbmQuYWRkX3Bvd2VyX2xiLnN0cmluZyA9IFwiK1wiICsgcG93ZXJfYWRkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LmJpbmQodGhpcywgcG93ZXJfYWRkKSwgMjAwLCA1KVxuXG5cbiAgICAgICAgdGhpcy5wb3dlcl9zaG93X25kLm9sZF9wb3dlcl9yYi5zdHJpbmcgPSBsYXN0X3Bvd2VyX2RzO1xuICAgICAgICB0aGlzLnBvd2VyX3Nob3dfbmQub3BhY2l0eSA9IDI1NTtcblxuICAgICAgICBjb25zb2xlLmxvZyhcIui+k+WHuuWtl+espuS4slwiLCB0aGlzLnBvd2VyX3Nob3dfbmQub2xkX3Bvd2VyX3JiLnN0cmluZyk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi6L6T5Ye65a2X56ym5LiyXCIsIGxhc3RfcG93ZXJfZHMpO1xuXG4gICAgICAgIHZhciBkZWxheV90aW1lID0gbmV3IGNjLmRlbGF5VGltZSgxKTtcbiAgICAgICAgdmFyIGFjdGlvbiA9IG5ldyBjYy5mYWRlT3V0KDEpO1xuICAgICAgICB2YXIgZmluaXNoX2NiID0gbmV3IGNjLmNhbGxGdW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFkZF90aW1lcikge1xuICAgICAgICAgICAgICAgIGdjb3JlLlRpbWVyLmRlbCh0aGlzLmFkZF90aW1lcik7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRfdGltZXIgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMucG93ZXJfc2hvd19uZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucG93ZXJfc2hvd19uZC5kZXN0cm95KClcbiAgICAgICAgICAgICAgICB0aGlzLnBvd2VyX3Nob3dfbmQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgICAgICB2YXIgcG93ZXJfYWN0ID0gY2Muc2VxdWVuY2UoZGVsYXlfdGltZSwgYWN0aW9uLCBmaW5pc2hfY2IpO1xuICAgICAgICB0aGlzLnBvd2VyX3Nob3dfbmQucnVuQWN0aW9uKHBvd2VyX2FjdCk7XG4gICAgfSxcblxuICAgIHVwZGF0ZUhlcm9FeHA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNfaGVyb19wYW5lbClcbiAgICAgICAgICAgIHRoaXMuZ29sZF9sYWJlbC5zdHJpbmcgPSBVdGlscy5nZXRNb25leVN0cmluZyh0aGlzLnJvbGVfdm8uaGVyb19leHApO1xuICAgIH0sXG5cbiAgICBjaGFuZ2VIZXJvU3RhdHVzOiBmdW5jdGlvbiAoaXNfaGVybykge1xuICAgICAgICB0aGlzLmlzX2hlcm9fcGFuZWwgPSBpc19oZXJvO1xuICAgICAgICBpZiAoaXNfaGVybykge1xuICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRSZXMoUGF0aFRvb2wuZ2V0SXRlbVJlcyhcIjIyXCIpLCBmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nb2xkX3NwLnNwcml0ZUZyYW1lID0gcmVzO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgdGhpcy5nb2xkX2xhYmVsLnN0cmluZyA9IFV0aWxzLmdldE1vbmV5U3RyaW5nKHRoaXMucm9sZV92by5oZXJvX2V4cCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZFJlcyhQYXRoVG9vbC5nZXRJdGVtUmVzKFwiM1wiKSwgZnVuY3Rpb24gKHJlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuZ29sZF9zcC5zcHJpdGVGcmFtZSA9IHJlc1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgdGhpcy5nb2xkX2xhYmVsLnN0cmluZyA9IFV0aWxzLmdldE1vbmV5U3RyaW5nKHRoaXMucm9sZV92by5nb2xkKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgY3JlYXRvckNoYXRCdG4oKSB7XG4gICAgICAgIHRoaXMuY2hhdF9idG5fbmQgPSBuZXcgY2MuTm9kZShcImNoYXRfYnRuXCIpO1xuICAgICAgICBsZXQgd2lkZ2V0ID0gdGhpcy5jaGF0X2J0bl9uZC5hZGRDb21wb25lbnQoY2MuV2lkZ2V0KVxuICAgICAgICB3aWRnZXQuaXNBbGlnbkJvdHRvbSA9IHRydWVcbiAgICAgICAgd2lkZ2V0LmJvdHRvbSA9IDM2NztcbiAgICAgICAgdGhpcy5jaGF0X2J0bl9uZC54ID0gMzE3XG4gICAgICAgIFZpZXdNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkVG9TY2VuZU5vZGUodGhpcy5jaGF0X2J0bl9uZCwgU0NFTkVfVEFHLnRvcCk7XG4gICAgICAgIGxldCBidG4gPSB0aGlzLmNoYXRfYnRuX25kLmFkZENvbXBvbmVudChjYy5CdXR0b24pO1xuICAgICAgICBidG4udHJhbnNpdGlvbiA9IGNjLkJ1dHRvbi5UcmFuc2l0aW9uLlNDQUxFO1xuICAgICAgICBidG4uem9vbVNjYWxlID0gMC45O1xuICAgICAgICBidG4uZHVyYXRpb24gPSAwLjE7XG4gICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2FkUmVzKFBhdGhUb29sLmdldFVJSWNvblBhdGgoXCJtYWludWlcIiwgXCJtYWludWlfY2hhdF9tYWluX2ljb25cIiksIChmdW5jdGlvbiAocmVzX29iamVjdCkge1xuICAgICAgICAgICAgdGhpcy5jaGF0X2J0bl9uZC5hZGRDb21wb25lbnQoY2MuU3ByaXRlKS5zcHJpdGVGcmFtZSA9IHJlc19vYmplY3Q7XG4gICAgICAgIH0pLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLmNoYXRfcmVkX2JnID0gbmV3IGNjLk5vZGUoXCJjaGF0X3JlZF9iZ1wiKTtcbiAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRSZXMoUGF0aFRvb2wuZ2V0VUlJY29uUGF0aChcIm1haW51aVwiLCBcIm1haW51aV8xMDM0XCIpLCAoZnVuY3Rpb24gKHJlc19vYmplY3QpIHtcbiAgICAgICAgICAgIHRoaXMuY2hhdF9yZWRfYmcuYWRkQ29tcG9uZW50KGNjLlNwcml0ZSkuc3ByaXRlRnJhbWUgPSByZXNfb2JqZWN0O1xuICAgICAgICB9KS5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5jaGF0X2J0bl9uZC5hZGRDaGlsZCh0aGlzLmNoYXRfcmVkX2JnKTtcbiAgICAgICAgdGhpcy5jaGF0X3JlZF9iZy5zZXRQb3NpdGlvbigyMywgMjUpO1xuICAgICAgICB0aGlzLmNoYXRfcmVkX2JnLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNoYXRfcmVkX251bSA9IG5ldyBjYy5Ob2RlKFwiY2hhdF9yZWRfbnVtXCIpLmFkZENvbXBvbmVudChjYy5MYWJlbCk7XG4gICAgICAgIHRoaXMuY2hhdF9yZWRfbnVtLmZvbnRTaXplID0gMTg7XG4gICAgICAgIHRoaXMuY2hhdF9yZWRfbnVtLmxpbmVIZWlnaHQgPSAxODtcbiAgICAgICAgdGhpcy5jaGF0X3JlZF9udW0uaG9yaXpvbnRhbEFsaWduID0gY2MubWFjcm8uVGV4dEFsaWdubWVudC5DRU5URVI7XG4gICAgICAgIHRoaXMuY2hhdF9yZWRfbnVtLnZlcnRpY2FsQWxpZ24gPSBjYy5tYWNyby5UZXh0QWxpZ25tZW50LkNFTlRFUjtcbiAgICAgICAgdGhpcy5jaGF0X3JlZF9iZy5hZGRDaGlsZCh0aGlzLmNoYXRfcmVkX251bS5ub2RlKVxuICAgICAgICBsZXQgdG91Y2hfYmVnYW4gPSBjYy52MigpXG4gICAgICAgIGxldCBpc19tb3ZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2hhdF9idG5fbmQub24oXCJ0b3VjaHN0YXJ0XCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgaXNfbW92ZSA9IGZhbHNlXG4gICAgICAgICAgICB0b3VjaF9iZWdhbiA9IGV2ZW50LmdldExvY2F0aW9uKClcbiAgICAgICAgfSwgdGhpcylcbiAgICAgICAgdGhpcy5jaGF0X2J0bl9uZC5vbihcInRvdWNobW92ZVwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGxldCBwb3MgPSBldmVudC5nZXRMb2NhdGlvbigpXG4gICAgICAgICAgICBpZiAoIWlzX21vdmUpIHtcbiAgICAgICAgICAgICAgICBsZXQgaXNfY2xpY2sgPSBNYXRoLmFicyhwb3MueCAtIHRvdWNoX2JlZ2FuLngpIDw9IDMwICYmIE1hdGguYWJzKHBvcy55IC0gdG91Y2hfYmVnYW4ueSkgPD0gMzBcbiAgICAgICAgICAgICAgICBpZiAoaXNfY2xpY2sgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNfbW92ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzX21vdmUpIHtcbiAgICAgICAgICAgICAgICBwb3MgPSBWaWV3TWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFNjZW5lTm9kZShTQ0VORV9UQUcudG9wKS5jb252ZXJ0VG9Ob2RlU3BhY2VBUihwb3MpXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNoZWNrUG9zSW5SZWN0KHBvcykpIHJldHVyblxuICAgICAgICAgICAgICAgIHRoaXMuY2hhdF9idG5fbmQuc2V0UG9zaXRpb24ocG9zKVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzKVxuICAgICAgICB0aGlzLmNoYXRfYnRuX25kLm9uKFwidG91Y2hlbmRcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoaXNfbW92ZSA9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIFV0aWxzLnBsYXlCdXR0b25Tb3VuZCgxKVxuICAgICAgICAgICAgICAgIHZhciBDaGF0Q3RybCA9IHJlcXVpcmUoXCJjaGF0X2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICAgICAgQ2hhdEN0cmwuZ2V0SW5zdGFuY2UoKS5vcGVuQ2hhdFBhbmVsKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93Q2hhdEJ0bihmYWxzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcylcbiAgICAgICAgbGV0IEd1aWRlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJndWlkZV9jb250cm9sbGVyXCIpXG4gICAgICAgIGlmIChHdWlkZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5pc0luR3VpZGUoKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRNYWluVUlDaGF0QnViYmxlU3RhdHVzKGZhbHNlKVxuICAgICAgICB9XG4gICAgfSxcbiAgICBzZXRNYWluVUlDaGF0QnViYmxlU3RhdHVzKHN0YXR1cykge1xuICAgICAgICB0aGlzLmNoYXRfYnViYmxlX3N0YXR1cyA9IHN0YXR1c1xuICAgICAgICB0aGlzLmNoYXRfYnRuX25kLnN0b3BBbGxBY3Rpb25zKClcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgdGhpcy5yb290X3duZC5ydW5BY3Rpb24oY2Muc2VxdWVuY2UoY2MuZGVsYXlUaW1lKDAuMiksIGNjLmNhbGxGdW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGF0X2J1YmJsZV9zdGF0dXMgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dDaGF0QnRuKHRoaXMuY2hhdF9idWJibGVfc3RhdHVzKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHRoaXMpKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0NoYXRCdG4odGhpcy5jaGF0X2J1YmJsZV9zdGF0dXMpXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGNoZWNrUG9zSW5SZWN0KHBvcykge1xuICAgICAgICAvLyBsZXQgd2lkdGggPSBjYy53aW5TaXplLndpZHRoID4gU0NSRUVOX1dJRFRIID8gU0NSRUVOX1dJRFRIIDogY2Mud2luU2l6ZS53aWR0aDtcbiAgICAgICAgLy8gbGV0IHNpemUgPSBjYy5zaXplKHdpZHRoLGNjLndpblNpemUuaGVpZ2h0KVxuICAgICAgICBsZXQgc2l6ZSA9IHRoaXMucm9vdF93bmQuZ2V0Q29udGVudFNpemUoKVxuICAgICAgICBsZXQgbGVmdF94ID0gLShzaXplLndpZHRoIC8gMikgKyA0MFxuICAgICAgICBsZXQgcmlnaHRfeCA9IHNpemUud2lkdGggLyAyIC0gNDBcbiAgICAgICAgbGV0IHRvcF95ID0gc2l6ZS5oZWlnaHQgLyAyIC0gKHRoaXMudG9wX2NvbnRhaW5lci5oZWlnaHQgKyA2MClcbiAgICAgICAgbGV0IGJvdHRvbV95ID0gLShzaXplLmhlaWdodCAvIDIpICsgKHRoaXMuYm90dG9tX2NvbnRhaW5lci5oZWlnaHQgKyA2MClcbiAgICAgICAgaWYgKHBvcy54IDwgbGVmdF94KSByZXR1cm4gZmFsc2VcbiAgICAgICAgaWYgKHBvcy55IDwgYm90dG9tX3kpIHJldHVybiBmYWxzZVxuICAgICAgICBpZiAocG9zLnggPiByaWdodF94KSByZXR1cm4gZmFsc2VcbiAgICAgICAgaWYgKHBvcy55ID4gdG9wX3kpIHJldHVybiBmYWxzZVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH0sXG4gICAgc2hvd0NoYXRCdG4oc3RhdHVzKSB7XG4gICAgICAgIGlmICh0aGlzLmNoYXRfYnRuX25kKSB7XG4gICAgICAgICAgICB0aGlzLmNoYXRfYnRuX25kLmFjdGl2ZSA9IHN0YXR1c1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvLyDmo4DmtYvmmK/lkKbmnInmlrDnmoTmsJTms6Hmj5DnpLpcbiAgICBjaGVja1Nob3dOZXdQcm9tcHRCdWJibGUoKSB7XG4gICAgICAgIGxldCBtb2RlbCA9IFByb21wdENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpXG4gICAgICAgIGxldCBkYXRhID0gbW9kZWwuZ2V0Tm90QnViYmxlUHJvbXB0KClcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1Byb21wdEJ1YmJsZShkYXRhKVxuICAgICAgICB9XG4gICAgICAgIGxldCBsaXN0ID0gbW9kZWwuZ2V0UHJvbXB0TGlzdCgpXG4gICAgICAgIGlmIChVdGlscy5nZXRBcnJMZW4obGlzdCkgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dQcm9tcHRUaXBzKHRydWUsIGxpc3QpXG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8vIC0tIOaYvuekuuezu+e7n+aPkOekuuawlOazoVxuICAgIHNob3dQcm9tcHRCdWJibGUoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgZGF0YS5zZXRTaG93QnViYmxlU3RhdHVzKHRydWUpXG4gICAgICAgICAgICB0aGlzLnByb21wdF9idWJibGVfbGF5b3V0LnN0b3BBbGxBY3Rpb25zKClcbiAgICAgICAgICAgIHRoaXMucHJvbXB0X3RpcHNfYnRuLmFjdGl2ZSA9ICh0cnVlKVxuICAgICAgICAgICAgdGhpcy5wcm9tcHRfYnViYmxlX2xheW91dC5hY3RpdmUgPSAodHJ1ZSlcbiAgICAgICAgICAgIHRoaXMucHJvbXB0X2Rlc2Muc3RyaW5nID0gKGRhdGEubmFtZSlcbiAgICAgICAgICAgIHRoaXMucHJvbXB0X2Rlc2MuX3VwZGF0ZVJlbmRlckRhdGEodHJ1ZSlcbiAgICAgICAgICAgIGxldCBzaXplID0gdGhpcy5wcm9tcHRfZGVzYy5ub2RlLmdldENvbnRlbnRTaXplKClcbiAgICAgICAgICAgIHRoaXMucHJvbXB0X2J1YmJsZS5zZXRDb250ZW50U2l6ZShjYy5zaXplKHNpemUud2lkdGggKyA2MCwgdGhpcy5wcm9tcHRfYnViYmxlX3NpemUuaGVpZ2h0KSlcblxuICAgICAgICAgICAgbGV0IGZhZGVpbiA9IGNjLmZhZGVJbigwLjcpXG4gICAgICAgICAgICBsZXQgZmFkZW91dCA9IGNjLmZhZGVPdXQoMC43KVxuICAgICAgICAgICAgdGhpcy5wcm9tcHRfYnViYmxlX2xheW91dC5ydW5BY3Rpb24oY2Muc2VxdWVuY2UoZmFkZWluLCBmYWRlb3V0KSlcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLy8gLS0g5pi+56S657O757uf5o+Q56S6XG4gICAgc2hvd1Byb21wdFRpcHMoc3RhdHVzLCBsaXN0KSB7XG4gICAgICAgIGNjLmxvZyhzdGF0dXMsIGxpc3QsIFwic2hvd1Byb21wdFRpcHNcIilcbiAgICAgICAgaWYgKHN0YXR1cyA9PSB0cnVlICYmIGxpc3QgJiYgVXRpbHMubmV4dChsaXN0KSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnByb21wdF90aXBzX2J0bi5hY3RpdmUgPSAodHJ1ZSlcbiAgICAgICAgICAgIHRoaXMucHJvbXB0X3RpcHNfc2Nyb2xsLmRlc3Ryb3lBbGxDaGlsZHJlbigpXG4gICAgICAgICAgICBsZXQgbWF4X3dpZHRoID0gMFxuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBsaXN0Lmxlbmd0aDsgKytrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHYgPSBsaXN0W2tdXG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudF9zaXplX2xhYmVsLnN0cmluZyA9ICh2Lm5hbWUpXG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudF9zaXplX2xhYmVsLl91cGRhdGVSZW5kZXJEYXRhKHRydWUpXG4gICAgICAgICAgICAgICAgbGV0IHNpemUgPSB0aGlzLmNvdW50X3NpemVfbGFiZWwubm9kZS5nZXRDb250ZW50U2l6ZSgpXG4gICAgICAgICAgICAgICAgaWYgKG1heF93aWR0aCA8IHNpemUud2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgbWF4X3dpZHRoID0gc2l6ZS53aWR0aFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXhfd2lkdGggPCAxNjgpIHtcbiAgICAgICAgICAgICAgICBtYXhfd2lkdGggPSAxNjggLy/ljp/mnKznmoTlpKflsI9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIC0t5a2X55qE5a695bqm5ZKM5oyJ6ZKu55qE5a695bqm55u45beuMjBcbiAgICAgICAgICAgIG1heF93aWR0aCA9IG1heF93aWR0aCArIDIwXG5cbiAgICAgICAgICAgIGxldCBsZW4gPSBVdGlscy5nZXRBcnJMZW4obGlzdClcbiAgICAgICAgICAgIGxldCBidXR0b25faGVpZ2h0ID0gNDlcbiAgICAgICAgICAgIGxldCBidXR0b25faGVpZ2h0X3NwYWNlID0gMTJcbiAgICAgICAgICAgIGxldCByZXMgPSBQYXRoVG9vbC5nZXRVSUljb25QYXRoKFwibWFpbnVpXCIsIFwibWFpbnVpX3RpcHNfYmcxXCIpXG4gICAgICAgICAgICBsZXQgbWF4X2hlaWdodCA9IE1hdGgubWF4KHRoaXMucHJvbXB0X3RpcHNfc2Nyb2xsX3NpemUuaGVpZ2h0LCBsZW4gKiAoYnV0dG9uX2hlaWdodF9zcGFjZSArIGJ1dHRvbl9oZWlnaHQpKVxuICAgICAgICAgICAgbGV0IHNjcm9sbF9oZWlnaHQgPSBNYXRoLm1pbihsZW4gKiAoYnV0dG9uX2hlaWdodF9zcGFjZSArIGJ1dHRvbl9oZWlnaHQpLCAxNjApXG5cbiAgICAgICAgICAgIC8vIC0t5qC55o2u5aSn5bCP6LCD5pW05LiLc2Nyb2xs5ZKM6IOM5pmv5aSn5bCPXG4gICAgICAgICAgICBsZXQgdGlwc19zY3JvbGxfd2lkdGggPSBtYXhfd2lkdGggKyA0XG4gICAgICAgICAgICBsZXQgdGlwc19iZ193aWR0aCA9IHRpcHNfc2Nyb2xsX3dpZHRoICsgKHRoaXMucHJvbXB0X3RpcHNfYmdfc2l6ZS53aWR0aCAtIHRoaXMucHJvbXB0X3RpcHNfc2Nyb2xsX3NpemUud2lkdGgpXG4gICAgICAgICAgICB0aGlzLnByb21wdF90aXBzX3Njcm9sbC5zZXRDb250ZW50U2l6ZShjYy5zaXplKHRpcHNfc2Nyb2xsX3dpZHRoLCBzY3JvbGxfaGVpZ2h0KSlcbiAgICAgICAgICAgIC8vIHRoaXMucHJvbXB0X3RpcHNfc2Nyb2xsOnNldElubmVyQ29udGFpbmVyU2l6ZShjYy5zaXplKHRpcHNfc2Nyb2xsX3dpZHRoLCBzY3JvbGxfaGVpZ2h0KSlcbiAgICAgICAgICAgIHRoaXMucHJvbXB0X3RpcHNfYmcuc2V0Q29udGVudFNpemUoY2Muc2l6ZSh0aXBzX2JnX3dpZHRoLCBzY3JvbGxfaGVpZ2h0ICsgNjApKVxuXG4gICAgICAgICAgICBpZiAoc2Nyb2xsX2hlaWdodCA+IDE2MCkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvbXB0X3RpcHNfc2Nyb2xsLnNldENvbnRlbnRTaXplKGNjLnNpemUodGlwc19zY3JvbGxfd2lkdGgsIG1heF9oZWlnaHQpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHYgPSBsaXN0W2ldXG4gICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSBuZXcgY2MuTm9kZSgpXG4gICAgICAgICAgICAgICAgbGV0IGltYWdlID0gaXRlbS5hZGRDb21wb25lbnQoY2MuU3ByaXRlKVxuICAgICAgICAgICAgICAgIGltYWdlLnR5cGUgPSBjYy5TcHJpdGUuVHlwZS5TTElDRUQ7XG4gICAgICAgICAgICAgICAgaW1hZ2Uuc2l6ZU1vZGUgPSBjYy5TcHJpdGUuU2l6ZU1vZGUuQ1VTVE9NO1xuICAgICAgICAgICAgICAgIGl0ZW0uc2V0UG9zaXRpb24odGlwc19zY3JvbGxfd2lkdGggLyAyLCA1ICsgKGJ1dHRvbl9oZWlnaHRfc3BhY2UgKyBidXR0b25faGVpZ2h0KSAqIGkpXG4gICAgICAgICAgICAgICAgaXRlbS5zZXRDb250ZW50U2l6ZShjYy5zaXplKG1heF93aWR0aCwgYnV0dG9uX2hlaWdodCkpXG4gICAgICAgICAgICAgICAgaXRlbS5zZXRBbmNob3JQb2ludCgwLjUsIDApXG4gICAgICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRSZXMocmVzLCBmdW5jdGlvbiAoU3ByaXRlRnJhbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2Uuc3ByaXRlRnJhbWUgPSBTcHJpdGVGcmFtZTtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9tcHRfdGlwc19zY3JvbGwuYWRkQ2hpbGQoaXRlbSlcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBuZXcgY2MuTm9kZSgpLmFkZENvbXBvbmVudChjYy5MYWJlbClcbiAgICAgICAgICAgICAgICBsYWJlbC5ub2RlLmNvbG9yID0gbmV3IGNjLkNvbG9yKCkuZnJvbUhFWChDb25maWcuY29sb3JfZGF0YS5kYXRhX2NvbG9yMTZbMTc1XSlcbiAgICAgICAgICAgICAgICBsYWJlbC5zdHJpbmcgPSB2Lm5hbWU7XG4gICAgICAgICAgICAgICAgbGFiZWwuZm9udFNpemUgPSAyMjtcbiAgICAgICAgICAgICAgICBsYWJlbC5saW5lSGVpZ2h0ID0gMjY7XG4gICAgICAgICAgICAgICAgbGFiZWwubm9kZS55ID0gYnV0dG9uX2hlaWdodCAvIDJcbiAgICAgICAgICAgICAgICBpdGVtLmFkZENoaWxkKGxhYmVsLm5vZGUpXG4gICAgICAgICAgICAgICAgbGV0IGJ0biA9IGl0ZW0uYWRkQ29tcG9uZW50KGNjLkJ1dHRvbilcbiAgICAgICAgICAgICAgICBidG4udHJhbnNpdGlvbiA9IGNjLkJ1dHRvbi5UcmFuc2l0aW9uLlNDQUxFO1xuICAgICAgICAgICAgICAgIGJ0bi5kdXJhdGlvbiA9IDAuMTtcbiAgICAgICAgICAgICAgICBidG4uem9vbVNjYWxlID0gMC45O1xuICAgICAgICAgICAgICAgIGl0ZW0ub24oJ3RvdWNoZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21wdF9tYXNrLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1haW51aV9jb250cm9sbGVyLm9uQ2xpY2tQcm9tcHRUaXBzSXRlbSh2KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21wdF90aXBzX2xheW91dC5hY3RpdmUgPSAoZmFsc2UpXG4gICAgICAgICAgICAgICAgfSwgdGhpcylcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcm9tcHRfdGlwc19idG4uYWN0aXZlID0gKGZhbHNlKVxuICAgICAgICAgICAgdGhpcy5wcm9tcHRfdGlwc19sYXlvdXQuYWN0aXZlID0gKGZhbHNlKVxuICAgICAgICAgICAgaWYgKHRoaXMucHJvbXB0X21hc2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb21wdF9tYXNrLmFjdGl2ZSA9IChmYWxzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgX29uQ2xpY2tQcm9tcHRUaXBzKCkge1xuICAgICAgICBpZiAodGhpcy5wcm9tcHRfdGlwc19sYXlvdXQuYWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLnByb21wdF90aXBzX2xheW91dC5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnByb21wdF9tYXNrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9tcHRfbWFzay5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucHJvbXB0X3RpcHNfbGF5b3V0LmFjdGl2ZSA9ICh0cnVlKVxuICAgICAgICAgICAgaWYgKHRoaXMucHJvbXB0X21hc2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb21wdF9tYXNrLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8v5Yib5bu65rex5rW35bCP56iL5bqP5a6i5pyN5rWu5qCHXG4gICAgY3JlYXRvckN1c3RvbWVyU2VydmljZUJ0bjogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5jdXN0b21lcl9zZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbWVyX3NlcnZpY2UuZGVsZXRlTWUoKTtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tZXJfc2VydmljZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdXN0b21lcl9zZXJ2aWNlID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJjdXN0b21lcl9zZXJ2aWNlX3dpbmRvd1wiKTtcbiAgICAgICAgdmFyIGNvbnRhaW5lciA9IHJlcXVpcmUoXCJ2aWV3bWFuYWdlclwiKS5nZXRJbnN0YW5jZSgpLmdldFNjZW5lTm9kZShTQ0VORV9UQUcubG9hZGluZyk7XG5cbiAgICAgICAgdGhpcy5jdXN0b21lcl9zZXJ2aWNlLnNldFBhcmVudChjb250YWluZXIpO1xuICAgICAgICB0aGlzLmN1c3RvbWVyX3NlcnZpY2Uuc2hvdygpO1xuICAgIH0sXG5cblxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gTWFpblVJVmlldzsiXX0=