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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/startower/startower_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, '2c1e7feMMhAvpohtfoZsaA6', 'startower_controller');
// Scripts/mod/startower/startower_controller.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//      星命塔
// <br/>Create: 2019-02-27 11:03:16
// --------------------------------------------------------------------
var MainuiController = require("mainui_controller");
 
var BattleEvent = require("battle_event");
 
var BattleController = require("battle_controller");
 
var BattleConst = require("battle_const");
 
var StartowerEvent = require("startower_event");
 
var LevupgradeController = require("levupgrade_controller");
 
var StartowerController = cc.Class({
  "extends": BaseController,
  ctor: function ctor() {},
  // 初始化配置数据
  initConfig: function initConfig() {
    var StartowerModel = require("startower_model");
 
    this.model = new StartowerModel();
    this.model.initConfig();
  },
  // 返回当前的model
  getModel: function getModel() {
    return this.model;
  },
  // 注册监听事件
  registerEvents: function registerEvents() {},
  // 注册协议接受事件
  registerProtocals: function registerProtocals() {
    this.RegisterProtocal(11320, this.handle11320); //星命塔信息
 
    this.RegisterProtocal(11321, this.handle11321); //购买挑战次数
 
    this.RegisterProtocal(11322, this.handle11322); //挑战星命塔
 
    this.RegisterProtocal(11323, this.handle11323); //推送星命塔结算
 
    this.RegisterProtocal(11324, this.handle11324); //扫荡星命塔
 
    this.RegisterProtocal(11325, this.handle11325); //请求星命塔通关录像
 
    this.RegisterProtocal(11326, this.handle11326); //推送星命塔有解锁
 
    this.RegisterProtocal(11333, this.handle11333); //分享通关录像
 
    this.RegisterProtocal(11327, this.handle11327); // 星命塔排行榜
 
    this.RegisterProtocal(11328, this.handle11328); //通关奖励
 
    this.RegisterProtocal(11329, this.handle11329);
  },
  checkIsOpen: function checkIsOpen(show_desc) {
    var open_config = Config.star_tower_data.data_tower_const.open_floor;
    if (open_config == null) return false;
    var is_open = MainuiController.getInstance().checkIsOpenByActivate(open_config.val);
 
    if (is_open == false && show_desc == true) {
      message(open_config.desc);
    }
 
    return is_open;
  },
  //打开主界面
  openMainView: function openMainView(bool) {
    if (!bool) {
      if (this.main_view) {
        this.main_view.close();
        this.main_view = null;
      }
    } else {
      if (!this.checkIsOpen(true)) return;
 
      if (!this.main_view) {
        this.main_view = Utils.createClass("star_tower_window_window", this);
      }
 
      if (this.main_view && this.main_view.isOpen() == false) {
        this.main_view.open();
      }
    }
  },
  //打开挑战主界面
  openStarTowerMainView: function openStarTowerMainView(bool, data) {
    if (bool) {
      if (!this.star_tower_window) {
        this.star_tower_window = Utils.createClass("star_tower_main_window", this);
      }
 
      if (this.star_tower_window && this.star_tower_window.isOpen() == false) {
        this.star_tower_window.open(data);
      }
    } else {
      if (this.star_tower_window) {
        this.star_tower_window.close();
        this.star_tower_window = null;
      }
    }
  },
  //打开奖励总览
  openAwardWindow: function openAwardWindow(bool) {
    if (bool) {
      if (!this.award_window) {
        this.award_window = Utils.createClass("star_tower_award_window", this);
      }
 
      if (this.award_window && this.award_window.isOpen() == false) {
        this.award_window.open();
      }
    } else {
      if (this.award_window) {
        this.award_window.close();
        this.award_window = null;
      }
    }
  },
  //打开录像界面
  openVideoWindow: function openVideoWindow(bool, data, tower) {
    if (bool) {
      if (!this.video_window) {
        this.video_window = Utils.createClass("star_tower_video_window", this);
      }
 
      if (this.video_window && this.video_window.isOpen() == false) {
        this.video_window.open([data, tower]);
      }
    } else {
      if (this.video_window) {
        this.video_window.close();
        this.video_window = null;
      }
    }
  },
  //星命塔结算
  getResultWindow: function getResultWindow() {
    return this.result_window;
  },
  //打开结算界面
  openResultWindow: function openResultWindow(bool, data) {
    if (bool == true) {
      // -- 不能直接出剧情或者引导
      LevupgradeController.getInstance().waitForOpenLevUpgrade(true);
 
      if (!this.result_window) {
        this.result_window = Utils.createClass("star_tower_result_window", this);
      }
 
      if (this.result_window && this.result_window.isOpen() == false) {
        this.result_window.open(data, BattleConst.Fight_Type.StarTower);
      }
    } else {
      if (this.result_window) {
        this.result_window.close();
        this.result_window = null;
      }
 
      if (this.is_show_lock == true && this.show_data) {//  --this.openGetWindow(true,this.show_data.tower)
      } else {
        gcore.GlobalEvent.fire(BattleEvent.CLOSE_RESULT_VIEW);
      }
 
      this.is_show_lock = false;
      this.show_data = null;
    }
  },
  //打开结算界面
  openGetWindow: function openGetWindow(bool, data) {
    if (bool == true) {
      if (!this.get_window) {
        this.get_window = Utils.createClass("star_tower_get_window", this);
      }
 
      if (this.get_window && this.get_window.isOpen() == false) {
        this.get_window.open(data);
      }
    } else {
      if (this.get_window) {
        this.get_window.close();
        this.get_window = null;
      }
    }
  },
  //请求星命塔数据
  sender11320: function sender11320() {
    this.SendProtocal(11320, {});
  },
  handle11320: function handle11320(data) {
    this.model.setStarTowerData(data);
  },
  //购买挑战次数
  sender11321: function sender11321() {
    var protocal = {};
    this.SendProtocal(11321, protocal);
  },
  handle11321: function handle11321(data) {
    message(data.msg);
    this.model.updateLessCount(data);
  },
  //挑战星命塔
  sender11322: function sender11322(tower) {
    var protocal = {};
    protocal.tower = tower;
    this.SendProtocal(11322, protocal);
  },
  handle11322: function handle11322(data) {
    message(data.msg);
    this.openStarTowerMainView(false);
  },
  //推送星命塔结算
  handle11323: function handle11323(data) {
    if (data.result == 1) {
      BattleController.getInstance().openFinishView(true, BattleConst.Fight_Type.StarTower, data);
      this.model.updateMaxTower(data);
      this.model.updateLessCount(data);
    } else {
      BattleController.getInstance().openFailFinishView(true, BattleConst.Fight_Type.StarTower, data.result, data);
    }
  },
  //扫荡星命塔
  sender11324: function sender11324(tower) {
    var protocal = {};
    protocal.tower = tower;
    this.SendProtocal(11324, protocal);
  },
  handle11324: function handle11324(data) {
    message(data.msg);
    this.model.updateLessCount(data);
  },
  //请求星命塔通关录像
  sender11325: function sender11325(tower) {
    var protocal = {};
    protocal.tower = tower;
    this.SendProtocal(11325, protocal);
  },
  handle11325: function handle11325(data) {
    message(data.msg);
    gcore.GlobalEvent.fire(StartowerEvent.Video_Data_Event, data);
  },
  handle11326: function handle11326(data) {
    this.show_data = data;
    this.is_show_lock = true; // --self:openGetWindow(true,data.tower)
  },
  //分享通关录像
  sender11333: function sender11333(replay_id, channel, tower) {
    var protocal = {};
    protocal.replay_id = replay_id;
    protocal.channel = channel;
    protocal.tower = tower;
    this.SendProtocal(11333, protocal);
  },
  handle11333: function handle11333(data) {
    message(data.msg);
 
    if (data.result == 1) {
      this.openVideoWindow(false);
    }
  },
  requestStarTowerRank: function requestStarTowerRank() {
    this.SendProtocal(11327, {});
  },
  handle11327: function handle11327(data) {
    gcore.GlobalEvent.fire(StartowerEvent.Update_Top3_rank, data.rank_lists);
  },
  //领取通关奖励
  sender11328: function sender11328(id) {
    var proto = {};
    proto.id = id;
    this.SendProtocal(11328, proto);
  },
  handle11328: function handle11328(data) {
    message(data.msg);
 
    if (data.result == 1) {
      gcore.GlobalEvent.fire(StartowerEvent.Update_Reward_Event);
    }
  },
  handle11329: function handle11329(data) {
    this.model.setRewardData(data.award_list);
    gcore.GlobalEvent.fire(StartowerEvent.Update_First_Reward_Msg);
  },
  __delete: function __delete() {
    if (this.model != null) {
      this.model.DeleteMe();
      this.model = null;
    }
  },
  getStarTowerRoot: function getStarTowerRoot() {
    if (this.main_view) return this.main_view.root_wnd;
  },
  getStarTowerChallengeRoot: function getStarTowerChallengeRoot() {
    if (this.star_tower_window) return this.star_tower_window.root_wnd;
  }
});
module.exports = StartowerController;
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxzdGFydG93ZXJcXHN0YXJ0b3dlcl9jb250cm9sbGVyLmpzIl0sIm5hbWVzIjpbIk1haW51aUNvbnRyb2xsZXIiLCJyZXF1aXJlIiwiQmF0dGxlRXZlbnQiLCJCYXR0bGVDb250cm9sbGVyIiwiQmF0dGxlQ29uc3QiLCJTdGFydG93ZXJFdmVudCIsIkxldnVwZ3JhZGVDb250cm9sbGVyIiwiU3RhcnRvd2VyQ29udHJvbGxlciIsImNjIiwiQ2xhc3MiLCJCYXNlQ29udHJvbGxlciIsImN0b3IiLCJpbml0Q29uZmlnIiwiU3RhcnRvd2VyTW9kZWwiLCJtb2RlbCIsImdldE1vZGVsIiwicmVnaXN0ZXJFdmVudHMiLCJyZWdpc3RlclByb3RvY2FscyIsIlJlZ2lzdGVyUHJvdG9jYWwiLCJoYW5kbGUxMTMyMCIsImhhbmRsZTExMzIxIiwiaGFuZGxlMTEzMjIiLCJoYW5kbGUxMTMyMyIsImhhbmRsZTExMzI0IiwiaGFuZGxlMTEzMjUiLCJoYW5kbGUxMTMyNiIsImhhbmRsZTExMzMzIiwiaGFuZGxlMTEzMjciLCJoYW5kbGUxMTMyOCIsImhhbmRsZTExMzI5IiwiY2hlY2tJc09wZW4iLCJzaG93X2Rlc2MiLCJvcGVuX2NvbmZpZyIsIkNvbmZpZyIsInN0YXJfdG93ZXJfZGF0YSIsImRhdGFfdG93ZXJfY29uc3QiLCJvcGVuX2Zsb29yIiwiaXNfb3BlbiIsImdldEluc3RhbmNlIiwiY2hlY2tJc09wZW5CeUFjdGl2YXRlIiwidmFsIiwibWVzc2FnZSIsImRlc2MiLCJvcGVuTWFpblZpZXciLCJib29sIiwibWFpbl92aWV3IiwiY2xvc2UiLCJVdGlscyIsImNyZWF0ZUNsYXNzIiwiaXNPcGVuIiwib3BlbiIsIm9wZW5TdGFyVG93ZXJNYWluVmlldyIsImRhdGEiLCJzdGFyX3Rvd2VyX3dpbmRvdyIsIm9wZW5Bd2FyZFdpbmRvdyIsImF3YXJkX3dpbmRvdyIsIm9wZW5WaWRlb1dpbmRvdyIsInRvd2VyIiwidmlkZW9fd2luZG93IiwiZ2V0UmVzdWx0V2luZG93IiwicmVzdWx0X3dpbmRvdyIsIm9wZW5SZXN1bHRXaW5kb3ciLCJ3YWl0Rm9yT3BlbkxldlVwZ3JhZGUiLCJGaWdodF9UeXBlIiwiU3RhclRvd2VyIiwiaXNfc2hvd19sb2NrIiwic2hvd19kYXRhIiwiZ2NvcmUiLCJHbG9iYWxFdmVudCIsImZpcmUiLCJDTE9TRV9SRVNVTFRfVklFVyIsIm9wZW5HZXRXaW5kb3ciLCJnZXRfd2luZG93Iiwic2VuZGVyMTEzMjAiLCJTZW5kUHJvdG9jYWwiLCJzZXRTdGFyVG93ZXJEYXRhIiwic2VuZGVyMTEzMjEiLCJwcm90b2NhbCIsIm1zZyIsInVwZGF0ZUxlc3NDb3VudCIsInNlbmRlcjExMzIyIiwicmVzdWx0Iiwib3BlbkZpbmlzaFZpZXciLCJ1cGRhdGVNYXhUb3dlciIsIm9wZW5GYWlsRmluaXNoVmlldyIsInNlbmRlcjExMzI0Iiwic2VuZGVyMTEzMjUiLCJWaWRlb19EYXRhX0V2ZW50Iiwic2VuZGVyMTEzMzMiLCJyZXBsYXlfaWQiLCJjaGFubmVsIiwicmVxdWVzdFN0YXJUb3dlclJhbmsiLCJVcGRhdGVfVG9wM19yYW5rIiwicmFua19saXN0cyIsInNlbmRlcjExMzI4IiwiaWQiLCJwcm90byIsIlVwZGF0ZV9SZXdhcmRfRXZlbnQiLCJzZXRSZXdhcmREYXRhIiwiYXdhcmRfbGlzdCIsIlVwZGF0ZV9GaXJzdF9SZXdhcmRfTXNnIiwiX19kZWxldGUiLCJEZWxldGVNZSIsImdldFN0YXJUb3dlclJvb3QiLCJyb290X3duZCIsImdldFN0YXJUb3dlckNoYWxsZW5nZVJvb3QiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLGdCQUFnQixHQUFHQyxPQUFPLENBQUMsbUJBQUQsQ0FBOUI7O0FBQ0EsSUFBSUMsV0FBVyxHQUFHRCxPQUFPLENBQUMsY0FBRCxDQUF6Qjs7QUFDQSxJQUFJRSxnQkFBZ0IsR0FBR0Ys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O0FBQ3pCLFFBQUksS0FBSzFELFNBQVQsRUFDSSxPQUFPLEtBQUtBLFNBQUwsQ0FBZTJELFFBQXRCO0FBQ1AsR0E1UzhCO0FBOFMvQkMsRUFBQUEseUJBQXlCLEVBQUUscUNBQVc7QUFDbEMsUUFBSSxLQUFLcEQsaUJBQVQsRUFDSSxPQUFPLEtBQUtBLGlCQUFMLENBQXVCbUQsUUFBOUI7QUFDUDtBQWpUOEIsQ0FBVCxDQUExQjtBQXNUQUUsTUFBTSxDQUFDQyxPQUFQLEdBQWlCcEcsbUJBQWpCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAgIOaYn+WRveWhlFxuLy8gPGJyLz5DcmVhdGU6IDIwMTktMDItMjcgMTE6MDM6MTZcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgTWFpbnVpQ29udHJvbGxlciA9IHJlcXVpcmUoXCJtYWludWlfY29udHJvbGxlclwiKTtcbnZhciBCYXR0bGVFdmVudCA9IHJlcXVpcmUoXCJiYXR0bGVfZXZlbnRcIik7XG52YXIgQmF0dGxlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJiYXR0bGVfY29udHJvbGxlclwiKTtcbnZhciBCYXR0bGVDb25zdCA9IHJlcXVpcmUoXCJiYXR0bGVfY29uc3RcIik7XG52YXIgU3RhcnRvd2VyRXZlbnQgPSByZXF1aXJlKFwic3RhcnRvd2VyX2V2ZW50XCIpO1xudmFyIExldnVwZ3JhZGVDb250cm9sbGVyID0gcmVxdWlyZShcImxldnVwZ3JhZGVfY29udHJvbGxlclwiKVxuXG5cbnZhciBTdGFydG93ZXJDb250cm9sbGVyID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VDb250cm9sbGVyLFxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICB9LFxuXG4gICAgLy8g5Yid5aeL5YyW6YWN572u5pWw5o2uXG4gICAgaW5pdENvbmZpZzogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgU3RhcnRvd2VyTW9kZWwgPSByZXF1aXJlKFwic3RhcnRvd2VyX21vZGVsXCIpO1xuXG4gICAgICAgIHRoaXMubW9kZWwgPSBuZXcgU3RhcnRvd2VyTW9kZWwoKTtcbiAgICAgICAgdGhpcy5tb2RlbC5pbml0Q29uZmlnKCk7XG4gICAgfSxcblxuICAgIC8vIOi/lOWbnuW9k+WJjeeahG1vZGVsXG4gICAgZ2V0TW9kZWw6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWw7XG4gICAgfSxcblxuICAgIC8vIOazqOWGjOebkeWQrOS6i+S7tlxuICAgIHJlZ2lzdGVyRXZlbnRzOiBmdW5jdGlvbiAoKSB7XG4gICAgfSxcblxuICAgIC8vIOazqOWGjOWNj+iuruaOpeWPl+S6i+S7tlxuICAgIHJlZ2lzdGVyUHJvdG9jYWxzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMTMyMCwgdGhpcy5oYW5kbGUxMTMyMCkgICAgIC8v5pif5ZG95aGU5L+h5oGvXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMTMyMSwgdGhpcy5oYW5kbGUxMTMyMSkgICAgIC8v6LSt5Lmw5oyR5oiY5qyh5pWwXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMTMyMiwgdGhpcy5oYW5kbGUxMTMyMikgICAgIC8v5oyR5oiY5pif5ZG95aGUXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMTMyMywgdGhpcy5oYW5kbGUxMTMyMykgICAgIC8v5o6o6YCB5pif5ZG95aGU57uT566XXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMTMyNCwgdGhpcy5oYW5kbGUxMTMyNCkgICAgIC8v5omr6I2h5pif5ZG95aGUXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMTMyNSwgdGhpcy5oYW5kbGUxMTMyNSkgICAgIC8v6K+35rGC5pif5ZG95aGU6YCa5YWz5b2V5YOPXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMTMyNiwgdGhpcy5oYW5kbGUxMTMyNikgICAgIC8v5o6o6YCB5pif5ZG95aGU5pyJ6Kej6ZSBXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMTMzMywgdGhpcy5oYW5kbGUxMTMzMykgICAgIC8v5YiG5Lqr6YCa5YWz5b2V5YOPXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMTMyNywgdGhpcy5oYW5kbGUxMTMyNykgICAgIC8vIOaYn+WRveWhlOaOkuihjOamnFxuXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMTMyOCwgdGhpcy5oYW5kbGUxMTMyOCkgICAgIC8v6YCa5YWz5aWW5YqxXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMTMyOSwgdGhpcy5oYW5kbGUxMTMyOSlcbiAgICB9LFxuXG4gICAgY2hlY2tJc09wZW46ZnVuY3Rpb24oc2hvd19kZXNjKXtcbiAgICAgICAgdmFyIG9wZW5fY29uZmlnID0gQ29uZmlnLnN0YXJfdG93ZXJfZGF0YS5kYXRhX3Rvd2VyX2NvbnN0Lm9wZW5fZmxvb3I7XG4gICAgICAgIGlmKG9wZW5fY29uZmlnID09IG51bGwpcmV0dXJuIGZhbHNlO1xuICAgICAgICB2YXIgaXNfb3BlbiA9IE1haW51aUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5jaGVja0lzT3BlbkJ5QWN0aXZhdGUob3Blbl9jb25maWcudmFsKTtcbiAgICAgICAgaWYoaXNfb3BlbiA9PSBmYWxzZSAmJiBzaG93X2Rlc2MgPT0gdHJ1ZSl7XG4gICAgICAgICAgICBtZXNzYWdlKG9wZW5fY29uZmlnLmRlc2MpICAgIFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc19vcGVuO1xuICAgIH0sXG4gICAgXG4gICAgLy/miZPlvIDkuLvnlYzpnaJcbiAgICBvcGVuTWFpblZpZXc6ZnVuY3Rpb24oYm9vbCl7XG4gICAgICAgIGlmKCFib29sKXtcbiAgICAgICAgICAgIGlmKHRoaXMubWFpbl92aWV3KXtcbiAgICAgICAgICAgICAgICB0aGlzLm1haW5fdmlldy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMubWFpbl92aWV3ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpZighdGhpcy5jaGVja0lzT3Blbih0cnVlKSlyZXR1cm47XG4gICAgICAgICAgICBpZighdGhpcy5tYWluX3ZpZXcpe1xuICAgICAgICAgICAgICAgIHRoaXMubWFpbl92aWV3ID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJzdGFyX3Rvd2VyX3dpbmRvd193aW5kb3dcIix0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHRoaXMubWFpbl92aWV3ICYmIHRoaXMubWFpbl92aWV3LmlzT3BlbigpID09IGZhbHNlKXtcbiAgICAgICAgICAgICAgICB0aGlzLm1haW5fdmlldy5vcGVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+aJk+W8gOaMkeaImOS4u+eVjOmdolxuICAgIG9wZW5TdGFyVG93ZXJNYWluVmlldzpmdW5jdGlvbihib29sLGRhdGEpe1xuICAgICAgICBpZihib29sKXtcbiAgICAgICAgICAgIGlmKCF0aGlzLnN0YXJfdG93ZXJfd2luZG93KXtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJfdG93ZXJfd2luZG93ID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJzdGFyX3Rvd2VyX21haW5fd2luZG93XCIsdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZih0aGlzLnN0YXJfdG93ZXJfd2luZG93ICYmIHRoaXMuc3Rhcl90b3dlcl93aW5kb3cuaXNPcGVuKCkgPT0gZmFsc2Upe1xuICAgICAgICAgICAgICAgIHRoaXMuc3Rhcl90b3dlcl93aW5kb3cub3BlbihkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGlmKHRoaXMuc3Rhcl90b3dlcl93aW5kb3cpe1xuICAgICAgICAgICAgICAgIHRoaXMuc3Rhcl90b3dlcl93aW5kb3cuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJfdG93ZXJfd2luZG93ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+aJk+W8gOWlluWKseaAu+iniFxuICAgIG9wZW5Bd2FyZFdpbmRvdzpmdW5jdGlvbihib29sKXtcbiAgICAgICAgaWYoYm9vbCl7XG4gICAgICAgICAgICBpZighdGhpcy5hd2FyZF93aW5kb3cpe1xuICAgICAgICAgICAgICAgIHRoaXMuYXdhcmRfd2luZG93ID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJzdGFyX3Rvd2VyX2F3YXJkX3dpbmRvd1wiLHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYodGhpcy5hd2FyZF93aW5kb3cgJiYgdGhpcy5hd2FyZF93aW5kb3cuaXNPcGVuKCkgPT0gZmFsc2Upe1xuICAgICAgICAgICAgICAgIHRoaXMuYXdhcmRfd2luZG93Lm9wZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGlmKHRoaXMuYXdhcmRfd2luZG93KXtcbiAgICAgICAgICAgICAgICB0aGlzLmF3YXJkX3dpbmRvdy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYXdhcmRfd2luZG93ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+aJk+W8gOW9leWDj+eVjOmdolxuICAgIG9wZW5WaWRlb1dpbmRvdzpmdW5jdGlvbihib29sLGRhdGEsdG93ZXIpe1xuICAgICAgICBpZihib29sKXtcbiAgICAgICAgICAgIGlmKCF0aGlzLnZpZGVvX3dpbmRvdyl7XG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb193aW5kb3cgPSBVdGlscy5jcmVhdGVDbGFzcyhcInN0YXJfdG93ZXJfdmlkZW9fd2luZG93XCIsdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZih0aGlzLnZpZGVvX3dpbmRvdyAmJiB0aGlzLnZpZGVvX3dpbmRvdy5pc09wZW4oKSA9PSBmYWxzZSl7XG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb193aW5kb3cub3BlbihbZGF0YSx0b3dlcl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgaWYodGhpcy52aWRlb193aW5kb3cpe1xuICAgICAgICAgICAgICAgIHRoaXMudmlkZW9fd2luZG93LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb193aW5kb3cgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5pif5ZG95aGU57uT566XXG4gICAgZ2V0UmVzdWx0V2luZG93OmZ1bmN0aW9uKCl7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc3VsdF93aW5kb3c7XG4gICAgfSxcblxuICAgIFxuXG4gICAgLy/miZPlvIDnu5PnrpfnlYzpnaJcbiAgICBvcGVuUmVzdWx0V2luZG93OmZ1bmN0aW9uKGJvb2wsZGF0YSl7XG4gICAgICAgIGlmKGJvb2wgPT0gdHJ1ZSl7XG4gICAgICAgICAgICAvLyAtLSDkuI3og73nm7TmjqXlh7rliafmg4XmiJbogIXlvJXlr7xcbiAgICAgICAgICAgIExldnVwZ3JhZGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkud2FpdEZvck9wZW5MZXZVcGdyYWRlKHRydWUpIFxuICAgICAgICAgICAgaWYoIXRoaXMucmVzdWx0X3dpbmRvdyl7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRfd2luZG93ID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJzdGFyX3Rvd2VyX3Jlc3VsdF93aW5kb3dcIix0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHRoaXMucmVzdWx0X3dpbmRvdyAmJiB0aGlzLnJlc3VsdF93aW5kb3cuaXNPcGVuKCkgPT0gZmFsc2Upe1xuICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0X3dpbmRvdy5vcGVuKGRhdGEsIEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuU3RhclRvd2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGlmKHRoaXMucmVzdWx0X3dpbmRvdyl7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRfd2luZG93LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRfd2luZG93ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHRoaXMuaXNfc2hvd19sb2NrID09IHRydWUgJiYgdGhpcy5zaG93X2RhdGEpe1xuICAgICAgICAgICAgICAgIC8vICAtLXRoaXMub3BlbkdldFdpbmRvdyh0cnVlLHRoaXMuc2hvd19kYXRhLnRvd2VyKVxuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShCYXR0bGVFdmVudC5DTE9TRV9SRVNVTFRfVklFVyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmlzX3Nob3dfbG9jayA9ZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNob3dfZGF0YSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/miZPlvIDnu5PnrpfnlYzpnaJcbiAgICBvcGVuR2V0V2luZG93OmZ1bmN0aW9uKGJvb2wsZGF0YSl7XG4gICAgICAgIGlmKGJvb2wgPT0gdHJ1ZSl7XG4gICAgICAgICAgICBpZighdGhpcy5nZXRfd2luZG93KXtcbiAgICAgICAgICAgICAgICB0aGlzLmdldF93aW5kb3cgPSBVdGlscy5jcmVhdGVDbGFzcyhcInN0YXJfdG93ZXJfZ2V0X3dpbmRvd1wiLHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYodGhpcy5nZXRfd2luZG93ICYmIHRoaXMuZ2V0X3dpbmRvdy5pc09wZW4oKSA9PSBmYWxzZSl7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRfd2luZG93Lm9wZW4oZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpZih0aGlzLmdldF93aW5kb3cpe1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0X3dpbmRvdy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0X3dpbmRvdyA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG5cbiAgICAvL+ivt+axguaYn+WRveWhlOaVsOaNrlxuICAgIHNlbmRlcjExMzIwOmZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDExMzIwLHt9KVxuICAgIH0sXG5cbiAgICBoYW5kbGUxMTMyMDpmdW5jdGlvbiggZGF0YSApe1xuICAgICAgICB0aGlzLm1vZGVsLnNldFN0YXJUb3dlckRhdGEoZGF0YSk7XG4gICAgfSxcblxuICAgIC8v6LSt5Lmw5oyR5oiY5qyh5pWwXG4gICAgc2VuZGVyMTEzMjE6ZnVuY3Rpb24oKXtcbiAgICAgICAgdmFyIHByb3RvY2FsID17fTtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTEzMjEscHJvdG9jYWwpO1xuICAgIH0sXG4gICAgICAgIFxuICAgIGhhbmRsZTExMzIxOmZ1bmN0aW9uKCBkYXRhICl7XG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpO1xuICAgICAgICB0aGlzLm1vZGVsLnVwZGF0ZUxlc3NDb3VudChkYXRhKTtcbiAgICB9LFxuXG4gICAgLy/mjJHmiJjmmJ/lkb3loZRcbiAgICBzZW5kZXIxMTMyMjpmdW5jdGlvbih0b3dlcil7XG4gICAgICAgIHZhciBwcm90b2NhbCA9e307XG4gICAgICAgIHByb3RvY2FsLnRvd2VyID0gdG93ZXI7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDExMzIyLHByb3RvY2FsKTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMTEzMjI6ZnVuY3Rpb24oIGRhdGEgKXtcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZyk7XG4gICAgICAgIHRoaXMub3BlblN0YXJUb3dlck1haW5WaWV3KGZhbHNlKTtcbiAgICB9LFxuXG4gICAgLy/mjqjpgIHmmJ/lkb3loZTnu5PnrpdcbiAgICBoYW5kbGUxMTMyMzpmdW5jdGlvbiggZGF0YSApe1xuICAgICAgICBpZihkYXRhLnJlc3VsdCA9PSAxKXtcbiAgICAgICAgICAgIEJhdHRsZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5vcGVuRmluaXNoVmlldyh0cnVlLCBCYXR0bGVDb25zdC5GaWdodF9UeXBlLlN0YXJUb3dlciwgZGF0YSk7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLnVwZGF0ZU1heFRvd2VyKGRhdGEpO1xuICAgICAgICAgICAgdGhpcy5tb2RlbC51cGRhdGVMZXNzQ291bnQoZGF0YSk7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgQmF0dGxlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLm9wZW5GYWlsRmluaXNoVmlldyh0cnVlLCBCYXR0bGVDb25zdC5GaWdodF9UeXBlLlN0YXJUb3dlciwgZGF0YS5yZXN1bHQsIGRhdGEpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/miavojaHmmJ/lkb3loZRcbiAgICBzZW5kZXIxMTMyNDpmdW5jdGlvbih0b3dlcil7XG4gICAgICAgIHZhciBwcm90b2NhbCA9e307XG4gICAgICAgIHByb3RvY2FsLnRvd2VyID0gdG93ZXI7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDExMzI0LHByb3RvY2FsKTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMTEzMjQ6ZnVuY3Rpb24oIGRhdGEgKXtcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZyk7XG4gICAgICAgIHRoaXMubW9kZWwudXBkYXRlTGVzc0NvdW50KGRhdGEpO1xuICAgIH0sXG5cbiAgICAvL+ivt+axguaYn+WRveWhlOmAmuWFs+W9leWDj1xuICAgIHNlbmRlcjExMzI1OmZ1bmN0aW9uKHRvd2VyKXtcbiAgICAgICAgdmFyIHByb3RvY2FsID17fTtcbiAgICAgICAgcHJvdG9jYWwudG93ZXIgPSB0b3dlcjtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTEzMjUscHJvdG9jYWwpO1xuICAgIH0sXG4gICAgXG4gICAgaGFuZGxlMTEzMjU6ZnVuY3Rpb24oIGRhdGEgKXtcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZyk7XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoU3RhcnRvd2VyRXZlbnQuVmlkZW9fRGF0YV9FdmVudCxkYXRhKVxuICAgIH0sXG5cbiAgICBoYW5kbGUxMTMyNjpmdW5jdGlvbiggZGF0YSApe1xuICAgICAgICB0aGlzLnNob3dfZGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMuaXNfc2hvd19sb2NrID0gdHJ1ZTtcbiAgICAgICAgLy8gLS1zZWxmOm9wZW5HZXRXaW5kb3codHJ1ZSxkYXRhLnRvd2VyKVxuICAgIH0sXG5cbiAgICAvL+WIhuS6q+mAmuWFs+W9leWDj1xuICAgIHNlbmRlcjExMzMzOmZ1bmN0aW9uKHJlcGxheV9pZCxjaGFubmVsLHRvd2VyKXtcbiAgICAgICAgdmFyIHByb3RvY2FsID17fTtcbiAgICAgICAgcHJvdG9jYWwucmVwbGF5X2lkID0gcmVwbGF5X2lkO1xuICAgICAgICBwcm90b2NhbC5jaGFubmVsID0gY2hhbm5lbDtcbiAgICAgICAgcHJvdG9jYWwudG93ZXIgPSB0b3dlcjtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTEzMzMscHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICBoYW5kbGUxMTMzMzpmdW5jdGlvbiggZGF0YSApe1xuICAgICAgICBtZXNzYWdlKGRhdGEubXNnKTtcbiAgICAgICAgaWYoZGF0YS5yZXN1bHQgPT0gMSl7XG4gICAgICAgICAgICB0aGlzLm9wZW5WaWRlb1dpbmRvdyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVxdWVzdFN0YXJUb3dlclJhbms6ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTEzMjcse30pO1xuICAgIH0sXG5cbiAgICBoYW5kbGUxMTMyNzpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShTdGFydG93ZXJFdmVudC5VcGRhdGVfVG9wM19yYW5rLCBkYXRhLnJhbmtfbGlzdHMpO1xuICAgIH0sXG5cbiAgICAvL+mihuWPlumAmuWFs+WlluWKsVxuICAgIHNlbmRlcjExMzI4OmZ1bmN0aW9uKGlkKXtcbiAgICAgICAgdmFyIHByb3RvID0ge307XG4gICAgICAgIHByb3RvLmlkID0gaWQ7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDExMzI4LCBwcm90byk7XG4gICAgfSxcblxuICAgIGhhbmRsZTExMzI4OmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICBtZXNzYWdlKGRhdGEubXNnKTtcbiAgICAgICAgaWYoZGF0YS5yZXN1bHQgPT0gMSl7XG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKFN0YXJ0b3dlckV2ZW50LlVwZGF0ZV9SZXdhcmRfRXZlbnQpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGhhbmRsZTExMzI5OmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICB0aGlzLm1vZGVsLnNldFJld2FyZERhdGEoZGF0YS5hd2FyZF9saXN0KTtcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShTdGFydG93ZXJFdmVudC5VcGRhdGVfRmlyc3RfUmV3YXJkX01zZyk7XG4gICAgfSxcblxuICAgIF9fZGVsZXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLm1vZGVsICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMubW9kZWwuRGVsZXRlTWUoKTtcbiAgICAgICAgICAgIHRoaXMubW9kZWwgPSBudWxsO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldFN0YXJUb3dlclJvb3Q6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5tYWluX3ZpZXcpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYWluX3ZpZXcucm9vdF93bmQ7XG4gICAgfSxcblxuICAgIGdldFN0YXJUb3dlckNoYWxsZW5nZVJvb3Q6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5zdGFyX3Rvd2VyX3dpbmRvdylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXJfdG93ZXJfd2luZG93LnJvb3Rfd25kO1xuICAgIH0sXG5cblxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3RhcnRvd2VyQ29udHJvbGxlcjsiXX0=