@seniorsistemas/angular-components 17.1.3 → 17.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/bundles/seniorsistemas-angular-components.umd.js +271 -117
  2. package/bundles/seniorsistemas-angular-components.umd.js.map +1 -1
  3. package/bundles/seniorsistemas-angular-components.umd.min.js +2 -2
  4. package/bundles/seniorsistemas-angular-components.umd.min.js.map +1 -1
  5. package/components/gantt/components/gantt/bar.d.ts +1 -0
  6. package/components/gantt/components/gantt/gantt.d.ts +2 -4
  7. package/components/gantt/components/gantt/popup.d.ts +4 -1
  8. package/components/gantt/components/side-table/side-table.component.d.ts +4 -1
  9. package/components/gantt/gantt.component.d.ts +10 -1
  10. package/components/gantt/models/options.d.ts +5 -0
  11. package/components/gantt/models/view-mode.d.ts +3 -2
  12. package/esm2015/components/gantt/components/gantt/bar.js +61 -33
  13. package/esm2015/components/gantt/components/gantt/gantt-options.js +5 -1
  14. package/esm2015/components/gantt/components/gantt/gantt.js +113 -72
  15. package/esm2015/components/gantt/components/gantt/popup.js +37 -5
  16. package/esm2015/components/gantt/components/gantt/utils/date-utils.js +3 -2
  17. package/esm2015/components/gantt/components/side-table/side-table.component.js +9 -3
  18. package/esm2015/components/gantt/gantt.component.js +53 -5
  19. package/esm2015/components/gantt/gantt.module.js +3 -2
  20. package/esm2015/components/gantt/models/options.js +1 -1
  21. package/esm2015/components/gantt/models/view-mode.js +3 -2
  22. package/esm5/components/gantt/components/gantt/bar.js +62 -34
  23. package/esm5/components/gantt/components/gantt/gantt-options.js +5 -1
  24. package/esm5/components/gantt/components/gantt/gantt.js +115 -74
  25. package/esm5/components/gantt/components/gantt/popup.js +30 -5
  26. package/esm5/components/gantt/components/gantt/utils/date-utils.js +3 -2
  27. package/esm5/components/gantt/components/side-table/side-table.component.js +9 -3
  28. package/esm5/components/gantt/gantt.component.js +53 -5
  29. package/esm5/components/gantt/gantt.module.js +3 -2
  30. package/esm5/components/gantt/models/options.js +1 -1
  31. package/esm5/components/gantt/models/view-mode.js +3 -2
  32. package/fesm2015/seniorsistemas-angular-components.js +276 -115
  33. package/fesm2015/seniorsistemas-angular-components.js.map +1 -1
  34. package/fesm5/seniorsistemas-angular-components.js +271 -117
  35. package/fesm5/seniorsistemas-angular-components.js.map +1 -1
  36. package/package.json +1 -1
  37. package/seniorsistemas-angular-components.metadata.json +1 -1
@@ -7,8 +7,8 @@ import { defaultOptions } from "./gantt-options";
7
7
  import { ViewMode } from "../../models/view-mode";
