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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/guildskill/guildskill_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, '8fcedmpqCNCGZm7xYbxB3ZO', 'guildskill_model');
// Scripts/mod/guildskill/guildskill_model.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//      这里填写详细说明,主要填写该模块的功能简要
// <br/>Create: 2019-01-19 17:37:33
// --------------------------------------------------------------------
var GuildskillConst = require("guildskill_const");
 
var GuildskillEvent = require("guildskill_event");
 
var RoleController = require("role_controller");
 
var BackpackController = require("backpack_controller");
 
var GuildConst = require("guild_const");
 
var MainuiConst = require("mainui_const");
 
var MainuiController = require("mainui_controller");
 
var GuildEvent = require("guild_event");
 
var GuildskillModel = cc.Class({
  "extends": BaseClass,
  ctor: function ctor() {
    this.ctrl = require("guildskill_controller").getInstance();
    this.initConfig();
  },
  properties: {},
  initConfig: function initConfig() {
    this.career_skill_list = {};
    this.skill_wait_upgrade_list = {};
    this.skill_upgrade_cost_list = {};
    this.skill_red_status_list = {};
    this.had_send_mainui = false;
    this.had_close_mainui = false;
  },
  clearGuildCareerSkill: function clearGuildCareerSkill() {
    this.career_skill_list = {};
    this.skill_wait_upgrade_list = {};
    this.skill_upgrade_cost_list = {};
    this.skill_red_status_list = {};
  },
  initGuildCareerSkill: function initGuildCareerSkill(data) {
    if (data == null || data.group_id == null) return;
    var config = Config.guild_skill_data.data_info_group[data.group_id];
    if (config == null) cc.log("公会技能配置数据有问题,技能组id为:", data.group_id);else {
      var object = {};
      object.career = data.career; // 当前职业
 
      object.group_id = data.group_id; // 当前激活的技能组
 
      object.group_ids = data.group_ids; // 已经激活的技能组
 
      object.skill_ids = []; // 当前技能组的技能状态
 
      for (var i in config) {
        var v = config[i];
        object.skill_ids.push({
          id: v.id,
          index: v.seq,
          status: GuildskillConst.status.un_activity
        });
      }
 
      for (var i in data.skill_ids) {
        var v = data.skill_ids[i];
 
        for (var n in object.skill_ids) {
          var item = object.skill_ids[n];
 
          if (v.skill_id == item.id) {
            item.status = GuildskillConst.status.activity;
            break;
          }
        }
      } //对技能顺序做一个排序吧,主要是担心策划配置不是按照正常顺序来
 
 
      if (Utils.next(object.skill_ids)) {
        object.skill_ids.sort(function (a, b) {
          return a.index < b.index;
        });
      }
 
      this.career_skill_list[data.career] = object;
      gcore.GlobalEvent.fire(GuildskillEvent.UpdateGuildSkillEvent, data.career);
    }
  },
  //获取指定职业的技能信息
  getCareerSkillInfo: function getCareerSkillInfo(career) {
    return this.career_skill_list[career];
  },
  //激活指定职业的技能信息
  updateGuildCareerSkill: function updateGuildCareerSkill(career, skill_id) {
    if (career == null || skill_id == null) return;
    var object = this.career_skill_list[career];
 
    if (object && object.skill_ids) {
      for (var i in object.skill_ids) {
        var item = object.skill_ids[i];
 
        if (item.id == skill_id) {
          item.status = GuildskillConst.status.activity;
          break;
        }
      } //升级之后,这边做一次保存当前待升级的技能id
 
 
      var red_skill_id = 0;
 
      for (var k in object.skill_ids) {
        var v = object.skill_ids[k];
 
        if (v.status == GuildskillConst.status.un_activity) {
          red_skill_id = v.id;
          break;
        }
      }
 
      this.updateGuildSkillStatus(career, red_skill_id);
      gcore.GlobalEvent.fire(GuildskillEvent.UpdateSkillStatusEvent, career, skill_id);
    }
  },
  //升级指定职业的技能组,这个时候默认该技能组技能都未激活
  upgradeGuildCareerSkill: function upgradeGuildCareerSkill(career, group_id) {
    if (career == null || group_id == null) return;
    var object = this.career_skill_list[career];
 
    if (object == null) {
      object = {};
      object.group_ids = [];
      this.career_skill_list[career] = object;
    }
 
    if (object.group_ids) {
      object.group_ids.push({
        group_id: object.group_id
      });
    }
 
    object.career = career;
 
    if (object.group_id != group_id) {
      object.group_id = group_id;
      object.skill_ids = [];
      var config = Config.guild_skill_data.data_info_group[group_id];
 
      if (config == null) {
        cc.log("更新技能组出错,配置数据有问题,技能组id为:", group_id);
        return;
      }
 
      for (var i in config) {
        var v = config[i];
        object.skill_ids.push({
          id: v.id,
          index: v.seq,
          status: GuildskillConst.status.un_activity
        });
      }
 
      if (Utils.next(object.skill_ids)) {
        object.skill_ids.sort(function (a, b) {
          return a.index < b.index;
        });
      }
    } //升级之后,这边做一次保存当前待升级的技能id
 
 
    var skill_id = 0;
 
    for (var k in object.skill_ids) {
      var v = object.skill_ids[k];
 
      if (v.status == GuildskillConst.status.un_activity) {
        skill_id = v.id;
        break;
      }
    }
 
    this.updateGuildSkillStatus(career, skill_id);
    gcore.GlobalEvent.fire(GuildskillEvent.UpdateSkilUpgradeEvent, career, group_id);
  },
  //获取当前技能组上线
  getCareerGroupMax: function getCareerGroupMax(career) {
    career = career || GuildskillConst.index.physics;
    if (this.career_group_max == null) this.career_group_max = {};
 
    if (this.career_group_max[career] == null) {
      var config = gdata("guild_skill_data", "data_career_list", [career]);
 
      if (config) {
        this.career_group_max[career] = config.length;
      } else {
        this.career_group_max[career] = 0;
      }
    }
 
    return this.career_group_max[career];
  },
  //公会技能的初始化红点状态
  initGuildSkillStatus: function initGuildSkillStatus(data) {
    if (data && data.outline) {
      this.skill_wait_upgrade_list = {};
 
      for (var i in data.outline) {
        var v = data.outline[i];
        this.skill_wait_upgrade_list[v.career] = v.skill_id;
      }
    }
 
    this.checkGuildSkillRedStatus();
  },
  //更新当前技能
  updateGuildSkillStatus: function updateGuildSkillStatus(career, skill_id) {
    if (this.skill_wait_upgrade_list == null) this.skill_wait_upgrade_list = {};
    this.skill_wait_upgrade_list[career] = skill_id;
    this.checkGuildSkillRedStatus();
  },
  //公会技能红点的算法更新
  checkGuildSkillRedStatus: function checkGuildSkillRedStatus() {
    if (this.skill_wait_upgrade_list == null || Utils.next(this.skill_wait_upgrade_list) == null) return;
    RedMgr.getInstance().addCalHandler(function () {
      var role_vo = RoleController.getInstance().getRoleVo();
      var backpack_model = BackpackController.getInstance().getModel();
      var red_list = {};
 
      for (var k in this.skill_wait_upgrade_list) {
        var skill_id = this.skill_wait_upgrade_list[k];
        var config = gdata("guild_skill_data", "data_info", [skill_id]);
 
        if (config) {
          red_list[k] = true;
 
          if (config.guild_lev > role_vo.guild_lev) {
            red_list[k] = false;
          } else {
            for (var i in config.loss || {}) {
              var v = config.loss[i];
 
              if (v[0] != null && v[1] != null) {
                var bid = v[0];
                var num = v[1];
                var assert = Config.item_data.data_assets_id2label[bid];
 
                if (assert) {
                  if (num > role_vo[assert]) {
                    red_list[k] = false;
                    break;
                  }
                } else {
                  var sum = backpack_model.getBackPackItemNumByBid(bid);
 
                  if (num > sum) {
                    red_list[k] = false;
                    break;
                  }
                }
              }
            }
          }
        }
      }
 
      for (var k in red_list) {
        var id = this.getCareerKey(k);
        this.updateGuildRedStatus(id, red_list[k]);
      }
    }.bind(this), RedIds.GuildSkill);
  },
  //设置一个唯一id吧, 跟 guildconst.skill_2 ,3 ,4 ,5对应
  getCareerKey: function getCareerKey(career) {
    career = career || GuildskillConst.index.physics;
    if (career == GuildskillConst.index.magic) return GuildConst.red_index.skill_2;else if (career == GuildskillConst.index.physics) return GuildConst.red_index.skill_3;else if (career == GuildskillConst.index.defence) return GuildConst.red_index.skill_4;else if (career == GuildskillConst.index.assist) return GuildConst.red_index.skill_5;else return GuildConst.red_index.skill_3;
  },
  //清楚主界面上面的红点
  clearGuildSkillIconRed: function clearGuildSkillIconRed() {
    if (this.had_close_mainui == true) return;
    this.had_close_mainui = true;
    var is_red = false;
 
    for (var k in this.skill_red_status_list) {
      var v = this.skill_red_status_list[k];
 
      if (v == true) {
        is_red = true;
        break;
      }
    }
 
    if (is_red == true) {
      var data = [{
        bid: GuildConst.red_index.skill_2,
        status: false
      }, {
        bid: GuildConst.red_index.skill_3,
        status: false
      }, {
        bid: GuildConst.red_index.skill_4,
        status: false
      }, {
        bid: GuildConst.red_index.skill_5,
        status: false
      }];
      MainuiController.getInstance().setBtnRedPoint(MainuiConst.btn_index.guild, data);
    }
  },
  //更新公会技能红点
  updateGuildRedStatus: function updateGuildRedStatus(bid, status) {
    var base_data = Config.function_data.data_base;
    var bool = MainuiController.getInstance().checkIsOpenByActivate(base_data[6].activate);
    if (bool == false) return;
    var _status = this.skill_red_status_list[bid];
    if (_status == status) return;
    this.skill_red_status_list[bid] = status; //更新场景红点状态,只在登录的时候提示一次
 
    if (this.had_send_mainui == false) {
      this.had_send_mainui = true;
      MainuiController.getInstance().setBtnRedPoint(MainuiConst.btn_index.guild, {
        bid: bid,
        status: status
      });
    } //事件用于同步更新公会主ui的红点
 
 
    gcore.GlobalEvent.fire(GuildEvent.UpdateGuildRedStatus, bid, status);
  },
  getRedStatus: function getRedStatus(career) {
    var id = this.getCareerKey(career);
    return this.skill_red_status_list[id];
  },
  getRedTotalStatus: function getRedTotalStatus() {
    for (var k in this.skill_red_status_list) {
      var _status = this.skill_red_status_list[k];
      if (_status == true) return true;
    }
 
    return false;
  },
  // --获取各职业的公会技能等级
  getCareerSkillLevel: function getCareerSkillLevel(career) {
    if (this.career_skill_list[career]) {
      var skill_ids = this.career_skill_list[career].skill_ids;
      var count = this.career_skill_list[career].group_ids.length * 6;
 
      for (var i = 0; i < skill_ids.length; ++i) {
        var v = skill_ids[i];
 
        if (v.status == GuildskillConst.status.activity) {
          count = count + 1;
        }
      }
 
      return count;
    }
 
    return -1;
  }
});
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxndWlsZHNraWxsXFxndWlsZHNraWxsX21vZGVsLmpzIl0sIm5hbWVzIjpbIkd1aWxkc2tpbGxDb25zdCIsInJlcXVpcmUiLCJHdWlsZHNraWxsRXZlbnQiLCJSb2xlQ29udHJvbGxlciIsIkJhY2twYWNrQ29udHJvbGxlciIsIkd1aWxkQ29uc3QiLCJNYWludWlDb25zdCIsIk1haW51aUNvbnRyb2xsZXIiLCJHdWlsZEV2ZW50IiwiR3VpbGRza2lsbE1vZGVsIiwiY2MiLCJDbGFzcyIsIkJhc2VDbGFzcyIsImN0b3IiLCJjdHJsIiwiZ2V0SW5zdGFuY2UiLCJpbml0Q29uZmlnIiwicHJvcGVydGllcyIsImNhcmVlcl9za2lsbF9saXN0Iiwic2tpbGxfd2FpdF91cGdyYWRlX2xpc3QiLCJza2lsbF91cGdyYWRlX2Nvc3RfbGlzdCIsInNraWxsX3JlZF9zdGF0dXNfbGlzdCIsImhhZF9zZW5kX21haW51aSIsImhhZF9jbG9zZV9tYWludWkiLCJjbGVhckd1aWxkQ2FyZWVyU2tpbGwiLCJpbml0R3VpbGRDYXJlZXJTa2lsbCIsImRhdGEiLCJncm91cF9pZCIsImNvbmZpZyIsIkNvbmZpZyIsImd1aWxkX3NraWxsX2RhdGEiLCJkYXRhX2luZm9fZ3JvdXAiLCJsb2ciLCJvYmplY3QiLCJjYXJlZXIiLCJncm91cF9pZHMiLCJza2lsbF9pZHMiLCJpIiwidiIsInB1c2giLCJpZCIsImluZGV4Iiwic2VxIiwic3RhdHVzIiwidW5fYWN0aXZpdHkiLCJuIiwiaXRlbSIsInNraWxsX2lkIiwiYWN0aXZpdHkiLCJVdGlscyIsIm5leHQiLCJzb3J0IiwiYSIsImIiLCJnY29yZSIsIkdsb2JhbEV2ZW50IiwiZmlyZSIsIlVwZGF0ZUd1aWxkU2tpbGxFdmVudCIsImdldENhcmVlclNraWxsSW5mbyIsInVwZGF0ZUd1aWxkQ2FyZWVyU2tpbGwiLCJyZWRfc2tpbGxfaWQiLCJrIiwidXBkYXRlR3VpbGRTa2lsbFN0YXR1cyIsIlVwZGF0ZVNraWxsU3RhdHVzRXZlbnQiLCJ1cGdyYWRlR3VpbGRDYXJlZXJTa2lsbCIsIlVwZGF0ZVNraWxVcGdyYWRlRXZlbnQiLCJnZXRDYXJlZXJHcm91cE1heCIsInBoeXNpY3MiLCJjYXJlZXJfZ3JvdXBfbWF4IiwiZ2RhdGEiLCJsZW5ndGgiLCJpbml0R3VpbGRTa2lsbFN0YXR1cyIsIm91dGxpbmUiLCJjaGVja0d1aWxkU2tpbGxSZWRTdGF0dXMiLCJSZWRNZ3IiLCJhZGRDYWxIYW5kbGVyIiwicm9sZV92byIsImdldFJvbGVWbyIsImJhY2twYWNrX21vZGVsIiwiZ2V0TW9kZWwiLCJyZWRfbGlzdCIsImd1aWxkX2xldiIsImxvc3MiLCJiaWQiLCJudW0iLCJhc3NlcnQiLCJpdGVtX2RhdGEiLCJkYXRhX2Fzc2V0c19pZDJsYWJlbCIsInN1bSIsImdldEJhY2tQYWNrSXRlbU51bUJ5QmlkIiwiZ2V0Q2FyZWVyS2V5IiwidXBkYXRlR3VpbGRSZWRTdGF0dXMiLCJiaW5kIiwiUmVkSWRzIiwiR3VpbGRTa2lsbCIsIm1hZ2ljIiwicmVkX2luZGV4Iiwic2tpbGxfMiIsInNraWxsXzMiLCJkZWZlbmNlIiwic2tpbGxfNCIsImFzc2lzdCIsInNraWxsXzUiLCJjbGVhckd1aWxkU2tpbGxJY29uUmVkIiwiaXNfcmVkIiwic2V0QnRuUmVkUG9pbnQiLCJidG5faW5kZXgiLCJndWlsZCIsImJhc2VfZGF0YSIsImZ1bmN0aW9uX2RhdGEiLCJkYXRhX2Jhc2UiLCJib29sIiwiY2hlY2tJc09wZW5CeUFjdGl2YXRlIiwiYWN0aXZhdGUiLCJfc3RhdHVzIiwiVXBkYXRlR3VpbGRSZWRTdGF0dXMiLCJnZXRSZWRTdGF0dXMiLCJnZXRSZWRUb3RhbFN0YXR1cyIsImdldENhcmVlclNraWxsTGV2ZWwiLCJjb3VudCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQSxlQUFlLEdBQUdDLE9BQU8sQ0FBQyxrQkFBRCxDQUE3Qjs7QUFDQSxJQUFJ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LEVBQW1DO0FBQy9CLFlBQUlDLENBQUMsR0FBR0YsU0FBUyxDQUFDQyxDQUFELENBQWpCOztBQUNBLFlBQUdDLENBQUMsQ0FBQ0ssTUFBRixJQUFZM0MsZUFBZSxDQUFDMkMsTUFBaEIsQ0FBdUJLLFFBQXRDLEVBQStDO0FBQzNDdUUsVUFBQUEsS0FBSyxHQUFHQSxLQUFLLEdBQUcsQ0FBaEI7QUFDSDtBQUNKOztBQUNELGFBQU9BLEtBQVA7QUFDSDs7QUFDRCxXQUFPLENBQUMsQ0FBUjtBQUNIO0FBalUwQixDQUFULENBQXRCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAgIOi/memHjOWhq+WGmeivpue7huivtOaYjizkuLvopoHloavlhpnor6XmqKHlnZfnmoTlip/og73nroDopoFcbi8vIDxici8+Q3JlYXRlOiAyMDE5LTAxLTE5IDE3OjM3OjMzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIEd1aWxkc2tpbGxDb25zdCA9IHJlcXVpcmUoXCJndWlsZHNraWxsX2NvbnN0XCIpO1xudmFyIEd1aWxkc2tpbGxFdmVudCA9IHJlcXVpcmUoXCJndWlsZHNraWxsX2V2ZW50XCIpO1xudmFyIFJvbGVDb250cm9sbGVyID0gcmVxdWlyZShcInJvbGVfY29udHJvbGxlclwiKTtcbnZhciBCYWNrcGFja0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiYmFja3BhY2tfY29udHJvbGxlclwiKTtcbnZhciBHdWlsZENvbnN0ID0gcmVxdWlyZShcImd1aWxkX2NvbnN0XCIpO1xudmFyIE1haW51aUNvbnN0ID0gcmVxdWlyZShcIm1haW51aV9jb25zdFwiKTtcbnZhciBNYWludWlDb250cm9sbGVyID0gcmVxdWlyZShcIm1haW51aV9jb250cm9sbGVyXCIpO1xudmFyIEd1aWxkRXZlbnQgPSByZXF1aXJlKFwiZ3VpbGRfZXZlbnRcIik7XG5cbnZhciBHdWlsZHNraWxsTW9kZWwgPSBjYy5DbGFzcyh7XG4gICAgZXh0ZW5kczogQmFzZUNsYXNzLFxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5jdHJsID0gcmVxdWlyZShcImd1aWxkc2tpbGxfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpO1xuICAgICAgICB0aGlzLmluaXRDb25maWcoKTtcbiAgICB9LFxuXG4gICAgcHJvcGVydGllczoge1xuICAgIH0sXG5cbiAgICBpbml0Q29uZmlnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY2FyZWVyX3NraWxsX2xpc3QgPSB7fTtcbiAgICAgICAgdGhpcy5za2lsbF93YWl0X3VwZ3JhZGVfbGlzdCA9IHt9O1xuICAgICAgICB0aGlzLnNraWxsX3VwZ3JhZGVfY29zdF9saXN0ID0ge307XG4gICAgICAgIHRoaXMuc2tpbGxfcmVkX3N0YXR1c19saXN0ID0ge307XG5cbiAgICAgICAgdGhpcy5oYWRfc2VuZF9tYWludWkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5oYWRfY2xvc2VfbWFpbnVpID0gZmFsc2U7XG4gICAgfSxcblxuICAgIGNsZWFyR3VpbGRDYXJlZXJTa2lsbDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmNhcmVlcl9za2lsbF9saXN0ID0ge307XG4gICAgICAgIHRoaXMuc2tpbGxfd2FpdF91cGdyYWRlX2xpc3QgPSB7fTtcbiAgICAgICAgdGhpcy5za2lsbF91cGdyYWRlX2Nvc3RfbGlzdCA9IHt9O1xuICAgICAgICB0aGlzLnNraWxsX3JlZF9zdGF0dXNfbGlzdCA9IHt9O1xuICAgIH0sXG5cbiAgICBpbml0R3VpbGRDYXJlZXJTa2lsbDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCB8fCBkYXRhLmdyb3VwX2lkID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgdmFyIGNvbmZpZyA9IENvbmZpZy5ndWlsZF9za2lsbF9kYXRhLmRhdGFfaW5mb19ncm91cFtkYXRhLmdyb3VwX2lkXTtcbiAgICAgICAgaWYgKGNvbmZpZyA9PSBudWxsKVxuICAgICAgICAgICAgY2MubG9nKFwi5YWs5Lya5oqA6IO96YWN572u5pWw5o2u5pyJ6Zeu6aKY77yM5oqA6IO957uEaWTkuLrvvJpcIiwgZGF0YS5ncm91cF9pZCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIG9iamVjdCA9IHt9O1xuICAgICAgICAgICAgb2JqZWN0LmNhcmVlciA9IGRhdGEuY2FyZWVyICAgICAgICAgICAgICAgICAvLyDlvZPliY3ogYzkuJpcbiAgICAgICAgICAgIG9iamVjdC5ncm91cF9pZCA9IGRhdGEuZ3JvdXBfaWQgICAgICAgICAgICAgLy8g5b2T5YmN5r+A5rS755qE5oqA6IO957uEXG4gICAgICAgICAgICBvYmplY3QuZ3JvdXBfaWRzID0gZGF0YS5ncm91cF9pZHMgICAgICAgICAgIC8vIOW3sue7j+a/gOa0u+eahOaKgOiDvee7hFxuICAgICAgICAgICAgb2JqZWN0LnNraWxsX2lkcyA9IFtdICAgICAgICAgICAgICAgICAgICAgICAvLyDlvZPliY3mioDog73nu4TnmoTmioDog73nirbmgIFcblxuICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBjb25maWcpIHtcbiAgICAgICAgICAgICAgICB2YXIgdiA9IGNvbmZpZ1tpXTtcbiAgICAgICAgICAgICAgICBvYmplY3Quc2tpbGxfaWRzLnB1c2goeyBpZDogdi5pZCwgaW5kZXg6IHYuc2VxLCBzdGF0dXM6IEd1aWxkc2tpbGxDb25zdC5zdGF0dXMudW5fYWN0aXZpdHkgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gZGF0YS5za2lsbF9pZHMpIHtcbiAgICAgICAgICAgICAgICB2YXIgdiA9IGRhdGEuc2tpbGxfaWRzW2ldO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gb2JqZWN0LnNraWxsX2lkcykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IG9iamVjdC5za2lsbF9pZHNbbl07XG4gICAgICAgICAgICAgICAgICAgIGlmICh2LnNraWxsX2lkID09IGl0ZW0uaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3RhdHVzID0gR3VpbGRza2lsbENvbnN0LnN0YXR1cy5hY3Rpdml0eTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL+WvueaKgOiDvemhuuW6j+WBmuS4gOS4quaOkuW6j+WQp++8jOS4u+imgeaYr+aLheW/g+etluWIkumFjee9ruS4jeaYr+aMieeFp+ato+W4uOmhuuW6j+adpVxuICAgICAgICAgICAgaWYgKFV0aWxzLm5leHQob2JqZWN0LnNraWxsX2lkcykpIHtcbiAgICAgICAgICAgICAgICBvYmplY3Quc2tpbGxfaWRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuaW5kZXggPCBiLmluZGV4XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY2FyZWVyX3NraWxsX2xpc3RbZGF0YS5jYXJlZXJdID0gb2JqZWN0O1xuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShHdWlsZHNraWxsRXZlbnQuVXBkYXRlR3VpbGRTa2lsbEV2ZW50LCBkYXRhLmNhcmVlcik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/ojrflj5bmjIflrprogYzkuJrnmoTmioDog73kv6Hmga9cbiAgICBnZXRDYXJlZXJTa2lsbEluZm86IGZ1bmN0aW9uIChjYXJlZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FyZWVyX3NraWxsX2xpc3RbY2FyZWVyXTtcbiAgICB9LFxuXG4gICAgLy/mv4DmtLvmjIflrprogYzkuJrnmoTmioDog73kv6Hmga9cbiAgICB1cGRhdGVHdWlsZENhcmVlclNraWxsOiBmdW5jdGlvbiAoY2FyZWVyLCBza2lsbF9pZCkge1xuICAgICAgICBpZiAoY2FyZWVyID09IG51bGwgfHwgc2tpbGxfaWQgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB2YXIgb2JqZWN0ID0gdGhpcy5jYXJlZXJfc2tpbGxfbGlzdFtjYXJlZXJdO1xuICAgICAgICBpZiAob2JqZWN0ICYmIG9iamVjdC5za2lsbF9pZHMpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gb2JqZWN0LnNraWxsX2lkcykge1xuICAgICAgICAgICAgICAgIHZhciBpdGVtID0gb2JqZWN0LnNraWxsX2lkc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5pZCA9PSBza2lsbF9pZCkge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnN0YXR1cyA9IEd1aWxkc2tpbGxDb25zdC5zdGF0dXMuYWN0aXZpdHk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy/ljYfnuqfkuYvlkI7vvIzov5novrnlgZrkuIDmrKHkv53lrZjlvZPliY3lvoXljYfnuqfnmoTmioDog71pZFxuICAgICAgICAgICAgdmFyIHJlZF9za2lsbF9pZCA9IDA7XG4gICAgICAgICAgICBmb3IgKHZhciBrIGluIG9iamVjdC5za2lsbF9pZHMpIHtcbiAgICAgICAgICAgICAgICB2YXIgdiA9IG9iamVjdC5za2lsbF9pZHNba107XG4gICAgICAgICAgICAgICAgaWYgKHYuc3RhdHVzID09IEd1aWxkc2tpbGxDb25zdC5zdGF0dXMudW5fYWN0aXZpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVkX3NraWxsX2lkID0gdi5pZDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUd1aWxkU2tpbGxTdGF0dXMoY2FyZWVyLCByZWRfc2tpbGxfaWQpO1xuXG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEd1aWxkc2tpbGxFdmVudC5VcGRhdGVTa2lsbFN0YXR1c0V2ZW50LCBjYXJlZXIsIHNraWxsX2lkKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+WNh+e6p+aMh+WumuiBjOS4mueahOaKgOiDvee7hO+8jOi/meS4quaXtuWAmem7mOiupOivpeaKgOiDvee7hOaKgOiDvemDveacqua/gOa0u1xuICAgIHVwZ3JhZGVHdWlsZENhcmVlclNraWxsOiBmdW5jdGlvbiAoY2FyZWVyLCBncm91cF9pZCkge1xuICAgICAgICBpZiAoY2FyZWVyID09IG51bGwgfHwgZ3JvdXBfaWQgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB2YXIgb2JqZWN0ID0gdGhpcy5jYXJlZXJfc2tpbGxfbGlzdFtjYXJlZXJdO1xuICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgICAgIG9iamVjdCA9IHt9O1xuICAgICAgICAgICAgb2JqZWN0Lmdyb3VwX2lkcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5jYXJlZXJfc2tpbGxfbGlzdFtjYXJlZXJdID0gb2JqZWN0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9iamVjdC5ncm91cF9pZHMpIHtcbiAgICAgICAgICAgIG9iamVjdC5ncm91cF9pZHMucHVzaCh7IGdyb3VwX2lkOiBvYmplY3QuZ3JvdXBfaWQgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBvYmplY3QuY2FyZWVyID0gY2FyZWVyO1xuICAgICAgICBpZiAob2JqZWN0Lmdyb3VwX2lkICE9IGdyb3VwX2lkKSB7XG4gICAgICAgICAgICBvYmplY3QuZ3JvdXBfaWQgPSBncm91cF9pZDtcbiAgICAgICAgICAgIG9iamVjdC5za2lsbF9pZHMgPSBbXTtcblxuICAgICAgICAgICAgdmFyIGNvbmZpZyA9IENvbmZpZy5ndWlsZF9za2lsbF9kYXRhLmRhdGFfaW5mb19ncm91cFtncm91cF9pZF07XG4gICAgICAgICAgICBpZiAoY29uZmlnID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjYy5sb2coXCLmm7TmlrDmioDog73nu4Tlh7rplJnvvIzphY3nva7mlbDmja7mnInpl67popjvvIzmioDog73nu4RpZOS4uu+8mlwiLCBncm91cF9pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgdmFyIHYgPSBjb25maWdbaV07XG4gICAgICAgICAgICAgICAgb2JqZWN0LnNraWxsX2lkcy5wdXNoKHsgaWQ6IHYuaWQsIGluZGV4OiB2LnNlcSwgc3RhdHVzOiBHdWlsZHNraWxsQ29uc3Quc3RhdHVzLnVuX2FjdGl2aXR5IH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoVXRpbHMubmV4dChvYmplY3Quc2tpbGxfaWRzKSkge1xuICAgICAgICAgICAgICAgIG9iamVjdC5za2lsbF9pZHMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5pbmRleCA8IGIuaW5kZXhcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy/ljYfnuqfkuYvlkI7vvIzov5novrnlgZrkuIDmrKHkv53lrZjlvZPliY3lvoXljYfnuqfnmoTmioDog71pZFxuICAgICAgICB2YXIgc2tpbGxfaWQgPSAwO1xuICAgICAgICBmb3IgKHZhciBrIGluIG9iamVjdC5za2lsbF9pZHMpIHtcbiAgICAgICAgICAgIHZhciB2ID0gb2JqZWN0LnNraWxsX2lkc1trXTtcbiAgICAgICAgICAgIGlmICh2LnN0YXR1cyA9PSBHdWlsZHNraWxsQ29uc3Quc3RhdHVzLnVuX2FjdGl2aXR5KSB7XG4gICAgICAgICAgICAgICAgc2tpbGxfaWQgPSB2LmlkO1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZUd1aWxkU2tpbGxTdGF0dXMoY2FyZWVyLCBza2lsbF9pZCk7XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoR3VpbGRza2lsbEV2ZW50LlVwZGF0ZVNraWxVcGdyYWRlRXZlbnQsIGNhcmVlciwgZ3JvdXBfaWQpO1xuICAgIH0sXG5cbiAgICAvL+iOt+WPluW9k+WJjeaKgOiDvee7hOS4iue6v1xuICAgIGdldENhcmVlckdyb3VwTWF4OiBmdW5jdGlvbiAoY2FyZWVyKSB7XG4gICAgICAgIGNhcmVlciA9IGNhcmVlciB8fCBHdWlsZHNraWxsQ29uc3QuaW5kZXgucGh5c2ljcztcbiAgICAgICAgaWYgKHRoaXMuY2FyZWVyX2dyb3VwX21heCA9PSBudWxsKVxuICAgICAgICAgICAgdGhpcy5jYXJlZXJfZ3JvdXBfbWF4ID0ge307XG4gICAgICAgIGlmICh0aGlzLmNhcmVlcl9ncm91cF9tYXhbY2FyZWVyXSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgY29uZmlnID0gZ2RhdGEoXCJndWlsZF9za2lsbF9kYXRhXCIsIFwiZGF0YV9jYXJlZXJfbGlzdFwiLCBbY2FyZWVyXSk7XG4gICAgICAgICAgICBpZiAoY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYXJlZXJfZ3JvdXBfbWF4W2NhcmVlcl0gPSBjb25maWcubGVuZ3RoO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhcmVlcl9ncm91cF9tYXhbY2FyZWVyXSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY2FyZWVyX2dyb3VwX21heFtjYXJlZXJdO1xuICAgIH0sXG5cbiAgICAvL+WFrOS8muaKgOiDveeahOWIneWni+WMlue6oueCueeKtuaAgVxuICAgIGluaXRHdWlsZFNraWxsU3RhdHVzOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLm91dGxpbmUpIHtcbiAgICAgICAgICAgIHRoaXMuc2tpbGxfd2FpdF91cGdyYWRlX2xpc3QgPSB7fTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gZGF0YS5vdXRsaW5lKSB7XG4gICAgICAgICAgICAgICAgdmFyIHYgPSBkYXRhLm91dGxpbmVbaV07XG4gICAgICAgICAgICAgICAgdGhpcy5za2lsbF93YWl0X3VwZ3JhZGVfbGlzdFt2LmNhcmVlcl0gPSB2LnNraWxsX2lkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hlY2tHdWlsZFNraWxsUmVkU3RhdHVzKCk7XG4gICAgfSxcblxuICAgIC8v5pu05paw5b2T5YmN5oqA6IO9XG4gICAgdXBkYXRlR3VpbGRTa2lsbFN0YXR1cyhjYXJlZXIsIHNraWxsX2lkKSB7XG4gICAgICAgIGlmICh0aGlzLnNraWxsX3dhaXRfdXBncmFkZV9saXN0ID09IG51bGwpXG4gICAgICAgICAgICB0aGlzLnNraWxsX3dhaXRfdXBncmFkZV9saXN0ID0ge307XG4gICAgICAgIHRoaXMuc2tpbGxfd2FpdF91cGdyYWRlX2xpc3RbY2FyZWVyXSA9IHNraWxsX2lkO1xuICAgICAgICB0aGlzLmNoZWNrR3VpbGRTa2lsbFJlZFN0YXR1cygpO1xuICAgIH0sXG5cbiAgICAvL+WFrOS8muaKgOiDvee6oueCueeahOeul+azleabtOaWsFxuICAgIGNoZWNrR3VpbGRTa2lsbFJlZFN0YXR1czogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5za2lsbF93YWl0X3VwZ3JhZGVfbGlzdCA9PSBudWxsIHx8IFV0aWxzLm5leHQodGhpcy5za2lsbF93YWl0X3VwZ3JhZGVfbGlzdCkgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICBSZWRNZ3IuZ2V0SW5zdGFuY2UoKS5hZGRDYWxIYW5kbGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByb2xlX3ZvID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcbiAgICAgICAgICAgIHZhciBiYWNrcGFja19tb2RlbCA9IEJhY2twYWNrQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCk7XG4gICAgICAgICAgICB2YXIgcmVkX2xpc3QgPSB7fTtcbiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5za2lsbF93YWl0X3VwZ3JhZGVfbGlzdCkge1xuICAgICAgICAgICAgICAgIHZhciBza2lsbF9pZCA9IHRoaXMuc2tpbGxfd2FpdF91cGdyYWRlX2xpc3Rba107XG4gICAgICAgICAgICAgICAgdmFyIGNvbmZpZyA9IGdkYXRhKFwiZ3VpbGRfc2tpbGxfZGF0YVwiLCBcImRhdGFfaW5mb1wiLCBbc2tpbGxfaWRdKTtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZF9saXN0W2tdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5ndWlsZF9sZXYgPiByb2xlX3ZvLmd1aWxkX2xldikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVkX2xpc3Rba10gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gY29uZmlnLmxvc3MgfHwge30pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IGNvbmZpZy5sb3NzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2WzBdICE9IG51bGwgJiYgdlsxXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiaWQgPSB2WzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbnVtID0gdlsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFzc2VydCA9IENvbmZpZy5pdGVtX2RhdGEuZGF0YV9hc3NldHNfaWQybGFiZWxbYmlkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFzc2VydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bSA+IHJvbGVfdm9bYXNzZXJ0XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZF9saXN0W2tdID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdW0gPSBiYWNrcGFja19tb2RlbC5nZXRCYWNrUGFja0l0ZW1OdW1CeUJpZChiaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bSA+IHN1bSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZF9saXN0W2tdID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gcmVkX2xpc3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLmdldENhcmVlcktleShrKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUd1aWxkUmVkU3RhdHVzKGlkLCByZWRfbGlzdFtrXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKSwgUmVkSWRzLkd1aWxkU2tpbGwpXG4gICAgfSxcblxuICAgIC8v6K6+572u5LiA5Liq5ZSv5LiAaWTlkKcsIOi3nyBndWlsZGNvbnN0LnNraWxsXzIgLDMgLDQgLDXlr7nlupRcbiAgICBnZXRDYXJlZXJLZXk6IGZ1bmN0aW9uIChjYXJlZXIpIHtcbiAgICAgICAgY2FyZWVyID0gY2FyZWVyIHx8IEd1aWxkc2tpbGxDb25zdC5pbmRleC5waHlzaWNzO1xuICAgICAgICBpZiAoY2FyZWVyID09IEd1aWxkc2tpbGxDb25zdC5pbmRleC5tYWdpYylcbiAgICAgICAgICAgIHJldHVybiBHdWlsZENvbnN0LnJlZF9pbmRleC5za2lsbF8yO1xuICAgICAgICBlbHNlIGlmIChjYXJlZXIgPT0gR3VpbGRza2lsbENvbnN0LmluZGV4LnBoeXNpY3MpXG4gICAgICAgICAgICByZXR1cm4gR3VpbGRDb25zdC5yZWRfaW5kZXguc2tpbGxfM1xuICAgICAgICBlbHNlIGlmIChjYXJlZXIgPT0gR3VpbGRza2lsbENvbnN0LmluZGV4LmRlZmVuY2UpXG4gICAgICAgICAgICByZXR1cm4gR3VpbGRDb25zdC5yZWRfaW5kZXguc2tpbGxfNFxuICAgICAgICBlbHNlIGlmIChjYXJlZXIgPT0gR3VpbGRza2lsbENvbnN0LmluZGV4LmFzc2lzdClcbiAgICAgICAgICAgIHJldHVybiBHdWlsZENvbnN0LnJlZF9pbmRleC5za2lsbF81XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBHdWlsZENvbnN0LnJlZF9pbmRleC5za2lsbF8zXG5cbiAgICB9LFxuXG4gICAgLy/muIXmpZrkuLvnlYzpnaLkuIrpnaLnmoTnuqLngrlcbiAgICBjbGVhckd1aWxkU2tpbGxJY29uUmVkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmhhZF9jbG9zZV9tYWludWkgPT0gdHJ1ZSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB0aGlzLmhhZF9jbG9zZV9tYWludWkgPSB0cnVlO1xuICAgICAgICB2YXIgaXNfcmVkID0gZmFsc2U7XG4gICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5za2lsbF9yZWRfc3RhdHVzX2xpc3QpIHtcbiAgICAgICAgICAgIHZhciB2ID0gdGhpcy5za2lsbF9yZWRfc3RhdHVzX2xpc3Rba107XG4gICAgICAgICAgICBpZiAodiA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgaXNfcmVkID0gdHJ1ZVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNfcmVkID09IHRydWUpIHtcbiAgICAgICAgICAgIHZhciBkYXRhID0gW1xuICAgICAgICAgICAgICAgIHsgYmlkOiBHdWlsZENvbnN0LnJlZF9pbmRleC5za2lsbF8yLCBzdGF0dXM6IGZhbHNlIH0sIHsgYmlkOiBHdWlsZENvbnN0LnJlZF9pbmRleC5za2lsbF8zLCBzdGF0dXM6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgeyBiaWQ6IEd1aWxkQ29uc3QucmVkX2luZGV4LnNraWxsXzQsIHN0YXR1czogZmFsc2UgfSwgeyBiaWQ6IEd1aWxkQ29uc3QucmVkX2luZGV4LnNraWxsXzUsIHN0YXR1czogZmFsc2UgfVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIE1haW51aUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5zZXRCdG5SZWRQb2ludChNYWludWlDb25zdC5idG5faW5kZXguZ3VpbGQsIGRhdGEpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5pu05paw5YWs5Lya5oqA6IO957qi54K5XG4gICAgdXBkYXRlR3VpbGRSZWRTdGF0dXM6IGZ1bmN0aW9uIChiaWQsIHN0YXR1cykge1xuICAgICAgICB2YXIgYmFzZV9kYXRhID0gQ29uZmlnLmZ1bmN0aW9uX2RhdGEuZGF0YV9iYXNlO1xuICAgICAgICB2YXIgYm9vbCA9IE1haW51aUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5jaGVja0lzT3BlbkJ5QWN0aXZhdGUoYmFzZV9kYXRhWzZdLmFjdGl2YXRlKTtcbiAgICAgICAgaWYgKGJvb2wgPT0gZmFsc2UpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgdmFyIF9zdGF0dXMgPSB0aGlzLnNraWxsX3JlZF9zdGF0dXNfbGlzdFtiaWRdO1xuICAgICAgICBpZiAoX3N0YXR1cyA9PSBzdGF0dXMpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgdGhpcy5za2lsbF9yZWRfc3RhdHVzX2xpc3RbYmlkXSA9IHN0YXR1cztcblxuICAgICAgICAvL+abtOaWsOWcuuaZr+e6oueCueeKtuaAgSzlj6rlnKjnmbvlvZXnmoTml7blgJnmj5DnpLrkuIDmrKFcbiAgICAgICAgaWYgKHRoaXMuaGFkX3NlbmRfbWFpbnVpID09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLmhhZF9zZW5kX21haW51aSA9IHRydWU7XG4gICAgICAgICAgICBNYWludWlDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2V0QnRuUmVkUG9pbnQoTWFpbnVpQ29uc3QuYnRuX2luZGV4Lmd1aWxkLCB7IGJpZDogYmlkLCBzdGF0dXM6IHN0YXR1cyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8v5LqL5Lu255So5LqO5ZCM5q2l5pu05paw5YWs5Lya5Li7dWnnmoTnuqLngrlcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShHdWlsZEV2ZW50LlVwZGF0ZUd1aWxkUmVkU3RhdHVzLCBiaWQsIHN0YXR1cyk7XG4gICAgfSxcblxuICAgIGdldFJlZFN0YXR1czogZnVuY3Rpb24gKGNhcmVlcikge1xuICAgICAgICB2YXIgaWQgPSB0aGlzLmdldENhcmVlcktleShjYXJlZXIpO1xuICAgICAgICByZXR1cm4gdGhpcy5za2lsbF9yZWRfc3RhdHVzX2xpc3RbaWRdO1xuICAgIH0sXG5cbiAgICBnZXRSZWRUb3RhbFN0YXR1czogZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMuc2tpbGxfcmVkX3N0YXR1c19saXN0KSB7XG4gICAgICAgICAgICB2YXIgX3N0YXR1cyA9IHRoaXMuc2tpbGxfcmVkX3N0YXR1c19saXN0W2tdO1xuICAgICAgICAgICAgaWYgKF9zdGF0dXMgPT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG4gICAgLy8gLS3ojrflj5blkITogYzkuJrnmoTlhazkvJrmioDog73nrYnnuqdcbiAgICBnZXRDYXJlZXJTa2lsbExldmVsKGNhcmVlcil7XG4gICAgICAgIGlmKHRoaXMuY2FyZWVyX3NraWxsX2xpc3RbY2FyZWVyXSl7XG4gICAgICAgICAgICBsZXQgc2tpbGxfaWRzID0gdGhpcy5jYXJlZXJfc2tpbGxfbGlzdFtjYXJlZXJdLnNraWxsX2lkc1xuICAgICAgICAgICAgbGV0IGNvdW50ID0gdGhpcy5jYXJlZXJfc2tpbGxfbGlzdFtjYXJlZXJdLmdyb3VwX2lkcy5sZW5ndGggKiA2XG4gICAgICAgICAgICBmb3IobGV0IGk9MDtpPHNraWxsX2lkcy5sZW5ndGg7KytpKXtcbiAgICAgICAgICAgICAgICBsZXQgdiA9IHNraWxsX2lkc1tpXVxuICAgICAgICAgICAgICAgIGlmKHYuc3RhdHVzID09IEd1aWxkc2tpbGxDb25zdC5zdGF0dXMuYWN0aXZpdHkpe1xuICAgICAgICAgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb3VudFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMVxuICAgIH1cbn0pOyJdfQ==