milkio 1.0.0-beta.162 → 1.0.0-beta.164
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/index.js +38 -38
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -456,7 +456,7 @@ async function createWorld(generated, configSchema, options) {
|
|
|
456
456
|
function typia(init) {
|
|
457
457
|
return init;
|
|
458
458
|
}
|
|
459
|
-
// node_modules/date-fns/constants.js
|
|
459
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/constants.js
|
|
460
460
|
var daysInYear = 365.2425;
|
|
461
461
|
var maxTime = Math.pow(10, 8) * 24 * 60 * 60 * 1000;
|
|
462
462
|
var minTime = -maxTime;
|
|
@@ -470,7 +470,7 @@ var secondsInMonth = secondsInYear / 12;
|
|
|
470
470
|
var secondsInQuarter = secondsInMonth * 3;
|
|
471
471
|
var constructFromSymbol = Symbol.for("constructDateFrom");
|
|
472
472
|
|
|
473
|
-
// node_modules/date-fns/constructFrom.js
|
|
473
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/constructFrom.js
|
|
474
474
|
function constructFrom(date, value) {
|
|
475
475
|
if (typeof date === "function")
|
|
476
476
|
return date(value);
|
|
@@ -481,18 +481,18 @@ function constructFrom(date, value) {
|
|
|
481
481
|
return new Date(value);
|
|
482
482
|
}
|
|
483
483
|
|
|
484
|
-
// node_modules/date-fns/toDate.js
|
|
484
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/toDate.js
|
|
485
485
|
function toDate(argument, context) {
|
|
486
486
|
return constructFrom(context || argument, argument);
|
|
487
487
|
}
|
|
488
488
|
|
|
489
|
-
// node_modules/date-fns/_lib/defaultOptions.js
|
|
489
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/_lib/defaultOptions.js
|
|
490
490
|
var defaultOptions = {};
|
|
491
491
|
function getDefaultOptions() {
|
|
492
492
|
return defaultOptions;
|
|
493
493
|
}
|
|
494
494
|
|
|
495
|
-
// node_modules/date-fns/startOfWeek.js
|
|
495
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/startOfWeek.js
|
|
496
496
|
function startOfWeek(date, options) {
|
|
497
497
|
const defaultOptions2 = getDefaultOptions();
|
|
498
498
|
const weekStartsOn = options?.weekStartsOn ?? options?.locale?.options?.weekStartsOn ?? defaultOptions2.weekStartsOn ?? defaultOptions2.locale?.options?.weekStartsOn ?? 0;
|
|
@@ -504,12 +504,12 @@ function startOfWeek(date, options) {
|
|
|
504
504
|
return _date;
|
|
505
505
|
}
|
|
506
506
|
|
|
507
|
-
// node_modules/date-fns/startOfISOWeek.js
|
|
507
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/startOfISOWeek.js
|
|
508
508
|
function startOfISOWeek(date, options) {
|
|
509
509
|
return startOfWeek(date, { ...options, weekStartsOn: 1 });
|
|
510
510
|
}
|
|
511
511
|
|
|
512
|
-
// node_modules/date-fns/getISOWeekYear.js
|
|
512
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/getISOWeekYear.js
|
|
513
513
|
function getISOWeekYear(date, options) {
|
|
514
514
|
const _date = toDate(date, options?.in);
|
|
515
515
|
const year = _date.getFullYear();
|
|
@@ -530,7 +530,7 @@ function getISOWeekYear(date, options) {
|
|
|
530
530
|
}
|
|
531
531
|
}
|
|
532
532
|
|
|
533
|
-
// node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js
|
|
533
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js
|
|
534
534
|
function getTimezoneOffsetInMilliseconds(date) {
|
|
535
535
|
const _date = toDate(date);
|
|
536
536
|
const utcDate = new Date(Date.UTC(_date.getFullYear(), _date.getMonth(), _date.getDate(), _date.getHours(), _date.getMinutes(), _date.getSeconds(), _date.getMilliseconds()));
|
|
@@ -538,20 +538,20 @@ function getTimezoneOffsetInMilliseconds(date) {
|
|
|
538
538
|
return +date - +utcDate;
|
|
539
539
|
}
|
|
540
540
|
|
|
541
|
-
// node_modules/date-fns/_lib/normalizeDates.js
|
|
541
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/_lib/normalizeDates.js
|
|
542
542
|
function normalizeDates(context, ...dates) {
|
|
543
543
|
const normalize = constructFrom.bind(null, context || dates.find((date) => typeof date === "object"));
|
|
544
544
|
return dates.map(normalize);
|
|
545
545
|
}
|
|
546
546
|
|
|
547
|
-
// node_modules/date-fns/startOfDay.js
|
|
547
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/startOfDay.js
|
|
548
548
|
function startOfDay(date, options) {
|
|
549
549
|
const _date = toDate(date, options?.in);
|
|
550
550
|
_date.setHours(0, 0, 0, 0);
|
|
551
551
|
return _date;
|
|
552
552
|
}
|
|
553
553
|
|
|
554
|
-
// node_modules/date-fns/differenceInCalendarDays.js
|
|
554
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/differenceInCalendarDays.js
|
|
555
555
|
function differenceInCalendarDays(laterDate, earlierDate, options) {
|
|
556
556
|
const [laterDate_, earlierDate_] = normalizeDates(options?.in, laterDate, earlierDate);
|
|
557
557
|
const laterStartOfDay = startOfDay(laterDate_);
|
|
@@ -561,7 +561,7 @@ function differenceInCalendarDays(laterDate, earlierDate, options) {
|
|
|
561
561
|
return Math.round((laterTimestamp - earlierTimestamp) / millisecondsInDay);
|
|
562
562
|
}
|
|
563
563
|
|
|
564
|
-
// node_modules/date-fns/startOfISOWeekYear.js
|
|
564
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/startOfISOWeekYear.js
|
|
565
565
|
function startOfISOWeekYear(date, options) {
|
|
566
566
|
const year = getISOWeekYear(date, options);
|
|
567
567
|
const fourthOfJanuary = constructFrom(options?.in || date, 0);
|
|
@@ -570,17 +570,17 @@ function startOfISOWeekYear(date, options) {
|
|
|
570
570
|
return startOfISOWeek(fourthOfJanuary);
|
|
571
571
|
}
|
|
572
572
|
|
|
573
|
-
// node_modules/date-fns/isDate.js
|
|
573
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/isDate.js
|
|
574
574
|
function isDate(value) {
|
|
575
575
|
return value instanceof Date || typeof value === "object" && Object.prototype.toString.call(value) === "[object Date]";
|
|
576
576
|
}
|
|
577
577
|
|
|
578
|
-
// node_modules/date-fns/isValid.js
|
|
578
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/isValid.js
|
|
579
579
|
function isValid(date) {
|
|
580
580
|
return !(!isDate(date) && typeof date !== "number" || isNaN(+toDate(date)));
|
|
581
581
|
}
|
|
582
582
|
|
|
583
|
-
// node_modules/date-fns/startOfYear.js
|
|
583
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/startOfYear.js
|
|
584
584
|
function startOfYear(date, options) {
|
|
585
585
|
const date_ = toDate(date, options?.in);
|
|
586
586
|
date_.setFullYear(date_.getFullYear(), 0, 1);
|
|
@@ -588,7 +588,7 @@ function startOfYear(date, options) {
|
|
|
588
588
|
return date_;
|
|
589
589
|
}
|
|
590
590
|
|
|
591
|
-
// node_modules/date-fns/locale/en-US/_lib/formatDistance.js
|
|
591
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/locale/en-US/_lib/formatDistance.js
|
|
592
592
|
var formatDistanceLocale = {
|
|
593
593
|
lessThanXSeconds: {
|
|
594
594
|
one: "less than a second",
|
|
@@ -672,7 +672,7 @@ var formatDistance = (token, count, options) => {
|
|
|
672
672
|
return result;
|
|
673
673
|
};
|
|
674
674
|
|
|
675
|
-
// node_modules/date-fns/locale/_lib/buildFormatLongFn.js
|
|
675
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/locale/_lib/buildFormatLongFn.js
|
|
676
676
|
function buildFormatLongFn(args) {
|
|
677
677
|
return (options = {}) => {
|
|
678
678
|
const width = options.width ? String(options.width) : args.defaultWidth;
|
|
@@ -681,7 +681,7 @@ function buildFormatLongFn(args) {
|
|
|
681
681
|
};
|
|
682
682
|
}
|
|
683
683
|
|
|
684
|
-
// node_modules/date-fns/locale/en-US/_lib/formatLong.js
|
|
684
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/locale/en-US/_lib/formatLong.js
|
|
685
685
|
var dateFormats = {
|
|
686
686
|
full: "EEEE, MMMM do, y",
|
|
687
687
|
long: "MMMM do, y",
|
|
@@ -715,7 +715,7 @@ var formatLong = {
|
|
|
715
715
|
})
|
|
716
716
|
};
|
|
717
717
|
|
|
718
|
-
// node_modules/date-fns/locale/en-US/_lib/formatRelative.js
|
|
718
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/locale/en-US/_lib/formatRelative.js
|
|
719
719
|
var formatRelativeLocale = {
|
|
720
720
|
lastWeek: "'last' eeee 'at' p",
|
|
721
721
|
yesterday: "'yesterday at' p",
|
|
@@ -726,7 +726,7 @@ var formatRelativeLocale = {
|
|
|
726
726
|
};
|
|
727
727
|
var formatRelative = (token, _date, _baseDate, _options) => formatRelativeLocale[token];
|
|
728
728
|
|
|
729
|
-
// node_modules/date-fns/locale/_lib/buildLocalizeFn.js
|
|
729
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/locale/_lib/buildLocalizeFn.js
|
|
730
730
|
function buildLocalizeFn(args) {
|
|
731
731
|
return (value, options) => {
|
|
732
732
|
const context = options?.context ? String(options.context) : "standalone";
|
|
@@ -745,7 +745,7 @@ function buildLocalizeFn(args) {
|
|
|
745
745
|
};
|
|
746
746
|
}
|
|
747
747
|
|
|
748
|
-
// node_modules/date-fns/locale/en-US/_lib/localize.js
|
|
748
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/locale/en-US/_lib/localize.js
|
|
749
749
|
var eraValues = {
|
|
750
750
|
narrow: ["B", "A"],
|
|
751
751
|
abbreviated: ["BC", "AD"],
|
|
@@ -907,7 +907,7 @@ var localize = {
|
|
|
907
907
|
})
|
|
908
908
|
};
|
|
909
909
|
|
|
910
|
-
// node_modules/date-fns/locale/_lib/buildMatchFn.js
|
|
910
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/locale/_lib/buildMatchFn.js
|
|
911
911
|
function buildMatchFn(args) {
|
|
912
912
|
return (string, options = {}) => {
|
|
913
913
|
const width = options.width;
|
|
@@ -943,7 +943,7 @@ function findIndex(array, predicate) {
|
|
|
943
943
|
return;
|
|
944
944
|
}
|
|
945
945
|
|
|
946
|
-
// node_modules/date-fns/locale/_lib/buildMatchPatternFn.js
|
|
946
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js
|
|
947
947
|
function buildMatchPatternFn(args) {
|
|
948
948
|
return (string, options = {}) => {
|
|
949
949
|
const matchResult = string.match(args.matchPattern);
|
|
@@ -960,7 +960,7 @@ function buildMatchPatternFn(args) {
|
|
|
960
960
|
};
|
|
961
961
|
}
|
|
962
962
|
|
|
963
|
-
// node_modules/date-fns/locale/en-US/_lib/match.js
|
|
963
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/locale/en-US/_lib/match.js
|
|
964
964
|
var matchOrdinalNumberPattern = /^(\d+)(th|st|nd|rd)?/i;
|
|
965
965
|
var parseOrdinalNumberPattern = /\d+/i;
|
|
966
966
|
var matchEraPatterns = {
|
|
@@ -1079,7 +1079,7 @@ var match = {
|
|
|
1079
1079
|
})
|
|
1080
1080
|
};
|
|
1081
1081
|
|
|
1082
|
-
// node_modules/date-fns/locale/en-US.js
|
|
1082
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/locale/en-US.js
|
|
1083
1083
|
var enUS = {
|
|
1084
1084
|
code: "en-US",
|
|
1085
1085
|
formatDistance,
|
|
@@ -1092,7 +1092,7 @@ var enUS = {
|
|
|
1092
1092
|
firstWeekContainsDate: 1
|
|
1093
1093
|
}
|
|
1094
1094
|
};
|
|
1095
|
-
// node_modules/date-fns/getDayOfYear.js
|
|
1095
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/getDayOfYear.js
|
|
1096
1096
|
function getDayOfYear(date, options) {
|
|
1097
1097
|
const _date = toDate(date, options?.in);
|
|
1098
1098
|
const diff = differenceInCalendarDays(_date, startOfYear(_date));
|
|
@@ -1100,14 +1100,14 @@ function getDayOfYear(date, options) {
|
|
|
1100
1100
|
return dayOfYear;
|
|
1101
1101
|
}
|
|
1102
1102
|
|
|
1103
|
-
// node_modules/date-fns/getISOWeek.js
|
|
1103
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/getISOWeek.js
|
|
1104
1104
|
function getISOWeek(date, options) {
|
|
1105
1105
|
const _date = toDate(date, options?.in);
|
|
1106
1106
|
const diff = +startOfISOWeek(_date) - +startOfISOWeekYear(_date);
|
|
1107
1107
|
return Math.round(diff / millisecondsInWeek) + 1;
|
|
1108
1108
|
}
|
|
1109
1109
|
|
|
1110
|
-
// node_modules/date-fns/getWeekYear.js
|
|
1110
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/getWeekYear.js
|
|
1111
1111
|
function getWeekYear(date, options) {
|
|
1112
1112
|
const _date = toDate(date, options?.in);
|
|
1113
1113
|
const year = _date.getFullYear();
|
|
@@ -1130,7 +1130,7 @@ function getWeekYear(date, options) {
|
|
|
1130
1130
|
}
|
|
1131
1131
|
}
|
|
1132
1132
|
|
|
1133
|
-
// node_modules/date-fns/startOfWeekYear.js
|
|
1133
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/startOfWeekYear.js
|
|
1134
1134
|
function startOfWeekYear(date, options) {
|
|
1135
1135
|
const defaultOptions2 = getDefaultOptions();
|
|
1136
1136
|
const firstWeekContainsDate = options?.firstWeekContainsDate ?? options?.locale?.options?.firstWeekContainsDate ?? defaultOptions2.firstWeekContainsDate ?? defaultOptions2.locale?.options?.firstWeekContainsDate ?? 1;
|
|
@@ -1142,21 +1142,21 @@ function startOfWeekYear(date, options) {
|
|
|
1142
1142
|
return _date;
|
|
1143
1143
|
}
|
|
1144
1144
|
|
|
1145
|
-
// node_modules/date-fns/getWeek.js
|
|
1145
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/getWeek.js
|
|
1146
1146
|
function getWeek(date, options) {
|
|
1147
1147
|
const _date = toDate(date, options?.in);
|
|
1148
1148
|
const diff = +startOfWeek(_date, options) - +startOfWeekYear(_date, options);
|
|
1149
1149
|
return Math.round(diff / millisecondsInWeek) + 1;
|
|
1150
1150
|
}
|
|
1151
1151
|
|
|
1152
|
-
// node_modules/date-fns/_lib/addLeadingZeros.js
|
|
1152
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/_lib/addLeadingZeros.js
|
|
1153
1153
|
function addLeadingZeros(number, targetLength) {
|
|
1154
1154
|
const sign = number < 0 ? "-" : "";
|
|
1155
1155
|
const output = Math.abs(number).toString().padStart(targetLength, "0");
|
|
1156
1156
|
return sign + output;
|
|
1157
1157
|
}
|
|
1158
1158
|
|
|
1159
|
-
// node_modules/date-fns/_lib/format/lightFormatters.js
|
|
1159
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/_lib/format/lightFormatters.js
|
|
1160
1160
|
var lightFormatters = {
|
|
1161
1161
|
y(date, token) {
|
|
1162
1162
|
const signedYear = date.getFullYear();
|
|
@@ -1205,7 +1205,7 @@ var lightFormatters = {
|
|
|
1205
1205
|
}
|
|
1206
1206
|
};
|
|
1207
1207
|
|
|
1208
|
-
// node_modules/date-fns/_lib/format/formatters.js
|
|
1208
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/_lib/format/formatters.js
|
|
1209
1209
|
var dayPeriodEnum = {
|
|
1210
1210
|
am: "am",
|
|
1211
1211
|
pm: "pm",
|
|
@@ -1744,7 +1744,7 @@ function formatTimezone(offset, delimiter = "") {
|
|
|
1744
1744
|
return sign + hours + delimiter + minutes;
|
|
1745
1745
|
}
|
|
1746
1746
|
|
|
1747
|
-
// node_modules/date-fns/_lib/format/longFormatters.js
|
|
1747
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/_lib/format/longFormatters.js
|
|
1748
1748
|
var dateLongFormatter = (pattern, formatLong2) => {
|
|
1749
1749
|
switch (pattern) {
|
|
1750
1750
|
case "P":
|
|
@@ -1801,7 +1801,7 @@ var longFormatters = {
|
|
|
1801
1801
|
P: dateTimeLongFormatter
|
|
1802
1802
|
};
|
|
1803
1803
|
|
|
1804
|
-
// node_modules/date-fns/_lib/protectedTokens.js
|
|
1804
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/_lib/protectedTokens.js
|
|
1805
1805
|
var dayOfYearTokenRE = /^D+$/;
|
|
1806
1806
|
var weekYearTokenRE = /^Y+$/;
|
|
1807
1807
|
var throwTokens = ["D", "DD", "YY", "YYYY"];
|
|
@@ -1822,7 +1822,7 @@ function message(token, format, input) {
|
|
|
1822
1822
|
return `Use \`${token.toLowerCase()}\` instead of \`${token}\` (in \`${format}\`) for formatting ${subject} to the input \`${input}\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`;
|
|
1823
1823
|
}
|
|
1824
1824
|
|
|
1825
|
-
// node_modules/date-fns/format.js
|
|
1825
|
+
// node_modules/.bun/date-fns@4.1.0/node_modules/date-fns/format.js
|
|
1826
1826
|
var formattingTokensRegExp = /[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g;
|
|
1827
1827
|
var longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;
|
|
1828
1828
|
var escapedStringRegExp = /^'([^]*?)'?$/;
|
|
@@ -2460,5 +2460,5 @@ export {
|
|
|
2460
2460
|
__initEventManager
|
|
2461
2461
|
};
|
|
2462
2462
|
|
|
2463
|
-
//# debugId=
|
|
2464
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXHV0aWxzXFxwYXJ0LnRzIiwgIi4uXFx0eXBlLXNhZmV0eVxcaW5kZXgudHMiLCAiLi5cXGNvbmZpZ1xcaW5kZXgudHMiLCAiLi5cXHV0aWxzXFxoZWFkZXJzLXRvLWpzb24udHMiLCAiLi5cXHV0aWxzXFxtZXJnZS1kZWVwLnRzIiwgIi4uXFx1dGlsc1xccmV2aXZlLWpzb24tcGFyc2UudHMiLCAiLi5cXGV4ZWN1dGVcXGluZGV4LnRzIiwgIi4uXFxldmVudFxcaW5kZXgudHMiLCAiLi5cXGZsb3dcXGluZGV4LnRzIiwgIi4uXFx1dGlsc1xcY3JlYXRlLWlkLnRzIiwgIi4uXFxleGVjdXRlXFxleGVjdXRlLWlkLWdlbmVyYXRvci50cyIsICIuLlxcd29ybGRcXGluZGV4LnRzIiwgIi4uXFx0eXBpYVxcaW5kZXgudHMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcY29uc3RhbnRzLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXGNvbnN0cnVjdEZyb20uanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcdG9EYXRlLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXF9saWJcXGRlZmF1bHRPcHRpb25zLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXHN0YXJ0T2ZXZWVrLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXHN0YXJ0T2ZJU09XZWVrLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXGdldElTT1dlZWtZZWFyLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXF9saWJcXGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcX2xpYlxcbm9ybWFsaXplRGF0ZXMuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcc3RhcnRPZkRheS5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcc3RhcnRPZklTT1dlZWtZZWFyLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXGlzRGF0ZS5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxpc1ZhbGlkLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXHN0YXJ0T2ZZZWFyLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXGxvY2FsZVxcZW4tVVNcXF9saWJcXGZvcm1hdERpc3RhbmNlLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXGxvY2FsZVxcX2xpYlxcYnVpbGRGb3JtYXRMb25nRm4uanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcbG9jYWxlXFxlbi1VU1xcX2xpYlxcZm9ybWF0TG9uZy5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxsb2NhbGVcXGVuLVVTXFxfbGliXFxmb3JtYXRSZWxhdGl2ZS5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxsb2NhbGVcXF9saWJcXGJ1aWxkTG9jYWxpemVGbi5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxsb2NhbGVcXGVuLVVTXFxfbGliXFxsb2NhbGl6ZS5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxsb2NhbGVcXF9saWJcXGJ1aWxkTWF0Y2hGbi5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxsb2NhbGVcXF9saWJcXGJ1aWxkTWF0Y2hQYXR0ZXJuRm4uanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcbG9jYWxlXFxlbi1VU1xcX2xpYlxcbWF0Y2guanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcbG9jYWxlXFxlbi1VUy5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxnZXREYXlPZlllYXIuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcZ2V0SVNPV2Vlay5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxnZXRXZWVrWWVhci5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxzdGFydE9mV2Vla1llYXIuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcZ2V0V2Vlay5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxfbGliXFxhZGRMZWFkaW5nWmVyb3MuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcX2xpYlxcZm9ybWF0XFxsaWdodEZvcm1hdHRlcnMuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcX2xpYlxcZm9ybWF0XFxmb3JtYXR0ZXJzLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXF9saWJcXGZvcm1hdFxcbG9uZ0Zvcm1hdHRlcnMuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcX2xpYlxccHJvdGVjdGVkVG9rZW5zLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXGZvcm1hdC5qcyIsICIuLlxcdXRpbHNcXHNlbmQtY29va2Jvb2stZXZlbnQudHMiLCAiLi5cXGxvZ2dlclxcaW5kZXgudHMiLCAiLi5cXHN0ZXBcXGluZGV4LnRzIiwgIi4uXFx1dGlsc1xcdHJpZS50cyIsICIuLlxcbGlzdGVuZXJcXGluZGV4LnRzIiwgIi4uXFxleGNlcHRpb25cXGluZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImV4cG9ydCBmdW5jdGlvbiBwYXJ0PFQgZXh0ZW5kcyAoKSA9PiB1bmtub3duPihoYW5kbGVyOiBUKTogUmV0dXJuVHlwZTxUPiB7XHJcbiAgcmV0dXJuIGhhbmRsZXIoKSBhcyB1bmtub3duIGFzIFJldHVyblR5cGU8VD47XHJcbn1cclxuIiwKICAgICJleHBvcnQgdHlwZSBUeXBlU2FmZXR5PFZhbHVlIGV4dGVuZHMgUmVjb3JkPGFueSwgYW55Pj4gPSAodmFsdWU6IFZhbHVlKSA9PiBUeXBlU2FmZXR5VmFsdWU7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVTYWZldHlWYWx1ZSB7XHJcbiAgdHlwZTogPFR5cGUgZXh0ZW5kcyBSZWNvcmQ8YW55LCBhbnk+PigpID0+IFR5cGU7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVHlwZVNhZmV0eVR5cGU8VHlwZSBleHRlbmRzIFJlY29yZDxhbnksIGFueT4+IHtcclxuICAkbWlsa2lvVHlwZTogXCJ0eXBlLXNhZmV0eVwiO1xyXG4gIHZhbHVlOiBUeXBlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdHlwZVNhZmV0eTxWYWx1ZSBleHRlbmRzIFJlY29yZDxhbnksIGFueT4+KHZhbHVlOiBWYWx1ZSk6IFR5cGVTYWZldHlWYWx1ZSB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHR5cGU6ICgpID0+ICh7ICRtaWxraW9UeXBlOiBcInR5cGUtc2FmZXR5XCIsIHZhbHVlIH0pLFxyXG4gIH0gYXMgYW55O1xyXG59XHJcbiIsCiAgICAiZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZzxDb25maWdUIGV4dGVuZHMgQ29uZmlnPihjb25maWc6IENvbmZpZ1QpOiBDb25maWdUIHtcclxuICByZXR1cm4gY29uZmlnO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBDb25maWcgPSAobW9kZTogc3RyaW5nKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDb25maWdFbnZpcm9ubWVudHM8VCBleHRlbmRzIENvbmZpZz4ge1xyXG4gIFtrZXk6IHN0cmluZ106IChlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pID0+IFBhcnRpYWw8QXdhaXRlZDxSZXR1cm5UeXBlPFQ+Pj4gfCBQcm9taXNlPFBhcnRpYWw8QXdhaXRlZDxSZXR1cm5UeXBlPFQ+Pj4+O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZW52VG9TdHJpbmcodmFsdWU6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCwgZGVmYXVsdFZhbHVlOiBzdHJpbmcpIHtcclxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcclxuXHJcbiAgcmV0dXJuIGAke3ZhbHVlfWA7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBlbnZUb051bWJlcih2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBkZWZhdWx0VmFsdWU6IG51bWJlcikge1xyXG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xyXG5cclxuICByZXR1cm4gTnVtYmVyLnBhcnNlSW50KHZhbHVlLCAxMCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBlbnZUb0Jvb2xlYW4odmFsdWU6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCwgZGVmYXVsdFZhbHVlOiBib29sZWFuKSB7XHJcbiAgaWYgKHZhbHVlID09PSBcInRydWVcIikgcmV0dXJuIHRydWU7XHJcblxyXG4gIGlmICh2YWx1ZSA9PT0gXCJmYWxzZVwiKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gIGlmICh2YWx1ZSA9PT0gXCJcIikgcmV0dXJuIGZhbHNlO1xyXG5cclxuICBpZiAodW5kZWZpbmVkID09PSB2YWx1ZSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcclxuXHJcbiAgcmV0dXJuIEJvb2xlYW4odmFsdWUpO1xyXG59XHJcbiIsCiAgICAiZXhwb3J0IGZ1bmN0aW9uIGhlYWRlcnNUb0pTT04oaGVhZGVyczogSGVhZGVycykge1xyXG4gIGNvbnN0IGpzb246IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcclxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiAoaGVhZGVycyBhcyBhbnkpLmVudHJpZXMoKSkge1xyXG4gICAganNvbltrZXldID0gdmFsdWU7XHJcbiAgfVxyXG4gIHJldHVybiBqc29uO1xyXG59XHJcbiIsCiAgICAiZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZTogYW55KTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBtZXJnZURlZXA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sIFUgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+Pih0YXJnZXQ6IFQsIHNvdXJjZTogVSk6IFQge1xyXG4gIGNvbnN0IG1lcmdlZCA9IHsgLi4udGFyZ2V0IH07XHJcblxyXG4gIGZvciAoY29uc3Qga2V5IGluIHNvdXJjZSkge1xyXG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTtcclxuXHJcbiAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHNvdXJjZVtrZXldO1xyXG4gICAgY29uc3QgdGFyZ2V0VmFsdWUgPSB0YXJnZXRba2V5IGFzIGtleW9mIFRdO1xyXG5cclxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCBrZXkpKSB7XHJcbiAgICAgIGlmIChpc1BsYWluT2JqZWN0KHRhcmdldFZhbHVlKSAmJiBpc1BsYWluT2JqZWN0KHNvdXJjZVZhbHVlKSkge1xyXG4gICAgICAgIG1lcmdlZFtrZXkgYXMga2V5b2YgVCAmIGtleW9mIFVdID0gbWVyZ2VEZWVwKHRhcmdldFZhbHVlLCBzb3VyY2VWYWx1ZSkgYXMgYW55O1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAobWVyZ2VkIGFzIGFueSlba2V5XSA9IHNvdXJjZVZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG1lcmdlZCBhcyBUICYgVTtcclxufVxyXG4iLAogICAgIlxyXG5leHBvcnQgZnVuY3Rpb24gcmV2aXZlSlNPTlBhcnNlPFQ+KGpzb246IFQpOiBUIHtcclxuICAgIGNvbnN0IGlzb0RhdGVQYXR0ZXJuID0gL14oXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oPzpcXC5cXGR7MSwzfSk/KShafFsrLV1cXGR7Mn06P1xcZHsyfSk/JC87XHJcblxyXG4gICAgaWYgKGpzb24gaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4ganNvbjtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGpzb24pKSB7XHJcbiAgICAgICAgcmV0dXJuIGpzb24ubWFwKChpdGVtKSA9PiByZXZpdmVKU09OUGFyc2UoaXRlbSkpIGFzIGFueTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YganNvbiA9PT0gXCJvYmplY3RcIiAmJiBqc29uICE9PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGpzb24pLnJlZHVjZSgoYWNjLCBba2V5LCB2YWx1ZV0pID0+IHtcclxuICAgICAgICAgICAgYWNjW2tleSBhcyBrZXlvZiBUXSA9IHJldml2ZUpTT05QYXJzZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgIHJldHVybiBhY2M7XHJcbiAgICAgICAgfSwge30gYXMgVCk7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIGpzb24gPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICBjb25zdCBtYXRjaCA9IGpzb24ubWF0Y2goaXNvRGF0ZVBhdHRlcm4pO1xyXG4gICAgICAgIGlmIChtYXRjaCkge1xyXG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVkRGF0ZVN0cmluZyA9IG1hdGNoWzJdID8gYCR7bWF0Y2hbMV19JHttYXRjaFsyXS5yZXBsYWNlKFwiOlwiLCBcIlwiKX1gIDogYCR7bWF0Y2hbMV19WmA7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShub3JtYWxpemVkRGF0ZVN0cmluZykgYXMgYW55O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBqc29uO1xyXG59IiwKICAgICJpbXBvcnQgdHlwZSB7IElWYWxpZGF0aW9uIH0gZnJvbSBcInR5cGlhXCI7XHJcbmltcG9ydCB7IHJlamVjdCB9IGZyb20gXCIuLi9pbmRleC50c1wiO1xyXG5pbXBvcnQgdHlwZSB7ICRjb250ZXh0LCAkbWV0YSwgTG9nZ2VyLCBSZXN1bHRzLCBHZW5lcmF0ZWRJbml0IH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XHJcbmltcG9ydCB7IGhlYWRlcnNUb0pTT04gfSBmcm9tIFwiLi4vdXRpbHMvaGVhZGVycy10by1qc29uLnRzXCI7XHJcbmltcG9ydCB7IG1lcmdlRGVlcCB9IGZyb20gXCIuLi91dGlscy9tZXJnZS1kZWVwLnRzXCI7XHJcbmltcG9ydCB7IHJldml2ZUpTT05QYXJzZSB9IGZyb20gXCIuLi91dGlscy9yZXZpdmUtanNvbi1wYXJzZS50c1wiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW5pdEV4ZWN1dGVyKGdlbmVyYXRlZDogR2VuZXJhdGVkSW5pdCwgcnVudGltZTogYW55KSB7XHJcbiAgICBjb25zdCBfX2V4ZWN1dGUgPSBhc3luYyAoXHJcbiAgICAgICAgcm91dGVTY2hlbWE6IGFueSxcclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIGNyZWF0ZWRFeGVjdXRlSWQ6IHN0cmluZztcclxuICAgICAgICAgICAgY3JlYXRlZExvZ2dlcjogTG9nZ2VyO1xyXG4gICAgICAgICAgICBwYXRoOiBzdHJpbmc7XHJcbiAgICAgICAgICAgIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBIZWFkZXJzO1xyXG4gICAgICAgICAgICBjb250ZXh0OiBhbnkgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSAmIChcclxuICAgICAgICAgICAgICAgIHwge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtczogUmVjb3JkPGFueSwgYW55PjtcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXNUeXBlOiBcInJhd1wiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfCB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBzdHJpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zVHlwZTogXCJzdHJpbmdcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKSxcclxuICAgICk6IFByb21pc2U8eyBleGVjdXRlSWQ6IHN0cmluZzsgaGVhZGVyczogSGVhZGVyczsgcGFyYW1zOiBSZWNvcmQ8YW55LCB1bmtub3duPjsgcmVzdWx0czogUmVzdWx0czxhbnk+OyBjb250ZXh0OiAkY29udGV4dDsgbWV0YTogUmVhZG9ubHk8JG1ldGE+OyB0eXBlOiBcImFjdGlvblwiIHwgXCJzdHJlYW1cIjsgZW1wdHlSZXN1bHQ6IGJvb2xlYW47IHJlc3VsdHNUeXBlU2FmZXR5OiBib29sZWFuOyBmaW5hbGVzOiBBcnJheTwoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPj4gfT4gPT4ge1xyXG4gICAgICAgIGNvbnN0IHR5cGUgPSBvcHRpb25zLnBhdGguZW5kc1dpdGgoXCJ+XCIpID8gXCJzdHJlYW1cIiA6IFwiYWN0aW9uXCI7XHJcbiAgICAgICAgY29uc3QgZXhlY3V0ZUlkOiBzdHJpbmcgPSBvcHRpb25zLmNyZWF0ZWRFeGVjdXRlSWQ7XHJcbiAgICAgICAgbGV0IGhlYWRlcnM6IEhlYWRlcnM7XHJcbiAgICAgICAgaWYgKCEob3B0aW9ucy5oZWFkZXJzIGluc3RhbmNlb2YgSGVhZGVycykpIHtcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICBoZWFkZXJzID0gbmV3IEhlYWRlcnMoe1xyXG4gICAgICAgICAgICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBoZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIShcInRvSlNPTlwiIGluIGhlYWRlcnMpKSAoaGVhZGVycyBhcyBhbnkpLnRvSlNPTiA9ICgpID0+IGhlYWRlcnNUb0pTT04oaGVhZGVycyk7XHJcblxyXG4gICAgICAgIGNvbnN0IGZpbmFsZXM6IEFycmF5PGFueT4gPSBbXTtcclxuICAgICAgICBjb25zdCBvbkZpbmFsbHkgPSAoaGFuZGxlcjogYW55KSA9PiBmaW5hbGVzLnVuc2hpZnQoaGFuZGxlcik7XHJcblxyXG4gICAgICAgIGxldCBwYXJhbXM6IFJlY29yZDxhbnksIHVua25vd24+O1xyXG4gICAgICAgIGlmIChvcHRpb25zLnBhcmFtc1R5cGUgPT09IFwicmF3XCIpIHtcclxuICAgICAgICAgICAgcGFyYW1zID0gb3B0aW9ucy5wYXJhbXM7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW1zID09PSBcInVuZGVmaW5lZFwiKSBwYXJhbXMgPSB7fTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5wYXJhbXMgPT09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIHBhcmFtcyA9IHt9O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShvcHRpb25zLnBhcmFtcykpO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyByZWplY3QoXCJQQVJBTVNfVFlQRV9OT1RfU1VQUE9SVEVEXCIsIHsgZXhwZWN0ZWQ6IFwianNvblwiIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbXMgPT09IFwidW5kZWZpbmVkXCIpIHBhcmFtcyA9IHt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgcGFyYW1zICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkocGFyYW1zKSkgdGhyb3cgcmVqZWN0KFwiUEFSQU1TX1RZUEVfTk9UX1NVUFBPUlRFRFwiLCB7IGV4cGVjdGVkOiBcImpzb25cIiB9KTtcclxuICAgICAgICBpZiAoXCIkbWlsa2lvR2VuZXJhdGVQYXJhbXNcIiBpbiBwYXJhbXMgJiYgcGFyYW1zLiRtaWxraW9HZW5lcmF0ZVBhcmFtcyA9PT0gXCJlbmFibGVcIikge1xyXG4gICAgICAgICAgICBpZiAoIXJ1bnRpbWUuZGV2ZWxvcCkgdGhyb3cgcmVqZWN0KFwiTk9UX0RFVkVMT1BfTU9ERVwiLCBcIlRoaXMgZmVhdHVyZSBtdXN0IGJlIGluIGNvb2tib29rIHRvIHVzZS5cIik7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBwYXJhbXMuJG1pbGtpb0dlbmVyYXRlUGFyYW1zO1xyXG4gICAgICAgICAgICBsZXQgcGFyYW1zUmFuZCA9IHJvdXRlU2NoZW1hLnJhbmRvbVBhcmFtcygpO1xyXG4gICAgICAgICAgICBpZiAocGFyYW1zUmFuZCA9PT0gdW5kZWZpbmVkIHx8IHBhcmFtc1JhbmQgPT09IG51bGwpIHBhcmFtc1JhbmQgPSB7fTtcclxuICAgICAgICAgICAgcGFyYW1zID0gbWVyZ2VEZWVwKHBhcmFtcywgcGFyYW1zUmFuZCk7XHJcbiAgICAgICAgICAgIG9wdGlvbnMuY3JlYXRlZExvZ2dlci5kZWJ1ZyhcIuKcqCB0aGUgZ2VuZXJhdGVkIHBhcmFtczpcIiwgSlNPTi5zdHJpbmdpZnkocGFyYW1zKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghb3B0aW9ucy5jb250ZXh0Py5odHRwPy5ub3RGb3VuZCAmJiBvcHRpb25zLmNvbnRleHQ/Lmh0dHA/LnBhcmFtcz8uc3RyaW5nKSBvcHRpb25zLmNvbnRleHQuaHR0cC5wYXJhbXMucGFyc2VkID0gcGFyYW1zO1xyXG5cclxuICAgICAgICBpZiAoIW9wdGlvbnMuY29udGV4dCkgb3B0aW9ucy5jb250ZXh0ID0ge307XHJcbiAgICAgICAgb3B0aW9ucy5jb250ZXh0LmRldmVsb3AgPSBydW50aW1lLmRldmVsb3A7XHJcbiAgICAgICAgb3B0aW9ucy5jb250ZXh0LnBhdGggPSBvcHRpb25zLnBhdGg7XHJcbiAgICAgICAgb3B0aW9ucy5jb250ZXh0LmxvZ2dlciA9IG9wdGlvbnMuY3JlYXRlZExvZ2dlcjtcclxuICAgICAgICBvcHRpb25zLmNvbnRleHQuZW1pdCA9IHJ1bnRpbWUuZW1pdDtcclxuICAgICAgICBvcHRpb25zLmNvbnRleHQuZXhlY3V0ZUlkID0gb3B0aW9ucy5jcmVhdGVkRXhlY3V0ZUlkO1xyXG4gICAgICAgIG9wdGlvbnMuY29udGV4dC5jb25maWcgPSBydW50aW1lLnJ1bnRpbWUuY29uZmlnO1xyXG4gICAgICAgIG9wdGlvbnMuY29udGV4dC50eXBpYSA9IGdlbmVyYXRlZC50eXBpYVNjaGVtYTtcclxuICAgICAgICBvcHRpb25zLmNvbnRleHQuY2FsbCA9IChtb2R1bGU6IGFueSwgcGFyYW1zOiBhbnkpID0+IF9fY2FsbChvcHRpb25zLmNvbnRleHQsIG1vZHVsZSwgcGFyYW1zKTtcclxuICAgICAgICBvcHRpb25zLmNvbnRleHQub25GaW5hbGx5ID0gb25GaW5hbGx5O1xyXG4gICAgICAgIG9wdGlvbnMuY29udGV4dC5fID0gcnVudGltZTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVzdWx0czogUmVzdWx0czxhbnk+ID0geyB2YWx1ZTogdW5kZWZpbmVkIH07XHJcblxyXG4gICAgICAgIGNvbnN0IG1vZHVsZSA9IHJvdXRlU2NoZW1hLm1vZHVsZTtcclxuICAgICAgICBjb25zdCBtZXRhID0gKG1vZHVsZT8ubWV0YSA/IG1vZHVsZT8ubWV0YSA6IHt9KSBhcyB1bmtub3duIGFzIFJlYWRvbmx5PCRtZXRhPjtcclxuXHJcbiAgICAgICAgaWYgKG9wdGlvbnMuY29udGV4dC5odHRwPy5yZXF1ZXN0Py5tZXRob2QgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCBhbGxvd01ldGhvZHMgPSBtZXRhPy5tZXRob2RzID8/IFtcIlBPU1RcIl07XHJcbiAgICAgICAgICAgIGlmICghYWxsb3dNZXRob2RzLmluY2x1ZGVzKG9wdGlvbnMuY29udGV4dC5odHRwLnJlcXVlc3QubWV0aG9kKSkgdGhyb3cgcmVqZWN0KFwiTUVUSE9EX05PVF9BTExPV0VEXCIsIHVuZGVmaW5lZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobWV0YT8udHlwZVNhZmV0eSA9PT0gdW5kZWZpbmVkIHx8IG1ldGEudHlwZVNhZmV0eSA9PT0gdHJ1ZSB8fCAoQXJyYXkuaXNBcnJheShtZXRhLnR5cGVTYWZldHkpICYmIG1ldGEudHlwZVNhZmV0eS5pbmNsdWRlcyhcInBhcmFtc1wiKSkpIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHJvdXRlU2NoZW1hLnZhbGlkYXRlUGFyYW1zKHBhcmFtcykgYXMgSVZhbGlkYXRpb248YW55PjtcclxuICAgICAgICAgICAgaWYgKCF2YWxpZGF0aW9uLnN1Y2Nlc3MpIHRocm93IHJlamVjdChcIlBBUkFNU19UWVBFX0lOQ09SUkVDVFwiLCB7IC4uLnZhbGlkYXRpb24uZXJyb3JzWzBdLCBtZXNzYWdlOiBgVGhlIHZhbHVlICcke3ZhbGlkYXRpb24uZXJyb3JzWzBdLnBhdGh9JyBpcyAnJHt2YWxpZGF0aW9uLmVycm9yc1swXS52YWx1ZX0nLCB3aGljaCBkb2VzIG5vdCBtZWV0ICcke3ZhbGlkYXRpb24uZXJyb3JzWzBdLmV4cGVjdGVkfScgcmVxdWlyZW1lbnRzLmAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86ZXhlY3V0ZUJlZm9yZVwiLCB7IGV4ZWN1dGVJZDogb3B0aW9ucy5jcmVhdGVkRXhlY3V0ZUlkLCBsb2dnZXI6IG9wdGlvbnMuY3JlYXRlZExvZ2dlciwgcGF0aDogb3B0aW9ucy5wYXRoLCBtZXRhLCBjb250ZXh0OiBvcHRpb25zLmNvbnRleHQsIHJlamVjdCB9KTtcclxuXHJcbiAgICAgICAgcmVzdWx0cy52YWx1ZSA9IGF3YWl0IG1vZHVsZS5oYW5kbGVyKG9wdGlvbnMuY29udGV4dCwgcGFyYW1zKTtcclxuXHJcbiAgICAgICAgbGV0IGVtcHR5UmVzdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHJlc3VsdHMudmFsdWUgPT09IHVuZGVmaW5lZCB8fCByZXN1bHRzLnZhbHVlID09PSBudWxsIHx8IHJlc3VsdHMudmFsdWUgPT09IFwiXCIpIHtcclxuICAgICAgICAgICAgZW1wdHlSZXN1bHQgPSB0cnVlO1xyXG4gICAgICAgICAgICByZXN1bHRzLnZhbHVlID0ge307XHJcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdHMudmFsdWUpIHx8IHR5cGVvZiByZXN1bHRzLnZhbHVlICE9PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgICAgIHRocm93IHJlamVjdChcIlJFUVVFU1RfRkFJTFwiLCBcIlRoZSByZXR1cm4gdHlwZSBvZiB0aGUgaGFuZGxlciBtdXN0IGJlIGFuICdvYmplY3QnLCB3aGljaCBpcyBjdXJyZW50bHkgYW4gJyR7dHlwZW9mIHR5cGVvZiByZXN1bHRzLnZhbHVlfScuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHJlc3VsdHNUeXBlU2FmZXR5ID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKCFlbXB0eVJlc3VsdCAmJiB0eXBlID09PSBcImFjdGlvblwiICYmIChcclxuICAgICAgICAgICAgLy8gVGVtcG9yYXJ5OiB0eXBlLXNhZmUgZGVmYXVsdCBpcyBmYWxzZSBhbmQgdGhpcyBzZXR0aW5nIHNob3VsZCBub3QgYmUgZXhwb3NlZCB0byB1c2Vyc1xyXG4gICAgICAgICAgICAvLyBEdWUgdG8gY3VycmVudCBpc3N1ZXMgd2l0aCB0eXBpYSwgdHlwZSBzYWZldHkgY2Fubm90IGJlIGFjaGlldmVkIGF0IHRoZSBtb21lbnRcclxuICAgICAgICAgICAgLy8gVGhlcmVmb3JlLCB0aGUgbmV4dCBsaW5lIG9mIGNvZGUgaXMgY3VycmVudGx5IGNvbW1lbnRlZCBvdXRcclxuICAgICAgICAgICAgLy8gVGhpcyBtZWFucyBNaWxraW8gaXMgdXNpbmcgdHJhZGl0aW9uYWwgSlNPTi5zdHJpbmdpZnkgZm9yIHJlc3VsdCBzZXJpYWxpemF0aW9uXHJcbiAgICAgICAgICAgIC8vIG1ldGE/LnR5cGVTYWZldHkgPT09IHVuZGVmaW5lZCB8fCBcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICBtZXRhLnR5cGVTYWZldHkgPT09IHRydWUgfHwgKEFycmF5LmlzQXJyYXkobWV0YS50eXBlU2FmZXR5KSAmJiBtZXRhLnR5cGVTYWZldHkuaW5jbHVkZXMoXCJyZXN1bHRzXCIpKSkpIHtcclxuICAgICAgICAgICAgcmVzdWx0c1R5cGVTYWZldHkgPSB0cnVlO1xyXG4gICAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uID0gcm91dGVTY2hlbWEudmFsaWRhdGVSZXN1bHRzKHJlc3VsdHMudmFsdWUpIGFzIElWYWxpZGF0aW9uPGFueT47XHJcbiAgICAgICAgICAgIGlmICghdmFsaWRhdGlvbi5zdWNjZXNzKSB0aHJvdyByZWplY3QoXCJSRVNVTFRTX1RZUEVfSU5DT1JSRUNUXCIsIHsgLi4udmFsaWRhdGlvbi5lcnJvcnNbMF0sIG1lc3NhZ2U6IGBUaGUgdmFsdWUgJyR7dmFsaWRhdGlvbi5lcnJvcnNbMF0ucGF0aH0nIGlzICcke3ZhbGlkYXRpb24uZXJyb3JzWzBdLnZhbHVlfScsIHdoaWNoIGRvZXMgbm90IG1lZXQgJyR7dmFsaWRhdGlvbi5lcnJvcnNbMF0uZXhwZWN0ZWR9JyByZXF1aXJlbWVudHMuYCB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpleGVjdXRlQWZ0ZXJcIiwgeyBleGVjdXRlSWQ6IG9wdGlvbnMuY3JlYXRlZEV4ZWN1dGVJZCwgbG9nZ2VyOiBvcHRpb25zLmNyZWF0ZWRMb2dnZXIsIHBhdGg6IG9wdGlvbnMucGF0aCwgbWV0YSwgY29udGV4dDogb3B0aW9ucy5jb250ZXh0LCByZXN1bHRzLCByZWplY3QgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB7IGV4ZWN1dGVJZCwgaGVhZGVycywgcGFyYW1zLCByZXN1bHRzLCBjb250ZXh0OiBvcHRpb25zLmNvbnRleHQsIG1ldGEsIHR5cGUsIGVtcHR5UmVzdWx0LCByZXN1bHRzVHlwZVNhZmV0eSwgZmluYWxlcyB9O1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBfX2NhbGwgPSBhc3luYyAoY29udGV4dDogJGNvbnRleHQsIG1vZHVsZTogeyBtZXRhOiBhbnksIGhhbmRsZXI6IGFueSB9LCBwYXJhbXM/OiBhbnkpOiBQcm9taXNlPGFueT4gPT4ge1xyXG4gICAgICAgIGNvbnN0IG1vZHVsZUF3YWl0ZWQgPSBhd2FpdCBtb2R1bGU7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IG1vZHVsZUF3YWl0ZWQuaGFuZGxlcihjb250ZXh0LCBwYXJhbXMpO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIF9fY2FsbCxcclxuICAgICAgICBfX2V4ZWN1dGUsXHJcbiAgICB9O1xyXG59IiwKICAgICJpbXBvcnQgdHlwZSB7ICRjb250ZXh0LCBDb250ZXh0SHR0cCwgUmVzdWx0cywgTG9nZ2VyLCAkbWV0YSB9IGZyb20gXCIuLi9pbmRleC50c1wiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSAkZXZlbnRzIHtcclxuICAgIFwiKlwiOiB7IGtleToga2V5b2YgJGV2ZW50cywgdmFsdWU6IGFueSB9O1xyXG4gICAgXCJtaWxraW86aHR0cFJlcXVlc3RcIjogeyBleGVjdXRlSWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBsb2dnZXI6IExvZ2dlcjsgaHR0cDogQ29udGV4dEh0dHA8UmVjb3JkPHN0cmluZywgYW55Pj4gfTtcclxuICAgIFwibWlsa2lvOmh0dHBSZXNwb25zZVwiOiB7IGV4ZWN1dGVJZDogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGxvZ2dlcjogTG9nZ2VyOyBodHRwOiBDb250ZXh0SHR0cDxSZWNvcmQ8c3RyaW5nLCBhbnk+PjsgY29udGV4dDogJGNvbnRleHQ7IHN1Y2Nlc3M6IGJvb2xlYW4gfTtcclxuICAgIFwibWlsa2lvOmh0dHBOb3RGb3VuZFwiOiB7IGV4ZWN1dGVJZDogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGxvZ2dlcjogTG9nZ2VyOyBodHRwOiBDb250ZXh0SHR0cDxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB9O1xyXG4gICAgXCJtaWxraW86ZXhlY3V0ZUJlZm9yZVwiOiB7IGV4ZWN1dGVJZDogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGxvZ2dlcjogTG9nZ2VyOyBtZXRhOiAkbWV0YTsgY29udGV4dDogJGNvbnRleHQgfTtcclxuICAgIFwibWlsa2lvOmV4ZWN1dGVBZnRlclwiOiB7IGV4ZWN1dGVJZDogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGxvZ2dlcjogTG9nZ2VyOyBtZXRhOiAkbWV0YTsgY29udGV4dDogJGNvbnRleHQ7IHJlc3VsdHM6IFJlc3VsdHM8YW55PiB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbml0RXZlbnRNYW5hZ2VyKCkge1xyXG4gICAgY29uc3QgaGFuZGxlcnMgPSBuZXcgTWFwPChldmVudDogYW55KSA9PiB2b2lkLCBzdHJpbmc+KCk7XHJcbiAgICBjb25zdCBpbmRleGVkID0gbmV3IE1hcDxzdHJpbmcsIFNldDwoZXZlbnQ6IGFueSkgPT4gdm9pZD4+KCk7XHJcblxyXG4gICAgY29uc3QgZXZlbnRNYW5hZ2VyID0ge1xyXG4gICAgICAgIG9uOiA8S2V5IGV4dGVuZHMga2V5b2YgJGV2ZW50cywgSGFuZGxlciBleHRlbmRzIChldmVudDogJGV2ZW50c1tLZXldKSA9PiB2b2lkPihrZXk6IEtleSwgaGFuZGxlcjogSGFuZGxlcikgPT4ge1xyXG4gICAgICAgICAgICBoYW5kbGVycy5zZXQoaGFuZGxlciwga2V5IGFzIHN0cmluZyk7XHJcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICcqJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ZWQuaGFzKCcqJykgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhlZC5zZXQoJyonLCBuZXcgU2V0KCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3Qgd2lsZGNhcmRTZXQgPSBpbmRleGVkLmdldCgnKicpITtcclxuICAgICAgICAgICAgICAgIHdpbGRjYXJkU2V0LmFkZChoYW5kbGVyKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleGVkLmhhcyhrZXkgYXMgc3RyaW5nKSA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBpbmRleGVkLnNldChrZXkgYXMgc3RyaW5nLCBuZXcgU2V0KCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2V0ID0gaW5kZXhlZC5nZXQoa2V5IGFzIHN0cmluZykhO1xyXG4gICAgICAgICAgICAgICAgc2V0LmFkZChoYW5kbGVyKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcclxuICAgICAgICAgICAgICAgIGlmIChrZXkgPT09ICcqJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdpbGRjYXJkU2V0ID0gaW5kZXhlZC5nZXQoJyonKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAod2lsZGNhcmRTZXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2lsZGNhcmRTZXQuZGVsZXRlKGhhbmRsZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2V0ID0gaW5kZXhlZC5nZXQoa2V5IGFzIHN0cmluZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNldCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXQuZGVsZXRlKGhhbmRsZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9mZjogPEtleSBleHRlbmRzIGtleW9mICRldmVudHMsIEhhbmRsZXIgZXh0ZW5kcyAoZXZlbnQ6ICRldmVudHNbS2V5XSkgPT4gdm9pZD4oa2V5OiBLZXksIGhhbmRsZXI6IEhhbmRsZXIpID0+IHtcclxuICAgICAgICAgICAgaWYgKGtleSA9PT0gJyonKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB3aWxkY2FyZFNldCA9IGluZGV4ZWQuZ2V0KCcqJyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXdpbGRjYXJkU2V0KSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBoYW5kbGVycy5kZWxldGUoaGFuZGxlcik7XHJcbiAgICAgICAgICAgICAgICB3aWxkY2FyZFNldC5kZWxldGUoaGFuZGxlcik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZXQgPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKTtcclxuICAgICAgICAgICAgICAgIGlmICghc2V0KSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBoYW5kbGVycy5kZWxldGUoaGFuZGxlcik7XHJcbiAgICAgICAgICAgICAgICBzZXQuZGVsZXRlKGhhbmRsZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbWl0OiBhc3luYyA8S2V5IGV4dGVuZHMga2V5b2YgJGV2ZW50cywgVmFsdWUgZXh0ZW5kcyAkZXZlbnRzW0tleV0+KGtleTogS2V5LCB2YWx1ZTogVmFsdWUpOiBQcm9taXNlPHZvaWQ+ID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZGNhcmRIYW5kbGVycyA9IGluZGV4ZWQuZ2V0KCcqJyk7XHJcbiAgICAgICAgICAgIGlmICh3aWxkY2FyZEhhbmRsZXJzKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2Ygd2lsZGNhcmRIYW5kbGVycykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZXIoeyBrZXksIHZhbHVlIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBoID0gaW5kZXhlZC5nZXQoa2V5IGFzIHN0cmluZyk7XHJcbiAgICAgICAgICAgIGlmIChoKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZXIodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIGV2ZW50TWFuYWdlcjtcclxufVxyXG4iLAogICAgImV4cG9ydCB0eXBlIE1pbGtpb0Zsb3c8VCwgVFJldHVybiA9IGFueSwgVE5leHQgPSBhbnk+ID0ge1xyXG4gIGVtaXQ6IChmbG93OiBUKSA9PiB2b2lkO1xyXG4gIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IE1pbGtpb0Zsb3c8VD47XHJcbiAgbmV4dCguLi5bdmFsdWVdOiBbXSB8IFtUTmV4dF0pOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQsIFRSZXR1cm4+PjtcclxuICByZXR1cm4oKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxULCBUUmV0dXJuPj47XHJcbiAgdGhyb3coZXJyb3I6IGFueSk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VCwgVFJldHVybj4+O1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZsb3c8VD4oKTogTWlsa2lvRmxvdzxUPiB7XHJcbiAgbGV0IHN0YXR1czogXCJwZW5kaW5nXCIgfCBcInJlc29sdmVkXCIgfCBcInJlamVjdGVkXCIgPSBcInBlbmRpbmdcIjtcclxuICBjb25zdCBmbG93czogQXJyYXk8e1xyXG4gICAgYmxhbms6IGJvb2xlYW47XHJcbiAgICBwcm9taXNlOiBQcm9taXNlPFQ+O1xyXG4gICAgcmVzb2x2ZTogKHZhbHVlPzogVCB8IFByb21pc2VMaWtlPFQ+KSA9PiB2b2lkO1xyXG4gICAgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkO1xyXG4gIH0+ID0gW107XHJcblxyXG4gIGNvbnN0IGl0ZXJhdG9yID0ge1xyXG4gICAgZW1pdDogKGZsb3c6IFQpID0+IHtcclxuICAgICAgaWYgKGZsb3dzLmF0KC0xKT8uYmxhbmsgPT09IHRydWUpIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gZmxvd3MuYXQoLTEpITtcclxuICAgICAgICBpdGVtLmJsYW5rID0gZmFsc2U7XHJcbiAgICAgICAgaXRlbS5yZXNvbHZlKGZsb3cpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCByZXNvbHZlcnMgPSBQcm9taXNlLndpdGhSZXNvbHZlcnM8VD4oKTtcclxuICAgICAgICByZXNvbHZlcnMucmVzb2x2ZShmbG93KTtcclxuICAgICAgICBmbG93cy5wdXNoKHsgLi4ucmVzb2x2ZXJzLCBibGFuazogZmFsc2UgfSBhcyBhbnkpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgLi4uKHtcclxuICAgICAgYXN5bmMgbmV4dCgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQ+PiB7XHJcbiAgICAgICAgaWYgKHN0YXR1cyAhPT0gXCJwZW5kaW5nXCIpIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiBudWxsIH07XHJcbiAgICAgICAgaWYgKGZsb3dzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgY29uc3QgcmVzb2x2ZXJzID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzPFQ+KCk7XHJcbiAgICAgICAgICBmbG93cy5wdXNoKHsgLi4ucmVzb2x2ZXJzLCBibGFuazogdHJ1ZSB9IGFzIGFueSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGZsb3cgPSBmbG93cy5hdCgwKSE7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmxvdy5wcm9taXNlO1xyXG4gICAgICAgIGZsb3dzLnNoaWZ0KCk7XHJcbiAgICAgICAgcmV0dXJuIHsgZG9uZTogc3RhdHVzICE9PSBcInBlbmRpbmdcIiwgdmFsdWU6IHJlc3VsdCB9O1xyXG4gICAgICB9LFxyXG4gICAgICBhc3luYyByZXR1cm4oKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx2b2lkPj4ge1xyXG4gICAgICAgIHN0YXR1cyA9IFwicmVzb2x2ZWRcIjtcclxuICAgICAgICBmb3IgKGNvbnN0IGZsb3cgb2YgZmxvd3MpIHtcclxuICAgICAgICAgIGZsb3cuYmxhbmsgPSBmYWxzZTtcclxuICAgICAgICAgIGZsb3cucmVzb2x2ZSh1bmRlZmluZWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogbnVsbCB9O1xyXG4gICAgICB9LFxyXG4gICAgICBhc3luYyB0aHJvdyhlcnI6IGFueSk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dm9pZD4+IHtcclxuICAgICAgICBzdGF0dXMgPSBcInJlamVjdGVkXCI7XHJcbiAgICAgICAgaWYgKGZsb3dzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgY29uc3QgcmVzb2x2ZXJzID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzPFQ+KCk7XHJcbiAgICAgICAgICBmbG93cy5wdXNoKHsgLi4ucmVzb2x2ZXJzLCBibGFuazogdHJ1ZSB9IGFzIGFueSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAoY29uc3QgZmxvdyBvZiBmbG93cykge1xyXG4gICAgICAgICAgZmxvdy5ibGFuayA9IGZhbHNlO1xyXG4gICAgICAgICAgZmxvdy5yZWplY3QoZXJyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG51bGwgfTtcclxuICAgICAgfSxcclxuICAgIH0gc2F0aXNmaWVzIEFzeW5jSXRlcmF0b3I8dW5rbm93bj4pLFxyXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG4gIH07XHJcblxyXG4gIHJldHVybiBpdGVyYXRvciBhcyBNaWxraW9GbG93PFQ+O1xyXG59XHJcbiIsCiAgICAidHlwZSBJZEdlbmVyYXRvck9wdGlvbnMgPSB7XHJcbiAgbGVuZ3RoPzogbnVtYmVyO1xyXG4gIHRpbWVzdGFtcDogYm9vbGVhbjtcclxuICBzZXF1ZW50aWFsOiBib29sZWFuO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gZGVmaW5lSWRHZW5lcmF0b3Iob3B0aW9uczogSWRHZW5lcmF0b3JPcHRpb25zKSB7XHJcbiAgaWYgKCFvcHRpb25zLmxlbmd0aCkgb3B0aW9ucy5sZW5ndGggPSAyNDtcclxuICBpZiAob3B0aW9ucy5sZW5ndGggPCAxKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGxlbmd0aFwiKTtcclxuICBpZiAob3B0aW9ucy5sZW5ndGggPiA2MSkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBsZW5ndGhcIik7XHJcbiAgaWYgKG9wdGlvbnMudGltZXN0YW1wICYmIG9wdGlvbnMubGVuZ3RoIDwgOSkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBsZW5ndGhcIik7XHJcbiAgbGV0IGxhc3RUaW1lID0gMDtcclxuICBsZXQgbGFzdERlY2ltYWwgPSAwbjtcclxuICByZXR1cm4ge1xyXG4gICAgY3JlYXRlSWQoKSB7XHJcbiAgICAgIGxldCByYW5kTGVuZ3RoID0gb3B0aW9ucy5sZW5ndGghO1xyXG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xyXG4gICAgICBsZXQgaWQgPSBcIlwiO1xyXG4gICAgICBpZiAob3B0aW9ucy50aW1lc3RhbXApIHtcclxuICAgICAgICByYW5kTGVuZ3RoIC09IDg7XHJcbiAgICAgICAgaWQgPSBgJHtpZH0ke19fYmlnSW50VG9TdHJpbmcoQmlnSW50KG5vdykpLnBhZFN0YXJ0KDgsIFwiMFwiKX1gO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChvcHRpb25zLnNlcXVlbnRpYWwgJiYgbGFzdFRpbWUgPT09IG5vdykge1xyXG4gICAgICAgIGlkID0gYCR7aWR9JHtfX2JpZ0ludFRvU3RyaW5nKCsrbGFzdERlY2ltYWwpLnBhZFN0YXJ0KDEsIFwiMFwiKX1gO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxhc3RUaW1lID0gbm93O1xyXG4gICAgICAgIGNvbnN0IG1pbiA9IDBuO1xyXG4gICAgICAgIGNvbnN0IG1heCA9IF9fZ2V0TWF4VmFsdWUoQmlnSW50KHJhbmRMZW5ndGgpKTtcclxuICAgICAgICBsYXN0RGVjaW1hbCA9IF9fc2VjdXJlUmFuZG9tQmlnSW50KG1pbiwgbWF4KTtcclxuICAgICAgICBpZCA9IGAke2lkfSR7X19iaWdJbnRUb1N0cmluZyhsYXN0RGVjaW1hbCkucGFkU3RhcnQocmFuZExlbmd0aCwgXCIwXCIpfWA7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGlkO1xyXG4gICAgfSxcclxuICAgIGdldElkVGltZXN0YW1wKGlkOiBzdHJpbmcpIHtcclxuICAgICAgcmV0dXJuIG9wdGlvbnMudGltZXN0YW1wID8gTnVtYmVyKF9fc3RyaW5nVG9CaWdJbnQoaWQuc2xpY2UoMCwgOCkucmVwbGFjZUFsbChcIjBcIiwgXCJcIikpKSA6IDA7XHJcbiAgICB9LFxyXG4gIH07XHJcbn1cclxuXHJcbmNvbnN0IEVOQ09ESU5HID0gXCIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwiO1xyXG5cclxuZnVuY3Rpb24gX19zZWN1cmVSYW5kb21CaWdJbnQobWluOiBiaWdpbnQsIG1heDogYmlnaW50KTogYmlnaW50IHtcclxuICBpZiAobWluID49IG1heCkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCByYW5nZVwiKTtcclxuXHJcbiAgY29uc3QgcmFuZ2UgPSBtYXggLSBtaW4gKyAxbjtcclxuICBjb25zdCBieXRlQ291bnQgPSBNYXRoLmNlaWwoTnVtYmVyKEJpZ0ludChyYW5nZS50b1N0cmluZygyKS5sZW5ndGgpKSAvIDgpO1xyXG4gIGNvbnN0IGVudHJvcHlCeXRlcyA9IG5ldyBVaW50OEFycmF5KGJ5dGVDb3VudCk7XHJcblxyXG4gIGxldCByYW5kb21WYWx1ZTogYmlnaW50O1xyXG4gIGRvIHtcclxuICAgIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMoZW50cm9weUJ5dGVzKTtcclxuICAgIHJhbmRvbVZhbHVlID1cclxuICAgICAgQmlnSW50KFxyXG4gICAgICAgIGAweCR7QXJyYXkuZnJvbShlbnRyb3B5Qnl0ZXMpXHJcbiAgICAgICAgICAubWFwKChiKSA9PiBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCBcIjBcIikpXHJcbiAgICAgICAgICAuam9pbihcIlwiKX1gLFxyXG4gICAgICApICUgcmFuZ2U7XHJcbiAgfSB3aGlsZSAocmFuZG9tVmFsdWUgPCAwbik7XHJcblxyXG4gIHJldHVybiBtaW4gKyByYW5kb21WYWx1ZTtcclxufVxyXG5cclxuZnVuY3Rpb24gX19iaWdJbnRUb1N0cmluZyh2YWx1ZTogYmlnaW50KTogc3RyaW5nIHtcclxuICBjb25zdCBiYXNlID0gQmlnSW50KEVOQ09ESU5HLmxlbmd0aCk7XHJcbiAgbGV0IHJlc3VsdCA9IFwiXCI7XHJcbiAgbGV0IGN1cnJlbnQgPSB2YWx1ZTtcclxuXHJcbiAgaWYgKGN1cnJlbnQgPT09IDBuKSByZXR1cm4gRU5DT0RJTkdbMF07XHJcblxyXG4gIHdoaWxlIChjdXJyZW50ID4gMG4pIHtcclxuICAgIGNvbnN0IHJlbWFpbmRlciA9IGN1cnJlbnQgJSBiYXNlO1xyXG4gICAgcmVzdWx0ID0gRU5DT0RJTkdbTnVtYmVyKHJlbWFpbmRlcildICsgcmVzdWx0O1xyXG4gICAgY3VycmVudCA9IGN1cnJlbnQgLyBiYXNlO1xyXG4gIH1cclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBfX3N0cmluZ1RvQmlnSW50KHN0cjogc3RyaW5nKTogYmlnaW50IHtcclxuICBjb25zdCBjaGFyTWFwOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBFTkNPRElORy5sZW5ndGg7IGkrKykge1xyXG4gICAgY2hhck1hcFtFTkNPRElOR1tpXV0gPSBpO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgYmFzZSA9IEJpZ0ludChFTkNPRElORy5sZW5ndGgpO1xyXG4gIGxldCByZXN1bHQgPSAwbjtcclxuXHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcclxuICAgIGNvbnN0IGNoYXIgPSBzdHJbaV07XHJcbiAgICBpZiAoIShjaGFyIGluIGNoYXJNYXApKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjaGFyYWN0ZXIgJyR7Y2hhcn0nIGluIGlucHV0IHN0cmluZ2ApO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdmFsdWUgPSBCaWdJbnQoY2hhck1hcFtjaGFyXSk7XHJcbiAgICByZXN1bHQgPSByZXN1bHQgKiBiYXNlICsgdmFsdWU7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBfX2dldE1heFZhbHVlKG46IGJpZ2ludCk6IGJpZ2ludCB7XHJcbiAgcmV0dXJuIEJpZ0ludChFTkNPRElORy5sZW5ndGgpICoqIG4gLSAxbjtcclxufVxyXG5cclxuY29uc3QgaWRHZW5lcmF0b3IgPSBkZWZpbmVJZEdlbmVyYXRvcih7IGxlbmd0aDogMjQsIHRpbWVzdGFtcDogZmFsc2UsIHNlcXVlbnRpYWw6IGZhbHNlIH0pO1xyXG5cclxuZXhwb3J0IGNvbnN0IF9fY3JlYXRlSWQgPSBpZEdlbmVyYXRvci5jcmVhdGVJZDtcclxuIiwKICAgICJpbXBvcnQgeyBfX2NyZWF0ZUlkIH0gZnJvbSBcIi4uL3V0aWxzL2NyZWF0ZS1pZC50c1wiO1xyXG5cclxuZXhwb3J0IHR5cGUgRXhlY3V0ZUlkR2VuZXJhdG9yID0gKGhlYWRlcnM/OiBIZWFkZXJzKSA9PiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz47XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lRGVmYXVsdEV4ZWN1dGVJZEdlbmVyYXRvcigpIHtcclxuICByZXR1cm4gX19jcmVhdGVJZDtcclxufVxyXG4iLAogICAgImltcG9ydCB7IHR5cGUgJHR5cGVzLCBfX2luaXRMaXN0ZW5lciwgX19pbml0RXhlY3V0ZXIsIF9faW5pdEV2ZW50TWFuYWdlciwgdHlwZSBFeGVjdXRlSWQsIHR5cGUgTG9nZ2VyLCB0eXBlIE1peGluLCB0eXBlIEdlbmVyYXRlZEluaXQsIHR5cGUgUGluZywgdHlwZSBMb2dnZXJTdWJtaXR0aW5nSGFuZGxlciwgdHlwZSBMb2dnZXJJbnNlcnRpbmdIYW5kbGVyIH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XHJcbmltcG9ydCB7IGRlZmluZURlZmF1bHRFeGVjdXRlSWRHZW5lcmF0b3IgfSBmcm9tIFwiLi4vZXhlY3V0ZS9leGVjdXRlLWlkLWdlbmVyYXRvci50c1wiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNaWxraW9Jbml0IHtcclxuICAgIHBvcnQ6IG51bWJlcjtcclxuICAgIGRldmVsb3A6IGJvb2xlYW47XHJcbiAgICBmZXRjaEVudj86IChrZXk6IHN0cmluZykgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gICAgYWNjZXNzS2V5Pzogc3RyaW5nO1xyXG4gICAgY29ycz86IHtcclxuICAgICAgICBjb3JzQWxsb3dNZXRob2RzPzogc3RyaW5nO1xyXG4gICAgICAgIGNvcnNBbGxvd0hlYWRlcnM/OiBzdHJpbmc7XHJcbiAgICAgICAgY29yc0FsbG93T3JpZ2luPzogc3RyaW5nO1xyXG4gICAgfTtcclxuICAgIGlnbm9yZVBhdGhMZXZlbD86IG51bWJlcjtcclxuICAgIHJlYWxJcD86IChoZWFkZXJzOiBIZWFkZXJzKSA9PiBzdHJpbmc7XHJcbiAgICBleGVjdXRlSWQ/OiAoaGVhZGVyczogSGVhZGVycykgPT4gc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+O1xyXG4gICAgb25Mb2dnZXJTdWJtaXR0aW5nPzogTG9nZ2VyU3VibWl0dGluZ0hhbmRsZXI7XHJcbiAgICBvbkxvZ2dlckluc2VydGluZz86IExvZ2dlckluc2VydGluZ0hhbmRsZXI7XHJcbiAgICBib290c3RyYXBzPzogQXJyYXk8KHdvcmxkOiBhbnkpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkPjtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgTWlsa2lvUnVudGltZUluaXQ8VCBleHRlbmRzIE1pbGtpb0luaXQ+ID0gTWl4aW48XHJcbiAgICBULFxyXG4gICAge1xyXG4gICAgICAgIGV4ZWN1dGVJZDogKGhlYWRlcnM6IEhlYWRlcnMpID0+IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPjtcclxuICAgICAgICBydW50aW1lOiB7XHJcbiAgICAgICAgICAgIHJlcXVlc3Q6IE1hcDxFeGVjdXRlSWQsIHsgbG9nZ2VyOiBMb2dnZXIgfT47XHJcbiAgICAgICAgICAgIGNvbmZpZzogQXdhaXRlZDxSZXR1cm5UeXBlPCR0eXBlc1tcImdlbmVyYXRlZFwiXVtcImNvbmZpZ1NjaGVtYVwiXT4+O1xyXG4gICAgICAgICAgICBhcHA6IGFueTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIG9uOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIF9faW5pdEV2ZW50TWFuYWdlcj4+W1wib25cIl07XHJcbiAgICAgICAgb2ZmOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIF9faW5pdEV2ZW50TWFuYWdlcj4+W1wib2ZmXCJdO1xyXG4gICAgICAgIGVtaXQ6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgX19pbml0RXZlbnRNYW5hZ2VyPj5bXCJlbWl0XCJdO1xyXG4gICAgfVxyXG4+O1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVdvcmxkPE1pbGtpb09wdGlvbnMgZXh0ZW5kcyBNaWxraW9Jbml0PihnZW5lcmF0ZWQ6IEdlbmVyYXRlZEluaXQsIGNvbmZpZ1NjaGVtYTogeyBnZXQ6ICgpID0+IFByb21pc2U8UmVjb3JkPGFueSwgYW55Pj4gfSwgb3B0aW9uczogTWlsa2lvT3B0aW9ucyk6IFByb21pc2U8dW5rbm93bj4ge1xyXG4gICAgY29uc3QgZXhlY3V0ZUlkID0gb3B0aW9ucy5leGVjdXRlSWQgPz8gZGVmaW5lRGVmYXVsdEV4ZWN1dGVJZEdlbmVyYXRvcigpO1xyXG4gICAgY29uc3QgY29uZmlnID0gYXdhaXQgY29uZmlnU2NoZW1hLmdldCgpO1xyXG5cclxuICAgIGNvbnN0IHJ1bnRpbWUgPSB7XHJcbiAgICAgICAgcmVxdWVzdDogbmV3IE1hcCgpLFxyXG4gICAgICAgIGNvbmZpZyxcclxuICAgIH0gYXMgTWlsa2lvUnVudGltZUluaXQ8TWlsa2lvT3B0aW9ucz5bXCJydW50aW1lXCJdO1xyXG5cclxuICAgIGNvbnN0IGV2ZW50TWFuYWdlciA9IF9faW5pdEV2ZW50TWFuYWdlcigpO1xyXG5cclxuICAgIGlmIChvcHRpb25zLmFjY2Vzc0tleSkgb3B0aW9ucy5pZ25vcmVQYXRoTGV2ZWwgPSBvcHRpb25zLmlnbm9yZVBhdGhMZXZlbCA/IG9wdGlvbnMuaWdub3JlUGF0aExldmVsICsgMSA6IDE7XHJcblxyXG4gICAgY29uc3QgXzogTWlsa2lvUnVudGltZUluaXQ8TWlsa2lvT3B0aW9ucz4gPSB7XHJcbiAgICAgICAgLi4ub3B0aW9ucyxcclxuICAgICAgICBleGVjdXRlSWQsXHJcbiAgICAgICAgcnVudGltZSxcclxuICAgICAgICBvbjogZXZlbnRNYW5hZ2VyLm9uLFxyXG4gICAgICAgIG9mZjogZXZlbnRNYW5hZ2VyLm9mZixcclxuICAgICAgICBlbWl0OiBldmVudE1hbmFnZXIuZW1pdCxcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgZXhlY3V0ZXIgPSBfX2luaXRFeGVjdXRlcihnZW5lcmF0ZWQsIF8pO1xyXG4gICAgY29uc3QgbGlzdGVuZXIgPSBfX2luaXRMaXN0ZW5lcihnZW5lcmF0ZWQsIF8sIGV4ZWN1dGVyKTtcclxuXHJcbiAgICAvLyBJbml0aWFsaXplIHRoZSBhcHBcclxuICAgIGNvbnN0IHdvcmxkID0ge1xyXG4gICAgICAgIF8sXHJcbiAgICAgICAgLy8gZXZlbnQgbWFuYWdlclxyXG4gICAgICAgIG9uOiBldmVudE1hbmFnZXIub24sXHJcbiAgICAgICAgb2ZmOiBldmVudE1hbmFnZXIub2ZmLFxyXG4gICAgICAgIGVtaXQ6IGV2ZW50TWFuYWdlci5lbWl0LFxyXG4gICAgICAgIC8vIGxpc3RlbmVyXHJcbiAgICAgICAgbGlzdGVuZXIsXHJcbiAgICAgICAgLy8gZnVuY3Rpb25cclxuICAgICAgICBjb25maWcsXHJcbiAgICB9O1xyXG5cclxuICAgIHJ1bnRpbWUuYXBwID0gd29ybGQ7XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9ucy5ib290c3RyYXBzKSkge1xyXG4gICAgICAgIGZvciAoY29uc3QgYm9vdHN0cmFwIG9mIG9wdGlvbnMuYm9vdHN0cmFwcykge1xyXG4gICAgICAgICAgICBhd2FpdCBib290c3RyYXAod29ybGQgYXMgTWlsa2lvV29ybGQ8R2VuZXJhdGVkSW5pdCwgTWlsa2lvT3B0aW9ucz4pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCBQcm9taXNlLmFsbChnZW5lcmF0ZWQuaGFuZGxlclNjaGVtYS5sb2FkSGFuZGxlcnMod29ybGQpKTtcclxuXHJcbiAgICBjb25zdCByb3V0ZUtleXMgPSBPYmplY3Qua2V5cyhnZW5lcmF0ZWQucm91dGVTY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgYW55Pik7XHJcbiAgICBjb25zb2xlLmxvZyhgXFxu4pazIFJvdXRlczpcXG4gICAgJHtyb3V0ZUtleXMuam9pbihcIlxcbiAgICBcIil9XFxuICBBIHRvdGFsIG9mICR7cm91dGVLZXlzLmxlbmd0aH0gcm91dGVzLmApO1xyXG4gICAgY29uc29sZS5sb2coYFxcbuKWsyBTZXJ2ZXI6IGh0dHA6Ly9sb2NhbGhvc3Q6JHtvcHRpb25zLnBvcnR9YCk7XHJcblxyXG4gICAgcmV0dXJuIHdvcmxkIGFzIHVua25vd247XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWlsa2lvV29ybGQ8R2VuZXJhdGVkIGV4dGVuZHMgR2VuZXJhdGVkSW5pdCwgTWlsa2lvT3B0aW9ucyBleHRlbmRzIE1pbGtpb0luaXQgPSBNaWxraW9Jbml0PiB7XHJcbiAgICBfOiBNaWxraW9SdW50aW1lSW5pdDxNaWxraW9PcHRpb25zPjtcclxuICAgIC8vIGV2ZW50IG1hbmFnZXJcclxuICAgIG9uOiA8S2V5IGV4dGVuZHMga2V5b2YgR2VuZXJhdGVkW1wiZXZlbnRzXCJdLCBIYW5kbGVyIGV4dGVuZHMgKGV2ZW50OiBHZW5lcmF0ZWRbXCJldmVudHNcIl1bS2V5XSkgPT4gdm9pZD4oa2V5OiBLZXksIGhhbmRsZXI6IEhhbmRsZXIpID0+ICgoKSA9PiB2b2lkKTtcclxuICAgIG9mZjogPEtleSBleHRlbmRzIGtleW9mIEdlbmVyYXRlZFtcImV2ZW50c1wiXSwgSGFuZGxlciBleHRlbmRzIChldmVudDogR2VuZXJhdGVkW1wiZXZlbnRzXCJdW0tleV0pID0+IHZvaWQ+KGtleTogS2V5LCBoYW5kbGVyOiBIYW5kbGVyKSA9PiB2b2lkO1xyXG4gICAgZW1pdDogPEtleSBleHRlbmRzIGtleW9mIEdlbmVyYXRlZFtcImV2ZW50c1wiXSwgVmFsdWUgZXh0ZW5kcyBHZW5lcmF0ZWRbXCJldmVudHNcIl1bS2V5XT4oa2V5OiBLZXksIHZhbHVlOiBWYWx1ZSkgPT4gUHJvbWlzZTx2b2lkPjtcclxuICAgIHBpbmc6IChvcHRpb25zPzogeyB0aW1lb3V0PzogbnVtYmVyIH0pID0+IFByb21pc2U8UGluZz47XHJcbiAgICAvLyBsaXN0ZW5lclxyXG4gICAgbGlzdGVuZXI6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgX19pbml0TGlzdGVuZXI+PjtcclxuICAgIGNvbmZpZzogUmVhZG9ubHk8QXdhaXRlZDxSZXR1cm5UeXBlPCR0eXBlc1tcImNvbmZpZ1NjaGVtYVwiXVtcImdldFwiXT4+PjtcclxufVxyXG4iLAogICAgImV4cG9ydCBmdW5jdGlvbiB0eXBpYTxUeXBpYUluaXRUIGV4dGVuZHMgVHlwaWFJbml0Pihpbml0OiBUeXBpYUluaXRUKTogVHlwaWE8VHlwaWFJbml0VD4ge1xyXG4gIHJldHVybiBpbml0IGFzIHVua25vd24gYXMgVHlwaWE8VHlwaWFJbml0VD47XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFR5cGlhSW5pdCA9ICgpID0+IFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj4gfCBQcm9taXNlPFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj4+O1xyXG5cclxuZXhwb3J0IHR5cGUgVHlwaWE8VHlwaWFJbml0VCBleHRlbmRzIFR5cGlhSW5pdD4gPSBUeXBpYUluaXRUO1xyXG4iLAogICAgIi8qKlxuICogQG1vZHVsZSBjb25zdGFudHNcbiAqIEBzdW1tYXJ5IFVzZWZ1bCBjb25zdGFudHNcbiAqIEBkZXNjcmlwdGlvblxuICogQ29sbGVjdGlvbiBvZiB1c2VmdWwgZGF0ZSBjb25zdGFudHMuXG4gKlxuICogVGhlIGNvbnN0YW50cyBjb3VsZCBiZSBpbXBvcnRlZCBmcm9tIGBkYXRlLWZucy9jb25zdGFudHNgOlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBtYXhUaW1lLCBtaW5UaW1lIH0gZnJvbSBcIi4vY29uc3RhbnRzL2RhdGUtZm5zL2NvbnN0YW50c1wiO1xuICpcbiAqIGZ1bmN0aW9uIGlzQWxsb3dlZFRpbWUodGltZSkge1xuICogICByZXR1cm4gdGltZSA8PSBtYXhUaW1lICYmIHRpbWUgPj0gbWluVGltZTtcbiAqIH1cbiAqIGBgYFxuICovXG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBkYXlzSW5XZWVrXG4gKiBAc3VtbWFyeSBEYXlzIGluIDEgd2Vlay5cbiAqL1xuZXhwb3J0IGNvbnN0IGRheXNJbldlZWsgPSA3O1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgZGF5c0luWWVhclxuICogQHN1bW1hcnkgRGF5cyBpbiAxIHllYXIuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIb3cgbWFueSBkYXlzIGluIGEgeWVhci5cbiAqXG4gKiBPbmUgeWVhcnMgZXF1YWxzIDM2NS4yNDI1IGRheXMgYWNjb3JkaW5nIHRvIHRoZSBmb3JtdWxhOlxuICpcbiAqID4gTGVhcCB5ZWFyIG9jY3VycyBldmVyeSA0IHllYXJzLCBleGNlcHQgZm9yIHllYXJzIHRoYXQgYXJlIGRpdmlzaWJsZSBieSAxMDAgYW5kIG5vdCBkaXZpc2libGUgYnkgNDAwLlxuICogPiAxIG1lYW4geWVhciA9ICgzNjUrMS80LTEvMTAwKzEvNDAwKSBkYXlzID0gMzY1LjI0MjUgZGF5c1xuICovXG5leHBvcnQgY29uc3QgZGF5c0luWWVhciA9IDM2NS4yNDI1O1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWF4VGltZVxuICogQHN1bW1hcnkgTWF4aW11bSBhbGxvd2VkIHRpbWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IG1heFRpbWUgfSBmcm9tIFwiLi9jb25zdGFudHMvZGF0ZS1mbnMvY29uc3RhbnRzXCI7XG4gKlxuICogY29uc3QgaXNWYWxpZCA9IDg2NDAwMDAwMDAwMDAwMDEgPD0gbWF4VGltZTtcbiAqIC8vPT4gZmFsc2VcbiAqXG4gKiBuZXcgRGF0ZSg4NjQwMDAwMDAwMDAwMDAxKTtcbiAqIC8vPT4gSW52YWxpZCBEYXRlXG4gKi9cbmV4cG9ydCBjb25zdCBtYXhUaW1lID0gTWF0aC5wb3coMTAsIDgpICogMjQgKiA2MCAqIDYwICogMTAwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pblRpbWVcbiAqIEBzdW1tYXJ5IE1pbmltdW0gYWxsb3dlZCB0aW1lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBtaW5UaW1lIH0gZnJvbSBcIi4vY29uc3RhbnRzL2RhdGUtZm5zL2NvbnN0YW50c1wiO1xuICpcbiAqIGNvbnN0IGlzVmFsaWQgPSAtODY0MDAwMDAwMDAwMDAwMSA+PSBtaW5UaW1lO1xuICogLy89PiBmYWxzZVxuICpcbiAqIG5ldyBEYXRlKC04NjQwMDAwMDAwMDAwMDAxKVxuICogLy89PiBJbnZhbGlkIERhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IG1pblRpbWUgPSAtbWF4VGltZTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbGxpc2Vjb25kc0luV2Vla1xuICogQHN1bW1hcnkgTWlsbGlzZWNvbmRzIGluIDEgd2Vlay5cbiAqL1xuZXhwb3J0IGNvbnN0IG1pbGxpc2Vjb25kc0luV2VlayA9IDYwNDgwMDAwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbGxpc2Vjb25kc0luRGF5XG4gKiBAc3VtbWFyeSBNaWxsaXNlY29uZHMgaW4gMSBkYXkuXG4gKi9cbmV4cG9ydCBjb25zdCBtaWxsaXNlY29uZHNJbkRheSA9IDg2NDAwMDAwO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWlsbGlzZWNvbmRzSW5NaW51dGVcbiAqIEBzdW1tYXJ5IE1pbGxpc2Vjb25kcyBpbiAxIG1pbnV0ZVxuICovXG5leHBvcnQgY29uc3QgbWlsbGlzZWNvbmRzSW5NaW51dGUgPSA2MDAwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbGxpc2Vjb25kc0luSG91clxuICogQHN1bW1hcnkgTWlsbGlzZWNvbmRzIGluIDEgaG91clxuICovXG5leHBvcnQgY29uc3QgbWlsbGlzZWNvbmRzSW5Ib3VyID0gMzYwMDAwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbGxpc2Vjb25kc0luU2Vjb25kXG4gKiBAc3VtbWFyeSBNaWxsaXNlY29uZHMgaW4gMSBzZWNvbmRcbiAqL1xuZXhwb3J0IGNvbnN0IG1pbGxpc2Vjb25kc0luU2Vjb25kID0gMTAwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbnV0ZXNJblllYXJcbiAqIEBzdW1tYXJ5IE1pbnV0ZXMgaW4gMSB5ZWFyLlxuICovXG5leHBvcnQgY29uc3QgbWludXRlc0luWWVhciA9IDUyNTYwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbnV0ZXNJbk1vbnRoXG4gKiBAc3VtbWFyeSBNaW51dGVzIGluIDEgbW9udGguXG4gKi9cbmV4cG9ydCBjb25zdCBtaW51dGVzSW5Nb250aCA9IDQzMjAwO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWludXRlc0luRGF5XG4gKiBAc3VtbWFyeSBNaW51dGVzIGluIDEgZGF5LlxuICovXG5leHBvcnQgY29uc3QgbWludXRlc0luRGF5ID0gMTQ0MDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbnV0ZXNJbkhvdXJcbiAqIEBzdW1tYXJ5IE1pbnV0ZXMgaW4gMSBob3VyLlxuICovXG5leHBvcnQgY29uc3QgbWludXRlc0luSG91ciA9IDYwO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbW9udGhzSW5RdWFydGVyXG4gKiBAc3VtbWFyeSBNb250aHMgaW4gMSBxdWFydGVyLlxuICovXG5leHBvcnQgY29uc3QgbW9udGhzSW5RdWFydGVyID0gMztcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1vbnRoc0luWWVhclxuICogQHN1bW1hcnkgTW9udGhzIGluIDEgeWVhci5cbiAqL1xuZXhwb3J0IGNvbnN0IG1vbnRoc0luWWVhciA9IDEyO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgcXVhcnRlcnNJblllYXJcbiAqIEBzdW1tYXJ5IFF1YXJ0ZXJzIGluIDEgeWVhclxuICovXG5leHBvcnQgY29uc3QgcXVhcnRlcnNJblllYXIgPSA0O1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgc2Vjb25kc0luSG91clxuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIGhvdXIuXG4gKi9cbmV4cG9ydCBjb25zdCBzZWNvbmRzSW5Ib3VyID0gMzYwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJbk1pbnV0ZVxuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIG1pbnV0ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHNlY29uZHNJbk1pbnV0ZSA9IDYwO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgc2Vjb25kc0luRGF5XG4gKiBAc3VtbWFyeSBTZWNvbmRzIGluIDEgZGF5LlxuICovXG5leHBvcnQgY29uc3Qgc2Vjb25kc0luRGF5ID0gc2Vjb25kc0luSG91ciAqIDI0O1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgc2Vjb25kc0luV2Vla1xuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIHdlZWsuXG4gKi9cbmV4cG9ydCBjb25zdCBzZWNvbmRzSW5XZWVrID0gc2Vjb25kc0luRGF5ICogNztcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJblllYXJcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSB5ZWFyLlxuICovXG5leHBvcnQgY29uc3Qgc2Vjb25kc0luWWVhciA9IHNlY29uZHNJbkRheSAqIGRheXNJblllYXI7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBzZWNvbmRzSW5Nb250aFxuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIG1vbnRoXG4gKi9cbmV4cG9ydCBjb25zdCBzZWNvbmRzSW5Nb250aCA9IHNlY29uZHNJblllYXIgLyAxMjtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJblF1YXJ0ZXJcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSBxdWFydGVyLlxuICovXG5leHBvcnQgY29uc3Qgc2Vjb25kc0luUXVhcnRlciA9IHNlY29uZHNJbk1vbnRoICogMztcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIGNvbnN0cnVjdEZyb21TeW1ib2xcbiAqIEBzdW1tYXJ5IFN5bWJvbCBlbmFibGluZyBEYXRlIGV4dGVuc2lvbnMgdG8gaW5oZXJpdCBwcm9wZXJ0aWVzIGZyb20gdGhlIHJlZmVyZW5jZSBkYXRlLlxuICpcbiAqIFRoZSBzeW1ib2wgaXMgdXNlZCB0byBlbmFibGUgdGhlIGBjb25zdHJ1Y3RGcm9tYCBmdW5jdGlvbiB0byBjb25zdHJ1Y3QgYSBkYXRlXG4gKiB1c2luZyBhIHJlZmVyZW5jZSBkYXRlIGFuZCBhIHZhbHVlLiBJdCBhbGxvd3MgdG8gdHJhbnNmZXIgZXh0cmEgcHJvcGVydGllc1xuICogZnJvbSB0aGUgcmVmZXJlbmNlIGRhdGUgdG8gdGhlIG5ldyBkYXRlLiBJdCdzIHVzZWZ1bCBmb3IgZXh0ZW5zaW9ucyBsaWtlXG4gKiBbYFRaRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy90eikgdGhhdCBhY2NlcHQgYSB0aW1lIHpvbmUgYXNcbiAqIGEgY29uc3RydWN0b3IgYXJndW1lbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBjb25zdHJ1Y3RGcm9tU3ltYm9sID0gU3ltYm9sLmZvcihcImNvbnN0cnVjdERhdGVGcm9tXCIpO1xuIiwKICAgICJpbXBvcnQgeyBjb25zdHJ1Y3RGcm9tU3ltYm9sIH0gZnJvbSBcIi4vY29uc3RhbnRzLmpzXCI7XG5cbi8qKlxuICogQG5hbWUgY29uc3RydWN0RnJvbVxuICogQGNhdGVnb3J5IEdlbmVyaWMgSGVscGVyc1xuICogQHN1bW1hcnkgQ29uc3RydWN0cyBhIGRhdGUgdXNpbmcgdGhlIHJlZmVyZW5jZSBkYXRlIGFuZCB0aGUgdmFsdWVcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSBmdW5jdGlvbiBjb25zdHJ1Y3RzIGEgbmV3IGRhdGUgdXNpbmcgdGhlIGNvbnN0cnVjdG9yIGZyb20gdGhlIHJlZmVyZW5jZVxuICogZGF0ZSBhbmQgdGhlIGdpdmVuIHZhbHVlLiBJdCBoZWxwcyB0byBidWlsZCBnZW5lcmljIGZ1bmN0aW9ucyB0aGF0IGFjY2VwdFxuICogZGF0ZSBleHRlbnNpb25zLlxuICpcbiAqIEl0IGRlZmF1bHRzIHRvIGBEYXRlYCBpZiB0aGUgcGFzc2VkIHJlZmVyZW5jZSBkYXRlIGlzIGEgbnVtYmVyIG9yIGEgc3RyaW5nLlxuICpcbiAqIFN0YXJ0aW5nIGZyb20gdjMuNy4wLCBpdCBhbGxvd3MgdG8gY29uc3RydWN0IGEgZGF0ZSB1c2luZyBgW1N5bWJvbC5mb3IoXCJjb25zdHJ1Y3REYXRlRnJvbVwiKV1gXG4gKiBlbmFibGluZyB0byB0cmFuc2ZlciBleHRyYSBwcm9wZXJ0aWVzIGZyb20gdGhlIHJlZmVyZW5jZSBkYXRlIHRvIHRoZSBuZXcgZGF0ZS5cbiAqIEl0J3MgdXNlZnVsIGZvciBleHRlbnNpb25zIGxpa2UgW2BUWkRhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdHopXG4gKiB0aGF0IGFjY2VwdCBhIHRpbWUgem9uZSBhcyBhIGNvbnN0cnVjdG9yIGFyZ3VtZW50LlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIHJlZmVyZW5jZSBkYXRlIHRvIHRha2UgY29uc3RydWN0b3IgZnJvbVxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNyZWF0ZSB0aGUgZGF0ZVxuICpcbiAqIEByZXR1cm5zIERhdGUgaW5pdGlhbGl6ZWQgdXNpbmcgdGhlIGdpdmVuIGRhdGUgYW5kIHZhbHVlXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IGNvbnN0cnVjdEZyb20gfSBmcm9tIFwiLi9jb25zdHJ1Y3RGcm9tL2RhdGUtZm5zXCI7XG4gKlxuICogLy8gQSBmdW5jdGlvbiB0aGF0IGNsb25lcyBhIGRhdGUgcHJlc2VydmluZyB0aGUgb3JpZ2luYWwgdHlwZVxuICogZnVuY3Rpb24gY2xvbmVEYXRlPERhdGVUeXBlIGV4dGVuZHMgRGF0ZT4oZGF0ZTogRGF0ZVR5cGUpOiBEYXRlVHlwZSB7XG4gKiAgIHJldHVybiBjb25zdHJ1Y3RGcm9tKFxuICogICAgIGRhdGUsIC8vIFVzZSBjb25zdHJ1Y3RvciBmcm9tIHRoZSBnaXZlbiBkYXRlXG4gKiAgICAgZGF0ZS5nZXRUaW1lKCkgLy8gVXNlIHRoZSBkYXRlIHZhbHVlIHRvIGNyZWF0ZSBhIG5ldyBkYXRlXG4gKiAgICk7XG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zdHJ1Y3RGcm9tKGRhdGUsIHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgZGF0ZSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZGF0ZSh2YWx1ZSk7XG5cbiAgaWYgKGRhdGUgJiYgdHlwZW9mIGRhdGUgPT09IFwib2JqZWN0XCIgJiYgY29uc3RydWN0RnJvbVN5bWJvbCBpbiBkYXRlKVxuICAgIHJldHVybiBkYXRlW2NvbnN0cnVjdEZyb21TeW1ib2xdKHZhbHVlKTtcblxuICBpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBuZXcgZGF0ZS5jb25zdHJ1Y3Rvcih2YWx1ZSk7XG5cbiAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlKTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBjb25zdHJ1Y3RGcm9tO1xuIiwKICAgICJpbXBvcnQgeyBjb25zdHJ1Y3RGcm9tIH0gZnJvbSBcIi4vY29uc3RydWN0RnJvbS5qc1wiO1xuXG4vKipcbiAqIEBuYW1lIHRvRGF0ZVxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBDb252ZXJ0IHRoZSBnaXZlbiBhcmd1bWVudCB0byBhbiBpbnN0YW5jZSBvZiBEYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQ29udmVydCB0aGUgZ2l2ZW4gYXJndW1lbnQgdG8gYW4gaW5zdGFuY2Ugb2YgRGF0ZS5cbiAqXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgYW4gaW5zdGFuY2Ugb2YgRGF0ZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgaXRzIGNsb25lLlxuICpcbiAqIElmIHRoZSBhcmd1bWVudCBpcyBhIG51bWJlciwgaXQgaXMgdHJlYXRlZCBhcyBhIHRpbWVzdGFtcC5cbiAqXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgbm9uZSBvZiB0aGUgYWJvdmUsIHRoZSBmdW5jdGlvbiByZXR1cm5zIEludmFsaWQgRGF0ZS5cbiAqXG4gKiBTdGFydGluZyBmcm9tIHYzLjcuMCwgaXQgY2xvbmVzIGEgZGF0ZSB1c2luZyBgW1N5bWJvbC5mb3IoXCJjb25zdHJ1Y3REYXRlRnJvbVwiKV1gXG4gKiBlbmFibGluZyB0byB0cmFuc2ZlciBleHRyYSBwcm9wZXJ0aWVzIGZyb20gdGhlIHJlZmVyZW5jZSBkYXRlIHRvIHRoZSBuZXcgZGF0ZS5cbiAqIEl0J3MgdXNlZnVsIGZvciBleHRlbnNpb25zIGxpa2UgW2BUWkRhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdHopXG4gKiB0aGF0IGFjY2VwdCBhIHRpbWUgem9uZSBhcyBhIGNvbnN0cnVjdG9yIGFyZ3VtZW50LlxuICpcbiAqICoqTm90ZSoqOiAqYWxsKiBEYXRlIGFyZ3VtZW50cyBwYXNzZWQgdG8gYW55ICpkYXRlLWZucyogZnVuY3Rpb24gaXMgcHJvY2Vzc2VkIGJ5IGB0b0RhdGVgLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gYXJndW1lbnQgLSBUaGUgdmFsdWUgdG8gY29udmVydFxuICpcbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgZGF0ZSBpbiB0aGUgbG9jYWwgdGltZSB6b25lXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENsb25lIHRoZSBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gdG9EYXRlKG5ldyBEYXRlKDIwMTQsIDEsIDExLCAxMSwgMzAsIDMwKSlcbiAqIC8vPT4gVHVlIEZlYiAxMSAyMDE0IDExOjMwOjMwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnZlcnQgdGhlIHRpbWVzdGFtcCB0byBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gdG9EYXRlKDEzOTIwOTg0MzAwMDApXG4gKiAvLz0+IFR1ZSBGZWIgMTEgMjAxNCAxMTozMDozMFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9EYXRlKGFyZ3VtZW50LCBjb250ZXh0KSB7XG4gIC8vIFtUT0RPXSBHZXQgcmlkIG9mIGB0b0RhdGVgIG9yIGBjb25zdHJ1Y3RGcm9tYD9cbiAgcmV0dXJuIGNvbnN0cnVjdEZyb20oY29udGV4dCB8fCBhcmd1bWVudCwgYXJndW1lbnQpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IHRvRGF0ZTtcbiIsCiAgICAibGV0IGRlZmF1bHRPcHRpb25zID0ge307XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0T3B0aW9ucygpIHtcbiAgcmV0dXJuIGRlZmF1bHRPcHRpb25zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0RGVmYXVsdE9wdGlvbnMobmV3T3B0aW9ucykge1xuICBkZWZhdWx0T3B0aW9ucyA9IG5ld09wdGlvbnM7XG59XG4iLAogICAgImltcG9ydCB7IGdldERlZmF1bHRPcHRpb25zIH0gZnJvbSBcIi4vX2xpYi9kZWZhdWx0T3B0aW9ucy5qc1wiO1xuaW1wb3J0IHsgdG9EYXRlIH0gZnJvbSBcIi4vdG9EYXRlLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBzdGFydE9mV2Vla30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZXZWVrXG4gKiBAY2F0ZWdvcnkgV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgc3RhcnQgb2YgYSB3ZWVrXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhIHdlZWsgZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mV2VlayhuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApKVxuICogLy89PiBTdW4gQXVnIDMxIDIwMTQgMDA6MDA6MDBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSWYgdGhlIHdlZWsgc3RhcnRzIG9uIE1vbmRheSwgdGhlIHN0YXJ0IG9mIHRoZSB3ZWVrIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZldlZWsobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSwgeyB3ZWVrU3RhcnRzT246IDEgfSlcbiAqIC8vPT4gTW9uIFNlcCAwMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFydE9mV2VlayhkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTtcbiAgY29uc3Qgd2Vla1N0YXJ0c09uID1cbiAgICBvcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIGRlZmF1bHRPcHRpb25zLndlZWtTdGFydHNPbiA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgMDtcblxuICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7XG4gIGNvbnN0IGRheSA9IF9kYXRlLmdldERheSgpO1xuICBjb25zdCBkaWZmID0gKGRheSA8IHdlZWtTdGFydHNPbiA/IDcgOiAwKSArIGRheSAtIHdlZWtTdGFydHNPbjtcblxuICBfZGF0ZS5zZXREYXRlKF9kYXRlLmdldERhdGUoKSAtIGRpZmYpO1xuICBfZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IHN0YXJ0T2ZXZWVrO1xuIiwKICAgICJpbXBvcnQgeyBzdGFydE9mV2VlayB9IGZyb20gXCIuL3N0YXJ0T2ZXZWVrLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBzdGFydE9mSVNPV2Vla30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZJU09XZWVrXG4gKiBAY2F0ZWdvcnkgSVNPIFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhbiBJU08gd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGFuIElTTyB3ZWVrIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogSVNPIHdlZWstbnVtYmVyaW5nIHllYXI6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgc3RhcnQgb2YgYW4gSVNPIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGFuIElTTyB3ZWVrIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZklTT1dlZWsobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gTW9uIFNlcCAwMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFydE9mSVNPV2VlayhkYXRlLCBvcHRpb25zKSB7XG4gIHJldHVybiBzdGFydE9mV2VlayhkYXRlLCB7IC4uLm9wdGlvbnMsIHdlZWtTdGFydHNPbjogMSB9KTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBzdGFydE9mSVNPV2VlaztcbiIsCiAgICAiaW1wb3J0IHsgY29uc3RydWN0RnJvbSB9IGZyb20gXCIuL2NvbnN0cnVjdEZyb20uanNcIjtcbmltcG9ydCB7IHN0YXJ0T2ZJU09XZWVrIH0gZnJvbSBcIi4vc3RhcnRPZklTT1dlZWsuanNcIjtcbmltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgZ2V0SVNPV2Vla1llYXJ9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBnZXRJU09XZWVrWWVhclxuICogQGNhdGVnb3J5IElTTyBXZWVrLU51bWJlcmluZyBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyIG9mIHRoZSBnaXZlbiBkYXRlLFxuICogd2hpY2ggYWx3YXlzIHN0YXJ0cyAzIGRheXMgYmVmb3JlIHRoZSB5ZWFyJ3MgZmlyc3QgVGh1cnNkYXkuXG4gKlxuICogSVNPIHdlZWstbnVtYmVyaW5nIHllYXI6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgSVNPIHdlZWstbnVtYmVyaW5nIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggSVNPLXdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMiBKYW51YXJ5IDIwMDU/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRJU09XZWVrWWVhcihuZXcgRGF0ZSgyMDA1LCAwLCAyKSlcbiAqIC8vPT4gMjAwNFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SVNPV2Vla1llYXIoZGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7XG4gIGNvbnN0IHllYXIgPSBfZGF0ZS5nZXRGdWxsWWVhcigpO1xuXG4gIGNvbnN0IGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIgPSBjb25zdHJ1Y3RGcm9tKF9kYXRlLCAwKTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZOZXh0WWVhci5zZXRGdWxsWWVhcih5ZWFyICsgMSwgMCwgNCk7XG4gIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIGNvbnN0IHN0YXJ0T2ZOZXh0WWVhciA9IHN0YXJ0T2ZJU09XZWVrKGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIpO1xuXG4gIGNvbnN0IGZvdXJ0aE9mSmFudWFyeU9mVGhpc1llYXIgPSBjb25zdHJ1Y3RGcm9tKF9kYXRlLCAwKTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhci5zZXRGdWxsWWVhcih5ZWFyLCAwLCA0KTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhci5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgY29uc3Qgc3RhcnRPZlRoaXNZZWFyID0gc3RhcnRPZklTT1dlZWsoZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhcik7XG5cbiAgaWYgKF9kYXRlLmdldFRpbWUoKSA+PSBzdGFydE9mTmV4dFllYXIuZ2V0VGltZSgpKSB7XG4gICAgcmV0dXJuIHllYXIgKyAxO1xuICB9IGVsc2UgaWYgKF9kYXRlLmdldFRpbWUoKSA+PSBzdGFydE9mVGhpc1llYXIuZ2V0VGltZSgpKSB7XG4gICAgcmV0dXJuIHllYXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHllYXIgLSAxO1xuICB9XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgZ2V0SVNPV2Vla1llYXI7XG4iLAogICAgImltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBHb29nbGUgQ2hyb21lIGFzIG9mIDY3LjAuMzM5Ni44NyBpbnRyb2R1Y2VkIHRpbWV6b25lcyB3aXRoIG9mZnNldCB0aGF0IGluY2x1ZGVzIHNlY29uZHMuXG4gKiBUaGV5IHVzdWFsbHkgYXBwZWFyIGZvciBkYXRlcyB0aGF0IGRlbm90ZSB0aW1lIGJlZm9yZSB0aGUgdGltZXpvbmVzIHdlcmUgaW50cm9kdWNlZFxuICogKGUuZy4gZm9yICdFdXJvcGUvUHJhZ3VlJyB0aW1lem9uZSB0aGUgb2Zmc2V0IGlzIEdNVCswMDo1Nzo0NCBiZWZvcmUgMSBPY3RvYmVyIDE4OTFcbiAqIGFuZCBHTVQrMDE6MDA6MDAgYWZ0ZXIgdGhhdCBkYXRlKVxuICpcbiAqIERhdGUjZ2V0VGltZXpvbmVPZmZzZXQgcmV0dXJucyB0aGUgb2Zmc2V0IGluIG1pbnV0ZXMgYW5kIHdvdWxkIHJldHVybiA1NyBmb3IgdGhlIGV4YW1wbGUgYWJvdmUsXG4gKiB3aGljaCB3b3VsZCBsZWFkIHRvIGluY29ycmVjdCBjYWxjdWxhdGlvbnMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB0aW1lem9uZSBvZmZzZXQgaW4gbWlsbGlzZWNvbmRzIHRoYXQgdGFrZXMgc2Vjb25kcyBpbiBhY2NvdW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyhkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUpO1xuICBjb25zdCB1dGNEYXRlID0gbmV3IERhdGUoXG4gICAgRGF0ZS5VVEMoXG4gICAgICBfZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgX2RhdGUuZ2V0TW9udGgoKSxcbiAgICAgIF9kYXRlLmdldERhdGUoKSxcbiAgICAgIF9kYXRlLmdldEhvdXJzKCksXG4gICAgICBfZGF0ZS5nZXRNaW51dGVzKCksXG4gICAgICBfZGF0ZS5nZXRTZWNvbmRzKCksXG4gICAgICBfZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSxcbiAgICApLFxuICApO1xuICB1dGNEYXRlLnNldFVUQ0Z1bGxZZWFyKF9kYXRlLmdldEZ1bGxZZWFyKCkpO1xuICByZXR1cm4gK2RhdGUgLSArdXRjRGF0ZTtcbn1cbiIsCiAgICAiaW1wb3J0IHsgY29uc3RydWN0RnJvbSB9IGZyb20gXCIuLi9jb25zdHJ1Y3RGcm9tLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVEYXRlcyhjb250ZXh0LCAuLi5kYXRlcykge1xuICBjb25zdCBub3JtYWxpemUgPSBjb25zdHJ1Y3RGcm9tLmJpbmQoXG4gICAgbnVsbCxcbiAgICBjb250ZXh0IHx8IGRhdGVzLmZpbmQoKGRhdGUpID0+IHR5cGVvZiBkYXRlID09PSBcIm9iamVjdFwiKSxcbiAgKTtcbiAgcmV0dXJuIGRhdGVzLm1hcChub3JtYWxpemUpO1xufVxuIiwKICAgICJpbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIHN0YXJ0T2ZEYXl9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBzdGFydE9mRGF5XG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYSBkYXkgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIGRheSBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIHN0YXJ0IG9mIGEgZGF5XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhIGRheSBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZEYXkobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gVHVlIFNlcCAwMiAyMDE0IDAwOjAwOjAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFydE9mRGF5KGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pO1xuICBfZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IHN0YXJ0T2ZEYXk7XG4iLAogICAgImltcG9ydCB7IGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMgfSBmcm9tIFwiLi9fbGliL2dldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMuanNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZURhdGVzIH0gZnJvbSBcIi4vX2xpYi9ub3JtYWxpemVEYXRlcy5qc1wiO1xuaW1wb3J0IHsgbWlsbGlzZWNvbmRzSW5EYXkgfSBmcm9tIFwiLi9jb25zdGFudHMuanNcIjtcbmltcG9ydCB7IHN0YXJ0T2ZEYXkgfSBmcm9tIFwiLi9zdGFydE9mRGF5LmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXN9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXNcbiAqIEBjYXRlZ29yeSBEYXkgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgZGF5cyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIGRheXMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuIFRoaXMgbWVhbnMgdGhhdCB0aGUgdGltZXMgYXJlIHJlbW92ZWRcbiAqIGZyb20gdGhlIGRhdGVzIGFuZCB0aGVuIHRoZSBkaWZmZXJlbmNlIGluIGRheXMgaXMgY2FsY3VsYXRlZC5cbiAqXG4gKiBAcGFyYW0gbGF0ZXJEYXRlIC0gVGhlIGxhdGVyIGRhdGVcbiAqIEBwYXJhbSBlYXJsaWVyRGF0ZSAtIFRoZSBlYXJsaWVyIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgb2JqZWN0XG4gKlxuICogQHJldHVybnMgVGhlIG51bWJlciBvZiBjYWxlbmRhciBkYXlzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEhvdyBtYW55IGNhbGVuZGFyIGRheXMgYXJlIGJldHdlZW5cbiAqIC8vIDIgSnVseSAyMDExIDIzOjAwOjAwIGFuZCAyIEp1bHkgMjAxMiAwMDowMDowMD9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhcbiAqICAgbmV3IERhdGUoMjAxMiwgNiwgMiwgMCwgMCksXG4gKiAgIG5ldyBEYXRlKDIwMTEsIDYsIDIsIDIzLCAwKVxuICogKVxuICogLy89PiAzNjZcbiAqIC8vIEhvdyBtYW55IGNhbGVuZGFyIGRheXMgYXJlIGJldHdlZW5cbiAqIC8vIDIgSnVseSAyMDExIDIzOjU5OjAwIGFuZCAzIEp1bHkgMjAxMSAwMDowMTowMD9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhcbiAqICAgbmV3IERhdGUoMjAxMSwgNiwgMywgMCwgMSksXG4gKiAgIG5ldyBEYXRlKDIwMTEsIDYsIDIsIDIzLCA1OSlcbiAqIClcbiAqIC8vPT4gMVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcyhcbiAgICBvcHRpb25zPy5pbixcbiAgICBsYXRlckRhdGUsXG4gICAgZWFybGllckRhdGUsXG4gICk7XG5cbiAgY29uc3QgbGF0ZXJTdGFydE9mRGF5ID0gc3RhcnRPZkRheShsYXRlckRhdGVfKTtcbiAgY29uc3QgZWFybGllclN0YXJ0T2ZEYXkgPSBzdGFydE9mRGF5KGVhcmxpZXJEYXRlXyk7XG5cbiAgY29uc3QgbGF0ZXJUaW1lc3RhbXAgPVxuICAgICtsYXRlclN0YXJ0T2ZEYXkgLSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKGxhdGVyU3RhcnRPZkRheSk7XG4gIGNvbnN0IGVhcmxpZXJUaW1lc3RhbXAgPVxuICAgICtlYXJsaWVyU3RhcnRPZkRheSAtIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMoZWFybGllclN0YXJ0T2ZEYXkpO1xuXG4gIC8vIFJvdW5kIHRoZSBudW1iZXIgb2YgZGF5cyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIGJlY2F1c2UgdGhlIG51bWJlciBvZlxuICAvLyBtaWxsaXNlY29uZHMgaW4gYSBkYXkgaXMgbm90IGNvbnN0YW50IChlLmcuIGl0J3MgZGlmZmVyZW50IGluIHRoZSB3ZWVrIG9mXG4gIC8vIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBjbG9jayBzaGlmdCkuXG4gIHJldHVybiBNYXRoLnJvdW5kKChsYXRlclRpbWVzdGFtcCAtIGVhcmxpZXJUaW1lc3RhbXApIC8gbWlsbGlzZWNvbmRzSW5EYXkpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cztcbiIsCiAgICAiaW1wb3J0IHsgY29uc3RydWN0RnJvbSB9IGZyb20gXCIuL2NvbnN0cnVjdEZyb20uanNcIjtcbmltcG9ydCB7IGdldElTT1dlZWtZZWFyIH0gZnJvbSBcIi4vZ2V0SVNPV2Vla1llYXIuanNcIjtcbmltcG9ydCB7IHN0YXJ0T2ZJU09XZWVrIH0gZnJvbSBcIi4vc3RhcnRPZklTT1dlZWsuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIHN0YXJ0T2ZJU09XZWVrWWVhcn0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZJU09XZWVrWWVhclxuICogQGNhdGVnb3J5IElTTyBXZWVrLU51bWJlcmluZyBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYW4gSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhbiBJU08gd2Vlay1udW1iZXJpbmcgeWVhcixcbiAqIHdoaWNoIGFsd2F5cyBzdGFydHMgMyBkYXlzIGJlZm9yZSB0aGUgeWVhcidzIGZpcnN0IFRodXJzZGF5LlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBJU08gd2Vlay1udW1iZXJpbmcgeWVhcjogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKiBAdHlwZVBhcmFtIFJlc3VsdERhdGUgLSBUaGUgcmVzdWx0IGBEYXRlYCB0eXBlLCBpdCBpcyB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBjb250ZXh0IGZ1bmN0aW9uIGlmIGl0IGlzIHBhc3NlZCwgb3IgaW5mZXJyZWQgZnJvbSB0aGUgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBzdGFydCBvZiBhbiBJU08gd2Vlay1udW1iZXJpbmcgeWVhclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYW4gSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIDIgSnVseSAyMDA1OlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZklTT1dlZWtZZWFyKG5ldyBEYXRlKDIwMDUsIDYsIDIpKVxuICogLy89PiBNb24gSmFuIDAzIDIwMDUgMDA6MDA6MDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0T2ZJU09XZWVrWWVhcihkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IHllYXIgPSBnZXRJU09XZWVrWWVhcihkYXRlLCBvcHRpb25zKTtcbiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5ID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCAwKTtcbiAgZm91cnRoT2ZKYW51YXJ5LnNldEZ1bGxZZWFyKHllYXIsIDAsIDQpO1xuICBmb3VydGhPZkphbnVhcnkuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBzdGFydE9mSVNPV2Vlayhmb3VydGhPZkphbnVhcnkpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IHN0YXJ0T2ZJU09XZWVrWWVhcjtcbiIsCiAgICAiLyoqXG4gKiBAbmFtZSBpc0RhdGVcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgSXMgdGhlIGdpdmVuIHZhbHVlIGEgZGF0ZT9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYW4gaW5zdGFuY2Ugb2YgRGF0ZS4gVGhlIGZ1bmN0aW9uIHdvcmtzIGZvciBkYXRlcyB0cmFuc2ZlcnJlZCBhY3Jvc3MgaWZyYW1lcy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIGRhdGVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIGEgdmFsaWQgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzRGF0ZShuZXcgRGF0ZSgpKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciBhbiBpbnZhbGlkIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBpc0RhdGUobmV3IERhdGUoTmFOKSlcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3Igc29tZSB2YWx1ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzRGF0ZSgnMjAxNC0wMi0zMScpXG4gKiAvLz0+IGZhbHNlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciBhbiBvYmplY3Q6XG4gKiBjb25zdCByZXN1bHQgPSBpc0RhdGUoe30pXG4gKiAvLz0+IGZhbHNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGUodmFsdWUpIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgfHxcbiAgICAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSBcIltvYmplY3QgRGF0ZV1cIilcbiAgKTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBpc0RhdGU7XG4iLAogICAgImltcG9ydCB7IGlzRGF0ZSB9IGZyb20gXCIuL2lzRGF0ZS5qc1wiO1xuaW1wb3J0IHsgdG9EYXRlIH0gZnJvbSBcIi4vdG9EYXRlLmpzXCI7XG5cbi8qKlxuICogQG5hbWUgaXNWYWxpZFxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBJcyB0aGUgZ2l2ZW4gZGF0ZSB2YWxpZD9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybnMgZmFsc2UgaWYgYXJndW1lbnQgaXMgSW52YWxpZCBEYXRlIGFuZCB0cnVlIG90aGVyd2lzZS5cbiAqIEFyZ3VtZW50IGlzIGNvbnZlcnRlZCB0byBEYXRlIHVzaW5nIGB0b0RhdGVgLiBTZWUgW3RvRGF0ZV0oaHR0cHM6Ly9kYXRlLWZucy5vcmcvZG9jcy90b0RhdGUpXG4gKiBJbnZhbGlkIERhdGUgaXMgYSBEYXRlLCB3aG9zZSB0aW1lIHZhbHVlIGlzIE5hTi5cbiAqXG4gKiBUaW1lIHZhbHVlIG9mIERhdGU6IGh0dHA6Ly9lczUuZ2l0aHViLmlvLyN4MTUuOS4xLjFcbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGNoZWNrXG4gKlxuICogQHJldHVybnMgVGhlIGRhdGUgaXMgdmFsaWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIHRoZSB2YWxpZCBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gaXNWYWxpZChuZXcgRGF0ZSgyMDE0LCAxLCAzMSkpXG4gKiAvLz0+IHRydWVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIHRoZSB2YWx1ZSwgY29udmVydGlibGUgaW50byBhIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBpc1ZhbGlkKDEzOTM4MDQ4MDAwMDApXG4gKiAvLz0+IHRydWVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIHRoZSBpbnZhbGlkIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBpc1ZhbGlkKG5ldyBEYXRlKCcnKSlcbiAqIC8vPT4gZmFsc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWQoZGF0ZSkge1xuICByZXR1cm4gISgoIWlzRGF0ZShkYXRlKSAmJiB0eXBlb2YgZGF0ZSAhPT0gXCJudW1iZXJcIikgfHwgaXNOYU4oK3RvRGF0ZShkYXRlKSkpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGlzVmFsaWQ7XG4iLAogICAgImltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgc3RhcnRPZlllYXJ9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBzdGFydE9mWWVhclxuICogQGNhdGVnb3J5IFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqIEB0eXBlUGFyYW0gUmVzdWx0RGF0ZSAtIFRoZSByZXN1bHQgYERhdGVgIHR5cGUsIGl0IGlzIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIGNvbnRleHQgZnVuY3Rpb24gaWYgaXQgaXMgcGFzc2VkLCBvciBpbmZlcnJlZCBmcm9tIHRoZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBzdGFydCBvZiBhIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGEgeWVhciBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZZZWFyKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMDApKVxuICogLy89PiBXZWQgSmFuIDAxIDIwMTQgMDA6MDA6MDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0T2ZZZWFyKGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgZGF0ZV8gPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pO1xuICBkYXRlXy5zZXRGdWxsWWVhcihkYXRlXy5nZXRGdWxsWWVhcigpLCAwLCAxKTtcbiAgZGF0ZV8uc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBkYXRlXztcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBzdGFydE9mWWVhcjtcbiIsCiAgICAiY29uc3QgZm9ybWF0RGlzdGFuY2VMb2NhbGUgPSB7XG4gIGxlc3NUaGFuWFNlY29uZHM6IHtcbiAgICBvbmU6IFwibGVzcyB0aGFuIGEgc2Vjb25kXCIsXG4gICAgb3RoZXI6IFwibGVzcyB0aGFuIHt7Y291bnR9fSBzZWNvbmRzXCIsXG4gIH0sXG5cbiAgeFNlY29uZHM6IHtcbiAgICBvbmU6IFwiMSBzZWNvbmRcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gc2Vjb25kc1wiLFxuICB9LFxuXG4gIGhhbGZBTWludXRlOiBcImhhbGYgYSBtaW51dGVcIixcblxuICBsZXNzVGhhblhNaW51dGVzOiB7XG4gICAgb25lOiBcImxlc3MgdGhhbiBhIG1pbnV0ZVwiLFxuICAgIG90aGVyOiBcImxlc3MgdGhhbiB7e2NvdW50fX0gbWludXRlc1wiLFxuICB9LFxuXG4gIHhNaW51dGVzOiB7XG4gICAgb25lOiBcIjEgbWludXRlXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IG1pbnV0ZXNcIixcbiAgfSxcblxuICBhYm91dFhIb3Vyczoge1xuICAgIG9uZTogXCJhYm91dCAxIGhvdXJcIixcbiAgICBvdGhlcjogXCJhYm91dCB7e2NvdW50fX0gaG91cnNcIixcbiAgfSxcblxuICB4SG91cnM6IHtcbiAgICBvbmU6IFwiMSBob3VyXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IGhvdXJzXCIsXG4gIH0sXG5cbiAgeERheXM6IHtcbiAgICBvbmU6IFwiMSBkYXlcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gZGF5c1wiLFxuICB9LFxuXG4gIGFib3V0WFdlZWtzOiB7XG4gICAgb25lOiBcImFib3V0IDEgd2Vla1wiLFxuICAgIG90aGVyOiBcImFib3V0IHt7Y291bnR9fSB3ZWVrc1wiLFxuICB9LFxuXG4gIHhXZWVrczoge1xuICAgIG9uZTogXCIxIHdlZWtcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gd2Vla3NcIixcbiAgfSxcblxuICBhYm91dFhNb250aHM6IHtcbiAgICBvbmU6IFwiYWJvdXQgMSBtb250aFwiLFxuICAgIG90aGVyOiBcImFib3V0IHt7Y291bnR9fSBtb250aHNcIixcbiAgfSxcblxuICB4TW9udGhzOiB7XG4gICAgb25lOiBcIjEgbW9udGhcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gbW9udGhzXCIsXG4gIH0sXG5cbiAgYWJvdXRYWWVhcnM6IHtcbiAgICBvbmU6IFwiYWJvdXQgMSB5ZWFyXCIsXG4gICAgb3RoZXI6IFwiYWJvdXQge3tjb3VudH19IHllYXJzXCIsXG4gIH0sXG5cbiAgeFllYXJzOiB7XG4gICAgb25lOiBcIjEgeWVhclwiLFxuICAgIG90aGVyOiBcInt7Y291bnR9fSB5ZWFyc1wiLFxuICB9LFxuXG4gIG92ZXJYWWVhcnM6IHtcbiAgICBvbmU6IFwib3ZlciAxIHllYXJcIixcbiAgICBvdGhlcjogXCJvdmVyIHt7Y291bnR9fSB5ZWFyc1wiLFxuICB9LFxuXG4gIGFsbW9zdFhZZWFyczoge1xuICAgIG9uZTogXCJhbG1vc3QgMSB5ZWFyXCIsXG4gICAgb3RoZXI6IFwiYWxtb3N0IHt7Y291bnR9fSB5ZWFyc1wiLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdERpc3RhbmNlID0gKHRva2VuLCBjb3VudCwgb3B0aW9ucykgPT4ge1xuICBsZXQgcmVzdWx0O1xuXG4gIGNvbnN0IHRva2VuVmFsdWUgPSBmb3JtYXREaXN0YW5jZUxvY2FsZVt0b2tlbl07XG4gIGlmICh0eXBlb2YgdG9rZW5WYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJlc3VsdCA9IHRva2VuVmFsdWU7XG4gIH0gZWxzZSBpZiAoY291bnQgPT09IDEpIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlLm9uZTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlLm90aGVyLnJlcGxhY2UoXCJ7e2NvdW50fX1cIiwgY291bnQudG9TdHJpbmcoKSk7XG4gIH1cblxuICBpZiAob3B0aW9ucz8uYWRkU3VmZml4KSB7XG4gICAgaWYgKG9wdGlvbnMuY29tcGFyaXNvbiAmJiBvcHRpb25zLmNvbXBhcmlzb24gPiAwKSB7XG4gICAgICByZXR1cm4gXCJpbiBcIiArIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIFwiIGFnb1wiO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwKICAgICJleHBvcnQgZnVuY3Rpb24gYnVpbGRGb3JtYXRMb25nRm4oYXJncykge1xuICByZXR1cm4gKG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIC8vIFRPRE86IFJlbW92ZSBTdHJpbmcoKVxuICAgIGNvbnN0IHdpZHRoID0gb3B0aW9ucy53aWR0aCA/IFN0cmluZyhvcHRpb25zLndpZHRoKSA6IGFyZ3MuZGVmYXVsdFdpZHRoO1xuICAgIGNvbnN0IGZvcm1hdCA9IGFyZ3MuZm9ybWF0c1t3aWR0aF0gfHwgYXJncy5mb3JtYXRzW2FyZ3MuZGVmYXVsdFdpZHRoXTtcbiAgICByZXR1cm4gZm9ybWF0O1xuICB9O1xufVxuIiwKICAgICJpbXBvcnQgeyBidWlsZEZvcm1hdExvbmdGbiB9IGZyb20gXCIuLi8uLi9fbGliL2J1aWxkRm9ybWF0TG9uZ0ZuLmpzXCI7XG5cbmNvbnN0IGRhdGVGb3JtYXRzID0ge1xuICBmdWxsOiBcIkVFRUUsIE1NTU0gZG8sIHlcIixcbiAgbG9uZzogXCJNTU1NIGRvLCB5XCIsXG4gIG1lZGl1bTogXCJNTU0gZCwgeVwiLFxuICBzaG9ydDogXCJNTS9kZC95eXl5XCIsXG59O1xuXG5jb25zdCB0aW1lRm9ybWF0cyA9IHtcbiAgZnVsbDogXCJoOm1tOnNzIGEgenp6elwiLFxuICBsb25nOiBcImg6bW06c3MgYSB6XCIsXG4gIG1lZGl1bTogXCJoOm1tOnNzIGFcIixcbiAgc2hvcnQ6IFwiaDptbSBhXCIsXG59O1xuXG5jb25zdCBkYXRlVGltZUZvcm1hdHMgPSB7XG4gIGZ1bGw6IFwie3tkYXRlfX0gJ2F0JyB7e3RpbWV9fVwiLFxuICBsb25nOiBcInt7ZGF0ZX19ICdhdCcge3t0aW1lfX1cIixcbiAgbWVkaXVtOiBcInt7ZGF0ZX19LCB7e3RpbWV9fVwiLFxuICBzaG9ydDogXCJ7e2RhdGV9fSwge3t0aW1lfX1cIixcbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtYXRMb25nID0ge1xuICBkYXRlOiBidWlsZEZvcm1hdExvbmdGbih7XG4gICAgZm9ybWF0czogZGF0ZUZvcm1hdHMsXG4gICAgZGVmYXVsdFdpZHRoOiBcImZ1bGxcIixcbiAgfSksXG5cbiAgdGltZTogYnVpbGRGb3JtYXRMb25nRm4oe1xuICAgIGZvcm1hdHM6IHRpbWVGb3JtYXRzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJmdWxsXCIsXG4gIH0pLFxuXG4gIGRhdGVUaW1lOiBidWlsZEZvcm1hdExvbmdGbih7XG4gICAgZm9ybWF0czogZGF0ZVRpbWVGb3JtYXRzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJmdWxsXCIsXG4gIH0pLFxufTtcbiIsCiAgICAiY29uc3QgZm9ybWF0UmVsYXRpdmVMb2NhbGUgPSB7XG4gIGxhc3RXZWVrOiBcIidsYXN0JyBlZWVlICdhdCcgcFwiLFxuICB5ZXN0ZXJkYXk6IFwiJ3llc3RlcmRheSBhdCcgcFwiLFxuICB0b2RheTogXCIndG9kYXkgYXQnIHBcIixcbiAgdG9tb3Jyb3c6IFwiJ3RvbW9ycm93IGF0JyBwXCIsXG4gIG5leHRXZWVrOiBcImVlZWUgJ2F0JyBwXCIsXG4gIG90aGVyOiBcIlBcIixcbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtYXRSZWxhdGl2ZSA9ICh0b2tlbiwgX2RhdGUsIF9iYXNlRGF0ZSwgX29wdGlvbnMpID0+XG4gIGZvcm1hdFJlbGF0aXZlTG9jYWxlW3Rva2VuXTtcbiIsCiAgICAiLyoqXG4gKiBUaGUgbG9jYWxpemUgZnVuY3Rpb24gYXJndW1lbnQgY2FsbGJhY2sgd2hpY2ggYWxsb3dzIHRvIGNvbnZlcnQgcmF3IHZhbHVlIHRvXG4gKiB0aGUgYWN0dWFsIHR5cGUuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNvbnZlcnRcbiAqXG4gKiBAcmV0dXJucyBUaGUgY29udmVydGVkIHZhbHVlXG4gKi9cblxuLyoqXG4gKiBUaGUgbWFwIG9mIGxvY2FsaXplZCB2YWx1ZXMgZm9yIGVhY2ggd2lkdGguXG4gKi9cblxuLyoqXG4gKiBUaGUgaW5kZXggdHlwZSBvZiB0aGUgbG9jYWxlIHVuaXQgdmFsdWUuIEl0IHR5cGVzIGNvbnZlcnNpb24gb2YgdW5pdHMgb2ZcbiAqIHZhbHVlcyB0aGF0IGRvbid0IHN0YXJ0IGF0IDAgKGkuZS4gcXVhcnRlcnMpLlxuICovXG5cbi8qKlxuICogQ29udmVydHMgdGhlIHVuaXQgdmFsdWUgdG8gdGhlIHR1cGxlIG9mIHZhbHVlcy5cbiAqL1xuXG4vKipcbiAqIFRoZSB0dXBsZSBvZiBsb2NhbGl6ZWQgZXJhIHZhbHVlcy4gVGhlIGZpcnN0IGVsZW1lbnQgcmVwcmVzZW50cyBCQyxcbiAqIHRoZSBzZWNvbmQgZWxlbWVudCByZXByZXNlbnRzIEFELlxuICovXG5cbi8qKlxuICogVGhlIHR1cGxlIG9mIGxvY2FsaXplZCBxdWFydGVyIHZhbHVlcy4gVGhlIGZpcnN0IGVsZW1lbnQgcmVwcmVzZW50cyBRMS5cbiAqL1xuXG4vKipcbiAqIFRoZSB0dXBsZSBvZiBsb2NhbGl6ZWQgZGF5IHZhbHVlcy4gVGhlIGZpcnN0IGVsZW1lbnQgcmVwcmVzZW50cyBTdW5kYXkuXG4gKi9cblxuLyoqXG4gKiBUaGUgdHVwbGUgb2YgbG9jYWxpemVkIG1vbnRoIHZhbHVlcy4gVGhlIGZpcnN0IGVsZW1lbnQgcmVwcmVzZW50cyBKYW51YXJ5LlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZExvY2FsaXplRm4oYXJncykge1xuICByZXR1cm4gKHZhbHVlLCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IG9wdGlvbnM/LmNvbnRleHQgPyBTdHJpbmcob3B0aW9ucy5jb250ZXh0KSA6IFwic3RhbmRhbG9uZVwiO1xuXG4gICAgbGV0IHZhbHVlc0FycmF5O1xuICAgIGlmIChjb250ZXh0ID09PSBcImZvcm1hdHRpbmdcIiAmJiBhcmdzLmZvcm1hdHRpbmdWYWx1ZXMpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRXaWR0aCA9IGFyZ3MuZGVmYXVsdEZvcm1hdHRpbmdXaWR0aCB8fCBhcmdzLmRlZmF1bHRXaWR0aDtcbiAgICAgIGNvbnN0IHdpZHRoID0gb3B0aW9ucz8ud2lkdGggPyBTdHJpbmcob3B0aW9ucy53aWR0aCkgOiBkZWZhdWx0V2lkdGg7XG5cbiAgICAgIHZhbHVlc0FycmF5ID1cbiAgICAgICAgYXJncy5mb3JtYXR0aW5nVmFsdWVzW3dpZHRoXSB8fCBhcmdzLmZvcm1hdHRpbmdWYWx1ZXNbZGVmYXVsdFdpZHRoXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGVmYXVsdFdpZHRoID0gYXJncy5kZWZhdWx0V2lkdGg7XG4gICAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnM/LndpZHRoID8gU3RyaW5nKG9wdGlvbnMud2lkdGgpIDogYXJncy5kZWZhdWx0V2lkdGg7XG5cbiAgICAgIHZhbHVlc0FycmF5ID0gYXJncy52YWx1ZXNbd2lkdGhdIHx8IGFyZ3MudmFsdWVzW2RlZmF1bHRXaWR0aF07XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gYXJncy5hcmd1bWVudENhbGxiYWNrID8gYXJncy5hcmd1bWVudENhbGxiYWNrKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIEZvciBzb21lIHJlYXNvbiBUeXBlU2NyaXB0IGp1c3QgZG9uJ3Qgd2FudCB0byBtYXRjaCBpdCwgbm8gbWF0dGVyIGhvdyBoYXJkIHdlIHRyeS4gSSBjaGFsbGVuZ2UgeW91IHRvIHRyeSB0byByZW1vdmUgaXQhXG4gICAgcmV0dXJuIHZhbHVlc0FycmF5W2luZGV4XTtcbiAgfTtcbn1cbiIsCiAgICAiaW1wb3J0IHsgYnVpbGRMb2NhbGl6ZUZuIH0gZnJvbSBcIi4uLy4uL19saWIvYnVpbGRMb2NhbGl6ZUZuLmpzXCI7XG5cbmNvbnN0IGVyYVZhbHVlcyA9IHtcbiAgbmFycm93OiBbXCJCXCIsIFwiQVwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcIkJDXCIsIFwiQURcIl0sXG4gIHdpZGU6IFtcIkJlZm9yZSBDaHJpc3RcIiwgXCJBbm5vIERvbWluaVwiXSxcbn07XG5cbmNvbnN0IHF1YXJ0ZXJWYWx1ZXMgPSB7XG4gIG5hcnJvdzogW1wiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcIlExXCIsIFwiUTJcIiwgXCJRM1wiLCBcIlE0XCJdLFxuICB3aWRlOiBbXCIxc3QgcXVhcnRlclwiLCBcIjJuZCBxdWFydGVyXCIsIFwiM3JkIHF1YXJ0ZXJcIiwgXCI0dGggcXVhcnRlclwiXSxcbn07XG5cbi8vIE5vdGU6IGluIEVuZ2xpc2gsIHRoZSBuYW1lcyBvZiBkYXlzIG9mIHRoZSB3ZWVrIGFuZCBtb250aHMgYXJlIGNhcGl0YWxpemVkLlxuLy8gSWYgeW91IGFyZSBtYWtpbmcgYSBuZXcgbG9jYWxlIGJhc2VkIG9uIHRoaXMgb25lLCBjaGVjayBpZiB0aGUgc2FtZSBpcyB0cnVlIGZvciB0aGUgbGFuZ3VhZ2UgeW91J3JlIHdvcmtpbmcgb24uXG4vLyBHZW5lcmFsbHksIGZvcm1hdHRlZCBkYXRlcyBzaG91bGQgbG9vayBsaWtlIHRoZXkgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBzZW50ZW5jZSxcbi8vIGUuZy4gaW4gU3BhbmlzaCBsYW5ndWFnZSB0aGUgd2Vla2RheXMgYW5kIG1vbnRocyBzaG91bGQgYmUgaW4gdGhlIGxvd2VyY2FzZS5cbmNvbnN0IG1vbnRoVmFsdWVzID0ge1xuICBuYXJyb3c6IFtcIkpcIiwgXCJGXCIsIFwiTVwiLCBcIkFcIiwgXCJNXCIsIFwiSlwiLCBcIkpcIiwgXCJBXCIsIFwiU1wiLCBcIk9cIiwgXCJOXCIsIFwiRFwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcbiAgICBcIkphblwiLFxuICAgIFwiRmViXCIsXG4gICAgXCJNYXJcIixcbiAgICBcIkFwclwiLFxuICAgIFwiTWF5XCIsXG4gICAgXCJKdW5cIixcbiAgICBcIkp1bFwiLFxuICAgIFwiQXVnXCIsXG4gICAgXCJTZXBcIixcbiAgICBcIk9jdFwiLFxuICAgIFwiTm92XCIsXG4gICAgXCJEZWNcIixcbiAgXSxcblxuICB3aWRlOiBbXG4gICAgXCJKYW51YXJ5XCIsXG4gICAgXCJGZWJydWFyeVwiLFxuICAgIFwiTWFyY2hcIixcbiAgICBcIkFwcmlsXCIsXG4gICAgXCJNYXlcIixcbiAgICBcIkp1bmVcIixcbiAgICBcIkp1bHlcIixcbiAgICBcIkF1Z3VzdFwiLFxuICAgIFwiU2VwdGVtYmVyXCIsXG4gICAgXCJPY3RvYmVyXCIsXG4gICAgXCJOb3ZlbWJlclwiLFxuICAgIFwiRGVjZW1iZXJcIixcbiAgXSxcbn07XG5cbmNvbnN0IGRheVZhbHVlcyA9IHtcbiAgbmFycm93OiBbXCJTXCIsIFwiTVwiLCBcIlRcIiwgXCJXXCIsIFwiVFwiLCBcIkZcIiwgXCJTXCJdLFxuICBzaG9ydDogW1wiU3VcIiwgXCJNb1wiLCBcIlR1XCIsIFwiV2VcIiwgXCJUaFwiLCBcIkZyXCIsIFwiU2FcIl0sXG4gIGFiYnJldmlhdGVkOiBbXCJTdW5cIiwgXCJNb25cIiwgXCJUdWVcIiwgXCJXZWRcIiwgXCJUaHVcIiwgXCJGcmlcIiwgXCJTYXRcIl0sXG4gIHdpZGU6IFtcbiAgICBcIlN1bmRheVwiLFxuICAgIFwiTW9uZGF5XCIsXG4gICAgXCJUdWVzZGF5XCIsXG4gICAgXCJXZWRuZXNkYXlcIixcbiAgICBcIlRodXJzZGF5XCIsXG4gICAgXCJGcmlkYXlcIixcbiAgICBcIlNhdHVyZGF5XCIsXG4gIF0sXG59O1xuXG5jb25zdCBkYXlQZXJpb2RWYWx1ZXMgPSB7XG4gIG5hcnJvdzoge1xuICAgIGFtOiBcImFcIixcbiAgICBwbTogXCJwXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlcIixcbiAgICBub29uOiBcIm5cIixcbiAgICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiYWZ0ZXJub29uXCIsXG4gICAgZXZlbmluZzogXCJldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwibmlnaHRcIixcbiAgfSxcbiAgYWJicmV2aWF0ZWQ6IHtcbiAgICBhbTogXCJBTVwiLFxuICAgIHBtOiBcIlBNXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiYWZ0ZXJub29uXCIsXG4gICAgZXZlbmluZzogXCJldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwibmlnaHRcIixcbiAgfSxcbiAgd2lkZToge1xuICAgIGFtOiBcImEubS5cIixcbiAgICBwbTogXCJwLm0uXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiYWZ0ZXJub29uXCIsXG4gICAgZXZlbmluZzogXCJldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwibmlnaHRcIixcbiAgfSxcbn07XG5cbmNvbnN0IGZvcm1hdHRpbmdEYXlQZXJpb2RWYWx1ZXMgPSB7XG4gIG5hcnJvdzoge1xuICAgIGFtOiBcImFcIixcbiAgICBwbTogXCJwXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlcIixcbiAgICBub29uOiBcIm5cIixcbiAgICBtb3JuaW5nOiBcImluIHRoZSBtb3JuaW5nXCIsXG4gICAgYWZ0ZXJub29uOiBcImluIHRoZSBhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImluIHRoZSBldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwiYXQgbmlnaHRcIixcbiAgfSxcbiAgYWJicmV2aWF0ZWQ6IHtcbiAgICBhbTogXCJBTVwiLFxuICAgIHBtOiBcIlBNXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcImluIHRoZSBtb3JuaW5nXCIsXG4gICAgYWZ0ZXJub29uOiBcImluIHRoZSBhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImluIHRoZSBldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwiYXQgbmlnaHRcIixcbiAgfSxcbiAgd2lkZToge1xuICAgIGFtOiBcImEubS5cIixcbiAgICBwbTogXCJwLm0uXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcImluIHRoZSBtb3JuaW5nXCIsXG4gICAgYWZ0ZXJub29uOiBcImluIHRoZSBhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImluIHRoZSBldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwiYXQgbmlnaHRcIixcbiAgfSxcbn07XG5cbmNvbnN0IG9yZGluYWxOdW1iZXIgPSAoZGlydHlOdW1iZXIsIF9vcHRpb25zKSA9PiB7XG4gIGNvbnN0IG51bWJlciA9IE51bWJlcihkaXJ0eU51bWJlcik7XG5cbiAgLy8gSWYgb3JkaW5hbCBudW1iZXJzIGRlcGVuZCBvbiBjb250ZXh0LCBmb3IgZXhhbXBsZSxcbiAgLy8gaWYgdGhleSBhcmUgZGlmZmVyZW50IGZvciBkaWZmZXJlbnQgZ3JhbW1hdGljYWwgZ2VuZGVycyxcbiAgLy8gdXNlIGBvcHRpb25zLnVuaXRgLlxuICAvL1xuICAvLyBgdW5pdGAgY2FuIGJlICd5ZWFyJywgJ3F1YXJ0ZXInLCAnbW9udGgnLCAnd2VlaycsICdkYXRlJywgJ2RheU9mWWVhcicsXG4gIC8vICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJy5cblxuICBjb25zdCByZW0xMDAgPSBudW1iZXIgJSAxMDA7XG4gIGlmIChyZW0xMDAgPiAyMCB8fCByZW0xMDAgPCAxMCkge1xuICAgIHN3aXRjaCAocmVtMTAwICUgMTApIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIG51bWJlciArIFwic3RcIjtcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgcmV0dXJuIG51bWJlciArIFwibmRcIjtcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgcmV0dXJuIG51bWJlciArIFwicmRcIjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bWJlciArIFwidGhcIjtcbn07XG5cbmV4cG9ydCBjb25zdCBsb2NhbGl6ZSA9IHtcbiAgb3JkaW5hbE51bWJlcixcblxuICBlcmE6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBlcmFWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgfSksXG5cbiAgcXVhcnRlcjogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IHF1YXJ0ZXJWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgICBhcmd1bWVudENhbGxiYWNrOiAocXVhcnRlcikgPT4gcXVhcnRlciAtIDEsXG4gIH0pLFxuXG4gIG1vbnRoOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogbW9udGhWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgfSksXG5cbiAgZGF5OiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogZGF5VmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJ3aWRlXCIsXG4gIH0pLFxuXG4gIGRheVBlcmlvZDogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IGRheVBlcmlvZFZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICAgIGZvcm1hdHRpbmdWYWx1ZXM6IGZvcm1hdHRpbmdEYXlQZXJpb2RWYWx1ZXMsXG4gICAgZGVmYXVsdEZvcm1hdHRpbmdXaWR0aDogXCJ3aWRlXCIsXG4gIH0pLFxufTtcbiIsCiAgICAiZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTWF0Y2hGbihhcmdzKSB7XG4gIHJldHVybiAoc3RyaW5nLCBvcHRpb25zID0ge30pID0+IHtcbiAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnMud2lkdGg7XG5cbiAgICBjb25zdCBtYXRjaFBhdHRlcm4gPVxuICAgICAgKHdpZHRoICYmIGFyZ3MubWF0Y2hQYXR0ZXJuc1t3aWR0aF0pIHx8XG4gICAgICBhcmdzLm1hdGNoUGF0dGVybnNbYXJncy5kZWZhdWx0TWF0Y2hXaWR0aF07XG4gICAgY29uc3QgbWF0Y2hSZXN1bHQgPSBzdHJpbmcubWF0Y2gobWF0Y2hQYXR0ZXJuKTtcblxuICAgIGlmICghbWF0Y2hSZXN1bHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBtYXRjaGVkU3RyaW5nID0gbWF0Y2hSZXN1bHRbMF07XG5cbiAgICBjb25zdCBwYXJzZVBhdHRlcm5zID1cbiAgICAgICh3aWR0aCAmJiBhcmdzLnBhcnNlUGF0dGVybnNbd2lkdGhdKSB8fFxuICAgICAgYXJncy5wYXJzZVBhdHRlcm5zW2FyZ3MuZGVmYXVsdFBhcnNlV2lkdGhdO1xuXG4gICAgY29uc3Qga2V5ID0gQXJyYXkuaXNBcnJheShwYXJzZVBhdHRlcm5zKVxuICAgICAgPyBmaW5kSW5kZXgocGFyc2VQYXR0ZXJucywgKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChtYXRjaGVkU3RyaW5nKSlcbiAgICAgIDogLy8gW1RPRE9dIC0tIEkgY2hhbGxlbmdlIHlvdSB0byBmaXggdGhlIHR5cGVcbiAgICAgICAgZmluZEtleShwYXJzZVBhdHRlcm5zLCAocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KG1hdGNoZWRTdHJpbmcpKTtcblxuICAgIGxldCB2YWx1ZTtcblxuICAgIHZhbHVlID0gYXJncy52YWx1ZUNhbGxiYWNrID8gYXJncy52YWx1ZUNhbGxiYWNrKGtleSkgOiBrZXk7XG4gICAgdmFsdWUgPSBvcHRpb25zLnZhbHVlQ2FsbGJhY2tcbiAgICAgID8gLy8gW1RPRE9dIC0tIEkgY2hhbGxlbmdlIHlvdSB0byBmaXggdGhlIHR5cGVcbiAgICAgICAgb3B0aW9ucy52YWx1ZUNhbGxiYWNrKHZhbHVlKVxuICAgICAgOiB2YWx1ZTtcblxuICAgIGNvbnN0IHJlc3QgPSBzdHJpbmcuc2xpY2UobWF0Y2hlZFN0cmluZy5sZW5ndGgpO1xuXG4gICAgcmV0dXJuIHsgdmFsdWUsIHJlc3QgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmluZEtleShvYmplY3QsIHByZWRpY2F0ZSkge1xuICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICBpZiAoXG4gICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmXG4gICAgICBwcmVkaWNhdGUob2JqZWN0W2tleV0pXG4gICAgKSB7XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBmaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSkge1xuICBmb3IgKGxldCBrZXkgPSAwOyBrZXkgPCBhcnJheS5sZW5ndGg7IGtleSsrKSB7XG4gICAgaWYgKHByZWRpY2F0ZShhcnJheVtrZXldKSkge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsCiAgICAiZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTWF0Y2hQYXR0ZXJuRm4oYXJncykge1xuICByZXR1cm4gKHN0cmluZywgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgY29uc3QgbWF0Y2hSZXN1bHQgPSBzdHJpbmcubWF0Y2goYXJncy5tYXRjaFBhdHRlcm4pO1xuICAgIGlmICghbWF0Y2hSZXN1bHQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG1hdGNoZWRTdHJpbmcgPSBtYXRjaFJlc3VsdFswXTtcblxuICAgIGNvbnN0IHBhcnNlUmVzdWx0ID0gc3RyaW5nLm1hdGNoKGFyZ3MucGFyc2VQYXR0ZXJuKTtcbiAgICBpZiAoIXBhcnNlUmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICBsZXQgdmFsdWUgPSBhcmdzLnZhbHVlQ2FsbGJhY2tcbiAgICAgID8gYXJncy52YWx1ZUNhbGxiYWNrKHBhcnNlUmVzdWx0WzBdKVxuICAgICAgOiBwYXJzZVJlc3VsdFswXTtcblxuICAgIC8vIFtUT0RPXSBJIGNoYWxsZW5nZSB5b3UgdG8gZml4IHRoZSB0eXBlXG4gICAgdmFsdWUgPSBvcHRpb25zLnZhbHVlQ2FsbGJhY2sgPyBvcHRpb25zLnZhbHVlQ2FsbGJhY2sodmFsdWUpIDogdmFsdWU7XG5cbiAgICBjb25zdCByZXN0ID0gc3RyaW5nLnNsaWNlKG1hdGNoZWRTdHJpbmcubGVuZ3RoKTtcblxuICAgIHJldHVybiB7IHZhbHVlLCByZXN0IH07XG4gIH07XG59XG4iLAogICAgImltcG9ydCB7IGJ1aWxkTWF0Y2hGbiB9IGZyb20gXCIuLi8uLi9fbGliL2J1aWxkTWF0Y2hGbi5qc1wiO1xuaW1wb3J0IHsgYnVpbGRNYXRjaFBhdHRlcm5GbiB9IGZyb20gXCIuLi8uLi9fbGliL2J1aWxkTWF0Y2hQYXR0ZXJuRm4uanNcIjtcblxuY29uc3QgbWF0Y2hPcmRpbmFsTnVtYmVyUGF0dGVybiA9IC9eKFxcZCspKHRofHN0fG5kfHJkKT8vaTtcbmNvbnN0IHBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm4gPSAvXFxkKy9pO1xuXG5jb25zdCBtYXRjaEVyYVBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eKGJ8YSkvaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKGJcXC4/XFxzP2NcXC4/fGJcXC4/XFxzP2NcXC4/XFxzP2VcXC4/fGFcXC4/XFxzP2RcXC4/fGNcXC4/XFxzP2VcXC4/KS9pLFxuICB3aWRlOiAvXihiZWZvcmUgY2hyaXN0fGJlZm9yZSBjb21tb24gZXJhfGFubm8gZG9taW5pfGNvbW1vbiBlcmEpL2ksXG59O1xuY29uc3QgcGFyc2VFcmFQYXR0ZXJucyA9IHtcbiAgYW55OiBbL15iL2ksIC9eKGF8YykvaV0sXG59O1xuXG5jb25zdCBtYXRjaFF1YXJ0ZXJQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXlsxMjM0XS9pLFxuICBhYmJyZXZpYXRlZDogL15xWzEyMzRdL2ksXG4gIHdpZGU6IC9eWzEyMzRdKHRofHN0fG5kfHJkKT8gcXVhcnRlci9pLFxufTtcbmNvbnN0IHBhcnNlUXVhcnRlclBhdHRlcm5zID0ge1xuICBhbnk6IFsvMS9pLCAvMi9pLCAvMy9pLCAvNC9pXSxcbn07XG5cbmNvbnN0IG1hdGNoTW9udGhQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXltqZm1hc29uZF0vaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKGphbnxmZWJ8bWFyfGFwcnxtYXl8anVufGp1bHxhdWd8c2VwfG9jdHxub3Z8ZGVjKS9pLFxuICB3aWRlOiAvXihqYW51YXJ5fGZlYnJ1YXJ5fG1hcmNofGFwcmlsfG1heXxqdW5lfGp1bHl8YXVndXN0fHNlcHRlbWJlcnxvY3RvYmVyfG5vdmVtYmVyfGRlY2VtYmVyKS9pLFxufTtcbmNvbnN0IHBhcnNlTW9udGhQYXR0ZXJucyA9IHtcbiAgbmFycm93OiBbXG4gICAgL15qL2ksXG4gICAgL15mL2ksXG4gICAgL15tL2ksXG4gICAgL15hL2ksXG4gICAgL15tL2ksXG4gICAgL15qL2ksXG4gICAgL15qL2ksXG4gICAgL15hL2ksXG4gICAgL15zL2ksXG4gICAgL15vL2ksXG4gICAgL15uL2ksXG4gICAgL15kL2ksXG4gIF0sXG5cbiAgYW55OiBbXG4gICAgL15qYS9pLFxuICAgIC9eZi9pLFxuICAgIC9ebWFyL2ksXG4gICAgL15hcC9pLFxuICAgIC9ebWF5L2ksXG4gICAgL15qdW4vaSxcbiAgICAvXmp1bC9pLFxuICAgIC9eYXUvaSxcbiAgICAvXnMvaSxcbiAgICAvXm8vaSxcbiAgICAvXm4vaSxcbiAgICAvXmQvaSxcbiAgXSxcbn07XG5cbmNvbnN0IG1hdGNoRGF5UGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL15bc210d2ZdL2ksXG4gIHNob3J0OiAvXihzdXxtb3x0dXx3ZXx0aHxmcnxzYSkvaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKHN1bnxtb258dHVlfHdlZHx0aHV8ZnJpfHNhdCkvaSxcbiAgd2lkZTogL14oc3VuZGF5fG1vbmRheXx0dWVzZGF5fHdlZG5lc2RheXx0aHVyc2RheXxmcmlkYXl8c2F0dXJkYXkpL2ksXG59O1xuY29uc3QgcGFyc2VEYXlQYXR0ZXJucyA9IHtcbiAgbmFycm93OiBbL15zL2ksIC9ebS9pLCAvXnQvaSwgL153L2ksIC9edC9pLCAvXmYvaSwgL15zL2ldLFxuICBhbnk6IFsvXnN1L2ksIC9ebS9pLCAvXnR1L2ksIC9edy9pLCAvXnRoL2ksIC9eZi9pLCAvXnNhL2ldLFxufTtcblxuY29uc3QgbWF0Y2hEYXlQZXJpb2RQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXihhfHB8bWl8bnwoaW4gdGhlfGF0KSAobW9ybmluZ3xhZnRlcm5vb258ZXZlbmluZ3xuaWdodCkpL2ksXG4gIGFueTogL14oW2FwXVxcLj9cXHM/bVxcLj98bWlkbmlnaHR8bm9vbnwoaW4gdGhlfGF0KSAobW9ybmluZ3xhZnRlcm5vb258ZXZlbmluZ3xuaWdodCkpL2ksXG59O1xuY29uc3QgcGFyc2VEYXlQZXJpb2RQYXR0ZXJucyA9IHtcbiAgYW55OiB7XG4gICAgYW06IC9eYS9pLFxuICAgIHBtOiAvXnAvaSxcbiAgICBtaWRuaWdodDogL15taS9pLFxuICAgIG5vb246IC9ebm8vaSxcbiAgICBtb3JuaW5nOiAvbW9ybmluZy9pLFxuICAgIGFmdGVybm9vbjogL2FmdGVybm9vbi9pLFxuICAgIGV2ZW5pbmc6IC9ldmVuaW5nL2ksXG4gICAgbmlnaHQ6IC9uaWdodC9pLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IG1hdGNoID0ge1xuICBvcmRpbmFsTnVtYmVyOiBidWlsZE1hdGNoUGF0dGVybkZuKHtcbiAgICBtYXRjaFBhdHRlcm46IG1hdGNoT3JkaW5hbE51bWJlclBhdHRlcm4sXG4gICAgcGFyc2VQYXR0ZXJuOiBwYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuLFxuICAgIHZhbHVlQ2FsbGJhY2s6ICh2YWx1ZSkgPT4gcGFyc2VJbnQodmFsdWUsIDEwKSxcbiAgfSksXG5cbiAgZXJhOiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRXJhUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRXJhUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxuXG4gIHF1YXJ0ZXI6IGJ1aWxkTWF0Y2hGbih7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hRdWFydGVyUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlUXVhcnRlclBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICAgIHZhbHVlQ2FsbGJhY2s6IChpbmRleCkgPT4gaW5kZXggKyAxLFxuICB9KSxcblxuICBtb250aDogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaE1vbnRoUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlTW9udGhQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogXCJhbnlcIixcbiAgfSksXG5cbiAgZGF5OiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRGF5UGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRGF5UGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxuXG4gIGRheVBlcmlvZDogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaERheVBlcmlvZFBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcImFueVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRGF5UGVyaW9kUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxufTtcbiIsCiAgICAiaW1wb3J0IHsgZm9ybWF0RGlzdGFuY2UgfSBmcm9tIFwiLi9lbi1VUy9fbGliL2Zvcm1hdERpc3RhbmNlLmpzXCI7XG5pbXBvcnQgeyBmb3JtYXRMb25nIH0gZnJvbSBcIi4vZW4tVVMvX2xpYi9mb3JtYXRMb25nLmpzXCI7XG5pbXBvcnQgeyBmb3JtYXRSZWxhdGl2ZSB9IGZyb20gXCIuL2VuLVVTL19saWIvZm9ybWF0UmVsYXRpdmUuanNcIjtcbmltcG9ydCB7IGxvY2FsaXplIH0gZnJvbSBcIi4vZW4tVVMvX2xpYi9sb2NhbGl6ZS5qc1wiO1xuaW1wb3J0IHsgbWF0Y2ggfSBmcm9tIFwiLi9lbi1VUy9fbGliL21hdGNoLmpzXCI7XG5cbi8qKlxuICogQGNhdGVnb3J5IExvY2FsZXNcbiAqIEBzdW1tYXJ5IEVuZ2xpc2ggbG9jYWxlIChVbml0ZWQgU3RhdGVzKS5cbiAqIEBsYW5ndWFnZSBFbmdsaXNoXG4gKiBAaXNvLTYzOS0yIGVuZ1xuICogQGF1dGhvciBTYXNoYSBLb3NzIFtAa29zc25vY29ycF0oaHR0cHM6Ly9naXRodWIuY29tL2tvc3Nub2NvcnApXG4gKiBAYXV0aG9yIExlc2hhIEtvc3MgW0BsZXNoYWtvc3NdKGh0dHBzOi8vZ2l0aHViLmNvbS9sZXNoYWtvc3MpXG4gKi9cbmV4cG9ydCBjb25zdCBlblVTID0ge1xuICBjb2RlOiBcImVuLVVTXCIsXG4gIGZvcm1hdERpc3RhbmNlOiBmb3JtYXREaXN0YW5jZSxcbiAgZm9ybWF0TG9uZzogZm9ybWF0TG9uZyxcbiAgZm9ybWF0UmVsYXRpdmU6IGZvcm1hdFJlbGF0aXZlLFxuICBsb2NhbGl6ZTogbG9jYWxpemUsXG4gIG1hdGNoOiBtYXRjaCxcbiAgb3B0aW9uczoge1xuICAgIHdlZWtTdGFydHNPbjogMCAvKiBTdW5kYXkgKi8sXG4gICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiAxLFxuICB9LFxufTtcblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBlblVTO1xuIiwKICAgICJpbXBvcnQgeyBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMgfSBmcm9tIFwiLi9kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMuanNcIjtcbmltcG9ydCB7IHN0YXJ0T2ZZZWFyIH0gZnJvbSBcIi4vc3RhcnRPZlllYXIuanNcIjtcbmltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgZ2V0RGF5T2ZZZWFyfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgZ2V0RGF5T2ZZZWFyXG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgZGF5IG9mIHRoZSB5ZWFyIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBkYXkgb2YgdGhlIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBkYXkgb2YgeWVhclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCBkYXkgb2YgdGhlIHllYXIgaXMgMiBKdWx5IDIwMTQ/XG4gKiBjb25zdCByZXN1bHQgPSBnZXREYXlPZlllYXIobmV3IERhdGUoMjAxNCwgNiwgMikpXG4gKiAvLz0+IDE4M1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF5T2ZZZWFyKGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pO1xuICBjb25zdCBkaWZmID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKF9kYXRlLCBzdGFydE9mWWVhcihfZGF0ZSkpO1xuICBjb25zdCBkYXlPZlllYXIgPSBkaWZmICsgMTtcbiAgcmV0dXJuIGRheU9mWWVhcjtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBnZXREYXlPZlllYXI7XG4iLAogICAgImltcG9ydCB7IG1pbGxpc2Vjb25kc0luV2VlayB9IGZyb20gXCIuL2NvbnN0YW50cy5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZklTT1dlZWsgfSBmcm9tIFwiLi9zdGFydE9mSVNPV2Vlay5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZklTT1dlZWtZZWFyIH0gZnJvbSBcIi4vc3RhcnRPZklTT1dlZWtZZWFyLmpzXCI7XG5pbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGdldElTT1dlZWt9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBnZXRJU09XZWVrXG4gKiBAY2F0ZWdvcnkgSVNPIFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBJU08gd2VlayBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgSVNPIHdlZWsgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogSVNPIHdlZWstbnVtYmVyaW5nIHllYXI6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgSVNPIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBvZiB0aGUgSVNPLXdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMiBKYW51YXJ5IDIwMDU/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRJU09XZWVrKG5ldyBEYXRlKDIwMDUsIDAsIDIpKVxuICogLy89PiA1M1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SVNPV2VlayhkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTtcbiAgY29uc3QgZGlmZiA9ICtzdGFydE9mSVNPV2VlayhfZGF0ZSkgLSArc3RhcnRPZklTT1dlZWtZZWFyKF9kYXRlKTtcblxuICAvLyBSb3VuZCB0aGUgbnVtYmVyIG9mIHdlZWtzIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgYmVjYXVzZSB0aGUgbnVtYmVyIG9mXG4gIC8vIG1pbGxpc2Vjb25kcyBpbiBhIHdlZWsgaXMgbm90IGNvbnN0YW50IChlLmcuIGl0J3MgZGlmZmVyZW50IGluIHRoZSB3ZWVrIG9mXG4gIC8vIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBjbG9jayBzaGlmdCkuXG4gIHJldHVybiBNYXRoLnJvdW5kKGRpZmYgLyBtaWxsaXNlY29uZHNJbldlZWspICsgMTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBnZXRJU09XZWVrO1xuIiwKICAgICJpbXBvcnQgeyBnZXREZWZhdWx0T3B0aW9ucyB9IGZyb20gXCIuL19saWIvZGVmYXVsdE9wdGlvbnMuanNcIjtcbmltcG9ydCB7IGNvbnN0cnVjdEZyb20gfSBmcm9tIFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCI7XG5pbXBvcnQgeyBzdGFydE9mV2VlayB9IGZyb20gXCIuL3N0YXJ0T2ZXZWVrLmpzXCI7XG5pbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGdldFdlZWtZZWFyfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgZ2V0V2Vla1llYXJcbiAqIEBjYXRlZ29yeSBXZWVrLU51bWJlcmluZyBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhciBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhciBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSBleGFjdCBjYWxjdWxhdGlvbiBkZXBlbmRzIG9uIHRoZSB2YWx1ZXMgb2ZcbiAqIGBvcHRpb25zLndlZWtTdGFydHNPbmAgKHdoaWNoIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrKVxuICogYW5kIGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgKHdoaWNoIGlzIHRoZSBkYXkgb2YgSmFudWFyeSwgd2hpY2ggaXMgYWx3YXlzIGluXG4gKiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgd2Vlay1udW1iZXJpbmcgeWVhcilcbiAqXG4gKiBXZWVrIG51bWJlcmluZzogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2VlayNUaGVfSVNPX3dlZWtfZGF0ZV9zeXN0ZW1cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnMuXG4gKlxuICogQHJldHVybnMgVGhlIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBudW1iZXJpbmcgeWVhciBpcyAyNiBEZWNlbWJlciAyMDA0IHdpdGggdGhlIGRlZmF1bHQgc2V0dGluZ3M/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrWWVhcihuZXcgRGF0ZSgyMDA0LCAxMSwgMjYpKVxuICogLy89PiAyMDA1XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIHdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMjYgRGVjZW1iZXIgMjAwNCBpZiB3ZWVrIHN0YXJ0cyBvbiBTYXR1cmRheT9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWtZZWFyKG5ldyBEYXRlKDIwMDQsIDExLCAyNiksIHsgd2Vla1N0YXJ0c09uOiA2IH0pXG4gKiAvLz0+IDIwMDRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBudW1iZXJpbmcgeWVhciBpcyAyNiBEZWNlbWJlciAyMDA0IGlmIHRoZSBmaXJzdCB3ZWVrIGNvbnRhaW5zIDQgSmFudWFyeT9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWtZZWFyKG5ldyBEYXRlKDIwMDQsIDExLCAyNiksIHsgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0IH0pXG4gKiAvLz0+IDIwMDRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdlZWtZZWFyKGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pO1xuICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0RnVsbFllYXIoKTtcblxuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IGdldERlZmF1bHRPcHRpb25zKCk7XG4gIGNvbnN0IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9XG4gICAgb3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIDE7XG5cbiAgY29uc3QgZmlyc3RXZWVrT2ZOZXh0WWVhciA9IGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgMCk7XG4gIGZpcnN0V2Vla09mTmV4dFllYXIuc2V0RnVsbFllYXIoeWVhciArIDEsIDAsIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7XG4gIGZpcnN0V2Vla09mTmV4dFllYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIGNvbnN0IHN0YXJ0T2ZOZXh0WWVhciA9IHN0YXJ0T2ZXZWVrKGZpcnN0V2Vla09mTmV4dFllYXIsIG9wdGlvbnMpO1xuXG4gIGNvbnN0IGZpcnN0V2Vla09mVGhpc1llYXIgPSBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIDApO1xuICBmaXJzdFdlZWtPZlRoaXNZZWFyLnNldEZ1bGxZZWFyKHllYXIsIDAsIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7XG4gIGZpcnN0V2Vla09mVGhpc1llYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIGNvbnN0IHN0YXJ0T2ZUaGlzWWVhciA9IHN0YXJ0T2ZXZWVrKGZpcnN0V2Vla09mVGhpc1llYXIsIG9wdGlvbnMpO1xuXG4gIGlmICgrX2RhdGUgPj0gK3N0YXJ0T2ZOZXh0WWVhcikge1xuICAgIHJldHVybiB5ZWFyICsgMTtcbiAgfSBlbHNlIGlmICgrX2RhdGUgPj0gK3N0YXJ0T2ZUaGlzWWVhcikge1xuICAgIHJldHVybiB5ZWFyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB5ZWFyIC0gMTtcbiAgfVxufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGdldFdlZWtZZWFyO1xuIiwKICAgICJpbXBvcnQgeyBnZXREZWZhdWx0T3B0aW9ucyB9IGZyb20gXCIuL19saWIvZGVmYXVsdE9wdGlvbnMuanNcIjtcbmltcG9ydCB7IGNvbnN0cnVjdEZyb20gfSBmcm9tIFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCI7XG5pbXBvcnQgeyBnZXRXZWVrWWVhciB9IGZyb20gXCIuL2dldFdlZWtZZWFyLmpzXCI7XG5pbXBvcnQgeyBzdGFydE9mV2VlayB9IGZyb20gXCIuL3N0YXJ0T2ZXZWVrLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBzdGFydE9mV2Vla1llYXJ9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBzdGFydE9mV2Vla1llYXJcbiAqIEBjYXRlZ29yeSBXZWVrLU51bWJlcmluZyBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYSBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgc3RhcnQgb2YgYSBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyLlxuICogVGhlIGV4YWN0IGNhbGN1bGF0aW9uIGRlcGVuZHMgb24gdGhlIHZhbHVlcyBvZlxuICogYG9wdGlvbnMud2Vla1N0YXJ0c09uYCAod2hpY2ggaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWspXG4gKiBhbmQgYG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlYCAod2hpY2ggaXMgdGhlIGRheSBvZiBKYW51YXJ5LCB3aGljaCBpcyBhbHdheXMgaW5cbiAqIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB3ZWVrLW51bWJlcmluZyB5ZWFyKVxuICpcbiAqIFdlZWsgbnVtYmVyaW5nOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XZWVrI1RoZV9JU09fd2Vla19kYXRlX3N5c3RlbVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgc3RhcnQgb2YgYSB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhbiBhIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIDIgSnVseSAyMDA1IHdpdGggZGVmYXVsdCBzZXR0aW5nczpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZXZWVrWWVhcihuZXcgRGF0ZSgyMDA1LCA2LCAyKSlcbiAqIC8vPT4gU3VuIERlYyAyNiAyMDA0IDAwOjAwOjAwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIDIgSnVseSAyMDA1XG4gKiAvLyBpZiBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB3ZWVrXG4gKiAvLyBhbmQgNCBKYW51YXJ5IGlzIGFsd2F5cyBpbiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhcjpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZXZWVrWWVhcihuZXcgRGF0ZSgyMDA1LCA2LCAyKSwge1xuICogICB3ZWVrU3RhcnRzT246IDEsXG4gKiAgIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZTogNFxuICogfSlcbiAqIC8vPT4gTW9uIEphbiAwMyAyMDA1IDAwOjAwOjAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFydE9mV2Vla1llYXIoZGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IGdldERlZmF1bHRPcHRpb25zKCk7XG4gIGNvbnN0IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9XG4gICAgb3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIDE7XG5cbiAgY29uc3QgeWVhciA9IGdldFdlZWtZZWFyKGRhdGUsIG9wdGlvbnMpO1xuICBjb25zdCBmaXJzdFdlZWsgPSBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIDApO1xuICBmaXJzdFdlZWsuc2V0RnVsbFllYXIoeWVhciwgMCwgZmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgZmlyc3RXZWVrLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICBjb25zdCBfZGF0ZSA9IHN0YXJ0T2ZXZWVrKGZpcnN0V2Vlaywgb3B0aW9ucyk7XG4gIHJldHVybiBfZGF0ZTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBzdGFydE9mV2Vla1llYXI7XG4iLAogICAgImltcG9ydCB7IG1pbGxpc2Vjb25kc0luV2VlayB9IGZyb20gXCIuL2NvbnN0YW50cy5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZldlZWsgfSBmcm9tIFwiLi9zdGFydE9mV2Vlay5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZldlZWtZZWFyIH0gZnJvbSBcIi4vc3RhcnRPZldlZWtZZWFyLmpzXCI7XG5pbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGdldFdlZWt9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBnZXRXZWVrXG4gKiBAY2F0ZWdvcnkgV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGxvY2FsIHdlZWsgaW5kZXggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIGxvY2FsIHdlZWsgaW5kZXggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgZXhhY3QgY2FsY3VsYXRpb24gZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mXG4gKiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gICh3aGljaCBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlaylcbiAqIGFuZCBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgICh3aGljaCBpcyB0aGUgZGF5IG9mIEphbnVhcnksIHdoaWNoIGlzIGFsd2F5cyBpblxuICogdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHdlZWstbnVtYmVyaW5nIHllYXIpXG4gKlxuICogV2VlayBudW1iZXJpbmc6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dlZWsjVGhlX0lTT193ZWVrX2RhdGVfc3lzdGVtXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBvZiB0aGUgbG9jYWwgd2VlayBudW1iZXJpbmcgeWVhciBpcyAyIEphbnVhcnkgMjAwNSB3aXRoIGRlZmF1bHQgb3B0aW9ucz9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWsobmV3IERhdGUoMjAwNSwgMCwgMikpXG4gKiAvLz0+IDJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBvZiB0aGUgbG9jYWwgd2VlayBudW1iZXJpbmcgeWVhciBpcyAyIEphbnVhcnkgMjAwNSxcbiAqIC8vIGlmIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLFxuICogLy8gYW5kIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyIGFsd2F5cyBjb250YWlucyA0IEphbnVhcnk/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrKG5ldyBEYXRlKDIwMDUsIDAsIDIpLCB7XG4gKiAgIHdlZWtTdGFydHNPbjogMSxcbiAqICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0XG4gKiB9KVxuICogLy89PiA1M1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2VlayhkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTtcbiAgY29uc3QgZGlmZiA9ICtzdGFydE9mV2VlayhfZGF0ZSwgb3B0aW9ucykgLSArc3RhcnRPZldlZWtZZWFyKF9kYXRlLCBvcHRpb25zKTtcblxuICAvLyBSb3VuZCB0aGUgbnVtYmVyIG9mIHdlZWtzIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgYmVjYXVzZSB0aGUgbnVtYmVyIG9mXG4gIC8vIG1pbGxpc2Vjb25kcyBpbiBhIHdlZWsgaXMgbm90IGNvbnN0YW50IChlLmcuIGl0J3MgZGlmZmVyZW50IGluIHRoZSB3ZWVrIG9mXG4gIC8vIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBjbG9jayBzaGlmdCkuXG4gIHJldHVybiBNYXRoLnJvdW5kKGRpZmYgLyBtaWxsaXNlY29uZHNJbldlZWspICsgMTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBnZXRXZWVrO1xuIiwKICAgICJleHBvcnQgZnVuY3Rpb24gYWRkTGVhZGluZ1plcm9zKG51bWJlciwgdGFyZ2V0TGVuZ3RoKSB7XG4gIGNvbnN0IHNpZ24gPSBudW1iZXIgPCAwID8gXCItXCIgOiBcIlwiO1xuICBjb25zdCBvdXRwdXQgPSBNYXRoLmFicyhudW1iZXIpLnRvU3RyaW5nKCkucGFkU3RhcnQodGFyZ2V0TGVuZ3RoLCBcIjBcIik7XG4gIHJldHVybiBzaWduICsgb3V0cHV0O1xufVxuIiwKICAgICJpbXBvcnQgeyBhZGRMZWFkaW5nWmVyb3MgfSBmcm9tIFwiLi4vYWRkTGVhZGluZ1plcm9zLmpzXCI7XG5cbi8qXG4gKiB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8ICBhICB8IEFNLCBQTSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBBKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBkICB8IERheSBvZiBtb250aCAgICAgICAgICAgICAgICAgICB8ICBEICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBoICB8IEhvdXIgWzEtMTJdICAgICAgICAgICAgICAgICAgICB8ICBIICB8IEhvdXIgWzAtMjNdICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBtICB8IE1pbnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBNICB8IE1vbnRoICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBzICB8IFNlY29uZCAgICAgICAgICAgICAgICAgICAgICAgICB8ICBTICB8IEZyYWN0aW9uIG9mIHNlY29uZCAgICAgICAgICAgICB8XG4gKiB8ICB5ICB8IFllYXIgKGFicykgICAgICAgICAgICAgICAgICAgICB8ICBZICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKlxuICogTGV0dGVycyBtYXJrZWQgYnkgKiBhcmUgbm90IGltcGxlbWVudGVkIGJ1dCByZXNlcnZlZCBieSBVbmljb2RlIHN0YW5kYXJkLlxuICovXG5cbmV4cG9ydCBjb25zdCBsaWdodEZvcm1hdHRlcnMgPSB7XG4gIC8vIFllYXJcbiAgeShkYXRlLCB0b2tlbikge1xuICAgIC8vIEZyb20gaHR0cDovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzL3RyMzUvdHIzNS0zMS90cjM1LWRhdGVzLmh0bWwjRGF0ZV9Gb3JtYXRfdG9rZW5zXG4gICAgLy8gfCBZZWFyICAgICB8ICAgICB5IHwgeXkgfCAgIHl5eSB8ICB5eXl5IHwgeXl5eXkgfFxuICAgIC8vIHwtLS0tLS0tLS0tfC0tLS0tLS18LS0tLXwtLS0tLS0tfC0tLS0tLS18LS0tLS0tLXxcbiAgICAvLyB8IEFEIDEgICAgIHwgICAgIDEgfCAwMSB8ICAgMDAxIHwgIDAwMDEgfCAwMDAwMSB8XG4gICAgLy8gfCBBRCAxMiAgICB8ICAgIDEyIHwgMTIgfCAgIDAxMiB8ICAwMDEyIHwgMDAwMTIgfFxuICAgIC8vIHwgQUQgMTIzICAgfCAgIDEyMyB8IDIzIHwgICAxMjMgfCAgMDEyMyB8IDAwMTIzIHxcbiAgICAvLyB8IEFEIDEyMzQgIHwgIDEyMzQgfCAzNCB8ICAxMjM0IHwgIDEyMzQgfCAwMTIzNCB8XG4gICAgLy8gfCBBRCAxMjM0NSB8IDEyMzQ1IHwgNDUgfCAxMjM0NSB8IDEyMzQ1IHwgMTIzNDUgfFxuXG4gICAgY29uc3Qgc2lnbmVkWWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAvLyBSZXR1cm5zIDEgZm9yIDEgQkMgKHdoaWNoIGlzIHllYXIgMCBpbiBKYXZhU2NyaXB0KVxuICAgIGNvbnN0IHllYXIgPSBzaWduZWRZZWFyID4gMCA/IHNpZ25lZFllYXIgOiAxIC0gc2lnbmVkWWVhcjtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHRva2VuID09PSBcInl5XCIgPyB5ZWFyICUgMTAwIDogeWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBNb250aFxuICBNKGRhdGUsIHRva2VuKSB7XG4gICAgY29uc3QgbW9udGggPSBkYXRlLmdldE1vbnRoKCk7XG4gICAgcmV0dXJuIHRva2VuID09PSBcIk1cIiA/IFN0cmluZyhtb250aCArIDEpIDogYWRkTGVhZGluZ1plcm9zKG1vbnRoICsgMSwgMik7XG4gIH0sXG5cbiAgLy8gRGF5IG9mIHRoZSBtb250aFxuICBkKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldERhdGUoKSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBBTSBvciBQTVxuICBhKGRhdGUsIHRva2VuKSB7XG4gICAgY29uc3QgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF0ZS5nZXRIb3VycygpIC8gMTIgPj0gMSA/IFwicG1cIiA6IFwiYW1cIjtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJhXCI6XG4gICAgICBjYXNlIFwiYWFcIjpcbiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgY2FzZSBcImFhYVwiOlxuICAgICAgICByZXR1cm4gZGF5UGVyaW9kRW51bVZhbHVlO1xuICAgICAgY2FzZSBcImFhYWFhXCI6XG4gICAgICAgIHJldHVybiBkYXlQZXJpb2RFbnVtVmFsdWVbMF07XG4gICAgICBjYXNlIFwiYWFhYVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZSA9PT0gXCJhbVwiID8gXCJhLm0uXCIgOiBcInAubS5cIjtcbiAgICB9XG4gIH0sXG5cbiAgLy8gSG91ciBbMS0xMl1cbiAgaChkYXRlLCB0b2tlbikge1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoZGF0ZS5nZXRIb3VycygpICUgMTIgfHwgMTIsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gSG91ciBbMC0yM11cbiAgSChkYXRlLCB0b2tlbikge1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoZGF0ZS5nZXRIb3VycygpLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIE1pbnV0ZVxuICBtKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldE1pbnV0ZXMoKSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBTZWNvbmRcbiAgcyhkYXRlLCB0b2tlbikge1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoZGF0ZS5nZXRTZWNvbmRzKCksIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gRnJhY3Rpb24gb2Ygc2Vjb25kXG4gIFMoZGF0ZSwgdG9rZW4pIHtcbiAgICBjb25zdCBudW1iZXJPZkRpZ2l0cyA9IHRva2VuLmxlbmd0aDtcbiAgICBjb25zdCBtaWxsaXNlY29uZHMgPSBkYXRlLmdldE1pbGxpc2Vjb25kcygpO1xuICAgIGNvbnN0IGZyYWN0aW9uYWxTZWNvbmRzID0gTWF0aC50cnVuYyhcbiAgICAgIG1pbGxpc2Vjb25kcyAqIE1hdGgucG93KDEwLCBudW1iZXJPZkRpZ2l0cyAtIDMpLFxuICAgICk7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhmcmFjdGlvbmFsU2Vjb25kcywgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbn07XG4iLAogICAgImltcG9ydCB7IGdldERheU9mWWVhciB9IGZyb20gXCIuLi8uLi9nZXREYXlPZlllYXIuanNcIjtcbmltcG9ydCB7IGdldElTT1dlZWsgfSBmcm9tIFwiLi4vLi4vZ2V0SVNPV2Vlay5qc1wiO1xuaW1wb3J0IHsgZ2V0SVNPV2Vla1llYXIgfSBmcm9tIFwiLi4vLi4vZ2V0SVNPV2Vla1llYXIuanNcIjtcbmltcG9ydCB7IGdldFdlZWsgfSBmcm9tIFwiLi4vLi4vZ2V0V2Vlay5qc1wiO1xuaW1wb3J0IHsgZ2V0V2Vla1llYXIgfSBmcm9tIFwiLi4vLi4vZ2V0V2Vla1llYXIuanNcIjtcblxuaW1wb3J0IHsgYWRkTGVhZGluZ1plcm9zIH0gZnJvbSBcIi4uL2FkZExlYWRpbmdaZXJvcy5qc1wiO1xuaW1wb3J0IHsgbGlnaHRGb3JtYXR0ZXJzIH0gZnJvbSBcIi4vbGlnaHRGb3JtYXR0ZXJzLmpzXCI7XG5cbmNvbnN0IGRheVBlcmlvZEVudW0gPSB7XG4gIGFtOiBcImFtXCIsXG4gIHBtOiBcInBtXCIsXG4gIG1pZG5pZ2h0OiBcIm1pZG5pZ2h0XCIsXG4gIG5vb246IFwibm9vblwiLFxuICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgYWZ0ZXJub29uOiBcImFmdGVybm9vblwiLFxuICBldmVuaW5nOiBcImV2ZW5pbmdcIixcbiAgbmlnaHQ6IFwibmlnaHRcIixcbn07XG5cbi8qXG4gKiB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8ICBhICB8IEFNLCBQTSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBBKiB8IE1pbGxpc2Vjb25kcyBpbiBkYXkgICAgICAgICAgICB8XG4gKiB8ICBiICB8IEFNLCBQTSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICB8ICBCICB8IEZsZXhpYmxlIGRheSBwZXJpb2QgICAgICAgICAgICB8XG4gKiB8ICBjICB8IFN0YW5kLWFsb25lIGxvY2FsIGRheSBvZiB3ZWVrICB8ICBDKiB8IExvY2FsaXplZCBob3VyIHcvIGRheSBwZXJpb2QgICB8XG4gKiB8ICBkICB8IERheSBvZiBtb250aCAgICAgICAgICAgICAgICAgICB8ICBEICB8IERheSBvZiB5ZWFyICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBlICB8IExvY2FsIGRheSBvZiB3ZWVrICAgICAgICAgICAgICB8ICBFICB8IERheSBvZiB3ZWVrICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBmICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBGKiB8IERheSBvZiB3ZWVrIGluIG1vbnRoICAgICAgICAgICB8XG4gKiB8ICBnKiB8IE1vZGlmaWVkIEp1bGlhbiBkYXkgICAgICAgICAgICB8ICBHICB8IEVyYSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBoICB8IEhvdXIgWzEtMTJdICAgICAgICAgICAgICAgICAgICB8ICBIICB8IEhvdXIgWzAtMjNdICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBpISB8IElTTyBkYXkgb2Ygd2VlayAgICAgICAgICAgICAgICB8ICBJISB8IElTTyB3ZWVrIG9mIHllYXIgICAgICAgICAgICAgICB8XG4gKiB8ICBqKiB8IExvY2FsaXplZCBob3VyIHcvIGRheSBwZXJpb2QgICB8ICBKKiB8IExvY2FsaXplZCBob3VyIHcvbyBkYXkgcGVyaW9kICB8XG4gKiB8ICBrICB8IEhvdXIgWzEtMjRdICAgICAgICAgICAgICAgICAgICB8ICBLICB8IEhvdXIgWzAtMTFdICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBsKiB8IChkZXByZWNhdGVkKSAgICAgICAgICAgICAgICAgICB8ICBMICB8IFN0YW5kLWFsb25lIG1vbnRoICAgICAgICAgICAgICB8XG4gKiB8ICBtICB8IE1pbnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBNICB8IE1vbnRoICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBuICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBOICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBvISB8IE9yZGluYWwgbnVtYmVyIG1vZGlmaWVyICAgICAgICB8ICBPICB8IFRpbWV6b25lIChHTVQpICAgICAgICAgICAgICAgICB8XG4gKiB8ICBwISB8IExvbmcgbG9jYWxpemVkIHRpbWUgICAgICAgICAgICB8ICBQISB8IExvbmcgbG9jYWxpemVkIGRhdGUgICAgICAgICAgICB8XG4gKiB8ICBxICB8IFN0YW5kLWFsb25lIHF1YXJ0ZXIgICAgICAgICAgICB8ICBRICB8IFF1YXJ0ZXIgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICByKiB8IFJlbGF0ZWQgR3JlZ29yaWFuIHllYXIgICAgICAgICB8ICBSISB8IElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgICB8XG4gKiB8ICBzICB8IFNlY29uZCAgICAgICAgICAgICAgICAgICAgICAgICB8ICBTICB8IEZyYWN0aW9uIG9mIHNlY29uZCAgICAgICAgICAgICB8XG4gKiB8ICB0ISB8IFNlY29uZHMgdGltZXN0YW1wICAgICAgICAgICAgICB8ICBUISB8IE1pbGxpc2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICB8XG4gKiB8ICB1ICB8IEV4dGVuZGVkIHllYXIgICAgICAgICAgICAgICAgICB8ICBVKiB8IEN5Y2xpYyB5ZWFyICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICB2KiB8IFRpbWV6b25lIChnZW5lcmljIG5vbi1sb2NhdC4pICB8ICBWKiB8IFRpbWV6b25lIChsb2NhdGlvbikgICAgICAgICAgICB8XG4gKiB8ICB3ICB8IExvY2FsIHdlZWsgb2YgeWVhciAgICAgICAgICAgICB8ICBXKiB8IFdlZWsgb2YgbW9udGggICAgICAgICAgICAgICAgICB8XG4gKiB8ICB4ICB8IFRpbWV6b25lIChJU08tODYwMSB3L28gWikgICAgICB8ICBYICB8IFRpbWV6b25lIChJU08tODYwMSkgICAgICAgICAgICB8XG4gKiB8ICB5ICB8IFllYXIgKGFicykgICAgICAgICAgICAgICAgICAgICB8ICBZICB8IExvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgICAgICB8XG4gKiB8ICB6ICB8IFRpbWV6b25lIChzcGVjaWZpYyBub24tbG9jYXQuKSB8ICBaKiB8IFRpbWV6b25lIChhbGlhc2VzKSAgICAgICAgICAgICB8XG4gKlxuICogTGV0dGVycyBtYXJrZWQgYnkgKiBhcmUgbm90IGltcGxlbWVudGVkIGJ1dCByZXNlcnZlZCBieSBVbmljb2RlIHN0YW5kYXJkLlxuICpcbiAqIExldHRlcnMgbWFya2VkIGJ5ICEgYXJlIG5vbi1zdGFuZGFyZCwgYnV0IGltcGxlbWVudGVkIGJ5IGRhdGUtZm5zOlxuICogLSBgb2AgbW9kaWZpZXMgdGhlIHByZXZpb3VzIHRva2VuIHRvIHR1cm4gaXQgaW50byBhbiBvcmRpbmFsIChzZWUgYGZvcm1hdGAgZG9jcylcbiAqIC0gYGlgIGlzIElTTyBkYXkgb2Ygd2Vlay4gRm9yIGBpYCBhbmQgYGlpYCBpcyByZXR1cm5zIG51bWVyaWMgSVNPIHdlZWsgZGF5cyxcbiAqICAgaS5lLiA3IGZvciBTdW5kYXksIDEgZm9yIE1vbmRheSwgZXRjLlxuICogLSBgSWAgaXMgSVNPIHdlZWsgb2YgeWVhciwgYXMgb3Bwb3NlZCB0byBgd2Agd2hpY2ggaXMgbG9jYWwgd2VlayBvZiB5ZWFyLlxuICogLSBgUmAgaXMgSVNPIHdlZWstbnVtYmVyaW5nIHllYXIsIGFzIG9wcG9zZWQgdG8gYFlgIHdoaWNoIGlzIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIuXG4gKiAgIGBSYCBpcyBzdXBwb3NlZCB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYElgIGFuZCBgaWBcbiAqICAgZm9yIHVuaXZlcnNhbCBJU08gd2Vlay1udW1iZXJpbmcgZGF0ZSwgd2hlcmVhc1xuICogICBgWWAgaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGB3YCBhbmQgYGVgXG4gKiAgIGZvciB3ZWVrLW51bWJlcmluZyBkYXRlIHNwZWNpZmljIHRvIHRoZSBsb2NhbGUuXG4gKiAtIGBQYCBpcyBsb25nIGxvY2FsaXplZCBkYXRlIGZvcm1hdFxuICogLSBgcGAgaXMgbG9uZyBsb2NhbGl6ZWQgdGltZSBmb3JtYXRcbiAqL1xuXG5leHBvcnQgY29uc3QgZm9ybWF0dGVycyA9IHtcbiAgLy8gRXJhXG4gIEc6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBlcmEgPSBkYXRlLmdldEZ1bGxZZWFyKCkgPiAwID8gMSA6IDA7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gQUQsIEJDXG4gICAgICBjYXNlIFwiR1wiOlxuICAgICAgY2FzZSBcIkdHXCI6XG4gICAgICBjYXNlIFwiR0dHXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5lcmEoZXJhLCB7IHdpZHRoOiBcImFiYnJldmlhdGVkXCIgfSk7XG4gICAgICAvLyBBLCBCXG4gICAgICBjYXNlIFwiR0dHR0dcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmVyYShlcmEsIHsgd2lkdGg6IFwibmFycm93XCIgfSk7XG4gICAgICAvLyBBbm5vIERvbWluaSwgQmVmb3JlIENocmlzdFxuICAgICAgY2FzZSBcIkdHR0dcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5lcmEoZXJhLCB7IHdpZHRoOiBcIndpZGVcIiB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gWWVhclxuICB5OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgLy8gT3JkaW5hbCBudW1iZXJcbiAgICBpZiAodG9rZW4gPT09IFwieW9cIikge1xuICAgICAgY29uc3Qgc2lnbmVkWWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgIC8vIFJldHVybnMgMSBmb3IgMSBCQyAod2hpY2ggaXMgeWVhciAwIGluIEphdmFTY3JpcHQpXG4gICAgICBjb25zdCB5ZWFyID0gc2lnbmVkWWVhciA+IDAgPyBzaWduZWRZZWFyIDogMSAtIHNpZ25lZFllYXI7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcih5ZWFyLCB7IHVuaXQ6IFwieWVhclwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMueShkYXRlLCB0b2tlbik7XG4gIH0sXG5cbiAgLy8gTG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhclxuICBZOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgc2lnbmVkV2Vla1llYXIgPSBnZXRXZWVrWWVhcihkYXRlLCBvcHRpb25zKTtcbiAgICAvLyBSZXR1cm5zIDEgZm9yIDEgQkMgKHdoaWNoIGlzIHllYXIgMCBpbiBKYXZhU2NyaXB0KVxuICAgIGNvbnN0IHdlZWtZZWFyID0gc2lnbmVkV2Vla1llYXIgPiAwID8gc2lnbmVkV2Vla1llYXIgOiAxIC0gc2lnbmVkV2Vla1llYXI7XG5cbiAgICAvLyBUd28gZGlnaXQgeWVhclxuICAgIGlmICh0b2tlbiA9PT0gXCJZWVwiKSB7XG4gICAgICBjb25zdCB0d29EaWdpdFllYXIgPSB3ZWVrWWVhciAlIDEwMDtcbiAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3ModHdvRGlnaXRZZWFyLCAyKTtcbiAgICB9XG5cbiAgICAvLyBPcmRpbmFsIG51bWJlclxuICAgIGlmICh0b2tlbiA9PT0gXCJZb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcih3ZWVrWWVhciwgeyB1bml0OiBcInllYXJcIiB9KTtcbiAgICB9XG5cbiAgICAvLyBQYWRkaW5nXG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyh3ZWVrWWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBJU08gd2Vlay1udW1iZXJpbmcgeWVhclxuICBSOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4pIHtcbiAgICBjb25zdCBpc29XZWVrWWVhciA9IGdldElTT1dlZWtZZWFyKGRhdGUpO1xuXG4gICAgLy8gUGFkZGluZ1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoaXNvV2Vla1llYXIsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gRXh0ZW5kZWQgeWVhci4gVGhpcyBpcyBhIHNpbmdsZSBudW1iZXIgZGVzaWduYXRpbmcgdGhlIHllYXIgb2YgdGhpcyBjYWxlbmRhciBzeXN0ZW0uXG4gIC8vIFRoZSBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiBgeWAgYW5kIGB1YCBsb2NhbGl6ZXJzIGFyZSBCLkMuIHllYXJzOlxuICAvLyB8IFllYXIgfCBgeWAgfCBgdWAgfFxuICAvLyB8LS0tLS0tfC0tLS0tfC0tLS0tfFxuICAvLyB8IEFDIDEgfCAgIDEgfCAgIDEgfFxuICAvLyB8IEJDIDEgfCAgIDEgfCAgIDAgfFxuICAvLyB8IEJDIDIgfCAgIDIgfCAgLTEgfFxuICAvLyBBbHNvIGB5eWAgYWx3YXlzIHJldHVybnMgdGhlIGxhc3QgdHdvIGRpZ2l0cyBvZiBhIHllYXIsXG4gIC8vIHdoaWxlIGB1dWAgcGFkcyBzaW5nbGUgZGlnaXQgeWVhcnMgdG8gMiBjaGFyYWN0ZXJzIGFuZCByZXR1cm5zIG90aGVyIHllYXJzIHVuY2hhbmdlZC5cbiAgdTogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHllYXIsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gUXVhcnRlclxuICBROiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgcXVhcnRlciA9IE1hdGguY2VpbCgoZGF0ZS5nZXRNb250aCgpICsgMSkgLyAzKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAxLCAyLCAzLCA0XG4gICAgICBjYXNlIFwiUVwiOlxuICAgICAgICByZXR1cm4gU3RyaW5nKHF1YXJ0ZXIpO1xuICAgICAgLy8gMDEsIDAyLCAwMywgMDRcbiAgICAgIGNhc2UgXCJRUVwiOlxuICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHF1YXJ0ZXIsIDIpO1xuICAgICAgLy8gMXN0LCAybmQsIDNyZCwgNHRoXG4gICAgICBjYXNlIFwiUW9cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIocXVhcnRlciwgeyB1bml0OiBcInF1YXJ0ZXJcIiB9KTtcbiAgICAgIC8vIFExLCBRMiwgUTMsIFE0XG4gICAgICBjYXNlIFwiUVFRXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIDEsIDIsIDMsIDQgKG5hcnJvdyBxdWFydGVyOyBjb3VsZCBiZSBub3QgbnVtZXJpY2FsKVxuICAgICAgY2FzZSBcIlFRUVFRXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLlxuICAgICAgY2FzZSBcIlFRUVFcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBTdGFuZC1hbG9uZSBxdWFydGVyXG4gIHE6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBxdWFydGVyID0gTWF0aC5jZWlsKChkYXRlLmdldE1vbnRoKCkgKyAxKSAvIDMpO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDEsIDIsIDMsIDRcbiAgICAgIGNhc2UgXCJxXCI6XG4gICAgICAgIHJldHVybiBTdHJpbmcocXVhcnRlcik7XG4gICAgICAvLyAwMSwgMDIsIDAzLCAwNFxuICAgICAgY2FzZSBcInFxXCI6XG4gICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MocXVhcnRlciwgMik7XG4gICAgICAvLyAxc3QsIDJuZCwgM3JkLCA0dGhcbiAgICAgIGNhc2UgXCJxb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihxdWFydGVyLCB7IHVuaXQ6IFwicXVhcnRlclwiIH0pO1xuICAgICAgLy8gUTEsIFEyLCBRMywgUTRcbiAgICAgIGNhc2UgXCJxcXFcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gMSwgMiwgMywgNCAobmFycm93IHF1YXJ0ZXI7IGNvdWxkIGJlIG5vdCBudW1lcmljYWwpXG4gICAgICBjYXNlIFwicXFxcXFcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uXG4gICAgICBjYXNlIFwicXFxcVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIE1vbnRoXG4gIE06IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiTVwiOlxuICAgICAgY2FzZSBcIk1NXCI6XG4gICAgICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuTShkYXRlLCB0b2tlbik7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCAxMnRoXG4gICAgICBjYXNlIFwiTW9cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIobW9udGggKyAxLCB7IHVuaXQ6IFwibW9udGhcIiB9KTtcbiAgICAgIC8vIEphbiwgRmViLCAuLi4sIERlY1xuICAgICAgY2FzZSBcIk1NTVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEosIEYsIC4uLiwgRFxuICAgICAgY2FzZSBcIk1NTU1NXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyXG4gICAgICBjYXNlIFwiTU1NTVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7IHdpZHRoOiBcIndpZGVcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIFN0YW5kLWFsb25lIG1vbnRoXG4gIEw6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAxLCAyLCAuLi4sIDEyXG4gICAgICBjYXNlIFwiTFwiOlxuICAgICAgICByZXR1cm4gU3RyaW5nKG1vbnRoICsgMSk7XG4gICAgICAvLyAwMSwgMDIsIC4uLiwgMTJcbiAgICAgIGNhc2UgXCJMTFwiOlxuICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKG1vbnRoICsgMSwgMik7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCAxMnRoXG4gICAgICBjYXNlIFwiTG9cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIobW9udGggKyAxLCB7IHVuaXQ6IFwibW9udGhcIiB9KTtcbiAgICAgIC8vIEphbiwgRmViLCAuLi4sIERlY1xuICAgICAgY2FzZSBcIkxMTFwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEosIEYsIC4uLiwgRFxuICAgICAgY2FzZSBcIkxMTExMXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyXG4gICAgICBjYXNlIFwiTExMTFwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7IHdpZHRoOiBcIndpZGVcIiwgY29udGV4dDogXCJzdGFuZGFsb25lXCIgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIExvY2FsIHdlZWsgb2YgeWVhclxuICB3OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgd2VlayA9IGdldFdlZWsoZGF0ZSwgb3B0aW9ucyk7XG5cbiAgICBpZiAodG9rZW4gPT09IFwid29cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIod2VlaywgeyB1bml0OiBcIndlZWtcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHdlZWssIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gSVNPIHdlZWsgb2YgeWVhclxuICBJOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgaXNvV2VlayA9IGdldElTT1dlZWsoZGF0ZSk7XG5cbiAgICBpZiAodG9rZW4gPT09IFwiSW9cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoaXNvV2VlaywgeyB1bml0OiBcIndlZWtcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGlzb1dlZWssIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gRGF5IG9mIHRoZSBtb250aFxuICBkOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSBcImRvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0RGF0ZSgpLCB7IHVuaXQ6IFwiZGF0ZVwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuZChkYXRlLCB0b2tlbik7XG4gIH0sXG5cbiAgLy8gRGF5IG9mIHllYXJcbiAgRDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGRheU9mWWVhciA9IGdldERheU9mWWVhcihkYXRlKTtcblxuICAgIGlmICh0b2tlbiA9PT0gXCJEb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXlPZlllYXIsIHsgdW5pdDogXCJkYXlPZlllYXJcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRheU9mWWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBEYXkgb2Ygd2Vla1xuICBFOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gZGF0ZS5nZXREYXkoKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBUdWVcbiAgICAgIGNhc2UgXCJFXCI6XG4gICAgICBjYXNlIFwiRUVcIjpcbiAgICAgIGNhc2UgXCJFRUVcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFRcbiAgICAgIGNhc2UgXCJFRUVFRVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1XG4gICAgICBjYXNlIFwiRUVFRUVFXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwic2hvcnRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdWVzZGF5XG4gICAgICBjYXNlIFwiRUVFRVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBMb2NhbCBkYXkgb2Ygd2Vla1xuICBlOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gZGF0ZS5nZXREYXkoKTtcbiAgICBjb25zdCBsb2NhbERheU9mV2VlayA9IChkYXlPZldlZWsgLSBvcHRpb25zLndlZWtTdGFydHNPbiArIDgpICUgNyB8fCA3O1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIE51bWVyaWNhbCB2YWx1ZSAoTnRoIGRheSBvZiB3ZWVrIHdpdGggY3VycmVudCBsb2NhbGUgb3Igd2Vla1N0YXJ0c09uKVxuICAgICAgY2FzZSBcImVcIjpcbiAgICAgICAgcmV0dXJuIFN0cmluZyhsb2NhbERheU9mV2Vlayk7XG4gICAgICAvLyBQYWRkZWQgbnVtZXJpY2FsIHZhbHVlXG4gICAgICBjYXNlIFwiZWVcIjpcbiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhsb2NhbERheU9mV2VlaywgMik7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCA3dGhcbiAgICAgIGNhc2UgXCJlb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihsb2NhbERheU9mV2VlaywgeyB1bml0OiBcImRheVwiIH0pO1xuICAgICAgY2FzZSBcImVlZVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuICAgICAgY2FzZSBcImVlZWVlXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJlZWVlZWVcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJlZWVlXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIFN0YW5kLWFsb25lIGxvY2FsIGRheSBvZiB3ZWVrXG4gIGM6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBkYXlPZldlZWsgPSBkYXRlLmdldERheSgpO1xuICAgIGNvbnN0IGxvY2FsRGF5T2ZXZWVrID0gKGRheU9mV2VlayAtIG9wdGlvbnMud2Vla1N0YXJ0c09uICsgOCkgJSA3IHx8IDc7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gTnVtZXJpY2FsIHZhbHVlIChzYW1lIGFzIGluIGBlYClcbiAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgIHJldHVybiBTdHJpbmcobG9jYWxEYXlPZldlZWspO1xuICAgICAgLy8gUGFkZGVkIG51bWVyaWNhbCB2YWx1ZVxuICAgICAgY2FzZSBcImNjXCI6XG4gICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MobG9jYWxEYXlPZldlZWssIHRva2VuLmxlbmd0aCk7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCA3dGhcbiAgICAgIGNhc2UgXCJjb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihsb2NhbERheU9mV2VlaywgeyB1bml0OiBcImRheVwiIH0pO1xuICAgICAgY2FzZSBcImNjY1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuICAgICAgY2FzZSBcImNjY2NjXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJjY2NjY2NcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJjY2NjXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIElTTyBkYXkgb2Ygd2Vla1xuICBpOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gZGF0ZS5nZXREYXkoKTtcbiAgICBjb25zdCBpc29EYXlPZldlZWsgPSBkYXlPZldlZWsgPT09IDAgPyA3IDogZGF5T2ZXZWVrO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDJcbiAgICAgIGNhc2UgXCJpXCI6XG4gICAgICAgIHJldHVybiBTdHJpbmcoaXNvRGF5T2ZXZWVrKTtcbiAgICAgIC8vIDAyXG4gICAgICBjYXNlIFwiaWlcIjpcbiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhpc29EYXlPZldlZWssIHRva2VuLmxlbmd0aCk7XG4gICAgICAvLyAybmRcbiAgICAgIGNhc2UgXCJpb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihpc29EYXlPZldlZWssIHsgdW5pdDogXCJkYXlcIiB9KTtcbiAgICAgIC8vIFR1ZVxuICAgICAgY2FzZSBcImlpaVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuICAgICAgY2FzZSBcImlpaWlpXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJpaWlpaWlcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJpaWlpXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIEFNIG9yIFBNXG4gIGE6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICBjb25zdCBkYXlQZXJpb2RFbnVtVmFsdWUgPSBob3VycyAvIDEyID49IDEgPyBcInBtXCIgOiBcImFtXCI7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiYVwiOlxuICAgICAgY2FzZSBcImFhXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFwiYWFhXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZVxuICAgICAgICAgIC5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNhc2UgXCJhYWFhYVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgXCJhYWFhXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIEFNLCBQTSwgbWlkbmlnaHQsIG5vb25cbiAgYjogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xuICAgIGxldCBkYXlQZXJpb2RFbnVtVmFsdWU7XG4gICAgaWYgKGhvdXJzID09PSAxMikge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5ub29uO1xuICAgIH0gZWxzZSBpZiAoaG91cnMgPT09IDApIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubWlkbmlnaHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGhvdXJzIC8gMTIgPj0gMSA/IFwicG1cIiA6IFwiYW1cIjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiYlwiOlxuICAgICAgY2FzZSBcImJiXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFwiYmJiXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZVxuICAgICAgICAgIC5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNhc2UgXCJiYmJiYlwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgXCJiYmJiXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIGluIHRoZSBtb3JuaW5nLCBpbiB0aGUgYWZ0ZXJub29uLCBpbiB0aGUgZXZlbmluZywgYXQgbmlnaHRcbiAgQjogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xuICAgIGxldCBkYXlQZXJpb2RFbnVtVmFsdWU7XG4gICAgaWYgKGhvdXJzID49IDE3KSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLmV2ZW5pbmc7XG4gICAgfSBlbHNlIGlmIChob3VycyA+PSAxMikge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5hZnRlcm5vb247XG4gICAgfSBlbHNlIGlmIChob3VycyA+PSA0KSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLm1vcm5pbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubmlnaHQ7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcIkJcIjpcbiAgICAgIGNhc2UgXCJCQlwiOlxuICAgICAgY2FzZSBcIkJCQlwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSBcIkJCQkJCXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSBcIkJCQkJcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gSG91ciBbMS0xMl1cbiAgaDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGlmICh0b2tlbiA9PT0gXCJob1wiKSB7XG4gICAgICBsZXQgaG91cnMgPSBkYXRlLmdldEhvdXJzKCkgJSAxMjtcbiAgICAgIGlmIChob3VycyA9PT0gMCkgaG91cnMgPSAxMjtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGhvdXJzLCB7IHVuaXQ6IFwiaG91clwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuaChkYXRlLCB0b2tlbik7XG4gIH0sXG5cbiAgLy8gSG91ciBbMC0yM11cbiAgSDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGlmICh0b2tlbiA9PT0gXCJIb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXRlLmdldEhvdXJzKCksIHsgdW5pdDogXCJob3VyXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5IKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBIb3VyIFswLTExXVxuICBLOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgaG91cnMgPSBkYXRlLmdldEhvdXJzKCkgJSAxMjtcblxuICAgIGlmICh0b2tlbiA9PT0gXCJLb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihob3VycywgeyB1bml0OiBcImhvdXJcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGhvdXJzLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIEhvdXIgWzEtMjRdXG4gIGs6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBsZXQgaG91cnMgPSBkYXRlLmdldEhvdXJzKCk7XG4gICAgaWYgKGhvdXJzID09PSAwKSBob3VycyA9IDI0O1xuXG4gICAgaWYgKHRva2VuID09PSBcImtvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGhvdXJzLCB7IHVuaXQ6IFwiaG91clwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoaG91cnMsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gTWludXRlXG4gIG06IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBpZiAodG9rZW4gPT09IFwibW9cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoZGF0ZS5nZXRNaW51dGVzKCksIHsgdW5pdDogXCJtaW51dGVcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLm0oZGF0ZSwgdG9rZW4pO1xuICB9LFxuXG4gIC8vIFNlY29uZFxuICBzOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSBcInNvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0U2Vjb25kcygpLCB7IHVuaXQ6IFwic2Vjb25kXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5zKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBGcmFjdGlvbiBvZiBzZWNvbmRcbiAgUzogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5TKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBUaW1lem9uZSAoSVNPLTg2MDEuIElmIG9mZnNldCBpcyAwLCBvdXRwdXQgaXMgYWx3YXlzIGAnWidgKVxuICBYOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgaWYgKHRpbWV6b25lT2Zmc2V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gXCJaXCI7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gSG91cnMgYW5kIG9wdGlvbmFsIG1pbnV0ZXNcbiAgICAgIGNhc2UgXCJYXCI6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZVdpdGhPcHRpb25hbE1pbnV0ZXModGltZXpvbmVPZmZzZXQpO1xuXG4gICAgICAvLyBIb3VycywgbWludXRlcyBhbmQgb3B0aW9uYWwgc2Vjb25kcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgIC8vIE5vdGU6IG5laXRoZXIgSVNPLTg2MDEgbm9yIEphdmFTY3JpcHQgc3VwcG9ydHMgc2Vjb25kcyBpbiB0aW1lem9uZSBvZmZzZXRzXG4gICAgICAvLyBzbyB0aGlzIHRva2VuIGFsd2F5cyBoYXMgdGhlIHNhbWUgb3V0cHV0IGFzIGBYWGBcbiAgICAgIGNhc2UgXCJYWFhYXCI6XG4gICAgICBjYXNlIFwiWFhcIjogLy8gSG91cnMgYW5kIG1pbnV0ZXMgd2l0aG91dCBgOmAgZGVsaW1pdGVyXG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCk7XG5cbiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGggYDpgIGRlbGltaXRlclxuICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHNcbiAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYFhYWGBcbiAgICAgIGNhc2UgXCJYWFhYWFwiOlxuICAgICAgY2FzZSBcIlhYWFwiOiAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRoIGA6YCBkZWxpbWl0ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBUaW1lem9uZSAoSVNPLTg2MDEuIElmIG9mZnNldCBpcyAwLCBvdXRwdXQgaXMgYCcrMDA6MDAnYCBvciBlcXVpdmFsZW50KVxuICB4OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gSG91cnMgYW5kIG9wdGlvbmFsIG1pbnV0ZXNcbiAgICAgIGNhc2UgXCJ4XCI6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZVdpdGhPcHRpb25hbE1pbnV0ZXModGltZXpvbmVPZmZzZXQpO1xuXG4gICAgICAvLyBIb3VycywgbWludXRlcyBhbmQgb3B0aW9uYWwgc2Vjb25kcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgIC8vIE5vdGU6IG5laXRoZXIgSVNPLTg2MDEgbm9yIEphdmFTY3JpcHQgc3VwcG9ydHMgc2Vjb25kcyBpbiB0aW1lem9uZSBvZmZzZXRzXG4gICAgICAvLyBzbyB0aGlzIHRva2VuIGFsd2F5cyBoYXMgdGhlIHNhbWUgb3V0cHV0IGFzIGB4eGBcbiAgICAgIGNhc2UgXCJ4eHh4XCI6XG4gICAgICBjYXNlIFwieHhcIjogLy8gSG91cnMgYW5kIG1pbnV0ZXMgd2l0aG91dCBgOmAgZGVsaW1pdGVyXG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCk7XG5cbiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGggYDpgIGRlbGltaXRlclxuICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHNcbiAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYHh4eGBcbiAgICAgIGNhc2UgXCJ4eHh4eFwiOlxuICAgICAgY2FzZSBcInh4eFwiOiAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRoIGA6YCBkZWxpbWl0ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBUaW1lem9uZSAoR01UKVxuICBPOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gU2hvcnRcbiAgICAgIGNhc2UgXCJPXCI6XG4gICAgICBjYXNlIFwiT09cIjpcbiAgICAgIGNhc2UgXCJPT09cIjpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZVNob3J0KHRpbWV6b25lT2Zmc2V0LCBcIjpcIik7XG4gICAgICAvLyBMb25nXG4gICAgICBjYXNlIFwiT09PT1wiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBUaW1lem9uZSAoc3BlY2lmaWMgbm9uLWxvY2F0aW9uKVxuICB6OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gU2hvcnRcbiAgICAgIGNhc2UgXCJ6XCI6XG4gICAgICBjYXNlIFwienpcIjpcbiAgICAgIGNhc2UgXCJ6enpcIjpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZVNob3J0KHRpbWV6b25lT2Zmc2V0LCBcIjpcIik7XG4gICAgICAvLyBMb25nXG4gICAgICBjYXNlIFwienp6elwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBTZWNvbmRzIHRpbWVzdGFtcFxuICB0OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IE1hdGgudHJ1bmMoK2RhdGUgLyAxMDAwKTtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHRpbWVzdGFtcCwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBNaWxsaXNlY29uZHMgdGltZXN0YW1wXG4gIFQ6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcygrZGF0ZSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lU2hvcnQob2Zmc2V0LCBkZWxpbWl0ZXIgPSBcIlwiKSB7XG4gIGNvbnN0IHNpZ24gPSBvZmZzZXQgPiAwID8gXCItXCIgOiBcIitcIjtcbiAgY29uc3QgYWJzT2Zmc2V0ID0gTWF0aC5hYnMob2Zmc2V0KTtcbiAgY29uc3QgaG91cnMgPSBNYXRoLnRydW5jKGFic09mZnNldCAvIDYwKTtcbiAgY29uc3QgbWludXRlcyA9IGFic09mZnNldCAlIDYwO1xuICBpZiAobWludXRlcyA9PT0gMCkge1xuICAgIHJldHVybiBzaWduICsgU3RyaW5nKGhvdXJzKTtcbiAgfVxuICByZXR1cm4gc2lnbiArIFN0cmluZyhob3VycykgKyBkZWxpbWl0ZXIgKyBhZGRMZWFkaW5nWmVyb3MobWludXRlcywgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lV2l0aE9wdGlvbmFsTWludXRlcyhvZmZzZXQsIGRlbGltaXRlcikge1xuICBpZiAob2Zmc2V0ICUgNjAgPT09IDApIHtcbiAgICBjb25zdCBzaWduID0gb2Zmc2V0ID4gMCA/IFwiLVwiIDogXCIrXCI7XG4gICAgcmV0dXJuIHNpZ24gKyBhZGRMZWFkaW5nWmVyb3MoTWF0aC5hYnMob2Zmc2V0KSAvIDYwLCAyKTtcbiAgfVxuICByZXR1cm4gZm9ybWF0VGltZXpvbmUob2Zmc2V0LCBkZWxpbWl0ZXIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUaW1lem9uZShvZmZzZXQsIGRlbGltaXRlciA9IFwiXCIpIHtcbiAgY29uc3Qgc2lnbiA9IG9mZnNldCA+IDAgPyBcIi1cIiA6IFwiK1wiO1xuICBjb25zdCBhYnNPZmZzZXQgPSBNYXRoLmFicyhvZmZzZXQpO1xuICBjb25zdCBob3VycyA9IGFkZExlYWRpbmdaZXJvcyhNYXRoLnRydW5jKGFic09mZnNldCAvIDYwKSwgMik7XG4gIGNvbnN0IG1pbnV0ZXMgPSBhZGRMZWFkaW5nWmVyb3MoYWJzT2Zmc2V0ICUgNjAsIDIpO1xuICByZXR1cm4gc2lnbiArIGhvdXJzICsgZGVsaW1pdGVyICsgbWludXRlcztcbn1cbiIsCiAgICAiY29uc3QgZGF0ZUxvbmdGb3JtYXR0ZXIgPSAocGF0dGVybiwgZm9ybWF0TG9uZykgPT4ge1xuICBzd2l0Y2ggKHBhdHRlcm4pIHtcbiAgICBjYXNlIFwiUFwiOlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcuZGF0ZSh7IHdpZHRoOiBcInNob3J0XCIgfSk7XG4gICAgY2FzZSBcIlBQXCI6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy5kYXRlKHsgd2lkdGg6IFwibWVkaXVtXCIgfSk7XG4gICAgY2FzZSBcIlBQUFwiOlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcuZGF0ZSh7IHdpZHRoOiBcImxvbmdcIiB9KTtcbiAgICBjYXNlIFwiUFBQUFwiOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy5kYXRlKHsgd2lkdGg6IFwiZnVsbFwiIH0pO1xuICB9XG59O1xuXG5jb25zdCB0aW1lTG9uZ0Zvcm1hdHRlciA9IChwYXR0ZXJuLCBmb3JtYXRMb25nKSA9PiB7XG4gIHN3aXRjaCAocGF0dGVybikge1xuICAgIGNhc2UgXCJwXCI6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy50aW1lKHsgd2lkdGg6IFwic2hvcnRcIiB9KTtcbiAgICBjYXNlIFwicHBcIjpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLnRpbWUoeyB3aWR0aDogXCJtZWRpdW1cIiB9KTtcbiAgICBjYXNlIFwicHBwXCI6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy50aW1lKHsgd2lkdGg6IFwibG9uZ1wiIH0pO1xuICAgIGNhc2UgXCJwcHBwXCI6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLnRpbWUoeyB3aWR0aDogXCJmdWxsXCIgfSk7XG4gIH1cbn07XG5cbmNvbnN0IGRhdGVUaW1lTG9uZ0Zvcm1hdHRlciA9IChwYXR0ZXJuLCBmb3JtYXRMb25nKSA9PiB7XG4gIGNvbnN0IG1hdGNoUmVzdWx0ID0gcGF0dGVybi5tYXRjaCgvKFArKShwKyk/LykgfHwgW107XG4gIGNvbnN0IGRhdGVQYXR0ZXJuID0gbWF0Y2hSZXN1bHRbMV07XG4gIGNvbnN0IHRpbWVQYXR0ZXJuID0gbWF0Y2hSZXN1bHRbMl07XG5cbiAgaWYgKCF0aW1lUGF0dGVybikge1xuICAgIHJldHVybiBkYXRlTG9uZ0Zvcm1hdHRlcihwYXR0ZXJuLCBmb3JtYXRMb25nKTtcbiAgfVxuXG4gIGxldCBkYXRlVGltZUZvcm1hdDtcblxuICBzd2l0Y2ggKGRhdGVQYXR0ZXJuKSB7XG4gICAgY2FzZSBcIlBcIjpcbiAgICAgIGRhdGVUaW1lRm9ybWF0ID0gZm9ybWF0TG9uZy5kYXRlVGltZSh7IHdpZHRoOiBcInNob3J0XCIgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiUFBcIjpcbiAgICAgIGRhdGVUaW1lRm9ybWF0ID0gZm9ybWF0TG9uZy5kYXRlVGltZSh7IHdpZHRoOiBcIm1lZGl1bVwiIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIlBQUFwiOlxuICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nLmRhdGVUaW1lKHsgd2lkdGg6IFwibG9uZ1wiIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIlBQUFBcIjpcbiAgICBkZWZhdWx0OlxuICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nLmRhdGVUaW1lKHsgd2lkdGg6IFwiZnVsbFwiIH0pO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gZGF0ZVRpbWVGb3JtYXRcbiAgICAucmVwbGFjZShcInt7ZGF0ZX19XCIsIGRhdGVMb25nRm9ybWF0dGVyKGRhdGVQYXR0ZXJuLCBmb3JtYXRMb25nKSlcbiAgICAucmVwbGFjZShcInt7dGltZX19XCIsIHRpbWVMb25nRm9ybWF0dGVyKHRpbWVQYXR0ZXJuLCBmb3JtYXRMb25nKSk7XG59O1xuXG5leHBvcnQgY29uc3QgbG9uZ0Zvcm1hdHRlcnMgPSB7XG4gIHA6IHRpbWVMb25nRm9ybWF0dGVyLFxuICBQOiBkYXRlVGltZUxvbmdGb3JtYXR0ZXIsXG59O1xuIiwKICAgICJjb25zdCBkYXlPZlllYXJUb2tlblJFID0gL15EKyQvO1xuY29uc3Qgd2Vla1llYXJUb2tlblJFID0gL15ZKyQvO1xuXG5jb25zdCB0aHJvd1Rva2VucyA9IFtcIkRcIiwgXCJERFwiLCBcIllZXCIsIFwiWVlZWVwiXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW4odG9rZW4pIHtcbiAgcmV0dXJuIGRheU9mWWVhclRva2VuUkUudGVzdCh0b2tlbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb3RlY3RlZFdlZWtZZWFyVG9rZW4odG9rZW4pIHtcbiAgcmV0dXJuIHdlZWtZZWFyVG9rZW5SRS50ZXN0KHRva2VuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdhcm5PclRocm93UHJvdGVjdGVkRXJyb3IodG9rZW4sIGZvcm1hdCwgaW5wdXQpIHtcbiAgY29uc3QgX21lc3NhZ2UgPSBtZXNzYWdlKHRva2VuLCBmb3JtYXQsIGlucHV0KTtcbiAgY29uc29sZS53YXJuKF9tZXNzYWdlKTtcbiAgaWYgKHRocm93VG9rZW5zLmluY2x1ZGVzKHRva2VuKSkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoX21lc3NhZ2UpO1xufVxuXG5mdW5jdGlvbiBtZXNzYWdlKHRva2VuLCBmb3JtYXQsIGlucHV0KSB7XG4gIGNvbnN0IHN1YmplY3QgPSB0b2tlblswXSA9PT0gXCJZXCIgPyBcInllYXJzXCIgOiBcImRheXMgb2YgdGhlIG1vbnRoXCI7XG4gIHJldHVybiBgVXNlIFxcYCR7dG9rZW4udG9Mb3dlckNhc2UoKX1cXGAgaW5zdGVhZCBvZiBcXGAke3Rva2VufVxcYCAoaW4gXFxgJHtmb3JtYXR9XFxgKSBmb3IgZm9ybWF0dGluZyAke3N1YmplY3R9IHRvIHRoZSBpbnB1dCBcXGAke2lucHV0fVxcYDsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kYDtcbn1cbiIsCiAgICAiaW1wb3J0IHsgZGVmYXVsdExvY2FsZSB9IGZyb20gXCIuL19saWIvZGVmYXVsdExvY2FsZS5qc1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdE9wdGlvbnMgfSBmcm9tIFwiLi9fbGliL2RlZmF1bHRPcHRpb25zLmpzXCI7XG5pbXBvcnQgeyBmb3JtYXR0ZXJzIH0gZnJvbSBcIi4vX2xpYi9mb3JtYXQvZm9ybWF0dGVycy5qc1wiO1xuaW1wb3J0IHsgbG9uZ0Zvcm1hdHRlcnMgfSBmcm9tIFwiLi9fbGliL2Zvcm1hdC9sb25nRm9ybWF0dGVycy5qc1wiO1xuaW1wb3J0IHtcbiAgaXNQcm90ZWN0ZWREYXlPZlllYXJUb2tlbixcbiAgaXNQcm90ZWN0ZWRXZWVrWWVhclRva2VuLFxuICB3YXJuT3JUaHJvd1Byb3RlY3RlZEVycm9yLFxufSBmcm9tIFwiLi9fbGliL3Byb3RlY3RlZFRva2Vucy5qc1wiO1xuaW1wb3J0IHsgaXNWYWxpZCB9IGZyb20gXCIuL2lzVmFsaWQuanNcIjtcbmltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vLyBSZXhwb3J0cyBvZiBpbnRlcm5hbCBmb3IgbGlicmFyaWVzIHRvIHVzZS5cbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2lzc3Vlcy8zNjM4I2lzc3VlY29tbWVudC0xODc3MDgyODc0XG5leHBvcnQgeyBmb3JtYXR0ZXJzLCBsb25nRm9ybWF0dGVycyB9O1xuXG4vLyBUaGlzIFJlZ0V4cCBjb25zaXN0cyBvZiB0aHJlZSBwYXJ0cyBzZXBhcmF0ZWQgYnkgYHxgOlxuLy8gLSBbeVlRcU1Md0lkRGVjaWhIS2ttc11vIG1hdGNoZXMgYW55IGF2YWlsYWJsZSBvcmRpbmFsIG51bWJlciB0b2tlblxuLy8gICAob25lIG9mIHRoZSBjZXJ0YWluIGxldHRlcnMgZm9sbG93ZWQgYnkgYG9gKVxuLy8gLSAoXFx3KVxcMSogbWF0Y2hlcyBhbnkgc2VxdWVuY2VzIG9mIHRoZSBzYW1lIGxldHRlclxuLy8gLSAnJyBtYXRjaGVzIHR3byBxdW90ZSBjaGFyYWN0ZXJzIGluIGEgcm93XG4vLyAtICcoJyd8W14nXSkrKCd8JCkgbWF0Y2hlcyBhbnl0aGluZyBzdXJyb3VuZGVkIGJ5IHR3byBxdW90ZSBjaGFyYWN0ZXJzICgnKSxcbi8vICAgZXhjZXB0IGEgc2luZ2xlIHF1b3RlIHN5bWJvbCwgd2hpY2ggZW5kcyB0aGUgc2VxdWVuY2UuXG4vLyAgIFR3byBxdW90ZSBjaGFyYWN0ZXJzIGRvIG5vdCBlbmQgdGhlIHNlcXVlbmNlLlxuLy8gICBJZiB0aGVyZSBpcyBubyBtYXRjaGluZyBzaW5nbGUgcXVvdGVcbi8vICAgdGhlbiB0aGUgc2VxdWVuY2Ugd2lsbCBjb250aW51ZSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuXG4vLyAtIC4gbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3RlciB1bm1hdGNoZWQgYnkgcHJldmlvdXMgcGFydHMgb2YgdGhlIFJlZ0V4cHNcbmNvbnN0IGZvcm1hdHRpbmdUb2tlbnNSZWdFeHAgPVxuICAvW3lZUXFNTHdJZERlY2loSEtrbXNdb3woXFx3KVxcMSp8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7XG5cbi8vIFRoaXMgUmVnRXhwIGNhdGNoZXMgc3ltYm9scyBlc2NhcGVkIGJ5IHF1b3RlcywgYW5kIGFsc29cbi8vIHNlcXVlbmNlcyBvZiBzeW1ib2xzIFAsIHAsIGFuZCB0aGUgY29tYmluYXRpb25zIGxpa2UgYFBQUFBQUFBwcHBwcGBcbmNvbnN0IGxvbmdGb3JtYXR0aW5nVG9rZW5zUmVnRXhwID0gL1ArcCt8UCt8cCt8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7XG5cbmNvbnN0IGVzY2FwZWRTdHJpbmdSZWdFeHAgPSAvXicoW15dKj8pJz8kLztcbmNvbnN0IGRvdWJsZVF1b3RlUmVnRXhwID0gLycnL2c7XG5jb25zdCB1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cCA9IC9bYS16QS1aXS87XG5cbmV4cG9ydCB7IGZvcm1hdCBhcyBmb3JtYXREYXRlIH07XG5cbi8qKlxuICogVGhlIHtAbGluayBmb3JtYXR9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBmb3JtYXRcbiAqIEBhbGlhcyBmb3JtYXREYXRlXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEZvcm1hdCB0aGUgZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgZm9ybWF0dGVkIGRhdGUgc3RyaW5nIGluIHRoZSBnaXZlbiBmb3JtYXQuIFRoZSByZXN1bHQgbWF5IHZhcnkgYnkgbG9jYWxlLlxuICpcbiAqID4g4pqg77iPIFBsZWFzZSBub3RlIHRoYXQgdGhlIGBmb3JtYXRgIHRva2VucyBkaWZmZXIgZnJvbSBNb21lbnQuanMgYW5kIG90aGVyIGxpYnJhcmllcy5cbiAqID4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKlxuICogVGhlIGNoYXJhY3RlcnMgd3JhcHBlZCBiZXR3ZWVuIHR3byBzaW5nbGUgcXVvdGVzIGNoYXJhY3RlcnMgKCcpIGFyZSBlc2NhcGVkLlxuICogVHdvIHNpbmdsZSBxdW90ZXMgaW4gYSByb3csIHdoZXRoZXIgaW5zaWRlIG9yIG91dHNpZGUgYSBxdW90ZWQgc2VxdWVuY2UsIHJlcHJlc2VudCBhICdyZWFsJyBzaW5nbGUgcXVvdGUuXG4gKiAoc2VlIHRoZSBsYXN0IGV4YW1wbGUpXG4gKlxuICogRm9ybWF0IG9mIHRoZSBzdHJpbmcgaXMgYmFzZWQgb24gVW5pY29kZSBUZWNobmljYWwgU3RhbmRhcmQgIzM1OlxuICogaHR0cHM6Ly93d3cudW5pY29kZS5vcmcvcmVwb3J0cy90cjM1L3RyMzUtZGF0ZXMuaHRtbCNEYXRlX0ZpZWxkX1N5bWJvbF9UYWJsZVxuICogd2l0aCBhIGZldyBhZGRpdGlvbnMgKHNlZSBub3RlIDcgYmVsb3cgdGhlIHRhYmxlKS5cbiAqXG4gKiBBY2NlcHRlZCBwYXR0ZXJuczpcbiAqIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBhdHRlcm4gfCBSZXN1bHQgZXhhbXBsZXMgICAgICAgICAgICAgICAgICAgfCBOb3RlcyB8XG4gKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tfFxuICogfCBFcmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRy4uR0dHICB8IEFELCBCQyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdHR0cgICAgfCBBbm5vIERvbWluaSwgQmVmb3JlIENocmlzdCAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBHR0dHRyAgIHwgQSwgQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBDYWxlbmRhciB5ZWFyICAgICAgICAgICAgICAgICAgIHwgeSAgICAgICB8IDQ0LCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHlvICAgICAgfCA0NHRoLCAxc3QsIDB0aCwgMTd0aCAgICAgICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5eSAgICAgIHwgNDQsIDAxLCAwMCwgMTcgICAgICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeXl5ICAgICB8IDA0NCwgMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHl5eXkgICAgfCAwMDQ0LCAwMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5eXl5eSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw1ICAgfFxuICogfCBMb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgIHwgWSAgICAgICB8IDQ0LCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFlvICAgICAgfCA0NHRoLCAxc3QsIDE5MDB0aCwgMjAxN3RoICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBZWSAgICAgIHwgNDQsIDAxLCAwMCwgMTcgICAgICAgICAgICAgICAgICAgIHwgNSw4ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWVlZICAgICB8IDA0NCwgMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFlZWVkgICAgfCAwMDQ0LCAwMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgfCA1LDggICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBZWVlZWSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw1ICAgfFxuICogfCBJU08gd2Vlay1udW1iZXJpbmcgeWVhciAgICAgICAgIHwgUiAgICAgICB8IC00MywgMCwgMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJSICAgICAgfCAtNDMsIDAwLCAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSUlIgICAgIHwgLTA0MywgMDAwLCAwMDEsIDE5MDAsIDIwMTcgICAgICAgIHwgNSw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUlJSUiAgICB8IC0wMDQzLCAwMDAwLCAwMDAxLCAxOTAwLCAyMDE3ICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJSUlJSICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDUsNyB8XG4gKiB8IEV4dGVuZGVkIHllYXIgICAgICAgICAgICAgICAgICAgfCB1ICAgICAgIHwgLTQzLCAwLCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdXUgICAgICB8IC00MywgMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHV1dSAgICAgfCAtMDQzLCAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1dXV1ICAgIHwgLTAwNDMsIDAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdXV1dXUgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNSAgIHxcbiAqIHwgUXVhcnRlciAoZm9ybWF0dGluZykgICAgICAgICAgICB8IFEgICAgICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBRbyAgICAgIHwgMXN0LCAybmQsIDNyZCwgNHRoICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUVEgICAgICB8IDAxLCAwMiwgMDMsIDA0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFFRUSAgICAgfCBRMSwgUTIsIFEzLCBRNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBRUVFRICAgIHwgMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi4gICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUVFRUVEgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgUXVhcnRlciAoc3RhbmQtYWxvbmUpICAgICAgICAgICB8IHEgICAgICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxbyAgICAgIHwgMXN0LCAybmQsIDNyZCwgNHRoICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcXEgICAgICB8IDAxLCAwMiwgMDMsIDA0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHFxcSAgICAgfCBRMSwgUTIsIFEzLCBRNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxcXFxICAgIHwgMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi4gICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcXFxcXEgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgTW9udGggKGZvcm1hdHRpbmcpICAgICAgICAgICAgICB8IE0gICAgICAgfCAxLCAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTJ0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTU0gICAgICB8IDAxLCAwMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1NTSAgICAgfCBKYW4sIEZlYiwgLi4uLCBEZWMgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNTU1NICAgIHwgSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXIgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTU1NTU0gICB8IEosIEYsIC4uLiwgRCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgTW9udGggKHN0YW5kLWFsb25lKSAgICAgICAgICAgICB8IEwgICAgICAgfCAxLCAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTJ0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTEwgICAgICB8IDAxLCAwMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExMTCAgICAgfCBKYW4sIEZlYiwgLi4uLCBEZWMgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMTExMICAgIHwgSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXIgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTExMTEwgICB8IEosIEYsIC4uLiwgRCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgTG9jYWwgd2VlayBvZiB5ZWFyICAgICAgICAgICAgICB8IHcgICAgICAgfCAxLCAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3byAgICAgIHwgMXN0LCAybmQsIC4uLiwgNTN0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd3cgICAgICB8IDAxLCAwMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgSVNPIHdlZWsgb2YgeWVhciAgICAgICAgICAgICAgICB8IEkgICAgICAgfCAxLCAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgNTN0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSUkgICAgICB8IDAxLCAwMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgRGF5IG9mIG1vbnRoICAgICAgICAgICAgICAgICAgICB8IGQgICAgICAgfCAxLCAyLCAuLi4sIDMxICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMzFzdCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZGQgICAgICB8IDAxLCAwMiwgLi4uLCAzMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgRGF5IG9mIHllYXIgICAgICAgICAgICAgICAgICAgICB8IEQgICAgICAgfCAxLCAyLCAuLi4sIDM2NSwgMzY2ICAgICAgICAgICAgICAgfCA5ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMzY1dGgsIDM2NnRoICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgREQgICAgICB8IDAxLCAwMiwgLi4uLCAzNjUsIDM2NiAgICAgICAgICAgICB8IDkgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERERCAgICAgfCAwMDEsIDAwMiwgLi4uLCAzNjUsIDM2NiAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEREREICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyAgICAgfFxuICogfCBEYXkgb2Ygd2VlayAoZm9ybWF0dGluZykgICAgICAgIHwgRS4uRUVFICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVFRUUgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRUVFRSAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRUVFRUVFICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8ICAgICAgIHxcbiAqIHwgSVNPIGRheSBvZiB3ZWVrIChmb3JtYXR0aW5nKSAgICB8IGkgICAgICAgfCAxLCAyLCAzLCAuLi4sIDcgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgN3RoICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWkgICAgICB8IDAxLCAwMiwgLi4uLCAwNyAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlpaSAgICAgfCBNb24sIFR1ZSwgV2VkLCAuLi4sIFN1biAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpaWlpICAgIHwgTW9uZGF5LCBUdWVzZGF5LCAuLi4sIFN1bmRheSAgICAgIHwgMiw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWlpaWkgICB8IE0sIFQsIFcsIFQsIEYsIFMsIFMgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlpaWlpaSAgfCBNbywgVHUsIFdlLCBUaCwgRnIsIFNhLCBTdSAgICAgICAgfCA3ICAgICB8XG4gKiB8IExvY2FsIGRheSBvZiB3ZWVrIChmb3JtYXR0aW5nKSAgfCBlICAgICAgIHwgMiwgMywgNCwgLi4uLCAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZW8gICAgICB8IDJuZCwgM3JkLCAuLi4sIDFzdCAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVlICAgICAgfCAwMiwgMDMsIC4uLiwgMDEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlZWUgICAgIHwgTW9uLCBUdWUsIFdlZCwgLi4uLCBTdW4gICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZWVlZSAgICB8IE1vbmRheSwgVHVlc2RheSwgLi4uLCBTdW5kYXkgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVlZWVlICAgfCBNLCBULCBXLCBULCBGLCBTLCBTICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlZWVlZWUgIHwgTW8sIFR1LCBXZSwgVGgsIEZyLCBTYSwgU3UgICAgICAgIHwgICAgICAgfFxuICogfCBMb2NhbCBkYXkgb2Ygd2VlayAoc3RhbmQtYWxvbmUpIHwgYyAgICAgICB8IDIsIDMsIDQsIC4uLiwgMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNvICAgICAgfCAybmQsIDNyZCwgLi4uLCAxc3QgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjYyAgICAgIHwgMDIsIDAzLCAuLi4sIDAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2NjICAgICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNjY2MgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjY2NjYyAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2NjY2NjICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8ICAgICAgIHxcbiAqIHwgQU0sIFBNICAgICAgICAgICAgICAgICAgICAgICAgICB8IGEuLmFhICAgfCBBTSwgUE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhYWEgICAgIHwgYW0sIHBtICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWFhYSAgICB8IGEubS4sIHAubS4gICAgICAgICAgICAgICAgICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFhYWFhICAgfCBhLCBwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEFNLCBQTSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICAgfCBiLi5iYiAgIHwgQU0sIFBNLCBub29uLCBtaWRuaWdodCAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYmJiICAgICB8IGFtLCBwbSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJiYmIgICAgfCBhLm0uLCBwLm0uLCBub29uLCBtaWRuaWdodCAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiYmJiYiAgIHwgYSwgcCwgbiwgbWkgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBGbGV4aWJsZSBkYXkgcGVyaW9kICAgICAgICAgICAgIHwgQi4uQkJCICB8IGF0IG5pZ2h0LCBpbiB0aGUgbW9ybmluZywgLi4uICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJCQkIgICAgfCBhdCBuaWdodCwgaW4gdGhlIG1vcm5pbmcsIC4uLiAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCQkJCQiAgIHwgYXQgbmlnaHQsIGluIHRoZSBtb3JuaW5nLCAuLi4gICAgIHwgICAgICAgfFxuICogfCBIb3VyIFsxLTEyXSAgICAgICAgICAgICAgICAgICAgIHwgaCAgICAgICB8IDEsIDIsIC4uLiwgMTEsIDEyICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGhvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAxMXRoLCAxMnRoICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBoaCAgICAgIHwgMDEsIDAyLCAuLi4sIDExLCAxMiAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBIb3VyIFswLTIzXSAgICAgICAgICAgICAgICAgICAgIHwgSCAgICAgICB8IDAsIDEsIDIsIC4uLiwgMjMgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhvICAgICAgfCAwdGgsIDFzdCwgMm5kLCAuLi4sIDIzcmQgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBISCAgICAgIHwgMDAsIDAxLCAwMiwgLi4uLCAyMyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBIb3VyIFswLTExXSAgICAgICAgICAgICAgICAgICAgIHwgSyAgICAgICB8IDEsIDIsIC4uLiwgMTEsIDAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEtvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAxMXRoLCAwdGggICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBLSyAgICAgIHwgMDEsIDAyLCAuLi4sIDExLCAwMCAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBIb3VyIFsxLTI0XSAgICAgICAgICAgICAgICAgICAgIHwgayAgICAgICB8IDI0LCAxLCAyLCAuLi4sIDIzICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGtvICAgICAgfCAyNHRoLCAxc3QsIDJuZCwgLi4uLCAyM3JkICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBrayAgICAgIHwgMjQsIDAxLCAwMiwgLi4uLCAyMyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBNaW51dGUgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbSAgICAgICB8IDAsIDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG1vICAgICAgfCAwdGgsIDFzdCwgLi4uLCA1OXRoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtbSAgICAgIHwgMDAsIDAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBTZWNvbmQgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcyAgICAgICB8IDAsIDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNvICAgICAgfCAwdGgsIDFzdCwgLi4uLCA1OXRoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzcyAgICAgIHwgMDAsIDAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBGcmFjdGlvbiBvZiBzZWNvbmQgICAgICAgICAgICAgIHwgUyAgICAgICB8IDAsIDEsIC4uLiwgOSAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNTICAgICAgfCAwMCwgMDEsIC4uLiwgOTkgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTU1MgICAgIHwgMDAwLCAwMDEsIC4uLiwgOTk5ICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU1NTUyAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMgICAgIHxcbiAqIHwgVGltZXpvbmUgKElTTy04NjAxIHcvIFopICAgICAgICB8IFggICAgICAgfCAtMDgsICswNTMwLCBaICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYWCAgICAgIHwgLTA4MDAsICswNTMwLCBaICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWFhYICAgICB8IC0wODowMCwgKzA1OjMwLCBaICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFhYWFggICAgfCAtMDgwMCwgKzA1MzAsIFosICsxMjM0NTYgICAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYWFhYWCAgIHwgLTA4OjAwLCArMDU6MzAsIFosICsxMjozNDo1NiAgICAgIHwgICAgICAgfFxuICogfCBUaW1lem9uZSAoSVNPLTg2MDEgdy9vIFopICAgICAgIHwgeCAgICAgICB8IC0wOCwgKzA1MzAsICswMCAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHh4ICAgICAgfCAtMDgwMCwgKzA1MzAsICswMDAwICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB4eHggICAgIHwgLTA4OjAwLCArMDU6MzAsICswMDowMCAgICAgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeHh4eCAgICB8IC0wODAwLCArMDUzMCwgKzAwMDAsICsxMjM0NTYgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHh4eHh4ICAgfCAtMDg6MDAsICswNTozMCwgKzAwOjAwLCArMTI6MzQ6NTYgfCAgICAgICB8XG4gKiB8IFRpbWV6b25lIChHTVQpICAgICAgICAgICAgICAgICAgfCBPLi4uT09PIHwgR01ULTgsIEdNVCs1OjMwLCBHTVQrMCAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgT09PTyAgICB8IEdNVC0wODowMCwgR01UKzA1OjMwLCBHTVQrMDA6MDAgICB8IDIgICAgIHxcbiAqIHwgVGltZXpvbmUgKHNwZWNpZmljIG5vbi1sb2NhdC4pICB8IHouLi56enogfCBHTVQtOCwgR01UKzU6MzAsIEdNVCswICAgICAgICAgICAgfCA2ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB6enp6ICAgIHwgR01ULTA4OjAwLCBHTVQrMDU6MzAsIEdNVCswMDowMCAgIHwgMiw2ICAgfFxuICogfCBTZWNvbmRzIHRpbWVzdGFtcCAgICAgICAgICAgICAgIHwgdCAgICAgICB8IDUxMjk2OTUyMCAgICAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHR0ICAgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDcgICB8XG4gKiB8IE1pbGxpc2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICAgfCBUICAgICAgIHwgNTEyOTY5NTIwOTAwICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFQgICAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNyAgIHxcbiAqIHwgTG9uZyBsb2NhbGl6ZWQgZGF0ZSAgICAgICAgICAgICB8IFAgICAgICAgfCAwNC8yOS8xNDUzICAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUCAgICAgIHwgQXByIDI5LCAxNDUzICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFBQICAgICB8IEFwcmlsIDI5dGgsIDE0NTMgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQUFAgICAgfCBGcmlkYXksIEFwcmlsIDI5dGgsIDE0NTMgICAgICAgICAgfCAyLDcgICB8XG4gKiB8IExvbmcgbG9jYWxpemVkIHRpbWUgICAgICAgICAgICAgfCBwICAgICAgIHwgMTI6MDAgQU0gICAgICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcHAgICAgICB8IDEyOjAwOjAwIEFNICAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBwcCAgICAgfCAxMjowMDowMCBBTSBHTVQrMiAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwcHBwICAgIHwgMTI6MDA6MDAgQU0gR01UKzAyOjAwICAgICAgICAgICAgIHwgMiw3ICAgfFxuICogfCBDb21iaW5hdGlvbiBvZiBkYXRlIGFuZCB0aW1lICAgIHwgUHAgICAgICB8IDA0LzI5LzE0NTMsIDEyOjAwIEFNICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQcHAgICAgfCBBcHIgMjksIDE0NTMsIDEyOjAwOjAwIEFNICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUFBwcHAgIHwgQXByaWwgMjl0aCwgMTQ1MyBhdCAuLi4gICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFBQUHBwcHB8IEZyaWRheSwgQXByaWwgMjl0aCwgMTQ1MyBhdCAuLi4gICB8IDIsNyAgIHxcbiAqIE5vdGVzOlxuICogMS4gXCJGb3JtYXR0aW5nXCIgdW5pdHMgKGUuZy4gZm9ybWF0dGluZyBxdWFydGVyKSBpbiB0aGUgZGVmYXVsdCBlbi1VUyBsb2NhbGVcbiAqICAgIGFyZSB0aGUgc2FtZSBhcyBcInN0YW5kLWFsb25lXCIgdW5pdHMsIGJ1dCBhcmUgZGlmZmVyZW50IGluIHNvbWUgbGFuZ3VhZ2VzLlxuICogICAgXCJGb3JtYXR0aW5nXCIgdW5pdHMgYXJlIGRlY2xpbmVkIGFjY29yZGluZyB0byB0aGUgcnVsZXMgb2YgdGhlIGxhbmd1YWdlXG4gKiAgICBpbiB0aGUgY29udGV4dCBvZiBhIGRhdGUuIFwiU3RhbmQtYWxvbmVcIiB1bml0cyBhcmUgYWx3YXlzIG5vbWluYXRpdmUgc2luZ3VsYXI6XG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdkbyBMTExMJywge2xvY2FsZTogY3N9KSAvLz0+ICc2LiBsaXN0b3BhZCdgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdkbyBNTU1NJywge2xvY2FsZTogY3N9KSAvLz0+ICc2LiBsaXN0b3BhZHUnYFxuICpcbiAqIDIuIEFueSBzZXF1ZW5jZSBvZiB0aGUgaWRlbnRpY2FsIGxldHRlcnMgaXMgYSBwYXR0ZXJuLCB1bmxlc3MgaXQgaXMgZXNjYXBlZCBieVxuICogICAgdGhlIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzIChzZWUgYmVsb3cpLlxuICogICAgSWYgdGhlIHNlcXVlbmNlIGlzIGxvbmdlciB0aGFuIGxpc3RlZCBpbiB0YWJsZSAoZS5nLiBgRUVFRUVFRUVFRUVgKVxuICogICAgdGhlIG91dHB1dCB3aWxsIGJlIHRoZSBzYW1lIGFzIGRlZmF1bHQgcGF0dGVybiBmb3IgdGhpcyB1bml0LCB1c3VhbGx5XG4gKiAgICB0aGUgbG9uZ2VzdCBvbmUgKGluIGNhc2Ugb2YgSVNPIHdlZWtkYXlzLCBgRUVFRWApLiBEZWZhdWx0IHBhdHRlcm5zIGZvciB1bml0c1xuICogICAgYXJlIG1hcmtlZCB3aXRoIFwiMlwiIGluIHRoZSBsYXN0IGNvbHVtbiBvZiB0aGUgdGFibGUuXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU0nKSAvLz0+ICdOb3YnYFxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnTU1NTScpIC8vPT4gJ05vdmVtYmVyJ2BcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ01NTU1NJykgLy89PiAnTidgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU1NTU0nKSAvLz0+ICdOb3ZlbWJlcidgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU1NTU1NJykgLy89PiAnTm92ZW1iZXInYFxuICpcbiAqIDMuIFNvbWUgcGF0dGVybnMgY291bGQgYmUgdW5saW1pdGVkIGxlbmd0aCAoc3VjaCBhcyBgeXl5eXl5eXlgKS5cbiAqICAgIFRoZSBvdXRwdXQgd2lsbCBiZSBwYWRkZWQgd2l0aCB6ZXJvcyB0byBtYXRjaCB0aGUgbGVuZ3RoIG9mIHRoZSBwYXR0ZXJuLlxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAneXl5eXl5eXknKSAvLz0+ICcwMDAwMjAxNydgXG4gKlxuICogNC4gYFFRUVFRYCBhbmQgYHFxcXFxYCBjb3VsZCBiZSBub3Qgc3RyaWN0bHkgbnVtZXJpY2FsIGluIHNvbWUgbG9jYWxlcy5cbiAqICAgIFRoZXNlIHRva2VucyByZXByZXNlbnQgdGhlIHNob3J0ZXN0IGZvcm0gb2YgdGhlIHF1YXJ0ZXIuXG4gKlxuICogNS4gVGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIGB5YCBhbmQgYHVgIHBhdHRlcm5zIGFyZSBCLkMuIHllYXJzOlxuICpcbiAqICAgIHwgWWVhciB8IGB5YCB8IGB1YCB8XG4gKiAgICB8LS0tLS0tfC0tLS0tfC0tLS0tfFxuICogICAgfCBBQyAxIHwgICAxIHwgICAxIHxcbiAqICAgIHwgQkMgMSB8ICAgMSB8ICAgMCB8XG4gKiAgICB8IEJDIDIgfCAgIDIgfCAgLTEgfFxuICpcbiAqICAgIEFsc28gYHl5YCBhbHdheXMgcmV0dXJucyB0aGUgbGFzdCB0d28gZGlnaXRzIG9mIGEgeWVhcixcbiAqICAgIHdoaWxlIGB1dWAgcGFkcyBzaW5nbGUgZGlnaXQgeWVhcnMgdG8gMiBjaGFyYWN0ZXJzIGFuZCByZXR1cm5zIG90aGVyIHllYXJzIHVuY2hhbmdlZDpcbiAqXG4gKiAgICB8IFllYXIgfCBgeXlgIHwgYHV1YCB8XG4gKiAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS18XG4gKiAgICB8IDEgICAgfCAgIDAxIHwgICAwMSB8XG4gKiAgICB8IDE0ICAgfCAgIDE0IHwgICAxNCB8XG4gKiAgICB8IDM3NiAgfCAgIDc2IHwgIDM3NiB8XG4gKiAgICB8IDE0NTMgfCAgIDUzIHwgMTQ1MyB8XG4gKlxuICogICAgVGhlIHNhbWUgZGlmZmVyZW5jZSBpcyB0cnVlIGZvciBsb2NhbCBhbmQgSVNPIHdlZWstbnVtYmVyaW5nIHllYXJzIChgWWAgYW5kIGBSYCksXG4gKiAgICBleGNlcHQgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhcnMgYXJlIGRlcGVuZGVudCBvbiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gXG4gKiAgICBhbmQgYG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlYCAoY29tcGFyZSBbZ2V0SVNPV2Vla1llYXJdKGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3MvZ2V0SVNPV2Vla1llYXIpXG4gKiAgICBhbmQgW2dldFdlZWtZZWFyXShodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL2dldFdlZWtZZWFyKSkuXG4gKlxuICogNi4gU3BlY2lmaWMgbm9uLWxvY2F0aW9uIHRpbWV6b25lcyBhcmUgY3VycmVudGx5IHVuYXZhaWxhYmxlIGluIGBkYXRlLWZuc2AsXG4gKiAgICBzbyByaWdodCBub3cgdGhlc2UgdG9rZW5zIGZhbGwgYmFjayB0byBHTVQgdGltZXpvbmVzLlxuICpcbiAqIDcuIFRoZXNlIHBhdHRlcm5zIGFyZSBub3QgaW4gdGhlIFVuaWNvZGUgVGVjaG5pY2FsIFN0YW5kYXJkICMzNTpcbiAqICAgIC0gYGlgOiBJU08gZGF5IG9mIHdlZWtcbiAqICAgIC0gYElgOiBJU08gd2VlayBvZiB5ZWFyXG4gKiAgICAtIGBSYDogSVNPIHdlZWstbnVtYmVyaW5nIHllYXJcbiAqICAgIC0gYHRgOiBzZWNvbmRzIHRpbWVzdGFtcFxuICogICAgLSBgVGA6IG1pbGxpc2Vjb25kcyB0aW1lc3RhbXBcbiAqICAgIC0gYG9gOiBvcmRpbmFsIG51bWJlciBtb2RpZmllclxuICogICAgLSBgUGA6IGxvbmcgbG9jYWxpemVkIGRhdGVcbiAqICAgIC0gYHBgOiBsb25nIGxvY2FsaXplZCB0aW1lXG4gKlxuICogOC4gYFlZYCBhbmQgYFlZWVlgIHRva2VucyByZXByZXNlbnQgd2Vlay1udW1iZXJpbmcgeWVhcnMgYnV0IHRoZXkgYXJlIG9mdGVuIGNvbmZ1c2VkIHdpdGggeWVhcnMuXG4gKiAgICBZb3Ugc2hvdWxkIGVuYWJsZSBgb3B0aW9ucy51c2VBZGRpdGlvbmFsV2Vla1llYXJUb2tlbnNgIHRvIHVzZSB0aGVtLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqXG4gKiA5LiBgRGAgYW5kIGBERGAgdG9rZW5zIHJlcHJlc2VudCBkYXlzIG9mIHRoZSB5ZWFyIGJ1dCB0aGV5IGFyZSBvZnRlbiBjb25mdXNlZCB3aXRoIGRheXMgb2YgdGhlIG1vbnRoLlxuICogICAgWW91IHNob3VsZCBlbmFibGUgYG9wdGlvbnMudXNlQWRkaXRpb25hbERheU9mWWVhclRva2Vuc2AgdG8gdXNlIHRoZW0uIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSBmb3JtYXQgLSBUaGUgc3RyaW5nIG9mIHRva2Vuc1xuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCBkYXRlIHN0cmluZ1xuICpcbiAqIEB0aHJvd3MgYGRhdGVgIG11c3Qgbm90IGJlIEludmFsaWQgRGF0ZVxuICogQHRocm93cyBgb3B0aW9ucy5sb2NhbGVgIG11c3QgY29udGFpbiBgbG9jYWxpemVgIHByb3BlcnR5XG4gKiBAdGhyb3dzIGBvcHRpb25zLmxvY2FsZWAgbXVzdCBjb250YWluIGBmb3JtYXRMb25nYCBwcm9wZXJ0eVxuICogQHRocm93cyB1c2UgYHl5eXlgIGluc3RlYWQgb2YgYFlZWVlgIGZvciBmb3JtYXR0aW5nIHllYXJzIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqIEB0aHJvd3MgdXNlIGB5eWAgaW5zdGVhZCBvZiBgWVlgIGZvciBmb3JtYXR0aW5nIHllYXJzIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqIEB0aHJvd3MgdXNlIGBkYCBpbnN0ZWFkIG9mIGBEYCBmb3IgZm9ybWF0dGluZyBkYXlzIG9mIHRoZSBtb250aCB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKiBAdGhyb3dzIHVzZSBgZGRgIGluc3RlYWQgb2YgYEREYCBmb3IgZm9ybWF0dGluZyBkYXlzIG9mIHRoZSBtb250aCB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKiBAdGhyb3dzIGZvcm1hdCBzdHJpbmcgY29udGFpbnMgYW4gdW5lc2NhcGVkIGxhdGluIGFscGhhYmV0IGNoYXJhY3RlclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBSZXByZXNlbnQgMTEgRmVicnVhcnkgMjAxNCBpbiBtaWRkbGUtZW5kaWFuIGZvcm1hdDpcbiAqIGNvbnN0IHJlc3VsdCA9IGZvcm1hdChuZXcgRGF0ZSgyMDE0LCAxLCAxMSksICdNTS9kZC95eXl5JylcbiAqIC8vPT4gJzAyLzExLzIwMTQnXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFJlcHJlc2VudCAyIEp1bHkgMjAxNCBpbiBFc3BlcmFudG86XG4gKiBpbXBvcnQgeyBlb0xvY2FsZSB9IGZyb20gJ2RhdGUtZm5zL2xvY2FsZS9lbydcbiAqIGNvbnN0IHJlc3VsdCA9IGZvcm1hdChuZXcgRGF0ZSgyMDE0LCA2LCAyKSwgXCJkbyAnZGUnIE1NTU0geXl5eVwiLCB7XG4gKiAgIGxvY2FsZTogZW9Mb2NhbGVcbiAqIH0pXG4gKiAvLz0+ICcyLWEgZGUganVsaW8gMjAxNCdcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRXNjYXBlIHN0cmluZyBieSBzaW5nbGUgcXVvdGUgY2hhcmFjdGVyczpcbiAqIGNvbnN0IHJlc3VsdCA9IGZvcm1hdChuZXcgRGF0ZSgyMDE0LCA2LCAyLCAxNSksIFwiaCAnbycnY2xvY2snXCIpXG4gKiAvLz0+IFwiMyBvJ2Nsb2NrXCJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdChkYXRlLCBmb3JtYXRTdHIsIG9wdGlvbnMpIHtcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSBnZXREZWZhdWx0T3B0aW9ucygpO1xuICBjb25zdCBsb2NhbGUgPSBvcHRpb25zPy5sb2NhbGUgPz8gZGVmYXVsdE9wdGlvbnMubG9jYWxlID8/IGRlZmF1bHRMb2NhbGU7XG5cbiAgY29uc3QgZmlyc3RXZWVrQ29udGFpbnNEYXRlID1cbiAgICBvcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgMTtcblxuICBjb25zdCB3ZWVrU3RhcnRzT24gPVxuICAgIG9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICAwO1xuXG4gIGNvbnN0IG9yaWdpbmFsRGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7XG5cbiAgaWYgKCFpc1ZhbGlkKG9yaWdpbmFsRGF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgdGltZSB2YWx1ZVwiKTtcbiAgfVxuXG4gIGxldCBwYXJ0cyA9IGZvcm1hdFN0clxuICAgIC5tYXRjaChsb25nRm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cClcbiAgICAubWFwKChzdWJzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gc3Vic3RyaW5nWzBdO1xuICAgICAgaWYgKGZpcnN0Q2hhcmFjdGVyID09PSBcInBcIiB8fCBmaXJzdENoYXJhY3RlciA9PT0gXCJQXCIpIHtcbiAgICAgICAgY29uc3QgbG9uZ0Zvcm1hdHRlciA9IGxvbmdGb3JtYXR0ZXJzW2ZpcnN0Q2hhcmFjdGVyXTtcbiAgICAgICAgcmV0dXJuIGxvbmdGb3JtYXR0ZXIoc3Vic3RyaW5nLCBsb2NhbGUuZm9ybWF0TG9uZyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3Vic3RyaW5nO1xuICAgIH0pXG4gICAgLmpvaW4oXCJcIilcbiAgICAubWF0Y2goZm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cClcbiAgICAubWFwKChzdWJzdHJpbmcpID0+IHtcbiAgICAgIC8vIFJlcGxhY2UgdHdvIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzIHdpdGggb25lIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJcbiAgICAgIGlmIChzdWJzdHJpbmcgPT09IFwiJydcIikge1xuICAgICAgICByZXR1cm4geyBpc1Rva2VuOiBmYWxzZSwgdmFsdWU6IFwiJ1wiIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gc3Vic3RyaW5nWzBdO1xuICAgICAgaWYgKGZpcnN0Q2hhcmFjdGVyID09PSBcIidcIikge1xuICAgICAgICByZXR1cm4geyBpc1Rva2VuOiBmYWxzZSwgdmFsdWU6IGNsZWFuRXNjYXBlZFN0cmluZyhzdWJzdHJpbmcpIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3JtYXR0ZXJzW2ZpcnN0Q2hhcmFjdGVyXSkge1xuICAgICAgICByZXR1cm4geyBpc1Rva2VuOiB0cnVlLCB2YWx1ZTogc3Vic3RyaW5nIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChmaXJzdENoYXJhY3Rlci5tYXRjaCh1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXG4gICAgICAgICAgXCJGb3JtYXQgc3RyaW5nIGNvbnRhaW5zIGFuIHVuZXNjYXBlZCBsYXRpbiBhbHBoYWJldCBjaGFyYWN0ZXIgYFwiICtcbiAgICAgICAgICAgIGZpcnN0Q2hhcmFjdGVyICtcbiAgICAgICAgICAgIFwiYFwiLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geyBpc1Rva2VuOiBmYWxzZSwgdmFsdWU6IHN1YnN0cmluZyB9O1xuICAgIH0pO1xuXG4gIC8vIGludm9rZSBsb2NhbGl6ZSBwcmVwcm9jZXNzb3IgKG9ubHkgZm9yIGZyZW5jaCBsb2NhbGVzIGF0IHRoZSBtb21lbnQpXG4gIGlmIChsb2NhbGUubG9jYWxpemUucHJlcHJvY2Vzc29yKSB7XG4gICAgcGFydHMgPSBsb2NhbGUubG9jYWxpemUucHJlcHJvY2Vzc29yKG9yaWdpbmFsRGF0ZSwgcGFydHMpO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0dGVyT3B0aW9ucyA9IHtcbiAgICBmaXJzdFdlZWtDb250YWluc0RhdGUsXG4gICAgd2Vla1N0YXJ0c09uLFxuICAgIGxvY2FsZSxcbiAgfTtcblxuICByZXR1cm4gcGFydHNcbiAgICAubWFwKChwYXJ0KSA9PiB7XG4gICAgICBpZiAoIXBhcnQuaXNUb2tlbikgcmV0dXJuIHBhcnQudmFsdWU7XG5cbiAgICAgIGNvbnN0IHRva2VuID0gcGFydC52YWx1ZTtcblxuICAgICAgaWYgKFxuICAgICAgICAoIW9wdGlvbnM/LnVzZUFkZGl0aW9uYWxXZWVrWWVhclRva2VucyAmJlxuICAgICAgICAgIGlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbih0b2tlbikpIHx8XG4gICAgICAgICghb3B0aW9ucz8udXNlQWRkaXRpb25hbERheU9mWWVhclRva2VucyAmJlxuICAgICAgICAgIGlzUHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW4odG9rZW4pKVxuICAgICAgKSB7XG4gICAgICAgIHdhcm5PclRocm93UHJvdGVjdGVkRXJyb3IodG9rZW4sIGZvcm1hdFN0ciwgU3RyaW5nKGRhdGUpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0dGVyID0gZm9ybWF0dGVyc1t0b2tlblswXV07XG4gICAgICByZXR1cm4gZm9ybWF0dGVyKG9yaWdpbmFsRGF0ZSwgdG9rZW4sIGxvY2FsZS5sb2NhbGl6ZSwgZm9ybWF0dGVyT3B0aW9ucyk7XG4gICAgfSlcbiAgICAuam9pbihcIlwiKTtcbn1cblxuZnVuY3Rpb24gY2xlYW5Fc2NhcGVkU3RyaW5nKGlucHV0KSB7XG4gIGNvbnN0IG1hdGNoZWQgPSBpbnB1dC5tYXRjaChlc2NhcGVkU3RyaW5nUmVnRXhwKTtcblxuICBpZiAoIW1hdGNoZWQpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cblxuICByZXR1cm4gbWF0Y2hlZFsxXS5yZXBsYWNlKGRvdWJsZVF1b3RlUmVnRXhwLCBcIidcIik7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgZm9ybWF0O1xuIiwKICAgICJpbXBvcnQgdHlwZSB7IExvZywgTWlsa2lvSW5pdCwgTWlsa2lvUnVudGltZUluaXQgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcclxuXHJcbmludGVyZmFjZSBDb29rYm9va0V2ZW50IHtcclxuICB0eXBlOiBcIm1pbGtpb0Bsb2dnZXJcIjtcclxuICBsb2c6IExvZztcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbmRDb29rYm9va0V2ZW50KHJ1bnRpbWU6IE1pbGtpb1J1bnRpbWVJbml0PE1pbGtpb0luaXQ+LCBldmVudDogQ29va2Jvb2tFdmVudCkge1xyXG4gIC8vIHRyeSB7XHJcbiAgLy8gICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGBodHRwOi8vbG9jYWxob3N0OiR7cnVudGltZS5jb29rYm9vay5jb29rYm9va1BvcnR9LyRhY3Rpb25gLCB7XHJcbiAgLy8gICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgLy8gICAgIGhlYWRlcnM6IHtcclxuICAvLyAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAvLyAgICAgfSxcclxuICAvLyAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZXZlbnQpLFxyXG4gIC8vICAgfSk7XHJcbiAgLy8gICBpZiAoIXJlc3BvbnNlLm9rKSB7XHJcbiAgLy8gICAgIGNvbnNvbGUubG9nKFwiW0NPT0tCT09LXVwiLCBhd2FpdCByZXNwb25zZS50ZXh0KCkpO1xyXG4gIC8vICAgICBjb25zb2xlLmxvZyhcIltDT09LQk9PS11cIiwgXCJJcyBDb29rYm9vayBjbG9zZWQ/IFRoZXJlIGlzIGFuIGFibm9ybWFsaXR5IGluIHRoZSBjb21tdW5pY2F0aW9uIHdpdGggQ29va2Jvb2suXCIpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgLy8gICBjb25zb2xlLmxvZyhcIltDT09LQk9PS11cIiwgZXJyb3IpO1xyXG4gIC8vICAgY29uc29sZS5sb2coXCJbQ09PS0JPT0tdXCIsIFwiSXMgQ29va2Jvb2sgY2xvc2VkPyBUaGVyZSBpcyBhbiBhYm5vcm1hbGl0eSBpbiB0aGUgY29tbXVuaWNhdGlvbiB3aXRoIENvb2tib29rLlwiKTtcclxuICAvLyB9XHJcbn1cclxuIiwKICAgICJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tIFwiZGF0ZS1mbnNcIjtcclxuaW1wb3J0IHR5cGUgeyAkY29udGV4dCwgTWlsa2lvSW5pdCwgTWlsa2lvUnVudGltZUluaXQgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcclxuaW1wb3J0IHsgc2VuZENvb2tib29rRXZlbnQgfSBmcm9tIFwiLi4vdXRpbHMvc2VuZC1jb29rYm9vay1ldmVudC50c1wiO1xyXG5cclxuZXhwb3J0IHR5cGUgTG9nID0gW1wiKGRlYnVnKVwiIHwgXCIoaW5mbylcIiB8IFwiKHdhcm4pXCIgfCBcIihlcnJvcilcIiB8IFwiKHJlcXVlc3QpXCIgfCBcIihyZXNwb25zZSlcIiwgc3RyaW5nIC8qIGV4ZWN1dGVJZCAqLywgc3RyaW5nLCBzdHJpbmcsIHN0cmluZywgLi4uQXJyYXk8dW5rbm93bj5dO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBMb2dnZXIge1xyXG4gICAgXzoge1xyXG4gICAgICAgIGxvZ3M6IEFycmF5PExvZz47XHJcbiAgICAgICAgdGFnczogTWFwPHN0cmluZywgdW5rbm93bj47XHJcbiAgICAgICAgc3VibWl0OiAoY29udGV4dDogJGNvbnRleHQpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xyXG4gICAgfTtcclxuICAgIHNldFRhZzogKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikgPT4gdm9pZDtcclxuICAgIHNldExvZzogKC4uLmxvZzogTG9nKSA9PiB2b2lkO1xyXG4gICAgZGVidWc6IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBMb2c7XHJcbiAgICBpbmZvOiAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gTG9nO1xyXG4gICAgd2FybjogKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IExvZztcclxuICAgIGVycm9yOiAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gTG9nO1xyXG4gICAgcmVxdWVzdDogKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IExvZztcclxuICAgIHJlc3BvbnNlOiAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gTG9nO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBMb2dnZXJJbnNlcnRpbmdIYW5kbGVyID0gKGxvZzogTG9nKSA9PiBib29sZWFuO1xyXG5cclxuZXhwb3J0IHR5cGUgTG9nZ2VyU3VibWl0dGluZ0hhbmRsZXIgPSAoY29udGV4dDogJGNvbnRleHQsIGxvZ3M6IEFycmF5PExvZz4sIHRhZ3M6IE1hcDxzdHJpbmcsIHVua25vd24+KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMb2dnZXI8TWlsa2lvUnVudGltZSBleHRlbmRzIE1pbGtpb1J1bnRpbWVJbml0PE1pbGtpb1J1bnRpbWVJbml0PE1pbGtpb0luaXQ+PiA9IE1pbGtpb1J1bnRpbWVJbml0PE1pbGtpb0luaXQ+PihydW50aW1lOiBNaWxraW9SdW50aW1lLCBwYXRoOiBzdHJpbmcsIGV4ZWN1dGVJZDogc3RyaW5nKTogTG9nZ2VyIHtcclxuICAgIGNvbnN0IGxvZ2dlciA9IHt9IGFzIExvZ2dlcjtcclxuXHJcbiAgICBsb2dnZXIuXyA9IHtcclxuICAgICAgICBsb2dzOiBbXSxcclxuICAgICAgICB0YWdzOiBuZXcgTWFwKCksXHJcbiAgICAgICAgc3VibWl0OiAoY29udGV4dDogJGNvbnRleHQpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFydW50aW1lLm9uTG9nZ2VyU3VibWl0dGluZykgcmV0dXJuO1xyXG4gICAgICAgICAgICByZXR1cm4gcnVudGltZS5vbkxvZ2dlclN1Ym1pdHRpbmcoY29udGV4dCwgbG9nZ2VyLl8ubG9ncywgbG9nZ2VyLl8udGFncyk7XHJcbiAgICAgICAgfSxcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgX190YWdQdXNoID0gKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQgPT4ge1xyXG4gICAgICAgIGxvZ2dlci5fLnRhZ3Muc2V0KGtleSwgdmFsdWUpO1xyXG4gICAgfTtcclxuICAgIGNvbnN0IF9fbG9nUHVzaCA9IChsb2c6IExvZyk6IExvZyA9PiB7XHJcbiAgICAgICAgY29uc3QgaW5zZXJ0aW5nID0gcnVudGltZS5vbkxvZ2dlckluc2VydGluZ1xyXG4gICAgICAgICAgICA/IHJ1bnRpbWUub25Mb2dnZXJJbnNlcnRpbmdcclxuICAgICAgICAgICAgOiAobG9nOiBMb2cpID0+IHtcclxuICAgICAgICAgICAgICAgIGxvZyA9IFsuLi5sb2ddO1xyXG4gICAgICAgICAgICAgICAgbG9nWzBdID0gYFxcbiR7bG9nWzBdfWAgYXMgYW55O1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coLi4ubG9nKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAoIWluc2VydGluZyhsb2cpKSByZXR1cm4gbG9nO1xyXG5cclxuICAgICAgICBsb2dnZXIuXy5sb2dzLnB1c2goWy4uLmxvZ10pO1xyXG5cclxuICAgICAgICBpZiAocnVudGltZS5kZXZlbG9wKSB7XHJcbiAgICAgICAgICAgIHZvaWQgc2VuZENvb2tib29rRXZlbnQocnVudGltZSwge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogXCJtaWxraW9AbG9nZ2VyXCIsXHJcbiAgICAgICAgICAgICAgICBsb2csXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGxvZztcclxuICAgIH07XHJcblxyXG4gICAgbG9nZ2VyLnNldFRhZyA9IChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pID0+IF9fdGFnUHVzaChrZXksIHZhbHVlKTtcclxuICAgIGxvZ2dlci5zZXRMb2cgPSAoLi4ubG9nOiBMb2cpID0+IF9fbG9nUHVzaChsb2cpO1xyXG5cclxuICAgIGNvbnN0IGdldE5vdyA9ICgpID0+IGAke2Zvcm1hdChuZXcgRGF0ZSgpLCBcIih5eXl5LU1NLWRkIGhoOm1tOnNzKVwiKX1gO1xyXG5cclxuICAgIGxvZ2dlci5kZWJ1ZyA9IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBfX2xvZ1B1c2goW1wiKGRlYnVnKVwiLCBwYXRoLCBleGVjdXRlSWQsIGdldE5vdygpLCBgXFxuJHtkZXNjcmlwdGlvbn1gLCAuLi5wYXJhbXNdKTtcclxuICAgIGxvZ2dlci5pbmZvID0gKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IF9fbG9nUHVzaChbXCIoaW5mbylcIiwgcGF0aCwgZXhlY3V0ZUlkLCBnZXROb3coKSwgYFxcbiR7ZGVzY3JpcHRpb259YCwgLi4ucGFyYW1zXSk7XHJcbiAgICBsb2dnZXIud2FybiA9IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBfX2xvZ1B1c2goW1wiKHdhcm4pXCIsIHBhdGgsIGV4ZWN1dGVJZCwgZ2V0Tm93KCksIGBcXG4ke2Rlc2NyaXB0aW9ufWAsIC4uLnBhcmFtc10pO1xyXG4gICAgbG9nZ2VyLmVycm9yID0gKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IF9fbG9nUHVzaChbXCIoZXJyb3IpXCIsIHBhdGgsIGV4ZWN1dGVJZCwgZ2V0Tm93KCksIGBcXG4ke2Rlc2NyaXB0aW9ufWAsIC4uLnBhcmFtc10pO1xyXG4gICAgbG9nZ2VyLnJlcXVlc3QgPSAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gX19sb2dQdXNoKFtcIihyZXF1ZXN0KVwiLCBwYXRoLCBleGVjdXRlSWQsIGdldE5vdygpLCBgXFxuJHtkZXNjcmlwdGlvbn1gLCAuLi5wYXJhbXNdKTtcclxuICAgIGxvZ2dlci5yZXNwb25zZSA9IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBfX2xvZ1B1c2goW1wiKHJlc3BvbnNlKVwiLCBwYXRoLCBleGVjdXRlSWQsIGdldE5vdygpLCBgXFxuJHtkZXNjcmlwdGlvbn1gLCAuLi5wYXJhbXNdKTtcclxuXHJcbiAgICByZXR1cm4gbG9nZ2VyO1xyXG59XHJcbiIsCiAgICAiZXhwb3J0IGludGVyZmFjZSBTdGVwczxTdGFnZVQgZXh0ZW5kcyBSZWNvcmQ8YW55LCBhbnk+PiB7XHJcbiAgc3RlcDogU3RlcEZ1bmN0aW9uPFN0YWdlVD47XHJcbiAgcnVuOiAoKSA9PiBQcm9taXNlPFJlbW92ZV88U3RhZ2VUPj47XHJcbn1cclxuXHJcbnR5cGUgUmVtb3ZlXzxUPiA9IHtcclxuICBbSyBpbiBrZXlvZiBUIGFzIEsgZXh0ZW5kcyBgXyR7c3RyaW5nfWAgPyBuZXZlciA6IEtdOiBUW0tdO1xyXG59O1xyXG5cclxudHlwZSBUb0VtcHR5T2JqZWN0PFQ+ID0gVCBleHRlbmRzIHVuZGVmaW5lZCB8IG51bGwgfCBuZXZlciA/IHt9IDogVCBleHRlbmRzIG9iamVjdCA/IFQgOiB7fTtcclxuXHJcbmV4cG9ydCB0eXBlIFN0ZXBGdW5jdGlvbjxTdGFnZVQgZXh0ZW5kcyBSZWNvcmQ8YW55LCBhbnk+PiA9IDxIYW5kbGVyVCBleHRlbmRzIChzdGFnZTogUmVhZG9ubHk8U3RhZ2VUPikgPT4gUmVjb3JkPGFueSwgYW55PiB8IFByb21pc2U8UmVjb3JkPGFueSwgYW55Pj4+KGhhbmRsZXI6IEhhbmRsZXJUKSA9PiBTdGVwczxBd2FpdGVkPFN0YWdlVD4gJiBUb0VtcHR5T2JqZWN0PEF3YWl0ZWQ8UmV0dXJuVHlwZTxIYW5kbGVyVD4+Pj47XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3RlcCgpOiBTdGVwczx7fT4ge1xyXG4gIGNvbnN0IHN0ZXBDb250cm9sbGVyID0ge1xyXG4gICAgJG1pbGtpb1R5cGU6IFwic3RlcFwiLFxyXG4gICAgX3N0ZXBzOiBbXSBhcyBBcnJheTwoc3RhZ2U6IGFueSkgPT4gUHJvbWlzZTxhbnk+PixcclxuICAgIHN0ZXAoaGFuZGxlcjogKHN0YWdlOiBhbnkpID0+IFByb21pc2U8YW55Pikge1xyXG4gICAgICBzdGVwQ29udHJvbGxlci5fc3RlcHMucHVzaChoYW5kbGVyKTtcclxuICAgICAgcmV0dXJuIHN0ZXBDb250cm9sbGVyO1xyXG4gICAgfSxcclxuICAgIGFzeW5jIHJ1bigpIHtcclxuICAgICAgbGV0IHN0YWdlID0ge307XHJcbiAgICAgIGZvciAoY29uc3Qgc3RlcCBvZiBzdGVwQ29udHJvbGxlci5fc3RlcHMpIHtcclxuICAgICAgICBzdGFnZSA9IHsgLi4uc3RhZ2UsIC4uLihhd2FpdCBzdGVwKHN0YWdlKSkgfTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxhbnksIGFueT4gPSB7fTtcclxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gc3RhZ2UpIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IChzdGFnZSBhcyBhbnkpW2tleV07XHJcbiAgICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChcIl9cIikpIHJlc3VsdFtrZXldID0gdmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH0sXHJcbiAgfTtcclxuICByZXR1cm4gc3RlcENvbnRyb2xsZXIgYXMgYW55IGFzIFN0ZXBzPHt9PjtcclxufVxyXG4iLAogICAgImV4cG9ydCBjbGFzcyBUcmllPFQ+IHtcclxuICBwcml2YXRlIHJvb3Q6IFRyaWVOb2RlPFQ+O1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMucm9vdCA9IG5ldyBUcmllTm9kZSgpO1xyXG4gIH1cclxuXHJcbiAgYWRkKHBhdGg6IHN0cmluZywgdmFsdWU6IFQpOiB2b2lkIHtcclxuICAgIGNvbnN0IHBhcnRzID0gcGF0aFxyXG4gICAgICAucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIilcclxuICAgICAgLnNwbGl0KFwiL1wiKVxyXG4gICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBcIlwiKTtcclxuICAgIGxldCBjdXJyZW50Tm9kZSA9IHRoaXMucm9vdDtcclxuICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgY3VycmVudE5vZGUudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XHJcbiAgICAgIGlmICghY3VycmVudE5vZGUuY2hpbGRyZW4uaGFzKHBhcnQpKSB7XHJcbiAgICAgICAgY3VycmVudE5vZGUuY2hpbGRyZW4uc2V0KHBhcnQsIG5ldyBUcmllTm9kZSgpKTtcclxuICAgICAgfVxyXG4gICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmNoaWxkcmVuLmdldChwYXJ0KSE7XHJcbiAgICB9XHJcbiAgICBjdXJyZW50Tm9kZS52YWx1ZSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0KHBhdGg6IHN0cmluZyk6IFQgfCBudWxsIHtcclxuICAgIGNvbnN0IHBhcnRzID0gcGF0aFxyXG4gICAgICAucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIilcclxuICAgICAgLnNwbGl0KFwiL1wiKVxyXG4gICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBcIlwiKTtcclxuICAgIGxldCBjdXJyZW50Tm9kZSA9IHRoaXMucm9vdDtcclxuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xyXG4gICAgICBpZiAoIWN1cnJlbnROb2RlLmNoaWxkcmVuLmhhcyhwYXJ0KSkgcmV0dXJuIG51bGw7XHJcbiAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuY2hpbGRyZW4uZ2V0KHBhcnQpITtcclxuICAgIH1cclxuICAgIHJldHVybiBjdXJyZW50Tm9kZS52YWx1ZTtcclxuICB9XHJcblxyXG4gIGhhcyhwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHBhcnRzID0gcGF0aFxyXG4gICAgICAucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIilcclxuICAgICAgLnNwbGl0KFwiL1wiKVxyXG4gICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBcIlwiKTtcclxuICAgIGxldCBjdXJyZW50Tm9kZSA9IHRoaXMucm9vdDtcclxuICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHJldHVybiBjdXJyZW50Tm9kZS52YWx1ZSAhPT0gbnVsbDtcclxuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xyXG4gICAgICBpZiAoIWN1cnJlbnROb2RlLmNoaWxkcmVuLmhhcyhwYXJ0KSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBlbHNlIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuY2hpbGRyZW4uZ2V0KHBhcnQpITtcclxuICAgIH1cclxuICAgIHJldHVybiBjdXJyZW50Tm9kZS52YWx1ZSAhPT0gbnVsbDtcclxuICB9XHJcbn1cclxuXHJcbmNsYXNzIFRyaWVOb2RlPFQ+IHtcclxuICBjaGlsZHJlbjogTWFwPHN0cmluZywgVHJpZU5vZGU8VD4+O1xyXG4gIHZhbHVlOiBUIHwgbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLmNoaWxkcmVuID0gbmV3IE1hcCgpO1xyXG4gICAgdGhpcy52YWx1ZSA9IG51bGw7XHJcbiAgfVxyXG59XHJcbiIsCiAgICAiaW1wb3J0IHsgY3JlYXRlTG9nZ2VyLCBleGNlcHRpb25IYW5kbGVyLCByZWplY3QgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcclxuaW1wb3J0IHR5cGUgeyBNaXhpbiwgR2VuZXJhdGVkSW5pdCwgJHR5cGVzLCBDb250ZXh0SHR0cCwgTWlsa2lvUmVzcG9uc2VSZWplY3QsIFJlc3VsdHMsIE1pbGtpb1Jlc3BvbnNlU3VjY2VzcyB9IGZyb20gXCIuLi9pbmRleC50c1wiO1xyXG5pbXBvcnQgdHlwZSB7IF9faW5pdEV4ZWN1dGVyIH0gZnJvbSBcIi4uL2V4ZWN1dGUvaW5kZXgudHNcIjtcclxuaW1wb3J0IHsgX19jcmVhdGVJZCB9IGZyb20gXCIuLi91dGlscy9jcmVhdGUtaWQudHNcIjtcclxuaW1wb3J0IHsgVHJpZSB9IGZyb20gXCIuLi91dGlscy90cmllLnRzXCI7XHJcblxyXG5leHBvcnQgdHlwZSBNaWxraW9IdHRwUmVxdWVzdCA9IFJlcXVlc3Q7XHJcblxyXG5leHBvcnQgdHlwZSBNaWxraW9IdHRwUmVzcG9uc2UgPSBNaXhpbjxcclxuICAgIFJlc3BvbnNlSW5pdCxcclxuICAgIHtcclxuICAgICAgICAvLyBib2R5OiBzdHJpbmcgfCBCbG9iIHwgRm9ybURhdGEgfCBVUkxTZWFyY2hQYXJhbXMgfCBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PjtcclxuICAgICAgICBib2R5OiBhbnk7XHJcbiAgICAgICAgc3RhdHVzOiBudW1iZXI7XHJcbiAgICAgICAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcclxuICAgIH1cclxuPjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2luaXRMaXN0ZW5lcihnZW5lcmF0ZWQ6IEdlbmVyYXRlZEluaXQsIHJ1bnRpbWU6IGFueSwgZXhlY3V0ZXI6IFJldHVyblR5cGU8dHlwZW9mIF9faW5pdEV4ZWN1dGVyPikge1xyXG4gICAgY29uc3QgcG9ydCA9IHJ1bnRpbWUucG9ydDtcclxuICAgIGNvbnN0IHRyaWUgPSBuZXcgVHJpZTxhbnk+KCk7XHJcbiAgICBjb25zdCBmZXRjaCA9IGFzeW5jIChvcHRpb25zOiB7XHJcbiAgICAgICAgcmVxdWVzdDogTWlsa2lvSHR0cFJlcXVlc3Q7XHJcbiAgICAgICAgZW52TW9kZT86IHN0cmluZztcclxuICAgICAgICBlbnY/OiBSZWNvcmQ8YW55LCBhbnk+O1xyXG4gICAgICAgIHJvdXRlU2NoZW1hPzogYW55O1xyXG4gICAgfSk6IFByb21pc2U8UmVzcG9uc2U+ID0+IHtcclxuICAgICAgICBpZiAob3B0aW9ucy5yZXF1ZXN0Lm1ldGhvZCA9PT0gXCJPUFRJT05TXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSh1bmRlZmluZWQsIHtcclxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgICAgICBcIkFjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHNcIjogcnVudGltZS5jb3JzPy5jb3JzQWxsb3dNZXRob2RzID8/IFwiKlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luXCI6IHJ1bnRpbWUuY29ycz8uY29yc0FsbG93T3JpZ2luID8/IFwiKlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVyc1wiOiBydW50aW1lLmNvcnM/LmNvcnNBbGxvd0hlYWRlcnMgPz8gXCIqXCIsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25zLnJlcXVlc3QudXJsLmVuZHNXaXRoKFwiL2dlbmVyYXRlXzIwNFwiKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKG51bGwsIHtcclxuICAgICAgICAgICAgICAgIHN0YXR1czogMjA0LFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgICAgIFNlcnZlcjogXCJtaWxraW9cIixcclxuICAgICAgICAgICAgICAgICAgICBcIkFjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHNcIjogcnVudGltZS5jb3JzPy5jb3JzQWxsb3dNZXRob2RzID8/IFwiKlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luXCI6IHJ1bnRpbWUuY29ycz8uY29yc0FsbG93T3JpZ2luID8/IFwiKlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVyc1wiOiBydW50aW1lLmNvcnM/LmNvcnNBbGxvd0hlYWRlcnMgPz8gXCIqXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJDYWNoZS1Db250cm9sXCI6IFwibm8tc3RvcmVcIixcclxuICAgICAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBgdGV4dC9wbGFpbjsgdGltZT0ke0RhdGUubm93KCl9YCxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChvcHRpb25zLnJlcXVlc3QudXJsKTtcclxuICAgICAgICBsZXQgcGF0aEFycmF5ID0gdXJsLnBhdGhuYW1lLnN1YnN0cmluZygxKS5zcGxpdChcIi9cIik7XHJcbiAgICAgICAgaWYgKHJ1bnRpbWUuYWNjZXNzS2V5ICYmIHBhdGhBcnJheS5hdCgwKSAhPT0gcnVudGltZS5hY2Nlc3NLZXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSh1bmRlZmluZWQsIHtcclxuICAgICAgICAgICAgICAgIHN0YXR1czogNDAzLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgICAgIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kc1wiOiBydW50aW1lLmNvcnM/LmNvcnNBbGxvd01ldGhvZHMgPz8gXCIqXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW5cIjogcnVudGltZS5jb3JzPy5jb3JzQWxsb3dPcmlnaW4gPz8gXCIqXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzXCI6IHJ1bnRpbWUuY29ycz8uY29yc0FsbG93SGVhZGVycyA/PyBcIipcIixcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocnVudGltZS5pZ25vcmVQYXRoTGV2ZWwgIT09IHVuZGVmaW5lZCAmJiBydW50aW1lLmlnbm9yZVBhdGhMZXZlbCAhPT0gMCkgcGF0aEFycmF5ID0gcGF0aEFycmF5LnNsaWNlKHJ1bnRpbWUuaWdub3JlUGF0aExldmVsKTtcclxuICAgICAgICBjb25zdCBwYXRoU3RyaW5nID0gYC8ke3BhdGhBcnJheS5qb2luKFwiL1wiKX1gO1xyXG5cclxuICAgICAgICBjb25zdCBleGVjdXRlSWQgPSBydW50aW1lPy5leGVjdXRlSWQgPyBhd2FpdCBydW50aW1lLmV4ZWN1dGVJZChvcHRpb25zLnJlcXVlc3QuaGVhZGVycykgOiBfX2NyZWF0ZUlkKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcihydW50aW1lLCBwYXRoU3RyaW5nLCBleGVjdXRlSWQpO1xyXG4gICAgICAgIHJ1bnRpbWUucnVudGltZS5yZXF1ZXN0LnNldChleGVjdXRlSWQsIHsgbG9nZ2VyIH0pO1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlOiBNaWxraW9IdHRwUmVzcG9uc2UgPSB7XHJcbiAgICAgICAgICAgIGJvZHk6IFwiXCIsXHJcbiAgICAgICAgICAgIHN0YXR1czogMjAwLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICAgICBcIkFjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHNcIjogcnVudGltZS5jb3JzPy5jb3JzQWxsb3dNZXRob2RzID8/IFwiKlwiLFxyXG4gICAgICAgICAgICAgICAgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW5cIjogcnVudGltZS5jb3JzPy5jb3JzQWxsb3dPcmlnaW4gPz8gXCIqXCIsXHJcbiAgICAgICAgICAgICAgICBcIkFjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnNcIjogcnVudGltZS5jb3JzPy5jb3JzQWxsb3dIZWFkZXJzID8/IFwiKlwiLFxyXG4gICAgICAgICAgICAgICAgXCJDYWNoZS1Db250cm9sXCI6IFwibm8tc3RvcmVcIixcclxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGxldCBmaW5hbGVzOiBBcnJheTwoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPj4gPSBbXTtcclxuXHJcblxyXG4gICAgICAgIGNvbnN0IGh0dHAgPSAoYXdhaXQgKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaXAgPSBydW50aW1lLnJlYWxJcCA/IHJ1bnRpbWUucmVhbElwKG9wdGlvbnMucmVxdWVzdC5oZWFkZXJzKSA6IFwiOjoxXCI7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgICAgICAgICAgIHN0cmluZzogYXdhaXQgb3B0aW9ucy5yZXF1ZXN0LnRleHQoKSxcclxuICAgICAgICAgICAgICAgIHBhcnNlZDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHVybCxcclxuICAgICAgICAgICAgICAgIGlwLFxyXG4gICAgICAgICAgICAgICAgcGF0aDogeyBzdHJpbmc6IHBhdGhTdHJpbmcgYXMga2V5b2YgJHR5cGVzW1wiZ2VuZXJhdGVkXCJdW1wicm91dGVTY2hlbWFcIl0sIGFycmF5OiBwYXRoQXJyYXkgfSxcclxuICAgICAgICAgICAgICAgIHBhcmFtcyxcclxuICAgICAgICAgICAgICAgIHJlcXVlc3Q6IG9wdGlvbnMucmVxdWVzdCxcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLFxyXG4gICAgICAgICAgICB9IGFzIENvbnRleHRIdHRwO1xyXG4gICAgICAgIH0pKCkpITtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGV4dDogYW55ID0geyByZWplY3QgfTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86aHR0cFJlcXVlc3RcIiwgeyBleGVjdXRlSWQsIGxvZ2dlciwgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIGh0dHAsIHJlamVjdCB9KTtcclxuXHJcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMuZ2V0KFwiQWNjZXB0XCIpPy5zdGFydHNXaXRoKFwidGV4dC9ldmVudC1zdHJlYW1cIikpIHtcclxuICAgICAgICAgICAgICAgIC8vIGFjdGlvblxyXG4gICAgICAgICAgICAgICAgbGV0IHJvdXRlU2NoZW1hID0gb3B0aW9ucy5yb3V0ZVNjaGVtYTtcclxuICAgICAgICAgICAgICAgIGlmICghcm91dGVTY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgICAgICByb3V0ZVNjaGVtYSA9IHRyaWUuZ2V0KGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVTY2hlbWEgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVTY2hlbWEgPSBnZW5lcmF0ZWQucm91dGVTY2hlbWE/LltodHRwLnBhdGguc3RyaW5nXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlU2NoZW1hID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpodHRwTm90Rm91bmRcIiwgeyBleGVjdXRlSWQsIGxvZ2dlciwgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIGh0dHAsIHJlamVjdCB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHJlamVjdChcIk5PVF9GT1VORFwiLCB7IHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygcm91dGVTY2hlbWEubW9kdWxlICE9PSBcImZ1bmN0aW9uXCIpIHJvdXRlU2NoZW1hLm1vZHVsZSA9IGF3YWl0IHJvdXRlU2NoZW1hLm1vZHVsZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSByb3V0ZVNjaGVtYS5tb2R1bGUgPSBhd2FpdCByb3V0ZVNjaGVtYS5tb2R1bGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZS5hZGQoaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIHJvdXRlU2NoZW1hKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYS50eXBlICE9PSBcImFjdGlvblwiKSB0aHJvdyByZWplY3QoXCJVTkFDQ0VQVEFCTEVcIiwgeyBleHBlY3RlZDogXCJzdHJlYW1cIiwgbWVzc2FnZTogYE5vdCBhY2NlcHRhYmxlLCB0aGUgQWNjZXB0IGluIHRoZSByZXF1ZXN0IGhlYWRlciBzaG91bGQgYmUgXCJ0ZXh0L2V2ZW50LXN0cmVhbVwiLiBJZiB5b3UgYXJlIHVzaW5nIHRoZSBcIkBtaWxraW8vc3RhcmdhdGVcIiBwYWNrYWdlLCBwbGVhc2UgYWRkIFxcYHR5cGU6IFwic3RyZWFtXCJcXGAgdG8gdGhlIGV4ZWN1dGUgb3B0aW9ucy5gIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnRleHQuaHR0cCA9IGh0dHA7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmhlYWRlcnMgPSBodHRwLnJlcXVlc3QuaGVhZGVycztcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBleGVjdXRlZCA9IGF3YWl0IGV4ZWN1dGVyLl9fZXhlY3V0ZShyb3V0ZVNjaGVtYSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRFeGVjdXRlSWQ6IGV4ZWN1dGVJZCxcclxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkTG9nZ2VyOiBsb2dnZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogb3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMgYXMgSGVhZGVycyxcclxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtczogaHR0cC5wYXJhbXMuc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtc1R5cGU6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGZpbmFsZXMgPSBleGVjdXRlZC5maW5hbGVzO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5ib2R5ID09PSBcIlwiICYmIGV4ZWN1dGVkLnJlc3VsdHMudmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChleGVjdXRlZC5lbXB0eVJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5ib2R5ID0gYHtcImRhdGFcIjp7fSxcImV4ZWN1dGVJZFwiOlwiJHtleGVjdXRlSWR9XCIsXCJzdWNjZXNzXCI6dHJ1ZX1gO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhlY3V0ZWQucmVzdWx0c1R5cGVTYWZldHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuYm9keSA9IGB7XCJkYXRhXCI6JHtyb3V0ZVNjaGVtYS5yZXN1bHRzVG9KU09OKGV4ZWN1dGVkLnJlc3VsdHMudmFsdWUpfSxcImV4ZWN1dGVJZFwiOlwiJHtleGVjdXRlSWR9XCIsXCJzdWNjZXNzXCI6dHJ1ZX1gO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmJvZHkgPSBge1wiZGF0YVwiOiR7SlNPTi5zdHJpbmdpZnkoZXhlY3V0ZWQucmVzdWx0cy52YWx1ZSl9LFwiZXhlY3V0ZUlkXCI6XCIke2V4ZWN1dGVJZH1cIixcInN1Y2Nlc3NcIjp0cnVlfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpodHRwUmVzcG9uc2VcIiwgeyBleGVjdXRlSWQsIGxvZ2dlciwgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIGh0dHAsIGhlYWRlcnM6IGh0dHAucmVxdWVzdC5oZWFkZXJzLCBjb250ZXh0OiBleGVjdXRlZC5jb250ZXh0LCBzdWNjZXNzOiB0cnVlLCByZWplY3QgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGZpbmFsZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiQW4gZXJyb3Igb2NjdXJyZWQgaW5zaWRlIG9uRmluYWxseS5cIiwgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBydW50aW1lLnJ1bnRpbWUucmVxdWVzdC5kZWxldGUoZXhlY3V0ZUlkKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UocmVzcG9uc2UuYm9keSwgcmVzcG9uc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gc3RyZWFtXHJcbiAgICAgICAgICAgICAgICBsZXQgcm91dGVTY2hlbWEgPSBvcHRpb25zLnJvdXRlU2NoZW1hO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFyb3V0ZVNjaGVtYSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvdXRlU2NoZW1hID0gdHJpZS5nZXQoaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3V0ZVNjaGVtYSA9IGdlbmVyYXRlZC5yb3V0ZVNjaGVtYT8uW2h0dHAucGF0aC5zdHJpbmddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVTY2hlbWEgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcnVudGltZS5lbWl0KFwibWlsa2lvOmh0dHBOb3RGb3VuZFwiLCB7IGV4ZWN1dGVJZCwgbG9nZ2VyLCBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZywgaHR0cCwgcmVqZWN0IH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVqZWN0KFwiTk9UX0ZPVU5EXCIsIHsgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByb3V0ZVNjaGVtYS5tb2R1bGUgIT09IFwiZnVuY3Rpb25cIikgcm91dGVTY2hlbWEubW9kdWxlID0gYXdhaXQgcm91dGVTY2hlbWEubW9kdWxlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHJvdXRlU2NoZW1hLm1vZHVsZSA9IGF3YWl0IHJvdXRlU2NoZW1hLm1vZHVsZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmllLmFkZChodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZywgcm91dGVTY2hlbWEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVTY2hlbWEudHlwZSAhPT0gXCJzdHJlYW1cIikgdGhyb3cgcmVqZWN0KFwiVU5BQ0NFUFRBQkxFXCIsIHsgZXhwZWN0ZWQ6IFwic3RyZWFtXCIsIG1lc3NhZ2U6IGBOb3QgYWNjZXB0YWJsZSwgdGhlIEFjY2VwdCBpbiB0aGUgcmVxdWVzdCBoZWFkZXIgc2hvdWxkIGJlIFwiYXBwbGljYXRpb24vanNvblwiLiBJZiB5b3UgYXJlIHVzaW5nIHRoZSBcIkBtaWxraW8vc3RhcmdhdGVcIiBwYWNrYWdlLCBwbGVhc2UgcmVtb3ZlIFxcYHR5cGU6IFwic3RyZWFtXCJcXGAgdG8gdGhlIGV4ZWN1dGUgb3B0aW9ucy5gIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZUNsb3NlID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJ1bnRpbWUucnVudGltZS5yZXF1ZXN0LmRlbGV0ZShleGVjdXRlSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBmaW5hbGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJBbiBlcnJvciBvY2N1cnJlZCBpbnNpZGUgb25GaW5hbGx5LlwiLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnRleHQuaHR0cCA9IGh0dHA7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmhlYWRlcnMgPSBodHRwLnJlcXVlc3QuaGVhZGVycztcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBleGVjdXRlZCA9IGF3YWl0IGV4ZWN1dGVyLl9fZXhlY3V0ZShyb3V0ZVNjaGVtYSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRFeGVjdXRlSWQ6IGV4ZWN1dGVJZCxcclxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkTG9nZ2VyOiBsb2dnZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogb3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMgYXMgSGVhZGVycyxcclxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtczogaHR0cC5wYXJhbXMuc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtc1R5cGU6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGZpbmFsZXMgPSBleGVjdXRlZC5maW5hbGVzO1xyXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZTogYnVuXHJcbiAgICAgICAgICAgICAgICBsZXQgc3RyZWFtOiBSZWFkYWJsZVN0cmVhbTtcclxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmU6IGJ1blxyXG4gICAgICAgICAgICAgICAgbGV0IGNvbnRyb2w6IFJlYWRhYmxlU3RyZWFtRGlyZWN0Q29udHJvbGxlciB8IFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXI7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZTogYnVuXHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIEJ1biAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmU6IGJ1blxyXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBSZWFkYWJsZVN0cmVhbSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZGlyZWN0XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmU6IGJ1blxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3luYyBwdWxsKGNvbnRyb2xsZXI6IFJlYWRhYmxlU3RyZWFtRGlyZWN0Q29udHJvbGxlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGNvbnRyb2xsZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIud3JpdGUoYGRhdGE6QCR7SlNPTi5zdHJpbmdpZnkoeyBzdWNjZXNzOiB0cnVlLCBkYXRhOiB1bmRlZmluZWQsIGV4ZWN1dGVJZCB9IHNhdGlzZmllcyBNaWxraW9SZXNwb25zZVN1Y2Nlc3M8YW55Pil9XFxuXFxuYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCB2YWx1ZSBvZiBleGVjdXRlZC5yZXN1bHRzLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5yZXF1ZXN0LnNpZ25hbC5hYm9ydGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KFtudWxsLCB2YWx1ZV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci53cml0ZShgZGF0YToke3Jlc3VsdH1cXG5cXG5gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVkLnJlc3VsdHMudmFsdWUucmV0dXJuKHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGNlcHRpb24gPSBleGNlcHRpb25IYW5kbGVyKGV4ZWN1dGVJZCwgbG9nZ2VyLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbZXhjZXB0aW9uLmNvZGVdID0gZXhjZXB0aW9uLnJlamVjdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLndyaXRlKGBkYXRhOiR7SlNPTi5zdHJpbmdpZnkoW3Jlc3VsdCwgbnVsbF0pfVxcblxcbmApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMgY2FuY2VsKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB9IGFzIGFueSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vZGUuanMgb3Igb3RoZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZTogYnVuXHJcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gbmV3IFJlYWRhYmxlU3RyZWFtKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZTogYnVuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jIHB1bGwoY29udHJvbGxlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGNvbnRyb2xsZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShgZGF0YTpAJHtKU09OLnN0cmluZ2lmeSh7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IHVuZGVmaW5lZCwgZXhlY3V0ZUlkIH0gc2F0aXNmaWVzIE1pbGtpb1Jlc3BvbnNlU3VjY2Vzczxhbnk+KX1cXG5cXG5gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHZhbHVlIG9mIGV4ZWN1dGVkLnJlc3VsdHMudmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLnJlcXVlc3Quc2lnbmFsLmFib3J0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoW251bGwsIHZhbHVlXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoYGRhdGE6JHtyZXN1bHR9XFxuXFxuYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlZC5yZXN1bHRzLnZhbHVlLnJldHVybih1bmRlZmluZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhjZXB0aW9uID0gZXhjZXB0aW9uSGFuZGxlcihleGVjdXRlSWQsIGxvZ2dlciwgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2V4Y2VwdGlvbi5jb2RlXSA9IGV4Y2VwdGlvbi5yZWplY3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGBkYXRhOiR7SlNPTi5zdHJpbmdpZnkoW3Jlc3VsdCwgbnVsbF0pfVxcblxcbmApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDApKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMgY2FuY2VsKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB9IGFzIGFueSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UuYm9keSA9IHN0cmVhbTtcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcInRleHQvZXZlbnQtc3RyZWFtXCI7XHJcbiAgICAgICAgICAgICAgICByZXNwb25zZS5oZWFkZXJzW1wiQ2FjaGUtQ29udHJvbFwiXSA9IFwibm8tY2FjaGVcIjtcclxuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86aHR0cFJlc3BvbnNlXCIsIHsgZXhlY3V0ZUlkLCBsb2dnZXIsIHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLCBodHRwLCBoZWFkZXJzOiBodHRwLnJlcXVlc3QuaGVhZGVycywgY29udGV4dDogZXhlY3V0ZWQuY29udGV4dCwgc3VjY2VzczogdHJ1ZSwgcmVqZWN0IH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UocmVzcG9uc2UuYm9keSwgcmVzcG9uc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0czogUmVzdWx0czxNaWxraW9SZXNwb25zZVJlamVjdD4gPSB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogZXhjZXB0aW9uSGFuZGxlcihleGVjdXRlSWQsIGxvZ2dlciwgZXJyb3IpLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0cy52YWx1ZSAhPT0gdW5kZWZpbmVkKSByZXNwb25zZS5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocmVzdWx0cy52YWx1ZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpodHRwUmVzcG9uc2VcIiwgeyBleGVjdXRlSWQsIGxvZ2dlciwgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIGh0dHAsIGhlYWRlcnM6IGh0dHAucmVxdWVzdC5oZWFkZXJzLCBjb250ZXh0LCBzdWNjZXNzOiBmYWxzZSwgcmVqZWN0IH0pO1xyXG4gICAgICAgICAgICBydW50aW1lLnJ1bnRpbWUucmVxdWVzdC5kZWxldGUoZXhlY3V0ZUlkKTtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShyZXNwb25zZS5ib2R5LCByZXNwb25zZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBzdHJlYW1DbG9zZXJzOiBNYXA8c3RyaW5nLCB7IGdlbmVyYXRvcjogQXN5bmNHZW5lcmF0b3I7IGhhbmRsZUNsb3NlOiBhbnkgfT4gPSBuZXcgTWFwKCk7XHJcbiAgICBjb25zdCBoYW5kbGVNZXNzYWdlID0gYXN5bmMgKFxyXG4gICAgICAgIHBvcnQ6IHsgcG9zdE1lc3NhZ2UobWVzc2FnZTogYW55KTogdm9pZCB9LFxyXG4gICAgICAgIG9wdGlvbnM6XHJcbiAgICAgICAgICAgIHwge1xyXG4gICAgICAgICAgICAgICAgZXhlY3V0ZUlkOiBzdHJpbmc7XHJcbiAgICAgICAgICAgICAgICBwYXRoOiBzdHJpbmc7XHJcbiAgICAgICAgICAgICAgICBwYXJhbXM/OiBSZWNvcmQ8YW55LCBhbnk+O1xyXG4gICAgICAgICAgICAgICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfCBzdHJpbmcsXHJcbiAgICApID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMgPT09IFwiUElOR1wiKSB7XHJcbiAgICAgICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKFwiUE9OR1wiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5zdGFydHNXaXRoKFwiQ0xPU0VfU1RSRUFNOlwiKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0ZUlkID0gb3B0aW9ucy5zcGxpdChcIkNMT1NFX1NUUkVBTTpcIilbMV07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW1DbG9zZXIgPSBzdHJlYW1DbG9zZXJzLmdldChleGVjdXRlSWQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHN0cmVhbUNsb3Nlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbUNsb3Nlci5nZW5lcmF0b3IucmV0dXJuKHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtQ2xvc2VyLmhhbmRsZUNsb3NlKFwic3RyZWFtXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHJvdXRlU2NoZW1hID0gdHJpZS5nZXQob3B0aW9ucy5wYXRoKTtcclxuICAgICAgICBpZiAocm91dGVTY2hlbWEgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcm91dGVTY2hlbWEgPSBnZW5lcmF0ZWQucm91dGVTY2hlbWE/LltvcHRpb25zLnBhdGhdO1xyXG4gICAgICAgICAgICBpZiAocm91dGVTY2hlbWEgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgcmVqZWN0KFwiTk9UX0ZPVU5EXCIsIHsgcGF0aDogb3B0aW9ucy5wYXRoIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygcm91dGVTY2hlbWEubW9kdWxlICE9PSBcImZ1bmN0aW9uXCIpIHJvdXRlU2NoZW1hLm1vZHVsZSA9IGF3YWl0IHJvdXRlU2NoZW1hLm1vZHVsZTtcclxuICAgICAgICAgICAgZWxzZSByb3V0ZVNjaGVtYS5tb2R1bGUgPSBhd2FpdCByb3V0ZVNjaGVtYS5tb2R1bGUoKTtcclxuICAgICAgICAgICAgdHJpZS5hZGQob3B0aW9ucy5wYXRoLCByb3V0ZVNjaGVtYSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKTtcclxuICAgICAgICBjb25zdCBwYXJhbXMgPSBvcHRpb25zLnBhcmFtcyA/PyB7fTtcclxuICAgICAgICBjb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIocnVudGltZSwgb3B0aW9ucy5wYXRoLCBvcHRpb25zLmV4ZWN1dGVJZCk7XHJcbiAgICAgICAgbGV0IGZpbmFsZXM6IEFycmF5PCgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+PiA9IFtdO1xyXG5cclxuICAgICAgICBjb25zdCBodHRwID0gbmV3IFByb3h5KFxyXG4gICAgICAgICAgICB7fSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZ2V0OiAodGFyZ2V0LCBwcm9wZXJ0eSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PT0gXCJub3RGb3VuZFwiKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHNldDogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IHJlamVjdChcIlVOQUNDRVBUQUJMRVwiLCB7IGV4cGVjdGVkOiBcImNvbnRleHQuaHR0cFwiLCBtZXNzYWdlOiBcIlRoaXMgcmVxdWVzdCB3YXMgaW52b2tlZCB0aHJvdWdoIHRoZSBleGVjdXRlIG1ldGhvZC4gU2luY2Ugbm8gYWN0dWFsIHJlcXVlc3Qgd2FzIGdlbmVyYXRlZCwgdGhlIEhUVFAgbWV0aG9kcyB1bmRlciB0aGUgY29udGV4dCBjYW5ub3QgYmUgYWNjZXNzZWQuXCIgfSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGNvbnN0IGhhbmRsZUNsb3NlID0gYXN5bmMgKHR5cGU6IFwiYWN0aW9uXCIgfCBcInN0cmVhbVwiKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBcInN0cmVhbVwiKSBzdHJlYW1DbG9zZXJzLmRlbGV0ZShvcHRpb25zLmV4ZWN1dGVJZCk7XHJcbiAgICAgICAgICAgIHJ1bnRpbWUucnVudGltZS5yZXF1ZXN0LmRlbGV0ZShvcHRpb25zLmV4ZWN1dGVJZCk7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBmaW5hbGVzKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZXIoKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiQW4gZXJyb3Igb2NjdXJyZWQgaW5zaWRlIG9uRmluYWxseS5cIiwgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHsgaHR0cDogaHR0cCwgaGVhZGVycywgcmVqZWN0IH07XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYS50eXBlID09PSBcImFjdGlvblwiKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBleGVjdXRlZCA9IGF3YWl0IGV4ZWN1dGVyLl9fZXhlY3V0ZShyb3V0ZVNjaGVtYSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRFeGVjdXRlSWQ6IG9wdGlvbnMuZXhlY3V0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRMb2dnZXI6IGxvZ2dlcixcclxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBvcHRpb25zLnBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVycyxcclxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcyxcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXNUeXBlOiBcInJhd1wiLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBmaW5hbGVzID0gZXhlY3V0ZWQuZmluYWxlcztcclxuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDbG9zZShcImFjdGlvblwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZXhlY3V0ZWQuZW1wdHlSZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUlkOiBvcHRpb25zLmV4ZWN1dGVJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUlkOiBvcHRpb25zLmV4ZWN1dGVJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZXhlY3V0ZWQucmVzdWx0cy52YWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocm91dGVTY2hlbWEudHlwZSA9PT0gXCJzdHJlYW1cIikge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0ZWQgPSBhd2FpdCBleGVjdXRlci5fX2V4ZWN1dGUocm91dGVTY2hlbWEsIHtcclxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkRXhlY3V0ZUlkOiBvcHRpb25zLmV4ZWN1dGVJZCxcclxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkTG9nZ2VyOiBsb2dnZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogb3B0aW9ucy5wYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnMsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dCxcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMsXHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zVHlwZTogXCJyYXdcIixcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgZmluYWxlcyA9IGV4ZWN1dGVkLmZpbmFsZXM7XHJcblxyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogdW5kZWZpbmVkLCBleGVjdXRlSWQ6IG9wdGlvbnMuZXhlY3V0ZUlkLCBkb25lOiBmYWxzZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICBzdHJlYW1DbG9zZXJzLnNldChvcHRpb25zLmV4ZWN1dGVJZCwgeyBnZW5lcmF0b3I6IGV4ZWN1dGVkLnJlc3VsdHMudmFsdWUsIGhhbmRsZUNsb3NlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2YgZXhlY3V0ZWQucmVzdWx0cy52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBbbnVsbCwgdmFsdWVdLCBleGVjdXRlSWQ6IG9wdGlvbnMuZXhlY3V0ZUlkLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogdW5kZWZpbmVkLCBleGVjdXRlSWQ6IG9wdGlvbnMuZXhlY3V0ZUlkLCBkb25lOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBleGNlcHRpb24gPSBleGNlcHRpb25IYW5kbGVyKG9wdGlvbnMuZXhlY3V0ZUlkLCBsb2dnZXIsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtleGNlcHRpb24uY29kZV0gPSBleGNlcHRpb24ucmVqZWN0O1xyXG4gICAgICAgICAgICAgICAgICAgIHBvcnQucG9zdE1lc3NhZ2UoeyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBbcmVzdWx0LCBudWxsXSwgZXhlY3V0ZUlkOiBvcHRpb25zLmV4ZWN1dGVJZCwgZG9uZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNsb3NlKFwic3RyZWFtXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZXhjZXB0aW9uSGFuZGxlcihvcHRpb25zLmV4ZWN1dGVJZCwgbG9nZ2VyLCBlcnJvcik7XHJcbiAgICAgICAgICAgIHBvcnQucG9zdE1lc3NhZ2UoeyBzdWNjZXNzOiBmYWxzZSwgZGF0YTogdW5kZWZpbmVkLCBlcnJvcjogcmVzdWx0LCBleGVjdXRlSWQ6IG9wdGlvbnMuZXhlY3V0ZUlkLCBkb25lOiB0cnVlIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBwb3J0LFxyXG4gICAgICAgIGZldGNoLFxyXG4gICAgICAgIGhhbmRsZU1lc3NhZ2UsXHJcbiAgICB9O1xyXG59XHJcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBNaWxraW9SZXNwb25zZVJlamVjdCwgTG9nZ2VyIH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlICRyZWplY3RDb2RlIHtcclxuICAgIFJFUVVFU1RfRkFJTDogYW55O1xyXG4gICAgTk9UX0RFVkVMT1BfTU9ERTogc3RyaW5nO1xyXG4gICAgUkVRVUVTVF9USU1FT1VUOiB7IHRpbWVvdXQ6IG51bWJlcjsgbWVzc2FnZTogc3RyaW5nIH07XHJcbiAgICBOT1RfRk9VTkQ6IHsgcGF0aDogc3RyaW5nIH07XHJcbiAgICBQQVJBTVNfVFlQRV9JTkNPUlJFQ1Q6IHsgcGF0aDogc3RyaW5nOyBleHBlY3RlZDogc3RyaW5nOyB2YWx1ZTogYW55OyBtZXNzYWdlOiBzdHJpbmcgfSB8IG51bGw7XHJcbiAgICBSRVNVTFRTX1RZUEVfSU5DT1JSRUNUOiB7IHBhdGg6IHN0cmluZzsgZXhwZWN0ZWQ6IHN0cmluZzsgdmFsdWU6IGFueTsgbWVzc2FnZTogc3RyaW5nIH0gfCBudWxsO1xyXG4gICAgVU5BQ0NFUFRBQkxFOiB7IGV4cGVjdGVkOiBzdHJpbmc7IG1lc3NhZ2U6IHN0cmluZyB9O1xyXG4gICAgUEFSQU1TX1RZUEVfTk9UX1NVUFBPUlRFRDogeyBleHBlY3RlZDogc3RyaW5nIH07XHJcbiAgICBSRVNVTFRTX1RZUEVfTk9UX1NVUFBPUlRFRDogeyBleHBlY3RlZDogc3RyaW5nIH07XHJcbiAgICBJTlRFUk5BTF9TRVJWRVJfRVJST1I6IHVuZGVmaW5lZDtcclxuICAgIE1FVEhPRF9OT1RfQUxMT1dFRDogdW5kZWZpbmVkO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmVqZWN0PENvZGUgZXh0ZW5kcyBrZXlvZiAkcmVqZWN0Q29kZSwgUmVqZWN0RGF0YSBleHRlbmRzICRyZWplY3RDb2RlW0NvZGVdPihjb2RlOiBDb2RlLCBkYXRhOiBSZWplY3REYXRhKTogTWlsa2lvUmVqZWN0RXJyb3I8Q29kZSwgUmVqZWN0RGF0YT4ge1xyXG4gICAgY29uc3QgZXJyb3IgPSB7ICRtaWxraW9SZWplY3Q6IHRydWUsIGNvZGUsIGRhdGEgfSBhcyBNaWxraW9SZWplY3RFcnJvcjxDb2RlLCBSZWplY3REYXRhPjtcclxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGVycm9yKTtcclxuICAgIHJldHVybiBlcnJvcjtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgTWlsa2lvUmVqZWN0RXJyb3I8Q29kZSBleHRlbmRzIGtleW9mICRyZWplY3RDb2RlID0ga2V5b2YgJHJlamVjdENvZGUsIFJlamVjdERhdGEgZXh0ZW5kcyAkcmVqZWN0Q29kZVtDb2RlXSA9ICRyZWplY3RDb2RlW0NvZGVdPiA9IHsgY29kZTogQ29kZTsgZGF0YTogUmVqZWN0RGF0YTsgc3RhY2s6IHN0cmluZzsgJG1pbGtpb1JlamVjdDogdHJ1ZSB9O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGV4Y2VwdGlvbkhhbmRsZXIoZXhlY3V0ZUlkOiBzdHJpbmcsIGxvZ2dlcjogTG9nZ2VyLCBlcnJvcjogTWlsa2lvUmVqZWN0RXJyb3I8YW55LCBhbnk+IHwgYW55KTogTWlsa2lvUmVzcG9uc2VSZWplY3Qge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBpZiAoXCJ2aXRlU2VydmVyXCIgaW4gZ2xvYmFsVGhpcykgKGdsb2JhbFRoaXMgYXMgYW55KS52aXRlU2VydmVyPy5zc3JGaXhTdGFja3RyYWNlKGVycm9yKTsgLy8gZml4IHZpdGUgc3NyIHN0YWNrdHJhY2VcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7IH1cclxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIFwidml0ZVNlcnZlclwiIGluIGdsb2JhbFRoaXMpIChnbG9iYWxUaGlzIGFzIGFueSkudml0ZVNlcnZlci5zc3JGaXhTdGFja3RyYWNlKGVycm9yKTtcclxuICAgIGNvbnN0IG5hbWUgPSBlcnJvcj8uY29kZSA/PyBlcnJvcj8ubmFtZSA/PyBlcnJvcj8uY29uc3RydWN0b3I/Lm5hbWUgPz8gXCJVbm5hbWVkIEV4Y2VwdGlvblwiO1xyXG5cclxuICAgIGlmIChlcnJvcj8uJG1pbGtpb1JlamVjdCA9PT0gdHJ1ZSAmJiBlcnJvcj8uY29kZSA9PT0gXCJOT1RfRk9VTkRcIikge1xyXG4gICAgICAgIGxvZ2dlci5pbmZvKG5hbWUsIGVycm9yPy5kYXRhPy5wYXRoID8/IFwiVW5rbm93biBwYXRoXCIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFjayA9IGVycm9yPy4kbWlsa2lvUmVqZWN0ID8gKGVycm9yPy5zdGFjayA/PyBcIlwiKS5zcGxpdChcIlxcblwiKS5zbGljZSgyKS5qb2luKFwiXFxuXCIpIDogKGVycm9yPy5zdGFjayA/PyBcIlwiKTtcclxuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKG5hbWUsIGBcXG4ke0pTT04uc3RyaW5naWZ5KGVycm9yPy5kYXRhKX1gLCBgXFxuJHtzdGFja31cXG5gKTtcclxuICAgICAgICB9IGNhdGNoIChfKSB7XHJcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihuYW1lLCBgXFxuJHtlcnJvcj8udG9TdHJpbmcoKX1gLCBgXFxuJHtlcnJvcj8uc3RhY2t9XFxuYCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXN1bHQ6IE1pbGtpb1Jlc3BvbnNlUmVqZWN0O1xyXG5cclxuICAgIGlmIChlcnJvcj8uJG1pbGtpb1JlamVjdCA9PT0gdHJ1ZSkgcmVzdWx0ID0geyBzdWNjZXNzOiBmYWxzZSwgY29kZTogZXJyb3IuY29kZSwgcmVqZWN0OiBlcnJvci5kYXRhLCBleGVjdXRlSWQgfTtcclxuICAgIGVsc2UgcmVzdWx0ID0geyBzdWNjZXNzOiBmYWxzZSwgY29kZTogXCJJTlRFUk5BTF9TRVJWRVJfRVJST1JcIiwgcmVqZWN0OiB1bmRlZmluZWQsIGV4ZWN1dGVJZCB9O1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjtBQUFPLFNBQVMsSUFBNkIsQ0FBQyxTQUEyQjtBQUFBLEVBQ3ZFLE9BQU8sUUFBUTtBQUFBOztBQ1VWLFNBQVMsVUFBMEMsQ0FBQyxPQUErQjtBQUFBLEVBQ3hGLE9BQU87QUFBQSxJQUNMLE1BQU0sT0FBTyxFQUFFLGFBQWEsZUFBZSxNQUFNO0FBQUEsRUFDbkQ7QUFBQTs7QUNkSyxTQUFTLE1BQThCLENBQUMsU0FBMEI7QUFBQSxFQUN2RSxPQUFPO0FBQUE7QUFTRixTQUFTLFdBQVcsQ0FBQyxPQUFvQyxjQUFzQjtBQUFBLEVBQ3BGLElBQUksVUFBVTtBQUFBLElBQVcsT0FBTztBQUFBLEVBRWhDLE9BQU8sR0FBRztBQUFBO0FBR0wsU0FBUyxXQUFXLENBQUMsT0FBMkIsY0FBc0I7QUFBQSxFQUMzRSxJQUFJLFVBQVU7QUFBQSxJQUFXLE9BQU87QUFBQSxFQUVoQyxPQUFPLE9BQU8sU0FBUyxPQUFPLEVBQUU7QUFBQTtBQUczQixTQUFTLFlBQVksQ0FBQyxPQUFvQyxjQUF1QjtBQUFBLEVBQ3RGLElBQUksVUFBVTtBQUFBLElBQVEsT0FBTztBQUFBLEVBRTdCLElBQUksVUFBVTtBQUFBLElBQVMsT0FBTztBQUFBLEVBRTlCLElBQUksVUFBVTtBQUFBLElBQUksT0FBTztBQUFBLEVBRXpCLElBQWtCLFVBQWQ7QUFBQSxJQUFxQixPQUFPO0FBQUEsRUFFaEMsT0FBTyxRQUFRLEtBQUs7QUFBQTs7QUMvQmYsU0FBUyxhQUFhLENBQUMsU0FBa0I7QUFBQSxFQUM5QyxNQUFNLE9BQStCLENBQUM7QUFBQSxFQUN0QyxZQUFZLEtBQUssVUFBVyxRQUFnQixRQUFRLEdBQUc7QUFBQSxJQUNyRCxLQUFLLE9BQU87QUFBQSxFQUNkO0FBQUEsRUFDQSxPQUFPO0FBQUE7OztBQ0xULFNBQVMsYUFBYSxDQUFDLE9BQTBDO0FBQUEsRUFDL0QsT0FBTyxPQUFPLFVBQVUsWUFBWSxVQUFVLFFBQVEsQ0FBQyxNQUFNLFFBQVEsS0FBSztBQUFBO0FBR3JFLFNBQVMsU0FBdUUsQ0FBQyxRQUFXLFFBQWM7QUFBQSxFQUMvRyxNQUFNLFNBQVMsS0FBSyxPQUFPO0FBQUEsRUFFM0IsV0FBVyxPQUFPLFFBQVE7QUFBQSxJQUN4QixJQUFJLENBQUMsT0FBTyxVQUFVLGVBQWUsS0FBSyxRQUFRLEdBQUc7QUFBQSxNQUFHO0FBQUEsSUFFeEQsTUFBTSxjQUFjLE9BQU87QUFBQSxJQUMzQixNQUFNLGNBQWMsT0FBTztBQUFBLElBRTNCLElBQUksT0FBTyxVQUFVLGVBQWUsS0FBSyxRQUFRLEdBQUcsR0FBRztBQUFBLE1BQ3JELElBQUksY0FBYyxXQUFXLEtBQUssY0FBYyxXQUFXLEdBQUc7QUFBQSxRQUM1RCxPQUFPLE9BQTRCLFVBQVUsYUFBYSxXQUFXO0FBQUEsTUFDdkU7QUFBQSxJQUNGLEVBQU87QUFBQSxNQUNKLE9BQWUsT0FBTztBQUFBO0FBQUEsRUFFM0I7QUFBQSxFQUVBLE9BQU87QUFBQTs7O0FDckJGLFNBQVMsZUFBa0IsQ0FBQyxNQUFZO0FBQUEsRUFDM0MsTUFBTSxpQkFBaUI7QUFBQSxFQUV2QixJQUFJLGdCQUFnQjtBQUFBLElBQU0sT0FBTztBQUFBLEVBQ2pDLElBQUksTUFBTSxRQUFRLElBQUksR0FBRztBQUFBLElBQ3JCLE9BQU8sS0FBSyxJQUFJLENBQUMsU0FBUyxnQkFBZ0IsSUFBSSxDQUFDO0FBQUEsRUFDbkQ7QUFBQSxFQUNBLElBQUksT0FBTyxTQUFTLFlBQVksU0FBUyxNQUFNO0FBQUEsSUFDM0MsT0FBTyxPQUFPLFFBQVEsSUFBSSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEtBQUssV0FBVztBQUFBLE1BQ3RELElBQUksT0FBa0IsZ0JBQWdCLEtBQUs7QUFBQSxNQUMzQyxPQUFPO0FBQUEsT0FDUixDQUFDLENBQU07QUFBQSxFQUNkO0FBQUEsRUFDQSxJQUFJLE9BQU8sU0FBUyxVQUFVO0FBQUEsSUFDMUIsTUFBTSxRQUFRLEtBQUssTUFBTSxjQUFjO0FBQUEsSUFDdkMsSUFBSSxPQUFPO0FBQUEsTUFDUCxNQUFNLHVCQUF1QixNQUFNLEtBQUssR0FBRyxNQUFNLEtBQUssTUFBTSxHQUFHLFFBQVEsS0FBSyxFQUFFLE1BQU0sR0FBRyxNQUFNO0FBQUEsTUFDN0YsT0FBTyxJQUFJLEtBQUssb0JBQW9CO0FBQUEsSUFDeEM7QUFBQSxFQUNKO0FBQUEsRUFDQSxPQUFPO0FBQUE7OztBQ2RKLFNBQVMsY0FBYyxDQUFDLFdBQTBCLFNBQWM7QUFBQSxFQUNuRSxNQUFNLFlBQVksT0FDZCxhQUNBLFlBZ0IyUTtBQUFBLElBQzNRLE1BQU0sT0FBTyxRQUFRLEtBQUssU0FBUyxHQUFHLElBQUksV0FBVztBQUFBLElBQ3JELE1BQU0sWUFBb0IsUUFBUTtBQUFBLElBQ2xDLElBQUk7QUFBQSxJQUNKLElBQUksRUFBRSxRQUFRLG1CQUFtQixVQUFVO0FBQUEsTUFFdkMsVUFBVSxJQUFJLFFBQVE7QUFBQSxXQUNmLFFBQVE7QUFBQSxNQUNmLENBQUM7QUFBQSxJQUNMLEVBQU87QUFBQSxNQUNILFVBQVUsUUFBUTtBQUFBO0FBQUEsSUFFdEIsSUFBSSxFQUFFLFlBQVk7QUFBQSxNQUFXLFFBQWdCLFNBQVMsTUFBTSxjQUFjLE9BQU87QUFBQSxJQUVqRixNQUFNLFVBQXNCLENBQUM7QUFBQSxJQUM3QixNQUFNLFlBQVksQ0FBQyxZQUFpQixRQUFRLFFBQVEsT0FBTztBQUFBLElBRTNELElBQUk7QUFBQSxJQUNKLElBQUksUUFBUSxlQUFlLE9BQU87QUFBQSxNQUM5QixTQUFTLFFBQVE7QUFBQSxNQUNqQixJQUFJLE9BQU8sV0FBVztBQUFBLFFBQWEsU0FBUyxDQUFDO0FBQUEsSUFDakQsRUFBTztBQUFBLE1BQ0gsSUFBSSxRQUFRLFdBQVcsSUFBSTtBQUFBLFFBQ3ZCLFNBQVMsQ0FBQztBQUFBLE1BQ2QsRUFBTztBQUFBLFFBQ0gsSUFBSTtBQUFBLFVBQ0EsU0FBUyxnQkFBZ0IsS0FBSyxNQUFNLFFBQVEsTUFBTSxDQUFDO0FBQUEsVUFDckQsT0FBTyxPQUFPO0FBQUEsVUFDWixNQUFNLE9BQU8sNkJBQTZCLEVBQUUsVUFBVSxPQUFPLENBQUM7QUFBQTtBQUFBLFFBRWxFLElBQUksT0FBTyxXQUFXO0FBQUEsVUFBYSxTQUFTLENBQUM7QUFBQTtBQUFBO0FBQUEsSUFHckQsSUFBSSxPQUFPLFdBQVcsWUFBWSxNQUFNLFFBQVEsTUFBTTtBQUFBLE1BQUcsTUFBTSxPQUFPLDZCQUE2QixFQUFFLFVBQVUsT0FBTyxDQUFDO0FBQUEsSUFDdkgsSUFBSSwyQkFBMkIsVUFBVSxPQUFPLDBCQUEwQixVQUFVO0FBQUEsTUFDaEYsSUFBSSxDQUFDLFFBQVE7QUFBQSxRQUFTLE1BQU0sT0FBTyxvQkFBb0IsMENBQTBDO0FBQUEsTUFDakcsT0FBTyxPQUFPO0FBQUEsTUFDZCxJQUFJLGFBQWEsWUFBWSxhQUFhO0FBQUEsTUFDMUMsSUFBSSxlQUFlLGFBQWEsZUFBZTtBQUFBLFFBQU0sYUFBYSxDQUFDO0FBQUEsTUFDbkUsU0FBUyxVQUFVLFFBQVEsVUFBVTtBQUFBLE1BQ3JDLFFBQVEsY0FBYyxNQUFNLDJCQUEwQixLQUFLLFVBQVUsTUFBTSxDQUFDO0FBQUEsSUFDaEY7QUFBQSxJQUNBLElBQUksQ0FBQyxRQUFRLFNBQVMsTUFBTSxZQUFZLFFBQVEsU0FBUyxNQUFNLFFBQVE7QUFBQSxNQUFRLFFBQVEsUUFBUSxLQUFLLE9BQU8sU0FBUztBQUFBLElBRXBILElBQUksQ0FBQyxRQUFRO0FBQUEsTUFBUyxRQUFRLFVBQVUsQ0FBQztBQUFBLElBQ3pDLFFBQVEsUUFBUSxVQUFVLFFBQVE7QUFBQSxJQUNsQyxRQUFRLFFBQVEsT0FBTyxRQUFRO0FBQUEsSUFDL0IsUUFBUSxRQUFRLFNBQVMsUUFBUTtBQUFBLElBQ2pDLFFBQVEsUUFBUSxPQUFPLFFBQVE7QUFBQSxJQUMvQixRQUFRLFFBQVEsWUFBWSxRQUFRO0FBQUEsSUFDcEMsUUFBUSxRQUFRLFNBQVMsUUFBUSxRQUFRO0FBQUEsSUFDekMsUUFBUSxRQUFRLFFBQVEsVUFBVTtBQUFBLElBQ2xDLFFBQVEsUUFBUSxPQUFPLENBQUMsU0FBYSxZQUFnQixPQUFPLFFBQVEsU0FBUyxTQUFRLE9BQU07QUFBQSxJQUMzRixRQUFRLFFBQVEsWUFBWTtBQUFBLElBQzVCLFFBQVEsUUFBUSxJQUFJO0FBQUEsSUFFcEIsTUFBTSxVQUF3QixFQUFFLE9BQU8sVUFBVTtBQUFBLElBRWpELE1BQU0sU0FBUyxZQUFZO0FBQUEsSUFDM0IsTUFBTSxPQUFRLFFBQVEsT0FBTyxRQUFRLE9BQU8sQ0FBQztBQUFBLElBRTdDLElBQUksUUFBUSxRQUFRLE1BQU0sU0FBUyxXQUFXLFdBQVc7QUFBQSxNQUNyRCxNQUFNLGVBQWUsTUFBTSxXQUFXLENBQUMsTUFBTTtBQUFBLE1BQzdDLElBQUksQ0FBQyxhQUFhLFNBQVMsUUFBUSxRQUFRLEtBQUssUUFBUSxNQUFNO0FBQUEsUUFBRyxNQUFNLE9BQU8sc0JBQXNCLFNBQVM7QUFBQSxJQUNqSDtBQUFBLElBRUEsSUFBSSxNQUFNLGVBQWUsYUFBYSxLQUFLLGVBQWUsUUFBUyxNQUFNLFFBQVEsS0FBSyxVQUFVLEtBQUssS0FBSyxXQUFXLFNBQVMsUUFBUSxHQUFJO0FBQUEsTUFDdEksTUFBTSxhQUFhLFlBQVksZUFBZSxNQUFNO0FBQUEsTUFDcEQsSUFBSSxDQUFDLFdBQVc7QUFBQSxRQUFTLE1BQU0sT0FBTyx5QkFBeUIsS0FBSyxXQUFXLE9BQU8sSUFBSSxTQUFTLGNBQWMsV0FBVyxPQUFPLEdBQUcsYUFBYSxXQUFXLE9BQU8sR0FBRyxnQ0FBZ0MsV0FBVyxPQUFPLEdBQUcsMEJBQTBCLENBQUM7QUFBQSxJQUM1UDtBQUFBLElBRUEsTUFBTSxRQUFRLEtBQUssd0JBQXdCLEVBQUUsV0FBVyxRQUFRLGtCQUFrQixRQUFRLFFBQVEsZUFBZSxNQUFNLFFBQVEsTUFBTSxNQUFNLFNBQVMsUUFBUSxTQUFTLE9BQU8sQ0FBQztBQUFBLElBRTdLLFFBQVEsUUFBUSxNQUFNLE9BQU8sUUFBUSxRQUFRLFNBQVMsTUFBTTtBQUFBLElBRTVELElBQUksY0FBYztBQUFBLElBQ2xCLElBQUksUUFBUSxVQUFVLGFBQWEsUUFBUSxVQUFVLFFBQVEsUUFBUSxVQUFVLElBQUk7QUFBQSxNQUMvRSxjQUFjO0FBQUEsTUFDZCxRQUFRLFFBQVEsQ0FBQztBQUFBLElBQ3JCLEVBQU8sU0FBSSxNQUFNLFFBQVEsUUFBUSxLQUFLLEtBQUssT0FBTyxRQUFRLFVBQVUsVUFBVTtBQUFBLE1BQzFFLE1BQU0sT0FBTyxnQkFBZ0IsNkdBQTZHO0FBQUEsSUFDOUk7QUFBQSxJQUVBLElBQUksb0JBQW9CO0FBQUEsSUFDeEIsSUFBSSxDQUFDLGVBQWUsU0FBUyxhQU96QixLQUFLLGVBQWUsUUFBUyxNQUFNLFFBQVEsS0FBSyxVQUFVLEtBQUssS0FBSyxXQUFXLFNBQVMsU0FBUyxJQUFLO0FBQUEsTUFDdEcsb0JBQW9CO0FBQUEsTUFDcEIsTUFBTSxhQUFhLFlBQVksZ0JBQWdCLFFBQVEsS0FBSztBQUFBLE1BQzVELElBQUksQ0FBQyxXQUFXO0FBQUEsUUFBUyxNQUFNLE9BQU8sMEJBQTBCLEtBQUssV0FBVyxPQUFPLElBQUksU0FBUyxjQUFjLFdBQVcsT0FBTyxHQUFHLGFBQWEsV0FBVyxPQUFPLEdBQUcsZ0NBQWdDLFdBQVcsT0FBTyxHQUFHLDBCQUEwQixDQUFDO0FBQUEsSUFDN1A7QUFBQSxJQUVBLE1BQU0sUUFBUSxLQUFLLHVCQUF1QixFQUFFLFdBQVcsUUFBUSxrQkFBa0IsUUFBUSxRQUFRLGVBQWUsTUFBTSxRQUFRLE1BQU0sTUFBTSxTQUFTLFFBQVEsU0FBUyxTQUFTLE9BQU8sQ0FBQztBQUFBLElBRXJMLE9BQU8sRUFBRSxXQUFXLFNBQVMsUUFBUSxTQUFTLFNBQVMsUUFBUSxTQUFTLE1BQU0sTUFBTSxhQUFhLG1CQUFtQixRQUFRO0FBQUE7QUFBQSxFQUdoSSxNQUFNLFNBQVMsT0FBTyxTQUFtQixRQUFxQyxXQUErQjtBQUFBLElBQ3pHLE1BQU0sZ0JBQWdCLE1BQU07QUFBQSxJQUM1QixPQUFPLE1BQU0sY0FBYyxRQUFRLFNBQVMsTUFBTTtBQUFBO0FBQUEsRUFHdEQsT0FBTztBQUFBLElBQ0g7QUFBQSxJQUNBO0FBQUEsRUFDSjtBQUFBOztBQzdIRyxTQUFTLGtCQUFrQixHQUFHO0FBQUEsRUFDakMsTUFBTSxXQUFXLElBQUk7QUFBQSxFQUNyQixNQUFNLFVBQVUsSUFBSTtBQUFBLEVBRXBCLE1BQU0sZUFBZTtBQUFBLElBQ2pCLElBQUksQ0FBMkUsS0FBVSxZQUFxQjtBQUFBLE1BQzFHLFNBQVMsSUFBSSxTQUFTLEdBQWE7QUFBQSxNQUNuQyxJQUFJLFFBQVEsS0FBSztBQUFBLFFBQ2IsSUFBSSxRQUFRLElBQUksR0FBRyxNQUFNLE9BQU87QUFBQSxVQUM1QixRQUFRLElBQUksS0FBSyxJQUFJLEdBQUs7QUFBQSxRQUM5QjtBQUFBLFFBQ0EsTUFBTSxjQUFjLFFBQVEsSUFBSSxHQUFHO0FBQUEsUUFDbkMsWUFBWSxJQUFJLE9BQU87QUFBQSxNQUMzQixFQUFPO0FBQUEsUUFDSCxJQUFJLFFBQVEsSUFBSSxHQUFhLE1BQU0sT0FBTztBQUFBLFVBQ3RDLFFBQVEsSUFBSSxLQUFlLElBQUksR0FBSztBQUFBLFFBQ3hDO0FBQUEsUUFDQSxNQUFNLE1BQU0sUUFBUSxJQUFJLEdBQWE7QUFBQSxRQUNyQyxJQUFJLElBQUksT0FBTztBQUFBO0FBQUEsTUFHbkIsT0FBTyxNQUFNO0FBQUEsUUFDVCxTQUFTLE9BQU8sT0FBTztBQUFBLFFBQ3ZCLElBQUksUUFBUSxLQUFLO0FBQUEsVUFDYixNQUFNLGNBQWMsUUFBUSxJQUFJLEdBQUc7QUFBQSxVQUNuQyxJQUFJLGFBQWE7QUFBQSxZQUNiLFlBQVksT0FBTyxPQUFPO0FBQUEsVUFDOUI7QUFBQSxRQUNKLEVBQU87QUFBQSxVQUNILE1BQU0sTUFBTSxRQUFRLElBQUksR0FBYTtBQUFBLFVBQ3JDLElBQUksS0FBSztBQUFBLFlBQ0wsSUFBSSxPQUFPLE9BQU87QUFBQSxVQUN0QjtBQUFBO0FBQUE7QUFBQTtBQUFBLElBSVosS0FBSyxDQUEyRSxLQUFVLFlBQXFCO0FBQUEsTUFDM0csSUFBSSxRQUFRLEtBQUs7QUFBQSxRQUNiLE1BQU0sY0FBYyxRQUFRLElBQUksR0FBRztBQUFBLFFBQ25DLElBQUksQ0FBQztBQUFBLFVBQWE7QUFBQSxRQUNsQixTQUFTLE9BQU8sT0FBTztBQUFBLFFBQ3ZCLFlBQVksT0FBTyxPQUFPO0FBQUEsTUFDOUIsRUFBTztBQUFBLFFBQ0gsTUFBTSxNQUFNLFFBQVEsSUFBSSxHQUFhO0FBQUEsUUFDckMsSUFBSSxDQUFDO0FBQUEsVUFBSztBQUFBLFFBQ1YsU0FBUyxPQUFPLE9BQU87QUFBQSxRQUN2QixJQUFJLE9BQU8sT0FBTztBQUFBO0FBQUE7QUFBQSxJQUcxQixNQUFNLE9BQThELEtBQVUsVUFBZ0M7QUFBQSxNQUMxRyxNQUFNLG1CQUFtQixRQUFRLElBQUksR0FBRztBQUFBLE1BQ3hDLElBQUksa0JBQWtCO0FBQUEsUUFDbEIsV0FBVyxXQUFXLGtCQUFrQjtBQUFBLFVBQ3BDLE1BQU0sUUFBUSxFQUFFLEtBQUssTUFBTSxDQUFDO0FBQUEsUUFDaEM7QUFBQSxNQUNKO0FBQUEsTUFFQSxNQUFNLElBQUksUUFBUSxJQUFJLEdBQWE7QUFBQSxNQUNuQyxJQUFJLEdBQUc7QUFBQSxRQUNILFdBQVcsV0FBVyxHQUFHO0FBQUEsVUFDckIsTUFBTSxRQUFRLEtBQUs7QUFBQSxRQUN2QjtBQUFBLE1BQ0o7QUFBQTtBQUFBLEVBRVI7QUFBQSxFQUVBLE9BQU87QUFBQTs7QUNyRUosU0FBUyxVQUFhLEdBQWtCO0FBQUEsRUFDN0MsSUFBSSxTQUE4QztBQUFBLEVBQ2xELE1BQU0sUUFLRCxDQUFDO0FBQUEsRUFFTixNQUFNLFdBQVc7QUFBQSxJQUNmLE1BQU0sQ0FBQyxTQUFZO0FBQUEsTUFDakIsSUFBSSxNQUFNLEdBQUcsRUFBRSxHQUFHLFVBQVUsTUFBTTtBQUFBLFFBQ2hDLE1BQU0sT0FBTyxNQUFNLEdBQUcsRUFBRTtBQUFBLFFBQ3hCLEtBQUssUUFBUTtBQUFBLFFBQ2IsS0FBSyxRQUFRLElBQUk7QUFBQSxRQUNqQjtBQUFBLE1BQ0YsRUFBTztBQUFBLFFBQ0wsTUFBTSxZQUFZLFFBQVEsY0FBaUI7QUFBQSxRQUMzQyxVQUFVLFFBQVEsSUFBSTtBQUFBLFFBQ3RCLE1BQU0sS0FBSyxLQUFLLFdBQVcsT0FBTyxNQUFNLENBQVE7QUFBQTtBQUFBO0FBQUEsT0FHaEQ7QUFBQSxXQUNJLEtBQUksR0FBK0I7QUFBQSxRQUN2QyxJQUFJLFdBQVc7QUFBQSxVQUFXLE9BQU8sRUFBRSxNQUFNLE1BQU0sT0FBTyxLQUFLO0FBQUEsUUFDM0QsSUFBSSxNQUFNLFdBQVcsR0FBRztBQUFBLFVBQ3RCLE1BQU0sWUFBWSxRQUFRLGNBQWlCO0FBQUEsVUFDM0MsTUFBTSxLQUFLLEtBQUssV0FBVyxPQUFPLEtBQUssQ0FBUTtBQUFBLFFBQ2pEO0FBQUEsUUFDQSxNQUFNLE9BQU8sTUFBTSxHQUFHLENBQUM7QUFBQSxRQUN2QixNQUFNLFNBQVMsTUFBTSxLQUFLO0FBQUEsUUFDMUIsTUFBTSxNQUFNO0FBQUEsUUFDWixPQUFPLEVBQUUsTUFBTSxXQUFXLFdBQVcsT0FBTyxPQUFPO0FBQUE7QUFBQSxXQUUvQyxPQUFNLEdBQWtDO0FBQUEsUUFDNUMsU0FBUztBQUFBLFFBQ1QsV0FBVyxRQUFRLE9BQU87QUFBQSxVQUN4QixLQUFLLFFBQVE7QUFBQSxVQUNiLEtBQUssUUFBUSxTQUFTO0FBQUEsUUFDeEI7QUFBQSxRQUNBLE9BQU8sRUFBRSxNQUFNLE1BQU0sT0FBTyxLQUFLO0FBQUE7QUFBQSxXQUU3QixNQUFLLENBQUMsS0FBeUM7QUFBQSxRQUNuRCxTQUFTO0FBQUEsUUFDVCxJQUFJLE1BQU0sV0FBVyxHQUFHO0FBQUEsVUFDdEIsTUFBTSxZQUFZLFFBQVEsY0FBaUI7QUFBQSxVQUMzQyxNQUFNLEtBQUssS0FBSyxXQUFXLE9BQU8sS0FBSyxDQUFRO0FBQUEsUUFDakQ7QUFBQSxRQUNBLFdBQVcsUUFBUSxPQUFPO0FBQUEsVUFDeEIsS0FBSyxRQUFRO0FBQUEsVUFDYixLQUFLLE9BQU8sR0FBRztBQUFBLFFBQ2pCO0FBQUEsUUFDQSxPQUFPLEVBQUUsTUFBTSxNQUFNLE9BQU8sS0FBSztBQUFBO0FBQUEsSUFFckM7QUFBQSxLQUNDLE9BQU8sY0FBYyxHQUFHO0FBQUEsTUFDdkIsT0FBTztBQUFBO0FBQUEsRUFFWDtBQUFBLEVBRUEsT0FBTztBQUFBOztBQzlEVCxTQUFTLGlCQUFpQixDQUFDLFNBQTZCO0FBQUEsRUFDdEQsSUFBSSxDQUFDLFFBQVE7QUFBQSxJQUFRLFFBQVEsU0FBUztBQUFBLEVBQ3RDLElBQUksUUFBUSxTQUFTO0FBQUEsSUFBRyxNQUFNLElBQUksTUFBTSxnQkFBZ0I7QUFBQSxFQUN4RCxJQUFJLFFBQVEsU0FBUztBQUFBLElBQUksTUFBTSxJQUFJLE1BQU0sZ0JBQWdCO0FBQUEsRUFDekQsSUFBSSxRQUFRLGFBQWEsUUFBUSxTQUFTO0FBQUEsSUFBRyxNQUFNLElBQUksTUFBTSxnQkFBZ0I7QUFBQSxFQUM3RSxJQUFJLFdBQVc7QUFBQSxFQUNmLElBQUksY0FBYztBQUFBLEVBQ2xCLE9BQU87QUFBQSxJQUNMLFFBQVEsR0FBRztBQUFBLE1BQ1QsSUFBSSxhQUFhLFFBQVE7QUFBQSxNQUN6QixNQUFNLE1BQU0sS0FBSyxJQUFJO0FBQUEsTUFDckIsSUFBSSxLQUFLO0FBQUEsTUFDVCxJQUFJLFFBQVEsV0FBVztBQUFBLFFBQ3JCLGNBQWM7QUFBQSxRQUNkLEtBQUssR0FBRyxLQUFLLGlCQUFpQixPQUFPLEdBQUcsQ0FBQyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQUEsTUFDNUQ7QUFBQSxNQUNBLElBQUksUUFBUSxjQUFjLGFBQWEsS0FBSztBQUFBLFFBQzFDLEtBQUssR0FBRyxLQUFLLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxTQUFTLEdBQUcsR0FBRztBQUFBLE1BQzlELEVBQU87QUFBQSxRQUNMLFdBQVc7QUFBQSxRQUNYLE1BQU0sTUFBTTtBQUFBLFFBQ1osTUFBTSxNQUFNLGNBQWMsT0FBTyxVQUFVLENBQUM7QUFBQSxRQUM1QyxjQUFjLHFCQUFxQixLQUFLLEdBQUc7QUFBQSxRQUMzQyxLQUFLLEdBQUcsS0FBSyxpQkFBaUIsV0FBVyxFQUFFLFNBQVMsWUFBWSxHQUFHO0FBQUE7QUFBQSxNQUVyRSxPQUFPO0FBQUE7QUFBQSxJQUVULGNBQWMsQ0FBQyxJQUFZO0FBQUEsTUFDekIsT0FBTyxRQUFRLFlBQVksT0FBTyxpQkFBaUIsR0FBRyxNQUFNLEdBQUcsQ0FBQyxFQUFFLFdBQVcsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJO0FBQUE7QUFBQSxFQUU5RjtBQUFBO0FBR0YsSUFBTSxXQUFXO0FBRWpCLFNBQVMsb0JBQW9CLENBQUMsS0FBYSxLQUFxQjtBQUFBLEVBQzlELElBQUksT0FBTztBQUFBLElBQUssTUFBTSxJQUFJLE1BQU0sZUFBZTtBQUFBLEVBRS9DLE1BQU0sUUFBUSxNQUFNLE1BQU07QUFBQSxFQUMxQixNQUFNLFlBQVksS0FBSyxLQUFLLE9BQU8sT0FBTyxNQUFNLFNBQVMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFBQSxFQUN4RSxNQUFNLGVBQWUsSUFBSSxXQUFXLFNBQVM7QUFBQSxFQUU3QyxJQUFJO0FBQUEsRUFDSixHQUFHO0FBQUEsSUFDRCxPQUFPLGdCQUFnQixZQUFZO0FBQUEsSUFDbkMsY0FDRSxPQUNFLEtBQUssTUFBTSxLQUFLLFlBQVksRUFDekIsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsRUFBRSxTQUFTLEdBQUcsR0FBRyxDQUFDLEVBQzFDLEtBQUssRUFBRSxHQUNaLElBQUk7QUFBQSxFQUNSLFNBQVMsY0FBYztBQUFBLEVBRXZCLE9BQU8sTUFBTTtBQUFBO0FBR2YsU0FBUyxnQkFBZ0IsQ0FBQyxPQUF1QjtBQUFBLEVBQy9DLE1BQU0sT0FBTyxPQUFPLFNBQVMsTUFBTTtBQUFBLEVBQ25DLElBQUksU0FBUztBQUFBLEVBQ2IsSUFBSSxVQUFVO0FBQUEsRUFFZCxJQUFJLFlBQVk7QUFBQSxJQUFJLE9BQU8sU0FBUztBQUFBLEVBRXBDLE9BQU8sVUFBVSxJQUFJO0FBQUEsSUFDbkIsTUFBTSxZQUFZLFVBQVU7QUFBQSxJQUM1QixTQUFTLFNBQVMsT0FBTyxTQUFTLEtBQUs7QUFBQSxJQUN2QyxVQUFVLFVBQVU7QUFBQSxFQUN0QjtBQUFBLEVBQ0EsT0FBTztBQUFBO0FBR1QsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFxQjtBQUFBLEVBQzdDLE1BQU0sVUFBcUMsQ0FBQztBQUFBLEVBQzVDLFNBQVMsSUFBSSxFQUFHLElBQUksU0FBUyxRQUFRLEtBQUs7QUFBQSxJQUN4QyxRQUFRLFNBQVMsTUFBTTtBQUFBLEVBQ3pCO0FBQUEsRUFFQSxNQUFNLE9BQU8sT0FBTyxTQUFTLE1BQU07QUFBQSxFQUNuQyxJQUFJLFNBQVM7QUFBQSxFQUViLFNBQVMsSUFBSSxFQUFHLElBQUksSUFBSSxRQUFRLEtBQUs7QUFBQSxJQUNuQyxNQUFNLE9BQU8sSUFBSTtBQUFBLElBQ2pCLElBQUksRUFBRSxRQUFRLFVBQVU7QUFBQSxNQUN0QixNQUFNLElBQUksTUFBTSxzQkFBc0IsdUJBQXVCO0FBQUEsSUFDL0Q7QUFBQSxJQUNBLE1BQU0sUUFBUSxPQUFPLFFBQVEsS0FBSztBQUFBLElBQ2xDLFNBQVMsU0FBUyxPQUFPO0FBQUEsRUFDM0I7QUFBQSxFQUVBLE9BQU87QUFBQTtBQUdULFNBQVMsYUFBYSxDQUFDLEdBQW1CO0FBQUEsRUFDeEMsT0FBTyxPQUFPLFNBQVMsTUFBTSxLQUFLLElBQUk7QUFBQTtBQUd4QyxJQUFNLGNBQWMsa0JBQWtCLEVBQUUsUUFBUSxJQUFJLFdBQVcsT0FBTyxZQUFZLE1BQU0sQ0FBQztBQUVsRixJQUFNLGFBQWEsWUFBWTs7O0FDcEcvQixTQUFTLCtCQUErQixHQUFHO0FBQUEsRUFDaEQsT0FBTztBQUFBOzs7QUMrQlQsZUFBc0IsV0FBNkMsQ0FBQyxXQUEwQixjQUF3RCxTQUEwQztBQUFBLEVBQzVMLE1BQU0sWUFBWSxRQUFRLGFBQWEsZ0NBQWdDO0FBQUEsRUFDdkUsTUFBTSxVQUFTLE1BQU0sYUFBYSxJQUFJO0FBQUEsRUFFdEMsTUFBTSxVQUFVO0FBQUEsSUFDWixTQUFTLElBQUk7QUFBQSxJQUNiO0FBQUEsRUFDSjtBQUFBLEVBRUEsTUFBTSxlQUFlLG1CQUFtQjtBQUFBLEVBRXhDLElBQUksUUFBUTtBQUFBLElBQVcsUUFBUSxrQkFBa0IsUUFBUSxrQkFBa0IsUUFBUSxrQkFBa0IsSUFBSTtBQUFBLEVBRXpHLE1BQU0sSUFBc0M7QUFBQSxPQUNyQztBQUFBLElBQ0g7QUFBQSxJQUNBO0FBQUEsSUFDQSxJQUFJLGFBQWE7QUFBQSxJQUNqQixLQUFLLGFBQWE7QUFBQSxJQUNsQixNQUFNLGFBQWE7QUFBQSxFQUN2QjtBQUFBLEVBRUEsTUFBTSxXQUFXLGVBQWUsV0FBVyxDQUFDO0FBQUEsRUFDNUMsTUFBTSxXQUFXLGVBQWUsV0FBVyxHQUFHLFFBQVE7QUFBQSxFQUd0RCxNQUFNLFFBQVE7QUFBQSxJQUNWO0FBQUEsSUFFQSxJQUFJLGFBQWE7QUFBQSxJQUNqQixLQUFLLGFBQWE7QUFBQSxJQUNsQixNQUFNLGFBQWE7QUFBQSxJQUVuQjtBQUFBLElBRUE7QUFBQSxFQUNKO0FBQUEsRUFFQSxRQUFRLE1BQU07QUFBQSxFQUVkLElBQUksTUFBTSxRQUFRLFFBQVEsVUFBVSxHQUFHO0FBQUEsSUFDbkMsV0FBVyxhQUFhLFFBQVEsWUFBWTtBQUFBLE1BQ3hDLE1BQU0sVUFBVSxLQUFrRDtBQUFBLElBQ3RFO0FBQUEsRUFDSjtBQUFBLEVBRUEsTUFBTSxRQUFRLElBQUksVUFBVSxjQUFjLGFBQWEsS0FBSyxDQUFDO0FBQUEsRUFFN0QsTUFBTSxZQUFZLE9BQU8sS0FBSyxVQUFVLFdBQWtDO0FBQUEsRUFDMUUsUUFBUSxJQUFJO0FBQUE7QUFBQSxNQUFtQixVQUFVLEtBQUs7QUFBQSxLQUFRO0FBQUEsZUFBbUIsVUFBVSxnQkFBZ0I7QUFBQSxFQUNuRyxRQUFRLElBQUk7QUFBQSw2QkFBK0IsUUFBUSxNQUFNO0FBQUEsRUFFekQsT0FBTztBQUFBOztBQ3hGSixTQUFTLEtBQW1DLENBQUMsTUFBcUM7QUFBQSxFQUN2RixPQUFPO0FBQUE7O0FDb0NGLElBQU0sYUFBYTtBQWdCbkIsSUFBTSxVQUFVLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEtBQUssS0FBSztBQWdCakQsSUFBTSxVQUFVLENBQUM7QUFPakIsSUFBTSxxQkFBcUI7QUFPM0IsSUFBTSxvQkFBb0I7QUE2RTFCLElBQU0sZ0JBQWdCO0FBY3RCLElBQU0sZUFBZSxnQkFBZ0I7QUFPckMsSUFBTSxnQkFBZ0IsZUFBZTtBQU9yQyxJQUFNLGdCQUFnQixlQUFlO0FBT3JDLElBQU0saUJBQWlCLGdCQUFnQjtBQU92QyxJQUFNLG1CQUFtQixpQkFBaUI7QUFhMUMsSUFBTSxzQkFBc0IsT0FBTyxJQUFJLG1CQUFtQjs7O0FDbEwxRCxTQUFTLGFBQWEsQ0FBQyxNQUFNLE9BQU87QUFBQSxFQUN6QyxJQUFJLE9BQU8sU0FBUztBQUFBLElBQVksT0FBTyxLQUFLLEtBQUs7QUFBQSxFQUVqRCxJQUFJLFFBQVEsT0FBTyxTQUFTLFlBQVksdUJBQXVCO0FBQUEsSUFDN0QsT0FBTyxLQUFLLHFCQUFxQixLQUFLO0FBQUEsRUFFeEMsSUFBSSxnQkFBZ0I7QUFBQSxJQUFNLE9BQU8sSUFBSSxLQUFLLFlBQVksS0FBSztBQUFBLEVBRTNELE9BQU8sSUFBSSxLQUFLLEtBQUs7QUFBQTs7O0FDTGhCLFNBQVMsTUFBTSxDQUFDLFVBQVUsU0FBUztBQUFBLEVBRXhDLE9BQU8sY0FBYyxXQUFXLFVBQVUsUUFBUTtBQUFBOzs7QUMxQ3BELElBQUksaUJBQWlCLENBQUM7QUFFZixTQUFTLGlCQUFpQixHQUFHO0FBQUEsRUFDbEMsT0FBTztBQUFBOzs7QUMrQkYsU0FBUyxXQUFXLENBQUMsTUFBTSxTQUFTO0FBQUEsRUFDekMsTUFBTSxrQkFBaUIsa0JBQWtCO0FBQUEsRUFDekMsTUFBTSxlQUNKLFNBQVMsZ0JBQ1QsU0FBUyxRQUFRLFNBQVMsZ0JBQzFCLGdCQUFlLGdCQUNmLGdCQUFlLFFBQVEsU0FBUyxnQkFDaEM7QUFBQSxFQUVGLE1BQU0sUUFBUSxPQUFPLE1BQU0sU0FBUyxFQUFFO0FBQUEsRUFDdEMsTUFBTSxNQUFNLE1BQU0sT0FBTztBQUFBLEVBQ3pCLE1BQU0sUUFBUSxNQUFNLGVBQWUsSUFBSSxLQUFLLE1BQU07QUFBQSxFQUVsRCxNQUFNLFFBQVEsTUFBTSxRQUFRLElBQUksSUFBSTtBQUFBLEVBQ3BDLE1BQU0sU0FBUyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQUEsRUFDekIsT0FBTztBQUFBOzs7QUNuQkYsU0FBUyxjQUFjLENBQUMsTUFBTSxTQUFTO0FBQUEsRUFDNUMsT0FBTyxZQUFZLE1BQU0sS0FBSyxTQUFTLGNBQWMsRUFBRSxDQUFDO0FBQUE7OztBQ0huRCxTQUFTLGNBQWMsQ0FBQyxNQUFNLFNBQVM7QUFBQSxFQUM1QyxNQUFNLFFBQVEsT0FBTyxNQUFNLFNBQVMsRUFBRTtBQUFBLEVBQ3RDLE1BQU0sT0FBTyxNQUFNLFlBQVk7QUFBQSxFQUUvQixNQUFNLDRCQUE0QixjQUFjLE9BQU8sQ0FBQztBQUFBLEVBQ3hELDBCQUEwQixZQUFZLE9BQU8sR0FBRyxHQUFHLENBQUM7QUFBQSxFQUNwRCwwQkFBMEIsU0FBUyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQUEsRUFDN0MsTUFBTSxrQkFBa0IsZUFBZSx5QkFBeUI7QUFBQSxFQUVoRSxNQUFNLDRCQUE0QixjQUFjLE9BQU8sQ0FBQztBQUFBLEVBQ3hELDBCQUEwQixZQUFZLE1BQU0sR0FBRyxDQUFDO0FBQUEsRUFDaEQsMEJBQTBCLFNBQVMsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUFBLEVBQzdDLE1BQU0sa0JBQWtCLGVBQWUseUJBQXlCO0FBQUEsRUFFaEUsSUFBSSxNQUFNLFFBQVEsS0FBSyxnQkFBZ0IsUUFBUSxHQUFHO0FBQUEsSUFDaEQsT0FBTyxPQUFPO0FBQUEsRUFDaEIsRUFBTyxTQUFJLE1BQU0sUUFBUSxLQUFLLGdCQUFnQixRQUFRLEdBQUc7QUFBQSxJQUN2RCxPQUFPO0FBQUEsRUFDVCxFQUFPO0FBQUEsSUFDTCxPQUFPLE9BQU87QUFBQTtBQUFBOzs7QUNsQ1gsU0FBUywrQkFBK0IsQ0FBQyxNQUFNO0FBQUEsRUFDcEQsTUFBTSxRQUFRLE9BQU8sSUFBSTtBQUFBLEVBQ3pCLE1BQU0sVUFBVSxJQUFJLEtBQ2xCLEtBQUssSUFDSCxNQUFNLFlBQVksR0FDbEIsTUFBTSxTQUFTLEdBQ2YsTUFBTSxRQUFRLEdBQ2QsTUFBTSxTQUFTLEdBQ2YsTUFBTSxXQUFXLEdBQ2pCLE1BQU0sV0FBVyxHQUNqQixNQUFNLGdCQUFnQixDQUN4QixDQUNGO0FBQUEsRUFDQSxRQUFRLGVBQWUsTUFBTSxZQUFZLENBQUM7QUFBQSxFQUMxQyxPQUFPLENBQUMsT0FBTyxDQUFDO0FBQUE7OztBQ3pCWCxTQUFTLGNBQWMsQ0FBQyxZQUFZLE9BQU87QUFBQSxFQUNoRCxNQUFNLFlBQVksY0FBYyxLQUM5QixNQUNBLFdBQVcsTUFBTSxLQUFLLENBQUMsU0FBUyxPQUFPLFNBQVMsUUFBUSxDQUMxRDtBQUFBLEVBQ0EsT0FBTyxNQUFNLElBQUksU0FBUztBQUFBOzs7QUNxQnJCLFNBQVMsVUFBVSxDQUFDLE1BQU0sU0FBUztBQUFBLEVBQ3hDLE1BQU0sUUFBUSxPQUFPLE1BQU0sU0FBUyxFQUFFO0FBQUEsRUFDdEMsTUFBTSxTQUFTLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFBQSxFQUN6QixPQUFPO0FBQUE7OztBQ1NGLFNBQVMsd0JBQXdCLENBQUMsV0FBVyxhQUFhLFNBQVM7QUFBQSxFQUN4RSxPQUFPLFlBQVksZ0JBQWdCLGVBQ2pDLFNBQVMsSUFDVCxXQUNBLFdBQ0Y7QUFBQSxFQUVBLE1BQU0sa0JBQWtCLFdBQVcsVUFBVTtBQUFBLEVBQzdDLE1BQU0sb0JBQW9CLFdBQVcsWUFBWTtBQUFBLEVBRWpELE1BQU0saUJBQ0osQ0FBQyxrQkFBa0IsZ0NBQWdDLGVBQWU7QUFBQSxFQUNwRSxNQUFNLG1CQUNKLENBQUMsb0JBQW9CLGdDQUFnQyxpQkFBaUI7QUFBQSxFQUt4RSxPQUFPLEtBQUssT0FBTyxpQkFBaUIsb0JBQW9CLGlCQUFpQjtBQUFBOzs7QUN6QnBFLFNBQVMsa0JBQWtCLENBQUMsTUFBTSxTQUFTO0FBQUEsRUFDaEQsTUFBTSxPQUFPLGVBQWUsTUFBTSxPQUFPO0FBQUEsRUFDekMsTUFBTSxrQkFBa0IsY0FBYyxTQUFTLE1BQU0sTUFBTSxDQUFDO0FBQUEsRUFDNUQsZ0JBQWdCLFlBQVksTUFBTSxHQUFHLENBQUM7QUFBQSxFQUN0QyxnQkFBZ0IsU0FBUyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQUEsRUFDbkMsT0FBTyxlQUFlLGVBQWU7QUFBQTs7O0FDTmhDLFNBQVMsTUFBTSxDQUFDLE9BQU87QUFBQSxFQUM1QixPQUNFLGlCQUFpQixRQUNoQixPQUFPLFVBQVUsWUFDaEIsT0FBTyxVQUFVLFNBQVMsS0FBSyxLQUFLLE1BQU07QUFBQTs7O0FDRnpDLFNBQVMsT0FBTyxDQUFDLE1BQU07QUFBQSxFQUM1QixPQUFPLEVBQUcsQ0FBQyxPQUFPLElBQUksS0FBSyxPQUFPLFNBQVMsWUFBYSxNQUFNLENBQUMsT0FBTyxJQUFJLENBQUM7QUFBQTs7O0FDUHRFLFNBQVMsV0FBVyxDQUFDLE1BQU0sU0FBUztBQUFBLEVBQ3pDLE1BQU0sUUFBUSxPQUFPLE1BQU0sU0FBUyxFQUFFO0FBQUEsRUFDdEMsTUFBTSxZQUFZLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQztBQUFBLEVBQzNDLE1BQU0sU0FBUyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQUEsRUFDekIsT0FBTztBQUFBOzs7QUNoQ1QsSUFBTSx1QkFBdUI7QUFBQSxFQUMzQixrQkFBa0I7QUFBQSxJQUNoQixLQUFLO0FBQUEsSUFDTCxPQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsVUFBVTtBQUFBLElBQ1IsS0FBSztBQUFBLElBQ0wsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVBLGFBQWE7QUFBQSxFQUViLGtCQUFrQjtBQUFBLElBQ2hCLEtBQUs7QUFBQSxJQUNMLE9BQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxVQUFVO0FBQUEsSUFDUixLQUFLO0FBQUEsSUFDTCxPQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsYUFBYTtBQUFBLElBQ1gsS0FBSztBQUFBLElBQ0wsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVBLFFBQVE7QUFBQSxJQUNOLEtBQUs7QUFBQSxJQUNMLE9BQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxPQUFPO0FBQUEsSUFDTCxLQUFLO0FBQUEsSUFDTCxPQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsYUFBYTtBQUFBLElBQ1gsS0FBSztBQUFBLElBQ0wsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVBLFFBQVE7QUFBQSxJQUNOLEtBQUs7QUFBQSxJQUNMLE9BQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxjQUFjO0FBQUEsSUFDWixLQUFLO0FBQUEsSUFDTCxPQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsU0FBUztBQUFBLElBQ1AsS0FBSztBQUFBLElBQ0wsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVBLGFBQWE7QUFBQSxJQUNYLEtBQUs7QUFBQSxJQUNMLE9BQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxRQUFRO0FBQUEsSUFDTixLQUFLO0FBQUEsSUFDTCxPQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsWUFBWTtBQUFBLElBQ1YsS0FBSztBQUFBLElBQ0wsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVBLGNBQWM7QUFBQSxJQUNaLEtBQUs7QUFBQSxJQUNMLE9BQU87QUFBQSxFQUNUO0FBQ0Y7QUFFTyxJQUFNLGlCQUFpQixDQUFDLE9BQU8sT0FBTyxZQUFZO0FBQUEsRUFDdkQsSUFBSTtBQUFBLEVBRUosTUFBTSxhQUFhLHFCQUFxQjtBQUFBLEVBQ3hDLElBQUksT0FBTyxlQUFlLFVBQVU7QUFBQSxJQUNsQyxTQUFTO0FBQUEsRUFDWCxFQUFPLFNBQUksVUFBVSxHQUFHO0FBQUEsSUFDdEIsU0FBUyxXQUFXO0FBQUEsRUFDdEIsRUFBTztBQUFBLElBQ0wsU0FBUyxXQUFXLE1BQU0sUUFBUSxhQUFhLE1BQU0sU0FBUyxDQUFDO0FBQUE7QUFBQSxFQUdqRSxJQUFJLFNBQVMsV0FBVztBQUFBLElBQ3RCLElBQUksUUFBUSxjQUFjLFFBQVEsYUFBYSxHQUFHO0FBQUEsTUFDaEQsT0FBTyxRQUFRO0FBQUEsSUFDakIsRUFBTztBQUFBLE1BQ0wsT0FBTyxTQUFTO0FBQUE7QUFBQSxFQUVwQjtBQUFBLEVBRUEsT0FBTztBQUFBOzs7QUNuR0YsU0FBUyxpQkFBaUIsQ0FBQyxNQUFNO0FBQUEsRUFDdEMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNO0FBQUEsSUFFdkIsTUFBTSxRQUFRLFFBQVEsUUFBUSxPQUFPLFFBQVEsS0FBSyxJQUFJLEtBQUs7QUFBQSxJQUMzRCxNQUFNLFNBQVMsS0FBSyxRQUFRLFVBQVUsS0FBSyxRQUFRLEtBQUs7QUFBQSxJQUN4RCxPQUFPO0FBQUE7QUFBQTs7O0FDSFgsSUFBTSxjQUFjO0FBQUEsRUFDbEIsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUNUO0FBRUEsSUFBTSxjQUFjO0FBQUEsRUFDbEIsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUNUO0FBRUEsSUFBTSxrQkFBa0I7QUFBQSxFQUN0QixNQUFNO0FBQUEsRUFDTixNQUFNO0FBQUEsRUFDTixRQUFRO0FBQUEsRUFDUixPQUFPO0FBQ1Q7QUFFTyxJQUFNLGFBQWE7QUFBQSxFQUN4QixNQUFNLGtCQUFrQjtBQUFBLElBQ3RCLFNBQVM7QUFBQSxJQUNULGNBQWM7QUFBQSxFQUNoQixDQUFDO0FBQUEsRUFFRCxNQUFNLGtCQUFrQjtBQUFBLElBQ3RCLFNBQVM7QUFBQSxJQUNULGNBQWM7QUFBQSxFQUNoQixDQUFDO0FBQUEsRUFFRCxVQUFVLGtCQUFrQjtBQUFBLElBQzFCLFNBQVM7QUFBQSxJQUNULGNBQWM7QUFBQSxFQUNoQixDQUFDO0FBQ0g7OztBQ3RDQSxJQUFNLHVCQUF1QjtBQUFBLEVBQzNCLFVBQVU7QUFBQSxFQUNWLFdBQVc7QUFBQSxFQUNYLE9BQU87QUFBQSxFQUNQLFVBQVU7QUFBQSxFQUNWLFVBQVU7QUFBQSxFQUNWLE9BQU87QUFDVDtBQUVPLElBQU0saUJBQWlCLENBQUMsT0FBTyxPQUFPLFdBQVcsYUFDdEQscUJBQXFCOzs7QUM2QmhCLFNBQVMsZUFBZSxDQUFDLE1BQU07QUFBQSxFQUNwQyxPQUFPLENBQUMsT0FBTyxZQUFZO0FBQUEsSUFDekIsTUFBTSxVQUFVLFNBQVMsVUFBVSxPQUFPLFFBQVEsT0FBTyxJQUFJO0FBQUEsSUFFN0QsSUFBSTtBQUFBLElBQ0osSUFBSSxZQUFZLGdCQUFnQixLQUFLLGtCQUFrQjtBQUFBLE1BQ3JELE1BQU0sZUFBZSxLQUFLLDBCQUEwQixLQUFLO0FBQUEsTUFDekQsTUFBTSxRQUFRLFNBQVMsUUFBUSxPQUFPLFFBQVEsS0FBSyxJQUFJO0FBQUEsTUFFdkQsY0FDRSxLQUFLLGlCQUFpQixVQUFVLEtBQUssaUJBQWlCO0FBQUEsSUFDMUQsRUFBTztBQUFBLE1BQ0wsTUFBTSxlQUFlLEtBQUs7QUFBQSxNQUMxQixNQUFNLFFBQVEsU0FBUyxRQUFRLE9BQU8sUUFBUSxLQUFLLElBQUksS0FBSztBQUFBLE1BRTVELGNBQWMsS0FBSyxPQUFPLFVBQVUsS0FBSyxPQUFPO0FBQUE7QUFBQSxJQUVsRCxNQUFNLFFBQVEsS0FBSyxtQkFBbUIsS0FBSyxpQkFBaUIsS0FBSyxJQUFJO0FBQUEsSUFHckUsT0FBTyxZQUFZO0FBQUE7QUFBQTs7O0FDekR2QixJQUFNLFlBQVk7QUFBQSxFQUNoQixRQUFRLENBQUMsS0FBSyxHQUFHO0FBQUEsRUFDakIsYUFBYSxDQUFDLE1BQU0sSUFBSTtBQUFBLEVBQ3hCLE1BQU0sQ0FBQyxpQkFBaUIsYUFBYTtBQUN2QztBQUVBLElBQU0sZ0JBQWdCO0FBQUEsRUFDcEIsUUFBUSxDQUFDLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxFQUMzQixhQUFhLENBQUMsTUFBTSxNQUFNLE1BQU0sSUFBSTtBQUFBLEVBQ3BDLE1BQU0sQ0FBQyxlQUFlLGVBQWUsZUFBZSxhQUFhO0FBQ25FO0FBTUEsSUFBTSxjQUFjO0FBQUEsRUFDbEIsUUFBUSxDQUFDLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsRUFDbkUsYUFBYTtBQUFBLElBQ1g7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFBQSxFQUVBLE1BQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxJQUFNLFlBQVk7QUFBQSxFQUNoQixRQUFRLENBQUMsS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLEVBQzFDLE9BQU8sQ0FBQyxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxJQUFJO0FBQUEsRUFDaEQsYUFBYSxDQUFDLE9BQU8sT0FBTyxPQUFPLE9BQU8sT0FBTyxPQUFPLEtBQUs7QUFBQSxFQUM3RCxNQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFDRjtBQUVBLElBQU0sa0JBQWtCO0FBQUEsRUFDdEIsUUFBUTtBQUFBLElBQ04sSUFBSTtBQUFBLElBQ0osSUFBSTtBQUFBLElBQ0osVUFBVTtBQUFBLElBQ1YsTUFBTTtBQUFBLElBQ04sU0FBUztBQUFBLElBQ1QsV0FBVztBQUFBLElBQ1gsU0FBUztBQUFBLElBQ1QsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUNBLGFBQWE7QUFBQSxJQUNYLElBQUk7QUFBQSxJQUNKLElBQUk7QUFBQSxJQUNKLFVBQVU7QUFBQSxJQUNWLE1BQU07QUFBQSxJQUNOLFNBQVM7QUFBQSxJQUNULFdBQVc7QUFBQSxJQUNYLFNBQVM7QUFBQSxJQUNULE9BQU87QUFBQSxFQUNUO0FBQUEsRUFDQSxNQUFNO0FBQUEsSUFDSixJQUFJO0FBQUEsSUFDSixJQUFJO0FBQUEsSUFDSixVQUFVO0FBQUEsSUFDVixNQUFNO0FBQUEsSUFDTixTQUFTO0FBQUEsSUFDVCxXQUFXO0FBQUEsSUFDWCxTQUFTO0FBQUEsSUFDVCxPQUFPO0FBQUEsRUFDVDtBQUNGO0FBRUEsSUFBTSw0QkFBNEI7QUFBQSxFQUNoQyxRQUFRO0FBQUEsSUFDTixJQUFJO0FBQUEsSUFDSixJQUFJO0FBQUEsSUFDSixVQUFVO0FBQUEsSUFDVixNQUFNO0FBQUEsSUFDTixTQUFTO0FBQUEsSUFDVCxXQUFXO0FBQUEsSUFDWCxTQUFTO0FBQUEsSUFDVCxPQUFPO0FBQUEsRUFDVDtBQUFBLEVBQ0EsYUFBYTtBQUFBLElBQ1gsSUFBSTtBQUFBLElBQ0osSUFBSTtBQUFBLElBQ0osVUFBVTtBQUFBLElBQ1YsTUFBTTtBQUFBLElBQ04sU0FBUztBQUFBLElBQ1QsV0FBVztBQUFBLElBQ1gsU0FBUztBQUFBLElBQ1QsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUNBLE1BQU07QUFBQSxJQUNKLElBQUk7QUFBQSxJQUNKLElBQUk7QUFBQSxJQUNKLFVBQVU7QUFBQSxJQUNWLE1BQU07QUFBQSxJQUNOLFNBQVM7QUFBQSxJQUNULFdBQVc7QUFBQSxJQUNYLFNBQVM7QUFBQSxJQUNULE9BQU87QUFBQSxFQUNUO0FBQ0Y7QUFFQSxJQUFNLGdCQUFnQixDQUFDLGFBQWEsYUFBYTtBQUFBLEVBQy9DLE1BQU0sU0FBUyxPQUFPLFdBQVc7QUFBQSxFQVNqQyxNQUFNLFNBQVMsU0FBUztBQUFBLEVBQ3hCLElBQUksU0FBUyxNQUFNLFNBQVMsSUFBSTtBQUFBLElBQzlCLFFBQVEsU0FBUztBQUFBLFdBQ1Y7QUFBQSxRQUNILE9BQU8sU0FBUztBQUFBLFdBQ2I7QUFBQSxRQUNILE9BQU8sU0FBUztBQUFBLFdBQ2I7QUFBQSxRQUNILE9BQU8sU0FBUztBQUFBO0FBQUEsRUFFdEI7QUFBQSxFQUNBLE9BQU8sU0FBUztBQUFBO0FBR1gsSUFBTSxXQUFXO0FBQUEsRUFDdEI7QUFBQSxFQUVBLEtBQUssZ0JBQWdCO0FBQUEsSUFDbkIsUUFBUTtBQUFBLElBQ1IsY0FBYztBQUFBLEVBQ2hCLENBQUM7QUFBQSxFQUVELFNBQVMsZ0JBQWdCO0FBQUEsSUFDdkIsUUFBUTtBQUFBLElBQ1IsY0FBYztBQUFBLElBQ2Qsa0JBQWtCLENBQUMsWUFBWSxVQUFVO0FBQUEsRUFDM0MsQ0FBQztBQUFBLEVBRUQsT0FBTyxnQkFBZ0I7QUFBQSxJQUNyQixRQUFRO0FBQUEsSUFDUixjQUFjO0FBQUEsRUFDaEIsQ0FBQztBQUFBLEVBRUQsS0FBSyxnQkFBZ0I7QUFBQSxJQUNuQixRQUFRO0FBQUEsSUFDUixjQUFjO0FBQUEsRUFDaEIsQ0FBQztBQUFBLEVBRUQsV0FBVyxnQkFBZ0I7QUFBQSxJQUN6QixRQUFRO0FBQUEsSUFDUixjQUFjO0FBQUEsSUFDZCxrQkFBa0I7QUFBQSxJQUNsQix3QkFBd0I7QUFBQSxFQUMxQixDQUFDO0FBQ0g7OztBQzFMTyxTQUFTLFlBQVksQ0FBQyxNQUFNO0FBQUEsRUFDakMsT0FBTyxDQUFDLFFBQVEsVUFBVSxDQUFDLE1BQU07QUFBQSxJQUMvQixNQUFNLFFBQVEsUUFBUTtBQUFBLElBRXRCLE1BQU0sZUFDSCxTQUFTLEtBQUssY0FBYyxVQUM3QixLQUFLLGNBQWMsS0FBSztBQUFBLElBQzFCLE1BQU0sY0FBYyxPQUFPLE1BQU0sWUFBWTtBQUFBLElBRTdDLElBQUksQ0FBQyxhQUFhO0FBQUEsTUFDaEIsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLE1BQU0sZ0JBQWdCLFlBQVk7QUFBQSxJQUVsQyxNQUFNLGdCQUNILFNBQVMsS0FBSyxjQUFjLFVBQzdCLEtBQUssY0FBYyxLQUFLO0FBQUEsSUFFMUIsTUFBTSxNQUFNLE1BQU0sUUFBUSxhQUFhLElBQ25DLFVBQVUsZUFBZSxDQUFDLFlBQVksUUFBUSxLQUFLLGFBQWEsQ0FBQyxJQUVqRSxRQUFRLGVBQWUsQ0FBQyxZQUFZLFFBQVEsS0FBSyxhQUFhLENBQUM7QUFBQSxJQUVuRSxJQUFJO0FBQUEsSUFFSixRQUFRLEtBQUssZ0JBQWdCLEtBQUssY0FBYyxHQUFHLElBQUk7QUFBQSxJQUN2RCxRQUFRLFFBQVEsZ0JBRVosUUFBUSxjQUFjLEtBQUssSUFDM0I7QUFBQSxJQUVKLE1BQU0sT0FBTyxPQUFPLE1BQU0sY0FBYyxNQUFNO0FBQUEsSUFFOUMsT0FBTyxFQUFFLE9BQU8sS0FBSztBQUFBO0FBQUE7QUFJekIsU0FBUyxPQUFPLENBQUMsUUFBUSxXQUFXO0FBQUEsRUFDbEMsV0FBVyxPQUFPLFFBQVE7QUFBQSxJQUN4QixJQUNFLE9BQU8sVUFBVSxlQUFlLEtBQUssUUFBUSxHQUFHLEtBQ2hELFVBQVUsT0FBTyxJQUFJLEdBQ3JCO0FBQUEsTUFDQSxPQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0Y7QUFBQSxFQUNBO0FBQUE7QUFHRixTQUFTLFNBQVMsQ0FBQyxPQUFPLFdBQVc7QUFBQSxFQUNuQyxTQUFTLE1BQU0sRUFBRyxNQUFNLE1BQU0sUUFBUSxPQUFPO0FBQUEsSUFDM0MsSUFBSSxVQUFVLE1BQU0sSUFBSSxHQUFHO0FBQUEsTUFDekIsT0FBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBQUEsRUFDQTtBQUFBOzs7QUN2REssU0FBUyxtQkFBbUIsQ0FBQyxNQUFNO0FBQUEsRUFDeEMsT0FBTyxDQUFDLFFBQVEsVUFBVSxDQUFDLE1BQU07QUFBQSxJQUMvQixNQUFNLGNBQWMsT0FBTyxNQUFNLEtBQUssWUFBWTtBQUFBLElBQ2xELElBQUksQ0FBQztBQUFBLE1BQWEsT0FBTztBQUFBLElBQ3pCLE1BQU0sZ0JBQWdCLFlBQVk7QUFBQSxJQUVsQyxNQUFNLGNBQWMsT0FBTyxNQUFNLEtBQUssWUFBWTtBQUFBLElBQ2xELElBQUksQ0FBQztBQUFBLE1BQWEsT0FBTztBQUFBLElBQ3pCLElBQUksUUFBUSxLQUFLLGdCQUNiLEtBQUssY0FBYyxZQUFZLEVBQUUsSUFDakMsWUFBWTtBQUFBLElBR2hCLFFBQVEsUUFBUSxnQkFBZ0IsUUFBUSxjQUFjLEtBQUssSUFBSTtBQUFBLElBRS9ELE1BQU0sT0FBTyxPQUFPLE1BQU0sY0FBYyxNQUFNO0FBQUEsSUFFOUMsT0FBTyxFQUFFLE9BQU8sS0FBSztBQUFBO0FBQUE7OztBQ2R6QixJQUFNLDRCQUE0QjtBQUNsQyxJQUFNLDRCQUE0QjtBQUVsQyxJQUFNLG1CQUFtQjtBQUFBLEVBQ3ZCLFFBQVE7QUFBQSxFQUNSLGFBQWE7QUFBQSxFQUNiLE1BQU07QUFDUjtBQUNBLElBQU0sbUJBQW1CO0FBQUEsRUFDdkIsS0FBSyxDQUFDLE9BQU8sU0FBUztBQUN4QjtBQUVBLElBQU0sdUJBQXVCO0FBQUEsRUFDM0IsUUFBUTtBQUFBLEVBQ1IsYUFBYTtBQUFBLEVBQ2IsTUFBTTtBQUNSO0FBQ0EsSUFBTSx1QkFBdUI7QUFBQSxFQUMzQixLQUFLLENBQUMsTUFBTSxNQUFNLE1BQU0sSUFBSTtBQUM5QjtBQUVBLElBQU0scUJBQXFCO0FBQUEsRUFDekIsUUFBUTtBQUFBLEVBQ1IsYUFBYTtBQUFBLEVBQ2IsTUFBTTtBQUNSO0FBQ0EsSUFBTSxxQkFBcUI7QUFBQSxFQUN6QixRQUFRO0FBQUEsSUFDTjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUFBLEVBRUEsS0FBSztBQUFBLElBQ0g7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFDRjtBQUVBLElBQU0sbUJBQW1CO0FBQUEsRUFDdkIsUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUFBLEVBQ1AsYUFBYTtBQUFBLEVBQ2IsTUFBTTtBQUNSO0FBQ0EsSUFBTSxtQkFBbUI7QUFBQSxFQUN2QixRQUFRLENBQUMsT0FBTyxPQUFPLE9BQU8sT0FBTyxPQUFPLE9BQU8sS0FBSztBQUFBLEVBQ3hELEtBQUssQ0FBQyxRQUFRLE9BQU8sUUFBUSxPQUFPLFFBQVEsT0FBTyxNQUFNO0FBQzNEO0FBRUEsSUFBTSx5QkFBeUI7QUFBQSxFQUM3QixRQUFRO0FBQUEsRUFDUixLQUFLO0FBQ1A7QUFDQSxJQUFNLHlCQUF5QjtBQUFBLEVBQzdCLEtBQUs7QUFBQSxJQUNILElBQUk7QUFBQSxJQUNKLElBQUk7QUFBQSxJQUNKLFVBQVU7QUFBQSxJQUNWLE1BQU07QUFBQSxJQUNOLFNBQVM7QUFBQSxJQUNULFdBQVc7QUFBQSxJQUNYLFNBQVM7QUFBQSxJQUNULE9BQU87QUFBQSxFQUNUO0FBQ0Y7QUFFTyxJQUFNLFFBQVE7QUFBQSxFQUNuQixlQUFlLG9CQUFvQjtBQUFBLElBQ2pDLGNBQWM7QUFBQSxJQUNkLGNBQWM7QUFBQSxJQUNkLGVBQWUsQ0FBQyxVQUFVLFNBQVMsT0FBTyxFQUFFO0FBQUEsRUFDOUMsQ0FBQztBQUFBLEVBRUQsS0FBSyxhQUFhO0FBQUEsSUFDaEIsZUFBZTtBQUFBLElBQ2YsbUJBQW1CO0FBQUEsSUFDbkIsZUFBZTtBQUFBLElBQ2YsbUJBQW1CO0FBQUEsRUFDckIsQ0FBQztBQUFBLEVBRUQsU0FBUyxhQUFhO0FBQUEsSUFDcEIsZUFBZTtBQUFBLElBQ2YsbUJBQW1CO0FBQUEsSUFDbkIsZUFBZTtBQUFBLElBQ2YsbUJBQW1CO0FBQUEsSUFDbkIsZUFBZSxDQUFDLFVBQVUsUUFBUTtBQUFBLEVBQ3BDLENBQUM7QUFBQSxFQUVELE9BQU8sYUFBYTtBQUFBLElBQ2xCLGVBQWU7QUFBQSxJQUNmLG1CQUFtQjtBQUFBLElBQ25CLGVBQWU7QUFBQSxJQUNmLG1CQUFtQjtBQUFBLEVBQ3JCLENBQUM7QUFBQSxFQUVELEtBQUssYUFBYTtBQUFBLElBQ2hCLGVBQWU7QUFBQSxJQUNmLG1CQUFtQjtBQUFBLElBQ25CLGVBQWU7QUFBQSxJQUNmLG1CQUFtQjtBQUFBLEVBQ3JCLENBQUM7QUFBQSxFQUVELFdBQVcsYUFBYTtBQUFBLElBQ3RCLGVBQWU7QUFBQSxJQUNmLG1CQUFtQjtBQUFBLElBQ25CLGVBQWU7QUFBQSxJQUNmLG1CQUFtQjtBQUFBLEVBQ3JCLENBQUM7QUFDSDs7O0FDckhPLElBQU0sT0FBTztBQUFBLEVBQ2xCLE1BQU07QUFBQSxFQUNOO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0EsU0FBUztBQUFBLElBQ1AsY0FBYztBQUFBLElBQ2QsdUJBQXVCO0FBQUEsRUFDekI7QUFDRjs7QUNDTyxTQUFTLFlBQVksQ0FBQyxNQUFNLFNBQVM7QUFBQSxFQUMxQyxNQUFNLFFBQVEsT0FBTyxNQUFNLFNBQVMsRUFBRTtBQUFBLEVBQ3RDLE1BQU0sT0FBTyx5QkFBeUIsT0FBTyxZQUFZLEtBQUssQ0FBQztBQUFBLEVBQy9ELE1BQU0sWUFBWSxPQUFPO0FBQUEsRUFDekIsT0FBTztBQUFBOzs7QUNERixTQUFTLFVBQVUsQ0FBQyxNQUFNLFNBQVM7QUFBQSxFQUN4QyxNQUFNLFFBQVEsT0FBTyxNQUFNLFNBQVMsRUFBRTtBQUFBLEVBQ3RDLE1BQU0sT0FBTyxDQUFDLGVBQWUsS0FBSyxJQUFJLENBQUMsbUJBQW1CLEtBQUs7QUFBQSxFQUsvRCxPQUFPLEtBQUssTUFBTSxPQUFPLGtCQUFrQixJQUFJO0FBQUE7OztBQ08xQyxTQUFTLFdBQVcsQ0FBQyxNQUFNLFNBQVM7QUFBQSxFQUN6QyxNQUFNLFFBQVEsT0FBTyxNQUFNLFNBQVMsRUFBRTtBQUFBLEVBQ3RDLE1BQU0sT0FBTyxNQUFNLFlBQVk7QUFBQSxFQUUvQixNQUFNLGtCQUFpQixrQkFBa0I7QUFBQSxFQUN6QyxNQUFNLHdCQUNKLFNBQVMseUJBQ1QsU0FBUyxRQUFRLFNBQVMseUJBQzFCLGdCQUFlLHlCQUNmLGdCQUFlLFFBQVEsU0FBUyx5QkFDaEM7QUFBQSxFQUVGLE1BQU0sc0JBQXNCLGNBQWMsU0FBUyxNQUFNLE1BQU0sQ0FBQztBQUFBLEVBQ2hFLG9CQUFvQixZQUFZLE9BQU8sR0FBRyxHQUFHLHFCQUFxQjtBQUFBLEVBQ2xFLG9CQUFvQixTQUFTLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFBQSxFQUN2QyxNQUFNLGtCQUFrQixZQUFZLHFCQUFxQixPQUFPO0FBQUEsRUFFaEUsTUFBTSxzQkFBc0IsY0FBYyxTQUFTLE1BQU0sTUFBTSxDQUFDO0FBQUEsRUFDaEUsb0JBQW9CLFlBQVksTUFBTSxHQUFHLHFCQUFxQjtBQUFBLEVBQzlELG9CQUFvQixTQUFTLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFBQSxFQUN2QyxNQUFNLGtCQUFrQixZQUFZLHFCQUFxQixPQUFPO0FBQUEsRUFFaEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUI7QUFBQSxJQUM5QixPQUFPLE9BQU87QUFBQSxFQUNoQixFQUFPLFNBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCO0FBQUEsSUFDckMsT0FBTztBQUFBLEVBQ1QsRUFBTztBQUFBLElBQ0wsT0FBTyxPQUFPO0FBQUE7QUFBQTs7O0FDeEJYLFNBQVMsZUFBZSxDQUFDLE1BQU0sU0FBUztBQUFBLEVBQzdDLE1BQU0sa0JBQWlCLGtCQUFrQjtBQUFBLEVBQ3pDLE1BQU0sd0JBQ0osU0FBUyx5QkFDVCxTQUFTLFFBQVEsU0FBUyx5QkFDMUIsZ0JBQWUseUJBQ2YsZ0JBQWUsUUFBUSxTQUFTLHlCQUNoQztBQUFBLEVBRUYsTUFBTSxPQUFPLFlBQVksTUFBTSxPQUFPO0FBQUEsRUFDdEMsTUFBTSxZQUFZLGNBQWMsU0FBUyxNQUFNLE1BQU0sQ0FBQztBQUFBLEVBQ3RELFVBQVUsWUFBWSxNQUFNLEdBQUcscUJBQXFCO0FBQUEsRUFDcEQsVUFBVSxTQUFTLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFBQSxFQUM3QixNQUFNLFFBQVEsWUFBWSxXQUFXLE9BQU87QUFBQSxFQUM1QyxPQUFPO0FBQUE7OztBQ2pCRixTQUFTLE9BQU8sQ0FBQyxNQUFNLFNBQVM7QUFBQSxFQUNyQyxNQUFNLFFBQVEsT0FBTyxNQUFNLFNBQVMsRUFBRTtBQUFBLEVBQ3RDLE1BQU0sT0FBTyxDQUFDLFlBQVksT0FBTyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsT0FBTyxPQUFPO0FBQUEsRUFLM0UsT0FBTyxLQUFLLE1BQU0sT0FBTyxrQkFBa0IsSUFBSTtBQUFBOzs7QUNsRDFDLFNBQVMsZUFBZSxDQUFDLFFBQVEsY0FBYztBQUFBLEVBQ3BELE1BQU0sT0FBTyxTQUFTLElBQUksTUFBTTtBQUFBLEVBQ2hDLE1BQU0sU0FBUyxLQUFLLElBQUksTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLGNBQWMsR0FBRztBQUFBLEVBQ3JFLE9BQU8sT0FBTztBQUFBOzs7QUNZVCxJQUFNLGtCQUFrQjtBQUFBLEVBRTdCLENBQUMsQ0FBQyxNQUFNLE9BQU87QUFBQSxJQVViLE1BQU0sYUFBYSxLQUFLLFlBQVk7QUFBQSxJQUVwQyxNQUFNLE9BQU8sYUFBYSxJQUFJLGFBQWEsSUFBSTtBQUFBLElBQy9DLE9BQU8sZ0JBQWdCLFVBQVUsT0FBTyxPQUFPLE1BQU0sTUFBTSxNQUFNLE1BQU07QUFBQTtBQUFBLEVBSXpFLENBQUMsQ0FBQyxNQUFNLE9BQU87QUFBQSxJQUNiLE1BQU0sUUFBUSxLQUFLLFNBQVM7QUFBQSxJQUM1QixPQUFPLFVBQVUsTUFBTSxPQUFPLFFBQVEsQ0FBQyxJQUFJLGdCQUFnQixRQUFRLEdBQUcsQ0FBQztBQUFBO0FBQUEsRUFJekUsQ0FBQyxDQUFDLE1BQU0sT0FBTztBQUFBLElBQ2IsT0FBTyxnQkFBZ0IsS0FBSyxRQUFRLEdBQUcsTUFBTSxNQUFNO0FBQUE7QUFBQSxFQUlyRCxDQUFDLENBQUMsTUFBTSxPQUFPO0FBQUEsSUFDYixNQUFNLHFCQUFxQixLQUFLLFNBQVMsSUFBSSxNQUFNLElBQUksT0FBTztBQUFBLElBRTlELFFBQVE7QUFBQSxXQUNEO0FBQUEsV0FDQTtBQUFBLFFBQ0gsT0FBTyxtQkFBbUIsWUFBWTtBQUFBLFdBQ25DO0FBQUEsUUFDSCxPQUFPO0FBQUEsV0FDSjtBQUFBLFFBQ0gsT0FBTyxtQkFBbUI7QUFBQSxXQUN2QjtBQUFBO0FBQUEsUUFFSCxPQUFPLHVCQUF1QixPQUFPLFNBQVM7QUFBQTtBQUFBO0FBQUEsRUFLcEQsQ0FBQyxDQUFDLE1BQU0sT0FBTztBQUFBLElBQ2IsT0FBTyxnQkFBZ0IsS0FBSyxTQUFTLElBQUksTUFBTSxJQUFJLE1BQU0sTUFBTTtBQUFBO0FBQUEsRUFJakUsQ0FBQyxDQUFDLE1BQU0sT0FBTztBQUFBLElBQ2IsT0FBTyxnQkFBZ0IsS0FBSyxTQUFTLEdBQUcsTUFBTSxNQUFNO0FBQUE7QUFBQSxFQUl0RCxDQUFDLENBQUMsTUFBTSxPQUFPO0FBQUEsSUFDYixPQUFPLGdCQUFnQixLQUFLLFdBQVcsR0FBRyxNQUFNLE1BQU07QUFBQTtBQUFBLEVBSXhELENBQUMsQ0FBQyxNQUFNLE9BQU87QUFBQSxJQUNiLE9BQU8sZ0JBQWdCLEtBQUssV0FBVyxHQUFHLE1BQU0sTUFBTTtBQUFBO0FBQUEsRUFJeEQsQ0FBQyxDQUFDLE1BQU0sT0FBTztBQUFBLElBQ2IsTUFBTSxpQkFBaUIsTUFBTTtBQUFBLElBQzdCLE1BQU0sZUFBZSxLQUFLLGdCQUFnQjtBQUFBLElBQzFDLE1BQU0sb0JBQW9CLEtBQUssTUFDN0IsZUFBZSxLQUFLLElBQUksSUFBSSxpQkFBaUIsQ0FBQyxDQUNoRDtBQUFBLElBQ0EsT0FBTyxnQkFBZ0IsbUJBQW1CLE1BQU0sTUFBTTtBQUFBO0FBRTFEOzs7QUNsRkEsSUFBTSxnQkFBZ0I7QUFBQSxFQUNwQixJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFDSixVQUFVO0FBQUEsRUFDVixNQUFNO0FBQUEsRUFDTixTQUFTO0FBQUEsRUFDVCxXQUFXO0FBQUEsRUFDWCxTQUFTO0FBQUEsRUFDVCxPQUFPO0FBQ1Q7QUFnRE8sSUFBTSxhQUFhO0FBQUEsRUFFeEIsR0FBRyxRQUFTLENBQUMsTUFBTSxPQUFPLFdBQVU7QUFBQSxJQUNsQyxNQUFNLE1BQU0sS0FBSyxZQUFZLElBQUksSUFBSSxJQUFJO0FBQUEsSUFDekMsUUFBUTtBQUFBLFdBRUQ7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFFBQ0gsT0FBTyxVQUFTLElBQUksS0FBSyxFQUFFLE9BQU8sY0FBYyxDQUFDO0FBQUEsV0FFOUM7QUFBQSxRQUNILE9BQU8sVUFBUyxJQUFJLEtBQUssRUFBRSxPQUFPLFNBQVMsQ0FBQztBQUFBLFdBRXpDO0FBQUE7QUFBQSxRQUVILE9BQU8sVUFBUyxJQUFJLEtBQUssRUFBRSxPQUFPLE9BQU8sQ0FBQztBQUFBO0FBQUE7QUFBQSxFQUtoRCxHQUFHLFFBQVMsQ0FBQyxNQUFNLE9BQU8sV0FBVTtBQUFBLElBRWxDLElBQUksVUFBVSxNQUFNO0FBQUEsTUFDbEIsTUFBTSxhQUFhLEtBQUssWUFBWTtBQUFBLE1BRXBDLE1BQU0sT0FBTyxhQUFhLElBQUksYUFBYSxJQUFJO0FBQUEsTUFDL0MsT0FBTyxVQUFTLGNBQWMsTUFBTSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQUEsSUFDdEQ7QUFBQSxJQUVBLE9BQU8sZ0JBQWdCLEVBQUUsTUFBTSxLQUFLO0FBQUE7QUFBQSxFQUl0QyxHQUFHLFFBQVMsQ0FBQyxNQUFNLE9BQU8sV0FBVSxTQUFTO0FBQUEsSUFDM0MsTUFBTSxpQkFBaUIsWUFBWSxNQUFNLE9BQU87QUFBQSxJQUVoRCxNQUFNLFdBQVcsaUJBQWlCLElBQUksaUJBQWlCLElBQUk7QUFBQSxJQUczRCxJQUFJLFVBQVUsTUFBTTtBQUFBLE1BQ2xCLE1BQU0sZUFBZSxXQUFXO0FBQUEsTUFDaEMsT0FBTyxnQkFBZ0IsY0FBYyxDQUFDO0FBQUEsSUFDeEM7QUFBQSxJQUdBLElBQUksVUFBVSxNQUFNO0FBQUEsTUFDbEIsT0FBTyxVQUFTLGNBQWMsVUFBVSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQUEsSUFDMUQ7QUFBQSxJQUdBLE9BQU8sZ0JBQWdCLFVBQVUsTUFBTSxNQUFNO0FBQUE7QUFBQSxFQUkvQyxHQUFHLFFBQVMsQ0FBQyxNQUFNLE9BQU87QUFBQSxJQUN4QixNQUFNLGNBQWMsZUFBZSxJQUFJO0FBQUEsSUFHdkMsT0FBTyxnQkFBZ0IsYUFBYSxNQUFNLE1BQU07QUFBQTtBQUFBLEVBWWxELEdBQUcsUUFBUyxDQUFDLE1BQU0sT0FBTztBQUFBLElBQ3hCLE1BQU0sT0FBTyxLQUFLLFlBQVk7QUFBQSxJQUM5QixPQUFPLGdCQUFnQixNQUFNLE1BQU0sTUFBTTtBQUFBO0FBQUEsRUFJM0MsR0FBRyxRQUFTLENBQUMsTUFBTSxPQUFPLFdBQVU7QUFBQSxJQUNsQyxNQUFNLFVBQVUsS0FBSyxNQUFNLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQztBQUFBLElBQ25ELFFBQVE7QUFBQSxXQUVEO0FBQUEsUUFDSCxPQUFPLE9BQU8sT0FBTztBQUFBLFdBRWxCO0FBQUEsUUFDSCxPQUFPLGdCQUFnQixTQUFTLENBQUM7QUFBQSxXQUU5QjtBQUFBLFFBQ0gsT0FBTyxVQUFTLGNBQWMsU0FBUyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQUEsV0FFdkQ7QUFBQSxRQUNILE9BQU8sVUFBUyxRQUFRLFNBQVM7QUFBQSxVQUMvQixPQUFPO0FBQUEsVUFDUCxTQUFTO0FBQUEsUUFDWCxDQUFDO0FBQUEsV0FFRTtBQUFBLFFBQ0gsT0FBTyxVQUFTLFFBQVEsU0FBUztBQUFBLFVBQy9CLE9BQU87QUFBQSxVQUNQLFNBQVM7QUFBQSxRQUNYLENBQUM7QUFBQSxXQUVFO0FBQUE7QUFBQSxRQUVILE9BQU8sVUFBUyxRQUFRLFNBQVM7QUFBQSxVQUMvQixPQUFPO0FBQUEsVUFDUCxTQUFTO0FBQUEsUUFDWCxDQUFDO0FBQUE7QUFBQTtBQUFBLEVBS1AsR0FBRyxRQUFTLENBQUMsTUFBTSxPQUFPLFdBQVU7QUFBQSxJQUNsQyxNQUFNLFVBQVUsS0FBSyxNQUFNLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQztBQUFBLElBQ25ELFFBQVE7QUFBQSxXQUVEO0FBQUEsUUFDSCxPQUFPLE9BQU8sT0FBTztBQUFBLFdBRWxCO0FBQUEsUUFDSCxPQUFPLGdCQUFnQixTQUFTLENBQUM7QUFBQSxXQUU5QjtBQUFBLFFBQ0gsT0FBTyxVQUFTLGNBQWMsU0FBUyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQUEsV0FFdkQ7QUFBQSxRQUNILE9BQU8sVUFBUyxRQUFRLFNBQVM7QUFBQSxVQUMvQixPQUFPO0FBQUEsVUFDUCxTQUFTO0FBQUEsUUFDWCxDQUFDO0FBQUEsV0FFRTtBQUFBLFFBQ0gsT0FBTyxVQUFTLFFBQVEsU0FBUztBQUFBLFVBQy9CLE9BQU87QUFBQSxVQUNQLFNBQVM7QUFBQSxRQUNYLENBQUM7QUFBQSxXQUVFO0FBQUE7QUFBQSxRQUVILE9BQU8sVUFBUyxRQUFRLFNBQVM7QUFBQSxVQUMvQixPQUFPO0FBQUEsVUFDUCxTQUFTO0FBQUEsUUFDWCxDQUFDO0FBQUE7QUFBQTtBQUFBLEVBS1AsR0FBRyxRQUFTLENBQUMsTUFBTSxPQUFPLFdBQVU7QUFBQSxJQUNsQyxNQUFNLFFBQVEsS0FBSyxTQUFTO0FBQUEsSUFDNUIsUUFBUTtBQUFBLFdBQ0Q7QUFBQSxXQUNBO0FBQUEsUUFDSCxPQUFPLGdCQUFnQixFQUFFLE1BQU0sS0FBSztBQUFBLFdBRWpDO0FBQUEsUUFDSCxPQUFPLFVBQVMsY0FBYyxRQUFRLEdBQUcsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUFBLFdBRXZEO0FBQUEsUUFDSCxPQUFPLFVBQVMsTUFBTSxPQUFPO0FBQUEsVUFDM0IsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFFBQ1gsQ0FBQztBQUFBLFdBRUU7QUFBQSxRQUNILE9BQU8sVUFBUyxNQUFNLE9BQU87QUFBQSxVQUMzQixPQUFPO0FBQUEsVUFDUCxTQUFTO0FBQUEsUUFDWCxDQUFDO0FBQUEsV0FFRTtBQUFBO0FBQUEsUUFFSCxPQUFPLFVBQVMsTUFBTSxPQUFPLEVBQUUsT0FBTyxRQUFRLFNBQVMsYUFBYSxDQUFDO0FBQUE7QUFBQTtBQUFBLEVBSzNFLEdBQUcsUUFBUyxDQUFDLE1BQU0sT0FBTyxXQUFVO0FBQUEsSUFDbEMsTUFBTSxRQUFRLEtBQUssU0FBUztBQUFBLElBQzVCLFFBQVE7QUFBQSxXQUVEO0FBQUEsUUFDSCxPQUFPLE9BQU8sUUFBUSxDQUFDO0FBQUEsV0FFcEI7QUFBQSxRQUNILE9BQU8sZ0JBQWdCLFFBQVEsR0FBRyxDQUFDO0FBQUEsV0FFaEM7QUFBQSxRQUNILE9BQU8sVUFBUyxjQUFjLFFBQVEsR0FBRyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQUEsV0FFdkQ7QUFBQSxRQUNILE9BQU8sVUFBUyxNQUFNLE9BQU87QUFBQSxVQUMzQixPQUFPO0FBQUEsVUFDUCxTQUFTO0FBQUEsUUFDWCxDQUFDO0FBQUEsV0FFRTtBQUFBLFFBQ0gsT0FBTyxVQUFTLE1BQU0sT0FBTztBQUFBLFVBQzNCLE9BQU87QUFBQSxVQUNQLFNBQVM7QUFBQSxRQUNYLENBQUM7QUFBQSxXQUVFO0FBQUE7QUFBQSxRQUVILE9BQU8sVUFBUyxNQUFNLE9BQU8sRUFBRSxPQUFPLFFBQVEsU0FBUyxhQUFhLENBQUM7QUFBQTtBQUFBO0FBQUEsRUFLM0UsR0FBRyxRQUFTLENBQUMsTUFBTSxPQUFPLFdBQVUsU0FBUztBQUFBLElBQzNDLE1BQU0sT0FBTyxRQUFRLE1BQU0sT0FBTztBQUFBLElBRWxDLElBQUksVUFBVSxNQUFNO0FBQUEsTUFDbEIsT0FBTyxVQUFTLGNBQWMsTUFBTSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQUEsSUFDdEQ7QUFBQSxJQUVBLE9BQU8sZ0JBQWdCLE1BQU0sTUFBTSxNQUFNO0FBQUE7QUFBQSxFQUkzQyxHQUFHLFFBQVMsQ0FBQyxNQUFNLE9BQU8sV0FBVTtBQUFBLElBQ2xDLE1BQU0sVUFBVSxXQUFXLElBQUk7QUFBQSxJQUUvQixJQUFJLFVBQVUsTUFBTTtBQUFBLE1BQ2xCLE9BQU8sVUFBUyxjQUFjLFNBQVMsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUFBLElBQ3pEO0FBQUEsSUFFQSxPQUFPLGdCQUFnQixTQUFTLE1BQU0sTUFBTTtBQUFBO0FBQUEsRUFJOUMsR0FBRyxRQUFTLENBQUMsTUFBTSxPQUFPLFdBQVU7QUFBQSxJQUNsQyxJQUFJLFVBQVUsTUFBTTtBQUFBLE1BQ2xCLE9BQU8sVUFBUyxjQUFjLEtBQUssUUFBUSxHQUFHLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFBQSxJQUNoRTtBQUFBLElBRUEsT0FBTyxnQkFBZ0IsRUFBRSxNQUFNLEtBQUs7QUFBQTtBQUFBLEVBSXRDLEdBQUcsUUFBUyxDQUFDLE1BQU0sT0FBTyxXQUFVO0FBQUEsSUFDbEMsTUFBTSxZQUFZLGFBQWEsSUFBSTtBQUFBLElBRW5DLElBQUksVUFBVSxNQUFNO0FBQUEsTUFDbEIsT0FBTyxVQUFTLGNBQWMsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQUEsSUFDaEU7QUFBQSxJQUVBLE9BQU8sZ0JBQWdCLFdBQVcsTUFBTSxNQUFNO0FBQUE7QUFBQSxFQUloRCxHQUFHLFFBQVMsQ0FBQyxNQUFNLE9BQU8sV0FBVTtBQUFBLElBQ2xDLE1BQU0sWUFBWSxLQUFLLE9BQU87QUFBQSxJQUM5QixRQUFRO0FBQUEsV0FFRDtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsUUFDSCxPQUFPLFVBQVMsSUFBSSxXQUFXO0FBQUEsVUFDN0IsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFFBQ1gsQ0FBQztBQUFBLFdBRUU7QUFBQSxRQUNILE9BQU8sVUFBUyxJQUFJLFdBQVc7QUFBQSxVQUM3QixPQUFPO0FBQUEsVUFDUCxTQUFTO0FBQUEsUUFDWCxDQUFDO0FBQUEsV0FFRTtBQUFBLFFBQ0gsT0FBTyxVQUFTLElBQUksV0FBVztBQUFBLFVBQzdCLE9BQU87QUFBQSxVQUNQLFNBQVM7QUFBQSxRQUNYLENBQUM7QUFBQSxXQUVFO0FBQUE7QUFBQSxRQUVILE9BQU8sVUFBUyxJQUFJLFdBQVc7QUFBQSxVQUM3QixPQUFPO0FBQUEsVUFDUCxTQUFTO0FBQUEsUUFDWCxDQUFDO0FBQUE7QUFBQTtBQUFBLEVBS1AsR0FBRyxRQUFTLENBQUMsTUFBTSxPQUFPLFdBQVUsU0FBUztBQUFBLElBQzNDLE1BQU0sWUFBWSxLQUFLLE9BQU87QUFBQSxJQUM5QixNQUFNLGtCQUFrQixZQUFZLFFBQVEsZUFBZSxLQUFLLEtBQUs7QUFBQSxJQUNyRSxRQUFRO0FBQUEsV0FFRDtBQUFBLFFBQ0gsT0FBTyxPQUFPLGNBQWM7QUFBQSxXQUV6QjtBQUFBLFFBQ0gsT0FBTyxnQkFBZ0IsZ0JBQWdCLENBQUM7QUFBQSxXQUVyQztBQUFBLFFBQ0gsT0FBTyxVQUFTLGNBQWMsZ0JBQWdCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFBQSxXQUMxRDtBQUFBLFFBQ0gsT0FBTyxVQUFTLElBQUksV0FBVztBQUFBLFVBQzdCLE9BQU87QUFBQSxVQUNQLFNBQVM7QUFBQSxRQUNYLENBQUM7QUFBQSxXQUVFO0FBQUEsUUFDSCxPQUFPLFVBQVMsSUFBSSxXQUFXO0FBQUEsVUFDN0IsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFFBQ1gsQ0FBQztBQUFBLFdBRUU7QUFBQSxRQUNILE9BQU8sVUFBUyxJQUFJLFdBQVc7QUFBQSxVQUM3QixPQUFPO0FBQUEsVUFDUCxTQUFTO0FBQUEsUUFDWCxDQUFDO0FBQUEsV0FFRTtBQUFBO0FBQUEsUUFFSCxPQUFPLFVBQVMsSUFBSSxXQUFXO0FBQUEsVUFDN0IsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFFBQ1gsQ0FBQztBQUFBO0FBQUE7QUFBQSxFQUtQLEdBQUcsUUFBUyxDQUFDLE1BQU0sT0FBTyxXQUFVLFNBQVM7QUFBQSxJQUMzQyxNQUFNLFlBQVksS0FBSyxPQUFPO0FBQUEsSUFDOUIsTUFBTSxrQkFBa0IsWUFBWSxRQUFRLGVBQWUsS0FBSyxLQUFLO0FBQUEsSUFDckUsUUFBUTtBQUFBLFdBRUQ7QUFBQSxRQUNILE9BQU8sT0FBTyxjQUFjO0FBQUEsV0FFekI7QUFBQSxRQUNILE9BQU8sZ0JBQWdCLGdCQUFnQixNQUFNLE1BQU07QUFBQSxXQUVoRDtBQUFBLFFBQ0gsT0FBTyxVQUFTLGNBQWMsZ0JBQWdCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFBQSxXQUMxRDtBQUFBLFFBQ0gsT0FBTyxVQUFTLElBQUksV0FBVztBQUFBLFVBQzdCLE9BQU87QUFBQSxVQUNQLFNBQVM7QUFBQSxRQUNYLENBQUM7QUFBQSxXQUVFO0FBQUEsUUFDSCxPQUFPLFVBQVMsSUFBSSxXQUFXO0FBQUEsVUFDN0IsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFFBQ1gsQ0FBQztBQUFBLFdBRUU7QUFBQSxRQUNILE9BQU8sVUFBUyxJQUFJLFdBQVc7QUFBQSxVQUM3QixPQUFPO0FBQUEsVUFDUCxTQUFTO0FBQUEsUUFDWCxDQUFDO0FBQUEsV0FFRTtBQUFBO0FBQUEsUUFFSCxPQUFPLFVBQVMsSUFBSSxXQUFXO0FBQUEsVUFDN0IsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFFBQ1gsQ0FBQztBQUFBO0FBQUE7QUFBQSxFQUtQLEdBQUcsUUFBUyxDQUFDLE1BQU0sT0FBTyxXQUFVO0FBQUEsSUFDbEMsTUFBTSxZQUFZLEtBQUssT0FBTztBQUFBLElBQzlCLE1BQU0sZUFBZSxjQUFjLElBQUksSUFBSTtBQUFBLElBQzNDLFFBQVE7QUFBQSxXQUVEO0FBQUEsUUFDSCxPQUFPLE9BQU8sWUFBWTtBQUFBLFdBRXZCO0FBQUEsUUFDSCxPQUFPLGdCQUFnQixjQUFjLE1BQU0sTUFBTTtBQUFBLFdBRTlDO0FBQUEsUUFDSCxPQUFPLFVBQVMsY0FBYyxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFBQSxXQUV4RDtBQUFBLFFBQ0gsT0FBTyxVQUFTLElBQUksV0FBVztBQUFBLFVBQzdCLE9BQU87QUFBQSxVQUNQLFNBQVM7QUFBQSxRQUNYLENBQUM7QUFBQSxXQUVFO0FBQUEsUUFDSCxPQUFPLFVBQVMsSUFBSSxXQUFXO0FBQUEsVUFDN0IsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFFBQ1gsQ0FBQztBQUFBLFdBRUU7QUFBQSxRQUNILE9BQU8sVUFBUyxJQUFJLFdBQVc7QUFBQSxVQUM3QixPQUFPO0FBQUEsVUFDUCxTQUFTO0FBQUEsUUFDWCxDQUFDO0FBQUEsV0FFRTtBQUFBO0FBQUEsUUFFSCxPQUFPLFVBQVMsSUFBSSxXQUFXO0FBQUEsVUFDN0IsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFFBQ1gsQ0FBQztBQUFBO0FBQUE7QUFBQSxFQUtQLEdBQUcsUUFBUyxDQUFDLE1BQU0sT0FBTyxXQUFVO0FBQUEsSUFDbEMsTUFBTSxRQUFRLEtBQUssU0FBUztBQUFBLElBQzVCLE1BQU0scUJBQXFCLFFBQVEsTUFBTSxJQUFJLE9BQU87QUFBQSxJQUVwRCxRQUFRO0FBQUEsV0FDRDtBQUFBLFdBQ0E7QUFBQSxRQUNILE9BQU8sVUFBUyxVQUFVLG9CQUFvQjtBQUFBLFVBQzVDLE9BQU87QUFBQSxVQUNQLFNBQVM7QUFBQSxRQUNYLENBQUM7QUFBQSxXQUNFO0FBQUEsUUFDSCxPQUFPLFVBQ0osVUFBVSxvQkFBb0I7QUFBQSxVQUM3QixPQUFPO0FBQUEsVUFDUCxTQUFTO0FBQUEsUUFDWCxDQUFDLEVBQ0EsWUFBWTtBQUFBLFdBQ1o7QUFBQSxRQUNILE9BQU8sVUFBUyxVQUFVLG9CQUFvQjtBQUFBLFVBQzVDLE9BQU87QUFBQSxVQUNQLFNBQVM7QUFBQSxRQUNYLENBQUM7QUFBQSxXQUNFO0FBQUE7QUFBQSxRQUVILE9BQU8sVUFBUyxVQUFVLG9CQUFvQjtBQUFBLFVBQzVDLE9BQU87QUFBQSxVQUNQLFNBQVM7QUFBQSxRQUNYLENBQUM7QUFBQTtBQUFBO0FBQUEsRUFLUCxHQUFHLFFBQVMsQ0FBQyxNQUFNLE9BQU8sV0FBVTtBQUFBLElBQ2xDLE1BQU0sUUFBUSxLQUFLLFNBQVM7QUFBQSxJQUM1QixJQUFJO0FBQUEsSUFDSixJQUFJLFVBQVUsSUFBSTtBQUFBLE1BQ2hCLHFCQUFxQixjQUFjO0FBQUEsSUFDckMsRUFBTyxTQUFJLFVBQVUsR0FBRztBQUFBLE1BQ3RCLHFCQUFxQixjQUFjO0FBQUEsSUFDckMsRUFBTztBQUFBLE1BQ0wscUJBQXFCLFFBQVEsTUFBTSxJQUFJLE9BQU87QUFBQTtBQUFBLElBR2hELFFBQVE7QUFBQSxXQUNEO0FBQUEsV0FDQTtBQUFBLFFBQ0gsT0FBTyxVQUFTLFVBQVUsb0JBQW9CO0FBQUEsVUFDNUMsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFFBQ1gsQ0FBQztBQUFBLFdBQ0U7QUFBQSxRQUNILE9BQU8sVUFDSixVQUFVLG9CQUFvQjtBQUFBLFVBQzdCLE9BQU87QUFBQSxVQUNQLFNBQVM7QUFBQSxRQUNYLENBQUMsRUFDQSxZQUFZO0FBQUEsV0FDWjtBQUFBLFFBQ0gsT0FBTyxVQUFTLFVBQVUsb0JBQW9CO0FBQUEsVUFDNUMsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFFBQ1gsQ0FBQztBQUFBLFdBQ0U7QUFBQTtBQUFBLFFBRUgsT0FBTyxVQUFTLFVBQVUsb0JBQW9CO0FBQUEsVUFDNUMsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFFBQ1gsQ0FBQztBQUFBO0FBQUE7QUFBQSxFQUtQLEdBQUcsUUFBUyxDQUFDLE1BQU0sT0FBTyxXQUFVO0FBQUEsSUFDbEMsTUFBTSxRQUFRLEtBQUssU0FBUztBQUFBLElBQzVCLElBQUk7QUFBQSxJQUNKLElBQUksU0FBUyxJQUFJO0FBQUEsTUFDZixxQkFBcUIsY0FBYztBQUFBLElBQ3JDLEVBQU8sU0FBSSxTQUFTLElBQUk7QUFBQSxNQUN0QixxQkFBcUIsY0FBYztBQUFBLElBQ3JDLEVBQU8sU0FBSSxTQUFTLEdBQUc7QUFBQSxNQUNyQixxQkFBcUIsY0FBYztBQUFBLElBQ3JDLEVBQU87QUFBQSxNQUNMLHFCQUFxQixjQUFjO0FBQUE7QUFBQSxJQUdyQyxRQUFRO0FBQUEsV0FDRDtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsUUFDSCxPQUFPLFVBQVMsVUFBVSxvQkFBb0I7QUFBQSxVQUM1QyxPQUFPO0FBQUEsVUFDUCxTQUFTO0FBQUEsUUFDWCxDQUFDO0FBQUEsV0FDRTtBQUFBLFFBQ0gsT0FBTyxVQUFTLFVBQVUsb0JBQW9CO0FBQUEsVUFDNUMsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFFBQ1gsQ0FBQztBQUFBLFdBQ0U7QUFBQTtBQUFBLFFBRUgsT0FBTyxVQUFTLFVBQVUsb0JBQW9CO0FBQUEsVUFDNUMsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFFBQ1gsQ0FBQztBQUFBO0FBQUE7QUFBQSxFQUtQLEdBQUcsUUFBUyxDQUFDLE1BQU0sT0FBTyxXQUFVO0FBQUEsSUFDbEMsSUFBSSxVQUFVLE1BQU07QUFBQSxNQUNsQixJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUk7QUFBQSxNQUM5QixJQUFJLFVBQVU7QUFBQSxRQUFHLFFBQVE7QUFBQSxNQUN6QixPQUFPLFVBQVMsY0FBYyxPQUFPLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFBQSxJQUN2RDtBQUFBLElBRUEsT0FBTyxnQkFBZ0IsRUFBRSxNQUFNLEtBQUs7QUFBQTtBQUFBLEVBSXRDLEdBQUcsUUFBUyxDQUFDLE1BQU0sT0FBTyxXQUFVO0FBQUEsSUFDbEMsSUFBSSxVQUFVLE1BQU07QUFBQSxNQUNsQixPQUFPLFVBQVMsY0FBYyxLQUFLLFNBQVMsR0FBRyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQUEsSUFDakU7QUFBQSxJQUVBLE9BQU8sZ0JBQWdCLEVBQUUsTUFBTSxLQUFLO0FBQUE7QUFBQSxFQUl0QyxHQUFHLFFBQVMsQ0FBQyxNQUFNLE9BQU8sV0FBVTtBQUFBLElBQ2xDLE1BQU0sUUFBUSxLQUFLLFNBQVMsSUFBSTtBQUFBLElBRWhDLElBQUksVUFBVSxNQUFNO0FBQUEsTUFDbEIsT0FBTyxVQUFTLGNBQWMsT0FBTyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQUEsSUFDdkQ7QUFBQSxJQUVBLE9BQU8sZ0JBQWdCLE9BQU8sTUFBTSxNQUFNO0FBQUE7QUFBQSxFQUk1QyxHQUFHLFFBQVMsQ0FBQyxNQUFNLE9BQU8sV0FBVTtBQUFBLElBQ2xDLElBQUksUUFBUSxLQUFLLFNBQVM7QUFBQSxJQUMxQixJQUFJLFVBQVU7QUFBQSxNQUFHLFFBQVE7QUFBQSxJQUV6QixJQUFJLFVBQVUsTUFBTTtBQUFBLE1BQ2xCLE9BQU8sVUFBUyxjQUFjLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUFBLElBQ3ZEO0FBQUEsSUFFQSxPQUFPLGdCQUFnQixPQUFPLE1BQU0sTUFBTTtBQUFBO0FBQUEsRUFJNUMsR0FBRyxRQUFTLENBQUMsTUFBTSxPQUFPLFdBQVU7QUFBQSxJQUNsQyxJQUFJLFVBQVUsTUFBTTtBQUFBLE1BQ2xCLE9BQU8sVUFBUyxjQUFjLEtBQUssV0FBVyxHQUFHLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFBQSxJQUNyRTtBQUFBLElBRUEsT0FBTyxnQkFBZ0IsRUFBRSxNQUFNLEtBQUs7QUFBQTtBQUFBLEVBSXRDLEdBQUcsUUFBUyxDQUFDLE1BQU0sT0FBTyxXQUFVO0FBQUEsSUFDbEMsSUFBSSxVQUFVLE1BQU07QUFBQSxNQUNsQixPQUFPLFVBQVMsY0FBYyxLQUFLLFdBQVcsR0FBRyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQUEsSUFDckU7QUFBQSxJQUVBLE9BQU8sZ0JBQWdCLEVBQUUsTUFBTSxLQUFLO0FBQUE7QUFBQSxFQUl0QyxHQUFHLFFBQVMsQ0FBQyxNQUFNLE9BQU87QUFBQSxJQUN4QixPQUFPLGdCQUFnQixFQUFFLE1BQU0sS0FBSztBQUFBO0FBQUEsRUFJdEMsR0FBRyxRQUFTLENBQUMsTUFBTSxPQUFPLFdBQVc7QUFBQSxJQUNuQyxNQUFNLGlCQUFpQixLQUFLLGtCQUFrQjtBQUFBLElBRTlDLElBQUksbUJBQW1CLEdBQUc7QUFBQSxNQUN4QixPQUFPO0FBQUEsSUFDVDtBQUFBLElBRUEsUUFBUTtBQUFBLFdBRUQ7QUFBQSxRQUNILE9BQU8sa0NBQWtDLGNBQWM7QUFBQSxXQUtwRDtBQUFBLFdBQ0E7QUFBQSxRQUNILE9BQU8sZUFBZSxjQUFjO0FBQUEsV0FLakM7QUFBQSxXQUNBO0FBQUE7QUFBQSxRQUVILE9BQU8sZUFBZSxnQkFBZ0IsR0FBRztBQUFBO0FBQUE7QUFBQSxFQUsvQyxHQUFHLFFBQVMsQ0FBQyxNQUFNLE9BQU8sV0FBVztBQUFBLElBQ25DLE1BQU0saUJBQWlCLEtBQUssa0JBQWtCO0FBQUEsSUFFOUMsUUFBUTtBQUFBLFdBRUQ7QUFBQSxRQUNILE9BQU8sa0NBQWtDLGNBQWM7QUFBQSxXQUtwRDtBQUFBLFdBQ0E7QUFBQSxRQUNILE9BQU8sZUFBZSxjQUFjO0FBQUEsV0FLakM7QUFBQSxXQUNBO0FBQUE7QUFBQSxRQUVILE9BQU8sZUFBZSxnQkFBZ0IsR0FBRztBQUFBO0FBQUE7QUFBQSxFQUsvQyxHQUFHLFFBQVMsQ0FBQyxNQUFNLE9BQU8sV0FBVztBQUFBLElBQ25DLE1BQU0saUJBQWlCLEtBQUssa0JBQWtCO0FBQUEsSUFFOUMsUUFBUTtBQUFBLFdBRUQ7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFFBQ0gsT0FBTyxRQUFRLG9CQUFvQixnQkFBZ0IsR0FBRztBQUFBLFdBRW5EO0FBQUE7QUFBQSxRQUVILE9BQU8sUUFBUSxlQUFlLGdCQUFnQixHQUFHO0FBQUE7QUFBQTtBQUFBLEVBS3ZELEdBQUcsUUFBUyxDQUFDLE1BQU0sT0FBTyxXQUFXO0FBQUEsSUFDbkMsTUFBTSxpQkFBaUIsS0FBSyxrQkFBa0I7QUFBQSxJQUU5QyxRQUFRO0FBQUEsV0FFRDtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsUUFDSCxPQUFPLFFBQVEsb0JBQW9CLGdCQUFnQixHQUFHO0FBQUEsV0FFbkQ7QUFBQTtBQUFBLFFBRUgsT0FBTyxRQUFRLGVBQWUsZ0JBQWdCLEdBQUc7QUFBQTtBQUFBO0FBQUEsRUFLdkQsR0FBRyxRQUFTLENBQUMsTUFBTSxPQUFPLFdBQVc7QUFBQSxJQUNuQyxNQUFNLFlBQVksS0FBSyxNQUFNLENBQUMsT0FBTyxJQUFJO0FBQUEsSUFDekMsT0FBTyxnQkFBZ0IsV0FBVyxNQUFNLE1BQU07QUFBQTtBQUFBLEVBSWhELEdBQUcsUUFBUyxDQUFDLE1BQU0sT0FBTyxXQUFXO0FBQUEsSUFDbkMsT0FBTyxnQkFBZ0IsQ0FBQyxNQUFNLE1BQU0sTUFBTTtBQUFBO0FBRTlDO0FBRUEsU0FBUyxtQkFBbUIsQ0FBQyxRQUFRLFlBQVksSUFBSTtBQUFBLEVBQ25ELE1BQU0sT0FBTyxTQUFTLElBQUksTUFBTTtBQUFBLEVBQ2hDLE1BQU0sWUFBWSxLQUFLLElBQUksTUFBTTtBQUFBLEVBQ2pDLE1BQU0sUUFBUSxLQUFLLE1BQU0sWUFBWSxFQUFFO0FBQUEsRUFDdkMsTUFBTSxVQUFVLFlBQVk7QUFBQSxFQUM1QixJQUFJLFlBQVksR0FBRztBQUFBLElBQ2pCLE9BQU8sT0FBTyxPQUFPLEtBQUs7QUFBQSxFQUM1QjtBQUFBLEVBQ0EsT0FBTyxPQUFPLE9BQU8sS0FBSyxJQUFJLFlBQVksZ0JBQWdCLFNBQVMsQ0FBQztBQUFBO0FBR3RFLFNBQVMsaUNBQWlDLENBQUMsUUFBUSxXQUFXO0FBQUEsRUFDNUQsSUFBSSxTQUFTLE9BQU8sR0FBRztBQUFBLElBQ3JCLE1BQU0sT0FBTyxTQUFTLElBQUksTUFBTTtBQUFBLElBQ2hDLE9BQU8sT0FBTyxnQkFBZ0IsS0FBSyxJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUM7QUFBQSxFQUN4RDtBQUFBLEVBQ0EsT0FBTyxlQUFlLFFBQVEsU0FBUztBQUFBO0FBR3pDLFNBQVMsY0FBYyxDQUFDLFFBQVEsWUFBWSxJQUFJO0FBQUEsRUFDOUMsTUFBTSxPQUFPLFNBQVMsSUFBSSxNQUFNO0FBQUEsRUFDaEMsTUFBTSxZQUFZLEtBQUssSUFBSSxNQUFNO0FBQUEsRUFDakMsTUFBTSxRQUFRLGdCQUFnQixLQUFLLE1BQU0sWUFBWSxFQUFFLEdBQUcsQ0FBQztBQUFBLEVBQzNELE1BQU0sVUFBVSxnQkFBZ0IsWUFBWSxJQUFJLENBQUM7QUFBQSxFQUNqRCxPQUFPLE9BQU8sUUFBUSxZQUFZO0FBQUE7OztBQ3R3QnBDLElBQU0sb0JBQW9CLENBQUMsU0FBUyxnQkFBZTtBQUFBLEVBQ2pELFFBQVE7QUFBQSxTQUNEO0FBQUEsTUFDSCxPQUFPLFlBQVcsS0FBSyxFQUFFLE9BQU8sUUFBUSxDQUFDO0FBQUEsU0FDdEM7QUFBQSxNQUNILE9BQU8sWUFBVyxLQUFLLEVBQUUsT0FBTyxTQUFTLENBQUM7QUFBQSxTQUN2QztBQUFBLE1BQ0gsT0FBTyxZQUFXLEtBQUssRUFBRSxPQUFPLE9BQU8sQ0FBQztBQUFBLFNBQ3JDO0FBQUE7QUFBQSxNQUVILE9BQU8sWUFBVyxLQUFLLEVBQUUsT0FBTyxPQUFPLENBQUM7QUFBQTtBQUFBO0FBSTlDLElBQU0sb0JBQW9CLENBQUMsU0FBUyxnQkFBZTtBQUFBLEVBQ2pELFFBQVE7QUFBQSxTQUNEO0FBQUEsTUFDSCxPQUFPLFlBQVcsS0FBSyxFQUFFLE9BQU8sUUFBUSxDQUFDO0FBQUEsU0FDdEM7QUFBQSxNQUNILE9BQU8sWUFBVyxLQUFLLEVBQUUsT0FBTyxTQUFTLENBQUM7QUFBQSxTQUN2QztBQUFBLE1BQ0gsT0FBTyxZQUFXLEtBQUssRUFBRSxPQUFPLE9BQU8sQ0FBQztBQUFBLFNBQ3JDO0FBQUE7QUFBQSxNQUVILE9BQU8sWUFBVyxLQUFLLEVBQUUsT0FBTyxPQUFPLENBQUM7QUFBQTtBQUFBO0FBSTlDLElBQU0sd0JBQXdCLENBQUMsU0FBUyxnQkFBZTtBQUFBLEVBQ3JELE1BQU0sY0FBYyxRQUFRLE1BQU0sV0FBVyxLQUFLLENBQUM7QUFBQSxFQUNuRCxNQUFNLGNBQWMsWUFBWTtBQUFBLEVBQ2hDLE1BQU0sY0FBYyxZQUFZO0FBQUEsRUFFaEMsSUFBSSxDQUFDLGFBQWE7QUFBQSxJQUNoQixPQUFPLGtCQUFrQixTQUFTLFdBQVU7QUFBQSxFQUM5QztBQUFBLEVBRUEsSUFBSTtBQUFBLEVBRUosUUFBUTtBQUFBLFNBQ0Q7QUFBQSxNQUNILGlCQUFpQixZQUFXLFNBQVMsRUFBRSxPQUFPLFFBQVEsQ0FBQztBQUFBLE1BQ3ZEO0FBQUEsU0FDRztBQUFBLE1BQ0gsaUJBQWlCLFlBQVcsU0FBUyxFQUFFLE9BQU8sU0FBUyxDQUFDO0FBQUEsTUFDeEQ7QUFBQSxTQUNHO0FBQUEsTUFDSCxpQkFBaUIsWUFBVyxTQUFTLEVBQUUsT0FBTyxPQUFPLENBQUM7QUFBQSxNQUN0RDtBQUFBLFNBQ0c7QUFBQTtBQUFBLE1BRUgsaUJBQWlCLFlBQVcsU0FBUyxFQUFFLE9BQU8sT0FBTyxDQUFDO0FBQUEsTUFDdEQ7QUFBQTtBQUFBLEVBR0osT0FBTyxlQUNKLFFBQVEsWUFBWSxrQkFBa0IsYUFBYSxXQUFVLENBQUMsRUFDOUQsUUFBUSxZQUFZLGtCQUFrQixhQUFhLFdBQVUsQ0FBQztBQUFBO0FBRzVELElBQU0saUJBQWlCO0FBQUEsRUFDNUIsR0FBRztBQUFBLEVBQ0gsR0FBRztBQUNMOzs7QUMvREEsSUFBTSxtQkFBbUI7QUFDekIsSUFBTSxrQkFBa0I7QUFFeEIsSUFBTSxjQUFjLENBQUMsS0FBSyxNQUFNLE1BQU0sTUFBTTtBQUVyQyxTQUFTLHlCQUF5QixDQUFDLE9BQU87QUFBQSxFQUMvQyxPQUFPLGlCQUFpQixLQUFLLEtBQUs7QUFBQTtBQUc3QixTQUFTLHdCQUF3QixDQUFDLE9BQU87QUFBQSxFQUM5QyxPQUFPLGdCQUFnQixLQUFLLEtBQUs7QUFBQTtBQUc1QixTQUFTLHlCQUF5QixDQUFDLE9BQU8sUUFBUSxPQUFPO0FBQUEsRUFDOUQsTUFBTSxXQUFXLFFBQVEsT0FBTyxRQUFRLEtBQUs7QUFBQSxFQUM3QyxRQUFRLEtBQUssUUFBUTtBQUFBLEVBQ3JCLElBQUksWUFBWSxTQUFTLEtBQUs7QUFBQSxJQUFHLE1BQU0sSUFBSSxXQUFXLFFBQVE7QUFBQTtBQUdoRSxTQUFTLE9BQU8sQ0FBQyxPQUFPLFFBQVEsT0FBTztBQUFBLEVBQ3JDLE1BQU0sVUFBVSxNQUFNLE9BQU8sTUFBTSxVQUFVO0FBQUEsRUFDN0MsT0FBTyxTQUFTLE1BQU0sWUFBWSxvQkFBb0IsaUJBQWlCLDRCQUE0QiwwQkFBMEI7QUFBQTs7O0FDTS9ILElBQU0seUJBQ0o7QUFJRixJQUFNLDZCQUE2QjtBQUVuQyxJQUFNLHNCQUFzQjtBQUM1QixJQUFNLG9CQUFvQjtBQUMxQixJQUFNLGdDQUFnQztBQW9TL0IsU0FBUyxNQUFNLENBQUMsTUFBTSxXQUFXLFNBQVM7QUFBQSxFQUMvQyxNQUFNLGtCQUFpQixrQkFBa0I7QUFBQSxFQUN6QyxNQUFNLFNBQVMsU0FBUyxVQUFVLGdCQUFlLFVBQVU7QUFBQSxFQUUzRCxNQUFNLHdCQUNKLFNBQVMseUJBQ1QsU0FBUyxRQUFRLFNBQVMseUJBQzFCLGdCQUFlLHlCQUNmLGdCQUFlLFFBQVEsU0FBUyx5QkFDaEM7QUFBQSxFQUVGLE1BQU0sZUFDSixTQUFTLGdCQUNULFNBQVMsUUFBUSxTQUFTLGdCQUMxQixnQkFBZSxnQkFDZixnQkFBZSxRQUFRLFNBQVMsZ0JBQ2hDO0FBQUEsRUFFRixNQUFNLGVBQWUsT0FBTyxNQUFNLFNBQVMsRUFBRTtBQUFBLEVBRTdDLElBQUksQ0FBQyxRQUFRLFlBQVksR0FBRztBQUFBLElBQzFCLE1BQU0sSUFBSSxXQUFXLG9CQUFvQjtBQUFBLEVBQzNDO0FBQUEsRUFFQSxJQUFJLFFBQVEsVUFDVCxNQUFNLDBCQUEwQixFQUNoQyxJQUFJLENBQUMsY0FBYztBQUFBLElBQ2xCLE1BQU0saUJBQWlCLFVBQVU7QUFBQSxJQUNqQyxJQUFJLG1CQUFtQixPQUFPLG1CQUFtQixLQUFLO0FBQUEsTUFDcEQsTUFBTSxnQkFBZ0IsZUFBZTtBQUFBLE1BQ3JDLE9BQU8sY0FBYyxXQUFXLE9BQU8sVUFBVTtBQUFBLElBQ25EO0FBQUEsSUFDQSxPQUFPO0FBQUEsR0FDUixFQUNBLEtBQUssRUFBRSxFQUNQLE1BQU0sc0JBQXNCLEVBQzVCLElBQUksQ0FBQyxjQUFjO0FBQUEsSUFFbEIsSUFBSSxjQUFjLE1BQU07QUFBQSxNQUN0QixPQUFPLEVBQUUsU0FBUyxPQUFPLE9BQU8sSUFBSTtBQUFBLElBQ3RDO0FBQUEsSUFFQSxNQUFNLGlCQUFpQixVQUFVO0FBQUEsSUFDakMsSUFBSSxtQkFBbUIsS0FBSztBQUFBLE1BQzFCLE9BQU8sRUFBRSxTQUFTLE9BQU8sT0FBTyxtQkFBbUIsU0FBUyxFQUFFO0FBQUEsSUFDaEU7QUFBQSxJQUVBLElBQUksV0FBVyxpQkFBaUI7QUFBQSxNQUM5QixPQUFPLEVBQUUsU0FBUyxNQUFNLE9BQU8sVUFBVTtBQUFBLElBQzNDO0FBQUEsSUFFQSxJQUFJLGVBQWUsTUFBTSw2QkFBNkIsR0FBRztBQUFBLE1BQ3ZELE1BQU0sSUFBSSxXQUNSLG1FQUNFLGlCQUNBLEdBQ0o7QUFBQSxJQUNGO0FBQUEsSUFFQSxPQUFPLEVBQUUsU0FBUyxPQUFPLE9BQU8sVUFBVTtBQUFBLEdBQzNDO0FBQUEsRUFHSCxJQUFJLE9BQU8sU0FBUyxjQUFjO0FBQUEsSUFDaEMsUUFBUSxPQUFPLFNBQVMsYUFBYSxjQUFjLEtBQUs7QUFBQSxFQUMxRDtBQUFBLEVBRUEsTUFBTSxtQkFBbUI7QUFBQSxJQUN2QjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUFBLEVBRUEsT0FBTyxNQUNKLElBQUksQ0FBQyxVQUFTO0FBQUEsSUFDYixJQUFJLENBQUMsTUFBSztBQUFBLE1BQVMsT0FBTyxNQUFLO0FBQUEsSUFFL0IsTUFBTSxRQUFRLE1BQUs7QUFBQSxJQUVuQixJQUNHLENBQUMsU0FBUywrQkFDVCx5QkFBeUIsS0FBSyxLQUMvQixDQUFDLFNBQVMsZ0NBQ1QsMEJBQTBCLEtBQUssR0FDakM7QUFBQSxNQUNBLDBCQUEwQixPQUFPLFdBQVcsT0FBTyxJQUFJLENBQUM7QUFBQSxJQUMxRDtBQUFBLElBRUEsTUFBTSxZQUFZLFdBQVcsTUFBTTtBQUFBLElBQ25DLE9BQU8sVUFBVSxjQUFjLE9BQU8sT0FBTyxVQUFVLGdCQUFnQjtBQUFBLEdBQ3hFLEVBQ0EsS0FBSyxFQUFFO0FBQUE7QUFHWixTQUFTLGtCQUFrQixDQUFDLE9BQU87QUFBQSxFQUNqQyxNQUFNLFVBQVUsTUFBTSxNQUFNLG1CQUFtQjtBQUFBLEVBRS9DLElBQUksQ0FBQyxTQUFTO0FBQUEsSUFDWixPQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsT0FBTyxRQUFRLEdBQUcsUUFBUSxtQkFBbUIsR0FBRztBQUFBOzs7QUN0YWxELGVBQXNCLGlCQUFpQixDQUFDLFNBQXdDLE9BQXNCOzs7QUNtQi9GLFNBQVMsWUFBb0gsQ0FBQyxTQUF3QixNQUFjLFdBQTJCO0FBQUEsRUFDbE0sTUFBTSxTQUFTLENBQUM7QUFBQSxFQUVoQixPQUFPLElBQUk7QUFBQSxJQUNQLE1BQU0sQ0FBQztBQUFBLElBQ1AsTUFBTSxJQUFJO0FBQUEsSUFDVixRQUFRLENBQUMsWUFBc0I7QUFBQSxNQUMzQixJQUFJLENBQUMsUUFBUTtBQUFBLFFBQW9CO0FBQUEsTUFDakMsT0FBTyxRQUFRLG1CQUFtQixTQUFTLE9BQU8sRUFBRSxNQUFNLE9BQU8sRUFBRSxJQUFJO0FBQUE7QUFBQSxFQUUvRTtBQUFBLEVBRUEsTUFBTSxZQUFZLENBQUMsS0FBYSxVQUF5QjtBQUFBLElBQ3JELE9BQU8sRUFBRSxLQUFLLElBQUksS0FBSyxLQUFLO0FBQUE7QUFBQSxFQUVoQyxNQUFNLFlBQVksQ0FBQyxRQUFrQjtBQUFBLElBQ2pDLE1BQU0sWUFBWSxRQUFRLG9CQUNwQixRQUFRLG9CQUNSLENBQUMsU0FBYTtBQUFBLE1BQ1osT0FBTSxDQUFDLEdBQUcsSUFBRztBQUFBLE1BQ2IsS0FBSSxLQUFLO0FBQUEsRUFBSyxLQUFJO0FBQUEsTUFDbEIsUUFBUSxJQUFJLEdBQUcsSUFBRztBQUFBLE1BQ2xCLE9BQU87QUFBQTtBQUFBLElBR2YsSUFBSSxDQUFDLFVBQVUsR0FBRztBQUFBLE1BQUcsT0FBTztBQUFBLElBRTVCLE9BQU8sRUFBRSxLQUFLLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUFBLElBRTNCLElBQUksUUFBUSxTQUFTO0FBQUEsTUFDWixrQkFBa0IsU0FBUztBQUFBLFFBQzVCLE1BQU07QUFBQSxRQUNOO0FBQUEsTUFDSixDQUFDO0FBQUEsSUFDTDtBQUFBLElBRUEsT0FBTztBQUFBO0FBQUEsRUFHWCxPQUFPLFNBQVMsQ0FBQyxLQUFhLFVBQW1CLFVBQVUsS0FBSyxLQUFLO0FBQUEsRUFDckUsT0FBTyxTQUFTLElBQUksUUFBYSxVQUFVLEdBQUc7QUFBQSxFQUU5QyxNQUFNLFNBQVMsTUFBTSxHQUFHLE9BQU8sSUFBSSxNQUFRLHVCQUF1QjtBQUFBLEVBRWxFLE9BQU8sUUFBUSxDQUFDLGdCQUF3QixXQUEyQixVQUFVLENBQUMsV0FBVyxNQUFNLFdBQVcsT0FBTyxHQUFHO0FBQUEsRUFBSyxlQUFlLEdBQUcsTUFBTSxDQUFDO0FBQUEsRUFDbEosT0FBTyxPQUFPLENBQUMsZ0JBQXdCLFdBQTJCLFVBQVUsQ0FBQyxVQUFVLE1BQU0sV0FBVyxPQUFPLEdBQUc7QUFBQSxFQUFLLGVBQWUsR0FBRyxNQUFNLENBQUM7QUFBQSxFQUNoSixPQUFPLE9BQU8sQ0FBQyxnQkFBd0IsV0FBMkIsVUFBVSxDQUFDLFVBQVUsTUFBTSxXQUFXLE9BQU8sR0FBRztBQUFBLEVBQUssZUFBZSxHQUFHLE1BQU0sQ0FBQztBQUFBLEVBQ2hKLE9BQU8sUUFBUSxDQUFDLGdCQUF3QixXQUEyQixVQUFVLENBQUMsV0FBVyxNQUFNLFdBQVcsT0FBTyxHQUFHO0FBQUEsRUFBSyxlQUFlLEdBQUcsTUFBTSxDQUFDO0FBQUEsRUFDbEosT0FBTyxVQUFVLENBQUMsZ0JBQXdCLFdBQTJCLFVBQVUsQ0FBQyxhQUFhLE1BQU0sV0FBVyxPQUFPLEdBQUc7QUFBQSxFQUFLLGVBQWUsR0FBRyxNQUFNLENBQUM7QUFBQSxFQUN0SixPQUFPLFdBQVcsQ0FBQyxnQkFBd0IsV0FBMkIsVUFBVSxDQUFDLGNBQWMsTUFBTSxXQUFXLE9BQU8sR0FBRztBQUFBLEVBQUssZUFBZSxHQUFHLE1BQU0sQ0FBQztBQUFBLEVBRXhKLE9BQU87QUFBQTs7QUNoRUosU0FBUyxVQUFVLEdBQWM7QUFBQSxFQUN0QyxNQUFNLGlCQUFpQjtBQUFBLElBQ3JCLGFBQWE7QUFBQSxJQUNiLFFBQVEsQ0FBQztBQUFBLElBQ1QsSUFBSSxDQUFDLFNBQXVDO0FBQUEsTUFDMUMsZUFBZSxPQUFPLEtBQUssT0FBTztBQUFBLE1BQ2xDLE9BQU87QUFBQTtBQUFBLFNBRUgsSUFBRyxHQUFHO0FBQUEsTUFDVixJQUFJLFFBQVEsQ0FBQztBQUFBLE1BQ2IsV0FBVyxRQUFRLGVBQWUsUUFBUTtBQUFBLFFBQ3hDLFFBQVEsS0FBSyxVQUFXLE1BQU0sS0FBSyxLQUFLLEVBQUc7QUFBQSxNQUM3QztBQUFBLE1BQ0EsTUFBTSxTQUEyQixDQUFDO0FBQUEsTUFDbEMsV0FBVyxPQUFPLE9BQU87QUFBQSxRQUN2QixNQUFNLFFBQVMsTUFBYztBQUFBLFFBQzdCLElBQUksQ0FBQyxJQUFJLFdBQVcsR0FBRztBQUFBLFVBQUcsT0FBTyxPQUFPO0FBQUEsTUFDMUM7QUFBQSxNQUNBLE9BQU87QUFBQTtBQUFBLEVBRVg7QUFBQSxFQUNBLE9BQU87QUFBQTs7QUNsQ0YsTUFBTSxLQUFRO0FBQUEsRUFDWDtBQUFBLEVBRVIsV0FBVyxHQUFHO0FBQUEsSUFDWixLQUFLLE9BQU8sSUFBSTtBQUFBO0FBQUEsRUFHbEIsR0FBRyxDQUFDLE1BQWMsT0FBZ0I7QUFBQSxJQUNoQyxNQUFNLFFBQVEsS0FDWCxRQUFRLGNBQWMsRUFBRSxFQUN4QixNQUFNLEdBQUcsRUFDVCxPQUFPLENBQUMsTUFBTSxNQUFNLEVBQUU7QUFBQSxJQUN6QixJQUFJLGNBQWMsS0FBSztBQUFBLElBQ3ZCLElBQUksTUFBTSxXQUFXLEdBQUc7QUFBQSxNQUN0QixZQUFZLFFBQVE7QUFBQSxNQUNwQjtBQUFBLElBQ0Y7QUFBQSxJQUNBLFdBQVcsU0FBUSxPQUFPO0FBQUEsTUFDeEIsSUFBSSxDQUFDLFlBQVksU0FBUyxJQUFJLEtBQUksR0FBRztBQUFBLFFBQ25DLFlBQVksU0FBUyxJQUFJLE9BQU0sSUFBSSxRQUFVO0FBQUEsTUFDL0M7QUFBQSxNQUNBLGNBQWMsWUFBWSxTQUFTLElBQUksS0FBSTtBQUFBLElBQzdDO0FBQUEsSUFDQSxZQUFZLFFBQVE7QUFBQTtBQUFBLEVBR3RCLEdBQUcsQ0FBQyxNQUF3QjtBQUFBLElBQzFCLE1BQU0sUUFBUSxLQUNYLFFBQVEsY0FBYyxFQUFFLEVBQ3hCLE1BQU0sR0FBRyxFQUNULE9BQU8sQ0FBQyxNQUFNLE1BQU0sRUFBRTtBQUFBLElBQ3pCLElBQUksY0FBYyxLQUFLO0FBQUEsSUFDdkIsV0FBVyxTQUFRLE9BQU87QUFBQSxNQUN4QixJQUFJLENBQUMsWUFBWSxTQUFTLElBQUksS0FBSTtBQUFBLFFBQUcsT0FBTztBQUFBLE1BQzVDLGNBQWMsWUFBWSxTQUFTLElBQUksS0FBSTtBQUFBLElBQzdDO0FBQUEsSUFDQSxPQUFPLFlBQVk7QUFBQTtBQUFBLEVBR3JCLEdBQUcsQ0FBQyxNQUF1QjtBQUFBLElBQ3pCLE1BQU0sUUFBUSxLQUNYLFFBQVEsY0FBYyxFQUFFLEVBQ3hCLE1BQU0sR0FBRyxFQUNULE9BQU8sQ0FBQyxNQUFNLE1BQU0sRUFBRTtBQUFBLElBQ3pCLElBQUksY0FBYyxLQUFLO0FBQUEsSUFDdkIsSUFBSSxNQUFNLFdBQVc7QUFBQSxNQUFHLE9BQU8sWUFBWSxVQUFVO0FBQUEsSUFDckQsV0FBVyxTQUFRLE9BQU87QUFBQSxNQUN4QixJQUFJLENBQUMsWUFBWSxTQUFTLElBQUksS0FBSTtBQUFBLFFBQUcsT0FBTztBQUFBLE1BQ3ZDO0FBQUEsc0JBQWMsWUFBWSxTQUFTLElBQUksS0FBSTtBQUFBLElBQ2xEO0FBQUEsSUFDQSxPQUFPLFlBQVksVUFBVTtBQUFBO0FBRWpDO0FBQUE7QUFFQSxNQUFNLFNBQVk7QUFBQSxFQUNoQjtBQUFBLEVBQ0E7QUFBQSxFQUVBLFdBQVcsR0FBRztBQUFBLElBQ1osS0FBSyxXQUFXLElBQUk7QUFBQSxJQUNwQixLQUFLLFFBQVE7QUFBQTtBQUVqQjs7O0FDNUNPLFNBQVMsY0FBYyxDQUFDLFdBQTBCLFNBQWMsVUFBNkM7QUFBQSxFQUNoSCxNQUFNLE9BQU8sUUFBUTtBQUFBLEVBQ3JCLE1BQU0sT0FBTyxJQUFJO0FBQUEsRUFDakIsTUFBTSxRQUFRLE9BQU8sWUFLSTtBQUFBLElBQ3JCLElBQUksUUFBUSxRQUFRLFdBQVcsV0FBVztBQUFBLE1BQ3RDLE9BQU8sSUFBSSxTQUFTLFdBQVc7QUFBQSxRQUMzQixTQUFTO0FBQUEsVUFDTCxnQ0FBZ0MsUUFBUSxNQUFNLG9CQUFvQjtBQUFBLFVBQ2xFLCtCQUErQixRQUFRLE1BQU0sbUJBQW1CO0FBQUEsVUFDaEUsZ0NBQWdDLFFBQVEsTUFBTSxvQkFBb0I7QUFBQSxRQUN0RTtBQUFBLE1BQ0osQ0FBQztBQUFBLElBQ0w7QUFBQSxJQUVBLElBQUksUUFBUSxRQUFRLElBQUksU0FBUyxlQUFlLEdBQUc7QUFBQSxNQUMvQyxPQUFPLElBQUksU0FBUyxNQUFNO0FBQUEsUUFDdEIsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBLFVBQ0wsUUFBUTtBQUFBLFVBQ1IsZ0NBQWdDLFFBQVEsTUFBTSxvQkFBb0I7QUFBQSxVQUNsRSwrQkFBK0IsUUFBUSxNQUFNLG1CQUFtQjtBQUFBLFVBQ2hFLGdDQUFnQyxRQUFRLE1BQU0sb0JBQW9CO0FBQUEsVUFDbEUsaUJBQWlCO0FBQUEsVUFDakIsZ0JBQWdCLG9CQUFvQixLQUFLLElBQUk7QUFBQSxRQUNqRDtBQUFBLE1BQ0osQ0FBQztBQUFBLElBQ0w7QUFBQSxJQUVBLE1BQU0sTUFBTSxJQUFJLElBQUksUUFBUSxRQUFRLEdBQUc7QUFBQSxJQUN2QyxJQUFJLFlBQVksSUFBSSxTQUFTLFVBQVUsQ0FBQyxFQUFFLE1BQU0sR0FBRztBQUFBLElBQ25ELElBQUksUUFBUSxhQUFhLFVBQVUsR0FBRyxDQUFDLE1BQU0sUUFBUSxXQUFXO0FBQUEsTUFDNUQsT0FBTyxJQUFJLFNBQVMsV0FBVztBQUFBLFFBQzNCLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQSxVQUNMLGdDQUFnQyxRQUFRLE1BQU0sb0JBQW9CO0FBQUEsVUFDbEUsK0JBQStCLFFBQVEsTUFBTSxtQkFBbUI7QUFBQSxVQUNoRSxnQ0FBZ0MsUUFBUSxNQUFNLG9CQUFvQjtBQUFBLFFBQ3RFO0FBQUEsTUFDSixDQUFDO0FBQUEsSUFDTDtBQUFBLElBQ0EsSUFBSSxRQUFRLG9CQUFvQixhQUFhLFFBQVEsb0JBQW9CO0FBQUEsTUFBRyxZQUFZLFVBQVUsTUFBTSxRQUFRLGVBQWU7QUFBQSxJQUMvSCxNQUFNLGFBQWEsSUFBSSxVQUFVLEtBQUssR0FBRztBQUFBLElBRXpDLE1BQU0sWUFBWSxTQUFTLFlBQVksTUFBTSxRQUFRLFVBQVUsUUFBUSxRQUFRLE9BQU8sSUFBSSxXQUFXO0FBQUEsSUFFckcsTUFBTSxTQUFTLGFBQWEsU0FBUyxZQUFZLFNBQVM7QUFBQSxJQUMxRCxRQUFRLFFBQVEsUUFBUSxJQUFJLFdBQVcsRUFBRSxPQUFPLENBQUM7QUFBQSxJQUNqRCxNQUFNLFdBQStCO0FBQUEsTUFDakMsTUFBTTtBQUFBLE1BQ04sUUFBUTtBQUFBLE1BQ1IsU0FBUztBQUFBLFFBQ0wsZ0NBQWdDLFFBQVEsTUFBTSxvQkFBb0I7QUFBQSxRQUNsRSwrQkFBK0IsUUFBUSxNQUFNLG1CQUFtQjtBQUFBLFFBQ2hFLGdDQUFnQyxRQUFRLE1BQU0sb0JBQW9CO0FBQUEsUUFDbEUsaUJBQWlCO0FBQUEsUUFDakIsZ0JBQWdCO0FBQUEsTUFDcEI7QUFBQSxJQUNKO0FBQUEsSUFFQSxJQUFJLFVBQTZDLENBQUM7QUFBQSxJQUdsRCxNQUFNLE9BQVEsT0FBTyxZQUFZO0FBQUEsTUFDN0IsTUFBTSxLQUFLLFFBQVEsU0FBUyxRQUFRLE9BQU8sUUFBUSxRQUFRLE9BQU8sSUFBSTtBQUFBLE1BQ3RFLE1BQU0sU0FBUztBQUFBLFFBQ1gsUUFBUSxNQUFNLFFBQVEsUUFBUSxLQUFLO0FBQUEsUUFDbkMsUUFBUTtBQUFBLE1BQ1o7QUFBQSxNQUVBLE9BQU87QUFBQSxRQUNIO0FBQUEsUUFDQTtBQUFBLFFBQ0EsTUFBTSxFQUFFLFFBQVEsWUFBd0QsT0FBTyxVQUFVO0FBQUEsUUFDekY7QUFBQSxRQUNBLFNBQVMsUUFBUTtBQUFBLFFBQ2pCO0FBQUEsTUFDSjtBQUFBLE9BQ0Q7QUFBQSxJQUVILE1BQU0sVUFBZSxFQUFFLE9BQU87QUFBQSxJQUM5QixJQUFJO0FBQUEsTUFDQSxNQUFNLFFBQVEsS0FBSyxzQkFBc0IsRUFBRSxXQUFXLFFBQVEsTUFBTSxLQUFLLEtBQUssUUFBa0IsTUFBTSxPQUFPLENBQUM7QUFBQSxNQUU5RyxJQUFJLENBQUMsUUFBUSxRQUFRLFFBQVEsSUFBSSxRQUFRLEdBQUcsV0FBVyxtQkFBbUIsR0FBRztBQUFBLFFBRXpFLElBQUksY0FBYyxRQUFRO0FBQUEsUUFDMUIsSUFBSSxDQUFDLGFBQWE7QUFBQSxVQUNkLGNBQWMsS0FBSyxJQUFJLEtBQUssS0FBSyxNQUFnQjtBQUFBLFVBQ2pELElBQUksZ0JBQWdCLE1BQU07QUFBQSxZQUN0QixjQUFjLFVBQVUsY0FBYyxLQUFLLEtBQUs7QUFBQSxZQUNoRCxJQUFJLGdCQUFnQixXQUFXO0FBQUEsY0FDM0IsTUFBTSxRQUFRLEtBQUssdUJBQXVCLEVBQUUsV0FBVyxRQUFRLE1BQU0sS0FBSyxLQUFLLFFBQWtCLE1BQU0sT0FBTyxDQUFDO0FBQUEsY0FDL0csTUFBTSxPQUFPLGFBQWEsRUFBRSxNQUFNLEtBQUssS0FBSyxPQUFpQixDQUFDO0FBQUEsWUFDbEU7QUFBQSxZQUNBLElBQUksT0FBTyxZQUFZLFdBQVc7QUFBQSxjQUFZLFlBQVksU0FBUyxNQUFNLFlBQVk7QUFBQSxZQUNoRjtBQUFBLDBCQUFZLFNBQVMsTUFBTSxZQUFZLE9BQU87QUFBQSxZQUNuRCxLQUFLLElBQUksS0FBSyxLQUFLLFFBQWtCLFdBQVc7QUFBQSxVQUNwRDtBQUFBLFVBRUEsSUFBSSxZQUFZLFNBQVM7QUFBQSxZQUFVLE1BQU0sT0FBTyxnQkFBZ0IsRUFBRSxVQUFVLFVBQVUsU0FBUyx5TEFBeUwsQ0FBQztBQUFBLFFBQzdSO0FBQUEsUUFFQSxRQUFRLE9BQU87QUFBQSxRQUNmLFFBQVEsVUFBVSxLQUFLLFFBQVE7QUFBQSxRQUUvQixNQUFNLFdBQVcsTUFBTSxTQUFTLFVBQVUsYUFBYTtBQUFBLFVBQ25ELGtCQUFrQjtBQUFBLFVBQ2xCLGVBQWU7QUFBQSxVQUNmLE1BQU0sS0FBSyxLQUFLO0FBQUEsVUFDaEIsU0FBUyxRQUFRLFFBQVE7QUFBQSxVQUN6QjtBQUFBLFVBQ0EsUUFBUSxLQUFLLE9BQU87QUFBQSxVQUNwQixZQUFZO0FBQUEsUUFDaEIsQ0FBQztBQUFBLFFBQ0QsVUFBVSxTQUFTO0FBQUEsUUFFbkIsSUFBSSxTQUFTLFNBQVMsTUFBTSxTQUFTLFFBQVEsVUFBVSxXQUFXO0FBQUEsVUFDOUQsSUFBSSxTQUFTLGFBQWE7QUFBQSxZQUN0QixTQUFTLE9BQU8sMkJBQTJCO0FBQUEsVUFDL0MsRUFBTyxTQUFJLFNBQVMsbUJBQW1CO0FBQUEsWUFDbkMsU0FBUyxPQUFPLFdBQVcsWUFBWSxjQUFjLFNBQVMsUUFBUSxLQUFLLGtCQUFrQjtBQUFBLFVBQ2pHLEVBQU87QUFBQSxZQUNILFNBQVMsT0FBTyxXQUFXLEtBQUssVUFBVSxTQUFTLFFBQVEsS0FBSyxrQkFBa0I7QUFBQTtBQUFBLFFBRTFGO0FBQUEsUUFFQSxNQUFNLFFBQVEsS0FBSyx1QkFBdUIsRUFBRSxXQUFXLFFBQVEsTUFBTSxLQUFLLEtBQUssUUFBa0IsTUFBTSxTQUFTLEtBQUssUUFBUSxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsTUFBTSxPQUFPLENBQUM7QUFBQSxRQUV4TCxXQUFXLFdBQVcsU0FBUztBQUFBLFVBQzNCLElBQUk7QUFBQSxZQUNBLE1BQU0sUUFBUTtBQUFBLFlBQ2hCLE9BQU8sT0FBTztBQUFBLFlBQ1osT0FBTyxNQUFNLHVDQUF1QyxLQUFLO0FBQUE7QUFBQSxRQUVqRTtBQUFBLFFBRUEsUUFBUSxRQUFRLFFBQVEsT0FBTyxTQUFTO0FBQUEsUUFDeEMsT0FBTyxJQUFJLFNBQVMsU0FBUyxNQUFNLFFBQVE7QUFBQSxNQUMvQyxFQUFPO0FBQUEsUUFFSCxJQUFJLGNBQWMsUUFBUTtBQUFBLFFBQzFCLElBQUksQ0FBQyxhQUFhO0FBQUEsVUFDZCxjQUFjLEtBQUssSUFBSSxLQUFLLEtBQUssTUFBZ0I7QUFBQSxVQUNqRCxJQUFJLGdCQUFnQixNQUFNO0FBQUEsWUFDdEIsY0FBYyxVQUFVLGNBQWMsS0FBSyxLQUFLO0FBQUEsWUFDaEQsSUFBSSxnQkFBZ0IsV0FBVztBQUFBLGNBQzNCLE1BQU0sUUFBUSxLQUFLLHVCQUF1QixFQUFFLFdBQVcsUUFBUSxNQUFNLEtBQUssS0FBSyxRQUFrQixNQUFNLE9BQU8sQ0FBQztBQUFBLGNBQy9HLE1BQU0sT0FBTyxhQUFhLEVBQUUsTUFBTSxLQUFLLEtBQUssT0FBaUIsQ0FBQztBQUFBLFlBQ2xFO0FBQUEsWUFDQSxJQUFJLE9BQU8sWUFBWSxXQUFXO0FBQUEsY0FBWSxZQUFZLFNBQVMsTUFBTSxZQUFZO0FBQUEsWUFDaEY7QUFBQSwwQkFBWSxTQUFTLE1BQU0sWUFBWSxPQUFPO0FBQUEsWUFDbkQsS0FBSyxJQUFJLEtBQUssS0FBSyxRQUFrQixXQUFXO0FBQUEsVUFDcEQ7QUFBQSxVQUNBLElBQUksWUFBWSxTQUFTO0FBQUEsWUFBVSxNQUFNLE9BQU8sZ0JBQWdCLEVBQUUsVUFBVSxVQUFVLFNBQVMsMkxBQTJMLENBQUM7QUFBQSxRQUMvUjtBQUFBLFFBRUEsTUFBTSxjQUFjLFlBQVk7QUFBQSxVQUM1QixRQUFRLFFBQVEsUUFBUSxPQUFPLFNBQVM7QUFBQSxVQUN4QyxXQUFXLFdBQVcsU0FBUztBQUFBLFlBQzNCLElBQUk7QUFBQSxjQUNBLE1BQU0sUUFBUTtBQUFBLGNBQ2hCLE9BQU8sT0FBTztBQUFBLGNBQ1osT0FBTyxNQUFNLHVDQUF1QyxLQUFLO0FBQUE7QUFBQSxVQUVqRTtBQUFBO0FBQUEsUUFHSixRQUFRLE9BQU87QUFBQSxRQUNmLFFBQVEsVUFBVSxLQUFLLFFBQVE7QUFBQSxRQUUvQixNQUFNLFdBQVcsTUFBTSxTQUFTLFVBQVUsYUFBYTtBQUFBLFVBQ25ELGtCQUFrQjtBQUFBLFVBQ2xCLGVBQWU7QUFBQSxVQUNmLE1BQU0sS0FBSyxLQUFLO0FBQUEsVUFDaEIsU0FBUyxRQUFRLFFBQVE7QUFBQSxVQUN6QjtBQUFBLFVBQ0EsUUFBUSxLQUFLLE9BQU87QUFBQSxVQUNwQixZQUFZO0FBQUEsUUFDaEIsQ0FBQztBQUFBLFFBQ0QsVUFBVSxTQUFTO0FBQUEsUUFFbkIsSUFBSTtBQUFBLFFBRUosSUFBSTtBQUFBLFFBR0osSUFBSSxPQUFPLFFBQVEsYUFBYTtBQUFBLFVBRTVCLFNBQVMsSUFBSSxlQUFlO0FBQUEsWUFDeEIsTUFBTTtBQUFBLGlCQUVBLEtBQUksQ0FBQyxZQUE0QztBQUFBLGNBQ25ELFVBQVU7QUFBQSxjQUNWLElBQUk7QUFBQSxnQkFDQSxXQUFXLE1BQU0sU0FBUyxLQUFLLFVBQVUsRUFBRSxTQUFTLE1BQU0sTUFBTSxXQUFXLFVBQVUsQ0FBc0M7QUFBQTtBQUFBLENBQU87QUFBQSxnQkFDbEksaUJBQWlCLFNBQVMsU0FBUyxRQUFRLE9BQU87QUFBQSxrQkFDOUMsSUFBSSxDQUFDLFFBQVEsUUFBUSxPQUFPLFNBQVM7QUFBQSxvQkFDakMsTUFBTSxTQUFpQixLQUFLLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQztBQUFBLG9CQUNuRCxXQUFXLE1BQU0sUUFBUTtBQUFBO0FBQUEsQ0FBWTtBQUFBLGtCQUN6QyxFQUFPO0FBQUEsb0JBQ0gsU0FBUyxRQUFRLE1BQU0sT0FBTyxTQUFTO0FBQUEsb0JBQ3ZDLE1BQU0sWUFBWTtBQUFBLG9CQUNsQixXQUFXLE1BQU07QUFBQTtBQUFBLGdCQUV6QjtBQUFBLGdCQUNGLE9BQU8sT0FBTztBQUFBLGdCQUNaLE1BQU0sWUFBWSxpQkFBaUIsV0FBVyxRQUFRLEtBQUs7QUFBQSxnQkFDM0QsTUFBTSxTQUFjLENBQUM7QUFBQSxnQkFDckIsT0FBTyxVQUFVLFFBQVEsVUFBVTtBQUFBLGdCQUNuQyxXQUFXLE1BQU0sUUFBUSxLQUFLLFVBQVUsQ0FBQyxRQUFRLElBQUksQ0FBQztBQUFBO0FBQUEsQ0FBTztBQUFBO0FBQUEsY0FFakUsTUFBTSxJQUFJLFFBQVEsQ0FBQyxZQUFZLFdBQVcsU0FBUyxDQUFDLENBQUM7QUFBQSxjQUNyRCxNQUFNLFlBQVk7QUFBQSxjQUNsQixXQUFXLE1BQU07QUFBQTtBQUFBLGlCQUVmLE9BQU0sR0FBRztBQUFBLGNBQ1gsTUFBTSxZQUFZO0FBQUEsY0FDbEIsUUFBUSxNQUFNO0FBQUE7QUFBQSxVQUV0QixDQUFRO0FBQUEsUUFDWixFQUFPO0FBQUEsVUFHSCxTQUFTLElBQUksZUFBZTtBQUFBLGlCQUVsQixLQUFJLENBQUMsWUFBWTtBQUFBLGNBQ25CLFVBQVU7QUFBQSxjQUNWLElBQUk7QUFBQSxnQkFDQSxXQUFXLFFBQVEsU0FBUyxLQUFLLFVBQVUsRUFBRSxTQUFTLE1BQU0sTUFBTSxXQUFXLFVBQVUsQ0FBc0M7QUFBQTtBQUFBLENBQU87QUFBQSxnQkFDcEksaUJBQWlCLFNBQVMsU0FBUyxRQUFRLE9BQU87QUFBQSxrQkFDOUMsSUFBSSxDQUFDLFFBQVEsUUFBUSxPQUFPLFNBQVM7QUFBQSxvQkFDakMsTUFBTSxTQUFpQixLQUFLLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQztBQUFBLG9CQUNuRCxXQUFXLFFBQVEsUUFBUTtBQUFBO0FBQUEsQ0FBWTtBQUFBLGtCQUMzQyxFQUFPO0FBQUEsb0JBQ0gsU0FBUyxRQUFRLE1BQU0sT0FBTyxTQUFTO0FBQUEsb0JBQ3ZDLE1BQU0sWUFBWTtBQUFBLG9CQUNsQixXQUFXLE1BQU07QUFBQTtBQUFBLGdCQUV6QjtBQUFBLGdCQUNGLE9BQU8sT0FBTztBQUFBLGdCQUNaLE1BQU0sWUFBWSxpQkFBaUIsV0FBVyxRQUFRLEtBQUs7QUFBQSxnQkFDM0QsTUFBTSxTQUFjLENBQUM7QUFBQSxnQkFDckIsT0FBTyxVQUFVLFFBQVEsVUFBVTtBQUFBLGdCQUNuQyxXQUFXLFFBQVEsUUFBUSxLQUFLLFVBQVUsQ0FBQyxRQUFRLElBQUksQ0FBQztBQUFBO0FBQUEsQ0FBTztBQUFBO0FBQUEsY0FFbkUsTUFBTSxZQUFZO0FBQUEsY0FDbEIsTUFBTSxJQUFJLFFBQVEsQ0FBQyxZQUFZLFdBQVcsU0FBUyxDQUFDLENBQUM7QUFBQSxjQUNyRCxXQUFXLE1BQU07QUFBQTtBQUFBLGlCQUVmLE9BQU0sR0FBRztBQUFBLGNBQ1gsTUFBTSxZQUFZO0FBQUEsY0FDbEIsUUFBUSxNQUFNO0FBQUE7QUFBQSxVQUV0QixDQUFRO0FBQUE7QUFBQSxRQUdaLFNBQVMsT0FBTztBQUFBLFFBQ2hCLFNBQVMsUUFBUSxrQkFBa0I7QUFBQSxRQUNuQyxTQUFTLFFBQVEsbUJBQW1CO0FBQUEsUUFFcEMsTUFBTSxRQUFRLEtBQUssdUJBQXVCLEVBQUUsV0FBVyxRQUFRLE1BQU0sS0FBSyxLQUFLLFFBQWtCLE1BQU0sU0FBUyxLQUFLLFFBQVEsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLE1BQU0sT0FBTyxDQUFDO0FBQUEsUUFFeEwsT0FBTyxJQUFJLFNBQVMsU0FBUyxNQUFNLFFBQVE7QUFBQTtBQUFBLE1BRWpELE9BQU8sT0FBTztBQUFBLE1BQ1osTUFBTSxVQUF5QztBQUFBLFFBQzNDLE9BQU8saUJBQWlCLFdBQVcsUUFBUSxLQUFLO0FBQUEsTUFDcEQ7QUFBQSxNQUNBLElBQUksUUFBUSxVQUFVO0FBQUEsUUFBVyxTQUFTLE9BQU8sS0FBSyxVQUFVLFFBQVEsS0FBSztBQUFBLE1BQzdFLE1BQU0sUUFBUSxLQUFLLHVCQUF1QixFQUFFLFdBQVcsUUFBUSxNQUFNLEtBQUssS0FBSyxRQUFrQixNQUFNLFNBQVMsS0FBSyxRQUFRLFNBQVMsU0FBUyxTQUFTLE9BQU8sT0FBTyxDQUFDO0FBQUEsTUFDdkssUUFBUSxRQUFRLFFBQVEsT0FBTyxTQUFTO0FBQUEsTUFDeEMsT0FBTyxJQUFJLFNBQVMsU0FBUyxNQUFNLFFBQVE7QUFBQTtBQUFBO0FBQUEsRUFJbkQsTUFBTSxnQkFBOEUsSUFBSTtBQUFBLEVBQ3hGLE1BQU0sZ0JBQWdCLE9BQ2xCLE9BQ0EsWUFRQztBQUFBLElBQ0QsSUFBSSxPQUFPLFlBQVksVUFBVTtBQUFBLE1BQzdCLElBQUksWUFBWSxRQUFRO0FBQUEsUUFDcEIsTUFBSyxZQUFZLE1BQU07QUFBQSxNQUMzQjtBQUFBLE1BQ0EsSUFBSSxRQUFRLFdBQVcsZUFBZSxHQUFHO0FBQUEsUUFDckMsTUFBTSxZQUFZLFFBQVEsTUFBTSxlQUFlLEVBQUU7QUFBQSxRQUNqRCxNQUFNLGVBQWUsY0FBYyxJQUFJLFNBQVM7QUFBQSxRQUNoRCxJQUFJLGNBQWM7QUFBQSxVQUNkLGFBQWEsVUFBVSxPQUFPLFNBQVM7QUFBQSxVQUN2QyxhQUFhLFlBQVksUUFBUTtBQUFBLFFBQ3JDO0FBQUEsTUFDSjtBQUFBLE1BQ0E7QUFBQSxJQUNKO0FBQUEsSUFDQSxJQUFJLGNBQWMsS0FBSyxJQUFJLFFBQVEsSUFBSTtBQUFBLElBQ3ZDLElBQUksZ0JBQWdCLE1BQU07QUFBQSxNQUN0QixjQUFjLFVBQVUsY0FBYyxRQUFRO0FBQUEsTUFDOUMsSUFBSSxnQkFBZ0IsV0FBVztBQUFBLFFBQzNCLE1BQU0sT0FBTyxhQUFhLEVBQUUsTUFBTSxRQUFRLEtBQUssQ0FBQztBQUFBLE1BQ3BEO0FBQUEsTUFDQSxJQUFJLE9BQU8sWUFBWSxXQUFXO0FBQUEsUUFBWSxZQUFZLFNBQVMsTUFBTSxZQUFZO0FBQUEsTUFDaEY7QUFBQSxvQkFBWSxTQUFTLE1BQU0sWUFBWSxPQUFPO0FBQUEsTUFDbkQsS0FBSyxJQUFJLFFBQVEsTUFBTSxXQUFXO0FBQUEsSUFDdEM7QUFBQSxJQUVBLE1BQU0sVUFBVSxJQUFJLFFBQVEsUUFBUSxPQUFPO0FBQUEsSUFDM0MsTUFBTSxTQUFTLFFBQVEsVUFBVSxDQUFDO0FBQUEsSUFDbEMsTUFBTSxTQUFTLGFBQWEsU0FBUyxRQUFRLE1BQU0sUUFBUSxTQUFTO0FBQUEsSUFDcEUsSUFBSSxVQUE2QyxDQUFDO0FBQUEsSUFFbEQsTUFBTSxPQUFPLElBQUksTUFDYixDQUFDLEdBQ0Q7QUFBQSxNQUNJLEtBQUssQ0FBQyxRQUFRLGFBQWE7QUFBQSxRQUN2QixJQUFJLGFBQWE7QUFBQSxVQUFZLE9BQU87QUFBQSxRQUNwQztBQUFBO0FBQUEsTUFFSixLQUFLLE1BQU07QUFBQSxRQUNQLE1BQU0sT0FBTyxnQkFBZ0IsRUFBRSxVQUFVLGdCQUFnQixTQUFTLHFKQUFxSixDQUFDO0FBQUE7QUFBQSxJQUVoTyxDQUNKO0FBQUEsSUFFQSxNQUFNLGNBQWMsT0FBTyxTQUE4QjtBQUFBLE1BQ3JELElBQUksU0FBUztBQUFBLFFBQVUsY0FBYyxPQUFPLFFBQVEsU0FBUztBQUFBLE1BQzdELFFBQVEsUUFBUSxRQUFRLE9BQU8sUUFBUSxTQUFTO0FBQUEsTUFDaEQsV0FBVyxXQUFXLFNBQVM7QUFBQSxRQUMzQixJQUFJO0FBQUEsVUFDQSxNQUFNLFFBQVE7QUFBQSxVQUNoQixPQUFPLE9BQU87QUFBQSxVQUNaLE9BQU8sTUFBTSx1Q0FBdUMsS0FBSztBQUFBO0FBQUEsTUFFakU7QUFBQTtBQUFBLElBR0osTUFBTSxVQUFVLEVBQUUsTUFBWSxTQUFTLE9BQU87QUFBQSxJQUU5QyxJQUFJO0FBQUEsTUFDQSxJQUFJLFlBQVksU0FBUyxVQUFVO0FBQUEsUUFDL0IsTUFBTSxXQUFXLE1BQU0sU0FBUyxVQUFVLGFBQWE7QUFBQSxVQUNuRCxrQkFBa0IsUUFBUTtBQUFBLFVBQzFCLGVBQWU7QUFBQSxVQUNmLE1BQU0sUUFBUTtBQUFBLFVBQ2Q7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0EsWUFBWTtBQUFBLFFBQ2hCLENBQUM7QUFBQSxRQUNELFVBQVUsU0FBUztBQUFBLFFBRW5CLE1BQU0sWUFBWSxRQUFRO0FBQUEsUUFFMUIsSUFBSSxTQUFTLGFBQWE7QUFBQSxVQUN0QixNQUFLLFlBQVk7QUFBQSxZQUNiLFdBQVcsUUFBUTtBQUFBLFlBQ25CLFNBQVM7QUFBQSxZQUNULE1BQU07QUFBQSxVQUNWLENBQUM7QUFBQSxRQUNMLEVBQU87QUFBQSxVQUNILE1BQUssWUFBWTtBQUFBLFlBQ2IsV0FBVyxRQUFRO0FBQUEsWUFDbkIsU0FBUztBQUFBLFlBQ1QsTUFBTSxTQUFTLFFBQVE7QUFBQSxVQUMzQixDQUFDO0FBQUE7QUFBQSxNQUVUO0FBQUEsTUFDQSxJQUFJLFlBQVksU0FBUyxVQUFVO0FBQUEsUUFDL0IsTUFBTSxXQUFXLE1BQU0sU0FBUyxVQUFVLGFBQWE7QUFBQSxVQUNuRCxrQkFBa0IsUUFBUTtBQUFBLFVBQzFCLGVBQWU7QUFBQSxVQUNmLE1BQU0sUUFBUTtBQUFBLFVBQ2Q7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0EsWUFBWTtBQUFBLFFBQ2hCLENBQUM7QUFBQSxRQUNELFVBQVUsU0FBUztBQUFBLFFBRW5CLElBQUk7QUFBQSxVQUNBLE1BQUssWUFBWSxFQUFFLFNBQVMsTUFBTSxNQUFNLFdBQVcsV0FBVyxRQUFRLFdBQVcsTUFBTSxNQUFNLENBQUM7QUFBQSxVQUM5RixjQUFjLElBQUksUUFBUSxXQUFXLEVBQUUsV0FBVyxTQUFTLFFBQVEsT0FBTyxZQUFZLENBQUM7QUFBQSxVQUN2RixpQkFBaUIsU0FBUyxTQUFTLFFBQVEsT0FBTztBQUFBLFlBQzlDLE1BQU0sT0FBTyxFQUFFLFNBQVMsTUFBTSxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsV0FBVyxRQUFRLFdBQVcsTUFBTSxNQUFNO0FBQUEsWUFDN0YsTUFBSyxZQUFZLElBQUk7QUFBQSxVQUN6QjtBQUFBLFVBQ0EsTUFBSyxZQUFZLEVBQUUsU0FBUyxNQUFNLE1BQU0sV0FBVyxXQUFXLFFBQVEsV0FBVyxNQUFNLEtBQUssQ0FBQztBQUFBLFVBQy9GLE9BQU8sT0FBTztBQUFBLFVBQ1osTUFBTSxZQUFZLGlCQUFpQixRQUFRLFdBQVcsUUFBUSxLQUFLO0FBQUEsVUFDbkUsTUFBTSxTQUFjLENBQUM7QUFBQSxVQUNyQixPQUFPLFVBQVUsUUFBUSxVQUFVO0FBQUEsVUFDbkMsTUFBSyxZQUFZLEVBQUUsU0FBUyxNQUFNLE1BQU0sQ0FBQyxRQUFRLElBQUksR0FBRyxXQUFXLFFBQVEsV0FBVyxNQUFNLEtBQUssQ0FBQztBQUFBO0FBQUEsUUFFdEcsTUFBTSxZQUFZLFFBQVE7QUFBQSxNQUM5QjtBQUFBLE1BQ0YsT0FBTyxPQUFPO0FBQUEsTUFDWixNQUFNLFNBQVMsaUJBQWlCLFFBQVEsV0FBVyxRQUFRLEtBQUs7QUFBQSxNQUNoRSxNQUFLLFlBQVksRUFBRSxTQUFTLE9BQU8sTUFBTSxXQUFXLE9BQU8sUUFBUSxXQUFXLFFBQVEsV0FBVyxNQUFNLEtBQUssQ0FBQztBQUFBO0FBQUE7QUFBQSxFQUlySCxPQUFPO0FBQUEsSUFDSDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDSjtBQUFBOztBQ2xhRyxTQUFTLE1BQTRFLENBQUMsTUFBWSxNQUF1RDtBQUFBLEVBQzVKLE1BQU0sUUFBUSxFQUFFLGVBQWUsTUFBTSxNQUFNLEtBQUs7QUFBQSxFQUNoRCxNQUFNLGtCQUFrQixLQUFLO0FBQUEsRUFDN0IsT0FBTztBQUFBO0FBS0osU0FBUyxnQkFBZ0IsQ0FBQyxXQUFtQixRQUFnQixPQUFnRTtBQUFBLEVBQ2hJLElBQUk7QUFBQSxJQUNBLElBQUksZ0JBQWdCO0FBQUEsTUFBYSxXQUFtQixZQUFZLGlCQUFpQixLQUFLO0FBQUEsSUFDeEYsT0FBTyxRQUFPO0FBQUEsRUFDaEIsSUFBSSxpQkFBaUIsU0FBUyxnQkFBZ0I7QUFBQSxJQUFhLFdBQW1CLFdBQVcsaUJBQWlCLEtBQUs7QUFBQSxFQUMvRyxNQUFNLE9BQU8sT0FBTyxRQUFRLE9BQU8sUUFBUSxPQUFPLGFBQWEsUUFBUTtBQUFBLEVBRXZFLElBQUksT0FBTyxrQkFBa0IsUUFBUSxPQUFPLFNBQVMsYUFBYTtBQUFBLElBQzlELE9BQU8sS0FBSyxNQUFNLE9BQU8sTUFBTSxRQUFRLGNBQWM7QUFBQSxFQUN6RCxFQUFPO0FBQUEsSUFDSCxJQUFJO0FBQUEsTUFDQSxNQUFNLFFBQVEsT0FBTyxpQkFBaUIsT0FBTyxTQUFTLElBQUksTUFBTTtBQUFBLENBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxLQUFLO0FBQUEsQ0FBSSxJQUFLLE9BQU8sU0FBUztBQUFBLE1BQzdHLE9BQU8sTUFBTSxNQUFNO0FBQUEsRUFBSyxLQUFLLFVBQVUsT0FBTyxJQUFJLEtBQUs7QUFBQSxFQUFLO0FBQUEsQ0FBUztBQUFBLE1BQ3ZFLE9BQU8sR0FBRztBQUFBLE1BQ1IsT0FBTyxNQUFNLE1BQU07QUFBQSxFQUFLLE9BQU8sU0FBUyxLQUFLO0FBQUEsRUFBSyxPQUFPO0FBQUEsQ0FBUztBQUFBO0FBQUE7QUFBQSxFQUkxRSxJQUFJO0FBQUEsRUFFSixJQUFJLE9BQU8sa0JBQWtCO0FBQUEsSUFBTSxTQUFTLEVBQUUsU0FBUyxPQUFPLE1BQU0sTUFBTSxNQUFNLFFBQVEsTUFBTSxNQUFNLFVBQVU7QUFBQSxFQUN6RztBQUFBLGFBQVMsRUFBRSxTQUFTLE9BQU8sTUFBTSx5QkFBeUIsUUFBUSxXQUFXLFVBQVU7QUFBQSxFQUU1RixPQUFPO0FBQUE7IiwKICAiZGVidWdJZCI6ICI2OEQxRkUxQjAyNEUyNDZGNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|
|
2463
|
+
//# debugId=B83A61CD020DDCA464756E2164756E21
|
|
2464
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXHV0aWxzXFxwYXJ0LnRzIiwgIi4uXFx0eXBlLXNhZmV0eVxcaW5kZXgudHMiLCAiLi5cXGNvbmZpZ1xcaW5kZXgudHMiLCAiLi5cXHV0aWxzXFxoZWFkZXJzLXRvLWpzb24udHMiLCAiLi5cXHV0aWxzXFxtZXJnZS1kZWVwLnRzIiwgIi4uXFx1dGlsc1xccmV2aXZlLWpzb24tcGFyc2UudHMiLCAiLi5cXGV4ZWN1dGVcXGluZGV4LnRzIiwgIi4uXFxldmVudFxcaW5kZXgudHMiLCAiLi5cXGZsb3dcXGluZGV4LnRzIiwgIi4uXFx1dGlsc1xcY3JlYXRlLWlkLnRzIiwgIi4uXFxleGVjdXRlXFxleGVjdXRlLWlkLWdlbmVyYXRvci50cyIsICIuLlxcd29ybGRcXGluZGV4LnRzIiwgIi4uXFx0eXBpYVxcaW5kZXgudHMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFwuYnVuXFxkYXRlLWZuc0A0LjEuMFxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcY29uc3RhbnRzLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcLmJ1blxcZGF0ZS1mbnNANC4xLjBcXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXGNvbnN0cnVjdEZyb20uanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFwuYnVuXFxkYXRlLWZuc0A0LjEuMFxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcdG9EYXRlLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcLmJ1blxcZGF0ZS1mbnNANC4xLjBcXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXF9saWJcXGRlZmF1bHRPcHRpb25zLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcLmJ1blxcZGF0ZS1mbnNANC4xLjBcXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXHN0YXJ0T2ZXZWVrLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcLmJ1blxcZGF0ZS1mbnNANC4xLjBcXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXHN0YXJ0T2ZJU09XZWVrLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcLmJ1blxcZGF0ZS1mbnNANC4xLjBcXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXGdldElTT1dlZWtZZWFyLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcLmJ1blxcZGF0ZS1mbnNANC4xLjBcXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXF9saWJcXGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFwuYnVuXFxkYXRlLWZuc0A0LjEuMFxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcX2xpYlxcbm9ybWFsaXplRGF0ZXMuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFwuYnVuXFxkYXRlLWZuc0A0LjEuMFxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcc3RhcnRPZkRheS5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXC5idW5cXGRhdGUtZm5zQDQuMS4wXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFwuYnVuXFxkYXRlLWZuc0A0LjEuMFxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcc3RhcnRPZklTT1dlZWtZZWFyLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcLmJ1blxcZGF0ZS1mbnNANC4xLjBcXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXGlzRGF0ZS5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXC5idW5cXGRhdGUtZm5zQDQuMS4wXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxpc1ZhbGlkLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcLmJ1blxcZGF0ZS1mbnNANC4xLjBcXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXHN0YXJ0T2ZZZWFyLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcLmJ1blxcZGF0ZS1mbnNANC4xLjBcXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXGxvY2FsZVxcZW4tVVNcXF9saWJcXGZvcm1hdERpc3RhbmNlLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcLmJ1blxcZGF0ZS1mbnNANC4xLjBcXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXGxvY2FsZVxcX2xpYlxcYnVpbGRGb3JtYXRMb25nRm4uanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFwuYnVuXFxkYXRlLWZuc0A0LjEuMFxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcbG9jYWxlXFxlbi1VU1xcX2xpYlxcZm9ybWF0TG9uZy5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXC5idW5cXGRhdGUtZm5zQDQuMS4wXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxsb2NhbGVcXGVuLVVTXFxfbGliXFxmb3JtYXRSZWxhdGl2ZS5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXC5idW5cXGRhdGUtZm5zQDQuMS4wXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxsb2NhbGVcXF9saWJcXGJ1aWxkTG9jYWxpemVGbi5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXC5idW5cXGRhdGUtZm5zQDQuMS4wXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxsb2NhbGVcXGVuLVVTXFxfbGliXFxsb2NhbGl6ZS5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXC5idW5cXGRhdGUtZm5zQDQuMS4wXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxsb2NhbGVcXF9saWJcXGJ1aWxkTWF0Y2hGbi5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXC5idW5cXGRhdGUtZm5zQDQuMS4wXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxsb2NhbGVcXF9saWJcXGJ1aWxkTWF0Y2hQYXR0ZXJuRm4uanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFwuYnVuXFxkYXRlLWZuc0A0LjEuMFxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcbG9jYWxlXFxlbi1VU1xcX2xpYlxcbWF0Y2guanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFwuYnVuXFxkYXRlLWZuc0A0LjEuMFxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcbG9jYWxlXFxlbi1VUy5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXC5idW5cXGRhdGUtZm5zQDQuMS4wXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxnZXREYXlPZlllYXIuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFwuYnVuXFxkYXRlLWZuc0A0LjEuMFxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcZ2V0SVNPV2Vlay5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXC5idW5cXGRhdGUtZm5zQDQuMS4wXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxnZXRXZWVrWWVhci5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXC5idW5cXGRhdGUtZm5zQDQuMS4wXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxzdGFydE9mV2Vla1llYXIuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFwuYnVuXFxkYXRlLWZuc0A0LjEuMFxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcZ2V0V2Vlay5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXC5idW5cXGRhdGUtZm5zQDQuMS4wXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxfbGliXFxhZGRMZWFkaW5nWmVyb3MuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFwuYnVuXFxkYXRlLWZuc0A0LjEuMFxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcX2xpYlxcZm9ybWF0XFxsaWdodEZvcm1hdHRlcnMuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFwuYnVuXFxkYXRlLWZuc0A0LjEuMFxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcX2xpYlxcZm9ybWF0XFxmb3JtYXR0ZXJzLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcLmJ1blxcZGF0ZS1mbnNANC4xLjBcXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXF9saWJcXGZvcm1hdFxcbG9uZ0Zvcm1hdHRlcnMuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFwuYnVuXFxkYXRlLWZuc0A0LjEuMFxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcX2xpYlxccHJvdGVjdGVkVG9rZW5zLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcLmJ1blxcZGF0ZS1mbnNANC4xLjBcXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXGZvcm1hdC5qcyIsICIuLlxcdXRpbHNcXHNlbmQtY29va2Jvb2stZXZlbnQudHMiLCAiLi5cXGxvZ2dlclxcaW5kZXgudHMiLCAiLi5cXHN0ZXBcXGluZGV4LnRzIiwgIi4uXFx1dGlsc1xcdHJpZS50cyIsICIuLlxcbGlzdGVuZXJcXGluZGV4LnRzIiwgIi4uXFxleGNlcHRpb25cXGluZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImV4cG9ydCBmdW5jdGlvbiBwYXJ0PFQgZXh0ZW5kcyAoKSA9PiB1bmtub3duPihoYW5kbGVyOiBUKTogUmV0dXJuVHlwZTxUPiB7XHJcbiAgcmV0dXJuIGhhbmRsZXIoKSBhcyB1bmtub3duIGFzIFJldHVyblR5cGU8VD47XHJcbn1cclxuIiwKICAgICJleHBvcnQgdHlwZSBUeXBlU2FmZXR5PFZhbHVlIGV4dGVuZHMgUmVjb3JkPGFueSwgYW55Pj4gPSAodmFsdWU6IFZhbHVlKSA9PiBUeXBlU2FmZXR5VmFsdWU7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVTYWZldHlWYWx1ZSB7XHJcbiAgdHlwZTogPFR5cGUgZXh0ZW5kcyBSZWNvcmQ8YW55LCBhbnk+PigpID0+IFR5cGU7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVHlwZVNhZmV0eVR5cGU8VHlwZSBleHRlbmRzIFJlY29yZDxhbnksIGFueT4+IHtcclxuICAkbWlsa2lvVHlwZTogXCJ0eXBlLXNhZmV0eVwiO1xyXG4gIHZhbHVlOiBUeXBlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdHlwZVNhZmV0eTxWYWx1ZSBleHRlbmRzIFJlY29yZDxhbnksIGFueT4+KHZhbHVlOiBWYWx1ZSk6IFR5cGVTYWZldHlWYWx1ZSB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHR5cGU6ICgpID0+ICh7ICRtaWxraW9UeXBlOiBcInR5cGUtc2FmZXR5XCIsIHZhbHVlIH0pLFxyXG4gIH0gYXMgYW55O1xyXG59XHJcbiIsCiAgICAiZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZzxDb25maWdUIGV4dGVuZHMgQ29uZmlnPihjb25maWc6IENvbmZpZ1QpOiBDb25maWdUIHtcclxuICByZXR1cm4gY29uZmlnO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBDb25maWcgPSAobW9kZTogc3RyaW5nKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDb25maWdFbnZpcm9ubWVudHM8VCBleHRlbmRzIENvbmZpZz4ge1xyXG4gIFtrZXk6IHN0cmluZ106IChlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pID0+IFBhcnRpYWw8QXdhaXRlZDxSZXR1cm5UeXBlPFQ+Pj4gfCBQcm9taXNlPFBhcnRpYWw8QXdhaXRlZDxSZXR1cm5UeXBlPFQ+Pj4+O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZW52VG9TdHJpbmcodmFsdWU6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCwgZGVmYXVsdFZhbHVlOiBzdHJpbmcpIHtcclxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcclxuXHJcbiAgcmV0dXJuIGAke3ZhbHVlfWA7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBlbnZUb051bWJlcih2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBkZWZhdWx0VmFsdWU6IG51bWJlcikge1xyXG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xyXG5cclxuICByZXR1cm4gTnVtYmVyLnBhcnNlSW50KHZhbHVlLCAxMCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBlbnZUb0Jvb2xlYW4odmFsdWU6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCwgZGVmYXVsdFZhbHVlOiBib29sZWFuKSB7XHJcbiAgaWYgKHZhbHVlID09PSBcInRydWVcIikgcmV0dXJuIHRydWU7XHJcblxyXG4gIGlmICh2YWx1ZSA9PT0gXCJmYWxzZVwiKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gIGlmICh2YWx1ZSA9PT0gXCJcIikgcmV0dXJuIGZhbHNlO1xyXG5cclxuICBpZiAodW5kZWZpbmVkID09PSB2YWx1ZSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcclxuXHJcbiAgcmV0dXJuIEJvb2xlYW4odmFsdWUpO1xyXG59XHJcbiIsCiAgICAiZXhwb3J0IGZ1bmN0aW9uIGhlYWRlcnNUb0pTT04oaGVhZGVyczogSGVhZGVycykge1xyXG4gIGNvbnN0IGpzb246IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcclxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiAoaGVhZGVycyBhcyBhbnkpLmVudHJpZXMoKSkge1xyXG4gICAganNvbltrZXldID0gdmFsdWU7XHJcbiAgfVxyXG4gIHJldHVybiBqc29uO1xyXG59XHJcbiIsCiAgICAiZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZTogYW55KTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBtZXJnZURlZXA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sIFUgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+Pih0YXJnZXQ6IFQsIHNvdXJjZTogVSk6IFQge1xyXG4gIGNvbnN0IG1lcmdlZCA9IHsgLi4udGFyZ2V0IH07XHJcblxyXG4gIGZvciAoY29uc3Qga2V5IGluIHNvdXJjZSkge1xyXG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTtcclxuXHJcbiAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHNvdXJjZVtrZXldO1xyXG4gICAgY29uc3QgdGFyZ2V0VmFsdWUgPSB0YXJnZXRba2V5IGFzIGtleW9mIFRdO1xyXG5cclxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCBrZXkpKSB7XHJcbiAgICAgIGlmIChpc1BsYWluT2JqZWN0KHRhcmdldFZhbHVlKSAmJiBpc1BsYWluT2JqZWN0KHNvdXJjZVZhbHVlKSkge1xyXG4gICAgICAgIG1lcmdlZFtrZXkgYXMga2V5b2YgVCAmIGtleW9mIFVdID0gbWVyZ2VEZWVwKHRhcmdldFZhbHVlLCBzb3VyY2VWYWx1ZSkgYXMgYW55O1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAobWVyZ2VkIGFzIGFueSlba2V5XSA9IHNvdXJjZVZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG1lcmdlZCBhcyBUICYgVTtcclxufVxyXG4iLAogICAgIlxyXG5leHBvcnQgZnVuY3Rpb24gcmV2aXZlSlNPTlBhcnNlPFQ+KGpzb246IFQpOiBUIHtcclxuICAgIGNvbnN0IGlzb0RhdGVQYXR0ZXJuID0gL14oXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oPzpcXC5cXGR7MSwzfSk/KShafFsrLV1cXGR7Mn06P1xcZHsyfSk/JC87XHJcblxyXG4gICAgaWYgKGpzb24gaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4ganNvbjtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGpzb24pKSB7XHJcbiAgICAgICAgcmV0dXJuIGpzb24ubWFwKChpdGVtKSA9PiByZXZpdmVKU09OUGFyc2UoaXRlbSkpIGFzIGFueTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YganNvbiA9PT0gXCJvYmplY3RcIiAmJiBqc29uICE9PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGpzb24pLnJlZHVjZSgoYWNjLCBba2V5LCB2YWx1ZV0pID0+IHtcclxuICAgICAgICAgICAgYWNjW2tleSBhcyBrZXlvZiBUXSA9IHJldml2ZUpTT05QYXJzZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgIHJldHVybiBhY2M7XHJcbiAgICAgICAgfSwge30gYXMgVCk7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIGpzb24gPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICBjb25zdCBtYXRjaCA9IGpzb24ubWF0Y2goaXNvRGF0ZVBhdHRlcm4pO1xyXG4gICAgICAgIGlmIChtYXRjaCkge1xyXG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVkRGF0ZVN0cmluZyA9IG1hdGNoWzJdID8gYCR7bWF0Y2hbMV19JHttYXRjaFsyXS5yZXBsYWNlKFwiOlwiLCBcIlwiKX1gIDogYCR7bWF0Y2hbMV19WmA7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShub3JtYWxpemVkRGF0ZVN0cmluZykgYXMgYW55O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBqc29uO1xyXG59IiwKICAgICJpbXBvcnQgdHlwZSB7IElWYWxpZGF0aW9uIH0gZnJvbSBcInR5cGlhXCI7XHJcbmltcG9ydCB7IHJlamVjdCB9IGZyb20gXCIuLi9pbmRleC50c1wiO1xyXG5pbXBvcnQgdHlwZSB7ICRjb250ZXh0LCAkbWV0YSwgTG9nZ2VyLCBSZXN1bHRzLCBHZW5lcmF0ZWRJbml0IH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XHJcbmltcG9ydCB7IGhlYWRlcnNUb0pTT04gfSBmcm9tIFwiLi4vdXRpbHMvaGVhZGVycy10by1qc29uLnRzXCI7XHJcbmltcG9ydCB7IG1lcmdlRGVlcCB9IGZyb20gXCIuLi91dGlscy9tZXJnZS1kZWVwLnRzXCI7XHJcbmltcG9ydCB7IHJldml2ZUpTT05QYXJzZSB9IGZyb20gXCIuLi91dGlscy9yZXZpdmUtanNvbi1wYXJzZS50c1wiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW5pdEV4ZWN1dGVyKGdlbmVyYXRlZDogR2VuZXJhdGVkSW5pdCwgcnVudGltZTogYW55KSB7XHJcbiAgICBjb25zdCBfX2V4ZWN1dGUgPSBhc3luYyAoXHJcbiAgICAgICAgcm91dGVTY2hlbWE6IGFueSxcclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIGNyZWF0ZWRFeGVjdXRlSWQ6IHN0cmluZztcclxuICAgICAgICAgICAgY3JlYXRlZExvZ2dlcjogTG9nZ2VyO1xyXG4gICAgICAgICAgICBwYXRoOiBzdHJpbmc7XHJcbiAgICAgICAgICAgIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBIZWFkZXJzO1xyXG4gICAgICAgICAgICBjb250ZXh0OiBhbnkgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSAmIChcclxuICAgICAgICAgICAgICAgIHwge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtczogUmVjb3JkPGFueSwgYW55PjtcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXNUeXBlOiBcInJhd1wiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfCB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBzdHJpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zVHlwZTogXCJzdHJpbmdcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKSxcclxuICAgICk6IFByb21pc2U8eyBleGVjdXRlSWQ6IHN0cmluZzsgaGVhZGVyczogSGVhZGVyczsgcGFyYW1zOiBSZWNvcmQ8YW55LCB1bmtub3duPjsgcmVzdWx0czogUmVzdWx0czxhbnk+OyBjb250ZXh0OiAkY29udGV4dDsgbWV0YTogUmVhZG9ubHk8JG1ldGE+OyB0eXBlOiBcImFjdGlvblwiIHwgXCJzdHJlYW1cIjsgZW1wdHlSZXN1bHQ6IGJvb2xlYW47IHJlc3VsdHNUeXBlU2FmZXR5OiBib29sZWFuOyBmaW5hbGVzOiBBcnJheTwoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPj4gfT4gPT4ge1xyXG4gICAgICAgIGNvbnN0IHR5cGUgPSBvcHRpb25zLnBhdGguZW5kc1dpdGgoXCJ+XCIpID8gXCJzdHJlYW1cIiA6IFwiYWN0aW9uXCI7XHJcbiAgICAgICAgY29uc3QgZXhlY3V0ZUlkOiBzdHJpbmcgPSBvcHRpb25zLmNyZWF0ZWRFeGVjdXRlSWQ7XHJcbiAgICAgICAgbGV0IGhlYWRlcnM6IEhlYWRlcnM7XHJcbiAgICAgICAgaWYgKCEob3B0aW9ucy5oZWFkZXJzIGluc3RhbmNlb2YgSGVhZGVycykpIHtcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICBoZWFkZXJzID0gbmV3IEhlYWRlcnMoe1xyXG4gICAgICAgICAgICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBoZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIShcInRvSlNPTlwiIGluIGhlYWRlcnMpKSAoaGVhZGVycyBhcyBhbnkpLnRvSlNPTiA9ICgpID0+IGhlYWRlcnNUb0pTT04oaGVhZGVycyk7XHJcblxyXG4gICAgICAgIGNvbnN0IGZpbmFsZXM6IEFycmF5PGFueT4gPSBbXTtcclxuICAgICAgICBjb25zdCBvbkZpbmFsbHkgPSAoaGFuZGxlcjogYW55KSA9PiBmaW5hbGVzLnVuc2hpZnQoaGFuZGxlcik7XHJcblxyXG4gICAgICAgIGxldCBwYXJhbXM6IFJlY29yZDxhbnksIHVua25vd24+O1xyXG4gICAgICAgIGlmIChvcHRpb25zLnBhcmFtc1R5cGUgPT09IFwicmF3XCIpIHtcclxuICAgICAgICAgICAgcGFyYW1zID0gb3B0aW9ucy5wYXJhbXM7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW1zID09PSBcInVuZGVmaW5lZFwiKSBwYXJhbXMgPSB7fTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5wYXJhbXMgPT09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIHBhcmFtcyA9IHt9O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShvcHRpb25zLnBhcmFtcykpO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyByZWplY3QoXCJQQVJBTVNfVFlQRV9OT1RfU1VQUE9SVEVEXCIsIHsgZXhwZWN0ZWQ6IFwianNvblwiIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbXMgPT09IFwidW5kZWZpbmVkXCIpIHBhcmFtcyA9IHt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgcGFyYW1zICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkocGFyYW1zKSkgdGhyb3cgcmVqZWN0KFwiUEFSQU1TX1RZUEVfTk9UX1NVUFBPUlRFRFwiLCB7IGV4cGVjdGVkOiBcImpzb25cIiB9KTtcclxuICAgICAgICBpZiAoXCIkbWlsa2lvR2VuZXJhdGVQYXJhbXNcIiBpbiBwYXJhbXMgJiYgcGFyYW1zLiRtaWxraW9HZW5lcmF0ZVBhcmFtcyA9PT0gXCJlbmFibGVcIikge1xyXG4gICAgICAgICAgICBpZiAoIXJ1bnRpbWUuZGV2ZWxvcCkgdGhyb3cgcmVqZWN0KFwiTk9UX0RFVkVMT1BfTU9ERVwiLCBcIlRoaXMgZmVhdHVyZSBtdXN0IGJlIGluIGNvb2tib29rIHRvIHVzZS5cIik7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBwYXJhbXMuJG1pbGtpb0dlbmVyYXRlUGFyYW1zO1xyXG4gICAgICAgICAgICBsZXQgcGFyYW1zUmFuZCA9IHJvdXRlU2NoZW1hLnJhbmRvbVBhcmFtcygpO1xyXG4gICAgICAgICAgICBpZiAocGFyYW1zUmFuZCA9PT0gdW5kZWZpbmVkIHx8IHBhcmFtc1JhbmQgPT09IG51bGwpIHBhcmFtc1JhbmQgPSB7fTtcclxuICAgICAgICAgICAgcGFyYW1zID0gbWVyZ2VEZWVwKHBhcmFtcywgcGFyYW1zUmFuZCk7XHJcbiAgICAgICAgICAgIG9wdGlvbnMuY3JlYXRlZExvZ2dlci5kZWJ1ZyhcIuKcqCB0aGUgZ2VuZXJhdGVkIHBhcmFtczpcIiwgSlNPTi5zdHJpbmdpZnkocGFyYW1zKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghb3B0aW9ucy5jb250ZXh0Py5odHRwPy5ub3RGb3VuZCAmJiBvcHRpb25zLmNvbnRleHQ/Lmh0dHA/LnBhcmFtcz8uc3RyaW5nKSBvcHRpb25zLmNvbnRleHQuaHR0cC5wYXJhbXMucGFyc2VkID0gcGFyYW1zO1xyXG5cclxuICAgICAgICBpZiAoIW9wdGlvbnMuY29udGV4dCkgb3B0aW9ucy5jb250ZXh0ID0ge307XHJcbiAgICAgICAgb3B0aW9ucy5jb250ZXh0LmRldmVsb3AgPSBydW50aW1lLmRldmVsb3A7XHJcbiAgICAgICAgb3B0aW9ucy5jb250ZXh0LnBhdGggPSBvcHRpb25zLnBhdGg7XHJcbiAgICAgICAgb3B0aW9ucy5jb250ZXh0LmxvZ2dlciA9IG9wdGlvbnMuY3JlYXRlZExvZ2dlcjtcclxuICAgICAgICBvcHRpb25zLmNvbnRleHQuZW1pdCA9IHJ1bnRpbWUuZW1pdDtcclxuICAgICAgICBvcHRpb25zLmNvbnRleHQuZXhlY3V0ZUlkID0gb3B0aW9ucy5jcmVhdGVkRXhlY3V0ZUlkO1xyXG4gICAgICAgIG9wdGlvbnMuY29udGV4dC5jb25maWcgPSBydW50aW1lLnJ1bnRpbWUuY29uZmlnO1xyXG4gICAgICAgIG9wdGlvbnMuY29udGV4dC50eXBpYSA9IGdlbmVyYXRlZC50eXBpYVNjaGVtYTtcclxuICAgICAgICBvcHRpb25zLmNvbnRleHQuY2FsbCA9IChtb2R1bGU6IGFueSwgcGFyYW1zOiBhbnkpID0+IF9fY2FsbChvcHRpb25zLmNvbnRleHQsIG1vZHVsZSwgcGFyYW1zKTtcclxuICAgICAgICBvcHRpb25zLmNvbnRleHQub25GaW5hbGx5ID0gb25GaW5hbGx5O1xyXG4gICAgICAgIG9wdGlvbnMuY29udGV4dC5fID0gcnVudGltZTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVzdWx0czogUmVzdWx0czxhbnk+ID0geyB2YWx1ZTogdW5kZWZpbmVkIH07XHJcblxyXG4gICAgICAgIGNvbnN0IG1vZHVsZSA9IHJvdXRlU2NoZW1hLm1vZHVsZTtcclxuICAgICAgICBjb25zdCBtZXRhID0gKG1vZHVsZT8ubWV0YSA/IG1vZHVsZT8ubWV0YSA6IHt9KSBhcyB1bmtub3duIGFzIFJlYWRvbmx5PCRtZXRhPjtcclxuXHJcbiAgICAgICAgaWYgKG9wdGlvbnMuY29udGV4dC5odHRwPy5yZXF1ZXN0Py5tZXRob2QgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCBhbGxvd01ldGhvZHMgPSBtZXRhPy5tZXRob2RzID8/IFtcIlBPU1RcIl07XHJcbiAgICAgICAgICAgIGlmICghYWxsb3dNZXRob2RzLmluY2x1ZGVzKG9wdGlvbnMuY29udGV4dC5odHRwLnJlcXVlc3QubWV0aG9kKSkgdGhyb3cgcmVqZWN0KFwiTUVUSE9EX05PVF9BTExPV0VEXCIsIHVuZGVmaW5lZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobWV0YT8udHlwZVNhZmV0eSA9PT0gdW5kZWZpbmVkIHx8IG1ldGEudHlwZVNhZmV0eSA9PT0gdHJ1ZSB8fCAoQXJyYXkuaXNBcnJheShtZXRhLnR5cGVTYWZldHkpICYmIG1ldGEudHlwZVNhZmV0eS5pbmNsdWRlcyhcInBhcmFtc1wiKSkpIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHJvdXRlU2NoZW1hLnZhbGlkYXRlUGFyYW1zKHBhcmFtcykgYXMgSVZhbGlkYXRpb248YW55PjtcclxuICAgICAgICAgICAgaWYgKCF2YWxpZGF0aW9uLnN1Y2Nlc3MpIHRocm93IHJlamVjdChcIlBBUkFNU19UWVBFX0lOQ09SUkVDVFwiLCB7IC4uLnZhbGlkYXRpb24uZXJyb3JzWzBdLCBtZXNzYWdlOiBgVGhlIHZhbHVlICcke3ZhbGlkYXRpb24uZXJyb3JzWzBdLnBhdGh9JyBpcyAnJHt2YWxpZGF0aW9uLmVycm9yc1swXS52YWx1ZX0nLCB3aGljaCBkb2VzIG5vdCBtZWV0ICcke3ZhbGlkYXRpb24uZXJyb3JzWzBdLmV4cGVjdGVkfScgcmVxdWlyZW1lbnRzLmAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86ZXhlY3V0ZUJlZm9yZVwiLCB7IGV4ZWN1dGVJZDogb3B0aW9ucy5jcmVhdGVkRXhlY3V0ZUlkLCBsb2dnZXI6IG9wdGlvbnMuY3JlYXRlZExvZ2dlciwgcGF0aDogb3B0aW9ucy5wYXRoLCBtZXRhLCBjb250ZXh0OiBvcHRpb25zLmNvbnRleHQsIHJlamVjdCB9KTtcclxuXHJcbiAgICAgICAgcmVzdWx0cy52YWx1ZSA9IGF3YWl0IG1vZHVsZS5oYW5kbGVyKG9wdGlvbnMuY29udGV4dCwgcGFyYW1zKTtcclxuXHJcbiAgICAgICAgbGV0IGVtcHR5UmVzdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHJlc3VsdHMudmFsdWUgPT09IHVuZGVmaW5lZCB8fCByZXN1bHRzLnZhbHVlID09PSBudWxsIHx8IHJlc3VsdHMudmFsdWUgPT09IFwiXCIpIHtcclxuICAgICAgICAgICAgZW1wdHlSZXN1bHQgPSB0cnVlO1xyXG4gICAgICAgICAgICByZXN1bHRzLnZhbHVlID0ge307XHJcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdHMudmFsdWUpIHx8IHR5cGVvZiByZXN1bHRzLnZhbHVlICE9PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgICAgIHRocm93IHJlamVjdChcIlJFUVVFU1RfRkFJTFwiLCBcIlRoZSByZXR1cm4gdHlwZSBvZiB0aGUgaGFuZGxlciBtdXN0IGJlIGFuICdvYmplY3QnLCB3aGljaCBpcyBjdXJyZW50bHkgYW4gJyR7dHlwZW9mIHR5cGVvZiByZXN1bHRzLnZhbHVlfScuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHJlc3VsdHNUeXBlU2FmZXR5ID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKCFlbXB0eVJlc3VsdCAmJiB0eXBlID09PSBcImFjdGlvblwiICYmIChcclxuICAgICAgICAgICAgLy8gVGVtcG9yYXJ5OiB0eXBlLXNhZmUgZGVmYXVsdCBpcyBmYWxzZSBhbmQgdGhpcyBzZXR0aW5nIHNob3VsZCBub3QgYmUgZXhwb3NlZCB0byB1c2Vyc1xyXG4gICAgICAgICAgICAvLyBEdWUgdG8gY3VycmVudCBpc3N1ZXMgd2l0aCB0eXBpYSwgdHlwZSBzYWZldHkgY2Fubm90IGJlIGFjaGlldmVkIGF0IHRoZSBtb21lbnRcclxuICAgICAgICAgICAgLy8gVGhlcmVmb3JlLCB0aGUgbmV4dCBsaW5lIG9mIGNvZGUgaXMgY3VycmVudGx5IGNvbW1lbnRlZCBvdXRcclxuICAgICAgICAgICAgLy8gVGhpcyBtZWFucyBNaWxraW8gaXMgdXNpbmcgdHJhZGl0aW9uYWwgSlNPTi5zdHJpbmdpZnkgZm9yIHJlc3VsdCBzZXJpYWxpemF0aW9uXHJcbiAgICAgICAgICAgIC8vIG1ldGE/LnR5cGVTYWZldHkgPT09IHVuZGVmaW5lZCB8fCBcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICBtZXRhLnR5cGVTYWZldHkgPT09IHRydWUgfHwgKEFycmF5LmlzQXJyYXkobWV0YS50eXBlU2FmZXR5KSAmJiBtZXRhLnR5cGVTYWZldHkuaW5jbHVkZXMoXCJyZXN1bHRzXCIpKSkpIHtcclxuICAgICAgICAgICAgcmVzdWx0c1R5cGVTYWZldHkgPSB0cnVlO1xyXG4gICAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uID0gcm91dGVTY2hlbWEudmFsaWRhdGVSZXN1bHRzKHJlc3VsdHMudmFsdWUpIGFzIElWYWxpZGF0aW9uPGFueT47XHJcbiAgICAgICAgICAgIGlmICghdmFsaWRhdGlvbi5zdWNjZXNzKSB0aHJvdyByZWplY3QoXCJSRVNVTFRTX1RZUEVfSU5DT1JSRUNUXCIsIHsgLi4udmFsaWRhdGlvbi5lcnJvcnNbMF0sIG1lc3NhZ2U6IGBUaGUgdmFsdWUgJyR7dmFsaWRhdGlvbi5lcnJvcnNbMF0ucGF0aH0nIGlzICcke3ZhbGlkYXRpb24uZXJyb3JzWzBdLnZhbHVlfScsIHdoaWNoIGRvZXMgbm90IG1lZXQgJyR7dmFsaWRhdGlvbi5lcnJvcnNbMF0uZXhwZWN0ZWR9JyByZXF1aXJlbWVudHMuYCB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpleGVjdXRlQWZ0ZXJcIiwgeyBleGVjdXRlSWQ6IG9wdGlvbnMuY3JlYXRlZEV4ZWN1dGVJZCwgbG9nZ2VyOiBvcHRpb25zLmNyZWF0ZWRMb2dnZXIsIHBhdGg6IG9wdGlvbnMucGF0aCwgbWV0YSwgY29udGV4dDogb3B0aW9ucy5jb250ZXh0LCByZXN1bHRzLCByZWplY3QgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB7IGV4ZWN1dGVJZCwgaGVhZGVycywgcGFyYW1zLCByZXN1bHRzLCBjb250ZXh0OiBvcHRpb25zLmNvbnRleHQsIG1ldGEsIHR5cGUsIGVtcHR5UmVzdWx0LCByZXN1bHRzVHlwZVNhZmV0eSwgZmluYWxlcyB9O1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBfX2NhbGwgPSBhc3luYyAoY29udGV4dDogJGNvbnRleHQsIG1vZHVsZTogeyBtZXRhOiBhbnksIGhhbmRsZXI6IGFueSB9LCBwYXJhbXM/OiBhbnkpOiBQcm9taXNlPGFueT4gPT4ge1xyXG4gICAgICAgIGNvbnN0IG1vZHVsZUF3YWl0ZWQgPSBhd2FpdCBtb2R1bGU7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IG1vZHVsZUF3YWl0ZWQuaGFuZGxlcihjb250ZXh0LCBwYXJhbXMpO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIF9fY2FsbCxcclxuICAgICAgICBfX2V4ZWN1dGUsXHJcbiAgICB9O1xyXG59IiwKICAgICJpbXBvcnQgdHlwZSB7ICRjb250ZXh0LCBDb250ZXh0SHR0cCwgUmVzdWx0cywgTG9nZ2VyLCAkbWV0YSB9IGZyb20gXCIuLi9pbmRleC50c1wiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSAkZXZlbnRzIHtcclxuICAgIFwiKlwiOiB7IGtleToga2V5b2YgJGV2ZW50cywgdmFsdWU6IGFueSB9O1xyXG4gICAgXCJtaWxraW86aHR0cFJlcXVlc3RcIjogeyBleGVjdXRlSWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBsb2dnZXI6IExvZ2dlcjsgaHR0cDogQ29udGV4dEh0dHA8UmVjb3JkPHN0cmluZywgYW55Pj4gfTtcclxuICAgIFwibWlsa2lvOmh0dHBSZXNwb25zZVwiOiB7IGV4ZWN1dGVJZDogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGxvZ2dlcjogTG9nZ2VyOyBodHRwOiBDb250ZXh0SHR0cDxSZWNvcmQ8c3RyaW5nLCBhbnk+PjsgY29udGV4dDogJGNvbnRleHQ7IHN1Y2Nlc3M6IGJvb2xlYW4gfTtcclxuICAgIFwibWlsa2lvOmh0dHBOb3RGb3VuZFwiOiB7IGV4ZWN1dGVJZDogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGxvZ2dlcjogTG9nZ2VyOyBodHRwOiBDb250ZXh0SHR0cDxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB9O1xyXG4gICAgXCJtaWxraW86ZXhlY3V0ZUJlZm9yZVwiOiB7IGV4ZWN1dGVJZDogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGxvZ2dlcjogTG9nZ2VyOyBtZXRhOiAkbWV0YTsgY29udGV4dDogJGNvbnRleHQgfTtcclxuICAgIFwibWlsa2lvOmV4ZWN1dGVBZnRlclwiOiB7IGV4ZWN1dGVJZDogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGxvZ2dlcjogTG9nZ2VyOyBtZXRhOiAkbWV0YTsgY29udGV4dDogJGNvbnRleHQ7IHJlc3VsdHM6IFJlc3VsdHM8YW55PiB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbml0RXZlbnRNYW5hZ2VyKCkge1xyXG4gICAgY29uc3QgaGFuZGxlcnMgPSBuZXcgTWFwPChldmVudDogYW55KSA9PiB2b2lkLCBzdHJpbmc+KCk7XHJcbiAgICBjb25zdCBpbmRleGVkID0gbmV3IE1hcDxzdHJpbmcsIFNldDwoZXZlbnQ6IGFueSkgPT4gdm9pZD4+KCk7XHJcblxyXG4gICAgY29uc3QgZXZlbnRNYW5hZ2VyID0ge1xyXG4gICAgICAgIG9uOiA8S2V5IGV4dGVuZHMga2V5b2YgJGV2ZW50cywgSGFuZGxlciBleHRlbmRzIChldmVudDogJGV2ZW50c1tLZXldKSA9PiB2b2lkPihrZXk6IEtleSwgaGFuZGxlcjogSGFuZGxlcikgPT4ge1xyXG4gICAgICAgICAgICBoYW5kbGVycy5zZXQoaGFuZGxlciwga2V5IGFzIHN0cmluZyk7XHJcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICcqJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ZWQuaGFzKCcqJykgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhlZC5zZXQoJyonLCBuZXcgU2V0KCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3Qgd2lsZGNhcmRTZXQgPSBpbmRleGVkLmdldCgnKicpITtcclxuICAgICAgICAgICAgICAgIHdpbGRjYXJkU2V0LmFkZChoYW5kbGVyKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleGVkLmhhcyhrZXkgYXMgc3RyaW5nKSA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBpbmRleGVkLnNldChrZXkgYXMgc3RyaW5nLCBuZXcgU2V0KCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2V0ID0gaW5kZXhlZC5nZXQoa2V5IGFzIHN0cmluZykhO1xyXG4gICAgICAgICAgICAgICAgc2V0LmFkZChoYW5kbGVyKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcclxuICAgICAgICAgICAgICAgIGlmIChrZXkgPT09ICcqJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdpbGRjYXJkU2V0ID0gaW5kZXhlZC5nZXQoJyonKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAod2lsZGNhcmRTZXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2lsZGNhcmRTZXQuZGVsZXRlKGhhbmRsZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2V0ID0gaW5kZXhlZC5nZXQoa2V5IGFzIHN0cmluZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNldCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXQuZGVsZXRlKGhhbmRsZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9mZjogPEtleSBleHRlbmRzIGtleW9mICRldmVudHMsIEhhbmRsZXIgZXh0ZW5kcyAoZXZlbnQ6ICRldmVudHNbS2V5XSkgPT4gdm9pZD4oa2V5OiBLZXksIGhhbmRsZXI6IEhhbmRsZXIpID0+IHtcclxuICAgICAgICAgICAgaWYgKGtleSA9PT0gJyonKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB3aWxkY2FyZFNldCA9IGluZGV4ZWQuZ2V0KCcqJyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXdpbGRjYXJkU2V0KSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBoYW5kbGVycy5kZWxldGUoaGFuZGxlcik7XHJcbiAgICAgICAgICAgICAgICB3aWxkY2FyZFNldC5kZWxldGUoaGFuZGxlcik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZXQgPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKTtcclxuICAgICAgICAgICAgICAgIGlmICghc2V0KSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBoYW5kbGVycy5kZWxldGUoaGFuZGxlcik7XHJcbiAgICAgICAgICAgICAgICBzZXQuZGVsZXRlKGhhbmRsZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbWl0OiBhc3luYyA8S2V5IGV4dGVuZHMga2V5b2YgJGV2ZW50cywgVmFsdWUgZXh0ZW5kcyAkZXZlbnRzW0tleV0+KGtleTogS2V5LCB2YWx1ZTogVmFsdWUpOiBQcm9taXNlPHZvaWQ+ID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZGNhcmRIYW5kbGVycyA9IGluZGV4ZWQuZ2V0KCcqJyk7XHJcbiAgICAgICAgICAgIGlmICh3aWxkY2FyZEhhbmRsZXJzKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2Ygd2lsZGNhcmRIYW5kbGVycykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZXIoeyBrZXksIHZhbHVlIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBoID0gaW5kZXhlZC5nZXQoa2V5IGFzIHN0cmluZyk7XHJcbiAgICAgICAgICAgIGlmIChoKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZXIodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIGV2ZW50TWFuYWdlcjtcclxufVxyXG4iLAogICAgImV4cG9ydCB0eXBlIE1pbGtpb0Zsb3c8VCwgVFJldHVybiA9IGFueSwgVE5leHQgPSBhbnk+ID0ge1xyXG4gIGVtaXQ6IChmbG93OiBUKSA9PiB2b2lkO1xyXG4gIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IE1pbGtpb0Zsb3c8VD47XHJcbiAgbmV4dCguLi5bdmFsdWVdOiBbXSB8IFtUTmV4dF0pOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQsIFRSZXR1cm4+PjtcclxuICByZXR1cm4oKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxULCBUUmV0dXJuPj47XHJcbiAgdGhyb3coZXJyb3I6IGFueSk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VCwgVFJldHVybj4+O1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZsb3c8VD4oKTogTWlsa2lvRmxvdzxUPiB7XHJcbiAgbGV0IHN0YXR1czogXCJwZW5kaW5nXCIgfCBcInJlc29sdmVkXCIgfCBcInJlamVjdGVkXCIgPSBcInBlbmRpbmdcIjtcclxuICBjb25zdCBmbG93czogQXJyYXk8e1xyXG4gICAgYmxhbms6IGJvb2xlYW47XHJcbiAgICBwcm9taXNlOiBQcm9taXNlPFQ+O1xyXG4gICAgcmVzb2x2ZTogKHZhbHVlPzogVCB8IFByb21pc2VMaWtlPFQ+KSA9PiB2b2lkO1xyXG4gICAgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkO1xyXG4gIH0+ID0gW107XHJcblxyXG4gIGNvbnN0IGl0ZXJhdG9yID0ge1xyXG4gICAgZW1pdDogKGZsb3c6IFQpID0+IHtcclxuICAgICAgaWYgKGZsb3dzLmF0KC0xKT8uYmxhbmsgPT09IHRydWUpIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gZmxvd3MuYXQoLTEpITtcclxuICAgICAgICBpdGVtLmJsYW5rID0gZmFsc2U7XHJcbiAgICAgICAgaXRlbS5yZXNvbHZlKGZsb3cpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCByZXNvbHZlcnMgPSBQcm9taXNlLndpdGhSZXNvbHZlcnM8VD4oKTtcclxuICAgICAgICByZXNvbHZlcnMucmVzb2x2ZShmbG93KTtcclxuICAgICAgICBmbG93cy5wdXNoKHsgLi4ucmVzb2x2ZXJzLCBibGFuazogZmFsc2UgfSBhcyBhbnkpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgLi4uKHtcclxuICAgICAgYXN5bmMgbmV4dCgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQ+PiB7XHJcbiAgICAgICAgaWYgKHN0YXR1cyAhPT0gXCJwZW5kaW5nXCIpIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiBudWxsIH07XHJcbiAgICAgICAgaWYgKGZsb3dzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgY29uc3QgcmVzb2x2ZXJzID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzPFQ+KCk7XHJcbiAgICAgICAgICBmbG93cy5wdXNoKHsgLi4ucmVzb2x2ZXJzLCBibGFuazogdHJ1ZSB9IGFzIGFueSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGZsb3cgPSBmbG93cy5hdCgwKSE7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmxvdy5wcm9taXNlO1xyXG4gICAgICAgIGZsb3dzLnNoaWZ0KCk7XHJcbiAgICAgICAgcmV0dXJuIHsgZG9uZTogc3RhdHVzICE9PSBcInBlbmRpbmdcIiwgdmFsdWU6IHJlc3VsdCB9O1xyXG4gICAgICB9LFxyXG4gICAgICBhc3luYyByZXR1cm4oKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx2b2lkPj4ge1xyXG4gICAgICAgIHN0YXR1cyA9IFwicmVzb2x2ZWRcIjtcclxuICAgICAgICBmb3IgKGNvbnN0IGZsb3cgb2YgZmxvd3MpIHtcclxuICAgICAgICAgIGZsb3cuYmxhbmsgPSBmYWxzZTtcclxuICAgICAgICAgIGZsb3cucmVzb2x2ZSh1bmRlZmluZWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogbnVsbCB9O1xyXG4gICAgICB9LFxyXG4gICAgICBhc3luYyB0aHJvdyhlcnI6IGFueSk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dm9pZD4+IHtcclxuICAgICAgICBzdGF0dXMgPSBcInJlamVjdGVkXCI7XHJcbiAgICAgICAgaWYgKGZsb3dzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgY29uc3QgcmVzb2x2ZXJzID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzPFQ+KCk7XHJcbiAgICAgICAgICBmbG93cy5wdXNoKHsgLi4ucmVzb2x2ZXJzLCBibGFuazogdHJ1ZSB9IGFzIGFueSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAoY29uc3QgZmxvdyBvZiBmbG93cykge1xyXG4gICAgICAgICAgZmxvdy5ibGFuayA9IGZhbHNlO1xyXG4gICAgICAgICAgZmxvdy5yZWplY3QoZXJyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG51bGwgfTtcclxuICAgICAgfSxcclxuICAgIH0gc2F0aXNmaWVzIEFzeW5jSXRlcmF0b3I8dW5rbm93bj4pLFxyXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG4gIH07XHJcblxyXG4gIHJldHVybiBpdGVyYXRvciBhcyBNaWxraW9GbG93PFQ+O1xyXG59XHJcbiIsCiAgICAidHlwZSBJZEdlbmVyYXRvck9wdGlvbnMgPSB7XHJcbiAgbGVuZ3RoPzogbnVtYmVyO1xyXG4gIHRpbWVzdGFtcDogYm9vbGVhbjtcclxuICBzZXF1ZW50aWFsOiBib29sZWFuO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gZGVmaW5lSWRHZW5lcmF0b3Iob3B0aW9uczogSWRHZW5lcmF0b3JPcHRpb25zKSB7XHJcbiAgaWYgKCFvcHRpb25zLmxlbmd0aCkgb3B0aW9ucy5sZW5ndGggPSAyNDtcclxuICBpZiAob3B0aW9ucy5sZW5ndGggPCAxKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGxlbmd0aFwiKTtcclxuICBpZiAob3B0aW9ucy5sZW5ndGggPiA2MSkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBsZW5ndGhcIik7XHJcbiAgaWYgKG9wdGlvbnMudGltZXN0YW1wICYmIG9wdGlvbnMubGVuZ3RoIDwgOSkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBsZW5ndGhcIik7XHJcbiAgbGV0IGxhc3RUaW1lID0gMDtcclxuICBsZXQgbGFzdERlY2ltYWwgPSAwbjtcclxuICByZXR1cm4ge1xyXG4gICAgY3JlYXRlSWQoKSB7XHJcbiAgICAgIGxldCByYW5kTGVuZ3RoID0gb3B0aW9ucy5sZW5ndGghO1xyXG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xyXG4gICAgICBsZXQgaWQgPSBcIlwiO1xyXG4gICAgICBpZiAob3B0aW9ucy50aW1lc3RhbXApIHtcclxuICAgICAgICByYW5kTGVuZ3RoIC09IDg7XHJcbiAgICAgICAgaWQgPSBgJHtpZH0ke19fYmlnSW50VG9TdHJpbmcoQmlnSW50KG5vdykpLnBhZFN0YXJ0KDgsIFwiMFwiKX1gO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChvcHRpb25zLnNlcXVlbnRpYWwgJiYgbGFzdFRpbWUgPT09IG5vdykge1xyXG4gICAgICAgIGlkID0gYCR7aWR9JHtfX2JpZ0ludFRvU3RyaW5nKCsrbGFzdERlY2ltYWwpLnBhZFN0YXJ0KDEsIFwiMFwiKX1gO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxhc3RUaW1lID0gbm93O1xyXG4gICAgICAgIGNvbnN0IG1pbiA9IDBuO1xyXG4gICAgICAgIGNvbnN0IG1heCA9IF9fZ2V0TWF4VmFsdWUoQmlnSW50KHJhbmRMZW5ndGgpKTtcclxuICAgICAgICBsYXN0RGVjaW1hbCA9IF9fc2VjdXJlUmFuZG9tQmlnSW50KG1pbiwgbWF4KTtcclxuICAgICAgICBpZCA9IGAke2lkfSR7X19iaWdJbnRUb1N0cmluZyhsYXN0RGVjaW1hbCkucGFkU3RhcnQocmFuZExlbmd0aCwgXCIwXCIpfWA7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGlkO1xyXG4gICAgfSxcclxuICAgIGdldElkVGltZXN0YW1wKGlkOiBzdHJpbmcpIHtcclxuICAgICAgcmV0dXJuIG9wdGlvbnMudGltZXN0YW1wID8gTnVtYmVyKF9fc3RyaW5nVG9CaWdJbnQoaWQuc2xpY2UoMCwgOCkucmVwbGFjZUFsbChcIjBcIiwgXCJcIikpKSA6IDA7XHJcbiAgICB9LFxyXG4gIH07XHJcbn1cclxuXHJcbmNvbnN0IEVOQ09ESU5HID0gXCIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwiO1xyXG5cclxuZnVuY3Rpb24gX19zZWN1cmVSYW5kb21CaWdJbnQobWluOiBiaWdpbnQsIG1heDogYmlnaW50KTogYmlnaW50IHtcclxuICBpZiAobWluID49IG1heCkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCByYW5nZVwiKTtcclxuXHJcbiAgY29uc3QgcmFuZ2UgPSBtYXggLSBtaW4gKyAxbjtcclxuICBjb25zdCBieXRlQ291bnQgPSBNYXRoLmNlaWwoTnVtYmVyKEJpZ0ludChyYW5nZS50b1N0cmluZygyKS5sZW5ndGgpKSAvIDgpO1xyXG4gIGNvbnN0IGVudHJvcHlCeXRlcyA9IG5ldyBVaW50OEFycmF5KGJ5dGVDb3VudCk7XHJcblxyXG4gIGxldCByYW5kb21WYWx1ZTogYmlnaW50O1xyXG4gIGRvIHtcclxuICAgIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMoZW50cm9weUJ5dGVzKTtcclxuICAgIHJhbmRvbVZhbHVlID1cclxuICAgICAgQmlnSW50KFxyXG4gICAgICAgIGAweCR7QXJyYXkuZnJvbShlbnRyb3B5Qnl0ZXMpXHJcbiAgICAgICAgICAubWFwKChiKSA9PiBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCBcIjBcIikpXHJcbiAgICAgICAgICAuam9pbihcIlwiKX1gLFxyXG4gICAgICApICUgcmFuZ2U7XHJcbiAgfSB3aGlsZSAocmFuZG9tVmFsdWUgPCAwbik7XHJcblxyXG4gIHJldHVybiBtaW4gKyByYW5kb21WYWx1ZTtcclxufVxyXG5cclxuZnVuY3Rpb24gX19iaWdJbnRUb1N0cmluZyh2YWx1ZTogYmlnaW50KTogc3RyaW5nIHtcclxuICBjb25zdCBiYXNlID0gQmlnSW50KEVOQ09ESU5HLmxlbmd0aCk7XHJcbiAgbGV0IHJlc3VsdCA9IFwiXCI7XHJcbiAgbGV0IGN1cnJlbnQgPSB2YWx1ZTtcclxuXHJcbiAgaWYgKGN1cnJlbnQgPT09IDBuKSByZXR1cm4gRU5DT0RJTkdbMF07XHJcblxyXG4gIHdoaWxlIChjdXJyZW50ID4gMG4pIHtcclxuICAgIGNvbnN0IHJlbWFpbmRlciA9IGN1cnJlbnQgJSBiYXNlO1xyXG4gICAgcmVzdWx0ID0gRU5DT0RJTkdbTnVtYmVyKHJlbWFpbmRlcildICsgcmVzdWx0O1xyXG4gICAgY3VycmVudCA9IGN1cnJlbnQgLyBiYXNlO1xyXG4gIH1cclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBfX3N0cmluZ1RvQmlnSW50KHN0cjogc3RyaW5nKTogYmlnaW50IHtcclxuICBjb25zdCBjaGFyTWFwOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBFTkNPRElORy5sZW5ndGg7IGkrKykge1xyXG4gICAgY2hhck1hcFtFTkNPRElOR1tpXV0gPSBpO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgYmFzZSA9IEJpZ0ludChFTkNPRElORy5sZW5ndGgpO1xyXG4gIGxldCByZXN1bHQgPSAwbjtcclxuXHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcclxuICAgIGNvbnN0IGNoYXIgPSBzdHJbaV07XHJcbiAgICBpZiAoIShjaGFyIGluIGNoYXJNYXApKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjaGFyYWN0ZXIgJyR7Y2hhcn0nIGluIGlucHV0IHN0cmluZ2ApO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdmFsdWUgPSBCaWdJbnQoY2hhck1hcFtjaGFyXSk7XHJcbiAgICByZXN1bHQgPSByZXN1bHQgKiBiYXNlICsgdmFsdWU7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBfX2dldE1heFZhbHVlKG46IGJpZ2ludCk6IGJpZ2ludCB7XHJcbiAgcmV0dXJuIEJpZ0ludChFTkNPRElORy5sZW5ndGgpICoqIG4gLSAxbjtcclxufVxyXG5cclxuY29uc3QgaWRHZW5lcmF0b3IgPSBkZWZpbmVJZEdlbmVyYXRvcih7IGxlbmd0aDogMjQsIHRpbWVzdGFtcDogZmFsc2UsIHNlcXVlbnRpYWw6IGZhbHNlIH0pO1xyXG5cclxuZXhwb3J0IGNvbnN0IF9fY3JlYXRlSWQgPSBpZEdlbmVyYXRvci5jcmVhdGVJZDtcclxuIiwKICAgICJpbXBvcnQgeyBfX2NyZWF0ZUlkIH0gZnJvbSBcIi4uL3V0aWxzL2NyZWF0ZS1pZC50c1wiO1xyXG5cclxuZXhwb3J0IHR5cGUgRXhlY3V0ZUlkR2VuZXJhdG9yID0gKGhlYWRlcnM/OiBIZWFkZXJzKSA9PiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz47XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lRGVmYXVsdEV4ZWN1dGVJZEdlbmVyYXRvcigpIHtcclxuICByZXR1cm4gX19jcmVhdGVJZDtcclxufVxyXG4iLAogICAgImltcG9ydCB7IHR5cGUgJHR5cGVzLCBfX2luaXRMaXN0ZW5lciwgX19pbml0RXhlY3V0ZXIsIF9faW5pdEV2ZW50TWFuYWdlciwgdHlwZSBFeGVjdXRlSWQsIHR5cGUgTG9nZ2VyLCB0eXBlIE1peGluLCB0eXBlIEdlbmVyYXRlZEluaXQsIHR5cGUgUGluZywgdHlwZSBMb2dnZXJTdWJtaXR0aW5nSGFuZGxlciwgdHlwZSBMb2dnZXJJbnNlcnRpbmdIYW5kbGVyIH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XHJcbmltcG9ydCB7IGRlZmluZURlZmF1bHRFeGVjdXRlSWRHZW5lcmF0b3IgfSBmcm9tIFwiLi4vZXhlY3V0ZS9leGVjdXRlLWlkLWdlbmVyYXRvci50c1wiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNaWxraW9Jbml0IHtcclxuICAgIHBvcnQ6IG51bWJlcjtcclxuICAgIGRldmVsb3A6IGJvb2xlYW47XHJcbiAgICBmZXRjaEVudj86IChrZXk6IHN0cmluZykgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gICAgYWNjZXNzS2V5Pzogc3RyaW5nO1xyXG4gICAgY29ycz86IHtcclxuICAgICAgICBjb3JzQWxsb3dNZXRob2RzPzogc3RyaW5nO1xyXG4gICAgICAgIGNvcnNBbGxvd0hlYWRlcnM/OiBzdHJpbmc7XHJcbiAgICAgICAgY29yc0FsbG93T3JpZ2luPzogc3RyaW5nO1xyXG4gICAgfTtcclxuICAgIGlnbm9yZVBhdGhMZXZlbD86IG51bWJlcjtcclxuICAgIHJlYWxJcD86IChoZWFkZXJzOiBIZWFkZXJzKSA9PiBzdHJpbmc7XHJcbiAgICBleGVjdXRlSWQ/OiAoaGVhZGVyczogSGVhZGVycykgPT4gc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+O1xyXG4gICAgb25Mb2dnZXJTdWJtaXR0aW5nPzogTG9nZ2VyU3VibWl0dGluZ0hhbmRsZXI7XHJcbiAgICBvbkxvZ2dlckluc2VydGluZz86IExvZ2dlckluc2VydGluZ0hhbmRsZXI7XHJcbiAgICBib290c3RyYXBzPzogQXJyYXk8KHdvcmxkOiBhbnkpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkPjtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgTWlsa2lvUnVudGltZUluaXQ8VCBleHRlbmRzIE1pbGtpb0luaXQ+ID0gTWl4aW48XHJcbiAgICBULFxyXG4gICAge1xyXG4gICAgICAgIGV4ZWN1dGVJZDogKGhlYWRlcnM6IEhlYWRlcnMpID0+IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPjtcclxuICAgICAgICBydW50aW1lOiB7XHJcbiAgICAgICAgICAgIHJlcXVlc3Q6IE1hcDxFeGVjdXRlSWQsIHsgbG9nZ2VyOiBMb2dnZXIgfT47XHJcbiAgICAgICAgICAgIGNvbmZpZzogQXdhaXRlZDxSZXR1cm5UeXBlPCR0eXBlc1tcImdlbmVyYXRlZFwiXVtcImNvbmZpZ1NjaGVtYVwiXT4+O1xyXG4gICAgICAgICAgICBhcHA6IGFueTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIG9uOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIF9faW5pdEV2ZW50TWFuYWdlcj4+W1wib25cIl07XHJcbiAgICAgICAgb2ZmOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIF9faW5pdEV2ZW50TWFuYWdlcj4+W1wib2ZmXCJdO1xyXG4gICAgICAgIGVtaXQ6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgX19pbml0RXZlbnRNYW5hZ2VyPj5bXCJlbWl0XCJdO1xyXG4gICAgfVxyXG4+O1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVdvcmxkPE1pbGtpb09wdGlvbnMgZXh0ZW5kcyBNaWxraW9Jbml0PihnZW5lcmF0ZWQ6IEdlbmVyYXRlZEluaXQsIGNvbmZpZ1NjaGVtYTogeyBnZXQ6ICgpID0+IFByb21pc2U8UmVjb3JkPGFueSwgYW55Pj4gfSwgb3B0aW9uczogTWlsa2lvT3B0aW9ucyk6IFByb21pc2U8dW5rbm93bj4ge1xyXG4gICAgY29uc3QgZXhlY3V0ZUlkID0gb3B0aW9ucy5leGVjdXRlSWQgPz8gZGVmaW5lRGVmYXVsdEV4ZWN1dGVJZEdlbmVyYXRvcigpO1xyXG4gICAgY29uc3QgY29uZmlnID0gYXdhaXQgY29uZmlnU2NoZW1hLmdldCgpO1xyXG5cclxuICAgIGNvbnN0IHJ1bnRpbWUgPSB7XHJcbiAgICAgICAgcmVxdWVzdDogbmV3IE1hcCgpLFxyXG4gICAgICAgIGNvbmZpZyxcclxuICAgIH0gYXMgTWlsa2lvUnVudGltZUluaXQ8TWlsa2lvT3B0aW9ucz5bXCJydW50aW1lXCJdO1xyXG5cclxuICAgIGNvbnN0IGV2ZW50TWFuYWdlciA9IF9faW5pdEV2ZW50TWFuYWdlcigpO1xyXG5cclxuICAgIGlmIChvcHRpb25zLmFjY2Vzc0tleSkgb3B0aW9ucy5pZ25vcmVQYXRoTGV2ZWwgPSBvcHRpb25zLmlnbm9yZVBhdGhMZXZlbCA/IG9wdGlvbnMuaWdub3JlUGF0aExldmVsICsgMSA6IDE7XHJcblxyXG4gICAgY29uc3QgXzogTWlsa2lvUnVudGltZUluaXQ8TWlsa2lvT3B0aW9ucz4gPSB7XHJcbiAgICAgICAgLi4ub3B0aW9ucyxcclxuICAgICAgICBleGVjdXRlSWQsXHJcbiAgICAgICAgcnVudGltZSxcclxuICAgICAgICBvbjogZXZlbnRNYW5hZ2VyLm9uLFxyXG4gICAgICAgIG9mZjogZXZlbnRNYW5hZ2VyLm9mZixcclxuICAgICAgICBlbWl0OiBldmVudE1hbmFnZXIuZW1pdCxcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgZXhlY3V0ZXIgPSBfX2luaXRFeGVjdXRlcihnZW5lcmF0ZWQsIF8pO1xyXG4gICAgY29uc3QgbGlzdGVuZXIgPSBfX2luaXRMaXN0ZW5lcihnZW5lcmF0ZWQsIF8sIGV4ZWN1dGVyKTtcclxuXHJcbiAgICAvLyBJbml0aWFsaXplIHRoZSBhcHBcclxuICAgIGNvbnN0IHdvcmxkID0ge1xyXG4gICAgICAgIF8sXHJcbiAgICAgICAgLy8gZXZlbnQgbWFuYWdlclxyXG4gICAgICAgIG9uOiBldmVudE1hbmFnZXIub24sXHJcbiAgICAgICAgb2ZmOiBldmVudE1hbmFnZXIub2ZmLFxyXG4gICAgICAgIGVtaXQ6IGV2ZW50TWFuYWdlci5lbWl0LFxyXG4gICAgICAgIC8vIGxpc3RlbmVyXHJcbiAgICAgICAgbGlzdGVuZXIsXHJcbiAgICAgICAgLy8gZnVuY3Rpb25cclxuICAgICAgICBjb25maWcsXHJcbiAgICB9O1xyXG5cclxuICAgIHJ1bnRpbWUuYXBwID0gd29ybGQ7XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9ucy5ib290c3RyYXBzKSkge1xyXG4gICAgICAgIGZvciAoY29uc3QgYm9vdHN0cmFwIG9mIG9wdGlvbnMuYm9vdHN0cmFwcykge1xyXG4gICAgICAgICAgICBhd2FpdCBib290c3RyYXAod29ybGQgYXMgTWlsa2lvV29ybGQ8R2VuZXJhdGVkSW5pdCwgTWlsa2lvT3B0aW9ucz4pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCBQcm9taXNlLmFsbChnZW5lcmF0ZWQuaGFuZGxlclNjaGVtYS5sb2FkSGFuZGxlcnMod29ybGQpKTtcclxuXHJcbiAgICBjb25zdCByb3V0ZUtleXMgPSBPYmplY3Qua2V5cyhnZW5lcmF0ZWQucm91dGVTY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgYW55Pik7XHJcbiAgICBjb25zb2xlLmxvZyhgXFxu4pazIFJvdXRlczpcXG4gICAgJHtyb3V0ZUtleXMuam9pbihcIlxcbiAgICBcIil9XFxuICBBIHRvdGFsIG9mICR7cm91dGVLZXlzLmxlbmd0aH0gcm91dGVzLmApO1xyXG4gICAgY29uc29sZS5sb2coYFxcbuKWsyBTZXJ2ZXI6IGh0dHA6Ly9sb2NhbGhvc3Q6JHtvcHRpb25zLnBvcnR9YCk7XHJcblxyXG4gICAgcmV0dXJuIHdvcmxkIGFzIHVua25vd247XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWlsa2lvV29ybGQ8R2VuZXJhdGVkIGV4dGVuZHMgR2VuZXJhdGVkSW5pdCwgTWlsa2lvT3B0aW9ucyBleHRlbmRzIE1pbGtpb0luaXQgPSBNaWxraW9Jbml0PiB7XHJcbiAgICBfOiBNaWxraW9SdW50aW1lSW5pdDxNaWxraW9PcHRpb25zPjtcclxuICAgIC8vIGV2ZW50IG1hbmFnZXJcclxuICAgIG9uOiA8S2V5IGV4dGVuZHMga2V5b2YgR2VuZXJhdGVkW1wiZXZlbnRzXCJdLCBIYW5kbGVyIGV4dGVuZHMgKGV2ZW50OiBHZW5lcmF0ZWRbXCJldmVudHNcIl1bS2V5XSkgPT4gdm9pZD4oa2V5OiBLZXksIGhhbmRsZXI6IEhhbmRsZXIpID0+ICgoKSA9PiB2b2lkKTtcclxuICAgIG9mZjogPEtleSBleHRlbmRzIGtleW9mIEdlbmVyYXRlZFtcImV2ZW50c1wiXSwgSGFuZGxlciBleHRlbmRzIChldmVudDogR2VuZXJhdGVkW1wiZXZlbnRzXCJdW0tleV0pID0+IHZvaWQ+KGtleTogS2V5LCBoYW5kbGVyOiBIYW5kbGVyKSA9PiB2b2lkO1xyXG4gICAgZW1pdDogPEtleSBleHRlbmRzIGtleW9mIEdlbmVyYXRlZFtcImV2ZW50c1wiXSwgVmFsdWUgZXh0ZW5kcyBHZW5lcmF0ZWRbXCJldmVudHNcIl1bS2V5XT4oa2V5OiBLZXksIHZhbHVlOiBWYWx1ZSkgPT4gUHJvbWlzZTx2b2lkPjtcclxuICAgIHBpbmc6IChvcHRpb25zPzogeyB0aW1lb3V0PzogbnVtYmVyIH0pID0+IFByb21pc2U8UGluZz47XHJcbiAgICAvLyBsaXN0ZW5lclxyXG4gICAgbGlzdGVuZXI6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgX19pbml0TGlzdGVuZXI+PjtcclxuICAgIGNvbmZpZzogUmVhZG9ubHk8QXdhaXRlZDxSZXR1cm5UeXBlPCR0eXBlc1tcImNvbmZpZ1NjaGVtYVwiXVtcImdldFwiXT4+PjtcclxufVxyXG4iLAogICAgImV4cG9ydCBmdW5jdGlvbiB0eXBpYTxUeXBpYUluaXRUIGV4dGVuZHMgVHlwaWFJbml0Pihpbml0OiBUeXBpYUluaXRUKTogVHlwaWE8VHlwaWFJbml0VD4ge1xyXG4gIHJldHVybiBpbml0IGFzIHVua25vd24gYXMgVHlwaWE8VHlwaWFJbml0VD47XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFR5cGlhSW5pdCA9ICgpID0+IFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj4gfCBQcm9taXNlPFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj4+O1xyXG5cclxuZXhwb3J0IHR5cGUgVHlwaWE8VHlwaWFJbml0VCBleHRlbmRzIFR5cGlhSW5pdD4gPSBUeXBpYUluaXRUO1xyXG4iLAogICAgIi8qKlxuICogQG1vZHVsZSBjb25zdGFudHNcbiAqIEBzdW1tYXJ5IFVzZWZ1bCBjb25zdGFudHNcbiAqIEBkZXNjcmlwdGlvblxuICogQ29sbGVjdGlvbiBvZiB1c2VmdWwgZGF0ZSBjb25zdGFudHMuXG4gKlxuICogVGhlIGNvbnN0YW50cyBjb3VsZCBiZSBpbXBvcnRlZCBmcm9tIGBkYXRlLWZucy9jb25zdGFudHNgOlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBtYXhUaW1lLCBtaW5UaW1lIH0gZnJvbSBcIi4vY29uc3RhbnRzL2RhdGUtZm5zL2NvbnN0YW50c1wiO1xuICpcbiAqIGZ1bmN0aW9uIGlzQWxsb3dlZFRpbWUodGltZSkge1xuICogICByZXR1cm4gdGltZSA8PSBtYXhUaW1lICYmIHRpbWUgPj0gbWluVGltZTtcbiAqIH1cbiAqIGBgYFxuICovXG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBkYXlzSW5XZWVrXG4gKiBAc3VtbWFyeSBEYXlzIGluIDEgd2Vlay5cbiAqL1xuZXhwb3J0IGNvbnN0IGRheXNJbldlZWsgPSA3O1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgZGF5c0luWWVhclxuICogQHN1bW1hcnkgRGF5cyBpbiAxIHllYXIuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIb3cgbWFueSBkYXlzIGluIGEgeWVhci5cbiAqXG4gKiBPbmUgeWVhcnMgZXF1YWxzIDM2NS4yNDI1IGRheXMgYWNjb3JkaW5nIHRvIHRoZSBmb3JtdWxhOlxuICpcbiAqID4gTGVhcCB5ZWFyIG9jY3VycyBldmVyeSA0IHllYXJzLCBleGNlcHQgZm9yIHllYXJzIHRoYXQgYXJlIGRpdmlzaWJsZSBieSAxMDAgYW5kIG5vdCBkaXZpc2libGUgYnkgNDAwLlxuICogPiAxIG1lYW4geWVhciA9ICgzNjUrMS80LTEvMTAwKzEvNDAwKSBkYXlzID0gMzY1LjI0MjUgZGF5c1xuICovXG5leHBvcnQgY29uc3QgZGF5c0luWWVhciA9IDM2NS4yNDI1O1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWF4VGltZVxuICogQHN1bW1hcnkgTWF4aW11bSBhbGxvd2VkIHRpbWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IG1heFRpbWUgfSBmcm9tIFwiLi9jb25zdGFudHMvZGF0ZS1mbnMvY29uc3RhbnRzXCI7XG4gKlxuICogY29uc3QgaXNWYWxpZCA9IDg2NDAwMDAwMDAwMDAwMDEgPD0gbWF4VGltZTtcbiAqIC8vPT4gZmFsc2VcbiAqXG4gKiBuZXcgRGF0ZSg4NjQwMDAwMDAwMDAwMDAxKTtcbiAqIC8vPT4gSW52YWxpZCBEYXRlXG4gKi9cbmV4cG9ydCBjb25zdCBtYXhUaW1lID0gTWF0aC5wb3coMTAsIDgpICogMjQgKiA2MCAqIDYwICogMTAwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pblRpbWVcbiAqIEBzdW1tYXJ5IE1pbmltdW0gYWxsb3dlZCB0aW1lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBtaW5UaW1lIH0gZnJvbSBcIi4vY29uc3RhbnRzL2RhdGUtZm5zL2NvbnN0YW50c1wiO1xuICpcbiAqIGNvbnN0IGlzVmFsaWQgPSAtODY0MDAwMDAwMDAwMDAwMSA+PSBtaW5UaW1lO1xuICogLy89PiBmYWxzZVxuICpcbiAqIG5ldyBEYXRlKC04NjQwMDAwMDAwMDAwMDAxKVxuICogLy89PiBJbnZhbGlkIERhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IG1pblRpbWUgPSAtbWF4VGltZTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbGxpc2Vjb25kc0luV2Vla1xuICogQHN1bW1hcnkgTWlsbGlzZWNvbmRzIGluIDEgd2Vlay5cbiAqL1xuZXhwb3J0IGNvbnN0IG1pbGxpc2Vjb25kc0luV2VlayA9IDYwNDgwMDAwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbGxpc2Vjb25kc0luRGF5XG4gKiBAc3VtbWFyeSBNaWxsaXNlY29uZHMgaW4gMSBkYXkuXG4gKi9cbmV4cG9ydCBjb25zdCBtaWxsaXNlY29uZHNJbkRheSA9IDg2NDAwMDAwO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWlsbGlzZWNvbmRzSW5NaW51dGVcbiAqIEBzdW1tYXJ5IE1pbGxpc2Vjb25kcyBpbiAxIG1pbnV0ZVxuICovXG5leHBvcnQgY29uc3QgbWlsbGlzZWNvbmRzSW5NaW51dGUgPSA2MDAwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbGxpc2Vjb25kc0luSG91clxuICogQHN1bW1hcnkgTWlsbGlzZWNvbmRzIGluIDEgaG91clxuICovXG5leHBvcnQgY29uc3QgbWlsbGlzZWNvbmRzSW5Ib3VyID0gMzYwMDAwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbGxpc2Vjb25kc0luU2Vjb25kXG4gKiBAc3VtbWFyeSBNaWxsaXNlY29uZHMgaW4gMSBzZWNvbmRcbiAqL1xuZXhwb3J0IGNvbnN0IG1pbGxpc2Vjb25kc0luU2Vjb25kID0gMTAwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbnV0ZXNJblllYXJcbiAqIEBzdW1tYXJ5IE1pbnV0ZXMgaW4gMSB5ZWFyLlxuICovXG5leHBvcnQgY29uc3QgbWludXRlc0luWWVhciA9IDUyNTYwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbnV0ZXNJbk1vbnRoXG4gKiBAc3VtbWFyeSBNaW51dGVzIGluIDEgbW9udGguXG4gKi9cbmV4cG9ydCBjb25zdCBtaW51dGVzSW5Nb250aCA9IDQzMjAwO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWludXRlc0luRGF5XG4gKiBAc3VtbWFyeSBNaW51dGVzIGluIDEgZGF5LlxuICovXG5leHBvcnQgY29uc3QgbWludXRlc0luRGF5ID0gMTQ0MDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbnV0ZXNJbkhvdXJcbiAqIEBzdW1tYXJ5IE1pbnV0ZXMgaW4gMSBob3VyLlxuICovXG5leHBvcnQgY29uc3QgbWludXRlc0luSG91ciA9IDYwO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbW9udGhzSW5RdWFydGVyXG4gKiBAc3VtbWFyeSBNb250aHMgaW4gMSBxdWFydGVyLlxuICovXG5leHBvcnQgY29uc3QgbW9udGhzSW5RdWFydGVyID0gMztcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1vbnRoc0luWWVhclxuICogQHN1bW1hcnkgTW9udGhzIGluIDEgeWVhci5cbiAqL1xuZXhwb3J0IGNvbnN0IG1vbnRoc0luWWVhciA9IDEyO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgcXVhcnRlcnNJblllYXJcbiAqIEBzdW1tYXJ5IFF1YXJ0ZXJzIGluIDEgeWVhclxuICovXG5leHBvcnQgY29uc3QgcXVhcnRlcnNJblllYXIgPSA0O1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgc2Vjb25kc0luSG91clxuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIGhvdXIuXG4gKi9cbmV4cG9ydCBjb25zdCBzZWNvbmRzSW5Ib3VyID0gMzYwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJbk1pbnV0ZVxuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIG1pbnV0ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHNlY29uZHNJbk1pbnV0ZSA9IDYwO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgc2Vjb25kc0luRGF5XG4gKiBAc3VtbWFyeSBTZWNvbmRzIGluIDEgZGF5LlxuICovXG5leHBvcnQgY29uc3Qgc2Vjb25kc0luRGF5ID0gc2Vjb25kc0luSG91ciAqIDI0O1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgc2Vjb25kc0luV2Vla1xuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIHdlZWsuXG4gKi9cbmV4cG9ydCBjb25zdCBzZWNvbmRzSW5XZWVrID0gc2Vjb25kc0luRGF5ICogNztcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJblllYXJcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSB5ZWFyLlxuICovXG5leHBvcnQgY29uc3Qgc2Vjb25kc0luWWVhciA9IHNlY29uZHNJbkRheSAqIGRheXNJblllYXI7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBzZWNvbmRzSW5Nb250aFxuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIG1vbnRoXG4gKi9cbmV4cG9ydCBjb25zdCBzZWNvbmRzSW5Nb250aCA9IHNlY29uZHNJblllYXIgLyAxMjtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJblF1YXJ0ZXJcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSBxdWFydGVyLlxuICovXG5leHBvcnQgY29uc3Qgc2Vjb25kc0luUXVhcnRlciA9IHNlY29uZHNJbk1vbnRoICogMztcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIGNvbnN0cnVjdEZyb21TeW1ib2xcbiAqIEBzdW1tYXJ5IFN5bWJvbCBlbmFibGluZyBEYXRlIGV4dGVuc2lvbnMgdG8gaW5oZXJpdCBwcm9wZXJ0aWVzIGZyb20gdGhlIHJlZmVyZW5jZSBkYXRlLlxuICpcbiAqIFRoZSBzeW1ib2wgaXMgdXNlZCB0byBlbmFibGUgdGhlIGBjb25zdHJ1Y3RGcm9tYCBmdW5jdGlvbiB0byBjb25zdHJ1Y3QgYSBkYXRlXG4gKiB1c2luZyBhIHJlZmVyZW5jZSBkYXRlIGFuZCBhIHZhbHVlLiBJdCBhbGxvd3MgdG8gdHJhbnNmZXIgZXh0cmEgcHJvcGVydGllc1xuICogZnJvbSB0aGUgcmVmZXJlbmNlIGRhdGUgdG8gdGhlIG5ldyBkYXRlLiBJdCdzIHVzZWZ1bCBmb3IgZXh0ZW5zaW9ucyBsaWtlXG4gKiBbYFRaRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy90eikgdGhhdCBhY2NlcHQgYSB0aW1lIHpvbmUgYXNcbiAqIGEgY29uc3RydWN0b3IgYXJndW1lbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBjb25zdHJ1Y3RGcm9tU3ltYm9sID0gU3ltYm9sLmZvcihcImNvbnN0cnVjdERhdGVGcm9tXCIpO1xuIiwKICAgICJpbXBvcnQgeyBjb25zdHJ1Y3RGcm9tU3ltYm9sIH0gZnJvbSBcIi4vY29uc3RhbnRzLmpzXCI7XG5cbi8qKlxuICogQG5hbWUgY29uc3RydWN0RnJvbVxuICogQGNhdGVnb3J5IEdlbmVyaWMgSGVscGVyc1xuICogQHN1bW1hcnkgQ29uc3RydWN0cyBhIGRhdGUgdXNpbmcgdGhlIHJlZmVyZW5jZSBkYXRlIGFuZCB0aGUgdmFsdWVcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSBmdW5jdGlvbiBjb25zdHJ1Y3RzIGEgbmV3IGRhdGUgdXNpbmcgdGhlIGNvbnN0cnVjdG9yIGZyb20gdGhlIHJlZmVyZW5jZVxuICogZGF0ZSBhbmQgdGhlIGdpdmVuIHZhbHVlLiBJdCBoZWxwcyB0byBidWlsZCBnZW5lcmljIGZ1bmN0aW9ucyB0aGF0IGFjY2VwdFxuICogZGF0ZSBleHRlbnNpb25zLlxuICpcbiAqIEl0IGRlZmF1bHRzIHRvIGBEYXRlYCBpZiB0aGUgcGFzc2VkIHJlZmVyZW5jZSBkYXRlIGlzIGEgbnVtYmVyIG9yIGEgc3RyaW5nLlxuICpcbiAqIFN0YXJ0aW5nIGZyb20gdjMuNy4wLCBpdCBhbGxvd3MgdG8gY29uc3RydWN0IGEgZGF0ZSB1c2luZyBgW1N5bWJvbC5mb3IoXCJjb25zdHJ1Y3REYXRlRnJvbVwiKV1gXG4gKiBlbmFibGluZyB0byB0cmFuc2ZlciBleHRyYSBwcm9wZXJ0aWVzIGZyb20gdGhlIHJlZmVyZW5jZSBkYXRlIHRvIHRoZSBuZXcgZGF0ZS5cbiAqIEl0J3MgdXNlZnVsIGZvciBleHRlbnNpb25zIGxpa2UgW2BUWkRhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdHopXG4gKiB0aGF0IGFjY2VwdCBhIHRpbWUgem9uZSBhcyBhIGNvbnN0cnVjdG9yIGFyZ3VtZW50LlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIHJlZmVyZW5jZSBkYXRlIHRvIHRha2UgY29uc3RydWN0b3IgZnJvbVxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNyZWF0ZSB0aGUgZGF0ZVxuICpcbiAqIEByZXR1cm5zIERhdGUgaW5pdGlhbGl6ZWQgdXNpbmcgdGhlIGdpdmVuIGRhdGUgYW5kIHZhbHVlXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IGNvbnN0cnVjdEZyb20gfSBmcm9tIFwiLi9jb25zdHJ1Y3RGcm9tL2RhdGUtZm5zXCI7XG4gKlxuICogLy8gQSBmdW5jdGlvbiB0aGF0IGNsb25lcyBhIGRhdGUgcHJlc2VydmluZyB0aGUgb3JpZ2luYWwgdHlwZVxuICogZnVuY3Rpb24gY2xvbmVEYXRlPERhdGVUeXBlIGV4dGVuZHMgRGF0ZT4oZGF0ZTogRGF0ZVR5cGUpOiBEYXRlVHlwZSB7XG4gKiAgIHJldHVybiBjb25zdHJ1Y3RGcm9tKFxuICogICAgIGRhdGUsIC8vIFVzZSBjb25zdHJ1Y3RvciBmcm9tIHRoZSBnaXZlbiBkYXRlXG4gKiAgICAgZGF0ZS5nZXRUaW1lKCkgLy8gVXNlIHRoZSBkYXRlIHZhbHVlIHRvIGNyZWF0ZSBhIG5ldyBkYXRlXG4gKiAgICk7XG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zdHJ1Y3RGcm9tKGRhdGUsIHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgZGF0ZSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZGF0ZSh2YWx1ZSk7XG5cbiAgaWYgKGRhdGUgJiYgdHlwZW9mIGRhdGUgPT09IFwib2JqZWN0XCIgJiYgY29uc3RydWN0RnJvbVN5bWJvbCBpbiBkYXRlKVxuICAgIHJldHVybiBkYXRlW2NvbnN0cnVjdEZyb21TeW1ib2xdKHZhbHVlKTtcblxuICBpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBuZXcgZGF0ZS5jb25zdHJ1Y3Rvcih2YWx1ZSk7XG5cbiAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlKTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBjb25zdHJ1Y3RGcm9tO1xuIiwKICAgICJpbXBvcnQgeyBjb25zdHJ1Y3RGcm9tIH0gZnJvbSBcIi4vY29uc3RydWN0RnJvbS5qc1wiO1xuXG4vKipcbiAqIEBuYW1lIHRvRGF0ZVxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBDb252ZXJ0IHRoZSBnaXZlbiBhcmd1bWVudCB0byBhbiBpbnN0YW5jZSBvZiBEYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQ29udmVydCB0aGUgZ2l2ZW4gYXJndW1lbnQgdG8gYW4gaW5zdGFuY2Ugb2YgRGF0ZS5cbiAqXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgYW4gaW5zdGFuY2Ugb2YgRGF0ZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgaXRzIGNsb25lLlxuICpcbiAqIElmIHRoZSBhcmd1bWVudCBpcyBhIG51bWJlciwgaXQgaXMgdHJlYXRlZCBhcyBhIHRpbWVzdGFtcC5cbiAqXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgbm9uZSBvZiB0aGUgYWJvdmUsIHRoZSBmdW5jdGlvbiByZXR1cm5zIEludmFsaWQgRGF0ZS5cbiAqXG4gKiBTdGFydGluZyBmcm9tIHYzLjcuMCwgaXQgY2xvbmVzIGEgZGF0ZSB1c2luZyBgW1N5bWJvbC5mb3IoXCJjb25zdHJ1Y3REYXRlRnJvbVwiKV1gXG4gKiBlbmFibGluZyB0byB0cmFuc2ZlciBleHRyYSBwcm9wZXJ0aWVzIGZyb20gdGhlIHJlZmVyZW5jZSBkYXRlIHRvIHRoZSBuZXcgZGF0ZS5cbiAqIEl0J3MgdXNlZnVsIGZvciBleHRlbnNpb25zIGxpa2UgW2BUWkRhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdHopXG4gKiB0aGF0IGFjY2VwdCBhIHRpbWUgem9uZSBhcyBhIGNvbnN0cnVjdG9yIGFyZ3VtZW50LlxuICpcbiAqICoqTm90ZSoqOiAqYWxsKiBEYXRlIGFyZ3VtZW50cyBwYXNzZWQgdG8gYW55ICpkYXRlLWZucyogZnVuY3Rpb24gaXMgcHJvY2Vzc2VkIGJ5IGB0b0RhdGVgLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gYXJndW1lbnQgLSBUaGUgdmFsdWUgdG8gY29udmVydFxuICpcbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgZGF0ZSBpbiB0aGUgbG9jYWwgdGltZSB6b25lXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENsb25lIHRoZSBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gdG9EYXRlKG5ldyBEYXRlKDIwMTQsIDEsIDExLCAxMSwgMzAsIDMwKSlcbiAqIC8vPT4gVHVlIEZlYiAxMSAyMDE0IDExOjMwOjMwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnZlcnQgdGhlIHRpbWVzdGFtcCB0byBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gdG9EYXRlKDEzOTIwOTg0MzAwMDApXG4gKiAvLz0+IFR1ZSBGZWIgMTEgMjAxNCAxMTozMDozMFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9EYXRlKGFyZ3VtZW50LCBjb250ZXh0KSB7XG4gIC8vIFtUT0RPXSBHZXQgcmlkIG9mIGB0b0RhdGVgIG9yIGBjb25zdHJ1Y3RGcm9tYD9cbiAgcmV0dXJuIGNvbnN0cnVjdEZyb20oY29udGV4dCB8fCBhcmd1bWVudCwgYXJndW1lbnQpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IHRvRGF0ZTtcbiIsCiAgICAibGV0IGRlZmF1bHRPcHRpb25zID0ge307XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0T3B0aW9ucygpIHtcbiAgcmV0dXJuIGRlZmF1bHRPcHRpb25zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0RGVmYXVsdE9wdGlvbnMobmV3T3B0aW9ucykge1xuICBkZWZhdWx0T3B0aW9ucyA9IG5ld09wdGlvbnM7XG59XG4iLAogICAgImltcG9ydCB7IGdldERlZmF1bHRPcHRpb25zIH0gZnJvbSBcIi4vX2xpYi9kZWZhdWx0T3B0aW9ucy5qc1wiO1xuaW1wb3J0IHsgdG9EYXRlIH0gZnJvbSBcIi4vdG9EYXRlLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBzdGFydE9mV2Vla30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZXZWVrXG4gKiBAY2F0ZWdvcnkgV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgc3RhcnQgb2YgYSB3ZWVrXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhIHdlZWsgZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mV2VlayhuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApKVxuICogLy89PiBTdW4gQXVnIDMxIDIwMTQgMDA6MDA6MDBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSWYgdGhlIHdlZWsgc3RhcnRzIG9uIE1vbmRheSwgdGhlIHN0YXJ0IG9mIHRoZSB3ZWVrIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZldlZWsobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSwgeyB3ZWVrU3RhcnRzT246IDEgfSlcbiAqIC8vPT4gTW9uIFNlcCAwMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFydE9mV2VlayhkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTtcbiAgY29uc3Qgd2Vla1N0YXJ0c09uID1cbiAgICBvcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIGRlZmF1bHRPcHRpb25zLndlZWtTdGFydHNPbiA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgMDtcblxuICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7XG4gIGNvbnN0IGRheSA9IF9kYXRlLmdldERheSgpO1xuICBjb25zdCBkaWZmID0gKGRheSA8IHdlZWtTdGFydHNPbiA/IDcgOiAwKSArIGRheSAtIHdlZWtTdGFydHNPbjtcblxuICBfZGF0ZS5zZXREYXRlKF9kYXRlLmdldERhdGUoKSAtIGRpZmYpO1xuICBfZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IHN0YXJ0T2ZXZWVrO1xuIiwKICAgICJpbXBvcnQgeyBzdGFydE9mV2VlayB9IGZyb20gXCIuL3N0YXJ0T2ZXZWVrLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBzdGFydE9mSVNPV2Vla30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZJU09XZWVrXG4gKiBAY2F0ZWdvcnkgSVNPIFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhbiBJU08gd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGFuIElTTyB3ZWVrIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogSVNPIHdlZWstbnVtYmVyaW5nIHllYXI6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgc3RhcnQgb2YgYW4gSVNPIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGFuIElTTyB3ZWVrIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZklTT1dlZWsobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gTW9uIFNlcCAwMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFydE9mSVNPV2VlayhkYXRlLCBvcHRpb25zKSB7XG4gIHJldHVybiBzdGFydE9mV2VlayhkYXRlLCB7IC4uLm9wdGlvbnMsIHdlZWtTdGFydHNPbjogMSB9KTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBzdGFydE9mSVNPV2VlaztcbiIsCiAgICAiaW1wb3J0IHsgY29uc3RydWN0RnJvbSB9IGZyb20gXCIuL2NvbnN0cnVjdEZyb20uanNcIjtcbmltcG9ydCB7IHN0YXJ0T2ZJU09XZWVrIH0gZnJvbSBcIi4vc3RhcnRPZklTT1dlZWsuanNcIjtcbmltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgZ2V0SVNPV2Vla1llYXJ9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBnZXRJU09XZWVrWWVhclxuICogQGNhdGVnb3J5IElTTyBXZWVrLU51bWJlcmluZyBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyIG9mIHRoZSBnaXZlbiBkYXRlLFxuICogd2hpY2ggYWx3YXlzIHN0YXJ0cyAzIGRheXMgYmVmb3JlIHRoZSB5ZWFyJ3MgZmlyc3QgVGh1cnNkYXkuXG4gKlxuICogSVNPIHdlZWstbnVtYmVyaW5nIHllYXI6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgSVNPIHdlZWstbnVtYmVyaW5nIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggSVNPLXdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMiBKYW51YXJ5IDIwMDU/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRJU09XZWVrWWVhcihuZXcgRGF0ZSgyMDA1LCAwLCAyKSlcbiAqIC8vPT4gMjAwNFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SVNPV2Vla1llYXIoZGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7XG4gIGNvbnN0IHllYXIgPSBfZGF0ZS5nZXRGdWxsWWVhcigpO1xuXG4gIGNvbnN0IGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIgPSBjb25zdHJ1Y3RGcm9tKF9kYXRlLCAwKTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZOZXh0WWVhci5zZXRGdWxsWWVhcih5ZWFyICsgMSwgMCwgNCk7XG4gIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIGNvbnN0IHN0YXJ0T2ZOZXh0WWVhciA9IHN0YXJ0T2ZJU09XZWVrKGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIpO1xuXG4gIGNvbnN0IGZvdXJ0aE9mSmFudWFyeU9mVGhpc1llYXIgPSBjb25zdHJ1Y3RGcm9tKF9kYXRlLCAwKTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhci5zZXRGdWxsWWVhcih5ZWFyLCAwLCA0KTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhci5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgY29uc3Qgc3RhcnRPZlRoaXNZZWFyID0gc3RhcnRPZklTT1dlZWsoZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhcik7XG5cbiAgaWYgKF9kYXRlLmdldFRpbWUoKSA+PSBzdGFydE9mTmV4dFllYXIuZ2V0VGltZSgpKSB7XG4gICAgcmV0dXJuIHllYXIgKyAxO1xuICB9IGVsc2UgaWYgKF9kYXRlLmdldFRpbWUoKSA+PSBzdGFydE9mVGhpc1llYXIuZ2V0VGltZSgpKSB7XG4gICAgcmV0dXJuIHllYXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHllYXIgLSAxO1xuICB9XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgZ2V0SVNPV2Vla1llYXI7XG4iLAogICAgImltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBHb29nbGUgQ2hyb21lIGFzIG9mIDY3LjAuMzM5Ni44NyBpbnRyb2R1Y2VkIHRpbWV6b25lcyB3aXRoIG9mZnNldCB0aGF0IGluY2x1ZGVzIHNlY29uZHMuXG4gKiBUaGV5IHVzdWFsbHkgYXBwZWFyIGZvciBkYXRlcyB0aGF0IGRlbm90ZSB0aW1lIGJlZm9yZSB0aGUgdGltZXpvbmVzIHdlcmUgaW50cm9kdWNlZFxuICogKGUuZy4gZm9yICdFdXJvcGUvUHJhZ3VlJyB0aW1lem9uZSB0aGUgb2Zmc2V0IGlzIEdNVCswMDo1Nzo0NCBiZWZvcmUgMSBPY3RvYmVyIDE4OTFcbiAqIGFuZCBHTVQrMDE6MDA6MDAgYWZ0ZXIgdGhhdCBkYXRlKVxuICpcbiAqIERhdGUjZ2V0VGltZXpvbmVPZmZzZXQgcmV0dXJucyB0aGUgb2Zmc2V0IGluIG1pbnV0ZXMgYW5kIHdvdWxkIHJldHVybiA1NyBmb3IgdGhlIGV4YW1wbGUgYWJvdmUsXG4gKiB3aGljaCB3b3VsZCBsZWFkIHRvIGluY29ycmVjdCBjYWxjdWxhdGlvbnMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB0aW1lem9uZSBvZmZzZXQgaW4gbWlsbGlzZWNvbmRzIHRoYXQgdGFrZXMgc2Vjb25kcyBpbiBhY2NvdW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyhkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUpO1xuICBjb25zdCB1dGNEYXRlID0gbmV3IERhdGUoXG4gICAgRGF0ZS5VVEMoXG4gICAgICBfZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgX2RhdGUuZ2V0TW9udGgoKSxcbiAgICAgIF9kYXRlLmdldERhdGUoKSxcbiAgICAgIF9kYXRlLmdldEhvdXJzKCksXG4gICAgICBfZGF0ZS5nZXRNaW51dGVzKCksXG4gICAgICBfZGF0ZS5nZXRTZWNvbmRzKCksXG4gICAgICBfZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSxcbiAgICApLFxuICApO1xuICB1dGNEYXRlLnNldFVUQ0Z1bGxZZWFyKF9kYXRlLmdldEZ1bGxZZWFyKCkpO1xuICByZXR1cm4gK2RhdGUgLSArdXRjRGF0ZTtcbn1cbiIsCiAgICAiaW1wb3J0IHsgY29uc3RydWN0RnJvbSB9IGZyb20gXCIuLi9jb25zdHJ1Y3RGcm9tLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVEYXRlcyhjb250ZXh0LCAuLi5kYXRlcykge1xuICBjb25zdCBub3JtYWxpemUgPSBjb25zdHJ1Y3RGcm9tLmJpbmQoXG4gICAgbnVsbCxcbiAgICBjb250ZXh0IHx8IGRhdGVzLmZpbmQoKGRhdGUpID0+IHR5cGVvZiBkYXRlID09PSBcIm9iamVjdFwiKSxcbiAgKTtcbiAgcmV0dXJuIGRhdGVzLm1hcChub3JtYWxpemUpO1xufVxuIiwKICAgICJpbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIHN0YXJ0T2ZEYXl9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBzdGFydE9mRGF5XG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYSBkYXkgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIGRheSBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIHN0YXJ0IG9mIGEgZGF5XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhIGRheSBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZEYXkobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gVHVlIFNlcCAwMiAyMDE0IDAwOjAwOjAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFydE9mRGF5KGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pO1xuICBfZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IHN0YXJ0T2ZEYXk7XG4iLAogICAgImltcG9ydCB7IGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMgfSBmcm9tIFwiLi9fbGliL2dldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMuanNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZURhdGVzIH0gZnJvbSBcIi4vX2xpYi9ub3JtYWxpemVEYXRlcy5qc1wiO1xuaW1wb3J0IHsgbWlsbGlzZWNvbmRzSW5EYXkgfSBmcm9tIFwiLi9jb25zdGFudHMuanNcIjtcbmltcG9ydCB7IHN0YXJ0T2ZEYXkgfSBmcm9tIFwiLi9zdGFydE9mRGF5LmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXN9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXNcbiAqIEBjYXRlZ29yeSBEYXkgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgZGF5cyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIGRheXMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuIFRoaXMgbWVhbnMgdGhhdCB0aGUgdGltZXMgYXJlIHJlbW92ZWRcbiAqIGZyb20gdGhlIGRhdGVzIGFuZCB0aGVuIHRoZSBkaWZmZXJlbmNlIGluIGRheXMgaXMgY2FsY3VsYXRlZC5cbiAqXG4gKiBAcGFyYW0gbGF0ZXJEYXRlIC0gVGhlIGxhdGVyIGRhdGVcbiAqIEBwYXJhbSBlYXJsaWVyRGF0ZSAtIFRoZSBlYXJsaWVyIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgb2JqZWN0XG4gKlxuICogQHJldHVybnMgVGhlIG51bWJlciBvZiBjYWxlbmRhciBkYXlzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEhvdyBtYW55IGNhbGVuZGFyIGRheXMgYXJlIGJldHdlZW5cbiAqIC8vIDIgSnVseSAyMDExIDIzOjAwOjAwIGFuZCAyIEp1bHkgMjAxMiAwMDowMDowMD9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhcbiAqICAgbmV3IERhdGUoMjAxMiwgNiwgMiwgMCwgMCksXG4gKiAgIG5ldyBEYXRlKDIwMTEsIDYsIDIsIDIzLCAwKVxuICogKVxuICogLy89PiAzNjZcbiAqIC8vIEhvdyBtYW55IGNhbGVuZGFyIGRheXMgYXJlIGJldHdlZW5cbiAqIC8vIDIgSnVseSAyMDExIDIzOjU5OjAwIGFuZCAzIEp1bHkgMjAxMSAwMDowMTowMD9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhcbiAqICAgbmV3IERhdGUoMjAxMSwgNiwgMywgMCwgMSksXG4gKiAgIG5ldyBEYXRlKDIwMTEsIDYsIDIsIDIzLCA1OSlcbiAqIClcbiAqIC8vPT4gMVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcyhcbiAgICBvcHRpb25zPy5pbixcbiAgICBsYXRlckRhdGUsXG4gICAgZWFybGllckRhdGUsXG4gICk7XG5cbiAgY29uc3QgbGF0ZXJTdGFydE9mRGF5ID0gc3RhcnRPZkRheShsYXRlckRhdGVfKTtcbiAgY29uc3QgZWFybGllclN0YXJ0T2ZEYXkgPSBzdGFydE9mRGF5KGVhcmxpZXJEYXRlXyk7XG5cbiAgY29uc3QgbGF0ZXJUaW1lc3RhbXAgPVxuICAgICtsYXRlclN0YXJ0T2ZEYXkgLSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKGxhdGVyU3RhcnRPZkRheSk7XG4gIGNvbnN0IGVhcmxpZXJUaW1lc3RhbXAgPVxuICAgICtlYXJsaWVyU3RhcnRPZkRheSAtIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMoZWFybGllclN0YXJ0T2ZEYXkpO1xuXG4gIC8vIFJvdW5kIHRoZSBudW1iZXIgb2YgZGF5cyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIGJlY2F1c2UgdGhlIG51bWJlciBvZlxuICAvLyBtaWxsaXNlY29uZHMgaW4gYSBkYXkgaXMgbm90IGNvbnN0YW50IChlLmcuIGl0J3MgZGlmZmVyZW50IGluIHRoZSB3ZWVrIG9mXG4gIC8vIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBjbG9jayBzaGlmdCkuXG4gIHJldHVybiBNYXRoLnJvdW5kKChsYXRlclRpbWVzdGFtcCAtIGVhcmxpZXJUaW1lc3RhbXApIC8gbWlsbGlzZWNvbmRzSW5EYXkpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cztcbiIsCiAgICAiaW1wb3J0IHsgY29uc3RydWN0RnJvbSB9IGZyb20gXCIuL2NvbnN0cnVjdEZyb20uanNcIjtcbmltcG9ydCB7IGdldElTT1dlZWtZZWFyIH0gZnJvbSBcIi4vZ2V0SVNPV2Vla1llYXIuanNcIjtcbmltcG9ydCB7IHN0YXJ0T2ZJU09XZWVrIH0gZnJvbSBcIi4vc3RhcnRPZklTT1dlZWsuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIHN0YXJ0T2ZJU09XZWVrWWVhcn0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZJU09XZWVrWWVhclxuICogQGNhdGVnb3J5IElTTyBXZWVrLU51bWJlcmluZyBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYW4gSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhbiBJU08gd2Vlay1udW1iZXJpbmcgeWVhcixcbiAqIHdoaWNoIGFsd2F5cyBzdGFydHMgMyBkYXlzIGJlZm9yZSB0aGUgeWVhcidzIGZpcnN0IFRodXJzZGF5LlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBJU08gd2Vlay1udW1iZXJpbmcgeWVhcjogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKiBAdHlwZVBhcmFtIFJlc3VsdERhdGUgLSBUaGUgcmVzdWx0IGBEYXRlYCB0eXBlLCBpdCBpcyB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBjb250ZXh0IGZ1bmN0aW9uIGlmIGl0IGlzIHBhc3NlZCwgb3IgaW5mZXJyZWQgZnJvbSB0aGUgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBzdGFydCBvZiBhbiBJU08gd2Vlay1udW1iZXJpbmcgeWVhclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYW4gSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIDIgSnVseSAyMDA1OlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZklTT1dlZWtZZWFyKG5ldyBEYXRlKDIwMDUsIDYsIDIpKVxuICogLy89PiBNb24gSmFuIDAzIDIwMDUgMDA6MDA6MDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0T2ZJU09XZWVrWWVhcihkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IHllYXIgPSBnZXRJU09XZWVrWWVhcihkYXRlLCBvcHRpb25zKTtcbiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5ID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCAwKTtcbiAgZm91cnRoT2ZKYW51YXJ5LnNldEZ1bGxZZWFyKHllYXIsIDAsIDQpO1xuICBmb3VydGhPZkphbnVhcnkuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBzdGFydE9mSVNPV2Vlayhmb3VydGhPZkphbnVhcnkpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IHN0YXJ0T2ZJU09XZWVrWWVhcjtcbiIsCiAgICAiLyoqXG4gKiBAbmFtZSBpc0RhdGVcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgSXMgdGhlIGdpdmVuIHZhbHVlIGEgZGF0ZT9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYW4gaW5zdGFuY2Ugb2YgRGF0ZS4gVGhlIGZ1bmN0aW9uIHdvcmtzIGZvciBkYXRlcyB0cmFuc2ZlcnJlZCBhY3Jvc3MgaWZyYW1lcy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIGRhdGVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIGEgdmFsaWQgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzRGF0ZShuZXcgRGF0ZSgpKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciBhbiBpbnZhbGlkIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBpc0RhdGUobmV3IERhdGUoTmFOKSlcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3Igc29tZSB2YWx1ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzRGF0ZSgnMjAxNC0wMi0zMScpXG4gKiAvLz0+IGZhbHNlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciBhbiBvYmplY3Q6XG4gKiBjb25zdCByZXN1bHQgPSBpc0RhdGUoe30pXG4gKiAvLz0+IGZhbHNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGUodmFsdWUpIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgfHxcbiAgICAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSBcIltvYmplY3QgRGF0ZV1cIilcbiAgKTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBpc0RhdGU7XG4iLAogICAgImltcG9ydCB7IGlzRGF0ZSB9IGZyb20gXCIuL2lzRGF0ZS5qc1wiO1xuaW1wb3J0IHsgdG9EYXRlIH0gZnJvbSBcIi4vdG9EYXRlLmpzXCI7XG5cbi8qKlxuICogQG5hbWUgaXNWYWxpZFxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBJcyB0aGUgZ2l2ZW4gZGF0ZSB2YWxpZD9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybnMgZmFsc2UgaWYgYXJndW1lbnQgaXMgSW52YWxpZCBEYXRlIGFuZCB0cnVlIG90aGVyd2lzZS5cbiAqIEFyZ3VtZW50IGlzIGNvbnZlcnRlZCB0byBEYXRlIHVzaW5nIGB0b0RhdGVgLiBTZWUgW3RvRGF0ZV0oaHR0cHM6Ly9kYXRlLWZucy5vcmcvZG9jcy90b0RhdGUpXG4gKiBJbnZhbGlkIERhdGUgaXMgYSBEYXRlLCB3aG9zZSB0aW1lIHZhbHVlIGlzIE5hTi5cbiAqXG4gKiBUaW1lIHZhbHVlIG9mIERhdGU6IGh0dHA6Ly9lczUuZ2l0aHViLmlvLyN4MTUuOS4xLjFcbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGNoZWNrXG4gKlxuICogQHJldHVybnMgVGhlIGRhdGUgaXMgdmFsaWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIHRoZSB2YWxpZCBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gaXNWYWxpZChuZXcgRGF0ZSgyMDE0LCAxLCAzMSkpXG4gKiAvLz0+IHRydWVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIHRoZSB2YWx1ZSwgY29udmVydGlibGUgaW50byBhIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBpc1ZhbGlkKDEzOTM4MDQ4MDAwMDApXG4gKiAvLz0+IHRydWVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIHRoZSBpbnZhbGlkIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBpc1ZhbGlkKG5ldyBEYXRlKCcnKSlcbiAqIC8vPT4gZmFsc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWQoZGF0ZSkge1xuICByZXR1cm4gISgoIWlzRGF0ZShkYXRlKSAmJiB0eXBlb2YgZGF0ZSAhPT0gXCJudW1iZXJcIikgfHwgaXNOYU4oK3RvRGF0ZShkYXRlKSkpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGlzVmFsaWQ7XG4iLAogICAgImltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgc3RhcnRPZlllYXJ9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBzdGFydE9mWWVhclxuICogQGNhdGVnb3J5IFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqIEB0eXBlUGFyYW0gUmVzdWx0RGF0ZSAtIFRoZSByZXN1bHQgYERhdGVgIHR5cGUsIGl0IGlzIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIGNvbnRleHQgZnVuY3Rpb24gaWYgaXQgaXMgcGFzc2VkLCBvciBpbmZlcnJlZCBmcm9tIHRoZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBzdGFydCBvZiBhIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGEgeWVhciBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZZZWFyKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMDApKVxuICogLy89PiBXZWQgSmFuIDAxIDIwMTQgMDA6MDA6MDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0T2ZZZWFyKGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgZGF0ZV8gPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pO1xuICBkYXRlXy5zZXRGdWxsWWVhcihkYXRlXy5nZXRGdWxsWWVhcigpLCAwLCAxKTtcbiAgZGF0ZV8uc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBkYXRlXztcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBzdGFydE9mWWVhcjtcbiIsCiAgICAiY29uc3QgZm9ybWF0RGlzdGFuY2VMb2NhbGUgPSB7XG4gIGxlc3NUaGFuWFNlY29uZHM6IHtcbiAgICBvbmU6IFwibGVzcyB0aGFuIGEgc2Vjb25kXCIsXG4gICAgb3RoZXI6IFwibGVzcyB0aGFuIHt7Y291bnR9fSBzZWNvbmRzXCIsXG4gIH0sXG5cbiAgeFNlY29uZHM6IHtcbiAgICBvbmU6IFwiMSBzZWNvbmRcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gc2Vjb25kc1wiLFxuICB9LFxuXG4gIGhhbGZBTWludXRlOiBcImhhbGYgYSBtaW51dGVcIixcblxuICBsZXNzVGhhblhNaW51dGVzOiB7XG4gICAgb25lOiBcImxlc3MgdGhhbiBhIG1pbnV0ZVwiLFxuICAgIG90aGVyOiBcImxlc3MgdGhhbiB7e2NvdW50fX0gbWludXRlc1wiLFxuICB9LFxuXG4gIHhNaW51dGVzOiB7XG4gICAgb25lOiBcIjEgbWludXRlXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IG1pbnV0ZXNcIixcbiAgfSxcblxuICBhYm91dFhIb3Vyczoge1xuICAgIG9uZTogXCJhYm91dCAxIGhvdXJcIixcbiAgICBvdGhlcjogXCJhYm91dCB7e2NvdW50fX0gaG91cnNcIixcbiAgfSxcblxuICB4SG91cnM6IHtcbiAgICBvbmU6IFwiMSBob3VyXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IGhvdXJzXCIsXG4gIH0sXG5cbiAgeERheXM6IHtcbiAgICBvbmU6IFwiMSBkYXlcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gZGF5c1wiLFxuICB9LFxuXG4gIGFib3V0WFdlZWtzOiB7XG4gICAgb25lOiBcImFib3V0IDEgd2Vla1wiLFxuICAgIG90aGVyOiBcImFib3V0IHt7Y291bnR9fSB3ZWVrc1wiLFxuICB9LFxuXG4gIHhXZWVrczoge1xuICAgIG9uZTogXCIxIHdlZWtcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gd2Vla3NcIixcbiAgfSxcblxuICBhYm91dFhNb250aHM6IHtcbiAgICBvbmU6IFwiYWJvdXQgMSBtb250aFwiLFxuICAgIG90aGVyOiBcImFib3V0IHt7Y291bnR9fSBtb250aHNcIixcbiAgfSxcblxuICB4TW9udGhzOiB7XG4gICAgb25lOiBcIjEgbW9udGhcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gbW9udGhzXCIsXG4gIH0sXG5cbiAgYWJvdXRYWWVhcnM6IHtcbiAgICBvbmU6IFwiYWJvdXQgMSB5ZWFyXCIsXG4gICAgb3RoZXI6IFwiYWJvdXQge3tjb3VudH19IHllYXJzXCIsXG4gIH0sXG5cbiAgeFllYXJzOiB7XG4gICAgb25lOiBcIjEgeWVhclwiLFxuICAgIG90aGVyOiBcInt7Y291bnR9fSB5ZWFyc1wiLFxuICB9LFxuXG4gIG92ZXJYWWVhcnM6IHtcbiAgICBvbmU6IFwib3ZlciAxIHllYXJcIixcbiAgICBvdGhlcjogXCJvdmVyIHt7Y291bnR9fSB5ZWFyc1wiLFxuICB9LFxuXG4gIGFsbW9zdFhZZWFyczoge1xuICAgIG9uZTogXCJhbG1vc3QgMSB5ZWFyXCIsXG4gICAgb3RoZXI6IFwiYWxtb3N0IHt7Y291bnR9fSB5ZWFyc1wiLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdERpc3RhbmNlID0gKHRva2VuLCBjb3VudCwgb3B0aW9ucykgPT4ge1xuICBsZXQgcmVzdWx0O1xuXG4gIGNvbnN0IHRva2VuVmFsdWUgPSBmb3JtYXREaXN0YW5jZUxvY2FsZVt0b2tlbl07XG4gIGlmICh0eXBlb2YgdG9rZW5WYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJlc3VsdCA9IHRva2VuVmFsdWU7XG4gIH0gZWxzZSBpZiAoY291bnQgPT09IDEpIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlLm9uZTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlLm90aGVyLnJlcGxhY2UoXCJ7e2NvdW50fX1cIiwgY291bnQudG9TdHJpbmcoKSk7XG4gIH1cblxuICBpZiAob3B0aW9ucz8uYWRkU3VmZml4KSB7XG4gICAgaWYgKG9wdGlvbnMuY29tcGFyaXNvbiAmJiBvcHRpb25zLmNvbXBhcmlzb24gPiAwKSB7XG4gICAgICByZXR1cm4gXCJpbiBcIiArIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIFwiIGFnb1wiO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwKICAgICJleHBvcnQgZnVuY3Rpb24gYnVpbGRGb3JtYXRMb25nRm4oYXJncykge1xuICByZXR1cm4gKG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIC8vIFRPRE86IFJlbW92ZSBTdHJpbmcoKVxuICAgIGNvbnN0IHdpZHRoID0gb3B0aW9ucy53aWR0aCA/IFN0cmluZyhvcHRpb25zLndpZHRoKSA6IGFyZ3MuZGVmYXVsdFdpZHRoO1xuICAgIGNvbnN0IGZvcm1hdCA9IGFyZ3MuZm9ybWF0c1t3aWR0aF0gfHwgYXJncy5mb3JtYXRzW2FyZ3MuZGVmYXVsdFdpZHRoXTtcbiAgICByZXR1cm4gZm9ybWF0O1xuICB9O1xufVxuIiwKICAgICJpbXBvcnQgeyBidWlsZEZvcm1hdExvbmdGbiB9IGZyb20gXCIuLi8uLi9fbGliL2J1aWxkRm9ybWF0TG9uZ0ZuLmpzXCI7XG5cbmNvbnN0IGRhdGVGb3JtYXRzID0ge1xuICBmdWxsOiBcIkVFRUUsIE1NTU0gZG8sIHlcIixcbiAgbG9uZzogXCJNTU1NIGRvLCB5XCIsXG4gIG1lZGl1bTogXCJNTU0gZCwgeVwiLFxuICBzaG9ydDogXCJNTS9kZC95eXl5XCIsXG59O1xuXG5jb25zdCB0aW1lRm9ybWF0cyA9IHtcbiAgZnVsbDogXCJoOm1tOnNzIGEgenp6elwiLFxuICBsb25nOiBcImg6bW06c3MgYSB6XCIsXG4gIG1lZGl1bTogXCJoOm1tOnNzIGFcIixcbiAgc2hvcnQ6IFwiaDptbSBhXCIsXG59O1xuXG5jb25zdCBkYXRlVGltZUZvcm1hdHMgPSB7XG4gIGZ1bGw6IFwie3tkYXRlfX0gJ2F0JyB7e3RpbWV9fVwiLFxuICBsb25nOiBcInt7ZGF0ZX19ICdhdCcge3t0aW1lfX1cIixcbiAgbWVkaXVtOiBcInt7ZGF0ZX19LCB7e3RpbWV9fVwiLFxuICBzaG9ydDogXCJ7e2RhdGV9fSwge3t0aW1lfX1cIixcbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtYXRMb25nID0ge1xuICBkYXRlOiBidWlsZEZvcm1hdExvbmdGbih7XG4gICAgZm9ybWF0czogZGF0ZUZvcm1hdHMsXG4gICAgZGVmYXVsdFdpZHRoOiBcImZ1bGxcIixcbiAgfSksXG5cbiAgdGltZTogYnVpbGRGb3JtYXRMb25nRm4oe1xuICAgIGZvcm1hdHM6IHRpbWVGb3JtYXRzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJmdWxsXCIsXG4gIH0pLFxuXG4gIGRhdGVUaW1lOiBidWlsZEZvcm1hdExvbmdGbih7XG4gICAgZm9ybWF0czogZGF0ZVRpbWVGb3JtYXRzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJmdWxsXCIsXG4gIH0pLFxufTtcbiIsCiAgICAiY29uc3QgZm9ybWF0UmVsYXRpdmVMb2NhbGUgPSB7XG4gIGxhc3RXZWVrOiBcIidsYXN0JyBlZWVlICdhdCcgcFwiLFxuICB5ZXN0ZXJkYXk6IFwiJ3llc3RlcmRheSBhdCcgcFwiLFxuICB0b2RheTogXCIndG9kYXkgYXQnIHBcIixcbiAgdG9tb3Jyb3c6IFwiJ3RvbW9ycm93IGF0JyBwXCIsXG4gIG5leHRXZWVrOiBcImVlZWUgJ2F0JyBwXCIsXG4gIG90aGVyOiBcIlBcIixcbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtYXRSZWxhdGl2ZSA9ICh0b2tlbiwgX2RhdGUsIF9iYXNlRGF0ZSwgX29wdGlvbnMpID0+XG4gIGZvcm1hdFJlbGF0aXZlTG9jYWxlW3Rva2VuXTtcbiIsCiAgICAiLyoqXG4gKiBUaGUgbG9jYWxpemUgZnVuY3Rpb24gYXJndW1lbnQgY2FsbGJhY2sgd2hpY2ggYWxsb3dzIHRvIGNvbnZlcnQgcmF3IHZhbHVlIHRvXG4gKiB0aGUgYWN0dWFsIHR5cGUuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNvbnZlcnRcbiAqXG4gKiBAcmV0dXJucyBUaGUgY29udmVydGVkIHZhbHVlXG4gKi9cblxuLyoqXG4gKiBUaGUgbWFwIG9mIGxvY2FsaXplZCB2YWx1ZXMgZm9yIGVhY2ggd2lkdGguXG4gKi9cblxuLyoqXG4gKiBUaGUgaW5kZXggdHlwZSBvZiB0aGUgbG9jYWxlIHVuaXQgdmFsdWUuIEl0IHR5cGVzIGNvbnZlcnNpb24gb2YgdW5pdHMgb2ZcbiAqIHZhbHVlcyB0aGF0IGRvbid0IHN0YXJ0IGF0IDAgKGkuZS4gcXVhcnRlcnMpLlxuICovXG5cbi8qKlxuICogQ29udmVydHMgdGhlIHVuaXQgdmFsdWUgdG8gdGhlIHR1cGxlIG9mIHZhbHVlcy5cbiAqL1xuXG4vKipcbiAqIFRoZSB0dXBsZSBvZiBsb2NhbGl6ZWQgZXJhIHZhbHVlcy4gVGhlIGZpcnN0IGVsZW1lbnQgcmVwcmVzZW50cyBCQyxcbiAqIHRoZSBzZWNvbmQgZWxlbWVudCByZXByZXNlbnRzIEFELlxuICovXG5cbi8qKlxuICogVGhlIHR1cGxlIG9mIGxvY2FsaXplZCBxdWFydGVyIHZhbHVlcy4gVGhlIGZpcnN0IGVsZW1lbnQgcmVwcmVzZW50cyBRMS5cbiAqL1xuXG4vKipcbiAqIFRoZSB0dXBsZSBvZiBsb2NhbGl6ZWQgZGF5IHZhbHVlcy4gVGhlIGZpcnN0IGVsZW1lbnQgcmVwcmVzZW50cyBTdW5kYXkuXG4gKi9cblxuLyoqXG4gKiBUaGUgdHVwbGUgb2YgbG9jYWxpemVkIG1vbnRoIHZhbHVlcy4gVGhlIGZpcnN0IGVsZW1lbnQgcmVwcmVzZW50cyBKYW51YXJ5LlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZExvY2FsaXplRm4oYXJncykge1xuICByZXR1cm4gKHZhbHVlLCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IG9wdGlvbnM/LmNvbnRleHQgPyBTdHJpbmcob3B0aW9ucy5jb250ZXh0KSA6IFwic3RhbmRhbG9uZVwiO1xuXG4gICAgbGV0IHZhbHVlc0FycmF5O1xuICAgIGlmIChjb250ZXh0ID09PSBcImZvcm1hdHRpbmdcIiAmJiBhcmdzLmZvcm1hdHRpbmdWYWx1ZXMpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRXaWR0aCA9IGFyZ3MuZGVmYXVsdEZvcm1hdHRpbmdXaWR0aCB8fCBhcmdzLmRlZmF1bHRXaWR0aDtcbiAgICAgIGNvbnN0IHdpZHRoID0gb3B0aW9ucz8ud2lkdGggPyBTdHJpbmcob3B0aW9ucy53aWR0aCkgOiBkZWZhdWx0V2lkdGg7XG5cbiAgICAgIHZhbHVlc0FycmF5ID1cbiAgICAgICAgYXJncy5mb3JtYXR0aW5nVmFsdWVzW3dpZHRoXSB8fCBhcmdzLmZvcm1hdHRpbmdWYWx1ZXNbZGVmYXVsdFdpZHRoXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGVmYXVsdFdpZHRoID0gYXJncy5kZWZhdWx0V2lkdGg7XG4gICAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnM/LndpZHRoID8gU3RyaW5nKG9wdGlvbnMud2lkdGgpIDogYXJncy5kZWZhdWx0V2lkdGg7XG5cbiAgICAgIHZhbHVlc0FycmF5ID0gYXJncy52YWx1ZXNbd2lkdGhdIHx8IGFyZ3MudmFsdWVzW2RlZmF1bHRXaWR0aF07XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gYXJncy5hcmd1bWVudENhbGxiYWNrID8gYXJncy5hcmd1bWVudENhbGxiYWNrKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIEZvciBzb21lIHJlYXNvbiBUeXBlU2NyaXB0IGp1c3QgZG9uJ3Qgd2FudCB0byBtYXRjaCBpdCwgbm8gbWF0dGVyIGhvdyBoYXJkIHdlIHRyeS4gSSBjaGFsbGVuZ2UgeW91IHRvIHRyeSB0byByZW1vdmUgaXQhXG4gICAgcmV0dXJuIHZhbHVlc0FycmF5W2luZGV4XTtcbiAgfTtcbn1cbiIsCiAgICAiaW1wb3J0IHsgYnVpbGRMb2NhbGl6ZUZuIH0gZnJvbSBcIi4uLy4uL19saWIvYnVpbGRMb2NhbGl6ZUZuLmpzXCI7XG5cbmNvbnN0IGVyYVZhbHVlcyA9IHtcbiAgbmFycm93OiBbXCJCXCIsIFwiQVwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcIkJDXCIsIFwiQURcIl0sXG4gIHdpZGU6IFtcIkJlZm9yZSBDaHJpc3RcIiwgXCJBbm5vIERvbWluaVwiXSxcbn07XG5cbmNvbnN0IHF1YXJ0ZXJWYWx1ZXMgPSB7XG4gIG5hcnJvdzogW1wiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcIlExXCIsIFwiUTJcIiwgXCJRM1wiLCBcIlE0XCJdLFxuICB3aWRlOiBbXCIxc3QgcXVhcnRlclwiLCBcIjJuZCBxdWFydGVyXCIsIFwiM3JkIHF1YXJ0ZXJcIiwgXCI0dGggcXVhcnRlclwiXSxcbn07XG5cbi8vIE5vdGU6IGluIEVuZ2xpc2gsIHRoZSBuYW1lcyBvZiBkYXlzIG9mIHRoZSB3ZWVrIGFuZCBtb250aHMgYXJlIGNhcGl0YWxpemVkLlxuLy8gSWYgeW91IGFyZSBtYWtpbmcgYSBuZXcgbG9jYWxlIGJhc2VkIG9uIHRoaXMgb25lLCBjaGVjayBpZiB0aGUgc2FtZSBpcyB0cnVlIGZvciB0aGUgbGFuZ3VhZ2UgeW91J3JlIHdvcmtpbmcgb24uXG4vLyBHZW5lcmFsbHksIGZvcm1hdHRlZCBkYXRlcyBzaG91bGQgbG9vayBsaWtlIHRoZXkgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBzZW50ZW5jZSxcbi8vIGUuZy4gaW4gU3BhbmlzaCBsYW5ndWFnZSB0aGUgd2Vla2RheXMgYW5kIG1vbnRocyBzaG91bGQgYmUgaW4gdGhlIGxvd2VyY2FzZS5cbmNvbnN0IG1vbnRoVmFsdWVzID0ge1xuICBuYXJyb3c6IFtcIkpcIiwgXCJGXCIsIFwiTVwiLCBcIkFcIiwgXCJNXCIsIFwiSlwiLCBcIkpcIiwgXCJBXCIsIFwiU1wiLCBcIk9cIiwgXCJOXCIsIFwiRFwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcbiAgICBcIkphblwiLFxuICAgIFwiRmViXCIsXG4gICAgXCJNYXJcIixcbiAgICBcIkFwclwiLFxuICAgIFwiTWF5XCIsXG4gICAgXCJKdW5cIixcbiAgICBcIkp1bFwiLFxuICAgIFwiQXVnXCIsXG4gICAgXCJTZXBcIixcbiAgICBcIk9jdFwiLFxuICAgIFwiTm92XCIsXG4gICAgXCJEZWNcIixcbiAgXSxcblxuICB3aWRlOiBbXG4gICAgXCJKYW51YXJ5XCIsXG4gICAgXCJGZWJydWFyeVwiLFxuICAgIFwiTWFyY2hcIixcbiAgICBcIkFwcmlsXCIsXG4gICAgXCJNYXlcIixcbiAgICBcIkp1bmVcIixcbiAgICBcIkp1bHlcIixcbiAgICBcIkF1Z3VzdFwiLFxuICAgIFwiU2VwdGVtYmVyXCIsXG4gICAgXCJPY3RvYmVyXCIsXG4gICAgXCJOb3ZlbWJlclwiLFxuICAgIFwiRGVjZW1iZXJcIixcbiAgXSxcbn07XG5cbmNvbnN0IGRheVZhbHVlcyA9IHtcbiAgbmFycm93OiBbXCJTXCIsIFwiTVwiLCBcIlRcIiwgXCJXXCIsIFwiVFwiLCBcIkZcIiwgXCJTXCJdLFxuICBzaG9ydDogW1wiU3VcIiwgXCJNb1wiLCBcIlR1XCIsIFwiV2VcIiwgXCJUaFwiLCBcIkZyXCIsIFwiU2FcIl0sXG4gIGFiYnJldmlhdGVkOiBbXCJTdW5cIiwgXCJNb25cIiwgXCJUdWVcIiwgXCJXZWRcIiwgXCJUaHVcIiwgXCJGcmlcIiwgXCJTYXRcIl0sXG4gIHdpZGU6IFtcbiAgICBcIlN1bmRheVwiLFxuICAgIFwiTW9uZGF5XCIsXG4gICAgXCJUdWVzZGF5XCIsXG4gICAgXCJXZWRuZXNkYXlcIixcbiAgICBcIlRodXJzZGF5XCIsXG4gICAgXCJGcmlkYXlcIixcbiAgICBcIlNhdHVyZGF5XCIsXG4gIF0sXG59O1xuXG5jb25zdCBkYXlQZXJpb2RWYWx1ZXMgPSB7XG4gIG5hcnJvdzoge1xuICAgIGFtOiBcImFcIixcbiAgICBwbTogXCJwXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlcIixcbiAgICBub29uOiBcIm5cIixcbiAgICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiYWZ0ZXJub29uXCIsXG4gICAgZXZlbmluZzogXCJldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwibmlnaHRcIixcbiAgfSxcbiAgYWJicmV2aWF0ZWQ6IHtcbiAgICBhbTogXCJBTVwiLFxuICAgIHBtOiBcIlBNXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiYWZ0ZXJub29uXCIsXG4gICAgZXZlbmluZzogXCJldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwibmlnaHRcIixcbiAgfSxcbiAgd2lkZToge1xuICAgIGFtOiBcImEubS5cIixcbiAgICBwbTogXCJwLm0uXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiYWZ0ZXJub29uXCIsXG4gICAgZXZlbmluZzogXCJldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwibmlnaHRcIixcbiAgfSxcbn07XG5cbmNvbnN0IGZvcm1hdHRpbmdEYXlQZXJpb2RWYWx1ZXMgPSB7XG4gIG5hcnJvdzoge1xuICAgIGFtOiBcImFcIixcbiAgICBwbTogXCJwXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlcIixcbiAgICBub29uOiBcIm5cIixcbiAgICBtb3JuaW5nOiBcImluIHRoZSBtb3JuaW5nXCIsXG4gICAgYWZ0ZXJub29uOiBcImluIHRoZSBhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImluIHRoZSBldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwiYXQgbmlnaHRcIixcbiAgfSxcbiAgYWJicmV2aWF0ZWQ6IHtcbiAgICBhbTogXCJBTVwiLFxuICAgIHBtOiBcIlBNXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcImluIHRoZSBtb3JuaW5nXCIsXG4gICAgYWZ0ZXJub29uOiBcImluIHRoZSBhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImluIHRoZSBldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwiYXQgbmlnaHRcIixcbiAgfSxcbiAgd2lkZToge1xuICAgIGFtOiBcImEubS5cIixcbiAgICBwbTogXCJwLm0uXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcImluIHRoZSBtb3JuaW5nXCIsXG4gICAgYWZ0ZXJub29uOiBcImluIHRoZSBhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImluIHRoZSBldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwiYXQgbmlnaHRcIixcbiAgfSxcbn07XG5cbmNvbnN0IG9yZGluYWxOdW1iZXIgPSAoZGlydHlOdW1iZXIsIF9vcHRpb25zKSA9PiB7XG4gIGNvbnN0IG51bWJlciA9IE51bWJlcihkaXJ0eU51bWJlcik7XG5cbiAgLy8gSWYgb3JkaW5hbCBudW1iZXJzIGRlcGVuZCBvbiBjb250ZXh0LCBmb3IgZXhhbXBsZSxcbiAgLy8gaWYgdGhleSBhcmUgZGlmZmVyZW50IGZvciBkaWZmZXJlbnQgZ3JhbW1hdGljYWwgZ2VuZGVycyxcbiAgLy8gdXNlIGBvcHRpb25zLnVuaXRgLlxuICAvL1xuICAvLyBgdW5pdGAgY2FuIGJlICd5ZWFyJywgJ3F1YXJ0ZXInLCAnbW9udGgnLCAnd2VlaycsICdkYXRlJywgJ2RheU9mWWVhcicsXG4gIC8vICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJy5cblxuICBjb25zdCByZW0xMDAgPSBudW1iZXIgJSAxMDA7XG4gIGlmIChyZW0xMDAgPiAyMCB8fCByZW0xMDAgPCAxMCkge1xuICAgIHN3aXRjaCAocmVtMTAwICUgMTApIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIG51bWJlciArIFwic3RcIjtcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgcmV0dXJuIG51bWJlciArIFwibmRcIjtcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgcmV0dXJuIG51bWJlciArIFwicmRcIjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bWJlciArIFwidGhcIjtcbn07XG5cbmV4cG9ydCBjb25zdCBsb2NhbGl6ZSA9IHtcbiAgb3JkaW5hbE51bWJlcixcblxuICBlcmE6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBlcmFWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgfSksXG5cbiAgcXVhcnRlcjogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IHF1YXJ0ZXJWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgICBhcmd1bWVudENhbGxiYWNrOiAocXVhcnRlcikgPT4gcXVhcnRlciAtIDEsXG4gIH0pLFxuXG4gIG1vbnRoOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogbW9udGhWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgfSksXG5cbiAgZGF5OiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogZGF5VmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJ3aWRlXCIsXG4gIH0pLFxuXG4gIGRheVBlcmlvZDogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IGRheVBlcmlvZFZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICAgIGZvcm1hdHRpbmdWYWx1ZXM6IGZvcm1hdHRpbmdEYXlQZXJpb2RWYWx1ZXMsXG4gICAgZGVmYXVsdEZvcm1hdHRpbmdXaWR0aDogXCJ3aWRlXCIsXG4gIH0pLFxufTtcbiIsCiAgICAiZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTWF0Y2hGbihhcmdzKSB7XG4gIHJldHVybiAoc3RyaW5nLCBvcHRpb25zID0ge30pID0+IHtcbiAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnMud2lkdGg7XG5cbiAgICBjb25zdCBtYXRjaFBhdHRlcm4gPVxuICAgICAgKHdpZHRoICYmIGFyZ3MubWF0Y2hQYXR0ZXJuc1t3aWR0aF0pIHx8XG4gICAgICBhcmdzLm1hdGNoUGF0dGVybnNbYXJncy5kZWZhdWx0TWF0Y2hXaWR0aF07XG4gICAgY29uc3QgbWF0Y2hSZXN1bHQgPSBzdHJpbmcubWF0Y2gobWF0Y2hQYXR0ZXJuKTtcblxuICAgIGlmICghbWF0Y2hSZXN1bHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBtYXRjaGVkU3RyaW5nID0gbWF0Y2hSZXN1bHRbMF07XG5cbiAgICBjb25zdCBwYXJzZVBhdHRlcm5zID1cbiAgICAgICh3aWR0aCAmJiBhcmdzLnBhcnNlUGF0dGVybnNbd2lkdGhdKSB8fFxuICAgICAgYXJncy5wYXJzZVBhdHRlcm5zW2FyZ3MuZGVmYXVsdFBhcnNlV2lkdGhdO1xuXG4gICAgY29uc3Qga2V5ID0gQXJyYXkuaXNBcnJheShwYXJzZVBhdHRlcm5zKVxuICAgICAgPyBmaW5kSW5kZXgocGFyc2VQYXR0ZXJucywgKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChtYXRjaGVkU3RyaW5nKSlcbiAgICAgIDogLy8gW1RPRE9dIC0tIEkgY2hhbGxlbmdlIHlvdSB0byBmaXggdGhlIHR5cGVcbiAgICAgICAgZmluZEtleShwYXJzZVBhdHRlcm5zLCAocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KG1hdGNoZWRTdHJpbmcpKTtcblxuICAgIGxldCB2YWx1ZTtcblxuICAgIHZhbHVlID0gYXJncy52YWx1ZUNhbGxiYWNrID8gYXJncy52YWx1ZUNhbGxiYWNrKGtleSkgOiBrZXk7XG4gICAgdmFsdWUgPSBvcHRpb25zLnZhbHVlQ2FsbGJhY2tcbiAgICAgID8gLy8gW1RPRE9dIC0tIEkgY2hhbGxlbmdlIHlvdSB0byBmaXggdGhlIHR5cGVcbiAgICAgICAgb3B0aW9ucy52YWx1ZUNhbGxiYWNrKHZhbHVlKVxuICAgICAgOiB2YWx1ZTtcblxuICAgIGNvbnN0IHJlc3QgPSBzdHJpbmcuc2xpY2UobWF0Y2hlZFN0cmluZy5sZW5ndGgpO1xuXG4gICAgcmV0dXJuIHsgdmFsdWUsIHJlc3QgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmluZEtleShvYmplY3QsIHByZWRpY2F0ZSkge1xuICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICBpZiAoXG4gICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmXG4gICAgICBwcmVkaWNhdGUob2JqZWN0W2tleV0pXG4gICAgKSB7XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBmaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSkge1xuICBmb3IgKGxldCBrZXkgPSAwOyBrZXkgPCBhcnJheS5sZW5ndGg7IGtleSsrKSB7XG4gICAgaWYgKHByZWRpY2F0ZShhcnJheVtrZXldKSkge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsCiAgICAiZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTWF0Y2hQYXR0ZXJuRm4oYXJncykge1xuICByZXR1cm4gKHN0cmluZywgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgY29uc3QgbWF0Y2hSZXN1bHQgPSBzdHJpbmcubWF0Y2goYXJncy5tYXRjaFBhdHRlcm4pO1xuICAgIGlmICghbWF0Y2hSZXN1bHQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG1hdGNoZWRTdHJpbmcgPSBtYXRjaFJlc3VsdFswXTtcblxuICAgIGNvbnN0IHBhcnNlUmVzdWx0ID0gc3RyaW5nLm1hdGNoKGFyZ3MucGFyc2VQYXR0ZXJuKTtcbiAgICBpZiAoIXBhcnNlUmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICBsZXQgdmFsdWUgPSBhcmdzLnZhbHVlQ2FsbGJhY2tcbiAgICAgID8gYXJncy52YWx1ZUNhbGxiYWNrKHBhcnNlUmVzdWx0WzBdKVxuICAgICAgOiBwYXJzZVJlc3VsdFswXTtcblxuICAgIC8vIFtUT0RPXSBJIGNoYWxsZW5nZSB5b3UgdG8gZml4IHRoZSB0eXBlXG4gICAgdmFsdWUgPSBvcHRpb25zLnZhbHVlQ2FsbGJhY2sgPyBvcHRpb25zLnZhbHVlQ2FsbGJhY2sodmFsdWUpIDogdmFsdWU7XG5cbiAgICBjb25zdCByZXN0ID0gc3RyaW5nLnNsaWNlKG1hdGNoZWRTdHJpbmcubGVuZ3RoKTtcblxuICAgIHJldHVybiB7IHZhbHVlLCByZXN0IH07XG4gIH07XG59XG4iLAogICAgImltcG9ydCB7IGJ1aWxkTWF0Y2hGbiB9IGZyb20gXCIuLi8uLi9fbGliL2J1aWxkTWF0Y2hGbi5qc1wiO1xuaW1wb3J0IHsgYnVpbGRNYXRjaFBhdHRlcm5GbiB9IGZyb20gXCIuLi8uLi9fbGliL2J1aWxkTWF0Y2hQYXR0ZXJuRm4uanNcIjtcblxuY29uc3QgbWF0Y2hPcmRpbmFsTnVtYmVyUGF0dGVybiA9IC9eKFxcZCspKHRofHN0fG5kfHJkKT8vaTtcbmNvbnN0IHBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm4gPSAvXFxkKy9pO1xuXG5jb25zdCBtYXRjaEVyYVBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eKGJ8YSkvaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKGJcXC4/XFxzP2NcXC4/fGJcXC4/XFxzP2NcXC4/XFxzP2VcXC4/fGFcXC4/XFxzP2RcXC4/fGNcXC4/XFxzP2VcXC4/KS9pLFxuICB3aWRlOiAvXihiZWZvcmUgY2hyaXN0fGJlZm9yZSBjb21tb24gZXJhfGFubm8gZG9taW5pfGNvbW1vbiBlcmEpL2ksXG59O1xuY29uc3QgcGFyc2VFcmFQYXR0ZXJucyA9IHtcbiAgYW55OiBbL15iL2ksIC9eKGF8YykvaV0sXG59O1xuXG5jb25zdCBtYXRjaFF1YXJ0ZXJQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXlsxMjM0XS9pLFxuICBhYmJyZXZpYXRlZDogL15xWzEyMzRdL2ksXG4gIHdpZGU6IC9eWzEyMzRdKHRofHN0fG5kfHJkKT8gcXVhcnRlci9pLFxufTtcbmNvbnN0IHBhcnNlUXVhcnRlclBhdHRlcm5zID0ge1xuICBhbnk6IFsvMS9pLCAvMi9pLCAvMy9pLCAvNC9pXSxcbn07XG5cbmNvbnN0IG1hdGNoTW9udGhQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXltqZm1hc29uZF0vaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKGphbnxmZWJ8bWFyfGFwcnxtYXl8anVufGp1bHxhdWd8c2VwfG9jdHxub3Z8ZGVjKS9pLFxuICB3aWRlOiAvXihqYW51YXJ5fGZlYnJ1YXJ5fG1hcmNofGFwcmlsfG1heXxqdW5lfGp1bHl8YXVndXN0fHNlcHRlbWJlcnxvY3RvYmVyfG5vdmVtYmVyfGRlY2VtYmVyKS9pLFxufTtcbmNvbnN0IHBhcnNlTW9udGhQYXR0ZXJucyA9IHtcbiAgbmFycm93OiBbXG4gICAgL15qL2ksXG4gICAgL15mL2ksXG4gICAgL15tL2ksXG4gICAgL15hL2ksXG4gICAgL15tL2ksXG4gICAgL15qL2ksXG4gICAgL15qL2ksXG4gICAgL15hL2ksXG4gICAgL15zL2ksXG4gICAgL15vL2ksXG4gICAgL15uL2ksXG4gICAgL15kL2ksXG4gIF0sXG5cbiAgYW55OiBbXG4gICAgL15qYS9pLFxuICAgIC9eZi9pLFxuICAgIC9ebWFyL2ksXG4gICAgL15hcC9pLFxuICAgIC9ebWF5L2ksXG4gICAgL15qdW4vaSxcbiAgICAvXmp1bC9pLFxuICAgIC9eYXUvaSxcbiAgICAvXnMvaSxcbiAgICAvXm8vaSxcbiAgICAvXm4vaSxcbiAgICAvXmQvaSxcbiAgXSxcbn07XG5cbmNvbnN0IG1hdGNoRGF5UGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL15bc210d2ZdL2ksXG4gIHNob3J0OiAvXihzdXxtb3x0dXx3ZXx0aHxmcnxzYSkvaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKHN1bnxtb258dHVlfHdlZHx0aHV8ZnJpfHNhdCkvaSxcbiAgd2lkZTogL14oc3VuZGF5fG1vbmRheXx0dWVzZGF5fHdlZG5lc2RheXx0aHVyc2RheXxmcmlkYXl8c2F0dXJkYXkpL2ksXG59O1xuY29uc3QgcGFyc2VEYXlQYXR0ZXJucyA9IHtcbiAgbmFycm93OiBbL15zL2ksIC9ebS9pLCAvXnQvaSwgL153L2ksIC9edC9pLCAvXmYvaSwgL15zL2ldLFxuICBhbnk6IFsvXnN1L2ksIC9ebS9pLCAvXnR1L2ksIC9edy9pLCAvXnRoL2ksIC9eZi9pLCAvXnNhL2ldLFxufTtcblxuY29uc3QgbWF0Y2hEYXlQZXJpb2RQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXihhfHB8bWl8bnwoaW4gdGhlfGF0KSAobW9ybmluZ3xhZnRlcm5vb258ZXZlbmluZ3xuaWdodCkpL2ksXG4gIGFueTogL14oW2FwXVxcLj9cXHM/bVxcLj98bWlkbmlnaHR8bm9vbnwoaW4gdGhlfGF0KSAobW9ybmluZ3xhZnRlcm5vb258ZXZlbmluZ3xuaWdodCkpL2ksXG59O1xuY29uc3QgcGFyc2VEYXlQZXJpb2RQYXR0ZXJucyA9IHtcbiAgYW55OiB7XG4gICAgYW06IC9eYS9pLFxuICAgIHBtOiAvXnAvaSxcbiAgICBtaWRuaWdodDogL15taS9pLFxuICAgIG5vb246IC9ebm8vaSxcbiAgICBtb3JuaW5nOiAvbW9ybmluZy9pLFxuICAgIGFmdGVybm9vbjogL2FmdGVybm9vbi9pLFxuICAgIGV2ZW5pbmc6IC9ldmVuaW5nL2ksXG4gICAgbmlnaHQ6IC9uaWdodC9pLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IG1hdGNoID0ge1xuICBvcmRpbmFsTnVtYmVyOiBidWlsZE1hdGNoUGF0dGVybkZuKHtcbiAgICBtYXRjaFBhdHRlcm46IG1hdGNoT3JkaW5hbE51bWJlclBhdHRlcm4sXG4gICAgcGFyc2VQYXR0ZXJuOiBwYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuLFxuICAgIHZhbHVlQ2FsbGJhY2s6ICh2YWx1ZSkgPT4gcGFyc2VJbnQodmFsdWUsIDEwKSxcbiAgfSksXG5cbiAgZXJhOiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRXJhUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRXJhUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxuXG4gIHF1YXJ0ZXI6IGJ1aWxkTWF0Y2hGbih7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hRdWFydGVyUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlUXVhcnRlclBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICAgIHZhbHVlQ2FsbGJhY2s6IChpbmRleCkgPT4gaW5kZXggKyAxLFxuICB9KSxcblxuICBtb250aDogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaE1vbnRoUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlTW9udGhQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogXCJhbnlcIixcbiAgfSksXG5cbiAgZGF5OiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRGF5UGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRGF5UGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxuXG4gIGRheVBlcmlvZDogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaERheVBlcmlvZFBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcImFueVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRGF5UGVyaW9kUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxufTtcbiIsCiAgICAiaW1wb3J0IHsgZm9ybWF0RGlzdGFuY2UgfSBmcm9tIFwiLi9lbi1VUy9fbGliL2Zvcm1hdERpc3RhbmNlLmpzXCI7XG5pbXBvcnQgeyBmb3JtYXRMb25nIH0gZnJvbSBcIi4vZW4tVVMvX2xpYi9mb3JtYXRMb25nLmpzXCI7XG5pbXBvcnQgeyBmb3JtYXRSZWxhdGl2ZSB9IGZyb20gXCIuL2VuLVVTL19saWIvZm9ybWF0UmVsYXRpdmUuanNcIjtcbmltcG9ydCB7IGxvY2FsaXplIH0gZnJvbSBcIi4vZW4tVVMvX2xpYi9sb2NhbGl6ZS5qc1wiO1xuaW1wb3J0IHsgbWF0Y2ggfSBmcm9tIFwiLi9lbi1VUy9fbGliL21hdGNoLmpzXCI7XG5cbi8qKlxuICogQGNhdGVnb3J5IExvY2FsZXNcbiAqIEBzdW1tYXJ5IEVuZ2xpc2ggbG9jYWxlIChVbml0ZWQgU3RhdGVzKS5cbiAqIEBsYW5ndWFnZSBFbmdsaXNoXG4gKiBAaXNvLTYzOS0yIGVuZ1xuICogQGF1dGhvciBTYXNoYSBLb3NzIFtAa29zc25vY29ycF0oaHR0cHM6Ly9naXRodWIuY29tL2tvc3Nub2NvcnApXG4gKiBAYXV0aG9yIExlc2hhIEtvc3MgW0BsZXNoYWtvc3NdKGh0dHBzOi8vZ2l0aHViLmNvbS9sZXNoYWtvc3MpXG4gKi9cbmV4cG9ydCBjb25zdCBlblVTID0ge1xuICBjb2RlOiBcImVuLVVTXCIsXG4gIGZvcm1hdERpc3RhbmNlOiBmb3JtYXREaXN0YW5jZSxcbiAgZm9ybWF0TG9uZzogZm9ybWF0TG9uZyxcbiAgZm9ybWF0UmVsYXRpdmU6IGZvcm1hdFJlbGF0aXZlLFxuICBsb2NhbGl6ZTogbG9jYWxpemUsXG4gIG1hdGNoOiBtYXRjaCxcbiAgb3B0aW9uczoge1xuICAgIHdlZWtTdGFydHNPbjogMCAvKiBTdW5kYXkgKi8sXG4gICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiAxLFxuICB9LFxufTtcblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBlblVTO1xuIiwKICAgICJpbXBvcnQgeyBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMgfSBmcm9tIFwiLi9kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMuanNcIjtcbmltcG9ydCB7IHN0YXJ0T2ZZZWFyIH0gZnJvbSBcIi4vc3RhcnRPZlllYXIuanNcIjtcbmltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgZ2V0RGF5T2ZZZWFyfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgZ2V0RGF5T2ZZZWFyXG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgZGF5IG9mIHRoZSB5ZWFyIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBkYXkgb2YgdGhlIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBkYXkgb2YgeWVhclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCBkYXkgb2YgdGhlIHllYXIgaXMgMiBKdWx5IDIwMTQ/XG4gKiBjb25zdCByZXN1bHQgPSBnZXREYXlPZlllYXIobmV3IERhdGUoMjAxNCwgNiwgMikpXG4gKiAvLz0+IDE4M1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF5T2ZZZWFyKGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pO1xuICBjb25zdCBkaWZmID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKF9kYXRlLCBzdGFydE9mWWVhcihfZGF0ZSkpO1xuICBjb25zdCBkYXlPZlllYXIgPSBkaWZmICsgMTtcbiAgcmV0dXJuIGRheU9mWWVhcjtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBnZXREYXlPZlllYXI7XG4iLAogICAgImltcG9ydCB7IG1pbGxpc2Vjb25kc0luV2VlayB9IGZyb20gXCIuL2NvbnN0YW50cy5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZklTT1dlZWsgfSBmcm9tIFwiLi9zdGFydE9mSVNPV2Vlay5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZklTT1dlZWtZZWFyIH0gZnJvbSBcIi4vc3RhcnRPZklTT1dlZWtZZWFyLmpzXCI7XG5pbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGdldElTT1dlZWt9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBnZXRJU09XZWVrXG4gKiBAY2F0ZWdvcnkgSVNPIFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBJU08gd2VlayBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgSVNPIHdlZWsgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogSVNPIHdlZWstbnVtYmVyaW5nIHllYXI6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgSVNPIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBvZiB0aGUgSVNPLXdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMiBKYW51YXJ5IDIwMDU/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRJU09XZWVrKG5ldyBEYXRlKDIwMDUsIDAsIDIpKVxuICogLy89PiA1M1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SVNPV2VlayhkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTtcbiAgY29uc3QgZGlmZiA9ICtzdGFydE9mSVNPV2VlayhfZGF0ZSkgLSArc3RhcnRPZklTT1dlZWtZZWFyKF9kYXRlKTtcblxuICAvLyBSb3VuZCB0aGUgbnVtYmVyIG9mIHdlZWtzIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgYmVjYXVzZSB0aGUgbnVtYmVyIG9mXG4gIC8vIG1pbGxpc2Vjb25kcyBpbiBhIHdlZWsgaXMgbm90IGNvbnN0YW50IChlLmcuIGl0J3MgZGlmZmVyZW50IGluIHRoZSB3ZWVrIG9mXG4gIC8vIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBjbG9jayBzaGlmdCkuXG4gIHJldHVybiBNYXRoLnJvdW5kKGRpZmYgLyBtaWxsaXNlY29uZHNJbldlZWspICsgMTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBnZXRJU09XZWVrO1xuIiwKICAgICJpbXBvcnQgeyBnZXREZWZhdWx0T3B0aW9ucyB9IGZyb20gXCIuL19saWIvZGVmYXVsdE9wdGlvbnMuanNcIjtcbmltcG9ydCB7IGNvbnN0cnVjdEZyb20gfSBmcm9tIFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCI7XG5pbXBvcnQgeyBzdGFydE9mV2VlayB9IGZyb20gXCIuL3N0YXJ0T2ZXZWVrLmpzXCI7XG5pbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGdldFdlZWtZZWFyfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgZ2V0V2Vla1llYXJcbiAqIEBjYXRlZ29yeSBXZWVrLU51bWJlcmluZyBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhciBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhciBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSBleGFjdCBjYWxjdWxhdGlvbiBkZXBlbmRzIG9uIHRoZSB2YWx1ZXMgb2ZcbiAqIGBvcHRpb25zLndlZWtTdGFydHNPbmAgKHdoaWNoIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrKVxuICogYW5kIGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgKHdoaWNoIGlzIHRoZSBkYXkgb2YgSmFudWFyeSwgd2hpY2ggaXMgYWx3YXlzIGluXG4gKiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgd2Vlay1udW1iZXJpbmcgeWVhcilcbiAqXG4gKiBXZWVrIG51bWJlcmluZzogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2VlayNUaGVfSVNPX3dlZWtfZGF0ZV9zeXN0ZW1cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnMuXG4gKlxuICogQHJldHVybnMgVGhlIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBudW1iZXJpbmcgeWVhciBpcyAyNiBEZWNlbWJlciAyMDA0IHdpdGggdGhlIGRlZmF1bHQgc2V0dGluZ3M/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrWWVhcihuZXcgRGF0ZSgyMDA0LCAxMSwgMjYpKVxuICogLy89PiAyMDA1XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIHdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMjYgRGVjZW1iZXIgMjAwNCBpZiB3ZWVrIHN0YXJ0cyBvbiBTYXR1cmRheT9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWtZZWFyKG5ldyBEYXRlKDIwMDQsIDExLCAyNiksIHsgd2Vla1N0YXJ0c09uOiA2IH0pXG4gKiAvLz0+IDIwMDRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBudW1iZXJpbmcgeWVhciBpcyAyNiBEZWNlbWJlciAyMDA0IGlmIHRoZSBmaXJzdCB3ZWVrIGNvbnRhaW5zIDQgSmFudWFyeT9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWtZZWFyKG5ldyBEYXRlKDIwMDQsIDExLCAyNiksIHsgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0IH0pXG4gKiAvLz0+IDIwMDRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdlZWtZZWFyKGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pO1xuICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0RnVsbFllYXIoKTtcblxuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IGdldERlZmF1bHRPcHRpb25zKCk7XG4gIGNvbnN0IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9XG4gICAgb3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIDE7XG5cbiAgY29uc3QgZmlyc3RXZWVrT2ZOZXh0WWVhciA9IGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgMCk7XG4gIGZpcnN0V2Vla09mTmV4dFllYXIuc2V0RnVsbFllYXIoeWVhciArIDEsIDAsIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7XG4gIGZpcnN0V2Vla09mTmV4dFllYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIGNvbnN0IHN0YXJ0T2ZOZXh0WWVhciA9IHN0YXJ0T2ZXZWVrKGZpcnN0V2Vla09mTmV4dFllYXIsIG9wdGlvbnMpO1xuXG4gIGNvbnN0IGZpcnN0V2Vla09mVGhpc1llYXIgPSBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIDApO1xuICBmaXJzdFdlZWtPZlRoaXNZZWFyLnNldEZ1bGxZZWFyKHllYXIsIDAsIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7XG4gIGZpcnN0V2Vla09mVGhpc1llYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIGNvbnN0IHN0YXJ0T2ZUaGlzWWVhciA9IHN0YXJ0T2ZXZWVrKGZpcnN0V2Vla09mVGhpc1llYXIsIG9wdGlvbnMpO1xuXG4gIGlmICgrX2RhdGUgPj0gK3N0YXJ0T2ZOZXh0WWVhcikge1xuICAgIHJldHVybiB5ZWFyICsgMTtcbiAgfSBlbHNlIGlmICgrX2RhdGUgPj0gK3N0YXJ0T2ZUaGlzWWVhcikge1xuICAgIHJldHVybiB5ZWFyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB5ZWFyIC0gMTtcbiAgfVxufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGdldFdlZWtZZWFyO1xuIiwKICAgICJpbXBvcnQgeyBnZXREZWZhdWx0T3B0aW9ucyB9IGZyb20gXCIuL19saWIvZGVmYXVsdE9wdGlvbnMuanNcIjtcbmltcG9ydCB7IGNvbnN0cnVjdEZyb20gfSBmcm9tIFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCI7XG5pbXBvcnQgeyBnZXRXZWVrWWVhciB9IGZyb20gXCIuL2dldFdlZWtZZWFyLmpzXCI7XG5pbXBvcnQgeyBzdGFydE9mV2VlayB9IGZyb20gXCIuL3N0YXJ0T2ZXZWVrLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBzdGFydE9mV2Vla1llYXJ9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBzdGFydE9mV2Vla1llYXJcbiAqIEBjYXRlZ29yeSBXZWVrLU51bWJlcmluZyBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYSBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgc3RhcnQgb2YgYSBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyLlxuICogVGhlIGV4YWN0IGNhbGN1bGF0aW9uIGRlcGVuZHMgb24gdGhlIHZhbHVlcyBvZlxuICogYG9wdGlvbnMud2Vla1N0YXJ0c09uYCAod2hpY2ggaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWspXG4gKiBhbmQgYG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlYCAod2hpY2ggaXMgdGhlIGRheSBvZiBKYW51YXJ5LCB3aGljaCBpcyBhbHdheXMgaW5cbiAqIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB3ZWVrLW51bWJlcmluZyB5ZWFyKVxuICpcbiAqIFdlZWsgbnVtYmVyaW5nOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XZWVrI1RoZV9JU09fd2Vla19kYXRlX3N5c3RlbVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgc3RhcnQgb2YgYSB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhbiBhIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIDIgSnVseSAyMDA1IHdpdGggZGVmYXVsdCBzZXR0aW5nczpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZXZWVrWWVhcihuZXcgRGF0ZSgyMDA1LCA2LCAyKSlcbiAqIC8vPT4gU3VuIERlYyAyNiAyMDA0IDAwOjAwOjAwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIDIgSnVseSAyMDA1XG4gKiAvLyBpZiBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB3ZWVrXG4gKiAvLyBhbmQgNCBKYW51YXJ5IGlzIGFsd2F5cyBpbiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhcjpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZXZWVrWWVhcihuZXcgRGF0ZSgyMDA1LCA2LCAyKSwge1xuICogICB3ZWVrU3RhcnRzT246IDEsXG4gKiAgIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZTogNFxuICogfSlcbiAqIC8vPT4gTW9uIEphbiAwMyAyMDA1IDAwOjAwOjAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFydE9mV2Vla1llYXIoZGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IGdldERlZmF1bHRPcHRpb25zKCk7XG4gIGNvbnN0IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9XG4gICAgb3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIDE7XG5cbiAgY29uc3QgeWVhciA9IGdldFdlZWtZZWFyKGRhdGUsIG9wdGlvbnMpO1xuICBjb25zdCBmaXJzdFdlZWsgPSBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIDApO1xuICBmaXJzdFdlZWsuc2V0RnVsbFllYXIoeWVhciwgMCwgZmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgZmlyc3RXZWVrLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICBjb25zdCBfZGF0ZSA9IHN0YXJ0T2ZXZWVrKGZpcnN0V2Vlaywgb3B0aW9ucyk7XG4gIHJldHVybiBfZGF0ZTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBzdGFydE9mV2Vla1llYXI7XG4iLAogICAgImltcG9ydCB7IG1pbGxpc2Vjb25kc0luV2VlayB9IGZyb20gXCIuL2NvbnN0YW50cy5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZldlZWsgfSBmcm9tIFwiLi9zdGFydE9mV2Vlay5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZldlZWtZZWFyIH0gZnJvbSBcIi4vc3RhcnRPZldlZWtZZWFyLmpzXCI7XG5pbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGdldFdlZWt9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBnZXRXZWVrXG4gKiBAY2F0ZWdvcnkgV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGxvY2FsIHdlZWsgaW5kZXggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIGxvY2FsIHdlZWsgaW5kZXggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgZXhhY3QgY2FsY3VsYXRpb24gZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mXG4gKiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gICh3aGljaCBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlaylcbiAqIGFuZCBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgICh3aGljaCBpcyB0aGUgZGF5IG9mIEphbnVhcnksIHdoaWNoIGlzIGFsd2F5cyBpblxuICogdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHdlZWstbnVtYmVyaW5nIHllYXIpXG4gKlxuICogV2VlayBudW1iZXJpbmc6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dlZWsjVGhlX0lTT193ZWVrX2RhdGVfc3lzdGVtXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBvZiB0aGUgbG9jYWwgd2VlayBudW1iZXJpbmcgeWVhciBpcyAyIEphbnVhcnkgMjAwNSB3aXRoIGRlZmF1bHQgb3B0aW9ucz9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWsobmV3IERhdGUoMjAwNSwgMCwgMikpXG4gKiAvLz0+IDJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBvZiB0aGUgbG9jYWwgd2VlayBudW1iZXJpbmcgeWVhciBpcyAyIEphbnVhcnkgMjAwNSxcbiAqIC8vIGlmIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLFxuICogLy8gYW5kIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyIGFsd2F5cyBjb250YWlucyA0IEphbnVhcnk/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrKG5ldyBEYXRlKDIwMDUsIDAsIDIpLCB7XG4gKiAgIHdlZWtTdGFydHNPbjogMSxcbiAqICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0XG4gKiB9KVxuICogLy89PiA1M1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2VlayhkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTtcbiAgY29uc3QgZGlmZiA9ICtzdGFydE9mV2VlayhfZGF0ZSwgb3B0aW9ucykgLSArc3RhcnRPZldlZWtZZWFyKF9kYXRlLCBvcHRpb25zKTtcblxuICAvLyBSb3VuZCB0aGUgbnVtYmVyIG9mIHdlZWtzIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgYmVjYXVzZSB0aGUgbnVtYmVyIG9mXG4gIC8vIG1pbGxpc2Vjb25kcyBpbiBhIHdlZWsgaXMgbm90IGNvbnN0YW50IChlLmcuIGl0J3MgZGlmZmVyZW50IGluIHRoZSB3ZWVrIG9mXG4gIC8vIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBjbG9jayBzaGlmdCkuXG4gIHJldHVybiBNYXRoLnJvdW5kKGRpZmYgLyBtaWxsaXNlY29uZHNJbldlZWspICsgMTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBnZXRXZWVrO1xuIiwKICAgICJleHBvcnQgZnVuY3Rpb24gYWRkTGVhZGluZ1plcm9zKG51bWJlciwgdGFyZ2V0TGVuZ3RoKSB7XG4gIGNvbnN0IHNpZ24gPSBudW1iZXIgPCAwID8gXCItXCIgOiBcIlwiO1xuICBjb25zdCBvdXRwdXQgPSBNYXRoLmFicyhudW1iZXIpLnRvU3RyaW5nKCkucGFkU3RhcnQodGFyZ2V0TGVuZ3RoLCBcIjBcIik7XG4gIHJldHVybiBzaWduICsgb3V0cHV0O1xufVxuIiwKICAgICJpbXBvcnQgeyBhZGRMZWFkaW5nWmVyb3MgfSBmcm9tIFwiLi4vYWRkTGVhZGluZ1plcm9zLmpzXCI7XG5cbi8qXG4gKiB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8ICBhICB8IEFNLCBQTSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBBKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBkICB8IERheSBvZiBtb250aCAgICAgICAgICAgICAgICAgICB8ICBEICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBoICB8IEhvdXIgWzEtMTJdICAgICAgICAgICAgICAgICAgICB8ICBIICB8IEhvdXIgWzAtMjNdICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBtICB8IE1pbnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBNICB8IE1vbnRoICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBzICB8IFNlY29uZCAgICAgICAgICAgICAgICAgICAgICAgICB8ICBTICB8IEZyYWN0aW9uIG9mIHNlY29uZCAgICAgICAgICAgICB8XG4gKiB8ICB5ICB8IFllYXIgKGFicykgICAgICAgICAgICAgICAgICAgICB8ICBZICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKlxuICogTGV0dGVycyBtYXJrZWQgYnkgKiBhcmUgbm90IGltcGxlbWVudGVkIGJ1dCByZXNlcnZlZCBieSBVbmljb2RlIHN0YW5kYXJkLlxuICovXG5cbmV4cG9ydCBjb25zdCBsaWdodEZvcm1hdHRlcnMgPSB7XG4gIC8vIFllYXJcbiAgeShkYXRlLCB0b2tlbikge1xuICAgIC8vIEZyb20gaHR0cDovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzL3RyMzUvdHIzNS0zMS90cjM1LWRhdGVzLmh0bWwjRGF0ZV9Gb3JtYXRfdG9rZW5zXG4gICAgLy8gfCBZZWFyICAgICB8ICAgICB5IHwgeXkgfCAgIHl5eSB8ICB5eXl5IHwgeXl5eXkgfFxuICAgIC8vIHwtLS0tLS0tLS0tfC0tLS0tLS18LS0tLXwtLS0tLS0tfC0tLS0tLS18LS0tLS0tLXxcbiAgICAvLyB8IEFEIDEgICAgIHwgICAgIDEgfCAwMSB8ICAgMDAxIHwgIDAwMDEgfCAwMDAwMSB8XG4gICAgLy8gfCBBRCAxMiAgICB8ICAgIDEyIHwgMTIgfCAgIDAxMiB8ICAwMDEyIHwgMDAwMTIgfFxuICAgIC8vIHwgQUQgMTIzICAgfCAgIDEyMyB8IDIzIHwgICAxMjMgfCAgMDEyMyB8IDAwMTIzIHxcbiAgICAvLyB8IEFEIDEyMzQgIHwgIDEyMzQgfCAzNCB8ICAxMjM0IHwgIDEyMzQgfCAwMTIzNCB8XG4gICAgLy8gfCBBRCAxMjM0NSB8IDEyMzQ1IHwgNDUgfCAxMjM0NSB8IDEyMzQ1IHwgMTIzNDUgfFxuXG4gICAgY29uc3Qgc2lnbmVkWWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAvLyBSZXR1cm5zIDEgZm9yIDEgQkMgKHdoaWNoIGlzIHllYXIgMCBpbiBKYXZhU2NyaXB0KVxuICAgIGNvbnN0IHllYXIgPSBzaWduZWRZZWFyID4gMCA/IHNpZ25lZFllYXIgOiAxIC0gc2lnbmVkWWVhcjtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHRva2VuID09PSBcInl5XCIgPyB5ZWFyICUgMTAwIDogeWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBNb250aFxuICBNKGRhdGUsIHRva2VuKSB7XG4gICAgY29uc3QgbW9udGggPSBkYXRlLmdldE1vbnRoKCk7XG4gICAgcmV0dXJuIHRva2VuID09PSBcIk1cIiA/IFN0cmluZyhtb250aCArIDEpIDogYWRkTGVhZGluZ1plcm9zKG1vbnRoICsgMSwgMik7XG4gIH0sXG5cbiAgLy8gRGF5IG9mIHRoZSBtb250aFxuICBkKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldERhdGUoKSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBBTSBvciBQTVxuICBhKGRhdGUsIHRva2VuKSB7XG4gICAgY29uc3QgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF0ZS5nZXRIb3VycygpIC8gMTIgPj0gMSA/IFwicG1cIiA6IFwiYW1cIjtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJhXCI6XG4gICAgICBjYXNlIFwiYWFcIjpcbiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgY2FzZSBcImFhYVwiOlxuICAgICAgICByZXR1cm4gZGF5UGVyaW9kRW51bVZhbHVlO1xuICAgICAgY2FzZSBcImFhYWFhXCI6XG4gICAgICAgIHJldHVybiBkYXlQZXJpb2RFbnVtVmFsdWVbMF07XG4gICAgICBjYXNlIFwiYWFhYVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZSA9PT0gXCJhbVwiID8gXCJhLm0uXCIgOiBcInAubS5cIjtcbiAgICB9XG4gIH0sXG5cbiAgLy8gSG91ciBbMS0xMl1cbiAgaChkYXRlLCB0b2tlbikge1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoZGF0ZS5nZXRIb3VycygpICUgMTIgfHwgMTIsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gSG91ciBbMC0yM11cbiAgSChkYXRlLCB0b2tlbikge1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoZGF0ZS5nZXRIb3VycygpLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIE1pbnV0ZVxuICBtKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldE1pbnV0ZXMoKSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBTZWNvbmRcbiAgcyhkYXRlLCB0b2tlbikge1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoZGF0ZS5nZXRTZWNvbmRzKCksIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gRnJhY3Rpb24gb2Ygc2Vjb25kXG4gIFMoZGF0ZSwgdG9rZW4pIHtcbiAgICBjb25zdCBudW1iZXJPZkRpZ2l0cyA9IHRva2VuLmxlbmd0aDtcbiAgICBjb25zdCBtaWxsaXNlY29uZHMgPSBkYXRlLmdldE1pbGxpc2Vjb25kcygpO1xuICAgIGNvbnN0IGZyYWN0aW9uYWxTZWNvbmRzID0gTWF0aC50cnVuYyhcbiAgICAgIG1pbGxpc2Vjb25kcyAqIE1hdGgucG93KDEwLCBudW1iZXJPZkRpZ2l0cyAtIDMpLFxuICAgICk7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhmcmFjdGlvbmFsU2Vjb25kcywgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbn07XG4iLAogICAgImltcG9ydCB7IGdldERheU9mWWVhciB9IGZyb20gXCIuLi8uLi9nZXREYXlPZlllYXIuanNcIjtcbmltcG9ydCB7IGdldElTT1dlZWsgfSBmcm9tIFwiLi4vLi4vZ2V0SVNPV2Vlay5qc1wiO1xuaW1wb3J0IHsgZ2V0SVNPV2Vla1llYXIgfSBmcm9tIFwiLi4vLi4vZ2V0SVNPV2Vla1llYXIuanNcIjtcbmltcG9ydCB7IGdldFdlZWsgfSBmcm9tIFwiLi4vLi4vZ2V0V2Vlay5qc1wiO1xuaW1wb3J0IHsgZ2V0V2Vla1llYXIgfSBmcm9tIFwiLi4vLi4vZ2V0V2Vla1llYXIuanNcIjtcblxuaW1wb3J0IHsgYWRkTGVhZGluZ1plcm9zIH0gZnJvbSBcIi4uL2FkZExlYWRpbmdaZXJvcy5qc1wiO1xuaW1wb3J0IHsgbGlnaHRGb3JtYXR0ZXJzIH0gZnJvbSBcIi4vbGlnaHRGb3JtYXR0ZXJzLmpzXCI7XG5cbmNvbnN0IGRheVBlcmlvZEVudW0gPSB7XG4gIGFtOiBcImFtXCIsXG4gIHBtOiBcInBtXCIsXG4gIG1pZG5pZ2h0OiBcIm1pZG5pZ2h0XCIsXG4gIG5vb246IFwibm9vblwiLFxuICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgYWZ0ZXJub29uOiBcImFmdGVybm9vblwiLFxuICBldmVuaW5nOiBcImV2ZW5pbmdcIixcbiAgbmlnaHQ6IFwibmlnaHRcIixcbn07XG5cbi8qXG4gKiB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8ICBhICB8IEFNLCBQTSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBBKiB8IE1pbGxpc2Vjb25kcyBpbiBkYXkgICAgICAgICAgICB8XG4gKiB8ICBiICB8IEFNLCBQTSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICB8ICBCICB8IEZsZXhpYmxlIGRheSBwZXJpb2QgICAgICAgICAgICB8XG4gKiB8ICBjICB8IFN0YW5kLWFsb25lIGxvY2FsIGRheSBvZiB3ZWVrICB8ICBDKiB8IExvY2FsaXplZCBob3VyIHcvIGRheSBwZXJpb2QgICB8XG4gKiB8ICBkICB8IERheSBvZiBtb250aCAgICAgICAgICAgICAgICAgICB8ICBEICB8IERheSBvZiB5ZWFyICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBlICB8IExvY2FsIGRheSBvZiB3ZWVrICAgICAgICAgICAgICB8ICBFICB8IERheSBvZiB3ZWVrICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBmICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBGKiB8IERheSBvZiB3ZWVrIGluIG1vbnRoICAgICAgICAgICB8XG4gKiB8ICBnKiB8IE1vZGlmaWVkIEp1bGlhbiBkYXkgICAgICAgICAgICB8ICBHICB8IEVyYSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBoICB8IEhvdXIgWzEtMTJdICAgICAgICAgICAgICAgICAgICB8ICBIICB8IEhvdXIgWzAtMjNdICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBpISB8IElTTyBkYXkgb2Ygd2VlayAgICAgICAgICAgICAgICB8ICBJISB8IElTTyB3ZWVrIG9mIHllYXIgICAgICAgICAgICAgICB8XG4gKiB8ICBqKiB8IExvY2FsaXplZCBob3VyIHcvIGRheSBwZXJpb2QgICB8ICBKKiB8IExvY2FsaXplZCBob3VyIHcvbyBkYXkgcGVyaW9kICB8XG4gKiB8ICBrICB8IEhvdXIgWzEtMjRdICAgICAgICAgICAgICAgICAgICB8ICBLICB8IEhvdXIgWzAtMTFdICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBsKiB8IChkZXByZWNhdGVkKSAgICAgICAgICAgICAgICAgICB8ICBMICB8IFN0YW5kLWFsb25lIG1vbnRoICAgICAgICAgICAgICB8XG4gKiB8ICBtICB8IE1pbnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBNICB8IE1vbnRoICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBuICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBOICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBvISB8IE9yZGluYWwgbnVtYmVyIG1vZGlmaWVyICAgICAgICB8ICBPICB8IFRpbWV6b25lIChHTVQpICAgICAgICAgICAgICAgICB8XG4gKiB8ICBwISB8IExvbmcgbG9jYWxpemVkIHRpbWUgICAgICAgICAgICB8ICBQISB8IExvbmcgbG9jYWxpemVkIGRhdGUgICAgICAgICAgICB8XG4gKiB8ICBxICB8IFN0YW5kLWFsb25lIHF1YXJ0ZXIgICAgICAgICAgICB8ICBRICB8IFF1YXJ0ZXIgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICByKiB8IFJlbGF0ZWQgR3JlZ29yaWFuIHllYXIgICAgICAgICB8ICBSISB8IElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgICB8XG4gKiB8ICBzICB8IFNlY29uZCAgICAgICAgICAgICAgICAgICAgICAgICB8ICBTICB8IEZyYWN0aW9uIG9mIHNlY29uZCAgICAgICAgICAgICB8XG4gKiB8ICB0ISB8IFNlY29uZHMgdGltZXN0YW1wICAgICAgICAgICAgICB8ICBUISB8IE1pbGxpc2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICB8XG4gKiB8ICB1ICB8IEV4dGVuZGVkIHllYXIgICAgICAgICAgICAgICAgICB8ICBVKiB8IEN5Y2xpYyB5ZWFyICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICB2KiB8IFRpbWV6b25lIChnZW5lcmljIG5vbi1sb2NhdC4pICB8ICBWKiB8IFRpbWV6b25lIChsb2NhdGlvbikgICAgICAgICAgICB8XG4gKiB8ICB3ICB8IExvY2FsIHdlZWsgb2YgeWVhciAgICAgICAgICAgICB8ICBXKiB8IFdlZWsgb2YgbW9udGggICAgICAgICAgICAgICAgICB8XG4gKiB8ICB4ICB8IFRpbWV6b25lIChJU08tODYwMSB3L28gWikgICAgICB8ICBYICB8IFRpbWV6b25lIChJU08tODYwMSkgICAgICAgICAgICB8XG4gKiB8ICB5ICB8IFllYXIgKGFicykgICAgICAgICAgICAgICAgICAgICB8ICBZICB8IExvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgICAgICB8XG4gKiB8ICB6ICB8IFRpbWV6b25lIChzcGVjaWZpYyBub24tbG9jYXQuKSB8ICBaKiB8IFRpbWV6b25lIChhbGlhc2VzKSAgICAgICAgICAgICB8XG4gKlxuICogTGV0dGVycyBtYXJrZWQgYnkgKiBhcmUgbm90IGltcGxlbWVudGVkIGJ1dCByZXNlcnZlZCBieSBVbmljb2RlIHN0YW5kYXJkLlxuICpcbiAqIExldHRlcnMgbWFya2VkIGJ5ICEgYXJlIG5vbi1zdGFuZGFyZCwgYnV0IGltcGxlbWVudGVkIGJ5IGRhdGUtZm5zOlxuICogLSBgb2AgbW9kaWZpZXMgdGhlIHByZXZpb3VzIHRva2VuIHRvIHR1cm4gaXQgaW50byBhbiBvcmRpbmFsIChzZWUgYGZvcm1hdGAgZG9jcylcbiAqIC0gYGlgIGlzIElTTyBkYXkgb2Ygd2Vlay4gRm9yIGBpYCBhbmQgYGlpYCBpcyByZXR1cm5zIG51bWVyaWMgSVNPIHdlZWsgZGF5cyxcbiAqICAgaS5lLiA3IGZvciBTdW5kYXksIDEgZm9yIE1vbmRheSwgZXRjLlxuICogLSBgSWAgaXMgSVNPIHdlZWsgb2YgeWVhciwgYXMgb3Bwb3NlZCB0byBgd2Agd2hpY2ggaXMgbG9jYWwgd2VlayBvZiB5ZWFyLlxuICogLSBgUmAgaXMgSVNPIHdlZWstbnVtYmVyaW5nIHllYXIsIGFzIG9wcG9zZWQgdG8gYFlgIHdoaWNoIGlzIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIuXG4gKiAgIGBSYCBpcyBzdXBwb3NlZCB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYElgIGFuZCBgaWBcbiAqICAgZm9yIHVuaXZlcnNhbCBJU08gd2Vlay1udW1iZXJpbmcgZGF0ZSwgd2hlcmVhc1xuICogICBgWWAgaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGB3YCBhbmQgYGVgXG4gKiAgIGZvciB3ZWVrLW51bWJlcmluZyBkYXRlIHNwZWNpZmljIHRvIHRoZSBsb2NhbGUuXG4gKiAtIGBQYCBpcyBsb25nIGxvY2FsaXplZCBkYXRlIGZvcm1hdFxuICogLSBgcGAgaXMgbG9uZyBsb2NhbGl6ZWQgdGltZSBmb3JtYXRcbiAqL1xuXG5leHBvcnQgY29uc3QgZm9ybWF0dGVycyA9IHtcbiAgLy8gRXJhXG4gIEc6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBlcmEgPSBkYXRlLmdldEZ1bGxZZWFyKCkgPiAwID8gMSA6IDA7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gQUQsIEJDXG4gICAgICBjYXNlIFwiR1wiOlxuICAgICAgY2FzZSBcIkdHXCI6XG4gICAgICBjYXNlIFwiR0dHXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5lcmEoZXJhLCB7IHdpZHRoOiBcImFiYnJldmlhdGVkXCIgfSk7XG4gICAgICAvLyBBLCBCXG4gICAgICBjYXNlIFwiR0dHR0dcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmVyYShlcmEsIHsgd2lkdGg6IFwibmFycm93XCIgfSk7XG4gICAgICAvLyBBbm5vIERvbWluaSwgQmVmb3JlIENocmlzdFxuICAgICAgY2FzZSBcIkdHR0dcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5lcmEoZXJhLCB7IHdpZHRoOiBcIndpZGVcIiB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gWWVhclxuICB5OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgLy8gT3JkaW5hbCBudW1iZXJcbiAgICBpZiAodG9rZW4gPT09IFwieW9cIikge1xuICAgICAgY29uc3Qgc2lnbmVkWWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgIC8vIFJldHVybnMgMSBmb3IgMSBCQyAod2hpY2ggaXMgeWVhciAwIGluIEphdmFTY3JpcHQpXG4gICAgICBjb25zdCB5ZWFyID0gc2lnbmVkWWVhciA+IDAgPyBzaWduZWRZZWFyIDogMSAtIHNpZ25lZFllYXI7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcih5ZWFyLCB7IHVuaXQ6IFwieWVhclwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMueShkYXRlLCB0b2tlbik7XG4gIH0sXG5cbiAgLy8gTG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhclxuICBZOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgc2lnbmVkV2Vla1llYXIgPSBnZXRXZWVrWWVhcihkYXRlLCBvcHRpb25zKTtcbiAgICAvLyBSZXR1cm5zIDEgZm9yIDEgQkMgKHdoaWNoIGlzIHllYXIgMCBpbiBKYXZhU2NyaXB0KVxuICAgIGNvbnN0IHdlZWtZZWFyID0gc2lnbmVkV2Vla1llYXIgPiAwID8gc2lnbmVkV2Vla1llYXIgOiAxIC0gc2lnbmVkV2Vla1llYXI7XG5cbiAgICAvLyBUd28gZGlnaXQgeWVhclxuICAgIGlmICh0b2tlbiA9PT0gXCJZWVwiKSB7XG4gICAgICBjb25zdCB0d29EaWdpdFllYXIgPSB3ZWVrWWVhciAlIDEwMDtcbiAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3ModHdvRGlnaXRZZWFyLCAyKTtcbiAgICB9XG5cbiAgICAvLyBPcmRpbmFsIG51bWJlclxuICAgIGlmICh0b2tlbiA9PT0gXCJZb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcih3ZWVrWWVhciwgeyB1bml0OiBcInllYXJcIiB9KTtcbiAgICB9XG5cbiAgICAvLyBQYWRkaW5nXG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyh3ZWVrWWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBJU08gd2Vlay1udW1iZXJpbmcgeWVhclxuICBSOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4pIHtcbiAgICBjb25zdCBpc29XZWVrWWVhciA9IGdldElTT1dlZWtZZWFyKGRhdGUpO1xuXG4gICAgLy8gUGFkZGluZ1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoaXNvV2Vla1llYXIsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gRXh0ZW5kZWQgeWVhci4gVGhpcyBpcyBhIHNpbmdsZSBudW1iZXIgZGVzaWduYXRpbmcgdGhlIHllYXIgb2YgdGhpcyBjYWxlbmRhciBzeXN0ZW0uXG4gIC8vIFRoZSBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiBgeWAgYW5kIGB1YCBsb2NhbGl6ZXJzIGFyZSBCLkMuIHllYXJzOlxuICAvLyB8IFllYXIgfCBgeWAgfCBgdWAgfFxuICAvLyB8LS0tLS0tfC0tLS0tfC0tLS0tfFxuICAvLyB8IEFDIDEgfCAgIDEgfCAgIDEgfFxuICAvLyB8IEJDIDEgfCAgIDEgfCAgIDAgfFxuICAvLyB8IEJDIDIgfCAgIDIgfCAgLTEgfFxuICAvLyBBbHNvIGB5eWAgYWx3YXlzIHJldHVybnMgdGhlIGxhc3QgdHdvIGRpZ2l0cyBvZiBhIHllYXIsXG4gIC8vIHdoaWxlIGB1dWAgcGFkcyBzaW5nbGUgZGlnaXQgeWVhcnMgdG8gMiBjaGFyYWN0ZXJzIGFuZCByZXR1cm5zIG90aGVyIHllYXJzIHVuY2hhbmdlZC5cbiAgdTogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHllYXIsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gUXVhcnRlclxuICBROiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgcXVhcnRlciA9IE1hdGguY2VpbCgoZGF0ZS5nZXRNb250aCgpICsgMSkgLyAzKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAxLCAyLCAzLCA0XG4gICAgICBjYXNlIFwiUVwiOlxuICAgICAgICByZXR1cm4gU3RyaW5nKHF1YXJ0ZXIpO1xuICAgICAgLy8gMDEsIDAyLCAwMywgMDRcbiAgICAgIGNhc2UgXCJRUVwiOlxuICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHF1YXJ0ZXIsIDIpO1xuICAgICAgLy8gMXN0LCAybmQsIDNyZCwgNHRoXG4gICAgICBjYXNlIFwiUW9cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIocXVhcnRlciwgeyB1bml0OiBcInF1YXJ0ZXJcIiB9KTtcbiAgICAgIC8vIFExLCBRMiwgUTMsIFE0XG4gICAgICBjYXNlIFwiUVFRXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIDEsIDIsIDMsIDQgKG5hcnJvdyBxdWFydGVyOyBjb3VsZCBiZSBub3QgbnVtZXJpY2FsKVxuICAgICAgY2FzZSBcIlFRUVFRXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLlxuICAgICAgY2FzZSBcIlFRUVFcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBTdGFuZC1hbG9uZSBxdWFydGVyXG4gIHE6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBxdWFydGVyID0gTWF0aC5jZWlsKChkYXRlLmdldE1vbnRoKCkgKyAxKSAvIDMpO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDEsIDIsIDMsIDRcbiAgICAgIGNhc2UgXCJxXCI6XG4gICAgICAgIHJldHVybiBTdHJpbmcocXVhcnRlcik7XG4gICAgICAvLyAwMSwgMDIsIDAzLCAwNFxuICAgICAgY2FzZSBcInFxXCI6XG4gICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MocXVhcnRlciwgMik7XG4gICAgICAvLyAxc3QsIDJuZCwgM3JkLCA0dGhcbiAgICAgIGNhc2UgXCJxb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihxdWFydGVyLCB7IHVuaXQ6IFwicXVhcnRlclwiIH0pO1xuICAgICAgLy8gUTEsIFEyLCBRMywgUTRcbiAgICAgIGNhc2UgXCJxcXFcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gMSwgMiwgMywgNCAobmFycm93IHF1YXJ0ZXI7IGNvdWxkIGJlIG5vdCBudW1lcmljYWwpXG4gICAgICBjYXNlIFwicXFxcXFcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uXG4gICAgICBjYXNlIFwicXFxcVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIE1vbnRoXG4gIE06IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiTVwiOlxuICAgICAgY2FzZSBcIk1NXCI6XG4gICAgICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuTShkYXRlLCB0b2tlbik7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCAxMnRoXG4gICAgICBjYXNlIFwiTW9cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIobW9udGggKyAxLCB7IHVuaXQ6IFwibW9udGhcIiB9KTtcbiAgICAgIC8vIEphbiwgRmViLCAuLi4sIERlY1xuICAgICAgY2FzZSBcIk1NTVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEosIEYsIC4uLiwgRFxuICAgICAgY2FzZSBcIk1NTU1NXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyXG4gICAgICBjYXNlIFwiTU1NTVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7IHdpZHRoOiBcIndpZGVcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIFN0YW5kLWFsb25lIG1vbnRoXG4gIEw6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAxLCAyLCAuLi4sIDEyXG4gICAgICBjYXNlIFwiTFwiOlxuICAgICAgICByZXR1cm4gU3RyaW5nKG1vbnRoICsgMSk7XG4gICAgICAvLyAwMSwgMDIsIC4uLiwgMTJcbiAgICAgIGNhc2UgXCJMTFwiOlxuICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKG1vbnRoICsgMSwgMik7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCAxMnRoXG4gICAgICBjYXNlIFwiTG9cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIobW9udGggKyAxLCB7IHVuaXQ6IFwibW9udGhcIiB9KTtcbiAgICAgIC8vIEphbiwgRmViLCAuLi4sIERlY1xuICAgICAgY2FzZSBcIkxMTFwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEosIEYsIC4uLiwgRFxuICAgICAgY2FzZSBcIkxMTExMXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyXG4gICAgICBjYXNlIFwiTExMTFwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7IHdpZHRoOiBcIndpZGVcIiwgY29udGV4dDogXCJzdGFuZGFsb25lXCIgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIExvY2FsIHdlZWsgb2YgeWVhclxuICB3OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgd2VlayA9IGdldFdlZWsoZGF0ZSwgb3B0aW9ucyk7XG5cbiAgICBpZiAodG9rZW4gPT09IFwid29cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIod2VlaywgeyB1bml0OiBcIndlZWtcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHdlZWssIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gSVNPIHdlZWsgb2YgeWVhclxuICBJOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgaXNvV2VlayA9IGdldElTT1dlZWsoZGF0ZSk7XG5cbiAgICBpZiAodG9rZW4gPT09IFwiSW9cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoaXNvV2VlaywgeyB1bml0OiBcIndlZWtcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGlzb1dlZWssIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gRGF5IG9mIHRoZSBtb250aFxuICBkOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSBcImRvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0RGF0ZSgpLCB7IHVuaXQ6IFwiZGF0ZVwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuZChkYXRlLCB0b2tlbik7XG4gIH0sXG5cbiAgLy8gRGF5IG9mIHllYXJcbiAgRDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGRheU9mWWVhciA9IGdldERheU9mWWVhcihkYXRlKTtcblxuICAgIGlmICh0b2tlbiA9PT0gXCJEb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXlPZlllYXIsIHsgdW5pdDogXCJkYXlPZlllYXJcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRheU9mWWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBEYXkgb2Ygd2Vla1xuICBFOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gZGF0ZS5nZXREYXkoKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBUdWVcbiAgICAgIGNhc2UgXCJFXCI6XG4gICAgICBjYXNlIFwiRUVcIjpcbiAgICAgIGNhc2UgXCJFRUVcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFRcbiAgICAgIGNhc2UgXCJFRUVFRVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1XG4gICAgICBjYXNlIFwiRUVFRUVFXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwic2hvcnRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdWVzZGF5XG4gICAgICBjYXNlIFwiRUVFRVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBMb2NhbCBkYXkgb2Ygd2Vla1xuICBlOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gZGF0ZS5nZXREYXkoKTtcbiAgICBjb25zdCBsb2NhbERheU9mV2VlayA9IChkYXlPZldlZWsgLSBvcHRpb25zLndlZWtTdGFydHNPbiArIDgpICUgNyB8fCA3O1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIE51bWVyaWNhbCB2YWx1ZSAoTnRoIGRheSBvZiB3ZWVrIHdpdGggY3VycmVudCBsb2NhbGUgb3Igd2Vla1N0YXJ0c09uKVxuICAgICAgY2FzZSBcImVcIjpcbiAgICAgICAgcmV0dXJuIFN0cmluZyhsb2NhbERheU9mV2Vlayk7XG4gICAgICAvLyBQYWRkZWQgbnVtZXJpY2FsIHZhbHVlXG4gICAgICBjYXNlIFwiZWVcIjpcbiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhsb2NhbERheU9mV2VlaywgMik7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCA3dGhcbiAgICAgIGNhc2UgXCJlb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihsb2NhbERheU9mV2VlaywgeyB1bml0OiBcImRheVwiIH0pO1xuICAgICAgY2FzZSBcImVlZVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuICAgICAgY2FzZSBcImVlZWVlXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJlZWVlZWVcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJlZWVlXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIFN0YW5kLWFsb25lIGxvY2FsIGRheSBvZiB3ZWVrXG4gIGM6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBkYXlPZldlZWsgPSBkYXRlLmdldERheSgpO1xuICAgIGNvbnN0IGxvY2FsRGF5T2ZXZWVrID0gKGRheU9mV2VlayAtIG9wdGlvbnMud2Vla1N0YXJ0c09uICsgOCkgJSA3IHx8IDc7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gTnVtZXJpY2FsIHZhbHVlIChzYW1lIGFzIGluIGBlYClcbiAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgIHJldHVybiBTdHJpbmcobG9jYWxEYXlPZldlZWspO1xuICAgICAgLy8gUGFkZGVkIG51bWVyaWNhbCB2YWx1ZVxuICAgICAgY2FzZSBcImNjXCI6XG4gICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MobG9jYWxEYXlPZldlZWssIHRva2VuLmxlbmd0aCk7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCA3dGhcbiAgICAgIGNhc2UgXCJjb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihsb2NhbERheU9mV2VlaywgeyB1bml0OiBcImRheVwiIH0pO1xuICAgICAgY2FzZSBcImNjY1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuICAgICAgY2FzZSBcImNjY2NjXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJjY2NjY2NcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJjY2NjXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIElTTyBkYXkgb2Ygd2Vla1xuICBpOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gZGF0ZS5nZXREYXkoKTtcbiAgICBjb25zdCBpc29EYXlPZldlZWsgPSBkYXlPZldlZWsgPT09IDAgPyA3IDogZGF5T2ZXZWVrO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDJcbiAgICAgIGNhc2UgXCJpXCI6XG4gICAgICAgIHJldHVybiBTdHJpbmcoaXNvRGF5T2ZXZWVrKTtcbiAgICAgIC8vIDAyXG4gICAgICBjYXNlIFwiaWlcIjpcbiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhpc29EYXlPZldlZWssIHRva2VuLmxlbmd0aCk7XG4gICAgICAvLyAybmRcbiAgICAgIGNhc2UgXCJpb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihpc29EYXlPZldlZWssIHsgdW5pdDogXCJkYXlcIiB9KTtcbiAgICAgIC8vIFR1ZVxuICAgICAgY2FzZSBcImlpaVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuICAgICAgY2FzZSBcImlpaWlpXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJpaWlpaWlcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJpaWlpXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIEFNIG9yIFBNXG4gIGE6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICBjb25zdCBkYXlQZXJpb2RFbnVtVmFsdWUgPSBob3VycyAvIDEyID49IDEgPyBcInBtXCIgOiBcImFtXCI7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiYVwiOlxuICAgICAgY2FzZSBcImFhXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFwiYWFhXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZVxuICAgICAgICAgIC5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNhc2UgXCJhYWFhYVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgXCJhYWFhXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIEFNLCBQTSwgbWlkbmlnaHQsIG5vb25cbiAgYjogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xuICAgIGxldCBkYXlQZXJpb2RFbnVtVmFsdWU7XG4gICAgaWYgKGhvdXJzID09PSAxMikge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5ub29uO1xuICAgIH0gZWxzZSBpZiAoaG91cnMgPT09IDApIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubWlkbmlnaHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGhvdXJzIC8gMTIgPj0gMSA/IFwicG1cIiA6IFwiYW1cIjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiYlwiOlxuICAgICAgY2FzZSBcImJiXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFwiYmJiXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZVxuICAgICAgICAgIC5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNhc2UgXCJiYmJiYlwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgXCJiYmJiXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIGluIHRoZSBtb3JuaW5nLCBpbiB0aGUgYWZ0ZXJub29uLCBpbiB0aGUgZXZlbmluZywgYXQgbmlnaHRcbiAgQjogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xuICAgIGxldCBkYXlQZXJpb2RFbnVtVmFsdWU7XG4gICAgaWYgKGhvdXJzID49IDE3KSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLmV2ZW5pbmc7XG4gICAgfSBlbHNlIGlmIChob3VycyA+PSAxMikge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5hZnRlcm5vb247XG4gICAgfSBlbHNlIGlmIChob3VycyA+PSA0KSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLm1vcm5pbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubmlnaHQ7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcIkJcIjpcbiAgICAgIGNhc2UgXCJCQlwiOlxuICAgICAgY2FzZSBcIkJCQlwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSBcIkJCQkJCXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSBcIkJCQkJcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gSG91ciBbMS0xMl1cbiAgaDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGlmICh0b2tlbiA9PT0gXCJob1wiKSB7XG4gICAgICBsZXQgaG91cnMgPSBkYXRlLmdldEhvdXJzKCkgJSAxMjtcbiAgICAgIGlmIChob3VycyA9PT0gMCkgaG91cnMgPSAxMjtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGhvdXJzLCB7IHVuaXQ6IFwiaG91clwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuaChkYXRlLCB0b2tlbik7XG4gIH0sXG5cbiAgLy8gSG91ciBbMC0yM11cbiAgSDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGlmICh0b2tlbiA9PT0gXCJIb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXRlLmdldEhvdXJzKCksIHsgdW5pdDogXCJob3VyXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5IKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBIb3VyIFswLTExXVxuICBLOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgaG91cnMgPSBkYXRlLmdldEhvdXJzKCkgJSAxMjtcblxuICAgIGlmICh0b2tlbiA9PT0gXCJLb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihob3VycywgeyB1bml0OiBcImhvdXJcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGhvdXJzLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIEhvdXIgWzEtMjRdXG4gIGs6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBsZXQgaG91cnMgPSBkYXRlLmdldEhvdXJzKCk7XG4gICAgaWYgKGhvdXJzID09PSAwKSBob3VycyA9IDI0O1xuXG4gICAgaWYgKHRva2VuID09PSBcImtvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGhvdXJzLCB7IHVuaXQ6IFwiaG91clwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoaG91cnMsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gTWludXRlXG4gIG06IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBpZiAodG9rZW4gPT09IFwibW9cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoZGF0ZS5nZXRNaW51dGVzKCksIHsgdW5pdDogXCJtaW51dGVcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLm0oZGF0ZSwgdG9rZW4pO1xuICB9LFxuXG4gIC8vIFNlY29uZFxuICBzOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSBcInNvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0U2Vjb25kcygpLCB7IHVuaXQ6IFwic2Vjb25kXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5zKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBGcmFjdGlvbiBvZiBzZWNvbmRcbiAgUzogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5TKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBUaW1lem9uZSAoSVNPLTg2MDEuIElmIG9mZnNldCBpcyAwLCBvdXRwdXQgaXMgYWx3YXlzIGAnWidgKVxuICBYOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgaWYgKHRpbWV6b25lT2Zmc2V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gXCJaXCI7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gSG91cnMgYW5kIG9wdGlvbmFsIG1pbnV0ZXNcbiAgICAgIGNhc2UgXCJYXCI6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZVdpdGhPcHRpb25hbE1pbnV0ZXModGltZXpvbmVPZmZzZXQpO1xuXG4gICAgICAvLyBIb3VycywgbWludXRlcyBhbmQgb3B0aW9uYWwgc2Vjb25kcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgIC8vIE5vdGU6IG5laXRoZXIgSVNPLTg2MDEgbm9yIEphdmFTY3JpcHQgc3VwcG9ydHMgc2Vjb25kcyBpbiB0aW1lem9uZSBvZmZzZXRzXG4gICAgICAvLyBzbyB0aGlzIHRva2VuIGFsd2F5cyBoYXMgdGhlIHNhbWUgb3V0cHV0IGFzIGBYWGBcbiAgICAgIGNhc2UgXCJYWFhYXCI6XG4gICAgICBjYXNlIFwiWFhcIjogLy8gSG91cnMgYW5kIG1pbnV0ZXMgd2l0aG91dCBgOmAgZGVsaW1pdGVyXG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCk7XG5cbiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGggYDpgIGRlbGltaXRlclxuICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHNcbiAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYFhYWGBcbiAgICAgIGNhc2UgXCJYWFhYWFwiOlxuICAgICAgY2FzZSBcIlhYWFwiOiAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRoIGA6YCBkZWxpbWl0ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBUaW1lem9uZSAoSVNPLTg2MDEuIElmIG9mZnNldCBpcyAwLCBvdXRwdXQgaXMgYCcrMDA6MDAnYCBvciBlcXVpdmFsZW50KVxuICB4OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gSG91cnMgYW5kIG9wdGlvbmFsIG1pbnV0ZXNcbiAgICAgIGNhc2UgXCJ4XCI6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZVdpdGhPcHRpb25hbE1pbnV0ZXModGltZXpvbmVPZmZzZXQpO1xuXG4gICAgICAvLyBIb3VycywgbWludXRlcyBhbmQgb3B0aW9uYWwgc2Vjb25kcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgIC8vIE5vdGU6IG5laXRoZXIgSVNPLTg2MDEgbm9yIEphdmFTY3JpcHQgc3VwcG9ydHMgc2Vjb25kcyBpbiB0aW1lem9uZSBvZmZzZXRzXG4gICAgICAvLyBzbyB0aGlzIHRva2VuIGFsd2F5cyBoYXMgdGhlIHNhbWUgb3V0cHV0IGFzIGB4eGBcbiAgICAgIGNhc2UgXCJ4eHh4XCI6XG4gICAgICBjYXNlIFwieHhcIjogLy8gSG91cnMgYW5kIG1pbnV0ZXMgd2l0aG91dCBgOmAgZGVsaW1pdGVyXG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCk7XG5cbiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGggYDpgIGRlbGltaXRlclxuICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHNcbiAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYHh4eGBcbiAgICAgIGNhc2UgXCJ4eHh4eFwiOlxuICAgICAgY2FzZSBcInh4eFwiOiAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRoIGA6YCBkZWxpbWl0ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBUaW1lem9uZSAoR01UKVxuICBPOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gU2hvcnRcbiAgICAgIGNhc2UgXCJPXCI6XG4gICAgICBjYXNlIFwiT09cIjpcbiAgICAgIGNhc2UgXCJPT09cIjpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZVNob3J0KHRpbWV6b25lT2Zmc2V0LCBcIjpcIik7XG4gICAgICAvLyBMb25nXG4gICAgICBjYXNlIFwiT09PT1wiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBUaW1lem9uZSAoc3BlY2lmaWMgbm9uLWxvY2F0aW9uKVxuICB6OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gU2hvcnRcbiAgICAgIGNhc2UgXCJ6XCI6XG4gICAgICBjYXNlIFwienpcIjpcbiAgICAgIGNhc2UgXCJ6enpcIjpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZVNob3J0KHRpbWV6b25lT2Zmc2V0LCBcIjpcIik7XG4gICAgICAvLyBMb25nXG4gICAgICBjYXNlIFwienp6elwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBTZWNvbmRzIHRpbWVzdGFtcFxuICB0OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IE1hdGgudHJ1bmMoK2RhdGUgLyAxMDAwKTtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHRpbWVzdGFtcCwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBNaWxsaXNlY29uZHMgdGltZXN0YW1wXG4gIFQ6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcygrZGF0ZSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lU2hvcnQob2Zmc2V0LCBkZWxpbWl0ZXIgPSBcIlwiKSB7XG4gIGNvbnN0IHNpZ24gPSBvZmZzZXQgPiAwID8gXCItXCIgOiBcIitcIjtcbiAgY29uc3QgYWJzT2Zmc2V0ID0gTWF0aC5hYnMob2Zmc2V0KTtcbiAgY29uc3QgaG91cnMgPSBNYXRoLnRydW5jKGFic09mZnNldCAvIDYwKTtcbiAgY29uc3QgbWludXRlcyA9IGFic09mZnNldCAlIDYwO1xuICBpZiAobWludXRlcyA9PT0gMCkge1xuICAgIHJldHVybiBzaWduICsgU3RyaW5nKGhvdXJzKTtcbiAgfVxuICByZXR1cm4gc2lnbiArIFN0cmluZyhob3VycykgKyBkZWxpbWl0ZXIgKyBhZGRMZWFkaW5nWmVyb3MobWludXRlcywgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lV2l0aE9wdGlvbmFsTWludXRlcyhvZmZzZXQsIGRlbGltaXRlcikge1xuICBpZiAob2Zmc2V0ICUgNjAgPT09IDApIHtcbiAgICBjb25zdCBzaWduID0gb2Zmc2V0ID4gMCA/IFwiLVwiIDogXCIrXCI7XG4gICAgcmV0dXJuIHNpZ24gKyBhZGRMZWFkaW5nWmVyb3MoTWF0aC5hYnMob2Zmc2V0KSAvIDYwLCAyKTtcbiAgfVxuICByZXR1cm4gZm9ybWF0VGltZXpvbmUob2Zmc2V0LCBkZWxpbWl0ZXIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUaW1lem9uZShvZmZzZXQsIGRlbGltaXRlciA9IFwiXCIpIHtcbiAgY29uc3Qgc2lnbiA9IG9mZnNldCA+IDAgPyBcIi1cIiA6IFwiK1wiO1xuICBjb25zdCBhYnNPZmZzZXQgPSBNYXRoLmFicyhvZmZzZXQpO1xuICBjb25zdCBob3VycyA9IGFkZExlYWRpbmdaZXJvcyhNYXRoLnRydW5jKGFic09mZnNldCAvIDYwKSwgMik7XG4gIGNvbnN0IG1pbnV0ZXMgPSBhZGRMZWFkaW5nWmVyb3MoYWJzT2Zmc2V0ICUgNjAsIDIpO1xuICByZXR1cm4gc2lnbiArIGhvdXJzICsgZGVsaW1pdGVyICsgbWludXRlcztcbn1cbiIsCiAgICAiY29uc3QgZGF0ZUxvbmdGb3JtYXR0ZXIgPSAocGF0dGVybiwgZm9ybWF0TG9uZykgPT4ge1xuICBzd2l0Y2ggKHBhdHRlcm4pIHtcbiAgICBjYXNlIFwiUFwiOlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcuZGF0ZSh7IHdpZHRoOiBcInNob3J0XCIgfSk7XG4gICAgY2FzZSBcIlBQXCI6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy5kYXRlKHsgd2lkdGg6IFwibWVkaXVtXCIgfSk7XG4gICAgY2FzZSBcIlBQUFwiOlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcuZGF0ZSh7IHdpZHRoOiBcImxvbmdcIiB9KTtcbiAgICBjYXNlIFwiUFBQUFwiOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy5kYXRlKHsgd2lkdGg6IFwiZnVsbFwiIH0pO1xuICB9XG59O1xuXG5jb25zdCB0aW1lTG9uZ0Zvcm1hdHRlciA9IChwYXR0ZXJuLCBmb3JtYXRMb25nKSA9PiB7XG4gIHN3aXRjaCAocGF0dGVybikge1xuICAgIGNhc2UgXCJwXCI6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy50aW1lKHsgd2lkdGg6IFwic2hvcnRcIiB9KTtcbiAgICBjYXNlIFwicHBcIjpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLnRpbWUoeyB3aWR0aDogXCJtZWRpdW1cIiB9KTtcbiAgICBjYXNlIFwicHBwXCI6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy50aW1lKHsgd2lkdGg6IFwibG9uZ1wiIH0pO1xuICAgIGNhc2UgXCJwcHBwXCI6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLnRpbWUoeyB3aWR0aDogXCJmdWxsXCIgfSk7XG4gIH1cbn07XG5cbmNvbnN0IGRhdGVUaW1lTG9uZ0Zvcm1hdHRlciA9IChwYXR0ZXJuLCBmb3JtYXRMb25nKSA9PiB7XG4gIGNvbnN0IG1hdGNoUmVzdWx0ID0gcGF0dGVybi5tYXRjaCgvKFArKShwKyk/LykgfHwgW107XG4gIGNvbnN0IGRhdGVQYXR0ZXJuID0gbWF0Y2hSZXN1bHRbMV07XG4gIGNvbnN0IHRpbWVQYXR0ZXJuID0gbWF0Y2hSZXN1bHRbMl07XG5cbiAgaWYgKCF0aW1lUGF0dGVybikge1xuICAgIHJldHVybiBkYXRlTG9uZ0Zvcm1hdHRlcihwYXR0ZXJuLCBmb3JtYXRMb25nKTtcbiAgfVxuXG4gIGxldCBkYXRlVGltZUZvcm1hdDtcblxuICBzd2l0Y2ggKGRhdGVQYXR0ZXJuKSB7XG4gICAgY2FzZSBcIlBcIjpcbiAgICAgIGRhdGVUaW1lRm9ybWF0ID0gZm9ybWF0TG9uZy5kYXRlVGltZSh7IHdpZHRoOiBcInNob3J0XCIgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiUFBcIjpcbiAgICAgIGRhdGVUaW1lRm9ybWF0ID0gZm9ybWF0TG9uZy5kYXRlVGltZSh7IHdpZHRoOiBcIm1lZGl1bVwiIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIlBQUFwiOlxuICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nLmRhdGVUaW1lKHsgd2lkdGg6IFwibG9uZ1wiIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIlBQUFBcIjpcbiAgICBkZWZhdWx0OlxuICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nLmRhdGVUaW1lKHsgd2lkdGg6IFwiZnVsbFwiIH0pO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gZGF0ZVRpbWVGb3JtYXRcbiAgICAucmVwbGFjZShcInt7ZGF0ZX19XCIsIGRhdGVMb25nRm9ybWF0dGVyKGRhdGVQYXR0ZXJuLCBmb3JtYXRMb25nKSlcbiAgICAucmVwbGFjZShcInt7dGltZX19XCIsIHRpbWVMb25nRm9ybWF0dGVyKHRpbWVQYXR0ZXJuLCBmb3JtYXRMb25nKSk7XG59O1xuXG5leHBvcnQgY29uc3QgbG9uZ0Zvcm1hdHRlcnMgPSB7XG4gIHA6IHRpbWVMb25nRm9ybWF0dGVyLFxuICBQOiBkYXRlVGltZUxvbmdGb3JtYXR0ZXIsXG59O1xuIiwKICAgICJjb25zdCBkYXlPZlllYXJUb2tlblJFID0gL15EKyQvO1xuY29uc3Qgd2Vla1llYXJUb2tlblJFID0gL15ZKyQvO1xuXG5jb25zdCB0aHJvd1Rva2VucyA9IFtcIkRcIiwgXCJERFwiLCBcIllZXCIsIFwiWVlZWVwiXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW4odG9rZW4pIHtcbiAgcmV0dXJuIGRheU9mWWVhclRva2VuUkUudGVzdCh0b2tlbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb3RlY3RlZFdlZWtZZWFyVG9rZW4odG9rZW4pIHtcbiAgcmV0dXJuIHdlZWtZZWFyVG9rZW5SRS50ZXN0KHRva2VuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdhcm5PclRocm93UHJvdGVjdGVkRXJyb3IodG9rZW4sIGZvcm1hdCwgaW5wdXQpIHtcbiAgY29uc3QgX21lc3NhZ2UgPSBtZXNzYWdlKHRva2VuLCBmb3JtYXQsIGlucHV0KTtcbiAgY29uc29sZS53YXJuKF9tZXNzYWdlKTtcbiAgaWYgKHRocm93VG9rZW5zLmluY2x1ZGVzKHRva2VuKSkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoX21lc3NhZ2UpO1xufVxuXG5mdW5jdGlvbiBtZXNzYWdlKHRva2VuLCBmb3JtYXQsIGlucHV0KSB7XG4gIGNvbnN0IHN1YmplY3QgPSB0b2tlblswXSA9PT0gXCJZXCIgPyBcInllYXJzXCIgOiBcImRheXMgb2YgdGhlIG1vbnRoXCI7XG4gIHJldHVybiBgVXNlIFxcYCR7dG9rZW4udG9Mb3dlckNhc2UoKX1cXGAgaW5zdGVhZCBvZiBcXGAke3Rva2VufVxcYCAoaW4gXFxgJHtmb3JtYXR9XFxgKSBmb3IgZm9ybWF0dGluZyAke3N1YmplY3R9IHRvIHRoZSBpbnB1dCBcXGAke2lucHV0fVxcYDsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kYDtcbn1cbiIsCiAgICAiaW1wb3J0IHsgZGVmYXVsdExvY2FsZSB9IGZyb20gXCIuL19saWIvZGVmYXVsdExvY2FsZS5qc1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdE9wdGlvbnMgfSBmcm9tIFwiLi9fbGliL2RlZmF1bHRPcHRpb25zLmpzXCI7XG5pbXBvcnQgeyBmb3JtYXR0ZXJzIH0gZnJvbSBcIi4vX2xpYi9mb3JtYXQvZm9ybWF0dGVycy5qc1wiO1xuaW1wb3J0IHsgbG9uZ0Zvcm1hdHRlcnMgfSBmcm9tIFwiLi9fbGliL2Zvcm1hdC9sb25nRm9ybWF0dGVycy5qc1wiO1xuaW1wb3J0IHtcbiAgaXNQcm90ZWN0ZWREYXlPZlllYXJUb2tlbixcbiAgaXNQcm90ZWN0ZWRXZWVrWWVhclRva2VuLFxuICB3YXJuT3JUaHJvd1Byb3RlY3RlZEVycm9yLFxufSBmcm9tIFwiLi9fbGliL3Byb3RlY3RlZFRva2Vucy5qc1wiO1xuaW1wb3J0IHsgaXNWYWxpZCB9IGZyb20gXCIuL2lzVmFsaWQuanNcIjtcbmltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vLyBSZXhwb3J0cyBvZiBpbnRlcm5hbCBmb3IgbGlicmFyaWVzIHRvIHVzZS5cbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2lzc3Vlcy8zNjM4I2lzc3VlY29tbWVudC0xODc3MDgyODc0XG5leHBvcnQgeyBmb3JtYXR0ZXJzLCBsb25nRm9ybWF0dGVycyB9O1xuXG4vLyBUaGlzIFJlZ0V4cCBjb25zaXN0cyBvZiB0aHJlZSBwYXJ0cyBzZXBhcmF0ZWQgYnkgYHxgOlxuLy8gLSBbeVlRcU1Md0lkRGVjaWhIS2ttc11vIG1hdGNoZXMgYW55IGF2YWlsYWJsZSBvcmRpbmFsIG51bWJlciB0b2tlblxuLy8gICAob25lIG9mIHRoZSBjZXJ0YWluIGxldHRlcnMgZm9sbG93ZWQgYnkgYG9gKVxuLy8gLSAoXFx3KVxcMSogbWF0Y2hlcyBhbnkgc2VxdWVuY2VzIG9mIHRoZSBzYW1lIGxldHRlclxuLy8gLSAnJyBtYXRjaGVzIHR3byBxdW90ZSBjaGFyYWN0ZXJzIGluIGEgcm93XG4vLyAtICcoJyd8W14nXSkrKCd8JCkgbWF0Y2hlcyBhbnl0aGluZyBzdXJyb3VuZGVkIGJ5IHR3byBxdW90ZSBjaGFyYWN0ZXJzICgnKSxcbi8vICAgZXhjZXB0IGEgc2luZ2xlIHF1b3RlIHN5bWJvbCwgd2hpY2ggZW5kcyB0aGUgc2VxdWVuY2UuXG4vLyAgIFR3byBxdW90ZSBjaGFyYWN0ZXJzIGRvIG5vdCBlbmQgdGhlIHNlcXVlbmNlLlxuLy8gICBJZiB0aGVyZSBpcyBubyBtYXRjaGluZyBzaW5nbGUgcXVvdGVcbi8vICAgdGhlbiB0aGUgc2VxdWVuY2Ugd2lsbCBjb250aW51ZSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuXG4vLyAtIC4gbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3RlciB1bm1hdGNoZWQgYnkgcHJldmlvdXMgcGFydHMgb2YgdGhlIFJlZ0V4cHNcbmNvbnN0IGZvcm1hdHRpbmdUb2tlbnNSZWdFeHAgPVxuICAvW3lZUXFNTHdJZERlY2loSEtrbXNdb3woXFx3KVxcMSp8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7XG5cbi8vIFRoaXMgUmVnRXhwIGNhdGNoZXMgc3ltYm9scyBlc2NhcGVkIGJ5IHF1b3RlcywgYW5kIGFsc29cbi8vIHNlcXVlbmNlcyBvZiBzeW1ib2xzIFAsIHAsIGFuZCB0aGUgY29tYmluYXRpb25zIGxpa2UgYFBQUFBQUFBwcHBwcGBcbmNvbnN0IGxvbmdGb3JtYXR0aW5nVG9rZW5zUmVnRXhwID0gL1ArcCt8UCt8cCt8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7XG5cbmNvbnN0IGVzY2FwZWRTdHJpbmdSZWdFeHAgPSAvXicoW15dKj8pJz8kLztcbmNvbnN0IGRvdWJsZVF1b3RlUmVnRXhwID0gLycnL2c7XG5jb25zdCB1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cCA9IC9bYS16QS1aXS87XG5cbmV4cG9ydCB7IGZvcm1hdCBhcyBmb3JtYXREYXRlIH07XG5cbi8qKlxuICogVGhlIHtAbGluayBmb3JtYXR9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBmb3JtYXRcbiAqIEBhbGlhcyBmb3JtYXREYXRlXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEZvcm1hdCB0aGUgZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgZm9ybWF0dGVkIGRhdGUgc3RyaW5nIGluIHRoZSBnaXZlbiBmb3JtYXQuIFRoZSByZXN1bHQgbWF5IHZhcnkgYnkgbG9jYWxlLlxuICpcbiAqID4g4pqg77iPIFBsZWFzZSBub3RlIHRoYXQgdGhlIGBmb3JtYXRgIHRva2VucyBkaWZmZXIgZnJvbSBNb21lbnQuanMgYW5kIG90aGVyIGxpYnJhcmllcy5cbiAqID4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKlxuICogVGhlIGNoYXJhY3RlcnMgd3JhcHBlZCBiZXR3ZWVuIHR3byBzaW5nbGUgcXVvdGVzIGNoYXJhY3RlcnMgKCcpIGFyZSBlc2NhcGVkLlxuICogVHdvIHNpbmdsZSBxdW90ZXMgaW4gYSByb3csIHdoZXRoZXIgaW5zaWRlIG9yIG91dHNpZGUgYSBxdW90ZWQgc2VxdWVuY2UsIHJlcHJlc2VudCBhICdyZWFsJyBzaW5nbGUgcXVvdGUuXG4gKiAoc2VlIHRoZSBsYXN0IGV4YW1wbGUpXG4gKlxuICogRm9ybWF0IG9mIHRoZSBzdHJpbmcgaXMgYmFzZWQgb24gVW5pY29kZSBUZWNobmljYWwgU3RhbmRhcmQgIzM1OlxuICogaHR0cHM6Ly93d3cudW5pY29kZS5vcmcvcmVwb3J0cy90cjM1L3RyMzUtZGF0ZXMuaHRtbCNEYXRlX0ZpZWxkX1N5bWJvbF9UYWJsZVxuICogd2l0aCBhIGZldyBhZGRpdGlvbnMgKHNlZSBub3RlIDcgYmVsb3cgdGhlIHRhYmxlKS5cbiAqXG4gKiBBY2NlcHRlZCBwYXR0ZXJuczpcbiAqIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBhdHRlcm4gfCBSZXN1bHQgZXhhbXBsZXMgICAgICAgICAgICAgICAgICAgfCBOb3RlcyB8XG4gKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tfFxuICogfCBFcmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRy4uR0dHICB8IEFELCBCQyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdHR0cgICAgfCBBbm5vIERvbWluaSwgQmVmb3JlIENocmlzdCAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBHR0dHRyAgIHwgQSwgQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBDYWxlbmRhciB5ZWFyICAgICAgICAgICAgICAgICAgIHwgeSAgICAgICB8IDQ0LCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHlvICAgICAgfCA0NHRoLCAxc3QsIDB0aCwgMTd0aCAgICAgICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5eSAgICAgIHwgNDQsIDAxLCAwMCwgMTcgICAgICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeXl5ICAgICB8IDA0NCwgMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHl5eXkgICAgfCAwMDQ0LCAwMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5eXl5eSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw1ICAgfFxuICogfCBMb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgIHwgWSAgICAgICB8IDQ0LCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFlvICAgICAgfCA0NHRoLCAxc3QsIDE5MDB0aCwgMjAxN3RoICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBZWSAgICAgIHwgNDQsIDAxLCAwMCwgMTcgICAgICAgICAgICAgICAgICAgIHwgNSw4ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWVlZICAgICB8IDA0NCwgMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFlZWVkgICAgfCAwMDQ0LCAwMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgfCA1LDggICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBZWVlZWSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw1ICAgfFxuICogfCBJU08gd2Vlay1udW1iZXJpbmcgeWVhciAgICAgICAgIHwgUiAgICAgICB8IC00MywgMCwgMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJSICAgICAgfCAtNDMsIDAwLCAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSUlIgICAgIHwgLTA0MywgMDAwLCAwMDEsIDE5MDAsIDIwMTcgICAgICAgIHwgNSw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUlJSUiAgICB8IC0wMDQzLCAwMDAwLCAwMDAxLCAxOTAwLCAyMDE3ICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJSUlJSICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDUsNyB8XG4gKiB8IEV4dGVuZGVkIHllYXIgICAgICAgICAgICAgICAgICAgfCB1ICAgICAgIHwgLTQzLCAwLCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdXUgICAgICB8IC00MywgMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHV1dSAgICAgfCAtMDQzLCAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1dXV1ICAgIHwgLTAwNDMsIDAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdXV1dXUgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNSAgIHxcbiAqIHwgUXVhcnRlciAoZm9ybWF0dGluZykgICAgICAgICAgICB8IFEgICAgICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBRbyAgICAgIHwgMXN0LCAybmQsIDNyZCwgNHRoICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUVEgICAgICB8IDAxLCAwMiwgMDMsIDA0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFFRUSAgICAgfCBRMSwgUTIsIFEzLCBRNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBRUVFRICAgIHwgMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi4gICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUVFRUVEgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgUXVhcnRlciAoc3RhbmQtYWxvbmUpICAgICAgICAgICB8IHEgICAgICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxbyAgICAgIHwgMXN0LCAybmQsIDNyZCwgNHRoICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcXEgICAgICB8IDAxLCAwMiwgMDMsIDA0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHFxcSAgICAgfCBRMSwgUTIsIFEzLCBRNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxcXFxICAgIHwgMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi4gICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcXFxcXEgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgTW9udGggKGZvcm1hdHRpbmcpICAgICAgICAgICAgICB8IE0gICAgICAgfCAxLCAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTJ0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTU0gICAgICB8IDAxLCAwMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1NTSAgICAgfCBKYW4sIEZlYiwgLi4uLCBEZWMgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNTU1NICAgIHwgSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXIgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTU1NTU0gICB8IEosIEYsIC4uLiwgRCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgTW9udGggKHN0YW5kLWFsb25lKSAgICAgICAgICAgICB8IEwgICAgICAgfCAxLCAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTJ0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTEwgICAgICB8IDAxLCAwMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExMTCAgICAgfCBKYW4sIEZlYiwgLi4uLCBEZWMgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMTExMICAgIHwgSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXIgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTExMTEwgICB8IEosIEYsIC4uLiwgRCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgTG9jYWwgd2VlayBvZiB5ZWFyICAgICAgICAgICAgICB8IHcgICAgICAgfCAxLCAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3byAgICAgIHwgMXN0LCAybmQsIC4uLiwgNTN0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd3cgICAgICB8IDAxLCAwMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgSVNPIHdlZWsgb2YgeWVhciAgICAgICAgICAgICAgICB8IEkgICAgICAgfCAxLCAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgNTN0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSUkgICAgICB8IDAxLCAwMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgRGF5IG9mIG1vbnRoICAgICAgICAgICAgICAgICAgICB8IGQgICAgICAgfCAxLCAyLCAuLi4sIDMxICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMzFzdCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZGQgICAgICB8IDAxLCAwMiwgLi4uLCAzMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgRGF5IG9mIHllYXIgICAgICAgICAgICAgICAgICAgICB8IEQgICAgICAgfCAxLCAyLCAuLi4sIDM2NSwgMzY2ICAgICAgICAgICAgICAgfCA5ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMzY1dGgsIDM2NnRoICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgREQgICAgICB8IDAxLCAwMiwgLi4uLCAzNjUsIDM2NiAgICAgICAgICAgICB8IDkgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERERCAgICAgfCAwMDEsIDAwMiwgLi4uLCAzNjUsIDM2NiAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEREREICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyAgICAgfFxuICogfCBEYXkgb2Ygd2VlayAoZm9ybWF0dGluZykgICAgICAgIHwgRS4uRUVFICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVFRUUgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRUVFRSAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRUVFRUVFICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8ICAgICAgIHxcbiAqIHwgSVNPIGRheSBvZiB3ZWVrIChmb3JtYXR0aW5nKSAgICB8IGkgICAgICAgfCAxLCAyLCAzLCAuLi4sIDcgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgN3RoICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWkgICAgICB8IDAxLCAwMiwgLi4uLCAwNyAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlpaSAgICAgfCBNb24sIFR1ZSwgV2VkLCAuLi4sIFN1biAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpaWlpICAgIHwgTW9uZGF5LCBUdWVzZGF5LCAuLi4sIFN1bmRheSAgICAgIHwgMiw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWlpaWkgICB8IE0sIFQsIFcsIFQsIEYsIFMsIFMgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlpaWlpaSAgfCBNbywgVHUsIFdlLCBUaCwgRnIsIFNhLCBTdSAgICAgICAgfCA3ICAgICB8XG4gKiB8IExvY2FsIGRheSBvZiB3ZWVrIChmb3JtYXR0aW5nKSAgfCBlICAgICAgIHwgMiwgMywgNCwgLi4uLCAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZW8gICAgICB8IDJuZCwgM3JkLCAuLi4sIDFzdCAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVlICAgICAgfCAwMiwgMDMsIC4uLiwgMDEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlZWUgICAgIHwgTW9uLCBUdWUsIFdlZCwgLi4uLCBTdW4gICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZWVlZSAgICB8IE1vbmRheSwgVHVlc2RheSwgLi4uLCBTdW5kYXkgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVlZWVlICAgfCBNLCBULCBXLCBULCBGLCBTLCBTICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlZWVlZWUgIHwgTW8sIFR1LCBXZSwgVGgsIEZyLCBTYSwgU3UgICAgICAgIHwgICAgICAgfFxuICogfCBMb2NhbCBkYXkgb2Ygd2VlayAoc3RhbmQtYWxvbmUpIHwgYyAgICAgICB8IDIsIDMsIDQsIC4uLiwgMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNvICAgICAgfCAybmQsIDNyZCwgLi4uLCAxc3QgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjYyAgICAgIHwgMDIsIDAzLCAuLi4sIDAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2NjICAgICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNjY2MgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjY2NjYyAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2NjY2NjICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8ICAgICAgIHxcbiAqIHwgQU0sIFBNICAgICAgICAgICAgICAgICAgICAgICAgICB8IGEuLmFhICAgfCBBTSwgUE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhYWEgICAgIHwgYW0sIHBtICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWFhYSAgICB8IGEubS4sIHAubS4gICAgICAgICAgICAgICAgICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFhYWFhICAgfCBhLCBwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEFNLCBQTSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICAgfCBiLi5iYiAgIHwgQU0sIFBNLCBub29uLCBtaWRuaWdodCAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYmJiICAgICB8IGFtLCBwbSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJiYmIgICAgfCBhLm0uLCBwLm0uLCBub29uLCBtaWRuaWdodCAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiYmJiYiAgIHwgYSwgcCwgbiwgbWkgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBGbGV4aWJsZSBkYXkgcGVyaW9kICAgICAgICAgICAgIHwgQi4uQkJCICB8IGF0IG5pZ2h0LCBpbiB0aGUgbW9ybmluZywgLi4uICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJCQkIgICAgfCBhdCBuaWdodCwgaW4gdGhlIG1vcm5pbmcsIC4uLiAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCQkJCQiAgIHwgYXQgbmlnaHQsIGluIHRoZSBtb3JuaW5nLCAuLi4gICAgIHwgICAgICAgfFxuICogfCBIb3VyIFsxLTEyXSAgICAgICAgICAgICAgICAgICAgIHwgaCAgICAgICB8IDEsIDIsIC4uLiwgMTEsIDEyICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGhvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAxMXRoLCAxMnRoICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBoaCAgICAgIHwgMDEsIDAyLCAuLi4sIDExLCAxMiAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBIb3VyIFswLTIzXSAgICAgICAgICAgICAgICAgICAgIHwgSCAgICAgICB8IDAsIDEsIDIsIC4uLiwgMjMgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhvICAgICAgfCAwdGgsIDFzdCwgMm5kLCAuLi4sIDIzcmQgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBISCAgICAgIHwgMDAsIDAxLCAwMiwgLi4uLCAyMyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBIb3VyIFswLTExXSAgICAgICAgICAgICAgICAgICAgIHwgSyAgICAgICB8IDEsIDIsIC4uLiwgMTEsIDAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEtvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAxMXRoLCAwdGggICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBLSyAgICAgIHwgMDEsIDAyLCAuLi4sIDExLCAwMCAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBIb3VyIFsxLTI0XSAgICAgICAgICAgICAgICAgICAgIHwgayAgICAgICB8IDI0LCAxLCAyLCAuLi4sIDIzICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGtvICAgICAgfCAyNHRoLCAxc3QsIDJuZCwgLi4uLCAyM3JkICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBrayAgICAgIHwgMjQsIDAxLCAwMiwgLi4uLCAyMyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBNaW51dGUgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbSAgICAgICB8IDAsIDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG1vICAgICAgfCAwdGgsIDFzdCwgLi4uLCA1OXRoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtbSAgICAgIHwgMDAsIDAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBTZWNvbmQgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcyAgICAgICB8IDAsIDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNvICAgICAgfCAwdGgsIDFzdCwgLi4uLCA1OXRoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzcyAgICAgIHwgMDAsIDAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBGcmFjdGlvbiBvZiBzZWNvbmQgICAgICAgICAgICAgIHwgUyAgICAgICB8IDAsIDEsIC4uLiwgOSAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNTICAgICAgfCAwMCwgMDEsIC4uLiwgOTkgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTU1MgICAgIHwgMDAwLCAwMDEsIC4uLiwgOTk5ICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU1NTUyAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMgICAgIHxcbiAqIHwgVGltZXpvbmUgKElTTy04NjAxIHcvIFopICAgICAgICB8IFggICAgICAgfCAtMDgsICswNTMwLCBaICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYWCAgICAgIHwgLTA4MDAsICswNTMwLCBaICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWFhYICAgICB8IC0wODowMCwgKzA1OjMwLCBaICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFhYWFggICAgfCAtMDgwMCwgKzA1MzAsIFosICsxMjM0NTYgICAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYWFhYWCAgIHwgLTA4OjAwLCArMDU6MzAsIFosICsxMjozNDo1NiAgICAgIHwgICAgICAgfFxuICogfCBUaW1lem9uZSAoSVNPLTg2MDEgdy9vIFopICAgICAgIHwgeCAgICAgICB8IC0wOCwgKzA1MzAsICswMCAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHh4ICAgICAgfCAtMDgwMCwgKzA1MzAsICswMDAwICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB4eHggICAgIHwgLTA4OjAwLCArMDU6MzAsICswMDowMCAgICAgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeHh4eCAgICB8IC0wODAwLCArMDUzMCwgKzAwMDAsICsxMjM0NTYgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHh4eHh4ICAgfCAtMDg6MDAsICswNTozMCwgKzAwOjAwLCArMTI6MzQ6NTYgfCAgICAgICB8XG4gKiB8IFRpbWV6b25lIChHTVQpICAgICAgICAgICAgICAgICAgfCBPLi4uT09PIHwgR01ULTgsIEdNVCs1OjMwLCBHTVQrMCAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgT09PTyAgICB8IEdNVC0wODowMCwgR01UKzA1OjMwLCBHTVQrMDA6MDAgICB8IDIgICAgIHxcbiAqIHwgVGltZXpvbmUgKHNwZWNpZmljIG5vbi1sb2NhdC4pICB8IHouLi56enogfCBHTVQtOCwgR01UKzU6MzAsIEdNVCswICAgICAgICAgICAgfCA2ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB6enp6ICAgIHwgR01ULTA4OjAwLCBHTVQrMDU6MzAsIEdNVCswMDowMCAgIHwgMiw2ICAgfFxuICogfCBTZWNvbmRzIHRpbWVzdGFtcCAgICAgICAgICAgICAgIHwgdCAgICAgICB8IDUxMjk2OTUyMCAgICAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHR0ICAgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDcgICB8XG4gKiB8IE1pbGxpc2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICAgfCBUICAgICAgIHwgNTEyOTY5NTIwOTAwICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFQgICAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNyAgIHxcbiAqIHwgTG9uZyBsb2NhbGl6ZWQgZGF0ZSAgICAgICAgICAgICB8IFAgICAgICAgfCAwNC8yOS8xNDUzICAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUCAgICAgIHwgQXByIDI5LCAxNDUzICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFBQICAgICB8IEFwcmlsIDI5dGgsIDE0NTMgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQUFAgICAgfCBGcmlkYXksIEFwcmlsIDI5dGgsIDE0NTMgICAgICAgICAgfCAyLDcgICB8XG4gKiB8IExvbmcgbG9jYWxpemVkIHRpbWUgICAgICAgICAgICAgfCBwICAgICAgIHwgMTI6MDAgQU0gICAgICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcHAgICAgICB8IDEyOjAwOjAwIEFNICAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBwcCAgICAgfCAxMjowMDowMCBBTSBHTVQrMiAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwcHBwICAgIHwgMTI6MDA6MDAgQU0gR01UKzAyOjAwICAgICAgICAgICAgIHwgMiw3ICAgfFxuICogfCBDb21iaW5hdGlvbiBvZiBkYXRlIGFuZCB0aW1lICAgIHwgUHAgICAgICB8IDA0LzI5LzE0NTMsIDEyOjAwIEFNICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQcHAgICAgfCBBcHIgMjksIDE0NTMsIDEyOjAwOjAwIEFNICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUFBwcHAgIHwgQXByaWwgMjl0aCwgMTQ1MyBhdCAuLi4gICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFBQUHBwcHB8IEZyaWRheSwgQXByaWwgMjl0aCwgMTQ1MyBhdCAuLi4gICB8IDIsNyAgIHxcbiAqIE5vdGVzOlxuICogMS4gXCJGb3JtYXR0aW5nXCIgdW5pdHMgKGUuZy4gZm9ybWF0dGluZyBxdWFydGVyKSBpbiB0aGUgZGVmYXVsdCBlbi1VUyBsb2NhbGVcbiAqICAgIGFyZSB0aGUgc2FtZSBhcyBcInN0YW5kLWFsb25lXCIgdW5pdHMsIGJ1dCBhcmUgZGlmZmVyZW50IGluIHNvbWUgbGFuZ3VhZ2VzLlxuICogICAgXCJGb3JtYXR0aW5nXCIgdW5pdHMgYXJlIGRlY2xpbmVkIGFjY29yZGluZyB0byB0aGUgcnVsZXMgb2YgdGhlIGxhbmd1YWdlXG4gKiAgICBpbiB0aGUgY29udGV4dCBvZiBhIGRhdGUuIFwiU3RhbmQtYWxvbmVcIiB1bml0cyBhcmUgYWx3YXlzIG5vbWluYXRpdmUgc2luZ3VsYXI6XG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdkbyBMTExMJywge2xvY2FsZTogY3N9KSAvLz0+ICc2LiBsaXN0b3BhZCdgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdkbyBNTU1NJywge2xvY2FsZTogY3N9KSAvLz0+ICc2LiBsaXN0b3BhZHUnYFxuICpcbiAqIDIuIEFueSBzZXF1ZW5jZSBvZiB0aGUgaWRlbnRpY2FsIGxldHRlcnMgaXMgYSBwYXR0ZXJuLCB1bmxlc3MgaXQgaXMgZXNjYXBlZCBieVxuICogICAgdGhlIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzIChzZWUgYmVsb3cpLlxuICogICAgSWYgdGhlIHNlcXVlbmNlIGlzIGxvbmdlciB0aGFuIGxpc3RlZCBpbiB0YWJsZSAoZS5nLiBgRUVFRUVFRUVFRUVgKVxuICogICAgdGhlIG91dHB1dCB3aWxsIGJlIHRoZSBzYW1lIGFzIGRlZmF1bHQgcGF0dGVybiBmb3IgdGhpcyB1bml0LCB1c3VhbGx5XG4gKiAgICB0aGUgbG9uZ2VzdCBvbmUgKGluIGNhc2Ugb2YgSVNPIHdlZWtkYXlzLCBgRUVFRWApLiBEZWZhdWx0IHBhdHRlcm5zIGZvciB1bml0c1xuICogICAgYXJlIG1hcmtlZCB3aXRoIFwiMlwiIGluIHRoZSBsYXN0IGNvbHVtbiBvZiB0aGUgdGFibGUuXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU0nKSAvLz0+ICdOb3YnYFxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnTU1NTScpIC8vPT4gJ05vdmVtYmVyJ2BcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ01NTU1NJykgLy89PiAnTidgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU1NTU0nKSAvLz0+ICdOb3ZlbWJlcidgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU1NTU1NJykgLy89PiAnTm92ZW1iZXInYFxuICpcbiAqIDMuIFNvbWUgcGF0dGVybnMgY291bGQgYmUgdW5saW1pdGVkIGxlbmd0aCAoc3VjaCBhcyBgeXl5eXl5eXlgKS5cbiAqICAgIFRoZSBvdXRwdXQgd2lsbCBiZSBwYWRkZWQgd2l0aCB6ZXJvcyB0byBtYXRjaCB0aGUgbGVuZ3RoIG9mIHRoZSBwYXR0ZXJuLlxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAneXl5eXl5eXknKSAvLz0+ICcwMDAwMjAxNydgXG4gKlxuICogNC4gYFFRUVFRYCBhbmQgYHFxcXFxYCBjb3VsZCBiZSBub3Qgc3RyaWN0bHkgbnVtZXJpY2FsIGluIHNvbWUgbG9jYWxlcy5cbiAqICAgIFRoZXNlIHRva2VucyByZXByZXNlbnQgdGhlIHNob3J0ZXN0IGZvcm0gb2YgdGhlIHF1YXJ0ZXIuXG4gKlxuICogNS4gVGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIGB5YCBhbmQgYHVgIHBhdHRlcm5zIGFyZSBCLkMuIHllYXJzOlxuICpcbiAqICAgIHwgWWVhciB8IGB5YCB8IGB1YCB8XG4gKiAgICB8LS0tLS0tfC0tLS0tfC0tLS0tfFxuICogICAgfCBBQyAxIHwgICAxIHwgICAxIHxcbiAqICAgIHwgQkMgMSB8ICAgMSB8ICAgMCB8XG4gKiAgICB8IEJDIDIgfCAgIDIgfCAgLTEgfFxuICpcbiAqICAgIEFsc28gYHl5YCBhbHdheXMgcmV0dXJucyB0aGUgbGFzdCB0d28gZGlnaXRzIG9mIGEgeWVhcixcbiAqICAgIHdoaWxlIGB1dWAgcGFkcyBzaW5nbGUgZGlnaXQgeWVhcnMgdG8gMiBjaGFyYWN0ZXJzIGFuZCByZXR1cm5zIG90aGVyIHllYXJzIHVuY2hhbmdlZDpcbiAqXG4gKiAgICB8IFllYXIgfCBgeXlgIHwgYHV1YCB8XG4gKiAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS18XG4gKiAgICB8IDEgICAgfCAgIDAxIHwgICAwMSB8XG4gKiAgICB8IDE0ICAgfCAgIDE0IHwgICAxNCB8XG4gKiAgICB8IDM3NiAgfCAgIDc2IHwgIDM3NiB8XG4gKiAgICB8IDE0NTMgfCAgIDUzIHwgMTQ1MyB8XG4gKlxuICogICAgVGhlIHNhbWUgZGlmZmVyZW5jZSBpcyB0cnVlIGZvciBsb2NhbCBhbmQgSVNPIHdlZWstbnVtYmVyaW5nIHllYXJzIChgWWAgYW5kIGBSYCksXG4gKiAgICBleGNlcHQgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhcnMgYXJlIGRlcGVuZGVudCBvbiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gXG4gKiAgICBhbmQgYG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlYCAoY29tcGFyZSBbZ2V0SVNPV2Vla1llYXJdKGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3MvZ2V0SVNPV2Vla1llYXIpXG4gKiAgICBhbmQgW2dldFdlZWtZZWFyXShodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL2dldFdlZWtZZWFyKSkuXG4gKlxuICogNi4gU3BlY2lmaWMgbm9uLWxvY2F0aW9uIHRpbWV6b25lcyBhcmUgY3VycmVudGx5IHVuYXZhaWxhYmxlIGluIGBkYXRlLWZuc2AsXG4gKiAgICBzbyByaWdodCBub3cgdGhlc2UgdG9rZW5zIGZhbGwgYmFjayB0byBHTVQgdGltZXpvbmVzLlxuICpcbiAqIDcuIFRoZXNlIHBhdHRlcm5zIGFyZSBub3QgaW4gdGhlIFVuaWNvZGUgVGVjaG5pY2FsIFN0YW5kYXJkICMzNTpcbiAqICAgIC0gYGlgOiBJU08gZGF5IG9mIHdlZWtcbiAqICAgIC0gYElgOiBJU08gd2VlayBvZiB5ZWFyXG4gKiAgICAtIGBSYDogSVNPIHdlZWstbnVtYmVyaW5nIHllYXJcbiAqICAgIC0gYHRgOiBzZWNvbmRzIHRpbWVzdGFtcFxuICogICAgLSBgVGA6IG1pbGxpc2Vjb25kcyB0aW1lc3RhbXBcbiAqICAgIC0gYG9gOiBvcmRpbmFsIG51bWJlciBtb2RpZmllclxuICogICAgLSBgUGA6IGxvbmcgbG9jYWxpemVkIGRhdGVcbiAqICAgIC0gYHBgOiBsb25nIGxvY2FsaXplZCB0aW1lXG4gKlxuICogOC4gYFlZYCBhbmQgYFlZWVlgIHRva2VucyByZXByZXNlbnQgd2Vlay1udW1iZXJpbmcgeWVhcnMgYnV0IHRoZXkgYXJlIG9mdGVuIGNvbmZ1c2VkIHdpdGggeWVhcnMuXG4gKiAgICBZb3Ugc2hvdWxkIGVuYWJsZSBgb3B0aW9ucy51c2VBZGRpdGlvbmFsV2Vla1llYXJUb2tlbnNgIHRvIHVzZSB0aGVtLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqXG4gKiA5LiBgRGAgYW5kIGBERGAgdG9rZW5zIHJlcHJlc2VudCBkYXlzIG9mIHRoZSB5ZWFyIGJ1dCB0aGV5IGFyZSBvZnRlbiBjb25mdXNlZCB3aXRoIGRheXMgb2YgdGhlIG1vbnRoLlxuICogICAgWW91IHNob3VsZCBlbmFibGUgYG9wdGlvbnMudXNlQWRkaXRpb25hbERheU9mWWVhclRva2Vuc2AgdG8gdXNlIHRoZW0uIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSBmb3JtYXQgLSBUaGUgc3RyaW5nIG9mIHRva2Vuc1xuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCBkYXRlIHN0cmluZ1xuICpcbiAqIEB0aHJvd3MgYGRhdGVgIG11c3Qgbm90IGJlIEludmFsaWQgRGF0ZVxuICogQHRocm93cyBgb3B0aW9ucy5sb2NhbGVgIG11c3QgY29udGFpbiBgbG9jYWxpemVgIHByb3BlcnR5XG4gKiBAdGhyb3dzIGBvcHRpb25zLmxvY2FsZWAgbXVzdCBjb250YWluIGBmb3JtYXRMb25nYCBwcm9wZXJ0eVxuICogQHRocm93cyB1c2UgYHl5eXlgIGluc3RlYWQgb2YgYFlZWVlgIGZvciBmb3JtYXR0aW5nIHllYXJzIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqIEB0aHJvd3MgdXNlIGB5eWAgaW5zdGVhZCBvZiBgWVlgIGZvciBmb3JtYXR0aW5nIHllYXJzIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqIEB0aHJvd3MgdXNlIGBkYCBpbnN0ZWFkIG9mIGBEYCBmb3IgZm9ybWF0dGluZyBkYXlzIG9mIHRoZSBtb250aCB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKiBAdGhyb3dzIHVzZSBgZGRgIGluc3RlYWQgb2YgYEREYCBmb3IgZm9ybWF0dGluZyBkYXlzIG9mIHRoZSBtb250aCB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKiBAdGhyb3dzIGZvcm1hdCBzdHJpbmcgY29udGFpbnMgYW4gdW5lc2NhcGVkIGxhdGluIGFscGhhYmV0IGNoYXJhY3RlclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBSZXByZXNlbnQgMTEgRmVicnVhcnkgMjAxNCBpbiBtaWRkbGUtZW5kaWFuIGZvcm1hdDpcbiAqIGNvbnN0IHJlc3VsdCA9IGZvcm1hdChuZXcgRGF0ZSgyMDE0LCAxLCAxMSksICdNTS9kZC95eXl5JylcbiAqIC8vPT4gJzAyLzExLzIwMTQnXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFJlcHJlc2VudCAyIEp1bHkgMjAxNCBpbiBFc3BlcmFudG86XG4gKiBpbXBvcnQgeyBlb0xvY2FsZSB9IGZyb20gJ2RhdGUtZm5zL2xvY2FsZS9lbydcbiAqIGNvbnN0IHJlc3VsdCA9IGZvcm1hdChuZXcgRGF0ZSgyMDE0LCA2LCAyKSwgXCJkbyAnZGUnIE1NTU0geXl5eVwiLCB7XG4gKiAgIGxvY2FsZTogZW9Mb2NhbGVcbiAqIH0pXG4gKiAvLz0+ICcyLWEgZGUganVsaW8gMjAxNCdcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRXNjYXBlIHN0cmluZyBieSBzaW5nbGUgcXVvdGUgY2hhcmFjdGVyczpcbiAqIGNvbnN0IHJlc3VsdCA9IGZvcm1hdChuZXcgRGF0ZSgyMDE0LCA2LCAyLCAxNSksIFwiaCAnbycnY2xvY2snXCIpXG4gKiAvLz0+IFwiMyBvJ2Nsb2NrXCJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdChkYXRlLCBmb3JtYXRTdHIsIG9wdGlvbnMpIHtcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSBnZXREZWZhdWx0T3B0aW9ucygpO1xuICBjb25zdCBsb2NhbGUgPSBvcHRpb25zPy5sb2NhbGUgPz8gZGVmYXVsdE9wdGlvbnMubG9jYWxlID8/IGRlZmF1bHRMb2NhbGU7XG5cbiAgY29uc3QgZmlyc3RXZWVrQ29udGFpbnNEYXRlID1cbiAgICBvcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgMTtcblxuICBjb25zdCB3ZWVrU3RhcnRzT24gPVxuICAgIG9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICAwO1xuXG4gIGNvbnN0IG9yaWdpbmFsRGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7XG5cbiAgaWYgKCFpc1ZhbGlkKG9yaWdpbmFsRGF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgdGltZSB2YWx1ZVwiKTtcbiAgfVxuXG4gIGxldCBwYXJ0cyA9IGZvcm1hdFN0clxuICAgIC5tYXRjaChsb25nRm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cClcbiAgICAubWFwKChzdWJzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gc3Vic3RyaW5nWzBdO1xuICAgICAgaWYgKGZpcnN0Q2hhcmFjdGVyID09PSBcInBcIiB8fCBmaXJzdENoYXJhY3RlciA9PT0gXCJQXCIpIHtcbiAgICAgICAgY29uc3QgbG9uZ0Zvcm1hdHRlciA9IGxvbmdGb3JtYXR0ZXJzW2ZpcnN0Q2hhcmFjdGVyXTtcbiAgICAgICAgcmV0dXJuIGxvbmdGb3JtYXR0ZXIoc3Vic3RyaW5nLCBsb2NhbGUuZm9ybWF0TG9uZyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3Vic3RyaW5nO1xuICAgIH0pXG4gICAgLmpvaW4oXCJcIilcbiAgICAubWF0Y2goZm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cClcbiAgICAubWFwKChzdWJzdHJpbmcpID0+IHtcbiAgICAgIC8vIFJlcGxhY2UgdHdvIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzIHdpdGggb25lIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJcbiAgICAgIGlmIChzdWJzdHJpbmcgPT09IFwiJydcIikge1xuICAgICAgICByZXR1cm4geyBpc1Rva2VuOiBmYWxzZSwgdmFsdWU6IFwiJ1wiIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gc3Vic3RyaW5nWzBdO1xuICAgICAgaWYgKGZpcnN0Q2hhcmFjdGVyID09PSBcIidcIikge1xuICAgICAgICByZXR1cm4geyBpc1Rva2VuOiBmYWxzZSwgdmFsdWU6IGNsZWFuRXNjYXBlZFN0cmluZyhzdWJzdHJpbmcpIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3JtYXR0ZXJzW2ZpcnN0Q2hhcmFjdGVyXSkge1xuICAgICAgICByZXR1cm4geyBpc1Rva2VuOiB0cnVlLCB2YWx1ZTogc3Vic3RyaW5nIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChmaXJzdENoYXJhY3Rlci5tYXRjaCh1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXG4gICAgICAgICAgXCJGb3JtYXQgc3RyaW5nIGNvbnRhaW5zIGFuIHVuZXNjYXBlZCBsYXRpbiBhbHBoYWJldCBjaGFyYWN0ZXIgYFwiICtcbiAgICAgICAgICAgIGZpcnN0Q2hhcmFjdGVyICtcbiAgICAgICAgICAgIFwiYFwiLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geyBpc1Rva2VuOiBmYWxzZSwgdmFsdWU6IHN1YnN0cmluZyB9O1xuICAgIH0pO1xuXG4gIC8vIGludm9rZSBsb2NhbGl6ZSBwcmVwcm9jZXNzb3IgKG9ubHkgZm9yIGZyZW5jaCBsb2NhbGVzIGF0IHRoZSBtb21lbnQpXG4gIGlmIChsb2NhbGUubG9jYWxpemUucHJlcHJvY2Vzc29yKSB7XG4gICAgcGFydHMgPSBsb2NhbGUubG9jYWxpemUucHJlcHJvY2Vzc29yKG9yaWdpbmFsRGF0ZSwgcGFydHMpO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0dGVyT3B0aW9ucyA9IHtcbiAgICBmaXJzdFdlZWtDb250YWluc0RhdGUsXG4gICAgd2Vla1N0YXJ0c09uLFxuICAgIGxvY2FsZSxcbiAgfTtcblxuICByZXR1cm4gcGFydHNcbiAgICAubWFwKChwYXJ0KSA9PiB7XG4gICAgICBpZiAoIXBhcnQuaXNUb2tlbikgcmV0dXJuIHBhcnQudmFsdWU7XG5cbiAgICAgIGNvbnN0IHRva2VuID0gcGFydC52YWx1ZTtcblxuICAgICAgaWYgKFxuICAgICAgICAoIW9wdGlvbnM/LnVzZUFkZGl0aW9uYWxXZWVrWWVhclRva2VucyAmJlxuICAgICAgICAgIGlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbih0b2tlbikpIHx8XG4gICAgICAgICghb3B0aW9ucz8udXNlQWRkaXRpb25hbERheU9mWWVhclRva2VucyAmJlxuICAgICAgICAgIGlzUHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW4odG9rZW4pKVxuICAgICAgKSB7XG4gICAgICAgIHdhcm5PclRocm93UHJvdGVjdGVkRXJyb3IodG9rZW4sIGZvcm1hdFN0ciwgU3RyaW5nKGRhdGUpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0dGVyID0gZm9ybWF0dGVyc1t0b2tlblswXV07XG4gICAgICByZXR1cm4gZm9ybWF0dGVyKG9yaWdpbmFsRGF0ZSwgdG9rZW4sIGxvY2FsZS5sb2NhbGl6ZSwgZm9ybWF0dGVyT3B0aW9ucyk7XG4gICAgfSlcbiAgICAuam9pbihcIlwiKTtcbn1cblxuZnVuY3Rpb24gY2xlYW5Fc2NhcGVkU3RyaW5nKGlucHV0KSB7XG4gIGNvbnN0IG1hdGNoZWQgPSBpbnB1dC5tYXRjaChlc2NhcGVkU3RyaW5nUmVnRXhwKTtcblxuICBpZiAoIW1hdGNoZWQpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cblxuICByZXR1cm4gbWF0Y2hlZFsxXS5yZXBsYWNlKGRvdWJsZVF1b3RlUmVnRXhwLCBcIidcIik7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgZm9ybWF0O1xuIiwKICAgICJpbXBvcnQgdHlwZSB7IExvZywgTWlsa2lvSW5pdCwgTWlsa2lvUnVudGltZUluaXQgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcclxuXHJcbmludGVyZmFjZSBDb29rYm9va0V2ZW50IHtcclxuICB0eXBlOiBcIm1pbGtpb0Bsb2dnZXJcIjtcclxuICBsb2c6IExvZztcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbmRDb29rYm9va0V2ZW50KHJ1bnRpbWU6IE1pbGtpb1J1bnRpbWVJbml0PE1pbGtpb0luaXQ+LCBldmVudDogQ29va2Jvb2tFdmVudCkge1xyXG4gIC8vIHRyeSB7XHJcbiAgLy8gICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGBodHRwOi8vbG9jYWxob3N0OiR7cnVudGltZS5jb29rYm9vay5jb29rYm9va1BvcnR9LyRhY3Rpb25gLCB7XHJcbiAgLy8gICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgLy8gICAgIGhlYWRlcnM6IHtcclxuICAvLyAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAvLyAgICAgfSxcclxuICAvLyAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZXZlbnQpLFxyXG4gIC8vICAgfSk7XHJcbiAgLy8gICBpZiAoIXJlc3BvbnNlLm9rKSB7XHJcbiAgLy8gICAgIGNvbnNvbGUubG9nKFwiW0NPT0tCT09LXVwiLCBhd2FpdCByZXNwb25zZS50ZXh0KCkpO1xyXG4gIC8vICAgICBjb25zb2xlLmxvZyhcIltDT09LQk9PS11cIiwgXCJJcyBDb29rYm9vayBjbG9zZWQ/IFRoZXJlIGlzIGFuIGFibm9ybWFsaXR5IGluIHRoZSBjb21tdW5pY2F0aW9uIHdpdGggQ29va2Jvb2suXCIpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgLy8gICBjb25zb2xlLmxvZyhcIltDT09LQk9PS11cIiwgZXJyb3IpO1xyXG4gIC8vICAgY29uc29sZS5sb2coXCJbQ09PS0JPT0tdXCIsIFwiSXMgQ29va2Jvb2sgY2xvc2VkPyBUaGVyZSBpcyBhbiBhYm5vcm1hbGl0eSBpbiB0aGUgY29tbXVuaWNhdGlvbiB3aXRoIENvb2tib29rLlwiKTtcclxuICAvLyB9XHJcbn1cclxuIiwKICAgICJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tIFwiZGF0ZS1mbnNcIjtcclxuaW1wb3J0IHR5cGUgeyAkY29udGV4dCwgTWlsa2lvSW5pdCwgTWlsa2lvUnVudGltZUluaXQgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcclxuaW1wb3J0IHsgc2VuZENvb2tib29rRXZlbnQgfSBmcm9tIFwiLi4vdXRpbHMvc2VuZC1jb29rYm9vay1ldmVudC50c1wiO1xyXG5cclxuZXhwb3J0IHR5cGUgTG9nID0gW1wiKGRlYnVnKVwiIHwgXCIoaW5mbylcIiB8IFwiKHdhcm4pXCIgfCBcIihlcnJvcilcIiB8IFwiKHJlcXVlc3QpXCIgfCBcIihyZXNwb25zZSlcIiwgc3RyaW5nIC8qIGV4ZWN1dGVJZCAqLywgc3RyaW5nLCBzdHJpbmcsIHN0cmluZywgLi4uQXJyYXk8dW5rbm93bj5dO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBMb2dnZXIge1xyXG4gICAgXzoge1xyXG4gICAgICAgIGxvZ3M6IEFycmF5PExvZz47XHJcbiAgICAgICAgdGFnczogTWFwPHN0cmluZywgdW5rbm93bj47XHJcbiAgICAgICAgc3VibWl0OiAoY29udGV4dDogJGNvbnRleHQpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xyXG4gICAgfTtcclxuICAgIHNldFRhZzogKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikgPT4gdm9pZDtcclxuICAgIHNldExvZzogKC4uLmxvZzogTG9nKSA9PiB2b2lkO1xyXG4gICAgZGVidWc6IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBMb2c7XHJcbiAgICBpbmZvOiAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gTG9nO1xyXG4gICAgd2FybjogKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IExvZztcclxuICAgIGVycm9yOiAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gTG9nO1xyXG4gICAgcmVxdWVzdDogKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IExvZztcclxuICAgIHJlc3BvbnNlOiAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gTG9nO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBMb2dnZXJJbnNlcnRpbmdIYW5kbGVyID0gKGxvZzogTG9nKSA9PiBib29sZWFuO1xyXG5cclxuZXhwb3J0IHR5cGUgTG9nZ2VyU3VibWl0dGluZ0hhbmRsZXIgPSAoY29udGV4dDogJGNvbnRleHQsIGxvZ3M6IEFycmF5PExvZz4sIHRhZ3M6IE1hcDxzdHJpbmcsIHVua25vd24+KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMb2dnZXI8TWlsa2lvUnVudGltZSBleHRlbmRzIE1pbGtpb1J1bnRpbWVJbml0PE1pbGtpb1J1bnRpbWVJbml0PE1pbGtpb0luaXQ+PiA9IE1pbGtpb1J1bnRpbWVJbml0PE1pbGtpb0luaXQ+PihydW50aW1lOiBNaWxraW9SdW50aW1lLCBwYXRoOiBzdHJpbmcsIGV4ZWN1dGVJZDogc3RyaW5nKTogTG9nZ2VyIHtcclxuICAgIGNvbnN0IGxvZ2dlciA9IHt9IGFzIExvZ2dlcjtcclxuXHJcbiAgICBsb2dnZXIuXyA9IHtcclxuICAgICAgICBsb2dzOiBbXSxcclxuICAgICAgICB0YWdzOiBuZXcgTWFwKCksXHJcbiAgICAgICAgc3VibWl0OiAoY29udGV4dDogJGNvbnRleHQpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFydW50aW1lLm9uTG9nZ2VyU3VibWl0dGluZykgcmV0dXJuO1xyXG4gICAgICAgICAgICByZXR1cm4gcnVudGltZS5vbkxvZ2dlclN1Ym1pdHRpbmcoY29udGV4dCwgbG9nZ2VyLl8ubG9ncywgbG9nZ2VyLl8udGFncyk7XHJcbiAgICAgICAgfSxcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgX190YWdQdXNoID0gKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQgPT4ge1xyXG4gICAgICAgIGxvZ2dlci5fLnRhZ3Muc2V0KGtleSwgdmFsdWUpO1xyXG4gICAgfTtcclxuICAgIGNvbnN0IF9fbG9nUHVzaCA9IChsb2c6IExvZyk6IExvZyA9PiB7XHJcbiAgICAgICAgY29uc3QgaW5zZXJ0aW5nID0gcnVudGltZS5vbkxvZ2dlckluc2VydGluZ1xyXG4gICAgICAgICAgICA/IHJ1bnRpbWUub25Mb2dnZXJJbnNlcnRpbmdcclxuICAgICAgICAgICAgOiAobG9nOiBMb2cpID0+IHtcclxuICAgICAgICAgICAgICAgIGxvZyA9IFsuLi5sb2ddO1xyXG4gICAgICAgICAgICAgICAgbG9nWzBdID0gYFxcbiR7bG9nWzBdfWAgYXMgYW55O1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coLi4ubG9nKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAoIWluc2VydGluZyhsb2cpKSByZXR1cm4gbG9nO1xyXG5cclxuICAgICAgICBsb2dnZXIuXy5sb2dzLnB1c2goWy4uLmxvZ10pO1xyXG5cclxuICAgICAgICBpZiAocnVudGltZS5kZXZlbG9wKSB7XHJcbiAgICAgICAgICAgIHZvaWQgc2VuZENvb2tib29rRXZlbnQocnVudGltZSwge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogXCJtaWxraW9AbG9nZ2VyXCIsXHJcbiAgICAgICAgICAgICAgICBsb2csXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGxvZztcclxuICAgIH07XHJcblxyXG4gICAgbG9nZ2VyLnNldFRhZyA9IChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pID0+IF9fdGFnUHVzaChrZXksIHZhbHVlKTtcclxuICAgIGxvZ2dlci5zZXRMb2cgPSAoLi4ubG9nOiBMb2cpID0+IF9fbG9nUHVzaChsb2cpO1xyXG5cclxuICAgIGNvbnN0IGdldE5vdyA9ICgpID0+IGAke2Zvcm1hdChuZXcgRGF0ZSgpLCBcIih5eXl5LU1NLWRkIGhoOm1tOnNzKVwiKX1gO1xyXG5cclxuICAgIGxvZ2dlci5kZWJ1ZyA9IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBfX2xvZ1B1c2goW1wiKGRlYnVnKVwiLCBwYXRoLCBleGVjdXRlSWQsIGdldE5vdygpLCBgXFxuJHtkZXNjcmlwdGlvbn1gLCAuLi5wYXJhbXNdKTtcclxuICAgIGxvZ2dlci5pbmZvID0gKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IF9fbG9nUHVzaChbXCIoaW5mbylcIiwgcGF0aCwgZXhlY3V0ZUlkLCBnZXROb3coKSwgYFxcbiR7ZGVzY3JpcHRpb259YCwgLi4ucGFyYW1zXSk7XHJcbiAgICBsb2dnZXIud2FybiA9IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBfX2xvZ1B1c2goW1wiKHdhcm4pXCIsIHBhdGgsIGV4ZWN1dGVJZCwgZ2V0Tm93KCksIGBcXG4ke2Rlc2NyaXB0aW9ufWAsIC4uLnBhcmFtc10pO1xyXG4gICAgbG9nZ2VyLmVycm9yID0gKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IF9fbG9nUHVzaChbXCIoZXJyb3IpXCIsIHBhdGgsIGV4ZWN1dGVJZCwgZ2V0Tm93KCksIGBcXG4ke2Rlc2NyaXB0aW9ufWAsIC4uLnBhcmFtc10pO1xyXG4gICAgbG9nZ2VyLnJlcXVlc3QgPSAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gX19sb2dQdXNoKFtcIihyZXF1ZXN0KVwiLCBwYXRoLCBleGVjdXRlSWQsIGdldE5vdygpLCBgXFxuJHtkZXNjcmlwdGlvbn1gLCAuLi5wYXJhbXNdKTtcclxuICAgIGxvZ2dlci5yZXNwb25zZSA9IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBfX2xvZ1B1c2goW1wiKHJlc3BvbnNlKVwiLCBwYXRoLCBleGVjdXRlSWQsIGdldE5vdygpLCBgXFxuJHtkZXNjcmlwdGlvbn1gLCAuLi5wYXJhbXNdKTtcclxuXHJcbiAgICByZXR1cm4gbG9nZ2VyO1xyXG59XHJcbiIsCiAgICAiZXhwb3J0IGludGVyZmFjZSBTdGVwczxTdGFnZVQgZXh0ZW5kcyBSZWNvcmQ8YW55LCBhbnk+PiB7XHJcbiAgc3RlcDogU3RlcEZ1bmN0aW9uPFN0YWdlVD47XHJcbiAgcnVuOiAoKSA9PiBQcm9taXNlPFJlbW92ZV88U3RhZ2VUPj47XHJcbn1cclxuXHJcbnR5cGUgUmVtb3ZlXzxUPiA9IHtcclxuICBbSyBpbiBrZXlvZiBUIGFzIEsgZXh0ZW5kcyBgXyR7c3RyaW5nfWAgPyBuZXZlciA6IEtdOiBUW0tdO1xyXG59O1xyXG5cclxudHlwZSBUb0VtcHR5T2JqZWN0PFQ+ID0gVCBleHRlbmRzIHVuZGVmaW5lZCB8IG51bGwgfCBuZXZlciA/IHt9IDogVCBleHRlbmRzIG9iamVjdCA/IFQgOiB7fTtcclxuXHJcbmV4cG9ydCB0eXBlIFN0ZXBGdW5jdGlvbjxTdGFnZVQgZXh0ZW5kcyBSZWNvcmQ8YW55LCBhbnk+PiA9IDxIYW5kbGVyVCBleHRlbmRzIChzdGFnZTogUmVhZG9ubHk8U3RhZ2VUPikgPT4gUmVjb3JkPGFueSwgYW55PiB8IFByb21pc2U8UmVjb3JkPGFueSwgYW55Pj4+KGhhbmRsZXI6IEhhbmRsZXJUKSA9PiBTdGVwczxBd2FpdGVkPFN0YWdlVD4gJiBUb0VtcHR5T2JqZWN0PEF3YWl0ZWQ8UmV0dXJuVHlwZTxIYW5kbGVyVD4+Pj47XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3RlcCgpOiBTdGVwczx7fT4ge1xyXG4gIGNvbnN0IHN0ZXBDb250cm9sbGVyID0ge1xyXG4gICAgJG1pbGtpb1R5cGU6IFwic3RlcFwiLFxyXG4gICAgX3N0ZXBzOiBbXSBhcyBBcnJheTwoc3RhZ2U6IGFueSkgPT4gUHJvbWlzZTxhbnk+PixcclxuICAgIHN0ZXAoaGFuZGxlcjogKHN0YWdlOiBhbnkpID0+IFByb21pc2U8YW55Pikge1xyXG4gICAgICBzdGVwQ29udHJvbGxlci5fc3RlcHMucHVzaChoYW5kbGVyKTtcclxuICAgICAgcmV0dXJuIHN0ZXBDb250cm9sbGVyO1xyXG4gICAgfSxcclxuICAgIGFzeW5jIHJ1bigpIHtcclxuICAgICAgbGV0IHN0YWdlID0ge307XHJcbiAgICAgIGZvciAoY29uc3Qgc3RlcCBvZiBzdGVwQ29udHJvbGxlci5fc3RlcHMpIHtcclxuICAgICAgICBzdGFnZSA9IHsgLi4uc3RhZ2UsIC4uLihhd2FpdCBzdGVwKHN0YWdlKSkgfTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxhbnksIGFueT4gPSB7fTtcclxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gc3RhZ2UpIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IChzdGFnZSBhcyBhbnkpW2tleV07XHJcbiAgICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChcIl9cIikpIHJlc3VsdFtrZXldID0gdmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH0sXHJcbiAgfTtcclxuICByZXR1cm4gc3RlcENvbnRyb2xsZXIgYXMgYW55IGFzIFN0ZXBzPHt9PjtcclxufVxyXG4iLAogICAgImV4cG9ydCBjbGFzcyBUcmllPFQ+IHtcclxuICBwcml2YXRlIHJvb3Q6IFRyaWVOb2RlPFQ+O1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMucm9vdCA9IG5ldyBUcmllTm9kZSgpO1xyXG4gIH1cclxuXHJcbiAgYWRkKHBhdGg6IHN0cmluZywgdmFsdWU6IFQpOiB2b2lkIHtcclxuICAgIGNvbnN0IHBhcnRzID0gcGF0aFxyXG4gICAgICAucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIilcclxuICAgICAgLnNwbGl0KFwiL1wiKVxyXG4gICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBcIlwiKTtcclxuICAgIGxldCBjdXJyZW50Tm9kZSA9IHRoaXMucm9vdDtcclxuICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgY3VycmVudE5vZGUudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XHJcbiAgICAgIGlmICghY3VycmVudE5vZGUuY2hpbGRyZW4uaGFzKHBhcnQpKSB7XHJcbiAgICAgICAgY3VycmVudE5vZGUuY2hpbGRyZW4uc2V0KHBhcnQsIG5ldyBUcmllTm9kZSgpKTtcclxuICAgICAgfVxyXG4gICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmNoaWxkcmVuLmdldChwYXJ0KSE7XHJcbiAgICB9XHJcbiAgICBjdXJyZW50Tm9kZS52YWx1ZSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0KHBhdGg6IHN0cmluZyk6IFQgfCBudWxsIHtcclxuICAgIGNvbnN0IHBhcnRzID0gcGF0aFxyXG4gICAgICAucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIilcclxuICAgICAgLnNwbGl0KFwiL1wiKVxyXG4gICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBcIlwiKTtcclxuICAgIGxldCBjdXJyZW50Tm9kZSA9IHRoaXMucm9vdDtcclxuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xyXG4gICAgICBpZiAoIWN1cnJlbnROb2RlLmNoaWxkcmVuLmhhcyhwYXJ0KSkgcmV0dXJuIG51bGw7XHJcbiAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuY2hpbGRyZW4uZ2V0KHBhcnQpITtcclxuICAgIH1cclxuICAgIHJldHVybiBjdXJyZW50Tm9kZS52YWx1ZTtcclxuICB9XHJcblxyXG4gIGhhcyhwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHBhcnRzID0gcGF0aFxyXG4gICAgICAucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIilcclxuICAgICAgLnNwbGl0KFwiL1wiKVxyXG4gICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBcIlwiKTtcclxuICAgIGxldCBjdXJyZW50Tm9kZSA9IHRoaXMucm9vdDtcclxuICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHJldHVybiBjdXJyZW50Tm9kZS52YWx1ZSAhPT0gbnVsbDtcclxuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xyXG4gICAgICBpZiAoIWN1cnJlbnROb2RlLmNoaWxkcmVuLmhhcyhwYXJ0KSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBlbHNlIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuY2hpbGRyZW4uZ2V0KHBhcnQpITtcclxuICAgIH1cclxuICAgIHJldHVybiBjdXJyZW50Tm9kZS52YWx1ZSAhPT0gbnVsbDtcclxuICB9XHJcbn1cclxuXHJcbmNsYXNzIFRyaWVOb2RlPFQ+IHtcclxuICBjaGlsZHJlbjogTWFwPHN0cmluZywgVHJpZU5vZGU8VD4+O1xyXG4gIHZhbHVlOiBUIHwgbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLmNoaWxkcmVuID0gbmV3IE1hcCgpO1xyXG4gICAgdGhpcy52YWx1ZSA9IG51bGw7XHJcbiAgfVxyXG59XHJcbiIsCiAgICAiaW1wb3J0IHsgY3JlYXRlTG9nZ2VyLCBleGNlcHRpb25IYW5kbGVyLCByZWplY3QgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcclxuaW1wb3J0IHR5cGUgeyBNaXhpbiwgR2VuZXJhdGVkSW5pdCwgJHR5cGVzLCBDb250ZXh0SHR0cCwgTWlsa2lvUmVzcG9uc2VSZWplY3QsIFJlc3VsdHMsIE1pbGtpb1Jlc3BvbnNlU3VjY2VzcyB9IGZyb20gXCIuLi9pbmRleC50c1wiO1xyXG5pbXBvcnQgdHlwZSB7IF9faW5pdEV4ZWN1dGVyIH0gZnJvbSBcIi4uL2V4ZWN1dGUvaW5kZXgudHNcIjtcclxuaW1wb3J0IHsgX19jcmVhdGVJZCB9IGZyb20gXCIuLi91dGlscy9jcmVhdGUtaWQudHNcIjtcclxuaW1wb3J0IHsgVHJpZSB9IGZyb20gXCIuLi91dGlscy90cmllLnRzXCI7XHJcblxyXG5leHBvcnQgdHlwZSBNaWxraW9IdHRwUmVxdWVzdCA9IFJlcXVlc3Q7XHJcblxyXG5leHBvcnQgdHlwZSBNaWxraW9IdHRwUmVzcG9uc2UgPSBNaXhpbjxcclxuICAgIFJlc3BvbnNlSW5pdCxcclxuICAgIHtcclxuICAgICAgICAvLyBib2R5OiBzdHJpbmcgfCBCbG9iIHwgRm9ybURhdGEgfCBVUkxTZWFyY2hQYXJhbXMgfCBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PjtcclxuICAgICAgICBib2R5OiBhbnk7XHJcbiAgICAgICAgc3RhdHVzOiBudW1iZXI7XHJcbiAgICAgICAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcclxuICAgIH1cclxuPjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2luaXRMaXN0ZW5lcihnZW5lcmF0ZWQ6IEdlbmVyYXRlZEluaXQsIHJ1bnRpbWU6IGFueSwgZXhlY3V0ZXI6IFJldHVyblR5cGU8dHlwZW9mIF9faW5pdEV4ZWN1dGVyPikge1xyXG4gICAgY29uc3QgcG9ydCA9IHJ1bnRpbWUucG9ydDtcclxuICAgIGNvbnN0IHRyaWUgPSBuZXcgVHJpZTxhbnk+KCk7XHJcbiAgICBjb25zdCBmZXRjaCA9IGFzeW5jIChvcHRpb25zOiB7XHJcbiAgICAgICAgcmVxdWVzdDogTWlsa2lvSHR0cFJlcXVlc3Q7XHJcbiAgICAgICAgZW52TW9kZT86IHN0cmluZztcclxuICAgICAgICBlbnY/OiBSZWNvcmQ8YW55LCBhbnk+O1xyXG4gICAgICAgIHJvdXRlU2NoZW1hPzogYW55O1xyXG4gICAgfSk6IFByb21pc2U8UmVzcG9uc2U+ID0+IHtcclxuICAgICAgICBpZiAob3B0aW9ucy5yZXF1ZXN0Lm1ldGhvZCA9PT0gXCJPUFRJT05TXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSh1bmRlZmluZWQsIHtcclxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgICAgICBcIkFjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHNcIjogcnVudGltZS5jb3JzPy5jb3JzQWxsb3dNZXRob2RzID8/IFwiKlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luXCI6IHJ1bnRpbWUuY29ycz8uY29yc0FsbG93T3JpZ2luID8/IFwiKlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVyc1wiOiBydW50aW1lLmNvcnM/LmNvcnNBbGxvd0hlYWRlcnMgPz8gXCIqXCIsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25zLnJlcXVlc3QudXJsLmVuZHNXaXRoKFwiL2dlbmVyYXRlXzIwNFwiKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKG51bGwsIHtcclxuICAgICAgICAgICAgICAgIHN0YXR1czogMjA0LFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgICAgIFNlcnZlcjogXCJtaWxraW9cIixcclxuICAgICAgICAgICAgICAgICAgICBcIkFjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHNcIjogcnVudGltZS5jb3JzPy5jb3JzQWxsb3dNZXRob2RzID8/IFwiKlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luXCI6IHJ1bnRpbWUuY29ycz8uY29yc0FsbG93T3JpZ2luID8/IFwiKlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVyc1wiOiBydW50aW1lLmNvcnM/LmNvcnNBbGxvd0hlYWRlcnMgPz8gXCIqXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJDYWNoZS1Db250cm9sXCI6IFwibm8tc3RvcmVcIixcclxuICAgICAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBgdGV4dC9wbGFpbjsgdGltZT0ke0RhdGUubm93KCl9YCxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChvcHRpb25zLnJlcXVlc3QudXJsKTtcclxuICAgICAgICBsZXQgcGF0aEFycmF5ID0gdXJsLnBhdGhuYW1lLnN1YnN0cmluZygxKS5zcGxpdChcIi9cIik7XHJcbiAgICAgICAgaWYgKHJ1bnRpbWUuYWNjZXNzS2V5ICYmIHBhdGhBcnJheS5hdCgwKSAhPT0gcnVudGltZS5hY2Nlc3NLZXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSh1bmRlZmluZWQsIHtcclxuICAgICAgICAgICAgICAgIHN0YXR1czogNDAzLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgICAgIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kc1wiOiBydW50aW1lLmNvcnM/LmNvcnNBbGxvd01ldGhvZHMgPz8gXCIqXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW5cIjogcnVudGltZS5jb3JzPy5jb3JzQWxsb3dPcmlnaW4gPz8gXCIqXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzXCI6IHJ1bnRpbWUuY29ycz8uY29yc0FsbG93SGVhZGVycyA/PyBcIipcIixcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocnVudGltZS5pZ25vcmVQYXRoTGV2ZWwgIT09IHVuZGVmaW5lZCAmJiBydW50aW1lLmlnbm9yZVBhdGhMZXZlbCAhPT0gMCkgcGF0aEFycmF5ID0gcGF0aEFycmF5LnNsaWNlKHJ1bnRpbWUuaWdub3JlUGF0aExldmVsKTtcclxuICAgICAgICBjb25zdCBwYXRoU3RyaW5nID0gYC8ke3BhdGhBcnJheS5qb2luKFwiL1wiKX1gO1xyXG5cclxuICAgICAgICBjb25zdCBleGVjdXRlSWQgPSBydW50aW1lPy5leGVjdXRlSWQgPyBhd2FpdCBydW50aW1lLmV4ZWN1dGVJZChvcHRpb25zLnJlcXVlc3QuaGVhZGVycykgOiBfX2NyZWF0ZUlkKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcihydW50aW1lLCBwYXRoU3RyaW5nLCBleGVjdXRlSWQpO1xyXG4gICAgICAgIHJ1bnRpbWUucnVudGltZS5yZXF1ZXN0LnNldChleGVjdXRlSWQsIHsgbG9nZ2VyIH0pO1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlOiBNaWxraW9IdHRwUmVzcG9uc2UgPSB7XHJcbiAgICAgICAgICAgIGJvZHk6IFwiXCIsXHJcbiAgICAgICAgICAgIHN0YXR1czogMjAwLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICAgICBcIkFjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHNcIjogcnVudGltZS5jb3JzPy5jb3JzQWxsb3dNZXRob2RzID8/IFwiKlwiLFxyXG4gICAgICAgICAgICAgICAgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW5cIjogcnVudGltZS5jb3JzPy5jb3JzQWxsb3dPcmlnaW4gPz8gXCIqXCIsXHJcbiAgICAgICAgICAgICAgICBcIkFjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnNcIjogcnVudGltZS5jb3JzPy5jb3JzQWxsb3dIZWFkZXJzID8/IFwiKlwiLFxyXG4gICAgICAgICAgICAgICAgXCJDYWNoZS1Db250cm9sXCI6IFwibm8tc3RvcmVcIixcclxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGxldCBmaW5hbGVzOiBBcnJheTwoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPj4gPSBbXTtcclxuXHJcblxyXG4gICAgICAgIGNvbnN0IGh0dHAgPSAoYXdhaXQgKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaXAgPSBydW50aW1lLnJlYWxJcCA/IHJ1bnRpbWUucmVhbElwKG9wdGlvbnMucmVxdWVzdC5oZWFkZXJzKSA6IFwiOjoxXCI7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgICAgICAgICAgIHN0cmluZzogYXdhaXQgb3B0aW9ucy5yZXF1ZXN0LnRleHQoKSxcclxuICAgICAgICAgICAgICAgIHBhcnNlZDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHVybCxcclxuICAgICAgICAgICAgICAgIGlwLFxyXG4gICAgICAgICAgICAgICAgcGF0aDogeyBzdHJpbmc6IHBhdGhTdHJpbmcgYXMga2V5b2YgJHR5cGVzW1wiZ2VuZXJhdGVkXCJdW1wicm91dGVTY2hlbWFcIl0sIGFycmF5OiBwYXRoQXJyYXkgfSxcclxuICAgICAgICAgICAgICAgIHBhcmFtcyxcclxuICAgICAgICAgICAgICAgIHJlcXVlc3Q6IG9wdGlvbnMucmVxdWVzdCxcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLFxyXG4gICAgICAgICAgICB9IGFzIENvbnRleHRIdHRwO1xyXG4gICAgICAgIH0pKCkpITtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGV4dDogYW55ID0geyByZWplY3QgfTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86aHR0cFJlcXVlc3RcIiwgeyBleGVjdXRlSWQsIGxvZ2dlciwgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIGh0dHAsIHJlamVjdCB9KTtcclxuXHJcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMuZ2V0KFwiQWNjZXB0XCIpPy5zdGFydHNXaXRoKFwidGV4dC9ldmVudC1zdHJlYW1cIikpIHtcclxuICAgICAgICAgICAgICAgIC8vIGFjdGlvblxyXG4gICAgICAgICAgICAgICAgbGV0IHJvdXRlU2NoZW1hID0gb3B0aW9ucy5yb3V0ZVNjaGVtYTtcclxuICAgICAgICAgICAgICAgIGlmICghcm91dGVTY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgICAgICByb3V0ZVNjaGVtYSA9IHRyaWUuZ2V0KGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVTY2hlbWEgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVTY2hlbWEgPSBnZW5lcmF0ZWQucm91dGVTY2hlbWE/LltodHRwLnBhdGguc3RyaW5nXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlU2NoZW1hID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpodHRwTm90Rm91bmRcIiwgeyBleGVjdXRlSWQsIGxvZ2dlciwgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIGh0dHAsIHJlamVjdCB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHJlamVjdChcIk5PVF9GT1VORFwiLCB7IHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygcm91dGVTY2hlbWEubW9kdWxlICE9PSBcImZ1bmN0aW9uXCIpIHJvdXRlU2NoZW1hLm1vZHVsZSA9IGF3YWl0IHJvdXRlU2NoZW1hLm1vZHVsZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSByb3V0ZVNjaGVtYS5tb2R1bGUgPSBhd2FpdCByb3V0ZVNjaGVtYS5tb2R1bGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZS5hZGQoaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIHJvdXRlU2NoZW1hKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYS50eXBlICE9PSBcImFjdGlvblwiKSB0aHJvdyByZWplY3QoXCJVTkFDQ0VQVEFCTEVcIiwgeyBleHBlY3RlZDogXCJzdHJlYW1cIiwgbWVzc2FnZTogYE5vdCBhY2NlcHRhYmxlLCB0aGUgQWNjZXB0IGluIHRoZSByZXF1ZXN0IGhlYWRlciBzaG91bGQgYmUgXCJ0ZXh0L2V2ZW50LXN0cmVhbVwiLiBJZiB5b3UgYXJlIHVzaW5nIHRoZSBcIkBtaWxraW8vc3RhcmdhdGVcIiBwYWNrYWdlLCBwbGVhc2UgYWRkIFxcYHR5cGU6IFwic3RyZWFtXCJcXGAgdG8gdGhlIGV4ZWN1dGUgb3B0aW9ucy5gIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnRleHQuaHR0cCA9IGh0dHA7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmhlYWRlcnMgPSBodHRwLnJlcXVlc3QuaGVhZGVycztcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBleGVjdXRlZCA9IGF3YWl0IGV4ZWN1dGVyLl9fZXhlY3V0ZShyb3V0ZVNjaGVtYSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRFeGVjdXRlSWQ6IGV4ZWN1dGVJZCxcclxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkTG9nZ2VyOiBsb2dnZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogb3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMgYXMgSGVhZGVycyxcclxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtczogaHR0cC5wYXJhbXMuc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtc1R5cGU6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGZpbmFsZXMgPSBleGVjdXRlZC5maW5hbGVzO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5ib2R5ID09PSBcIlwiICYmIGV4ZWN1dGVkLnJlc3VsdHMudmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChleGVjdXRlZC5lbXB0eVJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5ib2R5ID0gYHtcImRhdGFcIjp7fSxcImV4ZWN1dGVJZFwiOlwiJHtleGVjdXRlSWR9XCIsXCJzdWNjZXNzXCI6dHJ1ZX1gO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhlY3V0ZWQucmVzdWx0c1R5cGVTYWZldHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuYm9keSA9IGB7XCJkYXRhXCI6JHtyb3V0ZVNjaGVtYS5yZXN1bHRzVG9KU09OKGV4ZWN1dGVkLnJlc3VsdHMudmFsdWUpfSxcImV4ZWN1dGVJZFwiOlwiJHtleGVjdXRlSWR9XCIsXCJzdWNjZXNzXCI6dHJ1ZX1gO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmJvZHkgPSBge1wiZGF0YVwiOiR7SlNPTi5zdHJpbmdpZnkoZXhlY3V0ZWQucmVzdWx0cy52YWx1ZSl9LFwiZXhlY3V0ZUlkXCI6XCIke2V4ZWN1dGVJZH1cIixcInN1Y2Nlc3NcIjp0cnVlfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpodHRwUmVzcG9uc2VcIiwgeyBleGVjdXRlSWQsIGxvZ2dlciwgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIGh0dHAsIGhlYWRlcnM6IGh0dHAucmVxdWVzdC5oZWFkZXJzLCBjb250ZXh0OiBleGVjdXRlZC5jb250ZXh0LCBzdWNjZXNzOiB0cnVlLCByZWplY3QgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGZpbmFsZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiQW4gZXJyb3Igb2NjdXJyZWQgaW5zaWRlIG9uRmluYWxseS5cIiwgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBydW50aW1lLnJ1bnRpbWUucmVxdWVzdC5kZWxldGUoZXhlY3V0ZUlkKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UocmVzcG9uc2UuYm9keSwgcmVzcG9uc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gc3RyZWFtXHJcbiAgICAgICAgICAgICAgICBsZXQgcm91dGVTY2hlbWEgPSBvcHRpb25zLnJvdXRlU2NoZW1hO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFyb3V0ZVNjaGVtYSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvdXRlU2NoZW1hID0gdHJpZS5nZXQoaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3V0ZVNjaGVtYSA9IGdlbmVyYXRlZC5yb3V0ZVNjaGVtYT8uW2h0dHAucGF0aC5zdHJpbmddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVTY2hlbWEgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcnVudGltZS5lbWl0KFwibWlsa2lvOmh0dHBOb3RGb3VuZFwiLCB7IGV4ZWN1dGVJZCwgbG9nZ2VyLCBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZywgaHR0cCwgcmVqZWN0IH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVqZWN0KFwiTk9UX0ZPVU5EXCIsIHsgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByb3V0ZVNjaGVtYS5tb2R1bGUgIT09IFwiZnVuY3Rpb25cIikgcm91dGVTY2hlbWEubW9kdWxlID0gYXdhaXQgcm91dGVTY2hlbWEubW9kdWxlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHJvdXRlU2NoZW1hLm1vZHVsZSA9IGF3YWl0IHJvdXRlU2NoZW1hLm1vZHVsZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmllLmFkZChodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZywgcm91dGVTY2hlbWEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVTY2hlbWEudHlwZSAhPT0gXCJzdHJlYW1cIikgdGhyb3cgcmVqZWN0KFwiVU5BQ0NFUFRBQkxFXCIsIHsgZXhwZWN0ZWQ6IFwic3RyZWFtXCIsIG1lc3NhZ2U6IGBOb3QgYWNjZXB0YWJsZSwgdGhlIEFjY2VwdCBpbiB0aGUgcmVxdWVzdCBoZWFkZXIgc2hvdWxkIGJlIFwiYXBwbGljYXRpb24vanNvblwiLiBJZiB5b3UgYXJlIHVzaW5nIHRoZSBcIkBtaWxraW8vc3RhcmdhdGVcIiBwYWNrYWdlLCBwbGVhc2UgcmVtb3ZlIFxcYHR5cGU6IFwic3RyZWFtXCJcXGAgdG8gdGhlIGV4ZWN1dGUgb3B0aW9ucy5gIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZUNsb3NlID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJ1bnRpbWUucnVudGltZS5yZXF1ZXN0LmRlbGV0ZShleGVjdXRlSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBmaW5hbGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJBbiBlcnJvciBvY2N1cnJlZCBpbnNpZGUgb25GaW5hbGx5LlwiLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnRleHQuaHR0cCA9IGh0dHA7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmhlYWRlcnMgPSBodHRwLnJlcXVlc3QuaGVhZGVycztcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBleGVjdXRlZCA9IGF3YWl0IGV4ZWN1dGVyLl9fZXhlY3V0ZShyb3V0ZVNjaGVtYSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRFeGVjdXRlSWQ6IGV4ZWN1dGVJZCxcclxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkTG9nZ2VyOiBsb2dnZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogb3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMgYXMgSGVhZGVycyxcclxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtczogaHR0cC5wYXJhbXMuc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtc1R5cGU6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGZpbmFsZXMgPSBleGVjdXRlZC5maW5hbGVzO1xyXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZTogYnVuXHJcbiAgICAgICAgICAgICAgICBsZXQgc3RyZWFtOiBSZWFkYWJsZVN0cmVhbTtcclxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmU6IGJ1blxyXG4gICAgICAgICAgICAgICAgbGV0IGNvbnRyb2w6IFJlYWRhYmxlU3RyZWFtRGlyZWN0Q29udHJvbGxlciB8IFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXI7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZTogYnVuXHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIEJ1biAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmU6IGJ1blxyXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBSZWFkYWJsZVN0cmVhbSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZGlyZWN0XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmU6IGJ1blxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3luYyBwdWxsKGNvbnRyb2xsZXI6IFJlYWRhYmxlU3RyZWFtRGlyZWN0Q29udHJvbGxlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGNvbnRyb2xsZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIud3JpdGUoYGRhdGE6QCR7SlNPTi5zdHJpbmdpZnkoeyBzdWNjZXNzOiB0cnVlLCBkYXRhOiB1bmRlZmluZWQsIGV4ZWN1dGVJZCB9IHNhdGlzZmllcyBNaWxraW9SZXNwb25zZVN1Y2Nlc3M8YW55Pil9XFxuXFxuYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCB2YWx1ZSBvZiBleGVjdXRlZC5yZXN1bHRzLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5yZXF1ZXN0LnNpZ25hbC5hYm9ydGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KFtudWxsLCB2YWx1ZV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci53cml0ZShgZGF0YToke3Jlc3VsdH1cXG5cXG5gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVkLnJlc3VsdHMudmFsdWUucmV0dXJuKHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGNlcHRpb24gPSBleGNlcHRpb25IYW5kbGVyKGV4ZWN1dGVJZCwgbG9nZ2VyLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbZXhjZXB0aW9uLmNvZGVdID0gZXhjZXB0aW9uLnJlamVjdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLndyaXRlKGBkYXRhOiR7SlNPTi5zdHJpbmdpZnkoW3Jlc3VsdCwgbnVsbF0pfVxcblxcbmApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMgY2FuY2VsKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB9IGFzIGFueSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vZGUuanMgb3Igb3RoZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZTogYnVuXHJcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gbmV3IFJlYWRhYmxlU3RyZWFtKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZTogYnVuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jIHB1bGwoY29udHJvbGxlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGNvbnRyb2xsZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShgZGF0YTpAJHtKU09OLnN0cmluZ2lmeSh7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IHVuZGVmaW5lZCwgZXhlY3V0ZUlkIH0gc2F0aXNmaWVzIE1pbGtpb1Jlc3BvbnNlU3VjY2Vzczxhbnk+KX1cXG5cXG5gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHZhbHVlIG9mIGV4ZWN1dGVkLnJlc3VsdHMudmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLnJlcXVlc3Quc2lnbmFsLmFib3J0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoW251bGwsIHZhbHVlXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoYGRhdGE6JHtyZXN1bHR9XFxuXFxuYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlZC5yZXN1bHRzLnZhbHVlLnJldHVybih1bmRlZmluZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhjZXB0aW9uID0gZXhjZXB0aW9uSGFuZGxlcihleGVjdXRlSWQsIGxvZ2dlciwgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2V4Y2VwdGlvbi5jb2RlXSA9IGV4Y2VwdGlvbi5yZWplY3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGBkYXRhOiR7SlNPTi5zdHJpbmdpZnkoW3Jlc3VsdCwgbnVsbF0pfVxcblxcbmApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDApKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMgY2FuY2VsKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB9IGFzIGFueSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UuYm9keSA9IHN0cmVhbTtcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcInRleHQvZXZlbnQtc3RyZWFtXCI7XHJcbiAgICAgICAgICAgICAgICByZXNwb25zZS5oZWFkZXJzW1wiQ2FjaGUtQ29udHJvbFwiXSA9IFwibm8tY2FjaGVcIjtcclxuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86aHR0cFJlc3BvbnNlXCIsIHsgZXhlY3V0ZUlkLCBsb2dnZXIsIHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLCBodHRwLCBoZWFkZXJzOiBodHRwLnJlcXVlc3QuaGVhZGVycywgY29udGV4dDogZXhlY3V0ZWQuY29udGV4dCwgc3VjY2VzczogdHJ1ZSwgcmVqZWN0IH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UocmVzcG9uc2UuYm9keSwgcmVzcG9uc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0czogUmVzdWx0czxNaWxraW9SZXNwb25zZVJlamVjdD4gPSB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogZXhjZXB0aW9uSGFuZGxlcihleGVjdXRlSWQsIGxvZ2dlciwgZXJyb3IpLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0cy52YWx1ZSAhPT0gdW5kZWZpbmVkKSByZXNwb25zZS5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocmVzdWx0cy52YWx1ZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpodHRwUmVzcG9uc2VcIiwgeyBleGVjdXRlSWQsIGxvZ2dlciwgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIGh0dHAsIGhlYWRlcnM6IGh0dHAucmVxdWVzdC5oZWFkZXJzLCBjb250ZXh0LCBzdWNjZXNzOiBmYWxzZSwgcmVqZWN0IH0pO1xyXG4gICAgICAgICAgICBydW50aW1lLnJ1bnRpbWUucmVxdWVzdC5kZWxldGUoZXhlY3V0ZUlkKTtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShyZXNwb25zZS5ib2R5LCByZXNwb25zZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBzdHJlYW1DbG9zZXJzOiBNYXA8c3RyaW5nLCB7IGdlbmVyYXRvcjogQXN5bmNHZW5lcmF0b3I7IGhhbmRsZUNsb3NlOiBhbnkgfT4gPSBuZXcgTWFwKCk7XHJcbiAgICBjb25zdCBoYW5kbGVNZXNzYWdlID0gYXN5bmMgKFxyXG4gICAgICAgIHBvcnQ6IHsgcG9zdE1lc3NhZ2UobWVzc2FnZTogYW55KTogdm9pZCB9LFxyXG4gICAgICAgIG9wdGlvbnM6XHJcbiAgICAgICAgICAgIHwge1xyXG4gICAgICAgICAgICAgICAgZXhlY3V0ZUlkOiBzdHJpbmc7XHJcbiAgICAgICAgICAgICAgICBwYXRoOiBzdHJpbmc7XHJcbiAgICAgICAgICAgICAgICBwYXJhbXM/OiBSZWNvcmQ8YW55LCBhbnk+O1xyXG4gICAgICAgICAgICAgICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfCBzdHJpbmcsXHJcbiAgICApID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMgPT09IFwiUElOR1wiKSB7XHJcbiAgICAgICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKFwiUE9OR1wiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5zdGFydHNXaXRoKFwiQ0xPU0VfU1RSRUFNOlwiKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0ZUlkID0gb3B0aW9ucy5zcGxpdChcIkNMT1NFX1NUUkVBTTpcIilbMV07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW1DbG9zZXIgPSBzdHJlYW1DbG9zZXJzLmdldChleGVjdXRlSWQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHN0cmVhbUNsb3Nlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbUNsb3Nlci5nZW5lcmF0b3IucmV0dXJuKHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtQ2xvc2VyLmhhbmRsZUNsb3NlKFwic3RyZWFtXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHJvdXRlU2NoZW1hID0gdHJpZS5nZXQob3B0aW9ucy5wYXRoKTtcclxuICAgICAgICBpZiAocm91dGVTY2hlbWEgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcm91dGVTY2hlbWEgPSBnZW5lcmF0ZWQucm91dGVTY2hlbWE/LltvcHRpb25zLnBhdGhdO1xyXG4gICAgICAgICAgICBpZiAocm91dGVTY2hlbWEgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgcmVqZWN0KFwiTk9UX0ZPVU5EXCIsIHsgcGF0aDogb3B0aW9ucy5wYXRoIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygcm91dGVTY2hlbWEubW9kdWxlICE9PSBcImZ1bmN0aW9uXCIpIHJvdXRlU2NoZW1hLm1vZHVsZSA9IGF3YWl0IHJvdXRlU2NoZW1hLm1vZHVsZTtcclxuICAgICAgICAgICAgZWxzZSByb3V0ZVNjaGVtYS5tb2R1bGUgPSBhd2FpdCByb3V0ZVNjaGVtYS5tb2R1bGUoKTtcclxuICAgICAgICAgICAgdHJpZS5hZGQob3B0aW9ucy5wYXRoLCByb3V0ZVNjaGVtYSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKTtcclxuICAgICAgICBjb25zdCBwYXJhbXMgPSBvcHRpb25zLnBhcmFtcyA/PyB7fTtcclxuICAgICAgICBjb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIocnVudGltZSwgb3B0aW9ucy5wYXRoLCBvcHRpb25zLmV4ZWN1dGVJZCk7XHJcbiAgICAgICAgbGV0IGZpbmFsZXM6IEFycmF5PCgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+PiA9IFtdO1xyXG5cclxuICAgICAgICBjb25zdCBodHRwID0gbmV3IFByb3h5KFxyXG4gICAgICAgICAgICB7fSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZ2V0OiAodGFyZ2V0LCBwcm9wZXJ0eSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PT0gXCJub3RGb3VuZFwiKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHNldDogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IHJlamVjdChcIlVOQUNDRVBUQUJMRVwiLCB7IGV4cGVjdGVkOiBcImNvbnRleHQuaHR0cFwiLCBtZXNzYWdlOiBcIlRoaXMgcmVxdWVzdCB3YXMgaW52b2tlZCB0aHJvdWdoIHRoZSBleGVjdXRlIG1ldGhvZC4gU2luY2Ugbm8gYWN0dWFsIHJlcXVlc3Qgd2FzIGdlbmVyYXRlZCwgdGhlIEhUVFAgbWV0aG9kcyB1bmRlciB0aGUgY29udGV4dCBjYW5ub3QgYmUgYWNjZXNzZWQuXCIgfSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGNvbnN0IGhhbmRsZUNsb3NlID0gYXN5bmMgKHR5cGU6IFwiYWN0aW9uXCIgfCBcInN0cmVhbVwiKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBcInN0cmVhbVwiKSBzdHJlYW1DbG9zZXJzLmRlbGV0ZShvcHRpb25zLmV4ZWN1dGVJZCk7XHJcbiAgICAgICAgICAgIHJ1bnRpbWUucnVudGltZS5yZXF1ZXN0LmRlbGV0ZShvcHRpb25zLmV4ZWN1dGVJZCk7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBmaW5hbGVzKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZXIoKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiQW4gZXJyb3Igb2NjdXJyZWQgaW5zaWRlIG9uRmluYWxseS5cIiwgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHsgaHR0cDogaHR0cCwgaGVhZGVycywgcmVqZWN0IH07XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYS50eXBlID09PSBcImFjdGlvblwiKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBleGVjdXRlZCA9IGF3YWl0IGV4ZWN1dGVyLl9fZXhlY3V0ZShyb3V0ZVNjaGVtYSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRFeGVjdXRlSWQ6IG9wdGlvbnMuZXhlY3V0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRMb2dnZXI6IGxvZ2dlcixcclxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBvcHRpb25zLnBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVycyxcclxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcyxcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXNUeXBlOiBcInJhd1wiLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBmaW5hbGVzID0gZXhlY3V0ZWQuZmluYWxlcztcclxuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDbG9zZShcImFjdGlvblwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZXhlY3V0ZWQuZW1wdHlSZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUlkOiBvcHRpb25zLmV4ZWN1dGVJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUlkOiBvcHRpb25zLmV4ZWN1dGVJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZXhlY3V0ZWQucmVzdWx0cy52YWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocm91dGVTY2hlbWEudHlwZSA9PT0gXCJzdHJlYW1cIikge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0ZWQgPSBhd2FpdCBleGVjdXRlci5fX2V4ZWN1dGUocm91dGVTY2hlbWEsIHtcclxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkRXhlY3V0ZUlkOiBvcHRpb25zLmV4ZWN1dGVJZCxcclxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkTG9nZ2VyOiBsb2dnZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogb3B0aW9ucy5wYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnMsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dCxcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMsXHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zVHlwZTogXCJyYXdcIixcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgZmluYWxlcyA9IGV4ZWN1dGVkLmZpbmFsZXM7XHJcblxyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogdW5kZWZpbmVkLCBleGVjdXRlSWQ6IG9wdGlvbnMuZXhlY3V0ZUlkLCBkb25lOiBmYWxzZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICBzdHJlYW1DbG9zZXJzLnNldChvcHRpb25zLmV4ZWN1dGVJZCwgeyBnZW5lcmF0b3I6IGV4ZWN1dGVkLnJlc3VsdHMudmFsdWUsIGhhbmRsZUNsb3NlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2YgZXhlY3V0ZWQucmVzdWx0cy52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBbbnVsbCwgdmFsdWVdLCBleGVjdXRlSWQ6IG9wdGlvbnMuZXhlY3V0ZUlkLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogdW5kZWZpbmVkLCBleGVjdXRlSWQ6IG9wdGlvbnMuZXhlY3V0ZUlkLCBkb25lOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBleGNlcHRpb24gPSBleGNlcHRpb25IYW5kbGVyKG9wdGlvbnMuZXhlY3V0ZUlkLCBsb2dnZXIsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtleGNlcHRpb24uY29kZV0gPSBleGNlcHRpb24ucmVqZWN0O1xyXG4gICAgICAgICAgICAgICAgICAgIHBvcnQucG9zdE1lc3NhZ2UoeyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBbcmVzdWx0LCBudWxsXSwgZXhlY3V0ZUlkOiBvcHRpb25zLmV4ZWN1dGVJZCwgZG9uZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNsb3NlKFwic3RyZWFtXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZXhjZXB0aW9uSGFuZGxlcihvcHRpb25zLmV4ZWN1dGVJZCwgbG9nZ2VyLCBlcnJvcik7XHJcbiAgICAgICAgICAgIHBvcnQucG9zdE1lc3NhZ2UoeyBzdWNjZXNzOiBmYWxzZSwgZGF0YTogdW5kZWZpbmVkLCBlcnJvcjogcmVzdWx0LCBleGVjdXRlSWQ6IG9wdGlvbnMuZXhlY3V0ZUlkLCBkb25lOiB0cnVlIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBwb3J0LFxyXG4gICAgICAgIGZldGNoLFxyXG4gICAgICAgIGhhbmRsZU1lc3NhZ2UsXHJcbiAgICB9O1xyXG59XHJcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBNaWxraW9SZXNwb25zZVJlamVjdCwgTG9nZ2VyIH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlICRyZWplY3RDb2RlIHtcclxuICAgIFJFUVVFU1RfRkFJTDogYW55O1xyXG4gICAgTk9UX0RFVkVMT1BfTU9ERTogc3RyaW5nO1xyXG4gICAgUkVRVUVTVF9USU1FT1VUOiB7IHRpbWVvdXQ6IG51bWJlcjsgbWVzc2FnZTogc3RyaW5nIH07XHJcbiAgICBOT1RfRk9VTkQ6IHsgcGF0aDogc3RyaW5nIH07XHJcbiAgICBQQVJBTVNfVFlQRV9JTkNPUlJFQ1Q6IHsgcGF0aDogc3RyaW5nOyBleHBlY3RlZDogc3RyaW5nOyB2YWx1ZTogYW55OyBtZXNzYWdlOiBzdHJpbmcgfSB8IG51bGw7XHJcbiAgICBSRVNVTFRTX1RZUEVfSU5DT1JSRUNUOiB7IHBhdGg6IHN0cmluZzsgZXhwZWN0ZWQ6IHN0cmluZzsgdmFsdWU6IGFueTsgbWVzc2FnZTogc3RyaW5nIH0gfCBudWxsO1xyXG4gICAgVU5BQ0NFUFRBQkxFOiB7IGV4cGVjdGVkOiBzdHJpbmc7IG1lc3NhZ2U6IHN0cmluZyB9O1xyXG4gICAgUEFSQU1TX1RZUEVfTk9UX1NVUFBPUlRFRDogeyBleHBlY3RlZDogc3RyaW5nIH07XHJcbiAgICBSRVNVTFRTX1RZUEVfTk9UX1NVUFBPUlRFRDogeyBleHBlY3RlZDogc3RyaW5nIH07XHJcbiAgICBJTlRFUk5BTF9TRVJWRVJfRVJST1I6IHVuZGVmaW5lZDtcclxuICAgIE1FVEhPRF9OT1RfQUxMT1dFRDogdW5kZWZpbmVkO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmVqZWN0PENvZGUgZXh0ZW5kcyBrZXlvZiAkcmVqZWN0Q29kZSwgUmVqZWN0RGF0YSBleHRlbmRzICRyZWplY3RDb2RlW0NvZGVdPihjb2RlOiBDb2RlLCBkYXRhOiBSZWplY3REYXRhKTogTWlsa2lvUmVqZWN0RXJyb3I8Q29kZSwgUmVqZWN0RGF0YT4ge1xyXG4gICAgY29uc3QgZXJyb3IgPSB7ICRtaWxraW9SZWplY3Q6IHRydWUsIGNvZGUsIGRhdGEgfSBhcyBNaWxraW9SZWplY3RFcnJvcjxDb2RlLCBSZWplY3REYXRhPjtcclxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGVycm9yKTtcclxuICAgIHJldHVybiBlcnJvcjtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgTWlsa2lvUmVqZWN0RXJyb3I8Q29kZSBleHRlbmRzIGtleW9mICRyZWplY3RDb2RlID0ga2V5b2YgJHJlamVjdENvZGUsIFJlamVjdERhdGEgZXh0ZW5kcyAkcmVqZWN0Q29kZVtDb2RlXSA9ICRyZWplY3RDb2RlW0NvZGVdPiA9IHsgY29kZTogQ29kZTsgZGF0YTogUmVqZWN0RGF0YTsgc3RhY2s6IHN0cmluZzsgJG1pbGtpb1JlamVjdDogdHJ1ZSB9O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGV4Y2VwdGlvbkhhbmRsZXIoZXhlY3V0ZUlkOiBzdHJpbmcsIGxvZ2dlcjogTG9nZ2VyLCBlcnJvcjogTWlsa2lvUmVqZWN0RXJyb3I8YW55LCBhbnk+IHwgYW55KTogTWlsa2lvUmVzcG9uc2VSZWplY3Qge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBpZiAoXCJ2aXRlU2VydmVyXCIgaW4gZ2xvYmFsVGhpcykgKGdsb2JhbFRoaXMgYXMgYW55KS52aXRlU2VydmVyPy5zc3JGaXhTdGFja3RyYWNlKGVycm9yKTsgLy8gZml4IHZpdGUgc3NyIHN0YWNrdHJhY2VcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7IH1cclxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIFwidml0ZVNlcnZlclwiIGluIGdsb2JhbFRoaXMpIChnbG9iYWxUaGlzIGFzIGFueSkudml0ZVNlcnZlci5zc3JGaXhTdGFja3RyYWNlKGVycm9yKTtcclxuICAgIGNvbnN0IG5hbWUgPSBlcnJvcj8uY29kZSA/PyBlcnJvcj8ubmFtZSA/PyBlcnJvcj8uY29uc3RydWN0b3I/Lm5hbWUgPz8gXCJVbm5hbWVkIEV4Y2VwdGlvblwiO1xyXG5cclxuICAgIGlmIChlcnJvcj8uJG1pbGtpb1JlamVjdCA9PT0gdHJ1ZSAmJiBlcnJvcj8uY29kZSA9PT0gXCJOT1RfRk9VTkRcIikge1xyXG4gICAgICAgIGxvZ2dlci5pbmZvKG5hbWUsIGVycm9yPy5kYXRhPy5wYXRoID8/IFwiVW5rbm93biBwYXRoXCIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFjayA9IGVycm9yPy4kbWlsa2lvUmVqZWN0ID8gKGVycm9yPy5zdGFjayA/PyBcIlwiKS5zcGxpdChcIlxcblwiKS5zbGljZSgyKS5qb2luKFwiXFxuXCIpIDogKGVycm9yPy5zdGFjayA/PyBcIlwiKTtcclxuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKG5hbWUsIGBcXG4ke0pTT04uc3RyaW5naWZ5KGVycm9yPy5kYXRhKX1gLCBgXFxuJHtzdGFja31cXG5gKTtcclxuICAgICAgICB9IGNhdGNoIChfKSB7XHJcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihuYW1lLCBgXFxuJHtlcnJvcj8udG9TdHJpbmcoKX1gLCBgXFxuJHtlcnJvcj8uc3RhY2t9XFxuYCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXN1bHQ6IE1pbGtpb1Jlc3BvbnNlUmVqZWN0O1xyXG5cclxuICAgIGlmIChlcnJvcj8uJG1pbGtpb1JlamVjdCA9PT0gdHJ1ZSkgcmVzdWx0ID0geyBzdWNjZXNzOiBmYWxzZSwgY29kZTogZXJyb3IuY29kZSwgcmVqZWN0OiBlcnJvci5kYXRhLCBleGVjdXRlSWQgfTtcclxuICAgIGVsc2UgcmVzdWx0ID0geyBzdWNjZXNzOiBmYWxzZSwgY29kZTogXCJJTlRFUk5BTF9TRVJWRVJfRVJST1JcIiwgcmVqZWN0OiB1bmRlZmluZWQsIGV4ZWN1dGVJZCB9O1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjtBQUFPLFNBQVMsSUFBNkIsQ0FBQyxTQUEyQjtBQUFBLEVBQ3ZFLE9BQU8sUUFBUTtBQUFBOztBQ1VWLFNBQVMsVUFBMEMsQ0FBQyxPQUErQjtBQUFBLEVBQ3hGLE9BQU87QUFBQSxJQUNMLE1BQU0sT0FBTyxFQUFFLGFBQWEsZUFBZSxNQUFNO0FBQUEsRUFDbkQ7QUFBQTs7QUNkSyxTQUFTLE1BQThCLENBQUMsU0FBMEI7QUFBQSxFQUN2RSxPQUFPO0FBQUE7QUFTRixTQUFTLFdBQVcsQ0FBQyxPQUFvQyxjQUFzQjtBQUFBLEVBQ3BGLElBQUksVUFBVTtBQUFBLElBQVcsT0FBTztBQUFBLEVBRWhDLE9BQU8sR0FBRztBQUFBO0FBR0wsU0FBUyxXQUFXLENBQUMsT0FBMkIsY0FBc0I7QUFBQSxFQUMzRSxJQUFJLFVBQVU7QUFBQSxJQUFXLE9BQU87QUFBQSxFQUVoQyxPQUFPLE9BQU8sU0FBUyxPQUFPLEVBQUU7QUFBQTtBQUczQixTQUFTLFlBQVksQ0FBQyxPQUFvQyxjQUF1QjtBQUFBLEVBQ3RGLElBQUksVUFBVTtBQUFBLElBQVEsT0FBTztBQUFBLEVBRTdCLElBQUksVUFBVTtBQUFBLElBQVMsT0FBTztBQUFBLEVBRTlCLElBQUksVUFBVTtBQUFBLElBQUksT0FBTztBQUFBLEVBRXpCLElBQWtCLFVBQWQ7QUFBQSxJQUFxQixPQUFPO0FBQUEsRUFFaEMsT0FBTyxRQUFRLEtBQUs7QUFBQTs7QUMvQmYsU0FBUyxhQUFhLENBQUMsU0FBa0I7QUFBQSxFQUM5QyxNQUFNLE9BQStCLENBQUM7QUFBQSxFQUN0QyxZQUFZLEtBQUssVUFBVyxRQUFnQixRQUFRLEdBQUc7QUFBQSxJQUNyRCxLQUFLLE9BQU87QUFBQSxFQUNkO0FBQUEsRUFDQSxPQUFPO0FBQUE7OztBQ0xULFNBQVMsYUFBYSxDQUFDLE9BQTBDO0FBQUEsRUFDL0QsT0FBTyxPQUFPLFVBQVUsWUFBWSxVQUFVLFFBQVEsQ0FBQyxNQUFNLFFBQVEsS0FBSztBQUFBO0FBR3JFLFNBQVMsU0FBdUUsQ0FBQyxRQUFXLFFBQWM7QUFBQSxFQUMvRyxNQUFNLFNBQVMsS0FBSyxPQUFPO0FBQUEsRUFFM0IsV0FBVyxPQUFPLFFBQVE7QUFBQSxJQUN4QixJQUFJLENBQUMsT0FBTyxVQUFVLGVBQWUsS0FBSyxRQUFRLEdBQUc7QUFBQSxNQUFHO0FBQUEsSUFFeEQsTUFBTSxjQUFjLE9BQU87QUFBQSxJQUMzQixNQUFNLGNBQWMsT0FBTztBQUFBLElBRTNCLElBQUksT0FBTyxVQUFVLGVBQWUsS0FBSyxRQUFRLEdBQUcsR0FBRztBQUFBLE1BQ3JELElBQUksY0FBYyxXQUFXLEtBQUssY0FBYyxXQUFXLEdBQUc7QUFBQSxRQUM1RCxPQUFPLE9BQTRCLFVBQVUsYUFBYSxXQUFXO0FBQUEsTUFDdkU7QUFBQSxJQUNGLEVBQU87QUFBQSxNQUNKLE9BQWUsT0FBTztBQUFBO0FBQUEsRUFFM0I7QUFBQSxFQUVBLE9BQU87QUFBQTs7O0FDckJGLFNBQVMsZUFBa0IsQ0FBQyxNQUFZO0FBQUEsRUFDM0MsTUFBTSxpQkFBaUI7QUFBQSxFQUV2QixJQUFJLGdCQUFnQjtBQUFBLElBQU0sT0FBTztBQUFBLEVBQ2pDLElBQUksTUFBTSxRQUFRLElBQUksR0FBRztBQUFBLElBQ3JCLE9BQU8sS0FBSyxJQUFJLENBQUMsU0FBUyxnQkFBZ0IsSUFBSSxDQUFDO0FBQUEsRUFDbkQ7QUFBQSxFQUNBLElBQUksT0FBTyxTQUFTLFlBQVksU0FBUyxNQUFNO0FBQUEsSUFDM0MsT0FBTyxPQUFPLFFBQVEsSUFBSSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEtBQUssV0FBVztBQUFBLE1BQ3RELElBQUksT0FBa0IsZ0JBQWdCLEtBQUs7QUFBQSxNQUMzQyxPQUFPO0FBQUEsT0FDUixDQUFDLENBQU07QUFBQSxFQUNkO0FBQUEsRUFDQSxJQUFJLE9BQU8sU0FBUyxVQUFVO0FBQUEsSUFDMUIsTUFBTSxRQUFRLEtBQUssTUFBTSxjQUFjO0FBQUEsSUFDdkMsSUFBSSxPQUFPO0FBQUEsTUFDUCxNQUFNLHVCQUF1QixNQUFNLEtBQUssR0FBRyxNQUFNLEtBQUssTUFBTSxHQUFHLFFBQVEsS0FBSyxFQUFFLE1BQU0sR0FBRyxNQUFNO0FBQUEsTUFDN0YsT0FBTyxJQUFJLEtBQUssb0JBQW9CO0FBQUEsSUFDeEM7QUFBQSxFQUNKO0FBQUEsRUFDQSxPQUFPO0FBQUE7OztBQ2RKLFNBQVMsY0FBYyxDQUFDLFdBQTBCLFNBQWM7QUFBQSxFQUNuRSxNQUFNLFlBQVksT0FDZCxhQUNBLFlBZ0IyUTtBQUFBLElBQzNRLE1BQU0sT0FBTyxRQUFRLEtBQUssU0FBUyxHQUFHLElBQUksV0FBVztBQUFBLElBQ3JELE1BQU0sWUFBb0IsUUFBUTtBQUFBLElBQ2xDLElBQUk7QUFBQSxJQUNKLElBQUksRUFBRSxRQUFRLG1CQUFtQixVQUFVO0FBQUEsTUFFdkMsVUFBVSxJQUFJLFFBQVE7QUFBQSxXQUNmLFFBQVE7QUFBQSxNQUNmLENBQUM7QUFBQSxJQUNMLEVBQU87QUFBQSxNQUNILFVBQVUsUUFBUTtBQUFBO0FBQUEsSUFFdEIsSUFBSSxFQUFFLFlBQVk7QUFBQSxNQUFXLFFBQWdCLFNBQVMsTUFBTSxjQUFjLE9BQU87QUFBQSxJQUVqRixNQUFNLFVBQXNCLENBQUM7QUFBQSxJQUM3QixNQUFNLFlBQVksQ0FBQyxZQUFpQixRQUFRLFFBQVEsT0FBTztBQUFBLElBRTNELElBQUk7QUFBQSxJQUNKLElBQUksUUFBUSxlQUFlLE9BQU87QUFBQSxNQUM5QixTQUFTLFFBQVE7QUFBQSxNQUNqQixJQUFJLE9BQU8sV0FBVztBQUFBLFFBQWEsU0FBUyxDQUFDO0FBQUEsSUFDakQsRUFBTztBQUFBLE1BQ0gsSUFBSSxRQUFRLFdBQVcsSUFBSTtBQUFBLFFBQ3ZCLFNBQVMsQ0FBQztBQUFBLE1BQ2QsRUFBTztBQUFBLFFBQ0gsSUFBSTtBQUFBLFVBQ0EsU0FBUyxnQkFBZ0IsS0FBSyxNQUFNLFFBQVEsTUFBTSxDQUFDO0FBQUEsVUFDckQsT0FBTyxPQUFPO0FBQUEsVUFDWixNQUFNLE9BQU8sNkJBQTZCLEVBQUUsVUFBVSxPQUFPLENBQUM7QUFBQTtBQUFBLFFBRWxFLElBQUksT0FBTyxXQUFXO0FBQUEsVUFBYSxTQUFTLENBQUM7QUFBQTtBQUFBO0FBQUEsSUFHckQsSUFBSSxPQUFPLFdBQVcsWUFBWSxNQUFNLFFBQVEsTUFBTTtBQUFBLE1BQUcsTUFBTSxPQUFPLDZCQUE2QixFQUFFLFVBQVUsT0FBTyxDQUFDO0FBQUEsSUFDdkgsSUFBSSwyQkFBMkIsVUFBVSxPQUFPLDBCQUEwQixVQUFVO0FBQUEsTUFDaEYsSUFBSSxDQUFDLFFBQVE7QUFBQSxRQUFTLE1BQU0sT0FBTyxvQkFBb0IsMENBQTBDO0FBQUEsTUFDakcsT0FBTyxPQUFPO0FBQUEsTUFDZCxJQUFJLGFBQWEsWUFBWSxhQUFhO0FBQUEsTUFDMUMsSUFBSSxlQUFlLGFBQWEsZUFBZTtBQUFBLFFBQU0sYUFBYSxDQUFDO0FBQUEsTUFDbkUsU0FBUyxVQUFVLFFBQVEsVUFBVTtBQUFBLE1BQ3JDLFFBQVEsY0FBYyxNQUFNLDJCQUEwQixLQUFLLFVBQVUsTUFBTSxDQUFDO0FBQUEsSUFDaEY7QUFBQSxJQUNBLElBQUksQ0FBQyxRQUFRLFNBQVMsTUFBTSxZQUFZLFFBQVEsU0FBUyxNQUFNLFFBQVE7QUFBQSxNQUFRLFFBQVEsUUFBUSxLQUFLLE9BQU8sU0FBUztBQUFBLElBRXBILElBQUksQ0FBQyxRQUFRO0FBQUEsTUFBUyxRQUFRLFVBQVUsQ0FBQztBQUFBLElBQ3pDLFFBQVEsUUFBUSxVQUFVLFFBQVE7QUFBQSxJQUNsQyxRQUFRLFFBQVEsT0FBTyxRQUFRO0FBQUEsSUFDL0IsUUFBUSxRQUFRLFNBQVMsUUFBUTtBQUFBLElBQ2pDLFFBQVEsUUFBUSxPQUFPLFFBQVE7QUFBQSxJQUMvQixRQUFRLFFBQVEsWUFBWSxRQUFRO0FBQUEsSUFDcEMsUUFBUSxRQUFRLFNBQVMsUUFBUSxRQUFRO0FBQUEsSUFDekMsUUFBUSxRQUFRLFFBQVEsVUFBVTtBQUFBLElBQ2xDLFFBQVEsUUFBUSxPQUFPLENBQUMsU0FBYSxZQUFnQixPQUFPLFFBQVEsU0FBUyxTQUFRLE9BQU07QUFBQSxJQUMzRixRQUFRLFFBQVEsWUFBWTtBQUFBLElBQzVCLFFBQVEsUUFBUSxJQUFJO0FBQUEsSUFFcEIsTUFBTSxVQUF3QixFQUFFLE9BQU8sVUFBVTtBQUFBLElBRWpELE1BQU0sU0FBUyxZQUFZO0FBQUEsSUFDM0IsTUFBTSxPQUFRLFFBQVEsT0FBTyxRQUFRLE9BQU8sQ0FBQztBQUFBLElBRTdDLElBQUksUUFBUSxRQUFRLE1BQU0sU0FBUyxXQUFXLFdBQVc7QUFBQSxNQUNyRCxNQUFNLGVBQWUsTUFBTSxXQUFXLENBQUMsTUFBTTtBQUFBLE1BQzdDLElBQUksQ0FBQyxhQUFhLFNBQVMsUUFBUSxRQUFRLEtBQUssUUFBUSxNQUFNO0FBQUEsUUFBRyxNQUFNLE9BQU8sc0JBQXNCLFNBQVM7QUFBQSxJQUNqSDtBQUFBLElBRUEsSUFBSSxNQUFNLGVBQWUsYUFBYSxLQUFLLGVBQWUsUUFBUyxNQUFNLFFBQVEsS0FBSyxVQUFVLEtBQUssS0FBSyxXQUFXLFNBQVMsUUFBUSxHQUFJO0FBQUEsTUFDdEksTUFBTSxhQUFhLFlBQVksZUFBZSxNQUFNO0FBQUEsTUFDcEQsSUFBSSxDQUFDLFdBQVc7QUFBQSxRQUFTLE1BQU0sT0FBTyx5QkFBeUIsS0FBSyxXQUFXLE9BQU8sSUFBSSxTQUFTLGNBQWMsV0FBVyxPQUFPLEdBQUcsYUFBYSxXQUFXLE9BQU8sR0FBRyxnQ0FBZ0MsV0FBVyxPQUFPLEdBQUcsMEJBQTBCLENBQUM7QUFBQSxJQUM1UDtBQUFBLElBRUEsTUFBTSxRQUFRLEtBQUssd0JBQXdCLEVBQUUsV0FBVyxRQUFRLGtCQUFrQixRQUFRLFFBQVEsZUFBZSxNQUFNLFFBQVEsTUFBTSxNQUFNLFNBQVMsUUFBUSxTQUFTLE9BQU8sQ0FBQztBQUFBLElBRTdLLFFBQVEsUUFBUSxNQUFNLE9BQU8sUUFBUSxRQUFRLFNBQVMsTUFBTTtBQUFBLElBRTVELElBQUksY0FBYztBQUFBLElBQ2xCLElBQUksUUFBUSxVQUFVLGFBQWEsUUFBUSxVQUFVLFFBQVEsUUFBUSxVQUFVLElBQUk7QUFBQSxNQUMvRSxjQUFjO0FBQUEsTUFDZCxRQUFRLFFBQVEsQ0FBQztBQUFBLElBQ3JCLEVBQU8sU0FBSSxNQUFNLFFBQVEsUUFBUSxLQUFLLEtBQUssT0FBTyxRQUFRLFVBQVUsVUFBVTtBQUFBLE1BQzFFLE1BQU0sT0FBTyxnQkFBZ0IsNkdBQTZHO0FBQUEsSUFDOUk7QUFBQSxJQUVBLElBQUksb0JBQW9CO0FBQUEsSUFDeEIsSUFBSSxDQUFDLGVBQWUsU0FBUyxhQU96QixLQUFLLGVBQWUsUUFBUyxNQUFNLFFBQVEsS0FBSyxVQUFVLEtBQUssS0FBSyxXQUFXLFNBQVMsU0FBUyxJQUFLO0FBQUEsTUFDdEcsb0JBQW9CO0FBQUEsTUFDcEIsTUFBTSxhQUFhLFlBQVksZ0JBQWdCLFFBQVEsS0FBSztBQUFBLE1BQzVELElBQUksQ0FBQyxXQUFXO0FBQUEsUUFBUyxNQUFNLE9BQU8sMEJBQTBCLEtBQUssV0FBVyxPQUFPLElBQUksU0FBUyxjQUFjLFdBQVcsT0FBTyxHQUFHLGFBQWEsV0FBVyxPQUFPLEdBQUcsZ0NBQWdDLFdBQVcsT0FBTyxHQUFHLDBCQUEwQixDQUFDO0FBQUEsSUFDN1A7QUFBQSxJQUVBLE1BQU0sUUFBUSxLQUFLLHVCQUF1QixFQUFFLFdBQVcsUUFBUSxrQkFBa0IsUUFBUSxRQUFRLGVBQWUsTUFBTSxRQUFRLE1BQU0sTUFBTSxTQUFTLFFBQVEsU0FBUyxTQUFTLE9BQU8sQ0FBQztBQUFBLElBRXJMLE9BQU8sRUFBRSxXQUFXLFNBQVMsUUFBUSxTQUFTLFNBQVMsUUFBUSxTQUFTLE1BQU0sTUFBTSxhQUFhLG1CQUFtQixRQUFRO0FBQUE7QUFBQSxFQUdoSSxNQUFNLFNBQVMsT0FBTyxTQUFtQixRQUFxQyxXQUErQjtBQUFBLElBQ3pHLE1BQU0sZ0JBQWdCLE1BQU07QUFBQSxJQUM1QixPQUFPLE1BQU0sY0FBYyxRQUFRLFNBQVMsTUFBTTtBQUFBO0FBQUEsRUFHdEQsT0FBTztBQUFBLElBQ0g7QUFBQSxJQUNBO0FBQUEsRUFDSjtBQUFBOztBQzdIRyxTQUFTLGtCQUFrQixHQUFHO0FBQUEsRUFDakMsTUFBTSxXQUFXLElBQUk7QUFBQSxFQUNyQixNQUFNLFVBQVUsSUFBSTtBQUFBLEVBRXBCLE1BQU0sZUFBZTtBQUFBLElBQ2pCLElBQUksQ0FBMkUsS0FBVSxZQUFxQjtBQUFBLE1BQzFHLFNBQVMsSUFBSSxTQUFTLEdBQWE7QUFBQSxNQUNuQyxJQUFJLFFBQVEsS0FBSztBQUFBLFFBQ2IsSUFBSSxRQUFRLElBQUksR0FBRyxNQUFNLE9BQU87QUFBQSxVQUM1QixRQUFRLElBQUksS0FBSyxJQUFJLEdBQUs7QUFBQSxRQUM5QjtBQUFBLFFBQ0EsTUFBTSxjQUFjLFFBQVEsSUFBSSxHQUFHO0FBQUEsUUFDbkMsWUFBWSxJQUFJLE9BQU87QUFBQSxNQUMzQixFQUFPO0FBQUEsUUFDSCxJQUFJLFFBQVEsSUFBSSxHQUFhLE1BQU0sT0FBTztBQUFBLFVBQ3RDLFFBQVEsSUFBSSxLQUFlLElBQUksR0FBSztBQUFBLFFBQ3hDO0FBQUEsUUFDQSxNQUFNLE1BQU0sUUFBUSxJQUFJLEdBQWE7QUFBQSxRQUNyQyxJQUFJLElBQUksT0FBTztBQUFBO0FBQUEsTUFHbkIsT0FBTyxNQUFNO0FBQUEsUUFDVCxTQUFTLE9BQU8sT0FBTztBQUFBLFFBQ3ZCLElBQUksUUFBUSxLQUFLO0FBQUEsVUFDYixNQUFNLGNBQWMsUUFBUSxJQUFJLEdBQUc7QUFBQSxVQUNuQyxJQUFJLGFBQWE7QUFBQSxZQUNiLFlBQVksT0FBTyxPQUFPO0FBQUEsVUFDOUI7QUFBQSxRQUNKLEVBQU87QUFBQSxVQUNILE1BQU0sTUFBTSxRQUFRLElBQUksR0FBYTtBQUFBLFVBQ3JDLElBQUksS0FBSztBQUFBLFlBQ0wsSUFBSSxPQUFPLE9BQU87QUFBQSxVQUN0QjtBQUFBO0FBQUE7QUFBQTtBQUFBLElBSVosS0FBSyxDQUEyRSxLQUFVLFlBQXFCO0FBQUEsTUFDM0csSUFBSSxRQUFRLEtBQUs7QUFBQSxRQUNiLE1BQU0sY0FBYyxRQUFRLElBQUksR0FBRztBQUFBLFFBQ25DLElBQUksQ0FBQztBQUFBLFVBQWE7QUFBQSxRQUNsQixTQUFTLE9BQU8sT0FBTztBQUFBLFFBQ3ZCLFlBQVksT0FBTyxPQUFPO0FBQUEsTUFDOUIsRUFBTztBQUFBLFFBQ0gsTUFBTSxNQUFNLFFBQVEsSUFBSSxHQUFhO0FBQUEsUUFDckMsSUFBSSxDQUFDO0FBQUEsVUFBSztBQUFBLFFBQ1YsU0FBUyxPQUFPLE9BQU87QUFBQSxRQUN2QixJQUFJLE9BQU8sT0FBTztBQUFBO0FBQUE7QUFBQSxJQUcxQixNQUFNLE9BQThELEtBQVUsVUFBZ0M7QUFBQSxNQUMxRyxNQUFNLG1CQUFtQixRQUFRLElBQUksR0FBRztBQUFBLE1BQ3hDLElBQUksa0JBQWtCO0FBQUEsUUFDbEIsV0FBVyxXQUFXLGtCQUFrQjtBQUFBLFVBQ3BDLE1BQU0sUUFBUSxFQUFFLEtBQUssTUFBTSxDQUFDO0FBQUEsUUFDaEM7QUFBQSxNQUNKO0FBQUEsTUFFQSxNQUFNLElBQUksUUFBUSxJQUFJLEdBQWE7QUFBQSxNQUNuQyxJQUFJLEdBQUc7QUFBQSxRQUNILFdBQVcsV0FBVyxHQUFHO0FBQUEsVUFDckIsTUFBTSxRQUFRLEtBQUs7QUFBQSxRQUN2QjtBQUFBLE1BQ0o7QUFBQTtBQUFBLEVBRVI7QUFBQSxFQUVBLE9BQU87QUFBQTs7QUNyRUosU0FBUyxVQUFhLEdBQWtCO0FBQUEsRUFDN0MsSUFBSSxTQUE4QztBQUFBLEVBQ2xELE1BQU0sUUFLRCxDQUFDO0FBQUEsRUFFTixNQUFNLFdBQVc7QUFBQSxJQUNmLE1BQU0sQ0FBQyxTQUFZO0FBQUEsTUFDakIsSUFBSSxNQUFNLEdBQUcsRUFBRSxHQUFHLFVBQVUsTUFBTTtBQUFBLFFBQ2hDLE1BQU0sT0FBTyxNQUFNLEdBQUcsRUFBRTtBQUFBLFFBQ3hCLEtBQUssUUFBUTtBQUFBLFFBQ2IsS0FBSyxRQUFRLElBQUk7QUFBQSxRQUNqQjtBQUFBLE1BQ0YsRUFBTztBQUFBLFFBQ0wsTUFBTSxZQUFZLFFBQVEsY0FBaUI7QUFBQSxRQUMzQyxVQUFVLFFBQVEsSUFBSTtBQUFBLFFBQ3RCLE1BQU0sS0FBSyxLQUFLLFdBQVcsT0FBTyxNQUFNLENBQVE7QUFBQTtBQUFBO0FBQUEsT0FHaEQ7QUFBQSxXQUNJLEtBQUksR0FBK0I7QUFBQSxRQUN2QyxJQUFJLFdBQVc7QUFBQSxVQUFXLE9BQU8sRUFBRSxNQUFNLE1BQU0sT0FBTyxLQUFLO0FBQUEsUUFDM0QsSUFBSSxNQUFNLFdBQVcsR0FBRztBQUFBLFVBQ3RCLE1BQU0sWUFBWSxRQUFRLGNBQWlCO0FBQUEsVUFDM0MsTUFBTSxLQUFLLEtBQUssV0FBVyxPQUFPLEtBQUssQ0FBUTtBQUFBLFFBQ2pEO0FBQUEsUUFDQSxNQUFNLE9BQU8sTUFBTSxHQUFHLENBQUM7QUFBQSxRQUN2QixNQUFNLFNBQVMsTUFBTSxLQUFLO0FBQUEsUUFDMUIsTUFBTSxNQUFNO0FBQUEsUUFDWixPQUFPLEVBQUUsTUFBTSxXQUFXLFdBQVcsT0FBTyxPQUFPO0FBQUE7QUFBQSxXQUUvQyxPQUFNLEdBQWtDO0FBQUEsUUFDNUMsU0FBUztBQUFBLFFBQ1QsV0FBVyxRQUFRLE9BQU87QUFBQSxVQUN4QixLQUFLLFFBQVE7QUFBQSxVQUNiLEtBQUssUUFBUSxTQUFTO0FBQUEsUUFDeEI7QUFBQSxRQUNBLE9BQU8sRUFBRSxNQUFNLE1BQU0sT0FBTyxLQUFLO0FBQUE7QUFBQSxXQUU3QixNQUFLLENBQUMsS0FBeUM7QUFBQSxRQUNuRCxTQUFTO0FBQUEsUUFDVCxJQUFJLE1BQU0sV0FBVyxHQUFHO0FBQUEsVUFDdEIsTUFBTSxZQUFZLFFBQVEsY0FBaUI7QUFBQSxVQUMzQyxNQUFNLEtBQUssS0FBSyxXQUFXLE9BQU8sS0FBSyxDQUFRO0FBQUEsUUFDakQ7QUFBQSxRQUNBLFdBQVcsUUFBUSxPQUFPO0FBQUEsVUFDeEIsS0FBSyxRQUFRO0FBQUEsVUFDYixLQUFLLE9BQU8sR0FBRztBQUFBLFFBQ2pCO0FBQUEsUUFDQSxPQUFPLEVBQUUsTUFBTSxNQUFNLE9BQU8sS0FBSztBQUFBO0FBQUEsSUFFckM7QUFBQSxLQUNDLE9BQU8sY0FBYyxHQUFHO0FBQUEsTUFDdkIsT0FBTztBQUFBO0FBQUEsRUFFWDtBQUFBLEVBRUEsT0FBTztBQUFBOztBQzlEVCxTQUFTLGlCQUFpQixDQUFDLFNBQTZCO0FBQUEsRUFDdEQsSUFBSSxDQUFDLFFBQVE7QUFBQSxJQUFRLFFBQVEsU0FBUztBQUFBLEVBQ3RDLElBQUksUUFBUSxTQUFTO0FBQUEsSUFBRyxNQUFNLElBQUksTUFBTSxnQkFBZ0I7QUFBQSxFQUN4RCxJQUFJLFFBQVEsU0FBUztBQUFBLElBQUksTUFBTSxJQUFJLE1BQU0sZ0JBQWdCO0FBQUEsRUFDekQsSUFBSSxRQUFRLGFBQWEsUUFBUSxTQUFTO0FBQUEsSUFBRyxNQUFNLElBQUksTUFBTSxnQkFBZ0I7QUFBQSxFQUM3RSxJQUFJLFdBQVc7QUFBQSxFQUNmLElBQUksY0FBYztBQUFBLEVBQ2xCLE9BQU87QUFBQSxJQUNMLFFBQVEsR0FBRztBQUFBLE1BQ1QsSUFBSSxhQUFhLFFBQVE7QUFBQSxNQUN6QixNQUFNLE1BQU0sS0FBSyxJQUFJO0FBQUEsTUFDckIsSUFBSSxLQUFLO0FBQUEsTUFDVCxJQUFJLFFBQVEsV0FBVztBQUFBLFFBQ3JCLGNBQWM7QUFBQSxRQUNkLEtBQUssR0FBRyxLQUFLLGlCQUFpQixPQUFPLEdBQUcsQ0FBQyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQUEsTUFDNUQ7QUFBQSxNQUNBLElBQUksUUFBUSxjQUFjLGFBQWEsS0FBSztBQUFBLFFBQzFDLEtBQUssR0FBRyxLQUFLLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxTQUFTLEdBQUcsR0FBRztBQUFBLE1BQzlELEVBQU87QUFBQSxRQUNMLFdBQVc7QUFBQSxRQUNYLE1BQU0sTUFBTTtBQUFBLFFBQ1osTUFBTSxNQUFNLGNBQWMsT0FBTyxVQUFVLENBQUM7QUFBQSxRQUM1QyxjQUFjLHFCQUFxQixLQUFLLEdBQUc7QUFBQSxRQUMzQyxLQUFLLEdBQUcsS0FBSyxpQkFBaUIsV0FBVyxFQUFFLFNBQVMsWUFBWSxHQUFHO0FBQUE7QUFBQSxNQUVyRSxPQUFPO0FBQUE7QUFBQSxJQUVULGNBQWMsQ0FBQyxJQUFZO0FBQUEsTUFDekIsT0FBTyxRQUFRLFlBQVksT0FBTyxpQkFBaUIsR0FBRyxNQUFNLEdBQUcsQ0FBQyxFQUFFLFdBQVcsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJO0FBQUE7QUFBQSxFQUU5RjtBQUFBO0FBR0YsSUFBTSxXQUFXO0FBRWpCLFNBQVMsb0JBQW9CLENBQUMsS0FBYSxLQUFxQjtBQUFBLEVBQzlELElBQUksT0FBTztBQUFBLElBQUssTUFBTSxJQUFJLE1BQU0sZUFBZTtBQUFBLEVBRS9DLE1BQU0sUUFBUSxNQUFNLE1BQU07QUFBQSxFQUMxQixNQUFNLFlBQVksS0FBSyxLQUFLLE9BQU8sT0FBTyxNQUFNLFNBQVMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFBQSxFQUN4RSxNQUFNLGVBQWUsSUFBSSxXQUFXLFNBQVM7QUFBQSxFQUU3QyxJQUFJO0FBQUEsRUFDSixHQUFHO0FBQUEsSUFDRCxPQUFPLGdCQUFnQixZQUFZO0FBQUEsSUFDbkMsY0FDRSxPQUNFLEtBQUssTUFBTSxLQUFLLFlBQVksRUFDekIsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsRUFBRSxTQUFTLEdBQUcsR0FBRyxDQUFDLEVBQzFDLEtBQUssRUFBRSxHQUNaLElBQUk7QUFBQSxFQUNSLFNBQVMsY0FBYztBQUFBLEVBRXZCLE9BQU8sTUFBTTtBQUFBO0FBR2YsU0FBUyxnQkFBZ0IsQ0FBQyxPQUF1QjtBQUFBLEVBQy9DLE1BQU0sT0FBTyxPQUFPLFNBQVMsTUFBTTtBQUFBLEVBQ25DLElBQUksU0FBUztBQUFBLEVBQ2IsSUFBSSxVQUFVO0FBQUEsRUFFZCxJQUFJLFlBQVk7QUFBQSxJQUFJLE9BQU8sU0FBUztBQUFBLEVBRXBDLE9BQU8sVUFBVSxJQUFJO0FBQUEsSUFDbkIsTUFBTSxZQUFZLFVBQVU7QUFBQSxJQUM1QixTQUFTLFNBQVMsT0FBTyxTQUFTLEtBQUs7QUFBQSxJQUN2QyxVQUFVLFVBQVU7QUFBQSxFQUN0QjtBQUFBLEVBQ0EsT0FBTztBQUFBO0FBR1QsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFxQjtBQUFBLEVBQzdDLE1BQU0sVUFBcUMsQ0FBQztBQUFBLEVBQzVDLFNBQVMsSUFBSSxFQUFHLElBQUksU0FBUyxRQUFRLEtBQUs7QUFBQSxJQUN4QyxRQUFRLFNBQVMsTUFBTTtBQUFBLEVBQ3pCO0FBQUEsRUFFQSxNQUFNLE9BQU8sT0FBTyxTQUFTLE1BQU07QUFBQSxFQUNuQyxJQUFJLFNBQVM7QUFBQSxFQUViLFNBQVMsSUFBSSxFQUFHLElBQUksSUFBSSxRQUFRLEtBQUs7QUFBQSxJQUNuQyxNQUFNLE9BQU8sSUFBSTtBQUFBLElBQ2pCLElBQUksRUFBRSxRQUFRLFVBQVU7QUFBQSxNQUN0QixNQUFNLElBQUksTUFBTSxzQkFBc0IsdUJBQXVCO0FBQUEsSUFDL0Q7QUFBQSxJQUNBLE1BQU0sUUFBUSxPQUFPLFFBQVEsS0FBSztBQUFBLElBQ2xDLFNBQVMsU0FBUyxPQUFPO0FBQUEsRUFDM0I7QUFBQSxFQUVBLE9BQU87QUFBQTtBQUdULFNBQVMsYUFBYSxDQUFDLEdBQW1CO0FBQUEsRUFDeEMsT0FBTyxPQUFPLFNBQVMsTUFBTSxLQUFLLElBQUk7QUFBQTtBQUd4QyxJQUFNLGNBQWMsa0JBQWtCLEVBQUUsUUFBUSxJQUFJLFdBQVcsT0FBTyxZQUFZLE1BQU0sQ0FBQztBQUVsRixJQUFNLGFBQWEsWUFBWTs7O0FDcEcvQixTQUFTLCtCQUErQixHQUFHO0FBQUEsRUFDaEQsT0FBTztBQUFBOzs7QUMrQlQsZUFBc0IsV0FBNkMsQ0FBQyxXQUEwQixjQUF3RCxTQUEwQztBQUFBLEVBQzVMLE1BQU0sWUFBWSxRQUFRLGFBQWEsZ0NBQWdDO0FBQUEsRUFDdkUsTUFBTSxVQUFTLE1BQU0sYUFBYSxJQUFJO0FBQUEsRUFFdEMsTUFBTSxVQUFVO0FBQUEsSUFDWixTQUFTLElBQUk7QUFBQSxJQUNiO0FBQUEsRUFDSjtBQUFBLEVBRUEsTUFBTSxlQUFlLG1CQUFtQjtBQUFBLEVBRXhDLElBQUksUUFBUTtBQUFBLElBQVcsUUFBUSxrQkFBa0IsUUFBUSxrQkFBa0IsUUFBUSxrQkFBa0IsSUFBSTtBQUFBLEVBRXpHLE1BQU0sSUFBc0M7QUFBQSxPQUNyQztBQUFBLElBQ0g7QUFBQSxJQUNBO0FBQUEsSUFDQSxJQUFJLGFBQWE7QUFBQSxJQUNqQixLQUFLLGFBQWE7QUFBQSxJQUNsQixNQUFNLGFBQWE7QUFBQSxFQUN2QjtBQUFBLEVBRUEsTUFBTSxXQUFXLGVBQWUsV0FBVyxDQUFDO0FBQUEsRUFDNUMsTUFBTSxXQUFXLGVBQWUsV0FBVyxHQUFHLFFBQVE7QUFBQSxFQUd0RCxNQUFNLFFBQVE7QUFBQSxJQUNWO0FBQUEsSUFFQSxJQUFJLGFBQWE7QUFBQSxJQUNqQixLQUFLLGFBQWE7QUFBQSxJQUNsQixNQUFNLGFBQWE7QUFBQSxJQUVuQjtBQUFBLElBRUE7QUFBQSxFQUNKO0FBQUEsRUFFQSxRQUFRLE1BQU07QUFBQSxFQUVkLElBQUksTUFBTSxRQUFRLFFBQVEsVUFBVSxHQUFHO0FBQUEsSUFDbkMsV0FBVyxhQUFhLFFBQVEsWUFBWTtBQUFBLE1BQ3hDLE1BQU0sVUFBVSxLQUFrRDtBQUFBLElBQ3RFO0FBQUEsRUFDSjtBQUFBLEVBRUEsTUFBTSxRQUFRLElBQUksVUFBVSxjQUFjLGFBQWEsS0FBSyxDQUFDO0FBQUEsRUFFN0QsTUFBTSxZQUFZLE9BQU8sS0FBSyxVQUFVLFdBQWtDO0FBQUEsRUFDMUUsUUFBUSxJQUFJO0FBQUE7QUFBQSxNQUFtQixVQUFVLEtBQUs7QUFBQSxLQUFRO0FBQUEsZUFBbUIsVUFBVSxnQkFBZ0I7QUFBQSxFQUNuRyxRQUFRLElBQUk7QUFBQSw2QkFBK0IsUUFBUSxNQUFNO0FBQUEsRUFFekQsT0FBTztBQUFBOztBQ3hGSixTQUFTLEtBQW1DLENBQUMsTUFBcUM7QUFBQSxFQUN2RixPQUFPO0FBQUE7O0FDb0NGLElBQU0sYUFBYTtBQWdCbkIsSUFBTSxVQUFVLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEtBQUssS0FBSztBQWdCakQsSUFBTSxVQUFVLENBQUM7QUFPakIsSUFBTSxxQkFBcUI7QUFPM0IsSUFBTSxvQkFBb0I7QUE2RTFCLElBQU0sZ0JBQWdCO0FBY3RCLElBQU0sZUFBZSxnQkFBZ0I7QUFPckMsSUFBTSxnQkFBZ0IsZUFBZTtBQU9yQyxJQUFNLGdCQUFnQixlQUFlO0FBT3JDLElBQU0saUJBQWlCLGdCQUFnQjtBQU92QyxJQUFNLG1CQUFtQixpQkFBaUI7QUFhMUMsSUFBTSxzQkFBc0IsT0FBTyxJQUFJLG1CQUFtQjs7O0FDbEwxRCxTQUFTLGFBQWEsQ0FBQyxNQUFNLE9BQU87QUFBQSxFQUN6QyxJQUFJLE9BQU8sU0FBUztBQUFBLElBQVksT0FBTyxLQUFLLEtBQUs7QUFBQSxFQUVqRCxJQUFJLFFBQVEsT0FBTyxTQUFTLFlBQVksdUJBQXVCO0FBQUEsSUFDN0QsT0FBTyxLQUFLLHFCQUFxQixLQUFLO0FBQUEsRUFFeEMsSUFBSSxnQkFBZ0I7QUFBQSxJQUFNLE9BQU8sSUFBSSxLQUFLLFlBQVksS0FBSztBQUFBLEVBRTNELE9BQU8sSUFBSSxLQUFLLEtBQUs7QUFBQTs7O0FDTGhCLFNBQVMsTUFBTSxDQUFDLFVBQVUsU0FBUztBQUFBLEVBRXhDLE9BQU8sY0FBYyxXQUFXLFVBQVUsUUFBUTtBQUFBOzs7QUMxQ3BELElBQUksaUJBQWlCLENBQUM7QUFFZixTQUFTLGlCQUFpQixHQUFHO0FBQUEsRUFDbEMsT0FBTztBQUFBOzs7QUMrQkYsU0FBUyxXQUFXLENBQUMsTUFBTSxTQUFTO0FBQUEsRUFDekMsTUFBTSxrQkFBaUIsa0JBQWtCO0FBQUEsRUFDekMsTUFBTSxlQUNKLFNBQVMsZ0JBQ1QsU0FBUyxRQUFRLFNBQVMsZ0JBQzFCLGdCQUFlLGdCQUNmLGdCQUFlLFFBQVEsU0FBUyxnQkFDaEM7QUFBQSxFQUVGLE1BQU0sUUFBUSxPQUFPLE1BQU0sU0FBUyxFQUFFO0FBQUEsRUFDdEMsTUFBTSxNQUFNLE1BQU0sT0FBTztBQUFBLEVBQ3pCLE1BQU0sUUFBUSxNQUFNLGVBQWUsSUFBSSxLQUFLLE1BQU07QUFBQSxFQUVsRCxNQUFNLFFBQVEsTUFBTSxRQUFRLElBQUksSUFBSTtBQUFBLEVBQ3BDLE1BQU0sU0FBUyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQUEsRUFDekIsT0FBTztBQUFBOzs7QUNuQkYsU0FBUyxjQUFjLENBQUMsTUFBTSxTQUFTO0FBQUEsRUFDNUMsT0FBTyxZQUFZLE1BQU0sS0FBSyxTQUFTLGNBQWMsRUFBRSxDQUFDO0FBQUE7OztBQ0huRCxTQUFTLGNBQWMsQ0FBQyxNQUFNLFNBQVM7QUFBQSxFQUM1QyxNQUFNLFFBQVEsT0FBTyxNQUFNLFNBQVMsRUFBRTtBQUFBLEVBQ3RDLE1BQU0sT0FBTyxNQUFNLFlBQVk7QUFBQSxFQUUvQixNQUFNLDRCQUE0QixjQUFjLE9BQU8sQ0FBQztBQUFBLEVBQ3hELDBCQUEwQixZQUFZLE9BQU8sR0FBRyxHQUFHLENBQUM7QUFBQSxFQUNwRCwwQkFBMEIsU0FBUyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQUEsRUFDN0MsTUFBTSxrQkFBa0IsZUFBZSx5QkFBeUI7QUFBQSxFQUVoRSxNQUFNLDRCQUE0QixjQUFjLE9BQU8sQ0FBQztBQUFBLEVBQ3hELDBCQUEwQixZQUFZLE1BQU0sR0FBRyxDQUFDO0FBQUEsRUFDaEQsMEJBQTBCLFNBQVMsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUFBLEVBQzdDLE1BQU0sa0JBQWtCLGVBQWUseUJBQXlCO0FBQUEsRUFFaEUsSUFBSSxNQUFNLFFBQVEsS0FBSyxnQkFBZ0IsUUFBUSxHQUFHO0FBQUEsSUFDaEQsT0FBTyxPQUFPO0FBQUEsRUFDaEIsRUFBTyxTQUFJLE1BQU0sUUFBUSxLQUFLLGdCQUFnQixRQUFRLEdBQUc7QUFBQSxJQUN2RCxPQUFPO0FBQUEsRUFDVCxFQUFPO0FBQUEsSUFDTCxPQUFPLE9BQU87QUFBQTtBQUFBOzs7QUNsQ1gsU0FBUywrQkFBK0IsQ0FBQyxNQUFNO0FBQUEsRUFDcEQsTUFBTSxRQUFRLE9BQU8sSUFBSTtBQUFBLEVBQ3pCLE1BQU0sVUFBVSxJQUFJLEtBQ2xCLEtBQUssSUFDSCxNQUFNLFlBQVksR0FDbEIsTUFBTSxTQUFTLEdBQ2YsTUFBTSxRQUFRLEdBQ2QsTUFBTSxTQUFTLEdBQ2YsTUFBTSxXQUFXLEdBQ2pCLE1BQU0sV0FBVyxHQUNqQixNQUFNLGdCQUFnQixDQUN4QixDQUNGO0FBQUEsRUFDQSxRQUFRLGVBQWUsTUFBTSxZQUFZLENBQUM7QUFBQSxFQUMxQyxPQUFPLENBQUMsT0FBTyxDQUFDO0FBQUE7OztBQ3pCWCxTQUFTLGNBQWMsQ0FBQyxZQUFZLE9BQU87QUFBQSxFQUNoRCxNQUFNLFlBQVksY0FBYyxLQUM5QixNQUNBLFdBQVcsTUFBTSxLQUFLLENBQUMsU0FBUyxPQUFPLFNBQVMsUUFBUSxDQUMxRDtBQUFBLEVBQ0EsT0FBTyxNQUFNLElBQUksU0FBUztBQUFBOzs7QUNxQnJCLFNBQVMsVUFBVSxDQUFDLE1BQU0sU0FBUztBQUFBLEVBQ3hDLE1BQU0sUUFBUSxPQUFPLE1BQU0sU0FBUyxFQUFFO0FBQUEsRUFDdEMsTUFBTSxTQUFTLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFBQSxFQUN6QixPQUFPO0FBQUE7OztBQ1NGLFNBQVMsd0JBQXdCLENBQUMsV0FBVyxhQUFhLFNBQVM7QUFBQSxFQUN4RSxPQUFPLFlBQVksZ0JBQWdCLGVBQ2pDLFNBQVMsSUFDVCxXQUNBLFdBQ0Y7QUFBQSxFQUVBLE1BQU0sa0JBQWtCLFdBQVcsVUFBVTtBQUFBLEVBQzdDLE1BQU0sb0JBQW9CLFdBQVcsWUFBWTtBQUFBLEVBRWpELE1BQU0saUJBQ0osQ0FBQyxrQkFBa0IsZ0NBQWdDLGVBQWU7QUFBQSxFQUNwRSxNQUFNLG1CQUNKLENBQUMsb0JBQW9CLGdDQUFnQyxpQkFBaUI7QUFBQSxFQUt4RSxPQUFPLEtBQUssT0FBTyxpQkFBaUIsb0JBQW9CLGlCQUFpQjtBQUFBOzs7QUN6QnBFLFNBQVMsa0JBQWtCLENBQUMsTUFBTSxTQUFTO0FBQUEsRUFDaEQsTUFBTSxPQUFPLGVBQWUsTUFBTSxPQUFPO0FBQUEsRUFDekMsTUFBTSxrQkFBa0IsY0FBYyxTQUFTLE1BQU0sTUFBTSxDQUFDO0FBQUEsRUFDNUQsZ0JBQWdCLFlBQVksTUFBTSxHQUFHLENBQUM7QUFBQSxFQUN0QyxnQkFBZ0IsU0FBUyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQUEsRUFDbkMsT0FBTyxlQUFlLGVBQWU7QUFBQTs7O0FDTmhDLFNBQVMsTUFBTSxDQUFDLE9BQU87QUFBQSxFQUM1QixPQUNFLGlCQUFpQixRQUNoQixPQUFPLFVBQVUsWUFDaEIsT0FBTyxVQUFVLFNBQVMsS0FBSyxLQUFLLE1BQU07QUFBQTs7O0FDRnpDLFNBQVMsT0FBTyxDQUFDLE1BQU07QUFBQSxFQUM1QixPQUFPLEVBQUcsQ0FBQyxPQUFPLElBQUksS0FBSyxPQUFPLFNBQVMsWUFBYSxNQUFNLENBQUMsT0FBTyxJQUFJLENBQUM7QUFBQTs7O0FDUHRFLFNBQVMsV0FBVyxDQUFDLE1BQU0sU0FBUztBQUFBLEVBQ3pDLE1BQU0sUUFBUSxPQUFPLE1BQU0sU0FBUyxFQUFFO0FBQUEsRUFDdEMsTUFBTSxZQUFZLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQztBQUFBLEVBQzNDLE1BQU0sU0FBUyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQUEsRUFDekIsT0FBTztBQUFBOzs7QUNoQ1QsSUFBTSx1QkFBdUI7QUFBQSxFQUMzQixrQkFBa0I7QUFBQSxJQUNoQixLQUFLO0FBQUEsSUFDTCxPQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsVUFBVTtBQUFBLElBQ1IsS0FBSztBQUFBLElBQ0wsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVBLGFBQWE7QUFBQSxFQUViLGtCQUFrQjtBQUFBLElBQ2hCLEtBQUs7QUFBQSxJQUNMLE9BQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxVQUFVO0FBQUEsSUFDUixLQUFLO0FBQUEsSUFDTCxPQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsYUFBYTtBQUFBLElBQ1gsS0FBSztBQUFBLElBQ0wsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVBLFFBQVE7QUFBQSxJQUNOLEtBQUs7QUFBQSxJQUNMLE9BQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxPQUFPO0FBQUEsSUFDTCxLQUFLO0FBQUEsSUFDTCxPQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsYUFBYTtBQUFBLElBQ1gsS0FBSztBQUFBLElBQ0wsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVBLFFBQVE7QUFBQSxJQUNOLEtBQUs7QUFBQSxJQUNMLE9BQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxjQUFjO0FBQUEsSUFDWixLQUFLO0FBQUEsSUFDTCxPQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsU0FBUztBQUFBLElBQ1AsS0FBSztBQUFBLElBQ0wsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVBLGFBQWE7QUFBQSxJQUNYLEtBQUs7QUFBQSxJQUNMLE9BQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxRQUFRO0FBQUEsSUFDTixLQUFLO0FBQUEsSUFDTCxPQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsWUFBWTtBQUFBLElBQ1YsS0FBSztBQUFBLElBQ0wsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVBLGNBQWM7QUFBQSxJQUNaLEtBQUs7QUFBQSxJQUNMLE9BQU87QUFBQSxFQUNUO0FBQ0Y7QUFFTyxJQUFNLGlCQUFpQixDQUFDLE9BQU8sT0FBTyxZQUFZO0FBQUEsRUFDdkQsSUFBSTtBQUFBLEVBRUosTUFBTSxhQUFhLHFCQUFxQjtBQUFBLEVBQ3hDLElBQUksT0FBTyxlQUFlLFVBQVU7QUFBQSxJQUNsQyxTQUFTO0FBQUEsRUFDWCxFQUFPLFNBQUksVUFBVSxHQUFHO0FBQUEsSUFDdEIsU0FBUyxXQUFXO0FBQUEsRUFDdEIsRUFBTztBQUFBLElBQ0wsU0FBUyxXQUFXLE1BQU0sUUFBUSxhQUFhLE1BQU0sU0FBUyxDQUFDO0FBQUE7QUFBQSxFQUdqRSxJQUFJLFNBQVMsV0FBVztBQUFBLElBQ3RCLElBQUksUUFBUSxjQUFjLFFBQVEsYUFBYSxHQUFHO0FBQUEsTUFDaEQsT0FBTyxRQUFRO0FBQUEsSUFDakIsRUFBTztBQUFBLE1BQ0wsT0FBTyxTQUFTO0FBQUE7QUFBQSxFQUVwQjtBQUFBLEVBRUEsT0FBTztBQUFBOzs7QUNuR0YsU0FBUyxpQkFBaUIsQ0FBQyxNQUFNO0FBQUEsRUFDdEMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNO0FBQUEsSUFFdkIsTUFBTSxRQUFRLFFBQVEsUUFBUSxPQUFPLFFBQVEsS0FBSyxJQUFJLEtBQUs7QUFBQSxJQUMzRCxNQUFNLFNBQVMsS0FBSyxRQUFRLFVBQVUsS0FBSyxRQUFRLEtBQUs7QUFBQSxJQUN4RCxPQUFPO0FBQUE7QUFBQTs7O0FDSFgsSUFBTSxjQUFjO0FBQUEsRUFDbEIsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUNUO0FBRUEsSUFBTSxjQUFjO0FBQUEsRUFDbEIsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUNUO0FBRUEsSUFBTSxrQkFBa0I7QUFBQSxFQUN0QixNQUFNO0FBQUEsRUFDTixNQUFNO0FBQUEsRUFDTixRQUFRO0FBQUEsRUFDUixPQUFPO0FBQ1Q7QUFFTyxJQUFNLGFBQWE7QUFBQSxFQUN4QixNQUFNLGtCQUFrQjtBQUFBLElBQ3RCLFNBQVM7QUFBQSxJQUNULGNBQWM7QUFBQSxFQUNoQixDQUFDO0FBQUEsRUFFRCxNQUFNLGtCQUFrQjtBQUFBLElBQ3RCLFNBQVM7QUFBQSxJQUNULGNBQWM7QUFBQSxFQUNoQixDQUFDO0FBQUEsRUFFRCxVQUFVLGtCQUFrQjtBQUFBLElBQzFCLFNBQVM7QUFBQSxJQUNULGNBQWM7QUFBQSxFQUNoQixDQUFDO0FBQ0g7OztBQ3RDQSxJQUFNLHVCQUF1QjtBQUFBLEVBQzNCLFVBQVU7QUFBQSxFQUNWLFdBQVc7QUFBQSxFQUNYLE9BQU87QUFBQSxFQUNQLFVBQVU7QUFBQSxFQUNWLFVBQVU7QUFBQSxFQUNWLE9BQU87QUFDVDtBQUVPLElBQU0saUJBQWlCLENBQUMsT0FBTyxPQUFPLFdBQVcsYUFDdEQscUJBQXFCOzs7QUM2QmhCLFNBQVMsZUFBZSxDQUFDLE1BQU07QUFBQSxFQUNwQyxPQUFPLENBQUMsT0FBTyxZQUFZO0FBQUEsSUFDekIsTUFBTSxVQUFVLFNBQVMsVUFBVSxPQUFPLFFBQVEsT0FBTyxJQUFJO0FBQUEsSUFFN0QsSUFBSTtBQUFBLElBQ0osSUFBSSxZQUFZLGdCQUFnQixLQUFLLGtCQUFrQjtBQUFBLE1BQ3JELE1BQU0sZUFBZSxLQUFLLDBCQUEwQixLQUFLO0FBQUEsTUFDekQsTUFBTSxRQUFRLFNBQVMsUUFBUSxPQUFPLFFBQVEsS0FBSyxJQUFJO0FBQUEsTUFFdkQsY0FDRSxLQUFLLGlCQUFpQixVQUFVLEtBQUssaUJBQWlCO0FBQUEsSUFDMUQsRUFBTztBQUFBLE1BQ0wsTUFBTSxlQUFlLEtBQUs7QUFBQSxNQUMxQixNQUFNLFFBQVEsU0FBUyxRQUFRLE9BQU8sUUFBUSxLQUFLLElBQUksS0FBSztBQUFBLE1BRTVELGNBQWMsS0FBSyxPQUFPLFVBQVUsS0FBSyxPQUFPO0FBQUE7QUFBQSxJQUVsRCxNQUFNLFFBQVEsS0FBSyxtQkFBbUIsS0FBSyxpQkFBaUIsS0FBSyxJQUFJO0FBQUEsSUFHckUsT0FBTyxZQUFZO0FBQUE7QUFBQTs7O0FDekR2QixJQUFNLFlBQVk7QUFBQSxFQUNoQixRQUFRLENBQUMsS0FBSyxHQUFHO0FBQUEsRUFDakIsYUFBYSxDQUFDLE1BQU0sSUFBSTtBQUFBLEVBQ3hCLE1BQU0sQ0FBQyxpQkFBaUIsYUFBYTtBQUN2QztBQUVBLElBQU0sZ0JBQWdCO0FBQUEsRUFDcEIsUUFBUSxDQUFDLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxFQUMzQixhQUFhLENBQUMsTUFBTSxNQUFNLE1BQU0sSUFBSTtBQUFBLEVBQ3BDLE1BQU0sQ0FBQyxlQUFlLGVBQWUsZUFBZSxhQUFhO0FBQ25FO0FBTUEsSUFBTSxjQUFjO0FBQUEsRUFDbEIsUUFBUSxDQUFDLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsRUFDbkUsYUFBYTtBQUFBLElBQ1g7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFBQSxFQUVBLE1BQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxJQUFNLFlBQVk7QUFBQSxFQUNoQixRQUFRLENBQUMsS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLEVBQzFDLE9BQU8sQ0FBQyxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxJQUFJO0FBQUEsRUFDaEQsYUFBYSxDQUFDLE9BQU8sT0FBTyxPQUFPLE9BQU8sT0FBTyxPQUFPLEtBQUs7QUFBQSxFQUM3RCxNQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFDRjtBQUVBLElBQU0sa0JBQWtCO0FBQUEsRUFDdEIsUUFBUTtBQUFBLElBQ04sSUFBSTtBQUFBLElBQ0osSUFBSTtBQUFBLElBQ0osVUFBVTtBQUFBLElBQ1YsTUFBTTtBQUFBLElBQ04sU0FBUztBQUFBLElBQ1QsV0FBVztBQUFBLElBQ1gsU0FBUztBQUFBLElBQ1QsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUNBLGFBQWE7QUFBQSxJQUNYLElBQUk7QUFBQSxJQUNKLElBQUk7QUFBQSxJQUNKLFVBQVU7QUFBQSxJQUNWLE1BQU07QUFBQSxJQUNOLFNBQVM7QUFBQSxJQUNULFdBQVc7QUFBQSxJQUNYLFNBQVM7QUFBQSxJQUNULE9BQU87QUFBQSxFQUNUO0FBQUEsRUFDQSxNQUFNO0FBQUEsSUFDSixJQUFJO0FBQUEsSUFDSixJQUFJO0FBQUEsSUFDSixVQUFVO0FBQUEsSUFDVixNQUFNO0FBQUEsSUFDTixTQUFTO0FBQUEsSUFDVCxXQUFXO0FBQUEsSUFDWCxTQUFTO0FBQUEsSUFDVCxPQUFPO0FBQUEsRUFDVDtBQUNGO0FBRUEsSUFBTSw0QkFBNEI7QUFBQSxFQUNoQyxRQUFRO0FBQUEsSUFDTixJQUFJO0FBQUEsSUFDSixJQUFJO0FBQUEsSUFDSixVQUFVO0FBQUEsSUFDVixNQUFNO0FBQUEsSUFDTixTQUFTO0FBQUEsSUFDVCxXQUFXO0FBQUEsSUFDWCxTQUFTO0FBQUEsSUFDVCxPQUFPO0FBQUEsRUFDVDtBQUFBLEVBQ0EsYUFBYTtBQUFBLElBQ1gsSUFBSTtBQUFBLElBQ0osSUFBSTtBQUFBLElBQ0osVUFBVTtBQUFBLElBQ1YsTUFBTTtBQUFBLElBQ04sU0FBUztBQUFBLElBQ1QsV0FBVztBQUFBLElBQ1gsU0FBUztBQUFBLElBQ1QsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUNBLE1BQU07QUFBQSxJQUNKLElBQUk7QUFBQSxJQUNKLElBQUk7QUFBQSxJQUNKLFVBQVU7QUFBQSxJQUNWLE1BQU07QUFBQSxJQUNOLFNBQVM7QUFBQSxJQUNULFdBQVc7QUFBQSxJQUNYLFNBQVM7QUFBQSxJQUNULE9BQU87QUFBQSxFQUNUO0FBQ0Y7QUFFQSxJQUFNLGdCQUFnQixDQUFDLGFBQWEsYUFBYTtBQUFBLEVBQy9DLE1BQU0sU0FBUyxPQUFPLFdBQVc7QUFBQSxFQVNqQyxNQUFNLFNBQVMsU0FBUztBQUFBLEVBQ3hCLElBQUksU0FBUyxNQUFNLFNBQVMsSUFBSTtBQUFBLElBQzlCLFFBQVEsU0FBUztBQUFBLFdBQ1Y7QUFBQSxRQUNILE9BQU8sU0FBUztBQUFBLFdBQ2I7QUFBQSxRQUNILE9BQU8sU0FBUztBQUFBLFdBQ2I7QUFBQSxRQUNILE9BQU8sU0FBUztBQUFBO0FBQUEsRUFFdEI7QUFBQSxFQUNBLE9BQU8sU0FBUztBQUFBO0FBR1gsSUFBTSxXQUFXO0FBQUEsRUFDdEI7QUFBQSxFQUVBLEtBQUssZ0JBQWdCO0FBQUEsSUFDbkIsUUFBUTtBQUFBLElBQ1IsY0FBYztBQUFBLEVBQ2hCLENBQUM7QUFBQSxFQUVELFNBQVMsZ0JBQWdCO0FBQUEsSUFDdkIsUUFBUTtBQUFBLElBQ1IsY0FBYztBQUFBLElBQ2Qsa0JBQWtCLENBQUMsWUFBWSxVQUFVO0FBQUEsRUFDM0MsQ0FBQztBQUFBLEVBRUQsT0FBTyxnQkFBZ0I7QUFBQSxJQUNyQixRQUFRO0FBQUEsSUFDUixjQUFjO0FBQUEsRUFDaEIsQ0FBQztBQUFBLEVBRUQsS0FBSyxnQkFBZ0I7QUFBQSxJQUNuQixRQUFRO0FBQUEsSUFDUixjQUFjO0FBQUEsRUFDaEIsQ0FBQztBQUFBLEVBRUQsV0FBVyxnQkFBZ0I7QUFBQSxJQUN6QixRQUFRO0FBQUEsSUFDUixjQUFjO0FBQUEsSUFDZCxrQkFBa0I7QUFBQSxJQUNsQix3QkFBd0I7QUFBQSxFQUMxQixDQUFDO0FBQ0g7OztBQzFMTyxTQUFTLFlBQVksQ0FBQyxNQUFNO0FBQUEsRUFDakMsT0FBTyxDQUFDLFFBQVEsVUFBVSxDQUFDLE1BQU07QUFBQSxJQUMvQixNQUFNLFFBQVEsUUFBUTtBQUFBLElBRXRCLE1BQU0sZUFDSCxTQUFTLEtBQUssY0FBYyxVQUM3QixLQUFLLGNBQWMsS0FBSztBQUFBLElBQzFCLE1BQU0sY0FBYyxPQUFPLE1BQU0sWUFBWTtBQUFBLElBRTdDLElBQUksQ0FBQyxhQUFhO0FBQUEsTUFDaEIsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLE1BQU0sZ0JBQWdCLFlBQVk7QUFBQSxJQUVsQyxNQUFNLGdCQUNILFNBQVMsS0FBSyxjQUFjLFVBQzdCLEtBQUssY0FBYyxLQUFLO0FBQUEsSUFFMUIsTUFBTSxNQUFNLE1BQU0sUUFBUSxhQUFhLElBQ25DLFVBQVUsZUFBZSxDQUFDLFlBQVksUUFBUSxLQUFLLGFBQWEsQ0FBQyxJQUVqRSxRQUFRLGVBQWUsQ0FBQyxZQUFZLFFBQVEsS0FBSyxhQUFhLENBQUM7QUFBQSxJQUVuRSxJQUFJO0FBQUEsSUFFSixRQUFRLEtBQUssZ0JBQWdCLEtBQUssY0FBYyxHQUFHLElBQUk7QUFBQSxJQUN2RCxRQUFRLFFBQVEsZ0JBRVosUUFBUSxjQUFjLEtBQUssSUFDM0I7QUFBQSxJQUVKLE1BQU0sT0FBTyxPQUFPLE1BQU0sY0FBYyxNQUFNO0FBQUEsSUFFOUMsT0FBTyxFQUFFLE9BQU8sS0FBSztBQUFBO0FBQUE7QUFJekIsU0FBUyxPQUFPLENBQUMsUUFBUSxXQUFXO0FBQUEsRUFDbEMsV0FBVyxPQUFPLFFBQVE7QUFBQSxJQUN4QixJQUNFLE9BQU8sVUFBVSxlQUFlLEtBQUssUUFBUSxHQUFHLEtBQ2hELFVBQVUsT0FBTyxJQUFJLEdBQ3JCO0FBQUEsTUFDQSxPQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0Y7QUFBQSxFQUNBO0FBQUE7QUFHRixTQUFTLFNBQVMsQ0FBQyxPQUFPLFdBQVc7QUFBQSxFQUNuQyxTQUFTLE1BQU0sRUFBRyxNQUFNLE1BQU0sUUFBUSxPQUFPO0FBQUEsSUFDM0MsSUFBSSxVQUFVLE1BQU0sSUFBSSxHQUFHO0FBQUEsTUFDekIsT0FBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBQUEsRUFDQTtBQUFBOzs7QUN2REssU0FBUyxtQkFBbUIsQ0FBQyxNQUFNO0FBQUEsRUFDeEMsT0FBTyxDQUFDLFFBQVEsVUFBVSxDQUFDLE1BQU07QUFBQSxJQUMvQixNQUFNLGNBQWMsT0FBTyxNQUFNLEtBQUssWUFBWTtBQUFBLElBQ2xELElBQUksQ0FBQztBQUFBLE1BQWEsT0FBTztBQUFBLElBQ3pCLE1BQU0sZ0JBQWdCLFlBQVk7QUFBQSxJQUVsQyxNQUFNLGNBQWMsT0FBTyxNQUFNLEtBQUssWUFBWTtBQUFBLElBQ2xELElBQUksQ0FBQztBQUFBLE1BQWEsT0FBTztBQUFBLElBQ3pCLElBQUksUUFBUSxLQUFLLGdCQUNiLEtBQUssY0FBYyxZQUFZLEVBQUUsSUFDakMsWUFBWTtBQUFBLElBR2hCLFFBQVEsUUFBUSxnQkFBZ0IsUUFBUSxjQUFjLEtBQUssSUFBSTtBQUFBLElBRS9ELE1BQU0sT0FBTyxPQUFPLE1BQU0sY0FBYyxNQUFNO0FBQUEsSUFFOUMsT0FBTyxFQUFFLE9BQU8sS0FBSztBQUFBO0FBQUE7OztBQ2R6QixJQUFNLDRCQUE0QjtBQUNsQyxJQUFNLDRCQUE0QjtBQUVsQyxJQUFNLG1CQUFtQjtBQUFBLEVBQ3ZCLFFBQVE7QUFBQSxFQUNSLGFBQWE7QUFBQSxFQUNiLE1BQU07QUFDUjtBQUNBLElBQU0sbUJBQW1CO0FBQUEsRUFDdkIsS0FBSyxDQUFDLE9BQU8sU0FBUztBQUN4QjtBQUVBLElBQU0sdUJBQXVCO0FBQUEsRUFDM0IsUUFBUTtBQUFBLEVBQ1IsYUFBYTtBQUFBLEVBQ2IsTUFBTTtBQUNSO0FBQ0EsSUFBTSx1QkFBdUI7QUFBQSxFQUMzQixLQUFLLENBQUMsTUFBTSxNQUFNLE1BQU0sSUFBSTtBQUM5QjtBQUVBLElBQU0scUJBQXFCO0FBQUEsRUFDekIsUUFBUTtBQUFBLEVBQ1IsYUFBYTtBQUFBLEVBQ2IsTUFBTTtBQUNSO0FBQ0EsSUFBTSxxQkFBcUI7QUFBQSxFQUN6QixRQUFRO0FBQUEsSUFDTjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUFBLEVBRUEsS0FBSztBQUFBLElBQ0g7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFDRjtBQUVBLElBQU0sbUJBQW1CO0FBQUEsRUFDdkIsUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUFBLEVBQ1AsYUFBYTtBQUFBLEVBQ2IsTUFBTTtBQUNSO0FBQ0EsSUFBTSxtQkFBbUI7QUFBQSxFQUN2QixRQUFRLENBQUMsT0FBTyxPQUFPLE9BQU8sT0FBTyxPQUFPLE9BQU8sS0FBSztBQUFBLEVBQ3hELEtBQUssQ0FBQyxRQUFRLE9BQU8sUUFBUSxPQUFPLFFBQVEsT0FBTyxNQUFNO0FBQzNEO0FBRUEsSUFBTSx5QkFBeUI7QUFBQSxFQUM3QixRQUFRO0FBQUEsRUFDUixLQUFLO0FBQ1A7QUFDQSxJQUFNLHlCQUF5QjtBQUFBLEVBQzdCLEtBQUs7QUFBQSxJQUNILElBQUk7QUFBQSxJQUNKLElBQUk7QUFBQSxJQUNKLFVBQVU7QUFBQSxJQUNWLE1BQU07QUFBQSxJQUNOLFNBQVM7QUFBQSxJQUNULFdBQVc7QUFBQSxJQUNYLFNBQVM7QUFBQSxJQUNULE9BQU87QUFBQSxFQUNUO0FBQ0Y7QUFFTyxJQUFNLFFBQVE7QUFBQSxFQUNuQixlQUFlLG9CQUFvQjtBQUFBLElBQ2pDLGNBQWM7QUFBQSxJQUNkLGNBQWM7QUFBQSxJQUNkLGVBQWUsQ0FBQyxVQUFVLFNBQVMsT0FBTyxFQUFFO0FBQUEsRUFDOUMsQ0FBQztBQUFBLEVBRUQsS0FBSyxhQUFhO0FBQUEsSUFDaEIsZUFBZTtBQUFBLElBQ2YsbUJBQW1CO0FBQUEsSUFDbkIsZUFBZTtBQUFBLElBQ2YsbUJBQW1CO0FBQUEsRUFDckIsQ0FBQztBQUFBLEVBRUQsU0FBUyxhQUFhO0FBQUEsSUFDcEIsZUFBZTtBQUFBLElBQ2YsbUJBQW1CO0FBQUEsSUFDbkIsZUFBZTtBQUFBLElBQ2YsbUJBQW1CO0FBQUEsSUFDbkIsZUFBZSxDQUFDLFVBQVUsUUFBUTtBQUFBLEVBQ3BDLENBQUM7QUFBQSxFQUVELE9BQU8sYUFBYTtBQUFBLElBQ2xCLGVBQWU7QUFBQSxJQUNmLG1CQUFtQjtBQUFBLElBQ25CLGVBQWU7QUFBQSxJQUNmLG1CQUFtQjtBQUFBLEVBQ3JCLENBQUM7QUFBQSxFQUVELEtBQUssYUFBYTtBQUFBLElBQ2hCLGVBQWU7QUFBQSxJQUNmLG1CQUFtQjtBQUFBLElBQ25CLGVBQWU7QUFBQSxJQUNmLG1CQUFtQjtBQUFBLEVBQ3JCLENBQUM7QUFBQSxFQUVELFdBQVcsYUFBYTtBQUFBLElBQ3RCLGVBQWU7QUFBQSxJQUNmLG1CQUFtQjtBQUFBLElBQ25CLGVBQWU7QUFBQSxJQUNmLG1CQUFtQjtBQUFBLEVBQ3JCLENBQUM7QUFDSDs7O0FDckhPLElBQU0sT0FBTztBQUFBLEVBQ2xCLE1BQU07QUFBQSxFQUNOO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0EsU0FBUztBQUFBLElBQ1AsY0FBYztBQUFBLElBQ2QsdUJBQXVCO0FBQUEsRUFDekI7QUFDRjs7QUNDTyxTQUFTLFlBQVksQ0FBQyxNQUFNLFNBQVM7QUFBQSxFQUMxQyxNQUFNLFFBQVEsT0FBTyxNQUFNLFNBQVMsRUFBRTtBQUFBLEVBQ3RDLE1BQU0sT0FBTyx5QkFBeUIsT0FBTyxZQUFZLEtBQUssQ0FBQztBQUFBLEVBQy9ELE1BQU0sWUFBWSxPQUFPO0FBQUEsRUFDekIsT0FBTztBQUFBOzs7QUNERixTQUFTLFVBQVUsQ0FBQyxNQUFNLFNBQVM7QUFBQSxFQUN4QyxNQUFNLFFBQVEsT0FBTyxNQUFNLFNBQVMsRUFBRTtBQUFBLEVBQ3RDLE1BQU0sT0FBTyxDQUFDLGVBQWUsS0FBSyxJQUFJLENBQUMsbUJBQW1CLEtBQUs7QUFBQSxFQUsvRCxPQUFPLEtBQUssTUFBTSxPQUFPLGtCQUFrQixJQUFJO0FBQUE7OztBQ08xQyxTQUFTLFdBQVcsQ0FBQyxNQUFNLFNBQVM7QUFBQSxFQUN6QyxNQUFNLFFBQVEsT0FBTyxNQUFNLFNBQVMsRUFBRTtBQUFBLEVBQ3RDLE1BQU0sT0FBTyxNQUFNLFlBQVk7QUFBQSxFQUUvQixNQUFNLGtCQUFpQixrQkFBa0I7QUFBQSxFQUN6QyxNQUFNLHdCQUNKLFNBQVMseUJBQ1QsU0FBUyxRQUFRLFNBQVMseUJBQzFCLGdCQUFlLHlCQUNmLGdCQUFlLFFBQVEsU0FBUyx5QkFDaEM7QUFBQSxFQUVGLE1BQU0sc0JBQXNCLGNBQWMsU0FBUyxNQUFNLE1BQU0sQ0FBQztBQUFBLEVBQ2hFLG9CQUFvQixZQUFZLE9BQU8sR0FBRyxHQUFHLHFCQUFxQjtBQUFBLEVBQ2xFLG9CQUFvQixTQUFTLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFBQSxFQUN2QyxNQUFNLGtCQUFrQixZQUFZLHFCQUFxQixPQUFPO0FBQUEsRUFFaEUsTUFBTSxzQkFBc0IsY0FBYyxTQUFTLE1BQU0sTUFBTSxDQUFDO0FBQUEsRUFDaEUsb0JBQW9CLFlBQVksTUFBTSxHQUFHLHFCQUFxQjtBQUFBLEVBQzlELG9CQUFvQixTQUFTLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFBQSxFQUN2QyxNQUFNLGtCQUFrQixZQUFZLHFCQUFxQixPQUFPO0FBQUEsRUFFaEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUI7QUFBQSxJQUM5QixPQUFPLE9BQU87QUFBQSxFQUNoQixFQUFPLFNBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCO0FBQUEsSUFDckMsT0FBTztBQUFBLEVBQ1QsRUFBTztBQUFBLElBQ0wsT0FBTyxPQUFPO0FBQUE7QUFBQTs7O0FDeEJYLFNBQVMsZUFBZSxDQUFDLE1BQU0sU0FBUztBQUFBLEVBQzdDLE1BQU0sa0JBQWlCLGtCQUFrQjtBQUFBLEVBQ3pDLE1BQU0sd0JBQ0osU0FBUyx5QkFDVCxTQUFTLFFBQVEsU0FBUyx5QkFDMUIsZ0JBQWUseUJBQ2YsZ0JBQWUsUUFBUSxTQUFTLHlCQUNoQztBQUFBLEVBRUYsTUFBTSxPQUFPLFlBQVksTUFBTSxPQUFPO0FBQUEsRUFDdEMsTUFBTSxZQUFZLGNBQWMsU0FBUyxNQUFNLE1BQU0sQ0FBQztBQUFBLEVBQ3RELFVBQVUsWUFBWSxNQUFNLEdBQUcscUJBQXFCO0FBQUEsRUFDcEQsVUFBVSxTQUFTLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFBQSxFQUM3QixNQUFNLFFBQVEsWUFBWSxXQUFXLE9BQU87QUFBQSxFQUM1QyxPQUFPO0FBQUE7OztBQ2pCRixTQUFTLE9BQU8sQ0FBQyxNQUFNLFNBQVM7QUFBQSxFQUNyQyxNQUFNLFFBQVEsT0FBTyxNQUFNLFNBQVMsRUFBRTtBQUFBLEVBQ3RDLE1BQU0sT0FBTyxDQUFDLFlBQVksT0FBTyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsT0FBTyxPQUFPO0FBQUEsRUFLM0UsT0FBTyxLQUFLLE1BQU0sT0FBTyxrQkFBa0IsSUFBSTtBQUFBOzs7QUNsRDFDLFNBQVMsZUFBZSxDQUFDLFFBQVEsY0FBYztBQUFBLEVBQ3BELE1BQU0sT0FBTyxTQUFTLElBQUksTUFBTTtBQUFBLEVBQ2hDLE1BQU0sU0FBUyxLQUFLLElBQUksTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLGNBQWMsR0FBRztBQUFBLEVBQ3JFLE9BQU8sT0FBTztBQUFBOzs7QUNZVCxJQUFNLGtCQUFrQjtBQUFBLEVBRTdCLENBQUMsQ0FBQyxNQUFNLE9BQU87QUFBQSxJQVViLE1BQU0sYUFBYSxLQUFLLFlBQVk7QUFBQSxJQUVwQyxNQUFNLE9BQU8sYUFBYSxJQUFJLGFBQWEsSUFBSTtBQUFBLElBQy9DLE9BQU8sZ0JBQWdCLFVBQVUsT0FBTyxPQUFPLE1BQU0sTUFBTSxNQUFNLE1BQU07QUFBQTtBQUFBLEVBSXpFLENBQUMsQ0FBQyxNQUFNLE9BQU87QUFBQSxJQUNiLE1BQU0sUUFBUSxLQUFLLFNBQVM7QUFBQSxJQUM1QixPQUFPLFVBQVUsTUFBTSxPQUFPLFFBQVEsQ0FBQyxJQUFJLGdCQUFnQixRQUFRLEdBQUcsQ0FBQztBQUFBO0FBQUEsRUFJekUsQ0FBQyxDQUFDLE1BQU0sT0FBTztBQUFBLElBQ2IsT0FBTyxnQkFBZ0IsS0FBSyxRQUFRLEdBQUcsTUFBTSxNQUFNO0FBQUE7QUFBQSxFQUlyRCxDQUFDLENBQUMsTUFBTSxPQUFPO0FBQUEsSUFDYixNQUFNLHFCQUFxQixLQUFLLFNBQVMsSUFBSSxNQUFNLElBQUksT0FBTztBQUFBLElBRTlELFFBQVE7QUFBQSxXQUNEO0FBQUEsV0FDQTtBQUFBLFFBQ0gsT0FBTyxtQkFBbUIsWUFBWTtBQUFBLFdBQ25DO0FBQUEsUUFDSCxPQUFPO0FBQUEsV0FDSjtBQUFBLFFBQ0gsT0FBTyxtQkFBbUI7QUFBQSxXQUN2QjtBQUFBO0FBQUEsUUFFSCxPQUFPLHVCQUF1QixPQUFPLFNBQVM7QUFBQTtBQUFBO0FBQUEsRUFLcEQsQ0FBQyxDQUFDLE1BQU0sT0FBTztBQUFBLElBQ2IsT0FBTyxnQkFBZ0IsS0FBSyxTQUFTLElBQUksTUFBTSxJQUFJLE1BQU0sTUFBTTtBQUFBO0FBQUEsRUFJakUsQ0FBQyxDQUFDLE1BQU0sT0FBTztBQUFBLElBQ2IsT0FBTyxnQkFBZ0IsS0FBSyxTQUFTLEdBQUcsTUFBTSxNQUFNO0FBQUE7QUFBQSxFQUl0RCxDQUFDLENBQUMsTUFBTSxPQUFPO0FBQUEsSUFDYixPQUFPLGdCQUFnQixLQUFLLFdBQVcsR0FBRyxNQUFNLE1BQU07QUFBQTtBQUFBLEVBSXhELENBQUMsQ0FBQyxNQUFNLE9BQU87QUFBQSxJQUNiLE9BQU8sZ0JBQWdCLEtBQUssV0FBVyxHQUFHLE1BQU0sTUFBTTtBQUFBO0FBQUEsRUFJeEQsQ0FBQyxDQUFDLE1BQU0sT0FBTztBQUFBLElBQ2IsTUFBTSxpQkFBaUIsTUFBTTtBQUFBLElBQzdCLE1BQU0sZUFBZSxLQUFLLGdCQUFnQjtBQUFBLElBQzFDLE1BQU0sb0JBQW9CLEtBQUssTUFDN0IsZUFBZSxLQUFLLElBQUksSUFBSSxpQkFBaUIsQ0FBQyxDQUNoRDtBQUFBLElBQ0EsT0FBTyxnQkFBZ0IsbUJBQW1CLE1BQU0sTUFBTTtBQUFBO0FBRTFEOzs7QUNsRkEsSUFBTSxnQkFBZ0I7QUFBQSxFQUNwQixJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFDSixVQUFVO0FBQUEsRUFDVixNQUFNO0FBQUEsRUFDTixTQUFTO0FBQUEsRUFDVCxXQUFXO0FBQUEsRUFDWCxTQUFTO0FBQUEsRUFDVCxPQUFPO0FBQ1Q7QUFnRE8sSUFBTSxhQUFhO0FBQUEsRUFFeEIsR0FBRyxRQUFTLENBQUMsTUFBTSxPQUFPLFdBQVU7QUFBQSxJQUNsQyxNQUFNLE1BQU0sS0FBSyxZQUFZLElBQUksSUFBSSxJQUFJO0FBQUEsSUFDekMsUUFBUTtBQUFBLFdBRUQ7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFFBQ0gsT0FBTyxVQUFTLElBQUksS0FBSyxFQUFFLE9BQU8sY0FBYyxDQUFDO0FBQUEsV0FFOUM7QUFBQSxRQUNILE9BQU8sVUFBUyxJQUFJLEtBQUssRUFBRSxPQUFPLFNBQVMsQ0FBQztBQUFBLFdBRXpDO0FBQUE7QUFBQSxRQUVILE9BQU8sVUFBUyxJQUFJLEtBQUssRUFBRSxPQUFPLE9BQU8sQ0FBQztBQUFBO0FBQUE7QUFBQSxFQUtoRCxHQUFHLFFBQVMsQ0FBQyxNQUFNLE9BQU8sV0FBVTtBQUFBLElBRWxDLElBQUksVUFBVSxNQUFNO0FBQUEsTUFDbEIsTUFBTSxhQUFhLEtBQUssWUFBWTtBQUFBLE1BRXBDLE1BQU0sT0FBTyxhQUFhLElBQUksYUFBYSxJQUFJO0FBQUEsTUFDL0MsT0FBTyxVQUFTLGNBQWMsTUFBTSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQUEsSUFDdEQ7QUFBQSxJQUVBLE9BQU8sZ0JBQWdCLEVBQUUsTUFBTSxLQUFLO0FBQUE7QUFBQSxFQUl0QyxHQUFHLFFBQVMsQ0FBQyxNQUFNLE9BQU8sV0FBVSxTQUFTO0FBQUEsSUFDM0MsTUFBTSxpQkFBaUIsWUFBWSxNQUFNLE9BQU87QUFBQSxJQUVoRCxNQUFNLFdBQVcsaUJBQWlCLElBQUksaUJBQWlCLElBQUk7QUFBQSxJQUczRCxJQUFJLFVBQVUsTUFBTTtBQUFBLE1BQ2xCLE1BQU0sZUFBZSxXQUFXO0FBQUEsTUFDaEMsT0FBTyxnQkFBZ0IsY0FBYyxDQUFDO0FBQUEsSUFDeEM7QUFBQSxJQUdBLElBQUksVUFBVSxNQUFNO0FBQUEsTUFDbEIsT0FBTyxVQUFTLGNBQWMsVUFBVSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQUEsSUFDMUQ7QUFBQSxJQUdBLE9BQU8sZ0JBQWdCLFVBQVUsTUFBTSxNQUFNO0FBQUE7QUFBQSxFQUkvQyxHQUFHLFFBQVMsQ0FBQyxNQUFNLE9BQU87QUFBQSxJQUN4QixNQUFNLGNBQWMsZUFBZSxJQUFJO0FBQUEsSUFHdkMsT0FBTyxnQkFBZ0IsYUFBYSxNQUFNLE1BQU07QUFBQTtBQUFBLEVBWWxELEdBQUcsUUFBUyxDQUFDLE1BQU0sT0FBTztBQUFBLElBQ3hCLE1BQU0sT0FBTyxLQUFLLFlBQVk7QUFBQSxJQUM5QixPQUFPLGdCQUFnQixNQUFNLE1BQU0sTUFBTTtBQUFBO0FBQUEsRUFJM0MsR0FBRyxRQUFTLENBQUMsTUFBTSxPQUFPLFdBQVU7QUFBQSxJQUNsQyxNQUFNLFVBQVUsS0FBSyxNQUFNLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQztBQUFBLElBQ25ELFFBQVE7QUFBQSxXQUVEO0FBQUEsUUFDSCxPQUFPLE9BQU8sT0FBTztBQUFBLFdBRWxCO0FBQUEsUUFDSCxPQUFPLGdCQUFnQixTQUFTLENBQUM7QUFBQSxXQUU5QjtBQUFBLFFBQ0gsT0FBTyxVQUFTLGNBQWMsU0FBUyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQUEsV0FFdkQ7QUFBQSxRQUNILE9BQU8sVUFBUyxRQUFRLFNBQVM7QUFBQSxVQUMvQixPQUFPO0FBQUEsVUFDUCxTQUFTO0FBQUEsUUFDWCxDQUFDO0FBQUEsV0FFRTtBQUFBLFFBQ0gsT0FBTyxVQUFTLFFBQVEsU0FBUztBQUFBLFVBQy9CLE9BQU87QUFBQSxVQUNQLFNBQVM7QUFBQSxRQUNYLENBQUM7QUFBQSxXQUVFO0FBQUE7QUFBQSxRQUVILE9BQU8sVUFBUyxRQUFRLFNBQVM7QUFBQSxVQUMvQixPQUFPO0FBQUEsVUFDUCxTQUFTO0FBQUEsUUFDWCxDQUFDO0FBQUE7QUFBQTtBQUFBLEVBS1AsR0FBRyxRQUFTLENBQUMsTUFBTSxPQUFPLFdBQVU7QUFBQSxJQUNsQyxNQUFNLFVBQVUsS0FBSyxNQUFNLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQztBQUFBLElBQ25ELFFBQVE7QUFBQSxXQUVEO0FBQUEsUUFDSCxPQUFPLE9BQU8sT0FBTztBQUFBLFdBRWxCO0FBQUEsUUFDSCxPQUFPLGdCQUFnQixTQUFTLENBQUM7QUFBQSxXQUU5QjtBQUFBLFFBQ0gsT0FBTyxVQUFTLGNBQWMsU0FBUyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQUEsV0FFdkQ7QUFBQSxRQUNILE9BQU8sVUFBUyxRQUFRLFNBQVM7QUFBQSxVQUMvQixPQUFPO0FBQUEsVUFDUCxTQUFTO0FBQUEsUUFDWCxDQUFDO0FBQUEsV0FFRTtBQUFBLFFBQ0gsT0FBTyxVQUFTLFFBQVEsU0FBUztBQUFBLFVBQy9CLE9BQU87QUFBQSxVQUNQLFNBQVM7QUFBQSxRQUNYLENBQUM7QUFBQSxXQUVFO0FBQUE7QUFBQSxRQUVILE9BQU8sVUFBUyxRQUFRLFNBQVM7QUFBQSxVQUMvQixPQUFPO0FBQUEsVUFDUCxTQUFTO0FBQUEsUUFDWCxDQUFDO0FBQUE7QUFBQTtBQUFBLEVBS1AsR0FBRyxRQUFTLENBQUMsTUFBTSxPQUFPLFdBQVU7QUFBQSxJQUNsQyxNQUFNLFFBQVEsS0FBSyxTQUFTO0FBQUEsSUFDNUIsUUFBUTtBQUFBLFdBQ0Q7QUFBQSxXQUNBO0FBQUEsUUFDSCxPQUFPLGdCQUFnQixFQUFFLE1BQU0sS0FBSztBQUFBLFdBRWpDO0FBQUEsUUFDSCxPQUFPLFVBQVMsY0FBYyxRQUFRLEdBQUcsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUFBLFdBRXZEO0FBQUEsUUFDSCxPQUFPLFVBQVMsTUFBTSxPQUFPO0FBQUEsVUFDM0IsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFFBQ1gsQ0FBQztBQUFBLFdBRUU7QUFBQSxRQUNILE9BQU8sVUFBUyxNQUFNLE9BQU87QUFBQSxVQUMzQixPQUFPO0FBQUEsVUFDUCxTQUFTO0FBQUEsUUFDWCxDQUFDO0FBQUEsV0FFRTtBQUFBO0FBQUEsUUFFSCxPQUFPLFVBQVMsTUFBTSxPQUFPLEVBQUUsT0FBTyxRQUFRLFNBQVMsYUFBYSxDQUFDO0FBQUE7QUFBQTtBQUFBLEVBSzNFLEdBQUcsUUFBUyxDQUFDLE1BQU0sT0FBTyxXQUFVO0FBQUEsSUFDbEMsTUFBTSxRQUFRLEtBQUssU0FBUztBQUFBLElBQzVCLFFBQVE7QUFBQSxXQUVEO0FBQUEsUUFDSCxPQUFPLE9BQU8sUUFBUSxDQUFDO0FBQUEsV0FFcEI7QUFBQSxRQUNILE9BQU8sZ0JBQWdCLFFBQVEsR0FBRyxDQUFDO0FBQUEsV0FFaEM7QUFBQSxRQUNILE9BQU8sVUFBUyxjQUFjLFFBQVEsR0FBRyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQUEsV0FFdkQ7QUFBQSxRQUNILE9BQU8sVUFBUyxNQUFNLE9BQU87QUFBQSxVQUMzQixPQUFPO0FBQUEsVUFDUCxTQUFTO0FBQUEsUUFDWCxDQUFDO0FBQUEsV0FFRTtBQUFBLFFBQ0gsT0FBTyxVQUFTLE1BQU0sT0FBTztBQUFBLFVBQzNCLE9BQU87QUFBQSxVQUNQLFNBQVM7QUFBQSxRQUNYLENBQUM7QUFBQSxXQUVFO0FBQUE7QUFBQSxRQUVILE9BQU8sVUFBUyxNQUFNLE9BQU8sRUFBRSxPQUFPLFFBQVEsU0FBUyxhQUFhLENBQUM7QUFBQTtBQUFBO0FBQUEsRUFLM0UsR0FBRyxRQUFTLENBQUMsTUFBTSxPQUFPLFdBQVUsU0FBUztBQUFBLElBQzNDLE1BQU0sT0FBTyxRQUFRLE1BQU0sT0FBTztBQUFBLElBRWxDLElBQUksVUFBVSxNQUFNO0FBQUEsTUFDbEIsT0FBTyxVQUFTLGNBQWMsTUFBTSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQUEsSUFDdEQ7QUFBQSxJQUVBLE9BQU8sZ0JBQWdCLE1BQU0sTUFBTSxNQUFNO0FBQUE7QUFBQSxFQUkzQyxHQUFHLFFBQVMsQ0FBQyxNQUFNLE9BQU8sV0FBVTtBQUFBLElBQ2xDLE1BQU0sVUFBVSxXQUFXLElBQUk7QUFBQSxJQUUvQixJQUFJLFVBQVUsTUFBTTtBQUFBLE1BQ2xCLE9BQU8sVUFBUyxjQUFjLFNBQVMsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUFBLElBQ3pEO0FBQUEsSUFFQSxPQUFPLGdCQUFnQixTQUFTLE1BQU0sTUFBTTtBQUFBO0FBQUEsRUFJOUMsR0FBRyxRQUFTLENBQUMsTUFBTSxPQUFPLFdBQVU7QUFBQSxJQUNsQyxJQUFJLFVBQVUsTUFBTTtBQUFBLE1BQ2xCLE9BQU8sVUFBUyxjQUFjLEtBQUssUUFBUSxHQUFHLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFBQSxJQUNoRTtBQUFBLElBRUEsT0FBTyxnQkFBZ0IsRUFBRSxNQUFNLEtBQUs7QUFBQTtBQUFBLEVBSXRDLEdBQUcsUUFBUyxDQUFDLE1BQU0sT0FBTyxXQUFVO0FBQUEsSUFDbEMsTUFBTSxZQUFZLGFBQWEsSUFBSTtBQUFBLElBRW5DLElBQUksVUFBVSxNQUFNO0FBQUEsTUFDbEIsT0FBTyxVQUFTLGNBQWMsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQUEsSUFDaEU7QUFBQSxJQUVBLE9BQU8sZ0JBQWdCLFdBQVcsTUFBTSxNQUFNO0FBQUE7QUFBQSxFQUloRCxHQUFHLFFBQVMsQ0FBQyxNQUFNLE9BQU8sV0FBVTtBQUFBLElBQ2xDLE1BQU0sWUFBWSxLQUFLLE9BQU87QUFBQSxJQUM5QixRQUFRO0FBQUEsV0FFRDtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsUUFDSCxPQUFPLFVBQVMsSUFBSSxXQUFXO0FBQUEsVUFDN0IsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFFBQ1gsQ0FBQztBQUFBLFdBRUU7QUFBQSxRQUNILE9BQU8sVUFBUyxJQUFJLFdBQVc7QUFBQSxVQUM3QixPQUFPO0FBQUEsVUFDUCxTQUFTO0FBQUEsUUFDWCxDQUFDO0FBQUEsV0FFRTtBQUFBLFFBQ0gsT0FBTyxVQUFTLElBQUksV0FBVztBQUFBLFVBQzdCLE9BQU87QUFBQSxVQUNQLFNBQVM7QUFBQSxRQUNYLENBQUM7QUFBQSxXQUVFO0FBQUE7QUFBQSxRQUVILE9BQU8sVUFBUyxJQUFJLFdBQVc7QUFBQSxVQUM3QixPQUFPO0FBQUEsVUFDUCxTQUFTO0FBQUEsUUFDWCxDQUFDO0FBQUE7QUFBQTtBQUFBLEVBS1AsR0FBRyxRQUFTLENBQUMsTUFBTSxPQUFPLFdBQVUsU0FBUztBQUFBLElBQzNDLE1BQU0sWUFBWSxLQUFLLE9BQU87QUFBQSxJQUM5QixNQUFNLGtCQUFrQixZQUFZLFFBQVEsZUFBZSxLQUFLLEtBQUs7QUFBQSxJQUNyRSxRQUFRO0FBQUEsV0FFRDtBQUFBLFFBQ0gsT0FBTyxPQUFPLGNBQWM7QUFBQSxXQUV6QjtBQUFBLFFBQ0gsT0FBTyxnQkFBZ0IsZ0JBQWdCLENBQUM7QUFBQSxXQUVyQztBQUFBLFFBQ0gsT0FBTyxVQUFTLGNBQWMsZ0JBQWdCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFBQSxXQUMxRDtBQUFBLFFBQ0gsT0FBTyxVQUFTLElBQUksV0FBVztBQUFBLFVBQzdCLE9BQU87QUFBQSxVQUNQLFNBQVM7QUFBQSxRQUNYLENBQUM7QUFBQSxXQUVFO0FBQUEsUUFDSCxPQUFPLFVBQVMsSUFBSSxXQUFXO0FBQUEsVUFDN0IsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFFBQ1gsQ0FBQztBQUFBLFdBRUU7QUFBQSxRQUNILE9BQU8sVUFBUyxJQUFJLFdBQVc7QUFBQSxVQUM3QixPQUFPO0FBQUEsVUFDUCxTQUFTO0FBQUEsUUFDWCxDQUFDO0FBQUEsV0FFRTtBQUFBO0FBQUEsUUFFSCxPQUFPLFVBQVMsSUFBSSxXQUFXO0FBQUEsVUFDN0IsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFFBQ1gsQ0FBQztBQUFBO0FBQUE7QUFBQSxFQUtQLEdBQUcsUUFBUyxDQUFDLE1BQU0sT0FBTyxXQUFVLFNBQVM7QUFBQSxJQUMzQyxNQUFNLFlBQVksS0FBSyxPQUFPO0FBQUEsSUFDOUIsTUFBTSxrQkFBa0IsWUFBWSxRQUFRLGVBQWUsS0FBSyxLQUFLO0FBQUEsSUFDckUsUUFBUTtBQUFBLFdBRUQ7QUFBQSxRQUNILE9BQU8sT0FBTyxjQUFjO0FBQUEsV0FFekI7QUFBQSxRQUNILE9BQU8sZ0JBQWdCLGdCQUFnQixNQUFNLE1BQU07QUFBQSxXQUVoRDtBQUFBLFFBQ0gsT0FBTyxVQUFTLGNBQWMsZ0JBQWdCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFBQSxXQUMxRDtBQUFBLFFBQ0gsT0FBTyxVQUFTLElBQUksV0FBVztBQUFBLFVBQzdCLE9BQU87QUFBQSxVQUNQLFNBQVM7QUFBQSxRQUNYLENBQUM7QUFBQSxXQUVFO0FBQUEsUUFDSCxPQUFPLFVBQVMsSUFBSSxXQUFXO0FBQUEsVUFDN0IsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFFBQ1gsQ0FBQztBQUFBLFdBRUU7QUFBQSxRQUNILE9BQU8sVUFBUyxJQUFJLFdBQVc7QUFBQSxVQUM3QixPQUFPO0FBQUEsVUFDUCxTQUFTO0FBQUEsUUFDWCxDQUFDO0FBQUEsV0FFRTtBQUFBO0FBQUEsUUFFSCxPQUFPLFVBQVMsSUFBSSxXQUFXO0FBQUEsVUFDN0IsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFFBQ1gsQ0FBQztBQUFBO0FBQUE7QUFBQSxFQUtQLEdBQUcsUUFBUyxDQUFDLE1BQU0sT0FBTyxXQUFVO0FBQUEsSUFDbEMsTUFBTSxZQUFZLEtBQUssT0FBTztBQUFBLElBQzlCLE1BQU0sZUFBZSxjQUFjLElBQUksSUFBSTtBQUFBLElBQzNDLFFBQVE7QUFBQSxXQUVEO0FBQUEsUUFDSCxPQUFPLE9BQU8sWUFBWTtBQUFBLFdBRXZCO0FBQUEsUUFDSCxPQUFPLGdCQUFnQixjQUFjLE1BQU0sTUFBTTtBQUFBLFdBRTlDO0FBQUEsUUFDSCxPQUFPLFVBQVMsY0FBYyxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFBQSxXQUV4RDtBQUFBLFFBQ0gsT0FBTyxVQUFTLElBQUksV0FBVztBQUFBLFVBQzdCLE9BQU87QUFBQSxVQUNQLFNBQVM7QUFBQSxRQUNYLENBQUM7QUFBQSxXQUVFO0FBQUEsUUFDSCxPQUFPLFVBQVMsSUFBSSxXQUFXO0FBQUEsVUFDN0IsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFFBQ1gsQ0FBQztBQUFBLFdBRUU7QUFBQSxRQUNILE9BQU8sVUFBUyxJQUFJLFdBQVc7QUFBQSxVQUM3QixPQUFPO0FBQUEsVUFDUCxTQUFTO0FBQUEsUUFDWCxDQUFDO0FBQUEsV0FFRTtBQUFBO0FBQUEsUUFFSCxPQUFPLFVBQVMsSUFBSSxXQUFXO0FBQUEsVUFDN0IsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFFBQ1gsQ0FBQztBQUFBO0FBQUE7QUFBQSxFQUtQLEdBQUcsUUFBUyxDQUFDLE1BQU0sT0FBTyxXQUFVO0FBQUEsSUFDbEMsTUFBTSxRQUFRLEtBQUssU0FBUztBQUFBLElBQzVCLE1BQU0scUJBQXFCLFFBQVEsTUFBTSxJQUFJLE9BQU87QUFBQSxJQUVwRCxRQUFRO0FBQUEsV0FDRDtBQUFBLFdBQ0E7QUFBQSxRQUNILE9BQU8sVUFBUyxVQUFVLG9CQUFvQjtBQUFBLFVBQzVDLE9BQU87QUFBQSxVQUNQLFNBQVM7QUFBQSxRQUNYLENBQUM7QUFBQSxXQUNFO0FBQUEsUUFDSCxPQUFPLFVBQ0osVUFBVSxvQkFBb0I7QUFBQSxVQUM3QixPQUFPO0FBQUEsVUFDUCxTQUFTO0FBQUEsUUFDWCxDQUFDLEVBQ0EsWUFBWTtBQUFBLFdBQ1o7QUFBQSxRQUNILE9BQU8sVUFBUyxVQUFVLG9CQUFvQjtBQUFBLFVBQzVDLE9BQU87QUFBQSxVQUNQLFNBQVM7QUFBQSxRQUNYLENBQUM7QUFBQSxXQUNFO0FBQUE7QUFBQSxRQUVILE9BQU8sVUFBUyxVQUFVLG9CQUFvQjtBQUFBLFVBQzVDLE9BQU87QUFBQSxVQUNQLFNBQVM7QUFBQSxRQUNYLENBQUM7QUFBQTtBQUFBO0FBQUEsRUFLUCxHQUFHLFFBQVMsQ0FBQyxNQUFNLE9BQU8sV0FBVTtBQUFBLElBQ2xDLE1BQU0sUUFBUSxLQUFLLFNBQVM7QUFBQSxJQUM1QixJQUFJO0FBQUEsSUFDSixJQUFJLFVBQVUsSUFBSTtBQUFBLE1BQ2hCLHFCQUFxQixjQUFjO0FBQUEsSUFDckMsRUFBTyxTQUFJLFVBQVUsR0FBRztBQUFBLE1BQ3RCLHFCQUFxQixjQUFjO0FBQUEsSUFDckMsRUFBTztBQUFBLE1BQ0wscUJBQXFCLFFBQVEsTUFBTSxJQUFJLE9BQU87QUFBQTtBQUFBLElBR2hELFFBQVE7QUFBQSxXQUNEO0FBQUEsV0FDQTtBQUFBLFFBQ0gsT0FBTyxVQUFTLFVBQVUsb0JBQW9CO0FBQUEsVUFDNUMsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFFBQ1gsQ0FBQztBQUFBLFdBQ0U7QUFBQSxRQUNILE9BQU8sVUFDSixVQUFVLG9CQUFvQjtBQUFBLFVBQzdCLE9BQU87QUFBQSxVQUNQLFNBQVM7QUFBQSxRQUNYLENBQUMsRUFDQSxZQUFZO0FBQUEsV0FDWjtBQUFBLFFBQ0gsT0FBTyxVQUFTLFVBQVUsb0JBQW9CO0FBQUEsVUFDNUMsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFFBQ1gsQ0FBQztBQUFBLFdBQ0U7QUFBQTtBQUFBLFFBRUgsT0FBTyxVQUFTLFVBQVUsb0JBQW9CO0FBQUEsVUFDNUMsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFFBQ1gsQ0FBQztBQUFBO0FBQUE7QUFBQSxFQUtQLEdBQUcsUUFBUyxDQUFDLE1BQU0sT0FBTyxXQUFVO0FBQUEsSUFDbEMsTUFBTSxRQUFRLEtBQUssU0FBUztBQUFBLElBQzVCLElBQUk7QUFBQSxJQUNKLElBQUksU0FBUyxJQUFJO0FBQUEsTUFDZixxQkFBcUIsY0FBYztBQUFBLElBQ3JDLEVBQU8sU0FBSSxTQUFTLElBQUk7QUFBQSxNQUN0QixxQkFBcUIsY0FBYztBQUFBLElBQ3JDLEVBQU8sU0FBSSxTQUFTLEdBQUc7QUFBQSxNQUNyQixxQkFBcUIsY0FBYztBQUFBLElBQ3JDLEVBQU87QUFBQSxNQUNMLHFCQUFxQixjQUFjO0FBQUE7QUFBQSxJQUdyQyxRQUFRO0FBQUEsV0FDRDtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsUUFDSCxPQUFPLFVBQVMsVUFBVSxvQkFBb0I7QUFBQSxVQUM1QyxPQUFPO0FBQUEsVUFDUCxTQUFTO0FBQUEsUUFDWCxDQUFDO0FBQUEsV0FDRTtBQUFBLFFBQ0gsT0FBTyxVQUFTLFVBQVUsb0JBQW9CO0FBQUEsVUFDNUMsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFFBQ1gsQ0FBQztBQUFBLFdBQ0U7QUFBQTtBQUFBLFFBRUgsT0FBTyxVQUFTLFVBQVUsb0JBQW9CO0FBQUEsVUFDNUMsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFFBQ1gsQ0FBQztBQUFBO0FBQUE7QUFBQSxFQUtQLEdBQUcsUUFBUyxDQUFDLE1BQU0sT0FBTyxXQUFVO0FBQUEsSUFDbEMsSUFBSSxVQUFVLE1BQU07QUFBQSxNQUNsQixJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUk7QUFBQSxNQUM5QixJQUFJLFVBQVU7QUFBQSxRQUFHLFFBQVE7QUFBQSxNQUN6QixPQUFPLFVBQVMsY0FBYyxPQUFPLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFBQSxJQUN2RDtBQUFBLElBRUEsT0FBTyxnQkFBZ0IsRUFBRSxNQUFNLEtBQUs7QUFBQTtBQUFBLEVBSXRDLEdBQUcsUUFBUyxDQUFDLE1BQU0sT0FBTyxXQUFVO0FBQUEsSUFDbEMsSUFBSSxVQUFVLE1BQU07QUFBQSxNQUNsQixPQUFPLFVBQVMsY0FBYyxLQUFLLFNBQVMsR0FBRyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQUEsSUFDakU7QUFBQSxJQUVBLE9BQU8sZ0JBQWdCLEVBQUUsTUFBTSxLQUFLO0FBQUE7QUFBQSxFQUl0QyxHQUFHLFFBQVMsQ0FBQyxNQUFNLE9BQU8sV0FBVTtBQUFBLElBQ2xDLE1BQU0sUUFBUSxLQUFLLFNBQVMsSUFBSTtBQUFBLElBRWhDLElBQUksVUFBVSxNQUFNO0FBQUEsTUFDbEIsT0FBTyxVQUFTLGNBQWMsT0FBTyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQUEsSUFDdkQ7QUFBQSxJQUVBLE9BQU8sZ0JBQWdCLE9BQU8sTUFBTSxNQUFNO0FBQUE7QUFBQSxFQUk1QyxHQUFHLFFBQVMsQ0FBQyxNQUFNLE9BQU8sV0FBVTtBQUFBLElBQ2xDLElBQUksUUFBUSxLQUFLLFNBQVM7QUFBQSxJQUMxQixJQUFJLFVBQVU7QUFBQSxNQUFHLFFBQVE7QUFBQSxJQUV6QixJQUFJLFVBQVUsTUFBTTtBQUFBLE1BQ2xCLE9BQU8sVUFBUyxjQUFjLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUFBLElBQ3ZEO0FBQUEsSUFFQSxPQUFPLGdCQUFnQixPQUFPLE1BQU0sTUFBTTtBQUFBO0FBQUEsRUFJNUMsR0FBRyxRQUFTLENBQUMsTUFBTSxPQUFPLFdBQVU7QUFBQSxJQUNsQyxJQUFJLFVBQVUsTUFBTTtBQUFBLE1BQ2xCLE9BQU8sVUFBUyxjQUFjLEtBQUssV0FBVyxHQUFHLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFBQSxJQUNyRTtBQUFBLElBRUEsT0FBTyxnQkFBZ0IsRUFBRSxNQUFNLEtBQUs7QUFBQTtBQUFBLEVBSXRDLEdBQUcsUUFBUyxDQUFDLE1BQU0sT0FBTyxXQUFVO0FBQUEsSUFDbEMsSUFBSSxVQUFVLE1BQU07QUFBQSxNQUNsQixPQUFPLFVBQVMsY0FBYyxLQUFLLFdBQVcsR0FBRyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQUEsSUFDckU7QUFBQSxJQUVBLE9BQU8sZ0JBQWdCLEVBQUUsTUFBTSxLQUFLO0FBQUE7QUFBQSxFQUl0QyxHQUFHLFFBQVMsQ0FBQyxNQUFNLE9BQU87QUFBQSxJQUN4QixPQUFPLGdCQUFnQixFQUFFLE1BQU0sS0FBSztBQUFBO0FBQUEsRUFJdEMsR0FBRyxRQUFTLENBQUMsTUFBTSxPQUFPLFdBQVc7QUFBQSxJQUNuQyxNQUFNLGlCQUFpQixLQUFLLGtCQUFrQjtBQUFBLElBRTlDLElBQUksbUJBQW1CLEdBQUc7QUFBQSxNQUN4QixPQUFPO0FBQUEsSUFDVDtBQUFBLElBRUEsUUFBUTtBQUFBLFdBRUQ7QUFBQSxRQUNILE9BQU8sa0NBQWtDLGNBQWM7QUFBQSxXQUtwRDtBQUFBLFdBQ0E7QUFBQSxRQUNILE9BQU8sZUFBZSxjQUFjO0FBQUEsV0FLakM7QUFBQSxXQUNBO0FBQUE7QUFBQSxRQUVILE9BQU8sZUFBZSxnQkFBZ0IsR0FBRztBQUFBO0FBQUE7QUFBQSxFQUsvQyxHQUFHLFFBQVMsQ0FBQyxNQUFNLE9BQU8sV0FBVztBQUFBLElBQ25DLE1BQU0saUJBQWlCLEtBQUssa0JBQWtCO0FBQUEsSUFFOUMsUUFBUTtBQUFBLFdBRUQ7QUFBQSxRQUNILE9BQU8sa0NBQWtDLGNBQWM7QUFBQSxXQUtwRDtBQUFBLFdBQ0E7QUFBQSxRQUNILE9BQU8sZUFBZSxjQUFjO0FBQUEsV0FLakM7QUFBQSxXQUNBO0FBQUE7QUFBQSxRQUVILE9BQU8sZUFBZSxnQkFBZ0IsR0FBRztBQUFBO0FBQUE7QUFBQSxFQUsvQyxHQUFHLFFBQVMsQ0FBQyxNQUFNLE9BQU8sV0FBVztBQUFBLElBQ25DLE1BQU0saUJBQWlCLEtBQUssa0JBQWtCO0FBQUEsSUFFOUMsUUFBUTtBQUFBLFdBRUQ7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFFBQ0gsT0FBTyxRQUFRLG9CQUFvQixnQkFBZ0IsR0FBRztBQUFBLFdBRW5EO0FBQUE7QUFBQSxRQUVILE9BQU8sUUFBUSxlQUFlLGdCQUFnQixHQUFHO0FBQUE7QUFBQTtBQUFBLEVBS3ZELEdBQUcsUUFBUyxDQUFDLE1BQU0sT0FBTyxXQUFXO0FBQUEsSUFDbkMsTUFBTSxpQkFBaUIsS0FBSyxrQkFBa0I7QUFBQSxJQUU5QyxRQUFRO0FBQUEsV0FFRDtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsUUFDSCxPQUFPLFFBQVEsb0JBQW9CLGdCQUFnQixHQUFHO0FBQUEsV0FFbkQ7QUFBQTtBQUFBLFFBRUgsT0FBTyxRQUFRLGVBQWUsZ0JBQWdCLEdBQUc7QUFBQTtBQUFBO0FBQUEsRUFLdkQsR0FBRyxRQUFTLENBQUMsTUFBTSxPQUFPLFdBQVc7QUFBQSxJQUNuQyxNQUFNLFlBQVksS0FBSyxNQUFNLENBQUMsT0FBTyxJQUFJO0FBQUEsSUFDekMsT0FBTyxnQkFBZ0IsV0FBVyxNQUFNLE1BQU07QUFBQTtBQUFBLEVBSWhELEdBQUcsUUFBUyxDQUFDLE1BQU0sT0FBTyxXQUFXO0FBQUEsSUFDbkMsT0FBTyxnQkFBZ0IsQ0FBQyxNQUFNLE1BQU0sTUFBTTtBQUFBO0FBRTlDO0FBRUEsU0FBUyxtQkFBbUIsQ0FBQyxRQUFRLFlBQVksSUFBSTtBQUFBLEVBQ25ELE1BQU0sT0FBTyxTQUFTLElBQUksTUFBTTtBQUFBLEVBQ2hDLE1BQU0sWUFBWSxLQUFLLElBQUksTUFBTTtBQUFBLEVBQ2pDLE1BQU0sUUFBUSxLQUFLLE1BQU0sWUFBWSxFQUFFO0FBQUEsRUFDdkMsTUFBTSxVQUFVLFlBQVk7QUFBQSxFQUM1QixJQUFJLFlBQVksR0FBRztBQUFBLElBQ2pCLE9BQU8sT0FBTyxPQUFPLEtBQUs7QUFBQSxFQUM1QjtBQUFBLEVBQ0EsT0FBTyxPQUFPLE9BQU8sS0FBSyxJQUFJLFlBQVksZ0JBQWdCLFNBQVMsQ0FBQztBQUFBO0FBR3RFLFNBQVMsaUNBQWlDLENBQUMsUUFBUSxXQUFXO0FBQUEsRUFDNUQsSUFBSSxTQUFTLE9BQU8sR0FBRztBQUFBLElBQ3JCLE1BQU0sT0FBTyxTQUFTLElBQUksTUFBTTtBQUFBLElBQ2hDLE9BQU8sT0FBTyxnQkFBZ0IsS0FBSyxJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUM7QUFBQSxFQUN4RDtBQUFBLEVBQ0EsT0FBTyxlQUFlLFFBQVEsU0FBUztBQUFBO0FBR3pDLFNBQVMsY0FBYyxDQUFDLFFBQVEsWUFBWSxJQUFJO0FBQUEsRUFDOUMsTUFBTSxPQUFPLFNBQVMsSUFBSSxNQUFNO0FBQUEsRUFDaEMsTUFBTSxZQUFZLEtBQUssSUFBSSxNQUFNO0FBQUEsRUFDakMsTUFBTSxRQUFRLGdCQUFnQixLQUFLLE1BQU0sWUFBWSxFQUFFLEdBQUcsQ0FBQztBQUFBLEVBQzNELE1BQU0sVUFBVSxnQkFBZ0IsWUFBWSxJQUFJLENBQUM7QUFBQSxFQUNqRCxPQUFPLE9BQU8sUUFBUSxZQUFZO0FBQUE7OztBQ3R3QnBDLElBQU0sb0JBQW9CLENBQUMsU0FBUyxnQkFBZTtBQUFBLEVBQ2pELFFBQVE7QUFBQSxTQUNEO0FBQUEsTUFDSCxPQUFPLFlBQVcsS0FBSyxFQUFFLE9BQU8sUUFBUSxDQUFDO0FBQUEsU0FDdEM7QUFBQSxNQUNILE9BQU8sWUFBVyxLQUFLLEVBQUUsT0FBTyxTQUFTLENBQUM7QUFBQSxTQUN2QztBQUFBLE1BQ0gsT0FBTyxZQUFXLEtBQUssRUFBRSxPQUFPLE9BQU8sQ0FBQztBQUFBLFNBQ3JDO0FBQUE7QUFBQSxNQUVILE9BQU8sWUFBVyxLQUFLLEVBQUUsT0FBTyxPQUFPLENBQUM7QUFBQTtBQUFBO0FBSTlDLElBQU0sb0JBQW9CLENBQUMsU0FBUyxnQkFBZTtBQUFBLEVBQ2pELFFBQVE7QUFBQSxTQUNEO0FBQUEsTUFDSCxPQUFPLFlBQVcsS0FBSyxFQUFFLE9BQU8sUUFBUSxDQUFDO0FBQUEsU0FDdEM7QUFBQSxNQUNILE9BQU8sWUFBVyxLQUFLLEVBQUUsT0FBTyxTQUFTLENBQUM7QUFBQSxTQUN2QztBQUFBLE1BQ0gsT0FBTyxZQUFXLEtBQUssRUFBRSxPQUFPLE9BQU8sQ0FBQztBQUFBLFNBQ3JDO0FBQUE7QUFBQSxNQUVILE9BQU8sWUFBVyxLQUFLLEVBQUUsT0FBTyxPQUFPLENBQUM7QUFBQTtBQUFBO0FBSTlDLElBQU0sd0JBQXdCLENBQUMsU0FBUyxnQkFBZTtBQUFBLEVBQ3JELE1BQU0sY0FBYyxRQUFRLE1BQU0sV0FBVyxLQUFLLENBQUM7QUFBQSxFQUNuRCxNQUFNLGNBQWMsWUFBWTtBQUFBLEVBQ2hDLE1BQU0sY0FBYyxZQUFZO0FBQUEsRUFFaEMsSUFBSSxDQUFDLGFBQWE7QUFBQSxJQUNoQixPQUFPLGtCQUFrQixTQUFTLFdBQVU7QUFBQSxFQUM5QztBQUFBLEVBRUEsSUFBSTtBQUFBLEVBRUosUUFBUTtBQUFBLFNBQ0Q7QUFBQSxNQUNILGlCQUFpQixZQUFXLFNBQVMsRUFBRSxPQUFPLFFBQVEsQ0FBQztBQUFBLE1BQ3ZEO0FBQUEsU0FDRztBQUFBLE1BQ0gsaUJBQWlCLFlBQVcsU0FBUyxFQUFFLE9BQU8sU0FBUyxDQUFDO0FBQUEsTUFDeEQ7QUFBQSxTQUNHO0FBQUEsTUFDSCxpQkFBaUIsWUFBVyxTQUFTLEVBQUUsT0FBTyxPQUFPLENBQUM7QUFBQSxNQUN0RDtBQUFBLFNBQ0c7QUFBQTtBQUFBLE1BRUgsaUJBQWlCLFlBQVcsU0FBUyxFQUFFLE9BQU8sT0FBTyxDQUFDO0FBQUEsTUFDdEQ7QUFBQTtBQUFBLEVBR0osT0FBTyxlQUNKLFFBQVEsWUFBWSxrQkFBa0IsYUFBYSxXQUFVLENBQUMsRUFDOUQsUUFBUSxZQUFZLGtCQUFrQixhQUFhLFdBQVUsQ0FBQztBQUFBO0FBRzVELElBQU0saUJBQWlCO0FBQUEsRUFDNUIsR0FBRztBQUFBLEVBQ0gsR0FBRztBQUNMOzs7QUMvREEsSUFBTSxtQkFBbUI7QUFDekIsSUFBTSxrQkFBa0I7QUFFeEIsSUFBTSxjQUFjLENBQUMsS0FBSyxNQUFNLE1BQU0sTUFBTTtBQUVyQyxTQUFTLHlCQUF5QixDQUFDLE9BQU87QUFBQSxFQUMvQyxPQUFPLGlCQUFpQixLQUFLLEtBQUs7QUFBQTtBQUc3QixTQUFTLHdCQUF3QixDQUFDLE9BQU87QUFBQSxFQUM5QyxPQUFPLGdCQUFnQixLQUFLLEtBQUs7QUFBQTtBQUc1QixTQUFTLHlCQUF5QixDQUFDLE9BQU8sUUFBUSxPQUFPO0FBQUEsRUFDOUQsTUFBTSxXQUFXLFFBQVEsT0FBTyxRQUFRLEtBQUs7QUFBQSxFQUM3QyxRQUFRLEtBQUssUUFBUTtBQUFBLEVBQ3JCLElBQUksWUFBWSxTQUFTLEtBQUs7QUFBQSxJQUFHLE1BQU0sSUFBSSxXQUFXLFFBQVE7QUFBQTtBQUdoRSxTQUFTLE9BQU8sQ0FBQyxPQUFPLFFBQVEsT0FBTztBQUFBLEVBQ3JDLE1BQU0sVUFBVSxNQUFNLE9BQU8sTUFBTSxVQUFVO0FBQUEsRUFDN0MsT0FBTyxTQUFTLE1BQU0sWUFBWSxvQkFBb0IsaUJBQWlCLDRCQUE0QiwwQkFBMEI7QUFBQTs7O0FDTS9ILElBQU0seUJBQ0o7QUFJRixJQUFNLDZCQUE2QjtBQUVuQyxJQUFNLHNCQUFzQjtBQUM1QixJQUFNLG9CQUFvQjtBQUMxQixJQUFNLGdDQUFnQztBQW9TL0IsU0FBUyxNQUFNLENBQUMsTUFBTSxXQUFXLFNBQVM7QUFBQSxFQUMvQyxNQUFNLGtCQUFpQixrQkFBa0I7QUFBQSxFQUN6QyxNQUFNLFNBQVMsU0FBUyxVQUFVLGdCQUFlLFVBQVU7QUFBQSxFQUUzRCxNQUFNLHdCQUNKLFNBQVMseUJBQ1QsU0FBUyxRQUFRLFNBQVMseUJBQzFCLGdCQUFlLHlCQUNmLGdCQUFlLFFBQVEsU0FBUyx5QkFDaEM7QUFBQSxFQUVGLE1BQU0sZUFDSixTQUFTLGdCQUNULFNBQVMsUUFBUSxTQUFTLGdCQUMxQixnQkFBZSxnQkFDZixnQkFBZSxRQUFRLFNBQVMsZ0JBQ2hDO0FBQUEsRUFFRixNQUFNLGVBQWUsT0FBTyxNQUFNLFNBQVMsRUFBRTtBQUFBLEVBRTdDLElBQUksQ0FBQyxRQUFRLFlBQVksR0FBRztBQUFBLElBQzFCLE1BQU0sSUFBSSxXQUFXLG9CQUFvQjtBQUFBLEVBQzNDO0FBQUEsRUFFQSxJQUFJLFFBQVEsVUFDVCxNQUFNLDBCQUEwQixFQUNoQyxJQUFJLENBQUMsY0FBYztBQUFBLElBQ2xCLE1BQU0saUJBQWlCLFVBQVU7QUFBQSxJQUNqQyxJQUFJLG1CQUFtQixPQUFPLG1CQUFtQixLQUFLO0FBQUEsTUFDcEQsTUFBTSxnQkFBZ0IsZUFBZTtBQUFBLE1BQ3JDLE9BQU8sY0FBYyxXQUFXLE9BQU8sVUFBVTtBQUFBLElBQ25EO0FBQUEsSUFDQSxPQUFPO0FBQUEsR0FDUixFQUNBLEtBQUssRUFBRSxFQUNQLE1BQU0sc0JBQXNCLEVBQzVCLElBQUksQ0FBQyxjQUFjO0FBQUEsSUFFbEIsSUFBSSxjQUFjLE1BQU07QUFBQSxNQUN0QixPQUFPLEVBQUUsU0FBUyxPQUFPLE9BQU8sSUFBSTtBQUFBLElBQ3RDO0FBQUEsSUFFQSxNQUFNLGlCQUFpQixVQUFVO0FBQUEsSUFDakMsSUFBSSxtQkFBbUIsS0FBSztBQUFBLE1BQzFCLE9BQU8sRUFBRSxTQUFTLE9BQU8sT0FBTyxtQkFBbUIsU0FBUyxFQUFFO0FBQUEsSUFDaEU7QUFBQSxJQUVBLElBQUksV0FBVyxpQkFBaUI7QUFBQSxNQUM5QixPQUFPLEVBQUUsU0FBUyxNQUFNLE9BQU8sVUFBVTtBQUFBLElBQzNDO0FBQUEsSUFFQSxJQUFJLGVBQWUsTUFBTSw2QkFBNkIsR0FBRztBQUFBLE1BQ3ZELE1BQU0sSUFBSSxXQUNSLG1FQUNFLGlCQUNBLEdBQ0o7QUFBQSxJQUNGO0FBQUEsSUFFQSxPQUFPLEVBQUUsU0FBUyxPQUFPLE9BQU8sVUFBVTtBQUFBLEdBQzNDO0FBQUEsRUFHSCxJQUFJLE9BQU8sU0FBUyxjQUFjO0FBQUEsSUFDaEMsUUFBUSxPQUFPLFNBQVMsYUFBYSxjQUFjLEtBQUs7QUFBQSxFQUMxRDtBQUFBLEVBRUEsTUFBTSxtQkFBbUI7QUFBQSxJQUN2QjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUFBLEVBRUEsT0FBTyxNQUNKLElBQUksQ0FBQyxVQUFTO0FBQUEsSUFDYixJQUFJLENBQUMsTUFBSztBQUFBLE1BQVMsT0FBTyxNQUFLO0FBQUEsSUFFL0IsTUFBTSxRQUFRLE1BQUs7QUFBQSxJQUVuQixJQUNHLENBQUMsU0FBUywrQkFDVCx5QkFBeUIsS0FBSyxLQUMvQixDQUFDLFNBQVMsZ0NBQ1QsMEJBQTBCLEtBQUssR0FDakM7QUFBQSxNQUNBLDBCQUEwQixPQUFPLFdBQVcsT0FBTyxJQUFJLENBQUM7QUFBQSxJQUMxRDtBQUFBLElBRUEsTUFBTSxZQUFZLFdBQVcsTUFBTTtBQUFBLElBQ25DLE9BQU8sVUFBVSxjQUFjLE9BQU8sT0FBTyxVQUFVLGdCQUFnQjtBQUFBLEdBQ3hFLEVBQ0EsS0FBSyxFQUFFO0FBQUE7QUFHWixTQUFTLGtCQUFrQixDQUFDLE9BQU87QUFBQSxFQUNqQyxNQUFNLFVBQVUsTUFBTSxNQUFNLG1CQUFtQjtBQUFBLEVBRS9DLElBQUksQ0FBQyxTQUFTO0FBQUEsSUFDWixPQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsT0FBTyxRQUFRLEdBQUcsUUFBUSxtQkFBbUIsR0FBRztBQUFBOzs7QUN0YWxELGVBQXNCLGlCQUFpQixDQUFDLFNBQXdDLE9BQXNCOzs7QUNtQi9GLFNBQVMsWUFBb0gsQ0FBQyxTQUF3QixNQUFjLFdBQTJCO0FBQUEsRUFDbE0sTUFBTSxTQUFTLENBQUM7QUFBQSxFQUVoQixPQUFPLElBQUk7QUFBQSxJQUNQLE1BQU0sQ0FBQztBQUFBLElBQ1AsTUFBTSxJQUFJO0FBQUEsSUFDVixRQUFRLENBQUMsWUFBc0I7QUFBQSxNQUMzQixJQUFJLENBQUMsUUFBUTtBQUFBLFFBQW9CO0FBQUEsTUFDakMsT0FBTyxRQUFRLG1CQUFtQixTQUFTLE9BQU8sRUFBRSxNQUFNLE9BQU8sRUFBRSxJQUFJO0FBQUE7QUFBQSxFQUUvRTtBQUFBLEVBRUEsTUFBTSxZQUFZLENBQUMsS0FBYSxVQUF5QjtBQUFBLElBQ3JELE9BQU8sRUFBRSxLQUFLLElBQUksS0FBSyxLQUFLO0FBQUE7QUFBQSxFQUVoQyxNQUFNLFlBQVksQ0FBQyxRQUFrQjtBQUFBLElBQ2pDLE1BQU0sWUFBWSxRQUFRLG9CQUNwQixRQUFRLG9CQUNSLENBQUMsU0FBYTtBQUFBLE1BQ1osT0FBTSxDQUFDLEdBQUcsSUFBRztBQUFBLE1BQ2IsS0FBSSxLQUFLO0FBQUEsRUFBSyxLQUFJO0FBQUEsTUFDbEIsUUFBUSxJQUFJLEdBQUcsSUFBRztBQUFBLE1BQ2xCLE9BQU87QUFBQTtBQUFBLElBR2YsSUFBSSxDQUFDLFVBQVUsR0FBRztBQUFBLE1BQUcsT0FBTztBQUFBLElBRTVCLE9BQU8sRUFBRSxLQUFLLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUFBLElBRTNCLElBQUksUUFBUSxTQUFTO0FBQUEsTUFDWixrQkFBa0IsU0FBUztBQUFBLFFBQzVCLE1BQU07QUFBQSxRQUNOO0FBQUEsTUFDSixDQUFDO0FBQUEsSUFDTDtBQUFBLElBRUEsT0FBTztBQUFBO0FBQUEsRUFHWCxPQUFPLFNBQVMsQ0FBQyxLQUFhLFVBQW1CLFVBQVUsS0FBSyxLQUFLO0FBQUEsRUFDckUsT0FBTyxTQUFTLElBQUksUUFBYSxVQUFVLEdBQUc7QUFBQSxFQUU5QyxNQUFNLFNBQVMsTUFBTSxHQUFHLE9BQU8sSUFBSSxNQUFRLHVCQUF1QjtBQUFBLEVBRWxFLE9BQU8sUUFBUSxDQUFDLGdCQUF3QixXQUEyQixVQUFVLENBQUMsV0FBVyxNQUFNLFdBQVcsT0FBTyxHQUFHO0FBQUEsRUFBSyxlQUFlLEdBQUcsTUFBTSxDQUFDO0FBQUEsRUFDbEosT0FBTyxPQUFPLENBQUMsZ0JBQXdCLFdBQTJCLFVBQVUsQ0FBQyxVQUFVLE1BQU0sV0FBVyxPQUFPLEdBQUc7QUFBQSxFQUFLLGVBQWUsR0FBRyxNQUFNLENBQUM7QUFBQSxFQUNoSixPQUFPLE9BQU8sQ0FBQyxnQkFBd0IsV0FBMkIsVUFBVSxDQUFDLFVBQVUsTUFBTSxXQUFXLE9BQU8sR0FBRztBQUFBLEVBQUssZUFBZSxHQUFHLE1BQU0sQ0FBQztBQUFBLEVBQ2hKLE9BQU8sUUFBUSxDQUFDLGdCQUF3QixXQUEyQixVQUFVLENBQUMsV0FBVyxNQUFNLFdBQVcsT0FBTyxHQUFHO0FBQUEsRUFBSyxlQUFlLEdBQUcsTUFBTSxDQUFDO0FBQUEsRUFDbEosT0FBTyxVQUFVLENBQUMsZ0JBQXdCLFdBQTJCLFVBQVUsQ0FBQyxhQUFhLE1BQU0sV0FBVyxPQUFPLEdBQUc7QUFBQSxFQUFLLGVBQWUsR0FBRyxNQUFNLENBQUM7QUFBQSxFQUN0SixPQUFPLFdBQVcsQ0FBQyxnQkFBd0IsV0FBMkIsVUFBVSxDQUFDLGNBQWMsTUFBTSxXQUFXLE9BQU8sR0FBRztBQUFBLEVBQUssZUFBZSxHQUFHLE1BQU0sQ0FBQztBQUFBLEVBRXhKLE9BQU87QUFBQTs7QUNoRUosU0FBUyxVQUFVLEdBQWM7QUFBQSxFQUN0QyxNQUFNLGlCQUFpQjtBQUFBLElBQ3JCLGFBQWE7QUFBQSxJQUNiLFFBQVEsQ0FBQztBQUFBLElBQ1QsSUFBSSxDQUFDLFNBQXVDO0FBQUEsTUFDMUMsZUFBZSxPQUFPLEtBQUssT0FBTztBQUFBLE1BQ2xDLE9BQU87QUFBQTtBQUFBLFNBRUgsSUFBRyxHQUFHO0FBQUEsTUFDVixJQUFJLFFBQVEsQ0FBQztBQUFBLE1BQ2IsV0FBVyxRQUFRLGVBQWUsUUFBUTtBQUFBLFFBQ3hDLFFBQVEsS0FBSyxVQUFXLE1BQU0sS0FBSyxLQUFLLEVBQUc7QUFBQSxNQUM3QztBQUFBLE1BQ0EsTUFBTSxTQUEyQixDQUFDO0FBQUEsTUFDbEMsV0FBVyxPQUFPLE9BQU87QUFBQSxRQUN2QixNQUFNLFFBQVMsTUFBYztBQUFBLFFBQzdCLElBQUksQ0FBQyxJQUFJLFdBQVcsR0FBRztBQUFBLFVBQUcsT0FBTyxPQUFPO0FBQUEsTUFDMUM7QUFBQSxNQUNBLE9BQU87QUFBQTtBQUFBLEVBRVg7QUFBQSxFQUNBLE9BQU87QUFBQTs7QUNsQ0YsTUFBTSxLQUFRO0FBQUEsRUFDWDtBQUFBLEVBRVIsV0FBVyxHQUFHO0FBQUEsSUFDWixLQUFLLE9BQU8sSUFBSTtBQUFBO0FBQUEsRUFHbEIsR0FBRyxDQUFDLE1BQWMsT0FBZ0I7QUFBQSxJQUNoQyxNQUFNLFFBQVEsS0FDWCxRQUFRLGNBQWMsRUFBRSxFQUN4QixNQUFNLEdBQUcsRUFDVCxPQUFPLENBQUMsTUFBTSxNQUFNLEVBQUU7QUFBQSxJQUN6QixJQUFJLGNBQWMsS0FBSztBQUFBLElBQ3ZCLElBQUksTUFBTSxXQUFXLEdBQUc7QUFBQSxNQUN0QixZQUFZLFFBQVE7QUFBQSxNQUNwQjtBQUFBLElBQ0Y7QUFBQSxJQUNBLFdBQVcsU0FBUSxPQUFPO0FBQUEsTUFDeEIsSUFBSSxDQUFDLFlBQVksU0FBUyxJQUFJLEtBQUksR0FBRztBQUFBLFFBQ25DLFlBQVksU0FBUyxJQUFJLE9BQU0sSUFBSSxRQUFVO0FBQUEsTUFDL0M7QUFBQSxNQUNBLGNBQWMsWUFBWSxTQUFTLElBQUksS0FBSTtBQUFBLElBQzdDO0FBQUEsSUFDQSxZQUFZLFFBQVE7QUFBQTtBQUFBLEVBR3RCLEdBQUcsQ0FBQyxNQUF3QjtBQUFBLElBQzFCLE1BQU0sUUFBUSxLQUNYLFFBQVEsY0FBYyxFQUFFLEVBQ3hCLE1BQU0sR0FBRyxFQUNULE9BQU8sQ0FBQyxNQUFNLE1BQU0sRUFBRTtBQUFBLElBQ3pCLElBQUksY0FBYyxLQUFLO0FBQUEsSUFDdkIsV0FBVyxTQUFRLE9BQU87QUFBQSxNQUN4QixJQUFJLENBQUMsWUFBWSxTQUFTLElBQUksS0FBSTtBQUFBLFFBQUcsT0FBTztBQUFBLE1BQzVDLGNBQWMsWUFBWSxTQUFTLElBQUksS0FBSTtBQUFBLElBQzdDO0FBQUEsSUFDQSxPQUFPLFlBQVk7QUFBQTtBQUFBLEVBR3JCLEdBQUcsQ0FBQyxNQUF1QjtBQUFBLElBQ3pCLE1BQU0sUUFBUSxLQUNYLFFBQVEsY0FBYyxFQUFFLEVBQ3hCLE1BQU0sR0FBRyxFQUNULE9BQU8sQ0FBQyxNQUFNLE1BQU0sRUFBRTtBQUFBLElBQ3pCLElBQUksY0FBYyxLQUFLO0FBQUEsSUFDdkIsSUFBSSxNQUFNLFdBQVc7QUFBQSxNQUFHLE9BQU8sWUFBWSxVQUFVO0FBQUEsSUFDckQsV0FBVyxTQUFRLE9BQU87QUFBQSxNQUN4QixJQUFJLENBQUMsWUFBWSxTQUFTLElBQUksS0FBSTtBQUFBLFFBQUcsT0FBTztBQUFBLE1BQ3ZDO0FBQUEsc0JBQWMsWUFBWSxTQUFTLElBQUksS0FBSTtBQUFBLElBQ2xEO0FBQUEsSUFDQSxPQUFPLFlBQVksVUFBVTtBQUFBO0FBRWpDO0FBQUE7QUFFQSxNQUFNLFNBQVk7QUFBQSxFQUNoQjtBQUFBLEVBQ0E7QUFBQSxFQUVBLFdBQVcsR0FBRztBQUFBLElBQ1osS0FBSyxXQUFXLElBQUk7QUFBQSxJQUNwQixLQUFLLFFBQVE7QUFBQTtBQUVqQjs7O0FDNUNPLFNBQVMsY0FBYyxDQUFDLFdBQTBCLFNBQWMsVUFBNkM7QUFBQSxFQUNoSCxNQUFNLE9BQU8sUUFBUTtBQUFBLEVBQ3JCLE1BQU0sT0FBTyxJQUFJO0FBQUEsRUFDakIsTUFBTSxRQUFRLE9BQU8sWUFLSTtBQUFBLElBQ3JCLElBQUksUUFBUSxRQUFRLFdBQVcsV0FBVztBQUFBLE1BQ3RDLE9BQU8sSUFBSSxTQUFTLFdBQVc7QUFBQSxRQUMzQixTQUFTO0FBQUEsVUFDTCxnQ0FBZ0MsUUFBUSxNQUFNLG9CQUFvQjtBQUFBLFVBQ2xFLCtCQUErQixRQUFRLE1BQU0sbUJBQW1CO0FBQUEsVUFDaEUsZ0NBQWdDLFFBQVEsTUFBTSxvQkFBb0I7QUFBQSxRQUN0RTtBQUFBLE1BQ0osQ0FBQztBQUFBLElBQ0w7QUFBQSxJQUVBLElBQUksUUFBUSxRQUFRLElBQUksU0FBUyxlQUFlLEdBQUc7QUFBQSxNQUMvQyxPQUFPLElBQUksU0FBUyxNQUFNO0FBQUEsUUFDdEIsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBLFVBQ0wsUUFBUTtBQUFBLFVBQ1IsZ0NBQWdDLFFBQVEsTUFBTSxvQkFBb0I7QUFBQSxVQUNsRSwrQkFBK0IsUUFBUSxNQUFNLG1CQUFtQjtBQUFBLFVBQ2hFLGdDQUFnQyxRQUFRLE1BQU0sb0JBQW9CO0FBQUEsVUFDbEUsaUJBQWlCO0FBQUEsVUFDakIsZ0JBQWdCLG9CQUFvQixLQUFLLElBQUk7QUFBQSxRQUNqRDtBQUFBLE1BQ0osQ0FBQztBQUFBLElBQ0w7QUFBQSxJQUVBLE1BQU0sTUFBTSxJQUFJLElBQUksUUFBUSxRQUFRLEdBQUc7QUFBQSxJQUN2QyxJQUFJLFlBQVksSUFBSSxTQUFTLFVBQVUsQ0FBQyxFQUFFLE1BQU0sR0FBRztBQUFBLElBQ25ELElBQUksUUFBUSxhQUFhLFVBQVUsR0FBRyxDQUFDLE1BQU0sUUFBUSxXQUFXO0FBQUEsTUFDNUQsT0FBTyxJQUFJLFNBQVMsV0FBVztBQUFBLFFBQzNCLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQSxVQUNMLGdDQUFnQyxRQUFRLE1BQU0sb0JBQW9CO0FBQUEsVUFDbEUsK0JBQStCLFFBQVEsTUFBTSxtQkFBbUI7QUFBQSxVQUNoRSxnQ0FBZ0MsUUFBUSxNQUFNLG9CQUFvQjtBQUFBLFFBQ3RFO0FBQUEsTUFDSixDQUFDO0FBQUEsSUFDTDtBQUFBLElBQ0EsSUFBSSxRQUFRLG9CQUFvQixhQUFhLFFBQVEsb0JBQW9CO0FBQUEsTUFBRyxZQUFZLFVBQVUsTUFBTSxRQUFRLGVBQWU7QUFBQSxJQUMvSCxNQUFNLGFBQWEsSUFBSSxVQUFVLEtBQUssR0FBRztBQUFBLElBRXpDLE1BQU0sWUFBWSxTQUFTLFlBQVksTUFBTSxRQUFRLFVBQVUsUUFBUSxRQUFRLE9BQU8sSUFBSSxXQUFXO0FBQUEsSUFFckcsTUFBTSxTQUFTLGFBQWEsU0FBUyxZQUFZLFNBQVM7QUFBQSxJQUMxRCxRQUFRLFFBQVEsUUFBUSxJQUFJLFdBQVcsRUFBRSxPQUFPLENBQUM7QUFBQSxJQUNqRCxNQUFNLFdBQStCO0FBQUEsTUFDakMsTUFBTTtBQUFBLE1BQ04sUUFBUTtBQUFBLE1BQ1IsU0FBUztBQUFBLFFBQ0wsZ0NBQWdDLFFBQVEsTUFBTSxvQkFBb0I7QUFBQSxRQUNsRSwrQkFBK0IsUUFBUSxNQUFNLG1CQUFtQjtBQUFBLFFBQ2hFLGdDQUFnQyxRQUFRLE1BQU0sb0JBQW9CO0FBQUEsUUFDbEUsaUJBQWlCO0FBQUEsUUFDakIsZ0JBQWdCO0FBQUEsTUFDcEI7QUFBQSxJQUNKO0FBQUEsSUFFQSxJQUFJLFVBQTZDLENBQUM7QUFBQSxJQUdsRCxNQUFNLE9BQVEsT0FBTyxZQUFZO0FBQUEsTUFDN0IsTUFBTSxLQUFLLFFBQVEsU0FBUyxRQUFRLE9BQU8sUUFBUSxRQUFRLE9BQU8sSUFBSTtBQUFBLE1BQ3RFLE1BQU0sU0FBUztBQUFBLFFBQ1gsUUFBUSxNQUFNLFFBQVEsUUFBUSxLQUFLO0FBQUEsUUFDbkMsUUFBUTtBQUFBLE1BQ1o7QUFBQSxNQUVBLE9BQU87QUFBQSxRQUNIO0FBQUEsUUFDQTtBQUFBLFFBQ0EsTUFBTSxFQUFFLFFBQVEsWUFBd0QsT0FBTyxVQUFVO0FBQUEsUUFDekY7QUFBQSxRQUNBLFNBQVMsUUFBUTtBQUFBLFFBQ2pCO0FBQUEsTUFDSjtBQUFBLE9BQ0Q7QUFBQSxJQUVILE1BQU0sVUFBZSxFQUFFLE9BQU87QUFBQSxJQUM5QixJQUFJO0FBQUEsTUFDQSxNQUFNLFFBQVEsS0FBSyxzQkFBc0IsRUFBRSxXQUFXLFFBQVEsTUFBTSxLQUFLLEtBQUssUUFBa0IsTUFBTSxPQUFPLENBQUM7QUFBQSxNQUU5RyxJQUFJLENBQUMsUUFBUSxRQUFRLFFBQVEsSUFBSSxRQUFRLEdBQUcsV0FBVyxtQkFBbUIsR0FBRztBQUFBLFFBRXpFLElBQUksY0FBYyxRQUFRO0FBQUEsUUFDMUIsSUFBSSxDQUFDLGFBQWE7QUFBQSxVQUNkLGNBQWMsS0FBSyxJQUFJLEtBQUssS0FBSyxNQUFnQjtBQUFBLFVBQ2pELElBQUksZ0JBQWdCLE1BQU07QUFBQSxZQUN0QixjQUFjLFVBQVUsY0FBYyxLQUFLLEtBQUs7QUFBQSxZQUNoRCxJQUFJLGdCQUFnQixXQUFXO0FBQUEsY0FDM0IsTUFBTSxRQUFRLEtBQUssdUJBQXVCLEVBQUUsV0FBVyxRQUFRLE1BQU0sS0FBSyxLQUFLLFFBQWtCLE1BQU0sT0FBTyxDQUFDO0FBQUEsY0FDL0csTUFBTSxPQUFPLGFBQWEsRUFBRSxNQUFNLEtBQUssS0FBSyxPQUFpQixDQUFDO0FBQUEsWUFDbEU7QUFBQSxZQUNBLElBQUksT0FBTyxZQUFZLFdBQVc7QUFBQSxjQUFZLFlBQVksU0FBUyxNQUFNLFlBQVk7QUFBQSxZQUNoRjtBQUFBLDBCQUFZLFNBQVMsTUFBTSxZQUFZLE9BQU87QUFBQSxZQUNuRCxLQUFLLElBQUksS0FBSyxLQUFLLFFBQWtCLFdBQVc7QUFBQSxVQUNwRDtBQUFBLFVBRUEsSUFBSSxZQUFZLFNBQVM7QUFBQSxZQUFVLE1BQU0sT0FBTyxnQkFBZ0IsRUFBRSxVQUFVLFVBQVUsU0FBUyx5TEFBeUwsQ0FBQztBQUFBLFFBQzdSO0FBQUEsUUFFQSxRQUFRLE9BQU87QUFBQSxRQUNmLFFBQVEsVUFBVSxLQUFLLFFBQVE7QUFBQSxRQUUvQixNQUFNLFdBQVcsTUFBTSxTQUFTLFVBQVUsYUFBYTtBQUFBLFVBQ25ELGtCQUFrQjtBQUFBLFVBQ2xCLGVBQWU7QUFBQSxVQUNmLE1BQU0sS0FBSyxLQUFLO0FBQUEsVUFDaEIsU0FBUyxRQUFRLFFBQVE7QUFBQSxVQUN6QjtBQUFBLFVBQ0EsUUFBUSxLQUFLLE9BQU87QUFBQSxVQUNwQixZQUFZO0FBQUEsUUFDaEIsQ0FBQztBQUFBLFFBQ0QsVUFBVSxTQUFTO0FBQUEsUUFFbkIsSUFBSSxTQUFTLFNBQVMsTUFBTSxTQUFTLFFBQVEsVUFBVSxXQUFXO0FBQUEsVUFDOUQsSUFBSSxTQUFTLGFBQWE7QUFBQSxZQUN0QixTQUFTLE9BQU8sMkJBQTJCO0FBQUEsVUFDL0MsRUFBTyxTQUFJLFNBQVMsbUJBQW1CO0FBQUEsWUFDbkMsU0FBUyxPQUFPLFdBQVcsWUFBWSxjQUFjLFNBQVMsUUFBUSxLQUFLLGtCQUFrQjtBQUFBLFVBQ2pHLEVBQU87QUFBQSxZQUNILFNBQVMsT0FBTyxXQUFXLEtBQUssVUFBVSxTQUFTLFFBQVEsS0FBSyxrQkFBa0I7QUFBQTtBQUFBLFFBRTFGO0FBQUEsUUFFQSxNQUFNLFFBQVEsS0FBSyx1QkFBdUIsRUFBRSxXQUFXLFFBQVEsTUFBTSxLQUFLLEtBQUssUUFBa0IsTUFBTSxTQUFTLEtBQUssUUFBUSxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsTUFBTSxPQUFPLENBQUM7QUFBQSxRQUV4TCxXQUFXLFdBQVcsU0FBUztBQUFBLFVBQzNCLElBQUk7QUFBQSxZQUNBLE1BQU0sUUFBUTtBQUFBLFlBQ2hCLE9BQU8sT0FBTztBQUFBLFlBQ1osT0FBTyxNQUFNLHVDQUF1QyxLQUFLO0FBQUE7QUFBQSxRQUVqRTtBQUFBLFFBRUEsUUFBUSxRQUFRLFFBQVEsT0FBTyxTQUFTO0FBQUEsUUFDeEMsT0FBTyxJQUFJLFNBQVMsU0FBUyxNQUFNLFFBQVE7QUFBQSxNQUMvQyxFQUFPO0FBQUEsUUFFSCxJQUFJLGNBQWMsUUFBUTtBQUFBLFFBQzFCLElBQUksQ0FBQyxhQUFhO0FBQUEsVUFDZCxjQUFjLEtBQUssSUFBSSxLQUFLLEtBQUssTUFBZ0I7QUFBQSxVQUNqRCxJQUFJLGdCQUFnQixNQUFNO0FBQUEsWUFDdEIsY0FBYyxVQUFVLGNBQWMsS0FBSyxLQUFLO0FBQUEsWUFDaEQsSUFBSSxnQkFBZ0IsV0FBVztBQUFBLGNBQzNCLE1BQU0sUUFBUSxLQUFLLHVCQUF1QixFQUFFLFdBQVcsUUFBUSxNQUFNLEtBQUssS0FBSyxRQUFrQixNQUFNLE9BQU8sQ0FBQztBQUFBLGNBQy9HLE1BQU0sT0FBTyxhQUFhLEVBQUUsTUFBTSxLQUFLLEtBQUssT0FBaUIsQ0FBQztBQUFBLFlBQ2xFO0FBQUEsWUFDQSxJQUFJLE9BQU8sWUFBWSxXQUFXO0FBQUEsY0FBWSxZQUFZLFNBQVMsTUFBTSxZQUFZO0FBQUEsWUFDaEY7QUFBQSwwQkFBWSxTQUFTLE1BQU0sWUFBWSxPQUFPO0FBQUEsWUFDbkQsS0FBSyxJQUFJLEtBQUssS0FBSyxRQUFrQixXQUFXO0FBQUEsVUFDcEQ7QUFBQSxVQUNBLElBQUksWUFBWSxTQUFTO0FBQUEsWUFBVSxNQUFNLE9BQU8sZ0JBQWdCLEVBQUUsVUFBVSxVQUFVLFNBQVMsMkxBQTJMLENBQUM7QUFBQSxRQUMvUjtBQUFBLFFBRUEsTUFBTSxjQUFjLFlBQVk7QUFBQSxVQUM1QixRQUFRLFFBQVEsUUFBUSxPQUFPLFNBQVM7QUFBQSxVQUN4QyxXQUFXLFdBQVcsU0FBUztBQUFBLFlBQzNCLElBQUk7QUFBQSxjQUNBLE1BQU0sUUFBUTtBQUFBLGNBQ2hCLE9BQU8sT0FBTztBQUFBLGNBQ1osT0FBTyxNQUFNLHVDQUF1QyxLQUFLO0FBQUE7QUFBQSxVQUVqRTtBQUFBO0FBQUEsUUFHSixRQUFRLE9BQU87QUFBQSxRQUNmLFFBQVEsVUFBVSxLQUFLLFFBQVE7QUFBQSxRQUUvQixNQUFNLFdBQVcsTUFBTSxTQUFTLFVBQVUsYUFBYTtBQUFBLFVBQ25ELGtCQUFrQjtBQUFBLFVBQ2xCLGVBQWU7QUFBQSxVQUNmLE1BQU0sS0FBSyxLQUFLO0FBQUEsVUFDaEIsU0FBUyxRQUFRLFFBQVE7QUFBQSxVQUN6QjtBQUFBLFVBQ0EsUUFBUSxLQUFLLE9BQU87QUFBQSxVQUNwQixZQUFZO0FBQUEsUUFDaEIsQ0FBQztBQUFBLFFBQ0QsVUFBVSxTQUFTO0FBQUEsUUFFbkIsSUFBSTtBQUFBLFFBRUosSUFBSTtBQUFBLFFBR0osSUFBSSxPQUFPLFFBQVEsYUFBYTtBQUFBLFVBRTVCLFNBQVMsSUFBSSxlQUFlO0FBQUEsWUFDeEIsTUFBTTtBQUFBLGlCQUVBLEtBQUksQ0FBQyxZQUE0QztBQUFBLGNBQ25ELFVBQVU7QUFBQSxjQUNWLElBQUk7QUFBQSxnQkFDQSxXQUFXLE1BQU0sU0FBUyxLQUFLLFVBQVUsRUFBRSxTQUFTLE1BQU0sTUFBTSxXQUFXLFVBQVUsQ0FBc0M7QUFBQTtBQUFBLENBQU87QUFBQSxnQkFDbEksaUJBQWlCLFNBQVMsU0FBUyxRQUFRLE9BQU87QUFBQSxrQkFDOUMsSUFBSSxDQUFDLFFBQVEsUUFBUSxPQUFPLFNBQVM7QUFBQSxvQkFDakMsTUFBTSxTQUFpQixLQUFLLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQztBQUFBLG9CQUNuRCxXQUFXLE1BQU0sUUFBUTtBQUFBO0FBQUEsQ0FBWTtBQUFBLGtCQUN6QyxFQUFPO0FBQUEsb0JBQ0gsU0FBUyxRQUFRLE1BQU0sT0FBTyxTQUFTO0FBQUEsb0JBQ3ZDLE1BQU0sWUFBWTtBQUFBLG9CQUNsQixXQUFXLE1BQU07QUFBQTtBQUFBLGdCQUV6QjtBQUFBLGdCQUNGLE9BQU8sT0FBTztBQUFBLGdCQUNaLE1BQU0sWUFBWSxpQkFBaUIsV0FBVyxRQUFRLEtBQUs7QUFBQSxnQkFDM0QsTUFBTSxTQUFjLENBQUM7QUFBQSxnQkFDckIsT0FBTyxVQUFVLFFBQVEsVUFBVTtBQUFBLGdCQUNuQyxXQUFXLE1BQU0sUUFBUSxLQUFLLFVBQVUsQ0FBQyxRQUFRLElBQUksQ0FBQztBQUFBO0FBQUEsQ0FBTztBQUFBO0FBQUEsY0FFakUsTUFBTSxJQUFJLFFBQVEsQ0FBQyxZQUFZLFdBQVcsU0FBUyxDQUFDLENBQUM7QUFBQSxjQUNyRCxNQUFNLFlBQVk7QUFBQSxjQUNsQixXQUFXLE1BQU07QUFBQTtBQUFBLGlCQUVmLE9BQU0sR0FBRztBQUFBLGNBQ1gsTUFBTSxZQUFZO0FBQUEsY0FDbEIsUUFBUSxNQUFNO0FBQUE7QUFBQSxVQUV0QixDQUFRO0FBQUEsUUFDWixFQUFPO0FBQUEsVUFHSCxTQUFTLElBQUksZUFBZTtBQUFBLGlCQUVsQixLQUFJLENBQUMsWUFBWTtBQUFBLGNBQ25CLFVBQVU7QUFBQSxjQUNWLElBQUk7QUFBQSxnQkFDQSxXQUFXLFFBQVEsU0FBUyxLQUFLLFVBQVUsRUFBRSxTQUFTLE1BQU0sTUFBTSxXQUFXLFVBQVUsQ0FBc0M7QUFBQTtBQUFBLENBQU87QUFBQSxnQkFDcEksaUJBQWlCLFNBQVMsU0FBUyxRQUFRLE9BQU87QUFBQSxrQkFDOUMsSUFBSSxDQUFDLFFBQVEsUUFBUSxPQUFPLFNBQVM7QUFBQSxvQkFDakMsTUFBTSxTQUFpQixLQUFLLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQztBQUFBLG9CQUNuRCxXQUFXLFFBQVEsUUFBUTtBQUFBO0FBQUEsQ0FBWTtBQUFBLGtCQUMzQyxFQUFPO0FBQUEsb0JBQ0gsU0FBUyxRQUFRLE1BQU0sT0FBTyxTQUFTO0FBQUEsb0JBQ3ZDLE1BQU0sWUFBWTtBQUFBLG9CQUNsQixXQUFXLE1BQU07QUFBQTtBQUFBLGdCQUV6QjtBQUFBLGdCQUNGLE9BQU8sT0FBTztBQUFBLGdCQUNaLE1BQU0sWUFBWSxpQkFBaUIsV0FBVyxRQUFRLEtBQUs7QUFBQSxnQkFDM0QsTUFBTSxTQUFjLENBQUM7QUFBQSxnQkFDckIsT0FBTyxVQUFVLFFBQVEsVUFBVTtBQUFBLGdCQUNuQyxXQUFXLFFBQVEsUUFBUSxLQUFLLFVBQVUsQ0FBQyxRQUFRLElBQUksQ0FBQztBQUFBO0FBQUEsQ0FBTztBQUFBO0FBQUEsY0FFbkUsTUFBTSxZQUFZO0FBQUEsY0FDbEIsTUFBTSxJQUFJLFFBQVEsQ0FBQyxZQUFZLFdBQVcsU0FBUyxDQUFDLENBQUM7QUFBQSxjQUNyRCxXQUFXLE1BQU07QUFBQTtBQUFBLGlCQUVmLE9BQU0sR0FBRztBQUFBLGNBQ1gsTUFBTSxZQUFZO0FBQUEsY0FDbEIsUUFBUSxNQUFNO0FBQUE7QUFBQSxVQUV0QixDQUFRO0FBQUE7QUFBQSxRQUdaLFNBQVMsT0FBTztBQUFBLFFBQ2hCLFNBQVMsUUFBUSxrQkFBa0I7QUFBQSxRQUNuQyxTQUFTLFFBQVEsbUJBQW1CO0FBQUEsUUFFcEMsTUFBTSxRQUFRLEtBQUssdUJBQXVCLEVBQUUsV0FBVyxRQUFRLE1BQU0sS0FBSyxLQUFLLFFBQWtCLE1BQU0sU0FBUyxLQUFLLFFBQVEsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLE1BQU0sT0FBTyxDQUFDO0FBQUEsUUFFeEwsT0FBTyxJQUFJLFNBQVMsU0FBUyxNQUFNLFFBQVE7QUFBQTtBQUFBLE1BRWpELE9BQU8sT0FBTztBQUFBLE1BQ1osTUFBTSxVQUF5QztBQUFBLFFBQzNDLE9BQU8saUJBQWlCLFdBQVcsUUFBUSxLQUFLO0FBQUEsTUFDcEQ7QUFBQSxNQUNBLElBQUksUUFBUSxVQUFVO0FBQUEsUUFBVyxTQUFTLE9BQU8sS0FBSyxVQUFVLFFBQVEsS0FBSztBQUFBLE1BQzdFLE1BQU0sUUFBUSxLQUFLLHVCQUF1QixFQUFFLFdBQVcsUUFBUSxNQUFNLEtBQUssS0FBSyxRQUFrQixNQUFNLFNBQVMsS0FBSyxRQUFRLFNBQVMsU0FBUyxTQUFTLE9BQU8sT0FBTyxDQUFDO0FBQUEsTUFDdkssUUFBUSxRQUFRLFFBQVEsT0FBTyxTQUFTO0FBQUEsTUFDeEMsT0FBTyxJQUFJLFNBQVMsU0FBUyxNQUFNLFFBQVE7QUFBQTtBQUFBO0FBQUEsRUFJbkQsTUFBTSxnQkFBOEUsSUFBSTtBQUFBLEVBQ3hGLE1BQU0sZ0JBQWdCLE9BQ2xCLE9BQ0EsWUFRQztBQUFBLElBQ0QsSUFBSSxPQUFPLFlBQVksVUFBVTtBQUFBLE1BQzdCLElBQUksWUFBWSxRQUFRO0FBQUEsUUFDcEIsTUFBSyxZQUFZLE1BQU07QUFBQSxNQUMzQjtBQUFBLE1BQ0EsSUFBSSxRQUFRLFdBQVcsZUFBZSxHQUFHO0FBQUEsUUFDckMsTUFBTSxZQUFZLFFBQVEsTUFBTSxlQUFlLEVBQUU7QUFBQSxRQUNqRCxNQUFNLGVBQWUsY0FBYyxJQUFJLFNBQVM7QUFBQSxRQUNoRCxJQUFJLGNBQWM7QUFBQSxVQUNkLGFBQWEsVUFBVSxPQUFPLFNBQVM7QUFBQSxVQUN2QyxhQUFhLFlBQVksUUFBUTtBQUFBLFFBQ3JDO0FBQUEsTUFDSjtBQUFBLE1BQ0E7QUFBQSxJQUNKO0FBQUEsSUFDQSxJQUFJLGNBQWMsS0FBSyxJQUFJLFFBQVEsSUFBSTtBQUFBLElBQ3ZDLElBQUksZ0JBQWdCLE1BQU07QUFBQSxNQUN0QixjQUFjLFVBQVUsY0FBYyxRQUFRO0FBQUEsTUFDOUMsSUFBSSxnQkFBZ0IsV0FBVztBQUFBLFFBQzNCLE1BQU0sT0FBTyxhQUFhLEVBQUUsTUFBTSxRQUFRLEtBQUssQ0FBQztBQUFBLE1BQ3BEO0FBQUEsTUFDQSxJQUFJLE9BQU8sWUFBWSxXQUFXO0FBQUEsUUFBWSxZQUFZLFNBQVMsTUFBTSxZQUFZO0FBQUEsTUFDaEY7QUFBQSxvQkFBWSxTQUFTLE1BQU0sWUFBWSxPQUFPO0FBQUEsTUFDbkQsS0FBSyxJQUFJLFFBQVEsTUFBTSxXQUFXO0FBQUEsSUFDdEM7QUFBQSxJQUVBLE1BQU0sVUFBVSxJQUFJLFFBQVEsUUFBUSxPQUFPO0FBQUEsSUFDM0MsTUFBTSxTQUFTLFFBQVEsVUFBVSxDQUFDO0FBQUEsSUFDbEMsTUFBTSxTQUFTLGFBQWEsU0FBUyxRQUFRLE1BQU0sUUFBUSxTQUFTO0FBQUEsSUFDcEUsSUFBSSxVQUE2QyxDQUFDO0FBQUEsSUFFbEQsTUFBTSxPQUFPLElBQUksTUFDYixDQUFDLEdBQ0Q7QUFBQSxNQUNJLEtBQUssQ0FBQyxRQUFRLGFBQWE7QUFBQSxRQUN2QixJQUFJLGFBQWE7QUFBQSxVQUFZLE9BQU87QUFBQSxRQUNwQztBQUFBO0FBQUEsTUFFSixLQUFLLE1BQU07QUFBQSxRQUNQLE1BQU0sT0FBTyxnQkFBZ0IsRUFBRSxVQUFVLGdCQUFnQixTQUFTLHFKQUFxSixDQUFDO0FBQUE7QUFBQSxJQUVoTyxDQUNKO0FBQUEsSUFFQSxNQUFNLGNBQWMsT0FBTyxTQUE4QjtBQUFBLE1BQ3JELElBQUksU0FBUztBQUFBLFFBQVUsY0FBYyxPQUFPLFFBQVEsU0FBUztBQUFBLE1BQzdELFFBQVEsUUFBUSxRQUFRLE9BQU8sUUFBUSxTQUFTO0FBQUEsTUFDaEQsV0FBVyxXQUFXLFNBQVM7QUFBQSxRQUMzQixJQUFJO0FBQUEsVUFDQSxNQUFNLFFBQVE7QUFBQSxVQUNoQixPQUFPLE9BQU87QUFBQSxVQUNaLE9BQU8sTUFBTSx1Q0FBdUMsS0FBSztBQUFBO0FBQUEsTUFFakU7QUFBQTtBQUFBLElBR0osTUFBTSxVQUFVLEVBQUUsTUFBWSxTQUFTLE9BQU87QUFBQSxJQUU5QyxJQUFJO0FBQUEsTUFDQSxJQUFJLFlBQVksU0FBUyxVQUFVO0FBQUEsUUFDL0IsTUFBTSxXQUFXLE1BQU0sU0FBUyxVQUFVLGFBQWE7QUFBQSxVQUNuRCxrQkFBa0IsUUFBUTtBQUFBLFVBQzFCLGVBQWU7QUFBQSxVQUNmLE1BQU0sUUFBUTtBQUFBLFVBQ2Q7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0EsWUFBWTtBQUFBLFFBQ2hCLENBQUM7QUFBQSxRQUNELFVBQVUsU0FBUztBQUFBLFFBRW5CLE1BQU0sWUFBWSxRQUFRO0FBQUEsUUFFMUIsSUFBSSxTQUFTLGFBQWE7QUFBQSxVQUN0QixNQUFLLFlBQVk7QUFBQSxZQUNiLFdBQVcsUUFBUTtBQUFBLFlBQ25CLFNBQVM7QUFBQSxZQUNULE1BQU07QUFBQSxVQUNWLENBQUM7QUFBQSxRQUNMLEVBQU87QUFBQSxVQUNILE1BQUssWUFBWTtBQUFBLFlBQ2IsV0FBVyxRQUFRO0FBQUEsWUFDbkIsU0FBUztBQUFBLFlBQ1QsTUFBTSxTQUFTLFFBQVE7QUFBQSxVQUMzQixDQUFDO0FBQUE7QUFBQSxNQUVUO0FBQUEsTUFDQSxJQUFJLFlBQVksU0FBUyxVQUFVO0FBQUEsUUFDL0IsTUFBTSxXQUFXLE1BQU0sU0FBUyxVQUFVLGFBQWE7QUFBQSxVQUNuRCxrQkFBa0IsUUFBUTtBQUFBLFVBQzFCLGVBQWU7QUFBQSxVQUNmLE1BQU0sUUFBUTtBQUFBLFVBQ2Q7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0EsWUFBWTtBQUFBLFFBQ2hCLENBQUM7QUFBQSxRQUNELFVBQVUsU0FBUztBQUFBLFFBRW5CLElBQUk7QUFBQSxVQUNBLE1BQUssWUFBWSxFQUFFLFNBQVMsTUFBTSxNQUFNLFdBQVcsV0FBVyxRQUFRLFdBQVcsTUFBTSxNQUFNLENBQUM7QUFBQSxVQUM5RixjQUFjLElBQUksUUFBUSxXQUFXLEVBQUUsV0FBVyxTQUFTLFFBQVEsT0FBTyxZQUFZLENBQUM7QUFBQSxVQUN2RixpQkFBaUIsU0FBUyxTQUFTLFFBQVEsT0FBTztBQUFBLFlBQzlDLE1BQU0sT0FBTyxFQUFFLFNBQVMsTUFBTSxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsV0FBVyxRQUFRLFdBQVcsTUFBTSxNQUFNO0FBQUEsWUFDN0YsTUFBSyxZQUFZLElBQUk7QUFBQSxVQUN6QjtBQUFBLFVBQ0EsTUFBSyxZQUFZLEVBQUUsU0FBUyxNQUFNLE1BQU0sV0FBVyxXQUFXLFFBQVEsV0FBVyxNQUFNLEtBQUssQ0FBQztBQUFBLFVBQy9GLE9BQU8sT0FBTztBQUFBLFVBQ1osTUFBTSxZQUFZLGlCQUFpQixRQUFRLFdBQVcsUUFBUSxLQUFLO0FBQUEsVUFDbkUsTUFBTSxTQUFjLENBQUM7QUFBQSxVQUNyQixPQUFPLFVBQVUsUUFBUSxVQUFVO0FBQUEsVUFDbkMsTUFBSyxZQUFZLEVBQUUsU0FBUyxNQUFNLE1BQU0sQ0FBQyxRQUFRLElBQUksR0FBRyxXQUFXLFFBQVEsV0FBVyxNQUFNLEtBQUssQ0FBQztBQUFBO0FBQUEsUUFFdEcsTUFBTSxZQUFZLFFBQVE7QUFBQSxNQUM5QjtBQUFBLE1BQ0YsT0FBTyxPQUFPO0FBQUEsTUFDWixNQUFNLFNBQVMsaUJBQWlCLFFBQVEsV0FBVyxRQUFRLEtBQUs7QUFBQSxNQUNoRSxNQUFLLFlBQVksRUFBRSxTQUFTLE9BQU8sTUFBTSxXQUFXLE9BQU8sUUFBUSxXQUFXLFFBQVEsV0FBVyxNQUFNLEtBQUssQ0FBQztBQUFBO0FBQUE7QUFBQSxFQUlySCxPQUFPO0FBQUEsSUFDSDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDSjtBQUFBOztBQ2xhRyxTQUFTLE1BQTRFLENBQUMsTUFBWSxNQUF1RDtBQUFBLEVBQzVKLE1BQU0sUUFBUSxFQUFFLGVBQWUsTUFBTSxNQUFNLEtBQUs7QUFBQSxFQUNoRCxNQUFNLGtCQUFrQixLQUFLO0FBQUEsRUFDN0IsT0FBTztBQUFBO0FBS0osU0FBUyxnQkFBZ0IsQ0FBQyxXQUFtQixRQUFnQixPQUFnRTtBQUFBLEVBQ2hJLElBQUk7QUFBQSxJQUNBLElBQUksZ0JBQWdCO0FBQUEsTUFBYSxXQUFtQixZQUFZLGlCQUFpQixLQUFLO0FBQUEsSUFDeEYsT0FBTyxRQUFPO0FBQUEsRUFDaEIsSUFBSSxpQkFBaUIsU0FBUyxnQkFBZ0I7QUFBQSxJQUFhLFdBQW1CLFdBQVcsaUJBQWlCLEtBQUs7QUFBQSxFQUMvRyxNQUFNLE9BQU8sT0FBTyxRQUFRLE9BQU8sUUFBUSxPQUFPLGFBQWEsUUFBUTtBQUFBLEVBRXZFLElBQUksT0FBTyxrQkFBa0IsUUFBUSxPQUFPLFNBQVMsYUFBYTtBQUFBLElBQzlELE9BQU8sS0FBSyxNQUFNLE9BQU8sTUFBTSxRQUFRLGNBQWM7QUFBQSxFQUN6RCxFQUFPO0FBQUEsSUFDSCxJQUFJO0FBQUEsTUFDQSxNQUFNLFFBQVEsT0FBTyxpQkFBaUIsT0FBTyxTQUFTLElBQUksTUFBTTtBQUFBLENBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxLQUFLO0FBQUEsQ0FBSSxJQUFLLE9BQU8sU0FBUztBQUFBLE1BQzdHLE9BQU8sTUFBTSxNQUFNO0FBQUEsRUFBSyxLQUFLLFVBQVUsT0FBTyxJQUFJLEtBQUs7QUFBQSxFQUFLO0FBQUEsQ0FBUztBQUFBLE1BQ3ZFLE9BQU8sR0FBRztBQUFBLE1BQ1IsT0FBTyxNQUFNLE1BQU07QUFBQSxFQUFLLE9BQU8sU0FBUyxLQUFLO0FBQUEsRUFBSyxPQUFPO0FBQUEsQ0FBUztBQUFBO0FBQUE7QUFBQSxFQUkxRSxJQUFJO0FBQUEsRUFFSixJQUFJLE9BQU8sa0JBQWtCO0FBQUEsSUFBTSxTQUFTLEVBQUUsU0FBUyxPQUFPLE1BQU0sTUFBTSxNQUFNLFFBQVEsTUFBTSxNQUFNLFVBQVU7QUFBQSxFQUN6RztBQUFBLGFBQVMsRUFBRSxTQUFTLE9BQU8sTUFBTSx5QkFBeUIsUUFBUSxXQUFXLFVBQVU7QUFBQSxFQUU1RixPQUFPO0FBQUE7IiwKICAiZGVidWdJZCI6ICJCODNBNjFDRDAyMEREQ0E0NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|