8
8
  export class Gantt {
9
9
  constructor(wrapper, tasks, options) {
10
- this.setup_wrapper(wrapper);
11
10
  this.setup_options(options);
11
+ this.setup_wrapper(wrapper);
12
12
  this.setup_tasks(tasks);
13
13
  // initialize with default view mode
14
14
  this.change_view_mode();
@@ -52,6 +52,9 @@ export class Gantt {
52
52
  // wrapper element
53
53
  this.$container = document.createElement("div");
54
54
  this.$container.classList.add("gantt-container");
55
+ if (this.options.containerWidth) {
56
+ this.$container.style.width = this.options.containerWidth + 'px';
57
+ }
55
58
  const parent_element = this.$svg.parentElement;
56
59
  parent_element.appendChild(this.$container);
57
60
  this.$container.appendChild(this.$svg);
@@ -135,6 +138,7 @@ export class Gantt {
135
138
  this.change_view_mode();
136
139
  }
137
140
  change_view_mode(mode = this.options.viewMode) {
141
+ this.setup_gantt_dates();
138
142
  this.update_view_scale(mode);
139
143
  this.setup_dates();
140
144
  this.render();
@@ -144,10 +148,13 @@ export class Gantt {
144
148
  update_view_scale(view_mode) {
145
149
  this.options.viewMode = view_mode;
146
150
  // this.isHourView = false;
147
- if (view_mode === ViewMode.Hour) {
151
+ if (view_mode === ViewMode.QuarterHour) {
152
+ this.options.step = 24 / 24 / 4;
153
+ this.options.columnWidth = 50;
154
+ }
155
+ else if (view_mode === ViewMode.Hour) {
148
156
  this.options.step = 24 / 24;
149
157
  this.options.columnWidth = 50;
150
- // this.isHourView = true;
151
158
  }
152
159
  else if (view_mode === ViewMode.Day) {
153
160
  this.options.step = 24;
@@ -175,52 +182,52 @@ export class Gantt {
175
182
  }
176
183
  }
177
184
  setup_dates() {
178
- this.setup_gantt_dates();
179
185
  this.setup_date_values();
180
186
  }
181
187
  setup_gantt_dates() {
182
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
188
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;
183
189
  this._minDate = null;
184
190
  this._maxDate = null;
185
191
  for (let task of this.tasks) {
186
192
  // set global start and end date
187
193
  if (!this.minDate || task.start < this.minDate) {
188
- this._minDate = task.start;
194
+ this._minDate = DateUtils.startOf(task.start, 'day');
189
195
  }
190
196
  if (!this.maxDate || task.end > this.maxDate) {
191
197
  this._maxDate = task.end;
192
198
  }
193
199
  }
194
- this._realMinDate = this.minDate;
195
- this._realMaxDate = this.maxDate;
196
200
  switch (this.options.viewMode) {
201
+ case ViewMode.QuarterHour:
202
+ this._minDate = DateUtils.add(this.minDate, -((_a = this.options.marginBeforeStart) !== null && _a !== void 0 ? _a : 15), "minutes");
203
+ this._maxDate = DateUtils.add(this.maxDate, (_b = this.options.marginAfterEnd) !== null && _b !== void 0 ? _b : 15, "minutes");
197
204
  case ViewMode.Hour:
198
- this._minDate = DateUtils.add(this.minDate, -((_a = this.options.marginBeforeStart) !== null && _a !== void 0 ? _a : 1), "hour");
199
- this._maxDate = DateUtils.add(this.maxDate, (_b = this.options.marginAfterEnd) !== null && _b !== void 0 ? _b : 1, "hour");
205
+ this._minDate = DateUtils.add(this.minDate, -((_c = this.options.marginBeforeStart) !== null && _c !== void 0 ? _c : 1), "hour");
206
+ this._maxDate = DateUtils.add(this.maxDate, (_d = this.options.marginAfterEnd) !== null && _d !== void 0 ? _d : 1, "hour");
200
207
  break;
201
208
  case ViewMode.QuarterDay:
202
- this._minDate = DateUtils.add(this.minDate, -((_c = this.options.marginBeforeStart) !== null && _c !== void 0 ? _c : 12), "hour");
203
- this._maxDate = DateUtils.add(this.maxDate, (_d = this.options.marginAfterEnd) !== null && _d !== void 0 ? _d : 12, "hour");
209
+ this._minDate = DateUtils.add(this.minDate, -((_e = this.options.marginBeforeStart) !== null && _e !== void 0 ? _e : 6), "hour");
210
+ this._maxDate = DateUtils.add(this.maxDate, (_f = this.options.marginAfterEnd) !== null && _f !== void 0 ? _f : 6, "hour");
204
211
  break;
205
212
  case ViewMode.HalfDay:
206
- this._minDate = DateUtils.add(this.minDate, -((_e = this.options.marginBeforeStart) !== null && _e !== void 0 ? _e : 1), "day");
207
- this._maxDate = DateUtils.add(this.maxDate, (_f = this.options.marginAfterEnd) !== null && _f !== void 0 ? _f : 1, "day");
213
+ this._minDate = DateUtils.add(this.minDate, -((_g = this.options.marginBeforeStart) !== null && _g !== void 0 ? _g : 12), "hour");
214
+ this._maxDate = DateUtils.add(this.maxDate, (_h = this.options.marginAfterEnd) !== null && _h !== void 0 ? _h : 12, "hour");
208
215
  break;
209
216
  case ViewMode.Day:
210
- this._minDate = DateUtils.add(this.minDate, -((_g = this.options.marginBeforeStart) !== null && _g !== void 0 ? _g : 3), "day");
211
- this._maxDate = DateUtils.add(this.maxDate, (_h = this.options.marginAfterEnd) !== null && _h !== void 0 ? _h : 3, "day");
217
+ this._minDate = DateUtils.add(this.minDate, -((_j = this.options.marginBeforeStart) !== null && _j !== void 0 ? _j : 1), "day");
218
+ this._maxDate = DateUtils.add(this.maxDate, (_k = this.options.marginAfterEnd) !== null && _k !== void 0 ? _k : 1, "day");
212
219
  break;
213
220
  case ViewMode.Week:
214
- this._minDate = DateUtils.add(this.minDate, -((_j = this.options.marginBeforeStart) !== null && _j !== void 0 ? _j : 1), "month");
215
- this._maxDate = DateUtils.add(this.maxDate, (_k = this.options.marginAfterEnd) !== null && _k !== void 0 ? _k : 1, "month");
221
+ this._minDate = DateUtils.add(this.minDate, -((_l = this.options.marginBeforeStart) !== null && _l !== void 0 ? _l : 1), "week");
222
+ this._maxDate = DateUtils.add(this.maxDate, (_m = this.options.marginAfterEnd) !== null && _m !== void 0 ? _m : 1, "week");
216
223
  break;
217
224
  case ViewMode.Month:
218
- this._minDate = DateUtils.add(this.minDate, -((_l = this.options.marginBeforeStart) !== null && _l !== void 0 ? _l : 1), "year");
219
- this._maxDate = DateUtils.add(this.maxDate, (_m = this.options.marginAfterEnd) !== null && _m !== void 0 ? _m : 1, "year");
225
+ this._minDate = DateUtils.add(this.minDate, -((_o = this.options.marginBeforeStart) !== null && _o !== void 0 ? _o : 1), "month");
226
+ this._maxDate = DateUtils.add(this.maxDate, (_p = this.options.marginAfterEnd) !== null && _p !== void 0 ? _p : 1, "month");
220
227
  break;
221
228
  case ViewMode.Year:
222
- this._minDate = DateUtils.add(this.minDate, -((_o = this.options.marginBeforeStart) !== null && _o !== void 0 ? _o : 2), "year");
223
- this._maxDate = DateUtils.add(this.maxDate, (_p = this.options.marginAfterEnd) !== null && _p !== void 0 ? _p : 2, "year");
229
+ this._minDate = DateUtils.add(this.minDate, -((_q = this.options.marginBeforeStart) !== null && _q !== void 0 ? _q : 1), "year");
230
+ this._maxDate = DateUtils.add(this.maxDate, (_r = this.options.marginAfterEnd) !== null && _r !== void 0 ? _r : 1, "year");
224
231
  break;
225
232
  }
226
233
  }
@@ -244,8 +251,10 @@ export class Gantt {
244
251
  }
245
252
  this.dates.push(cur_date);
246
253
  }
247
- console.log("cur_date", cur_date);
248
- console.log("dates", this.dates);
254
+ if (this.options.containerWidth) {
255
+ const columnWidth = (this.options.containerWidth - 1) / this.dates.length;
256
+ this.options.columnWidth = columnWidth < 45 ? 45 : columnWidth;
257
+ }
249
258
  }
250
259
  bind_events() {
251
260
  this.bind_grid_click();
@@ -281,7 +290,10 @@ export class Gantt {
281
290
  this.make_grid_ticks();
282
291
  }
283
292
  make_grid_background() {
284
- const grid_width = this.dates.length * this.options.columnWidth;
293
+ let grid_width = this.dates.length * this.options.columnWidth;
294
+ if (this.options.containerWidth) {
295
+ grid_width = this.options.containerWidth;
296
+ }
285
297
  const distinct_rows = [...new Set(this.tasks.map((x) => x._row_id))];
286
298
  const grid_height = this.options.headerHeight +
287
299
  this.options.padding / 2 +
@@ -347,18 +359,24 @@ export class Gantt {
347
359
  this.tasks.length;
348
360
  for (let date of this.dates) {
349
361
  let tick_class = "tick";
350
- // thick tick for monday
351
- if (this.view_is(ViewMode.Day) && date.getDate() === 1) {
362
+ if (this.view_is(ViewMode.QuarterHour) && date.getHours() === 0 && date.getMinutes() === 0) {
363
+ // thick tick for first hour of day.
364
+ tick_class += " thick";
365
+ }
366
+ else if (this.view_is([ViewMode.Hour, ViewMode.QuarterDay, ViewMode.HalfDay]) && date.getHours() === 0) {
367
+ // thick tick for first hour of day.
368
+ tick_class += " thick";
369
+ }
370
+ else if (this.view_is(ViewMode.Day) && date.getDate() === 1) {
371
+ // thick tick for monday
352
372
  tick_class += " thick";
353
373
  }
354
- // thick tick for first week
355
- if (this.view_is(ViewMode.Week) &&
356
- date.getDate() >= 1 &&
357
- date.getDate() < 8) {
374
+ else if (this.view_is(ViewMode.Week) && date.getDate() >= 1 && date.getDate() < 8) {
375
+ // thick tick for first week
358
376
  tick_class += " thick";
359
377
  }
360
- // thick ticks for quarters
361
- if (this.view_is(ViewMode.Month) && date.getMonth() % 3 === 0) {
378
+ else if (this.view_is(ViewMode.Month) && date.getMonth() % 3 === 0) {
379
+ // thick ticks for quarters
362
380
  tick_class += " thick";
363
381
  }
364
382
  createSVG("path", {
@@ -387,7 +405,7 @@ export class Gantt {
387
405
  let x = 0;
388
406
  for (let date of this.dates) {
389
407
  let y = (this.options.headerHeight + this.options.padding) / 2;
390
- let isToday = date.toString() == DateUtils.today();
408
+ let isToday = date == DateUtils.today();
391
409
  let isWeekend = (date.getDay() == 0 || date.getDay() == 6);
392
410
  let className;
393
411
  if (isToday) {
@@ -417,19 +435,8 @@ export class Gantt {
417
435
  }
418
436
  make_dates() {
419
437
  const dates = this.get_dates_to_draw();
420
- const isHourView = this.view_is([ViewMode.Hour, ViewMode.QuarterDay, ViewMode.HalfDay]);
421
- let counter = 0;
422
438
  for (let i = 0; i < dates.length; i++) {
423
439
  const date = dates[i];
424
- if (isHourView && date.date >= this._realMinDate && date.date <= this._realMaxDate) {
425
- createSVG("text", {
426
- x: date.lower_x,
427
- y: date.lower_y,
428
- innerHTML: `H${counter++ * this.options.step}`,
429
- class: "title-1",
430
- append_to: this.layers.date,
431
- });
432
- }
433
440
  createSVG("text", {
434
441
  x: date.lower_x,
435
442
  y: date.lower_y + 20,
@@ -437,6 +444,15 @@ export class Gantt {
437
444
  class: "title-2",
438
445
  append_to: this.layers.date,
439
446
  });
447
+ if (date.middle_text) {
448
+ createSVG("text", {
449
+ x: date.middle_x,
450
+ y: date.middle_y,
451
+ innerHTML: date.middle_text,
452
+ class: "middle-text",
453
+ append_to: this.layers.date,
454
+ });
455
+ }
440
456
  if (date.upper_text) {
441
457
  const $upper_text = createSVG("text", {
442
458
  x: date.upper_x,
@@ -466,68 +482,93 @@ export class Gantt {
466
482
  last_date = DateUtils.add(date, 1, "year");
467
483
  }
468
484
  const date_text = {
469
- hourLower: DateUtils.format(date, "HH:mm", this.options.language),
470
- quarterDayLower: DateUtils.format(date, "HH:mm", this.options.language),
471
- halfDayLower: DateUtils.format(date, "HH:mm", this.options.language),
472
- dayLower: date.getDate() !== last_date.getDate()
473
- ? DateUtils.format(date, "D", this.options.language)
485
+ // quarter hour
486
+ quarterHourUpper: date.getDate() !== last_date.getDate()
487
+ ? DateUtils.format(date, "D MMM", this.options.language)
474
488
  : "",
475
- weekLower: date.getMonth() !== last_date.getMonth()
489
+ quarterHourLower: DateUtils.format(date, "HH:mm", this.options.language),
490
+ // hour
491
+ hourUpper: date.getDate() !== last_date.getDate()
476
492
  ? DateUtils.format(date, "D MMM", this.options.language)
477
- : DateUtils.format(date, "D", this.options.language),
478
- monthLower: DateUtils.format(date, "MMMM", this.options.language),
479
- yearLower: DateUtils.format(date, "YYYY", this.options.language),
493
+ : "",
494
+ hourLower: DateUtils.format(date, "HH:mm", this.options.language),
495
+ // quarter day
480
496
  quarterDayUpper: date.getDate() !== last_date.getDate()
481
497
  ? DateUtils.format(date, "D MMM", this.options.language)
482
498
  : "",
483
- halfDayUpper: date.getDate() !== last_date.getDate()
484
- ? date.getMonth() !== last_date.getMonth()
499
+ quarterDayLower: DateUtils.format(date, "HH:mm", this.options.language),
500
+ // half day
501
+ halfDayUpper: (date.getDate() !== last_date.getDate())
502
+ ? (((date.getMonth() !== last_date.getMonth()) || i < 2)
485
503
  ? DateUtils.format(date, "D MMM", this.options.language)
486
- : DateUtils.format(date, "D", this.options.language)
504
+ : DateUtils.format(date, "D", this.options.language))
487
505
  : "",
488
- dayUpper: date.getMonth() !== last_date.getMonth()
506
+ halfDayLower: DateUtils.format(date, "HH:mm", this.options.language),
507
+ // day
508
+ dayUpper: ((date.getMonth() !== last_date.getMonth()) || i === 0)
489
509
  ? DateUtils.format(date, "MMMM", this.options.language)
490
510
  : "",
511
+ dayMiddle: DateUtils.format(date, "ddd", this.options.language),
512
+ dayLower: DateUtils.format(date, "D", this.options.language),
513
+ // week
491
514
  weekUpper: date.getMonth() !== last_date.getMonth()
492
515
  ? DateUtils.format(date, "MMMM", this.options.language)
493
516
  : "",
517
+ weekLower: date.getMonth() !== last_date.getMonth()
518
+ ? DateUtils.format(date, "D MMM", this.options.language)
519
+ : DateUtils.format(date, "D", this.options.language),
520
+ // month
494
521
  monthUpper: date.getFullYear() !== last_date.getFullYear()
495
522
  ? DateUtils.format(date, "YYYY", this.options.language)
496
523
  : "",
524
+ monthLower: DateUtils.format(date, "MMMM", this.options.language),
525
+ // year
497
526
  yearUpper: date.getFullYear() !== last_date.getFullYear()
498
527
  ? DateUtils.format(date, "YYYY", this.options.language)
499
528
  : "",
500
- hour: date.getHours() !== last_date.getHours()
501
- ? DateUtils.format(date, "HH:mm", this.options.language)
502
- : "",
529
+ yearLower: DateUtils.format(date, "YYYY", this.options.language),
503
530
  };
504
531
  // Descontando 20 para adcionar uma segunda linha de informação no cabeçalho
505
532
  const base_pos = {
506
533
  x: i * this.options.columnWidth,
507
- lower_y: this.options.headerHeight - 20,
508
534
  upper_y: this.options.headerHeight - 20 - 25,
535
+ middle_y: this.options.headerHeight - 20,
536
+ lower_y: this.options.headerHeight - 20,
509
537
  };
510
538
  const x_pos = {
539
+ quarterHourUpper: (this.dates.length < 14) ? (this.options.columnWidth) : (this.options.columnWidth * 24 / 2),
540
+ quarterHourMiddle: this.options.columnWidth / 2,
541
+ quarterHourLower: this.options.columnWidth / 2,
542
+ hourUpper: (this.dates.length < 14) ? (this.options.columnWidth) : (this.options.columnWidth * 24 / 2),
543
+ hourMiddle: this.options.columnWidth / 2,
511
544
  hourLower: this.options.columnWidth / 2,
512
- hourUpper: this.options.columnWidth * 24 / 2,
513
- quarterDayLower: this.options.columnWidth / 2,
514
545
  quarterDayUpper: this.options.columnWidth * 4 / 2,
515
- halfDayLower: this.options.columnWidth / 2,
546
+ quarterDayMiddle: this.options.columnWidth / 2,
547
+ quarterDayLower: this.options.columnWidth / 2,
516
548
  halfDayUpper: this.options.columnWidth * 2 / 2,
549
+ halfDayMiddle: this.options.columnWidth / 2,
550
+ halfDayLower: this.options.columnWidth / 2,
551
+ dayUpper: (this.dates.length < 15) ? (this.options.columnWidth) : ((this.options.columnWidth * 30) / 2),
552
+ dayMiddle: this.options.columnWidth / 2 - 12,
517
553
  dayLower: this.options.columnWidth / 2,
518
- dayUpper: (this.options.columnWidth * 30) / 2,
519
- weekLower: 0,
520
554
  weekUpper: (this.options.columnWidth * 4) / 2,
555
+ weekMiddle: 0,
556
+ weekLower: 0,
557
+ monthUpper: (this.dates.length < 15) ? (this.options.columnWidth) : ((this.options.columnWidth * 12) / 2),
558
+ monthMiddle: 0,
521
559
  monthLower: this.options.columnWidth / 2,
522
- monthUpper: (this.options.columnWidth * 12) / 2,
523
- yearLower: this.options.columnWidth / 2,
524
560
  yearUpper: (this.options.columnWidth * 30) / 2,
561
+ yearMiddle: this.options.columnWidth / 2,
562
+ yearLower: this.options.columnWidth / 2,
525
563
  };
526
564
  return {
527
565
  upper_text: date_text[`${this.options.viewMode}Upper`],
566
+ middle_text: date_text[`${this.options.viewMode}Middle`],
528
567
  lower_text: date_text[`${this.options.viewMode}Lower`],
529
568
  upper_x: base_pos.x + x_pos[`${this.options.viewMode}Upper`],
530
569
  upper_y: base_pos.upper_y,
570
+ middle_x: base_pos.x + x_pos[`${this.options.viewMode}Middle`],
571
+ middle_y: base_pos.middle_y,
531
572
  lower_x: base_pos.x + x_pos[`${this.options.viewMode}Lower`],
532
573
  lower_y: base_pos.lower_y,
533
574
  date,
@@ -611,7 +652,7 @@ export class Gantt {
611
652
  else if (element.classList.contains("right")) {
612
653
  is_resizing_right = true;
613
654
  }
614
- else if (element.classList.contains("bar-wrapper")) {
655
+ else if (element.classList.contains("bar-wrapper") && this.options.allowMovement) {
615
656
  is_dragging = true;
616
657
  }
617
658
  bar_wrapper.classList.add("active");
@@ -666,7 +707,7 @@ export class Gantt {
666
707
  });
667
708
  }, null);
668
709
  document.addEventListener("mouseup", (e) => {
669
- if (is_dragging || is_resizing_left || is_resizing_right) {
710
+ if (is_dragging || is_resizing_left || is_resizing_right || !this.options.allowMovement) {
670
711
  bars.forEach((bar) => bar.group.classList.remove("active"));
671
712
  }
672
713
  is_dragging = false;
@@ -764,4 +805,4 @@ export class Gantt {
764
805
  function generate_id(task) {
765
806
  return task.name + "_" + Math.random().toString(36).slice(2, 12);
766
807
  }
767
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FudHQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzLyIsInNvdXJjZXMiOlsiY29tcG9uZW50cy9nYW50dC9jb21wb25lbnRzL2dhbnR0L2dhbnR0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDNUIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHbEQsTUFBTSxPQUFPLEtBQUs7SUE0QmQsWUFBWSxPQUFZLEVBQUUsS0FBYSxFQUFFLE9BQWlCO1FBQ3RELElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLG9DQUFvQztRQUNwQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQWZELElBQVcsT0FBTztRQUNkLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3pCLENBQUM7SUFXTyxhQUFhLENBQUMsT0FBWTtRQUM5QixJQUFJLFdBQVcsRUFBRSxlQUFlLENB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QUM7YUFDL0IsTUFBTSxDQUFDLENBQUMsU0FBYyxFQUFFLFFBQWEsRUFBRSxFQUFFLENBQ3RDLFFBQVEsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUMvQyxDQUFDO0lBQ1YsQ0FBQztJQUVPLEtBQUs7UUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDN0IsQ0FBQztDQUNKO0FBRUQsU0FBUyxXQUFXLENBQUMsSUFBUztJQUMxQixPQUFPLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0ZVV0aWxzIH0gZnJvbSBcIi4vdXRpbHMvZGF0ZS11dGlsc1wiO1xuaW1wb3J0IHsgJCwgY3JlYXRlU1ZHIH0gZnJvbSBcIi4vdXRpbHMvc3ZnLXV0aWxzXCI7XG5pbXBvcnQgeyBCYXIgfSBmcm9tIFwiLi9iYXJcIjtcbmltcG9ydCB7IFBvcHVwIH0gZnJvbSBcIi4vcG9wdXBcIjtcbmltcG9ydCB7IEFycm93IH0gZnJvbSBcIi4vYXJyb3dcIjtcbmltcG9ydCB7IE9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL29wdGlvbnNcIjtcbmltcG9ydCB7IGRlZmF1bHRPcHRpb25zIH0gZnJvbSBcIi4vZ2FudHQtb3B0aW9uc1wiO1xuaW1wb3J0IHsgVmlld01vZGUgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3ZpZXctbW9kZVwiO1xuaW1wb3J0IHsgVGFzaywgRW5yaWNoZWRUYXNrIH0gZnJvbSBcIi4uLy4uL21vZGVsc1wiO1xuXG5leHBvcnQgY2xhc3MgR2FudHQge1xuICAgIHB1YmxpYyBvcHRpb25zOiBPcHRpb25zO1xuICAgIHB1YmxpYyB0YXNrczogRW5yaWNoZWRUYXNrW107XG4gICAgcHVibGljIGRlcGVuZGVuY3lfbWFwOiBhbnk7XG5cbiAgICBwcml2YXRlIF9taW5EYXRlOiBEYXRlO1xuICAgIHByaXZhdGUgX21heERhdGU6IERhdGU7XG4gICAgcHJpdmF0ZSBfcmVhbE1pbkRhdGU6IERhdGU7XG4gICAgcHJpdmF0ZSBfcmVhbE1heERhdGU6IERhdGU7XG5cbiAgICBwdWJsaWMgZGF0ZXM6IGFueTtcbiAgICBwdWJsaWMgbGF5ZXJzOiBhbnk7XG4gICAgcHVibGljIGJhcnM6IEJhcltdO1xuICAgIHB1YmxpYyBhcnJvd3M6IEFycm93W107XG4gICAgcHVibGljIGJhcl9iZWluZ19kcmFnZ2VkOiBhbnk7XG4gICAgcHVibGljICRzdmc6IGFueTtcbiAgICBwdWJsaWMgJGNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQ7XG4gICAgcHVibGljIHBvcHVwX3dyYXBwZXI6IEhUTUxEaXZFbGVtZW50O1xuICAgIHB1YmxpYyBwb3B1cDogYW55O1xuXG4gICAgcHVibGljIGdldCBtaW5EYXRlKCk6IERhdGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWluRGF0ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1heERhdGUoKTogRGF0ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXhEYXRlO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHdyYXBwZXI6IGFueSwgdGFza3M6IFRhc2tbXSwgb3B0aW9ucz86IE9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zZXR1cF93cmFwcGVyKHdyYXBwZXIpO1xuICAgICAgICB0aGlzLnNldHVwX29wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuc2V0dXBfdGFza3ModGFza3MpO1xuICAgICAgICAvLyBpbml0aWFsaXplIHdpdGggZGVmYXVsdCB2aWV3IG1vZGVcbiAgICAgICAgdGhpcy5jaGFuZ2Vfdmlld19tb2RlKCk7XG4gICAgICAgIHRoaXMuYmluZF9ldmVudHMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwX3dyYXBwZXIoZWxlbWVudDogYW55KSB7XG4gICAgICAgIGxldCBzdmdfZWxlbWVudCwgd3JhcHBlcl9lbGVtZW50O1xuXG4gICAgICAgIC8vIENTUyBTZWxlY3RvciBpcyBwYXNzZWRcbiAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGdldCB0aGUgU1ZHRWxlbWVudFxuICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgICB3cmFwcGVyX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICAgICAgc3ZnX2VsZW1lbnQgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCJzdmdcIik7XG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpIHtcbiAgICAgICAgICAgIHN2Z19lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJGcmFwcMOpIEdhbnR0IG9ubHkgc3VwcG9ydHMgdXNhZ2Ugb2YgYSBzdHJpbmcgQ1NTIHNlbGVjdG9yLCBIVE1MIERPTSBlbGVtZW50IG9yIFNWRyBET00gZWxlbWVudCBmb3IgdGhlIFxcJ2VsZW1lbnRcXCcgcGFyYW1ldGVyXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdmcgZWxlbWVudFxuICAgICAgICBpZiAoIXN2Z19lbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgaXRcbiAgICAgICAgICAgIHRoaXMuJHN2ZyA9IGNyZWF0ZVNWRyhcInN2Z1wiLCB7XG4gICAgICAgICAgICAgICAgYXBwZW5kX3RvOiB3cmFwcGVyX2VsZW1lbnQsXG4gICAgICAgICAgICAgICAgY2xhc3M6IFwiZ2FudHRcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4kc3ZnID0gc3ZnX2VsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLiRzdmcuY2xhc3NMaXN0LmFkZChcImdhbnR0XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd3JhcHBlciBlbGVtZW50XG4gICAgICAgIHRoaXMuJGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuJGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiZ2FudHQtY29udGFpbmVyXCIpO1xuXG4gICAgICAgIGNvbnN0IHBhcmVudF9lbGVtZW50ID0gdGhpcy4kc3ZnLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIHBhcmVudF9lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuJGNvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuJGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLiRzdmcpO1xuXG4gICAgICAgIC8vIHBvcHVwIHdyYXBwZXJcbiAgICAgICAgdGhpcy5wb3B1cF93cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5wb3B1cF93cmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJwb3B1cC13cmFwcGVyXCIpO1xuICAgICAgICB0aGlzLiRjb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5wb3B1cF93cmFwcGVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwX29wdGlvbnMob3B0aW9uczogYW55KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0dXBfdGFza3ModGFza3M6IGFueSkge1xuICAgICAgICAvLyBwcmVwYXJlIHRhc2tzXG4gICAgICAgIHRoaXMudGFza3MgPSB0YXNrcy5tYXAoKHRhc2s6IGFueSwgaTogYW55KSA9PiB7XG4gICAgICAgICAgICAvL3N0YW5kYXJkIGNvbG9ycyBpZiBuZWVkZWRcbiAgICAgICAgICAgIHRhc2suY29sb3IgPSB0YXNrLmNvbG9yIHx8ICcjNzg5MkExJztcblxuICAgICAgICAgICAgLy8gY29udmVydCB0byBEYXRlIG9iamVjdHNcbiAgICAgICAgICAgIHRhc2suX3N0YXJ0ID0gRGF0ZVV0aWxzLnBhcnNlKHRhc2suc3RhcnQpO1xuICAgICAgICAgICAgdGFzay5fZW5kID0gRGF0ZVV0aWxzLnBhcnNlKHRhc2suZW5kKTtcblxuICAgICAgICAgICAgLy8gbWFrZSB0YXNrIGludmFsaWQgaWYgZHVyYXRpb24gdG9vIGxhcmdlXG4gICAgICAgICAgICBpZiAoRGF0ZVV0aWxzLmRpZmYodGFzay5fZW5kLCB0YXNrLl9zdGFydCwgXCJ5ZWFyXCIpID4gMTApIHtcbiAgICAgICAgICAgICAgICB0YXNrLmVuZCA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNhY2hlIGluZGV4XG4gICAgICAgICAgICB0YXNrLl9pbmRleCA9IGk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGFzay5fcm93X2lkID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgdGFzay5faW5kZXggPSB0YXNrLl9yb3dfaWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGludmFsaWQgZGF0ZXNcbiAgICAgICAgICAgIGlmICghdGFzay5zdGFydCAmJiAhdGFzay5lbmQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b2RheSA9IERhdGVVdGlscy50b2RheSgpO1xuICAgICAgICAgICAgICAgIHRhc2suX3N0YXJ0ID0gdG9kYXk7XG4gICAgICAgICAgICAgICAgdGFzay5fZW5kID0gRGF0ZVV0aWxzLmFkZCh0b2RheSwgMiwgXCJkYXlcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGFzay5zdGFydCAmJiB0YXNrLmVuZCkge1xuICAgICAgICAgICAgICAgIHRhc2suX3N0YXJ0ID0gRGF0ZVV0aWxzLmFkZCh0YXNrLl9lbmQsIC0yLCAnZGF5Jyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YXNrLnN0YXJ0ICYmICF0YXNrLmVuZCkge1xuICAgICAgICAgICAgICAgIHRhc2suX2VuZCA9IERhdGVVdGlscy5hZGQodGFzay5fc3RhcnQsIDIsIFwiZGF5XCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiBob3VycyBpcyBub3Qgc2V0LCBhc3N1bWUgdGhlIGxhc3QgZGF5IGlzIGZ1bGwgZGF5XG4gICAgICAgICAgICAvLyBlLmc6IDIwMTgtMDktMDkgYmVjb21lcyAyMDE4LTA5LTA5IDIzOjU5OjU5XG4gICAgICAgICAgICBjb25zdCB0YXNrX2VuZF92YWx1ZXMgPSBEYXRlVXRpbHMuZ2V0RGF0ZVZhbHVlcyh0YXNrLl9lbmQpO1xuICAgICAgICAgICAgaWYgKHRhc2tfZW5kX3ZhbHVlcy5zbGljZSgzKS5ldmVyeSgoZCkgPT4gZCA9PT0gMCkpIHtcbiAgICAgICAgICAgICAgICB0YXNrLl9lbmQgPSBEYXRlVXRpbHMuYWRkKHRhc2suX2VuZCwgMjQsIFwiaG91clwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaW52YWxpZCBmbGFnXG4gICAgICAgICAgICBpZiAoIXRhc2suc3RhcnQgfHwgIXRhc2suZW5kKSB7XG4gICAgICAgICAgICAgICAgdGFzay5pbnZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZGVwZW5kZW5jaWVzXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRhc2suZGVwZW5kZW5jaWVzID09PSBcInN0cmluZ1wiIHx8ICF0YXNrLmRlcGVuZGVuY2llcykge1xuICAgICAgICAgICAgICAgIGxldCBkZXBzID0gW107XG4gICAgICAgICAgICAgICAgaWYgKHRhc2suZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlcHMgPSB0YXNrLmRlcGVuZGVuY2llc1xuICAgICAgICAgICAgICAgICAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGQ6IGFueSkgPT4gZC50cmltKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChkOiBhbnkpID0+IGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0YXNrLmRlcGVuZGVuY2llcyA9IGRlcHM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHVpZHNcbiAgICAgICAgICAgIGlmICghdGFzay5pZCkge1xuICAgICAgICAgICAgICAgIHRhc2suaWQgPSBnZW5lcmF0ZV9pZCh0YXNrKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRhc2s7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2V0dXBfZGVwZW5kZW5jaWVzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXR1cF9kZXBlbmRlbmNpZXMoKSB7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jeV9tYXAgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLnRhc2tzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBkIG9mIHQuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXBlbmRlbmN5X21hcFtkXSA9IHRoaXMuZGVwZW5kZW5jeV9tYXBbZF0gfHwgW107XG4gICAgICAgICAgICAgICAgdGhpcy5kZXBlbmRlbmN5X21hcFtkXS5wdXNoKHQuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlZnJlc2godGFza3M6IFRhc2tbXSkge1xuICAgICAgICB0aGlzLnNldHVwX3Rhc2tzKHRhc2tzKTtcbiAgICAgICAgdGhpcy5jaGFuZ2Vfdmlld19tb2RlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNoYW5nZV92aWV3X21vZGUobW9kZSA9IHRoaXMub3B0aW9ucy52aWV3TW9kZSkge1xuICAgICAgICB0aGlzLnVwZGF0ZV92aWV3X3NjYWxlKG1vZGUpO1xuICAgICAgICB0aGlzLnNldHVwX2RhdGVzKCk7XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICAgIC8vIGZpcmUgdmlld21vZGVfY2hhbmdlIGV2ZW50XG4gICAgICAgIHRoaXMudHJpZ2dlcl9ldmVudChcIm9uVmlld0NoYW5nZVwiLCBbbW9kZV0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlX3ZpZXdfc2NhbGUodmlld19tb2RlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnZpZXdNb2RlID0gdmlld19tb2RlO1xuICAgICAgICAvLyB0aGlzLmlzSG91clZpZXcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHZpZXdfbW9kZSA9PT0gVmlld01vZGUuSG91cikge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnN0ZXAgPSAyNCAvIDI0O1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoID0gNTA7XG4gICAgICAgICAgICAvLyB0aGlzLmlzSG91clZpZXcgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHZpZXdfbW9kZSA9PT0gVmlld01vZGUuRGF5KSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3RlcCA9IDI0O1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoID0gNTA7XG4gICAgICAgIH0gZWxzZSBpZiAodmlld19tb2RlID09PSBWaWV3TW9kZS5IYWxmRGF5KSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3RlcCA9IDI0IC8gMjtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCA9IDUwO1xuICAgICAgICB9IGVsc2UgaWYgKHZpZXdfbW9kZSA9PT0gVmlld01vZGUuUXVhcnRlckRheSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnN0ZXAgPSAyNCAvIDQ7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggPSA1MDtcbiAgICAgICAgfSBlbHNlIGlmICh2aWV3X21vZGUgPT09IFZpZXdNb2RlLldlZWspIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zdGVwID0gMjQgKiA3O1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoID0gMTQwO1xuICAgICAgICB9IGVsc2UgaWYgKHZpZXdfbW9kZSA9PT0gVmlld01vZGUuTW9udGgpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zdGVwID0gMjQgKiAzMDtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCA9IDEyMDtcbiAgICAgICAgfSBlbHNlIGlmICh2aWV3X21vZGUgPT09IFZpZXdNb2RlLlllYXIpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zdGVwID0gMjQgKiAzNjU7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggPSAxMjA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwX2RhdGVzKCkge1xuICAgICAgICB0aGlzLnNldHVwX2dhbnR0X2RhdGVzKCk7XG4gICAgICAgIHRoaXMuc2V0dXBfZGF0ZV92YWx1ZXMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwX2dhbnR0X2RhdGVzKCkge1xuICAgICAgICB0aGlzLl9taW5EYXRlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbWF4RGF0ZSA9IG51bGw7XG5cbiAgICAgICAgZm9yIChsZXQgdGFzayBvZiB0aGlzLnRhc2tzKSB7XG4gICAgICAgICAgICAvLyBzZXQgZ2xvYmFsIHN0YXJ0IGFuZCBlbmQgZGF0ZVxuICAgICAgICAgICAgaWYgKCF0aGlzLm1pbkRhdGUgfHwgdGFzay5zdGFydCA8IHRoaXMubWluRGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21pbkRhdGUgPSB0YXNrLnN0YXJ0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLm1heERhdGUgfHwgdGFzay5lbmQgPiB0aGlzLm1heERhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhEYXRlID0gdGFzay5lbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9yZWFsTWluRGF0ZSA9IHRoaXMubWluRGF0ZTtcbiAgICAgICAgdGhpcy5fcmVhbE1heERhdGUgPSB0aGlzLm1heERhdGU7XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLm9wdGlvbnMudmlld01vZGUpIHtcbiAgICAgICAgICAgIGNhc2UgVmlld01vZGUuSG91cjpcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5EYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1pbkRhdGUsIC0odGhpcy5vcHRpb25zLm1hcmdpbkJlZm9yZVN0YXJ0ID8/IDEpLCBcImhvdXJcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4RGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5tYXhEYXRlLCB0aGlzLm9wdGlvbnMubWFyZ2luQWZ0ZXJFbmQgPz8gMSwgXCJob3VyXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBWaWV3TW9kZS5RdWFydGVyRGF5OlxuICAgICAgICAgICAgICAgIHRoaXMuX21pbkRhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWluRGF0ZSwgLSh0aGlzLm9wdGlvbnMubWFyZ2luQmVmb3JlU3RhcnQgPz8gMTIpLCBcImhvdXJcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4RGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5tYXhEYXRlLCB0aGlzLm9wdGlvbnMubWFyZ2luQWZ0ZXJFbmQgPz8gMTIsIFwiaG91clwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVmlld01vZGUuSGFsZkRheTpcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5EYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1pbkRhdGUsIC0odGhpcy5vcHRpb25zLm1hcmdpbkJlZm9yZVN0YXJ0ID8/IDEpLCBcImRheVwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhEYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1heERhdGUsIHRoaXMub3B0aW9ucy5tYXJnaW5BZnRlckVuZCA/PyAxLCBcImRheVwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVmlld01vZGUuRGF5OlxuICAgICAgICAgICAgICAgIHRoaXMuX21pbkRhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWluRGF0ZSwgLSh0aGlzLm9wdGlvbnMubWFyZ2luQmVmb3JlU3RhcnQgPz8gMyksIFwiZGF5XCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21heERhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWF4RGF0ZSwgdGhpcy5vcHRpb25zLm1hcmdpbkFmdGVyRW5kID8/IDMsIFwiZGF5XCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBWaWV3TW9kZS5XZWVrOlxuICAgICAgICAgICAgICAgIHRoaXMuX21pbkRhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWluRGF0ZSwgLSh0aGlzLm9wdGlvbnMubWFyZ2luQmVmb3JlU3RhcnQgPz8gMSksIFwibW9udGhcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4RGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5tYXhEYXRlLCB0aGlzLm9wdGlvbnMubWFyZ2luQWZ0ZXJFbmQgPz8gMSwgXCJtb250aFwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVmlld01vZGUuTW9udGg6XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluRGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5taW5EYXRlLCAtKHRoaXMub3B0aW9ucy5tYXJnaW5CZWZvcmVTdGFydCA/PyAxKSwgXCJ5ZWFyXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21heERhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWF4RGF0ZSwgdGhpcy5vcHRpb25zLm1hcmdpbkFmdGVyRW5kID8/IDEsIFwieWVhclwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVmlld01vZGUuWWVhcjpcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5EYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1pbkRhdGUsIC0odGhpcy5vcHRpb25zLm1hcmdpbkJlZm9yZVN0YXJ0ID8/IDIpLCBcInllYXJcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4RGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5tYXhEYXRlLCB0aGlzLm9wdGlvbnMubWFyZ2luQWZ0ZXJFbmQgPz8gMiwgXCJ5ZWFyXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXR1cF9kYXRlX3ZhbHVlcygpIHtcbiAgICAgICAgdGhpcy5kYXRlcyA9IFtdO1xuICAgICAgICBsZXQgY3VyX2RhdGUgPSBudWxsO1xuXG4gICAgICAgIHdoaWxlIChjdXJfZGF0ZSA9PT0gbnVsbCB8fCBjdXJfZGF0ZSA8IHRoaXMubWF4RGF0ZSkge1xuICAgICAgICAgICAgaWYgKCFjdXJfZGF0ZSkge1xuICAgICAgICAgICAgICAgIGN1cl9kYXRlID0gRGF0ZVV0aWxzLmNsb25lKHRoaXMubWluRGF0ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXdfaXMoVmlld01vZGUuWWVhcikpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyX2RhdGUgPSBEYXRlVXRpbHMuYWRkKGN1cl9kYXRlLCAxLCBcInllYXJcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZpZXdfaXMoVmlld01vZGUuTW9udGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cl9kYXRlID0gRGF0ZVV0aWxzLmFkZChjdXJfZGF0ZSwgMSwgXCJtb250aFwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjdXJfZGF0ZSA9IERhdGVVdGlscy5hZGQoXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJfZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zdGVwLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2hvdXInXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kYXRlcy5wdXNoKGN1cl9kYXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKFwiY3VyX2RhdGVcIiwgY3VyX2RhdGUpO1xuICAgICAgICBjb25zb2xlLmxvZyhcImRhdGVzXCIsIHRoaXMuZGF0ZXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYmluZF9ldmVudHMoKSB7XG4gICAgICAgIHRoaXMuYmluZF9ncmlkX2NsaWNrKCk7XG4gICAgICAgIHRoaXMuYmluZF9iYXJfZXZlbnRzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW5kZXIoKSB7XG4gICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5zZXR1cF9sYXllcnMoKTtcbiAgICAgICAgdGhpcy5tYWtlX2dyaWQoKTtcbiAgICAgICAgdGhpcy5tYWtlX2RhdGVzKCk7XG4gICAgICAgIHRoaXMubWFrZV9iYXJzKCk7XG4gICAgICAgIHRoaXMubWFrZV9hcnJvd3MoKTtcbiAgICAgICAgdGhpcy5tYXBfYXJyb3dzX29uX2JhcnMoKTtcbiAgICAgICAgdGhpcy5zZXRfd2lkdGgoKTtcbiAgICAgICAgdGhpcy5zZXRfc2Nyb2xsX3Bvc2l0aW9uKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXR1cF9sYXllcnMoKSB7XG4gICAgICAgIHRoaXMubGF5ZXJzID0ge307XG4gICAgICAgIGNvbnN0IGxheWVycyA9IFtcImdyaWRcIiwgXCJkYXRlXCIsIFwiYXJyb3dcIiwgXCJwcm9ncmVzc1wiLCBcImJhclwiLCBcImRldGFpbHNcIl07XG4gICAgICAgIC8vIG1ha2UgZ3JvdXAgbGF5ZXJzXG4gICAgICAgIGZvciAobGV0IGxheWVyIG9mIGxheWVycykge1xuICAgICAgICAgICAgdGhpcy5sYXllcnNbbGF5ZXJdID0gY3JlYXRlU1ZHKCdnJywge1xuICAgICAgICAgICAgICAgIGNsYXNzOiBsYXllcixcbiAgICAgICAgICAgICAgICBhcHBlbmRfdG86IHRoaXMuJHN2ZyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYWtlX2dyaWQoKSB7XG4gICAgICAgIHRoaXMubWFrZV9ncmlkX2JhY2tncm91bmQoKTtcbiAgICAgICAgdGhpcy5tYWtlX2dyaWRfcm93cygpO1xuICAgICAgICB0aGlzLm1ha2VfZ3JpZF9oZWFkZXIoKTtcbiAgICAgICAgdGhpcy5tYWtlX2dyaWRfaGlnaGxpZ2h0cygpO1xuICAgICAgICB0aGlzLm1ha2VfZ3JpZF90aWNrcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZV9ncmlkX2JhY2tncm91bmQoKSB7XG4gICAgICAgIGNvbnN0IGdyaWRfd2lkdGggPSB0aGlzLmRhdGVzLmxlbmd0aCAqIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aDtcbiAgICAgICAgY29uc3QgZGlzdGluY3Rfcm93cyA9IFsuLi5uZXcgU2V0KHRoaXMudGFza3MubWFwKCh4OiBhbnkpID0+IHguX3Jvd19pZCkpXTtcbiAgICAgICAgY29uc3QgZ3JpZF9oZWlnaHQgPSB0aGlzLm9wdGlvbnMuaGVhZGVySGVpZ2h0ICtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wYWRkaW5nIC8gMiArXG4gICAgICAgICAgICAodGhpcy5vcHRpb25zLmJhckhlaWdodCArIHRoaXMub3B0aW9ucy5wYWRkaW5nKSAqXG4gICAgICAgICAgICBkaXN0aW5jdF9yb3dzLmxlbmd0aDtcblxuICAgICAgICBjcmVhdGVTVkcoXCJyZWN0XCIsIHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgd2lkdGg6IGdyaWRfd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGdyaWRfaGVpZ2h0LFxuICAgICAgICAgICAgY2xhc3M6IFwiZ3JpZC1iYWNrZ3JvdW5kXCIsXG4gICAgICAgICAgICBhcHBlbmRfdG86IHRoaXMubGF5ZXJzLmdyaWQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgICQuYXR0cih0aGlzLiRzdmcsIHtcbiAgICAgICAgICAgIGhlaWdodDogZ3JpZF9oZWlnaHQsXG4gICAgICAgICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICAgIH0sIG51bGwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZV9ncmlkX3Jvd3MoKSB7XG4gICAgICAgIGNvbnN0IHJvd3NfbGF5ZXIgPSBjcmVhdGVTVkcoXCJnXCIsIHsgYXBwZW5kX3RvOiB0aGlzLmxheWVycy5ncmlkIH0pO1xuICAgICAgICBjb25zdCBsaW5lc19sYXllciA9IGNyZWF0ZVNWRyhcImdcIiwgeyBhcHBlbmRfdG86IHRoaXMubGF5ZXJzLmdyaWQgfSk7XG5cbiAgICAgICAgY29uc3Qgcm93X3dpZHRoID0gdGhpcy5kYXRlcy5sZW5ndGggKiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGg7XG4gICAgICAgIGNvbnN0IHJvd19oZWlnaHQgPSB0aGlzLm9wdGlvbnMuYmFySGVpZ2h0ICsgdGhpcy5vcHRpb25zLnBhZGRpbmc7XG4gICAgICAgIC8vVE9ETzogIGFqdXN0YXIgbyBwb3NpY2lvbmFtZW50byBkYXMgbGluaGFzXG4gICAgICAgIGxldCByb3dfeSA9IHRoaXMub3B0aW9ucy5oZWFkZXJIZWlnaHQgKyB0aGlzLm9wdGlvbnMucGFkZGluZyAvIDI7XG5cbiAgICAgICAgdGhpcy50YXNrcy5mb3JFYWNoKF8gPT4ge1xuICAgICAgICAgICAgY3JlYXRlU1ZHKFwicmVjdFwiLCB7XG4gICAgICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgICAgICB5OiByb3dfeSxcbiAgICAgICAgICAgICAgICB3aWR0aDogcm93X3dpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodDogcm93X2hlaWdodCxcbiAgICAgICAgICAgICAgICBjbGFzczogXCJncmlkLXJvd1wiLFxuICAgICAgICAgICAgICAgIGFwcGVuZF90bzogcm93c19sYXllcixcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjcmVhdGVTVkcoXCJsaW5lXCIsIHtcbiAgICAgICAgICAgICAgICB4MTogMCxcbiAgICAgICAgICAgICAgICB5MTogcm93X3kgKyByb3dfaGVpZ2h0LFxuICAgICAgICAgICAgICAgIHgyOiByb3dfd2lkdGgsXG4gICAgICAgICAgICAgICAgeTI6IHJvd195ICsgcm93X2hlaWdodCxcbiAgICAgICAgICAgICAgICBjbGFzczogXCJyb3ctbGluZVwiLFxuICAgICAgICAgICAgICAgIGFwcGVuZF90bzogbGluZXNfbGF5ZXIsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcm93X3kgKz0gdGhpcy5vcHRpb25zLmJhckhlaWdodCArIHRoaXMub3B0aW9ucy5wYWRkaW5nO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1ha2VfZ3JpZF9oZWFkZXIoKSB7XG4gICAgICAgIC8vIGNvbnN0IGFkZElzSG91clZpZXcgPSB0aGlzLmlzSG91clZpZXcgPyAyNSA6IDEwXG4gICAgICAgIGNvbnN0IGhlYWRlcl93aWR0aCA9IHRoaXMuZGF0ZXMubGVuZ3RoICogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoO1xuICAgICAgICBjb25zdCBoZWFkZXJfaGVpZ2h0ID0gdGhpcy5vcHRpb25zLmhlYWRlckhlaWdodCArIDEwO1xuICAgICAgICBjcmVhdGVTVkcoXCJyZWN0XCIsIHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgd2lkdGg6IGhlYWRlcl93aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogaGVhZGVyX2hlaWdodCxcbiAgICAgICAgICAgIGNsYXNzOiBcImdyaWQtaGVhZGVyXCIsXG4gICAgICAgICAgICBhcHBlbmRfdG86IHRoaXMubGF5ZXJzLmdyaWQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZV9ncmlkX3RpY2tzKCkge1xuICAgICAgICBsZXQgdGlja194ID0gMDtcbiAgICAgICAgbGV0IHRpY2tfeSA9IHRoaXMub3B0aW9ucy5oZWFkZXJIZWlnaHQgKyB0aGlzLm9wdGlvbnMucGFkZGluZyAvIDI7XG4gICAgICAgIGxldCB0aWNrX2hlaWdodCA9XG4gICAgICAgICAgICAodGhpcy5vcHRpb25zLmJhckhlaWdodCArIHRoaXMub3B0aW9ucy5wYWRkaW5nKSAqXG4gICAgICAgICAgICB0aGlzLnRhc2tzLmxlbmd0aDtcblxuICAgICAgICBmb3IgKGxldCBkYXRlIG9mIHRoaXMuZGF0ZXMpIHtcbiAgICAgICAgICAgIGxldCB0aWNrX2NsYXNzID0gXCJ0aWNrXCI7XG4gICAgICAgICAgICAvLyB0aGljayB0aWNrIGZvciBtb25kYXlcbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXdfaXMoVmlld01vZGUuRGF5KSAmJiBkYXRlLmdldERhdGUoKSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHRpY2tfY2xhc3MgKz0gXCIgdGhpY2tcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRoaWNrIHRpY2sgZm9yIGZpcnN0IHdlZWtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdfaXMoVmlld01vZGUuV2VlaykgJiZcbiAgICAgICAgICAgICAgICBkYXRlLmdldERhdGUoKSA+PSAxICYmXG4gICAgICAgICAgICAgICAgZGF0ZS5nZXREYXRlKCkgPCA4XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aWNrX2NsYXNzICs9IFwiIHRoaWNrXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0aGljayB0aWNrcyBmb3IgcXVhcnRlcnNcbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXdfaXMoVmlld01vZGUuTW9udGgpICYmIGRhdGUuZ2V0TW9udGgoKSAlIDMgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aWNrX2NsYXNzICs9IFwiIHRoaWNrXCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNyZWF0ZVNWRyhcInBhdGhcIiwge1xuICAgICAgICAgICAgICAgIGQ6IGBNICR7dGlja194fSAke3RpY2tfeX0gdiAke3RpY2tfaGVpZ2h0fWAsXG4gICAgICAgICAgICAgICAgY2xhc3M6IHRpY2tfY2xhc3MsXG4gICAgICAgICAgICAgICAgYXBwZW5kX3RvOiB0aGlzLmxheWVycy5ncmlkLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXdfaXMoVmlld01vZGUuTW9udGgpKSB7XG4gICAgICAgICAgICAgICAgdGlja194ICs9XG4gICAgICAgICAgICAgICAgICAgIChEYXRlVXRpbHMuZ2V0RGF5c0luTW9udGgoZGF0ZSkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoKSAvXG4gICAgICAgICAgICAgICAgICAgIDMwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aWNrX3ggKz0gdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgbWFrZV9ncmlkX2hpZ2hsaWdodHMoKSB7XG4gICAgICAgIGlmICh0aGlzLnZpZXdfaXMoVmlld01vZGUuRGF5KSkge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGg7XG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSAodGhpcy5vcHRpb25zLmJhckhlaWdodCArIHRoaXMub3B0aW9ucy5wYWRkaW5nKSAqXG4gICAgICAgICAgICAgICAgdGhpcy50YXNrcy5sZW5ndGggK1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5oZWFkZXJIZWlnaHQgK1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wYWRkaW5nIC8gMjtcblxuICAgICAgICAgICAgbGV0IHggPSAwO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBkYXRlIG9mIHRoaXMuZGF0ZXMpIHtcblxuICAgICAgICAgICAgICAgIGxldCB5ID0gKHRoaXMub3B0aW9ucy5oZWFkZXJIZWlnaHQgKyB0aGlzLm9wdGlvbnMucGFkZGluZykgLyAyO1xuXG4gICAgICAgICAgICAgICAgbGV0IGlzVG9kYXkgPSBkYXRlLnRvU3RyaW5nKCkgPT0gRGF0ZVV0aWxzLnRvZGF5KCk7XG4gICAgICAgICAgICAgICAgbGV0IGlzV2Vla2VuZCA9IChkYXRlLmdldERheSgpID09IDAgfHwgZGF0ZS5nZXREYXkoKSA9PSA2KTtcbiAgICAgICAgICAgICAgICBsZXQgY2xhc3NOYW1lO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzVG9kYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gXCJ0b2RheS1oaWdobGlnaHRcIjtcbiAgICAgICAgICAgICAgICAgICAgeSA9ICh0aGlzLm9wdGlvbnMuaGVhZGVySGVpZ2h0ICsgdGhpcy5vcHRpb25zLnBhZGRpbmcpIC8gMjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzV2Vla2VuZCkge1xuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBcIndlZWtlbmQtaGlnaGxpZ2h0XCI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgcnggPSAzO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJ5ID0gMztcblxuICAgICAgICAgICAgICAgIGlmIChpc1RvZGF5IHx8IGlzV2Vla2VuZCkge1xuICAgICAgICAgICAgICAgICAgICBjcmVhdGVTVkcoXCJyZWN0XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgICAgICAgICAgICB5LFxuICAgICAgICAgICAgICAgICAgICAgICAgcngsXG4gICAgICAgICAgICAgICAgICAgICAgICByeSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6IGNsYXNzTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZF90bzogdGhpcy5sYXllcnMuZ3JpZFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB4ICs9IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZV9kYXRlcygpIHtcbiAgICAgICAgY29uc3QgZGF0ZXMgPSB0aGlzLmdldF9kYXRlc190b19kcmF3KCk7XG4gICAgICAgIGNvbnN0IGlzSG91clZpZXcgPSB0aGlzLnZpZXdfaXMoW1ZpZXdNb2RlLkhvdXIsIFZpZXdNb2RlLlF1YXJ0ZXJEYXksIFZpZXdNb2RlLkhhbGZEYXldKTtcbiAgICAgICAgbGV0IGNvdW50ZXIgPSAwO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBkYXRlc1tpXTtcblxuICAgICAgICAgICAgaWYgKGlzSG91clZpZXcgJiYgZGF0ZS5kYXRlID49IHRoaXMuX3JlYWxNaW5EYXRlICYmIGRhdGUuZGF0ZSA8PSB0aGlzLl9yZWFsTWF4RGF0ZSkge1xuICAgICAgICAgICAgICAgIGNyZWF0ZVNWRyhcInRleHRcIiwge1xuICAgICAgICAgICAgICAgICAgICB4OiBkYXRlLmxvd2VyX3gsXG4gICAgICAgICAgICAgICAgICAgIHk6IGRhdGUubG93ZXJfeSxcbiAgICAgICAgICAgICAgICAgICAgaW5uZXJIVE1MOiBgSCR7Y291bnRlcisrICogdGhpcy5vcHRpb25zLnN0ZXB9YCxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M6IFwidGl0bGUtMVwiLFxuICAgICAgICAgICAgICAgICAgICBhcHBlbmRfdG86IHRoaXMubGF5ZXJzLmRhdGUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNyZWF0ZVNWRyhcInRleHRcIiwge1xuICAgICAgICAgICAgICAgIHg6IGRhdGUubG93ZXJfeCxcbiAgICAgICAgICAgICAgICB5OiBkYXRlLmxvd2VyX3kgKyAyMCxcbiAgICAgICAgICAgICAgICBpbm5lckhUTUw6IGRhdGUubG93ZXJfdGV4dCxcbiAgICAgICAgICAgICAgICBjbGFzczogXCJ0aXRsZS0yXCIsXG4gICAgICAgICAgICAgICAgYXBwZW5kX3RvOiB0aGlzLmxheWVycy5kYXRlLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChkYXRlLnVwcGVyX3RleHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCAkdXBwZXJfdGV4dCA9IGNyZWF0ZVNWRyhcInRleHRcIiwge1xuICAgICAgICAgICAgICAgICAgICB4OiBkYXRlLnVwcGVyX3gsXG4gICAgICAgICAgICAgICAgICAgIHk6IGRhdGUudXBwZXJfeSxcbiAgICAgICAgICAgICAgICAgICAgaW5uZXJIVE1MOiBkYXRlLnVwcGVyX3RleHQsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzOiBcInVwcGVyLXRleHRcIixcbiAgICAgICAgICAgICAgICAgICAgYXBwZW5kX3RvOiB0aGlzLmxheWVycy5kYXRlLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIG91dC1vZi1ib3VuZCBkYXRlc1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgJHVwcGVyX3RleHQuZ2V0QkJveCgpLngyID4gdGhpcy5sYXllcnMuZ3JpZC5nZXRCQm94KCkud2lkdGhcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgJHVwcGVyX3RleHQucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRfZGF0ZXNfdG9fZHJhdygpIHtcbiAgICAgICAgbGV0IGxhc3RfZGF0ZTogYW55ID0gbnVsbDtcbiAgICAgICAgY29uc3QgZGF0ZXMgPSB0aGlzLmRhdGVzLm1hcCgoZGF0ZTogYW55LCBpOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGQgPSB0aGlzLmdldF9kYXRlX2luZm8oZGF0ZSwgbGFzdF9kYXRlLCBpKTtcbiAgICAgICAgICAgIGxhc3RfZGF0ZSA9IGRhdGU7XG4gICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBkYXRlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldF9kYXRlX2luZm8oZGF0ZTogRGF0ZSwgbGFzdF9kYXRlOiBEYXRlLCBpOiBhbnkpIHtcbiAgICAgICAgaWYgKCFsYXN0X2RhdGUpIHtcbiAgICAgICAgICAgIGxhc3RfZGF0ZSA9IERhdGVVdGlscy5hZGQoZGF0ZSwgMSwgXCJ5ZWFyXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGVfdGV4dCA9IHtcbiAgICAgICAgICAgIGhvdXJMb3dlcjogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkhIOm1tXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSksXG5cbiAgICAgICAgICAgIHF1YXJ0ZXJEYXlMb3dlcjogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkhIOm1tXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSksXG5cbiAgICAgICAgICAgIGhhbGZEYXlMb3dlcjogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkhIOm1tXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSksXG5cbiAgICAgICAgICAgIGRheUxvd2VyOiBkYXRlLmdldERhdGUoKSAhPT0gbGFzdF9kYXRlLmdldERhdGUoKVxuICAgICAgICAgICAgICAgID8gRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkRcIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKVxuICAgICAgICAgICAgICAgIDogXCJcIixcblxuICAgICAgICAgICAgd2Vla0xvd2VyOiBkYXRlLmdldE1vbnRoKCkgIT09IGxhc3RfZGF0ZS5nZXRNb250aCgpXG4gICAgICAgICAgICAgICAgPyBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiRCBNTU1cIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKVxuICAgICAgICAgICAgICAgIDogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkRcIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKSxcblxuICAgICAgICAgICAgbW9udGhMb3dlcjogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIk1NTU1cIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKSxcblxuICAgICAgICAgICAgeWVhckxvd2VyOiBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiWVlZWVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpLFxuXG4gICAgICAgICAgICBxdWFydGVyRGF5VXBwZXI6IGRhdGUuZ2V0RGF0ZSgpICE9PSBsYXN0X2RhdGUuZ2V0RGF0ZSgpXG4gICAgICAgICAgICAgICAgPyBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiRCBNTU1cIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKVxuICAgICAgICAgICAgICAgIDogXCJcIixcblxuICAgICAgICAgICAgaGFsZkRheVVwcGVyOiBkYXRlLmdldERhdGUoKSAhPT0gbGFzdF9kYXRlLmdldERhdGUoKVxuICAgICAgICAgICAgICAgID8gZGF0ZS5nZXRNb250aCgpICE9PSBsYXN0X2RhdGUuZ2V0TW9udGgoKVxuICAgICAgICAgICAgICAgICAgICA/IERhdGVVdGlscy5mb3JtYXQoZGF0ZSwgXCJEIE1NTVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpXG4gICAgICAgICAgICAgICAgICAgIDogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkRcIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKVxuICAgICAgICAgICAgICAgIDogXCJcIixcblxuICAgICAgICAgICAgZGF5VXBwZXI6IGRhdGUuZ2V0TW9udGgoKSAhPT0gbGFzdF9kYXRlLmdldE1vbnRoKClcbiAgICAgICAgICAgICAgICA/IERhdGVVdGlscy5mb3JtYXQoZGF0ZSwgXCJNTU1NXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSlcbiAgICAgICAgICAgICAgICA6IFwiXCIsXG5cbiAgICAgICAgICAgIHdlZWtVcHBlcjogZGF0ZS5nZXRNb250aCgpICE9PSBsYXN0X2RhdGUuZ2V0TW9udGgoKVxuICAgICAgICAgICAgICAgID8gRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIk1NTU1cIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKVxuICAgICAgICAgICAgICAgIDogXCJcIixcblxuICAgICAgICAgICAgbW9udGhVcHBlcjogZGF0ZS5nZXRGdWxsWWVhcigpICE9PSBsYXN0X2RhdGUuZ2V0RnVsbFllYXIoKVxuICAgICAgICAgICAgICAgID8gRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIllZWVlcIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKVxuICAgICAgICAgICAgICAgIDogXCJcIixcblxuICAgICAgICAgICAgeWVhclVwcGVyOiBkYXRlLmdldEZ1bGxZZWFyKCkgIT09IGxhc3RfZGF0ZS5nZXRGdWxsWWVhcigpXG4gICAgICAgICAgICAgICAgPyBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiWVlZWVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpXG4gICAgICAgICAgICAgICAgOiBcIlwiLFxuXG4gICAgICAgICAgICBob3VyOiBkYXRlLmdldEhvdXJzKCkgIT09IGxhc3RfZGF0ZS5nZXRIb3VycygpXG4gICAgICAgICAgICAgICAgPyBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiSEg6bW1cIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKVxuICAgICAgICAgICAgICAgIDogXCJcIixcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBEZXNjb250YW5kbyAyMCBwYXJhIGFkY2lvbmFyIHVtYSBzZWd1bmRhIGxpbmhhIGRlIGluZm9ybWHDp8OjbyBubyBjYWJlw6dhbGhvXG4gICAgICAgIGNvbnN0IGJhc2VfcG9zID0ge1xuICAgICAgICAgICAgeDogaSAqIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCxcbiAgICAgICAgICAgIGxvd2VyX3k6IHRoaXMub3B0aW9ucy5oZWFkZXJIZWlnaHQgLSAyMCxcbiAgICAgICAgICAgIHVwcGVyX3k6IHRoaXMub3B0aW9ucy5oZWFkZXJIZWlnaHQgLSAyMCAtIDI1LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHhfcG9zID0ge1xuICAgICAgICAgICAgaG91ckxvd2VyOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAyLFxuICAgICAgICAgICAgaG91clVwcGVyOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggKiAyNCAvIDIsXG4gICAgICAgICAgICBxdWFydGVyRGF5TG93ZXI6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDIsXG4gICAgICAgICAgICBxdWFydGVyRGF5VXBwZXI6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAqIDQgLyAyLFxuICAgICAgICAgICAgaGFsZkRheUxvd2VyOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAyLFxuICAgICAgICAgICAgaGFsZkRheVVwcGVyOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggKiAyIC8gMixcbiAgICAgICAgICAgIGRheUxvd2VyOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAyLFxuICAgICAgICAgICAgZGF5VXBwZXI6ICh0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggKiAzMCkgLyAyLFxuICAgICAgICAgICAgd2Vla0xvd2VyOiAwLFxuICAgICAgICAgICAgd2Vla1VwcGVyOiAodGhpcy5vcHRpb25zLmNvbHVtbldpZHRoICogNCkgLyAyLFxuICAgICAgICAgICAgbW9udGhMb3dlcjogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gMixcbiAgICAgICAgICAgIG1vbnRoVXBwZXI6ICh0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggKiAxMikgLyAyLFxuICAgICAgICAgICAgeWVhckxvd2VyOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAyLFxuICAgICAgICAgICAgeWVhclVwcGVyOiAodGhpcy5vcHRpb25zLmNvbHVtbldpZHRoICogMzApIC8gMixcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdXBwZXJfdGV4dDogZGF0ZV90ZXh0W2Ake3RoaXMub3B0aW9ucy52aWV3TW9kZX1VcHBlcmBdLFxuICAgICAgICAgICAgbG93ZXJfdGV4dDogZGF0ZV90ZXh0W2Ake3RoaXMub3B0aW9ucy52aWV3TW9kZX1Mb3dlcmBdLFxuICAgICAgICAgICAgdXBwZXJfeDogYmFzZV9wb3MueCArIHhfcG9zW2Ake3RoaXMub3B0aW9ucy52aWV3TW9kZX1VcHBlcmBdLFxuICAgICAgICAgICAgdXBwZXJfeTogYmFzZV9wb3MudXBwZXJfeSxcbiAgICAgICAgICAgIGxvd2VyX3g6IGJhc2VfcG9zLnggKyB4X3Bvc1tgJHt0aGlzLm9wdGlvbnMudmlld01vZGV9TG93ZXJgXSxcbiAgICAgICAgICAgIGxvd2VyX3k6IGJhc2VfcG9zLmxvd2VyX3ksXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZV9iYXJzKCkge1xuICAgICAgICB0aGlzLmJhcnMgPSB0aGlzLnRhc2tzLm1hcCgodGFzazogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBiYXIgPSBuZXcgQmFyKHRoaXMsIHRhc2spO1xuICAgICAgICAgICAgdGhpcy5sYXllcnMuYmFyLmFwcGVuZENoaWxkKGJhci5ncm91cCk7XG4gICAgICAgICAgICByZXR1cm4gYmFyO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1ha2VfYXJyb3dzKCkge1xuICAgICAgICB0aGlzLmFycm93cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCB0YXNrIG9mIHRoaXMudGFza3MpIHtcbiAgICAgICAgICAgIGxldCBhcnJvd3MgPSBbXTtcbiAgICAgICAgICAgIGFycm93cyA9IHRhc2suZGVwZW5kZW5jaWVzXG4gICAgICAgICAgICAgICAgLm1hcCgodGFza19pZDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcGVuZGVuY3kgPSB0aGlzLmdldF90YXNrKHRhc2tfaWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRlcGVuZGVuY3kpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyb3cgPSBuZXcgQXJyb3coXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXJzW2RlcGVuZGVuY3kuX2luZGV4XSwgLy8gZnJvbV90YXNrXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhcnNbdGFzay5faW5kZXhdIC8vIHRvX3Rhc2tcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXllcnMuYXJyb3cuYXBwZW5kQ2hpbGQoYXJyb3cuZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJvdztcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbik7IC8vIGZpbHRlciBmYWxzeSB2YWx1ZXNcbiAgICAgICAgICAgIHRoaXMuYXJyb3dzID0gdGhpcy5hcnJvd3MuY29uY2F0KGFycm93cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG1hcF9hcnJvd3Nfb25fYmFycygpIHtcbiAgICAgICAgZm9yIChsZXQgYmFyIG9mIHRoaXMuYmFycykge1xuICAgICAgICAgICAgYmFyLmFycm93cyA9IHRoaXMuYXJyb3dzLmZpbHRlcigoYXJyb3c6IEFycm93KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgYXJyb3cuZnJvbVRhc2sudGFzay5pZCA9PT0gYmFyLnRhc2suaWQgfHxcbiAgICAgICAgICAgICAgICAgICAgYXJyb3cudG9UYXNrLnRhc2suaWQgPT09IGJhci50YXNrLmlkXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRfd2lkdGgoKSB7XG4gICAgICAgIGNvbnN0IGN1cl93aWR0aCA9IHRoaXMuJHN2Zy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgY29uc3QgYWN0dWFsX3dpZHRoID0gdGhpcy4kc3ZnXG4gICAgICAgICAgICAucXVlcnlTZWxlY3RvcihcIi5ncmlkIC5ncmlkLXJvd1wiKVxuICAgICAgICAgICAgLmdldEF0dHJpYnV0ZShcIndpZHRoXCIpO1xuICAgICAgICBpZiAoY3VyX3dpZHRoIDwgYWN0dWFsX3dpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLiRzdmcuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgYWN0dWFsX3dpZHRoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0X3Njcm9sbF9wb3NpdGlvbigpIHtcbiAgICAgICAgY29uc3QgcGFyZW50X2VsZW1lbnQgPSB0aGlzLiRzdmcucGFyZW50RWxlbWVudDtcbiAgICAgICAgaWYgKCFwYXJlbnRfZWxlbWVudCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGhvdXJzX2JlZm9yZV9maXJzdF90YXNrID0gRGF0ZVV0aWxzLmRpZmYoXG4gICAgICAgICAgICB0aGlzLmdldF9vbGRlc3Rfc3RhcnRpbmdfZGF0ZSgpLFxuICAgICAgICAgICAgdGhpcy5taW5EYXRlLFxuICAgICAgICAgICAgXCJob3VyXCJcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBzY3JvbGxfcG9zID1cbiAgICAgICAgICAgIChob3Vyc19iZWZvcmVfZmlyc3RfdGFzayAvIHRoaXMub3B0aW9ucy5zdGVwKSAqXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoO1xuXG4gICAgICAgIHBhcmVudF9lbGVtZW50LnNjcm9sbExlZnQgPSBzY3JvbGxfcG9zO1xuICAgIH1cblxuICAgIHByaXZhdGUgYmluZF9ncmlkX2NsaWNrKCkge1xuICAgICAgICAkLm9uKFxuICAgICAgICAgICAgdGhpcy4kc3ZnLFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvcHVwVHJpZ2dlcixcbiAgICAgICAgICAgIFwiLmdyaWQtcm93LCAuZ3JpZC1oZWFkZXJcIixcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVuc2VsZWN0X2FsbCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZV9wb3B1cCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgYmluZF9iYXJfZXZlbnRzKCkge1xuICAgICAgICBsZXQgaXNfZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgbGV0IHhfb25fc3RhcnQgPSAwO1xuICAgICAgICBsZXQgaXNfcmVzaXppbmdfbGVmdCA9IGZhbHNlO1xuICAgICAgICBsZXQgaXNfcmVzaXppbmdfcmlnaHQgPSBmYWxzZTtcbiAgICAgICAgbGV0IHBhcmVudF9iYXJfaWQ6IGFueSA9IG51bGw7XG4gICAgICAgIGxldCBiYXJzOiBCYXJbXSA9IFtdO1xuICAgICAgICB0aGlzLmJhcl9iZWluZ19kcmFnZ2VkID0gbnVsbDtcblxuICAgICAgICBmdW5jdGlvbiBhY3Rpb25faW5fcHJvZ3Jlc3MoKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNfZHJhZ2dpbmcgfHwgaXNfcmVzaXppbmdfbGVmdCB8fCBpc19yZXNpemluZ19yaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgICQub24odGhpcy4kc3ZnLCBcIm1vdXNlZG93blwiLCBcIi5iYXItd3JhcHBlciwgLmhhbmRsZVwiLCAoZTogYW55LCBlbGVtZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJhcl93cmFwcGVyID0gJC5jbG9zZXN0KFwiLmJhci13cmFwcGVyXCIsIGVsZW1lbnQpO1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJsZWZ0XCIpKSB7XG4gICAgICAgICAgICAgICAgaXNfcmVzaXppbmdfbGVmdCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwicmlnaHRcIikpIHtcbiAgICAgICAgICAgICAgICBpc19yZXNpemluZ19yaWdodCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiYmFyLXdyYXBwZXJcIikpIHtcbiAgICAgICAgICAgICAgICBpc19kcmFnZ2luZyA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJhcl93cmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJhY3RpdmVcIik7XG5cbiAgICAgICAgICAgIHhfb25fc3RhcnQgPSBlLm9mZnNldFg7XG5cbiAgICAgICAgICAgIHBhcmVudF9iYXJfaWQgPSBiYXJfd3JhcHBlci5nZXRBdHRyaWJ1dGUoXCJkYXRhLWlkXCIpO1xuICAgICAgICAgICAgY29uc3QgaWRzID0gW1xuICAgICAgICAgICAgICAgIHBhcmVudF9iYXJfaWQsXG4gICAgICAgICAgICAgICAgLi4udGhpcy5nZXRfYWxsX2RlcGVuZGVudF90YXNrcyhwYXJlbnRfYmFyX2lkKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBiYXJzID0gaWRzLm1hcCgoaWQpID0+IHRoaXMuZ2V0X2JhcihpZCkpO1xuXG4gICAgICAgICAgICB0aGlzLmJhcl9iZWluZ19kcmFnZ2VkID0gcGFyZW50X2Jhcl9pZDtcblxuICAgICAgICAgICAgYmFycy5mb3JFYWNoKChiYXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCAkYmFyID0gYmFyLmVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgJGJhci5veCA9ICRiYXIuZ2V0WCgpO1xuICAgICAgICAgICAgICAgICRiYXIub3kgPSAkYmFyLmdldFkoKTtcbiAgICAgICAgICAgICAgICAkYmFyLm93aWR0aCA9ICRiYXIuZ2V0V2lkdGgoKTtcbiAgICAgICAgICAgICAgICAkYmFyLmZpbmFsZHggPSAwO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgICQub24odGhpcy4kc3ZnLCBcIm1vdXNlbW92ZVwiLCAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWFjdGlvbl9pbl9wcm9ncmVzcygpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkeCA9IGUub2Zmc2V0WCAtIHhfb25fc3RhcnQ7XG5cbiAgICAgICAgICAgIGJhcnMuZm9yRWFjaCgoYmFyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgJGJhciA9IGJhci5lbGVtZW50O1xuICAgICAgICAgICAgICAgICRiYXIuZmluYWxkeCA9IHRoaXMuZ2V0X3NuYXBfcG9zaXRpb24oZHgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZV9wb3B1cCgpO1xuICAgICAgICAgICAgICAgIGlmIChpc19yZXNpemluZ19sZWZ0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRfYmFyX2lkID09PSBiYXIudGFzay5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFyLnVwZGF0ZUJhclBvc2l0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiAkYmFyLm94ICsgJGJhci5maW5hbGR4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAkYmFyLm93aWR0aCAtICRiYXIuZmluYWxkeCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFyLnVwZGF0ZUJhclBvc2l0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiAkYmFyLm94ICsgJGJhci5maW5hbGR4LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzX3Jlc2l6aW5nX3JpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRfYmFyX2lkID09PSBiYXIudGFzay5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFyLnVwZGF0ZUJhclBvc2l0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogJGJhci5vd2lkdGggKyAkYmFyLmZpbmFsZHgsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNfZHJhZ2dpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgYmFyLnVwZGF0ZUJhclBvc2l0aW9uKHsgeDogJGJhci5veCArICRiYXIuZmluYWxkeCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgbnVsbCk7XG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzX2RyYWdnaW5nIHx8IGlzX3Jlc2l6aW5nX2xlZnQgfHwgaXNfcmVzaXppbmdfcmlnaHQpIHtcbiAgICAgICAgICAgICAgICBiYXJzLmZvckVhY2goKGJhcikgPT4gYmFyLmdyb3VwLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIikpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpc19kcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgaXNfcmVzaXppbmdfbGVmdCA9IGZhbHNlO1xuICAgICAgICAgICAgaXNfcmVzaXppbmdfcmlnaHQgPSBmYWxzZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgJC5vbih0aGlzLiRzdmcsIFwibW91c2V1cFwiLCAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmJhcl9iZWluZ19kcmFnZ2VkID0gbnVsbDtcbiAgICAgICAgICAgIGJhcnMuZm9yRWFjaCgoYmFyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgJGJhciA9IGJhci5lbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmICghJGJhci5maW5hbGR4KSByZXR1cm47XG4gICAgICAgICAgICAgICAgYmFyLmRhdGVDaGFuZ2VkKCk7XG4gICAgICAgICAgICAgICAgYmFyLnNldEFjdGlvbkNvbXBsZXRlZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIG51bGwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0X2FsbF9kZXBlbmRlbnRfdGFza3ModGFza19pZDogYW55KSB7XG4gICAgICAgIGxldCBvdXQ6IGFueVtdID0gW107XG4gICAgICAgIGxldCB0b19wcm9jZXNzID0gW3Rhc2tfaWRdO1xuICAgICAgICB3aGlsZSAodG9fcHJvY2Vzcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlcHMgPSB0b19wcm9jZXNzLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgYWNjID0gYWNjLmNvbmNhdCh0aGlzLmRlcGVuZGVuY3lfbWFwW2N1cnJdKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgfSwgW10pO1xuXG4gICAgICAgICAgICBvdXQgPSBvdXQuY29uY2F0KGRlcHMpO1xuICAgICAgICAgICAgdG9fcHJvY2VzcyA9IGRlcHMuZmlsdGVyKChkOiBhbnkpID0+ICF0b19wcm9jZXNzLmluY2x1ZGVzKGQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXQuZmlsdGVyKEJvb2xlYW4pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0X3NuYXBfcG9zaXRpb24oZHg6IGFueSkge1xuICAgICAgICBsZXQgb2R4ID0gZHgsXG4gICAgICAgICAgICByZW0sXG4gICAgICAgICAgICBwb3NpdGlvbjtcblxuICAgICAgICBpZiAodGhpcy52aWV3X2lzKFZpZXdNb2RlLkhvdXIpKSB7XG4gICAgICAgICAgICByZW0gPSBkeCAlICh0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyA2KTtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gb2R4IC0gcmVtICsgKHJlbSA8IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDEyID8gMCA6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDYpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudmlld19pcyhWaWV3TW9kZS5XZWVrKSkge1xuICAgICAgICAgICAgcmVtID0gZHggJSAodGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gNyk7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IG9keCAtIHJlbSArIChyZW0gPCB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAxNCA/IDAgOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyA3KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZpZXdfaXMoVmlld01vZGUuTW9udGgpKSB7XG4gICAgICAgICAgICByZW0gPSBkeCAlICh0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAzMCk7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IG9keCAtIHJlbSArIChyZW0gPCB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyA2MCA/IDAgOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAzMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZW0gPSBkeCAlIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aDtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gb2R4IC0gcmVtICsgKHJlbSA8IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDIgPyAwIDogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG9zaXRpb247XG4gICAgfVxuXG4gICAgcHVibGljIHVuc2VsZWN0X2FsbCgpIHtcbiAgICAgICAgWy4uLnRoaXMuJHN2Zy5xdWVyeVNlbGVjdG9yQWxsKFwiLmJhci13cmFwcGVyXCIpXS5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHZpZXdfaXMobW9kZXM6IFZpZXdNb2RlIHwgVmlld01vZGVbXSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtb2RlcykpIHtcbiAgICAgICAgICAgIHJldHVybiBtb2Rlcy5zb21lKChtb2RlKSA9PiB0aGlzLm9wdGlvbnMudmlld01vZGUgPT09IG1vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy52aWV3TW9kZSA9PT0gbW9kZXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRfdGFzayhpZDogYW55KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhc2tzLmZpbmQoKHRhc2s6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRhc2suaWQgPT09IGlkO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0X2JhcihpZDogYW55KTogQmFyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFycy5maW5kKChiYXI6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGJhci50YXNrLmlkID09PSBpZDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNob3dfcG9wdXAob3B0aW9uczogYW55KSB7XG4gICAgICAgIGlmICghdGhpcy5wb3B1cCkge1xuICAgICAgICAgICAgdGhpcy5wb3B1cCA9IG5ldyBQb3B1cChcbiAgICAgICAgICAgICAgICB0aGlzLnBvcHVwX3dyYXBwZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmN1c3RvbVBvcHVwSHRtbFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBvcHVwLnNob3cob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoaWRlX3BvcHVwKCkge1xuICAgICAgICB0aGlzLnBvcHVwICYmIHRoaXMucG9wdXAuaGlkZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0cmlnZ2VyX2V2ZW50KGV2ZW50OiBzdHJpbmcsIGFyZ3M6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zW2V2ZW50XSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zW2V2ZW50XS5hcHBseShudWxsLCBhcmdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0X29sZGVzdF9zdGFydGluZ19kYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YXNrc1xuICAgICAgICAgICAgLm1hcCgodGFzazogYW55KSA9PiB0YXNrLl9zdGFydClcbiAgICAgICAgICAgIC5yZWR1Y2UoKHByZXZfZGF0ZTogYW55LCBjdXJfZGF0ZTogYW55KSA9PlxuICAgICAgICAgICAgICAgIGN1cl9kYXRlIDw9IHByZXZfZGF0ZSA/IGN1cl9kYXRlIDogcHJldl9kYXRlXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuJHN2Zy5pbm5lckhUTUwgPSAnJztcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlX2lkKHRhc2s6IGFueSkge1xuICAgIHJldHVybiB0YXNrLm5hbWUgKyBcIl9cIiArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDEyKTtcbn1cbiJdfQ==
808
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FudHQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzLyIsInNvdXJjZXMiOlsiY29tcG9uZW50cy9nYW50dC9jb21wb25lbnRzL2dhbnR0L2dhbnR0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDNUIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHbEQsTUFBTSxPQUFPLEtBQUs7SUEwQmQsWUFBWSxPQUFZLEVBQUUsS0FBYSxFQUFFLE9BQWlCO1FBQ3RELElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLG9DQUFvQztRQUNwQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQWZELElBQVcsT0FBTztRQUNkLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3pCLENBQUM7SUFXTyxhQUFhLENBQUMsT0FBWTtRQUM5QixJQUFJLFdBQVcsRUFBRSxlQUFlLENB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QUFDLEVBQU87UUFDN0IsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUNSLEdBQUcsRUFDSCxRQUFRLENBQUM7UUFFYixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzdCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxQyxRQUFRLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDbkc7YUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3BDLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxQyxRQUFRLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDbkc7YUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3JDLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUMzQyxRQUFRLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENB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RyxFQUFFLENBQUM7SUFDN0IsQ0FBQztDQUNKO0FBRUQsU0FBUyxXQUFXLENBQUMsSUFBUztJQUMxQixPQUFPLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0ZVV0aWxzIH0gZnJvbSBcIi4vdXRpbHMvZGF0ZS11dGlsc1wiO1xuaW1wb3J0IHsgJCwgY3JlYXRlU1ZHIH0gZnJvbSBcIi4vdXRpbHMvc3ZnLXV0aWxzXCI7XG5pbXBvcnQgeyBCYXIgfSBmcm9tIFwiLi9iYXJcIjtcbmltcG9ydCB7IFBvcHVwIH0gZnJvbSBcIi4vcG9wdXBcIjtcbmltcG9ydCB7IEFycm93IH0gZnJvbSBcIi4vYXJyb3dcIjtcbmltcG9ydCB7IE9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL29wdGlvbnNcIjtcbmltcG9ydCB7IGRlZmF1bHRPcHRpb25zIH0gZnJvbSBcIi4vZ2FudHQtb3B0aW9uc1wiO1xuaW1wb3J0IHsgVmlld01vZGUgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3ZpZXctbW9kZVwiO1xuaW1wb3J0IHsgVGFzaywgRW5yaWNoZWRUYXNrIH0gZnJvbSBcIi4uLy4uL21vZGVsc1wiO1xuXG5leHBvcnQgY2xhc3MgR2FudHQge1xuICAgIHB1YmxpYyBvcHRpb25zOiBPcHRpb25zO1xuICAgIHB1YmxpYyB0YXNrczogRW5yaWNoZWRUYXNrW107XG4gICAgcHVibGljIGRlcGVuZGVuY3lfbWFwOiBhbnk7XG5cbiAgICBwcml2YXRlIF9taW5EYXRlOiBEYXRlO1xuICAgIHByaXZhdGUgX21heERhdGU6IERhdGU7XG5cbiAgICBwdWJsaWMgZGF0ZXM6IERhdGVbXTtcbiAgICBwdWJsaWMgbGF5ZXJzOiBhbnk7XG4gICAgcHVibGljIGJhcnM6IEJhcltdO1xuICAgIHB1YmxpYyBhcnJvd3M6IEFycm93W107XG4gICAgcHVibGljIGJhcl9iZWluZ19kcmFnZ2VkOiBhbnk7XG4gICAgcHVibGljICRzdmc6IGFueTtcbiAgICBwdWJsaWMgJGNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQ7XG4gICAgcHVibGljIHBvcHVwX3dyYXBwZXI6IEhUTUxEaXZFbGVtZW50O1xuICAgIHB1YmxpYyBwb3B1cDogYW55O1xuXG4gICAgcHVibGljIGdldCBtaW5EYXRlKCk6IERhdGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWluRGF0ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1heERhdGUoKTogRGF0ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXhEYXRlO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHdyYXBwZXI6IGFueSwgdGFza3M6IFRhc2tbXSwgb3B0aW9ucz86IE9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zZXR1cF9vcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnNldHVwX3dyYXBwZXIod3JhcHBlcik7XG4gICAgICAgIHRoaXMuc2V0dXBfdGFza3ModGFza3MpO1xuICAgICAgICAvLyBpbml0aWFsaXplIHdpdGggZGVmYXVsdCB2aWV3IG1vZGVcbiAgICAgICAgdGhpcy5jaGFuZ2Vfdmlld19tb2RlKCk7XG4gICAgICAgIHRoaXMuYmluZF9ldmVudHMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwX3dyYXBwZXIoZWxlbWVudDogYW55KSB7XG4gICAgICAgIGxldCBzdmdfZWxlbWVudCwgd3JhcHBlcl9lbGVtZW50O1xuXG4gICAgICAgIC8vIENTUyBTZWxlY3RvciBpcyBwYXNzZWRcbiAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGdldCB0aGUgU1ZHRWxlbWVudFxuICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgICB3cmFwcGVyX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICAgICAgc3ZnX2VsZW1lbnQgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCJzdmdcIik7XG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpIHtcbiAgICAgICAgICAgIHN2Z19lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJGcmFwcMOpIEdhbnR0IG9ubHkgc3VwcG9ydHMgdXNhZ2Ugb2YgYSBzdHJpbmcgQ1NTIHNlbGVjdG9yLCBIVE1MIERPTSBlbGVtZW50IG9yIFNWRyBET00gZWxlbWVudCBmb3IgdGhlIFxcJ2VsZW1lbnRcXCcgcGFyYW1ldGVyXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdmcgZWxlbWVudFxuICAgICAgICBpZiAoIXN2Z19lbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgaXRcbiAgICAgICAgICAgIHRoaXMuJHN2ZyA9IGNyZWF0ZVNWRyhcInN2Z1wiLCB7XG4gICAgICAgICAgICAgICAgYXBwZW5kX3RvOiB3cmFwcGVyX2VsZW1lbnQsXG4gICAgICAgICAgICAgICAgY2xhc3M6IFwiZ2FudHRcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4kc3ZnID0gc3ZnX2VsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLiRzdmcuY2xhc3NMaXN0LmFkZChcImdhbnR0XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd3JhcHBlciBlbGVtZW50XG4gICAgICAgIHRoaXMuJGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuJGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiZ2FudHQtY29udGFpbmVyXCIpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbnRhaW5lcldpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLiRjb250YWluZXIuc3R5bGUud2lkdGggPSB0aGlzLm9wdGlvbnMuY29udGFpbmVyV2lkdGggKyAncHgnO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyZW50X2VsZW1lbnQgPSB0aGlzLiRzdmcucGFyZW50RWxlbWVudDtcbiAgICAgICAgcGFyZW50X2VsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy4kY29udGFpbmVyKTtcbiAgICAgICAgdGhpcy4kY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuJHN2Zyk7XG5cbiAgICAgICAgLy8gcG9wdXAgd3JhcHBlclxuICAgICAgICB0aGlzLnBvcHVwX3dyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLnBvcHVwX3dyYXBwZXIuY2xhc3NMaXN0LmFkZChcInBvcHVwLXdyYXBwZXJcIik7XG4gICAgICAgIHRoaXMuJGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnBvcHVwX3dyYXBwZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBfb3B0aW9ucyhvcHRpb25zOiBhbnkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXR1cF90YXNrcyh0YXNrczogYW55KSB7XG4gICAgICAgIC8vIHByZXBhcmUgdGFza3NcbiAgICAgICAgdGhpcy50YXNrcyA9IHRhc2tzLm1hcCgodGFzazogYW55LCBpOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vc3RhbmRhcmQgY29sb3JzIGlmIG5lZWRlZFxuICAgICAgICAgICAgdGFzay5jb2xvciA9IHRhc2suY29sb3IgfHwgJyM3ODkyQTEnO1xuXG4gICAgICAgICAgICAvLyBjb252ZXJ0IHRvIERhdGUgb2JqZWN0c1xuICAgICAgICAgICAgdGFzay5fc3RhcnQgPSBEYXRlVXRpbHMucGFyc2UodGFzay5zdGFydCk7XG4gICAgICAgICAgICB0YXNrLl9lbmQgPSBEYXRlVXRpbHMucGFyc2UodGFzay5lbmQpO1xuXG4gICAgICAgICAgICAvLyBtYWtlIHRhc2sgaW52YWxpZCBpZiBkdXJhdGlvbiB0b28gbGFyZ2VcbiAgICAgICAgICAgIGlmIChEYXRlVXRpbHMuZGlmZih0YXNrLl9lbmQsIHRhc2suX3N0YXJ0LCBcInllYXJcIikgPiAxMCkge1xuICAgICAgICAgICAgICAgIHRhc2suZW5kID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2FjaGUgaW5kZXhcbiAgICAgICAgICAgIHRhc2suX2luZGV4ID0gaTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0YXNrLl9yb3dfaWQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICB0YXNrLl9pbmRleCA9IHRhc2suX3Jvd19pZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaW52YWxpZCBkYXRlc1xuICAgICAgICAgICAgaWYgKCF0YXNrLnN0YXJ0ICYmICF0YXNrLmVuZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvZGF5ID0gRGF0ZVV0aWxzLnRvZGF5KCk7XG4gICAgICAgICAgICAgICAgdGFzay5fc3RhcnQgPSB0b2RheTtcbiAgICAgICAgICAgICAgICB0YXNrLl9lbmQgPSBEYXRlVXRpbHMuYWRkKHRvZGF5LCAyLCBcImRheVwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0YXNrLnN0YXJ0ICYmIHRhc2suZW5kKSB7XG4gICAgICAgICAgICAgICAgdGFzay5fc3RhcnQgPSBEYXRlVXRpbHMuYWRkKHRhc2suX2VuZCwgLTIsICdkYXknKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRhc2suc3RhcnQgJiYgIXRhc2suZW5kKSB7XG4gICAgICAgICAgICAgICAgdGFzay5fZW5kID0gRGF0ZVV0aWxzLmFkZCh0YXNrLl9zdGFydCwgMiwgXCJkYXlcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIGhvdXJzIGlzIG5vdCBzZXQsIGFzc3VtZSB0aGUgbGFzdCBkYXkgaXMgZnVsbCBkYXlcbiAgICAgICAgICAgIC8vIGUuZzogMjAxOC0wOS0wOSBiZWNvbWVzIDIwMTgtMDktMDkgMjM6NTk6NTlcbiAgICAgICAgICAgIGNvbnN0IHRhc2tfZW5kX3ZhbHVlcyA9IERhdGVVdGlscy5nZXREYXRlVmFsdWVzKHRhc2suX2VuZCk7XG4gICAgICAgICAgICBpZiAodGFza19lbmRfdmFsdWVzLnNsaWNlKDMpLmV2ZXJ5KChkKSA9PiBkID09PSAwKSkge1xuICAgICAgICAgICAgICAgIHRhc2suX2VuZCA9IERhdGVVdGlscy5hZGQodGFzay5fZW5kLCAyNCwgXCJob3VyXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpbnZhbGlkIGZsYWdcbiAgICAgICAgICAgIGlmICghdGFzay5zdGFydCB8fCAhdGFzay5lbmQpIHtcbiAgICAgICAgICAgICAgICB0YXNrLmludmFsaWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBkZXBlbmRlbmNpZXNcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGFzay5kZXBlbmRlbmNpZXMgPT09IFwic3RyaW5nXCIgfHwgIXRhc2suZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRlcHMgPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAodGFzay5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVwcyA9IHRhc2suZGVwZW5kZW5jaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoZDogYW55KSA9PiBkLnRyaW0oKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGQ6IGFueSkgPT4gZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRhc2suZGVwZW5kZW5jaWVzID0gZGVwcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdWlkc1xuICAgICAgICAgICAgaWYgKCF0YXNrLmlkKSB7XG4gICAgICAgICAgICAgICAgdGFzay5pZCA9IGdlbmVyYXRlX2lkKHRhc2spO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGFzaztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zZXR1cF9kZXBlbmRlbmNpZXMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwX2RlcGVuZGVuY2llcygpIHtcbiAgICAgICAgdGhpcy5kZXBlbmRlbmN5X21hcCA9IHt9O1xuICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMudGFza3MpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGQgb2YgdC5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlcGVuZGVuY3lfbWFwW2RdID0gdGhpcy5kZXBlbmRlbmN5X21hcFtkXSB8fCBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlcGVuZGVuY3lfbWFwW2RdLnB1c2godC5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVmcmVzaCh0YXNrczogVGFza1tdKSB7XG4gICAgICAgIHRoaXMuc2V0dXBfdGFza3ModGFza3MpO1xuICAgICAgICB0aGlzLmNoYW5nZV92aWV3X21vZGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2hhbmdlX3ZpZXdfbW9kZShtb2RlID0gdGhpcy5vcHRpb25zLnZpZXdNb2RlKSB7XG4gICAgICAgIHRoaXMuc2V0dXBfZ2FudHRfZGF0ZXMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVfdmlld19zY2FsZShtb2RlKTtcbiAgICAgICAgdGhpcy5zZXR1cF9kYXRlcygpO1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICAvLyBmaXJlIHZpZXdtb2RlX2NoYW5nZSBldmVudFxuICAgICAgICB0aGlzLnRyaWdnZXJfZXZlbnQoXCJvblZpZXdDaGFuZ2VcIiwgW21vZGVdKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZV92aWV3X3NjYWxlKHZpZXdfbW9kZTogYW55KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy52aWV3TW9kZSA9IHZpZXdfbW9kZTtcbiAgICAgICAgLy8gdGhpcy5pc0hvdXJWaWV3ID0gZmFsc2U7XG4gICAgICAgIGlmICh2aWV3X21vZGUgPT09IFZpZXdNb2RlLlF1YXJ0ZXJIb3VyKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3RlcCA9IDI0IC8gMjQgLyA0O1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoID0gNTA7XG4gICAgICAgIH0gZWxzZSBpZiAodmlld19tb2RlID09PSBWaWV3TW9kZS5Ib3VyKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3RlcCA9IDI0IC8gMjQ7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggPSA1MDtcbiAgICAgICAgfSBlbHNlIGlmICh2aWV3X21vZGUgPT09IFZpZXdNb2RlLkRheSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnN0ZXAgPSAyNDtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCA9IDUwO1xuICAgICAgICB9IGVsc2UgaWYgKHZpZXdfbW9kZSA9PT0gVmlld01vZGUuSGFsZkRheSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnN0ZXAgPSAyNCAvIDI7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggPSA1MDtcbiAgICAgICAgfSBlbHNlIGlmICh2aWV3X21vZGUgPT09IFZpZXdNb2RlLlF1YXJ0ZXJEYXkpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zdGVwID0gMjQgLyA0O1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoID0gNTA7XG4gICAgICAgIH0gZWxzZSBpZiAodmlld19tb2RlID09PSBWaWV3TW9kZS5XZWVrKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3RlcCA9IDI0ICogNztcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCA9IDE0MDtcbiAgICAgICAgfSBlbHNlIGlmICh2aWV3X21vZGUgPT09IFZpZXdNb2RlLk1vbnRoKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3RlcCA9IDI0ICogMzA7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggPSAxMjA7XG4gICAgICAgIH0gZWxzZSBpZiAodmlld19tb2RlID09PSBWaWV3TW9kZS5ZZWFyKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3RlcCA9IDI0ICogMzY1O1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoID0gMTIwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXR1cF9kYXRlcygpIHtcbiAgICAgICAgdGhpcy5zZXR1cF9kYXRlX3ZhbHVlcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBfZ2FudHRfZGF0ZXMoKSB7XG4gICAgICAgIHRoaXMuX21pbkRhdGUgPSBudWxsO1xuICAgICAgICB0aGlzLl9tYXhEYXRlID0gbnVsbDtcblxuICAgICAgICBmb3IgKGxldCB0YXNrIG9mIHRoaXMudGFza3MpIHtcbiAgICAgICAgICAgIC8vIHNldCBnbG9iYWwgc3RhcnQgYW5kIGVuZCBkYXRlXG4gICAgICAgICAgICBpZiAoIXRoaXMubWluRGF0ZSB8fCB0YXNrLnN0YXJ0IDwgdGhpcy5taW5EYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluRGF0ZSA9IERhdGVVdGlscy5zdGFydE9mKHRhc2suc3RhcnQsICdkYXknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5tYXhEYXRlIHx8IHRhc2suZW5kID4gdGhpcy5tYXhEYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4RGF0ZSA9IHRhc2suZW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLm9wdGlvbnMudmlld01vZGUpIHtcbiAgICAgICAgICAgIGNhc2UgVmlld01vZGUuUXVhcnRlckhvdXI6XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluRGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5taW5EYXRlLCAtKHRoaXMub3B0aW9ucy5tYXJnaW5CZWZvcmVTdGFydCA/PyAxNSksIFwibWludXRlc1wiKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhEYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1heERhdGUsIHRoaXMub3B0aW9ucy5tYXJnaW5BZnRlckVuZCA/PyAxNSwgXCJtaW51dGVzXCIpO1xuICAgICAgICAgICAgY2FzZSBWaWV3TW9kZS5Ib3VyOlxuICAgICAgICAgICAgICAgIHRoaXMuX21pbkRhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWluRGF0ZSwgLSh0aGlzLm9wdGlvbnMubWFyZ2luQmVmb3JlU3RhcnQgPz8gMSksIFwiaG91clwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhEYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1heERhdGUsIHRoaXMub3B0aW9ucy5tYXJnaW5BZnRlckVuZCA/PyAxLCBcImhvdXJcIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFZpZXdNb2RlLlF1YXJ0ZXJEYXk6XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluRGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5taW5EYXRlLCAtKHRoaXMub3B0aW9ucy5tYXJnaW5CZWZvcmVTdGFydCA/PyA2KSwgXCJob3VyXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21heERhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWF4RGF0ZSwgdGhpcy5vcHRpb25zLm1hcmdpbkFmdGVyRW5kID8/IDYsIFwiaG91clwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVmlld01vZGUuSGFsZkRheTpcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5EYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1pbkRhdGUsIC0odGhpcy5vcHRpb25zLm1hcmdpbkJlZm9yZVN0YXJ0ID8/IDEyKSwgXCJob3VyXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21heERhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWF4RGF0ZSwgdGhpcy5vcHRpb25zLm1hcmdpbkFmdGVyRW5kID8/IDEyLCBcImhvdXJcIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFZpZXdNb2RlLkRheTpcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5EYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1pbkRhdGUsIC0odGhpcy5vcHRpb25zLm1hcmdpbkJlZm9yZVN0YXJ0ID8/IDEpLCBcImRheVwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhEYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1heERhdGUsIHRoaXMub3B0aW9ucy5tYXJnaW5BZnRlckVuZCA/PyAxLCBcImRheVwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVmlld01vZGUuV2VlazpcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5EYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1pbkRhdGUsIC0odGhpcy5vcHRpb25zLm1hcmdpbkJlZm9yZVN0YXJ0ID8/IDEpLCBcIndlZWtcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4RGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5tYXhEYXRlLCB0aGlzLm9wdGlvbnMubWFyZ2luQWZ0ZXJFbmQgPz8gMSwgXCJ3ZWVrXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBWaWV3TW9kZS5Nb250aDpcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5EYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1pbkRhdGUsIC0odGhpcy5vcHRpb25zLm1hcmdpbkJlZm9yZVN0YXJ0ID8/IDEpLCBcIm1vbnRoXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21heERhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWF4RGF0ZSwgdGhpcy5vcHRpb25zLm1hcmdpbkFmdGVyRW5kID8/IDEsIFwibW9udGhcIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFZpZXdNb2RlLlllYXI6XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluRGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5taW5EYXRlLCAtKHRoaXMub3B0aW9ucy5tYXJnaW5CZWZvcmVTdGFydCA/PyAxKSwgXCJ5ZWFyXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21heERhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWF4RGF0ZSwgdGhpcy5vcHRpb25zLm1hcmdpbkFmdGVyRW5kID8/IDEsIFwieWVhclwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBfZGF0ZV92YWx1ZXMoKSB7XG4gICAgICAgIHRoaXMuZGF0ZXMgPSBbXTtcbiAgICAgICAgbGV0IGN1cl9kYXRlID0gbnVsbDtcblxuICAgICAgICB3aGlsZSAoY3VyX2RhdGUgPT09IG51bGwgfHwgY3VyX2RhdGUgPCB0aGlzLm1heERhdGUpIHtcbiAgICAgICAgICAgIGlmICghY3VyX2RhdGUpIHtcbiAgICAgICAgICAgICAgICBjdXJfZGF0ZSA9IERhdGVVdGlscy5jbG9uZSh0aGlzLm1pbkRhdGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy52aWV3X2lzKFZpZXdNb2RlLlllYXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cl9kYXRlID0gRGF0ZVV0aWxzLmFkZChjdXJfZGF0ZSwgMSwgXCJ5ZWFyXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy52aWV3X2lzKFZpZXdNb2RlLk1vbnRoKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJfZGF0ZSA9IERhdGVVdGlscy5hZGQoY3VyX2RhdGUsIDEsIFwibW9udGhcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyX2RhdGUgPSBEYXRlVXRpbHMuYWRkKFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3RlcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICdob3VyJ1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGF0ZXMucHVzaChjdXJfZGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbnRhaW5lcldpZHRoKSB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW5XaWR0aCA9ICh0aGlzLm9wdGlvbnMuY29udGFpbmVyV2lkdGggLSAxKSAvIHRoaXMuZGF0ZXMubGVuZ3RoXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggPSBjb2x1bW5XaWR0aCA8IDQ1ID8gNDUgOiBjb2x1bW5XaWR0aDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYmluZF9ldmVudHMoKSB7XG4gICAgICAgIHRoaXMuYmluZF9ncmlkX2NsaWNrKCk7XG4gICAgICAgIHRoaXMuYmluZF9iYXJfZXZlbnRzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW5kZXIoKSB7XG4gICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5zZXR1cF9sYXllcnMoKTtcbiAgICAgICAgdGhpcy5tYWtlX2dyaWQoKTtcbiAgICAgICAgdGhpcy5tYWtlX2RhdGVzKCk7XG4gICAgICAgIHRoaXMubWFrZV9iYXJzKCk7XG4gICAgICAgIHRoaXMubWFrZV9hcnJvd3MoKTtcbiAgICAgICAgdGhpcy5tYXBfYXJyb3dzX29uX2JhcnMoKTtcbiAgICAgICAgdGhpcy5zZXRfd2lkdGgoKTtcbiAgICAgICAgdGhpcy5zZXRfc2Nyb2xsX3Bvc2l0aW9uKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXR1cF9sYXllcnMoKSB7XG4gICAgICAgIHRoaXMubGF5ZXJzID0ge307XG4gICAgICAgIGNvbnN0IGxheWVycyA9IFtcImdyaWRcIiwgXCJkYXRlXCIsIFwiYXJyb3dcIiwgXCJwcm9ncmVzc1wiLCBcImJhclwiLCBcImRldGFpbHNcIl07XG4gICAgICAgIC8vIG1ha2UgZ3JvdXAgbGF5ZXJzXG4gICAgICAgIGZvciAobGV0IGxheWVyIG9mIGxheWVycykge1xuICAgICAgICAgICAgdGhpcy5sYXllcnNbbGF5ZXJdID0gY3JlYXRlU1ZHKCdnJywge1xuICAgICAgICAgICAgICAgIGNsYXNzOiBsYXllcixcbiAgICAgICAgICAgICAgICBhcHBlbmRfdG86IHRoaXMuJHN2ZyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYWtlX2dyaWQoKSB7XG4gICAgICAgIHRoaXMubWFrZV9ncmlkX2JhY2tncm91bmQoKTtcbiAgICAgICAgdGhpcy5tYWtlX2dyaWRfcm93cygpO1xuICAgICAgICB0aGlzLm1ha2VfZ3JpZF9oZWFkZXIoKTtcbiAgICAgICAgdGhpcy5tYWtlX2dyaWRfaGlnaGxpZ2h0cygpO1xuICAgICAgICB0aGlzLm1ha2VfZ3JpZF90aWNrcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZV9ncmlkX2JhY2tncm91bmQoKSB7XG4gICAgICAgIGxldCBncmlkX3dpZHRoID0gdGhpcy5kYXRlcy5sZW5ndGggKiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGg7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb250YWluZXJXaWR0aCkge1xuICAgICAgICAgICAgZ3JpZF93aWR0aCA9IHRoaXMub3B0aW9ucy5jb250YWluZXJXaWR0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRpc3RpbmN0X3Jvd3MgPSBbLi4ubmV3IFNldCh0aGlzLnRhc2tzLm1hcCgoeDogYW55KSA9PiB4Ll9yb3dfaWQpKV07XG4gICAgICAgIGNvbnN0IGdyaWRfaGVpZ2h0ID0gdGhpcy5vcHRpb25zLmhlYWRlckhlaWdodCArXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucGFkZGluZyAvIDIgK1xuICAgICAgICAgICAgKHRoaXMub3B0aW9ucy5iYXJIZWlnaHQgKyB0aGlzLm9wdGlvbnMucGFkZGluZykgKlxuICAgICAgICAgICAgZGlzdGluY3Rfcm93cy5sZW5ndGg7XG5cbiAgICAgICAgY3JlYXRlU1ZHKFwicmVjdFwiLCB7XG4gICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgeTogMCxcbiAgICAgICAgICAgIHdpZHRoOiBncmlkX3dpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBncmlkX2hlaWdodCxcbiAgICAgICAgICAgIGNsYXNzOiBcImdyaWQtYmFja2dyb3VuZFwiLFxuICAgICAgICAgICAgYXBwZW5kX3RvOiB0aGlzLmxheWVycy5ncmlkLFxuICAgICAgICB9KTtcblxuICAgICAgICAkLmF0dHIodGhpcy4kc3ZnLCB7XG4gICAgICAgICAgICBoZWlnaHQ6IGdyaWRfaGVpZ2h0LFxuICAgICAgICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgICB9LCBudWxsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1ha2VfZ3JpZF9yb3dzKCkge1xuICAgICAgICBjb25zdCByb3dzX2xheWVyID0gY3JlYXRlU1ZHKFwiZ1wiLCB7IGFwcGVuZF90bzogdGhpcy5sYXllcnMuZ3JpZCB9KTtcbiAgICAgICAgY29uc3QgbGluZXNfbGF5ZXIgPSBjcmVhdGVTVkcoXCJnXCIsIHsgYXBwZW5kX3RvOiB0aGlzLmxheWVycy5ncmlkIH0pO1xuXG4gICAgICAgIGNvbnN0IHJvd193aWR0aCA9IHRoaXMuZGF0ZXMubGVuZ3RoICogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoO1xuICAgICAgICBjb25zdCByb3dfaGVpZ2h0ID0gdGhpcy5vcHRpb25zLmJhckhlaWdodCArIHRoaXMub3B0aW9ucy5wYWRkaW5nO1xuICAgICAgICAvL1RPRE86ICBhanVzdGFyIG8gcG9zaWNpb25hbWVudG8gZGFzIGxpbmhhc1xuICAgICAgICBsZXQgcm93X3kgPSB0aGlzLm9wdGlvbnMuaGVhZGVySGVpZ2h0ICsgdGhpcy5vcHRpb25zLnBhZGRpbmcgLyAyO1xuXG4gICAgICAgIHRoaXMudGFza3MuZm9yRWFjaChfID0+IHtcbiAgICAgICAgICAgIGNyZWF0ZVNWRyhcInJlY3RcIiwge1xuICAgICAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICAgICAgeTogcm93X3ksXG4gICAgICAgICAgICAgICAgd2lkdGg6IHJvd193aWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHJvd19oZWlnaHQsXG4gICAgICAgICAgICAgICAgY2xhc3M6IFwiZ3JpZC1yb3dcIixcbiAgICAgICAgICAgICAgICBhcHBlbmRfdG86IHJvd3NfbGF5ZXIsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY3JlYXRlU1ZHKFwibGluZVwiLCB7XG4gICAgICAgICAgICAgICAgeDE6IDAsXG4gICAgICAgICAgICAgICAgeTE6IHJvd195ICsgcm93X2hlaWdodCxcbiAgICAgICAgICAgICAgICB4Mjogcm93X3dpZHRoLFxuICAgICAgICAgICAgICAgIHkyOiByb3dfeSArIHJvd19oZWlnaHQsXG4gICAgICAgICAgICAgICAgY2xhc3M6IFwicm93LWxpbmVcIixcbiAgICAgICAgICAgICAgICBhcHBlbmRfdG86IGxpbmVzX2xheWVyLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJvd195ICs9IHRoaXMub3B0aW9ucy5iYXJIZWlnaHQgKyB0aGlzLm9wdGlvbnMucGFkZGluZztcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYWtlX2dyaWRfaGVhZGVyKCkge1xuICAgICAgICAvLyBjb25zdCBhZGRJc0hvdXJWaWV3ID0gdGhpcy5pc0hvdXJWaWV3ID8gMjUgOiAxMFxuICAgICAgICBjb25zdCBoZWFkZXJfd2lkdGggPSB0aGlzLmRhdGVzLmxlbmd0aCAqIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aDtcbiAgICAgICAgY29uc3QgaGVhZGVyX2hlaWdodCA9IHRoaXMub3B0aW9ucy5oZWFkZXJIZWlnaHQgKyAxMDtcbiAgICAgICAgY3JlYXRlU1ZHKFwicmVjdFwiLCB7XG4gICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgeTogMCxcbiAgICAgICAgICAgIHdpZHRoOiBoZWFkZXJfd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGhlYWRlcl9oZWlnaHQsXG4gICAgICAgICAgICBjbGFzczogXCJncmlkLWhlYWRlclwiLFxuICAgICAgICAgICAgYXBwZW5kX3RvOiB0aGlzLmxheWVycy5ncmlkLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1ha2VfZ3JpZF90aWNrcygpIHtcbiAgICAgICAgbGV0IHRpY2tfeCA9IDA7XG4gICAgICAgIGxldCB0aWNrX3kgPSB0aGlzLm9wdGlvbnMuaGVhZGVySGVpZ2h0ICsgdGhpcy5vcHRpb25zLnBhZGRpbmcgLyAyO1xuICAgICAgICBsZXQgdGlja19oZWlnaHQgPVxuICAgICAgICAgICAgKHRoaXMub3B0aW9ucy5iYXJIZWlnaHQgKyB0aGlzLm9wdGlvbnMucGFkZGluZykgKlxuICAgICAgICAgICAgdGhpcy50YXNrcy5sZW5ndGg7XG5cbiAgICAgICAgZm9yIChsZXQgZGF0ZSBvZiB0aGlzLmRhdGVzKSB7XG4gICAgICAgICAgICBsZXQgdGlja19jbGFzcyA9IFwidGlja1wiO1xuXG4gICAgICAgICAgICBpZiAodGhpcy52aWV3X2lzKFZpZXdNb2RlLlF1YXJ0ZXJIb3VyKSAmJiBkYXRlLmdldEhvdXJzKCkgPT09IDAgJiYgZGF0ZS5nZXRNaW51dGVzKCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyB0aGljayB0aWNrIGZvciBmaXJzdCBob3VyIG9mIGRheS5cbiAgICAgICAgICAgICAgICB0aWNrX2NsYXNzICs9IFwiIHRoaWNrXCI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudmlld19pcyhbVmlld01vZGUuSG91ciwgVmlld01vZGUuUXVhcnRlckRheSwgVmlld01vZGUuSGFsZkRheV0pICYmIGRhdGUuZ2V0SG91cnMoKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIHRoaWNrIHRpY2sgZm9yIGZpcnN0IGhvdXIgb2YgZGF5LlxuICAgICAgICAgICAgICAgIHRpY2tfY2xhc3MgKz0gXCIgdGhpY2tcIjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy52aWV3X2lzKFZpZXdNb2RlLkRheSkgJiYgZGF0ZS5nZXREYXRlKCkgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAvLyB0aGljayB0aWNrIGZvciBtb25kYXlcbiAgICAgICAgICAgICAgICB0aWNrX2NsYXNzICs9IFwiIHRoaWNrXCI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudmlld19pcyhWaWV3TW9kZS5XZWVrKSAmJiBkYXRlLmdldERhdGUoKSA+PSAxICYmIGRhdGUuZ2V0RGF0ZSgpIDwgOCkge1xuICAgICAgICAgICAgICAgIC8vIHRoaWNrIHRpY2sgZm9yIGZpcnN0IHdlZWtcbiAgICAgICAgICAgICAgICB0aWNrX2NsYXNzICs9IFwiIHRoaWNrXCI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudmlld19pcyhWaWV3TW9kZS5Nb250aCkgJiYgZGF0ZS5nZXRNb250aCgpICUgMyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIHRoaWNrIHRpY2tzIGZvciBxdWFydGVyc1xuICAgICAgICAgICAgICAgIHRpY2tfY2xhc3MgKz0gXCIgdGhpY2tcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY3JlYXRlU1ZHKFwicGF0aFwiLCB7XG4gICAgICAgICAgICAgICAgZDogYE0gJHt0aWNrX3h9ICR7dGlja195fSB2ICR7dGlja19oZWlnaHR9YCxcbiAgICAgICAgICAgICAgICBjbGFzczogdGlja19jbGFzcyxcbiAgICAgICAgICAgICAgICBhcHBlbmRfdG86IHRoaXMubGF5ZXJzLmdyaWQsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMudmlld19pcyhWaWV3TW9kZS5Nb250aCkpIHtcbiAgICAgICAgICAgICAgICB0aWNrX3ggKz1cbiAgICAgICAgICAgICAgICAgICAgKERhdGVVdGlscy5nZXREYXlzSW5Nb250aChkYXRlKSAqXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGgpIC9cbiAgICAgICAgICAgICAgICAgICAgMzA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRpY2tfeCArPSB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBtYWtlX2dyaWRfaGlnaGxpZ2h0cygpIHtcbiAgICAgICAgaWYgKHRoaXMudmlld19pcyhWaWV3TW9kZS5EYXkpKSB7XG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9ICh0aGlzLm9wdGlvbnMuYmFySGVpZ2h0ICsgdGhpcy5vcHRpb25zLnBhZGRpbmcpICpcbiAgICAgICAgICAgICAgICB0aGlzLnRhc2tzLmxlbmd0aCArXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhlYWRlckhlaWdodCArXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBhZGRpbmcgLyAyO1xuXG4gICAgICAgICAgICBsZXQgeCA9IDA7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGRhdGUgb2YgdGhpcy5kYXRlcykge1xuXG4gICAgICAgICAgICAgICAgbGV0IHkgPSAodGhpcy5vcHRpb25zLmhlYWRlckhlaWdodCArIHRoaXMub3B0aW9ucy5wYWRkaW5nKSAvIDI7XG5cbiAgICAgICAgICAgICAgICBsZXQgaXNUb2RheSA9IGRhdGUgPT0gRGF0ZVV0aWxzLnRvZGF5KCk7XG4gICAgICAgICAgICAgICAgbGV0IGlzV2Vla2VuZCA9IChkYXRlLmdldERheSgpID09IDAgfHwgZGF0ZS5nZXREYXkoKSA9PSA2KTtcbiAgICAgICAgICAgICAgICBsZXQgY2xhc3NOYW1lO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzVG9kYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gXCJ0b2RheS1oaWdobGlnaHRcIjtcbiAgICAgICAgICAgICAgICAgICAgeSA9ICh0aGlzLm9wdGlvbnMuaGVhZGVySGVpZ2h0ICsgdGhpcy5vcHRpb25zLnBhZGRpbmcpIC8gMjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzV2Vla2VuZCkge1xuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBcIndlZWtlbmQtaGlnaGxpZ2h0XCI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgcnggPSAzO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJ5ID0gMztcblxuICAgICAgICAgICAgICAgIGlmIChpc1RvZGF5IHx8IGlzV2Vla2VuZCkge1xuICAgICAgICAgICAgICAgICAgICBjcmVhdGVTVkcoXCJyZWN0XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgICAgICAgICAgICB5LFxuICAgICAgICAgICAgICAgICAgICAgICAgcngsXG4gICAgICAgICAgICAgICAgICAgICAgICByeSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6IGNsYXNzTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZF90bzogdGhpcy5sYXllcnMuZ3JpZFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB4ICs9IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZV9kYXRlcygpIHtcbiAgICAgICAgY29uc3QgZGF0ZXMgPSB0aGlzLmdldF9kYXRlc190b19kcmF3KCk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IGRhdGVzW2ldO1xuXG4gICAgICAgICAgICBjcmVhdGVTVkcoXCJ0ZXh0XCIsIHtcbiAgICAgICAgICAgICAgICB4OiBkYXRlLmxvd2VyX3gsXG4gICAgICAgICAgICAgICAgeTogZGF0ZS5sb3dlcl95ICsgMjAsXG4gICAgICAgICAgICAgICAgaW5uZXJIVE1MOiBkYXRlLmxvd2VyX3RleHQsXG4gICAgICAgICAgICAgICAgY2xhc3M6IFwidGl0bGUtMlwiLFxuICAgICAgICAgICAgICAgIGFwcGVuZF90bzogdGhpcy5sYXllcnMuZGF0ZSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoZGF0ZS5taWRkbGVfdGV4dCkge1xuICAgICAgICAgICAgICAgIGNyZWF0ZVNWRyhcInRleHRcIiwge1xuICAgICAgICAgICAgICAgICAgICB4OiBkYXRlLm1pZGRsZV94LFxuICAgICAgICAgICAgICAgICAgICB5OiBkYXRlLm1pZGRsZV95LFxuICAgICAgICAgICAgICAgICAgICBpbm5lckhUTUw6IGRhdGUubWlkZGxlX3RleHQsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzOiBcIm1pZGRsZS10ZXh0XCIsXG4gICAgICAgICAgICAgICAgICAgIGFwcGVuZF90bzogdGhpcy5sYXllcnMuZGF0ZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRhdGUudXBwZXJfdGV4dCkge1xuICAgICAgICAgICAgICAgIGNvbnN0ICR1cHBlcl90ZXh0ID0gY3JlYXRlU1ZHKFwidGV4dFwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHg6IGRhdGUudXBwZXJfeCxcbiAgICAgICAgICAgICAgICAgICAgeTogZGF0ZS51cHBlcl95LFxuICAgICAgICAgICAgICAgICAgICBpbm5lckhUTUw6IGRhdGUudXBwZXJfdGV4dCxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M6IFwidXBwZXItdGV4dFwiLFxuICAgICAgICAgICAgICAgICAgICBhcHBlbmRfdG86IHRoaXMubGF5ZXJzLmRhdGUsXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgb3V0LW9mLWJvdW5kIGRhdGVzXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAkdXBwZXJfdGV4dC5nZXRCQm94KCkueDIgPiB0aGlzLmxheWVycy5ncmlkLmdldEJCb3goKS53aWR0aFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAkdXBwZXJfdGV4dC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldF9kYXRlc190b19kcmF3KCkge1xuICAgICAgICBsZXQgbGFzdF9kYXRlOiBhbnkgPSBudWxsO1xuICAgICAgICBjb25zdCBkYXRlcyA9IHRoaXMuZGF0ZXMubWFwKChkYXRlOiBhbnksIGk6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZCA9IHRoaXMuZ2V0X2RhdGVfaW5mbyhkYXRlLCBsYXN0X2RhdGUsIGkpO1xuICAgICAgICAgICAgbGFzdF9kYXRlID0gZGF0ZTtcbiAgICAgICAgICAgIHJldHVybiBkO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRhdGVzO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0X2RhdGVfaW5mbyhkYXRlOiBEYXRlLCBsYXN0X2RhdGU6IERhdGUsIGk6IGFueSkge1xuICAgICAgICBpZiAoIWxhc3RfZGF0ZSkge1xuICAgICAgICAgICAgbGFzdF9kYXRlID0gRGF0ZVV0aWxzLmFkZChkYXRlLCAxLCBcInllYXJcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRlX3RleHQgPSB7XG4gICAgICAgICAgICAvLyBxdWFydGVyIGhvdXJcbiAgICAgICAgICAgIHF1YXJ0ZXJIb3VyVXBwZXI6IGRhdGUuZ2V0RGF0ZSgpICE9PSBsYXN0X2RhdGUuZ2V0RGF0ZSgpXG4gICAgICAgICAgICAgICAgPyBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiRCBNTU1cIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKVxuICAgICAgICAgICAgICAgIDogXCJcIixcblxuICAgICAgICAgICAgcXVhcnRlckhvdXJMb3dlcjogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkhIOm1tXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSksXG5cbiAgICAgICAgICAgIC8vIGhvdXJcbiAgICAgICAgICAgIGhvdXJVcHBlcjogZGF0ZS5nZXREYXRlKCkgIT09IGxhc3RfZGF0ZS5nZXREYXRlKClcbiAgICAgICAgICAgICAgICA/IERhdGVVdGlscy5mb3JtYXQoZGF0ZSwgXCJEIE1NTVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpXG4gICAgICAgICAgICAgICAgOiBcIlwiLFxuXG4gICAgICAgICAgICBob3VyTG93ZXI6IERhdGVVdGlscy5mb3JtYXQoZGF0ZSwgXCJISDptbVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpLFxuXG4gICAgICAgICAgICAvLyBxdWFydGVyIGRheVxuICAgICAgICAgICAgcXVhcnRlckRheVVwcGVyOiBkYXRlLmdldERhdGUoKSAhPT0gbGFzdF9kYXRlLmdldERhdGUoKVxuICAgICAgICAgICAgICAgID8gRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkQgTU1NXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSlcbiAgICAgICAgICAgICAgICA6IFwiXCIsXG5cbiAgICAgICAgICAgIHF1YXJ0ZXJEYXlMb3dlcjogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkhIOm1tXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSksXG5cbiAgICAgICAgICAgIC8vIGhhbGYgZGF5XG4gICAgICAgICAgICBoYWxmRGF5VXBwZXI6IChkYXRlLmdldERhdGUoKSAhPT0gbGFzdF9kYXRlLmdldERhdGUoKSlcbiAgICAgICAgICAgICAgICA/ICgoKGRhdGUuZ2V0TW9udGgoKSAhPT0gbGFzdF9kYXRlLmdldE1vbnRoKCkpIHx8IGkgPCAyKVxuICAgICAgICAgICAgICAgICAgICA/IERhdGVVdGlscy5mb3JtYXQoZGF0ZSwgXCJEIE1NTVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpXG4gICAgICAgICAgICAgICAgICAgIDogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkRcIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKSlcbiAgICAgICAgICAgICAgICA6IFwiXCIsXG5cbiAgICAgICAgICAgIGhhbGZEYXlMb3dlcjogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkhIOm1tXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSksXG5cbiAgICAgICAgICAgIC8vIGRheVxuICAgICAgICAgICAgZGF5VXBwZXI6ICgoZGF0ZS5nZXRNb250aCgpICE9PSBsYXN0X2RhdGUuZ2V0TW9udGgoKSkgfHwgaSA9PT0gMClcbiAgICAgICAgICAgICAgICA/IERhdGVVdGlscy5mb3JtYXQoZGF0ZSwgXCJNTU1NXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSlcbiAgICAgICAgICAgICAgICA6IFwiXCIsXG5cbiAgICAgICAgICAgIGRheU1pZGRsZTogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcImRkZFwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpLFxuXG4gICAgICAgICAgICBkYXlMb3dlcjogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkRcIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKSxcblxuICAgICAgICAgICAgLy8gd2Vla1xuICAgICAgICAgICAgd2Vla1VwcGVyOiBkYXRlLmdldE1vbnRoKCkgIT09IGxhc3RfZGF0ZS5nZXRNb250aCgpXG4gICAgICAgICAgICAgICAgPyBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiTU1NTVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpXG4gICAgICAgICAgICAgICAgOiBcIlwiLFxuXG4gICAgICAgICAgICB3ZWVrTG93ZXI6IGRhdGUuZ2V0TW9udGgoKSAhPT0gbGFzdF9kYXRlLmdldE1vbnRoKClcbiAgICAgICAgICAgICAgICA/IERhdGVVdGlscy5mb3JtYXQoZGF0ZSwgXCJEIE1NTVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpXG4gICAgICAgICAgICAgICAgOiBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiRFwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpLFxuXG4gICAgICAgICAgICAvLyBtb250aFxuICAgICAgICAgICAgbW9udGhVcHBlcjogZGF0ZS5nZXRGdWxsWWVhcigpICE9PSBsYXN0X2RhdGUuZ2V0RnVsbFllYXIoKVxuICAgICAgICAgICAgICAgID8gRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIllZWVlcIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKVxuICAgICAgICAgICAgICAgIDogXCJcIixcblxuICAgICAgICAgICAgbW9udGhMb3dlcjogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIk1NTU1cIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKSxcblxuICAgICAgICAgICAgLy8geWVhclxuICAgICAgICAgICAgeWVhclVwcGVyOiBkYXRlLmdldEZ1bGxZZWFyKCkgIT09IGxhc3RfZGF0ZS5nZXRGdWxsWWVhcigpIFxuICAgICAgICAgICAgICAgID8gRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIllZWVlcIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKVxuICAgICAgICAgICAgICAgIDogXCJcIixcblxuICAgICAgICAgICAgeWVhckxvd2VyOiBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiWVlZWVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIERlc2NvbnRhbmRvIDIwIHBhcmEgYWRjaW9uYXIgdW1hIHNlZ3VuZGEgbGluaGEgZGUgaW5mb3JtYcOnw6NvIG5vIGNhYmXDp2FsaG9cbiAgICAgICAgY29uc3QgYmFzZV9wb3MgPSB7XG4gICAgICAgICAgICB4OiBpICogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoLFxuICAgICAgICAgICAgdXBwZXJfeTogdGhpcy5vcHRpb25zLmhlYWRlckhlaWdodCAtIDIwIC0gMjUsXG4gICAgICAgICAgICBtaWRkbGVfeTogdGhpcy5vcHRpb25zLmhlYWRlckhlaWdodCAtIDIwLFxuICAgICAgICAgICAgbG93ZXJfeTogdGhpcy5vcHRpb25zLmhlYWRlckhlaWdodCAtIDIwLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB4X3BvcyA9IHtcbiAgICAgICAgICAgIHF1YXJ0ZXJIb3VyVXBwZXI6ICh0aGlzLmRhdGVzLmxlbmd0aCA8IDE0KSA/ICh0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGgpIDogKHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAqIDI0IC8gMiksXG4gICAgICAgICAgICBxdWFydGVySG91ck1pZGRsZTogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gMixcbiAgICAgICAgICAgIHF1YXJ0ZXJIb3VyTG93ZXI6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDIsXG5cbiAgICAgICAgICAgIGhvdXJVcHBlcjogKHRoaXMuZGF0ZXMubGVuZ3RoIDwgMTQpID8gKHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCkgOiAodGhpcy5vcHRpb25zLmNvbHVtbldpZHRoICogMjQgLyAyKSxcbiAgICAgICAgICAgIGhvdXJNaWRkbGU6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDIsXG4gICAgICAgICAgICBob3VyTG93ZXI6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDIsXG5cbiAgICAgICAgICAgIHF1YXJ0ZXJEYXlVcHBlcjogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoICogNCAvIDIsXG4gICAgICAgICAgICBxdWFydGVyRGF5TWlkZGxlOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAyLFxuICAgICAgICAgICAgcXVhcnRlckRheUxvd2VyOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAyLFxuICAgICAgICAgICAgXG4gICAgICAgICAgICBoYWxmRGF5VXBwZXI6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAqIDIgLyAyLFxuICAgICAgICAgICAgaGFsZkRheU1pZGRsZTogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gMixcbiAgICAgICAgICAgIGhhbGZEYXlMb3dlcjogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gMixcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgZGF5VXBwZXI6ICh0aGlzLmRhdGVzLmxlbmd0aCA8IDE1KSA/ICh0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGgpIDogKCh0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggKiAzMCkgLyAyKSxcbiAgICAgICAgICAgIGRheU1pZGRsZTogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gMiAtIDEyLFxuICAgICAgICAgICAgZGF5TG93ZXI6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDIsXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHdlZWtVcHBlcjogKHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAqIDQpIC8gMixcbiAgICAgICAgICAgIHdlZWtNaWRkbGU6IDAsXG4gICAgICAgICAgICB3ZWVrTG93ZXI6IDAsXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIG1vbnRoVXBwZXI6ICh0aGlzLmRhdGVzLmxlbmd0aCA8IDE1KSA/ICh0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGgpIDogKCh0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggKiAxMikgLyAyKSxcbiAgICAgICAgICAgIG1vbnRoTWlkZGxlOiAwLFxuICAgICAgICAgICAgbW9udGhMb3dlcjogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gMixcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgeWVhclVwcGVyOiAodGhpcy5vcHRpb25zLmNvbHVtbldpZHRoICogMzApIC8gMixcbiAgICAgICAgICAgIHllYXJNaWRkbGU6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDIsXG4gICAgICAgICAgICB5ZWFyTG93ZXI6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDIsXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHVwcGVyX3RleHQ6IGRhdGVfdGV4dFtgJHt0aGlzLm9wdGlvbnMudmlld01vZGV9VXBwZXJgXSxcbiAgICAgICAgICAgIG1pZGRsZV90ZXh0OiBkYXRlX3RleHRbYCR7dGhpcy5vcHRpb25zLnZpZXdNb2RlfU1pZGRsZWBdLFxuICAgICAgICAgICAgbG93ZXJfdGV4dDogZGF0ZV90ZXh0W2Ake3RoaXMub3B0aW9ucy52aWV3TW9kZX1Mb3dlcmBdLFxuICAgICAgICAgICAgdXBwZXJfeDogYmFzZV9wb3MueCArIHhfcG9zW2Ake3RoaXMub3B0aW9ucy52aWV3TW9kZX1VcHBlcmBdLFxuICAgICAgICAgICAgdXBwZXJfeTogYmFzZV9wb3MudXBwZXJfeSxcbiAgICAgICAgICAgIG1pZGRsZV94OiBiYXNlX3Bvcy54ICsgeF9wb3NbYCR7dGhpcy5vcHRpb25zLnZpZXdNb2RlfU1pZGRsZWBdLFxuICAgICAgICAgICAgbWlkZGxlX3k6IGJhc2VfcG9zLm1pZGRsZV95LFxuICAgICAgICAgICAgbG93ZXJfeDogYmFzZV9wb3MueCArIHhfcG9zW2Ake3RoaXMub3B0aW9ucy52aWV3TW9kZX1Mb3dlcmBdLFxuICAgICAgICAgICAgbG93ZXJfeTogYmFzZV9wb3MubG93ZXJfeSxcbiAgICAgICAgICAgIGRhdGUsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYWtlX2JhcnMoKSB7XG4gICAgICAgIHRoaXMuYmFycyA9IHRoaXMudGFza3MubWFwKCh0YXNrOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJhciA9IG5ldyBCYXIodGhpcywgdGFzayk7XG4gICAgICAgICAgICB0aGlzLmxheWVycy5iYXIuYXBwZW5kQ2hpbGQoYmFyLmdyb3VwKTtcbiAgICAgICAgICAgIHJldHVybiBiYXI7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZV9hcnJvd3MoKSB7XG4gICAgICAgIHRoaXMuYXJyb3dzID0gW107XG4gICAgICAgIGZvciAobGV0IHRhc2sgb2YgdGhpcy50YXNrcykge1xuICAgICAgICAgICAgbGV0IGFycm93cyA9IFtdO1xuICAgICAgICAgICAgYXJyb3dzID0gdGFzay5kZXBlbmRlbmNpZXNcbiAgICAgICAgICAgICAgICAubWFwKCh0YXNrX2lkOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVwZW5kZW5jeSA9IHRoaXMuZ2V0X3Rhc2sodGFza19pZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGVwZW5kZW5jeSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJvdyA9IG5ldyBBcnJvdyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhcnNbZGVwZW5kZW5jeS5faW5kZXhdLCAvLyBmcm9tX3Rhc2tcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmFyc1t0YXNrLl9pbmRleF0gLy8gdG9fdGFza1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxheWVycy5hcnJvdy5hcHBlbmRDaGlsZChhcnJvdy5lbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycm93O1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKTsgLy8gZmlsdGVyIGZhbHN5IHZhbHVlc1xuICAgICAgICAgICAgdGhpcy5hcnJvd3MgPSB0aGlzLmFycm93cy5jb25jYXQoYXJyb3dzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgbWFwX2Fycm93c19vbl9iYXJzKCkge1xuICAgICAgICBmb3IgKGxldCBiYXIgb2YgdGhpcy5iYXJzKSB7XG4gICAgICAgICAgICBiYXIuYXJyb3dzID0gdGhpcy5hcnJvd3MuZmlsdGVyKChhcnJvdzogQXJyb3cpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICBhcnJvdy5mcm9tVGFzay50YXNrLmlkID09PSBiYXIudGFzay5pZCB8fFxuICAgICAgICAgICAgICAgICAgICBhcnJvdy50b1Rhc2sudGFzay5pZCA9PT0gYmFyLnRhc2suaWRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldF93aWR0aCgpIHtcbiAgICAgICAgY29uc3QgY3VyX3dpZHRoID0gdGhpcy4kc3ZnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICBjb25zdCBhY3R1YWxfd2lkdGggPSB0aGlzLiRzdmdcbiAgICAgICAgICAgIC5xdWVyeVNlbGVjdG9yKFwiLmdyaWQgLmdyaWQtcm93XCIpXG4gICAgICAgICAgICAuZ2V0QXR0cmlidXRlKFwid2lkdGhcIik7XG4gICAgICAgIGlmIChjdXJfd2lkdGggPCBhY3R1YWxfd2lkdGgpIHtcbiAgICAgICAgICAgIHRoaXMuJHN2Zy5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBhY3R1YWxfd2lkdGgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRfc2Nyb2xsX3Bvc2l0aW9uKCkge1xuICAgICAgICBjb25zdCBwYXJlbnRfZWxlbWVudCA9IHRoaXMuJHN2Zy5wYXJlbnRFbGVtZW50O1xuICAgICAgICBpZiAoIXBhcmVudF9lbGVtZW50KSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgaG91cnNfYmVmb3JlX2ZpcnN0X3Rhc2sgPSBEYXRlVXRpbHMuZGlmZihcbiAgICAgICAgICAgIHRoaXMuZ2V0X29sZGVzdF9zdGFydGluZ19kYXRlKCksXG4gICAgICAgICAgICB0aGlzLm1pbkRhdGUsXG4gICAgICAgICAgICBcImhvdXJcIlxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHNjcm9sbF9wb3MgPVxuICAgICAgICAgICAgKGhvdXJzX2JlZm9yZV9maXJzdF90YXNrIC8gdGhpcy5vcHRpb25zLnN0ZXApICpcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAtXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGg7XG5cbiAgICAgICAgcGFyZW50X2VsZW1lbnQuc2Nyb2xsTGVmdCA9IHNjcm9sbF9wb3M7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBiaW5kX2dyaWRfY2xpY2soKSB7XG4gICAgICAgICQub24oXG4gICAgICAgICAgICB0aGlzLiRzdmcsXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9wdXBUcmlnZ2VyLFxuICAgICAgICAgICAgXCIuZ3JpZC1yb3csIC5ncmlkLWhlYWRlclwiLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudW5zZWxlY3RfYWxsKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlX3BvcHVwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBiaW5kX2Jhcl9ldmVudHMoKSB7XG4gICAgICAgIGxldCBpc19kcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICBsZXQgeF9vbl9zdGFydCA9IDA7XG4gICAgICAgIGxldCBpc19yZXNpemluZ19sZWZ0ID0gZmFsc2U7XG4gICAgICAgIGxldCBpc19yZXNpemluZ19yaWdodCA9IGZhbHNlO1xuICAgICAgICBsZXQgcGFyZW50X2Jhcl9pZDogYW55ID0gbnVsbDtcbiAgICAgICAgbGV0IGJhcnM6IEJhcltdID0gW107XG4gICAgICAgIHRoaXMuYmFyX2JlaW5nX2RyYWdnZWQgPSBudWxsO1xuXG4gICAgICAgIGZ1bmN0aW9uIGFjdGlvbl9pbl9wcm9ncmVzcygpIHtcbiAgICAgICAgICAgIHJldHVybiBpc19kcmFnZ2luZyB8fCBpc19yZXNpemluZ19sZWZ0IHx8IGlzX3Jlc2l6aW5nX3JpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgJC5vbih0aGlzLiRzdmcsIFwibW91c2Vkb3duXCIsIFwiLmJhci13cmFwcGVyLCAuaGFuZGxlXCIsIChlOiBhbnksIGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYmFyX3dyYXBwZXIgPSAkLmNsb3Nlc3QoXCIuYmFyLXdyYXBwZXJcIiwgZWxlbWVudCk7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcImxlZnRcIikpIHtcbiAgICAgICAgICAgICAgICBpc19yZXNpemluZ19sZWZ0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJyaWdodFwiKSkge1xuICAgICAgICAgICAgICAgIGlzX3Jlc2l6aW5nX3JpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJiYXItd3JhcHBlclwiKSAmJiB0aGlzLm9wdGlvbnMuYWxsb3dNb3ZlbWVudCkge1xuICAgICAgICAgICAgICAgIGlzX2RyYWdnaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYmFyX3dyYXBwZXIuY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcblxuICAgICAgICAgICAgeF9vbl9zdGFydCA9IGUub2Zmc2V0WDtcblxuICAgICAgICAgICAgcGFyZW50X2Jhcl9pZCA9IGJhcl93cmFwcGVyLmdldEF0dHJpYnV0ZShcImRhdGEtaWRcIik7XG4gICAgICAgICAgICBjb25zdCBpZHMgPSBbXG4gICAgICAgICAgICAgICAgcGFyZW50X2Jhcl9pZCxcbiAgICAgICAgICAgICAgICAuLi50aGlzLmdldF9hbGxfZGVwZW5kZW50X3Rhc2tzKHBhcmVudF9iYXJfaWQpLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGJhcnMgPSBpZHMubWFwKChpZCkgPT4gdGhpcy5nZXRfYmFyKGlkKSk7XG5cbiAgICAgICAgICAgIHRoaXMuYmFyX2JlaW5nX2RyYWdnZWQgPSBwYXJlbnRfYmFyX2lkO1xuXG4gICAgICAgICAgICBiYXJzLmZvckVhY2goKGJhcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0ICRiYXIgPSBiYXIuZWxlbWVudDtcbiAgICAgICAgICAgICAgICAkYmFyLm94ID0gJGJhci5nZXRYKCk7XG4gICAgICAgICAgICAgICAgJGJhci5veSA9ICRiYXIuZ2V0WSgpO1xuICAgICAgICAgICAgICAgICRiYXIub3dpZHRoID0gJGJhci5nZXRXaWR0aCgpO1xuICAgICAgICAgICAgICAgICRiYXIuZmluYWxkeCA9IDA7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cblxuICAgICAgICAkLm9uKHRoaXMuJHN2ZywgXCJtb3VzZW1vdmVcIiwgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFhY3Rpb25faW5fcHJvZ3Jlc3MoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZHggPSBlLm9mZnNldFggLSB4X29uX3N0YXJ0O1xuXG4gICAgICAgICAgICBiYXJzLmZvckVhY2goKGJhcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0ICRiYXIgPSBiYXIuZWxlbWVudDtcbiAgICAgICAgICAgICAgICAkYmFyLmZpbmFsZHggPSB0aGlzLmdldF9zbmFwX3Bvc2l0aW9uKGR4KTtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGVfcG9wdXAoKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNfcmVzaXppbmdfbGVmdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50X2Jhcl9pZCA9PT0gYmFyLnRhc2suaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhci51cGRhdGVCYXJQb3NpdGlvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogJGJhci5veCArICRiYXIuZmluYWxkeCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogJGJhci5vd2lkdGggLSAkYmFyLmZpbmFsZHgsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhci51cGRhdGVCYXJQb3NpdGlvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogJGJhci5veCArICRiYXIuZmluYWxkeCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc19yZXNpemluZ19yaWdodCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50X2Jhcl9pZCA9PT0gYmFyLnRhc2suaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhci51cGRhdGVCYXJQb3NpdGlvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6ICRiYXIub3dpZHRoICsgJGJhci5maW5hbGR4LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzX2RyYWdnaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhci51cGRhdGVCYXJQb3NpdGlvbih7IHg6ICRiYXIub3ggKyAkYmFyLmZpbmFsZHggfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIG51bGwpO1xuXG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzX2RyYWdnaW5nIHx8IGlzX3Jlc2l6aW5nX2xlZnQgfHwgaXNfcmVzaXppbmdfcmlnaHQgfHwgIXRoaXMub3B0aW9ucy5hbGxvd01vdmVtZW50KSB7XG4gICAgICAgICAgICAgICAgYmFycy5mb3JFYWNoKChiYXIpID0+IGJhci5ncm91cC5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaXNfZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGlzX3Jlc2l6aW5nX2xlZnQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlzX3Jlc2l6aW5nX3JpZ2h0ID0gZmFsc2U7XG4gICAgICAgIH0pO1xuXG4gICAgICAgICQub24odGhpcy4kc3ZnLCBcIm1vdXNldXBcIiwgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5iYXJfYmVpbmdfZHJhZ2dlZCA9IG51bGw7XG4gICAgICAgICAgICBiYXJzLmZvckVhY2goKGJhcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0ICRiYXIgPSBiYXIuZWxlbWVudDtcbiAgICAgICAgICAgICAgICBpZiAoISRiYXIuZmluYWxkeCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGJhci5kYXRlQ2hhbmdlZCgpO1xuICAgICAgICAgICAgICAgIGJhci5zZXRBY3Rpb25Db21wbGV0ZWQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCBudWxsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldF9hbGxfZGVwZW5kZW50X3Rhc2tzKHRhc2tfaWQ6IGFueSkge1xuICAgICAgICBsZXQgb3V0OiBhbnlbXSA9IFtdO1xuICAgICAgICBsZXQgdG9fcHJvY2VzcyA9IFt0YXNrX2lkXTtcbiAgICAgICAgd2hpbGUgKHRvX3Byb2Nlc3MubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBkZXBzID0gdG9fcHJvY2Vzcy5yZWR1Y2UoKGFjYywgY3VycikgPT4ge1xuICAgICAgICAgICAgICAgIGFjYyA9IGFjYy5jb25jYXQodGhpcy5kZXBlbmRlbmN5X21hcFtjdXJyXSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgIH0sIFtdKTtcblxuICAgICAgICAgICAgb3V0ID0gb3V0LmNvbmNhdChkZXBzKTtcbiAgICAgICAgICAgIHRvX3Byb2Nlc3MgPSBkZXBzLmZpbHRlcigoZDogYW55KSA9PiAhdG9fcHJvY2Vzcy5pbmNsdWRlcyhkKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3V0LmZpbHRlcihCb29sZWFuKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldF9zbmFwX3Bvc2l0aW9uKGR4OiBhbnkpIHtcbiAgICAgICAgbGV0IG9keCA9IGR4LFxuICAgICAgICAgICAgcmVtLFxuICAgICAgICAgICAgcG9zaXRpb247XG5cbiAgICAgICAgaWYgKHRoaXMudmlld19pcyhWaWV3TW9kZS5Ib3VyKSkge1xuICAgICAgICAgICAgcmVtID0gZHggJSAodGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gNik7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IG9keCAtIHJlbSArIChyZW0gPCB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAxMiA/IDAgOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyA2KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZpZXdfaXMoVmlld01vZGUuV2VlaykpIHtcbiAgICAgICAgICAgIHJlbSA9IGR4ICUgKHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDcpO1xuICAgICAgICAgICAgcG9zaXRpb24gPSBvZHggLSByZW0gKyAocmVtIDwgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gMTQgPyAwIDogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gNyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy52aWV3X2lzKFZpZXdNb2RlLk1vbnRoKSkge1xuICAgICAgICAgICAgcmVtID0gZHggJSAodGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gMzApO1xuICAgICAgICAgICAgcG9zaXRpb24gPSBvZHggLSByZW0gKyAocmVtIDwgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gNjAgPyAwIDogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gMzApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVtID0gZHggJSB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGg7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IG9keCAtIHJlbSArIChyZW0gPCB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAyID8gMCA6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyB1bnNlbGVjdF9hbGwoKSB7XG4gICAgICAgIFsuLi50aGlzLiRzdmcucXVlcnlTZWxlY3RvckFsbChcIi5iYXItd3JhcHBlclwiKV0uZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyB2aWV3X2lzKG1vZGVzOiBWaWV3TW9kZSB8IFZpZXdNb2RlW10pIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobW9kZXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gbW9kZXMuc29tZSgobW9kZSkgPT4gdGhpcy5vcHRpb25zLnZpZXdNb2RlID09PSBtb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMudmlld01vZGUgPT09IG1vZGVzO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0X3Rhc2soaWQ6IGFueSkge1xuICAgICAgICByZXR1cm4gdGhpcy50YXNrcy5maW5kKCh0YXNrOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0YXNrLmlkID09PSBpZDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldF9iYXIoaWQ6IGFueSk6IEJhciB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhcnMuZmluZCgoYmFyOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBiYXIudGFzay5pZCA9PT0gaWQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzaG93X3BvcHVwKG9wdGlvbnM6IGFueSkge1xuICAgICAgICBpZiAoIXRoaXMucG9wdXApIHtcbiAgICAgICAgICAgIHRoaXMucG9wdXAgPSBuZXcgUG9wdXAoXG4gICAgICAgICAgICAgICAgdGhpcy5wb3B1cF93cmFwcGVyLFxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jdXN0b21Qb3B1cEh0bWxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wb3B1cC5zaG93KG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoaWRlX3BvcHVwKCkge1xuICAgICAgICB0aGlzLnBvcHVwICYmIHRoaXMucG9wdXAuaGlkZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0cmlnZ2VyX2V2ZW50KGV2ZW50OiBzdHJpbmcsIGFyZ3M6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zW2V2ZW50XSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zW2V2ZW50XS5hcHBseShudWxsLCBhcmdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0X29sZGVzdF9zdGFydGluZ19kYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YXNrc1xuICAgICAgICAgICAgLm1hcCgodGFzazogYW55KSA9PiB0YXNrLl9zdGFydClcbiAgICAgICAgICAgIC5yZWR1Y2UoKHByZXZfZGF0ZTogYW55LCBjdXJfZGF0ZTogYW55KSA9PlxuICAgICAgICAgICAgICAgIGN1cl9kYXRlIDw9IHByZXZfZGF0ZSA/IGN1cl9kYXRlIDogcHJldl9kYXRlXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuJHN2Zy5pbm5lckhUTUwgPSAnJztcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlX2lkKHRhc2s6IGFueSkge1xuICAgIHJldHVybiB0YXNrLm5hbWUgKyBcIl9cIiArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDEyKTtcbn1cbiJdfQ==