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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/partnersummon/view/partnersummon_window.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, '4b7db4azrtO3qfjh8QFjoB8', 'partnersummon_window');
// Scripts/mod/partnersummon/view/partnersummon_window.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//     这里是描述这个窗体的作用的
// <br/>Create: 2019-01-14 09:29:03
// --------------------------------------------------------------------
var PathTool = require("pathtool");
 
var PartnewSummon = require("partnersummon_item");
 
var SummonEvent = require("partnersummon_event");
 
var SummonConst = require("partnersummon_const");
 
var MainUiController = require("mainui_controller");
 
var GuideEvent = require("guide_event");
 
var PartnersSummon = cc.Class({
  "extends": BaseView,
  properties: {
    item_list: {
      "default": {}
    },
    recruit_sk: null
  },
  ctor: function ctor() {
    this.prefabPath = PathTool.getPrefabPath("partnersummon", "partnersummon_window");
    this.viewTag = SCENE_TAG.ui; //该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意
 
    this.win_type = WinType.Full; //是否是全屏窗体  WinType.Full, WinType.Big, WinType.Mini, WinType.Tips
 
    this.rleasePrefab = false;
    this.ctrl = arguments[0];
    this.model = this.ctrl.getModel();
 
    var RoleController = require("role_controller");
 
    this.role_vo = RoleController.getInstance().getRoleVo();
 
    var ActionController = require("action_controller");
 
    if (ActionController.getInstance().action_operate) {
      ActionController.getInstance().action_operate.setVisible(false);
    }
  },
  initConfig: function initConfig() {
    this.partnersummon_config = Config.recruit_data.data_partnersummon_data;
  },
  openCallBack: function openCallBack() {
    if (this.role_vo_attr) {
      gcore.GlobalEvent.unbind(this.role_vo_attr);
    }
  },
  registerEvent: function registerEvent() {
    // 召唤信息更新
    gcore.GlobalEvent.bind(SummonEvent.UpdateSummonDataEvent, function (data) {
      this.updateSummonGroupData();
    }.bind(this)); // 召唤成功
 
    this.addGlobalEvent(SummonEvent.PartnerSummonSuccess, function () {
      this.playRecruitEffect();
    }.bind(this)); // 积分更新
 
    if (this.role_vo && !this.role_vo_attr) {
      this.role_vo_attr = this.role_vo.bind(EventId.UPDATE_ROLE_ATTRIBUTE, function (key, value) {
        if (key === "recruit_hero" && this.root_wnd) this.updateScoreInfo();
      }.bind(this));
    }
  },
  openRootWnd: function openRootWnd(params) {
    this.initWidgets();
  },
  initWidgets: function initWidgets() {
    this.close_btn_nd = this.seekChild("close_btn");
    this.tips_btn_nd = this.seekChild("tips_btn");
    this.score_btn_nd = this.seekChild("score_btn");
    this.progress_nd = this.seekChild("progress");
    this.card_content_nd = this.seekChild("content");
    this.progress_label_lb = this.seekChild("progress_label", cc.Label);
    this.top_anima_sk = this.seekChild("top_anima", sp.Skeleton);
    this.top_anima_nd = this.seekChild("top_anima");
    this.background_nd = this.seekChild("background");
    this.background_nd.scale = FIT_SCALE;
    this.loadRes(PathTool.getBigBg("bigbg_11"), function (res) {
      this.background_nd.getComponent(cc.Sprite).spriteFrame = res;
    }.bind(this)); // 召唤动画
 
    this.recruit_ani_bg_nd = this.seekChild("recruit_ani_bg");
    this.recruit_ani_sk = this.seekChild("recruit_ani", sp.Skeleton);
    this.recruit_ani_sk.setCompleteListener(this.animaComplete.bind(this));
    this.recruit_ani_bg_nd.on(cc.Node.EventType.TOUCH_END, this.animaComplete, this);
    this.close_btn_nd.on(cc.Node.EventType.TOUCH_END, this.didClickCloseBtn, this);
    this.tips_btn_nd.on(cc.Node.EventType.TOUCH_END, this.didClickTipsBtn, this);
    this.score_btn_nd.on(cc.Node.EventType.TOUCH_END, this.didClickScoreBtn, this);
    var top_anima_path = PathTool.getSpinePath("E50065", "action");
    this.loadRes(top_anima_path, function (ske_data) {
      this.top_anima_sk.skeletonData = ske_data;
      this.top_anima_sk.setAnimation(0, "status_0", true);
    }.bind(this));
    this.updageWidget();
  },
  updageWidget: function updageWidget() {
    this.updateSummonGroupData();
    this.refreshWelfarStatus();
    this.updateScoreInfo();
    var cur_score = this.role_vo.recruit_hero; // 积分信息
  },
  // 更新卡库列表
  updateSummonGroupData: function updateSummonGroupData() {
    var summon_list = this.model.getSummonGroupData();
 
    for (var summon_i = 0; summon_i < summon_list.length; summon_i++) {
      if (!this.item_list[summon_i]) {
        var SummonItem = require("partnersummon_item");
 
        this.item_list[summon_i] = new SummonItem(this.card_content_nd, summon_i, this.startRecruit.bind(this));
      }
 
      this.item_list[summon_i].updateData(summon_list[summon_i]);
    }
  },
  refreshWelfarStatus: function refreshWelfarStatus() {},
  updateScoreInfo: function updateScoreInfo() {
    var need_score = this.model.getScoreSummonNeedCount();
    var have_score = this.role_vo.recruit_hero;
    var progress_percen = 0;
 
    if (have_score >= need_score) {
      progress_percen = 1;
      this.showScoreFullAction(true);
    } else {
      if (have_score >= 0) {
        progress_percen = have_score / need_score;
      }
 
      this.showScoreFullAction(false);
    }
 
    var progress_str = have_score + "/" + need_score;
    this.progress_label_lb.string = progress_str;
    this.progress_nd.scaleX = progress_percen;
  },
  // 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
  closeCallBack: function closeCallBack() {
    gcore.GlobalEvent.fire(GuideEvent.CloseTaskEffect);
 
    var ActionController = require("action_controller");
 
    if (ActionController.getInstance().action_operate) {
      ActionController.getInstance().action_operate.setVisible(true);
    }
 
    this.ctrl.openPartnerSummonWindow(false);
  },
  didClickCloseBtn: function didClickCloseBtn() {
    Utils.playButtonSound(ButtonSound.Close);
    this.ctrl.openPartnerSummonWindow(false);
  },
  didClickTipsBtn: function didClickTipsBtn() {
    Utils.playButtonSound(ButtonSound.Normal);
    MainUiController.getInstance().openCommonExplainView(true, Config.recruit_data.data_explain, Utils.TI18N("规则说明"));
  },
  didClickScoreBtn: function didClickScoreBtn() {
    // var top_anima_path = PathTool.getSpinePath("E50065", "action");
    // LoaderManager.getInstance().releaseRes(top_anima_path);
    Utils.playButtonSound(ButtonSound.Normal);
    this.ctrl.openScoreTipWindow(true);
  },
  // 积分抖动效果
  showScoreFullAction: function showScoreFullAction(status) {
    this.score_btn_nd.rotation = 1;
    this.score_btn_nd.stopAllActions();
    if (!status) return;
    var act_1 = cc.rotateBy(0.05, -10);
    var act_2 = cc.rotateBy(0.1, 20);
    var act_3 = cc.rotateBy(0.05, -10);
    var delay = cc.delayTime(0.7);
    var seq_1 = cc.sequence(act_1, act_2, act_3);
    var seq_2 = cc.repeat(seq_1, 5);
    var seq_3 = cc.sequence(seq_2, delay);
 
    var _final = cc.repeatForever(seq_3);
 
    this.score_btn_nd.runAction(_final);
  },
  startRecruit: function startRecruit(group_id, times, recruit_type) {
    this.last_recruit = {};
    this.last_recruit.group_id = group_id;
    this.last_recruit.times = times;
    this.last_recruit.recruit_type = recruit_type;
    this.sendRecruitProtocal(group_id, times, recruit_type);
  },
  regainRecruit: function regainRecruit() {
    if (!this.last_recruit) return;
 
    if (this.last_recruit.recruit_type == 1) {
      this.last_recruit.recruit_type = 4; // if (this.last_recruit.group_id == SummonConst.Summon_Type.Advanced) {
      //     this.item_list[2].regainRecruit();
      //     return;
      // } else if (this.last_recruit.group_id == SummonConst.Summon_Type.Normal) {
      //     this.item_list[0].regainRecruit();
      //     return;                
      // }
    }
 
    this.sendRecruitProtocal(this.last_recruit.group_id, this.last_recruit.times, this.last_recruit.recruit_type);
  },
  sendRecruitProtocal: function sendRecruitProtocal(group_id, times, recruit_type) {
    var interval;
 
    if (times == 1) {
      interval = 500;
    } else {
      interval = 2000;
    }
 
    if (this.last_time && Math.abs(new Date().getTime() - this.last_time) < interval) {
      //点击间隔
      message(Utils.TI18N("点击过快"));
 
      if (this.ctrl.getSummonResultRoot()) {
        this.model.clickIntervalStatus(true);
      }
 
      return;
    }
 
    this.last_time = new Date().getTime(); //gcore.SmartSocket.getTime()
    // 在此处进行道具的判断和提示。
 
    this.ctrl.send23201(group_id, times, recruit_type);
  },
  // 播放召唤动画
  playRecruitEffect: function playRecruitEffect() {
    var recruit_data = this.model.getRecruitData();
    if (!recruit_data) return;
    var recruit_cgf_item = this.partnersummon_config[recruit_data.group_id];
    var action_name = "action";
    if (recruit_cgf_item) action_name = recruit_cgf_item.action_name;
    var effect_res = PathTool.getEffectRes("120");
    var effect_path = PathTool.getSpinePath(effect_res, "action");
    this.recruit_ani_bg_nd.active = true;
    this.loadRes(effect_path, function (recruit_sk) {
      this.recruit_ani_sk.skeletonData = recruit_sk;
      this.recruit_ani_sk.setAnimation(0, action_name);
    }.bind(this)); // 播放音效
 
    var music_name = "recruit_" + action_name;
    Utils.playEffectSound(AUDIO_TYPE.Recruit, music_name);
    MainUiController.getInstance().setMainUIBottomStatus(false);
    MainUiController.getInstance().setMainUITopStatus(false);
  },
  animaComplete: function animaComplete() {
    MainUiController.getInstance().setMainUIBottomStatus(true);
    MainUiController.getInstance().setMainUITopStatus(true);
    this.recruit_ani_sk.clearTrack(0);
    this.recruit_ani_bg_nd.active = false;
    this.ctrl.openSummonGainWindow(true);
  },
  deleteMe: function deleteMe() {
    this._super();
 
    for (var item_i in this.item_list) {
      this.item_list[item_i].deleteMe();
    }
  },
  getSummonItemRoot: function getSummonItemRoot(name, get_cb) {
    this.root_item_get_cb = get_cb;
    this.root_item_get_name = name;
 
    if (this.item_list[0]) {
      this.item_list[0].getSummonItemRoot(name, get_cb);
    }
  }
});
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxwYXJ0bmVyc3VtbW9uXFx2aWV3XFxwYXJ0bmVyc3VtbW9uX3dpbmRvdy5qcyJdLCJuYW1lcyI6WyJQYXRoVG9vbCIsInJlcXVpcmUiLCJQYXJ0bmV3U3VtbW9uIiwiU3VtbW9uRXZlbnQiLCJTdW1tb25Db25zdCIsIk1haW5VaUNvbnRyb2xsZXIiLCJHdWlkZUV2ZW50IiwiUGFydG5lcnNTdW1tb24iLCJjYyIsIkNsYXNzIiwiQmFzZVZpZXciLCJwcm9wZXJ0aWVzIiwiaXRlbV9saXN0IiwicmVjcnVpdF9zayIsImN0b3IiLCJwcmVmYWJQYXRoIiwiZ2V0UHJlZmFiUGF0aCIsInZpZXdUYWciLCJTQ0VORV9UQUciLCJ1aSIsIndpbl90eXBlIiwiV2luVHlwZSIsIkZ1bGwiLCJybGVhc2VQcmVmYWIiLCJjdHJsIiwiYXJndW1lbnRzIiwibW9kZWwiLCJnZXRNb2RlbCIsIlJvbGVDb250cm9sbGVyIiwicm9sZV92byIsImdldEluc3RhbmNlIiwiZ2V0Um9sZVZvIiwiQWN0aW9uQ29udHJvbGxlciIsImFjdGlvbl9vcGVyYXRlIiwic2V0VmlzaWJsZSIsImluaXRDb25maWciLCJwYXJ0bmVyc3VtbW9uX2NvbmZpZyIsIkNvbmZpZyIsInJlY3J1aXRfZGF0YSIsImRhdGFfcGFydG5lcnN1bW1vbl9kYXRhIiwib3BlbkNhbGxCYWNrIiwicm9sZV92b19hdHRyIiwiZ2NvcmUiLCJHbG9iYWxFdmVudCIsInVuYmluZCIsInJlZ2lzdGVyRXZlbnQiLCJiaW5kIiwiVXBkYXRlU3VtbW9uRGF0YUV2ZW50IiwiZGF0YSIsInVwZGF0ZVN1bW1vbkdyb3VwRGF0YSIsImFkZEdsb2JhbEV2ZW50IiwiUGFydG5lclN1bW1vblN1Y2Nlc3MiLCJwbGF5UmVjcnVpdEVmZmVjdCIsIkV2ZW50SWQiLCJVUERBVEVfUk9MRV9BVFRSSUJVVEUiLCJrZXkiLCJ2YWx1ZSIsInJvb3Rfd25kIiwidXBkYXRlU2NvcmVJbmZvIiwib3BlblJvb3RXbmQiLCJwYXJhbXMiLCJpbml0V2lkZ2V0cyIsImNsb3NlX2J0bl9uZCIsInNlZWtDaGlsZCIsInRpcHNfYnRuX25kIiwic2NvcmVfYnRuX25kIiwicHJvZ3Jlc3NfbmQiLCJjYXJkX2NvbnRlbnRfbmQiLCJwcm9ncmVzc19sYWJlbF9sYiIsIkxhYmVsIiwidG9wX2FuaW1hX3NrIiwic3AiLCJTa2VsZXRvbiIsInRvcF9hbmltYV9uZCIsImJhY2tncm91bmRfbmQiLCJzY2FsZSIsIkZJVF9TQ0FMRSIsImxvYWRSZXMiLCJnZXRCaWdCZyIsInJlcyIsImdldENvbXBvbmVudCIsIlNwcml0ZSIsInNwcml0ZUZyYW1lIiwicmVjcnVpdF9hbmlfYmdfbmQiLCJyZWNydWl0X2FuaV9zayIsInNldENvbXBsZXRlTGlzdGVuZXIiLCJhbmltYUNvbXBsZXRlIiwib24iLCJOb2RlIiwiRXZlbnRUeXBlIiwiVE9VQ0hfRU5EIiwiZGlkQ2xpY2tDbG9zZUJ0biIsImRpZENsaWNrVGlwc0J0biIsImRpZENsaWNrU2NvcmVCdG4iLCJ0b3BfYW5pbWFfcGF0aCIsImdldFNwaW5lUGF0aCIsInNrZV9kYXRhIiwic2tlbGV0b25EYXRhIiwic2V0QW5pbWF0aW9uIiwidXBkYWdlV2lkZ2V0IiwicmVmcmVzaFdlbGZhclN0YXR1cyIsImN1cl9zY29yZSIsInJlY3J1aXRfaGVybyIsInN1bW1vbl9saXN0IiwiZ2V0U3VtbW9uR3JvdXBEYXRhIiwic3VtbW9uX2kiLCJsZW5ndGgiLCJTdW1tb25JdGVtIiwic3RhcnRSZWNydWl0IiwidXBkYXRlRGF0YSIsIm5lZWRfc2NvcmUiLCJnZXRTY29yZVN1bW1vbk5lZWRDb3VudCIsImhhdmVfc2NvcmUiLCJwcm9ncmVzc19wZXJjZW4iLCJzaG93U2NvcmVGdWxsQWN0aW9uIiwicHJvZ3Jlc3Nfc3RyIiwic3RyaW5nIiwic2NhbGVYIiwiY2xvc2VDYWxsQmFjayIsImZpcmUiLCJDbG9zZVRhc2tFZmZlY3QiLCJvcGVuUGFydG5lclN1bW1vbldpbmRvdyIsIlV0aWxzIiwicGxheUJ1dHRvblNvdW5kIiwiQnV0dG9uU291bmQiLCJDbG9zZSIsIk5vcm1hbCIsIm9wZW5Db21tb25FeHBsYWluVmlldyIsImRhdGFfZXhwbGFpbiIsIlRJMThOIiwib3BlblNjb3JlVGlwV2luZG93Iiwic3RhdHVzIiwicm90YXRpb24iLCJzdG9wQWxsQWN0aW9ucyIsImFjdF8xIiwicm90YXRlQnkiLCJhY3RfMiIsImFjdF8zIiwiZGVsYXkiLCJkZWxheVRpbWUiLCJzZXFfMSIsInNlcXVlbmNlIiwic2VxXzIiLCJyZXBlYXQiLCJzZXFfMyIsImZpbmFsIiwicmVwZWF0Rm9yZXZlciIsInJ1bkFjdGlvbiIsImdyb3VwX2lkIiwidGltZXMiLCJyZWNydWl0X3R5cGUiLCJsYXN0X3JlY3J1aXQiLCJzZW5kUmVjcnVpdFByb3RvY2FsIiwicmVnYWluUmVjcnVpdCIsImludGVydmFsIiwibGFzdF90aW1lIiwiTWF0aCIsImFicyIsIkRhdGUiLCJnZXRUaW1lIiwibWVzc2FnZSIsImdldFN1bW1vblJlc3VsdFJvb3QiLCJjbGlja0ludGVydmFsU3RhdHVzIiwic2VuZDIzMjAxIiwiZ2V0UmVjcnVpdERhdGEiLCJyZWNydWl0X2NnZl9pdGVtIiwiYWN0aW9uX25hbWUiLCJlZmZlY3RfcmVzIiwiZ2V0RWZmZWN0UmVzIiwiZWZmZWN0X3BhdGgiLCJhY3RpdmUiLCJtdXNpY19uYW1lIiwicGxheUVmZmVjdFNvdW5kIiwiQVVESU9fVFlQRSIsIlJlY3J1aXQiLCJzZXRNYWluVUlCb3R0b21TdGF0dXMiLCJzZXRNYWluVUlUb3BTdGF0dXMiLCJjbGVhclRyYWNrIiwib3BlblN1bW1vbkdhaW5XaW5kb3ciLCJkZWxldGVNZSIsIl9zdXBlciIsIml0ZW1faSIsImdldFN1bW1vbkl0ZW1Sb290IiwibmFtZSIsImdldF9jYiIsInJvb3RfaXRlbV9nZXRfY2IiLCJyb290X2l0ZW1fZ2V0X25hbWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUEsUUFBUSxH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Q0EsU0FBSyxJQUFJQyxNQUFULElBQW1CLEtBQUt6SyxTQUF4QixFQUFtQztBQUMvQixXQUFLQSxTQUFMLENBQWV5SyxNQUFmLEVBQXVCRixRQUF2QjtBQUNIO0FBQ0osR0F6UXlCO0FBMlExQkcsRUFBQUEsaUJBQWlCLEVBQUUsMkJBQVNDLElBQVQsRUFBZUMsTUFBZixFQUF1QjtBQUN0QyxTQUFLQyxnQkFBTCxHQUF3QkQsTUFBeEI7QUFDQSxTQUFLRSxrQkFBTCxHQUEwQkgsSUFBMUI7O0FBQ0EsUUFBSSxLQUFLM0ssU0FBTCxDQUFlLENBQWYsQ0FBSixFQUF1QjtBQUNuQixXQUFLQSxTQUFMLENBQWUsQ0FBZixFQUFrQjBLLGlCQUFsQixDQUFvQ0MsSUFBcEMsRUFBMENDLE1BQTFDO0FBQ0g7QUFDSjtBQWpSeUIsQ0FBVCxDQUFyQiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEBhdXRob3I6IHh4eEBzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgIOi/memHjOaYr+aPj+i/sOi/meS4queql+S9k+eahOS9nOeUqOeahFxuLy8gPGJyLz5DcmVhdGU6IDIwMTktMDEtMTQgMDk6Mjk6MDNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgUGF0aFRvb2wgPSByZXF1aXJlKFwicGF0aHRvb2xcIik7XG52YXIgUGFydG5ld1N1bW1vbiA9IHJlcXVpcmUoXCJwYXJ0bmVyc3VtbW9uX2l0ZW1cIik7XG52YXIgU3VtbW9uRXZlbnQgPSByZXF1aXJlKFwicGFydG5lcnN1bW1vbl9ldmVudFwiKTtcbnZhciBTdW1tb25Db25zdCA9IHJlcXVpcmUoXCJwYXJ0bmVyc3VtbW9uX2NvbnN0XCIpO1xudmFyIE1haW5VaUNvbnRyb2xsZXIgPSByZXF1aXJlKFwibWFpbnVpX2NvbnRyb2xsZXJcIik7XG52YXIgR3VpZGVFdmVudCA9IHJlcXVpcmUoXCJndWlkZV9ldmVudFwiKTtcblxudmFyIFBhcnRuZXJzU3VtbW9uID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VWaWV3LFxuXG4gICAgcHJvcGVydGllczoge1xuICAgICAgICBpdGVtX2xpc3QgOiB7XG4gICAgICAgICAgICBkZWZhdWx0OiB7fVxuICAgICAgICB9LFxuICAgICAgICByZWNydWl0X3NrOiBudWxsLFxuICAgIH0sXG5cbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucHJlZmFiUGF0aCA9IFBhdGhUb29sLmdldFByZWZhYlBhdGgoXCJwYXJ0bmVyc3VtbW9uXCIsIFwicGFydG5lcnN1bW1vbl93aW5kb3dcIik7XG4gICAgICAgIHRoaXMudmlld1RhZyA9IFNDRU5FX1RBRy51aTsgICAgICAgICAgICAgICAgLy/or6XnqpfkvZPmiYDlsZ51aeWxgue6pyzlhajlsY91aemcgOimgeWcqHVp5bGCLOmdnuWFqOWxj3Vp5ZyoZGlhbG9ndWXlsYIs6L+Z5Liq6KaB5rOo5oSPXG4gICAgICAgIHRoaXMud2luX3R5cGUgPSBXaW5UeXBlLkZ1bGw7ICAgICAgICAgICAgICAgLy/mmK/lkKbmmK/lhajlsY/nqpfkvZMgIFdpblR5cGUuRnVsbCwgV2luVHlwZS5CaWcsIFdpblR5cGUuTWluaSwgV2luVHlwZS5UaXBzXG4gICAgICAgIHRoaXMucmxlYXNlUHJlZmFiID0gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICB0aGlzLmN0cmwgPSBhcmd1bWVudHNbMF07XG4gICAgICAgIHRoaXMubW9kZWwgPSB0aGlzLmN0cmwuZ2V0TW9kZWwoKTtcblxuICAgICAgICB2YXIgUm9sZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwicm9sZV9jb250cm9sbGVyXCIpO1xuICAgICAgICB0aGlzLnJvbGVfdm8gPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpO1xuICAgICAgICB2YXIgQWN0aW9uQ29udHJvbGxlciA9IHJlcXVpcmUoXCJhY3Rpb25fY29udHJvbGxlclwiKVxuICAgICAgICBpZihBY3Rpb25Db250cm9sbGVyLmdldEluc3RhbmNlKCkuYWN0aW9uX29wZXJhdGUpe1xuICAgICAgICAgICAgQWN0aW9uQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmFjdGlvbl9vcGVyYXRlLnNldFZpc2libGUoZmFsc2UpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgaW5pdENvbmZpZzpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLnBhcnRuZXJzdW1tb25fY29uZmlnID0gQ29uZmlnLnJlY3J1aXRfZGF0YS5kYXRhX3BhcnRuZXJzdW1tb25fZGF0YTtcbiAgICB9LFxuXG4gICAgb3BlbkNhbGxCYWNrOmZ1bmN0aW9uKCl7XG4gICAgICAgIGlmICh0aGlzLnJvbGVfdm9fYXR0cikge1xuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQudW5iaW5kKHRoaXMucm9sZV92b19hdHRyKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICByZWdpc3RlckV2ZW50OmZ1bmN0aW9uKCl7XG4gICAgICAgIC8vIOWPrOWUpOS/oeaBr+abtOaWsFxuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5iaW5kKFN1bW1vbkV2ZW50LlVwZGF0ZVN1bW1vbkRhdGFFdmVudCwgZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTdW1tb25Hcm91cERhdGEoKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcblxuICAgICAgICAvLyDlj6zllKTmiJDlip9cbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChTdW1tb25FdmVudC5QYXJ0bmVyU3VtbW9uU3VjY2VzcywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXlSZWNydWl0RWZmZWN0KCk7XG4gICAgICAgIH0uYmluZCh0aGlzKSk7XG5cbiAgICAgICAgLy8g56ev5YiG5pu05pawXG4gICAgICAgIGlmICh0aGlzLnJvbGVfdm8gJiYgIXRoaXMucm9sZV92b19hdHRyKSB7XG4gICAgICAgICAgICB0aGlzLnJvbGVfdm9fYXR0ciA9IHRoaXMucm9sZV92by5iaW5kKEV2ZW50SWQuVVBEQVRFX1JPTEVfQVRUUklCVVRFLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IFwicmVjcnVpdF9oZXJvXCIgJiYgdGhpcy5yb290X3duZClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTY29yZUluZm8oKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBvcGVuUm9vdFduZDpmdW5jdGlvbihwYXJhbXMpe1xuICAgICAgICB0aGlzLmluaXRXaWRnZXRzKCk7XG4gICAgfSxcblxuICAgIGluaXRXaWRnZXRzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5jbG9zZV9idG5fbmQgICAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJjbG9zZV9idG5cIik7XG4gICAgICAgIHRoaXMudGlwc19idG5fbmQgICAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwidGlwc19idG5cIik7XG4gICAgICAgIHRoaXMuc2NvcmVfYnRuX25kICAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwic2NvcmVfYnRuXCIpO1xuICAgICAgICB0aGlzLnByb2dyZXNzX25kICAgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcInByb2dyZXNzXCIpO1xuICAgICAgICB0aGlzLmNhcmRfY29udGVudF9uZCAgICAgPSB0aGlzLnNlZWtDaGlsZChcImNvbnRlbnRcIik7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3NfbGFiZWxfbGIgICA9IHRoaXMuc2Vla0NoaWxkKFwicHJvZ3Jlc3NfbGFiZWxcIiwgY2MuTGFiZWwpO1xuICAgICAgICB0aGlzLnRvcF9hbmltYV9zayAgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcInRvcF9hbmltYVwiLCBzcC5Ta2VsZXRvbik7XG4gICAgICAgIHRoaXMudG9wX2FuaW1hX25kICAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwidG9wX2FuaW1hXCIpO1xuICAgICAgICB0aGlzLmJhY2tncm91bmRfbmQgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcImJhY2tncm91bmRcIik7XG4gICAgICAgIHRoaXMuYmFja2dyb3VuZF9uZC5zY2FsZSA9IEZJVF9TQ0FMRTtcbiAgICAgICAgdGhpcy5sb2FkUmVzKFBhdGhUb29sLmdldEJpZ0JnKFwiYmlnYmdfMTFcIiksZnVuY3Rpb24ocmVzKXtcbiAgICAgICAgICAgIHRoaXMuYmFja2dyb3VuZF9uZC5nZXRDb21wb25lbnQoY2MuU3ByaXRlKS5zcHJpdGVGcmFtZSA9IHJlc1xuICAgICAgICB9LmJpbmQodGhpcykpXG5cbiAgICAgICAgLy8g5Y+s5ZSk5Yqo55S7XG4gICAgICAgIHRoaXMucmVjcnVpdF9hbmlfYmdfbmQgPSB0aGlzLnNlZWtDaGlsZChcInJlY3J1aXRfYW5pX2JnXCIpO1xuICAgICAgICB0aGlzLnJlY3J1aXRfYW5pX3NrICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJyZWNydWl0X2FuaVwiLCBzcC5Ta2VsZXRvbik7XG5cbiAgICAgICAgdGhpcy5yZWNydWl0X2FuaV9zay5zZXRDb21wbGV0ZUxpc3RlbmVyKHRoaXMuYW5pbWFDb21wbGV0ZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5yZWNydWl0X2FuaV9iZ19uZC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIHRoaXMuYW5pbWFDb21wbGV0ZSwgdGhpcyk7XG4gICAgICAgIHRoaXMuY2xvc2VfYnRuX25kLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgdGhpcy5kaWRDbGlja0Nsb3NlQnRuLCB0aGlzKTtcbiAgICAgICAgdGhpcy50aXBzX2J0bl9uZC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIHRoaXMuZGlkQ2xpY2tUaXBzQnRuLCB0aGlzKTtcbiAgICAgICAgdGhpcy5zY29yZV9idG5fbmQub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCB0aGlzLmRpZENsaWNrU2NvcmVCdG4sIHRoaXMpO1xuXG4gICAgICAgIHZhciB0b3BfYW5pbWFfcGF0aCA9IFBhdGhUb29sLmdldFNwaW5lUGF0aChcIkU1MDA2NVwiLCBcImFjdGlvblwiKTtcbiAgICAgICAgdGhpcy5sb2FkUmVzKHRvcF9hbmltYV9wYXRoLCBmdW5jdGlvbihza2VfZGF0YSkge1xuICAgICAgICAgICAgdGhpcy50b3BfYW5pbWFfc2suc2tlbGV0b25EYXRhID0gc2tlX2RhdGE7XG4gICAgICAgICAgICB0aGlzLnRvcF9hbmltYV9zay5zZXRBbmltYXRpb24oMCwgXCJzdGF0dXNfMFwiLCB0cnVlKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLnVwZGFnZVdpZGdldCgpO1xuICAgIH0sXG5cbiAgICB1cGRhZ2VXaWRnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZVN1bW1vbkdyb3VwRGF0YSgpO1xuICAgICAgICB0aGlzLnJlZnJlc2hXZWxmYXJTdGF0dXMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVTY29yZUluZm8oKTtcbiAgICAgICAgdmFyIGN1cl9zY29yZSA9IHRoaXMucm9sZV92by5yZWNydWl0X2hlcm87ICAvLyDnp6/liIbkv6Hmga9cbiAgICB9LFxuXG4gICAgLy8g5pu05paw5Y2h5bqT5YiX6KGoXG4gICAgdXBkYXRlU3VtbW9uR3JvdXBEYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHN1bW1vbl9saXN0ID0gdGhpcy5tb2RlbC5nZXRTdW1tb25Hcm91cERhdGEoKTtcbiAgICAgICAgZm9yICh2YXIgc3VtbW9uX2kgPSAwOyBzdW1tb25faSA8IHN1bW1vbl9saXN0Lmxlbmd0aDsgc3VtbW9uX2krKykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLml0ZW1fbGlzdFtzdW1tb25faV0pIHtcbiAgICAgICAgICAgICAgICB2YXIgU3VtbW9uSXRlbSA9IHJlcXVpcmUoXCJwYXJ0bmVyc3VtbW9uX2l0ZW1cIik7XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtX2xpc3Rbc3VtbW9uX2ldID0gbmV3IFN1bW1vbkl0ZW0odGhpcy5jYXJkX2NvbnRlbnRfbmQsIHN1bW1vbl9pLCB0aGlzLnN0YXJ0UmVjcnVpdC5iaW5kKHRoaXMpKTsgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLml0ZW1fbGlzdFtzdW1tb25faV0udXBkYXRlRGF0YShzdW1tb25fbGlzdFtzdW1tb25faV0pOyAgICAgICAgICAgICAgICBcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICByZWZyZXNoV2VsZmFyU3RhdHVzOiBmdW5jdGlvbigpIHtcbiAgICB9LFxuXG4gICAgdXBkYXRlU2NvcmVJbmZvOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG5lZWRfc2NvcmUgPSB0aGlzLm1vZGVsLmdldFNjb3JlU3VtbW9uTmVlZENvdW50KCk7XG4gICAgICAgIHZhciBoYXZlX3Njb3JlID0gdGhpcy5yb2xlX3ZvLnJlY3J1aXRfaGVybztcbiAgICAgICAgdmFyIHByb2dyZXNzX3BlcmNlbiA9IDA7XG4gICAgICAgIGlmIChoYXZlX3Njb3JlID49IG5lZWRfc2NvcmUpIHtcbiAgICAgICAgICAgIHByb2dyZXNzX3BlcmNlbiA9IDE7XG4gICAgICAgICAgICB0aGlzLnNob3dTY29yZUZ1bGxBY3Rpb24odHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaGF2ZV9zY29yZSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3NfcGVyY2VuID0gaGF2ZV9zY29yZSAvIG5lZWRfc2NvcmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNob3dTY29yZUZ1bGxBY3Rpb24oZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHByb2dyZXNzX3N0ciA9IGhhdmVfc2NvcmUgKyBcIi9cIiArIG5lZWRfc2NvcmU7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3NfbGFiZWxfbGIuc3RyaW5nID0gcHJvZ3Jlc3Nfc3RyO1xuICAgICAgICB0aGlzLnByb2dyZXNzX25kLnNjYWxlWCA9IHByb2dyZXNzX3BlcmNlbjtcbiAgICB9LFxuXG4gICAgLy8g5YWz6Zet56qX5L2T5Zue6LCDLOmcgOimgeWcqOi/memHjOiwg+eUqOivpeeql+S9k+aJgOWxnmNvbnRyb2xsZXLnmoRjbG9zZeaWueazleayoeeUqOS6jue9ruepuuivpeeql+S9k+WunuS+i+WvueixoVxuICAgIGNsb3NlQ2FsbEJhY2s6ZnVuY3Rpb24oKSB7XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoR3VpZGVFdmVudC5DbG9zZVRhc2tFZmZlY3QpO1xuICAgICAgICB2YXIgQWN0aW9uQ29udHJvbGxlciA9IHJlcXVpcmUoXCJhY3Rpb25fY29udHJvbGxlclwiKVxuICAgICAgICBpZihBY3Rpb25Db250cm9sbGVyLmdldEluc3RhbmNlKCkuYWN0aW9uX29wZXJhdGUpe1xuICAgICAgICAgICAgQWN0aW9uQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmFjdGlvbl9vcGVyYXRlLnNldFZpc2libGUodHJ1ZSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN0cmwub3BlblBhcnRuZXJTdW1tb25XaW5kb3coZmFsc2UpOyAgICAgICAgXG4gICAgfSxcblxuICAgIGRpZENsaWNrQ2xvc2VCdG46IGZ1bmN0aW9uKCkge1xuICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoQnV0dG9uU291bmQuQ2xvc2UpO1xuICAgICAgICB0aGlzLmN0cmwub3BlblBhcnRuZXJTdW1tb25XaW5kb3coZmFsc2UpO1xuICAgIH0sXG5cbiAgICBkaWRDbGlja1RpcHNCdG46IGZ1bmN0aW9uKCkge1xuICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoQnV0dG9uU291bmQuTm9ybWFsKTtcbiAgICAgICAgTWFpblVpQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLm9wZW5Db21tb25FeHBsYWluVmlldyh0cnVlLCAgQ29uZmlnLnJlY3J1aXRfZGF0YS5kYXRhX2V4cGxhaW4sIFV0aWxzLlRJMThOKFwi6KeE5YiZ6K+05piOXCIpKTsgICAgICAgIFxuICAgIH0sXG5cbiAgICBkaWRDbGlja1Njb3JlQnRuOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAvLyB2YXIgdG9wX2FuaW1hX3BhdGggPSBQYXRoVG9vbC5nZXRTcGluZVBhdGgoXCJFNTAwNjVcIiwgXCJhY3Rpb25cIik7XG4gICAgICAgIC8vIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWxlYXNlUmVzKHRvcF9hbmltYV9wYXRoKTtcblxuICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoQnV0dG9uU291bmQuTm9ybWFsKTtcbiAgICAgICAgdGhpcy5jdHJsLm9wZW5TY29yZVRpcFdpbmRvdyh0cnVlKTtcbiAgICB9LFxuXG4gICAgLy8g56ev5YiG5oqW5Yqo5pWI5p6cXG4gICAgc2hvd1Njb3JlRnVsbEFjdGlvbjogZnVuY3Rpb24oc3RhdHVzKSB7XG4gICAgICAgIHRoaXMuc2NvcmVfYnRuX25kLnJvdGF0aW9uID0gMTtcbiAgICAgICAgdGhpcy5zY29yZV9idG5fbmQuc3RvcEFsbEFjdGlvbnMoKTtcbiAgICAgICAgaWYgKCFzdGF0dXMpIHJldHVybjtcbiAgICAgICAgdmFyIGFjdF8xID0gY2Mucm90YXRlQnkoMC4wNSwgLTEwKTtcbiAgICAgICAgdmFyIGFjdF8yID0gY2Mucm90YXRlQnkoMC4xLCAyMCk7XG4gICAgICAgIHZhciBhY3RfMyA9IGNjLnJvdGF0ZUJ5KDAuMDUsIC0xMCk7XG4gICAgICAgIHZhciBkZWxheSA9IGNjLmRlbGF5VGltZSgwLjcpO1xuICAgICAgICB2YXIgc2VxXzEgPSBjYy5zZXF1ZW5jZShhY3RfMSwgYWN0XzIsIGFjdF8zKTtcbiAgICAgICAgdmFyIHNlcV8yID0gY2MucmVwZWF0KHNlcV8xLCA1KTtcbiAgICAgICAgdmFyIHNlcV8zID0gY2Muc2VxdWVuY2Uoc2VxXzIsIGRlbGF5KTtcbiAgICAgICAgdmFyIGZpbmFsID0gY2MucmVwZWF0Rm9yZXZlcihzZXFfMyk7XG4gICAgICAgIHRoaXMuc2NvcmVfYnRuX25kLnJ1bkFjdGlvbihmaW5hbCk7XG4gICAgfSxcblxuICAgIHN0YXJ0UmVjcnVpdDogZnVuY3Rpb24oZ3JvdXBfaWQsIHRpbWVzLCByZWNydWl0X3R5cGUpIHtcbiAgICAgICAgdGhpcy5sYXN0X3JlY3J1aXQgPSB7fTtcbiAgICAgICAgdGhpcy5sYXN0X3JlY3J1aXQuZ3JvdXBfaWQgPSBncm91cF9pZDtcbiAgICAgICAgdGhpcy5sYXN0X3JlY3J1aXQudGltZXMgPSB0aW1lcztcbiAgICAgICAgdGhpcy5sYXN0X3JlY3J1aXQucmVjcnVpdF90eXBlID0gcmVjcnVpdF90eXBlO1xuICAgICAgICB0aGlzLnNlbmRSZWNydWl0UHJvdG9jYWwoZ3JvdXBfaWQsIHRpbWVzLCByZWNydWl0X3R5cGUpO1xuICAgIH0sXG5cbiAgICByZWdhaW5SZWNydWl0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxhc3RfcmVjcnVpdCkgcmV0dXJuO1xuXG4gICAgICAgIGlmICh0aGlzLmxhc3RfcmVjcnVpdC5yZWNydWl0X3R5cGUgPT0gMSkge1xuICAgICAgICAgICAgdGhpcy5sYXN0X3JlY3J1aXQucmVjcnVpdF90eXBlID0gNDtcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLmxhc3RfcmVjcnVpdC5ncm91cF9pZCA9PSBTdW1tb25Db25zdC5TdW1tb25fVHlwZS5BZHZhbmNlZCkge1xuICAgICAgICAgICAgLy8gICAgIHRoaXMuaXRlbV9saXN0WzJdLnJlZ2FpblJlY3J1aXQoKTtcbiAgICAgICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgICAgICAvLyB9IGVsc2UgaWYgKHRoaXMubGFzdF9yZWNydWl0Lmdyb3VwX2lkID09IFN1bW1vbkNvbnN0LlN1bW1vbl9UeXBlLk5vcm1hbCkge1xuICAgICAgICAgICAgLy8gICAgIHRoaXMuaXRlbV9saXN0WzBdLnJlZ2FpblJlY3J1aXQoKTtcbiAgICAgICAgICAgIC8vICAgICByZXR1cm47ICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VuZFJlY3J1aXRQcm90b2NhbCh0aGlzLmxhc3RfcmVjcnVpdC5ncm91cF9pZCwgdGhpcy5sYXN0X3JlY3J1aXQudGltZXMsIHRoaXMubGFzdF9yZWNydWl0LnJlY3J1aXRfdHlwZSk7XG4gICAgfSxcblxuICAgIHNlbmRSZWNydWl0UHJvdG9jYWw6IGZ1bmN0aW9uKGdyb3VwX2lkLCB0aW1lcywgcmVjcnVpdF90eXBlKSB7XG4gICAgICAgIGxldCAgaW50ZXJ2YWw7XG4gICAgICAgIGlmKHRpbWVzID09IDEpe1xuICAgICAgICAgICAgaW50ZXJ2YWwgPSA1MDA7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgaW50ZXJ2YWwgPSAyMDAwO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMubGFzdF90aW1lICYmIE1hdGguYWJzKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gdGhpcy5sYXN0X3RpbWUpIDwgaW50ZXJ2YWwpe1xuICAgICAgICAgICAgLy/ngrnlh7vpl7TpmpRcbiAgICAgICAgICAgIG1lc3NhZ2UoVXRpbHMuVEkxOE4oXCLngrnlh7vov4flv6tcIikpXG4gICAgICAgICAgICBpZih0aGlzLmN0cmwuZ2V0U3VtbW9uUmVzdWx0Um9vdCgpKXtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmNsaWNrSW50ZXJ2YWxTdGF0dXModHJ1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHRoaXMubGFzdF90aW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCkvL2djb3JlLlNtYXJ0U29ja2V0LmdldFRpbWUoKVxuICAgICAgICAvLyDlnKjmraTlpITov5vooYzpgZPlhbfnmoTliKTmlq3lkozmj5DnpLrjgIJcbiAgICAgICAgdGhpcy5jdHJsLnNlbmQyMzIwMShncm91cF9pZCwgdGltZXMsIHJlY3J1aXRfdHlwZSk7XG4gICAgfSxcblxuICAgIC8vIOaSreaUvuWPrOWUpOWKqOeUu1xuICAgIHBsYXlSZWNydWl0RWZmZWN0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHJlY3J1aXRfZGF0YSA9IHRoaXMubW9kZWwuZ2V0UmVjcnVpdERhdGEoKTtcblxuICAgICAgICBpZiAoIXJlY3J1aXRfZGF0YSkgcmV0dXJuO1xuXG4gICAgICAgIHZhciByZWNydWl0X2NnZl9pdGVtID0gdGhpcy5wYXJ0bmVyc3VtbW9uX2NvbmZpZ1tyZWNydWl0X2RhdGEuZ3JvdXBfaWRdO1xuICAgICAgICB2YXIgYWN0aW9uX25hbWUgPSBcImFjdGlvblwiO1xuICAgICAgICBpZiAocmVjcnVpdF9jZ2ZfaXRlbSlcbiAgICAgICAgICAgIGFjdGlvbl9uYW1lID0gcmVjcnVpdF9jZ2ZfaXRlbS5hY3Rpb25fbmFtZTtcbiAgICAgICAgdmFyIGVmZmVjdF9yZXMgPSBQYXRoVG9vbC5nZXRFZmZlY3RSZXMoXCIxMjBcIik7XG4gICAgICAgIHZhciBlZmZlY3RfcGF0aCA9IFBhdGhUb29sLmdldFNwaW5lUGF0aChlZmZlY3RfcmVzLCBcImFjdGlvblwiKTtcblxuICAgICAgICB0aGlzLnJlY3J1aXRfYW5pX2JnX25kLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIHRoaXMubG9hZFJlcyhlZmZlY3RfcGF0aCwgZnVuY3Rpb24ocmVjcnVpdF9zaykge1xuICAgICAgICAgICAgdGhpcy5yZWNydWl0X2FuaV9zay5za2VsZXRvbkRhdGEgPSByZWNydWl0X3NrO1xuICAgICAgICAgICAgdGhpcy5yZWNydWl0X2FuaV9zay5zZXRBbmltYXRpb24oMCwgYWN0aW9uX25hbWUpO1xuICAgICAgICB9LmJpbmQodGhpcykpO1xuXG4gICAgICAgIC8vIOaSreaUvumfs+aViFxuICAgICAgICB2YXIgbXVzaWNfbmFtZSA9IFwicmVjcnVpdF9cIiArIGFjdGlvbl9uYW1lO1xuICAgICAgICBVdGlscy5wbGF5RWZmZWN0U291bmQoQVVESU9fVFlQRS5SZWNydWl0LCBtdXNpY19uYW1lKTtcblxuICAgICAgICBNYWluVWlDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2V0TWFpblVJQm90dG9tU3RhdHVzKGZhbHNlKTtcbiAgICAgICAgTWFpblVpQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNldE1haW5VSVRvcFN0YXR1cyhmYWxzZSk7ICAgICAgICBcbiAgICB9LFxuXG4gICAgYW5pbWFDb21wbGV0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIE1haW5VaUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5zZXRNYWluVUlCb3R0b21TdGF0dXModHJ1ZSk7ICAgICAgICBcbiAgICAgICAgTWFpblVpQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNldE1haW5VSVRvcFN0YXR1cyh0cnVlKTsgICAgICAgIFxuICAgICAgICB0aGlzLnJlY3J1aXRfYW5pX3NrLmNsZWFyVHJhY2soMCk7XG4gICAgICAgIHRoaXMucmVjcnVpdF9hbmlfYmdfbmQuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY3RybC5vcGVuU3VtbW9uR2FpbldpbmRvdyh0cnVlKTtcbiAgICB9LFxuXG4gICAgZGVsZXRlTWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLl9zdXBlcigpO1xuICAgICAgICBmb3IgKHZhciBpdGVtX2kgaW4gdGhpcy5pdGVtX2xpc3QpIHtcbiAgICAgICAgICAgIHRoaXMuaXRlbV9saXN0W2l0ZW1faV0uZGVsZXRlTWUoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRTdW1tb25JdGVtUm9vdDogZnVuY3Rpb24obmFtZSwgZ2V0X2NiKSB7XG4gICAgICAgIHRoaXMucm9vdF9pdGVtX2dldF9jYiA9IGdldF9jYjtcbiAgICAgICAgdGhpcy5yb290X2l0ZW1fZ2V0X25hbWUgPSBuYW1lO1xuICAgICAgICBpZiAodGhpcy5pdGVtX2xpc3RbMF0pIHtcbiAgICAgICAgICAgIHRoaXMuaXRlbV9saXN0WzBdLmdldFN1bW1vbkl0ZW1Sb290KG5hbWUsIGdldF9jYik7XG4gICAgICAgIH1cbiAgICB9LFxufSkiXX0=