@jsenv/terminal-recorder 1.4.6 → 1.4.8
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.
- package/dist/js/terminal_recorder.js +24 -33
- package/package.json +5 -5
- package/src/.jsenv/chrome@128.00/@fs/Users/damien.maillard/dev/perso/jsenv-core/node_modules/@xterm/addon-fit/lib/addon-fit.js +2 -0
- package/src/.jsenv/chrome@128.00/@fs/Users/damien.maillard/dev/perso/jsenv-core/node_modules/@xterm/addon-fit/lib/addon-fit.js.map +64 -0
- package/src/.jsenv/chrome@128.00/terminal_recorder.js +26 -35
- package/src/.jsenv/chrome@128.00/terminal_recorder.js.map +2 -2
- package/src/client/terminal_recorder.js +25 -34
- package/src/client/xterm_dev.html +1 -1
- package/src/.jsenv/chrome@127.00/@fs/Users/damien.maillard/dev/perso/jsenv-core/node_modules/@xterm/addon-serialize/lib/addon-serialize.js +0 -2
- package/src/.jsenv/chrome@127.00/@fs/Users/damien.maillard/dev/perso/jsenv-core/node_modules/@xterm/addon-serialize/lib/addon-serialize.js.map +0 -434
- package/src/.jsenv/chrome@127.00/@fs/Users/damien.maillard/dev/perso/jsenv-core/node_modules/@xterm/addon-serialize/lib/addon-serialize.mjs +0 -749
- package/src/.jsenv/chrome@127.00/@fs/Users/damien.maillard/dev/perso/jsenv-core/node_modules/@xterm/addon-serialize/lib/addon-serialize.mjs.map +0 -477
- package/src/.jsenv/chrome@127.00/@fs/Users/damien.maillard/dev/perso/jsenv-core/node_modules/@xterm/addon-webgl/lib/addon-webgl.js +0 -2
- package/src/.jsenv/chrome@127.00/@fs/Users/damien.maillard/dev/perso/jsenv-core/node_modules/@xterm/addon-webgl/lib/addon-webgl.js.map +0 -1134
- package/src/.jsenv/chrome@127.00/@fs/Users/damien.maillard/dev/perso/jsenv-core/node_modules/@xterm/xterm/css/xterm.css +0 -204
- package/src/.jsenv/chrome@127.00/@fs/Users/damien.maillard/dev/perso/jsenv-core/node_modules/@xterm/xterm/lib/xterm.js +0 -2
- package/src/.jsenv/chrome@127.00/@fs/Users/damien.maillard/dev/perso/jsenv-core/node_modules/@xterm/xterm/lib/xterm.js.map +0 -2558
- package/src/.jsenv/chrome@127.00/@fs/Users/damien.maillard/dev/perso/jsenv-core/packages/internal/plugin-supervisor/src/client/supervisor.js +0 -1342
- package/src/.jsenv/chrome@127.00/gif_encoder.js +0 -400
- package/src/.jsenv/chrome@127.00/gif_encoder.js.map +0 -11
- package/src/.jsenv/chrome@127.00/lzw_encoder.js +0 -253
- package/src/.jsenv/chrome@127.00/neuquant.js +0 -498
- package/src/.jsenv/chrome@127.00/terminal_recorder.js +0 -380
- package/src/.jsenv/chrome@127.00/terminal_recorder.js.map +0 -11
- package/src/.jsenv/chrome@127.00/xterm.html +0 -46
- package/src/.jsenv/chrome@127.00/xterm.html@L14C5-L18C14.js +0 -5
- package/src/.jsenv/chrome@127.00/xterm.html@L19C5-L24C14.js +0 -7
- package/src/.jsenv/chrome@127.00/xterm.html@L19C5-L24C14.js.map +0 -11
|
@@ -1,749 +0,0 @@
|
|
|
1
|
-
!function (e, t) {
|
|
2
|
-
"object" == typeof exports && "object" == typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define([], t) : "object" == typeof exports ? exports.SerializeAddon = t() : e.SerializeAddon = t();
|
|
3
|
-
}(window, () => (() => {
|
|
4
|
-
"use strict";
|
|
5
|
-
|
|
6
|
-
var e = {
|
|
7
|
-
930: (e, t, s) => {
|
|
8
|
-
Object.defineProperty(t, "__esModule", {
|
|
9
|
-
value: !0
|
|
10
|
-
}), t.ColorContrastCache = void 0;
|
|
11
|
-
const r = s(485);
|
|
12
|
-
t.ColorContrastCache = class {
|
|
13
|
-
constructor() {
|
|
14
|
-
this._color = new r.TwoKeyMap(), this._css = new r.TwoKeyMap();
|
|
15
|
-
}
|
|
16
|
-
setCss(e, t, s) {
|
|
17
|
-
this._css.set(e, t, s);
|
|
18
|
-
}
|
|
19
|
-
getCss(e, t) {
|
|
20
|
-
return this._css.get(e, t);
|
|
21
|
-
}
|
|
22
|
-
setColor(e, t, s) {
|
|
23
|
-
this._color.set(e, t, s);
|
|
24
|
-
}
|
|
25
|
-
getColor(e, t) {
|
|
26
|
-
return this._color.get(e, t);
|
|
27
|
-
}
|
|
28
|
-
clear() {
|
|
29
|
-
this._color.clear(), this._css.clear();
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
},
|
|
33
|
-
997: function (e, t, s) {
|
|
34
|
-
var r = this && this.__decorate || function (e, t, s, r) {
|
|
35
|
-
var o,
|
|
36
|
-
i = arguments.length,
|
|
37
|
-
n = i < 3 ? t : null === r ? r = Object.getOwnPropertyDescriptor(t, s) : r;
|
|
38
|
-
if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) n = Reflect.decorate(e, t, s, r);else for (var l = e.length - 1; l >= 0; l--) (o = e[l]) && (n = (i < 3 ? o(n) : i > 3 ? o(t, s, n) : o(t, s)) || n);
|
|
39
|
-
return i > 3 && n && Object.defineProperty(t, s, n), n;
|
|
40
|
-
},
|
|
41
|
-
o = this && this.__param || function (e, t) {
|
|
42
|
-
return function (s, r) {
|
|
43
|
-
t(s, r, e);
|
|
44
|
-
};
|
|
45
|
-
};
|
|
46
|
-
Object.defineProperty(t, "__esModule", {
|
|
47
|
-
value: !0
|
|
48
|
-
}), t.ThemeService = t.DEFAULT_ANSI_COLORS = void 0;
|
|
49
|
-
const i = s(930),
|
|
50
|
-
n = s(160),
|
|
51
|
-
l = s(345),
|
|
52
|
-
a = s(859),
|
|
53
|
-
c = s(97),
|
|
54
|
-
h = n.css.toColor("#ffffff"),
|
|
55
|
-
u = n.css.toColor("#000000"),
|
|
56
|
-
_ = n.css.toColor("#ffffff"),
|
|
57
|
-
d = n.css.toColor("#000000"),
|
|
58
|
-
C = {
|
|
59
|
-
css: "rgba(255, 255, 255, 0.3)",
|
|
60
|
-
rgba: 4294967117
|
|
61
|
-
};
|
|
62
|
-
t.DEFAULT_ANSI_COLORS = Object.freeze((() => {
|
|
63
|
-
const e = [n.css.toColor("#2e3436"), n.css.toColor("#cc0000"), n.css.toColor("#4e9a06"), n.css.toColor("#c4a000"), n.css.toColor("#3465a4"), n.css.toColor("#75507b"), n.css.toColor("#06989a"), n.css.toColor("#d3d7cf"), n.css.toColor("#555753"), n.css.toColor("#ef2929"), n.css.toColor("#8ae234"), n.css.toColor("#fce94f"), n.css.toColor("#729fcf"), n.css.toColor("#ad7fa8"), n.css.toColor("#34e2e2"), n.css.toColor("#eeeeec")],
|
|
64
|
-
t = [0, 95, 135, 175, 215, 255];
|
|
65
|
-
for (let s = 0; s < 216; s++) {
|
|
66
|
-
const r = t[s / 36 % 6 | 0],
|
|
67
|
-
o = t[s / 6 % 6 | 0],
|
|
68
|
-
i = t[s % 6];
|
|
69
|
-
e.push({
|
|
70
|
-
css: n.channels.toCss(r, o, i),
|
|
71
|
-
rgba: n.channels.toRgba(r, o, i)
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
for (let t = 0; t < 24; t++) {
|
|
75
|
-
const s = 8 + 10 * t;
|
|
76
|
-
e.push({
|
|
77
|
-
css: n.channels.toCss(s, s, s),
|
|
78
|
-
rgba: n.channels.toRgba(s, s, s)
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
return e;
|
|
82
|
-
})());
|
|
83
|
-
let f = t.ThemeService = class extends a.Disposable {
|
|
84
|
-
get colors() {
|
|
85
|
-
return this._colors;
|
|
86
|
-
}
|
|
87
|
-
constructor(e) {
|
|
88
|
-
super(), this._optionsService = e, this._contrastCache = new i.ColorContrastCache(), this._halfContrastCache = new i.ColorContrastCache(), this._onChangeColors = this.register(new l.EventEmitter()), this.onChangeColors = this._onChangeColors.event, this._colors = {
|
|
89
|
-
foreground: h,
|
|
90
|
-
background: u,
|
|
91
|
-
cursor: _,
|
|
92
|
-
cursorAccent: d,
|
|
93
|
-
selectionForeground: void 0,
|
|
94
|
-
selectionBackgroundTransparent: C,
|
|
95
|
-
selectionBackgroundOpaque: n.color.blend(u, C),
|
|
96
|
-
selectionInactiveBackgroundTransparent: C,
|
|
97
|
-
selectionInactiveBackgroundOpaque: n.color.blend(u, C),
|
|
98
|
-
ansi: t.DEFAULT_ANSI_COLORS.slice(),
|
|
99
|
-
contrastCache: this._contrastCache,
|
|
100
|
-
halfContrastCache: this._halfContrastCache
|
|
101
|
-
}, this._updateRestoreColors(), this._setTheme(this._optionsService.rawOptions.theme), this.register(this._optionsService.onSpecificOptionChange("minimumContrastRatio", () => this._contrastCache.clear())), this.register(this._optionsService.onSpecificOptionChange("theme", () => this._setTheme(this._optionsService.rawOptions.theme)));
|
|
102
|
-
}
|
|
103
|
-
_setTheme(e = {}) {
|
|
104
|
-
const s = this._colors;
|
|
105
|
-
if (s.foreground = g(e.foreground, h), s.background = g(e.background, u), s.cursor = g(e.cursor, _), s.cursorAccent = g(e.cursorAccent, d), s.selectionBackgroundTransparent = g(e.selectionBackground, C), s.selectionBackgroundOpaque = n.color.blend(s.background, s.selectionBackgroundTransparent), s.selectionInactiveBackgroundTransparent = g(e.selectionInactiveBackground, s.selectionBackgroundTransparent), s.selectionInactiveBackgroundOpaque = n.color.blend(s.background, s.selectionInactiveBackgroundTransparent), s.selectionForeground = e.selectionForeground ? g(e.selectionForeground, n.NULL_COLOR) : void 0, s.selectionForeground === n.NULL_COLOR && (s.selectionForeground = void 0), n.color.isOpaque(s.selectionBackgroundTransparent)) {
|
|
106
|
-
const e = .3;
|
|
107
|
-
s.selectionBackgroundTransparent = n.color.opacity(s.selectionBackgroundTransparent, e);
|
|
108
|
-
}
|
|
109
|
-
if (n.color.isOpaque(s.selectionInactiveBackgroundTransparent)) {
|
|
110
|
-
const e = .3;
|
|
111
|
-
s.selectionInactiveBackgroundTransparent = n.color.opacity(s.selectionInactiveBackgroundTransparent, e);
|
|
112
|
-
}
|
|
113
|
-
if (s.ansi = t.DEFAULT_ANSI_COLORS.slice(), s.ansi[0] = g(e.black, t.DEFAULT_ANSI_COLORS[0]), s.ansi[1] = g(e.red, t.DEFAULT_ANSI_COLORS[1]), s.ansi[2] = g(e.green, t.DEFAULT_ANSI_COLORS[2]), s.ansi[3] = g(e.yellow, t.DEFAULT_ANSI_COLORS[3]), s.ansi[4] = g(e.blue, t.DEFAULT_ANSI_COLORS[4]), s.ansi[5] = g(e.magenta, t.DEFAULT_ANSI_COLORS[5]), s.ansi[6] = g(e.cyan, t.DEFAULT_ANSI_COLORS[6]), s.ansi[7] = g(e.white, t.DEFAULT_ANSI_COLORS[7]), s.ansi[8] = g(e.brightBlack, t.DEFAULT_ANSI_COLORS[8]), s.ansi[9] = g(e.brightRed, t.DEFAULT_ANSI_COLORS[9]), s.ansi[10] = g(e.brightGreen, t.DEFAULT_ANSI_COLORS[10]), s.ansi[11] = g(e.brightYellow, t.DEFAULT_ANSI_COLORS[11]), s.ansi[12] = g(e.brightBlue, t.DEFAULT_ANSI_COLORS[12]), s.ansi[13] = g(e.brightMagenta, t.DEFAULT_ANSI_COLORS[13]), s.ansi[14] = g(e.brightCyan, t.DEFAULT_ANSI_COLORS[14]), s.ansi[15] = g(e.brightWhite, t.DEFAULT_ANSI_COLORS[15]), e.extendedAnsi) {
|
|
114
|
-
const r = Math.min(s.ansi.length - 16, e.extendedAnsi.length);
|
|
115
|
-
for (let o = 0; o < r; o++) s.ansi[o + 16] = g(e.extendedAnsi[o], t.DEFAULT_ANSI_COLORS[o + 16]);
|
|
116
|
-
}
|
|
117
|
-
this._contrastCache.clear(), this._halfContrastCache.clear(), this._updateRestoreColors(), this._onChangeColors.fire(this.colors);
|
|
118
|
-
}
|
|
119
|
-
restoreColor(e) {
|
|
120
|
-
this._restoreColor(e), this._onChangeColors.fire(this.colors);
|
|
121
|
-
}
|
|
122
|
-
_restoreColor(e) {
|
|
123
|
-
if (void 0 !== e) switch (e) {
|
|
124
|
-
case 256:
|
|
125
|
-
this._colors.foreground = this._restoreColors.foreground;
|
|
126
|
-
break;
|
|
127
|
-
case 257:
|
|
128
|
-
this._colors.background = this._restoreColors.background;
|
|
129
|
-
break;
|
|
130
|
-
case 258:
|
|
131
|
-
this._colors.cursor = this._restoreColors.cursor;
|
|
132
|
-
break;
|
|
133
|
-
default:
|
|
134
|
-
this._colors.ansi[e] = this._restoreColors.ansi[e];
|
|
135
|
-
} else for (let e = 0; e < this._restoreColors.ansi.length; ++e) this._colors.ansi[e] = this._restoreColors.ansi[e];
|
|
136
|
-
}
|
|
137
|
-
modifyColors(e) {
|
|
138
|
-
e(this._colors), this._onChangeColors.fire(this.colors);
|
|
139
|
-
}
|
|
140
|
-
_updateRestoreColors() {
|
|
141
|
-
this._restoreColors = {
|
|
142
|
-
foreground: this._colors.foreground,
|
|
143
|
-
background: this._colors.background,
|
|
144
|
-
cursor: this._colors.cursor,
|
|
145
|
-
ansi: this._colors.ansi.slice()
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
};
|
|
149
|
-
function g(e, t) {
|
|
150
|
-
if (void 0 !== e) try {
|
|
151
|
-
return n.css.toColor(e);
|
|
152
|
-
} catch {}
|
|
153
|
-
return t;
|
|
154
|
-
}
|
|
155
|
-
t.ThemeService = f = r([o(0, c.IOptionsService)], f);
|
|
156
|
-
},
|
|
157
|
-
160: (e, t) => {
|
|
158
|
-
Object.defineProperty(t, "__esModule", {
|
|
159
|
-
value: !0
|
|
160
|
-
}), t.contrastRatio = t.toPaddedHex = t.rgba = t.rgb = t.css = t.color = t.channels = t.NULL_COLOR = void 0;
|
|
161
|
-
let s = 0,
|
|
162
|
-
r = 0,
|
|
163
|
-
o = 0,
|
|
164
|
-
i = 0;
|
|
165
|
-
var n, l, a, c, h;
|
|
166
|
-
function u(e) {
|
|
167
|
-
const t = e.toString(16);
|
|
168
|
-
return t.length < 2 ? "0" + t : t;
|
|
169
|
-
}
|
|
170
|
-
function _(e, t) {
|
|
171
|
-
return e < t ? (t + .05) / (e + .05) : (e + .05) / (t + .05);
|
|
172
|
-
}
|
|
173
|
-
t.NULL_COLOR = {
|
|
174
|
-
css: "#00000000",
|
|
175
|
-
rgba: 0
|
|
176
|
-
}, function (e) {
|
|
177
|
-
e.toCss = function (e, t, s, r) {
|
|
178
|
-
return void 0 !== r ? `#${u(e)}${u(t)}${u(s)}${u(r)}` : `#${u(e)}${u(t)}${u(s)}`;
|
|
179
|
-
}, e.toRgba = function (e, t, s, r = 255) {
|
|
180
|
-
return (e << 24 | t << 16 | s << 8 | r) >>> 0;
|
|
181
|
-
}, e.toColor = function (t, s, r, o) {
|
|
182
|
-
return {
|
|
183
|
-
css: e.toCss(t, s, r, o),
|
|
184
|
-
rgba: e.toRgba(t, s, r, o)
|
|
185
|
-
};
|
|
186
|
-
};
|
|
187
|
-
}(n || (t.channels = n = {})), function (e) {
|
|
188
|
-
function t(e, t) {
|
|
189
|
-
return i = Math.round(255 * t), [s, r, o] = h.toChannels(e.rgba), {
|
|
190
|
-
css: n.toCss(s, r, o, i),
|
|
191
|
-
rgba: n.toRgba(s, r, o, i)
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
e.blend = function (e, t) {
|
|
195
|
-
if (i = (255 & t.rgba) / 255, 1 === i) return {
|
|
196
|
-
css: t.css,
|
|
197
|
-
rgba: t.rgba
|
|
198
|
-
};
|
|
199
|
-
const l = t.rgba >> 24 & 255,
|
|
200
|
-
a = t.rgba >> 16 & 255,
|
|
201
|
-
c = t.rgba >> 8 & 255,
|
|
202
|
-
h = e.rgba >> 24 & 255,
|
|
203
|
-
u = e.rgba >> 16 & 255,
|
|
204
|
-
_ = e.rgba >> 8 & 255;
|
|
205
|
-
return s = h + Math.round((l - h) * i), r = u + Math.round((a - u) * i), o = _ + Math.round((c - _) * i), {
|
|
206
|
-
css: n.toCss(s, r, o),
|
|
207
|
-
rgba: n.toRgba(s, r, o)
|
|
208
|
-
};
|
|
209
|
-
}, e.isOpaque = function (e) {
|
|
210
|
-
return 255 == (255 & e.rgba);
|
|
211
|
-
}, e.ensureContrastRatio = function (e, t, s) {
|
|
212
|
-
const r = h.ensureContrastRatio(e.rgba, t.rgba, s);
|
|
213
|
-
if (r) return n.toColor(r >> 24 & 255, r >> 16 & 255, r >> 8 & 255);
|
|
214
|
-
}, e.opaque = function (e) {
|
|
215
|
-
const t = (255 | e.rgba) >>> 0;
|
|
216
|
-
return [s, r, o] = h.toChannels(t), {
|
|
217
|
-
css: n.toCss(s, r, o),
|
|
218
|
-
rgba: t
|
|
219
|
-
};
|
|
220
|
-
}, e.opacity = t, e.multiplyOpacity = function (e, s) {
|
|
221
|
-
return i = 255 & e.rgba, t(e, i * s / 255);
|
|
222
|
-
}, e.toColorRGB = function (e) {
|
|
223
|
-
return [e.rgba >> 24 & 255, e.rgba >> 16 & 255, e.rgba >> 8 & 255];
|
|
224
|
-
};
|
|
225
|
-
}(l || (t.color = l = {})), function (e) {
|
|
226
|
-
let t, l;
|
|
227
|
-
try {
|
|
228
|
-
const e = document.createElement("canvas");
|
|
229
|
-
e.width = 1, e.height = 1;
|
|
230
|
-
const s = e.getContext("2d", {
|
|
231
|
-
willReadFrequently: !0
|
|
232
|
-
});
|
|
233
|
-
s && (t = s, t.globalCompositeOperation = "copy", l = t.createLinearGradient(0, 0, 1, 1));
|
|
234
|
-
} catch {}
|
|
235
|
-
e.toColor = function (e) {
|
|
236
|
-
if (e.match(/#[\da-f]{3,8}/i)) switch (e.length) {
|
|
237
|
-
case 4:
|
|
238
|
-
return s = parseInt(e.slice(1, 2).repeat(2), 16), r = parseInt(e.slice(2, 3).repeat(2), 16), o = parseInt(e.slice(3, 4).repeat(2), 16), n.toColor(s, r, o);
|
|
239
|
-
case 5:
|
|
240
|
-
return s = parseInt(e.slice(1, 2).repeat(2), 16), r = parseInt(e.slice(2, 3).repeat(2), 16), o = parseInt(e.slice(3, 4).repeat(2), 16), i = parseInt(e.slice(4, 5).repeat(2), 16), n.toColor(s, r, o, i);
|
|
241
|
-
case 7:
|
|
242
|
-
return {
|
|
243
|
-
css: e,
|
|
244
|
-
rgba: (parseInt(e.slice(1), 16) << 8 | 255) >>> 0
|
|
245
|
-
};
|
|
246
|
-
case 9:
|
|
247
|
-
return {
|
|
248
|
-
css: e,
|
|
249
|
-
rgba: parseInt(e.slice(1), 16) >>> 0
|
|
250
|
-
};
|
|
251
|
-
}
|
|
252
|
-
const a = e.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);
|
|
253
|
-
if (a) return s = parseInt(a[1]), r = parseInt(a[2]), o = parseInt(a[3]), i = Math.round(255 * (void 0 === a[5] ? 1 : parseFloat(a[5]))), n.toColor(s, r, o, i);
|
|
254
|
-
if (!t || !l) throw new Error("css.toColor: Unsupported css format");
|
|
255
|
-
if (t.fillStyle = l, t.fillStyle = e, "string" != typeof t.fillStyle) throw new Error("css.toColor: Unsupported css format");
|
|
256
|
-
if (t.fillRect(0, 0, 1, 1), [s, r, o, i] = t.getImageData(0, 0, 1, 1).data, 255 !== i) throw new Error("css.toColor: Unsupported css format");
|
|
257
|
-
return {
|
|
258
|
-
rgba: n.toRgba(s, r, o, i),
|
|
259
|
-
css: e
|
|
260
|
-
};
|
|
261
|
-
};
|
|
262
|
-
}(a || (t.css = a = {})), function (e) {
|
|
263
|
-
function t(e, t, s) {
|
|
264
|
-
const r = e / 255,
|
|
265
|
-
o = t / 255,
|
|
266
|
-
i = s / 255;
|
|
267
|
-
return .2126 * (r <= .03928 ? r / 12.92 : Math.pow((r + .055) / 1.055, 2.4)) + .7152 * (o <= .03928 ? o / 12.92 : Math.pow((o + .055) / 1.055, 2.4)) + .0722 * (i <= .03928 ? i / 12.92 : Math.pow((i + .055) / 1.055, 2.4));
|
|
268
|
-
}
|
|
269
|
-
e.relativeLuminance = function (e) {
|
|
270
|
-
return t(e >> 16 & 255, e >> 8 & 255, 255 & e);
|
|
271
|
-
}, e.relativeLuminance2 = t;
|
|
272
|
-
}(c || (t.rgb = c = {})), function (e) {
|
|
273
|
-
function t(e, t, s) {
|
|
274
|
-
const r = e >> 24 & 255,
|
|
275
|
-
o = e >> 16 & 255,
|
|
276
|
-
i = e >> 8 & 255;
|
|
277
|
-
let n = t >> 24 & 255,
|
|
278
|
-
l = t >> 16 & 255,
|
|
279
|
-
a = t >> 8 & 255,
|
|
280
|
-
h = _(c.relativeLuminance2(n, l, a), c.relativeLuminance2(r, o, i));
|
|
281
|
-
for (; h < s && (n > 0 || l > 0 || a > 0);) n -= Math.max(0, Math.ceil(.1 * n)), l -= Math.max(0, Math.ceil(.1 * l)), a -= Math.max(0, Math.ceil(.1 * a)), h = _(c.relativeLuminance2(n, l, a), c.relativeLuminance2(r, o, i));
|
|
282
|
-
return (n << 24 | l << 16 | a << 8 | 255) >>> 0;
|
|
283
|
-
}
|
|
284
|
-
function l(e, t, s) {
|
|
285
|
-
const r = e >> 24 & 255,
|
|
286
|
-
o = e >> 16 & 255,
|
|
287
|
-
i = e >> 8 & 255;
|
|
288
|
-
let n = t >> 24 & 255,
|
|
289
|
-
l = t >> 16 & 255,
|
|
290
|
-
a = t >> 8 & 255,
|
|
291
|
-
h = _(c.relativeLuminance2(n, l, a), c.relativeLuminance2(r, o, i));
|
|
292
|
-
for (; h < s && (n < 255 || l < 255 || a < 255);) n = Math.min(255, n + Math.ceil(.1 * (255 - n))), l = Math.min(255, l + Math.ceil(.1 * (255 - l))), a = Math.min(255, a + Math.ceil(.1 * (255 - a))), h = _(c.relativeLuminance2(n, l, a), c.relativeLuminance2(r, o, i));
|
|
293
|
-
return (n << 24 | l << 16 | a << 8 | 255) >>> 0;
|
|
294
|
-
}
|
|
295
|
-
e.blend = function (e, t) {
|
|
296
|
-
if (i = (255 & t) / 255, 1 === i) return t;
|
|
297
|
-
const l = t >> 24 & 255,
|
|
298
|
-
a = t >> 16 & 255,
|
|
299
|
-
c = t >> 8 & 255,
|
|
300
|
-
h = e >> 24 & 255,
|
|
301
|
-
u = e >> 16 & 255,
|
|
302
|
-
_ = e >> 8 & 255;
|
|
303
|
-
return s = h + Math.round((l - h) * i), r = u + Math.round((a - u) * i), o = _ + Math.round((c - _) * i), n.toRgba(s, r, o);
|
|
304
|
-
}, e.ensureContrastRatio = function (e, s, r) {
|
|
305
|
-
const o = c.relativeLuminance(e >> 8),
|
|
306
|
-
i = c.relativeLuminance(s >> 8);
|
|
307
|
-
if (_(o, i) < r) {
|
|
308
|
-
if (i < o) {
|
|
309
|
-
const i = t(e, s, r),
|
|
310
|
-
n = _(o, c.relativeLuminance(i >> 8));
|
|
311
|
-
if (n < r) {
|
|
312
|
-
const t = l(e, s, r);
|
|
313
|
-
return n > _(o, c.relativeLuminance(t >> 8)) ? i : t;
|
|
314
|
-
}
|
|
315
|
-
return i;
|
|
316
|
-
}
|
|
317
|
-
const n = l(e, s, r),
|
|
318
|
-
a = _(o, c.relativeLuminance(n >> 8));
|
|
319
|
-
if (a < r) {
|
|
320
|
-
const i = t(e, s, r);
|
|
321
|
-
return a > _(o, c.relativeLuminance(i >> 8)) ? n : i;
|
|
322
|
-
}
|
|
323
|
-
return n;
|
|
324
|
-
}
|
|
325
|
-
}, e.reduceLuminance = t, e.increaseLuminance = l, e.toChannels = function (e) {
|
|
326
|
-
return [e >> 24 & 255, e >> 16 & 255, e >> 8 & 255, 255 & e];
|
|
327
|
-
};
|
|
328
|
-
}(h || (t.rgba = h = {})), t.toPaddedHex = u, t.contrastRatio = _;
|
|
329
|
-
},
|
|
330
|
-
345: (e, t) => {
|
|
331
|
-
Object.defineProperty(t, "__esModule", {
|
|
332
|
-
value: !0
|
|
333
|
-
}), t.runAndSubscribe = t.forwardEvent = t.EventEmitter = void 0, t.EventEmitter = class {
|
|
334
|
-
constructor() {
|
|
335
|
-
this._listeners = [], this._disposed = !1;
|
|
336
|
-
}
|
|
337
|
-
get event() {
|
|
338
|
-
return this._event || (this._event = e => (this._listeners.push(e), {
|
|
339
|
-
dispose: () => {
|
|
340
|
-
if (!this._disposed) for (let t = 0; t < this._listeners.length; t++) if (this._listeners[t] === e) return void this._listeners.splice(t, 1);
|
|
341
|
-
}
|
|
342
|
-
})), this._event;
|
|
343
|
-
}
|
|
344
|
-
fire(e, t) {
|
|
345
|
-
const s = [];
|
|
346
|
-
for (let e = 0; e < this._listeners.length; e++) s.push(this._listeners[e]);
|
|
347
|
-
for (let r = 0; r < s.length; r++) s[r].call(void 0, e, t);
|
|
348
|
-
}
|
|
349
|
-
dispose() {
|
|
350
|
-
this.clearListeners(), this._disposed = !0;
|
|
351
|
-
}
|
|
352
|
-
clearListeners() {
|
|
353
|
-
this._listeners && (this._listeners.length = 0);
|
|
354
|
-
}
|
|
355
|
-
}, t.forwardEvent = function (e, t) {
|
|
356
|
-
return e(e => t.fire(e));
|
|
357
|
-
}, t.runAndSubscribe = function (e, t) {
|
|
358
|
-
return t(void 0), e(e => t(e));
|
|
359
|
-
};
|
|
360
|
-
},
|
|
361
|
-
859: (e, t) => {
|
|
362
|
-
function s(e) {
|
|
363
|
-
for (const t of e) t.dispose();
|
|
364
|
-
e.length = 0;
|
|
365
|
-
}
|
|
366
|
-
Object.defineProperty(t, "__esModule", {
|
|
367
|
-
value: !0
|
|
368
|
-
}), t.getDisposeArrayDisposable = t.disposeArray = t.toDisposable = t.MutableDisposable = t.Disposable = void 0, t.Disposable = class {
|
|
369
|
-
constructor() {
|
|
370
|
-
this._disposables = [], this._isDisposed = !1;
|
|
371
|
-
}
|
|
372
|
-
dispose() {
|
|
373
|
-
this._isDisposed = !0;
|
|
374
|
-
for (const e of this._disposables) e.dispose();
|
|
375
|
-
this._disposables.length = 0;
|
|
376
|
-
}
|
|
377
|
-
register(e) {
|
|
378
|
-
return this._disposables.push(e), e;
|
|
379
|
-
}
|
|
380
|
-
unregister(e) {
|
|
381
|
-
const t = this._disposables.indexOf(e);
|
|
382
|
-
-1 !== t && this._disposables.splice(t, 1);
|
|
383
|
-
}
|
|
384
|
-
}, t.MutableDisposable = class {
|
|
385
|
-
constructor() {
|
|
386
|
-
this._isDisposed = !1;
|
|
387
|
-
}
|
|
388
|
-
get value() {
|
|
389
|
-
return this._isDisposed ? void 0 : this._value;
|
|
390
|
-
}
|
|
391
|
-
set value(e) {
|
|
392
|
-
this._isDisposed || e === this._value || (this._value?.dispose(), this._value = e);
|
|
393
|
-
}
|
|
394
|
-
clear() {
|
|
395
|
-
this.value = void 0;
|
|
396
|
-
}
|
|
397
|
-
dispose() {
|
|
398
|
-
this._isDisposed = !0, this._value?.dispose(), this._value = void 0;
|
|
399
|
-
}
|
|
400
|
-
}, t.toDisposable = function (e) {
|
|
401
|
-
return {
|
|
402
|
-
dispose: e
|
|
403
|
-
};
|
|
404
|
-
}, t.disposeArray = s, t.getDisposeArrayDisposable = function (e) {
|
|
405
|
-
return {
|
|
406
|
-
dispose: () => s(e)
|
|
407
|
-
};
|
|
408
|
-
};
|
|
409
|
-
},
|
|
410
|
-
485: (e, t) => {
|
|
411
|
-
Object.defineProperty(t, "__esModule", {
|
|
412
|
-
value: !0
|
|
413
|
-
}), t.FourKeyMap = t.TwoKeyMap = void 0;
|
|
414
|
-
class s {
|
|
415
|
-
constructor() {
|
|
416
|
-
this._data = {};
|
|
417
|
-
}
|
|
418
|
-
set(e, t, s) {
|
|
419
|
-
this._data[e] || (this._data[e] = {}), this._data[e][t] = s;
|
|
420
|
-
}
|
|
421
|
-
get(e, t) {
|
|
422
|
-
return this._data[e] ? this._data[e][t] : void 0;
|
|
423
|
-
}
|
|
424
|
-
clear() {
|
|
425
|
-
this._data = {};
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
t.TwoKeyMap = s, t.FourKeyMap = class {
|
|
429
|
-
constructor() {
|
|
430
|
-
this._data = new s();
|
|
431
|
-
}
|
|
432
|
-
set(e, t, r, o, i) {
|
|
433
|
-
this._data.get(e, t) || this._data.set(e, t, new s()), this._data.get(e, t).set(r, o, i);
|
|
434
|
-
}
|
|
435
|
-
get(e, t, s, r) {
|
|
436
|
-
return this._data.get(e, t)?.get(s, r);
|
|
437
|
-
}
|
|
438
|
-
clear() {
|
|
439
|
-
this._data.clear();
|
|
440
|
-
}
|
|
441
|
-
};
|
|
442
|
-
},
|
|
443
|
-
726: (e, t) => {
|
|
444
|
-
Object.defineProperty(t, "__esModule", {
|
|
445
|
-
value: !0
|
|
446
|
-
}), t.createDecorator = t.getServiceDependencies = t.serviceRegistry = void 0;
|
|
447
|
-
const s = "di$target",
|
|
448
|
-
r = "di$dependencies";
|
|
449
|
-
t.serviceRegistry = new Map(), t.getServiceDependencies = function (e) {
|
|
450
|
-
return e[r] || [];
|
|
451
|
-
}, t.createDecorator = function (e) {
|
|
452
|
-
if (t.serviceRegistry.has(e)) return t.serviceRegistry.get(e);
|
|
453
|
-
const o = function (e, t, i) {
|
|
454
|
-
if (3 !== arguments.length) throw new Error("@IServiceName-decorator can only be used to decorate a parameter");
|
|
455
|
-
!function (e, t, o) {
|
|
456
|
-
t[s] === t ? t[r].push({
|
|
457
|
-
id: e,
|
|
458
|
-
index: o
|
|
459
|
-
}) : (t[r] = [{
|
|
460
|
-
id: e,
|
|
461
|
-
index: o
|
|
462
|
-
}], t[s] = t);
|
|
463
|
-
}(o, e, i);
|
|
464
|
-
};
|
|
465
|
-
return o.toString = () => e, t.serviceRegistry.set(e, o), o;
|
|
466
|
-
};
|
|
467
|
-
},
|
|
468
|
-
97: (e, t, s) => {
|
|
469
|
-
Object.defineProperty(t, "__esModule", {
|
|
470
|
-
value: !0
|
|
471
|
-
}), t.IDecorationService = t.IUnicodeService = t.IOscLinkService = t.IOptionsService = t.ILogService = t.LogLevelEnum = t.IInstantiationService = t.ICharsetService = t.ICoreService = t.ICoreMouseService = t.IBufferService = void 0;
|
|
472
|
-
const r = s(726);
|
|
473
|
-
var o;
|
|
474
|
-
t.IBufferService = (0, r.createDecorator)("BufferService"), t.ICoreMouseService = (0, r.createDecorator)("CoreMouseService"), t.ICoreService = (0, r.createDecorator)("CoreService"), t.ICharsetService = (0, r.createDecorator)("CharsetService"), t.IInstantiationService = (0, r.createDecorator)("InstantiationService"), function (e) {
|
|
475
|
-
e[e.TRACE = 0] = "TRACE", e[e.DEBUG = 1] = "DEBUG", e[e.INFO = 2] = "INFO", e[e.WARN = 3] = "WARN", e[e.ERROR = 4] = "ERROR", e[e.OFF = 5] = "OFF";
|
|
476
|
-
}(o || (t.LogLevelEnum = o = {})), t.ILogService = (0, r.createDecorator)("LogService"), t.IOptionsService = (0, r.createDecorator)("OptionsService"), t.IOscLinkService = (0, r.createDecorator)("OscLinkService"), t.IUnicodeService = (0, r.createDecorator)("UnicodeService"), t.IDecorationService = (0, r.createDecorator)("DecorationService");
|
|
477
|
-
}
|
|
478
|
-
},
|
|
479
|
-
t = {};
|
|
480
|
-
function s(r) {
|
|
481
|
-
var o = t[r];
|
|
482
|
-
if (void 0 !== o) return o.exports;
|
|
483
|
-
var i = t[r] = {
|
|
484
|
-
exports: {}
|
|
485
|
-
};
|
|
486
|
-
return e[r].call(i.exports, i, i.exports, s), i.exports;
|
|
487
|
-
}
|
|
488
|
-
var r = {};
|
|
489
|
-
return (() => {
|
|
490
|
-
var e = r;
|
|
491
|
-
Object.defineProperty(e, "__esModule", {
|
|
492
|
-
value: !0
|
|
493
|
-
}), e.HTMLSerializeHandler = e.SerializeAddon = void 0;
|
|
494
|
-
const t = s(997);
|
|
495
|
-
function o(e, t, s) {
|
|
496
|
-
return Math.max(t, Math.min(e, s));
|
|
497
|
-
}
|
|
498
|
-
class i {
|
|
499
|
-
constructor(e) {
|
|
500
|
-
this._buffer = e;
|
|
501
|
-
}
|
|
502
|
-
serialize(e, t) {
|
|
503
|
-
const s = this._buffer.getNullCell(),
|
|
504
|
-
r = this._buffer.getNullCell();
|
|
505
|
-
let o = s;
|
|
506
|
-
const i = e.start.y,
|
|
507
|
-
n = e.end.y,
|
|
508
|
-
l = e.start.x,
|
|
509
|
-
a = e.end.x;
|
|
510
|
-
this._beforeSerialize(n - i, i, n);
|
|
511
|
-
for (let t = i; t <= n; t++) {
|
|
512
|
-
const i = this._buffer.getLine(t);
|
|
513
|
-
if (i) {
|
|
514
|
-
const n = t === e.start.y ? l : 0,
|
|
515
|
-
c = t === e.end.y ? a : i.length;
|
|
516
|
-
for (let e = n; e < c; e++) {
|
|
517
|
-
const n = i.getCell(e, o === s ? r : s);
|
|
518
|
-
n ? (this._nextCell(n, o, t, e), o = n) : console.warn(`Can't get cell at row=${t}, col=${e}`);
|
|
519
|
-
}
|
|
520
|
-
}
|
|
521
|
-
this._rowEnd(t, t === n);
|
|
522
|
-
}
|
|
523
|
-
return this._afterSerialize(), this._serializeString(t);
|
|
524
|
-
}
|
|
525
|
-
_nextCell(e, t, s, r) {}
|
|
526
|
-
_rowEnd(e, t) {}
|
|
527
|
-
_beforeSerialize(e, t, s) {}
|
|
528
|
-
_afterSerialize() {}
|
|
529
|
-
_serializeString(e) {
|
|
530
|
-
return "";
|
|
531
|
-
}
|
|
532
|
-
}
|
|
533
|
-
function n(e, t) {
|
|
534
|
-
return e.getFgColorMode() === t.getFgColorMode() && e.getFgColor() === t.getFgColor();
|
|
535
|
-
}
|
|
536
|
-
function l(e, t) {
|
|
537
|
-
return e.getBgColorMode() === t.getBgColorMode() && e.getBgColor() === t.getBgColor();
|
|
538
|
-
}
|
|
539
|
-
function a(e, t) {
|
|
540
|
-
return e.isInverse() === t.isInverse() && e.isBold() === t.isBold() && e.isUnderline() === t.isUnderline() && e.isOverline() === t.isOverline() && e.isBlink() === t.isBlink() && e.isInvisible() === t.isInvisible() && e.isItalic() === t.isItalic() && e.isDim() === t.isDim() && e.isStrikethrough() === t.isStrikethrough();
|
|
541
|
-
}
|
|
542
|
-
class c extends i {
|
|
543
|
-
constructor(e, t) {
|
|
544
|
-
super(e), this._terminal = t, this._rowIndex = 0, this._allRows = new Array(), this._allRowSeparators = new Array(), this._currentRow = "", this._nullCellCount = 0, this._cursorStyle = this._buffer.getNullCell(), this._cursorStyleRow = 0, this._cursorStyleCol = 0, this._backgroundCell = this._buffer.getNullCell(), this._firstRow = 0, this._lastCursorRow = 0, this._lastCursorCol = 0, this._lastContentCursorRow = 0, this._lastContentCursorCol = 0, this._thisRowLastChar = this._buffer.getNullCell(), this._thisRowLastSecondChar = this._buffer.getNullCell(), this._nextRowFirstChar = this._buffer.getNullCell();
|
|
545
|
-
}
|
|
546
|
-
_beforeSerialize(e, t, s) {
|
|
547
|
-
this._allRows = new Array(e), this._lastContentCursorRow = t, this._lastCursorRow = t, this._firstRow = t;
|
|
548
|
-
}
|
|
549
|
-
_rowEnd(e, t) {
|
|
550
|
-
this._nullCellCount > 0 && !l(this._cursorStyle, this._backgroundCell) && (this._currentRow += `[${this._nullCellCount}X`);
|
|
551
|
-
let s = "";
|
|
552
|
-
if (!t) {
|
|
553
|
-
e - this._firstRow >= this._terminal.rows && this._buffer.getLine(this._cursorStyleRow)?.getCell(this._cursorStyleCol, this._backgroundCell);
|
|
554
|
-
const t = this._buffer.getLine(e),
|
|
555
|
-
r = this._buffer.getLine(e + 1);
|
|
556
|
-
if (r.isWrapped) {
|
|
557
|
-
s = "";
|
|
558
|
-
const o = t.getCell(t.length - 1, this._thisRowLastChar),
|
|
559
|
-
i = t.getCell(t.length - 2, this._thisRowLastSecondChar),
|
|
560
|
-
n = r.getCell(0, this._nextRowFirstChar),
|
|
561
|
-
a = n.getWidth() > 1;
|
|
562
|
-
let c = !1;
|
|
563
|
-
(n.getChars() && a ? this._nullCellCount <= 1 : this._nullCellCount <= 0) && ((o.getChars() || 0 === o.getWidth()) && l(o, n) && (c = !0), a && (i.getChars() || 0 === i.getWidth()) && l(o, n) && l(i, n) && (c = !0)), c || (s = "-".repeat(this._nullCellCount + 1), s += "[1D[1X", this._nullCellCount > 0 && (s += "[A", s += `[${t.length - this._nullCellCount}C`, s += `[${this._nullCellCount}X`, s += `[${t.length - this._nullCellCount}D`, s += "[B"), this._lastContentCursorRow = e + 1, this._lastContentCursorCol = 0, this._lastCursorRow = e + 1, this._lastCursorCol = 0);
|
|
564
|
-
} else s = "\r\n", this._lastCursorRow = e + 1, this._lastCursorCol = 0;
|
|
565
|
-
}
|
|
566
|
-
this._allRows[this._rowIndex] = this._currentRow, this._allRowSeparators[this._rowIndex++] = s, this._currentRow = "", this._nullCellCount = 0;
|
|
567
|
-
}
|
|
568
|
-
_diffStyle(e, t) {
|
|
569
|
-
const s = [],
|
|
570
|
-
r = !n(e, t),
|
|
571
|
-
o = !l(e, t),
|
|
572
|
-
i = !a(e, t);
|
|
573
|
-
if (r || o || i) if (e.isAttributeDefault()) t.isAttributeDefault() || s.push(0);else {
|
|
574
|
-
if (r) {
|
|
575
|
-
const t = e.getFgColor();
|
|
576
|
-
e.isFgRGB() ? s.push(38, 2, t >>> 16 & 255, t >>> 8 & 255, 255 & t) : e.isFgPalette() ? t >= 16 ? s.push(38, 5, t) : s.push(8 & t ? 90 + (7 & t) : 30 + (7 & t)) : s.push(39);
|
|
577
|
-
}
|
|
578
|
-
if (o) {
|
|
579
|
-
const t = e.getBgColor();
|
|
580
|
-
e.isBgRGB() ? s.push(48, 2, t >>> 16 & 255, t >>> 8 & 255, 255 & t) : e.isBgPalette() ? t >= 16 ? s.push(48, 5, t) : s.push(8 & t ? 100 + (7 & t) : 40 + (7 & t)) : s.push(49);
|
|
581
|
-
}
|
|
582
|
-
i && (e.isInverse() !== t.isInverse() && s.push(e.isInverse() ? 7 : 27), e.isBold() !== t.isBold() && s.push(e.isBold() ? 1 : 22), e.isUnderline() !== t.isUnderline() && s.push(e.isUnderline() ? 4 : 24), e.isOverline() !== t.isOverline() && s.push(e.isOverline() ? 53 : 55), e.isBlink() !== t.isBlink() && s.push(e.isBlink() ? 5 : 25), e.isInvisible() !== t.isInvisible() && s.push(e.isInvisible() ? 8 : 28), e.isItalic() !== t.isItalic() && s.push(e.isItalic() ? 3 : 23), e.isDim() !== t.isDim() && s.push(e.isDim() ? 2 : 22), e.isStrikethrough() !== t.isStrikethrough() && s.push(e.isStrikethrough() ? 9 : 29));
|
|
583
|
-
}
|
|
584
|
-
return s;
|
|
585
|
-
}
|
|
586
|
-
_nextCell(e, t, s, r) {
|
|
587
|
-
if (0 === e.getWidth()) return;
|
|
588
|
-
const o = "" === e.getChars(),
|
|
589
|
-
i = this._diffStyle(e, this._cursorStyle);
|
|
590
|
-
if (o ? !l(this._cursorStyle, e) : i.length > 0) {
|
|
591
|
-
this._nullCellCount > 0 && (l(this._cursorStyle, this._backgroundCell) || (this._currentRow += `[${this._nullCellCount}X`), this._currentRow += `[${this._nullCellCount}C`, this._nullCellCount = 0), this._lastContentCursorRow = this._lastCursorRow = s, this._lastContentCursorCol = this._lastCursorCol = r, this._currentRow += `[${i.join(";")}m`;
|
|
592
|
-
const e = this._buffer.getLine(s);
|
|
593
|
-
void 0 !== e && (e.getCell(r, this._cursorStyle), this._cursorStyleRow = s, this._cursorStyleCol = r);
|
|
594
|
-
}
|
|
595
|
-
o ? this._nullCellCount += e.getWidth() : (this._nullCellCount > 0 && (l(this._cursorStyle, this._backgroundCell) || (this._currentRow += `[${this._nullCellCount}X`), this._currentRow += `[${this._nullCellCount}C`, this._nullCellCount = 0), this._currentRow += e.getChars(), this._lastContentCursorRow = this._lastCursorRow = s, this._lastContentCursorCol = this._lastCursorCol = r + e.getWidth());
|
|
596
|
-
}
|
|
597
|
-
_serializeString(e) {
|
|
598
|
-
let t = this._allRows.length;
|
|
599
|
-
this._buffer.length - this._firstRow <= this._terminal.rows && (t = this._lastContentCursorRow + 1 - this._firstRow, this._lastCursorCol = this._lastContentCursorCol, this._lastCursorRow = this._lastContentCursorRow);
|
|
600
|
-
let s = "";
|
|
601
|
-
for (let e = 0; e < t; e++) s += this._allRows[e], e + 1 < t && (s += this._allRowSeparators[e]);
|
|
602
|
-
if (!e) {
|
|
603
|
-
const e = this._buffer.baseY + this._buffer.cursorY,
|
|
604
|
-
t = this._buffer.cursorX,
|
|
605
|
-
o = e => {
|
|
606
|
-
e > 0 ? s += `[${e}C` : e < 0 && (s += `[${-e}D`);
|
|
607
|
-
};
|
|
608
|
-
(e !== this._lastCursorRow || t !== this._lastCursorCol) && ((r = e - this._lastCursorRow) > 0 ? s += `[${r}B` : r < 0 && (s += `[${-r}A`), o(t - this._lastCursorCol));
|
|
609
|
-
}
|
|
610
|
-
var r;
|
|
611
|
-
const o = this._terminal._core._inputHandler._curAttrData,
|
|
612
|
-
i = this._diffStyle(o, this._cursorStyle);
|
|
613
|
-
return i.length > 0 && (s += `[${i.join(";")}m`), s;
|
|
614
|
-
}
|
|
615
|
-
}
|
|
616
|
-
e.SerializeAddon = class {
|
|
617
|
-
activate(e) {
|
|
618
|
-
this._terminal = e;
|
|
619
|
-
}
|
|
620
|
-
_serializeBufferByScrollback(e, t, s) {
|
|
621
|
-
const r = t.length,
|
|
622
|
-
i = void 0 === s ? r : o(s + e.rows, 0, r);
|
|
623
|
-
return this._serializeBufferByRange(e, t, {
|
|
624
|
-
start: r - i,
|
|
625
|
-
end: r - 1
|
|
626
|
-
}, !1);
|
|
627
|
-
}
|
|
628
|
-
_serializeBufferByRange(e, t, s, r) {
|
|
629
|
-
return new c(t, e).serialize({
|
|
630
|
-
start: {
|
|
631
|
-
x: 0,
|
|
632
|
-
y: "number" == typeof s.start ? s.start : s.start.line
|
|
633
|
-
},
|
|
634
|
-
end: {
|
|
635
|
-
x: e.cols,
|
|
636
|
-
y: "number" == typeof s.end ? s.end : s.end.line
|
|
637
|
-
}
|
|
638
|
-
}, r);
|
|
639
|
-
}
|
|
640
|
-
_serializeBufferAsHTML(e, t) {
|
|
641
|
-
const s = e.buffer.active,
|
|
642
|
-
r = new h(s, e, t);
|
|
643
|
-
if (!t.onlySelection) {
|
|
644
|
-
const i = s.length,
|
|
645
|
-
n = t.scrollback,
|
|
646
|
-
l = void 0 === n ? i : o(n + e.rows, 0, i);
|
|
647
|
-
return r.serialize({
|
|
648
|
-
start: {
|
|
649
|
-
x: 0,
|
|
650
|
-
y: i - l
|
|
651
|
-
},
|
|
652
|
-
end: {
|
|
653
|
-
x: e.cols,
|
|
654
|
-
y: i - 1
|
|
655
|
-
}
|
|
656
|
-
});
|
|
657
|
-
}
|
|
658
|
-
const i = this._terminal?.getSelectionPosition();
|
|
659
|
-
return void 0 !== i ? r.serialize({
|
|
660
|
-
start: {
|
|
661
|
-
x: i.start.x,
|
|
662
|
-
y: i.start.y
|
|
663
|
-
},
|
|
664
|
-
end: {
|
|
665
|
-
x: i.end.x,
|
|
666
|
-
y: i.end.y
|
|
667
|
-
}
|
|
668
|
-
}) : "";
|
|
669
|
-
}
|
|
670
|
-
_serializeModes(e) {
|
|
671
|
-
let t = "";
|
|
672
|
-
const s = e.modes;
|
|
673
|
-
if (s.applicationCursorKeysMode && (t += "[?1h"), s.applicationKeypadMode && (t += "[?66h"), s.bracketedPasteMode && (t += "[?2004h"), s.insertMode && (t += "[4h"), s.originMode && (t += "[?6h"), s.reverseWraparoundMode && (t += "[?45h"), s.sendFocusMode && (t += "[?1004h"), !1 === s.wraparoundMode && (t += "[?7l"), "none" !== s.mouseTrackingMode) switch (s.mouseTrackingMode) {
|
|
674
|
-
case "x10":
|
|
675
|
-
t += "[?9h";
|
|
676
|
-
break;
|
|
677
|
-
case "vt200":
|
|
678
|
-
t += "[?1000h";
|
|
679
|
-
break;
|
|
680
|
-
case "drag":
|
|
681
|
-
t += "[?1002h";
|
|
682
|
-
break;
|
|
683
|
-
case "any":
|
|
684
|
-
t += "[?1003h";
|
|
685
|
-
}
|
|
686
|
-
return t;
|
|
687
|
-
}
|
|
688
|
-
serialize(e) {
|
|
689
|
-
if (!this._terminal) throw new Error("Cannot use addon until it has been loaded");
|
|
690
|
-
let t = e?.range ? this._serializeBufferByRange(this._terminal, this._terminal.buffer.normal, e.range, !0) : this._serializeBufferByScrollback(this._terminal, this._terminal.buffer.normal, e?.scrollback);
|
|
691
|
-
return e?.excludeAltBuffer || "alternate" !== this._terminal.buffer.active.type || (t += `[?1049h[H${this._serializeBufferByScrollback(this._terminal, this._terminal.buffer.alternate, void 0)}`), e?.excludeModes || (t += this._serializeModes(this._terminal)), t;
|
|
692
|
-
}
|
|
693
|
-
serializeAsHTML(e) {
|
|
694
|
-
if (!this._terminal) throw new Error("Cannot use addon until it has been loaded");
|
|
695
|
-
return this._serializeBufferAsHTML(this._terminal, e || {});
|
|
696
|
-
}
|
|
697
|
-
dispose() {}
|
|
698
|
-
};
|
|
699
|
-
class h extends i {
|
|
700
|
-
constructor(e, s, r) {
|
|
701
|
-
super(e), this._terminal = s, this._options = r, this._currentRow = "", this._htmlContent = "", s._core._themeService ? this._ansiColors = s._core._themeService.colors.ansi : this._ansiColors = t.DEFAULT_ANSI_COLORS;
|
|
702
|
-
}
|
|
703
|
-
_padStart(e, t, s) {
|
|
704
|
-
return t >>= 0, s = s ?? " ", e.length > t ? e : ((t -= e.length) > s.length && (s += s.repeat(t / s.length)), s.slice(0, t) + e);
|
|
705
|
-
}
|
|
706
|
-
_beforeSerialize(e, t, s) {
|
|
707
|
-
this._htmlContent += "<html><body>\x3c!--StartFragment--\x3e<pre>";
|
|
708
|
-
let r = "#000000",
|
|
709
|
-
o = "#ffffff";
|
|
710
|
-
this._options.includeGlobalBackground && (r = this._terminal.options.theme?.foreground ?? "#ffffff", o = this._terminal.options.theme?.background ?? "#000000");
|
|
711
|
-
const i = [];
|
|
712
|
-
i.push("color: " + r + ";"), i.push("background-color: " + o + ";"), i.push("font-family: " + this._terminal.options.fontFamily + ";"), i.push("font-size: " + this._terminal.options.fontSize + "px;"), this._htmlContent += "<div style='" + i.join(" ") + "'>";
|
|
713
|
-
}
|
|
714
|
-
_afterSerialize() {
|
|
715
|
-
this._htmlContent += "</div>", this._htmlContent += "</pre>\x3c!--EndFragment--\x3e</body></html>";
|
|
716
|
-
}
|
|
717
|
-
_rowEnd(e, t) {
|
|
718
|
-
this._htmlContent += "<div><span>" + this._currentRow + "</span></div>", this._currentRow = "";
|
|
719
|
-
}
|
|
720
|
-
_getHexColor(e, t) {
|
|
721
|
-
const s = t ? e.getFgColor() : e.getBgColor();
|
|
722
|
-
return (t ? e.isFgRGB() : e.isBgRGB()) ? "#" + [s >> 16 & 255, s >> 8 & 255, 255 & s].map(e => this._padStart(e.toString(16), 2, "0")).join("") : (t ? e.isFgPalette() : e.isBgPalette()) ? this._ansiColors[s].css : void 0;
|
|
723
|
-
}
|
|
724
|
-
_diffStyle(e, t) {
|
|
725
|
-
const s = [],
|
|
726
|
-
r = !n(e, t),
|
|
727
|
-
o = !l(e, t),
|
|
728
|
-
i = !a(e, t);
|
|
729
|
-
if (r || o || i) {
|
|
730
|
-
const t = this._getHexColor(e, !0);
|
|
731
|
-
t && s.push("color: " + t + ";");
|
|
732
|
-
const r = this._getHexColor(e, !1);
|
|
733
|
-
return r && s.push("background-color: " + r + ";"), e.isInverse() && s.push("color: #000000; background-color: #BFBFBF;"), e.isBold() && s.push("font-weight: bold;"), e.isUnderline() && e.isOverline() ? s.push("text-decoration: overline underline;") : e.isUnderline() ? s.push("text-decoration: underline;") : e.isOverline() && s.push("text-decoration: overline;"), e.isBlink() && s.push("text-decoration: blink;"), e.isInvisible() && s.push("visibility: hidden;"), e.isItalic() && s.push("font-style: italic;"), e.isDim() && s.push("opacity: 0.5;"), e.isStrikethrough() && s.push("text-decoration: line-through;"), s;
|
|
734
|
-
}
|
|
735
|
-
}
|
|
736
|
-
_nextCell(e, t, s, r) {
|
|
737
|
-
if (0 === e.getWidth()) return;
|
|
738
|
-
const o = "" === e.getChars(),
|
|
739
|
-
i = this._diffStyle(e, t);
|
|
740
|
-
i && (this._currentRow += 0 === i.length ? "</span><span>" : "</span><span style='" + i.join(" ") + "'>"), this._currentRow += o ? " " : e.getChars();
|
|
741
|
-
}
|
|
742
|
-
_serializeString() {
|
|
743
|
-
return this._htmlContent;
|
|
744
|
-
}
|
|
745
|
-
}
|
|
746
|
-
e.HTMLSerializeHandler = h;
|
|
747
|
-
})(), r;
|
|
748
|
-
})());
|
|
749
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TZXJpYWxpemVBZGRvbi93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vU2VyaWFsaXplQWRkb24vc3JjL2Jyb3dzZXIvQ29sb3JDb250cmFzdENhY2hlLnRzIiwid2VicGFjazovL1NlcmlhbGl6ZUFkZG9uL3NyYy9icm93c2VyL3NlcnZpY2VzL1RoZW1lU2VydmljZS50cyIsIndlYnBhY2s6Ly9TZXJpYWxpemVBZGRvbi9zcmMvY29tbW9uL0NvbG9yLnRzIiwid2VicGFjazovL1NlcmlhbGl6ZUFkZG9uL3NyYy9jb21tb24vRXZlbnRFbWl0dGVyLnRzIiwid2VicGFjazovL1NlcmlhbGl6ZUFkZG9uL3NyYy9jb21tb24vTGlmZWN5Y2xlLnRzIiwid2VicGFjazovL1NlcmlhbGl6ZUFkZG9uL3NyYy9jb21tb24vTXVsdGlLZXlNYXAudHMiLCJ3ZWJwYWNrOi8vU2VyaWFsaXplQWRkb24vc3JjL2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnkudHMiLCJ3ZWJwYWNrOi8vU2VyaWFsaXplQWRkb24vc3JjL2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcy50cyIsIndlYnBhY2s6Ly9TZXJpYWxpemVBZGRvbi93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9TZXJpYWxpemVBZGRvbi9zcmMvU2VyaWFsaXplQWRkb24udHMiLCJmaWxlOi8vL1VzZXJzL2RhbWllbi5tYWlsbGFyZC9kZXYvcGVyc28vanNlbnYtY29yZS9wYWNrYWdlcy9yZWxhdGVkL3Rlc3Qvd2VicGFjazovU2VyaWFsaXplQWRkb24vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwiZmlsZTovLy9Vc2Vycy9kYW1pZW4ubWFpbGxhcmQvZGV2L3BlcnNvL2pzZW52LWNvcmUvcGFja2FnZXMvcmVsYXRlZC90ZXN0L3dlYnBhY2s6L1NlcmlhbGl6ZUFkZG9uL3NyYy9icm93c2VyL0NvbG9yQ29udHJhc3RDYWNoZS50cyIsImZpbGU6Ly8vVXNlcnMvZGFtaWVuLm1haWxsYXJkL2Rldi9wZXJzby9qc2Vudi1jb3JlL3BhY2thZ2VzL3JlbGF0ZWQvdGVzdC93ZWJwYWNrOi9TZXJpYWxpemVBZGRvbi9zcmMvYnJvd3Nlci9zZXJ2aWNlcy9UaGVtZVNlcnZpY2UudHMiLCJmaWxlOi8vL1VzZXJzL2RhbWllbi5tYWlsbGFyZC9kZXYvcGVyc28vanNlbnYtY29yZS9wYWNrYWdlcy9yZWxhdGVkL3Rlc3Qvd2VicGFjazovU2VyaWFsaXplQWRkb24vc3JjL2NvbW1vbi9Db2xvci50cyIsImZpbGU6Ly8vVXNlcnMvZGFtaWVuLm1haWxsYXJkL2Rldi9wZXJzby9qc2Vudi1jb3JlL3BhY2thZ2VzL3JlbGF0ZWQvdGVzdC93ZWJwYWNrOi9TZXJpYWxpemVBZGRvbi9zcmMvY29tbW9uL0V2ZW50RW1pdHRlci50cyIsImZpbGU6Ly8vVXNlcnMvZGFtaWVuLm1haWxsYXJkL2Rldi9wZXJzby9qc2Vudi1jb3JlL3BhY2thZ2VzL3JlbGF0ZWQvdGVzdC93ZWJwYWNrOi9TZXJpYWxpemVBZGRvbi9zcmMvY29tbW9uL0xpZmVjeWNsZS50cyIsImZpbGU6Ly8vVXNlcnMvZGFtaWVuLm1haWxsYXJkL2Rldi9wZXJzby9qc2Vudi1jb3JlL3BhY2thZ2VzL3JlbGF0ZWQvdGVzdC93ZWJwYWNrOi9TZXJpYWxpemVBZGRvbi9zcmMvY29tbW9uL011bHRpS2V5TWFwLnRzIiwiZmlsZTovLy9Vc2Vycy9kYW1pZW4ubWFpbGxhcmQvZGV2L3BlcnNvL2pzZW52LWNvcmUvcGFja2FnZXMvcmVsYXRlZC90ZXN0L3dlYnBhY2s6L1NlcmlhbGl6ZUFkZG9uL3NyYy9jb21tb24vc2VydmljZXMvU2VydmljZVJlZ2lzdHJ5LnRzIiwiZmlsZTovLy9Vc2Vycy9kYW1pZW4ubWFpbGxhcmQvZGV2L3BlcnNvL2pzZW52LWNvcmUvcGFja2FnZXMvcmVsYXRlZC90ZXN0L3dlYnBhY2s6L1NlcmlhbGl6ZUFkZG9uL3NyYy9jb21tb24vc2VydmljZXMvU2VydmljZXMudHMiLCJmaWxlOi8vL1VzZXJzL2RhbWllbi5tYWlsbGFyZC9kZXYvcGVyc28vanNlbnYtY29yZS9wYWNrYWdlcy9yZWxhdGVkL3Rlc3Qvd2VicGFjazovU2VyaWFsaXplQWRkb24vd2VicGFjay9ib290c3RyYXAiLCJmaWxlOi8vL1VzZXJzL2RhbWllbi5tYWlsbGFyZC9kZXYvcGVyc28vanNlbnYtY29yZS9wYWNrYWdlcy9yZWxhdGVkL3Rlc3Qvd2VicGFjazovU2VyaWFsaXplQWRkb24vc3JjL1NlcmlhbGl6ZUFkZG9uLnRzIl0sIm5hbWVzIjpbInJvb3QiLCJmYWN0b3J5IiwiZXhwb3J0cyIsIm1vZHVsZSIsImRlZmluZSIsImFtZCIsInRoaXMiLCJfY29sb3IiLCJUd29LZXlNYXAiLCJfY3NzIiwic2V0Q3NzIiwiYmciLCJmZyIsInZhbHVlIiwic2V0IiwiZ2V0Q3NzIiwiZ2V0Iiwic2V0Q29sb3IiLCJnZXRDb2xvciIsImNsZWFyIiwiREVGQVVMVF9GT1JFR1JPVU5EIiwiY3NzIiwidG9Db2xvciIsIkRFRkFVTFRfQkFDS0dST1VORCIsIkRFRkFVTFRfQ1VSU09SIiwiREVGQVVMVF9DVVJTT1JfQUNDRU5UIiwiREVGQVVMVF9TRUxFQ1RJT04iLCJyZ2JhIiwiREVGQVVMVF9BTlNJX0NPTE9SUyIsIk9iamVjdCIsImZyZWV6ZSIsImNvbG9ycyIsInYiLCJpIiwiciIsImciLCJiIiwicHVzaCIsImNoYW5uZWxzIiwidG9Dc3MiLCJ0b1JnYmEiLCJjIiwiVGhlbWVTZXJ2aWNlIiwiRGlzcG9zYWJsZSIsIl9jb2xvcnMiLCJjb25zdHJ1Y3RvciIsInN1cGVyIiwiX29wdGlvbnNTZXJ2aWNlIiwiX2NvbnRyYXN0Q2FjaGUiLCJDb2xvckNvbnRyYXN0Q2FjaGUiLCJfaGFsZkNvbnRyYXN0Q2FjaGUiLCJfb25DaGFuZ2VDb2xvcnMiLCJyZWdpc3RlciIsIkV2ZW50RW1pdHRlciIsIm9uQ2hhbmdlQ29sb3JzIiwiZXZlbnQiLCJmb3JlZ3JvdW5kIiwiYmFja2dyb3VuZCIsImN1cnNvciIsImN1cnNvckFjY2VudCIsInNlbGVjdGlvbkZvcmVncm91bmQiLCJ1bmRlZmluZWQiLCJzZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQiLCJzZWxlY3Rpb25CYWNrZ3JvdW5kT3BhcXVlIiwiY29sb3IiLCJibGVuZCIsInNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZFRyYW5zcGFyZW50Iiwic2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kT3BhcXVlIiwiYW5zaSIsInNsaWNlIiwiY29udHJhc3RDYWNoZSIsImhhbGZDb250cmFzdENhY2hlIiwiX3VwZGF0ZVJlc3RvcmVDb2xvcnMiLCJfc2V0VGhlbWUiLCJyYXdPcHRpb25zIiwidGhlbWUiLCJvblNwZWNpZmljT3B0aW9uQ2hhbmdlIiwicGFyc2VDb2xvciIsInNlbGVjdGlvbkJhY2tncm91bmQiLCJzZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmQiLCJOVUxMX0NPTE9SIiwiaXNPcGFxdWUiLCJvcGFjaXR5IiwiYmxhY2siLCJyZWQiLCJncmVlbiIsInllbGxvdyIsImJsdWUiLCJtYWdlbnRhIiwiY3lhbiIsIndoaXRlIiwiYnJpZ2h0QmxhY2siLCJicmlnaHRSZWQiLCJicmlnaHRHcmVlbiIsImJyaWdodFllbGxvdyIsImJyaWdodEJsdWUiLCJicmlnaHRNYWdlbnRhIiwiYnJpZ2h0Q3lhbiIsImJyaWdodFdoaXRlIiwiZXh0ZW5kZWRBbnNpIiwiY29sb3JDb3VudCIsIk1hdGgiLCJtaW4iLCJsZW5ndGgiLCJmaXJlIiwicmVzdG9yZUNvbG9yIiwic2xvdCIsIl9yZXN0b3JlQ29sb3IiLCJfcmVzdG9yZUNvbG9ycyIsIm1vZGlmeUNvbG9ycyIsImNhbGxiYWNrIiwiY3NzU3RyaW5nIiwiZmFsbGJhY2siLCJJT3B0aW9uc1NlcnZpY2UiLCIkciIsIiRnIiwiJGIiLCIkYSIsInJnYiIsInRvUGFkZGVkSGV4IiwicyIsInRvU3RyaW5nIiwiY29udHJhc3RSYXRpbyIsImwxIiwibDIiLCJhIiwicm91bmQiLCJ0b0NoYW5uZWxzIiwiZmdSIiwiZmdHIiwiZmdCIiwiYmdSIiwiYmdHIiwiYmdCIiwiZW5zdXJlQ29udHJhc3RSYXRpbyIsInJhdGlvIiwicmVzdWx0Iiwib3BhcXVlIiwicmdiYUNvbG9yIiwibXVsdGlwbHlPcGFjaXR5IiwiZmFjdG9yIiwidG9Db2xvclJHQiIsIiRjdHgiLCIkbGl0bXVzQ29sb3IiLCJjYW52YXMiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJ3aWR0aCIsImhlaWdodCIsImN0eCIsImdldENvbnRleHQiLCJ3aWxsUmVhZEZyZXF1ZW50bHkiLCJnbG9iYWxDb21wb3NpdGVPcGVyYXRpb24iLCJjcmVhdGVMaW5lYXJHcmFkaWVudCIsIm1hdGNoIiwicGFyc2VJbnQiLCJyZXBlYXQiLCJyZ2JhTWF0Y2giLCJwYXJzZUZsb2F0IiwiRXJyb3IiLCJmaWxsU3R5bGUiLCJmaWxsUmVjdCIsImdldEltYWdlRGF0YSIsImRhdGEiLCJyZWxhdGl2ZUx1bWluYW5jZTIiLCJycyIsImdzIiwiYnMiLCJwb3ciLCJyZWxhdGl2ZUx1bWluYW5jZSIsInJlZHVjZUx1bWluYW5jZSIsImJnUmdiYSIsImZnUmdiYSIsImNyIiwibWF4IiwiY2VpbCIsImluY3JlYXNlTHVtaW5hbmNlIiwiYmdMIiwiZmdMIiwicmVzdWx0QSIsInJlc3VsdEFSYXRpbyIsInJlc3VsdEIiLCJfbGlzdGVuZXJzIiwiX2Rpc3Bvc2VkIiwiX2V2ZW50IiwibGlzdGVuZXIiLCJkaXNwb3NlIiwic3BsaWNlIiwiYXJnMSIsImFyZzIiLCJxdWV1ZSIsImNhbGwiLCJjbGVhckxpc3RlbmVycyIsImZyb20iLCJ0byIsImUiLCJoYW5kbGVyIiwiZGlzcG9zZUFycmF5IiwiZGlzcG9zYWJsZXMiLCJkIiwiX2Rpc3Bvc2FibGVzIiwiX2lzRGlzcG9zZWQiLCJ1bnJlZ2lzdGVyIiwiaW5kZXgiLCJpbmRleE9mIiwiX3ZhbHVlIiwiZiIsImFycmF5IiwiX2RhdGEiLCJmaXJzdCIsInNlY29uZCIsInRoaXJkIiwiZm91cnRoIiwiRElfVEFSR0VUIiwiRElfREVQRU5ERU5DSUVTIiwic2VydmljZVJlZ2lzdHJ5IiwiTWFwIiwiY3RvciIsImlkIiwiaGFzIiwiZGVjb3JhdG9yIiwidGFyZ2V0Iiwia2V5IiwiYXJndW1lbnRzIiwic3RvcmVTZXJ2aWNlRGVwZW5kZW5jeSIsIkxvZ0xldmVsRW51bSIsIklCdWZmZXJTZXJ2aWNlIiwiY3JlYXRlRGVjb3JhdG9yIiwiSUNvcmVNb3VzZVNlcnZpY2UiLCJJQ29yZVNlcnZpY2UiLCJJQ2hhcnNldFNlcnZpY2UiLCJJSW5zdGFudGlhdGlvblNlcnZpY2UiLCJJTG9nU2VydmljZSIsIklPc2NMaW5rU2VydmljZSIsIklVbmljb2RlU2VydmljZSIsIklEZWNvcmF0aW9uU2VydmljZSIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsIl9fd2VicGFja19tb2R1bGVzX18iLCJjb25zdHJhaW4iLCJsb3ciLCJoaWdoIiwiQmFzZVNlcmlhbGl6ZUhhbmRsZXIiLCJfYnVmZmVyIiwic2VyaWFsaXplIiwicmFuZ2UiLCJleGNsdWRlRmluYWxDdXJzb3JQb3NpdGlvbiIsImNlbGwxIiwiZ2V0TnVsbENlbGwiLCJjZWxsMiIsIm9sZENlbGwiLCJzdGFydFJvdyIsInN0YXJ0IiwieSIsImVuZFJvdyIsImVuZCIsInN0YXJ0Q29sdW1uIiwieCIsImVuZENvbHVtbiIsIl9iZWZvcmVTZXJpYWxpemUiLCJyb3ciLCJsaW5lIiwiZ2V0TGluZSIsInN0YXJ0TGluZUNvbHVtbiIsImVuZExpbmVDb2x1bW4iLCJjb2wiLCJnZXRDZWxsIiwiX25leHRDZWxsIiwiY29uc29sZSIsIndhcm4iLCJfcm93RW5kIiwiX2FmdGVyU2VyaWFsaXplIiwiX3NlcmlhbGl6ZVN0cmluZyIsImNlbGwiLCJpc0xhc3RSb3ciLCJyb3dzIiwiZXF1YWxGZyIsImdldEZnQ29sb3JNb2RlIiwiZ2V0RmdDb2xvciIsImVxdWFsQmciLCJnZXRCZ0NvbG9yTW9kZSIsImdldEJnQ29sb3IiLCJlcXVhbEZsYWdzIiwiaXNJbnZlcnNlIiwiaXNCb2xkIiwiaXNVbmRlcmxpbmUiLCJpc092ZXJsaW5lIiwiaXNCbGluayIsImlzSW52aXNpYmxlIiwiaXNJdGFsaWMiLCJpc0RpbSIsImlzU3RyaWtldGhyb3VnaCIsIlN0cmluZ1NlcmlhbGl6ZUhhbmRsZXIiLCJidWZmZXIiLCJfdGVybWluYWwiLCJfcm93SW5kZXgiLCJfYWxsUm93cyIsIkFycmF5IiwiX2FsbFJvd1NlcGFyYXRvcnMiLCJfY3VycmVudFJvdyIsIl9udWxsQ2VsbENvdW50IiwiX2N1cnNvclN0eWxlIiwiX2N1cnNvclN0eWxlUm93IiwiX2N1cnNvclN0eWxlQ29sIiwiX2JhY2tncm91bmRDZWxsIiwiX2ZpcnN0Um93IiwiX2xhc3RDdXJzb3JSb3ciLCJfbGFzdEN1cnNvckNvbCIsIl9sYXN0Q29udGVudEN1cnNvclJvdyIsIl9sYXN0Q29udGVudEN1cnNvckNvbCIsIl90aGlzUm93TGFzdENoYXIiLCJfdGhpc1Jvd0xhc3RTZWNvbmRDaGFyIiwiX25leHRSb3dGaXJzdENoYXIiLCJyb3dTZXBhcmF0b3IiLCJjdXJyZW50TGluZSIsIm5leHRMaW5lIiwiaXNXcmFwcGVkIiwidGhpc1Jvd0xhc3RDaGFyIiwidGhpc1Jvd0xhc3RTZWNvbmRDaGFyIiwibmV4dFJvd0ZpcnN0Q2hhciIsImlzTmV4dFJvd0ZpcnN0Q2hhckRvdWJsZVdpZHRoIiwiZ2V0V2lkdGgiLCJpc1ZhbGlkIiwiZ2V0Q2hhcnMiLCJfZGlmZlN0eWxlIiwic2dyU2VxIiwiZmdDaGFuZ2VkIiwiYmdDaGFuZ2VkIiwiZmxhZ3NDaGFuZ2VkIiwiaXNBdHRyaWJ1dGVEZWZhdWx0IiwiaXNGZ1JHQiIsImlzRmdQYWxldHRlIiwiaXNCZ1JHQiIsImlzQmdQYWxldHRlIiwiaXNFbXB0eUNlbGwiLCJqb2luIiwicm93RW5kIiwiY29udGVudCIsInJlYWxDdXJzb3JSb3ciLCJiYXNlWSIsImN1cnNvclkiLCJyZWFsQ3Vyc29yQ29sIiwiY3Vyc29yWCIsIm1vdmVSaWdodCIsIm9mZnNldCIsImN1ckF0dHJEYXRhIiwiX2NvcmUiLCJfaW5wdXRIYW5kbGVyIiwiX2N1ckF0dHJEYXRhIiwiYWN0aXZhdGUiLCJ0ZXJtaW5hbCIsIl9zZXJpYWxpemVCdWZmZXJCeVNjcm9sbGJhY2siLCJzY3JvbGxiYWNrIiwibWF4Um93cyIsImNvcnJlY3RSb3dzIiwiX3NlcmlhbGl6ZUJ1ZmZlckJ5UmFuZ2UiLCJjb2xzIiwiX3NlcmlhbGl6ZUJ1ZmZlckFzSFRNTCIsIm9wdGlvbnMiLCJhY3RpdmUiLCJIVE1MU2VyaWFsaXplSGFuZGxlciIsIm9ubHlTZWxlY3Rpb24iLCJzZWxlY3Rpb24iLCJnZXRTZWxlY3Rpb25Qb3NpdGlvbiIsIl9zZXJpYWxpemVNb2RlcyIsIm1vZGVzIiwiYXBwbGljYXRpb25DdXJzb3JLZXlzTW9kZSIsImFwcGxpY2F0aW9uS2V5cGFkTW9kZSIsImJyYWNrZXRlZFBhc3RlTW9kZSIsImluc2VydE1vZGUiLCJvcmlnaW5Nb2RlIiwicmV2ZXJzZVdyYXBhcm91bmRNb2RlIiwic2VuZEZvY3VzTW9kZSIsIndyYXBhcm91bmRNb2RlIiwibW91c2VUcmFja2luZ01vZGUiLCJub3JtYWwiLCJleGNsdWRlQWx0QnVmZmVyIiwidHlwZSIsImFsdGVybmF0ZSIsImV4Y2x1ZGVNb2RlcyIsInNlcmlhbGl6ZUFzSFRNTCIsIl9vcHRpb25zIiwiX2h0bWxDb250ZW50IiwiX3RoZW1lU2VydmljZSIsIl9hbnNpQ29sb3JzIiwiX3BhZFN0YXJ0IiwidGFyZ2V0TGVuZ3RoIiwicGFkU3RyaW5nIiwiaW5jbHVkZUdsb2JhbEJhY2tncm91bmQiLCJnbG9iYWxTdHlsZURlZmluaXRpb25zIiwiZm9udEZhbWlseSIsImZvbnRTaXplIiwiX2dldEhleENvbG9yIiwiaXNGZyIsIm1hcCIsImZnSGV4Q29sb3IiLCJiZ0hleENvbG9yIiwic3R5bGVEZWZpbml0aW9ucyIsInQiLCJTZXJpYWxpemVBZGRvbiIsIndpbmRvdyIsIm4iLCJsIiwiaCIsInUiLCJfIiwiQyIsIm8iLCJmb3J3YXJkRXZlbnQiLCJydW5BbmRTdWJzY3JpYmUiLCJNdXRhYmxlRGlzcG9zYWJsZSIsInRvRGlzcG9zYWJsZSIsImdldERpc3Bvc2VBcnJheURpc3Bvc2FibGUiLCJGb3VyS2V5TWFwIiwiZ2V0U2VydmljZURlcGVuZGVuY2llcyIsIlRSQUNFIiwiREVCVUciLCJJTkZPIiwiV0FSTiIsIkVSUk9SIiwiT0ZGIl0sIm1hcHBpbmdzIjoiQ1dBQSxBWEFBLFNBQTJDQSxDV0FBbU0sQ0FBQSxBWEFNbE0sRVdBQStZLENBQUEsQVhDMUIsaUJBQVo5WSxTQUEwQyxpQkFBWEMsT0FDeENBLE9BQU9ELFFBQVVELElBQ1EsbUJBQVhHLFFBQXlCQSxPQUFPQyxJQUM5Q0QsT0FBTyxHQUFJSCxHQUNlLGlCQUFaQyxRQUNkQSxRQUF3QixlQUFJRCxJQUU1QkQsRUFBcUIsZUFBSUMsR0FDMUIsQ0FURCxDQVNHSyxNQUFNLEkscUhDRlQsZUFFQSx5Q0FDVSxLQUFBQyxPQUFtRSxJQUFJLEVBQUFDLFVBQ3ZFLEtBQUFDLEtBQWlFLElBQUksRUFBQUQsU0FzQi9FLENBcEJTLE1BQUFFLENBQU9DLEVBQVlDLEVBQVlDLEdBQ3BDUCxLQUFLRyxLQUFLSyxJQUFJSCxFQUFJQyxFQUFJQyxFQUN4QixDQUVPLE1BQUFFLENBQU9KLEVBQVlDLEdBQ3hCLE9BQU9OLEtBQUtHLEtBQUtPLElBQUlMLEVBQUlDLEVBQzNCLENBRU8sUUFBQUssQ0FBU04sRUFBWUMsRUFBWUMsR0FDdENQLEtBQUtDLE9BQU9PLElBQUlILEVBQUlDLEVBQUlDLEVBQzFCLENBRU8sUUFBQUssQ0FBU1AsRUFBWUMsR0FDMUIsT0FBT04sS0FBS0MsT0FBT1MsSUFBSUwsRUFBSUMsRUFDN0IsQ0FFTyxLQUFBTyxHQUNMYixLQUFLQyxPQUFPWSxRQUNaYixLQUFLRyxLQUFLVSxPQUNaLEUsd2hCQzNCRixlQUdBLFNBQ0EsU0FDQSxTQUNBLFFBV01DLEVBQXFCLEVBQUFDLElBQUlDLFFBQVEsV0FDakNDLEVBQXFCLEVBQUFGLElBQUlDLFFBQVEsV0FDakNFLEVBQWlCLEVBQUFILElBQUlDLFFBQVEsV0FDN0JHLEVBQXdCLEVB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QjhKLENBQUEsQ0FBS2tHLGVBQUEsTUFBcUI3SyxDQUFBLENBQVFuRixJQUFBLENBQUssbUNBRXBDbUYsQzs7TUFJWDtNQUVVcUosVUFBVTFFLENBQUEsRUFBbUI2TSxDQUFBLEVBQXNCeFIsQ0FBQSxFQUFhdEYsQ0FBQTtRQUd4RSxJQUQ4QyxNQUFwQmlLLENBQUEsQ0FBS2dJLFFBQUEsSUFFN0I7UUFJRixNQUFNc0YsQ0FBQSxHQUFrQyxPQUFwQnROLENBQUEsQ0FBS2tJLFFBQUE7VUFFbkJwUyxDQUFBLEdBQW1CLEtBQUtxUyxVQUFBLENBQVduSSxDQUFBLEVBQU02TSxDQUFBO1FBRzNDL1csQ0FBQSxLQUNGLEtBQUs0USxXQUFBLElBQTJDLE1BQTVCNVEsQ0FBQSxDQUFpQnNFLE1BQUEsR0FDbkMsa0JBQ0EseUJBQTBCdEUsQ0FBQSxDQUFpQmdULElBQUEsQ0FBSyxPQUFPLE9BS3pELEtBQUtwQyxXQUFBLElBREg0RyxDQUFBLEdBQ2tCLE1BRUF0TixDQUFBLENBQUtrSSxRQUFBLEVBRTdCO01BQUE7TUFFVW5ELGlCQUFBO1FBQ1IsT0FBTyxLQUFLOEcsWUFDZDtNQUFBO0lBQUE7SUFqSkY3TCxDQUFBLENBQUF1SyxvQkFBQSxHQUFBMkMsQyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIlNlcmlhbGl6ZUFkZG9uXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIlNlcmlhbGl6ZUFkZG9uXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgKCkgPT4ge1xucmV0dXJuICIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUNvbG9yQ29udHJhc3RDYWNoZSB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgSUNvbG9yIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IFR3b0tleU1hcCB9IGZyb20gJ2NvbW1vbi9NdWx0aUtleU1hcCc7XG5cbmV4cG9ydCBjbGFzcyBDb2xvckNvbnRyYXN0Q2FjaGUgaW1wbGVtZW50cyBJQ29sb3JDb250cmFzdENhY2hlIHtcbiAgcHJpdmF0ZSBfY29sb3I6IFR3b0tleU1hcDwvKiBiZyAqL251bWJlciwgLyogZmcgKi9udW1iZXIsIElDb2xvciB8IG51bGw+ID0gbmV3IFR3b0tleU1hcCgpO1xuICBwcml2YXRlIF9jc3M6IFR3b0tleU1hcDwvKiBiZyAqL251bWJlciwgLyogZmcgKi9udW1iZXIsIHN0cmluZyB8IG51bGw+ID0gbmV3IFR3b0tleU1hcCgpO1xuXG4gIHB1YmxpYyBzZXRDc3MoYmc6IG51bWJlciwgZmc6IG51bWJlciwgdmFsdWU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLl9jc3Muc2V0KGJnLCBmZywgdmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdldENzcyhiZzogbnVtYmVyLCBmZzogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Nzcy5nZXQoYmcsIGZnKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb2xvcihiZzogbnVtYmVyLCBmZzogbnVtYmVyLCB2YWx1ZTogSUNvbG9yIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuX2NvbG9yLnNldChiZywgZmcsIHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb2xvcihiZzogbnVtYmVyLCBmZzogbnVtYmVyKTogSUNvbG9yIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbG9yLmdldChiZywgZmcpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuX2NvbG9yLmNsZWFyKCk7XG4gICAgdGhpcy5fY3NzLmNsZWFyKCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIyIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgQ29sb3JDb250cmFzdENhY2hlIH0gZnJvbSAnYnJvd3Nlci9Db2xvckNvbnRyYXN0Q2FjaGUnO1xuaW1wb3J0IHsgSVRoZW1lU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgSUNvbG9yQ29udHJhc3RDYWNoZSwgSUNvbG9yU2V0LCBSZWFkb25seUNvbG9yU2V0IH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBjaGFubmVscywgY29sb3IsIGNzcywgTlVMTF9DT0xPUiB9IGZyb20gJ2NvbW1vbi9Db2xvcic7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElPcHRpb25zU2VydmljZSwgSVRoZW1lIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IEFsbENvbG9ySW5kZXgsIElDb2xvciwgU3BlY2lhbENvbG9ySW5kZXggfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5pbnRlcmZhY2UgSVJlc3RvcmVDb2xvclNldCB7XG4gIGZvcmVncm91bmQ6IElDb2xvcjtcbiAgYmFja2dyb3VuZDogSUNvbG9yO1xuICBjdXJzb3I6IElDb2xvcjtcbiAgYW5zaTogSUNvbG9yW107XG59XG5cblxuY29uc3QgREVGQVVMVF9GT1JFR1JPVU5EID0gY3NzLnRvQ29sb3IoJyNmZmZmZmYnKTtcbmNvbnN0IERFRkFVTFRfQkFDS0dST1VORCA9IGNzcy50b0NvbG9yKCcjMDAwMDAwJyk7XG5jb25zdCBERUZBVUxUX0NVUlNPUiA9IGNzcy50b0NvbG9yKCcjZmZmZmZmJyk7XG5jb25zdCBERUZBVUxUX0NVUlNPUl9BQ0NFTlQgPSBjc3MudG9Db2xvcignIzAwMDAwMCcpO1xuY29uc3QgREVGQVVMVF9TRUxFQ1RJT04gPSB7XG4gIGNzczogJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMC4zKScsXG4gIHJnYmE6IDB4RkZGRkZGNERcbn07XG5cbi8vIEFuIElJRkUgdG8gZ2VuZXJhdGUgREVGQVVMVF9BTlNJX0NPTE9SUy5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FOU0lfQ09MT1JTID0gT2JqZWN0LmZyZWV6ZSgoKCkgPT4ge1xuICBjb25zdCBjb2xvcnMgPSBbXG4gICAgLy8gZGFyazpcbiAgICBjc3MudG9Db2xvcignIzJlMzQzNicpLFxuICAgIGNzcy50b0NvbG9yKCcjY2MwMDAwJyksXG4gICAgY3NzLnRvQ29sb3IoJyM0ZTlhMDYnKSxcbiAgICBjc3MudG9Db2xvcignI2M0YTAwMCcpLFxuICAgIGNzcy50b0NvbG9yKCcjMzQ2NWE0JyksXG4gICAgY3NzLnRvQ29sb3IoJyM3NTUwN2InKSxcbiAgICBjc3MudG9Db2xvcignIzA2OTg5YScpLFxuICAgIGNzcy50b0NvbG9yKCcjZDNkN2NmJyksXG4gICAgLy8gYnJpZ2h0OlxuICAgIGNzcy50b0NvbG9yKCcjNTU1NzUzJyksXG4gICAgY3NzLnRvQ29sb3IoJyNlZjI5MjknKSxcbiAgICBjc3MudG9Db2xvcignIzhhZTIzNCcpLFxuICAgIGNzcy50b0NvbG9yKCcjZmNlOTRmJyksXG4gICAgY3NzLnRvQ29sb3IoJyM3MjlmY2YnKSxcbiAgICBjc3MudG9Db2xvcignI2FkN2ZhOCcpLFxuICAgIGNzcy50b0NvbG9yKCcjMzRlMmUyJyksXG4gICAgY3NzLnRvQ29sb3IoJyNlZWVlZWMnKVxuICBdO1xuXG4gIC8vIEZpbGwgaW4gdGhlIHJlbWFpbmluZyAyNDAgQU5TSSBjb2xvcnMuXG4gIC8vIEdlbmVyYXRlIGNvbG9ycyAoMTYtMjMxKVxuICBjb25zdCB2ID0gWzB4MDAsIDB4NWYsIDB4ODcsIDB4YWYsIDB4ZDcsIDB4ZmZdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IDIxNjsgaSsrKSB7XG4gICAgY29uc3QgciA9IHZbKGkgLyAzNikgJSA2IHwgMF07XG4gICAgY29uc3QgZyA9IHZbKGkgLyA2KSAlIDYgfCAwXTtcbiAgICBjb25zdCBiID0gdltpICUgNl07XG4gICAgY29sb3JzLnB1c2goe1xuICAgICAgY3NzOiBjaGFubmVscy50b0NzcyhyLCBnLCBiKSxcbiAgICAgIHJnYmE6IGNoYW5uZWxzLnRvUmdiYShyLCBnLCBiKVxuICAgIH0pO1xuICB9XG5cbiAgLy8gR2VuZXJhdGUgZ3JleXMgKDIzMi0yNTUpXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMjQ7IGkrKykge1xuICAgIGNvbnN0IGMgPSA4ICsgaSAqIDEwO1xuICAgIGNvbG9ycy5wdXNoKHtcbiAgICAgIGNzczogY2hhbm5lbHMudG9Dc3MoYywgYywgYyksXG4gICAgICByZ2JhOiBjaGFubmVscy50b1JnYmEoYywgYywgYylcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBjb2xvcnM7XG59KSgpKTtcblxuZXhwb3J0IGNsYXNzIFRoZW1lU2VydmljZSBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJVGhlbWVTZXJ2aWNlIHtcbiAgcHVibGljIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgX2NvbG9yczogSUNvbG9yU2V0O1xuICBwcml2YXRlIF9jb250cmFzdENhY2hlOiBJQ29sb3JDb250cmFzdENhY2hlID0gbmV3IENvbG9yQ29udHJhc3RDYWNoZSgpO1xuICBwcml2YXRlIF9oYWxmQ29udHJhc3RDYWNoZTogSUNvbG9yQ29udHJhc3RDYWNoZSA9IG5ldyBDb2xvckNvbnRyYXN0Q2FjaGUoKTtcbiAgcHJpdmF0ZSBfcmVzdG9yZUNvbG9ycyE6IElSZXN0b3JlQ29sb3JTZXQ7XG5cbiAgcHVibGljIGdldCBjb2xvcnMoKTogUmVhZG9ubHlDb2xvclNldCB7IHJldHVybiB0aGlzLl9jb2xvcnM7IH1cblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbkNoYW5nZUNvbG9ycyA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxSZWFkb25seUNvbG9yU2V0PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQ2hhbmdlQ29sb3JzID0gdGhpcy5fb25DaGFuZ2VDb2xvcnMuZXZlbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQElPcHRpb25zU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9jb2xvcnMgPSB7XG4gICAgICBmb3JlZ3JvdW5kOiBERUZBVUxUX0ZPUkVHUk9VTkQsXG4gICAgICBiYWNrZ3JvdW5kOiBERUZBVUxUX0JBQ0tHUk9VTkQsXG4gICAgICBjdXJzb3I6IERFRkFVTFRfQ1VSU09SLFxuICAgICAgY3Vyc29yQWNjZW50OiBERUZBVUxUX0NVUlNPUl9BQ0NFTlQsXG4gICAgICBzZWxlY3Rpb25Gb3JlZ3JvdW5kOiB1bmRlZmluZWQsXG4gICAgICBzZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQ6IERFRkFVTFRfU0VMRUNUSU9OLFxuICAgICAgc2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZTogY29sb3IuYmxlbmQoREVGQVVMVF9CQUNLR1JPVU5ELCBERUZBVUxUX1NFTEVDVElPTiksXG4gICAgICBzZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRUcmFuc3BhcmVudDogREVGQVVMVF9TRUxFQ1RJT04sXG4gICAgICBzZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRPcGFxdWU6IGNvbG9yLmJsZW5kKERFRkFVTFRfQkFDS0dST1VORCwgREVGQVVMVF9TRUxFQ1RJT04pLFxuICAgICAgYW5zaTogREVGQVVMVF9BTlNJX0NPTE9SUy5zbGljZSgpLFxuICAgICAgY29udHJhc3RDYWNoZTogdGhpcy5fY29udHJhc3RDYWNoZSxcbiAgICAgIGhhbGZDb250cmFzdENhY2hlOiB0aGlzLl9oYWxmQ29udHJhc3RDYWNoZVxuICAgIH07XG4gICAgdGhpcy5fdXBkYXRlUmVzdG9yZUNvbG9ycygpO1xuICAgIHRoaXMuX3NldFRoZW1lKHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMudGhlbWUpO1xuXG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9vcHRpb25zU2VydmljZS5vblNwZWNpZmljT3B0aW9uQ2hhbmdlKCdtaW5pbXVtQ29udHJhc3RSYXRpbycsICgpID0+IHRoaXMuX2NvbnRyYXN0Q2FjaGUuY2xlYXIoKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fb3B0aW9uc1NlcnZpY2Uub25TcGVjaWZpY09wdGlvbkNoYW5nZSgndGhlbWUnLCAoKSA9PiB0aGlzLl9zZXRUaGVtZSh0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnRoZW1lKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHRlcm1pbmFsJ3MgdGhlbWUuXG4gICAqIEBwYXJhbSB0aGVtZSBUaGUgIHRoZW1lIHRvIHVzZS4gSWYgYSBwYXJ0aWFsIHRoZW1lIGlzIHByb3ZpZGVkIHRoZW4gZGVmYXVsdFxuICAgKiBjb2xvcnMgd2lsbCBiZSB1c2VkIHdoZXJlIGNvbG9ycyBhcmUgbm90IGRlZmluZWQuXG4gICAqL1xuICBwcml2YXRlIF9zZXRUaGVtZSh0aGVtZTogSVRoZW1lID0ge30pOiB2b2lkIHtcbiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLl9jb2xvcnM7XG4gICAgY29sb3JzLmZvcmVncm91bmQgPSBwYXJzZUNvbG9yKHRoZW1lLmZvcmVncm91bmQsIERFRkFVTFRfRk9SRUdST1VORCk7XG4gICAgY29sb3JzLmJhY2tncm91bmQgPSBwYXJzZUNvbG9yKHRoZW1lLmJhY2tncm91bmQsIERFRkFVTFRfQkFDS0dST1VORCk7XG4gICAgY29sb3JzLmN1cnNvciA9IHBhcnNlQ29sb3IodGhlbWUuY3Vyc29yLCBERUZBVUxUX0NVUlNPUik7XG4gICAgY29sb3JzLmN1cnNvckFjY2VudCA9IHBhcnNlQ29sb3IodGhlbWUuY3Vyc29yQWNjZW50LCBERUZBVUxUX0NVUlNPUl9BQ0NFTlQpO1xuICAgIGNvbG9ycy5zZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQgPSBwYXJzZUNvbG9yKHRoZW1lLnNlbGVjdGlvbkJhY2tncm91bmQsIERFRkFVTFRfU0VMRUNUSU9OKTtcbiAgICBjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZSA9IGNvbG9yLmJsZW5kKGNvbG9ycy5iYWNrZ3JvdW5kLCBjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZFRyYW5zcGFyZW50KTtcbiAgICBjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQgPSBwYXJzZUNvbG9yKHRoZW1lLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZCwgY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudCk7XG4gICAgY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZE9wYXF1ZSA9IGNvbG9yLmJsZW5kKGNvbG9ycy5iYWNrZ3JvdW5kLCBjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQpO1xuICAgIGNvbG9ycy5zZWxlY3Rpb25Gb3JlZ3JvdW5kID0gdGhlbWUuc2VsZWN0aW9uRm9yZWdyb3VuZCA/IHBhcnNlQ29sb3IodGhlbWUuc2VsZWN0aW9uRm9yZWdyb3VuZCwgTlVMTF9DT0xPUikgOiB1bmRlZmluZWQ7XG4gICAgaWYgKGNvbG9ycy5zZWxlY3Rpb25Gb3JlZ3JvdW5kID09PSBOVUxMX0NPTE9SKSB7XG4gICAgICBjb2xvcnMuc2VsZWN0aW9uRm9yZWdyb3VuZCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiBzZWxlY3Rpb24gY29sb3IgaXMgb3BhcXVlLCBibGVuZCBpdCB3aXRoIGJhY2tncm91bmQgd2l0aCAwLjMgb3BhY2l0eVxuICAgICAqIElzc3VlICMyNzM3XG4gICAgICovXG4gICAgaWYgKGNvbG9yLmlzT3BhcXVlKGNvbG9ycy5zZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQpKSB7XG4gICAgICBjb25zdCBvcGFjaXR5ID0gMC4zO1xuICAgICAgY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudCA9IGNvbG9yLm9wYWNpdHkoY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudCwgb3BhY2l0eSk7XG4gICAgfVxuICAgIGlmIChjb2xvci5pc09wYXF1ZShjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQpKSB7XG4gICAgICBjb25zdCBvcGFjaXR5ID0gMC4zO1xuICAgICAgY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZFRyYW5zcGFyZW50ID0gY29sb3Iub3BhY2l0eShjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQsIG9wYWNpdHkpO1xuICAgIH1cbiAgICBjb2xvcnMuYW5zaSA9IERFRkFVTFRfQU5TSV9DT0xPUlMuc2xpY2UoKTtcbiAgICBjb2xvcnMuYW5zaVswXSA9IHBhcnNlQ29sb3IodGhlbWUuYmxhY2ssIERFRkFVTFRfQU5TSV9DT0xPUlNbMF0pO1xuICAgIGNvbG9ycy5hbnNpWzFdID0gcGFyc2VDb2xvcih0aGVtZS5yZWQsIERFRkFVTFRfQU5TSV9DT0xPUlNbMV0pO1xuICAgIGNvbG9ycy5hbnNpWzJdID0gcGFyc2VDb2xvcih0aGVtZS5ncmVlbiwgREVGQVVMVF9BTlNJX0NPTE9SU1syXSk7XG4gICAgY29sb3JzLmFuc2lbM10gPSBwYXJzZUNvbG9yKHRoZW1lLnllbGxvdywgREVGQVVMVF9BTlNJX0NPTE9SU1szXSk7XG4gICAgY29sb3JzLmFuc2lbNF0gPSBwYXJzZUNvbG9yKHRoZW1lLmJsdWUsIERFRkFVTFRfQU5TSV9DT0xPUlNbNF0pO1xuICAgIGNvbG9ycy5hbnNpWzVdID0gcGFyc2VDb2xvcih0aGVtZS5tYWdlbnRhLCBERUZBVUxUX0FOU0lfQ09MT1JTWzVdKTtcbiAgICBjb2xvcnMuYW5zaVs2XSA9IHBhcnNlQ29sb3IodGhlbWUuY3lhbiwgREVGQVVMVF9BTlNJX0NPTE9SU1s2XSk7XG4gICAgY29sb3JzLmFuc2lbN10gPSBwYXJzZUNvbG9yKHRoZW1lLndoaXRlLCBERUZBVUxUX0FOU0lfQ09MT1JTWzddKTtcbiAgICBjb2xvcnMuYW5zaVs4XSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0QmxhY2ssIERFRkFVTFRfQU5TSV9DT0xPUlNbOF0pO1xuICAgIGNvbG9ycy5hbnNpWzldID0gcGFyc2VDb2xvcih0aGVtZS5icmlnaHRSZWQsIERFRkFVTFRfQU5TSV9DT0xPUlNbOV0pO1xuICAgIGNvbG9ycy5hbnNpWzEwXSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0R3JlZW4sIERFRkFVTFRfQU5TSV9DT0xPUlNbMTBdKTtcbiAgICBjb2xvcnMuYW5zaVsxMV0gPSBwYXJzZUNvbG9yKHRoZW1lLmJyaWdodFllbGxvdywgREVGQVVMVF9BTlNJX0NPTE9SU1sxMV0pO1xuICAgIGNvbG9ycy5hbnNpWzEyXSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0Qmx1ZSwgREVGQVVMVF9BTlNJX0NPTE9SU1sxMl0pO1xuICAgIGNvbG9ycy5hbnNpWzEzXSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0TWFnZW50YSwgREVGQVVMVF9BTlNJX0NPTE9SU1sxM10pO1xuICAgIGNvbG9ycy5hbnNpWzE0XSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0Q3lhbiwgREVGQVVMVF9BTlNJX0NPTE9SU1sxNF0pO1xuICAgIGNvbG9ycy5hbnNpWzE1XSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0V2hpdGUsIERFRkFVTFRfQU5TSV9DT0xPUlNbMTVdKTtcbiAgICBpZiAodGhlbWUuZXh0ZW5kZWRBbnNpKSB7XG4gICAgICBjb25zdCBjb2xvckNvdW50ID0gTWF0aC5taW4oY29sb3JzLmFuc2kubGVuZ3RoIC0gMTYsIHRoZW1lLmV4dGVuZGVkQW5zaS5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvckNvdW50OyBpKyspIHtcbiAgICAgICAgY29sb3JzLmFuc2lbaSArIDE2XSA9IHBhcnNlQ29sb3IodGhlbWUuZXh0ZW5kZWRBbnNpW2ldLCBERUZBVUxUX0FOU0lfQ09MT1JTW2kgKyAxNl0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBDbGVhciBvdXIgdGhlIGNhY2hlXG4gICAgdGhpcy5fY29udHJhc3RDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMuX2hhbGZDb250cmFzdENhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5fdXBkYXRlUmVzdG9yZUNvbG9ycygpO1xuICAgIHRoaXMuX29uQ2hhbmdlQ29sb3JzLmZpcmUodGhpcy5jb2xvcnMpO1xuICB9XG5cbiAgcHVibGljIHJlc3RvcmVDb2xvcihzbG90PzogQWxsQ29sb3JJbmRleCk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc3RvcmVDb2xvcihzbG90KTtcbiAgICB0aGlzLl9vbkNoYW5nZUNvbG9ycy5maXJlKHRoaXMuY29sb3JzKTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc3RvcmVDb2xvcihzbG90OiBBbGxDb2xvckluZGV4IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgLy8gdW5zZXQgc2xvdCByZXN0b3JlcyBhbGwgYW5zaSBjb2xvcnNcbiAgICBpZiAoc2xvdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3Jlc3RvcmVDb2xvcnMuYW5zaS5sZW5ndGg7ICsraSkge1xuICAgICAgICB0aGlzLl9jb2xvcnMuYW5zaVtpXSA9IHRoaXMuX3Jlc3RvcmVDb2xvcnMuYW5zaVtpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3dpdGNoIChzbG90KSB7XG4gICAgICBjYXNlIFNwZWNpYWxDb2xvckluZGV4LkZPUkVHUk9VTkQ6XG4gICAgICAgIHRoaXMuX2NvbG9ycy5mb3JlZ3JvdW5kID0gdGhpcy5fcmVzdG9yZUNvbG9ycy5mb3JlZ3JvdW5kO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3BlY2lhbENvbG9ySW5kZXguQkFDS0dST1VORDpcbiAgICAgICAgdGhpcy5fY29sb3JzLmJhY2tncm91bmQgPSB0aGlzLl9yZXN0b3JlQ29sb3JzLmJhY2tncm91bmQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTcGVjaWFsQ29sb3JJbmRleC5DVVJTT1I6XG4gICAgICAgIHRoaXMuX2NvbG9ycy5jdXJzb3IgPSB0aGlzLl9yZXN0b3JlQ29sb3JzLmN1cnNvcjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLl9jb2xvcnMuYW5zaVtzbG90XSA9IHRoaXMuX3Jlc3RvcmVDb2xvcnMuYW5zaVtzbG90XTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbW9kaWZ5Q29sb3JzKGNhbGxiYWNrOiAoY29sb3JzOiBJQ29sb3JTZXQpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBjYWxsYmFjayh0aGlzLl9jb2xvcnMpO1xuICAgIC8vIEFzc3VtZSB0aGUgY2hhbmdlIGhhcHBlbmVkXG4gICAgdGhpcy5fb25DaGFuZ2VDb2xvcnMuZmlyZSh0aGlzLmNvbG9ycyk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVSZXN0b3JlQ29sb3JzKCk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc3RvcmVDb2xvcnMgPSB7XG4gICAgICBmb3JlZ3JvdW5kOiB0aGlzLl9jb2xvcnMuZm9yZWdyb3VuZCxcbiAgICAgIGJhY2tncm91bmQ6IHRoaXMuX2NvbG9ycy5iYWNrZ3JvdW5kLFxuICAgICAgY3Vyc29yOiB0aGlzLl9jb2xvcnMuY3Vyc29yLFxuICAgICAgYW5zaTogdGhpcy5fY29sb3JzLmFuc2kuc2xpY2UoKVxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VDb2xvcihcbiAgY3NzU3RyaW5nOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGZhbGxiYWNrOiBJQ29sb3Jcbik6IElDb2xvciB7XG4gIGlmIChjc3NTdHJpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gY3NzLnRvQ29sb3IoY3NzU3RyaW5nKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIG5vLW9wXG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxsYmFjaztcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUNvbG9yLCBJQ29sb3JSR0IgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5sZXQgJHIgPSAwO1xubGV0ICRnID0gMDtcbmxldCAkYiA9IDA7XG5sZXQgJGEgPSAwO1xuXG5leHBvcnQgY29uc3QgTlVMTF9DT0xPUjogSUNvbG9yID0ge1xuICBjc3M6ICcjMDAwMDAwMDAnLFxuICByZ2JhOiAwXG59O1xuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIFwiY2hhbm5lbHNcIiAoaW5kaXZpZHVhbCBjb2xvciBjaGFubmVscyBhcyBudW1iZXJzKS5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBjaGFubmVscyB7XG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NzcyhyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhPzogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoYSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gYCMke3RvUGFkZGVkSGV4KHIpfSR7dG9QYWRkZWRIZXgoZyl9JHt0b1BhZGRlZEhleChiKX0ke3RvUGFkZGVkSGV4KGEpfWA7XG4gICAgfVxuICAgIHJldHVybiBgIyR7dG9QYWRkZWRIZXgocil9JHt0b1BhZGRlZEhleChnKX0ke3RvUGFkZGVkSGV4KGIpfWA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gdG9SZ2JhKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlciA9IDB4RkYpOiBudW1iZXIge1xuICAgIC8vIE5vdGU6IFRoZSBhZ2dyZWdhdGVkIG51bWJlciBpcyBSR0JBMzIgKEJFKSwgdGh1cyBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8gQUJHUjMyXG4gICAgLy8gb24gTEUgc3lzdGVtcywgYmVmb3JlIGl0IGNhbiBiZSB1c2VkIGZvciBkaXJlY3QgMzItYml0IGJ1ZmZlciB3cml0ZXMuXG4gICAgLy8gPj4+IDAgZm9yY2VzIGFuIHVuc2lnbmVkIGludFxuICAgIHJldHVybiAociA8PCAyNCB8IGcgPDwgMTYgfCBiIDw8IDggfCBhKSA+Pj4gMDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NvbG9yKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE/OiBudW1iZXIpOiBJQ29sb3Ige1xuICAgIHJldHVybiB7XG4gICAgICBjc3M6IGNoYW5uZWxzLnRvQ3NzKHIsIGcsIGIsIGEpLFxuICAgICAgcmdiYTogY2hhbm5lbHMudG9SZ2JhKHIsIGcsIGIsIGEpXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIGBJQ29sb3JgLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIGNvbG9yIHtcbiAgZXhwb3J0IGZ1bmN0aW9uIGJsZW5kKGJnOiBJQ29sb3IsIGZnOiBJQ29sb3IpOiBJQ29sb3Ige1xuICAgICRhID0gKGZnLnJnYmEgJiAweEZGKSAvIDI1NTtcbiAgICBpZiAoJGEgPT09IDEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNzczogZmcuY3NzLFxuICAgICAgICByZ2JhOiBmZy5yZ2JhXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBmZ1IgPSAoZmcucmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGZnRyA9IChmZy5yZ2JhID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgZmdCID0gKGZnLnJnYmEgPj4gOCkgJiAweEZGO1xuICAgIGNvbnN0IGJnUiA9IChiZy5yZ2JhID4+IDI0KSAmIDB4RkY7XG4gICAgY29uc3QgYmdHID0gKGJnLnJnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmcucmdiYSA+PiA4KSAmIDB4RkY7XG4gICAgJHIgPSBiZ1IgKyBNYXRoLnJvdW5kKChmZ1IgLSBiZ1IpICogJGEpO1xuICAgICRnID0gYmdHICsgTWF0aC5yb3VuZCgoZmdHIC0gYmdHKSAqICRhKTtcbiAgICAkYiA9IGJnQiArIE1hdGgucm91bmQoKGZnQiAtIGJnQikgKiAkYSk7XG4gICAgY29uc3QgY3NzID0gY2hhbm5lbHMudG9Dc3MoJHIsICRnLCAkYik7XG4gICAgY29uc3QgcmdiYSA9IGNoYW5uZWxzLnRvUmdiYSgkciwgJGcsICRiKTtcbiAgICByZXR1cm4geyBjc3MsIHJnYmEgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBpc09wYXF1ZShjb2xvcjogSUNvbG9yKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChjb2xvci5yZ2JhICYgMHhGRikgPT09IDB4RkY7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gZW5zdXJlQ29udHJhc3RSYXRpbyhiZzogSUNvbG9yLCBmZzogSUNvbG9yLCByYXRpbzogbnVtYmVyKTogSUNvbG9yIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZXN1bHQgPSByZ2JhLmVuc3VyZUNvbnRyYXN0UmF0aW8oYmcucmdiYSwgZmcucmdiYSwgcmF0aW8pO1xuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gY2hhbm5lbHMudG9Db2xvcihcbiAgICAgIChyZXN1bHQgPj4gMjQgJiAweEZGKSxcbiAgICAgIChyZXN1bHQgPj4gMTYgJiAweEZGKSxcbiAgICAgIChyZXN1bHQgPj4gOCAgJiAweEZGKVxuICAgICk7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gb3BhcXVlKGNvbG9yOiBJQ29sb3IpOiBJQ29sb3Ige1xuICAgIGNvbnN0IHJnYmFDb2xvciA9IChjb2xvci5yZ2JhIHwgMHhGRikgPj4+IDA7XG4gICAgWyRyLCAkZywgJGJdID0gcmdiYS50b0NoYW5uZWxzKHJnYmFDb2xvcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNzczogY2hhbm5lbHMudG9Dc3MoJHIsICRnLCAkYiksXG4gICAgICByZ2JhOiByZ2JhQ29sb3JcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIG9wYWNpdHkoY29sb3I6IElDb2xvciwgb3BhY2l0eTogbnVtYmVyKTogSUNvbG9yIHtcbiAgICAkYSA9IE1hdGgucm91bmQob3BhY2l0eSAqIDB4RkYpO1xuICAgIFskciwgJGcsICRiXSA9IHJnYmEudG9DaGFubmVscyhjb2xvci5yZ2JhKTtcbiAgICByZXR1cm4ge1xuICAgICAgY3NzOiBjaGFubmVscy50b0NzcygkciwgJGcsICRiLCAkYSksXG4gICAgICByZ2JhOiBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYiwgJGEpXG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseU9wYWNpdHkoY29sb3I6IElDb2xvciwgZmFjdG9yOiBudW1iZXIpOiBJQ29sb3Ige1xuICAgICRhID0gY29sb3IucmdiYSAmIDB4RkY7XG4gICAgcmV0dXJuIG9wYWNpdHkoY29sb3IsICgkYSAqIGZhY3RvcikgLyAweEZGKTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NvbG9yUkdCKGNvbG9yOiBJQ29sb3IpOiBJQ29sb3JSR0Ige1xuICAgIHJldHVybiBbKGNvbG9yLnJnYmEgPj4gMjQpICYgMHhGRiwgKGNvbG9yLnJnYmEgPj4gMTYpICYgMHhGRiwgKGNvbG9yLnJnYmEgPj4gOCkgJiAweEZGXTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIFwiY3NzXCIgKHN0cmluZzogJyNyZ2InLCAnI3JnYmEnLCAnI3JyZ2diYicsXG4gKiAnI3JyZ2diYmFhJykuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgY3NzIHtcbiAgLy8gQXR0ZW1wdCB0byBzZXQgZ2V0IHRoZSBzaGFyZWQgY2FudmFzIGNvbnRleHRcbiAgbGV0ICRjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IHVuZGVmaW5lZDtcbiAgbGV0ICRsaXRtdXNDb2xvcjogQ2FudmFzR3JhZGllbnQgfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgLy8gVGhpcyBpcyBndWFyYW50ZWVkIHRvIHJ1biBpbiB0aGUgZmlyc3Qgd2luZG93LCBzbyBkb2N1bWVudCBzaG91bGQgYmUgY29ycmVjdFxuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IDE7XG4gICAgY2FudmFzLmhlaWdodCA9IDE7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywge1xuICAgICAgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlXG4gICAgfSk7XG4gICAgaWYgKGN0eCkge1xuICAgICAgJGN0eCA9IGN0eDtcbiAgICAgICRjdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2NvcHknO1xuICAgICAgJGxpdG11c0NvbG9yID0gJGN0eC5jcmVhdGVMaW5lYXJHcmFkaWVudCgwLCAwLCAxLCAxKTtcbiAgICB9XG4gIH1cbiAgY2F0Y2gge1xuICAgIC8vIG5vb3BcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGNzcyBzdHJpbmcgdG8gYW4gSUNvbG9yLCB0aGlzIHNob3VsZCBoYW5kbGUgYWxsIHZhbGlkIENTUyBjb2xvciBzdHJpbmdzIGFuZCB3aWxsXG4gICAqIHRocm93IGlmIGl0J3MgaW52YWxpZC4gVGhlIGlkZWFsIGZvcm1hdCB0byB1c2UgaXMgYCNycmdnYmJbYWFdYCBhcyBpdCdzIHRoZSBmYXN0ZXN0IHRvIHBhcnNlLlxuICAgKlxuICAgKiBPbmx5IGAjcmdiW2FdYCwgYCNycmdnYmJbYWFdYCwgYHJnYigpYCBhbmQgYHJnYmEoKWAgZm9ybWF0cyBhcmUgc3VwcG9ydGVkIHdoZW4gcnVuIGluIGEgTm9kZVxuICAgKiBlbnZpcm9ubWVudC5cbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NvbG9yKGNzczogc3RyaW5nKTogSUNvbG9yIHtcbiAgICAvLyBGb3JtYXRzOiAjcmdiW2FdIGFuZCAjcnJnZ2JiW2FhXVxuICAgIGlmIChjc3MubWF0Y2goLyNbXFxkYS1mXXszLDh9L2kpKSB7XG4gICAgICBzd2l0Y2ggKGNzcy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSA0OiB7IC8vICNyZ2JcbiAgICAgICAgICAkciA9IHBhcnNlSW50KGNzcy5zbGljZSgxLCAyKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkZyA9IHBhcnNlSW50KGNzcy5zbGljZSgyLCAzKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkYiA9IHBhcnNlSW50KGNzcy5zbGljZSgzLCA0KS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICByZXR1cm4gY2hhbm5lbHMudG9Db2xvcigkciwgJGcsICRiKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDU6IHsgLy8gI3JnYmFcbiAgICAgICAgICAkciA9IHBhcnNlSW50KGNzcy5zbGljZSgxLCAyKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkZyA9IHBhcnNlSW50KGNzcy5zbGljZSgyLCAzKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkYiA9IHBhcnNlSW50KGNzcy5zbGljZSgzLCA0KS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkYSA9IHBhcnNlSW50KGNzcy5zbGljZSg0LCA1KS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICByZXR1cm4gY2hhbm5lbHMudG9Db2xvcigkciwgJGcsICRiLCAkYSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA3OiAvLyAjcnJnZ2JiXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNzcyxcbiAgICAgICAgICAgIHJnYmE6IChwYXJzZUludChjc3Muc2xpY2UoMSksIDE2KSA8PCA4IHwgMHhGRikgPj4+IDBcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlIDk6IC8vICNycmdnYmJhYVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjc3MsXG4gICAgICAgICAgICByZ2JhOiBwYXJzZUludChjc3Muc2xpY2UoMSksIDE2KSA+Pj4gMFxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRm9ybWF0czogcmdiKCkgb3IgcmdiYSgpXG4gICAgY29uc3QgcmdiYU1hdGNoID0gY3NzLm1hdGNoKC9yZ2JhP1xcKFxccyooXFxkezEsM30pXFxzKixcXHMqKFxcZHsxLDN9KVxccyosXFxzKihcXGR7MSwzfSlcXHMqKCxcXHMqKDB8MXxcXGQ/XFwuKFxcZCspKVxccyopP1xcKS8pO1xuICAgIGlmIChyZ2JhTWF0Y2gpIHtcbiAgICAgICRyID0gcGFyc2VJbnQocmdiYU1hdGNoWzFdKTtcbiAgICAgICRnID0gcGFyc2VJbnQocmdiYU1hdGNoWzJdKTtcbiAgICAgICRiID0gcGFyc2VJbnQocmdiYU1hdGNoWzNdKTtcbiAgICAgICRhID0gTWF0aC5yb3VuZCgocmdiYU1hdGNoWzVdID09PSB1bmRlZmluZWQgPyAxIDogcGFyc2VGbG9hdChyZ2JhTWF0Y2hbNV0pKSAqIDB4RkYpO1xuICAgICAgcmV0dXJuIGNoYW5uZWxzLnRvQ29sb3IoJHIsICRnLCAkYiwgJGEpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoZSBjb250ZXh0IGlzIGF2YWlsYWJsZSBmb3IgY2FudmFzLWJhc2VkIGNvbG9yIHBhcnNpbmdcbiAgICBpZiAoISRjdHggfHwgISRsaXRtdXNDb2xvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjc3MudG9Db2xvcjogVW5zdXBwb3J0ZWQgY3NzIGZvcm1hdCcpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoZSBjb2xvciB1c2luZyBjYW52YXMgZmlsbFN0eWxlXG4gICAgLy8gU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2NhbnZhcy5odG1sI2ZpbGwtYW5kLXN0cm9rZS1zdHlsZXNcbiAgICAkY3R4LmZpbGxTdHlsZSA9ICRsaXRtdXNDb2xvcjtcbiAgICAkY3R4LmZpbGxTdHlsZSA9IGNzcztcbiAgICBpZiAodHlwZW9mICRjdHguZmlsbFN0eWxlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjc3MudG9Db2xvcjogVW5zdXBwb3J0ZWQgY3NzIGZvcm1hdCcpO1xuICAgIH1cblxuICAgICRjdHguZmlsbFJlY3QoMCwgMCwgMSwgMSk7XG4gICAgWyRyLCAkZywgJGIsICRhXSA9ICRjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIDEsIDEpLmRhdGE7XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgY29sb3IgaXMgbm9uLXRyYW5zcGFyZW50IGFzIGNvbG9yIGh1ZSBnZXRzIGxvc3Qgd2hlbiBkcmF3biB0byB0aGUgY2FudmFzXG4gICAgaWYgKCRhICE9PSAweEZGKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nzcy50b0NvbG9yOiBVbnN1cHBvcnRlZCBjc3MgZm9ybWF0Jyk7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCB0aGUgY29sb3IgZnJvbSB0aGUgY2FudmFzJyBmaWxsU3R5bGUgcHJvcGVydHkgd2hpY2ggZXhwb3NlcyB0aGUgY29sb3IgdmFsdWUgaW4gcmdiYSgpXG4gICAgLy8gZm9ybWF0XG4gICAgLy8gU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2NhbnZhcy5odG1sI3NlcmlhbGlzYXRpb24tb2YtYS1jb2xvclxuICAgIHJldHVybiB7XG4gICAgICByZ2JhOiBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYiwgJGEpLFxuICAgICAgY3NzXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIFwicmdiXCIgKG51bWJlcjogMHhycmdnYmIpLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIHJnYiB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSByZWxhdGl2ZSBsdW1pbmFuY2Ugb2YgYW4gUkdCIGNvbG9yLCB0aGlzIGlzIHVzZWZ1bCBpbiBkZXRlcm1pbmluZyB0aGUgY29udHJhc3QgcmF0aW9cbiAgICogYmV0d2VlbiB0d28gY29sb3JzLlxuICAgKiBAcGFyYW0gcmdiIFRoZSBjb2xvciB0byB1c2UuXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jcmVsYXRpdmVsdW1pbmFuY2VkZWZcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZUx1bWluYW5jZShyZ2I6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHJlbGF0aXZlTHVtaW5hbmNlMihcbiAgICAgIChyZ2IgPj4gMTYpICYgMHhGRixcbiAgICAgIChyZ2IgPj4gOCApICYgMHhGRixcbiAgICAgIChyZ2IgICAgICApICYgMHhGRik7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgcmVsYXRpdmUgbHVtaW5hbmNlIG9mIGFuIFJHQiBjb2xvciwgdGhpcyBpcyB1c2VmdWwgaW4gZGV0ZXJtaW5pbmcgdGhlIGNvbnRyYXN0IHJhdGlvXG4gICAqIGJldHdlZW4gdHdvIGNvbG9ycy5cbiAgICogQHBhcmFtIHIgVGhlIHJlZCBjaGFubmVsICgweDAwIHRvIDB4RkYpLlxuICAgKiBAcGFyYW0gZyBUaGUgZ3JlZW4gY2hhbm5lbCAoMHgwMCB0byAweEZGKS5cbiAgICogQHBhcmFtIGIgVGhlIGJsdWUgY2hhbm5lbCAoMHgwMCB0byAweEZGKS5cbiAgICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvV0NBRzIwLyNyZWxhdGl2ZWx1bWluYW5jZWRlZlxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aXZlTHVtaW5hbmNlMihyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBycyA9IHIgLyAyNTU7XG4gICAgY29uc3QgZ3MgPSBnIC8gMjU1O1xuICAgIGNvbnN0IGJzID0gYiAvIDI1NTtcbiAgICBjb25zdCByciA9IHJzIDw9IDAuMDM5MjggPyBycyAvIDEyLjkyIDogTWF0aC5wb3coKHJzICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgY29uc3QgcmcgPSBncyA8PSAwLjAzOTI4ID8gZ3MgLyAxMi45MiA6IE1hdGgucG93KChncyArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgIGNvbnN0IHJiID0gYnMgPD0gMC4wMzkyOCA/IGJzIC8gMTIuOTIgOiBNYXRoLnBvdygoYnMgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICByZXR1cm4gcnIgKiAwLjIxMjYgKyByZyAqIDAuNzE1MiArIHJiICogMC4wNzIyO1xuICB9XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9ucyB3aGVyZSB0aGUgc291cmNlIHR5cGUgaXMgXCJyZ2JhXCIgKG51bWJlcjogMHhycmdnYmJhYSkuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgcmdiYSB7XG4gIGV4cG9ydCBmdW5jdGlvbiBibGVuZChiZzogbnVtYmVyLCBmZzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAkYSA9IChmZyAmIDB4RkYpIC8gMHhGRjtcbiAgICBpZiAoJGEgPT09IDEpIHtcbiAgICAgIHJldHVybiBmZztcbiAgICB9XG4gICAgY29uc3QgZmdSID0gKGZnID4+IDI0KSAmIDB4RkY7XG4gICAgY29uc3QgZmdHID0gKGZnID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgZmdCID0gKGZnID4+IDgpICYgMHhGRjtcbiAgICBjb25zdCBiZ1IgPSAoYmcgPj4gMjQpICYgMHhGRjtcbiAgICBjb25zdCBiZ0cgPSAoYmcgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmcgPj4gOCkgJiAweEZGO1xuICAgICRyID0gYmdSICsgTWF0aC5yb3VuZCgoZmdSIC0gYmdSKSAqICRhKTtcbiAgICAkZyA9IGJnRyArIE1hdGgucm91bmQoKGZnRyAtIGJnRykgKiAkYSk7XG4gICAgJGIgPSBiZ0IgKyBNYXRoLnJvdW5kKChmZ0IgLSBiZ0IpICogJGEpO1xuICAgIHJldHVybiBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYik7XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYSBmb3JlZ3JvdW5kIGNvbG9yIGFuZCBhIGJhY2tncm91bmQgY29sb3IsIGVpdGhlciBpbmNyZWFzZSBvciByZWR1Y2UgdGhlIGx1bWluYW5jZSBvZiB0aGVcbiAgICogZm9yZWdyb3VuZCBjb2xvciB1bnRpbCB0aGUgc3BlY2lmaWVkIGNvbnRyYXN0IHJhdGlvIGlzIG1ldC4gSWYgcHVyZSB3aGl0ZSBvciBibGFjayBpcyBoaXRcbiAgICogd2l0aG91dCB0aGUgY29udHJhc3QgcmF0aW8gYmVpbmcgbWV0LCBnbyB0aGUgb3RoZXIgZGlyZWN0aW9uIHVzaW5nIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGFzIHRoZVxuICAgKiBmb3JlZ3JvdW5kIGNvbG9yIGFuZCB0YWtlIGVpdGhlciB0aGUgZmlyc3Qgb3Igc2Vjb25kIHJlc3VsdCBkZXBlbmRpbmcgb24gd2hpY2ggaGFzIHRoZSBoaWdoZXJcbiAgICogY29udHJhc3QgcmF0aW8uXG4gICAqXG4gICAqIGB1bmRlZmluZWRgIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGNvbnRyYXN0IHJhdGlvIGlzIGFscmVhZHkgbWV0LlxuICAgKlxuICAgKiBAcGFyYW0gYmdSZ2JhIFRoZSBiYWNrZ3JvdW5kIGNvbG9yIGluIHJnYmEgZm9ybWF0LlxuICAgKiBAcGFyYW0gZmdSZ2JhIFRoZSBmb3JlZ3JvdW5kIGNvbG9yIGluIHJnYmEgZm9ybWF0LlxuICAgKiBAcGFyYW0gcmF0aW8gVGhlIGNvbnRyYXN0IHJhdGlvIHRvIGFjaGlldmUuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gZW5zdXJlQ29udHJhc3RSYXRpbyhiZ1JnYmE6IG51bWJlciwgZmdSZ2JhOiBudW1iZXIsIHJhdGlvOiBudW1iZXIpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGJnTCA9IHJnYi5yZWxhdGl2ZUx1bWluYW5jZShiZ1JnYmEgPj4gOCk7XG4gICAgY29uc3QgZmdMID0gcmdiLnJlbGF0aXZlTHVtaW5hbmNlKGZnUmdiYSA+PiA4KTtcbiAgICBjb25zdCBjciA9IGNvbnRyYXN0UmF0aW8oYmdMLCBmZ0wpO1xuICAgIGlmIChjciA8IHJhdGlvKSB7XG4gICAgICBpZiAoZmdMIDwgYmdMKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdEEgPSByZWR1Y2VMdW1pbmFuY2UoYmdSZ2JhLCBmZ1JnYmEsIHJhdGlvKTtcbiAgICAgICAgY29uc3QgcmVzdWx0QVJhdGlvID0gY29udHJhc3RSYXRpbyhiZ0wsIHJnYi5yZWxhdGl2ZUx1bWluYW5jZShyZXN1bHRBID4+IDgpKTtcbiAgICAgICAgaWYgKHJlc3VsdEFSYXRpbyA8IHJhdGlvKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0QiA9IGluY3JlYXNlTHVtaW5hbmNlKGJnUmdiYSwgZmdSZ2JhLCByYXRpbyk7XG4gICAgICAgICAgY29uc3QgcmVzdWx0QlJhdGlvID0gY29udHJhc3RSYXRpbyhiZ0wsIHJnYi5yZWxhdGl2ZUx1bWluYW5jZShyZXN1bHRCID4+IDgpKTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0QVJhdGlvID4gcmVzdWx0QlJhdGlvID8gcmVzdWx0QSA6IHJlc3VsdEI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdEE7XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHRBID0gaW5jcmVhc2VMdW1pbmFuY2UoYmdSZ2JhLCBmZ1JnYmEsIHJhdGlvKTtcbiAgICAgIGNvbnN0IHJlc3VsdEFSYXRpbyA9IGNvbnRyYXN0UmF0aW8oYmdMLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UocmVzdWx0QSA+PiA4KSk7XG4gICAgICBpZiAocmVzdWx0QVJhdGlvIDwgcmF0aW8pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0QiA9IHJlZHVjZUx1bWluYW5jZShiZ1JnYmEsIGZnUmdiYSwgcmF0aW8pO1xuICAgICAgICBjb25zdCByZXN1bHRCUmF0aW8gPSBjb250cmFzdFJhdGlvKGJnTCwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlKHJlc3VsdEIgPj4gOCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0QVJhdGlvID4gcmVzdWx0QlJhdGlvID8gcmVzdWx0QSA6IHJlc3VsdEI7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0QTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiByZWR1Y2VMdW1pbmFuY2UoYmdSZ2JhOiBudW1iZXIsIGZnUmdiYTogbnVtYmVyLCByYXRpbzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAvLyBUaGlzIGlzIGEgbmFpdmUgYnV0IGZhc3QgYXBwcm9hY2ggdG8gcmVkdWNpbmcgbHVtaW5hbmNlIGFzIGNvbnZlcnRpbmcgdG9cbiAgICAvLyBIU0wgYW5kIGJhY2sgaXMgZXhwZW5zaXZlXG4gICAgY29uc3QgYmdSID0gKGJnUmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGJnRyA9IChiZ1JnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGZnUiA9IChmZ1JnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBsZXQgZmdHID0gKGZnUmdiYSA+PiAxNikgJiAweEZGO1xuICAgIGxldCBmZ0IgPSAoZmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB3aGlsZSAoY3IgPCByYXRpbyAmJiAoZmdSID4gMCB8fCBmZ0cgPiAwIHx8IGZnQiA+IDApKSB7XG4gICAgICAvLyBSZWR1Y2UgYnkgMTAlIHVudGlsIHRoZSByYXRpbyBpcyBoaXRcbiAgICAgIGZnUiAtPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoZmdSICogMC4xKSk7XG4gICAgICBmZ0cgLT0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKGZnRyAqIDAuMSkpO1xuICAgICAgZmdCIC09IE1hdGgubWF4KDAsIE1hdGguY2VpbChmZ0IgKiAwLjEpKTtcbiAgICAgIGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB9XG4gICAgcmV0dXJuIChmZ1IgPDwgMjQgfCBmZ0cgPDwgMTYgfCBmZ0IgPDwgOCB8IDB4RkYpID4+PiAwO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGluY3JlYXNlTHVtaW5hbmNlKGJnUmdiYTogbnVtYmVyLCBmZ1JnYmE6IG51bWJlciwgcmF0aW86IG51bWJlcik6IG51bWJlciB7XG4gICAgLy8gVGhpcyBpcyBhIG5haXZlIGJ1dCBmYXN0IGFwcHJvYWNoIHRvIGluY3JlYXNpbmcgbHVtaW5hbmNlIGFzIGNvbnZlcnRpbmcgdG9cbiAgICAvLyBIU0wgYW5kIGJhY2sgaXMgZXhwZW5zaXZlXG4gICAgY29uc3QgYmdSID0gKGJnUmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGJnRyA9IChiZ1JnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGZnUiA9IChmZ1JnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBsZXQgZmdHID0gKGZnUmdiYSA+PiAxNikgJiAweEZGO1xuICAgIGxldCBmZ0IgPSAoZmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB3aGlsZSAoY3IgPCByYXRpbyAmJiAoZmdSIDwgMHhGRiB8fCBmZ0cgPCAweEZGIHx8IGZnQiA8IDB4RkYpKSB7XG4gICAgICAvLyBJbmNyZWFzZSBieSAxMCUgdW50aWwgdGhlIHJhdGlvIGlzIGhpdFxuICAgICAgZmdSID0gTWF0aC5taW4oMHhGRiwgZmdSICsgTWF0aC5jZWlsKCgyNTUgLSBmZ1IpICogMC4xKSk7XG4gICAgICBmZ0cgPSBNYXRoLm1pbigweEZGLCBmZ0cgKyBNYXRoLmNlaWwoKDI1NSAtIGZnRykgKiAwLjEpKTtcbiAgICAgIGZnQiA9IE1hdGgubWluKDB4RkYsIGZnQiArIE1hdGguY2VpbCgoMjU1IC0gZmdCKSAqIDAuMSkpO1xuICAgICAgY3IgPSBjb250cmFzdFJhdGlvKHJnYi5yZWxhdGl2ZUx1bWluYW5jZTIoZmdSLCBmZ0csIGZnQiksIHJnYi5yZWxhdGl2ZUx1bWluYW5jZTIoYmdSLCBiZ0csIGJnQikpO1xuICAgIH1cbiAgICByZXR1cm4gKGZnUiA8PCAyNCB8IGZnRyA8PCAxNiB8IGZnQiA8PCA4IHwgMHhGRikgPj4+IDA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gdG9DaGFubmVscyh2YWx1ZTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0ge1xuICAgIHJldHVybiBbKHZhbHVlID4+IDI0KSAmIDB4RkYsICh2YWx1ZSA+PiAxNikgJiAweEZGLCAodmFsdWUgPj4gOCkgJiAweEZGLCB2YWx1ZSAmIDB4RkZdO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1BhZGRlZEhleChjOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBzID0gYy50b1N0cmluZygxNik7XG4gIHJldHVybiBzLmxlbmd0aCA8IDIgPyAnMCcgKyBzIDogcztcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBjb250cmFzdCByYXRpbyBiZXR3ZWVuIHR3byByZWxhdGl2ZSBsdW1pbmFuY2UgdmFsdWVzLlxuICogQHBhcmFtIGwxIFRoZSBmaXJzdCByZWxhdGl2ZSBsdW1pbmFuY2UuXG4gKiBAcGFyYW0gbDIgVGhlIGZpcnN0IHJlbGF0aXZlIGx1bWluYW5jZS5cbiAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jY29udHJhc3QtcmF0aW9kZWZcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRyYXN0UmF0aW8obDE6IG51bWJlciwgbDI6IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChsMSA8IGwyKSB7XG4gICAgcmV0dXJuIChsMiArIDAuMDUpIC8gKGwxICsgMC4wNSk7XG4gIH1cbiAgcmV0dXJuIChsMSArIDAuMDUpIC8gKGwyICsgMC4wNSk7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxuaW50ZXJmYWNlIElMaXN0ZW5lcjxULCBVID0gdm9pZD4ge1xuICAoYXJnMTogVCwgYXJnMjogVSk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUV2ZW50PFQsIFUgPSB2b2lkPiB7XG4gIChsaXN0ZW5lcjogKGFyZzE6IFQsIGFyZzI6IFUpID0+IGFueSk6IElEaXNwb3NhYmxlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFdmVudEVtaXR0ZXI8VCwgVSA9IHZvaWQ+IHtcbiAgZXZlbnQ6IElFdmVudDxULCBVPjtcbiAgZmlyZShhcmcxOiBULCBhcmcyOiBVKTogdm9pZDtcbiAgZGlzcG9zZSgpOiB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgRXZlbnRFbWl0dGVyPFQsIFUgPSB2b2lkPiBpbXBsZW1lbnRzIElFdmVudEVtaXR0ZXI8VCwgVT4ge1xuICBwcml2YXRlIF9saXN0ZW5lcnM6IElMaXN0ZW5lcjxULCBVPltdID0gW107XG4gIHByaXZhdGUgX2V2ZW50PzogSUV2ZW50PFQsIFU+O1xuICBwcml2YXRlIF9kaXNwb3NlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHB1YmxpYyBnZXQgZXZlbnQoKTogSUV2ZW50PFQsIFU+IHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50KSB7XG4gICAgICB0aGlzLl9ldmVudCA9IChsaXN0ZW5lcjogKGFyZzE6IFQsIGFyZzI6IFUpID0+IGFueSkgPT4ge1xuICAgICAgICB0aGlzLl9saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIGNvbnN0IGRpc3Bvc2FibGUgPSB7XG4gICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9kaXNwb3NlZCkge1xuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2xpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9saXN0ZW5lcnNbaV0gPT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGRpc3Bvc2FibGU7XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZmlyZShhcmcxOiBULCBhcmcyOiBVKTogdm9pZCB7XG4gICAgY29uc3QgcXVldWU6IElMaXN0ZW5lcjxULCBVPltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9saXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXVlLnB1c2godGhpcy5fbGlzdGVuZXJzW2ldKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgcXVldWVbaV0uY2FsbCh1bmRlZmluZWQsIGFyZzEsIGFyZzIpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLl9kaXNwb3NlZCA9IHRydWU7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xpc3RlbmVycykge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLmxlbmd0aCA9IDA7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkRXZlbnQ8VD4oZnJvbTogSUV2ZW50PFQ+LCB0bzogSUV2ZW50RW1pdHRlcjxUPik6IElEaXNwb3NhYmxlIHtcbiAgcmV0dXJuIGZyb20oZSA9PiB0by5maXJlKGUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bkFuZFN1YnNjcmliZTxUPihldmVudDogSUV2ZW50PFQ+LCBoYW5kbGVyOiAoZTogVCB8IHVuZGVmaW5lZCkgPT4gYW55KTogSURpc3Bvc2FibGUge1xuICBoYW5kbGVyKHVuZGVmaW5lZCk7XG4gIHJldHVybiBldmVudChlID0+IGhhbmRsZXIoZSkpO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbi8qKlxuICogQSBiYXNlIGNsYXNzIHRoYXQgY2FuIGJlIGV4dGVuZGVkIHRvIHByb3ZpZGUgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgbWFuYWdpbmcgdGhlIGxpZmVjeWNsZSBvZiBhblxuICogb2JqZWN0IGFuZCBpdHMgY29tcG9uZW50cy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJRGlzcG9zYWJsZSB7XG4gIHByb3RlY3RlZCBfZGlzcG9zYWJsZXM6IElEaXNwb3NhYmxlW10gPSBbXTtcbiAgcHJvdGVjdGVkIF9pc0Rpc3Bvc2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIHRoZSBvYmplY3QsIHRyaWdnZXJpbmcgdGhlIGBkaXNwb3NlYCBtZXRob2Qgb24gYWxsIHJlZ2lzdGVyZWQgSURpc3Bvc2FibGVzLlxuICAgKi9cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5faXNEaXNwb3NlZCA9IHRydWU7XG4gICAgZm9yIChjb25zdCBkIG9mIHRoaXMuX2Rpc3Bvc2FibGVzKSB7XG4gICAgICBkLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgdGhpcy5fZGlzcG9zYWJsZXMubGVuZ3RoID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBkaXNwb3NhYmxlIG9iamVjdC5cbiAgICogQHBhcmFtIGQgVGhlIGRpc3Bvc2FibGUgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBkaXNwb3NhYmxlLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyPFQgZXh0ZW5kcyBJRGlzcG9zYWJsZT4oZDogVCk6IFQge1xuICAgIHRoaXMuX2Rpc3Bvc2FibGVzLnB1c2goZCk7XG4gICAgcmV0dXJuIGQ7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBkaXNwb3NhYmxlIG9iamVjdCBpZiBpdCBoYXMgYmVlbiByZWdpc3RlcmVkLCBpZiBub3QgZG9cbiAgICogbm90aGluZy5cbiAgICogQHBhcmFtIGQgVGhlIGRpc3Bvc2FibGUgdG8gdW5yZWdpc3Rlci5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyPFQgZXh0ZW5kcyBJRGlzcG9zYWJsZT4oZDogVCk6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fZGlzcG9zYWJsZXMuaW5kZXhPZihkKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLl9kaXNwb3NhYmxlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTXV0YWJsZURpc3Bvc2FibGU8VCBleHRlbmRzIElEaXNwb3NhYmxlPiBpbXBsZW1lbnRzIElEaXNwb3NhYmxlIHtcbiAgcHJpdmF0ZSBfdmFsdWU/OiBUO1xuICBwcml2YXRlIF9pc0Rpc3Bvc2VkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZhbHVlIGlmIGl0IGV4aXN0cy5cbiAgICovXG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRGlzcG9zZWQgPyB1bmRlZmluZWQgOiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSwgZGlzcG9zaW5nIG9mIHRoZSBvbGQgdmFsdWUgaWYgaXQgZXhpc3RzLlxuICAgKi9cbiAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogVCB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh0aGlzLl9pc0Rpc3Bvc2VkIHx8IHZhbHVlID09PSB0aGlzLl92YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl92YWx1ZT8uZGlzcG9zZSgpO1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBzdG9yZWQgdmFsdWUgYW5kIGRpc3Bvc2VzIG9mIHRoZSBwcmV2aW91c2x5IHN0b3JlZCB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5faXNEaXNwb3NlZCA9IHRydWU7XG4gICAgdGhpcy5fdmFsdWU/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLl92YWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFdyYXAgYSBmdW5jdGlvbiBpbiBhIGRpc3Bvc2FibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0Rpc3Bvc2FibGUoZjogKCkgPT4gdm9pZCk6IElEaXNwb3NhYmxlIHtcbiAgcmV0dXJuIHsgZGlzcG9zZTogZiB9O1xufVxuXG4vKipcbiAqIERpc3Bvc2Ugb2YgYWxsIGRpc3Bvc2FibGVzIGluIGFuIGFycmF5IGFuZCBzZXQgaXRzIGxlbmd0aCB0byAwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zZUFycmF5KGRpc3Bvc2FibGVzOiBJRGlzcG9zYWJsZVtdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgZCBvZiBkaXNwb3NhYmxlcykge1xuICAgIGQuZGlzcG9zZSgpO1xuICB9XG4gIGRpc3Bvc2FibGVzLmxlbmd0aCA9IDA7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRpc3Bvc2FibGUgdGhhdCB3aWxsIGRpc3Bvc2Ugb2YgYW4gYXJyYXkgb2YgZGlzcG9zYWJsZXMgd2hlbiBkaXNwb3NlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpc3Bvc2VBcnJheURpc3Bvc2FibGUoYXJyYXk6IElEaXNwb3NhYmxlW10pOiBJRGlzcG9zYWJsZSB7XG4gIHJldHVybiB7IGRpc3Bvc2U6ICgpID0+IGRpc3Bvc2VBcnJheShhcnJheSkgfTtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIyIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuZXhwb3J0IGNsYXNzIFR3b0tleU1hcDxURmlyc3QgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIsIFRTZWNvbmQgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIsIFRWYWx1ZT4ge1xuICBwcml2YXRlIF9kYXRhOiB7IFtiZzogc3RyaW5nIHwgbnVtYmVyXTogeyBbZmc6IHN0cmluZyB8IG51bWJlcl06IFRWYWx1ZSB8IHVuZGVmaW5lZCB9IHwgdW5kZWZpbmVkIH0gPSB7fTtcblxuICBwdWJsaWMgc2V0KGZpcnN0OiBURmlyc3QsIHNlY29uZDogVFNlY29uZCwgdmFsdWU6IFRWYWx1ZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZGF0YVtmaXJzdF0pIHtcbiAgICAgIHRoaXMuX2RhdGFbZmlyc3RdID0ge307XG4gICAgfVxuICAgIHRoaXMuX2RhdGFbZmlyc3QgYXMgc3RyaW5nIHwgbnVtYmVyXSFbc2Vjb25kXSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldChmaXJzdDogVEZpcnN0LCBzZWNvbmQ6IFRTZWNvbmQpOiBUVmFsdWUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhW2ZpcnN0IGFzIHN0cmluZyB8IG51bWJlcl0gPyB0aGlzLl9kYXRhW2ZpcnN0IGFzIHN0cmluZyB8IG51bWJlcl0hW3NlY29uZF0gOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YSA9IHt9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGb3VyS2V5TWFwPFRGaXJzdCBleHRlbmRzIHN0cmluZyB8IG51bWJlciwgVFNlY29uZCBleHRlbmRzIHN0cmluZyB8IG51bWJlciwgVFRoaXJkIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyLCBURm91cnRoIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyLCBUVmFsdWU+IHtcbiAgcHJpdmF0ZSBfZGF0YTogVHdvS2V5TWFwPFRGaXJzdCwgVFNlY29uZCwgVHdvS2V5TWFwPFRUaGlyZCwgVEZvdXJ0aCwgVFZhbHVlPj4gPSBuZXcgVHdvS2V5TWFwKCk7XG5cbiAgcHVibGljIHNldChmaXJzdDogVEZpcnN0LCBzZWNvbmQ6IFRTZWNvbmQsIHRoaXJkOiBUVGhpcmQsIGZvdXJ0aDogVEZvdXJ0aCwgdmFsdWU6IFRWYWx1ZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZGF0YS5nZXQoZmlyc3QsIHNlY29uZCkpIHtcbiAgICAgIHRoaXMuX2RhdGEuc2V0KGZpcnN0LCBzZWNvbmQsIG5ldyBUd29LZXlNYXAoKSk7XG4gICAgfVxuICAgIHRoaXMuX2RhdGEuZ2V0KGZpcnN0LCBzZWNvbmQpIS5zZXQodGhpcmQsIGZvdXJ0aCwgdmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdldChmaXJzdDogVEZpcnN0LCBzZWNvbmQ6IFRTZWNvbmQsIHRoaXJkOiBUVGhpcmQsIGZvdXJ0aDogVEZvdXJ0aCk6IFRWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEuZ2V0KGZpcnN0LCBzZWNvbmQpPy5nZXQodGhpcmQsIGZvdXJ0aCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YS5jbGVhcigpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICpcbiAqIFRoaXMgd2FzIGhlYXZpbHkgaW5zcGlyZWQgZnJvbSBtaWNyb3NvZnQvdnNjb2RlJ3MgZGVwZW5kZW5jeSBpbmplY3Rpb24gc3lzdGVtIChNSVQpLlxuICovXG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuaW1wb3J0IHsgSVNlcnZpY2VJZGVudGlmaWVyIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuY29uc3QgRElfVEFSR0VUID0gJ2RpJHRhcmdldCc7XG5jb25zdCBESV9ERVBFTkRFTkNJRVMgPSAnZGkkZGVwZW5kZW5jaWVzJztcblxuZXhwb3J0IGNvbnN0IHNlcnZpY2VSZWdpc3RyeTogTWFwPHN0cmluZywgSVNlcnZpY2VJZGVudGlmaWVyPGFueT4+ID0gbmV3IE1hcCgpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VydmljZURlcGVuZGVuY2llcyhjdG9yOiBhbnkpOiB7IGlkOiBJU2VydmljZUlkZW50aWZpZXI8YW55PiwgaW5kZXg6IG51bWJlciwgb3B0aW9uYWw6IGJvb2xlYW4gfVtdIHtcbiAgcmV0dXJuIGN0b3JbRElfREVQRU5ERU5DSUVTXSB8fCBbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlY29yYXRvcjxUPihpZDogc3RyaW5nKTogSVNlcnZpY2VJZGVudGlmaWVyPFQ+IHtcbiAgaWYgKHNlcnZpY2VSZWdpc3RyeS5oYXMoaWQpKSB7XG4gICAgcmV0dXJuIHNlcnZpY2VSZWdpc3RyeS5nZXQoaWQpITtcbiAgfVxuXG4gIGNvbnN0IGRlY29yYXRvcjogYW55ID0gZnVuY3Rpb24gKHRhcmdldDogRnVuY3Rpb24sIGtleTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogYW55IHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCAhPT0gMykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdASVNlcnZpY2VOYW1lLWRlY29yYXRvciBjYW4gb25seSBiZSB1c2VkIHRvIGRlY29yYXRlIGEgcGFyYW1ldGVyJyk7XG4gICAgfVxuXG4gICAgc3RvcmVTZXJ2aWNlRGVwZW5kZW5jeShkZWNvcmF0b3IsIHRhcmdldCwgaW5kZXgpO1xuICB9O1xuXG4gIGRlY29yYXRvci50b1N0cmluZyA9ICgpID0+IGlkO1xuXG4gIHNlcnZpY2VSZWdpc3RyeS5zZXQoaWQsIGRlY29yYXRvcik7XG4gIHJldHVybiBkZWNvcmF0b3I7XG59XG5cbmZ1bmN0aW9uIHN0b3JlU2VydmljZURlcGVuZGVuY3koaWQ6IEZ1bmN0aW9uLCB0YXJnZXQ6IEZ1bmN0aW9uLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gIGlmICgodGFyZ2V0IGFzIGFueSlbRElfVEFSR0VUXSA9PT0gdGFyZ2V0KSB7XG4gICAgKHRhcmdldCBhcyBhbnkpW0RJX0RFUEVOREVOQ0lFU10ucHVzaCh7IGlkLCBpbmRleCB9KTtcbiAgfSBlbHNlIHtcbiAgICAodGFyZ2V0IGFzIGFueSlbRElfREVQRU5ERU5DSUVTXSA9IFt7IGlkLCBpbmRleCB9XTtcbiAgICAodGFyZ2V0IGFzIGFueSlbRElfVEFSR0VUXSA9IHRhcmdldDtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJRXZlbnQsIElFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IElCdWZmZXIsIElCdWZmZXJTZXQgfSBmcm9tICdjb21tb24vYnVmZmVyL1R5cGVzJztcbmltcG9ydCB7IElEZWNQcml2YXRlTW9kZXMsIElDb3JlTW91c2VFdmVudCwgQ29yZU1vdXNlRW5jb2RpbmcsIElDb3JlTW91c2VQcm90b2NvbCwgQ29yZU1vdXNlRXZlbnRUeXBlLCBJQ2hhcnNldCwgSVdpbmRvd09wdGlvbnMsIElNb2RlcywgSUF0dHJpYnV0ZURhdGEsIFNjcm9sbFNvdXJjZSwgSURpc3Bvc2FibGUsIElDb2xvciwgQ3Vyc29yU3R5bGUsIEN1cnNvckluYWN0aXZlU3R5bGUsIElPc2NMaW5rRGF0YSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVEZWNvcmF0b3IgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IElEZWNvcmF0aW9uT3B0aW9ucywgSURlY29yYXRpb24sIElMaW5rSGFuZGxlciwgSVdpbmRvd3NQdHksIElMb2dnZXIgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuXG5leHBvcnQgY29uc3QgSUJ1ZmZlclNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUJ1ZmZlclNlcnZpY2U+KCdCdWZmZXJTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElCdWZmZXJTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgcmVhZG9ubHkgY29sczogbnVtYmVyO1xuICByZWFkb25seSByb3dzOiBudW1iZXI7XG4gIHJlYWRvbmx5IGJ1ZmZlcjogSUJ1ZmZlcjtcbiAgcmVhZG9ubHkgYnVmZmVyczogSUJ1ZmZlclNldDtcbiAgaXNVc2VyU2Nyb2xsaW5nOiBib29sZWFuO1xuICBvblJlc2l6ZTogSUV2ZW50PHsgY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIgfT47XG4gIG9uU2Nyb2xsOiBJRXZlbnQ8bnVtYmVyPjtcbiAgc2Nyb2xsKGVyYXNlQXR0cjogSUF0dHJpYnV0ZURhdGEsIGlzV3JhcHBlZD86IGJvb2xlYW4pOiB2b2lkO1xuICBzY3JvbGxMaW5lcyhkaXNwOiBudW1iZXIsIHN1cHByZXNzU2Nyb2xsRXZlbnQ/OiBib29sZWFuLCBzb3VyY2U/OiBTY3JvbGxTb3VyY2UpOiB2b2lkO1xuICByZXNpemUoY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIpOiB2b2lkO1xuICByZXNldCgpOiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgSUNvcmVNb3VzZVNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUNvcmVNb3VzZVNlcnZpY2U+KCdDb3JlTW91c2VTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElDb3JlTW91c2VTZXJ2aWNlIHtcbiAgYWN0aXZlUHJvdG9jb2w6IHN0cmluZztcbiAgYWN0aXZlRW5jb2Rpbmc6IHN0cmluZztcbiAgYXJlTW91c2VFdmVudHNBY3RpdmU6IGJvb2xlYW47XG4gIGFkZFByb3RvY29sKG5hbWU6IHN0cmluZywgcHJvdG9jb2w6IElDb3JlTW91c2VQcm90b2NvbCk6IHZvaWQ7XG4gIGFkZEVuY29kaW5nKG5hbWU6IHN0cmluZywgZW5jb2Rpbmc6IENvcmVNb3VzZUVuY29kaW5nKTogdm9pZDtcbiAgcmVzZXQoKTogdm9pZDtcblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBtb3VzZSBldmVudCB0byBiZSBzZW50LlxuICAgKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGV2ZW50IHBhc3NlZCBhbGwgcHJvdG9jb2wgcmVzdHJpY3Rpb25zIGFuZCBhIHJlcG9ydFxuICAgKiB3YXMgc2VudCwgb3RoZXJ3aXNlIGZhbHNlLiBUaGUgcmV0dXJuIHZhbHVlIG1heSBiZSB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyXG4gICAqIHRoZSBkZWZhdWx0IGV2ZW50IGFjdGlvbiBpbiB0aGUgYm93c2VyIGNvbXBvbmVudCBzaG91bGQgYmUgb21pdHRlZC5cbiAgICpcbiAgICogTm90ZTogVGhlIG1ldGhvZCB3aWxsIGNoYW5nZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIGV2ZW50IG9iamVjdFxuICAgKiB0byBmdWxsZmlsbCBwcm90b2NvbCBhbmQgZW5jb2RpbmcgcmVzdHJpY3Rpb25zLlxuICAgKi9cbiAgdHJpZ2dlck1vdXNlRXZlbnQoZXZlbnQ6IElDb3JlTW91c2VFdmVudCk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEV2ZW50IHRvIGFubm91bmNlIGNoYW5nZXMgaW4gbW91c2UgdHJhY2tpbmcuXG4gICAqL1xuICBvblByb3RvY29sQ2hhbmdlOiBJRXZlbnQ8Q29yZU1vdXNlRXZlbnRUeXBlPjtcblxuICAvKipcbiAgICogSHVtYW4gcmVhZGFibGUgdmVyc2lvbiBvZiBtb3VzZSBldmVudHMuXG4gICAqL1xuICBleHBsYWluRXZlbnRzKGV2ZW50czogQ29yZU1vdXNlRXZlbnRUeXBlKTogeyBbZXZlbnQ6IHN0cmluZ106IGJvb2xlYW4gfTtcbn1cblxuZXhwb3J0IGNvbnN0IElDb3JlU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJQ29yZVNlcnZpY2U+KCdDb3JlU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJQ29yZVNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSW5pdGlhbGx5IHRoZSBjdXJzb3Igd2lsbCBub3QgYmUgdmlzaWJsZSB1bnRpbCB0aGUgZmlyc3QgdGltZSB0aGUgdGVybWluYWxcbiAgICogaXMgZm9jdXNlZC5cbiAgICovXG4gIGlzQ3Vyc29ySW5pdGlhbGl6ZWQ6IGJvb2xlYW47XG4gIGlzQ3Vyc29ySGlkZGVuOiBib29sZWFuO1xuXG4gIHJlYWRvbmx5IG1vZGVzOiBJTW9kZXM7XG4gIHJlYWRvbmx5IGRlY1ByaXZhdGVNb2RlczogSURlY1ByaXZhdGVNb2RlcztcblxuICByZWFkb25seSBvbkRhdGE6IElFdmVudDxzdHJpbmc+O1xuICByZWFkb25seSBvblVzZXJJbnB1dDogSUV2ZW50PHZvaWQ+O1xuICByZWFkb25seSBvbkJpbmFyeTogSUV2ZW50PHN0cmluZz47XG4gIHJlYWRvbmx5IG9uUmVxdWVzdFNjcm9sbFRvQm90dG9tOiBJRXZlbnQ8dm9pZD47XG5cbiAgcmVzZXQoKTogdm9pZDtcblxuICAvKipcbiAgICogVHJpZ2dlcnMgdGhlIG9uRGF0YSBldmVudCBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdGhhdCBpcyBiZWluZyBlbWl0dGVkLlxuICAgKiBAcGFyYW0gd2FzVXNlcklucHV0IFdoZXRoZXIgdGhlIGRhdGEgb3JpZ2luYXRlZCBmcm9tIHRoZSB1c2VyIChhcyBvcHBvc2VkIHRvXG4gICAqIHJlc3VsdGluZyBmcm9tIHBhcnNpbmcgaW5jb21pbmcgZGF0YSkuIFdoZW4gdHJ1ZSB0aGlzIHdpbGwgYWxzbzpcbiAgICogLSBTY3JvbGwgdG8gdGhlIGJvdHRvbSBvZiB0aGUgYnVmZmVyIGlmIG9wdGlvbiBzY3JvbGxPblVzZXJJbnB1dCBpcyB0cnVlLlxuICAgKiAtIEZpcmUgdGhlIGBvblVzZXJJbnB1dGAgZXZlbnQgKHNvIHNlbGVjdGlvbiBjYW4gYmUgY2xlYXJlZCkuXG4gICAqL1xuICB0cmlnZ2VyRGF0YUV2ZW50KGRhdGE6IHN0cmluZywgd2FzVXNlcklucHV0PzogYm9vbGVhbik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIHRoZSBvbkJpbmFyeSBldmVudCBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdGhhdCBpcyBiZWluZyBlbWl0dGVkLlxuICAgKi9cbiAgdHJpZ2dlckJpbmFyeUV2ZW50KGRhdGE6IHN0cmluZyk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjb25zdCBJQ2hhcnNldFNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUNoYXJzZXRTZXJ2aWNlPignQ2hhcnNldFNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSUNoYXJzZXRTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgY2hhcnNldDogSUNoYXJzZXQgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGdsZXZlbDogbnVtYmVyO1xuXG4gIHJlc2V0KCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgRyBsZXZlbCBvZiB0aGUgdGVybWluYWwuXG4gICAqIEBwYXJhbSBnXG4gICAqL1xuICBzZXRnTGV2ZWwoZzogbnVtYmVyKTogdm9pZDtcblxuICAvKipcbiAgICogU2V0IHRoZSBjaGFyc2V0IGZvciB0aGUgZ2l2ZW4gRyBsZXZlbCBvZiB0aGUgdGVybWluYWwuXG4gICAqIEBwYXJhbSBnXG4gICAqIEBwYXJhbSBjaGFyc2V0XG4gICAqL1xuICBzZXRnQ2hhcnNldChnOiBudW1iZXIsIGNoYXJzZXQ6IElDaGFyc2V0IHwgdW5kZWZpbmVkKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VydmljZUlkZW50aWZpZXI8VD4ge1xuICAoLi4uYXJnczogYW55W10pOiB2b2lkO1xuICB0eXBlOiBUO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCcmFuZGVkU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xufVxuXG50eXBlIEdldExlYWRpbmdOb25TZXJ2aWNlQXJnczxUQXJncyBleHRlbmRzIGFueVtdPiA9IFRBcmdzIGV4dGVuZHMgW10gPyBbXVxuICA6IFRBcmdzIGV4dGVuZHMgWy4uLmluZmVyIFRGaXJzdCwgaW5mZXIgVExhc3RdID8gVExhc3QgZXh0ZW5kcyBJQnJhbmRlZFNlcnZpY2UgPyBHZXRMZWFkaW5nTm9uU2VydmljZUFyZ3M8VEZpcnN0PiA6IFRBcmdzXG4gICAgOiBuZXZlcjtcblxuZXhwb3J0IGNvbnN0IElJbnN0YW50aWF0aW9uU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJSW5zdGFudGlhdGlvblNlcnZpY2U+KCdJbnN0YW50aWF0aW9uU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJSW5zdGFudGlhdGlvblNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICBzZXRTZXJ2aWNlPFQ+KGlkOiBJU2VydmljZUlkZW50aWZpZXI8VD4sIGluc3RhbmNlOiBUKTogdm9pZDtcbiAgZ2V0U2VydmljZTxUPihpZDogSVNlcnZpY2VJZGVudGlmaWVyPFQ+KTogVCB8IHVuZGVmaW5lZDtcbiAgY3JlYXRlSW5zdGFuY2U8Q3RvciBleHRlbmRzIG5ldyAoLi4uYXJnczogYW55W10pID0+IGFueSwgUiBleHRlbmRzIEluc3RhbmNlVHlwZTxDdG9yPj4odDogQ3RvciwgLi4uYXJnczogR2V0TGVhZGluZ05vblNlcnZpY2VBcmdzPENvbnN0cnVjdG9yUGFyYW1ldGVyczxDdG9yPj4pOiBSO1xufVxuXG5leHBvcnQgZW51bSBMb2dMZXZlbEVudW0ge1xuICBUUkFDRSA9IDAsXG4gIERFQlVHID0gMSxcbiAgSU5GTyA9IDIsXG4gIFdBUk4gPSAzLFxuICBFUlJPUiA9IDQsXG4gIE9GRiA9IDVcbn1cblxuZXhwb3J0IGNvbnN0IElMb2dTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElMb2dTZXJ2aWNlPignTG9nU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJTG9nU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHJlYWRvbmx5IGxvZ0xldmVsOiBMb2dMZXZlbEVudW07XG5cbiAgdHJhY2UobWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xuICBkZWJ1ZyhtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG4gIGluZm8obWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xuICB3YXJuKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbiAgZXJyb3IobWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgSU9wdGlvbnNTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElPcHRpb25zU2VydmljZT4oJ09wdGlvbnNTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElPcHRpb25zU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBSZWFkIG9ubHkgYWNjZXNzIHRvIHRoZSByYXcgb3B0aW9ucyBvYmplY3QsIHRoaXMgaXMgYW4gaW50ZXJuYWwtb25seSBmYXN0IHBhdGggZm9yIGFjY2Vzc2luZ1xuICAgKiBzaW5nbGUgb3B0aW9ucyB3aXRob3V0IGFueSB2YWxpZGF0aW9uIGFzIHdlIHRydXN0IFR5cGVTY3JpcHQgdG8gZW5mb3JjZSBjb3JyZWN0IHVzYWdlXG4gICAqIGludGVybmFsbHkuXG4gICAqL1xuICByZWFkb25seSByYXdPcHRpb25zOiBSZXF1aXJlZDxJVGVybWluYWxPcHRpb25zPjtcblxuICAvKipcbiAgICogT3B0aW9ucyBhcyBleHBvc2VkIHRocm91Z2ggdGhlIHB1YmxpYyBBUEksIHRoaXMgcHJvcGVydHkgdXNlcyBnZXR0ZXJzIGFuZCBzZXR0ZXJzIHdpdGhcbiAgICogdmFsaWRhdGlvbiB3aGljaCBtYWtlcyBpdCBzYWZlciBidXQgc2xvd2VyLiB7QGxpbmsgcmF3T3B0aW9uc30gc2hvdWxkIGJlIHVzZWQgZm9yIHByZXR0eSBtdWNoXG4gICAqIGFsbCBpbnRlcm5hbCB1c2FnZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy5cbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbnM6IFJlcXVpcmVkPElUZXJtaW5hbE9wdGlvbnM+O1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIGZvciB3aGVuIGFueSBvcHRpb24gY2hhbmdlcy5cbiAgICovXG4gIHJlYWRvbmx5IG9uT3B0aW9uQ2hhbmdlOiBJRXZlbnQ8a2V5b2YgSVRlcm1pbmFsT3B0aW9ucz47XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIHdoZW4gYSBzcGVjaWZpYyBvcHRpb24gY2hhbmdlcywgdGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGlzXG4gICAqIHByZWZlcnJlZCBvdmVyIHtAbGluayBvbk9wdGlvbkNoYW5nZX0gd2hlbiBvbmx5IGEgc2luZ2xlIG9wdGlvbiBpcyBiZWluZyBsaXN0ZW5lZCB0by5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgb25TcGVjaWZpY09wdGlvbkNoYW5nZTxUIGV4dGVuZHMga2V5b2YgSVRlcm1pbmFsT3B0aW9ucz4oa2V5OiBULCBsaXN0ZW5lcjogKGFyZzE6IFJlcXVpcmVkPElUZXJtaW5hbE9wdGlvbnM+W1RdKSA9PiBhbnkpOiBJRGlzcG9zYWJsZTtcblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciBmb3Igd2hlbiBhIHNldCBvZiBzcGVjaWZpYyBvcHRpb25zIGNoYW5nZSwgdGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZFxuICAgKiB0aGF0IGlzIHByZWZlcnJlZCBvdmVyIHtAbGluayBvbk9wdGlvbkNoYW5nZX0gd2hlbiBtdWx0aXBsZSBvcHRpb25zIGFyZSBiZWluZyBsaXN0ZW5lZCB0byBhbmRcbiAgICogaGFuZGxlZCB0aGUgc2FtZSB3YXkuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gIG9uTXVsdGlwbGVPcHRpb25DaGFuZ2Uoa2V5czogKGtleW9mIElUZXJtaW5hbE9wdGlvbnMpW10sIGxpc3RlbmVyOiAoKSA9PiBhbnkpOiBJRGlzcG9zYWJsZTtcbn1cblxuZXhwb3J0IHR5cGUgRm9udFdlaWdodCA9ICdub3JtYWwnIHwgJ2JvbGQnIHwgJzEwMCcgfCAnMjAwJyB8ICczMDAnIHwgJzQwMCcgfCAnNTAwJyB8ICc2MDAnIHwgJzcwMCcgfCAnODAwJyB8ICc5MDAnIHwgbnVtYmVyO1xuZXhwb3J0IHR5cGUgTG9nTGV2ZWwgPSAndHJhY2UnIHwgJ2RlYnVnJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcicgfCAnb2ZmJztcblxuZXhwb3J0IGludGVyZmFjZSBJVGVybWluYWxPcHRpb25zIHtcbiAgYWxsb3dQcm9wb3NlZEFwaT86IGJvb2xlYW47XG4gIGFsbG93VHJhbnNwYXJlbmN5PzogYm9vbGVhbjtcbiAgYWx0Q2xpY2tNb3Zlc0N1cnNvcj86IGJvb2xlYW47XG4gIGNvbHM/OiBudW1iZXI7XG4gIGNvbnZlcnRFb2w/OiBib29sZWFuO1xuICBjdXJzb3JCbGluaz86IGJvb2xlYW47XG4gIGN1cnNvclN0eWxlPzogQ3Vyc29yU3R5bGU7XG4gIGN1cnNvcldpZHRoPzogbnVtYmVyO1xuICBjdXJzb3JJbmFjdGl2ZVN0eWxlPzogQ3Vyc29ySW5hY3RpdmVTdHlsZTtcbiAgY3VzdG9tR2x5cGhzPzogYm9vbGVhbjtcbiAgZGlzYWJsZVN0ZGluPzogYm9vbGVhbjtcbiAgZG9jdW1lbnRPdmVycmlkZT86IGFueSB8IG51bGw7XG4gIGRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzPzogYm9vbGVhbjtcbiAgZmFzdFNjcm9sbE1vZGlmaWVyPzogJ25vbmUnIHwgJ2FsdCcgfCAnY3RybCcgfCAnc2hpZnQnO1xuICBmYXN0U2Nyb2xsU2Vuc2l0aXZpdHk/OiBudW1iZXI7XG4gIGZvbnRTaXplPzogbnVtYmVyO1xuICBmb250RmFtaWx5Pzogc3RyaW5nO1xuICBmb250V2VpZ2h0PzogRm9udFdlaWdodDtcbiAgZm9udFdlaWdodEJvbGQ/OiBGb250V2VpZ2h0O1xuICBpZ25vcmVCcmFja2V0ZWRQYXN0ZU1vZGU/OiBib29sZWFuO1xuICBsZXR0ZXJTcGFjaW5nPzogbnVtYmVyO1xuICBsaW5lSGVpZ2h0PzogbnVtYmVyO1xuICBsaW5rSGFuZGxlcj86IElMaW5rSGFuZGxlciB8IG51bGw7XG4gIGxvZ0xldmVsPzogTG9nTGV2ZWw7XG4gIGxvZ2dlcj86IElMb2dnZXIgfCBudWxsO1xuICBtYWNPcHRpb25Jc01ldGE/OiBib29sZWFuO1xuICBtYWNPcHRpb25DbGlja0ZvcmNlc1NlbGVjdGlvbj86IGJvb2xlYW47XG4gIG1pbmltdW1Db250cmFzdFJhdGlvPzogbnVtYmVyO1xuICByZXNjYWxlT3ZlcmxhcHBpbmdHbHlwaHM/OiBib29sZWFuO1xuICByaWdodENsaWNrU2VsZWN0c1dvcmQ/OiBib29sZWFuO1xuICByb3dzPzogbnVtYmVyO1xuICBzY3JlZW5SZWFkZXJNb2RlPzogYm9vbGVhbjtcbiAgc2Nyb2xsYmFjaz86IG51bWJlcjtcbiAgc2Nyb2xsT25Vc2VySW5wdXQ/OiBib29sZWFuO1xuICBzY3JvbGxTZW5zaXRpdml0eT86IG51bWJlcjtcbiAgc21vb3RoU2Nyb2xsRHVyYXRpb24/OiBudW1iZXI7XG4gIHRhYlN0b3BXaWR0aD86IG51bWJlcjtcbiAgdGhlbWU/OiBJVGhlbWU7XG4gIHdpbmRvd3NNb2RlPzogYm9vbGVhbjtcbiAgd2luZG93c1B0eT86IElXaW5kb3dzUHR5O1xuICB3aW5kb3dPcHRpb25zPzogSVdpbmRvd09wdGlvbnM7XG4gIHdvcmRTZXBhcmF0b3I/OiBzdHJpbmc7XG4gIG92ZXJ2aWV3UnVsZXJXaWR0aD86IG51bWJlcjtcblxuICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIGNhbmNlbEV2ZW50czogYm9vbGVhbjtcbiAgdGVybU5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVGhlbWUge1xuICBmb3JlZ3JvdW5kPzogc3RyaW5nO1xuICBiYWNrZ3JvdW5kPzogc3RyaW5nO1xuICBjdXJzb3I/OiBzdHJpbmc7XG4gIGN1cnNvckFjY2VudD86IHN0cmluZztcbiAgc2VsZWN0aW9uRm9yZWdyb3VuZD86IHN0cmluZztcbiAgc2VsZWN0aW9uQmFja2dyb3VuZD86IHN0cmluZztcbiAgc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kPzogc3RyaW5nO1xuICBibGFjaz86IHN0cmluZztcbiAgcmVkPzogc3RyaW5nO1xuICBncmVlbj86IHN0cmluZztcbiAgeWVsbG93Pzogc3RyaW5nO1xuICBibHVlPzogc3RyaW5nO1xuICBtYWdlbnRhPzogc3RyaW5nO1xuICBjeWFuPzogc3RyaW5nO1xuICB3aGl0ZT86IHN0cmluZztcbiAgYnJpZ2h0QmxhY2s/OiBzdHJpbmc7XG4gIGJyaWdodFJlZD86IHN0cmluZztcbiAgYnJpZ2h0R3JlZW4/OiBzdHJpbmc7XG4gIGJyaWdodFllbGxvdz86IHN0cmluZztcbiAgYnJpZ2h0Qmx1ZT86IHN0cmluZztcbiAgYnJpZ2h0TWFnZW50YT86IHN0cmluZztcbiAgYnJpZ2h0Q3lhbj86IHN0cmluZztcbiAgYnJpZ2h0V2hpdGU/OiBzdHJpbmc7XG4gIGV4dGVuZGVkQW5zaT86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY29uc3QgSU9zY0xpbmtTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElPc2NMaW5rU2VydmljZT4oJ09zY0xpbmtTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElPc2NMaW5rU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgbGluayB0byB0aGUgc2VydmljZSwgcmV0dXJuaW5nIHRoZSBsaW5rIElELiBUaGUgbGluayBkYXRhIGlzIG1hbmFnZWQgYnkgdGhpc1xuICAgKiBzZXJ2aWNlIGFuZCB3aWxsIGJlIGZyZWVkIHdoZW4gdGhpcyBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiBpcyB0cmltbWVkIG9mZiB0aGUgYnVmZmVyLlxuICAgKi9cbiAgcmVnaXN0ZXJMaW5rKGxpbmtEYXRhOiBJT3NjTGlua0RhdGEpOiBudW1iZXI7XG4gIC8qKlxuICAgKiBBZGRzIGEgbGluZSB0byBhIGxpbmsgaWYgbmVlZGVkLlxuICAgKi9cbiAgYWRkTGluZVRvTGluayhsaW5rSWQ6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZDtcbiAgLyoqIEdldCB0aGUgbGluayBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIGxpbmsgSUQuICovXG4gIGdldExpbmtEYXRhKGxpbmtJZDogbnVtYmVyKTogSU9zY0xpbmtEYXRhIHwgdW5kZWZpbmVkO1xufVxuXG4vKlxuICogV2lkdGggYW5kIEdyYXBoZW1lX0NsdXN0ZXJfQnJlYWsgcHJvcGVydGllcyBvZiBhIGNoYXJhY3RlciBhcyBhIGJpdCBtYXNrLlxuICpcbiAqIGJpdCAwOiBzaG91bGRKb2luIC0gc2hvdWxkIGNvbWJpbmUgd2l0aCBwcmVjZWRpbmcgY2hhcmFjdGVyLlxuICogYml0IDEuLjI6IHdjd2lkdGggLSBzZWUgVW5pY29kZUNoYXJXaWR0aC5cbiAqIGJpdCAzLi4zMTogY2xhc3Mgb2YgY2hhcmFjdGVyIChjdXJyZW50bHkgb25seSA0IGJpdHMgYXJlIHVzZWQpLlxuICogICBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lZCBncmFwaGVtZSBjbHVzdGVyaW5nIC0gaS5lLiB3aGljaCBjb2RlcG9pbnRzXG4gKiAgIGFyZSB0byBiZSBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIGNvbXBvdW5kIGNoYXJhY3Rlci5cbiAqXG4gKiBVc2UgdGhlIFVuaWNvZGVTZXJ2aWNlIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eVZhbHVlIHRvIGNyZWF0ZSBhXG4gKiBVbmljb2RlQ2hhclByb3BlcnRpZXM7IHVzZSBleHRyYWN0U2hvdWxkSm9pbiwgZXh0cmFjdFdpZHRoLCBhbmRcbiAqIGV4dHJhY3RDaGFyS2luZCB0byBleHRyYWN0IHRoZSBjb21wb25lbnRzLlxuICovXG5leHBvcnQgdHlwZSBVbmljb2RlQ2hhclByb3BlcnRpZXMgPSBudW1iZXI7XG5cbi8qKlxuICogV2lkdGggaW4gY29sdW1ucyBvZiBhIGNoYXJhY3Rlci5cbiAqIEluIGEgQ0pLIGNvbnRleHQsIFwiaGFsZi13aWR0aFwiIGNoYXJhY3RlcnMgKHN1Y2ggYXMgTGF0aW4pIGFyZSB3aWR0aCAxLFxuICogd2hpbGUgXCJmdWxsLXdpZHRoXCIgY2hhcmFjdGVycyAoc3VjaCBhcyBLYW5qaSkgYXJlIDIgY29sdW1ucyB3aWRlLlxuICogQ29tYmluaW5nIGNoYXJhY3RlcnMgKHN1Y2ggYXMgYWNjZW50cykgYXJlIHdpZHRoIDAuXG4gKi9cbmV4cG9ydCB0eXBlIFVuaWNvZGVDaGFyV2lkdGggPSAwIHwgMSB8IDI7XG5cbmV4cG9ydCBjb25zdCBJVW5pY29kZVNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SVVuaWNvZGVTZXJ2aWNlPignVW5pY29kZVNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSVVuaWNvZGVTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG4gIC8qKiBSZWdpc3RlciBhbiBVbmljb2RlIHZlcnNpb24gcHJvdmlkZXIuICovXG4gIHJlZ2lzdGVyKHByb3ZpZGVyOiBJVW5pY29kZVZlcnNpb25Qcm92aWRlcik6IHZvaWQ7XG4gIC8qKiBSZWdpc3RlcmVkIFVuaWNvZGUgdmVyc2lvbnMuICovXG4gIHJlYWRvbmx5IHZlcnNpb25zOiBzdHJpbmdbXTtcbiAgLyoqIEN1cnJlbnRseSBhY3RpdmUgdmVyc2lvbi4gKi9cbiAgYWN0aXZlVmVyc2lvbjogc3RyaW5nO1xuICAvKiogRXZlbnQgdHJpZ2dlcmVkLCB3aGVuIGFjdGl2YXRlIHZlcnNpb24gY2hhbmdlZC4gKi9cbiAgcmVhZG9ubHkgb25DaGFuZ2U6IElFdmVudDxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBVbmljb2RlIHZlcnNpb24gZGVwZW5kZW50XG4gICAqL1xuICB3Y3dpZHRoKGNvZGVwb2ludDogbnVtYmVyKTogVW5pY29kZUNoYXJXaWR0aDtcbiAgZ2V0U3RyaW5nQ2VsbFdpZHRoKHM6IHN0cmluZyk6IG51bWJlcjtcbiAgLyoqXG4gICAqIFJldHVybiBjaGFyYWN0ZXIgd2lkdGggYW5kIHR5cGUgZm9yIGdyYXBoZW1lIGNsdXN0ZXJpbmcuXG4gICAqIElmIHByZWNlZGluZyAhPSAwLCBpdCBpcyB0aGUgcmV0dXJuIGNvZGUgZnJvbSB0aGUgcHJldmlvdXMgY2hhcmFjdGVyO1xuICAgKiBpbiB0aGF0IGNhc2UgdGhlIHJlc3VsdCBzcGVjaWZpZXMgaWYgdGhlIGNoYXJhY3RlcnMgc2hvdWxkIGJlIGpvaW5lZC5cbiAgICovXG4gIGNoYXJQcm9wZXJ0aWVzKGNvZGVwb2ludDogbnVtYmVyLCBwcmVjZWRpbmc6IFVuaWNvZGVDaGFyUHJvcGVydGllcyk6IFVuaWNvZGVDaGFyUHJvcGVydGllcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVW5pY29kZVZlcnNpb25Qcm92aWRlciB7XG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbiAgd2N3aWR0aCh1Y3M6IG51bWJlcik6IFVuaWNvZGVDaGFyV2lkdGg7XG4gIGNoYXJQcm9wZXJ0aWVzKGNvZGVwb2ludDogbnVtYmVyLCBwcmVjZWRpbmc6IFVuaWNvZGVDaGFyUHJvcGVydGllcyk6IFVuaWNvZGVDaGFyUHJvcGVydGllcztcbn1cblxuZXhwb3J0IGNvbnN0IElEZWNvcmF0aW9uU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJRGVjb3JhdGlvblNlcnZpY2U+KCdEZWNvcmF0aW9uU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJRGVjb3JhdGlvblNlcnZpY2UgZXh0ZW5kcyBJRGlzcG9zYWJsZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuICByZWFkb25seSBkZWNvcmF0aW9uczogSXRlcmFibGVJdGVyYXRvcjxJSW50ZXJuYWxEZWNvcmF0aW9uPjtcbiAgcmVhZG9ubHkgb25EZWNvcmF0aW9uUmVnaXN0ZXJlZDogSUV2ZW50PElJbnRlcm5hbERlY29yYXRpb24+O1xuICByZWFkb25seSBvbkRlY29yYXRpb25SZW1vdmVkOiBJRXZlbnQ8SUludGVybmFsRGVjb3JhdGlvbj47XG4gIHJlZ2lzdGVyRGVjb3JhdGlvbihkZWNvcmF0aW9uT3B0aW9uczogSURlY29yYXRpb25PcHRpb25zKTogSURlY29yYXRpb24gfCB1bmRlZmluZWQ7XG4gIHJlc2V0KCk6IHZvaWQ7XG4gIC8qKlxuICAgKiBUcmlnZ2VyIGEgY2FsbGJhY2sgb3ZlciB0aGUgZGVjb3JhdGlvbiBhdCBhIGNlbGwgKGluIG5vIHBhcnRpY3VsYXIgb3JkZXIpLiBUaGlzIHVzZXMgYSBjYWxsYmFja1xuICAgKiBpbnN0ZWFkIG9mIGFuIGl0ZXJhdG9yIGFzIGl0J3MgdHlwaWNhbGx5IHVzZWQgaW4gaG90IGNvZGUgcGF0aHMuXG4gICAqL1xuICBmb3JFYWNoRGVjb3JhdGlvbkF0Q2VsbCh4OiBudW1iZXIsIGxpbmU6IG51bWJlciwgbGF5ZXI6ICdib3R0b20nIHwgJ3RvcCcgfCB1bmRlZmluZWQsIGNhbGxiYWNrOiAoZGVjb3JhdGlvbjogSUludGVybmFsRGVjb3JhdGlvbikgPT4gdm9pZCk6IHZvaWQ7XG59XG5leHBvcnQgaW50ZXJmYWNlIElJbnRlcm5hbERlY29yYXRpb24gZXh0ZW5kcyBJRGVjb3JhdGlvbiB7XG4gIHJlYWRvbmx5IG9wdGlvbnM6IElEZWNvcmF0aW9uT3B0aW9ucztcbiAgcmVhZG9ubHkgYmFja2dyb3VuZENvbG9yUkdCOiBJQ29sb3IgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGZvcmVncm91bmRDb2xvclJHQjogSUNvbG9yIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBvblJlbmRlckVtaXR0ZXI6IElFdmVudEVtaXR0ZXI8SFRNTEVsZW1lbnQ+O1xufVxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKlxuICogKEVYUEVSSU1FTlRBTCkgVGhpcyBBZGRvbiBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudFxuICovXG5cbmltcG9ydCB0eXBlIHsgSUJ1ZmZlciwgSUJ1ZmZlckNlbGwsIElCdWZmZXJSYW5nZSwgSVRlcm1pbmFsQWRkb24sIFRlcm1pbmFsIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcbmltcG9ydCB0eXBlIHsgSUhUTUxTZXJpYWxpemVPcHRpb25zLCBTZXJpYWxpemVBZGRvbiBhcyBJU2VyaWFsaXplQXBpLCBJU2VyaWFsaXplT3B0aW9ucywgSVNlcmlhbGl6ZVJhbmdlIH0gZnJvbSAnQHh0ZXJtL2FkZG9uLXNlcmlhbGl6ZSc7XG5pbXBvcnQgeyBERUZBVUxUX0FOU0lfQ09MT1JTIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9UaGVtZVNlcnZpY2UnO1xuaW1wb3J0IHsgSUF0dHJpYnV0ZURhdGEsIElDb2xvciB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbmZ1bmN0aW9uIGNvbnN0cmFpbih2YWx1ZTogbnVtYmVyLCBsb3c6IG51bWJlciwgaGlnaDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGgubWF4KGxvdywgTWF0aC5taW4odmFsdWUsIGhpZ2gpKTtcbn1cblxuLy8gVE9ETzogUmVmaW5lIHRoaXMgdGVtcGxhdGUgY2xhc3MgbGF0ZXJcbmFic3RyYWN0IGNsYXNzIEJhc2VTZXJpYWxpemVIYW5kbGVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9idWZmZXI6IElCdWZmZXJcbiAgKSB7XG4gIH1cblxuICBwdWJsaWMgc2VyaWFsaXplKHJhbmdlOiBJQnVmZmVyUmFuZ2UsIGV4Y2x1ZGVGaW5hbEN1cnNvclBvc2l0aW9uPzogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgLy8gd2UgbmVlZCB0d28gb2YgdGhlbSB0byBmbGlwIGJldHdlZW4gb2xkIGFuZCBuZXcgY2VsbFxuICAgIGNvbnN0IGNlbGwxID0gdGhpcy5fYnVmZmVyLmdldE51bGxDZWxsKCk7XG4gICAgY29uc3QgY2VsbDIgPSB0aGlzLl9idWZmZXIuZ2V0TnVsbENlbGwoKTtcbiAgICBsZXQgb2xkQ2VsbCA9IGNlbGwxO1xuXG4gICAgY29uc3Qgc3RhcnRSb3cgPSByYW5nZS5zdGFydC55O1xuICAgIGNvbnN0IGVuZFJvdyA9IHJhbmdlLmVuZC55O1xuICAgIGNvbnN0IHN0YXJ0Q29sdW1uID0gcmFuZ2Uuc3RhcnQueDtcbiAgICBjb25zdCBlbmRDb2x1bW4gPSByYW5nZS5lbmQueDtcblxuICAgIHRoaXMuX2JlZm9yZVNlcmlhbGl6ZShlbmRSb3cgLSBzdGFydFJvdywgc3RhcnRSb3csIGVuZFJvdyk7XG5cbiAgICBmb3IgKGxldCByb3cgPSBzdGFydFJvdzsgcm93IDw9IGVuZFJvdzsgcm93KyspIHtcbiAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLl9idWZmZXIuZ2V0TGluZShyb3cpO1xuICAgICAgaWYgKGxpbmUpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRMaW5lQ29sdW1uID0gcm93ID09PSByYW5nZS5zdGFydC55ID8gc3RhcnRDb2x1bW4gOiAwO1xuICAgICAgICBjb25zdCBlbmRMaW5lQ29sdW1uID0gcm93ID09PSByYW5nZS5lbmQueSA/IGVuZENvbHVtbjogbGluZS5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGNvbCA9IHN0YXJ0TGluZUNvbHVtbjsgY29sIDwgZW5kTGluZUNvbHVtbjsgY29sKyspIHtcbiAgICAgICAgICBjb25zdCBjID0gbGluZS5nZXRDZWxsKGNvbCwgb2xkQ2VsbCA9PT0gY2VsbDEgPyBjZWxsMiA6IGNlbGwxKTtcbiAgICAgICAgICBpZiAoIWMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgQ2FuJ3QgZ2V0IGNlbGwgYXQgcm93PSR7cm93fSwgY29sPSR7Y29sfWApO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX25leHRDZWxsKGMsIG9sZENlbGwsIHJvdywgY29sKTtcbiAgICAgICAgICBvbGRDZWxsID0gYztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5fcm93RW5kKHJvdywgcm93ID09PSBlbmRSb3cpO1xuICAgIH1cblxuICAgIHRoaXMuX2FmdGVyU2VyaWFsaXplKCk7XG5cbiAgICByZXR1cm4gdGhpcy5fc2VyaWFsaXplU3RyaW5nKGV4Y2x1ZGVGaW5hbEN1cnNvclBvc2l0aW9uKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfbmV4dENlbGwoY2VsbDogSUJ1ZmZlckNlbGwsIG9sZENlbGw6IElCdWZmZXJDZWxsLCByb3c6IG51bWJlciwgY29sOiBudW1iZXIpOiB2b2lkIHsgfVxuICBwcm90ZWN0ZWQgX3Jvd0VuZChyb3c6IG51bWJlciwgaXNMYXN0Um93OiBib29sZWFuKTogdm9pZCB7IH1cbiAgcHJvdGVjdGVkIF9iZWZvcmVTZXJpYWxpemUocm93czogbnVtYmVyLCBzdGFydFJvdzogbnVtYmVyLCBlbmRSb3c6IG51bWJlcik6IHZvaWQgeyB9XG4gIHByb3RlY3RlZCBfYWZ0ZXJTZXJpYWxpemUoKTogdm9pZCB7IH1cbiAgcHJvdGVjdGVkIF9zZXJpYWxpemVTdHJpbmcoZXhjbHVkZUZpbmFsQ3Vyc29yUG9zaXRpb24/OiBib29sZWFuKTogc3RyaW5nIHsgcmV0dXJuICcnOyB9XG59XG5cbmZ1bmN0aW9uIGVxdWFsRmcoY2VsbDE6IElCdWZmZXJDZWxsIHwgSUF0dHJpYnV0ZURhdGEsIGNlbGwyOiBJQnVmZmVyQ2VsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2VsbDEuZ2V0RmdDb2xvck1vZGUoKSA9PT0gY2VsbDIuZ2V0RmdDb2xvck1vZGUoKVxuICAgICYmIGNlbGwxLmdldEZnQ29sb3IoKSA9PT0gY2VsbDIuZ2V0RmdDb2xvcigpO1xufVxuXG5mdW5jdGlvbiBlcXVhbEJnKGNlbGwxOiBJQnVmZmVyQ2VsbCB8IElBdHRyaWJ1dGVEYXRhLCBjZWxsMjogSUJ1ZmZlckNlbGwpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNlbGwxLmdldEJnQ29sb3JNb2RlKCkgPT09IGNlbGwyLmdldEJnQ29sb3JNb2RlKClcbiAgICAmJiBjZWxsMS5nZXRCZ0NvbG9yKCkgPT09IGNlbGwyLmdldEJnQ29sb3IoKTtcbn1cblxuZnVuY3Rpb24gZXF1YWxGbGFncyhjZWxsMTogSUJ1ZmZlckNlbGwgfCBJQXR0cmlidXRlRGF0YSwgY2VsbDI6IElCdWZmZXJDZWxsKTogYm9vbGVhbiB7XG4gIHJldHVybiBjZWxsMS5pc0ludmVyc2UoKSA9PT0gY2VsbDIuaXNJbnZlcnNlKClcbiAgICAmJiBjZWxsMS5pc0JvbGQoKSA9PT0gY2VsbDIuaXNCb2xkKClcbiAgICAmJiBjZWxsMS5pc1VuZGVybGluZSgpID09PSBjZWxsMi5pc1VuZGVybGluZSgpXG4gICAgJiYgY2VsbDEuaXNPdmVybGluZSgpID09PSBjZWxsMi5pc092ZXJsaW5lKClcbiAgICAmJiBjZWxsMS5pc0JsaW5rKCkgPT09IGNlbGwyLmlzQmxpbmsoKVxuICAgICYmIGNlbGwxLmlzSW52aXNpYmxlKCkgPT09IGNlbGwyLmlzSW52aXNpYmxlKClcbiAgICAmJiBjZWxsMS5pc0l0YWxpYygpID09PSBjZWxsMi5pc0l0YWxpYygpXG4gICAgJiYgY2VsbDEuaXNEaW0oKSA9PT0gY2VsbDIuaXNEaW0oKVxuICAgICYmIGNlbGwxLmlzU3RyaWtldGhyb3VnaCgpID09PSBjZWxsMi5pc1N0cmlrZXRocm91Z2goKTtcbn1cblxuY2xhc3MgU3RyaW5nU2VyaWFsaXplSGFuZGxlciBleHRlbmRzIEJhc2VTZXJpYWxpemVIYW5kbGVyIHtcbiAgcHJpdmF0ZSBfcm93SW5kZXg6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2FsbFJvd3M6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBfYWxsUm93U2VwYXJhdG9yczogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICBwcml2YXRlIF9jdXJyZW50Um93OiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfbnVsbENlbGxDb3VudDogbnVtYmVyID0gMDtcblxuICAvLyB3ZSBjYW4gc2VlIGEgZnVsbCBjb2xvcmVkIGNlbGwgYW5kIGEgbnVsbCBjZWxsIHRoYXQgb25seSBoYXZlIGJhY2tncm91bmQgdGhlIHNhbWUgc3R5bGVcbiAgLy8gYnV0IHRoZSBpbmZvcm1hdGlvbiBpc24ndCBwcmVzZXJ2ZWQgYnkgbnVsbCBjZWxsIGl0c2VsZlxuICAvLyBzbyB3ZWUgbmVlZCB0byByZWNvcmQgaXQgd2hlbiByZXF1aXJlZC5cbiAgcHJpdmF0ZSBfY3Vyc29yU3R5bGU6IElCdWZmZXJDZWxsID0gdGhpcy5fYnVmZmVyLmdldE51bGxDZWxsKCk7XG5cbiAgLy8gd2hlcmUgZXhhY3QgdGhlIGN1cnNvciBzdHlsZXMgY29tZXMgZnJvbVxuICAvLyBiZWNhdXNlIHdlIGNhbid0IGNvcHkgdGhlIGNlbGwgZGlyZWN0bHlcbiAgLy8gc28gd2UgcmVtZW1iZXIgd2hlcmUgdGhlIGNvbnRlbnQgY29tZXMgZnJvbSBpbnN0ZWFkXG4gIHByaXZhdGUgX2N1cnNvclN0eWxlUm93OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9jdXJzb3JTdHlsZUNvbDogbnVtYmVyID0gMDtcblxuICAvLyB0aGlzIGlzIGEgbnVsbCBjZWxsIGZvciByZWZlcmVuY2UgZm9yIGNoZWNraW5nIHdoZXRoZXIgYmFja2dyb3VuZCBpcyBlbXB0eSBvciBub3RcbiAgcHJpdmF0ZSBfYmFja2dyb3VuZENlbGw6IElCdWZmZXJDZWxsID0gdGhpcy5fYnVmZmVyLmdldE51bGxDZWxsKCk7XG5cbiAgcHJpdmF0ZSBfZmlyc3RSb3c6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2xhc3RDdXJzb3JSb3c6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2xhc3RDdXJzb3JDb2w6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2xhc3RDb250ZW50Q3Vyc29yUm93OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9sYXN0Q29udGVudEN1cnNvckNvbDogbnVtYmVyID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBidWZmZXI6IElCdWZmZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGVybWluYWw6IFRlcm1pbmFsXG4gICkge1xuICAgIHN1cGVyKGJ1ZmZlcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2JlZm9yZVNlcmlhbGl6ZShyb3dzOiBudW1iZXIsIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fYWxsUm93cyA9IG5ldyBBcnJheTxzdHJpbmc+KHJvd3MpO1xuICAgIHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yUm93ID0gc3RhcnQ7XG4gICAgdGhpcy5fbGFzdEN1cnNvclJvdyA9IHN0YXJ0O1xuICAgIHRoaXMuX2ZpcnN0Um93ID0gc3RhcnQ7XG4gIH1cblxuICBwcml2YXRlIF90aGlzUm93TGFzdENoYXI6IElCdWZmZXJDZWxsID0gdGhpcy5fYnVmZmVyLmdldE51bGxDZWxsKCk7XG4gIHByaXZhdGUgX3RoaXNSb3dMYXN0U2Vjb25kQ2hhcjogSUJ1ZmZlckNlbGwgPSB0aGlzLl9idWZmZXIuZ2V0TnVsbENlbGwoKTtcbiAgcHJpdmF0ZSBfbmV4dFJvd0ZpcnN0Q2hhcjogSUJ1ZmZlckNlbGwgPSB0aGlzLl9idWZmZXIuZ2V0TnVsbENlbGwoKTtcbiAgcHJvdGVjdGVkIF9yb3dFbmQocm93OiBudW1iZXIsIGlzTGFzdFJvdzogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIGlmIHRoZXJlIGlzIGNvbG9yZnVsIGVtcHR5IGNlbGwgYXQgbGluZSBlbmQsIHdoZSBtdXN0IHBhZCBpdCBiYWNrLCBvciB0aGUgdGhlIGNvbG9yIGJsb2NrXG4gICAgLy8gd2lsbCBtaXNzaW5nXG4gICAgaWYgKHRoaXMuX251bGxDZWxsQ291bnQgPiAwICYmICFlcXVhbEJnKHRoaXMuX2N1cnNvclN0eWxlLCB0aGlzLl9iYWNrZ3JvdW5kQ2VsbCkpIHtcbiAgICAgIC8vIHVzZSBjbGVhciByaWdodCB0byBzZXQgYmFja2dyb3VuZC5cbiAgICAgIHRoaXMuX2N1cnJlbnRSb3cgKz0gYFxcdTAwMWJbJHt0aGlzLl9udWxsQ2VsbENvdW50fVhgO1xuICAgIH1cblxuICAgIGxldCByb3dTZXBhcmF0b3IgPSAnJztcblxuICAgIC8vIGhhbmRsZSByb3cgc2VwYXJhdG9yXG4gICAgaWYgKCFpc0xhc3RSb3cpIHtcbiAgICAgIC8vIEVuYWJsZSBCQ0VcbiAgICAgIGlmIChyb3cgLSB0aGlzLl9maXJzdFJvdyA+PSB0aGlzLl90ZXJtaW5hbC5yb3dzKSB7XG4gICAgICAgIHRoaXMuX2J1ZmZlci5nZXRMaW5lKHRoaXMuX2N1cnNvclN0eWxlUm93KT8uZ2V0Q2VsbCh0aGlzLl9jdXJzb3JTdHlsZUNvbCwgdGhpcy5fYmFja2dyb3VuZENlbGwpO1xuICAgICAgfVxuXG4gICAgICAvLyBGZXRjaCBjdXJyZW50IGxpbmVcbiAgICAgIGNvbnN0IGN1cnJlbnRMaW5lID0gdGhpcy5fYnVmZmVyLmdldExpbmUocm93KSE7XG4gICAgICAvLyBGZXRjaCBuZXh0IGxpbmVcbiAgICAgIGNvbnN0IG5leHRMaW5lID0gdGhpcy5fYnVmZmVyLmdldExpbmUocm93ICsgMSkhO1xuXG4gICAgICBpZiAoIW5leHRMaW5lLmlzV3JhcHBlZCkge1xuICAgICAgICAvLyBqdXN0IGluc2VydCB0aGUgbGluZSBicmVha1xuICAgICAgICByb3dTZXBhcmF0b3IgPSAnXFxyXFxuJztcbiAgICAgICAgLy8gd2Ugc2VuZGVkIHRoZSBlbnRlclxuICAgICAgICB0aGlzLl9sYXN0Q3Vyc29yUm93ID0gcm93ICsgMTtcbiAgICAgICAgdGhpcy5fbGFzdEN1cnNvckNvbCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByb3dTZXBhcmF0b3IgPSAnJztcbiAgICAgICAgY29uc3QgdGhpc1Jvd0xhc3RDaGFyID0gY3VycmVudExpbmUuZ2V0Q2VsbChjdXJyZW50TGluZS5sZW5ndGggLSAxLCB0aGlzLl90aGlzUm93TGFzdENoYXIpITtcbiAgICAgICAgY29uc3QgdGhpc1Jvd0xhc3RTZWNvbmRDaGFyID0gY3VycmVudExpbmUuZ2V0Q2VsbChjdXJyZW50TGluZS5sZW5ndGggLSAyLCB0aGlzLl90aGlzUm93TGFzdFNlY29uZENoYXIpITtcbiAgICAgICAgY29uc3QgbmV4dFJvd0ZpcnN0Q2hhciA9IG5leHRMaW5lLmdldENlbGwoMCwgdGhpcy5fbmV4dFJvd0ZpcnN0Q2hhcikhO1xuICAgICAgICBjb25zdCBpc05leHRSb3dGaXJzdENoYXJEb3VibGVXaWR0aCA9IG5leHRSb3dGaXJzdENoYXIuZ2V0V2lkdGgoKSA+IDE7XG5cbiAgICAgICAgLy8gdmFsaWRhdGUgd2hldGhlciB0aGlzIGxpbmUgd3JhcCBpcyBldmVyIHBvc3NpYmxlXG4gICAgICAgIC8vIHdoaWNoIG1lYW4gd2hldGhlciBjdXJzb3IgY2FuIHBsYWNlZCBhdCBhIG92ZXJmbG93IHBvc2l0aW9uICh4ID09PSByb3cpIG5hdHVyYWxseVxuICAgICAgICBsZXQgaXNWYWxpZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAvLyB5b3UgbXVzdCBvdXRwdXQgY2hhcmFjdGVyIHRvIGNhdXNlIG92ZXJmbG93LCBjb250cm9sIHNlcXVlbmNlIGNhbid0IGRvIHRoaXNcbiAgICAgICAgICBuZXh0Um93Rmlyc3RDaGFyLmdldENoYXJzKCkgJiZcbiAgICAgICAgICAgIGlzTmV4dFJvd0ZpcnN0Q2hhckRvdWJsZVdpZHRoID8gdGhpcy5fbnVsbENlbGxDb3VudCA8PSAxIDogdGhpcy5fbnVsbENlbGxDb3VudCA8PSAwXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIC8vIHRoZSBsYXN0IGNoYXJhY3RlciBjYW4ndCBiZSBudWxsLFxuICAgICAgICAgICAgLy8geW91IGNhbid0IHVzZSBjb250cm9sIHNlcXVlbmNlIHRvIG1vdmUgY3Vyc29yIHRvICh4ID09PSByb3cpXG4gICAgICAgICAgICAodGhpc1Jvd0xhc3RDaGFyLmdldENoYXJzKCkgfHwgdGhpc1Jvd0xhc3RDaGFyLmdldFdpZHRoKCkgPT09IDApICYmXG4gICAgICAgICAgICAvLyBjaGFuZ2UgYmFja2dyb3VuZCBvZiB0aGUgZmlyc3Qgd3JhcHBlZCBjZWxsIGFsc28gYWZmZWN0cyBCQ0VcbiAgICAgICAgICAgIC8vIHNvIHdlIG1hcmsgaXQgYXMgaW52YWxpZCB0byBzaW1wbHkgdGhlIHByb2Nlc3MgdG8gZGV0ZXJtaW5lIGxpbmUgc2VwYXJhdG9yXG4gICAgICAgICAgICBlcXVhbEJnKHRoaXNSb3dMYXN0Q2hhciwgbmV4dFJvd0ZpcnN0Q2hhcilcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGlzVmFsaWQgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIC8vIHRoZSBzZWNvbmQgdG8gbGFzdCBjaGFyYWN0ZXIgY2FuJ3QgYmUgbnVsbCBpZiB0aGUgbmV4dCBsaW5lIHN0YXJ0cyB3aXRoIENKSyxcbiAgICAgICAgICAgIC8vIHlvdSBjYW4ndCB1c2UgY29udHJvbCBzZXF1ZW5jZSB0byBtb3ZlIGN1cnNvciB0byAoeCA9PT0gcm93KVxuICAgICAgICAgICAgaXNOZXh0Um93Rmlyc3RDaGFyRG91YmxlV2lkdGggJiZcbiAgICAgICAgICAgICh0aGlzUm93TGFzdFNlY29uZENoYXIuZ2V0Q2hhcnMoKSB8fCB0aGlzUm93TGFzdFNlY29uZENoYXIuZ2V0V2lkdGgoKSA9PT0gMCkgJiZcbiAgICAgICAgICAgIC8vIGNoYW5nZSBiYWNrZ3JvdW5kIG9mIHRoZSBmaXJzdCB3cmFwcGVkIGNlbGwgYWxzbyBhZmZlY3RzIEJDRVxuICAgICAgICAgICAgLy8gc28gd2UgbWFyayBpdCBhcyBpbnZhbGlkIHRvIHNpbXBseSB0aGUgcHJvY2VzcyB0byBkZXRlcm1pbmUgbGluZSBzZXBhcmF0b3JcbiAgICAgICAgICAgIGVxdWFsQmcodGhpc1Jvd0xhc3RDaGFyLCBuZXh0Um93Rmlyc3RDaGFyKSAmJlxuICAgICAgICAgICAgZXF1YWxCZyh0aGlzUm93TGFzdFNlY29uZENoYXIsIG5leHRSb3dGaXJzdENoYXIpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgICAvLyBmb3JjZSB0aGUgd3JhcCB3aXRoIG1hZ2ljXG4gICAgICAgICAgLy8gaW5zZXJ0IGVub3VnaCBjaGFyYWN0ZXIgdG8gZm9yY2UgdGhlIHdyYXBcbiAgICAgICAgICByb3dTZXBhcmF0b3IgPSAnLScucmVwZWF0KHRoaXMuX251bGxDZWxsQ291bnQgKyAxKTtcbiAgICAgICAgICAvLyBtb3ZlIGJhY2sgYW5kIGVyYXNlIG5leHQgbGluZSBoZWFkXG4gICAgICAgICAgcm93U2VwYXJhdG9yICs9ICdcXHUwMDFiWzFEXFx1MDAxYlsxWCc7XG5cbiAgICAgICAgICBpZiAodGhpcy5fbnVsbENlbGxDb3VudCA+IDApIHtcbiAgICAgICAgICAgIC8vIGRvIHRoZXNlIGJlY2F1c2Ugd2UgZmlsbGVkIHRoZSBsYXN0IHNldmVyYWwgbnVsbCBzbG90LCB3aGljaCB3ZSBzaG91bGRuJ3RcbiAgICAgICAgICAgIHJvd1NlcGFyYXRvciArPSAnXFx1MDAxYltBJztcbiAgICAgICAgICAgIHJvd1NlcGFyYXRvciArPSBgXFx1MDAxYlske2N1cnJlbnRMaW5lLmxlbmd0aCAtIHRoaXMuX251bGxDZWxsQ291bnR9Q2A7XG4gICAgICAgICAgICByb3dTZXBhcmF0b3IgKz0gYFxcdTAwMWJbJHt0aGlzLl9udWxsQ2VsbENvdW50fVhgO1xuICAgICAgICAgICAgcm93U2VwYXJhdG9yICs9IGBcXHUwMDFiWyR7Y3VycmVudExpbmUubGVuZ3RoIC0gdGhpcy5fbnVsbENlbGxDb3VudH1EYDtcbiAgICAgICAgICAgIHJvd1NlcGFyYXRvciArPSAnXFx1MDAxYltCJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUaGlzIGlzIGNvbnRlbnQgYW5kIG5lZWQgdGhlIGJlIHNlcmlhbGl6ZWQgZXZlbiBpdCBpcyBpbnZpc2libGUuXG4gICAgICAgICAgLy8gd2l0aG91dCB0aGlzLCB3cmFwIHdpbGwgYmUgbWlzc2luZyBmcm9tIG91dHB1dHMuXG4gICAgICAgICAgdGhpcy5fbGFzdENvbnRlbnRDdXJzb3JSb3cgPSByb3cgKyAxO1xuICAgICAgICAgIHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yQ29sID0gMDtcblxuICAgICAgICAgIC8vIGZvcmNlIGNvbW1pdCB0aGUgY3Vyc29yIHBvc2l0aW9uXG4gICAgICAgICAgdGhpcy5fbGFzdEN1cnNvclJvdyA9IHJvdyArIDE7XG4gICAgICAgICAgdGhpcy5fbGFzdEN1cnNvckNvbCA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9hbGxSb3dzW3RoaXMuX3Jvd0luZGV4XSA9IHRoaXMuX2N1cnJlbnRSb3c7XG4gICAgdGhpcy5fYWxsUm93U2VwYXJhdG9yc1t0aGlzLl9yb3dJbmRleCsrXSA9IHJvd1NlcGFyYXRvcjtcbiAgICB0aGlzLl9jdXJyZW50Um93ID0gJyc7XG4gICAgdGhpcy5fbnVsbENlbGxDb3VudCA9IDA7XG4gIH1cblxuICBwcml2YXRlIF9kaWZmU3R5bGUoY2VsbDogSUJ1ZmZlckNlbGwgfCBJQXR0cmlidXRlRGF0YSwgb2xkQ2VsbDogSUJ1ZmZlckNlbGwpOiBudW1iZXJbXSB7XG4gICAgY29uc3Qgc2dyU2VxOiBudW1iZXJbXSA9IFtdO1xuICAgIGNvbnN0IGZnQ2hhbmdlZCA9ICFlcXVhbEZnKGNlbGwsIG9sZENlbGwpO1xuICAgIGNvbnN0IGJnQ2hhbmdlZCA9ICFlcXVhbEJnKGNlbGwsIG9sZENlbGwpO1xuICAgIGNvbnN0IGZsYWdzQ2hhbmdlZCA9ICFlcXVhbEZsYWdzKGNlbGwsIG9sZENlbGwpO1xuXG4gICAgaWYgKGZnQ2hhbmdlZCB8fCBiZ0NoYW5nZWQgfHwgZmxhZ3NDaGFuZ2VkKSB7XG4gICAgICBpZiAoY2VsbC5pc0F0dHJpYnV0ZURlZmF1bHQoKSkge1xuICAgICAgICBpZiAoIW9sZENlbGwuaXNBdHRyaWJ1dGVEZWZhdWx0KCkpIHtcbiAgICAgICAgICBzZ3JTZXEucHVzaCgwKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZnQ2hhbmdlZCkge1xuICAgICAgICAgIGNvbnN0IGNvbG9yID0gY2VsbC5nZXRGZ0NvbG9yKCk7XG4gICAgICAgICAgaWYgKGNlbGwuaXNGZ1JHQigpKSB7IHNnclNlcS5wdXNoKDM4LCAyLCAoY29sb3IgPj4+IDE2KSAmIDB4RkYsIChjb2xvciA+Pj4gOCkgJiAweEZGLCBjb2xvciAmIDB4RkYpOyB9XG4gICAgICAgICAgZWxzZSBpZiAoY2VsbC5pc0ZnUGFsZXR0ZSgpKSB7XG4gICAgICAgICAgICBpZiAoY29sb3IgPj0gMTYpIHsgc2dyU2VxLnB1c2goMzgsIDUsIGNvbG9yKTsgfVxuICAgICAgICAgICAgZWxzZSB7IHNnclNlcS5wdXNoKGNvbG9yICYgOCA/IDkwICsgKGNvbG9yICYgNykgOiAzMCArIChjb2xvciAmIDcpKTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHsgc2dyU2VxLnB1c2goMzkpOyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJnQ2hhbmdlZCkge1xuICAgICAgICAgIGNvbnN0IGNvbG9yID0gY2VsbC5nZXRCZ0NvbG9yKCk7XG4gICAgICAgICAgaWYgKGNlbGwuaXNCZ1JHQigpKSB7IHNnclNlcS5wdXNoKDQ4LCAyLCAoY29sb3IgPj4+IDE2KSAmIDB4RkYsIChjb2xvciA+Pj4gOCkgJiAweEZGLCBjb2xvciAmIDB4RkYpOyB9XG4gICAgICAgICAgZWxzZSBpZiAoY2VsbC5pc0JnUGFsZXR0ZSgpKSB7XG4gICAgICAgICAgICBpZiAoY29sb3IgPj0gMTYpIHsgc2dyU2VxLnB1c2goNDgsIDUsIGNvbG9yKTsgfVxuICAgICAgICAgICAgZWxzZSB7IHNnclNlcS5wdXNoKGNvbG9yICYgOCA/IDEwMCArIChjb2xvciAmIDcpIDogNDAgKyAoY29sb3IgJiA3KSk7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7IHNnclNlcS5wdXNoKDQ5KTsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmbGFnc0NoYW5nZWQpIHtcbiAgICAgICAgICBpZiAoY2VsbC5pc0ludmVyc2UoKSAhPT0gb2xkQ2VsbC5pc0ludmVyc2UoKSkgeyBzZ3JTZXEucHVzaChjZWxsLmlzSW52ZXJzZSgpID8gNyA6IDI3KTsgfVxuICAgICAgICAgIGlmIChjZWxsLmlzQm9sZCgpICE9PSBvbGRDZWxsLmlzQm9sZCgpKSB7IHNnclNlcS5wdXNoKGNlbGwuaXNCb2xkKCkgPyAxIDogMjIpOyB9XG4gICAgICAgICAgaWYgKGNlbGwuaXNVbmRlcmxpbmUoKSAhPT0gb2xkQ2VsbC5pc1VuZGVybGluZSgpKSB7IHNnclNlcS5wdXNoKGNlbGwuaXNVbmRlcmxpbmUoKSA/IDQgOiAyNCk7IH1cbiAgICAgICAgICBpZiAoY2VsbC5pc092ZXJsaW5lKCkgIT09IG9sZENlbGwuaXNPdmVybGluZSgpKSB7IHNnclNlcS5wdXNoKGNlbGwuaXNPdmVybGluZSgpID8gNTMgOiA1NSk7IH1cbiAgICAgICAgICBpZiAoY2VsbC5pc0JsaW5rKCkgIT09IG9sZENlbGwuaXNCbGluaygpKSB7IHNnclNlcS5wdXNoKGNlbGwuaXNCbGluaygpID8gNSA6IDI1KTsgfVxuICAgICAgICAgIGlmIChjZWxsLmlzSW52aXNpYmxlKCkgIT09IG9sZENlbGwuaXNJbnZpc2libGUoKSkgeyBzZ3JTZXEucHVzaChjZWxsLmlzSW52aXNpYmxlKCkgPyA4IDogMjgpOyB9XG4gICAgICAgICAgaWYgKGNlbGwuaXNJdGFsaWMoKSAhPT0gb2xkQ2VsbC5pc0l0YWxpYygpKSB7IHNnclNlcS5wdXNoKGNlbGwuaXNJdGFsaWMoKSA/IDMgOiAyMyk7IH1cbiAgICAgICAgICBpZiAoY2VsbC5pc0RpbSgpICE9PSBvbGRDZWxsLmlzRGltKCkpIHsgc2dyU2VxLnB1c2goY2VsbC5pc0RpbSgpID8gMiA6IDIyKTsgfVxuICAgICAgICAgIGlmIChjZWxsLmlzU3RyaWtldGhyb3VnaCgpICE9PSBvbGRDZWxsLmlzU3RyaWtldGhyb3VnaCgpKSB7IHNnclNlcS5wdXNoKGNlbGwuaXNTdHJpa2V0aHJvdWdoKCkgPyA5IDogMjkpOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2dyU2VxO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9uZXh0Q2VsbChjZWxsOiBJQnVmZmVyQ2VsbCwgb2xkQ2VsbDogSUJ1ZmZlckNlbGwsIHJvdzogbnVtYmVyLCBjb2w6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIGEgd2lkdGggMCBjZWxsIGRvbid0IG5lZWQgdG8gYmUgY291bnQgYmVjYXVzZSBpdCBpcyBqdXN0IGEgcGxhY2Vob2xkZXIgYWZ0ZXIgYSBDSksgY2hhcmFjdGVyO1xuICAgIGNvbnN0IGlzUGxhY2VIb2xkZXJDZWxsID0gY2VsbC5nZXRXaWR0aCgpID09PSAwO1xuXG4gICAgaWYgKGlzUGxhY2VIb2xkZXJDZWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gdGhpcyBjZWxsIGRvbid0IGhhdmUgY29udGVudFxuICAgIGNvbnN0IGlzRW1wdHlDZWxsID0gY2VsbC5nZXRDaGFycygpID09PSAnJztcblxuICAgIGNvbnN0IHNnclNlcSA9IHRoaXMuX2RpZmZTdHlsZShjZWxsLCB0aGlzLl9jdXJzb3JTdHlsZSk7XG5cbiAgICAvLyB0aGUgZW1wdHkgY2VsbCBzdHlsZSBpcyBvbmx5IGFzc3VtZWQgdG8gYmUgY2hhbmdlZCB3aGVuIGJhY2tncm91bmQgY2hhbmdlZCwgYmVjYXVzZVxuICAgIC8vIGZvcmVncm91bmQgaXMgYWx3YXlzIDAuXG4gICAgY29uc3Qgc3R5bGVDaGFuZ2VkID0gaXNFbXB0eUNlbGwgPyAhZXF1YWxCZyh0aGlzLl9jdXJzb3JTdHlsZSwgY2VsbCkgOiBzZ3JTZXEubGVuZ3RoID4gMDtcblxuICAgIC8qKlxuICAgICAqICBoYW5kbGVzIHN0eWxlIGNoYW5nZVxuICAgICAqL1xuICAgIGlmIChzdHlsZUNoYW5nZWQpIHtcbiAgICAgIC8vIGJlZm9yZSB1cGRhdGUgdGhlIHN0eWxlLCB3ZSBuZWVkIHRvIGZpbGwgZW1wdHkgY2VsbCBiYWNrXG4gICAgICBpZiAodGhpcy5fbnVsbENlbGxDb3VudCA+IDApIHtcbiAgICAgICAgLy8gdXNlIGNsZWFyIHJpZ2h0IHRvIHNldCBiYWNrZ3JvdW5kLlxuICAgICAgICBpZiAoIWVxdWFsQmcodGhpcy5fY3Vyc29yU3R5bGUsIHRoaXMuX2JhY2tncm91bmRDZWxsKSkge1xuICAgICAgICAgIHRoaXMuX2N1cnJlbnRSb3cgKz0gYFxcdTAwMWJbJHt0aGlzLl9udWxsQ2VsbENvdW50fVhgO1xuICAgICAgICB9XG4gICAgICAgIC8vIHVzZSBtb3ZlIHJpZ2h0IHRvIG1vdmUgY3Vyc29yLlxuICAgICAgICB0aGlzLl9jdXJyZW50Um93ICs9IGBcXHUwMDFiWyR7dGhpcy5fbnVsbENlbGxDb3VudH1DYDtcbiAgICAgICAgdGhpcy5fbnVsbENlbGxDb3VudCA9IDA7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yUm93ID0gdGhpcy5fbGFzdEN1cnNvclJvdyA9IHJvdztcbiAgICAgIHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yQ29sID0gdGhpcy5fbGFzdEN1cnNvckNvbCA9IGNvbDtcblxuICAgICAgdGhpcy5fY3VycmVudFJvdyArPSBgXFx1MDAxYlske3NnclNlcS5qb2luKCc7Jyl9bWA7XG5cbiAgICAgIC8vIHVwZGF0ZSB0aGUgbGFzdCBjdXJzb3Igc3R5bGVcbiAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLl9idWZmZXIuZ2V0TGluZShyb3cpO1xuICAgICAgaWYgKGxpbmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsaW5lLmdldENlbGwoY29sLCB0aGlzLl9jdXJzb3JTdHlsZSk7XG4gICAgICAgIHRoaXMuX2N1cnNvclN0eWxlUm93ID0gcm93O1xuICAgICAgICB0aGlzLl9jdXJzb3JTdHlsZUNvbCA9IGNvbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgaGFuZGxlcyBhY3R1YWwgY29udGVudFxuICAgICAqL1xuICAgIGlmIChpc0VtcHR5Q2VsbCkge1xuICAgICAgdGhpcy5fbnVsbENlbGxDb3VudCArPSBjZWxsLmdldFdpZHRoKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLl9udWxsQ2VsbENvdW50ID4gMCkge1xuICAgICAgICAvLyB3ZSBjYW4ganVzdCBhc3N1bWUgd2UgaGF2ZSBzYW1lIHN0eWxlIHdpdGggcHJldmlvdXMgb25lIGhlcmVcbiAgICAgICAgLy8gYmVjYXVzZSBzdHlsZSBjaGFuZ2UgaXMgaGFuZGxlZCBieSBwcmV2aW91cyBzdGFnZVxuICAgICAgICAvLyB1c2UgbW92ZSByaWdodCB3aGVuIGJhY2tncm91bmQgaXMgZW1wdHksIHVzZSBjbGVhciByaWdodCB3aGVuIHRoZXJlIGlzIGJhY2tncm91bmQuXG4gICAgICAgIGlmIChlcXVhbEJnKHRoaXMuX2N1cnNvclN0eWxlLCB0aGlzLl9iYWNrZ3JvdW5kQ2VsbCkpIHtcbiAgICAgICAgICB0aGlzLl9jdXJyZW50Um93ICs9IGBcXHUwMDFiWyR7dGhpcy5fbnVsbENlbGxDb3VudH1DYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9jdXJyZW50Um93ICs9IGBcXHUwMDFiWyR7dGhpcy5fbnVsbENlbGxDb3VudH1YYDtcbiAgICAgICAgICB0aGlzLl9jdXJyZW50Um93ICs9IGBcXHUwMDFiWyR7dGhpcy5fbnVsbENlbGxDb3VudH1DYDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9udWxsQ2VsbENvdW50ID0gMDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY3VycmVudFJvdyArPSBjZWxsLmdldENoYXJzKCk7XG5cbiAgICAgIC8vIHVwZGF0ZSBjdXJzb3JcbiAgICAgIHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yUm93ID0gdGhpcy5fbGFzdEN1cnNvclJvdyA9IHJvdztcbiAgICAgIHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yQ29sID0gdGhpcy5fbGFzdEN1cnNvckNvbCA9IGNvbCArIGNlbGwuZ2V0V2lkdGgoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX3NlcmlhbGl6ZVN0cmluZyhleGNsdWRlRmluYWxDdXJzb3JQb3NpdGlvbjogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgbGV0IHJvd0VuZCA9IHRoaXMuX2FsbFJvd3MubGVuZ3RoO1xuXG4gICAgLy8gdGhlIGZpeHVwIGlzIG9ubHkgcmVxdWlyZWQgZm9yIGRhdGEgd2l0aG91dCBzY3JvbGxiYWNrXG4gICAgLy8gYmVjYXVzZSBpdCB3aWxsIGFsd2F5cyBiZSBwbGFjZWQgYXQgbGFzdCBsaW5lIG90aGVyd2lzZVxuICAgIGlmICh0aGlzLl9idWZmZXIubGVuZ3RoIC0gdGhpcy5fZmlyc3RSb3cgPD0gdGhpcy5fdGVybWluYWwucm93cykge1xuICAgICAgcm93RW5kID0gdGhpcy5fbGFzdENvbnRlbnRDdXJzb3JSb3cgKyAxIC0gdGhpcy5fZmlyc3RSb3c7XG4gICAgICB0aGlzLl9sYXN0Q3Vyc29yQ29sID0gdGhpcy5fbGFzdENvbnRlbnRDdXJzb3JDb2w7XG4gICAgICB0aGlzLl9sYXN0Q3Vyc29yUm93ID0gdGhpcy5fbGFzdENvbnRlbnRDdXJzb3JSb3c7XG4gICAgfVxuXG4gICAgbGV0IGNvbnRlbnQgPSAnJztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93RW5kOyBpKyspIHtcbiAgICAgIGNvbnRlbnQgKz0gdGhpcy5fYWxsUm93c1tpXTtcbiAgICAgIGlmIChpICsgMSA8IHJvd0VuZCkge1xuICAgICAgICBjb250ZW50ICs9IHRoaXMuX2FsbFJvd1NlcGFyYXRvcnNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gcmVzdG9yZSB0aGUgY3Vyc29yXG4gICAgaWYgKCFleGNsdWRlRmluYWxDdXJzb3JQb3NpdGlvbikge1xuICAgICAgY29uc3QgcmVhbEN1cnNvclJvdyA9IHRoaXMuX2J1ZmZlci5iYXNlWSArIHRoaXMuX2J1ZmZlci5jdXJzb3JZO1xuICAgICAgY29uc3QgcmVhbEN1cnNvckNvbCA9IHRoaXMuX2J1ZmZlci5jdXJzb3JYO1xuXG4gICAgICBjb25zdCBjdXJzb3JNb3ZlZCA9IChyZWFsQ3Vyc29yUm93ICE9PSB0aGlzLl9sYXN0Q3Vyc29yUm93IHx8IHJlYWxDdXJzb3JDb2wgIT09IHRoaXMuX2xhc3RDdXJzb3JDb2wpO1xuXG4gICAgICBjb25zdCBtb3ZlUmlnaHQgPSAob2Zmc2V0OiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKG9mZnNldCA+IDApIHtcbiAgICAgICAgICBjb250ZW50ICs9IGBcXHUwMDFiWyR7b2Zmc2V0fUNgO1xuICAgICAgICB9IGVsc2UgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgICAgICBjb250ZW50ICs9IGBcXHUwMDFiWyR7LW9mZnNldH1EYDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IG1vdmVEb3duID0gKG9mZnNldDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChvZmZzZXQgPiAwKSB7XG4gICAgICAgICAgY29udGVudCArPSBgXFx1MDAxYlske29mZnNldH1CYDtcbiAgICAgICAgfSBlbHNlIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAgICAgY29udGVudCArPSBgXFx1MDAxYlskey1vZmZzZXR9QWA7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChjdXJzb3JNb3ZlZCkge1xuICAgICAgICBtb3ZlRG93bihyZWFsQ3Vyc29yUm93IC0gdGhpcy5fbGFzdEN1cnNvclJvdyk7XG4gICAgICAgIG1vdmVSaWdodChyZWFsQ3Vyc29yQ29sIC0gdGhpcy5fbGFzdEN1cnNvckNvbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSB0aGUgY3Vyc29yJ3MgY3VycmVudCBzdHlsZSwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS94dGVybWpzL3h0ZXJtLmpzL2lzc3Vlcy8zNjc3XG4gICAgLy8gSEFDSzogSW50ZXJuYWwgQVBJIGFjY2VzcyBzaW5jZSBpdCdzIGF3a3dhcmQgdG8gZXhwb3NlIHRoaXMgaW4gdGhlIEFQSSBhbmQgc2VyaWFsaXplIHdpbGxcbiAgICAvLyBsaWtlbHkgYmUgdGhlIG9ubHkgY29uc3VtZXJcbiAgICBjb25zdCBjdXJBdHRyRGF0YTogSUF0dHJpYnV0ZURhdGEgPSAodGhpcy5fdGVybWluYWwgYXMgYW55KS5fY29yZS5faW5wdXRIYW5kbGVyLl9jdXJBdHRyRGF0YTtcbiAgICBjb25zdCBzZ3JTZXEgPSB0aGlzLl9kaWZmU3R5bGUoY3VyQXR0ckRhdGEsIHRoaXMuX2N1cnNvclN0eWxlKTtcbiAgICBpZiAoc2dyU2VxLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnRlbnQgKz0gYFxcdTAwMWJbJHtzZ3JTZXEuam9pbignOycpfW1gO1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemVBZGRvbiBpbXBsZW1lbnRzIElUZXJtaW5hbEFkZG9uICwgSVNlcmlhbGl6ZUFwaSB7XG4gIHByaXZhdGUgX3Rlcm1pbmFsOiBUZXJtaW5hbCB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgYWN0aXZhdGUodGVybWluYWw6IFRlcm1pbmFsKTogdm9pZCB7XG4gICAgdGhpcy5fdGVybWluYWwgPSB0ZXJtaW5hbDtcbiAgfVxuXG4gIHByaXZhdGUgX3NlcmlhbGl6ZUJ1ZmZlckJ5U2Nyb2xsYmFjayh0ZXJtaW5hbDogVGVybWluYWwsIGJ1ZmZlcjogSUJ1ZmZlciwgc2Nyb2xsYmFjaz86IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgbWF4Um93cyA9IGJ1ZmZlci5sZW5ndGg7XG4gICAgY29uc3QgY29ycmVjdFJvd3MgPSAoc2Nyb2xsYmFjayA9PT0gdW5kZWZpbmVkKSA/IG1heFJvd3MgOiBjb25zdHJhaW4oc2Nyb2xsYmFjayArIHRlcm1pbmFsLnJvd3MsIDAsIG1heFJvd3MpO1xuICAgIHJldHVybiB0aGlzLl9zZXJpYWxpemVCdWZmZXJCeVJhbmdlKHRlcm1pbmFsLCBidWZmZXIsIHtcbiAgICAgIHN0YXJ0OiBtYXhSb3dzIC0gY29ycmVjdFJvd3MsXG4gICAgICBlbmQ6IG1heFJvd3MgLSAxXG4gICAgfSwgZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VyaWFsaXplQnVmZmVyQnlSYW5nZSh0ZXJtaW5hbDogVGVybWluYWwsIGJ1ZmZlcjogSUJ1ZmZlciwgcmFuZ2U6IElTZXJpYWxpemVSYW5nZSwgZXhjbHVkZUZpbmFsQ3Vyc29yUG9zaXRpb246IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgU3RyaW5nU2VyaWFsaXplSGFuZGxlcihidWZmZXIsIHRlcm1pbmFsKTtcbiAgICByZXR1cm4gaGFuZGxlci5zZXJpYWxpemUoe1xuICAgICAgc3RhcnQ6IHsgeDogMCwgICAgICAgICAgICAgeTogdHlwZW9mIHJhbmdlLnN0YXJ0ID09PSAnbnVtYmVyJyA/IHJhbmdlLnN0YXJ0IDogcmFuZ2Uuc3RhcnQubGluZSB9LFxuICAgICAgZW5kOiAgIHsgeDogdGVybWluYWwuY29scywgeTogdHlwZW9mIHJhbmdlLmVuZCAgID09PSAnbnVtYmVyJyA/IHJhbmdlLmVuZCAgIDogcmFuZ2UuZW5kLmxpbmUgICB9XG4gICAgfSwgZXhjbHVkZUZpbmFsQ3Vyc29yUG9zaXRpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VyaWFsaXplQnVmZmVyQXNIVE1MKHRlcm1pbmFsOiBUZXJtaW5hbCwgb3B0aW9uczogUGFydGlhbDxJSFRNTFNlcmlhbGl6ZU9wdGlvbnM+KTogc3RyaW5nIHtcbiAgICBjb25zdCBidWZmZXIgPSB0ZXJtaW5hbC5idWZmZXIuYWN0aXZlO1xuICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgSFRNTFNlcmlhbGl6ZUhhbmRsZXIoYnVmZmVyLCB0ZXJtaW5hbCwgb3B0aW9ucyk7XG4gICAgY29uc3Qgb25seVNlbGVjdGlvbiA9IG9wdGlvbnMub25seVNlbGVjdGlvbiA/PyBmYWxzZTtcbiAgICBpZiAoIW9ubHlTZWxlY3Rpb24pIHtcbiAgICAgIGNvbnN0IG1heFJvd3MgPSBidWZmZXIubGVuZ3RoO1xuICAgICAgY29uc3Qgc2Nyb2xsYmFjayA9IG9wdGlvbnMuc2Nyb2xsYmFjaztcbiAgICAgIGNvbnN0IGNvcnJlY3RSb3dzID0gKHNjcm9sbGJhY2sgPT09IHVuZGVmaW5lZCkgPyBtYXhSb3dzIDogY29uc3RyYWluKHNjcm9sbGJhY2sgKyB0ZXJtaW5hbC5yb3dzLCAwLCBtYXhSb3dzKTtcbiAgICAgIHJldHVybiBoYW5kbGVyLnNlcmlhbGl6ZSh7XG4gICAgICAgIHN0YXJ0OiB7IHg6IDAsICAgICAgICAgICAgIHk6IG1heFJvd3MgLSBjb3JyZWN0Um93cyB9LFxuICAgICAgICBlbmQ6ICAgeyB4OiB0ZXJtaW5hbC5jb2xzLCB5OiBtYXhSb3dzIC0gMSAgICAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5fdGVybWluYWw/LmdldFNlbGVjdGlvblBvc2l0aW9uKCk7XG4gICAgaWYgKHNlbGVjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gaGFuZGxlci5zZXJpYWxpemUoe1xuICAgICAgICBzdGFydDogeyB4OiBzZWxlY3Rpb24uc3RhcnQueCwgeTogc2VsZWN0aW9uLnN0YXJ0LnkgfSxcbiAgICAgICAgZW5kOiAgIHsgeDogc2VsZWN0aW9uLmVuZC54LCAgIHk6IHNlbGVjdGlvbi5lbmQueSAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHByaXZhdGUgX3NlcmlhbGl6ZU1vZGVzKHRlcm1pbmFsOiBUZXJtaW5hbCk6IHN0cmluZyB7XG4gICAgbGV0IGNvbnRlbnQgPSAnJztcbiAgICBjb25zdCBtb2RlcyA9IHRlcm1pbmFsLm1vZGVzO1xuXG4gICAgLy8gRGVmYXVsdDogZmFsc2VcbiAgICBpZiAobW9kZXMuYXBwbGljYXRpb25DdXJzb3JLZXlzTW9kZSkgY29udGVudCArPSAnXFx4MWJbPzFoJztcbiAgICBpZiAobW9kZXMuYXBwbGljYXRpb25LZXlwYWRNb2RlKSBjb250ZW50ICs9ICdcXHgxYls/NjZoJztcbiAgICBpZiAobW9kZXMuYnJhY2tldGVkUGFzdGVNb2RlKSBjb250ZW50ICs9ICdcXHgxYls/MjAwNGgnO1xuICAgIGlmIChtb2Rlcy5pbnNlcnRNb2RlKSBjb250ZW50ICs9ICdcXHgxYls0aCc7XG4gICAgaWYgKG1vZGVzLm9yaWdpbk1vZGUpIGNvbnRlbnQgKz0gJ1xceDFiWz82aCc7XG4gICAgaWYgKG1vZGVzLnJldmVyc2VXcmFwYXJvdW5kTW9kZSkgY29udGVudCArPSAnXFx4MWJbPzQ1aCc7XG4gICAgaWYgKG1vZGVzLnNlbmRGb2N1c01vZGUpIGNvbnRlbnQgKz0gJ1xceDFiWz8xMDA0aCc7XG5cbiAgICAvLyBEZWZhdWx0OiB0cnVlXG4gICAgaWYgKG1vZGVzLndyYXBhcm91bmRNb2RlID09PSBmYWxzZSkgY29udGVudCArPSAnXFx4MWJbPzdsJztcblxuICAgIC8vIERlZmF1bHQ6ICdub25lJ1xuICAgIGlmIChtb2Rlcy5tb3VzZVRyYWNraW5nTW9kZSAhPT0gJ25vbmUnKSB7XG4gICAgICBzd2l0Y2ggKG1vZGVzLm1vdXNlVHJhY2tpbmdNb2RlKSB7XG4gICAgICAgIGNhc2UgJ3gxMCc6IGNvbnRlbnQgKz0gJ1xceDFiWz85aCc7IGJyZWFrO1xuICAgICAgICBjYXNlICd2dDIwMCc6IGNvbnRlbnQgKz0gJ1xceDFiWz8xMDAwaCc7IGJyZWFrO1xuICAgICAgICBjYXNlICdkcmFnJzogY29udGVudCArPSAnXFx4MWJbPzEwMDJoJzsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2FueSc6IGNvbnRlbnQgKz0gJ1xceDFiWz8xMDAzaCc7IGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgcHVibGljIHNlcmlhbGl6ZShvcHRpb25zPzogSVNlcmlhbGl6ZU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIC8vIFRPRE86IEFkZCBjb21iaW5lZERhdGEgc3VwcG9ydFxuICAgIGlmICghdGhpcy5fdGVybWluYWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHVzZSBhZGRvbiB1bnRpbCBpdCBoYXMgYmVlbiBsb2FkZWQnKTtcbiAgICB9XG5cbiAgICAvLyBOb3JtYWwgYnVmZmVyXG4gICAgbGV0IGNvbnRlbnQgPSBvcHRpb25zPy5yYW5nZVxuICAgICAgPyB0aGlzLl9zZXJpYWxpemVCdWZmZXJCeVJhbmdlKHRoaXMuX3Rlcm1pbmFsLCB0aGlzLl90ZXJtaW5hbC5idWZmZXIubm9ybWFsLCBvcHRpb25zLnJhbmdlLCB0cnVlKVxuICAgICAgOiB0aGlzLl9zZXJpYWxpemVCdWZmZXJCeVNjcm9sbGJhY2sodGhpcy5fdGVybWluYWwsIHRoaXMuX3Rlcm1pbmFsLmJ1ZmZlci5ub3JtYWwsIG9wdGlvbnM/LnNjcm9sbGJhY2spO1xuXG4gICAgLy8gQWx0ZXJuYXRlIGJ1ZmZlclxuICAgIGlmICghb3B0aW9ucz8uZXhjbHVkZUFsdEJ1ZmZlcikge1xuICAgICAgaWYgKHRoaXMuX3Rlcm1pbmFsLmJ1ZmZlci5hY3RpdmUudHlwZSA9PT0gJ2FsdGVybmF0ZScpIHtcbiAgICAgICAgY29uc3QgYWx0ZXJuYXRpdmVTY3JlZW5Db250ZW50ID0gdGhpcy5fc2VyaWFsaXplQnVmZmVyQnlTY3JvbGxiYWNrKHRoaXMuX3Rlcm1pbmFsLCB0aGlzLl90ZXJtaW5hbC5idWZmZXIuYWx0ZXJuYXRlLCB1bmRlZmluZWQpO1xuICAgICAgICBjb250ZW50ICs9IGBcXHUwMDFiWz8xMDQ5aFxcdTAwMWJbSCR7YWx0ZXJuYXRpdmVTY3JlZW5Db250ZW50fWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTW9kZXNcbiAgICBpZiAoIW9wdGlvbnM/LmV4Y2x1ZGVNb2Rlcykge1xuICAgICAgY29udGVudCArPSB0aGlzLl9zZXJpYWxpemVNb2Rlcyh0aGlzLl90ZXJtaW5hbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2VyaWFsaXplQXNIVE1MKG9wdGlvbnM/OiBQYXJ0aWFsPElIVE1MU2VyaWFsaXplT3B0aW9ucz4pOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5fdGVybWluYWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHVzZSBhZGRvbiB1bnRpbCBpdCBoYXMgYmVlbiBsb2FkZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fc2VyaWFsaXplQnVmZmVyQXNIVE1MKHRoaXMuX3Rlcm1pbmFsLCBvcHRpb25zIHx8IHt9KTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQgeyB9XG59XG5cbmV4cG9ydCBjbGFzcyBIVE1MU2VyaWFsaXplSGFuZGxlciBleHRlbmRzIEJhc2VTZXJpYWxpemVIYW5kbGVyIHtcbiAgcHJpdmF0ZSBfY3VycmVudFJvdzogc3RyaW5nID0gJyc7XG5cbiAgcHJpdmF0ZSBfaHRtbENvbnRlbnQgPSAnJztcblxuICBwcml2YXRlIF9hbnNpQ29sb3JzOiBSZWFkb25seTxJQ29sb3JbXT47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYnVmZmVyOiBJQnVmZmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3Rlcm1pbmFsOiBUZXJtaW5hbCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zOiBQYXJ0aWFsPElIVE1MU2VyaWFsaXplT3B0aW9ucz5cbiAgKSB7XG4gICAgc3VwZXIoYnVmZmVyKTtcblxuICAgIC8vIEZvciB4dGVybSBoZWFkbGVzczogZmFsbGJhY2sgdG8gYW5zaSBjb2xvcnNcbiAgICBpZiAoKF90ZXJtaW5hbCBhcyBhbnkpLl9jb3JlLl90aGVtZVNlcnZpY2UpIHtcbiAgICAgIHRoaXMuX2Fuc2lDb2xvcnMgPSAoX3Rlcm1pbmFsIGFzIGFueSkuX2NvcmUuX3RoZW1lU2VydmljZS5jb2xvcnMuYW5zaTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLl9hbnNpQ29sb3JzID0gREVGQVVMVF9BTlNJX0NPTE9SUztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wYWRTdGFydCh0YXJnZXQ6IHN0cmluZywgdGFyZ2V0TGVuZ3RoOiBudW1iZXIsIHBhZFN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB0YXJnZXRMZW5ndGggPSB0YXJnZXRMZW5ndGggPj4gMDtcbiAgICBwYWRTdHJpbmcgPSBwYWRTdHJpbmcgPz8gJyAnO1xuICAgIGlmICh0YXJnZXQubGVuZ3RoID4gdGFyZ2V0TGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIHRhcmdldExlbmd0aCAtPSB0YXJnZXQubGVuZ3RoO1xuICAgIGlmICh0YXJnZXRMZW5ndGggPiBwYWRTdHJpbmcubGVuZ3RoKSB7XG4gICAgICBwYWRTdHJpbmcgKz0gcGFkU3RyaW5nLnJlcGVhdCh0YXJnZXRMZW5ndGggLyBwYWRTdHJpbmcubGVuZ3RoKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhZFN0cmluZy5zbGljZSgwLCB0YXJnZXRMZW5ndGgpICsgdGFyZ2V0O1xuICB9XG5cbiAgcHJvdGVjdGVkIF9iZWZvcmVTZXJpYWxpemUocm93czogbnVtYmVyLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2h0bWxDb250ZW50ICs9ICc8aHRtbD48Ym9keT48IS0tU3RhcnRGcmFnbWVudC0tPjxwcmU+JztcblxuICAgIGxldCBmb3JlZ3JvdW5kID0gJyMwMDAwMDAnO1xuICAgIGxldCBiYWNrZ3JvdW5kID0gJyNmZmZmZmYnO1xuICAgIGlmICh0aGlzLl9vcHRpb25zLmluY2x1ZGVHbG9iYWxCYWNrZ3JvdW5kID8/IGZhbHNlKSB7XG4gICAgICBmb3JlZ3JvdW5kID0gdGhpcy5fdGVybWluYWwub3B0aW9ucy50aGVtZT8uZm9yZWdyb3VuZCA/PyAnI2ZmZmZmZic7XG4gICAgICBiYWNrZ3JvdW5kID0gdGhpcy5fdGVybWluYWwub3B0aW9ucy50aGVtZT8uYmFja2dyb3VuZCA/PyAnIzAwMDAwMCc7XG4gICAgfVxuXG4gICAgY29uc3QgZ2xvYmFsU3R5bGVEZWZpbml0aW9ucyA9IFtdO1xuICAgIGdsb2JhbFN0eWxlRGVmaW5pdGlvbnMucHVzaCgnY29sb3I6ICcgKyBmb3JlZ3JvdW5kICsgJzsnKTtcbiAgICBnbG9iYWxTdHlsZURlZmluaXRpb25zLnB1c2goJ2JhY2tncm91bmQtY29sb3I6ICcgKyBiYWNrZ3JvdW5kICsgJzsnKTtcbiAgICBnbG9iYWxTdHlsZURlZmluaXRpb25zLnB1c2goJ2ZvbnQtZmFtaWx5OiAnICsgdGhpcy5fdGVybWluYWwub3B0aW9ucy5mb250RmFtaWx5ICsgJzsnKTtcbiAgICBnbG9iYWxTdHlsZURlZmluaXRpb25zLnB1c2goJ2ZvbnQtc2l6ZTogJyArIHRoaXMuX3Rlcm1pbmFsLm9wdGlvbnMuZm9udFNpemUgKyAncHg7Jyk7XG4gICAgdGhpcy5faHRtbENvbnRlbnQgKz0gJzxkaXYgc3R5bGU9XFwnJyArIGdsb2JhbFN0eWxlRGVmaW5pdGlvbnMuam9pbignICcpICsgJ1xcJz4nO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9hZnRlclNlcmlhbGl6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9odG1sQ29udGVudCArPSAnPC9kaXY+JztcbiAgICB0aGlzLl9odG1sQ29udGVudCArPSAnPC9wcmU+PCEtLUVuZEZyYWdtZW50LS0+PC9ib2R5PjwvaHRtbD4nO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9yb3dFbmQocm93OiBudW1iZXIsIGlzTGFzdFJvdzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2h0bWxDb250ZW50ICs9ICc8ZGl2PjxzcGFuPicgKyB0aGlzLl9jdXJyZW50Um93ICsgJzwvc3Bhbj48L2Rpdj4nO1xuICAgIHRoaXMuX2N1cnJlbnRSb3cgPSAnJztcbiAgfVxuXG4gIHByaXZhdGUgX2dldEhleENvbG9yKGNlbGw6IElCdWZmZXJDZWxsLCBpc0ZnOiBib29sZWFuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb2xvciA9IGlzRmcgPyBjZWxsLmdldEZnQ29sb3IoKSA6IGNlbGwuZ2V0QmdDb2xvcigpO1xuICAgIGlmIChpc0ZnID8gY2VsbC5pc0ZnUkdCKCkgOiBjZWxsLmlzQmdSR0IoKSkge1xuICAgICAgY29uc3QgcmdiID0gW1xuICAgICAgICAoY29sb3IgPj4gMTYpICYgMjU1LFxuICAgICAgICAoY29sb3IgPj4gIDgpICYgMjU1LFxuICAgICAgICAoY29sb3IgICAgICApICYgMjU1XG4gICAgICBdO1xuICAgICAgcmV0dXJuICcjJyArIHJnYi5tYXAoeCA9PiB0aGlzLl9wYWRTdGFydCh4LnRvU3RyaW5nKDE2KSwgMiwgJzAnKSkuam9pbignJyk7XG4gICAgfVxuICAgIGlmIChpc0ZnID8gY2VsbC5pc0ZnUGFsZXR0ZSgpIDogY2VsbC5pc0JnUGFsZXR0ZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYW5zaUNvbG9yc1tjb2xvcl0uY3NzO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGlmZlN0eWxlKGNlbGw6IElCdWZmZXJDZWxsLCBvbGRDZWxsOiBJQnVmZmVyQ2VsbCk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb250ZW50OiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgY29uc3QgZmdDaGFuZ2VkID0gIWVxdWFsRmcoY2VsbCwgb2xkQ2VsbCk7XG4gICAgY29uc3QgYmdDaGFuZ2VkID0gIWVxdWFsQmcoY2VsbCwgb2xkQ2VsbCk7XG4gICAgY29uc3QgZmxhZ3NDaGFuZ2VkID0gIWVxdWFsRmxhZ3MoY2VsbCwgb2xkQ2VsbCk7XG5cbiAgICBpZiAoZmdDaGFuZ2VkIHx8IGJnQ2hhbmdlZCB8fCBmbGFnc0NoYW5nZWQpIHtcbiAgICAgIGNvbnN0IGZnSGV4Q29sb3IgPSB0aGlzLl9nZXRIZXhDb2xvcihjZWxsLCB0cnVlKTtcbiAgICAgIGlmIChmZ0hleENvbG9yKSB7XG4gICAgICAgIGNvbnRlbnQucHVzaCgnY29sb3I6ICcgKyBmZ0hleENvbG9yICsgJzsnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmdIZXhDb2xvciA9IHRoaXMuX2dldEhleENvbG9yKGNlbGwsIGZhbHNlKTtcbiAgICAgIGlmIChiZ0hleENvbG9yKSB7XG4gICAgICAgIGNvbnRlbnQucHVzaCgnYmFja2dyb3VuZC1jb2xvcjogJyArIGJnSGV4Q29sb3IgKyAnOycpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2VsbC5pc0ludmVyc2UoKSkgeyBjb250ZW50LnB1c2goJ2NvbG9yOiAjMDAwMDAwOyBiYWNrZ3JvdW5kLWNvbG9yOiAjQkZCRkJGOycpOyB9XG4gICAgICBpZiAoY2VsbC5pc0JvbGQoKSkgeyBjb250ZW50LnB1c2goJ2ZvbnQtd2VpZ2h0OiBib2xkOycpOyB9XG4gICAgICBpZiAoY2VsbC5pc1VuZGVybGluZSgpICYmIGNlbGwuaXNPdmVybGluZSgpKSB7IGNvbnRlbnQucHVzaCgndGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZSB1bmRlcmxpbmU7Jyk7IH1cbiAgICAgIGVsc2UgaWYgKGNlbGwuaXNVbmRlcmxpbmUoKSkgeyBjb250ZW50LnB1c2goJ3RleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOycpOyB9XG4gICAgICBlbHNlIGlmIChjZWxsLmlzT3ZlcmxpbmUoKSkgeyBjb250ZW50LnB1c2goJ3RleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmU7Jyk7IH1cbiAgICAgIGlmIChjZWxsLmlzQmxpbmsoKSkgeyBjb250ZW50LnB1c2goJ3RleHQtZGVjb3JhdGlvbjogYmxpbms7Jyk7IH1cbiAgICAgIGlmIChjZWxsLmlzSW52aXNpYmxlKCkpIHsgY29udGVudC5wdXNoKCd2aXNpYmlsaXR5OiBoaWRkZW47Jyk7IH1cbiAgICAgIGlmIChjZWxsLmlzSXRhbGljKCkpIHsgY29udGVudC5wdXNoKCdmb250LXN0eWxlOiBpdGFsaWM7Jyk7IH1cbiAgICAgIGlmIChjZWxsLmlzRGltKCkpIHsgY29udGVudC5wdXNoKCdvcGFjaXR5OiAwLjU7Jyk7IH1cbiAgICAgIGlmIChjZWxsLmlzU3RyaWtldGhyb3VnaCgpKSB7IGNvbnRlbnQucHVzaCgndGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7Jyk7IH1cblxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBfbmV4dENlbGwoY2VsbDogSUJ1ZmZlckNlbGwsIG9sZENlbGw6IElCdWZmZXJDZWxsLCByb3c6IG51bWJlciwgY29sOiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBhIHdpZHRoIDAgY2VsbCBkb24ndCBuZWVkIHRvIGJlIGNvdW50IGJlY2F1c2UgaXQgaXMganVzdCBhIHBsYWNlaG9sZGVyIGFmdGVyIGEgQ0pLIGNoYXJhY3RlcjtcbiAgICBjb25zdCBpc1BsYWNlSG9sZGVyQ2VsbCA9IGNlbGwuZ2V0V2lkdGgoKSA9PT0gMDtcbiAgICBpZiAoaXNQbGFjZUhvbGRlckNlbGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyB0aGlzIGNlbGwgZG9uJ3QgaGF2ZSBjb250ZW50XG4gICAgY29uc3QgaXNFbXB0eUNlbGwgPSBjZWxsLmdldENoYXJzKCkgPT09ICcnO1xuXG4gICAgY29uc3Qgc3R5bGVEZWZpbml0aW9ucyA9IHRoaXMuX2RpZmZTdHlsZShjZWxsLCBvbGRDZWxsKTtcblxuICAgIC8vIGhhbmRsZXMgc3R5bGUgY2hhbmdlXG4gICAgaWYgKHN0eWxlRGVmaW5pdGlvbnMpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRSb3cgKz0gc3R5bGVEZWZpbml0aW9ucy5sZW5ndGggPT09IDAgP1xuICAgICAgICAnPC9zcGFuPjxzcGFuPicgOlxuICAgICAgICAnPC9zcGFuPjxzcGFuIHN0eWxlPVxcJycgKyBzdHlsZURlZmluaXRpb25zLmpvaW4oJyAnKSArICdcXCc+JztcbiAgICB9XG5cbiAgICAvLyBoYW5kbGVzIGFjdHVhbCBjb250ZW50XG4gICAgaWYgKGlzRW1wdHlDZWxsKSB7XG4gICAgICB0aGlzLl9jdXJyZW50Um93ICs9ICcgJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY3VycmVudFJvdyArPSBjZWxsLmdldENoYXJzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF9zZXJpYWxpemVTdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faHRtbENvbnRlbnQ7XG4gIH1cbn1cbiIsIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIlNlcmlhbGl6ZUFkZG9uXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIlNlcmlhbGl6ZUFkZG9uXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgKCkgPT4ge1xucmV0dXJuICIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUNvbG9yQ29udHJhc3RDYWNoZSB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgSUNvbG9yIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IFR3b0tleU1hcCB9IGZyb20gJ2NvbW1vbi9NdWx0aUtleU1hcCc7XG5cbmV4cG9ydCBjbGFzcyBDb2xvckNvbnRyYXN0Q2FjaGUgaW1wbGVtZW50cyBJQ29sb3JDb250cmFzdENhY2hlIHtcbiAgcHJpdmF0ZSBfY29sb3I6IFR3b0tleU1hcDwvKiBiZyAqL251bWJlciwgLyogZmcgKi9udW1iZXIsIElDb2xvciB8IG51bGw+ID0gbmV3IFR3b0tleU1hcCgpO1xuICBwcml2YXRlIF9jc3M6IFR3b0tleU1hcDwvKiBiZyAqL251bWJlciwgLyogZmcgKi9udW1iZXIsIHN0cmluZyB8IG51bGw+ID0gbmV3IFR3b0tleU1hcCgpO1xuXG4gIHB1YmxpYyBzZXRDc3MoYmc6IG51bWJlciwgZmc6IG51bWJlciwgdmFsdWU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLl9jc3Muc2V0KGJnLCBmZywgdmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdldENzcyhiZzogbnVtYmVyLCBmZzogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Nzcy5nZXQoYmcsIGZnKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb2xvcihiZzogbnVtYmVyLCBmZzogbnVtYmVyLCB2YWx1ZTogSUNvbG9yIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuX2NvbG9yLnNldChiZywgZmcsIHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb2xvcihiZzogbnVtYmVyLCBmZzogbnVtYmVyKTogSUNvbG9yIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbG9yLmdldChiZywgZmcpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuX2NvbG9yLmNsZWFyKCk7XG4gICAgdGhpcy5fY3NzLmNsZWFyKCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIyIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgQ29sb3JDb250cmFzdENhY2hlIH0gZnJvbSAnYnJvd3Nlci9Db2xvckNvbnRyYXN0Q2FjaGUnO1xuaW1wb3J0IHsgSVRoZW1lU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgSUNvbG9yQ29udHJhc3RDYWNoZSwgSUNvbG9yU2V0LCBSZWFkb25seUNvbG9yU2V0IH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBjaGFubmVscywgY29sb3IsIGNzcywgTlVMTF9DT0xPUiB9IGZyb20gJ2NvbW1vbi9Db2xvcic7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElPcHRpb25zU2VydmljZSwgSVRoZW1lIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IEFsbENvbG9ySW5kZXgsIElDb2xvciwgU3BlY2lhbENvbG9ySW5kZXggfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5pbnRlcmZhY2UgSVJlc3RvcmVDb2xvclNldCB7XG4gIGZvcmVncm91bmQ6IElDb2xvcjtcbiAgYmFja2dyb3VuZDogSUNvbG9yO1xuICBjdXJzb3I6IElDb2xvcjtcbiAgYW5zaTogSUNvbG9yW107XG59XG5cblxuY29uc3QgREVGQVVMVF9GT1JFR1JPVU5EID0gY3NzLnRvQ29sb3IoJyNmZmZmZmYnKTtcbmNvbnN0IERFRkFVTFRfQkFDS0dST1VORCA9IGNzcy50b0NvbG9yKCcjMDAwMDAwJyk7XG5jb25zdCBERUZBVUxUX0NVUlNPUiA9IGNzcy50b0NvbG9yKCcjZmZmZmZmJyk7XG5jb25zdCBERUZBVUxUX0NVUlNPUl9BQ0NFTlQgPSBjc3MudG9Db2xvcignIzAwMDAwMCcpO1xuY29uc3QgREVGQVVMVF9TRUxFQ1RJT04gPSB7XG4gIGNzczogJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMC4zKScsXG4gIHJnYmE6IDB4RkZGRkZGNERcbn07XG5cbi8vIEFuIElJRkUgdG8gZ2VuZXJhdGUgREVGQVVMVF9BTlNJX0NPTE9SUy5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FOU0lfQ09MT1JTID0gT2JqZWN0LmZyZWV6ZSgoKCkgPT4ge1xuICBjb25zdCBjb2xvcnMgPSBbXG4gICAgLy8gZGFyazpcbiAgICBjc3MudG9Db2xvcignIzJlMzQzNicpLFxuICAgIGNzcy50b0NvbG9yKCcjY2MwMDAwJyksXG4gICAgY3NzLnRvQ29sb3IoJyM0ZTlhMDYnKSxcbiAgICBjc3MudG9Db2xvcignI2M0YTAwMCcpLFxuICAgIGNzcy50b0NvbG9yKCcjMzQ2NWE0JyksXG4gICAgY3NzLnRvQ29sb3IoJyM3NTUwN2InKSxcbiAgICBjc3MudG9Db2xvcignIzA2OTg5YScpLFxuICAgIGNzcy50b0NvbG9yKCcjZDNkN2NmJyksXG4gICAgLy8gYnJpZ2h0OlxuICAgIGNzcy50b0NvbG9yKCcjNTU1NzUzJyksXG4gICAgY3NzLnRvQ29sb3IoJyNlZjI5MjknKSxcbiAgICBjc3MudG9Db2xvcignIzhhZTIzNCcpLFxuICAgIGNzcy50b0NvbG9yKCcjZmNlOTRmJyksXG4gICAgY3NzLnRvQ29sb3IoJyM3MjlmY2YnKSxcbiAgICBjc3MudG9Db2xvcignI2FkN2ZhOCcpLFxuICAgIGNzcy50b0NvbG9yKCcjMzRlMmUyJyksXG4gICAgY3NzLnRvQ29sb3IoJyNlZWVlZWMnKVxuICBdO1xuXG4gIC8vIEZpbGwgaW4gdGhlIHJlbWFpbmluZyAyNDAgQU5TSSBjb2xvcnMuXG4gIC8vIEdlbmVyYXRlIGNvbG9ycyAoMTYtMjMxKVxuICBjb25zdCB2ID0gWzB4MDAsIDB4NWYsIDB4ODcsIDB4YWYsIDB4ZDcsIDB4ZmZdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IDIxNjsgaSsrKSB7XG4gICAgY29uc3QgciA9IHZbKGkgLyAzNikgJSA2IHwgMF07XG4gICAgY29uc3QgZyA9IHZbKGkgLyA2KSAlIDYgfCAwXTtcbiAgICBjb25zdCBiID0gdltpICUgNl07XG4gICAgY29sb3JzLnB1c2goe1xuICAgICAgY3NzOiBjaGFubmVscy50b0NzcyhyLCBnLCBiKSxcbiAgICAgIHJnYmE6IGNoYW5uZWxzLnRvUmdiYShyLCBnLCBiKVxuICAgIH0pO1xuICB9XG5cbiAgLy8gR2VuZXJhdGUgZ3JleXMgKDIzMi0yNTUpXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMjQ7IGkrKykge1xuICAgIGNvbnN0IGMgPSA4ICsgaSAqIDEwO1xuICAgIGNvbG9ycy5wdXNoKHtcbiAgICAgIGNzczogY2hhbm5lbHMudG9Dc3MoYywgYywgYyksXG4gICAgICByZ2JhOiBjaGFubmVscy50b1JnYmEoYywgYywgYylcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBjb2xvcnM7XG59KSgpKTtcblxuZXhwb3J0IGNsYXNzIFRoZW1lU2VydmljZSBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJVGhlbWVTZXJ2aWNlIHtcbiAgcHVibGljIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgX2NvbG9yczogSUNvbG9yU2V0O1xuICBwcml2YXRlIF9jb250cmFzdENhY2hlOiBJQ29sb3JDb250cmFzdENhY2hlID0gbmV3IENvbG9yQ29udHJhc3RDYWNoZSgpO1xuICBwcml2YXRlIF9oYWxmQ29udHJhc3RDYWNoZTogSUNvbG9yQ29udHJhc3RDYWNoZSA9IG5ldyBDb2xvckNvbnRyYXN0Q2FjaGUoKTtcbiAgcHJpdmF0ZSBfcmVzdG9yZUNvbG9ycyE6IElSZXN0b3JlQ29sb3JTZXQ7XG5cbiAgcHVibGljIGdldCBjb2xvcnMoKTogUmVhZG9ubHlDb2xvclNldCB7IHJldHVybiB0aGlzLl9jb2xvcnM7IH1cblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbkNoYW5nZUNvbG9ycyA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxSZWFkb25seUNvbG9yU2V0PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQ2hhbmdlQ29sb3JzID0gdGhpcy5fb25DaGFuZ2VDb2xvcnMuZXZlbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQElPcHRpb25zU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9jb2xvcnMgPSB7XG4gICAgICBmb3JlZ3JvdW5kOiBERUZBVUxUX0ZPUkVHUk9VTkQsXG4gICAgICBiYWNrZ3JvdW5kOiBERUZBVUxUX0JBQ0tHUk9VTkQsXG4gICAgICBjdXJzb3I6IERFRkFVTFRfQ1VSU09SLFxuICAgICAgY3Vyc29yQWNjZW50OiBERUZBVUxUX0NVUlNPUl9BQ0NFTlQsXG4gICAgICBzZWxlY3Rpb25Gb3JlZ3JvdW5kOiB1bmRlZmluZWQsXG4gICAgICBzZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQ6IERFRkFVTFRfU0VMRUNUSU9OLFxuICAgICAgc2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZTogY29sb3IuYmxlbmQoREVGQVVMVF9CQUNLR1JPVU5ELCBERUZBVUxUX1NFTEVDVElPTiksXG4gICAgICBzZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRUcmFuc3BhcmVudDogREVGQVVMVF9TRUxFQ1RJT04sXG4gICAgICBzZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRPcGFxdWU6IGNvbG9yLmJsZW5kKERFRkFVTFRfQkFDS0dST1VORCwgREVGQVVMVF9TRUxFQ1RJT04pLFxuICAgICAgYW5zaTogREVGQVVMVF9BTlNJX0NPTE9SUy5zbGljZSgpLFxuICAgICAgY29udHJhc3RDYWNoZTogdGhpcy5fY29udHJhc3RDYWNoZSxcbiAgICAgIGhhbGZDb250cmFzdENhY2hlOiB0aGlzLl9oYWxmQ29udHJhc3RDYWNoZVxuICAgIH07XG4gICAgdGhpcy5fdXBkYXRlUmVzdG9yZUNvbG9ycygpO1xuICAgIHRoaXMuX3NldFRoZW1lKHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMudGhlbWUpO1xuXG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9vcHRpb25zU2VydmljZS5vblNwZWNpZmljT3B0aW9uQ2hhbmdlKCdtaW5pbXVtQ29udHJhc3RSYXRpbycsICgpID0+IHRoaXMuX2NvbnRyYXN0Q2FjaGUuY2xlYXIoKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fb3B0aW9uc1NlcnZpY2Uub25TcGVjaWZpY09wdGlvbkNoYW5nZSgndGhlbWUnLCAoKSA9PiB0aGlzLl9zZXRUaGVtZSh0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnRoZW1lKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHRlcm1pbmFsJ3MgdGhlbWUuXG4gICAqIEBwYXJhbSB0aGVtZSBUaGUgIHRoZW1lIHRvIHVzZS4gSWYgYSBwYXJ0aWFsIHRoZW1lIGlzIHByb3ZpZGVkIHRoZW4gZGVmYXVsdFxuICAgKiBjb2xvcnMgd2lsbCBiZSB1c2VkIHdoZXJlIGNvbG9ycyBhcmUgbm90IGRlZmluZWQuXG4gICAqL1xuICBwcml2YXRlIF9zZXRUaGVtZSh0aGVtZTogSVRoZW1lID0ge30pOiB2b2lkIHtcbiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLl9jb2xvcnM7XG4gICAgY29sb3JzLmZvcmVncm91bmQgPSBwYXJzZUNvbG9yKHRoZW1lLmZvcmVncm91bmQsIERFRkFVTFRfRk9SRUdST1VORCk7XG4gICAgY29sb3JzLmJhY2tncm91bmQgPSBwYXJzZUNvbG9yKHRoZW1lLmJhY2tncm91bmQsIERFRkFVTFRfQkFDS0dST1VORCk7XG4gICAgY29sb3JzLmN1cnNvciA9IHBhcnNlQ29sb3IodGhlbWUuY3Vyc29yLCBERUZBVUxUX0NVUlNPUik7XG4gICAgY29sb3JzLmN1cnNvckFjY2VudCA9IHBhcnNlQ29sb3IodGhlbWUuY3Vyc29yQWNjZW50LCBERUZBVUxUX0NVUlNPUl9BQ0NFTlQpO1xuICAgIGNvbG9ycy5zZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQgPSBwYXJzZUNvbG9yKHRoZW1lLnNlbGVjdGlvbkJhY2tncm91bmQsIERFRkFVTFRfU0VMRUNUSU9OKTtcbiAgICBjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZSA9IGNvbG9yLmJsZW5kKGNvbG9ycy5iYWNrZ3JvdW5kLCBjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZFRyYW5zcGFyZW50KTtcbiAgICBjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQgPSBwYXJzZUNvbG9yKHRoZW1lLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZCwgY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudCk7XG4gICAgY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZE9wYXF1ZSA9IGNvbG9yLmJsZW5kKGNvbG9ycy5iYWNrZ3JvdW5kLCBjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQpO1xuICAgIGNvbG9ycy5zZWxlY3Rpb25Gb3JlZ3JvdW5kID0gdGhlbWUuc2VsZWN0aW9uRm9yZWdyb3VuZCA/IHBhcnNlQ29sb3IodGhlbWUuc2VsZWN0aW9uRm9yZWdyb3VuZCwgTlVMTF9DT0xPUikgOiB1bmRlZmluZWQ7XG4gICAgaWYgKGNvbG9ycy5zZWxlY3Rpb25Gb3JlZ3JvdW5kID09PSBOVUxMX0NPTE9SKSB7XG4gICAgICBjb2xvcnMuc2VsZWN0aW9uRm9yZWdyb3VuZCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiBzZWxlY3Rpb24gY29sb3IgaXMgb3BhcXVlLCBibGVuZCBpdCB3aXRoIGJhY2tncm91bmQgd2l0aCAwLjMgb3BhY2l0eVxuICAgICAqIElzc3VlICMyNzM3XG4gICAgICovXG4gICAgaWYgKGNvbG9yLmlzT3BhcXVlKGNvbG9ycy5zZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQpKSB7XG4gICAgICBjb25zdCBvcGFjaXR5ID0gMC4zO1xuICAgICAgY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudCA9IGNvbG9yLm9wYWNpdHkoY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudCwgb3BhY2l0eSk7XG4gICAgfVxuICAgIGlmIChjb2xvci5pc09wYXF1ZShjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQpKSB7XG4gICAgICBjb25zdCBvcGFjaXR5ID0gMC4zO1xuICAgICAgY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZFRyYW5zcGFyZW50ID0gY29sb3Iub3BhY2l0eShjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQsIG9wYWNpdHkpO1xuICAgIH1cbiAgICBjb2xvcnMuYW5zaSA9IERFRkFVTFRfQU5TSV9DT0xPUlMuc2xpY2UoKTtcbiAgICBjb2xvcnMuYW5zaVswXSA9IHBhcnNlQ29sb3IodGhlbWUuYmxhY2ssIERFRkFVTFRfQU5TSV9DT0xPUlNbMF0pO1xuICAgIGNvbG9ycy5hbnNpWzFdID0gcGFyc2VDb2xvcih0aGVtZS5yZWQsIERFRkFVTFRfQU5TSV9DT0xPUlNbMV0pO1xuICAgIGNvbG9ycy5hbnNpWzJdID0gcGFyc2VDb2xvcih0aGVtZS5ncmVlbiwgREVGQVVMVF9BTlNJX0NPTE9SU1syXSk7XG4gICAgY29sb3JzLmFuc2lbM10gPSBwYXJzZUNvbG9yKHRoZW1lLnllbGxvdywgREVGQVVMVF9BTlNJX0NPTE9SU1szXSk7XG4gICAgY29sb3JzLmFuc2lbNF0gPSBwYXJzZUNvbG9yKHRoZW1lLmJsdWUsIERFRkFVTFRfQU5TSV9DT0xPUlNbNF0pO1xuICAgIGNvbG9ycy5hbnNpWzVdID0gcGFyc2VDb2xvcih0aGVtZS5tYWdlbnRhLCBERUZBVUxUX0FOU0lfQ09MT1JTWzVdKTtcbiAgICBjb2xvcnMuYW5zaVs2XSA9IHBhcnNlQ29sb3IodGhlbWUuY3lhbiwgREVGQVVMVF9BTlNJX0NPTE9SU1s2XSk7XG4gICAgY29sb3JzLmFuc2lbN10gPSBwYXJzZUNvbG9yKHRoZW1lLndoaXRlLCBERUZBVUxUX0FOU0lfQ09MT1JTWzddKTtcbiAgICBjb2xvcnMuYW5zaVs4XSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0QmxhY2ssIERFRkFVTFRfQU5TSV9DT0xPUlNbOF0pO1xuICAgIGNvbG9ycy5hbnNpWzldID0gcGFyc2VDb2xvcih0aGVtZS5icmlnaHRSZWQsIERFRkFVTFRfQU5TSV9DT0xPUlNbOV0pO1xuICAgIGNvbG9ycy5hbnNpWzEwXSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0R3JlZW4sIERFRkFVTFRfQU5TSV9DT0xPUlNbMTBdKTtcbiAgICBjb2xvcnMuYW5zaVsxMV0gPSBwYXJzZUNvbG9yKHRoZW1lLmJyaWdodFllbGxvdywgREVGQVVMVF9BTlNJX0NPTE9SU1sxMV0pO1xuICAgIGNvbG9ycy5hbnNpWzEyXSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0Qmx1ZSwgREVGQVVMVF9BTlNJX0NPTE9SU1sxMl0pO1xuICAgIGNvbG9ycy5hbnNpWzEzXSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0TWFnZW50YSwgREVGQVVMVF9BTlNJX0NPTE9SU1sxM10pO1xuICAgIGNvbG9ycy5hbnNpWzE0XSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0Q3lhbiwgREVGQVVMVF9BTlNJX0NPTE9SU1sxNF0pO1xuICAgIGNvbG9ycy5hbnNpWzE1XSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0V2hpdGUsIERFRkFVTFRfQU5TSV9DT0xPUlNbMTVdKTtcbiAgICBpZiAodGhlbWUuZXh0ZW5kZWRBbnNpKSB7XG4gICAgICBjb25zdCBjb2xvckNvdW50ID0gTWF0aC5taW4oY29sb3JzLmFuc2kubGVuZ3RoIC0gMTYsIHRoZW1lLmV4dGVuZGVkQW5zaS5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvckNvdW50OyBpKyspIHtcbiAgICAgICAgY29sb3JzLmFuc2lbaSArIDE2XSA9IHBhcnNlQ29sb3IodGhlbWUuZXh0ZW5kZWRBbnNpW2ldLCBERUZBVUxUX0FOU0lfQ09MT1JTW2kgKyAxNl0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBDbGVhciBvdXIgdGhlIGNhY2hlXG4gICAgdGhpcy5fY29udHJhc3RDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMuX2hhbGZDb250cmFzdENhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5fdXBkYXRlUmVzdG9yZUNvbG9ycygpO1xuICAgIHRoaXMuX29uQ2hhbmdlQ29sb3JzLmZpcmUodGhpcy5jb2xvcnMpO1xuICB9XG5cbiAgcHVibGljIHJlc3RvcmVDb2xvcihzbG90PzogQWxsQ29sb3JJbmRleCk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc3RvcmVDb2xvcihzbG90KTtcbiAgICB0aGlzLl9vbkNoYW5nZUNvbG9ycy5maXJlKHRoaXMuY29sb3JzKTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc3RvcmVDb2xvcihzbG90OiBBbGxDb2xvckluZGV4IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgLy8gdW5zZXQgc2xvdCByZXN0b3JlcyBhbGwgYW5zaSBjb2xvcnNcbiAgICBpZiAoc2xvdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3Jlc3RvcmVDb2xvcnMuYW5zaS5sZW5ndGg7ICsraSkge1xuICAgICAgICB0aGlzLl9jb2xvcnMuYW5zaVtpXSA9IHRoaXMuX3Jlc3RvcmVDb2xvcnMuYW5zaVtpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3dpdGNoIChzbG90KSB7XG4gICAgICBjYXNlIFNwZWNpYWxDb2xvckluZGV4LkZPUkVHUk9VTkQ6XG4gICAgICAgIHRoaXMuX2NvbG9ycy5mb3JlZ3JvdW5kID0gdGhpcy5fcmVzdG9yZUNvbG9ycy5mb3JlZ3JvdW5kO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3BlY2lhbENvbG9ySW5kZXguQkFDS0dST1VORDpcbiAgICAgICAgdGhpcy5fY29sb3JzLmJhY2tncm91bmQgPSB0aGlzLl9yZXN0b3JlQ29sb3JzLmJhY2tncm91bmQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTcGVjaWFsQ29sb3JJbmRleC5DVVJTT1I6XG4gICAgICAgIHRoaXMuX2NvbG9ycy5jdXJzb3IgPSB0aGlzLl9yZXN0b3JlQ29sb3JzLmN1cnNvcjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLl9jb2xvcnMuYW5zaVtzbG90XSA9IHRoaXMuX3Jlc3RvcmVDb2xvcnMuYW5zaVtzbG90XTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbW9kaWZ5Q29sb3JzKGNhbGxiYWNrOiAoY29sb3JzOiBJQ29sb3JTZXQpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBjYWxsYmFjayh0aGlzLl9jb2xvcnMpO1xuICAgIC8vIEFzc3VtZSB0aGUgY2hhbmdlIGhhcHBlbmVkXG4gICAgdGhpcy5fb25DaGFuZ2VDb2xvcnMuZmlyZSh0aGlzLmNvbG9ycyk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVSZXN0b3JlQ29sb3JzKCk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc3RvcmVDb2xvcnMgPSB7XG4gICAgICBmb3JlZ3JvdW5kOiB0aGlzLl9jb2xvcnMuZm9yZWdyb3VuZCxcbiAgICAgIGJhY2tncm91bmQ6IHRoaXMuX2NvbG9ycy5iYWNrZ3JvdW5kLFxuICAgICAgY3Vyc29yOiB0aGlzLl9jb2xvcnMuY3Vyc29yLFxuICAgICAgYW5zaTogdGhpcy5fY29sb3JzLmFuc2kuc2xpY2UoKVxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VDb2xvcihcbiAgY3NzU3RyaW5nOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGZhbGxiYWNrOiBJQ29sb3Jcbik6IElDb2xvciB7XG4gIGlmIChjc3NTdHJpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gY3NzLnRvQ29sb3IoY3NzU3RyaW5nKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIG5vLW9wXG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxsYmFjaztcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUNvbG9yLCBJQ29sb3JSR0IgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5sZXQgJHIgPSAwO1xubGV0ICRnID0gMDtcbmxldCAkYiA9IDA7XG5sZXQgJGEgPSAwO1xuXG5leHBvcnQgY29uc3QgTlVMTF9DT0xPUjogSUNvbG9yID0ge1xuICBjc3M6ICcjMDAwMDAwMDAnLFxuICByZ2JhOiAwXG59O1xuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIFwiY2hhbm5lbHNcIiAoaW5kaXZpZHVhbCBjb2xvciBjaGFubmVscyBhcyBudW1iZXJzKS5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBjaGFubmVscyB7XG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NzcyhyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhPzogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoYSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gYCMke3RvUGFkZGVkSGV4KHIpfSR7dG9QYWRkZWRIZXgoZyl9JHt0b1BhZGRlZEhleChiKX0ke3RvUGFkZGVkSGV4KGEpfWA7XG4gICAgfVxuICAgIHJldHVybiBgIyR7dG9QYWRkZWRIZXgocil9JHt0b1BhZGRlZEhleChnKX0ke3RvUGFkZGVkSGV4KGIpfWA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gdG9SZ2JhKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlciA9IDB4RkYpOiBudW1iZXIge1xuICAgIC8vIE5vdGU6IFRoZSBhZ2dyZWdhdGVkIG51bWJlciBpcyBSR0JBMzIgKEJFKSwgdGh1cyBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8gQUJHUjMyXG4gICAgLy8gb24gTEUgc3lzdGVtcywgYmVmb3JlIGl0IGNhbiBiZSB1c2VkIGZvciBkaXJlY3QgMzItYml0IGJ1ZmZlciB3cml0ZXMuXG4gICAgLy8gPj4+IDAgZm9yY2VzIGFuIHVuc2lnbmVkIGludFxuICAgIHJldHVybiAociA8PCAyNCB8IGcgPDwgMTYgfCBiIDw8IDggfCBhKSA+Pj4gMDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NvbG9yKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE/OiBudW1iZXIpOiBJQ29sb3Ige1xuICAgIHJldHVybiB7XG4gICAgICBjc3M6IGNoYW5uZWxzLnRvQ3NzKHIsIGcsIGIsIGEpLFxuICAgICAgcmdiYTogY2hhbm5lbHMudG9SZ2JhKHIsIGcsIGIsIGEpXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIGBJQ29sb3JgLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIGNvbG9yIHtcbiAgZXhwb3J0IGZ1bmN0aW9uIGJsZW5kKGJnOiBJQ29sb3IsIGZnOiBJQ29sb3IpOiBJQ29sb3Ige1xuICAgICRhID0gKGZnLnJnYmEgJiAweEZGKSAvIDI1NTtcbiAgICBpZiAoJGEgPT09IDEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNzczogZmcuY3NzLFxuICAgICAgICByZ2JhOiBmZy5yZ2JhXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBmZ1IgPSAoZmcucmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGZnRyA9IChmZy5yZ2JhID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgZmdCID0gKGZnLnJnYmEgPj4gOCkgJiAweEZGO1xuICAgIGNvbnN0IGJnUiA9IChiZy5yZ2JhID4+IDI0KSAmIDB4RkY7XG4gICAgY29uc3QgYmdHID0gKGJnLnJnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmcucmdiYSA+PiA4KSAmIDB4RkY7XG4gICAgJHIgPSBiZ1IgKyBNYXRoLnJvdW5kKChmZ1IgLSBiZ1IpICogJGEpO1xuICAgICRnID0gYmdHICsgTWF0aC5yb3VuZCgoZmdHIC0gYmdHKSAqICRhKTtcbiAgICAkYiA9IGJnQiArIE1hdGgucm91bmQoKGZnQiAtIGJnQikgKiAkYSk7XG4gICAgY29uc3QgY3NzID0gY2hhbm5lbHMudG9Dc3MoJHIsICRnLCAkYik7XG4gICAgY29uc3QgcmdiYSA9IGNoYW5uZWxzLnRvUmdiYSgkciwgJGcsICRiKTtcbiAgICByZXR1cm4geyBjc3MsIHJnYmEgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBpc09wYXF1ZShjb2xvcjogSUNvbG9yKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChjb2xvci5yZ2JhICYgMHhGRikgPT09IDB4RkY7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gZW5zdXJlQ29udHJhc3RSYXRpbyhiZzogSUNvbG9yLCBmZzogSUNvbG9yLCByYXRpbzogbnVtYmVyKTogSUNvbG9yIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZXN1bHQgPSByZ2JhLmVuc3VyZUNvbnRyYXN0UmF0aW8oYmcucmdiYSwgZmcucmdiYSwgcmF0aW8pO1xuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gY2hhbm5lbHMudG9Db2xvcihcbiAgICAgIChyZXN1bHQgPj4gMjQgJiAweEZGKSxcbiAgICAgIChyZXN1bHQgPj4gMTYgJiAweEZGKSxcbiAgICAgIChyZXN1bHQgPj4gOCAgJiAweEZGKVxuICAgICk7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gb3BhcXVlKGNvbG9yOiBJQ29sb3IpOiBJQ29sb3Ige1xuICAgIGNvbnN0IHJnYmFDb2xvciA9IChjb2xvci5yZ2JhIHwgMHhGRikgPj4+IDA7XG4gICAgWyRyLCAkZywgJGJdID0gcmdiYS50b0NoYW5uZWxzKHJnYmFDb2xvcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNzczogY2hhbm5lbHMudG9Dc3MoJHIsICRnLCAkYiksXG4gICAgICByZ2JhOiByZ2JhQ29sb3JcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIG9wYWNpdHkoY29sb3I6IElDb2xvciwgb3BhY2l0eTogbnVtYmVyKTogSUNvbG9yIHtcbiAgICAkYSA9IE1hdGgucm91bmQob3BhY2l0eSAqIDB4RkYpO1xuICAgIFskciwgJGcsICRiXSA9IHJnYmEudG9DaGFubmVscyhjb2xvci5yZ2JhKTtcbiAgICByZXR1cm4ge1xuICAgICAgY3NzOiBjaGFubmVscy50b0NzcygkciwgJGcsICRiLCAkYSksXG4gICAgICByZ2JhOiBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYiwgJGEpXG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseU9wYWNpdHkoY29sb3I6IElDb2xvciwgZmFjdG9yOiBudW1iZXIpOiBJQ29sb3Ige1xuICAgICRhID0gY29sb3IucmdiYSAmIDB4RkY7XG4gICAgcmV0dXJuIG9wYWNpdHkoY29sb3IsICgkYSAqIGZhY3RvcikgLyAweEZGKTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NvbG9yUkdCKGNvbG9yOiBJQ29sb3IpOiBJQ29sb3JSR0Ige1xuICAgIHJldHVybiBbKGNvbG9yLnJnYmEgPj4gMjQpICYgMHhGRiwgKGNvbG9yLnJnYmEgPj4gMTYpICYgMHhGRiwgKGNvbG9yLnJnYmEgPj4gOCkgJiAweEZGXTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIFwiY3NzXCIgKHN0cmluZzogJyNyZ2InLCAnI3JnYmEnLCAnI3JyZ2diYicsXG4gKiAnI3JyZ2diYmFhJykuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgY3NzIHtcbiAgLy8gQXR0ZW1wdCB0byBzZXQgZ2V0IHRoZSBzaGFyZWQgY2FudmFzIGNvbnRleHRcbiAgbGV0ICRjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IHVuZGVmaW5lZDtcbiAgbGV0ICRsaXRtdXNDb2xvcjogQ2FudmFzR3JhZGllbnQgfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgLy8gVGhpcyBpcyBndWFyYW50ZWVkIHRvIHJ1biBpbiB0aGUgZmlyc3Qgd2luZG93LCBzbyBkb2N1bWVudCBzaG91bGQgYmUgY29ycmVjdFxuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IDE7XG4gICAgY2FudmFzLmhlaWdodCA9IDE7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywge1xuICAgICAgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlXG4gICAgfSk7XG4gICAgaWYgKGN0eCkge1xuICAgICAgJGN0eCA9IGN0eDtcbiAgICAgICRjdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2NvcHknO1xuICAgICAgJGxpdG11c0NvbG9yID0gJGN0eC5jcmVhdGVMaW5lYXJHcmFkaWVudCgwLCAwLCAxLCAxKTtcbiAgICB9XG4gIH1cbiAgY2F0Y2gge1xuICAgIC8vIG5vb3BcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGNzcyBzdHJpbmcgdG8gYW4gSUNvbG9yLCB0aGlzIHNob3VsZCBoYW5kbGUgYWxsIHZhbGlkIENTUyBjb2xvciBzdHJpbmdzIGFuZCB3aWxsXG4gICAqIHRocm93IGlmIGl0J3MgaW52YWxpZC4gVGhlIGlkZWFsIGZvcm1hdCB0byB1c2UgaXMgYCNycmdnYmJbYWFdYCBhcyBpdCdzIHRoZSBmYXN0ZXN0IHRvIHBhcnNlLlxuICAgKlxuICAgKiBPbmx5IGAjcmdiW2FdYCwgYCNycmdnYmJbYWFdYCwgYHJnYigpYCBhbmQgYHJnYmEoKWAgZm9ybWF0cyBhcmUgc3VwcG9ydGVkIHdoZW4gcnVuIGluIGEgTm9kZVxuICAgKiBlbnZpcm9ubWVudC5cbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NvbG9yKGNzczogc3RyaW5nKTogSUNvbG9yIHtcbiAgICAvLyBGb3JtYXRzOiAjcmdiW2FdIGFuZCAjcnJnZ2JiW2FhXVxuICAgIGlmIChjc3MubWF0Y2goLyNbXFxkYS1mXXszLDh9L2kpKSB7XG4gICAgICBzd2l0Y2ggKGNzcy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSA0OiB7IC8vICNyZ2JcbiAgICAgICAgICAkciA9IHBhcnNlSW50KGNzcy5zbGljZSgxLCAyKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkZyA9IHBhcnNlSW50KGNzcy5zbGljZSgyLCAzKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkYiA9IHBhcnNlSW50KGNzcy5zbGljZSgzLCA0KS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICByZXR1cm4gY2hhbm5lbHMudG9Db2xvcigkciwgJGcsICRiKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDU6IHsgLy8gI3JnYmFcbiAgICAgICAgICAkciA9IHBhcnNlSW50KGNzcy5zbGljZSgxLCAyKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkZyA9IHBhcnNlSW50KGNzcy5zbGljZSgyLCAzKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkYiA9IHBhcnNlSW50KGNzcy5zbGljZSgzLCA0KS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkYSA9IHBhcnNlSW50KGNzcy5zbGljZSg0LCA1KS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICByZXR1cm4gY2hhbm5lbHMudG9Db2xvcigkciwgJGcsICRiLCAkYSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA3OiAvLyAjcnJnZ2JiXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNzcyxcbiAgICAgICAgICAgIHJnYmE6IChwYXJzZUludChjc3Muc2xpY2UoMSksIDE2KSA8PCA4IHwgMHhGRikgPj4+IDBcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlIDk6IC8vICNycmdnYmJhYVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjc3MsXG4gICAgICAgICAgICByZ2JhOiBwYXJzZUludChjc3Muc2xpY2UoMSksIDE2KSA+Pj4gMFxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRm9ybWF0czogcmdiKCkgb3IgcmdiYSgpXG4gICAgY29uc3QgcmdiYU1hdGNoID0gY3NzLm1hdGNoKC9yZ2JhP1xcKFxccyooXFxkezEsM30pXFxzKixcXHMqKFxcZHsxLDN9KVxccyosXFxzKihcXGR7MSwzfSlcXHMqKCxcXHMqKDB8MXxcXGQ/XFwuKFxcZCspKVxccyopP1xcKS8pO1xuICAgIGlmIChyZ2JhTWF0Y2gpIHtcbiAgICAgICRyID0gcGFyc2VJbnQocmdiYU1hdGNoWzFdKTtcbiAgICAgICRnID0gcGFyc2VJbnQocmdiYU1hdGNoWzJdKTtcbiAgICAgICRiID0gcGFyc2VJbnQocmdiYU1hdGNoWzNdKTtcbiAgICAgICRhID0gTWF0aC5yb3VuZCgocmdiYU1hdGNoWzVdID09PSB1bmRlZmluZWQgPyAxIDogcGFyc2VGbG9hdChyZ2JhTWF0Y2hbNV0pKSAqIDB4RkYpO1xuICAgICAgcmV0dXJuIGNoYW5uZWxzLnRvQ29sb3IoJHIsICRnLCAkYiwgJGEpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoZSBjb250ZXh0IGlzIGF2YWlsYWJsZSBmb3IgY2FudmFzLWJhc2VkIGNvbG9yIHBhcnNpbmdcbiAgICBpZiAoISRjdHggfHwgISRsaXRtdXNDb2xvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjc3MudG9Db2xvcjogVW5zdXBwb3J0ZWQgY3NzIGZvcm1hdCcpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoZSBjb2xvciB1c2luZyBjYW52YXMgZmlsbFN0eWxlXG4gICAgLy8gU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2NhbnZhcy5odG1sI2ZpbGwtYW5kLXN0cm9rZS1zdHlsZXNcbiAgICAkY3R4LmZpbGxTdHlsZSA9ICRsaXRtdXNDb2xvcjtcbiAgICAkY3R4LmZpbGxTdHlsZSA9IGNzcztcbiAgICBpZiAodHlwZW9mICRjdHguZmlsbFN0eWxlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjc3MudG9Db2xvcjogVW5zdXBwb3J0ZWQgY3NzIGZvcm1hdCcpO1xuICAgIH1cblxuICAgICRjdHguZmlsbFJlY3QoMCwgMCwgMSwgMSk7XG4gICAgWyRyLCAkZywgJGIsICRhXSA9ICRjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIDEsIDEpLmRhdGE7XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgY29sb3IgaXMgbm9uLXRyYW5zcGFyZW50IGFzIGNvbG9yIGh1ZSBnZXRzIGxvc3Qgd2hlbiBkcmF3biB0byB0aGUgY2FudmFzXG4gICAgaWYgKCRhICE9PSAweEZGKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nzcy50b0NvbG9yOiBVbnN1cHBvcnRlZCBjc3MgZm9ybWF0Jyk7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCB0aGUgY29sb3IgZnJvbSB0aGUgY2FudmFzJyBmaWxsU3R5bGUgcHJvcGVydHkgd2hpY2ggZXhwb3NlcyB0aGUgY29sb3IgdmFsdWUgaW4gcmdiYSgpXG4gICAgLy8gZm9ybWF0XG4gICAgLy8gU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2NhbnZhcy5odG1sI3NlcmlhbGlzYXRpb24tb2YtYS1jb2xvclxuICAgIHJldHVybiB7XG4gICAgICByZ2JhOiBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYiwgJGEpLFxuICAgICAgY3NzXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIFwicmdiXCIgKG51bWJlcjogMHhycmdnYmIpLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIHJnYiB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSByZWxhdGl2ZSBsdW1pbmFuY2Ugb2YgYW4gUkdCIGNvbG9yLCB0aGlzIGlzIHVzZWZ1bCBpbiBkZXRlcm1pbmluZyB0aGUgY29udHJhc3QgcmF0aW9cbiAgICogYmV0d2VlbiB0d28gY29sb3JzLlxuICAgKiBAcGFyYW0gcmdiIFRoZSBjb2xvciB0byB1c2UuXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jcmVsYXRpdmVsdW1pbmFuY2VkZWZcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZUx1bWluYW5jZShyZ2I6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHJlbGF0aXZlTHVtaW5hbmNlMihcbiAgICAgIChyZ2IgPj4gMTYpICYgMHhGRixcbiAgICAgIChyZ2IgPj4gOCApICYgMHhGRixcbiAgICAgIChyZ2IgICAgICApICYgMHhGRik7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgcmVsYXRpdmUgbHVtaW5hbmNlIG9mIGFuIFJHQiBjb2xvciwgdGhpcyBpcyB1c2VmdWwgaW4gZGV0ZXJtaW5pbmcgdGhlIGNvbnRyYXN0IHJhdGlvXG4gICAqIGJldHdlZW4gdHdvIGNvbG9ycy5cbiAgICogQHBhcmFtIHIgVGhlIHJlZCBjaGFubmVsICgweDAwIHRvIDB4RkYpLlxuICAgKiBAcGFyYW0gZyBUaGUgZ3JlZW4gY2hhbm5lbCAoMHgwMCB0byAweEZGKS5cbiAgICogQHBhcmFtIGIgVGhlIGJsdWUgY2hhbm5lbCAoMHgwMCB0byAweEZGKS5cbiAgICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvV0NBRzIwLyNyZWxhdGl2ZWx1bWluYW5jZWRlZlxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aXZlTHVtaW5hbmNlMihyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBycyA9IHIgLyAyNTU7XG4gICAgY29uc3QgZ3MgPSBnIC8gMjU1O1xuICAgIGNvbnN0IGJzID0gYiAvIDI1NTtcbiAgICBjb25zdCByciA9IHJzIDw9IDAuMDM5MjggPyBycyAvIDEyLjkyIDogTWF0aC5wb3coKHJzICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgY29uc3QgcmcgPSBncyA8PSAwLjAzOTI4ID8gZ3MgLyAxMi45MiA6IE1hdGgucG93KChncyArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgIGNvbnN0IHJiID0gYnMgPD0gMC4wMzkyOCA/IGJzIC8gMTIuOTIgOiBNYXRoLnBvdygoYnMgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICByZXR1cm4gcnIgKiAwLjIxMjYgKyByZyAqIDAuNzE1MiArIHJiICogMC4wNzIyO1xuICB9XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9ucyB3aGVyZSB0aGUgc291cmNlIHR5cGUgaXMgXCJyZ2JhXCIgKG51bWJlcjogMHhycmdnYmJhYSkuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgcmdiYSB7XG4gIGV4cG9ydCBmdW5jdGlvbiBibGVuZChiZzogbnVtYmVyLCBmZzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAkYSA9IChmZyAmIDB4RkYpIC8gMHhGRjtcbiAgICBpZiAoJGEgPT09IDEpIHtcbiAgICAgIHJldHVybiBmZztcbiAgICB9XG4gICAgY29uc3QgZmdSID0gKGZnID4+IDI0KSAmIDB4RkY7XG4gICAgY29uc3QgZmdHID0gKGZnID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgZmdCID0gKGZnID4+IDgpICYgMHhGRjtcbiAgICBjb25zdCBiZ1IgPSAoYmcgPj4gMjQpICYgMHhGRjtcbiAgICBjb25zdCBiZ0cgPSAoYmcgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmcgPj4gOCkgJiAweEZGO1xuICAgICRyID0gYmdSICsgTWF0aC5yb3VuZCgoZmdSIC0gYmdSKSAqICRhKTtcbiAgICAkZyA9IGJnRyArIE1hdGgucm91bmQoKGZnRyAtIGJnRykgKiAkYSk7XG4gICAgJGIgPSBiZ0IgKyBNYXRoLnJvdW5kKChmZ0IgLSBiZ0IpICogJGEpO1xuICAgIHJldHVybiBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYik7XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYSBmb3JlZ3JvdW5kIGNvbG9yIGFuZCBhIGJhY2tncm91bmQgY29sb3IsIGVpdGhlciBpbmNyZWFzZSBvciByZWR1Y2UgdGhlIGx1bWluYW5jZSBvZiB0aGVcbiAgICogZm9yZWdyb3VuZCBjb2xvciB1bnRpbCB0aGUgc3BlY2lmaWVkIGNvbnRyYXN0IHJhdGlvIGlzIG1ldC4gSWYgcHVyZSB3aGl0ZSBvciBibGFjayBpcyBoaXRcbiAgICogd2l0aG91dCB0aGUgY29udHJhc3QgcmF0aW8gYmVpbmcgbWV0LCBnbyB0aGUgb3RoZXIgZGlyZWN0aW9uIHVzaW5nIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGFzIHRoZVxuICAgKiBmb3JlZ3JvdW5kIGNvbG9yIGFuZCB0YWtlIGVpdGhlciB0aGUgZmlyc3Qgb3Igc2Vjb25kIHJlc3VsdCBkZXBlbmRpbmcgb24gd2hpY2ggaGFzIHRoZSBoaWdoZXJcbiAgICogY29udHJhc3QgcmF0aW8uXG4gICAqXG4gICAqIGB1bmRlZmluZWRgIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGNvbnRyYXN0IHJhdGlvIGlzIGFscmVhZHkgbWV0LlxuICAgKlxuICAgKiBAcGFyYW0gYmdSZ2JhIFRoZSBiYWNrZ3JvdW5kIGNvbG9yIGluIHJnYmEgZm9ybWF0LlxuICAgKiBAcGFyYW0gZmdSZ2JhIFRoZSBmb3JlZ3JvdW5kIGNvbG9yIGluIHJnYmEgZm9ybWF0LlxuICAgKiBAcGFyYW0gcmF0aW8gVGhlIGNvbnRyYXN0IHJhdGlvIHRvIGFjaGlldmUuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gZW5zdXJlQ29udHJhc3RSYXRpbyhiZ1JnYmE6IG51bWJlciwgZmdSZ2JhOiBudW1iZXIsIHJhdGlvOiBudW1iZXIpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGJnTCA9IHJnYi5yZWxhdGl2ZUx1bWluYW5jZShiZ1JnYmEgPj4gOCk7XG4gICAgY29uc3QgZmdMID0gcmdiLnJlbGF0aXZlTHVtaW5hbmNlKGZnUmdiYSA+PiA4KTtcbiAgICBjb25zdCBjciA9IGNvbnRyYXN0UmF0aW8oYmdMLCBmZ0wpO1xuICAgIGlmIChjciA8IHJhdGlvKSB7XG4gICAgICBpZiAoZmdMIDwgYmdMKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdEEgPSByZWR1Y2VMdW1pbmFuY2UoYmdSZ2JhLCBmZ1JnYmEsIHJhdGlvKTtcbiAgICAgICAgY29uc3QgcmVzdWx0QVJhdGlvID0gY29udHJhc3RSYXRpbyhiZ0wsIHJnYi5yZWxhdGl2ZUx1bWluYW5jZShyZXN1bHRBID4+IDgpKTtcbiAgICAgICAgaWYgKHJlc3VsdEFSYXRpbyA8IHJhdGlvKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0QiA9IGluY3JlYXNlTHVtaW5hbmNlKGJnUmdiYSwgZmdSZ2JhLCByYXRpbyk7XG4gICAgICAgICAgY29uc3QgcmVzdWx0QlJhdGlvID0gY29udHJhc3RSYXRpbyhiZ0wsIHJnYi5yZWxhdGl2ZUx1bWluYW5jZShyZXN1bHRCID4+IDgpKTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0QVJhdGlvID4gcmVzdWx0QlJhdGlvID8gcmVzdWx0QSA6IHJlc3VsdEI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdEE7XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHRBID0gaW5jcmVhc2VMdW1pbmFuY2UoYmdSZ2JhLCBmZ1JnYmEsIHJhdGlvKTtcbiAgICAgIGNvbnN0IHJlc3VsdEFSYXRpbyA9IGNvbnRyYXN0UmF0aW8oYmdMLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UocmVzdWx0QSA+PiA4KSk7XG4gICAgICBpZiAocmVzdWx0QVJhdGlvIDwgcmF0aW8pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0QiA9IHJlZHVjZUx1bWluYW5jZShiZ1JnYmEsIGZnUmdiYSwgcmF0aW8pO1xuICAgICAgICBjb25zdCByZXN1bHRCUmF0aW8gPSBjb250cmFzdFJhdGlvKGJnTCwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlKHJlc3VsdEIgPj4gOCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0QVJhdGlvID4gcmVzdWx0QlJhdGlvID8gcmVzdWx0QSA6IHJlc3VsdEI7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0QTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiByZWR1Y2VMdW1pbmFuY2UoYmdSZ2JhOiBudW1iZXIsIGZnUmdiYTogbnVtYmVyLCByYXRpbzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAvLyBUaGlzIGlzIGEgbmFpdmUgYnV0IGZhc3QgYXBwcm9hY2ggdG8gcmVkdWNpbmcgbHVtaW5hbmNlIGFzIGNvbnZlcnRpbmcgdG9cbiAgICAvLyBIU0wgYW5kIGJhY2sgaXMgZXhwZW5zaXZlXG4gICAgY29uc3QgYmdSID0gKGJnUmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGJnRyA9IChiZ1JnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGZnUiA9IChmZ1JnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBsZXQgZmdHID0gKGZnUmdiYSA+PiAxNikgJiAweEZGO1xuICAgIGxldCBmZ0IgPSAoZmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB3aGlsZSAoY3IgPCByYXRpbyAmJiAoZmdSID4gMCB8fCBmZ0cgPiAwIHx8IGZnQiA+IDApKSB7XG4gICAgICAvLyBSZWR1Y2UgYnkgMTAlIHVudGlsIHRoZSByYXRpbyBpcyBoaXRcbiAgICAgIGZnUiAtPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoZmdSICogMC4xKSk7XG4gICAgICBmZ0cgLT0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKGZnRyAqIDAuMSkpO1xuICAgICAgZmdCIC09IE1hdGgubWF4KDAsIE1hdGguY2VpbChmZ0IgKiAwLjEpKTtcbiAgICAgIGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB9XG4gICAgcmV0dXJuIChmZ1IgPDwgMjQgfCBmZ0cgPDwgMTYgfCBmZ0IgPDwgOCB8IDB4RkYpID4+PiAwO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGluY3JlYXNlTHVtaW5hbmNlKGJnUmdiYTogbnVtYmVyLCBmZ1JnYmE6IG51bWJlciwgcmF0aW86IG51bWJlcik6IG51bWJlciB7XG4gICAgLy8gVGhpcyBpcyBhIG5haXZlIGJ1dCBmYXN0IGFwcHJvYWNoIHRvIGluY3JlYXNpbmcgbHVtaW5hbmNlIGFzIGNvbnZlcnRpbmcgdG9cbiAgICAvLyBIU0wgYW5kIGJhY2sgaXMgZXhwZW5zaXZlXG4gICAgY29uc3QgYmdSID0gKGJnUmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGJnRyA9IChiZ1JnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGZnUiA9IChmZ1JnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBsZXQgZmdHID0gKGZnUmdiYSA+PiAxNikgJiAweEZGO1xuICAgIGxldCBmZ0IgPSAoZmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB3aGlsZSAoY3IgPCByYXRpbyAmJiAoZmdSIDwgMHhGRiB8fCBmZ0cgPCAweEZGIHx8IGZnQiA8IDB4RkYpKSB7XG4gICAgICAvLyBJbmNyZWFzZSBieSAxMCUgdW50aWwgdGhlIHJhdGlvIGlzIGhpdFxuICAgICAgZmdSID0gTWF0aC5taW4oMHhGRiwgZmdSICsgTWF0aC5jZWlsKCgyNTUgLSBmZ1IpICogMC4xKSk7XG4gICAgICBmZ0cgPSBNYXRoLm1pbigweEZGLCBmZ0cgKyBNYXRoLmNlaWwoKDI1NSAtIGZnRykgKiAwLjEpKTtcbiAgICAgIGZnQiA9IE1hdGgubWluKDB4RkYsIGZnQiArIE1hdGguY2VpbCgoMjU1IC0gZmdCKSAqIDAuMSkpO1xuICAgICAgY3IgPSBjb250cmFzdFJhdGlvKHJnYi5yZWxhdGl2ZUx1bWluYW5jZTIoZmdSLCBmZ0csIGZnQiksIHJnYi5yZWxhdGl2ZUx1bWluYW5jZTIoYmdSLCBiZ0csIGJnQikpO1xuICAgIH1cbiAgICByZXR1cm4gKGZnUiA8PCAyNCB8IGZnRyA8PCAxNiB8IGZnQiA8PCA4IHwgMHhGRikgPj4+IDA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gdG9DaGFubmVscyh2YWx1ZTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0ge1xuICAgIHJldHVybiBbKHZhbHVlID4+IDI0KSAmIDB4RkYsICh2YWx1ZSA+PiAxNikgJiAweEZGLCAodmFsdWUgPj4gOCkgJiAweEZGLCB2YWx1ZSAmIDB4RkZdO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1BhZGRlZEhleChjOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBzID0gYy50b1N0cmluZygxNik7XG4gIHJldHVybiBzLmxlbmd0aCA8IDIgPyAnMCcgKyBzIDogcztcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBjb250cmFzdCByYXRpbyBiZXR3ZWVuIHR3byByZWxhdGl2ZSBsdW1pbmFuY2UgdmFsdWVzLlxuICogQHBhcmFtIGwxIFRoZSBmaXJzdCByZWxhdGl2ZSBsdW1pbmFuY2UuXG4gKiBAcGFyYW0gbDIgVGhlIGZpcnN0IHJlbGF0aXZlIGx1bWluYW5jZS5cbiAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jY29udHJhc3QtcmF0aW9kZWZcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRyYXN0UmF0aW8obDE6IG51bWJlciwgbDI6IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChsMSA8IGwyKSB7XG4gICAgcmV0dXJuIChsMiArIDAuMDUpIC8gKGwxICsgMC4wNSk7XG4gIH1cbiAgcmV0dXJuIChsMSArIDAuMDUpIC8gKGwyICsgMC4wNSk7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxuaW50ZXJmYWNlIElMaXN0ZW5lcjxULCBVID0gdm9pZD4ge1xuICAoYXJnMTogVCwgYXJnMjogVSk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUV2ZW50PFQsIFUgPSB2b2lkPiB7XG4gIChsaXN0ZW5lcjogKGFyZzE6IFQsIGFyZzI6IFUpID0+IGFueSk6IElEaXNwb3NhYmxlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFdmVudEVtaXR0ZXI8VCwgVSA9IHZvaWQ+IHtcbiAgZXZlbnQ6IElFdmVudDxULCBVPjtcbiAgZmlyZShhcmcxOiBULCBhcmcyOiBVKTogdm9pZDtcbiAgZGlzcG9zZSgpOiB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgRXZlbnRFbWl0dGVyPFQsIFUgPSB2b2lkPiBpbXBsZW1lbnRzIElFdmVudEVtaXR0ZXI8VCwgVT4ge1xuICBwcml2YXRlIF9saXN0ZW5lcnM6IElMaXN0ZW5lcjxULCBVPltdID0gW107XG4gIHByaXZhdGUgX2V2ZW50PzogSUV2ZW50PFQsIFU+O1xuICBwcml2YXRlIF9kaXNwb3NlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHB1YmxpYyBnZXQgZXZlbnQoKTogSUV2ZW50PFQsIFU+IHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50KSB7XG4gICAgICB0aGlzLl9ldmVudCA9IChsaXN0ZW5lcjogKGFyZzE6IFQsIGFyZzI6IFUpID0+IGFueSkgPT4ge1xuICAgICAgICB0aGlzLl9saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIGNvbnN0IGRpc3Bvc2FibGUgPSB7XG4gICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9kaXNwb3NlZCkge1xuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2xpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9saXN0ZW5lcnNbaV0gPT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGRpc3Bvc2FibGU7XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZmlyZShhcmcxOiBULCBhcmcyOiBVKTogdm9pZCB7XG4gICAgY29uc3QgcXVldWU6IElMaXN0ZW5lcjxULCBVPltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9saXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXVlLnB1c2godGhpcy5fbGlzdGVuZXJzW2ldKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgcXVldWVbaV0uY2FsbCh1bmRlZmluZWQsIGFyZzEsIGFyZzIpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLl9kaXNwb3NlZCA9IHRydWU7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xpc3RlbmVycykge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLmxlbmd0aCA9IDA7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkRXZlbnQ8VD4oZnJvbTogSUV2ZW50PFQ+LCB0bzogSUV2ZW50RW1pdHRlcjxUPik6IElEaXNwb3NhYmxlIHtcbiAgcmV0dXJuIGZyb20oZSA9PiB0by5maXJlKGUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bkFuZFN1YnNjcmliZTxUPihldmVudDogSUV2ZW50PFQ+LCBoYW5kbGVyOiAoZTogVCB8IHVuZGVmaW5lZCkgPT4gYW55KTogSURpc3Bvc2FibGUge1xuICBoYW5kbGVyKHVuZGVmaW5lZCk7XG4gIHJldHVybiBldmVudChlID0+IGhhbmRsZXIoZSkpO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbi8qKlxuICogQSBiYXNlIGNsYXNzIHRoYXQgY2FuIGJlIGV4dGVuZGVkIHRvIHByb3ZpZGUgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgbWFuYWdpbmcgdGhlIGxpZmVjeWNsZSBvZiBhblxuICogb2JqZWN0IGFuZCBpdHMgY29tcG9uZW50cy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJRGlzcG9zYWJsZSB7XG4gIHByb3RlY3RlZCBfZGlzcG9zYWJsZXM6IElEaXNwb3NhYmxlW10gPSBbXTtcbiAgcHJvdGVjdGVkIF9pc0Rpc3Bvc2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIHRoZSBvYmplY3QsIHRyaWdnZXJpbmcgdGhlIGBkaXNwb3NlYCBtZXRob2Qgb24gYWxsIHJlZ2lzdGVyZWQgSURpc3Bvc2FibGVzLlxuICAgKi9cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5faXNEaXNwb3NlZCA9IHRydWU7XG4gICAgZm9yIChjb25zdCBkIG9mIHRoaXMuX2Rpc3Bvc2FibGVzKSB7XG4gICAgICBkLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgdGhpcy5fZGlzcG9zYWJsZXMubGVuZ3RoID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBkaXNwb3NhYmxlIG9iamVjdC5cbiAgICogQHBhcmFtIGQgVGhlIGRpc3Bvc2FibGUgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBkaXNwb3NhYmxlLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyPFQgZXh0ZW5kcyBJRGlzcG9zYWJsZT4oZDogVCk6IFQge1xuICAgIHRoaXMuX2Rpc3Bvc2FibGVzLnB1c2goZCk7XG4gICAgcmV0dXJuIGQ7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBkaXNwb3NhYmxlIG9iamVjdCBpZiBpdCBoYXMgYmVlbiByZWdpc3RlcmVkLCBpZiBub3QgZG9cbiAgICogbm90aGluZy5cbiAgICogQHBhcmFtIGQgVGhlIGRpc3Bvc2FibGUgdG8gdW5yZWdpc3Rlci5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyPFQgZXh0ZW5kcyBJRGlzcG9zYWJsZT4oZDogVCk6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fZGlzcG9zYWJsZXMuaW5kZXhPZihkKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLl9kaXNwb3NhYmxlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTXV0YWJsZURpc3Bvc2FibGU8VCBleHRlbmRzIElEaXNwb3NhYmxlPiBpbXBsZW1lbnRzIElEaXNwb3NhYmxlIHtcbiAgcHJpdmF0ZSBfdmFsdWU/OiBUO1xuICBwcml2YXRlIF9pc0Rpc3Bvc2VkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZhbHVlIGlmIGl0IGV4aXN0cy5cbiAgICovXG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRGlzcG9zZWQgPyB1bmRlZmluZWQgOiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSwgZGlzcG9zaW5nIG9mIHRoZSBvbGQgdmFsdWUgaWYgaXQgZXhpc3RzLlxuICAgKi9cbiAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogVCB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh0aGlzLl9pc0Rpc3Bvc2VkIHx8IHZhbHVlID09PSB0aGlzLl92YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl92YWx1ZT8uZGlzcG9zZSgpO1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBzdG9yZWQgdmFsdWUgYW5kIGRpc3Bvc2VzIG9mIHRoZSBwcmV2aW91c2x5IHN0b3JlZCB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5faXNEaXNwb3NlZCA9IHRydWU7XG4gICAgdGhpcy5fdmFsdWU/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLl92YWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFdyYXAgYSBmdW5jdGlvbiBpbiBhIGRpc3Bvc2FibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0Rpc3Bvc2FibGUoZjogKCkgPT4gdm9pZCk6IElEaXNwb3NhYmxlIHtcbiAgcmV0dXJuIHsgZGlzcG9zZTogZiB9O1xufVxuXG4vKipcbiAqIERpc3Bvc2Ugb2YgYWxsIGRpc3Bvc2FibGVzIGluIGFuIGFycmF5IGFuZCBzZXQgaXRzIGxlbmd0aCB0byAwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zZUFycmF5KGRpc3Bvc2FibGVzOiBJRGlzcG9zYWJsZVtdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgZCBvZiBkaXNwb3NhYmxlcykge1xuICAgIGQuZGlzcG9zZSgpO1xuICB9XG4gIGRpc3Bvc2FibGVzLmxlbmd0aCA9IDA7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRpc3Bvc2FibGUgdGhhdCB3aWxsIGRpc3Bvc2Ugb2YgYW4gYXJyYXkgb2YgZGlzcG9zYWJsZXMgd2hlbiBkaXNwb3NlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpc3Bvc2VBcnJheURpc3Bvc2FibGUoYXJyYXk6IElEaXNwb3NhYmxlW10pOiBJRGlzcG9zYWJsZSB7XG4gIHJldHVybiB7IGRpc3Bvc2U6ICgpID0+IGRpc3Bvc2VBcnJheShhcnJheSkgfTtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIyIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuZXhwb3J0IGNsYXNzIFR3b0tleU1hcDxURmlyc3QgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIsIFRTZWNvbmQgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIsIFRWYWx1ZT4ge1xuICBwcml2YXRlIF9kYXRhOiB7IFtiZzogc3RyaW5nIHwgbnVtYmVyXTogeyBbZmc6IHN0cmluZyB8IG51bWJlcl06IFRWYWx1ZSB8IHVuZGVmaW5lZCB9IHwgdW5kZWZpbmVkIH0gPSB7fTtcblxuICBwdWJsaWMgc2V0KGZpcnN0OiBURmlyc3QsIHNlY29uZDogVFNlY29uZCwgdmFsdWU6IFRWYWx1ZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZGF0YVtmaXJzdF0pIHtcbiAgICAgIHRoaXMuX2RhdGFbZmlyc3RdID0ge307XG4gICAgfVxuICAgIHRoaXMuX2RhdGFbZmlyc3QgYXMgc3RyaW5nIHwgbnVtYmVyXSFbc2Vjb25kXSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldChmaXJzdDogVEZpcnN0LCBzZWNvbmQ6IFRTZWNvbmQpOiBUVmFsdWUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhW2ZpcnN0IGFzIHN0cmluZyB8IG51bWJlcl0gPyB0aGlzLl9kYXRhW2ZpcnN0IGFzIHN0cmluZyB8IG51bWJlcl0hW3NlY29uZF0gOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YSA9IHt9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGb3VyS2V5TWFwPFRGaXJzdCBleHRlbmRzIHN0cmluZyB8IG51bWJlciwgVFNlY29uZCBleHRlbmRzIHN0cmluZyB8IG51bWJlciwgVFRoaXJkIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyLCBURm91cnRoIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyLCBUVmFsdWU+IHtcbiAgcHJpdmF0ZSBfZGF0YTogVHdvS2V5TWFwPFRGaXJzdCwgVFNlY29uZCwgVHdvS2V5TWFwPFRUaGlyZCwgVEZvdXJ0aCwgVFZhbHVlPj4gPSBuZXcgVHdvS2V5TWFwKCk7XG5cbiAgcHVibGljIHNldChmaXJzdDogVEZpcnN0LCBzZWNvbmQ6IFRTZWNvbmQsIHRoaXJkOiBUVGhpcmQsIGZvdXJ0aDogVEZvdXJ0aCwgdmFsdWU6IFRWYWx1ZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZGF0YS5nZXQoZmlyc3QsIHNlY29uZCkpIHtcbiAgICAgIHRoaXMuX2RhdGEuc2V0KGZpcnN0LCBzZWNvbmQsIG5ldyBUd29LZXlNYXAoKSk7XG4gICAgfVxuICAgIHRoaXMuX2RhdGEuZ2V0KGZpcnN0LCBzZWNvbmQpIS5zZXQodGhpcmQsIGZvdXJ0aCwgdmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdldChmaXJzdDogVEZpcnN0LCBzZWNvbmQ6IFRTZWNvbmQsIHRoaXJkOiBUVGhpcmQsIGZvdXJ0aDogVEZvdXJ0aCk6IFRWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEuZ2V0KGZpcnN0LCBzZWNvbmQpPy5nZXQodGhpcmQsIGZvdXJ0aCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YS5jbGVhcigpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICpcbiAqIFRoaXMgd2FzIGhlYXZpbHkgaW5zcGlyZWQgZnJvbSBtaWNyb3NvZnQvdnNjb2RlJ3MgZGVwZW5kZW5jeSBpbmplY3Rpb24gc3lzdGVtIChNSVQpLlxuICovXG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuaW1wb3J0IHsgSVNlcnZpY2VJZGVudGlmaWVyIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuY29uc3QgRElfVEFSR0VUID0gJ2RpJHRhcmdldCc7XG5jb25zdCBESV9ERVBFTkRFTkNJRVMgPSAnZGkkZGVwZW5kZW5jaWVzJztcblxuZXhwb3J0IGNvbnN0IHNlcnZpY2VSZWdpc3RyeTogTWFwPHN0cmluZywgSVNlcnZpY2VJZGVudGlmaWVyPGFueT4+ID0gbmV3IE1hcCgpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VydmljZURlcGVuZGVuY2llcyhjdG9yOiBhbnkpOiB7IGlkOiBJU2VydmljZUlkZW50aWZpZXI8YW55PiwgaW5kZXg6IG51bWJlciwgb3B0aW9uYWw6IGJvb2xlYW4gfVtdIHtcbiAgcmV0dXJuIGN0b3JbRElfREVQRU5ERU5DSUVTXSB8fCBbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlY29yYXRvcjxUPihpZDogc3RyaW5nKTogSVNlcnZpY2VJZGVudGlmaWVyPFQ+IHtcbiAgaWYgKHNlcnZpY2VSZWdpc3RyeS5oYXMoaWQpKSB7XG4gICAgcmV0dXJuIHNlcnZpY2VSZWdpc3RyeS5nZXQoaWQpITtcbiAgfVxuXG4gIGNvbnN0IGRlY29yYXRvcjogYW55ID0gZnVuY3Rpb24gKHRhcmdldDogRnVuY3Rpb24sIGtleTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogYW55IHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCAhPT0gMykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdASVNlcnZpY2VOYW1lLWRlY29yYXRvciBjYW4gb25seSBiZSB1c2VkIHRvIGRlY29yYXRlIGEgcGFyYW1ldGVyJyk7XG4gICAgfVxuXG4gICAgc3RvcmVTZXJ2aWNlRGVwZW5kZW5jeShkZWNvcmF0b3IsIHRhcmdldCwgaW5kZXgpO1xuICB9O1xuXG4gIGRlY29yYXRvci50b1N0cmluZyA9ICgpID0+IGlkO1xuXG4gIHNlcnZpY2VSZWdpc3RyeS5zZXQoaWQsIGRlY29yYXRvcik7XG4gIHJldHVybiBkZWNvcmF0b3I7XG59XG5cbmZ1bmN0aW9uIHN0b3JlU2VydmljZURlcGVuZGVuY3koaWQ6IEZ1bmN0aW9uLCB0YXJnZXQ6IEZ1bmN0aW9uLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gIGlmICgodGFyZ2V0IGFzIGFueSlbRElfVEFSR0VUXSA9PT0gdGFyZ2V0KSB7XG4gICAgKHRhcmdldCBhcyBhbnkpW0RJX0RFUEVOREVOQ0lFU10ucHVzaCh7IGlkLCBpbmRleCB9KTtcbiAgfSBlbHNlIHtcbiAgICAodGFyZ2V0IGFzIGFueSlbRElfREVQRU5ERU5DSUVTXSA9IFt7IGlkLCBpbmRleCB9XTtcbiAgICAodGFyZ2V0IGFzIGFueSlbRElfVEFSR0VUXSA9IHRhcmdldDtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJRXZlbnQsIElFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IElCdWZmZXIsIElCdWZmZXJTZXQgfSBmcm9tICdjb21tb24vYnVmZmVyL1R5cGVzJztcbmltcG9ydCB7IElEZWNQcml2YXRlTW9kZXMsIElDb3JlTW91c2VFdmVudCwgQ29yZU1vdXNlRW5jb2RpbmcsIElDb3JlTW91c2VQcm90b2NvbCwgQ29yZU1vdXNlRXZlbnRUeXBlLCBJQ2hhcnNldCwgSVdpbmRvd09wdGlvbnMsIElNb2RlcywgSUF0dHJpYnV0ZURhdGEsIFNjcm9sbFNvdXJjZSwgSURpc3Bvc2FibGUsIElDb2xvciwgQ3Vyc29yU3R5bGUsIEN1cnNvckluYWN0aXZlU3R5bGUsIElPc2NMaW5rRGF0YSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVEZWNvcmF0b3IgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IElEZWNvcmF0aW9uT3B0aW9ucywgSURlY29yYXRpb24sIElMaW5rSGFuZGxlciwgSVdpbmRvd3NQdHksIElMb2dnZXIgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuXG5leHBvcnQgY29uc3QgSUJ1ZmZlclNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUJ1ZmZlclNlcnZpY2U+KCdCdWZmZXJTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElCdWZmZXJTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgcmVhZG9ubHkgY29sczogbnVtYmVyO1xuICByZWFkb25seSByb3dzOiBudW1iZXI7XG4gIHJlYWRvbmx5IGJ1ZmZlcjogSUJ1ZmZlcjtcbiAgcmVhZG9ubHkgYnVmZmVyczogSUJ1ZmZlclNldDtcbiAgaXNVc2VyU2Nyb2xsaW5nOiBib29sZWFuO1xuICBvblJlc2l6ZTogSUV2ZW50PHsgY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIgfT47XG4gIG9uU2Nyb2xsOiBJRXZlbnQ8bnVtYmVyPjtcbiAgc2Nyb2xsKGVyYXNlQXR0cjogSUF0dHJpYnV0ZURhdGEsIGlzV3JhcHBlZD86IGJvb2xlYW4pOiB2b2lkO1xuICBzY3JvbGxMaW5lcyhkaXNwOiBudW1iZXIsIHN1cHByZXNzU2Nyb2xsRXZlbnQ/OiBib29sZWFuLCBzb3VyY2U/OiBTY3JvbGxTb3VyY2UpOiB2b2lkO1xuICByZXNpemUoY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIpOiB2b2lkO1xuICByZXNldCgpOiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgSUNvcmVNb3VzZVNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUNvcmVNb3VzZVNlcnZpY2U+KCdDb3JlTW91c2VTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElDb3JlTW91c2VTZXJ2aWNlIHtcbiAgYWN0aXZlUHJvdG9jb2w6IHN0cmluZztcbiAgYWN0aXZlRW5jb2Rpbmc6IHN0cmluZztcbiAgYXJlTW91c2VFdmVudHNBY3RpdmU6IGJvb2xlYW47XG4gIGFkZFByb3RvY29sKG5hbWU6IHN0cmluZywgcHJvdG9jb2w6IElDb3JlTW91c2VQcm90b2NvbCk6IHZvaWQ7XG4gIGFkZEVuY29kaW5nKG5hbWU6IHN0cmluZywgZW5jb2Rpbmc6IENvcmVNb3VzZUVuY29kaW5nKTogdm9pZDtcbiAgcmVzZXQoKTogdm9pZDtcblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBtb3VzZSBldmVudCB0byBiZSBzZW50LlxuICAgKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGV2ZW50IHBhc3NlZCBhbGwgcHJvdG9jb2wgcmVzdHJpY3Rpb25zIGFuZCBhIHJlcG9ydFxuICAgKiB3YXMgc2VudCwgb3RoZXJ3aXNlIGZhbHNlLiBUaGUgcmV0dXJuIHZhbHVlIG1heSBiZSB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyXG4gICAqIHRoZSBkZWZhdWx0IGV2ZW50IGFjdGlvbiBpbiB0aGUgYm93c2VyIGNvbXBvbmVudCBzaG91bGQgYmUgb21pdHRlZC5cbiAgICpcbiAgICogTm90ZTogVGhlIG1ldGhvZCB3aWxsIGNoYW5nZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIGV2ZW50IG9iamVjdFxuICAgKiB0byBmdWxsZmlsbCBwcm90b2NvbCBhbmQgZW5jb2RpbmcgcmVzdHJpY3Rpb25zLlxuICAgKi9cbiAgdHJpZ2dlck1vdXNlRXZlbnQoZXZlbnQ6IElDb3JlTW91c2VFdmVudCk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEV2ZW50IHRvIGFubm91bmNlIGNoYW5nZXMgaW4gbW91c2UgdHJhY2tpbmcuXG4gICAqL1xuICBvblByb3RvY29sQ2hhbmdlOiBJRXZlbnQ8Q29yZU1vdXNlRXZlbnRUeXBlPjtcblxuICAvKipcbiAgICogSHVtYW4gcmVhZGFibGUgdmVyc2lvbiBvZiBtb3VzZSBldmVudHMuXG4gICAqL1xuICBleHBsYWluRXZlbnRzKGV2ZW50czogQ29yZU1vdXNlRXZlbnRUeXBlKTogeyBbZXZlbnQ6IHN0cmluZ106IGJvb2xlYW4gfTtcbn1cblxuZXhwb3J0IGNvbnN0IElDb3JlU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJQ29yZVNlcnZpY2U+KCdDb3JlU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJQ29yZVNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSW5pdGlhbGx5IHRoZSBjdXJzb3Igd2lsbCBub3QgYmUgdmlzaWJsZSB1bnRpbCB0aGUgZmlyc3QgdGltZSB0aGUgdGVybWluYWxcbiAgICogaXMgZm9jdXNlZC5cbiAgICovXG4gIGlzQ3Vyc29ySW5pdGlhbGl6ZWQ6IGJvb2xlYW47XG4gIGlzQ3Vyc29ySGlkZGVuOiBib29sZWFuO1xuXG4gIHJlYWRvbmx5IG1vZGVzOiBJTW9kZXM7XG4gIHJlYWRvbmx5IGRlY1ByaXZhdGVNb2RlczogSURlY1ByaXZhdGVNb2RlcztcblxuICByZWFkb25seSBvbkRhdGE6IElFdmVudDxzdHJpbmc+O1xuICByZWFkb25seSBvblVzZXJJbnB1dDogSUV2ZW50PHZvaWQ+O1xuICByZWFkb25seSBvbkJpbmFyeTogSUV2ZW50PHN0cmluZz47XG4gIHJlYWRvbmx5IG9uUmVxdWVzdFNjcm9sbFRvQm90dG9tOiBJRXZlbnQ8dm9pZD47XG5cbiAgcmVzZXQoKTogdm9pZDtcblxuICAvKipcbiAgICogVHJpZ2dlcnMgdGhlIG9uRGF0YSBldmVudCBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdGhhdCBpcyBiZWluZyBlbWl0dGVkLlxuICAgKiBAcGFyYW0gd2FzVXNlcklucHV0IFdoZXRoZXIgdGhlIGRhdGEgb3JpZ2luYXRlZCBmcm9tIHRoZSB1c2VyIChhcyBvcHBvc2VkIHRvXG4gICAqIHJlc3VsdGluZyBmcm9tIHBhcnNpbmcgaW5jb21pbmcgZGF0YSkuIFdoZW4gdHJ1ZSB0aGlzIHdpbGwgYWxzbzpcbiAgICogLSBTY3JvbGwgdG8gdGhlIGJvdHRvbSBvZiB0aGUgYnVmZmVyIGlmIG9wdGlvbiBzY3JvbGxPblVzZXJJbnB1dCBpcyB0cnVlLlxuICAgKiAtIEZpcmUgdGhlIGBvblVzZXJJbnB1dGAgZXZlbnQgKHNvIHNlbGVjdGlvbiBjYW4gYmUgY2xlYXJlZCkuXG4gICAqL1xuICB0cmlnZ2VyRGF0YUV2ZW50KGRhdGE6IHN0cmluZywgd2FzVXNlcklucHV0PzogYm9vbGVhbik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIHRoZSBvbkJpbmFyeSBldmVudCBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdGhhdCBpcyBiZWluZyBlbWl0dGVkLlxuICAgKi9cbiAgdHJpZ2dlckJpbmFyeUV2ZW50KGRhdGE6IHN0cmluZyk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjb25zdCBJQ2hhcnNldFNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUNoYXJzZXRTZXJ2aWNlPignQ2hhcnNldFNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSUNoYXJzZXRTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgY2hhcnNldDogSUNoYXJzZXQgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGdsZXZlbDogbnVtYmVyO1xuXG4gIHJlc2V0KCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgRyBsZXZlbCBvZiB0aGUgdGVybWluYWwuXG4gICAqIEBwYXJhbSBnXG4gICAqL1xuICBzZXRnTGV2ZWwoZzogbnVtYmVyKTogdm9pZDtcblxuICAvKipcbiAgICogU2V0IHRoZSBjaGFyc2V0IGZvciB0aGUgZ2l2ZW4gRyBsZXZlbCBvZiB0aGUgdGVybWluYWwuXG4gICAqIEBwYXJhbSBnXG4gICAqIEBwYXJhbSBjaGFyc2V0XG4gICAqL1xuICBzZXRnQ2hhcnNldChnOiBudW1iZXIsIGNoYXJzZXQ6IElDaGFyc2V0IHwgdW5kZWZpbmVkKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VydmljZUlkZW50aWZpZXI8VD4ge1xuICAoLi4uYXJnczogYW55W10pOiB2b2lkO1xuICB0eXBlOiBUO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCcmFuZGVkU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xufVxuXG50eXBlIEdldExlYWRpbmdOb25TZXJ2aWNlQXJnczxUQXJncyBleHRlbmRzIGFueVtdPiA9IFRBcmdzIGV4dGVuZHMgW10gPyBbXVxuICA6IFRBcmdzIGV4dGVuZHMgWy4uLmluZmVyIFRGaXJzdCwgaW5mZXIgVExhc3RdID8gVExhc3QgZXh0ZW5kcyBJQnJhbmRlZFNlcnZpY2UgPyBHZXRMZWFkaW5nTm9uU2VydmljZUFyZ3M8VEZpcnN0PiA6IFRBcmdzXG4gICAgOiBuZXZlcjtcblxuZXhwb3J0IGNvbnN0IElJbnN0YW50aWF0aW9uU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJSW5zdGFudGlhdGlvblNlcnZpY2U+KCdJbnN0YW50aWF0aW9uU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJSW5zdGFudGlhdGlvblNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICBzZXRTZXJ2aWNlPFQ+KGlkOiBJU2VydmljZUlkZW50aWZpZXI8VD4sIGluc3RhbmNlOiBUKTogdm9pZDtcbiAgZ2V0U2VydmljZTxUPihpZDogSVNlcnZpY2VJZGVudGlmaWVyPFQ+KTogVCB8IHVuZGVmaW5lZDtcbiAgY3JlYXRlSW5zdGFuY2U8Q3RvciBleHRlbmRzIG5ldyAoLi4uYXJnczogYW55W10pID0+IGFueSwgUiBleHRlbmRzIEluc3RhbmNlVHlwZTxDdG9yPj4odDogQ3RvciwgLi4uYXJnczogR2V0TGVhZGluZ05vblNlcnZpY2VBcmdzPENvbnN0cnVjdG9yUGFyYW1ldGVyczxDdG9yPj4pOiBSO1xufVxuXG5leHBvcnQgZW51bSBMb2dMZXZlbEVudW0ge1xuICBUUkFDRSA9IDAsXG4gIERFQlVHID0gMSxcbiAgSU5GTyA9IDIsXG4gIFdBUk4gPSAzLFxuICBFUlJPUiA9IDQsXG4gIE9GRiA9IDVcbn1cblxuZXhwb3J0IGNvbnN0IElMb2dTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElMb2dTZXJ2aWNlPignTG9nU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJTG9nU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHJlYWRvbmx5IGxvZ0xldmVsOiBMb2dMZXZlbEVudW07XG5cbiAgdHJhY2UobWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xuICBkZWJ1ZyhtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG4gIGluZm8obWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xuICB3YXJuKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbiAgZXJyb3IobWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgSU9wdGlvbnNTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElPcHRpb25zU2VydmljZT4oJ09wdGlvbnNTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElPcHRpb25zU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBSZWFkIG9ubHkgYWNjZXNzIHRvIHRoZSByYXcgb3B0aW9ucyBvYmplY3QsIHRoaXMgaXMgYW4gaW50ZXJuYWwtb25seSBmYXN0IHBhdGggZm9yIGFjY2Vzc2luZ1xuICAgKiBzaW5nbGUgb3B0aW9ucyB3aXRob3V0IGFueSB2YWxpZGF0aW9uIGFzIHdlIHRydXN0IFR5cGVTY3JpcHQgdG8gZW5mb3JjZSBjb3JyZWN0IHVzYWdlXG4gICAqIGludGVybmFsbHkuXG4gICAqL1xuICByZWFkb25seSByYXdPcHRpb25zOiBSZXF1aXJlZDxJVGVybWluYWxPcHRpb25zPjtcblxuICAvKipcbiAgICogT3B0aW9ucyBhcyBleHBvc2VkIHRocm91Z2ggdGhlIHB1YmxpYyBBUEksIHRoaXMgcHJvcGVydHkgdXNlcyBnZXR0ZXJzIGFuZCBzZXR0ZXJzIHdpdGhcbiAgICogdmFsaWRhdGlvbiB3aGljaCBtYWtlcyBpdCBzYWZlciBidXQgc2xvd2VyLiB7QGxpbmsgcmF3T3B0aW9uc30gc2hvdWxkIGJlIHVzZWQgZm9yIHByZXR0eSBtdWNoXG4gICAqIGFsbCBpbnRlcm5hbCB1c2FnZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy5cbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbnM6IFJlcXVpcmVkPElUZXJtaW5hbE9wdGlvbnM+O1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIGZvciB3aGVuIGFueSBvcHRpb24gY2hhbmdlcy5cbiAgICovXG4gIHJlYWRvbmx5IG9uT3B0aW9uQ2hhbmdlOiBJRXZlbnQ8a2V5b2YgSVRlcm1pbmFsT3B0aW9ucz47XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIHdoZW4gYSBzcGVjaWZpYyBvcHRpb24gY2hhbmdlcywgdGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGlzXG4gICAqIHByZWZlcnJlZCBvdmVyIHtAbGluayBvbk9wdGlvbkNoYW5nZX0gd2hlbiBvbmx5IGEgc2luZ2xlIG9wdGlvbiBpcyBiZWluZyBsaXN0ZW5lZCB0by5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgb25TcGVjaWZpY09wdGlvbkNoYW5nZTxUIGV4dGVuZHMga2V5b2YgSVRlcm1pbmFsT3B0aW9ucz4oa2V5OiBULCBsaXN0ZW5lcjogKGFyZzE6IFJlcXVpcmVkPElUZXJtaW5hbE9wdGlvbnM+W1RdKSA9PiBhbnkpOiBJRGlzcG9zYWJsZTtcblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciBmb3Igd2hlbiBhIHNldCBvZiBzcGVjaWZpYyBvcHRpb25zIGNoYW5nZSwgdGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZFxuICAgKiB0aGF0IGlzIHByZWZlcnJlZCBvdmVyIHtAbGluayBvbk9wdGlvbkNoYW5nZX0gd2hlbiBtdWx0aXBsZSBvcHRpb25zIGFyZSBiZWluZyBsaXN0ZW5lZCB0byBhbmRcbiAgICogaGFuZGxlZCB0aGUgc2FtZSB3YXkuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gIG9uTXVsdGlwbGVPcHRpb25DaGFuZ2Uoa2V5czogKGtleW9mIElUZXJtaW5hbE9wdGlvbnMpW10sIGxpc3RlbmVyOiAoKSA9PiBhbnkpOiBJRGlzcG9zYWJsZTtcbn1cblxuZXhwb3J0IHR5cGUgRm9udFdlaWdodCA9ICdub3JtYWwnIHwgJ2JvbGQnIHwgJzEwMCcgfCAnMjAwJyB8ICczMDAnIHwgJzQwMCcgfCAnNTAwJyB8ICc2MDAnIHwgJzcwMCcgfCAnODAwJyB8ICc5MDAnIHwgbnVtYmVyO1xuZXhwb3J0IHR5cGUgTG9nTGV2ZWwgPSAndHJhY2UnIHwgJ2RlYnVnJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcicgfCAnb2ZmJztcblxuZXhwb3J0IGludGVyZmFjZSBJVGVybWluYWxPcHRpb25zIHtcbiAgYWxsb3dQcm9wb3NlZEFwaT86IGJvb2xlYW47XG4gIGFsbG93VHJhbnNwYXJlbmN5PzogYm9vbGVhbjtcbiAgYWx0Q2xpY2tNb3Zlc0N1cnNvcj86IGJvb2xlYW47XG4gIGNvbHM/OiBudW1iZXI7XG4gIGNvbnZlcnRFb2w/OiBib29sZWFuO1xuICBjdXJzb3JCbGluaz86IGJvb2xlYW47XG4gIGN1cnNvclN0eWxlPzogQ3Vyc29yU3R5bGU7XG4gIGN1cnNvcldpZHRoPzogbnVtYmVyO1xuICBjdXJzb3JJbmFjdGl2ZVN0eWxlPzogQ3Vyc29ySW5hY3RpdmVTdHlsZTtcbiAgY3VzdG9tR2x5cGhzPzogYm9vbGVhbjtcbiAgZGlzYWJsZVN0ZGluPzogYm9vbGVhbjtcbiAgZG9jdW1lbnRPdmVycmlkZT86IGFueSB8IG51bGw7XG4gIGRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzPzogYm9vbGVhbjtcbiAgZmFzdFNjcm9sbE1vZGlmaWVyPzogJ25vbmUnIHwgJ2FsdCcgfCAnY3RybCcgfCAnc2hpZnQnO1xuICBmYXN0U2Nyb2xsU2Vuc2l0aXZpdHk/OiBudW1iZXI7XG4gIGZvbnRTaXplPzogbnVtYmVyO1xuICBmb250RmFtaWx5Pzogc3RyaW5nO1xuICBmb250V2VpZ2h0PzogRm9udFdlaWdodDtcbiAgZm9udFdlaWdodEJvbGQ/OiBGb250V2VpZ2h0O1xuICBpZ25vcmVCcmFja2V0ZWRQYXN0ZU1vZGU/OiBib29sZWFuO1xuICBsZXR0ZXJTcGFjaW5nPzogbnVtYmVyO1xuICBsaW5lSGVpZ2h0PzogbnVtYmVyO1xuICBsaW5rSGFuZGxlcj86IElMaW5rSGFuZGxlciB8IG51bGw7XG4gIGxvZ0xldmVsPzogTG9nTGV2ZWw7XG4gIGxvZ2dlcj86IElMb2dnZXIgfCBudWxsO1xuICBtYWNPcHRpb25Jc01ldGE/OiBib29sZWFuO1xuICBtYWNPcHRpb25DbGlja0ZvcmNlc1NlbGVjdGlvbj86IGJvb2xlYW47XG4gIG1pbmltdW1Db250cmFzdFJhdGlvPzogbnVtYmVyO1xuICByZXNjYWxlT3ZlcmxhcHBpbmdHbHlwaHM/OiBib29sZWFuO1xuICByaWdodENsaWNrU2VsZWN0c1dvcmQ/OiBib29sZWFuO1xuICByb3dzPzogbnVtYmVyO1xuICBzY3JlZW5SZWFkZXJNb2RlPzogYm9vbGVhbjtcbiAgc2Nyb2xsYmFjaz86IG51bWJlcjtcbiAgc2Nyb2xsT25Vc2VySW5wdXQ/OiBib29sZWFuO1xuICBzY3JvbGxTZW5zaXRpdml0eT86IG51bWJlcjtcbiAgc21vb3RoU2Nyb2xsRHVyYXRpb24/OiBudW1iZXI7XG4gIHRhYlN0b3BXaWR0aD86IG51bWJlcjtcbiAgdGhlbWU/OiBJVGhlbWU7XG4gIHdpbmRvd3NNb2RlPzogYm9vbGVhbjtcbiAgd2luZG93c1B0eT86IElXaW5kb3dzUHR5O1xuICB3aW5kb3dPcHRpb25zPzogSVdpbmRvd09wdGlvbnM7XG4gIHdvcmRTZXBhcmF0b3I/OiBzdHJpbmc7XG4gIG92ZXJ2aWV3UnVsZXJXaWR0aD86IG51bWJlcjtcblxuICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIGNhbmNlbEV2ZW50czogYm9vbGVhbjtcbiAgdGVybU5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVGhlbWUge1xuICBmb3JlZ3JvdW5kPzogc3RyaW5nO1xuICBiYWNrZ3JvdW5kPzogc3RyaW5nO1xuICBjdXJzb3I/OiBzdHJpbmc7XG4gIGN1cnNvckFjY2VudD86IHN0cmluZztcbiAgc2VsZWN0aW9uRm9yZWdyb3VuZD86IHN0cmluZztcbiAgc2VsZWN0aW9uQmFja2dyb3VuZD86IHN0cmluZztcbiAgc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kPzogc3RyaW5nO1xuICBibGFjaz86IHN0cmluZztcbiAgcmVkPzogc3RyaW5nO1xuICBncmVlbj86IHN0cmluZztcbiAgeWVsbG93Pzogc3RyaW5nO1xuICBibHVlPzogc3RyaW5nO1xuICBtYWdlbnRhPzogc3RyaW5nO1xuICBjeWFuPzogc3RyaW5nO1xuICB3aGl0ZT86IHN0cmluZztcbiAgYnJpZ2h0QmxhY2s/OiBzdHJpbmc7XG4gIGJyaWdodFJlZD86IHN0cmluZztcbiAgYnJpZ2h0R3JlZW4/OiBzdHJpbmc7XG4gIGJyaWdodFllbGxvdz86IHN0cmluZztcbiAgYnJpZ2h0Qmx1ZT86IHN0cmluZztcbiAgYnJpZ2h0TWFnZW50YT86IHN0cmluZztcbiAgYnJpZ2h0Q3lhbj86IHN0cmluZztcbiAgYnJpZ2h0V2hpdGU/OiBzdHJpbmc7XG4gIGV4dGVuZGVkQW5zaT86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY29uc3QgSU9zY0xpbmtTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElPc2NMaW5rU2VydmljZT4oJ09zY0xpbmtTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElPc2NMaW5rU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgbGluayB0byB0aGUgc2VydmljZSwgcmV0dXJuaW5nIHRoZSBsaW5rIElELiBUaGUgbGluayBkYXRhIGlzIG1hbmFnZWQgYnkgdGhpc1xuICAgKiBzZXJ2aWNlIGFuZCB3aWxsIGJlIGZyZWVkIHdoZW4gdGhpcyBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiBpcyB0cmltbWVkIG9mZiB0aGUgYnVmZmVyLlxuICAgKi9cbiAgcmVnaXN0ZXJMaW5rKGxpbmtEYXRhOiBJT3NjTGlua0RhdGEpOiBudW1iZXI7XG4gIC8qKlxuICAgKiBBZGRzIGEgbGluZSB0byBhIGxpbmsgaWYgbmVlZGVkLlxuICAgKi9cbiAgYWRkTGluZVRvTGluayhsaW5rSWQ6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZDtcbiAgLyoqIEdldCB0aGUgbGluayBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIGxpbmsgSUQuICovXG4gIGdldExpbmtEYXRhKGxpbmtJZDogbnVtYmVyKTogSU9zY0xpbmtEYXRhIHwgdW5kZWZpbmVkO1xufVxuXG4vKlxuICogV2lkdGggYW5kIEdyYXBoZW1lX0NsdXN0ZXJfQnJlYWsgcHJvcGVydGllcyBvZiBhIGNoYXJhY3RlciBhcyBhIGJpdCBtYXNrLlxuICpcbiAqIGJpdCAwOiBzaG91bGRKb2luIC0gc2hvdWxkIGNvbWJpbmUgd2l0aCBwcmVjZWRpbmcgY2hhcmFjdGVyLlxuICogYml0IDEuLjI6IHdjd2lkdGggLSBzZWUgVW5pY29kZUNoYXJXaWR0aC5cbiAqIGJpdCAzLi4zMTogY2xhc3Mgb2YgY2hhcmFjdGVyIChjdXJyZW50bHkgb25seSA0IGJpdHMgYXJlIHVzZWQpLlxuICogICBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lZCBncmFwaGVtZSBjbHVzdGVyaW5nIC0gaS5lLiB3aGljaCBjb2RlcG9pbnRzXG4gKiAgIGFyZSB0byBiZSBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIGNvbXBvdW5kIGNoYXJhY3Rlci5cbiAqXG4gKiBVc2UgdGhlIFVuaWNvZGVTZXJ2aWNlIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eVZhbHVlIHRvIGNyZWF0ZSBhXG4gKiBVbmljb2RlQ2hhclByb3BlcnRpZXM7IHVzZSBleHRyYWN0U2hvdWxkSm9pbiwgZXh0cmFjdFdpZHRoLCBhbmRcbiAqIGV4dHJhY3RDaGFyS2luZCB0byBleHRyYWN0IHRoZSBjb21wb25lbnRzLlxuICovXG5leHBvcnQgdHlwZSBVbmljb2RlQ2hhclByb3BlcnRpZXMgPSBudW1iZXI7XG5cbi8qKlxuICogV2lkdGggaW4gY29sdW1ucyBvZiBhIGNoYXJhY3Rlci5cbiAqIEluIGEgQ0pLIGNvbnRleHQsIFwiaGFsZi13aWR0aFwiIGNoYXJhY3RlcnMgKHN1Y2ggYXMgTGF0aW4pIGFyZSB3aWR0aCAxLFxuICogd2hpbGUgXCJmdWxsLXdpZHRoXCIgY2hhcmFjdGVycyAoc3VjaCBhcyBLYW5qaSkgYXJlIDIgY29sdW1ucyB3aWRlLlxuICogQ29tYmluaW5nIGNoYXJhY3RlcnMgKHN1Y2ggYXMgYWNjZW50cykgYXJlIHdpZHRoIDAuXG4gKi9cbmV4cG9ydCB0eXBlIFVuaWNvZGVDaGFyV2lkdGggPSAwIHwgMSB8IDI7XG5cbmV4cG9ydCBjb25zdCBJVW5pY29kZVNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SVVuaWNvZGVTZXJ2aWNlPignVW5pY29kZVNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSVVuaWNvZGVTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG4gIC8qKiBSZWdpc3RlciBhbiBVbmljb2RlIHZlcnNpb24gcHJvdmlkZXIuICovXG4gIHJlZ2lzdGVyKHByb3ZpZGVyOiBJVW5pY29kZVZlcnNpb25Qcm92aWRlcik6IHZvaWQ7XG4gIC8qKiBSZWdpc3RlcmVkIFVuaWNvZGUgdmVyc2lvbnMuICovXG4gIHJlYWRvbmx5IHZlcnNpb25zOiBzdHJpbmdbXTtcbiAgLyoqIEN1cnJlbnRseSBhY3RpdmUgdmVyc2lvbi4gKi9cbiAgYWN0aXZlVmVyc2lvbjogc3RyaW5nO1xuICAvKiogRXZlbnQgdHJpZ2dlcmVkLCB3aGVuIGFjdGl2YXRlIHZlcnNpb24gY2hhbmdlZC4gKi9cbiAgcmVhZG9ubHkgb25DaGFuZ2U6IElFdmVudDxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBVbmljb2RlIHZlcnNpb24gZGVwZW5kZW50XG4gICAqL1xuICB3Y3dpZHRoKGNvZGVwb2ludDogbnVtYmVyKTogVW5pY29kZUNoYXJXaWR0aDtcbiAgZ2V0U3RyaW5nQ2VsbFdpZHRoKHM6IHN0cmluZyk6IG51bWJlcjtcbiAgLyoqXG4gICAqIFJldHVybiBjaGFyYWN0ZXIgd2lkdGggYW5kIHR5cGUgZm9yIGdyYXBoZW1lIGNsdXN0ZXJpbmcuXG4gICAqIElmIHByZWNlZGluZyAhPSAwLCBpdCBpcyB0aGUgcmV0dXJuIGNvZGUgZnJvbSB0aGUgcHJldmlvdXMgY2hhcmFjdGVyO1xuICAgKiBpbiB0aGF0IGNhc2UgdGhlIHJlc3VsdCBzcGVjaWZpZXMgaWYgdGhlIGNoYXJhY3RlcnMgc2hvdWxkIGJlIGpvaW5lZC5cbiAgICovXG4gIGNoYXJQcm9wZXJ0aWVzKGNvZGVwb2ludDogbnVtYmVyLCBwcmVjZWRpbmc6IFVuaWNvZGVDaGFyUHJvcGVydGllcyk6IFVuaWNvZGVDaGFyUHJvcGVydGllcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVW5pY29kZVZlcnNpb25Qcm92aWRlciB7XG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbiAgd2N3aWR0aCh1Y3M6IG51bWJlcik6IFVuaWNvZGVDaGFyV2lkdGg7XG4gIGNoYXJQcm9wZXJ0aWVzKGNvZGVwb2ludDogbnVtYmVyLCBwcmVjZWRpbmc6IFVuaWNvZGVDaGFyUHJvcGVydGllcyk6IFVuaWNvZGVDaGFyUHJvcGVydGllcztcbn1cblxuZXhwb3J0IGNvbnN0IElEZWNvcmF0aW9uU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJRGVjb3JhdGlvblNlcnZpY2U+KCdEZWNvcmF0aW9uU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJRGVjb3JhdGlvblNlcnZpY2UgZXh0ZW5kcyBJRGlzcG9zYWJsZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuICByZWFkb25seSBkZWNvcmF0aW9uczogSXRlcmFibGVJdGVyYXRvcjxJSW50ZXJuYWxEZWNvcmF0aW9uPjtcbiAgcmVhZG9ubHkgb25EZWNvcmF0aW9uUmVnaXN0ZXJlZDogSUV2ZW50PElJbnRlcm5hbERlY29yYXRpb24+O1xuICByZWFkb25seSBvbkRlY29yYXRpb25SZW1vdmVkOiBJRXZlbnQ8SUludGVybmFsRGVjb3JhdGlvbj47XG4gIHJlZ2lzdGVyRGVjb3JhdGlvbihkZWNvcmF0aW9uT3B0aW9uczogSURlY29yYXRpb25PcHRpb25zKTogSURlY29yYXRpb24gfCB1bmRlZmluZWQ7XG4gIHJlc2V0KCk6IHZvaWQ7XG4gIC8qKlxuICAgKiBUcmlnZ2VyIGEgY2FsbGJhY2sgb3ZlciB0aGUgZGVjb3JhdGlvbiBhdCBhIGNlbGwgKGluIG5vIHBhcnRpY3VsYXIgb3JkZXIpLiBUaGlzIHVzZXMgYSBjYWxsYmFja1xuICAgKiBpbnN0ZWFkIG9mIGFuIGl0ZXJhdG9yIGFzIGl0J3MgdHlwaWNhbGx5IHVzZWQgaW4gaG90IGNvZGUgcGF0aHMuXG4gICAqL1xuICBmb3JFYWNoRGVjb3JhdGlvbkF0Q2VsbCh4OiBudW1iZXIsIGxpbmU6IG51bWJlciwgbGF5ZXI6ICdib3R0b20nIHwgJ3RvcCcgfCB1bmRlZmluZWQsIGNhbGxiYWNrOiAoZGVjb3JhdGlvbjogSUludGVybmFsRGVjb3JhdGlvbikgPT4gdm9pZCk6IHZvaWQ7XG59XG5leHBvcnQgaW50ZXJmYWNlIElJbnRlcm5hbERlY29yYXRpb24gZXh0ZW5kcyBJRGVjb3JhdGlvbiB7XG4gIHJlYWRvbmx5IG9wdGlvbnM6IElEZWNvcmF0aW9uT3B0aW9ucztcbiAgcmVhZG9ubHkgYmFja2dyb3VuZENvbG9yUkdCOiBJQ29sb3IgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGZvcmVncm91bmRDb2xvclJHQjogSUNvbG9yIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBvblJlbmRlckVtaXR0ZXI6IElFdmVudEVtaXR0ZXI8SFRNTEVsZW1lbnQ+O1xufVxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKlxuICogKEVYUEVSSU1FTlRBTCkgVGhpcyBBZGRvbiBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudFxuICovXG5cbmltcG9ydCB0eXBlIHsgSUJ1ZmZlciwgSUJ1ZmZlckNlbGwsIElCdWZmZXJSYW5nZSwgSVRlcm1pbmFsQWRkb24sIFRlcm1pbmFsIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcbmltcG9ydCB0eXBlIHsgSUhUTUxTZXJpYWxpemVPcHRpb25zLCBTZXJpYWxpemVBZGRvbiBhcyBJU2VyaWFsaXplQXBpLCBJU2VyaWFsaXplT3B0aW9ucywgSVNlcmlhbGl6ZVJhbmdlIH0gZnJvbSAnQHh0ZXJtL2FkZG9uLXNlcmlhbGl6ZSc7XG5pbXBvcnQgeyBERUZBVUxUX0FOU0lfQ09MT1JTIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9UaGVtZVNlcnZpY2UnO1xuaW1wb3J0IHsgSUF0dHJpYnV0ZURhdGEsIElDb2xvciB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbmZ1bmN0aW9uIGNvbnN0cmFpbih2YWx1ZTogbnVtYmVyLCBsb3c6IG51bWJlciwgaGlnaDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGgubWF4KGxvdywgTWF0aC5taW4odmFsdWUsIGhpZ2gpKTtcbn1cblxuLy8gVE9ETzogUmVmaW5lIHRoaXMgdGVtcGxhdGUgY2xhc3MgbGF0ZXJcbmFic3RyYWN0IGNsYXNzIEJhc2VTZXJpYWxpemVIYW5kbGVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9idWZmZXI6IElCdWZmZXJcbiAgKSB7XG4gIH1cblxuICBwdWJsaWMgc2VyaWFsaXplKHJhbmdlOiBJQnVmZmVyUmFuZ2UsIGV4Y2x1ZGVGaW5hbEN1cnNvclBvc2l0aW9uPzogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgLy8gd2UgbmVlZCB0d28gb2YgdGhlbSB0byBmbGlwIGJldHdlZW4gb2xkIGFuZCBuZXcgY2VsbFxuICAgIGNvbnN0IGNlbGwxID0gdGhpcy5fYnVmZmVyLmdldE51bGxDZWxsKCk7XG4gICAgY29uc3QgY2VsbDIgPSB0aGlzLl9idWZmZXIuZ2V0TnVsbENlbGwoKTtcbiAgICBsZXQgb2xkQ2VsbCA9IGNlbGwxO1xuXG4gICAgY29uc3Qgc3RhcnRSb3cgPSByYW5nZS5zdGFydC55O1xuICAgIGNvbnN0IGVuZFJvdyA9IHJhbmdlLmVuZC55O1xuICAgIGNvbnN0IHN0YXJ0Q29sdW1uID0gcmFuZ2Uuc3RhcnQueDtcbiAgICBjb25zdCBlbmRDb2x1bW4gPSByYW5nZS5lbmQueDtcblxuICAgIHRoaXMuX2JlZm9yZVNlcmlhbGl6ZShlbmRSb3cgLSBzdGFydFJvdywgc3RhcnRSb3csIGVuZFJvdyk7XG5cbiAgICBmb3IgKGxldCByb3cgPSBzdGFydFJvdzsgcm93IDw9IGVuZFJvdzsgcm93KyspIHtcbiAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLl9idWZmZXIuZ2V0TGluZShyb3cpO1xuICAgICAgaWYgKGxpbmUpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRMaW5lQ29sdW1uID0gcm93ID09PSByYW5nZS5zdGFydC55ID8gc3RhcnRDb2x1bW4gOiAwO1xuICAgICAgICBjb25zdCBlbmRMaW5lQ29sdW1uID0gcm93ID09PSByYW5nZS5lbmQueSA/IGVuZENvbHVtbjogbGluZS5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGNvbCA9IHN0YXJ0TGluZUNvbHVtbjsgY29sIDwgZW5kTGluZUNvbHVtbjsgY29sKyspIHtcbiAgICAgICAgICBjb25zdCBjID0gbGluZS5nZXRDZWxsKGNvbCwgb2xkQ2VsbCA9PT0gY2VsbDEgPyBjZWxsMiA6IGNlbGwxKTtcbiAgICAgICAgICBpZiAoIWMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgQ2FuJ3QgZ2V0IGNlbGwgYXQgcm93PSR7cm93fSwgY29sPSR7Y29sfWApO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX25leHRDZWxsKGMsIG9sZENlbGwsIHJvdywgY29sKTtcbiAgICAgICAgICBvbGRDZWxsID0gYztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5fcm93RW5kKHJvdywgcm93ID09PSBlbmRSb3cpO1xuICAgIH1cblxuICAgIHRoaXMuX2FmdGVyU2VyaWFsaXplKCk7XG5cbiAgICByZXR1cm4gdGhpcy5fc2VyaWFsaXplU3RyaW5nKGV4Y2x1ZGVGaW5hbEN1cnNvclBvc2l0aW9uKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfbmV4dENlbGwoY2VsbDogSUJ1ZmZlckNlbGwsIG9sZENlbGw6IElCdWZmZXJDZWxsLCByb3c6IG51bWJlciwgY29sOiBudW1iZXIpOiB2b2lkIHsgfVxuICBwcm90ZWN0ZWQgX3Jvd0VuZChyb3c6IG51bWJlciwgaXNMYXN0Um93OiBib29sZWFuKTogdm9pZCB7IH1cbiAgcHJvdGVjdGVkIF9iZWZvcmVTZXJpYWxpemUocm93czogbnVtYmVyLCBzdGFydFJvdzogbnVtYmVyLCBlbmRSb3c6IG51bWJlcik6IHZvaWQgeyB9XG4gIHByb3RlY3RlZCBfYWZ0ZXJTZXJpYWxpemUoKTogdm9pZCB7IH1cbiAgcHJvdGVjdGVkIF9zZXJpYWxpemVTdHJpbmcoZXhjbHVkZUZpbmFsQ3Vyc29yUG9zaXRpb24/OiBib29sZWFuKTogc3RyaW5nIHsgcmV0dXJuICcnOyB9XG59XG5cbmZ1bmN0aW9uIGVxdWFsRmcoY2VsbDE6IElCdWZmZXJDZWxsIHwgSUF0dHJpYnV0ZURhdGEsIGNlbGwyOiBJQnVmZmVyQ2VsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2VsbDEuZ2V0RmdDb2xvck1vZGUoKSA9PT0gY2VsbDIuZ2V0RmdDb2xvck1vZGUoKVxuICAgICYmIGNlbGwxLmdldEZnQ29sb3IoKSA9PT0gY2VsbDIuZ2V0RmdDb2xvcigpO1xufVxuXG5mdW5jdGlvbiBlcXVhbEJnKGNlbGwxOiBJQnVmZmVyQ2VsbCB8IElBdHRyaWJ1dGVEYXRhLCBjZWxsMjogSUJ1ZmZlckNlbGwpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNlbGwxLmdldEJnQ29sb3JNb2RlKCkgPT09IGNlbGwyLmdldEJnQ29sb3JNb2RlKClcbiAgICAmJiBjZWxsMS5nZXRCZ0NvbG9yKCkgPT09IGNlbGwyLmdldEJnQ29sb3IoKTtcbn1cblxuZnVuY3Rpb24gZXF1YWxGbGFncyhjZWxsMTogSUJ1ZmZlckNlbGwgfCBJQXR0cmlidXRlRGF0YSwgY2VsbDI6IElCdWZmZXJDZWxsKTogYm9vbGVhbiB7XG4gIHJldHVybiBjZWxsMS5pc0ludmVyc2UoKSA9PT0gY2VsbDIuaXNJbnZlcnNlKClcbiAgICAmJiBjZWxsMS5pc0JvbGQoKSA9PT0gY2VsbDIuaXNCb2xkKClcbiAgICAmJiBjZWxsMS5pc1VuZGVybGluZSgpID09PSBjZWxsMi5pc1VuZGVybGluZSgpXG4gICAgJiYgY2VsbDEuaXNPdmVybGluZSgpID09PSBjZWxsMi5pc092ZXJsaW5lKClcbiAgICAmJiBjZWxsMS5pc0JsaW5rKCkgPT09IGNlbGwyLmlzQmxpbmsoKVxuICAgICYmIGNlbGwxLmlzSW52aXNpYmxlKCkgPT09IGNlbGwyLmlzSW52aXNpYmxlKClcbiAgICAmJiBjZWxsMS5pc0l0YWxpYygpID09PSBjZWxsMi5pc0l0YWxpYygpXG4gICAgJiYgY2VsbDEuaXNEaW0oKSA9PT0gY2VsbDIuaXNEaW0oKVxuICAgICYmIGNlbGwxLmlzU3RyaWtldGhyb3VnaCgpID09PSBjZWxsMi5pc1N0cmlrZXRocm91Z2goKTtcbn1cblxuY2xhc3MgU3RyaW5nU2VyaWFsaXplSGFuZGxlciBleHRlbmRzIEJhc2VTZXJpYWxpemVIYW5kbGVyIHtcbiAgcHJpdmF0ZSBfcm93SW5kZXg6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2FsbFJvd3M6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBfYWxsUm93U2VwYXJhdG9yczogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICBwcml2YXRlIF9jdXJyZW50Um93OiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfbnVsbENlbGxDb3VudDogbnVtYmVyID0gMDtcblxuICAvLyB3ZSBjYW4gc2VlIGEgZnVsbCBjb2xvcmVkIGNlbGwgYW5kIGEgbnVsbCBjZWxsIHRoYXQgb25seSBoYXZlIGJhY2tncm91bmQgdGhlIHNhbWUgc3R5bGVcbiAgLy8gYnV0IHRoZSBpbmZvcm1hdGlvbiBpc24ndCBwcmVzZXJ2ZWQgYnkgbnVsbCBjZWxsIGl0c2VsZlxuICAvLyBzbyB3ZWUgbmVlZCB0byByZWNvcmQgaXQgd2hlbiByZXF1aXJlZC5cbiAgcHJpdmF0ZSBfY3Vyc29yU3R5bGU6IElCdWZmZXJDZWxsID0gdGhpcy5fYnVmZmVyLmdldE51bGxDZWxsKCk7XG5cbiAgLy8gd2hlcmUgZXhhY3QgdGhlIGN1cnNvciBzdHlsZXMgY29tZXMgZnJvbVxuICAvLyBiZWNhdXNlIHdlIGNhbid0IGNvcHkgdGhlIGNlbGwgZGlyZWN0bHlcbiAgLy8gc28gd2UgcmVtZW1iZXIgd2hlcmUgdGhlIGNvbnRlbnQgY29tZXMgZnJvbSBpbnN0ZWFkXG4gIHByaXZhdGUgX2N1cnNvclN0eWxlUm93OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9jdXJzb3JTdHlsZUNvbDogbnVtYmVyID0gMDtcblxuICAvLyB0aGlzIGlzIGEgbnVsbCBjZWxsIGZvciByZWZlcmVuY2UgZm9yIGNoZWNraW5nIHdoZXRoZXIgYmFja2dyb3VuZCBpcyBlbXB0eSBvciBub3RcbiAgcHJpdmF0ZSBfYmFja2dyb3VuZENlbGw6IElCdWZmZXJDZWxsID0gdGhpcy5fYnVmZmVyLmdldE51bGxDZWxsKCk7XG5cbiAgcHJpdmF0ZSBfZmlyc3RSb3c6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2xhc3RDdXJzb3JSb3c6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2xhc3RDdXJzb3JDb2w6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2xhc3RDb250ZW50Q3Vyc29yUm93OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9sYXN0Q29udGVudEN1cnNvckNvbDogbnVtYmVyID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBidWZmZXI6IElCdWZmZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGVybWluYWw6IFRlcm1pbmFsXG4gICkge1xuICAgIHN1cGVyKGJ1ZmZlcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2JlZm9yZVNlcmlhbGl6ZShyb3dzOiBudW1iZXIsIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fYWxsUm93cyA9IG5ldyBBcnJheTxzdHJpbmc+KHJvd3MpO1xuICAgIHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yUm93ID0gc3RhcnQ7XG4gICAgdGhpcy5fbGFzdEN1cnNvclJvdyA9IHN0YXJ0O1xuICAgIHRoaXMuX2ZpcnN0Um93ID0gc3RhcnQ7XG4gIH1cblxuICBwcml2YXRlIF90aGlzUm93TGFzdENoYXI6IElCdWZmZXJDZWxsID0gdGhpcy5fYnVmZmVyLmdldE51bGxDZWxsKCk7XG4gIHByaXZhdGUgX3RoaXNSb3dMYXN0U2Vjb25kQ2hhcjogSUJ1ZmZlckNlbGwgPSB0aGlzLl9idWZmZXIuZ2V0TnVsbENlbGwoKTtcbiAgcHJpdmF0ZSBfbmV4dFJvd0ZpcnN0Q2hhcjogSUJ1ZmZlckNlbGwgPSB0aGlzLl9idWZmZXIuZ2V0TnVsbENlbGwoKTtcbiAgcHJvdGVjdGVkIF9yb3dFbmQocm93OiBudW1iZXIsIGlzTGFzdFJvdzogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIGlmIHRoZXJlIGlzIGNvbG9yZnVsIGVtcHR5IGNlbGwgYXQgbGluZSBlbmQsIHdoZSBtdXN0IHBhZCBpdCBiYWNrLCBvciB0aGUgdGhlIGNvbG9yIGJsb2NrXG4gICAgLy8gd2lsbCBtaXNzaW5nXG4gICAgaWYgKHRoaXMuX251bGxDZWxsQ291bnQgPiAwICYmICFlcXVhbEJnKHRoaXMuX2N1cnNvclN0eWxlLCB0aGlzLl9iYWNrZ3JvdW5kQ2VsbCkpIHtcbiAgICAgIC8vIHVzZSBjbGVhciByaWdodCB0byBzZXQgYmFja2dyb3VuZC5cbiAgICAgIHRoaXMuX2N1cnJlbnRSb3cgKz0gYFxcdTAwMWJbJHt0aGlzLl9udWxsQ2VsbENvdW50fVhgO1xuICAgIH1cblxuICAgIGxldCByb3dTZXBhcmF0b3IgPSAnJztcblxuICAgIC8vIGhhbmRsZSByb3cgc2VwYXJhdG9yXG4gICAgaWYgKCFpc0xhc3RSb3cpIHtcbiAgICAgIC8vIEVuYWJsZSBCQ0VcbiAgICAgIGlmIChyb3cgLSB0aGlzLl9maXJzdFJvdyA+PSB0aGlzLl90ZXJtaW5hbC5yb3dzKSB7XG4gICAgICAgIHRoaXMuX2J1ZmZlci5nZXRMaW5lKHRoaXMuX2N1cnNvclN0eWxlUm93KT8uZ2V0Q2VsbCh0aGlzLl9jdXJzb3JTdHlsZUNvbCwgdGhpcy5fYmFja2dyb3VuZENlbGwpO1xuICAgICAgfVxuXG4gICAgICAvLyBGZXRjaCBjdXJyZW50IGxpbmVcbiAgICAgIGNvbnN0IGN1cnJlbnRMaW5lID0gdGhpcy5fYnVmZmVyLmdldExpbmUocm93KSE7XG4gICAgICAvLyBGZXRjaCBuZXh0IGxpbmVcbiAgICAgIGNvbnN0IG5leHRMaW5lID0gdGhpcy5fYnVmZmVyLmdldExpbmUocm93ICsgMSkhO1xuXG4gICAgICBpZiAoIW5leHRMaW5lLmlzV3JhcHBlZCkge1xuICAgICAgICAvLyBqdXN0IGluc2VydCB0aGUgbGluZSBicmVha1xuICAgICAgICByb3dTZXBhcmF0b3IgPSAnXFxyXFxuJztcbiAgICAgICAgLy8gd2Ugc2VuZGVkIHRoZSBlbnRlclxuICAgICAgICB0aGlzLl9sYXN0Q3Vyc29yUm93ID0gcm93ICsgMTtcbiAgICAgICAgdGhpcy5fbGFzdEN1cnNvckNvbCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByb3dTZXBhcmF0b3IgPSAnJztcbiAgICAgICAgY29uc3QgdGhpc1Jvd0xhc3RDaGFyID0gY3VycmVudExpbmUuZ2V0Q2VsbChjdXJyZW50TGluZS5sZW5ndGggLSAxLCB0aGlzLl90aGlzUm93TGFzdENoYXIpITtcbiAgICAgICAgY29uc3QgdGhpc1Jvd0xhc3RTZWNvbmRDaGFyID0gY3VycmVudExpbmUuZ2V0Q2VsbChjdXJyZW50TGluZS5sZW5ndGggLSAyLCB0aGlzLl90aGlzUm93TGFzdFNlY29uZENoYXIpITtcbiAgICAgICAgY29uc3QgbmV4dFJvd0ZpcnN0Q2hhciA9IG5leHRMaW5lLmdldENlbGwoMCwgdGhpcy5fbmV4dFJvd0ZpcnN0Q2hhcikhO1xuICAgICAgICBjb25zdCBpc05leHRSb3dGaXJzdENoYXJEb3VibGVXaWR0aCA9IG5leHRSb3dGaXJzdENoYXIuZ2V0V2lkdGgoKSA+IDE7XG5cbiAgICAgICAgLy8gdmFsaWRhdGUgd2hldGhlciB0aGlzIGxpbmUgd3JhcCBpcyBldmVyIHBvc3NpYmxlXG4gICAgICAgIC8vIHdoaWNoIG1lYW4gd2hldGhlciBjdXJzb3IgY2FuIHBsYWNlZCBhdCBhIG92ZXJmbG93IHBvc2l0aW9uICh4ID09PSByb3cpIG5hdHVyYWxseVxuICAgICAgICBsZXQgaXNWYWxpZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAvLyB5b3UgbXVzdCBvdXRwdXQgY2hhcmFjdGVyIHRvIGNhdXNlIG92ZXJmbG93LCBjb250cm9sIHNlcXVlbmNlIGNhbid0IGRvIHRoaXNcbiAgICAgICAgICBuZXh0Um93Rmlyc3RDaGFyLmdldENoYXJzKCkgJiZcbiAgICAgICAgICAgIGlzTmV4dFJvd0ZpcnN0Q2hhckRvdWJsZVdpZHRoID8gdGhpcy5fbnVsbENlbGxDb3VudCA8PSAxIDogdGhpcy5fbnVsbENlbGxDb3VudCA8PSAwXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIC8vIHRoZSBsYXN0IGNoYXJhY3RlciBjYW4ndCBiZSBudWxsLFxuICAgICAgICAgICAgLy8geW91IGNhbid0IHVzZSBjb250cm9sIHNlcXVlbmNlIHRvIG1vdmUgY3Vyc29yIHRvICh4ID09PSByb3cpXG4gICAgICAgICAgICAodGhpc1Jvd0xhc3RDaGFyLmdldENoYXJzKCkgfHwgdGhpc1Jvd0xhc3RDaGFyLmdldFdpZHRoKCkgPT09IDApICYmXG4gICAgICAgICAgICAvLyBjaGFuZ2UgYmFja2dyb3VuZCBvZiB0aGUgZmlyc3Qgd3JhcHBlZCBjZWxsIGFsc28gYWZmZWN0cyBCQ0VcbiAgICAgICAgICAgIC8vIHNvIHdlIG1hcmsgaXQgYXMgaW52YWxpZCB0byBzaW1wbHkgdGhlIHByb2Nlc3MgdG8gZGV0ZXJtaW5lIGxpbmUgc2VwYXJhdG9yXG4gICAgICAgICAgICBlcXVhbEJnKHRoaXNSb3dMYXN0Q2hhciwgbmV4dFJvd0ZpcnN0Q2hhcilcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGlzVmFsaWQgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIC8vIHRoZSBzZWNvbmQgdG8gbGFzdCBjaGFyYWN0ZXIgY2FuJ3QgYmUgbnVsbCBpZiB0aGUgbmV4dCBsaW5lIHN0YXJ0cyB3aXRoIENKSyxcbiAgICAgICAgICAgIC8vIHlvdSBjYW4ndCB1c2UgY29udHJvbCBzZXF1ZW5jZSB0byBtb3ZlIGN1cnNvciB0byAoeCA9PT0gcm93KVxuICAgICAgICAgICAgaXNOZXh0Um93Rmlyc3RDaGFyRG91YmxlV2lkdGggJiZcbiAgICAgICAgICAgICh0aGlzUm93TGFzdFNlY29uZENoYXIuZ2V0Q2hhcnMoKSB8fCB0aGlzUm93TGFzdFNlY29uZENoYXIuZ2V0V2lkdGgoKSA9PT0gMCkgJiZcbiAgICAgICAgICAgIC8vIGNoYW5nZSBiYWNrZ3JvdW5kIG9mIHRoZSBmaXJzdCB3cmFwcGVkIGNlbGwgYWxzbyBhZmZlY3RzIEJDRVxuICAgICAgICAgICAgLy8gc28gd2UgbWFyayBpdCBhcyBpbnZhbGlkIHRvIHNpbXBseSB0aGUgcHJvY2VzcyB0byBkZXRlcm1pbmUgbGluZSBzZXBhcmF0b3JcbiAgICAgICAgICAgIGVxdWFsQmcodGhpc1Jvd0xhc3RDaGFyLCBuZXh0Um93Rmlyc3RDaGFyKSAmJlxuICAgICAgICAgICAgZXF1YWxCZyh0aGlzUm93TGFzdFNlY29uZENoYXIsIG5leHRSb3dGaXJzdENoYXIpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgICAvLyBmb3JjZSB0aGUgd3JhcCB3aXRoIG1hZ2ljXG4gICAgICAgICAgLy8gaW5zZXJ0IGVub3VnaCBjaGFyYWN0ZXIgdG8gZm9yY2UgdGhlIHdyYXBcbiAgICAgICAgICByb3dTZXBhcmF0b3IgPSAnLScucmVwZWF0KHRoaXMuX251bGxDZWxsQ291bnQgKyAxKTtcbiAgICAgICAgICAvLyBtb3ZlIGJhY2sgYW5kIGVyYXNlIG5leHQgbGluZSBoZWFkXG4gICAgICAgICAgcm93U2VwYXJhdG9yICs9ICdcXHUwMDFiWzFEXFx1MDAxYlsxWCc7XG5cbiAgICAgICAgICBpZiAodGhpcy5fbnVsbENlbGxDb3VudCA+IDApIHtcbiAgICAgICAgICAgIC8vIGRvIHRoZXNlIGJlY2F1c2Ugd2UgZmlsbGVkIHRoZSBsYXN0IHNldmVyYWwgbnVsbCBzbG90LCB3aGljaCB3ZSBzaG91bGRuJ3RcbiAgICAgICAgICAgIHJvd1NlcGFyYXRvciArPSAnXFx1MDAxYltBJztcbiAgICAgICAgICAgIHJvd1NlcGFyYXRvciArPSBgXFx1MDAxYlske2N1cnJlbnRMaW5lLmxlbmd0aCAtIHRoaXMuX251bGxDZWxsQ291bnR9Q2A7XG4gICAgICAgICAgICByb3dTZXBhcmF0b3IgKz0gYFxcdTAwMWJbJHt0aGlzLl9udWxsQ2VsbENvdW50fVhgO1xuICAgICAgICAgICAgcm93U2VwYXJhdG9yICs9IGBcXHUwMDFiWyR7Y3VycmVudExpbmUubGVuZ3RoIC0gdGhpcy5fbnVsbENlbGxDb3VudH1EYDtcbiAgICAgICAgICAgIHJvd1NlcGFyYXRvciArPSAnXFx1MDAxYltCJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUaGlzIGlzIGNvbnRlbnQgYW5kIG5lZWQgdGhlIGJlIHNlcmlhbGl6ZWQgZXZlbiBpdCBpcyBpbnZpc2libGUuXG4gICAgICAgICAgLy8gd2l0aG91dCB0aGlzLCB3cmFwIHdpbGwgYmUgbWlzc2luZyBmcm9tIG91dHB1dHMuXG4gICAgICAgICAgdGhpcy5fbGFzdENvbnRlbnRDdXJzb3JSb3cgPSByb3cgKyAxO1xuICAgICAgICAgIHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yQ29sID0gMDtcblxuICAgICAgICAgIC8vIGZvcmNlIGNvbW1pdCB0aGUgY3Vyc29yIHBvc2l0aW9uXG4gICAgICAgICAgdGhpcy5fbGFzdEN1cnNvclJvdyA9IHJvdyArIDE7XG4gICAgICAgICAgdGhpcy5fbGFzdEN1cnNvckNvbCA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9hbGxSb3dzW3RoaXMuX3Jvd0luZGV4XSA9IHRoaXMuX2N1cnJlbnRSb3c7XG4gICAgdGhpcy5fYWxsUm93U2VwYXJhdG9yc1t0aGlzLl9yb3dJbmRleCsrXSA9IHJvd1NlcGFyYXRvcjtcbiAgICB0aGlzLl9jdXJyZW50Um93ID0gJyc7XG4gICAgdGhpcy5fbnVsbENlbGxDb3VudCA9IDA7XG4gIH1cblxuICBwcml2YXRlIF9kaWZmU3R5bGUoY2VsbDogSUJ1ZmZlckNlbGwgfCBJQXR0cmlidXRlRGF0YSwgb2xkQ2VsbDogSUJ1ZmZlckNlbGwpOiBudW1iZXJbXSB7XG4gICAgY29uc3Qgc2dyU2VxOiBudW1iZXJbXSA9IFtdO1xuICAgIGNvbnN0IGZnQ2hhbmdlZCA9ICFlcXVhbEZnKGNlbGwsIG9sZENlbGwpO1xuICAgIGNvbnN0IGJnQ2hhbmdlZCA9ICFlcXVhbEJnKGNlbGwsIG9sZENlbGwpO1xuICAgIGNvbnN0IGZsYWdzQ2hhbmdlZCA9ICFlcXVhbEZsYWdzKGNlbGwsIG9sZENlbGwpO1xuXG4gICAgaWYgKGZnQ2hhbmdlZCB8fCBiZ0NoYW5nZWQgfHwgZmxhZ3NDaGFuZ2VkKSB7XG4gICAgICBpZiAoY2VsbC5pc0F0dHJpYnV0ZURlZmF1bHQoKSkge1xuICAgICAgICBpZiAoIW9sZENlbGwuaXNBdHRyaWJ1dGVEZWZhdWx0KCkpIHtcbiAgICAgICAgICBzZ3JTZXEucHVzaCgwKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZnQ2hhbmdlZCkge1xuICAgICAgICAgIGNvbnN0IGNvbG9yID0gY2VsbC5nZXRGZ0NvbG9yKCk7XG4gICAgICAgICAgaWYgKGNlbGwuaXNGZ1JHQigpKSB7IHNnclNlcS5wdXNoKDM4LCAyLCAoY29sb3IgPj4+IDE2KSAmIDB4RkYsIChjb2xvciA+Pj4gOCkgJiAweEZGLCBjb2xvciAmIDB4RkYpOyB9XG4gICAgICAgICAgZWxzZSBpZiAoY2VsbC5pc0ZnUGFsZXR0ZSgpKSB7XG4gICAgICAgICAgICBpZiAoY29sb3IgPj0gMTYpIHsgc2dyU2VxLnB1c2goMzgsIDUsIGNvbG9yKTsgfVxuICAgICAgICAgICAgZWxzZSB7IHNnclNlcS5wdXNoKGNvbG9yICYgOCA/IDkwICsgKGNvbG9yICYgNykgOiAzMCArIChjb2xvciAmIDcpKTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHsgc2dyU2VxLnB1c2goMzkpOyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJnQ2hhbmdlZCkge1xuICAgICAgICAgIGNvbnN0IGNvbG9yID0gY2VsbC5nZXRCZ0NvbG9yKCk7XG4gICAgICAgICAgaWYgKGNlbGwuaXNCZ1JHQigpKSB7IHNnclNlcS5wdXNoKDQ4LCAyLCAoY29sb3IgPj4+IDE2KSAmIDB4RkYsIChjb2xvciA+Pj4gOCkgJiAweEZGLCBjb2xvciAmIDB4RkYpOyB9XG4gICAgICAgICAgZWxzZSBpZiAoY2VsbC5pc0JnUGFsZXR0ZSgpKSB7XG4gICAgICAgICAgICBpZiAoY29sb3IgPj0gMTYpIHsgc2dyU2VxLnB1c2goNDgsIDUsIGNvbG9yKTsgfVxuICAgICAgICAgICAgZWxzZSB7IHNnclNlcS5wdXNoKGNvbG9yICYgOCA/IDEwMCArIChjb2xvciAmIDcpIDogNDAgKyAoY29sb3IgJiA3KSk7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7IHNnclNlcS5wdXNoKDQ5KTsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmbGFnc0NoYW5nZWQpIHtcbiAgICAgICAgICBpZiAoY2VsbC5pc0ludmVyc2UoKSAhPT0gb2xkQ2VsbC5pc0ludmVyc2UoKSkgeyBzZ3JTZXEucHVzaChjZWxsLmlzSW52ZXJzZSgpID8gNyA6IDI3KTsgfVxuICAgICAgICAgIGlmIChjZWxsLmlzQm9sZCgpICE9PSBvbGRDZWxsLmlzQm9sZCgpKSB7IHNnclNlcS5wdXNoKGNlbGwuaXNCb2xkKCkgPyAxIDogMjIpOyB9XG4gICAgICAgICAgaWYgKGNlbGwuaXNVbmRlcmxpbmUoKSAhPT0gb2xkQ2VsbC5pc1VuZGVybGluZSgpKSB7IHNnclNlcS5wdXNoKGNlbGwuaXNVbmRlcmxpbmUoKSA/IDQgOiAyNCk7IH1cbiAgICAgICAgICBpZiAoY2VsbC5pc092ZXJsaW5lKCkgIT09IG9sZENlbGwuaXNPdmVybGluZSgpKSB7IHNnclNlcS5wdXNoKGNlbGwuaXNPdmVybGluZSgpID8gNTMgOiA1NSk7IH1cbiAgICAgICAgICBpZiAoY2VsbC5pc0JsaW5rKCkgIT09IG9sZENlbGwuaXNCbGluaygpKSB7IHNnclNlcS5wdXNoKGNlbGwuaXNCbGluaygpID8gNSA6IDI1KTsgfVxuICAgICAgICAgIGlmIChjZWxsLmlzSW52aXNpYmxlKCkgIT09IG9sZENlbGwuaXNJbnZpc2libGUoKSkgeyBzZ3JTZXEucHVzaChjZWxsLmlzSW52aXNpYmxlKCkgPyA4IDogMjgpOyB9XG4gICAgICAgICAgaWYgKGNlbGwuaXNJdGFsaWMoKSAhPT0gb2xkQ2VsbC5pc0l0YWxpYygpKSB7IHNnclNlcS5wdXNoKGNlbGwuaXNJdGFsaWMoKSA/IDMgOiAyMyk7IH1cbiAgICAgICAgICBpZiAoY2VsbC5pc0RpbSgpICE9PSBvbGRDZWxsLmlzRGltKCkpIHsgc2dyU2VxLnB1c2goY2VsbC5pc0RpbSgpID8gMiA6IDIyKTsgfVxuICAgICAgICAgIGlmIChjZWxsLmlzU3RyaWtldGhyb3VnaCgpICE9PSBvbGRDZWxsLmlzU3RyaWtldGhyb3VnaCgpKSB7IHNnclNlcS5wdXNoKGNlbGwuaXNTdHJpa2V0aHJvdWdoKCkgPyA5IDogMjkpOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2dyU2VxO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9uZXh0Q2VsbChjZWxsOiBJQnVmZmVyQ2VsbCwgb2xkQ2VsbDogSUJ1ZmZlckNlbGwsIHJvdzogbnVtYmVyLCBjb2w6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIGEgd2lkdGggMCBjZWxsIGRvbid0IG5lZWQgdG8gYmUgY291bnQgYmVjYXVzZSBpdCBpcyBqdXN0IGEgcGxhY2Vob2xkZXIgYWZ0ZXIgYSBDSksgY2hhcmFjdGVyO1xuICAgIGNvbnN0IGlzUGxhY2VIb2xkZXJDZWxsID0gY2VsbC5nZXRXaWR0aCgpID09PSAwO1xuXG4gICAgaWYgKGlzUGxhY2VIb2xkZXJDZWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gdGhpcyBjZWxsIGRvbid0IGhhdmUgY29udGVudFxuICAgIGNvbnN0IGlzRW1wdHlDZWxsID0gY2VsbC5nZXRDaGFycygpID09PSAnJztcblxuICAgIGNvbnN0IHNnclNlcSA9IHRoaXMuX2RpZmZTdHlsZShjZWxsLCB0aGlzLl9jdXJzb3JTdHlsZSk7XG5cbiAgICAvLyB0aGUgZW1wdHkgY2VsbCBzdHlsZSBpcyBvbmx5IGFzc3VtZWQgdG8gYmUgY2hhbmdlZCB3aGVuIGJhY2tncm91bmQgY2hhbmdlZCwgYmVjYXVzZVxuICAgIC8vIGZvcmVncm91bmQgaXMgYWx3YXlzIDAuXG4gICAgY29uc3Qgc3R5bGVDaGFuZ2VkID0gaXNFbXB0eUNlbGwgPyAhZXF1YWxCZyh0aGlzLl9jdXJzb3JTdHlsZSwgY2VsbCkgOiBzZ3JTZXEubGVuZ3RoID4gMDtcblxuICAgIC8qKlxuICAgICAqICBoYW5kbGVzIHN0eWxlIGNoYW5nZVxuICAgICAqL1xuICAgIGlmIChzdHlsZUNoYW5nZWQpIHtcbiAgICAgIC8vIGJlZm9yZSB1cGRhdGUgdGhlIHN0eWxlLCB3ZSBuZWVkIHRvIGZpbGwgZW1wdHkgY2VsbCBiYWNrXG4gICAgICBpZiAodGhpcy5fbnVsbENlbGxDb3VudCA+IDApIHtcbiAgICAgICAgLy8gdXNlIGNsZWFyIHJpZ2h0IHRvIHNldCBiYWNrZ3JvdW5kLlxuICAgICAgICBpZiAoIWVxdWFsQmcodGhpcy5fY3Vyc29yU3R5bGUsIHRoaXMuX2JhY2tncm91bmRDZWxsKSkge1xuICAgICAgICAgIHRoaXMuX2N1cnJlbnRSb3cgKz0gYFxcdTAwMWJbJHt0aGlzLl9udWxsQ2VsbENvdW50fVhgO1xuICAgICAgICB9XG4gICAgICAgIC8vIHVzZSBtb3ZlIHJpZ2h0IHRvIG1vdmUgY3Vyc29yLlxuICAgICAgICB0aGlzLl9jdXJyZW50Um93ICs9IGBcXHUwMDFiWyR7dGhpcy5fbnVsbENlbGxDb3VudH1DYDtcbiAgICAgICAgdGhpcy5fbnVsbENlbGxDb3VudCA9IDA7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yUm93ID0gdGhpcy5fbGFzdEN1cnNvclJvdyA9IHJvdztcbiAgICAgIHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yQ29sID0gdGhpcy5fbGFzdEN1cnNvckNvbCA9IGNvbDtcblxuICAgICAgdGhpcy5fY3VycmVudFJvdyArPSBgXFx1MDAxYlske3NnclNlcS5qb2luKCc7Jyl9bWA7XG5cbiAgICAgIC8vIHVwZGF0ZSB0aGUgbGFzdCBjdXJzb3Igc3R5bGVcbiAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLl9idWZmZXIuZ2V0TGluZShyb3cpO1xuICAgICAgaWYgKGxpbmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsaW5lLmdldENlbGwoY29sLCB0aGlzLl9jdXJzb3JTdHlsZSk7XG4gICAgICAgIHRoaXMuX2N1cnNvclN0eWxlUm93ID0gcm93O1xuICAgICAgICB0aGlzLl9jdXJzb3JTdHlsZUNvbCA9IGNvbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgaGFuZGxlcyBhY3R1YWwgY29udGVudFxuICAgICAqL1xuICAgIGlmIChpc0VtcHR5Q2VsbCkge1xuICAgICAgdGhpcy5fbnVsbENlbGxDb3VudCArPSBjZWxsLmdldFdpZHRoKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLl9udWxsQ2VsbENvdW50ID4gMCkge1xuICAgICAgICAvLyB3ZSBjYW4ganVzdCBhc3N1bWUgd2UgaGF2ZSBzYW1lIHN0eWxlIHdpdGggcHJldmlvdXMgb25lIGhlcmVcbiAgICAgICAgLy8gYmVjYXVzZSBzdHlsZSBjaGFuZ2UgaXMgaGFuZGxlZCBieSBwcmV2aW91cyBzdGFnZVxuICAgICAgICAvLyB1c2UgbW92ZSByaWdodCB3aGVuIGJhY2tncm91bmQgaXMgZW1wdHksIHVzZSBjbGVhciByaWdodCB3aGVuIHRoZXJlIGlzIGJhY2tncm91bmQuXG4gICAgICAgIGlmIChlcXVhbEJnKHRoaXMuX2N1cnNvclN0eWxlLCB0aGlzLl9iYWNrZ3JvdW5kQ2VsbCkpIHtcbiAgICAgICAgICB0aGlzLl9jdXJyZW50Um93ICs9IGBcXHUwMDFiWyR7dGhpcy5fbnVsbENlbGxDb3VudH1DYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9jdXJyZW50Um93ICs9IGBcXHUwMDFiWyR7dGhpcy5fbnVsbENlbGxDb3VudH1YYDtcbiAgICAgICAgICB0aGlzLl9jdXJyZW50Um93ICs9IGBcXHUwMDFiWyR7dGhpcy5fbnVsbENlbGxDb3VudH1DYDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9udWxsQ2VsbENvdW50ID0gMDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY3VycmVudFJvdyArPSBjZWxsLmdldENoYXJzKCk7XG5cbiAgICAgIC8vIHVwZGF0ZSBjdXJzb3JcbiAgICAgIHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yUm93ID0gdGhpcy5fbGFzdEN1cnNvclJvdyA9IHJvdztcbiAgICAgIHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yQ29sID0gdGhpcy5fbGFzdEN1cnNvckNvbCA9IGNvbCArIGNlbGwuZ2V0V2lkdGgoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX3NlcmlhbGl6ZVN0cmluZyhleGNsdWRlRmluYWxDdXJzb3JQb3NpdGlvbjogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgbGV0IHJvd0VuZCA9IHRoaXMuX2FsbFJvd3MubGVuZ3RoO1xuXG4gICAgLy8gdGhlIGZpeHVwIGlzIG9ubHkgcmVxdWlyZWQgZm9yIGRhdGEgd2l0aG91dCBzY3JvbGxiYWNrXG4gICAgLy8gYmVjYXVzZSBpdCB3aWxsIGFsd2F5cyBiZSBwbGFjZWQgYXQgbGFzdCBsaW5lIG90aGVyd2lzZVxuICAgIGlmICh0aGlzLl9idWZmZXIubGVuZ3RoIC0gdGhpcy5fZmlyc3RSb3cgPD0gdGhpcy5fdGVybWluYWwucm93cykge1xuICAgICAgcm93RW5kID0gdGhpcy5fbGFzdENvbnRlbnRDdXJzb3JSb3cgKyAxIC0gdGhpcy5fZmlyc3RSb3c7XG4gICAgICB0aGlzLl9sYXN0Q3Vyc29yQ29sID0gdGhpcy5fbGFzdENvbnRlbnRDdXJzb3JDb2w7XG4gICAgICB0aGlzLl9sYXN0Q3Vyc29yUm93ID0gdGhpcy5fbGFzdENvbnRlbnRDdXJzb3JSb3c7XG4gICAgfVxuXG4gICAgbGV0IGNvbnRlbnQgPSAnJztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93RW5kOyBpKyspIHtcbiAgICAgIGNvbnRlbnQgKz0gdGhpcy5fYWxsUm93c1tpXTtcbiAgICAgIGlmIChpICsgMSA8IHJvd0VuZCkge1xuICAgICAgICBjb250ZW50ICs9IHRoaXMuX2FsbFJvd1NlcGFyYXRvcnNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gcmVzdG9yZSB0aGUgY3Vyc29yXG4gICAgaWYgKCFleGNsdWRlRmluYWxDdXJzb3JQb3NpdGlvbikge1xuICAgICAgY29uc3QgcmVhbEN1cnNvclJvdyA9IHRoaXMuX2J1ZmZlci5iYXNlWSArIHRoaXMuX2J1ZmZlci5jdXJzb3JZO1xuICAgICAgY29uc3QgcmVhbEN1cnNvckNvbCA9IHRoaXMuX2J1ZmZlci5jdXJzb3JYO1xuXG4gICAgICBjb25zdCBjdXJzb3JNb3ZlZCA9IChyZWFsQ3Vyc29yUm93ICE9PSB0aGlzLl9sYXN0Q3Vyc29yUm93IHx8IHJlYWxDdXJzb3JDb2wgIT09IHRoaXMuX2xhc3RDdXJzb3JDb2wpO1xuXG4gICAgICBjb25zdCBtb3ZlUmlnaHQgPSAob2Zmc2V0OiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKG9mZnNldCA+IDApIHtcbiAgICAgICAgICBjb250ZW50ICs9IGBcXHUwMDFiWyR7b2Zmc2V0fUNgO1xuICAgICAgICB9IGVsc2UgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgICAgICBjb250ZW50ICs9IGBcXHUwMDFiWyR7LW9mZnNldH1EYDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IG1vdmVEb3duID0gKG9mZnNldDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChvZmZzZXQgPiAwKSB7XG4gICAgICAgICAgY29udGVudCArPSBgXFx1MDAxYlske29mZnNldH1CYDtcbiAgICAgICAgfSBlbHNlIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAgICAgY29udGVudCArPSBgXFx1MDAxYlskey1vZmZzZXR9QWA7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChjdXJzb3JNb3ZlZCkge1xuICAgICAgICBtb3ZlRG93bihyZWFsQ3Vyc29yUm93IC0gdGhpcy5fbGFzdEN1cnNvclJvdyk7XG4gICAgICAgIG1vdmVSaWdodChyZWFsQ3Vyc29yQ29sIC0gdGhpcy5fbGFzdEN1cnNvckNvbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSB0aGUgY3Vyc29yJ3MgY3VycmVudCBzdHlsZSwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS94dGVybWpzL3h0ZXJtLmpzL2lzc3Vlcy8zNjc3XG4gICAgLy8gSEFDSzogSW50ZXJuYWwgQVBJIGFjY2VzcyBzaW5jZSBpdCdzIGF3a3dhcmQgdG8gZXhwb3NlIHRoaXMgaW4gdGhlIEFQSSBhbmQgc2VyaWFsaXplIHdpbGxcbiAgICAvLyBsaWtlbHkgYmUgdGhlIG9ubHkgY29uc3VtZXJcbiAgICBjb25zdCBjdXJBdHRyRGF0YTogSUF0dHJpYnV0ZURhdGEgPSAodGhpcy5fdGVybWluYWwgYXMgYW55KS5fY29yZS5faW5wdXRIYW5kbGVyLl9jdXJBdHRyRGF0YTtcbiAgICBjb25zdCBzZ3JTZXEgPSB0aGlzLl9kaWZmU3R5bGUoY3VyQXR0ckRhdGEsIHRoaXMuX2N1cnNvclN0eWxlKTtcbiAgICBpZiAoc2dyU2VxLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnRlbnQgKz0gYFxcdTAwMWJbJHtzZ3JTZXEuam9pbignOycpfW1gO1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemVBZGRvbiBpbXBsZW1lbnRzIElUZXJtaW5hbEFkZG9uICwgSVNlcmlhbGl6ZUFwaSB7XG4gIHByaXZhdGUgX3Rlcm1pbmFsOiBUZXJtaW5hbCB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgYWN0aXZhdGUodGVybWluYWw6IFRlcm1pbmFsKTogdm9pZCB7XG4gICAgdGhpcy5fdGVybWluYWwgPSB0ZXJtaW5hbDtcbiAgfVxuXG4gIHByaXZhdGUgX3NlcmlhbGl6ZUJ1ZmZlckJ5U2Nyb2xsYmFjayh0ZXJtaW5hbDogVGVybWluYWwsIGJ1ZmZlcjogSUJ1ZmZlciwgc2Nyb2xsYmFjaz86IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgbWF4Um93cyA9IGJ1ZmZlci5sZW5ndGg7XG4gICAgY29uc3QgY29ycmVjdFJvd3MgPSAoc2Nyb2xsYmFjayA9PT0gdW5kZWZpbmVkKSA/IG1heFJvd3MgOiBjb25zdHJhaW4oc2Nyb2xsYmFjayArIHRlcm1pbmFsLnJvd3MsIDAsIG1heFJvd3MpO1xuICAgIHJldHVybiB0aGlzLl9zZXJpYWxpemVCdWZmZXJCeVJhbmdlKHRlcm1pbmFsLCBidWZmZXIsIHtcbiAgICAgIHN0YXJ0OiBtYXhSb3dzIC0gY29ycmVjdFJvd3MsXG4gICAgICBlbmQ6IG1heFJvd3MgLSAxXG4gICAgfSwgZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VyaWFsaXplQnVmZmVyQnlSYW5nZSh0ZXJtaW5hbDogVGVybWluYWwsIGJ1ZmZlcjogSUJ1ZmZlciwgcmFuZ2U6IElTZXJpYWxpemVSYW5nZSwgZXhjbHVkZUZpbmFsQ3Vyc29yUG9zaXRpb246IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgU3RyaW5nU2VyaWFsaXplSGFuZGxlcihidWZmZXIsIHRlcm1pbmFsKTtcbiAgICByZXR1cm4gaGFuZGxlci5zZXJpYWxpemUoe1xuICAgICAgc3RhcnQ6IHsgeDogMCwgICAgICAgICAgICAgeTogdHlwZW9mIHJhbmdlLnN0YXJ0ID09PSAnbnVtYmVyJyA/IHJhbmdlLnN0YXJ0IDogcmFuZ2Uuc3RhcnQubGluZSB9LFxuICAgICAgZW5kOiAgIHsgeDogdGVybWluYWwuY29scywgeTogdHlwZW9mIHJhbmdlLmVuZCAgID09PSAnbnVtYmVyJyA/IHJhbmdlLmVuZCAgIDogcmFuZ2UuZW5kLmxpbmUgICB9XG4gICAgfSwgZXhjbHVkZUZpbmFsQ3Vyc29yUG9zaXRpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VyaWFsaXplQnVmZmVyQXNIVE1MKHRlcm1pbmFsOiBUZXJtaW5hbCwgb3B0aW9uczogUGFydGlhbDxJSFRNTFNlcmlhbGl6ZU9wdGlvbnM+KTogc3RyaW5nIHtcbiAgICBjb25zdCBidWZmZXIgPSB0ZXJtaW5hbC5idWZmZXIuYWN0aXZlO1xuICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgSFRNTFNlcmlhbGl6ZUhhbmRsZXIoYnVmZmVyLCB0ZXJtaW5hbCwgb3B0aW9ucyk7XG4gICAgY29uc3Qgb25seVNlbGVjdGlvbiA9IG9wdGlvbnMub25seVNlbGVjdGlvbiA/PyBmYWxzZTtcbiAgICBpZiAoIW9ubHlTZWxlY3Rpb24pIHtcbiAgICAgIGNvbnN0IG1heFJvd3MgPSBidWZmZXIubGVuZ3RoO1xuICAgICAgY29uc3Qgc2Nyb2xsYmFjayA9IG9wdGlvbnMuc2Nyb2xsYmFjaztcbiAgICAgIGNvbnN0IGNvcnJlY3RSb3dzID0gKHNjcm9sbGJhY2sgPT09IHVuZGVmaW5lZCkgPyBtYXhSb3dzIDogY29uc3RyYWluKHNjcm9sbGJhY2sgKyB0ZXJtaW5hbC5yb3dzLCAwLCBtYXhSb3dzKTtcbiAgICAgIHJldHVybiBoYW5kbGVyLnNlcmlhbGl6ZSh7XG4gICAgICAgIHN0YXJ0OiB7IHg6IDAsICAgICAgICAgICAgIHk6IG1heFJvd3MgLSBjb3JyZWN0Um93cyB9LFxuICAgICAgICBlbmQ6ICAgeyB4OiB0ZXJtaW5hbC5jb2xzLCB5OiBtYXhSb3dzIC0gMSAgICAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5fdGVybWluYWw/LmdldFNlbGVjdGlvblBvc2l0aW9uKCk7XG4gICAgaWYgKHNlbGVjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gaGFuZGxlci5zZXJpYWxpemUoe1xuICAgICAgICBzdGFydDogeyB4OiBzZWxlY3Rpb24uc3RhcnQueCwgeTogc2VsZWN0aW9uLnN0YXJ0LnkgfSxcbiAgICAgICAgZW5kOiAgIHsgeDogc2VsZWN0aW9uLmVuZC54LCAgIHk6IHNlbGVjdGlvbi5lbmQueSAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHByaXZhdGUgX3NlcmlhbGl6ZU1vZGVzKHRlcm1pbmFsOiBUZXJtaW5hbCk6IHN0cmluZyB7XG4gICAgbGV0IGNvbnRlbnQgPSAnJztcbiAgICBjb25zdCBtb2RlcyA9IHRlcm1pbmFsLm1vZGVzO1xuXG4gICAgLy8gRGVmYXVsdDogZmFsc2VcbiAgICBpZiAobW9kZXMuYXBwbGljYXRpb25DdXJzb3JLZXlzTW9kZSkgY29udGVudCArPSAnXFx4MWJbPzFoJztcbiAgICBpZiAobW9kZXMuYXBwbGljYXRpb25LZXlwYWRNb2RlKSBjb250ZW50ICs9ICdcXHgxYls/NjZoJztcbiAgICBpZiAobW9kZXMuYnJhY2tldGVkUGFzdGVNb2RlKSBjb250ZW50ICs9ICdcXHgxYls/MjAwNGgnO1xuICAgIGlmIChtb2Rlcy5pbnNlcnRNb2RlKSBjb250ZW50ICs9ICdcXHgxYls0aCc7XG4gICAgaWYgKG1vZGVzLm9yaWdpbk1vZGUpIGNvbnRlbnQgKz0gJ1xceDFiWz82aCc7XG4gICAgaWYgKG1vZGVzLnJldmVyc2VXcmFwYXJvdW5kTW9kZSkgY29udGVudCArPSAnXFx4MWJbPzQ1aCc7XG4gICAgaWYgKG1vZGVzLnNlbmRGb2N1c01vZGUpIGNvbnRlbnQgKz0gJ1xceDFiWz8xMDA0aCc7XG5cbiAgICAvLyBEZWZhdWx0OiB0cnVlXG4gICAgaWYgKG1vZGVzLndyYXBhcm91bmRNb2RlID09PSBmYWxzZSkgY29udGVudCArPSAnXFx4MWJbPzdsJztcblxuICAgIC8vIERlZmF1bHQ6ICdub25lJ1xuICAgIGlmIChtb2Rlcy5tb3VzZVRyYWNraW5nTW9kZSAhPT0gJ25vbmUnKSB7XG4gICAgICBzd2l0Y2ggKG1vZGVzLm1vdXNlVHJhY2tpbmdNb2RlKSB7XG4gICAgICAgIGNhc2UgJ3gxMCc6IGNvbnRlbnQgKz0gJ1xceDFiWz85aCc7IGJyZWFrO1xuICAgICAgICBjYXNlICd2dDIwMCc6IGNvbnRlbnQgKz0gJ1xceDFiWz8xMDAwaCc7IGJyZWFrO1xuICAgICAgICBjYXNlICdkcmFnJzogY29udGVudCArPSAnXFx4MWJbPzEwMDJoJzsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2FueSc6IGNvbnRlbnQgKz0gJ1xceDFiWz8xMDAzaCc7IGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgcHVibGljIHNlcmlhbGl6ZShvcHRpb25zPzogSVNlcmlhbGl6ZU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIC8vIFRPRE86IEFkZCBjb21iaW5lZERhdGEgc3VwcG9ydFxuICAgIGlmICghdGhpcy5fdGVybWluYWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHVzZSBhZGRvbiB1bnRpbCBpdCBoYXMgYmVlbiBsb2FkZWQnKTtcbiAgICB9XG5cbiAgICAvLyBOb3JtYWwgYnVmZmVyXG4gICAgbGV0IGNvbnRlbnQgPSBvcHRpb25zPy5yYW5nZVxuICAgICAgPyB0aGlzLl9zZXJpYWxpemVCdWZmZXJCeVJhbmdlKHRoaXMuX3Rlcm1pbmFsLCB0aGlzLl90ZXJtaW5hbC5idWZmZXIubm9ybWFsLCBvcHRpb25zLnJhbmdlLCB0cnVlKVxuICAgICAgOiB0aGlzLl9zZXJpYWxpemVCdWZmZXJCeVNjcm9sbGJhY2sodGhpcy5fdGVybWluYWwsIHRoaXMuX3Rlcm1pbmFsLmJ1ZmZlci5ub3JtYWwsIG9wdGlvbnM/LnNjcm9sbGJhY2spO1xuXG4gICAgLy8gQWx0ZXJuYXRlIGJ1ZmZlclxuICAgIGlmICghb3B0aW9ucz8uZXhjbHVkZUFsdEJ1ZmZlcikge1xuICAgICAgaWYgKHRoaXMuX3Rlcm1pbmFsLmJ1ZmZlci5hY3RpdmUudHlwZSA9PT0gJ2FsdGVybmF0ZScpIHtcbiAgICAgICAgY29uc3QgYWx0ZXJuYXRpdmVTY3JlZW5Db250ZW50ID0gdGhpcy5fc2VyaWFsaXplQnVmZmVyQnlTY3JvbGxiYWNrKHRoaXMuX3Rlcm1pbmFsLCB0aGlzLl90ZXJtaW5hbC5idWZmZXIuYWx0ZXJuYXRlLCB1bmRlZmluZWQpO1xuICAgICAgICBjb250ZW50ICs9IGBcXHUwMDFiWz8xMDQ5aFxcdTAwMWJbSCR7YWx0ZXJuYXRpdmVTY3JlZW5Db250ZW50fWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTW9kZXNcbiAgICBpZiAoIW9wdGlvbnM/LmV4Y2x1ZGVNb2Rlcykge1xuICAgICAgY29udGVudCArPSB0aGlzLl9zZXJpYWxpemVNb2Rlcyh0aGlzLl90ZXJtaW5hbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2VyaWFsaXplQXNIVE1MKG9wdGlvbnM/OiBQYXJ0aWFsPElIVE1MU2VyaWFsaXplT3B0aW9ucz4pOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5fdGVybWluYWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHVzZSBhZGRvbiB1bnRpbCBpdCBoYXMgYmVlbiBsb2FkZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fc2VyaWFsaXplQnVmZmVyQXNIVE1MKHRoaXMuX3Rlcm1pbmFsLCBvcHRpb25zIHx8IHt9KTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQgeyB9XG59XG5cbmV4cG9ydCBjbGFzcyBIVE1MU2VyaWFsaXplSGFuZGxlciBleHRlbmRzIEJhc2VTZXJpYWxpemVIYW5kbGVyIHtcbiAgcHJpdmF0ZSBfY3VycmVudFJvdzogc3RyaW5nID0gJyc7XG5cbiAgcHJpdmF0ZSBfaHRtbENvbnRlbnQgPSAnJztcblxuICBwcml2YXRlIF9hbnNpQ29sb3JzOiBSZWFkb25seTxJQ29sb3JbXT47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYnVmZmVyOiBJQnVmZmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3Rlcm1pbmFsOiBUZXJtaW5hbCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zOiBQYXJ0aWFsPElIVE1MU2VyaWFsaXplT3B0aW9ucz5cbiAgKSB7XG4gICAgc3VwZXIoYnVmZmVyKTtcblxuICAgIC8vIEZvciB4dGVybSBoZWFkbGVzczogZmFsbGJhY2sgdG8gYW5zaSBjb2xvcnNcbiAgICBpZiAoKF90ZXJtaW5hbCBhcyBhbnkpLl9jb3JlLl90aGVtZVNlcnZpY2UpIHtcbiAgICAgIHRoaXMuX2Fuc2lDb2xvcnMgPSAoX3Rlcm1pbmFsIGFzIGFueSkuX2NvcmUuX3RoZW1lU2VydmljZS5jb2xvcnMuYW5zaTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLl9hbnNpQ29sb3JzID0gREVGQVVMVF9BTlNJX0NPTE9SUztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wYWRTdGFydCh0YXJnZXQ6IHN0cmluZywgdGFyZ2V0TGVuZ3RoOiBudW1iZXIsIHBhZFN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB0YXJnZXRMZW5ndGggPSB0YXJnZXRMZW5ndGggPj4gMDtcbiAgICBwYWRTdHJpbmcgPSBwYWRTdHJpbmcgPz8gJyAnO1xuICAgIGlmICh0YXJnZXQubGVuZ3RoID4gdGFyZ2V0TGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIHRhcmdldExlbmd0aCAtPSB0YXJnZXQubGVuZ3RoO1xuICAgIGlmICh0YXJnZXRMZW5ndGggPiBwYWRTdHJpbmcubGVuZ3RoKSB7XG4gICAgICBwYWRTdHJpbmcgKz0gcGFkU3RyaW5nLnJlcGVhdCh0YXJnZXRMZW5ndGggLyBwYWRTdHJpbmcubGVuZ3RoKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhZFN0cmluZy5zbGljZSgwLCB0YXJnZXRMZW5ndGgpICsgdGFyZ2V0O1xuICB9XG5cbiAgcHJvdGVjdGVkIF9iZWZvcmVTZXJpYWxpemUocm93czogbnVtYmVyLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2h0bWxDb250ZW50ICs9ICc8aHRtbD48Ym9keT48IS0tU3RhcnRGcmFnbWVudC0tPjxwcmU+JztcblxuICAgIGxldCBmb3JlZ3JvdW5kID0gJyMwMDAwMDAnO1xuICAgIGxldCBiYWNrZ3JvdW5kID0gJyNmZmZmZmYnO1xuICAgIGlmICh0aGlzLl9vcHRpb25zLmluY2x1ZGVHbG9iYWxCYWNrZ3JvdW5kID8/IGZhbHNlKSB7XG4gICAgICBmb3JlZ3JvdW5kID0gdGhpcy5fdGVybWluYWwub3B0aW9ucy50aGVtZT8uZm9yZWdyb3VuZCA/PyAnI2ZmZmZmZic7XG4gICAgICBiYWNrZ3JvdW5kID0gdGhpcy5fdGVybWluYWwub3B0aW9ucy50aGVtZT8uYmFja2dyb3VuZCA/PyAnIzAwMDAwMCc7XG4gICAgfVxuXG4gICAgY29uc3QgZ2xvYmFsU3R5bGVEZWZpbml0aW9ucyA9IFtdO1xuICAgIGdsb2JhbFN0eWxlRGVmaW5pdGlvbnMucHVzaCgnY29sb3I6ICcgKyBmb3JlZ3JvdW5kICsgJzsnKTtcbiAgICBnbG9iYWxTdHlsZURlZmluaXRpb25zLnB1c2goJ2JhY2tncm91bmQtY29sb3I6ICcgKyBiYWNrZ3JvdW5kICsgJzsnKTtcbiAgICBnbG9iYWxTdHlsZURlZmluaXRpb25zLnB1c2goJ2ZvbnQtZmFtaWx5OiAnICsgdGhpcy5fdGVybWluYWwub3B0aW9ucy5mb250RmFtaWx5ICsgJzsnKTtcbiAgICBnbG9iYWxTdHlsZURlZmluaXRpb25zLnB1c2goJ2ZvbnQtc2l6ZTogJyArIHRoaXMuX3Rlcm1pbmFsLm9wdGlvbnMuZm9udFNpemUgKyAncHg7Jyk7XG4gICAgdGhpcy5faHRtbENvbnRlbnQgKz0gJzxkaXYgc3R5bGU9XFwnJyArIGdsb2JhbFN0eWxlRGVmaW5pdGlvbnMuam9pbignICcpICsgJ1xcJz4nO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9hZnRlclNlcmlhbGl6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9odG1sQ29udGVudCArPSAnPC9kaXY+JztcbiAgICB0aGlzLl9odG1sQ29udGVudCArPSAnPC9wcmU+PCEtLUVuZEZyYWdtZW50LS0+PC9ib2R5PjwvaHRtbD4nO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9yb3dFbmQocm93OiBudW1iZXIsIGlzTGFzdFJvdzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2h0bWxDb250ZW50ICs9ICc8ZGl2PjxzcGFuPicgKyB0aGlzLl9jdXJyZW50Um93ICsgJzwvc3Bhbj48L2Rpdj4nO1xuICAgIHRoaXMuX2N1cnJlbnRSb3cgPSAnJztcbiAgfVxuXG4gIHByaXZhdGUgX2dldEhleENvbG9yKGNlbGw6IElCdWZmZXJDZWxsLCBpc0ZnOiBib29sZWFuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb2xvciA9IGlzRmcgPyBjZWxsLmdldEZnQ29sb3IoKSA6IGNlbGwuZ2V0QmdDb2xvcigpO1xuICAgIGlmIChpc0ZnID8gY2VsbC5pc0ZnUkdCKCkgOiBjZWxsLmlzQmdSR0IoKSkge1xuICAgICAgY29uc3QgcmdiID0gW1xuICAgICAgICAoY29sb3IgPj4gMTYpICYgMjU1LFxuICAgICAgICAoY29sb3IgPj4gIDgpICYgMjU1LFxuICAgICAgICAoY29sb3IgICAgICApICYgMjU1XG4gICAgICBdO1xuICAgICAgcmV0dXJuICcjJyArIHJnYi5tYXAoeCA9PiB0aGlzLl9wYWRTdGFydCh4LnRvU3RyaW5nKDE2KSwgMiwgJzAnKSkuam9pbignJyk7XG4gICAgfVxuICAgIGlmIChpc0ZnID8gY2VsbC5pc0ZnUGFsZXR0ZSgpIDogY2VsbC5pc0JnUGFsZXR0ZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYW5zaUNvbG9yc1tjb2xvcl0uY3NzO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGlmZlN0eWxlKGNlbGw6IElCdWZmZXJDZWxsLCBvbGRDZWxsOiBJQnVmZmVyQ2VsbCk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb250ZW50OiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgY29uc3QgZmdDaGFuZ2VkID0gIWVxdWFsRmcoY2VsbCwgb2xkQ2VsbCk7XG4gICAgY29uc3QgYmdDaGFuZ2VkID0gIWVxdWFsQmcoY2VsbCwgb2xkQ2VsbCk7XG4gICAgY29uc3QgZmxhZ3NDaGFuZ2VkID0gIWVxdWFsRmxhZ3MoY2VsbCwgb2xkQ2VsbCk7XG5cbiAgICBpZiAoZmdDaGFuZ2VkIHx8IGJnQ2hhbmdlZCB8fCBmbGFnc0NoYW5nZWQpIHtcbiAgICAgIGNvbnN0IGZnSGV4Q29sb3IgPSB0aGlzLl9nZXRIZXhDb2xvcihjZWxsLCB0cnVlKTtcbiAgICAgIGlmIChmZ0hleENvbG9yKSB7XG4gICAgICAgIGNvbnRlbnQucHVzaCgnY29sb3I6ICcgKyBmZ0hleENvbG9yICsgJzsnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmdIZXhDb2xvciA9IHRoaXMuX2dldEhleENvbG9yKGNlbGwsIGZhbHNlKTtcbiAgICAgIGlmIChiZ0hleENvbG9yKSB7XG4gICAgICAgIGNvbnRlbnQucHVzaCgnYmFja2dyb3VuZC1jb2xvcjogJyArIGJnSGV4Q29sb3IgKyAnOycpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2VsbC5pc0ludmVyc2UoKSkgeyBjb250ZW50LnB1c2goJ2NvbG9yOiAjMDAwMDAwOyBiYWNrZ3JvdW5kLWNvbG9yOiAjQkZCRkJGOycpOyB9XG4gICAgICBpZiAoY2VsbC5pc0JvbGQoKSkgeyBjb250ZW50LnB1c2goJ2ZvbnQtd2VpZ2h0OiBib2xkOycpOyB9XG4gICAgICBpZiAoY2VsbC5pc1VuZGVybGluZSgpICYmIGNlbGwuaXNPdmVybGluZSgpKSB7IGNvbnRlbnQucHVzaCgndGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZSB1bmRlcmxpbmU7Jyk7IH1cbiAgICAgIGVsc2UgaWYgKGNlbGwuaXNVbmRlcmxpbmUoKSkgeyBjb250ZW50LnB1c2goJ3RleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOycpOyB9XG4gICAgICBlbHNlIGlmIChjZWxsLmlzT3ZlcmxpbmUoKSkgeyBjb250ZW50LnB1c2goJ3RleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmU7Jyk7IH1cbiAgICAgIGlmIChjZWxsLmlzQmxpbmsoKSkgeyBjb250ZW50LnB1c2goJ3RleHQtZGVjb3JhdGlvbjogYmxpbms7Jyk7IH1cbiAgICAgIGlmIChjZWxsLmlzSW52aXNpYmxlKCkpIHsgY29udGVudC5wdXNoKCd2aXNpYmlsaXR5OiBoaWRkZW47Jyk7IH1cbiAgICAgIGlmIChjZWxsLmlzSXRhbGljKCkpIHsgY29udGVudC5wdXNoKCdmb250LXN0eWxlOiBpdGFsaWM7Jyk7IH1cbiAgICAgIGlmIChjZWxsLmlzRGltKCkpIHsgY29udGVudC5wdXNoKCdvcGFjaXR5OiAwLjU7Jyk7IH1cbiAgICAgIGlmIChjZWxsLmlzU3RyaWtldGhyb3VnaCgpKSB7IGNvbnRlbnQucHVzaCgndGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7Jyk7IH1cblxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBfbmV4dENlbGwoY2VsbDogSUJ1ZmZlckNlbGwsIG9sZENlbGw6IElCdWZmZXJDZWxsLCByb3c6IG51bWJlciwgY29sOiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBhIHdpZHRoIDAgY2VsbCBkb24ndCBuZWVkIHRvIGJlIGNvdW50IGJlY2F1c2UgaXQgaXMganVzdCBhIHBsYWNlaG9sZGVyIGFmdGVyIGEgQ0pLIGNoYXJhY3RlcjtcbiAgICBjb25zdCBpc1BsYWNlSG9sZGVyQ2VsbCA9IGNlbGwuZ2V0V2lkdGgoKSA9PT0gMDtcbiAgICBpZiAoaXNQbGFjZUhvbGRlckNlbGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyB0aGlzIGNlbGwgZG9uJ3QgaGF2ZSBjb250ZW50XG4gICAgY29uc3QgaXNFbXB0eUNlbGwgPSBjZWxsLmdldENoYXJzKCkgPT09ICcnO1xuXG4gICAgY29uc3Qgc3R5bGVEZWZpbml0aW9ucyA9IHRoaXMuX2RpZmZTdHlsZShjZWxsLCBvbGRDZWxsKTtcblxuICAgIC8vIGhhbmRsZXMgc3R5bGUgY2hhbmdlXG4gICAgaWYgKHN0eWxlRGVmaW5pdGlvbnMpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRSb3cgKz0gc3R5bGVEZWZpbml0aW9ucy5sZW5ndGggPT09IDAgP1xuICAgICAgICAnPC9zcGFuPjxzcGFuPicgOlxuICAgICAgICAnPC9zcGFuPjxzcGFuIHN0eWxlPVxcJycgKyBzdHlsZURlZmluaXRpb25zLmpvaW4oJyAnKSArICdcXCc+JztcbiAgICB9XG5cbiAgICAvLyBoYW5kbGVzIGFjdHVhbCBjb250ZW50XG4gICAgaWYgKGlzRW1wdHlDZWxsKSB7XG4gICAgICB0aGlzLl9jdXJyZW50Um93ICs9ICcgJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY3VycmVudFJvdyArPSBjZWxsLmdldENoYXJzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF9zZXJpYWxpemVTdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faHRtbENvbnRlbnQ7XG4gIH1cbn1cbiJdfQ==
|