state-sync-log 0.9.0 → 0.10.0
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/CHANGELOG.md +5 -0
- package/README.md +368 -277
- package/dist/state-sync-log.esm.js +929 -136
- package/dist/state-sync-log.esm.mjs +929 -136
- package/dist/state-sync-log.umd.js +928 -135
- package/dist/types/createOps/constant.d.ts +6 -0
- package/dist/types/createOps/createOps.d.ts +25 -0
- package/dist/types/createOps/current.d.ts +13 -0
- package/dist/types/createOps/draft.d.ts +14 -0
- package/dist/types/createOps/draftify.d.ts +5 -0
- package/dist/types/createOps/index.d.ts +12 -0
- package/dist/types/createOps/interface.d.ts +74 -0
- package/dist/types/createOps/original.d.ts +15 -0
- package/dist/types/createOps/pushOp.d.ts +9 -0
- package/dist/types/createOps/setHelpers.d.ts +25 -0
- package/dist/types/createOps/utils.d.ts +95 -0
- package/dist/types/draft.d.ts +2 -2
- package/dist/types/index.d.ts +1 -0
- package/dist/types/json.d.ts +1 -1
- package/dist/types/operations.d.ts +2 -2
- package/dist/types/utils.d.ts +5 -0
- package/package.json +1 -1
- package/src/createOps/constant.ts +10 -0
- package/src/createOps/createOps.ts +97 -0
- package/src/createOps/current.ts +85 -0
- package/src/createOps/draft.ts +606 -0
- package/src/createOps/draftify.ts +45 -0
- package/src/createOps/index.ts +18 -0
- package/src/createOps/interface.ts +95 -0
- package/src/createOps/original.ts +24 -0
- package/src/createOps/pushOp.ts +42 -0
- package/src/createOps/setHelpers.ts +93 -0
- package/src/createOps/utils.ts +325 -0
- package/src/draft.ts +306 -288
- package/src/index.ts +1 -0
- package/src/json.ts +1 -1
- package/src/operations.ts +33 -11
- package/src/utils.ts +67 -55
|
@@ -1,28 +1,6 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
3
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
4
|
-
function getFinalizedEpochAndCheckpoint(yCheckpoint) {
|
|
5
|
-
let maxEpoch = -1;
|
|
6
|
-
let best = null;
|
|
7
|
-
let bestTxCount = -1;
|
|
8
|
-
let bestClientId = "";
|
|
9
|
-
for (const [key, cp] of yCheckpoint.entries()) {
|
|
10
|
-
const { epoch, clientId } = parseCheckpointKey(key);
|
|
11
|
-
if (epoch > maxEpoch) {
|
|
12
|
-
maxEpoch = epoch;
|
|
13
|
-
best = cp;
|
|
14
|
-
bestTxCount = cp.txCount;
|
|
15
|
-
bestClientId = clientId;
|
|
16
|
-
} else if (epoch === maxEpoch) {
|
|
17
|
-
if (cp.txCount > bestTxCount || cp.txCount === bestTxCount && clientId < bestClientId) {
|
|
18
|
-
best = cp;
|
|
19
|
-
bestTxCount = cp.txCount;
|
|
20
|
-
bestClientId = clientId;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
return { finalizedEpoch: maxEpoch, checkpoint: best };
|
|
25
|
-
}
|
|
26
4
|
class StateSyncLogError extends Error {
|
|
27
5
|
constructor(msg) {
|
|
28
6
|
super(msg);
|
|
@@ -32,88 +10,232 @@ class StateSyncLogError extends Error {
|
|
|
32
10
|
function failure(message) {
|
|
33
11
|
throw new StateSyncLogError(message);
|
|
34
12
|
}
|
|
35
|
-
|
|
36
|
-
|
|
13
|
+
const PROXY_DRAFT = /* @__PURE__ */ Symbol.for("__CREATEOPS_PROXY_DRAFT__");
|
|
14
|
+
var DraftType = /* @__PURE__ */ ((DraftType2) => {
|
|
15
|
+
DraftType2[DraftType2["Object"] = 0] = "Object";
|
|
16
|
+
DraftType2[DraftType2["Array"] = 1] = "Array";
|
|
17
|
+
return DraftType2;
|
|
18
|
+
})(DraftType || {});
|
|
19
|
+
function latest(proxyDraft) {
|
|
20
|
+
var _a;
|
|
21
|
+
return (_a = proxyDraft.copy) != null ? _a : proxyDraft.original;
|
|
37
22
|
}
|
|
38
|
-
function
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
23
|
+
function isDraft(target) {
|
|
24
|
+
return !!getProxyDraft(target);
|
|
25
|
+
}
|
|
26
|
+
function getProxyDraft(value) {
|
|
27
|
+
var _a;
|
|
28
|
+
if (typeof value !== "object" || value === null) return null;
|
|
29
|
+
return (_a = value[PROXY_DRAFT]) != null ? _a : null;
|
|
30
|
+
}
|
|
31
|
+
function getValue(value) {
|
|
32
|
+
var _a;
|
|
33
|
+
const proxyDraft = getProxyDraft(value);
|
|
34
|
+
return proxyDraft ? (_a = proxyDraft.copy) != null ? _a : proxyDraft.original : value;
|
|
35
|
+
}
|
|
36
|
+
function isDraftable(value) {
|
|
37
|
+
if (value === null || typeof value !== "object") return false;
|
|
38
|
+
return Array.isArray(value) || Object.getPrototypeOf(value) === Object.prototype;
|
|
39
|
+
}
|
|
40
|
+
function getType(target) {
|
|
41
|
+
return Array.isArray(target) ? DraftType.Array : DraftType.Object;
|
|
42
|
+
}
|
|
43
|
+
function get(target, key) {
|
|
44
|
+
return target[key];
|
|
45
|
+
}
|
|
46
|
+
function set(target, key, value) {
|
|
47
|
+
target[key] = value;
|
|
48
|
+
}
|
|
49
|
+
function has(target, key) {
|
|
50
|
+
return Object.hasOwn(target, key);
|
|
51
|
+
}
|
|
52
|
+
function peek(target, key) {
|
|
53
|
+
const state = getProxyDraft(target);
|
|
54
|
+
const source = state ? latest(state) : target;
|
|
55
|
+
return source[key];
|
|
56
|
+
}
|
|
57
|
+
function isEqual(x, y) {
|
|
58
|
+
if (x === y) {
|
|
59
|
+
return x !== 0 || 1 / x === 1 / y;
|
|
43
60
|
}
|
|
44
|
-
return
|
|
45
|
-
epoch: Number.parseInt(key.substring(0, i1), 10),
|
|
46
|
-
txCount: Number.parseInt(key.substring(i1 + 1, i2), 10),
|
|
47
|
-
clientId: key.substring(i2 + 1)
|
|
48
|
-
};
|
|
61
|
+
return x !== x && y !== y;
|
|
49
62
|
}
|
|
50
|
-
function
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
while (endIndex > 0 && sortedTxs[endIndex - 1].txTimestamp.epoch > activeEpoch) {
|
|
56
|
-
endIndex--;
|
|
63
|
+
function revokeProxy(proxyDraft) {
|
|
64
|
+
if (!proxyDraft) return;
|
|
65
|
+
while (proxyDraft.finalities.revoke.length > 0) {
|
|
66
|
+
const revoke = proxyDraft.finalities.revoke.pop();
|
|
67
|
+
revoke();
|
|
57
68
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
69
|
+
}
|
|
70
|
+
function getPath(target, path = []) {
|
|
71
|
+
var _a;
|
|
72
|
+
if (Object.hasOwn(target, "key") && target.key !== void 0) {
|
|
73
|
+
const parentCopy = (_a = target.parent) == null ? void 0 : _a.copy;
|
|
74
|
+
if (parentCopy) {
|
|
75
|
+
const proxyDraft = getProxyDraft(get(parentCopy, target.key));
|
|
76
|
+
if (proxyDraft !== null && proxyDraft.original !== target.original) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
path.push(target.key);
|
|
61
81
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
82
|
+
if (target.parent) {
|
|
83
|
+
return getPath(target.parent, path);
|
|
84
|
+
}
|
|
85
|
+
path.reverse();
|
|
86
|
+
return path;
|
|
87
|
+
}
|
|
88
|
+
function getPathOrThrow(target) {
|
|
89
|
+
const path = getPath(target);
|
|
90
|
+
if (!path) {
|
|
91
|
+
throw failure("Cannot determine path for operation");
|
|
92
|
+
}
|
|
93
|
+
return path;
|
|
94
|
+
}
|
|
95
|
+
function getAllPathsForDraft(rootDraft, targetDraft) {
|
|
96
|
+
const result = [];
|
|
97
|
+
function search(current2, currentPath) {
|
|
98
|
+
if (current2 === targetDraft) {
|
|
99
|
+
result.push([...currentPath]);
|
|
68
100
|
}
|
|
69
|
-
const
|
|
70
|
-
if (
|
|
71
|
-
|
|
72
|
-
|
|
101
|
+
const source = latest(current2);
|
|
102
|
+
if (!source || typeof source !== "object") return;
|
|
103
|
+
const keys = Array.isArray(source) ? Array.from({ length: source.length }, (_, i) => i) : Object.keys(source);
|
|
104
|
+
for (const key of keys) {
|
|
105
|
+
const value = source[key];
|
|
106
|
+
const childDraft = getProxyDraft(value);
|
|
107
|
+
if (childDraft) {
|
|
108
|
+
search(childDraft, [...currentPath, key]);
|
|
109
|
+
}
|
|
73
110
|
}
|
|
74
|
-
newWatermarks[ts.clientId] = newWm;
|
|
75
|
-
txCount++;
|
|
76
111
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
112
|
+
search(rootDraft, []);
|
|
113
|
+
return result;
|
|
114
|
+
}
|
|
115
|
+
function getDescriptor(target, key) {
|
|
116
|
+
if (key in target) {
|
|
117
|
+
let prototype = Reflect.getPrototypeOf(target);
|
|
118
|
+
while (prototype) {
|
|
119
|
+
const descriptor = Reflect.getOwnPropertyDescriptor(prototype, key);
|
|
120
|
+
if (descriptor) return descriptor;
|
|
121
|
+
prototype = Reflect.getPrototypeOf(prototype);
|
|
80
122
|
}
|
|
81
123
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
keysToDelete.push(entry.txTimestampKey);
|
|
124
|
+
return void 0;
|
|
125
|
+
}
|
|
126
|
+
const propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
127
|
+
function shallowCopy(original2) {
|
|
128
|
+
if (Array.isArray(original2)) {
|
|
129
|
+
return Array.prototype.concat.call(original2);
|
|
130
|
+
}
|
|
131
|
+
const copy = {};
|
|
132
|
+
for (const key of Object.keys(original2)) {
|
|
133
|
+
copy[key] = original2[key];
|
|
134
|
+
}
|
|
135
|
+
for (const key of Object.getOwnPropertySymbols(original2)) {
|
|
136
|
+
if (propIsEnum.call(original2, key)) {
|
|
137
|
+
copy[key] = original2[key];
|
|
138
|
+
}
|
|
98
139
|
}
|
|
99
|
-
|
|
140
|
+
return copy;
|
|
100
141
|
}
|
|
101
|
-
function
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
142
|
+
function ensureShallowCopy(target) {
|
|
143
|
+
var _a;
|
|
144
|
+
if (target.copy) return;
|
|
145
|
+
target.copy = shallowCopy(target.original);
|
|
146
|
+
target.assignedMap = (_a = target.assignedMap) != null ? _a : /* @__PURE__ */ new Map();
|
|
147
|
+
}
|
|
148
|
+
function deepClone$1(target) {
|
|
149
|
+
if (!isDraftable(target)) {
|
|
150
|
+
return isDraft(target) ? getValue(target) : target;
|
|
151
|
+
}
|
|
152
|
+
if (Array.isArray(target)) {
|
|
153
|
+
return target.map(deepClone$1);
|
|
154
|
+
}
|
|
155
|
+
const copy = {};
|
|
156
|
+
for (const key in target) {
|
|
157
|
+
if (has(target, key)) {
|
|
158
|
+
copy[key] = deepClone$1(target[key]);
|
|
109
159
|
}
|
|
110
160
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
161
|
+
return copy;
|
|
162
|
+
}
|
|
163
|
+
function markChanged(target) {
|
|
164
|
+
if (!target.operated) {
|
|
165
|
+
target.operated = true;
|
|
166
|
+
if (target.parent) {
|
|
167
|
+
markChanged(target.parent);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
function forEach(target, callback) {
|
|
172
|
+
if (Array.isArray(target)) {
|
|
173
|
+
for (let i = 0; i < target.length; i++) {
|
|
174
|
+
callback(i, target[i], target);
|
|
175
|
+
}
|
|
176
|
+
} else {
|
|
177
|
+
for (const key of Reflect.ownKeys(target)) {
|
|
178
|
+
callback(key, target[key], target);
|
|
114
179
|
}
|
|
115
180
|
}
|
|
116
181
|
}
|
|
182
|
+
function handleValue(target, handledSet) {
|
|
183
|
+
if (!isDraftable(target) || isDraft(target) || handledSet.has(target) || Object.isFrozen(target)) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
handledSet.add(target);
|
|
187
|
+
forEach(target, (key, value) => {
|
|
188
|
+
var _a;
|
|
189
|
+
if (isDraft(value)) {
|
|
190
|
+
const proxyDraft = getProxyDraft(value);
|
|
191
|
+
ensureShallowCopy(proxyDraft);
|
|
192
|
+
const updatedValue = ((_a = proxyDraft.assignedMap) == null ? void 0 : _a.size) || proxyDraft.operated ? proxyDraft.copy : proxyDraft.original;
|
|
193
|
+
set(target, key, updatedValue);
|
|
194
|
+
} else {
|
|
195
|
+
handleValue(value, handledSet);
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
function getCurrent(target) {
|
|
200
|
+
const proxyDraft = getProxyDraft(target);
|
|
201
|
+
if (!isDraftable(target)) return target;
|
|
202
|
+
if (proxyDraft && !proxyDraft.operated) {
|
|
203
|
+
return proxyDraft.original;
|
|
204
|
+
}
|
|
205
|
+
let currentValue;
|
|
206
|
+
function ensureShallowCopyLocal() {
|
|
207
|
+
currentValue = shallowCopy(target);
|
|
208
|
+
}
|
|
209
|
+
if (proxyDraft) {
|
|
210
|
+
proxyDraft.finalized = true;
|
|
211
|
+
try {
|
|
212
|
+
ensureShallowCopyLocal();
|
|
213
|
+
} finally {
|
|
214
|
+
proxyDraft.finalized = false;
|
|
215
|
+
}
|
|
216
|
+
} else {
|
|
217
|
+
currentValue = target;
|
|
218
|
+
}
|
|
219
|
+
forEach(currentValue, (key, value) => {
|
|
220
|
+
if (proxyDraft && isEqual(get(proxyDraft.original, key), value)) {
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
const newValue = getCurrent(value);
|
|
224
|
+
if (newValue !== value) {
|
|
225
|
+
if (currentValue === target) {
|
|
226
|
+
ensureShallowCopyLocal();
|
|
227
|
+
}
|
|
228
|
+
set(currentValue, key, newValue);
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
return currentValue;
|
|
232
|
+
}
|
|
233
|
+
function current(target) {
|
|
234
|
+
if (!isDraft(target)) {
|
|
235
|
+
throw new Error(`current() is only used for Draft, parameter: ${target}`);
|
|
236
|
+
}
|
|
237
|
+
return getCurrent(target);
|
|
238
|
+
}
|
|
117
239
|
function getDefaultExportFromCjs(x) {
|
|
118
240
|
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
|
|
119
241
|
}
|
|
@@ -381,6 +503,636 @@ function lazy(fn) {
|
|
|
381
503
|
return value;
|
|
382
504
|
};
|
|
383
505
|
}
|
|
506
|
+
function parseArrayIndex(key) {
|
|
507
|
+
const n = Number(key);
|
|
508
|
+
if (!Number.isInteger(n) || n < 0) {
|
|
509
|
+
return null;
|
|
510
|
+
}
|
|
511
|
+
return n;
|
|
512
|
+
}
|
|
513
|
+
function pushOp(proxyDraft, op) {
|
|
514
|
+
const rootDraft = proxyDraft.finalities.rootDraft;
|
|
515
|
+
if (!rootDraft) {
|
|
516
|
+
throw failure("rootDraft is not set - cannot emit op");
|
|
517
|
+
}
|
|
518
|
+
if (proxyDraft.aliasCount <= 1) {
|
|
519
|
+
proxyDraft.finalities.ops.push(op);
|
|
520
|
+
return;
|
|
521
|
+
}
|
|
522
|
+
const allPaths = getAllPathsForDraft(rootDraft, proxyDraft);
|
|
523
|
+
for (const path of allPaths) {
|
|
524
|
+
const adjustedOp = { ...op, path };
|
|
525
|
+
proxyDraft.finalities.ops.push(adjustedOp);
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
function incAliasCount(value) {
|
|
529
|
+
const draft = getProxyDraft(value);
|
|
530
|
+
if (draft) draft.aliasCount++;
|
|
531
|
+
}
|
|
532
|
+
function decAliasCount(value) {
|
|
533
|
+
const draft = getProxyDraft(value);
|
|
534
|
+
if (draft) draft.aliasCount--;
|
|
535
|
+
}
|
|
536
|
+
function normalizeIndex(index, len, defaultValue) {
|
|
537
|
+
if (index === void 0) return defaultValue;
|
|
538
|
+
return index < 0 ? Math.max(len + index, 0) : Math.min(index, len);
|
|
539
|
+
}
|
|
540
|
+
const MUTATING_ARRAY_METHODS = /* @__PURE__ */ new Set([
|
|
541
|
+
"push",
|
|
542
|
+
"pop",
|
|
543
|
+
"shift",
|
|
544
|
+
"unshift",
|
|
545
|
+
"splice",
|
|
546
|
+
"sort",
|
|
547
|
+
"reverse",
|
|
548
|
+
"fill",
|
|
549
|
+
"copyWithin"
|
|
550
|
+
]);
|
|
551
|
+
function createArrayMethodWrapper(proxyDraft, proxyRef, method) {
|
|
552
|
+
return function(...args) {
|
|
553
|
+
ensureShallowCopy(proxyDraft);
|
|
554
|
+
markChanged(proxyDraft);
|
|
555
|
+
const arr = proxyDraft.copy;
|
|
556
|
+
const originalLength = arr.length;
|
|
557
|
+
const proxy = proxyRef;
|
|
558
|
+
switch (method) {
|
|
559
|
+
case "push": {
|
|
560
|
+
for (const arg of args) {
|
|
561
|
+
incAliasCount(arg);
|
|
562
|
+
}
|
|
563
|
+
const result = arr.push(...args);
|
|
564
|
+
pushOp(proxyDraft, {
|
|
565
|
+
kind: "splice",
|
|
566
|
+
path: getPathOrThrow(proxyDraft),
|
|
567
|
+
index: originalLength,
|
|
568
|
+
deleteCount: 0,
|
|
569
|
+
inserts: args.map(deepClone$1)
|
|
570
|
+
});
|
|
571
|
+
return result;
|
|
572
|
+
}
|
|
573
|
+
case "pop": {
|
|
574
|
+
if (originalLength === 0) {
|
|
575
|
+
return arr.pop();
|
|
576
|
+
}
|
|
577
|
+
const returnValue = proxy[originalLength - 1];
|
|
578
|
+
decAliasCount(arr[originalLength - 1]);
|
|
579
|
+
arr.pop();
|
|
580
|
+
pushOp(proxyDraft, {
|
|
581
|
+
kind: "splice",
|
|
582
|
+
path: getPathOrThrow(proxyDraft),
|
|
583
|
+
index: originalLength - 1,
|
|
584
|
+
deleteCount: 1,
|
|
585
|
+
inserts: []
|
|
586
|
+
});
|
|
587
|
+
return returnValue;
|
|
588
|
+
}
|
|
589
|
+
case "shift": {
|
|
590
|
+
if (originalLength === 0) {
|
|
591
|
+
return arr.shift();
|
|
592
|
+
}
|
|
593
|
+
const returnValue = proxy[0];
|
|
594
|
+
decAliasCount(arr[0]);
|
|
595
|
+
arr.shift();
|
|
596
|
+
pushOp(proxyDraft, {
|
|
597
|
+
kind: "splice",
|
|
598
|
+
path: getPathOrThrow(proxyDraft),
|
|
599
|
+
index: 0,
|
|
600
|
+
deleteCount: 1,
|
|
601
|
+
inserts: []
|
|
602
|
+
});
|
|
603
|
+
return returnValue;
|
|
604
|
+
}
|
|
605
|
+
case "unshift": {
|
|
606
|
+
for (const arg of args) {
|
|
607
|
+
incAliasCount(arg);
|
|
608
|
+
}
|
|
609
|
+
const result = arr.unshift(...args);
|
|
610
|
+
pushOp(proxyDraft, {
|
|
611
|
+
kind: "splice",
|
|
612
|
+
path: getPathOrThrow(proxyDraft),
|
|
613
|
+
index: 0,
|
|
614
|
+
deleteCount: 0,
|
|
615
|
+
inserts: args.map(deepClone$1)
|
|
616
|
+
});
|
|
617
|
+
return result;
|
|
618
|
+
}
|
|
619
|
+
case "splice": {
|
|
620
|
+
const start = args[0];
|
|
621
|
+
const deleteCountArg = args[1];
|
|
622
|
+
const inserts = args.slice(2);
|
|
623
|
+
const index = start === void 0 ? 0 : start < 0 ? Math.max(originalLength + start, 0) : start;
|
|
624
|
+
const deleteCount = deleteCountArg != null ? deleteCountArg : originalLength - index;
|
|
625
|
+
const returnValues = [];
|
|
626
|
+
for (let i = 0; i < deleteCount && index + i < originalLength; i++) {
|
|
627
|
+
returnValues.push(proxy[index + i]);
|
|
628
|
+
decAliasCount(arr[index + i]);
|
|
629
|
+
}
|
|
630
|
+
for (const insert of inserts) {
|
|
631
|
+
incAliasCount(insert);
|
|
632
|
+
}
|
|
633
|
+
arr.splice(...args);
|
|
634
|
+
pushOp(proxyDraft, {
|
|
635
|
+
kind: "splice",
|
|
636
|
+
path: getPathOrThrow(proxyDraft),
|
|
637
|
+
index: start != null ? start : 0,
|
|
638
|
+
deleteCount: deleteCountArg != null ? deleteCountArg : originalLength,
|
|
639
|
+
inserts: inserts.map(deepClone$1)
|
|
640
|
+
});
|
|
641
|
+
return returnValues;
|
|
642
|
+
}
|
|
643
|
+
case "fill": {
|
|
644
|
+
const fillValue = args[0];
|
|
645
|
+
const startArg = args[1];
|
|
646
|
+
const endArg = args[2];
|
|
647
|
+
const len = originalLength;
|
|
648
|
+
const start = normalizeIndex(startArg, len, 0);
|
|
649
|
+
const end = normalizeIndex(endArg, len, len);
|
|
650
|
+
const fillCount = end - start;
|
|
651
|
+
if (fillCount > 0) {
|
|
652
|
+
const fillValues = Array(fillCount).fill(fillValue);
|
|
653
|
+
proxy.splice(start, fillCount, ...fillValues);
|
|
654
|
+
}
|
|
655
|
+
return proxy;
|
|
656
|
+
}
|
|
657
|
+
case "sort": {
|
|
658
|
+
const compareFn = args[0];
|
|
659
|
+
const sorted = [...arr].sort(compareFn);
|
|
660
|
+
if (originalLength > 0) {
|
|
661
|
+
proxy.splice(0, originalLength, ...sorted);
|
|
662
|
+
}
|
|
663
|
+
return proxy;
|
|
664
|
+
}
|
|
665
|
+
case "reverse": {
|
|
666
|
+
const reversed = [...arr].reverse();
|
|
667
|
+
if (originalLength > 0) {
|
|
668
|
+
proxy.splice(0, originalLength, ...reversed);
|
|
669
|
+
}
|
|
670
|
+
return proxy;
|
|
671
|
+
}
|
|
672
|
+
case "copyWithin": {
|
|
673
|
+
const targetArg = args[0];
|
|
674
|
+
const startArg = args[1];
|
|
675
|
+
const endArg = args[2];
|
|
676
|
+
const len = originalLength;
|
|
677
|
+
const targetIdx = normalizeIndex(targetArg, len, 0);
|
|
678
|
+
const startIdx = normalizeIndex(startArg, len, 0);
|
|
679
|
+
const endIdx = normalizeIndex(endArg, len, len);
|
|
680
|
+
const copyCount = Math.min(endIdx - startIdx, len - targetIdx);
|
|
681
|
+
if (copyCount > 0) {
|
|
682
|
+
const elementsToCopy = arr.slice(startIdx, startIdx + copyCount);
|
|
683
|
+
proxy.splice(targetIdx, copyCount, ...elementsToCopy);
|
|
684
|
+
}
|
|
685
|
+
return proxy;
|
|
686
|
+
}
|
|
687
|
+
default:
|
|
688
|
+
return arr[method](...args);
|
|
689
|
+
}
|
|
690
|
+
};
|
|
691
|
+
}
|
|
692
|
+
const proxyHandler = {
|
|
693
|
+
get(target, key, receiver) {
|
|
694
|
+
var _a, _b;
|
|
695
|
+
const copy = (_a = target.copy) == null ? void 0 : _a[key];
|
|
696
|
+
if (copy && target.finalities.draftsCache.has(copy)) {
|
|
697
|
+
return copy;
|
|
698
|
+
}
|
|
699
|
+
if (key === PROXY_DRAFT) return target;
|
|
700
|
+
const source = latest(target);
|
|
701
|
+
if (target.type === DraftType.Array && typeof key === "string" && MUTATING_ARRAY_METHODS.has(key)) {
|
|
702
|
+
const originalMethod = source[key];
|
|
703
|
+
if (typeof originalMethod === "function") {
|
|
704
|
+
return createArrayMethodWrapper(target, receiver, key);
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
if (!has(source, key)) {
|
|
708
|
+
const desc = getDescriptor(source, key);
|
|
709
|
+
return desc ? "value" in desc ? desc.value : (_b = desc.get) == null ? void 0 : _b.call(target.proxy) : void 0;
|
|
710
|
+
}
|
|
711
|
+
const value = source[key];
|
|
712
|
+
if (target.finalized || !isDraftable(value)) {
|
|
713
|
+
return value;
|
|
714
|
+
}
|
|
715
|
+
if (value === peek(target.original, key)) {
|
|
716
|
+
ensureShallowCopy(target);
|
|
717
|
+
const nestedKey = target.type === DraftType.Array ? Number(key) : key;
|
|
718
|
+
target.copy[key] = createDraft$1({
|
|
719
|
+
original: target.original[key],
|
|
720
|
+
parentDraft: target,
|
|
721
|
+
key: nestedKey,
|
|
722
|
+
finalities: target.finalities
|
|
723
|
+
});
|
|
724
|
+
return target.copy[key];
|
|
725
|
+
}
|
|
726
|
+
if (isDraft(value)) {
|
|
727
|
+
target.finalities.draftsCache.add(value);
|
|
728
|
+
}
|
|
729
|
+
return value;
|
|
730
|
+
},
|
|
731
|
+
set(target, key, value) {
|
|
732
|
+
var _a;
|
|
733
|
+
if (typeof key === "symbol") {
|
|
734
|
+
throw new Error(`Cannot set symbol properties on drafts`);
|
|
735
|
+
}
|
|
736
|
+
let opKey = key;
|
|
737
|
+
if (target.type === DraftType.Array) {
|
|
738
|
+
if (key === "length") {
|
|
739
|
+
opKey = "length";
|
|
740
|
+
} else {
|
|
741
|
+
const numKey = typeof key === "number" ? key : parseArrayIndex(key);
|
|
742
|
+
if (numKey === null) {
|
|
743
|
+
throw new Error(`Only supports setting array indices and the 'length' property.`);
|
|
744
|
+
}
|
|
745
|
+
opKey = numKey;
|
|
746
|
+
const source = latest(target);
|
|
747
|
+
if (numKey > source.length) {
|
|
748
|
+
throw new Error(
|
|
749
|
+
`Cannot create sparse array. Index ${numKey} is out of bounds for array of length ${source.length}.`
|
|
750
|
+
);
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
const desc = getDescriptor(latest(target), key);
|
|
755
|
+
if (desc == null ? void 0 : desc.set) {
|
|
756
|
+
desc.set.call(target.proxy, value);
|
|
757
|
+
return true;
|
|
758
|
+
}
|
|
759
|
+
const current2 = peek(latest(target), key);
|
|
760
|
+
const currentProxyDraft = getProxyDraft(current2);
|
|
761
|
+
if (currentProxyDraft && isEqual(currentProxyDraft.original, value)) {
|
|
762
|
+
target.copy[key] = value;
|
|
763
|
+
target.assignedMap = (_a = target.assignedMap) != null ? _a : /* @__PURE__ */ new Map();
|
|
764
|
+
target.assignedMap.set(key, false);
|
|
765
|
+
return true;
|
|
766
|
+
}
|
|
767
|
+
if (isEqual(value, current2) && (value !== void 0 || has(target.original, key))) {
|
|
768
|
+
return true;
|
|
769
|
+
}
|
|
770
|
+
ensureShallowCopy(target);
|
|
771
|
+
markChanged(target);
|
|
772
|
+
if (has(target.original, key) && isEqual(value, target.original[key])) {
|
|
773
|
+
target.assignedMap.delete(key);
|
|
774
|
+
} else {
|
|
775
|
+
target.assignedMap.set(key, true);
|
|
776
|
+
}
|
|
777
|
+
const copy = target.copy;
|
|
778
|
+
decAliasCount(copy[key]);
|
|
779
|
+
incAliasCount(value);
|
|
780
|
+
copy[key] = value;
|
|
781
|
+
if (target.type === DraftType.Array && opKey === "length") {
|
|
782
|
+
const oldLength = target.original.length;
|
|
783
|
+
const newLength = value;
|
|
784
|
+
if (newLength !== oldLength) {
|
|
785
|
+
pushOp(target, {
|
|
786
|
+
kind: "set",
|
|
787
|
+
path: getPathOrThrow(target),
|
|
788
|
+
key: "length",
|
|
789
|
+
value: newLength
|
|
790
|
+
});
|
|
791
|
+
}
|
|
792
|
+
} else {
|
|
793
|
+
pushOp(target, {
|
|
794
|
+
kind: "set",
|
|
795
|
+
path: getPathOrThrow(target),
|
|
796
|
+
key: opKey,
|
|
797
|
+
value: deepClone$1(value)
|
|
798
|
+
});
|
|
799
|
+
}
|
|
800
|
+
return true;
|
|
801
|
+
},
|
|
802
|
+
has(target, key) {
|
|
803
|
+
return key in latest(target);
|
|
804
|
+
},
|
|
805
|
+
ownKeys(target) {
|
|
806
|
+
return Reflect.ownKeys(latest(target));
|
|
807
|
+
},
|
|
808
|
+
getOwnPropertyDescriptor(target, key) {
|
|
809
|
+
const source = latest(target);
|
|
810
|
+
const descriptor = Reflect.getOwnPropertyDescriptor(source, key);
|
|
811
|
+
if (!descriptor) return descriptor;
|
|
812
|
+
return {
|
|
813
|
+
writable: true,
|
|
814
|
+
configurable: target.type !== DraftType.Array || key !== "length",
|
|
815
|
+
enumerable: descriptor.enumerable,
|
|
816
|
+
value: source[key]
|
|
817
|
+
};
|
|
818
|
+
},
|
|
819
|
+
getPrototypeOf(target) {
|
|
820
|
+
return Reflect.getPrototypeOf(target.original);
|
|
821
|
+
},
|
|
822
|
+
setPrototypeOf() {
|
|
823
|
+
throw new Error(`Cannot call 'setPrototypeOf()' on drafts`);
|
|
824
|
+
},
|
|
825
|
+
defineProperty() {
|
|
826
|
+
throw new Error(`Cannot call 'defineProperty()' on drafts`);
|
|
827
|
+
},
|
|
828
|
+
deleteProperty(target, key) {
|
|
829
|
+
var _a;
|
|
830
|
+
if (typeof key === "symbol") {
|
|
831
|
+
throw new Error(`Cannot delete symbol properties from drafts`);
|
|
832
|
+
}
|
|
833
|
+
if (target.type === DraftType.Array) {
|
|
834
|
+
return proxyHandler.set.call(this, target, key, void 0, target.proxy);
|
|
835
|
+
}
|
|
836
|
+
const current2 = peek(latest(target), key);
|
|
837
|
+
const existed = current2 !== void 0 || key in target.original;
|
|
838
|
+
if (existed) {
|
|
839
|
+
ensureShallowCopy(target);
|
|
840
|
+
markChanged(target);
|
|
841
|
+
target.assignedMap.set(key, false);
|
|
842
|
+
pushOp(target, {
|
|
843
|
+
kind: "delete",
|
|
844
|
+
path: getPathOrThrow(target),
|
|
845
|
+
key
|
|
846
|
+
});
|
|
847
|
+
const copy = target.copy;
|
|
848
|
+
decAliasCount(copy[key]);
|
|
849
|
+
delete copy[key];
|
|
850
|
+
} else {
|
|
851
|
+
target.assignedMap = (_a = target.assignedMap) != null ? _a : /* @__PURE__ */ new Map();
|
|
852
|
+
target.assignedMap.delete(key);
|
|
853
|
+
}
|
|
854
|
+
return true;
|
|
855
|
+
}
|
|
856
|
+
};
|
|
857
|
+
function createDraft$1(options) {
|
|
858
|
+
const { original: original2, parentDraft, key, finalities } = options;
|
|
859
|
+
const type = getType(original2);
|
|
860
|
+
const proxyDraft = {
|
|
861
|
+
type,
|
|
862
|
+
finalized: false,
|
|
863
|
+
parent: parentDraft != null ? parentDraft : null,
|
|
864
|
+
original: original2,
|
|
865
|
+
copy: null,
|
|
866
|
+
proxy: null,
|
|
867
|
+
finalities,
|
|
868
|
+
aliasCount: 1
|
|
869
|
+
};
|
|
870
|
+
if (key !== void 0 || "key" in options) {
|
|
871
|
+
proxyDraft.key = key;
|
|
872
|
+
}
|
|
873
|
+
const { proxy, revoke } = Proxy.revocable(
|
|
874
|
+
type === DraftType.Array ? Object.assign([], proxyDraft) : proxyDraft,
|
|
875
|
+
proxyHandler
|
|
876
|
+
);
|
|
877
|
+
finalities.revoke.push(revoke);
|
|
878
|
+
proxyDraft.proxy = proxy;
|
|
879
|
+
if (parentDraft) {
|
|
880
|
+
parentDraft.finalities.draft.push(() => {
|
|
881
|
+
const copy = parentDraft.copy;
|
|
882
|
+
if (!copy) return;
|
|
883
|
+
const draft = get(copy, key);
|
|
884
|
+
const childProxyDraft = getProxyDraft(draft);
|
|
885
|
+
if (childProxyDraft) {
|
|
886
|
+
let updatedValue = childProxyDraft.original;
|
|
887
|
+
if (childProxyDraft.operated) {
|
|
888
|
+
updatedValue = getValue(draft);
|
|
889
|
+
}
|
|
890
|
+
childProxyDraft.finalized = true;
|
|
891
|
+
set(copy, key, updatedValue);
|
|
892
|
+
}
|
|
893
|
+
});
|
|
894
|
+
}
|
|
895
|
+
return proxy;
|
|
896
|
+
}
|
|
897
|
+
function finalizeDraft(result, returnedValue) {
|
|
898
|
+
var _a;
|
|
899
|
+
const proxyDraft = getProxyDraft(result);
|
|
900
|
+
const hasReturnedValue = returnedValue.length > 0;
|
|
901
|
+
if (proxyDraft == null ? void 0 : proxyDraft.operated) {
|
|
902
|
+
while (proxyDraft.finalities.draft.length > 0) {
|
|
903
|
+
const finalize = proxyDraft.finalities.draft.pop();
|
|
904
|
+
finalize();
|
|
905
|
+
}
|
|
906
|
+
proxyDraft.finalized = true;
|
|
907
|
+
}
|
|
908
|
+
const state = hasReturnedValue ? returnedValue[0] : proxyDraft ? proxyDraft.operated ? proxyDraft.copy : proxyDraft.original : result;
|
|
909
|
+
if (proxyDraft && state && typeof state === "object") {
|
|
910
|
+
handleValue(state, proxyDraft.finalities.handledSet);
|
|
911
|
+
}
|
|
912
|
+
const ops = (_a = proxyDraft == null ? void 0 : proxyDraft.finalities.ops) != null ? _a : [];
|
|
913
|
+
if (proxyDraft) {
|
|
914
|
+
revokeProxy(proxyDraft);
|
|
915
|
+
}
|
|
916
|
+
return [state, ops];
|
|
917
|
+
}
|
|
918
|
+
function draftify(baseState) {
|
|
919
|
+
const finalities = {
|
|
920
|
+
draft: [],
|
|
921
|
+
revoke: [],
|
|
922
|
+
handledSet: /* @__PURE__ */ new WeakSet(),
|
|
923
|
+
draftsCache: /* @__PURE__ */ new WeakSet(),
|
|
924
|
+
ops: [],
|
|
925
|
+
rootDraft: null
|
|
926
|
+
// Will be set by createDraft
|
|
927
|
+
};
|
|
928
|
+
if (!isDraftable(baseState)) {
|
|
929
|
+
throw new Error(`createOps() only supports plain objects and arrays.`);
|
|
930
|
+
}
|
|
931
|
+
const draft = createDraft$1({
|
|
932
|
+
original: baseState,
|
|
933
|
+
parentDraft: null,
|
|
934
|
+
finalities
|
|
935
|
+
});
|
|
936
|
+
finalities.rootDraft = getProxyDraft(draft);
|
|
937
|
+
return [
|
|
938
|
+
draft,
|
|
939
|
+
(returnedValue = []) => {
|
|
940
|
+
return finalizeDraft(draft, returnedValue);
|
|
941
|
+
}
|
|
942
|
+
];
|
|
943
|
+
}
|
|
944
|
+
function createOps(base, mutate) {
|
|
945
|
+
const state = isDraft(base) ? current(base) : base;
|
|
946
|
+
if (!isDraftable(state)) {
|
|
947
|
+
throw new Error(`createOps() only supports plain objects and arrays.`);
|
|
948
|
+
}
|
|
949
|
+
const [draft, finalize] = draftify(state);
|
|
950
|
+
let result;
|
|
951
|
+
try {
|
|
952
|
+
result = mutate(draft);
|
|
953
|
+
} catch (error) {
|
|
954
|
+
revokeProxy(getProxyDraft(draft));
|
|
955
|
+
throw error;
|
|
956
|
+
}
|
|
957
|
+
const proxyDraft = getProxyDraft(draft);
|
|
958
|
+
if (result !== void 0 && !isDraft(result)) {
|
|
959
|
+
if (!isEqual(result, draft) && proxyDraft.operated) {
|
|
960
|
+
throw new Error(
|
|
961
|
+
`Either the value is returned as a new non-draft value, or only the draft is modified without returning any value.`
|
|
962
|
+
);
|
|
963
|
+
}
|
|
964
|
+
if (result !== void 0) {
|
|
965
|
+
const [, ops2] = finalize([]);
|
|
966
|
+
return { nextState: result, ops: ops2 };
|
|
967
|
+
}
|
|
968
|
+
}
|
|
969
|
+
if (result === draft || result === void 0) {
|
|
970
|
+
const [nextState2, ops2] = finalize([]);
|
|
971
|
+
return { nextState: nextState2, ops: ops2 };
|
|
972
|
+
}
|
|
973
|
+
const returnedProxyDraft = getProxyDraft(result);
|
|
974
|
+
if (returnedProxyDraft) {
|
|
975
|
+
if (returnedProxyDraft.operated) {
|
|
976
|
+
throw new Error(`Cannot return a modified child draft.`);
|
|
977
|
+
}
|
|
978
|
+
const [, ops2] = finalize([]);
|
|
979
|
+
return { nextState: current(result), ops: ops2 };
|
|
980
|
+
}
|
|
981
|
+
const [nextState, ops] = finalize([]);
|
|
982
|
+
return { nextState, ops };
|
|
983
|
+
}
|
|
984
|
+
function original(target) {
|
|
985
|
+
const proxyDraft = getProxyDraft(target);
|
|
986
|
+
if (!proxyDraft) {
|
|
987
|
+
throw new Error(`original() is only used for a draft, parameter: ${target}`);
|
|
988
|
+
}
|
|
989
|
+
return proxyDraft.original;
|
|
990
|
+
}
|
|
991
|
+
function addToSet(draft, value) {
|
|
992
|
+
const proxyDraft = getProxyDraft(draft);
|
|
993
|
+
if (!proxyDraft) {
|
|
994
|
+
throw new Error(`addToSet() can only be used on draft arrays`);
|
|
995
|
+
}
|
|
996
|
+
ensureShallowCopy(proxyDraft);
|
|
997
|
+
markChanged(proxyDraft);
|
|
998
|
+
const arr = proxyDraft.copy;
|
|
999
|
+
if (arr.some((item) => item === value || deepEqual(item, value))) {
|
|
1000
|
+
return;
|
|
1001
|
+
}
|
|
1002
|
+
arr.push(value);
|
|
1003
|
+
pushOp(proxyDraft, {
|
|
1004
|
+
kind: "addToSet",
|
|
1005
|
+
path: getPathOrThrow(proxyDraft),
|
|
1006
|
+
value: deepClone(value)
|
|
1007
|
+
});
|
|
1008
|
+
}
|
|
1009
|
+
function deleteFromSet(draft, value) {
|
|
1010
|
+
const proxyDraft = getProxyDraft(draft);
|
|
1011
|
+
if (!proxyDraft) {
|
|
1012
|
+
throw new Error(`deleteFromSet() can only be used on draft arrays`);
|
|
1013
|
+
}
|
|
1014
|
+
ensureShallowCopy(proxyDraft);
|
|
1015
|
+
markChanged(proxyDraft);
|
|
1016
|
+
const arr = proxyDraft.copy;
|
|
1017
|
+
const hasValue = arr.some((item) => item === value || deepEqual(item, value));
|
|
1018
|
+
if (!hasValue) {
|
|
1019
|
+
return;
|
|
1020
|
+
}
|
|
1021
|
+
for (let i = arr.length - 1; i >= 0; i--) {
|
|
1022
|
+
if (arr[i] === value || deepEqual(arr[i], value)) {
|
|
1023
|
+
arr.splice(i, 1);
|
|
1024
|
+
}
|
|
1025
|
+
}
|
|
1026
|
+
pushOp(proxyDraft, {
|
|
1027
|
+
kind: "deleteFromSet",
|
|
1028
|
+
path: getPathOrThrow(proxyDraft),
|
|
1029
|
+
value: deepClone(value)
|
|
1030
|
+
});
|
|
1031
|
+
}
|
|
1032
|
+
function getFinalizedEpochAndCheckpoint(yCheckpoint) {
|
|
1033
|
+
let maxEpoch = -1;
|
|
1034
|
+
let best = null;
|
|
1035
|
+
let bestTxCount = -1;
|
|
1036
|
+
let bestClientId = "";
|
|
1037
|
+
for (const [key, cp] of yCheckpoint.entries()) {
|
|
1038
|
+
const { epoch, clientId } = parseCheckpointKey(key);
|
|
1039
|
+
if (epoch > maxEpoch) {
|
|
1040
|
+
maxEpoch = epoch;
|
|
1041
|
+
best = cp;
|
|
1042
|
+
bestTxCount = cp.txCount;
|
|
1043
|
+
bestClientId = clientId;
|
|
1044
|
+
} else if (epoch === maxEpoch) {
|
|
1045
|
+
if (cp.txCount > bestTxCount || cp.txCount === bestTxCount && clientId < bestClientId) {
|
|
1046
|
+
best = cp;
|
|
1047
|
+
bestTxCount = cp.txCount;
|
|
1048
|
+
bestClientId = clientId;
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
}
|
|
1052
|
+
return { finalizedEpoch: maxEpoch, checkpoint: best };
|
|
1053
|
+
}
|
|
1054
|
+
function checkpointKeyDataToKey(data) {
|
|
1055
|
+
return `${data.epoch};${data.txCount};${data.clientId}`;
|
|
1056
|
+
}
|
|
1057
|
+
function parseCheckpointKey(key) {
|
|
1058
|
+
const i1 = key.indexOf(";");
|
|
1059
|
+
const i2 = key.indexOf(";", i1 + 1);
|
|
1060
|
+
if (i1 === -1 || i2 === -1) {
|
|
1061
|
+
failure(`Malformed checkpoint key: ${key}`);
|
|
1062
|
+
}
|
|
1063
|
+
return {
|
|
1064
|
+
epoch: Number.parseInt(key.substring(0, i1), 10),
|
|
1065
|
+
txCount: Number.parseInt(key.substring(i1 + 1, i2), 10),
|
|
1066
|
+
clientId: key.substring(i2 + 1)
|
|
1067
|
+
};
|
|
1068
|
+
}
|
|
1069
|
+
function createCheckpoint(yTx, yCheckpoint, clientState, activeEpoch, currentState, myClientId) {
|
|
1070
|
+
const { checkpoint: prevCP } = getFinalizedEpochAndCheckpoint(yCheckpoint);
|
|
1071
|
+
const newWatermarks = prevCP ? { ...prevCP.watermarks } : {};
|
|
1072
|
+
const sortedTxs = clientState.stateCalculator.getSortedTxs();
|
|
1073
|
+
let endIndex = sortedTxs.length;
|
|
1074
|
+
while (endIndex > 0 && sortedTxs[endIndex - 1].txTimestamp.epoch > activeEpoch) {
|
|
1075
|
+
endIndex--;
|
|
1076
|
+
}
|
|
1077
|
+
const activeTxs = sortedTxs.slice(0, endIndex);
|
|
1078
|
+
if (activeTxs.length === 0) {
|
|
1079
|
+
return;
|
|
1080
|
+
}
|
|
1081
|
+
let minWallClock = Number.POSITIVE_INFINITY;
|
|
1082
|
+
let txCount = 0;
|
|
1083
|
+
for (const entry of activeTxs) {
|
|
1084
|
+
const ts = entry.txTimestamp;
|
|
1085
|
+
if (ts.wallClock < minWallClock) {
|
|
1086
|
+
minWallClock = ts.wallClock;
|
|
1087
|
+
}
|
|
1088
|
+
const newWm = newWatermarks[ts.clientId] ? { ...newWatermarks[ts.clientId] } : { maxClock: -1, maxWallClock: 0 };
|
|
1089
|
+
if (ts.clock > newWm.maxClock) {
|
|
1090
|
+
newWm.maxClock = ts.clock;
|
|
1091
|
+
newWm.maxWallClock = ts.wallClock;
|
|
1092
|
+
}
|
|
1093
|
+
newWatermarks[ts.clientId] = newWm;
|
|
1094
|
+
txCount++;
|
|
1095
|
+
}
|
|
1096
|
+
for (const clientId in newWatermarks) {
|
|
1097
|
+
if (minWallClock - newWatermarks[clientId].maxWallClock > clientState.retentionWindowMs) {
|
|
1098
|
+
delete newWatermarks[clientId];
|
|
1099
|
+
}
|
|
1100
|
+
}
|
|
1101
|
+
const cpKey = checkpointKeyDataToKey({
|
|
1102
|
+
epoch: activeEpoch,
|
|
1103
|
+
txCount,
|
|
1104
|
+
clientId: myClientId
|
|
1105
|
+
});
|
|
1106
|
+
yCheckpoint.set(cpKey, {
|
|
1107
|
+
state: currentState,
|
|
1108
|
+
// Responsibility for cloning is moved to the caller if needed
|
|
1109
|
+
watermarks: newWatermarks,
|
|
1110
|
+
txCount,
|
|
1111
|
+
minWallClock
|
|
1112
|
+
});
|
|
1113
|
+
const keysToDelete = [];
|
|
1114
|
+
for (const entry of activeTxs) {
|
|
1115
|
+
yTx.delete(entry.txTimestampKey);
|
|
1116
|
+
keysToDelete.push(entry.txTimestampKey);
|
|
1117
|
+
}
|
|
1118
|
+
clientState.stateCalculator.removeTxs(keysToDelete);
|
|
1119
|
+
}
|
|
1120
|
+
function pruneCheckpoints(yCheckpoint, finalizedEpoch) {
|
|
1121
|
+
let canonicalKey = null;
|
|
1122
|
+
let bestTxCount = -1;
|
|
1123
|
+
for (const [key] of yCheckpoint.entries()) {
|
|
1124
|
+
const { epoch, txCount } = parseCheckpointKey(key);
|
|
1125
|
+
if (epoch === finalizedEpoch && txCount > bestTxCount) {
|
|
1126
|
+
canonicalKey = key;
|
|
1127
|
+
bestTxCount = txCount;
|
|
1128
|
+
}
|
|
1129
|
+
}
|
|
1130
|
+
for (const key of yCheckpoint.keys()) {
|
|
1131
|
+
if (key !== canonicalKey) {
|
|
1132
|
+
yCheckpoint.delete(key);
|
|
1133
|
+
}
|
|
1134
|
+
}
|
|
1135
|
+
}
|
|
384
1136
|
function createDraft(base) {
|
|
385
1137
|
return {
|
|
386
1138
|
root: base,
|
|
@@ -419,46 +1171,62 @@ function ensureOwnedPath(ctx, path) {
|
|
|
419
1171
|
if (path.length === 0) {
|
|
420
1172
|
return ctx.root;
|
|
421
1173
|
}
|
|
422
|
-
let
|
|
1174
|
+
let current2 = ctx.root;
|
|
423
1175
|
for (let i = 0; i < path.length; i++) {
|
|
424
1176
|
const segment = path[i];
|
|
425
1177
|
const isArrayIndex = typeof segment === "number";
|
|
426
1178
|
if (isArrayIndex) {
|
|
427
|
-
if (!Array.isArray(
|
|
1179
|
+
if (!Array.isArray(current2)) {
|
|
428
1180
|
failure(`Expected array at path segment ${segment}`);
|
|
429
1181
|
}
|
|
430
|
-
if (segment < 0 || segment >=
|
|
1182
|
+
if (segment < 0 || segment >= current2.length) {
|
|
431
1183
|
failure(`Index ${segment} out of bounds`);
|
|
432
1184
|
}
|
|
433
1185
|
} else {
|
|
434
|
-
if (!isObject(
|
|
1186
|
+
if (!isObject(current2) || Array.isArray(current2)) {
|
|
435
1187
|
failure(`Expected object at path segment "${segment}"`);
|
|
436
1188
|
}
|
|
437
|
-
if (!(segment in
|
|
1189
|
+
if (!(segment in current2)) {
|
|
438
1190
|
failure(`Property "${segment}" does not exist`);
|
|
439
1191
|
}
|
|
440
1192
|
}
|
|
441
|
-
const child =
|
|
1193
|
+
const child = current2[segment];
|
|
442
1194
|
if (child === null || typeof child !== "object") {
|
|
443
1195
|
failure(`Cannot traverse through primitive at path segment ${segment}`);
|
|
444
1196
|
}
|
|
445
|
-
|
|
1197
|
+
current2 = ensureOwned(ctx, current2, segment, child);
|
|
446
1198
|
}
|
|
447
|
-
return
|
|
1199
|
+
return current2;
|
|
448
1200
|
}
|
|
449
1201
|
function draftSet(ctx, path, key, value) {
|
|
450
1202
|
const container = ensureOwnedPath(ctx, path);
|
|
451
|
-
if (
|
|
452
|
-
failure("set requires object container");
|
|
1203
|
+
if (!isObject(container)) {
|
|
1204
|
+
failure("set requires object or array container");
|
|
1205
|
+
}
|
|
1206
|
+
let finalKey = key;
|
|
1207
|
+
if (Array.isArray(container) && typeof key === "string" && key !== "length") {
|
|
1208
|
+
const numKey = parseArrayIndex(key);
|
|
1209
|
+
if (numKey === null) {
|
|
1210
|
+
failure(`Cannot set non-numeric property "${key}" on array`);
|
|
1211
|
+
}
|
|
1212
|
+
finalKey = numKey;
|
|
453
1213
|
}
|
|
454
|
-
container[
|
|
1214
|
+
container[finalKey] = value;
|
|
455
1215
|
}
|
|
456
1216
|
function draftDelete(ctx, path, key) {
|
|
457
1217
|
const container = ensureOwnedPath(ctx, path);
|
|
458
|
-
if (
|
|
459
|
-
failure("delete requires object container");
|
|
1218
|
+
if (!isObject(container)) {
|
|
1219
|
+
failure("delete requires object or array container");
|
|
1220
|
+
}
|
|
1221
|
+
let finalKey = key;
|
|
1222
|
+
if (Array.isArray(container) && typeof key === "string") {
|
|
1223
|
+
const numKey = parseArrayIndex(key);
|
|
1224
|
+
if (numKey === null) {
|
|
1225
|
+
failure(`Cannot delete non-numeric property "${key}" from array`);
|
|
1226
|
+
}
|
|
1227
|
+
finalKey = numKey;
|
|
460
1228
|
}
|
|
461
|
-
delete container[
|
|
1229
|
+
delete container[finalKey];
|
|
462
1230
|
}
|
|
463
1231
|
function draftSplice(ctx, path, index, deleteCount, inserts) {
|
|
464
1232
|
const container = ensureOwnedPath(ctx, path);
|
|
@@ -535,50 +1303,50 @@ function computeReconcileOps(currentState, targetState) {
|
|
|
535
1303
|
diffValue(currentState, targetState, [], ops);
|
|
536
1304
|
return ops;
|
|
537
1305
|
}
|
|
538
|
-
function diffValue(
|
|
539
|
-
if (
|
|
540
|
-
const currentType = typeof
|
|
1306
|
+
function diffValue(current2, target, path, ops) {
|
|
1307
|
+
if (current2 === target) return;
|
|
1308
|
+
const currentType = typeof current2;
|
|
541
1309
|
const targetType = typeof target;
|
|
542
|
-
if (
|
|
1310
|
+
if (current2 === null || target === null || currentType !== "object" || targetType !== "object") {
|
|
543
1311
|
emitReplace(path, target, ops);
|
|
544
1312
|
return;
|
|
545
1313
|
}
|
|
546
|
-
const currentIsArray = Array.isArray(
|
|
1314
|
+
const currentIsArray = Array.isArray(current2);
|
|
547
1315
|
const targetIsArray = Array.isArray(target);
|
|
548
1316
|
if (currentIsArray !== targetIsArray) {
|
|
549
1317
|
emitReplace(path, target, ops);
|
|
550
1318
|
return;
|
|
551
1319
|
}
|
|
552
1320
|
if (currentIsArray) {
|
|
553
|
-
diffArray(
|
|
1321
|
+
diffArray(current2, target, path, ops);
|
|
554
1322
|
} else {
|
|
555
|
-
diffObject(
|
|
1323
|
+
diffObject(current2, target, path, ops);
|
|
556
1324
|
}
|
|
557
1325
|
}
|
|
558
|
-
function diffObject(
|
|
559
|
-
for (const key in
|
|
560
|
-
if (Object.hasOwn(
|
|
1326
|
+
function diffObject(current2, target, path, ops) {
|
|
1327
|
+
for (const key in current2) {
|
|
1328
|
+
if (Object.hasOwn(current2, key) && !Object.hasOwn(target, key)) {
|
|
561
1329
|
ops.push({ kind: "delete", path, key });
|
|
562
1330
|
}
|
|
563
1331
|
}
|
|
564
1332
|
for (const key in target) {
|
|
565
1333
|
if (Object.hasOwn(target, key)) {
|
|
566
1334
|
const targetVal = target[key];
|
|
567
|
-
if (!Object.hasOwn(
|
|
1335
|
+
if (!Object.hasOwn(current2, key)) {
|
|
568
1336
|
ops.push({ kind: "set", path, key, value: targetVal });
|
|
569
|
-
} else if (
|
|
570
|
-
diffValue(
|
|
1337
|
+
} else if (current2[key] !== targetVal) {
|
|
1338
|
+
diffValue(current2[key], targetVal, [...path, key], ops);
|
|
571
1339
|
}
|
|
572
1340
|
}
|
|
573
1341
|
}
|
|
574
1342
|
}
|
|
575
|
-
function diffArray(
|
|
576
|
-
const currentLen =
|
|
1343
|
+
function diffArray(current2, target, path, ops) {
|
|
1344
|
+
const currentLen = current2.length;
|
|
577
1345
|
const targetLen = target.length;
|
|
578
1346
|
const minLen = currentLen < targetLen ? currentLen : targetLen;
|
|
579
1347
|
for (let i = 0; i < minLen; i++) {
|
|
580
|
-
if (
|
|
581
|
-
diffValue(
|
|
1348
|
+
if (current2[i] !== target[i]) {
|
|
1349
|
+
diffValue(current2[i], target[i], [...path, i], ops);
|
|
582
1350
|
}
|
|
583
1351
|
}
|
|
584
1352
|
if (targetLen > currentLen) {
|
|
@@ -1254,43 +2022,61 @@ function createStateSyncLog(options) {
|
|
|
1254
2022
|
};
|
|
1255
2023
|
}
|
|
1256
2024
|
function resolvePath(state, path) {
|
|
1257
|
-
let
|
|
2025
|
+
let current2 = state;
|
|
1258
2026
|
for (const segment of path) {
|
|
1259
2027
|
if (typeof segment === "string") {
|
|
1260
|
-
if (!isObject(
|
|
2028
|
+
if (!isObject(current2) || Array.isArray(current2)) {
|
|
1261
2029
|
failure(`Expected object at path segment "${segment}"`);
|
|
1262
2030
|
}
|
|
1263
|
-
if (!(segment in
|
|
2031
|
+
if (!(segment in current2)) {
|
|
1264
2032
|
failure(`Property "${segment}" does not exist`);
|
|
1265
2033
|
}
|
|
1266
|
-
|
|
2034
|
+
current2 = current2[segment];
|
|
1267
2035
|
} else {
|
|
1268
|
-
if (!Array.isArray(
|
|
2036
|
+
if (!Array.isArray(current2)) {
|
|
1269
2037
|
failure(`Expected array at path segment ${segment}`);
|
|
1270
2038
|
}
|
|
1271
|
-
if (segment < 0 || segment >=
|
|
2039
|
+
if (segment < 0 || segment >= current2.length) {
|
|
1272
2040
|
failure(`Index ${segment} out of bounds`);
|
|
1273
2041
|
}
|
|
1274
|
-
|
|
2042
|
+
current2 = current2[segment];
|
|
1275
2043
|
}
|
|
1276
2044
|
}
|
|
1277
|
-
return
|
|
2045
|
+
return current2;
|
|
1278
2046
|
}
|
|
1279
2047
|
function applyOp(state, op, cloneValues) {
|
|
1280
2048
|
const container = resolvePath(state, op.path);
|
|
1281
2049
|
switch (op.kind) {
|
|
1282
|
-
case "set":
|
|
1283
|
-
if (!isObject(container)
|
|
1284
|
-
failure("set requires object container");
|
|
2050
|
+
case "set": {
|
|
2051
|
+
if (!isObject(container)) {
|
|
2052
|
+
failure("set requires object or array container");
|
|
2053
|
+
}
|
|
2054
|
+
let key = op.key;
|
|
2055
|
+
if (Array.isArray(container) && typeof key === "string" && key !== "length") {
|
|
2056
|
+
const numKey = parseArrayIndex(key);
|
|
2057
|
+
if (numKey === null) {
|
|
2058
|
+
failure(`Cannot set non-numeric property "${key}" on array`);
|
|
2059
|
+
}
|
|
2060
|
+
key = numKey;
|
|
1285
2061
|
}
|
|
1286
|
-
container[
|
|
2062
|
+
container[key] = cloneValues ? deepClone(op.value) : op.value;
|
|
1287
2063
|
break;
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
2064
|
+
}
|
|
2065
|
+
case "delete": {
|
|
2066
|
+
if (!isObject(container)) {
|
|
2067
|
+
failure("delete requires object or array container");
|
|
1291
2068
|
}
|
|
1292
|
-
|
|
2069
|
+
let key = op.key;
|
|
2070
|
+
if (Array.isArray(container) && typeof key === "string") {
|
|
2071
|
+
const numKey = parseArrayIndex(key);
|
|
2072
|
+
if (numKey === null) {
|
|
2073
|
+
failure(`Cannot delete non-numeric property "${key}" from array`);
|
|
2074
|
+
}
|
|
2075
|
+
key = numKey;
|
|
2076
|
+
}
|
|
2077
|
+
delete container[key];
|
|
1293
2078
|
break;
|
|
2079
|
+
}
|
|
1294
2080
|
case "splice": {
|
|
1295
2081
|
if (!Array.isArray(container)) {
|
|
1296
2082
|
failure("splice requires array container");
|
|
@@ -1333,7 +2119,14 @@ function applyOps(ops, target, options) {
|
|
|
1333
2119
|
}
|
|
1334
2120
|
}
|
|
1335
2121
|
export {
|
|
2122
|
+
addToSet,
|
|
1336
2123
|
applyOps,
|
|
1337
|
-
|
|
2124
|
+
createOps,
|
|
2125
|
+
createStateSyncLog,
|
|
2126
|
+
current,
|
|
2127
|
+
deleteFromSet,
|
|
2128
|
+
isDraft,
|
|
2129
|
+
isDraftable,
|
|
2130
|
+
original
|
|
1338
2131
|
};
|
|
1339
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUtc3luYy1sb2cuZXNtLm1qcyIsInNvdXJjZXMiOlsiLi4vc3JjL2NoZWNrcG9pbnRVdGlscy50cyIsIi4uL3NyYy9lcnJvci50cyIsIi4uL3NyYy9jaGVja3BvaW50cy50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9mYXN0LWRlZXAtZXF1YWxAMy4xLjMvbm9kZV9tb2R1bGVzL2Zhc3QtZGVlcC1lcXVhbC9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9uYW5vaWRANS4xLjYvbm9kZV9tb2R1bGVzL25hbm9pZC91cmwtYWxwaGFiZXQvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vbmFub2lkQDUuMS42L25vZGVfbW9kdWxlcy9uYW5vaWQvaW5kZXguYnJvd3Nlci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9yZmRjQDEuNC4xL25vZGVfbW9kdWxlcy9yZmRjL2luZGV4LmpzIiwiLi4vc3JjL3V0aWxzLnRzIiwiLi4vc3JjL2RyYWZ0LnRzIiwiLi4vc3JjL3JlY29uY2lsZS50cyIsIi4uL3NyYy90eFRpbWVzdGFtcC50cyIsIi4uL3NyYy9Tb3J0ZWRUeEVudHJ5LnRzIiwiLi4vc3JjL1N0YXRlQ2FsY3VsYXRvci50cyIsIi4uL3NyYy9jbGllbnRTdGF0ZS50cyIsIi4uL3NyYy90eExvZy50cyIsIi4uL3NyYy9jcmVhdGVTdGF0ZVN5bmNMb2cudHMiLCIuLi9zcmMvb3BlcmF0aW9ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgdHlwZSBDaGVja3BvaW50UmVjb3JkLCBwYXJzZUNoZWNrcG9pbnRLZXkgfSBmcm9tIFwiLi9jaGVja3BvaW50c1wiXG5cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgZmluYWxpemVkIGVwb2NoIGFuZCBpdHMgY2Fub25pY2FsIGNoZWNrcG9pbnQgaW4gYSBzaW5nbGUgcGFzcy5cbiAqXG4gKiBQb2xpY3kgQTogVGhlIGZpbmFsaXplZCBlcG9jaCBpcyB0aGUgbW9zdCByZWNlbnQgZXBvY2ggd2l0aCBhIGNoZWNrcG9pbnQuXG4gKiBDYW5vbmljYWwgY2hlY2twb2ludDogVGhlIGNoZWNrcG9pbnQgd2l0aCBoaWdoZXN0IHR4Q291bnQgZm9yIHRoYXQgZXBvY2hcbiAqICh0aWUtYnJlYWs6IGxvd2VzdCBjbGllbnRJZCBhbHBoYWJldGljYWxseSkuXG4gKlxuICogUmV0dXJucyB7IGZpbmFsaXplZEVwb2NoOiAtMSwgY2hlY2twb2ludDogbnVsbCB9IGlmIG5vIGNoZWNrcG9pbnRzIGV4aXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmluYWxpemVkRXBvY2hBbmRDaGVja3BvaW50KHlDaGVja3BvaW50OiBZLk1hcDxDaGVja3BvaW50UmVjb3JkPik6IHtcbiAgZmluYWxpemVkRXBvY2g6IG51bWJlclxuICBjaGVja3BvaW50OiBDaGVja3BvaW50UmVjb3JkIHwgbnVsbFxufSB7XG4gIGxldCBtYXhFcG9jaCA9IC0xXG4gIGxldCBiZXN0OiBDaGVja3BvaW50UmVjb3JkIHwgbnVsbCA9IG51bGxcbiAgbGV0IGJlc3RUeENvdW50ID0gLTFcbiAgbGV0IGJlc3RDbGllbnRJZCA9IFwiXCJcblxuICBmb3IgKGNvbnN0IFtrZXksIGNwXSBvZiB5Q2hlY2twb2ludC5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCB7IGVwb2NoLCBjbGllbnRJZCB9ID0gcGFyc2VDaGVja3BvaW50S2V5KGtleSlcblxuICAgIGlmIChlcG9jaCA+IG1heEVwb2NoKSB7XG4gICAgICAvLyBOZXcgaGlnaGVzdCBlcG9jaCAtIHJlc2V0IGJlc3QgY2hlY2twb2ludCB0cmFja2luZ1xuICAgICAgbWF4RXBvY2ggPSBlcG9jaFxuICAgICAgYmVzdCA9IGNwXG4gICAgICBiZXN0VHhDb3VudCA9IGNwLnR4Q291bnRcbiAgICAgIGJlc3RDbGllbnRJZCA9IGNsaWVudElkXG4gICAgfSBlbHNlIGlmIChlcG9jaCA9PT0gbWF4RXBvY2gpIHtcbiAgICAgIC8vIFNhbWUgZXBvY2ggLSBjaGVjayBpZiB0aGlzIGlzIGEgYmV0dGVyIGNhbm9uaWNhbCBjaGVja3BvaW50XG4gICAgICAvLyBQcmltYXJ5OiBoaWdoZXIgdHhDb3VudCB3aW5zXG4gICAgICAvLyBTZWNvbmRhcnkgKHRpZS1icmVhayk6IGxvd2VyIGNsaWVudElkIChhbHBoYWJldGljYWxseSkgd2luc1xuICAgICAgaWYgKGNwLnR4Q291bnQgPiBiZXN0VHhDb3VudCB8fCAoY3AudHhDb3VudCA9PT0gYmVzdFR4Q291bnQgJiYgY2xpZW50SWQgPCBiZXN0Q2xpZW50SWQpKSB7XG4gICAgICAgIGJlc3QgPSBjcFxuICAgICAgICBiZXN0VHhDb3VudCA9IGNwLnR4Q291bnRcbiAgICAgICAgYmVzdENsaWVudElkID0gY2xpZW50SWRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBmaW5hbGl6ZWRFcG9jaDogbWF4RXBvY2gsIGNoZWNrcG9pbnQ6IGJlc3QgfVxufVxuIiwiZXhwb3J0IGNsYXNzIFN0YXRlU3luY0xvZ0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZykge1xuICAgIHN1cGVyKG1zZylcblxuICAgIC8vIFNldCB0aGUgcHJvdG90eXBlIGV4cGxpY2l0bHkgZm9yIGJldHRlciBpbnN0YW5jZW9mIHN1cHBvcnRcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgU3RhdGVTeW5jTG9nRXJyb3IucHJvdG90eXBlKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmYWlsdXJlKG1lc3NhZ2U6IHN0cmluZyk6IG5ldmVyIHtcbiAgdGhyb3cgbmV3IFN0YXRlU3luY0xvZ0Vycm9yKG1lc3NhZ2UpXG59XG4iLCJpbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgQ2xpZW50SWQgfSBmcm9tIFwiLi9DbGllbnRJZFwiXG5pbXBvcnQgeyBnZXRGaW5hbGl6ZWRFcG9jaEFuZENoZWNrcG9pbnQgfSBmcm9tIFwiLi9jaGVja3BvaW50VXRpbHNcIlxuaW1wb3J0IHsgQ2xpZW50U3RhdGUgfSBmcm9tIFwiLi9jbGllbnRTdGF0ZVwiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4vZXJyb3JcIlxuaW1wb3J0IHsgSlNPTk9iamVjdCB9IGZyb20gXCIuL2pzb25cIlxuaW1wb3J0IHsgVHhSZWNvcmQgfSBmcm9tIFwiLi9UeFJlY29yZFwiXG5pbXBvcnQgeyBUeFRpbWVzdGFtcEtleSB9IGZyb20gXCIuL3R4VGltZXN0YW1wXCJcblxuLyoqXG4gKiBXYXRlcm1hcmtpbmcgZm9yIGRlZHVwbGljYXRpb24gYW5kIHBydW5pbmcuXG4gKiAtIG1heENsb2NrOiBBbGwgdHhzIGZyb20gdGhpcyBjbGllbnQgd2l0aCBjbG9jayA8PSBtYXhDbG9jayBhcmUgRklOQUxJWkVELlxuICogLSBtYXhXYWxsQ2xvY2s6IFRoZSBsYXN0IHRpbWUgd2Ugc2F3IHRoaXMgY2xpZW50IGFjdGl2ZSAoZm9yIHBydW5pbmcpLlxuICovXG50eXBlIENsaWVudFdhdGVybWFyayA9IFJlYWRvbmx5PHtcbiAgbWF4Q2xvY2s6IG51bWJlclxuICBtYXhXYWxsQ2xvY2s6IG51bWJlclxufT5cblxuLyoqXG4gKiBXYXRlcm1hcmtzIGZvciBhbGwgY2xpZW50cy5cbiAqL1xuZXhwb3J0IHR5cGUgQ2xpZW50V2F0ZXJtYXJrcyA9IFJlY29yZDxDbGllbnRJZCwgQ2xpZW50V2F0ZXJtYXJrPlxuXG4vKipcbiAqIEEgc25hcHNob3Qgb2YgdGhlIHN0YXRlIGF0IHRoZSBlbmQgb2YgYSBzcGVjaWZpYyBlcG9jaC5cbiAqL1xuZXhwb3J0IHR5cGUgQ2hlY2twb2ludFJlY29yZCA9IHtcbiAgc3RhdGU6IEpTT05PYmplY3QgLy8gVGhlIGRvY3VtZW50IHN0YXRlXG4gIHdhdGVybWFya3M6IENsaWVudFdhdGVybWFya3MgLy8gRGVkdXAvUHJ1bmluZyBpbmZvXG4gIHR4Q291bnQ6IG51bWJlciAvLyBUaWUtYnJlYWtlciBmb3IgY2Fub25pY2FsIHNlbGVjdGlvblxuICBtaW5XYWxsQ2xvY2s6IG51bWJlciAvLyBSZWZlcmVuY2UgdGltZSBmb3IgdGhpcyBlcG9jaCAoZGV0ZXJtaW5pc3RpYyBwcnVuaW5nKVxufVxuXG4vKipcbiAqIFVuaXF1ZSBJRCBmb3IgYSBjaGVja3BvaW50LlxuICogRm9ybWF0OiBgJHtlcG9jaH07JHt0eENvdW50fTske2NsaWVudElkfWBcbiAqL1xuZXhwb3J0IHR5cGUgQ2hlY2twb2ludEtleSA9IHN0cmluZ1xuXG4vKipcbiAqIERhdGEgZXh0cmFjdGVkIGZyb20gYSBjaGVja3BvaW50IGtleS5cbiAqL1xuZXhwb3J0IHR5cGUgQ2hlY2twb2ludEtleURhdGEgPSB7XG4gIGVwb2NoOiBudW1iZXJcbiAgdHhDb3VudDogbnVtYmVyXG4gIGNsaWVudElkOiBDbGllbnRJZFxufVxuXG4vKipcbiAqIENvbnZlcnRzIGNoZWNrcG9pbnQga2V5IGRhdGEgY29tcG9uZW50cyB0byBhIGtleSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrcG9pbnRLZXlEYXRhVG9LZXkoZGF0YTogQ2hlY2twb2ludEtleURhdGEpOiBDaGVja3BvaW50S2V5IHtcbiAgcmV0dXJuIGAke2RhdGEuZXBvY2h9OyR7ZGF0YS50eENvdW50fTske2RhdGEuY2xpZW50SWR9YFxufVxuXG4vKipcbiAqIEhlbHBlciB0byBwYXJzZSBjaGVja3BvaW50IGtleXMuXG4gKiBDaGVja3BvaW50IGtleXMgaGF2ZSBmb3JtYXQ6IGAke2Vwb2NofTske3R4Q291bnR9OyR7Y2xpZW50SWR9YFxuICogVGhyb3dzIGlmIGtleSBpcyBtYWxmb3JtZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNoZWNrcG9pbnRLZXkoa2V5OiBDaGVja3BvaW50S2V5KTogQ2hlY2twb2ludEtleURhdGEge1xuICBjb25zdCBpMSA9IGtleS5pbmRleE9mKFwiO1wiKVxuICBjb25zdCBpMiA9IGtleS5pbmRleE9mKFwiO1wiLCBpMSArIDEpXG5cbiAgaWYgKGkxID09PSAtMSB8fCBpMiA9PT0gLTEpIHtcbiAgICBmYWlsdXJlKGBNYWxmb3JtZWQgY2hlY2twb2ludCBrZXk6ICR7a2V5fWApXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGVwb2NoOiBOdW1iZXIucGFyc2VJbnQoa2V5LnN1YnN0cmluZygwLCBpMSksIDEwKSxcbiAgICB0eENvdW50OiBOdW1iZXIucGFyc2VJbnQoa2V5LnN1YnN0cmluZyhpMSArIDEsIGkyKSwgMTApLFxuICAgIGNsaWVudElkOiBrZXkuc3Vic3RyaW5nKGkyICsgMSksXG4gIH1cbn1cblxuLyoqXG4gKiBDYWxsZWQgcGVyaW9kaWNhbGx5IChlLmcuIGJ5IGEgc2VydmVyIG9yIGxlYWRlciBjbGllbnQpIHRvIGZpbmFsaXplIHRoZSBlcG9jaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNoZWNrcG9pbnQoXG4gIHlUeDogWS5NYXA8VHhSZWNvcmQ+LFxuICB5Q2hlY2twb2ludDogWS5NYXA8Q2hlY2twb2ludFJlY29yZD4sXG4gIGNsaWVudFN0YXRlOiBDbGllbnRTdGF0ZSxcbiAgYWN0aXZlRXBvY2g6IG51bWJlcixcbiAgY3VycmVudFN0YXRlOiBKU09OT2JqZWN0LFxuICBteUNsaWVudElkOiBzdHJpbmdcbik6IHZvaWQge1xuICAvLyAxLiBTdGFydCB3aXRoIHByZXZpb3VzIHdhdGVybWFya3MgKGZyb20gZmluYWxpemVkIGVwb2NoID0gYWN0aXZlRXBvY2ggLSAxKVxuICBjb25zdCB7IGNoZWNrcG9pbnQ6IHByZXZDUCB9ID0gZ2V0RmluYWxpemVkRXBvY2hBbmRDaGVja3BvaW50KHlDaGVja3BvaW50KVxuICBjb25zdCBuZXdXYXRlcm1hcmtzID0gcHJldkNQID8geyAuLi5wcmV2Q1Aud2F0ZXJtYXJrcyB9IDoge31cblxuICAvLyBHZXQgYWN0aXZlIHR4cyB1c2luZyBjYWNoZWQgc29ydGVkIG9yZGVyIChmaWx0ZXIgYnkgZXBvY2gpXG4gIC8vIEZJTFRFUiBJUyBSRVFVSVJFRDpcbiAgLy8gQWx0aG91Z2ggd2UgYXJlIGZpbmFsaXppbmcgJ2FjdGl2ZUVwb2NoJywgb3RoZXIgcGVlcnMgbWF5IGhhdmUgYWxyZWFkeVxuICAvLyBhZHZhbmNlZCB0byB0aGUgbmV4dCBlcG9jaCBhbmQgc3RhcnRlZCBzeW5jaW5nIHRob3NlIHR4cy5cbiAgLy8gV2UgbXVzdCBlbnN1cmUgdGhpcyBjaGVja3BvaW50IE9OTFkgY29udGFpbnMgdHhzIGZyb20gJ2FjdGl2ZUVwb2NoJy5cbiAgLy8gVXNpbmcgc3RhdGVDYWxjdWxhdG9yLmdldFNvcnRlZFR4cyBhdm9pZHMgcmVkdW5kYW50IGtleSBwYXJzaW5nICh0aW1lc3RhbXBzIGFyZSBjYWNoZWQpLlxuICAvL1xuICAvLyBPUFRJTUlaQVRJT046IFNpbmNlIHNvcnRlZFR4cyBpcyBzb3J0ZWQgYnkgZXBvY2ggKHByaW1hcnkga2V5KSBhbmQgcGFzdCBlcG9jaHNcbiAgLy8gYXJlIHBydW5lZCwgd2Ugb25seSBuZWVkIHRvIGZpbmQgdGhlIHJpZ2h0IGJvdW5kYXJ5LiBGdXR1cmUgZXBvY2hzIGFyZSByYXJlLFxuICAvLyBzbyBhIHNpbXBsZSBsaW5lYXIgc2VhcmNoIGZyb20gdGhlIHJpZ2h0IGlzIGVmZmljaWVudCAodHlwaWNhbGx5IDAtMSBpdGVyYXRpb25zKS5cbiAgY29uc3Qgc29ydGVkVHhzID0gY2xpZW50U3RhdGUuc3RhdGVDYWxjdWxhdG9yLmdldFNvcnRlZFR4cygpXG5cbiAgLy8gRmluZCBlbmQgYm91bmRhcnkgYnkgc2VhcmNoaW5nIGZyb20gcmlnaHQgKHNraXAgYW55IGZ1dHVyZSBlcG9jaCBlbnRyaWVzKVxuICBsZXQgZW5kSW5kZXggPSBzb3J0ZWRUeHMubGVuZ3RoXG4gIHdoaWxlIChlbmRJbmRleCA+IDAgJiYgc29ydGVkVHhzW2VuZEluZGV4IC0gMV0udHhUaW1lc3RhbXAuZXBvY2ggPiBhY3RpdmVFcG9jaCkge1xuICAgIGVuZEluZGV4LS1cbiAgfVxuXG4gIC8vIFNsaWNlIGZyb20gc3RhcnQgdG8gZW5kSW5kZXggKHBhc3QgZXBvY2hzIGFyZSBwcnVuZWQsIHNvIHRoZXNlIGFyZSBhbGwgYWN0aXZlRXBvY2gpXG4gIGNvbnN0IGFjdGl2ZVR4cyA9IHNvcnRlZFR4cy5zbGljZSgwLCBlbmRJbmRleClcblxuICBpZiAoYWN0aXZlVHhzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAvLyBEbyBub3RoaW5nIGlmIG5vIHR4cyAocHJldmVudHMgZW1wdHkgZXBvY2hzKVxuICB9XG5cbiAgLy8gMi4gVXBkYXRlIHdhdGVybWFya3MgYmFzZWQgb24gT0JTRVJWRUQgYWN0aXZlIHR4cyBhbmQgY2FsY3VsYXRlIG1pbldhbGxDbG9ja1xuICAvLyBOT1RFOiBXZSBjYW5ub3QgdXNlIGFjdGl2ZVR4c1swXS50eFRpbWVzdGFtcC53YWxsQ2xvY2sgZm9yIG1pbldhbGxDbG9jayBiZWNhdXNlXG4gIC8vIHR4cyBhcmUgc29ydGVkIGJ5IExhbXBvcnQgY2xvY2sgKGVwb2NoIOKGkiBjbG9jayDihpIgY2xpZW50SWQpLCBub3QgYnkgd2FsbENsb2NrLlxuICAvLyBBIGNsaWVudCBtYXkgaGF2ZSBhIGhpZ2ggTGFtcG9ydCBjbG9jayBidXQgZWFybHkgd2FsbENsb2NrIGR1ZSB0byBjbG9jayBkcmlmdFxuICAvLyBvciByZWNlaXZpbmcgbWFueSBtZXNzYWdlcyBiZWZvcmUgZW1pdHRpbmcuXG4gIGxldCBtaW5XYWxsQ2xvY2sgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcbiAgbGV0IHR4Q291bnQgPSAwXG4gIGZvciAoY29uc3QgZW50cnkgb2YgYWN0aXZlVHhzKSB7XG4gICAgY29uc3QgdHMgPSBlbnRyeS50eFRpbWVzdGFtcFxuXG4gICAgLy8gVHJhY2sgbWluIHdhbGxDbG9jayBmb3IgZGV0ZXJtaW5pc3RpYyBwcnVuaW5nIHJlZmVyZW5jZVxuICAgIGlmICh0cy53YWxsQ2xvY2sgPCBtaW5XYWxsQ2xvY2spIHtcbiAgICAgIG1pbldhbGxDbG9jayA9IHRzLndhbGxDbG9ja1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1dtID0gbmV3V2F0ZXJtYXJrc1t0cy5jbGllbnRJZF1cbiAgICAgID8geyAuLi5uZXdXYXRlcm1hcmtzW3RzLmNsaWVudElkXSB9XG4gICAgICA6IHsgbWF4Q2xvY2s6IC0xLCBtYXhXYWxsQ2xvY2s6IDAgfVxuXG4gICAgaWYgKHRzLmNsb2NrID4gbmV3V20ubWF4Q2xvY2spIHtcbiAgICAgIG5ld1dtLm1heENsb2NrID0gdHMuY2xvY2tcbiAgICAgIG5ld1dtLm1heFdhbGxDbG9jayA9IHRzLndhbGxDbG9ja1xuICAgIH1cbiAgICBuZXdXYXRlcm1hcmtzW3RzLmNsaWVudElkXSA9IG5ld1dtXG4gICAgdHhDb3VudCsrXG4gIH1cblxuICAvLyAzLiBQcnVuZSBJbmFjdGl2ZSBXYXRlcm1hcmtzIChEZXRlcm1pbmlzdGljKVxuICAvLyBVc2VzIG1pbldhbGxDbG9jayBzbyBhbGwgY2xpZW50cyBhZ3JlZSBvbiBleGFjdGx5IHdobyB0byBwcnVuZS5cbiAgZm9yIChjb25zdCBjbGllbnRJZCBpbiBuZXdXYXRlcm1hcmtzKSB7XG4gICAgaWYgKG1pbldhbGxDbG9jayAtIG5ld1dhdGVybWFya3NbY2xpZW50SWRdLm1heFdhbGxDbG9jayA+IGNsaWVudFN0YXRlLnJldGVudGlvbldpbmRvd01zKSB7XG4gICAgICBkZWxldGUgbmV3V2F0ZXJtYXJrc1tjbGllbnRJZF1cbiAgICB9XG4gIH1cblxuICAvLyA0LiBTYXZlIENoZWNrcG9pbnRcbiAgY29uc3QgY3BLZXkgPSBjaGVja3BvaW50S2V5RGF0YVRvS2V5KHtcbiAgICBlcG9jaDogYWN0aXZlRXBvY2gsXG4gICAgdHhDb3VudCxcbiAgICBjbGllbnRJZDogbXlDbGllbnRJZCxcbiAgfSlcbiAgeUNoZWNrcG9pbnQuc2V0KGNwS2V5LCB7XG4gICAgc3RhdGU6IGN1cnJlbnRTdGF0ZSwgLy8gUmVzcG9uc2liaWxpdHkgZm9yIGNsb25pbmcgaXMgbW92ZWQgdG8gdGhlIGNhbGxlciBpZiBuZWVkZWRcbiAgICB3YXRlcm1hcmtzOiBuZXdXYXRlcm1hcmtzLFxuICAgIHR4Q291bnQsXG4gICAgbWluV2FsbENsb2NrLFxuICB9KVxuXG4gIC8vIDUuIEVhcmx5IHR4IHBydW5pbmcgKE9wdGltaXphdGlvbilcbiAgLy8gRGVsZXRlIGFsbCB0eHMgZnJvbSB0aGUgbm93LWZpbmFsaXplZCBlcG9jaFxuICAvLyBUaGlzIHJlZHVjZXMgbWVtb3J5IHByZXNzdXJlIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgY2xlYW51cExvZ1xuICBjb25zdCBrZXlzVG9EZWxldGU6IFR4VGltZXN0YW1wS2V5W10gPSBbXVxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGFjdGl2ZVR4cykge1xuICAgIHlUeC5kZWxldGUoZW50cnkudHhUaW1lc3RhbXBLZXkpXG4gICAga2V5c1RvRGVsZXRlLnB1c2goZW50cnkudHhUaW1lc3RhbXBLZXkpXG4gIH1cbiAgY2xpZW50U3RhdGUuc3RhdGVDYWxjdWxhdG9yLnJlbW92ZVR4cyhrZXlzVG9EZWxldGUpXG59XG5cbi8qKlxuICogR2FyYmFnZSBjb2xsZWN0cyBvbGQgY2hlY2twb2ludHMuXG4gKiBTaG91bGQgYmUgY2FsbGVkIHBlcmlvZGljYWxseSB0byBwcmV2ZW50IHVuYm91bmRlZCBncm93dGggb2YgeUNoZWNrcG9pbnQuXG4gKlxuICogS2VlcHMgb25seSB0aGUgY2Fub25pY2FsIGNoZWNrcG9pbnQgZm9yIHRoZSBmaW5hbGl6ZWQgZXBvY2guXG4gKiBFdmVyeXRoaW5nIGVsc2UgaXMgZGVsZXRlZCAob2xkIGVwb2NocyArIG5vbi1jYW5vbmljYWwpLlxuICpcbiAqIE5vdGU6IFRoZSBhY3RpdmUgZXBvY2ggbmV2ZXIgaGFzIGNoZWNrcG9pbnRzIC0gY3JlYXRpbmcgYSBjaGVja3BvaW50XG4gKiBmb3IgYW4gZXBvY2ggaW1tZWRpYXRlbHkgbWFrZXMgaXQgZmluYWxpemVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJ1bmVDaGVja3BvaW50cyhcbiAgeUNoZWNrcG9pbnQ6IFkuTWFwPENoZWNrcG9pbnRSZWNvcmQ+LFxuICBmaW5hbGl6ZWRFcG9jaDogbnVtYmVyXG4pOiB2b2lkIHtcbiAgLy8gRmluZCB0aGUgY2Fub25pY2FsIGNoZWNrcG9pbnQgYW5kIGl0cyBrZXkgaW4gb25lIHBhc3NcbiAgbGV0IGNhbm9uaWNhbEtleTogQ2hlY2twb2ludEtleSB8IG51bGwgPSBudWxsXG4gIGxldCBiZXN0VHhDb3VudCA9IC0xXG5cbiAgZm9yIChjb25zdCBba2V5XSBvZiB5Q2hlY2twb2ludC5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCB7IGVwb2NoLCB0eENvdW50IH0gPSBwYXJzZUNoZWNrcG9pbnRLZXkoa2V5KVxuICAgIGlmIChlcG9jaCA9PT0gZmluYWxpemVkRXBvY2ggJiYgdHhDb3VudCA+IGJlc3RUeENvdW50KSB7XG4gICAgICBjYW5vbmljYWxLZXkgPSBrZXlcbiAgICAgIGJlc3RUeENvdW50ID0gdHhDb3VudFxuICAgIH1cbiAgfVxuXG4gIC8vIERlbGV0ZSBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgY2Fub25pY2FsIGNoZWNrcG9pbnRcbiAgZm9yIChjb25zdCBrZXkgb2YgeUNoZWNrcG9pbnQua2V5cygpKSB7XG4gICAgaWYgKGtleSAhPT0gY2Fub25pY2FsS2V5KSB7XG4gICAgICB5Q2hlY2twb2ludC5kZWxldGUoa2V5KVxuICAgIH1cbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBkbyBub3QgZWRpdCAuanMgZmlsZXMgZGlyZWN0bHkgLSBlZGl0IHNyYy9pbmRleC5qc3RcblxuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZXF1YWwoYSwgYikge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG5cbiAgaWYgKGEgJiYgYiAmJiB0eXBlb2YgYSA9PSAnb2JqZWN0JyAmJiB0eXBlb2YgYiA9PSAnb2JqZWN0Jykge1xuICAgIGlmIChhLmNvbnN0cnVjdG9yICE9PSBiLmNvbnN0cnVjdG9yKSByZXR1cm4gZmFsc2U7XG5cbiAgICB2YXIgbGVuZ3RoLCBpLCBrZXlzO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7XG4gICAgICBsZW5ndGggPSBhLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOylcbiAgICAgICAgaWYgKCFlcXVhbChhW2ldLCBiW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG5cblxuICAgIGlmIChhLmNvbnN0cnVjdG9yID09PSBSZWdFeHApIHJldHVybiBhLnNvdXJjZSA9PT0gYi5zb3VyY2UgJiYgYS5mbGFncyA9PT0gYi5mbGFncztcbiAgICBpZiAoYS52YWx1ZU9mICE9PSBPYmplY3QucHJvdG90eXBlLnZhbHVlT2YpIHJldHVybiBhLnZhbHVlT2YoKSA9PT0gYi52YWx1ZU9mKCk7XG4gICAgaWYgKGEudG9TdHJpbmcgIT09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpIHJldHVybiBhLnRvU3RyaW5nKCkgPT09IGIudG9TdHJpbmcoKTtcblxuICAgIGtleXMgPSBPYmplY3Qua2V5cyhhKTtcbiAgICBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoICE9PSBPYmplY3Qua2V5cyhiKS5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOylcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIGtleXNbaV0pKSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuXG4gICAgICBpZiAoIWVxdWFsKGFba2V5XSwgYltrZXldKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gdHJ1ZSBpZiBib3RoIE5hTiwgZmFsc2Ugb3RoZXJ3aXNlXG4gIHJldHVybiBhIT09YSAmJiBiIT09Yjtcbn07XG4iLCJleHBvcnQgY29uc3QgdXJsQWxwaGFiZXQgPVxuICAndXNlYW5kb20tMjZUMTk4MzQwUFg3NXB4SkFDS1ZFUllNSU5EQlVTSFdPTEZfR1FaYmZnaGprbHF2d3l6cmljdCdcbiIsIi8qIEB0cy1zZWxmLXR5cGVzPVwiLi9pbmRleC5kLnRzXCIgKi9cbmltcG9ydCB7IHVybEFscGhhYmV0IGFzIHNjb3BlZFVybEFscGhhYmV0IH0gZnJvbSAnLi91cmwtYWxwaGFiZXQvaW5kZXguanMnXG5leHBvcnQgeyB1cmxBbHBoYWJldCB9IGZyb20gJy4vdXJsLWFscGhhYmV0L2luZGV4LmpzJ1xuZXhwb3J0IGxldCByYW5kb20gPSBieXRlcyA9PiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KGJ5dGVzKSlcbmV4cG9ydCBsZXQgY3VzdG9tUmFuZG9tID0gKGFscGhhYmV0LCBkZWZhdWx0U2l6ZSwgZ2V0UmFuZG9tKSA9PiB7XG4gIGxldCBtYXNrID0gKDIgPDwgTWF0aC5sb2cyKGFscGhhYmV0Lmxlbmd0aCAtIDEpKSAtIDFcbiAgbGV0IHN0ZXAgPSAtfigoMS42ICogbWFzayAqIGRlZmF1bHRTaXplKSAvIGFscGhhYmV0Lmxlbmd0aClcbiAgcmV0dXJuIChzaXplID0gZGVmYXVsdFNpemUpID0+IHtcbiAgICBsZXQgaWQgPSAnJ1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBsZXQgYnl0ZXMgPSBnZXRSYW5kb20oc3RlcClcbiAgICAgIGxldCBqID0gc3RlcCB8IDBcbiAgICAgIHdoaWxlIChqLS0pIHtcbiAgICAgICAgaWQgKz0gYWxwaGFiZXRbYnl0ZXNbal0gJiBtYXNrXSB8fCAnJ1xuICAgICAgICBpZiAoaWQubGVuZ3RoID49IHNpemUpIHJldHVybiBpZFxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZXhwb3J0IGxldCBjdXN0b21BbHBoYWJldCA9IChhbHBoYWJldCwgc2l6ZSA9IDIxKSA9PlxuICBjdXN0b21SYW5kb20oYWxwaGFiZXQsIHNpemUgfCAwLCByYW5kb20pXG5leHBvcnQgbGV0IG5hbm9pZCA9IChzaXplID0gMjEpID0+IHtcbiAgbGV0IGlkID0gJydcbiAgbGV0IGJ5dGVzID0gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgoc2l6ZSB8PSAwKSkpXG4gIHdoaWxlIChzaXplLS0pIHtcbiAgICBpZCArPSBzY29wZWRVcmxBbHBoYWJldFtieXRlc1tzaXplXSAmIDYzXVxuICB9XG4gIHJldHVybiBpZFxufVxuIiwiJ3VzZSBzdHJpY3QnXG5tb2R1bGUuZXhwb3J0cyA9IHJmZGNcblxuZnVuY3Rpb24gY29weUJ1ZmZlciAoY3VyKSB7XG4gIGlmIChjdXIgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oY3VyKVxuICB9XG5cbiAgcmV0dXJuIG5ldyBjdXIuY29uc3RydWN0b3IoY3VyLmJ1ZmZlci5zbGljZSgpLCBjdXIuYnl0ZU9mZnNldCwgY3VyLmxlbmd0aClcbn1cblxuZnVuY3Rpb24gcmZkYyAob3B0cykge1xuICBvcHRzID0gb3B0cyB8fCB7fVxuICBpZiAob3B0cy5jaXJjbGVzKSByZXR1cm4gcmZkY0NpcmNsZXMob3B0cylcblxuICBjb25zdCBjb25zdHJ1Y3RvckhhbmRsZXJzID0gbmV3IE1hcCgpXG4gIGNvbnN0cnVjdG9ySGFuZGxlcnMuc2V0KERhdGUsIChvKSA9PiBuZXcgRGF0ZShvKSlcbiAgY29uc3RydWN0b3JIYW5kbGVycy5zZXQoTWFwLCAobywgZm4pID0+IG5ldyBNYXAoY2xvbmVBcnJheShBcnJheS5mcm9tKG8pLCBmbikpKVxuICBjb25zdHJ1Y3RvckhhbmRsZXJzLnNldChTZXQsIChvLCBmbikgPT4gbmV3IFNldChjbG9uZUFycmF5KEFycmF5LmZyb20obyksIGZuKSkpXG4gIGlmIChvcHRzLmNvbnN0cnVjdG9ySGFuZGxlcnMpIHtcbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2Ygb3B0cy5jb25zdHJ1Y3RvckhhbmRsZXJzKSB7XG4gICAgICBjb25zdHJ1Y3RvckhhbmRsZXJzLnNldChoYW5kbGVyWzBdLCBoYW5kbGVyWzFdKVxuICAgIH1cbiAgfVxuXG4gIGxldCBoYW5kbGVyID0gbnVsbFxuXG4gIHJldHVybiBvcHRzLnByb3RvID8gY2xvbmVQcm90byA6IGNsb25lXG5cbiAgZnVuY3Rpb24gY2xvbmVBcnJheSAoYSwgZm4pIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoYSlcbiAgICBjb25zdCBhMiA9IG5ldyBBcnJheShrZXlzLmxlbmd0aClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGsgPSBrZXlzW2ldXG4gICAgICBjb25zdCBjdXIgPSBhW2tdXG4gICAgICBpZiAodHlwZW9mIGN1ciAhPT0gJ29iamVjdCcgfHwgY3VyID09PSBudWxsKSB7XG4gICAgICAgIGEyW2tdID0gY3VyXG4gICAgICB9IGVsc2UgaWYgKGN1ci5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0ICYmIChoYW5kbGVyID0gY29uc3RydWN0b3JIYW5kbGVycy5nZXQoY3VyLmNvbnN0cnVjdG9yKSkpIHtcbiAgICAgICAgYTJba10gPSBoYW5kbGVyKGN1ciwgZm4pXG4gICAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhjdXIpKSB7XG4gICAgICAgIGEyW2tdID0gY29weUJ1ZmZlcihjdXIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhMltrXSA9IGZuKGN1cilcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGEyXG4gIH1cblxuICBmdW5jdGlvbiBjbG9uZSAobykge1xuICAgIGlmICh0eXBlb2YgbyAhPT0gJ29iamVjdCcgfHwgbyA9PT0gbnVsbCkgcmV0dXJuIG9cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvKSkgcmV0dXJuIGNsb25lQXJyYXkobywgY2xvbmUpXG4gICAgaWYgKG8uY29uc3RydWN0b3IgIT09IE9iamVjdCAmJiAoaGFuZGxlciA9IGNvbnN0cnVjdG9ySGFuZGxlcnMuZ2V0KG8uY29uc3RydWN0b3IpKSkge1xuICAgICAgcmV0dXJuIGhhbmRsZXIobywgY2xvbmUpXG4gICAgfVxuICAgIGNvbnN0IG8yID0ge31cbiAgICBmb3IgKGNvbnN0IGsgaW4gbykge1xuICAgICAgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIGspID09PSBmYWxzZSkgY29udGludWVcbiAgICAgIGNvbnN0IGN1ciA9IG9ba11cbiAgICAgIGlmICh0eXBlb2YgY3VyICE9PSAnb2JqZWN0JyB8fCBjdXIgPT09IG51bGwpIHtcbiAgICAgICAgbzJba10gPSBjdXJcbiAgICAgIH0gZWxzZSBpZiAoY3VyLmNvbnN0cnVjdG9yICE9PSBPYmplY3QgJiYgKGhhbmRsZXIgPSBjb25zdHJ1Y3RvckhhbmRsZXJzLmdldChjdXIuY29uc3RydWN0b3IpKSkge1xuICAgICAgICBvMltrXSA9IGhhbmRsZXIoY3VyLCBjbG9uZSlcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGN1cikpIHtcbiAgICAgICAgbzJba10gPSBjb3B5QnVmZmVyKGN1cilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG8yW2tdID0gY2xvbmUoY3VyKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbzJcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb25lUHJvdG8gKG8pIHtcbiAgICBpZiAodHlwZW9mIG8gIT09ICdvYmplY3QnIHx8IG8gPT09IG51bGwpIHJldHVybiBvXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobykpIHJldHVybiBjbG9uZUFycmF5KG8sIGNsb25lUHJvdG8pXG4gICAgaWYgKG8uY29uc3RydWN0b3IgIT09IE9iamVjdCAmJiAoaGFuZGxlciA9IGNvbnN0cnVjdG9ySGFuZGxlcnMuZ2V0KG8uY29uc3RydWN0b3IpKSkge1xuICAgICAgcmV0dXJuIGhhbmRsZXIobywgY2xvbmVQcm90bylcbiAgICB9XG4gICAgY29uc3QgbzIgPSB7fVxuICAgIGZvciAoY29uc3QgayBpbiBvKSB7XG4gICAgICBjb25zdCBjdXIgPSBvW2tdXG4gICAgICBpZiAodHlwZW9mIGN1ciAhPT0gJ29iamVjdCcgfHwgY3VyID09PSBudWxsKSB7XG4gICAgICAgIG8yW2tdID0gY3VyXG4gICAgICB9IGVsc2UgaWYgKGN1ci5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0ICYmIChoYW5kbGVyID0gY29uc3RydWN0b3JIYW5kbGVycy5nZXQoY3VyLmNvbnN0cnVjdG9yKSkpIHtcbiAgICAgICAgbzJba10gPSBoYW5kbGVyKGN1ciwgY2xvbmVQcm90bylcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGN1cikpIHtcbiAgICAgICAgbzJba10gPSBjb3B5QnVmZmVyKGN1cilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG8yW2tdID0gY2xvbmVQcm90byhjdXIpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvMlxuICB9XG59XG5cbmZ1bmN0aW9uIHJmZGNDaXJjbGVzIChvcHRzKSB7XG4gIGNvbnN0IHJlZnMgPSBbXVxuICBjb25zdCByZWZzTmV3ID0gW11cblxuICBjb25zdCBjb25zdHJ1Y3RvckhhbmRsZXJzID0gbmV3IE1hcCgpXG4gIGNvbnN0cnVjdG9ySGFuZGxlcnMuc2V0KERhdGUsIChvKSA9PiBuZXcgRGF0ZShvKSlcbiAgY29uc3RydWN0b3JIYW5kbGVycy5zZXQoTWFwLCAobywgZm4pID0+IG5ldyBNYXAoY2xvbmVBcnJheShBcnJheS5mcm9tKG8pLCBmbikpKVxuICBjb25zdHJ1Y3RvckhhbmRsZXJzLnNldChTZXQsIChvLCBmbikgPT4gbmV3IFNldChjbG9uZUFycmF5KEFycmF5LmZyb20obyksIGZuKSkpXG4gIGlmIChvcHRzLmNvbnN0cnVjdG9ySGFuZGxlcnMpIHtcbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2Ygb3B0cy5jb25zdHJ1Y3RvckhhbmRsZXJzKSB7XG4gICAgICBjb25zdHJ1Y3RvckhhbmRsZXJzLnNldChoYW5kbGVyWzBdLCBoYW5kbGVyWzFdKVxuICAgIH1cbiAgfVxuXG4gIGxldCBoYW5kbGVyID0gbnVsbFxuICByZXR1cm4gb3B0cy5wcm90byA/IGNsb25lUHJvdG8gOiBjbG9uZVxuXG4gIGZ1bmN0aW9uIGNsb25lQXJyYXkgKGEsIGZuKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGEpXG4gICAgY29uc3QgYTIgPSBuZXcgQXJyYXkoa2V5cy5sZW5ndGgpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrID0ga2V5c1tpXVxuICAgICAgY29uc3QgY3VyID0gYVtrXVxuICAgICAgaWYgKHR5cGVvZiBjdXIgIT09ICdvYmplY3QnIHx8IGN1ciA9PT0gbnVsbCkge1xuICAgICAgICBhMltrXSA9IGN1clxuICAgICAgfSBlbHNlIGlmIChjdXIuY29uc3RydWN0b3IgIT09IE9iamVjdCAmJiAoaGFuZGxlciA9IGNvbnN0cnVjdG9ySGFuZGxlcnMuZ2V0KGN1ci5jb25zdHJ1Y3RvcikpKSB7XG4gICAgICAgIGEyW2tdID0gaGFuZGxlcihjdXIsIGZuKVxuICAgICAgfSBlbHNlIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoY3VyKSkge1xuICAgICAgICBhMltrXSA9IGNvcHlCdWZmZXIoY3VyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSByZWZzLmluZGV4T2YoY3VyKVxuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgYTJba10gPSByZWZzTmV3W2luZGV4XVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGEyW2tdID0gZm4oY3VyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhMlxuICB9XG5cbiAgZnVuY3Rpb24gY2xvbmUgKG8pIHtcbiAgICBpZiAodHlwZW9mIG8gIT09ICdvYmplY3QnIHx8IG8gPT09IG51bGwpIHJldHVybiBvXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobykpIHJldHVybiBjbG9uZUFycmF5KG8sIGNsb25lKVxuICAgIGlmIChvLmNvbnN0cnVjdG9yICE9PSBPYmplY3QgJiYgKGhhbmRsZXIgPSBjb25zdHJ1Y3RvckhhbmRsZXJzLmdldChvLmNvbnN0cnVjdG9yKSkpIHtcbiAgICAgIHJldHVybiBoYW5kbGVyKG8sIGNsb25lKVxuICAgIH1cbiAgICBjb25zdCBvMiA9IHt9XG4gICAgcmVmcy5wdXNoKG8pXG4gICAgcmVmc05ldy5wdXNoKG8yKVxuICAgIGZvciAoY29uc3QgayBpbiBvKSB7XG4gICAgICBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobywgaykgPT09IGZhbHNlKSBjb250aW51ZVxuICAgICAgY29uc3QgY3VyID0gb1trXVxuICAgICAgaWYgKHR5cGVvZiBjdXIgIT09ICdvYmplY3QnIHx8IGN1ciA9PT0gbnVsbCkge1xuICAgICAgICBvMltrXSA9IGN1clxuICAgICAgfSBlbHNlIGlmIChjdXIuY29uc3RydWN0b3IgIT09IE9iamVjdCAmJiAoaGFuZGxlciA9IGNvbnN0cnVjdG9ySGFuZGxlcnMuZ2V0KGN1ci5jb25zdHJ1Y3RvcikpKSB7XG4gICAgICAgIG8yW2tdID0gaGFuZGxlcihjdXIsIGNsb25lKVxuICAgICAgfSBlbHNlIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoY3VyKSkge1xuICAgICAgICBvMltrXSA9IGNvcHlCdWZmZXIoY3VyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaSA9IHJlZnMuaW5kZXhPZihjdXIpXG4gICAgICAgIGlmIChpICE9PSAtMSkge1xuICAgICAgICAgIG8yW2tdID0gcmVmc05ld1tpXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG8yW2tdID0gY2xvbmUoY3VyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJlZnMucG9wKClcbiAgICByZWZzTmV3LnBvcCgpXG4gICAgcmV0dXJuIG8yXG4gIH1cblxuICBmdW5jdGlvbiBjbG9uZVByb3RvIChvKSB7XG4gICAgaWYgKHR5cGVvZiBvICE9PSAnb2JqZWN0JyB8fCBvID09PSBudWxsKSByZXR1cm4gb1xuICAgIGlmIChBcnJheS5pc0FycmF5KG8pKSByZXR1cm4gY2xvbmVBcnJheShvLCBjbG9uZVByb3RvKVxuICAgIGlmIChvLmNvbnN0cnVjdG9yICE9PSBPYmplY3QgJiYgKGhhbmRsZXIgPSBjb25zdHJ1Y3RvckhhbmRsZXJzLmdldChvLmNvbnN0cnVjdG9yKSkpIHtcbiAgICAgIHJldHVybiBoYW5kbGVyKG8sIGNsb25lUHJvdG8pXG4gICAgfVxuICAgIGNvbnN0IG8yID0ge31cbiAgICByZWZzLnB1c2gobylcbiAgICByZWZzTmV3LnB1c2gobzIpXG4gICAgZm9yIChjb25zdCBrIGluIG8pIHtcbiAgICAgIGNvbnN0IGN1ciA9IG9ba11cbiAgICAgIGlmICh0eXBlb2YgY3VyICE9PSAnb2JqZWN0JyB8fCBjdXIgPT09IG51bGwpIHtcbiAgICAgICAgbzJba10gPSBjdXJcbiAgICAgIH0gZWxzZSBpZiAoY3VyLmNvbnN0cnVjdG9yICE9PSBPYmplY3QgJiYgKGhhbmRsZXIgPSBjb25zdHJ1Y3RvckhhbmRsZXJzLmdldChjdXIuY29uc3RydWN0b3IpKSkge1xuICAgICAgICBvMltrXSA9IGhhbmRsZXIoY3VyLCBjbG9uZVByb3RvKVxuICAgICAgfSBlbHNlIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoY3VyKSkge1xuICAgICAgICBvMltrXSA9IGNvcHlCdWZmZXIoY3VyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaSA9IHJlZnMuaW5kZXhPZihjdXIpXG4gICAgICAgIGlmIChpICE9PSAtMSkge1xuICAgICAgICAgIG8yW2tdID0gcmVmc05ld1tpXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG8yW2tdID0gY2xvbmVQcm90byhjdXIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmVmcy5wb3AoKVxuICAgIHJlZnNOZXcucG9wKClcbiAgICByZXR1cm4gbzJcbiAgfVxufVxuIiwiaW1wb3J0IGVxdWFsIGZyb20gXCJmYXN0LWRlZXAtZXF1YWxcIlxuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSBcIm5hbm9pZFwiXG5pbXBvcnQgcmZkYyBmcm9tIFwicmZkY1wiXG5pbXBvcnQgdHlwZSB7IEpTT05WYWx1ZSB9IGZyb20gXCIuL2pzb25cIlxuXG5jb25zdCBjbG9uZSA9IHJmZGMoeyBwcm90bzogdHJ1ZSB9KVxuXG4vKipcbiAqIERlZXAgZXF1YWxpdHkgY2hlY2sgZm9yIEpTT05WYWx1ZXMuXG4gKiBVc2VkIGZvciBhZGRUb1NldCAvIGRlbGV0ZUZyb21TZXQgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBFcXVhbChhOiBKU09OVmFsdWUsIGI6IEpTT05WYWx1ZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZXF1YWwoYSwgYilcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQgdXNpbmcgbmFub2lkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVJRCgpOiBzdHJpbmcge1xuICByZXR1cm4gbmFub2lkKClcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBhbiBvYmplY3QgKHR5cGVvZiA9PT0gXCJvYmplY3RcIiAmJiAhPT0gbnVsbCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG9iamVjdCB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCJcbn1cblxuLyoqXG4gKiBEZWVwIGNsb25lcyBhIEpTT04tc2VyaWFsaXphYmxlIHZhbHVlLlxuICogT3B0aW1pemVkOiBwcmltaXRpdmVzIGFyZSByZXR1cm5lZCBhcy1pcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBDbG9uZTxUPih2YWx1ZTogVCk6IFQge1xuICAvLyBQcmltaXRpdmVzIGRvbid0IG5lZWQgY2xvbmluZ1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbiAgcmV0dXJuIGNsb25lKHZhbHVlKVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsYXp5IG1lbW9pemVkIGdldHRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhenk8VD4oZm46ICgpID0+IFQpOiAoKSA9PiBUIHtcbiAgbGV0IGNvbXB1dGVkID0gZmFsc2VcbiAgbGV0IHZhbHVlOiBUXG4gIHJldHVybiAoKSA9PiB7XG4gICAgaWYgKCFjb21wdXRlZCkge1xuICAgICAgdmFsdWUgPSBmbigpXG4gICAgICBjb21wdXRlZCA9IHRydWVcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbn1cbiIsImltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi9lcnJvclwiXG5pbXBvcnQgdHlwZSB7IEpTT05PYmplY3QsIEpTT05SZWNvcmQsIEpTT05WYWx1ZSwgUGF0aCB9IGZyb20gXCIuL2pzb25cIlxuaW1wb3J0IHR5cGUgeyBPcCwgVmFsaWRhdGVGbiB9IGZyb20gXCIuL29wZXJhdGlvbnNcIlxuaW1wb3J0IHsgVHhSZWNvcmQgfSBmcm9tIFwiLi9UeFJlY29yZFwiXG5pbXBvcnQgeyBkZWVwRXF1YWwsIGlzT2JqZWN0IH0gZnJvbSBcIi4vdXRpbHNcIlxuXG4vKipcbiAqIEEgZHJhZnQgY29udGV4dCBmb3IgY29weS1vbi13cml0ZSBpbW11dGFibGUgdXBkYXRlcy5cbiAqXG4gKiBUaGlzIHByb3ZpZGVzIEltbWVyL011dGF0aXZlLWxpa2Ugc2VtYW50aWNzIHdpdGhvdXQgdGhlIHByb3h5IG92ZXJoZWFkOlxuICogLSBUaGUgb3JpZ2luYWwgYmFzZSBzdGF0ZSBpcyBuZXZlciBtdXRhdGVkXG4gKiAtIE9iamVjdHMgYXJlIGNsb25lZCBsYXppbHkgb24gZmlyc3QgbXV0YXRpb24gKGNvcHktb24td3JpdGUpXG4gKiAtIE9uY2UgYW4gb2JqZWN0IGlzIGNsb25lZCAoXCJvd25lZFwiKSwgaXQgY2FuIGJlIG11dGF0ZWQgZGlyZWN0bHlcbiAqIC0gSWYgbm8gY2hhbmdlcyBhcmUgbWFkZSwgdGhlIG9yaWdpbmFsIHJlZmVyZW5jZSBpcyBwcmVzZXJ2ZWQgKHN0cnVjdHVyYWwgc2hhcmluZylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEcmFmdENvbnRleHQ8VCBleHRlbmRzIEpTT05PYmplY3Q+IHtcbiAgLyoqIFRoZSBjdXJyZW50IHJvb3QgKG1heSBiZSB0aGUgb3JpZ2luYWwgYmFzZSBvciBhIGNsb25lZCB2ZXJzaW9uKSAqL1xuICByb290OiBUXG4gIC8qKiBUaGUgb3JpZ2luYWwgYmFzZSBzdGF0ZSAobmV2ZXIgbXV0YXRlZCkgKi9cbiAgYmFzZTogVFxuICAvKiogU2V0IG9mIG9iamVjdHMgdGhhdCBoYXZlIGJlZW4gY2xvbmVkIGFuZCBhcmUgc2FmZSB0byBtdXRhdGUgKi9cbiAgb3duZWRPYmplY3RzOiBXZWFrU2V0PG9iamVjdD5cbiAgLyoqIE9wdGltaXphdGlvbjogZmFzdCBjaGVjayBpZiByb290IGlzIGFscmVhZHkgb3duZWQgKi9cbiAgaXNSb290T3duZWQ6IGJvb2xlYW5cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGRyYWZ0IGNvbnRleHQgZnJvbSBhIGJhc2Ugc3RhdGUuXG4gKiBUaGUgYmFzZSBzdGF0ZSB3aWxsIG5ldmVyIGJlIG11dGF0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEcmFmdDxUIGV4dGVuZHMgSlNPTk9iamVjdD4oYmFzZTogVCk6IERyYWZ0Q29udGV4dDxUPiB7XG4gIHJldHVybiB7XG4gICAgcm9vdDogYmFzZSxcbiAgICBiYXNlLFxuICAgIG93bmVkT2JqZWN0czogbmV3IFNldCgpLFxuICAgIGlzUm9vdE93bmVkOiBmYWxzZSxcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZHJhZnQgd2FzIG1vZGlmaWVkIChyb290ICE9PSBiYXNlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRHJhZnRNb2RpZmllZDxUIGV4dGVuZHMgSlNPTk9iamVjdD4oY3R4OiBEcmFmdENvbnRleHQ8VD4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGN0eC5yb290ICE9PSBjdHguYmFzZVxufVxuXG5mdW5jdGlvbiBzaGFsbG93Q2xvbmU8VCBleHRlbmRzIG9iamVjdD4ob2JqOiBUKTogVCB7XG4gIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICByZXR1cm4gb2JqLnNsaWNlKCkgYXMgdW5rbm93biBhcyBUXG4gIH1cbiAgY29uc3QgY2xvbmUgPSB7fSBhcyBUXG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopXG4gIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IGtleXNbaV1cbiAgICA7KGNsb25lIGFzIGFueSlba2V5XSA9IChvYmogYXMgYW55KVtrZXldXG4gIH1cbiAgcmV0dXJuIGNsb25lXG59XG5cbi8qKlxuICogRW5zdXJlcyBhbiBvYmplY3QgaXMgb3duZWQgKGNsb25lZCBpZiBuZWNlc3NhcnkpIGFuZCByZXR1cm5zIHRoZSBvd25lZCB2ZXJzaW9uLlxuICogQWxzbyB1cGRhdGVzIHRoZSBwYXJlbnQgdG8gcG9pbnQgdG8gdGhlIGNsb25lZCBjaGlsZC5cbiAqL1xuZnVuY3Rpb24gZW5zdXJlT3duZWQ8VCBleHRlbmRzIEpTT05PYmplY3Q+KFxuICBjdHg6IERyYWZ0Q29udGV4dDxUPixcbiAgcGFyZW50OiBKU09OT2JqZWN0LFxuICBrZXk6IHN0cmluZyB8IG51bWJlcixcbiAgY2hpbGQ6IEpTT05SZWNvcmQgfCBKU09OVmFsdWVbXVxuKTogSlNPTlJlY29yZCB8IEpTT05WYWx1ZVtdIHtcbiAgaWYgKGN0eC5vd25lZE9iamVjdHMuaGFzKGNoaWxkKSkge1xuICAgIHJldHVybiBjaGlsZFxuICB9XG4gIGNvbnN0IGNsb25lZCA9IHNoYWxsb3dDbG9uZShjaGlsZClcbiAgOyhwYXJlbnQgYXMgYW55KVtrZXldID0gY2xvbmVkXG4gIGN0eC5vd25lZE9iamVjdHMuYWRkKGNsb25lZClcbiAgcmV0dXJuIGNsb25lZFxufVxuXG4vKipcbiAqIEVuc3VyZXMgYWxsIG9iamVjdHMgYWxvbmcgdGhlIHBhdGggYXJlIG93bmVkIChjbG9uZWQgaWYgbmVjZXNzYXJ5KS5cbiAqIFJldHVybnMgdGhlIGNvbnRhaW5lciBhdCB0aGUgZW5kIG9mIHRoZSBwYXRoLlxuICogVGhyb3dzIGlmIHRoZSBwYXRoIGlzIGludmFsaWQuXG4gKi9cbmZ1bmN0aW9uIGVuc3VyZU93bmVkUGF0aDxUIGV4dGVuZHMgSlNPTk9iamVjdD4oXG4gIGN0eDogRHJhZnRDb250ZXh0PFQ+LFxuICBwYXRoOiBQYXRoXG4pOiBKU09OUmVjb3JkIHwgSlNPTlZhbHVlW10ge1xuICAvLyBFbnN1cmUgcm9vdCBpcyBvd25lZCBmaXJzdFxuICBpZiAoIWN0eC5pc1Jvb3RPd25lZCkge1xuICAgIGN0eC5yb290ID0gc2hhbGxvd0Nsb25lKGN0eC5yb290IGFzIHVua25vd24gYXMgb2JqZWN0KSBhcyBUXG4gICAgY3R4Lm93bmVkT2JqZWN0cy5hZGQoY3R4LnJvb3QpXG4gICAgY3R4LmlzUm9vdE93bmVkID0gdHJ1ZVxuICB9XG5cbiAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGN0eC5yb290XG4gIH1cblxuICBsZXQgY3VycmVudDogSlNPTlJlY29yZCB8IEpTT05WYWx1ZVtdID0gY3R4LnJvb3RcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzZWdtZW50ID0gcGF0aFtpXVxuICAgIGNvbnN0IGlzQXJyYXlJbmRleCA9IHR5cGVvZiBzZWdtZW50ID09PSBcIm51bWJlclwiXG5cbiAgICAvLyBWYWxpZGF0ZSBjb250YWluZXIgdHlwZVxuICAgIGlmIChpc0FycmF5SW5kZXgpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShjdXJyZW50KSkge1xuICAgICAgICBmYWlsdXJlKGBFeHBlY3RlZCBhcnJheSBhdCBwYXRoIHNlZ21lbnQgJHtzZWdtZW50fWApXG4gICAgICB9XG4gICAgICBpZiAoc2VnbWVudCA8IDAgfHwgc2VnbWVudCA+PSBjdXJyZW50Lmxlbmd0aCkge1xuICAgICAgICBmYWlsdXJlKGBJbmRleCAke3NlZ21lbnR9IG91dCBvZiBib3VuZHNgKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KGN1cnJlbnQpIHx8IEFycmF5LmlzQXJyYXkoY3VycmVudCkpIHtcbiAgICAgICAgZmFpbHVyZShgRXhwZWN0ZWQgb2JqZWN0IGF0IHBhdGggc2VnbWVudCBcIiR7c2VnbWVudH1cImApXG4gICAgICB9XG4gICAgICBpZiAoIShzZWdtZW50IGluIGN1cnJlbnQpKSB7XG4gICAgICAgIGZhaWx1cmUoYFByb3BlcnR5IFwiJHtzZWdtZW50fVwiIGRvZXMgbm90IGV4aXN0YClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjaGlsZDogSlNPTlZhbHVlID0gKGN1cnJlbnQgYXMgYW55KVtzZWdtZW50XVxuXG4gICAgLy8gVmFsaWRhdGUgY2hpbGQgaXMgdHJhdmVyc2FibGVcbiAgICBpZiAoY2hpbGQgPT09IG51bGwgfHwgdHlwZW9mIGNoaWxkICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICBmYWlsdXJlKGBDYW5ub3QgdHJhdmVyc2UgdGhyb3VnaCBwcmltaXRpdmUgYXQgcGF0aCBzZWdtZW50ICR7c2VnbWVudH1gKVxuICAgIH1cblxuICAgIC8vIEVuc3VyZSBjaGlsZCBpcyBvd25lZCBhbmQgY29udGludWVcbiAgICBjdXJyZW50ID0gZW5zdXJlT3duZWQoY3R4LCBjdXJyZW50LCBzZWdtZW50LCBjaGlsZCBhcyBKU09OUmVjb3JkIHwgSlNPTlZhbHVlW10pXG4gIH1cblxuICByZXR1cm4gY3VycmVudFxufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBzaW5nbGUgXCJzZXRcIiBvcGVyYXRpb24gdG8gdGhlIGRyYWZ0IHdpdGggY29weS1vbi13cml0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRyYWZ0U2V0PFQgZXh0ZW5kcyBKU09OT2JqZWN0PihcbiAgY3R4OiBEcmFmdENvbnRleHQ8VD4sXG4gIHBhdGg6IFBhdGgsXG4gIGtleTogc3RyaW5nLFxuICB2YWx1ZTogSlNPTlZhbHVlXG4pOiB2b2lkIHtcbiAgY29uc3QgY29udGFpbmVyID0gZW5zdXJlT3duZWRQYXRoKGN0eCwgcGF0aClcbiAgaWYgKEFycmF5LmlzQXJyYXkoY29udGFpbmVyKSkge1xuICAgIGZhaWx1cmUoXCJzZXQgcmVxdWlyZXMgb2JqZWN0IGNvbnRhaW5lclwiKVxuICB9XG4gIDsoY29udGFpbmVyIGFzIEpTT05SZWNvcmQpW2tleV0gPSB2YWx1ZVxufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBzaW5nbGUgXCJkZWxldGVcIiBvcGVyYXRpb24gdG8gdGhlIGRyYWZ0IHdpdGggY29weS1vbi13cml0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRyYWZ0RGVsZXRlPFQgZXh0ZW5kcyBKU09OT2JqZWN0PihcbiAgY3R4OiBEcmFmdENvbnRleHQ8VD4sXG4gIHBhdGg6IFBhdGgsXG4gIGtleTogc3RyaW5nXG4pOiB2b2lkIHtcbiAgY29uc3QgY29udGFpbmVyID0gZW5zdXJlT3duZWRQYXRoKGN0eCwgcGF0aClcbiAgaWYgKEFycmF5LmlzQXJyYXkoY29udGFpbmVyKSkge1xuICAgIGZhaWx1cmUoXCJkZWxldGUgcmVxdWlyZXMgb2JqZWN0IGNvbnRhaW5lclwiKVxuICB9XG4gIGRlbGV0ZSAoY29udGFpbmVyIGFzIEpTT05SZWNvcmQpW2tleV1cbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgc2luZ2xlIFwic3BsaWNlXCIgb3BlcmF0aW9uIHRvIHRoZSBkcmFmdCB3aXRoIGNvcHktb24td3JpdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkcmFmdFNwbGljZTxUIGV4dGVuZHMgSlNPTk9iamVjdD4oXG4gIGN0eDogRHJhZnRDb250ZXh0PFQ+LFxuICBwYXRoOiBQYXRoLFxuICBpbmRleDogbnVtYmVyLFxuICBkZWxldGVDb3VudDogbnVtYmVyLFxuICBpbnNlcnRzOiByZWFkb25seSBKU09OVmFsdWVbXVxuKTogdm9pZCB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGVuc3VyZU93bmVkUGF0aChjdHgsIHBhdGgpXG4gIGlmICghQXJyYXkuaXNBcnJheShjb250YWluZXIpKSB7XG4gICAgZmFpbHVyZShcInNwbGljZSByZXF1aXJlcyBhcnJheSBjb250YWluZXJcIilcbiAgfVxuICBjb25zdCBzYWZlSW5kZXggPSBNYXRoLm1pbihpbmRleCwgY29udGFpbmVyLmxlbmd0aClcbiAgaWYgKGluc2VydHMubGVuZ3RoID09PSAwKSB7XG4gICAgY29udGFpbmVyLnNwbGljZShzYWZlSW5kZXgsIGRlbGV0ZUNvdW50KVxuICB9IGVsc2UgaWYgKGluc2VydHMubGVuZ3RoID09PSAxKSB7XG4gICAgY29udGFpbmVyLnNwbGljZShzYWZlSW5kZXgsIGRlbGV0ZUNvdW50LCBpbnNlcnRzWzBdKVxuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5zcGxpY2Uoc2FmZUluZGV4LCBkZWxldGVDb3VudCwgLi4uaW5zZXJ0cylcbiAgfVxufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBzaW5nbGUgXCJhZGRUb1NldFwiIG9wZXJhdGlvbiB0byB0aGUgZHJhZnQgd2l0aCBjb3B5LW9uLXdyaXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZHJhZnRBZGRUb1NldDxUIGV4dGVuZHMgSlNPTk9iamVjdD4oXG4gIGN0eDogRHJhZnRDb250ZXh0PFQ+LFxuICBwYXRoOiBQYXRoLFxuICB2YWx1ZTogSlNPTlZhbHVlXG4pOiB2b2lkIHtcbiAgY29uc3QgY29udGFpbmVyID0gZW5zdXJlT3duZWRQYXRoKGN0eCwgcGF0aClcbiAgaWYgKCFBcnJheS5pc0FycmF5KGNvbnRhaW5lcikpIHtcbiAgICBmYWlsdXJlKFwiYWRkVG9TZXQgcmVxdWlyZXMgYXJyYXkgY29udGFpbmVyXCIpXG4gIH1cbiAgaWYgKCFjb250YWluZXIuc29tZSgoaXRlbSkgPT4gZGVlcEVxdWFsKGl0ZW0sIHZhbHVlKSkpIHtcbiAgICBjb250YWluZXIucHVzaCh2YWx1ZSlcbiAgfVxufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBzaW5nbGUgXCJkZWxldGVGcm9tU2V0XCIgb3BlcmF0aW9uIHRvIHRoZSBkcmFmdCB3aXRoIGNvcHktb24td3JpdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkcmFmdERlbGV0ZUZyb21TZXQ8VCBleHRlbmRzIEpTT05PYmplY3Q+KFxuICBjdHg6IERyYWZ0Q29udGV4dDxUPixcbiAgcGF0aDogUGF0aCxcbiAgdmFsdWU6IEpTT05WYWx1ZVxuKTogdm9pZCB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGVuc3VyZU93bmVkUGF0aChjdHgsIHBhdGgpXG4gIGlmICghQXJyYXkuaXNBcnJheShjb250YWluZXIpKSB7XG4gICAgZmFpbHVyZShcImRlbGV0ZUZyb21TZXQgcmVxdWlyZXMgYXJyYXkgY29udGFpbmVyXCIpXG4gIH1cbiAgLy8gUmVtb3ZlIGFsbCBtYXRjaGluZyBpdGVtcyAoaXRlcmF0ZSBiYWNrd2FyZHMgdG8gYXZvaWQgaW5kZXggc2hpZnRpbmcpXG4gIGZvciAobGV0IGkgPSBjb250YWluZXIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAoZGVlcEVxdWFsKGNvbnRhaW5lcltpXSwgdmFsdWUpKSB7XG4gICAgICBjb250YWluZXIuc3BsaWNlKGksIDEpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQXBwbGllcyBhIHNpbmdsZSBvcGVyYXRpb24gdG8gdGhlIGRyYWZ0IHdpdGggY29weS1vbi13cml0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5T3BUb0RyYWZ0PFQgZXh0ZW5kcyBKU09OT2JqZWN0PihjdHg6IERyYWZ0Q29udGV4dDxUPiwgb3A6IE9wKTogdm9pZCB7XG4gIHN3aXRjaCAob3Aua2luZCkge1xuICAgIGNhc2UgXCJzZXRcIjpcbiAgICAgIGRyYWZ0U2V0KGN0eCwgb3AucGF0aCwgb3Aua2V5LCBvcC52YWx1ZSlcbiAgICAgIGJyZWFrXG4gICAgY2FzZSBcImRlbGV0ZVwiOlxuICAgICAgZHJhZnREZWxldGUoY3R4LCBvcC5wYXRoLCBvcC5rZXkpXG4gICAgICBicmVha1xuICAgIGNhc2UgXCJzcGxpY2VcIjpcbiAgICAgIGRyYWZ0U3BsaWNlKGN0eCwgb3AucGF0aCwgb3AuaW5kZXgsIG9wLmRlbGV0ZUNvdW50LCBvcC5pbnNlcnRzKVxuICAgICAgYnJlYWtcbiAgICBjYXNlIFwiYWRkVG9TZXRcIjpcbiAgICAgIGRyYWZ0QWRkVG9TZXQoY3R4LCBvcC5wYXRoLCBvcC52YWx1ZSlcbiAgICAgIGJyZWFrXG4gICAgY2FzZSBcImRlbGV0ZUZyb21TZXRcIjpcbiAgICAgIGRyYWZ0RGVsZXRlRnJvbVNldChjdHgsIG9wLnBhdGgsIG9wLnZhbHVlKVxuICAgICAgYnJlYWtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgZmFpbHVyZShgVW5rbm93biBvcGVyYXRpb24ga2luZDogJHsob3AgYXMgYW55KS5raW5kfWApXG4gIH1cbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgc2luZ2xlIHRyYW5zYWN0aW9uIHRvIGEgYmFzZSBzdGF0ZSBpbW11dGFibHkuXG4gKlxuICogS2V5IGJlbmVmaXRzIG92ZXIgTXV0YXRpdmUvSW1tZXI6XG4gKiAtIE5vIHByb3h5IG92ZXJoZWFkIC0gZGlyZWN0IG9iamVjdCBhY2Nlc3MgYW5kIGNvcHktb24td3JpdGUgY2xvbmluZ1xuICogLSBTdHJ1Y3R1cmFsIHNoYXJpbmcgLSB1bmNoYW5nZWQgc3VidHJlZXMga2VlcCB0aGVpciByZWZlcmVuY2VzXG4gKiAtIFplcm8tY29weSBvbiBmYWlsdXJlIC0gaWYgdmFsaWRhdGlvbiBmYWlscywgcmV0dXJucyBvcmlnaW5hbCBiYXNlIHVuY2hhbmdlZFxuICpcbiAqIEBwYXJhbSBiYXNlIC0gVGhlIGJhc2Ugc3RhdGUgKG5ldmVyIG11dGF0ZWQpXG4gKiBAcGFyYW0gdHggLSBUaGUgdHJhbnNhY3Rpb24gdG8gYXBwbHlcbiAqIEBwYXJhbSB2YWxpZGF0ZUZuIC0gT3B0aW9uYWwgdmFsaWRhdGlvbiBmdW5jdGlvblxuICogQHJldHVybnMgVGhlIGZpbmFsIHN0YXRlIChpZiB2YWxpZCkgb3IgdGhlIG9yaWdpbmFsIGJhc2UgKGlmIGludmFsaWQgb3IgZW1wdHkpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVR4SW1tdXRhYmxlPFQgZXh0ZW5kcyBKU09OT2JqZWN0PihcbiAgYmFzZTogVCxcbiAgdHg6IFBpY2s8VHhSZWNvcmQsIFwib3BzXCI+LFxuICB2YWxpZGF0ZUZuPzogVmFsaWRhdGVGbjxUPlxuKTogVCB7XG4gIGlmICh0eC5vcHMubGVuZ3RoID09PSAwKSByZXR1cm4gYmFzZVxuXG4gIGNvbnN0IGN0eCA9IGNyZWF0ZURyYWZ0KGJhc2UpXG5cbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IG9wIG9mIHR4Lm9wcykge1xuICAgICAgYXBwbHlPcFRvRHJhZnQoY3R4LCBvcClcbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdGVGbiAmJiAhdmFsaWRhdGVGbihjdHgucm9vdCkpIHtcbiAgICAgIHJldHVybiBiYXNlXG4gICAgfVxuXG4gICAgcmV0dXJuIGN0eC5yb290XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBiYXNlXG4gIH1cbn1cbiIsImltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi9lcnJvclwiXG5pbXBvcnQgeyBKU09OUmVjb3JkLCBKU09OVmFsdWUsIFBhdGggfSBmcm9tIFwiLi9qc29uXCJcbmltcG9ydCB7IE9wIH0gZnJvbSBcIi4vb3BlcmF0aW9uc1wiXG5cbi8qKlxuICogUmVjb25jaWxlcyB0aGUgY3VycmVudCBzdGF0ZSB3aXRoIHRoZSB0YXJnZXQgc3RhdGUgYnkgY29tcHV0aW5nIGFuZCBlbWl0dGluZ1xuICogdGhlIG1pbmltYWwgc2V0IG9mIG9wZXJhdGlvbnMgbmVlZGVkIHRvIHRyYW5zZm9ybSBjdXJyZW50U3RhdGUgaW50byB0YXJnZXRTdGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVSZWNvbmNpbGVPcHMoY3VycmVudFN0YXRlOiBKU09OVmFsdWUsIHRhcmdldFN0YXRlOiBKU09OVmFsdWUpOiBPcFtdIHtcbiAgY29uc3Qgb3BzOiBPcFtdID0gW11cbiAgZGlmZlZhbHVlKGN1cnJlbnRTdGF0ZSwgdGFyZ2V0U3RhdGUsIFtdLCBvcHMpXG4gIHJldHVybiBvcHNcbn1cblxuZnVuY3Rpb24gZGlmZlZhbHVlKGN1cnJlbnQ6IEpTT05WYWx1ZSwgdGFyZ2V0OiBKU09OVmFsdWUsIHBhdGg6IFBhdGgsIG9wczogT3BbXSk6IHZvaWQge1xuICAvLyAxLiBSZWZlcmVuY2UgZXF1YWxpdHkgKHN0cnVjdHVyYWwgc2hhcmluZylcbiAgaWYgKGN1cnJlbnQgPT09IHRhcmdldCkgcmV0dXJuXG5cbiAgLy8gMi4gSGFuZGxlIHByaW1pdGl2ZXMgYW5kIG51bGwgcXVpY2tseVxuICBjb25zdCBjdXJyZW50VHlwZSA9IHR5cGVvZiBjdXJyZW50XG4gIGNvbnN0IHRhcmdldFR5cGUgPSB0eXBlb2YgdGFyZ2V0XG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgdGFyZ2V0ID09PSBudWxsIHx8IGN1cnJlbnRUeXBlICE9PSBcIm9iamVjdFwiIHx8IHRhcmdldFR5cGUgIT09IFwib2JqZWN0XCIpIHtcbiAgICAvLyBBdCBsZWFzdCBvbmUgaXMgcHJpbWl0aXZlL251bGwsIG9yIHR5cGVzIGRvbid0IG1hdGNoXG4gICAgZW1pdFJlcGxhY2UocGF0aCwgdGFyZ2V0LCBvcHMpXG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBCb3RoIGFyZSBvYmplY3RzIChvYmplY3Qgb3IgYXJyYXkpXG4gIGNvbnN0IGN1cnJlbnRJc0FycmF5ID0gQXJyYXkuaXNBcnJheShjdXJyZW50KVxuICBjb25zdCB0YXJnZXRJc0FycmF5ID0gQXJyYXkuaXNBcnJheSh0YXJnZXQpXG5cbiAgaWYgKGN1cnJlbnRJc0FycmF5ICE9PSB0YXJnZXRJc0FycmF5KSB7XG4gICAgLy8gVHlwZSBtaXNtYXRjaCAob25lIGFycmF5LCBvbmUgb2JqZWN0KVxuICAgIGVtaXRSZXBsYWNlKHBhdGgsIHRhcmdldCwgb3BzKVxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKGN1cnJlbnRJc0FycmF5KSB7XG4gICAgZGlmZkFycmF5KGN1cnJlbnQsIHRhcmdldCBhcyBKU09OVmFsdWVbXSwgcGF0aCwgb3BzKVxuICB9IGVsc2Uge1xuICAgIGRpZmZPYmplY3QoY3VycmVudCBhcyBKU09OUmVjb3JkLCB0YXJnZXQgYXMgSlNPTlJlY29yZCwgcGF0aCwgb3BzKVxuICB9XG59XG5cbmZ1bmN0aW9uIGRpZmZPYmplY3QoY3VycmVudDogSlNPTlJlY29yZCwgdGFyZ2V0OiBKU09OUmVjb3JkLCBwYXRoOiBQYXRoLCBvcHM6IE9wW10pOiB2b2lkIHtcbiAgLy8gMS4gRGVsZXRlIGtleXMgaW4gY3VycmVudCBidXQgbm90IGluIHRhcmdldFxuICBmb3IgKGNvbnN0IGtleSBpbiBjdXJyZW50KSB7XG4gICAgaWYgKE9iamVjdC5oYXNPd24oY3VycmVudCwga2V5KSAmJiAhT2JqZWN0Lmhhc093bih0YXJnZXQsIGtleSkpIHtcbiAgICAgIG9wcy5wdXNoKHsga2luZDogXCJkZWxldGVcIiwgcGF0aCwga2V5IH0pXG4gICAgfVxuICB9XG5cbiAgLy8gMi4gQWRkL1VwZGF0ZSBrZXlzIGluIHRhcmdldFxuICBmb3IgKGNvbnN0IGtleSBpbiB0YXJnZXQpIHtcbiAgICBpZiAoT2JqZWN0Lmhhc093bih0YXJnZXQsIGtleSkpIHtcbiAgICAgIGNvbnN0IHRhcmdldFZhbCA9IHRhcmdldFtrZXldXG4gICAgICBpZiAoIU9iamVjdC5oYXNPd24oY3VycmVudCwga2V5KSkge1xuICAgICAgICBvcHMucHVzaCh7IGtpbmQ6IFwic2V0XCIsIHBhdGgsIGtleSwgdmFsdWU6IHRhcmdldFZhbCB9KVxuICAgICAgfSBlbHNlIGlmIChjdXJyZW50W2tleV0gIT09IHRhcmdldFZhbCkge1xuICAgICAgICAvLyBPbmx5IHJlY3Vyc2UgaWYgdmFsdWVzIGRpZmZlciAocmVmZXJlbmNlIGNoZWNrIGZpcnN0KVxuICAgICAgICBkaWZmVmFsdWUoY3VycmVudFtrZXldLCB0YXJnZXRWYWwsIFsuLi5wYXRoLCBrZXldLCBvcHMpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRpZmZBcnJheShjdXJyZW50OiBKU09OVmFsdWVbXSwgdGFyZ2V0OiBKU09OVmFsdWVbXSwgcGF0aDogUGF0aCwgb3BzOiBPcFtdKTogdm9pZCB7XG4gIGNvbnN0IGN1cnJlbnRMZW4gPSBjdXJyZW50Lmxlbmd0aFxuICBjb25zdCB0YXJnZXRMZW4gPSB0YXJnZXQubGVuZ3RoXG4gIGNvbnN0IG1pbkxlbiA9IGN1cnJlbnRMZW4gPCB0YXJnZXRMZW4gPyBjdXJyZW50TGVuIDogdGFyZ2V0TGVuXG5cbiAgLy8gRGlmZiBjb21tb24gZWxlbWVudHNcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtaW5MZW47IGkrKykge1xuICAgIGlmIChjdXJyZW50W2ldICE9PSB0YXJnZXRbaV0pIHtcbiAgICAgIGRpZmZWYWx1ZShjdXJyZW50W2ldLCB0YXJnZXRbaV0sIFsuLi5wYXRoLCBpXSwgb3BzKVxuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSBsZW5ndGggZGlmZmVyZW5jZVxuICBpZiAodGFyZ2V0TGVuID4gY3VycmVudExlbikge1xuICAgIG9wcy5wdXNoKHtcbiAgICAgIGtpbmQ6IFwic3BsaWNlXCIsXG4gICAgICBwYXRoLFxuICAgICAgaW5kZXg6IGN1cnJlbnRMZW4sXG4gICAgICBkZWxldGVDb3VudDogMCxcbiAgICAgIGluc2VydHM6IHRhcmdldC5zbGljZShjdXJyZW50TGVuKSxcbiAgICB9KVxuICB9IGVsc2UgaWYgKGN1cnJlbnRMZW4gPiB0YXJnZXRMZW4pIHtcbiAgICBvcHMucHVzaCh7XG4gICAgICBraW5kOiBcInNwbGljZVwiLFxuICAgICAgcGF0aCxcbiAgICAgIGluZGV4OiB0YXJnZXRMZW4sXG4gICAgICBkZWxldGVDb3VudDogY3VycmVudExlbiAtIHRhcmdldExlbixcbiAgICAgIGluc2VydHM6IFtdLFxuICAgIH0pXG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdFJlcGxhY2UocGF0aDogUGF0aCwgdmFsdWU6IEpTT05WYWx1ZSwgb3BzOiBPcFtdKTogdm9pZCB7XG4gIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIENhbm5vdCByZXBsYWNlIHJvb3QgZGlyZWN0bHkgdmlhIE9wcyAodW5sZXNzIHdlIGRlZmluZSBhICdyb290JyBvcCwgd2hpY2ggd2UgZG9uJ3QpXG4gICAgLy8gV2UgZXhwZWN0IHJvb3QgdG8gYmUgaGFuZGxlZCBieSBkaWZmT2JqZWN0IHVzdWFsbHkuXG4gICAgLy8gSWYgd2UgbGFuZCBoZXJlLCBpdCBtZWFucyByb290IHR5cGVzIG1pc21hdGNoZWQgKGUuZy4gT2JqIC0+IEFycmF5KS5cbiAgICBmYWlsdXJlKFwiU3RhdGVTeW5jTG9nOiBDYW5ub3QgcmVwbGFjZSByb290IHN0YXRlIGRpcmVjdGx5IHZpYSBPcHMuXCIpXG4gIH1cblxuICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5zbGljZSgwLCAtMSlcbiAgY29uc3Qga2V5VG9DaGVjayA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXVxuXG4gIGlmICh0eXBlb2Yga2V5VG9DaGVjayA9PT0gXCJzdHJpbmdcIikge1xuICAgIC8vIFBhcmVudCBpcyBPYmplY3RcbiAgICBvcHMucHVzaCh7IGtpbmQ6IFwic2V0XCIsIHBhdGg6IHBhcmVudFBhdGgsIGtleToga2V5VG9DaGVjaywgdmFsdWUgfSlcbiAgfSBlbHNlIHtcbiAgICAvLyBQYXJlbnQgaXMgQXJyYXlcbiAgICBvcHMucHVzaCh7XG4gICAgICBraW5kOiBcInNwbGljZVwiLFxuICAgICAgcGF0aDogcGFyZW50UGF0aCxcbiAgICAgIGluZGV4OiBrZXlUb0NoZWNrLFxuICAgICAgZGVsZXRlQ291bnQ6IDEsXG4gICAgICBpbnNlcnRzOiBbdmFsdWVdLFxuICAgIH0pXG4gIH1cbn1cbiIsImltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi9lcnJvclwiXG5cbi8qKlxuICogUGFyc2VkIHR4IHRpbWVzdGFtcCBjb21wb25lbnRzLlxuICovXG5leHBvcnQgdHlwZSBUeFRpbWVzdGFtcCA9IHtcbiAgZXBvY2g6IG51bWJlclxuICBjbG9jazogbnVtYmVyXG4gIGNsaWVudElkOiBzdHJpbmdcbiAgd2FsbENsb2NrOiBudW1iZXJcbn1cblxuLyoqXG4gKiBVbmlxdWUgdHggSUQgKENvbXBvc2l0ZSBLZXkpLlxuICovXG5leHBvcnQgdHlwZSBUeFRpbWVzdGFtcEtleSA9IHN0cmluZ1xuXG4vKipcbiAqIENvbnZlcnRzIGEgdGltZXN0YW1wIG9iamVjdCB0byBhIFRyYW5zYWN0aW9uVGltZXN0YW1wS2V5IHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR4VGltZXN0YW1wVG9LZXkodHM6IFR4VGltZXN0YW1wKTogVHhUaW1lc3RhbXBLZXkge1xuICByZXR1cm4gYCR7dHMuZXBvY2h9OyR7dHMuY2xvY2t9OyR7dHMuY2xpZW50SWR9OyR7dHMud2FsbENsb2NrfWBcbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gcGFyc2UgdHggdGltZXN0YW1wIGtleXMuXG4gKiBUaHJvd3MgaWYga2V5IGlzIG1hbGZvcm1lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVHhUaW1lc3RhbXBLZXkoa2V5OiBUeFRpbWVzdGFtcEtleSk6IFR4VGltZXN0YW1wIHtcbiAgY29uc3QgaTEgPSBrZXkuaW5kZXhPZihcIjtcIilcbiAgY29uc3QgaTIgPSBrZXkuaW5kZXhPZihcIjtcIiwgaTEgKyAxKVxuICBjb25zdCBpMyA9IGtleS5pbmRleE9mKFwiO1wiLCBpMiArIDEpXG5cbiAgaWYgKGkxID09PSAtMSB8fCBpMiA9PT0gLTEgfHwgaTMgPT09IC0xKSB7XG4gICAgZmFpbHVyZShgTWFsZm9ybWVkIHRpbWVzdGFtcCBrZXk6ICR7a2V5fWApXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGVwb2NoOiBOdW1iZXIucGFyc2VJbnQoa2V5LnN1YnN0cmluZygwLCBpMSksIDEwKSxcbiAgICBjbG9jazogTnVtYmVyLnBhcnNlSW50KGtleS5zdWJzdHJpbmcoaTEgKyAxLCBpMiksIDEwKSxcbiAgICBjbGllbnRJZDoga2V5LnN1YnN0cmluZyhpMiArIDEsIGkzKSxcbiAgICB3YWxsQ2xvY2s6IE51bWJlci5wYXJzZUludChrZXkuc3Vic3RyaW5nKGkzICsgMSksIDEwKSxcbiAgfVxufVxuXG4vKipcbiAqIENvbXBhcmVzIHR3byB0eCB0aW1lc3RhbXBzIGZvciBkZXRlcm1pbmlzdGljIG9yZGVyaW5nLlxuICogU29ydCBvcmRlcjogZXBvY2ggKGFzYykg4oaSIGNsb2NrIChhc2MpIOKGkiBjbGllbnRJZCAoYXNjKVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZVR4VGltZXN0YW1wcyhhOiBUeFRpbWVzdGFtcCwgYjogVHhUaW1lc3RhbXApOiBudW1iZXIge1xuICBpZiAoYS5lcG9jaCAhPT0gYi5lcG9jaCkgcmV0dXJuIGEuZXBvY2ggLSBiLmVwb2NoXG4gIGlmIChhLmNsb2NrICE9PSBiLmNsb2NrKSByZXR1cm4gYS5jbG9jayAtIGIuY2xvY2tcbiAgaWYgKGEuY2xpZW50SWQgPCBiLmNsaWVudElkKSByZXR1cm4gLTFcbiAgaWYgKGEuY2xpZW50SWQgPiBiLmNsaWVudElkKSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuIiwiaW1wb3J0IHR5cGUgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuL2Vycm9yXCJcbmltcG9ydCB7IFR4UmVjb3JkIH0gZnJvbSBcIi4vVHhSZWNvcmRcIlxuaW1wb3J0IHsgcGFyc2VUeFRpbWVzdGFtcEtleSwgdHlwZSBUeFRpbWVzdGFtcCwgdHlwZSBUeFRpbWVzdGFtcEtleSB9IGZyb20gXCIuL3R4VGltZXN0YW1wXCJcblxuLyoqXG4gKiBBIGNhY2hlZCB0eCBlbnRyeSB3aXRoIGxhenkgcGFyc2luZyBhbmQgb3B0aW9uYWwgdHggY2FjaGluZy5cbiAqIFRoZSB0aW1lc3RhbXAgaXMgcGFyc2VkIG9uIGZpcnN0IGFjY2VzcyBhbmQgY2FjaGVkLlxuICogVGhlIHR4IHJlY29yZCBjYW4gYmUgZmV0Y2hlZCBsYXppbHkgYW5kIGNhY2hlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNvcnRlZFR4RW50cnkge1xuICBwcml2YXRlIF90eFRpbWVzdGFtcD86IFR4VGltZXN0YW1wXG4gIHByaXZhdGUgX29yaWdpbmFsVHhUaW1lc3RhbXBLZXk/OiBUeFRpbWVzdGFtcEtleSB8IG51bGxcbiAgcHJpdmF0ZSBfb3JpZ2luYWxUeFRpbWVzdGFtcD86IFR4VGltZXN0YW1wIHwgbnVsbFxuICBwcml2YXRlIF90eFJlY29yZD86IFR4UmVjb3JkXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgdHhUaW1lc3RhbXBLZXk6IFR4VGltZXN0YW1wS2V5LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3lUeDogWS5NYXA8VHhSZWNvcmQ+XG4gICkge31cblxuICAvKipcbiAgICogR2V0cyB0aGUgcGFyc2VkIHRpbWVzdGFtcCwgbGF6aWx5IHBhcnNpbmcgYW5kIGNhY2hpbmcgb24gZmlyc3QgYWNjZXNzLlxuICAgKi9cbiAgZ2V0IHR4VGltZXN0YW1wKCk6IFR4VGltZXN0YW1wIHtcbiAgICBpZiAoIXRoaXMuX3R4VGltZXN0YW1wKSB7XG4gICAgICB0aGlzLl90eFRpbWVzdGFtcCA9IHBhcnNlVHhUaW1lc3RhbXBLZXkodGhpcy50eFRpbWVzdGFtcEtleSlcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3R4VGltZXN0YW1wXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgb3JpZ2luYWwgdHggdGltZXN0YW1wIGtleSwgbGF6aWx5IGFuZCBjYWNoaW5nIG9uIGZpcnN0IGFjY2Vzcy5cbiAgICovXG4gIGdldCBvcmlnaW5hbFR4VGltZXN0YW1wS2V5KCk6IFR4VGltZXN0YW1wS2V5IHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuX29yaWdpbmFsVHhUaW1lc3RhbXBLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdHggPSB0aGlzLnR4UmVjb3JkXG4gICAgICB0aGlzLl9vcmlnaW5hbFR4VGltZXN0YW1wS2V5ID0gdHgub3JpZ2luYWxUeEtleSA/PyBudWxsXG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9vcmlnaW5hbFR4VGltZXN0YW1wS2V5XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgcGFyc2VkIG9yaWdpbmFsIHR4IHRpbWVzdGFtcCwgbGF6aWx5IHBhcnNpbmcgYW5kIGNhY2hpbmcgb24gZmlyc3QgYWNjZXNzLlxuICAgKi9cbiAgZ2V0IG9yaWdpbmFsVHhUaW1lc3RhbXAoKTogVHhUaW1lc3RhbXAgfCBudWxsIHtcbiAgICBpZiAodGhpcy5fb3JpZ2luYWxUeFRpbWVzdGFtcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLm9yaWdpbmFsVHhUaW1lc3RhbXBLZXlcbiAgICAgIHRoaXMuX29yaWdpbmFsVHhUaW1lc3RhbXAgPSBrZXkgPyBwYXJzZVR4VGltZXN0YW1wS2V5KGtleSkgOiBudWxsXG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9vcmlnaW5hbFR4VGltZXN0YW1wXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbG9naWNhbCAoZGVkdXBsaWNhdGVkKSB0eCB0aW1lc3RhbXAga2V5LlxuICAgKiBUaGlzIGlzIHRoZSBvcmlnaW5hbCB0eCBrZXkgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgdGhlIHBoeXNpY2FsIGtleS5cbiAgICovXG4gIGdldCBkZWR1cFR4VGltZXN0YW1wS2V5KCk6IFR4VGltZXN0YW1wS2V5IHtcbiAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFR4VGltZXN0YW1wS2V5ID8/IHRoaXMudHhUaW1lc3RhbXBLZXlcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsb2dpY2FsIChkZWR1cGxpY2F0ZWQpIHBhcnNlZCB0eCB0aW1lc3RhbXAuXG4gICAqIFRoaXMgaXMgdGhlIG9yaWdpbmFsIHR4IHRpbWVzdGFtcCBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSB0aGUgcGh5c2ljYWwgdGltZXN0YW1wLlxuICAgKi9cbiAgZ2V0IGRlZHVwVHhUaW1lc3RhbXAoKTogVHhUaW1lc3RhbXAge1xuICAgIHJldHVybiB0aGlzLm9yaWdpbmFsVHhUaW1lc3RhbXAgPz8gdGhpcy50eFRpbWVzdGFtcFxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHR4IHJlY29yZCwgbGF6aWx5IGZldGNoaW5nIGFuZCBjYWNoaW5nIG9uIGZpcnN0IGFjY2Vzcy5cbiAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIHR4IGRvZXNuJ3QgZXhpc3QuXG4gICAqL1xuICBnZXQgdHhSZWNvcmQoKTogVHhSZWNvcmQge1xuICAgIGlmICghdGhpcy5fdHhSZWNvcmQpIHtcbiAgICAgIHRoaXMuX3R4UmVjb3JkID0gdGhpcy5feVR4LmdldCh0aGlzLnR4VGltZXN0YW1wS2V5KVxuICAgICAgaWYgKCF0aGlzLl90eFJlY29yZCkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKGBTb3J0ZWRUeEVudHJ5OiBUeFJlY29yZCBub3QgZm91bmQgZm9yIGtleSAke3RoaXMudHhUaW1lc3RhbXBLZXl9YClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3R4UmVjb3JkXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IHR5cGUgQ2hlY2twb2ludFJlY29yZCwgdHlwZSBDbGllbnRXYXRlcm1hcmtzIH0gZnJvbSBcIi4vY2hlY2twb2ludHNcIlxuaW1wb3J0IHsgYXBwbHlUeEltbXV0YWJsZSB9IGZyb20gXCIuL2RyYWZ0XCJcbmltcG9ydCB7IEpTT05PYmplY3QgfSBmcm9tIFwiLi9qc29uXCJcbmltcG9ydCB7IE9wLCBWYWxpZGF0ZUZuIH0gZnJvbSBcIi4vb3BlcmF0aW9uc1wiXG5pbXBvcnQgeyBjb21wdXRlUmVjb25jaWxlT3BzIH0gZnJvbSBcIi4vcmVjb25jaWxlXCJcbmltcG9ydCB7IFNvcnRlZFR4RW50cnkgfSBmcm9tIFwiLi9Tb3J0ZWRUeEVudHJ5XCJcbmltcG9ydCB7IFR4UmVjb3JkIH0gZnJvbSBcIi4vVHhSZWNvcmRcIlxuaW1wb3J0IHsgY29tcGFyZVR4VGltZXN0YW1wcywgdHlwZSBUeFRpbWVzdGFtcCwgdHlwZSBUeFRpbWVzdGFtcEtleSB9IGZyb20gXCIuL3R4VGltZXN0YW1wXCJcbmltcG9ydCB7IGxhenkgfSBmcm9tIFwiLi91dGlsc1wiXG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgdHJhbnNhY3Rpb24gaXMgY292ZXJlZCBieSB0aGUgY2hlY2twb2ludCB3YXRlcm1hcmtzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNUcmFuc2FjdGlvbkluQ2hlY2twb2ludCh0czogVHhUaW1lc3RhbXAsIHdhdGVybWFya3M6IENsaWVudFdhdGVybWFya3MpOiBib29sZWFuIHtcbiAgY29uc3Qgd20gPSB3YXRlcm1hcmtzW3RzLmNsaWVudElkXVxuICBpZiAoIXdtKSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIHRzLmNsb2NrIDw9IHdtLm1heENsb2NrXG59XG5cbi8qKlxuICogU3RhdGVDYWxjdWxhdG9yIGVuY2Fwc3VsYXRlcyB0aGUgc29ydGVkIHRyYW5zYWN0aW9uIGNhY2hlIGFuZCBzdGF0ZSBjYWxjdWxhdGlvbiBsb2dpYy5cbiAqXG4gKiBJdCBtYWludGFpbnM6XG4gKiAtIEEgc29ydGVkIGFycmF5IG9mIHRyYW5zYWN0aW9uIGVudHJpZXNcbiAqIC0gQSBtYXAgZm9yIE8oMSkgbG9va3VwXG4gKiAtIEEgdHJhY2tpbmcgaW5kZXggaW5kaWNhdGluZyB1cCB0byB3aGljaCB0eCB0aGUgc3RhdGUgaGFzIGJlZW4gY2FsY3VsYXRlZFxuICogLSBUaGUgY2FjaGVkIGNhbGN1bGF0ZWQgc3RhdGVcbiAqIC0gVGhlIGJhc2UgY2hlY2twb2ludFxuICpcbiAqIFRoZSB0cmFja2luZyBpbmRleCBpcyBpbnZhbGlkYXRlZCAoc2V0IHRvIG51bGwpIHdoZW46XG4gKiAtIEEgdHJhbnNhY3Rpb24gaXMgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBhbHJlYWR5LWNhbGN1bGF0ZWQgc2xpY2VcbiAqIC0gQSB0cmFuc2FjdGlvbiBpcyBkZWxldGVkIGZyb20gdGhlIGFscmVhZHktY2FsY3VsYXRlZCBzbGljZVxuICogLSBUaGUgYmFzZSBjaGVja3BvaW50IGNoYW5nZXNcbiAqL1xuZXhwb3J0IGNsYXNzIFN0YXRlQ2FsY3VsYXRvciB7XG4gIC8qKiBTb3J0ZWQgdHggY2FjaGUgKEFMTCBhY3RpdmUvZnV0dXJlIHR4cywga2VwdCBzb3J0ZWQgYnkgdGltZXN0YW1wKSAqL1xuICBwcml2YXRlIHNvcnRlZFR4czogU29ydGVkVHhFbnRyeVtdID0gW11cblxuICAvKiogTygxKSBleGlzdGVuY2UgY2hlY2sgYW5kIGxvb2t1cCAqL1xuICBwcml2YXRlIHNvcnRlZFR4c01hcDogTWFwPFR4VGltZXN0YW1wS2V5LCBTb3J0ZWRUeEVudHJ5PiA9IG5ldyBNYXAoKVxuXG4gIC8qKlxuICAgKiBJbmRleCBvZiB0aGUgbGFzdCB0cmFuc2FjdGlvbiBhcHBsaWVkIHRvIGNhY2hlZFN0YXRlLlxuICAgKiAtIG51bGw6IHN0YXRlIG5lZWRzIGZ1bGwgcmVjYWxjdWxhdGlvbiBmcm9tIGNoZWNrcG9pbnRcbiAgICogLSAtMTogbm8gdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBhcHBsaWVkIHlldCAoc3RhdGUgPT09IGNoZWNrcG9pbnQgc3RhdGUpXG4gICAqIC0gPj0gMDogdHJhbnNhY3Rpb25zIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhpcyBpbmRleCBoYXZlIGJlZW4gYXBwbGllZFxuICAgKi9cbiAgcHJpdmF0ZSBsYXN0QXBwbGllZEluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbFxuXG4gIC8qKiBUaGUgY2FjaGVkIGNhbGN1bGF0ZWQgc3RhdGUgKi9cbiAgcHJpdmF0ZSBjYWNoZWRTdGF0ZTogSlNPTk9iamVjdCB8IG51bGwgPSBudWxsXG5cbiAgLyoqIFRoZSBiYXNlIGNoZWNrcG9pbnQgdG8gY2FsY3VsYXRlIHN0YXRlIGZyb20gKi9cbiAgcHJpdmF0ZSBiYXNlQ2hlY2twb2ludDogQ2hlY2twb2ludFJlY29yZCB8IG51bGwgPSBudWxsXG5cbiAgLyoqXG4gICAqIEFwcGxpZWQgZGVkdXAga2V5cyAtIHRyYWNrcyB3aGljaCBMT0dJQ0FMIHR4cyBoYXZlIGJlZW4gYXBwbGllZC5cbiAgICogVGhpcyBpcyB0aGUgb3JpZ2luYWxUeEtleSAob3IgcGh5c2ljYWwga2V5IGlmIG5vIG9yaWdpbmFsKSBmb3IgZWFjaCBhcHBsaWVkIHR4LlxuICAgKiBVc2VkIHRvIHByb3Blcmx5IGRlZHVwbGljYXRlIHJlLWVtaXRzLlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBsaWVkVHhLZXlzOiBTZXQ8VHhUaW1lc3RhbXBLZXk+ID0gbmV3IFNldCgpXG5cbiAgLyoqIE1heCBjbG9jayBzZWVuIGZyb20gYW55IHRyYW5zYWN0aW9uIChmb3IgTGFtcG9ydCBjbG9jayB1cGRhdGVzKSAqL1xuICBwcml2YXRlIG1heFNlZW5DbG9jayA9IDBcblxuICAvKiogVmFsaWRhdGlvbiBmdW5jdGlvbiAob3B0aW9uYWwpICovXG4gIHByaXZhdGUgdmFsaWRhdGVGbj86IFZhbGlkYXRlRm48SlNPTk9iamVjdD5cblxuICBjb25zdHJ1Y3Rvcih2YWxpZGF0ZUZuPzogVmFsaWRhdGVGbjxKU09OT2JqZWN0Pikge1xuICAgIHRoaXMudmFsaWRhdGVGbiA9IHZhbGlkYXRlRm5cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBiYXNlIGNoZWNrcG9pbnQuIEludmFsaWRhdGVzIGNhY2hlZCBzdGF0ZSBpZiBjaGVja3BvaW50IGNoYW5nZWQuXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGNoZWNrcG9pbnQgY2hhbmdlZFxuICAgKi9cbiAgc2V0QmFzZUNoZWNrcG9pbnQoY2hlY2twb2ludDogQ2hlY2twb2ludFJlY29yZCB8IG51bGwpOiBib29sZWFuIHtcbiAgICBpZiAoY2hlY2twb2ludCA9PT0gdGhpcy5iYXNlQ2hlY2twb2ludCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgdGhpcy5iYXNlQ2hlY2twb2ludCA9IGNoZWNrcG9pbnRcbiAgICB0aGlzLmludmFsaWRhdGUoKVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBiYXNlIGNoZWNrcG9pbnQuXG4gICAqL1xuICBnZXRCYXNlQ2hlY2twb2ludCgpOiBDaGVja3BvaW50UmVjb3JkIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZUNoZWNrcG9pbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgYWxsIHRyYW5zYWN0aW9ucyBhbmQgcmVidWlsZHMgZnJvbSB5VHggbWFwLlxuICAgKiBUaGlzIGlzIHVzZWQgd2hlbiB0aGUgY2hlY2twb2ludCBjaGFuZ2VzIGFuZCB3ZSBuZWVkIGEgZnJlc2ggc3RhcnQuXG4gICAqL1xuICByZWJ1aWxkRnJvbVlqcyh5VHg6IFkuTWFwPFR4UmVjb3JkPik6IHZvaWQge1xuICAgIHRoaXMuc29ydGVkVHhzID0gW11cbiAgICB0aGlzLnNvcnRlZFR4c01hcC5jbGVhcigpXG5cbiAgICAvLyBDb2xsZWN0IGFsbCBlbnRyaWVzLCBidWlsZCB0aGUgbWFwIGFuZCBtYXggY2xvY2tcbiAgICBmb3IgKGNvbnN0IGtleSBvZiB5VHgua2V5cygpKSB7XG4gICAgICBjb25zdCBlbnRyeSA9IG5ldyBTb3J0ZWRUeEVudHJ5KGtleSwgeVR4KVxuICAgICAgdGhpcy5zb3J0ZWRUeHMucHVzaChlbnRyeSlcblxuICAgICAgdGhpcy5zb3J0ZWRUeHNNYXAuc2V0KGVudHJ5LnR4VGltZXN0YW1wS2V5LCBlbnRyeSlcbiAgICAgIGlmIChlbnRyeS50eFRpbWVzdGFtcC5jbG9jayA+IHRoaXMubWF4U2VlbkNsb2NrKSB7XG4gICAgICAgIHRoaXMubWF4U2VlbkNsb2NrID0gZW50cnkudHhUaW1lc3RhbXAuY2xvY2tcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTb3J0IG9uY2UgLSBPKG4gbG9nIG4pXG4gICAgdGhpcy5zb3J0ZWRUeHMuc29ydCgoYSwgYikgPT4gY29tcGFyZVR4VGltZXN0YW1wcyhhLnR4VGltZXN0YW1wLCBiLnR4VGltZXN0YW1wKSlcblxuICAgIC8vIEludmFsaWRhdGUgY2FjaGVkIHN0YXRlIHNpbmNlIHdlIHJlYnVpbHRcbiAgICB0aGlzLmludmFsaWRhdGUoKVxuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydHMgYSB0cmFuc2FjdGlvbiBpbnRvIHRoZSBzb3J0ZWQgY2FjaGUuXG4gICAqIEludmFsaWRhdGVzIGNhY2hlZCBzdGF0ZSBpZiB0aGUgdHJhbnNhY3Rpb24gd2FzIGluc2VydGVkIGJlZm9yZSB0aGUgY2FsY3VsYXRlZCBzbGljZS5cbiAgICpcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGlzIGNhdXNlZCBpbnZhbGlkYXRpb24gKG91dC1vZi1vcmRlciBpbnNlcnQpXG4gICAqL1xuICBpbnNlcnRUeChrZXk6IFR4VGltZXN0YW1wS2V5LCB5VHg6IFkuTWFwPFR4UmVjb3JkPik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnNvcnRlZFR4c01hcC5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlIC8vIEFscmVhZHkgZXhpc3RzXG4gICAgfVxuXG4gICAgY29uc3QgZW50cnkgPSBuZXcgU29ydGVkVHhFbnRyeShrZXksIHlUeClcbiAgICBjb25zdCB0cyA9IGVudHJ5LnR4VGltZXN0YW1wXG5cbiAgICAvLyBVcGRhdGUgbWF4IHNlZW4gY2xvY2sgZm9yIExhbXBvcnQgY2xvY2sgbWVjaGFuaXNtXG4gICAgaWYgKHRzLmNsb2NrID4gdGhpcy5tYXhTZWVuQ2xvY2spIHtcbiAgICAgIHRoaXMubWF4U2VlbkNsb2NrID0gdHMuY2xvY2tcbiAgICB9XG5cbiAgICBjb25zdCBzb3J0ZWRUeHMgPSB0aGlzLnNvcnRlZFR4c1xuXG4gICAgLy8gRmluZCBpbnNlcnRpb24gcG9zaXRpb24gKHNlYXJjaCBmcm9tIGVuZCBzaW5jZSBuZXcgdHhzIHR5cGljYWxseSBoYXZlIGhpZ2hlciB0aW1lc3RhbXBzKVxuICAgIGxldCBpbnNlcnRJbmRleCA9IHNvcnRlZFR4cy5sZW5ndGggLy8gRGVmYXVsdDogYXBwZW5kIGF0IGVuZFxuICAgIGZvciAobGV0IGkgPSBzb3J0ZWRUeHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nVHMgPSBzb3J0ZWRUeHNbaV0udHhUaW1lc3RhbXBcbiAgICAgIGlmIChjb21wYXJlVHhUaW1lc3RhbXBzKHRzLCBleGlzdGluZ1RzKSA+PSAwKSB7XG4gICAgICAgIGluc2VydEluZGV4ID0gaSArIDFcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgIGluc2VydEluZGV4ID0gMCAvLyBJbnNlcnQgYXQgYmVnaW5uaW5nXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5zZXJ0IGF0IHRoZSBmb3VuZCBwb3NpdGlvblxuICAgIHNvcnRlZFR4cy5zcGxpY2UoaW5zZXJ0SW5kZXgsIDAsIGVudHJ5KVxuICAgIHRoaXMuc29ydGVkVHhzTWFwLnNldChrZXksIGVudHJ5KVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBpbnZhbGlkYXRlcyBvdXIgY2FjaGVkIHN0YXRlXG4gICAgLy8gSWYgd2UgaW5zZXJ0ZWQgYmVmb3JlIG9yIGF0IHRoZSBsYXN0IGFwcGxpZWQgaW5kZXgsIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGVcbiAgICBpZiAodGhpcy5sYXN0QXBwbGllZEluZGV4ICE9PSBudWxsICYmIGluc2VydEluZGV4IDw9IHRoaXMubGFzdEFwcGxpZWRJbmRleCkge1xuICAgICAgdGhpcy5pbnZhbGlkYXRlKClcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBtdWx0aXBsZSB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgc29ydGVkIGNhY2hlLlxuICAgKiBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIGtleXMgdGhhdCB3ZXJlIGFjdHVhbGx5IHJlbW92ZWRcbiAgICovXG4gIHJlbW92ZVR4cyhrZXlzOiByZWFkb25seSBUeFRpbWVzdGFtcEtleVtdKTogbnVtYmVyIHtcbiAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgICBsZXQgcmVtb3ZlZENvdW50ID0gMFxuICAgIGxldCBtaW5SZW1vdmVkSW5kZXggPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcblxuICAgIC8vIEJ1aWxkIHNldCBvZiBrZXlzIHRvIGRlbGV0ZSBhbmQgdHJhY2sgdGhlaXIgaW5kaWNlc1xuICAgIGNvbnN0IHRvRGVsZXRlID0gbmV3IFNldDxUeFRpbWVzdGFtcEtleT4oKVxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5zb3J0ZWRUeHNNYXAuZ2V0KGtleSlcbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICB0aGlzLnNvcnRlZFR4c01hcC5kZWxldGUoa2V5KVxuICAgICAgICB0b0RlbGV0ZS5hZGQoa2V5KVxuXG4gICAgICAgIC8vIEZpbmQgaW5kZXggZm9yIGludmFsaWRhdGlvbiBjaGVja1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuc29ydGVkVHhzLmluZGV4T2YoZW50cnkpXG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEgJiYgaW5kZXggPCBtaW5SZW1vdmVkSW5kZXgpIHtcbiAgICAgICAgICBtaW5SZW1vdmVkSW5kZXggPSBpbmRleFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRvRGVsZXRlLnNpemUgPT09IDApIHJldHVybiAwXG5cbiAgICAvLyBTaW5nbGUgZm9yd2FyZCBwYXNzIHRocm91Z2ggc29ydGVkVHhzLCByZW1vdmluZyBtYXRjaGluZyBlbnRyaWVzXG4gICAgY29uc3Qgc29ydGVkVHhzID0gdGhpcy5zb3J0ZWRUeHNcbiAgICBsZXQgaSA9IDBcbiAgICB3aGlsZSAoaSA8IHNvcnRlZFR4cy5sZW5ndGggJiYgdG9EZWxldGUuc2l6ZSA+IDApIHtcbiAgICAgIGlmICh0b0RlbGV0ZS5oYXMoc29ydGVkVHhzW2ldLnR4VGltZXN0YW1wS2V5KSkge1xuICAgICAgICB0b0RlbGV0ZS5kZWxldGUoc29ydGVkVHhzW2ldLnR4VGltZXN0YW1wS2V5KVxuICAgICAgICBzb3J0ZWRUeHMuc3BsaWNlKGksIDEpXG4gICAgICAgIHJlbW92ZWRDb3VudCsrXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpKytcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGlzIGludmFsaWRhdGVzIG91ciBjYWNoZWQgc3RhdGVcbiAgICBpZiAodGhpcy5sYXN0QXBwbGllZEluZGV4ICE9PSBudWxsICYmIG1pblJlbW92ZWRJbmRleCA8PSB0aGlzLmxhc3RBcHBsaWVkSW5kZXgpIHtcbiAgICAgIHRoaXMuaW52YWxpZGF0ZSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbW92ZWRDb3VudFxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIHRyYW5zYWN0aW9uIGtleSBleGlzdHMgaW4gdGhlIGNhY2hlLlxuICAgKi9cbiAgaGFzVHgoa2V5OiBUeFRpbWVzdGFtcEtleSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNvcnRlZFR4c01hcC5oYXMoa2V5KVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSB0cmFuc2FjdGlvbiBlbnRyeSBieSBrZXkuXG4gICAqL1xuICBnZXRUeChrZXk6IFR4VGltZXN0YW1wS2V5KTogU29ydGVkVHhFbnRyeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc29ydGVkVHhzTWFwLmdldChrZXkpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbGwgc29ydGVkIHRyYW5zYWN0aW9uIGVudHJpZXMuXG4gICAqL1xuICBnZXRTb3J0ZWRUeHMoKTogcmVhZG9ubHkgU29ydGVkVHhFbnRyeVtdIHtcbiAgICByZXR1cm4gdGhpcy5zb3J0ZWRUeHNcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGluIHRoZSBjYWNoZS5cbiAgICovXG4gIGdldCB0eENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc29ydGVkVHhzLmxlbmd0aFxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3RhdGUgbmVlZHMgZnVsbCByZWNhbGN1bGF0aW9uLlxuICAgKi9cbiAgbmVlZHNGdWxsUmVjYWxjdWxhdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sYXN0QXBwbGllZEluZGV4ID09PSBudWxsXG4gIH1cblxuICAvKipcbiAgICogSW52YWxpZGF0ZXMgdGhlIGNhY2hlZCBzdGF0ZSwgZm9yY2luZyBhIGZ1bGwgcmVjYWxjdWxhdGlvbiBvbiBuZXh0IGNhbGN1bGF0ZVN0YXRlKCkuXG4gICAqIE5vdGU6IGNhY2hlZFN0YXRlIGlzIGtlcHQgc28gY29tcHV0ZVJlY29uY2lsZU9wcyBjYW4gZGlmZiBvbGQgdnMgbmV3IHN0YXRlLlxuICAgKi9cbiAgaW52YWxpZGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmxhc3RBcHBsaWVkSW5kZXggPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyBhbmQgcmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSwgYWxvbmcgd2l0aCBhIGxhenkgZ2V0dGVyIGZvciBvcHMgdGhhdCBjaGFuZ2VkIGZyb20gdGhlIHByZXZpb3VzIHN0YXRlLlxuICAgKlxuICAgKiAtIElmIGxhc3RBcHBsaWVkSW5kZXggaXMgbnVsbDogZnVsbCByZWNhbGN1bGF0aW9uIGZyb20gY2hlY2twb2ludFxuICAgKiAtIElmIGxhc3RBcHBsaWVkSW5kZXggPj0gLTE6IGluY3JlbWVudGFsIGFwcGx5IGZyb20gbGFzdEFwcGxpZWRJbmRleCArIDFcbiAgICovXG4gIGNhbGN1bGF0ZVN0YXRlKCk6IHsgc3RhdGU6IEpTT05PYmplY3Q7IGdldEFwcGxpZWRPcHM6ICgpID0+IHJlYWRvbmx5IE9wW10gfSB7XG4gICAgY29uc3QgYmFzZVN0YXRlOiBKU09OT2JqZWN0ID0gdGhpcy5iYXNlQ2hlY2twb2ludD8uc3RhdGUgPz8ge31cbiAgICBjb25zdCB3YXRlcm1hcmtzID0gdGhpcy5iYXNlQ2hlY2twb2ludD8ud2F0ZXJtYXJrcyA/PyB7fVxuICAgIGNvbnN0IGhhc1dhdGVybWFya3MgPSBPYmplY3Qua2V5cyh3YXRlcm1hcmtzKS5sZW5ndGggPiAwXG5cbiAgICBpZiAodGhpcy5sYXN0QXBwbGllZEluZGV4ID09PSBudWxsKSB7XG4gICAgICAvLyBTTE9XIFBBVEg6IEZ1bGwgcmVjYWxjdWxhdGlvblxuICAgICAgcmV0dXJuIHRoaXMuZnVsbFJlY2FsY3VsYXRpb24oYmFzZVN0YXRlLCB3YXRlcm1hcmtzLCBoYXNXYXRlcm1hcmtzKVxuICAgIH1cblxuICAgIC8vIEZBU1QgUEFUSDogSW5jcmVtZW50YWwgYXBwbHlcbiAgICByZXR1cm4gdGhpcy5pbmNyZW1lbnRhbEFwcGx5KHdhdGVybWFya3MsIGhhc1dhdGVybWFya3MpXG4gIH1cblxuICAvKipcbiAgICogRnVsbCByZWNhbGN1bGF0aW9uIG9mIHN0YXRlIGZyb20gdGhlIGJhc2UgY2hlY2twb2ludC5cbiAgICovXG4gIHByaXZhdGUgZnVsbFJlY2FsY3VsYXRpb24oXG4gICAgYmFzZVN0YXRlOiBKU09OT2JqZWN0LFxuICAgIHdhdGVybWFya3M6IENsaWVudFdhdGVybWFya3MsXG4gICAgaGFzV2F0ZXJtYXJrczogYm9vbGVhblxuICApOiB7IHN0YXRlOiBKU09OT2JqZWN0OyBnZXRBcHBsaWVkT3BzOiAoKSA9PiByZWFkb25seSBPcFtdIH0ge1xuICAgIGNvbnN0IG9sZFN0YXRlID0gdGhpcy5jYWNoZWRTdGF0ZSA/PyB7fVxuXG4gICAgLy8gUmVzZXQgdHJhY2tpbmcgZm9yIGZ1bGwgcmVjb21wdXRlXG4gICAgdGhpcy5hcHBsaWVkVHhLZXlzLmNsZWFyKClcbiAgICB0aGlzLmxhc3RBcHBsaWVkSW5kZXggPSAtMVxuICAgIHRoaXMuY2FjaGVkU3RhdGUgPSBiYXNlU3RhdGVcblxuICAgIC8vIERlbGVnYXRlIHRvIGluY3JlbWVudGFsIGFwcGx5IHRvIHJlcGxheSBhbGwgdHJhbnNhY3Rpb25zXG4gICAgLy8gV2UgaWdub3JlIHRoZSByZXR1cm5lZCBvcHMgYmVjYXVzZSB0aGV5IHJlcHJlc2VudCB0aGUgb3BlcmF0aW9ucyBhcHBsaWVkIGZyb20gdGhlIGJhc2Ugc3RhdGUsXG4gICAgLy8gd2hlcmVhcyB3ZSB3YW50IHRoZSBkaWZmIGZyb20gdGhlICpwcmV2aW91cyBjYWNoZWQgc3RhdGUqLlxuICAgIC8vIFdlIHBhc3MgcmV0dXJuT3BzPWZhbHNlIHRvIGF2b2lkIGNvbGxlY3Rpbmcgb3BzIGR1cmluZyByZXBsYXkuXG4gICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcy5pbmNyZW1lbnRhbEFwcGx5KHdhdGVybWFya3MsIGhhc1dhdGVybWFya3MsIGZhbHNlKVxuXG4gICAgLy8gTGF6eSBsb2FkIHRoZSByZWNvbmNpbGlhdGlvbiBvcHMgKGV4cGVuc2l2ZSBkaWZmKVxuICAgIGNvbnN0IGdldEFwcGxpZWRPcHMgPSBsYXp5KCgpID0+IGNvbXB1dGVSZWNvbmNpbGVPcHMob2xkU3RhdGUsIHN0YXRlKSlcblxuICAgIHJldHVybiB7IHN0YXRlLCBnZXRBcHBsaWVkT3BzIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbmNyZW1lbnRhbCBhcHBseSBvZiB0cmFuc2FjdGlvbnMgZnJvbSBsYXN0QXBwbGllZEluZGV4ICsgMS5cbiAgICogQHBhcmFtIHJldHVybk9wcyBJZiB0cnVlLCBjb2xsZWN0cyBhcHBsaWVkIHRyYW5zYWN0aW9ucyAodG8gbGF6eSBjb21wdXRlIG9wcykuIElmIGZhbHNlLCBza2lwcyBjb2xsZWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBpbmNyZW1lbnRhbEFwcGx5KFxuICAgIHdhdGVybWFya3M6IENsaWVudFdhdGVybWFya3MsXG4gICAgaGFzV2F0ZXJtYXJrczogYm9vbGVhbixcbiAgICByZXR1cm5PcHMgPSB0cnVlXG4gICk6IHsgc3RhdGU6IEpTT05PYmplY3Q7IGdldEFwcGxpZWRPcHM6ICgpID0+IHJlYWRvbmx5IE9wW10gfSB7XG4gICAgbGV0IHN0YXRlID0gdGhpcy5jYWNoZWRTdGF0ZSBhcyBKU09OT2JqZWN0XG4gICAgY29uc3QgYXBwbGllZFR4czogVHhSZWNvcmRbXSA9IFtdXG4gICAgY29uc3Qgc29ydGVkVHhzID0gdGhpcy5zb3J0ZWRUeHNcbiAgICBjb25zdCBzdGFydEluZGV4ID0gdGhpcy5sYXN0QXBwbGllZEluZGV4ISArIDFcblxuICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpIDwgc29ydGVkVHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbnRyeSA9IHNvcnRlZFR4c1tpXVxuICAgICAgY29uc3QgZGVkdXBLZXkgPSBlbnRyeS5kZWR1cFR4VGltZXN0YW1wS2V5XG5cbiAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBhcHBsaWVkIChkZWR1cGxpY2F0aW9uKVxuICAgICAgaWYgKHRoaXMuYXBwbGllZFR4S2V5cy5oYXMoZGVkdXBLZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIFNraXAgaWYgaW4gY2hlY2twb2ludFxuICAgICAgaWYgKGhhc1dhdGVybWFya3MpIHtcbiAgICAgICAgY29uc3QgZGVkdXBUcyA9IGVudHJ5LmRlZHVwVHhUaW1lc3RhbXBcbiAgICAgICAgaWYgKGlzVHJhbnNhY3Rpb25JbkNoZWNrcG9pbnQoZGVkdXBUcywgd2F0ZXJtYXJrcykpIHtcbiAgICAgICAgICB0aGlzLmFwcGxpZWRUeEtleXMuYWRkKGRlZHVwS2V5KVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgdHggPSBlbnRyeS50eFJlY29yZFxuXG4gICAgICAvLyBBcHBseSB0cmFuc2FjdGlvbiAxLWJ5LTEgdG8gYXZvaWQgZHJhZnQgY29udGV4dCBwb2xsdXRpb24gb24gdmFsaWRhdGlvbiBmYWlsdXJlXG4gICAgICBjb25zdCBuZXdTdGF0ZSA9IGFwcGx5VHhJbW11dGFibGUoc3RhdGUsIHR4LCB0aGlzLnZhbGlkYXRlRm4pXG5cbiAgICAgIGlmIChuZXdTdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgc3RhdGUgPSBuZXdTdGF0ZVxuICAgICAgICBpZiAocmV0dXJuT3BzKSB7XG4gICAgICAgICAgYXBwbGllZFR4cy5wdXNoKHR4KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXBwbGllZFR4S2V5cy5hZGQoZGVkdXBLZXkpXG4gICAgICB0aGlzLmxhc3RBcHBsaWVkSW5kZXggPSBpXG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGxhc3RBcHBsaWVkSW5kZXggdG8gZW5kIGV2ZW4gaWYgYWxsIHR4cyB3ZXJlIHNraXBwZWRcbiAgICAvLyBUaGlzIGVuc3VyZXMgd2UgZG9uJ3QgcmUtcHJvY2VzcyBza2lwcGVkIHR4cyBvbiBuZXh0IGluY3JlbWVudGFsIGFwcGx5XG4gICAgaWYgKHNvcnRlZFR4cy5sZW5ndGggPiAwICYmIHRoaXMubGFzdEFwcGxpZWRJbmRleCEgPCBzb3J0ZWRUeHMubGVuZ3RoIC0gMSkge1xuICAgICAgdGhpcy5sYXN0QXBwbGllZEluZGV4ID0gc29ydGVkVHhzLmxlbmd0aCAtIDFcbiAgICB9XG5cbiAgICB0aGlzLmNhY2hlZFN0YXRlID0gc3RhdGVcblxuICAgIC8vIExhenkgZ2V0dGVyIGZvciBvcHMgKGZsYXR0ZW5zIGFwcGxpZWQgdHhzKVxuICAgIGNvbnN0IGdldEFwcGxpZWRPcHMgPSBsYXp5KCgpID0+IHtcbiAgICAgIGNvbnN0IG9wczogT3BbXSA9IFtdXG4gICAgICBmb3IgKGNvbnN0IHR4IG9mIGFwcGxpZWRUeHMpIHtcbiAgICAgICAgb3BzLnB1c2goLi4udHgub3BzKVxuICAgICAgfVxuICAgICAgcmV0dXJuIG9wc1xuICAgIH0pXG5cbiAgICByZXR1cm4geyBzdGF0ZSwgZ2V0QXBwbGllZE9wcyB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbWF4IHNlZW4gY2xvY2sgKGZvciBMYW1wb3J0IGNsb2NrIHVwZGF0ZXMpLlxuICAgKi9cbiAgZ2V0TWF4U2VlbkNsb2NrKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubWF4U2VlbkNsb2NrXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBjYWNoZWQgc3RhdGUgd2l0aG91dCByZWNhbGN1bGF0aW5nLlxuICAgKiBSZXR1cm5zIG51bGwgaWYgc3RhdGUgaGFzIG5ldmVyIGJlZW4gY2FsY3VsYXRlZC5cbiAgICovXG4gIGdldENhY2hlZFN0YXRlKCk6IEpTT05PYmplY3QgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5jYWNoZWRTdGF0ZVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxhc3QgYXBwbGllZCB0aW1lc3RhbXAuXG4gICAqL1xuICBnZXRMYXN0QXBwbGllZFRzKCk6IFR4VGltZXN0YW1wIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMubGFzdEFwcGxpZWRJbmRleCA9PT0gbnVsbCB8fCB0aGlzLmxhc3RBcHBsaWVkSW5kZXggPCAwKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zb3J0ZWRUeHNbdGhpcy5sYXN0QXBwbGllZEluZGV4XT8udHhUaW1lc3RhbXAgPz8gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxhc3QgYXBwbGllZCBpbmRleCAoZm9yIGRlYnVnZ2luZy90cmFja2luZykuXG4gICAqL1xuICBnZXRMYXN0QXBwbGllZEluZGV4KCk6IG51bWJlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmxhc3RBcHBsaWVkSW5kZXhcbiAgfVxufVxuIiwiaW1wb3J0IHsgSlNPTk9iamVjdCB9IGZyb20gXCIuL2pzb25cIlxuaW1wb3J0IHsgVmFsaWRhdGVGbiB9IGZyb20gXCIuL29wZXJhdGlvbnNcIlxuaW1wb3J0IHsgU3RhdGVDYWxjdWxhdG9yIH0gZnJvbSBcIi4vU3RhdGVDYWxjdWxhdG9yXCJcblxuLyoqXG4gKiBDbGllbnQtc2lkZSBzdGF0ZSBpbmNsdWRpbmcgY2xvY2tzIGFuZCBjYWxjdWxhdG9yIGZvciBzdGF0ZSBtYW5hZ2VtZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50U3RhdGUge1xuICAvLyBMYW1wb3J0IGNsb2NrcyAobW9ub3RvbmljLCBuZXZlciByZXNldClcbiAgbG9jYWxDbG9jazogbnVtYmVyXG5cbiAgLy8gQ2FjaGVkIGZpbmFsaXplZCBlcG9jaCAobnVsbCA9IG5vdCB5ZXQgaW5pdGlhbGl6ZWQsIHJlY2FsY3VsYXRlZCBvbmx5IHdoZW4gY2hlY2twb2ludCBtYXAgY2hhbmdlcylcbiAgY2FjaGVkRmluYWxpemVkRXBvY2g6IG51bWJlciB8IG51bGxcblxuICAvLyBTdGF0ZSBjYWxjdWxhdG9yIChtYW5hZ2VzIHNvcnRlZCB0eCBjYWNoZSwgc3RhdGUgY2FsY3VsYXRpb24sIGFuZCBpbnZhbGlkYXRpb24pXG4gIHN0YXRlQ2FsY3VsYXRvcjogU3RhdGVDYWxjdWxhdG9yXG5cbiAgLyoqXG4gICAqIFRpbWVzdGFtcCByZXRlbnRpb24gd2luZG93IGluIG1pbGxpc2Vjb25kcy5cbiAgICovXG4gIHJldGVudGlvbldpbmRvd01zOiBudW1iZXJcbn1cblxuLyoqXG4gKiBGYWN0b3J5IHRvIGNyZWF0ZSBhbiBpbml0aWFsIENsaWVudFN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDbGllbnRTdGF0ZShcbiAgdmFsaWRhdGVGbjogVmFsaWRhdGVGbjxKU09OT2JqZWN0PiB8IHVuZGVmaW5lZCxcbiAgcmV0ZW50aW9uV2luZG93TXM6IG51bWJlclxuKTogQ2xpZW50U3RhdGUge1xuICByZXR1cm4ge1xuICAgIGxvY2FsQ2xvY2s6IDAsXG4gICAgY2FjaGVkRmluYWxpemVkRXBvY2g6IG51bGwsIC8vIFdpbGwgYmUgcmVjYWxjdWxhdGVkIG9uIGZpcnN0IHJ1blxuICAgIHN0YXRlQ2FsY3VsYXRvcjogbmV3IFN0YXRlQ2FsY3VsYXRvcih2YWxpZGF0ZUZuKSxcbiAgICByZXRlbnRpb25XaW5kb3dNcyxcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IHR5cGUgQ2hlY2twb2ludFJlY29yZCwgcHJ1bmVDaGVja3BvaW50cyB9IGZyb20gXCIuL2NoZWNrcG9pbnRzXCJcbmltcG9ydCB7IGdldEZpbmFsaXplZEVwb2NoQW5kQ2hlY2twb2ludCB9IGZyb20gXCIuL2NoZWNrcG9pbnRVdGlsc1wiXG5pbXBvcnQgeyBDbGllbnRTdGF0ZSB9IGZyb20gXCIuL2NsaWVudFN0YXRlXCJcbmltcG9ydCB7IEpTT05PYmplY3QgfSBmcm9tIFwiLi9qc29uXCJcbmltcG9ydCB7IE9wIH0gZnJvbSBcIi4vb3BlcmF0aW9uc1wiXG5pbXBvcnQgeyBTb3J0ZWRUeEVudHJ5IH0gZnJvbSBcIi4vU29ydGVkVHhFbnRyeVwiXG5pbXBvcnQgeyBpc1RyYW5zYWN0aW9uSW5DaGVja3BvaW50IH0gZnJvbSBcIi4vU3RhdGVDYWxjdWxhdG9yXCJcbmltcG9ydCB7IFR4UmVjb3JkIH0gZnJvbSBcIi4vVHhSZWNvcmRcIlxuaW1wb3J0IHsgdHlwZSBUeFRpbWVzdGFtcCwgdHlwZSBUeFRpbWVzdGFtcEtleSwgdHhUaW1lc3RhbXBUb0tleSB9IGZyb20gXCIuL3R4VGltZXN0YW1wXCJcblxuLyoqXG4gKiBDaGFuZ2VzIHRvIHRyYW5zYWN0aW9uIGtleXMgZnJvbSBhIFkuWU1hcEV2ZW50LlxuICogLSBhZGRlZDoga2V5cyB0aGF0IHdlcmUgYWRkZWRcbiAqIC0gZGVsZXRlZDoga2V5cyB0aGF0IHdlcmUgZGVsZXRlZFxuICovXG5leHBvcnQgdHlwZSBUeEtleUNoYW5nZXMgPSB7XG4gIGFkZGVkOiByZWFkb25seSBUeFRpbWVzdGFtcEtleVtdXG4gIGRlbGV0ZWQ6IHJlYWRvbmx5IFR4VGltZXN0YW1wS2V5W11cbn1cblxuLyoqXG4gKiBBcHBlbmRzIGEgbmV3IHRyYW5zYWN0aW9uIHRvIHRoZSBsb2cuXG4gKlxuICogQHBhcmFtIG9yaWdpbmFsS2V5IC0gT3B0aW9uYWwgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCB0cmFuc2FjdGlvbiBrZXkgZm9yIHJlLWVtaXRzLlxuICogICAgICAgICAgICAgICAgICAgICAgVXNlZCBieSBzeW5jTG9nIHRvIHByZXNlcnZlIHRyYW5zYWN0aW9ucyBtaXNzZWQgYnkgY2hlY2twb2ludHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRUeChcbiAgb3BzOiByZWFkb25seSBPcFtdLFxuICB5VHg6IFkuTWFwPFR4UmVjb3JkPixcbiAgYWN0aXZlRXBvY2g6IG51bWJlcixcbiAgbXlDbGllbnRJZDogc3RyaW5nLFxuICBjbGllbnRTdGF0ZTogQ2xpZW50U3RhdGUsXG4gIG9yaWdpbmFsS2V5PzogVHhUaW1lc3RhbXBLZXlcbik6IFR4VGltZXN0YW1wS2V5IHtcbiAgY29uc3QgY2FsYyA9IGNsaWVudFN0YXRlLnN0YXRlQ2FsY3VsYXRvclxuXG4gIC8vIDEuIEFkdmFuY2UgbG9naWNhbCBjbG9jayAoTGFtcG9ydCkgYmFzZWQgb24gYWxsIHNlZW4gdHJhZmZpY1xuICBjb25zdCBjbG9jayA9IE1hdGgubWF4KGNsaWVudFN0YXRlLmxvY2FsQ2xvY2ssIGNhbGMuZ2V0TWF4U2VlbkNsb2NrKCkpICsgMVxuICBjbGllbnRTdGF0ZS5sb2NhbENsb2NrID0gY2xvY2tcblxuICAvLyAyLiBHZW5lcmF0ZSBLZXkgd2l0aCBXYWxsQ2xvY2sgZm9yIGZ1dHVyZSBwcnVuaW5nIHNhZmV0eVxuICBjb25zdCB0czogVHhUaW1lc3RhbXAgPSB7XG4gICAgZXBvY2g6IGFjdGl2ZUVwb2NoLFxuICAgIGNsb2NrLFxuICAgIGNsaWVudElkOiBteUNsaWVudElkLFxuICAgIHdhbGxDbG9jazogRGF0ZS5ub3coKSxcbiAgfVxuICBjb25zdCBrZXkgPSB0eFRpbWVzdGFtcFRvS2V5KHRzKVxuXG4gIC8vIDMuIFdyaXRlIHRvIFlqcyAoQXRvbWljKVxuICBjb25zdCByZWNvcmQ6IFR4UmVjb3JkID0geyBvcHMsIG9yaWdpbmFsVHhLZXk6IG9yaWdpbmFsS2V5IH1cbiAgeVR4LnNldChrZXksIHJlY29yZClcblxuICByZXR1cm4ga2V5XG59XG5cbi8qKlxuICogU3luY2hyb25pemVzIHRoZSB0cmFuc2FjdGlvbiBsb2cgd2l0aCB0aGUgY3VycmVudCBjaGVja3BvaW50LlxuICogUmUtZW1pdHMgbWlzc2VkIHRyYW5zYWN0aW9ucyBhbmQgcHJ1bmVzIG9sZCBvbmVzLlxuICpcbiAqIFNob3VsZCBiZSBjYWxsZWQgQkVGT1JFIHVwZGF0ZVN0YXRlIHRvIGVuc3VyZSBsb2cgaXMgY2xlYW4gYW5kIGNvbXBsZXRlLlxuICpcbiAqIEByZXR1cm5zIHRydWUgaWYgYW55IHRyYW5zYWN0aW9ucyB3ZXJlIHJlLWVtaXR0ZWQgb3IgZGVsZXRlZCwgd2hpY2ggbWF5IGludmFsaWRhdGUgbGFzdEFwcGxpZWRJbmRleFxuICovXG5mdW5jdGlvbiBzeW5jTG9nKFxuICB5VHg6IFkuTWFwPFR4UmVjb3JkPixcbiAgbXlDbGllbnRJZDogc3RyaW5nLFxuICBjbGllbnRTdGF0ZTogQ2xpZW50U3RhdGUsXG4gIGZpbmFsaXplZEVwb2NoOiBudW1iZXIsXG4gIGJhc2VDUDogQ2hlY2twb2ludFJlY29yZCB8IG51bGwsXG4gIG5ld0tleXM/OiByZWFkb25seSBUeFRpbWVzdGFtcEtleVtdIC8vIGtleXMgYWRkZWQgaW4gdGhpcyB1cGRhdGVcbik6IHZvaWQge1xuICBjb25zdCBjYWxjID0gY2xpZW50U3RhdGUuc3RhdGVDYWxjdWxhdG9yXG4gIGNvbnN0IGFjdGl2ZUVwb2NoID0gZmluYWxpemVkRXBvY2ggKyAxXG4gIGNvbnN0IHdhdGVybWFya3MgPSBiYXNlQ1A/LndhdGVybWFya3MgPz8ge31cblxuICAvLyBEZXRlcm1pbmlzdGljIFJlZmVyZW5jZSBUaW1lOiBVc2Ugc3RvcmVkIG1pbldhbGxDbG9jayBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSAwIChub3RoaW5nIGFuY2llbnQpLlxuICBjb25zdCByZWZlcmVuY2VUaW1lID0gYmFzZUNQPy5taW5XYWxsQ2xvY2sgPz8gMFxuXG4gIC8vIEhlbHBlciB0byBjaGVjayBpZiBhIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBwcnVuZWRcbiAgY29uc3Qgc2hvdWxkUHJ1bmUgPSAodHM6IFR4VGltZXN0YW1wLCBkZWR1cFRzOiBUeFRpbWVzdGFtcCk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IGlzQW5jaWVudCA9IHJlZmVyZW5jZVRpbWUgLSB0cy53YWxsQ2xvY2sgPiBjbGllbnRTdGF0ZS5yZXRlbnRpb25XaW5kb3dNc1xuICAgIGlmIChpc0FuY2llbnQpIHJldHVybiB0cnVlXG4gICAgcmV0dXJuIGlzVHJhbnNhY3Rpb25JbkNoZWNrcG9pbnQoZGVkdXBUcywgd2F0ZXJtYXJrcylcbiAgfVxuXG4gIGNvbnN0IHRvRGVsZXRlOiBUeFRpbWVzdGFtcEtleVtdID0gW11cbiAgY29uc3QgdG9SZUVtaXQ6IEFycmF5PHsgb3JpZ2luYWxLZXk6IFR4VGltZXN0YW1wS2V5OyB0eDogVHhSZWNvcmQgfT4gPSBbXVxuXG4gIC8vIDEuIEhlbHBlciB0byBkZWNpZGUgd2hhdCB0byBkbyB3aXRoIGVhY2ggdHJhbnNhY3Rpb25cbiAgY29uc3QgcHJvY2Vzc0VudHJ5ID0gKGVudHJ5OiBTb3J0ZWRUeEVudHJ5KTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKHNob3VsZFBydW5lKGVudHJ5LnR4VGltZXN0YW1wLCBlbnRyeS5kZWR1cFR4VGltZXN0YW1wKSkge1xuICAgICAgdG9EZWxldGUucHVzaChlbnRyeS50eFRpbWVzdGFtcEtleSlcbiAgICAgIHJldHVybiBmYWxzZSAvLyBkZWxldGVkXG4gICAgfVxuXG4gICAgaWYgKGVudHJ5LnR4VGltZXN0YW1wLmVwb2NoIDw9IGZpbmFsaXplZEVwb2NoKSB7XG4gICAgICAvLyBOb3QgaW4gY2hlY2twb2ludCBhbmQgc3RpbGwgZnJlc2ggLSByZS1lbWl0IGl0IHRvIHRoZSBhY3RpdmUgZXBvY2hcbiAgICAgIHRvUmVFbWl0LnB1c2goeyBvcmlnaW5hbEtleTogZW50cnkuZGVkdXBUeFRpbWVzdGFtcEtleSwgdHg6IGVudHJ5LnR4UmVjb3JkIH0pXG4gICAgICB0b0RlbGV0ZS5wdXNoKGVudHJ5LnR4VGltZXN0YW1wS2V5KVxuICAgICAgcmV0dXJuIGZhbHNlIC8vIHJlLWVtaXR0ZWRcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZSAvLyBhY3RpdmUvZnJlc2hcbiAgfVxuXG4gIC8vIDIuIFNjYW4gbG9jYWwgY2FjaGUgKHNvcnRlZFR4cykgdG8gaWRlbnRpZnkgbWlzc2luZy9hbmNpZW50IHRyYW5zYWN0aW9uc1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGNhbGMuZ2V0U29ydGVkVHhzKCkpIHtcbiAgICBpZiAocHJvY2Vzc0VudHJ5KGVudHJ5KSkge1xuICAgICAgLy8gT3B0aW1pemF0aW9uOiBQaHlzaWNhbCBrZXlzIGFyZSBzb3J0ZWQuIElmIHdlIGhpdCB0aGUgYWN0aXZlL2ZyZXNoIHRlcnJpdG9yeSwgd2UgY2FuIHN0b3AuXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHByb2Nlc3NLZXlCeVRpbWVzdGFtcEtleSA9ICh0eFRpbWVzdGFtcEtleTogVHhUaW1lc3RhbXBLZXkpOiB2b2lkID0+IHtcbiAgICAvLyBPbmx5IHByb2Nlc3MgaWYgaXQgYWN0dWFsbHkgZXhpc3RzIGluIFlqcyBNYXBcbiAgICBpZiAoeVR4Lmhhcyh0eFRpbWVzdGFtcEtleSkpIHtcbiAgICAgIHByb2Nlc3NFbnRyeShuZXcgU29ydGVkVHhFbnRyeSh0eFRpbWVzdGFtcEtleSwgeVR4KSlcbiAgICB9XG4gIH1cblxuICAvLyAzLiBTY2FuIE5FVyBrZXlzIGZyb20gWWpzIHRvIGhhbmRsZSBpbmNvbWluZyB0cmFuc2FjdGlvbnMgKHN5bmMpXG4gIC8vIEFueSBjbGllbnQgY2FuIHJlLWVtaXQgLSBkZWR1cGxpY2F0aW9uIHZpYSBvcmlnaW5hbFR4S2V5IGhhbmRsZXMgZHVwbGljYXRlcy5cbiAgaWYgKG5ld0tleXMpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBuZXdLZXlzKSB7XG4gICAgICBwcm9jZXNzS2V5QnlUaW1lc3RhbXBLZXkoa2V5KVxuICAgIH1cbiAgfVxuXG4gIC8vIDQuIFJlLWVtaXQgbWlzc2VkIHRyYW5zYWN0aW9ucyBCRUZPUkUgcHJ1bmluZ1xuICBmb3IgKGNvbnN0IHsgb3JpZ2luYWxLZXksIHR4IH0gb2YgdG9SZUVtaXQpIHtcbiAgICBjb25zdCBuZXdLZXkgPSBhcHBlbmRUeCh0eC5vcHMsIHlUeCwgYWN0aXZlRXBvY2gsIG15Q2xpZW50SWQsIGNsaWVudFN0YXRlLCBvcmlnaW5hbEtleSlcbiAgICBjYWxjLmluc2VydFR4KG5ld0tleSwgeVR4KVxuICB9XG5cbiAgLy8gNS4gUHJ1bmUgb2xkL2ZpbmFsaXplZC9yZWR1bmRhbnQgdHJhbnNhY3Rpb25zIGZyb20gWWpzIE1hcFxuICBmb3IgKGNvbnN0IGtleSBvZiB0b0RlbGV0ZSkge1xuICAgIHlUeC5kZWxldGUoa2V5KVxuICB9XG4gIGNhbGMucmVtb3ZlVHhzKHRvRGVsZXRlKVxufVxuXG4vKipcbiAqIFRoZSBwcmltYXJ5IHVwZGF0ZSBmdW5jdGlvbiB0aGF0IG1haW50YWlucyBjdXJyZW50IHN0YXRlLlxuICpcbiAqIEBwYXJhbSB0eENoYW5nZXMgLSBDaGFuZ2VzIGZyb20gWS5ZTWFwRXZlbnQuIElmIHVuZGVmaW5lZCAoZmlyc3QgcnVuKSwgcGVyZm9ybXMgYSBmdWxsIHNjYW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZShcbiAgZG9jOiBZLkRvYyxcbiAgeVR4OiBZLk1hcDxUeFJlY29yZD4sXG4gIHlDaGVja3BvaW50OiBZLk1hcDxDaGVja3BvaW50UmVjb3JkPixcbiAgbXlDbGllbnRJZDogc3RyaW5nLFxuICBjbGllbnRTdGF0ZTogQ2xpZW50U3RhdGUsXG4gIHR4Q2hhbmdlczogVHhLZXlDaGFuZ2VzIHwgdW5kZWZpbmVkXG4pOiB7IHN0YXRlOiBKU09OT2JqZWN0OyBnZXRBcHBsaWVkT3BzOiAoKSA9PiByZWFkb25seSBPcFtdIH0ge1xuICBjb25zdCBjYWxjID0gY2xpZW50U3RhdGUuc3RhdGVDYWxjdWxhdG9yXG5cbiAgLy8gQWx3YXlzIGNhbGN1bGF0ZSBmcmVzaCBmaW5hbGl6ZWQgZXBvY2ggYW5kIGNoZWNrcG9pbnQgdG8gaGFuZGxlIHN5bmMgcmFjZSBjb25kaXRpb25zXG4gIGNvbnN0IHsgZmluYWxpemVkRXBvY2gsIGNoZWNrcG9pbnQ6IGJhc2VDUCB9ID0gZ2V0RmluYWxpemVkRXBvY2hBbmRDaGVja3BvaW50KHlDaGVja3BvaW50KVxuXG4gIC8vIFVwZGF0ZSByZWFkLWNhY2hlXG4gIGNsaWVudFN0YXRlLmNhY2hlZEZpbmFsaXplZEVwb2NoID0gZmluYWxpemVkRXBvY2hcblxuICAvLyBTZXQgYmFzZSBjaGVja3BvaW50ICh0aGlzIGhhbmRsZXMgaW52YWxpZGF0aW9uIGlmIGNoZWNrcG9pbnQgY2hhbmdlZClcbiAgY2FsYy5zZXRCYXNlQ2hlY2twb2ludChiYXNlQ1ApXG5cbiAgLy8gVHJhY2sgaWYgd2UgbmVlZCB0byByZWJ1aWxkIHNvcnRlZCBjYWNoZSAoZmlyc3QgcnVuIG9yIG1pc3NpbmcgZGVsdGEpXG4gIC8vIE9wdGltaXphdGlvbjogV2UgZG9uJ3QgbmVlZCB0byByZWJ1aWxkIGp1c3QgYmVjYXVzZSBjaGVja3BvaW50IGNoYW5nZWQsXG4gIC8vIGFzIGxvbmcgYXMgd2UgaGF2ZSB0eENoYW5nZXMgdG8ga2VlcCBjYWNoZSBpbiBzeW5jLlxuICBjb25zdCBuZWVkc1JlYnVpbGRTb3J0ZWRDYWNoZSA9IGNhbGMuZ2V0Q2FjaGVkU3RhdGUoKSA9PT0gbnVsbCB8fCAhdHhDaGFuZ2VzXG5cbiAgLy8gUmVidWlsZCBzb3J0ZWQgY2FjaGUgYmVmb3JlIHN5bmNMb2cgaWYgbmVlZGVkXG4gIGlmIChuZWVkc1JlYnVpbGRTb3J0ZWRDYWNoZSkge1xuICAgIGNhbGMucmVidWlsZEZyb21ZanMoeVR4KVxuICB9IGVsc2Uge1xuICAgIC8vIElmIG5vdCByZWJ1aWxkaW5nLCBpbW1lZGlhdGVseSBwcm9jZXNzIGRlbGV0aW9ucyB0byBhdm9pZCBcImdob3N0XCIgdHJhbnNhY3Rpb25zXG4gICAgLy8gaW4gc3luY0xvZyAoZS5nLiBhdHRlbXB0aW5nIHRvIGFjY2VzcyBhIHRyYW5zYWN0aW9uIHRoYXQgd2FzIGp1c3QgZGVsZXRlZCkuXG4gICAgY2FsYy5yZW1vdmVUeHModHhDaGFuZ2VzLmRlbGV0ZWQpXG4gIH1cblxuICAvLyBTeW5jIGFuZCBwcnVuZSB3aXRoaW4gdHJhbnNhY3Rpb25cbiAgZG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICBzeW5jTG9nKHlUeCwgbXlDbGllbnRJZCwgY2xpZW50U3RhdGUsIGZpbmFsaXplZEVwb2NoLCBiYXNlQ1AsIHR4Q2hhbmdlcz8uYWRkZWQpXG5cbiAgICAvLyBTYWZlIHRvIHVzZSBsb2NhbCBmaW5hbGl6ZWRFcG9jaCBoZXJlXG4gICAgcHJ1bmVDaGVja3BvaW50cyh5Q2hlY2twb2ludCwgZmluYWxpemVkRXBvY2gpXG4gIH0pXG5cbiAgaWYgKG5lZWRzUmVidWlsZFNvcnRlZENhY2hlKSB7XG4gICAgLy8gRnVsbCByZWNvbXB1dGUgKGNhbGN1bGF0b3IgaGFuZGxlcyB0aGlzKVxuICAgIHJldHVybiBjYWxjLmNhbGN1bGF0ZVN0YXRlKClcbiAgfVxuXG4gIC8vIEluY3JlbWVudGFsIHVwZGF0ZSB1c2luZyBvbmx5IGNoYW5nZWQga2V5cyAoY2FsY3VsYXRvciBoYW5kbGVzIHRoaXMpXG4gIC8vIHR4Q2hhbmdlcyBpcyBndWFyYW50ZWVkIHRvIGV4aXN0IGhlcmUgc2luY2UgIXR4Q2hhbmdlcyBpbXBsaWVzIG5lZWRzUmVidWlsZFNvcnRlZENhY2hlXG5cbiAgLy8gVXBkYXRlIHNvcnRlZCBjYWNoZSB3aXRoIG5ldyBrZXlzIGZyb20gdHhDaGFuZ2VzXG4gIC8vIFRoaXMgbXVzdCBoYXBwZW4gYWZ0ZXIgc3luY0xvZyB3aGljaCBtYXkgaGF2ZSBkZWxldGVkIHNvbWUgb2YgdGhlc2Uga2V5c1xuICBmb3IgKGNvbnN0IGtleSBvZiB0eENoYW5nZXMuYWRkZWQpIHtcbiAgICAvLyBDUklUSUNBTDogQ2hlY2sgeVR4LmhhcyhrZXkpISBzeW5jTG9nIG1pZ2h0IGhhdmUganVzdCBwcnVuZWQgaXQuXG4gICAgaWYgKHlUeC5oYXMoa2V5KSAmJiAhY2FsYy5oYXNUeChrZXkpKSB7XG4gICAgICBjYWxjLmluc2VydFR4KGtleSwgeVR4KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjYWxjLmNhbGN1bGF0ZVN0YXRlKClcbn1cbiIsImltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBDaGVja3BvaW50UmVjb3JkLCBjcmVhdGVDaGVja3BvaW50IH0gZnJvbSBcIi4vY2hlY2twb2ludHNcIlxuaW1wb3J0IHsgY3JlYXRlQ2xpZW50U3RhdGUgfSBmcm9tIFwiLi9jbGllbnRTdGF0ZVwiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4vZXJyb3JcIlxuaW1wb3J0IHsgSlNPTk9iamVjdCB9IGZyb20gXCIuL2pzb25cIlxuXG5pbXBvcnQgeyBPcCwgVmFsaWRhdGVGbiB9IGZyb20gXCIuL29wZXJhdGlvbnNcIlxuXG5pbXBvcnQgeyBjb21wdXRlUmVjb25jaWxlT3BzIH0gZnJvbSBcIi4vcmVjb25jaWxlXCJcbmltcG9ydCB7IFNvcnRlZFR4RW50cnkgfSBmcm9tIFwiLi9Tb3J0ZWRUeEVudHJ5XCJcbmltcG9ydCB7IFR4UmVjb3JkIH0gZnJvbSBcIi4vVHhSZWNvcmRcIlxuaW1wb3J0IHsgYXBwZW5kVHgsIFR4S2V5Q2hhbmdlcywgdXBkYXRlU3RhdGUgfSBmcm9tIFwiLi90eExvZ1wiXG5pbXBvcnQgeyBUeFRpbWVzdGFtcEtleSB9IGZyb20gXCIuL3R4VGltZXN0YW1wXCJcbmltcG9ydCB7IGdlbmVyYXRlSUQgfSBmcm9tIFwiLi91dGlsc1wiXG5cbmV4cG9ydCBjb25zdCBnZXRTb3J0ZWRUeHNTeW1ib2wgPSBTeW1ib2woXCJnZXRTb3J0ZWRUeHNcIilcblxuZXhwb3J0IGludGVyZmFjZSBTdGF0ZVN5bmNMb2dPcHRpb25zPFN0YXRlIGV4dGVuZHMgSlNPTk9iamVjdD4ge1xuICAvKipcbiAgICogVGhlIFkuanMgRG9jdW1lbnQgdG8gYmluZCB0by5cbiAgICovXG4gIHlEb2M6IFkuRG9jXG5cbiAgLyoqXG4gICAqIE5hbWUgZm9yIHRoZSB0eHMgWS5NYXAuXG4gICAqIERlZmF1bHQ6IFwic3RhdGUtc3luYy1sb2ctdHhcIlxuICAgKi9cbiAgeVR4TWFwTmFtZT86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBOYW1lIGZvciB0aGUgY2hlY2twb2ludCBZLk1hcC5cbiAgICogRGVmYXVsdDogXCJzdGF0ZS1zeW5jLWxvZy1jaGVja3BvaW50XCJcbiAgICovXG4gIHlDaGVja3BvaW50TWFwTmFtZT86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBjbGllbnQuXG4gICAqIElmIG9taXR0ZWQsIGEgcmFuZG9tIFVVSUQgKG5hbm9pZCkgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gICAqIE5PVEU6IElmIHlvdSBuZWVkIHRvIHJlc3VtZSBhIHNlc3Npb24gKGtlZXAgbG9jYWwgY2xvY2svd2F0ZXJtYXJrKSwgeW91IE1VU1QgcHJvdmlkZSBhIHN0YWJsZSBJRC5cbiAgICogTVVTVCBOT1QgY29udGFpbiBzZW1pY29sb25zLlxuICAgKi9cbiAgY2xpZW50SWQ/OiBzdHJpbmdcblxuICAvKipcbiAgICogT3JpZ2luIHRhZyBmb3IgWS5qcyB0eHMgY3JlYXRlZCBieSB0aGlzIGxpYnJhcnkuXG4gICAqL1xuICB5anNPcmlnaW4/OiB1bmtub3duXG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIHZhbGlkYXRpb24gZnVuY3Rpb24uXG4gICAqIFJ1bnMgYWZ0ZXIgZWFjaCB0eCdzIG9wcyBhcmUgYXBwbGllZC5cbiAgICogSWYgaXQgcmV0dXJucyBmYWxzZSwgdGhlIHR4IGlzIHJlamVjdGVkIChzdGF0ZSByZXZlcnRzKS5cbiAgICogTVVTVCBiZSBkZXRlcm1pbmlzdGljIGFuZCBjb25zaXN0ZW50IGFjcm9zcyBhbGwgY2xpZW50cy5cbiAgICovXG4gIHZhbGlkYXRlPzogKHN0YXRlOiBTdGF0ZSkgPT4gYm9vbGVhblxuXG4gIC8qKlxuICAgKiBUaW1lc3RhbXAgcmV0ZW50aW9uIHdpbmRvdyBpbiBtaWxsaXNlY29uZHMuXG4gICAqIFR4cyBvbGRlciB0aGFuIHRoaXMgd2luZG93IGFyZSBjb25zaWRlcmVkIFwiQW5jaWVudFwiIGFuZCBwcnVuZWQuXG4gICAqXG4gICAqIERlZmF1bHQ6IEluZmluaXR5IChObyBwcnVuaW5nKS5cbiAgICogUmVjb21tZW5kZWQ6IDE0IGRheXMgKDEyMDk2MDAwMDAgbXMpLlxuICAgKi9cbiAgcmV0ZW50aW9uV2luZG93TXM6IG51bWJlciB8IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlU3luY0xvZ0NvbnRyb2xsZXI8U3RhdGUgZXh0ZW5kcyBKU09OT2JqZWN0PiB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlLlxuICAgKi9cbiAgZ2V0U3RhdGUoKTogU3RhdGVcblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byBzdGF0ZSBjaGFuZ2VzLlxuICAgKi9cbiAgc3Vic2NyaWJlKGNhbGxiYWNrOiAobmV3U3RhdGU6IFN0YXRlLCBnZXRBcHBsaWVkT3BzOiAoKSA9PiByZWFkb25seSBPcFtdKSA9PiB2b2lkKTogKCkgPT4gdm9pZFxuXG4gIC8qKlxuICAgKiBFbWl0cyBhIG5ldyB0eCAobGlzdCBvZiBvcGVyYXRpb25zKSB0byB0aGUgbG9nLlxuICAgKi9cbiAgZW1pdChvcHM6IE9wW10pOiB2b2lkXG5cbiAgLyoqXG4gICAqIFJlY29uY2lsZXMgdGhlIGN1cnJlbnQgc3RhdGUgd2l0aCB0aGUgdGFyZ2V0IHN0YXRlLlxuICAgKi9cbiAgcmVjb25jaWxlU3RhdGUodGFyZ2V0U3RhdGU6IFN0YXRlKTogdm9pZFxuXG4gIC8qKlxuICAgKiBNYW51YWxseSB0cmlnZ2VycyBlcG9jaCBjb21wYWN0aW9uIChDaGVja3BvaW50aW5nKS5cbiAgICovXG4gIGNvbXBhY3QoKTogdm9pZFxuXG4gIC8qKlxuICAgKiBDbGVhbnMgdXAgb2JzZXJ2ZXJzIGFuZCByZWxlYXNlcyBtZW1vcnkuXG4gICAqL1xuICBkaXNwb3NlKCk6IHZvaWRcblxuICAvLyAtLS0gT2JzZXJ2YWJpbGl0eSAmIFN0YXRzIC0tLVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGFjdGl2ZSBlcG9jaCBudW1iZXIuXG4gICAqL1xuICBnZXRBY3RpdmVFcG9jaCgpOiBudW1iZXJcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHR4cyBjdXJyZW50bHkgaW4gdGhlIGFjdGl2ZSBlcG9jaC5cbiAgICovXG4gIGdldEFjdGl2ZUVwb2NoVHhDb3VudCgpOiBudW1iZXJcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgd2FsbENsb2NrIHRpbWVzdGFtcCBvZiB0aGUgZmlyc3QgdHggaW4gdGhlIGFjdGl2ZSBlcG9jaC5cbiAgICovXG4gIGdldEFjdGl2ZUVwb2NoU3RhcnRUaW1lKCk6IG51bWJlciB8IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGxvZyBpcyBjb21wbGV0ZWx5IGVtcHR5LlxuICAgKi9cbiAgaXNMb2dFbXB0eSgpOiBib29sZWFuXG5cbiAgLyoqXG4gICAqIEludGVybmFsL1Rlc3Rpbmc6IFJldHVybnMgYWxsIHR4cyBjdXJyZW50bHkgaW4gdGhlIGxvZywgc29ydGVkLlxuICAgKi9cbiAgW2dldFNvcnRlZFR4c1N5bWJvbF0oKTogcmVhZG9ubHkgU29ydGVkVHhFbnRyeVtdXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIFN0YXRlU3luY0xvZyBjb250cm9sbGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3RhdGVTeW5jTG9nPFN0YXRlIGV4dGVuZHMgSlNPTk9iamVjdD4oXG4gIG9wdGlvbnM6IFN0YXRlU3luY0xvZ09wdGlvbnM8U3RhdGU+XG4pOiBTdGF0ZVN5bmNMb2dDb250cm9sbGVyPFN0YXRlPiB7XG4gIGNvbnN0IHtcbiAgICB5RG9jLFxuICAgIHlUeE1hcE5hbWUgPSBcInN0YXRlLXN5bmMtbG9nLXR4XCIsXG4gICAgeUNoZWNrcG9pbnRNYXBOYW1lID0gXCJzdGF0ZS1zeW5jLWxvZy1jaGVja3BvaW50XCIsXG4gICAgY2xpZW50SWQgPSBnZW5lcmF0ZUlEKCksXG4gICAgeWpzT3JpZ2luLFxuICAgIHZhbGlkYXRlLFxuICAgIHJldGVudGlvbldpbmRvd01zLFxuICB9ID0gb3B0aW9uc1xuXG4gIGlmIChjbGllbnRJZC5pbmNsdWRlcyhcIjtcIikpIHtcbiAgICBmYWlsdXJlKGBjbGllbnRJZCBNVVNUIE5PVCBjb250YWluIHNlbWljb2xvbnM6ICR7Y2xpZW50SWR9YClcbiAgfVxuXG4gIGNvbnN0IHlUeCA9IHlEb2MuZ2V0TWFwPFR4UmVjb3JkPih5VHhNYXBOYW1lKVxuICBjb25zdCB5Q2hlY2twb2ludCA9IHlEb2MuZ2V0TWFwPENoZWNrcG9pbnRSZWNvcmQ+KHlDaGVja3BvaW50TWFwTmFtZSlcblxuICAvLyBDYXN0IHZhbGlkYXRlIHRvIGJhc2ljIHR5cGUgdG8gbWF0Y2ggaW50ZXJuYWwgQ2xpZW50U3RhdGVcbiAgY29uc3QgY2xpZW50U3RhdGUgPSBjcmVhdGVDbGllbnRTdGF0ZShcbiAgICB2YWxpZGF0ZSBhcyB1bmtub3duIGFzIFZhbGlkYXRlRm48SlNPTk9iamVjdD4sXG4gICAgcmV0ZW50aW9uV2luZG93TXMgPz8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZXG4gIClcblxuICAvLyBMaXN0ZW5lcnNcbiAgY29uc3Qgc3Vic2NyaWJlcnMgPSBuZXcgU2V0PChzdGF0ZTogU3RhdGUsIGdldEFwcGxpZWRPcHM6ICgpID0+IHJlYWRvbmx5IE9wW10pID0+IHZvaWQ+KClcblxuICBjb25zdCBub3RpZnlTdWJzY3JpYmVycyA9IChzdGF0ZTogU3RhdGUsIGdldEFwcGxpZWRPcHM6ICgpID0+IHJlYWRvbmx5IE9wW10pID0+IHtcbiAgICBmb3IgKGNvbnN0IHN1YiBvZiBzdWJzY3JpYmVycykge1xuICAgICAgc3ViKHN0YXRlLCBnZXRBcHBsaWVkT3BzKVxuICAgIH1cbiAgfVxuXG4gIC8vIEhlbHBlciB0byBleHRyYWN0IGtleSBjaGFuZ2VzIGZyb20gWU1hcEV2ZW50XG4gIGNvbnN0IGV4dHJhY3RUeENoYW5nZXMgPSAoZXZlbnQ6IFkuWU1hcEV2ZW50PFR4UmVjb3JkPik6IFR4S2V5Q2hhbmdlcyA9PiB7XG4gICAgY29uc3QgYWRkZWQ6IFR4VGltZXN0YW1wS2V5W10gPSBbXVxuICAgIGNvbnN0IGRlbGV0ZWQ6IFR4VGltZXN0YW1wS2V5W10gPSBbXVxuXG4gICAgZm9yIChjb25zdCBba2V5LCBjaGFuZ2VdIG9mIGV2ZW50LmNoYW5nZXMua2V5cykge1xuICAgICAgaWYgKGNoYW5nZS5hY3Rpb24gPT09IFwiYWRkXCIpIHtcbiAgICAgICAgYWRkZWQucHVzaChrZXkpXG4gICAgICB9IGVsc2UgaWYgKGNoYW5nZS5hY3Rpb24gPT09IFwiZGVsZXRlXCIpIHtcbiAgICAgICAgZGVsZXRlZC5wdXNoKGtleSlcbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlLmFjdGlvbiA9PT0gXCJ1cGRhdGVcIikge1xuICAgICAgICBkZWxldGVkLnB1c2goa2V5KVxuICAgICAgICBhZGRlZC5wdXNoKGtleSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBhZGRlZCwgZGVsZXRlZCB9XG4gIH1cblxuICAvLyBFbXB0eSB0eENoYW5nZXMgb2JqZWN0IGZvciBjaGVja3BvaW50IG9ic2VydmVyIChubyB0eCBrZXlzIGNoYW5nZWQpXG4gIGNvbnN0IGVtcHR5VHhDaGFuZ2VzOiBUeEtleUNoYW5nZXMgPSB7IGFkZGVkOiBbXSwgZGVsZXRlZDogW10gfVxuXG4gIC8vIFVwZGF0ZSBMb2dpYyB3aXRoIGluY3JlbWVudGFsIGNoYW5nZXNcbiAgY29uc3QgcnVuVXBkYXRlID0gKHR4Q2hhbmdlczogVHhLZXlDaGFuZ2VzIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgY29uc3QgeyBzdGF0ZSwgZ2V0QXBwbGllZE9wcyB9ID0gdXBkYXRlU3RhdGUoXG4gICAgICB5RG9jLFxuICAgICAgeVR4LFxuICAgICAgeUNoZWNrcG9pbnQsXG4gICAgICBjbGllbnRJZCxcbiAgICAgIGNsaWVudFN0YXRlLFxuICAgICAgdHhDaGFuZ2VzXG4gICAgKVxuICAgIG5vdGlmeVN1YnNjcmliZXJzKHN0YXRlIGFzIFN0YXRlLCBnZXRBcHBsaWVkT3BzKVxuICB9XG5cbiAgLy8gVHggb2JzZXJ2ZXJcbiAgY29uc3QgdHhPYnNlcnZlciA9IChldmVudDogWS5ZTWFwRXZlbnQ8VHhSZWNvcmQ+LCBfdHJhbnNhY3Rpb246IFkuVHJhbnNhY3Rpb24pID0+IHtcbiAgICBjb25zdCB0eENoYW5nZXMgPSBleHRyYWN0VHhDaGFuZ2VzKGV2ZW50KVxuICAgIHJ1blVwZGF0ZSh0eENoYW5nZXMpXG4gIH1cblxuICAvLyBDaGVja3BvaW50IG9ic2VydmVyXG4gIGNvbnN0IGNoZWNrcG9pbnRPYnNlcnZlciA9IChcbiAgICBfZXZlbnQ6IFkuWU1hcEV2ZW50PENoZWNrcG9pbnRSZWNvcmQ+LFxuICAgIF90cmFuc2FjdGlvbjogWS5UcmFuc2FjdGlvblxuICApID0+IHtcbiAgICBydW5VcGRhdGUoZW1wdHlUeENoYW5nZXMpXG4gIH1cblxuICB5Q2hlY2twb2ludC5vYnNlcnZlKGNoZWNrcG9pbnRPYnNlcnZlcilcbiAgeVR4Lm9ic2VydmUodHhPYnNlcnZlcilcblxuICAvLyBJbml0aWFsIHJ1biAoZnVsbCByZWNvbXB1dGUsIHRyZWF0IGFzIGNoZWNrcG9pbnQgY2hhbmdlIHRvIGluaXRpYWxpemUgZXBvY2ggY2FjaGUpXG4gIHJ1blVwZGF0ZSh1bmRlZmluZWQpXG5cbiAgLy8gVHJhY2sgZGlzcG9zYWwgc3RhdGVcbiAgbGV0IGRpc3Bvc2VkID0gZmFsc2VcblxuICBjb25zdCBhc3NlcnROb3REaXNwb3NlZCA9ICgpID0+IHtcbiAgICBpZiAoZGlzcG9zZWQpIHtcbiAgICAgIGZhaWx1cmUoXCJTdGF0ZVN5bmNMb2cgaGFzIGJlZW4gZGlzcG9zZWQgYW5kIGNhbm5vdCBiZSB1c2VkXCIpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgZ2V0QWN0aXZlRXBvY2hJbnRlcm5hbCA9ICgpID0+IHtcbiAgICBpZiAoY2xpZW50U3RhdGUuY2FjaGVkRmluYWxpemVkRXBvY2ggPT09IG51bGwpIHtcbiAgICAgIGZhaWx1cmUoXCJjYWNoZWRGaW5hbGl6ZWRFcG9jaCBpcyBudWxsIC0gdGhpcyBzaG91bGQgbm90IGhhcHBlbiBhZnRlciBpbml0aWFsaXphdGlvblwiKVxuICAgIH1cbiAgICByZXR1cm4gY2xpZW50U3RhdGUuY2FjaGVkRmluYWxpemVkRXBvY2ggKyAxXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGdldFN0YXRlKCk6IFN0YXRlIHtcbiAgICAgIGFzc2VydE5vdERpc3Bvc2VkKClcbiAgICAgIHJldHVybiAoY2xpZW50U3RhdGUuc3RhdGVDYWxjdWxhdG9yLmdldENhY2hlZFN0YXRlKCkgPz8ge30pIGFzIFN0YXRlXG4gICAgfSxcblxuICAgIHN1YnNjcmliZShjYWxsYmFjazogKG5ld1N0YXRlOiBTdGF0ZSwgZ2V0QXBwbGllZE9wczogKCkgPT4gcmVhZG9ubHkgT3BbXSkgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICAgICAgYXNzZXJ0Tm90RGlzcG9zZWQoKVxuICAgICAgc3Vic2NyaWJlcnMuYWRkKGNhbGxiYWNrKVxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgc3Vic2NyaWJlcnMuZGVsZXRlKGNhbGxiYWNrKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBlbWl0KG9wczogT3BbXSk6IHZvaWQge1xuICAgICAgYXNzZXJ0Tm90RGlzcG9zZWQoKVxuICAgICAgeURvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZUVwb2NoID0gZ2V0QWN0aXZlRXBvY2hJbnRlcm5hbCgpXG4gICAgICAgIGFwcGVuZFR4KG9wcywgeVR4LCBhY3RpdmVFcG9jaCwgY2xpZW50SWQsIGNsaWVudFN0YXRlKVxuICAgICAgfSwgeWpzT3JpZ2luKVxuICAgIH0sXG5cbiAgICByZWNvbmNpbGVTdGF0ZSh0YXJnZXRTdGF0ZTogU3RhdGUpOiB2b2lkIHtcbiAgICAgIGFzc2VydE5vdERpc3Bvc2VkKClcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IChjbGllbnRTdGF0ZS5zdGF0ZUNhbGN1bGF0b3IuZ2V0Q2FjaGVkU3RhdGUoKSA/PyB7fSkgYXMgU3RhdGVcbiAgICAgIGNvbnN0IG9wcyA9IGNvbXB1dGVSZWNvbmNpbGVPcHMoY3VycmVudFN0YXRlLCB0YXJnZXRTdGF0ZSlcbiAgICAgIGlmIChvcHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmVtaXQob3BzKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjb21wYWN0KCk6IHZvaWQge1xuICAgICAgYXNzZXJ0Tm90RGlzcG9zZWQoKVxuICAgICAgeURvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZUVwb2NoID0gZ2V0QWN0aXZlRXBvY2hJbnRlcm5hbCgpXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGNsaWVudFN0YXRlLnN0YXRlQ2FsY3VsYXRvci5nZXRDYWNoZWRTdGF0ZSgpID8/IHt9XG4gICAgICAgIGNyZWF0ZUNoZWNrcG9pbnQoeVR4LCB5Q2hlY2twb2ludCwgY2xpZW50U3RhdGUsIGFjdGl2ZUVwb2NoLCBjdXJyZW50U3RhdGUsIGNsaWVudElkKVxuICAgICAgfSwgeWpzT3JpZ2luKVxuICAgIH0sXG5cbiAgICBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgaWYgKGRpc3Bvc2VkKSByZXR1cm4gLy8gQWxyZWFkeSBkaXNwb3NlZCwgbm8tb3BcbiAgICAgIGRpc3Bvc2VkID0gdHJ1ZVxuICAgICAgeVR4LnVub2JzZXJ2ZSh0eE9ic2VydmVyKVxuICAgICAgeUNoZWNrcG9pbnQudW5vYnNlcnZlKGNoZWNrcG9pbnRPYnNlcnZlcilcbiAgICAgIHN1YnNjcmliZXJzLmNsZWFyKClcbiAgICB9LFxuXG4gICAgZ2V0QWN0aXZlRXBvY2goKTogbnVtYmVyIHtcbiAgICAgIGFzc2VydE5vdERpc3Bvc2VkKClcbiAgICAgIHJldHVybiBnZXRBY3RpdmVFcG9jaEludGVybmFsKClcbiAgICB9LFxuXG4gICAgZ2V0QWN0aXZlRXBvY2hUeENvdW50KCk6IG51bWJlciB7XG4gICAgICBhc3NlcnROb3REaXNwb3NlZCgpXG4gICAgICBjb25zdCBhY3RpdmVFcG9jaCA9IGdldEFjdGl2ZUVwb2NoSW50ZXJuYWwoKVxuICAgICAgbGV0IGNvdW50ID0gMFxuICAgICAgLy8gT25seSBjdXJyZW50IG9yIGZ1dHVyZSBlcG9jaHMgZXhpc3QgaW4gc29ydGVkVHhzIChwYXN0IGVwb2NocyBhcmUgcHJ1bmVkIGR1cmluZyB1cGRhdGVTdGF0ZSkuXG4gICAgICAvLyBGdXR1cmUgZXBvY2hzIGFwcGVhciBpZiB3ZSByZWNlaXZlIHR4cyBiZWZvcmUgdGhlIGNvcnJlc3BvbmRpbmcgY2hlY2twb2ludC5cbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgY2xpZW50U3RhdGUuc3RhdGVDYWxjdWxhdG9yLmdldFNvcnRlZFR4cygpKSB7XG4gICAgICAgIGNvbnN0IHRzID0gZW50cnkudHhUaW1lc3RhbXBcbiAgICAgICAgaWYgKHRzLmVwb2NoID09PSBhY3RpdmVFcG9jaCkge1xuICAgICAgICAgIGNvdW50KytcbiAgICAgICAgfSBlbHNlIGlmICh0cy5lcG9jaCA+IGFjdGl2ZUVwb2NoKSB7XG4gICAgICAgICAgYnJlYWsgLy8gT3B0aW1pemF0aW9uOiBzb3J0ZWQgb3JkZXIgbWVhbnMgd2UgY2FuIHN0b3AgZWFybHlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNvdW50XG4gICAgfSxcblxuICAgIGdldEFjdGl2ZUVwb2NoU3RhcnRUaW1lKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgICBhc3NlcnROb3REaXNwb3NlZCgpXG4gICAgICBjb25zdCBhY3RpdmVFcG9jaCA9IGdldEFjdGl2ZUVwb2NoSW50ZXJuYWwoKVxuICAgICAgLy8gT25seSBjdXJyZW50IG9yIGZ1dHVyZSBlcG9jaHMgZXhpc3QgaW4gc29ydGVkVHhzIChwYXN0IGVwb2NocyBhcmUgcHJ1bmVkIGR1cmluZyB1cGRhdGVTdGF0ZSkuXG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGNsaWVudFN0YXRlLnN0YXRlQ2FsY3VsYXRvci5nZXRTb3J0ZWRUeHMoKSkge1xuICAgICAgICBjb25zdCB0cyA9IGVudHJ5LnR4VGltZXN0YW1wXG4gICAgICAgIGlmICh0cy5lcG9jaCA9PT0gYWN0aXZlRXBvY2gpIHtcbiAgICAgICAgICByZXR1cm4gdHMud2FsbENsb2NrXG4gICAgICAgIH0gZWxzZSBpZiAodHMuZXBvY2ggPiBhY3RpdmVFcG9jaCkge1xuICAgICAgICAgIGJyZWFrIC8vIE9wdGltaXphdGlvbjogc29ydGVkIG9yZGVyIG1lYW5zIHdlIGNhbiBzdG9wIGVhcmx5XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9LFxuXG4gICAgaXNMb2dFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgIGFzc2VydE5vdERpc3Bvc2VkKClcbiAgICAgIHJldHVybiB5VHguc2l6ZSA9PT0gMCAmJiB5Q2hlY2twb2ludC5zaXplID09PSAwXG4gICAgfSxcblxuICAgIFtnZXRTb3J0ZWRUeHNTeW1ib2xdKCk6IHJlYWRvbmx5IFNvcnRlZFR4RW50cnlbXSB7XG4gICAgICBhc3NlcnROb3REaXNwb3NlZCgpXG4gICAgICByZXR1cm4gY2xpZW50U3RhdGUuc3RhdGVDYWxjdWxhdG9yLmdldFNvcnRlZFR4cygpXG4gICAgfSxcbiAgfVxufVxuIiwiaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuL2Vycm9yXCJcclxuaW1wb3J0IHsgSlNPTk9iamVjdCwgSlNPTlZhbHVlLCBQYXRoIH0gZnJvbSBcIi4vanNvblwiXHJcbmltcG9ydCB7IGRlZXBDbG9uZSwgZGVlcEVxdWFsLCBpc09iamVjdCB9IGZyb20gXCIuL3V0aWxzXCJcclxuXHJcbi8qKlxyXG4gKiBTdXBwb3J0ZWQgb3BlcmF0aW9ucy5cclxuICogQXBwbGllZCBzZXF1ZW50aWFsbHkgd2l0aGluIGEgdHguXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBPcCA9XHJcbiAgfCB7IGtpbmQ6IFwic2V0XCI7IHBhdGg6IFBhdGg7IGtleTogc3RyaW5nOyB2YWx1ZTogSlNPTlZhbHVlIH1cclxuICB8IHsga2luZDogXCJkZWxldGVcIjsgcGF0aDogUGF0aDsga2V5OiBzdHJpbmcgfVxyXG4gIHwgeyBraW5kOiBcInNwbGljZVwiOyBwYXRoOiBQYXRoOyBpbmRleDogbnVtYmVyOyBkZWxldGVDb3VudDogbnVtYmVyOyBpbnNlcnRzOiBKU09OVmFsdWVbXSB9XHJcbiAgfCB7IGtpbmQ6IFwiYWRkVG9TZXRcIjsgcGF0aDogUGF0aDsgdmFsdWU6IEpTT05WYWx1ZSB9XHJcbiAgfCB7IGtpbmQ6IFwiZGVsZXRlRnJvbVNldFwiOyBwYXRoOiBQYXRoOyB2YWx1ZTogSlNPTlZhbHVlIH1cclxuXHJcbi8qKlxyXG4gKiBWYWxpZGF0aW9uIGZ1bmN0aW9uIHR5cGUuXHJcbiAqXHJcbiAqIFJ1bGVzOlxyXG4gKiAtIFZhbGlkYXRpb24gTVVTVCBkZXBlbmQgb25seSBvbiBjYW5kaWRhdGVTdGF0ZSAoYW5kIGRldGVybWluaXN0aWMgY29kZSkuXHJcbiAqIC0gVmFsaWRhdGlvbiBydW5zIG9uY2UgcGVyIHR4LCBhZnRlciBhbGwgb3BzIGFwcGx5LlxyXG4gKiAtIElmIHZhbGlkYXRpb24gZmFpbHMsIHRoZSB4IGlzIHJlamVjdGVkIChzdGF0ZSByZXZlcnRzIHRvIHByZXZpb3VzKS5cclxuICogLSBJZiBubyB2YWxpZGF0b3IgaXMgcHJvdmlkZWQsIHZhbGlkYXRpb24gZGVmYXVsdHMgdG8gdHJ1ZS5cclxuICpcclxuICogSU1QT1JUQU5UOiBWYWxpZGF0aW9uIG91dGNvbWUgaXMgKipkZXJpdmVkIGxvY2FsIHN0YXRlKiogYW5kIE1VU1QgTk9UIGJlIHJlcGxpY2F0ZWQuXHJcbiAqIEFsbCBjbGllbnRzIE1VU1QgdXNlIHRoZSBzYW1lIHZhbGlkYXRpb24gbG9naWMgdG8gZW5zdXJlIGNvbnNpc3RlbmN5LlxyXG4gKi9cclxuZXhwb3J0IHR5cGUgVmFsaWRhdGVGbjxTdGF0ZSBleHRlbmRzIEpTT05PYmplY3Q+ID0gKGNhbmRpZGF0ZVN0YXRlOiBTdGF0ZSkgPT4gYm9vbGVhblxyXG5cclxuLyoqXHJcbiAqIFJlc29sdmVzIGEgcGF0aCB3aXRoaW4gdGhlIHN0YXRlLlxyXG4gKiBUaHJvd3MgaWYgYW55IHNlZ21lbnQgaXMgbWlzc2luZyBvciBoYXMgd3JvbmcgdHlwZS5cclxuICovXHJcbmZ1bmN0aW9uIHJlc29sdmVQYXRoKHN0YXRlOiBKU09OT2JqZWN0LCBwYXRoOiBQYXRoKTogSlNPTlZhbHVlIHtcclxuICBsZXQgY3VycmVudDogSlNPTlZhbHVlID0gc3RhdGVcclxuICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgcGF0aCkge1xyXG4gICAgaWYgKHR5cGVvZiBzZWdtZW50ID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgIGlmICghaXNPYmplY3QoY3VycmVudCkgfHwgQXJyYXkuaXNBcnJheShjdXJyZW50KSkge1xyXG4gICAgICAgIGZhaWx1cmUoYEV4cGVjdGVkIG9iamVjdCBhdCBwYXRoIHNlZ21lbnQgXCIke3NlZ21lbnR9XCJgKVxyXG4gICAgICB9XHJcbiAgICAgIGlmICghKHNlZ21lbnQgaW4gY3VycmVudCkpIHtcclxuICAgICAgICBmYWlsdXJlKGBQcm9wZXJ0eSBcIiR7c2VnbWVudH1cIiBkb2VzIG5vdCBleGlzdGApXHJcbiAgICAgIH1cclxuICAgICAgY3VycmVudCA9IGN1cnJlbnRbc2VnbWVudF1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShjdXJyZW50KSkge1xyXG4gICAgICAgIGZhaWx1cmUoYEV4cGVjdGVkIGFycmF5IGF0IHBhdGggc2VnbWVudCAke3NlZ21lbnR9YClcclxuICAgICAgfVxyXG4gICAgICBpZiAoc2VnbWVudCA8IDAgfHwgc2VnbWVudCA+PSBjdXJyZW50Lmxlbmd0aCkge1xyXG4gICAgICAgIGZhaWx1cmUoYEluZGV4ICR7c2VnbWVudH0gb3V0IG9mIGJvdW5kc2ApXHJcbiAgICAgIH1cclxuICAgICAgY3VycmVudCA9IGN1cnJlbnRbc2VnbWVudF1cclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIGN1cnJlbnRcclxufVxyXG5cclxuLyoqXHJcbiAqIEFwcGxpZXMgYSBzaW5nbGUgb3BlcmF0aW9uLlxyXG4gKiAoUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGZvciBzdGFuZGFyZCBKU09OLXBhdGNoIGJlaGF2aW9yKVxyXG4gKi9cclxuZnVuY3Rpb24gYXBwbHlPcChzdGF0ZTogSlNPTk9iamVjdCwgb3A6IE9wLCBjbG9uZVZhbHVlczogYm9vbGVhbik6IHZvaWQge1xyXG4gIC8vIFNwZWNpYWwgY2FzZTogaWYgcGF0aCBpcyBlbXB0eSwgd2UgY2FuJ3QgcmVzb2x2ZSBcImNvbnRhaW5lclwiLlxyXG4gIC8vIFRoZSBjYWxsZXIgbXVzdCBoYW5kbGUgcm9vdC1sZXZlbCByZXBsYWNlbWVudCBpZiBuZWNlc3NhcnksIGJ1dFxyXG4gIC8vIHN0YW5kYXJkIE9wcyB1c3VhbGx5IGFjdCBPTiBhIGNvbnRhaW5lci5cclxuICAvLyBFeGNlcHRpb246IGlmIHdlIGFjdCBvbiByb290LCBoYW5kbGUgZXhwbGljaXRseSBvciBhc3N1bWUgcGF0aCBsZW5ndGggPiAwLlxyXG4gIC8vIEZvciB0aGlzIHNwZWMsIE9wcyBtb2RpZnkgKmZpZWxkcyogb3IgKmluZGljZXMqLlxyXG4gIC8vIElmIHBhdGggaXMgZW1wdHksIGl0IG1lYW5zIHdlIGFyZSBhY3RpbmcgT04gdGhlIHJvb3Qgb2JqZWN0IGl0c2VsZj9cclxuICAvLyBUaGUgc3BlYydzIFwic2V0XCIgZXhhbXBsZTogY29udGFpbmVyW29wLmtleV0gPSBvcC52YWx1ZS5cclxuICAvLyBUaGlzIGltcGxpZXMgd2UgcmVzb2x2ZSBwYXRoIHRvIGdldCB0aGUgUEFSRU5UIGNvbnRhaW5lci5cclxuXHJcbiAgY29uc3QgY29udGFpbmVyID0gcmVzb2x2ZVBhdGgoc3RhdGUsIG9wLnBhdGgpXHJcblxyXG4gIHN3aXRjaCAob3Aua2luZCkge1xyXG4gICAgY2FzZSBcInNldFwiOlxyXG4gICAgICBpZiAoIWlzT2JqZWN0KGNvbnRhaW5lcikgfHwgQXJyYXkuaXNBcnJheShjb250YWluZXIpKSB7XHJcbiAgICAgICAgZmFpbHVyZShcInNldCByZXF1aXJlcyBvYmplY3QgY29udGFpbmVyXCIpXHJcbiAgICAgIH1cclxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgOyhjb250YWluZXIgYXMgYW55KVtvcC5rZXldID0gY2xvbmVWYWx1ZXMgPyBkZWVwQ2xvbmUob3AudmFsdWUpIDogb3AudmFsdWVcclxuICAgICAgYnJlYWtcclxuXHJcbiAgICBjYXNlIFwiZGVsZXRlXCI6XHJcbiAgICAgIGlmICghaXNPYmplY3QoY29udGFpbmVyKSB8fCBBcnJheS5pc0FycmF5KGNvbnRhaW5lcikpIHtcclxuICAgICAgICBmYWlsdXJlKFwiZGVsZXRlIHJlcXVpcmVzIG9iamVjdCBjb250YWluZXJcIilcclxuICAgICAgfVxyXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICBkZWxldGUgKGNvbnRhaW5lciBhcyBhbnkpW29wLmtleV1cclxuICAgICAgYnJlYWtcclxuXHJcbiAgICBjYXNlIFwic3BsaWNlXCI6IHtcclxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbnRhaW5lcikpIHtcclxuICAgICAgICBmYWlsdXJlKFwic3BsaWNlIHJlcXVpcmVzIGFycmF5IGNvbnRhaW5lclwiKVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHNhZmVJbmRleCA9IE1hdGgubWluKG9wLmluZGV4LCBjb250YWluZXIubGVuZ3RoKVxyXG4gICAgICBjb250YWluZXIuc3BsaWNlKFxyXG4gICAgICAgIHNhZmVJbmRleCxcclxuICAgICAgICBvcC5kZWxldGVDb3VudCxcclxuICAgICAgICAuLi4oY2xvbmVWYWx1ZXMgPyBvcC5pbnNlcnRzLm1hcCgodikgPT4gZGVlcENsb25lKHYpKSA6IG9wLmluc2VydHMpXHJcbiAgICAgIClcclxuICAgICAgYnJlYWtcclxuICAgIH1cclxuXHJcbiAgICBjYXNlIFwiYWRkVG9TZXRcIjpcclxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbnRhaW5lcikpIHtcclxuICAgICAgICBmYWlsdXJlKFwiYWRkVG9TZXQgcmVxdWlyZXMgYXJyYXkgY29udGFpbmVyXCIpXHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFjb250YWluZXIuc29tZSgoaXRlbSkgPT4gZGVlcEVxdWFsKGl0ZW0sIG9wLnZhbHVlKSkpIHtcclxuICAgICAgICBjb250YWluZXIucHVzaChjbG9uZVZhbHVlcyA/IGRlZXBDbG9uZShvcC52YWx1ZSkgOiBvcC52YWx1ZSlcclxuICAgICAgfVxyXG4gICAgICBicmVha1xyXG5cclxuICAgIGNhc2UgXCJkZWxldGVGcm9tU2V0XCI6XHJcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb250YWluZXIpKSB7XHJcbiAgICAgICAgZmFpbHVyZShcImRlbGV0ZUZyb21TZXQgcmVxdWlyZXMgYXJyYXkgY29udGFpbmVyXCIpXHJcbiAgICAgIH1cclxuICAgICAgLy8gUmVtb3ZlIGFsbCBtYXRjaGluZyBpdGVtcyB1c2luZyBzcGxpY2UgKGZyb20gZW5kIHRvIGF2b2lkIGluZGV4IHNoaWZ0aW5nKVxyXG4gICAgICBmb3IgKGxldCBpID0gY29udGFpbmVyLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgaWYgKGRlZXBFcXVhbChjb250YWluZXJbaV0sIG9wLnZhbHVlKSkge1xyXG4gICAgICAgICAgY29udGFpbmVyLnNwbGljZShpLCAxKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBicmVha1xyXG5cclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIHRocm93IGZhaWx1cmUoYFVua25vd24gb3BlcmF0aW9uIGtpbmQ6ICR7KG9wIGFzIGFueSkua2luZH1gKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIE9wdGlvbnMgZm9yIGFwcGx5T3BzLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBBcHBseU9wc09wdGlvbnMge1xyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdG8gZGVlcCBjbG9uZSB2YWx1ZXMgYmVmb3JlIGluc2VydGluZyB0aGVtIGludG8gdGhlIHRhcmdldC5cclxuICAgKiAtIGB0cnVlYCAoZGVmYXVsdCk6IFZhbHVlcyBhcmUgY2xvbmVkIHRvIHByZXZlbnQgYWxpYXNpbmcgYmV0d2VlbiB0aGUgb3BzIGFuZCB0YXJnZXQuXHJcbiAgICogLSBgZmFsc2VgOiBWYWx1ZXMgYXJlIHVzZWQgZGlyZWN0bHkgZm9yIGJldHRlciBwZXJmb3JtYW5jZS4gT25seSB1c2UgdGhpcyBpZiB5b3VcclxuICAgKiAgIGd1YXJhbnRlZSB0aGUgb3AgdmFsdWVzIHdvbid0IGJlIG11dGF0ZWQgYWZ0ZXIgYXBwbGljYXRpb24uXHJcbiAgICovXHJcbiAgY2xvbmVWYWx1ZXM/OiBib29sZWFuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIGEgbGlzdCBvZiBvcGVyYXRpb25zIHRvIGEgbXV0YWJsZSB0YXJnZXQgb2JqZWN0LlxyXG4gKiBVc2UgdGhpcyB0byBzeW5jaHJvbml6ZSBhbiBleHRlcm5hbCBtdXRhYmxlIHN0YXRlIChlLmcuLCBNb2JYIHN0b3JlKVxyXG4gKiB3aXRoIHRoZSBvcGVyYXRpb25zIHJlY2VpdmVkIHZpYSBzdWJzY3JpYmUoKS5cclxuICpcclxuICogQHBhcmFtIG9wcyAtIFRoZSBsaXN0IG9mIG9wZXJhdGlvbnMgdG8gYXBwbHkuXHJcbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgbXV0YWJsZSBvYmplY3QgdG8gbW9kaWZ5LlxyXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHNldHRpbmdzIGZvciBjb250cm9sbGluZyBjbG9uaW5nIGJlaGF2aW9yLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5T3BzKG9wczogcmVhZG9ubHkgT3BbXSwgdGFyZ2V0OiBKU09OT2JqZWN0LCBvcHRpb25zPzogQXBwbHlPcHNPcHRpb25zKTogdm9pZCB7XHJcbiAgY29uc3QgY2xvbmVWYWx1ZXMgPSBvcHRpb25zPy5jbG9uZVZhbHVlcyA/PyB0cnVlXHJcbiAgZm9yIChjb25zdCBvcCBvZiBvcHMpIHtcclxuICAgIGFwcGx5T3AodGFyZ2V0LCBvcCwgY2xvbmVWYWx1ZXMpXHJcbiAgfVxyXG59XHJcbiJdLCJuYW1lcyI6WyJlcXVhbCIsInNjb3BlZFVybEFscGhhYmV0IiwicmZkYyIsImhhbmRsZXIiLCJjbG9uZSJdLCJtYXBwaW5ncyI6Ijs7O0FBWU8sU0FBUywrQkFBK0IsYUFHN0M7QUFDQSxNQUFJLFdBQVc7QUFDZixNQUFJLE9BQWdDO0FBQ3BDLE1BQUksY0FBYztBQUNsQixNQUFJLGVBQWU7QUFFbkIsYUFBVyxDQUFDLEtBQUssRUFBRSxLQUFLLFlBQVksV0FBVztBQUM3QyxVQUFNLEVBQUUsT0FBTyxhQUFhLG1CQUFtQixHQUFHO0FBRWxELFFBQUksUUFBUSxVQUFVO0FBRXBCLGlCQUFXO0FBQ1gsYUFBTztBQUNQLG9CQUFjLEdBQUc7QUFDakIscUJBQWU7QUFBQSxJQUNqQixXQUFXLFVBQVUsVUFBVTtBQUk3QixVQUFJLEdBQUcsVUFBVSxlQUFnQixHQUFHLFlBQVksZUFBZSxXQUFXLGNBQWU7QUFDdkYsZUFBTztBQUNQLHNCQUFjLEdBQUc7QUFDakIsdUJBQWU7QUFBQSxNQUNqQjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsU0FBTyxFQUFFLGdCQUFnQixVQUFVLFlBQVksS0FBQTtBQUNqRDtBQzNDTyxNQUFNLDBCQUEwQixNQUFNO0FBQUEsRUFDM0MsWUFBWSxLQUFhO0FBQ3ZCLFVBQU0sR0FBRztBQUdULFdBQU8sZUFBZSxNQUFNLGtCQUFrQixTQUFTO0FBQUEsRUFDekQ7QUFDRjtBQUVPLFNBQVMsUUFBUSxTQUF3QjtBQUM5QyxRQUFNLElBQUksa0JBQWtCLE9BQU87QUFDckM7QUN5Q0EsU0FBUyx1QkFBdUIsTUFBd0M7QUFDdEUsU0FBTyxHQUFHLEtBQUssS0FBSyxJQUFJLEtBQUssT0FBTyxJQUFJLEtBQUssUUFB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
|
|
2132
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUtc3luYy1sb2cuZXNtLm1qcyIsInNvdXJjZXMiOlsiLi4vc3JjL2Vycm9yLnRzIiwiLi4vc3JjL2NyZWF0ZU9wcy9jb25zdGFudC50cyIsIi4uL3NyYy9jcmVhdGVPcHMvaW50ZXJmYWNlLnRzIiwiLi4vc3JjL2NyZWF0ZU9wcy91dGlscy50cyIsIi4uL3NyYy9jcmVhdGVPcHMvY3VycmVudC50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9mYXN0LWRlZXAtZXF1YWxAMy4xLjMvbm9kZV9tb2R1bGVzL2Zhc3QtZGVlcC1lcXVhbC9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9uYW5vaWRANS4xLjYvbm9kZV9tb2R1bGVzL25hbm9pZC91cmwtYWxwaGFiZXQvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vbmFub2lkQDUuMS42L25vZGVfbW9kdWxlcy9uYW5vaWQvaW5kZXguYnJvd3Nlci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9yZmRjQDEuNC4xL25vZGVfbW9kdWxlcy9yZmRjL2luZGV4LmpzIiwiLi4vc3JjL3V0aWxzLnRzIiwiLi4vc3JjL2NyZWF0ZU9wcy9wdXNoT3AudHMiLCIuLi9zcmMvY3JlYXRlT3BzL2RyYWZ0LnRzIiwiLi4vc3JjL2NyZWF0ZU9wcy9kcmFmdGlmeS50cyIsIi4uL3NyYy9jcmVhdGVPcHMvY3JlYXRlT3BzLnRzIiwiLi4vc3JjL2NyZWF0ZU9wcy9vcmlnaW5hbC50cyIsIi4uL3NyYy9jcmVhdGVPcHMvc2V0SGVscGVycy50cyIsIi4uL3NyYy9jaGVja3BvaW50VXRpbHMudHMiLCIuLi9zcmMvY2hlY2twb2ludHMudHMiLCIuLi9zcmMvZHJhZnQudHMiLCIuLi9zcmMvcmVjb25jaWxlLnRzIiwiLi4vc3JjL3R4VGltZXN0YW1wLnRzIiwiLi4vc3JjL1NvcnRlZFR4RW50cnkudHMiLCIuLi9zcmMvU3RhdGVDYWxjdWxhdG9yLnRzIiwiLi4vc3JjL2NsaWVudFN0YXRlLnRzIiwiLi4vc3JjL3R4TG9nLnRzIiwiLi4vc3JjL2NyZWF0ZVN0YXRlU3luY0xvZy50cyIsIi4uL3NyYy9vcGVyYXRpb25zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBTdGF0ZVN5bmNMb2dFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtc2cpXG5cbiAgICAvLyBTZXQgdGhlIHByb3RvdHlwZSBleHBsaWNpdGx5IGZvciBiZXR0ZXIgaW5zdGFuY2VvZiBzdXBwb3J0XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIFN0YXRlU3luY0xvZ0Vycm9yLnByb3RvdHlwZSlcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmFpbHVyZShtZXNzYWdlOiBzdHJpbmcpOiBuZXZlciB7XG4gIHRocm93IG5ldyBTdGF0ZVN5bmNMb2dFcnJvcihtZXNzYWdlKVxufVxuIiwiLyoqXHJcbiAqIENvbnN0YW50cyBmb3IgY3JlYXRlT3BzLlxyXG4gKiBTaW1wbGlmaWVkIGZyb20gb3JpZ2luYWwgc291cmNlIC0gcmVtb3ZlZCBkYXRhVHlwZXMgKG1hcmsgZmVhdHVyZSkuXHJcbiAqL1xyXG5cclxuLy8gU3ltYm9sIHRvIGlkZW50aWZ5IHByb3h5IGRyYWZ0cyAtIGFjY2Vzc2libGUgZm9yIDNyZCBwYXJ0eVxyXG5leHBvcnQgY29uc3QgUFJPWFlfRFJBRlQgPSBTeW1ib2wuZm9yKFwiX19DUkVBVEVPUFNfUFJPWFlfRFJBRlRfX1wiKVxyXG5cclxuLy8gU3ltYm9sIGl0ZXJhdG9yXHJcbmV4cG9ydCBjb25zdCBpdGVyYXRvclN5bWJvbDogdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9IFN5bWJvbC5pdGVyYXRvclxyXG4iLCIvKipcclxuICogY3JlYXRlT3BzIGludGVyZmFjZSB0eXBlcy5cclxuICogU2ltcGxpZmllZCBmcm9tIG11dGF0aXZlIC0gcmVtb3ZlZCBwYXRjaGVzLCBhdXRvRnJlZXplLCBzdHJpY3QgbW9kZSwgbWFyaywgTWFwL1NldCBzdXBwb3J0LlxyXG4gKi9cclxuXHJcbmltcG9ydCB0eXBlIHsgSlNPTlByaW1pdGl2ZSwgSlNPTlZhbHVlLCBQYXRoIH0gZnJvbSBcIi4uL2pzb25cIlxyXG5pbXBvcnQgdHlwZSB7IE9wIH0gZnJvbSBcIi4uL29wZXJhdGlvbnNcIlxyXG5cclxuZXhwb3J0IHR5cGUgeyBPcCwgUGF0aCwgSlNPTlZhbHVlIH1cclxuXHJcbmV4cG9ydCBlbnVtIERyYWZ0VHlwZSB7XHJcbiAgT2JqZWN0ID0gMCxcclxuICBBcnJheSA9IDEsXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBGaW5hbGl0aWVzIC0gc2hhcmVkIHN0YXRlIGZvciB0aGUgZHJhZnQgdHJlZVxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBGaW5hbGl0aWVzIHtcclxuICAvKiogRmluYWxpemF0aW9uIGNhbGxiYWNrcyAoZm9yIHVud3JhcHBpbmcgY2hpbGQgZHJhZnRzKSAqL1xyXG4gIGRyYWZ0OiAoKCkgPT4gdm9pZClbXVxyXG4gIC8qKiBSZXZva2UgZnVuY3Rpb25zIGZvciBhbGwgcHJveGllcyAqL1xyXG4gIHJldm9rZTogKCgpID0+IHZvaWQpW11cclxuICAvKiogU2V0IG9mIGhhbmRsZWQgb2JqZWN0cyAoZm9yIGN5Y2xlIGRldGVjdGlvbikgKi9cclxuICBoYW5kbGVkU2V0OiBXZWFrU2V0PG9iamVjdD5cclxuICAvKiogQ2FjaGUgb2YgY3JlYXRlZCBkcmFmdHMgKi9cclxuICBkcmFmdHNDYWNoZTogV2Vha1NldDxvYmplY3Q+XHJcbiAgLyoqIExpc3Qgb2Ygb3BlcmF0aW9ucyBwZXJmb3JtZWQgaW4gdGhpcyBkcmFmdCBzZXNzaW9uIChlYWdlciBsb2dnaW5nKSAqL1xyXG4gIG9wczogT3BbXVxyXG4gIC8qKiBSb290IGRyYWZ0IG9mIHRoZSB0cmVlIChzZXQgd2hlbiBjcmVhdGluZyB0aGUgcm9vdCBkcmFmdCkgKi9cclxuICByb290RHJhZnQ6IFByb3h5RHJhZnQgfCBudWxsXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBJbnRlcm5hbCBwcm94eSBkcmFmdCBzdGF0ZVxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBQcm94eURyYWZ0PFQgPSBhbnk+IHtcclxuICAvKiogVHlwZSBvZiB0aGUgZHJhZnQgKE9iamVjdCBvciBBcnJheSkgKi9cclxuICB0eXBlOiBEcmFmdFR5cGVcclxuICAvKiogV2hldGhlciB0aGlzIGRyYWZ0IGhhcyBiZWVuIG11dGF0ZWQgKi9cclxuICBvcGVyYXRlZD86IGJvb2xlYW5cclxuICAvKiogV2hldGhlciBmaW5hbGl6YXRpb24gaGFzIGJlZW4gY29tcGxldGVkICovXHJcbiAgZmluYWxpemVkOiBib29sZWFuXHJcbiAgLyoqIFRoZSBvcmlnaW5hbCAodW5tb2RpZmllZCkgdmFsdWUgKi9cclxuICBvcmlnaW5hbDogVFxyXG4gIC8qKiBUaGUgc2hhbGxvdyBjb3B5IChjcmVhdGVkIG9uIGZpcnN0IG11dGF0aW9uKSAqL1xyXG4gIGNvcHk6IFQgfCBudWxsXHJcbiAgLyoqIFRoZSBwcm94eSBpbnN0YW5jZSAqL1xyXG4gIHByb3h5OiBUIHwgbnVsbFxyXG4gIC8qKiBGaW5hbGl0aWVzIGNvbnRhaW5lciAoc2hhcmVkIGFjcm9zcyBkcmFmdCB0cmVlKSAqL1xyXG4gIGZpbmFsaXRpZXM6IEZpbmFsaXRpZXNcclxuICAvKiogUGFyZW50IGRyYWZ0IChmb3IgcGF0aCB0cmFja2luZykgKi9cclxuICBwYXJlbnQ/OiBQcm94eURyYWZ0IHwgbnVsbFxyXG4gIC8qKiBLZXkgaW4gcGFyZW50ICovXHJcbiAga2V5Pzogc3RyaW5nIHwgbnVtYmVyXHJcbiAgLyoqIFRyYWNrIHdoaWNoIGtleXMgaGF2ZSBiZWVuIGFzc2lnbmVkIChrZXkgLT4gdHJ1ZT1hc3NpZ25lZCwgZmFsc2U9ZGVsZXRlZCkgKi9cclxuICBhc3NpZ25lZE1hcD86IE1hcDxQcm9wZXJ0eUtleSwgYm9vbGVhbj5cclxuICAvKiogQ291bnQgb2YgcG9zaXRpb25zIHRoaXMgZHJhZnQgZXhpc3RzIGF0IChmb3IgYWxpYXNpbmcgb3B0aW1pemF0aW9uKSAqL1xyXG4gIGFsaWFzQ291bnQ6IG51bWJlclxyXG59XHJcblxyXG4vKipcclxuICogUmVzdWx0IG9mIGNyZWF0ZU9wc1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVPcHNSZXN1bHQ8VD4ge1xyXG4gIC8qKiBUaGUgbmV3IGltbXV0YWJsZSBzdGF0ZSAqL1xyXG4gIG5leHRTdGF0ZTogVFxyXG4gIC8qKiBUaGUgb3BlcmF0aW9ucyB0aGF0IHdlcmUgcGVyZm9ybWVkICovXHJcbiAgb3BzOiBPcFtdXHJcbn1cclxuXHJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuLy8gVHlwZSBVdGlsaXRpZXNcclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuLyoqIFByaW1pdGl2ZSB0eXBlcyB0aGF0IGRvbid0IG5lZWQgZHJhZnRpbmcgKi9cclxudHlwZSBQcmltaXRpdmUgPSBKU09OUHJpbWl0aXZlXHJcblxyXG4vKipcclxuICogRHJhZnQgdHlwZSAtIG1ha2VzIGFsbCBwcm9wZXJ0aWVzIG11dGFibGUgZm9yIGVkaXRpbmdcclxuICovXHJcbmV4cG9ydCB0eXBlIERyYWZ0PFQ+ID0gVCBleHRlbmRzIFByaW1pdGl2ZVxyXG4gID8gVFxyXG4gIDogVCBleHRlbmRzIG9iamVjdFxyXG4gICAgPyB7IC1yZWFkb25seSBbSyBpbiBrZXlvZiBUXTogRHJhZnQ8VFtLXT4gfVxyXG4gICAgOiBUXHJcblxyXG4vKipcclxuICogSW1tdXRhYmxlIHR5cGUgLSBtYWtlcyBhbGwgcHJvcGVydGllcyByZWFkb25seVxyXG4gKi9cclxuZXhwb3J0IHR5cGUgSW1tdXRhYmxlPFQ+ID0gVCBleHRlbmRzIFByaW1pdGl2ZVxyXG4gID8gVFxyXG4gIDogVCBleHRlbmRzIG9iamVjdFxyXG4gICAgPyB7IHJlYWRvbmx5IFtLIGluIGtleW9mIFRdOiBJbW11dGFibGU8VFtLXT4gfVxyXG4gICAgOiBUXHJcbiIsIi8qKlxyXG4gKiBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgcHJveHkgZHJhZnRzLlxyXG4gKiBBZGFwdGVkIGZyb20gbXV0YXRpdmUgLSByZW1vdmVkIE1hcC9TZXQgc3VwcG9ydCwgbWFyaywgZGVlcEZyZWV6ZS5cclxuICovXHJcblxyXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL2Vycm9yXCJcclxuaW1wb3J0IHsgUFJPWFlfRFJBRlQgfSBmcm9tIFwiLi9jb25zdGFudFwiXHJcbmltcG9ydCB7IERyYWZ0VHlwZSwgdHlwZSBQcm94eURyYWZ0IH0gZnJvbSBcIi4vaW50ZXJmYWNlXCJcclxuXHJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuLy8gQ29yZSBEcmFmdCBVdGlsaXRpZXNcclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuLyoqXHJcbiAqIEdldCB0aGUgbGF0ZXN0IHZhbHVlIChjb3B5IGlmIGV4aXN0cywgb3RoZXJ3aXNlIG9yaWdpbmFsKVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGxhdGVzdDxUPihwcm94eURyYWZ0OiBQcm94eURyYWZ0PFQ+KTogVCB7XHJcbiAgcmV0dXJuIChwcm94eURyYWZ0LmNvcHkgPz8gcHJveHlEcmFmdC5vcmlnaW5hbCkgYXMgVFxyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGEgZHJhZnRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0RyYWZ0KHRhcmdldDogdW5rbm93bik6IGJvb2xlYW4ge1xyXG4gIHJldHVybiAhIWdldFByb3h5RHJhZnQodGFyZ2V0KVxyXG59XHJcblxyXG4vKipcclxuICogR2V0IHRoZSBQcm94eURyYWZ0IGZyb20gYSBkcmFmdCB2YWx1ZVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFByb3h5RHJhZnQ8VD4odmFsdWU6IHVua25vd24pOiBQcm94eURyYWZ0PFQ+IHwgbnVsbCB7XHJcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIG51bGxcclxuICByZXR1cm4gKHZhbHVlIGFzIHsgW1BST1hZX0RSQUZUXT86IFByb3h5RHJhZnQ8VD4gfSlbUFJPWFlfRFJBRlRdID8/IG51bGxcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldCB0aGUgYWN0dWFsIHZhbHVlIGZyb20gYSBkcmFmdCAoY29weSBvciBvcmlnaW5hbClcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWx1ZTxUIGV4dGVuZHMgb2JqZWN0Pih2YWx1ZTogVCk6IFQge1xyXG4gIGNvbnN0IHByb3h5RHJhZnQgPSBnZXRQcm94eURyYWZ0KHZhbHVlKVxyXG4gIHJldHVybiBwcm94eURyYWZ0ID8gKChwcm94eURyYWZ0LmNvcHkgPz8gcHJveHlEcmFmdC5vcmlnaW5hbCkgYXMgVCkgOiB2YWx1ZVxyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2sgaWYgYSB2YWx1ZSBpcyBkcmFmdGFibGUgKHBsYWluIG9iamVjdCBvciBhcnJheSlcclxuICogV2Ugb25seSBzdXBwb3J0IHBsYWluIG9iamVjdHMgYW5kIGFycmF5cyAtIG5vIE1hcCwgU2V0LCBEYXRlLCBldGMuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaXNEcmFmdGFibGUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBvYmplY3Qge1xyXG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZVxyXG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpID09PSBPYmplY3QucHJvdG90eXBlXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgdGhlIGRyYWZ0IHR5cGVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlKHRhcmdldDogdW5rbm93bik6IERyYWZ0VHlwZSB7XHJcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGFyZ2V0KSA/IERyYWZ0VHlwZS5BcnJheSA6IERyYWZ0VHlwZS5PYmplY3RcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldCBhIHZhbHVlIGJ5IGtleVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldCh0YXJnZXQ6IG9iamVjdCwga2V5OiBQcm9wZXJ0eUtleSk6IHVua25vd24ge1xyXG4gIHJldHVybiAodGFyZ2V0IGFzIFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj4pW2tleV1cclxufVxyXG5cclxuLyoqXHJcbiAqIFNldCBhIHZhbHVlIGJ5IGtleVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNldCh0YXJnZXQ6IG9iamVjdCwga2V5OiBQcm9wZXJ0eUtleSwgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcclxuICA7KHRhcmdldCBhcyBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+KVtrZXldID0gdmFsdWVcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0cyAob3duIHByb3BlcnR5KVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGhhcyh0YXJnZXQ6IG9iamVjdCwga2V5OiBQcm9wZXJ0eUtleSk6IGJvb2xlYW4ge1xyXG4gIHJldHVybiBPYmplY3QuaGFzT3duKHRhcmdldCwga2V5IGFzIHN0cmluZylcclxufVxyXG5cclxuLyoqXHJcbiAqIFBlZWsgYXQgYSB2YWx1ZSAodGhyb3VnaCBkcmFmdHMpXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcGVlayh0YXJnZXQ6IG9iamVjdCwga2V5OiBQcm9wZXJ0eUtleSk6IHVua25vd24ge1xyXG4gIGNvbnN0IHN0YXRlID0gZ2V0UHJveHlEcmFmdCh0YXJnZXQpXHJcbiAgY29uc3Qgc291cmNlID0gc3RhdGUgPyBsYXRlc3Qoc3RhdGUpIDogdGFyZ2V0XHJcbiAgcmV0dXJuIChzb3VyY2UgYXMgUmVjb3JkPFByb3BlcnR5S2V5LCB1bmtub3duPilba2V5XVxyXG59XHJcblxyXG4vKipcclxuICogU2FtZVZhbHVlIGNvbXBhcmlzb24gKGhhbmRsZXMgLTAgYW5kIE5hTilcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0VxdWFsKHg6IHVua25vd24sIHk6IHVua25vd24pOiBib29sZWFuIHtcclxuICBpZiAoeCA9PT0geSkge1xyXG4gICAgcmV0dXJuIHggIT09IDAgfHwgMSAvICh4IGFzIG51bWJlcikgPT09IDEgLyAoeSBhcyBudW1iZXIpXHJcbiAgfVxyXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9TZWxmQ29tcGFyZTogTmFOIGNoZWNrIHBhdHRlcm4gKE5hTiAhPT0gTmFOKVxyXG4gIHJldHVybiB4ICE9PSB4ICYmIHkgIT09IHlcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldm9rZSBhbGwgcHJveGllcyBpbiBhIGRyYWZ0IHRyZWVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiByZXZva2VQcm94eShwcm94eURyYWZ0OiBQcm94eURyYWZ0IHwgbnVsbCk6IHZvaWQge1xyXG4gIGlmICghcHJveHlEcmFmdCkgcmV0dXJuXHJcbiAgd2hpbGUgKHByb3h5RHJhZnQuZmluYWxpdGllcy5yZXZva2UubGVuZ3RoID4gMCkge1xyXG4gICAgY29uc3QgcmV2b2tlID0gcHJveHlEcmFmdC5maW5hbGl0aWVzLnJldm9rZS5wb3AoKSFcclxuICAgIHJldm9rZSgpXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogR2V0IHRoZSBwYXRoIGZyb20gcm9vdCB0byB0aGlzIGRyYWZ0XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGF0aChcclxuICB0YXJnZXQ6IFByb3h5RHJhZnQsXHJcbiAgcGF0aDogKHN0cmluZyB8IG51bWJlcilbXSA9IFtdXHJcbik6IChzdHJpbmcgfCBudW1iZXIpW10gfCBudWxsIHtcclxuICBpZiAoT2JqZWN0Lmhhc093bih0YXJnZXQsIFwia2V5XCIpICYmIHRhcmdldC5rZXkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBhcmVudCBzdGlsbCBoYXMgdGhpcyBkcmFmdCBhdCB0aGlzIGtleVxyXG4gICAgY29uc3QgcGFyZW50Q29weSA9IHRhcmdldC5wYXJlbnQ/LmNvcHlcclxuICAgIGlmIChwYXJlbnRDb3B5KSB7XHJcbiAgICAgIGNvbnN0IHByb3h5RHJhZnQgPSBnZXRQcm94eURyYWZ0KGdldChwYXJlbnRDb3B5IGFzIG9iamVjdCwgdGFyZ2V0LmtleSkpXHJcbiAgICAgIGlmIChwcm94eURyYWZ0ICE9PSBudWxsICYmIHByb3h5RHJhZnQub3JpZ2luYWwgIT09IHRhcmdldC5vcmlnaW5hbCkge1xyXG4gICAgICAgIHJldHVybiBudWxsXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHBhdGgucHVzaCh0YXJnZXQua2V5KVxyXG4gIH1cclxuICBpZiAodGFyZ2V0LnBhcmVudCkge1xyXG4gICAgcmV0dXJuIGdldFBhdGgodGFyZ2V0LnBhcmVudCwgcGF0aClcclxuICB9XHJcbiAgLy8gdGFyZ2V0IGlzIHJvb3QgZHJhZnRcclxuICBwYXRoLnJldmVyc2UoKVxyXG4gIHJldHVybiBwYXRoXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgdGhlIHBhdGggZnJvbSByb290IHRvIHRoaXMgZHJhZnQsIG9yIHRocm93IGlmIG5vdCBhdmFpbGFibGVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXRoT3JUaHJvdyh0YXJnZXQ6IFByb3h5RHJhZnQpOiAoc3RyaW5nIHwgbnVtYmVyKVtdIHtcclxuICBjb25zdCBwYXRoID0gZ2V0UGF0aCh0YXJnZXQpXHJcbiAgaWYgKCFwYXRoKSB7XHJcbiAgICB0aHJvdyBmYWlsdXJlKFwiQ2Fubm90IGRldGVybWluZSBwYXRoIGZvciBvcGVyYXRpb25cIilcclxuICB9XHJcbiAgcmV0dXJuIHBhdGhcclxufVxyXG5cclxuLyoqXHJcbiAqIEZpbmQgYWxsIHBhdGhzIHRvIGEgZ2l2ZW4gZHJhZnQgYnkgc2VhcmNoaW5nIHRoZSB0cmVlLlxyXG4gKiBUaGlzIGhhbmRsZXMgYWxpYXNpbmcgd2hlcmUgdGhlIHNhbWUgZHJhZnQgZXhpc3RzIGF0IG11bHRpcGxlIHBvc2l0aW9ucy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGxQYXRoc0ZvckRyYWZ0KFxyXG4gIHJvb3REcmFmdDogUHJveHlEcmFmdCxcclxuICB0YXJnZXREcmFmdDogUHJveHlEcmFmdFxyXG4pOiAoc3RyaW5nIHwgbnVtYmVyKVtdW10ge1xyXG4gIGNvbnN0IHJlc3VsdDogKHN0cmluZyB8IG51bWJlcilbXVtdID0gW11cclxuXHJcbiAgZnVuY3Rpb24gc2VhcmNoKGN1cnJlbnQ6IFByb3h5RHJhZnQsIGN1cnJlbnRQYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdm9pZCB7XHJcbiAgICBpZiAoY3VycmVudCA9PT0gdGFyZ2V0RHJhZnQpIHtcclxuICAgICAgcmVzdWx0LnB1c2goWy4uLmN1cnJlbnRQYXRoXSlcclxuICAgICAgLy8gRG9uJ3QgcmV0dXJuIC0gdGhlIHNhbWUgZHJhZnQgY291bGQgYmUgbmVzdGVkIGluc2lkZSBpdHNlbGYgKHVubGlrZWx5IGJ1dCBwb3NzaWJsZSlcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzb3VyY2UgPSBsYXRlc3QoY3VycmVudCkgYXMgUmVjb3JkPHN0cmluZyB8IG51bWJlciwgdW5rbm93bj5cclxuICAgIGlmICghc291cmNlIHx8IHR5cGVvZiBzb3VyY2UgIT09IFwib2JqZWN0XCIpIHJldHVyblxyXG5cclxuICAgIGNvbnN0IGtleXM6IChzdHJpbmcgfCBudW1iZXIpW10gPSBBcnJheS5pc0FycmF5KHNvdXJjZSlcclxuICAgICAgPyBBcnJheS5mcm9tKHsgbGVuZ3RoOiBzb3VyY2UubGVuZ3RoIH0sIChfLCBpKSA9PiBpKVxyXG4gICAgICA6IE9iamVjdC5rZXlzKHNvdXJjZSlcclxuXHJcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XHJcbiAgICAgIGNvbnN0IHZhbHVlID0gc291cmNlW2tleV1cclxuICAgICAgY29uc3QgY2hpbGREcmFmdCA9IGdldFByb3h5RHJhZnQodmFsdWUpXHJcbiAgICAgIGlmIChjaGlsZERyYWZ0KSB7XHJcbiAgICAgICAgc2VhcmNoKGNoaWxkRHJhZnQsIFsuLi5jdXJyZW50UGF0aCwga2V5XSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VhcmNoKHJvb3REcmFmdCwgW10pXHJcbiAgcmV0dXJuIHJlc3VsdFxyXG59XHJcblxyXG4vKipcclxuICogR2V0IGEgcHJvcGVydHkgZGVzY3JpcHRvciBmcm9tIHRoZSBwcm90b3R5cGUgY2hhaW5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXREZXNjcmlwdG9yKHRhcmdldDogb2JqZWN0LCBrZXk6IFByb3BlcnR5S2V5KTogUHJvcGVydHlEZXNjcmlwdG9yIHwgdW5kZWZpbmVkIHtcclxuICBpZiAoa2V5IGluIHRhcmdldCkge1xyXG4gICAgbGV0IHByb3RvdHlwZSA9IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YodGFyZ2V0KVxyXG4gICAgd2hpbGUgKHByb3RvdHlwZSkge1xyXG4gICAgICBjb25zdCBkZXNjcmlwdG9yID0gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG90eXBlLCBrZXkpXHJcbiAgICAgIGlmIChkZXNjcmlwdG9yKSByZXR1cm4gZGVzY3JpcHRvclxyXG4gICAgICBwcm90b3R5cGUgPSBSZWZsZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSlcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIHVuZGVmaW5lZFxyXG59XHJcblxyXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbi8vIENvcHkgVXRpbGl0aWVzXHJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuXHJcbmNvbnN0IHByb3BJc0VudW0gPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlXHJcblxyXG4vKipcclxuICogQ3JlYXRlIGEgc2hhbGxvdyBjb3B5IG9mIGFuIG9iamVjdCBvciBhcnJheVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNoYWxsb3dDb3B5PFQ+KG9yaWdpbmFsOiBUKTogVCB7XHJcbiAgaWYgKEFycmF5LmlzQXJyYXkob3JpZ2luYWwpKSB7XHJcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5jYWxsKG9yaWdpbmFsKSBhcyBUXHJcbiAgfVxyXG4gIC8vIFBsYWluIG9iamVjdCAtIHVzZSBvcHRpbWl6ZWQgY29weVxyXG4gIGNvbnN0IGNvcHk6IFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+ID0ge31cclxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvcmlnaW5hbCBhcyBvYmplY3QpKSB7XHJcbiAgICBjb3B5W2tleV0gPSAob3JpZ2luYWwgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV1cclxuICB9XHJcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvcmlnaW5hbCBhcyBvYmplY3QpKSB7XHJcbiAgICBpZiAocHJvcElzRW51bS5jYWxsKG9yaWdpbmFsLCBrZXkpKSB7XHJcbiAgICAgIGNvcHlba2V5XSA9IChvcmlnaW5hbCBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilba2V5XVxyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gY29weSBhcyBUXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFbnN1cmUgYSBkcmFmdCBoYXMgYSBzaGFsbG93IGNvcHlcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVTaGFsbG93Q29weSh0YXJnZXQ6IFByb3h5RHJhZnQpOiB2b2lkIHtcclxuICBpZiAodGFyZ2V0LmNvcHkpIHJldHVyblxyXG4gIHRhcmdldC5jb3B5ID0gc2hhbGxvd0NvcHkodGFyZ2V0Lm9yaWdpbmFsKVxyXG4gIHRhcmdldC5hc3NpZ25lZE1hcCA9IHRhcmdldC5hc3NpZ25lZE1hcCA/PyBuZXcgTWFwKClcclxufVxyXG5cclxuLyoqXHJcbiAqIERlZXAgY2xvbmUgYSB2YWx1ZSwgdW53cmFwcGluZyBhbnkgZHJhZnRzXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZGVlcENsb25lPFQ+KHRhcmdldDogVCk6IFQge1xyXG4gIGlmICghaXNEcmFmdGFibGUodGFyZ2V0KSkge1xyXG4gICAgcmV0dXJuIGlzRHJhZnQodGFyZ2V0KSA/IChnZXRWYWx1ZSh0YXJnZXQgYXMgb2JqZWN0KSBhcyBUKSA6IHRhcmdldFxyXG4gIH1cclxuICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpKSB7XHJcbiAgICByZXR1cm4gdGFyZ2V0Lm1hcChkZWVwQ2xvbmUpIGFzIFRcclxuICB9XHJcbiAgY29uc3QgY29weTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxyXG4gIGZvciAoY29uc3Qga2V5IGluIHRhcmdldCkge1xyXG4gICAgaWYgKGhhcyh0YXJnZXQsIGtleSkpIHtcclxuICAgICAgY29weVtrZXldID0gZGVlcENsb25lKCh0YXJnZXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0pXHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBjb3B5IGFzIFRcclxufVxyXG5cclxuLyoqXHJcbiAqIENsb25lIGlmIHRoZSB2YWx1ZSBpcyBhIGRyYWZ0LCBvdGhlcndpc2UgcmV0dXJuIGFzLWlzXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY2xvbmVJZk5lZWRlZDxUPih0YXJnZXQ6IFQpOiBUIHtcclxuICByZXR1cm4gaXNEcmFmdCh0YXJnZXQpID8gZGVlcENsb25lKHRhcmdldCkgOiB0YXJnZXRcclxufVxyXG5cclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4vLyBEcmFmdCBTdGF0ZSBVdGlsaXRpZXNcclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuLyoqXHJcbiAqIE1hcmsgYSBkcmFmdCBhcyBjaGFuZ2VkIChvcGVyYXRlZClcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBtYXJrQ2hhbmdlZCh0YXJnZXQ6IFByb3h5RHJhZnQpOiB2b2lkIHtcclxuICBpZiAoIXRhcmdldC5vcGVyYXRlZCkge1xyXG4gICAgdGFyZ2V0Lm9wZXJhdGVkID0gdHJ1ZVxyXG4gICAgaWYgKHRhcmdldC5wYXJlbnQpIHtcclxuICAgICAgbWFya0NoYW5nZWQodGFyZ2V0LnBhcmVudClcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBJdGVyYXRlIG92ZXIgb2JqZWN0L2FycmF5IGVudHJpZXNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmb3JFYWNoPFQgZXh0ZW5kcyBvYmplY3Q+KFxyXG4gIHRhcmdldDogVCxcclxuICBjYWxsYmFjazogKGtleTogUHJvcGVydHlLZXksIHZhbHVlOiB1bmtub3duLCB0YXJnZXQ6IFQpID0+IHZvaWRcclxuKTogdm9pZCB7XHJcbiAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSkge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY2FsbGJhY2soaSwgdGFyZ2V0W2ldLCB0YXJnZXQpXHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIGZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyh0YXJnZXQpKSB7XHJcbiAgICAgIGNhbGxiYWNrKGtleSwgKHRhcmdldCBhcyBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+KVtrZXldLCB0YXJnZXQpXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbi8vIEZpbmFsaXphdGlvbiBVdGlsaXRpZXNcclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuLyoqXHJcbiAqIEhhbmRsZSBuZXN0ZWQgdmFsdWVzIGR1cmluZyBmaW5hbGl6YXRpb25cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVWYWx1ZSh0YXJnZXQ6IHVua25vd24sIGhhbmRsZWRTZXQ6IFdlYWtTZXQ8b2JqZWN0Pik6IHZvaWQge1xyXG4gIGlmIChcclxuICAgICFpc0RyYWZ0YWJsZSh0YXJnZXQpIHx8XHJcbiAgICBpc0RyYWZ0KHRhcmdldCkgfHxcclxuICAgIGhhbmRsZWRTZXQuaGFzKHRhcmdldCBhcyBvYmplY3QpIHx8XHJcbiAgICBPYmplY3QuaXNGcm96ZW4odGFyZ2V0KVxyXG4gICkge1xyXG4gICAgcmV0dXJuXHJcbiAgfVxyXG5cclxuICBoYW5kbGVkU2V0LmFkZCh0YXJnZXQgYXMgb2JqZWN0KVxyXG5cclxuICBmb3JFYWNoKHRhcmdldCBhcyBvYmplY3QsIChrZXksIHZhbHVlKSA9PiB7XHJcbiAgICBpZiAoaXNEcmFmdCh2YWx1ZSkpIHtcclxuICAgICAgY29uc3QgcHJveHlEcmFmdCA9IGdldFByb3h5RHJhZnQodmFsdWUpIVxyXG4gICAgICBlbnN1cmVTaGFsbG93Q29weShwcm94eURyYWZ0KVxyXG4gICAgICBjb25zdCB1cGRhdGVkVmFsdWUgPVxyXG4gICAgICAgIHByb3h5RHJhZnQuYXNzaWduZWRNYXA/LnNpemUgfHwgcHJveHlEcmFmdC5vcGVyYXRlZCA/IHByb3h5RHJhZnQuY29weSA6IHByb3h5RHJhZnQub3JpZ2luYWxcclxuICAgICAgc2V0KHRhcmdldCBhcyBvYmplY3QsIGtleSwgdXBkYXRlZFZhbHVlKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaGFuZGxlVmFsdWUodmFsdWUsIGhhbmRsZWRTZXQpXHJcbiAgICB9XHJcbiAgfSlcclxufVxyXG4iLCIvKipcclxuICogR2V0IHRoZSBjdXJyZW50IHZhbHVlIGZyb20gYSBkcmFmdCAoc25hcHNob3QpLlxyXG4gKiBBZGFwdGVkIGZyb20gbXV0YXRpdmUgLSBzaW1wbGlmaWVkIGZvciBwbGFpbiBvYmplY3RzL2FycmF5cyBvbmx5LlxyXG4gKi9cclxuXHJcbmltcG9ydCB0eXBlIHsgRHJhZnQgfSBmcm9tIFwiLi9pbnRlcmZhY2VcIlxyXG5pbXBvcnQge1xyXG4gIGZvckVhY2gsXHJcbiAgZ2V0LFxyXG4gIGdldFByb3h5RHJhZnQsXHJcbiAgaXNEcmFmdCxcclxuICBpc0RyYWZ0YWJsZSxcclxuICBpc0VxdWFsLFxyXG4gIHNldCxcclxuICBzaGFsbG93Q29weSxcclxufSBmcm9tIFwiLi91dGlsc1wiXHJcblxyXG4vKipcclxuICogR2V0IGN1cnJlbnQgc3RhdGUgZnJvbSBhIHZhbHVlIChoYW5kbGVzIG5lc3RlZCBkcmFmdHMpXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRDdXJyZW50PFQ+KHRhcmdldDogVCk6IFQge1xyXG4gIGNvbnN0IHByb3h5RHJhZnQgPSBnZXRQcm94eURyYWZ0KHRhcmdldClcclxuXHJcbiAgLy8gTm90IGRyYWZ0YWJsZSAtIHJldHVybiBhcy1pc1xyXG4gIGlmICghaXNEcmFmdGFibGUodGFyZ2V0KSkgcmV0dXJuIHRhcmdldFxyXG5cclxuICAvLyBEcmFmdCB0aGF0IGhhc24ndCBiZWVuIG1vZGlmaWVkIC0gcmV0dXJuIG9yaWdpbmFsXHJcbiAgaWYgKHByb3h5RHJhZnQgJiYgIXByb3h5RHJhZnQub3BlcmF0ZWQpIHtcclxuICAgIHJldHVybiBwcm94eURyYWZ0Lm9yaWdpbmFsIGFzIFRcclxuICB9XHJcblxyXG4gIGxldCBjdXJyZW50VmFsdWU6IFQgfCB1bmRlZmluZWRcclxuXHJcbiAgZnVuY3Rpb24gZW5zdXJlU2hhbGxvd0NvcHlMb2NhbCgpIHtcclxuICAgIGN1cnJlbnRWYWx1ZSA9IHNoYWxsb3dDb3B5KHRhcmdldClcclxuICB9XHJcblxyXG4gIGlmIChwcm94eURyYWZ0KSB7XHJcbiAgICAvLyBJdCdzIGEgZHJhZnQgLSBjcmVhdGUgYSBzaGFsbG93IGNvcHkgZWFnZXJseVxyXG4gICAgcHJveHlEcmFmdC5maW5hbGl6ZWQgPSB0cnVlXHJcbiAgICB0cnkge1xyXG4gICAgICBlbnN1cmVTaGFsbG93Q29weUxvY2FsKClcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHByb3h5RHJhZnQuZmluYWxpemVkID0gZmFsc2VcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgLy8gTm90IGEgZHJhZnQgLSB1c2UgdGFyZ2V0IGRpcmVjdGx5LCBjb3B5IGxhemlseSBpZiBuZWVkZWRcclxuICAgIGN1cnJlbnRWYWx1ZSA9IHRhcmdldFxyXG4gIH1cclxuXHJcbiAgLy8gUmVjdXJzaXZlbHkgcHJvY2VzcyBjaGlsZHJlblxyXG4gIGZvckVhY2goY3VycmVudFZhbHVlIGFzIG9iamVjdCwgKGtleSwgdmFsdWUpID0+IHtcclxuICAgIGlmIChwcm94eURyYWZ0ICYmIGlzRXF1YWwoZ2V0KHByb3h5RHJhZnQub3JpZ2luYWwgYXMgb2JqZWN0LCBrZXkpLCB2YWx1ZSkpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBjb25zdCBuZXdWYWx1ZSA9IGdldEN1cnJlbnQodmFsdWUpXHJcbiAgICBpZiAobmV3VmFsdWUgIT09IHZhbHVlKSB7XHJcbiAgICAgIGlmIChjdXJyZW50VmFsdWUgPT09IHRhcmdldCkge1xyXG4gICAgICAgIGVuc3VyZVNoYWxsb3dDb3B5TG9jYWwoKVxyXG4gICAgICB9XHJcbiAgICAgIHNldChjdXJyZW50VmFsdWUgYXMgb2JqZWN0LCBrZXksIG5ld1ZhbHVlKVxyXG4gICAgfVxyXG4gIH0pXHJcblxyXG4gIHJldHVybiBjdXJyZW50VmFsdWUgYXMgVFxyXG59XHJcblxyXG4vKipcclxuICogYGN1cnJlbnQoZHJhZnQpYCB0byBnZXQgY3VycmVudCBzdGF0ZSBpbiB0aGUgZHJhZnQgbXV0YXRpb24gZnVuY3Rpb24uXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHRzXHJcbiAqIGNvbnN0IHsgbmV4dFN0YXRlLCBvcHMgfSA9IGNyZWF0ZU9wcyhiYXNlU3RhdGUsIChkcmFmdCkgPT4ge1xyXG4gKiAgIGRyYWZ0LmZvby5iYXIgPSAnbmV3IHZhbHVlJztcclxuICogICBjb25zb2xlLmxvZyhjdXJyZW50KGRyYWZ0LmZvbykpOyAvLyB7IGJhcjogJ25ldyB2YWx1ZScgfVxyXG4gKiB9KTtcclxuICogYGBgXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY3VycmVudDxUIGV4dGVuZHMgb2JqZWN0Pih0YXJnZXQ6IERyYWZ0PFQ+KTogVFxyXG5leHBvcnQgZnVuY3Rpb24gY3VycmVudDxUIGV4dGVuZHMgb2JqZWN0Pih0YXJnZXQ6IFQgfCBEcmFmdDxUPik6IFQge1xyXG4gIGlmICghaXNEcmFmdCh0YXJnZXQpKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGN1cnJlbnQoKSBpcyBvbmx5IHVzZWQgZm9yIERyYWZ0LCBwYXJhbWV0ZXI6ICR7dGFyZ2V0fWApXHJcbiAgfVxyXG4gIHJldHVybiBnZXRDdXJyZW50KHRhcmdldCkgYXMgVFxyXG59XHJcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gZG8gbm90IGVkaXQgLmpzIGZpbGVzIGRpcmVjdGx5IC0gZWRpdCBzcmMvaW5kZXguanN0XG5cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGVxdWFsKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuXG4gIGlmIChhICYmIGIgJiYgdHlwZW9mIGEgPT0gJ29iamVjdCcgJiYgdHlwZW9mIGIgPT0gJ29iamVjdCcpIHtcbiAgICBpZiAoYS5jb25zdHJ1Y3RvciAhPT0gYi5jb25zdHJ1Y3RvcikgcmV0dXJuIGZhbHNlO1xuXG4gICAgdmFyIGxlbmd0aCwgaSwga2V5cztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgbGVuZ3RoID0gYS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICAgIGlmICghZXF1YWwoYVtpXSwgYltpXSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuXG5cbiAgICBpZiAoYS5jb25zdHJ1Y3RvciA9PT0gUmVnRXhwKSByZXR1cm4gYS5zb3VyY2UgPT09IGIuc291cmNlICYmIGEuZmxhZ3MgPT09IGIuZmxhZ3M7XG4gICAgaWYgKGEudmFsdWVPZiAhPT0gT2JqZWN0LnByb3RvdHlwZS52YWx1ZU9mKSByZXR1cm4gYS52YWx1ZU9mKCkgPT09IGIudmFsdWVPZigpO1xuICAgIGlmIChhLnRvU3RyaW5nICE9PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKSByZXR1cm4gYS50b1N0cmluZygpID09PSBiLnRvU3RyaW5nKCk7XG5cbiAgICBrZXlzID0gT2JqZWN0LmtleXMoYSk7XG4gICAgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgaWYgKGxlbmd0aCAhPT0gT2JqZWN0LmtleXMoYikubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBrZXlzW2ldKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcblxuICAgICAgaWYgKCFlcXVhbChhW2tleV0sIGJba2V5XSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIHRydWUgaWYgYm90aCBOYU4sIGZhbHNlIG90aGVyd2lzZVxuICByZXR1cm4gYSE9PWEgJiYgYiE9PWI7XG59O1xuIiwiZXhwb3J0IGNvbnN0IHVybEFscGhhYmV0ID1cbiAgJ3VzZWFuZG9tLTI2VDE5ODM0MFBYNzVweEpBQ0tWRVJZTUlOREJVU0hXT0xGX0dRWmJmZ2hqa2xxdnd5enJpY3QnXG4iLCIvKiBAdHMtc2VsZi10eXBlcz1cIi4vaW5kZXguZC50c1wiICovXG5pbXBvcnQgeyB1cmxBbHBoYWJldCBhcyBzY29wZWRVcmxBbHBoYWJldCB9IGZyb20gJy4vdXJsLWFscGhhYmV0L2luZGV4LmpzJ1xuZXhwb3J0IHsgdXJsQWxwaGFiZXQgfSBmcm9tICcuL3VybC1hbHBoYWJldC9pbmRleC5qcydcbmV4cG9ydCBsZXQgcmFuZG9tID0gYnl0ZXMgPT4gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheShieXRlcykpXG5leHBvcnQgbGV0IGN1c3RvbVJhbmRvbSA9IChhbHBoYWJldCwgZGVmYXVsdFNpemUsIGdldFJhbmRvbSkgPT4ge1xuICBsZXQgbWFzayA9ICgyIDw8IE1hdGgubG9nMihhbHBoYWJldC5sZW5ndGggLSAxKSkgLSAxXG4gIGxldCBzdGVwID0gLX4oKDEuNiAqIG1hc2sgKiBkZWZhdWx0U2l6ZSkgLyBhbHBoYWJldC5sZW5ndGgpXG4gIHJldHVybiAoc2l6ZSA9IGRlZmF1bHRTaXplKSA9PiB7XG4gICAgbGV0IGlkID0gJydcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgbGV0IGJ5dGVzID0gZ2V0UmFuZG9tKHN0ZXApXG4gICAgICBsZXQgaiA9IHN0ZXAgfCAwXG4gICAgICB3aGlsZSAoai0tKSB7XG4gICAgICAgIGlkICs9IGFscGhhYmV0W2J5dGVzW2pdICYgbWFza10gfHwgJydcbiAgICAgICAgaWYgKGlkLmxlbmd0aCA+PSBzaXplKSByZXR1cm4gaWRcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmV4cG9ydCBsZXQgY3VzdG9tQWxwaGFiZXQgPSAoYWxwaGFiZXQsIHNpemUgPSAyMSkgPT5cbiAgY3VzdG9tUmFuZG9tKGFscGhhYmV0LCBzaXplIHwgMCwgcmFuZG9tKVxuZXhwb3J0IGxldCBuYW5vaWQgPSAoc2l6ZSA9IDIxKSA9PiB7XG4gIGxldCBpZCA9ICcnXG4gIGxldCBieXRlcyA9IGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoKHNpemUgfD0gMCkpKVxuICB3aGlsZSAoc2l6ZS0tKSB7XG4gICAgaWQgKz0gc2NvcGVkVXJsQWxwaGFiZXRbYnl0ZXNbc2l6ZV0gJiA2M11cbiAgfVxuICByZXR1cm4gaWRcbn1cbiIsIid1c2Ugc3RyaWN0J1xubW9kdWxlLmV4cG9ydHMgPSByZmRjXG5cbmZ1bmN0aW9uIGNvcHlCdWZmZXIgKGN1cikge1xuICBpZiAoY3VyIGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGN1cilcbiAgfVxuXG4gIHJldHVybiBuZXcgY3VyLmNvbnN0cnVjdG9yKGN1ci5idWZmZXIuc2xpY2UoKSwgY3VyLmJ5dGVPZmZzZXQsIGN1ci5sZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHJmZGMgKG9wdHMpIHtcbiAgb3B0cyA9IG9wdHMgfHwge31cbiAgaWYgKG9wdHMuY2lyY2xlcykgcmV0dXJuIHJmZGNDaXJjbGVzKG9wdHMpXG5cbiAgY29uc3QgY29uc3RydWN0b3JIYW5kbGVycyA9IG5ldyBNYXAoKVxuICBjb25zdHJ1Y3RvckhhbmRsZXJzLnNldChEYXRlLCAobykgPT4gbmV3IERhdGUobykpXG4gIGNvbnN0cnVjdG9ySGFuZGxlcnMuc2V0KE1hcCwgKG8sIGZuKSA9PiBuZXcgTWFwKGNsb25lQXJyYXkoQXJyYXkuZnJvbShvKSwgZm4pKSlcbiAgY29uc3RydWN0b3JIYW5kbGVycy5zZXQoU2V0LCAobywgZm4pID0+IG5ldyBTZXQoY2xvbmVBcnJheShBcnJheS5mcm9tKG8pLCBmbikpKVxuICBpZiAob3B0cy5jb25zdHJ1Y3RvckhhbmRsZXJzKSB7XG4gICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIG9wdHMuY29uc3RydWN0b3JIYW5kbGVycykge1xuICAgICAgY29uc3RydWN0b3JIYW5kbGVycy5zZXQoaGFuZGxlclswXSwgaGFuZGxlclsxXSlcbiAgICB9XG4gIH1cblxuICBsZXQgaGFuZGxlciA9IG51bGxcblxuICByZXR1cm4gb3B0cy5wcm90byA/IGNsb25lUHJvdG8gOiBjbG9uZVxuXG4gIGZ1bmN0aW9uIGNsb25lQXJyYXkgKGEsIGZuKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGEpXG4gICAgY29uc3QgYTIgPSBuZXcgQXJyYXkoa2V5cy5sZW5ndGgpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrID0ga2V5c1tpXVxuICAgICAgY29uc3QgY3VyID0gYVtrXVxuICAgICAgaWYgKHR5cGVvZiBjdXIgIT09ICdvYmplY3QnIHx8IGN1ciA9PT0gbnVsbCkge1xuICAgICAgICBhMltrXSA9IGN1clxuICAgICAgfSBlbHNlIGlmIChjdXIuY29uc3RydWN0b3IgIT09IE9iamVjdCAmJiAoaGFuZGxlciA9IGNvbnN0cnVjdG9ySGFuZGxlcnMuZ2V0KGN1ci5jb25zdHJ1Y3RvcikpKSB7XG4gICAgICAgIGEyW2tdID0gaGFuZGxlcihjdXIsIGZuKVxuICAgICAgfSBlbHNlIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoY3VyKSkge1xuICAgICAgICBhMltrXSA9IGNvcHlCdWZmZXIoY3VyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYTJba10gPSBmbihjdXIpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhMlxuICB9XG5cbiAgZnVuY3Rpb24gY2xvbmUgKG8pIHtcbiAgICBpZiAodHlwZW9mIG8gIT09ICdvYmplY3QnIHx8IG8gPT09IG51bGwpIHJldHVybiBvXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobykpIHJldHVybiBjbG9uZUFycmF5KG8sIGNsb25lKVxuICAgIGlmIChvLmNvbnN0cnVjdG9yICE9PSBPYmplY3QgJiYgKGhhbmRsZXIgPSBjb25zdHJ1Y3RvckhhbmRsZXJzLmdldChvLmNvbnN0cnVjdG9yKSkpIHtcbiAgICAgIHJldHVybiBoYW5kbGVyKG8sIGNsb25lKVxuICAgIH1cbiAgICBjb25zdCBvMiA9IHt9XG4gICAgZm9yIChjb25zdCBrIGluIG8pIHtcbiAgICAgIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChvLCBrKSA9PT0gZmFsc2UpIGNvbnRpbnVlXG4gICAgICBjb25zdCBjdXIgPSBvW2tdXG4gICAgICBpZiAodHlwZW9mIGN1ciAhPT0gJ29iamVjdCcgfHwgY3VyID09PSBudWxsKSB7XG4gICAgICAgIG8yW2tdID0gY3VyXG4gICAgICB9IGVsc2UgaWYgKGN1ci5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0ICYmIChoYW5kbGVyID0gY29uc3RydWN0b3JIYW5kbGVycy5nZXQoY3VyLmNvbnN0cnVjdG9yKSkpIHtcbiAgICAgICAgbzJba10gPSBoYW5kbGVyKGN1ciwgY2xvbmUpXG4gICAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhjdXIpKSB7XG4gICAgICAgIG8yW2tdID0gY29weUJ1ZmZlcihjdXIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvMltrXSA9IGNsb25lKGN1cilcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG8yXG4gIH1cblxuICBmdW5jdGlvbiBjbG9uZVByb3RvIChvKSB7XG4gICAgaWYgKHR5cGVvZiBvICE9PSAnb2JqZWN0JyB8fCBvID09PSBudWxsKSByZXR1cm4gb1xuICAgIGlmIChBcnJheS5pc0FycmF5KG8pKSByZXR1cm4gY2xvbmVBcnJheShvLCBjbG9uZVByb3RvKVxuICAgIGlmIChvLmNvbnN0cnVjdG9yICE9PSBPYmplY3QgJiYgKGhhbmRsZXIgPSBjb25zdHJ1Y3RvckhhbmRsZXJzLmdldChvLmNvbnN0cnVjdG9yKSkpIHtcbiAgICAgIHJldHVybiBoYW5kbGVyKG8sIGNsb25lUHJvdG8pXG4gICAgfVxuICAgIGNvbnN0IG8yID0ge31cbiAgICBmb3IgKGNvbnN0IGsgaW4gbykge1xuICAgICAgY29uc3QgY3VyID0gb1trXVxuICAgICAgaWYgKHR5cGVvZiBjdXIgIT09ICdvYmplY3QnIHx8IGN1ciA9PT0gbnVsbCkge1xuICAgICAgICBvMltrXSA9IGN1clxuICAgICAgfSBlbHNlIGlmIChjdXIuY29uc3RydWN0b3IgIT09IE9iamVjdCAmJiAoaGFuZGxlciA9IGNvbnN0cnVjdG9ySGFuZGxlcnMuZ2V0KGN1ci5jb25zdHJ1Y3RvcikpKSB7XG4gICAgICAgIG8yW2tdID0gaGFuZGxlcihjdXIsIGNsb25lUHJvdG8pXG4gICAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhjdXIpKSB7XG4gICAgICAgIG8yW2tdID0gY29weUJ1ZmZlcihjdXIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvMltrXSA9IGNsb25lUHJvdG8oY3VyKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbzJcbiAgfVxufVxuXG5mdW5jdGlvbiByZmRjQ2lyY2xlcyAob3B0cykge1xuICBjb25zdCByZWZzID0gW11cbiAgY29uc3QgcmVmc05ldyA9IFtdXG5cbiAgY29uc3QgY29uc3RydWN0b3JIYW5kbGVycyA9IG5ldyBNYXAoKVxuICBjb25zdHJ1Y3RvckhhbmRsZXJzLnNldChEYXRlLCAobykgPT4gbmV3IERhdGUobykpXG4gIGNvbnN0cnVjdG9ySGFuZGxlcnMuc2V0KE1hcCwgKG8sIGZuKSA9PiBuZXcgTWFwKGNsb25lQXJyYXkoQXJyYXkuZnJvbShvKSwgZm4pKSlcbiAgY29uc3RydWN0b3JIYW5kbGVycy5zZXQoU2V0LCAobywgZm4pID0+IG5ldyBTZXQoY2xvbmVBcnJheShBcnJheS5mcm9tKG8pLCBmbikpKVxuICBpZiAob3B0cy5jb25zdHJ1Y3RvckhhbmRsZXJzKSB7XG4gICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIG9wdHMuY29uc3RydWN0b3JIYW5kbGVycykge1xuICAgICAgY29uc3RydWN0b3JIYW5kbGVycy5zZXQoaGFuZGxlclswXSwgaGFuZGxlclsxXSlcbiAgICB9XG4gIH1cblxuICBsZXQgaGFuZGxlciA9IG51bGxcbiAgcmV0dXJuIG9wdHMucHJvdG8gPyBjbG9uZVByb3RvIDogY2xvbmVcblxuICBmdW5jdGlvbiBjbG9uZUFycmF5IChhLCBmbikge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhhKVxuICAgIGNvbnN0IGEyID0gbmV3IEFycmF5KGtleXMubGVuZ3RoKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgayA9IGtleXNbaV1cbiAgICAgIGNvbnN0IGN1ciA9IGFba11cbiAgICAgIGlmICh0eXBlb2YgY3VyICE9PSAnb2JqZWN0JyB8fCBjdXIgPT09IG51bGwpIHtcbiAgICAgICAgYTJba10gPSBjdXJcbiAgICAgIH0gZWxzZSBpZiAoY3VyLmNvbnN0cnVjdG9yICE9PSBPYmplY3QgJiYgKGhhbmRsZXIgPSBjb25zdHJ1Y3RvckhhbmRsZXJzLmdldChjdXIuY29uc3RydWN0b3IpKSkge1xuICAgICAgICBhMltrXSA9IGhhbmRsZXIoY3VyLCBmbilcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGN1cikpIHtcbiAgICAgICAgYTJba10gPSBjb3B5QnVmZmVyKGN1cilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gcmVmcy5pbmRleE9mKGN1cilcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIGEyW2tdID0gcmVmc05ld1tpbmRleF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhMltrXSA9IGZuKGN1cilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYTJcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb25lIChvKSB7XG4gICAgaWYgKHR5cGVvZiBvICE9PSAnb2JqZWN0JyB8fCBvID09PSBudWxsKSByZXR1cm4gb1xuICAgIGlmIChBcnJheS5pc0FycmF5KG8pKSByZXR1cm4gY2xvbmVBcnJheShvLCBjbG9uZSlcbiAgICBpZiAoby5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0ICYmIChoYW5kbGVyID0gY29uc3RydWN0b3JIYW5kbGVycy5nZXQoby5jb25zdHJ1Y3RvcikpKSB7XG4gICAgICByZXR1cm4gaGFuZGxlcihvLCBjbG9uZSlcbiAgICB9XG4gICAgY29uc3QgbzIgPSB7fVxuICAgIHJlZnMucHVzaChvKVxuICAgIHJlZnNOZXcucHVzaChvMilcbiAgICBmb3IgKGNvbnN0IGsgaW4gbykge1xuICAgICAgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIGspID09PSBmYWxzZSkgY29udGludWVcbiAgICAgIGNvbnN0IGN1ciA9IG9ba11cbiAgICAgIGlmICh0eXBlb2YgY3VyICE9PSAnb2JqZWN0JyB8fCBjdXIgPT09IG51bGwpIHtcbiAgICAgICAgbzJba10gPSBjdXJcbiAgICAgIH0gZWxzZSBpZiAoY3VyLmNvbnN0cnVjdG9yICE9PSBPYmplY3QgJiYgKGhhbmRsZXIgPSBjb25zdHJ1Y3RvckhhbmRsZXJzLmdldChjdXIuY29uc3RydWN0b3IpKSkge1xuICAgICAgICBvMltrXSA9IGhhbmRsZXIoY3VyLCBjbG9uZSlcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGN1cikpIHtcbiAgICAgICAgbzJba10gPSBjb3B5QnVmZmVyKGN1cilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGkgPSByZWZzLmluZGV4T2YoY3VyKVxuICAgICAgICBpZiAoaSAhPT0gLTEpIHtcbiAgICAgICAgICBvMltrXSA9IHJlZnNOZXdbaV1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvMltrXSA9IGNsb25lKGN1cilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZWZzLnBvcCgpXG4gICAgcmVmc05ldy5wb3AoKVxuICAgIHJldHVybiBvMlxuICB9XG5cbiAgZnVuY3Rpb24gY2xvbmVQcm90byAobykge1xuICAgIGlmICh0eXBlb2YgbyAhPT0gJ29iamVjdCcgfHwgbyA9PT0gbnVsbCkgcmV0dXJuIG9cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvKSkgcmV0dXJuIGNsb25lQXJyYXkobywgY2xvbmVQcm90bylcbiAgICBpZiAoby5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0ICYmIChoYW5kbGVyID0gY29uc3RydWN0b3JIYW5kbGVycy5nZXQoby5jb25zdHJ1Y3RvcikpKSB7XG4gICAgICByZXR1cm4gaGFuZGxlcihvLCBjbG9uZVByb3RvKVxuICAgIH1cbiAgICBjb25zdCBvMiA9IHt9XG4gICAgcmVmcy5wdXNoKG8pXG4gICAgcmVmc05ldy5wdXNoKG8yKVxuICAgIGZvciAoY29uc3QgayBpbiBvKSB7XG4gICAgICBjb25zdCBjdXIgPSBvW2tdXG4gICAgICBpZiAodHlwZW9mIGN1ciAhPT0gJ29iamVjdCcgfHwgY3VyID09PSBudWxsKSB7XG4gICAgICAgIG8yW2tdID0gY3VyXG4gICAgICB9IGVsc2UgaWYgKGN1ci5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0ICYmIChoYW5kbGVyID0gY29uc3RydWN0b3JIYW5kbGVycy5nZXQoY3VyLmNvbnN0cnVjdG9yKSkpIHtcbiAgICAgICAgbzJba10gPSBoYW5kbGVyKGN1ciwgY2xvbmVQcm90bylcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGN1cikpIHtcbiAgICAgICAgbzJba10gPSBjb3B5QnVmZmVyKGN1cilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGkgPSByZWZzLmluZGV4T2YoY3VyKVxuICAgICAgICBpZiAoaSAhPT0gLTEpIHtcbiAgICAgICAgICBvMltrXSA9IHJlZnNOZXdbaV1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvMltrXSA9IGNsb25lUHJvdG8oY3VyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJlZnMucG9wKClcbiAgICByZWZzTmV3LnBvcCgpXG4gICAgcmV0dXJuIG8yXG4gIH1cbn1cbiIsImltcG9ydCBlcXVhbCBmcm9tIFwiZmFzdC1kZWVwLWVxdWFsXCJcclxuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSBcIm5hbm9pZFwiXHJcbmltcG9ydCByZmRjIGZyb20gXCJyZmRjXCJcclxuaW1wb3J0IHR5cGUgeyBKU09OVmFsdWUgfSBmcm9tIFwiLi9qc29uXCJcclxuXHJcbmNvbnN0IGNsb25lID0gcmZkYyh7IHByb3RvOiB0cnVlIH0pXHJcblxyXG4vKipcclxuICogRGVlcCBlcXVhbGl0eSBjaGVjayBmb3IgSlNPTlZhbHVlcy5cclxuICogVXNlZCBmb3IgYWRkVG9TZXQgLyBkZWxldGVGcm9tU2V0IG9wZXJhdGlvbnMuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZGVlcEVxdWFsKGE6IEpTT05WYWx1ZSwgYjogSlNPTlZhbHVlKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIGVxdWFsKGEsIGIpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQgdXNpbmcgbmFub2lkLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlSUQoKTogc3RyaW5nIHtcclxuICByZXR1cm4gbmFub2lkKClcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIGFuIG9iamVjdCAodHlwZW9mID09PSBcIm9iamVjdFwiICYmICE9PSBudWxsKS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG9iamVjdCB7XHJcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIlxyXG59XHJcblxyXG4vKipcclxuICogRGVlcCBjbG9uZXMgYSBKU09OLXNlcmlhbGl6YWJsZSB2YWx1ZS5cclxuICogT3B0aW1pemVkOiBwcmltaXRpdmVzIGFyZSByZXR1cm5lZCBhcy1pcy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWVwQ2xvbmU8VD4odmFsdWU6IFQpOiBUIHtcclxuICAvLyBQcmltaXRpdmVzIGRvbid0IG5lZWQgY2xvbmluZ1xyXG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHtcclxuICAgIHJldHVybiB2YWx1ZVxyXG4gIH1cclxuICByZXR1cm4gY2xvbmUodmFsdWUpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbGF6eSBtZW1vaXplZCBnZXR0ZXIuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbGF6eTxUPihmbjogKCkgPT4gVCk6ICgpID0+IFQge1xyXG4gIGxldCBjb21wdXRlZCA9IGZhbHNlXHJcbiAgbGV0IHZhbHVlOiBUXHJcbiAgcmV0dXJuICgpID0+IHtcclxuICAgIGlmICghY29tcHV0ZWQpIHtcclxuICAgICAgdmFsdWUgPSBmbigpXHJcbiAgICAgIGNvbXB1dGVkID0gdHJ1ZVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2tzIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgbm9uLW5lZ2F0aXZlIGludGVnZXIgYXJyYXkgaW5kZXguXHJcbiAqIFJldHVybnMgdGhlIG51bWVyaWMgdmFsdWUgaWYgdmFsaWQsIG9yIG51bGwgaWYgaW52YWxpZC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUFycmF5SW5kZXgoa2V5OiBzdHJpbmcpOiBudW1iZXIgfCBudWxsIHtcclxuICBjb25zdCBuID0gTnVtYmVyKGtleSlcclxuICBpZiAoIU51bWJlci5pc0ludGVnZXIobikgfHwgbiA8IDApIHtcclxuICAgIHJldHVybiBudWxsXHJcbiAgfVxyXG4gIHJldHVybiBuXHJcbn1cclxuIiwiLyoqXHJcbiAqIEVhZ2VyIG9wIGdlbmVyYXRpb24gLSBvcHMgYXJlIHB1c2hlZCBpbW1lZGlhdGVseSB3aGVuIG11dGF0aW9ucyBoYXBwZW4uXHJcbiAqXHJcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSBwdXNoT3AgZnVuY3Rpb24gdGhhdCByZWNvcmRzIG9wZXJhdGlvbnMgYXQgbXV0YXRpb24gdGltZSxcclxuICogcmF0aGVyIHRoYW4gZGlmZmluZyBhdCBmaW5hbGl6YXRpb24gdGltZS5cclxuICpcclxuICogV2hlbiBhIGRyYWZ0IGV4aXN0cyBhdCBtdWx0aXBsZSBwb3NpdGlvbnMgKGFsaWFzaW5nKSwgb3BzIGFyZSBlbWl0dGVkIGZvciBBTEwgcG9zaXRpb25zXHJcbiAqIHRvIGVuc3VyZSBjb25zaXN0ZW5jeSB3aGVuIGFwcGxpZWQuXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi9lcnJvclwiXHJcbmltcG9ydCB0eXBlIHsgT3AsIFByb3h5RHJhZnQgfSBmcm9tIFwiLi9pbnRlcmZhY2VcIlxyXG5pbXBvcnQgeyBnZXRBbGxQYXRoc0ZvckRyYWZ0IH0gZnJvbSBcIi4vdXRpbHNcIlxyXG5cclxuLyoqXHJcbiAqIFB1c2ggYW4gb3BlcmF0aW9uIHRvIHRoZSBvcHMgbG9nLlxyXG4gKiBWYWx1ZXMgc2hvdWxkIGFscmVhZHkgYmUgY2xvbmVkIGJ5IHRoZSBjYWxsZXIgdG8gYXZvaWQgYWxpYXNpbmcgaXNzdWVzLlxyXG4gKlxyXG4gKiBXaGVuIHRoZSB0YXJnZXQgZHJhZnQgZXhpc3RzIGF0IG11bHRpcGxlIHBvc2l0aW9ucyAoZHVlIHRvIGFsaWFzaW5nKSxcclxuICogdGhpcyBmdW5jdGlvbiBlbWl0cyBvcHMgZm9yIGFsbCBwb3NpdGlvbnMgdG8gbWFpbnRhaW4gY29uc2lzdGVuY3kuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcHVzaE9wKHByb3h5RHJhZnQ6IFByb3h5RHJhZnQsIG9wOiBPcCk6IHZvaWQge1xyXG4gIGNvbnN0IHJvb3REcmFmdCA9IHByb3h5RHJhZnQuZmluYWxpdGllcy5yb290RHJhZnRcclxuICBpZiAoIXJvb3REcmFmdCkge1xyXG4gICAgdGhyb3cgZmFpbHVyZShcInJvb3REcmFmdCBpcyBub3Qgc2V0IC0gY2Fubm90IGVtaXQgb3BcIilcclxuICB9XHJcblxyXG4gIC8vIEZhc3QgcGF0aDogbm8gYWxpYXNpbmcsIGp1c3QgZW1pdCB0aGUgc2luZ2xlIG9wXHJcbiAgaWYgKHByb3h5RHJhZnQuYWxpYXNDb3VudCA8PSAxKSB7XHJcbiAgICBwcm94eURyYWZ0LmZpbmFsaXRpZXMub3BzLnB1c2gob3ApXHJcbiAgICByZXR1cm5cclxuICB9XHJcblxyXG4gIC8vIFNsb3cgcGF0aDogZHJhZnQgZXhpc3RzIGF0IG11bHRpcGxlIHBvc2l0aW9ucywgZmluZCBhbGwgcGF0aHNcclxuICBjb25zdCBhbGxQYXRocyA9IGdldEFsbFBhdGhzRm9yRHJhZnQocm9vdERyYWZ0LCBwcm94eURyYWZ0KVxyXG5cclxuICAvLyBFbWl0IHRoZSBvcCBmb3IgZWFjaCBwYXRoIHdoZXJlIHRoaXMgZHJhZnQgZXhpc3RzXHJcbiAgZm9yIChjb25zdCBwYXRoIG9mIGFsbFBhdGhzKSB7XHJcbiAgICBjb25zdCBhZGp1c3RlZE9wID0geyAuLi5vcCwgcGF0aCB9XHJcbiAgICBwcm94eURyYWZ0LmZpbmFsaXRpZXMub3BzLnB1c2goYWRqdXN0ZWRPcClcclxuICB9XHJcbn1cclxuIiwiLyoqXHJcbiAqIFByb3h5IGRyYWZ0IGltcGxlbWVudGF0aW9uLlxyXG4gKiBBZGFwdGVkIGZyb20gbXV0YXRpdmUgLSByZW1vdmVkIE1hcC9TZXQvdW5zYWZlL21hcmsgc3VwcG9ydC5cclxuICogTW9kaWZpZWQgdG8gdXNlIGVhZ2VyIG9wIGxvZ2dpbmcgLSBvcHMgYXJlIHB1c2hlZCBpbW1lZGlhdGVseSB3aGVuIG11dGF0aW9ucyBoYXBwZW4uXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgcGFyc2VBcnJheUluZGV4IH0gZnJvbSBcIi4uL3V0aWxzXCJcclxuaW1wb3J0IHsgUFJPWFlfRFJBRlQgfSBmcm9tIFwiLi9jb25zdGFudFwiXHJcbmltcG9ydCB7IERyYWZ0VHlwZSwgdHlwZSBGaW5hbGl0aWVzLCB0eXBlIEpTT05WYWx1ZSwgdHlwZSBPcCwgdHlwZSBQcm94eURyYWZ0IH0gZnJvbSBcIi4vaW50ZXJmYWNlXCJcclxuaW1wb3J0IHsgcHVzaE9wIH0gZnJvbSBcIi4vcHVzaE9wXCJcclxuaW1wb3J0IHtcclxuICBkZWVwQ2xvbmUsXHJcbiAgZW5zdXJlU2hhbGxvd0NvcHksXHJcbiAgZ2V0LFxyXG4gIGdldERlc2NyaXB0b3IsXHJcbiAgZ2V0UGF0aE9yVGhyb3csXHJcbiAgZ2V0UHJveHlEcmFmdCxcclxuICBnZXRUeXBlLFxyXG4gIGdldFZhbHVlLFxyXG4gIGhhbmRsZVZhbHVlLFxyXG4gIGhhcyxcclxuICBpc0RyYWZ0LFxyXG4gIGlzRHJhZnRhYmxlLFxyXG4gIGlzRXF1YWwsXHJcbiAgbGF0ZXN0LFxyXG4gIG1hcmtDaGFuZ2VkLFxyXG4gIHBlZWssXHJcbiAgcmV2b2tlUHJveHksXHJcbiAgc2V0LFxyXG59IGZyb20gXCIuL3V0aWxzXCJcclxuXHJcbi8vIE5vdGU6IGdldFZhbHVlIGlzIHVzZWQgaW4gZmluYWxpemVEcmFmdCwgZGVlcENsb25lIHVzZXMgaXQgaW50ZXJuYWxseSBmb3IgZHJhZnRzXHJcblxyXG4vKipcclxuICogSW5jcmVtZW50IGFsaWFzQ291bnQgZm9yIGEgZHJhZnQgKGlmIHRoZSB2YWx1ZSBpcyBhIGRyYWZ0KS5cclxuICovXHJcbmZ1bmN0aW9uIGluY0FsaWFzQ291bnQodmFsdWU6IHVua25vd24pOiB2b2lkIHtcclxuICBjb25zdCBkcmFmdCA9IGdldFByb3h5RHJhZnQodmFsdWUpXHJcbiAgaWYgKGRyYWZ0KSBkcmFmdC5hbGlhc0NvdW50KytcclxufVxyXG5cclxuLyoqXHJcbiAqIERlY3JlbWVudCBhbGlhc0NvdW50IGZvciBhIGRyYWZ0IChpZiB0aGUgdmFsdWUgaXMgYSBkcmFmdCkuXHJcbiAqL1xyXG5mdW5jdGlvbiBkZWNBbGlhc0NvdW50KHZhbHVlOiB1bmtub3duKTogdm9pZCB7XHJcbiAgY29uc3QgZHJhZnQgPSBnZXRQcm94eURyYWZ0KHZhbHVlKVxyXG4gIGlmIChkcmFmdCkgZHJhZnQuYWxpYXNDb3VudC0tXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBOb3JtYWxpemUgYW4gYXJyYXkgaW5kZXggbGlrZSBuYXRpdmUgYXJyYXkgbWV0aG9kcyBkby5cclxuICogSGFuZGxlcyBuZWdhdGl2ZSBpbmRpY2VzIGFuZCBjbGFtcHMgdG8gWzAsIGxlbl0uXHJcbiAqIEBwYXJhbSBpbmRleCAtIFRoZSBpbmRleCB0byBub3JtYWxpemUgKGNhbiBiZSBuZWdhdGl2ZSBvciB1bmRlZmluZWQpXHJcbiAqIEBwYXJhbSBsZW4gLSBUaGUgYXJyYXkgbGVuZ3RoXHJcbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgLSBWYWx1ZSB0byB1c2UgaWYgaW5kZXggaXMgdW5kZWZpbmVkICh0eXBpY2FsbHkgMCBvciBsZW4pXHJcbiAqL1xyXG5mdW5jdGlvbiBub3JtYWxpemVJbmRleChpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkLCBsZW46IG51bWJlciwgZGVmYXVsdFZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xyXG4gIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZGVmYXVsdFZhbHVlXHJcbiAgcmV0dXJuIGluZGV4IDwgMCA/IE1hdGgubWF4KGxlbiArIGluZGV4LCAwKSA6IE1hdGgubWluKGluZGV4LCBsZW4pXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcnJheSBtZXRob2RzIHRoYXQgbXV0YXRlIHRoZSBhcnJheSBhbmQgbmVlZCB0byBiZSBpbnRlcmNlcHRlZCBmb3IgZWFnZXIgb3AgbG9nZ2luZy5cclxuICovXHJcbmNvbnN0IE1VVEFUSU5HX0FSUkFZX01FVEhPRFMgPSBuZXcgU2V0KFtcclxuICBcInB1c2hcIixcclxuICBcInBvcFwiLFxyXG4gIFwic2hpZnRcIixcclxuICBcInVuc2hpZnRcIixcclxuICBcInNwbGljZVwiLFxyXG4gIFwic29ydFwiLFxyXG4gIFwicmV2ZXJzZVwiLFxyXG4gIFwiZmlsbFwiLFxyXG4gIFwiY29weVdpdGhpblwiLFxyXG5dKVxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBhIHdyYXBwZWQgYXJyYXkgbWV0aG9kIHRoYXQgbG9ncyBvcHMgZWFnZXJseS5cclxuICogQHBhcmFtIHByb3h5RHJhZnQgLSBUaGUgUHJveHlEcmFmdCBmb3IgdGhlIGFycmF5ICh1c2VkIGZvciBvcHMgYW5kIHN0YXRlKVxyXG4gKiBAcGFyYW0gcHJveHlSZWYgLSBUaGUgYWN0dWFsIHByb3h5ICh1c2VkIHRvIGFjY2VzcyBlbGVtZW50cyBhcyBkcmFmdHMpXHJcbiAqIEBwYXJhbSBtZXRob2QgLSBUaGUgbWV0aG9kIG5hbWUgYmVpbmcgd3JhcHBlZFxyXG4gKi9cclxuZnVuY3Rpb24gY3JlYXRlQXJyYXlNZXRob2RXcmFwcGVyKFxyXG4gIHByb3h5RHJhZnQ6IFByb3h5RHJhZnQsXHJcbiAgcHJveHlSZWY6IHVua25vd24sXHJcbiAgbWV0aG9kOiBzdHJpbmdcclxuKTogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93biB7XHJcbiAgcmV0dXJuIGZ1bmN0aW9uICh0aGlzOiB1bmtub3duW10sIC4uLmFyZ3M6IHVua25vd25bXSk6IHVua25vd24ge1xyXG4gICAgZW5zdXJlU2hhbGxvd0NvcHkocHJveHlEcmFmdClcclxuICAgIG1hcmtDaGFuZ2VkKHByb3h5RHJhZnQpXHJcblxyXG4gICAgY29uc3QgYXJyID0gcHJveHlEcmFmdC5jb3B5IGFzIHVua25vd25bXVxyXG4gICAgY29uc3Qgb3JpZ2luYWxMZW5ndGggPSBhcnIubGVuZ3RoXHJcbiAgICBjb25zdCBwcm94eSA9IHByb3h5UmVmIGFzIHVua25vd25bXVxyXG5cclxuICAgIHN3aXRjaCAobWV0aG9kKSB7XHJcbiAgICAgIGNhc2UgXCJwdXNoXCI6IHtcclxuICAgICAgICAvLyBwdXNoKGl0ZW1zLi4uKSAtPiBzcGxpY2UgYXQgZW5kXHJcbiAgICAgICAgLy8gVHJhY2sgYWxpYXNDb3VudCBmb3IgZHJhZnRzIGJlaW5nIGluc2VydGVkXHJcbiAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xyXG4gICAgICAgICAgaW5jQWxpYXNDb3VudChhcmcpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFN0b3JlIHJhdyB2YWx1ZXMgaW4gYXJyYXkgKHByZXNlcnZpbmcgYWxpYXNpbmcgaW4gdGhlIGRyYWZ0KVxyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGFyci5wdXNoKC4uLmFyZ3MpXHJcbiAgICAgICAgLy8gQ2xvbmUgZm9yIHRoZSBvcCAoY2FwdHVyZSB2YWx1ZSBhdCB0aGlzIG1vbWVudClcclxuICAgICAgICBwdXNoT3AocHJveHlEcmFmdCwge1xyXG4gICAgICAgICAga2luZDogXCJzcGxpY2VcIixcclxuICAgICAgICAgIHBhdGg6IGdldFBhdGhPclRocm93KHByb3h5RHJhZnQpLFxyXG4gICAgICAgICAgaW5kZXg6IG9yaWdpbmFsTGVuZ3RoLFxyXG4gICAgICAgICAgZGVsZXRlQ291bnQ6IDAsXHJcbiAgICAgICAgICBpbnNlcnRzOiBhcmdzLm1hcChkZWVwQ2xvbmUpIGFzIEpTT05WYWx1ZVtdLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdFxyXG4gICAgICB9XHJcblxyXG4gICAgICBjYXNlIFwicG9wXCI6IHtcclxuICAgICAgICBpZiAob3JpZ2luYWxMZW5ndGggPT09IDApIHtcclxuICAgICAgICAgIHJldHVybiBhcnIucG9wKClcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gR2V0IHRoZSBlbGVtZW50IHRocm91Z2ggdGhlIHByb3h5IHRvIGVuc3VyZSBpdCdzIGEgZHJhZnQgaWYgZHJhZnRhYmxlXHJcbiAgICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSBwcm94eVtvcmlnaW5hbExlbmd0aCAtIDFdXHJcbiAgICAgICAgLy8gVHJhY2sgYWxpYXNDb3VudCBmb3IgZHJhZnQgYmVpbmcgcmVtb3ZlZFxyXG4gICAgICAgIGRlY0FsaWFzQ291bnQoYXJyW29yaWdpbmFsTGVuZ3RoIC0gMV0pXHJcbiAgICAgICAgLy8gTm93IHBlcmZvcm0gdGhlIGFjdHVhbCBtdXRhdGlvblxyXG4gICAgICAgIGFyci5wb3AoKVxyXG4gICAgICAgIHB1c2hPcChwcm94eURyYWZ0LCB7XHJcbiAgICAgICAgICBraW5kOiBcInNwbGljZVwiLFxyXG4gICAgICAgICAgcGF0aDogZ2V0UGF0aE9yVGhyb3cocHJveHlEcmFmdCksXHJcbiAgICAgICAgICBpbmRleDogb3JpZ2luYWxMZW5ndGggLSAxLFxyXG4gICAgICAgICAgZGVsZXRlQ291bnQ6IDEsXHJcbiAgICAgICAgICBpbnNlcnRzOiBbXSxcclxuICAgICAgICB9KVxyXG4gICAgICAgIHJldHVybiByZXR1cm5WYWx1ZVxyXG4gICAgICB9XHJcblxyXG4gICAgICBjYXNlIFwic2hpZnRcIjoge1xyXG4gICAgICAgIGlmIChvcmlnaW5hbExlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgcmV0dXJuIGFyci5zaGlmdCgpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEdldCB0aGUgZWxlbWVudCB0aHJvdWdoIHRoZSBwcm94eSB0byBlbnN1cmUgaXQncyBhIGRyYWZ0IGlmIGRyYWZ0YWJsZVxyXG4gICAgICAgIGNvbnN0IHJldHVyblZhbHVlID0gcHJveHlbMF1cclxuICAgICAgICAvLyBUcmFjayBhbGlhc0NvdW50IGZvciBkcmFmdCBiZWluZyByZW1vdmVkXHJcbiAgICAgICAgZGVjQWxpYXNDb3VudChhcnJbMF0pXHJcbiAgICAgICAgLy8gTm93IHBlcmZvcm0gdGhlIGFjdHVhbCBtdXRhdGlvblxyXG4gICAgICAgIGFyci5zaGlmdCgpXHJcbiAgICAgICAgcHVzaE9wKHByb3h5RHJhZnQsIHtcclxuICAgICAgICAgIGtpbmQ6IFwic3BsaWNlXCIsXHJcbiAgICAgICAgICBwYXRoOiBnZXRQYXRoT3JUaHJvdyhwcm94eURyYWZ0KSxcclxuICAgICAgICAgIGluZGV4OiAwLFxyXG4gICAgICAgICAgZGVsZXRlQ291bnQ6IDEsXHJcbiAgICAgICAgICBpbnNlcnRzOiBbXSxcclxuICAgICAgICB9KVxyXG4gICAgICAgIHJldHVybiByZXR1cm5WYWx1ZVxyXG4gICAgICB9XHJcblxyXG4gICAgICBjYXNlIFwidW5zaGlmdFwiOiB7XHJcbiAgICAgICAgLy8gVHJhY2sgYWxpYXNDb3VudCBmb3IgZHJhZnRzIGJlaW5nIGluc2VydGVkXHJcbiAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xyXG4gICAgICAgICAgaW5jQWxpYXNDb3VudChhcmcpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFN0b3JlIHJhdyB2YWx1ZXMgaW4gYXJyYXkgKHByZXNlcnZpbmcgYWxpYXNpbmcgaW4gdGhlIGRyYWZ0KVxyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGFyci51bnNoaWZ0KC4uLmFyZ3MpXHJcbiAgICAgICAgLy8gQ2xvbmUgZm9yIHRoZSBvcCAoY2FwdHVyZSB2YWx1ZSBhdCB0aGlzIG1vbWVudClcclxuICAgICAgICBwdXNoT3AocHJveHlEcmFmdCwge1xyXG4gICAgICAgICAga2luZDogXCJzcGxpY2VcIixcclxuICAgICAgICAgIHBhdGg6IGdldFBhdGhPclRocm93KHByb3h5RHJhZnQpLFxyXG4gICAgICAgICAgaW5kZXg6IDAsXHJcbiAgICAgICAgICBkZWxldGVDb3VudDogMCxcclxuICAgICAgICAgIGluc2VydHM6IGFyZ3MubWFwKGRlZXBDbG9uZSkgYXMgSlNPTlZhbHVlW10sXHJcbiAgICAgICAgfSlcclxuICAgICAgICByZXR1cm4gcmVzdWx0XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNhc2UgXCJzcGxpY2VcIjoge1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gYXJnc1swXSBhcyBudW1iZXIgfCB1bmRlZmluZWRcclxuICAgICAgICBjb25zdCBkZWxldGVDb3VudEFyZyA9IGFyZ3NbMV0gYXMgbnVtYmVyIHwgdW5kZWZpbmVkXHJcbiAgICAgICAgY29uc3QgaW5zZXJ0cyA9IGFyZ3Muc2xpY2UoMilcclxuXHJcbiAgICAgICAgLy8gTm9ybWFsaXplIHN0YXJ0IGluZGV4IHRvIGdldCBlbGVtZW50cyB0aHJvdWdoIHByb3h5XHJcbiAgICAgICAgY29uc3QgaW5kZXggPVxyXG4gICAgICAgICAgc3RhcnQgPT09IHVuZGVmaW5lZCA/IDAgOiBzdGFydCA8IDAgPyBNYXRoLm1heChvcmlnaW5hbExlbmd0aCArIHN0YXJ0LCAwKSA6IHN0YXJ0XHJcbiAgICAgICAgY29uc3QgZGVsZXRlQ291bnQgPSBkZWxldGVDb3VudEFyZyA/PyBvcmlnaW5hbExlbmd0aCAtIGluZGV4XHJcblxyXG4gICAgICAgIC8vIEdldCBlbGVtZW50cyB0aHJvdWdoIHByb3h5IHRvIGVuc3VyZSB0aGV5J3JlIGRyYWZ0cyBpZiBkcmFmdGFibGVcclxuICAgICAgICBjb25zdCByZXR1cm5WYWx1ZXM6IHVua25vd25bXSA9IFtdXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZWxldGVDb3VudCAmJiBpbmRleCArIGkgPCBvcmlnaW5hbExlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICByZXR1cm5WYWx1ZXMucHVzaChwcm94eVtpbmRleCArIGldKVxyXG4gICAgICAgICAgLy8gVHJhY2sgYWxpYXNDb3VudCBmb3IgZHJhZnRzIGJlaW5nIHJlbW92ZWRcclxuICAgICAgICAgIGRlY0FsaWFzQ291bnQoYXJyW2luZGV4ICsgaV0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBUcmFjayBhbGlhc0NvdW50IGZvciBkcmFmdHMgYmVpbmcgaW5zZXJ0ZWRcclxuICAgICAgICBmb3IgKGNvbnN0IGluc2VydCBvZiBpbnNlcnRzKSB7XHJcbiAgICAgICAgICBpbmNBbGlhc0NvdW50KGluc2VydClcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gU3RvcmUgcmF3IHZhbHVlcyBpbiBhcnJheSAocHJlc2VydmluZyBhbGlhc2luZyBpbiB0aGUgZHJhZnQpXHJcbiAgICAgICAgOyhhcnIuc3BsaWNlIGFzICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd25bXSkoLi4uYXJncylcclxuXHJcbiAgICAgICAgLy8gQ2xvbmUgZm9yIHRoZSBvcCAoY2FwdHVyZSB2YWx1ZSBhdCB0aGlzIG1vbWVudClcclxuICAgICAgICBwdXNoT3AocHJveHlEcmFmdCwge1xyXG4gICAgICAgICAga2luZDogXCJzcGxpY2VcIixcclxuICAgICAgICAgIHBhdGg6IGdldFBhdGhPclRocm93KHByb3h5RHJhZnQpLFxyXG4gICAgICAgICAgaW5kZXg6IHN0YXJ0ID8/IDAsXHJcbiAgICAgICAgICBkZWxldGVDb3VudDogZGVsZXRlQ291bnRBcmcgPz8gb3JpZ2luYWxMZW5ndGgsXHJcbiAgICAgICAgICBpbnNlcnRzOiBpbnNlcnRzLm1hcChkZWVwQ2xvbmUpIGFzIEpTT05WYWx1ZVtdLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlc1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjYXNlIFwiZmlsbFwiOiB7XHJcbiAgICAgICAgY29uc3QgZmlsbFZhbHVlID0gYXJnc1swXVxyXG4gICAgICAgIGNvbnN0IHN0YXJ0QXJnID0gYXJnc1sxXSBhcyBudW1iZXIgfCB1bmRlZmluZWRcclxuICAgICAgICBjb25zdCBlbmRBcmcgPSBhcmdzWzJdIGFzIG51bWJlciB8IHVuZGVmaW5lZFxyXG5cclxuICAgICAgICBjb25zdCBsZW4gPSBvcmlnaW5hbExlbmd0aFxyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbm9ybWFsaXplSW5kZXgoc3RhcnRBcmcsIGxlbiwgMClcclxuICAgICAgICBjb25zdCBlbmQgPSBub3JtYWxpemVJbmRleChlbmRBcmcsIGxlbiwgbGVuKVxyXG5cclxuICAgICAgICAvLyBVc2UgcHJveHkgc3BsaWNlIHRvIHJlcGxhY2UgdGhlIHJhbmdlIChoYW5kbGVzIGFsaWFzQ291bnQgYW5kIGdlbmVyYXRlcyBzcGxpY2Ugb3ApXHJcbiAgICAgICAgY29uc3QgZmlsbENvdW50ID0gZW5kIC0gc3RhcnRcclxuICAgICAgICBpZiAoZmlsbENvdW50ID4gMCkge1xyXG4gICAgICAgICAgY29uc3QgZmlsbFZhbHVlcyA9IEFycmF5KGZpbGxDb3VudCkuZmlsbChmaWxsVmFsdWUpXHJcbiAgICAgICAgICBwcm94eS5zcGxpY2Uoc3RhcnQsIGZpbGxDb3VudCwgLi4uZmlsbFZhbHVlcylcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBwcm94eVxyXG4gICAgICB9XHJcblxyXG4gICAgICBjYXNlIFwic29ydFwiOiB7XHJcbiAgICAgICAgY29uc3QgY29tcGFyZUZuID0gYXJnc1swXSBhcyAoKGE6IHVua25vd24sIGI6IHVua25vd24pID0+IG51bWJlcikgfCB1bmRlZmluZWRcclxuICAgICAgICAvLyBTb3J0IGEgY29weSB0byBnZXQgdGhlIHNvcnRlZCBvcmRlciwgdGhlbiB1c2UgcHJveHkgc3BsaWNlXHJcbiAgICAgICAgY29uc3Qgc29ydGVkID0gWy4uLmFycl0uc29ydChjb21wYXJlRm4pXHJcbiAgICAgICAgaWYgKG9yaWdpbmFsTGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgcHJveHkuc3BsaWNlKDAsIG9yaWdpbmFsTGVuZ3RoLCAuLi5zb3J0ZWQpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwcm94eVxyXG4gICAgICB9XHJcblxyXG4gICAgICBjYXNlIFwicmV2ZXJzZVwiOiB7XHJcbiAgICAgICAgLy8gUmV2ZXJzZSBhIGNvcHkgdG8gZ2V0IHRoZSByZXZlcnNlZCBvcmRlciwgdGhlbiB1c2UgcHJveHkgc3BsaWNlXHJcbiAgICAgICAgY29uc3QgcmV2ZXJzZWQgPSBbLi4uYXJyXS5yZXZlcnNlKClcclxuICAgICAgICBpZiAob3JpZ2luYWxMZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBwcm94eS5zcGxpY2UoMCwgb3JpZ2luYWxMZW5ndGgsIC4uLnJldmVyc2VkKVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcHJveHlcclxuICAgICAgfVxyXG5cclxuICAgICAgY2FzZSBcImNvcHlXaXRoaW5cIjoge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldEFyZyA9IGFyZ3NbMF0gYXMgbnVtYmVyXHJcbiAgICAgICAgY29uc3Qgc3RhcnRBcmcgPSBhcmdzWzFdIGFzIG51bWJlciB8IHVuZGVmaW5lZFxyXG4gICAgICAgIGNvbnN0IGVuZEFyZyA9IGFyZ3NbMl0gYXMgbnVtYmVyIHwgdW5kZWZpbmVkXHJcblxyXG4gICAgICAgIGNvbnN0IGxlbiA9IG9yaWdpbmFsTGVuZ3RoXHJcbiAgICAgICAgY29uc3QgdGFyZ2V0SWR4ID0gbm9ybWFsaXplSW5kZXgodGFyZ2V0QXJnLCBsZW4sIDApXHJcbiAgICAgICAgY29uc3Qgc3RhcnRJZHggPSBub3JtYWxpemVJbmRleChzdGFydEFyZywgbGVuLCAwKVxyXG4gICAgICAgIGNvbnN0IGVuZElkeCA9IG5vcm1hbGl6ZUluZGV4KGVuZEFyZywgbGVuLCBsZW4pXHJcblxyXG4gICAgICAgIC8vIENhbGN1bGF0ZSBob3cgbWFueSBlbGVtZW50cyB3aWxsIGJlIGNvcGllZFxyXG4gICAgICAgIGNvbnN0IGNvcHlDb3VudCA9IE1hdGgubWluKGVuZElkeCAtIHN0YXJ0SWR4LCBsZW4gLSB0YXJnZXRJZHgpXHJcblxyXG4gICAgICAgIGlmIChjb3B5Q291bnQgPiAwKSB7XHJcbiAgICAgICAgICAvLyBHZXQgdGhlIGVsZW1lbnRzIHRoYXQgd2lsbCBiZSBjb3BpZWQgKGZyb20gdGhlIHNvdXJjZSByYW5nZSlcclxuICAgICAgICAgIGNvbnN0IGVsZW1lbnRzVG9Db3B5ID0gYXJyLnNsaWNlKHN0YXJ0SWR4LCBzdGFydElkeCArIGNvcHlDb3VudClcclxuICAgICAgICAgIC8vIFVzZSBwcm94eSBzcGxpY2UgdG8gcmVwbGFjZSBqdXN0IHRoZSBhZmZlY3RlZCByYW5nZVxyXG4gICAgICAgICAgcHJveHkuc3BsaWNlKHRhcmdldElkeCwgY29weUNvdW50LCAuLi5lbGVtZW50c1RvQ29weSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBwcm94eVxyXG4gICAgICB9XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiAoYXJyIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bj4pW21ldGhvZF0oLi4uYXJncylcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQcm94eSBoYW5kbGVyIGZvciBkcmFmdHNcclxuICovXHJcbmNvbnN0IHByb3h5SGFuZGxlcjogUHJveHlIYW5kbGVyPFByb3h5RHJhZnQ+ID0ge1xyXG4gIGdldCh0YXJnZXQ6IFByb3h5RHJhZnQsIGtleTogUHJvcGVydHlLZXksIHJlY2VpdmVyOiB1bmtub3duKSB7XHJcbiAgICAvLyBSZXR1cm4gY2FjaGVkIGRyYWZ0IGlmIGF2YWlsYWJsZVxyXG4gICAgY29uc3QgY29weSA9IHRhcmdldC5jb3B5Py5ba2V5IGFzIGtleW9mIHR5cGVvZiB0YXJnZXQuY29weV1cclxuICAgIGlmIChjb3B5ICYmIHRhcmdldC5maW5hbGl0aWVzLmRyYWZ0c0NhY2hlLmhhcyhjb3B5IGFzIG9iamVjdCkpIHtcclxuICAgICAgcmV0dXJuIGNvcHlcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXR1cm4gdGhlIFByb3h5RHJhZnQgaXRzZWxmIHdoZW4gYWNjZXNzaW5nIHRoZSBzeW1ib2xcclxuICAgIGlmIChrZXkgPT09IFBST1hZX0RSQUZUKSByZXR1cm4gdGFyZ2V0XHJcblxyXG4gICAgY29uc3Qgc291cmNlID0gbGF0ZXN0KHRhcmdldClcclxuXHJcbiAgICAvLyBJbnRlcmNlcHQgbXV0YXRpbmcgYXJyYXkgbWV0aG9kcyBmb3IgZWFnZXIgb3AgbG9nZ2luZ1xyXG4gICAgaWYgKFxyXG4gICAgICB0YXJnZXQudHlwZSA9PT0gRHJhZnRUeXBlLkFycmF5ICYmXHJcbiAgICAgIHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIgJiZcclxuICAgICAgTVVUQVRJTkdfQVJSQVlfTUVUSE9EUy5oYXMoa2V5KVxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gKHNvdXJjZSBhcyB1bmtub3duW10pW2tleSBhcyBrZXlvZiB1bmtub3duW11dXHJcbiAgICAgIGlmICh0eXBlb2Ygb3JpZ2luYWxNZXRob2QgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgIHJldHVybiBjcmVhdGVBcnJheU1ldGhvZFdyYXBwZXIodGFyZ2V0LCByZWNlaXZlciwga2V5KVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUHJvcGVydHkgZG9lc24ndCBleGlzdCAtIGNoZWNrIHByb3RvdHlwZSBjaGFpblxyXG4gICAgaWYgKCFoYXMoc291cmNlLCBrZXkpKSB7XHJcbiAgICAgIGNvbnN0IGRlc2MgPSBnZXREZXNjcmlwdG9yKHNvdXJjZSwga2V5KVxyXG4gICAgICByZXR1cm4gZGVzYyA/IChcInZhbHVlXCIgaW4gZGVzYyA/IGRlc2MudmFsdWUgOiBkZXNjLmdldD8uY2FsbCh0YXJnZXQucHJveHkpKSA6IHVuZGVmaW5lZFxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHZhbHVlID0gKHNvdXJjZSBhcyBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+KVtrZXldXHJcblxyXG4gICAgLy8gQWxyZWFkeSBmaW5hbGl6ZWQgb3Igbm90IGRyYWZ0YWJsZSAtIHJldHVybiBhcy1pc1xyXG4gICAgaWYgKHRhcmdldC5maW5hbGl6ZWQgfHwgIWlzRHJhZnRhYmxlKHZhbHVlKSkge1xyXG4gICAgICByZXR1cm4gdmFsdWVcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiB2YWx1ZSBpcyBzYW1lIGFzIG9yaWdpbmFsLCBjcmVhdGUgYSBuZXN0ZWQgZHJhZnRcclxuICAgIGlmICh2YWx1ZSA9PT0gcGVlayh0YXJnZXQub3JpZ2luYWwsIGtleSkpIHtcclxuICAgICAgZW5zdXJlU2hhbGxvd0NvcHkodGFyZ2V0KVxyXG4gICAgICBjb25zdCBuZXN0ZWRLZXkgPSB0YXJnZXQudHlwZSA9PT0gRHJhZnRUeXBlLkFycmF5ID8gTnVtYmVyKGtleSkgOiBrZXlcclxuICAgICAgOyh0YXJnZXQuY29weSBhcyBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+KVtrZXldID0gY3JlYXRlRHJhZnQoe1xyXG4gICAgICAgIG9yaWdpbmFsOiAodGFyZ2V0Lm9yaWdpbmFsIGFzIFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj4pW2tleV0gYXMgb2JqZWN0LFxyXG4gICAgICAgIHBhcmVudERyYWZ0OiB0YXJnZXQsXHJcbiAgICAgICAga2V5OiBuZXN0ZWRLZXkgYXMgc3RyaW5nIHwgbnVtYmVyLFxyXG4gICAgICAgIGZpbmFsaXRpZXM6IHRhcmdldC5maW5hbGl0aWVzLFxyXG4gICAgICB9KVxyXG4gICAgICByZXR1cm4gKHRhcmdldC5jb3B5IGFzIFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj4pW2tleV1cclxuICAgIH1cclxuXHJcbiAgICAvLyBDYWNoZSBkcmFmdHMgdGhhdCB3ZXJlIGFzc2lnbmVkXHJcbiAgICBpZiAoaXNEcmFmdCh2YWx1ZSkpIHtcclxuICAgICAgdGFyZ2V0LmZpbmFsaXRpZXMuZHJhZnRzQ2FjaGUuYWRkKHZhbHVlIGFzIG9iamVjdClcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdmFsdWVcclxuICB9LFxyXG5cclxuICBzZXQodGFyZ2V0OiBQcm94eURyYWZ0LCBrZXk6IFByb3BlcnR5S2V5LCB2YWx1ZTogdW5rbm93bikge1xyXG4gICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgc2V0IHN5bWJvbCBwcm9wZXJ0aWVzIG9uIGRyYWZ0c2ApXHJcbiAgICB9XHJcblxyXG4gICAgLy8gRm9yIGFycmF5cywgY29udmVydCBhbmQgdmFsaWRhdGUgdGhlIGtleVxyXG4gICAgbGV0IG9wS2V5OiBzdHJpbmcgfCBudW1iZXIgPSBrZXkgYXMgc3RyaW5nIHwgbnVtYmVyXHJcbiAgICBpZiAodGFyZ2V0LnR5cGUgPT09IERyYWZ0VHlwZS5BcnJheSkge1xyXG4gICAgICBpZiAoa2V5ID09PSBcImxlbmd0aFwiKSB7XHJcbiAgICAgICAgb3BLZXkgPSBcImxlbmd0aFwiXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgbnVtS2V5ID0gdHlwZW9mIGtleSA9PT0gXCJudW1iZXJcIiA/IGtleSA6IHBhcnNlQXJyYXlJbmRleChrZXkgYXMgc3RyaW5nKVxyXG4gICAgICAgIGlmIChudW1LZXkgPT09IG51bGwpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgT25seSBzdXBwb3J0cyBzZXR0aW5nIGFycmF5IGluZGljZXMgYW5kIHRoZSAnbGVuZ3RoJyBwcm9wZXJ0eS5gKVxyXG4gICAgICAgIH1cclxuICAgICAgICBvcEtleSA9IG51bUtleVxyXG5cclxuICAgICAgICAvLyBDaGVjayBmb3Igc3BhcnNlIGFycmF5IGNyZWF0aW9uXHJcbiAgICAgICAgY29uc3Qgc291cmNlID0gbGF0ZXN0KHRhcmdldCkgYXMgdW5rbm93bltdXHJcbiAgICAgICAgaWYgKG51bUtleSA+IHNvdXJjZS5sZW5ndGgpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgICAgYENhbm5vdCBjcmVhdGUgc3BhcnNlIGFycmF5LiBJbmRleCAke251bUtleX0gaXMgb3V0IG9mIGJvdW5kcyBmb3IgYXJyYXkgb2YgbGVuZ3RoICR7c291cmNlLmxlbmd0aH0uYFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEhhbmRsZSBzZXR0ZXIgZnJvbSBwcm90b3R5cGVcclxuICAgIGNvbnN0IGRlc2MgPSBnZXREZXNjcmlwdG9yKGxhdGVzdCh0YXJnZXQpLCBrZXkpXHJcbiAgICBpZiAoZGVzYz8uc2V0KSB7XHJcbiAgICAgIGRlc2Muc2V0LmNhbGwodGFyZ2V0LnByb3h5LCB2YWx1ZSlcclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjdXJyZW50ID0gcGVlayhsYXRlc3QodGFyZ2V0KSwga2V5KVxyXG4gICAgY29uc3QgY3VycmVudFByb3h5RHJhZnQgPSBnZXRQcm94eURyYWZ0KGN1cnJlbnQpXHJcblxyXG4gICAgLy8gSWYgYXNzaWduaW5nIG9yaWdpbmFsIGRyYWZ0YWJsZSB2YWx1ZSBiYWNrIHRvIGl0cyBkcmFmdCwganVzdCBtYXJrIGFzIG5vdCBhc3NpZ25lZFxyXG4gICAgaWYgKGN1cnJlbnRQcm94eURyYWZ0ICYmIGlzRXF1YWwoY3VycmVudFByb3h5RHJhZnQub3JpZ2luYWwsIHZhbHVlKSkge1xyXG4gICAgICA7KHRhcmdldC5jb3B5IGFzIFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj4pW2tleV0gPSB2YWx1ZVxyXG4gICAgICB0YXJnZXQuYXNzaWduZWRNYXAgPSB0YXJnZXQuYXNzaWduZWRNYXAgPz8gbmV3IE1hcCgpXHJcbiAgICAgIHRhcmdldC5hc3NpZ25lZE1hcC5zZXQoa2V5LCBmYWxzZSlcclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuXHJcbiAgICAvLyBObyBjaGFuZ2UgLSBza2lwXHJcbiAgICBpZiAoaXNFcXVhbCh2YWx1ZSwgY3VycmVudCkgJiYgKHZhbHVlICE9PSB1bmRlZmluZWQgfHwgaGFzKHRhcmdldC5vcmlnaW5hbCwga2V5KSkpIHtcclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuXHJcbiAgICBlbnN1cmVTaGFsbG93Q29weSh0YXJnZXQpXHJcbiAgICBtYXJrQ2hhbmdlZCh0YXJnZXQpXHJcblxyXG4gICAgLy8gVHJhY2sgYXNzaWdubWVudCAoc3RpbGwgbmVlZGVkIGZvciBmaW5hbGl6YXRpb24gdG8ga25vdyB3aGF0IGNoYW5nZWQpXHJcbiAgICBpZiAoXHJcbiAgICAgIGhhcyh0YXJnZXQub3JpZ2luYWwsIGtleSkgJiZcclxuICAgICAgaXNFcXVhbCh2YWx1ZSwgKHRhcmdldC5vcmlnaW5hbCBhcyBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+KVtrZXldKVxyXG4gICAgKSB7XHJcbiAgICAgIC8vIFJldmVydGluZyB0byBvcmlnaW5hbCB2YWx1ZSAtIHN0aWxsIGxvZyB0aGUgb3Agc2luY2Ugd2UncmUgZG9pbmcgZWFnZXIgbG9nZ2luZ1xyXG4gICAgICB0YXJnZXQuYXNzaWduZWRNYXAhLmRlbGV0ZShrZXkpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0YXJnZXQuYXNzaWduZWRNYXAhLnNldChrZXksIHRydWUpXHJcbiAgICB9XHJcblxyXG4gICAgLy8gVHJhY2sgYWxpYXNDb3VudCBhbmQgdXBkYXRlIGNvcHlcclxuICAgIGNvbnN0IGNvcHkgPSB0YXJnZXQuY29weSBhcyBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+XHJcbiAgICBkZWNBbGlhc0NvdW50KGNvcHlba2V5XSlcclxuICAgIGluY0FsaWFzQ291bnQodmFsdWUpXHJcbiAgICBjb3B5W2tleV0gPSB2YWx1ZVxyXG5cclxuICAgIC8vIEVhZ2VyIG9wIGxvZ2dpbmcgZm9yIHNldCBvcGVyYXRpb25zXHJcbiAgICBpZiAodGFyZ2V0LnR5cGUgPT09IERyYWZ0VHlwZS5BcnJheSAmJiBvcEtleSA9PT0gXCJsZW5ndGhcIikge1xyXG4gICAgICBjb25zdCBvbGRMZW5ndGggPSAodGFyZ2V0Lm9yaWdpbmFsIGFzIHVua25vd25bXSkubGVuZ3RoXHJcbiAgICAgIGNvbnN0IG5ld0xlbmd0aCA9IHZhbHVlIGFzIG51bWJlclxyXG4gICAgICBpZiAobmV3TGVuZ3RoICE9PSBvbGRMZW5ndGgpIHtcclxuICAgICAgICAvLyBMZW5ndGggY2hhbmdlIC0gYWx3YXlzIHVzZSBzZXQgb3AgdG8gY2FwdHVyZSBpbnRlbnRcclxuICAgICAgICBwdXNoT3AodGFyZ2V0LCB7XHJcbiAgICAgICAgICBraW5kOiBcInNldFwiLFxyXG4gICAgICAgICAgcGF0aDogZ2V0UGF0aE9yVGhyb3codGFyZ2V0KSxcclxuICAgICAgICAgIGtleTogXCJsZW5ndGhcIixcclxuICAgICAgICAgIHZhbHVlOiBuZXdMZW5ndGgsXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gUmVndWxhciBwcm9wZXJ0eSBzZXQgLSB1c2Ugb3BLZXkgKG51bWVyaWMgZm9yIGFycmF5cylcclxuICAgICAgcHVzaE9wKHRhcmdldCwge1xyXG4gICAgICAgIGtpbmQ6IFwic2V0XCIsXHJcbiAgICAgICAgcGF0aDogZ2V0UGF0aE9yVGhyb3codGFyZ2V0KSxcclxuICAgICAgICBrZXk6IG9wS2V5LFxyXG4gICAgICAgIHZhbHVlOiBkZWVwQ2xvbmUodmFsdWUpIGFzIEpTT05WYWx1ZSxcclxuICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZVxyXG4gIH0sXHJcblxyXG4gIGhhcyh0YXJnZXQ6IFByb3h5RHJhZnQsIGtleTogUHJvcGVydHlLZXkpIHtcclxuICAgIHJldHVybiBrZXkgaW4gbGF0ZXN0KHRhcmdldClcclxuICB9LFxyXG5cclxuICBvd25LZXlzKHRhcmdldDogUHJveHlEcmFmdCkge1xyXG4gICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyhsYXRlc3QodGFyZ2V0KSlcclxuICB9LFxyXG5cclxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0OiBQcm94eURyYWZ0LCBrZXk6IFByb3BlcnR5S2V5KSB7XHJcbiAgICBjb25zdCBzb3VyY2UgPSBsYXRlc3QodGFyZ2V0KVxyXG4gICAgY29uc3QgZGVzY3JpcHRvciA9IFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KVxyXG4gICAgaWYgKCFkZXNjcmlwdG9yKSByZXR1cm4gZGVzY3JpcHRvclxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgd3JpdGFibGU6IHRydWUsXHJcbiAgICAgIGNvbmZpZ3VyYWJsZTogdGFyZ2V0LnR5cGUgIT09IERyYWZ0VHlwZS5BcnJheSB8fCBrZXkgIT09IFwibGVuZ3RoXCIsXHJcbiAgICAgIGVudW1lcmFibGU6IGRlc2NyaXB0b3IuZW51bWVyYWJsZSxcclxuICAgICAgdmFsdWU6IChzb3VyY2UgYXMgUmVjb3JkPFByb3BlcnR5S2V5LCB1bmtub3duPilba2V5XSxcclxuICAgIH1cclxuICB9LFxyXG5cclxuICBnZXRQcm90b3R5cGVPZih0YXJnZXQ6IFByb3h5RHJhZnQpIHtcclxuICAgIHJldHVybiBSZWZsZWN0LmdldFByb3RvdHlwZU9mKHRhcmdldC5vcmlnaW5hbCBhcyBvYmplY3QpXHJcbiAgfSxcclxuXHJcbiAgc2V0UHJvdG90eXBlT2YoKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjYWxsICdzZXRQcm90b3R5cGVPZigpJyBvbiBkcmFmdHNgKVxyXG4gIH0sXHJcblxyXG4gIGRlZmluZVByb3BlcnR5KCkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY2FsbCAnZGVmaW5lUHJvcGVydHkoKScgb24gZHJhZnRzYClcclxuICB9LFxyXG5cclxuICBkZWxldGVQcm9wZXJ0eSh0YXJnZXQ6IFByb3h5RHJhZnQsIGtleTogUHJvcGVydHlLZXkpIHtcclxuICAgIGlmICh0eXBlb2Yga2V5ID09PSBcInN5bWJvbFwiKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGRlbGV0ZSBzeW1ib2wgcHJvcGVydGllcyBmcm9tIGRyYWZ0c2ApXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRhcmdldC50eXBlID09PSBEcmFmdFR5cGUuQXJyYXkpIHtcclxuICAgICAgLy8gRm9yIGFycmF5cywgZGVsZXRpbmcgYSBwcm9wZXJ0eSBzZXRzIGl0IHRvIHVuZGVmaW5lZFxyXG4gICAgICByZXR1cm4gcHJveHlIYW5kbGVyLnNldCEuY2FsbCh0aGlzLCB0YXJnZXQsIGtleSBhcyBzdHJpbmcgfCBzeW1ib2wsIHVuZGVmaW5lZCwgdGFyZ2V0LnByb3h5KVxyXG4gICAgfVxyXG5cclxuICAgIC8vIENoZWNrIGlmIHByb3BlcnR5IGV4aXN0cyBhbmQgZ2V0IGl0cyBjdXJyZW50IHZhbHVlXHJcbiAgICBjb25zdCBjdXJyZW50ID0gcGVlayhsYXRlc3QodGFyZ2V0KSwga2V5KVxyXG4gICAgY29uc3QgZXhpc3RlZCA9IGN1cnJlbnQgIT09IHVuZGVmaW5lZCB8fCBrZXkgaW4gKHRhcmdldC5vcmlnaW5hbCBhcyBvYmplY3QpXHJcblxyXG4gICAgLy8gRm9yIG9iamVjdHMsIHRyYWNrIGRlbGV0aW9uXHJcbiAgICBpZiAoZXhpc3RlZCkge1xyXG4gICAgICBlbnN1cmVTaGFsbG93Q29weSh0YXJnZXQpXHJcbiAgICAgIG1hcmtDaGFuZ2VkKHRhcmdldClcclxuICAgICAgdGFyZ2V0LmFzc2lnbmVkTWFwIS5zZXQoa2V5LCBmYWxzZSlcclxuXHJcbiAgICAgIC8vIEVhZ2VyIG9wIGxvZ2dpbmcgZm9yIGRlbGV0ZVxyXG4gICAgICBwdXNoT3AodGFyZ2V0LCB7XHJcbiAgICAgICAga2luZDogXCJkZWxldGVcIixcclxuICAgICAgICBwYXRoOiBnZXRQYXRoT3JUaHJvdyh0YXJnZXQpLFxyXG4gICAgICAgIGtleToga2V5LFxyXG4gICAgICB9KVxyXG5cclxuICAgICAgLy8gVHJhY2sgYWxpYXNDb3VudCBhbmQgZGVsZXRlIGZyb20gY29weVxyXG4gICAgICBjb25zdCBjb3B5ID0gdGFyZ2V0LmNvcHkgYXMgUmVjb3JkPFByb3BlcnR5S2V5LCB1bmtub3duPlxyXG4gICAgICBkZWNBbGlhc0NvdW50KGNvcHlba2V5XSlcclxuICAgICAgZGVsZXRlIGNvcHlba2V5XVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGFyZ2V0LmFzc2lnbmVkTWFwID0gdGFyZ2V0LmFzc2lnbmVkTWFwID8/IG5ldyBNYXAoKVxyXG4gICAgICB0YXJnZXQuYXNzaWduZWRNYXAuZGVsZXRlKGtleSlcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlXHJcbiAgfSxcclxufVxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBhIGRyYWZ0IHByb3h5IGZvciBhIHZhbHVlXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRHJhZnQ8VCBleHRlbmRzIG9iamVjdD4ob3B0aW9uczoge1xyXG4gIG9yaWdpbmFsOiBUXHJcbiAgcGFyZW50RHJhZnQ/OiBQcm94eURyYWZ0IHwgbnVsbFxyXG4gIGtleT86IHN0cmluZyB8IG51bWJlclxyXG4gIGZpbmFsaXRpZXM6IEZpbmFsaXRpZXNcclxufSk6IFQge1xyXG4gIGNvbnN0IHsgb3JpZ2luYWwsIHBhcmVudERyYWZ0LCBrZXksIGZpbmFsaXRpZXMgfSA9IG9wdGlvbnNcclxuICBjb25zdCB0eXBlID0gZ2V0VHlwZShvcmlnaW5hbClcclxuXHJcbiAgY29uc3QgcHJveHlEcmFmdDogUHJveHlEcmFmdDxUPiA9IHtcclxuICAgIHR5cGUsXHJcbiAgICBmaW5hbGl6ZWQ6IGZhbHNlLFxyXG4gICAgcGFyZW50OiBwYXJlbnREcmFmdCA/PyBudWxsLFxyXG4gICAgb3JpZ2luYWwsXHJcbiAgICBjb3B5OiBudWxsLFxyXG4gICAgcHJveHk6IG51bGwsXHJcbiAgICBmaW5hbGl0aWVzLFxyXG4gICAgYWxpYXNDb3VudDogMSxcclxuICB9XHJcblxyXG4gIC8vIFNldCBrZXkgaWYgcHJvdmlkZWRcclxuICBpZiAoa2V5ICE9PSB1bmRlZmluZWQgfHwgXCJrZXlcIiBpbiBvcHRpb25zKSB7XHJcbiAgICBwcm94eURyYWZ0LmtleSA9IGtleVxyXG4gIH1cclxuXHJcbiAgLy8gQ3JlYXRlIHJldm9jYWJsZSBwcm94eVxyXG4gIGNvbnN0IHsgcHJveHksIHJldm9rZSB9ID0gUHJveHkucmV2b2NhYmxlPFQ+KFxyXG4gICAgKHR5cGUgPT09IERyYWZ0VHlwZS5BcnJheSA/IE9iamVjdC5hc3NpZ24oW10sIHByb3h5RHJhZnQpIDogcHJveHlEcmFmdCkgYXMgVCxcclxuICAgIHByb3h5SGFuZGxlciBhcyBQcm94eUhhbmRsZXI8VD5cclxuICApXHJcblxyXG4gIGZpbmFsaXRpZXMucmV2b2tlLnB1c2gocmV2b2tlKVxyXG4gIHByb3h5RHJhZnQucHJveHkgPSBwcm94eVxyXG5cclxuICAvLyBTZXQgdXAgZmluYWxpemF0aW9uIGNhbGxiYWNrIHRvIHVud3JhcCBjaGlsZCBkcmFmdHMgaW4gcGFyZW50IGNvcHlcclxuICBpZiAocGFyZW50RHJhZnQpIHtcclxuICAgIHBhcmVudERyYWZ0LmZpbmFsaXRpZXMuZHJhZnQucHVzaCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvcHkgPSBwYXJlbnREcmFmdC5jb3B5XHJcbiAgICAgIGlmICghY29weSkgcmV0dXJuXHJcblxyXG4gICAgICBjb25zdCBkcmFmdCA9IGdldChjb3B5IGFzIG9iamVjdCwga2V5ISlcclxuICAgICAgY29uc3QgY2hpbGRQcm94eURyYWZ0ID0gZ2V0UHJveHlEcmFmdChkcmFmdClcclxuXHJcbiAgICAgIGlmIChjaGlsZFByb3h5RHJhZnQpIHtcclxuICAgICAgICAvLyBHZXQgdGhlIHVwZGF0ZWQgdmFsdWVcclxuICAgICAgICBsZXQgdXBkYXRlZFZhbHVlID0gY2hpbGRQcm94eURyYWZ0Lm9yaWdpbmFsXHJcbiAgICAgICAgaWYgKGNoaWxkUHJveHlEcmFmdC5vcGVyYXRlZCkge1xyXG4gICAgICAgICAgdXBkYXRlZFZhbHVlID0gZ2V0VmFsdWUoZHJhZnQgYXMgb2JqZWN0KVxyXG4gICAgICAgIH1cclxuICAgICAgICBjaGlsZFByb3h5RHJhZnQuZmluYWxpemVkID0gdHJ1ZVxyXG4gICAgICAgIHNldChjb3B5IGFzIG9iamVjdCwga2V5ISwgdXBkYXRlZFZhbHVlKVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHByb3h5XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBGaW5hbGl6ZSBhIGRyYWZ0IGFuZCByZXR1cm4gdGhlIHJlc3VsdCB3aXRoIG9wc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZpbmFsaXplRHJhZnQ8VD4ocmVzdWx0OiBULCByZXR1cm5lZFZhbHVlOiBbVF0gfCBbXSk6IFtULCBPcFtdXSB7XHJcbiAgY29uc3QgcHJveHlEcmFmdCA9IGdldFByb3h5RHJhZnQ8VD4ocmVzdWx0KVxyXG4gIGNvbnN0IGhhc1JldHVybmVkVmFsdWUgPSByZXR1cm5lZFZhbHVlLmxlbmd0aCA+IDBcclxuXHJcbiAgLy8gUnVuIGZpbmFsaXphdGlvbiBjYWxsYmFja3MgdG8gdW53cmFwIGNoaWxkIGRyYWZ0c1xyXG4gIGlmIChwcm94eURyYWZ0Py5vcGVyYXRlZCkge1xyXG4gICAgd2hpbGUgKHByb3h5RHJhZnQuZmluYWxpdGllcy5kcmFmdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGZpbmFsaXplID0gcHJveHlEcmFmdC5maW5hbGl0aWVzLmRyYWZ0LnBvcCgpIVxyXG4gICAgICBmaW5hbGl6ZSgpXHJcbiAgICB9XHJcbiAgICBwcm94eURyYWZ0LmZpbmFsaXplZCA9IHRydWVcclxuICB9XHJcblxyXG4gIC8vIERldGVybWluZSBmaW5hbCBzdGF0ZVxyXG4gIGNvbnN0IHN0YXRlID0gaGFzUmV0dXJuZWRWYWx1ZVxyXG4gICAgPyByZXR1cm5lZFZhbHVlWzBdXHJcbiAgICA6IHByb3h5RHJhZnRcclxuICAgICAgPyBwcm94eURyYWZ0Lm9wZXJhdGVkXHJcbiAgICAgICAgPyAocHJveHlEcmFmdC5jb3B5IGFzIFQpXHJcbiAgICAgICAgOiBwcm94eURyYWZ0Lm9yaWdpbmFsXHJcbiAgICAgIDogcmVzdWx0XHJcblxyXG4gIC8vIEhhbmRsZSBhbnkgcmVtYWluaW5nIG5lc3RlZCBkcmFmdHMgaW4gdGhlIHN0YXRlIChlLmcuLCBmcm9tIGFzc2lnbm1lbnRzIGxpa2UgZHJhZnQuYSA9IGRyYWZ0LmIpXHJcbiAgaWYgKHByb3h5RHJhZnQgJiYgc3RhdGUgJiYgdHlwZW9mIHN0YXRlID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICBoYW5kbGVWYWx1ZShzdGF0ZSwgcHJveHlEcmFmdC5maW5hbGl0aWVzLmhhbmRsZWRTZXQpXHJcbiAgfVxyXG5cclxuICAvLyBHZXQgb3BzIGZyb20gZmluYWxpdGllcyAoZWFnZXIgbG9nZ2luZylcclxuICBjb25zdCBvcHMgPSBwcm94eURyYWZ0Py5maW5hbGl0aWVzLm9wcyA/PyBbXVxyXG5cclxuICAvLyBSZXZva2UgYWxsIHByb3hpZXNcclxuICBpZiAocHJveHlEcmFmdCkge1xyXG4gICAgcmV2b2tlUHJveHkocHJveHlEcmFmdClcclxuICB9XHJcblxyXG4gIHJldHVybiBbc3RhdGUgYXMgVCwgb3BzXVxyXG59XHJcbiIsIi8qKlxyXG4gKiBDcmVhdGUgYSBkcmFmdCBmcm9tIGEgYmFzZSBzdGF0ZS5cclxuICogU2ltcGxpZmllZCBmcm9tIG11dGF0aXZlIC0gcmVtb3ZlZCBwYXRjaGVzL2ZyZWV6ZS9tYXJrIHN1cHBvcnQuXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgY3JlYXRlRHJhZnQsIGZpbmFsaXplRHJhZnQgfSBmcm9tIFwiLi9kcmFmdFwiXHJcbmltcG9ydCB0eXBlIHsgRmluYWxpdGllcywgT3AgfSBmcm9tIFwiLi9pbnRlcmZhY2VcIlxyXG5pbXBvcnQgeyBnZXRQcm94eURyYWZ0LCBpc0RyYWZ0YWJsZSB9IGZyb20gXCIuL3V0aWxzXCJcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgYSBkcmFmdCBhbmQgcmV0dXJuIGEgZmluYWxpemUgZnVuY3Rpb25cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkcmFmdGlmeTxUIGV4dGVuZHMgb2JqZWN0PihcclxuICBiYXNlU3RhdGU6IFRcclxuKTogW1QsIChyZXR1cm5lZFZhbHVlOiBbVF0gfCBbXSkgPT4gW1QsIE9wW11dXSB7XHJcbiAgY29uc3QgZmluYWxpdGllczogRmluYWxpdGllcyA9IHtcclxuICAgIGRyYWZ0OiBbXSxcclxuICAgIHJldm9rZTogW10sXHJcbiAgICBoYW5kbGVkU2V0OiBuZXcgV2Vha1NldDxvYmplY3Q+KCksXHJcbiAgICBkcmFmdHNDYWNoZTogbmV3IFdlYWtTZXQ8b2JqZWN0PigpLFxyXG4gICAgb3BzOiBbXSxcclxuICAgIHJvb3REcmFmdDogbnVsbCwgLy8gV2lsbCBiZSBzZXQgYnkgY3JlYXRlRHJhZnRcclxuICB9XHJcblxyXG4gIC8vIENoZWNrIGlmIHN0YXRlIGlzIGRyYWZ0YWJsZVxyXG4gIGlmICghaXNEcmFmdGFibGUoYmFzZVN0YXRlKSkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKGBjcmVhdGVPcHMoKSBvbmx5IHN1cHBvcnRzIHBsYWluIG9iamVjdHMgYW5kIGFycmF5cy5gKVxyXG4gIH1cclxuXHJcbiAgY29uc3QgZHJhZnQgPSBjcmVhdGVEcmFmdCh7XHJcbiAgICBvcmlnaW5hbDogYmFzZVN0YXRlLFxyXG4gICAgcGFyZW50RHJhZnQ6IG51bGwsXHJcbiAgICBmaW5hbGl0aWVzLFxyXG4gIH0pXHJcblxyXG4gIC8vIFNldCB0aGUgcm9vdCBkcmFmdCBmb3IgbXVsdGktcGF0aCBkZXRlY3Rpb25cclxuICBmaW5hbGl0aWVzLnJvb3REcmFmdCA9IGdldFByb3h5RHJhZnQoZHJhZnQpXHJcblxyXG4gIHJldHVybiBbXHJcbiAgICBkcmFmdCxcclxuICAgIChyZXR1cm5lZFZhbHVlOiBbVF0gfCBbXSA9IFtdKSA9PiB7XHJcbiAgICAgIHJldHVybiBmaW5hbGl6ZURyYWZ0KGRyYWZ0LCByZXR1cm5lZFZhbHVlKVxyXG4gICAgfSxcclxuICBdXHJcbn1cclxuIiwiLyoqXHJcbiAqIGNyZWF0ZU9wcyAtIE1haW4gQVBJIGZvciBnZW5lcmF0aW5nIG9wZXJhdGlvbnMgZnJvbSBtdXRhYmxlLXN0eWxlIG11dGF0aW9ucy5cclxuICpcclxuICogRm9ya2VkIGZyb20gbXV0YXRpdmUgKGh0dHBzOi8vZ2l0aHViLmNvbS91bmFkbGliL211dGF0aXZlKVxyXG4gKiBNSVQgTGljZW5zZVxyXG4gKi9cclxuXHJcbmltcG9ydCB7IGN1cnJlbnQgfSBmcm9tIFwiLi9jdXJyZW50XCJcclxuaW1wb3J0IHsgZHJhZnRpZnkgfSBmcm9tIFwiLi9kcmFmdGlmeVwiXHJcbmltcG9ydCB0eXBlIHsgQ3JlYXRlT3BzUmVzdWx0LCBEcmFmdCB9IGZyb20gXCIuL2ludGVyZmFjZVwiXHJcbmltcG9ydCB7IGdldFByb3h5RHJhZnQsIGlzRHJhZnQsIGlzRHJhZnRhYmxlLCBpc0VxdWFsLCByZXZva2VQcm94eSB9IGZyb20gXCIuL3V0aWxzXCJcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgb3BlcmF0aW9ucyBmcm9tIG11dGFibGUtc3R5bGUgbXV0YXRpb25zLlxyXG4gKlxyXG4gKiBAcGFyYW0gYmFzZSAtIFRoZSBiYXNlIHN0YXRlICh3aWxsIG5vdCBiZSBtdXRhdGVkKVxyXG4gKiBAcGFyYW0gbXV0YXRlIC0gQSBmdW5jdGlvbiB0aGF0IG11dGF0ZXMgdGhlIGRyYWZ0XHJcbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBuZXh0IHN0YXRlIGFuZCB0aGUgb3BlcmF0aW9ucyBwZXJmb3JtZWRcclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgdHNcclxuICogY29uc3Qgc3RhdGUgPSB7IGxpc3Q6IFt7IHRleHQ6ICdMZWFybicsIGRvbmU6IGZhbHNlIH1dIH07XHJcbiAqXHJcbiAqIGNvbnN0IHsgbmV4dFN0YXRlLCBvcHMgfSA9IGNyZWF0ZU9wcyhzdGF0ZSwgKGRyYWZ0KSA9PiB7XHJcbiAqICAgZHJhZnQubGlzdFswXS5kb25lID0gdHJ1ZTtcclxuICogICBkcmFmdC5saXN0LnB1c2goeyB0ZXh0OiAnUHJhY3RpY2UnLCBkb25lOiBmYWxzZSB9KTtcclxuICogfSk7XHJcbiAqXHJcbiAqIC8vIG9wcyBjb250YWlucyB0aGUgb3BlcmF0aW9ucyB0aGF0IHdlcmUgcGVyZm9ybWVkOlxyXG4gKiAvLyBbXHJcbiAqIC8vICAgeyBraW5kOiAnc2V0JywgcGF0aDogWydsaXN0JywgMF0sIGtleTogJ2RvbmUnLCB2YWx1ZTogdHJ1ZSB9LFxyXG4gKiAvLyAgIHsga2luZDogJ3NwbGljZScsIHBhdGg6IFsnbGlzdCddLCBpbmRleDogMSwgZGVsZXRlQ291bnQ6IDAsIGluc2VydHM6IFt7IHRleHQ6ICdQcmFjdGljZScsIGRvbmU6IGZhbHNlIH1dIH1cclxuICogLy8gXVxyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVPcHM8VCBleHRlbmRzIG9iamVjdD4oXHJcbiAgYmFzZTogVCxcclxuICBtdXRhdGU6IChkcmFmdDogRHJhZnQ8VD4pID0+IHZvaWRcclxuKTogQ3JlYXRlT3BzUmVzdWx0PFQ+IHtcclxuICAvLyBIYW5kbGUgY2FzZSB3aGVyZSBiYXNlIGlzIGFscmVhZHkgYSBkcmFmdFxyXG4gIGNvbnN0IHN0YXRlID0gaXNEcmFmdChiYXNlKSA/IGN1cnJlbnQoYmFzZSBhcyBEcmFmdDxUPikgOiBiYXNlXHJcblxyXG4gIC8vIFZhbGlkYXRlIHRoYXQgc3RhdGUgaXMgZHJhZnRhYmxlXHJcbiAgaWYgKCFpc0RyYWZ0YWJsZShzdGF0ZSkpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihgY3JlYXRlT3BzKCkgb25seSBzdXBwb3J0cyBwbGFpbiBvYmplY3RzIGFuZCBhcnJheXMuYClcclxuICB9XHJcblxyXG4gIC8vIENyZWF0ZSBkcmFmdFxyXG4gIGNvbnN0IFtkcmFmdCwgZmluYWxpemVdID0gZHJhZnRpZnkoc3RhdGUpXHJcblxyXG4gIC8vIFJ1biBtdXRhdGlvblxyXG4gIGxldCByZXN1bHQ6IHVua25vd25cclxuICB0cnkge1xyXG4gICAgcmVzdWx0ID0gbXV0YXRlKGRyYWZ0IGFzIERyYWZ0PFQ+KVxyXG4gIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICByZXZva2VQcm94eShnZXRQcm94eURyYWZ0KGRyYWZ0KSlcclxuICAgIHRocm93IGVycm9yXHJcbiAgfVxyXG5cclxuICAvLyBIYW5kbGUgcmV0dXJuIHZhbHVlXHJcbiAgY29uc3QgcHJveHlEcmFmdCA9IGdldFByb3h5RHJhZnQoZHJhZnQpIVxyXG5cclxuICAvLyBDaGVjayBmb3IgaW52YWxpZCByZXR1cm4gdmFsdWVzXHJcbiAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkICYmICFpc0RyYWZ0KHJlc3VsdCkpIHtcclxuICAgIGlmICghaXNFcXVhbChyZXN1bHQsIGRyYWZ0KSAmJiBwcm94eURyYWZ0Lm9wZXJhdGVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICBgRWl0aGVyIHRoZSB2YWx1ZSBpcyByZXR1cm5lZCBhcyBhIG5ldyBub24tZHJhZnQgdmFsdWUsIG9yIG9ubHkgdGhlIGRyYWZ0IGlzIG1vZGlmaWVkIHdpdGhvdXQgcmV0dXJuaW5nIGFueSB2YWx1ZS5gXHJcbiAgICAgIClcclxuICAgIH1cclxuICAgIC8vIFVzZXIgcmV0dXJuZWQgYSBuZXcgdmFsdWUgLSB1c2UgaXQgYXMgdGhlIG5leHQgc3RhdGVcclxuICAgIC8vIE5vdGU6IFdlIGRvbid0IHN1cHBvcnQgcmF3UmV0dXJuLCBzbyByZXR1cm5pbmcgYSBub24tZHJhZnQgdmFsdWUgcmVwbGFjZXMgdGhlIHN0YXRlXHJcbiAgICAvLyBidXQgd2UgY2FuJ3QgZ2VuZXJhdGUgbWVhbmluZ2Z1bCBvcHMgZm9yIHRoaXMgY2FzZVxyXG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGNvbnN0IFssIG9wc10gPSBmaW5hbGl6ZShbXSlcclxuICAgICAgcmV0dXJuIHsgbmV4dFN0YXRlOiByZXN1bHQgYXMgVCwgb3BzIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIFN0YW5kYXJkIGZsb3cgLSBmaW5hbGl6ZSB0aGUgZHJhZnRcclxuICBpZiAocmVzdWx0ID09PSBkcmFmdCB8fCByZXN1bHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgY29uc3QgW25leHRTdGF0ZSwgb3BzXSA9IGZpbmFsaXplKFtdKVxyXG4gICAgcmV0dXJuIHsgbmV4dFN0YXRlLCBvcHMgfVxyXG4gIH1cclxuXHJcbiAgLy8gUmV0dXJuZWQgYSBkaWZmZXJlbnQgZHJhZnQgKGNoaWxkKVxyXG4gIGNvbnN0IHJldHVybmVkUHJveHlEcmFmdCA9IGdldFByb3h5RHJhZnQocmVzdWx0KVxyXG4gIGlmIChyZXR1cm5lZFByb3h5RHJhZnQpIHtcclxuICAgIGlmIChyZXR1cm5lZFByb3h5RHJhZnQub3BlcmF0ZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmV0dXJuIGEgbW9kaWZpZWQgY2hpbGQgZHJhZnQuYClcclxuICAgIH1cclxuICAgIGNvbnN0IFssIG9wc10gPSBmaW5hbGl6ZShbXSlcclxuICAgIHJldHVybiB7IG5leHRTdGF0ZTogY3VycmVudChyZXN1bHQgYXMgb2JqZWN0KSBhcyBULCBvcHMgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgW25leHRTdGF0ZSwgb3BzXSA9IGZpbmFsaXplKFtdKVxyXG4gIHJldHVybiB7IG5leHRTdGF0ZSwgb3BzIH1cclxufVxyXG4iLCIvKipcclxuICogR2V0IHRoZSBvcmlnaW5hbCB2YWx1ZSBmcm9tIGEgZHJhZnQuXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgZ2V0UHJveHlEcmFmdCB9IGZyb20gXCIuL3V0aWxzXCJcclxuXHJcbi8qKlxyXG4gKiBgb3JpZ2luYWwoZHJhZnQpYCB0byBnZXQgb3JpZ2luYWwgc3RhdGUgaW4gdGhlIGRyYWZ0IG11dGF0aW9uIGZ1bmN0aW9uLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0c1xyXG4gKiBjb25zdCB7IG5leHRTdGF0ZSwgb3BzIH0gPSBjcmVhdGVPcHMoYmFzZVN0YXRlLCAoZHJhZnQpID0+IHtcclxuICogICBkcmFmdC5mb28uYmFyID0gJ25ldyB2YWx1ZSc7XHJcbiAqICAgY29uc29sZS5sb2cob3JpZ2luYWwoZHJhZnQuZm9vKSk7IC8vIHsgYmFyOiAnb2xkIHZhbHVlJyB9XHJcbiAqIH0pO1xyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBvcmlnaW5hbDxUPih0YXJnZXQ6IFQpOiBUIHtcclxuICBjb25zdCBwcm94eURyYWZ0ID0gZ2V0UHJveHlEcmFmdCh0YXJnZXQpXHJcbiAgaWYgKCFwcm94eURyYWZ0KSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoYG9yaWdpbmFsKCkgaXMgb25seSB1c2VkIGZvciBhIGRyYWZ0LCBwYXJhbWV0ZXI6ICR7dGFyZ2V0fWApXHJcbiAgfVxyXG4gIHJldHVybiBwcm94eURyYWZ0Lm9yaWdpbmFsIGFzIFRcclxufVxyXG4iLCIvKipcclxuICogSGVscGVyIGZ1bmN0aW9ucyBmb3Igc2V0LWxpa2UgYXJyYXkgb3BlcmF0aW9ucy5cclxuICogVXNlcyBlYWdlciBvcCBsb2dnaW5nIC0gb3BzIGFyZSBwdXNoZWQgaW1tZWRpYXRlbHkgd2hlbiBtdXRhdGlvbnMgaGFwcGVuLlxyXG4gKi9cclxuXHJcbmltcG9ydCB0eXBlIHsgSlNPTlZhbHVlIH0gZnJvbSBcIi4uL2pzb25cIlxyXG5pbXBvcnQgeyBkZWVwQ2xvbmUsIGRlZXBFcXVhbCB9IGZyb20gXCIuLi91dGlsc1wiXHJcbmltcG9ydCB7IHB1c2hPcCB9IGZyb20gXCIuL3B1c2hPcFwiXHJcbmltcG9ydCB7IGVuc3VyZVNoYWxsb3dDb3B5LCBnZXRQYXRoT3JUaHJvdywgZ2V0UHJveHlEcmFmdCwgbWFya0NoYW5nZWQgfSBmcm9tIFwiLi91dGlsc1wiXHJcblxyXG4vKipcclxuICogQWRkIGEgdmFsdWUgdG8gYW4gYXJyYXkgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0IChzZXQgc2VtYW50aWNzKS5cclxuICogR2VuZXJhdGVzIGFuIGBhZGRUb1NldGAgb3BlcmF0aW9uLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0c1xyXG4gKiBjcmVhdGVPcHMoc3RhdGUsIChkcmFmdCkgPT4ge1xyXG4gKiAgIGFkZFRvU2V0KGRyYWZ0LnRhZ3MsICduZXdUYWcnKTsgLy8gT25seSBhZGRzIGlmIG5vdCBwcmVzZW50XHJcbiAqIH0pO1xyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRUb1NldDxUIGV4dGVuZHMgSlNPTlZhbHVlPihkcmFmdDogVFtdLCB2YWx1ZTogVCk6IHZvaWQge1xyXG4gIGNvbnN0IHByb3h5RHJhZnQgPSBnZXRQcm94eURyYWZ0KGRyYWZ0KVxyXG4gIGlmICghcHJveHlEcmFmdCkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKGBhZGRUb1NldCgpIGNhbiBvbmx5IGJlIHVzZWQgb24gZHJhZnQgYXJyYXlzYClcclxuICB9XHJcblxyXG4gIC8vIE1hcmsgYXMgY2hhbmdlZFxyXG4gIGVuc3VyZVNoYWxsb3dDb3B5KHByb3h5RHJhZnQpXHJcbiAgbWFya0NoYW5nZWQocHJveHlEcmFmdClcclxuXHJcbiAgLy8gQ2hlY2sgaWYgdmFsdWUgYWxyZWFkeSBleGlzdHNcclxuICBjb25zdCBhcnIgPSBwcm94eURyYWZ0LmNvcHkgYXMgVFtdXHJcbiAgaWYgKGFyci5zb21lKChpdGVtKSA9PiBpdGVtID09PSB2YWx1ZSB8fCBkZWVwRXF1YWwoaXRlbSwgdmFsdWUpKSkge1xyXG4gICAgLy8gVmFsdWUgYWxyZWFkeSBleGlzdHMgLSBubyBvcCBuZWVkZWRcclxuICAgIHJldHVyblxyXG4gIH1cclxuXHJcbiAgLy8gQWRkIHRoZSB2YWx1ZVxyXG4gIGFyci5wdXNoKHZhbHVlKVxyXG5cclxuICAvLyBFYWdlciBvcCBsb2dnaW5nXHJcbiAgcHVzaE9wKHByb3h5RHJhZnQsIHtcclxuICAgIGtpbmQ6IFwiYWRkVG9TZXRcIixcclxuICAgIHBhdGg6IGdldFBhdGhPclRocm93KHByb3h5RHJhZnQpLFxyXG4gICAgdmFsdWU6IGRlZXBDbG9uZSh2YWx1ZSkgYXMgSlNPTlZhbHVlLFxyXG4gIH0pXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZW1vdmUgYSB2YWx1ZSBmcm9tIGFuIGFycmF5IChzZXQgc2VtYW50aWNzKS5cclxuICogR2VuZXJhdGVzIGEgYGRlbGV0ZUZyb21TZXRgIG9wZXJhdGlvbi5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgdHNcclxuICogY3JlYXRlT3BzKHN0YXRlLCAoZHJhZnQpID0+IHtcclxuICogICBkZWxldGVGcm9tU2V0KGRyYWZ0LnRhZ3MsICdvbGRUYWcnKTsgLy8gUmVtb3ZlcyBhbGwgbWF0Y2hpbmcgaXRlbXNcclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZUZyb21TZXQ8VCBleHRlbmRzIEpTT05WYWx1ZT4oZHJhZnQ6IFRbXSwgdmFsdWU6IFQpOiB2b2lkIHtcclxuICBjb25zdCBwcm94eURyYWZ0ID0gZ2V0UHJveHlEcmFmdChkcmFmdClcclxuICBpZiAoIXByb3h5RHJhZnQpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihgZGVsZXRlRnJvbVNldCgpIGNhbiBvbmx5IGJlIHVzZWQgb24gZHJhZnQgYXJyYXlzYClcclxuICB9XHJcblxyXG4gIC8vIE1hcmsgYXMgY2hhbmdlZFxyXG4gIGVuc3VyZVNoYWxsb3dDb3B5KHByb3h5RHJhZnQpXHJcbiAgbWFya0NoYW5nZWQocHJveHlEcmFmdClcclxuXHJcbiAgLy8gQ2hlY2sgaWYgdmFsdWUgZXhpc3RzXHJcbiAgY29uc3QgYXJyID0gcHJveHlEcmFmdC5jb3B5IGFzIFRbXVxyXG4gIGNvbnN0IGhhc1ZhbHVlID0gYXJyLnNvbWUoKGl0ZW0pID0+IGl0ZW0gPT09IHZhbHVlIHx8IGRlZXBFcXVhbChpdGVtLCB2YWx1ZSkpXHJcblxyXG4gIGlmICghaGFzVmFsdWUpIHtcclxuICAgIC8vIFZhbHVlIGRvZXNuJ3QgZXhpc3QgLSBubyBvcCBuZWVkZWRcclxuICAgIHJldHVyblxyXG4gIH1cclxuXHJcbiAgLy8gUmVtb3ZlIGFsbCBtYXRjaGluZyBpdGVtcyAoYnkgdmFsdWUgZXF1YWxpdHkpXHJcbiAgZm9yIChsZXQgaSA9IGFyci5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgaWYgKGFycltpXSA9PT0gdmFsdWUgfHwgZGVlcEVxdWFsKGFycltpXSwgdmFsdWUpKSB7XHJcbiAgICAgIGFyci5zcGxpY2UoaSwgMSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEVhZ2VyIG9wIGxvZ2dpbmdcclxuICBwdXNoT3AocHJveHlEcmFmdCwge1xyXG4gICAga2luZDogXCJkZWxldGVGcm9tU2V0XCIsXHJcbiAgICBwYXRoOiBnZXRQYXRoT3JUaHJvdyhwcm94eURyYWZ0KSxcclxuICAgIHZhbHVlOiBkZWVwQ2xvbmUodmFsdWUpIGFzIEpTT05WYWx1ZSxcclxuICB9KVxyXG59XHJcbiIsImltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyB0eXBlIENoZWNrcG9pbnRSZWNvcmQsIHBhcnNlQ2hlY2twb2ludEtleSB9IGZyb20gXCIuL2NoZWNrcG9pbnRzXCJcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSBmaW5hbGl6ZWQgZXBvY2ggYW5kIGl0cyBjYW5vbmljYWwgY2hlY2twb2ludCBpbiBhIHNpbmdsZSBwYXNzLlxuICpcbiAqIFBvbGljeSBBOiBUaGUgZmluYWxpemVkIGVwb2NoIGlzIHRoZSBtb3N0IHJlY2VudCBlcG9jaCB3aXRoIGEgY2hlY2twb2ludC5cbiAqIENhbm9uaWNhbCBjaGVja3BvaW50OiBUaGUgY2hlY2twb2ludCB3aXRoIGhpZ2hlc3QgdHhDb3VudCBmb3IgdGhhdCBlcG9jaFxuICogKHRpZS1icmVhazogbG93ZXN0IGNsaWVudElkIGFscGhhYmV0aWNhbGx5KS5cbiAqXG4gKiBSZXR1cm5zIHsgZmluYWxpemVkRXBvY2g6IC0xLCBjaGVja3BvaW50OiBudWxsIH0gaWYgbm8gY2hlY2twb2ludHMgZXhpc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaW5hbGl6ZWRFcG9jaEFuZENoZWNrcG9pbnQoeUNoZWNrcG9pbnQ6IFkuTWFwPENoZWNrcG9pbnRSZWNvcmQ+KToge1xuICBmaW5hbGl6ZWRFcG9jaDogbnVtYmVyXG4gIGNoZWNrcG9pbnQ6IENoZWNrcG9pbnRSZWNvcmQgfCBudWxsXG59IHtcbiAgbGV0IG1heEVwb2NoID0gLTFcbiAgbGV0IGJlc3Q6IENoZWNrcG9pbnRSZWNvcmQgfCBudWxsID0gbnVsbFxuICBsZXQgYmVzdFR4Q291bnQgPSAtMVxuICBsZXQgYmVzdENsaWVudElkID0gXCJcIlxuXG4gIGZvciAoY29uc3QgW2tleSwgY3BdIG9mIHlDaGVja3BvaW50LmVudHJpZXMoKSkge1xuICAgIGNvbnN0IHsgZXBvY2gsIGNsaWVudElkIH0gPSBwYXJzZUNoZWNrcG9pbnRLZXkoa2V5KVxuXG4gICAgaWYgKGVwb2NoID4gbWF4RXBvY2gpIHtcbiAgICAgIC8vIE5ldyBoaWdoZXN0IGVwb2NoIC0gcmVzZXQgYmVzdCBjaGVja3BvaW50IHRyYWNraW5nXG4gICAgICBtYXhFcG9jaCA9IGVwb2NoXG4gICAgICBiZXN0ID0gY3BcbiAgICAgIGJlc3RUeENvdW50ID0gY3AudHhDb3VudFxuICAgICAgYmVzdENsaWVudElkID0gY2xpZW50SWRcbiAgICB9IGVsc2UgaWYgKGVwb2NoID09PSBtYXhFcG9jaCkge1xuICAgICAgLy8gU2FtZSBlcG9jaCAtIGNoZWNrIGlmIHRoaXMgaXMgYSBiZXR0ZXIgY2Fub25pY2FsIGNoZWNrcG9pbnRcbiAgICAgIC8vIFByaW1hcnk6IGhpZ2hlciB0eENvdW50IHdpbnNcbiAgICAgIC8vIFNlY29uZGFyeSAodGllLWJyZWFrKTogbG93ZXIgY2xpZW50SWQgKGFscGhhYmV0aWNhbGx5KSB3aW5zXG4gICAgICBpZiAoY3AudHhDb3VudCA+IGJlc3RUeENvdW50IHx8IChjcC50eENvdW50ID09PSBiZXN0VHhDb3VudCAmJiBjbGllbnRJZCA8IGJlc3RDbGllbnRJZCkpIHtcbiAgICAgICAgYmVzdCA9IGNwXG4gICAgICAgIGJlc3RUeENvdW50ID0gY3AudHhDb3VudFxuICAgICAgICBiZXN0Q2xpZW50SWQgPSBjbGllbnRJZFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGZpbmFsaXplZEVwb2NoOiBtYXhFcG9jaCwgY2hlY2twb2ludDogYmVzdCB9XG59XG4iLCJpbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgQ2xpZW50SWQgfSBmcm9tIFwiLi9DbGllbnRJZFwiXG5pbXBvcnQgeyBnZXRGaW5hbGl6ZWRFcG9jaEFuZENoZWNrcG9pbnQgfSBmcm9tIFwiLi9jaGVja3BvaW50VXRpbHNcIlxuaW1wb3J0IHsgQ2xpZW50U3RhdGUgfSBmcm9tIFwiLi9jbGllbnRTdGF0ZVwiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4vZXJyb3JcIlxuaW1wb3J0IHsgSlNPTk9iamVjdCB9IGZyb20gXCIuL2pzb25cIlxuaW1wb3J0IHsgVHhSZWNvcmQgfSBmcm9tIFwiLi9UeFJlY29yZFwiXG5pbXBvcnQgeyBUeFRpbWVzdGFtcEtleSB9IGZyb20gXCIuL3R4VGltZXN0YW1wXCJcblxuLyoqXG4gKiBXYXRlcm1hcmtpbmcgZm9yIGRlZHVwbGljYXRpb24gYW5kIHBydW5pbmcuXG4gKiAtIG1heENsb2NrOiBBbGwgdHhzIGZyb20gdGhpcyBjbGllbnQgd2l0aCBjbG9jayA8PSBtYXhDbG9jayBhcmUgRklOQUxJWkVELlxuICogLSBtYXhXYWxsQ2xvY2s6IFRoZSBsYXN0IHRpbWUgd2Ugc2F3IHRoaXMgY2xpZW50IGFjdGl2ZSAoZm9yIHBydW5pbmcpLlxuICovXG50eXBlIENsaWVudFdhdGVybWFyayA9IFJlYWRvbmx5PHtcbiAgbWF4Q2xvY2s6IG51bWJlclxuICBtYXhXYWxsQ2xvY2s6IG51bWJlclxufT5cblxuLyoqXG4gKiBXYXRlcm1hcmtzIGZvciBhbGwgY2xpZW50cy5cbiAqL1xuZXhwb3J0IHR5cGUgQ2xpZW50V2F0ZXJtYXJrcyA9IFJlY29yZDxDbGllbnRJZCwgQ2xpZW50V2F0ZXJtYXJrPlxuXG4vKipcbiAqIEEgc25hcHNob3Qgb2YgdGhlIHN0YXRlIGF0IHRoZSBlbmQgb2YgYSBzcGVjaWZpYyBlcG9jaC5cbiAqL1xuZXhwb3J0IHR5cGUgQ2hlY2twb2ludFJlY29yZCA9IHtcbiAgc3RhdGU6IEpTT05PYmplY3QgLy8gVGhlIGRvY3VtZW50IHN0YXRlXG4gIHdhdGVybWFya3M6IENsaWVudFdhdGVybWFya3MgLy8gRGVkdXAvUHJ1bmluZyBpbmZvXG4gIHR4Q291bnQ6IG51bWJlciAvLyBUaWUtYnJlYWtlciBmb3IgY2Fub25pY2FsIHNlbGVjdGlvblxuICBtaW5XYWxsQ2xvY2s6IG51bWJlciAvLyBSZWZlcmVuY2UgdGltZSBmb3IgdGhpcyBlcG9jaCAoZGV0ZXJtaW5pc3RpYyBwcnVuaW5nKVxufVxuXG4vKipcbiAqIFVuaXF1ZSBJRCBmb3IgYSBjaGVja3BvaW50LlxuICogRm9ybWF0OiBgJHtlcG9jaH07JHt0eENvdW50fTske2NsaWVudElkfWBcbiAqL1xuZXhwb3J0IHR5cGUgQ2hlY2twb2ludEtleSA9IHN0cmluZ1xuXG4vKipcbiAqIERhdGEgZXh0cmFjdGVkIGZyb20gYSBjaGVja3BvaW50IGtleS5cbiAqL1xuZXhwb3J0IHR5cGUgQ2hlY2twb2ludEtleURhdGEgPSB7XG4gIGVwb2NoOiBudW1iZXJcbiAgdHhDb3VudDogbnVtYmVyXG4gIGNsaWVudElkOiBDbGllbnRJZFxufVxuXG4vKipcbiAqIENvbnZlcnRzIGNoZWNrcG9pbnQga2V5IGRhdGEgY29tcG9uZW50cyB0byBhIGtleSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrcG9pbnRLZXlEYXRhVG9LZXkoZGF0YTogQ2hlY2twb2ludEtleURhdGEpOiBDaGVja3BvaW50S2V5IHtcbiAgcmV0dXJuIGAke2RhdGEuZXBvY2h9OyR7ZGF0YS50eENvdW50fTske2RhdGEuY2xpZW50SWR9YFxufVxuXG4vKipcbiAqIEhlbHBlciB0byBwYXJzZSBjaGVja3BvaW50IGtleXMuXG4gKiBDaGVja3BvaW50IGtleXMgaGF2ZSBmb3JtYXQ6IGAke2Vwb2NofTske3R4Q291bnR9OyR7Y2xpZW50SWR9YFxuICogVGhyb3dzIGlmIGtleSBpcyBtYWxmb3JtZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNoZWNrcG9pbnRLZXkoa2V5OiBDaGVja3BvaW50S2V5KTogQ2hlY2twb2ludEtleURhdGEge1xuICBjb25zdCBpMSA9IGtleS5pbmRleE9mKFwiO1wiKVxuICBjb25zdCBpMiA9IGtleS5pbmRleE9mKFwiO1wiLCBpMSArIDEpXG5cbiAgaWYgKGkxID09PSAtMSB8fCBpMiA9PT0gLTEpIHtcbiAgICBmYWlsdXJlKGBNYWxmb3JtZWQgY2hlY2twb2ludCBrZXk6ICR7a2V5fWApXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGVwb2NoOiBOdW1iZXIucGFyc2VJbnQoa2V5LnN1YnN0cmluZygwLCBpMSksIDEwKSxcbiAgICB0eENvdW50OiBOdW1iZXIucGFyc2VJbnQoa2V5LnN1YnN0cmluZyhpMSArIDEsIGkyKSwgMTApLFxuICAgIGNsaWVudElkOiBrZXkuc3Vic3RyaW5nKGkyICsgMSksXG4gIH1cbn1cblxuLyoqXG4gKiBDYWxsZWQgcGVyaW9kaWNhbGx5IChlLmcuIGJ5IGEgc2VydmVyIG9yIGxlYWRlciBjbGllbnQpIHRvIGZpbmFsaXplIHRoZSBlcG9jaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNoZWNrcG9pbnQoXG4gIHlUeDogWS5NYXA8VHhSZWNvcmQ+LFxuICB5Q2hlY2twb2ludDogWS5NYXA8Q2hlY2twb2ludFJlY29yZD4sXG4gIGNsaWVudFN0YXRlOiBDbGllbnRTdGF0ZSxcbiAgYWN0aXZlRXBvY2g6IG51bWJlcixcbiAgY3VycmVudFN0YXRlOiBKU09OT2JqZWN0LFxuICBteUNsaWVudElkOiBzdHJpbmdcbik6IHZvaWQge1xuICAvLyAxLiBTdGFydCB3aXRoIHByZXZpb3VzIHdhdGVybWFya3MgKGZyb20gZmluYWxpemVkIGVwb2NoID0gYWN0aXZlRXBvY2ggLSAxKVxuICBjb25zdCB7IGNoZWNrcG9pbnQ6IHByZXZDUCB9ID0gZ2V0RmluYWxpemVkRXBvY2hBbmRDaGVja3BvaW50KHlDaGVja3BvaW50KVxuICBjb25zdCBuZXdXYXRlcm1hcmtzID0gcHJldkNQID8geyAuLi5wcmV2Q1Aud2F0ZXJtYXJrcyB9IDoge31cblxuICAvLyBHZXQgYWN0aXZlIHR4cyB1c2luZyBjYWNoZWQgc29ydGVkIG9yZGVyIChmaWx0ZXIgYnkgZXBvY2gpXG4gIC8vIEZJTFRFUiBJUyBSRVFVSVJFRDpcbiAgLy8gQWx0aG91Z2ggd2UgYXJlIGZpbmFsaXppbmcgJ2FjdGl2ZUVwb2NoJywgb3RoZXIgcGVlcnMgbWF5IGhhdmUgYWxyZWFkeVxuICAvLyBhZHZhbmNlZCB0byB0aGUgbmV4dCBlcG9jaCBhbmQgc3RhcnRlZCBzeW5jaW5nIHRob3NlIHR4cy5cbiAgLy8gV2UgbXVzdCBlbnN1cmUgdGhpcyBjaGVja3BvaW50IE9OTFkgY29udGFpbnMgdHhzIGZyb20gJ2FjdGl2ZUVwb2NoJy5cbiAgLy8gVXNpbmcgc3RhdGVDYWxjdWxhdG9yLmdldFNvcnRlZFR4cyBhdm9pZHMgcmVkdW5kYW50IGtleSBwYXJzaW5nICh0aW1lc3RhbXBzIGFyZSBjYWNoZWQpLlxuICAvL1xuICAvLyBPUFRJTUlaQVRJT046IFNpbmNlIHNvcnRlZFR4cyBpcyBzb3J0ZWQgYnkgZXBvY2ggKHByaW1hcnkga2V5KSBhbmQgcGFzdCBlcG9jaHNcbiAgLy8gYXJlIHBydW5lZCwgd2Ugb25seSBuZWVkIHRvIGZpbmQgdGhlIHJpZ2h0IGJvdW5kYXJ5LiBGdXR1cmUgZXBvY2hzIGFyZSByYXJlLFxuICAvLyBzbyBhIHNpbXBsZSBsaW5lYXIgc2VhcmNoIGZyb20gdGhlIHJpZ2h0IGlzIGVmZmljaWVudCAodHlwaWNhbGx5IDAtMSBpdGVyYXRpb25zKS5cbiAgY29uc3Qgc29ydGVkVHhzID0gY2xpZW50U3RhdGUuc3RhdGVDYWxjdWxhdG9yLmdldFNvcnRlZFR4cygpXG5cbiAgLy8gRmluZCBlbmQgYm91bmRhcnkgYnkgc2VhcmNoaW5nIGZyb20gcmlnaHQgKHNraXAgYW55IGZ1dHVyZSBlcG9jaCBlbnRyaWVzKVxuICBsZXQgZW5kSW5kZXggPSBzb3J0ZWRUeHMubGVuZ3RoXG4gIHdoaWxlIChlbmRJbmRleCA+IDAgJiYgc29ydGVkVHhzW2VuZEluZGV4IC0gMV0udHhUaW1lc3RhbXAuZXBvY2ggPiBhY3RpdmVFcG9jaCkge1xuICAgIGVuZEluZGV4LS1cbiAgfVxuXG4gIC8vIFNsaWNlIGZyb20gc3RhcnQgdG8gZW5kSW5kZXggKHBhc3QgZXBvY2hzIGFyZSBwcnVuZWQsIHNvIHRoZXNlIGFyZSBhbGwgYWN0aXZlRXBvY2gpXG4gIGNvbnN0IGFjdGl2ZVR4cyA9IHNvcnRlZFR4cy5zbGljZSgwLCBlbmRJbmRleClcblxuICBpZiAoYWN0aXZlVHhzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAvLyBEbyBub3RoaW5nIGlmIG5vIHR4cyAocHJldmVudHMgZW1wdHkgZXBvY2hzKVxuICB9XG5cbiAgLy8gMi4gVXBkYXRlIHdhdGVybWFya3MgYmFzZWQgb24gT0JTRVJWRUQgYWN0aXZlIHR4cyBhbmQgY2FsY3VsYXRlIG1pbldhbGxDbG9ja1xuICAvLyBOT1RFOiBXZSBjYW5ub3QgdXNlIGFjdGl2ZVR4c1swXS50eFRpbWVzdGFtcC53YWxsQ2xvY2sgZm9yIG1pbldhbGxDbG9jayBiZWNhdXNlXG4gIC8vIHR4cyBhcmUgc29ydGVkIGJ5IExhbXBvcnQgY2xvY2sgKGVwb2NoIOKGkiBjbG9jayDihpIgY2xpZW50SWQpLCBub3QgYnkgd2FsbENsb2NrLlxuICAvLyBBIGNsaWVudCBtYXkgaGF2ZSBhIGhpZ2ggTGFtcG9ydCBjbG9jayBidXQgZWFybHkgd2FsbENsb2NrIGR1ZSB0byBjbG9jayBkcmlmdFxuICAvLyBvciByZWNlaXZpbmcgbWFueSBtZXNzYWdlcyBiZWZvcmUgZW1pdHRpbmcuXG4gIGxldCBtaW5XYWxsQ2xvY2sgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcbiAgbGV0IHR4Q291bnQgPSAwXG4gIGZvciAoY29uc3QgZW50cnkgb2YgYWN0aXZlVHhzKSB7XG4gICAgY29uc3QgdHMgPSBlbnRyeS50eFRpbWVzdGFtcFxuXG4gICAgLy8gVHJhY2sgbWluIHdhbGxDbG9jayBmb3IgZGV0ZXJtaW5pc3RpYyBwcnVuaW5nIHJlZmVyZW5jZVxuICAgIGlmICh0cy53YWxsQ2xvY2sgPCBtaW5XYWxsQ2xvY2spIHtcbiAgICAgIG1pbldhbGxDbG9jayA9IHRzLndhbGxDbG9ja1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1dtID0gbmV3V2F0ZXJtYXJrc1t0cy5jbGllbnRJZF1cbiAgICAgID8geyAuLi5uZXdXYXRlcm1hcmtzW3RzLmNsaWVudElkXSB9XG4gICAgICA6IHsgbWF4Q2xvY2s6IC0xLCBtYXhXYWxsQ2xvY2s6IDAgfVxuXG4gICAgaWYgKHRzLmNsb2NrID4gbmV3V20ubWF4Q2xvY2spIHtcbiAgICAgIG5ld1dtLm1heENsb2NrID0gdHMuY2xvY2tcbiAgICAgIG5ld1dtLm1heFdhbGxDbG9jayA9IHRzLndhbGxDbG9ja1xuICAgIH1cbiAgICBuZXdXYXRlcm1hcmtzW3RzLmNsaWVudElkXSA9IG5ld1dtXG4gICAgdHhDb3VudCsrXG4gIH1cblxuICAvLyAzLiBQcnVuZSBJbmFjdGl2ZSBXYXRlcm1hcmtzIChEZXRlcm1pbmlzdGljKVxuICAvLyBVc2VzIG1pbldhbGxDbG9jayBzbyBhbGwgY2xpZW50cyBhZ3JlZSBvbiBleGFjdGx5IHdobyB0byBwcnVuZS5cbiAgZm9yIChjb25zdCBjbGllbnRJZCBpbiBuZXdXYXRlcm1hcmtzKSB7XG4gICAgaWYgKG1pbldhbGxDbG9jayAtIG5ld1dhdGVybWFya3NbY2xpZW50SWRdLm1heFdhbGxDbG9jayA+IGNsaWVudFN0YXRlLnJldGVudGlvbldpbmRvd01zKSB7XG4gICAgICBkZWxldGUgbmV3V2F0ZXJtYXJrc1tjbGllbnRJZF1cbiAgICB9XG4gIH1cblxuICAvLyA0LiBTYXZlIENoZWNrcG9pbnRcbiAgY29uc3QgY3BLZXkgPSBjaGVja3BvaW50S2V5RGF0YVRvS2V5KHtcbiAgICBlcG9jaDogYWN0aXZlRXBvY2gsXG4gICAgdHhDb3VudCxcbiAgICBjbGllbnRJZDogbXlDbGllbnRJZCxcbiAgfSlcbiAgeUNoZWNrcG9pbnQuc2V0KGNwS2V5LCB7XG4gICAgc3RhdGU6IGN1cnJlbnRTdGF0ZSwgLy8gUmVzcG9uc2liaWxpdHkgZm9yIGNsb25pbmcgaXMgbW92ZWQgdG8gdGhlIGNhbGxlciBpZiBuZWVkZWRcbiAgICB3YXRlcm1hcmtzOiBuZXdXYXRlcm1hcmtzLFxuICAgIHR4Q291bnQsXG4gICAgbWluV2FsbENsb2NrLFxuICB9KVxuXG4gIC8vIDUuIEVhcmx5IHR4IHBydW5pbmcgKE9wdGltaXphdGlvbilcbiAgLy8gRGVsZXRlIGFsbCB0eHMgZnJvbSB0aGUgbm93LWZpbmFsaXplZCBlcG9jaFxuICAvLyBUaGlzIHJlZHVjZXMgbWVtb3J5IHByZXNzdXJlIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgY2xlYW51cExvZ1xuICBjb25zdCBrZXlzVG9EZWxldGU6IFR4VGltZXN0YW1wS2V5W10gPSBbXVxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGFjdGl2ZVR4cykge1xuICAgIHlUeC5kZWxldGUoZW50cnkudHhUaW1lc3RhbXBLZXkpXG4gICAga2V5c1RvRGVsZXRlLnB1c2goZW50cnkudHhUaW1lc3RhbXBLZXkpXG4gIH1cbiAgY2xpZW50U3RhdGUuc3RhdGVDYWxjdWxhdG9yLnJlbW92ZVR4cyhrZXlzVG9EZWxldGUpXG59XG5cbi8qKlxuICogR2FyYmFnZSBjb2xsZWN0cyBvbGQgY2hlY2twb2ludHMuXG4gKiBTaG91bGQgYmUgY2FsbGVkIHBlcmlvZGljYWxseSB0byBwcmV2ZW50IHVuYm91bmRlZCBncm93dGggb2YgeUNoZWNrcG9pbnQuXG4gKlxuICogS2VlcHMgb25seSB0aGUgY2Fub25pY2FsIGNoZWNrcG9pbnQgZm9yIHRoZSBmaW5hbGl6ZWQgZXBvY2guXG4gKiBFdmVyeXRoaW5nIGVsc2UgaXMgZGVsZXRlZCAob2xkIGVwb2NocyArIG5vbi1jYW5vbmljYWwpLlxuICpcbiAqIE5vdGU6IFRoZSBhY3RpdmUgZXBvY2ggbmV2ZXIgaGFzIGNoZWNrcG9pbnRzIC0gY3JlYXRpbmcgYSBjaGVja3BvaW50XG4gKiBmb3IgYW4gZXBvY2ggaW1tZWRpYXRlbHkgbWFrZXMgaXQgZmluYWxpemVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJ1bmVDaGVja3BvaW50cyhcbiAgeUNoZWNrcG9pbnQ6IFkuTWFwPENoZWNrcG9pbnRSZWNvcmQ+LFxuICBmaW5hbGl6ZWRFcG9jaDogbnVtYmVyXG4pOiB2b2lkIHtcbiAgLy8gRmluZCB0aGUgY2Fub25pY2FsIGNoZWNrcG9pbnQgYW5kIGl0cyBrZXkgaW4gb25lIHBhc3NcbiAgbGV0IGNhbm9uaWNhbEtleTogQ2hlY2twb2ludEtleSB8IG51bGwgPSBudWxsXG4gIGxldCBiZXN0VHhDb3VudCA9IC0xXG5cbiAgZm9yIChjb25zdCBba2V5XSBvZiB5Q2hlY2twb2ludC5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCB7IGVwb2NoLCB0eENvdW50IH0gPSBwYXJzZUNoZWNrcG9pbnRLZXkoa2V5KVxuICAgIGlmIChlcG9jaCA9PT0gZmluYWxpemVkRXBvY2ggJiYgdHhDb3VudCA+IGJlc3RUeENvdW50KSB7XG4gICAgICBjYW5vbmljYWxLZXkgPSBrZXlcbiAgICAgIGJlc3RUeENvdW50ID0gdHhDb3VudFxuICAgIH1cbiAgfVxuXG4gIC8vIERlbGV0ZSBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgY2Fub25pY2FsIGNoZWNrcG9pbnRcbiAgZm9yIChjb25zdCBrZXkgb2YgeUNoZWNrcG9pbnQua2V5cygpKSB7XG4gICAgaWYgKGtleSAhPT0gY2Fub25pY2FsS2V5KSB7XG4gICAgICB5Q2hlY2twb2ludC5kZWxldGUoa2V5KVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuL2Vycm9yXCJcclxuaW1wb3J0IHR5cGUgeyBKU09OT2JqZWN0LCBKU09OUmVjb3JkLCBKU09OVmFsdWUsIFBhdGggfSBmcm9tIFwiLi9qc29uXCJcclxuaW1wb3J0IHR5cGUgeyBPcCwgVmFsaWRhdGVGbiB9IGZyb20gXCIuL29wZXJhdGlvbnNcIlxyXG5pbXBvcnQgeyBUeFJlY29yZCB9IGZyb20gXCIuL1R4UmVjb3JkXCJcclxuaW1wb3J0IHsgZGVlcEVxdWFsLCBpc09iamVjdCwgcGFyc2VBcnJheUluZGV4IH0gZnJvbSBcIi4vdXRpbHNcIlxyXG5cclxuLyoqXHJcbiAqIEEgZHJhZnQgY29udGV4dCBmb3IgY29weS1vbi13cml0ZSBpbW11dGFibGUgdXBkYXRlcy5cclxuICpcclxuICogVGhpcyBwcm92aWRlcyBJbW1lci9NdXRhdGl2ZS1saWtlIHNlbWFudGljcyB3aXRob3V0IHRoZSBwcm94eSBvdmVyaGVhZDpcclxuICogLSBUaGUgb3JpZ2luYWwgYmFzZSBzdGF0ZSBpcyBuZXZlciBtdXRhdGVkXHJcbiAqIC0gT2JqZWN0cyBhcmUgY2xvbmVkIGxhemlseSBvbiBmaXJzdCBtdXRhdGlvbiAoY29weS1vbi13cml0ZSlcclxuICogLSBPbmNlIGFuIG9iamVjdCBpcyBjbG9uZWQgKFwib3duZWRcIiksIGl0IGNhbiBiZSBtdXRhdGVkIGRpcmVjdGx5XHJcbiAqIC0gSWYgbm8gY2hhbmdlcyBhcmUgbWFkZSwgdGhlIG9yaWdpbmFsIHJlZmVyZW5jZSBpcyBwcmVzZXJ2ZWQgKHN0cnVjdHVyYWwgc2hhcmluZylcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgRHJhZnRDb250ZXh0PFQgZXh0ZW5kcyBKU09OT2JqZWN0PiB7XHJcbiAgLyoqIFRoZSBjdXJyZW50IHJvb3QgKG1heSBiZSB0aGUgb3JpZ2luYWwgYmFzZSBvciBhIGNsb25lZCB2ZXJzaW9uKSAqL1xyXG4gIHJvb3Q6IFRcclxuICAvKiogVGhlIG9yaWdpbmFsIGJhc2Ugc3RhdGUgKG5ldmVyIG11dGF0ZWQpICovXHJcbiAgYmFzZTogVFxyXG4gIC8qKiBTZXQgb2Ygb2JqZWN0cyB0aGF0IGhhdmUgYmVlbiBjbG9uZWQgYW5kIGFyZSBzYWZlIHRvIG11dGF0ZSAqL1xyXG4gIG93bmVkT2JqZWN0czogV2Vha1NldDxvYmplY3Q+XHJcbiAgLyoqIE9wdGltaXphdGlvbjogZmFzdCBjaGVjayBpZiByb290IGlzIGFscmVhZHkgb3duZWQgKi9cclxuICBpc1Jvb3RPd25lZDogYm9vbGVhblxyXG59XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBkcmFmdCBjb250ZXh0IGZyb20gYSBiYXNlIHN0YXRlLlxyXG4gKiBUaGUgYmFzZSBzdGF0ZSB3aWxsIG5ldmVyIGJlIG11dGF0ZWQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRHJhZnQ8VCBleHRlbmRzIEpTT05PYmplY3Q+KGJhc2U6IFQpOiBEcmFmdENvbnRleHQ8VD4ge1xyXG4gIHJldHVybiB7XHJcbiAgICByb290OiBiYXNlLFxyXG4gICAgYmFzZSxcclxuICAgIG93bmVkT2JqZWN0czogbmV3IFNldCgpLFxyXG4gICAgaXNSb290T3duZWQ6IGZhbHNlLFxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBpZiB0aGUgZHJhZnQgd2FzIG1vZGlmaWVkIChyb290ICE9PSBiYXNlKS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0RyYWZ0TW9kaWZpZWQ8VCBleHRlbmRzIEpTT05PYmplY3Q+KGN0eDogRHJhZnRDb250ZXh0PFQ+KTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIGN0eC5yb290ICE9PSBjdHguYmFzZVxyXG59XHJcblxyXG5mdW5jdGlvbiBzaGFsbG93Q2xvbmU8VCBleHRlbmRzIG9iamVjdD4ob2JqOiBUKTogVCB7XHJcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xyXG4gICAgcmV0dXJuIG9iai5zbGljZSgpIGFzIHVua25vd24gYXMgVFxyXG4gIH1cclxuICBjb25zdCBjbG9uZSA9IHt9IGFzIFRcclxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKVxyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xyXG4gICAgY29uc3Qga2V5ID0ga2V5c1tpXVxyXG4gICAgOyhjbG9uZSBhcyBhbnkpW2tleV0gPSAob2JqIGFzIGFueSlba2V5XVxyXG4gIH1cclxuICByZXR1cm4gY2xvbmVcclxufVxyXG5cclxuLyoqXHJcbiAqIEVuc3VyZXMgYW4gb2JqZWN0IGlzIG93bmVkIChjbG9uZWQgaWYgbmVjZXNzYXJ5KSBhbmQgcmV0dXJucyB0aGUgb3duZWQgdmVyc2lvbi5cclxuICogQWxzbyB1cGRhdGVzIHRoZSBwYXJlbnQgdG8gcG9pbnQgdG8gdGhlIGNsb25lZCBjaGlsZC5cclxuICovXHJcbmZ1bmN0aW9uIGVuc3VyZU93bmVkPFQgZXh0ZW5kcyBKU09OT2JqZWN0PihcclxuICBjdHg6IERyYWZ0Q29udGV4dDxUPixcclxuICBwYXJlbnQ6IEpTT05PYmplY3QsXHJcbiAga2V5OiBzdHJpbmcgfCBudW1iZXIsXHJcbiAgY2hpbGQ6IEpTT05SZWNvcmQgfCBKU09OVmFsdWVbXVxyXG4pOiBKU09OUmVjb3JkIHwgSlNPTlZhbHVlW10ge1xyXG4gIGlmIChjdHgub3duZWRPYmplY3RzLmhhcyhjaGlsZCkpIHtcclxuICAgIHJldHVybiBjaGlsZFxyXG4gIH1cclxuICBjb25zdCBjbG9uZWQgPSBzaGFsbG93Q2xvbmUoY2hpbGQpXHJcbiAgOyhwYXJlbnQgYXMgYW55KVtrZXldID0gY2xvbmVkXHJcbiAgY3R4Lm93bmVkT2JqZWN0cy5hZGQoY2xvbmVkKVxyXG4gIHJldHVybiBjbG9uZWRcclxufVxyXG5cclxuLyoqXHJcbiAqIEVuc3VyZXMgYWxsIG9iamVjdHMgYWxvbmcgdGhlIHBhdGggYXJlIG93bmVkIChjbG9uZWQgaWYgbmVjZXNzYXJ5KS5cclxuICogUmV0dXJucyB0aGUgY29udGFpbmVyIGF0IHRoZSBlbmQgb2YgdGhlIHBhdGguXHJcbiAqIFRocm93cyBpZiB0aGUgcGF0aCBpcyBpbnZhbGlkLlxyXG4gKi9cclxuZnVuY3Rpb24gZW5zdXJlT3duZWRQYXRoPFQgZXh0ZW5kcyBKU09OT2JqZWN0PihcclxuICBjdHg6IERyYWZ0Q29udGV4dDxUPixcclxuICBwYXRoOiBQYXRoXHJcbik6IEpTT05SZWNvcmQgfCBKU09OVmFsdWVbXSB7XHJcbiAgLy8gRW5zdXJlIHJvb3QgaXMgb3duZWQgZmlyc3RcclxuICBpZiAoIWN0eC5pc1Jvb3RPd25lZCkge1xyXG4gICAgY3R4LnJvb3QgPSBzaGFsbG93Q2xvbmUoY3R4LnJvb3QgYXMgdW5rbm93biBhcyBvYmplY3QpIGFzIFRcclxuICAgIGN0eC5vd25lZE9iamVjdHMuYWRkKGN0eC5yb290KVxyXG4gICAgY3R4LmlzUm9vdE93bmVkID0gdHJ1ZVxyXG4gIH1cclxuXHJcbiAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XHJcbiAgICByZXR1cm4gY3R4LnJvb3RcclxuICB9XHJcblxyXG4gIGxldCBjdXJyZW50OiBKU09OUmVjb3JkIHwgSlNPTlZhbHVlW10gPSBjdHgucm9vdFxyXG5cclxuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcclxuICAgIGNvbnN0IHNlZ21lbnQgPSBwYXRoW2ldXHJcbiAgICBjb25zdCBpc0FycmF5SW5kZXggPSB0eXBlb2Ygc2VnbWVudCA9PT0gXCJudW1iZXJcIlxyXG5cclxuICAgIC8vIFZhbGlkYXRlIGNvbnRhaW5lciB0eXBlXHJcbiAgICBpZiAoaXNBcnJheUluZGV4KSB7XHJcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShjdXJyZW50KSkge1xyXG4gICAgICAgIGZhaWx1cmUoYEV4cGVjdGVkIGFycmF5IGF0IHBhdGggc2VnbWVudCAke3NlZ21lbnR9YClcclxuICAgICAgfVxyXG4gICAgICBpZiAoc2VnbWVudCA8IDAgfHwgc2VnbWVudCA+PSBjdXJyZW50Lmxlbmd0aCkge1xyXG4gICAgICAgIGZhaWx1cmUoYEluZGV4ICR7c2VnbWVudH0gb3V0IG9mIGJvdW5kc2ApXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICghaXNPYmplY3QoY3VycmVudCkgfHwgQXJyYXkuaXNBcnJheShjdXJyZW50KSkge1xyXG4gICAgICAgIGZhaWx1cmUoYEV4cGVjdGVkIG9iamVjdCBhdCBwYXRoIHNlZ21lbnQgXCIke3NlZ21lbnR9XCJgKVxyXG4gICAgICB9XHJcbiAgICAgIGlmICghKHNlZ21lbnQgaW4gY3VycmVudCkpIHtcclxuICAgICAgICBmYWlsdXJlKGBQcm9wZXJ0eSBcIiR7c2VnbWVudH1cIiBkb2VzIG5vdCBleGlzdGApXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjaGlsZDogSlNPTlZhbHVlID0gKGN1cnJlbnQgYXMgYW55KVtzZWdtZW50XVxyXG5cclxuICAgIC8vIFZhbGlkYXRlIGNoaWxkIGlzIHRyYXZlcnNhYmxlXHJcbiAgICBpZiAoY2hpbGQgPT09IG51bGwgfHwgdHlwZW9mIGNoaWxkICE9PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgIGZhaWx1cmUoYENhbm5vdCB0cmF2ZXJzZSB0aHJvdWdoIHByaW1pdGl2ZSBhdCBwYXRoIHNlZ21lbnQgJHtzZWdtZW50fWApXHJcbiAgICB9XHJcblxyXG4gICAgLy8gRW5zdXJlIGNoaWxkIGlzIG93bmVkIGFuZCBjb250aW51ZVxyXG4gICAgY3VycmVudCA9IGVuc3VyZU93bmVkKGN0eCwgY3VycmVudCwgc2VnbWVudCwgY2hpbGQgYXMgSlNPTlJlY29yZCB8IEpTT05WYWx1ZVtdKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGN1cnJlbnRcclxufVxyXG5cclxuLyoqXHJcbiAqIEFwcGxpZXMgYSBzaW5nbGUgXCJzZXRcIiBvcGVyYXRpb24gdG8gdGhlIGRyYWZ0IHdpdGggY29weS1vbi13cml0ZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkcmFmdFNldDxUIGV4dGVuZHMgSlNPTk9iamVjdD4oXHJcbiAgY3R4OiBEcmFmdENvbnRleHQ8VD4sXHJcbiAgcGF0aDogUGF0aCxcclxuICBrZXk6IHN0cmluZyB8IG51bWJlcixcclxuICB2YWx1ZTogSlNPTlZhbHVlXHJcbik6IHZvaWQge1xyXG4gIGNvbnN0IGNvbnRhaW5lciA9IGVuc3VyZU93bmVkUGF0aChjdHgsIHBhdGgpXHJcbiAgaWYgKCFpc09iamVjdChjb250YWluZXIpKSB7XHJcbiAgICBmYWlsdXJlKFwic2V0IHJlcXVpcmVzIG9iamVjdCBvciBhcnJheSBjb250YWluZXJcIilcclxuICB9XHJcbiAgbGV0IGZpbmFsS2V5OiBzdHJpbmcgfCBudW1iZXIgPSBrZXlcclxuICAvLyBGb3IgYXJyYXlzLCBjb252ZXJ0IHN0cmluZyBrZXlzIHRvIG51bWJlcnMgKGV4Y2VwdCBcImxlbmd0aFwiKVxyXG4gIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcikgJiYgdHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIiAmJiBrZXkgIT09IFwibGVuZ3RoXCIpIHtcclxuICAgIGNvbnN0IG51bUtleSA9IHBhcnNlQXJyYXlJbmRleChrZXkpXHJcbiAgICBpZiAobnVtS2V5ID09PSBudWxsKSB7XHJcbiAgICAgIGZhaWx1cmUoYENhbm5vdCBzZXQgbm9uLW51bWVyaWMgcHJvcGVydHkgXCIke2tleX1cIiBvbiBhcnJheWApXHJcbiAgICB9XHJcbiAgICBmaW5hbEtleSA9IG51bUtleVxyXG4gIH1cclxuICA7KGNvbnRhaW5lciBhcyBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyLCBKU09OVmFsdWU+KVtmaW5hbEtleV0gPSB2YWx1ZVxyXG59XHJcblxyXG4vKipcclxuICogQXBwbGllcyBhIHNpbmdsZSBcImRlbGV0ZVwiIG9wZXJhdGlvbiB0byB0aGUgZHJhZnQgd2l0aCBjb3B5LW9uLXdyaXRlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRyYWZ0RGVsZXRlPFQgZXh0ZW5kcyBKU09OT2JqZWN0PihcclxuICBjdHg6IERyYWZ0Q29udGV4dDxUPixcclxuICBwYXRoOiBQYXRoLFxyXG4gIGtleTogc3RyaW5nIHwgbnVtYmVyXHJcbik6IHZvaWQge1xyXG4gIGNvbnN0IGNvbnRhaW5lciA9IGVuc3VyZU93bmVkUGF0aChjdHgsIHBhdGgpXHJcbiAgaWYgKCFpc09iamVjdChjb250YWluZXIpKSB7XHJcbiAgICBmYWlsdXJlKFwiZGVsZXRlIHJlcXVpcmVzIG9iamVjdCBvciBhcnJheSBjb250YWluZXJcIilcclxuICB9XHJcbiAgbGV0IGZpbmFsS2V5OiBzdHJpbmcgfCBudW1iZXIgPSBrZXlcclxuICAvLyBGb3IgYXJyYXlzLCBjb252ZXJ0IHN0cmluZyBrZXlzIHRvIG51bWJlcnNcclxuICBpZiAoQXJyYXkuaXNBcnJheShjb250YWluZXIpICYmIHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIpIHtcclxuICAgIGNvbnN0IG51bUtleSA9IHBhcnNlQXJyYXlJbmRleChrZXkpXHJcbiAgICBpZiAobnVtS2V5ID09PSBudWxsKSB7XHJcbiAgICAgIGZhaWx1cmUoYENhbm5vdCBkZWxldGUgbm9uLW51bWVyaWMgcHJvcGVydHkgXCIke2tleX1cIiBmcm9tIGFycmF5YClcclxuICAgIH1cclxuICAgIGZpbmFsS2V5ID0gbnVtS2V5XHJcbiAgfVxyXG4gIGRlbGV0ZSAoY29udGFpbmVyIGFzIFJlY29yZDxzdHJpbmcgfCBudW1iZXIsIEpTT05WYWx1ZT4pW2ZpbmFsS2V5XVxyXG59XHJcblxyXG4vKipcclxuICogQXBwbGllcyBhIHNpbmdsZSBcInNwbGljZVwiIG9wZXJhdGlvbiB0byB0aGUgZHJhZnQgd2l0aCBjb3B5LW9uLXdyaXRlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRyYWZ0U3BsaWNlPFQgZXh0ZW5kcyBKU09OT2JqZWN0PihcclxuICBjdHg6IERyYWZ0Q29udGV4dDxUPixcclxuICBwYXRoOiBQYXRoLFxyXG4gIGluZGV4OiBudW1iZXIsXHJcbiAgZGVsZXRlQ291bnQ6IG51bWJlcixcclxuICBpbnNlcnRzOiByZWFkb25seSBKU09OVmFsdWVbXVxyXG4pOiB2b2lkIHtcclxuICBjb25zdCBjb250YWluZXIgPSBlbnN1cmVPd25lZFBhdGgoY3R4LCBwYXRoKVxyXG4gIGlmICghQXJyYXkuaXNBcnJheShjb250YWluZXIpKSB7XHJcbiAgICBmYWlsdXJlKFwic3BsaWNlIHJlcXVpcmVzIGFycmF5IGNvbnRhaW5lclwiKVxyXG4gIH1cclxuICBjb25zdCBzYWZlSW5kZXggPSBNYXRoLm1pbihpbmRleCwgY29udGFpbmVyLmxlbmd0aClcclxuICBpZiAoaW5zZXJ0cy5sZW5ndGggPT09IDApIHtcclxuICAgIGNvbnRhaW5lci5zcGxpY2Uoc2FmZUluZGV4LCBkZWxldGVDb3VudClcclxuICB9IGVsc2UgaWYgKGluc2VydHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICBjb250YWluZXIuc3BsaWNlKHNhZmVJbmRleCwgZGVsZXRlQ291bnQsIGluc2VydHNbMF0pXHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbnRhaW5lci5zcGxpY2Uoc2FmZUluZGV4LCBkZWxldGVDb3VudCwgLi4uaW5zZXJ0cylcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIGEgc2luZ2xlIFwiYWRkVG9TZXRcIiBvcGVyYXRpb24gdG8gdGhlIGRyYWZ0IHdpdGggY29weS1vbi13cml0ZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkcmFmdEFkZFRvU2V0PFQgZXh0ZW5kcyBKU09OT2JqZWN0PihcclxuICBjdHg6IERyYWZ0Q29udGV4dDxUPixcclxuICBwYXRoOiBQYXRoLFxyXG4gIHZhbHVlOiBKU09OVmFsdWVcclxuKTogdm9pZCB7XHJcbiAgY29uc3QgY29udGFpbmVyID0gZW5zdXJlT3duZWRQYXRoKGN0eCwgcGF0aClcclxuICBpZiAoIUFycmF5LmlzQXJyYXkoY29udGFpbmVyKSkge1xyXG4gICAgZmFpbHVyZShcImFkZFRvU2V0IHJlcXVpcmVzIGFycmF5IGNvbnRhaW5lclwiKVxyXG4gIH1cclxuICBpZiAoIWNvbnRhaW5lci5zb21lKChpdGVtKSA9PiBkZWVwRXF1YWwoaXRlbSwgdmFsdWUpKSkge1xyXG4gICAgY29udGFpbmVyLnB1c2godmFsdWUpXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQXBwbGllcyBhIHNpbmdsZSBcImRlbGV0ZUZyb21TZXRcIiBvcGVyYXRpb24gdG8gdGhlIGRyYWZ0IHdpdGggY29weS1vbi13cml0ZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkcmFmdERlbGV0ZUZyb21TZXQ8VCBleHRlbmRzIEpTT05PYmplY3Q+KFxyXG4gIGN0eDogRHJhZnRDb250ZXh0PFQ+LFxyXG4gIHBhdGg6IFBhdGgsXHJcbiAgdmFsdWU6IEpTT05WYWx1ZVxyXG4pOiB2b2lkIHtcclxuICBjb25zdCBjb250YWluZXIgPSBlbnN1cmVPd25lZFBhdGgoY3R4LCBwYXRoKVxyXG4gIGlmICghQXJyYXkuaXNBcnJheShjb250YWluZXIpKSB7XHJcbiAgICBmYWlsdXJlKFwiZGVsZXRlRnJvbVNldCByZXF1aXJlcyBhcnJheSBjb250YWluZXJcIilcclxuICB9XHJcbiAgLy8gUmVtb3ZlIGFsbCBtYXRjaGluZyBpdGVtcyAoaXRlcmF0ZSBiYWNrd2FyZHMgdG8gYXZvaWQgaW5kZXggc2hpZnRpbmcpXHJcbiAgZm9yIChsZXQgaSA9IGNvbnRhaW5lci5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgaWYgKGRlZXBFcXVhbChjb250YWluZXJbaV0sIHZhbHVlKSkge1xyXG4gICAgICBjb250YWluZXIuc3BsaWNlKGksIDEpXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQXBwbGllcyBhIHNpbmdsZSBvcGVyYXRpb24gdG8gdGhlIGRyYWZ0IHdpdGggY29weS1vbi13cml0ZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhcHBseU9wVG9EcmFmdDxUIGV4dGVuZHMgSlNPTk9iamVjdD4oY3R4OiBEcmFmdENvbnRleHQ8VD4sIG9wOiBPcCk6IHZvaWQge1xyXG4gIHN3aXRjaCAob3Aua2luZCkge1xyXG4gICAgY2FzZSBcInNldFwiOlxyXG4gICAgICBkcmFmdFNldChjdHgsIG9wLnBhdGgsIG9wLmtleSwgb3AudmFsdWUpXHJcbiAgICAgIGJyZWFrXHJcbiAgICBjYXNlIFwiZGVsZXRlXCI6XHJcbiAgICAgIGRyYWZ0RGVsZXRlKGN0eCwgb3AucGF0aCwgb3Aua2V5KVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSBcInNwbGljZVwiOlxyXG4gICAgICBkcmFmdFNwbGljZShjdHgsIG9wLnBhdGgsIG9wLmluZGV4LCBvcC5kZWxldGVDb3VudCwgb3AuaW5zZXJ0cylcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgXCJhZGRUb1NldFwiOlxyXG4gICAgICBkcmFmdEFkZFRvU2V0KGN0eCwgb3AucGF0aCwgb3AudmFsdWUpXHJcbiAgICAgIGJyZWFrXHJcbiAgICBjYXNlIFwiZGVsZXRlRnJvbVNldFwiOlxyXG4gICAgICBkcmFmdERlbGV0ZUZyb21TZXQoY3R4LCBvcC5wYXRoLCBvcC52YWx1ZSlcclxuICAgICAgYnJlYWtcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIHRocm93IGZhaWx1cmUoYFVua25vd24gb3BlcmF0aW9uIGtpbmQ6ICR7KG9wIGFzIGFueSkua2luZH1gKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEFwcGxpZXMgYSBzaW5nbGUgdHJhbnNhY3Rpb24gdG8gYSBiYXNlIHN0YXRlIGltbXV0YWJseS5cclxuICpcclxuICogS2V5IGJlbmVmaXRzIG92ZXIgTXV0YXRpdmUvSW1tZXI6XHJcbiAqIC0gTm8gcHJveHkgb3ZlcmhlYWQgLSBkaXJlY3Qgb2JqZWN0IGFjY2VzcyBhbmQgY29weS1vbi13cml0ZSBjbG9uaW5nXHJcbiAqIC0gU3RydWN0dXJhbCBzaGFyaW5nIC0gdW5jaGFuZ2VkIHN1YnRyZWVzIGtlZXAgdGhlaXIgcmVmZXJlbmNlc1xyXG4gKiAtIFplcm8tY29weSBvbiBmYWlsdXJlIC0gaWYgdmFsaWRhdGlvbiBmYWlscywgcmV0dXJucyBvcmlnaW5hbCBiYXNlIHVuY2hhbmdlZFxyXG4gKlxyXG4gKiBAcGFyYW0gYmFzZSAtIFRoZSBiYXNlIHN0YXRlIChuZXZlciBtdXRhdGVkKVxyXG4gKiBAcGFyYW0gdHggLSBUaGUgdHJhbnNhY3Rpb24gdG8gYXBwbHlcclxuICogQHBhcmFtIHZhbGlkYXRlRm4gLSBPcHRpb25hbCB2YWxpZGF0aW9uIGZ1bmN0aW9uXHJcbiAqIEByZXR1cm5zIFRoZSBmaW5hbCBzdGF0ZSAoaWYgdmFsaWQpIG9yIHRoZSBvcmlnaW5hbCBiYXNlIChpZiBpbnZhbGlkIG9yIGVtcHR5KVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5VHhJbW11dGFibGU8VCBleHRlbmRzIEpTT05PYmplY3Q+KFxyXG4gIGJhc2U6IFQsXHJcbiAgdHg6IFBpY2s8VHhSZWNvcmQsIFwib3BzXCI+LFxyXG4gIHZhbGlkYXRlRm4/OiBWYWxpZGF0ZUZuPFQ+XHJcbik6IFQge1xyXG4gIGlmICh0eC5vcHMubGVuZ3RoID09PSAwKSByZXR1cm4gYmFzZVxyXG5cclxuICBjb25zdCBjdHggPSBjcmVhdGVEcmFmdChiYXNlKVxyXG5cclxuICB0cnkge1xyXG4gICAgZm9yIChjb25zdCBvcCBvZiB0eC5vcHMpIHtcclxuICAgICAgYXBwbHlPcFRvRHJhZnQoY3R4LCBvcClcclxuICAgIH1cclxuXHJcbiAgICBpZiAodmFsaWRhdGVGbiAmJiAhdmFsaWRhdGVGbihjdHgucm9vdCkpIHtcclxuICAgICAgcmV0dXJuIGJhc2VcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY3R4LnJvb3RcclxuICB9IGNhdGNoIHtcclxuICAgIHJldHVybiBiYXNlXHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi9lcnJvclwiXG5pbXBvcnQgeyBKU09OUmVjb3JkLCBKU09OVmFsdWUsIFBhdGggfSBmcm9tIFwiLi9qc29uXCJcbmltcG9ydCB7IE9wIH0gZnJvbSBcIi4vb3BlcmF0aW9uc1wiXG5cbi8qKlxuICogUmVjb25jaWxlcyB0aGUgY3VycmVudCBzdGF0ZSB3aXRoIHRoZSB0YXJnZXQgc3RhdGUgYnkgY29tcHV0aW5nIGFuZCBlbWl0dGluZ1xuICogdGhlIG1pbmltYWwgc2V0IG9mIG9wZXJhdGlvbnMgbmVlZGVkIHRvIHRyYW5zZm9ybSBjdXJyZW50U3RhdGUgaW50byB0YXJnZXRTdGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVSZWNvbmNpbGVPcHMoY3VycmVudFN0YXRlOiBKU09OVmFsdWUsIHRhcmdldFN0YXRlOiBKU09OVmFsdWUpOiBPcFtdIHtcbiAgY29uc3Qgb3BzOiBPcFtdID0gW11cbiAgZGlmZlZhbHVlKGN1cnJlbnRTdGF0ZSwgdGFyZ2V0U3RhdGUsIFtdLCBvcHMpXG4gIHJldHVybiBvcHNcbn1cblxuZnVuY3Rpb24gZGlmZlZhbHVlKGN1cnJlbnQ6IEpTT05WYWx1ZSwgdGFyZ2V0OiBKU09OVmFsdWUsIHBhdGg6IFBhdGgsIG9wczogT3BbXSk6IHZvaWQge1xuICAvLyAxLiBSZWZlcmVuY2UgZXF1YWxpdHkgKHN0cnVjdHVyYWwgc2hhcmluZylcbiAgaWYgKGN1cnJlbnQgPT09IHRhcmdldCkgcmV0dXJuXG5cbiAgLy8gMi4gSGFuZGxlIHByaW1pdGl2ZXMgYW5kIG51bGwgcXVpY2tseVxuICBjb25zdCBjdXJyZW50VHlwZSA9IHR5cGVvZiBjdXJyZW50XG4gIGNvbnN0IHRhcmdldFR5cGUgPSB0eXBlb2YgdGFyZ2V0XG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgdGFyZ2V0ID09PSBudWxsIHx8IGN1cnJlbnRUeXBlICE9PSBcIm9iamVjdFwiIHx8IHRhcmdldFR5cGUgIT09IFwib2JqZWN0XCIpIHtcbiAgICAvLyBBdCBsZWFzdCBvbmUgaXMgcHJpbWl0aXZlL251bGwsIG9yIHR5cGVzIGRvbid0IG1hdGNoXG4gICAgZW1pdFJlcGxhY2UocGF0aCwgdGFyZ2V0LCBvcHMpXG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBCb3RoIGFyZSBvYmplY3RzIChvYmplY3Qgb3IgYXJyYXkpXG4gIGNvbnN0IGN1cnJlbnRJc0FycmF5ID0gQXJyYXkuaXNBcnJheShjdXJyZW50KVxuICBjb25zdCB0YXJnZXRJc0FycmF5ID0gQXJyYXkuaXNBcnJheSh0YXJnZXQpXG5cbiAgaWYgKGN1cnJlbnRJc0FycmF5ICE9PSB0YXJnZXRJc0FycmF5KSB7XG4gICAgLy8gVHlwZSBtaXNtYXRjaCAob25lIGFycmF5LCBvbmUgb2JqZWN0KVxuICAgIGVtaXRSZXBsYWNlKHBhdGgsIHRhcmdldCwgb3BzKVxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKGN1cnJlbnRJc0FycmF5KSB7XG4gICAgZGlmZkFycmF5KGN1cnJlbnQsIHRhcmdldCBhcyBKU09OVmFsdWVbXSwgcGF0aCwgb3BzKVxuICB9IGVsc2Uge1xuICAgIGRpZmZPYmplY3QoY3VycmVudCBhcyBKU09OUmVjb3JkLCB0YXJnZXQgYXMgSlNPTlJlY29yZCwgcGF0aCwgb3BzKVxuICB9XG59XG5cbmZ1bmN0aW9uIGRpZmZPYmplY3QoY3VycmVudDogSlNPTlJlY29yZCwgdGFyZ2V0OiBKU09OUmVjb3JkLCBwYXRoOiBQYXRoLCBvcHM6IE9wW10pOiB2b2lkIHtcbiAgLy8gMS4gRGVsZXRlIGtleXMgaW4gY3VycmVudCBidXQgbm90IGluIHRhcmdldFxuICBmb3IgKGNvbnN0IGtleSBpbiBjdXJyZW50KSB7XG4gICAgaWYgKE9iamVjdC5oYXNPd24oY3VycmVudCwga2V5KSAmJiAhT2JqZWN0Lmhhc093bih0YXJnZXQsIGtleSkpIHtcbiAgICAgIG9wcy5wdXNoKHsga2luZDogXCJkZWxldGVcIiwgcGF0aCwga2V5IH0pXG4gICAgfVxuICB9XG5cbiAgLy8gMi4gQWRkL1VwZGF0ZSBrZXlzIGluIHRhcmdldFxuICBmb3IgKGNvbnN0IGtleSBpbiB0YXJnZXQpIHtcbiAgICBpZiAoT2JqZWN0Lmhhc093bih0YXJnZXQsIGtleSkpIHtcbiAgICAgIGNvbnN0IHRhcmdldFZhbCA9IHRhcmdldFtrZXldXG4gICAgICBpZiAoIU9iamVjdC5oYXNPd24oY3VycmVudCwga2V5KSkge1xuICAgICAgICBvcHMucHVzaCh7IGtpbmQ6IFwic2V0XCIsIHBhdGgsIGtleSwgdmFsdWU6IHRhcmdldFZhbCB9KVxuICAgICAgfSBlbHNlIGlmIChjdXJyZW50W2tleV0gIT09IHRhcmdldFZhbCkge1xuICAgICAgICAvLyBPbmx5IHJlY3Vyc2UgaWYgdmFsdWVzIGRpZmZlciAocmVmZXJlbmNlIGNoZWNrIGZpcnN0KVxuICAgICAgICBkaWZmVmFsdWUoY3VycmVudFtrZXldLCB0YXJnZXRWYWwsIFsuLi5wYXRoLCBrZXldLCBvcHMpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRpZmZBcnJheShjdXJyZW50OiBKU09OVmFsdWVbXSwgdGFyZ2V0OiBKU09OVmFsdWVbXSwgcGF0aDogUGF0aCwgb3BzOiBPcFtdKTogdm9pZCB7XG4gIGNvbnN0IGN1cnJlbnRMZW4gPSBjdXJyZW50Lmxlbmd0aFxuICBjb25zdCB0YXJnZXRMZW4gPSB0YXJnZXQubGVuZ3RoXG4gIGNvbnN0IG1pbkxlbiA9IGN1cnJlbnRMZW4gPCB0YXJnZXRMZW4gPyBjdXJyZW50TGVuIDogdGFyZ2V0TGVuXG5cbiAgLy8gRGlmZiBjb21tb24gZWxlbWVudHNcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtaW5MZW47IGkrKykge1xuICAgIGlmIChjdXJyZW50W2ldICE9PSB0YXJnZXRbaV0pIHtcbiAgICAgIGRpZmZWYWx1ZShjdXJyZW50W2ldLCB0YXJnZXRbaV0sIFsuLi5wYXRoLCBpXSwgb3BzKVxuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSBsZW5ndGggZGlmZmVyZW5jZVxuICBpZiAodGFyZ2V0TGVuID4gY3VycmVudExlbikge1xuICAgIG9wcy5wdXNoKHtcbiAgICAgIGtpbmQ6IFwic3BsaWNlXCIsXG4gICAgICBwYXRoLFxuICAgICAgaW5kZXg6IGN1cnJlbnRMZW4sXG4gICAgICBkZWxldGVDb3VudDogMCxcbiAgICAgIGluc2VydHM6IHRhcmdldC5zbGljZShjdXJyZW50TGVuKSxcbiAgICB9KVxuICB9IGVsc2UgaWYgKGN1cnJlbnRMZW4gPiB0YXJnZXRMZW4pIHtcbiAgICBvcHMucHVzaCh7XG4gICAgICBraW5kOiBcInNwbGljZVwiLFxuICAgICAgcGF0aCxcbiAgICAgIGluZGV4OiB0YXJnZXRMZW4sXG4gICAgICBkZWxldGVDb3VudDogY3VycmVudExlbiAtIHRhcmdldExlbixcbiAgICAgIGluc2VydHM6IFtdLFxuICAgIH0pXG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdFJlcGxhY2UocGF0aDogUGF0aCwgdmFsdWU6IEpTT05WYWx1ZSwgb3BzOiBPcFtdKTogdm9pZCB7XG4gIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIENhbm5vdCByZXBsYWNlIHJvb3QgZGlyZWN0bHkgdmlhIE9wcyAodW5sZXNzIHdlIGRlZmluZSBhICdyb290JyBvcCwgd2hpY2ggd2UgZG9uJ3QpXG4gICAgLy8gV2UgZXhwZWN0IHJvb3QgdG8gYmUgaGFuZGxlZCBieSBkaWZmT2JqZWN0IHVzdWFsbHkuXG4gICAgLy8gSWYgd2UgbGFuZCBoZXJlLCBpdCBtZWFucyByb290IHR5cGVzIG1pc21hdGNoZWQgKGUuZy4gT2JqIC0+IEFycmF5KS5cbiAgICBmYWlsdXJlKFwiU3RhdGVTeW5jTG9nOiBDYW5ub3QgcmVwbGFjZSByb290IHN0YXRlIGRpcmVjdGx5IHZpYSBPcHMuXCIpXG4gIH1cblxuICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5zbGljZSgwLCAtMSlcbiAgY29uc3Qga2V5VG9DaGVjayA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXVxuXG4gIGlmICh0eXBlb2Yga2V5VG9DaGVjayA9PT0gXCJzdHJpbmdcIikge1xuICAgIC8vIFBhcmVudCBpcyBPYmplY3RcbiAgICBvcHMucHVzaCh7IGtpbmQ6IFwic2V0XCIsIHBhdGg6IHBhcmVudFBhdGgsIGtleToga2V5VG9DaGVjaywgdmFsdWUgfSlcbiAgfSBlbHNlIHtcbiAgICAvLyBQYXJlbnQgaXMgQXJyYXlcbiAgICBvcHMucHVzaCh7XG4gICAgICBraW5kOiBcInNwbGljZVwiLFxuICAgICAgcGF0aDogcGFyZW50UGF0aCxcbiAgICAgIGluZGV4OiBrZXlUb0NoZWNrLFxuICAgICAgZGVsZXRlQ291bnQ6IDEsXG4gICAgICBpbnNlcnRzOiBbdmFsdWVdLFxuICAgIH0pXG4gIH1cbn1cbiIsImltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi9lcnJvclwiXG5cbi8qKlxuICogUGFyc2VkIHR4IHRpbWVzdGFtcCBjb21wb25lbnRzLlxuICovXG5leHBvcnQgdHlwZSBUeFRpbWVzdGFtcCA9IHtcbiAgZXBvY2g6IG51bWJlclxuICBjbG9jazogbnVtYmVyXG4gIGNsaWVudElkOiBzdHJpbmdcbiAgd2FsbENsb2NrOiBudW1iZXJcbn1cblxuLyoqXG4gKiBVbmlxdWUgdHggSUQgKENvbXBvc2l0ZSBLZXkpLlxuICovXG5leHBvcnQgdHlwZSBUeFRpbWVzdGFtcEtleSA9IHN0cmluZ1xuXG4vKipcbiAqIENvbnZlcnRzIGEgdGltZXN0YW1wIG9iamVjdCB0byBhIFRyYW5zYWN0aW9uVGltZXN0YW1wS2V5IHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR4VGltZXN0YW1wVG9LZXkodHM6IFR4VGltZXN0YW1wKTogVHhUaW1lc3RhbXBLZXkge1xuICByZXR1cm4gYCR7dHMuZXBvY2h9OyR7dHMuY2xvY2t9OyR7dHMuY2xpZW50SWR9OyR7dHMud2FsbENsb2NrfWBcbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gcGFyc2UgdHggdGltZXN0YW1wIGtleXMuXG4gKiBUaHJvd3MgaWYga2V5IGlzIG1hbGZvcm1lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVHhUaW1lc3RhbXBLZXkoa2V5OiBUeFRpbWVzdGFtcEtleSk6IFR4VGltZXN0YW1wIHtcbiAgY29uc3QgaTEgPSBrZXkuaW5kZXhPZihcIjtcIilcbiAgY29uc3QgaTIgPSBrZXkuaW5kZXhPZihcIjtcIiwgaTEgKyAxKVxuICBjb25zdCBpMyA9IGtleS5pbmRleE9mKFwiO1wiLCBpMiArIDEpXG5cbiAgaWYgKGkxID09PSAtMSB8fCBpMiA9PT0gLTEgfHwgaTMgPT09IC0xKSB7XG4gICAgZmFpbHVyZShgTWFsZm9ybWVkIHRpbWVzdGFtcCBrZXk6ICR7a2V5fWApXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGVwb2NoOiBOdW1iZXIucGFyc2VJbnQoa2V5LnN1YnN0cmluZygwLCBpMSksIDEwKSxcbiAgICBjbG9jazogTnVtYmVyLnBhcnNlSW50KGtleS5zdWJzdHJpbmcoaTEgKyAxLCBpMiksIDEwKSxcbiAgICBjbGllbnRJZDoga2V5LnN1YnN0cmluZyhpMiArIDEsIGkzKSxcbiAgICB3YWxsQ2xvY2s6IE51bWJlci5wYXJzZUludChrZXkuc3Vic3RyaW5nKGkzICsgMSksIDEwKSxcbiAgfVxufVxuXG4vKipcbiAqIENvbXBhcmVzIHR3byB0eCB0aW1lc3RhbXBzIGZvciBkZXRlcm1pbmlzdGljIG9yZGVyaW5nLlxuICogU29ydCBvcmRlcjogZXBvY2ggKGFzYykg4oaSIGNsb2NrIChhc2MpIOKGkiBjbGllbnRJZCAoYXNjKVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZVR4VGltZXN0YW1wcyhhOiBUeFRpbWVzdGFtcCwgYjogVHhUaW1lc3RhbXApOiBudW1iZXIge1xuICBpZiAoYS5lcG9jaCAhPT0gYi5lcG9jaCkgcmV0dXJuIGEuZXBvY2ggLSBiLmVwb2NoXG4gIGlmIChhLmNsb2NrICE9PSBiLmNsb2NrKSByZXR1cm4gYS5jbG9jayAtIGIuY2xvY2tcbiAgaWYgKGEuY2xpZW50SWQgPCBiLmNsaWVudElkKSByZXR1cm4gLTFcbiAgaWYgKGEuY2xpZW50SWQgPiBiLmNsaWVudElkKSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuIiwiaW1wb3J0IHR5cGUgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuL2Vycm9yXCJcbmltcG9ydCB7IFR4UmVjb3JkIH0gZnJvbSBcIi4vVHhSZWNvcmRcIlxuaW1wb3J0IHsgcGFyc2VUeFRpbWVzdGFtcEtleSwgdHlwZSBUeFRpbWVzdGFtcCwgdHlwZSBUeFRpbWVzdGFtcEtleSB9IGZyb20gXCIuL3R4VGltZXN0YW1wXCJcblxuLyoqXG4gKiBBIGNhY2hlZCB0eCBlbnRyeSB3aXRoIGxhenkgcGFyc2luZyBhbmQgb3B0aW9uYWwgdHggY2FjaGluZy5cbiAqIFRoZSB0aW1lc3RhbXAgaXMgcGFyc2VkIG9uIGZpcnN0IGFjY2VzcyBhbmQgY2FjaGVkLlxuICogVGhlIHR4IHJlY29yZCBjYW4gYmUgZmV0Y2hlZCBsYXppbHkgYW5kIGNhY2hlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNvcnRlZFR4RW50cnkge1xuICBwcml2YXRlIF90eFRpbWVzdGFtcD86IFR4VGltZXN0YW1wXG4gIHByaXZhdGUgX29yaWdpbmFsVHhUaW1lc3RhbXBLZXk/OiBUeFRpbWVzdGFtcEtleSB8IG51bGxcbiAgcHJpdmF0ZSBfb3JpZ2luYWxUeFRpbWVzdGFtcD86IFR4VGltZXN0YW1wIHwgbnVsbFxuICBwcml2YXRlIF90eFJlY29yZD86IFR4UmVjb3JkXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgdHhUaW1lc3RhbXBLZXk6IFR4VGltZXN0YW1wS2V5LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3lUeDogWS5NYXA8VHhSZWNvcmQ+XG4gICkge31cblxuICAvKipcbiAgICogR2V0cyB0aGUgcGFyc2VkIHRpbWVzdGFtcCwgbGF6aWx5IHBhcnNpbmcgYW5kIGNhY2hpbmcgb24gZmlyc3QgYWNjZXNzLlxuICAgKi9cbiAgZ2V0IHR4VGltZXN0YW1wKCk6IFR4VGltZXN0YW1wIHtcbiAgICBpZiAoIXRoaXMuX3R4VGltZXN0YW1wKSB7XG4gICAgICB0aGlzLl90eFRpbWVzdGFtcCA9IHBhcnNlVHhUaW1lc3RhbXBLZXkodGhpcy50eFRpbWVzdGFtcEtleSlcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3R4VGltZXN0YW1wXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgb3JpZ2luYWwgdHggdGltZXN0YW1wIGtleSwgbGF6aWx5IGFuZCBjYWNoaW5nIG9uIGZpcnN0IGFjY2Vzcy5cbiAgICovXG4gIGdldCBvcmlnaW5hbFR4VGltZXN0YW1wS2V5KCk6IFR4VGltZXN0YW1wS2V5IHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuX29yaWdpbmFsVHhUaW1lc3RhbXBLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdHggPSB0aGlzLnR4UmVjb3JkXG4gICAgICB0aGlzLl9vcmlnaW5hbFR4VGltZXN0YW1wS2V5ID0gdHgub3JpZ2luYWxUeEtleSA/PyBudWxsXG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9vcmlnaW5hbFR4VGltZXN0YW1wS2V5XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgcGFyc2VkIG9yaWdpbmFsIHR4IHRpbWVzdGFtcCwgbGF6aWx5IHBhcnNpbmcgYW5kIGNhY2hpbmcgb24gZmlyc3QgYWNjZXNzLlxuICAgKi9cbiAgZ2V0IG9yaWdpbmFsVHhUaW1lc3RhbXAoKTogVHhUaW1lc3RhbXAgfCBudWxsIHtcbiAgICBpZiAodGhpcy5fb3JpZ2luYWxUeFRpbWVzdGFtcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLm9yaWdpbmFsVHhUaW1lc3RhbXBLZXlcbiAgICAgIHRoaXMuX29yaWdpbmFsVHhUaW1lc3RhbXAgPSBrZXkgPyBwYXJzZVR4VGltZXN0YW1wS2V5KGtleSkgOiBudWxsXG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9vcmlnaW5hbFR4VGltZXN0YW1wXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbG9naWNhbCAoZGVkdXBsaWNhdGVkKSB0eCB0aW1lc3RhbXAga2V5LlxuICAgKiBUaGlzIGlzIHRoZSBvcmlnaW5hbCB0eCBrZXkgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgdGhlIHBoeXNpY2FsIGtleS5cbiAgICovXG4gIGdldCBkZWR1cFR4VGltZXN0YW1wS2V5KCk6IFR4VGltZXN0YW1wS2V5IHtcbiAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFR4VGltZXN0YW1wS2V5ID8/IHRoaXMudHhUaW1lc3RhbXBLZXlcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsb2dpY2FsIChkZWR1cGxpY2F0ZWQpIHBhcnNlZCB0eCB0aW1lc3RhbXAuXG4gICAqIFRoaXMgaXMgdGhlIG9yaWdpbmFsIHR4IHRpbWVzdGFtcCBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSB0aGUgcGh5c2ljYWwgdGltZXN0YW1wLlxuICAgKi9cbiAgZ2V0IGRlZHVwVHhUaW1lc3RhbXAoKTogVHhUaW1lc3RhbXAge1xuICAgIHJldHVybiB0aGlzLm9yaWdpbmFsVHhUaW1lc3RhbXAgPz8gdGhpcy50eFRpbWVzdGFtcFxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHR4IHJlY29yZCwgbGF6aWx5IGZldGNoaW5nIGFuZCBjYWNoaW5nIG9uIGZpcnN0IGFjY2Vzcy5cbiAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIHR4IGRvZXNuJ3QgZXhpc3QuXG4gICAqL1xuICBnZXQgdHhSZWNvcmQoKTogVHhSZWNvcmQge1xuICAgIGlmICghdGhpcy5fdHhSZWNvcmQpIHtcbiAgICAgIHRoaXMuX3R4UmVjb3JkID0gdGhpcy5feVR4LmdldCh0aGlzLnR4VGltZXN0YW1wS2V5KVxuICAgICAgaWYgKCF0aGlzLl90eFJlY29yZCkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKGBTb3J0ZWRUeEVudHJ5OiBUeFJlY29yZCBub3QgZm91bmQgZm9yIGtleSAke3RoaXMudHhUaW1lc3RhbXBLZXl9YClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3R4UmVjb3JkXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IHR5cGUgQ2hlY2twb2ludFJlY29yZCwgdHlwZSBDbGllbnRXYXRlcm1hcmtzIH0gZnJvbSBcIi4vY2hlY2twb2ludHNcIlxuaW1wb3J0IHsgYXBwbHlUeEltbXV0YWJsZSB9IGZyb20gXCIuL2RyYWZ0XCJcbmltcG9ydCB7IEpTT05PYmplY3QgfSBmcm9tIFwiLi9qc29uXCJcbmltcG9ydCB7IE9wLCBWYWxpZGF0ZUZuIH0gZnJvbSBcIi4vb3BlcmF0aW9uc1wiXG5pbXBvcnQgeyBjb21wdXRlUmVjb25jaWxlT3BzIH0gZnJvbSBcIi4vcmVjb25jaWxlXCJcbmltcG9ydCB7IFNvcnRlZFR4RW50cnkgfSBmcm9tIFwiLi9Tb3J0ZWRUeEVudHJ5XCJcbmltcG9ydCB7IFR4UmVjb3JkIH0gZnJvbSBcIi4vVHhSZWNvcmRcIlxuaW1wb3J0IHsgY29tcGFyZVR4VGltZXN0YW1wcywgdHlwZSBUeFRpbWVzdGFtcCwgdHlwZSBUeFRpbWVzdGFtcEtleSB9IGZyb20gXCIuL3R4VGltZXN0YW1wXCJcbmltcG9ydCB7IGxhenkgfSBmcm9tIFwiLi91dGlsc1wiXG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgdHJhbnNhY3Rpb24gaXMgY292ZXJlZCBieSB0aGUgY2hlY2twb2ludCB3YXRlcm1hcmtzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNUcmFuc2FjdGlvbkluQ2hlY2twb2ludCh0czogVHhUaW1lc3RhbXAsIHdhdGVybWFya3M6IENsaWVudFdhdGVybWFya3MpOiBib29sZWFuIHtcbiAgY29uc3Qgd20gPSB3YXRlcm1hcmtzW3RzLmNsaWVudElkXVxuICBpZiAoIXdtKSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIHRzLmNsb2NrIDw9IHdtLm1heENsb2NrXG59XG5cbi8qKlxuICogU3RhdGVDYWxjdWxhdG9yIGVuY2Fwc3VsYXRlcyB0aGUgc29ydGVkIHRyYW5zYWN0aW9uIGNhY2hlIGFuZCBzdGF0ZSBjYWxjdWxhdGlvbiBsb2dpYy5cbiAqXG4gKiBJdCBtYWludGFpbnM6XG4gKiAtIEEgc29ydGVkIGFycmF5IG9mIHRyYW5zYWN0aW9uIGVudHJpZXNcbiAqIC0gQSBtYXAgZm9yIE8oMSkgbG9va3VwXG4gKiAtIEEgdHJhY2tpbmcgaW5kZXggaW5kaWNhdGluZyB1cCB0byB3aGljaCB0eCB0aGUgc3RhdGUgaGFzIGJlZW4gY2FsY3VsYXRlZFxuICogLSBUaGUgY2FjaGVkIGNhbGN1bGF0ZWQgc3RhdGVcbiAqIC0gVGhlIGJhc2UgY2hlY2twb2ludFxuICpcbiAqIFRoZSB0cmFja2luZyBpbmRleCBpcyBpbnZhbGlkYXRlZCAoc2V0IHRvIG51bGwpIHdoZW46XG4gKiAtIEEgdHJhbnNhY3Rpb24gaXMgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBhbHJlYWR5LWNhbGN1bGF0ZWQgc2xpY2VcbiAqIC0gQSB0cmFuc2FjdGlvbiBpcyBkZWxldGVkIGZyb20gdGhlIGFscmVhZHktY2FsY3VsYXRlZCBzbGljZVxuICogLSBUaGUgYmFzZSBjaGVja3BvaW50IGNoYW5nZXNcbiAqL1xuZXhwb3J0IGNsYXNzIFN0YXRlQ2FsY3VsYXRvciB7XG4gIC8qKiBTb3J0ZWQgdHggY2FjaGUgKEFMTCBhY3RpdmUvZnV0dXJlIHR4cywga2VwdCBzb3J0ZWQgYnkgdGltZXN0YW1wKSAqL1xuICBwcml2YXRlIHNvcnRlZFR4czogU29ydGVkVHhFbnRyeVtdID0gW11cblxuICAvKiogTygxKSBleGlzdGVuY2UgY2hlY2sgYW5kIGxvb2t1cCAqL1xuICBwcml2YXRlIHNvcnRlZFR4c01hcDogTWFwPFR4VGltZXN0YW1wS2V5LCBTb3J0ZWRUeEVudHJ5PiA9IG5ldyBNYXAoKVxuXG4gIC8qKlxuICAgKiBJbmRleCBvZiB0aGUgbGFzdCB0cmFuc2FjdGlvbiBhcHBsaWVkIHRvIGNhY2hlZFN0YXRlLlxuICAgKiAtIG51bGw6IHN0YXRlIG5lZWRzIGZ1bGwgcmVjYWxjdWxhdGlvbiBmcm9tIGNoZWNrcG9pbnRcbiAgICogLSAtMTogbm8gdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBhcHBsaWVkIHlldCAoc3RhdGUgPT09IGNoZWNrcG9pbnQgc3RhdGUpXG4gICAqIC0gPj0gMDogdHJhbnNhY3Rpb25zIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhpcyBpbmRleCBoYXZlIGJlZW4gYXBwbGllZFxuICAgKi9cbiAgcHJpdmF0ZSBsYXN0QXBwbGllZEluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbFxuXG4gIC8qKiBUaGUgY2FjaGVkIGNhbGN1bGF0ZWQgc3RhdGUgKi9cbiAgcHJpdmF0ZSBjYWNoZWRTdGF0ZTogSlNPTk9iamVjdCB8IG51bGwgPSBudWxsXG5cbiAgLyoqIFRoZSBiYXNlIGNoZWNrcG9pbnQgdG8gY2FsY3VsYXRlIHN0YXRlIGZyb20gKi9cbiAgcHJpdmF0ZSBiYXNlQ2hlY2twb2ludDogQ2hlY2twb2ludFJlY29yZCB8IG51bGwgPSBudWxsXG5cbiAgLyoqXG4gICAqIEFwcGxpZWQgZGVkdXAga2V5cyAtIHRyYWNrcyB3aGljaCBMT0dJQ0FMIHR4cyBoYXZlIGJlZW4gYXBwbGllZC5cbiAgICogVGhpcyBpcyB0aGUgb3JpZ2luYWxUeEtleSAob3IgcGh5c2ljYWwga2V5IGlmIG5vIG9yaWdpbmFsKSBmb3IgZWFjaCBhcHBsaWVkIHR4LlxuICAgKiBVc2VkIHRvIHByb3Blcmx5IGRlZHVwbGljYXRlIHJlLWVtaXRzLlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBsaWVkVHhLZXlzOiBTZXQ8VHhUaW1lc3RhbXBLZXk+ID0gbmV3IFNldCgpXG5cbiAgLyoqIE1heCBjbG9jayBzZWVuIGZyb20gYW55IHRyYW5zYWN0aW9uIChmb3IgTGFtcG9ydCBjbG9jayB1cGRhdGVzKSAqL1xuICBwcml2YXRlIG1heFNlZW5DbG9jayA9IDBcblxuICAvKiogVmFsaWRhdGlvbiBmdW5jdGlvbiAob3B0aW9uYWwpICovXG4gIHByaXZhdGUgdmFsaWRhdGVGbj86IFZhbGlkYXRlRm48SlNPTk9iamVjdD5cblxuICBjb25zdHJ1Y3Rvcih2YWxpZGF0ZUZuPzogVmFsaWRhdGVGbjxKU09OT2JqZWN0Pikge1xuICAgIHRoaXMudmFsaWRhdGVGbiA9IHZhbGlkYXRlRm5cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBiYXNlIGNoZWNrcG9pbnQuIEludmFsaWRhdGVzIGNhY2hlZCBzdGF0ZSBpZiBjaGVja3BvaW50IGNoYW5nZWQuXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGNoZWNrcG9pbnQgY2hhbmdlZFxuICAgKi9cbiAgc2V0QmFzZUNoZWNrcG9pbnQoY2hlY2twb2ludDogQ2hlY2twb2ludFJlY29yZCB8IG51bGwpOiBib29sZWFuIHtcbiAgICBpZiAoY2hlY2twb2ludCA9PT0gdGhpcy5iYXNlQ2hlY2twb2ludCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgdGhpcy5iYXNlQ2hlY2twb2ludCA9IGNoZWNrcG9pbnRcbiAgICB0aGlzLmludmFsaWRhdGUoKVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBiYXNlIGNoZWNrcG9pbnQuXG4gICAqL1xuICBnZXRCYXNlQ2hlY2twb2ludCgpOiBDaGVja3BvaW50UmVjb3JkIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZUNoZWNrcG9pbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgYWxsIHRyYW5zYWN0aW9ucyBhbmQgcmVidWlsZHMgZnJvbSB5VHggbWFwLlxuICAgKiBUaGlzIGlzIHVzZWQgd2hlbiB0aGUgY2hlY2twb2ludCBjaGFuZ2VzIGFuZCB3ZSBuZWVkIGEgZnJlc2ggc3RhcnQuXG4gICAqL1xuICByZWJ1aWxkRnJvbVlqcyh5VHg6IFkuTWFwPFR4UmVjb3JkPik6IHZvaWQge1xuICAgIHRoaXMuc29ydGVkVHhzID0gW11cbiAgICB0aGlzLnNvcnRlZFR4c01hcC5jbGVhcigpXG5cbiAgICAvLyBDb2xsZWN0IGFsbCBlbnRyaWVzLCBidWlsZCB0aGUgbWFwIGFuZCBtYXggY2xvY2tcbiAgICBmb3IgKGNvbnN0IGtleSBvZiB5VHgua2V5cygpKSB7XG4gICAgICBjb25zdCBlbnRyeSA9IG5ldyBTb3J0ZWRUeEVudHJ5KGtleSwgeVR4KVxuICAgICAgdGhpcy5zb3J0ZWRUeHMucHVzaChlbnRyeSlcblxuICAgICAgdGhpcy5zb3J0ZWRUeHNNYXAuc2V0KGVudHJ5LnR4VGltZXN0YW1wS2V5LCBlbnRyeSlcbiAgICAgIGlmIChlbnRyeS50eFRpbWVzdGFtcC5jbG9jayA+IHRoaXMubWF4U2VlbkNsb2NrKSB7XG4gICAgICAgIHRoaXMubWF4U2VlbkNsb2NrID0gZW50cnkudHhUaW1lc3RhbXAuY2xvY2tcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTb3J0IG9uY2UgLSBPKG4gbG9nIG4pXG4gICAgdGhpcy5zb3J0ZWRUeHMuc29ydCgoYSwgYikgPT4gY29tcGFyZVR4VGltZXN0YW1wcyhhLnR4VGltZXN0YW1wLCBiLnR4VGltZXN0YW1wKSlcblxuICAgIC8vIEludmFsaWRhdGUgY2FjaGVkIHN0YXRlIHNpbmNlIHdlIHJlYnVpbHRcbiAgICB0aGlzLmludmFsaWRhdGUoKVxuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydHMgYSB0cmFuc2FjdGlvbiBpbnRvIHRoZSBzb3J0ZWQgY2FjaGUuXG4gICAqIEludmFsaWRhdGVzIGNhY2hlZCBzdGF0ZSBpZiB0aGUgdHJhbnNhY3Rpb24gd2FzIGluc2VydGVkIGJlZm9yZSB0aGUgY2FsY3VsYXRlZCBzbGljZS5cbiAgICpcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGlzIGNhdXNlZCBpbnZhbGlkYXRpb24gKG91dC1vZi1vcmRlciBpbnNlcnQpXG4gICAqL1xuICBpbnNlcnRUeChrZXk6IFR4VGltZXN0YW1wS2V5LCB5VHg6IFkuTWFwPFR4UmVjb3JkPik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnNvcnRlZFR4c01hcC5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlIC8vIEFscmVhZHkgZXhpc3RzXG4gICAgfVxuXG4gICAgY29uc3QgZW50cnkgPSBuZXcgU29ydGVkVHhFbnRyeShrZXksIHlUeClcbiAgICBjb25zdCB0cyA9IGVudHJ5LnR4VGltZXN0YW1wXG5cbiAgICAvLyBVcGRhdGUgbWF4IHNlZW4gY2xvY2sgZm9yIExhbXBvcnQgY2xvY2sgbWVjaGFuaXNtXG4gICAgaWYgKHRzLmNsb2NrID4gdGhpcy5tYXhTZWVuQ2xvY2spIHtcbiAgICAgIHRoaXMubWF4U2VlbkNsb2NrID0gdHMuY2xvY2tcbiAgICB9XG5cbiAgICBjb25zdCBzb3J0ZWRUeHMgPSB0aGlzLnNvcnRlZFR4c1xuXG4gICAgLy8gRmluZCBpbnNlcnRpb24gcG9zaXRpb24gKHNlYXJjaCBmcm9tIGVuZCBzaW5jZSBuZXcgdHhzIHR5cGljYWxseSBoYXZlIGhpZ2hlciB0aW1lc3RhbXBzKVxuICAgIGxldCBpbnNlcnRJbmRleCA9IHNvcnRlZFR4cy5sZW5ndGggLy8gRGVmYXVsdDogYXBwZW5kIGF0IGVuZFxuICAgIGZvciAobGV0IGkgPSBzb3J0ZWRUeHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nVHMgPSBzb3J0ZWRUeHNbaV0udHhUaW1lc3RhbXBcbiAgICAgIGlmIChjb21wYXJlVHhUaW1lc3RhbXBzKHRzLCBleGlzdGluZ1RzKSA+PSAwKSB7XG4gICAgICAgIGluc2VydEluZGV4ID0gaSArIDFcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgIGluc2VydEluZGV4ID0gMCAvLyBJbnNlcnQgYXQgYmVnaW5uaW5nXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5zZXJ0IGF0IHRoZSBmb3VuZCBwb3NpdGlvblxuICAgIHNvcnRlZFR4cy5zcGxpY2UoaW5zZXJ0SW5kZXgsIDAsIGVudHJ5KVxuICAgIHRoaXMuc29ydGVkVHhzTWFwLnNldChrZXksIGVudHJ5KVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBpbnZhbGlkYXRlcyBvdXIgY2FjaGVkIHN0YXRlXG4gICAgLy8gSWYgd2UgaW5zZXJ0ZWQgYmVmb3JlIG9yIGF0IHRoZSBsYXN0IGFwcGxpZWQgaW5kZXgsIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGVcbiAgICBpZiAodGhpcy5sYXN0QXBwbGllZEluZGV4ICE9PSBudWxsICYmIGluc2VydEluZGV4IDw9IHRoaXMubGFzdEFwcGxpZWRJbmRleCkge1xuICAgICAgdGhpcy5pbnZhbGlkYXRlKClcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBtdWx0aXBsZSB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgc29ydGVkIGNhY2hlLlxuICAgKiBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIGtleXMgdGhhdCB3ZXJlIGFjdHVhbGx5IHJlbW92ZWRcbiAgICovXG4gIHJlbW92ZVR4cyhrZXlzOiByZWFkb25seSBUeFRpbWVzdGFtcEtleVtdKTogbnVtYmVyIHtcbiAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgICBsZXQgcmVtb3ZlZENvdW50ID0gMFxuICAgIGxldCBtaW5SZW1vdmVkSW5kZXggPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcblxuICAgIC8vIEJ1aWxkIHNldCBvZiBrZXlzIHRvIGRlbGV0ZSBhbmQgdHJhY2sgdGhlaXIgaW5kaWNlc1xuICAgIGNvbnN0IHRvRGVsZXRlID0gbmV3IFNldDxUeFRpbWVzdGFtcEtleT4oKVxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5zb3J0ZWRUeHNNYXAuZ2V0KGtleSlcbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICB0aGlzLnNvcnRlZFR4c01hcC5kZWxldGUoa2V5KVxuICAgICAgICB0b0RlbGV0ZS5hZGQoa2V5KVxuXG4gICAgICAgIC8vIEZpbmQgaW5kZXggZm9yIGludmFsaWRhdGlvbiBjaGVja1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuc29ydGVkVHhzLmluZGV4T2YoZW50cnkpXG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEgJiYgaW5kZXggPCBtaW5SZW1vdmVkSW5kZXgpIHtcbiAgICAgICAgICBtaW5SZW1vdmVkSW5kZXggPSBpbmRleFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRvRGVsZXRlLnNpemUgPT09IDApIHJldHVybiAwXG5cbiAgICAvLyBTaW5nbGUgZm9yd2FyZCBwYXNzIHRocm91Z2ggc29ydGVkVHhzLCByZW1vdmluZyBtYXRjaGluZyBlbnRyaWVzXG4gICAgY29uc3Qgc29ydGVkVHhzID0gdGhpcy5zb3J0ZWRUeHNcbiAgICBsZXQgaSA9IDBcbiAgICB3aGlsZSAoaSA8IHNvcnRlZFR4cy5sZW5ndGggJiYgdG9EZWxldGUuc2l6ZSA+IDApIHtcbiAgICAgIGlmICh0b0RlbGV0ZS5oYXMoc29ydGVkVHhzW2ldLnR4VGltZXN0YW1wS2V5KSkge1xuICAgICAgICB0b0RlbGV0ZS5kZWxldGUoc29ydGVkVHhzW2ldLnR4VGltZXN0YW1wS2V5KVxuICAgICAgICBzb3J0ZWRUeHMuc3BsaWNlKGksIDEpXG4gICAgICAgIHJlbW92ZWRDb3VudCsrXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpKytcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGlzIGludmFsaWRhdGVzIG91ciBjYWNoZWQgc3RhdGVcbiAgICBpZiAodGhpcy5sYXN0QXBwbGllZEluZGV4ICE9PSBudWxsICYmIG1pblJlbW92ZWRJbmRleCA8PSB0aGlzLmxhc3RBcHBsaWVkSW5kZXgpIHtcbiAgICAgIHRoaXMuaW52YWxpZGF0ZSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbW92ZWRDb3VudFxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIHRyYW5zYWN0aW9uIGtleSBleGlzdHMgaW4gdGhlIGNhY2hlLlxuICAgKi9cbiAgaGFzVHgoa2V5OiBUeFRpbWVzdGFtcEtleSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNvcnRlZFR4c01hcC5oYXMoa2V5KVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSB0cmFuc2FjdGlvbiBlbnRyeSBieSBrZXkuXG4gICAqL1xuICBnZXRUeChrZXk6IFR4VGltZXN0YW1wS2V5KTogU29ydGVkVHhFbnRyeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc29ydGVkVHhzTWFwLmdldChrZXkpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbGwgc29ydGVkIHRyYW5zYWN0aW9uIGVudHJpZXMuXG4gICAqL1xuICBnZXRTb3J0ZWRUeHMoKTogcmVhZG9ubHkgU29ydGVkVHhFbnRyeVtdIHtcbiAgICByZXR1cm4gdGhpcy5zb3J0ZWRUeHNcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGluIHRoZSBjYWNoZS5cbiAgICovXG4gIGdldCB0eENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc29ydGVkVHhzLmxlbmd0aFxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3RhdGUgbmVlZHMgZnVsbCByZWNhbGN1bGF0aW9uLlxuICAgKi9cbiAgbmVlZHNGdWxsUmVjYWxjdWxhdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sYXN0QXBwbGllZEluZGV4ID09PSBudWxsXG4gIH1cblxuICAvKipcbiAgICogSW52YWxpZGF0ZXMgdGhlIGNhY2hlZCBzdGF0ZSwgZm9yY2luZyBhIGZ1bGwgcmVjYWxjdWxhdGlvbiBvbiBuZXh0IGNhbGN1bGF0ZVN0YXRlKCkuXG4gICAqIE5vdGU6IGNhY2hlZFN0YXRlIGlzIGtlcHQgc28gY29tcHV0ZVJlY29uY2lsZU9wcyBjYW4gZGlmZiBvbGQgdnMgbmV3IHN0YXRlLlxuICAgKi9cbiAgaW52YWxpZGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmxhc3RBcHBsaWVkSW5kZXggPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyBhbmQgcmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSwgYWxvbmcgd2l0aCBhIGxhenkgZ2V0dGVyIGZvciBvcHMgdGhhdCBjaGFuZ2VkIGZyb20gdGhlIHByZXZpb3VzIHN0YXRlLlxuICAgKlxuICAgKiAtIElmIGxhc3RBcHBsaWVkSW5kZXggaXMgbnVsbDogZnVsbCByZWNhbGN1bGF0aW9uIGZyb20gY2hlY2twb2ludFxuICAgKiAtIElmIGxhc3RBcHBsaWVkSW5kZXggPj0gLTE6IGluY3JlbWVudGFsIGFwcGx5IGZyb20gbGFzdEFwcGxpZWRJbmRleCArIDFcbiAgICovXG4gIGNhbGN1bGF0ZVN0YXRlKCk6IHsgc3RhdGU6IEpTT05PYmplY3Q7IGdldEFwcGxpZWRPcHM6ICgpID0+IHJlYWRvbmx5IE9wW10gfSB7XG4gICAgY29uc3QgYmFzZVN0YXRlOiBKU09OT2JqZWN0ID0gdGhpcy5iYXNlQ2hlY2twb2ludD8uc3RhdGUgPz8ge31cbiAgICBjb25zdCB3YXRlcm1hcmtzID0gdGhpcy5iYXNlQ2hlY2twb2ludD8ud2F0ZXJtYXJrcyA/PyB7fVxuICAgIGNvbnN0IGhhc1dhdGVybWFya3MgPSBPYmplY3Qua2V5cyh3YXRlcm1hcmtzKS5sZW5ndGggPiAwXG5cbiAgICBpZiAodGhpcy5sYXN0QXBwbGllZEluZGV4ID09PSBudWxsKSB7XG4gICAgICAvLyBTTE9XIFBBVEg6IEZ1bGwgcmVjYWxjdWxhdGlvblxuICAgICAgcmV0dXJuIHRoaXMuZnVsbFJlY2FsY3VsYXRpb24oYmFzZVN0YXRlLCB3YXRlcm1hcmtzLCBoYXNXYXRlcm1hcmtzKVxuICAgIH1cblxuICAgIC8vIEZBU1QgUEFUSDogSW5jcmVtZW50YWwgYXBwbHlcbiAgICByZXR1cm4gdGhpcy5pbmNyZW1lbnRhbEFwcGx5KHdhdGVybWFya3MsIGhhc1dhdGVybWFya3MpXG4gIH1cblxuICAvKipcbiAgICogRnVsbCByZWNhbGN1bGF0aW9uIG9mIHN0YXRlIGZyb20gdGhlIGJhc2UgY2hlY2twb2ludC5cbiAgICovXG4gIHByaXZhdGUgZnVsbFJlY2FsY3VsYXRpb24oXG4gICAgYmFzZVN0YXRlOiBKU09OT2JqZWN0LFxuICAgIHdhdGVybWFya3M6IENsaWVudFdhdGVybWFya3MsXG4gICAgaGFzV2F0ZXJtYXJrczogYm9vbGVhblxuICApOiB7IHN0YXRlOiBKU09OT2JqZWN0OyBnZXRBcHBsaWVkT3BzOiAoKSA9PiByZWFkb25seSBPcFtdIH0ge1xuICAgIGNvbnN0IG9sZFN0YXRlID0gdGhpcy5jYWNoZWRTdGF0ZSA/PyB7fVxuXG4gICAgLy8gUmVzZXQgdHJhY2tpbmcgZm9yIGZ1bGwgcmVjb21wdXRlXG4gICAgdGhpcy5hcHBsaWVkVHhLZXlzLmNsZWFyKClcbiAgICB0aGlzLmxhc3RBcHBsaWVkSW5kZXggPSAtMVxuICAgIHRoaXMuY2FjaGVkU3RhdGUgPSBiYXNlU3RhdGVcblxuICAgIC8vIERlbGVnYXRlIHRvIGluY3JlbWVudGFsIGFwcGx5IHRvIHJlcGxheSBhbGwgdHJhbnNhY3Rpb25zXG4gICAgLy8gV2UgaWdub3JlIHRoZSByZXR1cm5lZCBvcHMgYmVjYXVzZSB0aGV5IHJlcHJlc2VudCB0aGUgb3BlcmF0aW9ucyBhcHBsaWVkIGZyb20gdGhlIGJhc2Ugc3RhdGUsXG4gICAgLy8gd2hlcmVhcyB3ZSB3YW50IHRoZSBkaWZmIGZyb20gdGhlICpwcmV2aW91cyBjYWNoZWQgc3RhdGUqLlxuICAgIC8vIFdlIHBhc3MgcmV0dXJuT3BzPWZhbHNlIHRvIGF2b2lkIGNvbGxlY3Rpbmcgb3BzIGR1cmluZyByZXBsYXkuXG4gICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcy5pbmNyZW1lbnRhbEFwcGx5KHdhdGVybWFya3MsIGhhc1dhdGVybWFya3MsIGZhbHNlKVxuXG4gICAgLy8gTGF6eSBsb2FkIHRoZSByZWNvbmNpbGlhdGlvbiBvcHMgKGV4cGVuc2l2ZSBkaWZmKVxuICAgIGNvbnN0IGdldEFwcGxpZWRPcHMgPSBsYXp5KCgpID0+IGNvbXB1dGVSZWNvbmNpbGVPcHMob2xkU3RhdGUsIHN0YXRlKSlcblxuICAgIHJldHVybiB7IHN0YXRlLCBnZXRBcHBsaWVkT3BzIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbmNyZW1lbnRhbCBhcHBseSBvZiB0cmFuc2FjdGlvbnMgZnJvbSBsYXN0QXBwbGllZEluZGV4ICsgMS5cbiAgICogQHBhcmFtIHJldHVybk9wcyBJZiB0cnVlLCBjb2xsZWN0cyBhcHBsaWVkIHRyYW5zYWN0aW9ucyAodG8gbGF6eSBjb21wdXRlIG9wcykuIElmIGZhbHNlLCBza2lwcyBjb2xsZWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBpbmNyZW1lbnRhbEFwcGx5KFxuICAgIHdhdGVybWFya3M6IENsaWVudFdhdGVybWFya3MsXG4gICAgaGFzV2F0ZXJtYXJrczogYm9vbGVhbixcbiAgICByZXR1cm5PcHMgPSB0cnVlXG4gICk6IHsgc3RhdGU6IEpTT05PYmplY3Q7IGdldEFwcGxpZWRPcHM6ICgpID0+IHJlYWRvbmx5IE9wW10gfSB7XG4gICAgbGV0IHN0YXRlID0gdGhpcy5jYWNoZWRTdGF0ZSBhcyBKU09OT2JqZWN0XG4gICAgY29uc3QgYXBwbGllZFR4czogVHhSZWNvcmRbXSA9IFtdXG4gICAgY29uc3Qgc29ydGVkVHhzID0gdGhpcy5zb3J0ZWRUeHNcbiAgICBjb25zdCBzdGFydEluZGV4ID0gdGhpcy5sYXN0QXBwbGllZEluZGV4ISArIDFcblxuICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpIDwgc29ydGVkVHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbnRyeSA9IHNvcnRlZFR4c1tpXVxuICAgICAgY29uc3QgZGVkdXBLZXkgPSBlbnRyeS5kZWR1cFR4VGltZXN0YW1wS2V5XG5cbiAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBhcHBsaWVkIChkZWR1cGxpY2F0aW9uKVxuICAgICAgaWYgKHRoaXMuYXBwbGllZFR4S2V5cy5oYXMoZGVkdXBLZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIFNraXAgaWYgaW4gY2hlY2twb2ludFxuICAgICAgaWYgKGhhc1dhdGVybWFya3MpIHtcbiAgICAgICAgY29uc3QgZGVkdXBUcyA9IGVudHJ5LmRlZHVwVHhUaW1lc3RhbXBcbiAgICAgICAgaWYgKGlzVHJhbnNhY3Rpb25JbkNoZWNrcG9pbnQoZGVkdXBUcywgd2F0ZXJtYXJrcykpIHtcbiAgICAgICAgICB0aGlzLmFwcGxpZWRUeEtleXMuYWRkKGRlZHVwS2V5KVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgdHggPSBlbnRyeS50eFJlY29yZFxuXG4gICAgICAvLyBBcHBseSB0cmFuc2FjdGlvbiAxLWJ5LTEgdG8gYXZvaWQgZHJhZnQgY29udGV4dCBwb2xsdXRpb24gb24gdmFsaWRhdGlvbiBmYWlsdXJlXG4gICAgICBjb25zdCBuZXdTdGF0ZSA9IGFwcGx5VHhJbW11dGFibGUoc3RhdGUsIHR4LCB0aGlzLnZhbGlkYXRlRm4pXG5cbiAgICAgIGlmIChuZXdTdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgc3RhdGUgPSBuZXdTdGF0ZVxuICAgICAgICBpZiAocmV0dXJuT3BzKSB7XG4gICAgICAgICAgYXBwbGllZFR4cy5wdXNoKHR4KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXBwbGllZFR4S2V5cy5hZGQoZGVkdXBLZXkpXG4gICAgICB0aGlzLmxhc3RBcHBsaWVkSW5kZXggPSBpXG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGxhc3RBcHBsaWVkSW5kZXggdG8gZW5kIGV2ZW4gaWYgYWxsIHR4cyB3ZXJlIHNraXBwZWRcbiAgICAvLyBUaGlzIGVuc3VyZXMgd2UgZG9uJ3QgcmUtcHJvY2VzcyBza2lwcGVkIHR4cyBvbiBuZXh0IGluY3JlbWVudGFsIGFwcGx5XG4gICAgaWYgKHNvcnRlZFR4cy5sZW5ndGggPiAwICYmIHRoaXMubGFzdEFwcGxpZWRJbmRleCEgPCBzb3J0ZWRUeHMubGVuZ3RoIC0gMSkge1xuICAgICAgdGhpcy5sYXN0QXBwbGllZEluZGV4ID0gc29ydGVkVHhzLmxlbmd0aCAtIDFcbiAgICB9XG5cbiAgICB0aGlzLmNhY2hlZFN0YXRlID0gc3RhdGVcblxuICAgIC8vIExhenkgZ2V0dGVyIGZvciBvcHMgKGZsYXR0ZW5zIGFwcGxpZWQgdHhzKVxuICAgIGNvbnN0IGdldEFwcGxpZWRPcHMgPSBsYXp5KCgpID0+IHtcbiAgICAgIGNvbnN0IG9wczogT3BbXSA9IFtdXG4gICAgICBmb3IgKGNvbnN0IHR4IG9mIGFwcGxpZWRUeHMpIHtcbiAgICAgICAgb3BzLnB1c2goLi4udHgub3BzKVxuICAgICAgfVxuICAgICAgcmV0dXJuIG9wc1xuICAgIH0pXG5cbiAgICByZXR1cm4geyBzdGF0ZSwgZ2V0QXBwbGllZE9wcyB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbWF4IHNlZW4gY2xvY2sgKGZvciBMYW1wb3J0IGNsb2NrIHVwZGF0ZXMpLlxuICAgKi9cbiAgZ2V0TWF4U2VlbkNsb2NrKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubWF4U2VlbkNsb2NrXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBjYWNoZWQgc3RhdGUgd2l0aG91dCByZWNhbGN1bGF0aW5nLlxuICAgKiBSZXR1cm5zIG51bGwgaWYgc3RhdGUgaGFzIG5ldmVyIGJlZW4gY2FsY3VsYXRlZC5cbiAgICovXG4gIGdldENhY2hlZFN0YXRlKCk6IEpTT05PYmplY3QgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5jYWNoZWRTdGF0ZVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxhc3QgYXBwbGllZCB0aW1lc3RhbXAuXG4gICAqL1xuICBnZXRMYXN0QXBwbGllZFRzKCk6IFR4VGltZXN0YW1wIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMubGFzdEFwcGxpZWRJbmRleCA9PT0gbnVsbCB8fCB0aGlzLmxhc3RBcHBsaWVkSW5kZXggPCAwKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zb3J0ZWRUeHNbdGhpcy5sYXN0QXBwbGllZEluZGV4XT8udHhUaW1lc3RhbXAgPz8gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxhc3QgYXBwbGllZCBpbmRleCAoZm9yIGRlYnVnZ2luZy90cmFja2luZykuXG4gICAqL1xuICBnZXRMYXN0QXBwbGllZEluZGV4KCk6IG51bWJlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmxhc3RBcHBsaWVkSW5kZXhcbiAgfVxufVxuIiwiaW1wb3J0IHsgSlNPTk9iamVjdCB9IGZyb20gXCIuL2pzb25cIlxuaW1wb3J0IHsgVmFsaWRhdGVGbiB9IGZyb20gXCIuL29wZXJhdGlvbnNcIlxuaW1wb3J0IHsgU3RhdGVDYWxjdWxhdG9yIH0gZnJvbSBcIi4vU3RhdGVDYWxjdWxhdG9yXCJcblxuLyoqXG4gKiBDbGllbnQtc2lkZSBzdGF0ZSBpbmNsdWRpbmcgY2xvY2tzIGFuZCBjYWxjdWxhdG9yIGZvciBzdGF0ZSBtYW5hZ2VtZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50U3RhdGUge1xuICAvLyBMYW1wb3J0IGNsb2NrcyAobW9ub3RvbmljLCBuZXZlciByZXNldClcbiAgbG9jYWxDbG9jazogbnVtYmVyXG5cbiAgLy8gQ2FjaGVkIGZpbmFsaXplZCBlcG9jaCAobnVsbCA9IG5vdCB5ZXQgaW5pdGlhbGl6ZWQsIHJlY2FsY3VsYXRlZCBvbmx5IHdoZW4gY2hlY2twb2ludCBtYXAgY2hhbmdlcylcbiAgY2FjaGVkRmluYWxpemVkRXBvY2g6IG51bWJlciB8IG51bGxcblxuICAvLyBTdGF0ZSBjYWxjdWxhdG9yIChtYW5hZ2VzIHNvcnRlZCB0eCBjYWNoZSwgc3RhdGUgY2FsY3VsYXRpb24sIGFuZCBpbnZhbGlkYXRpb24pXG4gIHN0YXRlQ2FsY3VsYXRvcjogU3RhdGVDYWxjdWxhdG9yXG5cbiAgLyoqXG4gICAqIFRpbWVzdGFtcCByZXRlbnRpb24gd2luZG93IGluIG1pbGxpc2Vjb25kcy5cbiAgICovXG4gIHJldGVudGlvbldpbmRvd01zOiBudW1iZXJcbn1cblxuLyoqXG4gKiBGYWN0b3J5IHRvIGNyZWF0ZSBhbiBpbml0aWFsIENsaWVudFN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDbGllbnRTdGF0ZShcbiAgdmFsaWRhdGVGbjogVmFsaWRhdGVGbjxKU09OT2JqZWN0PiB8IHVuZGVmaW5lZCxcbiAgcmV0ZW50aW9uV2luZG93TXM6IG51bWJlclxuKTogQ2xpZW50U3RhdGUge1xuICByZXR1cm4ge1xuICAgIGxvY2FsQ2xvY2s6IDAsXG4gICAgY2FjaGVkRmluYWxpemVkRXBvY2g6IG51bGwsIC8vIFdpbGwgYmUgcmVjYWxjdWxhdGVkIG9uIGZpcnN0IHJ1blxuICAgIHN0YXRlQ2FsY3VsYXRvcjogbmV3IFN0YXRlQ2FsY3VsYXRvcih2YWxpZGF0ZUZuKSxcbiAgICByZXRlbnRpb25XaW5kb3dNcyxcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IHR5cGUgQ2hlY2twb2ludFJlY29yZCwgcHJ1bmVDaGVja3BvaW50cyB9IGZyb20gXCIuL2NoZWNrcG9pbnRzXCJcbmltcG9ydCB7IGdldEZpbmFsaXplZEVwb2NoQW5kQ2hlY2twb2ludCB9IGZyb20gXCIuL2NoZWNrcG9pbnRVdGlsc1wiXG5pbXBvcnQgeyBDbGllbnRTdGF0ZSB9IGZyb20gXCIuL2NsaWVudFN0YXRlXCJcbmltcG9ydCB7IEpTT05PYmplY3QgfSBmcm9tIFwiLi9qc29uXCJcbmltcG9ydCB7IE9wIH0gZnJvbSBcIi4vb3BlcmF0aW9uc1wiXG5pbXBvcnQgeyBTb3J0ZWRUeEVudHJ5IH0gZnJvbSBcIi4vU29ydGVkVHhFbnRyeVwiXG5pbXBvcnQgeyBpc1RyYW5zYWN0aW9uSW5DaGVja3BvaW50IH0gZnJvbSBcIi4vU3RhdGVDYWxjdWxhdG9yXCJcbmltcG9ydCB7IFR4UmVjb3JkIH0gZnJvbSBcIi4vVHhSZWNvcmRcIlxuaW1wb3J0IHsgdHlwZSBUeFRpbWVzdGFtcCwgdHlwZSBUeFRpbWVzdGFtcEtleSwgdHhUaW1lc3RhbXBUb0tleSB9IGZyb20gXCIuL3R4VGltZXN0YW1wXCJcblxuLyoqXG4gKiBDaGFuZ2VzIHRvIHRyYW5zYWN0aW9uIGtleXMgZnJvbSBhIFkuWU1hcEV2ZW50LlxuICogLSBhZGRlZDoga2V5cyB0aGF0IHdlcmUgYWRkZWRcbiAqIC0gZGVsZXRlZDoga2V5cyB0aGF0IHdlcmUgZGVsZXRlZFxuICovXG5leHBvcnQgdHlwZSBUeEtleUNoYW5nZXMgPSB7XG4gIGFkZGVkOiByZWFkb25seSBUeFRpbWVzdGFtcEtleVtdXG4gIGRlbGV0ZWQ6IHJlYWRvbmx5IFR4VGltZXN0YW1wS2V5W11cbn1cblxuLyoqXG4gKiBBcHBlbmRzIGEgbmV3IHRyYW5zYWN0aW9uIHRvIHRoZSBsb2cuXG4gKlxuICogQHBhcmFtIG9yaWdpbmFsS2V5IC0gT3B0aW9uYWwgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCB0cmFuc2FjdGlvbiBrZXkgZm9yIHJlLWVtaXRzLlxuICogICAgICAgICAgICAgICAgICAgICAgVXNlZCBieSBzeW5jTG9nIHRvIHByZXNlcnZlIHRyYW5zYWN0aW9ucyBtaXNzZWQgYnkgY2hlY2twb2ludHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRUeChcbiAgb3BzOiByZWFkb25seSBPcFtdLFxuICB5VHg6IFkuTWFwPFR4UmVjb3JkPixcbiAgYWN0aXZlRXBvY2g6IG51bWJlcixcbiAgbXlDbGllbnRJZDogc3RyaW5nLFxuICBjbGllbnRTdGF0ZTogQ2xpZW50U3RhdGUsXG4gIG9yaWdpbmFsS2V5PzogVHhUaW1lc3RhbXBLZXlcbik6IFR4VGltZXN0YW1wS2V5IHtcbiAgY29uc3QgY2FsYyA9IGNsaWVudFN0YXRlLnN0YXRlQ2FsY3VsYXRvclxuXG4gIC8vIDEuIEFkdmFuY2UgbG9naWNhbCBjbG9jayAoTGFtcG9ydCkgYmFzZWQgb24gYWxsIHNlZW4gdHJhZmZpY1xuICBjb25zdCBjbG9jayA9IE1hdGgubWF4KGNsaWVudFN0YXRlLmxvY2FsQ2xvY2ssIGNhbGMuZ2V0TWF4U2VlbkNsb2NrKCkpICsgMVxuICBjbGllbnRTdGF0ZS5sb2NhbENsb2NrID0gY2xvY2tcblxuICAvLyAyLiBHZW5lcmF0ZSBLZXkgd2l0aCBXYWxsQ2xvY2sgZm9yIGZ1dHVyZSBwcnVuaW5nIHNhZmV0eVxuICBjb25zdCB0czogVHhUaW1lc3RhbXAgPSB7XG4gICAgZXBvY2g6IGFjdGl2ZUVwb2NoLFxuICAgIGNsb2NrLFxuICAgIGNsaWVudElkOiBteUNsaWVudElkLFxuICAgIHdhbGxDbG9jazogRGF0ZS5ub3coKSxcbiAgfVxuICBjb25zdCBrZXkgPSB0eFRpbWVzdGFtcFRvS2V5KHRzKVxuXG4gIC8vIDMuIFdyaXRlIHRvIFlqcyAoQXRvbWljKVxuICBjb25zdCByZWNvcmQ6IFR4UmVjb3JkID0geyBvcHMsIG9yaWdpbmFsVHhLZXk6IG9yaWdpbmFsS2V5IH1cbiAgeVR4LnNldChrZXksIHJlY29yZClcblxuICByZXR1cm4ga2V5XG59XG5cbi8qKlxuICogU3luY2hyb25pemVzIHRoZSB0cmFuc2FjdGlvbiBsb2cgd2l0aCB0aGUgY3VycmVudCBjaGVja3BvaW50LlxuICogUmUtZW1pdHMgbWlzc2VkIHRyYW5zYWN0aW9ucyBhbmQgcHJ1bmVzIG9sZCBvbmVzLlxuICpcbiAqIFNob3VsZCBiZSBjYWxsZWQgQkVGT1JFIHVwZGF0ZVN0YXRlIHRvIGVuc3VyZSBsb2cgaXMgY2xlYW4gYW5kIGNvbXBsZXRlLlxuICpcbiAqIEByZXR1cm5zIHRydWUgaWYgYW55IHRyYW5zYWN0aW9ucyB3ZXJlIHJlLWVtaXR0ZWQgb3IgZGVsZXRlZCwgd2hpY2ggbWF5IGludmFsaWRhdGUgbGFzdEFwcGxpZWRJbmRleFxuICovXG5mdW5jdGlvbiBzeW5jTG9nKFxuICB5VHg6IFkuTWFwPFR4UmVjb3JkPixcbiAgbXlDbGllbnRJZDogc3RyaW5nLFxuICBjbGllbnRTdGF0ZTogQ2xpZW50U3RhdGUsXG4gIGZpbmFsaXplZEVwb2NoOiBudW1iZXIsXG4gIGJhc2VDUDogQ2hlY2twb2ludFJlY29yZCB8IG51bGwsXG4gIG5ld0tleXM/OiByZWFkb25seSBUeFRpbWVzdGFtcEtleVtdIC8vIGtleXMgYWRkZWQgaW4gdGhpcyB1cGRhdGVcbik6IHZvaWQge1xuICBjb25zdCBjYWxjID0gY2xpZW50U3RhdGUuc3RhdGVDYWxjdWxhdG9yXG4gIGNvbnN0IGFjdGl2ZUVwb2NoID0gZmluYWxpemVkRXBvY2ggKyAxXG4gIGNvbnN0IHdhdGVybWFya3MgPSBiYXNlQ1A/LndhdGVybWFya3MgPz8ge31cblxuICAvLyBEZXRlcm1pbmlzdGljIFJlZmVyZW5jZSBUaW1lOiBVc2Ugc3RvcmVkIG1pbldhbGxDbG9jayBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSAwIChub3RoaW5nIGFuY2llbnQpLlxuICBjb25zdCByZWZlcmVuY2VUaW1lID0gYmFzZUNQPy5taW5XYWxsQ2xvY2sgPz8gMFxuXG4gIC8vIEhlbHBlciB0byBjaGVjayBpZiBhIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBwcnVuZWRcbiAgY29uc3Qgc2hvdWxkUHJ1bmUgPSAodHM6IFR4VGltZXN0YW1wLCBkZWR1cFRzOiBUeFRpbWVzdGFtcCk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IGlzQW5jaWVudCA9IHJlZmVyZW5jZVRpbWUgLSB0cy53YWxsQ2xvY2sgPiBjbGllbnRTdGF0ZS5yZXRlbnRpb25XaW5kb3dNc1xuICAgIGlmIChpc0FuY2llbnQpIHJldHVybiB0cnVlXG4gICAgcmV0dXJuIGlzVHJhbnNhY3Rpb25JbkNoZWNrcG9pbnQoZGVkdXBUcywgd2F0ZXJtYXJrcylcbiAgfVxuXG4gIGNvbnN0IHRvRGVsZXRlOiBUeFRpbWVzdGFtcEtleVtdID0gW11cbiAgY29uc3QgdG9SZUVtaXQ6IEFycmF5PHsgb3JpZ2luYWxLZXk6IFR4VGltZXN0YW1wS2V5OyB0eDogVHhSZWNvcmQgfT4gPSBbXVxuXG4gIC8vIDEuIEhlbHBlciB0byBkZWNpZGUgd2hhdCB0byBkbyB3aXRoIGVhY2ggdHJhbnNhY3Rpb25cbiAgY29uc3QgcHJvY2Vzc0VudHJ5ID0gKGVudHJ5OiBTb3J0ZWRUeEVudHJ5KTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKHNob3VsZFBydW5lKGVudHJ5LnR4VGltZXN0YW1wLCBlbnRyeS5kZWR1cFR4VGltZXN0YW1wKSkge1xuICAgICAgdG9EZWxldGUucHVzaChlbnRyeS50eFRpbWVzdGFtcEtleSlcbiAgICAgIHJldHVybiBmYWxzZSAvLyBkZWxldGVkXG4gICAgfVxuXG4gICAgaWYgKGVudHJ5LnR4VGltZXN0YW1wLmVwb2NoIDw9IGZpbmFsaXplZEVwb2NoKSB7XG4gICAgICAvLyBOb3QgaW4gY2hlY2twb2ludCBhbmQgc3RpbGwgZnJlc2ggLSByZS1lbWl0IGl0IHRvIHRoZSBhY3RpdmUgZXBvY2hcbiAgICAgIHRvUmVFbWl0LnB1c2goeyBvcmlnaW5hbEtleTogZW50cnkuZGVkdXBUeFRpbWVzdGFtcEtleSwgdHg6IGVudHJ5LnR4UmVjb3JkIH0pXG4gICAgICB0b0RlbGV0ZS5wdXNoKGVudHJ5LnR4VGltZXN0YW1wS2V5KVxuICAgICAgcmV0dXJuIGZhbHNlIC8vIHJlLWVtaXR0ZWRcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZSAvLyBhY3RpdmUvZnJlc2hcbiAgfVxuXG4gIC8vIDIuIFNjYW4gbG9jYWwgY2FjaGUgKHNvcnRlZFR4cykgdG8gaWRlbnRpZnkgbWlzc2luZy9hbmNpZW50IHRyYW5zYWN0aW9uc1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGNhbGMuZ2V0U29ydGVkVHhzKCkpIHtcbiAgICBpZiAocHJvY2Vzc0VudHJ5KGVudHJ5KSkge1xuICAgICAgLy8gT3B0aW1pemF0aW9uOiBQaHlzaWNhbCBrZXlzIGFyZSBzb3J0ZWQuIElmIHdlIGhpdCB0aGUgYWN0aXZlL2ZyZXNoIHRlcnJpdG9yeSwgd2UgY2FuIHN0b3AuXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHByb2Nlc3NLZXlCeVRpbWVzdGFtcEtleSA9ICh0eFRpbWVzdGFtcEtleTogVHhUaW1lc3RhbXBLZXkpOiB2b2lkID0+IHtcbiAgICAvLyBPbmx5IHByb2Nlc3MgaWYgaXQgYWN0dWFsbHkgZXhpc3RzIGluIFlqcyBNYXBcbiAgICBpZiAoeVR4Lmhhcyh0eFRpbWVzdGFtcEtleSkpIHtcbiAgICAgIHByb2Nlc3NFbnRyeShuZXcgU29ydGVkVHhFbnRyeSh0eFRpbWVzdGFtcEtleSwgeVR4KSlcbiAgICB9XG4gIH1cblxuICAvLyAzLiBTY2FuIE5FVyBrZXlzIGZyb20gWWpzIHRvIGhhbmRsZSBpbmNvbWluZyB0cmFuc2FjdGlvbnMgKHN5bmMpXG4gIC8vIEFueSBjbGllbnQgY2FuIHJlLWVtaXQgLSBkZWR1cGxpY2F0aW9uIHZpYSBvcmlnaW5hbFR4S2V5IGhhbmRsZXMgZHVwbGljYXRlcy5cbiAgaWYgKG5ld0tleXMpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBuZXdLZXlzKSB7XG4gICAgICBwcm9jZXNzS2V5QnlUaW1lc3RhbXBLZXkoa2V5KVxuICAgIH1cbiAgfVxuXG4gIC8vIDQuIFJlLWVtaXQgbWlzc2VkIHRyYW5zYWN0aW9ucyBCRUZPUkUgcHJ1bmluZ1xuICBmb3IgKGNvbnN0IHsgb3JpZ2luYWxLZXksIHR4IH0gb2YgdG9SZUVtaXQpIHtcbiAgICBjb25zdCBuZXdLZXkgPSBhcHBlbmRUeCh0eC5vcHMsIHlUeCwgYWN0aXZlRXBvY2gsIG15Q2xpZW50SWQsIGNsaWVudFN0YXRlLCBvcmlnaW5hbEtleSlcbiAgICBjYWxjLmluc2VydFR4KG5ld0tleSwgeVR4KVxuICB9XG5cbiAgLy8gNS4gUHJ1bmUgb2xkL2ZpbmFsaXplZC9yZWR1bmRhbnQgdHJhbnNhY3Rpb25zIGZyb20gWWpzIE1hcFxuICBmb3IgKGNvbnN0IGtleSBvZiB0b0RlbGV0ZSkge1xuICAgIHlUeC5kZWxldGUoa2V5KVxuICB9XG4gIGNhbGMucmVtb3ZlVHhzKHRvRGVsZXRlKVxufVxuXG4vKipcbiAqIFRoZSBwcmltYXJ5IHVwZGF0ZSBmdW5jdGlvbiB0aGF0IG1haW50YWlucyBjdXJyZW50IHN0YXRlLlxuICpcbiAqIEBwYXJhbSB0eENoYW5nZXMgLSBDaGFuZ2VzIGZyb20gWS5ZTWFwRXZlbnQuIElmIHVuZGVmaW5lZCAoZmlyc3QgcnVuKSwgcGVyZm9ybXMgYSBmdWxsIHNjYW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZShcbiAgZG9jOiBZLkRvYyxcbiAgeVR4OiBZLk1hcDxUeFJlY29yZD4sXG4gIHlDaGVja3BvaW50OiBZLk1hcDxDaGVja3BvaW50UmVjb3JkPixcbiAgbXlDbGllbnRJZDogc3RyaW5nLFxuICBjbGllbnRTdGF0ZTogQ2xpZW50U3RhdGUsXG4gIHR4Q2hhbmdlczogVHhLZXlDaGFuZ2VzIHwgdW5kZWZpbmVkXG4pOiB7IHN0YXRlOiBKU09OT2JqZWN0OyBnZXRBcHBsaWVkT3BzOiAoKSA9PiByZWFkb25seSBPcFtdIH0ge1xuICBjb25zdCBjYWxjID0gY2xpZW50U3RhdGUuc3RhdGVDYWxjdWxhdG9yXG5cbiAgLy8gQWx3YXlzIGNhbGN1bGF0ZSBmcmVzaCBmaW5hbGl6ZWQgZXBvY2ggYW5kIGNoZWNrcG9pbnQgdG8gaGFuZGxlIHN5bmMgcmFjZSBjb25kaXRpb25zXG4gIGNvbnN0IHsgZmluYWxpemVkRXBvY2gsIGNoZWNrcG9pbnQ6IGJhc2VDUCB9ID0gZ2V0RmluYWxpemVkRXBvY2hBbmRDaGVja3BvaW50KHlDaGVja3BvaW50KVxuXG4gIC8vIFVwZGF0ZSByZWFkLWNhY2hlXG4gIGNsaWVudFN0YXRlLmNhY2hlZEZpbmFsaXplZEVwb2NoID0gZmluYWxpemVkRXBvY2hcblxuICAvLyBTZXQgYmFzZSBjaGVja3BvaW50ICh0aGlzIGhhbmRsZXMgaW52YWxpZGF0aW9uIGlmIGNoZWNrcG9pbnQgY2hhbmdlZClcbiAgY2FsYy5zZXRCYXNlQ2hlY2twb2ludChiYXNlQ1ApXG5cbiAgLy8gVHJhY2sgaWYgd2UgbmVlZCB0byByZWJ1aWxkIHNvcnRlZCBjYWNoZSAoZmlyc3QgcnVuIG9yIG1pc3NpbmcgZGVsdGEpXG4gIC8vIE9wdGltaXphdGlvbjogV2UgZG9uJ3QgbmVlZCB0byByZWJ1aWxkIGp1c3QgYmVjYXVzZSBjaGVja3BvaW50IGNoYW5nZWQsXG4gIC8vIGFzIGxvbmcgYXMgd2UgaGF2ZSB0eENoYW5nZXMgdG8ga2VlcCBjYWNoZSBpbiBzeW5jLlxuICBjb25zdCBuZWVkc1JlYnVpbGRTb3J0ZWRDYWNoZSA9IGNhbGMuZ2V0Q2FjaGVkU3RhdGUoKSA9PT0gbnVsbCB8fCAhdHhDaGFuZ2VzXG5cbiAgLy8gUmVidWlsZCBzb3J0ZWQgY2FjaGUgYmVmb3JlIHN5bmNMb2cgaWYgbmVlZGVkXG4gIGlmIChuZWVkc1JlYnVpbGRTb3J0ZWRDYWNoZSkge1xuICAgIGNhbGMucmVidWlsZEZyb21ZanMoeVR4KVxuICB9IGVsc2Uge1xuICAgIC8vIElmIG5vdCByZWJ1aWxkaW5nLCBpbW1lZGlhdGVseSBwcm9jZXNzIGRlbGV0aW9ucyB0byBhdm9pZCBcImdob3N0XCIgdHJhbnNhY3Rpb25zXG4gICAgLy8gaW4gc3luY0xvZyAoZS5nLiBhdHRlbXB0aW5nIHRvIGFjY2VzcyBhIHRyYW5zYWN0aW9uIHRoYXQgd2FzIGp1c3QgZGVsZXRlZCkuXG4gICAgY2FsYy5yZW1vdmVUeHModHhDaGFuZ2VzLmRlbGV0ZWQpXG4gIH1cblxuICAvLyBTeW5jIGFuZCBwcnVuZSB3aXRoaW4gdHJhbnNhY3Rpb25cbiAgZG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICBzeW5jTG9nKHlUeCwgbXlDbGllbnRJZCwgY2xpZW50U3RhdGUsIGZpbmFsaXplZEVwb2NoLCBiYXNlQ1AsIHR4Q2hhbmdlcz8uYWRkZWQpXG5cbiAgICAvLyBTYWZlIHRvIHVzZSBsb2NhbCBmaW5hbGl6ZWRFcG9jaCBoZXJlXG4gICAgcHJ1bmVDaGVja3BvaW50cyh5Q2hlY2twb2ludCwgZmluYWxpemVkRXBvY2gpXG4gIH0pXG5cbiAgaWYgKG5lZWRzUmVidWlsZFNvcnRlZENhY2hlKSB7XG4gICAgLy8gRnVsbCByZWNvbXB1dGUgKGNhbGN1bGF0b3IgaGFuZGxlcyB0aGlzKVxuICAgIHJldHVybiBjYWxjLmNhbGN1bGF0ZVN0YXRlKClcbiAgfVxuXG4gIC8vIEluY3JlbWVudGFsIHVwZGF0ZSB1c2luZyBvbmx5IGNoYW5nZWQga2V5cyAoY2FsY3VsYXRvciBoYW5kbGVzIHRoaXMpXG4gIC8vIHR4Q2hhbmdlcyBpcyBndWFyYW50ZWVkIHRvIGV4aXN0IGhlcmUgc2luY2UgIXR4Q2hhbmdlcyBpbXBsaWVzIG5lZWRzUmVidWlsZFNvcnRlZENhY2hlXG5cbiAgLy8gVXBkYXRlIHNvcnRlZCBjYWNoZSB3aXRoIG5ldyBrZXlzIGZyb20gdHhDaGFuZ2VzXG4gIC8vIFRoaXMgbXVzdCBoYXBwZW4gYWZ0ZXIgc3luY0xvZyB3aGljaCBtYXkgaGF2ZSBkZWxldGVkIHNvbWUgb2YgdGhlc2Uga2V5c1xuICBmb3IgKGNvbnN0IGtleSBvZiB0eENoYW5nZXMuYWRkZWQpIHtcbiAgICAvLyBDUklUSUNBTDogQ2hlY2sgeVR4LmhhcyhrZXkpISBzeW5jTG9nIG1pZ2h0IGhhdmUganVzdCBwcnVuZWQgaXQuXG4gICAgaWYgKHlUeC5oYXMoa2V5KSAmJiAhY2FsYy5oYXNUeChrZXkpKSB7XG4gICAgICBjYWxjLmluc2VydFR4KGtleSwgeVR4KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjYWxjLmNhbGN1bGF0ZVN0YXRlKClcbn1cbiIsImltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBDaGVja3BvaW50UmVjb3JkLCBjcmVhdGVDaGVja3BvaW50IH0gZnJvbSBcIi4vY2hlY2twb2ludHNcIlxuaW1wb3J0IHsgY3JlYXRlQ2xpZW50U3RhdGUgfSBmcm9tIFwiLi9jbGllbnRTdGF0ZVwiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4vZXJyb3JcIlxuaW1wb3J0IHsgSlNPTk9iamVjdCB9IGZyb20gXCIuL2pzb25cIlxuXG5pbXBvcnQgeyBPcCwgVmFsaWRhdGVGbiB9IGZyb20gXCIuL29wZXJhdGlvbnNcIlxuXG5pbXBvcnQgeyBjb21wdXRlUmVjb25jaWxlT3BzIH0gZnJvbSBcIi4vcmVjb25jaWxlXCJcbmltcG9ydCB7IFNvcnRlZFR4RW50cnkgfSBmcm9tIFwiLi9Tb3J0ZWRUeEVudHJ5XCJcbmltcG9ydCB7IFR4UmVjb3JkIH0gZnJvbSBcIi4vVHhSZWNvcmRcIlxuaW1wb3J0IHsgYXBwZW5kVHgsIFR4S2V5Q2hhbmdlcywgdXBkYXRlU3RhdGUgfSBmcm9tIFwiLi90eExvZ1wiXG5pbXBvcnQgeyBUeFRpbWVzdGFtcEtleSB9IGZyb20gXCIuL3R4VGltZXN0YW1wXCJcbmltcG9ydCB7IGdlbmVyYXRlSUQgfSBmcm9tIFwiLi91dGlsc1wiXG5cbmV4cG9ydCBjb25zdCBnZXRTb3J0ZWRUeHNTeW1ib2wgPSBTeW1ib2woXCJnZXRTb3J0ZWRUeHNcIilcblxuZXhwb3J0IGludGVyZmFjZSBTdGF0ZVN5bmNMb2dPcHRpb25zPFN0YXRlIGV4dGVuZHMgSlNPTk9iamVjdD4ge1xuICAvKipcbiAgICogVGhlIFkuanMgRG9jdW1lbnQgdG8gYmluZCB0by5cbiAgICovXG4gIHlEb2M6IFkuRG9jXG5cbiAgLyoqXG4gICAqIE5hbWUgZm9yIHRoZSB0eHMgWS5NYXAuXG4gICAqIERlZmF1bHQ6IFwic3RhdGUtc3luYy1sb2ctdHhcIlxuICAgKi9cbiAgeVR4TWFwTmFtZT86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBOYW1lIGZvciB0aGUgY2hlY2twb2ludCBZLk1hcC5cbiAgICogRGVmYXVsdDogXCJzdGF0ZS1zeW5jLWxvZy1jaGVja3BvaW50XCJcbiAgICovXG4gIHlDaGVja3BvaW50TWFwTmFtZT86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBjbGllbnQuXG4gICAqIElmIG9taXR0ZWQsIGEgcmFuZG9tIFVVSUQgKG5hbm9pZCkgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gICAqIE5PVEU6IElmIHlvdSBuZWVkIHRvIHJlc3VtZSBhIHNlc3Npb24gKGtlZXAgbG9jYWwgY2xvY2svd2F0ZXJtYXJrKSwgeW91IE1VU1QgcHJvdmlkZSBhIHN0YWJsZSBJRC5cbiAgICogTVVTVCBOT1QgY29udGFpbiBzZW1pY29sb25zLlxuICAgKi9cbiAgY2xpZW50SWQ/OiBzdHJpbmdcblxuICAvKipcbiAgICogT3JpZ2luIHRhZyBmb3IgWS5qcyB0eHMgY3JlYXRlZCBieSB0aGlzIGxpYnJhcnkuXG4gICAqL1xuICB5anNPcmlnaW4/OiB1bmtub3duXG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIHZhbGlkYXRpb24gZnVuY3Rpb24uXG4gICAqIFJ1bnMgYWZ0ZXIgZWFjaCB0eCdzIG9wcyBhcmUgYXBwbGllZC5cbiAgICogSWYgaXQgcmV0dXJucyBmYWxzZSwgdGhlIHR4IGlzIHJlamVjdGVkIChzdGF0ZSByZXZlcnRzKS5cbiAgICogTVVTVCBiZSBkZXRlcm1pbmlzdGljIGFuZCBjb25zaXN0ZW50IGFjcm9zcyBhbGwgY2xpZW50cy5cbiAgICovXG4gIHZhbGlkYXRlPzogKHN0YXRlOiBTdGF0ZSkgPT4gYm9vbGVhblxuXG4gIC8qKlxuICAgKiBUaW1lc3RhbXAgcmV0ZW50aW9uIHdpbmRvdyBpbiBtaWxsaXNlY29uZHMuXG4gICAqIFR4cyBvbGRlciB0aGFuIHRoaXMgd2luZG93IGFyZSBjb25zaWRlcmVkIFwiQW5jaWVudFwiIGFuZCBwcnVuZWQuXG4gICAqXG4gICAqIERlZmF1bHQ6IEluZmluaXR5IChObyBwcnVuaW5nKS5cbiAgICogUmVjb21tZW5kZWQ6IDE0IGRheXMgKDEyMDk2MDAwMDAgbXMpLlxuICAgKi9cbiAgcmV0ZW50aW9uV2luZG93TXM6IG51bWJlciB8IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlU3luY0xvZ0NvbnRyb2xsZXI8U3RhdGUgZXh0ZW5kcyBKU09OT2JqZWN0PiB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlLlxuICAgKi9cbiAgZ2V0U3RhdGUoKTogU3RhdGVcblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byBzdGF0ZSBjaGFuZ2VzLlxuICAgKi9cbiAgc3Vic2NyaWJlKGNhbGxiYWNrOiAobmV3U3RhdGU6IFN0YXRlLCBnZXRBcHBsaWVkT3BzOiAoKSA9PiByZWFkb25seSBPcFtdKSA9PiB2b2lkKTogKCkgPT4gdm9pZFxuXG4gIC8qKlxuICAgKiBFbWl0cyBhIG5ldyB0eCAobGlzdCBvZiBvcGVyYXRpb25zKSB0byB0aGUgbG9nLlxuICAgKi9cbiAgZW1pdChvcHM6IE9wW10pOiB2b2lkXG5cbiAgLyoqXG4gICAqIFJlY29uY2lsZXMgdGhlIGN1cnJlbnQgc3RhdGUgd2l0aCB0aGUgdGFyZ2V0IHN0YXRlLlxuICAgKi9cbiAgcmVjb25jaWxlU3RhdGUodGFyZ2V0U3RhdGU6IFN0YXRlKTogdm9pZFxuXG4gIC8qKlxuICAgKiBNYW51YWxseSB0cmlnZ2VycyBlcG9jaCBjb21wYWN0aW9uIChDaGVja3BvaW50aW5nKS5cbiAgICovXG4gIGNvbXBhY3QoKTogdm9pZFxuXG4gIC8qKlxuICAgKiBDbGVhbnMgdXAgb2JzZXJ2ZXJzIGFuZCByZWxlYXNlcyBtZW1vcnkuXG4gICAqL1xuICBkaXNwb3NlKCk6IHZvaWRcblxuICAvLyAtLS0gT2JzZXJ2YWJpbGl0eSAmIFN0YXRzIC0tLVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGFjdGl2ZSBlcG9jaCBudW1iZXIuXG4gICAqL1xuICBnZXRBY3RpdmVFcG9jaCgpOiBudW1iZXJcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHR4cyBjdXJyZW50bHkgaW4gdGhlIGFjdGl2ZSBlcG9jaC5cbiAgICovXG4gIGdldEFjdGl2ZUVwb2NoVHhDb3VudCgpOiBudW1iZXJcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgd2FsbENsb2NrIHRpbWVzdGFtcCBvZiB0aGUgZmlyc3QgdHggaW4gdGhlIGFjdGl2ZSBlcG9jaC5cbiAgICovXG4gIGdldEFjdGl2ZUVwb2NoU3RhcnRUaW1lKCk6IG51bWJlciB8IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGxvZyBpcyBjb21wbGV0ZWx5IGVtcHR5LlxuICAgKi9cbiAgaXNMb2dFbXB0eSgpOiBib29sZWFuXG5cbiAgLyoqXG4gICAqIEludGVybmFsL1Rlc3Rpbmc6IFJldHVybnMgYWxsIHR4cyBjdXJyZW50bHkgaW4gdGhlIGxvZywgc29ydGVkLlxuICAgKi9cbiAgW2dldFNvcnRlZFR4c1N5bWJvbF0oKTogcmVhZG9ubHkgU29ydGVkVHhFbnRyeVtdXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIFN0YXRlU3luY0xvZyBjb250cm9sbGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3RhdGVTeW5jTG9nPFN0YXRlIGV4dGVuZHMgSlNPTk9iamVjdD4oXG4gIG9wdGlvbnM6IFN0YXRlU3luY0xvZ09wdGlvbnM8U3RhdGU+XG4pOiBTdGF0ZVN5bmNMb2dDb250cm9sbGVyPFN0YXRlPiB7XG4gIGNvbnN0IHtcbiAgICB5RG9jLFxuICAgIHlUeE1hcE5hbWUgPSBcInN0YXRlLXN5bmMtbG9nLXR4XCIsXG4gICAgeUNoZWNrcG9pbnRNYXBOYW1lID0gXCJzdGF0ZS1zeW5jLWxvZy1jaGVja3BvaW50XCIsXG4gICAgY2xpZW50SWQgPSBnZW5lcmF0ZUlEKCksXG4gICAgeWpzT3JpZ2luLFxuICAgIHZhbGlkYXRlLFxuICAgIHJldGVudGlvbldpbmRvd01zLFxuICB9ID0gb3B0aW9uc1xuXG4gIGlmIChjbGllbnRJZC5pbmNsdWRlcyhcIjtcIikpIHtcbiAgICBmYWlsdXJlKGBjbGllbnRJZCBNVVNUIE5PVCBjb250YWluIHNlbWljb2xvbnM6ICR7Y2xpZW50SWR9YClcbiAgfVxuXG4gIGNvbnN0IHlUeCA9IHlEb2MuZ2V0TWFwPFR4UmVjb3JkPih5VHhNYXBOYW1lKVxuICBjb25zdCB5Q2hlY2twb2ludCA9IHlEb2MuZ2V0TWFwPENoZWNrcG9pbnRSZWNvcmQ+KHlDaGVja3BvaW50TWFwTmFtZSlcblxuICAvLyBDYXN0IHZhbGlkYXRlIHRvIGJhc2ljIHR5cGUgdG8gbWF0Y2ggaW50ZXJuYWwgQ2xpZW50U3RhdGVcbiAgY29uc3QgY2xpZW50U3RhdGUgPSBjcmVhdGVDbGllbnRTdGF0ZShcbiAgICB2YWxpZGF0ZSBhcyB1bmtub3duIGFzIFZhbGlkYXRlRm48SlNPTk9iamVjdD4sXG4gICAgcmV0ZW50aW9uV2luZG93TXMgPz8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZXG4gIClcblxuICAvLyBMaXN0ZW5lcnNcbiAgY29uc3Qgc3Vic2NyaWJlcnMgPSBuZXcgU2V0PChzdGF0ZTogU3RhdGUsIGdldEFwcGxpZWRPcHM6ICgpID0+IHJlYWRvbmx5IE9wW10pID0+IHZvaWQ+KClcblxuICBjb25zdCBub3RpZnlTdWJzY3JpYmVycyA9IChzdGF0ZTogU3RhdGUsIGdldEFwcGxpZWRPcHM6ICgpID0+IHJlYWRvbmx5IE9wW10pID0+IHtcbiAgICBmb3IgKGNvbnN0IHN1YiBvZiBzdWJzY3JpYmVycykge1xuICAgICAgc3ViKHN0YXRlLCBnZXRBcHBsaWVkT3BzKVxuICAgIH1cbiAgfVxuXG4gIC8vIEhlbHBlciB0byBleHRyYWN0IGtleSBjaGFuZ2VzIGZyb20gWU1hcEV2ZW50XG4gIGNvbnN0IGV4dHJhY3RUeENoYW5nZXMgPSAoZXZlbnQ6IFkuWU1hcEV2ZW50PFR4UmVjb3JkPik6IFR4S2V5Q2hhbmdlcyA9PiB7XG4gICAgY29uc3QgYWRkZWQ6IFR4VGltZXN0YW1wS2V5W10gPSBbXVxuICAgIGNvbnN0IGRlbGV0ZWQ6IFR4VGltZXN0YW1wS2V5W10gPSBbXVxuXG4gICAgZm9yIChjb25zdCBba2V5LCBjaGFuZ2VdIG9mIGV2ZW50LmNoYW5nZXMua2V5cykge1xuICAgICAgaWYgKGNoYW5nZS5hY3Rpb24gPT09IFwiYWRkXCIpIHtcbiAgICAgICAgYWRkZWQucHVzaChrZXkpXG4gICAgICB9IGVsc2UgaWYgKGNoYW5nZS5hY3Rpb24gPT09IFwiZGVsZXRlXCIpIHtcbiAgICAgICAgZGVsZXRlZC5wdXNoKGtleSlcbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlLmFjdGlvbiA9PT0gXCJ1cGRhdGVcIikge1xuICAgICAgICBkZWxldGVkLnB1c2goa2V5KVxuICAgICAgICBhZGRlZC5wdXNoKGtleSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBhZGRlZCwgZGVsZXRlZCB9XG4gIH1cblxuICAvLyBFbXB0eSB0eENoYW5nZXMgb2JqZWN0IGZvciBjaGVja3BvaW50IG9ic2VydmVyIChubyB0eCBrZXlzIGNoYW5nZWQpXG4gIGNvbnN0IGVtcHR5VHhDaGFuZ2VzOiBUeEtleUNoYW5nZXMgPSB7IGFkZGVkOiBbXSwgZGVsZXRlZDogW10gfVxuXG4gIC8vIFVwZGF0ZSBMb2dpYyB3aXRoIGluY3JlbWVudGFsIGNoYW5nZXNcbiAgY29uc3QgcnVuVXBkYXRlID0gKHR4Q2hhbmdlczogVHhLZXlDaGFuZ2VzIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgY29uc3QgeyBzdGF0ZSwgZ2V0QXBwbGllZE9wcyB9ID0gdXBkYXRlU3RhdGUoXG4gICAgICB5RG9jLFxuICAgICAgeVR4LFxuICAgICAgeUNoZWNrcG9pbnQsXG4gICAgICBjbGllbnRJZCxcbiAgICAgIGNsaWVudFN0YXRlLFxuICAgICAgdHhDaGFuZ2VzXG4gICAgKVxuICAgIG5vdGlmeVN1YnNjcmliZXJzKHN0YXRlIGFzIFN0YXRlLCBnZXRBcHBsaWVkT3BzKVxuICB9XG5cbiAgLy8gVHggb2JzZXJ2ZXJcbiAgY29uc3QgdHhPYnNlcnZlciA9IChldmVudDogWS5ZTWFwRXZlbnQ8VHhSZWNvcmQ+LCBfdHJhbnNhY3Rpb246IFkuVHJhbnNhY3Rpb24pID0+IHtcbiAgICBjb25zdCB0eENoYW5nZXMgPSBleHRyYWN0VHhDaGFuZ2VzKGV2ZW50KVxuICAgIHJ1blVwZGF0ZSh0eENoYW5nZXMpXG4gIH1cblxuICAvLyBDaGVja3BvaW50IG9ic2VydmVyXG4gIGNvbnN0IGNoZWNrcG9pbnRPYnNlcnZlciA9IChcbiAgICBfZXZlbnQ6IFkuWU1hcEV2ZW50PENoZWNrcG9pbnRSZWNvcmQ+LFxuICAgIF90cmFuc2FjdGlvbjogWS5UcmFuc2FjdGlvblxuICApID0+IHtcbiAgICBydW5VcGRhdGUoZW1wdHlUeENoYW5nZXMpXG4gIH1cblxuICB5Q2hlY2twb2ludC5vYnNlcnZlKGNoZWNrcG9pbnRPYnNlcnZlcilcbiAgeVR4Lm9ic2VydmUodHhPYnNlcnZlcilcblxuICAvLyBJbml0aWFsIHJ1biAoZnVsbCByZWNvbXB1dGUsIHRyZWF0IGFzIGNoZWNrcG9pbnQgY2hhbmdlIHRvIGluaXRpYWxpemUgZXBvY2ggY2FjaGUpXG4gIHJ1blVwZGF0ZSh1bmRlZmluZWQpXG5cbiAgLy8gVHJhY2sgZGlzcG9zYWwgc3RhdGVcbiAgbGV0IGRpc3Bvc2VkID0gZmFsc2VcblxuICBjb25zdCBhc3NlcnROb3REaXNwb3NlZCA9ICgpID0+IHtcbiAgICBpZiAoZGlzcG9zZWQpIHtcbiAgICAgIGZhaWx1cmUoXCJTdGF0ZVN5bmNMb2cgaGFzIGJlZW4gZGlzcG9zZWQgYW5kIGNhbm5vdCBiZSB1c2VkXCIpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgZ2V0QWN0aXZlRXBvY2hJbnRlcm5hbCA9ICgpID0+IHtcbiAgICBpZiAoY2xpZW50U3RhdGUuY2FjaGVkRmluYWxpemVkRXBvY2ggPT09IG51bGwpIHtcbiAgICAgIGZhaWx1cmUoXCJjYWNoZWRGaW5hbGl6ZWRFcG9jaCBpcyBudWxsIC0gdGhpcyBzaG91bGQgbm90IGhhcHBlbiBhZnRlciBpbml0aWFsaXphdGlvblwiKVxuICAgIH1cbiAgICByZXR1cm4gY2xpZW50U3RhdGUuY2FjaGVkRmluYWxpemVkRXBvY2ggKyAxXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGdldFN0YXRlKCk6IFN0YXRlIHtcbiAgICAgIGFzc2VydE5vdERpc3Bvc2VkKClcbiAgICAgIHJldHVybiAoY2xpZW50U3RhdGUuc3RhdGVDYWxjdWxhdG9yLmdldENhY2hlZFN0YXRlKCkgPz8ge30pIGFzIFN0YXRlXG4gICAgfSxcblxuICAgIHN1YnNjcmliZShjYWxsYmFjazogKG5ld1N0YXRlOiBTdGF0ZSwgZ2V0QXBwbGllZE9wczogKCkgPT4gcmVhZG9ubHkgT3BbXSkgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICAgICAgYXNzZXJ0Tm90RGlzcG9zZWQoKVxuICAgICAgc3Vic2NyaWJlcnMuYWRkKGNhbGxiYWNrKVxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgc3Vic2NyaWJlcnMuZGVsZXRlKGNhbGxiYWNrKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBlbWl0KG9wczogT3BbXSk6IHZvaWQge1xuICAgICAgYXNzZXJ0Tm90RGlzcG9zZWQoKVxuICAgICAgeURvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZUVwb2NoID0gZ2V0QWN0aXZlRXBvY2hJbnRlcm5hbCgpXG4gICAgICAgIGFwcGVuZFR4KG9wcywgeVR4LCBhY3RpdmVFcG9jaCwgY2xpZW50SWQsIGNsaWVudFN0YXRlKVxuICAgICAgfSwgeWpzT3JpZ2luKVxuICAgIH0sXG5cbiAgICByZWNvbmNpbGVTdGF0ZSh0YXJnZXRTdGF0ZTogU3RhdGUpOiB2b2lkIHtcbiAgICAgIGFzc2VydE5vdERpc3Bvc2VkKClcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IChjbGllbnRTdGF0ZS5zdGF0ZUNhbGN1bGF0b3IuZ2V0Q2FjaGVkU3RhdGUoKSA/PyB7fSkgYXMgU3RhdGVcbiAgICAgIGNvbnN0IG9wcyA9IGNvbXB1dGVSZWNvbmNpbGVPcHMoY3VycmVudFN0YXRlLCB0YXJnZXRTdGF0ZSlcbiAgICAgIGlmIChvcHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmVtaXQob3BzKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjb21wYWN0KCk6IHZvaWQge1xuICAgICAgYXNzZXJ0Tm90RGlzcG9zZWQoKVxuICAgICAgeURvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZUVwb2NoID0gZ2V0QWN0aXZlRXBvY2hJbnRlcm5hbCgpXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGNsaWVudFN0YXRlLnN0YXRlQ2FsY3VsYXRvci5nZXRDYWNoZWRTdGF0ZSgpID8/IHt9XG4gICAgICAgIGNyZWF0ZUNoZWNrcG9pbnQoeVR4LCB5Q2hlY2twb2ludCwgY2xpZW50U3RhdGUsIGFjdGl2ZUVwb2NoLCBjdXJyZW50U3RhdGUsIGNsaWVudElkKVxuICAgICAgfSwgeWpzT3JpZ2luKVxuICAgIH0sXG5cbiAgICBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgaWYgKGRpc3Bvc2VkKSByZXR1cm4gLy8gQWxyZWFkeSBkaXNwb3NlZCwgbm8tb3BcbiAgICAgIGRpc3Bvc2VkID0gdHJ1ZVxuICAgICAgeVR4LnVub2JzZXJ2ZSh0eE9ic2VydmVyKVxuICAgICAgeUNoZWNrcG9pbnQudW5vYnNlcnZlKGNoZWNrcG9pbnRPYnNlcnZlcilcbiAgICAgIHN1YnNjcmliZXJzLmNsZWFyKClcbiAgICB9LFxuXG4gICAgZ2V0QWN0aXZlRXBvY2goKTogbnVtYmVyIHtcbiAgICAgIGFzc2VydE5vdERpc3Bvc2VkKClcbiAgICAgIHJldHVybiBnZXRBY3RpdmVFcG9jaEludGVybmFsKClcbiAgICB9LFxuXG4gICAgZ2V0QWN0aXZlRXBvY2hUeENvdW50KCk6IG51bWJlciB7XG4gICAgICBhc3NlcnROb3REaXNwb3NlZCgpXG4gICAgICBjb25zdCBhY3RpdmVFcG9jaCA9IGdldEFjdGl2ZUVwb2NoSW50ZXJuYWwoKVxuICAgICAgbGV0IGNvdW50ID0gMFxuICAgICAgLy8gT25seSBjdXJyZW50IG9yIGZ1dHVyZSBlcG9jaHMgZXhpc3QgaW4gc29ydGVkVHhzIChwYXN0IGVwb2NocyBhcmUgcHJ1bmVkIGR1cmluZyB1cGRhdGVTdGF0ZSkuXG4gICAgICAvLyBGdXR1cmUgZXBvY2hzIGFwcGVhciBpZiB3ZSByZWNlaXZlIHR4cyBiZWZvcmUgdGhlIGNvcnJlc3BvbmRpbmcgY2hlY2twb2ludC5cbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgY2xpZW50U3RhdGUuc3RhdGVDYWxjdWxhdG9yLmdldFNvcnRlZFR4cygpKSB7XG4gICAgICAgIGNvbnN0IHRzID0gZW50cnkudHhUaW1lc3RhbXBcbiAgICAgICAgaWYgKHRzLmVwb2NoID09PSBhY3RpdmVFcG9jaCkge1xuICAgICAgICAgIGNvdW50KytcbiAgICAgICAgfSBlbHNlIGlmICh0cy5lcG9jaCA+IGFjdGl2ZUVwb2NoKSB7XG4gICAgICAgICAgYnJlYWsgLy8gT3B0aW1pemF0aW9uOiBzb3J0ZWQgb3JkZXIgbWVhbnMgd2UgY2FuIHN0b3AgZWFybHlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNvdW50XG4gICAgfSxcblxuICAgIGdldEFjdGl2ZUVwb2NoU3RhcnRUaW1lKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgICBhc3NlcnROb3REaXNwb3NlZCgpXG4gICAgICBjb25zdCBhY3RpdmVFcG9jaCA9IGdldEFjdGl2ZUVwb2NoSW50ZXJuYWwoKVxuICAgICAgLy8gT25seSBjdXJyZW50IG9yIGZ1dHVyZSBlcG9jaHMgZXhpc3QgaW4gc29ydGVkVHhzIChwYXN0IGVwb2NocyBhcmUgcHJ1bmVkIGR1cmluZyB1cGRhdGVTdGF0ZSkuXG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGNsaWVudFN0YXRlLnN0YXRlQ2FsY3VsYXRvci5nZXRTb3J0ZWRUeHMoKSkge1xuICAgICAgICBjb25zdCB0cyA9IGVudHJ5LnR4VGltZXN0YW1wXG4gICAgICAgIGlmICh0cy5lcG9jaCA9PT0gYWN0aXZlRXBvY2gpIHtcbiAgICAgICAgICByZXR1cm4gdHMud2FsbENsb2NrXG4gICAgICAgIH0gZWxzZSBpZiAodHMuZXBvY2ggPiBhY3RpdmVFcG9jaCkge1xuICAgICAgICAgIGJyZWFrIC8vIE9wdGltaXphdGlvbjogc29ydGVkIG9yZGVyIG1lYW5zIHdlIGNhbiBzdG9wIGVhcmx5XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9LFxuXG4gICAgaXNMb2dFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgIGFzc2VydE5vdERpc3Bvc2VkKClcbiAgICAgIHJldHVybiB5VHguc2l6ZSA9PT0gMCAmJiB5Q2hlY2twb2ludC5zaXplID09PSAwXG4gICAgfSxcblxuICAgIFtnZXRTb3J0ZWRUeHNTeW1ib2xdKCk6IHJlYWRvbmx5IFNvcnRlZFR4RW50cnlbXSB7XG4gICAgICBhc3NlcnROb3REaXNwb3NlZCgpXG4gICAgICByZXR1cm4gY2xpZW50U3RhdGUuc3RhdGVDYWxjdWxhdG9yLmdldFNvcnRlZFR4cygpXG4gICAgfSxcbiAgfVxufVxuIiwiaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuL2Vycm9yXCJcclxuaW1wb3J0IHsgSlNPTk9iamVjdCwgSlNPTlZhbHVlLCBQYXRoIH0gZnJvbSBcIi4vanNvblwiXHJcbmltcG9ydCB7IGRlZXBDbG9uZSwgZGVlcEVxdWFsLCBpc09iamVjdCwgcGFyc2VBcnJheUluZGV4IH0gZnJvbSBcIi4vdXRpbHNcIlxyXG5cclxuLyoqXHJcbiAqIFN1cHBvcnRlZCBvcGVyYXRpb25zLlxyXG4gKiBBcHBsaWVkIHNlcXVlbnRpYWxseSB3aXRoaW4gYSB0eC5cclxuICovXHJcbmV4cG9ydCB0eXBlIE9wID1cclxuICB8IHsga2luZDogXCJzZXRcIjsgcGF0aDogUGF0aDsga2V5OiBzdHJpbmcgfCBudW1iZXI7IHZhbHVlOiBKU09OVmFsdWUgfVxyXG4gIHwgeyBraW5kOiBcImRlbGV0ZVwiOyBwYXRoOiBQYXRoOyBrZXk6IHN0cmluZyB8IG51bWJlciB9XHJcbiAgfCB7IGtpbmQ6IFwic3BsaWNlXCI7IHBhdGg6IFBhdGg7IGluZGV4OiBudW1iZXI7IGRlbGV0ZUNvdW50OiBudW1iZXI7IGluc2VydHM6IEpTT05WYWx1ZVtdIH1cclxuICB8IHsga2luZDogXCJhZGRUb1NldFwiOyBwYXRoOiBQYXRoOyB2YWx1ZTogSlNPTlZhbHVlIH1cclxuICB8IHsga2luZDogXCJkZWxldGVGcm9tU2V0XCI7IHBhdGg6IFBhdGg7IHZhbHVlOiBKU09OVmFsdWUgfVxyXG5cclxuLyoqXHJcbiAqIFZhbGlkYXRpb24gZnVuY3Rpb24gdHlwZS5cclxuICpcclxuICogUnVsZXM6XHJcbiAqIC0gVmFsaWRhdGlvbiBNVVNUIGRlcGVuZCBvbmx5IG9uIGNhbmRpZGF0ZVN0YXRlIChhbmQgZGV0ZXJtaW5pc3RpYyBjb2RlKS5cclxuICogLSBWYWxpZGF0aW9uIHJ1bnMgb25jZSBwZXIgdHgsIGFmdGVyIGFsbCBvcHMgYXBwbHkuXHJcbiAqIC0gSWYgdmFsaWRhdGlvbiBmYWlscywgdGhlIHggaXMgcmVqZWN0ZWQgKHN0YXRlIHJldmVydHMgdG8gcHJldmlvdXMpLlxyXG4gKiAtIElmIG5vIHZhbGlkYXRvciBpcyBwcm92aWRlZCwgdmFsaWRhdGlvbiBkZWZhdWx0cyB0byB0cnVlLlxyXG4gKlxyXG4gKiBJTVBPUlRBTlQ6IFZhbGlkYXRpb24gb3V0Y29tZSBpcyAqKmRlcml2ZWQgbG9jYWwgc3RhdGUqKiBhbmQgTVVTVCBOT1QgYmUgcmVwbGljYXRlZC5cclxuICogQWxsIGNsaWVudHMgTVVTVCB1c2UgdGhlIHNhbWUgdmFsaWRhdGlvbiBsb2dpYyB0byBlbnN1cmUgY29uc2lzdGVuY3kuXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBWYWxpZGF0ZUZuPFN0YXRlIGV4dGVuZHMgSlNPTk9iamVjdD4gPSAoY2FuZGlkYXRlU3RhdGU6IFN0YXRlKSA9PiBib29sZWFuXHJcblxyXG4vKipcclxuICogUmVzb2x2ZXMgYSBwYXRoIHdpdGhpbiB0aGUgc3RhdGUuXHJcbiAqIFRocm93cyBpZiBhbnkgc2VnbWVudCBpcyBtaXNzaW5nIG9yIGhhcyB3cm9uZyB0eXBlLlxyXG4gKi9cclxuZnVuY3Rpb24gcmVzb2x2ZVBhdGgoc3RhdGU6IEpTT05PYmplY3QsIHBhdGg6IFBhdGgpOiBKU09OVmFsdWUge1xyXG4gIGxldCBjdXJyZW50OiBKU09OVmFsdWUgPSBzdGF0ZVxyXG4gIGZvciAoY29uc3Qgc2VnbWVudCBvZiBwYXRoKSB7XHJcbiAgICBpZiAodHlwZW9mIHNlZ21lbnQgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgaWYgKCFpc09iamVjdChjdXJyZW50KSB8fCBBcnJheS5pc0FycmF5KGN1cnJlbnQpKSB7XHJcbiAgICAgICAgZmFpbHVyZShgRXhwZWN0ZWQgb2JqZWN0IGF0IHBhdGggc2VnbWVudCBcIiR7c2VnbWVudH1cImApXHJcbiAgICAgIH1cclxuICAgICAgaWYgKCEoc2VnbWVudCBpbiBjdXJyZW50KSkge1xyXG4gICAgICAgIGZhaWx1cmUoYFByb3BlcnR5IFwiJHtzZWdtZW50fVwiIGRvZXMgbm90IGV4aXN0YClcclxuICAgICAgfVxyXG4gICAgICBjdXJyZW50ID0gY3VycmVudFtzZWdtZW50XVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGN1cnJlbnQpKSB7XHJcbiAgICAgICAgZmFpbHVyZShgRXhwZWN0ZWQgYXJyYXkgYXQgcGF0aCBzZWdtZW50ICR7c2VnbWVudH1gKVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChzZWdtZW50IDwgMCB8fCBzZWdtZW50ID49IGN1cnJlbnQubGVuZ3RoKSB7XHJcbiAgICAgICAgZmFpbHVyZShgSW5kZXggJHtzZWdtZW50fSBvdXQgb2YgYm91bmRzYClcclxuICAgICAgfVxyXG4gICAgICBjdXJyZW50ID0gY3VycmVudFtzZWdtZW50XVxyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gY3VycmVudFxyXG59XHJcblxyXG4vKipcclxuICogQXBwbGllcyBhIHNpbmdsZSBvcGVyYXRpb24uXHJcbiAqIChSZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZm9yIHN0YW5kYXJkIEpTT04tcGF0Y2ggYmVoYXZpb3IpXHJcbiAqL1xyXG5mdW5jdGlvbiBhcHBseU9wKHN0YXRlOiBKU09OT2JqZWN0LCBvcDogT3AsIGNsb25lVmFsdWVzOiBib29sZWFuKTogdm9pZCB7XHJcbiAgLy8gU3BlY2lhbCBjYXNlOiBpZiBwYXRoIGlzIGVtcHR5LCB3ZSBjYW4ndCByZXNvbHZlIFwiY29udGFpbmVyXCIuXHJcbiAgLy8gVGhlIGNhbGxlciBtdXN0IGhhbmRsZSByb290LWxldmVsIHJlcGxhY2VtZW50IGlmIG5lY2Vzc2FyeSwgYnV0XHJcbiAgLy8gc3RhbmRhcmQgT3BzIHVzdWFsbHkgYWN0IE9OIGEgY29udGFpbmVyLlxyXG4gIC8vIEV4Y2VwdGlvbjogaWYgd2UgYWN0IG9uIHJvb3QsIGhhbmRsZSBleHBsaWNpdGx5IG9yIGFzc3VtZSBwYXRoIGxlbmd0aCA+IDAuXHJcbiAgLy8gRm9yIHRoaXMgc3BlYywgT3BzIG1vZGlmeSAqZmllbGRzKiBvciAqaW5kaWNlcyouXHJcbiAgLy8gSWYgcGF0aCBpcyBlbXB0eSwgaXQgbWVhbnMgd2UgYXJlIGFjdGluZyBPTiB0aGUgcm9vdCBvYmplY3QgaXRzZWxmP1xyXG4gIC8vIFRoZSBzcGVjJ3MgXCJzZXRcIiBleGFtcGxlOiBjb250YWluZXJbb3Aua2V5XSA9IG9wLnZhbHVlLlxyXG4gIC8vIFRoaXMgaW1wbGllcyB3ZSByZXNvbHZlIHBhdGggdG8gZ2V0IHRoZSBQQVJFTlQgY29udGFpbmVyLlxyXG5cclxuICBjb25zdCBjb250YWluZXIgPSByZXNvbHZlUGF0aChzdGF0ZSwgb3AucGF0aClcclxuXHJcbiAgc3dpdGNoIChvcC5raW5kKSB7XHJcbiAgICBjYXNlIFwic2V0XCI6IHtcclxuICAgICAgLy8gQWxsb3cgb2JqZWN0IG9yIGFycmF5IGNvbnRhaW5lclxyXG4gICAgICBpZiAoIWlzT2JqZWN0KGNvbnRhaW5lcikpIHtcclxuICAgICAgICBmYWlsdXJlKFwic2V0IHJlcXVpcmVzIG9iamVjdCBvciBhcnJheSBjb250YWluZXJcIilcclxuICAgICAgfVxyXG4gICAgICBsZXQga2V5OiBzdHJpbmcgfCBudW1iZXIgPSBvcC5rZXlcclxuICAgICAgLy8gRm9yIGFycmF5cywgY29udmVydCBzdHJpbmcga2V5cyB0byBudW1iZXJzIChleGNlcHQgXCJsZW5ndGhcIilcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29udGFpbmVyKSAmJiB0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiICYmIGtleSAhPT0gXCJsZW5ndGhcIikge1xyXG4gICAgICAgIGNvbnN0IG51bUtleSA9IHBhcnNlQXJyYXlJbmRleChrZXkpXHJcbiAgICAgICAgaWYgKG51bUtleSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgZmFpbHVyZShgQ2Fubm90IHNldCBub24tbnVtZXJpYyBwcm9wZXJ0eSBcIiR7a2V5fVwiIG9uIGFycmF5YClcclxuICAgICAgICB9XHJcbiAgICAgICAga2V5ID0gbnVtS2V5XHJcbiAgICAgIH1cclxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgOyhjb250YWluZXIgYXMgYW55KVtrZXldID0gY2xvbmVWYWx1ZXMgPyBkZWVwQ2xvbmUob3AudmFsdWUpIDogb3AudmFsdWVcclxuICAgICAgYnJlYWtcclxuICAgIH1cclxuXHJcbiAgICBjYXNlIFwiZGVsZXRlXCI6IHtcclxuICAgICAgLy8gQWxsb3cgb2JqZWN0IG9yIGFycmF5IChzcGFyc2UgZGVsZXRlPylcclxuICAgICAgaWYgKCFpc09iamVjdChjb250YWluZXIpKSB7XHJcbiAgICAgICAgZmFpbHVyZShcImRlbGV0ZSByZXF1aXJlcyBvYmplY3Qgb3IgYXJyYXkgY29udGFpbmVyXCIpXHJcbiAgICAgIH1cclxuICAgICAgbGV0IGtleTogc3RyaW5nIHwgbnVtYmVyID0gb3Aua2V5XHJcbiAgICAgIC8vIEZvciBhcnJheXMsIGNvbnZlcnQgc3RyaW5nIGtleXMgdG8gbnVtYmVyc1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjb250YWluZXIpICYmIHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICBjb25zdCBudW1LZXkgPSBwYXJzZUFycmF5SW5kZXgoa2V5KVxyXG4gICAgICAgIGlmIChudW1LZXkgPT09IG51bGwpIHtcclxuICAgICAgICAgIGZhaWx1cmUoYENhbm5vdCBkZWxldGUgbm9uLW51bWVyaWMgcHJvcGVydHkgXCIke2tleX1cIiBmcm9tIGFycmF5YClcclxuICAgICAgICB9XHJcbiAgICAgICAga2V5ID0gbnVtS2V5XHJcbiAgICAgIH1cclxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgZGVsZXRlIChjb250YWluZXIgYXMgYW55KVtrZXldXHJcbiAgICAgIGJyZWFrXHJcbiAgICB9XHJcblxyXG4gICAgY2FzZSBcInNwbGljZVwiOiB7XHJcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb250YWluZXIpKSB7XHJcbiAgICAgICAgZmFpbHVyZShcInNwbGljZSByZXF1aXJlcyBhcnJheSBjb250YWluZXJcIilcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBzYWZlSW5kZXggPSBNYXRoLm1pbihvcC5pbmRleCwgY29udGFpbmVyLmxlbmd0aClcclxuICAgICAgY29udGFpbmVyLnNwbGljZShcclxuICAgICAgICBzYWZlSW5kZXgsXHJcbiAgICAgICAgb3AuZGVsZXRlQ291bnQsXHJcbiAgICAgICAgLi4uKGNsb25lVmFsdWVzID8gb3AuaW5zZXJ0cy5tYXAoKHYpID0+IGRlZXBDbG9uZSh2KSkgOiBvcC5pbnNlcnRzKVxyXG4gICAgICApXHJcbiAgICAgIGJyZWFrXHJcbiAgICB9XHJcblxyXG4gICAgY2FzZSBcImFkZFRvU2V0XCI6XHJcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb250YWluZXIpKSB7XHJcbiAgICAgICAgZmFpbHVyZShcImFkZFRvU2V0IHJlcXVpcmVzIGFycmF5IGNvbnRhaW5lclwiKVxyXG4gICAgICB9XHJcbiAgICAgIGlmICghY29udGFpbmVyLnNvbWUoKGl0ZW0pID0+IGRlZXBFcXVhbChpdGVtLCBvcC52YWx1ZSkpKSB7XHJcbiAgICAgICAgY29udGFpbmVyLnB1c2goY2xvbmVWYWx1ZXMgPyBkZWVwQ2xvbmUob3AudmFsdWUpIDogb3AudmFsdWUpXHJcbiAgICAgIH1cclxuICAgICAgYnJlYWtcclxuXHJcbiAgICBjYXNlIFwiZGVsZXRlRnJvbVNldFwiOlxyXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29udGFpbmVyKSkge1xyXG4gICAgICAgIGZhaWx1cmUoXCJkZWxldGVGcm9tU2V0IHJlcXVpcmVzIGFycmF5IGNvbnRhaW5lclwiKVxyXG4gICAgICB9XHJcbiAgICAgIC8vIFJlbW92ZSBhbGwgbWF0Y2hpbmcgaXRlbXMgdXNpbmcgc3BsaWNlIChmcm9tIGVuZCB0byBhdm9pZCBpbmRleCBzaGlmdGluZylcclxuICAgICAgZm9yIChsZXQgaSA9IGNvbnRhaW5lci5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgIGlmIChkZWVwRXF1YWwoY29udGFpbmVyW2ldLCBvcC52YWx1ZSkpIHtcclxuICAgICAgICAgIGNvbnRhaW5lci5zcGxpY2UoaSwgMSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgYnJlYWtcclxuXHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICB0aHJvdyBmYWlsdXJlKGBVbmtub3duIG9wZXJhdGlvbiBraW5kOiAkeyhvcCBhcyBhbnkpLmtpbmR9YClcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBPcHRpb25zIGZvciBhcHBseU9wcy5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXBwbHlPcHNPcHRpb25zIHtcclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIGRlZXAgY2xvbmUgdmFsdWVzIGJlZm9yZSBpbnNlcnRpbmcgdGhlbSBpbnRvIHRoZSB0YXJnZXQuXHJcbiAgICogLSBgdHJ1ZWAgKGRlZmF1bHQpOiBWYWx1ZXMgYXJlIGNsb25lZCB0byBwcmV2ZW50IGFsaWFzaW5nIGJldHdlZW4gdGhlIG9wcyBhbmQgdGFyZ2V0LlxyXG4gICAqIC0gYGZhbHNlYDogVmFsdWVzIGFyZSB1c2VkIGRpcmVjdGx5IGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UuIE9ubHkgdXNlIHRoaXMgaWYgeW91XHJcbiAgICogICBndWFyYW50ZWUgdGhlIG9wIHZhbHVlcyB3b24ndCBiZSBtdXRhdGVkIGFmdGVyIGFwcGxpY2F0aW9uLlxyXG4gICAqL1xyXG4gIGNsb25lVmFsdWVzPzogYm9vbGVhblxyXG59XHJcblxyXG4vKipcclxuICogQXBwbGllcyBhIGxpc3Qgb2Ygb3BlcmF0aW9ucyB0byBhIG11dGFibGUgdGFyZ2V0IG9iamVjdC5cclxuICogVXNlIHRoaXMgdG8gc3luY2hyb25pemUgYW4gZXh0ZXJuYWwgbXV0YWJsZSBzdGF0ZSAoZS5nLiwgTW9iWCBzdG9yZSlcclxuICogd2l0aCB0aGUgb3BlcmF0aW9ucyByZWNlaXZlZCB2aWEgc3Vic2NyaWJlKCkuXHJcbiAqXHJcbiAqIEBwYXJhbSBvcHMgLSBUaGUgbGlzdCBvZiBvcGVyYXRpb25zIHRvIGFwcGx5LlxyXG4gKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIG11dGFibGUgb2JqZWN0IHRvIG1vZGlmeS5cclxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBzZXR0aW5ncyBmb3IgY29udHJvbGxpbmcgY2xvbmluZyBiZWhhdmlvci5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhcHBseU9wcyhvcHM6IHJlYWRvbmx5IE9wW10sIHRhcmdldDogSlNPTk9iamVjdCwgb3B0aW9ucz86IEFwcGx5T3BzT3B0aW9ucyk6IHZvaWQge1xyXG4gIGNvbnN0IGNsb25lVmFsdWVzID0gb3B0aW9ucz8uY2xvbmVWYWx1ZXMgPz8gdHJ1ZVxyXG4gIGZvciAoY29uc3Qgb3Agb2Ygb3BzKSB7XHJcbiAgICBhcHBseU9wKHRhcmdldCwgb3AsIGNsb25lVmFsdWVzKVxyXG4gIH1cclxufVxyXG4iXSwibmFtZXMiOlsiRHJhZnRUeXBlIiwiY3VycmVudCIsIm9yaWdpbmFsIiwiZGVlcENsb25lIiwiZXF1YWwiLCJzY29wZWRVcmxBbHBoYWJldCIsInJmZGMiLCJoYW5kbGVyIiwiY2xvbmUiLCJjcmVhdGVEcmFmdCIsIm9wcyIsIm5leHRTdGF0ZSJdLCJtYXBwaW5ncyI6Ijs7O0FBQU8sTUFBTSwwQkFBMEIsTUFBTTtBQUFBLEVBQzNDLFlBQVksS0FBYTtBQUN2QixVQUFNLEdBQUc7QUFHVCxXQUFPLGVBQWUsTUFBTSxrQkFBa0IsU0FBUztBQUFBLEVBQ3pEO0FBQ0Y7QUFFTyxTQUFTLFFBQVEsU0FBd0I7QUFDOUMsUUFBTSxJQUFJLGtCQUFrQixPQUFPO0FBQ3JDO0FDTE8sTUFBTSxjQUFjLHVCQUFPLElBQUksMkJBQTJCO0FDSTFELElBQUssOEJBQUFBLGVBQUw7QUFDTEEsYUFBQUEsV0FBQSxZQUFTLENBQUEsSUFBVDtBQUNBQSxhQUFBQSxXQUFBLFdBQVEsQ0FBQSxJQUFSO0FBRlUsU0FBQUE7QUFBQSxHQUFBLGFBQUEsQ0FBQSxDQUFBO0FDTUwsU0FBUyxPQUFVLFlBQThCO0FIaEJqRDtBR2lCTCxVQUFRLGdCQUFXLFNBQVgsWUFBbUIsV0FBVztBQUN4QztBQUtPLFNBQVMsUUFBUSxRQUEwQjtBQUNoRCxTQUFPLENBQUMsQ0FBQyxjQUFjLE1BQU07QUFDL0I7QUFLTyxTQUFTLGNBQWlCLE9BQXNDO0FIOUJoRTtBRytCTCxNQUFJLE9BQU8sVUFBVSxZQUFZLFVBQVUsS0FBTSxRQUFPO0FBQ3hELFVBQVEsV0FBNEMsV0FBVyxNQUF2RCxZQUE0RDtBQUN0RTtBQUtPLFNBQVMsU0FBMkIsT0FBYTtBSHRDakQ7QUd1Q0wsUUFBTSxhQUFhLGNBQWMsS0FBSztBQUN0QyxTQUFPLGNBQWUsZ0JBQVcsU0FBWCxZQUFtQixXQUFXLFdBQWtCO0FBQ3hFO0FBTU8sU0FBUyxZQUFZLE9BQWlDO0FBQzNELE1BQUksVUFBVSxRQUFRLE9BQU8sVUFBVSxTQUFVLFFBQU87QUFDeEQsU0FBTyxNQUFNLFFBQVEsS0FBSyxLQUFLLE9BQU8s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
|