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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/vip/vip_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, 'fc753Pu5ktBOZoyuaPREqO7', 'vip_controller');
// Scripts/mod/vip/vip_controller.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//      这里填写详细说明,主要填写该模块的功能简要
// <br/>Create: 2019-02-26 21:07:32
// --------------------------------------------------------------------
var RoleController = require("role_controller");
 
var VipEvent = require("vip_event");
 
var VipController = cc.Class({
  "extends": BaseController,
  ctor: function ctor() {},
  // 初始化配置数据
  initConfig: function initConfig() {
    var VipModel = require("vip_model");
 
    this.model = new VipModel();
    this.model.initConfig();
    this.vip_redpoint_status = {};
    this.vip_privilege_redpoint = {}; //vip特权 item 红点
 
    this.is_first = true;
  },
  // 返回当前的model
  getModel: function getModel() {
    return this.model;
  },
  // 注册监听事件
  registerEvents: function registerEvents() {
    if (this.login_event_success == null) {
      this.login_event_success = gcore.GlobalEvent.bind(EventId.EVT_ROLE_CREATE_SUCCESS, function () {
        gcore.GlobalEvent.unbind(this.login_event_success);
        this.login_event_success = null;
        this.role_vo = RoleController.getInstance().getRoleVo();
 
        if (this.role_vo) {
          if (this.role_assets_event == null) {
            this.role_assets_event = this.role_vo.bind(EventId.UPDATE_ROLE_ATTRIBUTE, function (key, value) {
              if (key == "vip_lev") {
                this.setIsFirst(true);
                var get_list = this.model.getGetGiftList();
                var item_status = get_list[this.role_vo.vip_lev] == null && this.getIsFirst();
                this.setTipsVIPStstus(VIPREDPOINT.VIP_TAB, item_status);
                gcore.GlobalEvent.fire(VipEvent.UPDATA_ITEM_REDPOINT);
              }
            }.bind(this));
          }
        } // this.sender16707() //月卡领取
        // this.sender16710() //VIP礼包红点用
        // this.sender16712() //累充红点
        // this.sender21006() //每日礼包
        // this.sender24502() //特权礼包
 
      }, this);
    }
 
    if (this.re_link_game_event == null) {
      this.re_link_game_event = gcore.GlobalEvent.bind(EventId.EVT_RE_LINK_GAME, function () {// this.sender21006();
      }, this);
    }
  },
  // 注册协议接受事件
  registerProtocals: function registerProtocals() {
    this.RegisterProtocal(16700, this.handle16700); //获取充值列表信息
 
    this.RegisterProtocal(16710, this.handle16710); //VIP礼包领取信息
 
    this.RegisterProtocal(16711, this.handle16711); //VIP等级奖励领取
 
    this.RegisterProtocal(16712, this.handle16712); //获取永久累充信息
 
    this.RegisterProtocal(16713, this.handle16713); //领取累充奖励
 
    this.RegisterProtocal(21005, this.handle21005); //三倍返利信息
 
    this.RegisterProtocal(21006, this.handle21006); //每日礼包数据
 
    this.RegisterProtocal(24501, this.handle24501); //购买VIP特权礼包
 
    this.RegisterProtocal(24502, this.handle24502); //VIP特权礼包数据
 
    this.RegisterProtocal(16707, this.handle16707);
    this.RegisterProtocal(16708, this.handle16708);
    this.RegisterProtocal(16730, this.handle16730);
    this.RegisterProtocal(16731, this.handle16731);
    this.RegisterProtocal(21020, this.handle21020); //每日一元红点
  },
  setPrivilegeRedpoint: function setPrivilegeRedpoint(index, status) {
    this.vip_privilege_redpoint[index] = status;
  },
  getPrivilegeRedpoint: function getPrivilegeRedpoint(index) {
    var status = this.vip_privilege_redpoint[index];
    return status;
  },
  getIsFirst: function getIsFirst() {
    return this.is_first;
  },
  setIsFirst: function setIsFirst(status) {
    this.is_first = status;
  },
  //获取充值列表信息
  sender16700: function sender16700() {
    this.SendProtocal(16700, {});
  },
  handle16700: function handle16700(data) {
    gcore.GlobalEvent.fire(VipEvent.UPDATE_CHARGE_LIST, data.list);
  },
  //三倍返利信息
  sender21005: function sender21005() {
    this.SendProtocal(21005, {});
  },
  handle21005: function handle21005(data) {
    gcore.GlobalEvent.fire(VipEvent.THREE_RECHARGE, data);
  },
  //请求每次礼包数据
  sender21006: function sender21006() {
    this.SendProtocal(21006, {});
  },
  handle21006: function handle21006(data) {
    if (data) {
      this.model.setDailyGiftData(data.first_gift);
      gcore.GlobalEvent.fire(VipEvent.DAILY_GIFT_INFO);
    }
  },
  //请求购买VIP特权礼包
  sender24501: function sender24501(id) {
    var protocal = {};
    protocal.id = id;
    this.SendProtocal(24501, protocal);
  },
  handle24501: function handle24501(data) {
    if (data.msg) {
      message(data.msg);
    }
  },
  //请求VIP特权礼包数据
  sender24502: function sender24502() {
    this.SendProtocal(24502, {});
  },
  handle24502: function handle24502(data) {
    if (data) {
      this.model.setPrivilegeList(data.list);
      var status = this.model.getPrivilegeRedStatus();
      this.setTipsVIPStstus(VIPREDPOINT.PRIVILEGE, status);
      gcore.GlobalEvent.fire(VipEvent.PRIVILEGE_INFO);
    }
  },
  //VIP界面月卡领取
  sender16707: function sender16707() {
    this.SendProtocal(16707, {});
  },
  handle16707: function handle16707(data) {
    var status = false;
 
    if (data.status == 1) {
      status = true;
    }
 
    this.model.setMonthCard(data.status);
    this.setTipsVIPStstus(VIPREDPOINT.MONTH_CARD, status);
    gcore.GlobalEvent.fire(VipEvent.SUPRE_CARD_GET, data.status);
  },
  sender16708: function sender16708() {
    this.SendProtocal(16708, {});
  },
  handle16708: function handle16708(data) {
    message(data.msg);
  },
  //VIP礼包领取信息
  sender16710: function sender16710() {
    this.SendProtocal(16710, {});
  },
  handle16710: function handle16710(data) {
    this.model.setGetGiftList(data.list);
 
    if (this.role_vo == null) {
      this.role_vo = RoleController.getInstance().getRoleVo();
    }
 
    var get_list = this.model.getGetGiftList();
    var item_status = get_list[this.role_vo.vip_lev] == null && this.getIsFirst();
    this.setTipsVIPStstus(VIPREDPOINT.VIP_TAB, item_status);
    gcore.GlobalEvent.fire(VipEvent.UPDATA_ITEM_REDPOINT);
  },
  //红点
  setTipsVIPStstus: function setTipsVIPStstus(bid, status) {
    this.vip_redpoint_status[bid] = status;
    var redpoint = false;
 
    for (var i in this.vip_redpoint_status) {
      var v = this.vip_redpoint_status[i];
 
      if (v == true) {
        redpoint = true;
        break;
      }
    }
 
    var MainuiController = require("mainui_controller");
 
    var MainuiConst = require("mainui_const");
 
    MainuiController.getInstance().setFunctionTipsStatus(MainuiConst.icon.charge, redpoint);
  },
  //VIP等级奖励领取
  sender16711: function sender16711(lev) {
    var protocal = {};
    protocal.lev = lev;
    this.SendProtocal(16711, protocal);
  },
  handle16711: function handle16711(data) {
    message(data.msg);
  },
  //累充奖励信息
  sender16712: function sender16712() {
    this.SendProtocal(16712, {});
  },
  handle16712: function handle16712(data) {
    this.charge_sum = data.charge_sum; //当前总充值数
 
    this.model.setAccList(data.list);
    gcore.GlobalEvent.fire(VipEvent.ACC_RECHARGE_INFO, data);
  },
  getChargeSum: function getChargeSum() {
    return this.charge_sum || 0;
  },
  //领取累充奖励
  sender16713: function sender16713(id) {
    var protocal = {};
    protocal.id = id;
    this.SendProtocal(16713, protocal);
  },
  handle16713: function handle16713(data) {
    message(data.msg);
  },
  //
  sender16730: function sender16730() {
    var protocal = {};
    this.SendProtocal(16730, protocal);
  },
  // time
  // state
  handle16730: function handle16730(data) {
    this.model.setGiveVipInfo(data);
    this.model.setGiveVipStatus();
    gcore.GlobalEvent.fire(VipEvent.GIVE_VIP_UPDATE);
  },
  //
  sender16731: function sender16731() {
    var protocal = {};
    this.SendProtocal(16731, protocal);
  },
  //领取vip
  handle16731: function handle16731(data) {
    message(data.msg);
 
    if (data.code == 1) {
      this.openVipAwardWindow();
      this.sender16730();
    }
  },
  //index是大标签页 VIPTABCONST
  //sub_type是vip特权界面的 要跳哪个等级就传哪个等级
  openVipMainWindow: function openVipMainWindow(status, index, sub_type, callFunc) {
    if (status) {
      if (IS_SHOW_CHARGE == false) {
        message(Utils.TI18N("功能暂未开放,敬请期待"));
        return;
      }
 
      var charge_cfg = gdata("charge_data", "data_constant", ["open_lv"]);
 
      if (charge_cfg) {
        if (this.role_vo && this.role_vo.lev < charge_cfg.val) {
          message(charge_cfg.desc);
          return;
        }
      }
 
      if (!this.vip_window) {
        this.vip_window = Utils.createClass("vip_main_window");
      }
 
      index = index || 1;
 
      if (this.vip_window) {
        this.vip_window.open(index, sub_type);
      }
 
      if (callFunc) {
        this.deleteCallFunc = callFunc;
      }
    } else {
      if (this.vip_window) {
        this.vip_window.close();
        this.vip_window = null;
 
        if (this.deleteCallFunc) {
          this.deleteCallFunc();
          this.deleteCallFunc = null;
        }
      }
    }
  },
  // 打开奖励VIP界面
  openVipAwardWindow: function openVipAwardWindow(status) {
    if (status == true) {
      if (!this.vip_award_window) {
        this.vip_award_window = Utils.createClass("vip_award_window", this);
      }
 
      if (this.vip_award_window && this.vip_award_window.isOpen() == false) {
        this.vip_award_window.open();
      }
    } else {
      if (this.vip_award_window) {
        this.vip_award_window.close();
        this.vip_award_window = null;
      }
    }
  },
  //切换vip面板的标签页
  changeMainWindowTab: function changeMainWindowTab(index) {
    if (this.vip_window) {
      this.vip_window.changeTabView(index);
    }
  },
  handle21020: function handle21020(data) {
    var status = false;
 
    if (data.code == 1) {
      status = true;
    }
 
    var MainuiController = require("mainui_controller");
 
    var MainuiConst = require("mainui_const");
 
    MainuiController.getInstance().setFunctionTipsStatus(MainuiConst.icon.one_gift, status);
  }
});
module.exports = VipController;
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFx2aXBcXHZpcF9jb250cm9sbGVyLmpzIl0sIm5hbWVzIjpbIlJvbGVDb250cm9sbGVyIiwicmVxdWlyZSIsIlZpcEV2ZW50IiwiVmlwQ29udHJvbGxlciIsImNjIiwiQ2xhc3MiLCJCYXNlQ29udHJvbGxlciIsImN0b3IiLCJpbml0Q29uZmlnIiwiVmlwTW9kZWwiLCJtb2RlbCIsInZpcF9yZWRwb2ludF9zdGF0dXMiLCJ2aXBfcHJpdmlsZWdlX3JlZHBvaW50IiwiaXNfZmlyc3QiLCJnZXRNb2RlbCIsInJlZ2lzdGVyRXZlbnRzIiwibG9naW5fZXZlbnRfc3VjY2VzcyIsImdjb3JlIiwiR2xvYmFsRXZlbnQiLCJiaW5kIiwiRXZlbnRJZCIsIkVWVF9ST0xFX0NSRUFURV9TVUNDRVNTIiwidW5iaW5kIiwicm9sZV92byIsImdldEluc3RhbmNlIiwiZ2V0Um9sZVZvIiwicm9sZV9hc3NldHNfZXZlbnQiLCJVUERBVEVfUk9MRV9BVFRSSUJVVEUiLCJrZXkiLCJ2YWx1ZSIsInNldElzRmlyc3QiLCJnZXRfbGlzdCIsImdldEdldEdpZnRMaXN0IiwiaXRlbV9zdGF0dXMiLCJ2aXBfbGV2IiwiZ2V0SXNGaXJzdCIsInNldFRpcHNWSVBTdHN0dXMiLCJWSVBSRURQT0lOVCIsIlZJUF9UQUIiLCJmaXJlIiwiVVBEQVRBX0lURU1fUkVEUE9JTlQiLCJyZV9saW5rX2dhbWVfZXZlbnQiLCJFVlRfUkVfTElOS19HQU1FIiwicmVnaXN0ZXJQcm90b2NhbHMiLCJSZWdpc3RlclByb3RvY2FsIiwiaGFuZGxlMTY3MDAiLCJoYW5kbGUxNjcxMCIsImhhbmRsZTE2NzExIiwiaGFuZGxlMTY3MTIiLCJoYW5kbGUxNjcxMyIsImhhbmRsZTIxMDA1IiwiaGFuZGxlMjEwMDYiLCJoYW5kbGUyNDUwMSIsImhhbmRsZTI0NTAyIiwiaGFuZGxlMTY3MDciLCJoYW5kbGUxNjcwOCIsImhhbmRsZTE2NzMwIiwiaGFuZGxlMTY3MzEiLCJoYW5kbGUyMTAyMCIsInNldFByaXZpbGVnZVJlZHBvaW50IiwiaW5kZXgiLCJzdGF0dXMiLCJnZXRQcml2aWxlZ2VSZWRwb2ludCIsInNlbmRlcjE2NzAwIiwiU2VuZFByb3RvY2FsIiwiZGF0YSIsIlVQREFURV9DSEFSR0VfTElTVCIsImxpc3QiLCJzZW5kZXIyMTAwNSIsIlRIUkVFX1JFQ0hBUkdFIiwic2VuZGVyMjEwMDYiLCJzZXREYWlseUdpZnREYXRhIiwiZmlyc3RfZ2lmdCIsIkRBSUxZX0dJRlRfSU5GTyIsInNlbmRlcjI0NTAxIiwiaWQiLCJwcm90b2NhbCIsIm1zZyIsIm1lc3NhZ2UiLCJzZW5kZXIyNDUwMiIsInNldFByaXZpbGVnZUxpc3QiLCJnZXRQcml2aWxlZ2VSZWRTdGF0dXMiLCJQUklWSUxFR0UiLCJQUklWSUxFR0VfSU5GTyIsInNlbmRlcjE2NzA3Iiwic2V0TW9udGhDYXJkIiwiTU9OVEhfQ0FSRCIsIlNVUFJFX0NBUkRfR0VUIiwic2VuZGVyMTY3MDgiLCJzZW5kZXIxNjcxMCIsInNldEdldEdpZnRMaXN0IiwiYmlkIiwicmVkcG9pbnQiLCJpIiwidiIsIk1haW51aUNvbnRyb2xsZXIiLCJNYWludWlDb25zdCIsInNldEZ1bmN0aW9uVGlwc1N0YXR1cyIsImljb24iLCJjaGFyZ2UiLCJzZW5kZXIxNjcxMSIsImxldiIsInNlbmRlcjE2NzEyIiwiY2hhcmdlX3N1bSIsInNldEFjY0xpc3QiLCJBQ0NfUkVDSEFSR0VfSU5GTyIsImdldENoYXJnZVN1bSIsInNlbmRlcjE2NzEzIiwic2VuZGVyMTY3MzAiLCJzZXRHaXZlVmlwSW5mbyIsInNldEdpdmVWaXBTdGF0dXMiLCJHSVZFX1ZJUF9VUERBVEUiLCJzZW5kZXIxNjczMSIsImNvZGUiLCJvcGVuVmlwQXdhcmRXaW5kb3ciLCJvcGVuVmlwTWFpbldpbmRvdyIsInN1Yl90eXBlIiwiY2FsbEZ1bmMiLCJJU19TSE9XX0NIQVJHRSIsIlV0aWxzIiwiVEkxOE4iLCJjaGFyZ2VfY2ZnIiwiZ2RhdGEiLCJ2YWwiLCJkZXNjIiwidmlwX3dpbmRvdyIsImNyZWF0ZUNsYXNzIiwib3BlbiIsImRlbGV0ZUNhbGxGdW5jIiwiY2xvc2UiLCJ2aXBfYXdhcmRfd2luZG93IiwiaXNPcGVuIiwiY2hhbmdlTWFpbldpbmRvd1RhYiIsImNoYW5nZVRhYlZpZXciLCJvbmVfZ2lmdCIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUEsY0FBYyxHQUFHQyxPQUFPLENBQUMsaUJBQUQsQ0FBNUI7O0FBQ0EsSUFBSUMsUUFBUSxHQUFHRCxPQUFPLENBQUMsV0FBRCxDQUF0Qjs7QUFFQSxJQUFJRSxhQUFhLEdBQUdDLEVBQUUsQ0FBQ0MsS0FBSCxDQUFTO0FBQ3pCLGFBQVNDLGNBRGdCO0FBRXpCQyxFQUFBQSxJQUFJLEVBQUUsZ0JBQVksQ0FDakIsQ0FId0I7QUFLekI7QUFDQUMsRUFBQUEsVUFBVSxFQUFFLHNCQUFZO0FBQ3BCLFFBQUlDLFFBQVEsR0FBR1IsT0FBTyxDQUFDLFdBQUQsQ0FBdEI7O0FBRUEsU0FBS1MsS0FBTCxHQUFhLElBQUlELFFBQUosRUFBYjtBQUNBLFNBQUtDLEtBQUwsQ0FBV0YsVUFBWDtBQUVBLFNBQUtHLG1CQUFMLEdBQTJCLEVBQTNCO0FBQ0EsU0FBS0Msc0JBQUwsR0FBOEIsRUFBOUIsQ0FQb0IsQ0FPYTs7QUFDakMsU0FBS0MsUUFBTCxHQUFnQixJQUFoQjtBQUNILEdBZndCO0FBaUJ6QjtBQUNBQyxFQUFBQSxRQUFRLEVBQUUsb0JBQVk7QUFDbEIsV0FBTyxLQUFLSixLQUFaO0FBQ0gsR0FwQndCO0FBc0J6QjtBQUNBSyxFQUFBQSxjQUFjLEVBQUUsMEJBQVk7QUFDeEIsUUFBSSxLQUFLQyxtQkFBTCxJQUE0QixJQUFoQyxFQUFzQztBQUNsQyxXQUFLQSxtQkFBTCxHQUEyQkMsS0FBSyxDQUFDQyxXQUFOLENBQWtCQyxJQUFsQixDQUF1QkMsT0FBTyxDQUFDQyx1QkFBL0IsRUFBd0QsWUFBWTtBQUMzRkosUUFBQUEsS0FB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a0JBQWxCLEVBQXFDLElBQXJDLENBQXhCO0FBQ0g7O0FBQ0QsVUFBRyxLQUFLSSxnQkFBTCxJQUF5QixLQUFLQSxnQkFBTCxDQUFzQkMsTUFBdEIsTUFBa0MsS0FBOUQsRUFBb0U7QUFDaEUsYUFBS0QsZ0JBQUwsQ0FBc0JILElBQXRCO0FBQ0g7QUFFSixLQVJELE1BUUs7QUFDRCxVQUFHLEtBQUtHLGdCQUFSLEVBQTRCO0FBQ3hCLGFBQUtBLGdCQUFMLENBQXNCRCxLQUF0QjtBQUNBLGFBQUtDLGdCQUFMLEdBQXdCLElBQXhCO0FBQ0g7QUFDSjtBQUNKLEdBeFV3QjtBQTBVekI7QUFDQUUsRUFBQUEsbUJBQW1CLEVBQUUsNkJBQVV4RSxLQUFWLEVBQWlCO0FBQ2xDLFFBQUksS0FBS2lFLFVBQVQsRUFBcUI7QUFDakIsV0FBS0EsVUFBTCxDQUFnQlEsYUFBaEIsQ0FBOEJ6RSxLQUE5QjtBQUNIO0FBQ0osR0EvVXdCO0FBaVZ6QkYsRUFBQUEsV0FqVnlCLHVCQWlWYk8sSUFqVmEsRUFpVlI7QUFDYixRQUFJSixNQUFNLEdBQUcsS0FBYjs7QUFDQSxRQUFHSSxJQUFJLENBQUNnRCxJQUFMLElBQWEsQ0FBaEIsRUFBa0I7QUFDZHBELE1BQUFBLE1BQU0sR0FBRyxJQUFUO0FBQ0g7O0FBQ0QsUUFBSWtDLGdCQUFnQixHQUFHOUYsT0FBTyxDQUFDLG1CQUFELENBQTlCOztBQUNBLFFBQUkrRixXQUFXLEdBQUcvRixPQUFPLENBQUMsY0FBRCxDQUF6Qjs7QUFDQThGLElBQUFBLGdCQUFnQixDQUFDdkUsV0FBakIsR0FBK0J5RSxxQkFBL0IsQ0FBcURELFdBQVcsQ0FBQ0UsSUFBWixDQUFpQm9DLFFBQXRFLEVBQWdGekUsTUFBaEY7QUFDSDtBQXpWd0IsQ0FBVCxDQUFwQjtBQTRWQTBFLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQnJJLGFBQWpCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAgIOi/memHjOWhq+WGmeivpue7huivtOaYjizkuLvopoHloavlhpnor6XmqKHlnZfnmoTlip/og73nroDopoFcbi8vIDxici8+Q3JlYXRlOiAyMDE5LTAyLTI2IDIxOjA3OjMyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIFJvbGVDb250cm9sbGVyID0gcmVxdWlyZShcInJvbGVfY29udHJvbGxlclwiKTtcbnZhciBWaXBFdmVudCA9IHJlcXVpcmUoXCJ2aXBfZXZlbnRcIik7XG5cbnZhciBWaXBDb250cm9sbGVyID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VDb250cm9sbGVyLFxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICB9LFxuXG4gICAgLy8g5Yid5aeL5YyW6YWN572u5pWw5o2uXG4gICAgaW5pdENvbmZpZzogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgVmlwTW9kZWwgPSByZXF1aXJlKFwidmlwX21vZGVsXCIpO1xuXG4gICAgICAgIHRoaXMubW9kZWwgPSBuZXcgVmlwTW9kZWwoKTtcbiAgICAgICAgdGhpcy5tb2RlbC5pbml0Q29uZmlnKCk7XG5cbiAgICAgICAgdGhpcy52aXBfcmVkcG9pbnRfc3RhdHVzID0ge307XG4gICAgICAgIHRoaXMudmlwX3ByaXZpbGVnZV9yZWRwb2ludCA9IHt9Oy8vdmlw54m55p2DIGl0ZW0g57qi54K5XG4gICAgICAgIHRoaXMuaXNfZmlyc3QgPSB0cnVlO1xuICAgIH0sXG5cbiAgICAvLyDov5Tlm57lvZPliY3nmoRtb2RlbFxuICAgIGdldE1vZGVsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsO1xuICAgIH0sXG5cbiAgICAvLyDms6jlhoznm5HlkKzkuovku7ZcbiAgICByZWdpc3RlckV2ZW50czogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5sb2dpbl9ldmVudF9zdWNjZXNzID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMubG9naW5fZXZlbnRfc3VjY2VzcyA9IGdjb3JlLkdsb2JhbEV2ZW50LmJpbmQoRXZlbnRJZC5FVlRfUk9MRV9DUkVBVEVfU1VDQ0VTUywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LnVuYmluZCh0aGlzLmxvZ2luX2V2ZW50X3N1Y2Nlc3MpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9naW5fZXZlbnRfc3VjY2VzcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5yb2xlX3ZvID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yb2xlX3ZvKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvbGVfYXNzZXRzX2V2ZW50ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm9sZV9hc3NldHNfZXZlbnQgPSB0aGlzLnJvbGVfdm8uYmluZChFdmVudElkLlVQREFURV9ST0xFX0FUVFJJQlVURSwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09IFwidmlwX2xldlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0SXNGaXJzdCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdldF9saXN0ID0gdGhpcy5tb2RlbC5nZXRHZXRHaWZ0TGlzdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbV9zdGF0dXMgPSAoZ2V0X2xpc3RbdGhpcy5yb2xlX3ZvLnZpcF9sZXZdID09IG51bGwpICYmIHRoaXMuZ2V0SXNGaXJzdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRpcHNWSVBTdHN0dXMoVklQUkVEUE9JTlQuVklQX1RBQiwgaXRlbV9zdGF0dXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKFZpcEV2ZW50LlVQREFUQV9JVEVNX1JFRFBPSU5UKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB0aGlzLnNlbmRlcjE2NzA3KCkgLy/mnIjljaHpooblj5ZcbiAgICAgICAgICAgICAgICAvLyB0aGlzLnNlbmRlcjE2NzEwKCkgLy9WSVDnpLzljIXnuqLngrnnlKhcbiAgICAgICAgICAgICAgICAvLyB0aGlzLnNlbmRlcjE2NzEyKCkgLy/ntK/lhYXnuqLngrlcbiAgICAgICAgICAgICAgICAvLyB0aGlzLnNlbmRlcjIxMDA2KCkgLy/mr4/ml6XnpLzljIVcbiAgICAgICAgICAgICAgICAvLyB0aGlzLnNlbmRlcjI0NTAyKCkgLy/nibnmnYPnpLzljIVcbiAgICAgICAgICAgIH0sIHRoaXMpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5yZV9saW5rX2dhbWVfZXZlbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5yZV9saW5rX2dhbWVfZXZlbnQgPSBnY29yZS5HbG9iYWxFdmVudC5iaW5kKEV2ZW50SWQuRVZUX1JFX0xJTktfR0FNRSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMuc2VuZGVyMjEwMDYoKTtcbiAgICAgICAgICAgIH0sIHRoaXMpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM5Y2P6K6u5o6l5Y+X5LqL5Lu2XG4gICAgcmVnaXN0ZXJQcm90b2NhbHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDE2NzAwLCB0aGlzLmhhbmRsZTE2NzAwKSAvL+iOt+WPluWFheWAvOWIl+ihqOS/oeaBr1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTY3MTAsIHRoaXMuaGFuZGxlMTY3MTApIC8vVklQ56S85YyF6aKG5Y+W5L+h5oGvXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxNjcxMSwgdGhpcy5oYW5kbGUxNjcxMSkgLy9WSVDnrYnnuqflpZblirHpooblj5ZcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDE2NzEyLCB0aGlzLmhhbmRsZTE2NzEyKSAvL+iOt+WPluawuOS5hee0r+WFheS/oeaBr1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTY3MTMsIHRoaXMuaGFuZGxlMTY3MTMpIC8v6aKG5Y+W57Sv5YWF5aWW5YqxXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMTAwNSwgdGhpcy5oYW5kbGUyMTAwNSkgLy/kuInlgI3ov5TliKnkv6Hmga9cbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIxMDA2LCB0aGlzLmhhbmRsZTIxMDA2KSAvL+avj+aXpeekvOWMheaVsOaNrlxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjQ1MDEsIHRoaXMuaGFuZGxlMjQ1MDEpIC8v6LSt5LmwVklQ54m55p2D56S85YyFXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyNDUwMiwgdGhpcy5oYW5kbGUyNDUwMikgLy9WSVDnibnmnYPnpLzljIXmlbDmja5cblxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTY3MDcsIHRoaXMuaGFuZGxlMTY3MDcpXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxNjcwOCwgdGhpcy5oYW5kbGUxNjcwOClcbiAgICAgICAgXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxNjczMCwgdGhpcy5oYW5kbGUxNjczMCk7XG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxNjczMSwgdGhpcy5oYW5kbGUxNjczMSk7XG4gICAgICBcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIxMDIwLCB0aGlzLmhhbmRsZTIxMDIwKTsvL+avj+aXpeS4gOWFg+e6oueCuVxuICAgIH0sXG5cbiAgICBzZXRQcml2aWxlZ2VSZWRwb2ludDogZnVuY3Rpb24gKGluZGV4LCBzdGF0dXMpIHtcbiAgICAgICAgdGhpcy52aXBfcHJpdmlsZWdlX3JlZHBvaW50W2luZGV4XSA9IHN0YXR1cztcbiAgICB9LFxuXG4gICAgZ2V0UHJpdmlsZWdlUmVkcG9pbnQ6IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy52aXBfcHJpdmlsZWdlX3JlZHBvaW50W2luZGV4XTtcbiAgICAgICAgcmV0dXJuIHN0YXR1c1xuICAgIH0sXG5cbiAgICBnZXRJc0ZpcnN0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzX2ZpcnN0XG4gICAgfSxcblxuICAgIHNldElzRmlyc3Q6IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgICAgICAgdGhpcy5pc19maXJzdCA9IHN0YXR1c1xuICAgIH0sXG5cbiAgICAvL+iOt+WPluWFheWAvOWIl+ihqOS/oeaBr1xuICAgIHNlbmRlcjE2NzAwOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDE2NzAwLCB7fSlcbiAgICB9LFxuXG4gICAgaGFuZGxlMTY3MDA6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoVmlwRXZlbnQuVVBEQVRFX0NIQVJHRV9MSVNULCBkYXRhLmxpc3QpO1xuICAgIH0sXG5cbiAgICAvL+S4ieWAjei/lOWIqeS/oeaBr1xuICAgIHNlbmRlcjIxMDA1OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDIxMDA1LCB7fSlcbiAgICB9LFxuXG4gICAgaGFuZGxlMjEwMDU6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoVmlwRXZlbnQuVEhSRUVfUkVDSEFSR0UsIGRhdGEpO1xuICAgIH0sXG5cbiAgICAvL+ivt+axguavj+asoeekvOWMheaVsOaNrlxuICAgIHNlbmRlcjIxMDA2OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDIxMDA2LCB7fSlcbiAgICB9LFxuXG4gICAgaGFuZGxlMjEwMDY6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNldERhaWx5R2lmdERhdGEoZGF0YS5maXJzdF9naWZ0KTtcbiAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoVmlwRXZlbnQuREFJTFlfR0lGVF9JTkZPKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+ivt+axgui0reS5sFZJUOeJueadg+ekvOWMhVxuICAgIHNlbmRlcjI0NTAxOiBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLmlkID0gaWQ7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDI0NTAxLCBwcm90b2NhbCk7XG4gICAgfSxcblxuICAgIGhhbmRsZTI0NTAxOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5tc2cpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v6K+35rGCVklQ54m55p2D56S85YyF5pWw5o2uXG4gICAgc2VuZGVyMjQ1MDI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjQ1MDIsIHt9KTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMjQ1MDI6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNldFByaXZpbGVnZUxpc3QoZGF0YS5saXN0KTtcbiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLm1vZGVsLmdldFByaXZpbGVnZVJlZFN0YXR1cygpO1xuICAgICAgICAgICAgdGhpcy5zZXRUaXBzVklQU3RzdHVzKFZJUFJFRFBPSU5ULlBSSVZJTEVHRSwgc3RhdHVzKTtcbiAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoVmlwRXZlbnQuUFJJVklMRUdFX0lORk8pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vVklQ55WM6Z2i5pyI5Y2h6aKG5Y+WXG4gICAgc2VuZGVyMTY3MDc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTY3MDcsIHt9KTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMTY3MDc6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHZhciBzdGF0dXMgPSBmYWxzZTtcbiAgICAgICAgaWYgKGRhdGEuc3RhdHVzID09IDEpIHtcbiAgICAgICAgICAgIHN0YXR1cyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tb2RlbC5zZXRNb250aENhcmQoZGF0YS5zdGF0dXMpO1xuICAgICAgICB0aGlzLnNldFRpcHNWSVBTdHN0dXMoVklQUkVEUE9JTlQuTU9OVEhfQ0FSRCwgc3RhdHVzKTtcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShWaXBFdmVudC5TVVBSRV9DQVJEX0dFVCwgZGF0YS5zdGF0dXMpO1xuICAgIH0sXG5cbiAgICBzZW5kZXIxNjcwODogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxNjcwOCwge30pO1xuICAgIH0sXG5cbiAgICBoYW5kbGUxNjcwODogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZylcbiAgICB9LFxuXG4gICAgLy9WSVDnpLzljIXpooblj5bkv6Hmga9cbiAgICBzZW5kZXIxNjcxMDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxNjcxMCwge30pO1xuICAgIH0sXG5cbiAgICBoYW5kbGUxNjcxMDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdGhpcy5tb2RlbC5zZXRHZXRHaWZ0TGlzdChkYXRhLmxpc3QpO1xuICAgICAgICBpZiAodGhpcy5yb2xlX3ZvID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucm9sZV92byA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGdldF9saXN0ID0gdGhpcy5tb2RlbC5nZXRHZXRHaWZ0TGlzdCgpO1xuICAgICAgICB2YXIgaXRlbV9zdGF0dXMgPSAoZ2V0X2xpc3RbdGhpcy5yb2xlX3ZvLnZpcF9sZXZdID09IG51bGwpICYmIHRoaXMuZ2V0SXNGaXJzdCgpO1xuICAgICAgICB0aGlzLnNldFRpcHNWSVBTdHN0dXMoVklQUkVEUE9JTlQuVklQX1RBQiwgaXRlbV9zdGF0dXMpO1xuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKFZpcEV2ZW50LlVQREFUQV9JVEVNX1JFRFBPSU5UKVxuICAgIH0sXG5cbiAgICAvL+e6oueCuVxuICAgIHNldFRpcHNWSVBTdHN0dXM6IGZ1bmN0aW9uIChiaWQsIHN0YXR1cykge1xuICAgICAgICB0aGlzLnZpcF9yZWRwb2ludF9zdGF0dXNbYmlkXSA9IHN0YXR1c1xuICAgICAgICBsZXQgcmVkcG9pbnQgPSBmYWxzZVxuICAgICAgICBmb3IgKGxldCBpIGluIHRoaXMudmlwX3JlZHBvaW50X3N0YXR1cykge1xuICAgICAgICAgICAgbGV0IHYgPSB0aGlzLnZpcF9yZWRwb2ludF9zdGF0dXNbaV1cbiAgICAgICAgICAgIGlmICh2ID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICByZWRwb2ludCA9IHRydWVcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBNYWludWlDb250cm9sbGVyID0gcmVxdWlyZShcIm1haW51aV9jb250cm9sbGVyXCIpXG4gICAgICAgIHZhciBNYWludWlDb25zdCA9IHJlcXVpcmUoXCJtYWludWlfY29uc3RcIilcbiAgICAgICAgTWFpbnVpQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNldEZ1bmN0aW9uVGlwc1N0YXR1cyhNYWludWlDb25zdC5pY29uLmNoYXJnZSwgcmVkcG9pbnQpXG4gICAgfSxcblxuICAgIC8vVklQ562J57qn5aWW5Yqx6aKG5Y+WXG4gICAgc2VuZGVyMTY3MTE6IGZ1bmN0aW9uIChsZXYpIHtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLmxldiA9IGxldjtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTY3MTEsIHByb3RvY2FsKTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMTY3MTE6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpXG4gICAgfSxcblxuICAgIC8v57Sv5YWF5aWW5Yqx5L+h5oGvXG4gICAgc2VuZGVyMTY3MTI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTY3MTIsIHt9KTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMTY3MTI6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHRoaXMuY2hhcmdlX3N1bSA9IGRhdGEuY2hhcmdlX3N1bSAvL+W9k+WJjeaAu+WFheWAvOaVsFxuICAgICAgICB0aGlzLm1vZGVsLnNldEFjY0xpc3QoZGF0YS5saXN0KTtcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShWaXBFdmVudC5BQ0NfUkVDSEFSR0VfSU5GTywgZGF0YSk7XG4gICAgfSxcblxuICAgIGdldENoYXJnZVN1bTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGFyZ2Vfc3VtIHx8IDA7XG4gICAgfSxcblxuICAgIC8v6aKG5Y+W57Sv5YWF5aWW5YqxXG4gICAgc2VuZGVyMTY3MTM6IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICB2YXIgcHJvdG9jYWwgPSB7fTtcbiAgICAgICAgcHJvdG9jYWwuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTY3MTMsIHByb3RvY2FsKTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMTY3MTM6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpO1xuICAgIH0sXG5cbiAgICAvL1xuICAgIHNlbmRlcjE2NzMwOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9O1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxNjczMCwgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICAvLyB0aW1lXG4gICAgLy8gc3RhdGVcbiAgICBoYW5kbGUxNjczMDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdGhpcy5tb2RlbC5zZXRHaXZlVmlwSW5mbyhkYXRhKTtcbiAgICAgICAgdGhpcy5tb2RlbC5zZXRHaXZlVmlwU3RhdHVzKCk7XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoVmlwRXZlbnQuR0lWRV9WSVBfVVBEQVRFKTtcbiAgICB9LFxuXG4gICAgLy9cbiAgICBzZW5kZXIxNjczMTogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcHJvdG9jYWwgPSB7fTtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTY3MzEsIHByb3RvY2FsKTtcbiAgICB9LFxuXG4gICAgLy/pooblj5Z2aXBcbiAgICBoYW5kbGUxNjczMTogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZyk7XG4gICAgICAgIGlmKGRhdGEuY29kZSA9PSAxKXtcbiAgICAgICAgICAgIHRoaXMub3BlblZpcEF3YXJkV2luZG93KCk7XG4gICAgICAgICAgICB0aGlzLnNlbmRlcjE2NzMwKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy9pbmRleOaYr+Wkp+agh+etvumhtSBWSVBUQUJDT05TVFxuICAgIC8vc3ViX3R5cGXmmK92aXDnibnmnYPnlYzpnaLnmoQg6KaB6Lez5ZOq5Liq562J57qn5bCx5Lyg5ZOq5Liq562J57qnXG4gICAgb3BlblZpcE1haW5XaW5kb3c6IGZ1bmN0aW9uIChzdGF0dXMsIGluZGV4LCBzdWJfdHlwZSAsY2FsbEZ1bmMpIHtcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKElTX1NIT1dfQ0hBUkdFID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZShVdGlscy5USTE4TihcIuWKn+iDveaaguacquW8gOaUvu+8jOaVrOivt+acn+W+hVwiKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBjaGFyZ2VfY2ZnID0gZ2RhdGEoXCJjaGFyZ2VfZGF0YVwiLCBcImRhdGFfY29uc3RhbnRcIiwgW1wib3Blbl9sdlwiXSk7XG4gICAgICAgICAgICBpZiAoY2hhcmdlX2NmZykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvbGVfdm8gJiYgdGhpcy5yb2xlX3ZvLmxldiA8IGNoYXJnZV9jZmcudmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UoY2hhcmdlX2NmZy5kZXNjKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMudmlwX3dpbmRvdykge1xuICAgICAgICAgICAgICAgIHRoaXMudmlwX3dpbmRvdyA9IFV0aWxzLmNyZWF0ZUNsYXNzKFwidmlwX21haW5fd2luZG93XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5kZXggPSBpbmRleCB8fCAxO1xuICAgICAgICAgICAgaWYgKHRoaXMudmlwX3dpbmRvdykge1xuICAgICAgICAgICAgICAgIHRoaXMudmlwX3dpbmRvdy5vcGVuKGluZGV4LCBzdWJfdHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihjYWxsRnVuYyl7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVDYWxsRnVuYyA9IGNhbGxGdW5jXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy52aXBfd2luZG93KSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aXBfd2luZG93LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy52aXBfd2luZG93ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZih0aGlzLmRlbGV0ZUNhbGxGdW5jKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxldGVDYWxsRnVuYygpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlQ2FsbEZ1bmMgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDmiZPlvIDlpZblirFWSVDnlYzpnaJcbiAgICBvcGVuVmlwQXdhcmRXaW5kb3c6ZnVuY3Rpb24oc3RhdHVzKXtcbiAgICAgICAgaWYoc3RhdHVzID09IHRydWUpe1xuICAgICAgICAgICAgaWYoIXRoaXMudmlwX2F3YXJkX3dpbmRvdyl7XG4gICAgICAgICAgICAgICAgdGhpcy52aXBfYXdhcmRfd2luZG93ID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJ2aXBfYXdhcmRfd2luZG93XCIsdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZih0aGlzLnZpcF9hd2FyZF93aW5kb3cgJiYgdGhpcy52aXBfYXdhcmRfd2luZG93LmlzT3BlbigpID09IGZhbHNlKXtcbiAgICAgICAgICAgICAgICB0aGlzLnZpcF9hd2FyZF93aW5kb3cub3BlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgaWYodGhpcy52aXBfYXdhcmRfd2luZG93KSAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpcF9hd2FyZF93aW5kb3cuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnZpcF9hd2FyZF93aW5kb3cgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5YiH5o2idmlw6Z2i5p2/55qE5qCH562+6aG1XG4gICAgY2hhbmdlTWFpbldpbmRvd1RhYjogZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLnZpcF93aW5kb3cpIHtcbiAgICAgICAgICAgIHRoaXMudmlwX3dpbmRvdy5jaGFuZ2VUYWJWaWV3KGluZGV4KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBoYW5kbGUyMTAyMChkYXRhKXtcbiAgICAgICAgdmFyIHN0YXR1cyA9IGZhbHNlO1xuICAgICAgICBpZihkYXRhLmNvZGUgPT0gMSl7XG4gICAgICAgICAgICBzdGF0dXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBNYWludWlDb250cm9sbGVyID0gcmVxdWlyZShcIm1haW51aV9jb250cm9sbGVyXCIpXG4gICAgICAgIHZhciBNYWludWlDb25zdCA9IHJlcXVpcmUoXCJtYWludWlfY29uc3RcIilcbiAgICAgICAgTWFpbnVpQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNldEZ1bmN0aW9uVGlwc1N0YXR1cyhNYWludWlDb25zdC5pY29uLm9uZV9naWZ0LCBzdGF0dXMpXG4gICAgfSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZpcENvbnRyb2xsZXI7Il19