difenduandada
2024-12-31 34abe6963b344c882358274957f4b992456fee40
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/chat/view/chat_item.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, '0c5beN4BwhJVbiEQYzIsQu+', 'chat_item');
// Scripts/mod/chat/view/chat_item.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: shiraho@syg.com(必填, 创建模块的人员)
// @description:
//      物品单列,显示对象
// <br/>Create: new Date().toISOString()
// --------------------------------------------------------------------
var PathTool = require("pathtool");
 
var GoodsVo = require("goods_vo");
 
var PathTool = require("pathtool");
 
var BackPackConst = require("backpack_const");
 
var ChatConst = require("chat_const");
 
var ChatItemController = require("chat_item_controller");
 
var ChatHelp = require("chat_help");
 
var ChatController = require("chat_controller");
 
var ChatItem = cc.Class({
  "extends": BaseView,
  properties: {
    content: null,
    msg_index: 0,
    // 消息标签号
    data: null,
    height: 100,
    update_cb: null,
    pos_y: 0,
    is_mine: false,
    head_margin: 63,
    name_margin: 120,
    msg_bg_pos: 220,
    msg_rt_pos: 200,
    channel: null,
    init_ing: false,
    have_nd: true,
    head_sp: null,
    sp_res: null,
    is_loading: false
  },
  ctor: function ctor() {
    this.content = arguments[0];
    this.data = arguments[1];
    this.height = arguments[2];
    this.pos_y = arguments[3];
    this.channel = arguments[4];
 
    var RoleController = require("role_controller");
 
    var role_vo = this.role_vo = RoleController.getInstance().getRoleVo();
 
    if (this.channel === ChatConst.Channel.Friend) {
      if (this.data.flag === 1 || this.data.flag === 11 || !this.data.flag) {
        this.is_mine = true;
        this.face_id = role_vo.face_id;
        this.r_name = role_vo.name;
      } else {
        this.face_id = this.data.face_id;
        this.r_name = this.data.name;
      }
    } else if (this.channel === ChatConst.Channel.System) {} else {
      if (this.data && this.data.role_list && this.data.role_list[0]) {
        var msg_role = this.data.role_list[0];
        if (msg_role.rid === role_vo.rid && msg_role.srv_id === role_vo.srv_id) this.is_mine = true;
        this.face_id = this.data.role_list[0].face_id;
        this.r_name = this.data.role_list[0].name;
      }
    }
 
    var msg;
 
    if (this.data.len == 0) {
      msg = StringUtil.parseStr(this.data.msg, "handler").string;
    } else {
      msg = this.data.msg;
    } // 对数据进行初始化
 
 
    this.msg = msg;
    this.head_path = PathTool.getHeadRes(this.face_id);
    this.chat_item_ctrl = ChatItemController.getInstance();
    this.updateInterval = 1;
    this.updateTimer = 0;
    this.totalCount = 0;
  },
  initRootWind: function initRootWind() {
    if (this.init_ing) return;
    this.root_wnd = this.content.getChatItemNd();
 
    if (this.root_wnd) {
      this.have_nd = true;
      this.root_wnd.active = true;
      this.initWidget();
    } else {
      var prefab_path = PathTool.getPrefabPath("chat", "chat_item");
      LoaderManager.getInstance().loadRes(prefab_path, function (res_object) {
        this.init_ing = false;
        var root_wnd = res_object;
 
        if (this.content && this.content.msgs_content) {
          root_wnd.parent = this.content.msgs_content;
 
          if (this.have_nd) {
            this.root_wnd = root_wnd;
            this.initWidget();
          } else {
            root_wnd.active = false;
            this.content.chat_items_cache.push(root_wnd);
          }
        }
      }.bind(this));
      this.init_ing = true;
    }
  },
  initWidget: function initWidget() {
    this.common_msg_nd = this.seekChild("common_msg");
    this.notice_msg_nd = this.seekChild("notice");
    this.head_nd = this.seekChild("head_bg");
    this.name_nd = this.seekChild("name_nd");
    this.head_kuang_sp = this.seekChild("head_kuang", cc.Sprite);
    this.sex_nd = this.seekChild("sex");
    this.sex_sp = this.seekChild("sex", cc.Sprite);
    this.msg_root_nd = this.seekChild("msg_root");
    this.message_bg_nd = this.seekChild("msg_bg");
    this.head_sp = this.seekChild("head_sp", cc.Sprite);
    this.name_lb = this.seekChild("name_nd", cc.Label);
    this.message_rt = this.seekChild("msg_rt", cc.RichText);
    this.message_nd = this.seekChild("msg_rt");
    this.notice_msg_rt = this.seekChild("notice_msg", cc.RichText);
    this.head_wd = this.head_nd.getComponent(cc.Widget);
    this.name_wd = this.name_nd.getComponent(cc.Widget);
    this.message_wd = this.message_nd.getComponent(cc.Widget);
    this.root_wnd.height = 100;
    this.message_nd.height = 24;
    this.message_bg_nd.height = 36;
    this.message_rt.addTouchHandler("handler", this.onClickItem.bind(this));
    this.notice_msg_rt.addTouchHandler("handler", this.onClickItem.bind(this));
 
    if (this.data) {
      this.updateWidget();
      this.register();
    }
  },
  register: function register() {
    this.head_kuang_sp.node.on(cc.Node.EventType.TOUCH_START, this.upBtnStart, this);
    this.head_kuang_sp.node.on(cc.Node.EventType.TOUCH_CANCEL, this.upBtnEnd, this);
    this.head_kuang_sp.node.on(cc.Node.EventType.TOUCH_END, this.upBtnEnd, this);
  },
  upBtnStart: function upBtnStart() {
    this.stopUpdate();
    this.startUpdate();
  },
  upBtnEnd: function upBtnEnd() {
    this.stopUpdate();
 
    if (this.totalCount < this.updateInterval) {
      //小于1秒时
      this.touchHead();
    } else {
      if (this.data == null || this.data.role_list == null || this.data.role_list[0] == null || this.role_vo == null) {
        this.totalCount = 0;
        this.updateTimer = 0;
        return;
      }
 
      if (this.data.role_list[0].rid == this.role_vo.rid && this.data.role_list[0].srv_id == this.role_vo.srv_id) {
        this.totalCount = 0;
        this.updateTimer = 0;
        return;
      }
 
      var input = ChatController.getInstance().getChatInput();
 
      if (input) {
        input.setInputText("@" + this.data.role_list[0].name + " ");
      }
    }
 
    this.totalCount = 0;
    this.updateTimer = 0;
  },
  update: function update(dt) {
    if (this.head_kuang_sp.node.active == false) {
      this.totalCount = 0;
      this.updateTimer = 0;
      this.stopUpdate();
      return;
    }
 
    this.updateTimer += dt;
    this.totalCount += dt;
 
    if (this.updateTimer >= this.updateInterval) {
      this.updateTimer = 0;
 
      if (this.data == null || this.data.role_list == null || this.data.role_list[0] == null || this.role_vo == null) {
        this.stopUpdate();
        return;
      }
 
      if (this.data.role_list[0].rid == this.role_vo.rid && this.data.role_list[0].srv_id == this.role_vo.srv_id) {
        this.stopUpdate();
        return;
      }
 
      var input = ChatController.getInstance().getChatInput();
 
      if (input) {
        input.setInputText("@" + this.data.role_list[0].name + " ");
      }
    }
  },
  touchHead: function touchHead() {
    var rid, srv_id, name;
 
    if (this.channel === ChatConst.Channel.Friend) {
      // rid = this.data.rid;
      // srv_id = this.data.srv_id;
      return;
    } else {
      if (this.data && this.data.role_list && this.data.role_list[0]) {
        rid = this.data.role_list[0].rid;
        srv_id = this.data.role_list[0].srv_id;
        name = this.data.role_list[0].name;
      }
    }
 
    if (rid == this.role_vo.rid) return;
    Utils.playButtonSound(1);
    ChatController.getInstance().openFriendInfo({
      srv_id: srv_id,
      rid: rid,
      channel: this.channel,
      name: name
    });
  },
  onShow: function onShow() {},
  // 更新数据
  updateData: function updateData(data, msg_index, pos_y) {
    this.data = data;
    this.pos_y = pos_y; // if ()
  },
  // 更新布局
  updateWidget: function updateWidget() {
    if (this.channel == ChatConst.Channel.System) {
      this.common_msg_nd.active = false;
      this.notice_msg_nd.active = true;
      this.root_wnd.y = -this.pos_y;
      this.notice_msg_rt.string = this.msg;
      this.notice_msg_nd.width = 640;
      this.notice_msg_nd.height = this.notice_msg_rt.node.height + 20;
      this.root_wnd.height = this.notice_msg_nd.height + 20;
      return;
    } else {
      this.notice_msg_nd.active = false;
      var show_delay = cc.delayTime(0.1);
      var show_active = cc.callFunc(function () {
        this.common_msg_nd.active = true;
      }, this);
      var show_act = cc.sequence(show_delay, show_active);
      this.root_wnd.runAction(show_act);
    } // 布局
 
 
    if (this.is_mine) {
      this.head_wd.isAlignLeft = false;
      this.head_wd.isAlignRight = true;
      this.head_wd.right = this.head_margin;
      this.name_wd.isAlignLeft = false;
      this.name_wd.isAlignRight = true;
      this.name_wd.right = this.name_margin;
      this.message_bg_nd.anchorX = 1;
      this.message_nd.anchorX = 1; // this.message_bg_nd.x =  this.msg_bg_pos - this.message_bg_nd.width;
 
      this.message_nd.x = this.msg_rt_pos - 5;
      this.message_bg_nd.scaleX = -1;
    } else {
      this.head_wd.isAlignLeft = true;
      this.head_wd.isAlignRight = false;
      this.head_wd.left = this.head_margin;
      this.name_wd.isAlignLeft = true;
      this.name_wd.isAlignRight = false;
      this.name_wd.left = this.name_margin;
      this.message_bg_nd.anchorX = 0;
      this.message_nd.anchorX = 0;
      this.message_bg_nd.x = -this.msg_bg_pos;
      this.message_nd.x = -this.msg_rt_pos;
      this.message_bg_nd.scaleX = 1;
    } // 设置表情
 
 
    var emoji_ids = this.chat_item_ctrl.getEmojis(this.msg);
 
    for (var emoji_i in emoji_ids) {
      var anima_path = PathTool.getSpinePath(emoji_ids[emoji_i]);
      this.loadRes(anima_path, function (emoji, emoji_sd) {
        this.message_rt.addEmojiAtlas(emoji_sd, emoji);
        this.message_bg_nd.height = this.message_nd.height + 12;
        this.message_bg_nd.width = this.message_nd.width + 30;
 
        if (this.is_mine) {
          this.message_bg_nd.x = this.msg_bg_pos - this.message_bg_nd.width;
        }
      }.bind(this, emoji_ids[emoji_i]));
    } // 设置Imag
 
 
    var item_imgs = this.chat_item_ctrl.getImages(this.msg);
 
    for (var img_i in item_imgs) {
      var item_path = PathTool.getItemRes(item_imgs[img_i]);
      this.loadRes(item_path, function (item_sf) {
        this.message_rt.addSpriteFrame(item_sf);
        this.message_bg_nd.height = this.message_nd.height + 12;
        this.message_bg_nd.width = this.message_nd.width + 30;
 
        if (this.is_mine) {
          this.message_bg_nd.x = this.msg_bg_pos - this.message_bg_nd.width;
        }
      }.bind(this));
    }
 
    this.message_rt.maxWidth = 0;
    this.message_rt.string = this.msg; // this.message_rt.addTouchHandler("handler", this.onClickItem.bind(this))
 
    this.root_wnd.y = -this.pos_y;
 
    if (this.message_nd.width >= 400) {
      this.message_rt.maxWidth = 400;
    } else {
      this.message_rt.maxWidth = 0;
    }
 
    this.message_bg_nd.height = this.message_nd.height + 12;
    this.message_bg_nd.width = this.message_nd.width + 30;
 
    if (this.is_mine) {
      this.message_bg_nd.x = this.msg_bg_pos - this.message_bg_nd.width;
    }
 
    this.root_wnd.height += this.message_nd.height; // 头像
 
    if (this.sp_res) {
      this.head_sp.spriteFrame = this.sp_res;
    } else {
      if (!this.is_loading) {
        this.is_loading = true;
        this.loadRes(this.head_path, function (res_object) {
          this.sp_res = res_object;
          this.head_sp.spriteFrame = this.sp_res;
          this.is_loading = false;
        }.bind(this));
      }
    }
 
    var role_data = this.data;
 
    if (this.channel === ChatConst.Channel.Friend) {
      role_data = this.data;
    } else {
      if (this.data && this.data.role_list && this.data.role_list[0]) {
        role_data = this.data.role_list[0];
      }
    } // 头像框
 
 
    this.loadFrameRes(role_data.head_bid); // name
 
    var name_str = this.r_name;
 
    if (this.channel == ChatConst.Channel.Cross) {} else if (this.channel == ChatConst.Channel.Province) {
      if (this.is_mine) {
        name_str = cc.js.formatStr("%s    %s", role_data.city, this.r_name);
      } else {
        name_str = cc.js.formatStr("%s    %s", this.r_name, role_data.city);
      }
    }
 
    this.name_lb.string = name_str; // sex
 
    if (role_data.sex !== 2 && typeof role_data.sex == "number") {
      this.sex_nd.active = true;
      var sex_res_path = PathTool.getUIIconPath("common", "common_sex" + role_data.sex);
      this.loadRes(sex_res_path, function (sex_sf) {
        this.sex_sp.spriteFrame = sex_sf;
      }.bind(this));
    } else {
      this.sex_nd.active = false;
    } // vip 
 
 
    if (role_data.is_show_vip === 0 && role_data.vip_lev > 0 && this.channel !== ChatConst.Channel.Province) {} else {// 不显示vip
    }
  },
  //scale默认比例是大部分需要缩放所以用了100/117,其他情况结合自己界面修改scale值
  loadFrameRes: function loadFrameRes(bid, scale) {
    if (scale == null) {
      scale = 100 / 117;
    }
 
    if (typeof bid == "number") {
      var config = Config.avatar_data.data_avatar[bid];
 
      if (!config) {
        return;
      }
 
      var res_path = PathTool.getHeadcircle(config.res_id);
      this.loadRes(res_path, function (resObject) {
        this.head_kuang_sp.spriteFrame = resObject;
      }.bind(this));
      this.head_kuang_sp.node.scale = scale;
 
      if (bid == 1000) {
        this.head_kuang_sp.node.y = 0;
      } else {
        this.head_kuang_sp.node.y = 5;
      }
    } else {
      if (bid == null) {
        bid = PathTool.getCommonIcomPath("common_1031");
        scale = 1;
      }
 
      this.loadRes(bid, function (resObject) {
        this.head_kuang_sp.spriteFrame = resObject;
      }.bind(this));
      this.head_kuang_sp.node.scale = scale;
      this.head_kuang_sp.node.y = 0;
    }
  },
  onHide: function onHide() {},
  onDelete: function onDelete() {
    this.stopUpdate(); // LoaderManager.getInstance().releaseRes(this.head_path);
  },
  // content显示区域更新区域
  updateContent: function updateContent(isCache) {
    if (isCache) {
      if (this.root_wnd) {
        if (this.head_kuang_sp && this.head_kuang_sp.node) {
          this.head_kuang_sp.node.off(cc.Node.EventType.TOUCH_START, this.upBtnStart, this);
          this.head_kuang_sp.node.off(cc.Node.EventType.TOUCH_CANCEL, this.upBtnEnd, this);
          this.head_kuang_sp.node.off(cc.Node.EventType.TOUCH_END, this.upBtnEnd, this);
        }
 
        this.root_wnd.active = false;
        this.content.chat_items_cache.push(this.root_wnd);
        this.root_wnd = null;
      }
 
      this.have_nd = false;
      return;
    }
 
    var content_pos = this.content.getContentPos();
 
    if (this.pos_y < content_pos + 800 && this.pos_y > content_pos - 300) {
      this.have_nd = true;
 
      if (!this.root_wnd) {
        this.initRootWind();
      } else {
        this.root_wnd.y = -this.pos_y;
      }
    } else {
      if (this.root_wnd) {
        if (this.head_kuang_sp && this.head_kuang_sp.node) {
          this.head_kuang_sp.node.off(cc.Node.EventType.TOUCH_START, this.upBtnStart, this);
          this.head_kuang_sp.node.off(cc.Node.EventType.TOUCH_CANCEL, this.upBtnEnd, this);
          this.head_kuang_sp.node.off(cc.Node.EventType.TOUCH_END, this.upBtnEnd, this);
        }
 
        this.root_wnd.active = false;
        this.content.chat_items_cache.push(this.root_wnd);
        this.root_wnd = null;
      }
 
      this.have_nd = false;
    }
  },
  onClickFrom: function onClickFrom(event, parame) {},
  onClickItem: function onClickItem(data, parame) {
    var parames = parame.split("|");
    var link_type = parames[0];
    var sev_id = parames[1];
    var share_id = parames[2];
    ChatHelp.getInstance().onChatTouched(link_type, parame, this.data);
  },
  getId: function getId() {
    if (!this.data) return null;
    return this.data.id;
  }
});
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxjaGF0XFx2aWV3XFxjaGF0X2l0ZW0uanMiXSwibmFtZXMiOlsiUGF0aFRvb2wiLCJyZXF1aXJlIiwiR29vZHNWbyIsIkJhY2tQYWNrQ29uc3QiLCJDaGF0Q29uc3QiLCJDaGF0SXRlbUNvbnRyb2xsZXIiLCJDaGF0SGVscCIsIkNoYXRDb250cm9sbGVyIiwiQ2hhdEl0ZW0iLCJjYyIsIkNsYXNzIiwiQmFzZVZpZXciLCJwcm9wZXJ0aWVzIiwiY29udGVudCIsIm1zZ19pbmRleCIsImRhdGEiLCJoZWlnaHQiLCJ1cGRhdGVfY2IiLCJwb3NfeSIsImlzX21pbmUiLCJoZWFkX21hcmdpbiIsIm5hbWVfbWFyZ2luIiwibXNnX2JnX3BvcyIsIm1zZ19ydF9wb3MiLCJjaGFubmVsIiwiaW5pdF9pbmciLCJoYXZlX25kIiwiaGVhZF9zcCIsInNwX3JlcyIsImlzX2xvYWRpbmciLCJjdG9yIiwiYXJndW1lbnRzIiwiUm9sZUNvbnRyb2xsZXIiLCJyb2xlX3ZvIiwiZ2V0SW5zdGFuY2UiLCJnZXRSb2xlVm8iLCJDaGFubmVsIiwiRnJpZW5kIiwiZmxhZyIsImZhY2VfaWQiLCJyX25hbWUiLCJuYW1lIiwiU3lzdGVtIiwicm9sZV9saXN0IiwibXNnX3JvbGUiLCJyaWQiLCJzcnZfaWQiLCJtc2ciLCJsZW4iLCJTdHJpbmdVdGlsIiwicGFyc2VTdHIiLCJzdHJpbmciLCJoZWFkX3BhdGgiLCJnZXRIZWFkUmVzIiwiY2hhdF9pdGVtX2N0cmwiLCJ1cGRhdGVJbnRlcnZhbCIsInVwZGF0ZVRpbWVyIiwidG90YWxDb3VudCIsImluaXRSb290V2luZCIsInJvb3Rfd25kIiwiZ2V0Q2hhdEl0ZW1OZCIsImFjdGl2ZSIsImluaXRXaWRnZXQiLCJwcmVmYWJfcGF0aCIsImdldFByZWZhYlBhdGgiLCJMb2FkZXJNYW5hZ2VyIiwibG9hZFJlcyIsInJlc19vYmplY3QiLCJtc2dzX2NvbnRlbnQiLCJwYXJlbnQiLCJjaGF0X2l0ZW1zX2NhY2hlIiwicHVzaCIsImJpbmQiLCJjb21tb25fbXNnX25kIiwic2Vla0NoaWxkIiwibm90aWNlX21zZ19uZCIsImhlYWRfbmQiLCJuYW1lX25kIiwiaGVhZF9rdWFuZ19zcCIsIlNwcml0ZSIsInNleF9uZCIsInNleF9zcCIsIm1zZ19yb290X25kIiwibWVzc2FnZV9iZ19uZCIsIm5hbWVfbGIiLCJMYWJlbCIsIm1lc3NhZ2VfcnQiLCJSaWNoVGV4dCIsIm1lc3NhZ2VfbmQiLCJub3RpY2VfbXNnX3J0IiwiaGVhZF93ZCIsImdldENvbXBvbmVudCIsIldpZGdldCIsIm5hbWVfd2QiLCJtZXNzYWdlX3dkIiwiYWRkVG91Y2hIYW5kbGVyIiwib25DbGlja0l0ZW0iLCJ1cGRhdGVXaWRnZXQiLCJyZWdpc3RlciIsIm5vZGUiLCJvbiIsIk5vZGUiLCJFdmVudFR5cGUiLCJUT1VDSF9TVEFSVCIsInVwQnRuU3RhcnQiLCJUT1VDSF9DQU5DRUwiLCJ1cEJ0bkVuZCIsIlRPVUNIX0VORCIsInN0b3BVcGRhdGUiLCJzdGFydFVwZGF0ZSIsInRvdWNoSGVhZCIsImlucHV0IiwiZ2V0Q2hhdElucHV0Iiwic2V0SW5wdXRUZXh0IiwidXBkYXRlIiwiZHQiLCJVdGlscyIsInBsYXlCdXR0b25Tb3VuZCIsIm9wZW5GcmllbmRJbmZvIiwib25TaG93IiwidXBkYXRlRGF0YSIsInkiLCJ3aWR0aCIsInNob3dfZGVsYXkiLCJkZWxheVRpbWUiLCJzaG93X2FjdGl2ZSIsImNhbGxGdW5jIiwic2hvd19hY3QiLCJzZXF1ZW5jZSIsInJ1bkFjdGlvbiIsImlzQWxpZ25MZWZ0IiwiaXNBbGlnblJpZ2h0IiwicmlnaHQiLCJhbmNob3JYIiwieCIsInNjYWxlWCIsImxlZnQiLCJlbW9qaV9pZHMiLCJnZXRFbW9qaXMiLCJlbW9qaV9pIiwiYW5pbWFfcGF0aCIsImdldFNwaW5lUGF0aCIsImVtb2ppIiwiZW1vamlfc2QiLCJhZGRFbW9qaUF0bGFzIiwiaXRlbV9pbWdzIiwiZ2V0SW1hZ2VzIiwiaW1nX2kiLCJpdGVtX3BhdGgiLCJnZXRJdGVtUmVzIiwiaXRlbV9zZiIsImFkZFNwcml0ZUZyYW1lIiwibWF4V2lkdGgiLCJzcHJpdGVGcmFtZSIsInJvbGVfZGF0YSIsImxvYWRGcmFtZVJlcyIsImhlYWRfYmlkIiwibmFtZV9zdHIiLCJDcm9zcyIsIlByb3ZpbmNlIiwianMiLCJmb3JtYXRTdHIiLCJjaXR5Iiwic2V4Iiwic2V4X3Jlc19wYXRoIiwiZ2V0VUlJY29uUGF0aCIsInNleF9zZiIsImlzX3Nob3dfdmlwIiwidmlwX2xldiIsImJpZCIsInNjYWxlIiwiY29uZmlnIiwiQ29uZmlnIiwiYXZhdGFyX2RhdGEiLCJkYXRhX2F2YXRhciIsInJlc19wYXRoIiwiZ2V0SGVhZGNpcmNsZSIsInJlc19pZCIsInJlc09iamVjdCIsImdldENvbW1vbkljb21QYXRoIiwib25IaWRlIiwib25EZWxldGUiLCJ1cGRhdGVDb250ZW50IiwiaXNDYWNoZSIsIm9mZiIsImNvbnRlbnRfcG9zIiwiZ2V0Q29udGVudFBvcyIsIm9uQ2xpY2tGcm9tIiwiZXZlbnQiLCJwYXJhbWUiLCJwYXJhbWVzIiwic3BsaXQiLCJsaW5rX3R5cGUiLCJzZXZfaWQiLCJzaGFyZV9pZCIsIm9uQ2hhdFRvdWNoZWQiLCJnZXRJZCIsImlkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLFFBQVEsR0FBYUMsT0FBTyxDQUFDLFVBQUQsQ0FBaEM7O0FBQ0EsSUFBSUMsT0FBTyxHQUFjRCxPQUFPLENBQUMsVUFBRCxDQUFoQzs7QUFDQSxJQUFJRCxRQUFRLEdBQWFDLE9BQU8sQ0FBQyxVQUFELENBQWhDOztBQUNBLElBQUlFLGFBQWEsR0FBUUYsT0FBTyxDQUFDLGdCQUFELENBQWhDOztBQUNBLElBQUlHLFNBQVMsR0FBWUgsT0FBTyxDQUFDLFlBQUQsQ0FBaEM7O0FBQ0EsSUFBSUksa0JBQWtCLEdBQUdKLE9BQU8sQ0FBQyxzQkFBRCxDQUFoQzs7QUFDQSxJQUFJSyxRQUFRLEdBQWFMLE9BQU8sQ0FB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QUMsaUJBQVU7QUFDWixRQUFHLENBQUMsS0FBS3JMLElBQVQsRUFBYyxPQUFPLElBQVA7QUFDZCxXQUFPLEtBQUtBLElBQUwsQ0FBVXNMLEVBQWpCO0FBQ0g7QUF2ZW1CLENBQVQsQ0FBZiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy8gQGF1dGhvcjogc2hpcmFob0BzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxyXG4vLyBAZGVzY3JpcHRpb246XHJcbi8vICAgICAg54mp5ZOB5Y2V5YiXLOaYvuekuuWvueixoVxyXG4vLyA8YnIvPkNyZWF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbnZhciBQYXRoVG9vbCAgICAgICAgICAgPSByZXF1aXJlKFwicGF0aHRvb2xcIik7XHJcbnZhciBHb29kc1ZvICAgICAgICAgICAgPSByZXF1aXJlKFwiZ29vZHNfdm9cIik7XHJcbnZhciBQYXRoVG9vbCAgICAgICAgICAgPSByZXF1aXJlKFwicGF0aHRvb2xcIik7XHJcbnZhciBCYWNrUGFja0NvbnN0ICAgICAgPSByZXF1aXJlKFwiYmFja3BhY2tfY29uc3RcIik7XHJcbnZhciBDaGF0Q29uc3QgICAgICAgICAgPSByZXF1aXJlKFwiY2hhdF9jb25zdFwiKTtcclxudmFyIENoYXRJdGVtQ29udHJvbGxlciA9IHJlcXVpcmUoXCJjaGF0X2l0ZW1fY29udHJvbGxlclwiKTtcclxudmFyIENoYXRIZWxwICAgICAgICAgICA9IHJlcXVpcmUoXCJjaGF0X2hlbHBcIik7XHJcbnZhciBDaGF0Q29udHJvbGxlciA9IHJlcXVpcmUoXCJjaGF0X2NvbnRyb2xsZXJcIilcclxudmFyIENoYXRJdGVtID0gY2MuQ2xhc3Moe1xyXG4gICAgZXh0ZW5kczogQmFzZVZpZXcsXHJcblxyXG4gICAgcHJvcGVydGllczoge1xyXG4gICAgICAgIGNvbnRlbnQ6IG51bGwsXHJcbiAgICAgICAgbXNnX2luZGV4OiAwLCAgICAgICAgICAgICAgIC8vIOa2iOaBr+agh+etvuWPt1xyXG4gICAgICAgIGRhdGE6IG51bGwsXHJcbiAgICAgICAgaGVpZ2h0OiAxMDAsXHJcbiAgICAgICAgdXBkYXRlX2NiOiBudWxsLFxyXG4gICAgICAgIHBvc195OiAwLFxyXG4gICAgICAgIGlzX21pbmU6IGZhbHNlLFxyXG4gICAgICAgIGhlYWRfbWFyZ2luOiA2MyxcclxuICAgICAgICBuYW1lX21hcmdpbjogMTIwLFxyXG4gICAgICAgIG1zZ19iZ19wb3M6IDIyMCxcclxuICAgICAgICBtc2dfcnRfcG9zOiAyMDAsXHJcbiAgICAgICAgY2hhbm5lbDogbnVsbCxcclxuICAgICAgICBpbml0X2luZzogZmFsc2UsXHJcbiAgICAgICAgaGF2ZV9uZDogdHJ1ZSxcclxuICAgICAgICBoZWFkX3NwOiBudWxsLFxyXG4gICAgICAgIHNwX3JlczogbnVsbCxcclxuICAgICAgICBpc19sb2FkaW5nOiBmYWxzZSxcclxuICAgIH0sXHJcblxyXG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuY29udGVudCA9IGFyZ3VtZW50c1swXTtcclxuICAgICAgICB0aGlzLmRhdGEgICAgPSBhcmd1bWVudHNbMV07XHJcbiAgICAgICAgdGhpcy5oZWlnaHQgID0gYXJndW1lbnRzWzJdO1xyXG4gICAgICAgIHRoaXMucG9zX3kgICA9IGFyZ3VtZW50c1szXTtcclxuICAgICAgICB0aGlzLmNoYW5uZWwgPSBhcmd1bWVudHNbNF07XHJcblxyXG4gICAgICAgIHZhciBSb2xlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJyb2xlX2NvbnRyb2xsZXJcIilcclxuICAgICAgICB2YXIgcm9sZV92byA9IHRoaXMucm9sZV92bz0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY2hhbm5lbCA9PT0gQ2hhdENvbnN0LkNoYW5uZWwuRnJpZW5kKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEuZmxhZyA9PT0gMSB8fCB0aGlzLmRhdGEuZmxhZyA9PT0gMTEgfHwgIXRoaXMuZGF0YS5mbGFnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzX21pbmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mYWNlX2lkID0gcm9sZV92by5mYWNlX2lkO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yX25hbWUgPSByb2xlX3ZvLm5hbWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZhY2VfaWQgPSB0aGlzLmRhdGEuZmFjZV9pZDtcclxuICAgICAgICAgICAgICAgIHRoaXMucl9uYW1lID0gdGhpcy5kYXRhLm5hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhbm5lbCA9PT0gQ2hhdENvbnN0LkNoYW5uZWwuU3lzdGVtKSB7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEucm9sZV9saXN0ICYmIHRoaXMuZGF0YS5yb2xlX2xpc3RbMF0pe1xyXG4gICAgICAgICAgICAgICAgdmFyIG1zZ19yb2xlID0gdGhpcy5kYXRhLnJvbGVfbGlzdFswXVxyXG4gICAgICAgICAgICAgICAgaWYgKG1zZ19yb2xlLnJpZCA9PT0gcm9sZV92by5yaWQgJiYgbXNnX3JvbGUuc3J2X2lkID09PSByb2xlX3ZvLnNydl9pZCkgXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc19taW5lID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmFjZV9pZCA9IHRoaXMuZGF0YS5yb2xlX2xpc3RbMF0uZmFjZV9pZDtcclxuICAgICAgICAgICAgICAgIHRoaXMucl9uYW1lID0gdGhpcy5kYXRhLnJvbGVfbGlzdFswXS5uYW1lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgbXNnXHJcbiAgICAgICAgaWYodGhpcy5kYXRhLmxlbiA9PSAwKXtcclxuICAgICAgICAgICAgbXNnID0gU3RyaW5nVXRpbC5wYXJzZVN0cih0aGlzLmRhdGEubXNnLFwiaGFuZGxlclwiKS5zdHJpbmdcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgbXNnID0gdGhpcy5kYXRhLm1zZ1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyDlr7nmlbDmja7ov5vooYzliJ3lp4vljJZcclxuICAgICAgICB0aGlzLm1zZyA9IG1zZztcclxuICAgICAgICB0aGlzLmhlYWRfcGF0aCA9IFBhdGhUb29sLmdldEhlYWRSZXModGhpcy5mYWNlX2lkKTtcclxuICAgICAgICB0aGlzLmNoYXRfaXRlbV9jdHJsID0gQ2hhdEl0ZW1Db250cm9sbGVyLmdldEluc3RhbmNlKCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVJbnRlcnZhbCA9IDE7XHJcbiAgICAgICAgdGhpcy51cGRhdGVUaW1lciA9IDA7XHJcbiAgICAgICAgdGhpcy50b3RhbENvdW50ID0gMDtcclxuICAgIH0sXHJcblxyXG4gICAgaW5pdFJvb3RXaW5kOiBmdW5jdGlvbigpIHtcclxuICAgICAgICBpZiAodGhpcy5pbml0X2luZykgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMucm9vdF93bmQgPSB0aGlzLmNvbnRlbnQuZ2V0Q2hhdEl0ZW1OZCgpO1xyXG4gICAgICAgIGlmICh0aGlzLnJvb3Rfd25kKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGF2ZV9uZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMucm9vdF93bmQuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5pbml0V2lkZ2V0KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIHByZWZhYl9wYXRoID0gUGF0aFRvb2wuZ2V0UHJlZmFiUGF0aChcImNoYXRcIiwgXCJjaGF0X2l0ZW1cIik7XHJcbiAgICAgICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2FkUmVzKHByZWZhYl9wYXRoLCBmdW5jdGlvbihyZXNfb2JqZWN0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRfaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB2YXIgcm9vdF93bmQgPSByZXNfb2JqZWN0O1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQubXNnc19jb250ZW50KSB7ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHJvb3Rfd25kLnBhcmVudCA9IHRoaXMuY29udGVudC5tc2dzX2NvbnRlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGF2ZV9uZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3Rfd25kID0gcm9vdF93bmQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdFdpZGdldCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3Rfd25kLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQuY2hhdF9pdGVtc19jYWNoZS5wdXNoKHJvb3Rfd25kKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcclxuICAgICAgICAgICAgdGhpcy5pbml0X2luZyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBpbml0V2lkZ2V0OiBmdW5jdGlvbigpIHtcclxuICAgICAgICB0aGlzLmNvbW1vbl9tc2dfbmQgICAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJjb21tb25fbXNnXCIpO1xyXG4gICAgICAgIHRoaXMubm90aWNlX21zZ19uZCAgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcIm5vdGljZVwiKTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLmhlYWRfbmQgICAgICAgICAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJoZWFkX2JnXCIpO1xyXG4gICAgICAgIHRoaXMubmFtZV9uZCAgICAgICAgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcIm5hbWVfbmRcIik7XHJcbiAgICAgICAgdGhpcy5oZWFkX2t1YW5nX3NwICAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwiaGVhZF9rdWFuZ1wiLCBjYy5TcHJpdGUpO1xyXG4gICAgICAgIHRoaXMuc2V4X25kICAgICAgICAgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcInNleFwiKTtcclxuICAgICAgICB0aGlzLnNleF9zcCAgICAgICAgICAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJzZXhcIiwgY2MuU3ByaXRlKTtcclxuXHJcbiAgICAgICAgdGhpcy5tc2dfcm9vdF9uZCAgICAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwibXNnX3Jvb3RcIik7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlX2JnX25kICAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwibXNnX2JnXCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuaGVhZF9zcCAgICAgICAgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcImhlYWRfc3BcIiwgY2MuU3ByaXRlKTtcclxuICAgICAgICB0aGlzLm5hbWVfbGIgICAgICAgICAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJuYW1lX25kXCIsIGNjLkxhYmVsKTtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VfcnQgICAgICAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJtc2dfcnRcIiwgY2MuUmljaFRleHQpO1xyXG4gICAgICAgIHRoaXMubWVzc2FnZV9uZCAgICAgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcIm1zZ19ydFwiKTtcclxuICAgICAgICB0aGlzLm5vdGljZV9tc2dfcnQgICAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJub3RpY2VfbXNnXCIsIGNjLlJpY2hUZXh0KTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLmhlYWRfd2QgICAgICAgICAgICAgID0gdGhpcy5oZWFkX25kLmdldENvbXBvbmVudChjYy5XaWRnZXQpO1xyXG4gICAgICAgIHRoaXMubmFtZV93ZCAgICAgICAgICAgICAgPSB0aGlzLm5hbWVfbmQuZ2V0Q29tcG9uZW50KGNjLldpZGdldCk7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlX3dkICAgICAgICAgICA9IHRoaXMubWVzc2FnZV9uZC5nZXRDb21wb25lbnQoY2MuV2lkZ2V0KTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLnJvb3Rfd25kLmhlaWdodCAgICAgID0gMTAwO1xyXG4gICAgICAgIHRoaXMubWVzc2FnZV9uZC5oZWlnaHQgICAgPSAyNDtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VfYmdfbmQuaGVpZ2h0ID0gMzY7XHJcblxyXG4gICAgICAgIHRoaXMubWVzc2FnZV9ydC5hZGRUb3VjaEhhbmRsZXIoXCJoYW5kbGVyXCIsIHRoaXMub25DbGlja0l0ZW0uYmluZCh0aGlzKSlcclxuICAgICAgICB0aGlzLm5vdGljZV9tc2dfcnQuYWRkVG91Y2hIYW5kbGVyKFwiaGFuZGxlclwiLCB0aGlzLm9uQ2xpY2tJdGVtLmJpbmQodGhpcykpXHJcblxyXG4gICAgICAgIGlmICh0aGlzLmRhdGEpe1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldCgpO1xyXG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyKCk7XHJcbiAgICAgICAgfSBcclxuXHJcbiAgICB9LFxyXG5cclxuICAgIHJlZ2lzdGVyOmZ1bmN0aW9uKCl7XHJcbiAgICAgICAgdGhpcy5oZWFkX2t1YW5nX3NwLm5vZGUub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfU1RBUlQsIHRoaXMudXBCdG5TdGFydCwgdGhpcyk7XHJcbiAgICAgICAgdGhpcy5oZWFkX2t1YW5nX3NwLm5vZGUub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfQ0FOQ0VMLCB0aGlzLnVwQnRuRW5kLHRoaXMgKSBcclxuICAgICAgICB0aGlzLmhlYWRfa3Vhbmdfc3Aubm9kZS5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIHRoaXMudXBCdG5FbmQsIHRoaXMpO1xyXG4gICAgfSxcclxuXHJcbiAgICB1cEJ0blN0YXJ0OmZ1bmN0aW9uKCl7XHJcbiAgICAgICAgdGhpcy5zdG9wVXBkYXRlKCk7XHJcbiAgICAgICAgdGhpcy5zdGFydFVwZGF0ZSgpO1xyXG4gICAgfSxcclxuXHJcbiAgICBcclxuICAgIHVwQnRuRW5kOmZ1bmN0aW9uKCl7XHJcbiAgICAgICAgdGhpcy5zdG9wVXBkYXRlKCk7XHJcbiAgICAgICAgaWYodGhpcy50b3RhbENvdW50IDwgdGhpcy51cGRhdGVJbnRlcnZhbCl7XHJcbiAgICAgICAgICAgIC8v5bCP5LqOMeenkuaXtlxyXG4gICAgICAgICAgICB0aGlzLnRvdWNoSGVhZCgpO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBpZih0aGlzLmRhdGEgPT0gbnVsbCB8fCB0aGlzLmRhdGEucm9sZV9saXN0ID09IG51bGwgfHwgdGhpcy5kYXRhLnJvbGVfbGlzdFswXSA9PSBudWxsIHx8IHRoaXMucm9sZV92byA9PSBudWxsKXtcclxuICAgICAgICAgICAgICAgIHRoaXMudG90YWxDb3VudCA9IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVRpbWVyID0gMDtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZih0aGlzLmRhdGEucm9sZV9saXN0WzBdLnJpZCA9PSB0aGlzLnJvbGVfdm8ucmlkICYmIHRoaXMuZGF0YS5yb2xlX2xpc3RbMF0uc3J2X2lkID09IHRoaXMucm9sZV92by5zcnZfaWQpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy50b3RhbENvdW50ID0gMDtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVGltZXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBpbnB1dCA9IENoYXRDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Q2hhdElucHV0KCk7XHJcbiAgICAgICAgICAgIGlmKGlucHV0KXtcclxuICAgICAgICAgICAgICAgIGlucHV0LnNldElucHV0VGV4dChcIkBcIit0aGlzLmRhdGEucm9sZV9saXN0WzBdLm5hbWUrXCIgXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudG90YWxDb3VudCA9IDA7XHJcbiAgICAgICAgdGhpcy51cGRhdGVUaW1lciA9IDA7XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICB1cGRhdGUoZHQpe1xyXG4gICAgICAgIGlmKHRoaXMuaGVhZF9rdWFuZ19zcC5ub2RlLmFjdGl2ZSA9PSBmYWxzZSl7XHJcbiAgICAgICAgICAgIHRoaXMudG90YWxDb3VudCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGltZXIgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLnN0b3BVcGRhdGUoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnVwZGF0ZVRpbWVyICs9IGR0O1xyXG4gICAgICAgIHRoaXMudG90YWxDb3VudCArPSBkdDtcclxuICAgICAgICBcclxuICAgICAgICBpZih0aGlzLnVwZGF0ZVRpbWVyID49IHRoaXMudXBkYXRlSW50ZXJ2YWwpe1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRpbWVyID0gMDtcclxuICAgICAgICAgICAgaWYodGhpcy5kYXRhID09IG51bGwgfHwgdGhpcy5kYXRhLnJvbGVfbGlzdCA9PSBudWxsIHx8IHRoaXMuZGF0YS5yb2xlX2xpc3RbMF0gPT0gbnVsbCB8fCB0aGlzLnJvbGVfdm8gPT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3BVcGRhdGUoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYodGhpcy5kYXRhLnJvbGVfbGlzdFswXS5yaWQgPT0gdGhpcy5yb2xlX3ZvLnJpZCAmJiB0aGlzLmRhdGEucm9sZV9saXN0WzBdLnNydl9pZCA9PSB0aGlzLnJvbGVfdm8uc3J2X2lkKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcFVwZGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBpbnB1dCA9IENoYXRDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Q2hhdElucHV0KCk7XHJcbiAgICAgICAgICAgIGlmKGlucHV0KXtcclxuICAgICAgICAgICAgICAgIGlucHV0LnNldElucHV0VGV4dChcIkBcIit0aGlzLmRhdGEucm9sZV9saXN0WzBdLm5hbWUrXCIgXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcblxyXG4gICAgdG91Y2hIZWFkOmZ1bmN0aW9uKCl7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdmFyIHJpZCwgc3J2X2lkLG5hbWU7XHJcbiAgICAgICAgaWYgKHRoaXMuY2hhbm5lbCA9PT0gQ2hhdENvbnN0LkNoYW5uZWwuRnJpZW5kKSB7XHJcbiAgICAgICAgICAgIC8vIHJpZCA9IHRoaXMuZGF0YS5yaWQ7XHJcbiAgICAgICAgICAgIC8vIHNydl9pZCA9IHRoaXMuZGF0YS5zcnZfaWQ7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZih0aGlzLmRhdGEgJiYgdGhpcy5kYXRhLnJvbGVfbGlzdCAmJiB0aGlzLmRhdGEucm9sZV9saXN0WzBdKXtcclxuICAgICAgICAgICAgICAgIHJpZCA9IHRoaXMuZGF0YS5yb2xlX2xpc3RbMF0ucmlkO1xyXG4gICAgICAgICAgICAgICAgc3J2X2lkID0gdGhpcy5kYXRhLnJvbGVfbGlzdFswXS5zcnZfaWQ7XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gdGhpcy5kYXRhLnJvbGVfbGlzdFswXS5uYW1lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHJpZCA9PSB0aGlzLnJvbGVfdm8ucmlkKXJldHVyblxyXG4gICAgICAgIFV0aWxzLnBsYXlCdXR0b25Tb3VuZCgxKTtcclxuICAgICAgICBDaGF0Q29udHJvbGxlci5nZXRJbnN0YW5jZSgpLm9wZW5GcmllbmRJbmZvKHtzcnZfaWQgOnNydl9pZCwgcmlkIDpyaWQsY2hhbm5lbDp0aGlzLmNoYW5uZWwsbmFtZTpuYW1lfSk7IFxyXG4gICAgfSxcclxuXHJcbiAgICBvblNob3c6IGZ1bmN0aW9uICgpIHtcclxuICAgIH0sXHJcblxyXG4gICAgLy8g5pu05paw5pWw5o2uXHJcbiAgICB1cGRhdGVEYXRhOiBmdW5jdGlvbihkYXRhLCBtc2dfaW5kZXgsIHBvc195KSB7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLnBvc195ID0gcG9zX3k7XHJcbiAgICAgICAgLy8gaWYgKClcclxuICAgIH0sXHJcblxyXG4gICAgLy8g5pu05paw5biD5bGAXHJcbiAgICB1cGRhdGVXaWRnZXQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNoYW5uZWwgPT0gQ2hhdENvbnN0LkNoYW5uZWwuU3lzdGVtKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29tbW9uX21zZ19uZC5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5ub3RpY2VfbXNnX25kLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMucm9vdF93bmQueSA9IC0gdGhpcy5wb3NfeTtcclxuICAgICAgICAgICAgdGhpcy5ub3RpY2VfbXNnX3J0LnN0cmluZyA9IHRoaXMubXNnO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5ub3RpY2VfbXNnX25kLndpZHRoID0gNjQwO1xyXG4gICAgICAgICAgICB0aGlzLm5vdGljZV9tc2dfbmQuaGVpZ2h0ID0gdGhpcy5ub3RpY2VfbXNnX3J0Lm5vZGUuaGVpZ2h0KzIwO1xyXG4gICAgICAgICAgICB0aGlzLnJvb3Rfd25kLmhlaWdodCA9IHRoaXMubm90aWNlX21zZ19uZC5oZWlnaHQrMjA7XHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubm90aWNlX21zZ19uZC5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgdmFyIHNob3dfZGVsYXkgPSBjYy5kZWxheVRpbWUoMC4xKTtcclxuICAgICAgICAgICAgdmFyIHNob3dfYWN0aXZlID0gY2MuY2FsbEZ1bmMoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb21tb25fbXNnX25kLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIH0sIHRoaXMpO1xyXG4gICAgICAgICAgICB2YXIgc2hvd19hY3QgPSBjYy5zZXF1ZW5jZShzaG93X2RlbGF5LCBzaG93X2FjdGl2ZSk7XHJcbiAgICAgICAgICAgIHRoaXMucm9vdF93bmQucnVuQWN0aW9uKHNob3dfYWN0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIOW4g+WxgFxyXG4gICAgICAgIGlmICh0aGlzLmlzX21pbmUpIHtcclxuICAgICAgICAgICAgdGhpcy5oZWFkX3dkLmlzQWxpZ25MZWZ0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuaGVhZF93ZC5pc0FsaWduUmlnaHQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmhlYWRfd2QucmlnaHQgPSB0aGlzLmhlYWRfbWFyZ2luO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5uYW1lX3dkLmlzQWxpZ25MZWZ0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMubmFtZV93ZC5pc0FsaWduUmlnaHQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLm5hbWVfd2QucmlnaHQgPSB0aGlzLm5hbWVfbWFyZ2luO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlX2JnX25kLmFuY2hvclggPSAxO1xyXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VfbmQuYW5jaG9yWCA9IDE7ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIHRoaXMubWVzc2FnZV9iZ19uZC54ID0gIHRoaXMubXNnX2JnX3BvcyAtIHRoaXMubWVzc2FnZV9iZ19uZC53aWR0aDtcclxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlX25kLnggPSAgdGhpcy5tc2dfcnRfcG9zIC0gNTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZV9iZ19uZC5zY2FsZVggPSAtMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmhlYWRfd2QuaXNBbGlnbkxlZnQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmhlYWRfd2QuaXNBbGlnblJpZ2h0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuaGVhZF93ZC5sZWZ0ID0gdGhpcy5oZWFkX21hcmdpbjtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubmFtZV93ZC5pc0FsaWduTGVmdCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMubmFtZV93ZC5pc0FsaWduUmlnaHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5uYW1lX3dkLmxlZnQgPSB0aGlzLm5hbWVfbWFyZ2luO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlX2JnX25kLmFuY2hvclggPSAwO1xyXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VfbmQuYW5jaG9yWCA9IDA7ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZV9iZ19uZC54ID0gLSB0aGlzLm1zZ19iZ19wb3M7XHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZV9uZC54ID0gLSB0aGlzLm1zZ19ydF9wb3M7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VfYmdfbmQuc2NhbGVYID0gMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIOiuvue9ruihqOaDhVxyXG4gICAgICAgIHZhciBlbW9qaV9pZHMgPSB0aGlzLmNoYXRfaXRlbV9jdHJsLmdldEVtb2ppcyh0aGlzLm1zZyk7XHJcbiAgICAgICAgZm9yICh2YXIgZW1vamlfaSBpbiBlbW9qaV9pZHMpIHtcclxuICAgICAgICAgICAgdmFyIGFuaW1hX3BhdGggPSBQYXRoVG9vbC5nZXRTcGluZVBhdGgoZW1vamlfaWRzW2Vtb2ppX2ldKTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkUmVzKGFuaW1hX3BhdGgsIGZ1bmN0aW9uKGVtb2ppLCBlbW9qaV9zZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlX3J0LmFkZEVtb2ppQXRsYXMoZW1vamlfc2QsIGVtb2ppKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZV9iZ19uZC5oZWlnaHQgPSB0aGlzLm1lc3NhZ2VfbmQuaGVpZ2h0ICsgMTI7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VfYmdfbmQud2lkdGggPSB0aGlzLm1lc3NhZ2VfbmQud2lkdGggKyAzMDsgICAgIFxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNfbWluZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZV9iZ19uZC54ID0gdGhpcy5tc2dfYmdfcG9zIC0gdGhpcy5tZXNzYWdlX2JnX25kLndpZHRoO1xyXG4gICAgICAgICAgICAgICAgfSAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH0uYmluZCh0aGlzLCBlbW9qaV9pZHNbZW1vamlfaV0pKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIOiuvue9rkltYWdcclxuICAgICAgICB2YXIgaXRlbV9pbWdzID0gdGhpcy5jaGF0X2l0ZW1fY3RybC5nZXRJbWFnZXModGhpcy5tc2cpO1xyXG4gICAgICAgIGZvciAodmFyIGltZ19pIGluIGl0ZW1faW1ncykge1xyXG4gICAgICAgICAgICB2YXIgaXRlbV9wYXRoID0gUGF0aFRvb2wuZ2V0SXRlbVJlcyhpdGVtX2ltZ3NbaW1nX2ldKTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkUmVzKGl0ZW1fcGF0aCwgZnVuY3Rpb24oaXRlbV9zZikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlX3J0LmFkZFNwcml0ZUZyYW1lKGl0ZW1fc2YpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlX2JnX25kLmhlaWdodCA9IHRoaXMubWVzc2FnZV9uZC5oZWlnaHQgKyAxMjtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZV9iZ19uZC53aWR0aCA9IHRoaXMubWVzc2FnZV9uZC53aWR0aCArIDMwOyAgICAgXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc19taW5lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlX2JnX25kLnggPSB0aGlzLm1zZ19iZ19wb3MgLSB0aGlzLm1lc3NhZ2VfYmdfbmQud2lkdGg7XHJcbiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubWVzc2FnZV9ydC5tYXhXaWR0aCA9IDA7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlX3J0LnN0cmluZyA9IHRoaXMubXNnO1xyXG4gICAgICAgIC8vIHRoaXMubWVzc2FnZV9ydC5hZGRUb3VjaEhhbmRsZXIoXCJoYW5kbGVyXCIsIHRoaXMub25DbGlja0l0ZW0uYmluZCh0aGlzKSlcclxuICAgICAgICB0aGlzLnJvb3Rfd25kLnkgPSAtIHRoaXMucG9zX3k7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VfbmQud2lkdGggPj0gNDAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZV9ydC5tYXhXaWR0aCA9IDQwMDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VfcnQubWF4V2lkdGggPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICB0aGlzLm1lc3NhZ2VfYmdfbmQuaGVpZ2h0ID0gdGhpcy5tZXNzYWdlX25kLmhlaWdodCArIDEyO1xyXG4gICAgICAgIHRoaXMubWVzc2FnZV9iZ19uZC53aWR0aCA9IHRoaXMubWVzc2FnZV9uZC53aWR0aCArIDMwO1xyXG4gICAgICAgIGlmICh0aGlzLmlzX21pbmUpIHtcclxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlX2JnX25kLnggPSB0aGlzLm1zZ19iZ19wb3MgLSB0aGlzLm1lc3NhZ2VfYmdfbmQud2lkdGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucm9vdF93bmQuaGVpZ2h0ICs9IHRoaXMubWVzc2FnZV9uZC5oZWlnaHQ7XHJcblxyXG4gICAgICAgIC8vIOWktOWDj1xyXG4gICAgICAgIGlmICh0aGlzLnNwX3Jlcykge1xyXG4gICAgICAgICAgICB0aGlzLmhlYWRfc3Auc3ByaXRlRnJhbWUgPSB0aGlzLnNwX3JlcztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNfbG9hZGluZykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc19sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9hZFJlcyh0aGlzLmhlYWRfcGF0aCwgZnVuY3Rpb24ocmVzX29iamVjdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcF9yZXMgPSByZXNfb2JqZWN0O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGVhZF9zcC5zcHJpdGVGcmFtZSA9IHRoaXMuc3BfcmVzO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNfbG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciByb2xlX2RhdGEgPSB0aGlzLmRhdGE7XHJcbiAgICAgICAgaWYgKHRoaXMuY2hhbm5lbCA9PT0gQ2hhdENvbnN0LkNoYW5uZWwuRnJpZW5kKSB7XHJcbiAgICAgICAgICAgIHJvbGVfZGF0YSA9IHRoaXMuZGF0YTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZih0aGlzLmRhdGEgJiYgdGhpcy5kYXRhLnJvbGVfbGlzdCAmJiB0aGlzLmRhdGEucm9sZV9saXN0WzBdKXtcclxuICAgICAgICAgICAgICAgIHJvbGVfZGF0YSA9IHRoaXMuZGF0YS5yb2xlX2xpc3RbMF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIOWktOWDj+ahhlxyXG4gICAgICAgIHRoaXMubG9hZEZyYW1lUmVzKHJvbGVfZGF0YS5oZWFkX2JpZCk7XHJcbiAgICAgICAgLy8gbmFtZVxyXG4gICAgICAgIHZhciBuYW1lX3N0ciA9IHRoaXMucl9uYW1lO1xyXG4gICAgICAgIGlmICh0aGlzLmNoYW5uZWwgPT0gQ2hhdENvbnN0LkNoYW5uZWwuQ3Jvc3MpIHtcclxuXHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYW5uZWwgPT0gQ2hhdENvbnN0LkNoYW5uZWwuUHJvdmluY2UpIHtcclxuICAgICAgICAgICAgaWYodGhpcy5pc19taW5lKXtcclxuICAgICAgICAgICAgICAgIG5hbWVfc3RyID0gY2MuanMuZm9ybWF0U3RyKFwiJXMgICAgJXNcIiwgcm9sZV9kYXRhLmNpdHksIHRoaXMucl9uYW1lKTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBuYW1lX3N0ciA9IGNjLmpzLmZvcm1hdFN0cihcIiVzICAgICVzXCIsIHRoaXMucl9uYW1lLCByb2xlX2RhdGEuY2l0eSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5uYW1lX2xiLnN0cmluZyA9IG5hbWVfc3RyO1xyXG5cclxuICAgICAgICAvLyBzZXhcclxuICAgICAgICBpZiAocm9sZV9kYXRhLnNleCAhPT0gMiAmJiB0eXBlb2Ygcm9sZV9kYXRhLnNleCA9PSBcIm51bWJlclwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V4X25kLmFjdGl2ZSA9IHRydWU7ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHZhciBzZXhfcmVzX3BhdGggPSBQYXRoVG9vbC5nZXRVSUljb25QYXRoKFwiY29tbW9uXCIsXCJjb21tb25fc2V4XCIgKyByb2xlX2RhdGEuc2V4KTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkUmVzKHNleF9yZXNfcGF0aCwgZnVuY3Rpb24oc2V4X3NmKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNleF9zcC5zcHJpdGVGcmFtZSA9IHNleF9zZjtcclxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNleF9uZC5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHZpcCBcclxuICAgICAgICBpZiAocm9sZV9kYXRhLmlzX3Nob3dfdmlwID09PSAwICYmIHJvbGVfZGF0YS52aXBfbGV2ID4gMCAmJiB0aGlzLmNoYW5uZWwgIT09IENoYXRDb25zdC5DaGFubmVsLlByb3ZpbmNlKSB7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7ICAgICAgIC8vIOS4jeaYvuekunZpcFxyXG5cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8vc2NhbGXpu5jorqTmr5TkvovmmK/lpKfpg6jliIbpnIDopoHnvKnmlL7miYDku6XnlKjkuoYxMDAvMTE377yM5YW25LuW5oOF5Ya157uT5ZCI6Ieq5bex55WM6Z2i5L+u5pS5c2NhbGXlgLxcclxuICAgIGxvYWRGcmFtZVJlczogZnVuY3Rpb24gKGJpZCxzY2FsZSkge1xyXG4gICAgICAgIGlmKHNjYWxlID09IG51bGwpe1xyXG4gICAgICAgICAgICBzY2FsZSA9IDEwMC8xMTc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHR5cGVvZiAoYmlkKSA9PSBcIm51bWJlclwiKXtcclxuICAgICAgICAgICAgdmFyIGNvbmZpZyA9IENvbmZpZy5hdmF0YXJfZGF0YS5kYXRhX2F2YXRhcltiaWRdO1xyXG4gICAgICAgICAgICBpZiAoIWNvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgcmVzX3BhdGggPSBQYXRoVG9vbC5nZXRIZWFkY2lyY2xlKGNvbmZpZy5yZXNfaWQpO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRSZXMocmVzX3BhdGgsIGZ1bmN0aW9uIChyZXNPYmplY3QpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGVhZF9rdWFuZ19zcC5zcHJpdGVGcmFtZSA9IHJlc09iamVjdDtcclxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxyXG4gICAgICAgICAgICB0aGlzLmhlYWRfa3Vhbmdfc3Aubm9kZS5zY2FsZSA9IHNjYWxlO1xyXG4gICAgICAgICAgICBpZihiaWQgPT0gMTAwMCl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhlYWRfa3Vhbmdfc3Aubm9kZS55ID0gMDtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhlYWRfa3Vhbmdfc3Aubm9kZS55ID0gNTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBpZihiaWQgPT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICBiaWQgPSBQYXRoVG9vbC5nZXRDb21tb25JY29tUGF0aChcImNvbW1vbl8xMDMxXCIpO1xyXG4gICAgICAgICAgICAgICAgc2NhbGUgPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMubG9hZFJlcyhiaWQsIGZ1bmN0aW9uIChyZXNPYmplY3QpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGVhZF9rdWFuZ19zcC5zcHJpdGVGcmFtZSA9IHJlc09iamVjdDtcclxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxyXG4gICAgICAgICAgICB0aGlzLmhlYWRfa3Vhbmdfc3Aubm9kZS5zY2FsZSA9IHNjYWxlO1xyXG4gICAgICAgICAgICB0aGlzLmhlYWRfa3Vhbmdfc3Aubm9kZS55ID0gMDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIG9uSGlkZTogZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIH0sXHJcblxyXG4gICAgb25EZWxldGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLnN0b3BVcGRhdGUoKTtcclxuICAgICAgICAvLyBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVsZWFzZVJlcyh0aGlzLmhlYWRfcGF0aCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIGNvbnRlbnTmmL7npLrljLrln5/mm7TmlrDljLrln59cclxuICAgIHVwZGF0ZUNvbnRlbnQ6IGZ1bmN0aW9uKGlzQ2FjaGUpIHtcclxuICAgICAgICBpZiAoaXNDYWNoZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5yb290X3duZCkge1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5oZWFkX2t1YW5nX3NwICYmIHRoaXMuaGVhZF9rdWFuZ19zcC5ub2RlKXtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhlYWRfa3Vhbmdfc3Aubm9kZS5vZmYoY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfU1RBUlQsIHRoaXMudXBCdG5TdGFydCwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWFkX2t1YW5nX3NwLm5vZGUub2ZmKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0NBTkNFTCwgdGhpcy51cEJ0bkVuZCx0aGlzICkgXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWFkX2t1YW5nX3NwLm5vZGUub2ZmKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgdGhpcy51cEJ0bkVuZCwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHRoaXMucm9vdF93bmQuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQuY2hhdF9pdGVtc19jYWNoZS5wdXNoKHRoaXMucm9vdF93bmQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yb290X3duZCA9IG51bGw7ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5oYXZlX25kID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgY29udGVudF9wb3MgPSB0aGlzLmNvbnRlbnQuZ2V0Q29udGVudFBvcygpO1xyXG4gICAgICAgIGlmICgodGhpcy5wb3NfeSA8IGNvbnRlbnRfcG9zICsgODAwKSAmJiAodGhpcy5wb3NfeSA+IGNvbnRlbnRfcG9zIC0gMzAwKSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhdmVfbmQgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMucm9vdF93bmQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFJvb3RXaW5kKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3Rfd25kLnkgPSAtIHRoaXMucG9zX3k7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5yb290X3duZCkge1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5oZWFkX2t1YW5nX3NwICYmIHRoaXMuaGVhZF9rdWFuZ19zcC5ub2RlKXtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhlYWRfa3Vhbmdfc3Aubm9kZS5vZmYoY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfU1RBUlQsIHRoaXMudXBCdG5TdGFydCwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWFkX2t1YW5nX3NwLm5vZGUub2ZmKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0NBTkNFTCwgdGhpcy51cEJ0bkVuZCx0aGlzICkgXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWFkX2t1YW5nX3NwLm5vZGUub2ZmKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgdGhpcy51cEJ0bkVuZCwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHRoaXMucm9vdF93bmQuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQuY2hhdF9pdGVtc19jYWNoZS5wdXNoKHRoaXMucm9vdF93bmQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yb290X3duZCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5oYXZlX25kID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBvbkNsaWNrRnJvbTogZnVuY3Rpb24oZXZlbnQsIHBhcmFtZSkge1xyXG5cclxuICAgIH0sXHJcblxyXG4gICAgb25DbGlja0l0ZW06IGZ1bmN0aW9uKGRhdGEsIHBhcmFtZSkge1xyXG4gICAgICAgIHZhciBwYXJhbWVzID0gcGFyYW1lLnNwbGl0KFwifFwiKTtcclxuXHJcbiAgICAgICAgdmFyIGxpbmtfdHlwZSA9IHBhcmFtZXNbMF07XHJcbiAgICAgICAgdmFyIHNldl9pZCA9IHBhcmFtZXNbMV07XHJcbiAgICAgICAgdmFyIHNoYXJlX2lkID0gcGFyYW1lc1syXTtcclxuXHJcbiAgICAgICAgQ2hhdEhlbHAuZ2V0SW5zdGFuY2UoKS5vbkNoYXRUb3VjaGVkKGxpbmtfdHlwZSwgcGFyYW1lLCB0aGlzLmRhdGEpO1xyXG4gICAgfSxcclxuXHJcbiAgICBnZXRJZDpmdW5jdGlvbigpe1xyXG4gICAgICAgIGlmKCF0aGlzLmRhdGEpcmV0dXJuIG51bGw7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5pZDtcclxuICAgIH1cclxuXHJcbn0pIl19