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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/friend/friend_model.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, '46debPOR8hE1ZazERYrrLAe', 'friend_model');
// Scripts/mod/friend/friend_model.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//      这里填写详细说明,主要填写该模块的功能简要
// <br/>Create: 2018-12-24 16:41:34
// --------------------------------------------------------------------
var FriendController = require("friend_controller");
 
var FriendVo = require("friend_vo");
 
var FriendEvent = require("friend_event");
 
var FriendModel = cc.Class({
  "extends": BaseClass,
  ctor: function ctor() {
    this.ctrl = FriendController.getInstance();
    this.initConfig();
  },
  properties: {},
  initConfig: function initConfig() {
    this.list = {}; // 好友列表
 
    this.apply = []; // 好友申请列表
 
    this.plist = {};
    this.onlinelist = {};
    this.blacklist = []; // 黑名单列表
 
    this.honey_list_count = 20; //最近联系人限制
 
    this.last_select_group = 1; //最后选择的分组(默认选择第一个分组)
 
    this.last_select_friend_srv_id = null;
    this.last_select_friend_rid = null;
    this.present_count = 0; //当天可以赠送好友体力剩余次数
 
    this.draw_count = 0; //当天可以领取好友体力剩余次数
 
    this.draw_total_count = 0; //当天可以领取好友体力总次数
 
    this.last_select_index = 1; //默认上次选中的序号
  },
  //添加数据
  add: function add(val) {
    if (this.list[val.srv_id + "_" + val.rid] == null) this.list[val.srv_id + "_" + val.rid] = val;
  },
  addPchat: function addPchat(val) {
    if (this.plist[val.srv_id + "_" + val.rid] == null) this.plist[val.srv_id + "_" + val.rid] = val;
  },
  getOnlineFriendList: function getOnlineFriendList() {
    var online_list = [];
 
    for (var k in this.list) {
      var v = this.list[k];
 
      if (v && v.is_online == 1) {
        //在线
        online_list.push(v);
      }
    }
 
    return online_list;
  },
  getFriendInfo: function getFriendInfo(srv_id, rid) {
    var friend_i = srv_id + "_" + rid;
    return this.list[friend_i];
  },
  //申请列表
  setApplyList: function setApplyList(list) {
    var arr = [];
 
    for (var i in list) {
      var v = list[i];
 
      if (v) {
        arr.push(v);
      }
    }
 
    this.apply = arr;
    gcore.Timer.set(function () {
      gcore.GlobalEvent.fire(FriendEvent.Update_Red_Point);
    }, 1000, -1);
  },
  getApplyList: function getApplyList() {
    return this.apply || [];
  },
  getApplyNum: function getApplyNum() {
    return this.apply.length;
  },
  //删除数据
  del: function del(srv_id, rid) {
    if (this.list[srv_id + "_" + rid] != null) this.list[srv_id + "_" + rid] = null; // this.list.splice(srv_id + "_" + rid,1)
  },
  //更新单个数据
  updateVo: function updateVo(srv_id, rid, key, value) {
    var vo = this.list[srv_id + "_" + rid];
 
    if (vo != null) {
      vo.update(key, value);
    }
 
    return vo;
  },
  //红点判断,要显示出可领取的数量,跟申请列表的数量
  getAwardNum: function getAwardNum() {
    var num = 0;
 
    for (var i in this.list) {
      var v = this.list[i];
 
      if (v && v.is_draw == 1) {
        num = num + 1;
      }
    }
 
    return num;
  },
  updateSingleFriendData: function updateSingleFriendData(srv_id, rid, data) {
    var key = srv_id + "_" + rid;
    if (this.list[key]) this.list[key].setData(data);
  },
  //获取单个数据
  getVo: function getVo(srv_id, rid) {
    return this.list[srv_id + "_" + rid];
  },
  //转化为数组
  getArray: function getArray() {
    var array = new Array();
 
    for (var k in this.list) {
      if (this.list[k]) {
        array.push(this.list[k]);
      }
    }
 
    array.sort(Utils.tableUpperSorter(["is_online", "lev", "power"]));
    return array;
  },
  //获取跨服/同服好友数据
  getGroupList: function getGroupList(name) {
    var array = new Array();
 
    for (var k in this.list) {
      var v = this.list[k];
 
      if (v.is_cross == 1 && name == "cross") {
        array.push(v);
      } else if (v.is_cross == 0 && name == "alike") {
        array.push(v);
      }
    }
 
    array.sort(Utils.tableUpperSorter(["is_online", "lev"]));
    return array;
  },
  //获取跨服/同服好友在线数和总数
  getGroupOnlineAndTotal: function getGroupOnlineAndTotal(group_name) {
    var online_num = 0;
    var total_num = 0;
    var group_data = this.getGroupList(group_name);
    var len = group_data.GetSize();
    total_num = len;
 
    for (var i = 1; i <= len; i++) {
      var friend_vo = group_data.Get(i - 1);
 
      if (friend_vo.srv_id && friend_vo.rid && friend_vo.is_online == 1) {
        online_num = online_num + 1;
      }
    }
 
    return {
      online_num: online_num,
      total_num: total_num
    };
  },
  //获取所有好友在线和总数量
  getFriendOnlineAndTotal: function getFriendOnlineAndTotal() {
    var online_num = 0;
    var total_num = 0;
 
    if (this.list) {
      for (var k in this.list) {
        var friend_vo = this.list[k];
 
        if (friend_vo && friend_vo.srv_id && friend_vo.rid && friend_vo.is_online == 1) {
          online_num = online_num + 1;
        }
 
        if (friend_vo) total_num = total_num + 1;
      }
    }
 
    return {
      online_num: online_num,
      total_num: total_num
    };
  },
  //获取最近联系人在线数和总数
  getHoneyListOnlineAndTotal: function getHoneyListOnlineAndTotal(is_require) {
    var total_num = 0;
    var online_num = 0;
    var honeyList = this.getHoneyList(is_require);
    var len = honeyList.GetSize();
    total_num = len;
 
    for (var i = 1; i <= len; i++) {
      var item = honeyList.Get(i - 1);
 
      if (item.srv_id && item.rid && item.is_online == 1) {
        online_num = online_num + 1;
      }
    }
 
    return {
      online_num: online_num,
      total_num: total_num
    };
  },
  //获取黑名单在线数和总数
  getBlackListOnlineAndTotal: function getBlackListOnlineAndTotal() {
    var total_num = 0;
    var online_num = 0;
 
    for (var k in this.blacklist) {
      var v = this.blacklist[k];
 
      if (v != null && v.is_online != null && v.is_online == 1) {
        online_num = online_num + 1;
      }
 
      total_num = total_num + 1;
    }
 
    return {
      online_num: online_num,
      total_num: total_num
    };
  },
  //获取索引
  getIndex: function getIndex(srv_id, rid) {
    var array = this.getArray();
 
    for (var i = 0; i < array.length; i++) {
      var vo = array[i];
 
      if (vo.srv_id == srv_id && vo.rid == rid) {
        return i;
      }
    }
 
    return null;
  },
  isFriend: function isFriend(srv_id, rid) {
    if (srv_id == null || rid == null) {
      return false;
    }
 
    var vo = this.list[srv_id + "_" + rid];
    if (vo && vo.is_moshengren == 0) return true;
    return false;
  },
  isFriend2: function isFriend2(key) {
    var vo = this.list[key];
    if (vo && vo.is_moshengren == 0) return true;
    return false;
  },
  //保存非好友联系人的在线数据
  setOnlineData: function setOnlineData(key) {
    this.onlinelist = [];
 
    for (var i in list) {
      var vo = list[i];
      var key = vo.srv_id + "+" + vo.id;
      this.onlinelist[key] = 1;
    }
  },
  getOnlineData: function getOnlineData(key) {
    if (this.onlinelist[key]) return 1;else return 0;
  },
  setOnlineKey: function setOnlineKey(key) {
    this.onlinelist[key] = 1;
  },
  setFriendPresentCount: function setFriendPresentCount(count) {
    this.present_count = count;
  },
  getFriendPresentCount: function getFriendPresentCount() {
    return this.present_count;
  },
  setFriendDrawCount: function setFriendDrawCount(count) {
    this.draw_count = count;
  },
  getFriendDrawCount: function getFriendDrawCount() {
    return this.draw_count;
  },
  setFriendDrawTotalCount: function setFriendDrawTotalCount(total) {
    this.draw_total_count = total;
  },
  getFriendDrawTotalCount: function getFriendDrawTotalCount() {
    return this.draw_total_count;
  },
  //-------------------黑名单模块数据:
  //初始化
  initBlackList: function initBlackList(list, is_add) {
    for (var k in list) {
      var vo = new FriendVo();
      var v = list[k];
      vo.setData(v);
      this.blacklist[v.rid + "_" + v.srv_id] = vo;
    }
  },
  //移除黑名单
  removeBlack: function removeBlack(rid, srv_id) {
    if (rid && srv_id) delete this.blacklist[rid + "_" + srv_id];
  },
  //黑名单数组
  getBlackArray: function getBlackArray() {
    var array = new Array();
 
    for (var k in this.blacklist) {
      array.push(this.blacklist[k]);
    }
 
    array.sort(Utils.tableUpperSorter(["is_online", "lev", "power"]));
    return array;
  },
  //是否在黑名单里面
  isBlack: function isBlack(rid, srv_id) {
    var isIn = false;
 
    if (rid && srv_id && this.blacklist[rid + "_" + srv_id]) {
      isIn = true;
    }
 
    return isIn;
  },
  setLastSelectGroup: function setLastSelectGroup(value) {
    this.last_select_group = value;
  },
  getLastSelectGroup: function getLastSelectGroup() {
    return this.last_select_group;
  },
  setLastSelectFriend: function setLastSelectFriend(srv_id, rid) {
    this.last_select_friend_srv_id = srv_id;
    this.last_select_friend_rid = rid;
  },
  setLastSelectFriendIndex: function setLastSelectFriendIndex(index) {
    this.last_select_index = index || 1;
  },
  getLastSelectFriendIndex: function getLastSelectFriendIndex() {
    return this.last_select_index;
  },
  getLastSelectFriend: function getLastSelectFriend() {
    return this.last_select_friend_srv_id, this.last_select_friend_rid;
  },
  __delete: function __delete() {}
});
module.exports = FriendModel;
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxmcmllbmRcXGZyaWVuZF9tb2RlbC5qcyJdLCJuYW1lcyI6WyJGcmllbmRDb250cm9sbGVyIiwicmVxdWlyZSIsIkZyaWVuZFZvIiwiRnJpZW5kRXZlbnQiLCJGcmllbmRNb2RlbCIsImNjIiwiQ2xhc3MiLCJCYXNlQ2xhc3MiLCJjdG9yIiwiY3RybCIsImdldEluc3RhbmNlIiwiaW5pdENvbmZpZyIsInByb3BlcnRpZXMiLCJsaXN0IiwiYXBwbHkiLCJwbGlzdCIsIm9ubGluZWxpc3QiLCJibGFja2xpc3QiLCJob25leV9saXN0X2NvdW50IiwibGFzdF9zZWxlY3RfZ3JvdXAiLCJsYXN0X3NlbGVjdF9mcmllbmRfc3J2X2lkIiwibGFzdF9zZWxlY3RfZnJpZW5kX3JpZCIsInByZXNlbnRfY291bnQiLCJkcmF3X2NvdW50IiwiZHJhd190b3RhbF9jb3VudCIsImxhc3Rfc2VsZWN0X2luZGV4IiwiYWRkIiwidmFsIiwic3J2X2lkIiwicmlkIiwiYWRkUGNoYXQiLCJnZXRPbmxpbmVGcmllbmRMaXN0Iiwib25saW5lX2xpc3QiLCJrIiwidiIsImlzX29ubGluZSIsInB1c2giLCJnZXRGcmllbmRJbmZvIiwiZnJpZW5kX2kiLCJzZXRBcHBseUxpc3QiLCJhcnIiLCJpIiwiZ2NvcmUiLCJUaW1lciIsInNldCIsIkdsb2JhbEV2ZW50IiwiZmlyZSIsIlVwZGF0ZV9SZWRfUG9pbnQiLCJnZXRBcHBseUxpc3QiLCJnZXRBcHBseU51bSIsImxlbmd0aCIsImRlbCIsInVwZGF0ZVZvIiwia2V5IiwidmFsdWUiLCJ2byIsInVwZGF0ZSIsImdldEF3YXJkTnVtIiwibnVtIiwiaXNfZHJhdyIsInVwZGF0ZVNpbmdsZUZyaWVuZERhdGEiLCJkYXRhIiwic2V0RGF0YSIsImdldFZvIiwiZ2V0QXJyYXkiLCJhcnJheSIsIkFycmF5Iiwic29ydCIsIlV0aWxzIiwidGFibGVVcHBlclNvcnRlciIsImdldEdyb3VwTGlzdCIsIm5hbWUiLCJpc19jcm9zcyIsImdldEdyb3VwT25saW5lQW5kVG90YWwiLCJncm91cF9uYW1lIiwib25saW5lX251bSIsInRvdGFsX251bSIsImdyb3VwX2RhdGEiLCJsZW4iLCJHZXRTaXplIiwiZnJpZW5kX3ZvIiwiR2V0IiwiZ2V0RnJpZW5kT25saW5lQW5kVG90YWwiLCJnZXRIb25leUxpc3RPbmxpbmVBbmRUb3RhbCIsImlzX3JlcXVpcmUiLCJob25leUxpc3QiLCJnZXRIb25leUxpc3QiLCJpdGVtIiwiZ2V0QmxhY2tMaXN0T25saW5lQW5kVG90YWwiLCJnZXRJbmRleCIsImlzRnJpZW5kIiwiaXNfbW9zaGVuZ3JlbiIsImlzRnJpZW5kMiIsInNldE9ubGluZURhdGEiLCJpZCIsImdldE9ubGluZURhdGEiLCJzZXRPbmxpbmVLZXkiLCJzZXRGcmllbmRQcmVzZW50Q291bnQiLCJjb3VudCIsImdldEZyaWVuZFByZXNlbnRDb3VudCIsInNldEZyaWVuZERyYXdDb3VudCIsImdldEZyaWVuZERyYXdDb3VudCIsInNldEZyaWVuZERyYXdUb3RhbENvdW50IiwidG90YWwiLCJnZXRGcmllbmREcmF3VG90YWxDb3VudCIsImluaXRCbGFja0xpc3QiLCJpc19hZGQiLCJyZW1vdmVCbGFjayIsImdldEJsYWNrQXJyYXkiLCJpc0JsYWNrIiwiaXNJbiIsInNldExhc3RTZWxlY3RHcm91cCIsImdldExhc3RTZWxlY3RHcm91cCIsInNldExhc3RTZWxlY3RGcmllbmQiLCJzZXRMYXN0U2VsZWN0RnJpZW5kSW5kZXgiLCJpbmRleCIsImdldExhc3RTZWxlY3RGcmllbmRJbmRleCIsImdldExhc3RTZWxlY3RGcmllbmQiLCJfX2RlbGV0ZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsSUFBSUEsZ0JBQWdCLEdBQUdDLE9BQU8sQ0FBQyxtQkFBRCxDQUE5Qjs7QUFDQSxJQUFJQyxRQUFRLEdBQUdELE9BQU8sQ0FBQyxX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QUFDbEMsV0FBTyxLQUFLM0YsaUJBQVo7QUFDSCxHQWpWc0I7QUFtVnZCNEYsRUFBQUEsbUJBQW1CLEVBQUUsK0JBQVk7QUFDN0IsV0FBTyxLQUFLakcseUJBQUwsRUFBZ0MsS0FBS0Msc0JBQTVDO0FBQ0gsR0FyVnNCO0FBdVZ2QmlHLEVBQUFBLFFBQVEsRUFBRSxvQkFBWSxDQUVyQjtBQXpWc0IsQ0FBVCxDQUFsQjtBQTRWQUMsTUFBTSxDQUFDQyxPQUFQLEdBQWlCcEgsV0FBakIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBAYXV0aG9yOiB4eHhAc3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcbi8vIEBkZXNjcmlwdGlvbjpcbi8vICAgICAg6L+Z6YeM5aGr5YaZ6K+m57uG6K+05piOLOS4u+imgeWhq+WGmeivpeaooeWdl+eahOWKn+iDveeugOimgVxuLy8gPGJyLz5DcmVhdGU6IDIwMTgtMTItMjQgMTY6NDE6MzRcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnZhciBGcmllbmRDb250cm9sbGVyID0gcmVxdWlyZShcImZyaWVuZF9jb250cm9sbGVyXCIpO1xudmFyIEZyaWVuZFZvID0gcmVxdWlyZShcImZyaWVuZF92b1wiKTtcbnZhciBGcmllbmRFdmVudCA9IHJlcXVpcmUoXCJmcmllbmRfZXZlbnRcIilcblxudmFyIEZyaWVuZE1vZGVsID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VDbGFzcyxcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY3RybCA9IEZyaWVuZENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgdGhpcy5pbml0Q29uZmlnKCk7XG4gICAgfSxcblxuICAgIHByb3BlcnRpZXM6IHtcbiAgICB9LFxuXG4gICAgaW5pdENvbmZpZzogZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIHRoaXMubGlzdCA9IHt9XHRcdFx0ICAgICAgICAgICAgLy8g5aW95Y+L5YiX6KGoXG4gICAgICAgIHRoaXMuYXBwbHkgPSBbXVx0XHRcdCAgICAgICAgICAgIC8vIOWlveWPi+eUs+ivt+WIl+ihqFxuICAgICAgICB0aGlzLnBsaXN0ID0ge31cbiAgICAgICAgdGhpcy5vbmxpbmVsaXN0ID0ge31cbiAgICAgICAgdGhpcy5ibGFja2xpc3QgPSBbXSAgICAgICAgICAgICAgICAgLy8g6buR5ZCN5Y2V5YiX6KGoXG4gICAgICAgIHRoaXMuaG9uZXlfbGlzdF9jb3VudCA9IDIwICAgICAgICAgIC8v5pyA6L+R6IGU57O75Lq66ZmQ5Yi2XG4gICAgICAgIHRoaXMubGFzdF9zZWxlY3RfZ3JvdXAgPSAxICAgICAgICAgIC8v5pyA5ZCO6YCJ5oup55qE5YiG57uEKOm7mOiupOmAieaLqeesrOS4gOS4quWIhue7hClcbiAgICAgICAgdGhpcy5sYXN0X3NlbGVjdF9mcmllbmRfc3J2X2lkID0gbnVsbFxuICAgICAgICB0aGlzLmxhc3Rfc2VsZWN0X2ZyaWVuZF9yaWQgPSBudWxsXG4gICAgICAgIHRoaXMucHJlc2VudF9jb3VudCA9IDAgICAgICAgICAgICAgIC8v5b2T5aSp5Y+v5Lul6LWg6YCB5aW95Y+L5L2T5Yqb5Ymp5L2Z5qyh5pWwXG4gICAgICAgIHRoaXMuZHJhd19jb3VudCA9IDAgICAgICAgICAgICAgICAgIC8v5b2T5aSp5Y+v5Lul6aKG5Y+W5aW95Y+L5L2T5Yqb5Ymp5L2Z5qyh5pWwXG4gICAgICAgIHRoaXMuZHJhd190b3RhbF9jb3VudCA9IDAgICAgICAgICAgIC8v5b2T5aSp5Y+v5Lul6aKG5Y+W5aW95Y+L5L2T5Yqb5oC75qyh5pWwXG4gICAgICAgIHRoaXMubGFzdF9zZWxlY3RfaW5kZXggPSAxICAgICAgICAgIC8v6buY6K6k5LiK5qyh6YCJ5Lit55qE5bqP5Y+3XG4gICAgfSxcblxuICAgIC8v5re75Yqg5pWw5o2uXG4gICAgYWRkOiBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIGlmICh0aGlzLmxpc3RbdmFsLnNydl9pZCArIFwiX1wiICsgdmFsLnJpZF0gPT0gbnVsbClcbiAgICAgICAgICAgIHRoaXMubGlzdFt2YWwuc3J2X2lkICsgXCJfXCIgKyB2YWwucmlkXSA9IHZhbDtcbiAgICB9LFxuXG4gICAgYWRkUGNoYXQ6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgaWYgKHRoaXMucGxpc3RbdmFsLnNydl9pZCArIFwiX1wiICsgdmFsLnJpZF0gPT0gbnVsbClcbiAgICAgICAgICAgIHRoaXMucGxpc3RbdmFsLnNydl9pZCArIFwiX1wiICsgdmFsLnJpZF0gPSB2YWw7XG4gICAgfSxcblxuICAgIGdldE9ubGluZUZyaWVuZExpc3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9ubGluZV9saXN0ID0gW107XG4gICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5saXN0KSB7XG4gICAgICAgICAgICB2YXIgdiA9IHRoaXMubGlzdFtrXVxuICAgICAgICAgICAgaWYgKHYgJiYgdi5pc19vbmxpbmUgPT0gMSkgeyAvL+WcqOe6v1xuICAgICAgICAgICAgICAgIG9ubGluZV9saXN0LnB1c2godik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9ubGluZV9saXN0XG4gICAgfSxcblxuICAgIGdldEZyaWVuZEluZm86IGZ1bmN0aW9uKHNydl9pZCwgcmlkKSB7XG4gICAgICAgIHZhciBmcmllbmRfaSA9IHNydl9pZCArIFwiX1wiICsgcmlkO1xuICAgICAgICByZXR1cm4gdGhpcy5saXN0W2ZyaWVuZF9pXTtcbiAgICB9LFxuXG4gICAgLy/nlLPor7fliJfooahcbiAgICBzZXRBcHBseUxpc3Q6IGZ1bmN0aW9uIChsaXN0KSB7XG4gICAgICAgIHZhciBhcnIgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSBpbiBsaXN0KSB7XG4gICAgICAgICAgICB2YXIgdiA9IGxpc3RbaV07XG4gICAgICAgICAgICBpZiAodikge1xuICAgICAgICAgICAgICAgIGFyci5wdXNoKHYpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBseSA9IGFycjtcblxuICAgICAgICBnY29yZS5UaW1lci5zZXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShGcmllbmRFdmVudC5VcGRhdGVfUmVkX1BvaW50KTtcbiAgICAgICAgfSwgMTAwMCwgLTEpO1xuICAgIH0sXG5cbiAgICBnZXRBcHBseUxpc3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHkgfHwgW107XG4gICAgfSxcblxuICAgIGdldEFwcGx5TnVtOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcGx5Lmxlbmd0aFxuICAgIH0sXG5cbiAgICAvL+WIoOmZpOaVsOaNrlxuICAgIGRlbDogZnVuY3Rpb24gKHNydl9pZCwgcmlkKSB7XG4gICAgICAgIGlmICh0aGlzLmxpc3Rbc3J2X2lkICsgXCJfXCIgKyByaWRdICE9IG51bGwpXG4gICAgICAgICAgICB0aGlzLmxpc3Rbc3J2X2lkICsgXCJfXCIgKyByaWRdID0gbnVsbDtcbiAgICAgICAgICAgIC8vIHRoaXMubGlzdC5zcGxpY2Uoc3J2X2lkICsgXCJfXCIgKyByaWQsMSlcbiAgICB9LFxuXG4gICAgLy/mm7TmlrDljZXkuKrmlbDmja5cbiAgICB1cGRhdGVWbzogZnVuY3Rpb24gKHNydl9pZCwgcmlkLCBrZXksIHZhbHVlKSB7XG4gICAgICAgIHZhciB2byA9IHRoaXMubGlzdFtzcnZfaWQgKyBcIl9cIiArIHJpZF07XG4gICAgICAgIGlmICh2byAhPSBudWxsKSB7XG4gICAgICAgICAgICB2by51cGRhdGUoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZvXG4gICAgfSxcblxuICAgIC8v57qi54K55Yik5pat77yM6KaB5pi+56S65Ye65Y+v6aKG5Y+W55qE5pWw6YeP77yM6Lef55Sz6K+35YiX6KGo55qE5pWw6YePXG4gICAgZ2V0QXdhcmROdW06IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG51bSA9IDA7XG4gICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5saXN0KSB7XG4gICAgICAgICAgICB2YXIgdiA9IHRoaXMubGlzdFtpXVxuICAgICAgICAgICAgaWYgKHYgJiYgdi5pc19kcmF3ID09IDEpIHtcbiAgICAgICAgICAgICAgICBudW0gPSBudW0gKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudW1cbiAgICB9LFxuXG4gICAgdXBkYXRlU2luZ2xlRnJpZW5kRGF0YTogZnVuY3Rpb24gKHNydl9pZCwgcmlkLCBkYXRhKSB7XG4gICAgICAgIHZhciBrZXkgPSBzcnZfaWQgKyBcIl9cIiArIHJpZDtcbiAgICAgICAgaWYgKHRoaXMubGlzdFtrZXldKVxuICAgICAgICAgICAgdGhpcy5saXN0W2tleV0uc2V0RGF0YShkYXRhKTtcbiAgICB9LFxuXG4gICAgLy/ojrflj5bljZXkuKrmlbDmja5cbiAgICBnZXRWbzogZnVuY3Rpb24gKHNydl9pZCwgcmlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpc3Rbc3J2X2lkICsgXCJfXCIgKyByaWRdO1xuICAgIH0sXG5cbiAgICAvL+i9rOWMluS4uuaVsOe7hFxuICAgIGdldEFycmF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcnJheSA9IG5ldyBBcnJheSgpO1xuICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMubGlzdCkge1xuICAgICAgICAgICAgaWYodGhpcy5saXN0W2tdKXtcbiAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHRoaXMubGlzdFtrXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXJyYXkuc29ydChVdGlscy50YWJsZVVwcGVyU29ydGVyKFtcImlzX29ubGluZVwiLCBcImxldlwiLCBcInBvd2VyXCJdKSk7XG4gICAgICAgIHJldHVybiBhcnJheVxuICAgIH0sXG5cbiAgICAvL+iOt+WPlui3qOacjS/lkIzmnI3lpb3lj4vmlbDmja5cbiAgICBnZXRHcm91cExpc3Q6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHZhciBhcnJheSA9IG5ldyBBcnJheSgpO1xuICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMubGlzdCkge1xuICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmxpc3Rba11cbiAgICAgICAgICAgIGlmICh2LmlzX2Nyb3NzID09IDEgJiYgbmFtZSA9PSBcImNyb3NzXCIpIHtcbiAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHYpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2LmlzX2Nyb3NzID09IDAgJiYgbmFtZSA9PSBcImFsaWtlXCIpIHtcbiAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFycmF5LnNvcnQoVXRpbHMudGFibGVVcHBlclNvcnRlcihbXCJpc19vbmxpbmVcIiwgXCJsZXZcIl0pKTtcbiAgICAgICAgcmV0dXJuIGFycmF5XG4gICAgfSxcblxuICAgIC8v6I635Y+W6Leo5pyNL+WQjOacjeWlveWPi+WcqOe6v+aVsOWSjOaAu+aVsFxuICAgIGdldEdyb3VwT25saW5lQW5kVG90YWw6IGZ1bmN0aW9uIChncm91cF9uYW1lKSB7XG4gICAgICAgIHZhciBvbmxpbmVfbnVtID0gMDtcbiAgICAgICAgdmFyIHRvdGFsX251bSA9IDA7XG4gICAgICAgIHZhciBncm91cF9kYXRhID0gdGhpcy5nZXRHcm91cExpc3QoZ3JvdXBfbmFtZSk7XG4gICAgICAgIHZhciBsZW4gPSBncm91cF9kYXRhLkdldFNpemUoKTtcbiAgICAgICAgdG90YWxfbnVtID0gbGVuO1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8PSBsZW47IGkrKykge1xuICAgICAgICAgICAgdmFyIGZyaWVuZF92byA9IGdyb3VwX2RhdGEuR2V0KGkgLSAxKTtcbiAgICAgICAgICAgIGlmIChmcmllbmRfdm8uc3J2X2lkICYmIGZyaWVuZF92by5yaWQgJiYgZnJpZW5kX3ZvLmlzX29ubGluZSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgb25saW5lX251bSA9IG9ubGluZV9udW0gKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG9ubGluZV9udW06IG9ubGluZV9udW0sIHRvdGFsX251bTogdG90YWxfbnVtIH1cbiAgICB9LFxuXG4gICAgLy/ojrflj5bmiYDmnInlpb3lj4vlnKjnur/lkozmgLvmlbDph49cbiAgICBnZXRGcmllbmRPbmxpbmVBbmRUb3RhbDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgb25saW5lX251bSA9IDA7XG4gICAgICAgIHZhciB0b3RhbF9udW0gPSAwO1xuICAgICAgICBpZiAodGhpcy5saXN0KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMubGlzdCkge1xuICAgICAgICAgICAgICAgIHZhciBmcmllbmRfdm8gPSB0aGlzLmxpc3Rba107XG4gICAgICAgICAgICAgICAgaWYgKGZyaWVuZF92byAmJiBmcmllbmRfdm8uc3J2X2lkICYmIGZyaWVuZF92by5yaWQgJiYgZnJpZW5kX3ZvLmlzX29ubGluZSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ubGluZV9udW0gPSBvbmxpbmVfbnVtICsgMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGZyaWVuZF92bylcbiAgICAgICAgICAgICAgICAgICAgdG90YWxfbnVtID0gdG90YWxfbnVtICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBvbmxpbmVfbnVtOiBvbmxpbmVfbnVtLCB0b3RhbF9udW06IHRvdGFsX251bSB9XG4gICAgfSxcblxuICAgIC8v6I635Y+W5pyA6L+R6IGU57O75Lq65Zyo57q/5pWw5ZKM5oC75pWwXG4gICAgZ2V0SG9uZXlMaXN0T25saW5lQW5kVG90YWw6IGZ1bmN0aW9uIChpc19yZXF1aXJlKSB7XG4gICAgICAgIHZhciB0b3RhbF9udW0gPSAwO1xuICAgICAgICB2YXIgb25saW5lX251bSA9IDA7XG4gICAgICAgIHZhciBob25leUxpc3QgPSB0aGlzLmdldEhvbmV5TGlzdChpc19yZXF1aXJlKTtcbiAgICAgICAgdmFyIGxlbiA9IGhvbmV5TGlzdC5HZXRTaXplKCk7XG4gICAgICAgIHRvdGFsX251bSA9IGxlbjtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBpdGVtID0gaG9uZXlMaXN0LkdldChpIC0gMSk7XG4gICAgICAgICAgICBpZiAoaXRlbS5zcnZfaWQgJiYgaXRlbS5yaWQgJiYgaXRlbS5pc19vbmxpbmUgPT0gMSkge1xuICAgICAgICAgICAgICAgIG9ubGluZV9udW0gPSBvbmxpbmVfbnVtICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBvbmxpbmVfbnVtOiBvbmxpbmVfbnVtLCB0b3RhbF9udW06IHRvdGFsX251bSB9XG4gICAgfSxcblxuICAgIC8v6I635Y+W6buR5ZCN5Y2V5Zyo57q/5pWw5ZKM5oC75pWwXG4gICAgZ2V0QmxhY2tMaXN0T25saW5lQW5kVG90YWw6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHRvdGFsX251bSA9IDA7XG4gICAgICAgIHZhciBvbmxpbmVfbnVtID0gMDtcbiAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmJsYWNrbGlzdCkge1xuICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmJsYWNrbGlzdFtrXTtcbiAgICAgICAgICAgIGlmICh2ICE9IG51bGwgJiYgdi5pc19vbmxpbmUgIT0gbnVsbCAmJiB2LmlzX29ubGluZSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgb25saW5lX251bSA9IG9ubGluZV9udW0gKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG90YWxfbnVtID0gdG90YWxfbnVtICsgMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBvbmxpbmVfbnVtOiBvbmxpbmVfbnVtLCB0b3RhbF9udW06IHRvdGFsX251bSB9XG4gICAgfSxcblxuICAgIC8v6I635Y+W57Si5byVXG4gICAgZ2V0SW5kZXg6IGZ1bmN0aW9uIChzcnZfaWQsIHJpZCkge1xuICAgICAgICB2YXIgYXJyYXkgPSB0aGlzLmdldEFycmF5KCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciB2byA9IGFycmF5W2ldO1xuICAgICAgICAgICAgaWYgKHZvLnNydl9pZCA9PSBzcnZfaWQgJiYgdm8ucmlkID09IHJpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9LFxuXG4gICAgaXNGcmllbmQ6IGZ1bmN0aW9uIChzcnZfaWQsIHJpZCkge1xuICAgICAgICBpZiAoc3J2X2lkID09IG51bGwgfHwgcmlkID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHZhciB2byA9IHRoaXMubGlzdFtzcnZfaWQgKyBcIl9cIiArIHJpZF07XG4gICAgICAgIGlmICh2byAmJiB2by5pc19tb3NoZW5ncmVuID09IDApXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9LFxuXG4gICAgaXNGcmllbmQyOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciB2byA9IHRoaXMubGlzdFtrZXldO1xuICAgICAgICBpZiAodm8gJiYgdm8uaXNfbW9zaGVuZ3JlbiA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIC8v5L+d5a2Y6Z2e5aW95Y+L6IGU57O75Lq655qE5Zyo57q/5pWw5o2uXG4gICAgc2V0T25saW5lRGF0YTogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB0aGlzLm9ubGluZWxpc3QgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSBpbiBsaXN0KSB7XG4gICAgICAgICAgICB2YXIgdm8gPSBsaXN0W2ldO1xuICAgICAgICAgICAgdmFyIGtleSA9IHZvLnNydl9pZCArIFwiK1wiICsgdm8uaWQ7XG4gICAgICAgICAgICB0aGlzLm9ubGluZWxpc3Rba2V5XSA9IDE7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0T25saW5lRGF0YTogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAodGhpcy5vbmxpbmVsaXN0W2tleV0pXG4gICAgICAgICAgICByZXR1cm4gMVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gMFxuICAgIH0sXG5cbiAgICBzZXRPbmxpbmVLZXk6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdGhpcy5vbmxpbmVsaXN0W2tleV0gPSAxO1xuICAgIH0sXG5cbiAgICBzZXRGcmllbmRQcmVzZW50Q291bnQ6IGZ1bmN0aW9uIChjb3VudCkge1xuICAgICAgICB0aGlzLnByZXNlbnRfY291bnQgPSBjb3VudFxuICAgIH0sXG5cbiAgICBnZXRGcmllbmRQcmVzZW50Q291bnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJlc2VudF9jb3VudFxuICAgIH0sXG5cbiAgICBzZXRGcmllbmREcmF3Q291bnQ6IGZ1bmN0aW9uIChjb3VudCkge1xuICAgICAgICB0aGlzLmRyYXdfY291bnQgPSBjb3VudDtcbiAgICB9LFxuXG4gICAgZ2V0RnJpZW5kRHJhd0NvdW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRyYXdfY291bnRcbiAgICB9LFxuXG4gICAgc2V0RnJpZW5kRHJhd1RvdGFsQ291bnQ6IGZ1bmN0aW9uICh0b3RhbCkge1xuICAgICAgICB0aGlzLmRyYXdfdG90YWxfY291bnQgPSB0b3RhbDtcbiAgICB9LFxuXG4gICAgZ2V0RnJpZW5kRHJhd1RvdGFsQ291bnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhd190b3RhbF9jb3VudDtcbiAgICB9LFxuXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0t6buR5ZCN5Y2V5qih5Z2X5pWw5o2u77yaXG5cbiAgICAvL+WIneWni+WMllxuICAgIGluaXRCbGFja0xpc3Q6IGZ1bmN0aW9uIChsaXN0LCBpc19hZGQpIHtcbiAgICAgICAgZm9yICh2YXIgayBpbiBsaXN0KSB7XG4gICAgICAgICAgICB2YXIgdm8gPSBuZXcgRnJpZW5kVm8oKTtcbiAgICAgICAgICAgIHZhciB2ID0gbGlzdFtrXTtcbiAgICAgICAgICAgIHZvLnNldERhdGEodik7XG4gICAgICAgICAgICB0aGlzLmJsYWNrbGlzdFt2LnJpZCArIFwiX1wiICsgdi5zcnZfaWRdID0gdm87XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/np7vpmaTpu5HlkI3ljZVcbiAgICByZW1vdmVCbGFjazogZnVuY3Rpb24gKHJpZCwgc3J2X2lkKSB7XG4gICAgICAgIGlmIChyaWQgJiYgc3J2X2lkKVxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuYmxhY2tsaXN0W3JpZCArIFwiX1wiICsgc3J2X2lkXSA7XG4gICAgfSxcblxuICAgIC8v6buR5ZCN5Y2V5pWw57uEXG4gICAgZ2V0QmxhY2tBcnJheTogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXJyYXkgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmJsYWNrbGlzdCkge1xuICAgICAgICAgICAgYXJyYXkucHVzaCh0aGlzLmJsYWNrbGlzdFtrXSk7XG4gICAgICAgIH1cbiAgICAgICAgYXJyYXkuc29ydChVdGlscy50YWJsZVVwcGVyU29ydGVyKFtcImlzX29ubGluZVwiLCBcImxldlwiLCBcInBvd2VyXCJdKSk7XG4gICAgICAgIHJldHVybiBhcnJheVxuICAgIH0sXG5cbiAgICAvL+aYr+WQpuWcqOm7keWQjeWNlemHjOmdolxuICAgIGlzQmxhY2s6IGZ1bmN0aW9uIChyaWQsIHNydl9pZCkge1xuICAgICAgICB2YXIgaXNJbiA9IGZhbHNlO1xuICAgICAgICBpZiAocmlkICYmIHNydl9pZCAmJiB0aGlzLmJsYWNrbGlzdFtyaWQgKyBcIl9cIiArIHNydl9pZF0pIHtcbiAgICAgICAgICAgIGlzSW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0luO1xuICAgIH0sXG5cbiAgICBzZXRMYXN0U2VsZWN0R3JvdXA6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLmxhc3Rfc2VsZWN0X2dyb3VwID0gdmFsdWU7XG4gICAgfSxcblxuICAgIGdldExhc3RTZWxlY3RHcm91cDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXN0X3NlbGVjdF9ncm91cDtcbiAgICB9LFxuXG4gICAgc2V0TGFzdFNlbGVjdEZyaWVuZDogZnVuY3Rpb24gKHNydl9pZCwgcmlkKSB7XG4gICAgICAgIHRoaXMubGFzdF9zZWxlY3RfZnJpZW5kX3Nydl9pZCA9IHNydl9pZDtcbiAgICAgICAgdGhpcy5sYXN0X3NlbGVjdF9mcmllbmRfcmlkID0gcmlkO1xuICAgIH0sXG5cbiAgICBzZXRMYXN0U2VsZWN0RnJpZW5kSW5kZXg6IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICB0aGlzLmxhc3Rfc2VsZWN0X2luZGV4ID0gaW5kZXggfHwgMTtcbiAgICB9LFxuXG4gICAgZ2V0TGFzdFNlbGVjdEZyaWVuZEluZGV4OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxhc3Rfc2VsZWN0X2luZGV4O1xuICAgIH0sXG5cbiAgICBnZXRMYXN0U2VsZWN0RnJpZW5kOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxhc3Rfc2VsZWN0X2ZyaWVuZF9zcnZfaWQsIHRoaXMubGFzdF9zZWxlY3RfZnJpZW5kX3JpZDtcbiAgICB9LFxuXG4gICAgX19kZWxldGU6IGZ1bmN0aW9uICgpIHtcblxuICAgIH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZyaWVuZE1vZGVsOyJdfQ==