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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/common/baseview.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, '84f60JmoNFGgILvSODq68no', 'baseview');
// Scripts/common/baseview.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: shiraho@syg.com(必填, 创建模块的人员)
// @description:
//      所有窗体的显示基类
// <br/>Create: new Date().toISOString()
// --------------------------------------------------------------------
var LoaderManager = require("loadermanager");
 
var ViewClass = require("viewclass");
 
window.BaseView = cc.Class({
  "extends": ViewClass,
  // inifPrefab: true,
  ctor: function ctor() {
    this.viewTag = SCENE_TAG.win;
    this.win_type = WinType.Big;
    this.wating = true; // this.active_status = true;
 
    this.is_close = false;
    this.close_is_map = false;
    this.prefabPath = "";
    this.root_wnd = null;
    this.base_view_event_list = {}; // this.res_list = {}
 
    this.is_battle_hide = true;
    this.is_loading = false;
    this.is_before_battle = false;
    this.initConfig();
  },
  statics: {
    winMap: []
  },
  // 打开窗体的主入口
  open: function open(params) {
    this.open_params = params;
 
    if (this.root_wnd) {
      this.openRootWnd(params);
 
      if (this.active_status == false) {
        this.setVisible(true);
      }
 
      var GuideEvent = require("guide_event");
 
      if (GuideEvent) gcore.GlobalEvent.fire(GuideEvent.OpenTaskEffect, this.root_wnd);
    } else {
      var self = this;
      if (this.is_loading) return;
      this.is_loading = true;
 
      if (!this.waiting_timer && this.wating && !window.hide_loading) {
        this.waiting_timer = gcore.Timer.set(function () {
          this.is_wating = true;
          game.updateWaitingStatus(WaitingStaus.LOADING);
        }.bind(this), 1500, 1);
      }
 
      LoaderManager.getInstance().loadRes(this.prefabPath, function (res_object) {
        if (this.waiting_timer) {
          gcore.Timer.del(this.waiting_timer);
          this.waiting_timer = null;
        }
 
        if (this.is_wating) {
          game.updateWaitingStatus();
          this.is_wating = false;
        }
 
        if (this.is_close) {
          return;
        }
 
        this.is_loading = false;
        this.root_wnd = res_object;
        this.root_wnd.setPosition(-SCREEN_WIDTH * 0.5, -SCREEN_HEIGHT * 0.5);
        ViewManager.getInstance().addToSceneNode(this.root_wnd, this.viewTag); // 还未加载完成的时候设置了不可见,那么直接隐藏掉
 
        if (self.fastShowThenHide) {
          self.fastShowThenHide = false;
          self.setVisible(false);
        } // 打开回调
 
 
        this.openCallBack(); // 开启注册时间
 
        this.registerEvent(); // 数据设置
 
        self.openRootWnd(self.open_params); // 缓存窗体数据
 
        this.openCacheView();
        if (this.root_wnd_cb) this.root_wnd_cb(this.root_wnd);
 
        var GuideEvent = require("guide_event");
 
        if (GuideEvent) gcore.GlobalEvent.fire(GuideEvent.OpenTaskEffect, this.root_wnd);
      }.bind(this));
    }
  },
 
  /**
   * 关闭窗体
   * @param {*} dis_map 是都断开关闭窗体的连接关系,如果是调用closeallwindow,则不需要连接,既closeCacheView的逻辑处理
   */
  close: function close(dis_map) {
    if (this.is_close) {
      return;
    }
 
    if (dis_map && dis_map instanceof Object) {
      this.close_is_map = dis_map.close_win || false;
    }
 
    this.closeCacheView();
    this.is_close = true;
    this.closeCallBack();
    this.deleteMe(); // this.removeGlobalEvent();
    // if(this.root_wnd){
    //     this.root_wnd.destroyAllChildren();
    //     this.root_wnd.destroy();
    //     this.root_wnd = null;
    // }
    // // LoaderManager.getInstance().deleteRes(this.prefabPath);
    // LoaderManager.getInstance().releasePrefab(this.prefabPath);
    // for(var key in this.res_list){
    //     LoaderManager.getInstance().releaseRes(key)
    // }
  },
  deleteMe: function deleteMe() {
    this._super();
  },
  checkWinType: function checkWinType(type) {
    return type == WinType.Mini || type == WinType.Tips;
  },
  // 对打开过的窗体做缓存处理
  openCacheView: function openCacheView() {
    if (this.prefabPath == "prefab/chat/chat_window.prefab") {
      return;
    }
 
    BaseView.winMap.push(this);
    var length = BaseView.winMap;
 
    if (length > 1) {
      var next_index = length - 2; // 倒数第二个窗体的下表 
 
      var lastWin = BaseView.winMap[next_index]; // 如果这个面板的上一个面板是一个mini窗体的话,那么关闭掉上一个mini窗体,并且把改mini窗体的下一个窗体指向当前窗体
 
      if (lastWin && this.checkWinType(lastWin.win_type) && this.win_type != WinType.Mini) {
        BaseView.winMap.splice(next_index, 1);
        lastWin.top_win = null;
        lastWin.next_win = null;
 
        if (lastWin.close) {
          lastWin.close();
        }
      } // 取出当前窗体的上一个窗体,做关联
 
 
      var next_index_to = BaseView.winMap.length - 2;
 
      if (next_index_to && next_index_to.active_status == true) {
        this.top_win = next_index_to;
        next_index_to.next_win = this;
 
        if (!this.checkWinType(this.win_type)) {
          this.top_win.setVisible(false);
        }
      }
    } // 如果是全屏窗体,则需要有隐藏掉主场景,和战斗场景
 
 
    if (this.win_type == WinType.Full) {
      var mainSceneController = require("mainscene_controller").getInstance();
 
      mainSceneController.handleSceneStatus(false);
 
      var battleSceneController = require("battle_controller").getInstance();
 
      battleSceneController.handleBattleSceneStatus(false);
 
      var mainUiController = require("mainui_controller").getInstance();
 
      mainUiController.openMainUI(false);
    }
  },
  // 关闭窗体的时候做处理,
  closeCacheView: function closeCacheView() {
    var array = BaseView.winMap;
 
    for (var index = 0; index < array.length; index++) {
      var element = array[index];
 
      if (element == this) {
        if (this.top_win && !this.close_is_map) {
          // 如果这个窗体存在上一个窗体,那么没有下一个窗体的时候,打开上一个窗体,如果有下一个窗体,则把上一个窗体的下一个窗体变成自身的下一个窗体,进行关联
          if (this.is_battle_hide == false) {// 旧版本的众神战场有这样的需求,界面进战斗不消失.现在基本上没有
          } else if (this.next_win == null || this.next_win.win_type != WinType.Full) {
            this.top_win.setVisible(true);
          }
 
          this.top_win.next_win = null;
 
          if (this.next_win) {
            this.top_win.next_win = this.next_win;
            this.next_win.top_win = this.top_win;
          }
        } // 删除掉这个
 
 
        BaseView.winMap.splice(index, 1);
        break;
      }
    } // 如果没有窗体,或者没有全屏窗体,则显示出主城和主战斗场景
 
 
    if (BaseView.winMap.length == 0 || !this.isFullWinExist()) {
      var battleSceneController = require("battle_controller").getInstance();
 
      if (battleSceneController.hadBattleScene()) {
        // 如果在战斗中  
        battleSceneController.handleBattleSceneStatus(true);
      } else {
        var mainUiController = require("mainui_controller").getInstance();
 
        var btn_index = mainUiController.getMainUIIndex();
 
        var MainUiConst = require("mainui_const");
 
        if (btn_index != MainUiConst.btn_index.drama_scene) {
          var mainSceneController = require("mainscene_controller").getInstance();
 
          mainSceneController.handleSceneStatus(true);
        }
      }
    }
  },
  isFullWinExist: function isFullWinExist() {
    var array = BaseView.winMap;
 
    for (var index = 0; index < array.length; index++) {
      var element = array[index];
 
      if (element.win_type == WinType.Full && element.is_before_battle == false) {
        return true;
      }
    }
 
    return false;
  },
  setVisible: function setVisible(status) {
    if (this.active_status == status) {
      return;
    }
 
    this.active_status = status;
 
    if (this.root_wnd) {
      this.root_wnd.active = status;
    } else {
      this.fastShowThenHide = status;
    }
  },
  getVisible: function getVisible(status) {
    return this.active_status;
  },
  getRootWnd: function getRootWnd(cb) {
    this.root_wnd_cb = cb;
    if (this.root_wnd) this.root_wnd_cb(this.root_wnd);
  },
  // 初始化一些基础数据
  initConfig: function initConfig() {},
  // 子类中实现,
  openRootWnd: function openRootWnd() {},
  // 注册监听事件,子类中实现
  registerEvent: function registerEvent() {},
  // 打开界面之后回调,子类中实现
  openCallBack: function openCallBack() {},
  // 关闭界面之后的回调,子类中实现
  closeCallBack: function closeCallBack() {}
});
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcY29tbW9uXFxiYXNldmlldy5qcyJdLCJuYW1lcyI6WyJMb2FkZXJNYW5hZ2VyIiwicmVxdWlyZSIsIlZpZXdDbGFzcyIsIndpbmRvdyIsIkJhc2VWaWV3IiwiY2MiLCJDbGFzcyIsImN0b3IiLCJ2aWV3VGFnIiwiU0NFTkVfVEFHIiwid2luIiwid2luX3R5cGUiLCJXaW5UeXBlIiwiQmlnIiwid2F0aW5nIiwiaXNfY2xvc2UiLCJjbG9zZV9pc19tYXAiLCJwcmVmYWJQYXRoIiwicm9vdF93bmQiLCJiYXNlX3ZpZXdfZXZlbnRfbGlzdCIsImlzX2JhdHRsZV9oaWRlIiwiaXNfbG9hZGluZyIsImlzX2JlZm9yZV9iYXR0bGUiLCJpbml0Q29uZmlnIiwic3RhdGljcyIsIndpbk1hcCIsIm9wZW4iLCJwYXJhbXMiLCJvcGVuX3BhcmFtcyIsIm9wZW5Sb290V25kIiwiYWN0aXZlX3N0YXR1cyIsInNldFZpc2libGUiLCJHdWlkZUV2ZW50IiwiZ2NvcmUiLCJHbG9iYWxFdmVudCIsImZpcmUiLCJPcGVuVGFza0VmZmVjdCIsInNlbGYiLCJ3YWl0aW5nX3RpbWVyIiwiaGlkZV9sb2FkaW5nIiwiVGltZXIiLCJzZXQiLCJpc193YXRpbmciLCJnYW1lIiwidXBkYXRlV2FpdGluZ1N0YXR1cyIsIldhaXRpbmdTdGF1cyIsIkxPQURJTkciLCJiaW5kIiwiZ2V0SW5zdGFuY2UiLCJsb2FkUmVzIiwicmVzX29iamVjdCIsImRlbCIsInNldFBvc2l0aW9uIiwiU0NSRUVOX1dJRFRIIiwiU0NSRUVOX0hFSUdIVCIsIlZpZXdNYW5hZ2VyIiwiYWRkVG9TY2VuZU5vZGUiLCJmYXN0U2hvd1RoZW5IaWRlIiwib3BlbkNhbGxCYWNrIiwicmVnaXN0ZXJFdmVudCIsIm9wZW5DYWNoZVZpZXciLCJyb290X3duZF9jYiIsImNsb3NlIiwiZGlzX21hcCIsIk9iamVjdCIsImNsb3NlX3dpbiIsImNsb3NlQ2FjaGVWaWV3IiwiY2xvc2VDYWxsQmFjayIsImRlbGV0ZU1lIiwiX3N1cGVyIiwiY2hlY2tXaW5UeXBlIiwidHlwZSIsIk1pbmkiLCJUaXBzIiwicHVzaCIsImxlbmd0aCIsIm5leHRfaW5kZXgiLCJsYXN0V2luIiwic3BsaWNlIiwidG9wX3dpbiIsIm5leHRfd2luIiwibmV4dF9pbmRleF90byIsIkZ1bGwiLCJtYWluU2NlbmVDb250cm9sbGVyIiwiaGFuZGxlU2NlbmVTdGF0dXMiLCJiYXR0bGVTY2VuZUNvbnRyb2xsZXIiLCJoYW5kbGVCYXR0bGVTY2VuZVN0YXR1cyIsIm1haW5VaUNvbnRyb2xsZXIiLCJvcGVuTWFpblVJIiwiYXJyYXkiLCJpbmRleCIsImVsZW1lbnQiLCJpc0Z1bGxXaW5FeGlzdCIsImhhZEJhdHRsZVNjZW5lIiwiYnRuX2luZGV4IiwiZ2V0TWFpblVJSW5kZXgiLCJNYWluVWlDb25zdCIsImRyYW1hX3NjZW5lIiwic3RhdHVzIiwiYWN0aXZlIiwiZ2V0VmlzaWJsZSIsImdldFJvb3RXbmQiLCJjYiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQSxhQUFhLEdBQUdDLE9BQU8sQ0FBQyxlQUFELENBQTNCOztBQUNBLElBQUlDLFNBQVMsR0FBR0QsT0FBTyxDQUFDLFdBQUQsQ0FBdkI7O0FBQ0FFLE1BQU0sQ0FBQ0MsUUFBUCxHQUFrQkMsRUFBRSxDQUFDQyxLQUFILENBQVM7QUFDdkIsYUFBU0osU0FEYztBQUV2QjtBQUNBSyxFQUFBQSxJQUFJLEVBQUUsZ0JBQVk7QUFDZCxTQUFLQyxPQUFMLEdBQWVDLFNBQVMsQ0FBQ0MsR0FBekI7QUFDQSxTQUFLQyxRQUFMLEdBQWdCQyxPQUFPLENBQUNDLEdBQXhCO0FBQ0EsU0FBS0MsTUFBTCxHQUFjLElBQWQsQ0FIYyxDQUlkOztBQUNBLFNBQUtDLFFBQUwsR0FBZ0IsS0FBaEI7QUFDQSxTQUFLQyxZQUFMLEdBQW9CLEtBQXBCO0FBQ0EsU0FBS0MsVUFBTCxHQUFrQixFQUFsQjtBQUNBLFNBQUtDLFFBQUws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QUNQLEdBNU9zQjtBQThPdkI7QUFDQUssRUFBQUEsVUFBVSxFQUFFLHNCQUFZLENBQUcsQ0EvT0o7QUFpUHZCO0FBQ0FNLEVBQUFBLFdBQVcsRUFBRSx1QkFBWSxDQUFHLENBbFBMO0FBb1B2QjtBQUNBOEIsRUFBQUEsYUFBYSxFQUFFLHlCQUFZLENBQUcsQ0FyUFA7QUF1UHZCO0FBQ0FELEVBQUFBLFlBQVksRUFBRSx3QkFBWSxDQUFHLENBeFBOO0FBMFB2QjtBQUNBUyxFQUFBQSxhQUFhLEVBQUUseUJBQVksQ0FBRztBQTNQUCxDQUFULENBQWxCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogc2hpcmFob0BzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgICDmiYDmnInnqpfkvZPnmoTmmL7npLrln7rnsbtcbi8vIDxici8+Q3JlYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgTG9hZGVyTWFuYWdlciA9IHJlcXVpcmUoXCJsb2FkZXJtYW5hZ2VyXCIpO1xudmFyIFZpZXdDbGFzcyA9IHJlcXVpcmUoXCJ2aWV3Y2xhc3NcIik7XG53aW5kb3cuQmFzZVZpZXcgPSBjYy5DbGFzcyh7XG4gICAgZXh0ZW5kczogVmlld0NsYXNzLFxuICAgIC8vIGluaWZQcmVmYWI6IHRydWUsXG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnZpZXdUYWcgPSBTQ0VORV9UQUcud2luO1xuICAgICAgICB0aGlzLndpbl90eXBlID0gV2luVHlwZS5CaWc7XG4gICAgICAgIHRoaXMud2F0aW5nID0gdHJ1ZTtcbiAgICAgICAgLy8gdGhpcy5hY3RpdmVfc3RhdHVzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pc19jbG9zZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNsb3NlX2lzX21hcCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnByZWZhYlBhdGggPSBcIlwiO1xuICAgICAgICB0aGlzLnJvb3Rfd25kID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYXNlX3ZpZXdfZXZlbnRfbGlzdCA9IHt9O1xuICAgICAgICAvLyB0aGlzLnJlc19saXN0ID0ge31cbiAgICAgICAgdGhpcy5pc19iYXR0bGVfaGlkZSA9IHRydWU7XG4gICAgICAgIHRoaXMuaXNfbG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzX2JlZm9yZV9iYXR0bGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbml0Q29uZmlnKCk7XG4gICAgfSxcbiAgICBzdGF0aWNzOiB7XG4gICAgICAgIHdpbk1hcDogW10sXG4gICAgfSxcblxuICAgIC8vIOaJk+W8gOeql+S9k+eahOS4u+WFpeWPo1xuICAgIG9wZW46IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdGhpcy5vcGVuX3BhcmFtcyA9IHBhcmFtcztcbiAgICAgICAgaWYgKHRoaXMucm9vdF93bmQpIHtcbiAgICAgICAgICAgIHRoaXMub3BlblJvb3RXbmQocGFyYW1zKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZV9zdGF0dXMgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFZpc2libGUodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgR3VpZGVFdmVudCA9IHJlcXVpcmUoXCJndWlkZV9ldmVudFwiKTtcbiAgICAgICAgICAgIGlmIChHdWlkZUV2ZW50KVxuICAgICAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoR3VpZGVFdmVudC5PcGVuVGFza0VmZmVjdCwgdGhpcy5yb290X3duZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgICBpZiAodGhpcy5pc19sb2FkaW5nKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLmlzX2xvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKCF0aGlzLndhaXRpbmdfdGltZXIgJiYgdGhpcy53YXRpbmcgJiYgIXdpbmRvdy5oaWRlX2xvYWRpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndhaXRpbmdfdGltZXIgPSBnY29yZS5UaW1lci5zZXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzX3dhdGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGdhbWUudXBkYXRlV2FpdGluZ1N0YXR1cyhXYWl0aW5nU3RhdXMuTE9BRElORyk7XG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpLCAxNTAwLCAxKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRSZXModGhpcy5wcmVmYWJQYXRoLCAoZnVuY3Rpb24gKHJlc19vYmplY3QpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy53YWl0aW5nX3RpbWVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGdjb3JlLlRpbWVyLmRlbCh0aGlzLndhaXRpbmdfdGltZXIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLndhaXRpbmdfdGltZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzX3dhdGluZykge1xuICAgICAgICAgICAgICAgICAgICBnYW1lLnVwZGF0ZVdhaXRpbmdTdGF0dXMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc193YXRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc19jbG9zZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuaXNfbG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMucm9vdF93bmQgPSByZXNfb2JqZWN0O1xuICAgICAgICAgICAgICAgIHRoaXMucm9vdF93bmQuc2V0UG9zaXRpb24oLVNDUkVFTl9XSURUSCAqIDAuNSwgLVNDUkVFTl9IRUlHSFQgKiAwLjUpXG4gICAgICAgICAgICAgICAgVmlld01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRUb1NjZW5lTm9kZSh0aGlzLnJvb3Rfd25kLCB0aGlzLnZpZXdUYWcpO1xuXG4gICAgICAgICAgICAgICAgLy8g6L+Y5pyq5Yqg6L295a6M5oiQ55qE5pe25YCZ6K6+572u5LqG5LiN5Y+v6KeBLOmCo+S5iOebtOaOpemakOiXj+aOiVxuICAgICAgICAgICAgICAgIGlmIChzZWxmLmZhc3RTaG93VGhlbkhpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5mYXN0U2hvd1RoZW5IaWRlID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWaXNpYmxlKGZhbHNlKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIOaJk+W8gOWbnuiwg1xuICAgICAgICAgICAgICAgIHRoaXMub3BlbkNhbGxCYWNrKCk7XG4gICAgICAgICAgICAgICAgLy8g5byA5ZCv5rOo5YaM5pe26Ze0XG4gICAgICAgICAgICAgICAgdGhpcy5yZWdpc3RlckV2ZW50KCk7XG4gICAgICAgICAgICAgICAgLy8g5pWw5o2u6K6+572uXG4gICAgICAgICAgICAgICAgc2VsZi5vcGVuUm9vdFduZChzZWxmLm9wZW5fcGFyYW1zKTtcbiAgICAgICAgICAgICAgICAvLyDnvJPlrZjnqpfkvZPmlbDmja5cbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5DYWNoZVZpZXcoKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvb3Rfd25kX2NiKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3Rfd25kX2NiKHRoaXMucm9vdF93bmQpO1xuXG4gICAgICAgICAgICAgICAgdmFyIEd1aWRlRXZlbnQgPSByZXF1aXJlKFwiZ3VpZGVfZXZlbnRcIik7XG4gICAgICAgICAgICAgICAgaWYgKEd1aWRlRXZlbnQpXG4gICAgICAgICAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoR3VpZGVFdmVudC5PcGVuVGFza0VmZmVjdCwgdGhpcy5yb290X3duZCk7XG4gICAgICAgICAgICB9KS5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIOWFs+mXreeql+S9k1xuICAgICAqIEBwYXJhbSB7Kn0gZGlzX21hcCDmmK/pg73mlq3lvIDlhbPpl63nqpfkvZPnmoTov57mjqXlhbPns7ss5aaC5p6c5piv6LCD55SoY2xvc2VhbGx3aW5kb3cs5YiZ5LiN6ZyA6KaB6L+e5o6lLOaXomNsb3NlQ2FjaGVWaWV355qE6YC76L6R5aSE55CGXG4gICAgICovXG4gICAgY2xvc2U6IGZ1bmN0aW9uIChkaXNfbWFwKSB7XG4gICAgICAgIGlmICh0aGlzLmlzX2Nsb3NlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc19tYXAgJiYgKGRpc19tYXAgaW5zdGFuY2VvZiBPYmplY3QpKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlX2lzX21hcCA9IGRpc19tYXAuY2xvc2Vfd2luIHx8IGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbG9zZUNhY2hlVmlldygpO1xuICAgICAgICB0aGlzLmlzX2Nsb3NlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jbG9zZUNhbGxCYWNrKCk7XG4gICAgICAgIHRoaXMuZGVsZXRlTWUoKTtcbiAgICAgICAgLy8gdGhpcy5yZW1vdmVHbG9iYWxFdmVudCgpO1xuICAgICAgICAvLyBpZih0aGlzLnJvb3Rfd25kKXtcbiAgICAgICAgLy8gICAgIHRoaXMucm9vdF93bmQuZGVzdHJveUFsbENoaWxkcmVuKCk7XG4gICAgICAgIC8vICAgICB0aGlzLnJvb3Rfd25kLmRlc3Ryb3koKTtcbiAgICAgICAgLy8gICAgIHRoaXMucm9vdF93bmQgPSBudWxsO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIC8vIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5kZWxldGVSZXModGhpcy5wcmVmYWJQYXRoKTtcbiAgICAgICAgLy8gTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbGVhc2VQcmVmYWIodGhpcy5wcmVmYWJQYXRoKTtcbiAgICAgICAgLy8gZm9yKHZhciBrZXkgaW4gdGhpcy5yZXNfbGlzdCl7XG4gICAgICAgIC8vICAgICBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVsZWFzZVJlcyhrZXkpXG4gICAgICAgIC8vIH1cbiAgICB9LFxuXG4gICAgZGVsZXRlTWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fc3VwZXIoKTtcbiAgICB9LFxuXG4gICAgY2hlY2tXaW5UeXBlOiBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICByZXR1cm4gdHlwZSA9PSBXaW5UeXBlLk1pbmkgfHwgdHlwZSA9PSBXaW5UeXBlLlRpcHNcbiAgICB9LFxuXG4gICAgLy8g5a+55omT5byA6L+H55qE56qX5L2T5YGa57yT5a2Y5aSE55CGXG4gICAgb3BlbkNhY2hlVmlldzogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5wcmVmYWJQYXRoID09IFwicHJlZmFiL2NoYXQvY2hhdF93aW5kb3cucHJlZmFiXCIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBCYXNlVmlldy53aW5NYXAucHVzaCh0aGlzKTtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gQmFzZVZpZXcud2luTWFwXG4gICAgICAgIGlmIChsZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB2YXIgbmV4dF9pbmRleCA9IGxlbmd0aCAtIDI7ICAgIC8vIOWAkuaVsOesrOS6jOS4queql+S9k+eahOS4i+ihqCBcbiAgICAgICAgICAgIHZhciBsYXN0V2luID0gQmFzZVZpZXcud2luTWFwW25leHRfaW5kZXhdO1xuICAgICAgICAgICAgLy8g5aaC5p6c6L+Z5Liq6Z2i5p2/55qE5LiK5LiA5Liq6Z2i5p2/5piv5LiA5LiqbWluaeeql+S9k+eahOivnSzpgqPkuYjlhbPpl63mjonkuIrkuIDkuKptaW5p56qX5L2TLOW5tuS4lOaKiuaUuW1pbmnnqpfkvZPnmoTkuIvkuIDkuKrnqpfkvZPmjIflkJHlvZPliY3nqpfkvZNcbiAgICAgICAgICAgIGlmIChsYXN0V2luICYmIHRoaXMuY2hlY2tXaW5UeXBlKGxhc3RXaW4ud2luX3R5cGUpICYmIHRoaXMud2luX3R5cGUgIT0gV2luVHlwZS5NaW5pKSB7XG4gICAgICAgICAgICAgICAgQmFzZVZpZXcud2luTWFwLnNwbGljZShuZXh0X2luZGV4LCAxKTtcbiAgICAgICAgICAgICAgICBsYXN0V2luLnRvcF93aW4gPSBudWxsO1xuICAgICAgICAgICAgICAgIGxhc3RXaW4ubmV4dF93aW4gPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChsYXN0V2luLmNsb3NlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RXaW4uY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDlj5blh7rlvZPliY3nqpfkvZPnmoTkuIrkuIDkuKrnqpfkvZMs5YGa5YWz6IGUXG4gICAgICAgICAgICB2YXIgbmV4dF9pbmRleF90byA9IEJhc2VWaWV3Lndpbk1hcC5sZW5ndGggLSAyO1xuICAgICAgICAgICAgaWYgKG5leHRfaW5kZXhfdG8gJiYgbmV4dF9pbmRleF90by5hY3RpdmVfc3RhdHVzID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvcF93aW4gPSBuZXh0X2luZGV4X3RvO1xuICAgICAgICAgICAgICAgIG5leHRfaW5kZXhfdG8ubmV4dF93aW4gPSB0aGlzO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5jaGVja1dpblR5cGUodGhpcy53aW5fdHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b3Bfd2luLnNldFZpc2libGUoZmFsc2UpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIOWmguaenOaYr+WFqOWxj+eql+S9kyzliJnpnIDopoHmnInpmpDol4/mjonkuLvlnLrmma8s5ZKM5oiY5paX5Zy65pmvXG4gICAgICAgIGlmICh0aGlzLndpbl90eXBlID09IFdpblR5cGUuRnVsbCkge1xuICAgICAgICAgICAgdmFyIG1haW5TY2VuZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwibWFpbnNjZW5lX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgICAgIG1haW5TY2VuZUNvbnRyb2xsZXIuaGFuZGxlU2NlbmVTdGF0dXMoZmFsc2UpO1xuICAgICAgICAgICAgdmFyIGJhdHRsZVNjZW5lQ29udHJvbGxlciA9IHJlcXVpcmUoXCJiYXR0bGVfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpXG4gICAgICAgICAgICBiYXR0bGVTY2VuZUNvbnRyb2xsZXIuaGFuZGxlQmF0dGxlU2NlbmVTdGF0dXMoZmFsc2UpXG4gICAgICAgICAgICB2YXIgbWFpblVpQ29udHJvbGxlciA9IHJlcXVpcmUoXCJtYWludWlfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpXG4gICAgICAgICAgICBtYWluVWlDb250cm9sbGVyLm9wZW5NYWluVUkoZmFsc2UpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5YWz6Zet56qX5L2T55qE5pe25YCZ5YGa5aSE55CGLFxuICAgIGNsb3NlQ2FjaGVWaWV3OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcnJheSA9IEJhc2VWaWV3Lndpbk1hcDtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFycmF5Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50ID09IHRoaXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50b3Bfd2luICYmICF0aGlzLmNsb3NlX2lzX21hcCkgeyAgIC8vIOWmguaenOi/meS4queql+S9k+WtmOWcqOS4iuS4gOS4queql+S9kyzpgqPkuYjmsqHmnInkuIvkuIDkuKrnqpfkvZPnmoTml7blgJks5omT5byA5LiK5LiA5Liq56qX5L2TLOWmguaenOacieS4i+S4gOS4queql+S9kyzliJnmiorkuIrkuIDkuKrnqpfkvZPnmoTkuIvkuIDkuKrnqpfkvZPlj5jmiJDoh6rouqvnmoTkuIvkuIDkuKrnqpfkvZMs6L+b6KGM5YWz6IGUXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzX2JhdHRsZV9oaWRlID09IGZhbHNlKSB7ICAgICAgIC8vIOaXp+eJiOacrOeahOS8l+elnuaImOWcuuaciei/meagt+eahOmcgOaxgiznlYzpnaLov5vmiJjmlpfkuI3mtojlpLEu546w5Zyo5Z+65pys5LiK5rKh5pyJXG5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5leHRfd2luID09IG51bGwgfHwgdGhpcy5uZXh0X3dpbi53aW5fdHlwZSAhPSBXaW5UeXBlLkZ1bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9wX3dpbi5zZXRWaXNpYmxlKHRydWUpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b3Bfd2luLm5leHRfd2luID0gbnVsbFxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXh0X3dpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b3Bfd2luLm5leHRfd2luID0gdGhpcy5uZXh0X3dpbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dF93aW4udG9wX3dpbiA9IHRoaXMudG9wX3dpbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyDliKDpmaTmjonov5nkuKpcbiAgICAgICAgICAgICAgICBCYXNlVmlldy53aW5NYXAuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIOWmguaenOayoeacieeql+S9kyzmiJbogIXmsqHmnInlhajlsY/nqpfkvZMs5YiZ5pi+56S65Ye65Li75Z+O5ZKM5Li75oiY5paX5Zy65pmvXG4gICAgICAgIGlmIChCYXNlVmlldy53aW5NYXAubGVuZ3RoID09IDAgfHwgIXRoaXMuaXNGdWxsV2luRXhpc3QoKSkge1xuICAgICAgICAgICAgdmFyIGJhdHRsZVNjZW5lQ29udHJvbGxlciA9IHJlcXVpcmUoXCJiYXR0bGVfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpXG4gICAgICAgICAgICBpZiAoYmF0dGxlU2NlbmVDb250cm9sbGVyLmhhZEJhdHRsZVNjZW5lKCkpIHsgLy8g5aaC5p6c5Zyo5oiY5paX5LitICBcbiAgICAgICAgICAgICAgICBiYXR0bGVTY2VuZUNvbnRyb2xsZXIuaGFuZGxlQmF0dGxlU2NlbmVTdGF0dXModHJ1ZSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIG1haW5VaUNvbnRyb2xsZXIgPSByZXF1aXJlKFwibWFpbnVpX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICB2YXIgYnRuX2luZGV4ID0gbWFpblVpQ29udHJvbGxlci5nZXRNYWluVUlJbmRleCgpO1xuICAgICAgICAgICAgICAgIHZhciBNYWluVWlDb25zdCA9IHJlcXVpcmUoXCJtYWludWlfY29uc3RcIik7XG4gICAgICAgICAgICAgICAgaWYgKGJ0bl9pbmRleCAhPSBNYWluVWlDb25zdC5idG5faW5kZXguZHJhbWFfc2NlbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1haW5TY2VuZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwibWFpbnNjZW5lX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgbWFpblNjZW5lQ29udHJvbGxlci5oYW5kbGVTY2VuZVN0YXR1cyh0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgaXNGdWxsV2luRXhpc3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYXJyYXkgPSBCYXNlVmlldy53aW5NYXA7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhcnJheS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG4gICAgICAgICAgICBpZiAoZWxlbWVudC53aW5fdHlwZSA9PSBXaW5UeXBlLkZ1bGwgJiYgZWxlbWVudC5pc19iZWZvcmVfYmF0dGxlID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbiAgICBzZXRWaXNpYmxlOiBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZV9zdGF0dXMgPT0gc3RhdHVzKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFjdGl2ZV9zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIGlmICh0aGlzLnJvb3Rfd25kKSB7XG4gICAgICAgICAgICB0aGlzLnJvb3Rfd25kLmFjdGl2ZSA9IHN0YXR1cztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmFzdFNob3dUaGVuSGlkZSA9IHN0YXR1cztcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRWaXNpYmxlOiBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZV9zdGF0dXNcbiAgICB9LFxuXG4gICAgZ2V0Um9vdFduZDogZnVuY3Rpb24gKGNiKSB7XG4gICAgICAgIHRoaXMucm9vdF93bmRfY2IgPSBjYjtcbiAgICAgICAgaWYgKHRoaXMucm9vdF93bmQpXG4gICAgICAgICAgICB0aGlzLnJvb3Rfd25kX2NiKHRoaXMucm9vdF93bmQpO1xuICAgIH0sXG5cbiAgICAvLyDliJ3lp4vljJbkuIDkupvln7rnoYDmlbDmja5cbiAgICBpbml0Q29uZmlnOiBmdW5jdGlvbiAoKSB7IH0sXG5cbiAgICAvLyDlrZDnsbvkuK3lrp7njrAsXG4gICAgb3BlblJvb3RXbmQ6IGZ1bmN0aW9uICgpIHsgfSxcblxuICAgIC8vIOazqOWGjOebkeWQrOS6i+S7tizlrZDnsbvkuK3lrp7njrBcbiAgICByZWdpc3RlckV2ZW50OiBmdW5jdGlvbiAoKSB7IH0sXG5cbiAgICAvLyDmiZPlvIDnlYzpnaLkuYvlkI7lm57osIMs5a2Q57G75Lit5a6e546wXG4gICAgb3BlbkNhbGxCYWNrOiBmdW5jdGlvbiAoKSB7IH0sXG5cbiAgICAvLyDlhbPpl63nlYzpnaLkuYvlkI7nmoTlm57osIMs5a2Q57G75Lit5a6e546wXG4gICAgY2xvc2VDYWxsQmFjazogZnVuY3Rpb24gKCkgeyB9LFxufSk7XG4iXX0=