@magic-xpa/utils 4.801.0-dev481.242 → 4.801.0-dev481.248

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/{esm2015/index.js → esm2020/index.mjs} +0 -0
  2. package/{esm2015/magic-xpa-utils.js → esm2020/magic-xpa-utils.mjs} +0 -0
  3. package/{esm2015/src/Base64.js → esm2020/src/Base64.mjs} +0 -0
  4. package/{esm2015/src/ChoiceUtils.js → esm2020/src/ChoiceUtils.mjs} +0 -0
  5. package/{esm2015/src/Constants.js → esm2020/src/Constants.mjs} +0 -0
  6. package/{esm2015/src/DateTimeUtils.js → esm2020/src/DateTimeUtils.mjs} +0 -0
  7. package/{esm2015/src/DateUtil.js → esm2020/src/DateUtil.mjs} +0 -0
  8. package/{esm2015/src/InternalInterface.js → esm2020/src/InternalInterface.mjs} +0 -0
  9. package/{esm2015/src/JSON_Utils.js → esm2020/src/JSON_Utils.mjs} +0 -0
  10. package/esm2020/src/Logger.mjs +216 -0
  11. package/{esm2015/src/MagicConstants.js → esm2020/src/MagicConstants.mjs} +0 -0
  12. package/{esm2015/src/Misc.js → esm2020/src/Misc.mjs} +0 -0
  13. package/{esm2015/src/MsgInterface.js → esm2020/src/MsgInterface.mjs} +0 -0
  14. package/{esm2015/src/PICInterface.js → esm2020/src/PICInterface.mjs} +0 -0
  15. package/{esm2015/src/PlatformUtils.js → esm2020/src/PlatformUtils.mjs} +0 -0
  16. package/{esm2015/src/Queue.js → esm2020/src/Queue.mjs} +0 -0
  17. package/{esm2015/src/Randomizer.js → esm2020/src/Randomizer.mjs} +0 -0
  18. package/{esm2015/src/RequestInfo.js → esm2020/src/RequestInfo.mjs} +0 -0
  19. package/{esm2015/src/Rtf.js → esm2020/src/Rtf.mjs} +0 -0
  20. package/{esm2015/src/StorageAttribute.js → esm2020/src/StorageAttribute.mjs} +0 -0
  21. package/esm2020/src/StrUtil.mjs +456 -0
  22. package/{esm2015/src/SyncExecutionHelper.js → esm2020/src/SyncExecutionHelper.mjs} +0 -0
  23. package/{esm2015/src/UtilDateJpn.js → esm2020/src/UtilDateJpn.mjs} +0 -0
  24. package/{esm2015/src/UtilImeJpn.js → esm2020/src/UtilImeJpn.mjs} +0 -0
  25. package/{esm2015/src/UtilStrByteMode.js → esm2020/src/UtilStrByteMode.mjs} +0 -0
  26. package/{esm2015/src/XMLConstants.js → esm2020/src/XMLConstants.mjs} +0 -0
  27. package/{esm2015/src/Xml/XmlParser.js → esm2020/src/Xml/XmlParser.mjs} +0 -0
  28. package/{esm2015/src/enums.js → esm2020/src/enums.mjs} +0 -0
  29. package/fesm2015/{magic-xpa-utils.js → magic-xpa-utils.mjs} +2 -3
  30. package/fesm2015/magic-xpa-utils.mjs.map +1 -0
  31. package/fesm2020/magic-xpa-utils.mjs +5381 -0
  32. package/fesm2020/magic-xpa-utils.mjs.map +1 -0
  33. package/package.json +25 -12
  34. package/bundles/magic-xpa-utils.umd.js +0 -5271
  35. package/bundles/magic-xpa-utils.umd.js.map +0 -1
  36. package/bundles/magic-xpa-utils.umd.min.js +0 -2
  37. package/bundles/magic-xpa-utils.umd.min.js.map +0 -1
  38. package/esm2015/src/Logger.js +0 -217
  39. package/esm2015/src/StrUtil.js +0 -457
  40. package/fesm2015/magic-xpa-utils.js.map +0 -1
