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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/task/view/task_panel.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, '99ea796jU5N6oPNC6Sqe62d', 'task_panel');
// Scripts/mod/task/view/task_panel.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: shiraho@syg.com(必填, 创建模块的人员)
// @description:
//      日常主界面的任务标签页
// <br/>Create: new Date().toISOString()
// --------------------------------------------------------------------
var PathTool = require("pathtool");
 
var TaskController = require("task_controller");
 
var TaskEvent = require("task_event");
 
var TaskConst = require("task_const");
 
var RoleEvent = require("role_event");
 
var RoleController = require("role_controller");
 
var CommonScrollView = require("common_scrollview");
 
var TaskItem = require("task_item");
 
var TaskPanel = cc.Class({
  "extends": BasePanel,
  ctor: function ctor() {
    this.prefabPath = PathTool.getPrefabPath("task", "task_panel");
    this.box_list = [109, 108, 108, 110];
    this.ctrl = TaskController.getInstance();
    this.model = this.ctrl.getModel();
    this.role_vo = RoleController.getInstance().getRoleVo();
    this.is_new = null;
    this.need_update = null;
  },
  initPanel: function initPanel() {
    this.container = this.root_wnd.getChildByName("container");
    var activity_container = this.container.getChildByName("activity_container");
    this.progress = activity_container.getChildByName("progress_container").getChildByName("progress").getComponent(cc.ProgressBar);
    this.value = activity_container.getChildByName("value").getComponent(cc.Label);
    this.value.string = "0/100";
    this.awards_list = [];
 
    for (var i = 1; i <= Config.activity_data.data_get_length; i++) {
      var awards = activity_container.getChildByName("awards_" + i);
 
      if (awards != null) {
        awards.effect_container = awards.getChildByName("effect_container");
        awards.effect_container.skeleton = awards.effect_container.getComponent(sp.Skeleton);
        awards.target_value = awards.getChildByName("target_value").getComponent(cc.Label);
        awards.is_show_tips = true;
        awards.status = TaskConst.action_status.normal;
 
        if (gdata("activity_data", "data_get", [i]) != null) {
          awards.config = gdata("activity_data", "data_get", [i]);
          awards.target_value.string = awards.config.activity;
        } //按照配置的活跃度储存
 
 
        this.awards_list[i] = awards;
      }
    }
 
    this.quest_container = this.container.getChildByName("quest_container");
    var size = this.quest_container.getContentSize();
    var scroll_view_size = cc.size(size.width, size.height - 20);
    var setting = {
      item_class: TaskItem,
      // 单元类
      start_x: 6,
      // 第一个单元的X起点
      space_x: 0,
      // x方向的间隔
      start_y: 0,
      // 第一个单元的Y起点
      space_y: 2,
      // y方向的间隔
      item_width: 610,
      // 单元的尺寸width
      item_height: 148,
      // 单元的尺寸height
      row: 0,
      // 行数,作用于水平滚动类型
      col: 1,
      // 列数,作用于垂直滚动类型
      need_dynamic: true
    };
    this.item_scrollview = new CommonScrollView();
    this.item_scrollview.createScroll(this.quest_container, cc.v2(0, 0), ScrollViewDir.vertical, ScrollViewStartPos.top, scroll_view_size, setting, cc.v2(0.5, 0.5));
    this.updateTaskList(this.is_new);
    this.updateActivity(this.need_update);
  },
  addToParent: function addToParent(status) {
    // this.handleDynamicEvent(status);
    // this.setVisible(status);
    if (this.root_wnd == null) this.active_value = status;else this.root_wnd.active = status;
 
    if (status == true) {
      this.ctrl.requestActivityInfo(); //设置当前面板的时候做一次协议请求
 
      this.updateTaskList(true);
      this.updateActivity(false);
    }
  },
  handleDynamicEvent: function handleDynamicEvent(status) {
    if (!status) {
      if (this.role_assets_event != null) {
        if (this.role_vo != null) {
          this.role_vo.unbind(this.role_assets_event);
        }
 
        this.role_assets_event = null;
      }
 
      if (this.update_activity_event != null) {
        gcore.GlobalEvent.unbind(this.update_activity_event);
        this.update_activity_event = null;
      }
 
      if (this.update_task_list != null) {
        gcore.GlobalEvent.unbind(this.update_task_list);
        this.update_task_list = null;
      }
    } else {}
  },
  //必要添加的一个位置方法
  setPosition: function setPosition(x, y) {
    this.x = x;
    this.y = y;
 
    if (this.root_wnd) {
      this.root_wnd.setPosition(this.x, this.y);
    }
  },
  //必要添加的显隐方法
  setVisible: function setVisible(bool) {
    if (this.root_wnd) {
      this.root_wnd.active = bool;
    }
  },
  registerEvent: function registerEvent() {
    for (var k in this.awards_list) {
      var awards = this.awards_list[k];
      awards.on(cc.Node.EventType.TOUCH_END, function (event) {
        var sender = event.currentTarget;
 
        if (sender.config != null) {
          if (sender.is_show_tips == true) {
            var CommonAlert = require("commonalert");
 
            CommonAlert.showItemApply(Utils.TI18N("当前活跃度奖励"), sender.config.rewards, null, Utils.TI18N("确定"), null, null, Utils.TI18N("奖励"), null, null, true, null, null, {
              off_y: 50
            });
          } else {
            if (this.role_vo && this.role_vo.activity >= sender.config.activity) this.ctrl.requestGetActivityAwards(sender.config.activity);
          }
        }
      }.bind(this));
    }
 
    if (this.role_vo != null) {
      if (this.role_assets_event == null) {
        this.role_assets_event = this.role_vo.bind(EventId.UPDATE_ROLE_ATTRIBUTE, function (key, value) {
          if (key == "activity") this.updateActivity(true);
        }.bind(this));
      }
    }
 
    if (this.update_activity_event == null) {
      this.update_activity_event = gcore.GlobalEvent.bind(TaskEvent.UpdateActivityInfo, function (data) {
        this.updateActivityData(data);
      }.bind(this));
    }
 
    if (this.update_task_list == null) {
      this.update_task_list = gcore.GlobalEvent.bind(TaskEvent.UpdateTaskList, function (is_new) {
        this.updateTaskList(is_new);
      }.bind(this));
    }
 
    this.ctrl.requestActivityInfo();
  },
  updateActivity: function updateActivity(need_update) {
    this.need_update = need_update;
    if (this.root_wnd == null) return;
 
    if (this.role_vo != null) {
      var activity_config = gdata("activity_data", "data_get", [Config.activity_data.data_get_length]);
      var max_activity = 100;
      if (activity_config != null) max_activity = activity_config.activity;
      this.value.string = this.role_vo.activity + "/" + max_activity;
      this.progress.progress = this.role_vo.activity / max_activity;
      if (need_update == true) this.updateActivityData(this.model.getActivityData());
    }
  },
  // @desc:更新活跃宝箱
  // author:{author}
  // time:2018-05-22 16:02:57
  // --@data: 
  // return
  updateActivityData: function updateActivityData(data) {
    if (this.role_vo == null) return;
    var data_list = data; //判断这个活跃度的宝箱是否已经领取了
 
    var check_activity = function check_activity(activity) {
      if (data_list == null) return false;
      return data_list[activity];
    };
 
    for (var i in this.awards_list) {
      var item = this.awards_list[i];
 
      if (item && item.config && item.effect_container) {
        if (check_activity(item.config.activity) == true) {
          item.is_show_tips = true;
          item.status = TaskConst.action_status.finish;
        } else {
          if (item.config.activity <= this.role_vo.activity) {
            item.is_show_tips = false;
            item.status = TaskConst.action_status.activity;
          } else {
            item.is_show_tips = true;
            item.status = TaskConst.action_status.un_activity;
          }
        }
 
        var box_action = PlayerAction.action_1;
        if (item.status == TaskConst.action_status.finish) box_action = PlayerAction.action_3;else if (item.status == TaskConst.action_status.activity) box_action = PlayerAction.action_2;
 
        if (item.effect_container.skeleton.skeletonData) {
          if (item.box_action != box_action) {
            item.effect_container.skeleton.setAnimation(0, box_action, true);
            item.box_action = box_action;
          }
        } else {
          var res_id = gdata("effect_data", "data_effect_info", this.box_list[i - 1]);
          var path = cc.js.formatStr("spine/%s/action.atlas", res_id);
          var _skeleton = item.effect_container.skeleton;
          this.createEffect(_skeleton, path, box_action);
        }
      }
    }
  },
  //生成宝箱
  createEffect: function createEffect(_skeleton, path, box_action) {
    this.loadRes(path, function (res) {
      _skeleton.skeletonData = res;
 
      _skeleton.setAnimation(0, box_action, true);
    }.bind(this));
  },
  // @desc:更新任务列表,是否需要重新更新列表
  // author:{author}
  // time:2018-05-22 19:11:28
  // --@is_new:如果为true,则重新排序吧,否则就直接更新位置
  // return
  updateTaskList: function updateTaskList(is_new) {
    this.is_new = is_new;
    if (this.root_wnd == null) return; // if (is_new == true) {
 
    var list = this.model.getTaskList();
    this.item_scrollview.setData(list); // } else {
    //     var sort_func = Utils.tableLowerSorter(["finish_sort", "id"]);
    //     this.item_scrollview.resetPosition(sort_func);
    // }
  },
  onDelete: function onDelete() {
    if (this.role_assets_event != null) {
      if (this.role_vo != null) {
        this.role_vo.unbind(this.role_assets_event);
      }
 
      this.role_assets_event = null;
    }
 
    if (this.update_activity_event != null) {
      gcore.GlobalEvent.unbind(this.update_activity_event);
      this.update_activity_event = null;
    }
 
    if (this.update_task_list != null) {
      gcore.GlobalEvent.unbind(this.update_task_list);
      this.update_task_list = null;
    }
 
    if (this.item_scrollview) {
      this.item_scrollview.deleteMe();
      this.item_scrollview = null;
    }
  }
});
module.exports = TaskPanel;
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFx0YXNrXFx2aWV3XFx0YXNrX3BhbmVsLmpzIl0sIm5hbWVzIjpbIlBhdGhUb29sIiwicmVxdWlyZSIsIlRhc2tDb250cm9sbGVyIiwiVGFza0V2ZW50IiwiVGFza0NvbnN0IiwiUm9sZUV2ZW50IiwiUm9sZUNvbnRyb2xsZXIiLCJDb21tb25TY3JvbGxWaWV3IiwiVGFza0l0ZW0iLCJUYXNrUGFuZWwiLCJjYyIsIkNsYXNzIiwiQmFzZVBhbmVsIiwiY3RvciIsInByZWZhYlBhdGgiLCJnZXRQcmVmYWJQYXRoIiwiYm94X2xpc3QiLCJjdHJsIiwiZ2V0SW5zdGFuY2UiLCJtb2RlbCIsImdldE1vZGVsIiwicm9sZV92byIsImdldFJvbGVWbyIsImlzX25ldyIsIm5lZWRfdXBkYXRlIiwiaW5pdFBhbmVsIiwiY29udGFpbmVyIiwicm9vdF93bmQiLCJnZXRDaGlsZEJ5TmFtZSIsImFjdGl2aXR5X2NvbnRhaW5lciIsInByb2dyZXNzIiwiZ2V0Q29tcG9uZW50IiwiUHJvZ3Jlc3NCYXIiLCJ2YWx1ZSIsIkxhYmVsIiwic3RyaW5nIiwiYXdhcmRzX2xpc3QiLCJpIiwiQ29uZmlnIiwiYWN0aXZpdHlfZGF0YSIsImRhdGFfZ2V0X2xlbmd0aCIsImF3YXJkcyIsImVmZmVjdF9jb250YWluZXIiLCJza2VsZXRvbiIsInNwIiwiU2tlbGV0b24iLCJ0YXJnZXRfdmFsdWUiLCJpc19zaG93X3RpcHMiLCJzdGF0dXMiLCJhY3Rpb25fc3RhdHVzIiwibm9ybWFsIiwiZ2RhdGEiLCJjb25maWciLCJhY3Rpdml0eSIsInF1ZXN0X2NvbnRhaW5lciIsInNpemUiLCJnZXRDb250ZW50U2l6ZSIsInNjcm9sbF92aWV3X3NpemUiLCJ3aWR0aCIsImhlaWdodCIsInNldHRpbmciLCJpdGVtX2NsYXNzIiwic3RhcnRfeCIsInNwYWNlX3giLCJzdGFydF95Iiwic3BhY2VfeSIsIml0ZW1fd2lkdGgiLCJpdGVtX2hlaWdodCIsInJvdyIsImNvbCIsIm5lZWRfZHluYW1pYyIsIml0ZW1fc2Nyb2xsdmlldyIsImNyZWF0ZVNjcm9sbCIsInYyIiwiU2Nyb2xsVmlld0RpciIsInZlcnRpY2FsIiwiU2Nyb2xsVmlld1N0YXJ0UG9zIiwidG9wIiwidXBkYXRlVGFza0xpc3QiLCJ1cGRhdGVBY3Rpdml0eSIsImFkZFRvUGFyZW50IiwiYWN0aXZlX3ZhbHVlIiwiYWN0aXZlIiwicmVxdWVzdEFjdGl2aXR5SW5mbyIsImhhbmRsZUR5bmFtaWNFdmVudCIsInJvbGVfYXNzZXRzX2V2ZW50IiwidW5iaW5kIiwidXBkYXRlX2FjdGl2aXR5X2V2ZW50IiwiZ2NvcmUiLCJHbG9iYWxFdmVudCIsInVwZGF0ZV90YXNrX2xpc3QiLCJzZXRQb3NpdGlvbiIsIngiLCJ5Iiwic2V0VmlzaWJsZSIsImJvb2wiLCJyZWdpc3RlckV2ZW50IiwiayIsIm9uIiwiTm9kZSIsIkV2ZW50VHlwZSIsIlRPVUNIX0VORCIsImV2ZW50Iiwic2VuZGVyIiwiY3VycmVudFRhcmdldCIsIkNvbW1vbkFsZXJ0Iiwic2hvd0l0ZW1BcHBseSIsIlV0aWxzIiwiVEkxOE4iLCJyZXdhcmRzIiwib2ZmX3kiLCJyZXF1ZXN0R2V0QWN0aXZpdHlBd2FyZHMiLCJiaW5kIiwiRXZlbnRJZCIsIlVQREFURV9ST0xFX0FUVFJJQlVURSIsImtleSIsIlVwZGF0ZUFjdGl2aXR5SW5mbyIsImRhdGEiLCJ1cGRhdGVBY3Rpdml0eURhdGEiLCJVcGRhdGVUYXNrTGlzdCIsImFjdGl2aXR5X2NvbmZpZyIsIm1heF9hY3Rpdml0eSIsImdldEFjdGl2aXR5RGF0YSIsImRhdGFfbGlzdCIsImNoZWNrX2FjdGl2aXR5IiwiaXRlbSIsImZpbmlzaCIsInVuX2FjdGl2aXR5IiwiYm94X2FjdGlvbiIsIlBsYXllckFjdGlvbiIsImFjdGlvbl8xIiwiYWN0aW9uXzMiLCJhY3Rpb25fMiIsInNrZWxldG9uRGF0YSIsInNldEFuaW1hdGlvbiIsInJlc19pZCIsInBhdGgiLCJqcyIsImZvcm1hdFN0ciIsIl9za2VsZXRvbiIsImNyZWF0ZUVmZmVjdCIsImxvYWRSZXMiLCJyZXMiLCJsaXN0IiwiZ2V0VGFza0xpc3QiLCJzZXREYXRhIiwib25EZWxldGUiLCJkZWxldGVNZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsSUFBSUEsUUFBUSxHQUFHQyxPQUFPLENBQUMsVUFBRCxDQUF0Qjs7QUFDQSxJQUFJQyxjQUFjLEdBQUdELE9BQU8sQ0FBQyxpQkFBRCxDQUE1Qjs7QUFDQSxJQUFJRSxTQUFTLEdBQUdGLE9BQU8sQ0FBQyxZQUFELENBQXZCOztBQUNBLElBQUlHLFNBQVMsR0FBR0gsT0FBTyxDQUFDLFlBQUQsQ0FBdkI7O0FBQ0EsSUFBSUksU0FBUyxHQUFHSixPQUFPLENBQUMsWUFBRCxDQUF2Qjs7QUFDQSxJQUFJSyxjQUFjLEdBQUdMLE9BQU8sQ0FBQyxpQkFBRCxDQUE1Qjs7QUFDQSxJQUFJTSxnQkFBZ0IsR0FBR04sT0FBTyxDQUFDLG1CQUFELENBQTlCOztBQUNBLElBQUlPLFFBQVEsR0FBR1AsT0FBTyxDQUFDLFdBQUQsQ0FBdEI7O0FBRUEsSUFBSVEsU0FBUyxHQUFHQyxFQUFFLENBQUNDLEtBQUgsQ0FBUztBQUNyQixhQUFTQyxTQURZO0FBRXJCQyxFQUFBQSxJQUFJLEVBQUUsZ0JBQVk7QUFDZCxTQUFLQyxVQUFMLEdBQWtCZCxRQUFRLENBQUNlLGFBQVQsQ0FBdUIsTUFBdkIsRUFBK0IsWUFBL0IsQ0FBbEI7QUFDQSxTQUFLQyxRQUFMLEdBQWdCLENBQUMsR0FBRCxFQUFNLEdBQU4sRUFBVyxHQUFYLEVBQWdCLEdBQWhCLENBQWhCO0FBQ0EsU0FBS0MsSUFBTCxHQUFZZixjQUFjLENBQUNnQixXQUFmLEVBQVo7QUFDQSxTQUFLQyxLQUFMLEdBQWEsS0FBS0YsSUFBTCxDQUFVRyxRQUFWLEVBQWI7QUFDQSxTQUFLQyxPQUFMLEdBQWVmLGNBQWMsQ0FBQ1ksV0FBZixHQUE2QkksU0FBN0IsRUFBZjtBQUNBLFNB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WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyBAYXV0aG9yOiBzaGlyYWhvQHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXHJcbi8vIEBkZXNjcmlwdGlvbjpcclxuLy8gICAgICDml6XluLjkuLvnlYzpnaLnmoTku7vliqHmoIfnrb7pobVcclxuLy8gPGJyLz5DcmVhdGU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxudmFyIFBhdGhUb29sID0gcmVxdWlyZShcInBhdGh0b29sXCIpO1xyXG52YXIgVGFza0NvbnRyb2xsZXIgPSByZXF1aXJlKFwidGFza19jb250cm9sbGVyXCIpO1xyXG52YXIgVGFza0V2ZW50ID0gcmVxdWlyZShcInRhc2tfZXZlbnRcIik7XHJcbnZhciBUYXNrQ29uc3QgPSByZXF1aXJlKFwidGFza19jb25zdFwiKTtcclxudmFyIFJvbGVFdmVudCA9IHJlcXVpcmUoXCJyb2xlX2V2ZW50XCIpO1xyXG52YXIgUm9sZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwicm9sZV9jb250cm9sbGVyXCIpO1xyXG52YXIgQ29tbW9uU2Nyb2xsVmlldyA9IHJlcXVpcmUoXCJjb21tb25fc2Nyb2xsdmlld1wiKTtcclxudmFyIFRhc2tJdGVtID0gcmVxdWlyZShcInRhc2tfaXRlbVwiKTtcclxuXHJcbnZhciBUYXNrUGFuZWwgPSBjYy5DbGFzcyh7XHJcbiAgICBleHRlbmRzOiBCYXNlUGFuZWwsXHJcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5wcmVmYWJQYXRoID0gUGF0aFRvb2wuZ2V0UHJlZmFiUGF0aChcInRhc2tcIiwgXCJ0YXNrX3BhbmVsXCIpO1xyXG4gICAgICAgIHRoaXMuYm94X2xpc3QgPSBbMTA5LCAxMDgsIDEwOCwgMTEwXTtcclxuICAgICAgICB0aGlzLmN0cmwgPSBUYXNrQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpO1xyXG4gICAgICAgIHRoaXMubW9kZWwgPSB0aGlzLmN0cmwuZ2V0TW9kZWwoKTtcclxuICAgICAgICB0aGlzLnJvbGVfdm8gPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpO1xyXG4gICAgICAgIHRoaXMuaXNfbmV3ID0gbnVsbDtcclxuICAgICAgICB0aGlzLm5lZWRfdXBkYXRlID0gbnVsbDtcclxuICAgIH0sXHJcblxyXG5cclxuICAgIGluaXRQYW5lbDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5yb290X3duZC5nZXRDaGlsZEJ5TmFtZShcImNvbnRhaW5lclwiKTtcclxuXHJcbiAgICAgICAgdmFyIGFjdGl2aXR5X2NvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiYWN0aXZpdHlfY29udGFpbmVyXCIpO1xyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSBhY3Rpdml0eV9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJwcm9ncmVzc19jb250YWluZXJcIikuZ2V0Q2hpbGRCeU5hbWUoXCJwcm9ncmVzc1wiKS5nZXRDb21wb25lbnQoY2MuUHJvZ3Jlc3NCYXIpO1xyXG5cclxuICAgICAgICB0aGlzLnZhbHVlID0gYWN0aXZpdHlfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwidmFsdWVcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcclxuICAgICAgICB0aGlzLnZhbHVlLnN0cmluZyA9IFwiMC8xMDBcIjtcclxuXHJcbiAgICAgICAgdGhpcy5hd2FyZHNfbGlzdCA9IFtdO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IENvbmZpZy5hY3Rpdml0eV9kYXRhLmRhdGFfZ2V0X2xlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBhd2FyZHMgPSBhY3Rpdml0eV9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJhd2FyZHNfXCIgKyBpKTtcclxuICAgICAgICAgICAgaWYgKGF3YXJkcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FyZHMuZWZmZWN0X2NvbnRhaW5lciA9IGF3YXJkcy5nZXRDaGlsZEJ5TmFtZShcImVmZmVjdF9jb250YWluZXJcIik7XHJcbiAgICAgICAgICAgICAgICBhd2FyZHMuZWZmZWN0X2NvbnRhaW5lci5za2VsZXRvbiA9IGF3YXJkcy5lZmZlY3RfY29udGFpbmVyLmdldENvbXBvbmVudChzcC5Ta2VsZXRvbik7XHJcbiAgICAgICAgICAgICAgICBhd2FyZHMudGFyZ2V0X3ZhbHVlID0gYXdhcmRzLmdldENoaWxkQnlOYW1lKFwidGFyZ2V0X3ZhbHVlXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7XHJcbiAgICAgICAgICAgICAgICBhd2FyZHMuaXNfc2hvd190aXBzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGF3YXJkcy5zdGF0dXMgPSBUYXNrQ29uc3QuYWN0aW9uX3N0YXR1cy5ub3JtYWw7XHJcbiAgICAgICAgICAgICAgICBpZiAoZ2RhdGEoXCJhY3Rpdml0eV9kYXRhXCIsIFwiZGF0YV9nZXRcIiwgW2ldKSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhcmRzLmNvbmZpZyA9IGdkYXRhKFwiYWN0aXZpdHlfZGF0YVwiLCBcImRhdGFfZ2V0XCIsIFtpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhcmRzLnRhcmdldF92YWx1ZS5zdHJpbmcgPSBhd2FyZHMuY29uZmlnLmFjdGl2aXR5O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy/mjInnhafphY3nva7nmoTmtLvot4PluqblgqjlrZhcclxuICAgICAgICAgICAgICAgIHRoaXMuYXdhcmRzX2xpc3RbaV0gPSBhd2FyZHM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucXVlc3RfY29udGFpbmVyID0gdGhpcy5jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJxdWVzdF9jb250YWluZXJcIik7XHJcbiAgICAgICAgdmFyIHNpemUgPSB0aGlzLnF1ZXN0X2NvbnRhaW5lci5nZXRDb250ZW50U2l6ZSgpO1xyXG5cclxuICAgICAgICB2YXIgc2Nyb2xsX3ZpZXdfc2l6ZSA9IGNjLnNpemUoc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQgLSAyMClcclxuICAgICAgICB2YXIgc2V0dGluZyA9IHtcclxuICAgICAgICAgICAgaXRlbV9jbGFzczogVGFza0l0ZW0sICAgICAgLy8g5Y2V5YWD57G7XHJcbiAgICAgICAgICAgIHN0YXJ0X3g6IDYsICAgICAgICAgICAgICAgICAgICAvLyDnrKzkuIDkuKrljZXlhYPnmoRY6LW354K5XHJcbiAgICAgICAgICAgIHNwYWNlX3g6IDAsICAgICAgICAgICAgICAgICAgICAvLyB45pa55ZCR55qE6Ze06ZqUXHJcbiAgICAgICAgICAgIHN0YXJ0X3k6IDAsICAgICAgICAgICAgICAgICAgICAvLyDnrKzkuIDkuKrljZXlhYPnmoRZ6LW354K5XHJcbiAgICAgICAgICAgIHNwYWNlX3k6IDIsICAgICAgICAgICAgICAgICAgIC8vIHnmlrnlkJHnmoTpl7TpmpRcclxuICAgICAgICAgICAgaXRlbV93aWR0aDogNjEwLCAgICAgICAgICAgICAgIC8vIOWNleWFg+eahOWwuuWvuHdpZHRoXHJcbiAgICAgICAgICAgIGl0ZW1faGVpZ2h0OiAxNDgsICAgICAgICAgICAgICAvLyDljZXlhYPnmoTlsLrlr7hoZWlnaHRcclxuICAgICAgICAgICAgcm93OiAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIOihjOaVsO+8jOS9nOeUqOS6juawtOW5s+a7muWKqOexu+Wei1xyXG4gICAgICAgICAgICBjb2w6IDEsICAgICAgICAgICAgICAgICAgICAgICAgLy8g5YiX5pWw77yM5L2c55So5LqO5Z6C55u05rua5Yqo57G75Z6LXHJcbiAgICAgICAgICAgIG5lZWRfZHluYW1pYzogdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLml0ZW1fc2Nyb2xsdmlldyA9IG5ldyBDb21tb25TY3JvbGxWaWV3KClcclxuICAgICAgICB0aGlzLml0ZW1fc2Nyb2xsdmlldy5jcmVhdGVTY3JvbGwodGhpcy5xdWVzdF9jb250YWluZXIsIGNjLnYyKDAsIDApLCBTY3JvbGxWaWV3RGlyLnZlcnRpY2FsLCBTY3JvbGxWaWV3U3RhcnRQb3MudG9wLCBzY3JvbGxfdmlld19zaXplLCBzZXR0aW5nLCBjYy52MigwLjUsIDAuNSkpXHJcbiAgICAgICAgdGhpcy51cGRhdGVUYXNrTGlzdCh0aGlzLmlzX25ldyk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVBY3Rpdml0eSh0aGlzLm5lZWRfdXBkYXRlKTtcclxuICAgIH0sXHJcblxyXG4gICAgYWRkVG9QYXJlbnQ6IGZ1bmN0aW9uIChzdGF0dXMpIHtcclxuICAgICAgICAvLyB0aGlzLmhhbmRsZUR5bmFtaWNFdmVudChzdGF0dXMpO1xyXG4gICAgICAgIC8vIHRoaXMuc2V0VmlzaWJsZShzdGF0dXMpO1xyXG4gICAgICAgIGlmICh0aGlzLnJvb3Rfd25kID09IG51bGwpXHJcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlX3ZhbHVlID0gc3RhdHVzXHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLnJvb3Rfd25kLmFjdGl2ZSA9IHN0YXR1c1xyXG4gICAgICAgIGlmIChzdGF0dXMgPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmN0cmwucmVxdWVzdEFjdGl2aXR5SW5mbygpOyAgICAvL+iuvue9ruW9k+WJjemdouadv+eahOaXtuWAmeWBmuS4gOasoeWNj+iuruivt+axglxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRhc2tMaXN0KHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2aXR5KGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGhhbmRsZUR5bmFtaWNFdmVudDogZnVuY3Rpb24gKHN0YXR1cykge1xyXG4gICAgICAgIGlmICghc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJvbGVfYXNzZXRzX2V2ZW50ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvbGVfdm8gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm9sZV92by51bmJpbmQodGhpcy5yb2xlX2Fzc2V0c19ldmVudClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMucm9sZV9hc3NldHNfZXZlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnVwZGF0ZV9hY3Rpdml0eV9ldmVudCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC51bmJpbmQodGhpcy51cGRhdGVfYWN0aXZpdHlfZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVfYWN0aXZpdHlfZXZlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnVwZGF0ZV90YXNrX2xpc3QgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQudW5iaW5kKHRoaXMudXBkYXRlX3Rhc2tfbGlzdCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZV90YXNrX2xpc3QgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvL+W/heimgea3u+WKoOeahOS4gOS4quS9jee9ruaWueazlVxyXG4gICAgc2V0UG9zaXRpb246IGZ1bmN0aW9uICh4LCB5KSB7XHJcbiAgICAgICAgdGhpcy54ID0geDtcclxuICAgICAgICB0aGlzLnkgPSB5O1xyXG4gICAgICAgIGlmICh0aGlzLnJvb3Rfd25kKSB7XHJcbiAgICAgICAgICAgIHRoaXMucm9vdF93bmQuc2V0UG9zaXRpb24odGhpcy54LCB0aGlzLnkpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLy/lv4XopoHmt7vliqDnmoTmmL7pmpDmlrnms5VcclxuICAgIHNldFZpc2libGU6IGZ1bmN0aW9uIChib29sKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucm9vdF93bmQpIHtcclxuICAgICAgICAgICAgdGhpcy5yb290X3duZC5hY3RpdmUgPSBib29sO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgcmVnaXN0ZXJFdmVudDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5hd2FyZHNfbGlzdCkge1xyXG4gICAgICAgICAgICBjb25zdCBhd2FyZHMgPSB0aGlzLmF3YXJkc19saXN0W2tdO1xyXG4gICAgICAgICAgICBhd2FyZHMub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIHZhciBzZW5kZXIgPSBldmVudC5jdXJyZW50VGFyZ2V0O1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlbmRlci5jb25maWcgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZW5kZXIuaXNfc2hvd190aXBzID09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIENvbW1vbkFsZXJ0ID0gcmVxdWlyZShcImNvbW1vbmFsZXJ0XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBDb21tb25BbGVydC5zaG93SXRlbUFwcGx5KFV0aWxzLlRJMThOKFwi5b2T5YmN5rS76LeD5bqm5aWW5YqxXCIpLHNlbmRlci5jb25maWcucmV3YXJkcyxudWxsLFV0aWxzLlRJMThOKFwi56Gu5a6aXCIpLG51bGwsbnVsbCxVdGlscy5USTE4TihcIuWlluWKsVwiKSxudWxsLG51bGwsdHJ1ZSxudWxsLCBudWxsLHtvZmZfeTo1MH0pXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucm9sZV92byAmJiB0aGlzLnJvbGVfdm8uYWN0aXZpdHkgPj0gc2VuZGVyLmNvbmZpZy5hY3Rpdml0eSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3RybC5yZXF1ZXN0R2V0QWN0aXZpdHlBd2FyZHMoc2VuZGVyLmNvbmZpZy5hY3Rpdml0eSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LmJpbmQodGhpcykpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5yb2xlX3ZvICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucm9sZV9hc3NldHNfZXZlbnQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yb2xlX2Fzc2V0c19ldmVudCA9IHRoaXMucm9sZV92by5iaW5kKEV2ZW50SWQuVVBEQVRFX1JPTEVfQVRUUklCVVRFLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gXCJhY3Rpdml0eVwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2aXR5KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZV9hY3Rpdml0eV9ldmVudCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlX2FjdGl2aXR5X2V2ZW50ID0gZ2NvcmUuR2xvYmFsRXZlbnQuYmluZChUYXNrRXZlbnQuVXBkYXRlQWN0aXZpdHlJbmZvLCBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVBY3Rpdml0eURhdGEoZGF0YSlcclxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy51cGRhdGVfdGFza19saXN0ID09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVfdGFza19saXN0ID0gZ2NvcmUuR2xvYmFsRXZlbnQuYmluZChUYXNrRXZlbnQuVXBkYXRlVGFza0xpc3QsIGZ1bmN0aW9uIChpc19uZXcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVGFza0xpc3QoaXNfbmV3KVxyXG4gICAgICAgICAgICB9LmJpbmQodGhpcykpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmN0cmwucmVxdWVzdEFjdGl2aXR5SW5mbygpO1xyXG4gICAgfSxcclxuXHJcbiAgICB1cGRhdGVBY3Rpdml0eTogZnVuY3Rpb24gKG5lZWRfdXBkYXRlKSB7XHJcbiAgICAgICAgdGhpcy5uZWVkX3VwZGF0ZSA9IG5lZWRfdXBkYXRlXHJcbiAgICAgICAgaWYgKHRoaXMucm9vdF93bmQgPT0gbnVsbClcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgaWYgKHRoaXMucm9sZV92byAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHZhciBhY3Rpdml0eV9jb25maWcgPSBnZGF0YShcImFjdGl2aXR5X2RhdGFcIiwgXCJkYXRhX2dldFwiLCBbQ29uZmlnLmFjdGl2aXR5X2RhdGEuZGF0YV9nZXRfbGVuZ3RoXSk7XHJcbiAgICAgICAgICAgIHZhciBtYXhfYWN0aXZpdHkgPSAxMDA7XHJcbiAgICAgICAgICAgIGlmIChhY3Rpdml0eV9jb25maWcgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgIG1heF9hY3Rpdml0eSA9IGFjdGl2aXR5X2NvbmZpZy5hY3Rpdml0eTtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZS5zdHJpbmcgPSB0aGlzLnJvbGVfdm8uYWN0aXZpdHkgKyBcIi9cIiArIG1heF9hY3Rpdml0eTtcclxuICAgICAgICAgICAgdGhpcy5wcm9ncmVzcy5wcm9ncmVzcyA9IHRoaXMucm9sZV92by5hY3Rpdml0eSAvIG1heF9hY3Rpdml0eTtcclxuICAgICAgICAgICAgaWYgKG5lZWRfdXBkYXRlID09IHRydWUpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2aXR5RGF0YSh0aGlzLm1vZGVsLmdldEFjdGl2aXR5RGF0YSgpKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIEBkZXNjOuabtOaWsOa0u+i3g+WuneeusVxyXG4gICAgLy8gYXV0aG9yOnthdXRob3J9XHJcbiAgICAvLyB0aW1lOjIwMTgtMDUtMjIgMTY6MDI6NTdcclxuICAgIC8vIC0tQGRhdGE6IFxyXG4gICAgLy8gcmV0dXJuXHJcbiAgICB1cGRhdGVBY3Rpdml0eURhdGE6IGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucm9sZV92byA9PSBudWxsKVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB2YXIgZGF0YV9saXN0ID0gZGF0YTtcclxuXHJcbiAgICAgICAgLy/liKTmlq3ov5nkuKrmtLvot4PluqbnmoTlrp3nrrHmmK/lkKblt7Lnu4/pooblj5bkuoZcclxuICAgICAgICB2YXIgY2hlY2tfYWN0aXZpdHkgPSBmdW5jdGlvbiAoYWN0aXZpdHkpIHtcclxuICAgICAgICAgICAgaWYgKGRhdGFfbGlzdCA9PSBudWxsKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhX2xpc3RbYWN0aXZpdHldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLmF3YXJkc19saXN0KSB7XHJcbiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5hd2FyZHNfbGlzdFtpXTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5jb25maWcgJiYgaXRlbS5lZmZlY3RfY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tfYWN0aXZpdHkoaXRlbS5jb25maWcuYWN0aXZpdHkpID09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLmlzX3Nob3dfdGlwcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5zdGF0dXMgPSBUYXNrQ29uc3QuYWN0aW9uX3N0YXR1cy5maW5pc2g7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmNvbmZpZy5hY3Rpdml0eSA8PSB0aGlzLnJvbGVfdm8uYWN0aXZpdHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5pc19zaG93X3RpcHMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zdGF0dXMgPSBUYXNrQ29uc3QuYWN0aW9uX3N0YXR1cy5hY3Rpdml0eTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmlzX3Nob3dfdGlwcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3RhdHVzID0gVGFza0NvbnN0LmFjdGlvbl9zdGF0dXMudW5fYWN0aXZpdHk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHZhciBib3hfYWN0aW9uID0gUGxheWVyQWN0aW9uLmFjdGlvbl8xO1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0uc3RhdHVzID09IFRhc2tDb25zdC5hY3Rpb25fc3RhdHVzLmZpbmlzaClcclxuICAgICAgICAgICAgICAgICAgICBib3hfYWN0aW9uID0gUGxheWVyQWN0aW9uLmFjdGlvbl8zO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXRlbS5zdGF0dXMgPT0gVGFza0NvbnN0LmFjdGlvbl9zdGF0dXMuYWN0aXZpdHkpXHJcbiAgICAgICAgICAgICAgICAgICAgYm94X2FjdGlvbiA9IFBsYXllckFjdGlvbi5hY3Rpb25fMjtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5lZmZlY3RfY29udGFpbmVyLnNrZWxldG9uLnNrZWxldG9uRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmJveF9hY3Rpb24gIT0gYm94X2FjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmVmZmVjdF9jb250YWluZXIuc2tlbGV0b24uc2V0QW5pbWF0aW9uKDAsIGJveF9hY3Rpb24sIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmJveF9hY3Rpb24gPSBib3hfYWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc19pZCA9IGdkYXRhKFwiZWZmZWN0X2RhdGFcIiwgXCJkYXRhX2VmZmVjdF9pbmZvXCIsIHRoaXMuYm94X2xpc3RbaSAtIDFdKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcGF0aCA9IGNjLmpzLmZvcm1hdFN0cihcInNwaW5lLyVzL2FjdGlvbi5hdGxhc1wiLCByZXNfaWQpXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9za2VsZXRvbiA9IGl0ZW0uZWZmZWN0X2NvbnRhaW5lci5za2VsZXRvblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlRWZmZWN0KF9za2VsZXRvbiwgcGF0aCwgYm94X2FjdGlvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8v55Sf5oiQ5a6d566xXHJcbiAgICBjcmVhdGVFZmZlY3QoX3NrZWxldG9uLCBwYXRoLCBib3hfYWN0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkUmVzKHBhdGgsIChmdW5jdGlvbiAocmVzKSB7XHJcbiAgICAgICAgICAgIF9za2VsZXRvbi5za2VsZXRvbkRhdGEgPSByZXM7XHJcbiAgICAgICAgICAgIF9za2VsZXRvbi5zZXRBbmltYXRpb24oMCwgYm94X2FjdGlvbiwgdHJ1ZSk7XHJcbiAgICAgICAgfSkuYmluZCh0aGlzKSlcclxuICAgIH0sXHJcblxyXG4gICAgLy8gQGRlc2M65pu05paw5Lu75Yqh5YiX6KGo77yM5piv5ZCm6ZyA6KaB6YeN5paw5pu05paw5YiX6KGoXHJcbiAgICAvLyBhdXRob3I6e2F1dGhvcn1cclxuICAgIC8vIHRpbWU6MjAxOC0wNS0yMiAxOToxMToyOFxyXG4gICAgLy8gLS1AaXNfbmV3OuWmguaenOS4unRydWUs5YiZ6YeN5paw5o6S5bqP5ZCn77yM5ZCm5YiZ5bCx55u05o6l5pu05paw5L2N572uXHJcbiAgICAvLyByZXR1cm5cclxuICAgIHVwZGF0ZVRhc2tMaXN0OiBmdW5jdGlvbiAoaXNfbmV3KSB7XHJcbiAgICAgICAgdGhpcy5pc19uZXcgPSBpc19uZXc7XHJcbiAgICAgICAgaWYgKHRoaXMucm9vdF93bmQgPT0gbnVsbClcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgLy8gaWYgKGlzX25ldyA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHZhciBsaXN0ID0gdGhpcy5tb2RlbC5nZXRUYXNrTGlzdCgpO1xyXG4gICAgICAgICAgICB0aGlzLml0ZW1fc2Nyb2xsdmlldy5zZXREYXRhKGxpc3QpO1xyXG4gICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgIHZhciBzb3J0X2Z1bmMgPSBVdGlscy50YWJsZUxvd2VyU29ydGVyKFtcImZpbmlzaF9zb3J0XCIsIFwiaWRcIl0pO1xyXG4gICAgICAgIC8vICAgICB0aGlzLml0ZW1fc2Nyb2xsdmlldy5yZXNldFBvc2l0aW9uKHNvcnRfZnVuYyk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfSxcclxuXHJcblxyXG4gICAgb25EZWxldGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAodGhpcy5yb2xlX2Fzc2V0c19ldmVudCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJvbGVfdm8gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yb2xlX3ZvLnVuYmluZCh0aGlzLnJvbGVfYXNzZXRzX2V2ZW50KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucm9sZV9hc3NldHNfZXZlbnQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy51cGRhdGVfYWN0aXZpdHlfZXZlbnQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC51bmJpbmQodGhpcy51cGRhdGVfYWN0aXZpdHlfZXZlbnQpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZV9hY3Rpdml0eV9ldmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZV90YXNrX2xpc3QgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC51bmJpbmQodGhpcy51cGRhdGVfdGFza19saXN0KTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVfdGFza19saXN0ID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuaXRlbV9zY3JvbGx2aWV3KSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXRlbV9zY3JvbGx2aWV3LmRlbGV0ZU1lKCk7XHJcbiAgICAgICAgICAgIHRoaXMuaXRlbV9zY3JvbGx2aWV3ID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVGFza1BhbmVsOyJdfQ==