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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/login/login_controller.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, '859a9X1XhRJLaXkg0bNqr0N', 'login_controller');
// Scripts/mod/login/login_controller.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: shiraho@syg.com(必填, 创建模块的人员)
// @description:
//      登录控制器
// <br/>Create: new Date().toISOString()
// --------------------------------------------------------------------
// var MainSceneController = require("mainscene_controller");
var LoginEvent = require("login_event");
 
var RoleController = require("role_controller");
 
var LoginPlatform = require("login_platform");
 
var LoginController = cc.Class({
  "extends": BaseController,
  ctor: function ctor() {},
  // 初始化配置数据
  initConfig: function initConfig() {
    this.finish_loading = false;
 
    var LoginModel = require("login_model");
 
    this.model = new LoginModel();
    this.model.initConfig();
    this.enable_relogin = true; // 是否允许重连
  },
  // 注册监听事件
  registerEvents: function registerEvents() {
    gcore.GlobalEvent.bind(LoginEvent.LOGIN_EVENT_ACCOUNT_LOGIN_SUCCESS, function () {
      this.model.requestDefaultServer();
    }.bind(this));
    gcore.GlobalEvent.bind(LoginEvent.LOGIN_EVENT_DEFSERVER_SUCCESS, function () {}.bind(this));
    gcore.GlobalEvent.bind(gcore.GlobalEvent.EVT_SOCKET_CONNECT, function () {
      this.enable_relogin = true;
 
      if (this.reconnect_timer) {
        gcore.Timer.del(this.reconnect_timer);
        this.reconnect_timer = null;
        game.updateWaitingStatus();
      }
 
      if (USE_SDK) {
        SDK.loginGame();
      } else {
        this.login();
      }
    }.bind(this));
    gcore.GlobalEvent.bind(gcore.GlobalEvent.EVT_SOCKET_DISCONNECT, function () {
      this.reconnectServer();
    }.bind(this));
  },
  // 注册协议接受事件
  registerProtocals: function registerProtocals() {
    this.RegisterProtocal(1110, this.on1110);
    this.RegisterProtocal(10310, this.on10310);
    this.RegisterProtocal(10101, this.on10101);
    this.RegisterProtocal(10102, this.on10102);
    this.RegisterProtocal(10103, this.on10103);
  },
  // 获取模块
  getModel: function getModel() {
    return this.model;
  },
  // 打开登录加载
  openLoginWindow: function openLoginWindow(data) {
    if (data && data.status) {
      var LoginWindow = require("login_window");
 
      if (this.login_window == null) {
        this.login_window = new LoginWindow();
      }
 
      this.login_window.open(data);
    } else {
      if (this.login_window) {
        this.finish_loading = false;
        game.updateLoadingStatus(true);
        gcore.GlobalEvent.fire(EventId.LOADING_FINISH);
        this.login_window.close();
        this.login_window = null;
      }
    }
  },
  getTestAccount: function getTestAccount() {
    if (this.login_window) return this.login_window.getTestAccount();
  },
  // 切换登录窗体的面板状态
  changeLoginWindowIndex: function changeLoginWindowIndex(index) {
    if (this.login_window) {
      this.login_window.changeSubPanel(index);
    }
  },
  // 连接服务器
  connectServer: function connectServer(host, port, ws) {
    if (NO_SOCKET) {
      this.openLoginWindow(false);
      return;
    }
 
    var loginInfo = this.model.getLoginInfo();
    host = host || loginInfo.host;
    port = port || loginInfo.port;
    ws = ws || loginInfo.ws;
    cc.log("建立socket链接");
    cc.log(loginInfo);
 
    if (host && port) {
      gcore.SmartSocket.connect(host, port, ws); // gcore.SmartSocket.connect("localhost", "9001");
    } else {
      message("服务器地址信息错误");
    }
  },
  // 断线重线处理
  reconnectServer: function reconnectServer() {
    if (!this.reconnect_timer && this.enable_relogin) {
      this.reconnect_timer = gcore.Timer.set(this.connectServer.bind(this), 3000, -1);
      game.updateWaitingStatus(WaitingStaus.CONNECT);
    }
  },
  // 登录服务器
  login: function login() {
    var loginInfo = this.model.getLoginInfo();
    var data = [{
      key: "account",
      val: loginInfo.account
    }, {
      key: "channel",
      val: CHANNEL
    }, {
      key: "idfa",
      val: "windows"
    }];
    this.SendProtocal(1110, {
      args: data
    });
  },
  sdkLogin: function sdkLogin() {
    // LoginPlatform
    var protocal = {};
    var account = this.model.getLoginData().usrName || "";
    var srv_id = this.model.getLoginData().srv_id || "";
    var device_id = "nicai"; // var device_id = device.getDeviceName()
 
    var timestamp = LoginPlatform.getInstance().getTimestamp();
    var token = LoginPlatform.getInstance().getToken();
    var sign = LoginPlatform.getInstance().getSign();
    var channel = LoginPlatform.getInstance().getChannel();
    account = channel + "_" + account;
    var final_channel = LoginPlatform.getInstance().getFinalChannel();
    var gettui_cid = "meiyou";
    var device_type = ""; // var gettui_cid = device.getuiId()
 
    var idfa = "meiyou";
    var is_emulator = "false";
    var os_ver = "";
    var carrier_name = "";
    var net_type = "";
    var app_name = GAME_NAME;
    var package_name = GAME_NAME;
    var package_version = "1.0.1";
    var os = "os";
    var logsign_str = account + device_id + idfa + channel + gettui_cid + is_emulator;
 
    var MD5 = require("md5.min"); // cc.log("value_1==>", value);
 
 
    var logsign = MD5(logsign_str);
    logsign = logsign.toLowerCase();
    protocal.args = [{
      key: "account",
      val: account
    }, {
      key: "timestamp",
      val: timestamp
    }, {
      key: "enter_srv_id",
      val: srv_id
    }, {
      key: "platform",
      val: PLATFORM_NAME
    }, {
      key: "device_id",
      val: device_id
    }, {
      key: "device_type",
      val: device_type
    }, {
      key: "gettui_cid",
      val: gettui_cid
    }, {
      key: "idfa",
      val: idfa
    }, {
      key: "token",
      val: token
    }, {
      key: "channel",
      val: final_channel
    }, {
      key: "sign",
      val: sign
    }, {
      key: "logsign",
      val: logsign
    }, {
      key: "os_ver",
      os_ver: os_ver
    }, {
      key: "carrier_name",
      val: carrier_name
    }, {
      key: "net_type",
      val: net_type
    }, {
      key: "os",
      val: os
    }, {
      key: "emulator",
      val: is_emulator
    }, {
      key: "app_name",
      val: app_name
    }, {
      key: "package_name",
      val: package_name
    }, {
      key: "package_version",
      val: package_version
    }];
    this.SendProtocal(1110, protocal);
  },
  //自定义参数的SDKLogin
  cusSDKLogin: function cusSDKLogin(data) {
    if (!data) return;
    var srv_id = this.model.getLoginData().srv_id || "";
    var account = data.account;
    var rawData = data.rawData;
    var signature = data.signature;
    var channel = data.channel;
    var device_id = "";
    var idfa = "";
    var gettui_cid = "";
    var is_emulator = "";
    var package_name = data.package_name;
    var package_version = data.package_version;
    var app_name = "";
    var platform = data.platform;
    var token = data.token || "";
    var timestamp = data.timestamp || "";
    var sign = data.sign || "";
    var logsign_str = account + device_id + idfa + channel + gettui_cid + is_emulator;
 
    var MD5 = require("md5.min");
 
    var logsign = MD5(logsign_str);
    logsign = logsign.toLowerCase();
    var protocal = {};
    protocal.args = [{
      key: "account",
      val: account
    }, {
      key: "enter_srv_id",
      val: srv_id
    }, {
      key: "platform",
      val: platform
    }, {
      key: "device_id",
      val: device_id
    }, {
      key: "gettui_cid",
      val: gettui_cid
    }, {
      key: "idfa",
      val: idfa
    }, {
      key: "channel",
      val: channel
    }, {
      key: "logsign",
      val: logsign
    }, {
      key: "emulator",
      val: is_emulator
    }, {
      key: "app_name",
      val: app_name
    }, {
      key: "package_name",
      val: package_name
    }, {
      key: "package_version",
      val: package_version
    }, {
      key: "rawData",
      val: rawData
    }, {
      key: "signature",
      val: signature
    }, {
      key: "token",
      val: token
    }, {
      key: "timestamp",
      val: timestamp
    }, {
      key: "sign",
      val: sign
    }];
    cc.log(protocal);
    this.SendProtocal(1110, protocal);
  },
  //自定义参数的SDKLogin
  //data:[]  看不同平台包传入不同的内容;
  cusSDKLogin_2: function cusSDKLogin_2(data) {
    if (!data) return;
    var srv_id = this.model.getLoginData().srv_id || "";
    var device_id = "";
    var idfa = "";
    var gettui_cid = "";
    var is_emulator = "";
    var app_name = "";
    var logsign_str = data.account + device_id + idfa + data.channel + gettui_cid + is_emulator;
 
    var MD5 = require("md5.min");
 
    var logsign = MD5(logsign_str);
    logsign = logsign.toLowerCase();
    var args = [{
      key: "enter_srv_id",
      val: srv_id
    }, {
      key: "device_id",
      val: device_id
    }, {
      key: "gettui_cid",
      val: gettui_cid
    }, {
      key: "idfa",
      val: idfa
    }, {
      key: "logsign",
      val: logsign
    }, {
      key: "emulator",
      val: is_emulator
    }, {
      key: "app_name",
      val: app_name
    }];
    var protocal = {};
    protocal.args = data.concat(args);
    cc.log("1110--protocal==>", protocal);
    this.SendProtocal(1110, protocal);
  },
  // 账号角色列表信息返回
  on1110: function on1110(data) {
    cc.log("1110登录游戏返回");
    cc.log(data); // 1110返回错误则不需要重连
 
    if (data.code == 1) {
      if (this.model.auto_login == false) {
        //不需要主动进入服务器 比如在服务器列表中选择服
        return;
      }
 
      if (this.model.isSocket) {
        gcore.GlobalEvent.fire(LoginEvent.LOGIN_EVENT_PLAYER_INFO, data);
        return;
      }
 
      if (data.roles.length == 0) {
        this.reqCreateRole();
      } else {
        var role = this.role = data.roles[0];
        this.reqLoginRole(role.rid, role.srv_id);
      } // 提交服务器信息
 
 
      if ((PLATFORM_TYPR == "WX_SDK" || PLATFORM_TYPR == "QQ_SDK") && USE_SDK) {
        var loginInfo = this.model.getLoginInfo();
        SDK.submitLogin(loginInfo.host);
      }
    } else if (data.code == 4) {
      //服务器维护或者被封或者未开服
      this.enable_relogin = false;
 
      require("notice_controller").getInstance().openNocticeWindow(true);
    } else {
      this.enable_relogin = false;
      message(data.msg);
    }
  },
  getCurRoleInfo: function getCurRoleInfo() {
    return this.role;
  },
  // 掉线提示, 收到该协议后将不会进行重连
  on10310: function on10310(data) {
    this.enable_relogin = false;
    gcore.SmartSocket.stopHeart();
 
    if (this.reconnect_timer) {
      gcore.Timer.del(this.reconnect_timer);
      this.reconnect_timer = null;
      game.updateWaitingStatus();
    }
 
    if (data.is_show == 1) {
      message(data.msg);
    }
 
    var GuideController = require("guide_controller");
 
    GuideController.getInstance().setGuideMainRootWnd(false);
 
    var CommonAlert = require("commonalert");
 
    CommonAlert.showItemApply(Utils.TI18N("该账号已在其他地方登录"), null, function () {
      game.relogin();
 
      if (PLATFORM_TYPR == "SH_RH") {
        SDK.logout();
      }
    }.bind(this), Utils.TI18N("确定"), null, null, Utils.TI18N("提示"), null, null, true, null, null, null, null, {
      off_y: -18,
      close_off: true
    }); // game.relogin();
  },
  // 请求创建新角色
  reqCreateRole: function reqCreateRole() {
    if (PLATFORM_TYPR == "SH_RH" || PLATFORM_TYPR == "SH_SDK") {
      this.SendProtocal(10101, {
        sex: 0,
        name: "",
        career: 1,
        playform: CHANNEL
      });
    } else {
      this.SendProtocal(10101, {
        sex: 0,
        name: "",
        career: 1,
        playform: PLATFORM
      });
    }
  },
  // 创建新角色返回
  on10101: function on10101(data) {
    if (data.code == 1) {
      if (IS_SUBMIT) {
        SDK.sdkSubmitUserData(2, data);
      }
 
      if (PLATFORM_TYPR == "SH_RH" && PLATFORM_NAME == "sh") {
        SDK.createRole(data);
      }
 
      if (PLATFORM_TYPR == "SH_SDK") {
        SDK.createRole(data);
      }
 
      this.model.setFirstRoleData(data);
      this.reqLoginRole(data.rid, data.srv_id);
    } else {
      message(data.msg);
    }
  },
  // 请求登录角色
  reqLoginRole: function reqLoginRole(rid, srv_id) {
    var loginInfo = this.model.getLoginInfo();
    loginInfo.login_rid = rid;
    loginInfo.login_srv_id = srv_id;
    cc.log(RoleController.getInstance().init_role);
 
    if (RoleController.getInstance().init_role) {
      // 角色已登录 断线重连处理
      this.SendProtocal(10103, {
        rid: rid,
        srv_id: srv_id
      });
    } else {
      this.SendProtocal(10102, {
        rid: rid,
        srv_id: srv_id
      });
    }
  },
  // 角色登录成功返回
  on10102: function on10102(data) {
    if (data.code == 1) {
      if (this.login_window) this.login_window.showLoading();
      game.initConfigs(function () {
        this.SendProtocal(10300, {});
      }.bind(this));
      RoleController.getInstance().getModel().setWorldLev(data.world_lev || 0);
    } else {
      message(data.msg);
    }
 
    if (this.serverListWindow) {
      this.openServerList(false);
    }
  },
  sender10300: function sender10300() {
    this.SendProtocal(10300, {});
  },
  // 角色重连成功返回
  on10103: function on10103(data) {
    if (data.code == 1) {
      var RoleController = require("role_controller");
 
      RoleController.getInstance().setReconnect(true);
      this.SendProtocal(10300, {});
    } else {
      message(data.msg);
    }
  },
  //打开选区列表
  openServerList: function openServerList(bool, data, callFunc) {
    if (bool) {
      if (!this.serverListWindow) {
        var serverListWindow = require("server_list_window");
 
        this.serverListWindow = new serverListWindow();
      }
 
      this.serverListWindow.open(data);
      this.serverListWindow.addCallBack(callFunc);
    } else {
      if (this.serverListWindow) {
        this.serverListWindow.close();
        this.serverListWindow = null;
      }
    }
  },
  updateLoading: function updateLoading(progerss) {
    if (this.login_window) this.login_window.updateLoading(progerss);
  },
  updateSeconLoading: function updateSeconLoading(progerss, isinit) {
    if (this.login_window) this.login_window.updateSeconLoading(progerss, isinit);
  },
  loginPlatformRequest: function loginPlatformRequest(data) {
    var login_data = this.model.getLoginData();
 
    if (data.usrName != login_data.usrName) {
      gcore.SysEnv.set("user_name", data.usrName);
      gcore.SysEnv.set("password", data.password);
      login_data.usrName = data.usrName;
      login_data.password = data.password;
    }
 
    this.loginNewUserRequest(data);
  },
  loginNewUserRequest: function loginNewUserRequest(data) {
    var info = {};
    info.code = 1;
    info.accName = data.usrName;
    info.platform = PLATFORM_NAME;
    info.msg = "";
    this.loginPlatformResult(info);
  },
  loginPlatformResult: function loginPlatformResult(data) {
    if (data.code == 1) {
      this.model.requestDefaultServerList(data.accName, data.platform);
    } else {}
  },
  //强制下线
  sender10312: function sender10312() {
    this.SendProtocal(10312, {});
  }
});
module.exports = LoginController;
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxsb2dpblxcbG9naW5fY29udHJvbGxlci5qcyJdLCJuYW1lcyI6WyJMb2dpbkV2ZW50IiwicmVxdWlyZSIsIlJvbGVDb250cm9sbGVyIiwiTG9naW5QbGF0Zm9ybSIsIkxvZ2luQ29udHJvbGxlciIsImNjIiwiQ2xhc3MiLCJCYXNlQ29udHJvbGxlciIsImN0b3IiLCJpbml0Q29uZmlnIiwiZmluaXNoX2xvYWRpbmciLCJMb2dpbk1vZGVsIiwibW9kZWwiLCJlbmFibGVfcmVsb2dpbiIsInJlZ2lzdGVyRXZlbnRzIiwiZ2NvcmUiLCJHbG9iYWxFdmVudCIsImJpbmQiLCJMT0dJTl9FVkVOVF9BQ0NPVU5UX0xPR0lOX1NVQ0NFU1MiLCJyZXF1ZXN0RGVmYXVsdFNlcnZlciIsIkxPR0lOX0VWRU5UX0RFRlNFUlZFUl9TVUNDRVNTIiwiRVZUX1NPQ0tFVF9DT05ORUNUIiwicmVjb25uZWN0X3RpbWVyIiwiVGltZXIiLCJkZWwiLCJnYW1lIiwidXBkYXRlV2FpdGluZ1N0YXR1cyIsIlVTRV9TREsiLCJTREsiLCJsb2dpbkdhbWUiLCJsb2dpbiIsIkVWVF9TT0NLRVRfRElTQ09OTkVDVCIsInJlY29ubmVjdFNlcnZlciIsInJlZ2lzdGVyUHJvdG9jYWxzIiwiUmVnaXN0ZXJQcm90b2NhbCIsIm9uMTExMCIsIm9uMTAzMTAiLCJvbjEwMTAxIiwib24xMDEwMiIsIm9uMTAxMDMiLCJnZXRNb2RlbCIsIm9wZW5Mb2dpbldpbmRvdyIsImRhdGEiLCJzdGF0dXMiLCJMb2dpbldpbmRvdyIsImxvZ2luX3dpbmRvdyIsIm9wZW4iLCJ1cGRhdGVMb2FkaW5nU3RhdHVzIiwiZmlyZSIsIkV2ZW50SWQiLCJMT0FESU5HX0ZJTklTSCIsImNsb3NlIiwiZ2V0VGVzdEFjY291bnQiLCJjaGFuZ2VMb2dpbldpbmRvd0luZGV4IiwiaW5kZXgiLCJjaGFuZ2VTdWJQYW5lbCIsImNvbm5lY3RTZXJ2ZXIiLCJob3N0IiwicG9ydCIsIndzIiwiTk9fU09DS0VUIiwibG9naW5JbmZvIiwiZ2V0TG9naW5JbmZvIiwibG9nIiwiU21hcnRTb2NrZXQiLCJjb25uZWN0IiwibWVzc2FnZSIsInNldCIsIldhaXRpbmdTdGF1cyIsIkNPTk5FQ1QiLCJrZXkiLCJ2YWwiLCJhY2NvdW50IiwiQ0hBTk5FTCIsIlNlbmRQcm90b2NhbCIsImFyZ3MiLCJzZGtMb2dpbiIsInByb3RvY2FsIiwiZ2V0TG9naW5EYXRhIiwidXNyTmFtZSIsInNydl9pZCIsImRldmljZV9pZCIsInRpbWVzdGFtcCIsImdldEluc3RhbmNlIiwiZ2V0VGltZXN0YW1wIiwidG9rZW4iLCJnZXRUb2tlbiIsInNpZ24iLCJnZXRTaWduIiwiY2hhbm5lbCIsImdldENoYW5uZWwiLCJmaW5hbF9jaGFubmVsIiwiZ2V0RmluYWxDaGFubmVsIiwiZ2V0dHVpX2NpZCIsImRldmljZV90eXBlIiwiaWRmYSIsImlzX2VtdWxhdG9yIiwib3NfdmVyIiwiY2Fycmllcl9uYW1lIiwibmV0X3R5cGUiLCJhcHBfbmFtZSIsIkdBTUVfTkFNRSIsInBhY2thZ2VfbmFtZSIsInBhY2thZ2VfdmVyc2lvbiIsIm9zIiwibG9nc2lnbl9zdHIiLCJNRDUiLCJsb2dzaWduIiwidG9Mb3dlckNhc2UiLCJQTEFURk9STV9OQU1FIiwiY3VzU0RLTG9naW4iLCJyYXdEYXRhIiwic2lnbmF0dXJlIiwicGxhdGZvcm0iLCJjdXNTREtMb2dpbl8yIiwiY29uY2F0IiwiY29kZSIsImF1dG9fbG9naW4iLCJpc1NvY2tldCIsIkxPR0lOX0VWRU5UX1BMQVlFUl9JTkZPIiwicm9sZXMiLCJsZW5ndGgiLCJyZXFDcmVhdGVSb2xlIiwicm9sZSIsInJlcUxvZ2luUm9sZSIsInJpZCIsIlBMQVRGT1JNX1RZUFIiLCJzdWJtaXRMb2dpbiIsIm9wZW5Ob2N0aWNlV2luZG93IiwibXNnIiwiZ2V0Q3VyUm9sZUluZm8iLCJzdG9wSGVhcnQiLCJpc19zaG93IiwiR3VpZGVDb250cm9sbGVyIiwic2V0R3VpZGVNYWluUm9vdFduZCIsIkNvbW1vbkFsZXJ0Iiwic2hvd0l0ZW1BcHBseSIsIlV0aWxzIiwiVEkxOE4iLCJyZWxvZ2luIiwibG9nb3V0Iiwib2ZmX3kiLCJjbG9zZV9vZmYiLCJzZXgiLCJuYW1lIiwiY2FyZWVyIiwicGxheWZvcm0iLCJQTEFURk9STSIsIklTX1NVQk1JVCIsInNka1N1Ym1pdFVzZXJEYXRhIiwiY3JlYXRlUm9sZSIsInNldEZpcnN0Um9sZURhdGEiLCJsb2dpbl9yaWQiLCJsb2dpbl9zcnZfaWQiLCJpbml0X3JvbGUiLCJzaG93TG9hZGluZyIsImluaXRDb25maWdzIiwic2V0V29ybGRMZXYiLCJ3b3JsZF9sZXYiLCJzZXJ2ZXJMaXN0V2luZG93Iiwib3BlblNlcnZlckxpc3QiLCJzZW5kZXIxMDMwMCIsInNldFJlY29ubmVjdCIsImJvb2wiLCJjYWxsRnVuYyIsImFkZENhbGxCYWNrIiwidXBkYXRlTG9hZGluZyIsInByb2dlcnNzIiwidXBkYXRlU2Vjb25Mb2FkaW5nIiwiaXNpbml0IiwibG9naW5QbGF0Zm9ybVJlcXVlc3QiLCJsb2dpbl9kYXRhIiwiU3lzRW52IiwicGFzc3dvcmQiLCJsb2dpbk5ld1VzZXJSZXF1ZXN0IiwiaW5mbyIsImFjY05hbWUiLCJsb2dpblBsYXRmb3JtUmVzdWx0IiwicmVxdWVzdERlZmF1bHRTZXJ2ZXJMaXN0Iiwic2VuZGVyMTAzMTIiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0EsSUFBSUEsVUFBVSxHQUFHQyxPQUFPLENBQUMsYUFBRCxDQUF4Qjs7QUFDQSxJQUFJQyxjQUFjLEdBQUdELE9BQU8sQ0FBQyxpQkFBRCxDQUE1Qjs7QUFDQSxJQUFJRSxhQUFhLEdBQUdGLE9BQU8sQ0FBQyxnQkFBRCxDQUEzQjs7QUFFQSxJQUFJRyxlQUFlLEdBQUdDLEVBQUUsQ0FBQ0MsS0FBSCxDQUFTO0FBQzNCLGFBQVNDLGNBRGtCO0FBRTNCQyxFQUFBQSxJQUFJLEVBQUUsZ0JBQVksQ0FD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LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBAYXV0aG9yOiBzaGlyYWhvQHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAgIOeZu+W9leaOp+WItuWZqFxuLy8gPGJyLz5DcmVhdGU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gdmFyIE1haW5TY2VuZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwibWFpbnNjZW5lX2NvbnRyb2xsZXJcIik7XG52YXIgTG9naW5FdmVudCA9IHJlcXVpcmUoXCJsb2dpbl9ldmVudFwiKTtcbnZhciBSb2xlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJyb2xlX2NvbnRyb2xsZXJcIilcbnZhciBMb2dpblBsYXRmb3JtID0gcmVxdWlyZShcImxvZ2luX3BsYXRmb3JtXCIpO1xuXG52YXIgTG9naW5Db250cm9sbGVyID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VDb250cm9sbGVyLFxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICB9LFxuXG4gICAgLy8g5Yid5aeL5YyW6YWN572u5pWw5o2uXG4gICAgaW5pdENvbmZpZzogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmZpbmlzaF9sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHZhciBMb2dpbk1vZGVsID0gcmVxdWlyZShcImxvZ2luX21vZGVsXCIpO1xuXG4gICAgICAgIHRoaXMubW9kZWwgPSBuZXcgTG9naW5Nb2RlbCgpO1xuICAgICAgICB0aGlzLm1vZGVsLmluaXRDb25maWcoKTtcbiAgICAgICAgdGhpcy5lbmFibGVfcmVsb2dpbiA9IHRydWU7ICAgICAgICAgICAvLyDmmK/lkKblhYHorrjph43ov55cbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM55uR5ZCs5LqL5Lu2XG4gICAgcmVnaXN0ZXJFdmVudHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuYmluZChMb2dpbkV2ZW50LkxPR0lOX0VWRU5UX0FDQ09VTlRfTE9HSU5fU1VDQ0VTUywgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMubW9kZWwucmVxdWVzdERlZmF1bHRTZXJ2ZXIoKTtcbiAgICAgICAgfSkuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuYmluZChMb2dpbkV2ZW50LkxPR0lOX0VWRU5UX0RFRlNFUlZFUl9TVUNDRVNTLCAoZnVuY3Rpb24gKCkge1xuICAgICAgICB9KS5iaW5kKHRoaXMpKTtcblxuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5iaW5kKGdjb3JlLkdsb2JhbEV2ZW50LkVWVF9TT0NLRVRfQ09OTkVDVCwgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlX3JlbG9naW4gPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMucmVjb25uZWN0X3RpbWVyKSB7XG4gICAgICAgICAgICAgICAgZ2NvcmUuVGltZXIuZGVsKHRoaXMucmVjb25uZWN0X3RpbWVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlY29ubmVjdF90aW1lciA9IG51bGw7XG4gICAgICAgICAgICAgICAgZ2FtZS51cGRhdGVXYWl0aW5nU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoVVNFX1NESykge1xuICAgICAgICAgICAgICAgIFNESy5sb2dpbkdhbWUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dpbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KS5iaW5kKHRoaXMpKTtcblxuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5iaW5kKGdjb3JlLkdsb2JhbEV2ZW50LkVWVF9TT0NLRVRfRElTQ09OTkVDVCwgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMucmVjb25uZWN0U2VydmVyKCk7XG4gICAgICAgIH0pLmJpbmQodGhpcykpO1xuICAgIH0sXG5cbiAgICAvLyDms6jlhozljY/orq7mjqXlj5fkuovku7ZcbiAgICByZWdpc3RlclByb3RvY2FsczogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTExMCwgdGhpcy5vbjExMTApO1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTAzMTAsIHRoaXMub24xMDMxMCk7XG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMDEwMSwgdGhpcy5vbjEwMTAxKTtcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDEwMTAyLCB0aGlzLm9uMTAxMDIpO1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTAxMDMsIHRoaXMub24xMDEwMyk7XG4gICAgfSxcblxuICAgIC8vIOiOt+WPluaooeWdl1xuICAgIGdldE1vZGVsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsO1xuICAgIH0sXG5cbiAgICAvLyDmiZPlvIDnmbvlvZXliqDovb1cbiAgICBvcGVuTG9naW5XaW5kb3c6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhICYmIGRhdGEuc3RhdHVzKSB7XG4gICAgICAgICAgICB2YXIgTG9naW5XaW5kb3cgPSByZXF1aXJlKFwibG9naW5fd2luZG93XCIpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5sb2dpbl93aW5kb3cgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9naW5fd2luZG93ID0gbmV3IExvZ2luV2luZG93KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubG9naW5fd2luZG93Lm9wZW4oZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5sb2dpbl93aW5kb3cpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbmlzaF9sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZ2FtZS51cGRhdGVMb2FkaW5nU3RhdHVzKHRydWUpO1xuICAgICAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoRXZlbnRJZC5MT0FESU5HX0ZJTklTSClcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2luX3dpbmRvdy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9naW5fd2luZG93ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRUZXN0QWNjb3VudDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5sb2dpbl93aW5kb3cpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2dpbl93aW5kb3cuZ2V0VGVzdEFjY291bnQoKTtcbiAgICB9LFxuXG4gICAgLy8g5YiH5o2i55m75b2V56qX5L2T55qE6Z2i5p2/54q25oCBXG4gICAgY2hhbmdlTG9naW5XaW5kb3dJbmRleDogZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLmxvZ2luX3dpbmRvdykge1xuICAgICAgICAgICAgdGhpcy5sb2dpbl93aW5kb3cuY2hhbmdlU3ViUGFuZWwoaW5kZXgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOi/nuaOpeacjeWKoeWZqFxuICAgIGNvbm5lY3RTZXJ2ZXI6IGZ1bmN0aW9uIChob3N0LCBwb3J0LCB3cykge1xuICAgICAgICBpZiAoTk9fU09DS0VUKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5Mb2dpbldpbmRvdyhmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxvZ2luSW5mbyA9IHRoaXMubW9kZWwuZ2V0TG9naW5JbmZvKCk7XG4gICAgICAgIGhvc3QgPSBob3N0IHx8IGxvZ2luSW5mby5ob3N0O1xuICAgICAgICBwb3J0ID0gcG9ydCB8fCBsb2dpbkluZm8ucG9ydDtcbiAgICAgICAgd3MgPSB3cyB8fCBsb2dpbkluZm8ud3M7XG5cbiAgICAgICAgY2MubG9nKFwi5bu656uLc29ja2V06ZO+5o6lXCIpO1xuICAgICAgICBjYy5sb2cobG9naW5JbmZvKTtcblxuICAgICAgICBpZiAoaG9zdCAmJiBwb3J0KSB7XG4gICAgICAgICAgICBnY29yZS5TbWFydFNvY2tldC5jb25uZWN0KGhvc3QsIHBvcnQsIHdzKTtcbiAgICAgICAgICAgIC8vIGdjb3JlLlNtYXJ0U29ja2V0LmNvbm5lY3QoXCJsb2NhbGhvc3RcIiwgXCI5MDAxXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWVzc2FnZShcIuacjeWKoeWZqOWcsOWdgOS/oeaBr+mUmeivr1wiKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDmlq3nur/ph43nur/lpITnkIZcbiAgICByZWNvbm5lY3RTZXJ2ZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlY29ubmVjdF90aW1lciAmJiB0aGlzLmVuYWJsZV9yZWxvZ2luKSB7XG4gICAgICAgICAgICB0aGlzLnJlY29ubmVjdF90aW1lciA9IGdjb3JlLlRpbWVyLnNldCh0aGlzLmNvbm5lY3RTZXJ2ZXIuYmluZCh0aGlzKSwgMzAwMCwgLTEpO1xuICAgICAgICAgICAgZ2FtZS51cGRhdGVXYWl0aW5nU3RhdHVzKFdhaXRpbmdTdGF1cy5DT05ORUNUKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDnmbvlvZXmnI3liqHlmahcbiAgICBsb2dpbjogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbG9naW5JbmZvID0gdGhpcy5tb2RlbC5nZXRMb2dpbkluZm8oKTtcbiAgICAgICAgdmFyIGRhdGEgPSBbXG4gICAgICAgICAgICB7IGtleTogXCJhY2NvdW50XCIsIHZhbDogbG9naW5JbmZvLmFjY291bnQgfVxuICAgICAgICAgICAgLCB7IGtleTogXCJjaGFubmVsXCIsIHZhbDogQ0hBTk5FTCB9XG4gICAgICAgICAgICAsIHsga2V5OiBcImlkZmFcIiwgdmFsOiBcIndpbmRvd3NcIiB9XG4gICAgICAgIF07XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDExMTAsIHsgYXJnczogZGF0YSB9KTtcbiAgICB9LFxuXG4gICAgc2RrTG9naW46IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gTG9naW5QbGF0Zm9ybVxuICAgICAgICB2YXIgcHJvdG9jYWwgPSB7fVxuICAgICAgICB2YXIgYWNjb3VudCA9IHRoaXMubW9kZWwuZ2V0TG9naW5EYXRhKCkudXNyTmFtZSB8fCBcIlwiO1xuICAgICAgICB2YXIgc3J2X2lkID0gdGhpcy5tb2RlbC5nZXRMb2dpbkRhdGEoKS5zcnZfaWQgfHwgXCJcIjtcbiAgICAgICAgdmFyIGRldmljZV9pZCA9IFwibmljYWlcIlxuICAgICAgICAvLyB2YXIgZGV2aWNlX2lkID0gZGV2aWNlLmdldERldmljZU5hbWUoKVxuICAgICAgICB2YXIgdGltZXN0YW1wID0gTG9naW5QbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLmdldFRpbWVzdGFtcCgpO1xuICAgICAgICB2YXIgdG9rZW4gPSBMb2dpblBsYXRmb3JtLmdldEluc3RhbmNlKCkuZ2V0VG9rZW4oKTtcbiAgICAgICAgdmFyIHNpZ24gPSBMb2dpblBsYXRmb3JtLmdldEluc3RhbmNlKCkuZ2V0U2lnbigpO1xuICAgICAgICB2YXIgY2hhbm5lbCA9IExvZ2luUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS5nZXRDaGFubmVsKCk7XG4gICAgICAgIGFjY291bnQgPSBjaGFubmVsICsgXCJfXCIgKyBhY2NvdW50O1xuICAgICAgICB2YXIgZmluYWxfY2hhbm5lbCA9IExvZ2luUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS5nZXRGaW5hbENoYW5uZWwoKTtcbiAgICAgICAgdmFyIGdldHR1aV9jaWQgPSBcIm1laXlvdVwiO1xuICAgICAgICB2YXIgZGV2aWNlX3R5cGUgPSBcIlwiO1xuICAgICAgICAvLyB2YXIgZ2V0dHVpX2NpZCA9IGRldmljZS5nZXR1aUlkKClcbiAgICAgICAgdmFyIGlkZmEgPSBcIm1laXlvdVwiO1xuICAgICAgICB2YXIgaXNfZW11bGF0b3IgPSBcImZhbHNlXCI7XG4gICAgICAgIHZhciBvc192ZXIgPSBcIlwiO1xuICAgICAgICB2YXIgY2Fycmllcl9uYW1lID0gXCJcIjtcbiAgICAgICAgdmFyIG5ldF90eXBlID0gXCJcIjtcbiAgICAgICAgdmFyIGFwcF9uYW1lID0gR0FNRV9OQU1FO1xuICAgICAgICB2YXIgcGFja2FnZV9uYW1lID0gR0FNRV9OQU1FO1xuICAgICAgICB2YXIgcGFja2FnZV92ZXJzaW9uID0gXCIxLjAuMVwiO1xuICAgICAgICB2YXIgb3MgPSBcIm9zXCI7XG5cbiAgICAgICAgdmFyIGxvZ3NpZ25fc3RyID0gYWNjb3VudCArIGRldmljZV9pZCArIGlkZmEgKyBjaGFubmVsICsgZ2V0dHVpX2NpZCArIGlzX2VtdWxhdG9yO1xuICAgICAgICB2YXIgTUQ1ID0gcmVxdWlyZShcIm1kNS5taW5cIik7XG4gICAgICAgIC8vIGNjLmxvZyhcInZhbHVlXzE9PT5cIiwgdmFsdWUpO1xuICAgICAgICB2YXIgbG9nc2lnbiA9IE1ENShsb2dzaWduX3N0cik7XG4gICAgICAgIGxvZ3NpZ24gPSBsb2dzaWduLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgcHJvdG9jYWwuYXJncyA9IFtcbiAgICAgICAgICAgIHsga2V5OiBcImFjY291bnRcIiwgdmFsOiBhY2NvdW50IH0sXG4gICAgICAgICAgICB7IGtleTogXCJ0aW1lc3RhbXBcIiwgdmFsOiB0aW1lc3RhbXAgfSxcbiAgICAgICAgICAgIHsga2V5OiBcImVudGVyX3Nydl9pZFwiLCB2YWw6IHNydl9pZCB9LFxuICAgICAgICAgICAgeyBrZXk6IFwicGxhdGZvcm1cIiwgdmFsOiBQTEFURk9STV9OQU1FIH0sXG4gICAgICAgICAgICB7IGtleTogXCJkZXZpY2VfaWRcIiwgdmFsOiBkZXZpY2VfaWQgfSxcbiAgICAgICAgICAgIHsga2V5OiBcImRldmljZV90eXBlXCIsIHZhbDogZGV2aWNlX3R5cGUgfSxcbiAgICAgICAgICAgIHsga2V5OiBcImdldHR1aV9jaWRcIiwgdmFsOiBnZXR0dWlfY2lkIH0sXG4gICAgICAgICAgICB7IGtleTogXCJpZGZhXCIsIHZhbDogaWRmYSB9LFxuICAgICAgICAgICAgeyBrZXk6IFwidG9rZW5cIiwgdmFsOiB0b2tlbiB9LFxuICAgICAgICAgICAgeyBrZXk6IFwiY2hhbm5lbFwiLCB2YWw6IGZpbmFsX2NoYW5uZWwgfSxcbiAgICAgICAgICAgIHsga2V5OiBcInNpZ25cIiwgdmFsOiBzaWduIH0sXG4gICAgICAgICAgICB7IGtleTogXCJsb2dzaWduXCIsIHZhbDogbG9nc2lnbiB9LFxuICAgICAgICAgICAgeyBrZXk6IFwib3NfdmVyXCIsIG9zX3ZlciB9LFxuICAgICAgICAgICAgeyBrZXk6IFwiY2Fycmllcl9uYW1lXCIsIHZhbDogY2Fycmllcl9uYW1lIH0sXG4gICAgICAgICAgICB7IGtleTogXCJuZXRfdHlwZVwiLCB2YWw6IG5ldF90eXBlIH0sXG4gICAgICAgICAgICB7IGtleTogXCJvc1wiLCB2YWw6IG9zIH0sXG4gICAgICAgICAgICB7IGtleTogXCJlbXVsYXRvclwiLCB2YWw6IGlzX2VtdWxhdG9yIH0sXG4gICAgICAgICAgICB7IGtleTogXCJhcHBfbmFtZVwiLCB2YWw6IGFwcF9uYW1lIH0sXG4gICAgICAgICAgICB7IGtleTogXCJwYWNrYWdlX25hbWVcIiwgdmFsOiBwYWNrYWdlX25hbWUgfSxcbiAgICAgICAgICAgIHsga2V5OiBcInBhY2thZ2VfdmVyc2lvblwiLCB2YWw6IHBhY2thZ2VfdmVyc2lvbiB9XG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTExMCwgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICAvL+iHquWumuS5ieWPguaVsOeahFNES0xvZ2luXG4gICAgY3VzU0RLTG9naW46IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmICghZGF0YSkgcmV0dXJuO1xuXG4gICAgICAgIHZhciBzcnZfaWQgPSB0aGlzLm1vZGVsLmdldExvZ2luRGF0YSgpLnNydl9pZCB8fCBcIlwiO1xuICAgICAgICB2YXIgYWNjb3VudCA9IGRhdGEuYWNjb3VudDtcbiAgICAgICAgdmFyIHJhd0RhdGEgPSBkYXRhLnJhd0RhdGE7XG4gICAgICAgIHZhciBzaWduYXR1cmUgPSBkYXRhLnNpZ25hdHVyZTtcbiAgICAgICAgdmFyIGNoYW5uZWwgPSBkYXRhLmNoYW5uZWw7XG4gICAgICAgIHZhciBkZXZpY2VfaWQgPSBcIlwiO1xuICAgICAgICB2YXIgaWRmYSA9IFwiXCI7XG4gICAgICAgIHZhciBnZXR0dWlfY2lkID0gXCJcIjtcbiAgICAgICAgdmFyIGlzX2VtdWxhdG9yID0gXCJcIjtcbiAgICAgICAgdmFyIHBhY2thZ2VfbmFtZSA9IGRhdGEucGFja2FnZV9uYW1lO1xuICAgICAgICB2YXIgcGFja2FnZV92ZXJzaW9uID0gZGF0YS5wYWNrYWdlX3ZlcnNpb247XG4gICAgICAgIHZhciBhcHBfbmFtZSA9IFwiXCI7XG4gICAgICAgIHZhciBwbGF0Zm9ybSA9IGRhdGEucGxhdGZvcm07XG4gICAgICAgIHZhciB0b2tlbiA9IGRhdGEudG9rZW4gfHxcIlwiO1xuICAgICAgICB2YXIgdGltZXN0YW1wID0gZGF0YS50aW1lc3RhbXAgfHwgXCJcIjtcbiAgICAgICAgdmFyIHNpZ24gPSBkYXRhLnNpZ24gfHwgXCJcIjtcblxuICAgICAgICB2YXIgbG9nc2lnbl9zdHIgPSBhY2NvdW50ICsgZGV2aWNlX2lkICsgaWRmYSArIGNoYW5uZWwgKyBnZXR0dWlfY2lkICsgaXNfZW11bGF0b3I7XG4gICAgICAgIHZhciBNRDUgPSByZXF1aXJlKFwibWQ1Lm1pblwiKTtcbiAgICAgICAgdmFyIGxvZ3NpZ24gPSBNRDUobG9nc2lnbl9zdHIpO1xuICAgICAgICBsb2dzaWduID0gbG9nc2lnbi50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9XG4gICAgICAgIHByb3RvY2FsLmFyZ3MgPSBbXG4gICAgICAgICAgICB7IGtleTogXCJhY2NvdW50XCIsIHZhbDogYWNjb3VudCB9LFxuICAgICAgICAgICAgeyBrZXk6IFwiZW50ZXJfc3J2X2lkXCIsIHZhbDogc3J2X2lkIH0sXG4gICAgICAgICAgICB7IGtleTogXCJwbGF0Zm9ybVwiLCB2YWw6IHBsYXRmb3JtIH0sXG4gICAgICAgICAgICB7IGtleTogXCJkZXZpY2VfaWRcIiwgdmFsOiBkZXZpY2VfaWQgfSxcbiAgICAgICAgICAgIHsga2V5OiBcImdldHR1aV9jaWRcIiwgdmFsOiBnZXR0dWlfY2lkIH0sXG4gICAgICAgICAgICB7IGtleTogXCJpZGZhXCIsIHZhbDogaWRmYSB9LFxuICAgICAgICAgICAgeyBrZXk6IFwiY2hhbm5lbFwiLCB2YWw6IGNoYW5uZWwgfSxcbiAgICAgICAgICAgIHsga2V5OiBcImxvZ3NpZ25cIiwgdmFsOiBsb2dzaWduIH0sXG4gICAgICAgICAgICB7IGtleTogXCJlbXVsYXRvclwiLCB2YWw6IGlzX2VtdWxhdG9yIH0sXG4gICAgICAgICAgICB7IGtleTogXCJhcHBfbmFtZVwiLCB2YWw6IGFwcF9uYW1lIH0sXG4gICAgICAgICAgICB7IGtleTogXCJwYWNrYWdlX25hbWVcIiwgdmFsOiBwYWNrYWdlX25hbWUgfSxcbiAgICAgICAgICAgIHsga2V5OiBcInBhY2thZ2VfdmVyc2lvblwiLCB2YWw6IHBhY2thZ2VfdmVyc2lvbiB9LFxuICAgICAgICAgICAgeyBrZXk6IFwicmF3RGF0YVwiLCB2YWw6IHJhd0RhdGEgfSxcbiAgICAgICAgICAgIHsga2V5OiBcInNpZ25hdHVyZVwiLCB2YWw6IHNpZ25hdHVyZSB9LFxuICAgICAgICAgICAgeyBrZXk6IFwidG9rZW5cIiwgdmFsOiB0b2tlbiB9LFxuICAgICAgICAgICAgeyBrZXk6IFwidGltZXN0YW1wXCIsIHZhbDogdGltZXN0YW1wIH0sXG4gICAgICAgICAgICB7IGtleTogXCJzaWduXCIsIHZhbDogc2lnbiB9XG4gICAgICAgIF07XG5cbiAgICAgICAgY2MubG9nKHByb3RvY2FsKTtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTExMCwgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICAvL+iHquWumuS5ieWPguaVsOeahFNES0xvZ2luXG4gICAgLy9kYXRhOltdICDnnIvkuI3lkIzlubPlj7DljIXkvKDlhaXkuI3lkIznmoTlhoXlrrnvvJtcbiAgICBjdXNTREtMb2dpbl8yOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoIWRhdGEpIHJldHVyblxuICAgICAgICB2YXIgc3J2X2lkID0gdGhpcy5tb2RlbC5nZXRMb2dpbkRhdGEoKS5zcnZfaWQgfHwgXCJcIjtcbiAgICAgICAgdmFyIGRldmljZV9pZCA9IFwiXCI7XG4gICAgICAgIHZhciBpZGZhID0gXCJcIjtcbiAgICAgICAgdmFyIGdldHR1aV9jaWQgPSBcIlwiO1xuICAgICAgICB2YXIgaXNfZW11bGF0b3IgPSBcIlwiO1xuICAgICAgICB2YXIgYXBwX25hbWUgPSBcIlwiO1xuICAgICAgICB2YXIgbG9nc2lnbl9zdHIgPSBkYXRhLmFjY291bnQgKyBkZXZpY2VfaWQgKyBpZGZhICsgZGF0YS5jaGFubmVsICsgZ2V0dHVpX2NpZCArIGlzX2VtdWxhdG9yO1xuICAgICAgICB2YXIgTUQ1ID0gcmVxdWlyZShcIm1kNS5taW5cIik7XG4gICAgICAgIHZhciBsb2dzaWduID0gTUQ1KGxvZ3NpZ25fc3RyKTtcbiAgICAgICAgbG9nc2lnbiA9IGxvZ3NpZ24udG9Mb3dlckNhc2UoKTtcblxuICAgICAgICB2YXIgYXJncyA9IFtcbiAgICAgICAgICAgIHsga2V5OiBcImVudGVyX3Nydl9pZFwiLCB2YWw6IHNydl9pZCB9LFxuICAgICAgICAgICAgeyBrZXk6IFwiZGV2aWNlX2lkXCIsIHZhbDogZGV2aWNlX2lkIH0sXG4gICAgICAgICAgICB7IGtleTogXCJnZXR0dWlfY2lkXCIsIHZhbDogZ2V0dHVpX2NpZCB9LFxuICAgICAgICAgICAgeyBrZXk6IFwiaWRmYVwiLCB2YWw6IGlkZmEgfSxcbiAgICAgICAgICAgIHsga2V5OiBcImxvZ3NpZ25cIiwgdmFsOiBsb2dzaWduIH0sXG4gICAgICAgICAgICB7IGtleTogXCJlbXVsYXRvclwiLCB2YWw6IGlzX2VtdWxhdG9yIH0sXG4gICAgICAgICAgICB7IGtleTogXCJhcHBfbmFtZVwiLCB2YWw6IGFwcF9uYW1lIH0sXG4gICAgICAgIF07XG5cbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLmFyZ3MgPSBkYXRhLmNvbmNhdChhcmdzKVxuXG4gICAgICAgIGNjLmxvZyhcIjExMTAtLXByb3RvY2FsPT0+XCIsIHByb3RvY2FsKTtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTExMCwgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICAvLyDotKblj7fop5LoibLliJfooajkv6Hmga/ov5Tlm55cbiAgICBvbjExMTA6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGNjLmxvZyhcIjExMTDnmbvlvZXmuLjmiI/ov5Tlm55cIik7XG4gICAgICAgIGNjLmxvZyhkYXRhKTtcblxuICAgICAgICAvLyAxMTEw6L+U5Zue6ZSZ6K+v5YiZ5LiN6ZyA6KaB6YeN6L+eXG4gICAgICAgIGlmIChkYXRhLmNvZGUgPT0gMSkge1xuICAgICAgICAgICAgaWYgKHRoaXMubW9kZWwuYXV0b19sb2dpbiA9PSBmYWxzZSkgey8v5LiN6ZyA6KaB5Li75Yqo6L+b5YWl5pyN5Yqh5ZmoIOavlOWmguWcqOacjeWKoeWZqOWIl+ihqOS4remAieaLqeacjVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsLmlzU29ja2V0KSB7XG4gICAgICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShMb2dpbkV2ZW50LkxPR0lOX0VWRU5UX1BMQVlFUl9JTkZPLCBkYXRhKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGEucm9sZXMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcUNyZWF0ZVJvbGUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIHJvbGUgPSB0aGlzLnJvbGUgPSBkYXRhLnJvbGVzWzBdO1xuICAgICAgICAgICAgICAgIHRoaXMucmVxTG9naW5Sb2xlKHJvbGUucmlkLCByb2xlLnNydl9pZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIOaPkOS6pOacjeWKoeWZqOS/oeaBr1xuICAgICAgICAgICAgaWYgKChQTEFURk9STV9UWVBSID09IFwiV1hfU0RLXCIgfHwgUExBVEZPUk1fVFlQUiA9PSBcIlFRX1NES1wiKSAmJiBVU0VfU0RLKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxvZ2luSW5mbyA9IHRoaXMubW9kZWwuZ2V0TG9naW5JbmZvKCk7XG4gICAgICAgICAgICAgICAgU0RLLnN1Ym1pdExvZ2luKGxvZ2luSW5mby5ob3N0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmNvZGUgPT0gNCkgeyAvL+acjeWKoeWZqOe7tOaKpOaIluiAheiiq+WwgeaIluiAheacquW8gOacjVxuICAgICAgICAgICAgdGhpcy5lbmFibGVfcmVsb2dpbiA9IGZhbHNlO1xuICAgICAgICAgICAgcmVxdWlyZShcIm5vdGljZV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3Blbk5vY3RpY2VXaW5kb3codHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZV9yZWxvZ2luID0gZmFsc2U7XG4gICAgICAgICAgICBtZXNzYWdlKGRhdGEubXNnKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRDdXJSb2xlSW5mbzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvbGU7XG4gICAgfSxcblxuICAgIC8vIOaOiee6v+aPkOekuu+8jCDmlLbliLDor6XljY/orq7lkI7lsIbkuI3kvJrov5vooYzph43ov55cbiAgICBvbjEwMzEwOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICB0aGlzLmVuYWJsZV9yZWxvZ2luID0gZmFsc2U7XG4gICAgICAgIGdjb3JlLlNtYXJ0U29ja2V0LnN0b3BIZWFydCgpO1xuICAgICAgICBpZiAodGhpcy5yZWNvbm5lY3RfdGltZXIpIHtcbiAgICAgICAgICAgIGdjb3JlLlRpbWVyLmRlbCh0aGlzLnJlY29ubmVjdF90aW1lcik7XG4gICAgICAgICAgICB0aGlzLnJlY29ubmVjdF90aW1lciA9IG51bGw7XG4gICAgICAgICAgICBnYW1lLnVwZGF0ZVdhaXRpbmdTdGF0dXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRhLmlzX3Nob3cgPT0gMSkge1xuICAgICAgICAgICAgbWVzc2FnZShkYXRhLm1zZyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgR3VpZGVDb250cm9sbGVyID0gcmVxdWlyZShcImd1aWRlX2NvbnRyb2xsZXJcIik7XG4gICAgICAgIEd1aWRlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNldEd1aWRlTWFpblJvb3RXbmQoZmFsc2UpO1xuICAgICAgICB2YXIgQ29tbW9uQWxlcnQgPSByZXF1aXJlKFwiY29tbW9uYWxlcnRcIik7XG4gICAgICAgIENvbW1vbkFsZXJ0LnNob3dJdGVtQXBwbHkoVXRpbHMuVEkxOE4oXCLor6XotKblj7flt7LlnKjlhbbku5blnLDmlrnnmbvlvZVcIiksbnVsbCxmdW5jdGlvbigpe1xuICAgICAgICAgICAgZ2FtZS5yZWxvZ2luKCk7XG4gICAgICAgICAgICBpZihQTEFURk9STV9UWVBSID09IFwiU0hfUkhcIil7XG4gICAgICAgICAgICAgICAgU0RLLmxvZ291dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LmJpbmQodGhpcyksVXRpbHMuVEkxOE4oXCLnoa7lrppcIiksbnVsbCxudWxsLFV0aWxzLlRJMThOKFwi5o+Q56S6XCIpLG51bGwsbnVsbCx0cnVlLG51bGwsIG51bGwsbnVsbCxudWxsLHtvZmZfeTotMTgsY2xvc2Vfb2ZmOnRydWV9KVxuICAgICAgICAvLyBnYW1lLnJlbG9naW4oKTtcbiAgICB9LFxuXG4gICAgLy8g6K+35rGC5Yib5bu65paw6KeS6ImyXG4gICAgcmVxQ3JlYXRlUm9sZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZihQTEFURk9STV9UWVBSID09IFwiU0hfUkhcIiB8fCBQTEFURk9STV9UWVBSID09IFwiU0hfU0RLXCIpe1xuICAgICAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTAxMDEsIHsgc2V4OiAwLCBuYW1lOiBcIlwiLCBjYXJlZXI6IDEsIHBsYXlmb3JtOiBDSEFOTkVMfSk7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTAxMDEsIHsgc2V4OiAwLCBuYW1lOiBcIlwiLCBjYXJlZXI6IDEsIHBsYXlmb3JtOiBQTEFURk9STSB9KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDliJvlu7rmlrDop5LoibLov5Tlm55cbiAgICBvbjEwMTAxOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5jb2RlID09IDEpIHtcbiAgICAgICAgICAgIGlmIChJU19TVUJNSVQpIHtcbiAgICAgICAgICAgICAgICBTREsuc2RrU3VibWl0VXNlckRhdGEoMiwgZGF0YSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChQTEFURk9STV9UWVBSID09IFwiU0hfUkhcIiAmJiBQTEFURk9STV9OQU1FID09IFwic2hcIil7XG4gICAgICAgICAgICAgICAgU0RLLmNyZWF0ZVJvbGUoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoUExBVEZPUk1fVFlQUiA9PSBcIlNIX1NES1wiKXtcbiAgICAgICAgICAgICAgICBTREsuY3JlYXRlUm9sZShkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2V0Rmlyc3RSb2xlRGF0YShkYXRhKTtcbiAgICAgICAgICAgIHRoaXMucmVxTG9naW5Sb2xlKGRhdGEucmlkLCBkYXRhLnNydl9pZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtZXNzYWdlKGRhdGEubXNnKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDor7fmsYLnmbvlvZXop5LoibJcbiAgICByZXFMb2dpblJvbGU6IGZ1bmN0aW9uIChyaWQsIHNydl9pZCkge1xuICAgICAgICB2YXIgbG9naW5JbmZvID0gdGhpcy5tb2RlbC5nZXRMb2dpbkluZm8oKTtcbiAgICAgICAgbG9naW5JbmZvLmxvZ2luX3JpZCA9IHJpZDtcbiAgICAgICAgbG9naW5JbmZvLmxvZ2luX3Nydl9pZCA9IHNydl9pZDtcbiAgICAgICAgY2MubG9nKFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuaW5pdF9yb2xlKTtcbiAgICAgICAgaWYgKFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuaW5pdF9yb2xlKSB7Ly8g6KeS6Imy5bey55m75b2VIOaWree6v+mHjei/nuWkhOeQhlxuICAgICAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTAxMDMsIHsgcmlkOiByaWQsIHNydl9pZDogc3J2X2lkIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTAxMDIsIHsgcmlkOiByaWQsIHNydl9pZDogc3J2X2lkIH0pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOinkuiJsueZu+W9leaIkOWKn+i/lOWbnlxuICAgIG9uMTAxMDI6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhLmNvZGUgPT0gMSkge1xuICAgICAgICAgICAgaWYgKHRoaXMubG9naW5fd2luZG93KVxuICAgICAgICAgICAgICAgIHRoaXMubG9naW5fd2luZG93LnNob3dMb2FkaW5nKCk7XG5cbiAgICAgICAgICAgIGdhbWUuaW5pdENvbmZpZ3MoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDEwMzAwLCB7fSk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgICAgICAgICAgUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLnNldFdvcmxkTGV2KGRhdGEud29ybGRfbGV2IHx8IDApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtZXNzYWdlKGRhdGEubXNnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zZXJ2ZXJMaXN0V2luZG93KSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5TZXJ2ZXJMaXN0KGZhbHNlKVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNlbmRlcjEwMzAwOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTAzMDAsIHt9KTtcbiAgICB9LFxuXG4gICAgLy8g6KeS6Imy6YeN6L+e5oiQ5Yqf6L+U5ZueXG4gICAgb24xMDEwMzogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEuY29kZSA9PSAxKSB7XG4gICAgICAgICAgICB2YXIgUm9sZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwicm9sZV9jb250cm9sbGVyXCIpXG4gICAgICAgICAgICBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNldFJlY29ubmVjdCh0cnVlKVxuICAgICAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTAzMDAsIHt9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5omT5byA6YCJ5Yy65YiX6KGoXG4gICAgb3BlblNlcnZlckxpc3QoYm9vbCwgZGF0YSwgY2FsbEZ1bmMpIHtcbiAgICAgICAgaWYgKGJvb2wpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5zZXJ2ZXJMaXN0V2luZG93KSB7XG4gICAgICAgICAgICAgICAgbGV0IHNlcnZlckxpc3RXaW5kb3cgPSByZXF1aXJlKFwic2VydmVyX2xpc3Rfd2luZG93XCIpXG4gICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXJMaXN0V2luZG93ID0gbmV3IHNlcnZlckxpc3RXaW5kb3coKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXJ2ZXJMaXN0V2luZG93Lm9wZW4oZGF0YSlcbiAgICAgICAgICAgIHRoaXMuc2VydmVyTGlzdFdpbmRvdy5hZGRDYWxsQmFjayhjYWxsRnVuYylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlcnZlckxpc3RXaW5kb3cpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlcnZlckxpc3RXaW5kb3cuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlcnZlckxpc3RXaW5kb3cgPSBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgdXBkYXRlTG9hZGluZzogZnVuY3Rpb24gKHByb2dlcnNzKSB7XG4gICAgICAgIGlmICh0aGlzLmxvZ2luX3dpbmRvdylcbiAgICAgICAgICAgIHRoaXMubG9naW5fd2luZG93LnVwZGF0ZUxvYWRpbmcocHJvZ2Vyc3MpO1xuICAgIH0sXG5cbiAgICB1cGRhdGVTZWNvbkxvYWRpbmc6IGZ1bmN0aW9uIChwcm9nZXJzcywgaXNpbml0KSB7XG4gICAgICAgIGlmICh0aGlzLmxvZ2luX3dpbmRvdylcbiAgICAgICAgICAgIHRoaXMubG9naW5fd2luZG93LnVwZGF0ZVNlY29uTG9hZGluZyhwcm9nZXJzcywgaXNpbml0KTtcbiAgICB9LFxuXG4gICAgbG9naW5QbGF0Zm9ybVJlcXVlc3Q6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHZhciBsb2dpbl9kYXRhID0gdGhpcy5tb2RlbC5nZXRMb2dpbkRhdGEoKTtcbiAgICAgICAgaWYgKGRhdGEudXNyTmFtZSAhPSBsb2dpbl9kYXRhLnVzck5hbWUpIHtcbiAgICAgICAgICAgIGdjb3JlLlN5c0Vudi5zZXQoXCJ1c2VyX25hbWVcIiwgZGF0YS51c3JOYW1lKTtcbiAgICAgICAgICAgIGdjb3JlLlN5c0Vudi5zZXQoXCJwYXNzd29yZFwiLCBkYXRhLnBhc3N3b3JkKTtcbiAgICAgICAgICAgIGxvZ2luX2RhdGEudXNyTmFtZSA9IGRhdGEudXNyTmFtZTtcbiAgICAgICAgICAgIGxvZ2luX2RhdGEucGFzc3dvcmQgPSBkYXRhLnBhc3N3b3JkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9naW5OZXdVc2VyUmVxdWVzdChkYXRhKVxuICAgIH0sXG5cbiAgICBsb2dpbk5ld1VzZXJSZXF1ZXN0OiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICB2YXIgaW5mbyA9IHt9XG4gICAgICAgIGluZm8uY29kZSA9IDE7XG4gICAgICAgIGluZm8uYWNjTmFtZSA9IGRhdGEudXNyTmFtZTtcbiAgICAgICAgaW5mby5wbGF0Zm9ybSA9IFBMQVRGT1JNX05BTUU7XG4gICAgICAgIGluZm8ubXNnID0gXCJcIjtcbiAgICAgICAgdGhpcy5sb2dpblBsYXRmb3JtUmVzdWx0KGluZm8pO1xuICAgIH0sXG5cbiAgICBsb2dpblBsYXRmb3JtUmVzdWx0OiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5jb2RlID09IDEpIHtcbiAgICAgICAgICAgIHRoaXMubW9kZWwucmVxdWVzdERlZmF1bHRTZXJ2ZXJMaXN0KGRhdGEuYWNjTmFtZSwgZGF0YS5wbGF0Zm9ybSlcbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5by65Yi25LiL57q/XG4gICAgc2VuZGVyMTAzMTI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxMDMxMiwge30pO1xuICAgIH0sXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBMb2dpbkNvbnRyb2xsZXI7XG4iXX0=