@@ -1,457 +0,0 @@
1
- import { NString, RefParam, StringBuilder } from "@magic-xpa/mscorelib";
2
- import { UtilStrByteMode } from "./UtilStrByteMode";
3
- import { Rtf } from "./Rtf";
4
- import { isNullOrUndefined } from "util";
5
- const HTML_BACKSLASH = "\";
6
- const HTML_COMMA = ",";
7
- const HTML_HYPHEN = "-";
8
- const STR_2_HTML = 1;
9
- const TASK_PATH_DELIMITER = "@@||@@";
10
- export const SEQ_2_HTML = 2;
11
- export const HTML_2_STR = 3;
12
- const HTML_2_SEQ = 4;
13
- export const SEQ_2_STR = 5;
14
- export class StrUtil {
15
- static mem_trim(str, len) {
16
- let result;
17
- if (len > 0) {
18
- if (len > str.length) {
19
- result = -1;
20
- return result;
21
- }
22
- while (len > 0 && str[len - 1] === ' ') {
23
- len = len - 1;
24
- }
25
- }
26
- result = len;
27
- return result;
28
- }
29
- static memmove(dest, destCount, src, srcCount, len) {
30
- let stringBuilder = new StringBuilder(dest.length + len);
31
- if (UtilStrByteMode.isLocaleDefLangJPN() && dest.length < destCount) {
32
- stringBuilder.Append(NString.FromChar(' ', destCount));
33
- }
34
- else {
35
- stringBuilder.Append(dest.substr(0, destCount));
36
- }
37
- stringBuilder.Append(src.substr(srcCount, len));
38
- if (stringBuilder.Length < dest.length) {
39
- stringBuilder.Append(dest.substr(stringBuilder.Length));
40
- }
41
- return stringBuilder.ToString();
42
- }
43
- static memcpy(dest, destCount, src, scrCountOrSrcCount, count) {
44
- if (arguments.length === 5 && (dest === null || dest.constructor === String) && (destCount === null || destCount.constructor === Number) && (src === null || src.constructor === String) && (scrCountOrSrcCount === null || scrCountOrSrcCount.constructor === Number) && (count === null || count.constructor === Number)) {
45
- return StrUtil.memcpy_0(dest, destCount, src, scrCountOrSrcCount, count);
46
- }
47
- StrUtil.memcpy_1(dest, destCount, src, scrCountOrSrcCount, count);
48
- }
49
- static memcpy_0(dest, destCount, src, scrCount, count) {
50
- let stringBuilder = new StringBuilder(dest.substr(0, destCount));
51
- if (scrCount + count < src.length) {
52
- stringBuilder.Append(src.substr(scrCount, count - scrCount));
53
- }
54
- else {
55
- stringBuilder.Append(src.substr(scrCount));
56
- }
57
- let size = dest.length - destCount - count;
58
- if (size > 0) {
59
- stringBuilder.Append(dest.substr(destCount + count));
60
- }
61
- return stringBuilder.ToString();
62
- }
63
- static memcpy_1(dest, destCount, src, srcCount, count) {
64
- while (count > 0 && destCount < dest.length && srcCount < src.length) {
65
- dest[destCount++] = src[srcCount++];
66
- count = count - 1;
67
- }
68
- }
69
- static memset(dest, destCount, inVal, counter) {
70
- if (arguments.length === 4 && (dest === null || dest.constructor === String) && (destCount === null || destCount.constructor === Number) && (inVal === null || inVal.constructor === Number) && (counter === null || counter.constructor === Number)) {
71
- return StrUtil.memset_0(dest, destCount, inVal, counter);
72
- }
73
- StrUtil.memset_1(dest, destCount, inVal, counter);
74
- }
75
- static memset_0(dest, destCount, inVal, counter) {
76
- let first = new StringBuilder(dest.substr(0, destCount));
77
- while (counter > 0) {
78
- first.Append(inVal);
79
- counter = counter - 1;
80
- }
81
- if (first.Length < dest.length) {
82
- first.Append(dest.substr(first.Length));
83
- }
84
- return first.ToString();
85
- }
86
- static memset_1(dest, destCount, inVal, counter) {
87
- while (counter > 0 && destCount < dest.length) {
88
- dest[destCount++] = inVal;
89
- counter = counter - 1;
90
- }
91
- }
92
- static strstr(str, substr) {
93
- let from = str.indexOf(substr);
94
- let result;
95
- if (from < 0) {
96
- result = null;
97
- }
98
- else {
99
- result = str.substr(from);
100
- }
101
- return result;
102
- }
103
- static ReverseString(text) {
104
- let array = NString.ToCharArray(text.ToString());
105
- array.reverse();
106
- return new StringBuilder(NString.FromChars(array));
107
- }
108
- static rtrim(str) {
109
- return StrUtil.rtrimWithNull(str, false);
110
- }
111
- static rtrimWithNull(str, trimNullChars) {
112
- let result;
113
- if (typeof str === "undefined" || str === null || str.length === 0) {
114
- result = str;
115
- }
116
- else {
117
- let idx = str.length - 1;
118
- if (trimNullChars) {
119
- while (idx >= 0 && (str[idx] === ' ' || str[idx] === String.fromCharCode(0))) {
120
- idx = idx - 1;
121
- }
122
- }
123
- else {
124
- while (idx >= 0 && str[idx] === ' ') {
125
- idx = idx - 1;
126
- }
127
- }
128
- idx = idx + 1;
129
- if (idx < str.length) {
130
- result = str.substr(0, idx);
131
- }
132
- else {
133
- result = str;
134
- }
135
- }
136
- return result;
137
- }
138
- static ltrim(str) {
139
- let length = str.length;
140
- let i = 0;
141
- let result;
142
- if (str === null || length === 0) {
143
- result = str;
144
- }
145
- else {
146
- while (i < length && str[i] === ' ') {
147
- i = i + 1;
148
- }
149
- if (i > 0) {
150
- str = str.substr(i);
151
- }
152
- result = str;
153
- }
154
- return result;
155
- }
156
- static DeleteStringsFromEnds(str, strToDelete) {
157
- if (str.startsWith(strToDelete)) {
158
- str = str.substr(strToDelete.length);
159
- }
160
- if (str.endsWith(strToDelete)) {
161
- str = str.substr(0, str.length - strToDelete.length);
162
- }
163
- let result;
164
- if (str.length === 0) {
165
- result = null;
166
- }
167
- else {
168
- result = str;
169
- }
170
- return result;
171
- }
172
- static padStr(str, len) {
173
- let padLen = len - str.length;
174
- if (padLen > 0) {
175
- if (StrUtil._paddingSpaces === null || StrUtil._paddingSpaces.length < padLen) {
176
- StrUtil._paddingSpaces = NString.FromChar(' ', padLen);
177
- }
178
- let stringBuilder = new StringBuilder(len);
179
- stringBuilder.Append(str);
180
- stringBuilder.Append(StrUtil._paddingSpaces, 0, padLen);
181
- str = stringBuilder.ToString();
182
- }
183
- return str;
184
- }
185
- static tokenize(source, delim) {
186
- return source.split(delim);
187
- }
188
- static stringToHexaDump(str, minLength) {
189
- let stringBuilder = new StringBuilder(str.length * minLength);
190
- for (let indx = 0; indx < str.length; indx = indx + 1) {
191
- let currInt = str.charCodeAt(indx);
192
- let hexStr = currInt.toString(16);
193
- while (hexStr.length < minLength) {
194
- hexStr = "0" + hexStr;
195
- }
196
- stringBuilder.Append(hexStr);
197
- }
198
- return stringBuilder.ToString().toUpperCase();
199
- }
200
- static searchAndReplace(str, from, to) {
201
- if (arguments.length === 3 && (str === null || str.constructor === String) && (from === null || from.constructor === String) && (to === null || to.constructor === String)) {
202
- return StrUtil.searchAndReplace_0(str, from, to);
203
- }
204
- return StrUtil.searchAndReplace_1(str, from, to);
205
- }
206
- static searchAndReplace_0(str, from, to) {
207
- let lastSubStr = 0;
208
- let startSubStr;
209
- let result;
210
- if ((startSubStr = str.indexOf(from)) === -1) {
211
- result = str;
212
- }
213
- else {
214
- let stringBuilder = new StringBuilder(str.length);
215
- while (startSubStr !== -1) {
216
- stringBuilder.Append(str.substr(lastSubStr, startSubStr - lastSubStr) + to);
217
- startSubStr = startSubStr + from.length;
218
- lastSubStr = startSubStr;
219
- startSubStr = str.indexOf(from, lastSubStr);
220
- }
221
- stringBuilder.Append(str.substr(lastSubStr));
222
- result = stringBuilder.ToString();
223
- }
224
- return result;
225
- }
226
- static searchAndReplace_1(str, from, to) {
227
- let lastSubStr = 0;
228
- let sarIndex = 0;
229
- let fromCopy = from.slice();
230
- let startSubStr;
231
- let SARindex = new RefParam(0);
232
- startSubStr = StrUtil.indexOf(str, fromCopy, lastSubStr, SARindex);
233
- sarIndex = SARindex.value;
234
- if (startSubStr === -1)
235
- return str;
236
- let result;
237
- let tmpBuf = new StringBuilder(str.length);
238
- while (startSubStr !== -1) {
239
- tmpBuf.Append(str.substr(lastSubStr, startSubStr - lastSubStr) + to[sarIndex]);
240
- startSubStr += fromCopy[sarIndex].length;
241
- lastSubStr = startSubStr;
242
- startSubStr = StrUtil.indexOf(str, fromCopy, lastSubStr, SARindex);
243
- sarIndex = SARindex.value;
244
- }
245
- ;
246
- tmpBuf.Append(str.substr(lastSubStr));
247
- result = tmpBuf.ToString();
248
- return result;
249
- }
250
- static indexOf(str, strings, offset, SARindex) {
251
- let minOffset = -1;
252
- for (let i = 0; i < strings.length; i = i + 1) {
253
- let flag = strings[i] === null;
254
- if (!(strings[i] === null)) {
255
- let resultOffset = str.indexOf(strings[i], offset);
256
- if (resultOffset === -1) {
257
- strings[i] = null;
258
- }
259
- else {
260
- if (resultOffset < minOffset || minOffset === -1) {
261
- minOffset = resultOffset;
262
- SARindex.value = i;
263
- }
264
- }
265
- }
266
- }
267
- let result;
268
- if (minOffset > -1) {
269
- result = minOffset;
270
- }
271
- else {
272
- SARindex.value = -1;
273
- result = -1;
274
- }
275
- return result;
276
- }
277
- static replaceStringTokens(userString, token, occurrence, val) {
278
- let tokenLen = token.length;
279
- let currPosition = 0;
280
- let newString = userString;
281
- if (val !== null) {
282
- let num2 = 0;
283
- while (num2 < occurrence && currPosition !== -1) {
284
- currPosition = userString.indexOf(token, currPosition + ((num2 === 0) ? 0 : tokenLen));
285
- num2 = num2 + 1;
286
- }
287
- if (currPosition !== -1) {
288
- newString = userString.substr(0, currPosition) + val + userString.substr(currPosition + tokenLen, userString.length - (currPosition + tokenLen));
289
- }
290
- }
291
- return newString;
292
- }
293
- static makePrintableTokens(source, type) {
294
- if (arguments.length === 2 && (source === null || source.constructor === String) && (type === null || type.constructor === Number)) {
295
- return StrUtil.makePrintableTokens_0(source, type);
296
- }
297
- StrUtil.makePrintableTokens_1(source, type);
298
- }
299
- static makePrintableTokens_0(source, type) {
300
- let escStr = [
301
- "\\", "-", ","
302
- ];
303
- let escSeq = [
304
- "\\\\", "\\-", "\\,"
305
- ];
306
- let escHtm = [
307
- HTML_BACKSLASH, HTML_HYPHEN, HTML_COMMA
308
- ];
309
- let result;
310
- switch (type) {
311
- case STR_2_HTML:
312
- result = StrUtil.searchAndReplace(source, escStr, escHtm);
313
- break;
314
- case SEQ_2_HTML:
315
- result = StrUtil.searchAndReplace(source, escSeq, escHtm);
316
- break;
317
- case HTML_2_SEQ:
318
- result = StrUtil.searchAndReplace(source, escHtm, escSeq);
319
- break;
320
- case HTML_2_STR:
321
- result = StrUtil.searchAndReplace(source, escHtm, escStr);
322
- break;
323
- case SEQ_2_STR:
324
- result = StrUtil.searchAndReplace(source, escSeq, escStr);
325
- break;
326
- default:
327
- result = source;
328
- break;
329
- }
330
- return result;
331
- }
332
- static makePrintableTokens_1(source, type) {
333
- if (source !== null) {
334
- let length = source.length;
335
- for (let i = 0; i < length; i = i + 1) {
336
- let currElm = source.get_Item(i);
337
- source.set_Item(i, StrUtil.makePrintableTokens_0(currElm, type));
338
- }
339
- }
340
- }
341
- static makePrintable(source) {
342
- let from = [
343
- "\n", "\r", "'", "\\", "\"", "\0"
344
- ];
345
- let to = [
346
- "\\n", "\\r", "\\'", "\\\\", "\\\"", "\\0"
347
- ];
348
- return StrUtil.searchAndReplace(source, from, to);
349
- }
350
- static makePrintable2(source) {
351
- let from = [
352
- "\n", "\r", "\0"
353
- ];
354
- let to = [
355
- "\\n", "\\r", "\\0"
356
- ];
357
- return StrUtil.searchAndReplace(source, from, to);
358
- }
359
- static ZstringMake(s, len) {
360
- len = StrUtil.mem_trim(s, len);
361
- return s.substr(0, len);
362
- }
363
- static GetPlainTextfromRtf(rtfText) {
364
- if (Rtf.isRtf(rtfText)) {
365
- let rtf = new Rtf();
366
- let outputTxt = new StringBuilder("");
367
- rtf.toTxt(rtfText, outputTxt);
368
- rtfText = outputTxt.ToString();
369
- }
370
- return rtfText;
371
- }
372
- static StringsArraysEqual(str1, str2) {
373
- let result;
374
- if (str1 === null && str2 === null) {
375
- result = true;
376
- }
377
- else {
378
- if (str1 === null || str2 === null) {
379
- result = false;
380
- }
381
- else {
382
- if (str1.length !== str2.length) {
383
- result = false;
384
- }
385
- else {
386
- for (let index = 0; index < str1.length; index = index + 1) {
387
- if ((str1[index] !== str2[index])) {
388
- result = false;
389
- return result;
390
- }
391
- }
392
- result = true;
393
- }
394
- }
395
- }
396
- return result;
397
- }
398
- static SearchAndReplaceWildChars(buf, len, filler) {
399
- buf = NString.PadRight(buf, len);
400
- let escChar = false;
401
- let stopSearch = false;
402
- let tmpBuf = new StringBuilder(len);
403
- for (let i = 0; i < len; i = i + 1) {
404
- switch (buf[i]) {
405
- case ('\\'):
406
- {
407
- let isNextCharWild = true;
408
- if ((i + 1 < len) && (buf[i + 1] != '*' && buf[i + 1] != '\\'))
409
- isNextCharWild = false;
410
- if (escChar || !isNextCharWild)
411
- tmpBuf.Append(buf[i]);
412
- escChar = !escChar;
413
- }
414
- break;
415
- case ('*'):
416
- if (escChar)
417
- tmpBuf.Append(buf[i]);
418
- else {
419
- tmpBuf.Append(filler, len - tmpBuf.Length);
420
- stopSearch = true;
421
- }
422
- escChar = false;
423
- break;
424
- case '?':
425
- tmpBuf.Append(filler);
426
- escChar = false;
427
- break;
428
- default:
429
- tmpBuf.Append(buf[i]);
430
- escChar = false;
431
- break;
432
- }
433
- }
434
- let text = tmpBuf.ToString();
435
- return NString.TrimEnd(NString.TrimEnd(text, ['\0']));
436
- }
437
- static getConsoleErorString(source) {
438
- let consoleErorString = "";
439
- if (!isNullOrUndefined(source))
440
- consoleErorString = this.searchAndReplace(source, TASK_PATH_DELIMITER, "");
441
- return consoleErorString;
442
- }
443
- static getMsgBoxErorString(source) {
444
- let tokens;
445
- let msgBoxErorString = new StringBuilder("");
446
- if (!isNullOrUndefined(source)) {
447
- tokens = this.tokenize(source, TASK_PATH_DELIMITER);
448
- for (let i = 0; i < tokens.length; i++) {
449
- msgBoxErorString.Append(tokens[i]);
450
- i++;
451
- }
452
- }
453
- return msgBoxErorString.toString();
454
- }
455
- }
456
- StrUtil._paddingSpaces = null;
457
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RyVXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3V0aWxzL3NyYy9TdHJVdGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBTyxPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzVFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV6QyxNQUFNLGNBQWMsR0FBVyxRQUFRLENBQUM7QUFDeEMsTUFBTSxVQUFVLEdBQVcsUUFBUSxDQUFDO0FBQ3BDLE1BQU0sV0FBVyxHQUFXLFFBQVEsQ0FBQztBQUNyQyxNQUFNLFVBQVUsR0FBVyxDQUFDLENBQUM7QUFDN0IsTUFBTSxtQkFBbUIsR0FBVyxRQUFRLENBQUM7QUFDN0MsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFXLENBQUMsQ0FBQztBQUNwQyxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQVcsQ0FBQyxDQUFDO0FBQ3BDLE1BQU0sVUFBVSxHQUFXLENBQUMsQ0FBQztBQUM3QixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQVcsQ0FBQyxDQUFDO0FBRW5DLE1BQU0sT0FBTyxPQUFPO0lBSWxCLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBVyxFQUFFLEdBQVc7UUFDdEMsSUFBSSxNQUFjLENBQUM7UUFDbkIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFO1lBQ1gsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRTtnQkFDcEIsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNaLE9BQU8sTUFBTSxDQUFDO2FBQ2Y7WUFDRCxPQUFPLEdBQUcsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENB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RTVELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsRUFBQztZQUM3QixNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztZQUVwRCxLQUFLLElBQUksQ0FBQyxHQUFVLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFDN0M7Z0JBQ0UsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuQyxDQUFDLEVBQUUsQ0FBQzthQUNMO1NBQ0Y7UUFJRCxPQUFPLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3JDLENBQUM7O0FBN3JCYyxzQkFBYyxHQUFXLElBQUksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TGlzdCwgTlN0cmluZywgUmVmUGFyYW0sIFN0cmluZ0J1aWxkZXJ9IGZyb20gXCJAbWFnaWMteHBhL21zY29yZWxpYlwiO1xyXG5pbXBvcnQge1V0aWxTdHJCeXRlTW9kZX0gZnJvbSBcIi4vVXRpbFN0ckJ5dGVNb2RlXCI7XHJcbmltcG9ydCB7UnRmfSBmcm9tIFwiLi9SdGZcIjtcclxuaW1wb3J0IHsgaXNOdWxsT3JVbmRlZmluZWQgfSBmcm9tIFwidXRpbFwiO1xyXG5cclxuY29uc3QgSFRNTF9CQUNLU0xBU0g6IHN0cmluZyA9IFwiJiMwOTI7XCI7XHJcbmNvbnN0IEhUTUxfQ09NTUE6IHN0cmluZyA9IFwiJiMwNDQ7XCI7XHJcbmNvbnN0IEhUTUxfSFlQSEVOOiBzdHJpbmcgPSBcIiYjMDQ1O1wiO1xyXG5jb25zdCBTVFJfMl9IVE1MOiBudW1iZXIgPSAxO1xyXG5jb25zdCBUQVNLX1BBVEhfREVMSU1JVEVSOiBzdHJpbmcgPSBcIkBAfHxAQFwiO1xyXG5leHBvcnQgY29uc3QgU0VRXzJfSFRNTDogbnVtYmVyID0gMjtcclxuZXhwb3J0IGNvbnN0IEhUTUxfMl9TVFI6IG51bWJlciA9IDM7XHJcbmNvbnN0IEhUTUxfMl9TRVE6IG51bWJlciA9IDQ7XHJcbmV4cG9ydCBjb25zdCBTRVFfMl9TVFI6IG51bWJlciA9IDU7XHJcblxyXG5leHBvcnQgY2xhc3MgU3RyVXRpbCB7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgX3BhZGRpbmdTcGFjZXM6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gdHJpbSB0aGUgZW5kIG9mIHRoZSBzdHJpbmc8L3N1bW1hcnk+XHJcbiAgc3RhdGljIG1lbV90cmltKHN0cjogc3RyaW5nLCBsZW46IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgcmVzdWx0OiBudW1iZXI7XHJcbiAgICBpZiAobGVuID4gMCkge1xyXG4gICAgICBpZiAobGVuID4gc3RyLmxlbmd0aCkge1xyXG4gICAgICAgIHJlc3VsdCA9IC0xO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgICAgd2hpbGUgKGxlbiA+IDAgJiYgc3RyW2xlbiAtIDFdID09PSAnICcpIHtcclxuICAgICAgICBsZW4gPSBsZW4gLSAxO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXN1bHQgPSBsZW47XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIG1lbW1vdmUoZGVzdDogc3RyaW5nLCBkZXN0Q291bnQ6IG51bWJlciwgc3JjOiBzdHJpbmcsIHNyY0NvdW50OiBudW1iZXIsIGxlbjogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBzdHJpbmdCdWlsZGVyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoZGVzdC5sZW5ndGggKyBsZW4pO1xyXG4gICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdKUE4oKSAmJiBkZXN0Lmxlbmd0aCA8IGRlc3RDb3VudCkge1xyXG4gICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZChOU3RyaW5nLkZyb21DaGFyKCcgJywgZGVzdENvdW50KSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQoZGVzdC5zdWJzdHIoMCwgZGVzdENvdW50KSk7XHJcbiAgICB9XHJcbiAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZChzcmMuc3Vic3RyKHNyY0NvdW50LCBsZW4pKTtcclxuXHJcbiAgICBpZiAoc3RyaW5nQnVpbGRlci5MZW5ndGggPCBkZXN0Lmxlbmd0aCkge1xyXG4gICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKGRlc3Quc3Vic3RyKHN0cmluZ0J1aWxkZXIuTGVuZ3RoKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RyaW5nQnVpbGRlci5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIG1lbWNweShkZXN0OiBzdHJpbmcsIGRlc3RDb3VudDogbnVtYmVyLCBzcmM6IHN0cmluZywgc2NyQ291bnQ6IG51bWJlciwgY291bnQ6IG51bWJlcik6IHN0cmluZztcclxuICBzdGF0aWMgbWVtY3B5KGRlc3Q6IHN0cmluZ1tdLCBkZXN0Q291bnQ6IG51bWJlciwgc3JjOiBzdHJpbmdbXSwgc3JjQ291bnQ6IG51bWJlciwgY291bnQ6IG51bWJlcik6IHZvaWQ7XHJcbiAgc3RhdGljIG1lbWNweShkZXN0OiBhbnksIGRlc3RDb3VudDogbnVtYmVyLCBzcmM6IGFueSwgc2NyQ291bnRPclNyY0NvdW50OiBudW1iZXIsIGNvdW50OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDUgJiYgKGRlc3QgPT09IG51bGwgfHwgZGVzdC5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nKSAmJiAoZGVzdENvdW50ID09PSBudWxsIHx8IGRlc3RDb3VudC5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSAmJiAoc3JjID09PSBudWxsIHx8IHNyYy5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nKSAmJiAoc2NyQ291bnRPclNyY0NvdW50ID09PSBudWxsIHx8IHNjckNvdW50T3JTcmNDb3VudC5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSAmJiAoY291bnQgPT09IG51bGwgfHwgY291bnQuY29uc3RydWN0b3IgPT09IE51bWJlcikpIHtcclxuICAgICAgcmV0dXJuIFN0clV0aWwubWVtY3B5XzAoZGVzdCwgZGVzdENvdW50LCBzcmMsIHNjckNvdW50T3JTcmNDb3VudCwgY291bnQpO1xyXG4gICAgfVxyXG4gICAgU3RyVXRpbC5tZW1jcHlfMShkZXN0LCBkZXN0Q291bnQsIHNyYywgc2NyQ291bnRPclNyY0NvdW50LCBjb3VudCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY29weSBwYXJ0IG9mIHN0cmluZyBpbnRvIGFub3RoZXIgc3RyaW5nLCBsaWtlIG1lbWNweSBvZiBDLCBidXQgNCBzdHJpbmcgb25seVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkZXN0XCI+c3RyaW5nPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRlc3RDb3VudFwiPm9mIGNvdW50ZXIgc3RhcnQgZnJvbSBpbiBkZXN0aWduYXRpb24gc3RyaW5nPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInNyY1wiPnN0cmluZzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzY3JDb3VudFwiPm9mIGNvdW50ZXIgc3RhcnQgZnJvbSBpbiBzb3VyY2Ugc3RyaW5nPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvdW50XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IG5ldyB2YWx1ZSBvZiBkZXN0aWduYXRpb24gc3RyaW5nPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgc3RhdGljIG1lbWNweV8wKGRlc3Q6IHN0cmluZywgZGVzdENvdW50OiBudW1iZXIsIHNyYzogc3RyaW5nLCBzY3JDb3VudDogbnVtYmVyLCBjb3VudDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBzdHJpbmdCdWlsZGVyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoZGVzdC5zdWJzdHIoMCwgZGVzdENvdW50KSk7XHJcblxyXG4gICAgaWYgKHNjckNvdW50ICsgY291bnQgPCBzcmMubGVuZ3RoKSB7XHJcbiAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKHNyYy5zdWJzdHIoc2NyQ291bnQsIGNvdW50IC0gc2NyQ291bnQpKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZChzcmMuc3Vic3RyKHNjckNvdW50KSk7XHJcbiAgICB9XHJcbiAgICBsZXQgc2l6ZTogbnVtYmVyID0gZGVzdC5sZW5ndGggLSBkZXN0Q291bnQgLSBjb3VudDtcclxuICAgIGlmIChzaXplID4gMCkge1xyXG4gICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZChkZXN0LnN1YnN0cihkZXN0Q291bnQgKyBjb3VudCkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0cmluZ0J1aWxkZXIuVG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIG1lbWNweV8xKGRlc3Q6IHN0cmluZ1tdLCBkZXN0Q291bnQ6IG51bWJlciwgc3JjOiBzdHJpbmdbXSwgc3JjQ291bnQ6IG51bWJlciwgY291bnQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgd2hpbGUgKGNvdW50ID4gMCAmJiBkZXN0Q291bnQgPCBkZXN0Lmxlbmd0aCAmJiBzcmNDb3VudCA8IHNyYy5sZW5ndGgpIHtcclxuICAgICAgZGVzdFtkZXN0Q291bnQrK10gPSBzcmNbc3JjQ291bnQrK107XHJcbiAgICAgIGNvdW50ID0gY291bnQgLSAxO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIG1lbXNldChkZXN0OiBzdHJpbmcsIGRlc3RDb3VudDogbnVtYmVyLCBpblZhbDogc3RyaW5nLCBjb3VudGVyOiBudW1iZXIpOiBzdHJpbmc7XHJcbiAgc3RhdGljIG1lbXNldChkZXN0OiBzdHJpbmdbXSwgZGVzdENvdW50OiBudW1iZXIsIGluVmFsOiBzdHJpbmcsIGNvdW50ZXI6IG51bWJlcik6IHZvaWQ7XHJcbiAgc3RhdGljIG1lbXNldChkZXN0OiBhbnksIGRlc3RDb3VudDogbnVtYmVyLCBpblZhbDogc3RyaW5nLCBjb3VudGVyOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQgJiYgKGRlc3QgPT09IG51bGwgfHwgZGVzdC5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nKSAmJiAoZGVzdENvdW50ID09PSBudWxsIHx8IGRlc3RDb3VudC5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSAmJiAoaW5WYWwgPT09IG51bGwgfHwgaW5WYWwuY29uc3RydWN0b3IgPT09IE51bWJlcikgJiYgKGNvdW50ZXIgPT09IG51bGwgfHwgY291bnRlci5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSkge1xyXG4gICAgICByZXR1cm4gU3RyVXRpbC5tZW1zZXRfMChkZXN0LCBkZXN0Q291bnQsIGluVmFsLCBjb3VudGVyKTtcclxuICAgIH1cclxuICAgIFN0clV0aWwubWVtc2V0XzEoZGVzdCwgZGVzdENvdW50LCBpblZhbCwgY291bnRlcik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaW5zZXJ0IHRvIHN0cmluZyBjaGFycyBuIHRpbWVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRlc3RcIj5zdHJpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGVzdENvdW50XCI+b2YgY291bnRlciBzdGFydCBmcm9tIGluIGRlc3RpZ25hdGlvbiBzdHJpbmcgdG8gc3RhcnQgaW5zZXJ0aW9uIG9mIGNoYXIgZnJvbTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpblZhbFwiPjIgaW5zZXJ0PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvdW50ZXJcIj4tIG51bWJlciBvZiB0aW1lcyB0byBpbnNlcnQgdGhlIGNoYXI8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gbmV3IHZhbHVlIG9mIGRlc3RpZ25hdGlvbiBzdHJpbmc8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgbWVtc2V0XzAoZGVzdDogc3RyaW5nLCBkZXN0Q291bnQ6IG51bWJlciwgaW5WYWw6IHN0cmluZywgY291bnRlcjogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBmaXJzdDogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKGRlc3Quc3Vic3RyKDAsIGRlc3RDb3VudCkpO1xyXG4gICAgd2hpbGUgKGNvdW50ZXIgPiAwKSB7XHJcbiAgICAgIGZpcnN0LkFwcGVuZChpblZhbCk7XHJcbiAgICAgIGNvdW50ZXIgPSBjb3VudGVyIC0gMTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZmlyc3QuTGVuZ3RoIDwgZGVzdC5sZW5ndGgpIHtcclxuICAgICAgZmlyc3QuQXBwZW5kKGRlc3Quc3Vic3RyKGZpcnN0Lkxlbmd0aCkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZpcnN0LlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBtZW1zZXRfMShkZXN0OiBzdHJpbmdbXSwgZGVzdENvdW50OiBudW1iZXIsIGluVmFsOiBzdHJpbmcsIGNvdW50ZXI6IG51bWJlcik6IHZvaWQge1xyXG4gICAgd2hpbGUgKGNvdW50ZXIgPiAwICYmIGRlc3RDb3VudCA8IGRlc3QubGVuZ3RoKSB7XHJcbiAgICAgIGRlc3RbZGVzdENvdW50KytdID0gaW5WYWw7XHJcbiAgICAgIGNvdW50ZXIgPSBjb3VudGVyIC0gMTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBzdHJzdHIoc3RyOiBzdHJpbmcsIHN1YnN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCBmcm9tOiBudW1iZXIgPSBzdHIuaW5kZXhPZihzdWJzdHIpO1xyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nO1xyXG4gICAgaWYgKGZyb20gPCAwKSB7XHJcbiAgICAgIHJlc3VsdCA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmVzdWx0ID0gc3RyLnN1YnN0cihmcm9tKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldmVyc2VzIHN0cmluZyB2YWx1ZXMuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0ZXh0XCI+VGhlIFN0cmluZ0J1aWxkZXIgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0cmluZyB0byBiZSByZXZlcnNlZC48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5UaGUgcmV2ZXJzZWQgc3RyaW5nIGNvbnRhaW5lZCBpbiBhIFN0cmluZ0J1aWxkZXIgb2JqZWN0LjwvcmV0dXJucz5cclxuICBzdGF0aWMgUmV2ZXJzZVN0cmluZyh0ZXh0OiBTdHJpbmdCdWlsZGVyKTogU3RyaW5nQnVpbGRlciB7XHJcbiAgICAvLyBUT0RPOiB1c2Ugc3RyaW5nLlJldmVyc2UoKVxyXG4gICAgbGV0IGFycmF5OiBzdHJpbmdbXSA9IE5TdHJpbmcuVG9DaGFyQXJyYXkodGV4dC5Ub1N0cmluZygpKTtcclxuICAgIGFycmF5LnJldmVyc2UoKTtcclxuICAgIHJldHVybiBuZXcgU3RyaW5nQnVpbGRlcihOU3RyaW5nLkZyb21DaGFycyhhcnJheSkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiByZW1vdmUgc3BhY2VzIGZyb20gdGhlIHJpZ2h0IHNpZGUgb2Ygc3RyaW5nPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0clwiPnRoZSBzdHJpbmcgdG8gdHJpbVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHN0YXRpYyBydHJpbShzdHI6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gU3RyVXRpbC5ydHJpbVdpdGhOdWxsKHN0ciwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiByZW1vdmUgc3BhY2VzIGFuZC9vciBOdWxsIGNoYXJzIGZyb20gdGhlIHJpZ2h0IHNpZGUgb2Ygc3RyaW5nPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0clwiPnRoZSBzdHJpbmcgdG8gdHJpbVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRyaW1OdWxsQ2hhcnNcIj5XaGV0aGVyIHRvIHJlbW92ZSBOVUxMIGNoYXJhY3RlcnMgb3Igbm90XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgc3RhdGljIHJ0cmltV2l0aE51bGwoc3RyOiBzdHJpbmcsIHRyaW1OdWxsQ2hhcnM6IGJvb2xlYW4pOiBzdHJpbmcge1xyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nO1xyXG4gICAgaWYgKHR5cGVvZiBzdHIgPT09IFwidW5kZWZpbmVkXCIgfHwgc3RyID09PSBudWxsIHx8IHN0ci5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmVzdWx0ID0gc3RyO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBpZHg6IG51bWJlciA9IHN0ci5sZW5ndGggLSAxO1xyXG4gICAgICBpZiAodHJpbU51bGxDaGFycykge1xyXG5cclxuICAgICAgICB3aGlsZSAoaWR4ID49IDAgJiYgKHN0cltpZHhdID09PSAnICcgfHwgc3RyW2lkeF0gPT09IFN0cmluZy5mcm9tQ2hhckNvZGUoMCkvKidcdTAwMDAnKi8pKSB7XHJcbiAgICAgICAgICBpZHggPSBpZHggLSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB3aGlsZSAoaWR4ID49IDAgJiYgc3RyW2lkeF0gPT09ICcgJykge1xyXG4gICAgICAgICAgaWR4ID0gaWR4IC0gMTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWR4ID0gaWR4ICsgMTtcclxuXHJcbiAgICAgIGlmIChpZHggPCBzdHIubGVuZ3RoKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gc3RyLnN1YnN0cigwLCBpZHgpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJlc3VsdCA9IHN0cjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gcmVtb3ZlIHNwYWNlcyBmcm9tIHRoZSBsZWZ0IHNpZGUgb2Ygc3RyaW5nPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0clwiPnRoZSBzdHJpbmcgdG8gdHJpbVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHN0YXRpYyBsdHJpbShzdHI6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgbGVuZ3RoOiBudW1iZXIgPSBzdHIubGVuZ3RoO1xyXG4gICAgbGV0IGk6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmc7XHJcbiAgICBpZiAoc3RyID09PSBudWxsIHx8IGxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXN1bHQgPSBzdHI7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgd2hpbGUgKGkgPCBsZW5ndGggJiYgc3RyW2ldID09PSAnICcvKicgJyovKSB7XHJcbiAgICAgICAgaSA9IGkgKyAxO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaSA+IDApIHtcclxuICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKGkpO1xyXG4gICAgICB9XHJcbiAgICAgIHJlc3VsdCA9IHN0cjtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+VGhpcyBmdW5jdGlvbiBmb3IgRGVsZXRpbmcgU3RyaW5nIGZyb20gZW5kICYgc3RhcnQgb2YgaW5wdXRcclxuICAvLy8gU3RyaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJcIj5TdHJpbmcgLCB3aGljaCBjYW4gaW5jbHVkZSBzdHJUb0RlbGV0ZSBzcGFjZXMgb24gaW5wdXRcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJUb0RlbGV0ZVwiPm5lZWQgZGVsZXRlIHRoaXMgU3RyaW5nIGZyb20gc3RhcnQvZW5kIG9mIHN0ci5cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IFN0cmluZyB3aXRob3V0IHN0clRvRGVsZXRlIG9uIGVuZCAmIHN0YXJ0LFxyXG4gIC8vLyBvciAnbnVsbCcgaWYgU3RpbmcgaGFzbid0IG5vdCAgY2hhcmFjdGVycyBpbnNpZGVcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBEZWxldGVTdHJpbmdzRnJvbUVuZHMoc3RyOiBzdHJpbmcsIHN0clRvRGVsZXRlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKHN0ci5zdGFydHNXaXRoKHN0clRvRGVsZXRlKSkge1xyXG4gICAgICBzdHIgPSBzdHIuc3Vic3RyKHN0clRvRGVsZXRlLmxlbmd0aCk7XHJcbiAgICB9XHJcbiAgICBpZiAoc3RyLmVuZHNXaXRoKHN0clRvRGVsZXRlKSkge1xyXG4gICAgICBzdHIgPSBzdHIuc3Vic3RyKDAsIHN0ci5sZW5ndGggLSBzdHJUb0RlbGV0ZS5sZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nO1xyXG4gICAgaWYgKHN0ci5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmVzdWx0ID0gbnVsbDtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXN1bHQgPSBzdHI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBwYWQgYSBzdHJpbmcgd2l0aCB0cmFpbGluZyBzcGFjZXMgdXAgdG8gdGhlIGdpdmVuIGxlbmd0aDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJcIj50aGUgc3RyaW5nIHRvIHBhZFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxlblwiPnRoZSBleHBlY3RlZCBsZW5ndGggYWZ0ZXIgcGFkZGluZ1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHN0YXRpYyBwYWRTdHIoc3RyOiBzdHJpbmcsIGxlbjogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBwYWRMZW46IG51bWJlciA9IGxlbiAtIHN0ci5sZW5ndGg7XHJcblxyXG4gICAgaWYgKHBhZExlbiA+IDApIHtcclxuICAgICAgaWYgKFN0clV0aWwuX3BhZGRpbmdTcGFjZXMgPT09IG51bGwgfHwgU3RyVXRpbC5fcGFkZGluZ1NwYWNlcy5sZW5ndGggPCBwYWRMZW4pIHtcclxuICAgICAgICBTdHJVdGlsLl9wYWRkaW5nU3BhY2VzID0gTlN0cmluZy5Gcm9tQ2hhcignICcsIHBhZExlbik7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IHN0cmluZ0J1aWxkZXI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihsZW4pO1xyXG4gICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZChzdHIpO1xyXG4gICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZChTdHJVdGlsLl9wYWRkaW5nU3BhY2VzLCAwLCBwYWRMZW4pO1xyXG4gICAgICBzdHIgPSBzdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RyO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiB0aGlzIG1ldGhvZCB3aWxsIHNlcnZlIGFzIGEgc3RyaW5nIHRva2VuaXplciBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBjIyBzcGxpdCBtZXRob2RcclxuICAvLy8gc2luY2UgdGhlcmUgYXJlIGRpZmZyZW5jZXMgYnR3ZWVuIGphdmEgdG9rZW5pemVyIGFuZCBjIyBzcGxpdFxyXG4gIC8vLyB0aGUgaW1wbGltZW50YXRpb24gZ2l2ZW4gYnkgdGhlIGNvbnZlcnNpb24gdG9vbCBpcyBub3QgU3VmZmljaWVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic291cmNlXCI+LSB0aGUgc291cmNlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWRcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkZWxpbVwiPi0gdGhlIHN0cmluZyBvZiBkZWxpbWl0ZXJzIHVzZWQgdG8gc3BsaXQgdGhlIHN0cmluZyAoZWFjaCBjaGFyYWN0ZXIgaW4gdGhlIFN0cmluZyBpcyBhIGRlbGltaXRlclxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYXJyYXkgb2YgdG9rZW4gYWNjb3JkaW5nIHdoaWNoIGlzIHRoZSBzYW1lIGFzIHN0cmluZyB0b2tlbml6ZXIgaW4gamF2YVxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgc3RhdGljIHRva2VuaXplKHNvdXJjZTogc3RyaW5nLCBkZWxpbTogc3RyaW5nfFJlZ0V4cCk6IHN0cmluZ1tdIHtcclxuICAgIC8vIEl0IGlzIG1lbnRpb25lZCBpbiB0aGUgY29tbWVudCB0aGF0IHdlIHNob3VsZCBub3QgdXNlIFN0cmluZy5TcGxpdCgpXHJcbiAgICAvLyBiZWNhdXNlIGl0cyBiZWhhdmlvciBpcyBkaWZmZXJlbnQgdGhhbiBKYXZhJ3MgdG9rZW5pemVyLlxyXG4gICAgLy8gU28sIHdlIHdlcmUgc3VwcG9zZSB0byB1c2Ugb3VyIG93biBpbXBsZW1lbnRhdGlvbiAodGhlIGNvbW1lbnRlZCBjb2RlIGJlbG93KS5cclxuICAgIC8vIEJ1dCBhbGwgdGhlc2UgeWVhcnMsIHdlIHdlcmUgY2FsbGluZyBYbWxQYXJzZXIuZ2V0VG9rZW4oKSB3aGljaCB3YXMgYWN0dWFsbHlcclxuICAgIC8vIHVzaW5nIFN0cmluZy5TcGxpdCgpLiBBbmQgd2UgZGlkbid0IGZhY2UgYW55IHByb2JsZW0uXHJcbiAgICAvLyBTbywgaXQgc2VlbXMgdGhhdCB3ZSBkbyBub3QgaGF2ZSBwcm9ibGVtIGluIHVzaW5nIFN0cmluZy5TcGxpdCgpLlxyXG4gICAgLy8gQnV0IG5vdywgd2UgY2FuIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIGhlcmUuLi5cclxuICAgIC8vIFhtbFBhcnNlci5nZXRUb2tlbnMoKSB3YXMgZ2V0dGluZyBhIFN0cmluZ1tdIHVzaW5nIFN0cmluZy5TcGxpdCgpLlxyXG4gICAgLy8gSXQgd2FzIHRoZW4gY3JlYXRpbmcgYSBMaXN0PFN0cmluZz4gZnJvbSB0aGlzIFN0cmluZ1tdIGFuZCB3YXMgcmV0dXJuaW5nIGl0IHRvXHJcbiAgICAvLyB0b2tlbml6ZSgpLlxyXG4gICAgLy8gdG9rZW5pemUoKSB3YXMgYWdhaW4gY29udmVydGluZyB0aGlzIExpc3Q8U3RyaW5nPiBiYWNrIHRvIFN0cmluZ1tdLlxyXG4gICAgLy8gU28gd2h5IG5vdCBjYWxsIFN0cmluZy5TcGxpdCgpIGRpcmVjdGx5P1xyXG4gICAgcmV0dXJuIHNvdXJjZS5zcGxpdChkZWxpbSk7XHJcbiAgICAvKlxyXG5TdHJpbmcgW10gdG9rZW5zID0gbnVsbDtcclxuXHJcbmNoYXIgW10gZGVsaW1BcnJ5ID0gZGVsaW0udG9DaGFyQXJyYXkoKTtcclxuXHJcbi8vc2luY2UgamF2YSBkaXNjYXJkcyBkZWxpbWl0ZXJzIGZyb20gdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIHN0cmluZyBhbmQgYyMgZG9lcyBub3RcclxuLy93ZSBuZWVkIHRvIHJlbW92ZSB0aGVtIG1hbnVhbGx5XHJcbi8vICAgICAgIHNvdXJjZSA9IHNvdXJjZS5UcmltRW5kKGRlbGltQXJyeSk7XHJcbi8vICAgICBzb3VyY2UgPSBzb3VyY2UuVHJpbVN0YXJ0KGRlbGltQXJyeSk7XHJcbnNvdXJjZSA9IHNvdXJjZS50cmltKCk7XHJcblxyXG4vL25vdyB0aGF0IHdlIGhhdmUgcmVtb3ZlIHN0YXJ0aW5nIGFuZCBlbmRpbmcgZGVsaW1pdGVycyB3ZSBjYW4gc3BsaXRcclxudG9rZW5zID0gc291cmNlLlNwbGl0KGRlbGltQXJyeSk7XHJcblxyXG4vKlxyXG4qIG9ubHkgb25lIHByb2JsZW06IGlmIHdlIGhhdmUgdHdvIFN1YnNlcXVlbnQgZGVsaW1pdGVycyBmb3IgZXhhbXBsZSA6XHJcbiogdGhlIGRlbGltaXRlciBpcyAnOycgYW5kIHRoZSBzdHJpbmcgaXM6IFwiZmlyc3Q7O3NlY29uZDt0aGlyZFwiXHJcbiogdGhlbiBpbiBqYXZhIFN0cmluZyB0b2tlbml6ZXIgd2lsbCBnaXZlIHVzIG9ubHkgMyB0b2tlbnMgOmZpcnN0LHNlY29uZCBhbmQgdGhpcmRcclxuKiB3aGlsZSBpcyBjIyBzcGxpdCB3ZXRob2Qgd2lsbCByZXR1cm4gNCB0b2tlbnM6IGZpcnN0LGVtcHR5IHN0cmluZyxzZWNvbmQgYW5kIHRoaXJkXHJcbiogd2UgbmVlZCB0byBkZWFsIHdpdGggdGhhdFxyXG4qL1xyXG4gICAgLypcclxuICAgIExpc3QgcmVzICA9IG5ldyBMaXN0KCk7XHJcbiAgICBmb3IgKGludCBpID0gMCA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICBpZiAodG9rZW5zW2ldICE9IFwiXCIgKVxyXG4gICAgcmVzLmFkZEl0ZW0odG9rZW5zW2ldKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gKFN0cmluZyBbXSkocmVzLmdldEFsbEl0ZW1zIChTdHJpbmcuY2xhc3MpKTsqL1xyXG5cclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdHJhbnNsYXRlIGZyb20gc3RyaW5nIHRvIGhleGEgZHVtcCBjaGFyIGJ5IGNoYXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RyaW5nXCI+dG8gdHJhbnNsYXRlIGl0IHRvIHRoZSBieXRlIHN0cmVhbTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtaW5MZW5ndGhcIj50aGUgbWluaW1hbCBsZW5ndGggb2YgaGV4YSBkaWdpdHMgZm9yIGVhY2ggY2hhcjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgYnl0ZSBzdHJlYW0gaW4gZm9ybSBvZiBzdHJpbmc8L3JldHVybnM+XHJcbiAgc3RhdGljIHN0cmluZ1RvSGV4YUR1bXAoc3RyOiBzdHJpbmcsIG1pbkxlbmd0aDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBzdHJpbmdCdWlsZGVyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoc3RyLmxlbmd0aCAqIG1pbkxlbmd0aCk7XHJcbiAgICBmb3IgKGxldCBpbmR4OiBudW1iZXIgPSAwOyBpbmR4IDwgc3RyLmxlbmd0aDsgaW5keCA9IGluZHggKyAxKSB7XHJcbiAgICAgIGxldCBjdXJySW50OiBudW1iZXIgPSBzdHIuY2hhckNvZGVBdChpbmR4KTtcclxuICAgICAgbGV0IGhleFN0cjogc3RyaW5nID0gY3VyckludC50b1N0cmluZygxNik7XHJcbiAgICAgIHdoaWxlIChoZXhTdHIubGVuZ3RoIDwgbWluTGVuZ3RoKSB7XHJcbiAgICAgICAgaGV4U3RyID0gXCIwXCIgKyBoZXhTdHI7XHJcbiAgICAgIH1cclxuICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQoaGV4U3RyKTtcclxuICAgIH1cclxuICAgIHJldHVybiBzdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCkudG9VcHBlckNhc2UoKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBzZWFyY2hBbmRSZXBsYWNlKHN0cjogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcpOiBzdHJpbmc7XHJcbiAgc3RhdGljIHNlYXJjaEFuZFJlcGxhY2Uoc3RyOiBzdHJpbmcsIGZyb206IHN0cmluZ1tdLCB0bzogc3RyaW5nW10pOiBzdHJpbmc7XHJcbiAgc3RhdGljIHNlYXJjaEFuZFJlcGxhY2Uoc3RyOiBzdHJpbmcsIGZyb206IGFueSwgdG86IGFueSk6IHN0cmluZyB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiAoc3RyID09PSBudWxsIHx8IHN0ci5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nKSAmJiAoZnJvbSA9PT0gbnVsbCB8fCBmcm9tLmNvbnN0cnVjdG9yID09PSBTdHJpbmcpICYmICh0byA9PT0gbnVsbCB8fCB0by5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nKSkge1xyXG4gICAgICByZXR1cm4gU3RyVXRpbC5zZWFyY2hBbmRSZXBsYWNlXzAoc3RyLCBmcm9tLCB0byk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gU3RyVXRpbC5zZWFyY2hBbmRSZXBsYWNlXzEoc3RyLCBmcm9tLCB0byk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHJlcGxhY2UgZXZlcnkgYXBwZWFyYW5jZSBvZiAnZnJvbScgaW4gJ3N0cicgd2l0aCAndG8nPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0clwiPnRoZSB3b3JraW5nIGJhc2Ugc291cmNlIHN0cmluZyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZyb21cIj50aGUgc3RyaW5nIHRvIHJlcGxhY2UgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0b1wiPnRoZSBzdHJpbmcgdXNlIGluc3RlYWQgJ2Zyb20nIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBtb2RpZmllZCBTdHJpbmcgPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgc3RhdGljIHNlYXJjaEFuZFJlcGxhY2VfMChzdHI6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCBsYXN0U3ViU3RyOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHN0YXJ0U3ViU3RyOiBudW1iZXI7XHJcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmc7XHJcblxyXG4gICAgaWYgKChzdGFydFN1YlN0ciA9IHN0ci5pbmRleE9mKGZyb20pKSA9PT0gLTEpIHtcclxuICAgICAgcmVzdWx0ID0gc3RyO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBzdHJpbmdCdWlsZGVyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoc3RyLmxlbmd0aCk7XHJcbiAgICAgIHdoaWxlIChzdGFydFN1YlN0ciAhPT0gLTEpIHtcclxuICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZChzdHIuc3Vic3RyKGxhc3RTdWJTdHIsIHN0YXJ0U3ViU3RyIC0gbGFzdFN1YlN0cikgKyB0byk7XHJcbiAgICAgICAgc3RhcnRTdWJTdHIgPSBzdGFydFN1YlN0ciArIGZyb20ubGVuZ3RoO1xyXG4gICAgICAgIGxhc3RTdWJTdHIgPSBzdGFydFN1YlN0cjtcclxuICAgICAgICBzdGFydFN1YlN0ciA9IHN0ci5pbmRleE9mKGZyb20sIGxhc3RTdWJTdHIpO1xyXG4gICAgICB9XHJcbiAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKHN0ci5zdWJzdHIobGFzdFN1YlN0cikpO1xyXG4gICAgICByZXN1bHQgPSBzdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiByZXBsYWNlIGV2ZXJ5IGFwcGVhcmFuY2Ugb2Ygc3RyaW5ncyBvZiAnZnJvbScgaW4gJ3N0cicgd2l0aCB0aGUgYWNjb3JkaW5nIHN0cmluZyBpbiAndG8nPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0clwiPnRoZSB3b3JraW5nIGJhc2Ugc291cmNlIHN0cmluZyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZyb21cIj50aGUgc3RyaW5nIHRvIHJlcGxhY2UgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0b1wiPnRoZSBzdHJpbmcgdXNlIGluc3RlYWQgJ2Zyb20nIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBtb2RpZmllZCBTdHJpbmcgPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgc3RhdGljIHNlYXJjaEFuZFJlcGxhY2VfMShzdHI6IHN0cmluZywgZnJvbTogc3RyaW5nW10sIHRvOiBzdHJpbmdbXSk6IHN0cmluZyB7XHJcbiAgICBsZXQgbGFzdFN1YlN0cjogbnVtYmVyID0gMDtcclxuICAgIGxldCBzYXJJbmRleDogbnVtYmVyID0gMDtcclxuICAgIGxldCBmcm9tQ29weTogc3RyaW5nW10gPSBmcm9tLnNsaWNlKCk7XHJcbiAgICBsZXQgc3RhcnRTdWJTdHI6IG51bWJlcjtcclxuICAgIGxldCBTQVJpbmRleDogUmVmUGFyYW08bnVtYmVyPiA9IG5ldyBSZWZQYXJhbSgwKTtcclxuICAgIHN0YXJ0U3ViU3RyID0gU3RyVXRpbC5pbmRleE9mKHN0ciwgZnJvbUNvcHksIGxhc3RTdWJTdHIsIFNBUmluZGV4KTtcclxuICAgIHNhckluZGV4ID0gU0FSaW5kZXgudmFsdWU7XHJcbiAgICBpZiAoc3RhcnRTdWJTdHIgPT09IC0xKVxyXG4gICAgICByZXR1cm4gc3RyO1xyXG5cclxuICAgIGxldCByZXN1bHQ6IHN0cmluZztcclxuICAgIGxldCB0bXBCdWY6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihzdHIubGVuZ3RoKTtcclxuICAgIHdoaWxlIChzdGFydFN1YlN0ciAhPT0gLTEpIHtcclxuICAgICAgdG1wQnVmLkFwcGVuZChzdHIuc3Vic3RyKGxhc3RTdWJTdHIsIHN0YXJ0U3ViU3RyIC0gbGFzdFN1YlN0cikgKyB0b1tzYXJJbmRleF0pO1xyXG4gICAgICBzdGFydFN1YlN0ciArPSBmcm9tQ29weVtzYXJJbmRleF0ubGVuZ3RoO1xyXG4gICAgICBsYXN0U3ViU3RyID0gc3RhcnRTdWJTdHI7XHJcbiAgICAgIHN0YXJ0U3ViU3RyID0gU3RyVXRpbC5pbmRleE9mKHN0ciwgZnJvbUNvcHksIGxhc3RTdWJTdHIsIFNBUmluZGV4KTtcclxuICAgICAgc2FySW5kZXggPSBTQVJpbmRleC52YWx1ZTtcclxuICAgICAgfTtcclxuICAgIHRtcEJ1Zi5BcHBlbmQoc3RyLnN1YnN0cihsYXN0U3ViU3RyKSk7XHJcbiAgICByZXN1bHQgPSB0bXBCdWYuVG9TdHJpbmcoKTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiB0aGlzIGZ1bmN0aW9ucyBpcyBmb3IgdXNlIGJ5IHRoZSBzZWFyY2hBbmRSZXBsYWNlKCkgZnVuY3Rpb24gLVxyXG4gIC8vLyBzZWFyY2hlcyB0aGUgb2Zmc2V0IG9mIHRoZSBzdHJpbmdzIGZyb20gdGhlIGFycmF5IGluIHRoZSBnaXZlbiBzdHJpbmdcclxuICAvLy8gYW5kIHJldHVybnMgdGhlIG1pbmltdW0gb2Zmc2V0IGZvdW5kIGFuZCBzZXRzIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgc3RyaW5nXHJcbiAgLy8vIHRvIFNBUmluZGV4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJcIj50aGUgc3RyaW5nIHRvIHNlYXJjaCBpbiA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0cmluZ3NcIj5hbiBhcnJheSBvZiBzdHJpbmdzIHRvIHNlYXJjaCBmb3IgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvZmZzZXRcIj53aGVyZSB0byBzdGFydCB0aGUgc2VhcmNoIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgaW5kZXhPZihzdHI6IHN0cmluZywgc3RyaW5nczogc3RyaW5nW10sIG9mZnNldDogbnVtYmVyLCBTQVJpbmRleDogUmVmUGFyYW08bnVtYmVyPik6IG51bWJlciB7XHJcbiAgICBsZXQgbWluT2Zmc2V0OiBudW1iZXIgPSAtMTtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGxldCBmbGFnOiBib29sZWFuID0gc3RyaW5nc1tpXSA9PT0gbnVsbDtcclxuICAgICAgaWYgKCEoc3RyaW5nc1tpXSA9PT0gbnVsbCkpIHtcclxuICAgICAgICBsZXQgcmVzdWx0T2Zmc2V0OiBudW1iZXIgPSBzdHIuaW5kZXhPZihzdHJpbmdzW2ldLCBvZmZzZXQpO1xyXG5cclxuICAgICAgICBpZiAocmVzdWx0T2Zmc2V0ID09PSAtMSkge1xyXG4gICAgICAgICAgc3RyaW5nc1tpXSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgaWYgKHJlc3VsdE9mZnNldCA8IG1pbk9mZnNldCB8fCBtaW5PZmZzZXQgPT09IC0xKSB7XHJcbiAgICAgICAgICAgIG1pbk9mZnNldCA9IHJlc3VsdE9mZnNldDtcclxuICAgICAgICAgICAgU0FSaW5kZXgudmFsdWUgPSBpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXN1bHQ6IG51bWJlcjtcclxuICAgIGlmIChtaW5PZmZzZXQgPiAtMSkge1xyXG4gICAgICByZXN1bHQgPSBtaW5PZmZzZXQ7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgU0FSaW5kZXgudmFsdWUgPSAtMTtcclxuICAgICAgcmVzdWx0ID0gLTE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiByZXBsYWNlIHRva2VucyBpbiB1c2VyIHN0cmluZyBieSB2ZWN0b3IgdmFsdWVzIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ1c2VyU3RyaW5nXCI+LSB1c2VyIGJ1ZmZlciBsaWtlIFwiVXNlciAlZCwgJWQgc3RyaW5nXCJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0b2tlblwiPi0gdG9rZW4gdXNlZCBpbiB1c2VyIHN0cmluZyAtIGkuZS4gXCIlZFwiXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib2NjdXJyZW5jZVwiPi0gbnVtYmVyIG9mIHRva2VuIHdoZXJlIHJlcGxhY2Ugd2lsbCB0YWtlIHBhcnQgKDEgZm9yIGZpcnN0IG9jY3VycmVuY2UpXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVcIj4tIHZhbHVlIHRvIGJlIGluc2VydGVkIGluc3RlZCBvZiB0b2tlblxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHN0YXRpYyByZXBsYWNlU3RyaW5nVG9rZW5zKHVzZXJTdHJpbmc6IHN0cmluZywgdG9rZW46IHN0cmluZywgb2NjdXJyZW5jZTogbnVtYmVyLCB2YWw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgdG9rZW5MZW46IG51bWJlciA9IHRva2VuLmxlbmd0aDtcclxuICAgIGxldCBjdXJyUG9zaXRpb246IG51bWJlciA9IDA7XHJcbiAgICBsZXQgbmV3U3RyaW5nOiBzdHJpbmcgPSB1c2VyU3RyaW5nO1xyXG5cclxuICAgIGlmICh2YWwgIT09IG51bGwpIHtcclxuICAgICAgbGV0IG51bTI6IG51bWJlciA9IDA7XHJcbiAgICAgIHdoaWxlIChudW0yIDwgb2NjdXJyZW5jZSAmJiBjdXJyUG9zaXRpb24gIT09IC0xKSB7XHJcbiAgICAgICAgY3VyclBvc2l0aW9uID0gdXNlclN0cmluZy5pbmRleE9mKHRva2VuLCBjdXJyUG9zaXRpb24gKyAoKG51bTIgPT09IDApID8gMCA6IHRva2VuTGVuKSk7XHJcbiAgICAgICAgbnVtMiA9IG51bTIgKyAxO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY3VyclBvc2l0aW9uICE9PSAtMSkge1xyXG4gICAgICAgIG5ld1N0cmluZyA9IHVzZXJTdHJpbmcuc3Vic3RyKDAsIGN1cnJQb3NpdGlvbikgKyB2YWwgKyB1c2VyU3RyaW5nLnN1YnN0cihjdXJyUG9zaXRpb24gKyB0b2tlbkxlbiwgdXNlclN0cmluZy5sZW5ndGggLSAoY3VyclBvc2l0aW9uICsgdG9rZW5MZW4pKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ld1N0cmluZztcclxuICB9XHJcblxyXG4gIHN0YXRpYyBtYWtlUHJpbnRhYmxlVG9rZW5zKHNvdXJjZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcpOiBzdHJpbmc7XHJcbiAgc3RhdGljIG1ha2VQcmludGFibGVUb2tlbnMoc291cmNlOiBzdHJpbmcsIHR5cGU6IG51bWJlcik6IHN0cmluZztcclxuICBzdGF0aWMgbWFrZVByaW50YWJsZVRva2Vucyhzb3VyY2U6IExpc3Q8c3RyaW5nPiwgdHlwZTogbnVtYmVyKTogc3RyaW5nO1xyXG4gIHN0YXRpYyBtYWtlUHJpbnRhYmxlVG9rZW5zKHNvdXJjZTogYW55LCB0eXBlOiBhbnkpOiBzdHJpbmcgfCB2b2lke1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIgJiYgKHNvdXJjZSA9PT0gbnVsbCB8fCBzb3VyY2UuY29uc3RydWN0b3IgPT09IFN0cmluZykgJiYgKHR5cGUgPT09IG51bGwgfHwgdHlwZS5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSkge1xyXG4gICAgICByZXR1cm4gU3RyVXRpbC5tYWtlUHJpbnRhYmxlVG9rZW5zXzAoc291cmNlLCB0eXBlKTtcclxuICAgIH1cclxuICAgIFN0clV0aWwubWFrZVByaW50YWJsZVRva2Vuc18xKHNvdXJjZSwgdHlwZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY29udmVydHMgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIGEgdG9rZW4gdG8gYSBwcmludGFibGUgZm9ybWF0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInNvdXJjZVwiPmEgdG9rZW4gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInR5cGVcIj50eXBlIG9mIGNvbnZlcnNpb246IFNUUl8yX0hUTUwsIFNFUV8yX0hUTUwsIEhUTUxfMl9TRVEsIEhUTUxfMl9TVFIsIFNFUV8yX1NUUiA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdG9rZW4gd2l0aCBjb252ZXJ0ZWQgc3BlY2lhbCBjaGFyYWN0ZXJzIDwvcmV0dXJucz5cclxuICBzdGF0aWMgbWFrZVByaW50YWJsZVRva2Vuc18wKHNvdXJjZTogc3RyaW5nLCB0eXBlOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IGVzY1N0cjogc3RyaW5nW10gPSBbXHJcbiAgICAgIFwiXFxcXFwiLCBcIi1cIiwgXCIsXCJcclxuICAgIF07XHJcbiAgICBsZXQgZXNjU2VxOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJcXFxcXFxcXFwiLCBcIlxcXFwtXCIsIFwiXFxcXCxcIlxyXG4gICAgXTtcclxuICAgIGxldCBlc2NIdG06IHN0cmluZ1tdID0gW1xyXG4gICAgICBIVE1MX0JBQ0tTTEFTSCwgSFRNTF9IWVBIRU4sIEhUTUxfQ09NTUFcclxuICAgIF07XHJcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmc7XHJcbiAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgY2FzZSBTVFJfMl9IVE1MOlxyXG4gICAgICAgIHJlc3VsdCA9IFN0clV0aWwuc2VhcmNoQW5kUmVwbGFjZShzb3VyY2UsIGVzY1N0ciwgZXNjSHRtKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBTRVFfMl9IVE1MOlxyXG4gICAgICAgIHJlc3VsdCA9IFN0clV0aWwuc2VhcmNoQW5kUmVwbGFjZShzb3VyY2UsIGVzY1NlcSwgZXNjSHRtKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBIVE1MXzJfU0VROlxyXG4gICAgICAgIHJlc3VsdCA9IFN0clV0aWwuc2VhcmNoQW5kUmVwbGFjZShzb3VyY2UsIGVzY0h0bSwgZXNjU2VxKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBIVE1MXzJfU1RSOlxyXG4gICAgICAgIHJlc3VsdCA9IFN0clV0aWwuc2VhcmNoQW5kUmVwbGFjZShzb3VyY2UsIGVzY0h0bSwgZXNjU3RyKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBTRVFfMl9TVFI6XHJcbiAgICAgICAgcmVzdWx0ID0gU3RyVXRpbC5zZWFyY2hBbmRSZXBsYWNlKHNvdXJjZSwgZXNjU2VxLCBlc2NTdHIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJlc3VsdCA9IHNvdXJjZTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvbnZlcnRzIHNwZWNpYWwgY2hhcmFjdGVycyBpbiBhIHRva2VucyBjb2xsZWN0aW9uIHRvIGEgcHJpbnRhYmxlIGZvcm1hdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzb3VyY2VcIj52ZWN0b3Igb2Ygc3RyaW5ncyBiZWZvcmUgdG9rZW5haXplciA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidHlwZVwiPnR5cGUgb2YgY29udmVyc2lvbjogU1RSXzJfSFRNTCwgU0VRXzJfSFRNTCwgSFRNTF8yX1NFUSwgSFRNTF8yX1NUUiA8L3BhcmFtPlxyXG4gIHByaXZhdGUgc3RhdGljIG1ha2VQcmludGFibGVUb2tlbnNfMShzb3VyY2U6IExpc3Q8c3RyaW5nPiwgdHlwZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoc291cmNlICE9PSBudWxsKSB7XHJcbiAgICAgIGxldCBsZW5ndGg6IG51bWJlciA9IHNvdXJjZS5sZW5ndGg7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBsZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGxldCBjdXJyRWxtOiBzdHJpbmcgPSBzb3VyY2UuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgICAgc291cmNlLnNldF9JdGVtKGksIFN0clV0aWwubWFrZVByaW50YWJsZVRva2Vuc18wKGN1cnJFbG0sIHR5cGUpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoYW5nZSBub24tcHJpbnRhYmxlIGNoYXJhY3RlcnMgbGlrZSBcIm5ldyBsaW5lXCIgYW5kIFwibGluZSBmZWVkXCIgdG8gdGhlaXJcclxuICAvLy8gICBwcmludGFibGUgcmVwcmVzZW50YXRpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic291cmNlXCI+aXMgdGhlIHN0cmluZyB3aXRoIG5vbi1wcmludGFibGUgY2hhcmFjdGVycyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIG5ldyBzdHJpbmcgd2hlcmUgYWxsIHRoZSBub24tcHJpbnRhYmxlIGNoYXJhY3RlcnMgYXJlIGNvbnZlcnRlZCA8L3JldHVybnM+XHJcbiAgc3RhdGljIG1ha2VQcmludGFibGUoc291cmNlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbGV0IGZyb206IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIlxcblwiLCBcIlxcclwiLCBcIidcIiwgXCJcXFxcXCIsIFwiXFxcIlwiLCBcIlxcMFwiXHJcbiAgICBdO1xyXG4gICAgbGV0IHRvOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJcXFxcblwiLCBcIlxcXFxyXCIsIFwiXFxcXCdcIiwgXCJcXFxcXFxcXFwiLCBcIlxcXFxcXFwiXCIsIFwiXFxcXDBcIlxyXG4gICAgXTtcclxuICAgIHJldHVybiBTdHJVdGlsLnNlYXJjaEFuZFJlcGxhY2Uoc291cmNlLCBmcm9tLCB0byk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hhbmdlIG5vbi1wcmludGFibGUgY2hhcmFjdGVycyBsaWtlIFwibmV3IGxpbmVcIiBhbmQgXCJsaW5lIGZlZWRcIiB0byB0aGVpclxyXG4gIC8vLyAgIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiAoc2ltcGxpZmllZCB2ZXJzaW9uIGZvciByYW5nZSBlcnJvciBtZXNzYWdlKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzb3VyY2VcIj5pcyB0aGUgc3RyaW5nIHdpdGggbm9uLXByaW50YWJsZSBjaGFyYWN0ZXJzIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgbmV3IHN0cmluZyB3aGVyZSBhbGwgdGhlIG5vbi1wcmludGFibGUgY2hhcmFjdGVycyBhcmUgY29udmVydGVkIDwvcmV0dXJucz5cclxuICBzdGF0aWMgbWFrZVByaW50YWJsZTIoc291cmNlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbGV0IGZyb206IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIlxcblwiLCBcIlxcclwiLCBcIlxcMFwiXHJcbiAgICBdO1xyXG4gICAgbGV0IHRvOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJcXFxcblwiLCBcIlxcXFxyXCIsIFwiXFxcXDBcIlxyXG4gICAgXTtcclxuICAgIHJldHVybiBTdHJVdGlsLnNlYXJjaEFuZFJlcGxhY2Uoc291cmNlLCBmcm9tLCB0byk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsZW5cIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIFpzdHJpbmdNYWtlKHM6IHN0cmluZywgbGVuOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGVuID0gU3RyVXRpbC5tZW1fdHJpbShzLCBsZW4pO1xyXG4gICAgcmV0dXJuIHMuc3Vic3RyKDAsIGxlbik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+KHB1YmxpYylcclxuICAvLy8gcmV0dXJucyBwbGFpbiB0ZXh0IGZyb20gcnRmIHRleHRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJ0ZlRleHRcIj5yZWZlciB0byB0aGUgc3VtbWFyeTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPnJlZmVyIHRvIHRoZSBzdW1tYXJ5PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBHZXRQbGFpblRleHRmcm9tUnRmKHJ0ZlRleHQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoUnRmLmlzUnRmKHJ0ZlRleHQpKSB7XHJcbiAgICAgIGxldCBydGY6IFJ0ZiA9IG5ldyBSdGYoKTtcclxuICAgICAgbGV0IG91dHB1dFR4dDogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKFwiXCIpO1xyXG4gICAgICBydGYudG9UeHQocnRmVGV4dCwgb3V0cHV0VHh0KTtcclxuICAgICAgcnRmVGV4dCA9IG91dHB1dFR4dC5Ub1N0cmluZygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJ0ZlRleHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3RyaW5nIGFycmF5cyBzdHIxICYgc3RyMiBhcmUgZXF1YWxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0cjFcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0cjJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIFN0cmluZ3NBcnJheXNFcXVhbChzdHIxOiBzdHJpbmdbXSwgc3RyMjogc3RyaW5nW10pOiBib29sZWFuIHtcclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW47XHJcbiAgICBpZiAoc3RyMSA9PT0gbnVsbCAmJiBzdHIyID09PSBudWxsKSB7XHJcbiAgICAgIHJlc3VsdCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHN0cjEgPT09IG51bGwgfHwgc3RyMiA9PT0gbnVsbCkge1xyXG4gICAgICAgIHJlc3VsdCA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChzdHIxLmxlbmd0aCAhPT0gc3RyMi5sZW5ndGgpIHtcclxuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGZvciAobGV0IGluZGV4OiBudW1iZXIgPSAwOyBpbmRleCA8IDxudW1iZXI+c3RyMS5sZW5ndGg7IGluZGV4ID0gaW5kZXggKyAxKSB7XHJcbiAgICAgICAgICAgIGlmICgoc3RyMVtpbmRleF0gIT09IHN0cjJbaW5kZXhdKSkge1xyXG4gICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJlc3VsdCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBUaGUgY29kZSBpcyBjb3BpZWQgZnJvbSB0c2tfb3Blbl9ibmRfd2lsZCBhbmQgU2VhcmNoQW5kUmVwbGFjZVdpbGRDaGFyc1xyXG4gIC8vLyBUaGUgcmVmYWN0b3JpbmcgaXMgbm90IHBlcmZvcm1lZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcclxuICAvLy8gVGhlIGNvZGUgcmVwbGFjZXMgc3BlY2lhbCBjaGFyYWNodGVycyA6KiA/IHdpdGggcmVjaWV2ZWQgZmlsbGVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBTZWFyY2hBbmRSZXBsYWNlV2lsZENoYXJzKGJ1Zjogc3RyaW5nLCBsZW46IG51bWJlciwgZmlsbGVyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgYnVmID0gTlN0cmluZy5QYWRSaWdodChidWYsIGxlbik7XHJcblxyXG4gICAgbGV0IGVzY0NoYXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBzdG9wU2VhcmNoOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgdG1wQnVmOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIobGVuKTtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBsZW47IGkgPSBpICsgMSkge1xyXG4gICAgICBzd2l0Y2ggKGJ1ZltpXSkge1xyXG4gICAgICAgIGNhc2UgKCdcXFxcJyk6IHtcclxuICAgICAgICAgIGxldCBpc05leHRDaGFyV2lsZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgICAgICAgLy9JZiBuZXh0IGNoYXIgaXMgbm90IHdpbGQgLCB0aGVuIGNvcHkgJ1xcJywgaWYgdGhpcyBpcyBmaXJzdCBjaGFyLlxyXG4gICAgICAgICAgaWYgKChpICsgMSA8IGxlbikgJiYgKGJ1ZltpICsgMV0gIT0gJyonICYmIGJ1ZltpICsgMV0gIT0gJ1xcXFwnKSlcclxuICAgICAgICAgICAgaXNOZXh0Q2hhcldpbGQgPSBmYWxzZTtcclxuICAgICAgICAgIGlmIChlc2NDaGFyIHx8ICFpc05leHRDaGFyV2lsZClcclxuICAgICAgICAgICAgdG1wQnVmLkFwcGVuZChidWZbaV0pO1xyXG4gICAgICAgICAgZXNjQ2hhciA9ICFlc2NDaGFyO1xyXG4gICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgKCcqJyk6XHJcbiAgICAgICAgICBpZiAoZXNjQ2hhcilcclxuICAgICAgICAgICAgdG1wQnVmLkFwcGVuZChidWZbaV0pO1xyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRtcEJ1Zi5BcHBlbmQoZmlsbGVyLCBsZW4gLSB0bXBCdWYuTGVuZ3RoKTtcclxuICAgICAgICAgICAgc3RvcFNlYXJjaCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlc2NDaGFyID0gZmFsc2U7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICc/JzpcclxuICAgICAgICAgIHRtcEJ1Zi5BcHBlbmQoZmlsbGVyKTtcclxuICAgICAgICAgIGVzY0NoYXIgPSBmYWxzZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICB0bXBCdWYuQXBwZW5kKGJ1ZltpXSk7XHJcbiAgICAgICAgICBlc2NDaGFyID0gZmFsc2U7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCB0ZXh0OiBzdHJpbmcgPSB0bXBCdWYuVG9TdHJpbmcoKTtcclxuICAgIHJldHVybiBOU3RyaW5nLlRyaW1FbmQoTlN0cmluZy5UcmltRW5kKHRleHQsIFsnXFwwJ10pKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmVtb3ZlIHRoZSB0YXNrIHBhdGggZGVsaW1pdGVyIGZyb20gdGhlIGVycm9yIHN0cmluZy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic291cmNlXCI+c3RyaW5nIHdpdGggZGVsaW1pdGVyIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBzdHJpbmcgZm9yIGNvbnNvbGUgZXJyb3IgPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBnZXRDb25zb2xlRXJvclN0cmluZyhzb3VyY2U6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgY29uc29sZUVyb3JTdHJpbmc6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChzb3VyY2UpKVxyXG4gICAgICBjb25zb2xlRXJvclN0cmluZyA9IHRoaXMuc2VhcmNoQW5kUmVwbGFjZShzb3VyY2UsIFRBU0tfUEFUSF9ERUxJTUlURVIsIFwiXCIpO1xyXG5cclxuICAgIHJldHVybiBjb25zb2xlRXJvclN0cmluZztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmVtb3ZlIHRoZSB0YXNrIHBhdGggZnJvbSB0aGUgZXJyb3Igc3RyaW5nLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzb3VyY2VcIj5zdHJpbmcgd2l0aCBkZWxpbWl0ZXIgPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHN0cmluZyBmb3IgY29uc29sZSBlcnJvciA8L3JldHVybnM+XHJcbiAgc3RhdGljIGdldE1zZ0JveEVyb3JTdHJpbmcoc291cmNlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbGV0IHRva2Vuczogc3RyaW5nIFtdO1xyXG4gICAgbGV0IG1zZ0JveEVyb3JTdHJpbmc6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihcIlwiKTtcclxuXHJcbiAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKHNvdXJjZSkpe1xyXG4gICAgICB0b2tlbnMgPSB0aGlzLnRva2VuaXplKHNvdXJjZSwgVEFTS19QQVRIX0RFTElNSVRFUik7XHJcblxyXG4gICAgICBmb3IgKGxldCBpOm51bWJlciA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspXHJcbiAgICAgIHtcclxuICAgICAgICBtc2dCb3hFcm9yU3RyaW5nLkFwcGVuZCh0b2tlbnNbaV0pO1xyXG4gICAgICAgIGkrKztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgcmV0dXJuIG1zZ0JveEVyb3JTdHJpbmcudG9TdHJpbmcoKTtcclxuICB9XHJcbn1cclxuIl19