@dbx-tools/shared-core 0.6.61 → 0.6.62
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/README.md +73 -10
- package/index.ts +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/src/env.js +4 -6
- package/lib/src/object.d.ts +208 -7
- package/lib/src/object.js +277 -37
- package/package.json +1 -1
- package/src/env.ts +3 -4
- package/src/object.ts +360 -29
package/lib/src/object.js
CHANGED
|
@@ -2,12 +2,16 @@
|
|
|
2
2
|
* Dependency-free object + iterable utilities.
|
|
3
3
|
*
|
|
4
4
|
* Value guards / coercions / shape types: {@link isRecord} narrows parsed JSON
|
|
5
|
-
* to a record, {@link
|
|
6
|
-
*
|
|
7
|
-
* coerces a date/ISO string/epoch
|
|
5
|
+
* to a record, {@link toNumber} coerces a hand-typed numeral, {@link toBoolean}
|
|
6
|
+
* coerces loose truthy/falsy values, {@link toDuration} parses `1h30m` /
|
|
7
|
+
* `2 milliseconds` to millis, {@link toDate} coerces a date/ISO string/epoch
|
|
8
|
+
* number/relative duration (`toDate` and `toDuration` fall back to each other, so
|
|
9
|
+
* either accepts both readings), {@link optional}
|
|
8
10
|
* spreads a field only when it is present, {@link deepEqual} compares
|
|
9
|
-
* structurally,
|
|
10
|
-
*
|
|
11
|
+
* structurally, {@link isSerializableValue} rejects anything a JSON round trip
|
|
12
|
+
* would lose or coerce, {@link toStableKey} canonicalizes a value so an identity
|
|
13
|
+
* can be derived from it, and {@link NameLike}/{@link NonFunctionKeys} describe
|
|
14
|
+
* object shapes.
|
|
11
15
|
*
|
|
12
16
|
* Iterable helpers: {@link generator} flattens mixed arguments; {@link sequence}
|
|
13
17
|
* wraps source(s) in a lazy, `Array`-compatible {@link Sequence}. Every
|
|
@@ -635,6 +639,141 @@ export function* generator(...items) {
|
|
|
635
639
|
export function isRecord(value) {
|
|
636
640
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
637
641
|
}
|
|
642
|
+
/**
|
|
643
|
+
* True when `value` survives a JSON round trip with no loss and no coercion.
|
|
644
|
+
*
|
|
645
|
+
* Stricter than "`JSON.stringify` did not throw", because that succeeds while
|
|
646
|
+
* silently CHANGING the value: a `Date` becomes a string, `NaN` and `Infinity`
|
|
647
|
+
* become `null`, a `Map` becomes `{}`, and `undefined` disappears from an object
|
|
648
|
+
* or turns into `null` inside an array. Each of those reaches the far side as
|
|
649
|
+
* something other than what was sent, so all of them are rejected here.
|
|
650
|
+
*
|
|
651
|
+
* Rejected: non-finite numbers, `undefined`, functions, symbols, bigints, class
|
|
652
|
+
* instances and anything else with a prototype other than `Object.prototype` or
|
|
653
|
+
* `null` (`Date`, `Map`, `Set`, `RegExp`, `Buffer`), and any object graph
|
|
654
|
+
* containing a cycle. Accepted: strings, booleans, `null`, finite numbers, plain
|
|
655
|
+
* objects, arrays, and nestings of those.
|
|
656
|
+
*
|
|
657
|
+
* Narrows to {@link SerializableValue} rather than asserting, so it also serves
|
|
658
|
+
* as the validator for untrusted input - a request body, a decoded notification
|
|
659
|
+
* payload - where the answer should be a 400 and not a throw. Never throws.
|
|
660
|
+
*
|
|
661
|
+
* Distinct from {@link deepEqual}'s notion of comparable: that one HANDLES
|
|
662
|
+
* `Date`/`Map`/`Set` structurally, while this one rejects them precisely because
|
|
663
|
+
* JSON cannot carry them.
|
|
664
|
+
*
|
|
665
|
+
* @param ancestors Cycle-detection set for the recursive walk. Internal; callers
|
|
666
|
+
* pass one value.
|
|
667
|
+
*
|
|
668
|
+
* @example
|
|
669
|
+
* isSerializableValue({ a: [1, "x", null] }); // true
|
|
670
|
+
* isSerializableValue({ at: new Date() }); // false - would become a string
|
|
671
|
+
* isSerializableValue(Number.NaN); // false - would become null
|
|
672
|
+
*/
|
|
673
|
+
export function isSerializableValue(value, ancestors = new Set()) {
|
|
674
|
+
if (value === null || typeof value === "string" || typeof value === "boolean")
|
|
675
|
+
return true;
|
|
676
|
+
if (typeof value === "number")
|
|
677
|
+
return Number.isFinite(value);
|
|
678
|
+
if (typeof value !== "object")
|
|
679
|
+
return false;
|
|
680
|
+
const prototype = Object.getPrototypeOf(value);
|
|
681
|
+
if (!Array.isArray(value) && prototype !== Object.prototype && prototype !== null)
|
|
682
|
+
return false;
|
|
683
|
+
if (ancestors.has(value))
|
|
684
|
+
return false;
|
|
685
|
+
ancestors.add(value);
|
|
686
|
+
const valid = Array.isArray(value)
|
|
687
|
+
? value.every((entry) => isSerializableValue(entry, ancestors))
|
|
688
|
+
: Object.values(value).every((entry) => isSerializableValue(entry, ancestors));
|
|
689
|
+
ancestors.delete(value);
|
|
690
|
+
return valid;
|
|
691
|
+
}
|
|
692
|
+
/**
|
|
693
|
+
* Canonical string for a structured value, for deriving a STABLE IDENTITY from
|
|
694
|
+
* it - an advisory-lock id, a channel name, a cache key.
|
|
695
|
+
*
|
|
696
|
+
* The guarantee is two-way, which is what makes it safe to hash: values that
|
|
697
|
+
* should share an identity produce the same string (object key order does not
|
|
698
|
+
* matter), and values that should not are never conflated. Every token carries
|
|
699
|
+
* its type, so `1` and `"1"` differ; a string carries its length, so
|
|
700
|
+
* `["a", "bc"]` and `["ab", "c"]` differ; arrays keep order while object keys
|
|
701
|
+
* are sorted.
|
|
702
|
+
*
|
|
703
|
+
* `JSON.stringify` cannot do this job - key order leaks in, `undefined` vanishes,
|
|
704
|
+
* `1` and `"1"` collide after quoting is stripped, and a cycle throws a
|
|
705
|
+
* `TypeError` naming neither the value nor the caller's intent.
|
|
706
|
+
*
|
|
707
|
+
* Deliberately strict where a silent answer would be a WRONG identity rather
|
|
708
|
+
* than a missing one, since two callers disagreeing about a lock or a channel is
|
|
709
|
+
* invisible until it corrupts something. Throws `TypeError` on a cycle, on a
|
|
710
|
+
* non-finite number (`NaN` is not equal to itself, so it cannot have a stable
|
|
711
|
+
* identity), and on a `function` or `symbol` (no meaningful value identity).
|
|
712
|
+
* `undefined` and `null` are accepted as distinct tokens.
|
|
713
|
+
*
|
|
714
|
+
* `Date` is canonicalized by instant, unlike the hash canonicalizer in
|
|
715
|
+
* `./hash.ts`, which folds every `Date` onto one token. Prefer this function when
|
|
716
|
+
* distinctness is a correctness requirement; prefer `hash.fnvHash` when a short,
|
|
717
|
+
* collision-tolerant digest is enough.
|
|
718
|
+
*
|
|
719
|
+
* @param value - The value to canonicalize.
|
|
720
|
+
* @param seen - Cycle-detection set for the recursive walk. Internal; callers
|
|
721
|
+
* pass one value.
|
|
722
|
+
*
|
|
723
|
+
* @example
|
|
724
|
+
* toStableKey({ a: 1, b: 2 }) === toStableKey({ b: 2, a: 1 }); // true
|
|
725
|
+
* toStableKey(1) !== toStableKey("1"); // true
|
|
726
|
+
*/
|
|
727
|
+
export function toStableKey(value, seen = new Set()) {
|
|
728
|
+
if (value === null)
|
|
729
|
+
return "null";
|
|
730
|
+
switch (typeof value) {
|
|
731
|
+
case "string":
|
|
732
|
+
// Length-prefixed so concatenated neighbours cannot be re-split
|
|
733
|
+
// differently: `["a","bc"]` and `["ab","c"]` must not agree.
|
|
734
|
+
return `string:${value.length}:${value}`;
|
|
735
|
+
case "boolean":
|
|
736
|
+
return `boolean:${value}`;
|
|
737
|
+
case "bigint":
|
|
738
|
+
return `bigint:${value}`;
|
|
739
|
+
case "number":
|
|
740
|
+
if (!Number.isFinite(value))
|
|
741
|
+
throw new TypeError("Stable keys require finite numbers");
|
|
742
|
+
// `-0 === 0` but they stringify differently, so pick one spelling.
|
|
743
|
+
return `number:${Object.is(value, -0) ? "-0" : value}`;
|
|
744
|
+
case "undefined":
|
|
745
|
+
return "undefined";
|
|
746
|
+
case "object": {
|
|
747
|
+
if (seen.has(value))
|
|
748
|
+
throw new TypeError("Stable keys cannot contain cycles");
|
|
749
|
+
seen.add(value);
|
|
750
|
+
try {
|
|
751
|
+
if (value instanceof Date)
|
|
752
|
+
return `date:${value.toISOString()}`;
|
|
753
|
+
if (Array.isArray(value)) {
|
|
754
|
+
return `array:[${value.map((item) => toStableKey(item, seen)).join(",")}]`;
|
|
755
|
+
}
|
|
756
|
+
if (value instanceof Set) {
|
|
757
|
+
// Sorted by canonical form, so insertion order does not leak.
|
|
758
|
+
return `set:[${[...value]
|
|
759
|
+
.map((item) => toStableKey(item, seen))
|
|
760
|
+
.sort()
|
|
761
|
+
.join(",")}]`;
|
|
762
|
+
}
|
|
763
|
+
const entries = value instanceof Map ? value : Object.entries(value);
|
|
764
|
+
return `${value instanceof Map ? "map" : "object"}:{${[...entries]
|
|
765
|
+
.map(([key, item]) => `${toStableKey(key, seen)}=${toStableKey(item, seen)}`)
|
|
766
|
+
.sort()
|
|
767
|
+
.join(",")}}`;
|
|
768
|
+
}
|
|
769
|
+
finally {
|
|
770
|
+
seen.delete(value);
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
default:
|
|
774
|
+
throw new TypeError(`Unsupported stable key type: ${typeof value}`);
|
|
775
|
+
}
|
|
776
|
+
}
|
|
638
777
|
/**
|
|
639
778
|
* `{ [key]: value }` when `value` is present, otherwise `undefined` - so an
|
|
640
779
|
* absent optional field stays ABSENT when spread, rather than becoming an
|
|
@@ -653,6 +792,68 @@ export function isRecord(value) {
|
|
|
653
792
|
export function optional(key, value) {
|
|
654
793
|
return value === null || value === undefined ? undefined : { [key]: value };
|
|
655
794
|
}
|
|
795
|
+
/**
|
|
796
|
+
* Coerce a loose numeric value to a real, FINITE `number`, or `undefined` when it
|
|
797
|
+
* carries no numeric meaning.
|
|
798
|
+
*
|
|
799
|
+
* The one place a hand-typed number is interpreted, alongside {@link toBoolean},
|
|
800
|
+
* {@link toDate}, and {@link toDuration}. Reach for it instead of `Number(x)` or a
|
|
801
|
+
* hand-rolled numeric regex: bare `Number` maps `""`, `null`, `[]`, and
|
|
802
|
+
* whitespace to `0` and anything else to `NaN`, so a caller has to re-check the
|
|
803
|
+
* result every time, and ad hoc regexes tend to drift in what they accept.
|
|
804
|
+
*
|
|
805
|
+
* Accepts: a finite `number`; a `bigint`; or a decimal string with an optional
|
|
806
|
+
* leading sign, leading/trailing whitespace, whitespace after the sign,
|
|
807
|
+
* digit-group separators (`"1,000"`, `"1 000"`), a bare fraction (`".5"`), a
|
|
808
|
+
* trailing point (`"1."`), scientific notation (`"1e3"`), and an optional
|
|
809
|
+
* trailing percent sign (`"25%"`, `"1.5 %"`). A trailing `%` divides the parsed
|
|
810
|
+
* value by `100`, so `"25%"` becomes `0.25`.
|
|
811
|
+
*
|
|
812
|
+
* Separators are stripped without validating their placement, so `"1,00,0"` reads
|
|
813
|
+
* as `1000`; this is a coercion for hand-typed configuration, not a locale-aware
|
|
814
|
+
* validator. Anything else, including `NaN`, `Infinity`, an empty or
|
|
815
|
+
* whitespace-only string, `null`, `undefined`, a boolean, multiple signs,
|
|
816
|
+
* malformed exponents, misplaced percent signs, or `"12px"`, returns `undefined`.
|
|
817
|
+
*
|
|
818
|
+
* Returns `undefined` rather than throwing, matching the other coercions, so it
|
|
819
|
+
* composes naturally with `??` fallbacks.
|
|
820
|
+
*
|
|
821
|
+
* @example
|
|
822
|
+
* toNumber("1,000"); // 1000
|
|
823
|
+
* toNumber(" -2.5 "); // -2.5
|
|
824
|
+
* toNumber("1e3"); // 1000
|
|
825
|
+
* toNumber("12.5 %"); // 0.125
|
|
826
|
+
* toNumber(""); // undefined (Number("") would be 0)
|
|
827
|
+
* toNumber("12px"); // undefined
|
|
828
|
+
* toNumber("1 000", { separators: false }); // undefined
|
|
829
|
+
*/
|
|
830
|
+
export function toNumber(value, options = {}) {
|
|
831
|
+
if (typeof value === "number") {
|
|
832
|
+
return Number.isFinite(value) ? value : undefined;
|
|
833
|
+
}
|
|
834
|
+
else if (typeof value === "bigint") {
|
|
835
|
+
return toNumber(Number(value), options);
|
|
836
|
+
}
|
|
837
|
+
else if (typeof value === "string") {
|
|
838
|
+
// Strip surrounding whitespace, whitespace after a leading sign, digit-group
|
|
839
|
+
// separators (both `,` and the space in `"1 000"`), leaving a bare numeral for
|
|
840
|
+
// the shape test below to accept or reject.
|
|
841
|
+
const text = value.replace(options.separators === false ? /(^\s+|\s+$)/g : /(^\s+|\s+$|(?<=^[+-])\s+|(?<=\d)\s+|,)/g, "");
|
|
842
|
+
if (text) {
|
|
843
|
+
const match = text.match(/^([+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)(%)?$/i);
|
|
844
|
+
if (match && !(match[2] && options.percent === false)) {
|
|
845
|
+
const number = Number(match[1]);
|
|
846
|
+
return toNumber(match[2] ? number / 100 : number, options);
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
}
|
|
850
|
+
else {
|
|
851
|
+
// A boxed `Number`, or anything with a numeric `toString`. `String(value)`
|
|
852
|
+
// routes it back through the string branch, which rejects what is not numeric.
|
|
853
|
+
return toNumber(String(value), options);
|
|
854
|
+
}
|
|
855
|
+
return undefined;
|
|
856
|
+
}
|
|
656
857
|
/**
|
|
657
858
|
* Coerce a loose boolean-ish value to a real `boolean`, or `undefined`
|
|
658
859
|
* when it can't be interpreted. Recognizes `true`/`t`/`on`/`1`/`yes`/`y`
|
|
@@ -700,6 +901,18 @@ export function toBoolean(value) {
|
|
|
700
901
|
* claim.
|
|
701
902
|
*/
|
|
702
903
|
const SECONDS_CEILING = 1e11;
|
|
904
|
+
/**
|
|
905
|
+
* A number for {@link toDate} and {@link toDuration}, read with none of
|
|
906
|
+
* {@link toNumber}'s string leniencies.
|
|
907
|
+
*
|
|
908
|
+
* Both leniencies are actively harmful here. A space or comma separates FIELDS in
|
|
909
|
+
* a date (`2026 08 02` would fuse into the epoch `20260802`), and a percentage has
|
|
910
|
+
* no reading as an instant or a length of time, so `25%` must be a miss rather
|
|
911
|
+
* than `250ms`.
|
|
912
|
+
*/
|
|
913
|
+
function toBareNumber(value) {
|
|
914
|
+
return toNumber(value, { separators: false, percent: false });
|
|
915
|
+
}
|
|
703
916
|
/**
|
|
704
917
|
* Milliseconds per unit, keyed by SINGULAR alias. {@link toDuration} retries a
|
|
705
918
|
* lookup without a trailing `s`, so every plural spelling is covered without
|
|
@@ -743,21 +956,30 @@ const DURATION_TERM = /([+-]?)(\d+(?:\.\d+)?)\s*([a-z]+)/g;
|
|
|
743
956
|
* returning `1` silently would be worse than returning nothing - which is also
|
|
744
957
|
* what keeps {@link toDate} from mistaking `1 Jan 2026` for a duration.
|
|
745
958
|
*
|
|
959
|
+
* A value that is not a duration at all is offered to {@link toDate} and, when it
|
|
960
|
+
* IS a date, read as the signed offset from now (`date - now`), which makes the
|
|
961
|
+
* two functions inverses: a past instant is negative, a future one positive.
|
|
962
|
+
* `options.parseDate: false` turns that off when only a length of time makes
|
|
963
|
+
* sense - see {@link ToDurationOptions}.
|
|
964
|
+
*
|
|
746
965
|
* @example
|
|
747
966
|
* toDuration("30s"); // 30_000
|
|
748
967
|
* toDuration("1 hour 30 minutes"); // 5_400_000
|
|
749
968
|
* toDuration("-7 days"); // -604_800_000
|
|
750
969
|
* toDuration("2 weeks ago"); // -1_209_600_000
|
|
970
|
+
* toDuration("2026-08-02"); // ms from now to that instant
|
|
971
|
+
* toDuration("2026-08-02", { parseDate: false }); // undefined
|
|
751
972
|
* toDuration("soon"); // undefined
|
|
752
973
|
*/
|
|
753
|
-
export function toDuration(value) {
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
if (
|
|
760
|
-
return
|
|
974
|
+
export function toDuration(value, options = {}) {
|
|
975
|
+
// A bare number is already milliseconds, the same reading `toDate` gives an
|
|
976
|
+
// epoch value, so this must run before any date interpretation.
|
|
977
|
+
const num = toBareNumber(value);
|
|
978
|
+
if (num !== undefined)
|
|
979
|
+
return num;
|
|
980
|
+
if (typeof value !== "string") {
|
|
981
|
+
return options.parseDate === false ? undefined : dateAsDuration(value);
|
|
982
|
+
}
|
|
761
983
|
let text = value
|
|
762
984
|
.toLowerCase()
|
|
763
985
|
.replaceAll(/[,_]/g, "")
|
|
@@ -772,27 +994,42 @@ export function toDuration(value) {
|
|
|
772
994
|
if (!text)
|
|
773
995
|
return undefined;
|
|
774
996
|
const terms = [...text.matchAll(DURATION_TERM)];
|
|
775
|
-
if (terms.length === 0)
|
|
776
|
-
return undefined;
|
|
997
|
+
if (terms.length === 0) {
|
|
998
|
+
return options.parseDate === false ? undefined : dateAsDuration(value);
|
|
999
|
+
}
|
|
777
1000
|
// Everything outside the matched terms must be separators only; otherwise the
|
|
778
1001
|
// string is something else that merely CONTAINS a duration-shaped fragment.
|
|
779
1002
|
let leftover = text;
|
|
780
1003
|
for (const term of terms)
|
|
781
1004
|
leftover = leftover.replace(term[0], " ");
|
|
782
|
-
if (leftover.trim())
|
|
783
|
-
|
|
1005
|
+
if (leftover.trim()) {
|
|
1006
|
+
// A duration-shaped fragment inside other text is usually a DATE - `"2026-08-02"`
|
|
1007
|
+
// matches two terms and leaves separators behind.
|
|
1008
|
+
return options.parseDate === false ? undefined : dateAsDuration(value);
|
|
1009
|
+
}
|
|
784
1010
|
let total = 0;
|
|
785
1011
|
let sign = 1;
|
|
786
1012
|
for (const [, explicitSign, amount, unit] of terms) {
|
|
787
1013
|
if (explicitSign)
|
|
788
1014
|
sign = explicitSign === "-" ? -1 : 1;
|
|
789
1015
|
const unitMs = DURATION_UNIT_MS.get(unit) ?? DURATION_UNIT_MS.get(unit.replace(/s$/, ""));
|
|
790
|
-
if (unitMs === undefined)
|
|
791
|
-
return undefined;
|
|
1016
|
+
if (unitMs === undefined) {
|
|
1017
|
+
return options.parseDate === false ? undefined : dateAsDuration(value);
|
|
1018
|
+
}
|
|
792
1019
|
total += sign * Number(amount) * unitMs;
|
|
793
1020
|
}
|
|
794
1021
|
return negate ? -total : total;
|
|
795
1022
|
}
|
|
1023
|
+
/**
|
|
1024
|
+
* A date read as the signed offset from now (`date - now`), which is what makes
|
|
1025
|
+
* {@link toDuration} and {@link toDate} inverses of each other. Recurses with
|
|
1026
|
+
* duration parsing DISABLED so the two cannot hand a value back and forth
|
|
1027
|
+
* forever.
|
|
1028
|
+
*/
|
|
1029
|
+
function dateAsDuration(value) {
|
|
1030
|
+
const date = toDate(value, { parseDuration: false });
|
|
1031
|
+
return date === undefined ? undefined : date.getTime() - Date.now();
|
|
1032
|
+
}
|
|
796
1033
|
/**
|
|
797
1034
|
* Coerce a loose date-ish value to a real `Date`, or `undefined` when it can't be
|
|
798
1035
|
* interpreted. Accepts, in this order:
|
|
@@ -812,6 +1049,10 @@ export function toDuration(value) {
|
|
|
812
1049
|
* 1.7 billion years out. Numeric strings are therefore routed to the epoch path,
|
|
813
1050
|
* never to `Date.parse`.
|
|
814
1051
|
*
|
|
1052
|
+
* The duration fallback runs LAST, after `Date.parse`, so a real date is never
|
|
1053
|
+
* mistaken for an offset. `options.parseDuration: false` removes it entirely when
|
|
1054
|
+
* the value must be an absolute instant - see {@link ToDateOptions}.
|
|
1055
|
+
*
|
|
815
1056
|
* Like {@link toBoolean} this NEVER throws and returns `undefined` for anything
|
|
816
1057
|
* uninterpretable, so a caller decides whether a bad value is fatal, a warning,
|
|
817
1058
|
* or a fallback.
|
|
@@ -822,9 +1063,10 @@ export function toDuration(value) {
|
|
|
822
1063
|
* toDate("1785697899"); // seconds -> 2026-08-02T...
|
|
823
1064
|
* toDate(1785697899000); // millis -> the same instant
|
|
824
1065
|
* toDate("30 days ago"); // now - 30d
|
|
1066
|
+
* toDate("30 days ago", { parseDuration: false }); // undefined
|
|
825
1067
|
* toDate("nope"); // undefined
|
|
826
1068
|
*/
|
|
827
|
-
export function toDate(value) {
|
|
1069
|
+
export function toDate(value, options = {}) {
|
|
828
1070
|
if (value instanceof Date) {
|
|
829
1071
|
return Number.isNaN(value.getTime()) ? undefined : value;
|
|
830
1072
|
}
|
|
@@ -836,30 +1078,28 @@ export function toDate(value) {
|
|
|
836
1078
|
const text = value.trim().toLowerCase();
|
|
837
1079
|
if (text === "now" || text === "today")
|
|
838
1080
|
return new Date();
|
|
839
|
-
const offsetMs = toDuration(value);
|
|
840
|
-
if (offsetMs !== undefined)
|
|
841
|
-
return fromMs(Date.now() + offsetMs);
|
|
842
1081
|
const parsed = Date.parse(value.trim());
|
|
843
|
-
|
|
1082
|
+
if (!Number.isNaN(parsed))
|
|
1083
|
+
return new Date(parsed);
|
|
1084
|
+
if (options.parseDuration === false)
|
|
1085
|
+
return undefined;
|
|
1086
|
+
// Recurses with date parsing DISABLED so the two cannot hand a value back and
|
|
1087
|
+
// forth forever.
|
|
1088
|
+
const offsetMs = toDuration(value, { parseDate: false });
|
|
1089
|
+
return offsetMs === undefined ? undefined : fromMs(Date.now() + offsetMs);
|
|
844
1090
|
}
|
|
845
1091
|
/** A `Date` for epoch `ms`, or `undefined` when it is out of representable range. */
|
|
846
1092
|
function fromMs(ms) {
|
|
847
1093
|
const date = new Date(ms);
|
|
848
1094
|
return Number.isNaN(date.getTime()) ? undefined : date;
|
|
849
1095
|
}
|
|
850
|
-
/**
|
|
1096
|
+
/**
|
|
1097
|
+
* Epoch milliseconds for a numeric value/string, or `undefined` when not one,
|
|
1098
|
+
* applying the seconds-vs-millis inference at {@link SECONDS_CEILING}.
|
|
1099
|
+
*/
|
|
851
1100
|
function toEpochMs(value) {
|
|
852
|
-
|
|
853
|
-
if (
|
|
854
|
-
numeric = value;
|
|
855
|
-
}
|
|
856
|
-
else if (typeof value === "string" && /^[+-]?\d+(\.\d+)?$/.test(value.trim())) {
|
|
857
|
-
numeric = Number(value.trim());
|
|
858
|
-
}
|
|
859
|
-
else {
|
|
860
|
-
return undefined;
|
|
861
|
-
}
|
|
862
|
-
if (!Number.isFinite(numeric))
|
|
1101
|
+
const numeric = toBareNumber(value);
|
|
1102
|
+
if (numeric === undefined)
|
|
863
1103
|
return undefined;
|
|
864
1104
|
return Math.abs(numeric) < SECONDS_CEILING ? numeric * 1000 : numeric;
|
|
865
1105
|
}
|
|
@@ -940,4 +1180,4 @@ export function deepEqual(a, b, comparator) {
|
|
|
940
1180
|
}
|
|
941
1181
|
return true;
|
|
942
1182
|
}
|
|
943
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29iamVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQTBCSCxzRUFBc0U7QUFDdEUsTUFBTSxVQUFVLFdBQVcsQ0FBYyxLQUFtQjtJQUMxRCxPQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLENBQUM7QUFjRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQWMsS0FBYztJQUN0RCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxZQUFZLEdBQUcsSUFBSSxLQUFLLFlBQVksR0FBRyxDQUFDO0FBQzlFLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQ3JCLFVBQXlELEVBQ3pELE9BQWlDO0lBRWpDLFNBQVMsS0FBSyxDQUFDLEtBQWMsRUFBRSxJQUFtQjtRQUNoRCxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNsQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7YUFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3JDLElBQUksSUFBSSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDbEMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDekIsT0FBTyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENB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QUUsT0FBTyxLQUFLLENBQUM7UUFDeEMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBNEIsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBNEIsQ0FBQyxDQUFDO0lBQ3hELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsTUFBTTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ2hELEtBQUssTUFBTSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDaEUsSUFDRSxDQUFDLFNBQVMsQ0FDUCxDQUE2QixDQUFDLEdBQUcsQ0FBQyxFQUNsQyxDQUE2QixDQUFDLEdBQUcsQ0FBQyxFQUNuQyxVQUFVLENBQ1gsRUFDRCxDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGVwZW5kZW5jeS1mcmVlIG9iamVjdCArIGl0ZXJhYmxlIHV0aWxpdGllcy5cbiAqXG4gKiBWYWx1ZSBndWFyZHMgLyBjb2VyY2lvbnMgLyBzaGFwZSB0eXBlczoge0BsaW5rIGlzUmVjb3JkfSBuYXJyb3dzIHBhcnNlZCBKU09OXG4gKiB0byBhIHJlY29yZCwge0BsaW5rIHRvQm9vbGVhbn0gY29lcmNlcyBsb29zZSB0cnV0aHkvZmFsc3kgdmFsdWVzLCB7QGxpbmtcbiAqIHRvRHVyYXRpb259IHBhcnNlcyBgMWgzMG1gIC8gYDIgbWlsbGlzZWNvbmRzYCB0byBtaWxsaXMsIHtAbGluayB0b0RhdGV9XG4gKiBjb2VyY2VzIGEgZGF0ZS9JU08gc3RyaW5nL2Vwb2NoIG51bWJlci9yZWxhdGl2ZSBkdXJhdGlvbiwge0BsaW5rIG9wdGlvbmFsfVxuICogc3ByZWFkcyBhIGZpZWxkIG9ubHkgd2hlbiBpdCBpcyBwcmVzZW50LCB7QGxpbmsgZGVlcEVxdWFsfSBjb21wYXJlc1xuICogc3RydWN0dXJhbGx5LCBhbmQge0BsaW5rIE5hbWVMaWtlfS97QGxpbmsgTm9uRnVuY3Rpb25LZXlzfSBkZXNjcmliZSBvYmplY3RcbiAqIHNoYXBlcy5cbiAqXG4gKiBJdGVyYWJsZSBoZWxwZXJzOiB7QGxpbmsgZ2VuZXJhdG9yfSBmbGF0dGVucyBtaXhlZCBhcmd1bWVudHM7IHtAbGluayBzZXF1ZW5jZX1cbiAqIHdyYXBzIHNvdXJjZShzKSBpbiBhIGxhenksIGBBcnJheWAtY29tcGF0aWJsZSB7QGxpbmsgU2VxdWVuY2V9LiBFdmVyeVxuICogdHJhbnNmb3JtL3Rlcm1pbmFsIGlzIGEgc3RhbmRhbG9uZSBmdW5jdGlvbiBvcGVyYXRpbmcgb24gcGxhaW4ge0BsaW5rXG4gKiBDb250YWluZXJ9cyAoc2VlIHtAbGluayBtYXB9LCB7QGxpbmsgZmlsdGVyfSwge0BsaW5rIGdyb3VwfSwgLi4uKTsgdGhlIHtAbGlua1xuICogU2VxdWVuY2V9IG1ldGhvZHMgYXJlIHRoaW4gZm9yd2FyZGVycyBvdmVyIHRoZW0gc28gdGhlIHNhbWUgbG9naWMgYmFja3MgYm90aFxuICogdGhlIGZyZWUtZnVuY3Rpb24gYW5kIHRoZSBmbHVlbnQvY2hhaW5lZCBzdHlsZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbi8qKiBMYXp5IHNlcXVlbmNlIG92ZXIgaXRlcmFibGUgc291cmNlKHMpLiBTZWUge0BsaW5rIHNlcXVlbmNlfS4gKi9cbmV4cG9ydCB0eXBlIFNlcXVlbmNlPFQ+ID0gU2VxdWVuY2VJbXBsPFQ+O1xuXG50eXBlIFNlcXVlbmNlU291cmNlPFQ+ID0gSXRlcmFibGU8VD4gfCBSZWFkb25seU1hcDx1bmtub3duLCBUPiB8IE9uZU9yTWFueTxUPiB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogQSBub24tc2NhbGFyIHtAbGluayBJdGVyYWJsZX0gLSBvbmUgdG8gdHJlYXQgYXMgYSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzXG4gKiByYXRoZXIgdGhhbiBhIHNjYWxhci4ge0BsaW5rIGlzQ29udGFpbmVyfSBuYXJyb3dzIHRvIHRoaXMsIGV4Y2x1ZGluZyBzdHJpbmdzLFxuICogYFN0cmluZ2AvYFJlZ0V4cGAgb2JqZWN0cywgYW5kIGZ1bmN0aW9ucy4ge0BsaW5rIENvbGxlY3Rpb259IGlzIHRoZSBlYWdlcmx5LVxuICogc2l6ZWQgc3Vic2V0LiBUaGUgZWxlbWVudCBkZWZhdWx0cyB0byBgdW5rbm93bmAgc28gYW55IGBDb2xsZWN0aW9uYCBpc1xuICogYXNzaWduYWJsZSB0byBhIGJhcmUgYENvbnRhaW5lcmAuXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRhaW5lcjxUID0gdW5rbm93bj4gPSBJdGVyYWJsZTxUPjtcblxuLyoqXG4gKiBBIGJ1aWx0LWluLCBlYWdlcmx5LXNpemVkIHtAbGluayBDb250YWluZXJ9OiBhbiB7QGxpbmsgQXJyYXl9LCB7QGxpbmsgU2V0fSwgb3JcbiAqIHtAbGluayBNYXB9ICh3aG9zZSAqdmFsdWVzKiBhcmUgYFRgIC0gYSBNYXAgaXRlcmF0ZXMgYFtrZXksIHZhbHVlXWAgZW50cmllcyxcbiAqIHNvIGl0cyBlbGVtZW50IHR5cGUgZGlmZmVycywgYnV0IGl0cyB2YWx1ZSB0eXBlIGlzIGBUYCkuIEFsbCBzaGFyZSBhIGNoZWFwXG4gKiBlbXB0aW5lc3MgY2hlY2sgKHtAbGluayBpc0VtcHR5fSkuXG4gKi9cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb248VD4gPSBSZWFkb25seUFycmF5PFQ+IHwgUmVhZG9ubHlTZXQ8VD4gfCBSZWFkb25seU1hcDx1bmtub3duLCBUPjtcblxuZXhwb3J0IHR5cGUgT25lT3JNYW55PFQ+ID0gW1QsIC4uLlRbXV07XG5cbi8qKiBOYXJyb3cgYSByZWFkb25seSBhcnJheSB0byBhIG5vbi1lbXB0eSB7QGxpbmsgT25lT3JNYW55fSB0dXBsZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc09uZU9yTWFueTxUID0gdW5rbm93bj4odmFsdWU6IHJlYWRvbmx5IFRbXSk6IHZhbHVlIGlzIE9uZU9yTWFueTxUPiB7XG4gIHJldHVybiB2YWx1ZS5sZW5ndGggPiAwO1xufVxuXG4vKiogQSBzb3VyY2UgYWNjZXB0ZWQgYnkgYSB2YXJpYWRpYyBvcDogYSB7QGxpbmsgQ29udGFpbmVyfSBvZiBgVGAsIG9yIG5vdGhpbmcuICovXG50eXBlIFNvdXJjZTxUPiA9IENvbnRhaW5lcjxUPiB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRWxlbWVudCB0eXBlIG9mIGEge0BsaW5rIGdyb3VwfSBidWNrZXQgYXJyYXk6IHdoZW4gdGhlIHByZWRpY2F0ZSBgUGAgaXMgYSB0eXBlXG4gKiBndWFyZCAoYHZhbHVlIGlzIFNgKSwgdGhlIGJ1Y2tldCBpcyBuYXJyb3dlZCB0byBgUyAmIFRgOyBvdGhlcndpc2UgaXQgc3RheXMgYFRgLlxuICovXG50eXBlIEdyb3VwVmFsdWU8VCwgUD4gPSBQIGV4dGVuZHMgKHZhbHVlOiBhbnksIC4uLnJlc3Q6IGFueVtdKSA9PiB2YWx1ZSBpcyBpbmZlciBTID8gUyAmIFQgOiBUO1xuXG4vKiogQSBtYXAgb2YgZ3JvdXAgbmFtZSAtPiBwcmVkaWNhdGUsIGFzIGFjY2VwdGVkIGJ5IHtAbGluayBncm91cH0uICovXG50eXBlIEdyb3VwUHJlZGljYXRlczxUPiA9IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbj47XG5cbi8qKlxuICogVHlwZSBndWFyZCBmb3IgYSB7QGxpbmsgQ29sbGVjdGlvbn06IGFuIHtAbGluayBBcnJheX0sIHtAbGluayBTZXR9LCBvclxuICoge0BsaW5rIE1hcH0uIE5hcnJvd3MgYHZhbHVlYCBzbyBpdHMgZWxlbWVudC92YWx1ZSB0eXBlIGlzIHRyZWF0ZWQgYXMgYFRgLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIEVsZW1lbnQgKG9yIE1hcCB2YWx1ZSkgdHlwZSBhc3NlcnRlZCBmb3IgdGhlIGNvbGxlY3Rpb24uXG4gKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byB0ZXN0LlxuICogQHJldHVybnMgYHRydWVgIChuYXJyb3dpbmcgYHZhbHVlYCB0byB7QGxpbmsgQ29sbGVjdGlvbn08YFRgPikgZm9yIGFcbiAqICAgYnVpbHQtaW4gYXJyYXkvc2V0L21hcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29sbGVjdGlvbjxUID0gdW5rbm93bj4odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBDb2xsZWN0aW9uPFQ+IHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHZhbHVlIGluc3RhbmNlb2YgU2V0IHx8IHZhbHVlIGluc3RhbmNlb2YgTWFwO1xufVxuXG4vKipcbiAqIGB0cnVlYCB3aGVuIGEge0BsaW5rIENvbGxlY3Rpb259IGhhcyBubyBlbGVtZW50cy4gVXNlcyBgbGVuZ3RoYCBmb3IgYXJyYXlzXG4gKiBhbmQgYHNpemVgIGZvciB7QGxpbmsgU2V0fS97QGxpbmsgTWFwfS5cbiAqXG4gKiBAcGFyYW0gY29sbGVjdGlvbiAtIFRoZSBhcnJheSwgc2V0LCBvciBtYXAgdG8gdGVzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHkoXG4gIGNvbGxlY3Rpb246IENvbGxlY3Rpb248dW5rbm93bj4gfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgb3B0aW9ucz86IHsgcmVjdXJzaXZlPzogYm9vbGVhbiB9LFxuKTogYm9vbGVhbiB7XG4gIGZ1bmN0aW9uIHZpc2l0KHZhbHVlOiB1bmtub3duLCBzZWVuPzogU2V0PHVua25vd24+KTogYm9vbGVhbiB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBpZiAoc2Vlbj8uaGFzKHZhbHVlKSkgcmV0dXJuIHRydWU7XG4gICAgICBzZWVuPy5hZGQodmFsdWUpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPT09IDAgfHwgKHNlZW4gPyB2YWx1ZS5ldmVyeSgoaXRlbSkgPT4gdmlzaXQoaXRlbSwgc2VlbikpIDogZmFsc2UpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5zaXplID09PSAwIHx8IChzZWVuID8gWy4uLnZhbHVlXS5ldmVyeSgoaXRlbSkgPT4gdmlzaXQoaXRlbSwgc2VlbikpIDogZmFsc2UpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgdmFsdWUuc2l6ZSA9PT0gMCB8fFxuICAgICAgICAgIChzZWVuID8gWy4uLnZhbHVlLnZhbHVlcygpXS5ldmVyeSgoaXRlbSkgPT4gdmlzaXQoaXRlbSwgc2VlbikpIDogZmFsc2UpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICAgICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChzZWVuKSB7XG4gICAgICAgIHJldHVybiBrZXlzLmV2ZXJ5KChrZXkpID0+IHZpc2l0KCh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSwgc2VlbikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB2aXNpdChjb2xsZWN0aW9uLCBvcHRpb25zPy5yZWN1cnNpdmUgPyBuZXcgU2V0KCkgOiB1bmRlZmluZWQpO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBzb3VyY2UgdG8gYW4gaXRlcmFibGUgb2YgaXRzIGBUYCB2YWx1ZXMsIHNvIE1hcHMgYXJlIHRyZWF0ZWRcbiAqIHVuaWZvcm1seSB3aXRoIGFycmF5cy9zZXRzOiBhIHtAbGluayBNYXB9IHlpZWxkcyBpdHMgKnZhbHVlcyogKG1hdGNoaW5nXG4gKiB7QGxpbmsgQ29sbGVjdGlvbn0ncyB2YWx1ZS10eXBlZCBgVGApLCBhbnkgb3RoZXIgaXRlcmFibGUgeWllbGRzIGl0c2VsZi4gVGhpc1xuICogaXMgd2hhdCB7QGxpbmsgc2VxdWVuY2V9IGNvbnN1bWVzLCBzbyBhIGBNYXBgIGNvbnRyaWJ1dGVzIHZhbHVlcyBldmVyeXdoZXJlXG4gKiByYXRoZXIgdGhhbiBgW2tleSwgdmFsdWVdYCBlbnRyaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsdWVzPFQ+KHNvdXJjZTogSXRlcmFibGU8VD4gfCBSZWFkb25seU1hcDx1bmtub3duLCBUPik6IEl0ZXJhYmxlPFQ+IHtcbiAgcmV0dXJuIHNvdXJjZSBpbnN0YW5jZW9mIE1hcCA/IHNvdXJjZS52YWx1ZXMoKSA6IChzb3VyY2UgYXMgSXRlcmFibGU8VD4pO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgZm9yIGEge0BsaW5rIENvbnRhaW5lcn0gLSBhbiBpdGVyYWJsZSB0byBiZSB0cmVhdGVkIGFzIGEgY29sbGVjdGlvblxuICogcmF0aGVyIHRoYW4gYSBzY2FsYXIuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGV4Y2x1ZGVzIHZhbHVlcyB0aGF0IGFyZSB0ZWNobmljYWxseSBpdGVyYWJsZSBidXQgc2hvdWxkIGJlXG4gKiB0cmVhdGVkIGFzIHNjYWxhcnMgaGVyZSAtIHN0cmluZ3MsIGBTdHJpbmdgL2BSZWdFeHBgIG9iamVjdHMsIGFuZCBmdW5jdGlvbnMgLVxuICogc28gYSBsb25lIHN0cmluZyBpcyBuZXZlciBzcHJlYWQgY2hhcmFjdGVyLWJ5LWNoYXJhY3Rlci5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBFbGVtZW50IHR5cGUgYXNzZXJ0ZWQgZm9yIHRoZSBpdGVyYWJsZS5cbiAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIHRlc3QuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgKG5hcnJvd2luZyBgdmFsdWVgIHRvIHtAbGluayBDb250YWluZXJ9PGBUYD4pIGZvciBhIG5vbi1zdHJpbmdcbiAqICAgaXRlcmFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbnRhaW5lcjxUID0gdW5rbm93bj4odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBDb250YWluZXI8VD4ge1xuICByZXR1cm4gKFxuICAgIHZhbHVlICE9IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgJiZcbiAgICAhKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSAmJlxuICAgICEodmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApICYmXG4gICAgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIgJiZcbiAgICB0eXBlb2YgKHZhbHVlIGFzIHsgW1N5bWJvbC5pdGVyYXRvcl0/OiB1bmtub3duIH0pW1N5bWJvbC5pdGVyYXRvcl0gPT09IFwiZnVuY3Rpb25cIlxuICApO1xufVxuXG5mdW5jdGlvbiBzZXF1ZW5jZVNvdXJjZXM8VD4oLi4uc291cmNlczogU2VxdWVuY2VTb3VyY2U8VD5bXSk6IEl0ZXJhYmxlPFQ+W10ge1xuICBjb25zdCBzb3VyY2VJdGVyYWJsZXM6IEl0ZXJhYmxlPFQ+W10gPSBbXTtcbiAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlcykge1xuICAgIGlmIChzb3VyY2UgPT0gbnVsbCB8fCAoaXNDb2xsZWN0aW9uKHNvdXJjZSkgJiYgaXNFbXB0eShzb3VyY2UpKSkgY29udGludWU7XG4gICAgc291cmNlSXRlcmFibGVzLnB1c2godmFsdWVzKHNvdXJjZSkpO1xuICB9XG4gIHJldHVybiBzb3VyY2VJdGVyYWJsZXM7XG59XG5cbi8qKlxuICogRmxhdHRlbnMgbmVzdGVkIGFycmF5cyBmb3Ige0BsaW5rIGZsYXR9LiBOb24tYXJyYXkgdmFsdWVzIGFyZSB3cmFwcGVkIGFzIGFcbiAqIHNpbmdsZS1lbGVtZW50IGl0ZXJhYmxlOyBkZXB0aCBkZWNyZW1lbnRzIHBlciBhcnJheSBsZXZlbC5cbiAqL1xuZnVuY3Rpb24gZmxhdHRlblZhbHVlKHZhbHVlOiB1bmtub3duLCBkZXB0aDogbnVtYmVyKTogSXRlcmFibGU8dW5rbm93bj4ge1xuICBpZiAoZGVwdGggPiAwICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgY29uc3QgbmV4dERlcHRoID0gTnVtYmVyLmlzRmluaXRlKGRlcHRoKSA/IGRlcHRoIC0gMSA6IGRlcHRoO1xuICAgIHJldHVybiB7XG4gICAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkgeWllbGQqIGZsYXR0ZW5WYWx1ZShpdGVtLCBuZXh0RGVwdGgpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG4gIHJldHVybiBbdmFsdWVdO1xufVxuXG4vKiogV3JhcCBhIHBlci1lbGVtZW50IHRyYW5zZm9ybSAoZWFjaCBlbGVtZW50IC0+IGFuIGl0ZXJhYmxlKSBhcyBhIGxhenkge0BsaW5rIFNlcXVlbmNlfS4gKi9cbmZ1bmN0aW9uIGRlcml2ZTxULCBVPihcbiAgc291cmNlOiBJdGVyYWJsZTxUPixcbiAgZm46ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gSXRlcmFibGU8VT4sXG4pOiBTZXF1ZW5jZTxVPiB7XG4gIHJldHVybiBzZXF1ZW5jZSh7XG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygc291cmNlKSB5aWVsZCogZm4odmFsdWUsIGluZGV4KyspO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKiogTGlrZSB7QGxpbmsgZGVyaXZlfSwgYnV0IHlpZWxkcyBvbmUgdmFsdWUgcGVyIHNvdXJjZSBlbGVtZW50IChubyB3cmFwcGVyIGl0ZXJhYmxlKS4gKi9cbmZ1bmN0aW9uIGRlcml2ZU9uZTxULCBVPihzb3VyY2U6IEl0ZXJhYmxlPFQ+LCBmbjogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBVKTogU2VxdWVuY2U8VT4ge1xuICByZXR1cm4gc2VxdWVuY2Uoe1xuICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNvdXJjZSkgeWllbGQgZm4odmFsdWUsIGluZGV4KyspO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUubWFwYCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqXG4gKiBAcGFyYW0gc291cmNlIC0gVGhlIGNvbnRhaW5lciB0byBtYXAgKG51bGxpc2ggeWllbGRzIGFuIGVtcHR5IHNlcXVlbmNlKS5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIENhbGxlZCBwZXIgZWxlbWVudCB3aXRoIGl0cyBpbmRleDsgaXRzIHJlc3VsdCBpcyBlbWl0dGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwPFQsIFU+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgY2FsbGJhY2s6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gVSxcbik6IFNlcXVlbmNlPFU+IHtcbiAgcmV0dXJuIGRlcml2ZU9uZShzZXF1ZW5jZShzb3VyY2UpLCBjYWxsYmFjayk7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5maWx0ZXJgLCBvdmVyIGEgc2luZ2xlIHtAbGluayBDb250YWluZXJ9LlxuICogQSB0eXBlLWd1YXJkIHByZWRpY2F0ZSBuYXJyb3dzIHRoZSByZXN1bHRpbmcgZWxlbWVudCB0eXBlLlxuICpcbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgY29udGFpbmVyIHRvIGZpbHRlciAobnVsbGlzaCB5aWVsZHMgYW4gZW1wdHkgc2VxdWVuY2UpLlxuICogQHBhcmFtIHByZWRpY2F0ZSAtIEtlZXBzIGVsZW1lbnRzIGZvciB3aGljaCBpdCByZXR1cm5zIGB0cnVlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlcjxULCBTIGV4dGVuZHMgVD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdmFsdWUgaXMgUyxcbik6IFNlcXVlbmNlPFM+O1xuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlcjxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogU2VxdWVuY2U8VD47XG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyPFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBTZXF1ZW5jZTxUPiB7XG4gIHJldHVybiBkZXJpdmUoc2VxdWVuY2Uoc291cmNlKSwgZnVuY3Rpb24qICh2YWx1ZSwgaW5kZXgpIHtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCkpIHlpZWxkIHZhbHVlO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDb25jYXRlbmF0ZXMgdGhlIHNvdXJjZXMgYW5kIHlpZWxkcyBvbmx5IGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBgbnVsbGAgb3JcbiAqIGB1bmRlZmluZWRgLCBuYXJyb3dpbmcgdGhlIGVsZW1lbnQgdHlwZSB0byB7QGxpbmsgTm9uTnVsbGFibGV9PGBUYD4uXG4gKlxuICogQHBhcmFtIHNvdXJjZXMgLSBDb250YWluZXJzIHRvIGNvbmNhdGVuYXRlIChudWxsaXNoIHNvdXJjZXMgYXJlIHNraXBwZWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9uTnVsbDxUPiguLi5zb3VyY2VzOiByZWFkb25seSBTb3VyY2U8VD5bXSk6IFNlcXVlbmNlPE5vbk51bGxhYmxlPFQ+PiB7XG4gIHJldHVybiBmaWx0ZXIoc2VxdWVuY2UoLi4uc291cmNlcyksICh2YWx1ZSk6IHZhbHVlIGlzIE5vbk51bGxhYmxlPFQ+ID0+IHZhbHVlICE9IG51bGwpO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZmxhdE1hcGAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKlxuICogQHBhcmFtIHNvdXJjZSAtIFRoZSBjb250YWluZXIgdG8gbWFwIChudWxsaXNoIHlpZWxkcyBhbiBlbXB0eSBzZXF1ZW5jZSkuXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBSZXR1cm5zIGEgdmFsdWUgb3IgYXJyYXkgb2YgdmFsdWVzLCBmbGF0dGVuZWQgb25lIGxldmVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmxhdE1hcDxULCBVPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IFUgfCBSZWFkb25seUFycmF5PFU+LFxuKTogU2VxdWVuY2U8VT4ge1xuICByZXR1cm4gZGVyaXZlKHNlcXVlbmNlKHNvdXJjZSksIGZ1bmN0aW9uKiAodmFsdWUsIGluZGV4KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gY2FsbGJhY2sodmFsdWUsIGluZGV4KTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB5aWVsZCogcmVzdWx0O1xuICAgIGVsc2UgeWllbGQgcmVzdWx0IGFzIFU7XG4gIH0pO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZmxhdGAgKGFycmF5cyBvbmx5KS4gYGRlcHRoYCBsZWFkcyBzbyB0aGVcbiAqIHNvdXJjZXMgY2FuIHN0YXkgdmFyaWFkaWM7IHVzZSBgZGVwdGggPCAxYCBmb3IgYSBuby1vcCBwYXNzdGhyb3VnaC5cbiAqXG4gKiBAcGFyYW0gZGVwdGggLSBIb3cgbWFueSBhcnJheSBsZXZlbHMgdG8gZmxhdHRlbi5cbiAqIEBwYXJhbSBzb3VyY2VzIC0gQ29udGFpbmVycyB0byBjb25jYXRlbmF0ZSwgdGhlbiBmbGF0dGVuIChudWxsaXNoIHNraXBwZWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmxhdDxUPihkZXB0aDogbnVtYmVyLCAuLi5zb3VyY2VzOiByZWFkb25seSBTb3VyY2U8VD5bXSk6IFNlcXVlbmNlPFQ+IHtcbiAgY29uc3Qgc3JjID0gc2VxdWVuY2UoLi4uc291cmNlcyk7XG4gIGlmIChkZXB0aCA8IDEpIHJldHVybiBzcmM7XG4gIHJldHVybiBkZXJpdmUoc3JjLCAodmFsdWUpID0+IGZsYXR0ZW5WYWx1ZSh2YWx1ZSwgZGVwdGgpKSBhcyBTZXF1ZW5jZTxUPjtcbn1cblxuLyoqXG4gKiBDb25jYXRlbmF0ZXMgdGhlIHNvdXJjZXMsIHRoZW4gbGF6aWx5IHlpZWxkcyB2YWx1ZXMgaW4gZW5jb3VudGVyIG9yZGVyLFxuICogc2tpcHBpbmcgYSB2YWx1ZSBvbmx5IHdoZW4gYW4gZXF1YWwgb25lIHdhcyBhbHJlYWR5IHlpZWxkZWQgKGBTZXRgIC9cbiAqIFNhbWVWYWx1ZVplcm8pLiBVbmlxdWVuZXNzIGlzIGNoZWNrZWQgcGVyIGVsZW1lbnQgYXMgaXQgaXMgY29uc3VtZWQuXG4gKlxuICogQHBhcmFtIHNvdXJjZXMgLSBDb250YWluZXJzIHRvIGNvbmNhdGVuYXRlIChudWxsaXNoIHNvdXJjZXMgYXJlIHNraXBwZWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzdGluY3Q8VD4oLi4uc291cmNlczogcmVhZG9ubHkgU291cmNlPFQ+W10pOiBTZXF1ZW5jZTxUPiB7XG4gIGNvbnN0IHNyYyA9IHNlcXVlbmNlKC4uLnNvdXJjZXMpO1xuICByZXR1cm4gc2VxdWVuY2Uoe1xuICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PFQ+KCk7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNyYykge1xuICAgICAgICBpZiAoc2Vlbi5oYXModmFsdWUpKSBjb250aW51ZTtcbiAgICAgICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgICAgICB5aWVsZCB2YWx1ZTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBZaWVsZHMgYHNvdXJjZWAsIHRoZW4gZWFjaCBhcHBlbmRlZCBgaXRlbWAgaW4gb3JkZXIgKGFycmF5cyBzcHJlYWQgb25lIGxldmVsKSxcbiAqIG1pcnJvcmluZyBgQXJyYXkucHJvdG90eXBlLmNvbmNhdGAuIGBpdGVtc2AgYXJlIHNjYWxhciB2YWx1ZXMvYXJyYXlzLCBub3RcbiAqIGNvbnRhaW5lcnMsIHNvIGBzb3VyY2VgIHN0YXlzIGEgc2luZ2xlIGxlYWRpbmcgYXJndW1lbnQuXG4gKlxuICogQHBhcmFtIHNvdXJjZSAtIFRoZSBsZWFkaW5nIGNvbnRhaW5lciAobnVsbGlzaCB5aWVsZHMganVzdCB0aGUgaXRlbXMpLlxuICogQHBhcmFtIGl0ZW1zIC0gVmFsdWVzIChvciBhcnJheXMgb2YgdmFsdWVzKSBhcHBlbmRlZCBhZnRlciB0aGUgc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uY2F0PFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgLi4uaXRlbXM6IHJlYWRvbmx5IChUIHwgUmVhZG9ubHlBcnJheTxUPilbXVxuKTogU2VxdWVuY2U8VD4ge1xuICBjb25zdCBzcmMgPSBzZXF1ZW5jZShzb3VyY2UpO1xuICBpZiAoaXRlbXMubGVuZ3RoID09PSAwKSByZXR1cm4gc3JjO1xuICByZXR1cm4gc2VxdWVuY2Uoe1xuICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgIHlpZWxkKiBzcmM7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbSkpIHlpZWxkKiBpdGVtO1xuICAgICAgICBlbHNlIHlpZWxkIGl0ZW0gYXMgVDtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBZaWVsZHMgYXQgbW9zdCBgY291bnRgIGVsZW1lbnRzIGZyb20gdGhlIGZyb250IG9mIHRoZSBjb25jYXRlbmF0ZWQgc291cmNlcy5cbiAqIGBjb3VudGAgbGVhZHMgc28gdGhlIHNvdXJjZXMgY2FuIHN0YXkgdmFyaWFkaWMuXG4gKlxuICogQHBhcmFtIGNvdW50IC0gTWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgdG8geWllbGQgKGA8PSAwYCB5aWVsZHMgbm9uZSkuXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUgKG51bGxpc2ggc291cmNlcyBhcmUgc2tpcHBlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YWtlPFQ+KGNvdW50OiBudW1iZXIsIC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNvdXJjZTxUPltdKTogU2VxdWVuY2U8VD4ge1xuICBpZiAoY291bnQgPD0gMCkgcmV0dXJuIGVtcHR5U2VxdWVuY2UgYXMgU2VxdWVuY2U8VD47XG4gIGNvbnN0IHNyYyA9IHNlcXVlbmNlKC4uLnNvdXJjZXMpO1xuICByZXR1cm4gc2VxdWVuY2Uoe1xuICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgIGxldCB0YWtlbiA9IDA7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNyYykge1xuICAgICAgICB5aWVsZCB2YWx1ZTtcbiAgICAgICAgaWYgKCsrdGFrZW4gPj0gY291bnQpIHJldHVybjtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBTcGxpdHMgdGhlIGNvbmNhdGVuYXRlZCBzb3VyY2VzIGludG8gb25lIGFycmF5IHBlciBuYW1lZCBwcmVkaWNhdGUuIENvbnN1bWVzXG4gKiB0aGUgaW5wdXQgb25jZSwgcm91dGluZyBlYWNoIGVsZW1lbnQgdG8gdGhlIEZJUlNUIHByZWRpY2F0ZSBpdCBzYXRpc2ZpZXMgKHNvXG4gKiBncm91cHMgYXJlIGRpc2pvaW50KTsgZWxlbWVudHMgbWF0Y2hpbmcgbm8gcHJlZGljYXRlIGFyZSBkcm9wcGVkLiBUeXBlLWd1YXJkXG4gKiBwcmVkaWNhdGVzIG5hcnJvdyB0aGVpciBncm91cCdzIGVsZW1lbnQgdHlwZSAoc2VlIHtAbGluayBHcm91cFZhbHVlfSkuXG4gKiBgcHJlZGljYXRlc2AgbGVhZHMgc28gdGhlIHNvdXJjZXMgY2FuIHN0YXkgdmFyaWFkaWMuXG4gKlxuICogQHR5cGVQYXJhbSBHIC0gVGhlIG1hcCBvZiBncm91cCBuYW1lIC0+IHByZWRpY2F0ZS5cbiAqIEBwYXJhbSBwcmVkaWNhdGVzIC0gTmFtZWQgcHJlZGljYXRlczsgZXZhbHVhdGVkIGluIGRlY2xhcmF0aW9uIG9yZGVyLlxuICogQHBhcmFtIHNvdXJjZXMgLSBDb250YWluZXJzIHRvIGNvbmNhdGVuYXRlIChudWxsaXNoIHNvdXJjZXMgYXJlIHNraXBwZWQpLlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggdGhlIHNhbWUga2V5cywgZWFjaCBhbiBhcnJheSBvZiBpdHMgZ3JvdXAncyBlbGVtZW50cy5cbiAqXG4gKiBAZXhhbXBsZVxuICogICBjb25zdCB7IHN0cmluZ3MsIGZucyB9ID0gZ3JvdXAoeyBzdHJpbmdzOiBpc1N0cmluZywgZm5zOiBpc0Z1bmN0aW9uIH0sIHhzKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwPFQsIEcgZXh0ZW5kcyBHcm91cFByZWRpY2F0ZXM8VD4+KFxuICBwcmVkaWNhdGVzOiBHLFxuICAuLi5zb3VyY2VzOiByZWFkb25seSBTb3VyY2U8VD5bXVxuKTogeyBbSyBpbiBrZXlvZiBHXTogR3JvdXBWYWx1ZTxULCBHW0tdPltdIH0ge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocHJlZGljYXRlcykgYXMgKGtleW9mIEcpW107XG4gIGNvbnN0IGJ1Y2tldHMgPSBuZXcgTWFwPGtleW9mIEcsIFRbXT4oa2V5cy5tYXAoKGtleSkgPT4gW2tleSwgW11dKSk7XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc2VxdWVuY2UoLi4uc291cmNlcykpIHtcbiAgICBjb25zdCBpID0gaW5kZXgrKztcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBpZiAocHJlZGljYXRlc1trZXldISh2YWx1ZSwgaSkpIHtcbiAgICAgICAgYnVja2V0cy5nZXQoa2V5KSEucHVzaCh2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCByZXN1bHQgPSB7fSBhcyB7IFtLIGluIGtleW9mIEddOiBHcm91cFZhbHVlPFQsIEdbS10+W10gfTtcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIHJlc3VsdFtrZXldID0gYnVja2V0cy5nZXQoa2V5KSEgYXMgR3JvdXBWYWx1ZTxULCBHW3R5cGVvZiBrZXldPltdO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5maW5kYCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqIENvbnN1bWVzIGVsZW1lbnRzIHVudGlsIGEgbWF0Y2guIEEgdHlwZSBndWFyZCBuYXJyb3dzIHRoZSByZXR1cm4gdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmQ8VCwgUyBleHRlbmRzIFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZhbHVlIGlzIFMsXG4pOiBTIHwgdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmQ8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IFQgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gZmluZDxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogVCB8IHVuZGVmaW5lZCB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc2VxdWVuY2Uoc291cmNlKSkge1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4KyspKSByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmZpbmRMYXN0YCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqIENvbnN1bWVzIHRoZSBmdWxsIHNvdXJjZS4gQSB0eXBlIGd1YXJkIG5hcnJvd3MgdGhlIHJldHVybiB0eXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZExhc3Q8VCwgUyBleHRlbmRzIFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZhbHVlIGlzIFMsXG4pOiBTIHwgdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMYXN0PFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBUIHwgdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMYXN0PFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgbGV0IG1hdGNoOiBUIHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNlcXVlbmNlKHNvdXJjZSkpIHtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCsrKSkgbWF0Y2ggPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gbWF0Y2g7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXhgLCBvdmVyIGEgc2luZ2xlIHtAbGluayBDb250YWluZXJ9LlxuICogQ29uc3VtZXMgZWxlbWVudHMgdW50aWwgYSBtYXRjaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRJbmRleDxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogbnVtYmVyIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZShzb3VyY2UpKSB7XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgpKSByZXR1cm4gaW5kZXg7XG4gICAgaW5kZXgrKztcbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5maW5kTGFzdEluZGV4YCwgb3ZlciBhIHNpbmdsZVxuICoge0BsaW5rIENvbnRhaW5lcn0uIENvbnN1bWVzIHRoZSBmdWxsIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMYXN0SW5kZXg8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IG51bWJlciB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGxldCBtYXRjaCA9IC0xO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNlcXVlbmNlKHNvdXJjZSkpIHtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCkpIG1hdGNoID0gaW5kZXg7XG4gICAgaW5kZXgrKztcbiAgfVxuICByZXR1cm4gbWF0Y2g7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5zb21lYCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqIFNob3J0LWNpcmN1aXRzIG9uIHRoZSBmaXJzdCBtYXRjaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvbWU8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IGJvb2xlYW4ge1xuICBsZXQgaW5kZXggPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNlcXVlbmNlKHNvdXJjZSkpIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4KyspKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZXZlcnlgLCBvdmVyIGEgc2luZ2xlIHtAbGluayBDb250YWluZXJ9LlxuICogU2hvcnQtY2lyY3VpdHMgb24gdGhlIGZpcnN0IGZhaWx1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmVyeTxULCBTIGV4dGVuZHMgVD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdmFsdWUgaXMgUyxcbik6IGJvb2xlYW47XG5leHBvcnQgZnVuY3Rpb24gZXZlcnk8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IGJvb2xlYW47XG5leHBvcnQgZnVuY3Rpb24gZXZlcnk8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IGJvb2xlYW4ge1xuICBsZXQgaW5kZXggPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNlcXVlbmNlKHNvdXJjZSkpIGlmICghcHJlZGljYXRlKHZhbHVlLCBpbmRleCsrKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmZvckVhY2hgLCBvdmVyIGEgc2luZ2xlIHtAbGluayBDb250YWluZXJ9LlxuICogQ29uc3VtZXMgdGhlIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvckVhY2g8VD4oc291cmNlOiBTb3VyY2U8VD4sIGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZvaWQpOiB2b2lkIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZShzb3VyY2UpKSBjYWxsYmFjayh2YWx1ZSwgaW5kZXgrKyk7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5hdGAgb3ZlciB0aGUgY29uY2F0ZW5hdGVkIHNvdXJjZXMuXG4gKiBOb24tbmVnYXRpdmUgaW5kaWNlcyBzY2FuIGxhemlseTsgbmVnYXRpdmUgaW5kaWNlcyBtYXRlcmlhbGl6ZSBmaXJzdC4gYGluZGV4YFxuICogbGVhZHMgc28gdGhlIHNvdXJjZXMgY2FuIHN0YXkgdmFyaWFkaWMuXG4gKlxuICogQHBhcmFtIGluZGV4IC0gWmVyby1iYXNlZCBwb3NpdGlvbjsgbmVnYXRpdmUgY291bnRzIGZyb20gdGhlIGVuZC5cbiAqIEBwYXJhbSBzb3VyY2VzIC0gQ29udGFpbmVycyB0byBjb25jYXRlbmF0ZSAobnVsbGlzaCBzb3VyY2VzIGFyZSBza2lwcGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0PFQ+KGluZGV4OiBudW1iZXIsIC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNvdXJjZTxUPltdKTogVCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNyYyA9IHNlcXVlbmNlKC4uLnNvdXJjZXMpO1xuICBpZiAoaW5kZXggPCAwKSByZXR1cm4gdG9BcnJheShzcmMpLmF0KGluZGV4KTtcbiAgbGV0IGkgPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNyYykge1xuICAgIGlmIChpKysgPT09IGluZGV4KSByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvT25lT3JNYW55PFQ+KGlucHV0OiBUIHwgT25lT3JNYW55PFQ+KTogT25lT3JNYW55PFQ+IHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoaW5wdXQpID8gaW5wdXQgOiBbaW5wdXRdO1xufVxuXG4vKipcbiAqIE1hdGVyaWFsaXplcyB0aGUgY29uY2F0ZW5hdGVkIHNvdXJjZXMgaW50byBhIG5ldyBhcnJheS4gQ29uc3VtZXMgc2luZ2xlLXBhc3NcbiAqIHNvdXJjZXMuXG4gKlxuICogQHBhcmFtIHNvdXJjZXMgLSBDb250YWluZXJzIHRvIGNvbmNhdGVuYXRlIChudWxsaXNoIHNvdXJjZXMgYXJlIHNraXBwZWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9BcnJheTxUPiguLi5zb3VyY2VzOiByZWFkb25seSBTb3VyY2U8VD5bXSk6IHJlYWRvbmx5IFRbXSB7XG4gIHJldHVybiBbLi4uc2VxdWVuY2UoLi4uc291cmNlcyldO1xufVxuXG4vKipcbiAqIExhenkgaXRlcmFibGUgc2VxdWVuY2Ugd2l0aCBgQXJyYXlgLWNvbXBhdGlibGUgdHJhbnNmb3JtcyBhbmQgdGVybWluYWxcbiAqIG1ldGhvZHMuIFNpbmdsZS1wYXNzIGJ5IGRlZmF1bHQ7IGNhbGwge0BsaW5rIFNlcXVlbmNlSW1wbC5jYWNoZX0gdG8gcmV0YWluXG4gKiBwdWxsZWQgdmFsdWVzIGZvciByZS1pdGVyYXRpb24uIEJ1aWx0IGZvciBnZW5lcmF0b3JzIGFuZCBvdGhlciBzb3VyY2VzIHdoZXJlXG4gKiBhIHNlY29uZCBwYXNzIGlzIG5vdCBndWFyYW50ZWVkLlxuICpcbiAqIFRoZSBtZXRob2RzIGZvcndhcmQgdG8gdGhlIHN0YW5kYWxvbmUgZnVuY3Rpb25zIG9mIHRoZSBzYW1lIG5hbWUgLSBzZWUgZWFjaFxuICogbWV0aG9kJ3MgYEBzZWVgIC0gc28gdGhlIGZyZWUtZnVuY3Rpb24gYW5kIGNoYWluZWQgc3R5bGVzIHNoYXJlIG9uZSBpbXBsLlxuICovXG5jbGFzcyBTZXF1ZW5jZUltcGw8VD4ge1xuICBwcml2YXRlIGl0ZXJhdG9yPzogSXRlcmF0b3I8VD47XG4gIHByaXZhdGUgZXhoYXVzdGVkOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc291cmNlOiBJdGVyYWJsZTxUPixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJ1ZmZlcjogVFtdIHwgdW5kZWZpbmVkLFxuICAgIHN0YXRlOiB7IHJlYWRvbmx5IGV4aGF1c3RlZD86IGJvb2xlYW4gfSA9IHt9LFxuICApIHtcbiAgICB0aGlzLmV4aGF1c3RlZCA9IHN0YXRlLmV4aGF1c3RlZCA/PyBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGNhY2hpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogQWR2YW5jZSB0aGUgdW5kZXJseWluZyBzb3VyY2Ugb25jZSwgY3JlYXRpbmcgdGhlIGl0ZXJhdG9yIG9uIGZpcnN0IHVzZS4gKi9cbiAgcHJpdmF0ZSBwdWxsKCk6IEl0ZXJhdG9yUmVzdWx0PFQ+IHtcbiAgICB0aGlzLml0ZXJhdG9yID8/PSB0aGlzLnNvdXJjZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgcmV0dXJuIHRoaXMuaXRlcmF0b3IubmV4dCgpO1xuICB9XG5cbiAgKltTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhdG9yPFQ+IHtcbiAgICBpZiAoIXRoaXMuY2FjaGluZykge1xuICAgICAgaWYgKHRoaXMuZXhoYXVzdGVkKSByZXR1cm47XG4gICAgICBmb3IgKGxldCBuZXh0ID0gdGhpcy5wdWxsKCk7ICFuZXh0LmRvbmU7IG5leHQgPSB0aGlzLnB1bGwoKSkge1xuICAgICAgICB5aWVsZCBuZXh0LnZhbHVlO1xuICAgICAgfVxuICAgICAgdGhpcy5leGhhdXN0ZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDYWNoZWQ6IGl0ZXJhdGUgbGlrZSBhIGxpc3QuIEFsd2F5cyByZXBsYXkgdGhlIGJ1ZmZlciBmcm9tIHRoZSBzdGFydCxcbiAgICAgIC8vIGV4dGVuZGluZyBpdCBmcm9tIHRoZSBzb3VyY2Ugb24gZGVtYW5kIHVudGlsIGV4aGF1c3RlZC4gQSBicm9rZW4gbG9vcFxuICAgICAgLy8gbGVhdmVzIHRoZSBidWZmZXIgaW50YWN0LCBzbyB0aGUgbmV4dCBpdGVyYXRpb24gc3RhcnRzIG92ZXIgZnJvbSB0aGVcbiAgICAgIC8vIGJlZ2lubmluZy5cbiAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyITtcbiAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmIChpbmRleCA8IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICB5aWVsZCBidWZmZXJbaW5kZXgrK10hO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmV4aGF1c3RlZCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5wdWxsKCk7XG4gICAgICAgIGlmIChuZXh0LmRvbmUpIHtcbiAgICAgICAgICB0aGlzLmV4aGF1c3RlZCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGJ1ZmZlci5wdXNoKG5leHQudmFsdWUpO1xuICAgICAgICB5aWVsZCBuZXh0LnZhbHVlO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBtYXB9ICovXG4gIG1hcDxVPihjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBVKTogU2VxdWVuY2U8VT4ge1xuICAgIHJldHVybiBtYXAodGhpcywgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGZpbHRlcn0gKi9cbiAgZmlsdGVyPFMgZXh0ZW5kcyBUPihwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdmFsdWUgaXMgUyk6IFNlcXVlbmNlPFM+O1xuICBmaWx0ZXIocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBTZXF1ZW5jZTxUPjtcbiAgZmlsdGVyKHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogU2VxdWVuY2U8VD4ge1xuICAgIHJldHVybiBmaWx0ZXIodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBub25OdWxsfSAqL1xuICBub25OdWxsKCk6IFNlcXVlbmNlPE5vbk51bGxhYmxlPFQ+PiB7XG4gICAgcmV0dXJuIG5vbk51bGwodGhpcyk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZmxhdE1hcH0gKi9cbiAgZmxhdE1hcDxVPihjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBVIHwgUmVhZG9ubHlBcnJheTxVPik6IFNlcXVlbmNlPFU+IHtcbiAgICByZXR1cm4gZmxhdE1hcCh0aGlzLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZmxhdH0gKi9cbiAgZmxhdChkZXB0aCA9IDEpOiBTZXF1ZW5jZTxUPiB7XG4gICAgcmV0dXJuIGZsYXQoZGVwdGgsIHRoaXMpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGRpc3RpbmN0fSAqL1xuICBkaXN0aW5jdCgpOiBTZXF1ZW5jZTxUPiB7XG4gICAgcmV0dXJuIGRpc3RpbmN0KHRoaXMpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGNvbmNhdH0gKi9cbiAgY29uY2F0KC4uLml0ZW1zOiByZWFkb25seSAoVCB8IFJlYWRvbmx5QXJyYXk8VD4pW10pOiBTZXF1ZW5jZTxUPiB7XG4gICAgcmV0dXJuIGNvbmNhdCh0aGlzLCAuLi5pdGVtcyk7XG4gIH1cblxuICAvKipcbiAgICogTGF6aWx5IHlpZWxkcyB0aGlzIHNlcXVlbmNlIGZvbGxvd2VkIGJ5IGVhY2ggaXRlcmFibGUgYHNvdXJjZWAgaW4gb3JkZXIuXG4gICAqIExpa2Uge0BsaW5rIGNvbmNhdH0sIGJ1dCBmb3IgaXRlcmFibGUgc291cmNlcyAoZ2VuZXJhdG9ycywgb3RoZXIgc2VxdWVuY2VzLFxuICAgKiBgU2V0YCwgYE1hcGAsIGV0Yy4pIHJhdGhlciB0aGFuIHNjYWxhciB2YWx1ZXMgb3IgYXJyYXlzLiBBIHtAbGluayBNYXB9XG4gICAqIHNvdXJjZSBjb250cmlidXRlcyBpdHMgdmFsdWVzLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBzZXF1ZW5jZX1cbiAgICovXG4gIGpvaW4oLi4uc291cmNlczogcmVhZG9ubHkgU2VxdWVuY2VTb3VyY2U8VD5bXSk6IFNlcXVlbmNlPFQ+IHtcbiAgICBjb25zdCBzb3VyY2VJdGVyYWJsZXMgPSBzZXF1ZW5jZVNvdXJjZXModGhpcywgLi4uc291cmNlcyk7XG4gICAgcmV0dXJuIHNlcXVlbmNlU291cmNlcy5sZW5ndGggPT09IDAgPyB0aGlzIDogc2VxdWVuY2UoLi4uc291cmNlSXRlcmFibGVzKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayB0YWtlfSAqL1xuICB0YWtlKGNvdW50OiBudW1iZXIpOiBTZXF1ZW5jZTxUPiB7XG4gICAgcmV0dXJuIHRha2UoY291bnQsIHRoaXMpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGdyb3VwfSAqL1xuICBncm91cDxHIGV4dGVuZHMgR3JvdXBQcmVkaWNhdGVzPFQ+PihwcmVkaWNhdGVzOiBHKTogeyBbSyBpbiBrZXlvZiBHXTogR3JvdXBWYWx1ZTxULCBHW0tdPltdIH0ge1xuICAgIHJldHVybiBncm91cChwcmVkaWNhdGVzLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgY2FjaGVkLCByZS1pdGVyYWJsZSB2aWV3IG9mIHRoaXMgc2VxdWVuY2UuIEFuIGFscmVhZHktY2FjaGluZ1xuICAgKiBzZXF1ZW5jZSByZXR1cm5zIGl0c2VsZjsgb3RoZXJ3aXNlIHRoaXMgb25lLXBhc3Mgc2VxdWVuY2UgaXMgd3JhcHBlZCBpbiBhXG4gICAqIG5ldyBpbnN0YW5jZSB0aGF0IHJldGFpbnMgcHVsbGVkIHZhbHVlcy4gSXRlcmF0ZSB0aGUgcmV0dXJuZWQgaW5zdGFuY2UsIG5vdFxuICAgKiB0aGUgb3JpZ2luYWwsIHRvIGF2b2lkIGNvbXBldGluZyBmb3IgdGhlIHNhbWUgc2luZ2xlLXBhc3Mgc291cmNlLlxuICAgKi9cbiAgY2FjaGUoKTogU2VxdWVuY2U8VD4ge1xuICAgIHJldHVybiB0aGlzLmNhY2hpbmcgPyB0aGlzIDogbmV3IFNlcXVlbmNlSW1wbCh0aGlzLCBbXSk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZmluZH0gKi9cbiAgZmluZDxTIGV4dGVuZHMgVD4ocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZhbHVlIGlzIFMpOiBTIHwgdW5kZWZpbmVkO1xuICBmaW5kKHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogVCB8IHVuZGVmaW5lZDtcbiAgZmluZChwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBmaW5kKHRoaXMsIHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZmluZExhc3R9ICovXG4gIGZpbmRMYXN0PFMgZXh0ZW5kcyBUPihwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdmFsdWUgaXMgUyk6IFMgfCB1bmRlZmluZWQ7XG4gIGZpbmRMYXN0KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogVCB8IHVuZGVmaW5lZDtcbiAgZmluZExhc3QocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gZmluZExhc3QodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmaW5kSW5kZXh9ICovXG4gIGZpbmRJbmRleChwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IG51bWJlciB7XG4gICAgcmV0dXJuIGZpbmRJbmRleCh0aGlzLCBwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGZpbmRMYXN0SW5kZXh9ICovXG4gIGZpbmRMYXN0SW5kZXgocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIHJldHVybiBmaW5kTGFzdEluZGV4KHRoaXMsIHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgc29tZX0gKi9cbiAgc29tZShwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzb21lKHRoaXMsIHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZXZlcnl9ICh0aGUgYFMgZXh0ZW5kcyBUYCBvdmVybG9hZCBuYXJyb3dzIGF0IGNvbXBpbGUgdGltZSBvbmx5KS4gKi9cbiAgZXZlcnk8UyBleHRlbmRzIFQ+KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTKTogdGhpcyBpcyBTZXF1ZW5jZTxTPjtcbiAgZXZlcnkocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBib29sZWFuO1xuICBldmVyeShwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBldmVyeSh0aGlzLCBwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGZvckVhY2h9ICovXG4gIGZvckVhY2goY2FsbGJhY2s6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdm9pZCk6IHZvaWQge1xuICAgIGZvckVhY2godGhpcywgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGF0fSAqL1xuICBhdChpbmRleDogbnVtYmVyKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGF0KGluZGV4LCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXRlcmlhbGl6ZSB0aGUgc2VxdWVuY2UgaW50byBhIG5ldyBhcnJheS4gQ29uc3VtZXMgYSBzaW5nbGUtcGFzcyBzb3VyY2U7IGFcbiAgICogY2FjaGVkLCBleGhhdXN0ZWQgc2VxdWVuY2UgY29waWVzIGl0cyBidWZmZXIgZGlyZWN0bHkuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIHRvQXJyYXl9XG4gICAqL1xuICB0b0FycmF5KCk6IHJlYWRvbmx5IFRbXSB7XG4gICAgaWYgKHRoaXMuY2FjaGluZyAmJiB0aGlzLmV4aGF1c3RlZCkgcmV0dXJuIFsuLi50aGlzLmJ1ZmZlciFdO1xuICAgIHJldHVybiB0b0FycmF5KHRoaXMpO1xuICB9XG59XG5cbi8qKiBTaGFyZWQgZW1wdHkgc2VxdWVuY2Ugc2luZ2xldG9uLCByZXVzYWJsZSBmb3IgYW55IGVsZW1lbnQgdHlwZS4gKi9cbmNvbnN0IGVtcHR5U2VxdWVuY2U6IFNlcXVlbmNlPG5ldmVyPiA9IG5ldyBTZXF1ZW5jZUltcGwoW10sIHVuZGVmaW5lZCwge1xuICBleGhhdXN0ZWQ6IHRydWUsXG59KTtcblxuLyoqXG4gKiBXcmFwIG9uZSBvciBtb3JlIGl0ZXJhYmxlIGBzb3VyY2VzYCBpbiBhIHNpbmdsZSBsYXp5IHtAbGluayBTZXF1ZW5jZX0sXG4gKiBpdGVyYXRlZCBpbiBvcmRlci4gYG51bGxgL2B1bmRlZmluZWRgIHNvdXJjZXMgYXJlIHNraXBwZWQ7IHdoZW4gbm90aGluZ1xuICogcmVtYWlucyAoZXZlcnkgc291cmNlIG9taXR0ZWQsIGBudWxsYCwgYHVuZGVmaW5lZGAsIG9yIGFuIGVtcHR5IGFycmF5IC9cbiAqIGBTZXRgIC8gYE1hcGApLCB7QGxpbmsgZW1wdHlTZXF1ZW5jZX0gaXMgcmV0dXJuZWQuIFRoZSByZXN1bHQgaXMgc2luZ2xlLXBhc3NcbiAqIC0gY2FsbCBgLmNhY2hlKClgIHRvIG1ha2UgaXQgcmUtaXRlcmFibGUuXG4gKlxuICogQSB7QGxpbmsgTWFwfSBzb3VyY2UgY29udHJpYnV0ZXMgaXRzIHZhbHVlcyAoc2VlIHtAbGluayB2YWx1ZXN9KSwgY29uc2lzdGVudFxuICogd2l0aCB7QGxpbmsgQ29sbGVjdGlvbn0ncyB2YWx1ZS10eXBlZCBgVGAuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gRWxlbWVudCB0eXBlIG9mIHRoZSBzZXF1ZW5jZS5cbiAqIEBwYXJhbSBzb3VyY2VzIC0gSXRlcmFibGVzIHRvIGNvbmNhdGVuYXRlLCBpbiBvcmRlciAoYE1hcGAgc291cmNlcyB1c2UgdmFsdWVzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcXVlbmNlPFQ+KC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNlcXVlbmNlU291cmNlPFQ+W10pOiBTZXF1ZW5jZTxUPiB7XG4gIC8vIFNraXAgbnVsbGlzaCBzb3VyY2VzIGFuZCBrbm93bi1lbXB0eSBjb2xsZWN0aW9uczsgbm9ybWFsaXplIHRoZSByZXN0IHRvXG4gIC8vIHRoZWlyIHZhbHVlcyBzbyBhIE1hcCBjb250cmlidXRlcyB2YWx1ZXMgcmF0aGVyIHRoYW4gW2tleSwgdmFsdWVdIGVudHJpZXMuXG4gIGNvbnN0IHNvdXJjZUl0ZXJhYmxlcyA9IHNlcXVlbmNlU291cmNlcyguLi5zb3VyY2VzKTtcbiAgaWYgKHNvdXJjZUl0ZXJhYmxlcy5sZW5ndGggPT09IDApIHJldHVybiBlbXB0eVNlcXVlbmNlIGFzIFNlcXVlbmNlPFQ+O1xuICAvLyBSZXVzZSBhbiBleGlzdGluZyBzZXF1ZW5jZSBhcy1pcyByYXRoZXIgdGhhbiByZS13cmFwcGluZyBpdC5cbiAgaWYgKHNvdXJjZUl0ZXJhYmxlcy5sZW5ndGggPT09IDEpIHtcbiAgICBjb25zdCBvbmx5ID0gc291cmNlSXRlcmFibGVzWzBdITtcbiAgICByZXR1cm4gb25seSBpbnN0YW5jZW9mIFNlcXVlbmNlSW1wbCA/IChvbmx5IGFzIFNlcXVlbmNlPFQ+KSA6IG5ldyBTZXF1ZW5jZUltcGwob25seSwgdW5kZWZpbmVkKTtcbiAgfVxuICByZXR1cm4gbmV3IFNlcXVlbmNlSW1wbChcbiAgICB7XG4gICAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc291cmNlIG9mIHNvdXJjZUl0ZXJhYmxlcykgeWllbGQqIHNvdXJjZTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB1bmRlZmluZWQsXG4gICk7XG59XG5cbi8qKlxuICogRmxhdHRlbnMgYSBtaXggb2Ygc2luZ2xlIGl0ZW1zIGFuZCBpdGVyYWJsZXMgaW50byBvbmUgbGF6eSB7QGxpbmsgR2VuZXJhdG9yfS5cbiAqXG4gKiBBcmd1bWVudHMgYXJlIGVtaXR0ZWQgaW4gb3JkZXI6IGBudWxsYC9gdW5kZWZpbmVkYCBhcmUgc2tpcHBlZCwgbm9uLXN0cmluZ1xuICogaXRlcmFibGVzIChwZXIge0BsaW5rIGlzQ29udGFpbmVyfSkgYXJlIHlpZWxkZWQgZWxlbWVudC1ieS1lbGVtZW50LCBhbmRcbiAqIGFueXRoaW5nIGVsc2UgKGluY2x1ZGluZyBzdHJpbmdzKSBpcyB5aWVsZGVkIGFzIGEgc2luZ2xlIGl0ZW0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gRWxlbWVudCB0eXBlIHByb2R1Y2VkIGJ5IHRoZSBnZW5lcmF0b3IuXG4gKiBAcGFyYW0gaXRlbXMgLSBJdGVtcyBhbmQvb3IgaXRlcmFibGVzIHRvIGZsYXR0ZW4sIGluIG9yZGVyLlxuICogQHJldHVybnMgQSBnZW5lcmF0b3Igb3ZlciB0aGUgZmxhdHRlbmVkIGVsZW1lbnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24qIGdlbmVyYXRvcjxUPihcbiAgLi4uaXRlbXM6IHJlYWRvbmx5IChUIHwgSXRlcmFibGU8VD4gfCBudWxsIHwgdW5kZWZpbmVkKVtdXG4pOiBHZW5lcmF0b3I8VD4ge1xuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICBpZiAoaXRlbSA9PT0gbnVsbCB8fCBpdGVtID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAoaXNDb250YWluZXIoaXRlbSkpIHtcbiAgICAgIHlpZWxkKiBpdGVtO1xuICAgIH0gZWxzZSB7XG4gICAgICB5aWVsZCBpdGVtO1xuICAgIH1cbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE9iamVjdCB2YWx1ZSBndWFyZHMsIGNvZXJjaW9ucywgYW5kIHN0cnVjdHVyYWwgZXF1YWxpdHlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogTWluaW1hbCBzaGFwZSBmb3Igb2JqZWN0cyB0aGF0IGV4cG9zZSBhbiBvcHRpb25hbCBgbmFtZWAgKGUuZy4gQXBwS2l0IHBsdWdpbnMpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBOYW1lTGlrZSB7XG4gIG5hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIE5vbkZ1bmN0aW9uS2V5czxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IG5ldmVyIDogSztcbn1ba2V5b2YgVF07XG5cbi8qKlxuICogTmFycm93IGB2YWx1ZWAgdG8gYSBwbGFpbiAobm9uLWFycmF5KSBvYmplY3QuIFVzZSBhcyBhIHR5cGUgZ3VhcmRcbiAqIGJlZm9yZSBpbmRleGluZyBpbnRvIC8gbXV0YXRpbmcgcGFyc2VkIEpTT04gc28gdGhlIGFjY2VzcyBpc1xuICogdHlwZS1zYWZlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpZiAoaXNSZWNvcmQocGFyc2VkKSkgcGFyc2VkLmZvbyA9IDE7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JlY29yZCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG5cbi8qKlxuICogYHsgW2tleV06IHZhbHVlIH1gIHdoZW4gYHZhbHVlYCBpcyBwcmVzZW50LCBvdGhlcndpc2UgYHVuZGVmaW5lZGAgLSBzbyBhblxuICogYWJzZW50IG9wdGlvbmFsIGZpZWxkIHN0YXlzIEFCU0VOVCB3aGVuIHNwcmVhZCwgcmF0aGVyIHRoYW4gYmVjb21pbmcgYW5cbiAqIGV4cGxpY2l0IGB1bmRlZmluZWRgIHRoYXQgYGV4YWN0T3B0aW9uYWxQcm9wZXJ0eVR5cGVzYCByZWplY3RzLlxuICpcbiAqIFNwZWxsaW5nIHRoYXQgaW5saW5lIGNvc3RzIGEgcmVwZWF0ZWQsIGRvdWJsZS1ldmFsdWF0ZWQgdGVybmFyeSBwZXIgZmllbGRcbiAqIChgLi4uKHYgPyB7IGtleTogdiB9IDoge30pYCksIHdoaWNoIGlzIGhvdyBjb25maWcgcmVzb2x2ZXJzIGVuZCB1cCBjb21wdXRpbmdcbiAqIHRoZSBzYW1lIHZhbHVlIHR3aWNlLlxuICpcbiAqIEBleGFtcGxlXG4gKiByZXR1cm4ge1xuICogICAuLi5vcHRpb25hbChcImFwcElkXCIsIGVudi50ZXh0KFwiTUlDUk9TT0ZUX0FQUF9JRFwiKSksXG4gKiAgIC4uLm9wdGlvbmFsKFwiZW5kcG9pbnRcIiwgY29uZmlnLmVuZHBvaW50KSxcbiAqIH07XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbDxLIGV4dGVuZHMgc3RyaW5nLCBWPihcbiAga2V5OiBLLFxuICB2YWx1ZTogViB8IG51bGwgfCB1bmRlZmluZWQsXG4pOiBSZWNvcmQ8SywgVj4gfCB1bmRlZmluZWQge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6ICh7IFtrZXldOiB2YWx1ZSB9IGFzIFJlY29yZDxLLCBWPik7XG59XG5cbi8qKlxuICogQ29lcmNlIGEgbG9vc2UgYm9vbGVhbi1pc2ggdmFsdWUgdG8gYSByZWFsIGBib29sZWFuYCwgb3IgYHVuZGVmaW5lZGBcbiAqIHdoZW4gaXQgY2FuJ3QgYmUgaW50ZXJwcmV0ZWQuIFJlY29nbml6ZXMgYHRydWVgL2B0YC9gb25gL2AxYC9geWVzYC9geWBcbiAqIGFuZCB0aGVpciBuZWdhdGl2ZXMgKGNhc2UtIGFuZCB3aGl0ZXNwYWNlLWluc2Vuc2l0aXZlIGZvciBzdHJpbmdzKSwgYXNcbiAqIHdlbGwgYXMgdGhlIG51bWJlcnMgYDFgIGFuZCBgMGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0Jvb2xlYW4odmFsdWU6IHVua25vd24pOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoXG4gICAgICB2YWx1ZSA9PT0gXCJ0cnVlXCIgfHxcbiAgICAgIHZhbHVlID09IFwidFwiIHx8XG4gICAgICB2YWx1ZSA9PT0gXCJvblwiIHx8XG4gICAgICB2YWx1ZSA9PT0gXCIxXCIgfHxcbiAgICAgIHZhbHVlID09PSBcInllc1wiIHx8XG4gICAgICB2YWx1ZSA9PT0gXCJ5XCJcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB2YWx1ZSA9PT0gXCJmYWxzZVwiIHx8XG4gICAgICB2YWx1ZSA9PSBcImZcIiB8fFxuICAgICAgdmFsdWUgPT09IFwib2ZmXCIgfHxcbiAgICAgIHZhbHVlID09PSBcIjBcIiB8fFxuICAgICAgdmFsdWUgPT09IFwibm9cIiB8fFxuICAgICAgdmFsdWUgPT09IFwiblwiXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgIGlmICh2YWx1ZSA9PT0gMSkgcmV0dXJuIHRydWU7XG4gICAgZWxzZSBpZiAodmFsdWUgPT09IDApIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIExhcmdlc3QgdmFsdWUgcmVhZCBhcyBlcG9jaCBTRUNPTkRTIHJhdGhlciB0aGFuIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBgMWUxMWAgc2Vjb25kcyBpcyB0aGUgeWVhciA1MTM4IGFuZCBgMWUxMWAgbXMgaXMgMTk3My0wMy0wMywgc28gZXZlcnkgdmFsdWUgYVxuICogY2FsbGVyIHJlYWxpc3RpY2FsbHkgbWVhbnMgYXMgbWlsbGlzIGlzIGFib3ZlIHRoZSBsaW5lIGFuZCBldmVyeSB2YWx1ZSB0aGV5XG4gKiBtZWFuIGFzIHNlY29uZHMgaXMgYmVsb3cgaXQuIFRoZSBhbWJpZ3VpdHkgaXMgdW5hdm9pZGFibGUgLSB0aGUgdHdvIHVuaXRzIHNoYXJlXG4gKiBhIG51bWJlciBsaW5lIC0gc28gdGhlIHNwbGl0IGlzIHBsYWNlZCB3aGVyZSBuZWl0aGVyIHNpZGUgaGFzIGEgcGxhdXNpYmxlXG4gKiBjbGFpbS5cbiAqL1xuY29uc3QgU0VDT05EU19DRUlMSU5HID0gMWUxMTtcblxuLyoqXG4gKiBNaWxsaXNlY29uZHMgcGVyIHVuaXQsIGtleWVkIGJ5IFNJTkdVTEFSIGFsaWFzLiB7QGxpbmsgdG9EdXJhdGlvbn0gcmV0cmllcyBhXG4gKiBsb29rdXAgd2l0aG91dCBhIHRyYWlsaW5nIGBzYCwgc28gZXZlcnkgcGx1cmFsIHNwZWxsaW5nIGlzIGNvdmVyZWQgd2l0aG91dFxuICogbGlzdGluZyBpdCAoYG1zYCBpcyBhbHJlYWR5IHNpbmd1bGFyLCBoZW5jZSBpdHMgb3duIGVudHJ5KS5cbiAqXG4gKiBgbWAgaXMgTUlOVVRFUyBhbmQgbW9udGhzIG5lZWQgYG1vYCwgZm9sbG93aW5nIHRoZSBuZWFyLXVuaXZlcnNhbCBjb252ZW50aW9uXG4gKiAoYG1zYCwgYGRhdGVgLCBjcm9uIHByb3NlKTsgbW9udGggYW5kIHllYXIgYXJlIGNhbGVuZGFyIGFwcHJveGltYXRpb25zICgzMCAvXG4gKiAzNjUgZGF5cykgYmVjYXVzZSBhIGR1cmF0aW9uIGhhcyBubyBhbmNob3IgZGF0ZSB0byBiZSBleGFjdCBhZ2FpbnN0LlxuICovXG5jb25zdCBEVVJBVElPTl9VTklUUzogUmVhZG9ubHlBcnJheTxyZWFkb25seSBbbXM6IG51bWJlciwgYWxpYXNlczogcmVhZG9ubHkgc3RyaW5nW11dPiA9IFtcbiAgWzEsIFtcIm1zXCIsIFwibXNlY1wiLCBcIm1pbGxpc2Vjb25kXCIsIFwibWlsbGlcIl1dLFxuICBbMTAwMCwgW1wic1wiLCBcInNlY1wiLCBcInNlY29uZFwiXV0sXG4gIFs2MF8wMDAsIFtcIm1cIiwgXCJtaW5cIiwgXCJtaW51dGVcIl1dLFxuICBbM182MDBfMDAwLCBbXCJoXCIsIFwiaHJcIiwgXCJob3VyXCJdXSxcbiAgWzg2XzQwMF8wMDAsIFtcImRcIiwgXCJkYXlcIl1dLFxuICBbNjA0XzgwMF8wMDAsIFtcIndcIiwgXCJ3a1wiLCBcIndlZWtcIl1dLFxuICBbMl81OTJfMDAwXzAwMCwgW1wibW9cIiwgXCJtb25cIiwgXCJtb250aFwiXV0sXG4gIFszMV81MzZfMDAwXzAwMCwgW1wieVwiLCBcInlyXCIsIFwieWVhclwiXV0sXG5dO1xuXG5jb25zdCBEVVJBVElPTl9VTklUX01TOiBSZWFkb25seU1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwKFxuICBEVVJBVElPTl9VTklUUy5mbGF0TWFwKChbbXMsIGFsaWFzZXNdKSA9PiBhbGlhc2VzLm1hcCgoYWxpYXMpID0+IFthbGlhcywgbXNdIGFzIGNvbnN0KSksXG4pO1xuXG4vKiogT25lIGA8YW1vdW50Pjx1bml0PmAgdGVybSBpbnNpZGUgYSBkdXJhdGlvbiBzdHJpbmcuICovXG5jb25zdCBEVVJBVElPTl9URVJNID0gLyhbKy1dPykoXFxkKyg/OlxcLlxcZCspPylcXHMqKFthLXpdKykvZztcblxuLyoqXG4gKiBDb2VyY2UgYSBsb29zZSBkdXJhdGlvbiB0byBNSUxMSVNFQ09ORFMsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgY2FuJ3QgYmVcbiAqIGludGVycHJldGVkLlxuICpcbiAqIERlbGliZXJhdGVseSBsZW5pZW50LCBiZWNhdXNlIHRoZXNlIHZhbHVlcyBhcmUgdHlwZWQgYnkgaGFuZCBpbnRvIGVudiB2YXJzLFxuICogQ0xJIGZsYWdzLCBhbmQgY29uZmlnIGZpbGVzOiB3aGl0ZXNwYWNlIGJldHdlZW4gYW1vdW50IGFuZCB1bml0IGlzIG9wdGlvbmFsIGFuZFxuICogdW5saW1pdGVkLCB1bml0cyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSwgcGx1cmFscyBhbmQgdGhlIGNvbW1vbiBhYmJyZXZpYXRpb25zIGFyZVxuICogZXF1aXZhbGVudCAoYDJtc2AgPT09IGAyIG1pbGxpc2Vjb25kc2AsIGAxaGAgPT09IGAxIGhyYCA9PT0gYDEgSG91cmApLCBgYW5kYCBhbmRcbiAqIHRob3VzYW5kcyBzZXBhcmF0b3JzIGFyZSBpZ25vcmVkIChgMSw1MDAgbXNgLCBgMSBob3VyIGFuZCAzMCBtaW51dGVzYCksIGFuZFxuICogdGVybXMgY29tcG9zZSAoYDFoMzBtYCkuIEEgcGxhaW4gYG51bWJlcmAgcGFzc2VzIHRocm91Z2ggYXMgbWlsbGlzZWNvbmRzLlxuICpcbiAqIFNpZ25zIGFyZSBzdXBwb3J0ZWQgc28gYSBkdXJhdGlvbiBjYW4gZXhwcmVzcyBhbiBPRkZTRVQgcmF0aGVyIHRoYW4gb25seSBhXG4gKiBsZW5ndGg6IGEgbGVhZGluZyBgLWAgKG9yIGEgdHJhaWxpbmcgYGFnb2ApIG1ha2VzIHRoZSByZXN1bHQgbmVnYXRpdmUsIGFuZCBhblxuICogdW5zaWduZWQgdGVybSBpbmhlcml0cyB0aGUgcHJldmlvdXMgdGVybSdzIHNpZ24sIHNvIGAtMWgzMG1gIGlzIC05MCBtaW51dGVzXG4gKiByYXRoZXIgdGhhbiAtNjAgKyAzMC4ge0BsaW5rIHRvRGF0ZX0gdXNlcyB0aGF0IHRvIHR1cm4gYC03ZGAgLyBgNyBkYXlzIGFnb2BcbiAqIGludG8gYW4gaW5zdGFudCByZWxhdGl2ZSB0byBub3cuXG4gKlxuICogQW4gVU5LTk9XTiB1bml0IGZhaWxzIHRoZSB3aG9sZSBwYXJzZSByYXRoZXIgdGhhbiBiZWluZyBza2lwcGVkIC0gYDEgZm9ydG5pZ2h0YFxuICogcmV0dXJuaW5nIGAxYCBzaWxlbnRseSB3b3VsZCBiZSB3b3JzZSB0aGFuIHJldHVybmluZyBub3RoaW5nIC0gd2hpY2ggaXMgYWxzb1xuICogd2hhdCBrZWVwcyB7QGxpbmsgdG9EYXRlfSBmcm9tIG1pc3Rha2luZyBgMSBKYW4gMjAyNmAgZm9yIGEgZHVyYXRpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqIHRvRHVyYXRpb24oXCIzMHNcIik7ICAgICAgICAgICAgICAgICAgICAvLyAzMF8wMDBcbiAqIHRvRHVyYXRpb24oXCIxIGhvdXIgMzAgbWludXRlc1wiKTsgICAgICAvLyA1XzQwMF8wMDBcbiAqIHRvRHVyYXRpb24oXCItNyBkYXlzXCIpOyAgICAgICAgICAgICAgICAvLyAtNjA0XzgwMF8wMDBcbiAqIHRvRHVyYXRpb24oXCIyIHdlZWtzIGFnb1wiKTsgICAgICAgICAgICAvLyAtMV8yMDlfNjAwXzAwMFxuICogdG9EdXJhdGlvbihcInNvb25cIik7ICAgICAgICAgICAgICAgICAgIC8vIHVuZGVmaW5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9EdXJhdGlvbih2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHJldHVybiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIC8vIEEgdW5pdGxlc3Mgc3RyaW5nIG1lYW5zIHRoZSBzYW1lIGFzIHRoZSB1bml0bGVzcyBudW1iZXI6IG1pbGxpc2Vjb25kcy5cbiAgaWYgKC9eWystXT9cXGQrKFxcLlxcZCspPyQvLnRlc3QodmFsdWUudHJpbSgpKSkgcmV0dXJuIHRvRHVyYXRpb24oTnVtYmVyKHZhbHVlLnRyaW0oKSkpO1xuXG4gIGxldCB0ZXh0ID0gdmFsdWVcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlQWxsKC9bLF9dL2csIFwiXCIpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmFuZFxcYi9nLCBcIiBcIilcbiAgICAudHJpbSgpO1xuICBsZXQgbmVnYXRlID0gZmFsc2U7XG4gIGlmICh0ZXh0LmVuZHNXaXRoKFwiYWdvXCIpKSB7XG4gICAgbmVnYXRlID0gdHJ1ZTtcbiAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCAtXCJhZ29cIi5sZW5ndGgpO1xuICB9XG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL15pblxcYi8sIFwiXCIpLnRyaW0oKTtcbiAgaWYgKCF0ZXh0KSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHRlcm1zID0gWy4uLnRleHQubWF0Y2hBbGwoRFVSQVRJT05fVEVSTSldO1xuICBpZiAodGVybXMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIEV2ZXJ5dGhpbmcgb3V0c2lkZSB0aGUgbWF0Y2hlZCB0ZXJtcyBtdXN0IGJlIHNlcGFyYXRvcnMgb25seTsgb3RoZXJ3aXNlIHRoZVxuICAvLyBzdHJpbmcgaXMgc29tZXRoaW5nIGVsc2UgdGhhdCBtZXJlbHkgQ09OVEFJTlMgYSBkdXJhdGlvbi1zaGFwZWQgZnJhZ21lbnQuXG4gIGxldCBsZWZ0b3ZlciA9IHRleHQ7XG4gIGZvciAoY29uc3QgdGVybSBvZiB0ZXJtcykgbGVmdG92ZXIgPSBsZWZ0b3Zlci5yZXBsYWNlKHRlcm1bMF0sIFwiIFwiKTtcbiAgaWYgKGxlZnRvdmVyLnRyaW0oKSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBsZXQgdG90YWwgPSAwO1xuICBsZXQgc2lnbiA9IDE7XG4gIGZvciAoY29uc3QgWywgZXhwbGljaXRTaWduLCBhbW91bnQsIHVuaXRdIG9mIHRlcm1zKSB7XG4gICAgaWYgKGV4cGxpY2l0U2lnbikgc2lnbiA9IGV4cGxpY2l0U2lnbiA9PT0gXCItXCIgPyAtMSA6IDE7XG4gICAgY29uc3QgdW5pdE1zID0gRFVSQVRJT05fVU5JVF9NUy5nZXQodW5pdCkgPz8gRFVSQVRJT05fVU5JVF9NUy5nZXQodW5pdC5yZXBsYWNlKC9zJC8sIFwiXCIpKTtcbiAgICBpZiAodW5pdE1zID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgdG90YWwgKz0gc2lnbiAqIE51bWJlcihhbW91bnQpICogdW5pdE1zO1xuICB9XG4gIHJldHVybiBuZWdhdGUgPyAtdG90YWwgOiB0b3RhbDtcbn1cblxuLyoqXG4gKiBDb2VyY2UgYSBsb29zZSBkYXRlLWlzaCB2YWx1ZSB0byBhIHJlYWwgYERhdGVgLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGNhbid0IGJlXG4gKiBpbnRlcnByZXRlZC4gQWNjZXB0cywgaW4gdGhpcyBvcmRlcjpcbiAqXG4gKiAgIC0gYSBgRGF0ZWAgKHBhc3NlZCB0aHJvdWdoOyBhbiBpbnZhbGlkIG9uZSBpcyBhIG1pc3MpO1xuICogICAtIGFuIGVwb2NoIE5VTUJFUiBvciBudW1lcmljIHN0cmluZywgaW4gc2Vjb25kcyBvciBtaWxsaXNlY29uZHMgKHNlZVxuICogICAgIHtAbGluayBTRUNPTkRTX0NFSUxJTkd9KTtcbiAqICAgLSBgbm93YCAoYW5kIGl0cyBgdG9kYXlgIHNwZWxsaW5nKSwgZm9yIHRoZSBjdXJyZW50IGluc3RhbnQ7XG4gKiAgIC0gYSB7QGxpbmsgdG9EdXJhdGlvbn0gZXhwcmVzc2lvbiwgcmVzb2x2ZWQgUkVMQVRJVkUgVE8gTk9XLCBzbyBgLTdkYCxcbiAqICAgICBgNyBkYXlzIGFnb2AsIGFuZCBgaW4gMzAgbWludXRlc2AgYXJlIGFsbCB2YWxpZCBpbnN0YW50cztcbiAqICAgLSBhbnl0aGluZyBgRGF0ZS5wYXJzZWAgdW5kZXJzdGFuZHMgKGAyMDI2LTA4LTAyYCwgYW4gSVNPL1VUQyBpbnN0YW50KS5cbiAqXG4gKiBUaGUgZXBvY2ggdW5pdCBpbmZlcmVuY2UgaXMgdGhlIHJlYXNvbiB0aGlzIGV4aXN0cyByYXRoZXIgdGhhblxuICogYG5ldyBEYXRlKHZhbHVlKWA6IGEgYmFyZSBlcG9jaCBhcnJpdmVzIGFzIGEgU1RSSU5HIGZyb20gYW4gZW52IHZhciBvciBhIENMSVxuICogZmxhZyBhcyBvZnRlbiBhcyBpdCBhcnJpdmVzIGFzIGEgbnVtYmVyIChgZGF0ZSArJXNgLCBhIEpTT04gZmllbGQsIGEgY29waWVkIGxvZ1xuICogbGluZSksIGFuZCBgRGF0ZS5wYXJzZShcIjE3ODU2OTc4OTlcIilgIHJlYWRzIHRoYXQgYXMgYSBZRUFSLCBzaWxlbnRseSBsYW5kaW5nXG4gKiAxLjcgYmlsbGlvbiB5ZWFycyBvdXQuIE51bWVyaWMgc3RyaW5ncyBhcmUgdGhlcmVmb3JlIHJvdXRlZCB0byB0aGUgZXBvY2ggcGF0aCxcbiAqIG5ldmVyIHRvIGBEYXRlLnBhcnNlYC5cbiAqXG4gKiBMaWtlIHtAbGluayB0b0Jvb2xlYW59IHRoaXMgTkVWRVIgdGhyb3dzIGFuZCByZXR1cm5zIGB1bmRlZmluZWRgIGZvciBhbnl0aGluZ1xuICogdW5pbnRlcnByZXRhYmxlLCBzbyBhIGNhbGxlciBkZWNpZGVzIHdoZXRoZXIgYSBiYWQgdmFsdWUgaXMgZmF0YWwsIGEgd2FybmluZyxcbiAqIG9yIGEgZmFsbGJhY2suXG4gKlxuICogQGV4YW1wbGVcbiAqIHRvRGF0ZShcIm5vd1wiKTsgICAgICAgICAgICAgICAvLyB0aGlzIGluc3RhbnRcbiAqIHRvRGF0ZShcIjIwMjYtMDgtMDJcIik7ICAgICAgICAvLyAyMDI2LTA4LTAyVDAwOjAwOjAwLjAwMFpcbiAqIHRvRGF0ZShcIjE3ODU2OTc4OTlcIik7ICAgICAgICAvLyBzZWNvbmRzIC0+IDIwMjYtMDgtMDJULi4uXG4gKiB0b0RhdGUoMTc4NTY5Nzg5OTAwMCk7ICAgICAgIC8vIG1pbGxpcyAgLT4gdGhlIHNhbWUgaW5zdGFudFxuICogdG9EYXRlKFwiMzAgZGF5cyBhZ29cIik7ICAgICAgIC8vIG5vdyAtIDMwZFxuICogdG9EYXRlKFwibm9wZVwiKTsgICAgICAgICAgICAgIC8vIHVuZGVmaW5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9EYXRlKHZhbHVlOiB1bmtub3duKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHZhbHVlLmdldFRpbWUoKSkgPyB1bmRlZmluZWQgOiB2YWx1ZTtcbiAgfVxuXG4gIGNvbnN0IGVwb2NoTXMgPSB0b0Vwb2NoTXModmFsdWUpO1xuICBpZiAoZXBvY2hNcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gZnJvbU1zKGVwb2NoTXMpO1xuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgdGV4dCA9IHZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICBpZiAodGV4dCA9PT0gXCJub3dcIiB8fCB0ZXh0ID09PSBcInRvZGF5XCIpIHJldHVybiBuZXcgRGF0ZSgpO1xuXG4gIGNvbnN0IG9mZnNldE1zID0gdG9EdXJhdGlvbih2YWx1ZSk7XG4gIGlmIChvZmZzZXRNcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gZnJvbU1zKERhdGUubm93KCkgKyBvZmZzZXRNcyk7XG5cbiAgY29uc3QgcGFyc2VkID0gRGF0ZS5wYXJzZSh2YWx1ZS50cmltKCkpO1xuICByZXR1cm4gTnVtYmVyLmlzTmFOKHBhcnNlZCkgPyB1bmRlZmluZWQgOiBuZXcgRGF0ZShwYXJzZWQpO1xufVxuXG4vKiogQSBgRGF0ZWAgZm9yIGVwb2NoIGBtc2AsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgaXMgb3V0IG9mIHJlcHJlc2VudGFibGUgcmFuZ2UuICovXG5mdW5jdGlvbiBmcm9tTXMobXM6IG51bWJlcik6IERhdGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUobXMpO1xuICByZXR1cm4gTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSA/IHVuZGVmaW5lZCA6IGRhdGU7XG59XG5cbi8qKiBFcG9jaCBtaWxsaXNlY29uZHMgZm9yIGEgbnVtZXJpYyB2YWx1ZS9zdHJpbmcsIG9yIGB1bmRlZmluZWRgIHdoZW4gbm90IG9uZS4gKi9cbmZ1bmN0aW9uIHRvRXBvY2hNcyh2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGxldCBudW1lcmljOiBudW1iZXI7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICBudW1lcmljID0gdmFsdWU7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIC9eWystXT9cXGQrKFxcLlxcZCspPyQvLnRlc3QodmFsdWUudHJpbSgpKSkge1xuICAgIG51bWVyaWMgPSBOdW1iZXIodmFsdWUudHJpbSgpKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKG51bWVyaWMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gTWF0aC5hYnMobnVtZXJpYykgPCBTRUNPTkRTX0NFSUxJTkcgPyBudW1lcmljICogMTAwMCA6IG51bWVyaWM7XG59XG5cbi8qKlxuICogU3RydWN0dXJhbCBkZWVwLWVxdWFsaXR5IHdpdGggYW4gb3B0aW9uYWwgY3VzdG9tIGNvbXBhcmF0b3IuXG4gKlxuICoge0BsaW5rIGRlZXBFcXVhbH0gbWlycm9ycyB0aGUgc2VtYW50aWNzIG9mIHRoZSBgZmFzdC1kZWVwLWVxdWFsYFxuICogcGFja2FnZSAoaGFuZGxlZDogbmVzdGVkIHBsYWluIG9iamVjdHMvYXJyYXlzLCBgTWFwYCwgYFNldGAsIGBEYXRlYCxcbiAqIGBSZWdFeHBgLCB0eXBlZCBhcnJheXMsIGBOYU5gLCBhbmQgYCswYC9gLTBgIHRyZWF0ZWQgYXMgZXF1YWwpIGJ1dCBpc1xuICogZGVwZW5kZW5jeS1mcmVlIHNvIGBAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlYCBrZWVwcyBubyBydW50aW1lIGRlcHMuXG4gKlxuICogVGhlIG9wdGlvbmFsIGBjb21wYXJhdG9yYCBzaG9ydC1jaXJjdWl0cyB0aGUgc3RydWN0dXJhbCB3YWxrIGF0IGFueVxuICogbm9kZTogcmV0dXJuIGB0cnVlYC9gZmFsc2VgIHRvIGZvcmNlIHRoZSByZXN1bHQgZm9yIHRoYXQgcGFpciwgb3JcbiAqIGB1bmRlZmluZWRgIHRvIGRlZmVyIHRvIHRoZSBidWlsdC1pbiBjb21wYXJpc29uLiBJdCBpcyBpbnZva2VkIGZvciB0aGVcbiAqIHJvb3QgcGFpciBhbmQgcmVjdXJzaXZlbHkgZm9yIGVhY2ggbmVzdGVkIHBhaXIsIHNvIGEgY2FsbGVyIGNhbiwgZS5nLixcbiAqIGNvbXBhcmUgdHdvIGRvbWFpbiBvYmplY3RzIGJ5IGlkIHdoaWxlIGxldHRpbmcgZXZlcnl0aGluZyBlbHNlIGZhbGxcbiAqIGJhY2sgdG8gc3RydWN0dXJhbCBlcXVhbGl0eS5cbiAqXG4gKiBAZXhhbXBsZVxuICogZGVlcEVxdWFsKHsgYTogMSB9LCB7IGE6IDEgfSk7ICAgICAgICAgICAgICAgICAvLyB0cnVlXG4gKiBkZWVwRXF1YWwoWzEsIDJdLCBbMSwgMl0pOyAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVlXG4gKiBkZWVwRXF1YWwoYSwgYiwgKHgsIHkpID0+XG4gKiAgIGlzRW50aXR5KHgpICYmIGlzRW50aXR5KHkpID8geC5pZCA9PT0geS5pZCA6IHVuZGVmaW5lZCk7XG4gKi9cbmV4cG9ydCB0eXBlIERlZXBFcXVhbENvbXBhcmF0b3IgPSAoYTogdW5rbm93biwgYjogdW5rbm93bikgPT4gYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBFcXVhbChhOiB1bmtub3duLCBiOiB1bmtub3duLCBjb21wYXJhdG9yPzogRGVlcEVxdWFsQ29tcGFyYXRvcik6IGJvb2xlYW4ge1xuICBpZiAoY29tcGFyYXRvcikge1xuICAgIGNvbnN0IGRlY2lkZWQgPSBjb21wYXJhdG9yKGEsIGIpO1xuICAgIGlmIChkZWNpZGVkICE9PSB1bmRlZmluZWQpIHJldHVybiBkZWNpZGVkO1xuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuXG4gIGlmICh0eXBlb2YgYSAhPT0gXCJvYmplY3RcIiB8fCBhID09PSBudWxsIHx8IHR5cGVvZiBiICE9PSBcIm9iamVjdFwiIHx8IGIgPT09IG51bGwpIHtcbiAgICAvLyBOYU4gaXMgdGhlIG9ubHkgdmFsdWUgbm90IGVxdWFsIHRvIGl0c2VsZiB1bmRlciBgPT09YC5cbiAgICByZXR1cm4gYSAhPT0gYSAmJiBiICE9PSBiO1xuICB9XG5cbiAgaWYgKGEuY29uc3RydWN0b3IgIT09IGIuY29uc3RydWN0b3IpIHJldHVybiBmYWxzZTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgIGNvbnN0IGJBcnIgPSBiIGFzIHVua25vd25bXTtcbiAgICBpZiAoYS5sZW5ndGggIT09IGJBcnIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIWRlZXBFcXVhbChhW2ldLCBiQXJyW2ldLCBjb21wYXJhdG9yKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgY29uc3QgYk1hcCA9IGIgYXMgTWFwPHVua25vd24sIHVua25vd24+O1xuICAgIGlmIChhLnNpemUgIT09IGJNYXAuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGEpIHtcbiAgICAgIGlmICghYk1hcC5oYXMoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKCFkZWVwRXF1YWwodmFsdWUsIGJNYXAuZ2V0KGtleSksIGNvbXBhcmF0b3IpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGEgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICBjb25zdCBiU2V0ID0gYiBhcyBTZXQ8dW5rbm93bj47XG4gICAgaWYgKGEuc2l6ZSAhPT0gYlNldC5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhKSB7XG4gICAgICBpZiAoIWJTZXQuaGFzKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBhLmdldFRpbWUoKSA9PT0gKGIgYXMgRGF0ZSkuZ2V0VGltZSgpO1xuICB9XG5cbiAgaWYgKGEgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICBjb25zdCBiUmUgPSBiIGFzIFJlZ0V4cDtcbiAgICByZXR1cm4gYS5zb3VyY2UgPT09IGJSZS5zb3VyY2UgJiYgYS5mbGFncyA9PT0gYlJlLmZsYWdzO1xuICB9XG5cbiAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhhKSAmJiAhKGEgaW5zdGFuY2VvZiBEYXRhVmlldykpIHtcbiAgICBjb25zdCBhQXJyID0gYSBhcyB1bmtub3duIGFzIEFycmF5TGlrZTxudW1iZXI+O1xuICAgIGNvbnN0IGJBcnIgPSBiIGFzIHVua25vd24gYXMgQXJyYXlMaWtlPG51bWJlcj47XG4gICAgaWYgKGFBcnIubGVuZ3RoICE9PSBiQXJyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYUFyci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFBcnJbaV0gIT09IGJBcnJbaV0pIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBhS2V5cyA9IE9iamVjdC5rZXlzKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICBjb25zdCBiS2V5cyA9IE9iamVjdC5rZXlzKGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICBpZiAoYUtleXMubGVuZ3RoICE9PSBiS2V5cy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgZm9yIChjb25zdCBrZXkgb2YgYUtleXMpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKFxuICAgICAgIWRlZXBFcXVhbChcbiAgICAgICAgKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0sXG4gICAgICAgIChiIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldLFxuICAgICAgICBjb21wYXJhdG9yLFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbiJdfQ==
|
|
1183
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29iamVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUEwQkgsc0VBQXNFO0FBQ3RFLE1BQU0sVUFBVSxXQUFXLENBQWMsS0FBbUI7SUFDMUQsT0FBTyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBY0Q7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFjLEtBQWM7SUFDdEQsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssWUFBWSxHQUFHLElBQUksS0FBSyxZQUFZLEdBQUcsQ0FBQztBQUM5RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsT0FBTyxDQUNyQixVQUF5RCxFQUN6RCxPQUFpQztJQUVqQyxTQUFTLEtBQUssQ0FBQyxLQUFjLEVBQUUsSUFBbUI7UUFDaEQsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbEIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNyQyxJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQ2xDLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLE9BQU8sS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FB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TUFBTSxDQUFDLElBQUksQ0FBQyxDQUE0QixDQUFDLENBQUM7SUFDeEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUE0QixDQUFDLENBQUM7SUFDeEQsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxNQUFNO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDaEQsS0FBSyxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNoRSxJQUNFLENBQUMsU0FBUyxDQUNQLENBQTZCLENBQUMsR0FBRyxDQUFDLEVBQ2xDLENBQTZCLENBQUMsR0FBRyxDQUFDLEVBQ25DLFVBQVUsQ0FDWCxFQUNELENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEZXBlbmRlbmN5LWZyZWUgb2JqZWN0ICsgaXRlcmFibGUgdXRpbGl0aWVzLlxuICpcbiAqIFZhbHVlIGd1YXJkcyAvIGNvZXJjaW9ucyAvIHNoYXBlIHR5cGVzOiB7QGxpbmsgaXNSZWNvcmR9IG5hcnJvd3MgcGFyc2VkIEpTT05cbiAqIHRvIGEgcmVjb3JkLCB7QGxpbmsgdG9OdW1iZXJ9IGNvZXJjZXMgYSBoYW5kLXR5cGVkIG51bWVyYWwsIHtAbGluayB0b0Jvb2xlYW59XG4gKiBjb2VyY2VzIGxvb3NlIHRydXRoeS9mYWxzeSB2YWx1ZXMsIHtAbGluayB0b0R1cmF0aW9ufSBwYXJzZXMgYDFoMzBtYCAvXG4gKiBgMiBtaWxsaXNlY29uZHNgIHRvIG1pbGxpcywge0BsaW5rIHRvRGF0ZX0gY29lcmNlcyBhIGRhdGUvSVNPIHN0cmluZy9lcG9jaFxuICogbnVtYmVyL3JlbGF0aXZlIGR1cmF0aW9uIChgdG9EYXRlYCBhbmQgYHRvRHVyYXRpb25gIGZhbGwgYmFjayB0byBlYWNoIG90aGVyLCBzb1xuICogZWl0aGVyIGFjY2VwdHMgYm90aCByZWFkaW5ncyksIHtAbGluayBvcHRpb25hbH1cbiAqIHNwcmVhZHMgYSBmaWVsZCBvbmx5IHdoZW4gaXQgaXMgcHJlc2VudCwge0BsaW5rIGRlZXBFcXVhbH0gY29tcGFyZXNcbiAqIHN0cnVjdHVyYWxseSwge0BsaW5rIGlzU2VyaWFsaXphYmxlVmFsdWV9IHJlamVjdHMgYW55dGhpbmcgYSBKU09OIHJvdW5kIHRyaXBcbiAqIHdvdWxkIGxvc2Ugb3IgY29lcmNlLCB7QGxpbmsgdG9TdGFibGVLZXl9IGNhbm9uaWNhbGl6ZXMgYSB2YWx1ZSBzbyBhbiBpZGVudGl0eVxuICogY2FuIGJlIGRlcml2ZWQgZnJvbSBpdCwgYW5kIHtAbGluayBOYW1lTGlrZX0ve0BsaW5rIE5vbkZ1bmN0aW9uS2V5c30gZGVzY3JpYmVcbiAqIG9iamVjdCBzaGFwZXMuXG4gKlxuICogSXRlcmFibGUgaGVscGVyczoge0BsaW5rIGdlbmVyYXRvcn0gZmxhdHRlbnMgbWl4ZWQgYXJndW1lbnRzOyB7QGxpbmsgc2VxdWVuY2V9XG4gKiB3cmFwcyBzb3VyY2UocykgaW4gYSBsYXp5LCBgQXJyYXlgLWNvbXBhdGlibGUge0BsaW5rIFNlcXVlbmNlfS4gRXZlcnlcbiAqIHRyYW5zZm9ybS90ZXJtaW5hbCBpcyBhIHN0YW5kYWxvbmUgZnVuY3Rpb24gb3BlcmF0aW5nIG9uIHBsYWluIHtAbGlua1xuICogQ29udGFpbmVyfXMgKHNlZSB7QGxpbmsgbWFwfSwge0BsaW5rIGZpbHRlcn0sIHtAbGluayBncm91cH0sIC4uLik7IHRoZSB7QGxpbmtcbiAqIFNlcXVlbmNlfSBtZXRob2RzIGFyZSB0aGluIGZvcndhcmRlcnMgb3ZlciB0aGVtIHNvIHRoZSBzYW1lIGxvZ2ljIGJhY2tzIGJvdGhcbiAqIHRoZSBmcmVlLWZ1bmN0aW9uIGFuZCB0aGUgZmx1ZW50L2NoYWluZWQgc3R5bGVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG4vKiogTGF6eSBzZXF1ZW5jZSBvdmVyIGl0ZXJhYmxlIHNvdXJjZShzKS4gU2VlIHtAbGluayBzZXF1ZW5jZX0uICovXG5leHBvcnQgdHlwZSBTZXF1ZW5jZTxUPiA9IFNlcXVlbmNlSW1wbDxUPjtcblxudHlwZSBTZXF1ZW5jZVNvdXJjZTxUPiA9IEl0ZXJhYmxlPFQ+IHwgUmVhZG9ubHlNYXA8dW5rbm93biwgVD4gfCBPbmVPck1hbnk8VD4gfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgbm9uLXNjYWxhciB7QGxpbmsgSXRlcmFibGV9IC0gb25lIHRvIHRyZWF0IGFzIGEgY29sbGVjdGlvbiBvZiBlbGVtZW50c1xuICogcmF0aGVyIHRoYW4gYSBzY2FsYXIuIHtAbGluayBpc0NvbnRhaW5lcn0gbmFycm93cyB0byB0aGlzLCBleGNsdWRpbmcgc3RyaW5ncyxcbiAqIGBTdHJpbmdgL2BSZWdFeHBgIG9iamVjdHMsIGFuZCBmdW5jdGlvbnMuIHtAbGluayBDb2xsZWN0aW9ufSBpcyB0aGUgZWFnZXJseS1cbiAqIHNpemVkIHN1YnNldC4gVGhlIGVsZW1lbnQgZGVmYXVsdHMgdG8gYHVua25vd25gIHNvIGFueSBgQ29sbGVjdGlvbmAgaXNcbiAqIGFzc2lnbmFibGUgdG8gYSBiYXJlIGBDb250YWluZXJgLlxuICovXG5leHBvcnQgdHlwZSBDb250YWluZXI8VCA9IHVua25vd24+ID0gSXRlcmFibGU8VD47XG5cbi8qKlxuICogQSBidWlsdC1pbiwgZWFnZXJseS1zaXplZCB7QGxpbmsgQ29udGFpbmVyfTogYW4ge0BsaW5rIEFycmF5fSwge0BsaW5rIFNldH0sIG9yXG4gKiB7QGxpbmsgTWFwfSAod2hvc2UgKnZhbHVlcyogYXJlIGBUYCAtIGEgTWFwIGl0ZXJhdGVzIGBba2V5LCB2YWx1ZV1gIGVudHJpZXMsXG4gKiBzbyBpdHMgZWxlbWVudCB0eXBlIGRpZmZlcnMsIGJ1dCBpdHMgdmFsdWUgdHlwZSBpcyBgVGApLiBBbGwgc2hhcmUgYSBjaGVhcFxuICogZW1wdGluZXNzIGNoZWNrICh7QGxpbmsgaXNFbXB0eX0pLlxuICovXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uPFQ+ID0gUmVhZG9ubHlBcnJheTxUPiB8IFJlYWRvbmx5U2V0PFQ+IHwgUmVhZG9ubHlNYXA8dW5rbm93biwgVD47XG5cbmV4cG9ydCB0eXBlIE9uZU9yTWFueTxUPiA9IFtULCAuLi5UW11dO1xuXG4vKiogTmFycm93IGEgcmVhZG9ubHkgYXJyYXkgdG8gYSBub24tZW1wdHkge0BsaW5rIE9uZU9yTWFueX0gdHVwbGUuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPbmVPck1hbnk8VCA9IHVua25vd24+KHZhbHVlOiByZWFkb25seSBUW10pOiB2YWx1ZSBpcyBPbmVPck1hbnk8VD4ge1xuICByZXR1cm4gdmFsdWUubGVuZ3RoID4gMDtcbn1cblxuLyoqIEEgc291cmNlIGFjY2VwdGVkIGJ5IGEgdmFyaWFkaWMgb3A6IGEge0BsaW5rIENvbnRhaW5lcn0gb2YgYFRgLCBvciBub3RoaW5nLiAqL1xudHlwZSBTb3VyY2U8VD4gPSBDb250YWluZXI8VD4gfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEVsZW1lbnQgdHlwZSBvZiBhIHtAbGluayBncm91cH0gYnVja2V0IGFycmF5OiB3aGVuIHRoZSBwcmVkaWNhdGUgYFBgIGlzIGEgdHlwZVxuICogZ3VhcmQgKGB2YWx1ZSBpcyBTYCksIHRoZSBidWNrZXQgaXMgbmFycm93ZWQgdG8gYFMgJiBUYDsgb3RoZXJ3aXNlIGl0IHN0YXlzIGBUYC5cbiAqL1xudHlwZSBHcm91cFZhbHVlPFQsIFA+ID0gUCBleHRlbmRzICh2YWx1ZTogYW55LCAuLi5yZXN0OiBhbnlbXSkgPT4gdmFsdWUgaXMgaW5mZXIgUyA/IFMgJiBUIDogVDtcblxuLyoqIEEgbWFwIG9mIGdyb3VwIG5hbWUgLT4gcHJlZGljYXRlLCBhcyBhY2NlcHRlZCBieSB7QGxpbmsgZ3JvdXB9LiAqL1xudHlwZSBHcm91cFByZWRpY2F0ZXM8VD4gPSBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4+O1xuXG4vKipcbiAqIFR5cGUgZ3VhcmQgZm9yIGEge0BsaW5rIENvbGxlY3Rpb259OiBhbiB7QGxpbmsgQXJyYXl9LCB7QGxpbmsgU2V0fSwgb3JcbiAqIHtAbGluayBNYXB9LiBOYXJyb3dzIGB2YWx1ZWAgc28gaXRzIGVsZW1lbnQvdmFsdWUgdHlwZSBpcyB0cmVhdGVkIGFzIGBUYC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBFbGVtZW50IChvciBNYXAgdmFsdWUpIHR5cGUgYXNzZXJ0ZWQgZm9yIHRoZSBjb2xsZWN0aW9uLlxuICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gdGVzdC5cbiAqIEByZXR1cm5zIGB0cnVlYCAobmFycm93aW5nIGB2YWx1ZWAgdG8ge0BsaW5rIENvbGxlY3Rpb259PGBUYD4pIGZvciBhXG4gKiAgIGJ1aWx0LWluIGFycmF5L3NldC9tYXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbGxlY3Rpb248VCA9IHVua25vd24+KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQ29sbGVjdGlvbjxUPiB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIFNldCB8fCB2YWx1ZSBpbnN0YW5jZW9mIE1hcDtcbn1cblxuLyoqXG4gKiBgdHJ1ZWAgd2hlbiBhIHtAbGluayBDb2xsZWN0aW9ufSBoYXMgbm8gZWxlbWVudHMuIFVzZXMgYGxlbmd0aGAgZm9yIGFycmF5c1xuICogYW5kIGBzaXplYCBmb3Ige0BsaW5rIFNldH0ve0BsaW5rIE1hcH0uXG4gKlxuICogQHBhcmFtIGNvbGxlY3Rpb24gLSBUaGUgYXJyYXksIHNldCwgb3IgbWFwIHRvIHRlc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5KFxuICBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uPHVua25vd24+IHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIG9wdGlvbnM/OiB7IHJlY3Vyc2l2ZT86IGJvb2xlYW4gfSxcbik6IGJvb2xlYW4ge1xuICBmdW5jdGlvbiB2aXNpdCh2YWx1ZTogdW5rbm93biwgc2Vlbj86IFNldDx1bmtub3duPik6IGJvb2xlYW4ge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgaWYgKHNlZW4/Lmhhcyh2YWx1ZSkpIHJldHVybiB0cnVlO1xuICAgICAgc2Vlbj8uYWRkKHZhbHVlKTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUubGVuZ3RoID09PSAwIHx8IChzZWVuID8gdmFsdWUuZXZlcnkoKGl0ZW0pID0+IHZpc2l0KGl0ZW0sIHNlZW4pKSA6IGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgICByZXR1cm4gdmFsdWUuc2l6ZSA9PT0gMCB8fCAoc2VlbiA/IFsuLi52YWx1ZV0uZXZlcnkoKGl0ZW0pID0+IHZpc2l0KGl0ZW0sIHNlZW4pKSA6IGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHZhbHVlLnNpemUgPT09IDAgfHxcbiAgICAgICAgICAoc2VlbiA/IFsuLi52YWx1ZS52YWx1ZXMoKV0uZXZlcnkoKGl0ZW0pID0+IHZpc2l0KGl0ZW0sIHNlZW4pKSA6IGZhbHNlKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoc2Vlbikge1xuICAgICAgICByZXR1cm4ga2V5cy5ldmVyeSgoa2V5KSA9PiB2aXNpdCgodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0sIHNlZW4pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdmlzaXQoY29sbGVjdGlvbiwgb3B0aW9ucz8ucmVjdXJzaXZlID8gbmV3IFNldCgpIDogdW5kZWZpbmVkKTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgc291cmNlIHRvIGFuIGl0ZXJhYmxlIG9mIGl0cyBgVGAgdmFsdWVzLCBzbyBNYXBzIGFyZSB0cmVhdGVkXG4gKiB1bmlmb3JtbHkgd2l0aCBhcnJheXMvc2V0czogYSB7QGxpbmsgTWFwfSB5aWVsZHMgaXRzICp2YWx1ZXMqIChtYXRjaGluZ1xuICoge0BsaW5rIENvbGxlY3Rpb259J3MgdmFsdWUtdHlwZWQgYFRgKSwgYW55IG90aGVyIGl0ZXJhYmxlIHlpZWxkcyBpdHNlbGYuIFRoaXNcbiAqIGlzIHdoYXQge0BsaW5rIHNlcXVlbmNlfSBjb25zdW1lcywgc28gYSBgTWFwYCBjb250cmlidXRlcyB2YWx1ZXMgZXZlcnl3aGVyZVxuICogcmF0aGVyIHRoYW4gYFtrZXksIHZhbHVlXWAgZW50cmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbHVlczxUPihzb3VyY2U6IEl0ZXJhYmxlPFQ+IHwgUmVhZG9ubHlNYXA8dW5rbm93biwgVD4pOiBJdGVyYWJsZTxUPiB7XG4gIHJldHVybiBzb3VyY2UgaW5zdGFuY2VvZiBNYXAgPyBzb3VyY2UudmFsdWVzKCkgOiAoc291cmNlIGFzIEl0ZXJhYmxlPFQ+KTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIGZvciBhIHtAbGluayBDb250YWluZXJ9IC0gYW4gaXRlcmFibGUgdG8gYmUgdHJlYXRlZCBhcyBhIGNvbGxlY3Rpb25cbiAqIHJhdGhlciB0aGFuIGEgc2NhbGFyLlxuICpcbiAqIERlbGliZXJhdGVseSBleGNsdWRlcyB2YWx1ZXMgdGhhdCBhcmUgdGVjaG5pY2FsbHkgaXRlcmFibGUgYnV0IHNob3VsZCBiZVxuICogdHJlYXRlZCBhcyBzY2FsYXJzIGhlcmUgLSBzdHJpbmdzLCBgU3RyaW5nYC9gUmVnRXhwYCBvYmplY3RzLCBhbmQgZnVuY3Rpb25zIC1cbiAqIHNvIGEgbG9uZSBzdHJpbmcgaXMgbmV2ZXIgc3ByZWFkIGNoYXJhY3Rlci1ieS1jaGFyYWN0ZXIuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gRWxlbWVudCB0eXBlIGFzc2VydGVkIGZvciB0aGUgaXRlcmFibGUuXG4gKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byB0ZXN0LlxuICogQHJldHVybnMgYHRydWVgIChuYXJyb3dpbmcgYHZhbHVlYCB0byB7QGxpbmsgQ29udGFpbmVyfTxgVGA+KSBmb3IgYSBub24tc3RyaW5nXG4gKiAgIGl0ZXJhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb250YWluZXI8VCA9IHVua25vd24+KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQ29udGFpbmVyPFQ+IHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSAhPSBudWxsICYmXG4gICAgdHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiICYmXG4gICAgISh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgJiZcbiAgICAhKHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSAmJlxuICAgIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiICYmXG4gICAgdHlwZW9mICh2YWx1ZSBhcyB7IFtTeW1ib2wuaXRlcmF0b3JdPzogdW5rbm93biB9KVtTeW1ib2wuaXRlcmF0b3JdID09PSBcImZ1bmN0aW9uXCJcbiAgKTtcbn1cblxuZnVuY3Rpb24gc2VxdWVuY2VTb3VyY2VzPFQ+KC4uLnNvdXJjZXM6IFNlcXVlbmNlU291cmNlPFQ+W10pOiBJdGVyYWJsZTxUPltdIHtcbiAgY29uc3Qgc291cmNlSXRlcmFibGVzOiBJdGVyYWJsZTxUPltdID0gW107XG4gIGZvciAoY29uc3Qgc291cmNlIG9mIHNvdXJjZXMpIHtcbiAgICBpZiAoc291cmNlID09IG51bGwgfHwgKGlzQ29sbGVjdGlvbihzb3VyY2UpICYmIGlzRW1wdHkoc291cmNlKSkpIGNvbnRpbnVlO1xuICAgIHNvdXJjZUl0ZXJhYmxlcy5wdXNoKHZhbHVlcyhzb3VyY2UpKTtcbiAgfVxuICByZXR1cm4gc291cmNlSXRlcmFibGVzO1xufVxuXG4vKipcbiAqIEZsYXR0ZW5zIG5lc3RlZCBhcnJheXMgZm9yIHtAbGluayBmbGF0fS4gTm9uLWFycmF5IHZhbHVlcyBhcmUgd3JhcHBlZCBhcyBhXG4gKiBzaW5nbGUtZWxlbWVudCBpdGVyYWJsZTsgZGVwdGggZGVjcmVtZW50cyBwZXIgYXJyYXkgbGV2ZWwuXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW5WYWx1ZSh2YWx1ZTogdW5rbm93biwgZGVwdGg6IG51bWJlcik6IEl0ZXJhYmxlPHVua25vd24+IHtcbiAgaWYgKGRlcHRoID4gMCAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGNvbnN0IG5leHREZXB0aCA9IE51bWJlci5pc0Zpbml0ZShkZXB0aCkgPyBkZXB0aCAtIDEgOiBkZXB0aDtcbiAgICByZXR1cm4ge1xuICAgICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHlpZWxkKiBmbGF0dGVuVmFsdWUoaXRlbSwgbmV4dERlcHRoKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICByZXR1cm4gW3ZhbHVlXTtcbn1cblxuLyoqIFdyYXAgYSBwZXItZWxlbWVudCB0cmFuc2Zvcm0gKGVhY2ggZWxlbWVudCAtPiBhbiBpdGVyYWJsZSkgYXMgYSBsYXp5IHtAbGluayBTZXF1ZW5jZX0uICovXG5mdW5jdGlvbiBkZXJpdmU8VCwgVT4oXG4gIHNvdXJjZTogSXRlcmFibGU8VD4sXG4gIGZuOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IEl0ZXJhYmxlPFU+LFxuKTogU2VxdWVuY2U8VT4ge1xuICByZXR1cm4gc2VxdWVuY2Uoe1xuICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNvdXJjZSkgeWllbGQqIGZuKHZhbHVlLCBpbmRleCsrKTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqIExpa2Uge0BsaW5rIGRlcml2ZX0sIGJ1dCB5aWVsZHMgb25lIHZhbHVlIHBlciBzb3VyY2UgZWxlbWVudCAobm8gd3JhcHBlciBpdGVyYWJsZSkuICovXG5mdW5jdGlvbiBkZXJpdmVPbmU8VCwgVT4oc291cmNlOiBJdGVyYWJsZTxUPiwgZm46ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gVSk6IFNlcXVlbmNlPFU+IHtcbiAgcmV0dXJuIHNlcXVlbmNlKHtcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBzb3VyY2UpIHlpZWxkIGZuKHZhbHVlLCBpbmRleCsrKTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLm1hcGAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKlxuICogQHBhcmFtIHNvdXJjZSAtIFRoZSBjb250YWluZXIgdG8gbWFwIChudWxsaXNoIHlpZWxkcyBhbiBlbXB0eSBzZXF1ZW5jZSkuXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBDYWxsZWQgcGVyIGVsZW1lbnQgd2l0aCBpdHMgaW5kZXg7IGl0cyByZXN1bHQgaXMgZW1pdHRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcDxULCBVPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IFUsXG4pOiBTZXF1ZW5jZTxVPiB7XG4gIHJldHVybiBkZXJpdmVPbmUoc2VxdWVuY2Uoc291cmNlKSwgY2FsbGJhY2spO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZmlsdGVyYCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqIEEgdHlwZS1ndWFyZCBwcmVkaWNhdGUgbmFycm93cyB0aGUgcmVzdWx0aW5nIGVsZW1lbnQgdHlwZS5cbiAqXG4gKiBAcGFyYW0gc291cmNlIC0gVGhlIGNvbnRhaW5lciB0byBmaWx0ZXIgKG51bGxpc2ggeWllbGRzIGFuIGVtcHR5IHNlcXVlbmNlKS5cbiAqIEBwYXJhbSBwcmVkaWNhdGUgLSBLZWVwcyBlbGVtZW50cyBmb3Igd2hpY2ggaXQgcmV0dXJucyBgdHJ1ZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXI8VCwgUyBleHRlbmRzIFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZhbHVlIGlzIFMsXG4pOiBTZXF1ZW5jZTxTPjtcbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXI8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IFNlcXVlbmNlPFQ+O1xuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlcjxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogU2VxdWVuY2U8VD4ge1xuICByZXR1cm4gZGVyaXZlKHNlcXVlbmNlKHNvdXJjZSksIGZ1bmN0aW9uKiAodmFsdWUsIGluZGV4KSB7XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgpKSB5aWVsZCB2YWx1ZTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ29uY2F0ZW5hdGVzIHRoZSBzb3VyY2VzIGFuZCB5aWVsZHMgb25seSBlbGVtZW50cyB0aGF0IGFyZSBub3QgYG51bGxgIG9yXG4gKiBgdW5kZWZpbmVkYCwgbmFycm93aW5nIHRoZSBlbGVtZW50IHR5cGUgdG8ge0BsaW5rIE5vbk51bGxhYmxlfTxgVGA+LlxuICpcbiAqIEBwYXJhbSBzb3VyY2VzIC0gQ29udGFpbmVycyB0byBjb25jYXRlbmF0ZSAobnVsbGlzaCBzb3VyY2VzIGFyZSBza2lwcGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vbk51bGw8VD4oLi4uc291cmNlczogcmVhZG9ubHkgU291cmNlPFQ+W10pOiBTZXF1ZW5jZTxOb25OdWxsYWJsZTxUPj4ge1xuICByZXR1cm4gZmlsdGVyKHNlcXVlbmNlKC4uLnNvdXJjZXMpLCAodmFsdWUpOiB2YWx1ZSBpcyBOb25OdWxsYWJsZTxUPiA9PiB2YWx1ZSAhPSBudWxsKTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmZsYXRNYXBgLCBvdmVyIGEgc2luZ2xlIHtAbGluayBDb250YWluZXJ9LlxuICpcbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgY29udGFpbmVyIHRvIG1hcCAobnVsbGlzaCB5aWVsZHMgYW4gZW1wdHkgc2VxdWVuY2UpLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gUmV0dXJucyBhIHZhbHVlIG9yIGFycmF5IG9mIHZhbHVlcywgZmxhdHRlbmVkIG9uZSBsZXZlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsYXRNYXA8VCwgVT4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBVIHwgUmVhZG9ubHlBcnJheTxVPixcbik6IFNlcXVlbmNlPFU+IHtcbiAgcmV0dXJuIGRlcml2ZShzZXF1ZW5jZShzb3VyY2UpLCBmdW5jdGlvbiogKHZhbHVlLCBpbmRleCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGNhbGxiYWNrKHZhbHVlLCBpbmRleCk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkgeWllbGQqIHJlc3VsdDtcbiAgICBlbHNlIHlpZWxkIHJlc3VsdCBhcyBVO1xuICB9KTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmZsYXRgIChhcnJheXMgb25seSkuIGBkZXB0aGAgbGVhZHMgc28gdGhlXG4gKiBzb3VyY2VzIGNhbiBzdGF5IHZhcmlhZGljOyB1c2UgYGRlcHRoIDwgMWAgZm9yIGEgbm8tb3AgcGFzc3Rocm91Z2guXG4gKlxuICogQHBhcmFtIGRlcHRoIC0gSG93IG1hbnkgYXJyYXkgbGV2ZWxzIHRvIGZsYXR0ZW4uXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUsIHRoZW4gZmxhdHRlbiAobnVsbGlzaCBza2lwcGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsYXQ8VD4oZGVwdGg6IG51bWJlciwgLi4uc291cmNlczogcmVhZG9ubHkgU291cmNlPFQ+W10pOiBTZXF1ZW5jZTxUPiB7XG4gIGNvbnN0IHNyYyA9IHNlcXVlbmNlKC4uLnNvdXJjZXMpO1xuICBpZiAoZGVwdGggPCAxKSByZXR1cm4gc3JjO1xuICByZXR1cm4gZGVyaXZlKHNyYywgKHZhbHVlKSA9PiBmbGF0dGVuVmFsdWUodmFsdWUsIGRlcHRoKSkgYXMgU2VxdWVuY2U8VD47XG59XG5cbi8qKlxuICogQ29uY2F0ZW5hdGVzIHRoZSBzb3VyY2VzLCB0aGVuIGxhemlseSB5aWVsZHMgdmFsdWVzIGluIGVuY291bnRlciBvcmRlcixcbiAqIHNraXBwaW5nIGEgdmFsdWUgb25seSB3aGVuIGFuIGVxdWFsIG9uZSB3YXMgYWxyZWFkeSB5aWVsZGVkIChgU2V0YCAvXG4gKiBTYW1lVmFsdWVaZXJvKS4gVW5pcXVlbmVzcyBpcyBjaGVja2VkIHBlciBlbGVtZW50IGFzIGl0IGlzIGNvbnN1bWVkLlxuICpcbiAqIEBwYXJhbSBzb3VyY2VzIC0gQ29udGFpbmVycyB0byBjb25jYXRlbmF0ZSAobnVsbGlzaCBzb3VyY2VzIGFyZSBza2lwcGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3RpbmN0PFQ+KC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNvdXJjZTxUPltdKTogU2VxdWVuY2U8VD4ge1xuICBjb25zdCBzcmMgPSBzZXF1ZW5jZSguLi5zb3VyY2VzKTtcbiAgcmV0dXJuIHNlcXVlbmNlKHtcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICBjb25zdCBzZWVuID0gbmV3IFNldDxUPigpO1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBzcmMpIHtcbiAgICAgICAgaWYgKHNlZW4uaGFzKHZhbHVlKSkgY29udGludWU7XG4gICAgICAgIHNlZW4uYWRkKHZhbHVlKTtcbiAgICAgICAgeWllbGQgdmFsdWU7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogWWllbGRzIGBzb3VyY2VgLCB0aGVuIGVhY2ggYXBwZW5kZWQgYGl0ZW1gIGluIG9yZGVyIChhcnJheXMgc3ByZWFkIG9uZSBsZXZlbCksXG4gKiBtaXJyb3JpbmcgYEFycmF5LnByb3RvdHlwZS5jb25jYXRgLiBgaXRlbXNgIGFyZSBzY2FsYXIgdmFsdWVzL2FycmF5cywgbm90XG4gKiBjb250YWluZXJzLCBzbyBgc291cmNlYCBzdGF5cyBhIHNpbmdsZSBsZWFkaW5nIGFyZ3VtZW50LlxuICpcbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgbGVhZGluZyBjb250YWluZXIgKG51bGxpc2ggeWllbGRzIGp1c3QgdGhlIGl0ZW1zKS5cbiAqIEBwYXJhbSBpdGVtcyAtIFZhbHVlcyAob3IgYXJyYXlzIG9mIHZhbHVlcykgYXBwZW5kZWQgYWZ0ZXIgdGhlIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmNhdDxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIC4uLml0ZW1zOiByZWFkb25seSAoVCB8IFJlYWRvbmx5QXJyYXk8VD4pW11cbik6IFNlcXVlbmNlPFQ+IHtcbiAgY29uc3Qgc3JjID0gc2VxdWVuY2Uoc291cmNlKTtcbiAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHNyYztcbiAgcmV0dXJuIHNlcXVlbmNlKHtcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICB5aWVsZCogc3JjO1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB5aWVsZCogaXRlbTtcbiAgICAgICAgZWxzZSB5aWVsZCBpdGVtIGFzIFQ7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogWWllbGRzIGF0IG1vc3QgYGNvdW50YCBlbGVtZW50cyBmcm9tIHRoZSBmcm9udCBvZiB0aGUgY29uY2F0ZW5hdGVkIHNvdXJjZXMuXG4gKiBgY291bnRgIGxlYWRzIHNvIHRoZSBzb3VyY2VzIGNhbiBzdGF5IHZhcmlhZGljLlxuICpcbiAqIEBwYXJhbSBjb3VudCAtIE1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHlpZWxkIChgPD0gMGAgeWllbGRzIG5vbmUpLlxuICogQHBhcmFtIHNvdXJjZXMgLSBDb250YWluZXJzIHRvIGNvbmNhdGVuYXRlIChudWxsaXNoIHNvdXJjZXMgYXJlIHNraXBwZWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGFrZTxUPihjb3VudDogbnVtYmVyLCAuLi5zb3VyY2VzOiByZWFkb25seSBTb3VyY2U8VD5bXSk6IFNlcXVlbmNlPFQ+IHtcbiAgaWYgKGNvdW50IDw9IDApIHJldHVybiBlbXB0eVNlcXVlbmNlIGFzIFNlcXVlbmNlPFQ+O1xuICBjb25zdCBzcmMgPSBzZXF1ZW5jZSguLi5zb3VyY2VzKTtcbiAgcmV0dXJuIHNlcXVlbmNlKHtcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICBsZXQgdGFrZW4gPSAwO1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBzcmMpIHtcbiAgICAgICAgeWllbGQgdmFsdWU7XG4gICAgICAgIGlmICgrK3Rha2VuID49IGNvdW50KSByZXR1cm47XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogU3BsaXRzIHRoZSBjb25jYXRlbmF0ZWQgc291cmNlcyBpbnRvIG9uZSBhcnJheSBwZXIgbmFtZWQgcHJlZGljYXRlLiBDb25zdW1lc1xuICogdGhlIGlucHV0IG9uY2UsIHJvdXRpbmcgZWFjaCBlbGVtZW50IHRvIHRoZSBGSVJTVCBwcmVkaWNhdGUgaXQgc2F0aXNmaWVzIChzb1xuICogZ3JvdXBzIGFyZSBkaXNqb2ludCk7IGVsZW1lbnRzIG1hdGNoaW5nIG5vIHByZWRpY2F0ZSBhcmUgZHJvcHBlZC4gVHlwZS1ndWFyZFxuICogcHJlZGljYXRlcyBuYXJyb3cgdGhlaXIgZ3JvdXAncyBlbGVtZW50IHR5cGUgKHNlZSB7QGxpbmsgR3JvdXBWYWx1ZX0pLlxuICogYHByZWRpY2F0ZXNgIGxlYWRzIHNvIHRoZSBzb3VyY2VzIGNhbiBzdGF5IHZhcmlhZGljLlxuICpcbiAqIEB0eXBlUGFyYW0gRyAtIFRoZSBtYXAgb2YgZ3JvdXAgbmFtZSAtPiBwcmVkaWNhdGUuXG4gKiBAcGFyYW0gcHJlZGljYXRlcyAtIE5hbWVkIHByZWRpY2F0ZXM7IGV2YWx1YXRlZCBpbiBkZWNsYXJhdGlvbiBvcmRlci5cbiAqIEBwYXJhbSBzb3VyY2VzIC0gQ29udGFpbmVycyB0byBjb25jYXRlbmF0ZSAobnVsbGlzaCBzb3VyY2VzIGFyZSBza2lwcGVkKS5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIGtleXMsIGVhY2ggYW4gYXJyYXkgb2YgaXRzIGdyb3VwJ3MgZWxlbWVudHMuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgY29uc3QgeyBzdHJpbmdzLCBmbnMgfSA9IGdyb3VwKHsgc3RyaW5nczogaXNTdHJpbmcsIGZuczogaXNGdW5jdGlvbiB9LCB4cyk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncm91cDxULCBHIGV4dGVuZHMgR3JvdXBQcmVkaWNhdGVzPFQ+PihcbiAgcHJlZGljYXRlczogRyxcbiAgLi4uc291cmNlczogcmVhZG9ubHkgU291cmNlPFQ+W11cbik6IHsgW0sgaW4ga2V5b2YgR106IEdyb3VwVmFsdWU8VCwgR1tLXT5bXSB9IHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByZWRpY2F0ZXMpIGFzIChrZXlvZiBHKVtdO1xuICBjb25zdCBidWNrZXRzID0gbmV3IE1hcDxrZXlvZiBHLCBUW10+KGtleXMubWFwKChrZXkpID0+IFtrZXksIFtdXSkpO1xuICBsZXQgaW5kZXggPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNlcXVlbmNlKC4uLnNvdXJjZXMpKSB7XG4gICAgY29uc3QgaSA9IGluZGV4Kys7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKHByZWRpY2F0ZXNba2V5XSEodmFsdWUsIGkpKSB7XG4gICAgICAgIGJ1Y2tldHMuZ2V0KGtleSkhLnB1c2godmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0ge30gYXMgeyBbSyBpbiBrZXlvZiBHXTogR3JvdXBWYWx1ZTxULCBHW0tdPltdIH07XG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICByZXN1bHRba2V5XSA9IGJ1Y2tldHMuZ2V0KGtleSkhIGFzIEdyb3VwVmFsdWU8VCwgR1t0eXBlb2Yga2V5XT5bXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZmluZGAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBDb25zdW1lcyBlbGVtZW50cyB1bnRpbCBhIG1hdGNoLiBBIHR5cGUgZ3VhcmQgbmFycm93cyB0aGUgcmV0dXJuIHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kPFQsIFMgZXh0ZW5kcyBUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTLFxuKTogUyB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBmaW5kPFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBUIHwgdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmQ8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IFQgfCB1bmRlZmluZWQge1xuICBsZXQgaW5kZXggPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNlcXVlbmNlKHNvdXJjZSkpIHtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCsrKSkgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5maW5kTGFzdGAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBDb25zdW1lcyB0aGUgZnVsbCBzb3VyY2UuIEEgdHlwZSBndWFyZCBuYXJyb3dzIHRoZSByZXR1cm4gdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMYXN0PFQsIFMgZXh0ZW5kcyBUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTLFxuKTogUyB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGFzdDxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogVCB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGFzdDxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogVCB8IHVuZGVmaW5lZCB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGxldCBtYXRjaDogVCB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZShzb3VyY2UpKSB7XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgrKykpIG1hdGNoID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIG1hdGNoO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZmluZEluZGV4YCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqIENvbnN1bWVzIGVsZW1lbnRzIHVudGlsIGEgbWF0Y2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kSW5kZXg8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IG51bWJlciB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc2VxdWVuY2Uoc291cmNlKSkge1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4KSkgcmV0dXJuIGluZGV4O1xuICAgIGluZGV4Kys7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZmluZExhc3RJbmRleGAsIG92ZXIgYSBzaW5nbGVcbiAqIHtAbGluayBDb250YWluZXJ9LiBDb25zdW1lcyB0aGUgZnVsbCBzb3VyY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGFzdEluZGV4PFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBudW1iZXIge1xuICBsZXQgaW5kZXggPSAwO1xuICBsZXQgbWF0Y2ggPSAtMTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZShzb3VyY2UpKSB7XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgpKSBtYXRjaCA9IGluZGV4O1xuICAgIGluZGV4Kys7XG4gIH1cbiAgcmV0dXJuIG1hdGNoO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuc29tZWAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBTaG9ydC1jaXJjdWl0cyBvbiB0aGUgZmlyc3QgbWF0Y2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb21lPFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBib29sZWFuIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZShzb3VyY2UpKSBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCsrKSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmV2ZXJ5YCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqIFNob3J0LWNpcmN1aXRzIG9uIHRoZSBmaXJzdCBmYWlsdXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXZlcnk8VCwgUyBleHRlbmRzIFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZhbHVlIGlzIFMsXG4pOiBib29sZWFuO1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZXJ5PFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBib29sZWFuO1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZXJ5PFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBib29sZWFuIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZShzb3VyY2UpKSBpZiAoIXByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgrKykpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqIENvbnN1bWVzIHRoZSBzb3VyY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JFYWNoPFQ+KHNvdXJjZTogU291cmNlPFQ+LCBjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2b2lkKTogdm9pZCB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc2VxdWVuY2Uoc291cmNlKSkgY2FsbGJhY2sodmFsdWUsIGluZGV4KyspO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuYXRgIG92ZXIgdGhlIGNvbmNhdGVuYXRlZCBzb3VyY2VzLlxuICogTm9uLW5lZ2F0aXZlIGluZGljZXMgc2NhbiBsYXppbHk7IG5lZ2F0aXZlIGluZGljZXMgbWF0ZXJpYWxpemUgZmlyc3QuIGBpbmRleGBcbiAqIGxlYWRzIHNvIHRoZSBzb3VyY2VzIGNhbiBzdGF5IHZhcmlhZGljLlxuICpcbiAqIEBwYXJhbSBpbmRleCAtIFplcm8tYmFzZWQgcG9zaXRpb247IG5lZ2F0aXZlIGNvdW50cyBmcm9tIHRoZSBlbmQuXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUgKG51bGxpc2ggc291cmNlcyBhcmUgc2tpcHBlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdDxUPihpbmRleDogbnVtYmVyLCAuLi5zb3VyY2VzOiByZWFkb25seSBTb3VyY2U8VD5bXSk6IFQgfCB1bmRlZmluZWQge1xuICBjb25zdCBzcmMgPSBzZXF1ZW5jZSguLi5zb3VyY2VzKTtcbiAgaWYgKGluZGV4IDwgMCkgcmV0dXJuIHRvQXJyYXkoc3JjKS5hdChpbmRleCk7XG4gIGxldCBpID0gMDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzcmMpIHtcbiAgICBpZiAoaSsrID09PSBpbmRleCkgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b09uZU9yTWFueTxUPihpbnB1dDogVCB8IE9uZU9yTWFueTxUPik6IE9uZU9yTWFueTxUPiB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGlucHV0KSA/IGlucHV0IDogW2lucHV0XTtcbn1cblxuLyoqXG4gKiBNYXRlcmlhbGl6ZXMgdGhlIGNvbmNhdGVuYXRlZCBzb3VyY2VzIGludG8gYSBuZXcgYXJyYXkuIENvbnN1bWVzIHNpbmdsZS1wYXNzXG4gKiBzb3VyY2VzLlxuICpcbiAqIEBwYXJhbSBzb3VyY2VzIC0gQ29udGFpbmVycyB0byBjb25jYXRlbmF0ZSAobnVsbGlzaCBzb3VyY2VzIGFyZSBza2lwcGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQXJyYXk8VD4oLi4uc291cmNlczogcmVhZG9ubHkgU291cmNlPFQ+W10pOiByZWFkb25seSBUW10ge1xuICByZXR1cm4gWy4uLnNlcXVlbmNlKC4uLnNvdXJjZXMpXTtcbn1cblxuLyoqXG4gKiBMYXp5IGl0ZXJhYmxlIHNlcXVlbmNlIHdpdGggYEFycmF5YC1jb21wYXRpYmxlIHRyYW5zZm9ybXMgYW5kIHRlcm1pbmFsXG4gKiBtZXRob2RzLiBTaW5nbGUtcGFzcyBieSBkZWZhdWx0OyBjYWxsIHtAbGluayBTZXF1ZW5jZUltcGwuY2FjaGV9IHRvIHJldGFpblxuICogcHVsbGVkIHZhbHVlcyBmb3IgcmUtaXRlcmF0aW9uLiBCdWlsdCBmb3IgZ2VuZXJhdG9ycyBhbmQgb3RoZXIgc291cmNlcyB3aGVyZVxuICogYSBzZWNvbmQgcGFzcyBpcyBub3QgZ3VhcmFudGVlZC5cbiAqXG4gKiBUaGUgbWV0aG9kcyBmb3J3YXJkIHRvIHRoZSBzdGFuZGFsb25lIGZ1bmN0aW9ucyBvZiB0aGUgc2FtZSBuYW1lIC0gc2VlIGVhY2hcbiAqIG1ldGhvZCdzIGBAc2VlYCAtIHNvIHRoZSBmcmVlLWZ1bmN0aW9uIGFuZCBjaGFpbmVkIHN0eWxlcyBzaGFyZSBvbmUgaW1wbC5cbiAqL1xuY2xhc3MgU2VxdWVuY2VJbXBsPFQ+IHtcbiAgcHJpdmF0ZSBpdGVyYXRvcj86IEl0ZXJhdG9yPFQ+O1xuICBwcml2YXRlIGV4aGF1c3RlZDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNvdXJjZTogSXRlcmFibGU8VD4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBidWZmZXI6IFRbXSB8IHVuZGVmaW5lZCxcbiAgICBzdGF0ZTogeyByZWFkb25seSBleGhhdXN0ZWQ/OiBib29sZWFuIH0gPSB7fSxcbiAgKSB7XG4gICAgdGhpcy5leGhhdXN0ZWQgPSBzdGF0ZS5leGhhdXN0ZWQgPz8gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGdldCBjYWNoaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmJ1ZmZlciAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIEFkdmFuY2UgdGhlIHVuZGVybHlpbmcgc291cmNlIG9uY2UsIGNyZWF0aW5nIHRoZSBpdGVyYXRvciBvbiBmaXJzdCB1c2UuICovXG4gIHByaXZhdGUgcHVsbCgpOiBJdGVyYXRvclJlc3VsdDxUPiB7XG4gICAgdGhpcy5pdGVyYXRvciA/Pz0gdGhpcy5zb3VyY2VbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgIHJldHVybiB0aGlzLml0ZXJhdG9yLm5leHQoKTtcbiAgfVxuXG4gICpbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYXRvcjxUPiB7XG4gICAgaWYgKCF0aGlzLmNhY2hpbmcpIHtcbiAgICAgIGlmICh0aGlzLmV4aGF1c3RlZCkgcmV0dXJuO1xuICAgICAgZm9yIChsZXQgbmV4dCA9IHRoaXMucHVsbCgpOyAhbmV4dC5kb25lOyBuZXh0ID0gdGhpcy5wdWxsKCkpIHtcbiAgICAgICAgeWllbGQgbmV4dC52YWx1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXhoYXVzdGVkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2FjaGVkOiBpdGVyYXRlIGxpa2UgYSBsaXN0LiBBbHdheXMgcmVwbGF5IHRoZSBidWZmZXIgZnJvbSB0aGUgc3RhcnQsXG4gICAgICAvLyBleHRlbmRpbmcgaXQgZnJvbSB0aGUgc291cmNlIG9uIGRlbWFuZCB1bnRpbCBleGhhdXN0ZWQuIEEgYnJva2VuIGxvb3BcbiAgICAgIC8vIGxlYXZlcyB0aGUgYnVmZmVyIGludGFjdCwgc28gdGhlIG5leHQgaXRlcmF0aW9uIHN0YXJ0cyBvdmVyIGZyb20gdGhlXG4gICAgICAvLyBiZWdpbm5pbmcuXG4gICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlciE7XG4gICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBpZiAoaW5kZXggPCBidWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgeWllbGQgYnVmZmVyW2luZGV4KytdITtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5leGhhdXN0ZWQpIHJldHVybjtcbiAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMucHVsbCgpO1xuICAgICAgICBpZiAobmV4dC5kb25lKSB7XG4gICAgICAgICAgdGhpcy5leGhhdXN0ZWQgPSB0cnVlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBidWZmZXIucHVzaChuZXh0LnZhbHVlKTtcbiAgICAgICAgeWllbGQgbmV4dC52YWx1ZTtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgbWFwfSAqL1xuICBtYXA8VT4oY2FsbGJhY2s6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gVSk6IFNlcXVlbmNlPFU+IHtcbiAgICByZXR1cm4gbWFwKHRoaXMsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmaWx0ZXJ9ICovXG4gIGZpbHRlcjxTIGV4dGVuZHMgVD4ocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZhbHVlIGlzIFMpOiBTZXF1ZW5jZTxTPjtcbiAgZmlsdGVyKHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogU2VxdWVuY2U8VD47XG4gIGZpbHRlcihwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gZmlsdGVyKHRoaXMsIHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgbm9uTnVsbH0gKi9cbiAgbm9uTnVsbCgpOiBTZXF1ZW5jZTxOb25OdWxsYWJsZTxUPj4ge1xuICAgIHJldHVybiBub25OdWxsKHRoaXMpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGZsYXRNYXB9ICovXG4gIGZsYXRNYXA8VT4oY2FsbGJhY2s6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gVSB8IFJlYWRvbmx5QXJyYXk8VT4pOiBTZXF1ZW5jZTxVPiB7XG4gICAgcmV0dXJuIGZsYXRNYXAodGhpcywgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGZsYXR9ICovXG4gIGZsYXQoZGVwdGggPSAxKTogU2VxdWVuY2U8VD4ge1xuICAgIHJldHVybiBmbGF0KGRlcHRoLCB0aGlzKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBkaXN0aW5jdH0gKi9cbiAgZGlzdGluY3QoKTogU2VxdWVuY2U8VD4ge1xuICAgIHJldHVybiBkaXN0aW5jdCh0aGlzKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBjb25jYXR9ICovXG4gIGNvbmNhdCguLi5pdGVtczogcmVhZG9ubHkgKFQgfCBSZWFkb25seUFycmF5PFQ+KVtdKTogU2VxdWVuY2U8VD4ge1xuICAgIHJldHVybiBjb25jYXQodGhpcywgLi4uaXRlbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExhemlseSB5aWVsZHMgdGhpcyBzZXF1ZW5jZSBmb2xsb3dlZCBieSBlYWNoIGl0ZXJhYmxlIGBzb3VyY2VgIGluIG9yZGVyLlxuICAgKiBMaWtlIHtAbGluayBjb25jYXR9LCBidXQgZm9yIGl0ZXJhYmxlIHNvdXJjZXMgKGdlbmVyYXRvcnMsIG90aGVyIHNlcXVlbmNlcyxcbiAgICogYFNldGAsIGBNYXBgLCBldGMuKSByYXRoZXIgdGhhbiBzY2FsYXIgdmFsdWVzIG9yIGFycmF5cy4gQSB7QGxpbmsgTWFwfVxuICAgKiBzb3VyY2UgY29udHJpYnV0ZXMgaXRzIHZhbHVlcy5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgc2VxdWVuY2V9XG4gICAqL1xuICBqb2luKC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNlcXVlbmNlU291cmNlPFQ+W10pOiBTZXF1ZW5jZTxUPiB7XG4gICAgY29uc3Qgc291cmNlSXRlcmFibGVzID0gc2VxdWVuY2VTb3VyY2VzKHRoaXMsIC4uLnNvdXJjZXMpO1xuICAgIHJldHVybiBzZXF1ZW5jZVNvdXJjZXMubGVuZ3RoID09PSAwID8gdGhpcyA6IHNlcXVlbmNlKC4uLnNvdXJjZUl0ZXJhYmxlcyk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgdGFrZX0gKi9cbiAgdGFrZShjb3VudDogbnVtYmVyKTogU2VxdWVuY2U8VD4ge1xuICAgIHJldHVybiB0YWtlKGNvdW50LCB0aGlzKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBncm91cH0gKi9cbiAgZ3JvdXA8RyBleHRlbmRzIEdyb3VwUHJlZGljYXRlczxUPj4ocHJlZGljYXRlczogRyk6IHsgW0sgaW4ga2V5b2YgR106IEdyb3VwVmFsdWU8VCwgR1tLXT5bXSB9IHtcbiAgICByZXR1cm4gZ3JvdXAocHJlZGljYXRlcywgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNhY2hlZCwgcmUtaXRlcmFibGUgdmlldyBvZiB0aGlzIHNlcXVlbmNlLiBBbiBhbHJlYWR5LWNhY2hpbmdcbiAgICogc2VxdWVuY2UgcmV0dXJucyBpdHNlbGY7IG90aGVyd2lzZSB0aGlzIG9uZS1wYXNzIHNlcXVlbmNlIGlzIHdyYXBwZWQgaW4gYVxuICAgKiBuZXcgaW5zdGFuY2UgdGhhdCByZXRhaW5zIHB1bGxlZCB2YWx1ZXMuIEl0ZXJhdGUgdGhlIHJldHVybmVkIGluc3RhbmNlLCBub3RcbiAgICogdGhlIG9yaWdpbmFsLCB0byBhdm9pZCBjb21wZXRpbmcgZm9yIHRoZSBzYW1lIHNpbmdsZS1wYXNzIHNvdXJjZS5cbiAgICovXG4gIGNhY2hlKCk6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5jYWNoaW5nID8gdGhpcyA6IG5ldyBTZXF1ZW5jZUltcGwodGhpcywgW10pO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGZpbmR9ICovXG4gIGZpbmQ8UyBleHRlbmRzIFQ+KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTKTogUyB8IHVuZGVmaW5lZDtcbiAgZmluZChwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IFQgfCB1bmRlZmluZWQ7XG4gIGZpbmQocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gZmluZCh0aGlzLCBwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGZpbmRMYXN0fSAqL1xuICBmaW5kTGFzdDxTIGV4dGVuZHMgVD4ocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZhbHVlIGlzIFMpOiBTIHwgdW5kZWZpbmVkO1xuICBmaW5kTGFzdChwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IFQgfCB1bmRlZmluZWQ7XG4gIGZpbmRMYXN0KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGZpbmRMYXN0KHRoaXMsIHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZmluZEluZGV4fSAqL1xuICBmaW5kSW5kZXgocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIHJldHVybiBmaW5kSW5kZXgodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmaW5kTGFzdEluZGV4fSAqL1xuICBmaW5kTGFzdEluZGV4KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZmluZExhc3RJbmRleCh0aGlzLCBwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIHNvbWV9ICovXG4gIHNvbWUocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gc29tZSh0aGlzLCBwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGV2ZXJ5fSAodGhlIGBTIGV4dGVuZHMgVGAgb3ZlcmxvYWQgbmFycm93cyBhdCBjb21waWxlIHRpbWUgb25seSkuICovXG4gIGV2ZXJ5PFMgZXh0ZW5kcyBUPihwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdmFsdWUgaXMgUyk6IHRoaXMgaXMgU2VxdWVuY2U8Uz47XG4gIGV2ZXJ5KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogYm9vbGVhbjtcbiAgZXZlcnkocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gZXZlcnkodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmb3JFYWNofSAqL1xuICBmb3JFYWNoKGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBmb3JFYWNoKHRoaXMsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBhdH0gKi9cbiAgYXQoaW5kZXg6IG51bWJlcik6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBhdChpbmRleCwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogTWF0ZXJpYWxpemUgdGhlIHNlcXVlbmNlIGludG8gYSBuZXcgYXJyYXkuIENvbnN1bWVzIGEgc2luZ2xlLXBhc3Mgc291cmNlOyBhXG4gICAqIGNhY2hlZCwgZXhoYXVzdGVkIHNlcXVlbmNlIGNvcGllcyBpdHMgYnVmZmVyIGRpcmVjdGx5LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayB0b0FycmF5fVxuICAgKi9cbiAgdG9BcnJheSgpOiByZWFkb25seSBUW10ge1xuICAgIGlmICh0aGlzLmNhY2hpbmcgJiYgdGhpcy5leGhhdXN0ZWQpIHJldHVybiBbLi4udGhpcy5idWZmZXIhXTtcbiAgICByZXR1cm4gdG9BcnJheSh0aGlzKTtcbiAgfVxufVxuXG4vKiogU2hhcmVkIGVtcHR5IHNlcXVlbmNlIHNpbmdsZXRvbiwgcmV1c2FibGUgZm9yIGFueSBlbGVtZW50IHR5cGUuICovXG5jb25zdCBlbXB0eVNlcXVlbmNlOiBTZXF1ZW5jZTxuZXZlcj4gPSBuZXcgU2VxdWVuY2VJbXBsKFtdLCB1bmRlZmluZWQsIHtcbiAgZXhoYXVzdGVkOiB0cnVlLFxufSk7XG5cbi8qKlxuICogV3JhcCBvbmUgb3IgbW9yZSBpdGVyYWJsZSBgc291cmNlc2AgaW4gYSBzaW5nbGUgbGF6eSB7QGxpbmsgU2VxdWVuY2V9LFxuICogaXRlcmF0ZWQgaW4gb3JkZXIuIGBudWxsYC9gdW5kZWZpbmVkYCBzb3VyY2VzIGFyZSBza2lwcGVkOyB3aGVuIG5vdGhpbmdcbiAqIHJlbWFpbnMgKGV2ZXJ5IHNvdXJjZSBvbWl0dGVkLCBgbnVsbGAsIGB1bmRlZmluZWRgLCBvciBhbiBlbXB0eSBhcnJheSAvXG4gKiBgU2V0YCAvIGBNYXBgKSwge0BsaW5rIGVtcHR5U2VxdWVuY2V9IGlzIHJldHVybmVkLiBUaGUgcmVzdWx0IGlzIHNpbmdsZS1wYXNzXG4gKiAtIGNhbGwgYC5jYWNoZSgpYCB0byBtYWtlIGl0IHJlLWl0ZXJhYmxlLlxuICpcbiAqIEEge0BsaW5rIE1hcH0gc291cmNlIGNvbnRyaWJ1dGVzIGl0cyB2YWx1ZXMgKHNlZSB7QGxpbmsgdmFsdWVzfSksIGNvbnNpc3RlbnRcbiAqIHdpdGgge0BsaW5rIENvbGxlY3Rpb259J3MgdmFsdWUtdHlwZWQgYFRgLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIEVsZW1lbnQgdHlwZSBvZiB0aGUgc2VxdWVuY2UuXG4gKiBAcGFyYW0gc291cmNlcyAtIEl0ZXJhYmxlcyB0byBjb25jYXRlbmF0ZSwgaW4gb3JkZXIgKGBNYXBgIHNvdXJjZXMgdXNlIHZhbHVlcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXF1ZW5jZTxUPiguLi5zb3VyY2VzOiByZWFkb25seSBTZXF1ZW5jZVNvdXJjZTxUPltdKTogU2VxdWVuY2U8VD4ge1xuICAvLyBTa2lwIG51bGxpc2ggc291cmNlcyBhbmQga25vd24tZW1wdHkgY29sbGVjdGlvbnM7IG5vcm1hbGl6ZSB0aGUgcmVzdCB0b1xuICAvLyB0aGVpciB2YWx1ZXMgc28gYSBNYXAgY29udHJpYnV0ZXMgdmFsdWVzIHJhdGhlciB0aGFuIFtrZXksIHZhbHVlXSBlbnRyaWVzLlxuICBjb25zdCBzb3VyY2VJdGVyYWJsZXMgPSBzZXF1ZW5jZVNvdXJjZXMoLi4uc291cmNlcyk7XG4gIGlmIChzb3VyY2VJdGVyYWJsZXMubGVuZ3RoID09PSAwKSByZXR1cm4gZW1wdHlTZXF1ZW5jZSBhcyBTZXF1ZW5jZTxUPjtcbiAgLy8gUmV1c2UgYW4gZXhpc3Rpbmcgc2VxdWVuY2UgYXMtaXMgcmF0aGVyIHRoYW4gcmUtd3JhcHBpbmcgaXQuXG4gIGlmIChzb3VyY2VJdGVyYWJsZXMubGVuZ3RoID09PSAxKSB7XG4gICAgY29uc3Qgb25seSA9IHNvdXJjZUl0ZXJhYmxlc1swXSE7XG4gICAgcmV0dXJuIG9ubHkgaW5zdGFuY2VvZiBTZXF1ZW5jZUltcGwgPyAob25seSBhcyBTZXF1ZW5jZTxUPikgOiBuZXcgU2VxdWVuY2VJbXBsKG9ubHksIHVuZGVmaW5lZCk7XG4gIH1cbiAgcmV0dXJuIG5ldyBTZXF1ZW5jZUltcGwoXG4gICAge1xuICAgICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VJdGVyYWJsZXMpIHlpZWxkKiBzb3VyY2U7XG4gICAgICB9LFxuICAgIH0sXG4gICAgdW5kZWZpbmVkLFxuICApO1xufVxuXG4vKipcbiAqIEZsYXR0ZW5zIGEgbWl4IG9mIHNpbmdsZSBpdGVtcyBhbmQgaXRlcmFibGVzIGludG8gb25lIGxhenkge0BsaW5rIEdlbmVyYXRvcn0uXG4gKlxuICogQXJndW1lbnRzIGFyZSBlbWl0dGVkIGluIG9yZGVyOiBgbnVsbGAvYHVuZGVmaW5lZGAgYXJlIHNraXBwZWQsIG5vbi1zdHJpbmdcbiAqIGl0ZXJhYmxlcyAocGVyIHtAbGluayBpc0NvbnRhaW5lcn0pIGFyZSB5aWVsZGVkIGVsZW1lbnQtYnktZWxlbWVudCwgYW5kXG4gKiBhbnl0aGluZyBlbHNlIChpbmNsdWRpbmcgc3RyaW5ncykgaXMgeWllbGRlZCBhcyBhIHNpbmdsZSBpdGVtLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIEVsZW1lbnQgdHlwZSBwcm9kdWNlZCBieSB0aGUgZ2VuZXJhdG9yLlxuICogQHBhcmFtIGl0ZW1zIC0gSXRlbXMgYW5kL29yIGl0ZXJhYmxlcyB0byBmbGF0dGVuLCBpbiBvcmRlci5cbiAqIEByZXR1cm5zIEEgZ2VuZXJhdG9yIG92ZXIgdGhlIGZsYXR0ZW5lZCBlbGVtZW50cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uKiBnZW5lcmF0b3I8VD4oXG4gIC4uLml0ZW1zOiByZWFkb25seSAoVCB8IEl0ZXJhYmxlPFQ+IHwgbnVsbCB8IHVuZGVmaW5lZClbXVxuKTogR2VuZXJhdG9yPFQ+IHtcbiAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgaWYgKGl0ZW0gPT09IG51bGwgfHwgaXRlbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2UgaWYgKGlzQ29udGFpbmVyKGl0ZW0pKSB7XG4gICAgICB5aWVsZCogaXRlbTtcbiAgICB9IGVsc2Uge1xuICAgICAgeWllbGQgaXRlbTtcbiAgICB9XG4gIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBPYmplY3QgdmFsdWUgZ3VhcmRzLCBjb2VyY2lvbnMsIGFuZCBzdHJ1Y3R1cmFsIGVxdWFsaXR5XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIE1pbmltYWwgc2hhcGUgZm9yIG9iamVjdHMgdGhhdCBleHBvc2UgYW4gb3B0aW9uYWwgYG5hbWVgIChlLmcuIEFwcEtpdCBwbHVnaW5zKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmFtZUxpa2Uge1xuICBuYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBOb25GdW5jdGlvbktleXM8VD4gPSB7XG4gIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgPyBuZXZlciA6IEs7XG59W2tleW9mIFRdO1xuXG4vKipcbiAqIE5hcnJvdyBgdmFsdWVgIHRvIGEgcGxhaW4gKG5vbi1hcnJheSkgb2JqZWN0LiBVc2UgYXMgYSB0eXBlIGd1YXJkXG4gKiBiZWZvcmUgaW5kZXhpbmcgaW50byAvIG11dGF0aW5nIHBhcnNlZCBKU09OIHNvIHRoZSBhY2Nlc3MgaXNcbiAqIHR5cGUtc2FmZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogaWYgKGlzUmVjb3JkKHBhcnNlZCkpIHBhcnNlZC5mb28gPSAxO1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZWNvcmQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG4vKiogQSBKU09OIHNjYWxhci4gYHVuZGVmaW5lZGAgaXMgZGVsaWJlcmF0ZWx5IGFic2VudCAtIGBKU09OLnN0cmluZ2lmeWAgZHJvcHMgaXQuICovXG5leHBvcnQgdHlwZSBTZXJpYWxpemFibGVQcmltaXRpdmUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbDtcblxuLyoqXG4gKiBBbnkgdmFsdWUgdGhhdCBzdXJ2aXZlcyBhIGBKU09OLnN0cmluZ2lmeWAvYEpTT04ucGFyc2VgIHJvdW5kIHRyaXAgdW5jaGFuZ2VkLlxuICpcbiAqIFVzZSBpdCBpbnN0ZWFkIG9mIGB1bmtub3duYCBvbiBhIGJvdW5kYXJ5IHRoYXQgd2lsbCBzZXJpYWxpemUgaXRzIGlucHV0IC0gYVxuICogbWVzc2FnZSBwYXlsb2FkLCBhIGNhY2hlIGVudHJ5LCBhIGNvbmZpZyBibG9iIHdyaXR0ZW4gdG8gZGlzayAtIHNvIGEgYERhdGVgLFxuICogYSBgTWFwYCwgb3IgYSBjbGFzcyBpbnN0YW5jZSBpcyBhIGNvbXBpbGUgZXJyb3IgYXQgdGhlIGNhbGwgc2l0ZSByYXRoZXIgdGhhbiBhXG4gKiByZWNlaXZlciBxdWlldGx5IGdldHRpbmcgYSBzdHJpbmcgb3IgYHt9YC4ge0BsaW5rIGlzU2VyaWFsaXphYmxlVmFsdWV9IGlzIHRoZVxuICogcnVudGltZSBoYWxmLCBmb3IgaW5wdXQgdGhlIGNvbXBpbGVyIGNhbm5vdCB2b3VjaCBmb3IuXG4gKi9cbmV4cG9ydCB0eXBlIFNlcmlhbGl6YWJsZVZhbHVlID1cbiAgU2VyaWFsaXphYmxlUHJpbWl0aXZlIHwgU2VyaWFsaXphYmxlVmFsdWVbXSB8IHsgW2tleTogc3RyaW5nXTogU2VyaWFsaXphYmxlVmFsdWUgfTtcblxuLyoqXG4gKiBUcnVlIHdoZW4gYHZhbHVlYCBzdXJ2aXZlcyBhIEpTT04gcm91bmQgdHJpcCB3aXRoIG5vIGxvc3MgYW5kIG5vIGNvZXJjaW9uLlxuICpcbiAqIFN0cmljdGVyIHRoYW4gXCJgSlNPTi5zdHJpbmdpZnlgIGRpZCBub3QgdGhyb3dcIiwgYmVjYXVzZSB0aGF0IHN1Y2NlZWRzIHdoaWxlXG4gKiBzaWxlbnRseSBDSEFOR0lORyB0aGUgdmFsdWU6IGEgYERhdGVgIGJlY29tZXMgYSBzdHJpbmcsIGBOYU5gIGFuZCBgSW5maW5pdHlgXG4gKiBiZWNvbWUgYG51bGxgLCBhIGBNYXBgIGJlY29tZXMgYHt9YCwgYW5kIGB1bmRlZmluZWRgIGRpc2FwcGVhcnMgZnJvbSBhbiBvYmplY3RcbiAqIG9yIHR1cm5zIGludG8gYG51bGxgIGluc2lkZSBhbiBhcnJheS4gRWFjaCBvZiB0aG9zZSByZWFjaGVzIHRoZSBmYXIgc2lkZSBhc1xuICogc29tZXRoaW5nIG90aGVyIHRoYW4gd2hhdCB3YXMgc2VudCwgc28gYWxsIG9mIHRoZW0gYXJlIHJlamVjdGVkIGhlcmUuXG4gKlxuICogUmVqZWN0ZWQ6IG5vbi1maW5pdGUgbnVtYmVycywgYHVuZGVmaW5lZGAsIGZ1bmN0aW9ucywgc3ltYm9scywgYmlnaW50cywgY2xhc3NcbiAqIGluc3RhbmNlcyBhbmQgYW55dGhpbmcgZWxzZSB3aXRoIGEgcHJvdG90eXBlIG90aGVyIHRoYW4gYE9iamVjdC5wcm90b3R5cGVgIG9yXG4gKiBgbnVsbGAgKGBEYXRlYCwgYE1hcGAsIGBTZXRgLCBgUmVnRXhwYCwgYEJ1ZmZlcmApLCBhbmQgYW55IG9iamVjdCBncmFwaFxuICogY29udGFpbmluZyBhIGN5Y2xlLiBBY2NlcHRlZDogc3RyaW5ncywgYm9vbGVhbnMsIGBudWxsYCwgZmluaXRlIG51bWJlcnMsIHBsYWluXG4gKiBvYmplY3RzLCBhcnJheXMsIGFuZCBuZXN0aW5ncyBvZiB0aG9zZS5cbiAqXG4gKiBOYXJyb3dzIHRvIHtAbGluayBTZXJpYWxpemFibGVWYWx1ZX0gcmF0aGVyIHRoYW4gYXNzZXJ0aW5nLCBzbyBpdCBhbHNvIHNlcnZlc1xuICogYXMgdGhlIHZhbGlkYXRvciBmb3IgdW50cnVzdGVkIGlucHV0IC0gYSByZXF1ZXN0IGJvZHksIGEgZGVjb2RlZCBub3RpZmljYXRpb25cbiAqIHBheWxvYWQgLSB3aGVyZSB0aGUgYW5zd2VyIHNob3VsZCBiZSBhIDQwMCBhbmQgbm90IGEgdGhyb3cuIE5ldmVyIHRocm93cy5cbiAqXG4gKiBEaXN0aW5jdCBmcm9tIHtAbGluayBkZWVwRXF1YWx9J3Mgbm90aW9uIG9mIGNvbXBhcmFibGU6IHRoYXQgb25lIEhBTkRMRVNcbiAqIGBEYXRlYC9gTWFwYC9gU2V0YCBzdHJ1Y3R1cmFsbHksIHdoaWxlIHRoaXMgb25lIHJlamVjdHMgdGhlbSBwcmVjaXNlbHkgYmVjYXVzZVxuICogSlNPTiBjYW5ub3QgY2FycnkgdGhlbS5cbiAqXG4gKiBAcGFyYW0gYW5jZXN0b3JzIEN5Y2xlLWRldGVjdGlvbiBzZXQgZm9yIHRoZSByZWN1cnNpdmUgd2Fsay4gSW50ZXJuYWw7IGNhbGxlcnNcbiAqICAgcGFzcyBvbmUgdmFsdWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGlzU2VyaWFsaXphYmxlVmFsdWUoeyBhOiBbMSwgXCJ4XCIsIG51bGxdIH0pOyAvLyB0cnVlXG4gKiBpc1NlcmlhbGl6YWJsZVZhbHVlKHsgYXQ6IG5ldyBEYXRlKCkgfSk7ICAgIC8vIGZhbHNlIC0gd291bGQgYmVjb21lIGEgc3RyaW5nXG4gKiBpc1NlcmlhbGl6YWJsZVZhbHVlKE51bWJlci5OYU4pOyAgICAgICAgICAgIC8vIGZhbHNlIC0gd291bGQgYmVjb21lIG51bGxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2VyaWFsaXphYmxlVmFsdWUoXG4gIHZhbHVlOiB1bmtub3duLFxuICBhbmNlc3RvcnM6IFNldDxvYmplY3Q+ID0gbmV3IFNldCgpLFxuKTogdmFsdWUgaXMgU2VyaWFsaXphYmxlVmFsdWUge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiB0cnVlO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHZhbHVlKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgcHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIHByb3RvdHlwZSAhPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoYW5jZXN0b3JzLmhhcyh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblxuICBhbmNlc3RvcnMuYWRkKHZhbHVlKTtcbiAgY29uc3QgdmFsaWQgPSBBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgID8gdmFsdWUuZXZlcnkoKGVudHJ5KSA9PiBpc1NlcmlhbGl6YWJsZVZhbHVlKGVudHJ5LCBhbmNlc3RvcnMpKVxuICAgIDogT2JqZWN0LnZhbHVlcyh2YWx1ZSkuZXZlcnkoKGVudHJ5KSA9PiBpc1NlcmlhbGl6YWJsZVZhbHVlKGVudHJ5LCBhbmNlc3RvcnMpKTtcbiAgYW5jZXN0b3JzLmRlbGV0ZSh2YWx1ZSk7XG4gIHJldHVybiB2YWxpZDtcbn1cblxuLyoqXG4gKiBDYW5vbmljYWwgc3RyaW5nIGZvciBhIHN0cnVjdHVyZWQgdmFsdWUsIGZvciBkZXJpdmluZyBhIFNUQUJMRSBJREVOVElUWSBmcm9tXG4gKiBpdCAtIGFuIGFkdmlzb3J5LWxvY2sgaWQsIGEgY2hhbm5lbCBuYW1lLCBhIGNhY2hlIGtleS5cbiAqXG4gKiBUaGUgZ3VhcmFudGVlIGlzIHR3by13YXksIHdoaWNoIGlzIHdoYXQgbWFrZXMgaXQgc2FmZSB0byBoYXNoOiB2YWx1ZXMgdGhhdFxuICogc2hvdWxkIHNoYXJlIGFuIGlkZW50aXR5IHByb2R1Y2UgdGhlIHNhbWUgc3RyaW5nIChvYmplY3Qga2V5IG9yZGVyIGRvZXMgbm90XG4gKiBtYXR0ZXIpLCBhbmQgdmFsdWVzIHRoYXQgc2hvdWxkIG5vdCBhcmUgbmV2ZXIgY29uZmxhdGVkLiBFdmVyeSB0b2tlbiBjYXJyaWVzXG4gKiBpdHMgdHlwZSwgc28gYDFgIGFuZCBgXCIxXCJgIGRpZmZlcjsgYSBzdHJpbmcgY2FycmllcyBpdHMgbGVuZ3RoLCBzb1xuICogYFtcImFcIiwgXCJiY1wiXWAgYW5kIGBbXCJhYlwiLCBcImNcIl1gIGRpZmZlcjsgYXJyYXlzIGtlZXAgb3JkZXIgd2hpbGUgb2JqZWN0IGtleXNcbiAqIGFyZSBzb3J0ZWQuXG4gKlxuICogYEpTT04uc3RyaW5naWZ5YCBjYW5ub3QgZG8gdGhpcyBqb2IgLSBrZXkgb3JkZXIgbGVha3MgaW4sIGB1bmRlZmluZWRgIHZhbmlzaGVzLFxuICogYDFgIGFuZCBgXCIxXCJgIGNvbGxpZGUgYWZ0ZXIgcXVvdGluZyBpcyBzdHJpcHBlZCwgYW5kIGEgY3ljbGUgdGhyb3dzIGFcbiAqIGBUeXBlRXJyb3JgIG5hbWluZyBuZWl0aGVyIHRoZSB2YWx1ZSBub3IgdGhlIGNhbGxlcidzIGludGVudC5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgc3RyaWN0IHdoZXJlIGEgc2lsZW50IGFuc3dlciB3b3VsZCBiZSBhIFdST05HIGlkZW50aXR5IHJhdGhlclxuICogdGhhbiBhIG1pc3Npbmcgb25lLCBzaW5jZSB0d28gY2FsbGVycyBkaXNhZ3JlZWluZyBhYm91dCBhIGxvY2sgb3IgYSBjaGFubmVsIGlzXG4gKiBpbnZpc2libGUgdW50aWwgaXQgY29ycnVwdHMgc29tZXRoaW5nLiBUaHJvd3MgYFR5cGVFcnJvcmAgb24gYSBjeWNsZSwgb24gYVxuICogbm9uLWZpbml0ZSBudW1iZXIgKGBOYU5gIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYsIHNvIGl0IGNhbm5vdCBoYXZlIGEgc3RhYmxlXG4gKiBpZGVudGl0eSksIGFuZCBvbiBhIGBmdW5jdGlvbmAgb3IgYHN5bWJvbGAgKG5vIG1lYW5pbmdmdWwgdmFsdWUgaWRlbnRpdHkpLlxuICogYHVuZGVmaW5lZGAgYW5kIGBudWxsYCBhcmUgYWNjZXB0ZWQgYXMgZGlzdGluY3QgdG9rZW5zLlxuICpcbiAqIGBEYXRlYCBpcyBjYW5vbmljYWxpemVkIGJ5IGluc3RhbnQsIHVubGlrZSB0aGUgaGFzaCBjYW5vbmljYWxpemVyIGluXG4gKiBgLi9oYXNoLnRzYCwgd2hpY2ggZm9sZHMgZXZlcnkgYERhdGVgIG9udG8gb25lIHRva2VuLiBQcmVmZXIgdGhpcyBmdW5jdGlvbiB3aGVuXG4gKiBkaXN0aW5jdG5lc3MgaXMgYSBjb3JyZWN0bmVzcyByZXF1aXJlbWVudDsgcHJlZmVyIGBoYXNoLmZudkhhc2hgIHdoZW4gYSBzaG9ydCxcbiAqIGNvbGxpc2lvbi10b2xlcmFudCBkaWdlc3QgaXMgZW5vdWdoLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjYW5vbmljYWxpemUuXG4gKiBAcGFyYW0gc2VlbiAtIEN5Y2xlLWRldGVjdGlvbiBzZXQgZm9yIHRoZSByZWN1cnNpdmUgd2Fsay4gSW50ZXJuYWw7IGNhbGxlcnNcbiAqICAgcGFzcyBvbmUgdmFsdWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIHRvU3RhYmxlS2V5KHsgYTogMSwgYjogMiB9KSA9PT0gdG9TdGFibGVLZXkoeyBiOiAyLCBhOiAxIH0pOyAvLyB0cnVlXG4gKiB0b1N0YWJsZUtleSgxKSAhPT0gdG9TdGFibGVLZXkoXCIxXCIpOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1N0YWJsZUtleSh2YWx1ZTogdW5rbm93biwgc2VlbjogU2V0PG9iamVjdD4gPSBuZXcgU2V0KCkpOiBzdHJpbmcge1xuICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiBcIm51bGxcIjtcblxuICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIC8vIExlbmd0aC1wcmVmaXhlZCBzbyBjb25jYXRlbmF0ZWQgbmVpZ2hib3VycyBjYW5ub3QgYmUgcmUtc3BsaXRcbiAgICAgIC8vIGRpZmZlcmVudGx5OiBgW1wiYVwiLFwiYmNcIl1gIGFuZCBgW1wiYWJcIixcImNcIl1gIG11c3Qgbm90IGFncmVlLlxuICAgICAgcmV0dXJuIGBzdHJpbmc6JHt2YWx1ZS5sZW5ndGh9OiR7dmFsdWV9YDtcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgcmV0dXJuIGBib29sZWFuOiR7dmFsdWV9YDtcbiAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgICByZXR1cm4gYGJpZ2ludDoke3ZhbHVlfWA7XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3RhYmxlIGtleXMgcmVxdWlyZSBmaW5pdGUgbnVtYmVyc1wiKTtcbiAgICAgIC8vIGAtMCA9PT0gMGAgYnV0IHRoZXkgc3RyaW5naWZ5IGRpZmZlcmVudGx5LCBzbyBwaWNrIG9uZSBzcGVsbGluZy5cbiAgICAgIHJldHVybiBgbnVtYmVyOiR7T2JqZWN0LmlzKHZhbHVlLCAtMCkgPyBcIi0wXCIgOiB2YWx1ZX1gO1xuICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgIHJldHVybiBcInVuZGVmaW5lZFwiO1xuICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgaWYgKHNlZW4uaGFzKHZhbHVlKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN0YWJsZSBrZXlzIGNhbm5vdCBjb250YWluIGN5Y2xlc1wiKTtcbiAgICAgIHNlZW4uYWRkKHZhbHVlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBgZGF0ZToke3ZhbHVlLnRvSVNPU3RyaW5nKCl9YDtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGBhcnJheTpbJHt2YWx1ZS5tYXAoKGl0ZW0pID0+IHRvU3RhYmxlS2V5KGl0ZW0sIHNlZW4pKS5qb2luKFwiLFwiKX1dYDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgICAvLyBTb3J0ZWQgYnkgY2Fub25pY2FsIGZvcm0sIHNvIGluc2VydGlvbiBvcmRlciBkb2VzIG5vdCBsZWFrLlxuICAgICAgICAgIHJldHVybiBgc2V0Olske1suLi52YWx1ZV1cbiAgICAgICAgICAgIC5tYXAoKGl0ZW0pID0+IHRvU3RhYmxlS2V5KGl0ZW0sIHNlZW4pKVxuICAgICAgICAgICAgLnNvcnQoKVxuICAgICAgICAgICAgLmpvaW4oXCIsXCIpfV1gO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVudHJpZXM6IEl0ZXJhYmxlPFt1bmtub3duLCB1bmtub3duXT4gPVxuICAgICAgICAgIHZhbHVlIGluc3RhbmNlb2YgTWFwID8gdmFsdWUgOiBPYmplY3QuZW50cmllcyh2YWx1ZSk7XG4gICAgICAgIHJldHVybiBgJHt2YWx1ZSBpbnN0YW5jZW9mIE1hcCA/IFwibWFwXCIgOiBcIm9iamVjdFwifTp7JHtbLi4uZW50cmllc11cbiAgICAgICAgICAubWFwKChba2V5LCBpdGVtXSkgPT4gYCR7dG9TdGFibGVLZXkoa2V5LCBzZWVuKX09JHt0b1N0YWJsZUtleShpdGVtLCBzZWVuKX1gKVxuICAgICAgICAgIC5zb3J0KClcbiAgICAgICAgICAuam9pbihcIixcIil9fWA7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZWVuLmRlbGV0ZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBVbnN1cHBvcnRlZCBzdGFibGUga2V5IHR5cGU6ICR7dHlwZW9mIHZhbHVlfWApO1xuICB9XG59XG5cbi8qKlxuICogYHsgW2tleV06IHZhbHVlIH1gIHdoZW4gYHZhbHVlYCBpcyBwcmVzZW50LCBvdGhlcndpc2UgYHVuZGVmaW5lZGAgLSBzbyBhblxuICogYWJzZW50IG9wdGlvbmFsIGZpZWxkIHN0YXlzIEFCU0VOVCB3aGVuIHNwcmVhZCwgcmF0aGVyIHRoYW4gYmVjb21pbmcgYW5cbiAqIGV4cGxpY2l0IGB1bmRlZmluZWRgIHRoYXQgYGV4YWN0T3B0aW9uYWxQcm9wZXJ0eVR5cGVzYCByZWplY3RzLlxuICpcbiAqIFNwZWxsaW5nIHRoYXQgaW5saW5lIGNvc3RzIGEgcmVwZWF0ZWQsIGRvdWJsZS1ldmFsdWF0ZWQgdGVybmFyeSBwZXIgZmllbGRcbiAqIChgLi4uKHYgPyB7IGtleTogdiB9IDoge30pYCksIHdoaWNoIGlzIGhvdyBjb25maWcgcmVzb2x2ZXJzIGVuZCB1cCBjb21wdXRpbmdcbiAqIHRoZSBzYW1lIHZhbHVlIHR3aWNlLlxuICpcbiAqIEBleGFtcGxlXG4gKiByZXR1cm4ge1xuICogICAuLi5vcHRpb25hbChcImFwcElkXCIsIGVudi50ZXh0KFwiTUlDUk9TT0ZUX0FQUF9JRFwiKSksXG4gKiAgIC4uLm9wdGlvbmFsKFwiZW5kcG9pbnRcIiwgY29uZmlnLmVuZHBvaW50KSxcbiAqIH07XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbDxLIGV4dGVuZHMgc3RyaW5nLCBWPihcbiAga2V5OiBLLFxuICB2YWx1ZTogViB8IG51bGwgfCB1bmRlZmluZWQsXG4pOiBSZWNvcmQ8SywgVj4gfCB1bmRlZmluZWQge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6ICh7IFtrZXldOiB2YWx1ZSB9IGFzIFJlY29yZDxLLCBWPik7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHRvTnVtYmVyfS5cbiAqXG4gKiBCb3RoIHN3aXRjaGVzIHR1cm4gT0ZGIGEgbGVuaWVuY3kgdGhhdCBpcyBoZWxwZnVsIGZvciBhIGhhbmQtdHlwZWQgc2V0dGluZyBidXRcbiAqIHdyb25nIHdoZW4gdGhlIHN0cmluZydzIG90aGVyIGNoYXJhY3RlcnMgY2FycnkgbWVhbmluZy4ge0BsaW5rIHRvRGF0ZX0gYW5kXG4gKiB7QGxpbmsgdG9EdXJhdGlvbn0gZGlzYWJsZSBib3RoLCBzaW5jZSBhIHNwYWNlIGluc2lkZSBgMjAyNiAwOCAwMmAgaXMgYSBmaWVsZFxuICogc2VwYXJhdG9yIGFuZCBhIHBlcmNlbnQgaGFzIG5vIGVwb2NoIG9yIG1pbGxpc2Vjb25kIHJlYWRpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9OdW1iZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgaW50ZXJuYWwgZGlnaXQtZ3JvdXAgc2VwYXJhdG9ycyBhcmUgc3RyaXBwZWQsIHNvIGBcIjEsMDAwXCJgIGFuZFxuICAgKiBgXCIxIDAwMFwiYCByZWFkIGFzIGAxMDAwYC4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKlxuICAgKiBQbGFjZW1lbnQgaXMgbm90IHZhbGlkYXRlZCB3aGVuIGVuYWJsZWQsIHNvIGBcIjEsMDAsMFwiYCBhbHNvIHJlYWRzIGFzIGAxMDAwYC5cbiAgICogRGlzYWJsZSBpdCB3aGVuIHdoaXRlc3BhY2Ugb3IgYSBjb21tYSBkZWxpbWl0cyBGSUVMRFMgcmF0aGVyIHRoYW4gZ3JvdXBpbmdcbiAgICogZGlnaXRzLCBiZWNhdXNlIHN0cmlwcGluZyB0aGVtIHNpbGVudGx5IGZ1c2VzIHRob3NlIGZpZWxkcyBpbnRvIG9uZSBudW1iZXIuXG4gICAqL1xuICBzZXBhcmF0b3JzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgYSB0cmFpbGluZyBwZXJjZW50IHNpZ24gZGl2aWRlcyB0aGUgcmVzdWx0IGJ5IGAxMDBgLCBzbyBgXCIyNSVcImAgcmVhZHNcbiAgICogYXMgYDAuMjVgLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqXG4gICAqIERpc2FibGUgaXQgd2hlcmUgYSBwZXJjZW50YWdlIGhhcyBubyBtZWFuaW5nLCBzbyBgXCIyNSVcImAgaXMgYSBtaXNzIHJhdGhlclxuICAgKiB0aGFuIGEgbnVtYmVyIHR3byBvcmRlcnMgb2YgbWFnbml0dWRlIGF3YXkgZnJvbSB3aGF0IHRoZSB0ZXh0IHNheXMuXG4gICAqL1xuICBwZXJjZW50PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb2VyY2UgYSBsb29zZSBudW1lcmljIHZhbHVlIHRvIGEgcmVhbCwgRklOSVRFIGBudW1iZXJgLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0XG4gKiBjYXJyaWVzIG5vIG51bWVyaWMgbWVhbmluZy5cbiAqXG4gKiBUaGUgb25lIHBsYWNlIGEgaGFuZC10eXBlZCBudW1iZXIgaXMgaW50ZXJwcmV0ZWQsIGFsb25nc2lkZSB7QGxpbmsgdG9Cb29sZWFufSxcbiAqIHtAbGluayB0b0RhdGV9LCBhbmQge0BsaW5rIHRvRHVyYXRpb259LiBSZWFjaCBmb3IgaXQgaW5zdGVhZCBvZiBgTnVtYmVyKHgpYCBvciBhXG4gKiBoYW5kLXJvbGxlZCBudW1lcmljIHJlZ2V4OiBiYXJlIGBOdW1iZXJgIG1hcHMgYFwiXCJgLCBgbnVsbGAsIGBbXWAsIGFuZFxuICogd2hpdGVzcGFjZSB0byBgMGAgYW5kIGFueXRoaW5nIGVsc2UgdG8gYE5hTmAsIHNvIGEgY2FsbGVyIGhhcyB0byByZS1jaGVjayB0aGVcbiAqIHJlc3VsdCBldmVyeSB0aW1lLCBhbmQgYWQgaG9jIHJlZ2V4ZXMgdGVuZCB0byBkcmlmdCBpbiB3aGF0IHRoZXkgYWNjZXB0LlxuICpcbiAqIEFjY2VwdHM6IGEgZmluaXRlIGBudW1iZXJgOyBhIGBiaWdpbnRgOyBvciBhIGRlY2ltYWwgc3RyaW5nIHdpdGggYW4gb3B0aW9uYWxcbiAqIGxlYWRpbmcgc2lnbiwgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlLCB3aGl0ZXNwYWNlIGFmdGVyIHRoZSBzaWduLFxuICogZGlnaXQtZ3JvdXAgc2VwYXJhdG9ycyAoYFwiMSwwMDBcImAsIGBcIjEgMDAwXCJgKSwgYSBiYXJlIGZyYWN0aW9uIChgXCIuNVwiYCksIGFcbiAqIHRyYWlsaW5nIHBvaW50IChgXCIxLlwiYCksIHNjaWVudGlmaWMgbm90YXRpb24gKGBcIjFlM1wiYCksIGFuZCBhbiBvcHRpb25hbFxuICogdHJhaWxpbmcgcGVyY2VudCBzaWduIChgXCIyNSVcImAsIGBcIjEuNSAlXCJgKS4gQSB0cmFpbGluZyBgJWAgZGl2aWRlcyB0aGUgcGFyc2VkXG4gKiB2YWx1ZSBieSBgMTAwYCwgc28gYFwiMjUlXCJgIGJlY29tZXMgYDAuMjVgLlxuICpcbiAqIFNlcGFyYXRvcnMgYXJlIHN0cmlwcGVkIHdpdGhvdXQgdmFsaWRhdGluZyB0aGVpciBwbGFjZW1lbnQsIHNvIGBcIjEsMDAsMFwiYCByZWFkc1xuICogYXMgYDEwMDBgOyB0aGlzIGlzIGEgY29lcmNpb24gZm9yIGhhbmQtdHlwZWQgY29uZmlndXJhdGlvbiwgbm90IGEgbG9jYWxlLWF3YXJlXG4gKiB2YWxpZGF0b3IuIEFueXRoaW5nIGVsc2UsIGluY2x1ZGluZyBgTmFOYCwgYEluZmluaXR5YCwgYW4gZW1wdHkgb3JcbiAqIHdoaXRlc3BhY2Utb25seSBzdHJpbmcsIGBudWxsYCwgYHVuZGVmaW5lZGAsIGEgYm9vbGVhbiwgbXVsdGlwbGUgc2lnbnMsXG4gKiBtYWxmb3JtZWQgZXhwb25lbnRzLCBtaXNwbGFjZWQgcGVyY2VudCBzaWducywgb3IgYFwiMTJweFwiYCwgcmV0dXJucyBgdW5kZWZpbmVkYC5cbiAqXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIHJhdGhlciB0aGFuIHRocm93aW5nLCBtYXRjaGluZyB0aGUgb3RoZXIgY29lcmNpb25zLCBzbyBpdFxuICogY29tcG9zZXMgbmF0dXJhbGx5IHdpdGggYD8/YCBmYWxsYmFja3MuXG4gKlxuICogQGV4YW1wbGVcbiAqIHRvTnVtYmVyKFwiMSwwMDBcIik7ICAgLy8gMTAwMFxuICogdG9OdW1iZXIoXCIgLTIuNSBcIik7ICAvLyAtMi41XG4gKiB0b051bWJlcihcIjFlM1wiKTsgICAgIC8vIDEwMDBcbiAqIHRvTnVtYmVyKFwiMTIuNSAlXCIpOyAgLy8gMC4xMjVcbiAqIHRvTnVtYmVyKFwiXCIpOyAgICAgICAgLy8gdW5kZWZpbmVkICAoTnVtYmVyKFwiXCIpIHdvdWxkIGJlIDApXG4gKiB0b051bWJlcihcIjEycHhcIik7ICAgIC8vIHVuZGVmaW5lZFxuICogdG9OdW1iZXIoXCIxIDAwMFwiLCB7IHNlcGFyYXRvcnM6IGZhbHNlIH0pOyAvLyB1bmRlZmluZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlOiB1bmtub3duLCBvcHRpb25zOiBUb051bWJlck9wdGlvbnMgPSB7fSk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJiaWdpbnRcIikge1xuICAgIHJldHVybiB0b051bWJlcihOdW1iZXIodmFsdWUpLCBvcHRpb25zKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAvLyBTdHJpcCBzdXJyb3VuZGluZyB3aGl0ZXNwYWNlLCB3aGl0ZXNwYWNlIGFmdGVyIGEgbGVhZGluZyBzaWduLCBkaWdpdC1ncm91cFxuICAgIC8vIHNlcGFyYXRvcnMgKGJvdGggYCxgIGFuZCB0aGUgc3BhY2UgaW4gYFwiMSAwMDBcImApLCBsZWF2aW5nIGEgYmFyZSBudW1lcmFsIGZvclxuICAgIC8vIHRoZSBzaGFwZSB0ZXN0IGJlbG93IHRvIGFjY2VwdCBvciByZWplY3QuXG4gICAgY29uc3QgdGV4dCA9IHZhbHVlLnJlcGxhY2UoXG4gICAgICBvcHRpb25zLnNlcGFyYXRvcnMgPT09IGZhbHNlID8gLyheXFxzK3xcXHMrJCkvZyA6IC8oXlxccyt8XFxzKyR8KD88PV5bKy1dKVxccyt8KD88PVxcZClcXHMrfCwpL2csXG4gICAgICBcIlwiLFxuICAgICk7XG4gICAgaWYgKHRleHQpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gdGV4dC5tYXRjaCgvXihbKy1dPyg/OlxcZCsoPzpcXC5cXGQqKT98XFwuXFxkKykoPzplWystXT9cXGQrKT8pKCUpPyQvaSk7XG4gICAgICBpZiAobWF0Y2ggJiYgIShtYXRjaFsyXSAmJiBvcHRpb25zLnBlcmNlbnQgPT09IGZhbHNlKSkge1xuICAgICAgICBjb25zdCBudW1iZXIgPSBOdW1iZXIobWF0Y2hbMV0pO1xuICAgICAgICByZXR1cm4gdG9OdW1iZXIobWF0Y2hbMl0gPyBudW1iZXIgLyAxMDAgOiBudW1iZXIsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBBIGJveGVkIGBOdW1iZXJgLCBvciBhbnl0aGluZyB3aXRoIGEgbnVtZXJpYyBgdG9TdHJpbmdgLiBgU3RyaW5nKHZhbHVlKWBcbiAgICAvLyByb3V0ZXMgaXQgYmFjayB0aHJvdWdoIHRoZSBzdHJpbmcgYnJhbmNoLCB3aGljaCByZWplY3RzIHdoYXQgaXMgbm90IG51bWVyaWMuXG4gICAgcmV0dXJuIHRvTnVtYmVyKFN0cmluZyh2YWx1ZSksIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ29lcmNlIGEgbG9vc2UgYm9vbGVhbi1pc2ggdmFsdWUgdG8gYSByZWFsIGBib29sZWFuYCwgb3IgYHVuZGVmaW5lZGBcbiAqIHdoZW4gaXQgY2FuJ3QgYmUgaW50ZXJwcmV0ZWQuIFJlY29nbml6ZXMgYHRydWVgL2B0YC9gb25gL2AxYC9geWVzYC9geWBcbiAqIGFuZCB0aGVpciBuZWdhdGl2ZXMgKGNhc2UtIGFuZCB3aGl0ZXNwYWNlLWluc2Vuc2l0aXZlIGZvciBzdHJpbmdzKSwgYXNcbiAqIHdlbGwgYXMgdGhlIG51bWJlcnMgYDFgIGFuZCBgMGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0Jvb2xlYW4odmFsdWU6IHVua25vd24pOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoXG4gICAgICB2YWx1ZSA9PT0gXCJ0cnVlXCIgfHxcbiAgICAgIHZhbHVlID09IFwidFwiIHx8XG4gICAgICB2YWx1ZSA9PT0gXCJvblwiIHx8XG4gICAgICB2YWx1ZSA9PT0gXCIxXCIgfHxcbiAgICAgIHZhbHVlID09PSBcInllc1wiIHx8XG4gICAgICB2YWx1ZSA9PT0gXCJ5XCJcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB2YWx1ZSA9PT0gXCJmYWxzZVwiIHx8XG4gICAgICB2YWx1ZSA9PSBcImZcIiB8fFxuICAgICAgdmFsdWUgPT09IFwib2ZmXCIgfHxcbiAgICAgIHZhbHVlID09PSBcIjBcIiB8fFxuICAgICAgdmFsdWUgPT09IFwibm9cIiB8fFxuICAgICAgdmFsdWUgPT09IFwiblwiXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgIGlmICh2YWx1ZSA9PT0gMSkgcmV0dXJuIHRydWU7XG4gICAgZWxzZSBpZiAodmFsdWUgPT09IDApIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIExhcmdlc3QgdmFsdWUgcmVhZCBhcyBlcG9jaCBTRUNPTkRTIHJhdGhlciB0aGFuIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBgMWUxMWAgc2Vjb25kcyBpcyB0aGUgeWVhciA1MTM4IGFuZCBgMWUxMWAgbXMgaXMgMTk3My0wMy0wMywgc28gZXZlcnkgdmFsdWUgYVxuICogY2FsbGVyIHJlYWxpc3RpY2FsbHkgbWVhbnMgYXMgbWlsbGlzIGlzIGFib3ZlIHRoZSBsaW5lIGFuZCBldmVyeSB2YWx1ZSB0aGV5XG4gKiBtZWFuIGFzIHNlY29uZHMgaXMgYmVsb3cgaXQuIFRoZSBhbWJpZ3VpdHkgaXMgdW5hdm9pZGFibGUgLSB0aGUgdHdvIHVuaXRzIHNoYXJlXG4gKiBhIG51bWJlciBsaW5lIC0gc28gdGhlIHNwbGl0IGlzIHBsYWNlZCB3aGVyZSBuZWl0aGVyIHNpZGUgaGFzIGEgcGxhdXNpYmxlXG4gKiBjbGFpbS5cbiAqL1xuY29uc3QgU0VDT05EU19DRUlMSU5HID0gMWUxMTtcblxuLyoqXG4gKiBBIG51bWJlciBmb3Ige0BsaW5rIHRvRGF0ZX0gYW5kIHtAbGluayB0b0R1cmF0aW9ufSwgcmVhZCB3aXRoIG5vbmUgb2ZcbiAqIHtAbGluayB0b051bWJlcn0ncyBzdHJpbmcgbGVuaWVuY2llcy5cbiAqXG4gKiBCb3RoIGxlbmllbmNpZXMgYXJlIGFjdGl2ZWx5IGhhcm1mdWwgaGVyZS4gQSBzcGFjZSBvciBjb21tYSBzZXBhcmF0ZXMgRklFTERTIGluXG4gKiBhIGRhdGUgKGAyMDI2IDA4IDAyYCB3b3VsZCBmdXNlIGludG8gdGhlIGVwb2NoIGAyMDI2MDgwMmApLCBhbmQgYSBwZXJjZW50YWdlIGhhc1xuICogbm8gcmVhZGluZyBhcyBhbiBpbnN0YW50IG9yIGEgbGVuZ3RoIG9mIHRpbWUsIHNvIGAyNSVgIG11c3QgYmUgYSBtaXNzIHJhdGhlclxuICogdGhhbiBgMjUwbXNgLlxuICovXG5mdW5jdGlvbiB0b0JhcmVOdW1iZXIodmFsdWU6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdG9OdW1iZXIodmFsdWUsIHsgc2VwYXJhdG9yczogZmFsc2UsIHBlcmNlbnQ6IGZhbHNlIH0pO1xufVxuXG4vKipcbiAqIE1pbGxpc2Vjb25kcyBwZXIgdW5pdCwga2V5ZWQgYnkgU0lOR1VMQVIgYWxpYXMuIHtAbGluayB0b0R1cmF0aW9ufSByZXRyaWVzIGFcbiAqIGxvb2t1cCB3aXRob3V0IGEgdHJhaWxpbmcgYHNgLCBzbyBldmVyeSBwbHVyYWwgc3BlbGxpbmcgaXMgY292ZXJlZCB3aXRob3V0XG4gKiBsaXN0aW5nIGl0IChgbXNgIGlzIGFscmVhZHkgc2luZ3VsYXIsIGhlbmNlIGl0cyBvd24gZW50cnkpLlxuICpcbiAqIGBtYCBpcyBNSU5VVEVTIGFuZCBtb250aHMgbmVlZCBgbW9gLCBmb2xsb3dpbmcgdGhlIG5lYXItdW5pdmVyc2FsIGNvbnZlbnRpb25cbiAqIChgbXNgLCBgZGF0ZWAsIGNyb24gcHJvc2UpOyBtb250aCBhbmQgeWVhciBhcmUgY2FsZW5kYXIgYXBwcm94aW1hdGlvbnMgKDMwIC9cbiAqIDM2NSBkYXlzKSBiZWNhdXNlIGEgZHVyYXRpb24gaGFzIG5vIGFuY2hvciBkYXRlIHRvIGJlIGV4YWN0IGFnYWluc3QuXG4gKi9cbmNvbnN0IERVUkFUSU9OX1VOSVRTOiBSZWFkb25seUFycmF5PHJlYWRvbmx5IFttczogbnVtYmVyLCBhbGlhc2VzOiByZWFkb25seSBzdHJpbmdbXV0+ID0gW1xuICBbMSwgW1wibXNcIiwgXCJtc2VjXCIsIFwibWlsbGlzZWNvbmRcIiwgXCJtaWxsaVwiXV0sXG4gIFsxMDAwLCBbXCJzXCIsIFwic2VjXCIsIFwic2Vjb25kXCJdXSxcbiAgWzYwXzAwMCwgW1wibVwiLCBcIm1pblwiLCBcIm1pbnV0ZVwiXV0sXG4gIFszXzYwMF8wMDAsIFtcImhcIiwgXCJoclwiLCBcImhvdXJcIl1dLFxuICBbODZfNDAwXzAwMCwgW1wiZFwiLCBcImRheVwiXV0sXG4gIFs2MDRfODAwXzAwMCwgW1wid1wiLCBcIndrXCIsIFwid2Vla1wiXV0sXG4gIFsyXzU5Ml8wMDBfMDAwLCBbXCJtb1wiLCBcIm1vblwiLCBcIm1vbnRoXCJdXSxcbiAgWzMxXzUzNl8wMDBfMDAwLCBbXCJ5XCIsIFwieXJcIiwgXCJ5ZWFyXCJdXSxcbl07XG5cbmNvbnN0IERVUkFUSU9OX1VOSVRfTVM6IFJlYWRvbmx5TWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXAoXG4gIERVUkFUSU9OX1VOSVRTLmZsYXRNYXAoKFttcywgYWxpYXNlc10pID0+IGFsaWFzZXMubWFwKChhbGlhcykgPT4gW2FsaWFzLCBtc10gYXMgY29uc3QpKSxcbik7XG5cbi8qKiBPbmUgYDxhbW91bnQ+PHVuaXQ+YCB0ZXJtIGluc2lkZSBhIGR1cmF0aW9uIHN0cmluZy4gKi9cbmNvbnN0IERVUkFUSU9OX1RFUk0gPSAvKFsrLV0/KShcXGQrKD86XFwuXFxkKyk/KVxccyooW2Etel0rKS9nO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB0b0RhdGV9LlxuICpcbiAqIFRoZSBtaXJyb3Igb2Yge0BsaW5rIFRvRHVyYXRpb25PcHRpb25zfTogZWFjaCBmdW5jdGlvbiBjYW4gZmFsbCBiYWNrIHRvIHRoZVxuICogb3RoZXIsIHNvIGVhY2ggaGFzIG9uZSBzd2l0Y2ggdHVybmluZyB0aGF0IGZhbGxiYWNrIG9mZi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb0RhdGVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgYSB7QGxpbmsgdG9EdXJhdGlvbn0gZXhwcmVzc2lvbiBpcyByZWFkIGFzIGFuIGluc3RhbnQgcmVsYXRpdmUgdG9cbiAgICogbm93LCBzbyBgLTdkYCBhbmQgYDcgZGF5cyBhZ29gIGJlY29tZSBgbm93IC0gNyBkYXlzYC4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKlxuICAgKiBTZXQgYGZhbHNlYCB3aGVuIHRoZSB2YWx1ZSBtdXN0IGJlIGEgcmVhbCBkYXRlIGFuZCBhIHJlbGF0aXZlIGV4cHJlc3Npb25cbiAgICogc2hvdWxkIGJlIGEgbWlzcyAtIGEgc3RvcmVkIHRpbWVzdGFtcCwgYSB1c2VyLXN1cHBsaWVkIGBEYXRlYCBoZWFkZXIsIGFuXG4gICAqIGBleHBpcmVzX2F0YCBmaWVsZCAtIHNpbmNlIGEgZHVyYXRpb24gc2lsZW50bHkgcmVzb2x2aW5nIGFnYWluc3QgdGhlIGN1cnJlbnRcbiAgICogY2xvY2sgbWFrZXMgdGhlIHNhbWUgaW5wdXQgbWVhbiBzb21ldGhpbmcgZGlmZmVyZW50IG9uIGV2ZXJ5IGNhbGwuIEFsc28gd2hhdFxuICAgKiB7QGxpbmsgdG9EdXJhdGlvbn0gcGFzc2VzIHdoZW4gaXQgcmVjdXJzZXMsIHNvIHRoZSB0d28gY2Fubm90IGJvdW5jZSBhIHZhbHVlXG4gICAqIGJldHdlZW4gdGhlbSBmb3JldmVyLlxuICAgKi9cbiAgcGFyc2VEdXJhdGlvbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHRvRHVyYXRpb259LlxuICpcbiAqIFRoZSBtaXJyb3Igb2Yge0BsaW5rIFRvRGF0ZU9wdGlvbnN9OiBlYWNoIGZ1bmN0aW9uIGNhbiBmYWxsIGJhY2sgdG8gdGhlIG90aGVyLFxuICogc28gZWFjaCBoYXMgb25lIHN3aXRjaCB0dXJuaW5nIHRoYXQgZmFsbGJhY2sgb2ZmLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvRHVyYXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgYSB7QGxpbmsgdG9EYXRlfSB2YWx1ZSBpcyByZWFkIGFzIHRoZSBzaWduZWQgb2Zmc2V0IGZyb20gbm93LCBzb1xuICAgKiBgMjAyNi0wOC0wMmAgYmVjb21lcyBob3dldmVyIGxvbmcgdW50aWwgKG9yIHNpbmNlKSB0aGF0IGluc3RhbnQuIERlZmF1bHRzIHRvXG4gICAqIGB0cnVlYC5cbiAgICpcbiAgICogU2V0IGBmYWxzZWAgd2hlbiBvbmx5IGEgbGVuZ3RoIG9mIHRpbWUgaXMgbWVhbmluZ2Z1bCAtIGEgdGltZW91dCwgYSBwb2xsXG4gICAqIGludGVydmFsLCBhIGNhY2hlIFRUTCAtIGJlY2F1c2UgYSBkYXRlIHdvdWxkIG90aGVyd2lzZSB5aWVsZCBhIHBsYXVzaWJsZSBidXRcbiAgICogd3JvbmcgbnVtYmVyIHRoYXQgYWxzbyBkcmlmdHMgd2l0aCB0aGUgY2xvY2suIEFsc28gd2hhdCB7QGxpbmsgdG9EYXRlfSBwYXNzZXNcbiAgICogd2hlbiBpdCByZWN1cnNlcy5cbiAgICovXG4gIHBhcnNlRGF0ZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29lcmNlIGEgbG9vc2UgZHVyYXRpb24gdG8gTUlMTElTRUNPTkRTLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGNhbid0IGJlXG4gKiBpbnRlcnByZXRlZC5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgbGVuaWVudCwgYmVjYXVzZSB0aGVzZSB2YWx1ZXMgYXJlIHR5cGVkIGJ5IGhhbmQgaW50byBlbnYgdmFycyxcbiAqIENMSSBmbGFncywgYW5kIGNvbmZpZyBmaWxlczogd2hpdGVzcGFjZSBiZXR3ZWVuIGFtb3VudCBhbmQgdW5pdCBpcyBvcHRpb25hbCBhbmRcbiAqIHVubGltaXRlZCwgdW5pdHMgYXJlIGNhc2UtaW5zZW5zaXRpdmUsIHBsdXJhbHMgYW5kIHRoZSBjb21tb24gYWJicmV2aWF0aW9ucyBhcmVcbiAqIGVxdWl2YWxlbnQgKGAybXNgID09PSBgMiBtaWxsaXNlY29uZHNgLCBgMWhgID09PSBgMSBocmAgPT09IGAxIEhvdXJgKSwgYGFuZGAgYW5kXG4gKiB0aG91c2FuZHMgc2VwYXJhdG9ycyBhcmUgaWdub3JlZCAoYDEsNTAwIG1zYCwgYDEgaG91ciBhbmQgMzAgbWludXRlc2ApLCBhbmRcbiAqIHRlcm1zIGNvbXBvc2UgKGAxaDMwbWApLiBBIHBsYWluIGBudW1iZXJgIHBhc3NlcyB0aHJvdWdoIGFzIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBTaWducyBhcmUgc3VwcG9ydGVkIHNvIGEgZHVyYXRpb24gY2FuIGV4cHJlc3MgYW4gT0ZGU0VUIHJhdGhlciB0aGFuIG9ubHkgYVxuICogbGVuZ3RoOiBhIGxlYWRpbmcgYC1gIChvciBhIHRyYWlsaW5nIGBhZ29gKSBtYWtlcyB0aGUgcmVzdWx0IG5lZ2F0aXZlLCBhbmQgYW5cbiAqIHVuc2lnbmVkIHRlcm0gaW5oZXJpdHMgdGhlIHByZXZpb3VzIHRlcm0ncyBzaWduLCBzbyBgLTFoMzBtYCBpcyAtOTAgbWludXRlc1xuICogcmF0aGVyIHRoYW4gLTYwICsgMzAuIHtAbGluayB0b0RhdGV9IHVzZXMgdGhhdCB0byB0dXJuIGAtN2RgIC8gYDcgZGF5cyBhZ29gXG4gKiBpbnRvIGFuIGluc3RhbnQgcmVsYXRpdmUgdG8gbm93LlxuICpcbiAqIEFuIFVOS05PV04gdW5pdCBmYWlscyB0aGUgd2hvbGUgcGFyc2UgcmF0aGVyIHRoYW4gYmVpbmcgc2tpcHBlZCAtIGAxIGZvcnRuaWdodGBcbiAqIHJldHVybmluZyBgMWAgc2lsZW50bHkgd291bGQgYmUgd29yc2UgdGhhbiByZXR1cm5pbmcgbm90aGluZyAtIHdoaWNoIGlzIGFsc29cbiAqIHdoYXQga2VlcHMge0BsaW5rIHRvRGF0ZX0gZnJvbSBtaXN0YWtpbmcgYDEgSmFuIDIwMjZgIGZvciBhIGR1cmF0aW9uLlxuICpcbiAqIEEgdmFsdWUgdGhhdCBpcyBub3QgYSBkdXJhdGlvbiBhdCBhbGwgaXMgb2ZmZXJlZCB0byB7QGxpbmsgdG9EYXRlfSBhbmQsIHdoZW4gaXRcbiAqIElTIGEgZGF0ZSwgcmVhZCBhcyB0aGUgc2lnbmVkIG9mZnNldCBmcm9tIG5vdyAoYGRhdGUgLSBub3dgKSwgd2hpY2ggbWFrZXMgdGhlXG4gKiB0d28gZnVuY3Rpb25zIGludmVyc2VzOiBhIHBhc3QgaW5zdGFudCBpcyBuZWdhdGl2ZSwgYSBmdXR1cmUgb25lIHBvc2l0aXZlLlxuICogYG9wdGlvbnMucGFyc2VEYXRlOiBmYWxzZWAgdHVybnMgdGhhdCBvZmYgd2hlbiBvbmx5IGEgbGVuZ3RoIG9mIHRpbWUgbWFrZXNcbiAqIHNlbnNlIC0gc2VlIHtAbGluayBUb0R1cmF0aW9uT3B0aW9uc30uXG4gKlxuICogQGV4YW1wbGVcbiAqIHRvRHVyYXRpb24oXCIzMHNcIik7ICAgICAgICAgICAgICAgICAgICAvLyAzMF8wMDBcbiAqIHRvRHVyYXRpb24oXCIxIGhvdXIgMzAgbWludXRlc1wiKTsgICAgICAvLyA1XzQwMF8wMDBcbiAqIHRvRHVyYXRpb24oXCItNyBkYXlzXCIpOyAgICAgICAgICAgICAgICAvLyAtNjA0XzgwMF8wMDBcbiAqIHRvRHVyYXRpb24oXCIyIHdlZWtzIGFnb1wiKTsgICAgICAgICAgICAvLyAtMV8yMDlfNjAwXzAwMFxuICogdG9EdXJhdGlvbihcIjIwMjYtMDgtMDJcIik7ICAgICAgICAgICAgIC8vIG1zIGZyb20gbm93IHRvIHRoYXQgaW5zdGFudFxuICogdG9EdXJhdGlvbihcIjIwMjYtMDgtMDJcIiwgeyBwYXJzZURhdGU6IGZhbHNlIH0pOyAvLyB1bmRlZmluZWRcbiAqIHRvRHVyYXRpb24oXCJzb29uXCIpOyAgICAgICAgICAgICAgICAgICAvLyB1bmRlZmluZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvRHVyYXRpb24odmFsdWU6IHVua25vd24sIG9wdGlvbnM6IFRvRHVyYXRpb25PcHRpb25zID0ge30pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAvLyBBIGJhcmUgbnVtYmVyIGlzIGFscmVhZHkgbWlsbGlzZWNvbmRzLCB0aGUgc2FtZSByZWFkaW5nIGB0b0RhdGVgIGdpdmVzIGFuXG4gIC8vIGVwb2NoIHZhbHVlLCBzbyB0aGlzIG11c3QgcnVuIGJlZm9yZSBhbnkgZGF0ZSBpbnRlcnByZXRhdGlvbi5cbiAgY29uc3QgbnVtID0gdG9CYXJlTnVtYmVyKHZhbHVlKTtcbiAgaWYgKG51bSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gbnVtO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMucGFyc2VEYXRlID09PSBmYWxzZSA/IHVuZGVmaW5lZCA6IGRhdGVBc0R1cmF0aW9uKHZhbHVlKTtcbiAgfVxuICBsZXQgdGV4dCA9IHZhbHVlXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZUFsbCgvWyxfXS9nLCBcIlwiKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJhbmRcXGIvZywgXCIgXCIpXG4gICAgLnRyaW0oKTtcbiAgbGV0IG5lZ2F0ZSA9IGZhbHNlO1xuICBpZiAodGV4dC5lbmRzV2l0aChcImFnb1wiKSkge1xuICAgIG5lZ2F0ZSA9IHRydWU7XG4gICAgdGV4dCA9IHRleHQuc2xpY2UoMCwgLVwiYWdvXCIubGVuZ3RoKTtcbiAgfVxuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9eaW5cXGIvLCBcIlwiKS50cmltKCk7XG4gIGlmICghdGV4dCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCB0ZXJtcyA9IFsuLi50ZXh0Lm1hdGNoQWxsKERVUkFUSU9OX1RFUk0pXTtcbiAgaWYgKHRlcm1zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBvcHRpb25zLnBhcnNlRGF0ZSA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBkYXRlQXNEdXJhdGlvbih2YWx1ZSk7XG4gIH1cblxuICAvLyBFdmVyeXRoaW5nIG91dHNpZGUgdGhlIG1hdGNoZWQgdGVybXMgbXVzdCBiZSBzZXBhcmF0b3JzIG9ubHk7IG90aGVyd2lzZSB0aGVcbiAgLy8gc3RyaW5nIGlzIHNvbWV0aGluZyBlbHNlIHRoYXQgbWVyZWx5IENPTlRBSU5TIGEgZHVyYXRpb24tc2hhcGVkIGZyYWdtZW50LlxuICBsZXQgbGVmdG92ZXIgPSB0ZXh0O1xuICBmb3IgKGNvbnN0IHRlcm0gb2YgdGVybXMpIGxlZnRvdmVyID0gbGVmdG92ZXIucmVwbGFjZSh0ZXJtWzBdLCBcIiBcIik7XG4gIGlmIChsZWZ0b3Zlci50cmltKCkpIHtcbiAgICAvLyBBIGR1cmF0aW9uLXNoYXBlZCBmcmFnbWVudCBpbnNpZGUgb3RoZXIgdGV4dCBpcyB1c3VhbGx5IGEgREFURSAtIGBcIjIwMjYtMDgtMDJcImBcbiAgICAvLyBtYXRjaGVzIHR3byB0ZXJtcyBhbmQgbGVhdmVzIHNlcGFyYXRvcnMgYmVoaW5kLlxuICAgIHJldHVybiBvcHRpb25zLnBhcnNlRGF0ZSA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBkYXRlQXNEdXJhdGlvbih2YWx1ZSk7XG4gIH1cblxuICBsZXQgdG90YWwgPSAwO1xuICBsZXQgc2lnbiA9IDE7XG4gIGZvciAoY29uc3QgWywgZXhwbGljaXRTaWduLCBhbW91bnQsIHVuaXRdIG9mIHRlcm1zKSB7XG4gICAgaWYgKGV4cGxpY2l0U2lnbikgc2lnbiA9IGV4cGxpY2l0U2lnbiA9PT0gXCItXCIgPyAtMSA6IDE7XG4gICAgY29uc3QgdW5pdE1zID0gRFVSQVRJT05fVU5JVF9NUy5nZXQodW5pdCkgPz8gRFVSQVRJT05fVU5JVF9NUy5nZXQodW5pdC5yZXBsYWNlKC9zJC8sIFwiXCIpKTtcbiAgICBpZiAodW5pdE1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLnBhcnNlRGF0ZSA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBkYXRlQXNEdXJhdGlvbih2YWx1ZSk7XG4gICAgfVxuICAgIHRvdGFsICs9IHNpZ24gKiBOdW1iZXIoYW1vdW50KSAqIHVuaXRNcztcbiAgfVxuICByZXR1cm4gbmVnYXRlID8gLXRvdGFsIDogdG90YWw7XG59XG5cbi8qKlxuICogQSBkYXRlIHJlYWQgYXMgdGhlIHNpZ25lZCBvZmZzZXQgZnJvbSBub3cgKGBkYXRlIC0gbm93YCksIHdoaWNoIGlzIHdoYXQgbWFrZXNcbiAqIHtAbGluayB0b0R1cmF0aW9ufSBhbmQge0BsaW5rIHRvRGF0ZX0gaW52ZXJzZXMgb2YgZWFjaCBvdGhlci4gUmVjdXJzZXMgd2l0aFxuICogZHVyYXRpb24gcGFyc2luZyBESVNBQkxFRCBzbyB0aGUgdHdvIGNhbm5vdCBoYW5kIGEgdmFsdWUgYmFjayBhbmQgZm9ydGhcbiAqIGZvcmV2ZXIuXG4gKi9cbmZ1bmN0aW9uIGRhdGVBc0R1cmF0aW9uKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGF0ZSA9IHRvRGF0ZSh2YWx1ZSwgeyBwYXJzZUR1cmF0aW9uOiBmYWxzZSB9KTtcbiAgcmV0dXJuIGRhdGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGRhdGUuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKTtcbn1cblxuLyoqXG4gKiBDb2VyY2UgYSBsb29zZSBkYXRlLWlzaCB2YWx1ZSB0byBhIHJlYWwgYERhdGVgLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGNhbid0IGJlXG4gKiBpbnRlcnByZXRlZC4gQWNjZXB0cywgaW4gdGhpcyBvcmRlcjpcbiAqXG4gKiAgIC0gYSBgRGF0ZWAgKHBhc3NlZCB0aHJvdWdoOyBhbiBpbnZhbGlkIG9uZSBpcyBhIG1pc3MpO1xuICogICAtIGFuIGVwb2NoIE5VTUJFUiBvciBudW1lcmljIHN0cmluZywgaW4gc2Vjb25kcyBvciBtaWxsaXNlY29uZHMgKHNlZVxuICogICAgIHtAbGluayBTRUNPTkRTX0NFSUxJTkd9KTtcbiAqICAgLSBgbm93YCAoYW5kIGl0cyBgdG9kYXlgIHNwZWxsaW5nKSwgZm9yIHRoZSBjdXJyZW50IGluc3RhbnQ7XG4gKiAgIC0gYSB7QGxpbmsgdG9EdXJhdGlvbn0gZXhwcmVzc2lvbiwgcmVzb2x2ZWQgUkVMQVRJVkUgVE8gTk9XLCBzbyBgLTdkYCxcbiAqICAgICBgNyBkYXlzIGFnb2AsIGFuZCBgaW4gMzAgbWludXRlc2AgYXJlIGFsbCB2YWxpZCBpbnN0YW50cztcbiAqICAgLSBhbnl0aGluZyBgRGF0ZS5wYXJzZWAgdW5kZXJzdGFuZHMgKGAyMDI2LTA4LTAyYCwgYW4gSVNPL1VUQyBpbnN0YW50KS5cbiAqXG4gKiBUaGUgZXBvY2ggdW5pdCBpbmZlcmVuY2UgaXMgdGhlIHJlYXNvbiB0aGlzIGV4aXN0cyByYXRoZXIgdGhhblxuICogYG5ldyBEYXRlKHZhbHVlKWA6IGEgYmFyZSBlcG9jaCBhcnJpdmVzIGFzIGEgU1RSSU5HIGZyb20gYW4gZW52IHZhciBvciBhIENMSVxuICogZmxhZyBhcyBvZnRlbiBhcyBpdCBhcnJpdmVzIGFzIGEgbnVtYmVyIChgZGF0ZSArJXNgLCBhIEpTT04gZmllbGQsIGEgY29waWVkIGxvZ1xuICogbGluZSksIGFuZCBgRGF0ZS5wYXJzZShcIjE3ODU2OTc4OTlcIilgIHJlYWRzIHRoYXQgYXMgYSBZRUFSLCBzaWxlbnRseSBsYW5kaW5nXG4gKiAxLjcgYmlsbGlvbiB5ZWFycyBvdXQuIE51bWVyaWMgc3RyaW5ncyBhcmUgdGhlcmVmb3JlIHJvdXRlZCB0byB0aGUgZXBvY2ggcGF0aCxcbiAqIG5ldmVyIHRvIGBEYXRlLnBhcnNlYC5cbiAqXG4gKiBUaGUgZHVyYXRpb24gZmFsbGJhY2sgcnVucyBMQVNULCBhZnRlciBgRGF0ZS5wYXJzZWAsIHNvIGEgcmVhbCBkYXRlIGlzIG5ldmVyXG4gKiBtaXN0YWtlbiBmb3IgYW4gb2Zmc2V0LiBgb3B0aW9ucy5wYXJzZUR1cmF0aW9uOiBmYWxzZWAgcmVtb3ZlcyBpdCBlbnRpcmVseSB3aGVuXG4gKiB0aGUgdmFsdWUgbXVzdCBiZSBhbiBhYnNvbHV0ZSBpbnN0YW50IC0gc2VlIHtAbGluayBUb0RhdGVPcHRpb25zfS5cbiAqXG4gKiBMaWtlIHtAbGluayB0b0Jvb2xlYW59IHRoaXMgTkVWRVIgdGhyb3dzIGFuZCByZXR1cm5zIGB1bmRlZmluZWRgIGZvciBhbnl0aGluZ1xuICogdW5pbnRlcnByZXRhYmxlLCBzbyBhIGNhbGxlciBkZWNpZGVzIHdoZXRoZXIgYSBiYWQgdmFsdWUgaXMgZmF0YWwsIGEgd2FybmluZyxcbiAqIG9yIGEgZmFsbGJhY2suXG4gKlxuICogQGV4YW1wbGVcbiAqIHRvRGF0ZShcIm5vd1wiKTsgICAgICAgICAgICAgICAvLyB0aGlzIGluc3RhbnRcbiAqIHRvRGF0ZShcIjIwMjYtMDgtMDJcIik7ICAgICAgICAvLyAyMDI2LTA4LTAyVDAwOjAwOjAwLjAwMFpcbiAqIHRvRGF0ZShcIjE3ODU2OTc4OTlcIik7ICAgICAgICAvLyBzZWNvbmRzIC0+IDIwMjYtMDgtMDJULi4uXG4gKiB0b0RhdGUoMTc4NTY5Nzg5OTAwMCk7ICAgICAgIC8vIG1pbGxpcyAgLT4gdGhlIHNhbWUgaW5zdGFudFxuICogdG9EYXRlKFwiMzAgZGF5cyBhZ29cIik7ICAgICAgIC8vIG5vdyAtIDMwZFxuICogdG9EYXRlKFwiMzAgZGF5cyBhZ29cIiwgeyBwYXJzZUR1cmF0aW9uOiBmYWxzZSB9KTsgLy8gdW5kZWZpbmVkXG4gKiB0b0RhdGUoXCJub3BlXCIpOyAgICAgICAgICAgICAgLy8gdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0RhdGUodmFsdWU6IHVua25vd24sIG9wdGlvbnM6IFRvRGF0ZU9wdGlvbnMgPSB7fSk6IERhdGUgfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuIE51bWJlci5pc05hTih2YWx1ZS5nZXRUaW1lKCkpID8gdW5kZWZpbmVkIDogdmFsdWU7XG4gIH1cblxuICBjb25zdCBlcG9jaE1zID0gdG9FcG9jaE1zKHZhbHVlKTtcbiAgaWYgKGVwb2NoTXMgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGZyb21NcyhlcG9jaE1zKTtcblxuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHRleHQgPSB2YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHRleHQgPT09IFwibm93XCIgfHwgdGV4dCA9PT0gXCJ0b2RheVwiKSByZXR1cm4gbmV3IERhdGUoKTtcblxuICBjb25zdCBwYXJzZWQgPSBEYXRlLnBhcnNlKHZhbHVlLnRyaW0oKSk7XG4gIGlmICghTnVtYmVyLmlzTmFOKHBhcnNlZCkpIHJldHVybiBuZXcgRGF0ZShwYXJzZWQpO1xuXG4gIGlmIChvcHRpb25zLnBhcnNlRHVyYXRpb24gPT09IGZhbHNlKSByZXR1cm4gdW5kZWZpbmVkO1xuICAvLyBSZWN1cnNlcyB3aXRoIGRhdGUgcGFyc2luZyBESVNBQkxFRCBzbyB0aGUgdHdvIGNhbm5vdCBoYW5kIGEgdmFsdWUgYmFjayBhbmRcbiAgLy8gZm9ydGggZm9yZXZlci5cbiAgY29uc3Qgb2Zmc2V0TXMgPSB0b0R1cmF0aW9uKHZhbHVlLCB7IHBhcnNlRGF0ZTogZmFsc2UgfSk7XG4gIHJldHVybiBvZmZzZXRNcyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogZnJvbU1zKERhdGUubm93KCkgKyBvZmZzZXRNcyk7XG59XG5cbi8qKiBBIGBEYXRlYCBmb3IgZXBvY2ggYG1zYCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBpcyBvdXQgb2YgcmVwcmVzZW50YWJsZSByYW5nZS4gKi9cbmZ1bmN0aW9uIGZyb21NcyhtczogbnVtYmVyKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShtcyk7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gdW5kZWZpbmVkIDogZGF0ZTtcbn1cblxuLyoqXG4gKiBFcG9jaCBtaWxsaXNlY29uZHMgZm9yIGEgbnVtZXJpYyB2YWx1ZS9zdHJpbmcsIG9yIGB1bmRlZmluZWRgIHdoZW4gbm90IG9uZSxcbiAqIGFwcGx5aW5nIHRoZSBzZWNvbmRzLXZzLW1pbGxpcyBpbmZlcmVuY2UgYXQge0BsaW5rIFNFQ09ORFNfQ0VJTElOR30uXG4gKi9cbmZ1bmN0aW9uIHRvRXBvY2hNcyh2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG51bWVyaWMgPSB0b0JhcmVOdW1iZXIodmFsdWUpO1xuICBpZiAobnVtZXJpYyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gTWF0aC5hYnMobnVtZXJpYykgPCBTRUNPTkRTX0NFSUxJTkcgPyBudW1lcmljICogMTAwMCA6IG51bWVyaWM7XG59XG5cbi8qKlxuICogU3RydWN0dXJhbCBkZWVwLWVxdWFsaXR5IHdpdGggYW4gb3B0aW9uYWwgY3VzdG9tIGNvbXBhcmF0b3IuXG4gKlxuICoge0BsaW5rIGRlZXBFcXVhbH0gbWlycm9ycyB0aGUgc2VtYW50aWNzIG9mIHRoZSBgZmFzdC1kZWVwLWVxdWFsYFxuICogcGFja2FnZSAoaGFuZGxlZDogbmVzdGVkIHBsYWluIG9iamVjdHMvYXJyYXlzLCBgTWFwYCwgYFNldGAsIGBEYXRlYCxcbiAqIGBSZWdFeHBgLCB0eXBlZCBhcnJheXMsIGBOYU5gLCBhbmQgYCswYC9gLTBgIHRyZWF0ZWQgYXMgZXF1YWwpIGJ1dCBpc1xuICogZGVwZW5kZW5jeS1mcmVlIHNvIGBAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlYCBrZWVwcyBubyBydW50aW1lIGRlcHMuXG4gKlxuICogVGhlIG9wdGlvbmFsIGBjb21wYXJhdG9yYCBzaG9ydC1jaXJjdWl0cyB0aGUgc3RydWN0dXJhbCB3YWxrIGF0IGFueVxuICogbm9kZTogcmV0dXJuIGB0cnVlYC9gZmFsc2VgIHRvIGZvcmNlIHRoZSByZXN1bHQgZm9yIHRoYXQgcGFpciwgb3JcbiAqIGB1bmRlZmluZWRgIHRvIGRlZmVyIHRvIHRoZSBidWlsdC1pbiBjb21wYXJpc29uLiBJdCBpcyBpbnZva2VkIGZvciB0aGVcbiAqIHJvb3QgcGFpciBhbmQgcmVjdXJzaXZlbHkgZm9yIGVhY2ggbmVzdGVkIHBhaXIsIHNvIGEgY2FsbGVyIGNhbiwgZS5nLixcbiAqIGNvbXBhcmUgdHdvIGRvbWFpbiBvYmplY3RzIGJ5IGlkIHdoaWxlIGxldHRpbmcgZXZlcnl0aGluZyBlbHNlIGZhbGxcbiAqIGJhY2sgdG8gc3RydWN0dXJhbCBlcXVhbGl0eS5cbiAqXG4gKiBAZXhhbXBsZVxuICogZGVlcEVxdWFsKHsgYTogMSB9LCB7IGE6IDEgfSk7ICAgICAgICAgICAgICAgICAvLyB0cnVlXG4gKiBkZWVwRXF1YWwoWzEsIDJdLCBbMSwgMl0pOyAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVlXG4gKiBkZWVwRXF1YWwoYSwgYiwgKHgsIHkpID0+XG4gKiAgIGlzRW50aXR5KHgpICYmIGlzRW50aXR5KHkpID8geC5pZCA9PT0geS5pZCA6IHVuZGVmaW5lZCk7XG4gKi9cbmV4cG9ydCB0eXBlIERlZXBFcXVhbENvbXBhcmF0b3IgPSAoYTogdW5rbm93biwgYjogdW5rbm93bikgPT4gYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBFcXVhbChhOiB1bmtub3duLCBiOiB1bmtub3duLCBjb21wYXJhdG9yPzogRGVlcEVxdWFsQ29tcGFyYXRvcik6IGJvb2xlYW4ge1xuICBpZiAoY29tcGFyYXRvcikge1xuICAgIGNvbnN0IGRlY2lkZWQgPSBjb21wYXJhdG9yKGEsIGIpO1xuICAgIGlmIChkZWNpZGVkICE9PSB1bmRlZmluZWQpIHJldHVybiBkZWNpZGVkO1xuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuXG4gIGlmICh0eXBlb2YgYSAhPT0gXCJvYmplY3RcIiB8fCBhID09PSBudWxsIHx8IHR5cGVvZiBiICE9PSBcIm9iamVjdFwiIHx8IGIgPT09IG51bGwpIHtcbiAgICAvLyBOYU4gaXMgdGhlIG9ubHkgdmFsdWUgbm90IGVxdWFsIHRvIGl0c2VsZiB1bmRlciBgPT09YC5cbiAgICByZXR1cm4gYSAhPT0gYSAmJiBiICE9PSBiO1xuICB9XG5cbiAgaWYgKGEuY29uc3RydWN0b3IgIT09IGIuY29uc3RydWN0b3IpIHJldHVybiBmYWxzZTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgIGNvbnN0IGJBcnIgPSBiIGFzIHVua25vd25bXTtcbiAgICBpZiAoYS5sZW5ndGggIT09IGJBcnIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIWRlZXBFcXVhbChhW2ldLCBiQXJyW2ldLCBjb21wYXJhdG9yKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgY29uc3QgYk1hcCA9IGIgYXMgTWFwPHVua25vd24sIHVua25vd24+O1xuICAgIGlmIChhLnNpemUgIT09IGJNYXAuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGEpIHtcbiAgICAgIGlmICghYk1hcC5oYXMoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKCFkZWVwRXF1YWwodmFsdWUsIGJNYXAuZ2V0KGtleSksIGNvbXBhcmF0b3IpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGEgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICBjb25zdCBiU2V0ID0gYiBhcyBTZXQ8dW5rbm93bj47XG4gICAgaWYgKGEuc2l6ZSAhPT0gYlNldC5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhKSB7XG4gICAgICBpZiAoIWJTZXQuaGFzKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBhLmdldFRpbWUoKSA9PT0gKGIgYXMgRGF0ZSkuZ2V0VGltZSgpO1xuICB9XG5cbiAgaWYgKGEgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICBjb25zdCBiUmUgPSBiIGFzIFJlZ0V4cDtcbiAgICByZXR1cm4gYS5zb3VyY2UgPT09IGJSZS5zb3VyY2UgJiYgYS5mbGFncyA9PT0gYlJlLmZsYWdzO1xuICB9XG5cbiAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhhKSAmJiAhKGEgaW5zdGFuY2VvZiBEYXRhVmlldykpIHtcbiAgICBjb25zdCBhQXJyID0gYSBhcyB1bmtub3duIGFzIEFycmF5TGlrZTxudW1iZXI+O1xuICAgIGNvbnN0IGJBcnIgPSBiIGFzIHVua25vd24gYXMgQXJyYXlMaWtlPG51bWJlcj47XG4gICAgaWYgKGFBcnIubGVuZ3RoICE9PSBiQXJyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYUFyci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFBcnJbaV0gIT09IGJBcnJbaV0pIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBhS2V5cyA9IE9iamVjdC5rZXlzKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICBjb25zdCBiS2V5cyA9IE9iamVjdC5rZXlzKGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICBpZiAoYUtleXMubGVuZ3RoICE9PSBiS2V5cy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgZm9yIChjb25zdCBrZXkgb2YgYUtleXMpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKFxuICAgICAgIWRlZXBFcXVhbChcbiAgICAgICAgKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0sXG4gICAgICAgIChiIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldLFxuICAgICAgICBjb21wYXJhdG9yLFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbiJdfQ==
|