mtrl-addons 0.3.2 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +61 -15
- package/dist/index.mjs +61 -15
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -3202,6 +3202,13 @@ function withCollection(config = {}) {
|
|
|
3202
3202
|
}
|
|
3203
3203
|
rangesToRemove.forEach((rangeId) => {
|
|
3204
3204
|
loadedRanges.delete(rangeId);
|
|
3205
|
+
pendingRanges.delete(rangeId);
|
|
3206
|
+
activeRequests.delete(rangeId);
|
|
3207
|
+
const controller = abortControllers.get(rangeId);
|
|
3208
|
+
if (controller) {
|
|
3209
|
+
controller.abort();
|
|
3210
|
+
abortControllers.delete(rangeId);
|
|
3211
|
+
}
|
|
3205
3212
|
});
|
|
3206
3213
|
if (evictedCount > 0) {
|
|
3207
3214
|
component2.emit?.("collection:items-evicted", {
|
|
@@ -3254,7 +3261,7 @@ function withCollection(config = {}) {
|
|
|
3254
3261
|
const executeQueuedLoad = (request) => {
|
|
3255
3262
|
activeLoadCount++;
|
|
3256
3263
|
activeLoadRanges.add(getRangeKey(request.range));
|
|
3257
|
-
loadMissingRangesInternal(request.range).then(() => {
|
|
3264
|
+
loadMissingRangesInternal(request.range, request.caller).then(() => {
|
|
3258
3265
|
request.resolve();
|
|
3259
3266
|
completedLoads++;
|
|
3260
3267
|
}).catch((error) => {
|
|
@@ -3362,7 +3369,10 @@ function withCollection(config = {}) {
|
|
|
3362
3369
|
if (viewportState) {
|
|
3363
3370
|
viewportState.totalItems = newTotal ?? items.length;
|
|
3364
3371
|
}
|
|
3365
|
-
|
|
3372
|
+
const itemsActuallyStored = transformedItems.length > 0 && transformedItems.every((_, idx) => items[offset + idx] !== undefined);
|
|
3373
|
+
if (itemsActuallyStored) {
|
|
3374
|
+
loadedRanges.add(rangeId);
|
|
3375
|
+
}
|
|
3366
3376
|
pendingRanges.delete(rangeId);
|
|
3367
3377
|
failedRanges.delete(rangeId);
|
|
3368
3378
|
if (completedLoads % 5 === 0) {
|
|
@@ -3415,7 +3425,7 @@ function withCollection(config = {}) {
|
|
|
3415
3425
|
activeRequests.set(rangeId, requestPromise);
|
|
3416
3426
|
return requestPromise;
|
|
3417
3427
|
};
|
|
3418
|
-
const loadMissingRangesInternal = async (range) => {
|
|
3428
|
+
const loadMissingRangesInternal = async (range, caller) => {
|
|
3419
3429
|
if (!collection)
|
|
3420
3430
|
return;
|
|
3421
3431
|
if (strategy === "cursor") {
|
|
@@ -3472,10 +3482,22 @@ function withCollection(config = {}) {
|
|
|
3472
3482
|
}
|
|
3473
3483
|
}
|
|
3474
3484
|
if (rangesToLoad.length === 0) {
|
|
3475
|
-
|
|
3485
|
+
for (let rangeId = startRange;rangeId <= endRange; rangeId++) {
|
|
3486
|
+
if (loadedRanges.has(rangeId)) {
|
|
3487
|
+
const rangeStart = rangeId * rangeSize;
|
|
3488
|
+
const hasData = items.slice(rangeStart, rangeStart + rangeSize).some((item) => item !== undefined);
|
|
3489
|
+
if (!hasData) {
|
|
3490
|
+
loadedRanges.delete(rangeId);
|
|
3491
|
+
rangesToLoad.push(rangeId);
|
|
3492
|
+
}
|
|
3493
|
+
}
|
|
3494
|
+
}
|
|
3495
|
+
if (rangesToLoad.length === 0 && loadRequestQueue.length > 0 && activeLoadCount < maxConcurrentRequests) {
|
|
3476
3496
|
processQueue();
|
|
3477
3497
|
}
|
|
3478
|
-
|
|
3498
|
+
if (rangesToLoad.length === 0) {
|
|
3499
|
+
return;
|
|
3500
|
+
}
|
|
3479
3501
|
}
|
|
3480
3502
|
const promises = rangesToLoad.map((rangeId) => loadRange(rangeId * rangeSize, rangeSize));
|
|
3481
3503
|
await Promise.allSettled(promises);
|
|
@@ -3503,7 +3525,8 @@ function withCollection(config = {}) {
|
|
|
3503
3525
|
priority: "normal",
|
|
3504
3526
|
timestamp: Date.now(),
|
|
3505
3527
|
resolve,
|
|
3506
|
-
reject
|
|
3528
|
+
reject,
|
|
3529
|
+
caller
|
|
3507
3530
|
});
|
|
3508
3531
|
} else if (enableRequestQueue && loadRequestQueue.length < maxQueueSize) {
|
|
3509
3532
|
loadRequestQueue.push({
|
|
@@ -3511,17 +3534,34 @@ function withCollection(config = {}) {
|
|
|
3511
3534
|
priority: "normal",
|
|
3512
3535
|
timestamp: Date.now(),
|
|
3513
3536
|
resolve,
|
|
3514
|
-
reject
|
|
3537
|
+
reject,
|
|
3538
|
+
caller
|
|
3515
3539
|
});
|
|
3516
3540
|
} else {
|
|
3517
|
-
if (
|
|
3518
|
-
|
|
3519
|
-
removed.forEach((r) => {
|
|
3541
|
+
if (caller === "viewport:idle" || caller === "viewport:range-changed") {
|
|
3542
|
+
loadRequestQueue.forEach((r) => {
|
|
3520
3543
|
cancelledLoads++;
|
|
3521
3544
|
r.resolve();
|
|
3522
3545
|
});
|
|
3546
|
+
loadRequestQueue.length = 0;
|
|
3547
|
+
loadRequestQueue.push({
|
|
3548
|
+
range,
|
|
3549
|
+
priority: "high",
|
|
3550
|
+
timestamp: Date.now(),
|
|
3551
|
+
resolve,
|
|
3552
|
+
reject,
|
|
3553
|
+
caller
|
|
3554
|
+
});
|
|
3555
|
+
} else {
|
|
3556
|
+
if (loadRequestQueue.length >= maxQueueSize) {
|
|
3557
|
+
const removed = loadRequestQueue.splice(0, loadRequestQueue.length - maxQueueSize);
|
|
3558
|
+
removed.forEach((r) => {
|
|
3559
|
+
cancelledLoads++;
|
|
3560
|
+
r.resolve();
|
|
3561
|
+
});
|
|
3562
|
+
}
|
|
3563
|
+
resolve();
|
|
3523
3564
|
}
|
|
3524
|
-
resolve();
|
|
3525
3565
|
}
|
|
3526
3566
|
});
|
|
3527
3567
|
};
|
|
@@ -4174,7 +4214,6 @@ var withRendering = (config = {}) => {
|
|
|
4174
4214
|
if (placeholders && !placeholders.hasAnalyzedStructure()) {
|
|
4175
4215
|
placeholders.analyzeDataStructure(data.items);
|
|
4176
4216
|
}
|
|
4177
|
-
let replacedCount = 0;
|
|
4178
4217
|
let skippedCount = 0;
|
|
4179
4218
|
data.items.forEach((item, i) => {
|
|
4180
4219
|
const index = data.offset + i;
|
|
@@ -4183,7 +4222,6 @@ var withRendering = (config = {}) => {
|
|
|
4183
4222
|
const wasPlaceholder = oldItem && isPlaceholder(oldItem);
|
|
4184
4223
|
const hasElement = renderedElements.has(index);
|
|
4185
4224
|
if (wasPlaceholder && hasElement) {
|
|
4186
|
-
replacedCount++;
|
|
4187
4225
|
const element = renderedElements.get(index);
|
|
4188
4226
|
if (element) {
|
|
4189
4227
|
const newElement = renderItem(item, index);
|
|
@@ -4213,6 +4251,14 @@ var withRendering = (config = {}) => {
|
|
|
4213
4251
|
skippedCount++;
|
|
4214
4252
|
}
|
|
4215
4253
|
});
|
|
4254
|
+
if (skippedCount > 0 && viewportState?.visibleRange) {
|
|
4255
|
+
const { start, end } = viewportState.visibleRange;
|
|
4256
|
+
const loadedStart = data.offset;
|
|
4257
|
+
const loadedEnd = data.offset + data.items.length - 1;
|
|
4258
|
+
if (loadedStart <= end && loadedEnd >= start) {
|
|
4259
|
+
renderItems();
|
|
4260
|
+
}
|
|
4261
|
+
}
|
|
4216
4262
|
const { visibleRange } = viewportState || {};
|
|
4217
4263
|
if (visibleRange) {
|
|
4218
4264
|
const renderStart = Math.max(0, visibleRange.start - overscan);
|
|
@@ -6353,5 +6399,5 @@ var createForm = (config = {}) => {
|
|
|
6353
6399
|
}
|
|
6354
6400
|
};
|
|
6355
6401
|
|
|
6356
|
-
//# debugId=
|
|
6357
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvdXRpbHMudHMiLCAiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvdGFwLnRzIiwgIi4uL3NyYy9jb3JlL2dlc3R1cmVzL3N3aXBlLnRzIiwgIi4uL3NyYy9jb3JlL2dlc3R1cmVzL2xvbmdwcmVzcy50cyIsICIuLi9zcmMvY29yZS9nZXN0dXJlcy9wYW4udHMiLCAiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvcGluY2gudHMiLCAiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvcm90YXRlLnRzIiwgIi4uL3NyYy9jb3JlL2dlc3R1cmVzL21hbmFnZXIudHMiLCAiLi4vc3JjL2NvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlcy9pbmRleC50cyIsICIuLi9zcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3RhcC50cyIsICIuLi9zcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3N3aXBlLnRzIiwgIi4uL3NyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMvbG9uZ3ByZXNzLnRzIiwgIi4uL3NyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMvcGFuLnRzIiwgIi4uL3NyYy9jb3JlL2xheW91dC9zY2hlbWEudHMiLCAiLi4vc3JjL2NvcmUvbGF5b3V0L2NvbmZpZy50cyIsICIuLi9zcmMvY29yZS9sYXlvdXQvanN4LnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L3ZpZXdwb3J0LnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3V0aWxzLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL2Jhc2UudHMiLCAiLi4vc3JjL2NvcmUvdmlld3BvcnQvY29uc3RhbnRzLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3ZpcnR1YWwudHMiLCAiLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvc2Nyb2xsaW5nLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL21vbWVudHVtLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3Njcm9sbGJhci50cyIsICIuLi9zcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9jb2xsZWN0aW9uLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3BsYWNlaG9sZGVycy50cyIsICIuLi9zcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9yZW5kZXJpbmcudHMiLCAiLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvZXZlbnRzLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L3ZsaXN0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL3ZpZXdwb3J0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL2FwaS50cyIsICIuLi9zcmMvY29tcG9uZW50cy92bGlzdC9jb25zdGFudHMudHMiLCAiLi4vc3JjL2NvbXBvbmVudHMvdmxpc3QvZmVhdHVyZXMvc2VsZWN0aW9uLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vZm9ybS50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2xheW91dC50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2NvbnN0YW50cy50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2NvbmZpZy50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2ZpZWxkcy50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2RhdGEudHMiLCAiLi4vc3JjL2NvbXBvbmVudHMvZm9ybS9mZWF0dXJlcy9jb250cm9sbGVyLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vZmVhdHVyZXMvc3VibWl0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vZmVhdHVyZXMvYXBpLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIi8vIHNyYy9jb3JlL2dlc3R1cmVzL3V0aWxzLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBnZXN0dXJlIGRldGVjdGlvblxuICovXG5cbmltcG9ydCB7IEdlc3R1cmVFdmVudCwgR2VzdHVyZVN0YXRlIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBDYWxjdWxhdGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzXG4gKlxuICogQHBhcmFtIHgxIC0gWCBjb29yZGluYXRlIG9mIGZpcnN0IHBvaW50XG4gKiBAcGFyYW0geTEgLSBZIGNvb3JkaW5hdGUgb2YgZmlyc3QgcG9pbnRcbiAqIEBwYXJhbSB4MiAtIFggY29vcmRpbmF0ZSBvZiBzZWNvbmQgcG9pbnRcbiAqIEBwYXJhbSB5MiAtIFkgY29vcmRpbmF0ZSBvZiBzZWNvbmQgcG9pbnRcbiAqIEByZXR1cm5zIERpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGlzdGFuY2UoXG4gIHgxOiBudW1iZXIsXG4gIHkxOiBudW1iZXIsXG4gIHgyOiBudW1iZXIsXG4gIHkyOiBudW1iZXJcbik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3coeDIgLSB4MSwgMikgKyBNYXRoLnBvdyh5MiAtIHkxLCAyKSk7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIGFuZ2xlIGJldHdlZW4gdHdvIHBvaW50cyBpbiBkZWdyZWVzICgwLTM2MClcbiAqXG4gKiBAcGFyYW0geDEgLSBYIGNvb3JkaW5hdGUgb2YgZmlyc3QgcG9pbnRcbiAqIEBwYXJhbSB5MSAtIFkgY29vcmRpbmF0ZSBvZiBmaXJzdCBwb2ludFxuICogQHBhcmFtIHgyIC0gWCBjb29yZGluYXRlIG9mIHNlY29uZCBwb2ludFxuICogQHBhcmFtIHkyIC0gWSBjb29yZGluYXRlIG9mIHNlY29uZCBwb2ludFxuICogQHJldHVybnMgQW5nbGUgaW4gZGVncmVlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QW5nbGUoXG4gIHgxOiBudW1iZXIsXG4gIHkxOiBudW1iZXIsXG4gIHgyOiBudW1iZXIsXG4gIHkyOiBudW1iZXJcbik6IG51bWJlciB7XG4gIGNvbnN0IGFuZ2xlID0gKE1hdGguYXRhbjIoeTIgLSB5MSwgeDIgLSB4MSkgKiAxODApIC8gTWF0aC5QSTtcbiAgcmV0dXJuIGFuZ2xlIDwgMCA/IGFuZ2xlICsgMzYwIDogYW5nbGU7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgYmFzZSBnZXN0dXJlIGV2ZW50XG4gKlxuICogQHBhcmFtIHR5cGUgLSBUeXBlIG9mIGdlc3R1cmVcbiAqIEBwYXJhbSBvcmlnaW5hbEV2ZW50IC0gT3JpZ2luYWwgRE9NIGV2ZW50XG4gKiBAcGFyYW0gc3RhdGUgLSBDdXJyZW50IGdlc3R1cmUgc3RhdGVcbiAqIEByZXR1cm5zIEJhc2UgZ2VzdHVyZSBldmVudCBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUdlc3R1cmVFdmVudChcbiAgdHlwZTogc3RyaW5nLFxuICBvcmlnaW5hbEV2ZW50OiBFdmVudCxcbiAgc3RhdGU6IEdlc3R1cmVTdGF0ZVxuKTogR2VzdHVyZUV2ZW50IHtcbiAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gIGxldCBkZWZhdWx0UHJldmVudGVkID0gZmFsc2U7XG5cbiAgY29uc3QgZXZlbnQ6IEdlc3R1cmVFdmVudCA9IHtcbiAgICB0eXBlLFxuICAgIG9yaWdpbmFsRXZlbnQsXG4gICAgdGFyZ2V0OlxuICAgICAgKHN0YXRlLnRhcmdldCBhcyBFdmVudFRhcmdldCkgfHwgKG9yaWdpbmFsRXZlbnQudGFyZ2V0IGFzIEV2ZW50VGFyZ2V0KSxcbiAgICBzdGFydFRpbWU6IHN0YXRlLnN0YXJ0VGltZSxcbiAgICBlbmRUaW1lLFxuICAgIGR1cmF0aW9uOiBlbmRUaW1lIC0gc3RhdGUuc3RhcnRUaW1lLFxuICAgIGRlZmF1bHRQcmV2ZW50ZWQsXG4gICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHtcbiAgICAgIGRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgICBpZiAob3JpZ2luYWxFdmVudC5jYW5jZWxhYmxlKSB7XG4gICAgICAgIG9yaWdpbmFsRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHN0b3BQcm9wYWdhdGlvbjogKCkgPT4ge1xuICAgICAgb3JpZ2luYWxFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBldmVudDtcbn1cblxuLyoqXG4gKiBEZXRlY3QgaWYgdGhlIGRldmljZSBzdXBwb3J0cyB0b3VjaCBldmVudHNcbiAqXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRvdWNoIGlzIHN1cHBvcnRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzVG91Y2hTdXBwb3J0KCk6IGJvb2xlYW4ge1xuICBjb25zdCBtYXhQb2ludHMgPSAobmF2aWdhdG9yIGFzIGFueSkubWF4VG91Y2hQb2ludHM7XG4gIHJldHVybiAoXG4gICAgXCJvbnRvdWNoc3RhcnRcIiBpbiB3aW5kb3cgfHwgKHR5cGVvZiBtYXhQb2ludHMgPT09IFwibnVtYmVyXCIgJiYgbWF4UG9pbnRzID4gMClcbiAgKTtcbn1cblxuLyoqXG4gKiBEZXRlY3QgaWYgdGhlIGRldmljZSBzdXBwb3J0cyBwb2ludGVyIGV2ZW50c1xuICpcbiAqIEByZXR1cm5zIFdoZXRoZXIgcG9pbnRlciBldmVudHMgYXJlIHN1cHBvcnRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzUG9pbnRlclN1cHBvcnQoKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIXdpbmRvdy5Qb2ludGVyRXZlbnQ7XG59XG5cbi8qKlxuICogRXh0cmFjdCBub3JtYWxpemVkIHRvdWNoIGNvb3JkaW5hdGVzIGZyb20gYW4gZXZlbnRcbiAqIFdvcmtzIHdpdGggbW91c2UgZXZlbnRzLCB0b3VjaCBldmVudHMgYW5kIHBvaW50ZXIgZXZlbnRzXG4gKlxuICogQHBhcmFtIGUgLSBET00gZXZlbnRcbiAqIEByZXR1cm5zIE9iamVjdCB3aXRoIGNsaWVudFggYW5kIGNsaWVudFkgY29vcmRpbmF0ZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRvdWNoQ29vcmRpbmF0ZXMoXG4gIGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50IHwgUG9pbnRlckV2ZW50XG4pOiB7IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH0ge1xuICBpZiAoXCJ0b3VjaGVzXCIgaW4gZSAmJiBBcnJheS5pc0FycmF5KGUudG91Y2hlcykgJiYgZS50b3VjaGVzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2xpZW50WDogZS50b3VjaGVzWzBdLmNsaWVudFgsXG4gICAgICBjbGllbnRZOiBlLnRvdWNoZXNbMF0uY2xpZW50WSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjbGllbnRYOiAoZSBhcyBNb3VzZUV2ZW50IHwgUG9pbnRlckV2ZW50KS5jbGllbnRYLFxuICAgIGNsaWVudFk6IChlIGFzIE1vdXNlRXZlbnQgfCBQb2ludGVyRXZlbnQpLmNsaWVudFksXG4gIH07XG59XG4iLAogICAgIi8vIHNyYy9jb3JlL2dlc3R1cmVzL3RhcC50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBUYXAgZ2VzdHVyZSBkZXRlY3Rpb25cbiAqL1xuXG5pbXBvcnQgeyBUYXBFdmVudCwgR2VzdHVyZURldGVjdGlvbkNvbnRleHQgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZUdlc3R1cmVFdmVudCB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIERldGVjdCB0YXAgZ2VzdHVyZVxuICogXG4gKiBAcGFyYW0gY29udGV4dCAtIEdlc3R1cmUgZGV0ZWN0aW9uIGNvbnRleHRcbiAqIEByZXR1cm5zIFRhcCBldmVudCBvciBudWxsIGlmIG5vIHRhcCBkZXRlY3RlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0VGFwKGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0KTogVGFwRXZlbnQgfCBudWxsIHtcbiAgY29uc3QgeyBzdGF0ZSwgb3B0aW9ucywgb3JpZ2luYWxFdmVudCB9ID0gY29udGV4dDtcbiAgXG4gIC8vIENhbGN1bGF0ZSBkaXN0YW5jZSBiZXR3ZWVuIHN0YXJ0IGFuZCBjdXJyZW50IHBvc2l0aW9uXG4gIGNvbnN0IGRlbHRhWCA9IHN0YXRlLmN1cnJlbnRYIC0gc3RhdGUuc3RhcnRYO1xuICBjb25zdCBkZWx0YVkgPSBzdGF0ZS5jdXJyZW50WSAtIHN0YXRlLnN0YXJ0WTtcbiAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcbiAgXG4gIC8vIENoZWNrIGlmIG1vdmVtZW50IGlzIHdpdGhpbiB0aHJlc2hvbGRcbiAgaWYgKGRpc3RhbmNlIDwgb3B0aW9ucy50YXBEaXN0YW5jZVRocmVzaG9sZCkge1xuICAgIC8vIENoZWNrIGZvciBkb3VibGUgdGFwXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBpc0RvdWJsZVRhcCA9IG5vdyAtIHN0YXRlLmxhc3RUYXBUaW1lIDwgMzAwO1xuICAgIFxuICAgIGNvbnN0IHRhcENvdW50ID0gaXNEb3VibGVUYXAgPyBzdGF0ZS50YXBDb3VudCArIDEgOiAxO1xuICAgIFxuICAgIC8vIENyZWF0ZSB0YXAgZXZlbnRcbiAgICBjb25zdCB0YXBFdmVudDogVGFwRXZlbnQgPSB7XG4gICAgICAuLi5jcmVhdGVHZXN0dXJlRXZlbnQoJ3RhcCcsIG9yaWdpbmFsRXZlbnQsIHN0YXRlKSxcbiAgICAgIHR5cGU6ICd0YXAnLFxuICAgICAgY291bnQ6IHRhcENvdW50LFxuICAgICAgeDogc3RhdGUuY3VycmVudFgsXG4gICAgICB5OiBzdGF0ZS5jdXJyZW50WVxuICAgIH07XG4gICAgXG4gICAgcmV0dXJuIHRhcEV2ZW50O1xuICB9XG4gIFxuICByZXR1cm4gbnVsbDtcbn0iLAogICAgIi8vIHNyYy9jb3JlL2dlc3R1cmVzL3N3aXBlLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIFN3aXBlIGdlc3R1cmUgZGV0ZWN0aW9uXG4gKi9cblxuaW1wb3J0IHsgU3dpcGVFdmVudCwgR2VzdHVyZURldGVjdGlvbkNvbnRleHQsIFNXSVBFX0RJUkVDVElPTlMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZUdlc3R1cmVFdmVudCB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIERldGVybWluZSBzd2lwZSBkaXJlY3Rpb24gYmFzZWQgb24gZGVsdGEgWCBhbmQgWVxuICogXG4gKiBAcGFyYW0gZGVsdGFYIC0gRGlzdGFuY2UgbW92ZWQgaW4gWCBkaXJlY3Rpb25cbiAqIEBwYXJhbSBkZWx0YVkgLSBEaXN0YW5jZSBtb3ZlZCBpbiBZIGRpcmVjdGlvblxuICogQHJldHVybnMgRGlyZWN0aW9uIG9mIHRoZSBzd2lwZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3dpcGVEaXJlY3Rpb24oZGVsdGFYOiBudW1iZXIsIGRlbHRhWTogbnVtYmVyKTogU1dJUEVfRElSRUNUSU9OUyB7XG4gIGlmIChNYXRoLmFicyhkZWx0YVgpID4gTWF0aC5hYnMoZGVsdGFZKSkge1xuICAgIHJldHVybiBkZWx0YVggPiAwID8gU1dJUEVfRElSRUNUSU9OUy5SSUdIVCA6IFNXSVBFX0RJUkVDVElPTlMuTEVGVDtcbiAgfVxuICByZXR1cm4gZGVsdGFZID4gMCA/IFNXSVBFX0RJUkVDVElPTlMuRE9XTiA6IFNXSVBFX0RJUkVDVElPTlMuVVA7XG59XG5cbi8qKlxuICogRGV0ZWN0IHN3aXBlIGdlc3R1cmVcbiAqIFxuICogQHBhcmFtIGNvbnRleHQgLSBHZXN0dXJlIGRldGVjdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBTd2lwZSBldmVudCBvciBudWxsIGlmIG5vIHN3aXBlIGRldGVjdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RTd2lwZShjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCk6IFN3aXBlRXZlbnQgfCBudWxsIHtcbiAgY29uc3QgeyBzdGF0ZSwgb3B0aW9ucywgb3JpZ2luYWxFdmVudCB9ID0gY29udGV4dDtcbiAgXG4gIC8vIENhbGN1bGF0ZSBkZWx0YXMgYW5kIGRpc3RhbmNlXG4gIGNvbnN0IGRlbHRhWCA9IHN0YXRlLmN1cnJlbnRYIC0gc3RhdGUuc3RhcnRYO1xuICBjb25zdCBkZWx0YVkgPSBzdGF0ZS5jdXJyZW50WSAtIHN0YXRlLnN0YXJ0WTtcbiAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcbiAgXG4gIC8vIENhbGN1bGF0ZSB0aW1lIGFuZCB2ZWxvY2l0eVxuICBjb25zdCBlbmRUaW1lID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgZGVsdGFUaW1lID0gZW5kVGltZSAtIHN0YXRlLnN0YXJ0VGltZTtcbiAgY29uc3QgdmVsb2NpdHkgPSBkaXN0YW5jZSAvIGRlbHRhVGltZTtcbiAgXG4gIC8vIENoZWNrIGlmIGl0J3MgYSBzd2lwZVxuICBpZiAoZGlzdGFuY2UgPj0gb3B0aW9ucy5zd2lwZVRocmVzaG9sZCAmJiBkZWx0YVRpbWUgPD0gb3B0aW9ucy5zd2lwZVRpbWVUaHJlc2hvbGQpIHtcbiAgICBjb25zdCBkaXJlY3Rpb24gPSBnZXRTd2lwZURpcmVjdGlvbihkZWx0YVgsIGRlbHRhWSk7XG4gICAgXG4gICAgLy8gQ3JlYXRlIHN3aXBlIGV2ZW50XG4gICAgY29uc3Qgc3dpcGVFdmVudDogU3dpcGVFdmVudCA9IHtcbiAgICAgIC4uLmNyZWF0ZUdlc3R1cmVFdmVudCgnc3dpcGUnLCBvcmlnaW5hbEV2ZW50LCBzdGF0ZSksXG4gICAgICB0eXBlOiAnc3dpcGUnLFxuICAgICAgZGlyZWN0aW9uLFxuICAgICAgZGVsdGFYLFxuICAgICAgZGVsdGFZLFxuICAgICAgZGlzdGFuY2UsXG4gICAgICB2ZWxvY2l0eSxcbiAgICAgIHN0YXJ0WDogc3RhdGUuc3RhcnRYLFxuICAgICAgc3RhcnRZOiBzdGF0ZS5zdGFydFksXG4gICAgICBlbmRYOiBzdGF0ZS5jdXJyZW50WCxcbiAgICAgIGVuZFk6IHN0YXRlLmN1cnJlbnRZXG4gICAgfTtcbiAgICBcbiAgICByZXR1cm4gc3dpcGVFdmVudDtcbiAgfVxuICBcbiAgcmV0dXJuIG51bGw7XG59IiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy9sb25ncHJlc3MudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2dlc3R1cmVzXG4gKiBAZGVzY3JpcHRpb24gTG9uZyBwcmVzcyBnZXN0dXJlIGRldGVjdGlvblxuICovXG5cbmltcG9ydCB7IExvbmdQcmVzc0V2ZW50LCBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlR2VzdHVyZUV2ZW50IH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogRGV0ZWN0IGxvbmcgcHJlc3MgZ2VzdHVyZVxuICogXG4gKiBUaGlzIGlzIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIG90aGVyIGdlc3R1cmUgZGV0ZWN0b3JzIGFzIGl0IHNldHMgdXAgYSB0aW1lclxuICogYW5kIHJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIHRpbWVyIGNvbXBsZXRlcy5cbiAqIFxuICogQHBhcmFtIGNvbnRleHQgLSBHZXN0dXJlIGRldGVjdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gbG9uZyBwcmVzcyBpcyBkZXRlY3RlZFxuICogQHJldHVybnMgQ2xlYW51cCBmdW5jdGlvbiB0byBjYW5jZWwgdGhlIGxvbmcgcHJlc3MgZGV0ZWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RMb25nUHJlc3MoXG4gIGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0LFxuICBjYWxsYmFjazogKGV2ZW50OiBMb25nUHJlc3NFdmVudCkgPT4gdm9pZFxuKTogKCkgPT4gdm9pZCB7XG4gIGNvbnN0IHsgc3RhdGUsIG9wdGlvbnMsIG9yaWdpbmFsRXZlbnQgfSA9IGNvbnRleHQ7XG4gIFxuICAvLyBTZXQgYSB0aW1lciBmb3IgbG9uZyBwcmVzcyBkZXRlY3Rpb25cbiAgY29uc3QgdGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgLy8gT25seSB0cmlnZ2VyIGlmIGdlc3R1cmUgaXMgc3RpbGwgYWN0aXZlXG4gICAgaWYgKHN0YXRlLmFjdGl2ZSkge1xuICAgICAgLy8gQ2hlY2sgaWYgbW92ZW1lbnQgaXMgd2l0aGluIHRocmVzaG9sZFxuICAgICAgY29uc3QgZGlmZlggPSBNYXRoLmFicyhzdGF0ZS5jdXJyZW50WCAtIHN0YXRlLnN0YXJ0WCk7XG4gICAgICBjb25zdCBkaWZmWSA9IE1hdGguYWJzKHN0YXRlLmN1cnJlbnRZIC0gc3RhdGUuc3RhcnRZKTtcbiAgICAgIFxuICAgICAgaWYgKGRpZmZYIDwgb3B0aW9ucy50YXBEaXN0YW5jZVRocmVzaG9sZCAmJiBkaWZmWSA8IG9wdGlvbnMudGFwRGlzdGFuY2VUaHJlc2hvbGQpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGxvbmcgcHJlc3MgZXZlbnRcbiAgICAgICAgY29uc3QgbG9uZ1ByZXNzRXZlbnQ6IExvbmdQcmVzc0V2ZW50ID0ge1xuICAgICAgICAgIC4uLmNyZWF0ZUdlc3R1cmVFdmVudCgnbG9uZ3ByZXNzJywgb3JpZ2luYWxFdmVudCwgc3RhdGUpLFxuICAgICAgICAgIHR5cGU6ICdsb25ncHJlc3MnLFxuICAgICAgICAgIHg6IHN0YXRlLmN1cnJlbnRYLFxuICAgICAgICAgIHk6IHN0YXRlLmN1cnJlbnRZXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICAvLyBUcmlnZ2VyIGNhbGxiYWNrXG4gICAgICAgIGNhbGxiYWNrKGxvbmdQcmVzc0V2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIG9wdGlvbnMubG9uZ1ByZXNzVGltZSk7XG4gIFxuICAvLyBSZXR1cm4gY2xlYW51cCBmdW5jdGlvblxuICByZXR1cm4gKCkgPT4ge1xuICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gIH07XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgbW92ZW1lbnQgd291bGQgY2FuY2VsIGEgbG9uZyBwcmVzc1xuICogXG4gKiBAcGFyYW0gY29udGV4dCAtIEdlc3R1cmUgZGV0ZWN0aW9uIGNvbnRleHRcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxvbmcgcHJlc3Mgc2hvdWxkIGJlIGNhbmNlbGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRDYW5jZWxMb25nUHJlc3MoY29udGV4dDogR2VzdHVyZURldGVjdGlvbkNvbnRleHQpOiBib29sZWFuIHtcbiAgY29uc3QgeyBzdGF0ZSwgb3B0aW9ucyB9ID0gY29udGV4dDtcbiAgXG4gIGNvbnN0IGRpZmZYID0gTWF0aC5hYnMoc3RhdGUuY3VycmVudFggLSBzdGF0ZS5zdGFydFgpO1xuICBjb25zdCBkaWZmWSA9IE1hdGguYWJzKHN0YXRlLmN1cnJlbnRZIC0gc3RhdGUuc3RhcnRZKTtcbiAgXG4gIHJldHVybiBkaWZmWCA+IG9wdGlvbnMudGFwRGlzdGFuY2VUaHJlc2hvbGQgfHwgZGlmZlkgPiBvcHRpb25zLnRhcERpc3RhbmNlVGhyZXNob2xkO1xufSIsCiAgICAiLy8gc3JjL2NvcmUvZ2VzdHVyZXMvcGFuLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIFBhbiBnZXN0dXJlIGRldGVjdGlvblxuICovXG5cbmltcG9ydCB7IFBhbkV2ZW50LCBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBjcmVhdGVHZXN0dXJlRXZlbnQgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIERldGVjdCBwYW4gZ2VzdHVyZVxuICpcbiAqIEBwYXJhbSBjb250ZXh0IC0gR2VzdHVyZSBkZXRlY3Rpb24gY29udGV4dFxuICogQHJldHVybnMgUGFuIGV2ZW50IG9yIG51bGwgaWYgbm8gc2lnbmlmaWNhbnQgbW92ZW1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdFBhbihjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCk6IFBhbkV2ZW50IHwgbnVsbCB7XG4gIGNvbnN0IHsgc3RhdGUsIG9yaWdpbmFsRXZlbnQgfSA9IGNvbnRleHQ7XG5cbiAgLy8gQ2FsY3VsYXRlIGRlbHRhIGZyb20gc3RhcnQgcG9zaXRpb25cbiAgY29uc3QgZGVsdGFYID0gc3RhdGUuY3VycmVudFggLSBzdGF0ZS5zdGFydFg7XG4gIGNvbnN0IGRlbHRhWSA9IHN0YXRlLmN1cnJlbnRZIC0gc3RhdGUuc3RhcnRZO1xuXG4gIC8vIENhbGN1bGF0ZSBkZWx0YSBmcm9tIGxhc3QgcG9zaXRpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZXJlJ3Mgc2lnbmlmaWNhbnQgbW92ZW1lbnRcbiAgY29uc3QgbW92ZURlbHRhWCA9IHN0YXRlLmN1cnJlbnRYIC0gc3RhdGUubGFzdFg7XG4gIGNvbnN0IG1vdmVEZWx0YVkgPSBzdGF0ZS5jdXJyZW50WSAtIHN0YXRlLmxhc3RZO1xuICBjb25zdCBtb3ZlRGVsdGEgPSBNYXRoLnNxcnQoXG4gICAgbW92ZURlbHRhWCAqIG1vdmVEZWx0YVggKyBtb3ZlRGVsdGFZICogbW92ZURlbHRhWVxuICApO1xuXG4gIC8vIENoZWNrIGlmIG1vdmVtZW50IGlzIHNpZ25pZmljYW50XG4gIGlmIChtb3ZlRGVsdGEgPiAwKSB7XG4gICAgLy8gQ3JlYXRlIHBhbiBldmVudFxuICAgIGNvbnN0IHBhbkV2ZW50OiBQYW5FdmVudCA9IHtcbiAgICAgIC4uLmNyZWF0ZUdlc3R1cmVFdmVudChcInBhblwiLCBvcmlnaW5hbEV2ZW50LCBzdGF0ZSksXG4gICAgICB0eXBlOiBcInBhblwiLFxuICAgICAgZGVsdGFYLFxuICAgICAgZGVsdGFZLFxuICAgICAgc3RhcnRYOiBzdGF0ZS5zdGFydFgsXG4gICAgICBzdGFydFk6IHN0YXRlLnN0YXJ0WSxcbiAgICAgIGN1cnJlbnRYOiBzdGF0ZS5jdXJyZW50WCxcbiAgICAgIGN1cnJlbnRZOiBzdGF0ZS5jdXJyZW50WSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHBhbkV2ZW50O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLAogICAgIi8vIHNyYy9jb3JlL2dlc3R1cmVzL3BpbmNoLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIFBpbmNoIGdlc3R1cmUgZGV0ZWN0aW9uXG4gKi9cblxuaW1wb3J0IHsgUGluY2hFdmVudCwgR2VzdHVyZURldGVjdGlvbkNvbnRleHQgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlR2VzdHVyZUV2ZW50LCBnZXREaXN0YW5jZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogRGV0ZWN0IHBpbmNoIGdlc3R1cmVcbiAqXG4gKiBAcGFyYW0gY29udGV4dCAtIEdlc3R1cmUgZGV0ZWN0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSB0b3VjaDEgLSBGaXJzdCB0b3VjaCBwb2ludFxuICogQHBhcmFtIHRvdWNoMiAtIFNlY29uZCB0b3VjaCBwb2ludFxuICogQHJldHVybnMgUGluY2ggZXZlbnQgb3IgbnVsbCBpZiBubyBwaW5jaCBkZXRlY3RlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0UGluY2goXG4gIGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0LFxuICB0b3VjaDE6IFRvdWNoLFxuICB0b3VjaDI6IFRvdWNoXG4pOiBQaW5jaEV2ZW50IHwgbnVsbCB7XG4gIGNvbnN0IHsgc3RhdGUsIG9yaWdpbmFsRXZlbnQgfSA9IGNvbnRleHQ7XG5cbiAgLy8gQ2FsY3VsYXRlIGN1cnJlbnQgZGlzdGFuY2UgYmV0d2VlbiB0b3VjaCBwb2ludHNcbiAgY29uc3QgY3VycmVudERpc3RhbmNlID0gZ2V0RGlzdGFuY2UoXG4gICAgdG91Y2gxLmNsaWVudFgsXG4gICAgdG91Y2gxLmNsaWVudFksXG4gICAgdG91Y2gyLmNsaWVudFgsXG4gICAgdG91Y2gyLmNsaWVudFlcbiAgKTtcblxuICAvLyBNaW5pbXVtIG1vdmVtZW50IHRocmVzaG9sZCBmb3IgcGluY2ggZGV0ZWN0aW9uXG4gIGNvbnN0IFBJTkNIX1RIUkVTSE9MRCA9IDEwO1xuXG4gIC8vIENoZWNrIGlmIHRoZSBkaXN0YW5jZSBjaGFuZ2UgaXMgc2lnbmlmaWNhbnRcbiAgaWYgKE1hdGguYWJzKGN1cnJlbnREaXN0YW5jZSAtIHN0YXRlLnN0YXJ0RGlzdGFuY2UpID4gUElOQ0hfVEhSRVNIT0xEKSB7XG4gICAgLy8gQ2FsY3VsYXRlIHNjYWxlIGZhY3RvclxuICAgIGNvbnN0IHNjYWxlID0gY3VycmVudERpc3RhbmNlIC8gc3RhdGUuc3RhcnREaXN0YW5jZTtcblxuICAgIC8vIENhbGN1bGF0ZSBjZW50ZXIgcG9pbnRcbiAgICBjb25zdCBjZW50ZXJYID0gKHRvdWNoMS5jbGllbnRYICsgdG91Y2gyLmNsaWVudFgpIC8gMjtcbiAgICBjb25zdCBjZW50ZXJZID0gKHRvdWNoMS5jbGllbnRZICsgdG91Y2gyLmNsaWVudFkpIC8gMjtcblxuICAgIC8vIENyZWF0ZSBwaW5jaCBldmVudFxuICAgIGNvbnN0IHBpbmNoRXZlbnQ6IFBpbmNoRXZlbnQgPSB7XG4gICAgICAuLi5jcmVhdGVHZXN0dXJlRXZlbnQoXCJwaW5jaFwiLCBvcmlnaW5hbEV2ZW50LCBzdGF0ZSksXG4gICAgICB0eXBlOiBcInBpbmNoXCIsXG4gICAgICBzY2FsZSxcbiAgICAgIGNlbnRlclgsXG4gICAgICBjZW50ZXJZLFxuICAgIH07XG5cbiAgICByZXR1cm4gcGluY2hFdmVudDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy9yb3RhdGUudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2dlc3R1cmVzXG4gKiBAZGVzY3JpcHRpb24gUm90YXRlIGdlc3R1cmUgZGV0ZWN0aW9uXG4gKi9cblxuaW1wb3J0IHsgUm90YXRlRXZlbnQsIEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUdlc3R1cmVFdmVudCwgZ2V0QW5nbGUgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIERldGVjdCByb3RhdGUgZ2VzdHVyZVxuICpcbiAqIEBwYXJhbSBjb250ZXh0IC0gR2VzdHVyZSBkZXRlY3Rpb24gY29udGV4dFxuICogQHBhcmFtIHRvdWNoMSAtIEZpcnN0IHRvdWNoIHBvaW50XG4gKiBAcGFyYW0gdG91Y2gyIC0gU2Vjb25kIHRvdWNoIHBvaW50XG4gKiBAcmV0dXJucyBSb3RhdGUgZXZlbnQgb3IgbnVsbCBpZiBubyByb3RhdGlvbiBkZXRlY3RlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0Um90YXRlKFxuICBjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCxcbiAgdG91Y2gxOiBUb3VjaCxcbiAgdG91Y2gyOiBUb3VjaFxuKTogUm90YXRlRXZlbnQgfCBudWxsIHtcbiAgY29uc3QgeyBzdGF0ZSwgb3JpZ2luYWxFdmVudCB9ID0gY29udGV4dDtcblxuICAvLyBDYWxjdWxhdGUgY3VycmVudCBhbmdsZSBiZXR3ZWVuIHRvdWNoIHBvaW50c1xuICBjb25zdCBjdXJyZW50QW5nbGUgPSBnZXRBbmdsZShcbiAgICB0b3VjaDEuY2xpZW50WCxcbiAgICB0b3VjaDEuY2xpZW50WSxcbiAgICB0b3VjaDIuY2xpZW50WCxcbiAgICB0b3VjaDIuY2xpZW50WVxuICApO1xuXG4gIC8vIE1pbmltdW0gcm90YXRpb24gdGhyZXNob2xkIGZvciBkZXRlY3Rpb25cbiAgY29uc3QgUk9UQVRJT05fVEhSRVNIT0xEID0gMTA7XG5cbiAgLy8gQ2FsY3VsYXRlIHJvdGF0aW9uIGRpZmZlcmVuY2VcbiAgY29uc3Qgcm90YXRpb25EaWZmID0gY3VycmVudEFuZ2xlIC0gc3RhdGUuc3RhcnRBbmdsZTtcblxuICAvLyBDaGVjayBpZiByb3RhdGlvbiBpcyBzaWduaWZpY2FudFxuICBpZiAoTWF0aC5hYnMocm90YXRpb25EaWZmKSA+IFJPVEFUSU9OX1RIUkVTSE9MRCkge1xuICAgIC8vIENhbGN1bGF0ZSBjZW50ZXIgcG9pbnRcbiAgICBjb25zdCBjZW50ZXJYID0gKHRvdWNoMS5jbGllbnRYICsgdG91Y2gyLmNsaWVudFgpIC8gMjtcbiAgICBjb25zdCBjZW50ZXJZID0gKHRvdWNoMS5jbGllbnRZICsgdG91Y2gyLmNsaWVudFkpIC8gMjtcblxuICAgIC8vIENyZWF0ZSByb3RhdGUgZXZlbnRcbiAgICBjb25zdCByb3RhdGVFdmVudDogUm90YXRlRXZlbnQgPSB7XG4gICAgICAuLi5jcmVhdGVHZXN0dXJlRXZlbnQoXCJyb3RhdGVcIiwgb3JpZ2luYWxFdmVudCwgc3RhdGUpLFxuICAgICAgdHlwZTogXCJyb3RhdGVcIixcbiAgICAgIHJvdGF0aW9uOiByb3RhdGlvbkRpZmYsXG4gICAgICBjZW50ZXJYLFxuICAgICAgY2VudGVyWSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHJvdGF0ZUV2ZW50O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLAogICAgIi8vIHNyYy9jb3JlL2dlc3R1cmVzL21hbmFnZXIudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2dlc3R1cmVzXG4gKiBAZGVzY3JpcHRpb24gR2VzdHVyZSBtYW5hZ2VtZW50IHN5c3RlbSBmb3IgaGFuZGxpbmcgdG91Y2ggYW5kIG1vdXNlIGludGVyYWN0aW9uc1xuICovXG5cbmltcG9ydCB7IFxuICBHZXN0dXJlQ29uZmlnLFxuICBHZXN0dXJlTWFuYWdlcixcbiAgR2VzdHVyZVN0YXRlLFxuICBHZXN0dXJlSGFuZGxlcixcbiAgR2VzdHVyZURldGVjdGlvbkNvbnRleHQsXG4gIEFueUdlc3R1cmVFdmVudCxcbiAgR0VTVFVSRV9UWVBFUyxcbiAgU1dJUEVfRElSRUNUSU9OU1xufSBmcm9tICcuL3R5cGVzJztcblxuaW1wb3J0IHsgZGV0ZWN0VGFwIH0gZnJvbSAnLi90YXAnO1xuaW1wb3J0IHsgZGV0ZWN0U3dpcGUgfSBmcm9tICcuL3N3aXBlJztcbmltcG9ydCB7IGRldGVjdExvbmdQcmVzcywgc2hvdWxkQ2FuY2VsTG9uZ1ByZXNzIH0gZnJvbSAnLi9sb25ncHJlc3MnO1xuaW1wb3J0IHsgZGV0ZWN0UGFuIH0gZnJvbSAnLi9wYW4nO1xuaW1wb3J0IHsgZGV0ZWN0UGluY2ggfSBmcm9tICcuL3BpbmNoJztcbmltcG9ydCB7IGRldGVjdFJvdGF0ZSB9IGZyb20gJy4vcm90YXRlJztcbmltcG9ydCB7IGhhc1RvdWNoU3VwcG9ydCwgaGFzUG9pbnRlclN1cHBvcnQsIGdldFRvdWNoQ29vcmRpbmF0ZXMgfSBmcm9tICcuL3V0aWxzJztcblxuLy8gUmUtZXhwb3J0IHR5cGVzIGFuZCBjb25zdGFudHNcbmV4cG9ydCB7IEdFU1RVUkVfVFlQRVMsIFNXSVBFX0RJUkVDVElPTlMgfTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZ2VzdHVyZSBtYW5hZ2VyIGZvciBoYW5kbGluZyB0b3VjaCBhbmQgbW91c2UgaW50ZXJhY3Rpb25zXG4gKiBcbiAqIEBwYXJhbSBlbGVtZW50IC0gRE9NIGVsZW1lbnQgdG8gYXR0YWNoIGdlc3R1cmUgcmVjb2duaXRpb24gdG9cbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIEdlc3R1cmUgbWFuYWdlciBpbnN0YW5jZVxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlR2VzdHVyZU1hbmFnZXIgPSAoXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICBjb25maWc6IEdlc3R1cmVDb25maWcgPSB7fVxuKTogR2VzdHVyZU1hbmFnZXIgPT4ge1xuICAvLyBEZWZhdWx0IGNvbmZpZ3VyYXRpb25cbiAgY29uc3Qgb3B0aW9uczogUmVxdWlyZWQ8R2VzdHVyZUNvbmZpZz4gPSB7XG4gICAgc3dpcGVUaHJlc2hvbGQ6IDMwLFxuICAgIHN3aXBlVGltZVRocmVzaG9sZDogMzAwLFxuICAgIGxvbmdQcmVzc1RpbWU6IDUwMCxcbiAgICB0YXBEaXN0YW5jZVRocmVzaG9sZDogMTAsXG4gICAgcHJldmVudERlZmF1bHQ6IHRydWUsXG4gICAgc3RvcFByb3BhZ2F0aW9uOiBmYWxzZSxcbiAgICAuLi5jb25maWdcbiAgfTtcbiAgXG4gIC8vIEV2ZW50IGhhbmRsZXJzIHN0b3JhZ2VcbiAgY29uc3QgaGFuZGxlcnM6IE1hcDxzdHJpbmcsIFNldDxHZXN0dXJlSGFuZGxlcj4+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gR2VzdHVyZSBzdGF0ZVxuICBjb25zdCBzdGF0ZTogR2VzdHVyZVN0YXRlID0ge1xuICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgc3RhcnRUaW1lOiAwLFxuICAgIHN0YXJ0WDogMCxcbiAgICBzdGFydFk6IDAsXG4gICAgbGFzdFg6IDAsXG4gICAgbGFzdFk6IDAsXG4gICAgY3VycmVudFg6IDAsXG4gICAgY3VycmVudFk6IDAsXG4gICAgdG91Y2hDb3VudDogMCxcbiAgICBsb25nUHJlc3NUaW1lcjogbnVsbCxcbiAgICBzdGFydERpc3RhbmNlOiAwLFxuICAgIHN0YXJ0QW5nbGU6IDAsXG4gICAgbGFzdFRhcFRpbWU6IDAsXG4gICAgdGFwQ291bnQ6IDAsXG4gICAgdGFyZ2V0OiBudWxsXG4gIH07XG4gIFxuICAvLyBEZXRlY3QgZmVhdHVyZSBzdXBwb3J0XG4gIGNvbnN0IHN1cHBvcnRUb3VjaCA9IGhhc1RvdWNoU3VwcG9ydCgpO1xuICBjb25zdCBzdXBwb3J0UG9pbnRlciA9IGhhc1BvaW50ZXJTdXBwb3J0KCk7XG4gICAgXG4gIGNvbnN0IGdlc3R1cmVTdXBwb3J0ID0ge1xuICAgIHRhcDogdHJ1ZSxcbiAgICBzd2lwZTogdHJ1ZSxcbiAgICBzd2lwZWxlZnQ6IHRydWUsXG4gICAgc3dpcGVyaWdodDogdHJ1ZSxcbiAgICBzd2lwZXVwOiB0cnVlLFxuICAgIHN3aXBlZG93bjogdHJ1ZSxcbiAgICBsb25ncHJlc3M6IHRydWUsXG4gICAgcGFuOiB0cnVlLFxuICAgIHBpbmNoOiBzdXBwb3J0VG91Y2ggfHwgc3VwcG9ydFBvaW50ZXIsXG4gICAgcm90YXRlOiBzdXBwb3J0VG91Y2ggfHwgc3VwcG9ydFBvaW50ZXJcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBhIGdlc3R1cmUgZXZlbnRcbiAgICovXG4gIGNvbnN0IGRpc3BhdGNoR2VzdHVyZSA9IChldmVudDogQW55R2VzdHVyZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgLy8gR2V0IGhhbmRsZXJzIGZvciB0aGlzIGV2ZW50IHR5cGVcbiAgICBjb25zdCBldmVudEhhbmRsZXJzID0gaGFuZGxlcnMuZ2V0KGV2ZW50LnR5cGUpO1xuICAgIGlmICghZXZlbnRIYW5kbGVycykgcmV0dXJuO1xuICAgIFxuICAgIC8vIENhbGwgZWFjaCBoYW5kbGVyXG4gICAgZXZlbnRIYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGFuZGxlcihldmVudCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBpbiBnZXN0dXJlIGhhbmRsZXIgZm9yICR7ZXZlbnQudHlwZX06YCwgZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8vIEZvciBzd2lwZSwgYWxzbyBkaXNwYXRjaCBkaXJlY3Rpb24tc3BlY2lmaWMgZXZlbnRzXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdzd2lwZScgJiYgJ2RpcmVjdGlvbicgaW4gZXZlbnQpIHtcbiAgICAgIGNvbnN0IGRpcmVjdGlvbkV2ZW50ID0geyAuLi5ldmVudCwgdHlwZTogYHN3aXBlJHtldmVudC5kaXJlY3Rpb259YCBhcyBhbnkgfTtcbiAgICAgIGRpc3BhdGNoR2VzdHVyZShkaXJlY3Rpb25FdmVudCBhcyBhbnkpO1xuICAgIH1cbiAgICBcbiAgICAvLyBBcHBseSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHByZXZlbnREZWZhdWx0IGFuZCBzdG9wUHJvcGFnYXRpb25cbiAgICBpZiAob3B0aW9ucy5wcmV2ZW50RGVmYXVsdCAmJiAhZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKG9wdGlvbnMuc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gIH07XG4gIFxuICAvLyBSZWZlcmVuY2UgdG8gdGhlIGxvbmdwcmVzcyBjbGVhbnVwIGZ1bmN0aW9uXG4gIGxldCBsb25nUHJlc3NDbGVhbnVwOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgdG91Y2gvbW91c2Ugc3RhcnRcbiAgICovXG4gIGNvbnN0IGhhbmRsZVN0YXJ0ID0gKGU6IFRvdWNoRXZlbnQgfCBNb3VzZUV2ZW50IHwgUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgY29uc3QgdG91Y2ggPSBnZXRUb3VjaENvb3JkaW5hdGVzKGUpO1xuICAgIGNvbnN0IHRvdWNoQ291bnQgPSAndG91Y2hlcycgaW4gZSA/IGUudG91Y2hlcy5sZW5ndGggOiAxO1xuICAgIFxuICAgIC8vIFN0b3JlIGdlc3R1cmUgc3RhdGVcbiAgICBzdGF0ZS5hY3RpdmUgPSB0cnVlO1xuICAgIHN0YXRlLnN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgc3RhdGUuc3RhcnRYID0gc3RhdGUubGFzdFggPSBzdGF0ZS5jdXJyZW50WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgc3RhdGUuc3RhcnRZID0gc3RhdGUubGFzdFkgPSBzdGF0ZS5jdXJyZW50WSA9IHRvdWNoLmNsaWVudFk7XG4gICAgc3RhdGUudG91Y2hDb3VudCA9IHRvdWNoQ291bnQ7XG4gICAgc3RhdGUudGFyZ2V0ID0gZS50YXJnZXQ7XG4gICAgXG4gICAgLy8gSGFuZGxlIG11bHRpLXRvdWNoIGdlc3R1cmVzXG4gICAgaWYgKHRvdWNoQ291bnQgPT09IDIgJiYgJ3RvdWNoZXMnIGluIGUpIHtcbiAgICAgIGNvbnN0IHRvdWNoMSA9IGUudG91Y2hlc1swXTtcbiAgICAgIGNvbnN0IHRvdWNoMiA9IGUudG91Y2hlc1sxXTtcbiAgICAgIFxuICAgICAgLy8gU2V0IGluaXRpYWwgdmFsdWVzIGZvciBwaW5jaCBhbmQgcm90YXRlXG4gICAgICBzdGF0ZS5zdGFydERpc3RhbmNlID0gTWF0aC5zcXJ0KFxuICAgICAgICBNYXRoLnBvdyh0b3VjaDIuY2xpZW50WCAtIHRvdWNoMS5jbGllbnRYLCAyKSArIFxuICAgICAgICBNYXRoLnBvdyh0b3VjaDIuY2xpZW50WSAtIHRvdWNoMS5jbGllbnRZLCAyKVxuICAgICAgKTtcbiAgICAgIFxuICAgICAgc3RhdGUuc3RhcnRBbmdsZSA9IE1hdGguYXRhbjIoXG4gICAgICAgIHRvdWNoMi5jbGllbnRZIC0gdG91Y2gxLmNsaWVudFksXG4gICAgICAgIHRvdWNoMi5jbGllbnRYIC0gdG91Y2gxLmNsaWVudFhcbiAgICAgICkgKiAxODAgLyBNYXRoLlBJO1xuICAgICAgXG4gICAgICBpZiAoc3RhdGUuc3RhcnRBbmdsZSA8IDApIHN0YXRlLnN0YXJ0QW5nbGUgKz0gMzYwO1xuICAgIH1cbiAgICBcbiAgICAvLyBTZXR1cCBjb250ZXh0IGZvciBnZXN0dXJlIGRldGVjdGlvblxuICAgIGNvbnN0IGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0ID0ge1xuICAgICAgc3RhdGUsXG4gICAgICBvcHRpb25zLFxuICAgICAgb3JpZ2luYWxFdmVudDogZVxuICAgIH07XG4gICAgXG4gICAgLy8gU3RhcnQgbG9uZyBwcmVzcyBkZXRlY3Rpb25cbiAgICBpZiAobG9uZ1ByZXNzQ2xlYW51cCkge1xuICAgICAgbG9uZ1ByZXNzQ2xlYW51cCgpO1xuICAgIH1cbiAgICBcbiAgICBsb25nUHJlc3NDbGVhbnVwID0gZGV0ZWN0TG9uZ1ByZXNzKGNvbnRleHQsIChsb25nUHJlc3NFdmVudCkgPT4ge1xuICAgICAgZGlzcGF0Y2hHZXN0dXJlKGxvbmdQcmVzc0V2ZW50KTtcbiAgICB9KTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgbW92ZVxuICAgKi9cbiAgY29uc3QgaGFuZGxlTW92ZSA9IChlOiBUb3VjaEV2ZW50IHwgTW91c2VFdmVudCB8IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIGlmICghc3RhdGUuYWN0aXZlKSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgdG91Y2ggPSBnZXRUb3VjaENvb3JkaW5hdGVzKGUpO1xuICAgIGNvbnN0IHRvdWNoQ291bnQgPSAndG91Y2hlcycgaW4gZSA/IGUudG91Y2hlcy5sZW5ndGggOiAxO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBwb3NpdGlvbnNcbiAgICBzdGF0ZS5sYXN0WCA9IHN0YXRlLmN1cnJlbnRYO1xuICAgIHN0YXRlLmxhc3RZID0gc3RhdGUuY3VycmVudFk7XG4gICAgc3RhdGUuY3VycmVudFggPSB0b3VjaC5jbGllbnRYO1xuICAgIHN0YXRlLmN1cnJlbnRZID0gdG91Y2guY2xpZW50WTtcbiAgICBcbiAgICAvLyBTZXR1cCBjb250ZXh0IGZvciBnZXN0dXJlIGRldGVjdGlvblxuICAgIGNvbnN0IGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0ID0ge1xuICAgICAgc3RhdGUsXG4gICAgICBvcHRpb25zLFxuICAgICAgb3JpZ2luYWxFdmVudDogZVxuICAgIH07XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgd2Ugc2hvdWxkIGNhbmNlbCBsb25ncHJlc3NcbiAgICBpZiAoc2hvdWxkQ2FuY2VsTG9uZ1ByZXNzKGNvbnRleHQpICYmIGxvbmdQcmVzc0NsZWFudXApIHtcbiAgICAgIGxvbmdQcmVzc0NsZWFudXAoKTtcbiAgICAgIGxvbmdQcmVzc0NsZWFudXAgPSBudWxsO1xuICAgIH1cbiAgICBcbiAgICAvLyBEZXRlY3QgcGFuIGdlc3R1cmVcbiAgICBjb25zdCBwYW5FdmVudCA9IGRldGVjdFBhbihjb250ZXh0KTtcbiAgICBpZiAocGFuRXZlbnQpIHtcbiAgICAgIGRpc3BhdGNoR2VzdHVyZShwYW5FdmVudCk7XG4gICAgfVxuICAgIFxuICAgIC8vIE11bHRpLXRvdWNoIGdlc3R1cmVzXG4gICAgaWYgKHRvdWNoQ291bnQgPT09IDIgJiYgJ3RvdWNoZXMnIGluIGUpIHtcbiAgICAgIGNvbnN0IHRvdWNoMSA9IGUudG91Y2hlc1swXTtcbiAgICAgIGNvbnN0IHRvdWNoMiA9IGUudG91Y2hlc1sxXTtcbiAgICAgIFxuICAgICAgLy8gRGV0ZWN0IHBpbmNoXG4gICAgICBjb25zdCBwaW5jaEV2ZW50ID0gZGV0ZWN0UGluY2goY29udGV4dCwgdG91Y2gxLCB0b3VjaDIpO1xuICAgICAgaWYgKHBpbmNoRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hHZXN0dXJlKHBpbmNoRXZlbnQpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBEZXRlY3Qgcm90YXRlXG4gICAgICBjb25zdCByb3RhdGVFdmVudCA9IGRldGVjdFJvdGF0ZShjb250ZXh0LCB0b3VjaDEsIHRvdWNoMik7XG4gICAgICBpZiAocm90YXRlRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hHZXN0dXJlKHJvdGF0ZUV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIFxuICAvKipcbiAgICogSGFuZGxlIHRvdWNoL21vdXNlIGVuZFxuICAgKi9cbiAgY29uc3QgaGFuZGxlRW5kID0gKGU6IFRvdWNoRXZlbnQgfCBNb3VzZUV2ZW50IHwgUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKCFzdGF0ZS5hY3RpdmUpIHJldHVybjtcbiAgICBcbiAgICAvLyBDYW5jZWwgYW55IG9uZ29pbmcgbG9uZyBwcmVzcyBkZXRlY3Rpb25cbiAgICBpZiAobG9uZ1ByZXNzQ2xlYW51cCkge1xuICAgICAgbG9uZ1ByZXNzQ2xlYW51cCgpO1xuICAgICAgbG9uZ1ByZXNzQ2xlYW51cCA9IG51bGw7XG4gICAgfVxuICAgIFxuICAgIC8vIFNldHVwIGNvbnRleHQgZm9yIGdlc3R1cmUgZGV0ZWN0aW9uXG4gICAgY29uc3QgY29udGV4dDogR2VzdHVyZURldGVjdGlvbkNvbnRleHQgPSB7XG4gICAgICBzdGF0ZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBvcmlnaW5hbEV2ZW50OiBlXG4gICAgfTtcbiAgICBcbiAgICAvLyBEZXRlY3QgdGFwXG4gICAgY29uc3QgdGFwRXZlbnQgPSBkZXRlY3RUYXAoY29udGV4dCk7XG4gICAgaWYgKHRhcEV2ZW50KSB7XG4gICAgICAvLyBVcGRhdGUgdGFwIGNvdW50IGZvciBuZXh0IHRhcFxuICAgICAgc3RhdGUubGFzdFRhcFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgc3RhdGUudGFwQ291bnQgPSB0YXBFdmVudC5jb3VudDtcbiAgICAgIFxuICAgICAgZGlzcGF0Y2hHZXN0dXJlKHRhcEV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGV0ZWN0IHN3aXBlXG4gICAgICBjb25zdCBzd2lwZUV2ZW50ID0gZGV0ZWN0U3dpcGUoY29udGV4dCk7XG4gICAgICBpZiAoc3dpcGVFdmVudCkge1xuICAgICAgICBkaXNwYXRjaEdlc3R1cmUoc3dpcGVFdmVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFJlc2V0IHN0YXRlXG4gICAgc3RhdGUuYWN0aXZlID0gZmFsc2U7XG4gIH07XG4gIFxuICAvKipcbiAgICogSGFuZGxlIHRvdWNoL21vdXNlIGNhbmNlbFxuICAgKi9cbiAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKCk6IHZvaWQgPT4ge1xuICAgIC8vIENhbmNlbCBsb25nIHByZXNzIGRldGVjdGlvblxuICAgIGlmIChsb25nUHJlc3NDbGVhbnVwKSB7XG4gICAgICBsb25nUHJlc3NDbGVhbnVwKCk7XG4gICAgICBsb25nUHJlc3NDbGVhbnVwID0gbnVsbDtcbiAgICB9XG4gICAgXG4gICAgLy8gUmVzZXQgc3RhdGVcbiAgICBzdGF0ZS5hY3RpdmUgPSBmYWxzZTtcbiAgfTtcbiAgXG4gIC8vIEV2ZW50IGxpc3RlbmVyIHJlZmVyZW5jZXNcbiAgbGV0IGV2ZW50TGlzdGVuZXJzOiB7IFxuICAgIFtldmVudDogc3RyaW5nXTogRXZlbnRMaXN0ZW5lciBcbiAgfSA9IHt9O1xuICBcbiAgLyoqXG4gICAqIFNldCB1cCBldmVudCBsaXN0ZW5lcnMgYmFzZWQgb24gYXZhaWxhYmxlIEFQSXNcbiAgICovXG4gIGNvbnN0IHNldHVwRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHN1cHBvcnRQb2ludGVyKSB7XG4gICAgICAvLyBVc2UgUG9pbnRlciBFdmVudHMgQVBJXG4gICAgICBldmVudExpc3RlbmVycyA9IHtcbiAgICAgICAgcG9pbnRlcmRvd246IGhhbmRsZVN0YXJ0IGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICAgIHBvaW50ZXJtb3ZlOiBoYW5kbGVNb3ZlIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICAgIHBvaW50ZXJ1cDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICAgIHBvaW50ZXJjYW5jZWw6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoc3VwcG9ydFRvdWNoKSB7XG4gICAgICAvLyBVc2UgVG91Y2ggRXZlbnRzIEFQSVxuICAgICAgZXZlbnRMaXN0ZW5lcnMgPSB7XG4gICAgICAgIHRvdWNoc3RhcnQ6IGhhbmRsZVN0YXJ0IGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICAgIHRvdWNobW92ZTogaGFuZGxlTW92ZSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICB0b3VjaGVuZDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICAgIHRvdWNoY2FuY2VsOiBoYW5kbGVDYW5jZWwgYXMgRXZlbnRMaXN0ZW5lclxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRmFsbCBiYWNrIHRvIE1vdXNlIEV2ZW50cyBBUElcbiAgICAgIGV2ZW50TGlzdGVuZXJzID0ge1xuICAgICAgICBtb3VzZWRvd246IGhhbmRsZVN0YXJ0IGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICAgIG1vdXNlbW92ZTogaGFuZGxlTW92ZSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICBtb3VzZXVwOiBoYW5kbGVFbmQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgICAgbW91c2VsZWF2ZTogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXJcbiAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIC8vIEFkZCBsaXN0ZW5lcnMgdG8gZWxlbWVudFxuICAgIE9iamVjdC5lbnRyaWVzKGV2ZW50TGlzdGVuZXJzKS5mb3JFYWNoKChbZXZlbnQsIGxpc3RlbmVyXSkgPT4ge1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lciwgeyBwYXNzaXZlOiAhb3B0aW9ucy5wcmV2ZW50RGVmYXVsdCB9KTtcbiAgICB9KTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBSZW1vdmUgYWxsIGV2ZW50IGxpc3RlbmVyc1xuICAgKi9cbiAgY29uc3QgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgLy8gUmVtb3ZlIGFsbCBsaXN0ZW5lcnMgZnJvbSBlbGVtZW50XG4gICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICB9KTtcbiAgICBcbiAgICAvLyBDbGVhciBldmVudExpc3RlbmVycyBvYmplY3RcbiAgICBldmVudExpc3RlbmVycyA9IHt9O1xuICB9O1xuICBcbiAgLy8gSW5pdGlhbGl6ZSBldmVudCBsaXN0ZW5lcnNcbiAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICBcbiAgcmV0dXJuIHtcbiAgICAvKipcbiAgICAgKiBBZGQgYSBnZXN0dXJlIGV2ZW50IGxpc3RlbmVyXG4gICAgICogQHBhcmFtIGV2ZW50VHlwZSAtIFR5cGUgb2YgZ2VzdHVyZSB0byBsaXN0ZW4gZm9yXG4gICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICogQHJldHVybnMgR2VzdHVyZSBtYW5hZ2VyIGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIG9uKGV2ZW50VHlwZTogc3RyaW5nLCBoYW5kbGVyOiBHZXN0dXJlSGFuZGxlcik6IEdlc3R1cmVNYW5hZ2VyIHtcbiAgICAgIGlmICghaGFuZGxlcnMuaGFzKGV2ZW50VHlwZSkpIHtcbiAgICAgICAgaGFuZGxlcnMuc2V0KGV2ZW50VHlwZSwgbmV3IFNldCgpKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaGFuZGxlcnMuZ2V0KGV2ZW50VHlwZSkhLmFkZChoYW5kbGVyKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgZ2VzdHVyZSBldmVudCBsaXN0ZW5lclxuICAgICAqIEBwYXJhbSBldmVudFR5cGUgLSBUeXBlIG9mIGdlc3R1cmVcbiAgICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgdG8gcmVtb3ZlXG4gICAgICogQHJldHVybnMgR2VzdHVyZSBtYW5hZ2VyIGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIG9mZihldmVudFR5cGU6IHN0cmluZywgaGFuZGxlcjogR2VzdHVyZUhhbmRsZXIpOiBHZXN0dXJlTWFuYWdlciB7XG4gICAgICBjb25zdCBldmVudEhhbmRsZXJzID0gaGFuZGxlcnMuZ2V0KGV2ZW50VHlwZSk7XG4gICAgICBpZiAoZXZlbnRIYW5kbGVycykge1xuICAgICAgICBldmVudEhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChldmVudEhhbmRsZXJzLnNpemUgPT09IDApIHtcbiAgICAgICAgICBoYW5kbGVycy5kZWxldGUoZXZlbnRUeXBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBcbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhIGdlc3R1cmUgaXMgc3VwcG9ydGVkIG9uIHRoZSBjdXJyZW50IGRldmljZVxuICAgICAqIEBwYXJhbSBnZXN0dXJlVHlwZSAtIFR5cGUgb2YgZ2VzdHVyZSB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGdlc3R1cmUgaXMgc3VwcG9ydGVkXG4gICAgICovXG4gICAgaXNTdXBwb3J0ZWQoZ2VzdHVyZVR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGdlc3R1cmVUeXBlIGluIGdlc3R1cmVTdXBwb3J0ICYmIGdlc3R1cmVTdXBwb3J0W2dlc3R1cmVUeXBlIGFzIGtleW9mIHR5cGVvZiBnZXN0dXJlU3VwcG9ydF07XG4gICAgfSxcbiAgICBcbiAgICAvKipcbiAgICAgKiBFbmFibGUgZ2VzdHVyZSByZWNvZ25pdGlvbiBieSBhZGRpbmcgZXZlbnQgbGlzdGVuZXJzXG4gICAgICogQHJldHVybnMgR2VzdHVyZSBtYW5hZ2VyIGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIGVuYWJsZSgpOiBHZXN0dXJlTWFuYWdlciB7XG4gICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIFxuICAgIC8qKlxuICAgICAqIERpc2FibGUgZ2VzdHVyZSByZWNvZ25pdGlvbiBieSByZW1vdmluZyBldmVudCBsaXN0ZW5lcnNcbiAgICAgKiBAcmV0dXJucyBHZXN0dXJlIG1hbmFnZXIgZm9yIGNoYWluaW5nXG4gICAgICovXG4gICAgZGlzYWJsZSgpOiBHZXN0dXJlTWFuYWdlciB7XG4gICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBcbiAgICAvKipcbiAgICAgKiBDbGVhbiB1cCBldmVudCBsaXN0ZW5lcnMgYW5kIHRpbWVyc1xuICAgICAqL1xuICAgIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAvLyBDbGVhbiB1cCBsaXN0ZW5lcnNcbiAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICBcbiAgICAgIC8vIENsZWFyIGxvbmcgcHJlc3MgdGltZXJcbiAgICAgIGlmIChsb25nUHJlc3NDbGVhbnVwKSB7XG4gICAgICAgIGxvbmdQcmVzc0NsZWFudXAoKTtcbiAgICAgICAgbG9uZ1ByZXNzQ2xlYW51cCA9IG51bGw7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENsZWFyIGhhbmRsZXIgcmVmZXJlbmNlc1xuICAgICAgaGFuZGxlcnMuY2xlYXIoKTtcbiAgICB9XG4gIH07XG59OyIsCiAgICAiLy8gc3JjL2NvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlcy50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvY29tcG9zZS9mZWF0dXJlc1xuICogQGRlc2NyaXB0aW9uIEFkZHMgZ2VzdHVyZSByZWNvZ25pdGlvbiBjYXBhYmlsaXRpZXMgdG8gY29tcG9uZW50c1xuICovXG5cbmltcG9ydCB7IEJhc2VDb21wb25lbnQsIEVsZW1lbnRDb21wb25lbnQgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHtcbiAgY3JlYXRlR2VzdHVyZU1hbmFnZXIsXG4gIEdlc3R1cmVNYW5hZ2VyLFxuICBHZXN0dXJlQ29uZmlnLFxuICBHZXN0dXJlSGFuZGxlcixcbiAgQW55R2VzdHVyZUV2ZW50LFxufSBmcm9tIFwiLi4vLi4vLi4vZ2VzdHVyZXNcIjtcbmltcG9ydCB7IGhhc0xpZmVjeWNsZSwgaGFzRW1pdCB9IGZyb20gXCJtdHJsXCI7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgZ2VzdHVyZXMgZmVhdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlc3R1cmVzRmVhdHVyZUNvbmZpZyBleHRlbmRzIEdlc3R1cmVDb25maWcge1xuICAvKipcbiAgICogV2hldGhlciB0byBlbmFibGUgZ2VzdHVyZSByZWNvZ25pdGlvbiBpbW1lZGlhdGVseVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBlbmFibGVHZXN0dXJlcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluaXRpYWwgZ2VzdHVyZSBldmVudCBoYW5kbGVyc1xuICAgKi9cbiAgZ2VzdHVyZUhhbmRsZXJzPzogUmVjb3JkPHN0cmluZywgR2VzdHVyZUhhbmRsZXI+O1xuXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgd2l0aCBnZXN0dXJlIHJlY29nbml0aW9uIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlc3R1cmVzQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBHZXN0dXJlIG1hbmFnZXIgaW5zdGFuY2VcbiAgICovXG4gIGdlc3R1cmVzOiBHZXN0dXJlTWFuYWdlcjtcblxuICAvKipcbiAgICogQWRkIGEgZ2VzdHVyZSBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBldmVudFR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgZXZlbnRcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIEdlc3R1cmVzQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb25HZXN0dXJlOiAoZXZlbnRUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IEdlc3R1cmVIYW5kbGVyKSA9PiBHZXN0dXJlc0NvbXBvbmVudDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgZ2VzdHVyZSBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBldmVudFR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgZXZlbnRcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIEdlc3R1cmVzQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmR2VzdHVyZTogKGV2ZW50VHlwZTogc3RyaW5nLCBoYW5kbGVyOiBHZXN0dXJlSGFuZGxlcikgPT4gR2VzdHVyZXNDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgZ2VzdHVyZSB0eXBlIGlzIHN1cHBvcnRlZCBvbiB0aGUgY3VycmVudCBkZXZpY2VcbiAgICogQHBhcmFtIGdlc3R1cmVUeXBlIC0gVHlwZSBvZiBnZXN0dXJlIHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGdlc3R1cmUgaXMgc3VwcG9ydGVkXG4gICAqL1xuICBpc0dlc3R1cmVTdXBwb3J0ZWQ6IChnZXN0dXJlVHlwZTogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgZ2VzdHVyZSByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGVuYWJsZUdlc3R1cmVzOiAoKSA9PiBHZXN0dXJlc0NvbXBvbmVudDtcblxuICAvKipcbiAgICogRGlzYWJsZSBnZXN0dXJlIHJlY29nbml0aW9uXG4gICAqIEByZXR1cm5zIEdlc3R1cmVzQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZGlzYWJsZUdlc3R1cmVzOiAoKSA9PiBHZXN0dXJlc0NvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBBZGRzIGdlc3R1cmUgcmVjb2duaXRpb24gY2FwYWJpbGl0aWVzIHRvIGEgY29tcG9uZW50LlxuICogVGhpcyBpcyBhIGNvbXByZWhlbnNpdmUgZ2VzdHVyZSBmZWF0dXJlIHRoYXQgYWRkcyBzdXBwb3J0IGZvciBhbGwgZ2VzdHVyZSB0eXBlcy5cbiAqIEZvciBtb3JlIGxpZ2h0d2VpZ2h0LCBzcGVjaWZpYyBnZXN0dXJlcywgdXNlIHRoZSBpbmRpdmlkdWFsIGdlc3R1cmUgZmVhdHVyZXMuXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgZ2VzdHVyZSBzZXR0aW5nc1xuICogQHJldHVybnMgRnVuY3Rpb24gdGhhdCBlbmhhbmNlcyBhIGNvbXBvbmVudCB3aXRoIGdlc3R1cmUgY2FwYWJpbGl0aWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBBZGQgZ2VzdHVyZSByZWNvZ25pdGlvbiB0byBhIGNvbXBvbmVudFxuICogY29uc3QgY29tcG9uZW50ID0gcGlwZShcbiAqICAgY3JlYXRlQmFzZSxcbiAqICAgd2l0aEVsZW1lbnQoLi4uKSxcbiAqICAgd2l0aEdlc3R1cmVzKHtcbiAqICAgICBzd2lwZVRocmVzaG9sZDogNTAsXG4gKiAgICAgZ2VzdHVyZUhhbmRsZXJzOiB7XG4gKiAgICAgICAndGFwJzogKGUpID0+IGhhbmRsZVRhcChlKSxcbiAqICAgICAgICdzd2lwZWxlZnQnOiAoZSkgPT4gbmF2aWdhdGVGb3J3YXJkKGUpLFxuICogICAgICAgJ3N3aXBlcmlnaHQnOiAoZSkgPT4gbmF2aWdhdGVCYWNrKGUpXG4gKiAgICAgfVxuICogICB9KVxuICogKShjb25maWcpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoR2VzdHVyZXMgPVxuICAoY29uZmlnOiBHZXN0dXJlc0ZlYXR1cmVDb25maWcgPSB7fSkgPT5cbiAgPEMgZXh0ZW5kcyBFbGVtZW50Q29tcG9uZW50Pihjb21wb25lbnQ6IEMpOiBDICYgR2VzdHVyZXNDb21wb25lbnQgPT4ge1xuICAgIGlmICghY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkNhbm5vdCBhZGQgZ2VzdHVyZSByZWNvZ25pdGlvbjogbWlzc2luZyBlbGVtZW50XCIpO1xuICAgICAgcmV0dXJuIGNvbXBvbmVudCBhcyBDICYgR2VzdHVyZXNDb21wb25lbnQ7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBjb25maWd1cmF0aW9uXG4gICAgY29uc3Qge1xuICAgICAgZW5hYmxlR2VzdHVyZXMgPSB0cnVlLFxuICAgICAgZ2VzdHVyZUhhbmRsZXJzID0ge30sXG4gICAgICAuLi5nZXN0dXJlQ29uZmlnXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIENyZWF0ZSBnZXN0dXJlIG1hbmFnZXJcbiAgICBjb25zdCBnZXN0dXJlTWFuYWdlciA9IGNyZWF0ZUdlc3R1cmVNYW5hZ2VyKFxuICAgICAgY29tcG9uZW50LmVsZW1lbnQsXG4gICAgICBnZXN0dXJlQ29uZmlnXG4gICAgKTtcblxuICAgIC8vIEFkZCBpbml0aWFsIGdlc3R1cmUgaGFuZGxlcnNcbiAgICBPYmplY3QuZW50cmllcyhnZXN0dXJlSGFuZGxlcnMpLmZvckVhY2goKFtldmVudFR5cGUsIGhhbmRsZXJdKSA9PiB7XG4gICAgICBnZXN0dXJlTWFuYWdlci5vbihldmVudFR5cGUsIGhhbmRsZXIpO1xuICAgIH0pO1xuXG4gICAgLy8gRW5hYmxlL2Rpc2FibGUgYmFzZWQgb24gY29uZmlnXG4gICAgaWYgKCFlbmFibGVHZXN0dXJlcykge1xuICAgICAgZ2VzdHVyZU1hbmFnZXIuZGlzYWJsZSgpO1xuICAgIH1cblxuICAgIC8vIENvbm5lY3Qgd2l0aCBleGlzdGluZyBldmVudCBzeXN0ZW0gaWYgYXZhaWxhYmxlXG4gICAgaWYgKGhhc0VtaXQoY29tcG9uZW50KSkge1xuICAgICAgLy8gRm9yd2FyZCBnZXN0dXJlIGV2ZW50cyB0byB0aGUgY29tcG9uZW50J3MgZXZlbnQgc3lzdGVtXG4gICAgICBjb25zdCBmb3J3YXJkR2VzdHVyZUV2ZW50cyA9IChldmVudDogQW55R2VzdHVyZUV2ZW50KSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0KGV2ZW50LnR5cGUsIGV2ZW50KTtcbiAgICAgIH07XG5cbiAgICAgIC8vIFJlZ2lzdGVyIGZvcndhcmRlciBmb3IgY29tbW9uIGdlc3R1cmUgdHlwZXNcbiAgICAgIFtcbiAgICAgICAgXCJ0YXBcIixcbiAgICAgICAgXCJzd2lwZVwiLFxuICAgICAgICBcInN3aXBlbGVmdFwiLFxuICAgICAgICBcInN3aXBlcmlnaHRcIixcbiAgICAgICAgXCJzd2lwZXVwXCIsXG4gICAgICAgIFwic3dpcGVkb3duXCIsXG4gICAgICAgIFwibG9uZ3ByZXNzXCIsXG4gICAgICAgIFwicGluY2hcIixcbiAgICAgICAgXCJyb3RhdGVcIixcbiAgICAgICAgXCJwYW5cIixcbiAgICAgIF0uZm9yRWFjaCgodHlwZSkgPT4ge1xuICAgICAgICBnZXN0dXJlTWFuYWdlci5vbih0eXBlLCBmb3J3YXJkR2VzdHVyZUV2ZW50cyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgbGlmZWN5Y2xlIGludGVncmF0aW9uXG4gICAgaWYgKGhhc0xpZmVjeWNsZShjb21wb25lbnQpKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3k7XG5cbiAgICAgIGNvbXBvbmVudC5saWZlY3ljbGUuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgZ2VzdHVyZSBtYW5hZ2VyXG4gICAgICAgIGdlc3R1cmVNYW5hZ2VyLmRlc3Ryb3koKTtcblxuICAgICAgICAvLyBDYWxsIG9yaWdpbmFsIGRlc3Ryb3kgbWV0aG9kXG4gICAgICAgIG9yaWdpbmFsRGVzdHJveS5jYWxsKGNvbXBvbmVudC5saWZlY3ljbGUpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIGdlc3R1cmVzOiBnZXN0dXJlTWFuYWdlcixcblxuICAgICAgLyoqXG4gICAgICAgKiBBZGQgYSBnZXN0dXJlIGV2ZW50IGhhbmRsZXJcbiAgICAgICAqIEBwYXJhbSBldmVudFR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgZXZlbnRcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICogQHJldHVybnMgR2VzdHVyZXNDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIG9uR2VzdHVyZShldmVudFR5cGU6IHN0cmluZywgaGFuZGxlcjogR2VzdHVyZUhhbmRsZXIpIHtcbiAgICAgICAgZ2VzdHVyZU1hbmFnZXIub24oZXZlbnRUeXBlLCBoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBhIGdlc3R1cmUgZXZlbnQgaGFuZGxlclxuICAgICAgICogQHBhcmFtIGV2ZW50VHlwZSAtIFR5cGUgb2YgZ2VzdHVyZSBldmVudFxuICAgICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgb2ZmR2VzdHVyZShldmVudFR5cGU6IHN0cmluZywgaGFuZGxlcjogR2VzdHVyZUhhbmRsZXIpIHtcbiAgICAgICAgZ2VzdHVyZU1hbmFnZXIub2ZmKGV2ZW50VHlwZSwgaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDaGVjayBpZiBhIGdlc3R1cmUgdHlwZSBpcyBzdXBwb3J0ZWQgb24gdGhlIGN1cnJlbnQgZGV2aWNlXG4gICAgICAgKiBAcGFyYW0gZ2VzdHVyZVR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgdG8gY2hlY2tcbiAgICAgICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGdlc3R1cmUgaXMgc3VwcG9ydGVkXG4gICAgICAgKi9cbiAgICAgIGlzR2VzdHVyZVN1cHBvcnRlZChnZXN0dXJlVHlwZTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBnZXN0dXJlTWFuYWdlci5pc1N1cHBvcnRlZChnZXN0dXJlVHlwZSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEVuYWJsZSBnZXN0dXJlIHJlY29nbml0aW9uXG4gICAgICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgZW5hYmxlR2VzdHVyZXMoKSB7XG4gICAgICAgIGdlc3R1cmVNYW5hZ2VyLmVuYWJsZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZSBnZXN0dXJlIHJlY29nbml0aW9uXG4gICAgICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZUdlc3R1cmVzKCkge1xuICAgICAgICBnZXN0dXJlTWFuYWdlci5kaXNhYmxlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvLyBzcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3RhcC50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIEFkZHMgdGFwIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gY29tcG9uZW50c1xuICovXG5cbmltcG9ydCB0eXBlIHsgQmFzZUNvbXBvbmVudCwgRWxlbWVudENvbXBvbmVudCB9IGZyb20gXCJtdHJsXCI7XG5pbXBvcnQgeyBUYXBFdmVudCwgR2VzdHVyZUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vLi4vZ2VzdHVyZXNcIjtcbmltcG9ydCB7IGhhc0xpZmVjeWNsZSwgaGFzRW1pdCB9IGZyb20gXCJtdHJsXCI7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGFwIGdlc3R1cmUgZmVhdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhcEdlc3R1cmVDb25maWcge1xuICAvKipcbiAgICogRGlzdGFuY2UgdGhyZXNob2xkIChpbiBwaXhlbHMpIGZvciB0YXAgcmVjb2duaXRpb25cbiAgICogQGRlZmF1bHQgMTBcbiAgICovXG4gIHRhcERpc3RhbmNlVGhyZXNob2xkPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHByZXZlbnQgZGVmYXVsdCBiZWhhdmlvcnMgb24gdG91Y2ggZXZlbnRzXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHByZXZlbnREZWZhdWx0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgdGFwIGdlc3R1cmVcbiAgICovXG4gIG9uVGFwPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIHRhcCByZWNvZ25pdGlvbiBpbW1lZGlhdGVseVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBlbmFibGVkPzogYm9vbGVhbjtcblxuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IHdpdGggdGFwIGdlc3R1cmUgcmVjb2duaXRpb24gY2FwYWJpbGl0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFwR2VzdHVyZUNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvKipcbiAgICogQWRkIGEgdGFwIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uVGFwOiAoaGFuZGxlcjogKGV2ZW50OiBUYXBFdmVudCkgPT4gdm9pZCkgPT4gVGFwR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgdGFwIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlRhcDogKGhhbmRsZXI6IChldmVudDogVGFwRXZlbnQpID0+IHZvaWQpID0+IFRhcEdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSB0YXAgcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZW5hYmxlVGFwOiAoKSA9PiBUYXBHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlIHRhcCByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBkaXNhYmxlVGFwOiAoKSA9PiBUYXBHZXN0dXJlQ29tcG9uZW50O1xufVxuXG4vKipcbiAqIEFkZHMgdGFwIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnQuXG4gKiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQgYWx0ZXJuYXRpdmUgdG8gdGhlIGZ1bGwgZ2VzdHVyZSBzeXN0ZW0sXG4gKiBmb2N1c2VkIG9ubHkgb24gdGFwIGRldGVjdGlvbi5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBvYmplY3QgY29udGFpbmluZyB0YXAgc2V0dGluZ3NcbiAqIEByZXR1cm5zIEZ1bmN0aW9uIHRoYXQgZW5oYW5jZXMgYSBjb21wb25lbnQgd2l0aCB0YXAgY2FwYWJpbGl0aWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBBZGQgdGFwIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnRcbiAqIGNvbnN0IGNvbXBvbmVudCA9IHBpcGUoXG4gKiAgIGNyZWF0ZUJhc2UsXG4gKiAgIHdpdGhFbGVtZW50KC4uLiksXG4gKiAgIHdpdGhUYXBHZXN0dXJlKHtcbiAqICAgICBvblRhcDogKGUpID0+IGNvbnNvbGUubG9nKCdUYXBwZWQgYXQnLCBlLngsIGUueSlcbiAqICAgfSlcbiAqICkoY29uZmlnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgd2l0aFRhcEdlc3R1cmUgPVxuICAoY29uZmlnOiBUYXBHZXN0dXJlQ29uZmlnID0ge30pID0+XG4gIDxDIGV4dGVuZHMgRWxlbWVudENvbXBvbmVudD4oY29tcG9uZW50OiBDKTogQyAmIFRhcEdlc3R1cmVDb21wb25lbnQgPT4ge1xuICAgIGlmICghY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkNhbm5vdCBhZGQgdGFwIGdlc3R1cmUgcmVjb2duaXRpb246IG1pc3NpbmcgZWxlbWVudFwiKTtcbiAgICAgIHJldHVybiBjb21wb25lbnQgYXMgQyAmIFRhcEdlc3R1cmVDb21wb25lbnQ7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBjb25maWd1cmF0aW9uXG4gICAgY29uc3Qge1xuICAgICAgdGFwRGlzdGFuY2VUaHJlc2hvbGQgPSAxMCxcbiAgICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZSxcbiAgICAgIG9uVGFwLFxuICAgICAgZW5hYmxlZCA9IHRydWUsXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIEV2ZW50IGhhbmRsZXJzIHN0b3JhZ2VcbiAgICBjb25zdCBoYW5kbGVyczogU2V0PChldmVudDogVGFwRXZlbnQpID0+IHZvaWQ+ID0gbmV3IFNldCgpO1xuXG4gICAgLy8gSWYgaW5pdGlhbCBoYW5kbGVyIHByb3ZpZGVkLCBhZGQgaXRcbiAgICBpZiAob25UYXApIHtcbiAgICAgIGhhbmRsZXJzLmFkZChvblRhcCBhcyAoZXZlbnQ6IFRhcEV2ZW50KSA9PiB2b2lkKTtcbiAgICB9XG5cbiAgICAvLyBHZXN0dXJlIHN0YXRlIGZvciB0cmFja2luZ1xuICAgIGxldCBzdGFydFggPSAwO1xuICAgIGxldCBzdGFydFkgPSAwO1xuICAgIGxldCBhY3RpdmUgPSBmYWxzZTtcbiAgICBsZXQgc3RhcnRUaW1lID0gMDtcbiAgICBsZXQgbGFzdFRhcFRpbWUgPSAwO1xuICAgIGxldCB0YXBDb3VudCA9IDA7XG4gICAgbGV0IGlzRW5hYmxlZCA9IGVuYWJsZWQ7XG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaCBhIHRhcCBldmVudCB0byBhbGwgaGFuZGxlcnNcbiAgICAgKi9cbiAgICBjb25zdCBkaXNwYXRjaFRhcCA9IChcbiAgICAgIGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50LFxuICAgICAgeDogbnVtYmVyLFxuICAgICAgeTogbnVtYmVyXG4gICAgKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgaXNEb3VibGVUYXAgPSBub3cgLSBsYXN0VGFwVGltZSA8IDMwMDtcblxuICAgICAgaWYgKGlzRG91YmxlVGFwKSB7XG4gICAgICAgIHRhcENvdW50Kys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXBDb3VudCA9IDE7XG4gICAgICB9XG5cbiAgICAgIGxhc3RUYXBUaW1lID0gbm93O1xuXG4gICAgICAvLyBDcmVhdGUgdGhlIHRhcCBldmVudFxuICAgICAgY29uc3QgdGFwRXZlbnQ6IFRhcEV2ZW50ID0ge1xuICAgICAgICB0eXBlOiBcInRhcFwiLFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0YXJnZXQ6IGUudGFyZ2V0ISxcbiAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICBlbmRUaW1lOiBub3csXG4gICAgICAgIGR1cmF0aW9uOiBub3cgLSBzdGFydFRpbWUsXG4gICAgICAgIGRlZmF1bHRQcmV2ZW50ZWQ6IGZhbHNlLFxuICAgICAgICBwcmV2ZW50RGVmYXVsdDogKCkgPT4ge1xuICAgICAgICAgIHRhcEV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChlLmNhbmNlbGFibGUpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHN0b3BQcm9wYWdhdGlvbjogKCkgPT4ge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvdW50OiB0YXBDb3VudCxcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgIH07XG5cbiAgICAgIC8vIENhbGwgZWFjaCBoYW5kbGVyXG4gICAgICBoYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaGFuZGxlcih0YXBFdmVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGluIHRhcCBoYW5kbGVyOlwiLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBGb3J3YXJkIHRvIGNvbXBvbmVudCdzIGV2ZW50IHN5c3RlbSBpZiBhdmFpbGFibGVcbiAgICAgIGlmIChoYXNFbWl0KGNvbXBvbmVudCkpIHtcbiAgICAgICAgY29tcG9uZW50LmVtaXQoXCJ0YXBcIiwgdGFwRXZlbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBwcmV2ZW50RGVmYXVsdCBpZiBjb25maWd1cmVkXG4gICAgICBpZiAocHJldmVudERlZmF1bHQgJiYgIXRhcEV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgdGFwRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIHN0YXJ0XG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlU3RhcnQgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRvdWNoID0gXCJ0b3VjaGVzXCIgaW4gZSA/IGUudG91Y2hlc1swXSA6IGU7XG5cbiAgICAgIHN0YXJ0WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgICBzdGFydFkgPSB0b3VjaC5jbGllbnRZO1xuICAgICAgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGFjdGl2ZSA9IHRydWU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBlbmRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVFbmQgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghYWN0aXZlIHx8ICFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgdG91Y2ggPVxuICAgICAgICBcImNoYW5nZWRUb3VjaGVzXCIgaW4gZSAmJiBlLmNoYW5nZWRUb3VjaGVzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IGUuY2hhbmdlZFRvdWNoZXNbMF1cbiAgICAgICAgICA6IChlIGFzIE1vdXNlRXZlbnQpO1xuXG4gICAgICBjb25zdCBlbmRYID0gdG91Y2guY2xpZW50WDtcbiAgICAgIGNvbnN0IGVuZFkgPSB0b3VjaC5jbGllbnRZO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgZGlzdGFuY2UgbW92ZWRcbiAgICAgIGNvbnN0IGRlbHRhWCA9IGVuZFggLSBzdGFydFg7XG4gICAgICBjb25zdCBkZWx0YVkgPSBlbmRZIC0gc3RhcnRZO1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgbW92ZW1lbnQgaXMgd2l0aGluIHRocmVzaG9sZFxuICAgICAgaWYgKGRpc3RhbmNlIDwgdGFwRGlzdGFuY2VUaHJlc2hvbGQpIHtcbiAgICAgICAgZGlzcGF0Y2hUYXAoZSwgZW5kWCwgZW5kWSk7XG4gICAgICB9XG5cbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgY2FuY2VsXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8vIEV2ZW50IGxpc3RlbmVycyBkaWN0aW9uYXJ5XG4gICAgY29uc3QgZXZlbnRMaXN0ZW5lcnM6IFJlY29yZDxzdHJpbmcsIEV2ZW50TGlzdGVuZXI+ID0ge1xuICAgICAgbW91c2Vkb3duOiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2V1cDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICBtb3VzZWxlYXZlOiBoYW5kbGVDYW5jZWwgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNoc3RhcnQ6IGhhbmRsZVN0YXJ0IGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaGVuZDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaGNhbmNlbDogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZCBldmVudCBsaXN0ZW5lcnMgdG8gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHNldHVwRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBPYmplY3QuZW50cmllcyhldmVudExpc3RlbmVycykuZm9yRWFjaCgoW2V2ZW50LCBsaXN0ZW5lcl0pID0+IHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIHtcbiAgICAgICAgICBwYXNzaXZlOiAhcHJldmVudERlZmF1bHQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBldmVudCBsaXN0ZW5lcnMgZnJvbSBlbGVtZW50XG4gICAgICovXG4gICAgY29uc3QgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBPYmplY3QuZW50cmllcyhldmVudExpc3RlbmVycykuZm9yRWFjaCgoW2V2ZW50LCBsaXN0ZW5lcl0pID0+IHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIFNldHVwIGxpc3RlbmVycyBpZiBpbml0aWFsbHkgZW5hYmxlZFxuICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgbGlmZWN5Y2xlIGludGVncmF0aW9uXG4gICAgaWYgKGhhc0xpZmVjeWNsZShjb21wb25lbnQpKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3k7XG5cbiAgICAgIGNvbXBvbmVudC5saWZlY3ljbGUuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgICAgICAgLy8gQ2xlYXIgaGFuZGxlcnNcbiAgICAgICAgaGFuZGxlcnMuY2xlYXIoKTtcblxuICAgICAgICAvLyBDYWxsIG9yaWdpbmFsIGRlc3Ryb3kgbWV0aG9kXG4gICAgICAgIG9yaWdpbmFsRGVzdHJveS5jYWxsKGNvbXBvbmVudC5saWZlY3ljbGUpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcblxuICAgICAgLyoqXG4gICAgICAgKiBBZGQgYSB0YXAgZXZlbnQgaGFuZGxlclxuICAgICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIG9uVGFwKGhhbmRsZXI6IChldmVudDogVGFwRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlIGEgdGFwIGV2ZW50IGhhbmRsZXJcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgICAgICovXG4gICAgICBvZmZUYXAoaGFuZGxlcjogKGV2ZW50OiBUYXBFdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBFbmFibGUgdGFwIHJlY29nbml0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZVRhcCgpIHtcbiAgICAgICAgaWYgKCFpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZSB0YXAgcmVjb2duaXRpb25cbiAgICAgICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZVRhcCgpIHtcbiAgICAgICAgaWYgKGlzRW5hYmxlZCkge1xuICAgICAgICAgIGlzRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgIH07XG4gIH07XG4iLAogICAgIi8vIHNyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMvc3dpcGUudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBBZGRzIHN3aXBlIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gY29tcG9uZW50c1xuICovXG5cbmltcG9ydCB0eXBlIHsgQmFzZUNvbXBvbmVudCwgRWxlbWVudENvbXBvbmVudCB9IGZyb20gXCJtdHJsXCI7XG5pbXBvcnQge1xuICBTd2lwZUV2ZW50LFxuICBTV0lQRV9ESVJFQ1RJT05TLFxuICBHZXN0dXJlSGFuZGxlcixcbn0gZnJvbSBcIi4uLy4uLy4uL2dlc3R1cmVzXCI7XG5pbXBvcnQgeyBoYXNMaWZlY3ljbGUsIGhhc0VtaXQgfSBmcm9tIFwibXRybFwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHN3aXBlIGdlc3R1cmUgZmVhdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN3aXBlR2VzdHVyZUNvbmZpZyB7XG4gIC8qKlxuICAgKiBNaW5pbXVtIGRpc3RhbmNlIChpbiBwaXhlbHMpIHRvIHJlY29nbml6ZSBhIHN3aXBlXG4gICAqIEBkZWZhdWx0IDMwXG4gICAqL1xuICBzd2lwZVRocmVzaG9sZD86IG51bWJlcjtcblxuICAvKipcbiAgICogTWF4aW11bSB0aW1lIChpbiBtcykgaW4gd2hpY2ggYSBzd2lwZSBtdXN0IGJlIGNvbXBsZXRlZFxuICAgKiBAZGVmYXVsdCAzMDBcbiAgICovXG4gIHN3aXBlVGltZVRocmVzaG9sZD86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBwcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3JzIG9uIHRvdWNoIGV2ZW50c1xuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBwcmV2ZW50RGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIGFueSBzd2lwZSBkaXJlY3Rpb25cbiAgICovXG4gIG9uU3dpcGU/OiBHZXN0dXJlSGFuZGxlcjtcblxuICAvKipcbiAgICogSGFuZGxlciBzcGVjaWZpY2FsbHkgZm9yIGxlZnQgc3dpcGVzXG4gICAqL1xuICBvblN3aXBlTGVmdD86IEdlc3R1cmVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVyIHNwZWNpZmljYWxseSBmb3IgcmlnaHQgc3dpcGVzXG4gICAqL1xuICBvblN3aXBlUmlnaHQ/OiBHZXN0dXJlSGFuZGxlcjtcblxuICAvKipcbiAgICogSGFuZGxlciBzcGVjaWZpY2FsbHkgZm9yIHVwIHN3aXBlc1xuICAgKi9cbiAgb25Td2lwZVVwPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciBkb3duIHN3aXBlc1xuICAgKi9cbiAgb25Td2lwZURvd24/OiBHZXN0dXJlSGFuZGxlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlbmFibGUgc3dpcGUgcmVjb2duaXRpb24gaW1tZWRpYXRlbHlcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vKipcbiAqIENvbXBvbmVudCB3aXRoIHN3aXBlIGdlc3R1cmUgcmVjb2duaXRpb24gY2FwYWJpbGl0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3dpcGVHZXN0dXJlQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBBZGQgYSBoYW5kbGVyIGZvciBhbnkgc3dpcGUgZGlyZWN0aW9uXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblN3aXBlOiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciBsZWZ0IHN3aXBlc1xuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb25Td2lwZUxlZnQ6IChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpID0+IFN3aXBlR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogQWRkIGEgaGFuZGxlciBzcGVjaWZpY2FsbHkgZm9yIHJpZ2h0IHN3aXBlc1xuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb25Td2lwZVJpZ2h0OiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciB1cCBzd2lwZXNcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uU3dpcGVVcDogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBoYW5kbGVyIHNwZWNpZmljYWxseSBmb3IgZG93biBzd2lwZXNcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uU3dpcGVEb3duOiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHN3aXBlIGV2ZW50IGhhbmRsZXIgZm9yIGFueSBkaXJlY3Rpb25cbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlN3aXBlOiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGxlZnQgc3dpcGUgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmU3dpcGVMZWZ0OiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHJpZ2h0IHN3aXBlIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlN3aXBlUmlnaHQ6IChcbiAgICBoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWRcbiAgKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiB1cCBzd2lwZSBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZTd2lwZVVwOiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGRvd24gc3dpcGUgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmU3dpcGVEb3duOiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBzd2lwZSByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBlbmFibGVTd2lwZTogKCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlIHN3aXBlIHJlY29nbml0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGRpc2FibGVTd2lwZTogKCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xufVxuXG4vKipcbiAqIERldGVybWluZSBzd2lwZSBkaXJlY3Rpb24gYmFzZWQgb24gZGVsdGEgWCBhbmQgWVxuICpcbiAqIEBwYXJhbSBkZWx0YVggLSBEaXN0YW5jZSBtb3ZlZCBpbiBYIGRpcmVjdGlvblxuICogQHBhcmFtIGRlbHRhWSAtIERpc3RhbmNlIG1vdmVkIGluIFkgZGlyZWN0aW9uXG4gKiBAcmV0dXJucyBEaXJlY3Rpb24gb2YgdGhlIHN3aXBlXG4gKi9cbmZ1bmN0aW9uIGdldFN3aXBlRGlyZWN0aW9uKGRlbHRhWDogbnVtYmVyLCBkZWx0YVk6IG51bWJlcik6IFNXSVBFX0RJUkVDVElPTlMge1xuICBpZiAoTWF0aC5hYnMoZGVsdGFYKSA+IE1hdGguYWJzKGRlbHRhWSkpIHtcbiAgICByZXR1cm4gZGVsdGFYID4gMCA/IFNXSVBFX0RJUkVDVElPTlMuUklHSFQgOiBTV0lQRV9ESVJFQ1RJT05TLkxFRlQ7XG4gIH1cbiAgcmV0dXJuIGRlbHRhWSA+IDAgPyBTV0lQRV9ESVJFQ1RJT05TLkRPV04gOiBTV0lQRV9ESVJFQ1RJT05TLlVQO1xufVxuXG4vKipcbiAqIEFkZHMgc3dpcGUgZ2VzdHVyZSByZWNvZ25pdGlvbiB0byBhIGNvbXBvbmVudC5cbiAqIFRoaXMgaXMgYSBsaWdodHdlaWdodCBhbHRlcm5hdGl2ZSB0byB0aGUgZnVsbCBnZXN0dXJlIHN5c3RlbSxcbiAqIGZvY3VzZWQgb25seSBvbiBzd2lwZSBkZXRlY3Rpb24uXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgc3dpcGUgc2V0dGluZ3NcbiAqIEByZXR1cm5zIEZ1bmN0aW9uIHRoYXQgZW5oYW5jZXMgYSBjb21wb25lbnQgd2l0aCBzd2lwZSBjYXBhYmlsaXRpZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIEFkZCBzd2lwZSBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50XG4gKiBjb25zdCBjb21wb25lbnQgPSBwaXBlKFxuICogICBjcmVhdGVCYXNlLFxuICogICB3aXRoRWxlbWVudCguLi4pLFxuICogICB3aXRoU3dpcGVHZXN0dXJlKHtcbiAqICAgICBvblN3aXBlTGVmdDogKCkgPT4gc2hvd05leHRQYWdlKCksXG4gKiAgICAgb25Td2lwZVJpZ2h0OiAoKSA9PiBzaG93UHJldmlvdXNQYWdlKClcbiAqICAgfSlcbiAqICkoY29uZmlnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgd2l0aFN3aXBlR2VzdHVyZSA9XG4gIChjb25maWc6IFN3aXBlR2VzdHVyZUNvbmZpZyA9IHt9KSA9PlxuICA8QyBleHRlbmRzIEVsZW1lbnRDb21wb25lbnQ+KGNvbXBvbmVudDogQyk6IEMgJiBTd2lwZUdlc3R1cmVDb21wb25lbnQgPT4ge1xuICAgIGlmICghY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkNhbm5vdCBhZGQgc3dpcGUgZ2VzdHVyZSByZWNvZ25pdGlvbjogbWlzc2luZyBlbGVtZW50XCIpO1xuICAgICAgcmV0dXJuIGNvbXBvbmVudCBhcyBDICYgU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIHN3aXBlVGhyZXNob2xkID0gMzAsXG4gICAgICBzd2lwZVRpbWVUaHJlc2hvbGQgPSAzMDAsXG4gICAgICBwcmV2ZW50RGVmYXVsdCA9IHRydWUsXG4gICAgICBvblN3aXBlLFxuICAgICAgb25Td2lwZUxlZnQsXG4gICAgICBvblN3aXBlUmlnaHQsXG4gICAgICBvblN3aXBlVXAsXG4gICAgICBvblN3aXBlRG93bixcbiAgICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBFdmVudCBoYW5kbGVycyBzdG9yYWdlIGJ5IGRpcmVjdGlvblxuICAgIGNvbnN0IGhhbmRsZXJzID0ge1xuICAgICAgc3dpcGU6IG5ldyBTZXQ8KGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkPigpLFxuICAgICAgc3dpcGVsZWZ0OiBuZXcgU2V0PChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZD4oKSxcbiAgICAgIHN3aXBlcmlnaHQ6IG5ldyBTZXQ8KGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkPigpLFxuICAgICAgc3dpcGV1cDogbmV3IFNldDwoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQ+KCksXG4gICAgICBzd2lwZWRvd246IG5ldyBTZXQ8KGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkPigpLFxuICAgIH07XG5cbiAgICAvLyBBZGQgaW5pdGlhbCBoYW5kbGVycyBpZiBwcm92aWRlZFxuICAgIGlmIChvblN3aXBlKSBoYW5kbGVycy5zd2lwZS5hZGQob25Td2lwZSBhcyAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpO1xuICAgIGlmIChvblN3aXBlTGVmdClcbiAgICAgIGhhbmRsZXJzLnN3aXBlbGVmdC5hZGQob25Td2lwZUxlZnQgYXMgKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKTtcbiAgICBpZiAob25Td2lwZVJpZ2h0KVxuICAgICAgaGFuZGxlcnMuc3dpcGVyaWdodC5hZGQob25Td2lwZVJpZ2h0IGFzIChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCk7XG4gICAgaWYgKG9uU3dpcGVVcClcbiAgICAgIGhhbmRsZXJzLnN3aXBldXAuYWRkKG9uU3dpcGVVcCBhcyAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpO1xuICAgIGlmIChvblN3aXBlRG93bilcbiAgICAgIGhhbmRsZXJzLnN3aXBlZG93bi5hZGQob25Td2lwZURvd24gYXMgKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKTtcblxuICAgIC8vIEdlc3R1cmUgc3RhdGUgZm9yIHRyYWNraW5nXG4gICAgbGV0IHN0YXJ0WCA9IDA7XG4gICAgbGV0IHN0YXJ0WSA9IDA7XG4gICAgbGV0IGFjdGl2ZSA9IGZhbHNlO1xuICAgIGxldCBzdGFydFRpbWUgPSAwO1xuICAgIGxldCBpc0VuYWJsZWQgPSBlbmFibGVkO1xuXG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2ggYSBzd2lwZSBldmVudCB0byBhbGwgcmVnaXN0ZXJlZCBoYW5kbGVyc1xuICAgICAqL1xuICAgIGNvbnN0IGRpc3BhdGNoU3dpcGUgPSAoXG4gICAgICBlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCxcbiAgICAgIGVuZFg6IG51bWJlcixcbiAgICAgIGVuZFk6IG51bWJlclxuICAgICk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgZGVsdGFYID0gZW5kWCAtIHN0YXJ0WDtcbiAgICAgIGNvbnN0IGRlbHRhWSA9IGVuZFkgLSBzdGFydFk7XG4gICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguc3FydChkZWx0YVggKiBkZWx0YVggKyBkZWx0YVkgKiBkZWx0YVkpO1xuICAgICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG4gICAgICBjb25zdCB2ZWxvY2l0eSA9IGRpc3RhbmNlIC8gZHVyYXRpb247XG4gICAgICBjb25zdCBkaXJlY3Rpb24gPSBnZXRTd2lwZURpcmVjdGlvbihkZWx0YVgsIGRlbHRhWSk7XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgc3dpcGUgZXZlbnRcbiAgICAgIGNvbnN0IHN3aXBlRXZlbnQ6IFN3aXBlRXZlbnQgPSB7XG4gICAgICAgIHR5cGU6IFwic3dpcGVcIixcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgdGFyZ2V0OiBlLnRhcmdldCEsXG4gICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgZW5kVGltZSxcbiAgICAgICAgZHVyYXRpb24sXG4gICAgICAgIGRlZmF1bHRQcmV2ZW50ZWQ6IGZhbHNlLFxuICAgICAgICBwcmV2ZW50RGVmYXVsdDogKCkgPT4ge1xuICAgICAgICAgIHN3aXBlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICBkZWx0YVgsXG4gICAgICAgIGRlbHRhWSxcbiAgICAgICAgZGlzdGFuY2UsXG4gICAgICAgIHZlbG9jaXR5LFxuICAgICAgICBzdGFydFgsXG4gICAgICAgIHN0YXJ0WSxcbiAgICAgICAgZW5kWCxcbiAgICAgICAgZW5kWSxcbiAgICAgIH07XG5cbiAgICAgIC8vIEZpcnN0IHRyaWdnZXIgZ2VuZXJpYyBzd2lwZSBoYW5kbGVyc1xuICAgICAgaGFuZGxlcnMuc3dpcGUuZm9yRWFjaCgoaGFuZGxlcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGhhbmRsZXIoc3dpcGVFdmVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGluIHN3aXBlIGhhbmRsZXI6XCIsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFRoZW4gdHJpZ2dlciBkaXJlY3Rpb24tc3BlY2lmaWMgaGFuZGxlcnNcbiAgICAgIGNvbnN0IGRpcmVjdGlvbktleSA9IGBzd2lwZSR7ZGlyZWN0aW9ufWAgYXMga2V5b2YgdHlwZW9mIGhhbmRsZXJzO1xuICAgICAgaGFuZGxlcnNbZGlyZWN0aW9uS2V5XS5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaGFuZGxlcih7IC4uLnN3aXBlRXZlbnQsIHR5cGU6IGRpcmVjdGlvbktleSB9IGFzIFN3aXBlRXZlbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGluICR7ZGlyZWN0aW9uS2V5fSBoYW5kbGVyOmAsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEZvcndhcmQgdG8gY29tcG9uZW50J3MgZXZlbnQgc3lzdGVtIGlmIGF2YWlsYWJsZVxuICAgICAgaWYgKGhhc0VtaXQoY29tcG9uZW50KSkge1xuICAgICAgICBjb21wb25lbnQuZW1pdChcInN3aXBlXCIsIHN3aXBlRXZlbnQpO1xuICAgICAgICBjb21wb25lbnQuZW1pdChkaXJlY3Rpb25LZXksIHN3aXBlRXZlbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBwcmV2ZW50RGVmYXVsdCBpZiBjb25maWd1cmVkXG4gICAgICBpZiAocHJldmVudERlZmF1bHQgJiYgIXN3aXBlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICBzd2lwZUV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBzdGFydFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZVN0YXJ0ID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0b3VjaCA9IFwidG91Y2hlc1wiIGluIGUgPyBlLnRvdWNoZXNbMF0gOiBlO1xuXG4gICAgICBzdGFydFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgc3RhcnRZID0gdG91Y2guY2xpZW50WTtcbiAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBhY3RpdmUgPSB0cnVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgZW5kXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlRW5kID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWFjdGl2ZSB8fCAhaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRvdWNoID1cbiAgICAgICAgXCJjaGFuZ2VkVG91Y2hlc1wiIGluIGUgJiYgZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggPiAwXG4gICAgICAgICAgPyBlLmNoYW5nZWRUb3VjaGVzWzBdXG4gICAgICAgICAgOiAoZSBhcyBNb3VzZUV2ZW50KTtcblxuICAgICAgY29uc3QgZW5kWCA9IHRvdWNoLmNsaWVudFg7XG4gICAgICBjb25zdCBlbmRZID0gdG91Y2guY2xpZW50WTtcblxuICAgICAgLy8gQ2FsY3VsYXRlIHN3aXBlIHByb3BlcnRpZXNcbiAgICAgIGNvbnN0IGRlbHRhWCA9IGVuZFggLSBzdGFydFg7XG4gICAgICBjb25zdCBkZWx0YVkgPSBlbmRZIC0gc3RhcnRZO1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcblxuICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhIHN3aXBlXG4gICAgICBpZiAoZGlzdGFuY2UgPj0gc3dpcGVUaHJlc2hvbGQgJiYgZHVyYXRpb24gPD0gc3dpcGVUaW1lVGhyZXNob2xkKSB7XG4gICAgICAgIGRpc3BhdGNoU3dpcGUoZSwgZW5kWCwgZW5kWSk7XG4gICAgICB9XG5cbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgY2FuY2VsXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8vIEV2ZW50IGxpc3RlbmVycyBkaWN0aW9uYXJ5XG4gICAgY29uc3QgZXZlbnRMaXN0ZW5lcnM6IFJlY29yZDxzdHJpbmcsIEV2ZW50TGlzdGVuZXI+ID0ge1xuICAgICAgbW91c2Vkb3duOiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2V1cDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICBtb3VzZWxlYXZlOiBoYW5kbGVDYW5jZWwgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNoc3RhcnQ6IGhhbmRsZVN0YXJ0IGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaGVuZDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaGNhbmNlbDogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZCBldmVudCBsaXN0ZW5lcnMgdG8gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHNldHVwRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBPYmplY3QuZW50cmllcyhldmVudExpc3RlbmVycykuZm9yRWFjaCgoW2V2ZW50LCBsaXN0ZW5lcl0pID0+IHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIHtcbiAgICAgICAgICBwYXNzaXZlOiAhcHJldmVudERlZmF1bHQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBldmVudCBsaXN0ZW5lcnMgZnJvbSBlbGVtZW50XG4gICAgICovXG4gICAgY29uc3QgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBPYmplY3QuZW50cmllcyhldmVudExpc3RlbmVycykuZm9yRWFjaCgoW2V2ZW50LCBsaXN0ZW5lcl0pID0+IHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIFNldHVwIGxpc3RlbmVycyBpZiBpbml0aWFsbHkgZW5hYmxlZFxuICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgbGlmZWN5Y2xlIGludGVncmF0aW9uXG4gICAgaWYgKGhhc0xpZmVjeWNsZShjb21wb25lbnQpKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3k7XG5cbiAgICAgIGNvbXBvbmVudC5saWZlY3ljbGUuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgICAgICAgLy8gQ2xlYXIgaGFuZGxlcnNcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhoYW5kbGVycykuZm9yRWFjaCgoaGFuZGxlclNldCkgPT4gaGFuZGxlclNldC5jbGVhcigpKTtcblxuICAgICAgICAvLyBDYWxsIG9yaWdpbmFsIGRlc3Ryb3kgbWV0aG9kXG4gICAgICAgIG9yaWdpbmFsRGVzdHJveS5jYWxsKGNvbXBvbmVudC5saWZlY3ljbGUpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcblxuICAgICAgLy8gQWRkIGhhbmRsZXIgbWV0aG9kc1xuICAgICAgb25Td2lwZShoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGUuYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9uU3dpcGVMZWZ0KGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5zd2lwZWxlZnQuYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9uU3dpcGVSaWdodChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGVyaWdodC5hZGQoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb25Td2lwZVVwKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5zd2lwZXVwLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvblN3aXBlRG93bihoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGVkb3duLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvLyBSZW1vdmUgaGFuZGxlciBtZXRob2RzXG4gICAgICBvZmZTd2lwZShoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGUuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9mZlN3aXBlTGVmdChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGVsZWZ0LmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvZmZTd2lwZVJpZ2h0KGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5zd2lwZXJpZ2h0LmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvZmZTd2lwZVVwKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5zd2lwZXVwLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvZmZTd2lwZURvd24oaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlZG93bi5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLy8gRW5hYmxlL2Rpc2FibGUgbWV0aG9kc1xuICAgICAgZW5hYmxlU3dpcGUoKSB7XG4gICAgICAgIGlmICghaXNFbmFibGVkKSB7XG4gICAgICAgICAgaXNFbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBkaXNhYmxlU3dpcGUoKSB7XG4gICAgICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvLyBzcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL2xvbmdwcmVzcy50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIEFkZHMgbG9uZyBwcmVzcyBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGNvbXBvbmVudHNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEJhc2VDb21wb25lbnQsIEVsZW1lbnRDb21wb25lbnQgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgTG9uZ1ByZXNzRXZlbnQsIEdlc3R1cmVIYW5kbGVyIH0gZnJvbSBcIi4uLy4uLy4uL2dlc3R1cmVzXCI7XG5pbXBvcnQgeyBoYXNMaWZlY3ljbGUsIGhhc0VtaXQgfSBmcm9tIFwibXRybFwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGxvbmcgcHJlc3MgZ2VzdHVyZSBmZWF0dXJlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9uZ1ByZXNzR2VzdHVyZUNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaW1lIChpbiBtcykgdG8gcmVjb2duaXplIGEgbG9uZyBwcmVzc1xuICAgKiBAZGVmYXVsdCA1MDBcbiAgICovXG4gIGxvbmdQcmVzc1RpbWU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIERpc3RhbmNlIHRocmVzaG9sZCAoaW4gcGl4ZWxzKSBmb3IgbW92ZW1lbnQgdGhhdCBjYW5jZWxzIGxvbmcgcHJlc3NcbiAgICogQGRlZmF1bHQgMTBcbiAgICovXG4gIG1vdmVUaHJlc2hvbGQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcHJldmVudCBkZWZhdWx0IGJlaGF2aW9ycyBvbiB0b3VjaCBldmVudHNcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcHJldmVudERlZmF1bHQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVyIGZvciBsb25nIHByZXNzIGdlc3R1cmVcbiAgICovXG4gIG9uTG9uZ1ByZXNzPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIGxvbmcgcHJlc3MgcmVjb2duaXRpb24gaW1tZWRpYXRlbHlcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vKipcbiAqIENvbXBvbmVudCB3aXRoIGxvbmcgcHJlc3MgZ2VzdHVyZSByZWNvZ25pdGlvbiBjYXBhYmlsaXRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb25nUHJlc3NHZXN0dXJlQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBBZGQgYSBsb25nIHByZXNzIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uTG9uZ1ByZXNzOiAoXG4gICAgaGFuZGxlcjogKGV2ZW50OiBMb25nUHJlc3NFdmVudCkgPT4gdm9pZFxuICApID0+IExvbmdQcmVzc0dlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGxvbmcgcHJlc3MgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmTG9uZ1ByZXNzOiAoXG4gICAgaGFuZGxlcjogKGV2ZW50OiBMb25nUHJlc3NFdmVudCkgPT4gdm9pZFxuICApID0+IExvbmdQcmVzc0dlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBsb25nIHByZXNzIHJlY29nbml0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGVuYWJsZUxvbmdQcmVzczogKCkgPT4gTG9uZ1ByZXNzR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogRGlzYWJsZSBsb25nIHByZXNzIHJlY29nbml0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGRpc2FibGVMb25nUHJlc3M6ICgpID0+IExvbmdQcmVzc0dlc3R1cmVDb21wb25lbnQ7XG59XG5cbi8qKlxuICogQWRkcyBsb25nIHByZXNzIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnQuXG4gKiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQgYWx0ZXJuYXRpdmUgdG8gdGhlIGZ1bGwgZ2VzdHVyZSBzeXN0ZW0sXG4gKiBmb2N1c2VkIG9ubHkgb24gbG9uZyBwcmVzcyBkZXRlY3Rpb24uXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgbG9uZyBwcmVzcyBzZXR0aW5nc1xuICogQHJldHVybnMgRnVuY3Rpb24gdGhhdCBlbmhhbmNlcyBhIGNvbXBvbmVudCB3aXRoIGxvbmcgcHJlc3MgY2FwYWJpbGl0aWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBBZGQgbG9uZyBwcmVzcyBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50XG4gKiBjb25zdCBjb21wb25lbnQgPSBwaXBlKFxuICogICBjcmVhdGVCYXNlLFxuICogICB3aXRoRWxlbWVudCguLi4pLFxuICogICB3aXRoTG9uZ1ByZXNzR2VzdHVyZSh7XG4gKiAgICAgbG9uZ1ByZXNzVGltZTogODAwLFxuICogICAgIG9uTG9uZ1ByZXNzOiAoZSkgPT4gc2hvd0NvbnRleHRNZW51KGUueCwgZS55KVxuICogICB9KVxuICogKShjb25maWcpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoTG9uZ1ByZXNzR2VzdHVyZSA9XG4gIChjb25maWc6IExvbmdQcmVzc0dlc3R1cmVDb25maWcgPSB7fSkgPT5cbiAgPEMgZXh0ZW5kcyBFbGVtZW50Q29tcG9uZW50Pihjb21wb25lbnQ6IEMpOiBDICYgTG9uZ1ByZXNzR2VzdHVyZUNvbXBvbmVudCA9PiB7XG4gICAgaWYgKCFjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIkNhbm5vdCBhZGQgbG9uZyBwcmVzcyBnZXN0dXJlIHJlY29nbml0aW9uOiBtaXNzaW5nIGVsZW1lbnRcIlxuICAgICAgKTtcbiAgICAgIHJldHVybiBjb21wb25lbnQgYXMgQyAmIExvbmdQcmVzc0dlc3R1cmVDb21wb25lbnQ7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBjb25maWd1cmF0aW9uXG4gICAgY29uc3Qge1xuICAgICAgbG9uZ1ByZXNzVGltZSA9IDUwMCxcbiAgICAgIG1vdmVUaHJlc2hvbGQgPSAxMCxcbiAgICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZSxcbiAgICAgIG9uTG9uZ1ByZXNzLFxuICAgICAgZW5hYmxlZCA9IHRydWUsXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIEV2ZW50IGhhbmRsZXJzIHN0b3JhZ2VcbiAgICBjb25zdCBoYW5kbGVyczogU2V0PChldmVudDogTG9uZ1ByZXNzRXZlbnQpID0+IHZvaWQ+ID0gbmV3IFNldCgpO1xuXG4gICAgLy8gSWYgaW5pdGlhbCBoYW5kbGVyIHByb3ZpZGVkLCBhZGQgaXRcbiAgICBpZiAob25Mb25nUHJlc3MpIHtcbiAgICAgIGhhbmRsZXJzLmFkZChvbkxvbmdQcmVzcyBhcyAoZXZlbnQ6IExvbmdQcmVzc0V2ZW50KSA9PiB2b2lkKTtcbiAgICB9XG5cbiAgICAvLyBHZXN0dXJlIHN0YXRlIGZvciB0cmFja2luZ1xuICAgIGxldCBzdGFydFggPSAwO1xuICAgIGxldCBzdGFydFkgPSAwO1xuICAgIGxldCBjdXJyZW50WCA9IDA7XG4gICAgbGV0IGN1cnJlbnRZID0gMDtcbiAgICBsZXQgYWN0aXZlID0gZmFsc2U7XG4gICAgbGV0IHN0YXJ0VGltZSA9IDA7XG4gICAgbGV0IGxvbmdQcmVzc1RpbWVyOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaXNFbmFibGVkID0gZW5hYmxlZDtcblxuICAgIC8qKlxuICAgICAqIERpc3BhdGNoIGEgbG9uZyBwcmVzcyBldmVudCB0byBhbGwgaGFuZGxlcnNcbiAgICAgKi9cbiAgICBjb25zdCBkaXNwYXRjaExvbmdQcmVzcyA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgLy8gQ3JlYXRlIHRoZSBsb25nIHByZXNzIGV2ZW50XG4gICAgICBjb25zdCBsb25nUHJlc3NFdmVudDogTG9uZ1ByZXNzRXZlbnQgPSB7XG4gICAgICAgIHR5cGU6IFwibG9uZ3ByZXNzXCIsXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHRhcmdldDogZS50YXJnZXQhLFxuICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgIGVuZFRpbWU6IERhdGUubm93KCksXG4gICAgICAgIGR1cmF0aW9uOiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lLFxuICAgICAgICBkZWZhdWx0UHJldmVudGVkOiBmYWxzZSxcbiAgICAgICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgICBsb25nUHJlc3NFdmVudC5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzdG9wUHJvcGFnYXRpb246ICgpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9LFxuICAgICAgICB4OiBjdXJyZW50WCxcbiAgICAgICAgeTogY3VycmVudFksXG4gICAgICB9O1xuXG4gICAgICAvLyBDYWxsIGVhY2ggaGFuZGxlclxuICAgICAgaGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGhhbmRsZXIobG9uZ1ByZXNzRXZlbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBpbiBsb25nIHByZXNzIGhhbmRsZXI6XCIsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEZvcndhcmQgdG8gY29tcG9uZW50J3MgZXZlbnQgc3lzdGVtIGlmIGF2YWlsYWJsZVxuICAgICAgaWYgKGhhc0VtaXQoY29tcG9uZW50KSkge1xuICAgICAgICBjb21wb25lbnQuZW1pdChcImxvbmdwcmVzc1wiLCBsb25nUHJlc3NFdmVudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFwcGx5IHByZXZlbnREZWZhdWx0IGlmIGNvbmZpZ3VyZWRcbiAgICAgIGlmIChwcmV2ZW50RGVmYXVsdCAmJiAhbG9uZ1ByZXNzRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICBsb25nUHJlc3NFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2Ugc3RhcnRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVTdGFydCA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgdG91Y2ggPSBcInRvdWNoZXNcIiBpbiBlID8gZS50b3VjaGVzWzBdIDogZTtcblxuICAgICAgc3RhcnRYID0gY3VycmVudFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgc3RhcnRZID0gY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuICAgICAgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGFjdGl2ZSA9IHRydWU7XG5cbiAgICAgIC8vIENhbmNlbCBhbnkgZXhpc3RpbmcgdGltZXJcbiAgICAgIGlmIChsb25nUHJlc3NUaW1lciAhPT0gbnVsbCkge1xuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGxvbmdQcmVzc1RpbWVyKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHVwIGxvbmcgcHJlc3MgdGltZXJcbiAgICAgIGxvbmdQcmVzc1RpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgbW92ZW1lbnQgd2FzIHdpdGhpbiB0aHJlc2hvbGRcbiAgICAgICAgICBjb25zdCBkZWx0YVggPSBjdXJyZW50WCAtIHN0YXJ0WDtcbiAgICAgICAgICBjb25zdCBkZWx0YVkgPSBjdXJyZW50WSAtIHN0YXJ0WTtcbiAgICAgICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguc3FydChkZWx0YVggKiBkZWx0YVggKyBkZWx0YVkgKiBkZWx0YVkpO1xuXG4gICAgICAgICAgaWYgKGRpc3RhbmNlIDwgbW92ZVRocmVzaG9sZCkge1xuICAgICAgICAgICAgZGlzcGF0Y2hMb25nUHJlc3MoZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbG9uZ1ByZXNzVGltZXIgPSBudWxsO1xuICAgICAgfSwgbG9uZ1ByZXNzVGltZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBtb3ZlXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlTW92ZSA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFhY3RpdmUgfHwgIWlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0b3VjaCA9IFwidG91Y2hlc1wiIGluIGUgPyBlLnRvdWNoZXNbMF0gOiBlO1xuXG4gICAgICBjdXJyZW50WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgICBjdXJyZW50WSA9IHRvdWNoLmNsaWVudFk7XG5cbiAgICAgIC8vIENoZWNrIGlmIG1vdmVtZW50IGV4Y2VlZHMgdGhyZXNob2xkXG4gICAgICBjb25zdCBkZWx0YVggPSBjdXJyZW50WCAtIHN0YXJ0WDtcbiAgICAgIGNvbnN0IGRlbHRhWSA9IGN1cnJlbnRZIC0gc3RhcnRZO1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcblxuICAgICAgaWYgKGRpc3RhbmNlID4gbW92ZVRocmVzaG9sZCkge1xuICAgICAgICAvLyBDYW5jZWwgbG9uZyBwcmVzcyBpZiBtb3ZlZCB0b28gbXVjaFxuICAgICAgICBpZiAobG9uZ1ByZXNzVGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGxvbmdQcmVzc1RpbWVyKTtcbiAgICAgICAgICBsb25nUHJlc3NUaW1lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIGVuZFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUVuZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChsb25nUHJlc3NUaW1lciAhPT0gbnVsbCkge1xuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGxvbmdQcmVzc1RpbWVyKTtcbiAgICAgICAgbG9uZ1ByZXNzVGltZXIgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIGNhbmNlbFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChsb25nUHJlc3NUaW1lciAhPT0gbnVsbCkge1xuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGxvbmdQcmVzc1RpbWVyKTtcbiAgICAgICAgbG9uZ1ByZXNzVGltZXIgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgLy8gRXZlbnQgbGlzdGVuZXJzIGRpY3Rpb25hcnlcbiAgICBjb25zdCBldmVudExpc3RlbmVyczogUmVjb3JkPHN0cmluZywgRXZlbnRMaXN0ZW5lcj4gPSB7XG4gICAgICBtb3VzZWRvd246IGhhbmRsZVN0YXJ0IGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICBtb3VzZW1vdmU6IGhhbmRsZU1vdmUgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNldXA6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2VsZWF2ZTogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaHN0YXJ0OiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2htb3ZlOiBoYW5kbGVNb3ZlIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaGVuZDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaGNhbmNlbDogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZCBldmVudCBsaXN0ZW5lcnMgdG8gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHNldHVwRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBPYmplY3QuZW50cmllcyhldmVudExpc3RlbmVycykuZm9yRWFjaCgoW2V2ZW50LCBsaXN0ZW5lcl0pID0+IHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIHtcbiAgICAgICAgICBwYXNzaXZlOiAhcHJldmVudERlZmF1bHQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBldmVudCBsaXN0ZW5lcnMgZnJvbSBlbGVtZW50XG4gICAgICovXG4gICAgY29uc3QgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBPYmplY3QuZW50cmllcyhldmVudExpc3RlbmVycykuZm9yRWFjaCgoW2V2ZW50LCBsaXN0ZW5lcl0pID0+IHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIFNldHVwIGxpc3RlbmVycyBpZiBpbml0aWFsbHkgZW5hYmxlZFxuICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgbGlmZWN5Y2xlIGludGVncmF0aW9uXG4gICAgaWYgKGhhc0xpZmVjeWNsZShjb21wb25lbnQpKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3k7XG5cbiAgICAgIGNvbXBvbmVudC5saWZlY3ljbGUuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgICAgICAgLy8gQ2xlYXIgYW55IHRpbWVyc1xuICAgICAgICBpZiAobG9uZ1ByZXNzVGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGxvbmdQcmVzc1RpbWVyKTtcbiAgICAgICAgICBsb25nUHJlc3NUaW1lciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciBoYW5kbGVyc1xuICAgICAgICBoYW5kbGVycy5jbGVhcigpO1xuXG4gICAgICAgIC8vIENhbGwgb3JpZ2luYWwgZGVzdHJveSBtZXRob2RcbiAgICAgICAgb3JpZ2luYWxEZXN0cm95LmNhbGwoY29tcG9uZW50LmxpZmVjeWNsZSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBlbmhhbmNlZCBjb21wb25lbnRcbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuXG4gICAgICAvKipcbiAgICAgICAqIEFkZCBhIGxvbmcgcHJlc3MgZXZlbnQgaGFuZGxlclxuICAgICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIG9uTG9uZ1ByZXNzKGhhbmRsZXI6IChldmVudDogTG9uZ1ByZXNzRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlIGEgbG9uZyBwcmVzcyBldmVudCBoYW5kbGVyXG4gICAgICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICAgICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgb2ZmTG9uZ1ByZXNzKGhhbmRsZXI6IChldmVudDogTG9uZ1ByZXNzRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRW5hYmxlIGxvbmcgcHJlc3MgcmVjb2duaXRpb25cbiAgICAgICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgZW5hYmxlTG9uZ1ByZXNzKCkge1xuICAgICAgICBpZiAoIWlzRW5hYmxlZCkge1xuICAgICAgICAgIGlzRW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBEaXNhYmxlIGxvbmcgcHJlc3MgcmVjb2duaXRpb25cbiAgICAgICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZUxvbmdQcmVzcygpIHtcbiAgICAgICAgaWYgKGlzRW5hYmxlZCkge1xuICAgICAgICAgIGlzRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgICAgICAgICAvLyBDbGVhciBhbnkgdGltZXJzXG4gICAgICAgICAgaWYgKGxvbmdQcmVzc1RpbWVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGxvbmdQcmVzc1RpbWVyKTtcbiAgICAgICAgICAgIGxvbmdQcmVzc1RpbWVyID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgIH07XG4gIH07XG4iLAogICAgIi8vIHNyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMvcGFuLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzXG4gKiBAZGVzY3JpcHRpb24gQWRkcyBwYW4gZ2VzdHVyZSByZWNvZ25pdGlvbiB0byBjb21wb25lbnRzXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBCYXNlQ29tcG9uZW50LCBFbGVtZW50Q29tcG9uZW50IH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IFBhbkV2ZW50LCBHZXN0dXJlSGFuZGxlciB9IGZyb20gXCIuLi8uLi8uLi9nZXN0dXJlc1wiO1xuaW1wb3J0IHsgaGFzTGlmZWN5Y2xlLCBoYXNFbWl0IH0gZnJvbSBcIm10cmxcIjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBwYW4gZ2VzdHVyZSBmZWF0dXJlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFuR2VzdHVyZUNvbmZpZyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHByZXZlbnQgZGVmYXVsdCBiZWhhdmlvcnMgb24gdG91Y2ggZXZlbnRzXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHByZXZlbnREZWZhdWx0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgcGFuIHN0YXJ0IChmaXJzdCBtb3ZlbWVudClcbiAgICovXG4gIG9uUGFuU3RhcnQ/OiBHZXN0dXJlSGFuZGxlcjtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgcGFuIG1vdmUgKGNvbnRpbnVvdXMgdXBkYXRlcyBkdXJpbmcgcGFuKVxuICAgKi9cbiAgb25QYW4/OiBHZXN0dXJlSGFuZGxlcjtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgcGFuIGVuZCAodG91Y2gvbW91c2UgcmVsZWFzZSlcbiAgICovXG4gIG9uUGFuRW5kPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIHBhbiByZWNvZ25pdGlvbiBpbW1lZGlhdGVseVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBlbmFibGVkPzogYm9vbGVhbjtcblxuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbi8qKlxuICogRXh0ZW5kIHRoZSBQYW5FdmVudCBpbnRlcmZhY2UgdG8gc3VwcG9ydCBvdXIgY3VzdG9tIGV2ZW50IHR5cGVzXG4gKi9cbmludGVyZmFjZSBFeHRlbmRlZFBhbkV2ZW50IGV4dGVuZHMgT21pdDxQYW5FdmVudCwgXCJ0eXBlXCI+IHtcbiAgdHlwZTogXCJwYW5cIiB8IFwicGFuc3RhcnRcIiB8IFwicGFuZW5kXCI7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IHdpdGggcGFuIGdlc3R1cmUgcmVjb2duaXRpb24gY2FwYWJpbGl0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFuR2VzdHVyZUNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvKipcbiAgICogQWRkIGEgaGFuZGxlciBmb3IgcGFuIHN0YXJ0XG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblBhblN0YXJ0OiAoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogQWRkIGEgaGFuZGxlciBmb3IgcGFuIG1vdmUgKGNvbnRpbnVvdXMgdXBkYXRlcylcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uUGFuOiAoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogQWRkIGEgaGFuZGxlciBmb3IgcGFuIGVuZFxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb25QYW5FbmQ6IChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSA9PiBQYW5HZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBwYW4gc3RhcnQgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmUGFuU3RhcnQ6IChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSA9PiBQYW5HZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBwYW4gbW92ZSBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZQYW46IChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSA9PiBQYW5HZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBwYW4gZW5kIGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlBhbkVuZDogKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpID0+IFBhbkdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBwYW4gcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZW5hYmxlUGFuOiAoKSA9PiBQYW5HZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlIHBhbiByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBkaXNhYmxlUGFuOiAoKSA9PiBQYW5HZXN0dXJlQ29tcG9uZW50O1xufVxuXG4vKipcbiAqIEFkZHMgcGFuIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnQuXG4gKiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQgYWx0ZXJuYXRpdmUgdG8gdGhlIGZ1bGwgZ2VzdHVyZSBzeXN0ZW0sXG4gKiBmb2N1c2VkIG9ubHkgb24gcGFuIGRldGVjdGlvbi5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBvYmplY3QgY29udGFpbmluZyBwYW4gc2V0dGluZ3NcbiAqIEByZXR1cm5zIEZ1bmN0aW9uIHRoYXQgZW5oYW5jZXMgYSBjb21wb25lbnQgd2l0aCBwYW4gY2FwYWJpbGl0aWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBBZGQgcGFuIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnRcbiAqIGNvbnN0IGNvbXBvbmVudCA9IHBpcGUoXG4gKiAgIGNyZWF0ZUJhc2UsXG4gKiAgIHdpdGhFbGVtZW50KC4uLiksXG4gKiAgIHdpdGhQYW5HZXN0dXJlKHtcbiAqICAgICBvblBhblN0YXJ0OiAoZSkgPT4gc3RhcnREcmFnKGUpLFxuICogICAgIG9uUGFuOiAoZSkgPT4gdXBkYXRlRHJhZ1Bvc2l0aW9uKGUpLFxuICogICAgIG9uUGFuRW5kOiAoZSkgPT4gZW5kRHJhZyhlKVxuICogICB9KVxuICogKShjb25maWcpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoUGFuR2VzdHVyZSA9XG4gIChjb25maWc6IFBhbkdlc3R1cmVDb25maWcgPSB7fSkgPT5cbiAgPEMgZXh0ZW5kcyBFbGVtZW50Q29tcG9uZW50Pihjb21wb25lbnQ6IEMpOiBDICYgUGFuR2VzdHVyZUNvbXBvbmVudCA9PiB7XG4gICAgaWYgKCFjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgY29uc29sZS53YXJuKFwiQ2Fubm90IGFkZCBwYW4gZ2VzdHVyZSByZWNvZ25pdGlvbjogbWlzc2luZyBlbGVtZW50XCIpO1xuICAgICAgcmV0dXJuIGNvbXBvbmVudCBhcyBDICYgUGFuR2VzdHVyZUNvbXBvbmVudDtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCB7XG4gICAgICBwcmV2ZW50RGVmYXVsdCA9IHRydWUsXG4gICAgICBvblBhblN0YXJ0LFxuICAgICAgb25QYW4sXG4gICAgICBvblBhbkVuZCxcbiAgICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBFdmVudCBoYW5kbGVycyBzdG9yYWdlIGJ5IHBhbiBwaGFzZVxuICAgIGNvbnN0IGhhbmRsZXJzID0ge1xuICAgICAgcGFuc3RhcnQ6IG5ldyBTZXQ8KGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZD4oKSxcbiAgICAgIHBhbjogbmV3IFNldDwoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkPigpLFxuICAgICAgcGFuZW5kOiBuZXcgU2V0PChldmVudDogUGFuRXZlbnQpID0+IHZvaWQ+KCksXG4gICAgfTtcblxuICAgIC8vIEFkZCBpbml0aWFsIGhhbmRsZXJzIGlmIHByb3ZpZGVkXG4gICAgaWYgKG9uUGFuU3RhcnQpXG4gICAgICBoYW5kbGVycy5wYW5zdGFydC5hZGQob25QYW5TdGFydCBhcyAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKTtcbiAgICBpZiAob25QYW4pIGhhbmRsZXJzLnBhbi5hZGQob25QYW4gYXMgKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCk7XG4gICAgaWYgKG9uUGFuRW5kKSBoYW5kbGVycy5wYW5lbmQuYWRkKG9uUGFuRW5kIGFzIChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpO1xuXG4gICAgLy8gR2VzdHVyZSBzdGF0ZSBmb3IgdHJhY2tpbmdcbiAgICBsZXQgc3RhcnRYID0gMDtcbiAgICBsZXQgc3RhcnRZID0gMDtcbiAgICBsZXQgbGFzdFggPSAwO1xuICAgIGxldCBsYXN0WSA9IDA7XG4gICAgbGV0IGN1cnJlbnRYID0gMDtcbiAgICBsZXQgY3VycmVudFkgPSAwO1xuICAgIGxldCBhY3RpdmUgPSBmYWxzZTtcbiAgICBsZXQgaXNQYW5uaW5nID0gZmFsc2U7XG4gICAgbGV0IHN0YXJ0VGltZSA9IDA7XG4gICAgbGV0IGlzRW5hYmxlZCA9IGVuYWJsZWQ7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBwYW4gZXZlbnQgd2l0aCB0aGUgY3VycmVudCBzdGF0ZVxuICAgICAqL1xuICAgIGNvbnN0IGNyZWF0ZVBhbkV2ZW50ID0gKFxuICAgICAgZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQsXG4gICAgICB0eXBlOiBcInBhbnN0YXJ0XCIgfCBcInBhblwiIHwgXCJwYW5lbmRcIlxuICAgICk6IEV4dGVuZGVkUGFuRXZlbnQgPT4ge1xuICAgICAgY29uc3QgZXZlbnQ6IEV4dGVuZGVkUGFuRXZlbnQgPSB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHRhcmdldDogZS50YXJnZXQhLFxuICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgIGVuZFRpbWU6IERhdGUubm93KCksXG4gICAgICAgIGR1cmF0aW9uOiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lLFxuICAgICAgICBkZWZhdWx0UHJldmVudGVkOiBmYWxzZSxcbiAgICAgICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgICBldmVudC5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzdG9wUHJvcGFnYXRpb246ICgpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9LFxuICAgICAgICBkZWx0YVg6IGN1cnJlbnRYIC0gc3RhcnRYLFxuICAgICAgICBkZWx0YVk6IGN1cnJlbnRZIC0gc3RhcnRZLFxuICAgICAgICBzdGFydFgsXG4gICAgICAgIHN0YXJ0WSxcbiAgICAgICAgY3VycmVudFgsXG4gICAgICAgIGN1cnJlbnRZLFxuICAgICAgfTtcbiAgICAgIHJldHVybiBldmVudDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2ggYSBwYW4gZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgaGFuZGxlcnNcbiAgICAgKi9cbiAgICBjb25zdCBkaXNwYXRjaFBhbiA9IChcbiAgICAgIGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50LFxuICAgICAgdHlwZTogXCJwYW5zdGFydFwiIHwgXCJwYW5cIiB8IFwicGFuZW5kXCJcbiAgICApOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGV4dGVuZGVkUGFuRXZlbnQgPSBjcmVhdGVQYW5FdmVudChlLCB0eXBlKTtcblxuICAgICAgLy8gQ2FsbCBlYWNoIGhhbmRsZXIgZm9yIHRoaXMgcGhhc2VcbiAgICAgIGhhbmRsZXJzW3R5cGVdLmZvckVhY2goKGhhbmRsZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUeXBlIGFzc2VydGlvbiBmb3IgdGhlIGhhbmRsZXIgY2FsbCAtIHdlJ3JlIGRlbGliZXJhdGVseSBwYXNzaW5nIG91ciBleHRlbmRlZCBldmVudFxuICAgICAgICAgIGhhbmRsZXIoZXh0ZW5kZWRQYW5FdmVudCBhcyB1bmtub3duIGFzIFBhbkV2ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBpbiAke3R5cGV9IGhhbmRsZXI6YCwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gRm9yd2FyZCB0byBjb21wb25lbnQncyBldmVudCBzeXN0ZW0gaWYgYXZhaWxhYmxlXG4gICAgICBpZiAoaGFzRW1pdChjb21wb25lbnQpKSB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0KHR5cGUsIGV4dGVuZGVkUGFuRXZlbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBwcmV2ZW50RGVmYXVsdCBpZiBjb25maWd1cmVkXG4gICAgICBpZiAocHJldmVudERlZmF1bHQgJiYgIWV4dGVuZGVkUGFuRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICBleHRlbmRlZFBhbkV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBzdGFydFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZVN0YXJ0ID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0b3VjaCA9IFwidG91Y2hlc1wiIGluIGUgPyBlLnRvdWNoZXNbMF0gOiBlO1xuXG4gICAgICBzdGFydFggPSBsYXN0WCA9IGN1cnJlbnRYID0gdG91Y2guY2xpZW50WDtcbiAgICAgIHN0YXJ0WSA9IGxhc3RZID0gY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuICAgICAgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGFjdGl2ZSA9IHRydWU7XG4gICAgICBpc1Bhbm5pbmcgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIG1vdmVcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVNb3ZlID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWFjdGl2ZSB8fCAhaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRvdWNoID0gXCJ0b3VjaGVzXCIgaW4gZSA/IGUudG91Y2hlc1swXSA6IGU7XG5cbiAgICAgIC8vIFVwZGF0ZSBwb3NpdGlvblxuICAgICAgbGFzdFggPSBjdXJyZW50WDtcbiAgICAgIGxhc3RZID0gY3VycmVudFk7XG4gICAgICBjdXJyZW50WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgICBjdXJyZW50WSA9IHRvdWNoLmNsaWVudFk7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBtb3ZlbWVudCBkZWx0YVxuICAgICAgY29uc3QgbW92ZURlbHRhWCA9IGN1cnJlbnRYIC0gbGFzdFg7XG4gICAgICBjb25zdCBtb3ZlRGVsdGFZID0gY3VycmVudFkgLSBsYXN0WTtcbiAgICAgIGNvbnN0IG1vdmVEZWx0YSA9IE1hdGguc3FydChcbiAgICAgICAgbW92ZURlbHRhWCAqIG1vdmVEZWx0YVggKyBtb3ZlRGVsdGFZICogbW92ZURlbHRhWVxuICAgICAgKTtcblxuICAgICAgLy8gRGV0ZWN0IHNpZ25pZmljYW50IG1vdmVtZW50XG4gICAgICBpZiAobW92ZURlbHRhID4gMCkge1xuICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBzaWduaWZpY2FudCBtb3ZlbWVudCwgdHJpZ2dlciBwYW5zdGFydFxuICAgICAgICBpZiAoIWlzUGFubmluZykge1xuICAgICAgICAgIGlzUGFubmluZyA9IHRydWU7XG4gICAgICAgICAgZGlzcGF0Y2hQYW4oZSwgXCJwYW5zdGFydFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZW4gdHJpZ2dlciB0aGUgY29udGludW91cyBwYW4gZXZlbnRcbiAgICAgICAgZGlzcGF0Y2hQYW4oZSwgXCJwYW5cIik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBlbmRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVFbmQgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghYWN0aXZlIHx8ICFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgLy8gSWYgd2Ugd2VyZSBwYW5uaW5nLCB0cmlnZ2VyIHRoZSBwYW5lbmQgZXZlbnRcbiAgICAgIGlmIChpc1Bhbm5pbmcpIHtcbiAgICAgICAgZGlzcGF0Y2hQYW4oZSwgXCJwYW5lbmRcIik7XG4gICAgICB9XG5cbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgICAgaXNQYW5uaW5nID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBjYW5jZWxcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVDYW5jZWwgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghYWN0aXZlIHx8ICFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgLy8gSWYgd2Ugd2VyZSBwYW5uaW5nLCB0cmlnZ2VyIHRoZSBwYW5lbmQgZXZlbnRcbiAgICAgIGlmIChpc1Bhbm5pbmcpIHtcbiAgICAgICAgZGlzcGF0Y2hQYW4oZSwgXCJwYW5lbmRcIik7XG4gICAgICB9XG5cbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgICAgaXNQYW5uaW5nID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8vIEV2ZW50IGxpc3RlbmVycyBkaWN0aW9uYXJ5XG4gICAgY29uc3QgZXZlbnRMaXN0ZW5lcnM6IFJlY29yZDxzdHJpbmcsIEV2ZW50TGlzdGVuZXI+ID0ge1xuICAgICAgbW91c2Vkb3duOiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2Vtb3ZlOiBoYW5kbGVNb3ZlIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICBtb3VzZXVwOiBoYW5kbGVFbmQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNlbGVhdmU6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hzdGFydDogaGFuZGxlU3RhcnQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNobW92ZTogaGFuZGxlTW92ZSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hlbmQ6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hjYW5jZWw6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGQgZXZlbnQgbGlzdGVuZXJzIHRvIGVsZW1lbnRcbiAgICAgKi9cbiAgICBjb25zdCBzZXR1cEV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCB7XG4gICAgICAgICAgcGFzc2l2ZTogIXByZXZlbnREZWZhdWx0LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGZyb20gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBTZXR1cCBsaXN0ZW5lcnMgaWYgaW5pdGlhbGx5IGVuYWJsZWRcbiAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGxpZmVjeWNsZSBpbnRlZ3JhdGlvblxuICAgIGlmIChoYXNMaWZlY3ljbGUoY29tcG9uZW50KSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95O1xuXG4gICAgICBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuXG4gICAgICAgIC8vIENsZWFyIGhhbmRsZXJzXG4gICAgICAgIE9iamVjdC52YWx1ZXMoaGFuZGxlcnMpLmZvckVhY2goKGhhbmRsZXJTZXQpID0+IGhhbmRsZXJTZXQuY2xlYXIoKSk7XG5cbiAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBkZXN0cm95IG1ldGhvZFxuICAgICAgICBvcmlnaW5hbERlc3Ryb3kuY2FsbChjb21wb25lbnQubGlmZWN5Y2xlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG5cbiAgICAgIC8vIEFkZCBoYW5kbGVyIG1ldGhvZHNcbiAgICAgIG9uUGFuU3RhcnQoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5wYW5zdGFydC5hZGQoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb25QYW4oaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5wYW4uYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9uUGFuRW5kKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMucGFuZW5kLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvLyBSZW1vdmUgaGFuZGxlciBtZXRob2RzXG4gICAgICBvZmZQYW5TdGFydChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnBhbnN0YXJ0LmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvZmZQYW4oaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5wYW4uZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9mZlBhbkVuZChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnBhbmVuZC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLy8gRW5hYmxlL2Rpc2FibGUgbWV0aG9kc1xuICAgICAgZW5hYmxlUGFuKCkge1xuICAgICAgICBpZiAoIWlzRW5hYmxlZCkge1xuICAgICAgICAgIGlzRW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgZGlzYWJsZVBhbigpIHtcbiAgICAgICAgaWYgKGlzRW5hYmxlZCkge1xuICAgICAgICAgIGlzRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgIH07XG4gIH07XG4iLAogICAgIi8qKlxuICogQG1vZHVsZSBjb3JlL2xheW91dC9zY2hlbWFcbiAqIEBkZXNjcmlwdGlvbiBVbmlmaWVkIGxheW91dCBzY2hlbWEgcHJvY2Vzc29yIHdpdGggaW50ZWdyYXRlZCBvcHRpbWl6YXRpb25zXG4gKiBDb25zb2xpZGF0ZXMgYXJyYXksIG9iamVjdCwgSlNYLCBhbmQgdGVtcGxhdGUgcHJvY2Vzc2luZyB3aXRoIGJ1aWx0LWluIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50c1xuICovXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRZUEVTIChFc3NlbnRpYWwgb25seSlcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBMYXlvdXRDb25maWcge1xuICAvKiogQmFzZSBsYXlvdXQgdHlwZSAqL1xuICB0eXBlPzogXCJzdGFja1wiIHwgXCJyb3dcIiB8IFwiZ3JpZFwiIHwgc3RyaW5nO1xuICAvKiogU3BhY2luZyBiZXR3ZWVuIGVsZW1lbnRzICovXG4gIGdhcD86IG51bWJlciB8IHN0cmluZztcbiAgLyoqIEFkZGl0aW9uYWwgQ1NTIGNsYXNzZXMgKi9cbiAgY2xhc3M/OiBzdHJpbmc7XG4gIC8qKiBBbGlnbm1lbnQgb2YgaXRlbXMgYWxvbmcgdGhlIGNyb3NzIGF4aXMgKi9cbiAgYWxpZ24/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiB8IFwic3RyZXRjaFwiO1xuICAvKiogQWxpZ25tZW50IG9mIGl0ZW1zIGFsb25nIHRoZSBtYWluIGF4aXMgKi9cbiAganVzdGlmeT86IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiIHwgXCJiZXR3ZWVuXCIgfCBcImFyb3VuZFwiIHwgXCJldmVubHlcIjtcbiAgLyoqIFdoZXRoZXIgYW5kIGhvdyBpdGVtcyBzaG91bGQgd3JhcCAqL1xuICB3cmFwPzogYm9vbGVhbiB8IFwicmV2ZXJzZVwiIHwgXCJub3dyYXBcIjtcbiAgLyoqIFdoZXRoZXIgcm93IGl0ZW1zIHNob3VsZCBzdGFjayB2ZXJ0aWNhbGx5IG9uIG1vYmlsZSAqL1xuICBtb2JpbGVTdGFjaz86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHJvdyBpdGVtcyBzaG91bGQgc2Nyb2xsIGhvcml6b250YWxseSBvbiBtb2JpbGUgKi9cbiAgbW9iaWxlU2Nyb2xsPzogYm9vbGVhbjtcbiAgLyoqIE51bWJlciBvZiBjb2x1bW5zIG9yIGF1dG9tYXRpYyBzaXppbmcgbWV0aG9kICovXG4gIGNvbHVtbnM/OiBudW1iZXIgfCBcImF1dG8tZml0XCIgfCBcImF1dG8tZmlsbFwiO1xuICAvKiogV2hldGhlciB0byB1c2UgZGVuc2UgcGFja2luZyBhbGdvcml0aG0gZm9yIGdyaWQgKi9cbiAgZGVuc2U/OiBib29sZWFuO1xuICAvKiogV2hldGhlciBncmlkIGl0ZW1zIHNob3VsZCBhZGp1c3QgaGVpZ2h0IGF1dG9tYXRpY2FsbHkgKi9cbiAgYXV0b0hlaWdodD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0SXRlbUNvbmZpZyB7XG4gIC8qKiBDb2x1bW4gd2lkdGggaW4gYSAxMi1jb2x1bW4gZ3JpZCAqL1xuICB3aWR0aD86IG51bWJlcjtcbiAgLyoqIFdpZHRoIG9uIHNtYWxsIHNjcmVlbnMgKi9cbiAgc20/OiBudW1iZXI7XG4gIC8qKiBXaWR0aCBvbiBtZWRpdW0gc2NyZWVucyAqL1xuICBtZD86IG51bWJlcjtcbiAgLyoqIFdpZHRoIG9uIGxhcmdlIHNjcmVlbnMgKi9cbiAgbGc/OiBudW1iZXI7XG4gIC8qKiBXaWR0aCBvbiBleHRyYS1sYXJnZSBzY3JlZW5zICovXG4gIHhsPzogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIGdyaWQgY29sdW1ucyB0byBzcGFuICovXG4gIHNwYW4/OiBudW1iZXI7XG4gIC8qKiBOdW1iZXIgb2YgZ3JpZCByb3dzIHRvIHNwYW4gKi9cbiAgcm93U3Bhbj86IG51bWJlcjtcbiAgLyoqIERpc3BsYXkgb3JkZXIgKi9cbiAgb3JkZXI/OiBudW1iZXIgfCBcImZpcnN0XCIgfCBcImxhc3RcIjtcbiAgLyoqIFNlbGYtYWxpZ25tZW50IHdpdGhpbiBjb250YWluZXIgKi9cbiAgYWxpZ24/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiB8IFwic3RyZXRjaFwiO1xuICAvKiogV2hldGhlciBpdGVtIHNob3VsZCBhdXRvbWF0aWNhbGx5IHNpemUgKi9cbiAgYXV0bz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0T3B0aW9ucyB7XG4gIC8qKiBEZWZhdWx0IGNyZWF0b3IgZnVuY3Rpb24gdG8gdXNlIGlmIG5vdCBzcGVjaWZpZWQgaW4gc2NoZW1hICovXG4gIGNyZWF0b3I/OiBGdW5jdGlvbjtcbiAgLyoqIFdoZXRoZXIgdG8gYXBwbHkgQ1NTIGNsYXNzIHByZWZpeCBAZGVmYXVsdCB0cnVlICovXG4gIHByZWZpeD86IGJvb2xlYW47XG4gIC8qKiBBZGRpdGlvbmFsIG9wdGlvbnMgKi9cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExheW91dFJlc3VsdCB7XG4gIC8qKiBUaGUgcmF3IGxheW91dCBvYmplY3Qgd2l0aCBhbGwgY29tcG9uZW50cyAqL1xuICBsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIC8qKiBSZWZlcmVuY2UgdG8gdGhlIHJvb3QgZWxlbWVudCBmb3IgY29udmVuaWVuY2UgKi9cbiAgZWxlbWVudDogSFRNTEVsZW1lbnQgfCBhbnk7XG4gIC8qKiBGbGF0dGVuZWQgY29tcG9uZW50IG1hcCAqL1xuICBjb21wb25lbnQ6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIC8qKiBHZXRzIGEgY29tcG9uZW50IGJ5IG5hbWUgKi9cbiAgZ2V0KG5hbWU6IHN0cmluZyk6IGFueTtcbiAgLyoqIEdldHMgYWxsIGNvbXBvbmVudHMgaW4gYSBmbGF0dGVuZWQgbWFwICovXG4gIGdldEFsbCgpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAvKiogRGVzdHJveXMgdGhlIGxheW91dCwgY2xlYW5pbmcgdXAgYWxsIGNvbXBvbmVudHMgKi9cbiAgZGVzdHJveSgpOiB2b2lkO1xufVxuXG50eXBlIENvbXBvbmVudExpa2UgPSB7IGVsZW1lbnQ6IEhUTUxFbGVtZW50OyBba2V5OiBzdHJpbmddOiBhbnkgfTtcbnR5cGUgU2NoZW1hSXRlbSA9IEZ1bmN0aW9uIHwgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55PiB8IFNjaGVtYUl0ZW1bXTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQlVJTFQtSU4gT1BUSU1JWkFUSU9OU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEZyYWdtZW50IFBvb2wgZm9yIGVmZmljaWVudCBEb2N1bWVudEZyYWdtZW50IHJldXNlXG4gKiBSZWR1Y2VzIEdDIHByZXNzdXJlIGluIGhpZ2gtZnJlcXVlbmN5IGxheW91dCBjcmVhdGlvbiBzY2VuYXJpb3NcbiAqL1xuY2xhc3MgRnJhZ21lbnRQb29sIHtcbiAgcHJpdmF0ZSBwb29sOiBEb2N1bWVudEZyYWdtZW50W10gPSBbXTtcbiAgcHJpdmF0ZSBtYXhTaXplID0gODsgLy8gT3B0aW1pemVkIHNpemUgZm9yIG1lbW9yeSBlZmZpY2llbmN5XG5cbiAgZ2V0KCk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIHJldHVybiB0aGlzLnBvb2wucG9wKCkgfHwgZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICB9XG5cbiAgcmVsZWFzZShmcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBvb2wubGVuZ3RoIDwgdGhpcy5tYXhTaXplICYmIGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnBvb2wucHVzaChmcmFnbWVudCk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5wb29sLmxlbmd0aCA9IDA7XG4gIH1cbn1cblxuY29uc3QgZnJhZ21lbnRQb29sID0gbmV3IEZyYWdtZW50UG9vbCgpO1xuXG4vKipcbiAqIENsYXNzIG5hbWUgY2FjaGUgZm9yIGxheW91dCBjb25maWd1cmF0aW9uc1xuICogUmVkdWNlcyBzdHJpbmcgb3BlcmF0aW9ucyBieSBjYWNoaW5nIGdlbmVyYXRlZCBjbGFzcyBuYW1lc1xuICovXG5jb25zdCBjbGFzc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuLy8gQ29uZmlndXJhdGlvbiBjb25zdGFudHNcbmNvbnN0IFBSRUZJWCA9IFwibXRybFwiOyAvLyBUT0RPOiBNYWtlIHRoaXMgY29uZmlndXJhYmxlXG5jb25zdCBQUkVGSVhfV0lUSF9EQVNIID0gYCR7UFJFRklYfS1gO1xuXG4vKipcbiAqIEdldHMgYSBjYWNoZWQgY2xhc3MgbmFtZSBmb3IgbGF5b3V0IGNvbmZpZ3VyYXRpb25cbiAqIE9wdGltaXplZCBmb3IgZGlmZmVyZW50IGNsYXNzIG5hbWluZyBwYXR0ZXJuc1xuICovXG5mdW5jdGlvbiBnZXRDYWNoZWRDbGFzc05hbWUoXG4gIHR5cGU6IHN0cmluZyxcbiAgcHJvcGVydHk6IHN0cmluZyxcbiAgdmFsdWU6IHN0cmluZyB8IG51bWJlcixcbik6IHN0cmluZyB7XG4gIGNvbnN0IGtleSA9IGAke3R5cGV9LSR7cHJvcGVydHl9LSR7dmFsdWV9YDtcbiAgaWYgKCFjbGFzc0NhY2hlLmhhcyhrZXkpKSB7XG4gICAgaWYgKHR5cGUgPT09IFwiaXRlbVwiKSB7XG4gICAgICBjbGFzc0NhY2hlLnNldChcbiAgICAgICAga2V5LFxuICAgICAgICBwcm9wZXJ0eSA9PT0gXCJcIlxuICAgICAgICAgID8gYGxheW91dF9faXRlbS0tJHt2YWx1ZX1gXG4gICAgICAgICAgOiBgbGF5b3V0X19pdGVtLS0ke3Byb3BlcnR5fS0ke3ZhbHVlfWAsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGb3IgbGF5b3V0IGNsYXNzZXMsIGFsaWduIHVzZXMgbGF5b3V0LS17dHlwZX0te3ZhbHVlfVxuICAgICAgLy8gYnV0IGp1c3RpZnkgYW5kIG90aGVycyB1c2UgbGF5b3V0LS17dHlwZX0te3Byb3BlcnR5fS17dmFsdWV9XG4gICAgICBpZiAocHJvcGVydHkgPT09IFwiYWxpZ25cIikge1xuICAgICAgICBjbGFzc0NhY2hlLnNldChrZXksIGBsYXlvdXQtLSR7dHlwZX0tJHt2YWx1ZX1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsYXNzQ2FjaGUuc2V0KGtleSwgYGxheW91dC0tJHt0eXBlfS0ke3Byb3BlcnR5fS0ke3ZhbHVlfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY2xhc3NDYWNoZS5nZXQoa2V5KSE7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE9QVElNSVpFRCBVVElMSVRJRVNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBhIGNvbXBvbmVudCBvYmplY3QgKGhhcyBhbiBlbGVtZW50IHByb3BlcnR5KVxuICovXG5mdW5jdGlvbiBpc0NvbXBvbmVudCh2YWx1ZTogYW55KTogdmFsdWUgaXMgQ29tcG9uZW50TGlrZSB7XG4gIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgXCJlbGVtZW50XCIgaW4gdmFsdWU7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRvY3VtZW50IGZyYWdtZW50IHVzaW5nIHBvb2xpbmcgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICovXG5mdW5jdGlvbiBjcmVhdGVGcmFnbWVudCgpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgcmV0dXJuIGZyYWdtZW50UG9vbC5nZXQoKTtcbn1cblxuLyoqXG4gKiBSZWxlYXNlcyBhIGZyYWdtZW50IGJhY2sgdG8gdGhlIHBvb2wgZm9yIHJldXNlXG4gKi9cbmZ1bmN0aW9uIHJlbGVhc2VGcmFnbWVudChmcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCk6IHZvaWQge1xuICBmcmFnbWVudFBvb2wucmVsZWFzZShmcmFnbWVudCk7XG59XG5cbi8qKlxuICogT3B0aW1pemVkIGNsYXNzIHByb2Nlc3Npbmcgd2l0aCBtaW5pbWFsIHN0cmluZyBvcGVyYXRpb25zXG4gKiBIYW5kbGVzIGFycmF5cywgc3RyaW5ncywgY2xhc3NOYW1lIGFsaWFzZXMsIGFuZCByYXdDbGFzcyBlZmZpY2llbnRseVxuICovXG5mdW5jdGlvbiBwcm9jZXNzQ2xhc3NOYW1lcyhcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PixcbiAgc2tpcFByZWZpeCA9IGZhbHNlLFxuKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIGlmICghb3B0aW9ucykgcmV0dXJuIG9wdGlvbnM7XG5cbiAgY29uc3QgaGFzUmF3Q2xhc3MgPSBvcHRpb25zLnJhd0NsYXNzO1xuICBjb25zdCBoYXNSZWd1bGFyQ2xhc3MgPSBvcHRpb25zLmNsYXNzIHx8IG9wdGlvbnMuY2xhc3NOYW1lO1xuXG4gIC8vIEZhc3QgcGF0aDogbm8gY2xhc3MgcHJvcGVydGllcyBhdCBhbGxcbiAgaWYgKCFoYXNSYXdDbGFzcyAmJiAhaGFzUmVndWxhckNsYXNzKSByZXR1cm4gb3B0aW9ucztcblxuICAvLyBGYXN0IHBhdGg6IG9ubHkgcmF3Q2xhc3MgYW5kIHNraXBwaW5nIHByZWZpeCAobW9zdCBjb21tb24gcmF3Q2xhc3Mgc2NlbmFyaW8pXG4gIGlmIChoYXNSYXdDbGFzcyAmJiAhaGFzUmVndWxhckNsYXNzICYmIHNraXBQcmVmaXgpIHtcbiAgICBjb25zdCBwcm9jZXNzZWQgPSB7IC4uLm9wdGlvbnMgfTtcbiAgICBkZWxldGUgcHJvY2Vzc2VkLnJhd0NsYXNzO1xuXG4gICAgLy8gRGlyZWN0IGFzc2lnbm1lbnQgZm9yIHNpbXBsZSBzdHJpbmdcbiAgICBpZiAodHlwZW9mIGhhc1Jhd0NsYXNzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBwcm9jZXNzZWQuY2xhc3MgPSBoYXNSYXdDbGFzcztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSGFuZGxlIGFycmF5IGNhc2VcbiAgICAgIHByb2Nlc3NlZC5jbGFzcyA9IGhhc1Jhd0NsYXNzLmpvaW4oXCIgXCIpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvY2Vzc2VkO1xuICB9XG5cbiAgLy8gRnVsbCBwcm9jZXNzaW5nIHBhdGggKG9ubHkgd2hlbiBuZWVkZWQpXG4gIGNvbnN0IHByb2Nlc3NlZCA9IHsgLi4ub3B0aW9ucyB9O1xuICBsZXQgZmluYWxDbGFzc2VzID0gXCJcIjtcblxuICAvLyBIYW5kbGUgcHJlZml4ZWQgY2xhc3NlcyBvbmx5IGlmIG5vdCBza2lwcGluZyBwcmVmaXhcbiAgaWYgKCFza2lwUHJlZml4ICYmIGhhc1JlZ3VsYXJDbGFzcykge1xuICAgIGxldCBwcmVmaXhlZFN0cmluZyA9IFwiXCI7XG5cbiAgICBpZiAocHJvY2Vzc2VkLmNsYXNzKSB7XG4gICAgICBwcmVmaXhlZFN0cmluZyArPSBBcnJheS5pc0FycmF5KHByb2Nlc3NlZC5jbGFzcylcbiAgICAgICAgPyBwcm9jZXNzZWQuY2xhc3Muam9pbihcIiBcIilcbiAgICAgICAgOiBwcm9jZXNzZWQuY2xhc3M7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzZWQuY2xhc3NOYW1lKSB7XG4gICAgICBwcmVmaXhlZFN0cmluZyArPSAocHJlZml4ZWRTdHJpbmcgPyBcIiBcIiA6IFwiXCIpICsgcHJvY2Vzc2VkLmNsYXNzTmFtZTtcbiAgICB9XG5cbiAgICBpZiAocHJlZml4ZWRTdHJpbmcpIHtcbiAgICAgIGZpbmFsQ2xhc3NlcyA9IHByZWZpeGVkU3RyaW5nXG4gICAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLm1hcCgoY2xzKSA9PlxuICAgICAgICAgIGNscy5zdGFydHNXaXRoKFBSRUZJWF9XSVRIX0RBU0gpID8gY2xzIDogUFJFRklYX1dJVEhfREFTSCArIGNscyxcbiAgICAgICAgKVxuICAgICAgICAuam9pbihcIiBcIik7XG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIHJhd0NsYXNzIChhbHdheXMgcHJvY2Vzc2VkIHdoZW4gcHJlc2VudClcbiAgaWYgKGhhc1Jhd0NsYXNzKSB7XG4gICAgY29uc3QgcmF3U3RyaW5nID0gQXJyYXkuaXNBcnJheShoYXNSYXdDbGFzcylcbiAgICAgID8gaGFzUmF3Q2xhc3MuZmlsdGVyKEJvb2xlYW4pLmpvaW4oXCIgXCIpXG4gICAgICA6IGhhc1Jhd0NsYXNzO1xuXG4gICAgZmluYWxDbGFzc2VzICs9IChmaW5hbENsYXNzZXMgPyBcIiBcIiA6IFwiXCIpICsgcmF3U3RyaW5nO1xuICB9XG5cbiAgaWYgKGZpbmFsQ2xhc3Nlcykge1xuICAgIHByb2Nlc3NlZC5jbGFzcyA9IGZpbmFsQ2xhc3NlcztcbiAgfVxuXG4gIC8vIENsZWFuIHVwIGluIG9uZSBvcGVyYXRpb25cbiAgZGVsZXRlIHByb2Nlc3NlZC5jbGFzc05hbWU7XG4gIGRlbGV0ZSBwcm9jZXNzZWQucmF3Q2xhc3M7XG5cbiAgcmV0dXJuIHByb2Nlc3NlZDtcbn1cblxuLyoqXG4gKiBPcHRpbWl6ZWQgcGFyYW1ldGVyIGV4dHJhY3Rpb24gZm9yIGFycmF5IHNjaGVtYXNcbiAqIFJlZHVjZXMgbXVsdGlwbGUgYXJyYXkgbG9va3VwcyB3aXRoIGJhdGNoIHByb2Nlc3NpbmdcbiAqL1xuaW50ZXJmYWNlIEV4dHJhY3RlZFBhcmFtZXRlcnMge1xuICBjcmVhdG9yOiBGdW5jdGlvbjtcbiAgbmFtZT86IHN0cmluZztcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgY29uc3VtZWQ6IG51bWJlcjtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFBhcmFtZXRlcnMoXG4gIHNjaGVtYTogU2NoZW1hSXRlbVtdLFxuICBzdGFydEluZGV4OiBudW1iZXIsXG4gIGRlZmF1bHRDcmVhdG9yOiBGdW5jdGlvbixcbik6IEV4dHJhY3RlZFBhcmFtZXRlcnMge1xuICBjb25zdCBpdGVtcyA9IHNjaGVtYS5zbGljZShzdGFydEluZGV4LCBzdGFydEluZGV4ICsgMyk7XG4gIGxldCBjcmVhdG9yLCBuYW1lLCBvcHRpb25zO1xuICBsZXQgY29uc3VtZWQgPSAxO1xuXG4gIGNvbnN0IFtmaXJzdCwgc2Vjb25kLCB0aGlyZF0gPSBpdGVtcztcblxuICBpZiAodHlwZW9mIGZpcnN0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjcmVhdG9yID0gZmlyc3Q7XG4gICAgaWYgKHR5cGVvZiBzZWNvbmQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG5hbWUgPSBzZWNvbmQ7XG4gICAgICBjb25zdW1lZCA9IDI7XG4gICAgICBpZiAoaXNPYmplY3QodGhpcmQpKSB7XG4gICAgICAgIG9wdGlvbnMgPSB0aGlyZDtcbiAgICAgICAgY29uc3VtZWQgPSAzO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNPYmplY3Qoc2Vjb25kKSkge1xuICAgICAgb3B0aW9ucyA9IHNlY29uZDtcbiAgICAgIGNvbnN1bWVkID0gMjtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIGZpcnN0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgY3JlYXRvciA9IGRlZmF1bHRDcmVhdG9yO1xuICAgIG5hbWUgPSBmaXJzdDtcbiAgICBpZiAoaXNPYmplY3Qoc2Vjb25kKSkge1xuICAgICAgb3B0aW9ucyA9IHNlY29uZDtcbiAgICAgIGNvbnN1bWVkID0gMjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QoZmlyc3QpKSB7XG4gICAgY3JlYXRvciA9IGRlZmF1bHRDcmVhdG9yO1xuICAgIG9wdGlvbnMgPSBmaXJzdDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY3JlYXRvcjogY3JlYXRvciB8fCBkZWZhdWx0Q3JlYXRvcixcbiAgICBuYW1lLFxuICAgIG9wdGlvbnM6IChvcHRpb25zIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNvbnN1bWVkLFxuICB9O1xufVxuXG4vKipcbiAqIFNpbXBsZSBvYmplY3QgdHlwZSBjaGVja1xuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBET00gVVRJTElUSUVTIChTaW1wbGlmaWVkKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFNpbXBsZSBET00gZWxlbWVudCBjcmVhdGlvblxuICovXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSk6IEhUTUxFbGVtZW50IHtcbiAgY29uc3QgdGFnID0gb3B0aW9ucy50YWcgfHwgXCJkaXZcIjtcbiAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcblxuICBpZiAob3B0aW9ucy5jbGFzcykge1xuICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gb3B0aW9ucy5jbGFzcztcbiAgfVxuXG4gIGlmIChvcHRpb25zLnN0eWxlKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnN0eWxlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcInN0eWxlXCIsIG9wdGlvbnMuc3R5bGUpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMuc3R5bGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgb3B0aW9ucy5zdHlsZSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdGlvbnMudGV4dENvbnRlbnQpIHtcbiAgICBlbGVtZW50LnRleHRDb250ZW50ID0gb3B0aW9ucy50ZXh0Q29udGVudDtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnRleHQpIHtcbiAgICBlbGVtZW50LnRleHRDb250ZW50ID0gb3B0aW9ucy50ZXh0O1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5cbi8qKlxuICogQWRkcyBhIENTUyBjbGFzcyB0byBhbiBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGFkZENsYXNzKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjbGFzc05hbWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZWxlbWVudCAmJiBjbGFzc05hbWUpIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBlbGVtZW50IGhhcyBhIENTUyBjbGFzc1xuICovXG5mdW5jdGlvbiBoYXNDbGFzcyhlbGVtZW50OiBIVE1MRWxlbWVudCwgY2xhc3NOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGVsZW1lbnQgJiYgZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVU5JRklFRCBDT01QT05FTlQgQ1JFQVRJT04gKHdpdGggZGVzdHJ1Y3R1cmluZyBvcHRpbWl6YXRpb24pXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbXBvbmVudCBpbnN0YW5jZSB3aXRoIG9wdGltaXplZCBvcHRpb24gcHJvY2Vzc2luZ1xuICogVXNlcyBkZXN0cnVjdHVyaW5nIGZvciBjbGVhbmVyIHNlcGFyYXRpb24gb2YgY29uY2VybnNcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoXG4gIENvbXBvbmVudDogYW55LFxuICBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4pOiBhbnkge1xuICB0cnkge1xuICAgIC8vIERlc3RydWN0dXJlIHNwZWNpYWwgY29uZmlncyBpbiBvbmUgb3BlcmF0aW9uXG4gICAgY29uc3Qge1xuICAgICAgbGF5b3V0OiBsYXlvdXRDb25maWcsXG4gICAgICBsYXlvdXRJdGVtOiBsYXlvdXRJdGVtQ29uZmlnLFxuICAgICAgc3R5bGU6IHN0eWxlQ29uZmlnLFxuICAgICAgYXR0cmlidXRlczogYXR0cmlidXRlc0NvbmZpZyxcbiAgICAgIGV2ZW50czogZXZlbnRzQ29uZmlnLFxuICAgICAgZXZlbnQsIC8vIExlZ2FjeSBzdXBwb3J0XG4gICAgICAuLi5jbGVhbk9wdGlvbnNcbiAgICB9ID0gb3B0aW9ucztcblxuICAgIC8vIFVzZSBldmVudHMgb3ZlciBldmVudCAoZXZlbnRzIGlzIHByZWZlcnJlZClcbiAgICBjb25zdCBmaW5hbEV2ZW50c0NvbmZpZyA9IGV2ZW50c0NvbmZpZyB8fCBldmVudDtcblxuICAgIC8vIElmIHN0eWxlIGlzIGEgc3RyaW5nLCBhbHdheXMgcGFzcyBpdCB0aHJvdWdoIHRvIHRoZSBjb21wb25lbnRcbiAgICBpZiAoc3R5bGVDb25maWcgJiYgdHlwZW9mIHN0eWxlQ29uZmlnID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjbGVhbk9wdGlvbnMuc3R5bGUgPSBzdHlsZUNvbmZpZztcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgY29tcG9uZW50XG4gICAgY29uc3QgaXNDbGFzcyA9XG4gICAgICB0eXBlb2YgQ29tcG9uZW50ID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoQ29tcG9uZW50LCBcInByb3RvdHlwZVwiKT8ud3JpdGFibGUgPT09XG4gICAgICAgIGZhbHNlO1xuXG4gICAgY29uc3QgY29tcG9uZW50ID0gaXNDbGFzc1xuICAgICAgPyBuZXcgQ29tcG9uZW50KGNsZWFuT3B0aW9ucylcbiAgICAgIDogQ29tcG9uZW50KGNsZWFuT3B0aW9ucyk7XG5cbiAgICAvLyBBcHBseSBjb25maWd1cmF0aW9ucyBpZiBjb21wb25lbnQgaGFzIGVsZW1lbnRcbiAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICBjb25zdCBlbGVtZW50ID1cbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQgfHxcbiAgICAgICAgKGNvbXBvbmVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gY29tcG9uZW50IDogbnVsbCk7XG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAvLyBBcHBseSBsYXlvdXQgY2xhc3Nlc1xuICAgICAgICBpZiAobGF5b3V0Q29uZmlnKSBhcHBseUxheW91dENsYXNzZXMoZWxlbWVudCwgbGF5b3V0Q29uZmlnKTtcblxuICAgICAgICAvLyBBcHBseSBsYXlvdXQgaXRlbSBjbGFzc2VzXG4gICAgICAgIGlmIChsYXlvdXRJdGVtQ29uZmlnKSBhcHBseUxheW91dEl0ZW1DbGFzc2VzKGVsZW1lbnQsIGxheW91dEl0ZW1Db25maWcpO1xuXG4gICAgICAgIC8vIEFwcGx5IHN0eWxlXG4gICAgICAgIGlmIChzdHlsZUNvbmZpZyAmJiB0eXBlb2Ygc3R5bGVDb25maWcgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlQ29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGx5IGF0dHJpYnV0ZXNcbiAgICAgICAgaWYgKGF0dHJpYnV0ZXNDb25maWcgJiYgdHlwZW9mIGF0dHJpYnV0ZXNDb25maWcgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzQ29uZmlnKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBldmVudHNcbiAgICAgICAgaWYgKGZpbmFsRXZlbnRzQ29uZmlnICYmIHR5cGVvZiBmaW5hbEV2ZW50c0NvbmZpZyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpbmFsRXZlbnRzQ29uZmlnKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBldmVudERlZiBvZiBmaW5hbEV2ZW50c0NvbmZpZykge1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShldmVudERlZikgJiYgZXZlbnREZWYubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbZXZlbnROYW1lLCBoYW5kbGVyXSA9IGV2ZW50RGVmO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgIHR5cGVvZiBldmVudE5hbWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICAgIHR5cGVvZiBoYW5kbGVyID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtldmVudE5hbWUsIGhhbmRsZXJdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgICAgICAgICBmaW5hbEV2ZW50c0NvbmZpZyxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGNyZWF0aW5nIGNvbXBvbmVudCBpbnN0YW5jZTpcIiwgZXJyb3IpO1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIElOVEVHUkFURUQgTEFZT1VUIENPTkZJR1VSQVRJT04gKHdpdGggY2FjaGluZylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBBcHBsaWVzIGxheW91dCBjbGFzc2VzIGJhc2VkIG9uIGNvbmZpZ3VyYXRpb25cbiAqIFVzZXMgaW50ZWdyYXRlZCBjYWNoaW5nIGZvciBvcHRpbWFsIHBlcmZvcm1hbmNlXG4gKi9cbmZ1bmN0aW9uIGFwcGx5TGF5b3V0Q2xhc3NlcyhcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gIGxheW91dENvbmZpZzogTGF5b3V0Q29uZmlnLFxuKTogdm9pZCB7XG4gIGlmICghZWxlbWVudCB8fCAhbGF5b3V0Q29uZmlnKSByZXR1cm47XG5cbiAgLy8gQXBwbHkgYmFzZSBsYXlvdXQgdHlwZVxuICBpZiAobGF5b3V0Q29uZmlnLnR5cGUpIHtcbiAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tJHtsYXlvdXRDb25maWcudHlwZX1gKTtcbiAgfVxuXG4gIC8vIEFwcGx5IHByb3BlcnRpZXMgd2l0aCBjYWNoaW5nXG4gIGNvbnN0IGxheW91dFR5cGUgPSBsYXlvdXRDb25maWcudHlwZSB8fCBnZXRMYXlvdXRUeXBlKGVsZW1lbnQpO1xuICBpZiAobGF5b3V0VHlwZSkge1xuICAgIGlmIChsYXlvdXRDb25maWcuZ2FwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICtcbiAgICAgICAgICBnZXRDYWNoZWRDbGFzc05hbWUobGF5b3V0VHlwZSwgXCJnYXBcIiwgbGF5b3V0Q29uZmlnLmdhcCksXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobGF5b3V0Q29uZmlnLmFsaWduKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArXG4gICAgICAgICAgZ2V0Q2FjaGVkQ2xhc3NOYW1lKGxheW91dFR5cGUsIFwiYWxpZ25cIiwgbGF5b3V0Q29uZmlnLmFsaWduKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChsYXlvdXRDb25maWcuanVzdGlmeSkge1xuICAgICAgYWRkQ2xhc3MoXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIFBSRUZJWF9XSVRIX0RBU0ggK1xuICAgICAgICAgIGdldENhY2hlZENsYXNzTmFtZShsYXlvdXRUeXBlLCBcImp1c3RpZnlcIiwgbGF5b3V0Q29uZmlnLmp1c3RpZnkpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBHcmlkLXNwZWNpZmljIHByb3BlcnRpZXNcbiAgaWYgKGxheW91dENvbmZpZy50eXBlID09PSBcImdyaWRcIiB8fCBnZXRMYXlvdXRUeXBlKGVsZW1lbnQpID09PSBcImdyaWRcIikge1xuICAgIGlmICh0eXBlb2YgbGF5b3V0Q29uZmlnLmNvbHVtbnMgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICtcbiAgICAgICAgICBnZXRDYWNoZWRDbGFzc05hbWUoXCJncmlkXCIsIFwiY29sc1wiLCBsYXlvdXRDb25maWcuY29sdW1ucyksXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAobGF5b3V0Q29uZmlnLmNvbHVtbnMgPT09IFwiYXV0by1maWxsXCIpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiZ3JpZFwiLCBcImZpbGxcIiwgXCJhdXRvXCIpLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGxheW91dENvbmZpZy5jb2x1bW5zID09PSBcImF1dG8tZml0XCIpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiZ3JpZFwiLCBcImNvbHNcIiwgXCJhdXRvLWZpdFwiKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChsYXlvdXRDb25maWcuZGVuc2UpXG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tZ3JpZC1kZW5zZWApO1xuICAgIGlmIChsYXlvdXRDb25maWcuYXV0b0hlaWdodClcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1ncmlkLWF1dG8taGVpZ2h0YCk7XG4gIH1cblxuICAvLyBSb3ctc3BlY2lmaWMgcHJvcGVydGllc1xuICBpZiAobGF5b3V0Q29uZmlnLnR5cGUgPT09IFwicm93XCIgfHwgZ2V0TGF5b3V0VHlwZShlbGVtZW50KSA9PT0gXCJyb3dcIikge1xuICAgIGlmIChsYXlvdXRDb25maWcud3JhcCA9PT0gZmFsc2UgfHwgbGF5b3V0Q29uZmlnLndyYXAgPT09IFwibm93cmFwXCIpIHtcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3ctbm93cmFwYCk7XG4gICAgfSBlbHNlIGlmIChsYXlvdXRDb25maWcud3JhcCA9PT0gXCJyZXZlcnNlXCIpIHtcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3ctd3JhcC1yZXZlcnNlYCk7XG4gICAgfVxuICAgIGlmIChsYXlvdXRDb25maWcubW9iaWxlU3RhY2spXG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93LW1vYmlsZS1zdGFja2ApO1xuICAgIGlmIChsYXlvdXRDb25maWcubW9iaWxlU2Nyb2xsKVxuICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLXJvdy1tb2JpbGUtc2Nyb2xsYCk7XG4gIH1cblxuICAvLyBDdXN0b20gY2xhc3Nlc1xuICBpZiAobGF5b3V0Q29uZmlnLmNsYXNzKSB7XG4gICAgbGF5b3V0Q29uZmlnLmNsYXNzXG4gICAgICAuc3BsaXQoXCIgXCIpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuZm9yRWFjaCgoY2xzKSA9PiBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xzKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBBcHBsaWVzIGxheW91dCBpdGVtIGNsYXNzZXMgYmFzZWQgb24gY29uZmlndXJhdGlvblxuICogVXNlcyBpbnRlZ3JhdGVkIGNhY2hpbmcgZm9yIG9wdGltYWwgcGVyZm9ybWFuY2VcbiAqL1xuZnVuY3Rpb24gYXBwbHlMYXlvdXRJdGVtQ2xhc3NlcyhcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gIGl0ZW1Db25maWc6IExheW91dEl0ZW1Db25maWcsXG4pOiB2b2lkIHtcbiAgaWYgKCFlbGVtZW50IHx8ICFpdGVtQ29uZmlnKSByZXR1cm47XG5cbiAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXRfX2l0ZW1gKTtcblxuICAvLyBXaWR0aCBhbmQgcmVzcG9uc2l2ZSBjbGFzc2VzIHdpdGggY2FjaGluZ1xuICBpZiAoaXRlbUNvbmZpZy53aWR0aCAmJiBpdGVtQ29uZmlnLndpZHRoID49IDEgJiYgaXRlbUNvbmZpZy53aWR0aCA8PSAxMikge1xuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwiXCIsIGl0ZW1Db25maWcud2lkdGgpLFxuICAgICk7XG4gIH1cbiAgaWYgKGl0ZW1Db25maWcuc20pXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJzbVwiLCBpdGVtQ29uZmlnLnNtKSxcbiAgICApO1xuICBpZiAoaXRlbUNvbmZpZy5tZClcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcIm1kXCIsIGl0ZW1Db25maWcubWQpLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLmxnKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwibGdcIiwgaXRlbUNvbmZpZy5sZyksXG4gICAgKTtcbiAgaWYgKGl0ZW1Db25maWcueGwpXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJ4bFwiLCBpdGVtQ29uZmlnLnhsKSxcbiAgICApO1xuXG4gIC8vIEdyaWQgc3BhbiBjbGFzc2VzXG4gIGlmIChpdGVtQ29uZmlnLnNwYW4pXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJzcGFuXCIsIGl0ZW1Db25maWcuc3BhbiksXG4gICAgKTtcbiAgaWYgKGl0ZW1Db25maWcucm93U3BhbilcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICtcbiAgICAgICAgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcInJvdy1zcGFuXCIsIGl0ZW1Db25maWcucm93U3BhbiksXG4gICAgKTtcblxuICAvLyBPcmRlciBhbmQgYWxpZ25tZW50XG4gIGlmIChpdGVtQ29uZmlnLm9yZGVyKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwib3JkZXJcIiwgaXRlbUNvbmZpZy5vcmRlciksXG4gICAgKTtcbiAgaWYgKGl0ZW1Db25maWcuYWxpZ24pXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJzZWxmXCIsIGl0ZW1Db25maWcuYWxpZ24pLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLmF1dG8pXG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXRfX2l0ZW0tLWF1dG9gKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBsYXlvdXQgdHlwZSBmcm9tIGVsZW1lbnQgY2xhc3Nlc1xuICovXG5mdW5jdGlvbiBnZXRMYXlvdXRUeXBlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogc3RyaW5nIHtcbiAgcmV0dXJuIGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1zdGFja2ApXG4gICAgPyBcInN0YWNrXCJcbiAgICA6IGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3dgKVxuICAgICAgPyBcInJvd1wiXG4gICAgICA6IGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1ncmlkYClcbiAgICAgICAgPyBcImdyaWRcIlxuICAgICAgICA6IFwiXCI7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFVOSUZJRUQgU0NIRU1BIFBST0NFU1NPUlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBQcm9jZXNzZXMgYXJyYXktYmFzZWQgc2NoZW1hIGRlZmluaXRpb25zXG4gKiBPcHRpbWl6ZWQgd2l0aCBwYXJhbWV0ZXIgZXh0cmFjdGlvbiBhbmQgaW50ZWdyYXRlZCBjb25maWd1cmF0aW9uXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NBcnJheVNjaGVtYShcbiAgc2NoZW1hOiBTY2hlbWFJdGVtW10gfCBhbnksXG4gIHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGwsXG4gIGxldmVsOiBudW1iZXIgPSAwLFxuICBvcHRpb25zOiBMYXlvdXRPcHRpb25zID0ge30sXG4pOiBMYXlvdXRSZXN1bHQge1xuICBsZXZlbCsrO1xuICBjb25zdCBsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgY29uc3QgY29tcG9uZW50czogQXJyYXk8W3N0cmluZywgYW55XT4gPSBbXTtcbiAgY29uc3QgZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudCgpO1xuICBsZXQgY29tcG9uZW50ID0gbnVsbDtcblxuICBpZiAoIUFycmF5LmlzQXJyYXkoc2NoZW1hKSkge1xuICAgIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbiAgfVxuXG4gIGNvbnN0IGRlZmF1bHRDcmVhdG9yID0gKG9wdGlvbnMgYXMgYW55KS5jcmVhdG9yIHx8IGNyZWF0ZUVsZW1lbnQ7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlbWEubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBpdGVtID0gc2NoZW1hW2ldO1xuICAgIGlmICghaXRlbSkgY29udGludWU7XG5cbiAgICAvLyBIYW5kbGUgbmVzdGVkIGFycmF5c1xuICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBjb21wb25lbnQgfHwgcGFyZW50RWxlbWVudDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHByb2Nlc3NBcnJheVNjaGVtYShpdGVtLCBjb250YWluZXIsIGxldmVsLCBvcHRpb25zKTtcbiAgICAgIC8vIE1lcmdlIG5lc3RlZCBjb21wb25lbnRzIGFycmF5IGluc3RlYWQgb2Ygb3ZlcndyaXRpbmdcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdC5sYXlvdXQuY29tcG9uZW50cykpIHtcbiAgICAgICAgY29tcG9uZW50cy5wdXNoKC4uLnJlc3VsdC5sYXlvdXQuY29tcG9uZW50cyk7XG4gICAgICAgIGRlbGV0ZSByZXN1bHQubGF5b3V0LmNvbXBvbmVudHM7XG4gICAgICB9XG4gICAgICBPYmplY3QuYXNzaWduKGxheW91dCwgcmVzdWx0LmxheW91dCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBVc2Ugb3B0aW1pemVkIHBhcmFtZXRlciBleHRyYWN0aW9uXG4gICAgY29uc3Qge1xuICAgICAgY3JlYXRvcixcbiAgICAgIG5hbWUsXG4gICAgICBvcHRpb25zOiBpdGVtT3B0aW9ucyxcbiAgICAgIGNvbnN1bWVkLFxuICAgIH0gPSBleHRyYWN0UGFyYW1ldGVycyhzY2hlbWEsIGksIGRlZmF1bHRDcmVhdG9yKTtcblxuICAgIGlmICghY3JlYXRvcikge1xuICAgICAgY29uc29sZS53YXJuKFwiU2tpcHBpbmcgdW5zdXBwb3J0ZWQgaXRlbSB0eXBlOlwiLCBpdGVtKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgdG8gZGl2IGZvciBjcmVhdGVFbGVtZW50XG4gICAgaWYgKGNyZWF0b3IgPT09IGNyZWF0ZUVsZW1lbnQgJiYgIShcInRhZ1wiIGluIGl0ZW1PcHRpb25zKSkge1xuICAgICAgaXRlbU9wdGlvbnMudGFnID0gXCJkaXZcIjtcbiAgICB9XG5cbiAgICAvLyBBZHZhbmNlIGluZGV4IGJ5IGNvbnN1bWVkIGl0ZW1zIG1pbnVzIDEgKGxvb3AgaW5jcmVtZW50IGhhbmRsZXMgdGhlICsxKVxuICAgIGkgKz0gY29uc3VtZWQgLSAxO1xuXG4gICAgLy8gUHJvY2VzcyBvcHRpb25zIHdpdGggcHJlZml4IC0gb3B0aW1pemVkIGRlY2lzaW9uIGxvZ2ljXG4gICAgY29uc3Qgc2hvdWxkQXBwbHlQcmVmaXggPVxuICAgICAgXCJwcmVmaXhcIiBpbiBpdGVtT3B0aW9ucyA/IGl0ZW1PcHRpb25zLnByZWZpeCA6IG9wdGlvbnMucHJlZml4ICE9PSBmYWxzZTtcblxuICAgIC8vIEZhc3QgcGF0aDogcHJvY2VzcyBvbmx5IHdoZW4gbmVlZGVkXG4gICAgY29uc3QgcHJvY2Vzc2VkT3B0aW9ucyA9XG4gICAgICBzaG91bGRBcHBseVByZWZpeCB8fCBpdGVtT3B0aW9ucy5yYXdDbGFzc1xuICAgICAgICA/IHByb2Nlc3NDbGFzc05hbWVzKGl0ZW1PcHRpb25zLCAhc2hvdWxkQXBwbHlQcmVmaXgpXG4gICAgICAgIDogaXRlbU9wdGlvbnM7IC8vIE5vIGNvcHkgbmVlZGVkIGlmIG5vIHByb2Nlc3NpbmdcblxuICAgIC8vIEFkZCBuYW1lIHRvIG9wdGlvbnMgaWYgbmVlZGVkXG4gICAgaWYgKFxuICAgICAgbmFtZSAmJlxuICAgICAgIShcIm5hbWVcIiBpbiBwcm9jZXNzZWRPcHRpb25zKSAmJlxuICAgICAgIShjcmVhdG9yID09PSBjcmVhdGVFbGVtZW50IHx8IChjcmVhdG9yIGFzIGFueSkuaXNFbGVtZW50KVxuICAgICkge1xuICAgICAgcHJvY2Vzc2VkT3B0aW9ucy5uYW1lID0gbmFtZTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgY29tcG9uZW50XG4gICAgY29tcG9uZW50ID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoY3JlYXRvciwgcHJvY2Vzc2VkT3B0aW9ucyk7XG4gICAgY29uc3QgZWxlbWVudCA9IGlzQ29tcG9uZW50KGNvbXBvbmVudCkgPyBjb21wb25lbnQuZWxlbWVudCA6IGNvbXBvbmVudDtcblxuICAgIGlmIChsZXZlbCA9PT0gMSkgbGF5b3V0LmVsZW1lbnQgPSBlbGVtZW50O1xuICAgIGlmIChuYW1lKSB7XG4gICAgICBsYXlvdXRbbmFtZV0gPSBjb21wb25lbnQ7XG4gICAgICBjb21wb25lbnRzLnB1c2goW25hbWUsIGNvbXBvbmVudF0pO1xuICAgIH1cblxuICAgIC8vIEFwcGVuZCB0byBET01cbiAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICBpZiAoXCJpbnNlcnRcIiBpbiBjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudC5pbnNlcnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjb21wb25lbnQuaW5zZXJ0KGZyYWdtZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50RWxlbWVudCkge1xuICAgICAgICBjb21wb25lbnQuX2NvbnRhaW5lciA9IHBhcmVudEVsZW1lbnQ7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBcIm9uSW5zZXJ0ZWRcIiBpbiBjb21wb25lbnQgJiZcbiAgICAgICAgICB0eXBlb2YgY29tcG9uZW50Lm9uSW5zZXJ0ZWQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICApIHtcbiAgICAgICAgICBjb21wb25lbnQub25JbnNlcnRlZChwYXJlbnRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEFwcGVuZCBmcmFnbWVudCB0byBwYXJlbnRcbiAgaWYgKHBhcmVudEVsZW1lbnQgJiYgZnJhZ21lbnQuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgY29uc3Qgd3JhcHBlciA9IGlzQ29tcG9uZW50KHBhcmVudEVsZW1lbnQpXG4gICAgICA/IHBhcmVudEVsZW1lbnQuZWxlbWVudFxuICAgICAgOiBwYXJlbnRFbGVtZW50O1xuICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpO1xuICB9XG5cbiAgLy8gUmVsZWFzZSBmcmFnbWVudCBiYWNrIHRvIHBvb2xcbiAgcmVsZWFzZUZyYWdtZW50KGZyYWdtZW50KTtcblxuICBsYXlvdXQuY29tcG9uZW50cyA9IGNvbXBvbmVudHM7XG4gIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgb2JqZWN0LWJhc2VkIHNjaGVtYSBkZWZpbml0aW9uc1xuICogU2ltcGxpZmllZCBhbmQgb3B0aW1pemVkIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc09iamVjdFNjaGVtYShcbiAgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgc3RyaW5nLFxuICBwYXJlbnRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsLFxuICBvcHRpb25zOiBMYXlvdXRPcHRpb25zID0ge30sXG4pOiBMYXlvdXRSZXN1bHQge1xuICBjb25zdCBsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgY29uc3QgZGVmYXVsdENyZWF0b3IgPSBvcHRpb25zLmNyZWF0b3IgfHwgY3JlYXRlRWxlbWVudDtcblxuICAvLyBIYW5kbGUgcm9vdCBlbGVtZW50IGNyZWF0aW9uXG4gIGlmICgoc2NoZW1hIGFzIGFueSkuZWxlbWVudCAmJiAhcGFyZW50RWxlbWVudCkge1xuICAgIGNvbnN0IGVsZW1lbnREZWYgPSAoc2NoZW1hIGFzIGFueSkuZWxlbWVudDtcbiAgICBjb25zdCBjcmVhdGVFbGVtZW50Rm4gPSBlbGVtZW50RGVmLmNyZWF0b3IgfHwgZGVmYXVsdENyZWF0b3I7XG5cbiAgICBjb25zdCBlbGVtZW50T3B0aW9ucyA9IGVsZW1lbnREZWYub3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBwcm9jZXNzZWRPcHRpb25zID1cbiAgICAgIG9wdGlvbnMucHJlZml4ICE9PSBmYWxzZVxuICAgICAgICA/IHByb2Nlc3NDbGFzc05hbWVzKGVsZW1lbnRPcHRpb25zKVxuICAgICAgICA6IHsgLi4uZWxlbWVudE9wdGlvbnMgfTtcblxuICAgIGNvbnN0IHJvb3RDb21wb25lbnQgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShcbiAgICAgIGNyZWF0ZUVsZW1lbnRGbixcbiAgICAgIHByb2Nlc3NlZE9wdGlvbnMsXG4gICAgKTtcbiAgICBsYXlvdXQuZWxlbWVudCA9IHJvb3RDb21wb25lbnQ7XG4gICAgaWYgKGVsZW1lbnREZWYubmFtZSkgbGF5b3V0W2VsZW1lbnREZWYubmFtZV0gPSByb290Q29tcG9uZW50O1xuXG4gICAgLy8gUHJvY2VzcyBjaGlsZHJlblxuICAgIGlmIChlbGVtZW50RGVmLmNoaWxkcmVuKSB7XG4gICAgICBjb25zdCByb290RWxlbWVudCA9IGlzQ29tcG9uZW50KHJvb3RDb21wb25lbnQpXG4gICAgICAgID8gcm9vdENvbXBvbmVudC5lbGVtZW50XG4gICAgICAgIDogcm9vdENvbXBvbmVudDtcbiAgICAgIGNvbnN0IGNoaWxkUmVzdWx0ID0gcHJvY2Vzc09iamVjdFNjaGVtYShcbiAgICAgICAgZWxlbWVudERlZi5jaGlsZHJlbixcbiAgICAgICAgcm9vdEVsZW1lbnQsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApO1xuICAgICAgT2JqZWN0LmFzc2lnbihsYXlvdXQsIGNoaWxkUmVzdWx0LmxheW91dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUxheW91dFJlc3VsdChsYXlvdXQpO1xuICB9XG5cbiAgLy8gUHJvY2VzcyBub3JtYWwgc2NoZW1hIGVsZW1lbnRzXG4gIGNvbnN0IGZyYWdtZW50ID0gcGFyZW50RWxlbWVudCA/IGNyZWF0ZUZyYWdtZW50KCkgOiBudWxsO1xuXG4gIGZvciAoY29uc3Qga2V5IGluIHNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgY29uc3QgZGVmID0gKHNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldO1xuICAgIGlmICghZGVmKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGVsZW1lbnRDcmVhdG9yID0gZGVmLmNyZWF0b3IgfHwgZGVmYXVsdENyZWF0b3I7XG4gICAgY29uc3QgZWxlbWVudE9wdGlvbnMgPSBkZWYub3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBzaG91bGRBcHBseVByZWZpeCA9XG4gICAgICBcInByZWZpeFwiIGluIGVsZW1lbnRPcHRpb25zXG4gICAgICAgID8gZWxlbWVudE9wdGlvbnMucHJlZml4XG4gICAgICAgIDogb3B0aW9ucy5wcmVmaXggIT09IGZhbHNlO1xuICAgIGNvbnN0IHByb2Nlc3NlZE9wdGlvbnMgPSBzaG91bGRBcHBseVByZWZpeFxuICAgICAgPyBwcm9jZXNzQ2xhc3NOYW1lcyhlbGVtZW50T3B0aW9ucylcbiAgICAgIDogeyAuLi5lbGVtZW50T3B0aW9ucyB9O1xuXG4gICAgaWYgKCFkZWYubmFtZSAmJiBrZXkgIT09IFwiZWxlbWVudFwiKSB7XG4gICAgICBkZWYubmFtZSA9IGtleTtcbiAgICB9XG5cbiAgICBjb25zdCBjcmVhdGVkID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoZWxlbWVudENyZWF0b3IsIHByb2Nlc3NlZE9wdGlvbnMpO1xuICAgIGxheW91dFtrZXldID0gY3JlYXRlZDtcbiAgICBpZiAoZGVmLm5hbWUgJiYgZGVmLm5hbWUgIT09IGtleSkgbGF5b3V0W2RlZi5uYW1lXSA9IGNyZWF0ZWQ7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gaXNDb21wb25lbnQoY3JlYXRlZCkgPyBjcmVhdGVkLmVsZW1lbnQgOiBjcmVhdGVkO1xuICAgIGlmIChmcmFnbWVudCkgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG5cbiAgICAvLyBQcm9jZXNzIGNoaWxkcmVuXG4gICAgaWYgKGRlZi5jaGlsZHJlbikge1xuICAgICAgY29uc3QgY2hpbGRSZXN1bHQgPSBwcm9jZXNzT2JqZWN0U2NoZW1hKGRlZi5jaGlsZHJlbiwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICBPYmplY3QuYXNzaWduKGxheW91dCwgY2hpbGRSZXN1bHQubGF5b3V0KTtcbiAgICB9XG4gIH1cblxuICAvLyBBcHBlbmQgdG8gcGFyZW50XG4gIGlmIChwYXJlbnRFbGVtZW50ICYmIGZyYWdtZW50KSB7XG4gICAgY29uc3QgcGFyZW50RG9tID0gaXNDb21wb25lbnQocGFyZW50RWxlbWVudClcbiAgICAgID8gcGFyZW50RWxlbWVudC5lbGVtZW50XG4gICAgICA6IHBhcmVudEVsZW1lbnQ7XG4gICAgcGFyZW50RG9tLmFwcGVuZENoaWxkKGZyYWdtZW50KTtcbiAgICByZWxlYXNlRnJhZ21lbnQoZnJhZ21lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZUxheW91dFJlc3VsdChsYXlvdXQpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBMQVlPVVQgUkVTVUxUIENSRUFUSU9OXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRmxhdHRlbnMgYSBuZXN0ZWQgbGF5b3V0IGludG8gYSBzaW1wbGUgb2JqZWN0IHdpdGggZWxlbWVudCBhbmQgY29tcG9uZW50IHJlZmVyZW5jZXNcbiAqL1xuZnVuY3Rpb24gZmxhdHRlbkxheW91dChsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgY29uc3QgZmxhdHRlbmVkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cbiAgaWYgKCFsYXlvdXQgfHwgdHlwZW9mIGxheW91dCAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZsYXR0ZW5lZDtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBsYXlvdXQpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGxheW91dFtrZXldO1xuICAgIGlmIChcbiAgICAgIHZhbHVlICYmXG4gICAgICB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgKHZhbHVlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHxcbiAgICAgICAgKHR5cGVvZiBTVkdFbGVtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmIHZhbHVlIGluc3RhbmNlb2YgU1ZHRWxlbWVudCkgfHxcbiAgICAgICAgaXNDb21wb25lbnQodmFsdWUpKVxuICAgICkge1xuICAgICAgZmxhdHRlbmVkW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmxhdHRlbmVkO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsYXlvdXQgcmVzdWx0IG9iamVjdCB3aXRoIHV0aWxpdHkgZnVuY3Rpb25zXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUxheW91dFJlc3VsdChsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBMYXlvdXRSZXN1bHQge1xuICBjb25zdCBmbGF0dGVuZWRDb21wb25lbnRzID0gZmxhdHRlbkxheW91dChsYXlvdXQpO1xuXG4gIHJldHVybiB7XG4gICAgbGF5b3V0LFxuICAgIGVsZW1lbnQ6IGxheW91dC5lbGVtZW50LFxuICAgIGNvbXBvbmVudDogZmxhdHRlbmVkQ29tcG9uZW50cyxcblxuICAgIGdldChuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgICAgcmV0dXJuIGxheW91dFtuYW1lXSA/PyBudWxsO1xuICAgIH0sXG5cbiAgICBnZXRBbGwoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICByZXR1cm4gZmxhdHRlbmVkQ29tcG9uZW50cztcbiAgICB9LFxuXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAgIC8vIFRyYWNrIGRlc3Ryb3llZCBjb21wb25lbnRzIHRvIGF2b2lkIGRvdWJsZS1kZXN0cm95XG4gICAgICBjb25zdCBkZXN0cm95ZWQgPSBuZXcgU2V0PGFueT4oKTtcblxuICAgICAgLy8gSGVscGVyIHRvIHNhZmVseSBkZXN0cm95IGEgY29tcG9uZW50XG4gICAgICBjb25zdCBkZXN0cm95Q29tcG9uZW50ID0gKGNvbXBvbmVudDogYW55KTogdm9pZCA9PiB7XG4gICAgICAgIGlmICghY29tcG9uZW50IHx8IGRlc3Ryb3llZC5oYXMoY29tcG9uZW50KSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFNraXAgcGxhaW4gSFRNTCBlbGVtZW50cyBhbmQgbm9uLW9iamVjdHNcbiAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IHR5cGVvZiBjb21wb25lbnQgIT09IFwib2JqZWN0XCIpXG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGl0J3MgYSBjb21wb25lbnQgd2l0aCBkZXN0cm95IG1ldGhvZFxuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBkZXN0cm95ZWQuYWRkKGNvbXBvbmVudCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5kZXN0cm95KCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gSWdub3JlIGRlc3Ryb3kgZXJyb3JzIC0gY29tcG9uZW50IG1heSBhbHJlYWR5IGJlIGNsZWFuZWQgdXBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8vIEZpcnN0IGRlc3Ryb3kgY29tcG9uZW50cyBmcm9tIHRoZSBjb21wb25lbnRzIGFycmF5IChpZiBwcmVzZW50KVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIGFsbCBuYW1lZCBjb21wb25lbnRzIGFyZSBkZXN0cm95ZWQgZXZlbiBpZiBuZXN0ZWRcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGxheW91dC5jb21wb25lbnRzKSkge1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBjb21wb25lbnRdIG9mIGxheW91dC5jb21wb25lbnRzKSB7XG4gICAgICAgICAgZGVzdHJveUNvbXBvbmVudChjb21wb25lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZW4gaXRlcmF0ZSBvdmVyIGFsbCBsYXlvdXQga2V5cyBmb3IgYW55IG1pc3NlZCBjb21wb25lbnRzXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBsYXlvdXQpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJlbGVtZW50XCIgfHwga2V5ID09PSBcImNvbXBvbmVudHNcIikgY29udGludWU7XG4gICAgICAgIGRlc3Ryb3lDb21wb25lbnQobGF5b3V0W2tleV0pO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGVhciB0aGUgY29tcG9uZW50cyBhcnJheVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGF5b3V0LmNvbXBvbmVudHMpKSB7XG4gICAgICAgIGxheW91dC5jb21wb25lbnRzLmxlbmd0aCA9IDA7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSByb290IGVsZW1lbnQgZnJvbSBET01cbiAgICAgIGlmIChsYXlvdXQuZWxlbWVudCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gaXNDb21wb25lbnQobGF5b3V0LmVsZW1lbnQpXG4gICAgICAgICAgPyBsYXlvdXQuZWxlbWVudC5lbGVtZW50XG4gICAgICAgICAgOiBsYXlvdXQuZWxlbWVudDtcbiAgICAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFyIHJlZmVyZW5jZXMgdG8gaGVscCBHQ1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbGF5b3V0KSB7XG4gICAgICAgIGRlbGV0ZSBsYXlvdXRba2V5XTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBVTklGSUVEIEVOVFJZIFBPSU5UXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ3JlYXRlcyBhIGxheW91dCBmcm9tIHZhcmlvdXMgc2NoZW1hIGZvcm1hdHNcbiAqIFVuaWZpZWQgcHJvY2Vzc29yIGZvciBhcnJheXMsIG9iamVjdHMsIEpTWCwgYW5kIEhUTUwgc3RyaW5nc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGF5b3V0KFxuICBzY2hlbWE6IGFueSxcbiAgcGFyZW50RWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbCxcbiAgb3B0aW9uczogTGF5b3V0T3B0aW9ucyA9IHt9LFxuKTogTGF5b3V0UmVzdWx0IHtcbiAgLy8gSGFuZGxlIGZ1bmN0aW9uIHNjaGVtYXNcbiAgaWYgKHR5cGVvZiBzY2hlbWEgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHNjaGVtYSA9IHNjaGVtYSgpO1xuICB9XG5cbiAgLy8gSGFuZGxlIEhUTUwgc3RyaW5nIHNjaGVtYXNcbiAgaWYgKHR5cGVvZiBzY2hlbWEgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBzY2hlbWEudHJpbSgpO1xuICAgIGNvbnN0IGZyYWdtZW50ID0gdGVtcGxhdGUuY29udGVudDtcblxuICAgIGlmIChwYXJlbnRFbGVtZW50ICYmIGZyYWdtZW50Lmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgcGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChmcmFnbWVudCk7XG4gICAgfVxuXG4gICAgY29uc3QgbGF5b3V0ID0geyBlbGVtZW50OiBmcmFnbWVudC5maXJzdEVsZW1lbnRDaGlsZCBhcyBIVE1MRWxlbWVudCB9O1xuICAgIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBKU1gtbGlrZSBzY2hlbWFzIChhcnJheSB3aXRoIGZ1bmN0aW9uLCBzdHJpbmcsIG9iamVjdCBwYXR0ZXJuKVxuICBpZiAoXG4gICAgQXJyYXkuaXNBcnJheShzY2hlbWEpICYmXG4gICAgc2NoZW1hLmxlbmd0aCA+PSAzICYmXG4gICAgdHlwZW9mIHNjaGVtYVswXSA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgdHlwZW9mIHNjaGVtYVsxXSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgIGlzT2JqZWN0KHNjaGVtYVsyXSlcbiAgKSB7XG4gICAgcmV0dXJuIHByb2Nlc3NBcnJheVNjaGVtYShzY2hlbWEsIHBhcmVudEVsZW1lbnQsIDAsIG9wdGlvbnMpO1xuICB9XG5cbiAgLy8gUm91dGUgdG8gYXBwcm9wcmlhdGUgcHJvY2Vzc29yXG4gIHJldHVybiBBcnJheS5pc0FycmF5KHNjaGVtYSlcbiAgICA/IHByb2Nlc3NBcnJheVNjaGVtYShzY2hlbWEsIHBhcmVudEVsZW1lbnQsIDAsIG9wdGlvbnMpXG4gICAgOiBwcm9jZXNzT2JqZWN0U2NoZW1hKHNjaGVtYSwgcGFyZW50RWxlbWVudCwgb3B0aW9ucyk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEVYUE9SVFNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gQ2xlYXIgZnVuY3Rpb25zIGZvciB0aGUgdW5pZmllZCBzeXN0ZW1cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckNsYXNzQ2FjaGUoKTogdm9pZCB7XG4gIGNsYXNzQ2FjaGUuY2xlYXIoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyRnJhZ21lbnRQb29sKCk6IHZvaWQge1xuICBmcmFnbWVudFBvb2wuY2xlYXIoKTtcbn1cblxuZXhwb3J0IHtcbiAgcHJvY2Vzc0NsYXNzTmFtZXMsXG4gIGlzQ29tcG9uZW50LFxuICBmbGF0dGVuTGF5b3V0LFxuICBhcHBseUxheW91dENsYXNzZXMsXG4gIGFwcGx5TGF5b3V0SXRlbUNsYXNzZXMsXG4gIGNyZWF0ZUxheW91dFJlc3VsdCxcbn07XG4iLAogICAgIi8qKlxuICogQG1vZHVsZSBjb3JlL2xheW91dC9jb25maWdcbiAqIEBkZXNjcmlwdGlvbiBFc3NlbnRpYWwgbGF5b3V0IGNvbmZpZ3VyYXRpb24gdXRpbGl0aWVzXG4gKiBDb3JlIGZ1bmN0aW9uYWxpdHkgaXMgaW50ZWdyYXRlZCBpbnRvIHNjaGVtYS50cyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gKi9cblxuLy8gQ29uZmlndXJhdGlvbiBjb25zdGFudHNcbmNvbnN0IFBSRUZJWCA9IFwibXRybFwiOyAvLyBUT0RPOiBNYWtlIHRoaXMgY29uZmlndXJhYmxlIGZyb20gbWFpbiBtdHJsIGNvbmZpZ1xuY29uc3QgUFJFRklYX1dJVEhfREFTSCA9IGAke1BSRUZJWH0tYDtcblxuLyoqXG4gKiBTaW1wbGUgRE9NIHV0aWxpdGllc1xuICovXG5mdW5jdGlvbiBhZGRDbGFzcyhlbGVtZW50OiBhbnksIGNsYXNzTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChlbGVtZW50ICYmIGNsYXNzTmFtZSAmJiBlbGVtZW50LmNsYXNzTGlzdCkge1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc0NsYXNzKGVsZW1lbnQ6IGFueSwgY2xhc3NOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGVsZW1lbnQgJiYgZWxlbWVudC5jbGFzc0xpc3QgJiYgZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gY2xlYW4gdXAgcHJldmlvdXMgbGF5b3V0IGNsYXNzZXMgZnJvbSBhbiBlbGVtZW50XG4gKiBVc2VmdWwgZm9yIGR5bmFtaWMgY2xhc3MgbWFuYWdlbWVudFxuICpcbiAqIEBwYXJhbSBlbGVtZW50IC0gRWxlbWVudCB0byBjbGVhbiBsYXlvdXQgY2xhc3NlcyBmcm9tXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhbnVwTGF5b3V0Q2xhc3NlcyhlbGVtZW50OiBhbnkpOiB2b2lkIHtcbiAgaWYgKCFlbGVtZW50IHx8ICFlbGVtZW50LmNsYXNzTGlzdCkgcmV0dXJuO1xuXG4gIC8vIEdldCBhbGwgY2xhc3NlcyBmcm9tIHRoZSBlbGVtZW50XG4gIGNvbnN0IGNsYXNzTGlzdCA9IEFycmF5LmZyb20oZWxlbWVudC5jbGFzc0xpc3QpIGFzIHN0cmluZ1tdO1xuXG4gIC8vIEZpbmQgYW5kIHJlbW92ZSBsYXlvdXQtcmVsYXRlZCBjbGFzc2VzXG4gIGNvbnN0IGxheW91dENsYXNzZXMgPSBjbGFzc0xpc3QuZmlsdGVyKFxuICAgIChjbHM6IHN0cmluZykgPT5cbiAgICAgIGNscy5zdGFydHNXaXRoKGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1gKSB8fFxuICAgICAgY2xzLmluY2x1ZGVzKGAtJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tYClcbiAgKTtcblxuICAvLyBSZW1vdmUgZWFjaCBsYXlvdXQgY2xhc3NcbiAgbGF5b3V0Q2xhc3Nlcy5mb3JFYWNoKChjbHM6IHN0cmluZykgPT4ge1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShjbHMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBsYXlvdXQgdHlwZSBmcm9tIGVsZW1lbnQgY2xhc3Nlc1xuICpcbiAqIEBwYXJhbSBlbGVtZW50IC0gRWxlbWVudCB0byBjaGVja1xuICogQHJldHVybnMgTGF5b3V0IHR5cGUgaWYgZm91bmQsIGVtcHR5IHN0cmluZyBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExheW91dFR5cGUoZWxlbWVudDogYW55KTogc3RyaW5nIHtcbiAgcmV0dXJuIGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1zdGFja2ApXG4gICAgPyBcInN0YWNrXCJcbiAgICA6IGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3dgKVxuICAgID8gXCJyb3dcIlxuICAgIDogaGFzQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLWdyaWRgKVxuICAgID8gXCJncmlkXCJcbiAgICA6IFwiXCI7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY29uZmlndXJlZCBwcmVmaXggZm9yIHRoZSBsYXlvdXQgc3lzdGVtXG4gKiBAcmV0dXJucyBDdXJyZW50IHByZWZpeCB3aXRoIGRhc2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExheW91dFByZWZpeCgpOiBzdHJpbmcge1xuICByZXR1cm4gUFJFRklYX1dJVEhfREFTSDtcbn1cblxuLyoqXG4gKiBTZXRzIGxheW91dCBjbGFzc2VzIG9uIGFuIGVsZW1lbnQgZHluYW1pY2FsbHlcbiAqIFVzZWZ1bCBmb3IgcHJvZ3JhbW1hdGljIGxheW91dCB1cGRhdGVzXG4gKlxuICogQHBhcmFtIGVsZW1lbnQgLSBUYXJnZXQgZWxlbWVudFxuICogQHBhcmFtIGxheW91dFR5cGUgLSBMYXlvdXQgdHlwZSB0byBhcHBseVxuICogQHBhcmFtIGNsYXNzZXMgLSBBZGRpdGlvbmFsIGNsYXNzZXMgdG8gYXBwbHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldExheW91dENsYXNzZXMoXG4gIGVsZW1lbnQ6IGFueSxcbiAgbGF5b3V0VHlwZTogc3RyaW5nLFxuICBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdXG4pOiB2b2lkIHtcbiAgaWYgKCFlbGVtZW50IHx8ICFsYXlvdXRUeXBlKSByZXR1cm47XG5cbiAgLy8gQ2xlYW4gdXAgZXhpc3RpbmcgbGF5b3V0IGNsYXNzZXMgZmlyc3RcbiAgY2xlYW51cExheW91dENsYXNzZXMoZWxlbWVudCk7XG5cbiAgLy8gQXBwbHkgYmFzZSBsYXlvdXQgdHlwZVxuICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tJHtsYXlvdXRUeXBlfWApO1xuXG4gIC8vIEFwcGx5IGFkZGl0aW9uYWwgY2xhc3Nlc1xuICBjbGFzc2VzLmZvckVhY2goKGNscykgPT4ge1xuICAgIGlmIChjbHMuc3RhcnRzV2l0aChcImxheW91dC0tXCIpIHx8IGNscy5zdGFydHNXaXRoKFwibGF5b3V0X19cIikpIHtcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9JHtjbHN9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGNscyk7XG4gICAgfVxuICB9KTtcbn1cbiIsCiAgICAiLyoqXG4gKiBAbW9kdWxlIGNvcmUvbGF5b3V0L2pzeFxuICogQGRlc2NyaXB0aW9uIEpTWC1saWtlIHN5bnRheCBzdXBwb3J0IGZvciBsYXlvdXQgY3JlYXRpb25cbiAqIFByb3ZpZGVzIGEgc2ltcGxlIGgoKSBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgZWxlbWVudHMgd2l0aG91dCBSZWFjdCBkZXBlbmRlbmN5XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBMYXlvdXRSZXN1bHQgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlTGF5b3V0IH0gZnJvbSBcIi4vc2NoZW1hXCI7XG5cbi8qKlxuICogRnJhZ21lbnQgc3ltYm9sIGZvciBKU1ggZnJhZ21lbnRzXG4gKi9cbmV4cG9ydCBjb25zdCBGcmFnbWVudCA9IFN5bWJvbChcIkZyYWdtZW50XCIpO1xuXG4vKipcbiAqIEpTWC1saWtlIGh5cGVyc2NyaXB0IGZ1bmN0aW9uXG4gKiBDcmVhdGVzIGVsZW1lbnRzIGluIGEgUmVhY3QtbGlrZSBzeW50YXggd2l0aG91dCBSZWFjdCBkZXBlbmRlbmN5XG4gKlxuICogQHBhcmFtIHRhZyAtIEhUTUwgdGFnIG5hbWUsIGNvbXBvbmVudCBmdW5jdGlvbiwgb3IgRnJhZ21lbnRcbiAqIEBwYXJhbSBwcm9wcyAtIEVsZW1lbnQgcHJvcGVydGllcyBhbmQgYXR0cmlidXRlc1xuICogQHBhcmFtIGNoaWxkcmVuIC0gQ2hpbGQgZWxlbWVudHNcbiAqIEByZXR1cm5zIERPTSBlbGVtZW50IG9yIGNvbXBvbmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gaChcbiAgdGFnOiBzdHJpbmcgfCBGdW5jdGlvbiB8IHR5cGVvZiBGcmFnbWVudCxcbiAgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCxcbiAgLi4uY2hpbGRyZW46IGFueVtdXG4pOiBhbnkge1xuICAvLyBIYW5kbGUgRnJhZ21lbnRcbiAgaWYgKHRhZyA9PT0gRnJhZ21lbnQpIHtcbiAgICBjb25zdCBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICBjaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgaWYgKGNoaWxkICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9XG4gICAgICAgICAgdHlwZW9mIGNoaWxkID09PSBcInN0cmluZ1wiID8gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY2hpbGQpIDogY2hpbGQ7XG4gICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmcmFnbWVudDtcbiAgfVxuXG4gIC8vIEhhbmRsZSBzdHJpbmcgdGFncyAoSFRNTCBlbGVtZW50cylcbiAgaWYgKHR5cGVvZiB0YWcgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpO1xuXG4gICAgLy8gQXBwbHkgcHJvcHNcbiAgICBpZiAocHJvcHMpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BzKSkge1xuICAgICAgICBpZiAoa2V5ID09PSBcImNsYXNzTmFtZVwiIHx8IGtleSA9PT0gXCJjbGFzc1wiKSB7XG4gICAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkuc3RhcnRzV2l0aChcIm9uXCIpICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gRXZlbnQgaGFuZGxlclxuICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGtleS5zbGljZSgyKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09IFwic3R5bGVcIiAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAvLyBTdHlsZSBvYmplY3RcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09IFwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIikge1xuICAgICAgICAgIC8vIEhUTUwgY29udGVudFxuICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gdmFsdWUuX19odG1sIHx8IFwiXCI7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIFJlZ3VsYXIgYXR0cmlidXRlXG4gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFwcGVuZCBjaGlsZHJlblxuICAgIGNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICBpZiAoY2hpbGQgIT0gbnVsbCkge1xuICAgICAgICBpZiAodHlwZW9mIGNoaWxkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjaGlsZCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgTm9kZSkge1xuICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nKGNoaWxkKSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIC8vIEhhbmRsZSBjb21wb25lbnQgZnVuY3Rpb25zXG4gIGlmICh0eXBlb2YgdGFnID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zdCBhbGxQcm9wcyA9IHByb3BzIHx8IHt9O1xuICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICBhbGxQcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgIH1cbiAgICByZXR1cm4gdGFnKGFsbFByb3BzKTtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrIHRvIGRpdlxuICByZXR1cm4gaChcImRpdlwiLCBwcm9wcywgLi4uY2hpbGRyZW4pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsYXlvdXQgdXNpbmcgSlNYLWxpa2Ugc3ludGF4XG4gKiBQcm92aWRlcyBhIGJyaWRnZSBiZXR3ZWVuIEpTWCBhbmQgdGhlIGxheW91dCBzeXN0ZW1cbiAqXG4gKiBAcGFyYW0ganN4RWxlbWVudCAtIEpTWCBlbGVtZW50IGNyZWF0ZWQgd2l0aCBoKClcbiAqIEBwYXJhbSBwYXJlbnRFbGVtZW50IC0gUGFyZW50IGVsZW1lbnQgdG8gYXR0YWNoIHRvXG4gKiBAcmV0dXJucyBMYXlvdXQgcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVKc3hMYXlvdXQoXG4gIGpzeEVsZW1lbnQ6IGFueSxcbiAgcGFyZW50RWxlbWVudD86IGFueVxuKTogTGF5b3V0UmVzdWx0IHtcbiAgLy8gQ29udmVydCBKU1ggZWxlbWVudCB0byBsYXlvdXQgc2NoZW1hXG4gIGNvbnN0IHNjaGVtYSA9IGpzeEVsZW1lbnQ7XG5cbiAgLy8gQ3JlYXRlIGxheW91dCB1c2luZyB0aGUgc3RhbmRhcmQgY3JlYXRlTGF5b3V0IGZ1bmN0aW9uXG4gIHJldHVybiBjcmVhdGVMYXlvdXQoc2NoZW1hLCBwYXJlbnRFbGVtZW50KTtcbn1cblxuLyoqXG4gKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIHNpbXBsZSBjb21wb25lbnQgZnJvbSBhIGZ1bmN0aW9uXG4gKiBVc2VmdWwgZm9yIGNyZWF0aW5nIHJldXNhYmxlIEpTWCBjb21wb25lbnRzXG4gKlxuICogQHBhcmFtIGZuIC0gQ29tcG9uZW50IGZ1bmN0aW9uXG4gKiBAcmV0dXJucyBDb21wb25lbnQgdGhhdCBjYW4gYmUgdXNlZCBpbiBKU1hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvbmVudChmbjogKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBhbnkpOiBGdW5jdGlvbiB7XG4gIHJldHVybiBmdW5jdGlvbiAocHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBhbnkge1xuICAgIHJldHVybiBmbihwcm9wcyB8fCB7fSk7XG4gIH07XG59XG5cbi8qKlxuICogVXRpbGl0eSB0byByZW5kZXIgbXVsdGlwbGUgSlNYIGVsZW1lbnRzXG4gKiBVc2VmdWwgZm9yIGNyZWF0aW5nIGxpc3RzIG9yIGNvbGxlY3Rpb25zXG4gKlxuICogQHBhcmFtIGVsZW1lbnRzIC0gQXJyYXkgb2YgSlNYIGVsZW1lbnRzXG4gKiBAcGFyYW0gcGFyZW50RWxlbWVudCAtIFBhcmVudCBlbGVtZW50IHRvIGF0dGFjaCB0b1xuICogQHJldHVybnMgQXJyYXkgb2YgbGF5b3V0IHJlc3VsdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckVsZW1lbnRzKFxuICBlbGVtZW50czogYW55W10sXG4gIHBhcmVudEVsZW1lbnQ/OiBhbnlcbik6IExheW91dFJlc3VsdFtdIHtcbiAgcmV0dXJuIGVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4gY3JlYXRlSnN4TGF5b3V0KGVsZW1lbnQsIHBhcmVudEVsZW1lbnQpKTtcbn1cblxuLyoqXG4gKiBDb21tb24gSlNYIGVsZW1lbnQgY3JlYXRvcnMgZm9yIGNvbnZlbmllbmNlXG4gKi9cbmV4cG9ydCBjb25zdCBqc3ggPSB7XG4gIGRpdjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJkaXZcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgc3BhbjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJzcGFuXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIHA6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwicFwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxuICBidXR0b246IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwiYnV0dG9uXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIGlucHV0OiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBoKFwiaW5wdXRcIiwgcHJvcHMpLFxuICBpbWc6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IGgoXCJpbWdcIiwgcHJvcHMpLFxuICBhOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcImFcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgdWw6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwidWxcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgbGk6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwibGlcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgc2VjdGlvbjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJzZWN0aW9uXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIGhlYWRlcjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJoZWFkZXJcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgZm9vdGVyOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcImZvb3RlclwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxuICBtYWluOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcIm1haW5cIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgYXJ0aWNsZTogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJhcnRpY2xlXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG59O1xuIiwKICAgICIvKipcbiAqIFZpZXdwb3J0IC0gQ29yZSB2aXJ0dWFsIHNjcm9sbGluZyBlbmdpbmVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIFZpZXdwb3J0Q29uZmlnLFxuICBWaWV3cG9ydENvbnRleHQsXG4gIFZpZXdwb3J0Q29tcG9uZW50LFxuICBJdGVtUmFuZ2UsXG4gIFZpZXdwb3J0SW5mbyxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IHBpcGUgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgd2l0aEJhc2UgfSBmcm9tIFwiLi9mZWF0dXJlcy9iYXNlXCI7XG5pbXBvcnQgeyB3aXRoVmlydHVhbCB9IGZyb20gXCIuL2ZlYXR1cmVzL3ZpcnR1YWxcIjtcbmltcG9ydCB7IHdpdGhTY3JvbGxpbmcgfSBmcm9tIFwiLi9mZWF0dXJlcy9zY3JvbGxpbmdcIjtcbmltcG9ydCB7IHdpdGhNb21lbnR1bSB9IGZyb20gXCIuL2ZlYXR1cmVzL21vbWVudHVtXCI7XG5pbXBvcnQgeyB3aXRoU2Nyb2xsYmFyIH0gZnJvbSBcIi4vZmVhdHVyZXMvc2Nyb2xsYmFyXCI7XG5pbXBvcnQgeyB3aXRoQ29sbGVjdGlvbiB9IGZyb20gXCIuL2ZlYXR1cmVzL2NvbGxlY3Rpb25cIjtcbmltcG9ydCB7IHdpdGhQbGFjZWhvbGRlcnMgfSBmcm9tIFwiLi9mZWF0dXJlcy9wbGFjZWhvbGRlcnNcIjtcbmltcG9ydCB7IHdpdGhSZW5kZXJpbmcgfSBmcm9tIFwiLi9mZWF0dXJlcy9yZW5kZXJpbmdcIjtcbmltcG9ydCB7IHdpdGhFdmVudHMgfSBmcm9tIFwiLi9mZWF0dXJlcy9ldmVudHNcIjtcblxuLy8gSW50ZXJuYWwgdmlld3BvcnQgc3RhdGVcbmludGVyZmFjZSBWaWV3cG9ydFN0YXRlIHtcbiAgc2Nyb2xsUG9zaXRpb246IG51bWJlcjtcbiAgdG90YWxJdGVtczogbnVtYmVyO1xuICBpdGVtU2l6ZTogbnVtYmVyO1xuICBjb250YWluZXJTaXplOiBudW1iZXI7XG4gIHZpcnR1YWxUb3RhbFNpemU6IG51bWJlcjtcbiAgdmlzaWJsZVJhbmdlOiBJdGVtUmFuZ2U7XG4gIGl0ZW1zQ29udGFpbmVyOiBIVE1MRWxlbWVudCB8IG51bGw7XG4gIHZlbG9jaXR5OiBudW1iZXI7XG4gIHNjcm9sbERpcmVjdGlvbjogXCJmb3J3YXJkXCIgfCBcImJhY2t3YXJkXCI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHZpZXdwb3J0LWVuaGFuY2VkIGNvbXBvbmVudCB1c2luZyBjb21wb3NpdGlvblxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBWaWV3cG9ydCBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBGdW5jdGlvbiB0aGF0IGVuaGFuY2VzIGEgY29tcG9uZW50IHdpdGggdmlld3BvcnQgY2FwYWJpbGl0aWVzXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVWaWV3cG9ydCA9IChjb25maWc6IFZpZXdwb3J0Q29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0Pihjb21wb25lbnQ6IFQpOiBUICYgVmlld3BvcnRDb21wb25lbnQgPT4ge1xuICAgIC8vIFRyYWNrIGlmIHZpZXdwb3J0IGhhcyBiZWVuIGluaXRpYWxpemVkIHRvIHByZXZlbnQgbXVsdGlwbGUgaW5pdGlhbGl6YXRpb25zXG4gICAgbGV0IGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAgIC8vIE5vIG5vcm1hbGl6YXRpb24gbmVlZGVkIC0gd2UnbGwgdXNlIHRoZSBuZXN0ZWQgc3RydWN0dXJlIGRpcmVjdGx5XG5cbiAgICAvLyBDcmVhdGUgc2hhcmVkIHZpZXdwb3J0IHN0YXRlXG4gICAgY29uc3Qgc3RhdGU6IFZpZXdwb3J0U3RhdGUgPSB7XG4gICAgICBzY3JvbGxQb3NpdGlvbjogMCxcbiAgICAgIHRvdGFsSXRlbXM6IGNvbXBvbmVudC50b3RhbEl0ZW1zIHx8IDAsXG4gICAgICBpdGVtU2l6ZTogY29uZmlnLnZpcnR1YWw/Lml0ZW1TaXplIHx8IDUwLFxuICAgICAgY29udGFpbmVyU2l6ZTogMCxcbiAgICAgIHZpcnR1YWxUb3RhbFNpemU6IDAsXG4gICAgICB2aXNpYmxlUmFuZ2U6IHsgc3RhcnQ6IDAsIGVuZDogMCB9LFxuICAgICAgaXRlbXNDb250YWluZXI6IG51bGwsXG4gICAgICB2ZWxvY2l0eTogMCxcbiAgICAgIHNjcm9sbERpcmVjdGlvbjogXCJmb3J3YXJkXCIsXG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSBiYXNlIHZpZXdwb3J0IEFQSVxuICAgIGNvbnN0IHZpZXdwb3J0QVBJID0ge1xuICAgICAgLy8gQ29yZSBBUElcbiAgICAgIGluaXRpYWxpemU6ICgpID0+IHtcbiAgICAgICAgLy8gUHJldmVudCBtdWx0aXBsZSBpbml0aWFsaXphdGlvbnNcbiAgICAgICAgaWYgKGlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaXNJbml0aWFsaXplZCA9IHRydWU7XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJbVmlld3BvcnRdIEluaXRpYWxpemluZyB3aXRoIHN0YXRlOlwiLCB7XG4gICAgICAgIC8vICAgZWxlbWVudDogISFjb21wb25lbnQuZWxlbWVudCxcbiAgICAgICAgLy8gICB0b3RhbEl0ZW1zOiBjb21wb25lbnQudG90YWxJdGVtcyxcbiAgICAgICAgLy8gICBpdGVtU2l6ZTogY29uZmlnLnZpcnR1YWw/Lml0ZW1TaXplLFxuICAgICAgICAvLyB9KTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIGNvbnRhaW5lciBzaXplXG4gICAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICAgIHN0YXRlLmNvbnRhaW5lclNpemUgPVxuICAgICAgICAgICAgY29uZmlnLnNjcm9sbGluZz8ub3JpZW50YXRpb24gPT09IFwiaG9yaXpvbnRhbFwiXG4gICAgICAgICAgICAgID8gY29tcG9uZW50LmVsZW1lbnQub2Zmc2V0V2lkdGhcbiAgICAgICAgICAgICAgOiBjb21wb25lbnQuZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG5cbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltWaWV3cG9ydF0gQ29udGFpbmVyIHNpemU6XCIsIHN0YXRlLmNvbnRhaW5lclNpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIGluaXRpYWwgdmlydHVhbCBzaXplXG4gICAgICAgIHN0YXRlLnZpcnR1YWxUb3RhbFNpemUgPSBzdGF0ZS50b3RhbEl0ZW1zICogc3RhdGUuaXRlbVNpemU7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIGluaXRpYWwgdmlzaWJsZSByYW5nZVxuICAgICAgICBzdGF0ZS52aXNpYmxlUmFuZ2UgPSBjYWxjdWxhdGVWaXNpYmxlUmFuZ2Uoc3RhdGUuc2Nyb2xsUG9zaXRpb24pO1xuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1ZpZXdwb3J0XSBJbml0aWFsIHN0YXRlOlwiLCB7XG4gICAgICAgIC8vICAgY29udGFpbmVyU2l6ZTogc3RhdGUuY29udGFpbmVyU2l6ZSxcbiAgICAgICAgLy8gICB2aXJ0dWFsVG90YWxTaXplOiBzdGF0ZS52aXJ0dWFsVG90YWxTaXplLFxuICAgICAgICAvLyAgIHZpc2libGVSYW5nZTogc3RhdGUudmlzaWJsZVJhbmdlLFxuICAgICAgICAvLyB9KTtcbiAgICAgIH0sXG5cbiAgICAgIGRlc3Ryb3k6ICgpID0+IHtcbiAgICAgICAgLy8gQ2xlYW51cCB3aWxsIGJlIGhhbmRsZWQgYnkgZmVhdHVyZXNcbiAgICAgIH0sXG5cbiAgICAgIHVwZGF0ZVZpZXdwb3J0OiAoKSA9PiB7XG4gICAgICAgIC8vIFdpbGwgYmUgaW1wbGVtZW50ZWQgYnkgcmVuZGVyaW5nIGZlYXR1cmVcbiAgICAgIH0sXG5cbiAgICAgIC8vIENoZWNrIGlmIGFscmVhZHkgaW5pdGlhbGl6ZWRcbiAgICAgIGlzSW5pdGlhbGl6ZWQ6ICgpID0+IGlzSW5pdGlhbGl6ZWQsXG5cbiAgICAgIC8vIEFsbG93IGZlYXR1cmVzIHRvIGNoZWNrIGlmIGluaXQgc2hvdWxkIHByb2NlZWRcbiAgICAgIF9zaG91bGRJbml0OiAoKSA9PiAhaXNJbml0aWFsaXplZCxcblxuICAgICAgLy8gU2Nyb2xsaW5nIEFQSSAod2lsbCBiZSBvdmVycmlkZGVuIGJ5IHNjcm9sbGluZyBmZWF0dXJlKVxuICAgICAgc2Nyb2xsVG9JbmRleDogKFxuICAgICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgICBhbGlnbm1lbnQ/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIixcbiAgICAgICkgPT4ge1xuICAgICAgICAvLyBQbGFjZWhvbGRlciAtIHdpbGwgYmUgaW1wbGVtZW50ZWQgYnkgc2Nyb2xsaW5nIGZlYXR1cmVcbiAgICAgIH0sXG5cbiAgICAgIHNjcm9sbFRvUG9zaXRpb246IChwb3NpdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgICAgIC8vIFdpbGwgYmUgaW1wbGVtZW50ZWQgYnkgc2Nyb2xsaW5nIGZlYXR1cmVcbiAgICAgIH0sXG5cbiAgICAgIGdldFNjcm9sbFBvc2l0aW9uOiAoKSA9PiBzdGF0ZS5zY3JvbGxQb3NpdGlvbixcblxuICAgICAgLy8gSW5mbyBBUElcbiAgICAgIGdldFZpc2libGVSYW5nZTogKCkgPT4gc3RhdGUudmlzaWJsZVJhbmdlLFxuXG4gICAgICBnZXRWaWV3cG9ydEluZm86ICgpOiBWaWV3cG9ydEluZm8gPT4gKHtcbiAgICAgICAgY29udGFpbmVyU2l6ZTogc3RhdGUuY29udGFpbmVyU2l6ZSxcbiAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZTogc3RhdGUudmlydHVhbFRvdGFsU2l6ZSxcbiAgICAgICAgdmlzaWJsZVJhbmdlOiBzdGF0ZS52aXNpYmxlUmFuZ2UsXG4gICAgICAgIHZpcnR1YWxTY3JvbGxQb3NpdGlvbjogc3RhdGUuc2Nyb2xsUG9zaXRpb24sXG4gICAgICB9KSxcblxuICAgICAgLy8gUmVuZGVyaW5nIEFQSVxuICAgICAgcmVuZGVySXRlbXM6ICgpID0+IHtcbiAgICAgICAgLy8gV2lsbCBiZSBpbXBsZW1lbnRlZCBieSByZW5kZXJpbmcgZmVhdHVyZVxuICAgICAgfSxcblxuICAgICAgLy8gSW50ZXJuYWwgc3RhdGUgKGZvciBmZWF0dXJlcyB0byBhY2Nlc3MpXG4gICAgICBzdGF0ZSxcbiAgICB9O1xuXG4gICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB2aXNpYmxlIHJhbmdlXG4gICAgY29uc3QgY2FsY3VsYXRlVmlzaWJsZVJhbmdlID0gKHNjcm9sbFBvczogbnVtYmVyKTogSXRlbVJhbmdlID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1TaXplID0gc3RhdGUuaXRlbVNpemU7XG4gICAgICBjb25zdCBzdGFydCA9IE1hdGguZmxvb3Ioc2Nyb2xsUG9zIC8gaXRlbVNpemUpO1xuICAgICAgY29uc3QgdmlzaWJsZUNvdW50ID0gTWF0aC5jZWlsKHN0YXRlLmNvbnRhaW5lclNpemUgLyBpdGVtU2l6ZSk7XG4gICAgICBjb25zdCBlbmQgPSBNYXRoLm1pbihzdGFydCArIHZpc2libGVDb3VudCwgc3RhdGUudG90YWxJdGVtcyAtIDEpO1xuXG4gICAgICByZXR1cm4geyBzdGFydDogTWF0aC5tYXgoMCwgc3RhcnQpLCBlbmQ6IE1hdGgubWF4KDAsIGVuZCkgfTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIHZpZXdwb3J0IEFQSSB0byBjb21wb25lbnRcbiAgICBjb25zdCBiYXNlQ29tcG9uZW50ID0ge1xuICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgdmlld3BvcnQ6IHZpZXdwb3J0QVBJLFxuICAgIH07XG5cbiAgICAvLyBCdWlsZCB0aGUgZW5oYW5jZW1lbnQgcGlwZWxpbmVcbiAgICBjb25zdCBlbmhhbmNlcnM6IEFycmF5PChjOiBhbnkpID0+IGFueT4gPSBbXTtcblxuICAgIC8vIEV2ZW50cyBzeXN0ZW0gKGFsd2F5cyBmaXJzdCAtIHByb3ZpZGVzIGNvbW11bmljYXRpb24gZm9yIG90aGVyIGZlYXR1cmVzKVxuICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgd2l0aEV2ZW50cyh7XG4gICAgICAgIGRlYnVnOiBjb25maWcuZGVidWcsXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gQmFzZSBzZXR1cCAoY3JlYXRlcyBET00gc3RydWN0dXJlKVxuICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgd2l0aEJhc2Uoe1xuICAgICAgICBjbGFzc05hbWU6IGNvbmZpZy5jbGFzc05hbWUsXG4gICAgICAgIG9yaWVudGF0aW9uOiBjb25maWcuc2Nyb2xsaW5nPy5vcmllbnRhdGlvbixcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBWaXJ0dWFsIHNjcm9sbGluZyAocmVxdWlyZWQgZm9yIG1vc3QgZmVhdHVyZXMpXG4gICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICB3aXRoVmlydHVhbCh7XG4gICAgICAgIGl0ZW1TaXplOiBjb25maWcudmlydHVhbD8uaXRlbVNpemUsXG4gICAgICAgIG92ZXJzY2FuOiBjb25maWcudmlydHVhbD8ub3ZlcnNjYW4sXG4gICAgICAgIG9yaWVudGF0aW9uOiBjb25maWcuc2Nyb2xsaW5nPy5vcmllbnRhdGlvbixcbiAgICAgICAgYXV0b0RldGVjdEl0ZW1TaXplOiBjb25maWcudmlydHVhbD8uYXV0b0RldGVjdEl0ZW1TaXplLFxuICAgICAgICBpbml0aWFsU2Nyb2xsSW5kZXg6IChjb25maWcgYXMgYW55KS5pbml0aWFsU2Nyb2xsSW5kZXgsXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gU2Nyb2xsaW5nIGJlaGF2aW9yXG4gICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICB3aXRoU2Nyb2xsaW5nKHtcbiAgICAgICAgb3JpZW50YXRpb246IGNvbmZpZy5zY3JvbGxpbmc/Lm9yaWVudGF0aW9uLFxuICAgICAgICBzZW5zaXRpdml0eTogY29uZmlnLnNjcm9sbGluZz8uc2Vuc2l0aXZpdHksXG4gICAgICAgIHNtb290aGluZzogY29uZmlnLnNjcm9sbGluZz8uYW5pbWF0aW9uLFxuICAgICAgICBzdG9wT25DbGljazogY29uZmlnLnNjcm9sbGluZz8uc3RvcE9uQ2xpY2ssXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gTW9tZW50dW0gc2Nyb2xsaW5nICh0b3VjaC9kcmFnIHN1cHBvcnQgZm9yIG1vYmlsZSlcbiAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgIHdpdGhNb21lbnR1bSh7XG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIHN0b3BPbkNsaWNrOiBjb25maWcuc2Nyb2xsaW5nPy5zdG9wT25DbGljayxcbiAgICAgICAgZGVjZWxlcmF0aW9uOiBjb25maWcuc2Nyb2xsaW5nPy5tb21lbnR1bT8uZGVjZWxlcmF0aW9uLFxuICAgICAgICBtaW5WZWxvY2l0eTogY29uZmlnLnNjcm9sbGluZz8ubW9tZW50dW0/Lm1pblZlbG9jaXR5LFxuICAgICAgICBtaW5EdXJhdGlvbjogY29uZmlnLnNjcm9sbGluZz8ubW9tZW50dW0/Lm1heER1cmF0aW9uLFxuICAgICAgICBtaW5WZWxvY2l0eVRocmVzaG9sZDogY29uZmlnLnNjcm9sbGluZz8ubW9tZW50dW0/LnZlbG9jaXR5VGhyZXNob2xkLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIFNjcm9sbGJhciAob3B0aW9uYWwpXG4gICAgaWYgKGNvbmZpZy5zY3JvbGxiYXI/LmVuYWJsZWQgIT09IGZhbHNlKSB7XG4gICAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgICAgd2l0aFNjcm9sbGJhcih7XG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBhdXRvSGlkZTogY29uZmlnLnNjcm9sbGJhcj8uYXV0b0hpZGUsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgY29sbGVjdGlvbiBpZiBjb25maWd1cmVkXG4gICAgaWYgKGNvbmZpZy5jb2xsZWN0aW9uPy5hZGFwdGVyKSB7XG4gICAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgICAgd2l0aENvbGxlY3Rpb24oe1xuICAgICAgICAgIGNvbGxlY3Rpb246IGNvbmZpZy5jb2xsZWN0aW9uLmFkYXB0ZXIsXG4gICAgICAgICAgcmFuZ2VTaXplOiBjb25maWcucGFnaW5hdGlvbj8ubGltaXQsXG4gICAgICAgICAgc3RyYXRlZ3k6IGNvbmZpZy5wYWdpbmF0aW9uPy5zdHJhdGVneSBhc1xuICAgICAgICAgICAgfCBcIm9mZnNldFwiXG4gICAgICAgICAgICB8IFwicGFnZVwiXG4gICAgICAgICAgICB8IFwiY3Vyc29yXCJcbiAgICAgICAgICAgIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHRyYW5zZm9ybTogY29uZmlnLmNvbGxlY3Rpb24/LnRyYW5zZm9ybSxcbiAgICAgICAgICBjYW5jZWxMb2FkVGhyZXNob2xkOiBjb25maWcucGVyZm9ybWFuY2U/LmNhbmNlbExvYWRUaHJlc2hvbGQsXG4gICAgICAgICAgbWF4Q29uY3VycmVudFJlcXVlc3RzOiBjb25maWcucGVyZm9ybWFuY2U/Lm1heENvbmN1cnJlbnRSZXF1ZXN0cyxcbiAgICAgICAgICBlbmFibGVSZXF1ZXN0UXVldWU6IGNvbmZpZy5wZXJmb3JtYW5jZT8uZW5hYmxlUmVxdWVzdFF1ZXVlICE9PSBmYWxzZSxcbiAgICAgICAgICBpbml0aWFsU2Nyb2xsSW5kZXg6IChjb25maWcgYXMgYW55KS5pbml0aWFsU2Nyb2xsSW5kZXgsXG4gICAgICAgICAgc2VsZWN0SWQ6IChjb25maWcgYXMgYW55KS5zZWxlY3RJZCxcbiAgICAgICAgICBhdXRvTG9hZDogKGNvbmZpZyBhcyBhbnkpLmF1dG9Mb2FkICE9PSBmYWxzZSxcbiAgICAgICAgICBhdXRvU2VsZWN0Rmlyc3Q6IChjb25maWcgYXMgYW55KS5hdXRvU2VsZWN0Rmlyc3QsXG4gICAgICAgICAgbWF4Q2FjaGVkSXRlbXM6IGNvbmZpZy5jYWNoZT8ubWF4SXRlbXMsXG4gICAgICAgICAgZXZpY3Rpb25CdWZmZXI6IGNvbmZpZy5jYWNoZT8uZXZpY3Rpb25CdWZmZXIsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBQbGFjZWhvbGRlcnMgKG9wdGlvbmFsLCByZXF1aXJlcyBjb2xsZWN0aW9uKVxuICAgIGlmIChjb25maWcuY29sbGVjdGlvbj8uYWRhcHRlciAmJiBjb25maWcucGxhY2Vob2xkZXJzPy5lbmFibGVkICE9PSBmYWxzZSkge1xuICAgICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICAgIHdpdGhQbGFjZWhvbGRlcnMoe1xuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgYW5hbHl6ZUZpcnN0TG9hZDogY29uZmlnLnBsYWNlaG9sZGVycz8uYW5hbHl6ZUZpcnN0TG9hZCA/PyB0cnVlLFxuICAgICAgICAgIG1hc2tDaGFyYWN0ZXI6IGNvbmZpZy5wbGFjZWhvbGRlcnM/Lm1hc2tDaGFyYWN0ZXIsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBSZW5kZXJpbmcgKGFsd2F5cyBsYXN0IHRvIGhhdmUgYWNjZXNzIHRvIGFsbCBmZWF0dXJlcylcbiAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgIHdpdGhSZW5kZXJpbmcoe1xuICAgICAgICB0ZW1wbGF0ZTogY29uZmlnLnRlbXBsYXRlLFxuICAgICAgICBvdmVyc2NhbjogY29uZmlnLnZpcnR1YWw/Lm92ZXJzY2FuLFxuICAgICAgICBtYWludGFpbkRvbU9yZGVyOiBjb25maWcucmVuZGVyaW5nPy5tYWludGFpbkRvbU9yZGVyLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIENvbXBvc2UgYWxsIGVuaGFuY2Vyc1xuICAgIGNvbnN0IGVuaGFuY2UgPSBwaXBlKC4uLmVuaGFuY2Vycyk7XG5cbiAgICAvLyBBcHBseSBlbmhhbmNlbWVudHNcbiAgICBjb25zdCBlbmhhbmNlZCA9IGVuaGFuY2UoYmFzZUNvbXBvbmVudCk7XG5cbiAgICAvLyBBdXRvLWluaXRpYWxpemUgaWYgZWxlbWVudCBpcyBwcm92aWRlZFxuICAgIGlmIChlbmhhbmNlZC5lbGVtZW50KSB7XG4gICAgICBlbmhhbmNlZC52aWV3cG9ydC5pbml0aWFsaXplKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVuaGFuY2VkIGFzIFQgJiBWaWV3cG9ydENvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3V0aWxzLnRzXG5cbi8qKlxuICogU2hhcmVkIHV0aWxpdGllcyBmb3Igdmlld3BvcnQgZmVhdHVyZXNcbiAqIEVsaW1pbmF0ZXMgY29kZSBkdXBsaWNhdGlvbiBhY3Jvc3MgZmVhdHVyZXNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBXcmFwcyB2aWV3cG9ydCBpbml0aWFsaXphdGlvbiB3aXRoIGZlYXR1cmUtc3BlY2lmaWMgbG9naWNcbiAqIEVsaW1pbmF0ZXMgdGhlIHJlcGVhdGVkIGluaXRpYWxpemF0aW9uIGhvb2sgcGF0dGVyblxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JhcEluaXRpYWxpemU8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50PihcbiAgY29tcG9uZW50OiBULFxuICBmZWF0dXJlSW5pdDogKCkgPT4gdm9pZCxcbik6IHZvaWQge1xuICBjb25zdCBvcmlnaW5hbEluaXRpYWxpemUgPSBjb21wb25lbnQudmlld3BvcnQuaW5pdGlhbGl6ZTtcbiAgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBpbml0aWFsaXplZCAocmV0dXJucyBmYWxzZSBpZiBhbHJlYWR5IGRvbmUpXG4gICAgY29uc3QgcmVzdWx0ID0gb3JpZ2luYWxJbml0aWFsaXplKCk7XG4gICAgLy8gT25seSBydW4gZmVhdHVyZSBpbml0IGlmIGJhc2UgaW5pdCBhY3R1YWxseSByYW4gKGRpZG4ndCByZXR1cm4gZmFsc2UpXG4gICAgaWYgKHJlc3VsdCAhPT0gZmFsc2UpIHtcbiAgICAgIGZlYXR1cmVJbml0KCk7XG4gICAgfVxuICAgIC8vIFByb3BhZ2F0ZSB0aGUgcmVzdWx0IHRocm91Z2ggdGhlIGNoYWluIHNvIG91dGVyIHdyYXBwZXJzIGtub3cgdG8gc2tpcFxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbi8qKlxuICogV3JhcHMgY29tcG9uZW50IGRlc3Ryb3kgd2l0aCBjbGVhbnVwIGxvZ2ljXG4gKiBFbGltaW5hdGVzIHRoZSByZXBlYXRlZCBkZXN0cm95IGhvb2sgcGF0dGVyblxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JhcERlc3Ryb3k8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICBjb21wb25lbnQ6IFQsXG4gIGNsZWFudXA6ICgpID0+IHZvaWQsXG4pOiB2b2lkIHtcbiAgaWYgKFwiZGVzdHJveVwiIGluIGNvbXBvbmVudCAmJiB0eXBlb2YgY29tcG9uZW50LmRlc3Ryb3kgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IGNvbXBvbmVudC5kZXN0cm95O1xuICAgIChjb21wb25lbnQgYXMgYW55KS5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgY2xlYW51cCgpO1xuICAgICAgb3JpZ2luYWxEZXN0cm95Py4oKTtcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogR2V0cyB2aWV3cG9ydCBzdGF0ZSB3aXRoIHByb3BlciB0eXBpbmdcbiAqIEVsaW1pbmF0ZXMgcmVwZWF0ZWQgKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLnN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWaWV3cG9ydFN0YXRlKGNvbXBvbmVudDogVmlld3BvcnRDb21wb25lbnQpOiBhbnkge1xuICByZXR1cm4gKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLnN0YXRlO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhbiBpdGVtIGlzIGEgcGxhY2Vob2xkZXJcbiAqIEVsaW1pbmF0ZXMgZHVwbGljYXRlZCBwbGFjZWhvbGRlciBkZXRlY3Rpb24gbG9naWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGxhY2Vob2xkZXIoaXRlbTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgaXRlbSAmJlxuICAgIHR5cGVvZiBpdGVtID09PSBcIm9iamVjdFwiICYmXG4gICAgKGl0ZW0uX3BsYWNlaG9sZGVyID09PSB0cnVlIHx8IGl0ZW1bXCJfcGxhY2Vob2xkZXJcIl0gPT09IHRydWUpIC8vIFN1cHBvcnQgYm90aCBhY2Nlc3MgcGF0dGVybnNcbiAgKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcmFuZ2Uga2V5IGZvciBkZWR1cGxpY2F0aW9uXG4gKiBVc2VkIGJ5IG11bHRpcGxlIGZlYXR1cmVzIGZvciB0cmFja2luZyByYW5nZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJhbmdlS2V5KHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7cmFuZ2Uuc3RhcnR9LSR7cmFuZ2UuZW5kfWA7XG59XG5cbi8qKlxuICogQ2xhbXBzIGEgdmFsdWUgYmV0d2VlbiBtaW4gYW5kIG1heFxuICogVXNlZCBieSBtdWx0aXBsZSBmZWF0dXJlcyBmb3IgYm91bmRhcnkgY2hlY2tpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYW1wKHZhbHVlOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLm1heChtaW4sIE1hdGgubWluKG1heCwgdmFsdWUpKTtcbn1cblxuLyoqXG4gKiBTdG9yZXMgYSBmdW5jdGlvbiByZWZlcmVuY2Ugb24gdGhlIGNvbXBvbmVudCBmb3IgbGF0ZXIgYWNjZXNzXG4gKiBFbGltaW5hdGVzIHBhdHRlcm4gbGlrZSAoY29tcG9uZW50IGFzIGFueSkuX2ZlYXR1cmVGdW5jdGlvbiA9IGZuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdG9yZUZlYXR1cmVGdW5jdGlvbjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gIGNvbXBvbmVudDogVCxcbiAgbmFtZTogc3RyaW5nLFxuICBmbjogRnVuY3Rpb24sXG4pOiB2b2lkIHtcbiAgKGNvbXBvbmVudCBhcyBhbnkpW25hbWVdID0gZm47XG59XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL2Jhc2UudHNcblxuLyoqXG4gKiBCYXNlIFZpZXdwb3J0IEZlYXR1cmUgLSBTZXRzIHVwIGNvcmUgdmlld3BvcnQgc3RydWN0dXJlXG4gKiBQcm92aWRlcyB0aGUgZm91bmRhdGlvbiBmb3Igb3RoZXIgdmlld3BvcnQgZmVhdHVyZXNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IHdyYXBJbml0aWFsaXplLCBnZXRWaWV3cG9ydFN0YXRlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBCYXNlQ29uZmlnIHtcbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xuICBvcmllbnRhdGlvbj86IFwidmVydGljYWxcIiB8IFwiaG9yaXpvbnRhbFwiO1xufVxuXG4vKipcbiAqIEJhc2UgZmVhdHVyZSBmb3Igdmlld3BvcnRcbiAqIFNldHMgdXAgdGhlIERPTSBzdHJ1Y3R1cmUgYW5kIGNvcmUgc3R5bGVzXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoQmFzZSA9IChjb25maWc6IEJhc2VDb25maWcgPSB7fSkgPT4ge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBWaWV3cG9ydENvbXBvbmVudD4oY29tcG9uZW50OiBUKTogVCA9PiB7XG4gICAgY29uc3QgeyBjbGFzc05hbWUgPSBcIm10cmwtdmlld3BvcnRcIiwgb3JpZW50YXRpb24gPSBcInZlcnRpY2FsXCIgfSA9IGNvbmZpZztcblxuICAgIC8vIFVzZSB0aGUgc2hhcmVkIHdyYXBwZXIgdXRpbGl0eVxuICAgIHdyYXBJbml0aWFsaXplKGNvbXBvbmVudCwgKCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGNvbXBvbmVudC5lbGVtZW50O1xuICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm47XG5cbiAgICAgIC8vIENyZWF0ZSB2aWV3cG9ydCBzdHJ1Y3R1cmVcbiAgICAgIGxldCB2aWV3cG9ydEVsZW1lbnQgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIFwiLm10cmwtdmlld3BvcnRcIlxuICAgICAgKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgaWYgKCF2aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LnN0eWxlLmNzc1RleHQgPSBgXG4gICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICBgO1xuXG4gICAgICAgIC8vIFNldCBvcmllbnRhdGlvblxuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1vcmllbnRhdGlvblwiLCBvcmllbnRhdGlvbik7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGl0ZW1zIGNvbnRhaW5lclxuICAgICAgICBjb25zdCBpdGVtc0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGl0ZW1zQ29udGFpbmVyLmNsYXNzTmFtZSA9IFwibXRybC12aWV3cG9ydC1pdGVtc1wiO1xuICAgICAgICBpdGVtc0NvbnRhaW5lci5zdHlsZS5jc3NUZXh0ID0gYFxuICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgYDtcblxuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYXBwZW5kQ2hpbGQoaXRlbXNDb250YWluZXIpO1xuICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKHZpZXdwb3J0RWxlbWVudCk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHZpZXdwb3J0IHN0YXRlIHdpdGggY29udGFpbmVycyB1c2luZyB1dGlsaXR5XG4gICAgICAgIGNvbnN0IHN0YXRlID0gZ2V0Vmlld3BvcnRTdGF0ZShjb21wb25lbnQpO1xuICAgICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgICBzdGF0ZS52aWV3cG9ydEVsZW1lbnQgPSB2aWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgICAgc3RhdGUuaXRlbXNDb250YWluZXIgPSBpdGVtc0NvbnRhaW5lcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0b3JlIHJlZmVyZW5jZXMgb24gY29tcG9uZW50XG4gICAgICAgIChjb21wb25lbnQgYXMgYW55KS52aWV3cG9ydEVsZW1lbnQgPSB2aWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgIChjb21wb25lbnQgYXMgYW55KS5pdGVtc0NvbnRhaW5lciA9IGl0ZW1zQ29udGFpbmVyO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2NvbnN0YW50cy50c1xuXG4vKipcbiAqIFZpZXdwb3J0IENvbnN0YW50c1xuICogQ2VudHJhbGl6ZWQgY29uc3RhbnRzIGZvciBhbGwgdmlld3BvcnQgZnVuY3Rpb25hbGl0eVxuICogQ29uc29saWRhdGVkIGZyb20gdmlld3BvcnQsIHZpZXdwb3J0L2ZlYXR1cmVzLCBhbmQgbGlzdC1tYW5hZ2VyIGNvbnN0YW50c1xuICovXG5cbmV4cG9ydCBjb25zdCBWSUVXUE9SVF9DT05TVEFOVFMgPSB7XG4gIC8vIFZpcnR1YWwgc2Nyb2xsaW5nIGRlZmF1bHRzXG4gIFZJUlRVQUxfU0NST0xMOiB7XG4gICAgREVGQVVMVF9JVEVNX1NJWkU6IDQ4LFxuICAgIE9WRVJTQ0FOX0JVRkZFUjogMixcbiAgICBTQ1JPTExfU0VOU0lUSVZJVFk6IDAuNyxcbiAgICBNQVhfVklSVFVBTF9TSVpFOiAxMDAgKiAxMDAwICogMTAwMCwgLy8gMTAwTSBwaXhlbHMgLSBtb2Rlcm4gYnJvd3NlcnMgY2FuIGhhbmRsZSB0aGlzXG4gICAgQVVUT19ERVRFQ1RfSVRFTV9TSVpFOiB0cnVlLCAvLyBFbmFibGUgYXV0b21hdGljIGl0ZW0gc2l6ZSBkZXRlY3Rpb25cbiAgfSxcblxuICAvLyBTY3JvbGxpbmcgc2V0dGluZ3NcbiAgU0NST0xMSU5HOiB7XG4gICAgT1ZFUlNDQU46IDEsIC8vIEZyb20gZmVhdHVyZXMvY29uc3RhbnRzXG4gIH0sXG5cbiAgLy8gUmVuZGVyaW5nIHNldHRpbmdzXG4gIFJFTkRFUklORzoge1xuICAgIC8vIEVsZW1lbnQgcmVjeWNsaW5nXG4gICAgREVGQVVMVF9NQVhfUE9PTF9TSVpFOiAxMDAsXG4gICAgQ0xBU1NFUzoge1xuICAgICAgSVRFTTogXCJ2aWV3cG9ydC1pdGVtXCIsXG4gICAgfSxcbiAgfSxcblxuICAvLyBMb2FkaW5nIHNldHRpbmdzXG4gIExPQURJTkc6IHtcbiAgICBDQU5DRUxfVEhSRVNIT0xEOiAyNSwgLy8gcHgvbXMgLSB2ZWxvY2l0eSBhYm92ZSB3aGljaCBsb2FkcyBjYW5jZWxcbiAgICBNQVhfQ09OQ1VSUkVOVF9SRVFVRVNUUzogMSwgLy8gUGFyYWxsZWwgcmVxdWVzdHMgYWxsb3dlZFxuICAgIERFRkFVTFRfUkFOR0VfU0laRTogMjAsIC8vIEl0ZW1zIHBlciByZXF1ZXN0XG4gICAgREVCT1VOQ0VfTE9BRElORzogMTUwLCAvLyBEZWJvdW5jZSBkZWxheSAobXMpXG4gICAgTUlOX1JBTkdFX1NJWkU6IDEwLCAvLyBNaW5pbXVtIGl0ZW1zIHBlciBsb2FkXG4gICAgTUFYX1JBTkdFX1NJWkU6IDEwMCwgLy8gTWF4aW11bSBpdGVtcyBwZXIgbG9hZFxuICAgIFJFUVVFU1RfVElNRU9VVDogNTAwMCwgLy8gUmVxdWVzdCB0aW1lb3V0IChtcylcbiAgICBSRVRSWV9BVFRFTVBUUzogMiwgLy8gRmFpbGVkIHJlcXVlc3QgcmV0cmllc1xuICAgIFJFVFJZX0RFTEFZOiAxMDAwLCAvLyBEZWxheSBiZXR3ZWVuIHJldHJpZXMgKG1zKVxuICB9LFxuXG4gIC8vIFJlcXVlc3QgcXVldWUgY29uZmlndXJhdGlvbiAoZnJvbSBmZWF0dXJlcy9jb25zdGFudHMpXG4gIFJFUVVFU1RfUVVFVUU6IHtcbiAgICBFTkFCTEVEOiB0cnVlLCAvLyBFbmFibGUgcmVxdWVzdCBxdWV1aW5nXG4gICAgTUFYX1FVRVVFX1NJWkU6IDEsIC8vIE1heCBxdWV1ZWQgcmVxdWVzdHNcbiAgICBNQVhfQUNUSVZFX1JFUVVFU1RTOiAyLCAvLyBNYXggY29uY3VycmVudCBhY3RpdmUgcmVxdWVzdHNcbiAgfSxcblxuICAvLyBQbGFjZWhvbGRlciBzZXR0aW5nc1xuICBQTEFDRUhPTERFUjoge1xuICAgIE1BU0tfQ0hBUkFDVEVSOiBcIlhcIiwgLy8gVXBkYXRlZCBmcm9tIGxpc3QtbWFuYWdlclxuICAgIENMQVNTOiBcInZpZXdwb3J0LWl0ZW0tLXBsYWNlaG9sZGVyXCIsXG4gICAgTUFYX1NBTVBMRV9TSVpFOiAyMCxcbiAgICBQTEFDRUhPTERFUl9GTEFHOiBcIl9wbGFjZWhvbGRlclwiLFxuICAgIFJBTkRPTV9MRU5HVEhfVkFSSUFOQ0U6IHRydWUsXG4gIH0sXG5cbiAgLy8gU3BlZWQgdHJhY2tpbmcgKGZyb20gbGlzdC1tYW5hZ2VyKVxuICBTUEVFRF9UUkFDS0lORzoge1xuICAgIC8vIFZlbG9jaXR5IGNhbGN1bGF0aW9uXG4gICAgREVDRUxFUkFUSU9OX0ZBQ1RPUjogMC44NSwgLy8gdmVsb2NpdHkgZGVjYXkgcGVyIGZyYW1lXG4gIH0sXG5cbiAgLy8gTW9tZW50dW0gc2V0dGluZ3NcbiAgTU9NRU5UVU06IHtcbiAgICBFTkFCTEVEOiBmYWxzZSwgLy8gRW5hYmxlIG1vbWVudHVtIGJ5IGRlZmF1bHRcbiAgICBERUNFTEVSQVRJT05fRkFDVE9SOiAwLjk1LCAvLyBIb3cgcXVpY2tseSB2ZWxvY2l0eSBkZWNyZWFzZXMgcGVyIGZyYW1lIChoaWdoZXIgPSBsb25nZXIgY29hc3QpXG4gICAgTUlOX1ZFTE9DSVRZOiAwLjEsIC8vIE1pbmltdW0gdmVsb2NpdHkgYmVmb3JlIHN0b3BwaW5nIChweC9tcylcbiAgICBNSU5fRFVSQVRJT046IDc1MCwgLy8gTWF4aW11bSBnZXN0dXJlIGR1cmF0aW9uIHRvIHRyaWdnZXIgbW9tZW50dW0gKG1zKVxuICAgIE1JTl9WRUxPQ0lUWV9USFJFU0hPTEQ6IDAuNCwgLy8gTWluaW11bSB2ZWxvY2l0eSB0byB0cmlnZ2VyIG1vbWVudHVtIChweC9tcylcbiAgICBGUkFNRV9USU1FOiAxNiwgLy8gQXNzdW1lZCBmcmFtZSB0aW1lIGZvciBjYWxjdWxhdGlvbnMgKG1zKVxuICB9LFxuXG4gIC8vIEluaXRpYWwgbG9hZCBjb25maWd1cmF0aW9uIChmcm9tIGxpc3QtbWFuYWdlcilcbiAgSU5JVElBTF9MT0FEOiB7XG4gICAgU1RSQVRFR1k6IFwicGxhY2Vob2xkZXJzXCIsIC8vIFwicGxhY2Vob2xkZXJzXCIgfCBcImRpcmVjdFwiIHwgXCJwcm9ncmVzc2l2ZVwiXG4gICAgVklFV1BPUlRfTVVMVElQTElFUjogMS41LCAvLyBsb2FkIDEuNXggdmlld3BvcnQgY2FwYWNpdHlcbiAgICBNSU5fSVRFTVM6IDEwLFxuICAgIE1BWF9JVEVNUzogMTAwLFxuICAgIFBMQUNFSE9MREVSX0NPVU5UOiAyMCwgLy8gZGVmYXVsdCBwbGFjZWhvbGRlciBjb3VudFxuICAgIFNIT1dfTE9BRElOR19TVEFURTogdHJ1ZSxcbiAgICBMT0FESU5HX0RFTEFZOiAxMDAsIC8vIG1zIC0gZGVsYXkgYmVmb3JlIHNob3dpbmcgbG9hZGluZyBzdGF0ZVxuICB9LFxuXG4gIC8vIFNlbGVjdGlvbiBzZXR0aW5nc1xuICBTRUxFQ1RJT046IHtcbiAgICBTRUxFQ1RFRF9DTEFTUzogXCJ2aWV3cG9ydC1pdGVtLS1zZWxlY3RlZFwiLFxuICB9LFxuXG4gIC8vIFNjcm9sbGJhciBzZXR0aW5ncyAoZnJvbSBsaXN0LW1hbmFnZXIpXG4gIFNDUk9MTEJBUjoge1xuICAgIC8vIENTUyBjbGFzc2VzXG4gICAgQ0xBU1NFUzoge1xuICAgICAgU0NST0xMQkFSOiBcInZpZXdwb3J0X19zY3JvbGxiYXJcIixcbiAgICAgIFNDUk9MTEJBUl9UUkFDSzogXCJ2aWV3cG9ydF9fc2Nyb2xsYmFyLXRyYWNrXCIsXG4gICAgICBTQ1JPTExCQVJfVEhVTUI6IFwidmlld3BvcnRfX3Njcm9sbGJhci10aHVtYlwiLFxuICAgICAgU0NST0xMQkFSX1ZJU0lCTEU6IFwidmlld3BvcnRfX3Njcm9sbGJhci0tdmlzaWJsZVwiLFxuICAgICAgU0NST0xMQkFSX0RSQUdHSU5HOiBcInZpZXdwb3J0X19zY3JvbGxiYXItLWRyYWdnaW5nXCIsXG4gICAgICBTQ1JPTExCQVJfVEhVTUJfRFJBR0dJTkc6IFwidmlld3BvcnRfX3Njcm9sbGJhci10aHVtYi0tZHJhZ2dpbmdcIixcbiAgICB9LFxuICB9LFxuXG4gIC8vIE9yaWVudGF0aW9uIChmcm9tIGxpc3QtbWFuYWdlcilcbiAgT1JJRU5UQVRJT046IHtcbiAgICBERUZBVUxUX09SSUVOVEFUSU9OOiBcInZlcnRpY2FsXCIsXG4gICAgREVGQVVMVF9DUk9TU19BWElTX0FMSUdOTUVOVDogXCJzdHJldGNoXCIsXG4gICAgUkVWRVJTRV9ESVJFQ1RJT046IGZhbHNlLFxuICB9LFxuXG4gIFBBR0lOQVRJT046IHtcbiAgICBERUZBVUxUX1NUUkFURUdZOiBcIm9mZnNldFwiIGFzIFwib2Zmc2V0XCIgfCBcInBhZ2VcIiB8IFwiY3Vyc29yXCIsXG4gICAgREVGQVVMVF9MSU1JVDogMjAsXG4gICAgU1RSQVRFR0lFUzoge1xuICAgICAgUEFHRTogXCJwYWdlXCIgYXMgY29uc3QsXG4gICAgICBPRkZTRVQ6IFwib2Zmc2V0XCIgYXMgY29uc3QsXG4gICAgICBDVVJTT1I6IFwiY3Vyc29yXCIgYXMgY29uc3QsXG4gICAgfSxcbiAgICBDVVJTT1JfQ0xFQU5VUF9JTlRFUlZBTDogNjAwMDAsIC8vIENsZWFuIHVwIG9sZCBjdXJzb3JzIGV2ZXJ5IG1pbnV0ZVxuICAgIE1BWF9DVVJTT1JfTUFQX1NJWkU6IDEwMDAsIC8vIE1heGltdW0gbnVtYmVyIG9mIGN1cnNvcnMgdG8ga2VlcCBpbiBtZW1vcnlcbiAgICAvLyBDdXJzb3Itc3BlY2lmaWMgdmlydHVhbCBzaXppbmdcbiAgICBDVVJTT1JfU0NST0xMX01BUkdJTl9NVUxUSVBMSUVSOiAzLCAvLyBNdWx0aXBseSByYW5nZVNpemUgYnkgdGhpcyBmb3Igc2Nyb2xsIG1hcmdpblxuICAgIENVUlNPUl9NSU5fVklSVFVBTF9TSVpFX01VTFRJUExJRVI6IDMsIC8vIE1pbmltdW0gdmlydHVhbCBzaXplIGFzIG11bHRpcGxpZXIgb2YgcmFuZ2VTaXplXG4gIH0sXG59O1xuXG4vKipcbiAqIFR5cGUgZm9yIG92ZXJyaWRpbmcgY29uc3RhbnRzIGF0IHJ1bnRpbWVcbiAqL1xuZXhwb3J0IHR5cGUgVmlld3BvcnRDb25zdGFudHMgPSB0eXBlb2YgVklFV1BPUlRfQ09OU1RBTlRTO1xuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBtZXJnZSB1c2VyIGNvbnN0YW50cyB3aXRoIGRlZmF1bHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUNvbnN0YW50cyhcbiAgdXNlckNvbnN0YW50czogUGFydGlhbDxWaWV3cG9ydENvbnN0YW50cz4gPSB7fSxcbik6IFZpZXdwb3J0Q29uc3RhbnRzIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5WSUVXUE9SVF9DT05TVEFOVFMsXG4gICAgLi4udXNlckNvbnN0YW50cyxcbiAgfTtcbn1cbiIsCiAgICAiLyoqXG4gKiBWaXJ0dWFsIEZlYXR1cmUgLSBDb3JlIHZpcnR1YWwgc2Nyb2xsaW5nIGNhbGN1bGF0aW9uc1xuICogSGFuZGxlcyB2aXNpYmxlIHJhbmdlIGNhbGN1bGF0aW9uIGFuZCB0b3RhbCB2aXJ0dWFsIHNpemUgbWFuYWdlbWVudFxuICovXG5cbmltcG9ydCB0eXBlIHsgVmlld3BvcnRDb250ZXh0LCBWaWV3cG9ydENvbXBvbmVudCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVklFV1BPUlRfQ09OU1RBTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgd3JhcEluaXRpYWxpemUsIGdldFZpZXdwb3J0U3RhdGUgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZpcnR1YWxDb25maWcge1xuICBpdGVtU2l6ZT86IG51bWJlcjtcbiAgb3ZlcnNjYW4/OiBudW1iZXI7XG4gIG9yaWVudGF0aW9uPzogXCJ2ZXJ0aWNhbFwiIHwgXCJob3Jpem9udGFsXCI7XG4gIGF1dG9EZXRlY3RJdGVtU2l6ZT86IGJvb2xlYW47XG4gIGRlYnVnPzogYm9vbGVhbjtcbiAgaW5pdGlhbFNjcm9sbEluZGV4PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFZpcnR1YWwgc2Nyb2xsaW5nIGZlYXR1cmUgZm9yIHZpZXdwb3J0XG4gKiBIYW5kbGVzIHZpc2libGUgcmFuZ2UgY2FsY3VsYXRpb25zIHdpdGggY29tcHJlc3Npb24gZm9yIGxhcmdlIGRhdGFzZXRzXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoVmlydHVhbCA9IChjb25maWc6IFZpcnR1YWxDb25maWcgPSB7fSkgPT4ge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBWaWV3cG9ydENvbXBvbmVudD4oY29tcG9uZW50OiBUKTogVCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgaXRlbVNpemUsXG4gICAgICBvdmVyc2NhbiA9IFZJRVdQT1JUX0NPTlNUQU5UUy5WSVJUVUFMX1NDUk9MTC5PVkVSU0NBTl9CVUZGRVIsXG4gICAgICBvcmllbnRhdGlvbiA9IFwidmVydGljYWxcIixcbiAgICAgIGF1dG9EZXRlY3RJdGVtU2l6ZSA9IGl0ZW1TaXplID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBWSUVXUE9SVF9DT05TVEFOVFMuVklSVFVBTF9TQ1JPTEwuQVVUT19ERVRFQ1RfSVRFTV9TSVpFXG4gICAgICAgIDogZmFsc2UsXG4gICAgICBkZWJ1ZyA9IGZhbHNlLFxuICAgICAgaW5pdGlhbFNjcm9sbEluZGV4ID0gMCxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gVXNlIHByb3ZpZGVkIGl0ZW1TaXplIG9yIGRlZmF1bHQsIGJ1dCBtYXJrIGlmIHdlIHNob3VsZCBhdXRvLWRldGVjdFxuICAgIGNvbnN0IGluaXRpYWxJdGVtU2l6ZSA9XG4gICAgICBpdGVtU2l6ZSB8fCBWSUVXUE9SVF9DT05TVEFOVFMuVklSVFVBTF9TQ1JPTEwuREVGQVVMVF9JVEVNX1NJWkU7XG5cbiAgICBjb25zdCBNQVhfVklSVFVBTF9TSVpFID0gVklFV1BPUlRfQ09OU1RBTlRTLlZJUlRVQUxfU0NST0xMLk1BWF9WSVJUVUFMX1NJWkU7XG4gICAgbGV0IHZpZXdwb3J0U3RhdGU6IGFueTtcbiAgICBsZXQgaGFzQ2FsY3VsYXRlZEl0ZW1TaXplID0gZmFsc2U7XG4gICAgbGV0IGhhc1JlY2FsY3VsYXRlZFNjcm9sbEZvckNvbXByZXNzaW9uID0gZmFsc2U7IC8vIFRyYWNrIGlmIHdlJ3ZlIHJlY2FsY3VsYXRlZCBzY3JvbGwgcG9zaXRpb24gZm9yIGNvbXByZXNzaW9uXG5cbiAgICAvLyBJbml0aWFsaXplIHVzaW5nIHNoYXJlZCB3cmFwcGVyXG4gICAgd3JhcEluaXRpYWxpemUoY29tcG9uZW50LCAoKSA9PiB7XG4gICAgICB2aWV3cG9ydFN0YXRlID0gZ2V0Vmlld3BvcnRTdGF0ZShjb21wb25lbnQpO1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlKSByZXR1cm47XG5cbiAgICAgIE9iamVjdC5hc3NpZ24odmlld3BvcnRTdGF0ZSwge1xuICAgICAgICBpdGVtU2l6ZTogaW5pdGlhbEl0ZW1TaXplLFxuICAgICAgICBvdmVyc2NhbixcbiAgICAgICAgY29udGFpbmVyU2l6ZTpcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnZpZXdwb3J0RWxlbWVudD8uW1xuICAgICAgICAgICAgb3JpZW50YXRpb24gPT09IFwiaG9yaXpvbnRhbFwiID8gXCJvZmZzZXRXaWR0aFwiIDogXCJvZmZzZXRIZWlnaHRcIlxuICAgICAgICAgIF0gfHwgNjAwLFxuICAgICAgfSk7XG5cbiAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUodmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zKTtcblxuICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBpbml0aWFsIHNjcm9sbCBpbmRleCwgY2FsY3VsYXRlIGluaXRpYWwgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAvLyBOb3RlOiBXZSBzdG9yZSB0aGUgaW5pdGlhbFNjcm9sbEluZGV4IHRvIHVzZSBkaXJlY3RseSBpbiByYW5nZSBjYWxjdWxhdGlvbnNcbiAgICAgIC8vIGJlY2F1c2Ugc2Nyb2xsIHBvc2l0aW9uIG1heSBiZSBjb21wcmVzc2VkIGZvciBsYXJnZSBsaXN0c1xuICAgICAgbGV0IGluaXRpYWxTY3JvbGxQb3NpdGlvbiA9IHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gfHwgMDtcblxuICAgICAgaWYgKGluaXRpYWxTY3JvbGxJbmRleCA+IDApIHtcbiAgICAgICAgLy8gU3RvcmUgdGhlIHRhcmdldCBpbmRleCBmb3IgdXNlIGluIHJhbmdlIGNhbGN1bGF0aW9uc1xuICAgICAgICAodmlld3BvcnRTdGF0ZSBhcyBhbnkpLnRhcmdldFNjcm9sbEluZGV4ID0gaW5pdGlhbFNjcm9sbEluZGV4O1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBzY3JvbGwgcG9zaXRpb24gKG1heSBiZSBjb21wcmVzc2VkIGZvciBsYXJnZSBsaXN0cylcbiAgICAgICAgaW5pdGlhbFNjcm9sbFBvc2l0aW9uID1cbiAgICAgICAgICBpbml0aWFsU2Nyb2xsSW5kZXggKiAodmlld3BvcnRTdGF0ZS5pdGVtU2l6ZSB8fCBpbml0aWFsSXRlbVNpemUpO1xuICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID0gaW5pdGlhbFNjcm9sbFBvc2l0aW9uO1xuXG4gICAgICAgIC8vIE5vdGlmeSBzY3JvbGxpbmcgZmVhdHVyZSB0byBzeW5jIGl0cyBsb2NhbCBzY3JvbGwgcG9zaXRpb25cbiAgICAgICAgLy8gVXNlIHNldFRpbWVvdXQgdG8gZW5zdXJlIHNjcm9sbGluZyBmZWF0dXJlIGhhcyBpbml0aWFsaXplZFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6c2Nyb2xsLXBvc2l0aW9uLXN5bmNcIiwge1xuICAgICAgICAgICAgcG9zaXRpb246IGluaXRpYWxTY3JvbGxQb3NpdGlvbixcbiAgICAgICAgICAgIHNvdXJjZTogXCJpbml0aWFsLXNjcm9sbC1pbmRleFwiLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH1cblxuICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKGluaXRpYWxTY3JvbGxQb3NpdGlvbik7XG5cbiAgICAgIC8vIEVuc3VyZSBjb250YWluZXIgc2l6ZSBpcyBtZWFzdXJlZCBhZnRlciBET00gaXMgcmVhZHlcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHVwZGF0ZUNvbnRhaW5lclNpemUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gSGVscGVyIGZ1bmN0aW9uc1xuICAgIGNvbnN0IGdldENvbXByZXNzaW9uUmF0aW8gPSAoKTogbnVtYmVyID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZT8udmlydHVhbFRvdGFsU2l6ZSkgcmV0dXJuIDE7XG4gICAgICBjb25zdCBhY3R1YWxTaXplID0gdmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zICogdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZTtcbiAgICAgIHJldHVybiBhY3R1YWxTaXplIDw9IE1BWF9WSVJUVUFMX1NJWkUgPyAxIDogTUFYX1ZJUlRVQUxfU0laRSAvIGFjdHVhbFNpemU7XG4gICAgfTtcblxuICAgIGNvbnN0IGxvZyA9IChtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBhbnkpID0+IHtcbiAgICAgIGlmIChkZWJ1ZykgY29uc29sZS5sb2coYFtWaXJ0dWFsXSAke21lc3NhZ2V9YCwgZGF0YSk7XG4gICAgfTtcblxuICAgIC8vIENhbGN1bGF0ZSB2aXNpYmxlIHJhbmdlXG4gICAgY29uc3QgY2FsY3VsYXRlVmlzaWJsZVJhbmdlID0gKFxuICAgICAgc2Nyb2xsUG9zaXRpb246IG51bWJlcixcbiAgICApOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0gPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIltWaXJ0dWFsXSBObyB2aWV3cG9ydCBzdGF0ZSwgcmV0dXJuaW5nIGVtcHR5IHJhbmdlXCIpO1xuICAgICAgICByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgY29udGFpbmVyU2l6ZSwgdG90YWxJdGVtcyB9ID0gdmlld3BvcnRTdGF0ZTtcblxuICAgICAgLy8gRWFybHkgcmV0dXJucyBmb3IgaW52YWxpZCBzdGF0ZXNcbiAgICAgIGlmIChcbiAgICAgICAgIWNvbnRhaW5lclNpemUgfHxcbiAgICAgICAgY29udGFpbmVyU2l6ZSA8PSAwIHx8XG4gICAgICAgICF0b3RhbEl0ZW1zIHx8XG4gICAgICAgIHRvdGFsSXRlbXMgPD0gMFxuICAgICAgKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgYW4gaW5pdGlhbFNjcm9sbEluZGV4LCB1c2UgaXQgdG8gY2FsY3VsYXRlIHRoZSByYW5nZVxuICAgICAgICAvLyBldmVuIHdoZW4gdG90YWxJdGVtcyBpcyAwIChub3QgeWV0IGxvYWRlZCBmcm9tIEFQSSlcbiAgICAgICAgaWYgKGluaXRpYWxTY3JvbGxJbmRleCA+IDApIHtcbiAgICAgICAgICBjb25zdCB2aXNpYmxlQ291bnQgPSBNYXRoLmNlaWwoXG4gICAgICAgICAgICAoY29udGFpbmVyU2l6ZSB8fCA2MDApIC9cbiAgICAgICAgICAgICAgKHZpZXdwb3J0U3RhdGUuaXRlbVNpemUgfHwgaW5pdGlhbEl0ZW1TaXplKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoMCwgaW5pdGlhbFNjcm9sbEluZGV4IC0gb3ZlcnNjYW4pO1xuICAgICAgICAgIGNvbnN0IGVuZCA9IGluaXRpYWxTY3JvbGxJbmRleCArIHZpc2libGVDb3VudCArIG92ZXJzY2FuO1xuICAgICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgICAgfVxuICAgICAgICBsb2coYEludmFsaWQgc3RhdGU6IGNvbnRhaW5lcj0ke2NvbnRhaW5lclNpemV9LCBpdGVtcz0ke3RvdGFsSXRlbXN9YCk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiAwLCBlbmQ6IDAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmlydHVhbFNpemUgPVxuICAgICAgICB2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemUgfHwgdG90YWxJdGVtcyAqIHZpZXdwb3J0U3RhdGUuaXRlbVNpemU7XG4gICAgICBjb25zdCB2aXNpYmxlQ291bnQgPSBNYXRoLmNlaWwoY29udGFpbmVyU2l6ZSAvIHZpZXdwb3J0U3RhdGUuaXRlbVNpemUpO1xuICAgICAgY29uc3QgY29tcHJlc3Npb25SYXRpbyA9IGdldENvbXByZXNzaW9uUmF0aW8oKTtcblxuICAgICAgbGV0IHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyO1xuXG4gICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGEgdGFyZ2V0IHNjcm9sbCBpbmRleCAoZm9yIGluaXRpYWxTY3JvbGxJbmRleCB3aXRoIGNvbXByZXNzaW9uKVxuICAgICAgY29uc3QgdGFyZ2V0U2Nyb2xsSW5kZXggPSAodmlld3BvcnRTdGF0ZSBhcyBhbnkpLnRhcmdldFNjcm9sbEluZGV4O1xuXG4gICAgICBpZiAoY29tcHJlc3Npb25SYXRpbyA8IDEpIHtcbiAgICAgICAgLy8gQ29tcHJlc3NlZCBzcGFjZSBjYWxjdWxhdGlvblxuICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgdGFyZ2V0U2Nyb2xsSW5kZXgsIHVzZSBpdCBkaXJlY3RseSBpbnN0ZWFkIG9mIGNhbGN1bGF0aW5nIGZyb20gc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyB3ZSBzaG93IHRoZSBjb3JyZWN0IGl0ZW1zIGV2ZW4gd2hlbiB2aXJ0dWFsIHNwYWNlIGlzIGNvbXByZXNzZWRcbiAgICAgICAgaWYgKHRhcmdldFNjcm9sbEluZGV4ICE9PSB1bmRlZmluZWQgJiYgdGFyZ2V0U2Nyb2xsSW5kZXggPiAwKSB7XG4gICAgICAgICAgc3RhcnQgPSBNYXRoLm1heCgwLCB0YXJnZXRTY3JvbGxJbmRleCAtIG92ZXJzY2FuKTtcbiAgICAgICAgICBlbmQgPSBNYXRoLm1pbihcbiAgICAgICAgICAgIHRvdGFsSXRlbXMgLSAxLFxuICAgICAgICAgICAgdGFyZ2V0U2Nyb2xsSW5kZXggKyB2aXNpYmxlQ291bnQgKyBvdmVyc2NhbixcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIENsZWFyIHRhcmdldFNjcm9sbEluZGV4IGFmdGVyIGZpcnN0IHVzZSBzbyBub3JtYWwgc2Nyb2xsaW5nIHdvcmtzXG4gICAgICAgICAgZGVsZXRlICh2aWV3cG9ydFN0YXRlIGFzIGFueSkudGFyZ2V0U2Nyb2xsSW5kZXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgc2Nyb2xsUmF0aW8gPSBzY3JvbGxQb3NpdGlvbiAvIHZpcnR1YWxTaXplO1xuICAgICAgICAgIGNvbnN0IGV4YWN0SW5kZXggPSBzY3JvbGxSYXRpbyAqIHRvdGFsSXRlbXM7XG4gICAgICAgICAgc3RhcnQgPSBNYXRoLmZsb29yKGV4YWN0SW5kZXgpO1xuICAgICAgICAgIGVuZCA9IE1hdGguY2VpbChleGFjdEluZGV4KSArIHZpc2libGVDb3VudDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5lYXItYm90dG9tIGhhbmRsaW5nXG4gICAgICAgIGNvbnN0IG1heFNjcm9sbCA9IHZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZTtcbiAgICAgICAgY29uc3QgZGlzdGFuY2VGcm9tQm90dG9tID0gbWF4U2Nyb2xsIC0gc2Nyb2xsUG9zaXRpb247XG5cbiAgICAgICAgaWYgKGRpc3RhbmNlRnJvbUJvdHRvbSA8PSBjb250YWluZXJTaXplICYmIGRpc3RhbmNlRnJvbUJvdHRvbSA+PSAtMSkge1xuICAgICAgICAgIGNvbnN0IGl0ZW1zQXRCb3R0b20gPSBNYXRoLmZsb29yKFxuICAgICAgICAgICAgY29udGFpbmVyU2l6ZSAvIHZpZXdwb3J0U3RhdGUuaXRlbVNpemUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBmaXJzdFZpc2libGVBdEJvdHRvbSA9IE1hdGgubWF4KDAsIHRvdGFsSXRlbXMgLSBpdGVtc0F0Qm90dG9tKTtcbiAgICAgICAgICBjb25zdCBpbnRlcnBvbGF0aW9uID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgTWF0aC5taW4oMSwgMSAtIGRpc3RhbmNlRnJvbUJvdHRvbSAvIGNvbnRhaW5lclNpemUpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBzdGFydCA9IE1hdGguZmxvb3IoXG4gICAgICAgICAgICBzdGFydCArIChmaXJzdFZpc2libGVBdEJvdHRvbSAtIHN0YXJ0KSAqIGludGVycG9sYXRpb24sXG4gICAgICAgICAgKTtcbiAgICAgICAgICBlbmQgPVxuICAgICAgICAgICAgZGlzdGFuY2VGcm9tQm90dG9tIDw9IDFcbiAgICAgICAgICAgICAgPyB0b3RhbEl0ZW1zIC0gMVxuICAgICAgICAgICAgICA6IE1hdGgubWluKHRvdGFsSXRlbXMgLSAxLCBzdGFydCArIHZpc2libGVDb3VudCArIG92ZXJzY2FuKTtcblxuICAgICAgICAgIGxvZyhcIk5lYXIgYm90dG9tIGNhbGN1bGF0aW9uOlwiLCB7XG4gICAgICAgICAgICBkaXN0YW5jZUZyb21Cb3R0b20sXG4gICAgICAgICAgICBpbnRlcnBvbGF0aW9uLFxuICAgICAgICAgICAgc3RhcnQsXG4gICAgICAgICAgICBlbmQsXG4gICAgICAgICAgICBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgICAgIHRvdGFsSXRlbXMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBvdmVyc2NhblxuICAgICAgICBzdGFydCA9IE1hdGgubWF4KDAsIHN0YXJ0IC0gb3ZlcnNjYW4pO1xuICAgICAgICBlbmQgPSBNYXRoLm1pbih0b3RhbEl0ZW1zIC0gMSwgZW5kICsgb3ZlcnNjYW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRGlyZWN0IGNhbGN1bGF0aW9uXG4gICAgICAgIHN0YXJ0ID0gTWF0aC5tYXgoXG4gICAgICAgICAgMCxcbiAgICAgICAgICBNYXRoLmZsb29yKHNjcm9sbFBvc2l0aW9uIC8gdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZSkgLSBvdmVyc2NhbixcbiAgICAgICAgKTtcbiAgICAgICAgZW5kID0gTWF0aC5taW4odG90YWxJdGVtcyAtIDEsIHN0YXJ0ICsgdmlzaWJsZUNvdW50ICsgb3ZlcnNjYW4gKiAyKTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgb3V0cHV0XG4gICAgICBpZiAoaXNOYU4oc3RhcnQpIHx8IGlzTmFOKGVuZCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIltWaXJ0dWFsXSBOYU4gaW4gcmFuZ2UgY2FsY3VsYXRpb246XCIsIHtcbiAgICAgICAgICBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgICBjb250YWluZXJTaXplLFxuICAgICAgICAgIHRvdGFsSXRlbXMsXG4gICAgICAgICAgaXRlbVNpemU6IHZpZXdwb3J0U3RhdGUuaXRlbVNpemUsXG4gICAgICAgICAgY29tcHJlc3Npb25SYXRpbyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiAwLCBlbmQ6IDAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gbG9nKGBSYW5nZTogJHtzdGFydH0tJHtlbmR9IChzY3JvbGw6ICR7c2Nyb2xsUG9zaXRpb259KWApO1xuXG4gICAgICAvLyBTdHJhdGVnaWMgbG9nIGZvciBsYXN0IHJhbmdlXG4gICAgICAvLyBpZiAoZW5kID49IHRvdGFsSXRlbXMgLSAxMCkge1xuICAgICAgLy8gICBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgICBgW1ZpcnR1YWxdIE5lYXIgZW5kIHJhbmdlOiAke3N0YXJ0fS0ke2VuZH0sIHRvdGFsSXRlbXM9JHt0b3RhbEl0ZW1zfSwgbGFzdEl0ZW1Qb3M9JHtcbiAgICAgIC8vICAgICAgIGVuZCAqIHZpZXdwb3J0U3RhdGUuaXRlbVNpemVcbiAgICAgIC8vICAgICB9cHgsIHZpcnR1YWxTaXplPSR7dmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplfXB4YFxuICAgICAgLy8gICApO1xuICAgICAgLy8gfVxuXG4gICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgfTtcblxuICAgIC8vIENhbGN1bGF0ZSBhY3R1YWwgdmlzaWJsZSByYW5nZSAod2l0aG91dCBvdmVyc2NhbiBidWZmZXIpXG4gICAgY29uc3QgY2FsY3VsYXRlQWN0dWFsVmlzaWJsZVJhbmdlID0gKHNjcm9sbFBvc2l0aW9uOiBudW1iZXIpID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSkgcmV0dXJuIHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xuXG4gICAgICBjb25zdCB7IGNvbnRhaW5lclNpemUsIHRvdGFsSXRlbXMgfSA9IHZpZXdwb3J0U3RhdGU7XG4gICAgICBpZiAoIWNvbnRhaW5lclNpemUgfHwgIXRvdGFsSXRlbXMpIHJldHVybiB7IHN0YXJ0OiAwLCBlbmQ6IDAgfTtcblxuICAgICAgY29uc3QgaXRlbVNpemUgPSB2aWV3cG9ydFN0YXRlLml0ZW1TaXplO1xuICAgICAgY29uc3QgdmlzaWJsZUNvdW50ID0gTWF0aC5jZWlsKGNvbnRhaW5lclNpemUgLyBpdGVtU2l6ZSk7XG4gICAgICBjb25zdCBjb21wcmVzc2lvblJhdGlvID0gdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplXG4gICAgICAgID8gKHRvdGFsSXRlbXMgKiBpdGVtU2l6ZSkgLyB2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemVcbiAgICAgICAgOiAxO1xuXG4gICAgICBsZXQgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXI7XG5cbiAgICAgIGlmIChjb21wcmVzc2lvblJhdGlvIDwgMSkge1xuICAgICAgICAvLyBDb21wcmVzc2VkIHNwYWNlIC0gY2FsY3VsYXRlIGJhc2VkIG9uIHNjcm9sbCByYXRpb1xuICAgICAgICBjb25zdCB2aXJ0dWFsU2l6ZSA9XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplIHx8IHRvdGFsSXRlbXMgKiBpdGVtU2l6ZTtcbiAgICAgICAgY29uc3Qgc2Nyb2xsUmF0aW8gPSBzY3JvbGxQb3NpdGlvbiAvIHZpcnR1YWxTaXplO1xuICAgICAgICBzdGFydCA9IE1hdGguZmxvb3Ioc2Nyb2xsUmF0aW8gKiB0b3RhbEl0ZW1zKTtcbiAgICAgICAgZW5kID0gTWF0aC5taW4odG90YWxJdGVtcyAtIDEsIHN0YXJ0ICsgdmlzaWJsZUNvdW50IC0gMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEaXJlY3QgY2FsY3VsYXRpb25cbiAgICAgICAgc3RhcnQgPSBNYXRoLmZsb29yKHNjcm9sbFBvc2l0aW9uIC8gaXRlbVNpemUpO1xuICAgICAgICBlbmQgPSBNYXRoLm1pbih0b3RhbEl0ZW1zIC0gMSwgc3RhcnQgKyB2aXNpYmxlQ291bnQgLSAxKTtcbiAgICAgIH1cblxuICAgICAgLy8gRW5zdXJlIHZhbGlkIHJhbmdlXG4gICAgICBzdGFydCA9IE1hdGgubWF4KDAsIHN0YXJ0KTtcbiAgICAgIGVuZCA9IE1hdGgubWF4KHN0YXJ0LCBlbmQpO1xuXG4gICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSBmdW5jdGlvbnNcbiAgICBjb25zdCB1cGRhdGVWaXNpYmxlUmFuZ2UgPSAoc2Nyb2xsUG9zaXRpb246IG51bWJlcikgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlKSByZXR1cm47XG4gICAgICB2aWV3cG9ydFN0YXRlLnZpc2libGVSYW5nZSA9IGNhbGN1bGF0ZVZpc2libGVSYW5nZShzY3JvbGxQb3NpdGlvbik7XG5cbiAgICAgIC8vIERFQlVHOiBMb2cgd2hvIGNhbGxzIHVwZGF0ZVZpc2libGVSYW5nZSB3aXRoIDAgd2hlbiBpdCBzaG91bGQgYmUgbm9uLXplcm9cblxuICAgICAgLy8gQ2FsY3VsYXRlIGFjdHVhbCB2aXNpYmxlIHJhbmdlICh3aXRob3V0IG92ZXJzY2FuKSBmb3IgVUkgZGlzcGxheVxuICAgICAgY29uc3QgYWN0dWFsVmlzaWJsZVJhbmdlID0gY2FsY3VsYXRlQWN0dWFsVmlzaWJsZVJhbmdlKHNjcm9sbFBvc2l0aW9uKTtcblxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnJhbmdlLWNoYW5nZWRcIiwge1xuICAgICAgICByYW5nZTogdmlld3BvcnRTdGF0ZS52aXNpYmxlUmFuZ2UsXG4gICAgICAgIHZpc2libGVSYW5nZTogYWN0dWFsVmlzaWJsZVJhbmdlLFxuICAgICAgICBzY3JvbGxQb3NpdGlvbixcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBVcGRhdGUgdG90YWwgdmlydHVhbCBzaXplXG4gICAgY29uc3QgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZSA9ICh0b3RhbEl0ZW1zOiBudW1iZXIpID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBvbGRTaXplID0gdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplO1xuICAgICAgdmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zID0gdG90YWxJdGVtcztcbiAgICAgIGNvbnN0IGFjdHVhbFNpemUgPSB0b3RhbEl0ZW1zICogdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZTtcblxuICAgICAgLy8gR2V0IHBhZGRpbmcgZnJvbSB0aGUgaXRlbXMgY29udGFpbmVyIGlmIGF2YWlsYWJsZVxuICAgICAgbGV0IHRvdGFsUGFkZGluZyA9IDA7XG4gICAgICBpZiAodmlld3BvcnRTdGF0ZS5pdGVtc0NvbnRhaW5lcikge1xuICAgICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoXG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5pdGVtc0NvbnRhaW5lcixcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcGFkZGluZ1RvcCA9IHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5wYWRkaW5nVG9wKSB8fCAwO1xuICAgICAgICBjb25zdCBwYWRkaW5nQm90dG9tID0gcGFyc2VGbG9hdChjb21wdXRlZFN0eWxlLnBhZGRpbmdCb3R0b20pIHx8IDA7XG4gICAgICAgIHRvdGFsUGFkZGluZyA9IHBhZGRpbmdUb3AgKyBwYWRkaW5nQm90dG9tO1xuICAgICAgfVxuXG4gICAgICAvLyBJbmNsdWRlIHBhZGRpbmcgaW4gdGhlIHZpcnR1YWwgc2l6ZVxuICAgICAgdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplID0gTWF0aC5taW4oXG4gICAgICAgIGFjdHVhbFNpemUgKyB0b3RhbFBhZGRpbmcsXG4gICAgICAgIE1BWF9WSVJUVUFMX1NJWkUsXG4gICAgICApO1xuXG4gICAgICAvLyBTdHJhdGVnaWMgbG9nIGZvciBkZWJ1Z2dpbmcgZ2FwIGlzc3VlXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtWaXJ0dWFsXSBUb3RhbCBzaXplIHVwZGF0ZTogaXRlbXM9JHt0b3RhbEl0ZW1zfSwgaXRlbVNpemU9JHt2aWV3cG9ydFN0YXRlLml0ZW1TaXplfXB4LCBwYWRkaW5nPSR7dG90YWxQYWRkaW5nfXB4LCB2aXJ0dWFsU2l6ZT0ke3ZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZX1weCAod2FzICR7b2xkU2l6ZX1weClgXG4gICAgICAvLyApO1xuXG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6dmlydHVhbC1zaXplLWNoYW5nZWRcIiwge1xuICAgICAgICB0b3RhbFZpcnR1YWxTaXplOiB2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemUsXG4gICAgICAgIHRvdGFsSXRlbXM6IHRvdGFsSXRlbXMsXG4gICAgICAgIGNvbXByZXNzaW9uUmF0aW86IGdldENvbXByZXNzaW9uUmF0aW8oKSxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBVcGRhdGUgY29udGFpbmVyIHNpemVcbiAgICBjb25zdCB1cGRhdGVDb250YWluZXJTaXplID0gKCkgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlIHx8ICF2aWV3cG9ydFN0YXRlLnZpZXdwb3J0RWxlbWVudCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBzaXplID1cbiAgICAgICAgdmlld3BvcnRTdGF0ZS52aWV3cG9ydEVsZW1lbnRbXG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5vcmllbnRhdGlvbiA9PT0gXCJob3Jpem9udGFsXCJcbiAgICAgICAgICAgID8gXCJvZmZzZXRXaWR0aFwiXG4gICAgICAgICAgICA6IFwib2Zmc2V0SGVpZ2h0XCJcbiAgICAgICAgXTtcblxuICAgICAgLy8gTG9nIHRoZSBhY3R1YWwgbWVhc3VyZW1lbnRcbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1ZpcnR1YWxdIENvbnRhaW5lciBzaXplIG1lYXN1cmVkOiAke3NpemV9cHggZnJvbSB2aWV3cG9ydCBlbGVtZW50YFxuICAgICAgLy8gKTtcblxuICAgICAgaWYgKHNpemUgIT09IHZpZXdwb3J0U3RhdGUuY29udGFpbmVyU2l6ZSkge1xuICAgICAgICB2aWV3cG9ydFN0YXRlLmNvbnRhaW5lclNpemUgPSBzaXplO1xuICAgICAgICB1cGRhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiB8fCAwKTtcbiAgICAgICAgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZSh2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMpOyAvLyBBbHNvIHVwZGF0ZSB2aXJ0dWFsIHNpemVcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OmNvbnRhaW5lci1zaXplLWNoYW5nZWRcIiwge1xuICAgICAgICAgIGNvbnRhaW5lclNpemU6IHNpemUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBPdmVycmlkZSB2aWV3cG9ydCBtZXRob2RzXG4gICAgY29tcG9uZW50LnZpZXdwb3J0LmdldFZpc2libGVSYW5nZSA9ICgpID0+XG4gICAgICB2aWV3cG9ydFN0YXRlPy52aXNpYmxlUmFuZ2UgfHxcbiAgICAgIGNhbGN1bGF0ZVZpc2libGVSYW5nZSh2aWV3cG9ydFN0YXRlPy5zY3JvbGxQb3NpdGlvbiB8fCAwKTtcblxuICAgIC8vIEV2ZW50IGxpc3RlbmVyc1xuICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6c2Nyb2xsXCIsIChkYXRhOiBhbnkpID0+XG4gICAgICB1cGRhdGVWaXNpYmxlUmFuZ2UoZGF0YS5wb3NpdGlvbiksXG4gICAgKTtcblxuICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6aXRlbXMtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICBpZiAoZGF0YS50b3RhbEl0ZW1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZShkYXRhLnRvdGFsSXRlbXMpO1xuICAgICAgICB1cGRhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZT8uc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIHRvdGFsIGl0ZW1zIGNoYW5nZXMgKGltcG9ydGFudCBmb3IgY3Vyc29yIHBhZ2luYXRpb24pXG4gICAgLy8gTm90ZTogc2V0VG90YWxJdGVtcygpIHVwZGF0ZXMgdmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zIEJFRk9SRSBlbWl0dGluZyB0aGlzIGV2ZW50LFxuICAgIC8vIHNvIHdlIGNhbid0IHJlbHkgb24gdmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zIHRvIGRldGVjdCB0aGUgZmlyc3QgdG90YWwuXG4gICAgLy8gSW5zdGVhZCB3ZSB1c2UgdGhlIGhhc1JlY2FsY3VsYXRlZFNjcm9sbEZvckNvbXByZXNzaW9uIGZsYWcuXG4gICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDp0b3RhbC1pdGVtcy1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgIGlmIChkYXRhLnRvdGFsID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgICAgLy8gRklYOiBXaGVuIHdlIGZpcnN0IHJlY2VpdmUgdG90YWxJdGVtcyB3aXRoIGluaXRpYWxTY3JvbGxJbmRleCBhbmQgY29tcHJlc3Npb24sXG4gICAgICAvLyByZWNhbGN1bGF0ZSBzY3JvbGwgcG9zaXRpb24gdG8gYWNjb3VudCBmb3IgY29tcHJlc3Npb24uXG4gICAgICAvLyBXaXRob3V0IHRoaXMsIGluaXRpYWxTY3JvbGxJbmRleCBjYWxjdWxhdGVzIHBvc2l0aW9uIGFzIGluZGV4ICogaXRlbVNpemUsXG4gICAgICAvLyBidXQgcmVuZGVyaW5nIHVzZXMgY29tcHJlc3NlZCBzcGFjZSwgY2F1c2luZyBpdGVtcyB0byBhcHBlYXIgb2ZmLXNjcmVlbi5cbiAgICAgIC8vXG4gICAgICAvLyBXZSBjaGVjayB0aGlzIEJFRk9SRSB1cGRhdGVUb3RhbFZpcnR1YWxTaXplIGJlY2F1c2Ugd2UgbmVlZCB0byByZWNhbGN1bGF0ZVxuICAgICAgLy8gc2Nyb2xsIHBvc2l0aW9uIGJhc2VkIG9uIHRoZSBuZXcgdG90YWwsIGFuZCB0aGUgZmxhZyBlbnN1cmVzIHdlIG9ubHkgZG8gdGhpcyBvbmNlLlxuICAgICAgaWYgKFxuICAgICAgICBpbml0aWFsU2Nyb2xsSW5kZXggPiAwICYmXG4gICAgICAgICFoYXNSZWNhbGN1bGF0ZWRTY3JvbGxGb3JDb21wcmVzc2lvbiAmJlxuICAgICAgICBkYXRhLnRvdGFsID4gMFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGFjdHVhbFRvdGFsU2l6ZSA9IGRhdGEudG90YWwgKiB2aWV3cG9ydFN0YXRlLml0ZW1TaXplO1xuICAgICAgICBjb25zdCBpc0NvbXByZXNzZWQgPSBhY3R1YWxUb3RhbFNpemUgPiBNQVhfVklSVFVBTF9TSVpFO1xuXG4gICAgICAgIGlmIChpc0NvbXByZXNzZWQpIHtcbiAgICAgICAgICAvLyBSZWNhbGN1bGF0ZSBzY3JvbGwgcG9zaXRpb24gdXNpbmcgY29tcHJlc3Npb24tYXdhcmUgZm9ybXVsYVxuICAgICAgICAgIC8vIFNhbWUgZm9ybXVsYSB1c2VkIGluIHNjcm9sbFRvSW5kZXhcbiAgICAgICAgICBjb25zdCByYXRpbyA9IGluaXRpYWxTY3JvbGxJbmRleCAvIGRhdGEudG90YWw7XG4gICAgICAgICAgY29uc3QgY29tcHJlc3NlZFBvc2l0aW9uID0gcmF0aW8gKiBNQVhfVklSVFVBTF9TSVpFO1xuXG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiA9IGNvbXByZXNzZWRQb3NpdGlvbjtcblxuICAgICAgICAgIC8vIE5vdGlmeSBzY3JvbGxpbmcgZmVhdHVyZSB0byBzeW5jIGl0cyBsb2NhbCBzY3JvbGwgcG9zaXRpb25cbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6c2Nyb2xsLXBvc2l0aW9uLXN5bmNcIiwge1xuICAgICAgICAgICAgcG9zaXRpb246IGNvbXByZXNzZWRQb3NpdGlvbixcbiAgICAgICAgICAgIHNvdXJjZTogXCJjb21wcmVzc2lvbi1yZWNhbGN1bGF0aW9uXCIsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBDbGVhciB0YXJnZXRTY3JvbGxJbmRleCBzaW5jZSB3ZSd2ZSBub3cgY29ycmVjdGx5IGNhbGN1bGF0ZWQgdGhlIHNjcm9sbCBwb3NpdGlvblxuICAgICAgICAgIC8vIFRoZSBub3JtYWwgY29tcHJlc3NlZCBzY3JvbGxpbmcgZm9ybXVsYSB3aWxsIG5vdyB3b3JrIGNvcnJlY3RseVxuICAgICAgICAgIGRlbGV0ZSAodmlld3BvcnRTdGF0ZSBhcyBhbnkpLnRhcmdldFNjcm9sbEluZGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFyayBhcyBkb25lIGV2ZW4gaWYgbm90IGNvbXByZXNzZWQgLSB3ZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBjaGVjayBvbmNlXG4gICAgICAgIGhhc1JlY2FsY3VsYXRlZFNjcm9sbEZvckNvbXByZXNzaW9uID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZShkYXRhLnRvdGFsKTtcbiAgICAgIHVwZGF0ZVZpc2libGVSYW5nZSh2aWV3cG9ydFN0YXRlPy5zY3JvbGxQb3NpdGlvbiB8fCAwKTtcblxuICAgICAgLy8gVHJpZ2dlciBhIHJlbmRlciB0byB1cGRhdGUgdGhlIHZpZXdcbiAgICAgIGNvbXBvbmVudC52aWV3cG9ydD8ucmVuZGVySXRlbXM/LigpO1xuICAgIH0pO1xuXG4gICAgLy8gTGlzdGVuIGZvciBjb250YWluZXIgc2l6ZSBjaGFuZ2VzIHRvIHJlY2FsY3VsYXRlIHZpcnR1YWwgc2l6ZVxuICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6Y29udGFpbmVyLXNpemUtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICBpZiAodmlld3BvcnRTdGF0ZSAmJiBkYXRhLmNvbnRhaW5lclNpemUgIT09IHZpZXdwb3J0U3RhdGUuY29udGFpbmVyU2l6ZSkge1xuICAgICAgICB2aWV3cG9ydFN0YXRlLmNvbnRhaW5lclNpemUgPSBkYXRhLmNvbnRhaW5lclNpemU7XG4gICAgICAgIC8vIFJlY2FsY3VsYXRlIHZpcnR1YWwgc2l6ZSB3aXRoIG5ldyBjb250YWluZXIgc2l6ZVxuICAgICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplKHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyk7XG4gICAgICAgIHVwZGF0ZVZpc2libGVSYW5nZSh2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uIHx8IDApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29tcG9uZW50Lm9uPy4oXCJjb2xsZWN0aW9uOnJhbmdlLWxvYWRlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGRhdGEudG90YWwgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBkYXRhLnRvdGFsICE9PSB2aWV3cG9ydFN0YXRlPy50b3RhbEl0ZW1zXG4gICAgICApIHtcbiAgICAgICAgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZShkYXRhLnRvdGFsKTtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZVZpc2libGVSYW5nZSh2aWV3cG9ydFN0YXRlPy5zY3JvbGxQb3NpdGlvbiB8fCAwKTtcbiAgICAgIGNvbXBvbmVudC52aWV3cG9ydD8ucmVuZGVySXRlbXM/LigpO1xuICAgIH0pO1xuXG4gICAgLy8gTGlzdGVuIGZvciBmaXJzdCBpdGVtcyByZW5kZXJlZCB0byBjYWxjdWxhdGUgaXRlbSBzaXplIChpZiBhdXRvLWRldGVjdGlvbiBpcyBlbmFibGVkKVxuICAgIGlmIChhdXRvRGV0ZWN0SXRlbVNpemUpIHtcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6aXRlbXMtcmVuZGVyZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIWhhc0NhbGN1bGF0ZWRJdGVtU2l6ZSAmJlxuICAgICAgICAgIGRhdGEuZWxlbWVudHM/Lmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIENhbGN1bGF0ZSBhdmVyYWdlIGl0ZW0gc2l6ZSBmcm9tIGZpcnN0IHJlbmRlcmVkIGJhdGNoXG4gICAgICAgICAgY29uc3Qgc2l6ZXM6IG51bWJlcltdID0gW107XG4gICAgICAgICAgY29uc3Qgc2l6ZVByb3BlcnR5ID1cbiAgICAgICAgICAgIG9yaWVudGF0aW9uID09PSBcImhvcml6b250YWxcIiA/IFwib2Zmc2V0V2lkdGhcIiA6IFwib2Zmc2V0SGVpZ2h0XCI7XG5cbiAgICAgICAgICBkYXRhLmVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzaXplID0gZWxlbWVudFtzaXplUHJvcGVydHldO1xuICAgICAgICAgICAgaWYgKHNpemUgPiAwKSB7XG4gICAgICAgICAgICAgIHNpemVzLnB1c2goc2l6ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoc2l6ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgYXZnU2l6ZSA9IE1hdGgucm91bmQoXG4gICAgICAgICAgICAgIHNpemVzLnJlZHVjZSgoc3VtLCBzaXplKSA9PiBzdW0gKyBzaXplLCAwKSAvIHNpemVzLmxlbmd0aCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c0l0ZW1TaXplID0gdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZTtcbiAgICAgICAgICAgIHZpZXdwb3J0U3RhdGUuaXRlbVNpemUgPSBhdmdTaXplO1xuXG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGFuIGluaXRpYWxTY3JvbGxJbmRleCwgcmVjYWxjdWxhdGUgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgICAgICAvLyBiYXNlZCBvbiB0aGUgbmV3bHkgZGV0ZWN0ZWQgaXRlbSBzaXplXG4gICAgICAgICAgICBpZiAoaW5pdGlhbFNjcm9sbEluZGV4ID4gMCAmJiBhdmdTaXplICE9PSBwcmV2aW91c0l0ZW1TaXplKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG5ld1Njcm9sbFBvc2l0aW9uID0gaW5pdGlhbFNjcm9sbEluZGV4ICogYXZnU2l6ZTtcbiAgICAgICAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiA9IG5ld1Njcm9sbFBvc2l0aW9uO1xuXG4gICAgICAgICAgICAgIC8vIE5vdGlmeSBzY3JvbGxpbmcgZmVhdHVyZSB0byBzeW5jIGl0cyBsb2NhbCBzY3JvbGwgcG9zaXRpb25cbiAgICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnNjcm9sbC1wb3NpdGlvbi1zeW5jXCIsIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogbmV3U2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgICAgICAgc291cmNlOiBcIml0ZW0tc2l6ZS1kZXRlY3RlZFwiLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmVjYWxjdWxhdGUgZXZlcnl0aGluZyB3aXRoIG5ldyBzaXplXG4gICAgICAgICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplKHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyk7XG4gICAgICAgICAgICB1cGRhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiB8fCAwKTtcblxuICAgICAgICAgICAgLy8gUmUtcmVuZGVyIHRvIGFkanVzdCBwb3NpdGlvbnNcbiAgICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydD8ucmVuZGVySXRlbXM/LigpO1xuXG4gICAgICAgICAgICAvLyBFbWl0IGV2ZW50IGZvciBzaXplIGNoYW5nZVxuICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0Oml0ZW0tc2l6ZS1kZXRlY3RlZFwiLCB7XG4gICAgICAgICAgICAgIHByZXZpb3VzU2l6ZTogaW5pdGlhbEl0ZW1TaXplLFxuICAgICAgICAgICAgICBkZXRlY3RlZFNpemU6IGF2Z1NpemUsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaGFzQ2FsY3VsYXRlZEl0ZW1TaXplID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEV4cG9zZSB2aXJ0dWFsIEFQSVxuICAgIGNvbnN0IGNvbXByZXNzaW9uUmF0aW8gPSBnZXRDb21wcmVzc2lvblJhdGlvKCk7XG4gICAgKGNvbXBvbmVudCBhcyBhbnkpLnZpcnR1YWwgPSB7XG4gICAgICBjYWxjdWxhdGVWaXNpYmxlUmFuZ2UsXG4gICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplLFxuICAgICAgZ2V0VG90YWxWaXJ0dWFsU2l6ZTogKCkgPT4gdmlld3BvcnRTdGF0ZT8udmlydHVhbFRvdGFsU2l6ZSB8fCAwLFxuICAgICAgZ2V0Q29udGFpbmVyU2l6ZTogKCkgPT4gdmlld3BvcnRTdGF0ZT8uY29udGFpbmVyU2l6ZSB8fCAwLFxuICAgICAgdXBkYXRlQ29udGFpbmVyU2l6ZTogKHNpemU6IG51bWJlcikgPT4ge1xuICAgICAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuY29udGFpbmVyU2l6ZSA9IHNpemU7XG4gICAgICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBnZXRJdGVtU2l6ZTogKCkgPT4gdmlld3BvcnRTdGF0ZT8uaXRlbVNpemUgfHwgaW5pdGlhbEl0ZW1TaXplLFxuICAgICAgY2FsY3VsYXRlSW5kZXhGcm9tUG9zaXRpb246IChwb3NpdGlvbjogbnVtYmVyKSA9PlxuICAgICAgICBNYXRoLmZsb29yKFxuICAgICAgICAgIHBvc2l0aW9uIC9cbiAgICAgICAgICAgICgodmlld3BvcnRTdGF0ZT8uaXRlbVNpemUgfHwgaW5pdGlhbEl0ZW1TaXplKSAqIGNvbXByZXNzaW9uUmF0aW8pLFxuICAgICAgICApLFxuICAgICAgY2FsY3VsYXRlUG9zaXRpb25Gb3JJbmRleDogKGluZGV4OiBudW1iZXIpID0+XG4gICAgICAgIGluZGV4ICogKHZpZXdwb3J0U3RhdGU/Lml0ZW1TaXplIHx8IGluaXRpYWxJdGVtU2l6ZSkgKiBjb21wcmVzc2lvblJhdGlvLFxuICAgIH07XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9O1xufTtcbiIsCiAgICAiLyoqXG4gKiBTY3JvbGxpbmcgRmVhdHVyZSAtIFZpcnR1YWwgc2Nyb2xsaW5nIHdpdGggaW50ZWdyYXRlZCB2ZWxvY2l0eSB0cmFja2luZ1xuICogSGFuZGxlcyB3aGVlbCBldmVudHMsIHRvdWNoL21vdXNlIGV2ZW50cywgc2Nyb2xsIHBvc2l0aW9uIG1hbmFnZW1lbnQsIHZlbG9jaXR5IG1lYXN1cmVtZW50LCBhbmQgbW9tZW50dW0gc2Nyb2xsaW5nXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBWSUVXUE9SVF9DT05TVEFOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB3cmFwSW5pdGlhbGl6ZSwgZ2V0Vmlld3BvcnRTdGF0ZSwgY2xhbXAgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNjcm9sbGluZ0NvbmZpZyB7XG4gIG9yaWVudGF0aW9uPzogXCJ2ZXJ0aWNhbFwiIHwgXCJob3Jpem9udGFsXCI7XG4gIHNlbnNpdGl2aXR5PzogbnVtYmVyO1xuICBzbW9vdGhpbmc/OiBib29sZWFuO1xuICBpZGxlVGltZW91dD86IG51bWJlcjtcbiAgLyoqIFN0b3Agc2Nyb2xsaW5nIHdoZW4gY2xpY2tpbmcgb24gdGhlIHZpZXdwb3J0IChkZWZhdWx0OiB0cnVlKSAqL1xuICBzdG9wT25DbGljaz86IGJvb2xlYW47XG59XG5cbi8vIFNwZWVkIHRyYWNrZXIgaW50ZXJmYWNlXG5pbnRlcmZhY2UgU3BlZWRUcmFja2VyIHtcbiAgdmVsb2NpdHk6IG51bWJlcjtcbiAgbGFzdFBvc2l0aW9uOiBudW1iZXI7XG4gIGxhc3RUaW1lOiBudW1iZXI7XG4gIGRpcmVjdGlvbjogXCJmb3J3YXJkXCIgfCBcImJhY2t3YXJkXCI7XG4gIHNhbXBsZXM6IEFycmF5PHsgcG9zaXRpb246IG51bWJlcjsgdGltZTogbnVtYmVyIH0+O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgc3BlZWQgdHJhY2tlclxuICovXG5jb25zdCBjcmVhdGVTcGVlZFRyYWNrZXIgPSAoKTogU3BlZWRUcmFja2VyID0+ICh7XG4gIHZlbG9jaXR5OiAwLFxuICBsYXN0UG9zaXRpb246IDAsXG4gIGxhc3RUaW1lOiBEYXRlLm5vdygpLFxuICBkaXJlY3Rpb246IFwiZm9yd2FyZFwiLFxuICBzYW1wbGVzOiBbXSxcbn0pO1xuXG4vKipcbiAqIFVwZGF0ZXMgc3BlZWQgdHJhY2tlciB3aXRoIG5ldyBwb3NpdGlvblxuICovXG5jb25zdCB1cGRhdGVTcGVlZFRyYWNrZXIgPSAoXG4gIHRyYWNrZXI6IFNwZWVkVHJhY2tlcixcbiAgbmV3UG9zaXRpb246IG51bWJlcixcbiAgcHJldmlvdXNQb3NpdGlvbjogbnVtYmVyLFxuKTogU3BlZWRUcmFja2VyID0+IHtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgdGltZURlbHRhID0gbm93IC0gdHJhY2tlci5sYXN0VGltZTtcblxuICBpZiAodGltZURlbHRhID09PSAwKSByZXR1cm4gdHJhY2tlcjtcblxuICBjb25zdCBwb3NpdGlvbkRlbHRhID0gbmV3UG9zaXRpb24gLSBwcmV2aW91c1Bvc2l0aW9uO1xuICAvLyBLZWVwIHZlbG9jaXR5IHNpZ25lZCAocG9zaXRpdmUgPSBmb3J3YXJkL2Rvd24sIG5lZ2F0aXZlID0gYmFja3dhcmQvdXApXG4gIGNvbnN0IGluc3RhbnRWZWxvY2l0eSA9IHBvc2l0aW9uRGVsdGEgLyB0aW1lRGVsdGE7XG5cbiAgLy8gQWRkIG5ldyBzYW1wbGVcbiAgY29uc3Qgc2FtcGxlcyA9IFsuLi50cmFja2VyLnNhbXBsZXMsIHsgcG9zaXRpb246IG5ld1Bvc2l0aW9uLCB0aW1lOiBub3cgfV07XG5cbiAgLy8gS2VlcCBvbmx5IHJlY2VudCBzYW1wbGVzIChsYXN0IDEwMG1zKVxuICBjb25zdCByZWNlbnRTYW1wbGVzID0gc2FtcGxlcy5maWx0ZXIoKHMpID0+IG5vdyAtIHMudGltZSA8IDEwMCk7XG5cbiAgLy8gQ2FsY3VsYXRlIGF2ZXJhZ2UgdmVsb2NpdHkgZnJvbSByZWNlbnQgc2FtcGxlcyAocHJlc2VydmluZyBzaWduL2RpcmVjdGlvbilcbiAgbGV0IGF2Z1ZlbG9jaXR5ID0gaW5zdGFudFZlbG9jaXR5O1xuICBpZiAocmVjZW50U2FtcGxlcy5sZW5ndGggPiAxKSB7XG4gICAgY29uc3Qgb2xkZXN0U2FtcGxlID0gcmVjZW50U2FtcGxlc1swXTtcbiAgICBjb25zdCB0b3RhbERpc3RhbmNlID0gbmV3UG9zaXRpb24gLSBvbGRlc3RTYW1wbGUucG9zaXRpb247IC8vIFNpZ25lZCBkaXN0YW5jZVxuICAgIGNvbnN0IHRvdGFsVGltZSA9IG5vdyAtIG9sZGVzdFNhbXBsZS50aW1lO1xuICAgIGF2Z1ZlbG9jaXR5ID0gdG90YWxUaW1lID4gMCA/IHRvdGFsRGlzdGFuY2UgLyB0b3RhbFRpbWUgOiBpbnN0YW50VmVsb2NpdHk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHZlbG9jaXR5OiBhdmdWZWxvY2l0eSxcbiAgICBsYXN0UG9zaXRpb246IG5ld1Bvc2l0aW9uLFxuICAgIGxhc3RUaW1lOiBub3csXG4gICAgZGlyZWN0aW9uOiBwb3NpdGlvbkRlbHRhID49IDAgPyBcImZvcndhcmRcIiA6IFwiYmFja3dhcmRcIixcbiAgICBzYW1wbGVzOiByZWNlbnRTYW1wbGVzLFxuICB9O1xufTtcblxuLyoqXG4gKiBTY3JvbGxpbmcgZmVhdHVyZSBmb3Igdmlld3BvcnRcbiAqIEhhbmRsZXMgd2hlZWwgZXZlbnRzLCB2ZWxvY2l0eSB0cmFja2luZywgYW5kIGlkbGUgZGV0ZWN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoU2Nyb2xsaW5nID0gKGNvbmZpZzogU2Nyb2xsaW5nQ29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KGNvbXBvbmVudDogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIG9yaWVudGF0aW9uID0gXCJ2ZXJ0aWNhbFwiLFxuICAgICAgc2Vuc2l0aXZpdHkgPSBWSUVXUE9SVF9DT05TVEFOVFMuVklSVFVBTF9TQ1JPTEwuU0NST0xMX1NFTlNJVElWSVRZLFxuICAgICAgc21vb3RoaW5nID0gZmFsc2UsXG4gICAgICBpZGxlVGltZW91dCA9IDEwMCwgLy8gRGVmYXVsdCBpZGxlIHRpbWVvdXQgaW4gbXNcbiAgICAgIHN0b3BPbkNsaWNrID0gdHJ1ZSwgLy8gU3RvcCBzY3JvbGxpbmcgb24gY2xpY2sgYnkgZGVmYXVsdFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBTdGF0ZVxuICAgIGxldCBzY3JvbGxQb3NpdGlvbiA9IDA7XG4gICAgbGV0IHRvdGFsVmlydHVhbFNpemUgPSAwO1xuICAgIGxldCBjb250YWluZXJTaXplID0gMDtcbiAgICBsZXQgaXNTY3JvbGxpbmcgPSBmYWxzZTtcbiAgICBsZXQgbGFzdFNjcm9sbFRpbWUgPSAwO1xuICAgIGxldCBzcGVlZFRyYWNrZXIgPSBjcmVhdGVTcGVlZFRyYWNrZXIoKTtcbiAgICBsZXQgaWRsZVRpbWVvdXRJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGlkbGVDaGVja0ZyYW1lOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgbGFzdElkbGVDaGVja1Bvc2l0aW9uID0gMDtcbiAgICBsZXQgaGFzRW1pdHRlZElkbGUgPSBmYWxzZTsgLy8gVHJhY2sgaWYgd2UndmUgYWxyZWFkeSBlbWl0dGVkIGlkbGVcbiAgICBsZXQgYW5jaG9yUG9zaXRpb246IG51bWJlciB8IG51bGwgPSBudWxsOyAvLyBBbmNob3IgcG9zaXRpb24gdG8gbWFpbnRhaW4gb24gY2xpY2sgKGZvciBzdG9wT25DbGljaylcbiAgICBsZXQgYW5jaG9yVGltZSA9IDA7IC8vIFRpbWVzdGFtcCB3aGVuIGFuY2hvciB3YXMgc2V0XG4gICAgbGV0IGxhc3RXaGVlbFRpbWUgPSAwOyAvLyBUaW1lc3RhbXAgb2YgbGFzdCB3aGVlbCBldmVudCAoZm9yIGRldGVjdGluZyBnYXBzKVxuICAgIGxldCBhbmNob3JJbml0aWFsRGVsdGEgPSAwOyAvLyBJbml0aWFsIHdoZWVsIGRlbHRhIHdoZW4gYW5jaG9yIHdhcyBzZXQgKHRvIGRldGVjdCBkZWNheSlcbiAgICBsZXQgYW5jaG9yTGFzdERlbHRhID0gMDsgLy8gUHJldmlvdXMgd2hlZWwgZGVsdGEgKHRvIGRldGVjdCBpbmNyZWFzaW5nIGRlbHRhID0gbmV3IHNjcm9sbClcbiAgICBsZXQgYW5jaG9yTWluRGVsdGEgPSBJbmZpbml0eTsgLy8gTWluaW11bSBkZWx0YSBzZWVuIHNpbmNlIGFuY2hvciAodG8gZGV0ZWN0IHJlYWNjZWxlcmF0aW9uKVxuICAgIGxldCBjb25zZWN1dGl2ZUluY3JlYXNlcyA9IDA7IC8vIENvdW50IG9mIGNvbnNlY3V0aXZlIGRlbHRhIGluY3JlYXNlcyAodG8gZGV0ZWN0IHN1c3RhaW5lZCBuZXcgc2Nyb2xsaW5nKVxuICAgIGxldCBzdXN0YWluZWRIaWdoQ291bnQgPSAwOyAvLyBDb3VudCBvZiBldmVudHMgd2hlcmUgZGVsdGEgaXMgc2lnbmlmaWNhbnRseSBhYm92ZSBtaW5pbXVtIChzdXN0YWluZWQgbmV3IHNjcm9sbGluZylcblxuICAgIC8vIGNvbnNvbGUubG9nKGBbU2Nyb2xsaW5nXSBJbml0aWFsIHN0YXRlIC0gcG9zaXRpb246ICR7c2Nyb2xsUG9zaXRpb259YCk7XG5cbiAgICAvLyBHZXQgdmlld3BvcnQgc3RhdGVcbiAgICBsZXQgdmlld3BvcnRTdGF0ZTogYW55O1xuXG4gICAgLy8gVXNlIHNoYXJlZCBpbml0aWFsaXphdGlvbiB3cmFwcGVyXG4gICAgd3JhcEluaXRpYWxpemUoY29tcG9uZW50LCAoKSA9PiB7XG4gICAgICB2aWV3cG9ydFN0YXRlID0gZ2V0Vmlld3BvcnRTdGF0ZShjb21wb25lbnQpO1xuXG4gICAgICAvLyBJbml0aWFsaXplIHN0YXRlIHZhbHVlc1xuICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9IHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZSB8fCAwO1xuICAgICAgICBjb250YWluZXJTaXplID0gdmlld3BvcnRTdGF0ZS5jb250YWluZXJTaXplIHx8IDA7XG4gICAgICAgIC8vIFN5bmMgc2Nyb2xsUG9zaXRpb24gZnJvbSB2aWV3cG9ydFN0YXRlIChpbXBvcnRhbnQgZm9yIGluaXRpYWxTY3JvbGxJbmRleClcbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPiAwKSB7XG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb24gPSB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgdmlydHVhbCBzaXplIGNoYW5nZXNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6dmlydHVhbC1zaXplLWNoYW5nZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltTY3JvbGxpbmddIFZpcnR1YWwgc2l6ZSBjaGFuZ2VkOlwiLCBkYXRhKTtcbiAgICAgICAgdXBkYXRlU2Nyb2xsQm91bmRzKGRhdGEudG90YWxWaXJ0dWFsU2l6ZSwgY29udGFpbmVyU2l6ZSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBzY3JvbGwgcG9zaXRpb24gY2hhbmdlcyBmcm9tIG90aGVyIGZlYXR1cmVzIChlLmcuLCB2aXJ0dWFsLnRzIGFmdGVyIGl0ZW0gc2l6ZSBkZXRlY3Rpb24pXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnNjcm9sbC1wb3NpdGlvbi1zeW5jXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGRhdGEucG9zaXRpb24gIT09IHVuZGVmaW5lZCAmJiBkYXRhLnBvc2l0aW9uICE9PSBzY3JvbGxQb3NpdGlvbikge1xuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbjtcbiAgICAgICAgICAvLyBBbHNvIHVwZGF0ZSBsb2NhbCB0cmFja2luZyB2YXJzXG4gICAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9XG4gICAgICAgICAgICB2aWV3cG9ydFN0YXRlPy52aXJ0dWFsVG90YWxTaXplIHx8IHRvdGFsVmlydHVhbFNpemU7XG4gICAgICAgICAgY29udGFpbmVyU2l6ZSA9IHZpZXdwb3J0U3RhdGU/LmNvbnRhaW5lclNpemUgfHwgY29udGFpbmVyU2l6ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgY29udGFpbmVyIHNpemUgY2hhbmdlc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpjb250YWluZXItc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGRhdGEuY29udGFpbmVyU2l6ZSkge1xuICAgICAgICAgIGNvbnRhaW5lclNpemUgPSBkYXRhLmNvbnRhaW5lclNpemU7XG4gICAgICAgICAgdXBkYXRlU2Nyb2xsQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gQXR0YWNoIHdoZWVsIGV2ZW50IGxpc3RlbmVyIHRvIHZpZXdwb3J0IGVsZW1lbnRcbiAgICAgIGNvbnN0IHZpZXdwb3J0RWxlbWVudCA9XG4gICAgICAgIHZpZXdwb3J0U3RhdGU/LnZpZXdwb3J0RWxlbWVudCB8fCAoY29tcG9uZW50IGFzIGFueSkudmlld3BvcnRFbGVtZW50O1xuICAgICAgaWYgKHZpZXdwb3J0RWxlbWVudCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW1Njcm9sbGluZ10gQXR0YWNoaW5nIHdoZWVsIGV2ZW50IHRvIHZpZXdwb3J0IGVsZW1lbnRgKTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLCBoYW5kbGVXaGVlbCwge1xuICAgICAgICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBZGQgbW91c2Vkb3duIGxpc3RlbmVyIHRvIHN0b3Agc2Nyb2xsaW5nIG9uIGNsaWNrXG4gICAgICAgIGlmIChzdG9wT25DbGljaykge1xuICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGhhbmRsZU1vdXNlRG93bik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdG9yZSByZWZlcmVuY2UgZm9yIGNsZWFudXBcbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLl9zY3JvbGxpbmdWaWV3cG9ydEVsZW1lbnQgPSB2aWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgIChjb21wb25lbnQgYXMgYW55KS5fc2Nyb2xsaW5nU3RvcE9uQ2xpY2sgPSBzdG9wT25DbGljaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgW1Njcm9sbGluZ10gTm8gdmlld3BvcnQgZWxlbWVudCBmb3VuZCBmb3Igd2hlZWwgZXZlbnRzYCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBVc2UgY2xhbXAgZnJvbSB1dGlsc1xuXG4gICAgLy8gU3RhcnQgaWRsZSBkZXRlY3Rpb25cbiAgICBjb25zdCBzdGFydElkbGVEZXRlY3Rpb24gPSAoKSA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIltTY3JvbGxpbmddIFN0YXJ0aW5nIGlkbGUgZGV0ZWN0aW9uXCIpO1xuXG4gICAgICAvLyBTdG9wIGFueSBleGlzdGluZyBpZGxlIGRldGVjdGlvbiBmaXJzdFxuICAgICAgaWYgKGlkbGVDaGVja0ZyYW1lICE9PSBudWxsKSB7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkbGVDaGVja0ZyYW1lKTtcbiAgICAgICAgaWRsZUNoZWNrRnJhbWUgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBoYXNFbWl0dGVkSWRsZSA9IGZhbHNlOyAvLyBSZXNldCBpZGxlIGVtaXNzaW9uIGZsYWdcbiAgICAgIGNvbnN0IGNoZWNrSWRsZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHNjcm9sbFBvc2l0aW9uID09PSBsYXN0SWRsZUNoZWNrUG9zaXRpb24pIHtcbiAgICAgICAgICAvLyBQb3NpdGlvbiBoYXNuJ3QgY2hhbmdlZCAtIHdlJ3JlIGlkbGVcbiAgICAgICAgICBpZiAoIWhhc0VtaXR0ZWRJZGxlICYmIChzcGVlZFRyYWNrZXIudmVsb2NpdHkgPiAwIHx8IGlzU2Nyb2xsaW5nKSkge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIFwiW1Njcm9sbGluZ10gSWRsZSBkZXRlY3RlZCAtIHBvc2l0aW9uIHN0YWJsZSwgc2V0dGluZyB2ZWxvY2l0eSB0byB6ZXJvXCJcbiAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgICBoYXNFbWl0dGVkSWRsZSA9IHRydWU7IC8vIE1hcmsgdGhhdCB3ZSd2ZSBlbWl0dGVkIGlkbGVcbiAgICAgICAgICAgIHNldFZlbG9jaXR5VG9aZXJvKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFBvc2l0aW9uIGNoYW5nZWQsIHJlc2V0IHRoZSBmbGFnXG4gICAgICAgICAgaGFzRW1pdHRlZElkbGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0SWRsZUNoZWNrUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgICAgaWRsZUNoZWNrRnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2hlY2tJZGxlKTtcbiAgICAgIH07XG4gICAgICBpZGxlQ2hlY2tGcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShjaGVja0lkbGUpO1xuICAgIH07XG5cbiAgICAvLyBTdG9wIGlkbGUgZGV0ZWN0aW9uXG4gICAgY29uc3Qgc3RvcElkbGVEZXRlY3Rpb24gPSAoKSA9PiB7XG4gICAgICBpZiAoaWRsZUNoZWNrRnJhbWUpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJbU2Nyb2xsaW5nXSBTdG9wcGluZyBpZGxlIGRldGVjdGlvblwiKTtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWRsZUNoZWNrRnJhbWUpO1xuICAgICAgICBpZGxlQ2hlY2tGcmFtZSA9IG51bGw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFNldCB2ZWxvY2l0eSB0byB6ZXJvIGFuZCBlbWl0IGlkbGUgZXZlbnRcbiAgICBjb25zdCBzZXRWZWxvY2l0eVRvWmVybyA9ICgpID0+IHtcbiAgICAgIC8vIFN0b3AgaWRsZSBkZXRlY3Rpb24gc2luY2Ugd2UncmUgbm93IGlkbGVcbiAgICAgIHN0b3BJZGxlRGV0ZWN0aW9uKCk7XG5cbiAgICAgIHNwZWVkVHJhY2tlciA9IGNyZWF0ZVNwZWVkVHJhY2tlcigpO1xuICAgICAgaXNTY3JvbGxpbmcgPSBmYWxzZTsgLy8gUmVzZXQgc2Nyb2xsaW5nIHN0YXRlXG5cbiAgICAgIC8vIEVtaXQgdmVsb2NpdHkgY2hhbmdlXG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6dmVsb2NpdHktY2hhbmdlZFwiLCB7XG4gICAgICAgIHZlbG9jaXR5OiAwLFxuICAgICAgICBkaXJlY3Rpb246IHNwZWVkVHJhY2tlci5kaXJlY3Rpb24sXG4gICAgICB9KTtcblxuICAgICAgLy8gRW1pdCBpZGxlIHN0YXRlXG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6aWRsZVwiLCB7XG4gICAgICAgIHBvc2l0aW9uOiBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgbGFzdFNjcm9sbFRpbWUsXG4gICAgICB9KTtcbiAgICB9O1xuICAgIC8vIFVwZGF0ZSBjb250YWluZXIgcG9zaXRpb25cbiAgICBjb25zdCB1cGRhdGVDb250YWluZXJQb3NpdGlvbiA9ICgpID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSB8fCAhdmlld3BvcnRTdGF0ZS5pdGVtc0NvbnRhaW5lcikgcmV0dXJuO1xuXG4gICAgICAvLyBJdGVtcyBjb250YWluZXIgZG9lc24ndCBtb3ZlIC0gaXRlbXMgaW5zaWRlIGl0IGFyZSBwb3NpdGlvbmVkXG4gICAgICAvLyBUaGlzIGlzIGhhbmRsZWQgYnkgdGhlIHJlbmRlcmluZyBmZWF0dXJlXG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSBtb3VzZWRvd24gdG8gc3RvcCBzY3JvbGxpbmcgb24gY2xpY2tcbiAgICBjb25zdCBoYW5kbGVNb3VzZURvd24gPSAoX2U6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIC8vIEFuY2hvciB0aGUgY3VycmVudCBzY3JvbGwgcG9zaXRpb24gLSBhbnkgd2hlZWwgZXZlbnRzIHdpbGwgYmUgZm9yY2VkIGJhY2sgdG8gdGhpcyBwb3NpdGlvblxuICAgICAgLy8gVGhpcyBlbGVnYW50bHkgaGFuZGxlcyBtb3VzZSB3aGVlbHMgd2l0aCBwaHlzaWNhbCBpbmVydGlhIChsaWtlIExvZ2l0ZWNoIGZyZWUtc3BpbilcbiAgICAgIGFuY2hvclBvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICBhbmNob3JUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGFuY2hvckluaXRpYWxEZWx0YSA9IDA7IC8vIFdpbGwgYmUgc2V0IGJ5IGZpcnN0IHdoZWVsIGV2ZW50XG4gICAgICBhbmNob3JMYXN0RGVsdGEgPSAwO1xuICAgICAgYW5jaG9yTWluRGVsdGEgPSBJbmZpbml0eTtcbiAgICAgIGNvbnNlY3V0aXZlSW5jcmVhc2VzID0gMDtcbiAgICAgIHN1c3RhaW5lZEhpZ2hDb3VudCA9IDA7XG5cbiAgICAgIC8vIE9ubHkgc3RvcCBpZiB3ZSdyZSBjdXJyZW50bHkgc2Nyb2xsaW5nXG4gICAgICBpZiAoaXNTY3JvbGxpbmcgfHwgc3BlZWRUcmFja2VyLnZlbG9jaXR5ID4gMCkge1xuICAgICAgICBzZXRWZWxvY2l0eVRvWmVybygpO1xuICAgICAgfVxuICAgICAgLy8gQWxzbyBzdG9wIG1vbWVudHVtIGFuaW1hdGlvbiBpZiBhY3RpdmVcbiAgICAgIGNvbnN0IG1vbWVudHVtU3RhdGUgPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkubW9tZW50dW1TdGF0ZTtcbiAgICAgIGlmIChtb21lbnR1bVN0YXRlPy5zdG9wTW9tZW50dW0pIHtcbiAgICAgICAgbW9tZW50dW1TdGF0ZS5zdG9wTW9tZW50dW0oKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIHdoZWVsIGV2ZW50XG4gICAgY29uc3QgaGFuZGxlV2hlZWwgPSAoZXZlbnQ6IFdoZWVsRXZlbnQpID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIGNvbnN0IGRlbHRhID0gb3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIiA/IGV2ZW50LmRlbHRhWSA6IGV2ZW50LmRlbHRhWDtcbiAgICAgIGNvbnN0IHNjcm9sbERlbHRhID0gZGVsdGEgKiBzZW5zaXRpdml0eTtcblxuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHRpbWVTaW5jZUxhc3RXaGVlbCA9IG5vdyAtIGxhc3RXaGVlbFRpbWU7XG4gICAgICBsYXN0V2hlZWxUaW1lID0gbm93O1xuXG4gICAgICAvLyBJZiB3ZSBoYXZlIGFuIGFuY2hvciBwb3NpdGlvbiAodXNlciBjbGlja2VkIHRvIHN0b3Agc2Nyb2xsaW5nKSxcbiAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaXMgaW50ZW50aW9uYWwgbmV3IHNjcm9sbGluZyBvciByZXNpZHVhbCB3aGVlbCBpbmVydGlhXG4gICAgICBpZiAoYW5jaG9yUG9zaXRpb24gIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgdGltZVNpbmNlQW5jaG9yID0gbm93IC0gYW5jaG9yVGltZTtcbiAgICAgICAgY29uc3Qgd2hlZWxEZWx0YU1hZ25pdHVkZSA9IE1hdGguYWJzKHNjcm9sbERlbHRhKTtcblxuICAgICAgICAvLyBUcmFjayBpbml0aWFsIGRlbHRhIHRvIGRldGVjdCB3aGVuIGluZXJ0aWEgaGFzIGRlY2F5ZWRcbiAgICAgICAgaWYgKGFuY2hvckluaXRpYWxEZWx0YSA9PT0gMCkge1xuICAgICAgICAgIGFuY2hvckluaXRpYWxEZWx0YSA9IHdoZWVsRGVsdGFNYWduaXR1ZGU7XG4gICAgICAgICAgYW5jaG9yTGFzdERlbHRhID0gd2hlZWxEZWx0YU1hZ25pdHVkZTtcbiAgICAgICAgICBhbmNob3JNaW5EZWx0YSA9IHdoZWVsRGVsdGFNYWduaXR1ZGU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmFjayBtaW5pbXVtIGRlbHRhIHRvIGRldGVjdCByZWFjY2VsZXJhdGlvbiAodXNlciBzdGFydGVkIHNjcm9sbGluZyBhZ2FpbilcbiAgICAgICAgYW5jaG9yTWluRGVsdGEgPSBNYXRoLm1pbihhbmNob3JNaW5EZWx0YSwgd2hlZWxEZWx0YU1hZ25pdHVkZSk7XG5cbiAgICAgICAgLy8gRGV0ZWN0IGlmIGRlbHRhIGlzIGluY3JlYXNpbmcgKHVzZXIgc3RhcnRlZCBuZXcgc2Nyb2xsKVxuICAgICAgICAvLyBJbmVydGlhIG9ubHkgZGVjYXlzLCBzbyBpbmNyZWFzaW5nIGRlbHRhID0gaW50ZW50aW9uYWwgbmV3IHNjcm9sbGluZ1xuICAgICAgICAvLyBCVVQ6IGZpbHRlciBvdXQgYmF0Y2hlZCBldmVudHMgd2hlcmUgZGVsdGEgaXMgfjJ4IHRoZSBsYXN0IChicm93c2VyIGJhdGNoaW5nLCBub3QgcmVhbCBpbmNyZWFzZSlcbiAgICAgICAgY29uc3QgaXNCYXRjaGVkRXZlbnQgPVxuICAgICAgICAgIHdoZWVsRGVsdGFNYWduaXR1ZGUgPiBhbmNob3JMYXN0RGVsdGEgKiAxLjggJiZcbiAgICAgICAgICB3aGVlbERlbHRhTWFnbml0dWRlIDwgYW5jaG9yTGFzdERlbHRhICogMi4yO1xuXG4gICAgICAgIC8vIFRyYWNrIGNvbnNlY3V0aXZlIGluY3JlYXNlcyAtIHN1c3RhaW5lZCBpbmNyZWFzZXMgaW5kaWNhdGUgbmV3IHNjcm9sbGluZ1xuICAgICAgICAvLyBVc2UgMSUgdGhyZXNob2xkIHRvIGNhdGNoIGdyYWR1YWwgYWNjZWxlcmF0aW9uXG4gICAgICAgIGlmICghaXNCYXRjaGVkRXZlbnQgJiYgd2hlZWxEZWx0YU1hZ25pdHVkZSA+IGFuY2hvckxhc3REZWx0YSAqIDEuMDEpIHtcbiAgICAgICAgICBjb25zZWN1dGl2ZUluY3JlYXNlcysrO1xuICAgICAgICB9IGVsc2UgaWYgKHdoZWVsRGVsdGFNYWduaXR1ZGUgPCBhbmNob3JMYXN0RGVsdGEgKiAwLjk5KSB7XG4gICAgICAgICAgLy8gRGVsdGEgZGVjcmVhc2luZyAtIHJlc2V0IGNvdW50ZXJcbiAgICAgICAgICBjb25zZWN1dGl2ZUluY3JlYXNlcyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgZGVsdGEgaXMgcm91Z2hseSB0aGUgc2FtZSAod2l0aGluIDElKSwgZG9uJ3QgY2hhbmdlIHRoZSBjb3VudGVyXG5cbiAgICAgICAgLy8gVHJhY2sgc3VzdGFpbmVkIGhpZ2ggZGVsdGEgKGRlbHRhIHNpZ25pZmljYW50bHkgYWJvdmUgbWluaW11bSBmb3IgbXVsdGlwbGUgZXZlbnRzKVxuICAgICAgICAvLyBUaGlzIGNhdGNoZXMgd2hlbiB1c2VyIHN0YXJ0cyBzY3JvbGxpbmcgYnV0IGRlbHRhIHBsYXRlYXVzIGluc3RlYWQgb2Ygc3RyaWN0bHkgaW5jcmVhc2luZ1xuICAgICAgICBpZiAoIWlzQmF0Y2hlZEV2ZW50ICYmIHdoZWVsRGVsdGFNYWduaXR1ZGUgPiBhbmNob3JNaW5EZWx0YSAqIDEuMDUpIHtcbiAgICAgICAgICBzdXN0YWluZWRIaWdoQ291bnQrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdXN0YWluZWRIaWdoQ291bnQgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVsZWFzZSBpZjogMysgY29uc2VjdXRpdmUgaW5jcmVhc2VzLCBPUiBzdXN0YWluZWQgaGlnaCBkZWx0YSwgT1Igc2lnbmlmaWNhbnQgc2luZ2xlIGluY3JlYXNlXG4gICAgICAgIGNvbnN0IHN1c3RhaW5lZEluY3JlYXNlID0gY29uc2VjdXRpdmVJbmNyZWFzZXMgPj0gMztcbiAgICAgICAgY29uc3Qgc3VzdGFpbmVkSGlnaCA9IHN1c3RhaW5lZEhpZ2hDb3VudCA+PSA1OyAvLyA1KyBldmVudHMgYXQgNSUrIGFib3ZlIG1pbmltdW1cbiAgICAgICAgY29uc3Qgc2lnbmlmaWNhbnRJbmNyZWFzZSA9XG4gICAgICAgICAgIWlzQmF0Y2hlZEV2ZW50ICYmXG4gICAgICAgICAgd2hlZWxEZWx0YU1hZ25pdHVkZSA+IGFuY2hvck1pbkRlbHRhICogMS4xNSAmJiAvLyAxNSUgaW5jcmVhc2UgZnJvbSBtaW5pbXVtXG4gICAgICAgICAgd2hlZWxEZWx0YU1hZ25pdHVkZSA+IGFuY2hvckxhc3REZWx0YSAqIDEuMDg7IC8vIGFuZCA4JSBpbmNyZWFzaW5nIGZyb20gbGFzdFxuICAgICAgICBjb25zdCBkZWx0YUluY3JlYXNpbmcgPVxuICAgICAgICAgIHN1c3RhaW5lZEluY3JlYXNlIHx8IHN1c3RhaW5lZEhpZ2ggfHwgc2lnbmlmaWNhbnRJbmNyZWFzZTtcblxuICAgICAgICAvLyBSZWxlYXNlIGFuY2hvciBpZjpcbiAgICAgICAgLy8gMS4gVGhlcmUgd2FzIGEgZ2FwIGluIHdoZWVsIGV2ZW50cyAoPiAyMDBtcykgLSB1c2VyIHN0b3BwZWQgYW5kIHN0YXJ0ZWQgbmV3IHNjcm9sbFxuICAgICAgICAvLyAyLiBEZWx0YSBpcyBpbmNyZWFzaW5nIGZyb20gbWluaW11bSAtIHVzZXIgc3RhcnRlZCBzY3JvbGxpbmcgYWdhaW4gZHVyaW5nIGluZXJ0aWFcbiAgICAgICAgLy8gMy4gRGVsdGEgaGFzIGRlY2F5ZWQgc2lnbmlmaWNhbnRseSAoPCAzMCUgb2YgaW5pdGlhbCkgLSBpbmVydGlhIGlzIHdpbmRpbmcgZG93blxuICAgICAgICAvLyA0LiBMb3cgYWJzb2x1dGUgZGVsdGEgKDwgMzApIC0gZ2VudGxlIGludGVudGlvbmFsIHNjcm9sbFxuICAgICAgICBjb25zdCBoYXNXaGVlbEdhcCA9IHRpbWVTaW5jZUxhc3RXaGVlbCA+IDIwMDtcbiAgICAgICAgY29uc3QgZGVsdGFEZWNheWVkID0gd2hlZWxEZWx0YU1hZ25pdHVkZSA8IGFuY2hvckluaXRpYWxEZWx0YSAqIDAuMztcbiAgICAgICAgY29uc3QgaXNMb3dEZWx0YSA9IHdoZWVsRGVsdGFNYWduaXR1ZGUgPCAzMDtcblxuICAgICAgICBpZiAoaGFzV2hlZWxHYXApIHtcbiAgICAgICAgICAvLyBUaW1lIGdhcCAtIHVzZXIgc3RvcHBlZCBhbmQgc3RhcnRlZCBuZXcgc2Nyb2xsXG4gICAgICAgICAgYW5jaG9yUG9zaXRpb24gPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKGRlbHRhSW5jcmVhc2luZyAmJiB0aW1lU2luY2VBbmNob3IgPiAxMDApIHtcbiAgICAgICAgICAvLyBEZWx0YSBpbmNyZWFzaW5nIC0gdXNlciBzdGFydGVkIHNjcm9sbGluZyBhZ2FpblxuICAgICAgICAgIGFuY2hvclBvc2l0aW9uID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChpc0xvd0RlbHRhKSB7XG4gICAgICAgICAgLy8gVmVyeSBsb3cgZGVsdGEgLSBnZW50bGUgaW50ZW50aW9uYWwgc2Nyb2xsXG4gICAgICAgICAgYW5jaG9yUG9zaXRpb24gPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKGRlbHRhRGVjYXllZCAmJiB0aW1lU2luY2VBbmNob3IgPiAzMDApIHtcbiAgICAgICAgICAvLyBEZWx0YSBoYXMgZGVjYXllZCBhbmQgc29tZSB0aW1lIHBhc3NlZCAtIGluZXJ0aWEgaXMgZG9uZVxuICAgICAgICAgIGFuY2hvclBvc2l0aW9uID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTdGlsbCBpbiBpbmVydGlhIHBoYXNlIC0gc3RheSBhbmNob3JlZFxuICAgICAgICAgIGlmIChzY3JvbGxQb3NpdGlvbiAhPT0gYW5jaG9yUG9zaXRpb24pIHtcbiAgICAgICAgICAgIHNjcm9sbFBvc2l0aW9uID0gYW5jaG9yUG9zaXRpb247XG4gICAgICAgICAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQucmVuZGVySXRlbXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVXBkYXRlIGxhc3QgZGVsdGEgZm9yIG5leHQgY29tcGFyaXNvblxuICAgICAgICAgIGFuY2hvckxhc3REZWx0YSA9IHdoZWVsRGVsdGFNYWduaXR1ZGU7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGxhc3QgZGVsdGEgZm9yIG5leHQgY29tcGFyaXNvblxuICAgICAgICBhbmNob3JMYXN0RGVsdGEgPSB3aGVlbERlbHRhTWFnbml0dWRlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcmV2aW91c1Bvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICBjb25zdCBtYXhTY3JvbGwgPSBNYXRoLm1heCgwLCB0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZSk7XG5cbiAgICAgIGxldCBuZXdQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uICsgc2Nyb2xsRGVsdGE7XG5cbiAgICAgIC8vIEFwcGx5IHNtb290aGluZyBpZiBlbmFibGVkXG4gICAgICBpZiAoc21vb3RoaW5nKSB7XG4gICAgICAgIGNvbnN0IHNtb290aGluZ0ZhY3RvciA9IDAuMztcbiAgICAgICAgbmV3UG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbiArIHNjcm9sbERlbHRhICogc21vb3RoaW5nRmFjdG9yO1xuICAgICAgfVxuXG4gICAgICBuZXdQb3NpdGlvbiA9IGNsYW1wKG5ld1Bvc2l0aW9uLCAwLCBtYXhTY3JvbGwpO1xuXG4gICAgICBpZiAobmV3UG9zaXRpb24gIT09IHNjcm9sbFBvc2l0aW9uKSB7XG4gICAgICAgIHNjcm9sbFBvc2l0aW9uID0gbmV3UG9zaXRpb247XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHNjcm9sbCBzdGF0ZVxuICAgICAgICBpZiAoIWlzU2Nyb2xsaW5nKSB7XG4gICAgICAgICAgaXNTY3JvbGxpbmcgPSB0cnVlO1xuICAgICAgICAgIC8vIFN0b3AgYW55IGV4aXN0aW5nIGlkbGUgZGV0ZWN0aW9uIGJlZm9yZSBzdGFydGluZyBuZXcgb25lXG4gICAgICAgICAgc3RvcElkbGVEZXRlY3Rpb24oKTtcbiAgICAgICAgICBzdGFydElkbGVEZXRlY3Rpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0U2Nyb2xsVGltZSA9IG5vdztcblxuICAgICAgICAvLyBVcGRhdGUgc3BlZWQgdHJhY2tlclxuICAgICAgICBzcGVlZFRyYWNrZXIgPSB1cGRhdGVTcGVlZFRyYWNrZXIoXG4gICAgICAgICAgc3BlZWRUcmFja2VyLFxuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgIHByZXZpb3VzUG9zaXRpb24sXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHZpZXdwb3J0IHN0YXRlXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUudmVsb2NpdHkgPSBzcGVlZFRyYWNrZXIudmVsb2NpdHk7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxEaXJlY3Rpb24gPSBzcGVlZFRyYWNrZXIuZGlyZWN0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBldmVudHNcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnNjcm9sbFwiLCB7XG4gICAgICAgICAgcG9zaXRpb246IHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgIGRpcmVjdGlvbjogc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgICAgICBwcmV2aW91c1Bvc2l0aW9uLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6dmVsb2NpdHktY2hhbmdlZFwiLCB7XG4gICAgICAgICAgdmVsb2NpdHk6IHNwZWVkVHJhY2tlci52ZWxvY2l0eSxcbiAgICAgICAgICBkaXJlY3Rpb246IHNwZWVkVHJhY2tlci5kaXJlY3Rpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgcmVuZGVyXG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTY3JvbGwgdG8gcG9zaXRpb25cbiAgICBjb25zdCBzY3JvbGxUb1Bvc2l0aW9uID0gKHBvc2l0aW9uOiBudW1iZXIsIHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgbWF4U2Nyb2xsID0gTWF0aC5tYXgoMCwgdG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuICAgICAgY29uc3QgY2xhbXBlZFBvc2l0aW9uID0gY2xhbXAocG9zaXRpb24sIDAsIG1heFNjcm9sbCk7XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGluZ10gc2Nyb2xsVG9Qb3NpdGlvbjogcG9zPSR7cG9zaXRpb259IC0+ICR7Y2xhbXBlZFBvc2l0aW9ufSwgc291cmNlPSR7c291cmNlfSwgY3VycmVudFBvcz0ke3Njcm9sbFBvc2l0aW9ufSwgdmVsb2NpdHk9JHtzcGVlZFRyYWNrZXIudmVsb2NpdHkudG9GaXhlZChcbiAgICAgIC8vICAgICAzXG4gICAgICAvLyAgICl9YFxuICAgICAgLy8gKTtcblxuICAgICAgaWYgKGNsYW1wZWRQb3NpdGlvbiAhPT0gc2Nyb2xsUG9zaXRpb24pIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgICBzY3JvbGxQb3NpdGlvbiA9IGNsYW1wZWRQb3NpdGlvbjtcblxuICAgICAgICAvLyBVcGRhdGUgc3BlZWQgdHJhY2tlciB0byBjYWxjdWxhdGUgdmVsb2NpdHlcbiAgICAgICAgc3BlZWRUcmFja2VyID0gdXBkYXRlU3BlZWRUcmFja2VyKFxuICAgICAgICAgIHNwZWVkVHJhY2tlcixcbiAgICAgICAgICBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgICBwcmV2aW91c1Bvc2l0aW9uLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFVwZGF0ZSB2aWV3cG9ydCBzdGF0ZVxuICAgICAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnZlbG9jaXR5ID0gc3BlZWRUcmFja2VyLnZlbG9jaXR5O1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsRGlyZWN0aW9uID0gc3BlZWRUcmFja2VyLmRpcmVjdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9XG4gICAgICAgICAgY2xhbXBlZFBvc2l0aW9uID4gcHJldmlvdXNQb3NpdGlvbiA/IFwiZm9yd2FyZFwiIDogXCJiYWNrd2FyZFwiO1xuXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpzY3JvbGxcIiwge1xuICAgICAgICAgIHBvc2l0aW9uOiBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgICBkaXJlY3Rpb24sXG4gICAgICAgICAgcHJldmlvdXNQb3NpdGlvbixcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEVtaXQgdmVsb2NpdHkgY2hhbmdlIGV2ZW50IHNvIGNvbGxlY3Rpb24gY2FuIHRyYWNrIGl0XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDp2ZWxvY2l0eS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgICB2ZWxvY2l0eTogc3BlZWRUcmFja2VyLnZlbG9jaXR5LFxuICAgICAgICAgIGRpcmVjdGlvbjogc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHNjcm9sbCBzdGF0ZSBhbmQgaWRsZSBkZXRlY3Rpb25cbiAgICAgICAgaWYgKCFpc1Njcm9sbGluZykge1xuICAgICAgICAgIGlzU2Nyb2xsaW5nID0gdHJ1ZTtcbiAgICAgICAgICBzdGFydElkbGVEZXRlY3Rpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0U2Nyb2xsVGltZSA9IERhdGUubm93KCk7XG5cbiAgICAgICAgLy8gVHJpZ2dlciByZW5kZXJcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnJlbmRlckl0ZW1zKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW1Njcm9sbGluZ10gUG9zaXRpb24gdW5jaGFuZ2VkOiAke3Njcm9sbFBvc2l0aW9ufWApO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW1Njcm9sbGluZ10gUG9zaXRpb24gdW5jaGFuZ2VkOiAke3Njcm9sbFBvc2l0aW9ufSwgbm90IHJlc2V0dGluZyBpZGxlIHRpbWVvdXRgXG4gICAgICAgIC8vICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFNjcm9sbCB0byBpbmRleFxuICAgIGNvbnN0IHNjcm9sbFRvSW5kZXggPSAoXG4gICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgYWxpZ25tZW50OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiA9IFwic3RhcnRcIixcbiAgICApID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGluZ10gc2Nyb2xsVG9JbmRleCBjYWxsZWQ6IGluZGV4PSR7aW5kZXh9LCBhbGlnbm1lbnQ9JHthbGlnbm1lbnR9YFxuICAgICAgLy8gKTtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSkge1xuICAgICAgICAvL2NvbnNvbGUubG9nKGBbU2Nyb2xsaW5nXSBzY3JvbGxUb0luZGV4IGFib3J0ZWQ6IG5vIHZpZXdwb3J0IHN0YXRlYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXRlbVNpemUgPSB2aWV3cG9ydFN0YXRlLml0ZW1TaXplIHx8IDUwO1xuICAgICAgY29uc3QgdG90YWxJdGVtcyA9IHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyB8fCAwO1xuICAgICAgY29uc3QgYWN0dWFsVG90YWxTaXplID0gdG90YWxJdGVtcyAqIGl0ZW1TaXplO1xuICAgICAgY29uc3QgTUFYX1ZJUlRVQUxfU0laRSA9XG4gICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5WSVJUVUFMX1NDUk9MTC5NQVhfVklSVFVBTF9TSVpFO1xuICAgICAgY29uc3QgaXNDb21wcmVzc2VkID0gYWN0dWFsVG90YWxTaXplID4gTUFYX1ZJUlRVQUxfU0laRTtcblxuICAgICAgbGV0IHRhcmdldFBvc2l0aW9uOiBudW1iZXI7XG5cbiAgICAgIGlmIChpc0NvbXByZXNzZWQpIHtcbiAgICAgICAgLy8gSW4gY29tcHJlc3NlZCBzcGFjZSwgbWFwIGluZGV4IHRvIHZpcnR1YWwgcG9zaXRpb25cbiAgICAgICAgY29uc3QgcmF0aW8gPSBpbmRleCAvIHRvdGFsSXRlbXM7XG4gICAgICAgIHRhcmdldFBvc2l0aW9uID0gcmF0aW8gKiBNYXRoLm1pbihhY3R1YWxUb3RhbFNpemUsIE1BWF9WSVJUVUFMX1NJWkUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRGlyZWN0IGNhbGN1bGF0aW9uIHdoZW4gbm90IGNvbXByZXNzZWRcbiAgICAgICAgdGFyZ2V0UG9zaXRpb24gPSBpbmRleCAqIGl0ZW1TaXplO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGp1c3QgcG9zaXRpb24gYmFzZWQgb24gYWxpZ25tZW50XG4gICAgICBzd2l0Y2ggKGFsaWdubWVudCkge1xuICAgICAgICBjYXNlIFwiY2VudGVyXCI6XG4gICAgICAgICAgdGFyZ2V0UG9zaXRpb24gLT0gY29udGFpbmVyU2l6ZSAvIDIgLSBpdGVtU2l6ZSAvIDI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICB0YXJnZXRQb3NpdGlvbiAtPSBjb250YWluZXJTaXplIC0gaXRlbVNpemU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGluZ10gVGFyZ2V0IHBvc2l0aW9uOiAke3RhcmdldFBvc2l0aW9ufSwgaXNDb21wcmVzc2VkOiAke2lzQ29tcHJlc3NlZH1gXG4gICAgICAvLyApO1xuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtTY3JvbGxpbmddIFNjcm9sbFRvSW5kZXg6IGluZGV4PSR7aW5kZXh9LCBwb3NpdGlvbj0ke3RhcmdldFBvc2l0aW9ufSwgYWxpZ25tZW50PSR7YWxpZ25tZW50fWBcbiAgICAgIC8vICk7XG5cbiAgICAgIHNjcm9sbFRvUG9zaXRpb24odGFyZ2V0UG9zaXRpb24sIFwic2Nyb2xsVG9JbmRleFwiKTtcbiAgICB9O1xuXG4gICAgLy8gU2Nyb2xsIHRvIGEgc3BlY2lmaWMgcGFnZVxuICAgIGNvbnN0IHNjcm9sbFRvUGFnZSA9IChcbiAgICAgIHBhZ2U6IG51bWJlcixcbiAgICAgIGxpbWl0OiBudW1iZXIgPSAyMCxcbiAgICAgIGFsaWdubWVudDogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIsXG4gICAgKSA9PiB7XG4gICAgICAvLyBWYWxpZGF0ZSBhbGlnbm1lbnQgcGFyYW1ldGVyXG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBhbGlnbm1lbnQgIT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgIVtcInN0YXJ0XCIsIFwiY2VudGVyXCIsIFwiZW5kXCJdLmluY2x1ZGVzKGFsaWdubWVudClcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtTY3JvbGxpbmddIEludmFsaWQgYWxpZ25tZW50IFwiJHthbGlnbm1lbnR9XCIsIHVzaW5nIFwic3RhcnRcImAsXG4gICAgICAgICk7XG4gICAgICAgIGFsaWdubWVudCA9IFwic3RhcnRcIjtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgd2UncmUgaW4gY3Vyc29yIG1vZGVcbiAgICAgIGNvbnN0IHZpZXdwb3J0Q29uZmlnID0gKGNvbXBvbmVudCBhcyBhbnkpLmNvbmZpZztcbiAgICAgIGNvbnN0IGlzQ3Vyc29yTW9kZSA9IHZpZXdwb3J0Q29uZmlnPy5wYWdpbmF0aW9uPy5zdHJhdGVneSA9PT0gXCJjdXJzb3JcIjtcblxuICAgICAgaWYgKGlzQ3Vyc29yTW9kZSkge1xuICAgICAgICAvLyBJbiBjdXJzb3IgbW9kZSwgY2hlY2sgaWYgd2UgY2FuIHNjcm9sbCB0byB0aGlzIHBhZ2VcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5jb2xsZWN0aW9uO1xuICAgICAgICBpZiAoY29sbGVjdGlvbikge1xuICAgICAgICAgIGNvbnN0IGhpZ2hlc3RMb2FkZWRQYWdlID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgIGNvbGxlY3Rpb24uZ2V0TG9hZGVkUmFuZ2VzKCkuc2l6ZSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHBhZ2UgPiBoaWdoZXN0TG9hZGVkUGFnZSArIDEpIHtcbiAgICAgICAgICAgIC8vIExpbWl0IGhvdyBtYW55IHBhZ2VzIHdlJ2xsIGxvYWQgYXQgb25jZSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSBBUEkgY2FsbHNcbiAgICAgICAgICAgIGNvbnN0IG1heFBhZ2VzVG9Mb2FkID0gMTA7IC8vIFJlYXNvbmFibGUgbGltaXRcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldFBhZ2UgPSBNYXRoLm1pbihcbiAgICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgICAgaGlnaGVzdExvYWRlZFBhZ2UgKyBtYXhQYWdlc1RvTG9hZCxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgYFtTY3JvbGxpbmddIENhbm5vdCBqdW1wIGRpcmVjdGx5IHRvIHBhZ2UgJHtwYWdlfSBpbiBjdXJzb3IgbW9kZS4gYCArXG4gICAgICAgICAgICAgICAgYFBhZ2VzIG11c3QgYmUgbG9hZGVkIHNlcXVlbnRpYWxseS4gQ3VycmVudCBoaWdoZXN0IHBhZ2U6ICR7aGlnaGVzdExvYWRlZFBhZ2V9LiBgICtcbiAgICAgICAgICAgICAgICBgV2lsbCBsb2FkIHVwIHRvIHBhZ2UgJHt0YXJnZXRQYWdlfWAsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBUcmlnZ2VyIHNlcXVlbnRpYWwgbG9hZGluZyB0byB0aGUgdGFyZ2V0IHBhZ2UgKGxpbWl0ZWQpXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRPZmZzZXQgPSAodGFyZ2V0UGFnZSAtIDEpICogbGltaXQ7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50T2Zmc2V0ID0gaGlnaGVzdExvYWRlZFBhZ2UgKiBsaW1pdDtcblxuICAgICAgICAgICAgLy8gTG9hZCBwYWdlcyBzZXF1ZW50aWFsbHkgdXAgdG8gdGhlIGxpbWl0ZWQgdGFyZ2V0XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtTY3JvbGxpbmddIEluaXRpYXRpbmcgc2VxdWVudGlhbCBsb2FkIGZyb20gcGFnZSAke1xuICAgICAgICAgICAgLy8gICAgIGhpZ2hlc3RMb2FkZWRQYWdlICsgMVxuICAgICAgICAgICAgLy8gICB9IHRvICR7dGFyZ2V0UGFnZX1gLFxuICAgICAgICAgICAgLy8gKTtcblxuICAgICAgICAgICAgLy8gU2Nyb2xsIHRvIHRoZSBsYXN0IGxvYWRlZCBwb3NpdGlvbiBmaXJzdFxuICAgICAgICAgICAgY29uc3QgbGFzdExvYWRlZEluZGV4ID0gaGlnaGVzdExvYWRlZFBhZ2UgKiBsaW1pdDtcbiAgICAgICAgICAgIHNjcm9sbFRvSW5kZXgobGFzdExvYWRlZEluZGV4LCBhbGlnbm1lbnQpO1xuXG4gICAgICAgICAgICAvLyBUaGUgY29sbGVjdGlvbiBmZWF0dXJlIHdpbGwgaGFuZGxlIHNlcXVlbnRpYWwgbG9hZGluZ1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDb252ZXJ0IHBhZ2UgdG8gaW5kZXggKHBhZ2UgMSA9IGluZGV4IDApXG4gICAgICBjb25zdCBpbmRleCA9IChwYWdlIC0gMSkgKiBsaW1pdDtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbU2Nyb2xsaW5nXSBTY3JvbGxUb1BhZ2U6IHBhZ2U9JHtwYWdlfSwgbGltaXQ9JHtsaW1pdH0sIHRhcmdldEluZGV4PSR7aW5kZXh9LCBhbGlnbm1lbnQ9JHthbGlnbm1lbnR9YFxuICAgICAgLy8gKTtcblxuICAgICAgLy8gSnVzdCBzY3JvbGwgdG8gdGhlIGluZGV4IC0gbGV0IHRoZSBub3JtYWwgcmVuZGVyaW5nIGZsb3cgaGFuZGxlIGRhdGEgbG9hZGluZyBhbmQgcGxhY2Vob2xkZXJzXG4gICAgICBzY3JvbGxUb0luZGV4KGluZGV4LCBhbGlnbm1lbnQpO1xuICAgIH07XG5cbiAgICAvLyBVcGRhdGUgc2Nyb2xsIGJvdW5kc1xuICAgIGNvbnN0IHVwZGF0ZVNjcm9sbEJvdW5kcyA9IChcbiAgICAgIG5ld1RvdGFsU2l6ZTogbnVtYmVyLFxuICAgICAgbmV3Q29udGFpbmVyU2l6ZTogbnVtYmVyLFxuICAgICkgPT4ge1xuICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9IG5ld1RvdGFsU2l6ZTtcbiAgICAgIGNvbnRhaW5lclNpemUgPSBuZXdDb250YWluZXJTaXplO1xuXG4gICAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgICB2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemUgPSBuZXdUb3RhbFNpemU7XG4gICAgICAgIHZpZXdwb3J0U3RhdGUuY29udGFpbmVyU2l6ZSA9IG5ld0NvbnRhaW5lclNpemU7XG4gICAgICB9XG5cbiAgICAgIC8vIERvbid0IGNsYW1wIHNjcm9sbCBwb3NpdGlvbiB1bnRpbCB3ZSBoYXZlIHJlYWwgZGF0YSBsb2FkZWRcbiAgICAgIC8vIFRoaXMgcHJldmVudHMgcmVzZXR0aW5nIGluaXRpYWxTY3JvbGxJbmRleCBwb3NpdGlvbiBiZWZvcmUgZGF0YSBhcnJpdmVzXG4gICAgICAvLyBDaGVjayB0b3RhbEl0ZW1zIGluc3RlYWQgb2YgdG90YWxWaXJ0dWFsU2l6ZSBzaW5jZSB2aXJ0dWFsU2l6ZSBjYW4gYmUgbm9uLXplcm8gZnJvbSBwYWRkaW5nXG4gICAgICBjb25zdCB0b3RhbEl0ZW1zID0gdmlld3BvcnRTdGF0ZT8udG90YWxJdGVtcyB8fCAwO1xuICAgICAgaWYgKHRvdGFsSXRlbXMgPD0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIENsYW1wIGN1cnJlbnQgcG9zaXRpb24gdG8gbmV3IGJvdW5kc1xuICAgICAgY29uc3QgbWF4U2Nyb2xsID0gTWF0aC5tYXgoMCwgdG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuICAgICAgaWYgKHNjcm9sbFBvc2l0aW9uID4gbWF4U2Nyb2xsKSB7XG4gICAgICAgIHNjcm9sbFRvUG9zaXRpb24obWF4U2Nyb2xsKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gRXh0ZW5kIHZpZXdwb3J0IEFQSVxuICAgIGNvbnN0IG9yaWdpbmFsU2Nyb2xsVG9JbmRleCA9IGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb0luZGV4O1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb0luZGV4ID0gKFxuICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgIGFsaWdubWVudD86IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiLFxuICAgICkgPT4ge1xuICAgICAgc2Nyb2xsVG9JbmRleChpbmRleCwgYWxpZ25tZW50KTtcbiAgICAgIG9yaWdpbmFsU2Nyb2xsVG9JbmRleD8uKGluZGV4LCBhbGlnbm1lbnQpO1xuICAgIH07XG5cbiAgICAvLyBBZGQgc2Nyb2xsVG9QYWdlIHRvIHZpZXdwb3J0IEFQSSAobmV3IG1ldGhvZCwgbm8gb3JpZ2luYWwgdG8gcHJlc2VydmUpXG4gICAgKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLnNjcm9sbFRvUGFnZSA9IChcbiAgICAgIHBhZ2U6IG51bWJlcixcbiAgICAgIGxpbWl0PzogbnVtYmVyLFxuICAgICAgYWxpZ25tZW50PzogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIsXG4gICAgKSA9PiB7XG4gICAgICBzY3JvbGxUb1BhZ2UocGFnZSwgbGltaXQsIGFsaWdubWVudCk7XG4gICAgfTtcblxuICAgIGNvbnN0IG9yaWdpbmFsU2Nyb2xsVG9Qb3NpdGlvbiA9IGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb1Bvc2l0aW9uO1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb1Bvc2l0aW9uID0gKHBvc2l0aW9uOiBudW1iZXIpID0+IHtcbiAgICAgIHNjcm9sbFRvUG9zaXRpb24ocG9zaXRpb24sIFwiYXBpXCIpO1xuICAgICAgb3JpZ2luYWxTY3JvbGxUb1Bvc2l0aW9uPy4ocG9zaXRpb24pO1xuICAgIH07XG5cbiAgICBjb25zdCBvcmlnaW5hbEdldFNjcm9sbFBvc2l0aW9uID0gY29tcG9uZW50LnZpZXdwb3J0LmdldFNjcm9sbFBvc2l0aW9uO1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5nZXRTY3JvbGxQb3NpdGlvbiA9ICgpID0+IHtcbiAgICAgIHJldHVybiBzY3JvbGxQb3NpdGlvbjtcbiAgICB9O1xuXG4gICAgLy8gQWRkIHdoZWVsIGV2ZW50IGxpc3RlbmVyIG9uIGluaXRpYWxpemF0aW9uXG4gICAgLy8gVGhpcyBibG9jayBpcyByZW1vdmVkIGFzIHBlciB0aGUgZWRpdCBoaW50LlxuXG4gICAgLy8gQ2xlYW4gdXAgb24gZGVzdHJveVxuICAgIGlmIChcImRlc3Ryb3lcIiBpbiBjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IGNvbXBvbmVudC5kZXN0cm95O1xuICAgICAgY29tcG9uZW50LmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIFJlbW92ZSBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgY29uc3Qgdmlld3BvcnRFbGVtZW50ID0gKGNvbXBvbmVudCBhcyBhbnkpLl9zY3JvbGxpbmdWaWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgIGlmICh2aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIndoZWVsXCIsIGhhbmRsZVdoZWVsKTtcbiAgICAgICAgICBpZiAoKGNvbXBvbmVudCBhcyBhbnkpLl9zY3JvbGxpbmdTdG9wT25DbGljaykge1xuICAgICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgaGFuZGxlTW91c2VEb3duKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciB0aW1lb3V0c1xuICAgICAgICBpZiAoaWRsZVRpbWVvdXRJZCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dChpZGxlVGltZW91dElkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0b3BJZGxlRGV0ZWN0aW9uKCk7XG4gICAgICAgIG9yaWdpbmFsRGVzdHJveT8uKCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEFkZCBzY3JvbGxCeSBtZXRob2RcbiAgICBjb25zdCBzY3JvbGxCeSA9IChkZWx0YTogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBwcmV2aW91c1Bvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICBjb25zdCBtYXhTY3JvbGwgPSBNYXRoLm1heCgwLCB0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZSk7XG4gICAgICBjb25zdCBuZXdQb3NpdGlvbiA9IGNsYW1wKHNjcm9sbFBvc2l0aW9uICsgZGVsdGEsIDAsIG1heFNjcm9sbCk7XG5cbiAgICAgIGlmIChuZXdQb3NpdGlvbiAhPT0gcHJldmlvdXNQb3NpdGlvbikge1xuICAgICAgICBzY3JvbGxQb3NpdGlvbiA9IG5ld1Bvc2l0aW9uO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzcGVlZCB0cmFja2VyXG4gICAgICAgIHNwZWVkVHJhY2tlciA9IHVwZGF0ZVNwZWVkVHJhY2tlcihcbiAgICAgICAgICBzcGVlZFRyYWNrZXIsXG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgcHJldmlvdXNQb3NpdGlvbixcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBVcGRhdGUgdmlld3BvcnQgc3RhdGVcbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS52ZWxvY2l0eSA9IHNwZWVkVHJhY2tlci52ZWxvY2l0eTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtaXQgc2Nyb2xsIGV2ZW50XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpzY3JvbGxcIiwge1xuICAgICAgICAgIHBvc2l0aW9uOiBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgICB2ZWxvY2l0eTogc3BlZWRUcmFja2VyLnZlbG9jaXR5LFxuICAgICAgICAgIGRpcmVjdGlvbjogc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVHJpZ2dlciByZW5kZXJcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnJlbmRlckl0ZW1zPy4oKTtcblxuICAgICAgICAvLyBTdGFydCBpZGxlIGRldGVjdGlvbiBpZiBub3Qgc2Nyb2xsaW5nXG4gICAgICAgIGlmICghaXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICBpc1Njcm9sbGluZyA9IHRydWU7XG4gICAgICAgICAgc3RhcnRJZGxlRGV0ZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFNjcm9sbFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBFeHBvc2Ugc2Nyb2xsaW5nIHN0YXRlIGZvciBvdGhlciBmZWF0dXJlc1xuICAgIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zY3JvbGxpbmdTdGF0ZSA9IHtcbiAgICAgIHNldFZlbG9jaXR5VG9aZXJvLFxuICAgIH07XG5cbiAgICAvLyBBZGQgc2Nyb2xsQnkgdG8gdmlld3BvcnQgQVBJXG4gICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5ID0gc2Nyb2xsQnk7XG4gICAgY29tcG9uZW50LnZpZXdwb3J0LmdldFZlbG9jaXR5ID0gKCkgPT4gc3BlZWRUcmFja2VyLnZlbG9jaXR5O1xuXG4gICAgLy8gRXhwb3NlIHNjcm9sbGluZyBBUElcbiAgICAoY29tcG9uZW50IGFzIGFueSkuc2Nyb2xsaW5nID0ge1xuICAgICAgaGFuZGxlV2hlZWwsXG4gICAgICBzY3JvbGxUb1Bvc2l0aW9uLFxuICAgICAgc2Nyb2xsVG9JbmRleCxcbiAgICAgIHNjcm9sbFRvUGFnZSxcbiAgICAgIHNjcm9sbEJ5LFxuICAgICAgZ2V0U2Nyb2xsUG9zaXRpb246ICgpID0+IHNjcm9sbFBvc2l0aW9uLFxuICAgICAgdXBkYXRlU2Nyb2xsQm91bmRzLFxuICAgICAgZ2V0VmVsb2NpdHk6ICgpID0+IHNwZWVkVHJhY2tlci52ZWxvY2l0eSxcbiAgICAgIGdldERpcmVjdGlvbjogKCkgPT4gc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgIGlzU2Nyb2xsaW5nOiAoKSA9PiBpc1Njcm9sbGluZyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL21vbWVudHVtLnRzXG5cbi8qKlxuICogTW9tZW50dW0gRmVhdHVyZSAtIEFkZHMgaW5lcnRpYWwgc2Nyb2xsaW5nIHRvIHZpZXdwb3J0XG4gKiBQcm92aWRlcyBzbW9vdGggZGVjZWxlcmF0aW9uIGFmdGVyIHRvdWNoL21vdXNlIGRyYWcgZ2VzdHVyZXNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29tcG9uZW50LCBWaWV3cG9ydENvbnRleHQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZJRVdQT1JUX0NPTlNUQU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuaW50ZXJmYWNlIE1vbWVudHVtQ29uZmlnIHtcbiAgZW5hYmxlZD86IGJvb2xlYW47XG4gIGRlY2VsZXJhdGlvbj86IG51bWJlcjtcbiAgbWluVmVsb2NpdHk/OiBudW1iZXI7XG4gIG1pbkR1cmF0aW9uPzogbnVtYmVyO1xuICBtaW5WZWxvY2l0eVRocmVzaG9sZD86IG51bWJlcjtcbiAgLyoqIFN0b3AgbW9tZW50dW0gd2hlbiBjbGlja2luZyBvbiB0aGUgdmlld3BvcnQgKGRlZmF1bHQ6IHRydWUpICovXG4gIHN0b3BPbkNsaWNrPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBZGRzIG1vbWVudHVtIHNjcm9sbGluZyB0byB2aWV3cG9ydFxuICovXG5leHBvcnQgY29uc3Qgd2l0aE1vbWVudHVtID0gKGNvbmZpZzogTW9tZW50dW1Db25maWcgPSB7fSkgPT4ge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBWaWV3cG9ydENvbXBvbmVudD4oY29tcG9uZW50OiBUKTogVCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgZW5hYmxlZCA9IFZJRVdQT1JUX0NPTlNUQU5UUy5NT01FTlRVTS5FTkFCTEVELFxuICAgICAgZGVjZWxlcmF0aW9uID0gVklFV1BPUlRfQ09OU1RBTlRTLk1PTUVOVFVNLkRFQ0VMRVJBVElPTl9GQUNUT1IsXG4gICAgICBtaW5WZWxvY2l0eSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5NT01FTlRVTS5NSU5fVkVMT0NJVFksXG4gICAgICBtaW5EdXJhdGlvbiA9IFZJRVdQT1JUX0NPTlNUQU5UUy5NT01FTlRVTS5NSU5fRFVSQVRJT04sXG4gICAgICBtaW5WZWxvY2l0eVRocmVzaG9sZCA9IFZJRVdQT1JUX0NPTlNUQU5UUy5NT01FTlRVTS5NSU5fVkVMT0NJVFlfVEhSRVNIT0xELFxuICAgICAgc3RvcE9uQ2xpY2sgPSB0cnVlLCAvLyBTdG9wIG1vbWVudHVtIG9uIGNsaWNrIGJ5IGRlZmF1bHRcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gQWx3YXlzIGFwcGx5IHRoZSBmZWF0dXJlLCBidXQgY2hlY2sgaXNFbmFibGVkIGF0IHJ1bnRpbWVcblxuICAgIC8vIE1vbWVudHVtIHN0YXRlXG4gICAgbGV0IG1vbWVudHVtQW5pbWF0aW9uSWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGxldCBpc1RvdWNoaW5nID0gZmFsc2U7XG4gICAgbGV0IGlzTW91c2VEcmFnZ2luZyA9IGZhbHNlO1xuICAgIGxldCBsYXN0VG91Y2hQb3NpdGlvbiA9IDA7XG4gICAgbGV0IGxhc3RNb3VzZVBvc2l0aW9uID0gMDtcbiAgICBsZXQgdG91Y2hTdGFydFRpbWUgPSAwO1xuICAgIGxldCB2aWV3cG9ydFN0YXRlOiBhbnk7XG4gICAgbGV0IHNjcm9sbGluZ1N0YXRlOiBhbnk7XG4gICAgbGV0IGlzRW5hYmxlZCA9IGVuYWJsZWQ7IC8vIFRyYWNrIGN1cnJlbnQgZW5hYmxlZCBzdGF0ZVxuXG4gICAgLy8gR2V0IHJlZmVyZW5jZXMgYWZ0ZXIgaW5pdGlhbGl6YXRpb25cbiAgICBjb25zdCBvcmlnaW5hbEluaXRpYWxpemUgPSBjb21wb25lbnQudmlld3BvcnQuaW5pdGlhbGl6ZTtcbiAgICBjb21wb25lbnQudmlld3BvcnQuaW5pdGlhbGl6ZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG9yaWdpbmFsSW5pdGlhbGl6ZSgpO1xuICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IGluaXRpYWxpemVkXG4gICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCB2aWV3cG9ydCBhbmQgc2Nyb2xsaW5nIHN0YXRlc1xuICAgICAgdmlld3BvcnRTdGF0ZSA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zdGF0ZTtcbiAgICAgIHNjcm9sbGluZ1N0YXRlID0gKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLnNjcm9sbGluZ1N0YXRlO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgLy8gU3RvcCBtb21lbnR1bSBhbmltYXRpb24gKGNhbiBiZSBjYWxsZWQgZXh0ZXJuYWxseSlcbiAgICBjb25zdCBzdG9wTW9tZW50dW0gPSAoKSA9PiB7XG4gICAgICBpZiAobW9tZW50dW1BbmltYXRpb25JZCkge1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShtb21lbnR1bUFuaW1hdGlvbklkKTtcbiAgICAgICAgbW9tZW50dW1BbmltYXRpb25JZCA9IG51bGw7XG4gICAgICAgIC8vIFJlc2V0IHZlbG9jaXR5IGluIHNjcm9sbGluZyBmZWF0dXJlXG4gICAgICAgIGlmIChzY3JvbGxpbmdTdGF0ZSkge1xuICAgICAgICAgIHNjcm9sbGluZ1N0YXRlLnNldFZlbG9jaXR5VG9aZXJvPy4oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTdGFydCBtb21lbnR1bSBhbmltYXRpb25cbiAgICBjb25zdCBzdGFydE1vbWVudHVtID0gKGluaXRpYWxWZWxvY2l0eTogbnVtYmVyKSA9PiB7XG4gICAgICAvLyBDYW5jZWwgYW55IGV4aXN0aW5nIG1vbWVudHVtXG4gICAgICBpZiAobW9tZW50dW1BbmltYXRpb25JZCkge1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShtb21lbnR1bUFuaW1hdGlvbklkKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHZlbG9jaXR5ID0gaW5pdGlhbFZlbG9jaXR5O1xuXG4gICAgICBjb25zdCBhbmltYXRlID0gKCkgPT4ge1xuICAgICAgICAvLyBBcHBseSBkZWNlbGVyYXRpb25cbiAgICAgICAgdmVsb2NpdHkgKj0gZGVjZWxlcmF0aW9uO1xuXG4gICAgICAgIC8vIFN0b3AgaWYgdmVsb2NpdHkgaXMgdG9vIHNtYWxsXG4gICAgICAgIGlmIChNYXRoLmFicyh2ZWxvY2l0eSkgPCBtaW5WZWxvY2l0eSkge1xuICAgICAgICAgIG1vbWVudHVtQW5pbWF0aW9uSWQgPSBudWxsO1xuICAgICAgICAgIC8vIFJlc2V0IHZlbG9jaXR5IGluIHNjcm9sbGluZyBmZWF0dXJlXG4gICAgICAgICAgaWYgKHNjcm9sbGluZ1N0YXRlKSB7XG4gICAgICAgICAgICBzY3JvbGxpbmdTdGF0ZS5zZXRWZWxvY2l0eVRvWmVybz8uKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBzY3JvbGwgZGVsdGEgKHZlbG9jaXR5IGlzIGluIHB4L21zLCBzbyBtdWx0aXBseSBieSBmcmFtZSB0aW1lKVxuICAgICAgICBjb25zdCBmcmFtZURlbHRhID0gdmVsb2NpdHkgKiBWSUVXUE9SVF9DT05TVEFOVFMuTU9NRU5UVU0uRlJBTUVfVElNRTtcblxuICAgICAgICAvLyBVc2Ugc2Nyb2xsaW5nIGZlYXR1cmUncyBBUEkgdG8gdXBkYXRlIHBvc2l0aW9uXG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsQnkpIHtcbiAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsQnkoZnJhbWVEZWx0YSk7XG5cbiAgICAgICAgICAvLyBDb250aW51ZSBhbmltYXRpb25cbiAgICAgICAgICBtb21lbnR1bUFuaW1hdGlvbklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIHNjcm9sbEJ5IG1ldGhvZCwgc3RvcCBtb21lbnR1bVxuICAgICAgICAgIG1vbWVudHVtQW5pbWF0aW9uSWQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBtb21lbnR1bUFuaW1hdGlvbklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpO1xuICAgIH07XG5cbiAgICAvLyBUb3VjaCBldmVudCBoYW5kbGVyc1xuICAgIGNvbnN0IGhhbmRsZVRvdWNoU3RhcnQgPSAoZTogVG91Y2hFdmVudCkgPT4ge1xuICAgICAgaXNUb3VjaGluZyA9IHRydWU7XG4gICAgICBjb25zdCB0b3VjaCA9IGUudG91Y2hlc1swXTtcbiAgICAgIGNvbnN0IG9yaWVudGF0aW9uID0gdmlld3BvcnRTdGF0ZT8ub3JpZW50YXRpb24gfHwgXCJ2ZXJ0aWNhbFwiO1xuICAgICAgbGFzdFRvdWNoUG9zaXRpb24gPVxuICAgICAgICBvcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiID8gdG91Y2guY2xpZW50WSA6IHRvdWNoLmNsaWVudFg7XG4gICAgICB0b3VjaFN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgICAgIC8vIENhbmNlbCBhbnkgb25nb2luZyBtb21lbnR1bVxuICAgICAgaWYgKG1vbWVudHVtQW5pbWF0aW9uSWQpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUobW9tZW50dW1BbmltYXRpb25JZCk7XG4gICAgICAgIG1vbWVudHVtQW5pbWF0aW9uSWQgPSBudWxsO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVUb3VjaE1vdmUgPSAoZTogVG91Y2hFdmVudCkgPT4ge1xuICAgICAgaWYgKCFpc1RvdWNoaW5nKSByZXR1cm47XG5cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTsgLy8gUHJldmVudCBuYXRpdmUgc2Nyb2xsaW5nXG5cbiAgICAgIGNvbnN0IHRvdWNoID0gZS50b3VjaGVzWzBdO1xuICAgICAgY29uc3Qgb3JpZW50YXRpb24gPSB2aWV3cG9ydFN0YXRlPy5vcmllbnRhdGlvbiB8fCBcInZlcnRpY2FsXCI7XG4gICAgICBjb25zdCBjdXJyZW50UG9zaXRpb24gPVxuICAgICAgICBvcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiID8gdG91Y2guY2xpZW50WSA6IHRvdWNoLmNsaWVudFg7XG4gICAgICBjb25zdCBkZWx0YSA9IGxhc3RUb3VjaFBvc2l0aW9uIC0gY3VycmVudFBvc2l0aW9uOyAvLyBJbnZlcnRlZCBmb3IgbmF0dXJhbCBzY3JvbGxpbmdcbiAgICAgIGxhc3RUb3VjaFBvc2l0aW9uID0gY3VycmVudFBvc2l0aW9uO1xuXG4gICAgICAvLyBVc2Ugc2Nyb2xsaW5nIGZlYXR1cmUncyBBUEkgKDE6MSB0b3VjaC10by1zY3JvbGwgZm9yIG5hdHVyYWwgZmVlbClcbiAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsQnkpIHtcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5KGRlbHRhKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlVG91Y2hFbmQgPSAoKSA9PiB7XG4gICAgICBpZiAoIWlzVG91Y2hpbmcpIHJldHVybjtcbiAgICAgIGlzVG91Y2hpbmcgPSBmYWxzZTtcblxuICAgICAgY29uc3QgdG91Y2hFbmRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHRvdWNoRHVyYXRpb24gPSB0b3VjaEVuZFRpbWUgLSB0b3VjaFN0YXJ0VGltZTtcblxuICAgICAgLy8gR2V0IGN1cnJlbnQgdmVsb2NpdHkgZnJvbSBzY3JvbGxpbmcgZmVhdHVyZVxuICAgICAgY29uc3QgdmVsb2NpdHkgPSBjb21wb25lbnQudmlld3BvcnQuZ2V0VmVsb2NpdHk/LigpIHx8IDA7XG5cbiAgICAgIC8vIE9ubHkgc3RhcnQgbW9tZW50dW0gaWYgdGhlIHRvdWNoIHdhcyBxdWljayBlbm91Z2ggYW5kIHdlIGhhdmUgdmVsb2NpdHlcbiAgICAgIGlmIChcbiAgICAgICAgdG91Y2hEdXJhdGlvbiA8IG1pbkR1cmF0aW9uICYmXG4gICAgICAgIE1hdGguYWJzKHZlbG9jaXR5KSA+IG1pblZlbG9jaXR5VGhyZXNob2xkXG4gICAgICApIHtcbiAgICAgICAgc3RhcnRNb21lbnR1bSh2ZWxvY2l0eSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSBjbGljayB0byBzdG9wIG1vbWVudHVtICh3aXRob3V0IHByZXZlbnRpbmcgc2VsZWN0aW9uKVxuICAgIGNvbnN0IGhhbmRsZUNsaWNrID0gKF9lOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBzdG9wTW9tZW50dW0oKTtcbiAgICB9O1xuXG4gICAgLy8gTW91c2UgZXZlbnQgaGFuZGxlcnMgZm9yIGRlc2t0b3BcbiAgICBjb25zdCBoYW5kbGVNb3VzZURvd24gPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgaXNNb3VzZURyYWdnaW5nID0gdHJ1ZTtcbiAgICAgIGNvbnN0IG9yaWVudGF0aW9uID0gdmlld3BvcnRTdGF0ZT8ub3JpZW50YXRpb24gfHwgXCJ2ZXJ0aWNhbFwiO1xuICAgICAgbGFzdE1vdXNlUG9zaXRpb24gPSBvcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiID8gZS5jbGllbnRZIDogZS5jbGllbnRYO1xuICAgICAgdG91Y2hTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAvLyBDYW5jZWwgYW55IG9uZ29pbmcgbW9tZW50dW1cbiAgICAgIHN0b3BNb21lbnR1bSgpO1xuXG4gICAgICAvLyBQcmV2ZW50IHRleHQgc2VsZWN0aW9uXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZU1vdXNlTW92ZSA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBpZiAoIWlzTW91c2VEcmFnZ2luZykgcmV0dXJuO1xuXG4gICAgICBjb25zdCBvcmllbnRhdGlvbiA9IHZpZXdwb3J0U3RhdGU/Lm9yaWVudGF0aW9uIHx8IFwidmVydGljYWxcIjtcbiAgICAgIGNvbnN0IGN1cnJlbnRQb3NpdGlvbiA9XG4gICAgICAgIG9yaWVudGF0aW9uID09PSBcInZlcnRpY2FsXCIgPyBlLmNsaWVudFkgOiBlLmNsaWVudFg7XG4gICAgICBjb25zdCBkZWx0YSA9IGxhc3RNb3VzZVBvc2l0aW9uIC0gY3VycmVudFBvc2l0aW9uO1xuICAgICAgbGFzdE1vdXNlUG9zaXRpb24gPSBjdXJyZW50UG9zaXRpb247XG5cbiAgICAgIC8vIFVzZSBzY3JvbGxpbmcgZmVhdHVyZSdzIEFQSSAoMToxIGRyYWctdG8tc2Nyb2xsIGZvciBuYXR1cmFsIGZlZWwpXG4gICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5KSB7XG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxCeShkZWx0YSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZU1vdXNlVXAgPSAoKSA9PiB7XG4gICAgICBpZiAoIWlzTW91c2VEcmFnZ2luZykgcmV0dXJuO1xuICAgICAgaXNNb3VzZURyYWdnaW5nID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IG1vdXNlVXBUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGRyYWdEdXJhdGlvbiA9IG1vdXNlVXBUaW1lIC0gdG91Y2hTdGFydFRpbWU7XG5cbiAgICAgIC8vIEdldCBjdXJyZW50IHZlbG9jaXR5IGZyb20gc2Nyb2xsaW5nIGZlYXR1cmVcbiAgICAgIGNvbnN0IHZlbG9jaXR5ID0gY29tcG9uZW50LnZpZXdwb3J0LmdldFZlbG9jaXR5Py4oKSB8fCAwO1xuXG4gICAgICAvLyBTdGFydCBtb21lbnR1bSBmb3IgcXVpY2sgZHJhZ3NcbiAgICAgIGlmIChcbiAgICAgICAgZHJhZ0R1cmF0aW9uIDwgbWluRHVyYXRpb24gJiZcbiAgICAgICAgTWF0aC5hYnModmVsb2NpdHkpID4gbWluVmVsb2NpdHlUaHJlc2hvbGRcbiAgICAgICkge1xuICAgICAgICBzdGFydE1vbWVudHVtKHZlbG9jaXR5KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gT3ZlcnJpZGUgaW5pdGlhbGl6ZSB0byBhZGQgZXZlbnQgbGlzdGVuZXJzXG4gICAgY29uc3Qgb3JpZ2luYWxJbml0ID0gY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemU7XG4gICAgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBvcmlnaW5hbEluaXQoKTtcbiAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBpbml0aWFsaXplZFxuICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2aWV3cG9ydEVsZW1lbnQgPVxuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkudmlld3BvcnRFbGVtZW50IHx8XG4gICAgICAgIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zdGF0ZT8udmlld3BvcnRFbGVtZW50O1xuXG4gICAgICBpZiAodmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgIC8vIFRvdWNoIGV2ZW50c1xuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgaGFuZGxlVG91Y2hTdGFydCwge1xuICAgICAgICAgIHBhc3NpdmU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCBoYW5kbGVUb3VjaE1vdmUsIHtcbiAgICAgICAgICBwYXNzaXZlOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiwgaGFuZGxlVG91Y2hFbmQsIHtcbiAgICAgICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBNb3VzZSBldmVudHMgZm9yIGRlc2t0b3AgZHJhZ2dpbmdcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgaGFuZGxlTW91c2VEb3duKTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGhhbmRsZU1vdXNlVXApO1xuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgaGFuZGxlTW91c2VVcCk7XG5cbiAgICAgICAgLy8gQWRkIGNsaWNrIGxpc3RlbmVyIHRvIHN0b3AgbW9tZW50dW0gb24gY2xpY2sgKHdpdGhvdXQgYmxvY2tpbmcgc2VsZWN0aW9uKVxuICAgICAgICBpZiAoc3RvcE9uQ2xpY2spIHtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNsaWNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0b3JlIHJlZmVyZW5jZSBmb3IgY2xlYW51cFxuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuX21vbWVudHVtVmlld3BvcnRFbGVtZW50ID0gdmlld3BvcnRFbGVtZW50O1xuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuX21vbWVudHVtU3RvcE9uQ2xpY2sgPSBzdG9wT25DbGljaztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQ2xlYW4gdXAgb24gZGVzdHJveVxuICAgIGlmIChcImRlc3Ryb3lcIiBpbiBjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IGNvbXBvbmVudC5kZXN0cm95O1xuICAgICAgY29tcG9uZW50LmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIFJlbW92ZSBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgY29uc3Qgdmlld3BvcnRFbGVtZW50ID0gKGNvbXBvbmVudCBhcyBhbnkpLl9tb21lbnR1bVZpZXdwb3J0RWxlbWVudDtcbiAgICAgICAgaWYgKHZpZXdwb3J0RWxlbWVudCkge1xuICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLCBoYW5kbGVUb3VjaFN0YXJ0KTtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCBoYW5kbGVUb3VjaE1vdmUpO1xuICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiwgaGFuZGxlVG91Y2hFbmQpO1xuICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGhhbmRsZU1vdXNlRG93bik7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgaGFuZGxlTW91c2VVcCk7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIGhhbmRsZU1vdXNlVXApO1xuICAgICAgICAgIGlmICgoY29tcG9uZW50IGFzIGFueSkuX21vbWVudHVtU3RvcE9uQ2xpY2spIHtcbiAgICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlQ2xpY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbmNlbCBtb21lbnR1bSBhbmltYXRpb25cbiAgICAgICAgc3RvcE1vbWVudHVtKCk7XG5cbiAgICAgICAgb3JpZ2luYWxEZXN0cm95KCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEV4cG9zZSBtb21lbnR1bSBzdGF0ZSBmb3Igb3RoZXIgZmVhdHVyZXNcbiAgICAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkubW9tZW50dW1TdGF0ZSA9IHtcbiAgICAgIHN0b3BNb21lbnR1bSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3Njcm9sbGJhci50c1xuXG4vKipcbiAqIFNjcm9sbGJhciBGZWF0dXJlIC0gQ3VzdG9tIHNjcm9sbGJhciBpbXBsZW1lbnRhdGlvblxuICogUHJvdmlkZXMgdmlzdWFsIHNjcm9sbCBpbmRpY2F0aW9uIGFuZCBkcmFnLXRvLXNjcm9sbCBmdW5jdGlvbmFsaXR5XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBWSUVXUE9SVF9DT05TVEFOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB3cmFwSW5pdGlhbGl6ZSwgd3JhcERlc3Ryb3ksIHN0b3JlRmVhdHVyZUZ1bmN0aW9uIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IFBSRUZJWCwgYWRkQ2xhc3MsIHJlbW92ZUNsYXNzIH0gZnJvbSBcIm10cmxcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTY3JvbGxiYXJDb25maWcge1xuICBlbmFibGVkPzogYm9vbGVhbjtcbiAgYXV0b0hpZGU/OiBib29sZWFuO1xuICB0aHVtYk1pbkhlaWdodD86IG51bWJlcjtcbiAgdGh1bWJDb2xvcj86IHN0cmluZztcbiAgdHJhY2tDb2xvcj86IHN0cmluZztcbiAgYm9yZGVyUmFkaXVzPzogbnVtYmVyO1xuICBmYWRlVGltZW91dD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY3JvbGxiYXJDb21wb25lbnQge1xuICBzY3JvbGxiYXI6IHtcbiAgICBzaG93OiAoKSA9PiB2b2lkO1xuICAgIGhpZGU6ICgpID0+IHZvaWQ7XG4gICAgdXBkYXRlQm91bmRzOiAodG90YWxWaXJ0dWFsU2l6ZTogbnVtYmVyLCBjb250YWluZXJTaXplOiBudW1iZXIpID0+IHZvaWQ7XG4gICAgdXBkYXRlUG9zaXRpb246IChzY3JvbGxQb3NpdGlvbjogbnVtYmVyKSA9PiB2b2lkO1xuICB9O1xufVxuXG4vKipcbiAqIEFkZHMgc2Nyb2xsYmFyIGZ1bmN0aW9uYWxpdHkgdG8gdmlld3BvcnQgY29tcG9uZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoU2Nyb2xsYmFyKGNvbmZpZzogU2Nyb2xsYmFyQ29uZmlnID0ge30pIHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KFxuICAgIGNvbXBvbmVudDogVFxuICApOiBUICYgU2Nyb2xsYmFyQ29tcG9uZW50ID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICAgIGF1dG9IaWRlID0gdHJ1ZSxcbiAgICAgIHRodW1iTWluSGVpZ2h0ID0gMjUsXG4gICAgICBib3JkZXJSYWRpdXMgPSA0LFxuICAgICAgZmFkZVRpbWVvdXQgPSAxMDAwLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBSZXR1cm4gbm8tb3AgaWYgZGlzYWJsZWRcbiAgICBpZiAoIWVuYWJsZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgICAgc2Nyb2xsYmFyOiB7XG4gICAgICAgICAgc2hvdzogKCkgPT4ge30sXG4gICAgICAgICAgaGlkZTogKCkgPT4ge30sXG4gICAgICAgICAgdXBkYXRlQm91bmRzOiAoKSA9PiB7fSxcbiAgICAgICAgICB1cGRhdGVQb3NpdGlvbjogKCkgPT4ge30sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFN0YXRlXG4gICAgbGV0IHZpZXdwb3J0RWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgc2Nyb2xsYmFyVHJhY2s6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHNjcm9sbGJhclRodW1iOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGxldCBpc0luaXRpYWxpemVkID0gZmFsc2U7XG4gICAgbGV0IGlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICBsZXQgZHJhZ1N0YXJ0WSA9IDA7XG4gICAgbGV0IGRyYWdTdGFydFNjcm9sbFBvc2l0aW9uID0gMDtcbiAgICBsZXQgaGlkZVRpbWVvdXQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHRvdGFsVmlydHVhbFNpemUgPSAwO1xuICAgIGxldCBjb250YWluZXJTaXplID0gMDtcbiAgICBsZXQgdGh1bWJIZWlnaHQgPSAwO1xuICAgIGxldCBhbmltYXRpb25GcmFtZUlkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgbGFzdFJlcXVlc3RlZFNjcm9sbFBvc2l0aW9uOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaXNDdXJzb3JNb2RlID0gZmFsc2U7XG4gICAgbGV0IGxvYWRlZEl0ZW1zQ291bnQgPSAwO1xuXG4gICAgLy8gQ3JlYXRlIHNjcm9sbGJhciBlbGVtZW50c1xuICAgIGNvbnN0IGNyZWF0ZVNjcm9sbGJhckVsZW1lbnRzID0gKCkgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydEVsZW1lbnQpIHJldHVybjtcblxuICAgICAgc2Nyb2xsYmFyVHJhY2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgYWRkQ2xhc3Moc2Nyb2xsYmFyVHJhY2ssIFZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVIpO1xuICAgICAgc2Nyb2xsYmFyVHJhY2suc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIHJpZ2h0OiAwO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIHotaW5kZXg6IDEwO1xuICAgICAgYDtcblxuICAgICAgc2Nyb2xsYmFyVGh1bWIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgc2Nyb2xsYmFyVGh1bWIsXG4gICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVJfVEhVTUJcbiAgICAgICk7XG5cbiAgICAgIHNjcm9sbGJhclRyYWNrLmFwcGVuZENoaWxkKHNjcm9sbGJhclRodW1iKTtcbiAgICAgIHZpZXdwb3J0RWxlbWVudC5hcHBlbmRDaGlsZChzY3JvbGxiYXJUcmFjayk7XG4gICAgfTtcblxuICAgIC8vIFNob3cvaGlkZSBmdW5jdGlvbnNcbiAgICBjb25zdCBzaG93ID0gKCkgPT4ge1xuICAgICAgaWYgKCFzY3JvbGxiYXJUcmFjayB8fCB0b3RhbFZpcnR1YWxTaXplIDw9IGNvbnRhaW5lclNpemUpIHJldHVybjtcblxuICAgICAgaWYgKGhpZGVUaW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dChoaWRlVGltZW91dCk7XG4gICAgICAgIGhpZGVUaW1lb3V0ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgYWRkQ2xhc3MoXG4gICAgICAgIHNjcm9sbGJhclRyYWNrLFxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSX1ZJU0lCTEVcbiAgICAgICk7XG5cbiAgICAgIGlmIChhdXRvSGlkZSAmJiAhaXNEcmFnZ2luZykge1xuICAgICAgICBoaWRlVGltZW91dCA9IHNldFRpbWVvdXQoaGlkZSwgZmFkZVRpbWVvdXQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoaWRlID0gKCkgPT4ge1xuICAgICAgaWYgKCFzY3JvbGxiYXJUcmFjayB8fCBpc0RyYWdnaW5nKSByZXR1cm47XG4gICAgICByZW1vdmVDbGFzcyhcbiAgICAgICAgc2Nyb2xsYmFyVHJhY2ssXG4gICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVJfVklTSUJMRVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIHNjcm9sbGJhciBib3VuZHNcbiAgICBjb25zdCB1cGRhdGVCb3VuZHMgPSAobmV3VG90YWxTaXplOiBudW1iZXIsIG5ld0NvbnRhaW5lclNpemU6IG51bWJlcikgPT4ge1xuICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9IG5ld1RvdGFsU2l6ZTtcbiAgICAgIGNvbnRhaW5lclNpemUgPSBuZXdDb250YWluZXJTaXplO1xuXG4gICAgICBpZiAoIXNjcm9sbGJhclRyYWNrIHx8ICFzY3JvbGxiYXJUaHVtYikgcmV0dXJuO1xuXG4gICAgICBjb25zdCBuZWVkc1Njcm9sbGJhciA9IHRvdGFsVmlydHVhbFNpemUgPiBjb250YWluZXJTaXplO1xuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbU2Nyb2xsYmFyXSB1cGRhdGVCb3VuZHM6IHRvdGFsU2l6ZT0ke3RvdGFsVmlydHVhbFNpemV9LCBjb250YWluZXJTaXplPSR7Y29udGFpbmVyU2l6ZX0sIG5lZWRzU2Nyb2xsYmFyPSR7bmVlZHNTY3JvbGxiYXJ9YFxuICAgICAgLy8gKTtcbiAgICAgIHNjcm9sbGJhclRyYWNrLnN0eWxlLmRpc3BsYXkgPSBuZWVkc1Njcm9sbGJhciA/IFwiYmxvY2tcIiA6IFwibm9uZVwiO1xuXG4gICAgICBpZiAobmVlZHNTY3JvbGxiYXIpIHtcbiAgICAgICAgbGV0IHNjcm9sbFJhdGlvOiBudW1iZXI7XG5cbiAgICAgICAgaWYgKGlzQ3Vyc29yTW9kZSAmJiBsb2FkZWRJdGVtc0NvdW50ID4gMCkge1xuICAgICAgICAgIC8vIEZvciBjdXJzb3IgbW9kZSwgdGh1bWIgc2l6ZSByZXByZXNlbnRzIGxvYWRlZCBjb250ZW50IHZzIGVzdGltYXRlZCB0b3RhbFxuICAgICAgICAgIC8vIElmIHdlIGRvbid0IGtub3cgdG90YWwsIHVzZSBsb2FkZWQgaXRlbXMgKiAyIGFzIGVzdGltYXRlXG4gICAgICAgICAgY29uc3QgZXN0aW1hdGVkVG90YWwgPVxuICAgICAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA+IDAgPyB0b3RhbFZpcnR1YWxTaXplIDogbG9hZGVkSXRlbXNDb3VudCAqIDI7XG4gICAgICAgICAgc2Nyb2xsUmF0aW8gPVxuICAgICAgICAgICAgY29udGFpbmVyU2l6ZSAvXG4gICAgICAgICAgICBNYXRoLm1heChlc3RpbWF0ZWRUb3RhbCwgbG9hZGVkSXRlbXNDb3VudCArIGNvbnRhaW5lclNpemUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vcm1hbCBjYWxjdWxhdGlvbiBmb3Igb2Zmc2V0L3BhZ2Ugc3RyYXRlZ2llc1xuICAgICAgICAgIHNjcm9sbFJhdGlvID0gY29udGFpbmVyU2l6ZSAvIHRvdGFsVmlydHVhbFNpemU7XG4gICAgICAgIH1cblxuICAgICAgICB0aHVtYkhlaWdodCA9IE1hdGgubWF4KHRodW1iTWluSGVpZ2h0LCBzY3JvbGxSYXRpbyAqIGNvbnRhaW5lclNpemUpO1xuICAgICAgICBzY3JvbGxiYXJUaHVtYi5zdHlsZS5oZWlnaHQgPSBgJHt0aHVtYkhlaWdodH1weGA7XG4gICAgICAgIHVwZGF0ZVBvc2l0aW9uKGNvbXBvbmVudC52aWV3cG9ydD8uZ2V0U2Nyb2xsUG9zaXRpb24oKSB8fCAwKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIHRodW1iIHBvc2l0aW9uXG4gICAgY29uc3QgdXBkYXRlUG9zaXRpb24gPSAoc2Nyb2xsUG9zOiBudW1iZXIpID0+IHtcbiAgICAgIGlmICghc2Nyb2xsYmFyVGh1bWIgfHwgIXNjcm9sbGJhclRyYWNrKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHNjcm9sbGFibGVEaXN0YW5jZSA9IHRvdGFsVmlydHVhbFNpemUgLSBjb250YWluZXJTaXplO1xuICAgICAgaWYgKHNjcm9sbGFibGVEaXN0YW5jZSA8PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gTWF0aC5taW4oXG4gICAgICAgIDEsXG4gICAgICAgIE1hdGgubWF4KDAsIHNjcm9sbFBvcyAvIHNjcm9sbGFibGVEaXN0YW5jZSlcbiAgICAgICk7XG4gICAgICBjb25zdCBtYXhUaHVtYlBvc2l0aW9uID1cbiAgICAgICAgc2Nyb2xsYmFyVHJhY2suY2xpZW50SGVpZ2h0IC0gc2Nyb2xsYmFyVGh1bWIuY2xpZW50SGVpZ2h0O1xuICAgICAgY29uc3QgdGh1bWJQb3NpdGlvbiA9IHNjcm9sbFJhdGlvICogbWF4VGh1bWJQb3NpdGlvbjtcblxuICAgICAgc2Nyb2xsYmFyVGh1bWIuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoJHt0aHVtYlBvc2l0aW9ufXB4KWA7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSB0cmFjayBjbGlja1xuICAgIGNvbnN0IGhhbmRsZVRyYWNrQ2xpY2sgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgaWYgKCFzY3JvbGxiYXJUcmFjayB8fCAhc2Nyb2xsYmFyVGh1bWIgfHwgZS50YXJnZXQgPT09IHNjcm9sbGJhclRodW1iKVxuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRyYWNrUmVjdCA9IHNjcm9sbGJhclRyYWNrLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgY2xpY2tZID0gZS5jbGllbnRZIC0gdHJhY2tSZWN0LnRvcDtcbiAgICAgIGNvbnN0IHRodW1iQ2VudGVyWSA9IGNsaWNrWSAtIHRodW1iSGVpZ2h0IC8gMjtcbiAgICAgIGNvbnN0IG1heFRodW1iUG9zaXRpb24gPSBjb250YWluZXJTaXplIC0gdGh1bWJIZWlnaHQ7XG4gICAgICBjb25zdCB0aHVtYlBvc2l0aW9uID0gTWF0aC5tYXgoXG4gICAgICAgIDAsXG4gICAgICAgIE1hdGgubWluKHRodW1iQ2VudGVyWSwgbWF4VGh1bWJQb3NpdGlvbilcbiAgICAgICk7XG4gICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IHRodW1iUG9zaXRpb24gLyBtYXhUaHVtYlBvc2l0aW9uO1xuICAgICAgY29uc3QgdGFyZ2V0U2Nyb2xsUG9zaXRpb24gPVxuICAgICAgICBzY3JvbGxSYXRpbyAqICh0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZSk7XG5cbiAgICAgIGNvbXBvbmVudC52aWV3cG9ydD8uc2Nyb2xsVG9Qb3NpdGlvbih0YXJnZXRTY3JvbGxQb3NpdGlvbik7XG4gICAgfTtcblxuICAgIC8vIE1vdXNlIGV2ZW50IGhhbmRsZXJzXG4gICAgY29uc3QgaGFuZGxlVGh1bWJNb3VzZURvd24gPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICBkcmFnU3RhcnRZID0gZS5jbGllbnRZO1xuICAgICAgZHJhZ1N0YXJ0U2Nyb2xsUG9zaXRpb24gPSBjb21wb25lbnQudmlld3BvcnQ/LmdldFNjcm9sbFBvc2l0aW9uKCkgfHwgMDtcblxuICAgICAgaWYgKHNjcm9sbGJhclRyYWNrKSB7XG4gICAgICAgIGFkZENsYXNzKFxuICAgICAgICAgIHNjcm9sbGJhclRyYWNrLFxuICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVJfRFJBR0dJTkdcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gRW1pdCBkcmFnIHN0YXJ0IGV2ZW50IHRvIG5vdGlmeSB2aWV3cG9ydFxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OmRyYWctc3RhcnRcIiwge1xuICAgICAgICBzb3VyY2U6IFwic2Nyb2xsYmFyXCIsXG4gICAgICAgIHN0YXJ0UG9zaXRpb246IGRyYWdTdGFydFNjcm9sbFBvc2l0aW9uLFxuICAgICAgfSk7XG5cbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGhhbmRsZU1vdXNlVXApO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZU1vdmUgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgaWYgKCFpc0RyYWdnaW5nIHx8ICFzY3JvbGxiYXJUcmFjayB8fCAhc2Nyb2xsYmFyVGh1bWIpIHJldHVybjtcblxuICAgICAgY29uc3QgZGVsdGFZID0gZS5jbGllbnRZIC0gZHJhZ1N0YXJ0WTtcbiAgICAgIGNvbnN0IHRyYWNrSGVpZ2h0ID0gc2Nyb2xsYmFyVHJhY2suY2xpZW50SGVpZ2h0O1xuICAgICAgY29uc3QgdGh1bWJIZWlnaHQgPSBzY3JvbGxiYXJUaHVtYi5jbGllbnRIZWlnaHQ7XG4gICAgICBjb25zdCBtYXhUaHVtYlRyYXZlbCA9IHRyYWNrSGVpZ2h0IC0gdGh1bWJIZWlnaHQ7XG5cbiAgICAgIGlmIChtYXhUaHVtYlRyYXZlbCA8PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGRlbHRhUmF0aW8gPSBkZWx0YVkgLyBtYXhUaHVtYlRyYXZlbDtcbiAgICAgIGNvbnN0IGRyYWdTdGFydFNjcm9sbFJhdGlvID1cbiAgICAgICAgZHJhZ1N0YXJ0U2Nyb2xsUG9zaXRpb24gLyAodG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuICAgICAgY29uc3QgbmV3U2Nyb2xsUmF0aW8gPSBNYXRoLm1heChcbiAgICAgICAgMCxcbiAgICAgICAgTWF0aC5taW4oMSwgZHJhZ1N0YXJ0U2Nyb2xsUmF0aW8gKyBkZWx0YVJhdGlvKVxuICAgICAgKTtcblxuICAgICAgLy8gVXBkYXRlIHRodW1iIHBvc2l0aW9uIGltbWVkaWF0ZWx5XG4gICAgICBjb25zdCB0aHVtYlBvc2l0aW9uID0gbmV3U2Nyb2xsUmF0aW8gKiBtYXhUaHVtYlRyYXZlbDtcbiAgICAgIHNjcm9sbGJhclRodW1iLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKCR7dGh1bWJQb3NpdGlvbn1weClgO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgbmV3IHNjcm9sbCBwb3NpdGlvblxuICAgICAgY29uc3QgbmV3UG9zaXRpb24gPSBuZXdTY3JvbGxSYXRpbyAqICh0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZSk7XG4gICAgICBsYXN0UmVxdWVzdGVkU2Nyb2xsUG9zaXRpb24gPSBuZXdQb3NpdGlvbjtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbU2Nyb2xsYmFyXSBNb3VzZSBtb3ZlOiBuZXdQb3M9JHtuZXdQb3NpdGlvbi50b0ZpeGVkKFxuICAgICAgLy8gICAgIDBcbiAgICAgIC8vICAgKX0sIGFuaW1hdGlvbkZyYW1lSWQ9JHthbmltYXRpb25GcmFtZUlkfWBcbiAgICAgIC8vICk7XG5cbiAgICAgIC8vIFRocm90dGxlIHZpZXdwb3J0IHVwZGF0ZXNcbiAgICAgIGlmIChhbmltYXRpb25GcmFtZUlkID09PSBudWxsICYmIGNvbXBvbmVudC52aWV3cG9ydCkge1xuICAgICAgICBhbmltYXRpb25GcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIGBbU2Nyb2xsYmFyXSBSQUYgY2FsbGJhY2s6IHNjcm9sbGluZyB0byAke2xhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbn1gXG4gICAgICAgICAgLy8gKTtcbiAgICAgICAgICBpZiAobGFzdFJlcXVlc3RlZFNjcm9sbFBvc2l0aW9uICE9PSBudWxsICYmIGNvbXBvbmVudC52aWV3cG9ydCkge1xuICAgICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbFRvUG9zaXRpb24obGFzdFJlcXVlc3RlZFNjcm9sbFBvc2l0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYW5pbWF0aW9uRnJhbWVJZCA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZVVwID0gKCkgPT4ge1xuICAgICAgLy8gY29uc29sZS5sb2coXCJbU2Nyb2xsYmFyXSBNb3VzZSB1cCAtIGVuZGluZyBkcmFnXCIpO1xuICAgICAgaXNEcmFnZ2luZyA9IGZhbHNlO1xuXG4gICAgICBpZiAoYW5pbWF0aW9uRnJhbWVJZCAhPT0gbnVsbCkge1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShhbmltYXRpb25GcmFtZUlkKTtcbiAgICAgICAgYW5pbWF0aW9uRnJhbWVJZCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChsYXN0UmVxdWVzdGVkU2Nyb2xsUG9zaXRpb24gIT09IG51bGwgJiYgY29tcG9uZW50LnZpZXdwb3J0KSB7XG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb1Bvc2l0aW9uKGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbik7XG4gICAgICAgIGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbiA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChzY3JvbGxiYXJUcmFjaykge1xuICAgICAgICByZW1vdmVDbGFzcyhcbiAgICAgICAgICBzY3JvbGxiYXJUcmFjayxcbiAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSX0RSQUdHSU5HXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVtaXQgZHJhZyBlbmQgZXZlbnRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpkcmFnLWVuZFwiLCB7XG4gICAgICAgIHNvdXJjZTogXCJzY3JvbGxiYXJcIixcbiAgICAgICAgZW5kUG9zaXRpb246IGNvbXBvbmVudC52aWV3cG9ydD8uZ2V0U2Nyb2xsUG9zaXRpb24oKSB8fCAwLFxuICAgICAgfSk7XG5cbiAgICAgIGhpZGUoKTtcblxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgaGFuZGxlTW91c2VVcCk7XG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgZnVuY3Rpb25cbiAgICBjb25zdCBpbml0aWFsaXplID0gKCkgPT4ge1xuICAgICAgaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjtcblxuICAgICAgdmlld3BvcnRFbGVtZW50ID0gY29tcG9uZW50LmVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIGAuJHtQUkVGSVh9LXZpZXdwb3J0YFxuICAgICAgKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgaWYgKCF2aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiW1Njcm9sbGJhcl0gTm8gdmlld3BvcnQgZWxlbWVudCBmb3VuZFwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgIGAuJHtQUkVGSVh9LSR7VklFV1BPUlRfQ09OU1RBTlRTLlNDUk9MTEJBUi5DTEFTU0VTLlNDUk9MTEJBUn1gXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjcmVhdGVTY3JvbGxiYXJFbGVtZW50cygpO1xuICAgICAgaXNJbml0aWFsaXplZCA9IHRydWU7XG5cbiAgICAgIGlmIChzY3JvbGxiYXJUcmFjayAmJiB2aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgc2Nyb2xsYmFyVHJhY2suYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZVRyYWNrQ2xpY2spO1xuXG4gICAgICAgIGlmIChzY3JvbGxiYXJUaHVtYikge1xuICAgICAgICAgIHNjcm9sbGJhclRodW1iLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgaGFuZGxlVGh1bWJNb3VzZURvd24pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWVudGVyXCIsIHNob3csIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgXCJtb3VzZWxlYXZlXCIsXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFpc0RyYWdnaW5nKSBoaWRlKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IHBhc3NpdmU6IHRydWUgfVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBJbml0aWFsaXplIHdpdGggY3VycmVudCB2aWV3cG9ydCBzdGF0ZVxuICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydCkge1xuICAgICAgICBjb25zdCBpbmZvID0gY29tcG9uZW50LnZpZXdwb3J0LmdldFZpZXdwb3J0SW5mbygpO1xuICAgICAgICB0b3RhbFZpcnR1YWxTaXplID0gaW5mby50b3RhbFZpcnR1YWxTaXplO1xuICAgICAgICBjb250YWluZXJTaXplID0gaW5mby5jb250YWluZXJTaXplO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluIGN1cnNvciBtb2RlXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbjtcbiAgICAgICAgY29uc3Qgdmlld3BvcnRDb25maWcgPSAoY29tcG9uZW50IGFzIGFueSkuY29uZmlnO1xuICAgICAgICBpc0N1cnNvck1vZGUgPSB2aWV3cG9ydENvbmZpZz8ucGFnaW5hdGlvbj8uc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCI7XG5cbiAgICAgICAgdXBkYXRlQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgICB1cGRhdGVQb3NpdGlvbihjb21wb25lbnQudmlld3BvcnQuZ2V0U2Nyb2xsUG9zaXRpb24oKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEV2ZW50IGxpc3RlbmVyc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpzY3JvbGxcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBpZiAoIWlzRHJhZ2dpbmcpIHtcbiAgICAgICAgICB1cGRhdGVQb3NpdGlvbihkYXRhLnBvc2l0aW9uKTtcbiAgICAgICAgICBzaG93KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnZpcnR1YWwtc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9IGRhdGEudG90YWxWaXJ0dWFsU2l6ZTtcbiAgICAgICAgdXBkYXRlQm91bmRzKGRhdGEudG90YWxWaXJ0dWFsU2l6ZSwgY29udGFpbmVyU2l6ZSk7XG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpjb250YWluZXItc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29udGFpbmVyU2l6ZSA9IGRhdGEuY29udGFpbmVyU2l6ZTtcbiAgICAgICAgdXBkYXRlQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGRhdGEuY29udGFpbmVyU2l6ZSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBpdGVtcyBsb2FkZWQgdG8gdXBkYXRlIHNjcm9sbGJhciBpbiBjdXJzb3IgbW9kZVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDppdGVtcy1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGlzQ3Vyc29yTW9kZSkge1xuICAgICAgICAgIGxvYWRlZEl0ZW1zQ291bnQgPSBkYXRhLmxvYWRlZENvdW50IHx8IDA7XG4gICAgICAgICAgdXBkYXRlQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciB0b3RhbCBpdGVtcyBjaGFuZ2VzIChpbXBvcnRhbnQgZm9yIGN1cnNvciBtb2RlKVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDp0b3RhbC1pdGVtcy1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGlzQ3Vyc29yTW9kZSAmJiBkYXRhLnRvdGFsKSB7XG4gICAgICAgICAgLy8gSW4gY3Vyc29yIG1vZGUsIHRoZSB0b3RhbCBpcyBkeW5hbWljXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgW1Njcm9sbGJhcl0gQ3Vyc29yIG1vZGU6IHVwZGF0aW5nIGJvdW5kcyBmb3IgbmV3IHRvdGFsICR7ZGF0YS50b3RhbH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICB1cGRhdGVCb3VuZHModG90YWxWaXJ0dWFsU2l6ZSwgY29udGFpbmVyU2l6ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBTdG9yZSBpbml0aWFsaXplIGZ1bmN0aW9uXG4gICAgc3RvcmVGZWF0dXJlRnVuY3Rpb24oY29tcG9uZW50LCBcIl9zY3JvbGxiYXJJbml0aWFsaXplXCIsIGluaXRpYWxpemUpO1xuXG4gICAgLy8gSG9vayBpbnRvIHZpZXdwb3J0IGluaXRpYWxpemF0aW9uXG4gICAgd3JhcEluaXRpYWxpemUoY29tcG9uZW50LCBpbml0aWFsaXplKTtcblxuICAgIC8vIENsZWFudXBcbiAgICBjb25zdCBkZXN0cm95ID0gKCkgPT4ge1xuICAgICAgaWYgKHNjcm9sbGJhclRyYWNrKSB7XG4gICAgICAgIHNjcm9sbGJhclRyYWNrLnJlbW92ZSgpO1xuICAgICAgICBzY3JvbGxiYXJUcmFjayA9IG51bGw7XG4gICAgICB9XG4gICAgICBzY3JvbGxiYXJUaHVtYiA9IG51bGw7XG4gICAgICB2aWV3cG9ydEVsZW1lbnQgPSBudWxsO1xuICAgICAgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgICBpZiAoaGlkZVRpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGhpZGVUaW1lb3V0KTtcbiAgICAgICAgaGlkZVRpbWVvdXQgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBoYW5kbGVNb3VzZVVwKTtcbiAgICB9O1xuXG4gICAgc3RvcmVGZWF0dXJlRnVuY3Rpb24oY29tcG9uZW50LCBcIl9zY3JvbGxiYXJEZXN0cm95XCIsIGRlc3Ryb3kpO1xuICAgIHdyYXBEZXN0cm95KGNvbXBvbmVudCwgZGVzdHJveSk7XG5cbiAgICAvLyBSZXR1cm4gZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIHNjcm9sbGJhcjogeyBzaG93LCBoaWRlLCB1cGRhdGVCb3VuZHMsIHVwZGF0ZVBvc2l0aW9uIH0sXG4gICAgfTtcbiAgfTtcbn1cbiIsCiAgICAiLy8gc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvY29sbGVjdGlvbi50c1xuXG4vKipcbiAqIENvbGxlY3Rpb24gRmVhdHVyZSAtIERhdGEgbWFuYWdlbWVudCBhbmQgcmFuZ2UgbG9hZGluZ1xuICogSGFuZGxlcyBjb2xsZWN0aW9uIGludGVncmF0aW9uLCBwYWdpbmF0aW9uLCBhbmQgZGF0YSBmZXRjaGluZ1xuICovXG5cbmltcG9ydCB0eXBlIHsgVmlld3BvcnRDb250ZXh0LCBWaWV3cG9ydENvbXBvbmVudCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVklFV1BPUlRfQ09OU1RBTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgd3JhcERlc3Ryb3kgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbGxlY3Rpb25Db25maWcge1xuICBjb2xsZWN0aW9uPzogYW55OyAvLyBDb2xsZWN0aW9uIGFkYXB0ZXJcbiAgcmFuZ2VTaXplPzogbnVtYmVyOyAvLyBEZWZhdWx0IHJhbmdlIHNpemUgZm9yIGxvYWRpbmdcbiAgc3RyYXRlZ3k/OiBcIm9mZnNldFwiIHwgXCJwYWdlXCIgfCBcImN1cnNvclwiOyAvLyBMb2FkaW5nIHN0cmF0ZWd5XG4gIHRyYW5zZm9ybT86IChpdGVtOiBhbnkpID0+IGFueTsgLy8gSXRlbSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvblxuICBjYW5jZWxMb2FkVGhyZXNob2xkPzogbnVtYmVyOyAvLyBWZWxvY2l0eSB0aHJlc2hvbGQgZm9yIGNhbmNlbGxpbmcgbG9hZHNcbiAgbWF4Q29uY3VycmVudFJlcXVlc3RzPzogbnVtYmVyO1xuICBlbmFibGVSZXF1ZXN0UXVldWU/OiBib29sZWFuO1xuICBtYXhRdWV1ZVNpemU/OiBudW1iZXI7XG4gIGxvYWRPbkRyYWdFbmQ/OiBib29sZWFuOyAvLyBFbmFibGUgbG9hZGluZyB3aGVuIGRyYWcgZW5kcyAoc2FmZXR5IG1lYXN1cmUpXG4gIGluaXRpYWxTY3JvbGxJbmRleD86IG51bWJlcjsgLy8gSW5pdGlhbCBzY3JvbGwgcG9zaXRpb24gKDAtYmFzZWQgaW5kZXgpXG4gIHNlbGVjdElkPzogc3RyaW5nIHwgbnVtYmVyOyAvLyBJRCBvZiBpdGVtIHRvIHNlbGVjdCBhZnRlciBpbml0aWFsIGxvYWQgY29tcGxldGVzXG4gIGF1dG9Mb2FkPzogYm9vbGVhbjsgLy8gV2hldGhlciB0byBhdXRvbWF0aWNhbGx5IGxvYWQgZGF0YSBvbiBpbml0aWFsaXphdGlvbiAoZGVmYXVsdDogdHJ1ZSlcbiAgYXV0b1NlbGVjdEZpcnN0PzogYm9vbGVhbjsgLy8gQXV0b21hdGljYWxseSBzZWxlY3QgZmlyc3QgaXRlbSBhZnRlciBpbml0aWFsIGxvYWQgKGRlZmF1bHQ6IGZhbHNlKVxuICAvKiogTWF4aW11bSBpdGVtcyB0byBrZWVwIGluIG1lbW9yeSAoZGVmYXVsdDogMTAwMCkgKi9cbiAgbWF4Q2FjaGVkSXRlbXM/OiBudW1iZXI7XG4gIC8qKiBFeHRyYSBpdGVtcyB0byBrZWVwIGFyb3VuZCB2aXNpYmxlIHJhbmdlIGR1cmluZyBldmljdGlvbiAoZGVmYXVsdDogMTUwKSAqL1xuICBldmljdGlvbkJ1ZmZlcj86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0aW9uQ29tcG9uZW50IHtcbiAgY29sbGVjdGlvbjoge1xuICAgIGxvYWRSYW5nZTogKG9mZnNldDogbnVtYmVyLCBsaW1pdDogbnVtYmVyKSA9PiBQcm9taXNlPGFueVtdPjtcbiAgICBsb2FkTWlzc2luZ1JhbmdlczogKFxuICAgICAgcmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSxcbiAgICAgIGNhbGxlcj86IHN0cmluZyxcbiAgICApID0+IFByb21pc2U8dm9pZD47XG4gICAgZ2V0TG9hZGVkUmFuZ2VzOiAoKSA9PiBTZXQ8bnVtYmVyPjtcbiAgICBnZXRQZW5kaW5nUmFuZ2VzOiAoKSA9PiBTZXQ8bnVtYmVyPjtcbiAgICBjbGVhckZhaWxlZFJhbmdlczogKCkgPT4gdm9pZDtcbiAgICByZXRyeUZhaWxlZFJhbmdlOiAocmFuZ2VJZDogbnVtYmVyKSA9PiBQcm9taXNlPGFueVtdPjtcbiAgICBzZXRUb3RhbEl0ZW1zOiAodG90YWw6IG51bWJlcikgPT4gdm9pZDtcbiAgICBnZXRUb3RhbEl0ZW1zOiAoKSA9PiBudW1iZXI7XG4gICAgLy8gQ3Vyc29yLXNwZWNpZmljIG1ldGhvZHNcbiAgICBnZXRDdXJyZW50Q3Vyc29yOiAoKSA9PiBzdHJpbmcgfCBudWxsO1xuICAgIGdldEN1cnNvckZvclBhZ2U6IChwYWdlOiBudW1iZXIpID0+IHN0cmluZyB8IG51bGw7XG4gIH07XG59XG5cbi8qKlxuICogQWRkcyBjb2xsZWN0aW9uIGZ1bmN0aW9uYWxpdHkgdG8gdmlld3BvcnQgY29tcG9uZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoQ29sbGVjdGlvbihjb25maWc6IENvbGxlY3Rpb25Db25maWcgPSB7fSkge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBWaWV3cG9ydENvbXBvbmVudD4oXG4gICAgY29tcG9uZW50OiBULFxuICApOiBUICYgQ29sbGVjdGlvbkNvbXBvbmVudCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgY29sbGVjdGlvbixcbiAgICAgIHJhbmdlU2l6ZSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5MT0FESU5HLkRFRkFVTFRfUkFOR0VfU0laRSxcbiAgICAgIHN0cmF0ZWd5ID0gXCJvZmZzZXRcIixcbiAgICAgIHRyYW5zZm9ybSxcbiAgICAgIGNhbmNlbExvYWRUaHJlc2hvbGQgPSBWSUVXUE9SVF9DT05TVEFOVFMuTE9BRElORy5DQU5DRUxfVEhSRVNIT0xELFxuICAgICAgbWF4Q29uY3VycmVudFJlcXVlc3RzID0gVklFV1BPUlRfQ09OU1RBTlRTLkxPQURJTkdcbiAgICAgICAgLk1BWF9DT05DVVJSRU5UX1JFUVVFU1RTLFxuICAgICAgZW5hYmxlUmVxdWVzdFF1ZXVlID0gVklFV1BPUlRfQ09OU1RBTlRTLlJFUVVFU1RfUVVFVUUuRU5BQkxFRCxcbiAgICAgIG1heFF1ZXVlU2l6ZSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5SRVFVRVNUX1FVRVVFLk1BWF9RVUVVRV9TSVpFLFxuICAgICAgbG9hZE9uRHJhZ0VuZCA9IHRydWUsIC8vIERlZmF1bHQgdG8gdHJ1ZSBhcyBzYWZldHkgbWVhc3VyZVxuICAgICAgaW5pdGlhbFNjcm9sbEluZGV4ID0gMCwgLy8gU3RhcnQgZnJvbSBiZWdpbm5pbmcgYnkgZGVmYXVsdFxuICAgICAgc2VsZWN0SWQsIC8vIElEIG9mIGl0ZW0gdG8gc2VsZWN0IGFmdGVyIGluaXRpYWwgbG9hZFxuICAgICAgYXV0b0xvYWQgPSB0cnVlLCAvLyBBdXRvLWxvYWQgaW5pdGlhbCBkYXRhIGJ5IGRlZmF1bHRcbiAgICAgIGF1dG9TZWxlY3RGaXJzdCA9IGZhbHNlLCAvLyBBdXRvbWF0aWNhbGx5IHNlbGVjdCBmaXJzdCBpdGVtIGFmdGVyIGluaXRpYWwgbG9hZFxuICAgICAgbWF4Q2FjaGVkSXRlbXMgPSAxMDAwLCAvLyBNYXhpbXVtIGl0ZW1zIHRvIGtlZXAgaW4gbWVtb3J5XG4gICAgICBldmljdGlvbkJ1ZmZlciA9IDE1MCwgLy8gRXh0cmEgaXRlbXMgdG8ga2VlcCBhcm91bmQgdmlzaWJsZSByYW5nZVxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBUcmFjayBpZiB3ZSd2ZSBjb21wbGV0ZWQgdGhlIGluaXRpYWwgbG9hZCBmb3IgaW5pdGlhbFNjcm9sbEluZGV4XG4gICAgLy8gVGhpcyBwcmV2ZW50cyB0aGUgdmlld3BvcnQ6cmFuZ2UtY2hhbmdlZCBsaXN0ZW5lciBmcm9tIGxvYWRpbmcgcGFnZSAxXG4gICAgbGV0IGhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQgPSBmYWxzZTtcbiAgICBjb25zdCBoYXNJbml0aWFsU2Nyb2xsSW5kZXggPSBpbml0aWFsU2Nyb2xsSW5kZXggPiAwO1xuXG4gICAgLy8gY29uc29sZS5sb2coXCJbVmlld3BvcnQgQ29sbGVjdGlvbl0gSW5pdGlhbGl6ZWQgd2l0aCBjb25maWc6XCIsIHtcbiAgICAvLyAgIHN0cmF0ZWd5LFxuICAgIC8vICAgcmFuZ2VTaXplLFxuICAgIC8vICAgaW5pdGlhbFNjcm9sbEluZGV4LFxuICAgIC8vIH0pO1xuXG4gICAgLy8gTG9hZGluZyBtYW5hZ2VyIHN0YXRlXG4gICAgaW50ZXJmYWNlIFF1ZXVlZFJlcXVlc3Qge1xuICAgICAgcmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfTtcbiAgICAgIHByaW9yaXR5OiBcImhpZ2hcIiB8IFwibm9ybWFsXCIgfCBcImxvd1wiO1xuICAgICAgdGltZXN0YW1wOiBudW1iZXI7XG4gICAgICByZXNvbHZlOiAoKSA9PiB2b2lkO1xuICAgICAgcmVqZWN0OiAoZXJyb3I6IGFueSkgPT4gdm9pZDtcbiAgICB9XG5cbiAgICAvLyBTdGF0ZSB0cmFja2luZ1xuICAgIGxldCBjdXJyZW50VmVsb2NpdHkgPSAwO1xuICAgIGxldCBhY3RpdmVMb2FkQ291bnQgPSAwO1xuICAgIGxldCBjb21wbGV0ZWRMb2FkcyA9IDA7XG4gICAgbGV0IGZhaWxlZExvYWRzID0gMDtcbiAgICBsZXQgY2FuY2VsbGVkTG9hZHMgPSAwO1xuICAgIGxldCBpc0RyYWdnaW5nID0gZmFsc2U7IC8vIFRyYWNrIGRyYWcgc3RhdGVcblxuICAgIC8vIENhY2hlIGV2aWN0aW9uIGNvbmZpZ3VyYXRpb24gKGZyb20gY29uZmlnKVxuICAgIGNvbnN0IE1BWF9DQUNIRURfSVRFTVMgPSBtYXhDYWNoZWRJdGVtcztcbiAgICBjb25zdCBFVklDVElPTl9CVUZGRVIgPSBldmljdGlvbkJ1ZmZlcjtcblxuICAgIC8vIE1lbW9yeSBkaWFnbm9zdGljc1xuICAgIGNvbnN0IGxvZ01lbW9yeVN0YXRzID0gKGNhbGxlcjogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBpdGVtQ291bnQgPSBpdGVtcy5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuICAgICAgY29uc3QgbG9hZGVkUmFuZ2VDb3VudCA9IGxvYWRlZFJhbmdlcy5zaXplO1xuICAgICAgY29uc3QgcGVuZGluZ1JhbmdlQ291bnQgPSBwZW5kaW5nUmFuZ2VzLnNpemU7XG4gICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXJDb3VudCA9IGFib3J0Q29udHJvbGxlcnMuc2l6ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRXZpY3QgaXRlbXMgZmFyIGZyb20gdGhlIGN1cnJlbnQgdmlzaWJsZSByYW5nZSB0byBwcmV2ZW50IG1lbW9yeSBibG9hdFxuICAgICAqIEtlZXBzIGl0ZW1zIHdpdGhpbiBFVklDVElPTl9CVUZGRVIgb2YgdGhlIHZpc2libGUgcmFuZ2VcbiAgICAgKi9cbiAgICBjb25zdCBldmljdERpc3RhbnRJdGVtcyA9ICh2aXNpYmxlU3RhcnQ6IG51bWJlciwgdmlzaWJsZUVuZDogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBpdGVtQ291bnQgPSBpdGVtcy5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuXG4gICAgICAvLyBPbmx5IGV2aWN0IGlmIHdlIGhhdmUgbW9yZSB0aGFuIE1BWF9DQUNIRURfSVRFTVNcbiAgICAgIGlmIChpdGVtQ291bnQgPD0gTUFYX0NBQ0hFRF9JVEVNUykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtlZXBTdGFydCA9IE1hdGgubWF4KDAsIHZpc2libGVTdGFydCAtIEVWSUNUSU9OX0JVRkZFUik7XG4gICAgICBjb25zdCBrZWVwRW5kID0gdmlzaWJsZUVuZCArIEVWSUNUSU9OX0JVRkZFUjtcblxuICAgICAgbGV0IGV2aWN0ZWRDb3VudCA9IDA7XG4gICAgICBjb25zdCByYW5nZXNUb1JlbW92ZSA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuXG4gICAgICAvLyBGaW5kIGl0ZW1zIHRvIGV2aWN0IGFuZCB0cmFjayB3aGljaCByYW5nZXMgYXJlIGFmZmVjdGVkXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpdGVtc1tpXSAhPT0gdW5kZWZpbmVkICYmIChpIDwga2VlcFN0YXJ0IHx8IGkgPiBrZWVwRW5kKSkge1xuICAgICAgICAgIGRlbGV0ZSBpdGVtc1tpXTtcbiAgICAgICAgICBldmljdGVkQ291bnQrKztcbiAgICAgICAgICAvLyBNYXJrIHRoZSByYW5nZSBjb250YWluaW5nIHRoaXMgaXRlbSBmb3IgcmVtb3ZhbCBmcm9tIGxvYWRlZFJhbmdlc1xuICAgICAgICAgIC8vIFRoaXMgZW5zdXJlcyB0aGUgcmFuZ2Ugd2lsbCBiZSByZWxvYWRlZCB3aGVuIHNjcm9sbGluZyBiYWNrXG4gICAgICAgICAgY29uc3QgYWZmZWN0ZWRSYW5nZUlkID0gTWF0aC5mbG9vcihpIC8gcmFuZ2VTaXplKTtcbiAgICAgICAgICByYW5nZXNUb1JlbW92ZS5hZGQoYWZmZWN0ZWRSYW5nZUlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBSZW1vdmUgYWxsIHJhbmdlcyB0aGF0IGhhZCBhbnkgaXRlbXMgZXZpY3RlZFxuICAgICAgLy8gVGhpcyBpcyBjcml0aWNhbDogZXZlbiBpZiBvbmx5IHBhcnQgb2YgYSByYW5nZSB3YXMgZXZpY3RlZCxcbiAgICAgIC8vIHdlIG11c3QgcmVtb3ZlIGl0IGZyb20gbG9hZGVkUmFuZ2VzIHNvIGl0IGdldHMgcmVsb2FkZWRcbiAgICAgIHJhbmdlc1RvUmVtb3ZlLmZvckVhY2goKHJhbmdlSWQpID0+IHtcbiAgICAgICAgbG9hZGVkUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZXZpY3RlZENvdW50ID4gMCkge1xuICAgICAgICAvLyBFbWl0IGV2ZW50IGZvciByZW5kZXJpbmcgdG8gYWxzbyBjbGVhbiB1cFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY29sbGVjdGlvbjppdGVtcy1ldmljdGVkXCIsIHtcbiAgICAgICAgICBrZWVwU3RhcnQsXG4gICAgICAgICAga2VlcEVuZCxcbiAgICAgICAgICBldmljdGVkQ291bnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBhY3RpdmVMb2FkUmFuZ2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgbGV0IGxvYWRSZXF1ZXN0UXVldWU6IFF1ZXVlZFJlcXVlc3RbXSA9IFtdO1xuXG4gICAgLy8gQWJvcnRDb250cm9sbGVyIG1hcCBmb3IgY2FuY2VsbGluZyBpbi1mbGlnaHQgcmVxdWVzdHNcbiAgICBjb25zdCBhYm9ydENvbnRyb2xsZXJzID0gbmV3IE1hcDxudW1iZXIsIEFib3J0Q29udHJvbGxlcj4oKTtcblxuICAgIC8vIFN0YXRlXG4gICAgbGV0IGl0ZW1zOiBhbnlbXSA9IFtdO1xuICAgIGxldCB0b3RhbEl0ZW1zID0gMDtcbiAgICBsZXQgbG9hZGVkUmFuZ2VzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgbGV0IHBlbmRpbmdSYW5nZXMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICBsZXQgZmFpbGVkUmFuZ2VzID0gbmV3IE1hcDxcbiAgICAgIG51bWJlcixcbiAgICAgIHtcbiAgICAgICAgYXR0ZW1wdHM6IG51bWJlcjtcbiAgICAgICAgbGFzdEVycm9yOiBFcnJvcjtcbiAgICAgICAgdGltZXN0YW1wOiBudW1iZXI7XG4gICAgICB9XG4gICAgPigpO1xuICAgIGxldCBhY3RpdmVSZXF1ZXN0cyA9IG5ldyBNYXA8bnVtYmVyLCBQcm9taXNlPGFueVtdPj4oKTtcblxuICAgIC8vIEN1cnNvciBwYWdpbmF0aW9uIHN0YXRlXG4gICAgbGV0IGN1cnJlbnRDdXJzb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjdXJzb3JNYXAgPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpOyAvLyBNYXAgcGFnZSBudW1iZXIgdG8gY3Vyc29yXG4gICAgbGV0IHBhZ2VUb09mZnNldE1hcCA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7IC8vIE1hcCBwYWdlIHRvIGFjdHVhbCBvZmZzZXRcbiAgICBsZXQgaGlnaGVzdExvYWRlZFBhZ2UgPSAwO1xuICAgIGxldCBkaXNjb3ZlcmVkVG90YWw6IG51bWJlciB8IG51bGwgPSBudWxsOyAvLyBUcmFjayBkaXNjb3ZlcmVkIHRvdGFsIGZyb20gQVBJXG4gICAgbGV0IGhhc1JlYWNoZWRFbmQgPSBmYWxzZTsgLy8gVHJhY2sgaWYgd2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIGRhdGFcblxuICAgIC8vIFNoYXJlIGl0ZW1zIGFycmF5IHdpdGggY29tcG9uZW50XG4gICAgY29tcG9uZW50Lml0ZW1zID0gaXRlbXM7XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSB1bmlxdWUgSUQgZm9yIGEgcmFuZ2UgYmFzZWQgb24gb2Zmc2V0IGFuZCB0aGUgYmFzZSByYW5nZSBzaXplXG4gICAgICovXG4gICAgY29uc3QgZ2V0UmFuZ2VJZCA9IChvZmZzZXQ6IG51bWJlciwgbGltaXQ6IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgICAvLyBBbHdheXMgdXNlIHRoZSBiYXNlIHJhbmdlU2l6ZSBmb3IgY29uc2lzdGVudCBJRHNcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBtZXJnZWQgcmFuZ2VzIGNhbiBiZSB0cmFja2VkIHByb3Blcmx5XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihvZmZzZXQgLyByYW5nZVNpemUpO1xuICAgIH07XG5cbiAgICAvLyBMb2FkaW5nIG1hbmFnZXIgaGVscGVyc1xuICAgIGNvbnN0IGdldFJhbmdlS2V5ID0gKHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pOiBzdHJpbmcgPT4ge1xuICAgICAgcmV0dXJuIGAke3JhbmdlLnN0YXJ0fS0ke3JhbmdlLmVuZH1gO1xuICAgIH07XG5cbiAgICBjb25zdCBjYW5Mb2FkID0gKCk6IGJvb2xlYW4gPT4ge1xuICAgICAgcmV0dXJuIGN1cnJlbnRWZWxvY2l0eSA8PSBjYW5jZWxMb2FkVGhyZXNob2xkO1xuICAgIH07XG5cbiAgICBjb25zdCBwcm9jZXNzUXVldWUgPSAoKSA9PiB7XG4gICAgICBpZiAoIWVuYWJsZVJlcXVlc3RRdWV1ZSB8fCBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAvLyBTb3J0IHF1ZXVlIGJ5IHByaW9yaXR5IGFuZCB0aW1lc3RhbXBcbiAgICAgIGxvYWRSZXF1ZXN0UXVldWUuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBwcmlvcml0eU9yZGVyID0geyBoaWdoOiAwLCBub3JtYWw6IDEsIGxvdzogMiB9O1xuICAgICAgICBjb25zdCBwcmlvcml0eURpZmYgPVxuICAgICAgICAgIHByaW9yaXR5T3JkZXJbYS5wcmlvcml0eV0gLSBwcmlvcml0eU9yZGVyW2IucHJpb3JpdHldO1xuICAgICAgICByZXR1cm4gcHJpb3JpdHlEaWZmICE9PSAwID8gcHJpb3JpdHlEaWZmIDogYS50aW1lc3RhbXAgLSBiLnRpbWVzdGFtcDtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBQcm9jZXNzIHJlcXVlc3RzIHVwIHRvIGNhcGFjaXR5XG4gICAgICB3aGlsZSAoXG4gICAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoID4gMCAmJlxuICAgICAgICBhY3RpdmVMb2FkQ291bnQgPCBtYXhDb25jdXJyZW50UmVxdWVzdHNcbiAgICAgICkge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gbG9hZFJlcXVlc3RRdWV1ZS5zaGlmdCgpO1xuICAgICAgICBpZiAocmVxdWVzdCkge1xuICAgICAgICAgIGV4ZWN1dGVRdWV1ZWRMb2FkKHJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGV4ZWN1dGVRdWV1ZWRMb2FkID0gKHJlcXVlc3Q6IFF1ZXVlZFJlcXVlc3QpID0+IHtcbiAgICAgIGFjdGl2ZUxvYWRDb3VudCsrO1xuICAgICAgYWN0aXZlTG9hZFJhbmdlcy5hZGQoZ2V0UmFuZ2VLZXkocmVxdWVzdC5yYW5nZSkpO1xuXG4gICAgICAvLyBDYWxsIHRoZSBhY3R1YWwgbG9hZE1pc3NpbmdSYW5nZXMgZnVuY3Rpb25cbiAgICAgIGxvYWRNaXNzaW5nUmFuZ2VzSW50ZXJuYWwocmVxdWVzdC5yYW5nZSlcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJlcXVlc3QucmVzb2x2ZSgpO1xuICAgICAgICAgIGNvbXBsZXRlZExvYWRzKys7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgcmVxdWVzdC5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgIGZhaWxlZExvYWRzKys7XG4gICAgICAgIH0pXG4gICAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICBhY3RpdmVMb2FkQ291bnQtLTtcbiAgICAgICAgICBhY3RpdmVMb2FkUmFuZ2VzLmRlbGV0ZShnZXRSYW5nZUtleShyZXF1ZXN0LnJhbmdlKSk7XG4gICAgICAgICAgcHJvY2Vzc1F1ZXVlKCk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm0gaXRlbXMgaWYgdHJhbnNmb3JtIGZ1bmN0aW9uIHByb3ZpZGVkXG4gICAgICovXG4gICAgY29uc3QgdHJhbnNmb3JtSXRlbXMgPSAocmF3SXRlbXM6IGFueVtdKTogYW55W10gPT4ge1xuICAgICAgaWYgKCF0cmFuc2Zvcm0pIHJldHVybiByYXdJdGVtcztcbiAgICAgIHJldHVybiByYXdJdGVtcy5tYXAodHJhbnNmb3JtKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogTG9hZCBhIHJhbmdlIG9mIGRhdGFcbiAgICAgKi9cbiAgICBjb25zdCBsb2FkUmFuZ2UgPSBhc3luYyAob2Zmc2V0OiBudW1iZXIsIGxpbWl0OiBudW1iZXIpOiBQcm9taXNlPGFueVtdPiA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBsb2FkUmFuZ2UgY2FsbGVkOiBvZmZzZXQ9JHtvZmZzZXR9LCBsaW1pdD0ke2xpbWl0fWAsXG4gICAgICAvLyApO1xuXG4gICAgICBpZiAoIWNvbGxlY3Rpb24pIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiW0NvbGxlY3Rpb25dIE5vIGNvbGxlY3Rpb24gYWRhcHRlciBjb25maWd1cmVkXCIpO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJhbmdlSWQgPSBnZXRSYW5nZUlkKG9mZnNldCwgbGltaXQpO1xuICAgICAgLy8gY29uc29sZS5sb2coYFtDb2xsZWN0aW9uXSBSYW5nZSBJRDogJHtyYW5nZUlkfWApO1xuXG4gICAgICAvLyBDaGVjayBpZiBhbHJlYWR5IGxvYWRlZFxuICAgICAgaWYgKGxvYWRlZFJhbmdlcy5oYXMocmFuZ2VJZCkpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBSYW5nZSAke3JhbmdlSWR9IGFscmVhZHkgbG9hZGVkLCByZXR1cm5pbmcgY2FjaGVkIGRhdGFgLFxuICAgICAgICAvLyApO1xuICAgICAgICByZXR1cm4gaXRlbXMuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBsaW1pdCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGFscmVhZHkgcGVuZGluZ1xuICAgICAgaWYgKHBlbmRpbmdSYW5nZXMuaGFzKHJhbmdlSWQpKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBbQ29sbGVjdGlvbl0gUmFuZ2UgJHtyYW5nZUlkfSBhbHJlYWR5IHBlbmRpbmdgKTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdSZXF1ZXN0ID0gYWN0aXZlUmVxdWVzdHMuZ2V0KHJhbmdlSWQpO1xuICAgICAgICBpZiAoZXhpc3RpbmdSZXF1ZXN0KSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFJldHVybmluZyBleGlzdGluZyByZXF1ZXN0IGZvciByYW5nZSAke3JhbmdlSWR9YCxcbiAgICAgICAgICAvLyApO1xuICAgICAgICAgIHJldHVybiBleGlzdGluZ1JlcXVlc3Q7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTWFyayBhcyBwZW5kaW5nXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBNYXJraW5nIHJhbmdlICR7cmFuZ2VJZH0gYXMgcGVuZGluZyBhbmQgbG9hZGluZy4uLmAsXG4gICAgICAvLyApO1xuICAgICAgcGVuZGluZ1Jhbmdlcy5hZGQocmFuZ2VJZCk7XG5cbiAgICAgIC8vIENyZWF0ZSBBYm9ydENvbnRyb2xsZXIgZm9yIHRoaXMgcmVxdWVzdFxuICAgICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgYWJvcnRDb250cm9sbGVycy5zZXQocmFuZ2VJZCwgYWJvcnRDb250cm9sbGVyKTtcblxuICAgICAgLy8gQ3JlYXRlIHJlcXVlc3QgcHJvbWlzZVxuICAgICAgY29uc3QgcmVxdWVzdFByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIENhbGwgY29sbGVjdGlvbiBhZGFwdGVyIHdpdGggYXBwcm9wcmlhdGUgcGFyYW1ldGVyc1xuICAgICAgICAgIGNvbnN0IHBhZ2UgPSBNYXRoLmZsb29yKG9mZnNldCAvIGxpbWl0KSArIDE7XG4gICAgICAgICAgbGV0IHBhcmFtczogYW55O1xuXG4gICAgICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImN1cnNvclwiKSB7XG4gICAgICAgICAgICAvLyBGb3IgY3Vyc29yIHBhZ2luYXRpb25cbiAgICAgICAgICAgIGlmIChwYWdlID09PSAxKSB7XG4gICAgICAgICAgICAgIC8vIEZpcnN0IHBhZ2UgLSBubyBjdXJzb3JcbiAgICAgICAgICAgICAgcGFyYW1zID0geyBsaW1pdCB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBjdXJzb3IgZm9yIHByZXZpb3VzIHBhZ2VcbiAgICAgICAgICAgICAgY29uc3QgcHJldlBhZ2VDdXJzb3IgPSBjdXJzb3JNYXAuZ2V0KHBhZ2UgLSAxKTtcbiAgICAgICAgICAgICAgaWYgKCFwcmV2UGFnZUN1cnNvcikge1xuICAgICAgICAgICAgICAgIC8vIENhbid0IGxvYWQgdGhpcyBwYWdlIHdpdGhvdXQgcHJldmlvdXMgY3Vyc29yXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgYFtDb2xsZWN0aW9uXSBDYW5ub3QgbG9hZCBwYWdlICR7cGFnZX0gd2l0aG91dCBjdXJzb3IgZm9yIHBhZ2UgJHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZSAtIDFcbiAgICAgICAgICAgICAgICAgIH1gLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgYFNlcXVlbnRpYWwgbG9hZGluZyByZXF1aXJlZCAtIG1pc3NpbmcgY3Vyc29yIGZvciBwYWdlICR7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2UgLSAxXG4gICAgICAgICAgICAgICAgICB9YCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHBhcmFtcyA9IHsgY3Vyc29yOiBwcmV2UGFnZUN1cnNvciwgbGltaXQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHN0cmF0ZWd5ID09PSBcInBhZ2VcIikge1xuICAgICAgICAgICAgcGFyYW1zID0geyBwYWdlLCBsaW1pdCB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBvZmZzZXQgc3RyYXRlZ3lcbiAgICAgICAgICAgIHBhcmFtcyA9IHsgb2Zmc2V0LCBsaW1pdCB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtWaWV3cG9ydCBDb2xsZWN0aW9uXSBMb2FkaW5nIHJhbmdlIG9mZnNldD0ke29mZnNldH0sIGxpbWl0PSR7bGltaXR9LCBzdHJhdGVneT0ke3N0cmF0ZWd5fSwgY2FsY3VsYXRlZCBwYWdlPSR7cGFnZX0sIHBhcmFtczpgLFxuICAgICAgICAgIC8vICAgSlNPTi5zdHJpbmdpZnkocGFyYW1zKVxuICAgICAgICAgIC8vICk7XG5cbiAgICAgICAgICAvLyBQYXNzIGFib3J0IHNpZ25hbCB0byB0aGUgYWRhcHRlciBpZiBpdCBzdXBwb3J0cyBpdFxuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY29sbGVjdGlvbi5yZWFkKHtcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEV4dHJhY3QgaXRlbXMgYW5kIHRvdGFsXG4gICAgICAgICAgY29uc3QgcmF3SXRlbXMgPSByZXNwb25zZS5kYXRhIHx8IHJlc3BvbnNlLml0ZW1zIHx8IHJlc3BvbnNlO1xuICAgICAgICAgIGNvbnN0IG1ldGEgPSByZXNwb25zZS5tZXRhIHx8IHt9O1xuXG4gICAgICAgICAgLy8gRm9yIGN1cnNvciBwYWdpbmF0aW9uLCB0cmFjayB0aGUgY3Vyc29yIChjaGVjayBib3RoIGN1cnNvciBhbmQgbmV4dEN1cnNvcilcbiAgICAgICAgICBjb25zdCByZXNwb25zZUN1cnNvciA9IG1ldGEuY3Vyc29yIHx8IG1ldGEubmV4dEN1cnNvcjtcbiAgICAgICAgICBpZiAoc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIgJiYgcmVzcG9uc2VDdXJzb3IpIHtcbiAgICAgICAgICAgIGN1cnJlbnRDdXJzb3IgPSByZXNwb25zZUN1cnNvcjtcbiAgICAgICAgICAgIGN1cnNvck1hcC5zZXQocGFnZSwgcmVzcG9uc2VDdXJzb3IpO1xuICAgICAgICAgICAgcGFnZVRvT2Zmc2V0TWFwLnNldChwYWdlLCBvZmZzZXQpO1xuICAgICAgICAgICAgaGlnaGVzdExvYWRlZFBhZ2UgPSBNYXRoLm1heChoaWdoZXN0TG9hZGVkUGFnZSwgcGFnZSk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBTdG9yZWQgY3Vyc29yIGZvciBwYWdlICR7cGFnZX06ICR7cmVzcG9uc2VDdXJzb3J9YCxcbiAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgd2UndmUgcmVhY2hlZCB0aGUgZW5kXG4gICAgICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImN1cnNvclwiICYmIG1ldGEuaGFzTmV4dCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGhhc1JlYWNoZWRFbmQgPSB0cnVlO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gUmVhY2hlZCBlbmQgb2YgY3Vyc29yIHBhZ2luYXRpb24gYXQgcGFnZSAke3BhZ2V9YCxcbiAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVXBkYXRlIGRpc2NvdmVyZWQgdG90YWwgaWYgcHJvdmlkZWRcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gbWV0YS50b3RhbDogJHttZXRhLnRvdGFsfSwgZGlzY292ZXJlZFRvdGFsIGJlZm9yZTogJHtkaXNjb3ZlcmVkVG90YWx9YCxcbiAgICAgICAgICAvLyApO1xuICAgICAgICAgIGlmIChtZXRhLnRvdGFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRpc2NvdmVyZWRUb3RhbCA9IG1ldGEudG90YWw7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGBbQ29sbGVjdGlvbl0gZGlzY292ZXJlZFRvdGFsIGFmdGVyOiAke2Rpc2NvdmVyZWRUb3RhbH1gKTtcblxuICAgICAgICAgIC8vIFRyYW5zZm9ybSBpdGVtc1xuICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkSXRlbXMgPSB0cmFuc2Zvcm1JdGVtcyhyYXdJdGVtcyk7XG5cbiAgICAgICAgICAvLyBBZGQgaXRlbXMgdG8gYXJyYXlcbiAgICAgICAgICB0cmFuc2Zvcm1lZEl0ZW1zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpdGVtc1tvZmZzZXQgKyBpbmRleF0gPSBpdGVtO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRm9yIGN1cnNvciBzdHJhdGVneSwgY2FsY3VsYXRlIGR5bmFtaWMgdG90YWwgYmFzZWQgb24gbG9hZGVkIGRhdGFcbiAgICAgICAgICAvLyBVc2UgbnVsbGlzaCBjb2FsZXNjaW5nICg/PykgaW5zdGVhZCBvZiB8fCB0byBoYW5kbGUgZGlzY292ZXJlZFRvdGFsID0gMCBjb3JyZWN0bHlcbiAgICAgICAgICBsZXQgbmV3VG90YWwgPSBkaXNjb3ZlcmVkVG90YWwgPz8gdG90YWxJdGVtcztcblxuICAgICAgICAgIC8vIENSSVRJQ0FMIEZJWDogV2hlbiBBUEkgcmV0dXJucyAwIGl0ZW1zIG9uIHBhZ2UgMSAob2Zmc2V0IDApLCB0aGUgbGlzdCBpcyBlbXB0eS5cbiAgICAgICAgICAvLyBXZSBtdXN0IHNldCB0b3RhbEl0ZW1zIHRvIDAgcmVnYXJkbGVzcyBvZiBtZXRhLnRvdGFsIGJlaW5nIHVuZGVmaW5lZC5cbiAgICAgICAgICAvLyBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgY291bnQ9ZmFsc2UgaXMgc2VudCBidXQgdGhlIGxpc3QgaXMgYWN0dWFsbHkgZW1wdHkuXG4gICAgICAgICAgaWYgKG9mZnNldCA9PT0gMCAmJiB0cmFuc2Zvcm1lZEl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gRW1wdHkgcmVzdWx0IG9uIHBhZ2UgMSAtIGZvcmNpbmcgdG90YWxJdGVtcyB0byAwYCxcbiAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgICBuZXdUb3RhbCA9IDA7XG4gICAgICAgICAgICBkaXNjb3ZlcmVkVG90YWwgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gbmV3VG90YWwgaW5pdGlhbDogJHtuZXdUb3RhbH0sIHRvdGFsSXRlbXM6ICR7dG90YWxJdGVtc30sIHN0cmF0ZWd5OiAke3N0cmF0ZWd5fWAsXG4gICAgICAgICAgLy8gKTtcblxuICAgICAgICAgIGlmIChzdHJhdGVneSA9PT0gXCJjdXJzb3JcIikge1xuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRvdGFsIGJhc2VkIG9uIGxvYWRlZCBpdGVtcyArIG1hcmdpblxuICAgICAgICAgICAgY29uc3QgbG9hZGVkSXRlbXNDb3VudCA9IGl0ZW1zLmZpbHRlcihcbiAgICAgICAgICAgICAgKGl0ZW0pID0+IGl0ZW0gIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICkubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgbWFyZ2luSXRlbXMgPSBoYXNSZWFjaGVkRW5kXG4gICAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgICA6IHJhbmdlU2l6ZSAqXG4gICAgICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlBBR0lOQVRJT04uQ1VSU09SX1NDUk9MTF9NQVJHSU5fTVVMVElQTElFUjtcbiAgICAgICAgICAgIGNvbnN0IG1pblZpcnR1YWxJdGVtcyA9XG4gICAgICAgICAgICAgIHJhbmdlU2l6ZSAqXG4gICAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QQUdJTkFUSU9OLkNVUlNPUl9NSU5fVklSVFVBTF9TSVpFX01VTFRJUExJRVI7XG5cbiAgICAgICAgICAgIC8vIER5bmFtaWMgdG90YWw6IGxvYWRlZCBpdGVtcyArIG1hcmdpbiAodW5sZXNzIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZClcbiAgICAgICAgICAgIG5ld1RvdGFsID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAgIGxvYWRlZEl0ZW1zQ291bnQgKyBtYXJnaW5JdGVtcyxcbiAgICAgICAgICAgICAgbWluVmlydHVhbEl0ZW1zLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gQ3Vyc29yIG1vZGUgdmlydHVhbCBzaXplOiBsb2FkZWQ9JHtsb2FkZWRJdGVtc0NvdW50fSwgbWFyZ2luPSR7bWFyZ2luSXRlbXN9LCB0b3RhbD0ke25ld1RvdGFsfSwgaGFzUmVhY2hlZEVuZD0ke2hhc1JlYWNoZWRFbmR9YCxcbiAgICAgICAgICAgIC8vICk7XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0b3RhbCBpZiBpdCBoYXMgZ3Jvd25cbiAgICAgICAgICAgIGlmIChuZXdUb3RhbCA+IHRvdGFsSXRlbXMpIHtcbiAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBVcGRhdGluZyBjdXJzb3IgdmlydHVhbCBzaXplIGZyb20gJHt0b3RhbEl0ZW1zfSB0byAke25ld1RvdGFsfWAsXG4gICAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgICAgIHRvdGFsSXRlbXMgPSBuZXdUb3RhbDtcbiAgICAgICAgICAgICAgc2V0VG90YWxJdGVtcyhuZXdUb3RhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZvciBvdGhlciBzdHJhdGVnaWVzLCB1c2UgZGlzY292ZXJlZCB0b3RhbCBvciBjdXJyZW50IHRvdGFsXG4gICAgICAgICAgICAvLyBVc2UgbnVsbGlzaCBjb2FsZXNjaW5nICg/PykgaW5zdGVhZCBvZiB8fCB0byBoYW5kbGUgZGlzY292ZXJlZFRvdGFsID0gMCBjb3JyZWN0bHlcbiAgICAgICAgICAgIG5ld1RvdGFsID0gZGlzY292ZXJlZFRvdGFsID8/IHRvdGFsSXRlbXM7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVXBkYXRlIHN0YXRlXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIEJlZm9yZSBzdGF0ZSB1cGRhdGU6IG5ld1RvdGFsPSR7bmV3VG90YWx9LCB0b3RhbEl0ZW1zPSR7dG90YWxJdGVtc30sIHdpbGwgdXBkYXRlOiAke25ld1RvdGFsICE9PSB0b3RhbEl0ZW1zfWAsXG4gICAgICAgICAgLy8gKTtcbiAgICAgICAgICBpZiAobmV3VG90YWwgIT09IHRvdGFsSXRlbXMpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGBbQ29sbGVjdGlvbl0gQ2FsbGluZyBzZXRUb3RhbEl0ZW1zKCR7bmV3VG90YWx9KWApO1xuICAgICAgICAgICAgdG90YWxJdGVtcyA9IG5ld1RvdGFsO1xuICAgICAgICAgICAgc2V0VG90YWxJdGVtcyhuZXdUb3RhbCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVXBkYXRlIGNvbXBvbmVudCBpdGVtcyByZWZlcmVuY2VcbiAgICAgICAgICBjb21wb25lbnQuaXRlbXMgPSBpdGVtcztcblxuICAgICAgICAgIC8vIEVtaXQgaXRlbXMgY2hhbmdlZCBldmVudFxuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDppdGVtcy1jaGFuZ2VkXCIsIHtcbiAgICAgICAgICAgIHRvdGFsSXRlbXM6IG5ld1RvdGFsLFxuICAgICAgICAgICAgbG9hZGVkQ291bnQ6IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbSAhPT0gdW5kZWZpbmVkKS5sZW5ndGgsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBVcGRhdGUgdmlld3BvcnQgc3RhdGVcbiAgICAgICAgICBjb25zdCB2aWV3cG9ydFN0YXRlID0gKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLnN0YXRlO1xuICAgICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgICAvLyBVc2UgbnVsbGlzaCBjb2FsZXNjaW5nICg/PykgaW5zdGVhZCBvZiB8fCB0byBoYW5kbGUgbmV3VG90YWwgPSAwIGNvcnJlY3RseVxuICAgICAgICAgICAgdmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zID0gbmV3VG90YWwgPz8gaXRlbXMubGVuZ3RoO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE1hcmsgYXMgbG9hZGVkXG4gICAgICAgICAgbG9hZGVkUmFuZ2VzLmFkZChyYW5nZUlkKTtcbiAgICAgICAgICBwZW5kaW5nUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgICBmYWlsZWRSYW5nZXMuZGVsZXRlKHJhbmdlSWQpO1xuXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFJhbmdlICR7cmFuZ2VJZH0gbG9hZGVkIHN1Y2Nlc3NmdWxseSB3aXRoICR7dHJhbnNmb3JtZWRJdGVtcy5sZW5ndGh9IGl0ZW1zYFxuICAgICAgICAgIC8vICk7XG5cbiAgICAgICAgICAvLyBMb2cgbWVtb3J5IHN0YXRzIHBlcmlvZGljYWxseSAoZXZlcnkgNSBsb2FkcylcbiAgICAgICAgICBpZiAoY29tcGxldGVkTG9hZHMgJSA1ID09PSAwKSB7XG4gICAgICAgICAgICBsb2dNZW1vcnlTdGF0cyhgbG9hZDoke2NvbXBsZXRlZExvYWRzfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEVtaXQgZXZlbnRzXG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCB7XG4gICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICAgIGl0ZW1zOiB0cmFuc2Zvcm1lZEl0ZW1zLFxuICAgICAgICAgICAgdG90YWw6IG5ld1RvdGFsLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRW1pdCBjb2xsZWN0aW9uIGxvYWRlZCBldmVudCB3aXRoIG1vcmUgZGV0YWlsc1xuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJjb2xsZWN0aW9uOnJhbmdlLWxvYWRlZFwiLCB7XG4gICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICAgIGl0ZW1zOiB0cmFuc2Zvcm1lZEl0ZW1zLFxuICAgICAgICAgICAgdG90YWw6IG5ld1RvdGFsLFxuICAgICAgICAgICAgcmFuZ2VJZCxcbiAgICAgICAgICAgIGl0ZW1zSW5NZW1vcnk6IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbSAhPT0gdW5kZWZpbmVkKS5sZW5ndGgsXG4gICAgICAgICAgICBjdXJzb3I6IHN0cmF0ZWd5ID09PSBcImN1cnNvclwiID8gY3VycmVudEN1cnNvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIFRyaWdnZXIgdmlld3BvcnQgdXBkYXRlXG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0Py51cGRhdGVWaWV3cG9ydD8uKCk7XG5cbiAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWRJdGVtcztcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBIYW5kbGUgQWJvcnRFcnJvciBhbmQgXCJGYWlsZWQgdG8gZmV0Y2hcIiAod2hpY2ggY2FuIG9jY3VyIG9uIGFib3J0KSBncmFjZWZ1bGx5XG4gICAgICAgICAgY29uc3QgaXNBYm9ydEVycm9yID1cbiAgICAgICAgICAgIChlcnJvciBhcyBFcnJvcikubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIgfHxcbiAgICAgICAgICAgICgoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2UgPT09IFwiRmFpbGVkIHRvIGZldGNoXCIgJiZcbiAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKTtcblxuICAgICAgICAgIGlmIChpc0Fib3J0RXJyb3IpIHtcbiAgICAgICAgICAgIHBlbmRpbmdSYW5nZXMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICAgICAgY2FuY2VsbGVkTG9hZHMrKztcbiAgICAgICAgICAgIC8vIERvbid0IHRocm93LCBqdXN0IHJldHVybiBlbXB0eSBhcnJheVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEhhbmRsZSBvdGhlciBlcnJvcnNcbiAgICAgICAgICBwZW5kaW5nUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgICBmYWlsZWRMb2FkcysrO1xuXG4gICAgICAgICAgY29uc3QgYXR0ZW1wdHMgPSAoZmFpbGVkUmFuZ2VzLmdldChyYW5nZUlkKT8uYXR0ZW1wdHMgfHwgMCkgKyAxO1xuICAgICAgICAgIGZhaWxlZFJhbmdlcy5zZXQocmFuZ2VJZCwge1xuICAgICAgICAgICAgYXR0ZW1wdHMsXG4gICAgICAgICAgICBsYXN0RXJyb3I6IGVycm9yIGFzIEVycm9yLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRW1pdCBlcnJvciBldmVudFxuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpyYW5nZS1lcnJvclwiLCB7XG4gICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgYXR0ZW1wdHMsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBhY3RpdmVSZXF1ZXN0cy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgICAgYWJvcnRDb250cm9sbGVycy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG5cbiAgICAgIGFjdGl2ZVJlcXVlc3RzLnNldChyYW5nZUlkLCByZXF1ZXN0UHJvbWlzZSk7XG4gICAgICByZXR1cm4gcmVxdWVzdFByb21pc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIExvYWQgbWlzc2luZyByYW5nZXMgZnJvbSBjb2xsZWN0aW9uXG4gICAgICovXG4gICAgY29uc3QgbG9hZE1pc3NpbmdSYW5nZXNJbnRlcm5hbCA9IGFzeW5jIChyYW5nZToge1xuICAgICAgc3RhcnQ6IG51bWJlcjtcbiAgICAgIGVuZDogbnVtYmVyO1xuICAgIH0pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGlmICghY29sbGVjdGlvbikgcmV0dXJuO1xuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBsb2FkTWlzc2luZ1Jhbmdlc0ludGVybmFsIC0gcmFuZ2U6ICR7c3RhcnR9LSR7ZW5kfSwgc3RyYXRlZ3k6ICR7c3RyYXRlZ3l9YCxcbiAgICAgIC8vICk7XG5cbiAgICAgIC8vIEZvciBjdXJzb3IgcGFnaW5hdGlvbiwgd2UgbmVlZCB0byBsb2FkIHNlcXVlbnRpYWxseVxuICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImN1cnNvclwiKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGFnZSA9IE1hdGguZmxvb3IocmFuZ2Uuc3RhcnQgLyByYW5nZVNpemUpICsgMTtcbiAgICAgICAgY29uc3QgZW5kUGFnZSA9IE1hdGguZmxvb3IocmFuZ2UuZW5kIC8gcmFuZ2VTaXplKSArIDE7XG5cbiAgICAgICAgLy8gTGltaXQgaG93IG1hbnkgcGFnZXMgd2UnbGwgbG9hZCBhdCBvbmNlXG4gICAgICAgIGNvbnN0IG1heFBhZ2VzVG9Mb2FkID0gMTA7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRIaWdoZXN0UGFnZSA9IGhpZ2hlc3RMb2FkZWRQYWdlIHx8IDA7XG4gICAgICAgIGNvbnN0IGxpbWl0ZWRFbmRQYWdlID0gTWF0aC5taW4oXG4gICAgICAgICAgZW5kUGFnZSxcbiAgICAgICAgICBjdXJyZW50SGlnaGVzdFBhZ2UgKyBtYXhQYWdlc1RvTG9hZCxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIEN1cnNvciBtb2RlOiBuZWVkIHRvIGxvYWQgcGFnZXMgJHtzdGFydFBhZ2V9IHRvICR7ZW5kUGFnZX0sIGxpbWl0ZWQgdG8gJHtsaW1pdGVkRW5kUGFnZX1gLFxuICAgICAgICAvLyApO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8gbG9hZCBwYWdlcyBzZXF1ZW50aWFsbHlcbiAgICAgICAgZm9yIChsZXQgcGFnZSA9IHN0YXJ0UGFnZTsgcGFnZSA8PSBsaW1pdGVkRW5kUGFnZTsgcGFnZSsrKSB7XG4gICAgICAgICAgY29uc3QgcmFuZ2VJZCA9IHBhZ2UgLSAxOyAvLyBDb252ZXJ0IHRvIDAtYmFzZWQgcmFuZ2VJZFxuICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHJhbmdlSWQgKiByYW5nZVNpemU7XG5cbiAgICAgICAgICAvLyBTa2lwIGlmIGFscmVhZHkgYmVpbmcgbG9hZGVkXG4gICAgICAgICAgaWYgKHBlbmRpbmdSYW5nZXMuaGFzKHJhbmdlSWQpKSB7XG4gICAgICAgICAgICAvLyBSYW5nZSBhbHJlYWR5IGJlaW5nIGxvYWRlZFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghbG9hZGVkUmFuZ2VzLmhhcyhyYW5nZUlkKSAmJiAhcGVuZGluZ1Jhbmdlcy5oYXMocmFuZ2VJZCkpIHtcbiAgICAgICAgICAgIC8vIEZvciBjdXJzb3IgcGFnaW5hdGlvbiwgd2UgbXVzdCBsb2FkIHNlcXVlbnRpYWxseVxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhbGwgcHJldmlvdXMgcGFnZXMgbG9hZGVkXG4gICAgICAgICAgICBpZiAocGFnZSA+IDEpIHtcbiAgICAgICAgICAgICAgbGV0IGNhbkxvYWQgPSB0cnVlO1xuICAgICAgICAgICAgICBmb3IgKGxldCBwcmV2UGFnZSA9IDE7IHByZXZQYWdlIDwgcGFnZTsgcHJldlBhZ2UrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZSYW5nZUlkID0gcHJldlBhZ2UgLSAxO1xuICAgICAgICAgICAgICAgIGlmICghbG9hZGVkUmFuZ2VzLmhhcyhwcmV2UmFuZ2VJZCkpIHtcbiAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIENhbm5vdCBsb2FkIHBhZ2UgJHtwYWdlfSAtIG5lZWQgdG8gbG9hZCBwYWdlICR7cHJldlBhZ2V9IGZpcnN0YCxcbiAgICAgICAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgICAgICAgICBjYW5Mb2FkID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgIC8vIFRyeSB0byBsb2FkIHRoZSBtaXNzaW5nIHBhZ2VcbiAgICAgICAgICAgICAgICAgIGlmICghcGVuZGluZ1Jhbmdlcy5oYXMocHJldlJhbmdlSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbG9hZFJhbmdlKHByZXZSYW5nZUlkICogcmFuZ2VTaXplLCByYW5nZVNpemUpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBgW0NvbGxlY3Rpb25dIEZhaWxlZCB0byBsb2FkIHByZXJlcXVpc2l0ZSBwYWdlICR7cHJldlBhZ2V9OmAsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gU3RvcCB0cnlpbmcgdG8gbG9hZCBmdXJ0aGVyIHBhZ2VzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICghY2FuTG9hZCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIHRoaXMgcGFnZSBmb3Igbm93XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgbG9hZFJhbmdlKG9mZnNldCwgcmFuZ2VTaXplKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFtDb2xsZWN0aW9uXSBGYWlsZWQgdG8gbG9hZCBwYWdlICR7cGFnZX06YCwgZXJyb3IpO1xuICAgICAgICAgICAgICBicmVhazsgLy8gU3RvcCBzZXF1ZW50aWFsIGxvYWRpbmcgb24gZXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW5kUGFnZSA+IGxpbWl0ZWRFbmRQYWdlKSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFN0b3BwZWQgYXQgcGFnZSAke2xpbWl0ZWRFbmRQYWdlfSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSBsb2FkaW5nIChyZXF1ZXN0ZWQgdXAgdG8gJHtlbmRQYWdlfSlgLFxuICAgICAgICAgIC8vICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIE9yaWdpbmFsIGxvZ2ljIGZvciBvZmZzZXQvcGFnZSBzdHJhdGVnaWVzXG4gICAgICAvLyBDYWxjdWxhdGUgcmFuZ2UgYm91bmRhcmllc1xuICAgICAgY29uc3Qgc3RhcnRSYW5nZSA9IE1hdGguZmxvb3IocmFuZ2Uuc3RhcnQgLyByYW5nZVNpemUpO1xuICAgICAgY29uc3QgZW5kUmFuZ2UgPSBNYXRoLmZsb29yKHJhbmdlLmVuZCAvIHJhbmdlU2l6ZSk7XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIHBhZ2Ugc3RyYXRlZ3kgLSBzdGFydFJhbmdlOiAke3N0YXJ0UmFuZ2V9LCBlbmRSYW5nZTogJHtlbmRSYW5nZX0sIGxvYWRlZFJhbmdlczogWyR7QXJyYXkuZnJvbShsb2FkZWRSYW5nZXMpLmpvaW4oXCIsIFwiKX1dYCxcbiAgICAgIC8vICk7XG5cbiAgICAgIC8vIENvbGxlY3QgcmFuZ2VzIHRoYXQgbmVlZCBsb2FkaW5nXG4gICAgICBjb25zdCByYW5nZXNUb0xvYWQ6IG51bWJlcltdID0gW107XG4gICAgICBmb3IgKGxldCByYW5nZUlkID0gc3RhcnRSYW5nZTsgcmFuZ2VJZCA8PSBlbmRSYW5nZTsgcmFuZ2VJZCsrKSB7XG4gICAgICAgIGlmICghbG9hZGVkUmFuZ2VzLmhhcyhyYW5nZUlkKSAmJiAhcGVuZGluZ1Jhbmdlcy5oYXMocmFuZ2VJZCkpIHtcbiAgICAgICAgICByYW5nZXNUb0xvYWQucHVzaChyYW5nZUlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSByYW5nZXNUb0xvYWQ6IFske3Jhbmdlc1RvTG9hZC5qb2luKFwiLCBcIil9XSwgcGVuZGluZ1JhbmdlczogWyR7QXJyYXkuZnJvbShwZW5kaW5nUmFuZ2VzKS5qb2luKFwiLCBcIil9XWAsXG4gICAgICAvLyApO1xuXG4gICAgICBpZiAocmFuZ2VzVG9Mb2FkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW0NvbGxlY3Rpb25dIE5vIHJhbmdlcyB0byBsb2FkIC0gYWxsIGxvYWRlZCBvciBwZW5kaW5nYCk7XG4gICAgICAgIC8vIEFsbCByYW5nZXMgYXJlIGFscmVhZHkgbG9hZGVkIG9yIHBlbmRpbmdcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIHF1ZXVlZCByZXF1ZXN0cyB3ZSBzaG91bGQgcHJvY2Vzc1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggPiAwICYmXG4gICAgICAgICAgYWN0aXZlTG9hZENvdW50IDwgbWF4Q29uY3VycmVudFJlcXVlc3RzXG4gICAgICAgICkge1xuICAgICAgICAgIHByb2Nlc3NRdWV1ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gTG9hZGluZyAke3Jhbmdlc1RvTG9hZC5sZW5ndGh9IHJhbmdlczogWyR7cmFuZ2VzVG9Mb2FkLmpvaW4oXCIsIFwiKX1dYCxcbiAgICAgIC8vICk7XG5cbiAgICAgIC8vIExvYWQgcmFuZ2VzIGluZGl2aWR1YWxseSAtIG5vIG1lcmdpbmcgdG8gYXZvaWQgbG9hZGluZyBvbGQgcmFuZ2VzXG4gICAgICBjb25zdCBwcm9taXNlcyA9IHJhbmdlc1RvTG9hZC5tYXAoKHJhbmdlSWQpID0+XG4gICAgICAgIGxvYWRSYW5nZShyYW5nZUlkICogcmFuZ2VTaXplLCByYW5nZVNpemUpLFxuICAgICAgKTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChwcm9taXNlcyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFZlbG9jaXR5LWF3YXJlIHdyYXBwZXIgZm9yIGxvYWRNaXNzaW5nUmFuZ2VzXG4gICAgICovXG4gICAgY29uc3QgbG9hZE1pc3NpbmdSYW5nZXMgPSAoXG4gICAgICByYW5nZToge1xuICAgICAgICBzdGFydDogbnVtYmVyO1xuICAgICAgICBlbmQ6IG51bWJlcjtcbiAgICAgIH0sXG4gICAgICBjYWxsZXI/OiBzdHJpbmcsXG4gICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCByYW5nZUtleSA9IGdldFJhbmdlS2V5KHJhbmdlKTtcblxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIGxvYWRNaXNzaW5nUmFuZ2VzIGNhbGxlZCAtIHJhbmdlOiAke3JhbmdlLnN0YXJ0fS0ke3JhbmdlLmVuZH0sIGNhbGxlcjogJHtjYWxsZXJ9YCxcbiAgICAgICAgLy8gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBsb2FkZWRSYW5nZXM6IFske0FycmF5LmZyb20obG9hZGVkUmFuZ2VzKS5qb2luKFwiLCBcIil9XWAsXG4gICAgICAgIC8vICk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBsb2FkaW5nXG4gICAgICAgIGlmIChhY3RpdmVMb2FkUmFuZ2VzLmhhcyhyYW5nZUtleSkpIHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhgW0NvbGxlY3Rpb25dIFJhbmdlIGFscmVhZHkgYmVpbmcgbG9hZGVkLCBza2lwcGluZ2ApO1xuICAgICAgICAgIC8vIFJhbmdlIGFscmVhZHkgYmVpbmcgbG9hZGVkXG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNraXAgaWYgZHJhZ2dpbmcgd2l0aCBsb3cgdmVsb2NpdHkgKGJ1dCBub3QgaWYgd2UncmUgaWRsZSlcbiAgICAgICAgaWYgKGlzRHJhZ2dpbmcgJiYgY3VycmVudFZlbG9jaXR5IDwgMC41ICYmIGN1cnJlbnRWZWxvY2l0eSA+IDApIHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIFwiW0NvbGxlY3Rpb25dIExvYWQgc2tpcHBlZCAtIGFjdGl2ZWx5IGRyYWdnaW5nIHdpdGggbG93IHZlbG9jaXR5XCJcbiAgICAgICAgICAvLyApO1xuICAgICAgICAgIGNhbmNlbGxlZExvYWRzKys7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHZlbG9jaXR5IC0gaWYgdG9vIGhpZ2gsIGNhbmNlbCB0aGUgcmVxdWVzdCBlbnRpcmVseVxuICAgICAgICBpZiAoIWNhbkxvYWQoKSkge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBMb2FkIGNhbmNlbGxlZCAtIHZlbG9jaXR5ICR7Y3VycmVudFZlbG9jaXR5LnRvRml4ZWQoXG4gICAgICAgICAgLy8gICAgIDJcbiAgICAgICAgICAvLyAgICl9IGV4Y2VlZHMgdGhyZXNob2xkICR7Y2FuY2VsTG9hZFRocmVzaG9sZH1gXG4gICAgICAgICAgLy8gKTtcbiAgICAgICAgICBjYW5jZWxsZWRMb2FkcysrO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBjYXBhY2l0eVxuICAgICAgICBpZiAoYWN0aXZlTG9hZENvdW50IDwgbWF4Q29uY3VycmVudFJlcXVlc3RzKSB7XG4gICAgICAgICAgLy8gRXhlY3V0ZSBpbW1lZGlhdGVseVxuICAgICAgICAgIGV4ZWN1dGVRdWV1ZWRMb2FkKHtcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgcHJpb3JpdHk6IFwibm9ybWFsXCIsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGVuYWJsZVJlcXVlc3RRdWV1ZSAmJlxuICAgICAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoIDwgbWF4UXVldWVTaXplXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIFF1ZXVlIHRoZSByZXF1ZXN0XG4gICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgcHJpb3JpdHk6IFwibm9ybWFsXCIsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtMb2FkaW5nTWFuYWdlcl0gUXVldWVkIHJlcXVlc3QgKGF0IGNhcGFjaXR5KSwgcXVldWUgc2l6ZTogJHtsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aH1gXG4gICAgICAgICAgLy8gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBRdWV1ZSBvdmVyZmxvdyAtIHJlc29sdmUgdG8gYXZvaWQgZXJyb3JzXG4gICAgICAgICAgaWYgKGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoID49IG1heFF1ZXVlU2l6ZSkge1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGxvYWRSZXF1ZXN0UXVldWUuc3BsaWNlKFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCAtIG1heFF1ZXVlU2l6ZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZW1vdmVkLmZvckVhY2goKHIpID0+IHtcbiAgICAgICAgICAgICAgY2FuY2VsbGVkTG9hZHMrKztcbiAgICAgICAgICAgICAgci5yZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0cnkgYSBmYWlsZWQgcmFuZ2VcbiAgICAgKi9cbiAgICBjb25zdCByZXRyeUZhaWxlZFJhbmdlID0gYXN5bmMgKHJhbmdlSWQ6IG51bWJlcik6IFByb21pc2U8YW55W10+ID0+IHtcbiAgICAgIGZhaWxlZFJhbmdlcy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICBjb25zdCBvZmZzZXQgPSByYW5nZUlkICogcmFuZ2VTaXplO1xuICAgICAgcmV0dXJuIGxvYWRSYW5nZShvZmZzZXQsIHJhbmdlU2l6ZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldCB0b3RhbCBpdGVtcyBjb3VudFxuICAgICAqL1xuICAgIGNvbnN0IHNldFRvdGFsSXRlbXMgPSAodG90YWw6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgdG90YWxJdGVtcyA9IHRvdGFsO1xuXG4gICAgICAvLyBVcGRhdGUgdmlld3BvcnQgc3RhdGUncyB0b3RhbCBpdGVtc1xuICAgICAgY29uc3Qgdmlld3BvcnRTdGF0ZSA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zdGF0ZTtcbiAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyA9IHRvdGFsO1xuICAgICAgfVxuXG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6dG90YWwtaXRlbXMtY2hhbmdlZFwiLCB7IHRvdGFsIH0pO1xuICAgIH07XG5cbiAgICAvLyBIb29rIGludG8gdmlld3BvcnQgaW5pdGlhbGl6YXRpb25cbiAgICBjb25zdCBvcmlnaW5hbEluaXRpYWxpemUgPSBjb21wb25lbnQudmlld3BvcnQuaW5pdGlhbGl6ZTtcbiAgICBjb21wb25lbnQudmlld3BvcnQuaW5pdGlhbGl6ZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG9yaWdpbmFsSW5pdGlhbGl6ZSgpO1xuICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IGluaXRpYWxpemVkXG4gICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCBpbml0aWFsIHRvdGFsIGlmIHByb3ZpZGVkXG4gICAgICBpZiAoY29tcG9uZW50LnRvdGFsSXRlbXMpIHtcbiAgICAgICAgdG90YWxJdGVtcyA9IGNvbXBvbmVudC50b3RhbEl0ZW1zO1xuICAgICAgfVxuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGRyYWcgZXZlbnRzXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OmRyYWctc3RhcnRcIiwgKCkgPT4ge1xuICAgICAgICBpc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICAgIH0pO1xuXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OmRyYWctZW5kXCIsICgpID0+IHtcbiAgICAgICAgaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICAvLyBQcm9jZXNzIGFueSBxdWV1ZWQgcmVxdWVzdHMgYWZ0ZXIgZHJhZyBlbmRzIChzYWZldHkgbWVhc3VyZSlcbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHBsYWNlaG9sZGVycyBhcmUgcmVwbGFjZWQgZXZlbiBpZiBpZGxlIGRldGVjdGlvbiBmYWlsc1xuICAgICAgICBpZiAobG9hZE9uRHJhZ0VuZCkge1xuICAgICAgICAgIHByb2Nlc3NRdWV1ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciByYW5nZSBjaGFuZ2VzXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnJhbmdlLWNoYW5nZWRcIiwgYXN5bmMgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAvLyBEb24ndCBsb2FkIGR1cmluZyBmYXN0IHNjcm9sbGluZyAtIGxvYWRNaXNzaW5nUmFuZ2VzIHdpbGwgaGFuZGxlIHZlbG9jaXR5IGNoZWNrXG5cbiAgICAgICAgLy8gRXh0cmFjdCByYW5nZSBmcm9tIGV2ZW50IGRhdGEgLSB2aXJ0dWFsIGZlYXR1cmUgZW1pdHMgeyByYW5nZTogeyBzdGFydCwgZW5kIH0sIHNjcm9sbFBvc2l0aW9uIH1cbiAgICAgICAgY29uc3QgcmFuZ2UgPSBkYXRhLnJhbmdlIHx8IGRhdGE7XG4gICAgICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gcmFuZ2U7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgcmFuZ2UgYmVmb3JlIGxvYWRpbmdcbiAgICAgICAgaWYgKHR5cGVvZiBzdGFydCAhPT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgZW5kICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgXCJbQ29sbGVjdGlvbl0gSW52YWxpZCByYW5nZSBpbiB2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkIGV2ZW50OlwiLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNraXAgbG9hZGluZyBwYWdlIDEgaWYgd2UgaGF2ZSBhbiBpbml0aWFsU2Nyb2xsSW5kZXggYW5kIGhhdmVuJ3QgY29tcGxldGVkIGluaXRpYWwgbG9hZCB5ZXRcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aGUgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIGluIHZpcnR1YWwudHMgZnJvbSB0cmlnZ2VyaW5nIGEgcGFnZSAxIGxvYWRcbiAgICAgICAgLy8gYWZ0ZXIgd2UndmUgYWxyZWFkeSBzdGFydGVkIGxvYWRpbmcgdGhlIGNvcnJlY3QgaW5pdGlhbCBwYWdlXG4gICAgICAgIGlmIChoYXNJbml0aWFsU2Nyb2xsSW5kZXggJiYgIWhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQpIHtcbiAgICAgICAgICBjb25zdCBwYWdlMUVuZEluZGV4ID0gcmFuZ2VTaXplIC0gMTsgLy8gZS5nLiwgMjkgZm9yIHJhbmdlU2l6ZT0zMFxuICAgICAgICAgIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPD0gcGFnZTFFbmRJbmRleCkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHJlcXVlc3QgZm9yIHBhZ2UgMSwgc2tpcCBpdFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExvYWQgbWlzc2luZyByYW5nZXMgaWYgbmVlZGVkXG4gICAgICAgIGF3YWl0IGxvYWRNaXNzaW5nUmFuZ2VzKHsgc3RhcnQsIGVuZCB9LCBcInZpZXdwb3J0OnJhbmdlLWNoYW5nZWRcIik7XG5cbiAgICAgICAgLy8gRXZpY3QgZGlzdGFudCBpdGVtcyB0byBwcmV2ZW50IG1lbW9yeSBibG9hdFxuICAgICAgICBldmljdERpc3RhbnRJdGVtcyhzdGFydCwgZW5kKTtcblxuICAgICAgICAvLyBGb3IgY3Vyc29yIG1vZGUsIGNoZWNrIGlmIHdlIG5lZWQgdG8gdXBkYXRlIHZpcnR1YWwgc2l6ZVxuICAgICAgICBpZiAoc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIgJiYgIWhhc1JlYWNoZWRFbmQpIHtcbiAgICAgICAgICBjb25zdCBsb2FkZWRJdGVtc0NvdW50ID0gaXRlbXMuZmlsdGVyKFxuICAgICAgICAgICAgKGl0ZW0pID0+IGl0ZW0gIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICApLmxlbmd0aDtcbiAgICAgICAgICBjb25zdCBtYXJnaW5JdGVtcyA9XG4gICAgICAgICAgICByYW5nZVNpemUgKlxuICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlBBR0lOQVRJT04uQ1VSU09SX1NDUk9MTF9NQVJHSU5fTVVMVElQTElFUjtcbiAgICAgICAgICBjb25zdCBtaW5WaXJ0dWFsSXRlbXMgPVxuICAgICAgICAgICAgcmFuZ2VTaXplICpcbiAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QQUdJTkFUSU9OLkNVUlNPUl9NSU5fVklSVFVBTF9TSVpFX01VTFRJUExJRVI7XG4gICAgICAgICAgY29uc3QgZHluYW1pY1RvdGFsID0gTWF0aC5tYXgoXG4gICAgICAgICAgICBsb2FkZWRJdGVtc0NvdW50ICsgbWFyZ2luSXRlbXMsXG4gICAgICAgICAgICBtaW5WaXJ0dWFsSXRlbXMsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChkeW5hbWljVG90YWwgIT09IHRvdGFsSXRlbXMpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFVwZGF0aW5nIGN1cnNvciB2aXJ0dWFsIHNpemUgZnJvbSAke3RvdGFsSXRlbXN9IHRvICR7ZHluYW1pY1RvdGFsfWAsXG4gICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgc2V0VG90YWxJdGVtcyhkeW5hbWljVG90YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgdmVsb2NpdHkgY2hhbmdlc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDp2ZWxvY2l0eS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWZWxvY2l0eSA9IGN1cnJlbnRWZWxvY2l0eTtcbiAgICAgICAgY3VycmVudFZlbG9jaXR5ID0gTWF0aC5hYnMoZGF0YS52ZWxvY2l0eSB8fCAwKTtcblxuICAgICAgICAvLyBXaGVuIHZlbG9jaXR5IGRyb3BzIGJlbG93IHRocmVzaG9sZCwgcHJvY2VzcyBxdWV1ZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgcHJldmlvdXNWZWxvY2l0eSA+IGNhbmNlbExvYWRUaHJlc2hvbGQgJiZcbiAgICAgICAgICBjdXJyZW50VmVsb2NpdHkgPD0gY2FuY2VsTG9hZFRocmVzaG9sZFxuICAgICAgICApIHtcbiAgICAgICAgICBwcm9jZXNzUXVldWUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgaWRsZSBzdGF0ZSB0byBwcm9jZXNzIHF1ZXVlXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OmlkbGVcIiwgYXN5bmMgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKFwiW0NvbGxlY3Rpb25dIElkbGUgZXZlbnQgcmVjZWl2ZWQsIHZlbG9jaXR5PTBcIik7XG4gICAgICAgIGN1cnJlbnRWZWxvY2l0eSA9IDA7XG5cbiAgICAgICAgLy8gUmVzZXQgZHJhZ2dpbmcgc3RhdGUgb24gaWRsZSBzaW5jZSB1c2VyIGhhcyBzdG9wcGVkIG1vdmluZ1xuICAgICAgICBpZiAoaXNEcmFnZ2luZykge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiW0NvbGxlY3Rpb25dIFJlc2V0dGluZyBkcmFnIHN0YXRlIG9uIGlkbGVcIik7XG4gICAgICAgICAgaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGN1cnJlbnQgdmlzaWJsZSByYW5nZSBmcm9tIHZpZXdwb3J0XG4gICAgICAgIGNvbnN0IHZpZXdwb3J0U3RhdGUgPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU7XG4gICAgICAgIGNvbnN0IHZpc2libGVSYW5nZSA9IHZpZXdwb3J0U3RhdGU/LnZpc2libGVSYW5nZTtcblxuICAgICAgICBpZiAodmlzaWJsZVJhbmdlKSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIExvYWRpbmcgdmlzaWJsZSByYW5nZSBvbiBpZGxlOiAke3Zpc2libGVSYW5nZS5zdGFydH0tJHt2aXNpYmxlUmFuZ2UuZW5kfWBcbiAgICAgICAgICAvLyApO1xuXG4gICAgICAgICAgLy8gQ2xlYXIgc3RhbGUgcmVxdWVzdHMgZnJvbSBxdWV1ZSB0aGF0IGFyZSBmYXIgZnJvbSBjdXJyZW50IHZpc2libGUgcmFuZ2VcbiAgICAgICAgICBjb25zdCBidWZmZXIgPSByYW5nZVNpemUgKiAyOyAvLyBBbGxvdyBzb21lIGJ1ZmZlclxuICAgICAgICAgIGxvYWRSZXF1ZXN0UXVldWUgPSBsb2FkUmVxdWVzdFF1ZXVlLmZpbHRlcigocmVxdWVzdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdEVuZCA9IHJlcXVlc3QucmFuZ2UuZW5kO1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdFN0YXJ0ID0gcmVxdWVzdC5yYW5nZS5zdGFydDtcbiAgICAgICAgICAgIGNvbnN0IGlzUmVsZXZhbnQgPVxuICAgICAgICAgICAgICByZXF1ZXN0RW5kID49IHZpc2libGVSYW5nZS5zdGFydCAtIGJ1ZmZlciAmJlxuICAgICAgICAgICAgICByZXF1ZXN0U3RhcnQgPD0gdmlzaWJsZVJhbmdlLmVuZCArIGJ1ZmZlcjtcblxuICAgICAgICAgICAgaWYgKCFpc1JlbGV2YW50KSB7XG4gICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gUmVtb3Zpbmcgc3RhbGUgcXVldWVkIHJlcXVlc3Q6ICR7cmVxdWVzdFN0YXJ0fS0ke3JlcXVlc3RFbmR9YCxcbiAgICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgICAgcmVxdWVzdC5yZXNvbHZlKCk7IC8vIFJlc29sdmUgdG8gYXZvaWQgaGFuZ2luZyBwcm9taXNlc1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGlzUmVsZXZhbnQ7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBMb2FkIHRoZSBjdXJyZW50IHZpc2libGUgcmFuZ2UgaWYgbmVlZGVkXG4gICAgICAgICAgYXdhaXQgbG9hZE1pc3NpbmdSYW5nZXModmlzaWJsZVJhbmdlLCBcInZpZXdwb3J0OmlkbGVcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbHNvIHByb2Nlc3MgYW55IHF1ZXVlZCByZXF1ZXN0c1xuICAgICAgICBwcm9jZXNzUXVldWUoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGl0ZW0gcmVtb3ZhbCAtIERPTidUIGNsZWFyIGxvYWRlZFJhbmdlcyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlbG9hZFxuICAgICAgLy8gVGhlIGRhdGEgaXMgYWxyZWFkeSBzaGlmdGVkIGxvY2FsbHkgaW4gYXBpLnRzIGFuZCByZW5kZXJpbmcudHNcbiAgICAgIC8vIFJlbG9hZGluZyB3b3VsZCBjYXVzZSByYWNlIGNvbmRpdGlvbnMgYW5kIG92ZXJ3cml0ZSB0aGUgY29ycmVjdCB0b3RhbEl0ZW1zXG4gICAgICBjb21wb25lbnQub24/LihcIml0ZW06cmVtb3ZlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBbQ29sbGVjdGlvbl0gaXRlbTpyZW1vdmVkIGV2ZW50IC0gaW5kZXg6ICR7ZGF0YS5pbmRleH1gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtDb2xsZWN0aW9uXSBpdGVtcy5sZW5ndGg6ICR7aXRlbXMubGVuZ3RofWApO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBkaXNjb3ZlcmVkVG90YWwgdG8gbWF0Y2ggdGhlIG5ldyBjb3VudFxuICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHN0YWxlIGRpc2NvdmVyZWRUb3RhbCBmcm9tIGJlaW5nIHVzZWQgb24gbmV4dCBsb2FkXG4gICAgICAgIGlmIChkaXNjb3ZlcmVkVG90YWwgIT09IG51bGwgJiYgZGlzY292ZXJlZFRvdGFsID4gMCkge1xuICAgICAgICAgIGRpc2NvdmVyZWRUb3RhbCA9IGRpc2NvdmVyZWRUb3RhbCAtIDE7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFVwZGF0ZWQgZGlzY292ZXJlZFRvdGFsIHRvOiAke2Rpc2NvdmVyZWRUb3RhbH1gLFxuICAgICAgICAgIC8vICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOT1RFOiBEbyBOT1QgZGVjcmVtZW50IHRvdGFsSXRlbXMgaGVyZSFcbiAgICAgICAgLy8gYXBpLnRzIGFscmVhZHkgY2FsbHMgc2V0VG90YWxJdGVtcygpIGFmdGVyIGVtaXR0aW5nIGl0ZW06cmVtb3ZlLXJlcXVlc3QsXG4gICAgICAgIC8vIHdoaWNoIHByb3Blcmx5IHVwZGF0ZXMgdG90YWxJdGVtcy4gRGVjcmVtZW50aW5nIGhlcmUgd291bGQgY2F1c2UgYSBkb3VibGUtZGVjcmVtZW50LlxuXG4gICAgICAgIC8vIERPTidUIGNsZWFyIGxvYWRlZFJhbmdlcyAtIHdlIHdhbnQgdG8ga2VlcCB1c2luZyB0aGUgbG9jYWwgZGF0YVxuICAgICAgICAvLyBUaGUgZGF0YSBoYXMgYmVlbiBzaGlmdGVkIGxvY2FsbHkgYW5kIGlzIHN0aWxsIHZhbGlkXG4gICAgICAgIC8vIENsZWFyaW5nIHdvdWxkIHRyaWdnZXIgYSByZWxvYWQgd2hpY2ggY2F1c2VzIHJhY2UgY29uZGl0aW9uc1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIEtlZXBpbmcgbG9hZGVkUmFuZ2VzIGludGFjdDpgLFxuICAgICAgICAvLyAgIEFycmF5LmZyb20obG9hZGVkUmFuZ2VzKSxcbiAgICAgICAgLy8gKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBMb2FkIGluaXRpYWwgZGF0YSBpZiBjb2xsZWN0aW9uIGlzIGF2YWlsYWJsZSBhbmQgYXV0b0xvYWQgaXMgZW5hYmxlZFxuICAgICAgaWYgKGNvbGxlY3Rpb24gJiYgYXV0b0xvYWQpIHtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBpbml0aWFsIHNjcm9sbCBpbmRleCBPUiBhIHNlbGVjdElkLCBsb2FkIGRhdGEgZm9yIHRoYXQgcG9zaXRpb24gZGlyZWN0bHlcbiAgICAgICAgLy8gRG9uJ3QgdXNlIHNjcm9sbFRvSW5kZXgoKSBhcyBpdCB0cmlnZ2VycyBhbmltYXRpb24vdmVsb2NpdHkgdHJhY2tpbmdcbiAgICAgICAgLy8gdmlydHVhbC50cyBoYXMgYWxyZWFkeSBzZXQgdGhlIHNjcm9sbCBwb3NpdGlvbiBhbmQgY2FsY3VsYXRlZCB0aGUgdmlzaWJsZSByYW5nZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4ID4gMCB8fFxuICAgICAgICAgIChzZWxlY3RJZCAhPT0gdW5kZWZpbmVkICYmIHNlbGVjdElkICE9PSBudWxsKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBHZXQgdGhlIHZpc2libGUgcmFuZ2UgdGhhdCB3YXMgYWxyZWFkeSBjYWxjdWxhdGVkIGJ5IHZpcnR1YWwudHNcbiAgICAgICAgICAvLyBXZSBtaXNzZWQgdGhlIGluaXRpYWwgdmlld3BvcnQ6cmFuZ2UtY2hhbmdlZCBldmVudCBiZWNhdXNlIG91ciBsaXN0ZW5lciB3YXNuJ3QgcmVhZHkgeWV0XG4gICAgICAgICAgY29uc3QgdmlzaWJsZVJhbmdlID0gY29tcG9uZW50LnZpZXdwb3J0Py5nZXRWaXNpYmxlUmFuZ2U/LigpO1xuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdmlzaWJsZVJhbmdlICYmXG4gICAgICAgICAgICAodmlzaWJsZVJhbmdlLnN0YXJ0ID4gMCB8fCB2aXNpYmxlUmFuZ2UuZW5kID4gMClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIFVzZSB0aGUgcHJlLWNhbGN1bGF0ZWQgdmlzaWJsZSByYW5nZSBmcm9tIHZpcnR1YWwudHNcbiAgICAgICAgICAgIGxvYWRNaXNzaW5nUmFuZ2VzKHZpc2libGVSYW5nZSwgXCJpbml0aWFsLXBvc2l0aW9uXCIpXG4gICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBoYXNDb21wbGV0ZWRJbml0aWFsUG9zaXRpb25Mb2FkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAvLyBFbWl0IGV2ZW50IHRvIHNlbGVjdCBpdGVtIGFmdGVyIGluaXRpYWwgbG9hZCBpZiBzZWxlY3RJZCBpcyBwcm92aWRlZFxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY29sbGVjdGlvbjppbml0aWFsLWxvYWQtY29tcGxldGVcIiwge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RJZCxcbiAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4LFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgIFwiW0NvbGxlY3Rpb25dIEZhaWxlZCB0byBsb2FkIGluaXRpYWwgcG9zaXRpb24gZGF0YTpcIixcbiAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IHRydWU7IC8vIEFsbG93IG5vcm1hbCBsb2FkaW5nIGV2ZW4gb24gZXJyb3JcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZhbGxiYWNrOiBjYWxjdWxhdGUgcmFuZ2UgZnJvbSBpbml0aWFsU2Nyb2xsSW5kZXhcbiAgICAgICAgICAgIC8vIFRoaXMgaGFuZGxlcyBlZGdlIGNhc2VzIHdoZXJlIHZpc2libGVSYW5nZSB3YXNuJ3QgcmVhZHlcbiAgICAgICAgICAgIGNvbnN0IG92ZXJzY2FuID0gMjtcbiAgICAgICAgICAgIGNvbnN0IGVzdGltYXRlZFZpc2libGVDb3VudCA9IE1hdGguY2VpbCg2MDAgLyA1MCk7IC8vIH4xMiBpdGVtc1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heCgwLCBpbml0aWFsU2Nyb2xsSW5kZXggLSBvdmVyc2Nhbik7XG4gICAgICAgICAgICBjb25zdCBlbmQgPSBpbml0aWFsU2Nyb2xsSW5kZXggKyBlc3RpbWF0ZWRWaXNpYmxlQ291bnQgKyBvdmVyc2NhbjtcblxuICAgICAgICAgICAgbG9hZE1pc3NpbmdSYW5nZXMoeyBzdGFydCwgZW5kIH0sIFwiaW5pdGlhbC1wb3NpdGlvbi1mYWxsYmFja1wiKVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgLy8gRW1pdCBldmVudCB0byBzZWxlY3QgaXRlbSBhZnRlciBpbml0aWFsIGxvYWQgaWYgc2VsZWN0SWQgaXMgcHJvdmlkZWRcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImNvbGxlY3Rpb246aW5pdGlhbC1sb2FkLWNvbXBsZXRlXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0SWQsXG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxTY3JvbGxJbmRleCxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICBcIltDb2xsZWN0aW9uXSBGYWlsZWQgdG8gbG9hZCBpbml0aWFsIHBvc2l0aW9uIGRhdGEgKGZhbGxiYWNrKTpcIixcbiAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IHRydWU7IC8vIEFsbG93IG5vcm1hbCBsb2FkaW5nIGV2ZW4gb24gZXJyb3JcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vIGluaXRpYWwgc2Nyb2xsIGluZGV4IC0gbG9hZCBmcm9tIGJlZ2lubmluZyBhcyBub3JtYWxcbiAgICAgICAgbG9hZFJhbmdlKDAsIHJhbmdlU2l6ZSlcbiAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgYXV0b1NlbGVjdEZpcnN0IC0gZ2V0IGZpcnN0IGl0ZW0gSUQgYW5kIGVtaXQgc2VsZWN0aW9uIGV2ZW50XG4gICAgICAgICAgICBpZiAoYXV0b1NlbGVjdEZpcnN0ICYmIGl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgZmlyc3RJdGVtID0gaXRlbXNbMF07XG4gICAgICAgICAgICAgIGNvbnN0IGZpcnN0SWQgPSBmaXJzdEl0ZW0/Ll9pZCB8fCBmaXJzdEl0ZW0/LmlkO1xuICAgICAgICAgICAgICBpZiAoZmlyc3RJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImNvbGxlY3Rpb246aW5pdGlhbC1sb2FkLWNvbXBsZXRlXCIsIHtcbiAgICAgICAgICAgICAgICAgIHNlbGVjdElkOiBmaXJzdElkLFxuICAgICAgICAgICAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4OiAwLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiW0NvbGxlY3Rpb25dIEZhaWxlZCB0byBsb2FkIGluaXRpYWwgZGF0YTpcIiwgZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICAvLyBBZGQgY29sbGVjdGlvbiBBUEkgdG8gdmlld3BvcnRcbiAgICBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbiA9IHtcbiAgICAgIGxvYWRSYW5nZTogKG9mZnNldDogbnVtYmVyLCBsaW1pdDogbnVtYmVyKSA9PiBsb2FkUmFuZ2Uob2Zmc2V0LCBsaW1pdCksXG4gICAgICBsb2FkTWlzc2luZ1JhbmdlczogKFxuICAgICAgICByYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9LFxuICAgICAgICBjYWxsZXI/OiBzdHJpbmcsXG4gICAgICApID0+IGxvYWRNaXNzaW5nUmFuZ2VzKHJhbmdlLCBjYWxsZXIgfHwgXCJ2aWV3cG9ydC5jb2xsZWN0aW9uXCIpLFxuICAgICAgZ2V0TG9hZGVkUmFuZ2VzOiAoKSA9PiBsb2FkZWRSYW5nZXMsXG4gICAgICBnZXRQZW5kaW5nUmFuZ2VzOiAoKSA9PiBwZW5kaW5nUmFuZ2VzLFxuICAgICAgY2xlYXJGYWlsZWRSYW5nZXM6ICgpID0+IGZhaWxlZFJhbmdlcy5jbGVhcigpLFxuICAgICAgcmV0cnlGYWlsZWRSYW5nZSxcbiAgICAgIHNldFRvdGFsSXRlbXMsXG4gICAgICBnZXRUb3RhbEl0ZW1zOiAoKSA9PiB0b3RhbEl0ZW1zLFxuICAgICAgLy8gQ3Vyc29yLXNwZWNpZmljIG1ldGhvZHNcbiAgICAgIGdldEN1cnJlbnRDdXJzb3I6ICgpID0+IGN1cnJlbnRDdXJzb3IsXG4gICAgICBnZXRDdXJzb3JGb3JQYWdlOiAocGFnZTogbnVtYmVyKSA9PiBjdXJzb3JNYXAuZ2V0KHBhZ2UpIHx8IG51bGwsXG4gICAgfTtcblxuICAgIC8vIEFkZCBjb2xsZWN0aW9uIGRhdGEgYWNjZXNzIHdpdGggZGlyZWN0IGFzc2lnbm1lbnRcbiAgICAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbiA9IHtcbiAgICAgIGl0ZW1zLFxuICAgICAgZ2V0SXRlbXM6ICgpID0+IGl0ZW1zLFxuICAgICAgZ2V0SXRlbTogKGluZGV4OiBudW1iZXIpID0+IGl0ZW1zW2luZGV4XSxcbiAgICAgIGxvYWRSYW5nZSxcbiAgICAgIGxvYWRNaXNzaW5nUmFuZ2VzOiAoXG4gICAgICAgIHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0sXG4gICAgICAgIGNhbGxlcj86IHN0cmluZyxcbiAgICAgICkgPT4gbG9hZE1pc3NpbmdSYW5nZXMocmFuZ2UsIGNhbGxlciB8fCBcImNvbXBvbmVudC5jb2xsZWN0aW9uXCIpLFxuICAgICAgZ2V0TG9hZGluZ1N0YXRzOiAoKSA9PiAoe1xuICAgICAgICBwZW5kaW5nUmVxdWVzdHM6IGFjdGl2ZUxvYWRDb3VudCxcbiAgICAgICAgY29tcGxldGVkUmVxdWVzdHM6IGNvbXBsZXRlZExvYWRzLFxuICAgICAgICBmYWlsZWRSZXF1ZXN0czogZmFpbGVkTG9hZHMsXG4gICAgICAgIGNhbmNlbGxlZFJlcXVlc3RzOiBjYW5jZWxsZWRMb2FkcyxcbiAgICAgICAgY3VycmVudFZlbG9jaXR5LFxuICAgICAgICBjYW5Mb2FkOiBjYW5Mb2FkKCksXG4gICAgICAgIHF1ZXVlZFJlcXVlc3RzOiBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCxcbiAgICAgIH0pLFxuICAgICAgLy8gVG90YWwgaXRlbXMgbWFuYWdlbWVudFxuICAgICAgZ2V0VG90YWxJdGVtczogKCkgPT4gdG90YWxJdGVtcyxcbiAgICAgIHNldFRvdGFsSXRlbXMsXG4gICAgICAvLyBDdXJzb3IgbWV0aG9kc1xuICAgICAgZ2V0Q3VycmVudEN1cnNvcjogKCkgPT4gY3VycmVudEN1cnNvcixcbiAgICAgIGdldEN1cnNvckZvclBhZ2U6IChwYWdlOiBudW1iZXIpID0+IGN1cnNvck1hcC5nZXQocGFnZSkgfHwgbnVsbCxcbiAgICB9O1xuXG4gICAgLy8gQWxzbyBlbnN1cmUgY29tcG9uZW50Lml0ZW1zIGlzIHVwZGF0ZWRcbiAgICBjb21wb25lbnQuaXRlbXMgPSBpdGVtcztcblxuICAgIC8vIENsZWFudXAgZnVuY3Rpb24gLSBjb21wcmVoZW5zaXZlIG1lbW9yeSBjbGVhbnVwXG4gICAgY29uc3QgZGVzdHJveSA9ICgpID0+IHtcbiAgICAgIGxvZ01lbW9yeVN0YXRzKFwiZGVzdHJveTpiZWZvcmVcIik7XG5cbiAgICAgIC8vIEFib3J0IGFsbCBpbi1mbGlnaHQgcmVxdWVzdHNcbiAgICAgIGFib3J0Q29udHJvbGxlcnMuZm9yRWFjaCgoY29udHJvbGxlcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIElnbm9yZSBhYm9ydCBlcnJvcnNcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBhYm9ydENvbnRyb2xsZXJzLmNsZWFyKCk7XG5cbiAgICAgIC8vIENsZWFyIGFsbCBkYXRhIHN0cnVjdHVyZXNcbiAgICAgIGl0ZW1zLmxlbmd0aCA9IDA7XG4gICAgICBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgICBsb2FkZWRSYW5nZXMuY2xlYXIoKTtcbiAgICAgIHBlbmRpbmdSYW5nZXMuY2xlYXIoKTtcbiAgICAgIGZhaWxlZFJhbmdlcy5jbGVhcigpO1xuICAgICAgYWN0aXZlTG9hZFJhbmdlcy5jbGVhcigpO1xuICAgICAgYWN0aXZlUmVxdWVzdHMuY2xlYXIoKTtcbiAgICAgIGN1cnNvck1hcC5jbGVhcigpO1xuICAgICAgcGFnZVRvT2Zmc2V0TWFwLmNsZWFyKCk7XG5cbiAgICAgIC8vIFJlc2V0IHN0YXRlXG4gICAgICB0b3RhbEl0ZW1zID0gMDtcbiAgICAgIGN1cnJlbnRDdXJzb3IgPSBudWxsO1xuICAgICAgaGlnaGVzdExvYWRlZFBhZ2UgPSAwO1xuICAgICAgZGlzY292ZXJlZFRvdGFsID0gbnVsbDtcbiAgICAgIGhhc1JlYWNoZWRFbmQgPSBmYWxzZTtcblxuICAgICAgLy8gQ2xlYXIgY29tcG9uZW50IHJlZmVyZW5jZVxuICAgICAgaWYgKGNvbXBvbmVudC5pdGVtcyA9PT0gaXRlbXMpIHtcbiAgICAgICAgY29tcG9uZW50Lml0ZW1zID0gW107XG4gICAgICB9XG5cbiAgICAgIGxvZ01lbW9yeVN0YXRzKFwiZGVzdHJveTphZnRlclwiKTtcbiAgICB9O1xuXG4gICAgLy8gV2lyZSBkZXN0cm95IGludG8gdGhlIGNvbXBvbmVudCdzIGRlc3Ryb3kgY2hhaW5cbiAgICB3cmFwRGVzdHJveShjb21wb25lbnQsIGRlc3Ryb3kpO1xuXG4gICAgLy8gUmV0dXJuIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBjb2xsZWN0aW9uOiB7XG4gICAgICAgIC8vIERhdGEgYWNjZXNzIG1ldGhvZHNcbiAgICAgICAgaXRlbXMsXG4gICAgICAgIGdldEl0ZW1zOiAoKSA9PiBpdGVtcyxcbiAgICAgICAgZ2V0SXRlbTogKGluZGV4OiBudW1iZXIpID0+IGl0ZW1zW2luZGV4XSxcbiAgICAgICAgLy8gTG9hZGluZyBtZXRob2RzXG4gICAgICAgIGxvYWRSYW5nZSxcbiAgICAgICAgbG9hZE1pc3NpbmdSYW5nZXM6IChcbiAgICAgICAgICByYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9LFxuICAgICAgICAgIGNhbGxlcj86IHN0cmluZyxcbiAgICAgICAgKSA9PiBsb2FkTWlzc2luZ1JhbmdlcyhyYW5nZSwgY2FsbGVyIHx8IFwicmV0dXJuLmNvbGxlY3Rpb25cIiksXG4gICAgICAgIGdldExvYWRlZFJhbmdlczogKCkgPT4gbG9hZGVkUmFuZ2VzLFxuICAgICAgICBnZXRQZW5kaW5nUmFuZ2VzOiAoKSA9PiBwZW5kaW5nUmFuZ2VzLFxuICAgICAgICBjbGVhckZhaWxlZFJhbmdlczogKCkgPT4gZmFpbGVkUmFuZ2VzLmNsZWFyKCksXG4gICAgICAgIHJldHJ5RmFpbGVkUmFuZ2UsXG4gICAgICAgIHNldFRvdGFsSXRlbXMsXG4gICAgICAgIGdldFRvdGFsSXRlbXM6ICgpID0+IHRvdGFsSXRlbXMsXG4gICAgICAgIC8vIEN1cnNvci1zcGVjaWZpYyBtZXRob2RzXG4gICAgICAgIGdldEN1cnJlbnRDdXJzb3I6ICgpID0+IGN1cnJlbnRDdXJzb3IsXG4gICAgICAgIGdldEN1cnNvckZvclBhZ2U6IChwYWdlOiBudW1iZXIpID0+IGN1cnNvck1hcC5nZXQocGFnZSkgfHwgbnVsbCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbn1cbiIsCiAgICAiLy8gc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvcGxhY2Vob2xkZXJzLnRzXG5cbi8qKlxuICogUGxhY2Vob2xkZXIgRmVhdHVyZSAtIFNtYXJ0IHBsYWNlaG9sZGVyIGdlbmVyYXRpb25cbiAqIEFuYWx5emVzIGZpcnN0IGxvYWRlZCBkYXRhIHRvIGdlbmVyYXRlIHJlYWxpc3RpYyBtYXNrZWQgcGxhY2Vob2xkZXJzXG4gKiBTaG93cyBwbGFjZWhvbGRlcnMgd2hpbGUgZGF0YSBpcyBsb2FkaW5nXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgQ29sbGVjdGlvbkNvbXBvbmVudCB9IGZyb20gXCIuL2NvbGxlY3Rpb25cIjtcbmltcG9ydCB7IFZJRVdQT1JUX0NPTlNUQU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBwbGFjZWhvbGRlciBmZWF0dXJlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGxhY2Vob2xkZXJDb25maWcge1xuICBlbmFibGVkPzogYm9vbGVhbjtcbiAgYW5hbHl6ZUZpcnN0TG9hZD86IGJvb2xlYW47XG4gIG1hc2tDaGFyYWN0ZXI/OiBzdHJpbmc7XG4gIHJhbmRvbUxlbmd0aFZhcmlhbmNlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBGaWVsZCBzdHJ1Y3R1cmUgZm9yIHBsYWNlaG9sZGVyIGdlbmVyYXRpb25cbiAqL1xuaW50ZXJmYWNlIEZpZWxkU3RydWN0dXJlIHtcbiAgbWluTGVuZ3RoOiBudW1iZXI7XG4gIG1heExlbmd0aDogbnVtYmVyO1xuICBhdmdMZW5ndGg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGFjZWhvbGRlckNvbXBvbmVudCB7XG4gIHBsYWNlaG9sZGVyczoge1xuICAgIGFuYWx5emVEYXRhU3RydWN0dXJlOiAoaXRlbXM6IGFueVtdKSA9PiB2b2lkO1xuICAgIGhhc0FuYWx5emVkU3RydWN0dXJlOiAoKSA9PiBib29sZWFuO1xuICAgIGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtOiAoaW5kZXg6IG51bWJlcikgPT4gYW55O1xuICAgIGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtczogKHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pID0+IGFueVtdO1xuICAgIHNob3dQbGFjZWhvbGRlcnM6IChyYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9KSA9PiB2b2lkO1xuICAgIGlzUGxhY2Vob2xkZXI6IChpdGVtOiBhbnkpID0+IGJvb2xlYW47XG4gICAgcmVwbGFjZVBsYWNlaG9sZGVyczogKGl0ZW1zOiBhbnlbXSwgb2Zmc2V0OiBudW1iZXIpID0+IHZvaWQ7XG4gICAgY2xlYXI6ICgpID0+IHZvaWQ7XG4gIH07XG59XG5cbi8qKlxuICogQWRkcyBwbGFjZWhvbGRlciBmdW5jdGlvbmFsaXR5IHRvIHZpZXdwb3J0IGNvbXBvbmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFBsYWNlaG9sZGVycyhjb25maWc6IFBsYWNlaG9sZGVyQ29uZmlnID0ge30pIHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgQ29sbGVjdGlvbkNvbXBvbmVudD4oXG4gICAgY29tcG9uZW50OiBUXG4gICk6IFQgJiBQbGFjZWhvbGRlckNvbXBvbmVudCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgZW5hYmxlZCA9IHRydWUsXG4gICAgICBhbmFseXplRmlyc3RMb2FkID0gdHJ1ZSxcbiAgICAgIG1hc2tDaGFyYWN0ZXIgPSBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuTUFTS19DSEFSQUNURVIsXG4gICAgICByYW5kb21MZW5ndGhWYXJpYW5jZSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUlxuICAgICAgICAuUkFORE9NX0xFTkdUSF9WQVJJQU5DRSxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gU3RhdGVcbiAgICBsZXQgZmllbGRTdHJ1Y3R1cmVzOiBNYXA8c3RyaW5nLCBGaWVsZFN0cnVjdHVyZT4gfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaGFzQW5hbHl6ZWQgPSBmYWxzZTtcbiAgICBsZXQgcGxhY2Vob2xkZXJJZENvdW50ZXIgPSAwO1xuXG4gICAgLyoqXG4gICAgICogQW5hbHl6ZSBkYXRhIHN0cnVjdHVyZSBmcm9tIGZpcnN0IGxvYWRlZCBpdGVtc1xuICAgICAqL1xuICAgIGNvbnN0IGFuYWx5emVEYXRhU3RydWN0dXJlID0gKGl0ZW1zOiBhbnlbXSk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFlbmFibGVkIHx8IGhhc0FuYWx5emVkIHx8ICFpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYPCflI0gW1BMQUNFSE9MREVSU10gQW5hbHl6aW5nIGRhdGEgc3RydWN0dXJlIGZyb20gJHtpdGVtcy5sZW5ndGh9IGl0ZW1zYFxuICAgICAgLy8gKTtcblxuICAgICAgY29uc3Qgc3RydWN0dXJlcyA9IG5ldyBNYXA8c3RyaW5nLCBGaWVsZFN0cnVjdHVyZT4oKTtcbiAgICAgIGNvbnN0IHNhbXBsZVNpemUgPSBNYXRoLm1pbihcbiAgICAgICAgaXRlbXMubGVuZ3RoLFxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuTUFYX1NBTVBMRV9TSVpFXG4gICAgICApO1xuXG4gICAgICAvLyBBbmFseXplIGVhY2ggZmllbGQgYWNyb3NzIGFsbCBzYW1wbGUgaXRlbXNcbiAgICAgIGNvbnN0IGZpZWxkU3RhdHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyW10+KCk7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2FtcGxlU2l6ZTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgICAgaWYgKCFpdGVtIHx8IHR5cGVvZiBpdGVtICE9PSBcIm9iamVjdFwiKSBjb250aW51ZTtcblxuICAgICAgICBPYmplY3Qua2V5cyhpdGVtKS5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgIC8vIFNraXAgaW50ZXJuYWwgZmllbGRzXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZmllbGQuc3RhcnRzV2l0aChcIl9cIikgfHxcbiAgICAgICAgICAgIGZpZWxkID09PSBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuUExBQ0VIT0xERVJfRkxBR1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gU3RyaW5nKGl0ZW1bZmllbGRdIHx8IFwiXCIpO1xuICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcblxuICAgICAgICAgIGlmICghZmllbGRTdGF0cy5oYXMoZmllbGQpKSB7XG4gICAgICAgICAgICBmaWVsZFN0YXRzLnNldChmaWVsZCwgW10pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmaWVsZFN0YXRzLmdldChmaWVsZCkhLnB1c2gobGVuZ3RoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBzdGF0aXN0aWNzIGZvciBlYWNoIGZpZWxkXG4gICAgICBmaWVsZFN0YXRzLmZvckVhY2goKGxlbmd0aHMsIGZpZWxkKSA9PiB7XG4gICAgICAgIGlmIChsZW5ndGhzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IG1pbkxlbmd0aCA9IE1hdGgubWluKC4uLmxlbmd0aHMpO1xuICAgICAgICBjb25zdCBtYXhMZW5ndGggPSBNYXRoLm1heCguLi5sZW5ndGhzKTtcbiAgICAgICAgY29uc3QgYXZnTGVuZ3RoID0gTWF0aC5yb3VuZChcbiAgICAgICAgICBsZW5ndGhzLnJlZHVjZSgoc3VtLCBsZW4pID0+IHN1bSArIGxlbiwgMCkgLyBsZW5ndGhzLmxlbmd0aFxuICAgICAgICApO1xuXG4gICAgICAgIHN0cnVjdHVyZXMuc2V0KGZpZWxkLCB7XG4gICAgICAgICAgbWluTGVuZ3RoLFxuICAgICAgICAgIG1heExlbmd0aCxcbiAgICAgICAgICBhdmdMZW5ndGgsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGZpZWxkU3RydWN0dXJlcyA9IHN0cnVjdHVyZXM7XG4gICAgICBoYXNBbmFseXplZCA9IHRydWU7XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBg4pyFIFtQTEFDRUhPTERFUlNdIFN0cnVjdHVyZSBhbmFseXplZDpgLFxuICAgICAgLy8gICBPYmplY3QuZnJvbUVudHJpZXMoc3RydWN0dXJlcylcbiAgICAgIC8vICk7XG5cbiAgICAgIC8vIEVtaXQgZXZlbnRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpwbGFjZWhvbGRlcnMtc3RydWN0dXJlLWFuYWx5emVkXCIsIHtcbiAgICAgICAgc3RydWN0dXJlOiBPYmplY3QuZnJvbUVudHJpZXMoc3RydWN0dXJlcyksXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgYSBzaW5nbGUgcGxhY2Vob2xkZXIgaXRlbVxuICAgICAqL1xuICAgIGNvbnN0IGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtID0gKGluZGV4OiBudW1iZXIpOiBhbnkgPT4ge1xuICAgICAgY29uc3QgcGxhY2Vob2xkZXI6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICAgIGlkOiBgcGxhY2Vob2xkZXItJHtwbGFjZWhvbGRlcklkQ291bnRlcisrfWAsXG4gICAgICAgIFtWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuUExBQ0VIT0xERVJfRkxBR106IHRydWUsXG4gICAgICAgIF9pbmRleDogaW5kZXgsXG4gICAgICB9O1xuXG4gICAgICBpZiAoIWZpZWxkU3RydWN0dXJlcyB8fCBmaWVsZFN0cnVjdHVyZXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAvLyBObyBzdHJ1Y3R1cmUgYW5hbHl6ZWQgeWV0IC0gcmV0dXJuIGJhc2ljIHBsYWNlaG9sZGVyXG4gICAgICAgIHBsYWNlaG9sZGVyLmxhYmVsID0gbWFza0NoYXJhY3Rlci5yZXBlYXQoMTApO1xuICAgICAgICByZXR1cm4gcGxhY2Vob2xkZXI7XG4gICAgICB9XG5cbiAgICAgIC8vIEdlbmVyYXRlIGZpZWxkcyBiYXNlZCBvbiBhbmFseXplZCBzdHJ1Y3R1cmVcbiAgICAgIGZpZWxkU3RydWN0dXJlcy5mb3JFYWNoKChzdHJ1Y3R1cmUsIGZpZWxkKSA9PiB7XG4gICAgICAgIGxldCBsZW5ndGg6IG51bWJlcjtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgcmFuZG9tTGVuZ3RoVmFyaWFuY2UgJiZcbiAgICAgICAgICBzdHJ1Y3R1cmUubWluTGVuZ3RoICE9PSBzdHJ1Y3R1cmUubWF4TGVuZ3RoXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIFJhbmRvbSBsZW5ndGggd2l0aGluIHJhbmdlXG4gICAgICAgICAgbGVuZ3RoID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgIE1hdGgucmFuZG9tKCkgKiAoc3RydWN0dXJlLm1heExlbmd0aCAtIHN0cnVjdHVyZS5taW5MZW5ndGggKyAxKSArXG4gICAgICAgICAgICAgIHN0cnVjdHVyZS5taW5MZW5ndGhcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFVzZSBhdmVyYWdlIGxlbmd0aFxuICAgICAgICAgIGxlbmd0aCA9IHN0cnVjdHVyZS5hdmdMZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBzb21lIHZhcmlhdGlvbiB0byBtYWtlIGl0IGxvb2sgbW9yZSBuYXR1cmFsXG4gICAgICAgIGlmIChyYW5kb21MZW5ndGhWYXJpYW5jZSAmJiBNYXRoLnJhbmRvbSgpIDwgMC4zKSB7XG4gICAgICAgICAgbGVuZ3RoID0gTWF0aC5tYXgoMSwgbGVuZ3RoICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMykgLSAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBsYWNlaG9sZGVyW2ZpZWxkXSA9IG1hc2tDaGFyYWN0ZXIucmVwZWF0KGxlbmd0aCk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHBsYWNlaG9sZGVyO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBtdWx0aXBsZSBwbGFjZWhvbGRlciBpdGVtc1xuICAgICAqL1xuICAgIGNvbnN0IGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtcyA9IChyYW5nZToge1xuICAgICAgc3RhcnQ6IG51bWJlcjtcbiAgICAgIGVuZDogbnVtYmVyO1xuICAgIH0pOiBhbnlbXSA9PiB7XG4gICAgICBjb25zdCBpdGVtczogYW55W10gPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSByYW5nZS5zdGFydDsgaSA8PSByYW5nZS5lbmQ7IGkrKykge1xuICAgICAgICBpdGVtcy5wdXNoKGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtKGkpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVtcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2hvdyBwbGFjZWhvbGRlcnMgZm9yIGEgcmFuZ2VcbiAgICAgKi9cbiAgICBjb25zdCBzaG93UGxhY2Vob2xkZXJzID0gKHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pOiB2b2lkID0+IHtcbiAgICAgIGlmICghZW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBwbGFjZWhvbGRlcnMgPSBnZW5lcmF0ZVBsYWNlaG9sZGVySXRlbXMocmFuZ2UpO1xuXG4gICAgICAvLyBVcGRhdGUgaXRlbXMgYXJyYXlcbiAgICAgIGlmIChjb21wb25lbnQuaXRlbXMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbGFjZWhvbGRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHJhbmdlLnN0YXJ0ICsgaTtcbiAgICAgICAgICBpZiAoIWNvbXBvbmVudC5pdGVtc1tpbmRleF0pIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5pdGVtc1tpbmRleF0gPSBwbGFjZWhvbGRlcnNbaV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBg8J+UhCBbUExBQ0VIT0xERVJTXSBTaG93aW5nICR7cGxhY2Vob2xkZXJzLmxlbmd0aH0gcGxhY2Vob2xkZXJzIGZvciByYW5nZSAke3JhbmdlLnN0YXJ0fS0ke3JhbmdlLmVuZH1gXG4gICAgICApO1xuXG4gICAgICAvLyBFbWl0IGV2ZW50XG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6cGxhY2Vob2xkZXJzLXNob3duXCIsIHtcbiAgICAgICAgcmFuZ2UsXG4gICAgICAgIGNvdW50OiBwbGFjZWhvbGRlcnMubGVuZ3RoLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGFuIGl0ZW0gaXMgYSBwbGFjZWhvbGRlclxuICAgICAqL1xuICAgIGNvbnN0IGlzUGxhY2Vob2xkZXIgPSAoaXRlbTogYW55KTogYm9vbGVhbiA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBpdGVtICYmXG4gICAgICAgIHR5cGVvZiBpdGVtID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIGl0ZW1bVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLlBMQUNFSE9MREVSX0ZMQUddID09PSB0cnVlXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXBsYWNlIHBsYWNlaG9sZGVycyB3aXRoIHJlYWwgZGF0YVxuICAgICAqL1xuICAgIGNvbnN0IHJlcGxhY2VQbGFjZWhvbGRlcnMgPSAoaXRlbXM6IGFueVtdLCBvZmZzZXQ6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFjb21wb25lbnQuaXRlbXMpIHJldHVybjtcblxuICAgICAgbGV0IHJlcGxhY2VkQ291bnQgPSAwO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gb2Zmc2V0ICsgaTtcbiAgICAgICAgY29uc3QgY3VycmVudEl0ZW0gPSBjb21wb25lbnQuaXRlbXNbaW5kZXhdO1xuXG4gICAgICAgIGlmIChpc1BsYWNlaG9sZGVyKGN1cnJlbnRJdGVtKSkge1xuICAgICAgICAgIGNvbXBvbmVudC5pdGVtc1tpbmRleF0gPSBpdGVtc1tpXTtcbiAgICAgICAgICByZXBsYWNlZENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJlcGxhY2VkQ291bnQgPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGDinKggW1BMQUNFSE9MREVSU10gUmVwbGFjZWQgJHtyZXBsYWNlZENvdW50fSBwbGFjZWhvbGRlcnMgYXQgb2Zmc2V0ICR7b2Zmc2V0fWBcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBFbWl0IGV2ZW50XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpwbGFjZWhvbGRlcnMtcmVwbGFjZWRcIiwge1xuICAgICAgICAgIG9mZnNldCxcbiAgICAgICAgICBjb3VudDogcmVwbGFjZWRDb3VudCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENsZWFyIGFsbCBwbGFjZWhvbGRlciBzdGF0ZVxuICAgICAqL1xuICAgIGNvbnN0IGNsZWFyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgZmllbGRTdHJ1Y3R1cmVzID0gbnVsbDtcbiAgICAgIGhhc0FuYWx5emVkID0gZmFsc2U7XG4gICAgICBwbGFjZWhvbGRlcklkQ291bnRlciA9IDA7XG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgZnVuY3Rpb25cbiAgICBjb25zdCBpbml0aWFsaXplID0gKCkgPT4ge1xuICAgICAgaWYgKCFlbmFibGVkKSByZXR1cm47XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgZmlyc3QgZGF0YSBsb2FkIHRvIGFuYWx5emUgc3RydWN0dXJlXG4gICAgICBpZiAoYW5hbHl6ZUZpcnN0TG9hZCkge1xuICAgICAgICBjb25zdCBoYW5kbGVSYW5nZUxvYWRlZCA9IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoIWhhc0FuYWx5emVkICYmIGRhdGEuaXRlbXMgJiYgZGF0YS5pdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhbmFseXplRGF0YVN0cnVjdHVyZShkYXRhLml0ZW1zKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSZXBsYWNlIGFueSBwbGFjZWhvbGRlcnMgd2l0aCByZWFsIGRhdGFcbiAgICAgICAgICByZXBsYWNlUGxhY2Vob2xkZXJzKGRhdGEuaXRlbXMsIGRhdGEub2Zmc2V0KTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBoYW5kbGVSYW5nZUxvYWRlZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNob3cgaW5pdGlhbCBwbGFjZWhvbGRlcnMgaWYgY29uZmlndXJlZFxuICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGNvbXBvbmVudC5jb2xsZWN0aW9uPy5nZXRUb3RhbEl0ZW1zKCkgfHwgMDtcbiAgICAgIGlmICh0b3RhbEl0ZW1zID4gMCkge1xuICAgICAgICBjb25zdCBpbml0aWFsUmFuZ2UgPSB7XG4gICAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgICAgZW5kOiBNYXRoLm1pbihcbiAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVhfU0FNUExFX1NJWkUgLSAxLFxuICAgICAgICAgICAgdG90YWxJdGVtcyAtIDFcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgICBzaG93UGxhY2Vob2xkZXJzKGluaXRpYWxSYW5nZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIENsZWFudXAgZnVuY3Rpb25cbiAgICBjb25zdCBkZXN0cm95ID0gKCkgPT4ge1xuICAgICAgY2xlYXIoKTtcbiAgICB9O1xuXG4gICAgLy8gU3RvcmUgZnVuY3Rpb25zIGZvciB2aWV3cG9ydCB0byBjYWxsXG4gICAgKGNvbXBvbmVudCBhcyBhbnkpLl9wbGFjZWhvbGRlcnNJbml0aWFsaXplID0gaW5pdGlhbGl6ZTtcbiAgICAoY29tcG9uZW50IGFzIGFueSkuX3BsYWNlaG9sZGVyc0Rlc3Ryb3kgPSBkZXN0cm95O1xuXG4gICAgLy8gUmV0dXJuIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBwbGFjZWhvbGRlcnM6IHtcbiAgICAgICAgYW5hbHl6ZURhdGFTdHJ1Y3R1cmUsXG4gICAgICAgIGhhc0FuYWx5emVkU3RydWN0dXJlOiAoKSA9PiBoYXNBbmFseXplZCxcbiAgICAgICAgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW0sXG4gICAgICAgIGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtcyxcbiAgICAgICAgc2hvd1BsYWNlaG9sZGVycyxcbiAgICAgICAgaXNQbGFjZWhvbGRlcixcbiAgICAgICAgcmVwbGFjZVBsYWNlaG9sZGVycyxcbiAgICAgICAgY2xlYXIsXG4gICAgICB9LFxuICAgIH07XG4gIH07XG59XG4iLAogICAgIi8qKlxuICogUmVuZGVyaW5nIEZlYXR1cmUgLSBJdGVtIHJlbmRlcmluZyBhbmQgcG9zaXRpb25pbmcgZm9yIHZpZXdwb3J0XG4gKiBIYW5kbGVzIERPTSBlbGVtZW50IGNyZWF0aW9uLCBwb3NpdGlvbmluZywgcmVjeWNsaW5nLCBhbmQgdXBkYXRlc1xuICovXG5cbmltcG9ydCB7IGFkZENsYXNzLCByZW1vdmVDbGFzcywgaGFzQ2xhc3MgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBWSUVXUE9SVF9DT05TVEFOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBpc1BsYWNlaG9sZGVyLFxuICBnZXRWaWV3cG9ydFN0YXRlLFxuICB3cmFwSW5pdGlhbGl6ZSxcbiAgd3JhcERlc3Ryb3ksXG59IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBjcmVhdGVMYXlvdXQgfSBmcm9tIFwiLi4vLi4vbGF5b3V0XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyaW5nQ29uZmlnIHtcbiAgdGVtcGxhdGU/OiAoXG4gICAgaXRlbTogYW55LFxuICAgIGluZGV4OiBudW1iZXIsXG4gICkgPT4gc3RyaW5nIHwgSFRNTEVsZW1lbnQgfCBhbnlbXSB8IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIG92ZXJzY2FuPzogbnVtYmVyO1xuICBtZWFzdXJlSXRlbXM/OiBib29sZWFuO1xuICBlbmFibGVSZWN5Y2xpbmc/OiBib29sZWFuO1xuICBtYXhQb29sU2l6ZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIE1haW50YWluIERPTSBvcmRlciB0byBtYXRjaCB2aXN1YWwgaW5kZXggb3JkZXIuXG4gICAqIEVuYWJsZXMgQ1NTIHNlbGVjdG9ycyBsaWtlIDpmaXJzdC1jaGlsZCwgOm50aC1jaGlsZCgpIHRvIHdvcmsgY29ycmVjdGx5LlxuICAgKiBEZWZhdWx0OiB0cnVlXG4gICAqL1xuICBtYWludGFpbkRvbU9yZGVyPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFZpZXdwb3J0U3RhdGUge1xuICBzY3JvbGxQb3NpdGlvbjogbnVtYmVyO1xuICB0b3RhbEl0ZW1zOiBudW1iZXI7XG4gIGl0ZW1TaXplOiBudW1iZXI7XG4gIGNvbnRhaW5lclNpemU6IG51bWJlcjtcbiAgdmlydHVhbFRvdGFsU2l6ZTogbnVtYmVyO1xuICB2aXNpYmxlUmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfTtcbiAgaXRlbXNDb250YWluZXI6IEhUTUxFbGVtZW50IHwgbnVsbDtcbn1cblxuLyoqXG4gKiBSZW5kZXJpbmcgZmVhdHVyZSBmb3Igdmlld3BvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhSZW5kZXJpbmcgPSAoY29uZmlnOiBSZW5kZXJpbmdDb25maWcgPSB7fSkgPT4ge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBWaWV3cG9ydENvbXBvbmVudD4oY29tcG9uZW50OiBUKTogVCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgdGVtcGxhdGUsXG4gICAgICBvdmVyc2NhbiA9IDUsXG4gICAgICBtZWFzdXJlSXRlbXMgPSBmYWxzZSxcbiAgICAgIGVuYWJsZVJlY3ljbGluZyA9IHRydWUsXG4gICAgICBtYXhQb29sU2l6ZSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5SRU5ERVJJTkcuREVGQVVMVF9NQVhfUE9PTF9TSVpFLFxuICAgICAgbWFpbnRhaW5Eb21PcmRlciA9IHRydWUsXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIFN0YXRlXG4gICAgY29uc3QgcmVuZGVyZWRFbGVtZW50cyA9IG5ldyBNYXA8bnVtYmVyLCBIVE1MRWxlbWVudD4oKTtcbiAgICBjb25zdCBjb2xsZWN0aW9uSXRlbXM6IFJlY29yZDxudW1iZXIsIGFueT4gPSB7fTtcbiAgICBjb25zdCBlbGVtZW50UG9vbDogSFRNTEVsZW1lbnRbXSA9IFtdO1xuICAgIGNvbnN0IHBvb2xTdGF0cyA9IHsgY3JlYXRlZDogMCwgcmVjeWNsZWQ6IDAsIHBvb2xTaXplOiAwLCByZWxlYXNlZDogMCB9O1xuXG4gICAgLy8gU3RvcmUgbGF5b3V0IHJlc3VsdHMgZm9yIHByb3BlciBjbGVhbnVwIChwcmV2ZW50cyBtZW1vcnkgbGVhaylcbiAgICBjb25zdCBsYXlvdXRSZXN1bHRzID0gbmV3IFdlYWtNYXA8SFRNTEVsZW1lbnQsIHsgZGVzdHJveTogKCkgPT4gdm9pZCB9PigpO1xuXG4gICAgLy8gUmV1c2FibGUgdGVtcGxhdGUgZWxlbWVudCBmb3IgSFRNTCBzdHJpbmcgcGFyc2luZyAobW9yZSBlZmZpY2llbnQgdGhhbiBkaXYpXG4gICAgY29uc3QgdGVtcGxhdGVQYXJzZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG5cbiAgICBsZXQgdmlld3BvcnRTdGF0ZTogVmlld3BvcnRTdGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjdXJyZW50VmlzaWJsZVJhbmdlID0geyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgbGV0IGxhc3RSZW5kZXJUaW1lID0gMDtcbiAgICBsZXQgaXNSZW1vdmluZ0l0ZW0gPSBmYWxzZTtcblxuICAgIC8vIEVsZW1lbnQgcG9vbCBtYW5hZ2VtZW50XG4gICAgY29uc3QgZ2V0UG9vbGVkRWxlbWVudCA9ICgpOiBIVE1MRWxlbWVudCA9PiB7XG4gICAgICBpZiAoZW5hYmxlUmVjeWNsaW5nICYmIGVsZW1lbnRQb29sLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcG9vbFN0YXRzLnJlY3ljbGVkKys7XG4gICAgICAgIHJldHVybiBlbGVtZW50UG9vbC5wb3AoKSE7XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gXCJtdHJsLXZpZXdwb3J0LWl0ZW1cIjtcbiAgICAgIHBvb2xTdGF0cy5jcmVhdGVkKys7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVsZWFzZUVsZW1lbnQgPSAoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkID0+IHtcbiAgICAgIHBvb2xTdGF0cy5yZWxlYXNlZCsrO1xuXG4gICAgICAvLyBDUklUSUNBTDogQ2FsbCBkZXN0cm95IG9uIGxheW91dFJlc3VsdCB0byBjbGVhbiB1cCBjb21wb25lbnRzIGFuZCBldmVudCBsaXN0ZW5lcnNcbiAgICAgIC8vIFRoaXMgZml4ZXMgdGhlIG1lbW9yeSBsZWFrIHdoZW4gdXNpbmcgbGF5b3V0IHRlbXBsYXRlc1xuICAgICAgY29uc3QgbGF5b3V0UmVzdWx0ID0gbGF5b3V0UmVzdWx0cy5nZXQoZWxlbWVudCk7XG4gICAgICBpZiAobGF5b3V0UmVzdWx0ICYmIHR5cGVvZiBsYXlvdXRSZXN1bHQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGF5b3V0UmVzdWx0LmRlc3Ryb3koKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIElnbm9yZSBkZXN0cm95IGVycm9ycyAtIGVsZW1lbnQgbWF5IGFscmVhZHkgYmUgY2xlYW5lZCB1cFxuICAgICAgICB9XG4gICAgICAgIGxheW91dFJlc3VsdHMuZGVsZXRlKGVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVuYWJsZVJlY3ljbGluZykge1xuICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBDbGVhbiBlbGVtZW50IGZvciByZXVzZSAobm8gY2xvbmluZyAtIHJldXNlIHRoZSBhY3R1YWwgZWxlbWVudClcbiAgICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gXCJtdHJsLXZpZXdwb3J0LWl0ZW1cIjtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS1pbmRleFwiKTtcbiAgICAgIGVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9IFwiXCI7XG4gICAgICBlbGVtZW50LmlubmVySFRNTCA9IFwiXCI7XG5cbiAgICAgIC8vIFJlbW92ZSBmcm9tIERPTSBmaXJzdFxuICAgICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICBlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCB0byBwb29sIGlmIG5vdCBmdWxsXG4gICAgICBpZiAoZWxlbWVudFBvb2wubGVuZ3RoIDwgbWF4UG9vbFNpemUpIHtcbiAgICAgICAgZWxlbWVudFBvb2wucHVzaChlbGVtZW50KTtcbiAgICAgICAgcG9vbFN0YXRzLnBvb2xTaXplID0gZWxlbWVudFBvb2wubGVuZ3RoO1xuICAgICAgfVxuICAgICAgLy8gSWYgcG9vbCBpcyBmdWxsLCBlbGVtZW50IGlzIGp1c3QgZGVyZWZlcmVuY2VkIGFuZCBHQydkXG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemVcbiAgICB3cmFwSW5pdGlhbGl6ZShjb21wb25lbnQsICgpID0+IHtcbiAgICAgIHZpZXdwb3J0U3RhdGUgPSBnZXRWaWV3cG9ydFN0YXRlKGNvbXBvbmVudCkgYXMgVmlld3BvcnRTdGF0ZTtcblxuICAgICAgLy8gU2V0IGluaXRpYWwgaXRlbXMgY29udGFpbmVyIGhlaWdodCBmcm9tIGN1cnJlbnQgdmlydHVhbCBzaXplXG4gICAgICBpZiAodmlld3BvcnRTdGF0ZT8uaXRlbXNDb250YWluZXIgJiYgdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplID4gMCkge1xuICAgICAgICB2aWV3cG9ydFN0YXRlLml0ZW1zQ29udGFpbmVyLnN0eWxlLmhlaWdodCA9IGAke3ZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZX1weGA7XG4gICAgICB9XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgaXRlbSB1cGRhdGUgcmVxdWVzdHMgZnJvbSBBUElcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiaXRlbTp1cGRhdGUtcmVxdWVzdFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIGl0ZW0sIHByZXZpb3VzSXRlbSB9ID0gZGF0YTtcblxuICAgICAgICAvLyBVcGRhdGUgdGhlIGl0ZW0gaW4gY29sbGVjdGlvbkl0ZW1zXG4gICAgICAgIGNvbGxlY3Rpb25JdGVtc1tpbmRleF0gPSBpdGVtO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXRlbSBpcyBjdXJyZW50bHkgcmVuZGVyZWRcbiAgICAgICAgY29uc3QgZXhpc3RpbmdFbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50cy5nZXQoaW5kZXgpO1xuICAgICAgICBjb25zdCB3YXNWaXNpYmxlID0gISFleGlzdGluZ0VsZW1lbnQ7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgaXRlbSB3YXMgc2VsZWN0ZWQgYmVmb3JlIHVwZGF0ZVxuICAgICAgICBjb25zdCB3YXNTZWxlY3RlZCA9IGV4aXN0aW5nRWxlbWVudFxuICAgICAgICAgID8gaGFzQ2xhc3MoXG4gICAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudCxcbiAgICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlNFTEVDVElPTi5TRUxFQ1RFRF9DTEFTUyxcbiAgICAgICAgICAgICkgfHwgaGFzQ2xhc3MoZXhpc3RpbmdFbGVtZW50LCBcIm10cmwtdmlld3BvcnQtaXRlbS0tc2VsZWN0ZWRcIilcbiAgICAgICAgICA6IGZhbHNlO1xuXG4gICAgICAgIGlmIChleGlzdGluZ0VsZW1lbnQgJiYgZXhpc3RpbmdFbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAvLyBSZS1yZW5kZXIgdGhlIGl0ZW1cbiAgICAgICAgICBjb25zdCBuZXdFbGVtZW50ID0gcmVuZGVySXRlbShpdGVtLCBpbmRleCk7XG5cbiAgICAgICAgICBpZiAobmV3RWxlbWVudCkge1xuICAgICAgICAgICAgLy8gQ29weSBwb3NpdGlvbiBzdHlsZXMgZnJvbSBleGlzdGluZyBlbGVtZW50XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG5ld0VsZW1lbnQuc3R5bGUsIHtcbiAgICAgICAgICAgICAgcG9zaXRpb246IGV4aXN0aW5nRWxlbWVudC5zdHlsZS5wb3NpdGlvbixcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiBleGlzdGluZ0VsZW1lbnQuc3R5bGUudHJhbnNmb3JtLFxuICAgICAgICAgICAgICB3aWR0aDogZXhpc3RpbmdFbGVtZW50LnN0eWxlLndpZHRoLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIFByZXNlcnZlIHNlbGVjdGVkIHN0YXRlXG4gICAgICAgICAgICBpZiAod2FzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgYWRkQ2xhc3MobmV3RWxlbWVudCwgVklFV1BPUlRfQ09OU1RBTlRTLlNFTEVDVElPTi5TRUxFQ1RFRF9DTEFTUyk7XG4gICAgICAgICAgICAgIGFkZENsYXNzKG5ld0VsZW1lbnQsIFwibXRybC12aWV3cG9ydC1pdGVtLS1zZWxlY3RlZFwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIHVwZGF0ZSBhbmltYXRpb24gY2xhc3MgdG8gaW5uZXIgY29udGVudCBmb3IgdmlzaWJpbGl0eVxuICAgICAgICAgICAgYWRkQ2xhc3MobmV3RWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtLS11cGRhdGVkXCIpO1xuICAgICAgICAgICAgLy8gQWxzbyB0cnkgdG8gYWRkIHRvIGZpcnN0IGNoaWxkIGlmIGl0IGV4aXN0cyAodGhlIGFjdHVhbCBpdGVtIGNvbnRlbnQpXG4gICAgICAgICAgICBjb25zdCBpbm5lckl0ZW0gPSBuZXdFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgaWYgKGlubmVySXRlbSkge1xuICAgICAgICAgICAgICBhZGRDbGFzcyhpbm5lckl0ZW0sIFwiaXRlbS0tdXBkYXRlZFwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmVwbGFjZSBpbiBET01cbiAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChcbiAgICAgICAgICAgICAgbmV3RWxlbWVudCxcbiAgICAgICAgICAgICAgZXhpc3RpbmdFbGVtZW50LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2V0KGluZGV4LCBuZXdFbGVtZW50KTtcbiAgICAgICAgICAgIHJlbGVhc2VFbGVtZW50KGV4aXN0aW5nRWxlbWVudCk7XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYW5pbWF0aW9uIGNsYXNzIGFmdGVyIHRyYW5zaXRpb25cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICByZW1vdmVDbGFzcyhuZXdFbGVtZW50LCBcInZpZXdwb3J0LWl0ZW0tLXVwZGF0ZWRcIik7XG4gICAgICAgICAgICAgIGlmIChpbm5lckl0ZW0pIHtcbiAgICAgICAgICAgICAgICByZW1vdmVDbGFzcyhpbm5lckl0ZW0sIFwiaXRlbS0tdXBkYXRlZFwiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IGNvbXBsZXRpb24gZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW06dXBkYXRlZFwiLCB7XG4gICAgICAgICAgaXRlbSxcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBwcmV2aW91c0l0ZW0sXG4gICAgICAgICAgd2FzVmlzaWJsZSxcbiAgICAgICAgICB3YXNTZWxlY3RlZCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBpdGVtIHJlbW92ZSByZXF1ZXN0cyBmcm9tIEFQSVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJpdGVtOnJlbW92ZS1yZXF1ZXN0XCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgeyBpbmRleCwgaXRlbSB9ID0gZGF0YTtcbiAgICAgICAgaXNSZW1vdmluZ0l0ZW0gPSB0cnVlO1xuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAvLyAgIGBbUkVOREVSLUZJWF0gPT09PT09PT09PSBJVEVNIFJFTU9WRSBTVEFSVCAodjQpID09PT09PT09PT1gLFxuICAgICAgICAvLyApO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW1JFTkRFUi1GSVhdIFJlbW92aW5nIGluZGV4OiAke2luZGV4fWApO1xuXG4gICAgICAgIC8vIEdldCB0aGUgc291cmNlIG9mIHRydXRoIC0gY29sbGVjdGlvbi5pdGVtcyBoYXMgYWxyZWFkeSBiZWVuIHNwbGljZWQgYnkgYXBpLnRzXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb25JdGVtc1NvdXJjZSA9XG4gICAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24/Lml0ZW1zIHx8XG4gICAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLml0ZW1zIHx8XG4gICAgICAgICAgW107XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtSRU5ERVItRklYXSBjb2xsZWN0aW9uSXRlbXNTb3VyY2UubGVuZ3RoOiAke2NvbGxlY3Rpb25JdGVtc1NvdXJjZS5sZW5ndGh9YCxcbiAgICAgICAgLy8gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtSRU5ERVItRklYXSBjb2xsZWN0aW9uSXRlbXMgY2FjaGUgc2l6ZSBCRUZPUkU6ICR7T2JqZWN0LmtleXMoY29sbGVjdGlvbkl0ZW1zKS5sZW5ndGh9YCxcbiAgICAgICAgLy8gKTtcblxuICAgICAgICAvLyBTdHJhdGVneTogU2hpZnQgY29sbGVjdGlvbkl0ZW1zIGNhY2hlIGluZGljZXMgZG93biwgYnV0IHVzZSBhY3R1YWwgZGF0YVxuICAgICAgICAvLyBmcm9tIGNvbGxlY3Rpb24uaXRlbXMgKHdoaWNoIGhhcyBiZWVuIHNwbGljZWQpIGZvciB0aGUgbG9hZGVkIHJhbmdlLlxuICAgICAgICAvLyBGb3IgaW5kaWNlcyBiZXlvbmQgdGhlIGxvYWRlZCByYW5nZSwgc2hpZnQgdGhlIGNhY2hlZCBkYXRhLlxuXG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhjb2xsZWN0aW9uSXRlbXMpXG4gICAgICAgICAgLm1hcChOdW1iZXIpXG4gICAgICAgICAgLmZpbHRlcigoaykgPT4gIWlzTmFOKGspKVxuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG5cbiAgICAgICAgLy8gRGVsZXRlIHRoZSByZW1vdmVkIGluZGV4XG4gICAgICAgIGRlbGV0ZSBjb2xsZWN0aW9uSXRlbXNbaW5kZXhdO1xuXG4gICAgICAgIC8vIFNoaWZ0IGFsbCBpbmRpY2VzIGFmdGVyIHRoZSByZW1vdmVkIG9uZSBkb3duIGJ5IDFcbiAgICAgICAgLy8gRm9yIGluZGljZXMgd2l0aGluIHRoZSBsb2FkZWQgcmFuZ2UsIHVzZSBkYXRhIGZyb20gY29sbGVjdGlvbi5pdGVtc1xuICAgICAgICAvLyBGb3IgaW5kaWNlcyBiZXlvbmQsIHNoaWZ0IHRoZSBleGlzdGluZyBjYWNoZWQgZGF0YVxuICAgICAgICBjb25zdCBsb2FkZWRMZW5ndGggPSBjb2xsZWN0aW9uSXRlbXNTb3VyY2UubGVuZ3RoO1xuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICBpZiAoa2V5ID4gaW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0luZGV4ID0ga2V5IC0gMTtcbiAgICAgICAgICAgIC8vIElmIG5ld0luZGV4IGlzIHdpdGhpbiBsb2FkZWQgZGF0YSwgdXNlIHNvdXJjZTsgb3RoZXJ3aXNlIHNoaWZ0IGNhY2hlXG4gICAgICAgICAgICBpZiAobmV3SW5kZXggPCBsb2FkZWRMZW5ndGggJiYgY29sbGVjdGlvbkl0ZW1zU291cmNlW25ld0luZGV4XSkge1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uSXRlbXNbbmV3SW5kZXhdID0gY29sbGVjdGlvbkl0ZW1zU291cmNlW25ld0luZGV4XTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFNoaWZ0IGNhY2hlZCBkYXRhIGZvciBpbmRpY2VzIGJleW9uZCBsb2FkZWQgcmFuZ2VcbiAgICAgICAgICAgICAgY29sbGVjdGlvbkl0ZW1zW25ld0luZGV4XSA9IGNvbGxlY3Rpb25JdGVtc1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlIGNvbGxlY3Rpb25JdGVtc1trZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbmFsS2V5cyA9IE9iamVjdC5rZXlzKGNvbGxlY3Rpb25JdGVtcylcbiAgICAgICAgICAubWFwKE51bWJlcilcbiAgICAgICAgICAuZmlsdGVyKChrKSA9PiAhaXNOYU4oaykpXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtSRU5ERVItRklYXSBjb2xsZWN0aW9uSXRlbXMgY2FjaGUgc2l6ZSBBRlRFUjogJHtmaW5hbEtleXMubGVuZ3RofWAsXG4gICAgICAgIC8vICk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAvLyAgIGBbUkVOREVSLUZJWF0gY29sbGVjdGlvbkl0ZW1zIGtleXM6IFske2ZpbmFsS2V5cy5zbGljZSgwLCAxMCkuam9pbihcIiwgXCIpfSR7ZmluYWxLZXlzLmxlbmd0aCA+IDEwID8gXCIuLi5cIiA6IFwiXCJ9XWAsXG4gICAgICAgIC8vICk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAvLyAgIGBbUkVOREVSLUZJWF0gdmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zOiAke3ZpZXdwb3J0U3RhdGU/LnRvdGFsSXRlbXN9YCxcbiAgICAgICAgLy8gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtSRU5ERVItRklYXSB2aWV3cG9ydFN0YXRlLnZpc2libGVSYW5nZTogJHtKU09OLnN0cmluZ2lmeSh2aWV3cG9ydFN0YXRlPy52aXNpYmxlUmFuZ2UpfWAsXG4gICAgICAgIC8vICk7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGFueSB1bmRlZmluZWQvbnVsbCB2YWx1ZXMgaW4gZmlyc3QgMzAgaXRlbXNcbiAgICAgICAgY29uc3QgYmFkSW5kaWNlczogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXRoLm1pbigzMCwgZmluYWxLZXlzLmxlbmd0aCk7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGsgPSBmaW5hbEtleXNbaV07XG4gICAgICAgICAgaWYgKCFjb2xsZWN0aW9uSXRlbXNba10gfHwgY29sbGVjdGlvbkl0ZW1zW2tdLl9wbGFjZWhvbGRlcikge1xuICAgICAgICAgICAgYmFkSW5kaWNlcy5wdXNoKGspO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgcmVuZGVyZWQgZWxlbWVudCBhdCB0aGlzIGluZGV4XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGluZGV4KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nRWxlbWVudCAmJiBleGlzdGluZ0VsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICAgIHJlbGVhc2VFbGVtZW50KGV4aXN0aW5nRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5kZWxldGUoaW5kZXgpO1xuXG4gICAgICAgIC8vIFNoaWZ0IHJlbmRlcmVkIGVsZW1lbnRzIGluZGljZXMgZG93blxuICAgICAgICBjb25zdCByZW5kZXJlZEtleXMgPSBBcnJheS5mcm9tKHJlbmRlcmVkRWxlbWVudHMua2V5cygpKS5zb3J0KFxuICAgICAgICAgIChhLCBiKSA9PiBhIC0gYixcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgbmV3UmVuZGVyZWRFbGVtZW50cyA9IG5ldyBNYXA8bnVtYmVyLCBIVE1MRWxlbWVudD4oKTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgcmVuZGVyZWRLZXlzKSB7XG4gICAgICAgICAgaWYgKGtleSA+IGluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50cy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgIC8vIFVwZGF0ZSBkYXRhLWluZGV4IGF0dHJpYnV0ZVxuICAgICAgICAgICAgICBlbGVtZW50LmRhdGFzZXQuaW5kZXggPSBTdHJpbmcoa2V5IC0gMSk7XG4gICAgICAgICAgICAgIG5ld1JlbmRlcmVkRWxlbWVudHMuc2V0KGtleSAtIDEsIGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoa2V5IDwgaW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnRzLmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgbmV3UmVuZGVyZWRFbGVtZW50cy5zZXQoa2V5LCBlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGVsZW1lbnRdIG9mIG5ld1JlbmRlcmVkRWxlbWVudHMpIHtcbiAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNldChrZXksIGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVjcmVtZW50IHRvdGFsSXRlbXMgTk9XIHNvIHJlbmRlckl0ZW1zKCkgdXNlcyB0aGUgY29ycmVjdCBjb3VudFxuICAgICAgICAvLyBzZXRUb3RhbEl0ZW1zKCkgd2lsbCBiZSBjYWxsZWQgbGF0ZXIgYnkgdGhlIEFQSSwgd2hpY2ggd2lsbCBlbWl0XG4gICAgICAgIC8vIHZpZXdwb3J0OnRvdGFsLWl0ZW1zLWNoYW5nZWQgZm9yIHZpcnR1YWwgc2l6ZSByZWNhbGN1bGF0aW9uXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlICYmIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyA+IDApIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMtLTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2V0IHZpc2libGUgcmFuZ2UgdG8gZm9yY2UgcmUtcmVuZGVyXG4gICAgICAgIGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB7IHN0YXJ0OiAtMSwgZW5kOiAtMSB9O1xuXG4gICAgICAgIC8vIEVtaXQgY29tcGxldGlvbiBldmVudFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiaXRlbTpyZW1vdmVkXCIsIHtcbiAgICAgICAgICBpdGVtLFxuICAgICAgICAgIGluZGV4LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBZnRlciBpdGVtIHJlbW92YWwsIGNsZWFyIEFMTCBsb2FkZWRSYW5nZXMgYW5kIGNvbGxlY3Rpb25JdGVtcyBjYWNoZVxuICAgICAgICAvLyBUaGlzIGZvcmNlcyBhIGNvbXBsZXRlIHJlbG9hZCB3aGljaCBpcyBtb3JlIHJlbGlhYmxlIHRoYW4gdHJ5aW5nIHRvXG4gICAgICAgIC8vIHRyYWNrIHNoaWZ0ZWQgaW5kaWNlcy4gVGhlIGl0ZW1zIGFycmF5IGhhcyBiZWVuIHNwbGljZWQgYW5kIGFsbCBpbmRpY2VzXG4gICAgICAgIC8vIGFyZSBub3cgZGlmZmVyZW50IGZyb20gd2hhdCBsb2FkZWRSYW5nZXMgdGhpbmtzIHRoZXkgYXJlLlxuICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpPy5jb2xsZWN0aW9uO1xuICAgICAgICBpZiAoY29sbGVjdGlvbj8uZ2V0TG9hZGVkUmFuZ2VzKSB7XG4gICAgICAgICAgY29uc3QgbG9hZGVkUmFuZ2VzID0gY29sbGVjdGlvbi5nZXRMb2FkZWRSYW5nZXMoKTtcbiAgICAgICAgICBsb2FkZWRSYW5nZXMuY2xlYXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsZWFyIHRoZSBlbnRpcmUgY29sbGVjdGlvbkl0ZW1zIGNhY2hlIC0gaXQncyBhbGwgc3RhbGUgYWZ0ZXIgcmVtb3ZhbFxuICAgICAgICAvLyBLZWVwIG9ubHkgdGhlIGl0ZW1zIHdlIGFjdHVhbGx5IGhhdmUgaW4gdGhlIHNvdXJjZSBhcnJheVxuICAgICAgICBjb25zdCBsb2FkZWRJdGVtc0NvdW50ID0gY29sbGVjdGlvbkl0ZW1zU291cmNlLmxlbmd0aDtcbiAgICAgICAgY29uc3QgY2FjaGVLZXlzID0gT2JqZWN0LmtleXMoY29sbGVjdGlvbkl0ZW1zKVxuICAgICAgICAgIC5tYXAoTnVtYmVyKVxuICAgICAgICAgIC5maWx0ZXIoKGspID0+ICFpc05hTihrKSk7XG4gICAgICAgIGNhY2hlS2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICBpZiAoa2V5ID49IGxvYWRlZEl0ZW1zQ291bnQpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjb2xsZWN0aW9uSXRlbXNba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgcmVsb2FkIG9mIHZpc2libGUgcmFuZ2VcbiAgICAgICAgY29uc3QgdmlzaWJsZVJhbmdlID0gY29tcG9uZW50LnZpZXdwb3J0Py5nZXRWaXNpYmxlUmFuZ2U/LigpO1xuICAgICAgICBpZiAodmlzaWJsZVJhbmdlICYmIGNvbGxlY3Rpb24/LmxvYWRNaXNzaW5nUmFuZ2VzKSB7XG4gICAgICAgICAgY29sbGVjdGlvbi5sb2FkTWlzc2luZ1JhbmdlcyhcbiAgICAgICAgICAgIHsgc3RhcnQ6IDAsIGVuZDogTWF0aC5tYXgodmlzaWJsZVJhbmdlLmVuZCwgbG9hZGVkSXRlbXNDb3VudCkgfSxcbiAgICAgICAgICAgIFwiaXRlbS1yZW1vdmFsXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyaWdnZXIgcmUtcmVuZGVyXG4gICAgICAgIHJlbmRlckl0ZW1zKCk7XG4gICAgICAgIGlzUmVtb3ZpbmdJdGVtID0gZmFsc2U7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBpdGVtcyBhZGQgcmVxdWVzdHMgZnJvbSBBUElcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiaXRlbXM6YWRkLXJlcXVlc3RcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB7IGl0ZW1zOiBuZXdJdGVtcywgcG9zaXRpb24sIHByZXZpb3VzQ291bnQgfSA9IGRhdGE7XG5cbiAgICAgICAgaWYgKCFuZXdJdGVtcyB8fCBuZXdJdGVtcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICAvLyBHZXQgdGhlIHNvdXJjZSBvZiB0cnV0aCAtIGNvbGxlY3Rpb24uaXRlbXMgaGFzIGFscmVhZHkgYmVlbiBtb2RpZmllZCBieSBhcGkudHNcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbkl0ZW1zU291cmNlID1cbiAgICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbj8uaXRlbXMgfHxcbiAgICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuaXRlbXMgfHxcbiAgICAgICAgICBbXTtcblxuICAgICAgICBjb25zdCBpdGVtc0FkZGVkID0gbmV3SXRlbXMubGVuZ3RoO1xuXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gXCJzdGFydFwiKSB7XG4gICAgICAgICAgLy8gSXRlbXMgd2VyZSBwcmVwZW5kZWQgLSBzaGlmdCBhbGwgZXhpc3RpbmcgaW5kaWNlcyB1cFxuICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhjb2xsZWN0aW9uSXRlbXMpXG4gICAgICAgICAgICAubWFwKE51bWJlcilcbiAgICAgICAgICAgIC5maWx0ZXIoKGspID0+ICFpc05hTihrKSlcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBiIC0gYSk7IC8vIFNvcnQgZGVzY2VuZGluZyB0byBhdm9pZCBvdmVyd3JpdGVzXG5cbiAgICAgICAgICAvLyBTaGlmdCBhbGwgZXhpc3RpbmcgaW5kaWNlcyB1cCBieSB0aGUgbnVtYmVyIG9mIGl0ZW1zIGFkZGVkXG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICAgICAgY29uc3QgbmV3SW5kZXggPSBrZXkgKyBpdGVtc0FkZGVkO1xuICAgICAgICAgICAgY29sbGVjdGlvbkl0ZW1zW25ld0luZGV4XSA9IGNvbGxlY3Rpb25JdGVtc1trZXldO1xuICAgICAgICAgICAgZGVsZXRlIGNvbGxlY3Rpb25JdGVtc1trZXldO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEFkZCB0aGUgbmV3IGl0ZW1zIGF0IHRoZSBzdGFydFxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXNBZGRlZDsgaSsrKSB7XG4gICAgICAgICAgICBjb2xsZWN0aW9uSXRlbXNbaV0gPSBuZXdJdGVtc1tpXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTaGlmdCByZW5kZXJlZCBlbGVtZW50cyBpbmRpY2VzIHVwXG4gICAgICAgICAgY29uc3QgcmVuZGVyZWRLZXlzID0gQXJyYXkuZnJvbShyZW5kZXJlZEVsZW1lbnRzLmtleXMoKSkuc29ydChcbiAgICAgICAgICAgIChhLCBiKSA9PiBiIC0gYSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IG5ld1JlbmRlcmVkRWxlbWVudHMgPSBuZXcgTWFwPG51bWJlciwgSFRNTEVsZW1lbnQ+KCk7XG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgcmVuZGVyZWRLZXlzKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50cy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgIGNvbnN0IG5ld0luZGV4ID0ga2V5ICsgaXRlbXNBZGRlZDtcbiAgICAgICAgICAgICAgZWxlbWVudC5kYXRhc2V0LmluZGV4ID0gU3RyaW5nKG5ld0luZGV4KTtcbiAgICAgICAgICAgICAgbmV3UmVuZGVyZWRFbGVtZW50cy5zZXQobmV3SW5kZXgsIGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLmNsZWFyKCk7XG4gICAgICAgICAgZm9yIChjb25zdCBba2V5LCBlbGVtZW50XSBvZiBuZXdSZW5kZXJlZEVsZW1lbnRzKSB7XG4gICAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNldChrZXksIGVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJdGVtcyB3ZXJlIGFwcGVuZGVkIC0ganVzdCBhZGQgdGhlbSBhdCB0aGUgZW5kXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtc0FkZGVkOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcHJldmlvdXNDb3VudCArIGk7XG4gICAgICAgICAgICBjb2xsZWN0aW9uSXRlbXNbaW5kZXhdID0gbmV3SXRlbXNbaV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIHRvdGFsSXRlbXMgaW4gdmlld3BvcnRTdGF0ZVxuICAgICAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyA9XG4gICAgICAgICAgICAodmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zIHx8IDApICsgaXRlbXNBZGRlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2V0IHZpc2libGUgcmFuZ2UgdG8gZm9yY2UgcmUtcmVuZGVyXG4gICAgICAgIGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB7IHN0YXJ0OiAtMSwgZW5kOiAtMSB9O1xuXG4gICAgICAgIC8vIENsZWFyIGxvYWRlZFJhbmdlcyB0byBlbnN1cmUgcHJvcGVyIHJlbG9hZCB0cmFja2luZ1xuICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpPy5jb2xsZWN0aW9uO1xuICAgICAgICBpZiAoY29sbGVjdGlvbj8uZ2V0TG9hZGVkUmFuZ2VzKSB7XG4gICAgICAgICAgY29uc3QgbG9hZGVkUmFuZ2VzID0gY29sbGVjdGlvbi5nZXRMb2FkZWRSYW5nZXMoKTtcbiAgICAgICAgICBsb2FkZWRSYW5nZXMuY2xlYXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyaWdnZXIgcmUtcmVuZGVyXG4gICAgICAgIHJlbmRlckl0ZW1zKCk7XG5cbiAgICAgICAgLy8gRW1pdCBjb21wbGV0aW9uIGV2ZW50XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtczpyZW5kZXItY29tcGxldGVcIiwge1xuICAgICAgICAgIGl0ZW1zOiBuZXdJdGVtcyxcbiAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICB0b3RhbDogdmlld3BvcnRTdGF0ZT8udG90YWxJdGVtcyB8fCAwLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGNvbGxlY3Rpb24gaXRlbXMgZXZpY3RlZCAtIGNsZWFuIHVwIG91ciBjYWNoZSB0b29cbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiY29sbGVjdGlvbjppdGVtcy1ldmljdGVkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgeyBrZWVwU3RhcnQsIGtlZXBFbmQsIGV2aWN0ZWRDb3VudCB9ID0gZGF0YTtcbiAgICAgICAgbGV0IGNsZWFuZWRDb3VudCA9IDA7XG5cbiAgICAgICAgLy8gUmVtb3ZlIGV2aWN0ZWQgaXRlbXMgZnJvbSBvdXIgY2FjaGVcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY29sbGVjdGlvbkl0ZW1zKSB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBwYXJzZUludChrZXksIDEwKTtcbiAgICAgICAgICBpZiAoaW5kZXggPCBrZWVwU3RhcnQgfHwgaW5kZXggPiBrZWVwRW5kKSB7XG4gICAgICAgICAgICBkZWxldGUgY29sbGVjdGlvbkl0ZW1zW2luZGV4XTtcbiAgICAgICAgICAgIGNsZWFuZWRDb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgY29sbGVjdGlvbiBkYXRhIGxvYWRlZFxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJjb2xsZWN0aW9uOnJhbmdlLWxvYWRlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAvLyAgIGBbUkVOREVSLUZJWF0gY29sbGVjdGlvbjpyYW5nZS1sb2FkZWQgLSBvZmZzZXQ6ICR7ZGF0YS5vZmZzZXR9LCBpdGVtczogJHtkYXRhLml0ZW1zPy5sZW5ndGh9YCxcbiAgICAgICAgLy8gKTtcbiAgICAgICAgaWYgKCFkYXRhLml0ZW1zPy5sZW5ndGgpIHJldHVybjtcblxuICAgICAgICAvLyBBbmFseXplIGRhdGEgc3RydWN0dXJlIG9uIGZpcnN0IGxvYWRcbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJzID0gKGNvbXBvbmVudCBhcyBhbnkpLnBsYWNlaG9sZGVycztcbiAgICAgICAgaWYgKHBsYWNlaG9sZGVycyAmJiAhcGxhY2Vob2xkZXJzLmhhc0FuYWx5emVkU3RydWN0dXJlKCkpIHtcbiAgICAgICAgICBwbGFjZWhvbGRlcnMuYW5hbHl6ZURhdGFTdHJ1Y3R1cmUoZGF0YS5pdGVtcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgY29sbGVjdGlvbiBpdGVtcyBhbmQgcmVwbGFjZSBwbGFjZWhvbGRlcnNcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtSRU5ERVItRklYXSBVcGRhdGluZyBjb2xsZWN0aW9uSXRlbXMgZm9yIGluZGljZXMgJHtkYXRhLm9mZnNldH0gdG8gJHtkYXRhLm9mZnNldCArIGRhdGEuaXRlbXMubGVuZ3RoIC0gMX1gLFxuICAgICAgICAvLyApO1xuICAgICAgICBsZXQgcmVwbGFjZWRDb3VudCA9IDA7XG4gICAgICAgIGxldCBza2lwcGVkQ291bnQgPSAwO1xuICAgICAgICBkYXRhLml0ZW1zLmZvckVhY2goKGl0ZW06IGFueSwgaTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBkYXRhLm9mZnNldCArIGk7XG4gICAgICAgICAgY29uc3Qgb2xkSXRlbSA9IGNvbGxlY3Rpb25JdGVtc1tpbmRleF07XG4gICAgICAgICAgY29sbGVjdGlvbkl0ZW1zW2luZGV4XSA9IGl0ZW07XG5cbiAgICAgICAgICAvLyBSZXBsYWNlIHBsYWNlaG9sZGVyIGluIERPTSBpZiBuZWVkZWRcbiAgICAgICAgICBjb25zdCB3YXNQbGFjZWhvbGRlciA9IG9sZEl0ZW0gJiYgaXNQbGFjZWhvbGRlcihvbGRJdGVtKTtcbiAgICAgICAgICBjb25zdCBoYXNFbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50cy5oYXMoaW5kZXgpO1xuICAgICAgICAgIGlmICh3YXNQbGFjZWhvbGRlciAmJiBoYXNFbGVtZW50KSB7XG4gICAgICAgICAgICByZXBsYWNlZENvdW50Kys7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50cy5nZXQoaW5kZXgpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgY29uc3QgbmV3RWxlbWVudCA9IHJlbmRlckl0ZW0oaXRlbSwgaW5kZXgpO1xuICAgICAgICAgICAgICBpZiAobmV3RWxlbWVudCkge1xuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBwbGFjZWhvbGRlciBjbGFzc2VzIGZyb20gd3JhcHBlclxuICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzKG5ld0VsZW1lbnQsIFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5DTEFTUyk7XG4gICAgICAgICAgICAgICAgLy8gQWxzbyByZW1vdmUgZnJvbSBpbm5lciBlbGVtZW50IChmb3Igc3RyaW5nIHRlbXBsYXRlcylcbiAgICAgICAgICAgICAgICBpZiAobmV3RWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MoXG4gICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5DTEFTUyxcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQWRkIHJlcGxhY2VkIGNsYXNzIGZvciBmYWRlLWluIGFuaW1hdGlvblxuICAgICAgICAgICAgICAgIGFkZENsYXNzKG5ld0VsZW1lbnQsIFwidmlld3BvcnQtaXRlbS0tcmVwbGFjZWRcIik7XG5cbiAgICAgICAgICAgICAgICAvLyBDb3B5IHBvc2l0aW9uIGFuZCByZXBsYWNlXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihuZXdFbGVtZW50LnN0eWxlLCB7XG4gICAgICAgICAgICAgICAgICBwb3NpdGlvbjogZWxlbWVudC5zdHlsZS5wb3NpdGlvbixcbiAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgICB3aWR0aDogZWxlbWVudC5zdHlsZS53aWR0aCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnBhcmVudE5vZGU/LnJlcGxhY2VDaGlsZChuZXdFbGVtZW50LCBlbGVtZW50KTtcbiAgICAgICAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNldChpbmRleCwgbmV3RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgcmVsZWFzZUVsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHJlcGxhY2VkIGNsYXNzIGFmdGVyIGFuaW1hdGlvbiBjb21wbGV0ZXNcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzKG5ld0VsZW1lbnQsIFwidmlld3BvcnQtaXRlbS0tcmVwbGFjZWRcIik7XG4gICAgICAgICAgICAgICAgfSwgMzAwKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyByZW5kZXJJdGVtIHJldHVybmVkIG51bGwgLSBzdGlsbCByZWxlYXNlIHRoZSBvbGQgZWxlbWVudFxuICAgICAgICAgICAgICAgIHJlbGVhc2VFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuZGVsZXRlKGluZGV4KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAod2FzUGxhY2Vob2xkZXIgJiYgIWhhc0VsZW1lbnQpIHtcbiAgICAgICAgICAgIHNraXBwZWRDb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGlmIChyZXBsYWNlZENvdW50ID4gMCB8fCBza2lwcGVkQ291bnQgPiAwKSB7XG4gICAgICAgIC8vICAgY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgICBgW1JFTkRFUi1GSVhdIFBsYWNlaG9sZGVyIHJlcGxhY2VtZW50OiAke3JlcGxhY2VkQ291bnR9IHJlcGxhY2VkLCAke3NraXBwZWRDb3VudH0gc2tpcHBlZCAobm90IHJlbmRlcmVkKWAsXG4gICAgICAgIC8vICAgKTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8gcmVuZGVyXG4gICAgICAgIGNvbnN0IHsgdmlzaWJsZVJhbmdlIH0gPSB2aWV3cG9ydFN0YXRlIHx8IHt9O1xuICAgICAgICBpZiAodmlzaWJsZVJhbmdlKSB7XG4gICAgICAgICAgY29uc3QgcmVuZGVyU3RhcnQgPSBNYXRoLm1heCgwLCB2aXNpYmxlUmFuZ2Uuc3RhcnQgLSBvdmVyc2Nhbik7XG4gICAgICAgICAgY29uc3QgcmVuZGVyRW5kID0gTWF0aC5taW4oXG4gICAgICAgICAgICB2aWV3cG9ydFN0YXRlPy50b3RhbEl0ZW1zID8/IDAgLSAxLFxuICAgICAgICAgICAgdmlzaWJsZVJhbmdlLmVuZCArIG92ZXJzY2FuLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgbG9hZGVkU3RhcnQgPSBkYXRhLm9mZnNldDtcbiAgICAgICAgICBjb25zdCBsb2FkZWRFbmQgPSBkYXRhLm9mZnNldCArIGRhdGEuaXRlbXMubGVuZ3RoIC0gMTtcblxuICAgICAgICAgIC8vIENoZWNrIGZvciBwbGFjZWhvbGRlcnMgaW4gcmFuZ2VcbiAgICAgICAgICBjb25zdCBoYXNQbGFjZWhvbGRlcnNJblJhbmdlID0gQXJyYXkuZnJvbShcbiAgICAgICAgICAgIHsgbGVuZ3RoOiBNYXRoLm1pbihsb2FkZWRFbmQsIHJlbmRlckVuZCkgLSBsb2FkZWRTdGFydCArIDEgfSxcbiAgICAgICAgICAgIChfLCBpKSA9PiBjb2xsZWN0aW9uSXRlbXNbbG9hZGVkU3RhcnQgKyBpXSxcbiAgICAgICAgICApLnNvbWUoKGl0ZW0pID0+IGl0ZW0gJiYgaXNQbGFjZWhvbGRlcihpdGVtKSk7XG5cbiAgICAgICAgICBjb25zdCBuZWVkc1JlbmRlciA9XG4gICAgICAgICAgICAobG9hZGVkU3RhcnQgPD0gcmVuZGVyRW5kICYmXG4gICAgICAgICAgICAgIGxvYWRlZEVuZCA+PSByZW5kZXJTdGFydCAmJlxuICAgICAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNpemUgPCByZW5kZXJFbmQgLSByZW5kZXJTdGFydCArIDEpIHx8XG4gICAgICAgICAgICBoYXNQbGFjZWhvbGRlcnNJblJhbmdlO1xuXG4gICAgICAgICAgaWYgKG5lZWRzUmVuZGVyKSByZW5kZXJJdGVtcygpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBldmVudHNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6cmFuZ2UtY2hhbmdlZFwiLCByZW5kZXJJdGVtcyk7XG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnNjcm9sbFwiLCB1cGRhdGVJdGVtUG9zaXRpb25zKTtcblxuICAgICAgLy8gVXBkYXRlIGl0ZW1zIGNvbnRhaW5lciBoZWlnaHQgd2hlbiB2aXJ0dWFsIHNpemUgY2hhbmdlc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDp2aXJ0dWFsLXNpemUtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlPy5pdGVtc0NvbnRhaW5lciAmJlxuICAgICAgICAgIGRhdGEudG90YWxWaXJ0dWFsU2l6ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuaXRlbXNDb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gYCR7ZGF0YS50b3RhbFZpcnR1YWxTaXplfXB4YDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZW1wbGF0ZSBoZWxwZXJzXG4gICAgY29uc3QgZ2V0RGVmYXVsdFRlbXBsYXRlID0gKCkgPT4gKGl0ZW06IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgLy8gVXNlIGxheW91dCBzeXN0ZW0gZm9yIGRlZmF1bHQgdGVtcGxhdGVcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0YWc6IFwiZGl2XCIsXG4gICAgICAgICAgY2xhc3M6IFwidmlld3BvcnQtaXRlbVwiLFxuICAgICAgICAgIHRleHQ6XG4gICAgICAgICAgICB0eXBlb2YgaXRlbSA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgICA/IGl0ZW0ubmFtZSB8fCBpdGVtLmxhYmVsIHx8IGl0ZW0udGV4dCB8fCBgSXRlbSAke2luZGV4fWBcbiAgICAgICAgICAgICAgOiBTdHJpbmcoaXRlbSksXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH07XG5cbiAgICAvLyBQcm9jZXNzIGxheW91dCBzY2hlbWEgd2l0aCBpdGVtIGRhdGEgc3Vic3RpdHV0aW9uXG4gICAgY29uc3QgcHJvY2Vzc0xheW91dFNjaGVtYSA9IChcbiAgICAgIHNjaGVtYTogYW55LFxuICAgICAgaXRlbTogYW55LFxuICAgICAgaW5kZXg6IG51bWJlcixcbiAgICApOiBhbnkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBzY2hlbWEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgLy8gSGFuZGxlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbiBsaWtlIHt7bmFtZX19LCB7e2luZGV4fX1cbiAgICAgICAgcmV0dXJuIHNjaGVtYS5yZXBsYWNlKC9cXHtcXHsoW159XSspXFx9XFx9L2csIChtYXRjaCwga2V5KSA9PiB7XG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJpbmRleFwiKSByZXR1cm4gU3RyaW5nKGluZGV4KTtcbiAgICAgICAgICBpZiAoa2V5ID09PSBcIml0ZW1cIikgcmV0dXJuIFN0cmluZyhpdGVtKTtcblxuICAgICAgICAgIC8vIEhhbmRsZSBuZXN0ZWQgcHJvcGVydGllcyBsaWtlIHt7dXNlci5uYW1lfX1cbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGtleS5zcGxpdChcIi5cIikucmVkdWNlKChvYmo6IGFueSwgcHJvcDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gb2JqPy5bcHJvcC50cmltKCldO1xuICAgICAgICAgIH0sIGl0ZW0pO1xuXG4gICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgPyBTdHJpbmcodmFsdWUpIDogbWF0Y2g7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEpKSB7XG4gICAgICAgIHJldHVybiBzY2hlbWEubWFwKChjaGlsZCkgPT4gcHJvY2Vzc0xheW91dFNjaGVtYShjaGlsZCwgaXRlbSwgaW5kZXgpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBzY2hlbWEgPT09IFwib2JqZWN0XCIgJiYgc2NoZW1hICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHByb2Nlc3NlZDogYW55ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNjaGVtYSkpIHtcbiAgICAgICAgICBwcm9jZXNzZWRba2V5XSA9IHByb2Nlc3NMYXlvdXRTY2hlbWEodmFsdWUsIGl0ZW0sIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvY2Vzc2VkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2NoZW1hO1xuICAgIH07XG5cbiAgICAvLyBQb3NpdGlvbiBjYWxjdWxhdGlvblxuICAgIGNvbnN0IGNhbGN1bGF0ZUl0ZW1Qb3NpdGlvbiA9IChcbiAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICBzY3JvbGxQb3NpdGlvbjogbnVtYmVyLFxuICAgICAgdG90YWxJdGVtczogbnVtYmVyLFxuICAgICAgaXRlbVNpemU6IG51bWJlcixcbiAgICAgIHZpcnR1YWxUb3RhbFNpemU6IG51bWJlcixcbiAgICAgIGNvbnRhaW5lclNpemU6IG51bWJlcixcbiAgICAgIHRhcmdldFNjcm9sbEluZGV4PzogbnVtYmVyLFxuICAgICk6IG51bWJlciA9PiB7XG4gICAgICBjb25zdCBhY3R1YWxUb3RhbFNpemUgPSB0b3RhbEl0ZW1zICogaXRlbVNpemU7XG4gICAgICBjb25zdCBpc0NvbXByZXNzZWQgPVxuICAgICAgICBhY3R1YWxUb3RhbFNpemUgPiB2aXJ0dWFsVG90YWxTaXplICYmIHZpcnR1YWxUb3RhbFNpemUgPiAwO1xuXG4gICAgICAvLyBJZiB3ZSBoYXZlIGEgdGFyZ2V0U2Nyb2xsSW5kZXggKGZyb20gaW5pdGlhbFNjcm9sbEluZGV4KSwgdXNlIGl0IGRpcmVjdGx5XG4gICAgICAvLyBUaGlzIGVuc3VyZXMgaXRlbXMgYXJlIHBvc2l0aW9uZWQgY29ycmVjdGx5IGV2ZW4gd2l0aCBjb21wcmVzc2lvblxuICAgICAgaWYgKHRhcmdldFNjcm9sbEluZGV4ICE9PSB1bmRlZmluZWQgJiYgdGFyZ2V0U2Nyb2xsSW5kZXggPiAwKSB7XG4gICAgICAgIC8vIFBvc2l0aW9uIGl0ZW1zIHJlbGF0aXZlIHRvIHRoZSB0YXJnZXQgaW5kZXhcbiAgICAgICAgLy8gVGhlIHRhcmdldCBpbmRleCBzaG91bGQgYXBwZWFyIGF0IHRoZSB0b3Agb2YgdGhlIHZpZXdwb3J0XG4gICAgICAgIHJldHVybiAoaW5kZXggLSB0YXJnZXRTY3JvbGxJbmRleCkgKiBpdGVtU2l6ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc0NvbXByZXNzZWQgfHwgdG90YWxJdGVtcyA9PT0gMCkge1xuICAgICAgICByZXR1cm4gaW5kZXggKiBpdGVtU2l6ZSAtIHNjcm9sbFBvc2l0aW9uO1xuICAgICAgfVxuXG4gICAgICAvLyBDb21wcmVzc2VkIHNwYWNlIGhhbmRsaW5nXG4gICAgICBjb25zdCBtYXhTY3JvbGxQb3NpdGlvbiA9IHZpcnR1YWxUb3RhbFNpemUgLSBjb250YWluZXJTaXplO1xuICAgICAgY29uc3QgZGlzdGFuY2VGcm9tQm90dG9tID0gbWF4U2Nyb2xsUG9zaXRpb24gLSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgIGNvbnN0IG5lYXJCb3R0b21UaHJlc2hvbGQgPSBjb250YWluZXJTaXplO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGRpc3RhbmNlRnJvbUJvdHRvbSA8PSBuZWFyQm90dG9tVGhyZXNob2xkICYmXG4gICAgICAgIGRpc3RhbmNlRnJvbUJvdHRvbSA+PSAtMVxuICAgICAgKSB7XG4gICAgICAgIC8vIE5lYXIgYm90dG9tIGludGVycG9sYXRpb25cbiAgICAgICAgY29uc3QgaXRlbXNBdEJvdHRvbSA9IE1hdGguZmxvb3IoY29udGFpbmVyU2l6ZSAvIGl0ZW1TaXplKTtcbiAgICAgICAgY29uc3QgZmlyc3RWaXNpYmxlQXRCb3R0b20gPSBNYXRoLm1heCgwLCB0b3RhbEl0ZW1zIC0gaXRlbXNBdEJvdHRvbSk7XG4gICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsVG90YWxTaXplO1xuICAgICAgICBjb25zdCBleGFjdFNjcm9sbEluZGV4ID0gc2Nyb2xsUmF0aW8gKiB0b3RhbEl0ZW1zO1xuICAgICAgICBjb25zdCBpbnRlcnBvbGF0aW9uID0gTWF0aC5tYXgoXG4gICAgICAgICAgMCxcbiAgICAgICAgICBNYXRoLm1pbigxLCAxIC0gZGlzdGFuY2VGcm9tQm90dG9tIC8gbmVhckJvdHRvbVRocmVzaG9sZCksXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgYm90dG9tUG9zaXRpb24gPSAoaW5kZXggLSBmaXJzdFZpc2libGVBdEJvdHRvbSkgKiBpdGVtU2l6ZTtcbiAgICAgICAgY29uc3Qgbm9ybWFsUG9zaXRpb24gPSAoaW5kZXggLSBleGFjdFNjcm9sbEluZGV4KSAqIGl0ZW1TaXplO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG5vcm1hbFBvc2l0aW9uICsgKGJvdHRvbVBvc2l0aW9uIC0gbm9ybWFsUG9zaXRpb24pICogaW50ZXJwb2xhdGlvblxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBOb3JtYWwgY29tcHJlc3NlZCBzY3JvbGxpbmdcbiAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsVG90YWxTaXplO1xuICAgICAgcmV0dXJuIChpbmRleCAtIHNjcm9sbFJhdGlvICogdG90YWxJdGVtcykgKiBpdGVtU2l6ZTtcbiAgICB9O1xuXG4gICAgLy8gUmVuZGVyIHNpbmdsZSBpdGVtXG4gICAgY29uc3QgcmVuZGVySXRlbSA9IChpdGVtOiBhbnksIGluZGV4OiBudW1iZXIpOiBIVE1MRWxlbWVudCB8IG51bGwgPT4ge1xuICAgICAgY29uc3QgaXRlbVRlbXBsYXRlID0gdGVtcGxhdGUgfHwgZ2V0RGVmYXVsdFRlbXBsYXRlKCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGl0ZW1UZW1wbGF0ZShpdGVtLCBpbmRleCk7XG4gICAgICAgIGxldCBlbGVtZW50OiBIVE1MRWxlbWVudDtcblxuICAgICAgICAvLyBDaGVjayBpZiByZXN1bHQgaXMgYSBsYXlvdXQgc2NoZW1hIChhcnJheSBvciBvYmplY3QpXG4gICAgICAgIGlmIChcbiAgICAgICAgICBBcnJheS5pc0FycmF5KHJlc3VsdCkgfHxcbiAgICAgICAgICAodHlwZW9mIHJlc3VsdCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgcmVzdWx0ICE9PSBudWxsICYmXG4gICAgICAgICAgICAhKHJlc3VsdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gUHJvY2VzcyBzY2hlbWEgdG8gc3Vic3RpdHV0ZSB2YXJpYWJsZXNcbiAgICAgICAgICBjb25zdCBwcm9jZXNzZWRTY2hlbWEgPSBwcm9jZXNzTGF5b3V0U2NoZW1hKHJlc3VsdCwgaXRlbSwgaW5kZXgpO1xuXG4gICAgICAgICAgLy8gVXNlIGxheW91dCBzeXN0ZW0gdG8gY3JlYXRlIGVsZW1lbnRcbiAgICAgICAgICBjb25zdCBsYXlvdXRSZXN1bHQgPSBjcmVhdGVMYXlvdXQocHJvY2Vzc2VkU2NoZW1hKTtcbiAgICAgICAgICBlbGVtZW50ID0gbGF5b3V0UmVzdWx0LmVsZW1lbnQ7XG5cbiAgICAgICAgICAvLyBJZiB0aGUgbGF5b3V0IGNyZWF0ZWQgYSB3cmFwcGVyLCB1c2UgaXQgZGlyZWN0bHlcbiAgICAgICAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAvLyBFbGVtZW50IGlzIGFscmVhZHkgY3JlYXRlZCBieSBsYXlvdXQgc3lzdGVtXG4gICAgICAgICAgICAvLyBTdG9yZSBsYXlvdXRSZXN1bHQgZm9yIGNsZWFudXAgd2hlbiBlbGVtZW50IGlzIHJlbGVhc2VkIChwcmV2ZW50cyBtZW1vcnkgbGVhaylcbiAgICAgICAgICAgIGxheW91dFJlc3VsdHMuc2V0KGVsZW1lbnQsIGxheW91dFJlc3VsdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZhbGxiYWNrIGlmIGxheW91dCBkaWRuJ3QgY3JlYXRlIGEgcHJvcGVyIGVsZW1lbnRcbiAgICAgICAgICAgIGVsZW1lbnQgPSBnZXRQb29sZWRFbGVtZW50KCk7XG4gICAgICAgICAgICBpZiAobGF5b3V0UmVzdWx0LmVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChsYXlvdXRSZXN1bHQuZWxlbWVudCk7XG4gICAgICAgICAgICAgIC8vIFN0b3JlIGxheW91dFJlc3VsdCBvbiB3cmFwcGVyIGVsZW1lbnQgZm9yIGNsZWFudXBcbiAgICAgICAgICAgICAgbGF5b3V0UmVzdWx0cy5zZXQoZWxlbWVudCwgbGF5b3V0UmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlc3VsdCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIC8vIFBhcnNlIEhUTUwgdXNpbmcgdGVtcGxhdGUgZWxlbWVudCAtIG9wdGltaXplZCBwYXRoXG4gICAgICAgICAgLy8gTW92ZSBub2RlcyBkaXJlY3RseSBpbnN0ZWFkIG9mIGNsb25pbmcgLSBtdWNoIGZhc3Rlciwgbm8gbWVtb3J5IG92ZXJoZWFkXG4gICAgICAgICAgdGVtcGxhdGVQYXJzZXIuaW5uZXJIVE1MID0gcmVzdWx0O1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSB0ZW1wbGF0ZVBhcnNlci5jb250ZW50O1xuXG4gICAgICAgICAgaWYgKGNvbnRlbnQuY2hpbGRyZW4ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAvLyBTaW5nbGUgcm9vdCBlbGVtZW50IC0gbW92ZSBkaXJlY3RseSAoZmFzdGVyIHRoYW4gY2xvbmVOb2RlKVxuICAgICAgICAgICAgZWxlbWVudCA9IGNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBjb250ZW50LnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xuICAgICAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgXCJtdHJsLXZpZXdwb3J0LWl0ZW1cIik7XG4gICAgICAgICAgICBpZiAoaXNQbGFjZWhvbGRlcihpdGVtKSkge1xuICAgICAgICAgICAgICBhZGRDbGFzcyhlbGVtZW50LCBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuQ0xBU1MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBNdWx0aXBsZSBjaGlsZHJlbiAtIG1vdmUgYWxsIGludG8gcG9vbGVkIGVsZW1lbnRcbiAgICAgICAgICAgIGVsZW1lbnQgPSBnZXRQb29sZWRFbGVtZW50KCk7XG4gICAgICAgICAgICB3aGlsZSAoY29udGVudC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY29udGVudC5maXJzdENoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgICBlbGVtZW50ID0gZ2V0UG9vbGVkRWxlbWVudCgpO1xuICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtSZW5kZXJpbmddIEludmFsaWQgdGVtcGxhdGUgcmVzdWx0IGZvciBpdGVtICR7aW5kZXh9YCk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgY2xhc3Nlc1xuICAgICAgICBpZiAoIWhhc0NsYXNzKGVsZW1lbnQsIFwidmlld3BvcnQtaXRlbVwiKSlcbiAgICAgICAgICBhZGRDbGFzcyhlbGVtZW50LCBcInZpZXdwb3J0LWl0ZW1cIik7XG4gICAgICAgIGlmIChpc1BsYWNlaG9sZGVyKGl0ZW0pKSB7XG4gICAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLkNMQVNTKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnQuZGF0YXNldC5pbmRleCA9IFN0cmluZyhpbmRleCk7XG5cbiAgICAgICAgLy8gQ29weSBkYXRhLWlkIGZyb20gaXRlbSB0byB2aWV3cG9ydCBlbGVtZW50IGZvciBzZWxlY3Rpb24gc3VwcG9ydFxuICAgICAgICBjb25zdCBpdGVtSWQgPSBpdGVtPy5faWQgfHwgaXRlbT8uaWQ7XG4gICAgICAgIGlmIChpdGVtSWQgIT09IHVuZGVmaW5lZCAmJiBpdGVtSWQgIT09IG51bGwpIHtcbiAgICAgICAgICBlbGVtZW50LmRhdGFzZXQuaWQgPSBTdHJpbmcoaXRlbUlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFtSZW5kZXJpbmddIEVycm9yIHJlbmRlcmluZyBpdGVtICR7aW5kZXh9OmAsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSBwb3NpdGlvbnNcbiAgICBjb25zdCB1cGRhdGVJdGVtUG9zaXRpb25zID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlIHx8IHJlbmRlcmVkRWxlbWVudHMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB7XG4gICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICBpdGVtU2l6ZTogaXRlbVNpemUsXG4gICAgICAgIHRvdGFsSXRlbXMsXG4gICAgICAgIHZpcnR1YWxUb3RhbFNpemUsXG4gICAgICAgIGNvbnRhaW5lclNpemUsXG4gICAgICB9ID0gdmlld3BvcnRTdGF0ZTtcbiAgICAgIGNvbnN0IGFjdHVhbFRvdGFsU2l6ZSA9IHRvdGFsSXRlbXMgKiBpdGVtU2l6ZTtcbiAgICAgIGNvbnN0IGlzQ29tcHJlc3NlZCA9XG4gICAgICAgIGFjdHVhbFRvdGFsU2l6ZSA+IHZpcnR1YWxUb3RhbFNpemUgJiYgdmlydHVhbFRvdGFsU2l6ZSA+IDA7XG5cbiAgICAgIGNvbnN0IHNvcnRlZEluZGljZXMgPSBBcnJheS5mcm9tKHJlbmRlcmVkRWxlbWVudHMua2V5cygpKS5zb3J0KFxuICAgICAgICAoYSwgYikgPT4gYSAtIGIsXG4gICAgICApO1xuICAgICAgaWYgKCFzb3J0ZWRJbmRpY2VzLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBmaXJzdEluZGV4ID0gc29ydGVkSW5kaWNlc1swXTtcbiAgICAgIGxldCBjdXJyZW50UG9zaXRpb24gPSAwO1xuXG4gICAgICBpZiAoaXNDb21wcmVzc2VkKSB7XG4gICAgICAgIGNvbnN0IG1heFNjcm9sbCA9IHZpcnR1YWxUb3RhbFNpemUgLSBjb250YWluZXJTaXplO1xuICAgICAgICBjb25zdCBkaXN0YW5jZUZyb21Cb3R0b20gPSBtYXhTY3JvbGwgLSBzY3JvbGxQb3NpdGlvbjtcblxuICAgICAgICBpZiAoZGlzdGFuY2VGcm9tQm90dG9tIDw9IGNvbnRhaW5lclNpemUgJiYgZGlzdGFuY2VGcm9tQm90dG9tID49IC0xKSB7XG4gICAgICAgICAgLy8gTmVhciBib3R0b20gaW50ZXJwb2xhdGlvblxuICAgICAgICAgIGNvbnN0IGl0ZW1zQXRCb3R0b20gPSBNYXRoLmZsb29yKGNvbnRhaW5lclNpemUgLyBpdGVtU2l6ZSk7XG4gICAgICAgICAgY29uc3QgZmlyc3RWaXNpYmxlQXRCb3R0b20gPSBNYXRoLm1heCgwLCB0b3RhbEl0ZW1zIC0gaXRlbXNBdEJvdHRvbSk7XG4gICAgICAgICAgY29uc3Qgc2Nyb2xsUmF0aW8gPSBzY3JvbGxQb3NpdGlvbiAvIHZpcnR1YWxUb3RhbFNpemU7XG4gICAgICAgICAgY29uc3QgZXhhY3RTY3JvbGxJbmRleCA9IHNjcm9sbFJhdGlvICogdG90YWxJdGVtcztcbiAgICAgICAgICBjb25zdCBpbnRlcnBvbGF0aW9uID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgTWF0aC5taW4oMSwgMSAtIGRpc3RhbmNlRnJvbUJvdHRvbSAvIGNvbnRhaW5lclNpemUpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBib3R0b21Qb3MgPSAoZmlyc3RJbmRleCAtIGZpcnN0VmlzaWJsZUF0Qm90dG9tKSAqIGl0ZW1TaXplO1xuICAgICAgICAgIGNvbnN0IG5vcm1hbFBvcyA9IChmaXJzdEluZGV4IC0gZXhhY3RTY3JvbGxJbmRleCkgKiBpdGVtU2l6ZTtcbiAgICAgICAgICBjdXJyZW50UG9zaXRpb24gPSBub3JtYWxQb3MgKyAoYm90dG9tUG9zIC0gbm9ybWFsUG9zKSAqIGludGVycG9sYXRpb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgc2Nyb2xsUmF0aW8gPSBzY3JvbGxQb3NpdGlvbiAvIHZpcnR1YWxUb3RhbFNpemU7XG4gICAgICAgICAgY3VycmVudFBvc2l0aW9uID0gKGZpcnN0SW5kZXggLSBzY3JvbGxSYXRpbyAqIHRvdGFsSXRlbXMpICogaXRlbVNpemU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnRQb3NpdGlvbiA9IGZpcnN0SW5kZXggKiBpdGVtU2l6ZSAtIHNjcm9sbFBvc2l0aW9uO1xuICAgICAgfVxuXG4gICAgICAvLyBQb3NpdGlvbiBlYWNoIGl0ZW1cbiAgICAgIHNvcnRlZEluZGljZXMuZm9yRWFjaCgoaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGluZGV4KTtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICBlbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKCR7TWF0aC5yb3VuZChcbiAgICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbixcbiAgICAgICAgICApfXB4KWA7XG5cbiAgICAgICAgICAvLyBTdHJhdGVnaWMgbG9nIGZvciBsYXN0IGl0ZW1zXG4gICAgICAgICAgLy8gaWYgKGluZGV4ID49IHRvdGFsSXRlbXMgLSA1KSB7XG4gICAgICAgICAgLy8gICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgICAgYFtSZW5kZXJpbmddIExhc3QgaXRlbSBwb3NpdGlvbmVkOiBpbmRleD0ke2luZGV4fSwgcG9zaXRpb249JHtNYXRoLnJvdW5kKFxuICAgICAgICAgIC8vICAgICAgIGN1cnJlbnRQb3NpdGlvblxuICAgICAgICAgIC8vICAgICApfXB4LCBpdGVtU2l6ZT0ke2l0ZW1TaXplfXB4LCB0b3RhbEl0ZW1zPSR7dG90YWxJdGVtc31gXG4gICAgICAgICAgLy8gICApO1xuICAgICAgICAgIC8vIH1cblxuICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbiArPSBpdGVtU2l6ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIE1haW4gcmVuZGVyIGZ1bmN0aW9uXG4gICAgY29uc3QgcmVuZGVySXRlbXMgPSAoKSA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGU/Lml0ZW1zQ29udGFpbmVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qge1xuICAgICAgICB2aXNpYmxlUmFuZ2UsXG4gICAgICAgIGl0ZW1zQ29udGFpbmVyLFxuICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICBpdGVtU2l6ZSxcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgIGNvbnRhaW5lclNpemUsXG4gICAgICAgIHZpcnR1YWxUb3RhbFNpemUsXG4gICAgICB9ID0gdmlld3BvcnRTdGF0ZTtcblxuICAgICAgLy8gVmFsaWRhdGUgcmFuZ2UgLSBza2lwIHJlbmRlcmluZyBpZiBubyBpdGVtcyBvciByYW5nZSBpcyBpbnZhbGlkXG4gICAgICBpZiAoXG4gICAgICAgICF2aXNpYmxlUmFuZ2UgfHxcbiAgICAgICAgdG90YWxJdGVtcyA8PSAwIHx8XG4gICAgICAgIHZpc2libGVSYW5nZS5zdGFydCA8IDAgfHxcbiAgICAgICAgdmlzaWJsZVJhbmdlLnN0YXJ0ID49IHRvdGFsSXRlbXMgfHxcbiAgICAgICAgdmlzaWJsZVJhbmdlLmVuZCA8IHZpc2libGVSYW5nZS5zdGFydCB8fFxuICAgICAgICBpc05hTih2aXNpYmxlUmFuZ2Uuc3RhcnQpIHx8XG4gICAgICAgIGlzTmFOKHZpc2libGVSYW5nZS5lbmQpXG4gICAgICApIHtcbiAgICAgICAgLy8gSWYgdG90YWxJdGVtcyBpcyAwLCBjbGVhciBhbGwgcmVuZGVyZWQgZWxlbWVudHMgdG8gcmVtb3ZlIHN0YWxlIHBsYWNlaG9sZGVyc1xuICAgICAgICBpZiAodG90YWxJdGVtcyA8PSAwICYmIHJlbmRlcmVkRWxlbWVudHMuc2l6ZSA+IDApIHtcbiAgICAgICAgICBBcnJheS5mcm9tKHJlbmRlcmVkRWxlbWVudHMuZW50cmllcygpKS5mb3JFYWNoKChbaW5kZXgsIGVsZW1lbnRdKSA9PiB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5wYXJlbnROb2RlKSByZWxlYXNlRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuZGVsZXRlKGluZGV4KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjdXJyZW50VmlzaWJsZVJhbmdlID0geyBzdGFydDogLTEsIGVuZDogLTEgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHJhbmdlIGNoYW5nZWRcbiAgICAgIGlmIChcbiAgICAgICAgdmlzaWJsZVJhbmdlLnN0YXJ0ID09PSBjdXJyZW50VmlzaWJsZVJhbmdlLnN0YXJ0ICYmXG4gICAgICAgIHZpc2libGVSYW5nZS5lbmQgPT09IGN1cnJlbnRWaXNpYmxlUmFuZ2UuZW5kICYmXG4gICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2l6ZSA+IDBcbiAgICAgICkge1xuICAgICAgICB1cGRhdGVJdGVtUG9zaXRpb25zKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGFzdFJlbmRlclRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgcmVuZGVyU3RhcnQgPSBNYXRoLm1heCgwLCB2aXNpYmxlUmFuZ2Uuc3RhcnQgLSBvdmVyc2Nhbik7XG4gICAgICBjb25zdCByZW5kZXJFbmQgPSBNYXRoLm1pbih0b3RhbEl0ZW1zIC0gMSwgdmlzaWJsZVJhbmdlLmVuZCArIG92ZXJzY2FuKTtcblxuICAgICAgLy8gaWYgKGlzUmVtb3ZpbmdJdGVtKSB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICAgIGBbUkVOREVSLUZJWF0gcmVuZGVySXRlbXMgY2FsYzogdmlzaWJsZVJhbmdlPSR7SlNPTi5zdHJpbmdpZnkodmlzaWJsZVJhbmdlKX0sIG92ZXJzY2FuPSR7b3ZlcnNjYW59LCB0b3RhbEl0ZW1zPSR7dG90YWxJdGVtc31gLFxuICAgICAgLy8gICApO1xuICAgICAgLy8gICBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgICBgW1JFTkRFUi1GSVhdIHJlbmRlckl0ZW1zIGNhbGM6IHJlbmRlclN0YXJ0PSR7cmVuZGVyU3RhcnR9LCByZW5kZXJFbmQ9JHtyZW5kZXJFbmR9YCxcbiAgICAgIC8vICAgKTtcbiAgICAgIC8vIH1cblxuICAgICAgLy8gUmVtb3ZlIGl0ZW1zIG91dHNpZGUgcmFuZ2VcbiAgICAgIEFycmF5LmZyb20ocmVuZGVyZWRFbGVtZW50cy5lbnRyaWVzKCkpXG4gICAgICAgIC5maWx0ZXIoKFtpbmRleF0pID0+IGluZGV4IDwgcmVuZGVyU3RhcnQgfHwgaW5kZXggPiByZW5kZXJFbmQpXG4gICAgICAgIC5mb3JFYWNoKChbaW5kZXgsIGVsZW1lbnRdKSA9PiB7XG4gICAgICAgICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSkgcmVsZWFzZUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5kZWxldGUoaW5kZXgpO1xuICAgICAgICB9KTtcblxuICAgICAgLy8gR2V0IGl0ZW1zIHNvdXJjZVxuICAgICAgY29uc3QgaGFzQ29sbGVjdGlvbkl0ZW1zID0gT2JqZWN0LmtleXMoY29sbGVjdGlvbkl0ZW1zKS5sZW5ndGggPiAwO1xuICAgICAgY29uc3QgaXRlbXMgPSBoYXNDb2xsZWN0aW9uSXRlbXNcbiAgICAgICAgPyBjb2xsZWN0aW9uSXRlbXNcbiAgICAgICAgOiBjb21wb25lbnQuaXRlbXMgfHwgW107XG4gICAgICBjb25zdCBtaXNzaW5nSXRlbXM6IG51bWJlcltdID0gW107XG5cbiAgICAgIC8vIENvbGxlY3QgbmV3IGVsZW1lbnRzIHRvIGluc2VydCAoaW5kZXggLT4gZWxlbWVudClcbiAgICAgIGNvbnN0IG5ld0VsZW1lbnRzOiBBcnJheTxbbnVtYmVyLCBIVE1MRWxlbWVudF0+ID0gW107XG5cbiAgICAgIC8vIFJlbmRlciBpdGVtcyBpbiByYW5nZVxuICAgICAgZm9yIChsZXQgaSA9IHJlbmRlclN0YXJ0OyBpIDw9IHJlbmRlckVuZDsgaSsrKSB7XG4gICAgICAgIGlmIChpIDwgMCB8fCBpID49IHRvdGFsSXRlbXMgfHwgcmVuZGVyZWRFbGVtZW50cy5oYXMoaSkpIGNvbnRpbnVlO1xuXG4gICAgICAgIGxldCBpdGVtID0gaXRlbXNbaV07XG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgIC8vIE9ubHkgbG9nIGR1cmluZyByZW1vdmFsIHRvIGF2b2lkIHNwYW0gZHVyaW5nIHNjcm9sbFxuXG4gICAgICAgICAgbWlzc2luZ0l0ZW1zLnB1c2goaSk7XG4gICAgICAgICAgLy8gR2VuZXJhdGUgcGxhY2Vob2xkZXJcbiAgICAgICAgICBjb25zdCBwbGFjZWhvbGRlcnMgPSAoY29tcG9uZW50IGFzIGFueSkucGxhY2Vob2xkZXJzO1xuICAgICAgICAgIGl0ZW0gPSBwbGFjZWhvbGRlcnM/LmdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtKGkpIHx8IHtcbiAgICAgICAgICAgIF9wbGFjZWhvbGRlcjogdHJ1ZSxcbiAgICAgICAgICAgIGluZGV4OiBpLFxuICAgICAgICAgICAgaWQ6IGBwbGFjZWhvbGRlci0ke2l9YCxcbiAgICAgICAgICAgIG5hbWU6IFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVNLX0NIQVJBQ1RFUi5yZXBlYXQoMTUpLFxuICAgICAgICAgICAgdGV4dDogVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLk1BU0tfQ0hBUkFDVEVSLnJlcGVhdCgyNSksXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLk1BU0tfQ0hBUkFDVEVSLnJlcGVhdCg0MCksXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb2xsZWN0aW9uSXRlbXNbaV0gPSBpdGVtO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHJlbmRlckl0ZW0oaXRlbSwgaSk7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgLy8gR2V0IHRhcmdldFNjcm9sbEluZGV4IGZyb20gdmlld3BvcnRTdGF0ZSBpZiBhdmFpbGFibGVcbiAgICAgICAgICBjb25zdCB0YXJnZXRTY3JvbGxJbmRleCA9ICh2aWV3cG9ydFN0YXRlIGFzIGFueSk/LnRhcmdldFNjcm9sbEluZGV4O1xuICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gY2FsY3VsYXRlSXRlbVBvc2l0aW9uKFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgICAgdG90YWxJdGVtcyxcbiAgICAgICAgICAgIGl0ZW1TaXplLFxuICAgICAgICAgICAgdmlydHVhbFRvdGFsU2l6ZSxcbiAgICAgICAgICAgIGNvbnRhaW5lclNpemUsXG4gICAgICAgICAgICB0YXJnZXRTY3JvbGxJbmRleCxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCB7XG4gICAgICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlWSgke3Bvc2l0aW9ufXB4KWAsXG4gICAgICAgICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBDb2xsZWN0IGZvciBiYXRjaCBpbnNlcnRpb24gKGlmIG1haW50YWluaW5nIG9yZGVyKSBvciBqdXN0IGFwcGVuZFxuICAgICAgICAgIGlmIChtYWludGFpbkRvbU9yZGVyKSB7XG4gICAgICAgICAgICBuZXdFbGVtZW50cy5wdXNoKFtpLCBlbGVtZW50XSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGl0ZW1zQ29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNldChpLCBlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBCYXRjaCBpbnNlcnQgbmV3IGVsZW1lbnRzIGluIGNvcnJlY3QgRE9NIG9yZGVyIChvbmx5IHdoZW4gbWFpbnRhaW5Eb21PcmRlciBpcyBlbmFibGVkKVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIENTUyBzZWxlY3RvcnMgbGlrZSA6Zmlyc3QtY2hpbGQsIDpudGgtY2hpbGQoKSB3b3JrIGNvcnJlY3RseVxuICAgICAgaWYgKG1haW50YWluRG9tT3JkZXIgJiYgbmV3RWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBTb3J0IG5ldyBlbGVtZW50cyBieSBpbmRleFxuICAgICAgICBuZXdFbGVtZW50cy5zb3J0KChbYV0sIFtiXSkgPT4gYSAtIGIpO1xuXG4gICAgICAgIC8vIEdldCBleGlzdGluZyBET00gY2hpbGRyZW4gc29ydGVkIGJ5IHRoZWlyIGRhdGEtaW5kZXhcbiAgICAgICAgY29uc3QgZXhpc3RpbmdDaGlsZHJlbiA9IEFycmF5LmZyb20oXG4gICAgICAgICAgaXRlbXNDb250YWluZXIuY2hpbGRyZW4sXG4gICAgICAgICkgYXMgSFRNTEVsZW1lbnRbXTtcblxuICAgICAgICAvLyBNZXJnZSBuZXcgZWxlbWVudHMgaW50byBjb3JyZWN0IHBvc2l0aW9uc1xuICAgICAgICBsZXQgbmV3SWR4ID0gMDtcbiAgICAgICAgbGV0IGV4aXN0aW5nSWR4ID0gMDtcblxuICAgICAgICB3aGlsZSAobmV3SWR4IDwgbmV3RWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgW25ld0luZGV4LCBuZXdFbGVtZW50XSA9IG5ld0VsZW1lbnRzW25ld0lkeF07XG5cbiAgICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBleGlzdGluZyBjaGlsZCB3aXRoIGluZGV4ID4gbmV3SW5kZXhcbiAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICBleGlzdGluZ0lkeCA8IGV4aXN0aW5nQ2hpbGRyZW4ubGVuZ3RoICYmXG4gICAgICAgICAgICBwYXJzZUludChleGlzdGluZ0NoaWxkcmVuW2V4aXN0aW5nSWR4XS5kYXRhc2V0LmluZGV4IHx8IFwiLTFcIiwgMTApIDxcbiAgICAgICAgICAgICAgbmV3SW5kZXhcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGV4aXN0aW5nSWR4Kys7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGV4aXN0aW5nSWR4IDwgZXhpc3RpbmdDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIEluc2VydCBiZWZvcmUgdGhlIGV4aXN0aW5nIGNoaWxkXG4gICAgICAgICAgICBpdGVtc0NvbnRhaW5lci5pbnNlcnRCZWZvcmUoXG4gICAgICAgICAgICAgIG5ld0VsZW1lbnQsXG4gICAgICAgICAgICAgIGV4aXN0aW5nQ2hpbGRyZW5bZXhpc3RpbmdJZHhdLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQXBwZW5kIGF0IHRoZSBlbmRcbiAgICAgICAgICAgIGl0ZW1zQ29udGFpbmVyLmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXdJZHgrKztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBSZXF1ZXN0IG1pc3NpbmcgaXRlbXNcbiAgICAgIGlmIChcbiAgICAgICAgbWlzc2luZ0l0ZW1zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uPy5sb2FkTWlzc2luZ1Jhbmdlc1xuICAgICAgKSB7XG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmxvYWRNaXNzaW5nUmFuZ2VzKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHN0YXJ0OiBNYXRoLm1pbiguLi5taXNzaW5nSXRlbXMpLFxuICAgICAgICAgICAgZW5kOiBNYXRoLm1heCguLi5taXNzaW5nSXRlbXMpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZW5kZXJpbmc6bWlzc2luZy1pdGVtc1wiLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50VmlzaWJsZVJhbmdlID0gdmlzaWJsZVJhbmdlO1xuXG4gICAgICAvLyBMb2cgRE9NIHN0YXRzIHBlcmlvZGljYWxseSAoZXZlcnkgMTAgcmVuZGVycylcbiAgICAgIGlmIChwb29sU3RhdHMuY3JlYXRlZCAlIDUwID09PSAwICYmIHBvb2xTdGF0cy5jcmVhdGVkID4gMCkge1xuICAgICAgICBsb2dET01TdGF0cyhgcmVuZGVyOiR7cG9vbFN0YXRzLmNyZWF0ZWR9YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVtaXQgaXRlbXMgcmVuZGVyZWQgZXZlbnQgd2l0aCBlbGVtZW50cyBmb3Igc2l6ZSBjYWxjdWxhdGlvblxuICAgICAgY29uc3QgcmVuZGVyZWRFbGVtZW50c0FycmF5ID0gQXJyYXkuZnJvbShyZW5kZXJlZEVsZW1lbnRzLnZhbHVlcygpKTtcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDppdGVtcy1yZW5kZXJlZFwiLCB7XG4gICAgICAgIGVsZW1lbnRzOiByZW5kZXJlZEVsZW1lbnRzQXJyYXksXG4gICAgICAgIHJhbmdlOiB2aXNpYmxlUmFuZ2UsXG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnJlbmRlcmVkXCIsIHtcbiAgICAgICAgcmFuZ2U6IHZpc2libGVSYW5nZSxcbiAgICAgICAgcmVuZGVyZWRDb3VudDogcmVuZGVyZWRFbGVtZW50cy5zaXplLFxuICAgICAgfSk7XG4gICAgICB1cGRhdGVJdGVtUG9zaXRpb25zKCk7XG5cbiAgICAgIC8vIExvYWQgZGF0YSBpZiBubyBpdGVtcyByZW5kZXJlZFxuICAgICAgaWYgKFxuICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNpemUgPT09IDAgJiZcbiAgICAgICAgdG90YWxJdGVtcyA+IDAgJiZcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uXG4gICAgICApIHtcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24ubG9hZE1pc3NpbmdSYW5nZXMoXG4gICAgICAgICAgdmlzaWJsZVJhbmdlLFxuICAgICAgICAgIFwicmVuZGVyaW5nOm5vLWl0ZW1zXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEV4dGVuZCB2aWV3cG9ydCBBUElcbiAgICBjb25zdCBvcmlnaW5hbFJlbmRlckl0ZW1zID0gY29tcG9uZW50LnZpZXdwb3J0LnJlbmRlckl0ZW1zO1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcyA9ICgpID0+IHtcbiAgICAgIHJlbmRlckl0ZW1zKCk7XG4gICAgICBvcmlnaW5hbFJlbmRlckl0ZW1zPy4oKTtcbiAgICB9O1xuXG4gICAgLy8gQ2xlYW51cFxuICAgIHdyYXBEZXN0cm95KGNvbXBvbmVudCwgKCkgPT4ge1xuICAgICAgLy8gUmVsZWFzZSBhbGwgcmVuZGVyZWQgZWxlbWVudHMgLSB1c2UgcmVsZWFzZUVsZW1lbnQgdG8gcHJvcGVybHkgZGVzdHJveSBsYXlvdXRSZXN1bHRzXG4gICAgICByZW5kZXJlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgcmVsZWFzZUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICB9KTtcbiAgICAgIHJlbmRlcmVkRWxlbWVudHMuY2xlYXIoKTtcblxuICAgICAgLy8gQ2xlYXIgZWxlbWVudCBwb29sXG4gICAgICBlbGVtZW50UG9vbC5sZW5ndGggPSAwO1xuXG4gICAgICAvLyBDbGVhciBjb2xsZWN0aW9uIGl0ZW1zIGNhY2hlIC0gdGhpcyBpcyBjcml0aWNhbCBmb3IgbWVtb3J5IVxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gY29sbGVjdGlvbkl0ZW1zKSB7XG4gICAgICAgIGRlbGV0ZSBjb2xsZWN0aW9uSXRlbXNba2V5XTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVzZXQgc3RhdGVcbiAgICAgIGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB7IHN0YXJ0OiAtMSwgZW5kOiAtMSB9O1xuICAgICAgdmlld3BvcnRTdGF0ZSA9IG51bGw7XG4gICAgICBsYXN0UmVuZGVyVGltZSA9IDA7XG5cbiAgICAgIC8vIFJlc2V0IHBvb2wgc3RhdHNcbiAgICAgIHBvb2xTdGF0cy5jcmVhdGVkID0gMDtcbiAgICAgIHBvb2xTdGF0cy5yZWN5Y2xlZCA9IDA7XG4gICAgICBwb29sU3RhdHMucG9vbFNpemUgPSAwO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL2V2ZW50cy50c1xuXG4vKipcbiAqIEV2ZW50cyBGZWF0dXJlIC0gQ2VudHJhbGl6ZWQgZXZlbnQgc3lzdGVtIGZvciB2aWV3cG9ydFxuICogUHJvdmlkZXMgZXZlbnQgZW1pc3Npb24gYW5kIHN1YnNjcmlwdGlvbiBmb3IgaW50ZXItZmVhdHVyZSBjb21tdW5pY2F0aW9uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXZlbnRzQ29uZmlnIHtcbiAgZGVidWc/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEV2ZW50cyBmZWF0dXJlIGZvciB2aWV3cG9ydFxuICogQ2VudHJhbGl6ZXMgYWxsIGV2ZW50IGhhbmRsaW5nIGZvciB2aWV3cG9ydCBmZWF0dXJlc1xuICovXG5leHBvcnQgY29uc3Qgd2l0aEV2ZW50cyA9IChjb25maWc6IEV2ZW50c0NvbmZpZyA9IHt9KSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50Pihjb21wb25lbnQ6IFQpOiBUID0+IHtcbiAgICBjb25zdCB7IGRlYnVnID0gZmFsc2UgfSA9IGNvbmZpZztcblxuICAgIC8vIEV2ZW50IGxpc3RlbmVycyBtYXBcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBuZXcgTWFwPHN0cmluZywgU2V0PEZ1bmN0aW9uPj4oKTtcblxuICAgIC8vIEVtaXQgYW4gZXZlbnRcbiAgICBjb25zdCBlbWl0ID0gKGV2ZW50OiBzdHJpbmcsIGRhdGE/OiBhbnkpID0+IHtcbiAgICAgIC8vIGlmIChkZWJ1Zykge1xuICAgICAgLy8gICBjb25zb2xlLmxvZyhgW0V2ZW50c10gRW1pdDogJHtldmVudH1gLCBkYXRhKTtcbiAgICAgIC8vIH1cblxuICAgICAgY29uc3QgZXZlbnRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZ2V0KGV2ZW50KTtcbiAgICAgIGlmIChldmVudExpc3RlbmVycykge1xuICAgICAgICBldmVudExpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsaXN0ZW5lcihkYXRhKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgW0V2ZW50c10gRXJyb3IgaW4gbGlzdGVuZXIgZm9yICR7ZXZlbnR9OmAsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTdWJzY3JpYmUgdG8gYW4gZXZlbnRcbiAgICBjb25zdCBvbiA9IChldmVudDogc3RyaW5nLCBoYW5kbGVyOiBGdW5jdGlvbik6ICgoKSA9PiB2b2lkKSA9PiB7XG4gICAgICBpZiAoIWxpc3RlbmVycy5oYXMoZXZlbnQpKSB7XG4gICAgICAgIGxpc3RlbmVycy5zZXQoZXZlbnQsIG5ldyBTZXQoKSk7XG4gICAgICB9XG5cbiAgICAgIGxpc3RlbmVycy5nZXQoZXZlbnQpIS5hZGQoaGFuZGxlcik7XG5cbiAgICAgIC8vIGlmIChkZWJ1Zykge1xuICAgICAgLy8gICBjb25zb2xlLmxvZyhgW0V2ZW50c10gU3Vic2NyaWJlZCB0bzogJHtldmVudH1gKTtcbiAgICAgIC8vIH1cblxuICAgICAgLy8gUmV0dXJuIHVuc3Vic2NyaWJlIGZ1bmN0aW9uXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb25zdCBldmVudExpc3RlbmVycyA9IGxpc3RlbmVycy5nZXQoZXZlbnQpO1xuICAgICAgICBpZiAoZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgICAgICBldmVudExpc3RlbmVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIGxpc3RlbmVycy5kZWxldGUoZXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgLy8gU3Vic2NyaWJlIHRvIGFuIGV2ZW50IG9uY2VcbiAgICBjb25zdCBvbmNlID0gKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKTogKCgpID0+IHZvaWQpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZWRIYW5kbGVyID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBoYW5kbGVyKGRhdGEpO1xuICAgICAgICBvZmYoZXZlbnQsIHdyYXBwZWRIYW5kbGVyKTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gb24oZXZlbnQsIHdyYXBwZWRIYW5kbGVyKTtcbiAgICB9O1xuXG4gICAgLy8gVW5zdWJzY3JpYmUgZnJvbSBhbiBldmVudFxuICAgIGNvbnN0IG9mZiA9IChldmVudDogc3RyaW5nLCBoYW5kbGVyOiBGdW5jdGlvbikgPT4ge1xuICAgICAgY29uc3QgZXZlbnRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZ2V0KGV2ZW50KTtcbiAgICAgIGlmIChldmVudExpc3RlbmVycykge1xuICAgICAgICBldmVudExpc3RlbmVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIGlmIChldmVudExpc3RlbmVycy5zaXplID09PSAwKSB7XG4gICAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQ2xlYXIgYWxsIGxpc3RlbmVycyBmb3IgYW4gZXZlbnRcbiAgICBjb25zdCBjbGVhciA9IChldmVudD86IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgIGxpc3RlbmVycy5kZWxldGUoZXZlbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGlzdGVuZXJzLmNsZWFyKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEFkZCBldmVudCBtZXRob2RzIHRvIGNvbXBvbmVudFxuICAgIGNvbXBvbmVudC5lbWl0ID0gZW1pdDtcbiAgICBjb21wb25lbnQub24gPSBvbjtcbiAgICBjb21wb25lbnQub25jZSA9IG9uY2U7XG4gICAgY29tcG9uZW50Lm9mZiA9IG9mZjtcblxuICAgIC8vIEFkZCBldmVudHMgQVBJIHRvIHZpZXdwb3J0XG4gICAgKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLmV2ZW50cyA9IHtcbiAgICAgIGVtaXQsXG4gICAgICBvbixcbiAgICAgIG9uY2UsXG4gICAgICBvZmYsXG4gICAgICBjbGVhcixcbiAgICAgIGdldExpc3RlbmVyQ291bnQ6IChldmVudD86IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gbGlzdGVuZXJzLmdldChldmVudCk/LnNpemUgfHwgMDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdG90YWwgPSAwO1xuICAgICAgICBsaXN0ZW5lcnMuZm9yRWFjaCgoc2V0KSA9PiAodG90YWwgKz0gc2V0LnNpemUpKTtcbiAgICAgICAgcmV0dXJuIHRvdGFsO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gQ2xlYW4gdXAgb24gZGVzdHJveVxuICAgIGlmIChcImRlc3Ryb3lcIiBpbiBjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IGNvbXBvbmVudC5kZXN0cm95O1xuICAgICAgY29tcG9uZW50LmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIGNsZWFyKCk7XG4gICAgICAgIG9yaWdpbmFsRGVzdHJveT8uKCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH07XG59O1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy92bGlzdC92bGlzdC50c1xuXG4vKipcbiAqIFZMaXN0IENvbXBvbmVudCAtIFZpcnR1YWwgTGlzdCB3aXRoIGRpcmVjdCB2aWV3cG9ydCBpbnRlZ3JhdGlvblxuICpcbiAqIEEgc2ltcGxpZmllZCB2aXJ0dWFsIGxpc3QgdGhhdCB1c2VzIHRoZSB2aWV3cG9ydCBmZWF0dXJlIGRpcmVjdGx5XG4gKiB3aXRob3V0IHRoZSBsaXN0LW1hbmFnZXIgYWJzdHJhY3Rpb24gbGF5ZXIuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWTGlzdENvbmZpZywgVkxpc3RDb21wb25lbnQsIFZMaXN0SXRlbSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8vIEltcG9ydCBtdHJsIGNvbXBvc2Ugc3lzdGVtXG5pbXBvcnQgeyBwaXBlIH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IGNyZWF0ZUJhc2UsIHdpdGhFbGVtZW50IH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IHdpdGhFdmVudHMsIHdpdGhMaWZlY3ljbGUgfSBmcm9tIFwibXRybFwiO1xuXG4vLyBJbXBvcnQgdmlld3BvcnQgZmVhdHVyZVxuaW1wb3J0IHsgd2l0aFZpZXdwb3J0IH0gZnJvbSBcIi4vZmVhdHVyZXMvdmlld3BvcnRcIjtcbmltcG9ydCB7IHdpdGhBUEkgfSBmcm9tIFwiLi9mZWF0dXJlcy9hcGlcIjtcbmltcG9ydCB7IHdpdGhTZWxlY3Rpb24gfSBmcm9tIFwiLi9mZWF0dXJlcy9zZWxlY3Rpb25cIjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFZMaXN0IGNvbXBvbmVudCB1c2luZyBkaXJlY3Qgdmlld3BvcnQgaW50ZWdyYXRpb25cbiAqXG4gKiBAcGFyYW0ge1ZMaXN0Q29uZmlnfSBjb25maWcgLSBMaXN0IGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHJldHVybnMge1ZMaXN0Q29tcG9uZW50fSBBIGZ1bGx5IGNvbmZpZ3VyZWQgdmlydHVhbCBsaXN0IGNvbXBvbmVudFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCB2bGlzdCA9IGNyZWF0ZVZMaXN0KHtcbiAqICAgY29udGFpbmVyOiAnI215LWxpc3QnLFxuICogICBjb2xsZWN0aW9uOiBteUFkYXB0ZXIsXG4gKiAgIHJhbmdlU2l6ZTogMjAsXG4gKiAgIHBhZ2luYXRpb25TdHJhdGVneTogJ3BhZ2UnLFxuICogICB0ZW1wbGF0ZTogKGl0ZW0sIGluZGV4KSA9PiBbXG4gKiAgICAgeyBjbGFzczogJ3ZpZXdwb3J0LWl0ZW0nLCBhdHRyaWJ1dGVzOiB7ICdkYXRhLWlkJzogaXRlbS5pZCB9fSxcbiAqICAgICBbeyBjbGFzczogJ3ZpZXdwb3J0LWl0ZW1fX25hbWUnLCB0ZXh0OiBpdGVtLm5hbWUgfV0sXG4gKiAgICAgW3sgY2xhc3M6ICd2aWV3cG9ydC1pdGVtX192YWx1ZScsIHRleHQ6IGl0ZW0udmFsdWUgfV1cbiAqICAgXVxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVZMaXN0ID0gPFQgZXh0ZW5kcyBWTGlzdEl0ZW0gPSBWTGlzdEl0ZW0+KFxuICBjb25maWc6IFZMaXN0Q29uZmlnPFQ+ID0ge30sXG4pOiBWTGlzdENvbXBvbmVudDxUPiA9PiB7XG4gIHRyeSB7XG4gICAgLy8gY29uc29sZS5sb2coYPCfk4sgQ3JlYXRpbmcgVkxpc3QgY29tcG9uZW50IHdpdGggZGlyZWN0IHZpZXdwb3J0IGludGVncmF0aW9uYCk7XG5cbiAgICAvLyBOb3RlOiBUcmFuc2Zvcm0gc2hvdWxkIGJlIGFwcGxpZWQgYnkgdGhlIGNvbGxlY3Rpb24gZmVhdHVyZSBpbiB2aWV3cG9ydFxuICAgIC8vIFZMaXN0IHNob3VsZCBub3QgaW50ZXJjZXB0IGNvbGxlY3Rpb24gcmVhZHMgYXMgaXQgYnlwYXNzZXMgdGhlIGxvYWRpbmcgbWFuYWdlclxuXG4gICAgLy8gQ3JlYXRlIHRoZSBjb21wb25lbnQgdGhyb3VnaCBmdW5jdGlvbmFsIGNvbXBvc2l0aW9uXG4gICAgY29uc3QgZW5oYW5jZXJzID0gW1xuICAgICAgLy8gMS4gRm91bmRhdGlvbiBsYXllclxuICAgICAgY3JlYXRlQmFzZSxcbiAgICAgIHdpdGhFdmVudHMoKSxcbiAgICAgIHdpdGhFbGVtZW50KHtcbiAgICAgICAgdGFnOiBcImRpdlwiLFxuICAgICAgICBjbGFzc05hbWU6IGNvbmZpZy5jbGFzc05hbWUgfHwgXCJtdHJsLXZsaXN0XCIsXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICByb2xlOiBcImxpc3RcIixcbiAgICAgICAgICBcImFyaWEtbGFiZWxcIjogY29uZmlnLmFyaWFMYWJlbCB8fCBcIlZpcnR1YWwgTGlzdFwiLFxuICAgICAgICB9LFxuICAgICAgfSksXG5cbiAgICAgIC8vIDIuIFZpZXdwb3J0IGludGVncmF0aW9uXG4gICAgICAvLyBQYXNzIGF1dG9TZWxlY3RGaXJzdCBmcm9tIHNlbGVjdGlvbiBjb25maWcgdG8gdmlld3BvcnQgbGV2ZWxcbiAgICAgIHdpdGhWaWV3cG9ydCh7XG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgYXV0b1NlbGVjdEZpcnN0OiBjb25maWcuc2VsZWN0aW9uPy5hdXRvU2VsZWN0Rmlyc3QsXG4gICAgICB9KSxcblxuICAgICAgLy8gMy4gQ29tcG9uZW50IGxpZmVjeWNsZVxuICAgICAgd2l0aExpZmVjeWNsZSgpLFxuXG4gICAgICAvLyA0LiBQdWJsaWMgQVBJIGxheWVyXG4gICAgICB3aXRoQVBJKGNvbmZpZyksXG4gICAgXTtcblxuICAgIC8vIDQuNS4gU2VsZWN0aW9uIGNhcGFiaWxpdGllcyAoaWYgZW5hYmxlZCkgLSBtdXN0IGJlIGFmdGVyIEFQSVxuICAgIGlmIChjb25maWcuc2VsZWN0aW9uPy5lbmFibGVkKSB7XG4gICAgICBlbmhhbmNlcnMucHVzaCh3aXRoU2VsZWN0aW9uKGNvbmZpZykpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBvbmVudCA9IHBpcGUoLi4uZW5oYW5jZXJzKSh7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBjb21wb25lbnROYW1lOiBcInZsaXN0XCIsXG4gICAgICBwcmVmaXg6IGNvbmZpZy5wcmVmaXggfHwgXCJtdHJsXCIsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29tcG9uZW50IGFzIFZMaXN0Q29tcG9uZW50PFQ+O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCLinYwgW1ZMSVNUXSBGYWlsZWQgdG8gY3JlYXRlIFZMaXN0IGNvbXBvbmVudDpcIiwgZXJyb3IpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy92bGlzdC9mZWF0dXJlcy92aWV3cG9ydC50c1xuXG4vKipcbiAqIFZpZXdwb3J0IGZlYXR1cmUgZm9yIFZMaXN0XG4gKiBJbnRlZ3JhdGVzIHRoZSBjb3JlIHZpZXdwb3J0IGZ1bmN0aW9uYWxpdHkgd2l0aCBWTGlzdCBjb21wb25lbnRcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZMaXN0Q29uZmlnLCBWTGlzdEl0ZW0gfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZVZpZXdwb3J0IH0gZnJvbSBcIi4uLy4uLy4uL2NvcmUvdmlld3BvcnRcIjtcblxuLyoqXG4gKiBBZGRzIHZpZXdwb3J0IGZ1bmN0aW9uYWxpdHkgdG8gVkxpc3RcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhWaWV3cG9ydCA9IDxUIGV4dGVuZHMgVkxpc3RJdGVtID0gVkxpc3RJdGVtPihcbiAgY29uZmlnOiBWTGlzdENvbmZpZzxUPixcbikgPT4ge1xuICByZXR1cm4gKGNvbXBvbmVudDogYW55KSA9PiB7XG4gICAgLy8gU2V0IGluaXRpYWwgaXRlbXMgaWYgcHJvdmlkZWRcbiAgICBpZiAoY29uZmlnLml0ZW1zKSB7XG4gICAgICBjb21wb25lbnQuaXRlbXMgPSBjb25maWcuaXRlbXM7XG4gICAgICBjb21wb25lbnQudG90YWxJdGVtcyA9IGNvbmZpZy5pdGVtcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gU2V0IHRlbXBsYXRlIGlmIHByb3ZpZGVkXG4gICAgaWYgKGNvbmZpZy50ZW1wbGF0ZSkge1xuICAgICAgY29tcG9uZW50LnRlbXBsYXRlID0gY29uZmlnLnRlbXBsYXRlO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSB0aGUgZWxlbWVudCBoYXMgYm90aCB2bGlzdCBhbmQgdmlld3BvcnQgY2xhc3Nlc1xuICAgIGNvbnN0IHZpZXdwb3J0Q29uZmlnID0ge1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgY2xhc3NOYW1lOiBcIm10cmwtdmlld3BvcnRcIiwgLy8gVGhpcyB3aWxsIGJlIGFkZGVkIGJ5IHZpZXdwb3J0IGJhc2UgZmVhdHVyZVxuICAgIH07XG5cbiAgICAvLyBQYXNzIFZMaXN0IGNvbmZpZyBkaXJlY3RseSB0byB2aWV3cG9ydFxuICAgIGNvbnN0IHZpZXdwb3J0RW5oYW5jZWQgPSBjcmVhdGVWaWV3cG9ydCh2aWV3cG9ydENvbmZpZyBhcyBhbnkpKGNvbXBvbmVudCk7XG5cbiAgICAvLyBIYW5kbGUgcGFyZW50IGVsZW1lbnQgaWYgcHJvdmlkZWRcbiAgICBpZiAoY29uZmlnLnBhcmVudCB8fCBjb25maWcuY29udGFpbmVyKSB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBjb25maWcucGFyZW50IHx8IGNvbmZpZy5jb250YWluZXI7XG4gICAgICBjb25zdCBlbGVtZW50ID1cbiAgICAgICAgdHlwZW9mIGNvbnRhaW5lciA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgID8gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihjb250YWluZXIpXG4gICAgICAgICAgOiBjb250YWluZXI7XG5cbiAgICAgIGlmIChlbGVtZW50ICYmIHZpZXdwb3J0RW5oYW5jZWQuZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKHZpZXdwb3J0RW5oYW5jZWQuZWxlbWVudCk7XG5cbiAgICAgICAgLy8gRW5zdXJlIHZpZXdwb3J0IGlzIGluaXRpYWxpemVkIGFmdGVyIERPTSBhdHRhY2htZW50XG4gICAgICAgIGlmICh2aWV3cG9ydEVuaGFuY2VkLnZpZXdwb3J0ICYmIHZpZXdwb3J0RW5oYW5jZWQudmlld3BvcnQuaW5pdGlhbGl6ZSkge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwi8J+TiyBbVkxpc3RdIEluaXRpYWxpemluZyB2aWV3cG9ydCBhZnRlciBET00gYXR0YWNobWVudFwiKTtcbiAgICAgICAgICB2aWV3cG9ydEVuaGFuY2VkLnZpZXdwb3J0LmluaXRpYWxpemUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2aWV3cG9ydEVuaGFuY2VkO1xuICB9O1xufTtcbiIsCiAgICAiLyoqXG4gKiBBUEkgZmVhdHVyZSBmb3IgVkxpc3RcbiAqIFByb3ZpZGVzIGEgY2xlYW4gcHVibGljIEFQSSBmb3IgdGhlIFZMaXN0IGNvbXBvbmVudFxuICovXG5cbmltcG9ydCB0eXBlIHsgVkxpc3RDb25maWcsIFZMaXN0SXRlbSwgUmVtb3ZlSXRlbU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLy8gUmUtZXhwb3J0IGZvciBjb252ZW5pZW5jZVxuZXhwb3J0IHR5cGUgeyBSZW1vdmVJdGVtT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5leHBvcnQgY29uc3Qgd2l0aEFQSSA9IDxUIGV4dGVuZHMgVkxpc3RJdGVtID0gVkxpc3RJdGVtPihcbiAgY29uZmlnOiBWTGlzdENvbmZpZzxUPixcbikgPT4ge1xuICByZXR1cm4gKGNvbXBvbmVudDogYW55KSA9PiB7XG4gICAgLy8gSW5pdGlhbGl6ZSB2aWV3cG9ydCBvbiBjcmVhdGlvblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydCAmJiBjb21wb25lbnQudmlld3BvcnQuaW5pdGlhbGl6ZSkge1xuICAgICAgICBjb21wb25lbnQudmlld3BvcnQuaW5pdGlhbGl6ZSgpO1xuICAgICAgfVxuICAgIH0sIDApO1xuXG4gICAgLy8gVHJhY2sgbG9hZGluZyBzdGF0ZVxuICAgIGxldCBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgICBsZXQgc2VsZWN0ZWRJZHMgPSBuZXcgU2V0PHN0cmluZyB8IG51bWJlcj4oKTtcblxuICAgIC8vIFRyYWNrIHBlbmRpbmcgcmVtb3ZhbHMgdG8gZmlsdGVyIG91dCBpdGVtcyBmcm9tIHN0YWxlIHNlcnZlciByZXNwb25zZXNcbiAgICAvLyBUaGlzIHByZXZlbnRzIHJhY2UgY29uZGl0aW9ucyB3aGVyZSBzZXJ2ZXIgcmV0dXJucyBvbGQgZGF0YSBiZWZvcmUgdXBkYXRlcyBhcmUgY29tbWl0dGVkXG4gICAgY29uc3QgcGVuZGluZ1JlbW92YWxzID0gbmV3IFNldDxzdHJpbmcgfCBudW1iZXI+KCk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIGNvbGxlY3Rpb24gZXZlbnRzXG4gICAgY29tcG9uZW50Lm9uPy4oXCJjb2xsZWN0aW9uOnJhbmdlLWxvYWRlZFwiLCAoKSA9PiB7XG4gICAgICBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgICB9KTtcbiAgICBjb21wb25lbnQub24/LihcImNvbGxlY3Rpb246cmFuZ2UtZmFpbGVkXCIsICgpID0+IHtcbiAgICAgIGlzTG9hZGluZyA9IGZhbHNlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcblxuICAgICAgLy8gRGF0YSBvcGVyYXRpb25zXG4gICAgICBzZXRJdGVtcyhpdGVtczogVFtdKSB7XG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24pIHtcbiAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5zZXRJdGVtcyhpdGVtcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tcG9uZW50Lml0ZW1zID0gaXRlbXM7XG4gICAgICAgICAgY29tcG9uZW50LnRvdGFsSXRlbXMgPSBpdGVtcy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW1zOnNldFwiLCB7IGl0ZW1zLCB0b3RhbDogaXRlbXMubGVuZ3RoIH0pO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBBZGQgaXRlbXMgdG8gdGhlIGNvbGxlY3Rpb24gYXQgdGhlIHN0YXJ0IG9yIGVuZFxuICAgICAgICogVXBkYXRlcyB0b3RhbEl0ZW1zIGFuZCB0cmlnZ2VycyByZS1yZW5kZXIgb2YgdmlzaWJsZSBpdGVtc1xuICAgICAgICogQHBhcmFtIG5ld0l0ZW1zIC0gQXJyYXkgb2YgaXRlbXMgdG8gYWRkXG4gICAgICAgKiBAcGFyYW0gcG9zaXRpb24gLSBXaGVyZSB0byBhZGQgaXRlbXM6IFwic3RhcnRcIiAoZGVmYXVsdCkgb3IgXCJlbmRcIlxuICAgICAgICovXG4gICAgICBhZGRJdGVtcyhuZXdJdGVtczogVFtdLCBwb3NpdGlvbjogXCJzdGFydFwiIHwgXCJlbmRcIiA9IFwic3RhcnRcIik6IHZvaWQge1xuICAgICAgICBpZiAoIW5ld0l0ZW1zIHx8IG5ld0l0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcIltWTGlzdF0gYWRkSXRlbXM6IG5vIGl0ZW1zIHByb3ZpZGVkXCIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbjtcbiAgICAgICAgY29uc3QgY3VycmVudEl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuXG4gICAgICAgIC8vIEFkZCBpdGVtcyB0byB0aGUgY29sbGVjdGlvbiBpdGVtcyBhcnJheVxuICAgICAgICBpZiAoY29sbGVjdGlvbj8uaXRlbXMpIHtcbiAgICAgICAgICBpZiAocG9zaXRpb24gPT09IFwic3RhcnRcIikge1xuICAgICAgICAgICAgLy8gUHJlcGVuZCBpdGVtcyAobmV3ZXN0IGZpcnN0KVxuICAgICAgICAgICAgY29sbGVjdGlvbi5pdGVtcy51bnNoaWZ0KC4uLm5ld0l0ZW1zKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQXBwZW5kIGl0ZW1zXG4gICAgICAgICAgICBjb2xsZWN0aW9uLml0ZW1zLnB1c2goLi4ubmV3SXRlbXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtaXQgZXZlbnQgRklSU1Qgc28gcmVuZGVyaW5nIGZlYXR1cmUgY2FuIHJlYnVpbGQgY29sbGVjdGlvbkl0ZW1zXG4gICAgICAgIC8vIEJFRk9SRSBzZXRUb3RhbEl0ZW1zIHRyaWdnZXJzIGEgcmVuZGVyXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtczphZGQtcmVxdWVzdFwiLCB7XG4gICAgICAgICAgaXRlbXM6IG5ld0l0ZW1zLFxuICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgIHByZXZpb3VzQ291bnQ6IGN1cnJlbnRJdGVtcy5sZW5ndGgsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0b3RhbEl0ZW1zIC0gdGhpcyB0cmlnZ2VycyB2aWV3cG9ydDp0b3RhbC1pdGVtcy1jaGFuZ2VkIHdoaWNoIGNhbGxzIHJlbmRlckl0ZW1zXG4gICAgICAgIGNvbnN0IGl0ZW1zQWRkZWQgPSBuZXdJdGVtcy5sZW5ndGg7XG4gICAgICAgIGlmIChjb2xsZWN0aW9uPy5nZXRUb3RhbEl0ZW1zICYmIGNvbGxlY3Rpb24/LnNldFRvdGFsSXRlbXMpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50VG90YWwgPSBjb2xsZWN0aW9uLmdldFRvdGFsSXRlbXMoKTtcbiAgICAgICAgICBjb2xsZWN0aW9uLnNldFRvdGFsSXRlbXMoY3VycmVudFRvdGFsICsgaXRlbXNBZGRlZCk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uPy5zZXRUb3RhbEl0ZW1zKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFRvdGFsID0gY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uZ2V0VG90YWxJdGVtcygpO1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLnNldFRvdGFsSXRlbXMoXG4gICAgICAgICAgICBjdXJyZW50VG90YWwgKyBpdGVtc0FkZGVkLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGNvbXBvbmVudC50b3RhbEl0ZW1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC50b3RhbEl0ZW1zID0gY29tcG9uZW50LnRvdGFsSXRlbXMgKyBpdGVtc0FkZGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtaXQgY29tcGxldGlvbiBldmVudFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiaXRlbXM6YWRkZWRcIiwge1xuICAgICAgICAgIGl0ZW1zOiBuZXdJdGVtcyxcbiAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICB0b3RhbDogdGhpcy5nZXRJdGVtQ291bnQoKSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEFkZCBhIHNpbmdsZSBpdGVtIHRvIHRoZSBjb2xsZWN0aW9uIGF0IHRoZSBzdGFydCBvciBlbmRcbiAgICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IHdyYXBzIGFkZEl0ZW1zIGZvciBzaW5nbGUgaXRlbSB1c2UgY2FzZVxuICAgICAgICogQHBhcmFtIGl0ZW0gLSBJdGVtIHRvIGFkZFxuICAgICAgICogQHBhcmFtIHBvc2l0aW9uIC0gV2hlcmUgdG8gYWRkIGl0ZW06IFwic3RhcnRcIiAoZGVmYXVsdCkgb3IgXCJlbmRcIlxuICAgICAgICovXG4gICAgICBhZGRJdGVtKGl0ZW06IFQsIHBvc2l0aW9uOiBcInN0YXJ0XCIgfCBcImVuZFwiID0gXCJzdGFydFwiKTogdm9pZCB7XG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcIltWTGlzdF0gYWRkSXRlbTogbm8gaXRlbSBwcm92aWRlZFwiKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRJdGVtcyhbaXRlbV0sIHBvc2l0aW9uKTtcbiAgICAgIH0sXG5cbiAgICAgIGdldEl0ZW1zKCk6IFRbXSB7XG4gICAgICAgIC8vIENvbGxlY3Rpb24gaXMgYWRkZWQgZGlyZWN0bHkgdG8gY29tcG9uZW50LCBub3QgdG8gdmlld3BvcnQuY29sbGVjdGlvblxuICAgICAgICBpZiAoKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24/LmdldEl0ZW1zKSB7XG4gICAgICAgICAgcmV0dXJuIChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uLmdldEl0ZW1zKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5pdGVtcyB8fCBbXTtcbiAgICAgIH0sXG5cbiAgICAgIGdldFZpc2libGVJdGVtcygpOiBUW10ge1xuICAgICAgICBjb25zdCByYW5nZSA9IGNvbXBvbmVudC52aWV3cG9ydD8uZ2V0VmlzaWJsZVJhbmdlKCkgfHwge1xuICAgICAgICAgIHN0YXJ0OiAwLFxuICAgICAgICAgIGVuZDogMCxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgICAgIHJldHVybiBpdGVtcy5zbGljZShyYW5nZS5zdGFydCwgcmFuZ2UuZW5kKTtcbiAgICAgIH0sXG5cbiAgICAgIGdldEl0ZW1Db3VudCgpOiBudW1iZXIge1xuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmdldFRvdGFsSXRlbXMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50LnRvdGFsSXRlbXMgfHwgY29tcG9uZW50Lml0ZW1zPy5sZW5ndGggfHwgMDtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IGl0ZW0gYXQgYSBzcGVjaWZpYyBpbmRleFxuICAgICAgICogQHBhcmFtIGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHJldHJpZXZlXG4gICAgICAgKiBAcmV0dXJucyBUaGUgaXRlbSBhdCB0aGUgaW5kZXgsIG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmRcbiAgICAgICAqL1xuICAgICAgZ2V0SXRlbShpbmRleDogbnVtYmVyKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICgoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbj8uZ2V0SXRlbSkge1xuICAgICAgICAgIHJldHVybiAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbi5nZXRJdGVtKGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICAgICAgcmV0dXJuIGl0ZW1zW2luZGV4XTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogVXBkYXRlIGl0ZW0gYXQgYSBzcGVjaWZpYyBpbmRleFxuICAgICAgICogQHBhcmFtIGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHVwZGF0ZVxuICAgICAgICogQHBhcmFtIGl0ZW0gLSBUaGUgbmV3IGl0ZW0gZGF0YSAoZnVsbCByZXBsYWNlbWVudClcbiAgICAgICAqL1xuICAgICAgdXBkYXRlSXRlbShpbmRleDogbnVtYmVyLCBpdGVtOiBUKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuXG4gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbVkxpc3RdIHVwZGF0ZUl0ZW06IGluZGV4ICR7aW5kZXh9IG91dCBvZiBib3VuZHNgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmV2aW91c0l0ZW0gPSBpdGVtc1tpbmRleF07XG5cbiAgICAgICAgLy8gVXBkYXRlIGluIGNvbGxlY3Rpb24gaXRlbXMgYXJyYXlcbiAgICAgICAgaWYgKChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uPy5pdGVtcykge1xuICAgICAgICAgIChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uLml0ZW1zW2luZGV4XSA9IGl0ZW07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IGV2ZW50IGZvciByZW5kZXJpbmcgZmVhdHVyZSB0byBoYW5kbGUgRE9NIHVwZGF0ZVxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiaXRlbTp1cGRhdGUtcmVxdWVzdFwiLCB7XG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgaXRlbSxcbiAgICAgICAgICBwcmV2aW91c0l0ZW0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBVcGRhdGUgaXRlbSBieSBJRFxuICAgICAgICogRmluZHMgdGhlIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb24gYnkgaXRzIElEIGFuZCB1cGRhdGVzIGl0IHdpdGggbmV3IGRhdGFcbiAgICAgICAqIFJlLXJlbmRlcnMgdGhlIGl0ZW0gaWYgY3VycmVudGx5IHZpc2libGUgaW4gdGhlIHZpZXdwb3J0XG4gICAgICAgKiBAcGFyYW0gaWQgLSBUaGUgaXRlbSBJRCB0byBmaW5kXG4gICAgICAgKiBAcGFyYW0gZGF0YSAtIFBhcnRpYWwgZGF0YSB0byBtZXJnZSB3aXRoIGV4aXN0aW5nIGl0ZW0sIG9yIGZ1bGwgaXRlbSByZXBsYWNlbWVudFxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBVcGRhdGUgb3B0aW9uc1xuICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiBpdGVtIHdhcyBmb3VuZCBhbmQgdXBkYXRlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICAgKi9cbiAgICAgIHVwZGF0ZUl0ZW1CeUlkKFxuICAgICAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgICAgICBkYXRhOiBQYXJ0aWFsPFQ+LFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgLyoqIElmIHRydWUsIHJlcGxhY2UgdGhlIGVudGlyZSBpdGVtIGluc3RlYWQgb2YgbWVyZ2luZyAoZGVmYXVsdDogZmFsc2UpICovXG4gICAgICAgICAgcmVwbGFjZT86IGJvb2xlYW47XG4gICAgICAgICAgLyoqIElmIHRydWUsIHJlLXJlbmRlciBldmVuIGlmIG5vdCB2aXNpYmxlIChkZWZhdWx0OiBmYWxzZSkgKi9cbiAgICAgICAgICBmb3JjZVJlbmRlcj86IGJvb2xlYW47XG4gICAgICAgIH0gPSB7fSxcbiAgICAgICk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB7IHJlcGxhY2UgPSBmYWxzZSB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG5cbiAgICAgICAgLy8gRmluZCB0aGUgaXRlbSBieSBJRCAoaGFuZGxlIHNwYXJzZSBhcnJheXMgZnJvbSBwYWdpbmF0aW9uKVxuICAgICAgICAvLyBDaGVjayBhbGwgcG9zc2libGUgSUQgZmllbGRzIHNpbmNlIGl0ZW1zIG1heSBoYXZlIGRpZmZlcmVudCBJRCBzdHJ1Y3R1cmVzXG4gICAgICAgIGNvbnN0IGluZGV4ID0gaXRlbXMuZmluZEluZGV4KChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoIWl0ZW0pIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAvLyBDaGVjayBhbGwgcG9zc2libGUgSUQgZmllbGRzIC0gdXNlcl9pZCBpcyBpbXBvcnRhbnQgZm9yIHByb2ZpbGUvY29udGFjdCBpdGVtc1xuICAgICAgICAgIGNvbnN0IGlkc1RvQ2hlY2sgPSBbaXRlbS5pZCwgaXRlbS5faWQsIGl0ZW0udXNlcl9pZF0uZmlsdGVyKFxuICAgICAgICAgICAgKHYpID0+IHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSBudWxsLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIGlkc1RvQ2hlY2suc29tZShcbiAgICAgICAgICAgIChpdGVtSWQpID0+IGl0ZW1JZCA9PT0gaWQgfHwgU3RyaW5nKGl0ZW1JZCkgPT09IFN0cmluZyhpZCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW1ZMaXN0XSB1cGRhdGVJdGVtQnlJZDogaXRlbSB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZGApO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZXZpb3VzSXRlbSA9IGl0ZW1zW2luZGV4XTtcblxuICAgICAgICAvLyBDcmVhdGUgdXBkYXRlZCBpdGVtIC0gZWl0aGVyIHJlcGxhY2UgZW50aXJlbHkgb3IgbWVyZ2VcbiAgICAgICAgbGV0IHVwZGF0ZWRJdGVtOiBUO1xuICAgICAgICBpZiAocmVwbGFjZSkge1xuICAgICAgICAgIHVwZGF0ZWRJdGVtID0geyAuLi5kYXRhLCBpZDogcHJldmlvdXNJdGVtLmlkID8/IGlkIH0gYXMgVDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBPbmx5IG1lcmdlIHByb3BlcnRpZXMgdGhhdCBoYXZlIGFjdHVhbCB2YWx1ZXMgKG5vdCB1bmRlZmluZWQpXG4gICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBwYXJ0aWFsIHVwZGF0ZXMgZnJvbSBvdmVyd3JpdGluZyBleGlzdGluZyBkYXRhXG4gICAgICAgICAgdXBkYXRlZEl0ZW0gPSB7IC4uLnByZXZpb3VzSXRlbSB9IGFzIFQ7XG4gICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGF0YSkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICh1cGRhdGVkSXRlbSBhcyBhbnkpW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgaW4gY29sbGVjdGlvbiBpdGVtcyBhcnJheVxuICAgICAgICBpZiAoKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24/Lml0ZW1zKSB7XG4gICAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24uaXRlbXNbaW5kZXhdID0gdXBkYXRlZEl0ZW07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IGV2ZW50IGZvciByZW5kZXJpbmcgZmVhdHVyZSB0byBoYW5kbGUgRE9NIHVwZGF0ZVxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiaXRlbTp1cGRhdGUtcmVxdWVzdFwiLCB7XG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgaXRlbTogdXBkYXRlZEl0ZW0sXG4gICAgICAgICAgcHJldmlvdXNJdGVtLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlIGl0ZW0gYXQgYSBzcGVjaWZpYyBpbmRleFxuICAgICAgICogUmVtb3ZlcyB0aGUgaXRlbSBmcm9tIHRoZSBjb2xsZWN0aW9uLCB1cGRhdGVzIHRvdGFsSXRlbXMsIGFuZCB0cmlnZ2VycyByZS1yZW5kZXJcbiAgICAgICAqIEBwYXJhbSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZW1vdmVcbiAgICAgICAqIEByZXR1cm5zIHRydWUgaWYgaXRlbSB3YXMgZm91bmQgYW5kIHJlbW92ZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAgICovXG4gICAgICByZW1vdmVJdGVtKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbjtcblxuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW1ZMaXN0XSByZW1vdmVJdGVtOiBpbmRleCAke2luZGV4fSBvdXQgb2YgYm91bmRzYCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVtb3ZlZEl0ZW0gPSBpdGVtc1tpbmRleF07XG5cbiAgICAgICAgLy8gUmVtb3ZlIGZyb20gY29sbGVjdGlvbiBpdGVtcyBhcnJheSAoY29tcG9uZW50LmNvbGxlY3Rpb24uaXRlbXMgaXMgdGhlIGFjdHVhbCBhcnJheSlcbiAgICAgICAgaWYgKChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uPy5pdGVtcykge1xuICAgICAgICAgIChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uLml0ZW1zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJTVBPUlRBTlQ6IEVtaXQgaXRlbTpyZW1vdmUtcmVxdWVzdCBGSVJTVCBzbyByZW5kZXJpbmcgZmVhdHVyZSByZWJ1aWxkcyBjb2xsZWN0aW9uSXRlbXNcbiAgICAgICAgLy8gQkVGT1JFIHNldFRvdGFsSXRlbXMgdHJpZ2dlcnMgYSByZW5kZXIgdmlhIHZpZXdwb3J0OnRvdGFsLWl0ZW1zLWNoYW5nZWRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW06cmVtb3ZlLXJlcXVlc3RcIiwge1xuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIGl0ZW06IHJlbW92ZWRJdGVtLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBVcGRhdGUgdG90YWxJdGVtcyAtIHRoaXMgd2lsbCB0cmlnZ2VyIHZpZXdwb3J0OnRvdGFsLWl0ZW1zLWNoYW5nZWQgd2hpY2ggY2FsbHMgcmVuZGVySXRlbXNcbiAgICAgICAgLy8gQnkgbm93LCBjb2xsZWN0aW9uSXRlbXMgaGFzIGJlZW4gcmVidWlsdCBieSB0aGUgaXRlbTpyZW1vdmUtcmVxdWVzdCBoYW5kbGVyXG4gICAgICAgIGlmIChjb2xsZWN0aW9uPy5nZXRUb3RhbEl0ZW1zICYmIGNvbGxlY3Rpb24/LnNldFRvdGFsSXRlbXMpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50VG90YWwgPSBjb2xsZWN0aW9uLmdldFRvdGFsSXRlbXMoKTtcbiAgICAgICAgICBjb2xsZWN0aW9uLnNldFRvdGFsSXRlbXMoTWF0aC5tYXgoMCwgY3VycmVudFRvdGFsIC0gMSkpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uY29sbGVjdGlvbj8uc2V0VG90YWxJdGVtcykge1xuICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIHZpZXdwb3J0LmNvbGxlY3Rpb24gaWYgYXZhaWxhYmxlXG4gICAgICAgICAgY29uc3QgY3VycmVudFRvdGFsID0gY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uZ2V0VG90YWxJdGVtcygpO1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLnNldFRvdGFsSXRlbXMoXG4gICAgICAgICAgICBNYXRoLm1heCgwLCBjdXJyZW50VG90YWwgLSAxKSxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIExhc3QgcmVzb3J0OiB1cGRhdGUgY29tcG9uZW50LnRvdGFsSXRlbXMgZGlyZWN0bHlcbiAgICAgICAgICBpZiAoY29tcG9uZW50LnRvdGFsSXRlbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29tcG9uZW50LnRvdGFsSXRlbXMgPSBNYXRoLm1heCgwLCBjb21wb25lbnQudG90YWxJdGVtcyAtIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBSZW1vdmUgaXRlbSBieSBJRFxuICAgICAgICogRmluZHMgdGhlIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb24gYnkgaXRzIElEIGFuZCByZW1vdmVzIGl0XG4gICAgICAgKiBVcGRhdGVzIHRvdGFsSXRlbXMgYW5kIHRyaWdnZXJzIHJlLXJlbmRlciBvZiB2aXNpYmxlIGl0ZW1zXG4gICAgICAgKiBPcHRpb25hbGx5IHRyYWNrcyBhcyBwZW5kaW5nIHJlbW92YWwgdG8gZmlsdGVyIGZyb20gZnV0dXJlIGZldGNoZXNcbiAgICAgICAqIEBwYXJhbSBpZCAtIFRoZSBpdGVtIElEIHRvIGZpbmQgYW5kIHJlbW92ZVxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBSZW1vdmUgb3B0aW9ucyAodHJhY2tQZW5kaW5nLCBwZW5kaW5nVGltZW91dClcbiAgICAgICAqIEByZXR1cm5zIHRydWUgaWYgaXRlbSB3YXMgZm91bmQgYW5kIHJlbW92ZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAgICovXG4gICAgICByZW1vdmVJdGVtQnlJZChcbiAgICAgICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICAgICAgb3B0aW9uczogUmVtb3ZlSXRlbU9wdGlvbnMgPSB7fSxcbiAgICAgICk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB7IHRyYWNrUGVuZGluZyA9IHRydWUsIHBlbmRpbmdUaW1lb3V0ID0gNTAwMCB9ID0gb3B0aW9ucztcblxuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW1ZMaXN0XSByZW1vdmVJdGVtQnlJZDogaW52YWxpZCBpZGApO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCB0byBwZW5kaW5nIHJlbW92YWxzIHRvIGZpbHRlciBmcm9tIGZ1dHVyZSBzZXJ2ZXIgcmVzcG9uc2VzXG4gICAgICAgIGlmICh0cmFja1BlbmRpbmcpIHtcbiAgICAgICAgICBwZW5kaW5nUmVtb3ZhbHMuYWRkKGlkKTtcblxuICAgICAgICAgIC8vIENsZWFyIGZyb20gcGVuZGluZyByZW1vdmFscyBhZnRlciB0aW1lb3V0IChzZXJ2ZXIgc2hvdWxkIGhhdmUgdXBkYXRlZCBieSB0aGVuKVxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgcGVuZGluZ1JlbW92YWxzLmRlbGV0ZShpZCk7XG4gICAgICAgICAgfSwgcGVuZGluZ1RpbWVvdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG5cbiAgICAgICAgLy8gRmluZCB0aGUgaXRlbSBieSBJRCAoaGFuZGxlIHNwYXJzZSBhcnJheXMgZnJvbSBwYWdpbmF0aW9uKVxuICAgICAgICAvLyBDaGVjayBhbGwgcG9zc2libGUgSUQgZmllbGRzIHNpbmNlIGl0ZW1zIG1heSBoYXZlIGRpZmZlcmVudCBJRCBzdHJ1Y3R1cmVzXG4gICAgICAgIGNvbnN0IGluZGV4ID0gaXRlbXMuZmluZEluZGV4KChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoIWl0ZW0pIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAvLyBDaGVjayBhbGwgcG9zc2libGUgSUQgZmllbGRzXG4gICAgICAgICAgY29uc3QgaWRzVG9DaGVjayA9IFtpdGVtLmlkLCBpdGVtLl9pZCwgaXRlbS51c2VyX2lkXS5maWx0ZXIoXG4gICAgICAgICAgICAodikgPT4gdiAhPT0gdW5kZWZpbmVkICYmIHYgIT09IG51bGwsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gaWRzVG9DaGVjay5zb21lKFxuICAgICAgICAgICAgKGl0ZW1JZCkgPT4gaXRlbUlkID09PSBpZCB8fCBTdHJpbmcoaXRlbUlkKSA9PT0gU3RyaW5nKGlkKSxcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlSXRlbShpbmRleCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENoZWNrIGlmIGFuIGl0ZW0gSUQgaXMgcGVuZGluZyByZW1vdmFsXG4gICAgICAgKiBAcGFyYW0gaWQgLSBUaGUgaXRlbSBJRCB0byBjaGVja1xuICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgaXRlbSBpcyBwZW5kaW5nIHJlbW92YWxcbiAgICAgICAqL1xuICAgICAgaXNQZW5kaW5nUmVtb3ZhbChpZDogc3RyaW5nIHwgbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBwZW5kaW5nUmVtb3ZhbHMuaGFzKGlkKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IGFsbCBwZW5kaW5nIHJlbW92YWwgSURzXG4gICAgICAgKiBAcmV0dXJucyBTZXQgb2YgcGVuZGluZyByZW1vdmFsIElEc1xuICAgICAgICovXG4gICAgICBnZXRQZW5kaW5nUmVtb3ZhbHMoKTogU2V0PHN0cmluZyB8IG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gbmV3IFNldChwZW5kaW5nUmVtb3ZhbHMpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDbGVhciBhIHNwZWNpZmljIHBlbmRpbmcgcmVtb3ZhbFxuICAgICAgICogQHBhcmFtIGlkIC0gVGhlIGl0ZW0gSUQgdG8gY2xlYXIgZnJvbSBwZW5kaW5nIHJlbW92YWxzXG4gICAgICAgKi9cbiAgICAgIGNsZWFyUGVuZGluZ1JlbW92YWwoaWQ6IHN0cmluZyB8IG51bWJlcik6IHZvaWQge1xuICAgICAgICBwZW5kaW5nUmVtb3ZhbHMuZGVsZXRlKGlkKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2xlYXIgYWxsIHBlbmRpbmcgcmVtb3ZhbHNcbiAgICAgICAqL1xuICAgICAgY2xlYXJBbGxQZW5kaW5nUmVtb3ZhbHMoKTogdm9pZCB7XG4gICAgICAgIHBlbmRpbmdSZW1vdmFscy5jbGVhcigpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBGaWx0ZXIgaXRlbXMgYXJyYXkgdG8gZXhjbHVkZSBwZW5kaW5nIHJlbW92YWxzXG4gICAgICAgKiBVdGlsaXR5IG1ldGhvZCBmb3IgdXNlIGluIGNvbGxlY3Rpb24gYWRhcHRlcnNcbiAgICAgICAqIEBwYXJhbSBpdGVtcyAtIEFycmF5IG9mIGl0ZW1zIHRvIGZpbHRlclxuICAgICAgICogQHJldHVybnMgRmlsdGVyZWQgYXJyYXkgd2l0aG91dCBwZW5kaW5nIHJlbW92YWwgaXRlbXNcbiAgICAgICAqL1xuICAgICAgZmlsdGVyUGVuZGluZ1JlbW92YWxzPEkgZXh0ZW5kcyB7IGlkPzogYW55OyBfaWQ/OiBhbnkgfT4oXG4gICAgICAgIGl0ZW1zOiBJW10sXG4gICAgICApOiBJW10ge1xuICAgICAgICBpZiAocGVuZGluZ1JlbW92YWxzLnNpemUgPT09IDApIHJldHVybiBpdGVtcztcblxuICAgICAgICByZXR1cm4gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgICAgY29uc3QgaWQgPSBpdGVtLl9pZCB8fCBpdGVtLmlkO1xuICAgICAgICAgIHJldHVybiAhcGVuZGluZ1JlbW92YWxzLmhhcyhpZCk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcblxuICAgICAgLy8gTG9hZGluZyBvcGVyYXRpb25zXG4gICAgICBhc3luYyBsb2FkUmFuZ2UoXG4gICAgICAgIHBhZ2U6IG51bWJlcixcbiAgICAgICAgbGltaXQ6IG51bWJlcixcbiAgICAgICAgc3RyYXRlZ3k6IHN0cmluZyA9IFwicGFnZVwiLFxuICAgICAgICBhbGlnbm1lbnQ/OiBzdHJpbmcsXG4gICAgICApIHtcbiAgICAgICAgaXNMb2FkaW5nID0gdHJ1ZTtcblxuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uKSB7XG4gICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gc3RyYXRlZ3kgPT09IFwicGFnZVwiID8gKHBhZ2UgLSAxKSAqIGxpbWl0IDogcGFnZTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24ubG9hZFJhbmdlKG9mZnNldCwgbGltaXQpO1xuICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImxvYWRcIiwgeyBwYWdlLCBsaW1pdCwgc3RyYXRlZ3kgfSk7XG5cbiAgICAgICAgICAgIC8vIFNjcm9sbCB0byB0aGUgbG9hZGVkIHJhbmdlIGlmIGFsaWdubWVudCBpcyBzcGVjaWZpZWRcbiAgICAgICAgICAgIGlmIChhbGlnbm1lbnQpIHtcbiAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBvZmZzZXQ7XG4gICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9JbmRleChpbmRleCwgYWxpZ25tZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImVycm9yXCIsIHsgZXJyb3IgfSk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvLyBEYXRhIGxvYWRpbmdcbiAgICAgIGxvYWROZXh0OiBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbVkxpc3RdIGxvYWROZXh0KClgKTtcblxuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uKSB7XG4gICAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmdldFRvdGFsSXRlbXMoKTtcbiAgICAgICAgICBjb25zdCBsb2FkZWRSYW5nZXMgPSBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5nZXRMb2FkZWRSYW5nZXMoKTtcblxuICAgICAgICAgIC8vIEZpbmQgdGhlIG5leHQgdW5sb2FkZWQgcmFuZ2VcbiAgICAgICAgICBsZXQgbmV4dE9mZnNldCA9IDA7XG4gICAgICAgICAgZm9yIChjb25zdCByYW5nZUlkIG9mIGxvYWRlZFJhbmdlcykge1xuICAgICAgICAgICAgY29uc3QgcmFuZ2VFbmQgPSAocmFuZ2VJZCArIDEpICogKGNvbmZpZy5wYWdpbmF0aW9uPy5saW1pdCB8fCAyMCk7XG4gICAgICAgICAgICBpZiAocmFuZ2VFbmQgPiBuZXh0T2Zmc2V0KSB7XG4gICAgICAgICAgICAgIG5leHRPZmZzZXQgPSByYW5nZUVuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobmV4dE9mZnNldCA8IHRvdGFsSXRlbXMpIHtcbiAgICAgICAgICAgIGF3YWl0IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmxvYWRSYW5nZShcbiAgICAgICAgICAgICAgbmV4dE9mZnNldCxcbiAgICAgICAgICAgICAgY29uZmlnLnBhZ2luYXRpb24/LmxpbWl0IHx8IDIwLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9LFxuXG4gICAgICBpc0xvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBpc0xvYWRpbmc7XG4gICAgICB9LFxuXG4gICAgICBoYXNOZXh0KCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uKSB7XG4gICAgICAgICAgY29uc3QgdG90YWwgPSBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5nZXRUb3RhbEl0ZW1zKCk7XG4gICAgICAgICAgY29uc3QgaXRlbXMgPSBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5nZXRJdGVtcygpO1xuICAgICAgICAgIHJldHVybiBpdGVtcy5sZW5ndGggPCB0b3RhbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9LFxuXG4gICAgICAvLyBOb3RlOiBTZWxlY3Rpb24gb3BlcmF0aW9ucyBhcmUgaGFuZGxlZCBieSB0aGUgd2l0aFNlbGVjdGlvbiBmZWF0dXJlXG4gICAgICAvLyBUaGVzZSBhcmUga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBidXQgZGVsZWdhdGUgdG8gc2VsZWN0aW9uIGZlYXR1cmUgaWYgYXZhaWxhYmxlXG4gICAgICBnZXRTZWxlY3RlZElkcygpOiAoc3RyaW5nIHwgbnVtYmVyKVtdIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQuZ2V0U2VsZWN0ZWRJbmRpY2VzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAvLyBVc2Ugc2VsZWN0aW9uIGZlYXR1cmUgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgICAgICAgY29uc3QgaW5kaWNlcyA9IGNvbXBvbmVudC5nZXRTZWxlY3RlZEluZGljZXMoKTtcbiAgICAgICAgICByZXR1cm4gaW5kaWNlcy5tYXAoKGlkeDogbnVtYmVyKSA9PiAoaXRlbXNbaWR4XSBhcyBhbnkpPy5pZCB8fCBpZHgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZhbGxiYWNrIHRvIGxvY2FsIHRyYWNraW5nXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHNlbGVjdGVkSWRzKTtcbiAgICAgIH0sXG5cbiAgICAgIHNlbGVjdEl0ZW0oaWQ6IHN0cmluZyB8IG51bWJlcikge1xuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5zZWxlY3RJdGVtcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gVXNlIHNlbGVjdGlvbiBmZWF0dXJlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gaXRlbXMuZmluZEluZGV4KChpdGVtOiBhbnkpID0+IGl0ZW0uaWQgPT09IGlkKTtcbiAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgY29tcG9uZW50LnNlbGVjdEl0ZW1zKFtpbmRleF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBsb2NhbCB0cmFja2luZ1xuICAgICAgICAgIHNlbGVjdGVkSWRzLmFkZChpZCk7XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInNlbGVjdGlvbjpjaGFuZ2VcIiwge1xuICAgICAgICAgICAgc2VsZWN0ZWQ6IHRoaXMuZ2V0U2VsZWN0ZWRJZHMoKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgZGVzZWxlY3RJdGVtKGlkOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQuZGVzZWxlY3RJdGVtcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gVXNlIHNlbGVjdGlvbiBmZWF0dXJlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gaXRlbXMuZmluZEluZGV4KChpdGVtOiBhbnkpID0+IGl0ZW0uaWQgPT09IGlkKTtcbiAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgY29tcG9uZW50LmRlc2VsZWN0SXRlbXMoW2luZGV4XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIGxvY2FsIHRyYWNraW5nXG4gICAgICAgICAgc2VsZWN0ZWRJZHMuZGVsZXRlKGlkKTtcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwic2VsZWN0aW9uOmNoYW5nZVwiLCB7XG4gICAgICAgICAgICBzZWxlY3RlZDogdGhpcy5nZXRTZWxlY3RlZElkcygpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBjbGVhclNlbGVjdGlvbigpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQuY2xlYXJTZWxlY3Rpb24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIFVzZSBzZWxlY3Rpb24gZmVhdHVyZSBpZiBhdmFpbGFibGVcbiAgICAgICAgICBjb21wb25lbnQuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBsb2NhbCB0cmFja2luZ1xuICAgICAgICAgIHNlbGVjdGVkSWRzLmNsZWFyKCk7XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInNlbGVjdGlvbjpjaGFuZ2VcIiwgeyBzZWxlY3RlZDogW10gfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8vIFNjcm9sbGluZyBtZXRob2RzXG4gICAgICBzY3JvbGxUb0luZGV4OiAoXG4gICAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICAgIGFsaWdubWVudDogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIsXG4gICAgICAgIGFuaW1hdGU/OiBib29sZWFuLFxuICAgICAgKSA9PiB7XG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQpIHtcbiAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9JbmRleChpbmRleCwgYWxpZ25tZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNjcm9sbCB0byBpbmRleCBhbmQgc2VsZWN0IGl0ZW0gYWZ0ZXIgZGF0YSBsb2Fkc1xuICAgICAgICogVXNlZnVsIGZvciBydW50aW1lIHNjcm9sbCtzZWxlY3Qgd2hlbiBWTGlzdCBpcyBhbHJlYWR5IGNyZWF0ZWRcbiAgICAgICAqL1xuICAgICAgc2Nyb2xsVG9JbmRleEFuZFNlbGVjdDogYXN5bmMgZnVuY3Rpb24gKFxuICAgICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgICBzZWxlY3RJZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgICAgICBhbGlnbm1lbnQ6IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiID0gXCJzdGFydFwiLFxuICAgICAgKSB7XG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQpIHtcbiAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9JbmRleChpbmRleCwgYWxpZ25tZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExpc3RlbiBmb3IgcmFuZ2UgbG9hZCB0byBjb21wbGV0ZSwgdGhlbiBzZWxlY3RcbiAgICAgICAgY29uc3Qgb25SYW5nZUxvYWRlZCA9ICgpID0+IHtcbiAgICAgICAgICBjb21wb25lbnQub2ZmPy4oXCJ2aWV3cG9ydDpyYW5nZS1sb2FkZWRcIiwgb25SYW5nZUxvYWRlZCk7XG4gICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQuc2VsZWN0QnlJZCkge1xuICAgICAgICAgICAgICBjb21wb25lbnQuc2VsZWN0QnlJZChzZWxlY3RJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpyYW5nZS1sb2FkZWRcIiwgb25SYW5nZUxvYWRlZCk7XG5cbiAgICAgICAgLy8gRmFsbGJhY2sgdGltZW91dCBpbiBjYXNlIGV2ZW50IGRvZXNuJ3QgZmlyZSAoZGF0YSBhbHJlYWR5IGxvYWRlZClcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29tcG9uZW50Lm9mZj8uKFwidmlld3BvcnQ6cmFuZ2UtbG9hZGVkXCIsIG9uUmFuZ2VMb2FkZWQpO1xuICAgICAgICAgIGlmIChjb21wb25lbnQuc2VsZWN0QnlJZCkge1xuICAgICAgICAgICAgY29tcG9uZW50LnNlbGVjdEJ5SWQoc2VsZWN0SWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgMzAwKTtcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9LFxuXG4gICAgICBzY3JvbGxUb0l0ZW06IGFzeW5jIGZ1bmN0aW9uIChcbiAgICAgICAgaXRlbUlkOiBzdHJpbmcsXG4gICAgICAgIGFsaWdubWVudDogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIsXG4gICAgICAgIGFuaW1hdGU/OiBib29sZWFuLFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgICAgICBjb25zdCBpbmRleCA9IGl0ZW1zLmZpbmRJbmRleChcbiAgICAgICAgICAoaXRlbTogYW55KSA9PiBTdHJpbmcoaXRlbS5pZCkgPT09IFN0cmluZyhpdGVtSWQpLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsVG9JbmRleChpbmRleCwgYWxpZ25tZW50LCBhbmltYXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUud2FybihgSXRlbSAke2l0ZW1JZH0gbm90IGZvdW5kYCk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH0sXG5cbiAgICAgIHNjcm9sbFRvVG9wOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjcm9sbFRvSW5kZXgoMCwgXCJzdGFydFwiKTtcbiAgICAgIH0sXG5cbiAgICAgIHNjcm9sbFRvQm90dG9tOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHRvdGFsSXRlbXMgPSB0aGlzLmdldEl0ZW1Db3VudCgpO1xuICAgICAgICBpZiAodG90YWxJdGVtcyA+IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxUb0luZGV4KHRvdGFsSXRlbXMgLSAxLCBcImVuZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9LFxuXG4gICAgICBzY3JvbGxUb1BhZ2U6IGFzeW5jIGZ1bmN0aW9uIChcbiAgICAgICAgcGFnZU51bTogbnVtYmVyLFxuICAgICAgICBhbGlnbm1lbnQ6IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiID0gXCJzdGFydFwiLFxuICAgICAgICBhbmltYXRlPzogYm9vbGVhbixcbiAgICAgICkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW1ZMaXN0XSBzY3JvbGxUb1BhZ2UoJHtwYWdlTnVtfSlgKTtcblxuICAgICAgICAvLyBHZXQgbGltaXQgZnJvbSBjb25maWcgKHJhbmdlU2l6ZSkgb3IgZGVmYXVsdFxuICAgICAgICBjb25zdCBsaW1pdCA9IGNvbmZpZy5wYWdpbmF0aW9uPy5saW1pdCB8fCAyMDtcblxuICAgICAgICAvLyBDaGVjayBpZiB3ZSdyZSBpbiBjdXJzb3IgbW9kZVxuICAgICAgICBpZiAoY29uZmlnLnBhZ2luYXRpb24/LnN0cmF0ZWd5ID09PSBcImN1cnNvclwiKSB7XG4gICAgICAgICAgLy8gSW4gY3Vyc29yIG1vZGUsIHdlIG5lZWQgdG8gaGFuZGxlIHNlcXVlbnRpYWwgbG9hZGluZ1xuICAgICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSk/LmNvbGxlY3Rpb247XG4gICAgICAgICAgaWYgKGNvbGxlY3Rpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRlZFJhbmdlcyA9IGNvbGxlY3Rpb24uZ2V0TG9hZGVkUmFuZ2VzKCk7XG4gICAgICAgICAgICBjb25zdCBoaWdoZXN0TG9hZGVkUGFnZSA9IGxvYWRlZFJhbmdlcy5zaXplO1xuXG4gICAgICAgICAgICBpZiAocGFnZU51bSA+IGhpZ2hlc3RMb2FkZWRQYWdlICsgMSkge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgYFtWTGlzdF0gQ2Fubm90IGp1bXAgdG8gcGFnZSAke3BhZ2VOdW19IGluIGN1cnNvciBtb2RlLiBgICtcbiAgICAgICAgICAgICAgICAgIGBMb2FkaW5nIHBhZ2VzIHNlcXVlbnRpYWxseSBmcm9tICR7XG4gICAgICAgICAgICAgICAgICAgIGhpZ2hlc3RMb2FkZWRQYWdlICsgMVxuICAgICAgICAgICAgICAgICAgfSB0byAke3BhZ2VOdW19YCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2Ugdmlld3BvcnQncyBzY3JvbGxUb1BhZ2UgaWYgYXZhaWxhYmxlXG4gICAgICAgIGlmICgoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSk/LnNjcm9sbFRvUGFnZSkge1xuICAgICAgICAgIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zY3JvbGxUb1BhZ2UocGFnZU51bSwgbGltaXQsIGFsaWdubWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gc2Nyb2xsVG9JbmRleFxuICAgICAgICAgIGNvbnN0IHRhcmdldEluZGV4ID0gKHBhZ2VOdW0gLSAxKSAqIGxpbWl0O1xuICAgICAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsVG9JbmRleCh0YXJnZXRJbmRleCwgYWxpZ25tZW50KTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgZ2V0U2Nyb2xsUG9zaXRpb246ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC52aWV3cG9ydD8uZ2V0U2Nyb2xsUG9zaXRpb24oKSB8fCAwO1xuICAgICAgfSxcblxuICAgICAgZ2V0Q3VycmVudEN1cnNvcjogKCkgPT4ge1xuICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpPy5jb2xsZWN0aW9uO1xuICAgICAgICByZXR1cm4gY29sbGVjdGlvbj8uZ2V0Q3VycmVudEN1cnNvcj8uKCkgfHwgbnVsbDtcbiAgICAgIH0sXG5cbiAgICAgIHNldFNjcm9sbEFuaW1hdGlvbihlbmFibGVkOiBib29sZWFuKSB7XG4gICAgICAgIC8vIFN0b3JlIGFuaW1hdGlvbiBwcmVmZXJlbmNlICh3b3VsZCBiZSB1c2VkIGJ5IHZpZXdwb3J0IHNjcm9sbGluZyBmZWF0dXJlKVxuICAgICAgICBjb21wb25lbnQuc2Nyb2xsQW5pbWF0aW9uID0gZW5hYmxlZDtcbiAgICAgIH0sXG5cbiAgICAgIC8vIFN0YXRlXG4gICAgICBnZXRTdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpdGVtczogdGhpcy5nZXRJdGVtcygpLFxuICAgICAgICAgIHRvdGFsSXRlbXM6IGNvbXBvbmVudC52aWV3cG9ydD8uY29sbGVjdGlvblxuICAgICAgICAgICAgPyBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5nZXRUb3RhbEl0ZW1zKClcbiAgICAgICAgICAgIDogY29tcG9uZW50LnRvdGFsSXRlbXMgfHwgMCxcbiAgICAgICAgICB2aXNpYmxlUmFuZ2U6IGNvbXBvbmVudC52aWV3cG9ydD8uZ2V0VmlzaWJsZVJhbmdlKCkgfHwge1xuICAgICAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgICAgICBlbmQ6IDAsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzY3JvbGxQb3NpdGlvbjogY29tcG9uZW50LnZpZXdwb3J0Py5nZXRTY3JvbGxQb3NpdGlvbigpIHx8IDAsXG4gICAgICAgICAgc2VsZWN0ZWRJZHM6IHRoaXMuZ2V0U2VsZWN0ZWRJZHMoKSxcbiAgICAgICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nKCksXG4gICAgICAgIH07XG4gICAgICB9LFxuXG4gICAgICAvLyBMaWZlY3ljbGVcbiAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmRlc3Ryb3kpIHtcbiAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIHNlbGVjdGVkSWRzLmNsZWFyKCk7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJkZXN0cm95ZWRcIik7XG4gICAgICB9LFxuICAgIH07XG4gIH07XG59O1xuIiwKICAgICIvKipcbiAqIG10cmwtYWRkb25zIExpc3QgQ29tcG9uZW50IENvbnN0YW50c1xuICpcbiAqIENvbnN0YW50cyBmb3IgdGhlIGFkZG9ucyBsaXN0IGNvbXBvbmVudC5cbiAqIE5vdGU6IEJhc2UgbXRybCBsaXN0IGZ1bmN0aW9uYWxpdHkgaXMgaGFuZGxlZCBieSBtdHJsIGNvcmUuXG4gKiBUaGVzZSBjb25zdGFudHMgYXJlIGZvciBhZGRvbnMtc3BlY2lmaWMgZmVhdHVyZXMgb25seS5cbiAqL1xuXG4vKipcbiAqIENTUyBjbGFzcyBuYW1lcyBmb3IgVkxpc3QgY29tcG9uZW50XG4gKiBGb2xsb3dpbmcgQkVNIGNvbnZlbnRpb246IGNvbXBvbmVudF9fZWxlbWVudC0tbW9kaWZpZXJcbiAqIE5vdGU6IG10cmwgcHJlZml4IGlzIGFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgY29yZSBET00gY2xhc3NlcyBzeXN0ZW1cbiAqL1xuZXhwb3J0IGNvbnN0IFZMSVNUX0NMQVNTRVMgPSB7XG4gIC8qKiBMaXN0IGVsZW1lbnQgKi9cbiAgTElTVDogXCJ2bGlzdFwiLFxuICAvKiogTGlzdCBpdGVtICovXG4gIElURU06IFwidmlld3BvcnQtaXRlbVwiLFxuICAvKiogU2VsZWN0ZWQgbGlzdCBpdGVtICovXG4gIFNFTEVDVEVEOiBcInZpZXdwb3J0LWl0ZW0tLXNlbGVjdGVkXCIsXG4gIC8qKiBFbXB0eSBzdGF0ZSAqL1xuICBFTVBUWTogXCJ2bGlzdC0tZW1wdHlcIixcbn0gYXMgY29uc3Q7XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL3NlbGVjdGlvbi50c1xuXG5pbXBvcnQgdHlwZSB7IFZMaXN0Q29uZmlnLCBWTGlzdENvbXBvbmVudCwgVkxpc3RJdGVtIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBWTElTVF9DTEFTU0VTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUFJFRklYLCBhZGRDbGFzcywgcmVtb3ZlQ2xhc3MgfSBmcm9tIFwibXRybFwiO1xuXG4vKipcbiAqIFNlbGVjdGlvbiBzdGF0ZSBpbnRlcmZhY2VcbiAqL1xuaW50ZXJmYWNlIFNlbGVjdGlvblN0YXRlIHtcbiAgc2VsZWN0ZWRJZHM6IFNldDxzdHJpbmcgfCBudW1iZXI+O1xuICBtb2RlOiBcIm5vbmVcIiB8IFwic2luZ2xlXCIgfCBcIm11bHRpcGxlXCI7XG4gIGxhc3RTZWxlY3RlZEluZGV4PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEdldCBpdGVtIElEIGZyb20gZWxlbWVudCBvciBpdGVtIGRhdGFcbiAqL1xuY29uc3QgZ2V0SXRlbUlkID0gKGl0ZW06IGFueSk6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChpdGVtPy5pZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gaXRlbS5pZDtcbiAgaWYgKGl0ZW0/Ll9pZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gaXRlbS5faWQ7XG4gIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgaXRlbSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIGl0ZW07XG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIEFkZHMgc2VsZWN0aW9uIG1hbmFnZW1lbnQgY2FwYWJpbGl0aWVzIHRvIFZMaXN0IGNvbXBvbmVudFxuICovXG5leHBvcnQgY29uc3Qgd2l0aFNlbGVjdGlvbiA9IDxUIGV4dGVuZHMgVkxpc3RJdGVtID0gVkxpc3RJdGVtPihcbiAgY29uZmlnOiBWTGlzdENvbmZpZzxUPixcbikgPT4ge1xuICByZXR1cm4gKGNvbXBvbmVudDogVkxpc3RDb21wb25lbnQ8VD4pOiBWTGlzdENvbXBvbmVudDxUPiA9PiB7XG4gICAgaWYgKCFjb25maWcuc2VsZWN0aW9uPy5lbmFibGVkIHx8IGNvbmZpZy5zZWxlY3Rpb24/Lm1vZGUgPT09IFwibm9uZVwiKSB7XG4gICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlOiBTZWxlY3Rpb25TdGF0ZSA9IHtcbiAgICAgIHNlbGVjdGVkSWRzOiBuZXcgU2V0KCksXG4gICAgICBtb2RlOiBjb25maWcuc2VsZWN0aW9uPy5tb2RlIHx8IFwic2luZ2xlXCIsXG4gICAgICBsYXN0U2VsZWN0ZWRJbmRleDogdW5kZWZpbmVkLFxuICAgIH07XG5cbiAgICBjb25zdCByZXF1aXJlTW9kaWZpZXJzID0gY29uZmlnLnNlbGVjdGlvbj8ucmVxdWlyZU1vZGlmaWVycyA/PyBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEFwcGx5IHNlbGVjdGlvbiBjbGFzcyB0byByZW5kZXJlZCBlbGVtZW50cyBtYXRjaGluZyBzZWxlY3RlZCBJRHNcbiAgICAgKi9cbiAgICBjb25zdCBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMgPSAoKSA9PiB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBjb21wb25lbnQuZWxlbWVudD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICAgYC4ke1BSRUZJWH0tdmlld3BvcnQtaXRlbXNgLFxuICAgICAgKTtcbiAgICAgIGlmICghY29udGFpbmVyKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGl0ZW1zID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICAgIGAuJHtQUkVGSVh9LXZpZXdwb3J0LWl0ZW1bZGF0YS1pZF1gLFxuICAgICAgKTtcblxuICAgICAgaXRlbXMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGVsIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBpZCA9IGVsZW1lbnQuZGF0YXNldC5pZDtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBDaGVjayBib3RoIHN0cmluZyBhbmQgbnVtYmVyIHZlcnNpb25zIG9mIHRoZSBJRFxuICAgICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPVxuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuaGFzKGlkKSB8fCBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoTnVtYmVyKGlkKSk7XG4gICAgICAgICAgaWYgKGlzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGFkZENsYXNzKGVsZW1lbnQsIFZMSVNUX0NMQVNTRVMuU0VMRUNURUQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBWTElTVF9DTEFTU0VTLlNFTEVDVEVEKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgaXRlbSBjbGljayBmb3Igc2VsZWN0aW9uXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlSXRlbUNsaWNrID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHZpZXdwb3J0SXRlbSA9IChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChcbiAgICAgICAgYC4ke1BSRUZJWH0tdmlld3BvcnQtaXRlbVtkYXRhLWluZGV4XWAsXG4gICAgICApIGFzIEhUTUxFbGVtZW50O1xuICAgICAgaWYgKCF2aWV3cG9ydEl0ZW0pIHJldHVybjtcblxuICAgICAgY29uc3QgaW5kZXggPSBwYXJzZUludCh2aWV3cG9ydEl0ZW0uZGF0YXNldC5pbmRleCB8fCBcIi0xXCIpO1xuICAgICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBlbmhhbmNlZENvbXBvbmVudCA9IGNvbXBvbmVudCBhcyBhbnk7XG4gICAgICBjb25zdCBpdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1zPy4oKTtcbiAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtcz8uW2luZGV4XTtcbiAgICAgIGlmICghaXRlbSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBpdGVtSWQgPSBnZXRJdGVtSWQoaXRlbSk7XG4gICAgICBpZiAoaXRlbUlkID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgICAgY29uc3Qgd2FzU2VsZWN0ZWQgPSBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoaXRlbUlkKTtcblxuICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IFwic2luZ2xlXCIpIHtcbiAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgaWYgKCF3YXNTZWxlY3RlZCkge1xuICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmFkZChpdGVtSWQpO1xuICAgICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ID0gaW5kZXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubW9kZSA9PT0gXCJtdWx0aXBsZVwiKSB7XG4gICAgICAgIGlmIChlLnNoaWZ0S2V5ICYmIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBzdGFydCA9IE1hdGgubWluKHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4LCBpbmRleCk7XG4gICAgICAgICAgY29uc3QgZW5kID0gTWF0aC5tYXgoc3RhdGUubGFzdFNlbGVjdGVkSW5kZXgsIGluZGV4KTtcblxuICAgICAgICAgIGlmICghZS5jdHJsS2V5ICYmICFlLm1ldGFLZXkpIHtcbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmNsZWFyKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCByYW5nZUl0ZW0gPSBpdGVtcz8uW2ldO1xuICAgICAgICAgICAgY29uc3QgcmFuZ2VJdGVtSWQgPSBnZXRJdGVtSWQocmFuZ2VJdGVtKTtcbiAgICAgICAgICAgIGlmIChyYW5nZUl0ZW1JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmFkZChyYW5nZUl0ZW1JZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGUuY3RybEtleSB8fCBlLm1ldGFLZXkpIHtcbiAgICAgICAgICBpZiAod2FzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmRlbGV0ZShpdGVtSWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5hZGQoaXRlbUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggPSBpbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAocmVxdWlyZU1vZGlmaWVycykge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmFkZChpdGVtSWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAod2FzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuZGVsZXRlKGl0ZW1JZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5hZGQoaXRlbUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggPSBpbmRleDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMoKTtcbiAgICAgIGVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRW1pdCBzZWxlY3Rpb24gY2hhbmdlIGV2ZW50XG4gICAgICovXG4gICAgY29uc3QgZW1pdFNlbGVjdGlvbkNoYW5nZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGVuaGFuY2VkQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIGFueTtcbiAgICAgIGNvbnN0IGl0ZW1zID0gZW5oYW5jZWRDb21wb25lbnQuZ2V0SXRlbXM/LigpIHx8IFtdO1xuXG4gICAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gaXRlbXMuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSBnZXRJdGVtSWQoaXRlbSk7XG4gICAgICAgIHJldHVybiBpZCAhPT0gdW5kZWZpbmVkICYmIHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhpZCk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc2VsZWN0ZWRJbmRpY2VzID0gaXRlbXMucmVkdWNlKFxuICAgICAgICAoYWNjOiBudW1iZXJbXSwgaXRlbTogYW55LCBpZHg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkID0gZ2V0SXRlbUlkKGl0ZW0pO1xuICAgICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkICYmIHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKGlkeCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sXG4gICAgICAgIFtdIGFzIG51bWJlcltdLFxuICAgICAgKTtcblxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInNlbGVjdGlvbjpjaGFuZ2VcIiwgeyBzZWxlY3RlZEl0ZW1zLCBzZWxlY3RlZEluZGljZXMgfSk7XG5cbiAgICAgIGlmIChjb25maWcuc2VsZWN0aW9uPy5vblNlbGVjdGlvbkNoYW5nZSkge1xuICAgICAgICBjb25maWcuc2VsZWN0aW9uLm9uU2VsZWN0aW9uQ2hhbmdlKHNlbGVjdGVkSXRlbXMsIHNlbGVjdGVkSW5kaWNlcyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFNldHVwOiBsaXN0ZW4gZm9yIHJlbmRlcnMgYW5kIGNsaWNrc1xuICAgIGNvbnN0IHNldHVwID0gKCkgPT4ge1xuICAgICAgLy8gQWRkIG1vZGUgY2xhc3MgdG8gY29udGFpbmVyXG4gICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgYWRkQ2xhc3MoY29tcG9uZW50LmVsZW1lbnQsIFwidmxpc3QtLXNlbGVjdGlvblwiKTtcbiAgICAgICAgYWRkQ2xhc3MoY29tcG9uZW50LmVsZW1lbnQsIGB2bGlzdC0tc2VsZWN0aW9uLSR7c3RhdGUubW9kZX1gKTtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUl0ZW1DbGljaywgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFwcGx5IHNlbGVjdGlvbiBhZnRlciBlYWNoIHJlbmRlclxuICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLm9uPy4oXG4gICAgICAgIFwidmlld3BvcnQ6aXRlbXMtcmVuZGVyZWRcIixcbiAgICAgICAgYXBwbHlTZWxlY3Rpb25Ub0VsZW1lbnRzLFxuICAgICAgKTtcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5vbj8uKFwidmlld3BvcnQ6cmVuZGVyZWRcIiwgYXBwbHlTZWxlY3Rpb25Ub0VsZW1lbnRzKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgc2VsZWN0aW9uIHdoZW4gaXRlbSBpcyByZW1vdmVkXG4gICAgICAoY29tcG9uZW50IGFzIGFueSkub24/LihcbiAgICAgICAgXCJpdGVtOnJlbW92ZWRcIixcbiAgICAgICAgKGRhdGE6IHsgaXRlbTogYW55OyBpbmRleDogbnVtYmVyIH0pID0+IHtcbiAgICAgICAgICBjb25zdCBpdGVtSWQgPSBnZXRJdGVtSWQoZGF0YS5pdGVtKTtcbiAgICAgICAgICBpZiAoaXRlbUlkICE9PSB1bmRlZmluZWQgJiYgc3RhdGUuc2VsZWN0ZWRJZHMuaGFzKGl0ZW1JZCkpIHtcbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmRlbGV0ZShpdGVtSWQpO1xuICAgICAgICAgICAgLy8gSWYgdGhlIHJlbW92ZWQgaXRlbSB3YXMgdGhlIGxhc3Qgc2VsZWN0ZWQgaW5kZXgsIGNsZWFyIGl0XG4gICAgICAgICAgICBpZiAoc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggPT09IGRhdGEuaW5kZXgpIHtcbiAgICAgICAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ID4gZGF0YS5pbmRleFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIC8vIEFkanVzdCBsYXN0U2VsZWN0ZWRJbmRleCBzaW5jZSBpdGVtcyBzaGlmdGVkIGRvd25cbiAgICAgICAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXgtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvLyBJbml0aWFsaXplIGFmdGVyIGNvbXBvbmVudCBpcyByZWFkeVxuICAgIHNldFRpbWVvdXQoc2V0dXAsIDApO1xuXG4gICAgLy8gTGlzdGVuIGZvciBpbml0aWFsIGxvYWQgY29tcGxldGUgdG8gYXV0by1zZWxlY3QgaXRlbVxuICAgIC8vIFRoaXMgbXVzdCBiZSBpbiB3aXRoU2VsZWN0aW9uIGJlY2F1c2Ugc2VsZWN0QnlJZCBpcyBkZWZpbmVkIGhlcmVcbiAgICAoY29tcG9uZW50IGFzIGFueSkub24/LihcbiAgICAgIFwiY29sbGVjdGlvbjppbml0aWFsLWxvYWQtY29tcGxldGVcIixcbiAgICAgIChkYXRhOiB7IHNlbGVjdElkOiBzdHJpbmcgfCBudW1iZXIgfSkgPT4ge1xuICAgICAgICBpZiAoZGF0YT8uc2VsZWN0SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFVzZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgdG8gZW5zdXJlIHJlbmRlcmluZyBpcyBjb21wbGV0ZVxuICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoc3RhdGUubW9kZSA9PT0gXCJzaW5nbGVcIikge1xuICAgICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuYWRkKGRhdGEuc2VsZWN0SWQpO1xuICAgICAgICAgICAgYXBwbHlTZWxlY3Rpb25Ub0VsZW1lbnRzKCk7XG4gICAgICAgICAgICBlbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIENsZWFudXAgb24gZGVzdHJveVxuICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IGNvbXBvbmVudC5kZXN0cm95O1xuICAgIGNvbXBvbmVudC5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgY29tcG9uZW50LmVsZW1lbnQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVJdGVtQ2xpY2ssIHRydWUpO1xuICAgICAgb3JpZ2luYWxEZXN0cm95Py4oKTtcbiAgICB9O1xuXG4gICAgLy8gRW5oYW5jZWQgY29tcG9uZW50IHdpdGggc2VsZWN0aW9uIEFQSVxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG5cbiAgICAgIHNlbGVjdEl0ZW1zKGluZGljZXM6IG51bWJlcltdKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gKHRoaXMgYXMgYW55KS5nZXRJdGVtcz8uKCk7XG4gICAgICAgIGlmICghaXRlbXMpIHJldHVybjtcblxuICAgICAgICBpZiAoc3RhdGUubW9kZSA9PT0gXCJzaW5nbGVcIikge1xuICAgICAgICAgIC8vIEluIHNpbmdsZSBtb2RlLCBjbGVhciBwcmV2aW91cyBzZWxlY3Rpb24gYmVmb3JlIGFkZGluZyBuZXcgb25lXG4gICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgICBpZiAoaW5kaWNlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBpbmRpY2VzID0gW2luZGljZXNbMF1dO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGluZGljZXMuZm9yRWFjaCgoaW5kZXgpID0+IHtcbiAgICAgICAgICBjb25zdCBpdGVtSWQgPSBnZXRJdGVtSWQoaXRlbXNbaW5kZXhdKTtcbiAgICAgICAgICBpZiAoaXRlbUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmFkZChpdGVtSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGluZGljZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ID0gaW5kaWNlc1tpbmRpY2VzLmxlbmd0aCAtIDFdO1xuICAgICAgICB9XG5cbiAgICAgICAgYXBwbHlTZWxlY3Rpb25Ub0VsZW1lbnRzKCk7XG4gICAgICAgIGVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICAgIH0sXG5cbiAgICAgIGRlc2VsZWN0SXRlbXMoaW5kaWNlczogbnVtYmVyW10pIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSAodGhpcyBhcyBhbnkpLmdldEl0ZW1zPy4oKTtcbiAgICAgICAgaWYgKCFpdGVtcykgcmV0dXJuO1xuXG4gICAgICAgIGluZGljZXMuZm9yRWFjaCgoaW5kZXgpID0+IHtcbiAgICAgICAgICBjb25zdCBpdGVtSWQgPSBnZXRJdGVtSWQoaXRlbXNbaW5kZXhdKTtcbiAgICAgICAgICBpZiAoaXRlbUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmRlbGV0ZShpdGVtSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXBwbHlTZWxlY3Rpb25Ub0VsZW1lbnRzKCk7XG4gICAgICAgIGVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICAgIH0sXG5cbiAgICAgIGNsZWFyU2VsZWN0aW9uKCkge1xuICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgYXBwbHlTZWxlY3Rpb25Ub0VsZW1lbnRzKCk7XG4gICAgICAgIGVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICAgIH0sXG5cbiAgICAgIGdldFNlbGVjdGVkSXRlbXMoKTogVFtdIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSAodGhpcyBhcyBhbnkpLmdldEl0ZW1zPy4oKSB8fCBbXTtcbiAgICAgICAgcmV0dXJuIGl0ZW1zLmZpbHRlcigoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgaWQgPSBnZXRJdGVtSWQoaXRlbSk7XG4gICAgICAgICAgcmV0dXJuIGlkICE9PSB1bmRlZmluZWQgJiYgc3RhdGUuc2VsZWN0ZWRJZHMuaGFzKGlkKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICBnZXRTZWxlY3RlZEluZGljZXMoKTogbnVtYmVyW10ge1xuICAgICAgICBjb25zdCBpdGVtcyA9ICh0aGlzIGFzIGFueSkuZ2V0SXRlbXM/LigpIHx8IFtdO1xuICAgICAgICByZXR1cm4gaXRlbXMucmVkdWNlKChhY2M6IG51bWJlcltdLCBpdGVtOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBpZCA9IGdldEl0ZW1JZChpdGVtKTtcbiAgICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCAmJiBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoaWQpKSB7XG4gICAgICAgICAgICBhY2MucHVzaChpbmRleCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIFtdIGFzIG51bWJlcltdKTtcbiAgICAgIH0sXG5cbiAgICAgIGlzU2VsZWN0ZWQoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9ICh0aGlzIGFzIGFueSkuZ2V0SXRlbXM/LigpO1xuICAgICAgICBjb25zdCBpdGVtSWQgPSBnZXRJdGVtSWQoaXRlbXM/LltpbmRleF0pO1xuICAgICAgICByZXR1cm4gaXRlbUlkICE9PSB1bmRlZmluZWQgJiYgc3RhdGUuc2VsZWN0ZWRJZHMuaGFzKGl0ZW1JZCk7XG4gICAgICB9LFxuXG4gICAgICBzZWxlY3RCeUlkKGlkOiBzdHJpbmcgfCBudW1iZXIsIHNpbGVudDogYm9vbGVhbiA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IFwic2luZ2xlXCIpIHtcbiAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuYWRkKGlkKTtcbiAgICAgICAgYXBwbHlTZWxlY3Rpb25Ub0VsZW1lbnRzKCk7XG4gICAgICAgIGlmICghc2lsZW50KSB7XG4gICAgICAgICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTZWxlY3QgaXRlbSBhdCBpbmRleCwgc2Nyb2xsaW5nIGFuZCB3YWl0aW5nIGZvciBkYXRhIGlmIG5lZWRlZFxuICAgICAgICogSGFuZGxlcyB2aXJ0dWFsIHNjcm9sbGluZyBieSBsb2FkaW5nIGRhdGEgYmVmb3JlIHNlbGVjdGluZ1xuICAgICAgICovXG4gICAgICBhc3luYyBzZWxlY3RBdEluZGV4KGluZGV4OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgZW5oYW5jZWRDb21wb25lbnQgPSBjb21wb25lbnQgYXMgYW55O1xuICAgICAgICBjb25zdCB0b3RhbEl0ZW1zID0gZW5oYW5jZWRDb21wb25lbnQuZ2V0SXRlbUNvdW50Py4oKSB8fCAwO1xuXG4gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdG90YWxJdGVtcykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpcnN0IHNjcm9sbCB0byB0aGUgaW5kZXggKHRyaWdnZXJzIGRhdGEgbG9hZGluZyBpZiBuZWVkZWQpXG4gICAgICAgIGlmIChlbmhhbmNlZENvbXBvbmVudC52aWV3cG9ydD8uc2Nyb2xsVG9JbmRleCkge1xuICAgICAgICAgIGVuaGFuY2VkQ29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbFRvSW5kZXgoaW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJ5IHRvIHNlbGVjdCBpbW1lZGlhdGVseSAtIHdvcmtzIGlmIGl0ZW0gaXMgYWxyZWFkeSBsb2FkZWRcbiAgICAgICAgY29uc3QgaXRlbXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRJdGVtcz8uKCkgfHwgW107XG4gICAgICAgIGlmIChpdGVtc1tpbmRleF0pIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW1zKFtpbmRleF0pO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXRlbSBub3QgbG9hZGVkIHlldCAtIHdhaXQgZm9yIGRhdGEgdG8gbG9hZCB0aGVuIHNlbGVjdFxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBsZXQgcmVzb2x2ZWQgPSBmYWxzZTtcblxuICAgICAgICAgIGNvbnN0IG9uUmFuZ2VMb2FkZWQgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzb2x2ZWQpIHJldHVybjtcbiAgICAgICAgICAgIHJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5vZmY/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBvblJhbmdlTG9hZGVkKTtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbXMoW2luZGV4XSk7XG4gICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpyYW5nZS1sb2FkZWRcIiwgb25SYW5nZUxvYWRlZCk7XG5cbiAgICAgICAgICAvLyBGYWxsYmFjayB0aW1lb3V0IGluIGNhc2UgZXZlbnQgZG9lc24ndCBmaXJlIChkYXRhIGFscmVhZHkgbG9hZGVkKVxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm47XG4gICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICBjb21wb25lbnQub2ZmPy4oXCJ2aWV3cG9ydDpyYW5nZS1sb2FkZWRcIiwgb25SYW5nZUxvYWRlZCk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW1zKFtpbmRleF0pO1xuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICB9LCAzMDApO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2VsZWN0IG5leHQgaXRlbSByZWxhdGl2ZSB0byBjdXJyZW50IHNlbGVjdGlvblxuICAgICAgICogSGFuZGxlcyB2aXJ0dWFsIHNjcm9sbGluZyBieSBsb2FkaW5nIGRhdGEgYmVmb3JlIHNlbGVjdGluZ1xuICAgICAgICovXG4gICAgICBhc3luYyBzZWxlY3ROZXh0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBlbmhhbmNlZENvbXBvbmVudCA9IGNvbXBvbmVudCBhcyBhbnk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSW5kaWNlcyA9IHRoaXMuZ2V0U2VsZWN0ZWRJbmRpY2VzKCk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkSW5kaWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAvLyBTZWxlY3QgZmlyc3QgaXRlbVxuICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdEF0SW5kZXgoMCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSBzZWxlY3RlZEluZGljZXNbMF07XG4gICAgICAgIGNvbnN0IG5leHRJbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XG4gICAgICAgIGNvbnN0IHRvdGFsSXRlbXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRJdGVtQ291bnQ/LigpIHx8IDA7XG5cbiAgICAgICAgaWYgKG5leHRJbmRleCA8IHRvdGFsSXRlbXMpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RBdEluZGV4KG5leHRJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNlbGVjdCBwcmV2aW91cyBpdGVtIHJlbGF0aXZlIHRvIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAgICAgKiBIYW5kbGVzIHZpcnR1YWwgc2Nyb2xsaW5nIGJ5IGxvYWRpbmcgZGF0YSBiZWZvcmUgc2VsZWN0aW5nXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIHNlbGVjdFByZXZpb3VzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSB0aGlzLmdldFNlbGVjdGVkSW5kaWNlcygpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZEluZGljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gc2VsZWN0ZWRJbmRpY2VzWzBdO1xuICAgICAgICBjb25zdCBwcmV2SW5kZXggPSBjdXJyZW50SW5kZXggLSAxO1xuXG4gICAgICAgIGlmIChwcmV2SW5kZXggPj0gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdEF0SW5kZXgocHJldkluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhTZWxlY3Rpb247XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL2Zvcm0vZm9ybS50c1xuXG4vKipcbiAqIEZvcm0gQ29tcG9uZW50IC0gRnVuY3Rpb25hbCBmb3JtIGJ1aWxkZXIgd2l0aCBtdHJsIGNvbXBvc2l0aW9uXG4gKlxuICogQSBmb3JtIGNvbXBvbmVudCB0aGF0IHVzZXMgdGhlIG10cmwtYWRkb25zIGxheW91dCBzeXN0ZW0gdG8gYnVpbGRcbiAqIGZvcm1zIGZyb20gc2NoZW1hIGRlZmluaXRpb25zLCB3aXRoIGJ1aWx0LWluIGRhdGEgbWFuYWdlbWVudCxcbiAqIHZhbGlkYXRpb24sIGFuZCBzdWJtaXNzaW9uIGhhbmRsaW5nLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRm9ybUNvbmZpZywgRm9ybUNvbXBvbmVudCB9IGZyb20gJy4vdHlwZXMnXG5cbi8vIEltcG9ydCBtdHJsIGNvbXBvc2Ugc3lzdGVtXG5pbXBvcnQgeyBwaXBlIH0gZnJvbSAnbXRybCdcbmltcG9ydCB7IGNyZWF0ZUJhc2UsIHdpdGhFbGVtZW50IH0gZnJvbSAnbXRybCdcbmltcG9ydCB7IHdpdGhFdmVudHMsIHdpdGhMaWZlY3ljbGUgfSBmcm9tICdtdHJsJ1xuXG4vLyBJbXBvcnQgZm9ybSBmZWF0dXJlc1xuaW1wb3J0IHtcbiAgd2l0aExheW91dCxcbiAgd2l0aEZpZWxkcyxcbiAgd2l0aERhdGEsXG4gIHdpdGhDb250cm9sbGVyLFxuICB3aXRoU3VibWl0LFxuICB3aXRoQVBJXG59IGZyb20gJy4vZmVhdHVyZXMnXG5cbi8vIEltcG9ydCBjb25maWd1cmF0aW9uXG5pbXBvcnQgeyBjcmVhdGVCYXNlQ29uZmlnLCBnZXRFbGVtZW50Q29uZmlnIH0gZnJvbSAnLi9jb25maWcnXG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBGb3JtIGNvbXBvbmVudCB1c2luZyBmdW5jdGlvbmFsIGNvbXBvc2l0aW9uXG4gKlxuICogQHBhcmFtIHtGb3JtQ29uZmlnfSBjb25maWcgLSBGb3JtIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHJldHVybnMge0Zvcm1Db21wb25lbnR9IEEgZnVsbHkgY29uZmlndXJlZCBmb3JtIGNvbXBvbmVudFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBjcmVhdGVGb3JtIH0gZnJvbSAnbXRybC1hZGRvbnMnXG4gKiBpbXBvcnQgeyBjcmVhdGVUZXh0ZmllbGQsIGNyZWF0ZVN3aXRjaCwgY3JlYXRlQ2hpcHMgfSBmcm9tICdtdHJsJ1xuICpcbiAqIGNvbnN0IGZvcm0gPSBjcmVhdGVGb3JtKHtcbiAqICAgY2xhc3M6ICdhY2NvdW50LWZvcm0nLFxuICogICBhY3Rpb246ICcvYXBpL3VzZXJzLycsXG4gKiAgIGxheW91dDogW1xuICogICAgIFsnc2VjdGlvbicsIHsgY2xhc3M6ICd1c2VyLXNlY3Rpb24nIH0sXG4gKiAgICAgICBbJ2RpdicsIHsgY2xhc3M6ICdzZWN0aW9uLXRpdGxlJywgdGV4dDogJ1VzZXInIH1dLFxuICogICAgICAgW2NyZWF0ZVRleHRmaWVsZCwgJ2luZm8udXNlcm5hbWUnLCB7IGxhYmVsOiAnVXNlcm5hbWUnIH1dLFxuICogICAgICAgW2NyZWF0ZUNoaXBzLCAnaW5mby5yb2xlJywge1xuICogICAgICAgICBsYWJlbDogJ1JvbGUnLFxuICogICAgICAgICBjaGlwczogW1xuICogICAgICAgICAgIHsgdGV4dDogJ3JlZ2lzdGVyZWQnLCB2YWx1ZTogJ3JlZ2lzdGVyZWQnIH0sXG4gKiAgICAgICAgICAgeyB0ZXh0OiAnYWRtaW4nLCB2YWx1ZTogJ2FkbWluJyB9LFxuICogICAgICAgICAgIHsgdGV4dDogJ3ByZW1pdW0nLCB2YWx1ZTogJ3ByZW1pdW0nIH1cbiAqICAgICAgICAgXVxuICogICAgICAgfV0sXG4gKiAgICAgICBbY3JlYXRlU3dpdGNoLCAnaW5mby5lbmFibGVkJywgeyBsYWJlbDogJ0VuYWJsZWQnIH1dXG4gKiAgICAgXVxuICogICBdLFxuICogICBvbjoge1xuICogICAgIGNoYW5nZTogKGRhdGEpID0+IGNvbnNvbGUubG9nKCdGb3JtIGNoYW5nZWQ6JywgZGF0YSksXG4gKiAgICAgc3VibWl0OiAoZGF0YSkgPT4gY29uc29sZS5sb2coJ0Zvcm0gc3VibWl0dGVkOicsIGRhdGEpXG4gKiAgIH1cbiAqIH0pXG4gKlxuICogLy8gQXBwZW5kIHRvIERPTVxuICogZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmb3JtLmVsZW1lbnQpXG4gKlxuICogLy8gU2V0IGRhdGFcbiAqIGZvcm0uc2V0RGF0YSh7XG4gKiAgIHVzZXJuYW1lOiAnam9obl9kb2UnLFxuICogICByb2xlOiAnYWRtaW4nLFxuICogICBlbmFibGVkOiB0cnVlXG4gKiB9KVxuICpcbiAqIC8vIEdldCBkYXRhXG4gKiBjb25zdCBkYXRhID0gZm9ybS5nZXREYXRhKClcbiAqXG4gKiAvLyBDaGVjayBpZiBtb2RpZmllZFxuICogaWYgKGZvcm0uaXNNb2RpZmllZCgpKSB7XG4gKiAgIGF3YWl0IGZvcm0uc3VibWl0KClcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlRm9ybSA9IChjb25maWc6IEZvcm1Db25maWcgPSB7fSk6IEZvcm1Db21wb25lbnQgPT4ge1xuICB0cnkge1xuICAgIC8vIFByb2Nlc3MgY29uZmlndXJhdGlvbiB3aXRoIGRlZmF1bHRzXG4gICAgY29uc3QgYmFzZUNvbmZpZyA9IGNyZWF0ZUJhc2VDb25maWcoY29uZmlnKVxuXG4gICAgLy8gQnVpbGQgdGhlIGZvcm0gdGhyb3VnaCBmdW5jdGlvbmFsIGNvbXBvc2l0aW9uXG4gICAgLy8gRWFjaCBmdW5jdGlvbiBpbiB0aGUgcGlwZSBhZGRzIHNwZWNpZmljIGNhcGFiaWxpdGllc1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IHBpcGUoXG4gICAgICAvLyAxLiBGb3VuZGF0aW9uIGxheWVyIC0gQmFzZSBjb21wb25lbnQgd2l0aCBjb25maWdcbiAgICAgIGNyZWF0ZUJhc2UsXG5cbiAgICAgIC8vIDIuIEV2ZW50IHN5c3RlbSAtIEFkZHMgb24vb2ZmL2VtaXQgbWV0aG9kc1xuICAgICAgd2l0aEV2ZW50cygpLFxuXG4gICAgICAvLyAzLiBET00gZWxlbWVudCAtIENyZWF0ZXMgdGhlIHJvb3QgY29udGFpbmVyIGVsZW1lbnRcbiAgICAgIHdpdGhFbGVtZW50KGdldEVsZW1lbnRDb25maWcoYmFzZUNvbmZpZykpLFxuXG4gICAgICAvLyA0LiBMYXlvdXQgLSBDcmVhdGVzIGZvcm0gZWxlbWVudCBhbmQgcHJvY2Vzc2VzIGxheW91dCBzY2hlbWFcbiAgICAgIHdpdGhMYXlvdXQoYmFzZUNvbmZpZyksXG5cbiAgICAgIC8vIDUuIEZpZWxkcyAtIEV4dHJhY3RzIGZpZWxkcyBmcm9tIGxheW91dCBhbmQgY3JlYXRlcyByZWdpc3RyeVxuICAgICAgd2l0aEZpZWxkcyhiYXNlQ29uZmlnKSxcblxuICAgICAgLy8gNi4gRGF0YSAtIEFkZHMgZGF0YSBtYW5hZ2VtZW50IChnZXQvc2V0LCBjaGFuZ2UgdHJhY2tpbmcpXG4gICAgICB3aXRoRGF0YShiYXNlQ29uZmlnKSxcblxuICAgICAgLy8gNy4gQ29udHJvbGxlciAtIEFkZHMgbW9kZSBtYW5hZ2VtZW50IChyZWFkL2NyZWF0ZS91cGRhdGUpXG4gICAgICB3aXRoQ29udHJvbGxlcihiYXNlQ29uZmlnKSxcblxuICAgICAgLy8gOC4gU3VibWl0IC0gQWRkcyB2YWxpZGF0aW9uIGFuZCBzdWJtaXNzaW9uIGhhbmRsaW5nXG4gICAgICB3aXRoU3VibWl0KGJhc2VDb25maWcpLFxuXG4gICAgICAvLyA5LiBMaWZlY3ljbGUgLSBBZGRzIGxpZmVjeWNsZSBtYW5hZ2VtZW50IChkZXN0cm95KVxuICAgICAgd2l0aExpZmVjeWNsZSgpLFxuXG4gICAgICAvLyAxMC4gQVBJIC0gQ3JlYXRlcyBjbGVhbiBwdWJsaWMgQVBJXG4gICAgICB3aXRoQVBJKGJhc2VDb25maWcpXG4gICAgKShiYXNlQ29uZmlnKVxuXG4gICAgLy8gQXBwZW5kIHRvIGNvbnRhaW5lciBpZiBwcm92aWRlZFxuICAgIGlmIChjb25maWcuY29udGFpbmVyICYmIGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICBjb25maWcuY29udGFpbmVyLmFwcGVuZENoaWxkKGNvbXBvbmVudC5lbGVtZW50KVxuICAgIH1cblxuICAgIHJldHVybiBjb21wb25lbnQgYXMgRm9ybUNvbXBvbmVudFxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Zvcm0gY3JlYXRpb24gZXJyb3I6JywgZXJyb3IpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGZvcm06ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlRm9ybVxuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2xheW91dC50c1xuXG4vKipcbiAqIExheW91dCBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogQnVpbGRzIHRoZSBmb3JtIHN0cnVjdHVyZSBmcm9tIGEgbGF5b3V0IHNjaGVtYSB1c2luZyBtdHJsLWFkZG9ucyBsYXlvdXQgc3lzdGVtXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlTGF5b3V0IH0gZnJvbSBcIi4uLy4uLy4uL2NvcmUvbGF5b3V0XCI7XG5pbXBvcnQgdHlwZSB7IEZvcm1Db25maWcsIEJhc2VGb3JtQ29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBGT1JNX0RFRkFVTFRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGZvcm0gZWxlbWVudFxuICovXG5jb25zdCBjcmVhdGVGb3JtRWxlbWVudCA9IChjb25maWc6IEZvcm1Db25maWcpOiBIVE1MRm9ybUVsZW1lbnQgPT4ge1xuICBjb25zdCBmb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImZvcm1cIik7XG5cbiAgaWYgKGNvbmZpZy5tZXRob2QpIHtcbiAgICBmb3JtLnNldEF0dHJpYnV0ZShcIm1ldGhvZFwiLCBjb25maWcubWV0aG9kKTtcbiAgfVxuXG4gIGlmIChjb25maWcuYWN0aW9uKSB7XG4gICAgZm9ybS5zZXRBdHRyaWJ1dGUoXCJhY3Rpb25cIiwgY29uZmlnLmFjdGlvbik7XG4gIH1cblxuICBpZiAoY29uZmlnLmF1dG9jb21wbGV0ZSkge1xuICAgIGZvcm0uc2V0QXR0cmlidXRlKFwiYXV0b2NvbXBsZXRlXCIsIGNvbmZpZy5hdXRvY29tcGxldGUpO1xuICB9XG5cbiAgLy8gUHJldmVudCBkZWZhdWx0IGZvcm0gc3VibWlzc2lvbiAtIHdlIGhhbmRsZSBpdCBwcm9ncmFtbWF0aWNhbGx5XG4gIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGZvcm07XG59O1xuXG4vKipcbiAqIFByb2Nlc3NlcyBsYXlvdXQgc2NoZW1hIGFuZCBleHRyYWN0cyBuYW1lZCBjb21wb25lbnRzXG4gKi9cbmNvbnN0IHByb2Nlc3NMYXlvdXRTY2hlbWEgPSAoXG4gIHNjaGVtYTogdW5rbm93bltdLFxuICBmb3JtOiBIVE1MRm9ybUVsZW1lbnQsXG4gIGNvbmZpZzogRm9ybUNvbmZpZyxcbik6IHsgdWk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBsYXlvdXRSZXN1bHQ6IHVua25vd24gfSA9PiB7XG4gIGlmICghc2NoZW1hIHx8ICFBcnJheS5pc0FycmF5KHNjaGVtYSkgfHwgc2NoZW1hLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB7IHVpOiB7fSwgbGF5b3V0UmVzdWx0OiBudWxsIH07XG4gIH1cblxuICAvLyBVc2UgbXRybC1hZGRvbnMgY3JlYXRlTGF5b3V0IHRvIHByb2Nlc3MgdGhlIHNjaGVtYVxuICBjb25zdCBsYXlvdXRSZXN1bHQgPSBjcmVhdGVMYXlvdXQoc2NoZW1hLCBmb3JtLCB7fSk7XG5cbiAgLy8gRXh0cmFjdCBuYW1lZCBjb21wb25lbnRzIGZyb20gbGF5b3V0IHJlc3VsdFxuICBjb25zdCB1aTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICBpZiAobGF5b3V0UmVzdWx0ICYmIHR5cGVvZiBsYXlvdXRSZXN1bHQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAvLyBUaGUgbGF5b3V0IHJlc3VsdCBjb250YWlucyBjb21wb25lbnQgcmVmZXJlbmNlc1xuICAgIGNvbnN0IHJlc3VsdCA9IGxheW91dFJlc3VsdCBhcyB7IGNvbXBvbmVudD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH07XG4gICAgaWYgKHJlc3VsdC5jb21wb25lbnQpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odWksIHJlc3VsdC5jb21wb25lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IHVpLCBsYXlvdXRSZXN1bHQgfTtcbn07XG5cbi8qKlxuICogd2l0aExheW91dCBmZWF0dXJlXG4gKiBBZGRzIGZvcm0gZWxlbWVudCBjcmVhdGlvbiBhbmQgbGF5b3V0IHByb2Nlc3NpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhMYXlvdXQgPSAoY29uZmlnOiBGb3JtQ29uZmlnKSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIEJhc2VGb3JtQ29tcG9uZW50PihcbiAgICBjb21wb25lbnQ6IFQsXG4gICk6IFQgJiB7XG4gICAgZm9ybTogSFRNTEZvcm1FbGVtZW50O1xuICAgIHVpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBsYXlvdXRSZXN1bHQ6IHVua25vd247XG4gIH0gPT4ge1xuICAgIC8vIENyZWF0ZSB0aGUgZm9ybSBlbGVtZW50XG4gICAgY29uc3QgZm9ybSA9IGNyZWF0ZUZvcm1FbGVtZW50KGNvbmZpZyk7XG5cbiAgICAvLyBBcHBlbmQgZm9ybSB0byBjb21wb25lbnQncyByb290IGVsZW1lbnRcbiAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFwcGVuZENoaWxkKGZvcm0pO1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgbGF5b3V0IHNjaGVtYSBpZiBwcm92aWRlZFxuICAgIGNvbnN0IHsgdWksIGxheW91dFJlc3VsdCB9ID0gY29uZmlnLmxheW91dFxuICAgICAgPyBwcm9jZXNzTGF5b3V0U2NoZW1hKGNvbmZpZy5sYXlvdXQsIGZvcm0sIGNvbmZpZylcbiAgICAgIDogeyB1aToge30sIGxheW91dFJlc3VsdDogbnVsbCB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIGZvcm0sXG4gICAgICB1aSxcbiAgICAgIGxheW91dFJlc3VsdCxcbiAgICB9O1xuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgd2l0aExheW91dDtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9jb25zdGFudHMudHNcblxuLyoqXG4gKiBEYXRhIHN0YXRlIGNvbnN0YW50c1xuICogVHJhY2tzIHdoZXRoZXIgZm9ybSBkYXRhIGhhcyBiZWVuIG1vZGlmaWVkIGZyb20gaW5pdGlhbCBzdGF0ZVxuICovXG5leHBvcnQgY29uc3QgREFUQV9TVEFURSA9IHtcbiAgLyoqIERhdGEgbWF0Y2hlcyBpbml0aWFsIHN0YXRlIC0gbm8gY2hhbmdlcyBtYWRlICovXG4gIFBSSVNUSU5FOiBcInByaXN0aW5lXCIsXG4gIC8qKiBEYXRhIGhhcyBiZWVuIG1vZGlmaWVkIGZyb20gaW5pdGlhbCBzdGF0ZSAqL1xuICBESVJUWTogXCJkaXJ0eVwiLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBGb3JtIGV2ZW50IGNvbnN0YW50c1xuICovXG5leHBvcnQgY29uc3QgRk9STV9FVkVOVFMgPSB7XG4gIC8qKiBGaXJlZCB3aGVuIGFueSBmaWVsZCB2YWx1ZSBjaGFuZ2VzICovXG4gIENIQU5HRTogXCJjaGFuZ2VcIixcbiAgLyoqIEZpcmVkIHdoZW4gZm9ybSBpcyBzdWJtaXR0ZWQgKi9cbiAgU1VCTUlUOiBcInN1Ym1pdFwiLFxuICAvKiogRmlyZWQgd2hlbiBkYXRhIHN0YXRlIGNoYW5nZXMgKHByaXN0aW5lIDwtPiBkaXJ0eSkgKi9cbiAgU1RBVEVfQ0hBTkdFOiBcInN0YXRlOmNoYW5nZVwiLFxuICAvKiogRmlyZWQgd2hlbiBkYXRhIGlzIHNldCBvbiB0aGUgZm9ybSAqL1xuICBEQVRBX1NFVDogXCJkYXRhOnNldFwiLFxuICAvKiogRmlyZWQgd2hlbiBkYXRhIGlzIHJldHJpZXZlZCBmcm9tIHRoZSBmb3JtICovXG4gIERBVEFfR0VUOiBcImRhdGE6Z2V0XCIsXG4gIC8qKiBGaXJlZCB3aGVuIGEgc3BlY2lmaWMgZmllbGQgY2hhbmdlcyAqL1xuICBGSUVMRF9DSEFOR0U6IFwiZmllbGQ6Y2hhbmdlXCIsXG4gIC8qKiBGaXJlZCB3aGVuIHZhbGlkYXRpb24gZmFpbHMgKi9cbiAgVkFMSURBVElPTl9FUlJPUjogXCJ2YWxpZGF0aW9uOmVycm9yXCIsXG4gIC8qKiBGaXJlZCB3aGVuIHN1Ym1pdCBzdWNjZWVkcyAqL1xuICBTVUJNSVRfU1VDQ0VTUzogXCJzdWJtaXQ6c3VjY2Vzc1wiLFxuICAvKiogRmlyZWQgd2hlbiBzdWJtaXQgZmFpbHMgKi9cbiAgU1VCTUlUX0VSUk9SOiBcInN1Ym1pdDplcnJvclwiLFxuICAvKiogRmlyZWQgd2hlbiBmb3JtIGlzIHJlc2V0IHRvIGluaXRpYWwgc3RhdGUgKi9cbiAgUkVTRVQ6IFwicmVzZXRcIixcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogRm9ybSBDU1MgY2xhc3MgbW9kaWZpZXJzXG4gKi9cbmV4cG9ydCBjb25zdCBGT1JNX0NMQVNTRVMgPSB7XG4gIC8qKiBBcHBsaWVkIHdoZW4gZGF0YSBoYXMgYmVlbiBtb2RpZmllZCAqL1xuICBNT0RJRklFRDogXCJtb2RpZmllZFwiLFxuICAvKiogQXBwbGllZCB3aGVuIGZvcm0gaXMgc3VibWl0dGluZyAqL1xuICBTVUJNSVRUSU5HOiBcInN1Ym1pdHRpbmdcIixcbiAgLyoqIEFwcGxpZWQgd2hlbiBmb3JtIGlzIGRpc2FibGVkICovXG4gIERJU0FCTEVEOiBcImRpc2FibGVkXCIsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIERlZmF1bHQgZm9ybSBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBGT1JNX0RFRkFVTFRTID0ge1xuICBwcmVmaXg6IFwibXRybFwiLFxuICBjb21wb25lbnROYW1lOiBcImZvcm1cIixcbiAgdGFnOiBcImRpdlwiLFxuICBmb3JtVGFnOiBcImZvcm1cIixcbiAgbWV0aG9kOiBcIlBPU1RcIixcbiAgYXV0b2NvbXBsZXRlOiBcIm9mZlwiLFxuICB1c2VDaGFuZ2VzOiB0cnVlLFxuICBjb250cm9sczogW1wic3VibWl0XCIsIFwiY2FuY2VsXCJdLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBGaWVsZCBuYW1lIHByZWZpeGVzIHVzZWQgZm9yIGV4dHJhY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0IEZJRUxEX1BSRUZJWEVTID0ge1xuICBJTkZPOiBcImluZm8uXCIsXG4gIEZJTEU6IFwiZmlsZS5cIixcbiAgREFUQTogXCJkYXRhLlwiLFxufSBhcyBjb25zdDtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9jb25maWcudHNcblxuaW1wb3J0IHR5cGUgeyBGb3JtQ29uZmlnLCBGb3JtU3RhdGUsIEZvcm1EYXRhIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IEZPUk1fREVGQVVMVFMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuLy8gUmUtZXhwb3J0IEZPUk1fREVGQVVMVFMgZm9yIHVzZSBpbiBvdGhlciBtb2R1bGVzXG5leHBvcnQgeyBGT1JNX0RFRkFVTFRTIH07XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgYmFzZSBjb25maWd1cmF0aW9uIHdpdGggZGVmYXVsdHMgYXBwbGllZFxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlQmFzZUNvbmZpZyA9IChjb25maWc6IEZvcm1Db25maWcgPSB7fSk6IEZvcm1Db25maWcgPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLkZPUk1fREVGQVVMVFMsXG4gICAgLi4uY29uZmlnLFxuICAgIHByZWZpeDogY29uZmlnLnByZWZpeCB8fCBGT1JNX0RFRkFVTFRTLnByZWZpeCxcbiAgICBjb21wb25lbnROYW1lOiBjb25maWcuY29tcG9uZW50TmFtZSB8fCBGT1JNX0RFRkFVTFRTLmNvbXBvbmVudE5hbWUsXG4gICAgY29udHJvbHM6XG4gICAgICBjb25maWcuY29udHJvbHMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IGNvbmZpZy5jb250cm9sc1xuICAgICAgICA6IFsuLi5GT1JNX0RFRkFVTFRTLmNvbnRyb2xzXSxcbiAgICBzeXNpbmZvOiBjb25maWcuc3lzaW5mbyB8fCBbXSxcbiAgICB2YWxpZGF0aW9uOiBjb25maWcudmFsaWRhdGlvbiB8fCBbXSxcbiAgICBvbjogY29uZmlnLm9uIHx8IHt9LFxuICB9O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBpbml0aWFsIGZvcm0gc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUluaXRpYWxTdGF0ZSA9IChjb25maWc6IEZvcm1Db25maWcpOiBGb3JtU3RhdGUgPT4ge1xuICBjb25zdCBpbml0aWFsRGF0YSA9IGNvbmZpZy5kYXRhID8geyAuLi5jb25maWcuZGF0YSB9IDoge307XG5cbiAgcmV0dXJuIHtcbiAgICBtb2RpZmllZDogZmFsc2UsXG4gICAgc3VibWl0dGluZzogZmFsc2UsXG4gICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgIGluaXRpYWxEYXRhLFxuICAgIGN1cnJlbnREYXRhOiB7IC4uLmluaXRpYWxEYXRhIH0sXG4gICAgZXJyb3JzOiB7fSxcbiAgfTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgZWxlbWVudCBjb25maWd1cmF0aW9uIGZvciB3aXRoRWxlbWVudFxuICovXG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudENvbmZpZyA9IChjb25maWc6IEZvcm1Db25maWcpID0+IHtcbiAgY29uc3QgcHJlZml4ID0gY29uZmlnLnByZWZpeCB8fCBGT1JNX0RFRkFVTFRTLnByZWZpeDtcbiAgY29uc3QgY29tcG9uZW50TmFtZSA9IGNvbmZpZy5jb21wb25lbnROYW1lIHx8IEZPUk1fREVGQVVMVFMuY29tcG9uZW50TmFtZTtcblxuICBjb25zdCBjbGFzc05hbWVzID0gW2Ake3ByZWZpeH0tJHtjb21wb25lbnROYW1lfWBdO1xuXG4gIGlmIChjb25maWcuY2xhc3MpIHtcbiAgICBjbGFzc05hbWVzLnB1c2goY29uZmlnLmNsYXNzKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdGFnOiBcImRpdlwiLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcy5qb2luKFwiIFwiKSxcbiAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICBcImRhdGEtY29tcG9uZW50XCI6IGNvbXBvbmVudE5hbWUsXG4gICAgfSxcbiAgfTtcbn07XG5cbi8qKlxuICogRXh0cmFjdHMgZmllbGQgbmFtZSBmcm9tIGEgcHJlZml4ZWQgbmFtZSAoZS5nLiwgJ2luZm8udXNlcm5hbWUnIC0+ICd1c2VybmFtZScpXG4gKi9cbmV4cG9ydCBjb25zdCBleHRyYWN0RmllbGROYW1lID0gKHByZWZpeGVkTmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgcGFydHMgPSBwcmVmaXhlZE5hbWUuc3BsaXQoXCIuXCIpO1xuICByZXR1cm4gcGFydHMubGVuZ3RoID4gMSA/IHBhcnRzLnNsaWNlKDEpLmpvaW4oXCIuXCIpIDogcHJlZml4ZWROYW1lO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBmdWxsIGZpZWxkIHBhdGggaW5jbHVkaW5nIHByZWZpeFxuICovXG5leHBvcnQgY29uc3QgZ2V0RmllbGRQYXRoID0gKG5hbWU6IHN0cmluZywgcHJlZml4OiBzdHJpbmcgPSBcImluZm9cIik6IHN0cmluZyA9PiB7XG4gIGlmIChuYW1lLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgIHJldHVybiBuYW1lO1xuICB9XG4gIHJldHVybiBgJHtwcmVmaXh9LiR7bmFtZX1gO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBuYW1lIGlzIGEgZmllbGQgbmFtZSAoc3RhcnRzIHdpdGggaW5mby4gb3IgZGF0YS4pXG4gKi9cbmV4cG9ydCBjb25zdCBpc0ZpZWxkTmFtZSA9IChuYW1lOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgcmV0dXJuIG5hbWUuc3RhcnRzV2l0aChcImluZm8uXCIpIHx8IG5hbWUuc3RhcnRzV2l0aChcImRhdGEuXCIpO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBuYW1lIGlzIGEgZmlsZSBmaWVsZCBuYW1lXG4gKi9cbmV4cG9ydCBjb25zdCBpc0ZpbGVOYW1lID0gKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gbmFtZS5zdGFydHNXaXRoKFwiZmlsZS5cIik7XG59O1xuXG4vKipcbiAqIERlZXAgY29tcGFyaXNvbiBvZiB0d28gdmFsdWVzIGZvciBjaGFuZ2UgZGV0ZWN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBpc1ZhbHVlRXF1YWwgPSAoYTogdW5rbm93biwgYjogdW5rbm93bik6IGJvb2xlYW4gPT4ge1xuICAvLyBIYW5kbGUgbnVsbC91bmRlZmluZWRcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgcmV0dXJuIGEgPT0gYjtcblxuICAvLyBIYW5kbGUgYXJyYXlzXG4gIGlmIChBcnJheS5pc0FycmF5KGEpICYmIEFycmF5LmlzQXJyYXkoYikpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGEuZXZlcnkoKHZhbCwgaWR4KSA9PiBpc1ZhbHVlRXF1YWwodmFsLCBiW2lkeF0pKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBvYmplY3RzXG4gIGlmICh0eXBlb2YgYSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgYiA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IGtleXNBID0gT2JqZWN0LmtleXMoYSBhcyBvYmplY3QpO1xuICAgIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMoYiBhcyBvYmplY3QpO1xuICAgIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBrZXlzQS5ldmVyeSgoa2V5KSA9PlxuICAgICAgaXNWYWx1ZUVxdWFsKFxuICAgICAgICAoYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSxcbiAgICAgICAgKGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0sXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvLyBIYW5kbGUgcHJpbWl0aXZlcyAod2l0aCB0eXBlIGNvZXJjaW9uIGZvciBzdHJpbmcvbnVtYmVyIGNvbXBhcmlzb24pXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcbiAgcmV0dXJuIGEgPT0gYjtcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIGZvcm0gZGF0YSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwgc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IGhhc0RhdGFDaGFuZ2VkID0gKFxuICBpbml0aWFsOiBGb3JtRGF0YSxcbiAgY3VycmVudDogRm9ybURhdGEsXG4pOiBib29sZWFuID0+IHtcbiAgY29uc3QgYWxsS2V5cyA9IG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGluaXRpYWwpLCAuLi5PYmplY3Qua2V5cyhjdXJyZW50KV0pO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIGFsbEtleXMpIHtcbiAgICBpZiAoIWlzVmFsdWVFcXVhbChpbml0aWFsW2tleV0sIGN1cnJlbnRba2V5XSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogR2V0cyBvbmx5IHRoZSBtb2RpZmllZCBmaWVsZHMgYmV0d2VlbiBpbml0aWFsIGFuZCBjdXJyZW50IGRhdGFcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE1vZGlmaWVkRmllbGRzID0gKFxuICBpbml0aWFsOiBGb3JtRGF0YSxcbiAgY3VycmVudDogRm9ybURhdGEsXG4pOiBGb3JtRGF0YSA9PiB7XG4gIGNvbnN0IG1vZGlmaWVkOiBGb3JtRGF0YSA9IHt9O1xuICBjb25zdCBhbGxLZXlzID0gbmV3IFNldChbLi4uT2JqZWN0LmtleXMoaW5pdGlhbCksIC4uLk9iamVjdC5rZXlzKGN1cnJlbnQpXSk7XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgYWxsS2V5cykge1xuICAgIGlmICghaXNWYWx1ZUVxdWFsKGluaXRpYWxba2V5XSwgY3VycmVudFtrZXldKSkge1xuICAgICAgbW9kaWZpZWRba2V5XSA9IGN1cnJlbnRba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbW9kaWZpZWQ7XG59O1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2ZpZWxkcy50c1xuXG4vKipcbiAqIEZpZWxkcyBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogRXh0cmFjdHMgZmllbGRzIGZyb20gbGF5b3V0IGFuZCBtYW5hZ2VzIHRoZSBmaWVsZCByZWdpc3RyeVxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRm9ybUNvbmZpZyxcbiAgQmFzZUZvcm1Db21wb25lbnQsXG4gIEZvcm1GaWVsZCxcbiAgRm9ybUZpZWxkUmVnaXN0cnksXG4gIEZpZWxkVmFsdWUsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgaXNGaWVsZE5hbWUsIGlzRmlsZU5hbWUsIGV4dHJhY3RGaWVsZE5hbWUgfSBmcm9tIFwiLi4vY29uZmlnXCI7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIG9iamVjdCBpcyBhIHZhbGlkIGZvcm0gZmllbGQgY29tcG9uZW50XG4gKiBBIGZvcm0gZmllbGQgbXVzdCBoYXZlIGF0IGxlYXN0IGdldFZhbHVlIG9yIHNldFZhbHVlIG1ldGhvZFxuICovXG5jb25zdCBpc0Zvcm1GaWVsZCA9IChvYmo6IHVua25vd24pOiBvYmogaXMgRm9ybUZpZWxkID0+IHtcbiAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGNhbmRpZGF0ZSA9IG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvLyBNdXN0IGhhdmUgZWxlbWVudCBwcm9wZXJ0eVxuICBpZiAoIWNhbmRpZGF0ZS5lbGVtZW50IHx8ICEoY2FuZGlkYXRlLmVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBNdXN0IGhhdmUgZ2V0VmFsdWUgb3Igc2V0VmFsdWVcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgY2FuZGlkYXRlLmdldFZhbHVlID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICB0eXBlb2YgY2FuZGlkYXRlLnNldFZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgKTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgdmFsdWUgZnJvbSBhIGZpZWxkIGNvbXBvbmVudFxuICogQWxsIG10cmwgY29tcG9uZW50cyBub3cgaGF2ZSB1bmlmaWVkIGdldFZhbHVlKCkgQVBJOlxuICogLSBUZXh0ZmllbGQ6IHJldHVybnMgc3RyaW5nXG4gKiAtIFNlbGVjdDogcmV0dXJucyBzdHJpbmcgb3Igc3RyaW5nW11cbiAqIC0gQ2hpcHM6IHJldHVybnMgc3RyaW5nW11cbiAqIC0gU3dpdGNoL0NoZWNrYm94OiByZXR1cm5zIGJvb2xlYW4gKHVwZGF0ZWQgaW4gbXRybCBjb3JlKVxuICovXG5leHBvcnQgY29uc3QgZ2V0RmllbGRWYWx1ZSA9IChmaWVsZDogRm9ybUZpZWxkKTogRmllbGRWYWx1ZSA9PiB7XG4gIGlmICh0eXBlb2YgZmllbGQuZ2V0VmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBmaWVsZC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLy8gRmFsbGJhY2s6IGNoZWNrIGZvciB2YWx1ZSBwcm9wZXJ0eVxuICBjb25zdCBmaWVsZEFueSA9IGZpZWxkIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmIChcInZhbHVlXCIgaW4gZmllbGRBbnkpIHtcbiAgICByZXR1cm4gZmllbGRBbnkudmFsdWUgYXMgRmllbGRWYWx1ZTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIG9uIGEgZmllbGQgY29tcG9uZW50XG4gKiBBbGwgbXRybCBjb21wb25lbnRzIG5vdyBoYXZlIHVuaWZpZWQgc2V0VmFsdWUoKSBBUEk6XG4gKiAtIFRleHRmaWVsZDogYWNjZXB0cyBzdHJpbmdcbiAqIC0gU2VsZWN0OiBhY2NlcHRzIHN0cmluZyBvciBzdHJpbmdbXVxuICogLSBDaGlwczogYWNjZXB0cyBzdHJpbmdbXVxuICogLSBTd2l0Y2gvQ2hlY2tib3g6IGFjY2VwdHMgYm9vbGVhbiBvciBzdHJpbmcgKFwidHJ1ZVwiL1wiZmFsc2VcIikgKHVwZGF0ZWQgaW4gbXRybCBjb3JlKVxuICpcbiAqIEZvciBzaWxlbnQgdXBkYXRlcyAobm8gY2hhbmdlIGV2ZW50cyksIHdlIHNldCBkaXJlY3RseSBvbiB0aGUgaW5wdXQgZWxlbWVudFxuICovXG5leHBvcnQgY29uc3Qgc2V0RmllbGRWYWx1ZSA9IChcbiAgZmllbGQ6IEZvcm1GaWVsZCxcbiAgdmFsdWU6IEZpZWxkVmFsdWUsXG4gIHNpbGVudDogYm9vbGVhbiA9IGZhbHNlLFxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IGZpZWxkQW55ID0gZmllbGQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgc2VsZWN0IGNvbXBvbmVudCAoaGFzIHRleHRmaWVsZCBwcm9wZXJ0eSlcbiAgLy8gU2VsZWN0IGNvbXBvbmVudHMgbXVzdCBhbHdheXMgdXNlIHNldFZhbHVlIHRvIHVwZGF0ZSBpbnRlcm5hbCBzdGF0ZVxuICBjb25zdCBpc1NlbGVjdENvbXBvbmVudCA9IFwidGV4dGZpZWxkXCIgaW4gZmllbGRBbnkgJiYgXCJtZW51XCIgaW4gZmllbGRBbnk7XG5cbiAgaWYgKHNpbGVudCAmJiAhaXNTZWxlY3RDb21wb25lbnQpIHtcbiAgICAvLyBTaWxlbnQgdXBkYXRlOiBzZXQgZGlyZWN0bHkgb24gaW5wdXQgdG8gYXZvaWQgdHJpZ2dlcmluZyBjaGFuZ2UgZXZlbnRzXG4gICAgLy8gU2tpcCB0aGlzIGZvciBzZWxlY3QgY29tcG9uZW50cyAtIHRoZXkgbmVlZCBzZXRWYWx1ZSB0byB1cGRhdGUgaW50ZXJuYWwgc3RhdGVcbiAgICBjb25zdCBpbnB1dCA9IGZpZWxkQW55LmlucHV0IGFzXG4gICAgICB8IEhUTUxJbnB1dEVsZW1lbnRcbiAgICAgIHwgSFRNTFRleHRBcmVhRWxlbWVudFxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlucHV0KSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgY2hlY2tib3gvc3dpdGNoIChoYXMgY2hlY2tlZCBwcm9wZXJ0eSlcbiAgICAgIGlmIChpbnB1dC50eXBlID09PSBcImNoZWNrYm94XCIpIHtcbiAgICAgICAgY29uc3Qgc2hvdWxkQmVDaGVja2VkID1cbiAgICAgICAgICB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gXCJ0cnVlXCIgfHwgdmFsdWUgPT09IDE7XG4gICAgICAgIGlucHV0LmNoZWNrZWQgPSBzaG91bGRCZUNoZWNrZWQ7XG4gICAgICAgIC8vIFVwZGF0ZSB2aXN1YWwgc3RhdGUgYnkgdG9nZ2xpbmcgdGhlIGNoZWNrZWQgY2xhc3NcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGZpZWxkQW55LmVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gQXJyYXkuZnJvbShlbGVtZW50LmNsYXNzTGlzdCk7XG4gICAgICAgICAgY29uc3QgYmFzZUNsYXNzID0gY2xhc3NMaXN0LmZpbmQoXG4gICAgICAgICAgICAoYykgPT4gYy5zdGFydHNXaXRoKFwibXRybC1cIikgJiYgIWMuaW5jbHVkZXMoXCItLVwiKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChiYXNlQ2xhc3MpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShgJHtiYXNlQ2xhc3N9LS1jaGVja2VkYCwgc2hvdWxkQmVDaGVja2VkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRleHQgaW5wdXQgLSBzZXQgdmFsdWUgZGlyZWN0bHlcbiAgICAgICAgaW5wdXQudmFsdWUgPSAodmFsdWUgYXMgc3RyaW5nKSA/PyBcIlwiO1xuICAgICAgICAvLyBVcGRhdGUgdmlzdWFsIHN0YXRlIC0gdG9nZ2xlIC0tZW1wdHkgY2xhc3MgYmFzZWQgb24gdmFsdWVcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGZpZWxkQW55LmVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gQXJyYXkuZnJvbShlbGVtZW50LmNsYXNzTGlzdCk7XG4gICAgICAgICAgY29uc3QgYmFzZUNsYXNzID0gY2xhc3NMaXN0LmZpbmQoXG4gICAgICAgICAgICAoYykgPT4gYy5zdGFydHNXaXRoKFwibXRybC1cIikgJiYgIWMuaW5jbHVkZXMoXCItLVwiKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChiYXNlQ2xhc3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzRW1wdHkgPSAhaW5wdXQudmFsdWU7XG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoYCR7YmFzZUNsYXNzfS0tZW1wdHlgLCBpc0VtcHR5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gRm9yIGNvbXBvbmVudHMgd2l0aG91dCBpbnB1dCAobGlrZSBjaGlwcywgc2VsZWN0KSwgZmFsbCB0aHJvdWdoIHRvIHNldFZhbHVlXG4gICAgLy8gYnV0IHN0aWxsIHVzZSBzaWxlbnQgbW9kZSBiZWhhdmlvciAobm8gZXZlbnRzIHRyaWdnZXJlZClcbiAgfVxuXG4gIC8vIE5vcm1hbCB1cGRhdGU6IHVzZSBjb21wb25lbnQncyBzZXRWYWx1ZSBtZXRob2RcbiAgaWYgKHR5cGVvZiBmaWVsZC5zZXRWYWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZmllbGQuc2V0VmFsdWUodmFsdWUpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrOiBzZXQgdmFsdWUgcHJvcGVydHkgZGlyZWN0bHlcbiAgaWYgKFwidmFsdWVcIiBpbiBmaWVsZEFueSkge1xuICAgIGZpZWxkQW55LnZhbHVlID0gdmFsdWU7XG4gIH1cbn07XG5cbi8qKlxuICogRXh0cmFjdHMgZmllbGRzIGZyb20gdGhlIFVJIGNvbXBvbmVudCByZWdpc3RyeVxuICogTG9va3MgZm9yIGNvbXBvbmVudHMgd2l0aCBuYW1lcyBzdGFydGluZyB3aXRoICdpbmZvLicgb3IgJ2RhdGEuJ1xuICovXG5jb25zdCBleHRyYWN0RmllbGRzID0gKFxuICB1aTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGNvbmZpZzogRm9ybUNvbmZpZyxcbik6IHsgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeTsgZmlsZXM6IEZvcm1GaWVsZFJlZ2lzdHJ5IH0gPT4ge1xuICBjb25zdCBmaWVsZHM6IEZvcm1GaWVsZFJlZ2lzdHJ5ID0gbmV3IE1hcCgpO1xuICBjb25zdCBmaWxlczogRm9ybUZpZWxkUmVnaXN0cnkgPSBuZXcgTWFwKCk7XG5cbiAgaWYgKCF1aSkgcmV0dXJuIHsgZmllbGRzLCBmaWxlcyB9O1xuXG4gIGZvciAoY29uc3QgW25hbWUsIGNvbXBvbmVudF0gb2YgT2JqZWN0LmVudHJpZXModWkpKSB7XG4gICAgLy8gU2tpcCBub24tZmllbGQgY29tcG9uZW50c1xuICAgIGlmICghaXNGb3JtRmllbGQoY29tcG9uZW50KSkgY29udGludWU7XG5cbiAgICBpZiAoaXNGaWVsZE5hbWUobmFtZSkpIHtcbiAgICAgIC8vIEV4dHJhY3QgZmllbGQgbmFtZSB3aXRob3V0IHByZWZpeCAoaW5mby51c2VybmFtZSAtPiB1c2VybmFtZSlcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IGV4dHJhY3RGaWVsZE5hbWUobmFtZSk7XG4gICAgICBmaWVsZHMuc2V0KGZpZWxkTmFtZSwgY29tcG9uZW50KTtcbiAgICB9IGVsc2UgaWYgKGlzRmlsZU5hbWUobmFtZSkpIHtcbiAgICAgIC8vIEV4dHJhY3QgZmlsZSBuYW1lIHdpdGhvdXQgcHJlZml4IChmaWxlLmF2YXRhciAtPiBhdmF0YXIpXG4gICAgICBjb25zdCBmaWxlTmFtZSA9IGV4dHJhY3RGaWVsZE5hbWUobmFtZSk7XG4gICAgICBmaWxlcy5zZXQoZmlsZU5hbWUsIGNvbXBvbmVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgZmllbGRzLCBmaWxlcyB9O1xufTtcblxuLyoqXG4gKiBDb21wYXJlcyB0d28gZmllbGQgdmFsdWVzIGZvciBlcXVhbGl0eVxuICogSGFuZGxlcyBhcnJheXMgKGZvciBjaGlwcy9tdWx0aS1zZWxlY3QpIGFuZCBwcmltaXRpdmUgdmFsdWVzXG4gKi9cbmNvbnN0IHZhbHVlc0VxdWFsID0gKGE6IEZpZWxkVmFsdWUsIGI6IEZpZWxkVmFsdWUpOiBib29sZWFuID0+IHtcbiAgLy8gSGFuZGxlIG51bGwvdW5kZWZpbmVkXG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICAvLyBIYW5kbGUgYXJyYXlzIChjaGlwcywgbXVsdGktc2VsZWN0KVxuICBpZiAoQXJyYXkuaXNBcnJheShhKSAmJiBBcnJheS5pc0FycmF5KGIpKSB7XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBhLmV2ZXJ5KCh2YWwsIGkpID0+IHZhbCA9PT0gYltpXSk7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIEJpbmRzIGNoYW5nZSBhbmQgaW5wdXQgZXZlbnRzIHRvIGZpZWxkc1xuICogQ2FsbHMgdGhlIHByb3ZpZGVkIGNhbGxiYWNrIHdoZW4gYW55IGZpZWxkIGNoYW5nZXNcbiAqXG4gKiBMaXN0ZW5zIHRvIGJvdGggJ2lucHV0JyAoZm9yIGltbWVkaWF0ZSBmZWVkYmFjayB3aGlsZSB0eXBpbmcpXG4gKiBhbmQgJ2NoYW5nZScgKGZvciBjb21wb25lbnRzIHRoYXQgb25seSBlbWl0IG9uIGJsdXIvc2VsZWN0aW9uKVxuICpcbiAqIERlZHVwbGljYXRlcyBldmVudHMgdG8gcHJldmVudCBkb3VibGUtZmlyaW5nIHdoZW4gYm90aCBpbnB1dCBhbmQgY2hhbmdlXG4gKiBlbWl0IGZvciB0aGUgc2FtZSB2YWx1ZSAoZS5nLiwgdGV4dGZpZWxkIGlucHV0IGZvbGxvd2VkIGJ5IGJsdXIpXG4gKi9cbi8qKlxuICogVHJhY2tzIGxhc3QgZW1pdHRlZCB2YWx1ZXMgcGVyIGZpZWxkIGZvciBkZWR1cGxpY2F0aW9uXG4gKiBFeHBvc2VkIHNvIHRoYXQgc2V0RGF0YSBjYW4gdXBkYXRlIGl0IHdoZW4gc2V0dGluZyB2YWx1ZXMgc2lsZW50bHlcbiAqL1xubGV0IGZpZWxkVmFsdWVUcmFja2VyOiBNYXA8c3RyaW5nLCBGaWVsZFZhbHVlPiB8IG51bGwgPSBudWxsO1xuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIHRyYWNrZWQgdmFsdWUgZm9yIGEgZmllbGRcbiAqIENhbGxlZCB3aGVuIHNldERhdGEgaXMgdXNlZCB3aXRoIHNpbGVudD10cnVlIHRvIGtlZXAgZGVkdXBsaWNhdGlvbiBpbiBzeW5jXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVUcmFja2VkRmllbGRWYWx1ZSA9IChcbiAgbmFtZTogc3RyaW5nLFxuICB2YWx1ZTogRmllbGRWYWx1ZSxcbik6IHZvaWQgPT4ge1xuICBpZiAoZmllbGRWYWx1ZVRyYWNrZXIpIHtcbiAgICBmaWVsZFZhbHVlVHJhY2tlci5zZXQobmFtZSwgdmFsdWUpO1xuICB9XG59O1xuXG4vKipcbiAqIFVwZGF0ZXMgYWxsIHRyYWNrZWQgZmllbGQgdmFsdWVzIGZyb20gYSBmaWVsZHMgcmVnaXN0cnlcbiAqIENhbGxlZCBhZnRlciBzaWxlbnQgc2V0RGF0YSB0byBzeW5jIGRlZHVwbGljYXRpb24gc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IHN5bmNUcmFja2VkRmllbGRWYWx1ZXMgPSAoZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeSk6IHZvaWQgPT4ge1xuICBpZiAoZmllbGRWYWx1ZVRyYWNrZXIpIHtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBmaWVsZF0gb2YgZmllbGRzKSB7XG4gICAgICBmaWVsZFZhbHVlVHJhY2tlci5zZXQobmFtZSwgZ2V0RmllbGRWYWx1ZShmaWVsZCkpO1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgYmluZEZpZWxkRXZlbnRzID0gKFxuICBmaWVsZHM6IEZvcm1GaWVsZFJlZ2lzdHJ5LFxuICBvbkZpZWxkQ2hhbmdlOiAobmFtZTogc3RyaW5nLCB2YWx1ZTogRmllbGRWYWx1ZSkgPT4gdm9pZCxcbik6IHZvaWQgPT4ge1xuICAvLyBUcmFjayBsYXN0IGVtaXR0ZWQgdmFsdWUgcGVyIGZpZWxkIHRvIGRlZHVwZSBldmVudHNcbiAgY29uc3QgbGFzdEVtaXR0ZWRWYWx1ZXMgPSBuZXcgTWFwPHN0cmluZywgRmllbGRWYWx1ZT4oKTtcblxuICAvLyBFeHBvc2UgdGhlIHRyYWNrZXIgc28gc2V0RGF0YSBjYW4gdXBkYXRlIGl0XG4gIGZpZWxkVmFsdWVUcmFja2VyID0gbGFzdEVtaXR0ZWRWYWx1ZXM7XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgZmllbGRdIG9mIGZpZWxkcykge1xuICAgIGlmICh0eXBlb2YgZmllbGQub24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIGN1cnJlbnQgdmFsdWVcbiAgICAgIGxhc3RFbWl0dGVkVmFsdWVzLnNldChuYW1lLCBnZXRGaWVsZFZhbHVlKGZpZWxkKSk7XG5cbiAgICAgIC8vIEhhbmRsZXIgdGhhdCBkZWR1cGVzIGJhc2VkIG9uIHZhbHVlXG4gICAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0RmllbGRWYWx1ZShmaWVsZCk7XG4gICAgICAgIGNvbnN0IGxhc3RWYWx1ZSA9IGxhc3RFbWl0dGVkVmFsdWVzLmdldChuYW1lKTtcblxuICAgICAgICAvLyBPbmx5IGVtaXQgaWYgdmFsdWUgYWN0dWFsbHkgY2hhbmdlZFxuICAgICAgICBpZiAoIXZhbHVlc0VxdWFsKHZhbHVlLCBsYXN0VmFsdWUpKSB7XG4gICAgICAgICAgbGFzdEVtaXR0ZWRWYWx1ZXMuc2V0KG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICBvbkZpZWxkQ2hhbmdlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gTGlzdGVuIHRvICdpbnB1dCcgZm9yIGltbWVkaWF0ZSBmZWVkYmFjayAodGV4dGZpZWxkcyBlbWl0IHRoaXMgb24gZXZlcnkga2V5c3Ryb2tlKVxuICAgICAgZmllbGQub24oXCJpbnB1dFwiLCBoYW5kbGVDaGFuZ2UpO1xuXG4gICAgICAvLyBBbHNvIGxpc3RlbiB0byAnY2hhbmdlJyBmb3IgY29tcG9uZW50cyB0aGF0IG9ubHkgZW1pdCBvbiBibHVyL3NlbGVjdGlvblxuICAgICAgLy8gKGUuZy4sIHNlbGVjdCwgY2hpcHMsIHN3aXRjaClcbiAgICAgIGZpZWxkLm9uKFwiY2hhbmdlXCIsIGhhbmRsZUNoYW5nZSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIHdpdGhGaWVsZHMgZmVhdHVyZVxuICogQWRkcyBmaWVsZCBleHRyYWN0aW9uIGFuZCByZWdpc3RyeSBtYW5hZ2VtZW50IHRvIHRoZSBmb3JtXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoRmllbGRzID0gKGNvbmZpZzogRm9ybUNvbmZpZykgPT4ge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBCYXNlRm9ybUNvbXBvbmVudD4oXG4gICAgY29tcG9uZW50OiBULFxuICApOiBUICYge1xuICAgIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnk7XG4gICAgZmlsZXM6IEZvcm1GaWVsZFJlZ2lzdHJ5O1xuICAgIGdldEZpZWxkOiAobmFtZTogc3RyaW5nKSA9PiBGb3JtRmllbGQgfCB1bmRlZmluZWQ7XG4gICAgZ2V0RmllbGROYW1lczogKCkgPT4gc3RyaW5nW107XG4gICAgaGFzRmllbGQ6IChuYW1lOiBzdHJpbmcpID0+IGJvb2xlYW47XG4gIH0gPT4ge1xuICAgIC8vIEV4dHJhY3QgZmllbGRzIGZyb20gVUkgcmVnaXN0cnlcbiAgICBjb25zdCB7IGZpZWxkcywgZmlsZXMgfSA9IGV4dHJhY3RGaWVsZHMoY29tcG9uZW50LnVpIHx8IHt9LCBjb25maWcpO1xuXG4gICAgLy8gQmluZCBjaGFuZ2UgZXZlbnRzIGlmIGNvbXBvbmVudCBoYXMgZW1pdFxuICAgIGlmIChjb21wb25lbnQuZW1pdCkge1xuICAgICAgYmluZEZpZWxkRXZlbnRzKGZpZWxkcywgKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJmaWVsZDpjaGFuZ2VcIiwgeyBuYW1lLCB2YWx1ZSB9KTtcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImNoYW5nZVwiLCB7IG5hbWUsIHZhbHVlIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIEFsc28gYmluZCBjaGFuZ2UgZXZlbnRzIHRvIGZpbGUgZmllbGRzXG4gICAgICBiaW5kRmllbGRFdmVudHMoZmlsZXMsIChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiZmlsZTpjaGFuZ2VcIiwgeyBuYW1lLCB2YWx1ZSB9KTtcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImNoYW5nZVwiLCB7IG5hbWUsIHZhbHVlIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIGZpZWxkcyxcbiAgICAgIGZpbGVzLFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBhIGZpZWxkIGNvbXBvbmVudCBieSBuYW1lXG4gICAgICAgKi9cbiAgICAgIGdldEZpZWxkKG5hbWU6IHN0cmluZyk6IEZvcm1GaWVsZCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBmaWVsZHMuZ2V0KG5hbWUpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgYWxsIGZpZWxkIG5hbWVzXG4gICAgICAgKi9cbiAgICAgIGdldEZpZWxkTmFtZXMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShmaWVsZHMua2V5cygpKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgYSBmaWVsZCBleGlzdHNcbiAgICAgICAqL1xuICAgICAgaGFzRmllbGQobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmaWVsZHMuaGFzKG5hbWUpO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgd2l0aEZpZWxkcztcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9mZWF0dXJlcy9kYXRhLnRzXG5cbi8qKlxuICogRGF0YSBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogSGFuZGxlcyBmb3JtIGRhdGEgb3BlcmF0aW9uczogZ2V0L3NldCBkYXRhLCBjaGFuZ2UgdHJhY2tpbmcsIHNuYXBzaG90c1xuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRm9ybUNvbmZpZyxcbiAgQmFzZUZvcm1Db21wb25lbnQsXG4gIEZvcm1EYXRhLFxuICBGb3JtU3RhdGUsXG4gIEZpZWxkVmFsdWUsXG4gIEZvcm1GaWVsZFJlZ2lzdHJ5LFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZUluaXRpYWxTdGF0ZSxcbiAgaGFzRGF0YUNoYW5nZWQsXG4gIGdldE1vZGlmaWVkRmllbGRzLFxufSBmcm9tIFwiLi4vY29uZmlnXCI7XG5pbXBvcnQgeyBnZXRGaWVsZFZhbHVlLCBzZXRGaWVsZFZhbHVlLCBzeW5jVHJhY2tlZEZpZWxkVmFsdWVzIH0gZnJvbSBcIi4vZmllbGRzXCI7XG5pbXBvcnQgeyBGT1JNX0VWRU5UUywgREFUQV9TVEFURSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBDb2xsZWN0cyBjdXJyZW50IHZhbHVlcyBmcm9tIGFsbCBmaWVsZHNcbiAqL1xuY29uc3QgY29sbGVjdEZpZWxkRGF0YSA9IChmaWVsZHM6IEZvcm1GaWVsZFJlZ2lzdHJ5KTogRm9ybURhdGEgPT4ge1xuICBjb25zdCBkYXRhOiBGb3JtRGF0YSA9IHt9O1xuXG4gIGZvciAoY29uc3QgW25hbWUsIGZpZWxkXSBvZiBmaWVsZHMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGdldEZpZWxkVmFsdWUoZmllbGQpO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkYXRhW25hbWVdID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59O1xuXG4vKipcbiAqIFNldHMgdmFsdWVzIG9uIGZpZWxkcyBmcm9tIGEgZGF0YSBvYmplY3RcbiAqIFN1cHBvcnRzIGRvdCBub3RhdGlvbiBmb3IgbmVzdGVkIHZhbHVlcyAoZS5nLiwgeyAndXNlci5uYW1lJzogJ0pvaG4nIH0pXG4gKi9cbmNvbnN0IHNldEZpZWxkc0RhdGEgPSAoXG4gIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnksXG4gIGRhdGE6IEZvcm1EYXRhLFxuICBzaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSxcbik6IHZvaWQgPT4ge1xuICBmb3IgKGNvbnN0IFtuYW1lLCBmaWVsZF0gb2YgZmllbGRzKSB7XG4gICAgLy8gQ2hlY2sgZm9yIGV4YWN0IG1hdGNoIGZpcnN0XG4gICAgaWYgKG5hbWUgaW4gZGF0YSkge1xuICAgICAgc2V0RmllbGRWYWx1ZShmaWVsZCwgZGF0YVtuYW1lXSwgc2lsZW50KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBuZXN0ZWQgdmFsdWUgdXNpbmcgZG90IG5vdGF0aW9uXG4gICAgLy8gZS5nLiwgZmllbGQgbmFtZSAndXNlcm5hbWUnIG1pZ2h0IGJlIGluIGRhdGEgYXMgbmVzdGVkIHsgaW5mbzogeyB1c2VybmFtZTogJ3ZhbHVlJyB9IH1cbiAgICBjb25zdCB2YWx1ZSA9IGdldE5lc3RlZFZhbHVlKGRhdGEsIG5hbWUpO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzZXRGaWVsZFZhbHVlKGZpZWxkLCB2YWx1ZSBhcyBGaWVsZFZhbHVlLCBzaWxlbnQpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBHZXRzIGEgbmVzdGVkIHZhbHVlIGZyb20gYW4gb2JqZWN0IHVzaW5nIGRvdCBub3RhdGlvblxuICovXG5jb25zdCBnZXROZXN0ZWRWYWx1ZSA9IChcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcGF0aDogc3RyaW5nLFxuKTogdW5rbm93biA9PiB7XG4gIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG4gIGxldCBjdXJyZW50OiB1bmtub3duID0gb2JqO1xuXG4gIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjdXJyZW50ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjdXJyZW50ID0gKGN1cnJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3BhcnRdO1xuICB9XG5cbiAgcmV0dXJuIGN1cnJlbnQ7XG59O1xuXG4vKipcbiAqIFNldHMgYSBuZXN0ZWQgdmFsdWUgaW4gYW4gb2JqZWN0IHVzaW5nIGRvdCBub3RhdGlvblxuICovXG5jb25zdCBzZXROZXN0ZWRWYWx1ZSA9IChcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcGF0aDogc3RyaW5nLFxuICB2YWx1ZTogdW5rbm93bixcbik6IHZvaWQgPT4ge1xuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIuXCIpO1xuICBsZXQgY3VycmVudCA9IG9iajtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTtcbiAgICBpZiAoIShwYXJ0IGluIGN1cnJlbnQpIHx8IHR5cGVvZiBjdXJyZW50W3BhcnRdICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICBjdXJyZW50W3BhcnRdID0ge307XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50W3BhcnRdIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9XG5cbiAgY3VycmVudFtwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXV0gPSB2YWx1ZTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgZmxhdCBmaWVsZCBkYXRhIHRvIG5lc3RlZCBvYmplY3Qgc3RydWN0dXJlXG4gKiBlLmcuLCB7ICd1c2VyLm5hbWUnOiAnSm9obicgfSAtPiB7IHVzZXI6IHsgbmFtZTogJ0pvaG4nIH0gfVxuICovXG5jb25zdCBmbGF0VG9OZXN0ZWQgPSAoZGF0YTogRm9ybURhdGEpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSkge1xuICAgIGlmIChrZXkuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICBzZXROZXN0ZWRWYWx1ZShyZXN1bHQsIGtleSwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIHdpdGhEYXRhIGZlYXR1cmVcbiAqIEFkZHMgZGF0YSBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcyB0byB0aGUgZm9ybVxuICovXG5leHBvcnQgY29uc3Qgd2l0aERhdGEgPSAoY29uZmlnOiBGb3JtQ29uZmlnKSA9PiB7XG4gIHJldHVybiA8XG4gICAgVCBleHRlbmRzIEJhc2VGb3JtQ29tcG9uZW50ICYge1xuICAgICAgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeTtcbiAgICAgIGVtaXQ/OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gICAgfSxcbiAgPihcbiAgICBjb21wb25lbnQ6IFQsXG4gICk6IFQgJiB7XG4gICAgc3RhdGU6IEZvcm1TdGF0ZTtcbiAgICBnZXREYXRhOiAoKSA9PiBGb3JtRGF0YTtcbiAgICBzZXREYXRhOiAoZGF0YTogRm9ybURhdGEsIHNpbGVudD86IGJvb2xlYW4pID0+IHZvaWQ7XG4gICAgZ2V0RmllbGRWYWx1ZTogKG5hbWU6IHN0cmluZykgPT4gRmllbGRWYWx1ZTtcbiAgICBzZXRGaWVsZFZhbHVlOiAobmFtZTogc3RyaW5nLCB2YWx1ZTogRmllbGRWYWx1ZSwgc2lsZW50PzogYm9vbGVhbikgPT4gdm9pZDtcbiAgICBpc01vZGlmaWVkOiAoKSA9PiBib29sZWFuO1xuICAgIGdldE1vZGlmaWVkRGF0YTogKCkgPT4gRm9ybURhdGE7XG4gICAgc25hcHNob3Q6ICgpID0+IHZvaWQ7XG4gICAgcmVzZXQ6ICgpID0+IHZvaWQ7XG4gICAgY2xlYXI6ICgpID0+IHZvaWQ7XG4gIH0gPT4ge1xuICAgIC8vIEluaXRpYWxpemUgc3RhdGVcbiAgICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUluaXRpYWxTdGF0ZShjb25maWcpO1xuXG4gICAgLy8gSWYgaW5pdGlhbCBkYXRhIHdhcyBwcm92aWRlZCwgc2V0IGl0IG9uIGZpZWxkc1xuICAgIGlmIChjb25maWcuZGF0YSAmJiBjb21wb25lbnQuZmllbGRzKSB7XG4gICAgICBzZXRGaWVsZHNEYXRhKGNvbXBvbmVudC5maWVsZHMsIGNvbmZpZy5kYXRhLCB0cnVlKTtcbiAgICAgIHN0YXRlLmN1cnJlbnREYXRhID0gY29sbGVjdEZpZWxkRGF0YShjb21wb25lbnQuZmllbGRzKTtcbiAgICAgIHN0YXRlLmluaXRpYWxEYXRhID0geyAuLi5zdGF0ZS5jdXJyZW50RGF0YSB9O1xuICAgIH1cblxuICAgIC8vIEhhbmRsZXIgZm9yIGZpZWxkL2ZpbGUgY2hhbmdlcyB0byB1cGRhdGUgc3RhdGVcbiAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoZXZlbnQ6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogRmllbGRWYWx1ZSB9KSA9PiB7XG4gICAgICBzdGF0ZS5jdXJyZW50RGF0YVtldmVudC5uYW1lXSA9IGV2ZW50LnZhbHVlO1xuICAgICAgY29uc3Qgd2FzTW9kaWZpZWQgPSBzdGF0ZS5tb2RpZmllZDtcbiAgICAgIHN0YXRlLm1vZGlmaWVkID0gaGFzRGF0YUNoYW5nZWQoc3RhdGUuaW5pdGlhbERhdGEsIHN0YXRlLmN1cnJlbnREYXRhKTtcblxuICAgICAgLy8gRW1pdCBzdGF0ZTpjaGFuZ2UgZXZlbnQgd2hlbiBtb2RpZmllZCBzdGF0ZSBjaGFuZ2VzXG4gICAgICAvLyBUaGlzIGFsbG93cyB0aGUgY29udHJvbGxlciB0byBlbmFibGUvZGlzYWJsZSBjb250cm9scyBhY2NvcmRpbmdseVxuICAgICAgaWYgKHdhc01vZGlmaWVkICE9PSBzdGF0ZS5tb2RpZmllZCkge1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLlNUQVRFX0NIQU5HRSwge1xuICAgICAgICAgIG1vZGlmaWVkOiBzdGF0ZS5tb2RpZmllZCxcbiAgICAgICAgICBzdGF0ZTogc3RhdGUubW9kaWZpZWQgPyBEQVRBX1NUQVRFLkRJUlRZIDogREFUQV9TVEFURS5QUklTVElORSxcbiAgICAgICAgICBuYW1lOiBldmVudC5uYW1lLFxuICAgICAgICAgIHZhbHVlOiBldmVudC52YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIExpc3RlbiBmb3IgZmllbGQgY2hhbmdlcyB0byB1cGRhdGUgc3RhdGVcbiAgICBpZiAoY29tcG9uZW50Lm9uKSB7XG4gICAgICBjb21wb25lbnQub24oXCJmaWVsZDpjaGFuZ2VcIiwgaGFuZGxlQ2hhbmdlKTtcbiAgICAgIC8vIEFsc28gbGlzdGVuIGZvciBmaWxlIGNoYW5nZXNcbiAgICAgIGNvbXBvbmVudC5vbihcImZpbGU6Y2hhbmdlXCIsIGhhbmRsZUNoYW5nZSk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5oYW5jZWQgPSB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBzdGF0ZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgYWxsIGZvcm0gZGF0YVxuICAgICAgICovXG4gICAgICBnZXREYXRhKCk6IEZvcm1EYXRhIHtcbiAgICAgICAgLy8gQWx3YXlzIGNvbGxlY3QgZnJlc2ggZGF0YSBmcm9tIGZpZWxkc1xuICAgICAgICBjb25zdCBkYXRhID0gY29sbGVjdEZpZWxkRGF0YShjb21wb25lbnQuZmllbGRzKTtcbiAgICAgICAgc3RhdGUuY3VycmVudERhdGEgPSBkYXRhO1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLkRBVEFfR0VULCBkYXRhKTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNldCBmb3JtIGRhdGFcbiAgICAgICAqIEBwYXJhbSBkYXRhIC0gRGF0YSBvYmplY3QgdG8gc2V0XG4gICAgICAgKiBAcGFyYW0gc2lsZW50IC0gSWYgdHJ1ZSwgZG9uJ3QgZW1pdCBjaGFuZ2UgZXZlbnRzIGFuZCB1cGRhdGUgaW5pdGlhbCBzdGF0ZVxuICAgICAgICovXG4gICAgICBzZXREYXRhKGRhdGE6IEZvcm1EYXRhLCBzaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICBzZXRGaWVsZHNEYXRhKGNvbXBvbmVudC5maWVsZHMsIGRhdGEsIHNpbGVudCk7XG4gICAgICAgIHN0YXRlLmN1cnJlbnREYXRhID0gY29sbGVjdEZpZWxkRGF0YShjb21wb25lbnQuZmllbGRzKTtcblxuICAgICAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgICAgLy8gV2hlbiBzZXR0aW5nIGRhdGEgc2lsZW50bHksIGFsc28gdXBkYXRlIGluaXRpYWwgZGF0YSBzbmFwc2hvdFxuICAgICAgICAgIC8vIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgd2hlbiBsb2FkaW5nIGRhdGEgZnJvbSBzZXJ2ZXJcbiAgICAgICAgICBzdGF0ZS5pbml0aWFsRGF0YSA9IHsgLi4uc3RhdGUuY3VycmVudERhdGEgfTtcbiAgICAgICAgICBzdGF0ZS5tb2RpZmllZCA9IGZhbHNlO1xuICAgICAgICAgIC8vIFN5bmMgdGhlIGZpZWxkIHZhbHVlIHRyYWNrZXIgZm9yIGV2ZW50IGRlZHVwbGljYXRpb25cbiAgICAgICAgICBzeW5jVHJhY2tlZEZpZWxkVmFsdWVzKGNvbXBvbmVudC5maWVsZHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuREFUQV9TRVQsIHN0YXRlLmN1cnJlbnREYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgYSBzcGVjaWZpYyBmaWVsZCdzIHZhbHVlXG4gICAgICAgKi9cbiAgICAgIGdldEZpZWxkVmFsdWUobmFtZTogc3RyaW5nKTogRmllbGRWYWx1ZSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gY29tcG9uZW50LmZpZWxkcy5nZXQobmFtZSk7XG4gICAgICAgIGlmIChmaWVsZCkge1xuICAgICAgICAgIHJldHVybiBnZXRGaWVsZFZhbHVlKGZpZWxkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdGUuY3VycmVudERhdGFbbmFtZV07XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNldCBhIHNwZWNpZmljIGZpZWxkJ3MgdmFsdWVcbiAgICAgICAqL1xuICAgICAgc2V0RmllbGRWYWx1ZShcbiAgICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgICB2YWx1ZTogRmllbGRWYWx1ZSxcbiAgICAgICAgc2lsZW50OiBib29sZWFuID0gZmFsc2UsXG4gICAgICApOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBjb21wb25lbnQuZmllbGRzLmdldChuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkKSB7XG4gICAgICAgICAgc2V0RmllbGRWYWx1ZShmaWVsZCwgdmFsdWUsIHNpbGVudCk7XG4gICAgICAgICAgc3RhdGUuY3VycmVudERhdGFbbmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICBzdGF0ZS5tb2RpZmllZCA9IGhhc0RhdGFDaGFuZ2VkKHN0YXRlLmluaXRpYWxEYXRhLCBzdGF0ZS5jdXJyZW50RGF0YSk7XG5cbiAgICAgICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5GSUVMRF9DSEFOR0UsIHsgbmFtZSwgdmFsdWUgfSk7XG4gICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLkNIQU5HRSwgeyBuYW1lLCB2YWx1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgZm9ybSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwgc3RhdGVcbiAgICAgICAqL1xuICAgICAgaXNNb2RpZmllZCgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY3VycmVudERhdGEgPSBjb2xsZWN0RmllbGREYXRhKGNvbXBvbmVudC5maWVsZHMpO1xuICAgICAgICBzdGF0ZS5tb2RpZmllZCA9IGhhc0RhdGFDaGFuZ2VkKHN0YXRlLmluaXRpYWxEYXRhLCBjdXJyZW50RGF0YSk7XG4gICAgICAgIHJldHVybiBzdGF0ZS5tb2RpZmllZDtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IG9ubHkgdGhlIGZpZWxkcyB0aGF0IGhhdmUgYmVlbiBtb2RpZmllZFxuICAgICAgICovXG4gICAgICBnZXRNb2RpZmllZERhdGEoKTogRm9ybURhdGEge1xuICAgICAgICBjb25zdCBjdXJyZW50RGF0YSA9IGNvbGxlY3RGaWVsZERhdGEoY29tcG9uZW50LmZpZWxkcyk7XG4gICAgICAgIHJldHVybiBnZXRNb2RpZmllZEZpZWxkcyhzdGF0ZS5pbml0aWFsRGF0YSwgY3VycmVudERhdGEpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBUYWtlIGEgc25hcHNob3Qgb2YgY3VycmVudCBkYXRhIGFzIHRoZSBuZXcgYmFzZWxpbmVcbiAgICAgICAqIEZ1dHVyZSBpc01vZGlmaWVkKCkgY2FsbHMgd2lsbCBjb21wYXJlIGFnYWluc3QgdGhpcyBzbmFwc2hvdFxuICAgICAgICovXG4gICAgICBzbmFwc2hvdCgpOiB2b2lkIHtcbiAgICAgICAgc3RhdGUuaW5pdGlhbERhdGEgPSB7IC4uLmNvbGxlY3RGaWVsZERhdGEoY29tcG9uZW50LmZpZWxkcykgfTtcbiAgICAgICAgc3RhdGUuY3VycmVudERhdGEgPSB7IC4uLnN0YXRlLmluaXRpYWxEYXRhIH07XG4gICAgICAgIHN0YXRlLm1vZGlmaWVkID0gZmFsc2U7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlc2V0IGZvcm0gdG8gaW5pdGlhbCBkYXRhIHN0YXRlXG4gICAgICAgKi9cbiAgICAgIHJlc2V0KCk6IHZvaWQge1xuICAgICAgICBzZXRGaWVsZHNEYXRhKGNvbXBvbmVudC5maWVsZHMsIHN0YXRlLmluaXRpYWxEYXRhLCB0cnVlKTtcbiAgICAgICAgc3RhdGUuY3VycmVudERhdGEgPSB7IC4uLnN0YXRlLmluaXRpYWxEYXRhIH07XG4gICAgICAgIHN0YXRlLm1vZGlmaWVkID0gZmFsc2U7XG4gICAgICAgIHN0YXRlLmVycm9ycyA9IHt9O1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLlJFU0VUKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2xlYXIgYWxsIGZvcm0gZmllbGRzXG4gICAgICAgKi9cbiAgICAgIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBlbXB0eURhdGE6IEZvcm1EYXRhID0ge307XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBjb21wb25lbnQuZmllbGRzLmtleXMoKSkge1xuICAgICAgICAgIGVtcHR5RGF0YVtuYW1lXSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgc2V0RmllbGRzRGF0YShjb21wb25lbnQuZmllbGRzLCBlbXB0eURhdGEsIHRydWUpO1xuICAgICAgICBzdGF0ZS5jdXJyZW50RGF0YSA9IHt9O1xuICAgICAgICBzdGF0ZS5tb2RpZmllZCA9IGhhc0RhdGFDaGFuZ2VkKHN0YXRlLmluaXRpYWxEYXRhLCBzdGF0ZS5jdXJyZW50RGF0YSk7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuUkVTRVQpO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGVuaGFuY2VkO1xuICB9O1xufTtcblxuZXhwb3J0IHsgZmxhdFRvTmVzdGVkLCBnZXROZXN0ZWRWYWx1ZSwgc2V0TmVzdGVkVmFsdWUgfTtcbmV4cG9ydCBkZWZhdWx0IHdpdGhEYXRhO1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2NvbnRyb2xsZXIudHNcblxuLyoqXG4gKiBDb250cm9sbGVyIGZlYXR1cmUgZm9yIEZvcm0gY29tcG9uZW50XG4gKiBNYW5hZ2VzIGNvbnRyb2wgYnV0dG9ucyAoc3VibWl0L2NhbmNlbCkgYmFzZWQgb24gZGF0YSBzdGF0ZSAocHJpc3RpbmUvZGlydHkpXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBGb3JtQ29uZmlnLFxuICBCYXNlRm9ybUNvbXBvbmVudCxcbiAgRm9ybVN0YXRlLFxuICBGb3JtRmllbGRSZWdpc3RyeSxcbiAgRm9ybUZpZWxkLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERBVEFfU1RBVEUsIEZPUk1fRVZFTlRTLCBGT1JNX0NMQVNTRVMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBGT1JNX0RFRkFVTFRTIH0gZnJvbSBcIi4uL2NvbmZpZ1wiO1xuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGZvcm0ncyBzdGF0ZSBDU1MgY2xhc3NcbiAqL1xuY29uc3QgdXBkYXRlU3RhdGVDbGFzcyA9IChcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gIG1vZGlmaWVkOiBib29sZWFuLFxuICBwcmVmaXg6IHN0cmluZyxcbiAgY29tcG9uZW50TmFtZTogc3RyaW5nLFxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IG1vZGlmaWVkQ2xhc3MgPSBgJHtwcmVmaXh9LSR7Y29tcG9uZW50TmFtZX0tLSR7Rk9STV9DTEFTU0VTLk1PRElGSUVEfWA7XG4gIGVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShtb2RpZmllZENsYXNzLCBtb2RpZmllZCk7XG59O1xuXG4vKipcbiAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgYWxsIGZvcm0gZmllbGRzXG4gKi9cbmNvbnN0IHNldEZpZWxkc0VuYWJsZWQgPSAoXG4gIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnksXG4gIGVuYWJsZWQ6IGJvb2xlYW4sXG4pOiB2b2lkID0+IHtcbiAgZm9yIChjb25zdCBbLCBmaWVsZF0gb2YgZmllbGRzKSB7XG4gICAgaWYgKGVuYWJsZWQgJiYgdHlwZW9mIGZpZWxkLmVuYWJsZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBmaWVsZC5lbmFibGUoKTtcbiAgICB9IGVsc2UgaWYgKCFlbmFibGVkICYmIHR5cGVvZiBmaWVsZC5kaXNhYmxlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGZpZWxkLmRpc2FibGUoKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogR2V0cyBjb250cm9sIGJ1dHRvbiBjb21wb25lbnRzIGZyb20gdGhlIFVJIHJlZ2lzdHJ5XG4gKi9cbmNvbnN0IGdldENvbnRyb2xCdXR0b25zID0gKFxuICB1aTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGNvbnRyb2xOYW1lczogc3RyaW5nW10sXG4pOiBNYXA8c3RyaW5nLCBGb3JtRmllbGQ+ID0+IHtcbiAgY29uc3QgY29udHJvbHMgPSBuZXcgTWFwPHN0cmluZywgRm9ybUZpZWxkPigpO1xuXG4gIGZvciAoY29uc3QgbmFtZSBvZiBjb250cm9sTmFtZXMpIHtcbiAgICBjb25zdCBjb250cm9sID0gdWlbbmFtZV07XG4gICAgaWYgKGNvbnRyb2wgJiYgdHlwZW9mIGNvbnRyb2wgPT09IFwib2JqZWN0XCIgJiYgXCJlbGVtZW50XCIgaW4gY29udHJvbCkge1xuICAgICAgY29udHJvbHMuc2V0KG5hbWUsIGNvbnRyb2wgYXMgRm9ybUZpZWxkKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29udHJvbHM7XG59O1xuXG4vKipcbiAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgY29udHJvbCBidXR0b25zXG4gKi9cbmNvbnN0IHNldENvbnRyb2xzRW5hYmxlZCA9IChcbiAgY29udHJvbHM6IE1hcDxzdHJpbmcsIEZvcm1GaWVsZD4sXG4gIGVuYWJsZWQ6IGJvb2xlYW4sXG4pOiB2b2lkID0+IHtcbiAgZm9yIChjb25zdCBbLCBjb250cm9sXSBvZiBjb250cm9scykge1xuICAgIGlmIChlbmFibGVkICYmIHR5cGVvZiBjb250cm9sLmVuYWJsZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb250cm9sLmVuYWJsZSgpO1xuICAgIH0gZWxzZSBpZiAoIWVuYWJsZWQgJiYgdHlwZW9mIGNvbnRyb2wuZGlzYWJsZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb250cm9sLmRpc2FibGUoKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogd2l0aENvbnRyb2xsZXIgZmVhdHVyZVxuICogQWRkcyBjb250cm9sIGJ1dHRvbiBoYW5kbGluZyBiYXNlZCBvbiBkYXRhIHN0YXRlIChwcmlzdGluZS9kaXJ0eSlcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhDb250cm9sbGVyID0gKGNvbmZpZzogRm9ybUNvbmZpZykgPT4ge1xuICByZXR1cm4gPFxuICAgIFQgZXh0ZW5kcyBCYXNlRm9ybUNvbXBvbmVudCAmIHtcbiAgICAgIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnk7XG4gICAgICBzdGF0ZTogRm9ybVN0YXRlO1xuICAgICAgZW1pdD86IChldmVudDogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gdm9pZDtcbiAgICAgIG9uPzogKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKSA9PiB2b2lkO1xuICAgIH0sXG4gID4oXG4gICAgY29tcG9uZW50OiBULFxuICApOiBUICYge1xuICAgIGNvbnRyb2xzOiBNYXA8c3RyaW5nLCBGb3JtRmllbGQ+O1xuICAgIGdldERhdGFTdGF0ZTogKCkgPT4gc3RyaW5nO1xuICAgIGVuYWJsZUNvbnRyb2xzOiAoKSA9PiB2b2lkO1xuICAgIGRpc2FibGVDb250cm9sczogKCkgPT4gdm9pZDtcbiAgICBlbmFibGVGaWVsZHM6ICgpID0+IHZvaWQ7XG4gICAgZGlzYWJsZUZpZWxkczogKCkgPT4gdm9pZDtcbiAgfSA9PiB7XG4gICAgY29uc3QgcHJlZml4ID0gY29uZmlnLnByZWZpeCB8fCBGT1JNX0RFRkFVTFRTLnByZWZpeDtcbiAgICBjb25zdCBjb21wb25lbnROYW1lID0gY29uZmlnLmNvbXBvbmVudE5hbWUgfHwgRk9STV9ERUZBVUxUUy5jb21wb25lbnROYW1lO1xuICAgIGNvbnN0IGNvbnRyb2xOYW1lcyA9IGNvbmZpZy5jb250cm9sc1xuICAgICAgPyBbLi4uY29uZmlnLmNvbnRyb2xzXVxuICAgICAgOiBbLi4uRk9STV9ERUZBVUxUUy5jb250cm9sc107XG5cbiAgICAvLyBHZXQgY29udHJvbCBidXR0b25zIGZyb20gVUlcbiAgICBjb25zdCBjb250cm9scyA9IGNvbnRyb2xOYW1lc1xuICAgICAgPyBnZXRDb250cm9sQnV0dG9ucyhjb21wb25lbnQudWkgfHwge30sIGNvbnRyb2xOYW1lcylcbiAgICAgIDogbmV3IE1hcDxzdHJpbmcsIEZvcm1GaWVsZD4oKTtcblxuICAgIC8vIEluaXRpYWxpemUgY29udHJvbHMgYXMgZGlzYWJsZWQgKHByaXN0aW5lIHN0YXRlKVxuICAgIGlmIChjb250cm9scy5zaXplID4gMCkge1xuICAgICAgc2V0Q29udHJvbHNFbmFibGVkKGNvbnRyb2xzLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5oYW5jZWQgPSB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBjb250cm9scyxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgY3VycmVudCBkYXRhIHN0YXRlIChwcmlzdGluZSBvciBkaXJ0eSlcbiAgICAgICAqL1xuICAgICAgZ2V0RGF0YVN0YXRlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuc3RhdGUubW9kaWZpZWRcbiAgICAgICAgICA/IERBVEFfU1RBVEUuRElSVFlcbiAgICAgICAgICA6IERBVEFfU1RBVEUuUFJJU1RJTkU7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEVuYWJsZSBjb250cm9sIGJ1dHRvbnNcbiAgICAgICAqL1xuICAgICAgZW5hYmxlQ29udHJvbHMoKTogdm9pZCB7XG4gICAgICAgIHNldENvbnRyb2xzRW5hYmxlZChjb250cm9scywgdHJ1ZSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIERpc2FibGUgY29udHJvbCBidXR0b25zXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVDb250cm9scygpOiB2b2lkIHtcbiAgICAgICAgc2V0Q29udHJvbHNFbmFibGVkKGNvbnRyb2xzLCBmYWxzZSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEVuYWJsZSBhbGwgZm9ybSBmaWVsZHNcbiAgICAgICAqL1xuICAgICAgZW5hYmxlRmllbGRzKCk6IHZvaWQge1xuICAgICAgICBzZXRGaWVsZHNFbmFibGVkKGNvbXBvbmVudC5maWVsZHMsIHRydWUpO1xuICAgICAgICBjb21wb25lbnQuc3RhdGUuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZSBhbGwgZm9ybSBmaWVsZHNcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZUZpZWxkcygpOiB2b2lkIHtcbiAgICAgICAgc2V0RmllbGRzRW5hYmxlZChjb21wb25lbnQuZmllbGRzLCBmYWxzZSk7XG4gICAgICAgIGNvbXBvbmVudC5zdGF0ZS5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBMaXN0ZW4gZm9yIHN0YXRlIGNoYW5nZXMgdG8gZW5hYmxlL2Rpc2FibGUgY29udHJvbHNcbiAgICBpZiAoY29uZmlnLnVzZUNoYW5nZXMgIT09IGZhbHNlICYmIGNvbXBvbmVudC5vbikge1xuICAgICAgY29tcG9uZW50Lm9uKFxuICAgICAgICBGT1JNX0VWRU5UUy5TVEFURV9DSEFOR0UsXG4gICAgICAgIChldmVudDogeyBtb2RpZmllZDogYm9vbGVhbjsgc3RhdGU6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgICAgaWYgKGV2ZW50Lm1vZGlmaWVkKSB7XG4gICAgICAgICAgICAvLyBEYXRhIGlzIGRpcnR5IC0gZW5hYmxlIGNvbnRyb2xzXG4gICAgICAgICAgICBzZXRDb250cm9sc0VuYWJsZWQoY29udHJvbHMsIHRydWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBEYXRhIGlzIHByaXN0aW5lIC0gZGlzYWJsZSBjb250cm9sc1xuICAgICAgICAgICAgc2V0Q29udHJvbHNFbmFibGVkKGNvbnRyb2xzLCBmYWxzZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVXBkYXRlIENTUyBjbGFzc1xuICAgICAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICAgICAgdXBkYXRlU3RhdGVDbGFzcyhcbiAgICAgICAgICAgICAgY29tcG9uZW50LmVsZW1lbnQsXG4gICAgICAgICAgICAgIGV2ZW50Lm1vZGlmaWVkLFxuICAgICAgICAgICAgICBwcmVmaXgsXG4gICAgICAgICAgICAgIGNvbXBvbmVudE5hbWUsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVuaGFuY2VkO1xuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgd2l0aENvbnRyb2xsZXI7XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL2Zvcm0vZmVhdHVyZXMvc3VibWl0LnRzXG5cbi8qKlxuICogU3VibWl0IGZlYXR1cmUgZm9yIEZvcm0gY29tcG9uZW50XG4gKiBIYW5kbGVzIGZvcm0gdmFsaWRhdGlvbiBhbmQgc3VibWlzc2lvblxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRm9ybUNvbmZpZyxcbiAgQmFzZUZvcm1Db21wb25lbnQsXG4gIEZvcm1EYXRhLFxuICBGb3JtU3RhdGUsXG4gIEZvcm1GaWVsZFJlZ2lzdHJ5LFxuICBGb3JtVmFsaWRhdGlvblJ1bGUsXG4gIEZvcm1WYWxpZGF0aW9uUmVzdWx0LFxuICBGb3JtU3VibWl0T3B0aW9ucyxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBGT1JNX0VWRU5UUywgRk9STV9DTEFTU0VTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIERlZmF1bHQgaGVhZGVycyBmb3IgSlNPTiByZXF1ZXN0c1xuICovXG5jb25zdCBERUZBVUxUX0hFQURFUlM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgZm9ybSBkYXRhIGFnYWluc3QgdmFsaWRhdGlvbiBydWxlc1xuICovXG5jb25zdCB2YWxpZGF0ZURhdGEgPSAoXG4gIGRhdGE6IEZvcm1EYXRhLFxuICBydWxlczogRm9ybVZhbGlkYXRpb25SdWxlW10sXG4pOiBGb3JtVmFsaWRhdGlvblJlc3VsdCA9PiB7XG4gIGNvbnN0IGVycm9yczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBsZXQgdmFsaWQgPSB0cnVlO1xuXG4gIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xuICAgIGNvbnN0IHZhbHVlID0gZGF0YVtydWxlLmZpZWxkXTtcbiAgICBjb25zdCByZXN1bHQgPSBydWxlLnZhbGlkYXRlKHZhbHVlLCBkYXRhKTtcblxuICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgZXJyb3JzW3J1bGUuZmllbGRdID0gcnVsZS5tZXNzYWdlIHx8IGAke3J1bGUuZmllbGR9IGlzIGludmFsaWRgO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlc3VsdCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIGVycm9yc1tydWxlLmZpZWxkXSA9IHJlc3VsdDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyB2YWxpZCwgZXJyb3JzIH07XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIHRoZSBhY3R1YWwgSFRUUCByZXF1ZXN0XG4gKi9cbmNvbnN0IHBlcmZvcm1SZXF1ZXN0ID0gYXN5bmMgKFxuICB1cmw6IHN0cmluZyxcbiAgZGF0YTogRm9ybURhdGEsXG4gIG9wdGlvbnM6IEZvcm1TdWJtaXRPcHRpb25zLFxuKTogUHJvbWlzZTx1bmtub3duPiA9PiB7XG4gIGNvbnN0IG1ldGhvZCA9IG9wdGlvbnMubWV0aG9kIHx8IFwiUE9TVFwiO1xuICBjb25zdCBoZWFkZXJzID0geyAuLi5ERUZBVUxUX0hFQURFUlMsIC4uLm9wdGlvbnMuaGVhZGVycyB9O1xuXG4gIGNvbnN0IGZldGNoT3B0aW9uczogUmVxdWVzdEluaXQgPSB7XG4gICAgbWV0aG9kLFxuICAgIGhlYWRlcnMsXG4gIH07XG5cbiAgLy8gQWRkIGJvZHkgZm9yIG5vbi1HRVQgcmVxdWVzdHNcbiAgaWYgKG1ldGhvZCAhPT0gXCJHRVRcIikge1xuICAgIGZldGNoT3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gIH1cblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgZmV0Y2hPcHRpb25zKTtcblxuICAvLyBQYXJzZSByZXNwb25zZVxuICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC10eXBlXCIpO1xuICBsZXQgcmVzdWx0OiB1bmtub3duO1xuXG4gIGlmIChjb250ZW50VHlwZSAmJiBjb250ZW50VHlwZS5pbmNsdWRlcyhcImFwcGxpY2F0aW9uL2pzb25cIikpIHtcbiAgICByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIEhUVFAgZXJyb3JzXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c306ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTtcbiAgICAoZXJyb3IgYXMgRXJyb3IgJiB7IHJlc3BvbnNlOiB1bmtub3duIH0pLnJlc3BvbnNlID0gcmVzdWx0O1xuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogd2l0aFN1Ym1pdCBmZWF0dXJlXG4gKiBBZGRzIHZhbGlkYXRpb24gYW5kIHN1Ym1pc3Npb24gY2FwYWJpbGl0aWVzIHRvIHRoZSBmb3JtXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoU3VibWl0ID0gKGNvbmZpZzogRm9ybUNvbmZpZykgPT4ge1xuICByZXR1cm4gPFxuICAgIFQgZXh0ZW5kcyBCYXNlRm9ybUNvbXBvbmVudCAmIHtcbiAgICAgIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnk7XG4gICAgICBzdGF0ZTogRm9ybVN0YXRlO1xuICAgICAgZ2V0RGF0YTogKCkgPT4gRm9ybURhdGE7XG4gICAgICBnZXRNb2RpZmllZERhdGE6ICgpID0+IEZvcm1EYXRhO1xuICAgICAgZGlzYWJsZUNvbnRyb2xzOiAoKSA9PiB2b2lkO1xuICAgICAgc25hcHNob3Q6ICgpID0+IHZvaWQ7XG4gICAgICBlbWl0PzogKGV2ZW50OiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiB2b2lkO1xuICAgIH0sXG4gID4oXG4gICAgY29tcG9uZW50OiBULFxuICApOiBUICYge1xuICAgIHZhbGlkYXRlOiAoKSA9PiBGb3JtVmFsaWRhdGlvblJlc3VsdDtcbiAgICBzdWJtaXQ6IChvcHRpb25zPzogRm9ybVN1Ym1pdE9wdGlvbnMpID0+IFByb21pc2U8dW5rbm93bj47XG4gICAgc2V0VmFsaWRhdGlvblJ1bGVzOiAocnVsZXM6IEZvcm1WYWxpZGF0aW9uUnVsZVtdKSA9PiB2b2lkO1xuICAgIGNsZWFyRXJyb3JzOiAoKSA9PiB2b2lkO1xuICAgIHNldEZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nLCBlcnJvcjogc3RyaW5nKSA9PiB2b2lkO1xuICAgIGdldEZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIH0gPT4ge1xuICAgIC8vIFZhbGlkYXRpb24gcnVsZXMgY2FuIGJlIHVwZGF0ZWQgYXQgcnVudGltZVxuICAgIGxldCB2YWxpZGF0aW9uUnVsZXMgPSBjb25maWcudmFsaWRhdGlvbiB8fCBbXTtcblxuICAgIGNvbnN0IGVuaGFuY2VkID0ge1xuICAgICAgLi4uY29tcG9uZW50LFxuXG4gICAgICAvKipcbiAgICAgICAqIFZhbGlkYXRlIGZvcm0gZGF0YSBhZ2FpbnN0IGNvbmZpZ3VyZWQgcnVsZXNcbiAgICAgICAqIEByZXR1cm5zIFZhbGlkYXRpb24gcmVzdWx0IHdpdGggdmFsaWQgZmxhZyBhbmQgZXJyb3JzIG9iamVjdFxuICAgICAgICovXG4gICAgICB2YWxpZGF0ZSgpOiBGb3JtVmFsaWRhdGlvblJlc3VsdCB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBjb21wb25lbnQuZ2V0RGF0YSgpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB2YWxpZGF0ZURhdGEoZGF0YSwgdmFsaWRhdGlvblJ1bGVzKTtcblxuICAgICAgICAvLyBVcGRhdGUgc3RhdGUgd2l0aCB2YWxpZGF0aW9uIGVycm9yc1xuICAgICAgICBjb21wb25lbnQuc3RhdGUuZXJyb3JzID0gcmVzdWx0LmVycm9ycztcblxuICAgICAgICAvLyBFbWl0IHZhbGlkYXRpb24gZXZlbnQgaWYgdGhlcmUgYXJlIGVycm9yc1xuICAgICAgICBpZiAoIXJlc3VsdC52YWxpZCkge1xuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuVkFMSURBVElPTl9FUlJPUiwgcmVzdWx0LmVycm9ycyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTdWJtaXQgdGhlIGZvcm1cbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgc3VibWl0IGNvbmZpZ3VyYXRpb25cbiAgICAgICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBzZXJ2ZXIgcmVzcG9uc2VcbiAgICAgICAqL1xuICAgICAgYXN5bmMgc3VibWl0KG9wdGlvbnM6IEZvcm1TdWJtaXRPcHRpb25zID0ge30pOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgLy8gUHJldmVudCBkb3VibGUgc3VibWlzc2lvblxuICAgICAgICBpZiAoY29tcG9uZW50LnN0YXRlLnN1Ym1pdHRpbmcpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRm9ybSBpcyBhbHJlYWR5IHN1Ym1pdHRpbmdcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgaWYgcmVxdWVzdGVkIChkZWZhdWx0OiB0cnVlKVxuICAgICAgICBpZiAob3B0aW9ucy52YWxpZGF0ZSAhPT0gZmFsc2UgJiYgdmFsaWRhdGlvblJ1bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uID0gdGhpcy52YWxpZGF0ZSgpO1xuICAgICAgICAgIGlmICghdmFsaWRhdGlvbi52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlZhbGlkYXRpb24gZmFpbGVkXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYXJrIGFzIHN1Ym1pdHRpbmdcbiAgICAgICAgY29tcG9uZW50LnN0YXRlLnN1Ym1pdHRpbmcgPSB0cnVlO1xuXG4gICAgICAgIC8vIEFkZCBzdWJtaXR0aW5nIGNsYXNzIHRvIGVsZW1lbnRcbiAgICAgICAgaWYgKGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlnLnByZWZpeCB8fCBcIm10cmxcIjtcbiAgICAgICAgICBjb25zdCBjb21wb25lbnROYW1lID0gY29uZmlnLmNvbXBvbmVudE5hbWUgfHwgXCJmb3JtXCI7XG4gICAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuY2xhc3NMaXN0LmFkZChcbiAgICAgICAgICAgIGAke3ByZWZpeH0tJHtjb21wb25lbnROYW1lfS0tJHtGT1JNX0NMQVNTRVMuU1VCTUlUVElOR31gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IHN1Ym1pdCBldmVudFxuICAgICAgICBjb25zdCBkYXRhID0gY29tcG9uZW50LmdldERhdGEoKTtcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5TVUJNSVQsIGRhdGEpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGV0IHJlc3VsdDogdW5rbm93bjtcblxuICAgICAgICAgIC8vIFVzZSBjdXN0b20gaGFuZGxlciBpZiBwcm92aWRlZFxuICAgICAgICAgIGlmIChvcHRpb25zLmhhbmRsZXIpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IG9wdGlvbnMuaGFuZGxlcihcbiAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgY29tcG9uZW50IGFzIHVua25vd24gYXMgaW1wb3J0KFwiLi4vdHlwZXNcIikuRm9ybUNvbXBvbmVudCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjb25maWcuYWN0aW9uKSB7XG4gICAgICAgICAgICAvLyBVc2UgZGVmYXVsdCBmZXRjaFxuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcGVyZm9ybVJlcXVlc3QoY29uZmlnLmFjdGlvbiwgZGF0YSwge1xuICAgICAgICAgICAgICBtZXRob2Q6IG9wdGlvbnMubWV0aG9kIHx8IGNvbmZpZy5tZXRob2QgfHwgXCJQT1NUXCIsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IG9wdGlvbnMuaGVhZGVycyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBObyBhY3Rpb24gVVJMLCBqdXN0IHJldHVybiB0aGUgZGF0YVxuICAgICAgICAgICAgcmVzdWx0ID0gZGF0YTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTdWNjZXNzIVxuICAgICAgICAgIGNvbXBvbmVudC5zdGF0ZS5zdWJtaXR0aW5nID0gZmFsc2U7XG4gICAgICAgICAgY29tcG9uZW50LnN0YXRlLmVycm9ycyA9IHt9O1xuXG4gICAgICAgICAgLy8gUmVtb3ZlIHN1Ym1pdHRpbmcgY2xhc3NcbiAgICAgICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZy5wcmVmaXggfHwgXCJtdHJsXCI7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnROYW1lID0gY29uZmlnLmNvbXBvbmVudE5hbWUgfHwgXCJmb3JtXCI7XG4gICAgICAgICAgICBjb21wb25lbnQuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFxuICAgICAgICAgICAgICBgJHtwcmVmaXh9LSR7Y29tcG9uZW50TmFtZX0tLSR7Rk9STV9DTEFTU0VTLlNVQk1JVFRJTkd9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVGFrZSBzbmFwc2hvdCBvZiBjdXJyZW50IGRhdGEgYXMgbmV3IGJhc2VsaW5lXG4gICAgICAgICAgLy8gVGhpcyByZXNldHMgbW9kaWZpZWQgc3RhdGUgdG8gZmFsc2UsIHdoaWNoIHdpbGwgdHJpZ2dlciBzdGF0ZTpjaGFuZ2VcbiAgICAgICAgICBjb21wb25lbnQuc25hcHNob3QoKTtcblxuICAgICAgICAgIC8vIERpc2FibGUgY29udHJvbHMgKGZvcm0gaXMgbm93IHByaXN0aW5lKVxuICAgICAgICAgIGNvbXBvbmVudC5kaXNhYmxlQ29udHJvbHMoKTtcblxuICAgICAgICAgIC8vIEVtaXQgc3VjY2VzcyBldmVudFxuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuU1VCTUlUX1NVQ0NFU1MsIHJlc3VsdCk7XG5cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIEVycm9yIVxuICAgICAgICAgIGNvbXBvbmVudC5zdGF0ZS5zdWJtaXR0aW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAvLyBSZW1vdmUgc3VibWl0dGluZyBjbGFzc1xuICAgICAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlnLnByZWZpeCB8fCBcIm10cmxcIjtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBjb25maWcuY29tcG9uZW50TmFtZSB8fCBcImZvcm1cIjtcbiAgICAgICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXG4gICAgICAgICAgICAgIGAke3ByZWZpeH0tJHtjb21wb25lbnROYW1lfS0tJHtGT1JNX0NMQVNTRVMuU1VCTUlUVElOR31gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBFbWl0IGVycm9yIGV2ZW50XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5TVUJNSVRfRVJST1IsIGVycm9yKTtcblxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNldCB2YWxpZGF0aW9uIHJ1bGVzIGF0IHJ1bnRpbWVcbiAgICAgICAqL1xuICAgICAgc2V0VmFsaWRhdGlvblJ1bGVzKHJ1bGVzOiBGb3JtVmFsaWRhdGlvblJ1bGVbXSk6IHZvaWQge1xuICAgICAgICB2YWxpZGF0aW9uUnVsZXMgPSBydWxlcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2xlYXIgYWxsIHZhbGlkYXRpb24gZXJyb3JzXG4gICAgICAgKi9cbiAgICAgIGNsZWFyRXJyb3JzKCk6IHZvaWQge1xuICAgICAgICBjb21wb25lbnQuc3RhdGUuZXJyb3JzID0ge307XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNldCBhbiBlcnJvciBmb3IgYSBzcGVjaWZpYyBmaWVsZFxuICAgICAgICovXG4gICAgICBzZXRGaWVsZEVycm9yKGZpZWxkOiBzdHJpbmcsIGVycm9yOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29tcG9uZW50LnN0YXRlLmVycm9yc1tmaWVsZF0gPSBlcnJvcjtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IHRoZSBlcnJvciBmb3IgYSBzcGVjaWZpYyBmaWVsZFxuICAgICAgICovXG4gICAgICBnZXRGaWVsZEVycm9yKGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LnN0YXRlLmVycm9yc1tmaWVsZF07XG4gICAgICB9LFxuICAgIH07XG5cbiAgICByZXR1cm4gZW5oYW5jZWQ7XG4gIH07XG59O1xuXG5leHBvcnQgeyB2YWxpZGF0ZURhdGEsIHBlcmZvcm1SZXF1ZXN0IH07XG5leHBvcnQgZGVmYXVsdCB3aXRoU3VibWl0O1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2FwaS50c1xuXG4vKipcbiAqIEFQSSBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogUHJvdmlkZXMgYSBjbGVhbiwgdW5pZmllZCBwdWJsaWMgQVBJIGZvciB0aGUgZm9ybVxuICogQWxzbyB3aXJlcyB1cCBjb250cm9sIGJ1dHRvbiBjbGljayBoYW5kbGVycyAoc3VibWl0L2NhbmNlbClcbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEZvcm1Db25maWcsXG4gIEJhc2VGb3JtQ29tcG9uZW50LFxuICBGb3JtQ29tcG9uZW50LFxuICBGb3JtRGF0YSxcbiAgRGF0YVN0YXRlLFxuICBGb3JtU3RhdGUsXG4gIEZvcm1GaWVsZCxcbiAgRm9ybUZpZWxkUmVnaXN0cnksXG4gIEZvcm1WYWxpZGF0aW9uUmVzdWx0LFxuICBGb3JtU3VibWl0T3B0aW9ucyxcbiAgRmllbGRWYWx1ZSxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBGT1JNX0VWRU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBXaXJlcyB1cCBjbGljayBoYW5kbGVycyBmb3IgY29udHJvbCBidXR0b25zIChzdWJtaXQsIGNhbmNlbClcbiAqL1xuY29uc3Qgd2lyZUNvbnRyb2xCdXR0b25zID0gKFxuICBjb250cm9sczogTWFwPHN0cmluZywgRm9ybUZpZWxkPixcbiAgYXBpOiBGb3JtQ29tcG9uZW50LFxuICBjb25maWc6IEZvcm1Db25maWcsXG4pOiB2b2lkID0+IHtcbiAgLy8gV2lyZSBzdWJtaXQgYnV0dG9uXG4gIGNvbnN0IHN1Ym1pdEJ1dHRvbiA9IGNvbnRyb2xzLmdldChcInN1Ym1pdFwiKTtcbiAgaWYgKHN1Ym1pdEJ1dHRvbj8uZWxlbWVudCkge1xuICAgIHN1Ym1pdEJ1dHRvbi5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoY29uZmlnLm9uU3VibWl0KSB7XG4gICAgICAgIC8vIFVzZSBjdXN0b20gc3VibWl0IGhhbmRsZXJcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gYXBpLmdldERhdGEoKTtcbiAgICAgICAgICBhd2FpdCBjb25maWcub25TdWJtaXQoZGF0YSwgYXBpKTtcbiAgICAgICAgICAvLyBBZnRlciBzdWNjZXNzZnVsIHN1Ym1pdCwgZGlzYWJsZSBjb250cm9scyAoZm9ybSBpcyBub3cgcHJpc3RpbmUpXG4gICAgICAgICAgYXBpLmRpc2FibGVDb250cm9scygpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGb3JtIHN1Ym1pdCBlcnJvcjpcIiwgZXJyb3IpO1xuICAgICAgICAgIC8vIE9uIGVycm9yLCBhbHNvIGRpc2FibGUgY29udHJvbHMgdG8gcHJldmVudCByZXBlYXRlZCBjbGlja3NcbiAgICAgICAgICBhcGkuZGlzYWJsZUNvbnRyb2xzKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVzZSBkZWZhdWx0IGZvcm0gc3VibWl0IChoYW5kbGVzIGRpc2FibGluZyBpbnRlcm5hbGx5KVxuICAgICAgICBhd2FpdCBhcGkuc3VibWl0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBXaXJlIGNhbmNlbCBidXR0b25cbiAgY29uc3QgY2FuY2VsQnV0dG9uID0gY29udHJvbHMuZ2V0KFwiY2FuY2VsXCIpO1xuICBpZiAoY2FuY2VsQnV0dG9uPy5lbGVtZW50KSB7XG4gICAgY2FuY2VsQnV0dG9uLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgIGlmIChjb25maWcub25DYW5jZWwpIHtcbiAgICAgICAgLy8gVXNlIGN1c3RvbSBjYW5jZWwgaGFuZGxlclxuICAgICAgICBjb25maWcub25DYW5jZWwoYXBpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERlZmF1bHQ6IHJlc2V0IGZvcm0gdG8gaW5pdGlhbCBzdGF0ZVxuICAgICAgICBhcGkucmVzZXQoKTtcbiAgICAgIH1cbiAgICAgIC8vIEFmdGVyIGNhbmNlbCwgZGlzYWJsZSBjb250cm9scyAoZm9ybSBpcyBub3cgcHJpc3RpbmUpXG4gICAgICBhcGkuZGlzYWJsZUNvbnRyb2xzKCk7XG4gICAgfSk7XG4gIH1cbn07XG5cbi8qKlxuICogRXh0ZW5kZWQgY29tcG9uZW50IGludGVyZmFjZSBiZWZvcmUgQVBJIGlzIGFwcGxpZWRcbiAqL1xuaW50ZXJmYWNlIEVuaGFuY2VkRm9ybUNvbXBvbmVudCBleHRlbmRzIEJhc2VGb3JtQ29tcG9uZW50IHtcbiAgZm9ybTogSFRNTEZvcm1FbGVtZW50O1xuICB1aTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnk7XG4gIGZpbGVzOiBGb3JtRmllbGRSZWdpc3RyeTtcbiAgc3RhdGU6IEZvcm1TdGF0ZTtcbiAgY29udHJvbHM6IE1hcDxzdHJpbmcsIEZvcm1GaWVsZD47XG5cbiAgLy8gRGF0YSBtZXRob2RzXG4gIGdldERhdGE6ICgpID0+IEZvcm1EYXRhO1xuICBzZXREYXRhOiAoZGF0YTogRm9ybURhdGEsIHNpbGVudD86IGJvb2xlYW4pID0+IHZvaWQ7XG4gIGdldEZpZWxkVmFsdWU6IChuYW1lOiBzdHJpbmcpID0+IEZpZWxkVmFsdWU7XG4gIHNldEZpZWxkVmFsdWU6IChuYW1lOiBzdHJpbmcsIHZhbHVlOiBGaWVsZFZhbHVlLCBzaWxlbnQ/OiBib29sZWFuKSA9PiB2b2lkO1xuICBpc01vZGlmaWVkOiAoKSA9PiBib29sZWFuO1xuICBnZXRNb2RpZmllZERhdGE6ICgpID0+IEZvcm1EYXRhO1xuICBzbmFwc2hvdDogKCkgPT4gdm9pZDtcbiAgcmVzZXQ6ICgpID0+IHZvaWQ7XG4gIGNsZWFyOiAoKSA9PiB2b2lkO1xuXG4gIC8vIEZpZWxkIG1ldGhvZHNcbiAgZ2V0RmllbGQ6IChuYW1lOiBzdHJpbmcpID0+IEZvcm1GaWVsZCB8IHVuZGVmaW5lZDtcbiAgZ2V0RmllbGROYW1lczogKCkgPT4gc3RyaW5nW107XG4gIGhhc0ZpZWxkOiAobmFtZTogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIC8vIENvbnRyb2xsZXIgbWV0aG9kc1xuICBnZXREYXRhU3RhdGU6ICgpID0+IERhdGFTdGF0ZTtcbiAgZW5hYmxlQ29udHJvbHM6ICgpID0+IHZvaWQ7XG4gIGRpc2FibGVDb250cm9sczogKCkgPT4gdm9pZDtcbiAgZW5hYmxlRmllbGRzOiAoKSA9PiB2b2lkO1xuICBkaXNhYmxlRmllbGRzOiAoKSA9PiB2b2lkO1xuXG4gIC8vIFN1Ym1pdCBtZXRob2RzXG4gIHZhbGlkYXRlOiAoKSA9PiBGb3JtVmFsaWRhdGlvblJlc3VsdDtcbiAgc3VibWl0OiAob3B0aW9ucz86IEZvcm1TdWJtaXRPcHRpb25zKSA9PiBQcm9taXNlPHVua25vd24+O1xuICBzZXRWYWxpZGF0aW9uUnVsZXM6IChydWxlczogaW1wb3J0KFwiLi4vdHlwZXNcIikuRm9ybVZhbGlkYXRpb25SdWxlW10pID0+IHZvaWQ7XG4gIGNsZWFyRXJyb3JzOiAoKSA9PiB2b2lkO1xuICBzZXRGaWVsZEVycm9yOiAoZmllbGQ6IHN0cmluZywgZXJyb3I6IHN0cmluZykgPT4gdm9pZDtcbiAgZ2V0RmllbGRFcnJvcjogKGZpZWxkOiBzdHJpbmcpID0+IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvLyBFdmVudCBtZXRob2RzXG4gIG9uPzogKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKSA9PiB2b2lkO1xuICBvZmY/OiAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pID0+IHZvaWQ7XG4gIGVtaXQ/OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG5cbiAgLy8gTGlmZWN5Y2xlXG4gIGxpZmVjeWNsZT86IHtcbiAgICBkZXN0cm95OiAoKSA9PiB2b2lkO1xuICB9O1xufVxuXG4vKipcbiAqIHdpdGhBUEkgZmVhdHVyZVxuICogQ3JlYXRlcyBhIGNsZWFuIHB1YmxpYyBBUEkgZm9yIHRoZSBmb3JtIGNvbXBvbmVudFxuICovXG5leHBvcnQgY29uc3Qgd2l0aEFQSSA9IChjb25maWc6IEZvcm1Db25maWcpID0+IHtcbiAgcmV0dXJuIChjb21wb25lbnQ6IEVuaGFuY2VkRm9ybUNvbXBvbmVudCk6IEZvcm1Db21wb25lbnQgPT4ge1xuICAgIC8vIFJlZ2lzdGVyIGV2ZW50IGhhbmRsZXJzIGZyb20gY29uZmlnXG4gICAgaWYgKGNvbmZpZy5vbiAmJiBjb21wb25lbnQub24pIHtcbiAgICAgIGZvciAoY29uc3QgW2V2ZW50LCBoYW5kbGVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWcub24pKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgY29tcG9uZW50Lm9uKGV2ZW50LCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgcHVibGljIEFQSVxuICAgIGNvbnN0IGFwaTogRm9ybUNvbXBvbmVudCA9IHtcbiAgICAgIC8vIENvcmUgcHJvcGVydGllc1xuICAgICAgZWxlbWVudDogY29tcG9uZW50LmVsZW1lbnQsXG4gICAgICBmb3JtOiBjb21wb25lbnQuZm9ybSxcbiAgICAgIHVpOiBjb21wb25lbnQudWksXG4gICAgICBmaWVsZHM6IGNvbXBvbmVudC5maWVsZHMsXG4gICAgICBzdGF0ZTogY29tcG9uZW50LnN0YXRlLFxuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vIERhdGEgQVBJXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgYWxsIGZvcm0gZGF0YSBhcyBhIGtleS12YWx1ZSBvYmplY3RcbiAgICAgICAqL1xuICAgICAgZ2V0RGF0YSgpOiBGb3JtRGF0YSB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuZ2V0RGF0YSgpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTZXQgZm9ybSBkYXRhIGZyb20gYSBrZXktdmFsdWUgb2JqZWN0XG4gICAgICAgKiBAcGFyYW0gZGF0YSAtIERhdGEgdG8gc2V0XG4gICAgICAgKiBAcGFyYW0gc2lsZW50IC0gSWYgdHJ1ZSwgZG9uJ3QgZW1pdCBjaGFuZ2UgZXZlbnRzXG4gICAgICAgKi9cbiAgICAgIHNldERhdGEoZGF0YTogRm9ybURhdGEsIHNpbGVudD86IGJvb2xlYW4pOiBGb3JtQ29tcG9uZW50IHtcbiAgICAgICAgY29tcG9uZW50LnNldERhdGEoZGF0YSwgc2lsZW50KTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IGEgc3BlY2lmaWMgZmllbGQncyB2YWx1ZVxuICAgICAgICogQHBhcmFtIG5hbWUgLSBGaWVsZCBuYW1lXG4gICAgICAgKi9cbiAgICAgIGdldEZpZWxkVmFsdWUobmFtZTogc3RyaW5nKTogRmllbGRWYWx1ZSB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuZ2V0RmllbGRWYWx1ZShuYW1lKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IGEgc3BlY2lmaWMgZmllbGQncyB2YWx1ZVxuICAgICAgICogQHBhcmFtIG5hbWUgLSBGaWVsZCBuYW1lXG4gICAgICAgKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBzZXRcbiAgICAgICAqIEBwYXJhbSBzaWxlbnQgLSBJZiB0cnVlLCBkb24ndCBlbWl0IGNoYW5nZSBldmVudHNcbiAgICAgICAqL1xuICAgICAgc2V0RmllbGRWYWx1ZShcbiAgICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgICB2YWx1ZTogRmllbGRWYWx1ZSxcbiAgICAgICAgc2lsZW50PzogYm9vbGVhbixcbiAgICAgICk6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQuc2V0RmllbGRWYWx1ZShuYW1lLCB2YWx1ZSwgc2lsZW50KTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IGEgZmllbGQgY29tcG9uZW50IGJ5IG5hbWVcbiAgICAgICAqIEBwYXJhbSBuYW1lIC0gRmllbGQgbmFtZVxuICAgICAgICovXG4gICAgICBnZXRGaWVsZChuYW1lOiBzdHJpbmcpOiBGb3JtRmllbGQgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LmdldEZpZWxkKG5hbWUpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgYWxsIGZpZWxkIG5hbWVzXG4gICAgICAgKi9cbiAgICAgIGdldEZpZWxkTmFtZXMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LmdldEZpZWxkTmFtZXMoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgZm9ybSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwvc25hcHNob3Qgc3RhdGVcbiAgICAgICAqL1xuICAgICAgaXNNb2RpZmllZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5pc01vZGlmaWVkKCk7XG4gICAgICB9LFxuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vIFN0YXRlIEFQSVxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IHRoZSBjdXJyZW50IGRhdGEgc3RhdGUgKHByaXN0aW5lIG9yIGRpcnR5KVxuICAgICAgICovXG4gICAgICBnZXREYXRhU3RhdGUoKTogRGF0YVN0YXRlIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5nZXREYXRhU3RhdGUoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gVmFsaWRhdGlvbiBBUElcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgICAvKipcbiAgICAgICAqIFZhbGlkYXRlIHRoZSBmb3JtIGFnYWluc3QgY29uZmlndXJlZCBydWxlc1xuICAgICAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHQgd2l0aCB2YWxpZCBmbGFnIGFuZCBlcnJvcnNcbiAgICAgICAqL1xuICAgICAgdmFsaWRhdGUoKTogRm9ybVZhbGlkYXRpb25SZXN1bHQge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LnZhbGlkYXRlKCk7XG4gICAgICB9LFxuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vIFN1Ym1pdCBBUElcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgICAvKipcbiAgICAgICAqIFN1Ym1pdCB0aGUgZm9ybVxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBzdWJtaXQgY29uZmlndXJhdGlvblxuICAgICAgICovXG4gICAgICBhc3luYyBzdWJtaXQob3B0aW9ucz86IEZvcm1TdWJtaXRPcHRpb25zKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuc3VibWl0KG9wdGlvbnMpO1xuICAgICAgfSxcblxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyBTdGF0ZSBNYW5hZ2VtZW50IEFQSVxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAgIC8qKlxuICAgICAgICogUmVzZXQgZm9ybSB0byBpbml0aWFsL3NuYXBzaG90IHN0YXRlXG4gICAgICAgKi9cbiAgICAgIHJlc2V0KCk6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQucmVzZXQoKTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2xlYXIgYWxsIGZvcm0gZmllbGRzXG4gICAgICAgKi9cbiAgICAgIGNsZWFyKCk6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQuY2xlYXIoKTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRW5hYmxlIGFsbCBmb3JtIGZpZWxkc1xuICAgICAgICovXG4gICAgICBlbmFibGUoKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5lbmFibGVGaWVsZHMoKTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZSBhbGwgZm9ybSBmaWVsZHNcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZSgpOiBGb3JtQ29tcG9uZW50IHtcbiAgICAgICAgY29tcG9uZW50LmRpc2FibGVGaWVsZHMoKTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRW5hYmxlIGNvbnRyb2wgYnV0dG9ucyAoc3VibWl0LCBjYW5jZWwsIGV0Yy4pXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZUNvbnRyb2xzKCk6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQuZW5hYmxlQ29udHJvbHMoKTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZSBjb250cm9sIGJ1dHRvbnNcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZUNvbnRyb2xzKCk6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQuZGlzYWJsZUNvbnRyb2xzKCk7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vIEV2ZW50IEFQSVxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAgIC8qKlxuICAgICAgICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyXG4gICAgICAgKiBAcGFyYW0gZXZlbnQgLSBFdmVudCBuYW1lXG4gICAgICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICAgICAqL1xuICAgICAgb24oZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pOiBGb3JtQ29tcG9uZW50IHtcbiAgICAgICAgY29tcG9uZW50Lm9uPy4oZXZlbnQsIGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXJcbiAgICAgICAqIEBwYXJhbSBldmVudCAtIEV2ZW50IG5hbWVcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICovXG4gICAgICBvZmYoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pOiBGb3JtQ29tcG9uZW50IHtcbiAgICAgICAgY29tcG9uZW50Lm9mZj8uKGV2ZW50LCBoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRW1pdCBhbiBldmVudFxuICAgICAgICogQHBhcmFtIGV2ZW50IC0gRXZlbnQgbmFtZVxuICAgICAgICogQHBhcmFtIGRhdGEgLSBFdmVudCBkYXRhXG4gICAgICAgKi9cbiAgICAgIGVtaXQoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihldmVudCwgZGF0YSk7XG4gICAgICB9LFxuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vIExpZmVjeWNsZSBBUElcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgICAvKipcbiAgICAgICAqIERlc3Ryb3kgdGhlIGZvcm0gYW5kIGNsZWFuIHVwIHJlc291cmNlc1xuICAgICAgICovXG4gICAgICBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICAvLyBDbGVhciBhbGwgZmllbGQgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIGZvciAoY29uc3QgWywgZmllbGRdIG9mIGNvbXBvbmVudC5maWVsZHMpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGZpZWxkLmRlc3Ryb3kgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgZmllbGQuZGVzdHJveSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsZWFyIGNvbnRyb2wgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIGZvciAoY29uc3QgWywgY29udHJvbF0gb2YgY29tcG9uZW50LmNvbnRyb2xzKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjb250cm9sLmRlc3Ryb3kgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgY29udHJvbC5kZXN0cm95KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FsbCBsaWZlY3ljbGUgZGVzdHJveSBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKGNvbXBvbmVudC5saWZlY3ljbGU/LmRlc3Ryb3kpIHtcbiAgICAgICAgICBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSBmb3JtIGVsZW1lbnQgZnJvbSBET01cbiAgICAgICAgaWYgKGNvbXBvbmVudC5lbGVtZW50Py5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgY29tcG9uZW50LmVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjb21wb25lbnQuZWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IGRlc3Ryb3kgZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5SRVNFVCk7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBXaXJlIHVwIGNvbnRyb2wgYnV0dG9uIGNsaWNrIGhhbmRsZXJzXG4gICAgd2lyZUNvbnRyb2xCdXR0b25zKGNvbXBvbmVudC5jb250cm9scywgYXBpLCBjb25maWcpO1xuXG4gICAgcmV0dXJuIGFwaTtcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhBUEk7XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQk8sU0FBUyxXQUFXLENBQ3pCLElBQ0EsSUFDQSxJQUNBLElBQ1E7QUFBQSxFQUNSLE9BQU8sS0FBSyxLQUFLLEtBQUssSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO0FBQUE7QUFZdkQsU0FBUyxRQUFRLENBQ3RCLElBQ0EsSUFDQSxJQUNBLElBQ1E7QUFBQSxFQUNSLE1BQU0sUUFBUyxLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUssRUFBRSxJQUFJLE1BQU8sS0FBSztBQUFBLEVBQzFELE9BQU8sUUFBUSxJQUFJLFFBQVEsTUFBTTtBQUFBO0FBVzVCLFNBQVMsa0JBQWtCLENBQ2hDLE1BQ0EsZUFDQSxPQUNjO0FBQUEsRUFDZCxNQUFNLFVBQVUsS0FBSyxJQUFJO0FBQUEsRUFDekIsSUFBSSxtQkFBbUI7QUFBQSxFQUV2QixNQUFNLFFBQXNCO0FBQUEsSUFDMUI7QUFBQSxJQUNBO0FBQUEsSUFDQSxRQUNHLE1BQU0sVUFBMkIsY0FBYztBQUFBLElBQ2xELFdBQVcsTUFBTTtBQUFBLElBQ2pCO0FBQUEsSUFDQSxVQUFVLFVBQVUsTUFBTTtBQUFBLElBQzFCO0FBQUEsSUFDQSxnQkFBZ0IsTUFBTTtBQUFBLE1BQ3BCLG1CQUFtQjtBQUFBLE1BQ25CLE1BQU0sbUJBQW1CO0FBQUEsTUFDekIsSUFBSSxjQUFjLFlBQVk7QUFBQSxRQUM1QixjQUFjLGVBQWU7QUFBQSxNQUMvQjtBQUFBO0FBQUEsSUFFRixpQkFBaUIsTUFBTTtBQUFBLE1BQ3JCLGNBQWMsZ0JBQWdCO0FBQUE7QUFBQSxFQUVsQztBQUFBLEVBRUEsT0FBTztBQUFBO0FBUUYsU0FBUyxlQUFlLEdBQVk7QUFBQSxFQUN6QyxNQUFN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bUJBQW1CLFdBQVUsVUFBVSxLQUFLLE1BQU07QUFBQSxJQUVsRCxPQUFPO0FBQUE7QUFBQTs7QVJsU0osSUFBTSxhQUFhLENBQUMsU0FBcUIsQ0FBQyxNQUFxQjtBQUFBLEVBQ3BFLElBQUk7QUFBQSxJQUVGLE1BQU0sYUFBYSxpQkFBaUIsTUFBTTtBQUFBLElBSTFDLE1BQU0sYUFBWSxtQkFFaEIsMEJBR0EseUJBQVcsR0FHWCwwQkFBWSxpQkFBaUIsVUFBVSxDQUFDLEdBR3hDLFdBQVcsVUFBVSxHQUdyQixXQUFXLFVBQVUsR0FHckIsU0FBUyxVQUFVLEdBR25CLGVBQWUsVUFBVSxHQUd6QixXQUFXLFVBQVUsR0FHckIsNEJBQWMsR0FHZCxTQUFRLFVBQVUsQ0FDcEIsRUFBRSxVQUFVO0FBQUEsSUFHWixJQUFJLE9BQU8sYUFBYSxXQUFVLFNBQVM7QUFBQSxNQUN6QyxPQUFPLFVBQVUsWUFBWSxXQUFVLE9BQU87QUFBQSxJQUNoRDtBQUFBLElBRUEsT0FBTztBQUFBLElBQ1AsT0FBTyxPQUFPO0FBQUEsSUFDZCxRQUFRLE1BQU0sd0JBQXdCLEtBQUs7QUFBQSxJQUMzQyxNQUFNLElBQUksTUFBTSwwQkFBMkIsTUFBZ0IsU0FBUztBQUFBO0FBQUE7IiwKICAiZGVidWdJZCI6ICJCMUQyNDcwMzY0QzVFOUI2NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|
|
6402
|
+
//# debugId=8A550A3B6A45CC5164756E2164756E21
|
|
6403
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvdXRpbHMudHMiLCAiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvdGFwLnRzIiwgIi4uL3NyYy9jb3JlL2dlc3R1cmVzL3N3aXBlLnRzIiwgIi4uL3NyYy9jb3JlL2dlc3R1cmVzL2xvbmdwcmVzcy50cyIsICIuLi9zcmMvY29yZS9nZXN0dXJlcy9wYW4udHMiLCAiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvcGluY2gudHMiLCAiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvcm90YXRlLnRzIiwgIi4uL3NyYy9jb3JlL2dlc3R1cmVzL21hbmFnZXIudHMiLCAiLi4vc3JjL2NvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlcy9pbmRleC50cyIsICIuLi9zcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3RhcC50cyIsICIuLi9zcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3N3aXBlLnRzIiwgIi4uL3NyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMvbG9uZ3ByZXNzLnRzIiwgIi4uL3NyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMvcGFuLnRzIiwgIi4uL3NyYy9jb3JlL2xheW91dC9zY2hlbWEudHMiLCAiLi4vc3JjL2NvcmUvbGF5b3V0L2NvbmZpZy50cyIsICIuLi9zcmMvY29yZS9sYXlvdXQvanN4LnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L3ZpZXdwb3J0LnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3V0aWxzLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL2Jhc2UudHMiLCAiLi4vc3JjL2NvcmUvdmlld3BvcnQvY29uc3RhbnRzLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3ZpcnR1YWwudHMiLCAiLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvc2Nyb2xsaW5nLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL21vbWVudHVtLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3Njcm9sbGJhci50cyIsICIuLi9zcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9jb2xsZWN0aW9uLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3BsYWNlaG9sZGVycy50cyIsICIuLi9zcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9yZW5kZXJpbmcudHMiLCAiLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvZXZlbnRzLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L3ZsaXN0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL3ZpZXdwb3J0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL2FwaS50cyIsICIuLi9zcmMvY29tcG9uZW50cy92bGlzdC9jb25zdGFudHMudHMiLCAiLi4vc3JjL2NvbXBvbmVudHMvdmxpc3QvZmVhdHVyZXMvc2VsZWN0aW9uLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vZm9ybS50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2xheW91dC50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2NvbnN0YW50cy50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2NvbmZpZy50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2ZpZWxkcy50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2RhdGEudHMiLCAiLi4vc3JjL2NvbXBvbmVudHMvZm9ybS9mZWF0dXJlcy9jb250cm9sbGVyLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vZmVhdHVyZXMvc3VibWl0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vZmVhdHVyZXMvYXBpLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIi8vIHNyYy9jb3JlL2dlc3R1cmVzL3V0aWxzLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBnZXN0dXJlIGRldGVjdGlvblxuICovXG5cbmltcG9ydCB7IEdlc3R1cmVFdmVudCwgR2VzdHVyZVN0YXRlIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBDYWxjdWxhdGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzXG4gKlxuICogQHBhcmFtIHgxIC0gWCBjb29yZGluYXRlIG9mIGZpcnN0IHBvaW50XG4gKiBAcGFyYW0geTEgLSBZIGNvb3JkaW5hdGUgb2YgZmlyc3QgcG9pbnRcbiAqIEBwYXJhbSB4MiAtIFggY29vcmRpbmF0ZSBvZiBzZWNvbmQgcG9pbnRcbiAqIEBwYXJhbSB5MiAtIFkgY29vcmRpbmF0ZSBvZiBzZWNvbmQgcG9pbnRcbiAqIEByZXR1cm5zIERpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGlzdGFuY2UoXG4gIHgxOiBudW1iZXIsXG4gIHkxOiBudW1iZXIsXG4gIHgyOiBudW1iZXIsXG4gIHkyOiBudW1iZXJcbik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3coeDIgLSB4MSwgMikgKyBNYXRoLnBvdyh5MiAtIHkxLCAyKSk7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIGFuZ2xlIGJldHdlZW4gdHdvIHBvaW50cyBpbiBkZWdyZWVzICgwLTM2MClcbiAqXG4gKiBAcGFyYW0geDEgLSBYIGNvb3JkaW5hdGUgb2YgZmlyc3QgcG9pbnRcbiAqIEBwYXJhbSB5MSAtIFkgY29vcmRpbmF0ZSBvZiBmaXJzdCBwb2ludFxuICogQHBhcmFtIHgyIC0gWCBjb29yZGluYXRlIG9mIHNlY29uZCBwb2ludFxuICogQHBhcmFtIHkyIC0gWSBjb29yZGluYXRlIG9mIHNlY29uZCBwb2ludFxuICogQHJldHVybnMgQW5nbGUgaW4gZGVncmVlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QW5nbGUoXG4gIHgxOiBudW1iZXIsXG4gIHkxOiBudW1iZXIsXG4gIHgyOiBudW1iZXIsXG4gIHkyOiBudW1iZXJcbik6IG51bWJlciB7XG4gIGNvbnN0IGFuZ2xlID0gKE1hdGguYXRhbjIoeTIgLSB5MSwgeDIgLSB4MSkgKiAxODApIC8gTWF0aC5QSTtcbiAgcmV0dXJuIGFuZ2xlIDwgMCA/IGFuZ2xlICsgMzYwIDogYW5nbGU7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgYmFzZSBnZXN0dXJlIGV2ZW50XG4gKlxuICogQHBhcmFtIHR5cGUgLSBUeXBlIG9mIGdlc3R1cmVcbiAqIEBwYXJhbSBvcmlnaW5hbEV2ZW50IC0gT3JpZ2luYWwgRE9NIGV2ZW50XG4gKiBAcGFyYW0gc3RhdGUgLSBDdXJyZW50IGdlc3R1cmUgc3RhdGVcbiAqIEByZXR1cm5zIEJhc2UgZ2VzdHVyZSBldmVudCBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUdlc3R1cmVFdmVudChcbiAgdHlwZTogc3RyaW5nLFxuICBvcmlnaW5hbEV2ZW50OiBFdmVudCxcbiAgc3RhdGU6IEdlc3R1cmVTdGF0ZVxuKTogR2VzdHVyZUV2ZW50IHtcbiAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gIGxldCBkZWZhdWx0UHJldmVudGVkID0gZmFsc2U7XG5cbiAgY29uc3QgZXZlbnQ6IEdlc3R1cmVFdmVudCA9IHtcbiAgICB0eXBlLFxuICAgIG9yaWdpbmFsRXZlbnQsXG4gICAgdGFyZ2V0OlxuICAgICAgKHN0YXRlLnRhcmdldCBhcyBFdmVudFRhcmdldCkgfHwgKG9yaWdpbmFsRXZlbnQudGFyZ2V0IGFzIEV2ZW50VGFyZ2V0KSxcbiAgICBzdGFydFRpbWU6IHN0YXRlLnN0YXJ0VGltZSxcbiAgICBlbmRUaW1lLFxuICAgIGR1cmF0aW9uOiBlbmRUaW1lIC0gc3RhdGUuc3RhcnRUaW1lLFxuICAgIGRlZmF1bHRQcmV2ZW50ZWQsXG4gICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHtcbiAgICAgIGRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgICBpZiAob3JpZ2luYWxFdmVudC5jYW5jZWxhYmxlKSB7XG4gICAgICAgIG9yaWdpbmFsRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHN0b3BQcm9wYWdhdGlvbjogKCkgPT4ge1xuICAgICAgb3JpZ2luYWxFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBldmVudDtcbn1cblxuLyoqXG4gKiBEZXRlY3QgaWYgdGhlIGRldmljZSBzdXBwb3J0cyB0b3VjaCBldmVudHNcbiAqXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRvdWNoIGlzIHN1cHBvcnRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzVG91Y2hTdXBwb3J0KCk6IGJvb2xlYW4ge1xuICBjb25zdCBtYXhQb2ludHMgPSAobmF2aWdhdG9yIGFzIGFueSkubWF4VG91Y2hQb2ludHM7XG4gIHJldHVybiAoXG4gICAgXCJvbnRvdWNoc3RhcnRcIiBpbiB3aW5kb3cgfHwgKHR5cGVvZiBtYXhQb2ludHMgPT09IFwibnVtYmVyXCIgJiYgbWF4UG9pbnRzID4gMClcbiAgKTtcbn1cblxuLyoqXG4gKiBEZXRlY3QgaWYgdGhlIGRldmljZSBzdXBwb3J0cyBwb2ludGVyIGV2ZW50c1xuICpcbiAqIEByZXR1cm5zIFdoZXRoZXIgcG9pbnRlciBldmVudHMgYXJlIHN1cHBvcnRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzUG9pbnRlclN1cHBvcnQoKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIXdpbmRvdy5Qb2ludGVyRXZlbnQ7XG59XG5cbi8qKlxuICogRXh0cmFjdCBub3JtYWxpemVkIHRvdWNoIGNvb3JkaW5hdGVzIGZyb20gYW4gZXZlbnRcbiAqIFdvcmtzIHdpdGggbW91c2UgZXZlbnRzLCB0b3VjaCBldmVudHMgYW5kIHBvaW50ZXIgZXZlbnRzXG4gKlxuICogQHBhcmFtIGUgLSBET00gZXZlbnRcbiAqIEByZXR1cm5zIE9iamVjdCB3aXRoIGNsaWVudFggYW5kIGNsaWVudFkgY29vcmRpbmF0ZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRvdWNoQ29vcmRpbmF0ZXMoXG4gIGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50IHwgUG9pbnRlckV2ZW50XG4pOiB7IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH0ge1xuICBpZiAoXCJ0b3VjaGVzXCIgaW4gZSAmJiBBcnJheS5pc0FycmF5KGUudG91Y2hlcykgJiYgZS50b3VjaGVzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2xpZW50WDogZS50b3VjaGVzWzBdLmNsaWVudFgsXG4gICAgICBjbGllbnRZOiBlLnRvdWNoZXNbMF0uY2xpZW50WSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjbGllbnRYOiAoZSBhcyBNb3VzZUV2ZW50IHwgUG9pbnRlckV2ZW50KS5jbGllbnRYLFxuICAgIGNsaWVudFk6IChlIGFzIE1vdXNlRXZlbnQgfCBQb2ludGVyRXZlbnQpLmNsaWVudFksXG4gIH07XG59XG4iLAogICAgIi8vIHNyYy9jb3JlL2dlc3R1cmVzL3RhcC50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBUYXAgZ2VzdHVyZSBkZXRlY3Rpb25cbiAqL1xuXG5pbXBvcnQgeyBUYXBFdmVudCwgR2VzdHVyZURldGVjdGlvbkNvbnRleHQgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZUdlc3R1cmVFdmVudCB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIERldGVjdCB0YXAgZ2VzdHVyZVxuICogXG4gKiBAcGFyYW0gY29udGV4dCAtIEdlc3R1cmUgZGV0ZWN0aW9uIGNvbnRleHRcbiAqIEByZXR1cm5zIFRhcCBldmVudCBvciBudWxsIGlmIG5vIHRhcCBkZXRlY3RlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0VGFwKGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0KTogVGFwRXZlbnQgfCBudWxsIHtcbiAgY29uc3QgeyBzdGF0ZSwgb3B0aW9ucywgb3JpZ2luYWxFdmVudCB9ID0gY29udGV4dDtcbiAgXG4gIC8vIENhbGN1bGF0ZSBkaXN0YW5jZSBiZXR3ZWVuIHN0YXJ0IGFuZCBjdXJyZW50IHBvc2l0aW9uXG4gIGNvbnN0IGRlbHRhWCA9IHN0YXRlLmN1cnJlbnRYIC0gc3RhdGUuc3RhcnRYO1xuICBjb25zdCBkZWx0YVkgPSBzdGF0ZS5jdXJyZW50WSAtIHN0YXRlLnN0YXJ0WTtcbiAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcbiAgXG4gIC8vIENoZWNrIGlmIG1vdmVtZW50IGlzIHdpdGhpbiB0aHJlc2hvbGRcbiAgaWYgKGRpc3RhbmNlIDwgb3B0aW9ucy50YXBEaXN0YW5jZVRocmVzaG9sZCkge1xuICAgIC8vIENoZWNrIGZvciBkb3VibGUgdGFwXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBpc0RvdWJsZVRhcCA9IG5vdyAtIHN0YXRlLmxhc3RUYXBUaW1lIDwgMzAwO1xuICAgIFxuICAgIGNvbnN0IHRhcENvdW50ID0gaXNEb3VibGVUYXAgPyBzdGF0ZS50YXBDb3VudCArIDEgOiAxO1xuICAgIFxuICAgIC8vIENyZWF0ZSB0YXAgZXZlbnRcbiAgICBjb25zdCB0YXBFdmVudDogVGFwRXZlbnQgPSB7XG4gICAgICAuLi5jcmVhdGVHZXN0dXJlRXZlbnQoJ3RhcCcsIG9yaWdpbmFsRXZlbnQsIHN0YXRlKSxcbiAgICAgIHR5cGU6ICd0YXAnLFxuICAgICAgY291bnQ6IHRhcENvdW50LFxuICAgICAgeDogc3RhdGUuY3VycmVudFgsXG4gICAgICB5OiBzdGF0ZS5jdXJyZW50WVxuICAgIH07XG4gICAgXG4gICAgcmV0dXJuIHRhcEV2ZW50O1xuICB9XG4gIFxuICByZXR1cm4gbnVsbDtcbn0iLAogICAgIi8vIHNyYy9jb3JlL2dlc3R1cmVzL3N3aXBlLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIFN3aXBlIGdlc3R1cmUgZGV0ZWN0aW9uXG4gKi9cblxuaW1wb3J0IHsgU3dpcGVFdmVudCwgR2VzdHVyZURldGVjdGlvbkNvbnRleHQsIFNXSVBFX0RJUkVDVElPTlMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZUdlc3R1cmVFdmVudCB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIERldGVybWluZSBzd2lwZSBkaXJlY3Rpb24gYmFzZWQgb24gZGVsdGEgWCBhbmQgWVxuICogXG4gKiBAcGFyYW0gZGVsdGFYIC0gRGlzdGFuY2UgbW92ZWQgaW4gWCBkaXJlY3Rpb25cbiAqIEBwYXJhbSBkZWx0YVkgLSBEaXN0YW5jZSBtb3ZlZCBpbiBZIGRpcmVjdGlvblxuICogQHJldHVybnMgRGlyZWN0aW9uIG9mIHRoZSBzd2lwZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3dpcGVEaXJlY3Rpb24oZGVsdGFYOiBudW1iZXIsIGRlbHRhWTogbnVtYmVyKTogU1dJUEVfRElSRUNUSU9OUyB7XG4gIGlmIChNYXRoLmFicyhkZWx0YVgpID4gTWF0aC5hYnMoZGVsdGFZKSkge1xuICAgIHJldHVybiBkZWx0YVggPiAwID8gU1dJUEVfRElSRUNUSU9OUy5SSUdIVCA6IFNXSVBFX0RJUkVDVElPTlMuTEVGVDtcbiAgfVxuICByZXR1cm4gZGVsdGFZID4gMCA/IFNXSVBFX0RJUkVDVElPTlMuRE9XTiA6IFNXSVBFX0RJUkVDVElPTlMuVVA7XG59XG5cbi8qKlxuICogRGV0ZWN0IHN3aXBlIGdlc3R1cmVcbiAqIFxuICogQHBhcmFtIGNvbnRleHQgLSBHZXN0dXJlIGRldGVjdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBTd2lwZSBldmVudCBvciBudWxsIGlmIG5vIHN3aXBlIGRldGVjdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RTd2lwZShjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCk6IFN3aXBlRXZlbnQgfCBudWxsIHtcbiAgY29uc3QgeyBzdGF0ZSwgb3B0aW9ucywgb3JpZ2luYWxFdmVudCB9ID0gY29udGV4dDtcbiAgXG4gIC8vIENhbGN1bGF0ZSBkZWx0YXMgYW5kIGRpc3RhbmNlXG4gIGNvbnN0IGRlbHRhWCA9IHN0YXRlLmN1cnJlbnRYIC0gc3RhdGUuc3RhcnRYO1xuICBjb25zdCBkZWx0YVkgPSBzdGF0ZS5jdXJyZW50WSAtIHN0YXRlLnN0YXJ0WTtcbiAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcbiAgXG4gIC8vIENhbGN1bGF0ZSB0aW1lIGFuZCB2ZWxvY2l0eVxuICBjb25zdCBlbmRUaW1lID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgZGVsdGFUaW1lID0gZW5kVGltZSAtIHN0YXRlLnN0YXJ0VGltZTtcbiAgY29uc3QgdmVsb2NpdHkgPSBkaXN0YW5jZSAvIGRlbHRhVGltZTtcbiAgXG4gIC8vIENoZWNrIGlmIGl0J3MgYSBzd2lwZVxuICBpZiAoZGlzdGFuY2UgPj0gb3B0aW9ucy5zd2lwZVRocmVzaG9sZCAmJiBkZWx0YVRpbWUgPD0gb3B0aW9ucy5zd2lwZVRpbWVUaHJlc2hvbGQpIHtcbiAgICBjb25zdCBkaXJlY3Rpb24gPSBnZXRTd2lwZURpcmVjdGlvbihkZWx0YVgsIGRlbHRhWSk7XG4gICAgXG4gICAgLy8gQ3JlYXRlIHN3aXBlIGV2ZW50XG4gICAgY29uc3Qgc3dpcGVFdmVudDogU3dpcGVFdmVudCA9IHtcbiAgICAgIC4uLmNyZWF0ZUdlc3R1cmVFdmVudCgnc3dpcGUnLCBvcmlnaW5hbEV2ZW50LCBzdGF0ZSksXG4gICAgICB0eXBlOiAnc3dpcGUnLFxuICAgICAgZGlyZWN0aW9uLFxuICAgICAgZGVsdGFYLFxuICAgICAgZGVsdGFZLFxuICAgICAgZGlzdGFuY2UsXG4gICAgICB2ZWxvY2l0eSxcbiAgICAgIHN0YXJ0WDogc3RhdGUuc3RhcnRYLFxuICAgICAgc3RhcnRZOiBzdGF0ZS5zdGFydFksXG4gICAgICBlbmRYOiBzdGF0ZS5jdXJyZW50WCxcbiAgICAgIGVuZFk6IHN0YXRlLmN1cnJlbnRZXG4gICAgfTtcbiAgICBcbiAgICByZXR1cm4gc3dpcGVFdmVudDtcbiAgfVxuICBcbiAgcmV0dXJuIG51bGw7XG59IiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy9sb25ncHJlc3MudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2dlc3R1cmVzXG4gKiBAZGVzY3JpcHRpb24gTG9uZyBwcmVzcyBnZXN0dXJlIGRldGVjdGlvblxuICovXG5cbmltcG9ydCB7IExvbmdQcmVzc0V2ZW50LCBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlR2VzdHVyZUV2ZW50IH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogRGV0ZWN0IGxvbmcgcHJlc3MgZ2VzdHVyZVxuICogXG4gKiBUaGlzIGlzIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIG90aGVyIGdlc3R1cmUgZGV0ZWN0b3JzIGFzIGl0IHNldHMgdXAgYSB0aW1lclxuICogYW5kIHJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIHRpbWVyIGNvbXBsZXRlcy5cbiAqIFxuICogQHBhcmFtIGNvbnRleHQgLSBHZXN0dXJlIGRldGVjdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gbG9uZyBwcmVzcyBpcyBkZXRlY3RlZFxuICogQHJldHVybnMgQ2xlYW51cCBmdW5jdGlvbiB0byBjYW5jZWwgdGhlIGxvbmcgcHJlc3MgZGV0ZWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RMb25nUHJlc3MoXG4gIGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0LFxuICBjYWxsYmFjazogKGV2ZW50OiBMb25nUHJlc3NFdmVudCkgPT4gdm9pZFxuKTogKCkgPT4gdm9pZCB7XG4gIGNvbnN0IHsgc3RhdGUsIG9wdGlvbnMsIG9yaWdpbmFsRXZlbnQgfSA9IGNvbnRleHQ7XG4gIFxuICAvLyBTZXQgYSB0aW1lciBmb3IgbG9uZyBwcmVzcyBkZXRlY3Rpb25cbiAgY29uc3QgdGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgLy8gT25seSB0cmlnZ2VyIGlmIGdlc3R1cmUgaXMgc3RpbGwgYWN0aXZlXG4gICAgaWYgKHN0YXRlLmFjdGl2ZSkge1xuICAgICAgLy8gQ2hlY2sgaWYgbW92ZW1lbnQgaXMgd2l0aGluIHRocmVzaG9sZFxuICAgICAgY29uc3QgZGlmZlggPSBNYXRoLmFicyhzdGF0ZS5jdXJyZW50WCAtIHN0YXRlLnN0YXJ0WCk7XG4gICAgICBjb25zdCBkaWZmWSA9IE1hdGguYWJzKHN0YXRlLmN1cnJlbnRZIC0gc3RhdGUuc3RhcnRZKTtcbiAgICAgIFxuICAgICAgaWYgKGRpZmZYIDwgb3B0aW9ucy50YXBEaXN0YW5jZVRocmVzaG9sZCAmJiBkaWZmWSA8IG9wdGlvbnMudGFwRGlzdGFuY2VUaHJlc2hvbGQpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGxvbmcgcHJlc3MgZXZlbnRcbiAgICAgICAgY29uc3QgbG9uZ1ByZXNzRXZlbnQ6IExvbmdQcmVzc0V2ZW50ID0ge1xuICAgICAgICAgIC4uLmNyZWF0ZUdlc3R1cmVFdmVudCgnbG9uZ3ByZXNzJywgb3JpZ2luYWxFdmVudCwgc3RhdGUpLFxuICAgICAgICAgIHR5cGU6ICdsb25ncHJlc3MnLFxuICAgICAgICAgIHg6IHN0YXRlLmN1cnJlbnRYLFxuICAgICAgICAgIHk6IHN0YXRlLmN1cnJlbnRZXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICAvLyBUcmlnZ2VyIGNhbGxiYWNrXG4gICAgICAgIGNhbGxiYWNrKGxvbmdQcmVzc0V2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIG9wdGlvbnMubG9uZ1ByZXNzVGltZSk7XG4gIFxuICAvLyBSZXR1cm4gY2xlYW51cCBmdW5jdGlvblxuICByZXR1cm4gKCkgPT4ge1xuICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gIH07XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgbW92ZW1lbnQgd291bGQgY2FuY2VsIGEgbG9uZyBwcmVzc1xuICogXG4gKiBAcGFyYW0gY29udGV4dCAtIEdlc3R1cmUgZGV0ZWN0aW9uIGNvbnRleHRcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxvbmcgcHJlc3Mgc2hvdWxkIGJlIGNhbmNlbGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRDYW5jZWxMb25nUHJlc3MoY29udGV4dDogR2VzdHVyZURldGVjdGlvbkNvbnRleHQpOiBib29sZWFuIHtcbiAgY29uc3QgeyBzdGF0ZSwgb3B0aW9ucyB9ID0gY29udGV4dDtcbiAgXG4gIGNvbnN0IGRpZmZYID0gTWF0aC5hYnMoc3RhdGUuY3VycmVudFggLSBzdGF0ZS5zdGFydFgpO1xuICBjb25zdCBkaWZmWSA9IE1hdGguYWJzKHN0YXRlLmN1cnJlbnRZIC0gc3RhdGUuc3RhcnRZKTtcbiAgXG4gIHJldHVybiBkaWZmWCA+IG9wdGlvbnMudGFwRGlzdGFuY2VUaHJlc2hvbGQgfHwgZGlmZlkgPiBvcHRpb25zLnRhcERpc3RhbmNlVGhyZXNob2xkO1xufSIsCiAgICAiLy8gc3JjL2NvcmUvZ2VzdHVyZXMvcGFuLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIFBhbiBnZXN0dXJlIGRldGVjdGlvblxuICovXG5cbmltcG9ydCB7IFBhbkV2ZW50LCBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBjcmVhdGVHZXN0dXJlRXZlbnQgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIERldGVjdCBwYW4gZ2VzdHVyZVxuICpcbiAqIEBwYXJhbSBjb250ZXh0IC0gR2VzdHVyZSBkZXRlY3Rpb24gY29udGV4dFxuICogQHJldHVybnMgUGFuIGV2ZW50IG9yIG51bGwgaWYgbm8gc2lnbmlmaWNhbnQgbW92ZW1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdFBhbihjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCk6IFBhbkV2ZW50IHwgbnVsbCB7XG4gIGNvbnN0IHsgc3RhdGUsIG9yaWdpbmFsRXZlbnQgfSA9IGNvbnRleHQ7XG5cbiAgLy8gQ2FsY3VsYXRlIGRlbHRhIGZyb20gc3RhcnQgcG9zaXRpb25cbiAgY29uc3QgZGVsdGFYID0gc3RhdGUuY3VycmVudFggLSBzdGF0ZS5zdGFydFg7XG4gIGNvbnN0IGRlbHRhWSA9IHN0YXRlLmN1cnJlbnRZIC0gc3RhdGUuc3RhcnRZO1xuXG4gIC8vIENhbGN1bGF0ZSBkZWx0YSBmcm9tIGxhc3QgcG9zaXRpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZXJlJ3Mgc2lnbmlmaWNhbnQgbW92ZW1lbnRcbiAgY29uc3QgbW92ZURlbHRhWCA9IHN0YXRlLmN1cnJlbnRYIC0gc3RhdGUubGFzdFg7XG4gIGNvbnN0IG1vdmVEZWx0YVkgPSBzdGF0ZS5jdXJyZW50WSAtIHN0YXRlLmxhc3RZO1xuICBjb25zdCBtb3ZlRGVsdGEgPSBNYXRoLnNxcnQoXG4gICAgbW92ZURlbHRhWCAqIG1vdmVEZWx0YVggKyBtb3ZlRGVsdGFZICogbW92ZURlbHRhWVxuICApO1xuXG4gIC8vIENoZWNrIGlmIG1vdmVtZW50IGlzIHNpZ25pZmljYW50XG4gIGlmIChtb3ZlRGVsdGEgPiAwKSB7XG4gICAgLy8gQ3JlYXRlIHBhbiBldmVudFxuICAgIGNvbnN0IHBhbkV2ZW50OiBQYW5FdmVudCA9IHtcbiAgICAgIC4uLmNyZWF0ZUdlc3R1cmVFdmVudChcInBhblwiLCBvcmlnaW5hbEV2ZW50LCBzdGF0ZSksXG4gICAgICB0eXBlOiBcInBhblwiLFxuICAgICAgZGVsdGFYLFxuICAgICAgZGVsdGFZLFxuICAgICAgc3RhcnRYOiBzdGF0ZS5zdGFydFgsXG4gICAgICBzdGFydFk6IHN0YXRlLnN0YXJ0WSxcbiAgICAgIGN1cnJlbnRYOiBzdGF0ZS5jdXJyZW50WCxcbiAgICAgIGN1cnJlbnRZOiBzdGF0ZS5jdXJyZW50WSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHBhbkV2ZW50O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLAogICAgIi8vIHNyYy9jb3JlL2dlc3R1cmVzL3BpbmNoLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIFBpbmNoIGdlc3R1cmUgZGV0ZWN0aW9uXG4gKi9cblxuaW1wb3J0IHsgUGluY2hFdmVudCwgR2VzdHVyZURldGVjdGlvbkNvbnRleHQgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlR2VzdHVyZUV2ZW50LCBnZXREaXN0YW5jZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogRGV0ZWN0IHBpbmNoIGdlc3R1cmVcbiAqXG4gKiBAcGFyYW0gY29udGV4dCAtIEdlc3R1cmUgZGV0ZWN0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSB0b3VjaDEgLSBGaXJzdCB0b3VjaCBwb2ludFxuICogQHBhcmFtIHRvdWNoMiAtIFNlY29uZCB0b3VjaCBwb2ludFxuICogQHJldHVybnMgUGluY2ggZXZlbnQgb3IgbnVsbCBpZiBubyBwaW5jaCBkZXRlY3RlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0UGluY2goXG4gIGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0LFxuICB0b3VjaDE6IFRvdWNoLFxuICB0b3VjaDI6IFRvdWNoXG4pOiBQaW5jaEV2ZW50IHwgbnVsbCB7XG4gIGNvbnN0IHsgc3RhdGUsIG9yaWdpbmFsRXZlbnQgfSA9IGNvbnRleHQ7XG5cbiAgLy8gQ2FsY3VsYXRlIGN1cnJlbnQgZGlzdGFuY2UgYmV0d2VlbiB0b3VjaCBwb2ludHNcbiAgY29uc3QgY3VycmVudERpc3RhbmNlID0gZ2V0RGlzdGFuY2UoXG4gICAgdG91Y2gxLmNsaWVudFgsXG4gICAgdG91Y2gxLmNsaWVudFksXG4gICAgdG91Y2gyLmNsaWVudFgsXG4gICAgdG91Y2gyLmNsaWVudFlcbiAgKTtcblxuICAvLyBNaW5pbXVtIG1vdmVtZW50IHRocmVzaG9sZCBmb3IgcGluY2ggZGV0ZWN0aW9uXG4gIGNvbnN0IFBJTkNIX1RIUkVTSE9MRCA9IDEwO1xuXG4gIC8vIENoZWNrIGlmIHRoZSBkaXN0YW5jZSBjaGFuZ2UgaXMgc2lnbmlmaWNhbnRcbiAgaWYgKE1hdGguYWJzKGN1cnJlbnREaXN0YW5jZSAtIHN0YXRlLnN0YXJ0RGlzdGFuY2UpID4gUElOQ0hfVEhSRVNIT0xEKSB7XG4gICAgLy8gQ2FsY3VsYXRlIHNjYWxlIGZhY3RvclxuICAgIGNvbnN0IHNjYWxlID0gY3VycmVudERpc3RhbmNlIC8gc3RhdGUuc3RhcnREaXN0YW5jZTtcblxuICAgIC8vIENhbGN1bGF0ZSBjZW50ZXIgcG9pbnRcbiAgICBjb25zdCBjZW50ZXJYID0gKHRvdWNoMS5jbGllbnRYICsgdG91Y2gyLmNsaWVudFgpIC8gMjtcbiAgICBjb25zdCBjZW50ZXJZID0gKHRvdWNoMS5jbGllbnRZICsgdG91Y2gyLmNsaWVudFkpIC8gMjtcblxuICAgIC8vIENyZWF0ZSBwaW5jaCBldmVudFxuICAgIGNvbnN0IHBpbmNoRXZlbnQ6IFBpbmNoRXZlbnQgPSB7XG4gICAgICAuLi5jcmVhdGVHZXN0dXJlRXZlbnQoXCJwaW5jaFwiLCBvcmlnaW5hbEV2ZW50LCBzdGF0ZSksXG4gICAgICB0eXBlOiBcInBpbmNoXCIsXG4gICAgICBzY2FsZSxcbiAgICAgIGNlbnRlclgsXG4gICAgICBjZW50ZXJZLFxuICAgIH07XG5cbiAgICByZXR1cm4gcGluY2hFdmVudDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy9yb3RhdGUudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2dlc3R1cmVzXG4gKiBAZGVzY3JpcHRpb24gUm90YXRlIGdlc3R1cmUgZGV0ZWN0aW9uXG4gKi9cblxuaW1wb3J0IHsgUm90YXRlRXZlbnQsIEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUdlc3R1cmVFdmVudCwgZ2V0QW5nbGUgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIERldGVjdCByb3RhdGUgZ2VzdHVyZVxuICpcbiAqIEBwYXJhbSBjb250ZXh0IC0gR2VzdHVyZSBkZXRlY3Rpb24gY29udGV4dFxuICogQHBhcmFtIHRvdWNoMSAtIEZpcnN0IHRvdWNoIHBvaW50XG4gKiBAcGFyYW0gdG91Y2gyIC0gU2Vjb25kIHRvdWNoIHBvaW50XG4gKiBAcmV0dXJucyBSb3RhdGUgZXZlbnQgb3IgbnVsbCBpZiBubyByb3RhdGlvbiBkZXRlY3RlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0Um90YXRlKFxuICBjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCxcbiAgdG91Y2gxOiBUb3VjaCxcbiAgdG91Y2gyOiBUb3VjaFxuKTogUm90YXRlRXZlbnQgfCBudWxsIHtcbiAgY29uc3QgeyBzdGF0ZSwgb3JpZ2luYWxFdmVudCB9ID0gY29udGV4dDtcblxuICAvLyBDYWxjdWxhdGUgY3VycmVudCBhbmdsZSBiZXR3ZWVuIHRvdWNoIHBvaW50c1xuICBjb25zdCBjdXJyZW50QW5nbGUgPSBnZXRBbmdsZShcbiAgICB0b3VjaDEuY2xpZW50WCxcbiAgICB0b3VjaDEuY2xpZW50WSxcbiAgICB0b3VjaDIuY2xpZW50WCxcbiAgICB0b3VjaDIuY2xpZW50WVxuICApO1xuXG4gIC8vIE1pbmltdW0gcm90YXRpb24gdGhyZXNob2xkIGZvciBkZXRlY3Rpb25cbiAgY29uc3QgUk9UQVRJT05fVEhSRVNIT0xEID0gMTA7XG5cbiAgLy8gQ2FsY3VsYXRlIHJvdGF0aW9uIGRpZmZlcmVuY2VcbiAgY29uc3Qgcm90YXRpb25EaWZmID0gY3VycmVudEFuZ2xlIC0gc3RhdGUuc3RhcnRBbmdsZTtcblxuICAvLyBDaGVjayBpZiByb3RhdGlvbiBpcyBzaWduaWZpY2FudFxuICBpZiAoTWF0aC5hYnMocm90YXRpb25EaWZmKSA+IFJPVEFUSU9OX1RIUkVTSE9MRCkge1xuICAgIC8vIENhbGN1bGF0ZSBjZW50ZXIgcG9pbnRcbiAgICBjb25zdCBjZW50ZXJYID0gKHRvdWNoMS5jbGllbnRYICsgdG91Y2gyLmNsaWVudFgpIC8gMjtcbiAgICBjb25zdCBjZW50ZXJZID0gKHRvdWNoMS5jbGllbnRZICsgdG91Y2gyLmNsaWVudFkpIC8gMjtcblxuICAgIC8vIENyZWF0ZSByb3RhdGUgZXZlbnRcbiAgICBjb25zdCByb3RhdGVFdmVudDogUm90YXRlRXZlbnQgPSB7XG4gICAgICAuLi5jcmVhdGVHZXN0dXJlRXZlbnQoXCJyb3RhdGVcIiwgb3JpZ2luYWxFdmVudCwgc3RhdGUpLFxuICAgICAgdHlwZTogXCJyb3RhdGVcIixcbiAgICAgIHJvdGF0aW9uOiByb3RhdGlvbkRpZmYsXG4gICAgICBjZW50ZXJYLFxuICAgICAgY2VudGVyWSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHJvdGF0ZUV2ZW50O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLAogICAgIi8vIHNyYy9jb3JlL2dlc3R1cmVzL21hbmFnZXIudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2dlc3R1cmVzXG4gKiBAZGVzY3JpcHRpb24gR2VzdHVyZSBtYW5hZ2VtZW50IHN5c3RlbSBmb3IgaGFuZGxpbmcgdG91Y2ggYW5kIG1vdXNlIGludGVyYWN0aW9uc1xuICovXG5cbmltcG9ydCB7IFxuICBHZXN0dXJlQ29uZmlnLFxuICBHZXN0dXJlTWFuYWdlcixcbiAgR2VzdHVyZVN0YXRlLFxuICBHZXN0dXJlSGFuZGxlcixcbiAgR2VzdHVyZURldGVjdGlvbkNvbnRleHQsXG4gIEFueUdlc3R1cmVFdmVudCxcbiAgR0VTVFVSRV9UWVBFUyxcbiAgU1dJUEVfRElSRUNUSU9OU1xufSBmcm9tICcuL3R5cGVzJztcblxuaW1wb3J0IHsgZGV0ZWN0VGFwIH0gZnJvbSAnLi90YXAnO1xuaW1wb3J0IHsgZGV0ZWN0U3dpcGUgfSBmcm9tICcuL3N3aXBlJztcbmltcG9ydCB7IGRldGVjdExvbmdQcmVzcywgc2hvdWxkQ2FuY2VsTG9uZ1ByZXNzIH0gZnJvbSAnLi9sb25ncHJlc3MnO1xuaW1wb3J0IHsgZGV0ZWN0UGFuIH0gZnJvbSAnLi9wYW4nO1xuaW1wb3J0IHsgZGV0ZWN0UGluY2ggfSBmcm9tICcuL3BpbmNoJztcbmltcG9ydCB7IGRldGVjdFJvdGF0ZSB9IGZyb20gJy4vcm90YXRlJztcbmltcG9ydCB7IGhhc1RvdWNoU3VwcG9ydCwgaGFzUG9pbnRlclN1cHBvcnQsIGdldFRvdWNoQ29vcmRpbmF0ZXMgfSBmcm9tICcuL3V0aWxzJztcblxuLy8gUmUtZXhwb3J0IHR5cGVzIGFuZCBjb25zdGFudHNcbmV4cG9ydCB7IEdFU1RVUkVfVFlQRVMsIFNXSVBFX0RJUkVDVElPTlMgfTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZ2VzdHVyZSBtYW5hZ2VyIGZvciBoYW5kbGluZyB0b3VjaCBhbmQgbW91c2UgaW50ZXJhY3Rpb25zXG4gKiBcbiAqIEBwYXJhbSBlbGVtZW50IC0gRE9NIGVsZW1lbnQgdG8gYXR0YWNoIGdlc3R1cmUgcmVjb2duaXRpb24gdG9cbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIEdlc3R1cmUgbWFuYWdlciBpbnN0YW5jZVxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlR2VzdHVyZU1hbmFnZXIgPSAoXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICBjb25maWc6IEdlc3R1cmVDb25maWcgPSB7fVxuKTogR2VzdHVyZU1hbmFnZXIgPT4ge1xuICAvLyBEZWZhdWx0IGNvbmZpZ3VyYXRpb25cbiAgY29uc3Qgb3B0aW9uczogUmVxdWlyZWQ8R2VzdHVyZUNvbmZpZz4gPSB7XG4gICAgc3dpcGVUaHJlc2hvbGQ6IDMwLFxuICAgIHN3aXBlVGltZVRocmVzaG9sZDogMzAwLFxuICAgIGxvbmdQcmVzc1RpbWU6IDUwMCxcbiAgICB0YXBEaXN0YW5jZVRocmVzaG9sZDogMTAsXG4gICAgcHJldmVudERlZmF1bHQ6IHRydWUsXG4gICAgc3RvcFByb3BhZ2F0aW9uOiBmYWxzZSxcbiAgICAuLi5jb25maWdcbiAgfTtcbiAgXG4gIC8vIEV2ZW50IGhhbmRsZXJzIHN0b3JhZ2VcbiAgY29uc3QgaGFuZGxlcnM6IE1hcDxzdHJpbmcsIFNldDxHZXN0dXJlSGFuZGxlcj4+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gR2VzdHVyZSBzdGF0ZVxuICBjb25zdCBzdGF0ZTogR2VzdHVyZVN0YXRlID0ge1xuICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgc3RhcnRUaW1lOiAwLFxuICAgIHN0YXJ0WDogMCxcbiAgICBzdGFydFk6IDAsXG4gICAgbGFzdFg6IDAsXG4gICAgbGFzdFk6IDAsXG4gICAgY3VycmVudFg6IDAsXG4gICAgY3VycmVudFk6IDAsXG4gICAgdG91Y2hDb3VudDogMCxcbiAgICBsb25nUHJlc3NUaW1lcjogbnVsbCxcbiAgICBzdGFydERpc3RhbmNlOiAwLFxuICAgIHN0YXJ0QW5nbGU6IDAsXG4gICAgbGFzdFRhcFRpbWU6IDAsXG4gICAgdGFwQ291bnQ6IDAsXG4gICAgdGFyZ2V0OiBudWxsXG4gIH07XG4gIFxuICAvLyBEZXRlY3QgZmVhdHVyZSBzdXBwb3J0XG4gIGNvbnN0IHN1cHBvcnRUb3VjaCA9IGhhc1RvdWNoU3VwcG9ydCgpO1xuICBjb25zdCBzdXBwb3J0UG9pbnRlciA9IGhhc1BvaW50ZXJTdXBwb3J0KCk7XG4gICAgXG4gIGNvbnN0IGdlc3R1cmVTdXBwb3J0ID0ge1xuICAgIHRhcDogdHJ1ZSxcbiAgICBzd2lwZTogdHJ1ZSxcbiAgICBzd2lwZWxlZnQ6IHRydWUsXG4gICAgc3dpcGVyaWdodDogdHJ1ZSxcbiAgICBzd2lwZXVwOiB0cnVlLFxuICAgIHN3aXBlZG93bjogdHJ1ZSxcbiAgICBsb25ncHJlc3M6IHRydWUsXG4gICAgcGFuOiB0cnVlLFxuICAgIHBpbmNoOiBzdXBwb3J0VG91Y2ggfHwgc3VwcG9ydFBvaW50ZXIsXG4gICAgcm90YXRlOiBzdXBwb3J0VG91Y2ggfHwgc3VwcG9ydFBvaW50ZXJcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBhIGdlc3R1cmUgZXZlbnRcbiAgICovXG4gIGNvbnN0IGRpc3BhdGNoR2VzdHVyZSA9IChldmVudDogQW55R2VzdHVyZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgLy8gR2V0IGhhbmRsZXJzIGZvciB0aGlzIGV2ZW50IHR5cGVcbiAgICBjb25zdCBldmVudEhhbmRsZXJzID0gaGFuZGxlcnMuZ2V0KGV2ZW50LnR5cGUpO1xuICAgIGlmICghZXZlbnRIYW5kbGVycykgcmV0dXJuO1xuICAgIFxuICAgIC8vIENhbGwgZWFjaCBoYW5kbGVyXG4gICAgZXZlbnRIYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGFuZGxlcihldmVudCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBpbiBnZXN0dXJlIGhhbmRsZXIgZm9yICR7ZXZlbnQudHlwZX06YCwgZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8vIEZvciBzd2lwZSwgYWxzbyBkaXNwYXRjaCBkaXJlY3Rpb24tc3BlY2lmaWMgZXZlbnRzXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdzd2lwZScgJiYgJ2RpcmVjdGlvbicgaW4gZXZlbnQpIHtcbiAgICAgIGNvbnN0IGRpcmVjdGlvbkV2ZW50ID0geyAuLi5ldmVudCwgdHlwZTogYHN3aXBlJHtldmVudC5kaXJlY3Rpb259YCBhcyBhbnkgfTtcbiAgICAgIGRpc3BhdGNoR2VzdHVyZShkaXJlY3Rpb25FdmVudCBhcyBhbnkpO1xuICAgIH1cbiAgICBcbiAgICAvLyBBcHBseSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHByZXZlbnREZWZhdWx0IGFuZCBzdG9wUHJvcGFnYXRpb25cbiAgICBpZiAob3B0aW9ucy5wcmV2ZW50RGVmYXVsdCAmJiAhZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKG9wdGlvbnMuc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gIH07XG4gIFxuICAvLyBSZWZlcmVuY2UgdG8gdGhlIGxvbmdwcmVzcyBjbGVhbnVwIGZ1bmN0aW9uXG4gIGxldCBsb25nUHJlc3NDbGVhbnVwOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgdG91Y2gvbW91c2Ugc3RhcnRcbiAgICovXG4gIGNvbnN0IGhhbmRsZVN0YXJ0ID0gKGU6IFRvdWNoRXZlbnQgfCBNb3VzZUV2ZW50IHwgUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgY29uc3QgdG91Y2ggPSBnZXRUb3VjaENvb3JkaW5hdGVzKGUpO1xuICAgIGNvbnN0IHRvdWNoQ291bnQgPSAndG91Y2hlcycgaW4gZSA/IGUudG91Y2hlcy5sZW5ndGggOiAxO1xuICAgIFxuICAgIC8vIFN0b3JlIGdlc3R1cmUgc3RhdGVcbiAgICBzdGF0ZS5hY3RpdmUgPSB0cnVlO1xuICAgIHN0YXRlLnN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgc3RhdGUuc3RhcnRYID0gc3RhdGUubGFzdFggPSBzdGF0ZS5jdXJyZW50WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgc3RhdGUuc3RhcnRZID0gc3RhdGUubGFzdFkgPSBzdGF0ZS5jdXJyZW50WSA9IHRvdWNoLmNsaWVudFk7XG4gICAgc3RhdGUudG91Y2hDb3VudCA9IHRvdWNoQ291bnQ7XG4gICAgc3RhdGUudGFyZ2V0ID0gZS50YXJnZXQ7XG4gICAgXG4gICAgLy8gSGFuZGxlIG11bHRpLXRvdWNoIGdlc3R1cmVzXG4gICAgaWYgKHRvdWNoQ291bnQgPT09IDIgJiYgJ3RvdWNoZXMnIGluIGUpIHtcbiAgICAgIGNvbnN0IHRvdWNoMSA9IGUudG91Y2hlc1swXTtcbiAgICAgIGNvbnN0IHRvdWNoMiA9IGUudG91Y2hlc1sxXTtcbiAgICAgIFxuICAgICAgLy8gU2V0IGluaXRpYWwgdmFsdWVzIGZvciBwaW5jaCBhbmQgcm90YXRlXG4gICAgICBzdGF0ZS5zdGFydERpc3RhbmNlID0gTWF0aC5zcXJ0KFxuICAgICAgICBNYXRoLnBvdyh0b3VjaDIuY2xpZW50WCAtIHRvdWNoMS5jbGllbnRYLCAyKSArIFxuICAgICAgICBNYXRoLnBvdyh0b3VjaDIuY2xpZW50WSAtIHRvdWNoMS5jbGllbnRZLCAyKVxuICAgICAgKTtcbiAgICAgIFxuICAgICAgc3RhdGUuc3RhcnRBbmdsZSA9IE1hdGguYXRhbjIoXG4gICAgICAgIHRvdWNoMi5jbGllbnRZIC0gdG91Y2gxLmNsaWVudFksXG4gICAgICAgIHRvdWNoMi5jbGllbnRYIC0gdG91Y2gxLmNsaWVudFhcbiAgICAgICkgKiAxODAgLyBNYXRoLlBJO1xuICAgICAgXG4gICAgICBpZiAoc3RhdGUuc3RhcnRBbmdsZSA8IDApIHN0YXRlLnN0YXJ0QW5nbGUgKz0gMzYwO1xuICAgIH1cbiAgICBcbiAgICAvLyBTZXR1cCBjb250ZXh0IGZvciBnZXN0dXJlIGRldGVjdGlvblxuICAgIGNvbnN0IGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0ID0ge1xuICAgICAgc3RhdGUsXG4gICAgICBvcHRpb25zLFxuICAgICAgb3JpZ2luYWxFdmVudDogZVxuICAgIH07XG4gICAgXG4gICAgLy8gU3RhcnQgbG9uZyBwcmVzcyBkZXRlY3Rpb25cbiAgICBpZiAobG9uZ1ByZXNzQ2xlYW51cCkge1xuICAgICAgbG9uZ1ByZXNzQ2xlYW51cCgpO1xuICAgIH1cbiAgICBcbiAgICBsb25nUHJlc3NDbGVhbnVwID0gZGV0ZWN0TG9uZ1ByZXNzKGNvbnRleHQsIChsb25nUHJlc3NFdmVudCkgPT4ge1xuICAgICAgZGlzcGF0Y2hHZXN0dXJlKGxvbmdQcmVzc0V2ZW50KTtcbiAgICB9KTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgbW92ZVxuICAgKi9cbiAgY29uc3QgaGFuZGxlTW92ZSA9IChlOiBUb3VjaEV2ZW50IHwgTW91c2VFdmVudCB8IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIGlmICghc3RhdGUuYWN0aXZlKSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgdG91Y2ggPSBnZXRUb3VjaENvb3JkaW5hdGVzKGUpO1xuICAgIGNvbnN0IHRvdWNoQ291bnQgPSAndG91Y2hlcycgaW4gZSA/IGUudG91Y2hlcy5sZW5ndGggOiAxO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBwb3NpdGlvbnNcbiAgICBzdGF0ZS5sYXN0WCA9IHN0YXRlLmN1cnJlbnRYO1xuICAgIHN0YXRlLmxhc3RZID0gc3RhdGUuY3VycmVudFk7XG4gICAgc3RhdGUuY3VycmVudFggPSB0b3VjaC5jbGllbnRYO1xuICAgIHN0YXRlLmN1cnJlbnRZID0gdG91Y2guY2xpZW50WTtcbiAgICBcbiAgICAvLyBTZXR1cCBjb250ZXh0IGZvciBnZXN0dXJlIGRldGVjdGlvblxuICAgIGNvbnN0IGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0ID0ge1xuICAgICAgc3RhdGUsXG4gICAgICBvcHRpb25zLFxuICAgICAgb3JpZ2luYWxFdmVudDogZVxuICAgIH07XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgd2Ugc2hvdWxkIGNhbmNlbCBsb25ncHJlc3NcbiAgICBpZiAoc2hvdWxkQ2FuY2VsTG9uZ1ByZXNzKGNvbnRleHQpICYmIGxvbmdQcmVzc0NsZWFudXApIHtcbiAgICAgIGxvbmdQcmVzc0NsZWFudXAoKTtcbiAgICAgIGxvbmdQcmVzc0NsZWFudXAgPSBudWxsO1xuICAgIH1cbiAgICBcbiAgICAvLyBEZXRlY3QgcGFuIGdlc3R1cmVcbiAgICBjb25zdCBwYW5FdmVudCA9IGRldGVjdFBhbihjb250ZXh0KTtcbiAgICBpZiAocGFuRXZlbnQpIHtcbiAgICAgIGRpc3BhdGNoR2VzdHVyZShwYW5FdmVudCk7XG4gICAgfVxuICAgIFxuICAgIC8vIE11bHRpLXRvdWNoIGdlc3R1cmVzXG4gICAgaWYgKHRvdWNoQ291bnQgPT09IDIgJiYgJ3RvdWNoZXMnIGluIGUpIHtcbiAgICAgIGNvbnN0IHRvdWNoMSA9IGUudG91Y2hlc1swXTtcbiAgICAgIGNvbnN0IHRvdWNoMiA9IGUudG91Y2hlc1sxXTtcbiAgICAgIFxuICAgICAgLy8gRGV0ZWN0IHBpbmNoXG4gICAgICBjb25zdCBwaW5jaEV2ZW50ID0gZGV0ZWN0UGluY2goY29udGV4dCwgdG91Y2gxLCB0b3VjaDIpO1xuICAgICAgaWYgKHBpbmNoRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hHZXN0dXJlKHBpbmNoRXZlbnQpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBEZXRlY3Qgcm90YXRlXG4gICAgICBjb25zdCByb3RhdGVFdmVudCA9IGRldGVjdFJvdGF0ZShjb250ZXh0LCB0b3VjaDEsIHRvdWNoMik7XG4gICAgICBpZiAocm90YXRlRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hHZXN0dXJlKHJvdGF0ZUV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIFxuICAvKipcbiAgICogSGFuZGxlIHRvdWNoL21vdXNlIGVuZFxuICAgKi9cbiAgY29uc3QgaGFuZGxlRW5kID0gKGU6IFRvdWNoRXZlbnQgfCBNb3VzZUV2ZW50IHwgUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKCFzdGF0ZS5hY3RpdmUpIHJldHVybjtcbiAgICBcbiAgICAvLyBDYW5jZWwgYW55IG9uZ29pbmcgbG9uZyBwcmVzcyBkZXRlY3Rpb25cbiAgICBpZiAobG9uZ1ByZXNzQ2xlYW51cCkge1xuICAgICAgbG9uZ1ByZXNzQ2xlYW51cCgpO1xuICAgICAgbG9uZ1ByZXNzQ2xlYW51cCA9IG51bGw7XG4gICAgfVxuICAgIFxuICAgIC8vIFNldHVwIGNvbnRleHQgZm9yIGdlc3R1cmUgZGV0ZWN0aW9uXG4gICAgY29uc3QgY29udGV4dDogR2VzdHVyZURldGVjdGlvbkNvbnRleHQgPSB7XG4gICAgICBzdGF0ZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBvcmlnaW5hbEV2ZW50OiBlXG4gICAgfTtcbiAgICBcbiAgICAvLyBEZXRlY3QgdGFwXG4gICAgY29uc3QgdGFwRXZlbnQgPSBkZXRlY3RUYXAoY29udGV4dCk7XG4gICAgaWYgKHRhcEV2ZW50KSB7XG4gICAgICAvLyBVcGRhdGUgdGFwIGNvdW50IGZvciBuZXh0IHRhcFxuICAgICAgc3RhdGUubGFzdFRhcFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgc3RhdGUudGFwQ291bnQgPSB0YXBFdmVudC5jb3VudDtcbiAgICAgIFxuICAgICAgZGlzcGF0Y2hHZXN0dXJlKHRhcEV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGV0ZWN0IHN3aXBlXG4gICAgICBjb25zdCBzd2lwZUV2ZW50ID0gZGV0ZWN0U3dpcGUoY29udGV4dCk7XG4gICAgICBpZiAoc3dpcGVFdmVudCkge1xuICAgICAgICBkaXNwYXRjaEdlc3R1cmUoc3dpcGVFdmVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFJlc2V0IHN0YXRlXG4gICAgc3RhdGUuYWN0aXZlID0gZmFsc2U7XG4gIH07XG4gIFxuICAvKipcbiAgICogSGFuZGxlIHRvdWNoL21vdXNlIGNhbmNlbFxuICAgKi9cbiAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKCk6IHZvaWQgPT4ge1xuICAgIC8vIENhbmNlbCBsb25nIHByZXNzIGRldGVjdGlvblxuICAgIGlmIChsb25nUHJlc3NDbGVhbnVwKSB7XG4gICAgICBsb25nUHJlc3NDbGVhbnVwKCk7XG4gICAgICBsb25nUHJlc3NDbGVhbnVwID0gbnVsbDtcbiAgICB9XG4gICAgXG4gICAgLy8gUmVzZXQgc3RhdGVcbiAgICBzdGF0ZS5hY3RpdmUgPSBmYWxzZTtcbiAgfTtcbiAgXG4gIC8vIEV2ZW50IGxpc3RlbmVyIHJlZmVyZW5jZXNcbiAgbGV0IGV2ZW50TGlzdGVuZXJzOiB7IFxuICAgIFtldmVudDogc3RyaW5nXTogRXZlbnRMaXN0ZW5lciBcbiAgfSA9IHt9O1xuICBcbiAgLyoqXG4gICAqIFNldCB1cCBldmVudCBsaXN0ZW5lcnMgYmFzZWQgb24gYXZhaWxhYmxlIEFQSXNcbiAgICovXG4gIGNvbnN0IHNldHVwRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHN1cHBvcnRQb2ludGVyKSB7XG4gICAgICAvLyBVc2UgUG9pbnRlciBFdmVudHMgQVBJXG4gICAgICBldmVudExpc3RlbmVycyA9IHtcbiAgICAgICAgcG9pbnRlcmRvd246IGhhbmRsZVN0YXJ0IGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICAgIHBvaW50ZXJtb3ZlOiBoYW5kbGVNb3ZlIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICAgIHBvaW50ZXJ1cDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICAgIHBvaW50ZXJjYW5jZWw6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoc3VwcG9ydFRvdWNoKSB7XG4gICAgICAvLyBVc2UgVG91Y2ggRXZlbnRzIEFQSVxuICAgICAgZXZlbnRMaXN0ZW5lcnMgPSB7XG4gICAgICAgIHRvdWNoc3RhcnQ6IGhhbmRsZVN0YXJ0IGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICAgIHRvdWNobW92ZTogaGFuZGxlTW92ZSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICB0b3VjaGVuZDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICAgIHRvdWNoY2FuY2VsOiBoYW5kbGVDYW5jZWwgYXMgRXZlbnRMaXN0ZW5lclxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRmFsbCBiYWNrIHRvIE1vdXNlIEV2ZW50cyBBUElcbiAgICAgIGV2ZW50TGlzdGVuZXJzID0ge1xuICAgICAgICBtb3VzZWRvd246IGhhbmRsZVN0YXJ0IGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICAgIG1vdXNlbW92ZTogaGFuZGxlTW92ZSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICBtb3VzZXVwOiBoYW5kbGVFbmQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgICAgbW91c2VsZWF2ZTogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXJcbiAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIC8vIEFkZCBsaXN0ZW5lcnMgdG8gZWxlbWVudFxuICAgIE9iamVjdC5lbnRyaWVzKGV2ZW50TGlzdGVuZXJzKS5mb3JFYWNoKChbZXZlbnQsIGxpc3RlbmVyXSkgPT4ge1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lciwgeyBwYXNzaXZlOiAhb3B0aW9ucy5wcmV2ZW50RGVmYXVsdCB9KTtcbiAgICB9KTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBSZW1vdmUgYWxsIGV2ZW50IGxpc3RlbmVyc1xuICAgKi9cbiAgY29uc3QgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgLy8gUmVtb3ZlIGFsbCBsaXN0ZW5lcnMgZnJvbSBlbGVtZW50XG4gICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICB9KTtcbiAgICBcbiAgICAvLyBDbGVhciBldmVudExpc3RlbmVycyBvYmplY3RcbiAgICBldmVudExpc3RlbmVycyA9IHt9O1xuICB9O1xuICBcbiAgLy8gSW5pdGlhbGl6ZSBldmVudCBsaXN0ZW5lcnNcbiAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICBcbiAgcmV0dXJuIHtcbiAgICAvKipcbiAgICAgKiBBZGQgYSBnZXN0dXJlIGV2ZW50IGxpc3RlbmVyXG4gICAgICogQHBhcmFtIGV2ZW50VHlwZSAtIFR5cGUgb2YgZ2VzdHVyZSB0byBsaXN0ZW4gZm9yXG4gICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICogQHJldHVybnMgR2VzdHVyZSBtYW5hZ2VyIGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIG9uKGV2ZW50VHlwZTogc3RyaW5nLCBoYW5kbGVyOiBHZXN0dXJlSGFuZGxlcik6IEdlc3R1cmVNYW5hZ2VyIHtcbiAgICAgIGlmICghaGFuZGxlcnMuaGFzKGV2ZW50VHlwZSkpIHtcbiAgICAgICAgaGFuZGxlcnMuc2V0KGV2ZW50VHlwZSwgbmV3IFNldCgpKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaGFuZGxlcnMuZ2V0KGV2ZW50VHlwZSkhLmFkZChoYW5kbGVyKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgZ2VzdHVyZSBldmVudCBsaXN0ZW5lclxuICAgICAqIEBwYXJhbSBldmVudFR5cGUgLSBUeXBlIG9mIGdlc3R1cmVcbiAgICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgdG8gcmVtb3ZlXG4gICAgICogQHJldHVybnMgR2VzdHVyZSBtYW5hZ2VyIGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIG9mZihldmVudFR5cGU6IHN0cmluZywgaGFuZGxlcjogR2VzdHVyZUhhbmRsZXIpOiBHZXN0dXJlTWFuYWdlciB7XG4gICAgICBjb25zdCBldmVudEhhbmRsZXJzID0gaGFuZGxlcnMuZ2V0KGV2ZW50VHlwZSk7XG4gICAgICBpZiAoZXZlbnRIYW5kbGVycykge1xuICAgICAgICBldmVudEhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChldmVudEhhbmRsZXJzLnNpemUgPT09IDApIHtcbiAgICAgICAgICBoYW5kbGVycy5kZWxldGUoZXZlbnRUeXBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBcbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhIGdlc3R1cmUgaXMgc3VwcG9ydGVkIG9uIHRoZSBjdXJyZW50IGRldmljZVxuICAgICAqIEBwYXJhbSBnZXN0dXJlVHlwZSAtIFR5cGUgb2YgZ2VzdHVyZSB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGdlc3R1cmUgaXMgc3VwcG9ydGVkXG4gICAgICovXG4gICAgaXNTdXBwb3J0ZWQoZ2VzdHVyZVR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGdlc3R1cmVUeXBlIGluIGdlc3R1cmVTdXBwb3J0ICYmIGdlc3R1cmVTdXBwb3J0W2dlc3R1cmVUeXBlIGFzIGtleW9mIHR5cGVvZiBnZXN0dXJlU3VwcG9ydF07XG4gICAgfSxcbiAgICBcbiAgICAvKipcbiAgICAgKiBFbmFibGUgZ2VzdHVyZSByZWNvZ25pdGlvbiBieSBhZGRpbmcgZXZlbnQgbGlzdGVuZXJzXG4gICAgICogQHJldHVybnMgR2VzdHVyZSBtYW5hZ2VyIGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIGVuYWJsZSgpOiBHZXN0dXJlTWFuYWdlciB7XG4gICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIFxuICAgIC8qKlxuICAgICAqIERpc2FibGUgZ2VzdHVyZSByZWNvZ25pdGlvbiBieSByZW1vdmluZyBldmVudCBsaXN0ZW5lcnNcbiAgICAgKiBAcmV0dXJucyBHZXN0dXJlIG1hbmFnZXIgZm9yIGNoYWluaW5nXG4gICAgICovXG4gICAgZGlzYWJsZSgpOiBHZXN0dXJlTWFuYWdlciB7XG4gICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBcbiAgICAvKipcbiAgICAgKiBDbGVhbiB1cCBldmVudCBsaXN0ZW5lcnMgYW5kIHRpbWVyc1xuICAgICAqL1xuICAgIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAvLyBDbGVhbiB1cCBsaXN0ZW5lcnNcbiAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICBcbiAgICAgIC8vIENsZWFyIGxvbmcgcHJlc3MgdGltZXJcbiAgICAgIGlmIChsb25nUHJlc3NDbGVhbnVwKSB7XG4gICAgICAgIGxvbmdQcmVzc0NsZWFudXAoKTtcbiAgICAgICAgbG9uZ1ByZXNzQ2xlYW51cCA9IG51bGw7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENsZWFyIGhhbmRsZXIgcmVmZXJlbmNlc1xuICAgICAgaGFuZGxlcnMuY2xlYXIoKTtcbiAgICB9XG4gIH07XG59OyIsCiAgICAiLy8gc3JjL2NvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlcy50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvY29tcG9zZS9mZWF0dXJlc1xuICogQGRlc2NyaXB0aW9uIEFkZHMgZ2VzdHVyZSByZWNvZ25pdGlvbiBjYXBhYmlsaXRpZXMgdG8gY29tcG9uZW50c1xuICovXG5cbmltcG9ydCB7IEJhc2VDb21wb25lbnQsIEVsZW1lbnRDb21wb25lbnQgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHtcbiAgY3JlYXRlR2VzdHVyZU1hbmFnZXIsXG4gIEdlc3R1cmVNYW5hZ2VyLFxuICBHZXN0dXJlQ29uZmlnLFxuICBHZXN0dXJlSGFuZGxlcixcbiAgQW55R2VzdHVyZUV2ZW50LFxufSBmcm9tIFwiLi4vLi4vLi4vZ2VzdHVyZXNcIjtcbmltcG9ydCB7IGhhc0xpZmVjeWNsZSwgaGFzRW1pdCB9IGZyb20gXCJtdHJsXCI7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgZ2VzdHVyZXMgZmVhdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlc3R1cmVzRmVhdHVyZUNvbmZpZyBleHRlbmRzIEdlc3R1cmVDb25maWcge1xuICAvKipcbiAgICogV2hldGhlciB0byBlbmFibGUgZ2VzdHVyZSByZWNvZ25pdGlvbiBpbW1lZGlhdGVseVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBlbmFibGVHZXN0dXJlcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluaXRpYWwgZ2VzdHVyZSBldmVudCBoYW5kbGVyc1xuICAgKi9cbiAgZ2VzdHVyZUhhbmRsZXJzPzogUmVjb3JkPHN0cmluZywgR2VzdHVyZUhhbmRsZXI+O1xuXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgd2l0aCBnZXN0dXJlIHJlY29nbml0aW9uIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlc3R1cmVzQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBHZXN0dXJlIG1hbmFnZXIgaW5zdGFuY2VcbiAgICovXG4gIGdlc3R1cmVzOiBHZXN0dXJlTWFuYWdlcjtcblxuICAvKipcbiAgICogQWRkIGEgZ2VzdHVyZSBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBldmVudFR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgZXZlbnRcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIEdlc3R1cmVzQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb25HZXN0dXJlOiAoZXZlbnRUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IEdlc3R1cmVIYW5kbGVyKSA9PiBHZXN0dXJlc0NvbXBvbmVudDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgZ2VzdHVyZSBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBldmVudFR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgZXZlbnRcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIEdlc3R1cmVzQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmR2VzdHVyZTogKGV2ZW50VHlwZTogc3RyaW5nLCBoYW5kbGVyOiBHZXN0dXJlSGFuZGxlcikgPT4gR2VzdHVyZXNDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgZ2VzdHVyZSB0eXBlIGlzIHN1cHBvcnRlZCBvbiB0aGUgY3VycmVudCBkZXZpY2VcbiAgICogQHBhcmFtIGdlc3R1cmVUeXBlIC0gVHlwZSBvZiBnZXN0dXJlIHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGdlc3R1cmUgaXMgc3VwcG9ydGVkXG4gICAqL1xuICBpc0dlc3R1cmVTdXBwb3J0ZWQ6IChnZXN0dXJlVHlwZTogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgZ2VzdHVyZSByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGVuYWJsZUdlc3R1cmVzOiAoKSA9PiBHZXN0dXJlc0NvbXBvbmVudDtcblxuICAvKipcbiAgICogRGlzYWJsZSBnZXN0dXJlIHJlY29nbml0aW9uXG4gICAqIEByZXR1cm5zIEdlc3R1cmVzQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZGlzYWJsZUdlc3R1cmVzOiAoKSA9PiBHZXN0dXJlc0NvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBBZGRzIGdlc3R1cmUgcmVjb2duaXRpb24gY2FwYWJpbGl0aWVzIHRvIGEgY29tcG9uZW50LlxuICogVGhpcyBpcyBhIGNvbXByZWhlbnNpdmUgZ2VzdHVyZSBmZWF0dXJlIHRoYXQgYWRkcyBzdXBwb3J0IGZvciBhbGwgZ2VzdHVyZSB0eXBlcy5cbiAqIEZvciBtb3JlIGxpZ2h0d2VpZ2h0LCBzcGVjaWZpYyBnZXN0dXJlcywgdXNlIHRoZSBpbmRpdmlkdWFsIGdlc3R1cmUgZmVhdHVyZXMuXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgZ2VzdHVyZSBzZXR0aW5nc1xuICogQHJldHVybnMgRnVuY3Rpb24gdGhhdCBlbmhhbmNlcyBhIGNvbXBvbmVudCB3aXRoIGdlc3R1cmUgY2FwYWJpbGl0aWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBBZGQgZ2VzdHVyZSByZWNvZ25pdGlvbiB0byBhIGNvbXBvbmVudFxuICogY29uc3QgY29tcG9uZW50ID0gcGlwZShcbiAqICAgY3JlYXRlQmFzZSxcbiAqICAgd2l0aEVsZW1lbnQoLi4uKSxcbiAqICAgd2l0aEdlc3R1cmVzKHtcbiAqICAgICBzd2lwZVRocmVzaG9sZDogNTAsXG4gKiAgICAgZ2VzdHVyZUhhbmRsZXJzOiB7XG4gKiAgICAgICAndGFwJzogKGUpID0+IGhhbmRsZVRhcChlKSxcbiAqICAgICAgICdzd2lwZWxlZnQnOiAoZSkgPT4gbmF2aWdhdGVGb3J3YXJkKGUpLFxuICogICAgICAgJ3N3aXBlcmlnaHQnOiAoZSkgPT4gbmF2aWdhdGVCYWNrKGUpXG4gKiAgICAgfVxuICogICB9KVxuICogKShjb25maWcpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoR2VzdHVyZXMgPVxuICAoY29uZmlnOiBHZXN0dXJlc0ZlYXR1cmVDb25maWcgPSB7fSkgPT5cbiAgPEMgZXh0ZW5kcyBFbGVtZW50Q29tcG9uZW50Pihjb21wb25lbnQ6IEMpOiBDICYgR2VzdHVyZXNDb21wb25lbnQgPT4ge1xuICAgIGlmICghY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkNhbm5vdCBhZGQgZ2VzdHVyZSByZWNvZ25pdGlvbjogbWlzc2luZyBlbGVtZW50XCIpO1xuICAgICAgcmV0dXJuIGNvbXBvbmVudCBhcyBDICYgR2VzdHVyZXNDb21wb25lbnQ7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBjb25maWd1cmF0aW9uXG4gICAgY29uc3Qge1xuICAgICAgZW5hYmxlR2VzdHVyZXMgPSB0cnVlLFxuICAgICAgZ2VzdHVyZUhhbmRsZXJzID0ge30sXG4gICAgICAuLi5nZXN0dXJlQ29uZmlnXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIENyZWF0ZSBnZXN0dXJlIG1hbmFnZXJcbiAgICBjb25zdCBnZXN0dXJlTWFuYWdlciA9IGNyZWF0ZUdlc3R1cmVNYW5hZ2VyKFxuICAgICAgY29tcG9uZW50LmVsZW1lbnQsXG4gICAgICBnZXN0dXJlQ29uZmlnXG4gICAgKTtcblxuICAgIC8vIEFkZCBpbml0aWFsIGdlc3R1cmUgaGFuZGxlcnNcbiAgICBPYmplY3QuZW50cmllcyhnZXN0dXJlSGFuZGxlcnMpLmZvckVhY2goKFtldmVudFR5cGUsIGhhbmRsZXJdKSA9PiB7XG4gICAgICBnZXN0dXJlTWFuYWdlci5vbihldmVudFR5cGUsIGhhbmRsZXIpO1xuICAgIH0pO1xuXG4gICAgLy8gRW5hYmxlL2Rpc2FibGUgYmFzZWQgb24gY29uZmlnXG4gICAgaWYgKCFlbmFibGVHZXN0dXJlcykge1xuICAgICAgZ2VzdHVyZU1hbmFnZXIuZGlzYWJsZSgpO1xuICAgIH1cblxuICAgIC8vIENvbm5lY3Qgd2l0aCBleGlzdGluZyBldmVudCBzeXN0ZW0gaWYgYXZhaWxhYmxlXG4gICAgaWYgKGhhc0VtaXQoY29tcG9uZW50KSkge1xuICAgICAgLy8gRm9yd2FyZCBnZXN0dXJlIGV2ZW50cyB0byB0aGUgY29tcG9uZW50J3MgZXZlbnQgc3lzdGVtXG4gICAgICBjb25zdCBmb3J3YXJkR2VzdHVyZUV2ZW50cyA9IChldmVudDogQW55R2VzdHVyZUV2ZW50KSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0KGV2ZW50LnR5cGUsIGV2ZW50KTtcbiAgICAgIH07XG5cbiAgICAgIC8vIFJlZ2lzdGVyIGZvcndhcmRlciBmb3IgY29tbW9uIGdlc3R1cmUgdHlwZXNcbiAgICAgIFtcbiAgICAgICAgXCJ0YXBcIixcbiAgICAgICAgXCJzd2lwZVwiLFxuICAgICAgICBcInN3aXBlbGVmdFwiLFxuICAgICAgICBcInN3aXBlcmlnaHRcIixcbiAgICAgICAgXCJzd2lwZXVwXCIsXG4gICAgICAgIFwic3dpcGVkb3duXCIsXG4gICAgICAgIFwibG9uZ3ByZXNzXCIsXG4gICAgICAgIFwicGluY2hcIixcbiAgICAgICAgXCJyb3RhdGVcIixcbiAgICAgICAgXCJwYW5cIixcbiAgICAgIF0uZm9yRWFjaCgodHlwZSkgPT4ge1xuICAgICAgICBnZXN0dXJlTWFuYWdlci5vbih0eXBlLCBmb3J3YXJkR2VzdHVyZUV2ZW50cyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgbGlmZWN5Y2xlIGludGVncmF0aW9uXG4gICAgaWYgKGhhc0xpZmVjeWNsZShjb21wb25lbnQpKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3k7XG5cbiAgICAgIGNvbXBvbmVudC5saWZlY3ljbGUuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgZ2VzdHVyZSBtYW5hZ2VyXG4gICAgICAgIGdlc3R1cmVNYW5hZ2VyLmRlc3Ryb3koKTtcblxuICAgICAgICAvLyBDYWxsIG9yaWdpbmFsIGRlc3Ryb3kgbWV0aG9kXG4gICAgICAgIG9yaWdpbmFsRGVzdHJveS5jYWxsKGNvbXBvbmVudC5saWZlY3ljbGUpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIGdlc3R1cmVzOiBnZXN0dXJlTWFuYWdlcixcblxuICAgICAgLyoqXG4gICAgICAgKiBBZGQgYSBnZXN0dXJlIGV2ZW50IGhhbmRsZXJcbiAgICAgICAqIEBwYXJhbSBldmVudFR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgZXZlbnRcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICogQHJldHVybnMgR2VzdHVyZXNDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIG9uR2VzdHVyZShldmVudFR5cGU6IHN0cmluZywgaGFuZGxlcjogR2VzdHVyZUhhbmRsZXIpIHtcbiAgICAgICAgZ2VzdHVyZU1hbmFnZXIub24oZXZlbnRUeXBlLCBoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBhIGdlc3R1cmUgZXZlbnQgaGFuZGxlclxuICAgICAgICogQHBhcmFtIGV2ZW50VHlwZSAtIFR5cGUgb2YgZ2VzdHVyZSBldmVudFxuICAgICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgb2ZmR2VzdHVyZShldmVudFR5cGU6IHN0cmluZywgaGFuZGxlcjogR2VzdHVyZUhhbmRsZXIpIHtcbiAgICAgICAgZ2VzdHVyZU1hbmFnZXIub2ZmKGV2ZW50VHlwZSwgaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDaGVjayBpZiBhIGdlc3R1cmUgdHlwZSBpcyBzdXBwb3J0ZWQgb24gdGhlIGN1cnJlbnQgZGV2aWNlXG4gICAgICAgKiBAcGFyYW0gZ2VzdHVyZVR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgdG8gY2hlY2tcbiAgICAgICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGdlc3R1cmUgaXMgc3VwcG9ydGVkXG4gICAgICAgKi9cbiAgICAgIGlzR2VzdHVyZVN1cHBvcnRlZChnZXN0dXJlVHlwZTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBnZXN0dXJlTWFuYWdlci5pc1N1cHBvcnRlZChnZXN0dXJlVHlwZSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEVuYWJsZSBnZXN0dXJlIHJlY29nbml0aW9uXG4gICAgICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgZW5hYmxlR2VzdHVyZXMoKSB7XG4gICAgICAgIGdlc3R1cmVNYW5hZ2VyLmVuYWJsZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZSBnZXN0dXJlIHJlY29nbml0aW9uXG4gICAgICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZUdlc3R1cmVzKCkge1xuICAgICAgICBnZXN0dXJlTWFuYWdlci5kaXNhYmxlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvLyBzcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3RhcC50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIEFkZHMgdGFwIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gY29tcG9uZW50c1xuICovXG5cbmltcG9ydCB0eXBlIHsgQmFzZUNvbXBvbmVudCwgRWxlbWVudENvbXBvbmVudCB9IGZyb20gXCJtdHJsXCI7XG5pbXBvcnQgeyBUYXBFdmVudCwgR2VzdHVyZUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vLi4vZ2VzdHVyZXNcIjtcbmltcG9ydCB7IGhhc0xpZmVjeWNsZSwgaGFzRW1pdCB9IGZyb20gXCJtdHJsXCI7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGFwIGdlc3R1cmUgZmVhdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhcEdlc3R1cmVDb25maWcge1xuICAvKipcbiAgICogRGlzdGFuY2UgdGhyZXNob2xkIChpbiBwaXhlbHMpIGZvciB0YXAgcmVjb2duaXRpb25cbiAgICogQGRlZmF1bHQgMTBcbiAgICovXG4gIHRhcERpc3RhbmNlVGhyZXNob2xkPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHByZXZlbnQgZGVmYXVsdCBiZWhhdmlvcnMgb24gdG91Y2ggZXZlbnRzXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHByZXZlbnREZWZhdWx0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgdGFwIGdlc3R1cmVcbiAgICovXG4gIG9uVGFwPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIHRhcCByZWNvZ25pdGlvbiBpbW1lZGlhdGVseVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBlbmFibGVkPzogYm9vbGVhbjtcblxuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IHdpdGggdGFwIGdlc3R1cmUgcmVjb2duaXRpb24gY2FwYWJpbGl0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFwR2VzdHVyZUNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvKipcbiAgICogQWRkIGEgdGFwIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uVGFwOiAoaGFuZGxlcjogKGV2ZW50OiBUYXBFdmVudCkgPT4gdm9pZCkgPT4gVGFwR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgdGFwIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlRhcDogKGhhbmRsZXI6IChldmVudDogVGFwRXZlbnQpID0+IHZvaWQpID0+IFRhcEdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSB0YXAgcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZW5hYmxlVGFwOiAoKSA9PiBUYXBHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlIHRhcCByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBkaXNhYmxlVGFwOiAoKSA9PiBUYXBHZXN0dXJlQ29tcG9uZW50O1xufVxuXG4vKipcbiAqIEFkZHMgdGFwIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnQuXG4gKiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQgYWx0ZXJuYXRpdmUgdG8gdGhlIGZ1bGwgZ2VzdHVyZSBzeXN0ZW0sXG4gKiBmb2N1c2VkIG9ubHkgb24gdGFwIGRldGVjdGlvbi5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBvYmplY3QgY29udGFpbmluZyB0YXAgc2V0dGluZ3NcbiAqIEByZXR1cm5zIEZ1bmN0aW9uIHRoYXQgZW5oYW5jZXMgYSBjb21wb25lbnQgd2l0aCB0YXAgY2FwYWJpbGl0aWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBBZGQgdGFwIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnRcbiAqIGNvbnN0IGNvbXBvbmVudCA9IHBpcGUoXG4gKiAgIGNyZWF0ZUJhc2UsXG4gKiAgIHdpdGhFbGVtZW50KC4uLiksXG4gKiAgIHdpdGhUYXBHZXN0dXJlKHtcbiAqICAgICBvblRhcDogKGUpID0+IGNvbnNvbGUubG9nKCdUYXBwZWQgYXQnLCBlLngsIGUueSlcbiAqICAgfSlcbiAqICkoY29uZmlnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgd2l0aFRhcEdlc3R1cmUgPVxuICAoY29uZmlnOiBUYXBHZXN0dXJlQ29uZmlnID0ge30pID0+XG4gIDxDIGV4dGVuZHMgRWxlbWVudENvbXBvbmVudD4oY29tcG9uZW50OiBDKTogQyAmIFRhcEdlc3R1cmVDb21wb25lbnQgPT4ge1xuICAgIGlmICghY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkNhbm5vdCBhZGQgdGFwIGdlc3R1cmUgcmVjb2duaXRpb246IG1pc3NpbmcgZWxlbWVudFwiKTtcbiAgICAgIHJldHVybiBjb21wb25lbnQgYXMgQyAmIFRhcEdlc3R1cmVDb21wb25lbnQ7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBjb25maWd1cmF0aW9uXG4gICAgY29uc3Qge1xuICAgICAgdGFwRGlzdGFuY2VUaHJlc2hvbGQgPSAxMCxcbiAgICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZSxcbiAgICAgIG9uVGFwLFxuICAgICAgZW5hYmxlZCA9IHRydWUsXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIEV2ZW50IGhhbmRsZXJzIHN0b3JhZ2VcbiAgICBjb25zdCBoYW5kbGVyczogU2V0PChldmVudDogVGFwRXZlbnQpID0+IHZvaWQ+ID0gbmV3IFNldCgpO1xuXG4gICAgLy8gSWYgaW5pdGlhbCBoYW5kbGVyIHByb3ZpZGVkLCBhZGQgaXRcbiAgICBpZiAob25UYXApIHtcbiAgICAgIGhhbmRsZXJzLmFkZChvblRhcCBhcyAoZXZlbnQ6IFRhcEV2ZW50KSA9PiB2b2lkKTtcbiAgICB9XG5cbiAgICAvLyBHZXN0dXJlIHN0YXRlIGZvciB0cmFja2luZ1xuICAgIGxldCBzdGFydFggPSAwO1xuICAgIGxldCBzdGFydFkgPSAwO1xuICAgIGxldCBhY3RpdmUgPSBmYWxzZTtcbiAgICBsZXQgc3RhcnRUaW1lID0gMDtcbiAgICBsZXQgbGFzdFRhcFRpbWUgPSAwO1xuICAgIGxldCB0YXBDb3VudCA9IDA7XG4gICAgbGV0IGlzRW5hYmxlZCA9IGVuYWJsZWQ7XG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaCBhIHRhcCBldmVudCB0byBhbGwgaGFuZGxlcnNcbiAgICAgKi9cbiAgICBjb25zdCBkaXNwYXRjaFRhcCA9IChcbiAgICAgIGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50LFxuICAgICAgeDogbnVtYmVyLFxuICAgICAgeTogbnVtYmVyXG4gICAgKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgaXNEb3VibGVUYXAgPSBub3cgLSBsYXN0VGFwVGltZSA8IDMwMDtcblxuICAgICAgaWYgKGlzRG91YmxlVGFwKSB7XG4gICAgICAgIHRhcENvdW50Kys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXBDb3VudCA9IDE7XG4gICAgICB9XG5cbiAgICAgIGxhc3RUYXBUaW1lID0gbm93O1xuXG4gICAgICAvLyBDcmVhdGUgdGhlIHRhcCBldmVudFxuICAgICAgY29uc3QgdGFwRXZlbnQ6IFRhcEV2ZW50ID0ge1xuICAgICAgICB0eXBlOiBcInRhcFwiLFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0YXJnZXQ6IGUudGFyZ2V0ISxcbiAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICBlbmRUaW1lOiBub3csXG4gICAgICAgIGR1cmF0aW9uOiBub3cgLSBzdGFydFRpbWUsXG4gICAgICAgIGRlZmF1bHRQcmV2ZW50ZWQ6IGZhbHNlLFxuICAgICAgICBwcmV2ZW50RGVmYXVsdDogKCkgPT4ge1xuICAgICAgICAgIHRhcEV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChlLmNhbmNlbGFibGUpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHN0b3BQcm9wYWdhdGlvbjogKCkgPT4ge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvdW50OiB0YXBDb3VudCxcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgIH07XG5cbiAgICAgIC8vIENhbGwgZWFjaCBoYW5kbGVyXG4gICAgICBoYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaGFuZGxlcih0YXBFdmVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGluIHRhcCBoYW5kbGVyOlwiLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBGb3J3YXJkIHRvIGNvbXBvbmVudCdzIGV2ZW50IHN5c3RlbSBpZiBhdmFpbGFibGVcbiAgICAgIGlmIChoYXNFbWl0KGNvbXBvbmVudCkpIHtcbiAgICAgICAgY29tcG9uZW50LmVtaXQoXCJ0YXBcIiwgdGFwRXZlbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBwcmV2ZW50RGVmYXVsdCBpZiBjb25maWd1cmVkXG4gICAgICBpZiAocHJldmVudERlZmF1bHQgJiYgIXRhcEV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgdGFwRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIHN0YXJ0XG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlU3RhcnQgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRvdWNoID0gXCJ0b3VjaGVzXCIgaW4gZSA/IGUudG91Y2hlc1swXSA6IGU7XG5cbiAgICAgIHN0YXJ0WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgICBzdGFydFkgPSB0b3VjaC5jbGllbnRZO1xuICAgICAgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGFjdGl2ZSA9IHRydWU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBlbmRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVFbmQgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghYWN0aXZlIHx8ICFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgdG91Y2ggPVxuICAgICAgICBcImNoYW5nZWRUb3VjaGVzXCIgaW4gZSAmJiBlLmNoYW5nZWRUb3VjaGVzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IGUuY2hhbmdlZFRvdWNoZXNbMF1cbiAgICAgICAgICA6IChlIGFzIE1vdXNlRXZlbnQpO1xuXG4gICAgICBjb25zdCBlbmRYID0gdG91Y2guY2xpZW50WDtcbiAgICAgIGNvbnN0IGVuZFkgPSB0b3VjaC5jbGllbnRZO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgZGlzdGFuY2UgbW92ZWRcbiAgICAgIGNvbnN0IGRlbHRhWCA9IGVuZFggLSBzdGFydFg7XG4gICAgICBjb25zdCBkZWx0YVkgPSBlbmRZIC0gc3RhcnRZO1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgbW92ZW1lbnQgaXMgd2l0aGluIHRocmVzaG9sZFxuICAgICAgaWYgKGRpc3RhbmNlIDwgdGFwRGlzdGFuY2VUaHJlc2hvbGQpIHtcbiAgICAgICAgZGlzcGF0Y2hUYXAoZSwgZW5kWCwgZW5kWSk7XG4gICAgICB9XG5cbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgY2FuY2VsXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8vIEV2ZW50IGxpc3RlbmVycyBkaWN0aW9uYXJ5XG4gICAgY29uc3QgZXZlbnRMaXN0ZW5lcnM6IFJlY29yZDxzdHJpbmcsIEV2ZW50TGlzdGVuZXI+ID0ge1xuICAgICAgbW91c2Vkb3duOiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2V1cDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICBtb3VzZWxlYXZlOiBoYW5kbGVDYW5jZWwgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNoc3RhcnQ6IGhhbmRsZVN0YXJ0IGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaGVuZDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaGNhbmNlbDogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZCBldmVudCBsaXN0ZW5lcnMgdG8gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHNldHVwRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBPYmplY3QuZW50cmllcyhldmVudExpc3RlbmVycykuZm9yRWFjaCgoW2V2ZW50LCBsaXN0ZW5lcl0pID0+IHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIHtcbiAgICAgICAgICBwYXNzaXZlOiAhcHJldmVudERlZmF1bHQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBldmVudCBsaXN0ZW5lcnMgZnJvbSBlbGVtZW50XG4gICAgICovXG4gICAgY29uc3QgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBPYmplY3QuZW50cmllcyhldmVudExpc3RlbmVycykuZm9yRWFjaCgoW2V2ZW50LCBsaXN0ZW5lcl0pID0+IHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIFNldHVwIGxpc3RlbmVycyBpZiBpbml0aWFsbHkgZW5hYmxlZFxuICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgbGlmZWN5Y2xlIGludGVncmF0aW9uXG4gICAgaWYgKGhhc0xpZmVjeWNsZShjb21wb25lbnQpKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3k7XG5cbiAgICAgIGNvbXBvbmVudC5saWZlY3ljbGUuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgICAgICAgLy8gQ2xlYXIgaGFuZGxlcnNcbiAgICAgICAgaGFuZGxlcnMuY2xlYXIoKTtcblxuICAgICAgICAvLyBDYWxsIG9yaWdpbmFsIGRlc3Ryb3kgbWV0aG9kXG4gICAgICAgIG9yaWdpbmFsRGVzdHJveS5jYWxsKGNvbXBvbmVudC5saWZlY3ljbGUpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcblxuICAgICAgLyoqXG4gICAgICAgKiBBZGQgYSB0YXAgZXZlbnQgaGFuZGxlclxuICAgICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIG9uVGFwKGhhbmRsZXI6IChldmVudDogVGFwRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlIGEgdGFwIGV2ZW50IGhhbmRsZXJcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgICAgICovXG4gICAgICBvZmZUYXAoaGFuZGxlcjogKGV2ZW50OiBUYXBFdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBFbmFibGUgdGFwIHJlY29nbml0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZVRhcCgpIHtcbiAgICAgICAgaWYgKCFpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZSB0YXAgcmVjb2duaXRpb25cbiAgICAgICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZVRhcCgpIHtcbiAgICAgICAgaWYgKGlzRW5hYmxlZCkge1xuICAgICAgICAgIGlzRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgIH07XG4gIH07XG4iLAogICAgIi8vIHNyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMvc3dpcGUudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBBZGRzIHN3aXBlIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gY29tcG9uZW50c1xuICovXG5cbmltcG9ydCB0eXBlIHsgQmFzZUNvbXBvbmVudCwgRWxlbWVudENvbXBvbmVudCB9IGZyb20gXCJtdHJsXCI7XG5pbXBvcnQge1xuICBTd2lwZUV2ZW50LFxuICBTV0lQRV9ESVJFQ1RJT05TLFxuICBHZXN0dXJlSGFuZGxlcixcbn0gZnJvbSBcIi4uLy4uLy4uL2dlc3R1cmVzXCI7XG5pbXBvcnQgeyBoYXNMaWZlY3ljbGUsIGhhc0VtaXQgfSBmcm9tIFwibXRybFwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHN3aXBlIGdlc3R1cmUgZmVhdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN3aXBlR2VzdHVyZUNvbmZpZyB7XG4gIC8qKlxuICAgKiBNaW5pbXVtIGRpc3RhbmNlIChpbiBwaXhlbHMpIHRvIHJlY29nbml6ZSBhIHN3aXBlXG4gICAqIEBkZWZhdWx0IDMwXG4gICAqL1xuICBzd2lwZVRocmVzaG9sZD86IG51bWJlcjtcblxuICAvKipcbiAgICogTWF4aW11bSB0aW1lIChpbiBtcykgaW4gd2hpY2ggYSBzd2lwZSBtdXN0IGJlIGNvbXBsZXRlZFxuICAgKiBAZGVmYXVsdCAzMDBcbiAgICovXG4gIHN3aXBlVGltZVRocmVzaG9sZD86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBwcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3JzIG9uIHRvdWNoIGV2ZW50c1xuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBwcmV2ZW50RGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIGFueSBzd2lwZSBkaXJlY3Rpb25cbiAgICovXG4gIG9uU3dpcGU/OiBHZXN0dXJlSGFuZGxlcjtcblxuICAvKipcbiAgICogSGFuZGxlciBzcGVjaWZpY2FsbHkgZm9yIGxlZnQgc3dpcGVzXG4gICAqL1xuICBvblN3aXBlTGVmdD86IEdlc3R1cmVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVyIHNwZWNpZmljYWxseSBmb3IgcmlnaHQgc3dpcGVzXG4gICAqL1xuICBvblN3aXBlUmlnaHQ/OiBHZXN0dXJlSGFuZGxlcjtcblxuICAvKipcbiAgICogSGFuZGxlciBzcGVjaWZpY2FsbHkgZm9yIHVwIHN3aXBlc1xuICAgKi9cbiAgb25Td2lwZVVwPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciBkb3duIHN3aXBlc1xuICAgKi9cbiAgb25Td2lwZURvd24/OiBHZXN0dXJlSGFuZGxlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlbmFibGUgc3dpcGUgcmVjb2duaXRpb24gaW1tZWRpYXRlbHlcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vKipcbiAqIENvbXBvbmVudCB3aXRoIHN3aXBlIGdlc3R1cmUgcmVjb2duaXRpb24gY2FwYWJpbGl0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3dpcGVHZXN0dXJlQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBBZGQgYSBoYW5kbGVyIGZvciBhbnkgc3dpcGUgZGlyZWN0aW9uXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblN3aXBlOiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciBsZWZ0IHN3aXBlc1xuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb25Td2lwZUxlZnQ6IChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpID0+IFN3aXBlR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogQWRkIGEgaGFuZGxlciBzcGVjaWZpY2FsbHkgZm9yIHJpZ2h0IHN3aXBlc1xuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb25Td2lwZVJpZ2h0OiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciB1cCBzd2lwZXNcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uU3dpcGVVcDogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBoYW5kbGVyIHNwZWNpZmljYWxseSBmb3IgZG93biBzd2lwZXNcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uU3dpcGVEb3duOiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHN3aXBlIGV2ZW50IGhhbmRsZXIgZm9yIGFueSBkaXJlY3Rpb25cbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlN3aXBlOiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGxlZnQgc3dpcGUgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmU3dpcGVMZWZ0OiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHJpZ2h0IHN3aXBlIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlN3aXBlUmlnaHQ6IChcbiAgICBoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWRcbiAgKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiB1cCBzd2lwZSBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZTd2lwZVVwOiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGRvd24gc3dpcGUgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmU3dpcGVEb3duOiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBzd2lwZSByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBlbmFibGVTd2lwZTogKCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlIHN3aXBlIHJlY29nbml0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGRpc2FibGVTd2lwZTogKCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xufVxuXG4vKipcbiAqIERldGVybWluZSBzd2lwZSBkaXJlY3Rpb24gYmFzZWQgb24gZGVsdGEgWCBhbmQgWVxuICpcbiAqIEBwYXJhbSBkZWx0YVggLSBEaXN0YW5jZSBtb3ZlZCBpbiBYIGRpcmVjdGlvblxuICogQHBhcmFtIGRlbHRhWSAtIERpc3RhbmNlIG1vdmVkIGluIFkgZGlyZWN0aW9uXG4gKiBAcmV0dXJucyBEaXJlY3Rpb24gb2YgdGhlIHN3aXBlXG4gKi9cbmZ1bmN0aW9uIGdldFN3aXBlRGlyZWN0aW9uKGRlbHRhWDogbnVtYmVyLCBkZWx0YVk6IG51bWJlcik6IFNXSVBFX0RJUkVDVElPTlMge1xuICBpZiAoTWF0aC5hYnMoZGVsdGFYKSA+IE1hdGguYWJzKGRlbHRhWSkpIHtcbiAgICByZXR1cm4gZGVsdGFYID4gMCA/IFNXSVBFX0RJUkVDVElPTlMuUklHSFQgOiBTV0lQRV9ESVJFQ1RJT05TLkxFRlQ7XG4gIH1cbiAgcmV0dXJuIGRlbHRhWSA+IDAgPyBTV0lQRV9ESVJFQ1RJT05TLkRPV04gOiBTV0lQRV9ESVJFQ1RJT05TLlVQO1xufVxuXG4vKipcbiAqIEFkZHMgc3dpcGUgZ2VzdHVyZSByZWNvZ25pdGlvbiB0byBhIGNvbXBvbmVudC5cbiAqIFRoaXMgaXMgYSBsaWdodHdlaWdodCBhbHRlcm5hdGl2ZSB0byB0aGUgZnVsbCBnZXN0dXJlIHN5c3RlbSxcbiAqIGZvY3VzZWQgb25seSBvbiBzd2lwZSBkZXRlY3Rpb24uXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgc3dpcGUgc2V0dGluZ3NcbiAqIEByZXR1cm5zIEZ1bmN0aW9uIHRoYXQgZW5oYW5jZXMgYSBjb21wb25lbnQgd2l0aCBzd2lwZSBjYXBhYmlsaXRpZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIEFkZCBzd2lwZSBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50XG4gKiBjb25zdCBjb21wb25lbnQgPSBwaXBlKFxuICogICBjcmVhdGVCYXNlLFxuICogICB3aXRoRWxlbWVudCguLi4pLFxuICogICB3aXRoU3dpcGVHZXN0dXJlKHtcbiAqICAgICBvblN3aXBlTGVmdDogKCkgPT4gc2hvd05leHRQYWdlKCksXG4gKiAgICAgb25Td2lwZVJpZ2h0OiAoKSA9PiBzaG93UHJldmlvdXNQYWdlKClcbiAqICAgfSlcbiAqICkoY29uZmlnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgd2l0aFN3aXBlR2VzdHVyZSA9XG4gIChjb25maWc6IFN3aXBlR2VzdHVyZUNvbmZpZyA9IHt9KSA9PlxuICA8QyBleHRlbmRzIEVsZW1lbnRDb21wb25lbnQ+KGNvbXBvbmVudDogQyk6IEMgJiBTd2lwZUdlc3R1cmVDb21wb25lbnQgPT4ge1xuICAgIGlmICghY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkNhbm5vdCBhZGQgc3dpcGUgZ2VzdHVyZSByZWNvZ25pdGlvbjogbWlzc2luZyBlbGVtZW50XCIpO1xuICAgICAgcmV0dXJuIGNvbXBvbmVudCBhcyBDICYgU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIHN3aXBlVGhyZXNob2xkID0gMzAsXG4gICAgICBzd2lwZVRpbWVUaHJlc2hvbGQgPSAzMDAsXG4gICAgICBwcmV2ZW50RGVmYXVsdCA9IHRydWUsXG4gICAgICBvblN3aXBlLFxuICAgICAgb25Td2lwZUxlZnQsXG4gICAgICBvblN3aXBlUmlnaHQsXG4gICAgICBvblN3aXBlVXAsXG4gICAgICBvblN3aXBlRG93bixcbiAgICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBFdmVudCBoYW5kbGVycyBzdG9yYWdlIGJ5IGRpcmVjdGlvblxuICAgIGNvbnN0IGhhbmRsZXJzID0ge1xuICAgICAgc3dpcGU6IG5ldyBTZXQ8KGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkPigpLFxuICAgICAgc3dpcGVsZWZ0OiBuZXcgU2V0PChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZD4oKSxcbiAgICAgIHN3aXBlcmlnaHQ6IG5ldyBTZXQ8KGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkPigpLFxuICAgICAgc3dpcGV1cDogbmV3IFNldDwoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQ+KCksXG4gICAgICBzd2lwZWRvd246IG5ldyBTZXQ8KGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkPigpLFxuICAgIH07XG5cbiAgICAvLyBBZGQgaW5pdGlhbCBoYW5kbGVycyBpZiBwcm92aWRlZFxuICAgIGlmIChvblN3aXBlKSBoYW5kbGVycy5zd2lwZS5hZGQob25Td2lwZSBhcyAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpO1xuICAgIGlmIChvblN3aXBlTGVmdClcbiAgICAgIGhhbmRsZXJzLnN3aXBlbGVmdC5hZGQob25Td2lwZUxlZnQgYXMgKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKTtcbiAgICBpZiAob25Td2lwZVJpZ2h0KVxuICAgICAgaGFuZGxlcnMuc3dpcGVyaWdodC5hZGQob25Td2lwZVJpZ2h0IGFzIChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCk7XG4gICAgaWYgKG9uU3dpcGVVcClcbiAgICAgIGhhbmRsZXJzLnN3aXBldXAuYWRkKG9uU3dpcGVVcCBhcyAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpO1xuICAgIGlmIChvblN3aXBlRG93bilcbiAgICAgIGhhbmRsZXJzLnN3aXBlZG93bi5hZGQob25Td2lwZURvd24gYXMgKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKTtcblxuICAgIC8vIEdlc3R1cmUgc3RhdGUgZm9yIHRyYWNraW5nXG4gICAgbGV0IHN0YXJ0WCA9IDA7XG4gICAgbGV0IHN0YXJ0WSA9IDA7XG4gICAgbGV0IGFjdGl2ZSA9IGZhbHNlO1xuICAgIGxldCBzdGFydFRpbWUgPSAwO1xuICAgIGxldCBpc0VuYWJsZWQgPSBlbmFibGVkO1xuXG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2ggYSBzd2lwZSBldmVudCB0byBhbGwgcmVnaXN0ZXJlZCBoYW5kbGVyc1xuICAgICAqL1xuICAgIGNvbnN0IGRpc3BhdGNoU3dpcGUgPSAoXG4gICAgICBlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCxcbiAgICAgIGVuZFg6IG51bWJlcixcbiAgICAgIGVuZFk6IG51bWJlclxuICAgICk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgZGVsdGFYID0gZW5kWCAtIHN0YXJ0WDtcbiAgICAgIGNvbnN0IGRlbHRhWSA9IGVuZFkgLSBzdGFydFk7XG4gICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguc3FydChkZWx0YVggKiBkZWx0YVggKyBkZWx0YVkgKiBkZWx0YVkpO1xuICAgICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG4gICAgICBjb25zdCB2ZWxvY2l0eSA9IGRpc3RhbmNlIC8gZHVyYXRpb247XG4gICAgICBjb25zdCBkaXJlY3Rpb24gPSBnZXRTd2lwZURpcmVjdGlvbihkZWx0YVgsIGRlbHRhWSk7XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgc3dpcGUgZXZlbnRcbiAgICAgIGNvbnN0IHN3aXBlRXZlbnQ6IFN3aXBlRXZlbnQgPSB7XG4gICAgICAgIHR5cGU6IFwic3dpcGVcIixcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgdGFyZ2V0OiBlLnRhcmdldCEsXG4gICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgZW5kVGltZSxcbiAgICAgICAgZHVyYXRpb24sXG4gICAgICAgIGRlZmF1bHRQcmV2ZW50ZWQ6IGZhbHNlLFxuICAgICAgICBwcmV2ZW50RGVmYXVsdDogKCkgPT4ge1xuICAgICAgICAgIHN3aXBlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICBkZWx0YVgsXG4gICAgICAgIGRlbHRhWSxcbiAgICAgICAgZGlzdGFuY2UsXG4gICAgICAgIHZlbG9jaXR5LFxuICAgICAgICBzdGFydFgsXG4gICAgICAgIHN0YXJ0WSxcbiAgICAgICAgZW5kWCxcbiAgICAgICAgZW5kWSxcbiAgICAgIH07XG5cbiAgICAgIC8vIEZpcnN0IHRyaWdnZXIgZ2VuZXJpYyBzd2lwZSBoYW5kbGVyc1xuICAgICAgaGFuZGxlcnMuc3dpcGUuZm9yRWFjaCgoaGFuZGxlcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGhhbmRsZXIoc3dpcGVFdmVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGluIHN3aXBlIGhhbmRsZXI6XCIsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFRoZW4gdHJpZ2dlciBkaXJlY3Rpb24tc3BlY2lmaWMgaGFuZGxlcnNcbiAgICAgIGNvbnN0IGRpcmVjdGlvbktleSA9IGBzd2lwZSR7ZGlyZWN0aW9ufWAgYXMga2V5b2YgdHlwZW9mIGhhbmRsZXJzO1xuICAgICAgaGFuZGxlcnNbZGlyZWN0aW9uS2V5XS5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaGFuZGxlcih7IC4uLnN3aXBlRXZlbnQsIHR5cGU6IGRpcmVjdGlvbktleSB9IGFzIFN3aXBlRXZlbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGluICR7ZGlyZWN0aW9uS2V5fSBoYW5kbGVyOmAsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEZvcndhcmQgdG8gY29tcG9uZW50J3MgZXZlbnQgc3lzdGVtIGlmIGF2YWlsYWJsZVxuICAgICAgaWYgKGhhc0VtaXQoY29tcG9uZW50KSkge1xuICAgICAgICBjb21wb25lbnQuZW1pdChcInN3aXBlXCIsIHN3aXBlRXZlbnQpO1xuICAgICAgICBjb21wb25lbnQuZW1pdChkaXJlY3Rpb25LZXksIHN3aXBlRXZlbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBwcmV2ZW50RGVmYXVsdCBpZiBjb25maWd1cmVkXG4gICAgICBpZiAocHJldmVudERlZmF1bHQgJiYgIXN3aXBlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICBzd2lwZUV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBzdGFydFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZVN0YXJ0ID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0b3VjaCA9IFwidG91Y2hlc1wiIGluIGUgPyBlLnRvdWNoZXNbMF0gOiBlO1xuXG4gICAgICBzdGFydFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgc3RhcnRZID0gdG91Y2guY2xpZW50WTtcbiAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBhY3RpdmUgPSB0cnVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgZW5kXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlRW5kID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWFjdGl2ZSB8fCAhaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRvdWNoID1cbiAgICAgICAgXCJjaGFuZ2VkVG91Y2hlc1wiIGluIGUgJiYgZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggPiAwXG4gICAgICAgICAgPyBlLmNoYW5nZWRUb3VjaGVzWzBdXG4gICAgICAgICAgOiAoZSBhcyBNb3VzZUV2ZW50KTtcblxuICAgICAgY29uc3QgZW5kWCA9IHRvdWNoLmNsaWVudFg7XG4gICAgICBjb25zdCBlbmRZID0gdG91Y2guY2xpZW50WTtcblxuICAgICAgLy8gQ2FsY3VsYXRlIHN3aXBlIHByb3BlcnRpZXNcbiAgICAgIGNvbnN0IGRlbHRhWCA9IGVuZFggLSBzdGFydFg7XG4gICAgICBjb25zdCBkZWx0YVkgPSBlbmRZIC0gc3RhcnRZO1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcblxuICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhIHN3aXBlXG4gICAgICBpZiAoZGlzdGFuY2UgPj0gc3dpcGVUaHJlc2hvbGQgJiYgZHVyYXRpb24gPD0gc3dpcGVUaW1lVGhyZXNob2xkKSB7XG4gICAgICAgIGRpc3BhdGNoU3dpcGUoZSwgZW5kWCwgZW5kWSk7XG4gICAgICB9XG5cbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgY2FuY2VsXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8vIEV2ZW50IGxpc3RlbmVycyBkaWN0aW9uYXJ5XG4gICAgY29uc3QgZXZlbnRMaXN0ZW5lcnM6IFJlY29yZDxzdHJpbmcsIEV2ZW50TGlzdGVuZXI+ID0ge1xuICAgICAgbW91c2Vkb3duOiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2V1cDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICBtb3VzZWxlYXZlOiBoYW5kbGVDYW5jZWwgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNoc3RhcnQ6IGhhbmRsZVN0YXJ0IGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaGVuZDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaGNhbmNlbDogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZCBldmVudCBsaXN0ZW5lcnMgdG8gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHNldHVwRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBPYmplY3QuZW50cmllcyhldmVudExpc3RlbmVycykuZm9yRWFjaCgoW2V2ZW50LCBsaXN0ZW5lcl0pID0+IHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIHtcbiAgICAgICAgICBwYXNzaXZlOiAhcHJldmVudERlZmF1bHQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBldmVudCBsaXN0ZW5lcnMgZnJvbSBlbGVtZW50XG4gICAgICovXG4gICAgY29uc3QgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBPYmplY3QuZW50cmllcyhldmVudExpc3RlbmVycykuZm9yRWFjaCgoW2V2ZW50LCBsaXN0ZW5lcl0pID0+IHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIFNldHVwIGxpc3RlbmVycyBpZiBpbml0aWFsbHkgZW5hYmxlZFxuICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgbGlmZWN5Y2xlIGludGVncmF0aW9uXG4gICAgaWYgKGhhc0xpZmVjeWNsZShjb21wb25lbnQpKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3k7XG5cbiAgICAgIGNvbXBvbmVudC5saWZlY3ljbGUuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgICAgICAgLy8gQ2xlYXIgaGFuZGxlcnNcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhoYW5kbGVycykuZm9yRWFjaCgoaGFuZGxlclNldCkgPT4gaGFuZGxlclNldC5jbGVhcigpKTtcblxuICAgICAgICAvLyBDYWxsIG9yaWdpbmFsIGRlc3Ryb3kgbWV0aG9kXG4gICAgICAgIG9yaWdpbmFsRGVzdHJveS5jYWxsKGNvbXBvbmVudC5saWZlY3ljbGUpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcblxuICAgICAgLy8gQWRkIGhhbmRsZXIgbWV0aG9kc1xuICAgICAgb25Td2lwZShoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGUuYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9uU3dpcGVMZWZ0KGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5zd2lwZWxlZnQuYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9uU3dpcGVSaWdodChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGVyaWdodC5hZGQoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb25Td2lwZVVwKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5zd2lwZXVwLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvblN3aXBlRG93bihoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGVkb3duLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvLyBSZW1vdmUgaGFuZGxlciBtZXRob2RzXG4gICAgICBvZmZTd2lwZShoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGUuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9mZlN3aXBlTGVmdChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGVsZWZ0LmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvZmZTd2lwZVJpZ2h0KGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5zd2lwZXJpZ2h0LmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvZmZTd2lwZVVwKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5zd2lwZXVwLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvZmZTd2lwZURvd24oaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlZG93bi5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLy8gRW5hYmxlL2Rpc2FibGUgbWV0aG9kc1xuICAgICAgZW5hYmxlU3dpcGUoKSB7XG4gICAgICAgIGlmICghaXNFbmFibGVkKSB7XG4gICAgICAgICAgaXNFbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBkaXNhYmxlU3dpcGUoKSB7XG4gICAgICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvLyBzcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL2xvbmdwcmVzcy50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIEFkZHMgbG9uZyBwcmVzcyBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGNvbXBvbmVudHNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEJhc2VDb21wb25lbnQsIEVsZW1lbnRDb21wb25lbnQgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgTG9uZ1ByZXNzRXZlbnQsIEdlc3R1cmVIYW5kbGVyIH0gZnJvbSBcIi4uLy4uLy4uL2dlc3R1cmVzXCI7XG5pbXBvcnQgeyBoYXNMaWZlY3ljbGUsIGhhc0VtaXQgfSBmcm9tIFwibXRybFwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGxvbmcgcHJlc3MgZ2VzdHVyZSBmZWF0dXJlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9uZ1ByZXNzR2VzdHVyZUNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaW1lIChpbiBtcykgdG8gcmVjb2duaXplIGEgbG9uZyBwcmVzc1xuICAgKiBAZGVmYXVsdCA1MDBcbiAgICovXG4gIGxvbmdQcmVzc1RpbWU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIERpc3RhbmNlIHRocmVzaG9sZCAoaW4gcGl4ZWxzKSBmb3IgbW92ZW1lbnQgdGhhdCBjYW5jZWxzIGxvbmcgcHJlc3NcbiAgICogQGRlZmF1bHQgMTBcbiAgICovXG4gIG1vdmVUaHJlc2hvbGQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcHJldmVudCBkZWZhdWx0IGJlaGF2aW9ycyBvbiB0b3VjaCBldmVudHNcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcHJldmVudERlZmF1bHQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVyIGZvciBsb25nIHByZXNzIGdlc3R1cmVcbiAgICovXG4gIG9uTG9uZ1ByZXNzPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIGxvbmcgcHJlc3MgcmVjb2duaXRpb24gaW1tZWRpYXRlbHlcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vKipcbiAqIENvbXBvbmVudCB3aXRoIGxvbmcgcHJlc3MgZ2VzdHVyZSByZWNvZ25pdGlvbiBjYXBhYmlsaXRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb25nUHJlc3NHZXN0dXJlQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBBZGQgYSBsb25nIHByZXNzIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uTG9uZ1ByZXNzOiAoXG4gICAgaGFuZGxlcjogKGV2ZW50OiBMb25nUHJlc3NFdmVudCkgPT4gdm9pZFxuICApID0+IExvbmdQcmVzc0dlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGxvbmcgcHJlc3MgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmTG9uZ1ByZXNzOiAoXG4gICAgaGFuZGxlcjogKGV2ZW50OiBMb25nUHJlc3NFdmVudCkgPT4gdm9pZFxuICApID0+IExvbmdQcmVzc0dlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBsb25nIHByZXNzIHJlY29nbml0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGVuYWJsZUxvbmdQcmVzczogKCkgPT4gTG9uZ1ByZXNzR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogRGlzYWJsZSBsb25nIHByZXNzIHJlY29nbml0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGRpc2FibGVMb25nUHJlc3M6ICgpID0+IExvbmdQcmVzc0dlc3R1cmVDb21wb25lbnQ7XG59XG5cbi8qKlxuICogQWRkcyBsb25nIHByZXNzIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnQuXG4gKiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQgYWx0ZXJuYXRpdmUgdG8gdGhlIGZ1bGwgZ2VzdHVyZSBzeXN0ZW0sXG4gKiBmb2N1c2VkIG9ubHkgb24gbG9uZyBwcmVzcyBkZXRlY3Rpb24uXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgbG9uZyBwcmVzcyBzZXR0aW5nc1xuICogQHJldHVybnMgRnVuY3Rpb24gdGhhdCBlbmhhbmNlcyBhIGNvbXBvbmVudCB3aXRoIGxvbmcgcHJlc3MgY2FwYWJpbGl0aWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBBZGQgbG9uZyBwcmVzcyBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50XG4gKiBjb25zdCBjb21wb25lbnQgPSBwaXBlKFxuICogICBjcmVhdGVCYXNlLFxuICogICB3aXRoRWxlbWVudCguLi4pLFxuICogICB3aXRoTG9uZ1ByZXNzR2VzdHVyZSh7XG4gKiAgICAgbG9uZ1ByZXNzVGltZTogODAwLFxuICogICAgIG9uTG9uZ1ByZXNzOiAoZSkgPT4gc2hvd0NvbnRleHRNZW51KGUueCwgZS55KVxuICogICB9KVxuICogKShjb25maWcpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoTG9uZ1ByZXNzR2VzdHVyZSA9XG4gIChjb25maWc6IExvbmdQcmVzc0dlc3R1cmVDb25maWcgPSB7fSkgPT5cbiAgPEMgZXh0ZW5kcyBFbGVtZW50Q29tcG9uZW50Pihjb21wb25lbnQ6IEMpOiBDICYgTG9uZ1ByZXNzR2VzdHVyZUNvbXBvbmVudCA9PiB7XG4gICAgaWYgKCFjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIkNhbm5vdCBhZGQgbG9uZyBwcmVzcyBnZXN0dXJlIHJlY29nbml0aW9uOiBtaXNzaW5nIGVsZW1lbnRcIlxuICAgICAgKTtcbiAgICAgIHJldHVybiBjb21wb25lbnQgYXMgQyAmIExvbmdQcmVzc0dlc3R1cmVDb21wb25lbnQ7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBjb25maWd1cmF0aW9uXG4gICAgY29uc3Qge1xuICAgICAgbG9uZ1ByZXNzVGltZSA9IDUwMCxcbiAgICAgIG1vdmVUaHJlc2hvbGQgPSAxMCxcbiAgICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZSxcbiAgICAgIG9uTG9uZ1ByZXNzLFxuICAgICAgZW5hYmxlZCA9IHRydWUsXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIEV2ZW50IGhhbmRsZXJzIHN0b3JhZ2VcbiAgICBjb25zdCBoYW5kbGVyczogU2V0PChldmVudDogTG9uZ1ByZXNzRXZlbnQpID0+IHZvaWQ+ID0gbmV3IFNldCgpO1xuXG4gICAgLy8gSWYgaW5pdGlhbCBoYW5kbGVyIHByb3ZpZGVkLCBhZGQgaXRcbiAgICBpZiAob25Mb25nUHJlc3MpIHtcbiAgICAgIGhhbmRsZXJzLmFkZChvbkxvbmdQcmVzcyBhcyAoZXZlbnQ6IExvbmdQcmVzc0V2ZW50KSA9PiB2b2lkKTtcbiAgICB9XG5cbiAgICAvLyBHZXN0dXJlIHN0YXRlIGZvciB0cmFja2luZ1xuICAgIGxldCBzdGFydFggPSAwO1xuICAgIGxldCBzdGFydFkgPSAwO1xuICAgIGxldCBjdXJyZW50WCA9IDA7XG4gICAgbGV0IGN1cnJlbnRZID0gMDtcbiAgICBsZXQgYWN0aXZlID0gZmFsc2U7XG4gICAgbGV0IHN0YXJ0VGltZSA9IDA7XG4gICAgbGV0IGxvbmdQcmVzc1RpbWVyOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaXNFbmFibGVkID0gZW5hYmxlZDtcblxuICAgIC8qKlxuICAgICAqIERpc3BhdGNoIGEgbG9uZyBwcmVzcyBldmVudCB0byBhbGwgaGFuZGxlcnNcbiAgICAgKi9cbiAgICBjb25zdCBkaXNwYXRjaExvbmdQcmVzcyA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgLy8gQ3JlYXRlIHRoZSBsb25nIHByZXNzIGV2ZW50XG4gICAgICBjb25zdCBsb25nUHJlc3NFdmVudDogTG9uZ1ByZXNzRXZlbnQgPSB7XG4gICAgICAgIHR5cGU6IFwibG9uZ3ByZXNzXCIsXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHRhcmdldDogZS50YXJnZXQhLFxuICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgIGVuZFRpbWU6IERhdGUubm93KCksXG4gICAgICAgIGR1cmF0aW9uOiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lLFxuICAgICAgICBkZWZhdWx0UHJldmVudGVkOiBmYWxzZSxcbiAgICAgICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgICBsb25nUHJlc3NFdmVudC5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzdG9wUHJvcGFnYXRpb246ICgpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9LFxuICAgICAgICB4OiBjdXJyZW50WCxcbiAgICAgICAgeTogY3VycmVudFksXG4gICAgICB9O1xuXG4gICAgICAvLyBDYWxsIGVhY2ggaGFuZGxlclxuICAgICAgaGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGhhbmRsZXIobG9uZ1ByZXNzRXZlbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBpbiBsb25nIHByZXNzIGhhbmRsZXI6XCIsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEZvcndhcmQgdG8gY29tcG9uZW50J3MgZXZlbnQgc3lzdGVtIGlmIGF2YWlsYWJsZVxuICAgICAgaWYgKGhhc0VtaXQoY29tcG9uZW50KSkge1xuICAgICAgICBjb21wb25lbnQuZW1pdChcImxvbmdwcmVzc1wiLCBsb25nUHJlc3NFdmVudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFwcGx5IHByZXZlbnREZWZhdWx0IGlmIGNvbmZpZ3VyZWRcbiAgICAgIGlmIChwcmV2ZW50RGVmYXVsdCAmJiAhbG9uZ1ByZXNzRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICBsb25nUHJlc3NFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2Ugc3RhcnRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVTdGFydCA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgdG91Y2ggPSBcInRvdWNoZXNcIiBpbiBlID8gZS50b3VjaGVzWzBdIDogZTtcblxuICAgICAgc3RhcnRYID0gY3VycmVudFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgc3RhcnRZID0gY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuICAgICAgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGFjdGl2ZSA9IHRydWU7XG5cbiAgICAgIC8vIENhbmNlbCBhbnkgZXhpc3RpbmcgdGltZXJcbiAgICAgIGlmIChsb25nUHJlc3NUaW1lciAhPT0gbnVsbCkge1xuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGxvbmdQcmVzc1RpbWVyKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHVwIGxvbmcgcHJlc3MgdGltZXJcbiAgICAgIGxvbmdQcmVzc1RpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgbW92ZW1lbnQgd2FzIHdpdGhpbiB0aHJlc2hvbGRcbiAgICAgICAgICBjb25zdCBkZWx0YVggPSBjdXJyZW50WCAtIHN0YXJ0WDtcbiAgICAgICAgICBjb25zdCBkZWx0YVkgPSBjdXJyZW50WSAtIHN0YXJ0WTtcbiAgICAgICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguc3FydChkZWx0YVggKiBkZWx0YVggKyBkZWx0YVkgKiBkZWx0YVkpO1xuXG4gICAgICAgICAgaWYgKGRpc3RhbmNlIDwgbW92ZVRocmVzaG9sZCkge1xuICAgICAgICAgICAgZGlzcGF0Y2hMb25nUHJlc3MoZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbG9uZ1ByZXNzVGltZXIgPSBudWxsO1xuICAgICAgfSwgbG9uZ1ByZXNzVGltZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBtb3ZlXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlTW92ZSA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFhY3RpdmUgfHwgIWlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0b3VjaCA9IFwidG91Y2hlc1wiIGluIGUgPyBlLnRvdWNoZXNbMF0gOiBlO1xuXG4gICAgICBjdXJyZW50WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgICBjdXJyZW50WSA9IHRvdWNoLmNsaWVudFk7XG5cbiAgICAgIC8vIENoZWNrIGlmIG1vdmVtZW50IGV4Y2VlZHMgdGhyZXNob2xkXG4gICAgICBjb25zdCBkZWx0YVggPSBjdXJyZW50WCAtIHN0YXJ0WDtcbiAgICAgIGNvbnN0IGRlbHRhWSA9IGN1cnJlbnRZIC0gc3RhcnRZO1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcblxuICAgICAgaWYgKGRpc3RhbmNlID4gbW92ZVRocmVzaG9sZCkge1xuICAgICAgICAvLyBDYW5jZWwgbG9uZyBwcmVzcyBpZiBtb3ZlZCB0b28gbXVjaFxuICAgICAgICBpZiAobG9uZ1ByZXNzVGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGxvbmdQcmVzc1RpbWVyKTtcbiAgICAgICAgICBsb25nUHJlc3NUaW1lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIGVuZFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUVuZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChsb25nUHJlc3NUaW1lciAhPT0gbnVsbCkge1xuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGxvbmdQcmVzc1RpbWVyKTtcbiAgICAgICAgbG9uZ1ByZXNzVGltZXIgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIGNhbmNlbFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChsb25nUHJlc3NUaW1lciAhPT0gbnVsbCkge1xuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGxvbmdQcmVzc1RpbWVyKTtcbiAgICAgICAgbG9uZ1ByZXNzVGltZXIgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgLy8gRXZlbnQgbGlzdGVuZXJzIGRpY3Rpb25hcnlcbiAgICBjb25zdCBldmVudExpc3RlbmVyczogUmVjb3JkPHN0cmluZywgRXZlbnRMaXN0ZW5lcj4gPSB7XG4gICAgICBtb3VzZWRvd246IGhhbmRsZVN0YXJ0IGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICBtb3VzZW1vdmU6IGhhbmRsZU1vdmUgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNldXA6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2VsZWF2ZTogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaHN0YXJ0OiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2htb3ZlOiBoYW5kbGVNb3ZlIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaGVuZDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaGNhbmNlbDogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZCBldmVudCBsaXN0ZW5lcnMgdG8gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHNldHVwRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBPYmplY3QuZW50cmllcyhldmVudExpc3RlbmVycykuZm9yRWFjaCgoW2V2ZW50LCBsaXN0ZW5lcl0pID0+IHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIHtcbiAgICAgICAgICBwYXNzaXZlOiAhcHJldmVudERlZmF1bHQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBldmVudCBsaXN0ZW5lcnMgZnJvbSBlbGVtZW50XG4gICAgICovXG4gICAgY29uc3QgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBPYmplY3QuZW50cmllcyhldmVudExpc3RlbmVycykuZm9yRWFjaCgoW2V2ZW50LCBsaXN0ZW5lcl0pID0+IHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIFNldHVwIGxpc3RlbmVycyBpZiBpbml0aWFsbHkgZW5hYmxlZFxuICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgbGlmZWN5Y2xlIGludGVncmF0aW9uXG4gICAgaWYgKGhhc0xpZmVjeWNsZShjb21wb25lbnQpKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3k7XG5cbiAgICAgIGNvbXBvbmVudC5saWZlY3ljbGUuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgICAgICAgLy8gQ2xlYXIgYW55IHRpbWVyc1xuICAgICAgICBpZiAobG9uZ1ByZXNzVGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGxvbmdQcmVzc1RpbWVyKTtcbiAgICAgICAgICBsb25nUHJlc3NUaW1lciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciBoYW5kbGVyc1xuICAgICAgICBoYW5kbGVycy5jbGVhcigpO1xuXG4gICAgICAgIC8vIENhbGwgb3JpZ2luYWwgZGVzdHJveSBtZXRob2RcbiAgICAgICAgb3JpZ2luYWxEZXN0cm95LmNhbGwoY29tcG9uZW50LmxpZmVjeWNsZSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBlbmhhbmNlZCBjb21wb25lbnRcbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuXG4gICAgICAvKipcbiAgICAgICAqIEFkZCBhIGxvbmcgcHJlc3MgZXZlbnQgaGFuZGxlclxuICAgICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIG9uTG9uZ1ByZXNzKGhhbmRsZXI6IChldmVudDogTG9uZ1ByZXNzRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlIGEgbG9uZyBwcmVzcyBldmVudCBoYW5kbGVyXG4gICAgICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICAgICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgb2ZmTG9uZ1ByZXNzKGhhbmRsZXI6IChldmVudDogTG9uZ1ByZXNzRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRW5hYmxlIGxvbmcgcHJlc3MgcmVjb2duaXRpb25cbiAgICAgICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgZW5hYmxlTG9uZ1ByZXNzKCkge1xuICAgICAgICBpZiAoIWlzRW5hYmxlZCkge1xuICAgICAgICAgIGlzRW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBEaXNhYmxlIGxvbmcgcHJlc3MgcmVjb2duaXRpb25cbiAgICAgICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZUxvbmdQcmVzcygpIHtcbiAgICAgICAgaWYgKGlzRW5hYmxlZCkge1xuICAgICAgICAgIGlzRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgICAgICAgICAvLyBDbGVhciBhbnkgdGltZXJzXG4gICAgICAgICAgaWYgKGxvbmdQcmVzc1RpbWVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGxvbmdQcmVzc1RpbWVyKTtcbiAgICAgICAgICAgIGxvbmdQcmVzc1RpbWVyID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgIH07XG4gIH07XG4iLAogICAgIi8vIHNyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMvcGFuLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzXG4gKiBAZGVzY3JpcHRpb24gQWRkcyBwYW4gZ2VzdHVyZSByZWNvZ25pdGlvbiB0byBjb21wb25lbnRzXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBCYXNlQ29tcG9uZW50LCBFbGVtZW50Q29tcG9uZW50IH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IFBhbkV2ZW50LCBHZXN0dXJlSGFuZGxlciB9IGZyb20gXCIuLi8uLi8uLi9nZXN0dXJlc1wiO1xuaW1wb3J0IHsgaGFzTGlmZWN5Y2xlLCBoYXNFbWl0IH0gZnJvbSBcIm10cmxcIjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBwYW4gZ2VzdHVyZSBmZWF0dXJlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFuR2VzdHVyZUNvbmZpZyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHByZXZlbnQgZGVmYXVsdCBiZWhhdmlvcnMgb24gdG91Y2ggZXZlbnRzXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHByZXZlbnREZWZhdWx0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgcGFuIHN0YXJ0IChmaXJzdCBtb3ZlbWVudClcbiAgICovXG4gIG9uUGFuU3RhcnQ/OiBHZXN0dXJlSGFuZGxlcjtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgcGFuIG1vdmUgKGNvbnRpbnVvdXMgdXBkYXRlcyBkdXJpbmcgcGFuKVxuICAgKi9cbiAgb25QYW4/OiBHZXN0dXJlSGFuZGxlcjtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgcGFuIGVuZCAodG91Y2gvbW91c2UgcmVsZWFzZSlcbiAgICovXG4gIG9uUGFuRW5kPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIHBhbiByZWNvZ25pdGlvbiBpbW1lZGlhdGVseVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBlbmFibGVkPzogYm9vbGVhbjtcblxuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbi8qKlxuICogRXh0ZW5kIHRoZSBQYW5FdmVudCBpbnRlcmZhY2UgdG8gc3VwcG9ydCBvdXIgY3VzdG9tIGV2ZW50IHR5cGVzXG4gKi9cbmludGVyZmFjZSBFeHRlbmRlZFBhbkV2ZW50IGV4dGVuZHMgT21pdDxQYW5FdmVudCwgXCJ0eXBlXCI+IHtcbiAgdHlwZTogXCJwYW5cIiB8IFwicGFuc3RhcnRcIiB8IFwicGFuZW5kXCI7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IHdpdGggcGFuIGdlc3R1cmUgcmVjb2duaXRpb24gY2FwYWJpbGl0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFuR2VzdHVyZUNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvKipcbiAgICogQWRkIGEgaGFuZGxlciBmb3IgcGFuIHN0YXJ0XG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblBhblN0YXJ0OiAoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogQWRkIGEgaGFuZGxlciBmb3IgcGFuIG1vdmUgKGNvbnRpbnVvdXMgdXBkYXRlcylcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uUGFuOiAoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogQWRkIGEgaGFuZGxlciBmb3IgcGFuIGVuZFxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb25QYW5FbmQ6IChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSA9PiBQYW5HZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBwYW4gc3RhcnQgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmUGFuU3RhcnQ6IChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSA9PiBQYW5HZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBwYW4gbW92ZSBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZQYW46IChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSA9PiBQYW5HZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBwYW4gZW5kIGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlBhbkVuZDogKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpID0+IFBhbkdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBwYW4gcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZW5hYmxlUGFuOiAoKSA9PiBQYW5HZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlIHBhbiByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBkaXNhYmxlUGFuOiAoKSA9PiBQYW5HZXN0dXJlQ29tcG9uZW50O1xufVxuXG4vKipcbiAqIEFkZHMgcGFuIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnQuXG4gKiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQgYWx0ZXJuYXRpdmUgdG8gdGhlIGZ1bGwgZ2VzdHVyZSBzeXN0ZW0sXG4gKiBmb2N1c2VkIG9ubHkgb24gcGFuIGRldGVjdGlvbi5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBvYmplY3QgY29udGFpbmluZyBwYW4gc2V0dGluZ3NcbiAqIEByZXR1cm5zIEZ1bmN0aW9uIHRoYXQgZW5oYW5jZXMgYSBjb21wb25lbnQgd2l0aCBwYW4gY2FwYWJpbGl0aWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBBZGQgcGFuIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnRcbiAqIGNvbnN0IGNvbXBvbmVudCA9IHBpcGUoXG4gKiAgIGNyZWF0ZUJhc2UsXG4gKiAgIHdpdGhFbGVtZW50KC4uLiksXG4gKiAgIHdpdGhQYW5HZXN0dXJlKHtcbiAqICAgICBvblBhblN0YXJ0OiAoZSkgPT4gc3RhcnREcmFnKGUpLFxuICogICAgIG9uUGFuOiAoZSkgPT4gdXBkYXRlRHJhZ1Bvc2l0aW9uKGUpLFxuICogICAgIG9uUGFuRW5kOiAoZSkgPT4gZW5kRHJhZyhlKVxuICogICB9KVxuICogKShjb25maWcpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoUGFuR2VzdHVyZSA9XG4gIChjb25maWc6IFBhbkdlc3R1cmVDb25maWcgPSB7fSkgPT5cbiAgPEMgZXh0ZW5kcyBFbGVtZW50Q29tcG9uZW50Pihjb21wb25lbnQ6IEMpOiBDICYgUGFuR2VzdHVyZUNvbXBvbmVudCA9PiB7XG4gICAgaWYgKCFjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgY29uc29sZS53YXJuKFwiQ2Fubm90IGFkZCBwYW4gZ2VzdHVyZSByZWNvZ25pdGlvbjogbWlzc2luZyBlbGVtZW50XCIpO1xuICAgICAgcmV0dXJuIGNvbXBvbmVudCBhcyBDICYgUGFuR2VzdHVyZUNvbXBvbmVudDtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCB7XG4gICAgICBwcmV2ZW50RGVmYXVsdCA9IHRydWUsXG4gICAgICBvblBhblN0YXJ0LFxuICAgICAgb25QYW4sXG4gICAgICBvblBhbkVuZCxcbiAgICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBFdmVudCBoYW5kbGVycyBzdG9yYWdlIGJ5IHBhbiBwaGFzZVxuICAgIGNvbnN0IGhhbmRsZXJzID0ge1xuICAgICAgcGFuc3RhcnQ6IG5ldyBTZXQ8KGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZD4oKSxcbiAgICAgIHBhbjogbmV3IFNldDwoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkPigpLFxuICAgICAgcGFuZW5kOiBuZXcgU2V0PChldmVudDogUGFuRXZlbnQpID0+IHZvaWQ+KCksXG4gICAgfTtcblxuICAgIC8vIEFkZCBpbml0aWFsIGhhbmRsZXJzIGlmIHByb3ZpZGVkXG4gICAgaWYgKG9uUGFuU3RhcnQpXG4gICAgICBoYW5kbGVycy5wYW5zdGFydC5hZGQob25QYW5TdGFydCBhcyAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKTtcbiAgICBpZiAob25QYW4pIGhhbmRsZXJzLnBhbi5hZGQob25QYW4gYXMgKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCk7XG4gICAgaWYgKG9uUGFuRW5kKSBoYW5kbGVycy5wYW5lbmQuYWRkKG9uUGFuRW5kIGFzIChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpO1xuXG4gICAgLy8gR2VzdHVyZSBzdGF0ZSBmb3IgdHJhY2tpbmdcbiAgICBsZXQgc3RhcnRYID0gMDtcbiAgICBsZXQgc3RhcnRZID0gMDtcbiAgICBsZXQgbGFzdFggPSAwO1xuICAgIGxldCBsYXN0WSA9IDA7XG4gICAgbGV0IGN1cnJlbnRYID0gMDtcbiAgICBsZXQgY3VycmVudFkgPSAwO1xuICAgIGxldCBhY3RpdmUgPSBmYWxzZTtcbiAgICBsZXQgaXNQYW5uaW5nID0gZmFsc2U7XG4gICAgbGV0IHN0YXJ0VGltZSA9IDA7XG4gICAgbGV0IGlzRW5hYmxlZCA9IGVuYWJsZWQ7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBwYW4gZXZlbnQgd2l0aCB0aGUgY3VycmVudCBzdGF0ZVxuICAgICAqL1xuICAgIGNvbnN0IGNyZWF0ZVBhbkV2ZW50ID0gKFxuICAgICAgZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQsXG4gICAgICB0eXBlOiBcInBhbnN0YXJ0XCIgfCBcInBhblwiIHwgXCJwYW5lbmRcIlxuICAgICk6IEV4dGVuZGVkUGFuRXZlbnQgPT4ge1xuICAgICAgY29uc3QgZXZlbnQ6IEV4dGVuZGVkUGFuRXZlbnQgPSB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHRhcmdldDogZS50YXJnZXQhLFxuICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgIGVuZFRpbWU6IERhdGUubm93KCksXG4gICAgICAgIGR1cmF0aW9uOiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lLFxuICAgICAgICBkZWZhdWx0UHJldmVudGVkOiBmYWxzZSxcbiAgICAgICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgICBldmVudC5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzdG9wUHJvcGFnYXRpb246ICgpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9LFxuICAgICAgICBkZWx0YVg6IGN1cnJlbnRYIC0gc3RhcnRYLFxuICAgICAgICBkZWx0YVk6IGN1cnJlbnRZIC0gc3RhcnRZLFxuICAgICAgICBzdGFydFgsXG4gICAgICAgIHN0YXJ0WSxcbiAgICAgICAgY3VycmVudFgsXG4gICAgICAgIGN1cnJlbnRZLFxuICAgICAgfTtcbiAgICAgIHJldHVybiBldmVudDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2ggYSBwYW4gZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgaGFuZGxlcnNcbiAgICAgKi9cbiAgICBjb25zdCBkaXNwYXRjaFBhbiA9IChcbiAgICAgIGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50LFxuICAgICAgdHlwZTogXCJwYW5zdGFydFwiIHwgXCJwYW5cIiB8IFwicGFuZW5kXCJcbiAgICApOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGV4dGVuZGVkUGFuRXZlbnQgPSBjcmVhdGVQYW5FdmVudChlLCB0eXBlKTtcblxuICAgICAgLy8gQ2FsbCBlYWNoIGhhbmRsZXIgZm9yIHRoaXMgcGhhc2VcbiAgICAgIGhhbmRsZXJzW3R5cGVdLmZvckVhY2goKGhhbmRsZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUeXBlIGFzc2VydGlvbiBmb3IgdGhlIGhhbmRsZXIgY2FsbCAtIHdlJ3JlIGRlbGliZXJhdGVseSBwYXNzaW5nIG91ciBleHRlbmRlZCBldmVudFxuICAgICAgICAgIGhhbmRsZXIoZXh0ZW5kZWRQYW5FdmVudCBhcyB1bmtub3duIGFzIFBhbkV2ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBpbiAke3R5cGV9IGhhbmRsZXI6YCwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gRm9yd2FyZCB0byBjb21wb25lbnQncyBldmVudCBzeXN0ZW0gaWYgYXZhaWxhYmxlXG4gICAgICBpZiAoaGFzRW1pdChjb21wb25lbnQpKSB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0KHR5cGUsIGV4dGVuZGVkUGFuRXZlbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBwcmV2ZW50RGVmYXVsdCBpZiBjb25maWd1cmVkXG4gICAgICBpZiAocHJldmVudERlZmF1bHQgJiYgIWV4dGVuZGVkUGFuRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICBleHRlbmRlZFBhbkV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBzdGFydFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZVN0YXJ0ID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0b3VjaCA9IFwidG91Y2hlc1wiIGluIGUgPyBlLnRvdWNoZXNbMF0gOiBlO1xuXG4gICAgICBzdGFydFggPSBsYXN0WCA9IGN1cnJlbnRYID0gdG91Y2guY2xpZW50WDtcbiAgICAgIHN0YXJ0WSA9IGxhc3RZID0gY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuICAgICAgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGFjdGl2ZSA9IHRydWU7XG4gICAgICBpc1Bhbm5pbmcgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIG1vdmVcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVNb3ZlID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWFjdGl2ZSB8fCAhaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRvdWNoID0gXCJ0b3VjaGVzXCIgaW4gZSA/IGUudG91Y2hlc1swXSA6IGU7XG5cbiAgICAgIC8vIFVwZGF0ZSBwb3NpdGlvblxuICAgICAgbGFzdFggPSBjdXJyZW50WDtcbiAgICAgIGxhc3RZID0gY3VycmVudFk7XG4gICAgICBjdXJyZW50WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgICBjdXJyZW50WSA9IHRvdWNoLmNsaWVudFk7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBtb3ZlbWVudCBkZWx0YVxuICAgICAgY29uc3QgbW92ZURlbHRhWCA9IGN1cnJlbnRYIC0gbGFzdFg7XG4gICAgICBjb25zdCBtb3ZlRGVsdGFZID0gY3VycmVudFkgLSBsYXN0WTtcbiAgICAgIGNvbnN0IG1vdmVEZWx0YSA9IE1hdGguc3FydChcbiAgICAgICAgbW92ZURlbHRhWCAqIG1vdmVEZWx0YVggKyBtb3ZlRGVsdGFZICogbW92ZURlbHRhWVxuICAgICAgKTtcblxuICAgICAgLy8gRGV0ZWN0IHNpZ25pZmljYW50IG1vdmVtZW50XG4gICAgICBpZiAobW92ZURlbHRhID4gMCkge1xuICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBzaWduaWZpY2FudCBtb3ZlbWVudCwgdHJpZ2dlciBwYW5zdGFydFxuICAgICAgICBpZiAoIWlzUGFubmluZykge1xuICAgICAgICAgIGlzUGFubmluZyA9IHRydWU7XG4gICAgICAgICAgZGlzcGF0Y2hQYW4oZSwgXCJwYW5zdGFydFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZW4gdHJpZ2dlciB0aGUgY29udGludW91cyBwYW4gZXZlbnRcbiAgICAgICAgZGlzcGF0Y2hQYW4oZSwgXCJwYW5cIik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBlbmRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVFbmQgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghYWN0aXZlIHx8ICFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgLy8gSWYgd2Ugd2VyZSBwYW5uaW5nLCB0cmlnZ2VyIHRoZSBwYW5lbmQgZXZlbnRcbiAgICAgIGlmIChpc1Bhbm5pbmcpIHtcbiAgICAgICAgZGlzcGF0Y2hQYW4oZSwgXCJwYW5lbmRcIik7XG4gICAgICB9XG5cbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgICAgaXNQYW5uaW5nID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBjYW5jZWxcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVDYW5jZWwgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghYWN0aXZlIHx8ICFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgLy8gSWYgd2Ugd2VyZSBwYW5uaW5nLCB0cmlnZ2VyIHRoZSBwYW5lbmQgZXZlbnRcbiAgICAgIGlmIChpc1Bhbm5pbmcpIHtcbiAgICAgICAgZGlzcGF0Y2hQYW4oZSwgXCJwYW5lbmRcIik7XG4gICAgICB9XG5cbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgICAgaXNQYW5uaW5nID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8vIEV2ZW50IGxpc3RlbmVycyBkaWN0aW9uYXJ5XG4gICAgY29uc3QgZXZlbnRMaXN0ZW5lcnM6IFJlY29yZDxzdHJpbmcsIEV2ZW50TGlzdGVuZXI+ID0ge1xuICAgICAgbW91c2Vkb3duOiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2Vtb3ZlOiBoYW5kbGVNb3ZlIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICBtb3VzZXVwOiBoYW5kbGVFbmQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNlbGVhdmU6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hzdGFydDogaGFuZGxlU3RhcnQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNobW92ZTogaGFuZGxlTW92ZSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hlbmQ6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hjYW5jZWw6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGQgZXZlbnQgbGlzdGVuZXJzIHRvIGVsZW1lbnRcbiAgICAgKi9cbiAgICBjb25zdCBzZXR1cEV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCB7XG4gICAgICAgICAgcGFzc2l2ZTogIXByZXZlbnREZWZhdWx0LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGZyb20gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBTZXR1cCBsaXN0ZW5lcnMgaWYgaW5pdGlhbGx5IGVuYWJsZWRcbiAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGxpZmVjeWNsZSBpbnRlZ3JhdGlvblxuICAgIGlmIChoYXNMaWZlY3ljbGUoY29tcG9uZW50KSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95O1xuXG4gICAgICBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuXG4gICAgICAgIC8vIENsZWFyIGhhbmRsZXJzXG4gICAgICAgIE9iamVjdC52YWx1ZXMoaGFuZGxlcnMpLmZvckVhY2goKGhhbmRsZXJTZXQpID0+IGhhbmRsZXJTZXQuY2xlYXIoKSk7XG5cbiAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBkZXN0cm95IG1ldGhvZFxuICAgICAgICBvcmlnaW5hbERlc3Ryb3kuY2FsbChjb21wb25lbnQubGlmZWN5Y2xlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG5cbiAgICAgIC8vIEFkZCBoYW5kbGVyIG1ldGhvZHNcbiAgICAgIG9uUGFuU3RhcnQoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5wYW5zdGFydC5hZGQoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb25QYW4oaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5wYW4uYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9uUGFuRW5kKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMucGFuZW5kLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvLyBSZW1vdmUgaGFuZGxlciBtZXRob2RzXG4gICAgICBvZmZQYW5TdGFydChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnBhbnN0YXJ0LmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvZmZQYW4oaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5wYW4uZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9mZlBhbkVuZChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnBhbmVuZC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLy8gRW5hYmxlL2Rpc2FibGUgbWV0aG9kc1xuICAgICAgZW5hYmxlUGFuKCkge1xuICAgICAgICBpZiAoIWlzRW5hYmxlZCkge1xuICAgICAgICAgIGlzRW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgZGlzYWJsZVBhbigpIHtcbiAgICAgICAgaWYgKGlzRW5hYmxlZCkge1xuICAgICAgICAgIGlzRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgIH07XG4gIH07XG4iLAogICAgIi8qKlxuICogQG1vZHVsZSBjb3JlL2xheW91dC9zY2hlbWFcbiAqIEBkZXNjcmlwdGlvbiBVbmlmaWVkIGxheW91dCBzY2hlbWEgcHJvY2Vzc29yIHdpdGggaW50ZWdyYXRlZCBvcHRpbWl6YXRpb25zXG4gKiBDb25zb2xpZGF0ZXMgYXJyYXksIG9iamVjdCwgSlNYLCBhbmQgdGVtcGxhdGUgcHJvY2Vzc2luZyB3aXRoIGJ1aWx0LWluIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50c1xuICovXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRZUEVTIChFc3NlbnRpYWwgb25seSlcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBMYXlvdXRDb25maWcge1xuICAvKiogQmFzZSBsYXlvdXQgdHlwZSAqL1xuICB0eXBlPzogXCJzdGFja1wiIHwgXCJyb3dcIiB8IFwiZ3JpZFwiIHwgc3RyaW5nO1xuICAvKiogU3BhY2luZyBiZXR3ZWVuIGVsZW1lbnRzICovXG4gIGdhcD86IG51bWJlciB8IHN0cmluZztcbiAgLyoqIEFkZGl0aW9uYWwgQ1NTIGNsYXNzZXMgKi9cbiAgY2xhc3M/OiBzdHJpbmc7XG4gIC8qKiBBbGlnbm1lbnQgb2YgaXRlbXMgYWxvbmcgdGhlIGNyb3NzIGF4aXMgKi9cbiAgYWxpZ24/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiB8IFwic3RyZXRjaFwiO1xuICAvKiogQWxpZ25tZW50IG9mIGl0ZW1zIGFsb25nIHRoZSBtYWluIGF4aXMgKi9cbiAganVzdGlmeT86IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiIHwgXCJiZXR3ZWVuXCIgfCBcImFyb3VuZFwiIHwgXCJldmVubHlcIjtcbiAgLyoqIFdoZXRoZXIgYW5kIGhvdyBpdGVtcyBzaG91bGQgd3JhcCAqL1xuICB3cmFwPzogYm9vbGVhbiB8IFwicmV2ZXJzZVwiIHwgXCJub3dyYXBcIjtcbiAgLyoqIFdoZXRoZXIgcm93IGl0ZW1zIHNob3VsZCBzdGFjayB2ZXJ0aWNhbGx5IG9uIG1vYmlsZSAqL1xuICBtb2JpbGVTdGFjaz86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHJvdyBpdGVtcyBzaG91bGQgc2Nyb2xsIGhvcml6b250YWxseSBvbiBtb2JpbGUgKi9cbiAgbW9iaWxlU2Nyb2xsPzogYm9vbGVhbjtcbiAgLyoqIE51bWJlciBvZiBjb2x1bW5zIG9yIGF1dG9tYXRpYyBzaXppbmcgbWV0aG9kICovXG4gIGNvbHVtbnM/OiBudW1iZXIgfCBcImF1dG8tZml0XCIgfCBcImF1dG8tZmlsbFwiO1xuICAvKiogV2hldGhlciB0byB1c2UgZGVuc2UgcGFja2luZyBhbGdvcml0aG0gZm9yIGdyaWQgKi9cbiAgZGVuc2U/OiBib29sZWFuO1xuICAvKiogV2hldGhlciBncmlkIGl0ZW1zIHNob3VsZCBhZGp1c3QgaGVpZ2h0IGF1dG9tYXRpY2FsbHkgKi9cbiAgYXV0b0hlaWdodD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0SXRlbUNvbmZpZyB7XG4gIC8qKiBDb2x1bW4gd2lkdGggaW4gYSAxMi1jb2x1bW4gZ3JpZCAqL1xuICB3aWR0aD86IG51bWJlcjtcbiAgLyoqIFdpZHRoIG9uIHNtYWxsIHNjcmVlbnMgKi9cbiAgc20/OiBudW1iZXI7XG4gIC8qKiBXaWR0aCBvbiBtZWRpdW0gc2NyZWVucyAqL1xuICBtZD86IG51bWJlcjtcbiAgLyoqIFdpZHRoIG9uIGxhcmdlIHNjcmVlbnMgKi9cbiAgbGc/OiBudW1iZXI7XG4gIC8qKiBXaWR0aCBvbiBleHRyYS1sYXJnZSBzY3JlZW5zICovXG4gIHhsPzogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIGdyaWQgY29sdW1ucyB0byBzcGFuICovXG4gIHNwYW4/OiBudW1iZXI7XG4gIC8qKiBOdW1iZXIgb2YgZ3JpZCByb3dzIHRvIHNwYW4gKi9cbiAgcm93U3Bhbj86IG51bWJlcjtcbiAgLyoqIERpc3BsYXkgb3JkZXIgKi9cbiAgb3JkZXI/OiBudW1iZXIgfCBcImZpcnN0XCIgfCBcImxhc3RcIjtcbiAgLyoqIFNlbGYtYWxpZ25tZW50IHdpdGhpbiBjb250YWluZXIgKi9cbiAgYWxpZ24/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiB8IFwic3RyZXRjaFwiO1xuICAvKiogV2hldGhlciBpdGVtIHNob3VsZCBhdXRvbWF0aWNhbGx5IHNpemUgKi9cbiAgYXV0bz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0T3B0aW9ucyB7XG4gIC8qKiBEZWZhdWx0IGNyZWF0b3IgZnVuY3Rpb24gdG8gdXNlIGlmIG5vdCBzcGVjaWZpZWQgaW4gc2NoZW1hICovXG4gIGNyZWF0b3I/OiBGdW5jdGlvbjtcbiAgLyoqIFdoZXRoZXIgdG8gYXBwbHkgQ1NTIGNsYXNzIHByZWZpeCBAZGVmYXVsdCB0cnVlICovXG4gIHByZWZpeD86IGJvb2xlYW47XG4gIC8qKiBBZGRpdGlvbmFsIG9wdGlvbnMgKi9cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExheW91dFJlc3VsdCB7XG4gIC8qKiBUaGUgcmF3IGxheW91dCBvYmplY3Qgd2l0aCBhbGwgY29tcG9uZW50cyAqL1xuICBsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIC8qKiBSZWZlcmVuY2UgdG8gdGhlIHJvb3QgZWxlbWVudCBmb3IgY29udmVuaWVuY2UgKi9cbiAgZWxlbWVudDogSFRNTEVsZW1lbnQgfCBhbnk7XG4gIC8qKiBGbGF0dGVuZWQgY29tcG9uZW50IG1hcCAqL1xuICBjb21wb25lbnQ6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIC8qKiBHZXRzIGEgY29tcG9uZW50IGJ5IG5hbWUgKi9cbiAgZ2V0KG5hbWU6IHN0cmluZyk6IGFueTtcbiAgLyoqIEdldHMgYWxsIGNvbXBvbmVudHMgaW4gYSBmbGF0dGVuZWQgbWFwICovXG4gIGdldEFsbCgpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAvKiogRGVzdHJveXMgdGhlIGxheW91dCwgY2xlYW5pbmcgdXAgYWxsIGNvbXBvbmVudHMgKi9cbiAgZGVzdHJveSgpOiB2b2lkO1xufVxuXG50eXBlIENvbXBvbmVudExpa2UgPSB7IGVsZW1lbnQ6IEhUTUxFbGVtZW50OyBba2V5OiBzdHJpbmddOiBhbnkgfTtcbnR5cGUgU2NoZW1hSXRlbSA9IEZ1bmN0aW9uIHwgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55PiB8IFNjaGVtYUl0ZW1bXTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQlVJTFQtSU4gT1BUSU1JWkFUSU9OU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEZyYWdtZW50IFBvb2wgZm9yIGVmZmljaWVudCBEb2N1bWVudEZyYWdtZW50IHJldXNlXG4gKiBSZWR1Y2VzIEdDIHByZXNzdXJlIGluIGhpZ2gtZnJlcXVlbmN5IGxheW91dCBjcmVhdGlvbiBzY2VuYXJpb3NcbiAqL1xuY2xhc3MgRnJhZ21lbnRQb29sIHtcbiAgcHJpdmF0ZSBwb29sOiBEb2N1bWVudEZyYWdtZW50W10gPSBbXTtcbiAgcHJpdmF0ZSBtYXhTaXplID0gODsgLy8gT3B0aW1pemVkIHNpemUgZm9yIG1lbW9yeSBlZmZpY2llbmN5XG5cbiAgZ2V0KCk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIHJldHVybiB0aGlzLnBvb2wucG9wKCkgfHwgZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICB9XG5cbiAgcmVsZWFzZShmcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBvb2wubGVuZ3RoIDwgdGhpcy5tYXhTaXplICYmIGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnBvb2wucHVzaChmcmFnbWVudCk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5wb29sLmxlbmd0aCA9IDA7XG4gIH1cbn1cblxuY29uc3QgZnJhZ21lbnRQb29sID0gbmV3IEZyYWdtZW50UG9vbCgpO1xuXG4vKipcbiAqIENsYXNzIG5hbWUgY2FjaGUgZm9yIGxheW91dCBjb25maWd1cmF0aW9uc1xuICogUmVkdWNlcyBzdHJpbmcgb3BlcmF0aW9ucyBieSBjYWNoaW5nIGdlbmVyYXRlZCBjbGFzcyBuYW1lc1xuICovXG5jb25zdCBjbGFzc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuLy8gQ29uZmlndXJhdGlvbiBjb25zdGFudHNcbmNvbnN0IFBSRUZJWCA9IFwibXRybFwiOyAvLyBUT0RPOiBNYWtlIHRoaXMgY29uZmlndXJhYmxlXG5jb25zdCBQUkVGSVhfV0lUSF9EQVNIID0gYCR7UFJFRklYfS1gO1xuXG4vKipcbiAqIEdldHMgYSBjYWNoZWQgY2xhc3MgbmFtZSBmb3IgbGF5b3V0IGNvbmZpZ3VyYXRpb25cbiAqIE9wdGltaXplZCBmb3IgZGlmZmVyZW50IGNsYXNzIG5hbWluZyBwYXR0ZXJuc1xuICovXG5mdW5jdGlvbiBnZXRDYWNoZWRDbGFzc05hbWUoXG4gIHR5cGU6IHN0cmluZyxcbiAgcHJvcGVydHk6IHN0cmluZyxcbiAgdmFsdWU6IHN0cmluZyB8IG51bWJlcixcbik6IHN0cmluZyB7XG4gIGNvbnN0IGtleSA9IGAke3R5cGV9LSR7cHJvcGVydHl9LSR7dmFsdWV9YDtcbiAgaWYgKCFjbGFzc0NhY2hlLmhhcyhrZXkpKSB7XG4gICAgaWYgKHR5cGUgPT09IFwiaXRlbVwiKSB7XG4gICAgICBjbGFzc0NhY2hlLnNldChcbiAgICAgICAga2V5LFxuICAgICAgICBwcm9wZXJ0eSA9PT0gXCJcIlxuICAgICAgICAgID8gYGxheW91dF9faXRlbS0tJHt2YWx1ZX1gXG4gICAgICAgICAgOiBgbGF5b3V0X19pdGVtLS0ke3Byb3BlcnR5fS0ke3ZhbHVlfWAsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGb3IgbGF5b3V0IGNsYXNzZXMsIGFsaWduIHVzZXMgbGF5b3V0LS17dHlwZX0te3ZhbHVlfVxuICAgICAgLy8gYnV0IGp1c3RpZnkgYW5kIG90aGVycyB1c2UgbGF5b3V0LS17dHlwZX0te3Byb3BlcnR5fS17dmFsdWV9XG4gICAgICBpZiAocHJvcGVydHkgPT09IFwiYWxpZ25cIikge1xuICAgICAgICBjbGFzc0NhY2hlLnNldChrZXksIGBsYXlvdXQtLSR7dHlwZX0tJHt2YWx1ZX1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsYXNzQ2FjaGUuc2V0KGtleSwgYGxheW91dC0tJHt0eXBlfS0ke3Byb3BlcnR5fS0ke3ZhbHVlfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY2xhc3NDYWNoZS5nZXQoa2V5KSE7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE9QVElNSVpFRCBVVElMSVRJRVNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBhIGNvbXBvbmVudCBvYmplY3QgKGhhcyBhbiBlbGVtZW50IHByb3BlcnR5KVxuICovXG5mdW5jdGlvbiBpc0NvbXBvbmVudCh2YWx1ZTogYW55KTogdmFsdWUgaXMgQ29tcG9uZW50TGlrZSB7XG4gIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgXCJlbGVtZW50XCIgaW4gdmFsdWU7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRvY3VtZW50IGZyYWdtZW50IHVzaW5nIHBvb2xpbmcgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICovXG5mdW5jdGlvbiBjcmVhdGVGcmFnbWVudCgpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgcmV0dXJuIGZyYWdtZW50UG9vbC5nZXQoKTtcbn1cblxuLyoqXG4gKiBSZWxlYXNlcyBhIGZyYWdtZW50IGJhY2sgdG8gdGhlIHBvb2wgZm9yIHJldXNlXG4gKi9cbmZ1bmN0aW9uIHJlbGVhc2VGcmFnbWVudChmcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCk6IHZvaWQge1xuICBmcmFnbWVudFBvb2wucmVsZWFzZShmcmFnbWVudCk7XG59XG5cbi8qKlxuICogT3B0aW1pemVkIGNsYXNzIHByb2Nlc3Npbmcgd2l0aCBtaW5pbWFsIHN0cmluZyBvcGVyYXRpb25zXG4gKiBIYW5kbGVzIGFycmF5cywgc3RyaW5ncywgY2xhc3NOYW1lIGFsaWFzZXMsIGFuZCByYXdDbGFzcyBlZmZpY2llbnRseVxuICovXG5mdW5jdGlvbiBwcm9jZXNzQ2xhc3NOYW1lcyhcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PixcbiAgc2tpcFByZWZpeCA9IGZhbHNlLFxuKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIGlmICghb3B0aW9ucykgcmV0dXJuIG9wdGlvbnM7XG5cbiAgY29uc3QgaGFzUmF3Q2xhc3MgPSBvcHRpb25zLnJhd0NsYXNzO1xuICBjb25zdCBoYXNSZWd1bGFyQ2xhc3MgPSBvcHRpb25zLmNsYXNzIHx8IG9wdGlvbnMuY2xhc3NOYW1lO1xuXG4gIC8vIEZhc3QgcGF0aDogbm8gY2xhc3MgcHJvcGVydGllcyBhdCBhbGxcbiAgaWYgKCFoYXNSYXdDbGFzcyAmJiAhaGFzUmVndWxhckNsYXNzKSByZXR1cm4gb3B0aW9ucztcblxuICAvLyBGYXN0IHBhdGg6IG9ubHkgcmF3Q2xhc3MgYW5kIHNraXBwaW5nIHByZWZpeCAobW9zdCBjb21tb24gcmF3Q2xhc3Mgc2NlbmFyaW8pXG4gIGlmIChoYXNSYXdDbGFzcyAmJiAhaGFzUmVndWxhckNsYXNzICYmIHNraXBQcmVmaXgpIHtcbiAgICBjb25zdCBwcm9jZXNzZWQgPSB7IC4uLm9wdGlvbnMgfTtcbiAgICBkZWxldGUgcHJvY2Vzc2VkLnJhd0NsYXNzO1xuXG4gICAgLy8gRGlyZWN0IGFzc2lnbm1lbnQgZm9yIHNpbXBsZSBzdHJpbmdcbiAgICBpZiAodHlwZW9mIGhhc1Jhd0NsYXNzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBwcm9jZXNzZWQuY2xhc3MgPSBoYXNSYXdDbGFzcztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSGFuZGxlIGFycmF5IGNhc2VcbiAgICAgIHByb2Nlc3NlZC5jbGFzcyA9IGhhc1Jhd0NsYXNzLmpvaW4oXCIgXCIpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvY2Vzc2VkO1xuICB9XG5cbiAgLy8gRnVsbCBwcm9jZXNzaW5nIHBhdGggKG9ubHkgd2hlbiBuZWVkZWQpXG4gIGNvbnN0IHByb2Nlc3NlZCA9IHsgLi4ub3B0aW9ucyB9O1xuICBsZXQgZmluYWxDbGFzc2VzID0gXCJcIjtcblxuICAvLyBIYW5kbGUgcHJlZml4ZWQgY2xhc3NlcyBvbmx5IGlmIG5vdCBza2lwcGluZyBwcmVmaXhcbiAgaWYgKCFza2lwUHJlZml4ICYmIGhhc1JlZ3VsYXJDbGFzcykge1xuICAgIGxldCBwcmVmaXhlZFN0cmluZyA9IFwiXCI7XG5cbiAgICBpZiAocHJvY2Vzc2VkLmNsYXNzKSB7XG4gICAgICBwcmVmaXhlZFN0cmluZyArPSBBcnJheS5pc0FycmF5KHByb2Nlc3NlZC5jbGFzcylcbiAgICAgICAgPyBwcm9jZXNzZWQuY2xhc3Muam9pbihcIiBcIilcbiAgICAgICAgOiBwcm9jZXNzZWQuY2xhc3M7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzZWQuY2xhc3NOYW1lKSB7XG4gICAgICBwcmVmaXhlZFN0cmluZyArPSAocHJlZml4ZWRTdHJpbmcgPyBcIiBcIiA6IFwiXCIpICsgcHJvY2Vzc2VkLmNsYXNzTmFtZTtcbiAgICB9XG5cbiAgICBpZiAocHJlZml4ZWRTdHJpbmcpIHtcbiAgICAgIGZpbmFsQ2xhc3NlcyA9IHByZWZpeGVkU3RyaW5nXG4gICAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLm1hcCgoY2xzKSA9PlxuICAgICAgICAgIGNscy5zdGFydHNXaXRoKFBSRUZJWF9XSVRIX0RBU0gpID8gY2xzIDogUFJFRklYX1dJVEhfREFTSCArIGNscyxcbiAgICAgICAgKVxuICAgICAgICAuam9pbihcIiBcIik7XG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIHJhd0NsYXNzIChhbHdheXMgcHJvY2Vzc2VkIHdoZW4gcHJlc2VudClcbiAgaWYgKGhhc1Jhd0NsYXNzKSB7XG4gICAgY29uc3QgcmF3U3RyaW5nID0gQXJyYXkuaXNBcnJheShoYXNSYXdDbGFzcylcbiAgICAgID8gaGFzUmF3Q2xhc3MuZmlsdGVyKEJvb2xlYW4pLmpvaW4oXCIgXCIpXG4gICAgICA6IGhhc1Jhd0NsYXNzO1xuXG4gICAgZmluYWxDbGFzc2VzICs9IChmaW5hbENsYXNzZXMgPyBcIiBcIiA6IFwiXCIpICsgcmF3U3RyaW5nO1xuICB9XG5cbiAgaWYgKGZpbmFsQ2xhc3Nlcykge1xuICAgIHByb2Nlc3NlZC5jbGFzcyA9IGZpbmFsQ2xhc3NlcztcbiAgfVxuXG4gIC8vIENsZWFuIHVwIGluIG9uZSBvcGVyYXRpb25cbiAgZGVsZXRlIHByb2Nlc3NlZC5jbGFzc05hbWU7XG4gIGRlbGV0ZSBwcm9jZXNzZWQucmF3Q2xhc3M7XG5cbiAgcmV0dXJuIHByb2Nlc3NlZDtcbn1cblxuLyoqXG4gKiBPcHRpbWl6ZWQgcGFyYW1ldGVyIGV4dHJhY3Rpb24gZm9yIGFycmF5IHNjaGVtYXNcbiAqIFJlZHVjZXMgbXVsdGlwbGUgYXJyYXkgbG9va3VwcyB3aXRoIGJhdGNoIHByb2Nlc3NpbmdcbiAqL1xuaW50ZXJmYWNlIEV4dHJhY3RlZFBhcmFtZXRlcnMge1xuICBjcmVhdG9yOiBGdW5jdGlvbjtcbiAgbmFtZT86IHN0cmluZztcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgY29uc3VtZWQ6IG51bWJlcjtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFBhcmFtZXRlcnMoXG4gIHNjaGVtYTogU2NoZW1hSXRlbVtdLFxuICBzdGFydEluZGV4OiBudW1iZXIsXG4gIGRlZmF1bHRDcmVhdG9yOiBGdW5jdGlvbixcbik6IEV4dHJhY3RlZFBhcmFtZXRlcnMge1xuICBjb25zdCBpdGVtcyA9IHNjaGVtYS5zbGljZShzdGFydEluZGV4LCBzdGFydEluZGV4ICsgMyk7XG4gIGxldCBjcmVhdG9yLCBuYW1lLCBvcHRpb25zO1xuICBsZXQgY29uc3VtZWQgPSAxO1xuXG4gIGNvbnN0IFtmaXJzdCwgc2Vjb25kLCB0aGlyZF0gPSBpdGVtcztcblxuICBpZiAodHlwZW9mIGZpcnN0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjcmVhdG9yID0gZmlyc3Q7XG4gICAgaWYgKHR5cGVvZiBzZWNvbmQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG5hbWUgPSBzZWNvbmQ7XG4gICAgICBjb25zdW1lZCA9IDI7XG4gICAgICBpZiAoaXNPYmplY3QodGhpcmQpKSB7XG4gICAgICAgIG9wdGlvbnMgPSB0aGlyZDtcbiAgICAgICAgY29uc3VtZWQgPSAzO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNPYmplY3Qoc2Vjb25kKSkge1xuICAgICAgb3B0aW9ucyA9IHNlY29uZDtcbiAgICAgIGNvbnN1bWVkID0gMjtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIGZpcnN0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgY3JlYXRvciA9IGRlZmF1bHRDcmVhdG9yO1xuICAgIG5hbWUgPSBmaXJzdDtcbiAgICBpZiAoaXNPYmplY3Qoc2Vjb25kKSkge1xuICAgICAgb3B0aW9ucyA9IHNlY29uZDtcbiAgICAgIGNvbnN1bWVkID0gMjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QoZmlyc3QpKSB7XG4gICAgY3JlYXRvciA9IGRlZmF1bHRDcmVhdG9yO1xuICAgIG9wdGlvbnMgPSBmaXJzdDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY3JlYXRvcjogY3JlYXRvciB8fCBkZWZhdWx0Q3JlYXRvcixcbiAgICBuYW1lLFxuICAgIG9wdGlvbnM6IChvcHRpb25zIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNvbnN1bWVkLFxuICB9O1xufVxuXG4vKipcbiAqIFNpbXBsZSBvYmplY3QgdHlwZSBjaGVja1xuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBET00gVVRJTElUSUVTIChTaW1wbGlmaWVkKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFNpbXBsZSBET00gZWxlbWVudCBjcmVhdGlvblxuICovXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSk6IEhUTUxFbGVtZW50IHtcbiAgY29uc3QgdGFnID0gb3B0aW9ucy50YWcgfHwgXCJkaXZcIjtcbiAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcblxuICBpZiAob3B0aW9ucy5jbGFzcykge1xuICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gb3B0aW9ucy5jbGFzcztcbiAgfVxuXG4gIGlmIChvcHRpb25zLnN0eWxlKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnN0eWxlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcInN0eWxlXCIsIG9wdGlvbnMuc3R5bGUpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMuc3R5bGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgb3B0aW9ucy5zdHlsZSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdGlvbnMudGV4dENvbnRlbnQpIHtcbiAgICBlbGVtZW50LnRleHRDb250ZW50ID0gb3B0aW9ucy50ZXh0Q29udGVudDtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnRleHQpIHtcbiAgICBlbGVtZW50LnRleHRDb250ZW50ID0gb3B0aW9ucy50ZXh0O1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5cbi8qKlxuICogQWRkcyBhIENTUyBjbGFzcyB0byBhbiBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGFkZENsYXNzKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjbGFzc05hbWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZWxlbWVudCAmJiBjbGFzc05hbWUpIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBlbGVtZW50IGhhcyBhIENTUyBjbGFzc1xuICovXG5mdW5jdGlvbiBoYXNDbGFzcyhlbGVtZW50OiBIVE1MRWxlbWVudCwgY2xhc3NOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGVsZW1lbnQgJiYgZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVU5JRklFRCBDT01QT05FTlQgQ1JFQVRJT04gKHdpdGggZGVzdHJ1Y3R1cmluZyBvcHRpbWl6YXRpb24pXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbXBvbmVudCBpbnN0YW5jZSB3aXRoIG9wdGltaXplZCBvcHRpb24gcHJvY2Vzc2luZ1xuICogVXNlcyBkZXN0cnVjdHVyaW5nIGZvciBjbGVhbmVyIHNlcGFyYXRpb24gb2YgY29uY2VybnNcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoXG4gIENvbXBvbmVudDogYW55LFxuICBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4pOiBhbnkge1xuICB0cnkge1xuICAgIC8vIERlc3RydWN0dXJlIHNwZWNpYWwgY29uZmlncyBpbiBvbmUgb3BlcmF0aW9uXG4gICAgY29uc3Qge1xuICAgICAgbGF5b3V0OiBsYXlvdXRDb25maWcsXG4gICAgICBsYXlvdXRJdGVtOiBsYXlvdXRJdGVtQ29uZmlnLFxuICAgICAgc3R5bGU6IHN0eWxlQ29uZmlnLFxuICAgICAgYXR0cmlidXRlczogYXR0cmlidXRlc0NvbmZpZyxcbiAgICAgIGV2ZW50czogZXZlbnRzQ29uZmlnLFxuICAgICAgZXZlbnQsIC8vIExlZ2FjeSBzdXBwb3J0XG4gICAgICAuLi5jbGVhbk9wdGlvbnNcbiAgICB9ID0gb3B0aW9ucztcblxuICAgIC8vIFVzZSBldmVudHMgb3ZlciBldmVudCAoZXZlbnRzIGlzIHByZWZlcnJlZClcbiAgICBjb25zdCBmaW5hbEV2ZW50c0NvbmZpZyA9IGV2ZW50c0NvbmZpZyB8fCBldmVudDtcblxuICAgIC8vIElmIHN0eWxlIGlzIGEgc3RyaW5nLCBhbHdheXMgcGFzcyBpdCB0aHJvdWdoIHRvIHRoZSBjb21wb25lbnRcbiAgICBpZiAoc3R5bGVDb25maWcgJiYgdHlwZW9mIHN0eWxlQ29uZmlnID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjbGVhbk9wdGlvbnMuc3R5bGUgPSBzdHlsZUNvbmZpZztcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgY29tcG9uZW50XG4gICAgY29uc3QgaXNDbGFzcyA9XG4gICAgICB0eXBlb2YgQ29tcG9uZW50ID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoQ29tcG9uZW50LCBcInByb3RvdHlwZVwiKT8ud3JpdGFibGUgPT09XG4gICAgICAgIGZhbHNlO1xuXG4gICAgY29uc3QgY29tcG9uZW50ID0gaXNDbGFzc1xuICAgICAgPyBuZXcgQ29tcG9uZW50KGNsZWFuT3B0aW9ucylcbiAgICAgIDogQ29tcG9uZW50KGNsZWFuT3B0aW9ucyk7XG5cbiAgICAvLyBBcHBseSBjb25maWd1cmF0aW9ucyBpZiBjb21wb25lbnQgaGFzIGVsZW1lbnRcbiAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICBjb25zdCBlbGVtZW50ID1cbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQgfHxcbiAgICAgICAgKGNvbXBvbmVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gY29tcG9uZW50IDogbnVsbCk7XG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAvLyBBcHBseSBsYXlvdXQgY2xhc3Nlc1xuICAgICAgICBpZiAobGF5b3V0Q29uZmlnKSBhcHBseUxheW91dENsYXNzZXMoZWxlbWVudCwgbGF5b3V0Q29uZmlnKTtcblxuICAgICAgICAvLyBBcHBseSBsYXlvdXQgaXRlbSBjbGFzc2VzXG4gICAgICAgIGlmIChsYXlvdXRJdGVtQ29uZmlnKSBhcHBseUxheW91dEl0ZW1DbGFzc2VzKGVsZW1lbnQsIGxheW91dEl0ZW1Db25maWcpO1xuXG4gICAgICAgIC8vIEFwcGx5IHN0eWxlXG4gICAgICAgIGlmIChzdHlsZUNvbmZpZyAmJiB0eXBlb2Ygc3R5bGVDb25maWcgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlQ29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGx5IGF0dHJpYnV0ZXNcbiAgICAgICAgaWYgKGF0dHJpYnV0ZXNDb25maWcgJiYgdHlwZW9mIGF0dHJpYnV0ZXNDb25maWcgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzQ29uZmlnKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBldmVudHNcbiAgICAgICAgaWYgKGZpbmFsRXZlbnRzQ29uZmlnICYmIHR5cGVvZiBmaW5hbEV2ZW50c0NvbmZpZyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpbmFsRXZlbnRzQ29uZmlnKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBldmVudERlZiBvZiBmaW5hbEV2ZW50c0NvbmZpZykge1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShldmVudERlZikgJiYgZXZlbnREZWYubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbZXZlbnROYW1lLCBoYW5kbGVyXSA9IGV2ZW50RGVmO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgIHR5cGVvZiBldmVudE5hbWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICAgIHR5cGVvZiBoYW5kbGVyID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtldmVudE5hbWUsIGhhbmRsZXJdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgICAgICAgICBmaW5hbEV2ZW50c0NvbmZpZyxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGNyZWF0aW5nIGNvbXBvbmVudCBpbnN0YW5jZTpcIiwgZXJyb3IpO1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIElOVEVHUkFURUQgTEFZT1VUIENPTkZJR1VSQVRJT04gKHdpdGggY2FjaGluZylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBBcHBsaWVzIGxheW91dCBjbGFzc2VzIGJhc2VkIG9uIGNvbmZpZ3VyYXRpb25cbiAqIFVzZXMgaW50ZWdyYXRlZCBjYWNoaW5nIGZvciBvcHRpbWFsIHBlcmZvcm1hbmNlXG4gKi9cbmZ1bmN0aW9uIGFwcGx5TGF5b3V0Q2xhc3NlcyhcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gIGxheW91dENvbmZpZzogTGF5b3V0Q29uZmlnLFxuKTogdm9pZCB7XG4gIGlmICghZWxlbWVudCB8fCAhbGF5b3V0Q29uZmlnKSByZXR1cm47XG5cbiAgLy8gQXBwbHkgYmFzZSBsYXlvdXQgdHlwZVxuICBpZiAobGF5b3V0Q29uZmlnLnR5cGUpIHtcbiAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tJHtsYXlvdXRDb25maWcudHlwZX1gKTtcbiAgfVxuXG4gIC8vIEFwcGx5IHByb3BlcnRpZXMgd2l0aCBjYWNoaW5nXG4gIGNvbnN0IGxheW91dFR5cGUgPSBsYXlvdXRDb25maWcudHlwZSB8fCBnZXRMYXlvdXRUeXBlKGVsZW1lbnQpO1xuICBpZiAobGF5b3V0VHlwZSkge1xuICAgIGlmIChsYXlvdXRDb25maWcuZ2FwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICtcbiAgICAgICAgICBnZXRDYWNoZWRDbGFzc05hbWUobGF5b3V0VHlwZSwgXCJnYXBcIiwgbGF5b3V0Q29uZmlnLmdhcCksXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobGF5b3V0Q29uZmlnLmFsaWduKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArXG4gICAgICAgICAgZ2V0Q2FjaGVkQ2xhc3NOYW1lKGxheW91dFR5cGUsIFwiYWxpZ25cIiwgbGF5b3V0Q29uZmlnLmFsaWduKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChsYXlvdXRDb25maWcuanVzdGlmeSkge1xuICAgICAgYWRkQ2xhc3MoXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIFBSRUZJWF9XSVRIX0RBU0ggK1xuICAgICAgICAgIGdldENhY2hlZENsYXNzTmFtZShsYXlvdXRUeXBlLCBcImp1c3RpZnlcIiwgbGF5b3V0Q29uZmlnLmp1c3RpZnkpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBHcmlkLXNwZWNpZmljIHByb3BlcnRpZXNcbiAgaWYgKGxheW91dENvbmZpZy50eXBlID09PSBcImdyaWRcIiB8fCBnZXRMYXlvdXRUeXBlKGVsZW1lbnQpID09PSBcImdyaWRcIikge1xuICAgIGlmICh0eXBlb2YgbGF5b3V0Q29uZmlnLmNvbHVtbnMgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICtcbiAgICAgICAgICBnZXRDYWNoZWRDbGFzc05hbWUoXCJncmlkXCIsIFwiY29sc1wiLCBsYXlvdXRDb25maWcuY29sdW1ucyksXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAobGF5b3V0Q29uZmlnLmNvbHVtbnMgPT09IFwiYXV0by1maWxsXCIpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiZ3JpZFwiLCBcImZpbGxcIiwgXCJhdXRvXCIpLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGxheW91dENvbmZpZy5jb2x1bW5zID09PSBcImF1dG8tZml0XCIpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiZ3JpZFwiLCBcImNvbHNcIiwgXCJhdXRvLWZpdFwiKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChsYXlvdXRDb25maWcuZGVuc2UpXG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tZ3JpZC1kZW5zZWApO1xuICAgIGlmIChsYXlvdXRDb25maWcuYXV0b0hlaWdodClcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1ncmlkLWF1dG8taGVpZ2h0YCk7XG4gIH1cblxuICAvLyBSb3ctc3BlY2lmaWMgcHJvcGVydGllc1xuICBpZiAobGF5b3V0Q29uZmlnLnR5cGUgPT09IFwicm93XCIgfHwgZ2V0TGF5b3V0VHlwZShlbGVtZW50KSA9PT0gXCJyb3dcIikge1xuICAgIGlmIChsYXlvdXRDb25maWcud3JhcCA9PT0gZmFsc2UgfHwgbGF5b3V0Q29uZmlnLndyYXAgPT09IFwibm93cmFwXCIpIHtcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3ctbm93cmFwYCk7XG4gICAgfSBlbHNlIGlmIChsYXlvdXRDb25maWcud3JhcCA9PT0gXCJyZXZlcnNlXCIpIHtcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3ctd3JhcC1yZXZlcnNlYCk7XG4gICAgfVxuICAgIGlmIChsYXlvdXRDb25maWcubW9iaWxlU3RhY2spXG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93LW1vYmlsZS1zdGFja2ApO1xuICAgIGlmIChsYXlvdXRDb25maWcubW9iaWxlU2Nyb2xsKVxuICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLXJvdy1tb2JpbGUtc2Nyb2xsYCk7XG4gIH1cblxuICAvLyBDdXN0b20gY2xhc3Nlc1xuICBpZiAobGF5b3V0Q29uZmlnLmNsYXNzKSB7XG4gICAgbGF5b3V0Q29uZmlnLmNsYXNzXG4gICAgICAuc3BsaXQoXCIgXCIpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuZm9yRWFjaCgoY2xzKSA9PiBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xzKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBBcHBsaWVzIGxheW91dCBpdGVtIGNsYXNzZXMgYmFzZWQgb24gY29uZmlndXJhdGlvblxuICogVXNlcyBpbnRlZ3JhdGVkIGNhY2hpbmcgZm9yIG9wdGltYWwgcGVyZm9ybWFuY2VcbiAqL1xuZnVuY3Rpb24gYXBwbHlMYXlvdXRJdGVtQ2xhc3NlcyhcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gIGl0ZW1Db25maWc6IExheW91dEl0ZW1Db25maWcsXG4pOiB2b2lkIHtcbiAgaWYgKCFlbGVtZW50IHx8ICFpdGVtQ29uZmlnKSByZXR1cm47XG5cbiAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXRfX2l0ZW1gKTtcblxuICAvLyBXaWR0aCBhbmQgcmVzcG9uc2l2ZSBjbGFzc2VzIHdpdGggY2FjaGluZ1xuICBpZiAoaXRlbUNvbmZpZy53aWR0aCAmJiBpdGVtQ29uZmlnLndpZHRoID49IDEgJiYgaXRlbUNvbmZpZy53aWR0aCA8PSAxMikge1xuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwiXCIsIGl0ZW1Db25maWcud2lkdGgpLFxuICAgICk7XG4gIH1cbiAgaWYgKGl0ZW1Db25maWcuc20pXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJzbVwiLCBpdGVtQ29uZmlnLnNtKSxcbiAgICApO1xuICBpZiAoaXRlbUNvbmZpZy5tZClcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcIm1kXCIsIGl0ZW1Db25maWcubWQpLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLmxnKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwibGdcIiwgaXRlbUNvbmZpZy5sZyksXG4gICAgKTtcbiAgaWYgKGl0ZW1Db25maWcueGwpXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJ4bFwiLCBpdGVtQ29uZmlnLnhsKSxcbiAgICApO1xuXG4gIC8vIEdyaWQgc3BhbiBjbGFzc2VzXG4gIGlmIChpdGVtQ29uZmlnLnNwYW4pXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJzcGFuXCIsIGl0ZW1Db25maWcuc3BhbiksXG4gICAgKTtcbiAgaWYgKGl0ZW1Db25maWcucm93U3BhbilcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICtcbiAgICAgICAgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcInJvdy1zcGFuXCIsIGl0ZW1Db25maWcucm93U3BhbiksXG4gICAgKTtcblxuICAvLyBPcmRlciBhbmQgYWxpZ25tZW50XG4gIGlmIChpdGVtQ29uZmlnLm9yZGVyKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwib3JkZXJcIiwgaXRlbUNvbmZpZy5vcmRlciksXG4gICAgKTtcbiAgaWYgKGl0ZW1Db25maWcuYWxpZ24pXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJzZWxmXCIsIGl0ZW1Db25maWcuYWxpZ24pLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLmF1dG8pXG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXRfX2l0ZW0tLWF1dG9gKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBsYXlvdXQgdHlwZSBmcm9tIGVsZW1lbnQgY2xhc3Nlc1xuICovXG5mdW5jdGlvbiBnZXRMYXlvdXRUeXBlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogc3RyaW5nIHtcbiAgcmV0dXJuIGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1zdGFja2ApXG4gICAgPyBcInN0YWNrXCJcbiAgICA6IGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3dgKVxuICAgICAgPyBcInJvd1wiXG4gICAgICA6IGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1ncmlkYClcbiAgICAgICAgPyBcImdyaWRcIlxuICAgICAgICA6IFwiXCI7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFVOSUZJRUQgU0NIRU1BIFBST0NFU1NPUlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBQcm9jZXNzZXMgYXJyYXktYmFzZWQgc2NoZW1hIGRlZmluaXRpb25zXG4gKiBPcHRpbWl6ZWQgd2l0aCBwYXJhbWV0ZXIgZXh0cmFjdGlvbiBhbmQgaW50ZWdyYXRlZCBjb25maWd1cmF0aW9uXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NBcnJheVNjaGVtYShcbiAgc2NoZW1hOiBTY2hlbWFJdGVtW10gfCBhbnksXG4gIHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGwsXG4gIGxldmVsOiBudW1iZXIgPSAwLFxuICBvcHRpb25zOiBMYXlvdXRPcHRpb25zID0ge30sXG4pOiBMYXlvdXRSZXN1bHQge1xuICBsZXZlbCsrO1xuICBjb25zdCBsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgY29uc3QgY29tcG9uZW50czogQXJyYXk8W3N0cmluZywgYW55XT4gPSBbXTtcbiAgY29uc3QgZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudCgpO1xuICBsZXQgY29tcG9uZW50ID0gbnVsbDtcblxuICBpZiAoIUFycmF5LmlzQXJyYXkoc2NoZW1hKSkge1xuICAgIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbiAgfVxuXG4gIGNvbnN0IGRlZmF1bHRDcmVhdG9yID0gKG9wdGlvbnMgYXMgYW55KS5jcmVhdG9yIHx8IGNyZWF0ZUVsZW1lbnQ7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlbWEubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBpdGVtID0gc2NoZW1hW2ldO1xuICAgIGlmICghaXRlbSkgY29udGludWU7XG5cbiAgICAvLyBIYW5kbGUgbmVzdGVkIGFycmF5c1xuICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBjb21wb25lbnQgfHwgcGFyZW50RWxlbWVudDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHByb2Nlc3NBcnJheVNjaGVtYShpdGVtLCBjb250YWluZXIsIGxldmVsLCBvcHRpb25zKTtcbiAgICAgIC8vIE1lcmdlIG5lc3RlZCBjb21wb25lbnRzIGFycmF5IGluc3RlYWQgb2Ygb3ZlcndyaXRpbmdcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdC5sYXlvdXQuY29tcG9uZW50cykpIHtcbiAgICAgICAgY29tcG9uZW50cy5wdXNoKC4uLnJlc3VsdC5sYXlvdXQuY29tcG9uZW50cyk7XG4gICAgICAgIGRlbGV0ZSByZXN1bHQubGF5b3V0LmNvbXBvbmVudHM7XG4gICAgICB9XG4gICAgICBPYmplY3QuYXNzaWduKGxheW91dCwgcmVzdWx0LmxheW91dCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBVc2Ugb3B0aW1pemVkIHBhcmFtZXRlciBleHRyYWN0aW9uXG4gICAgY29uc3Qge1xuICAgICAgY3JlYXRvcixcbiAgICAgIG5hbWUsXG4gICAgICBvcHRpb25zOiBpdGVtT3B0aW9ucyxcbiAgICAgIGNvbnN1bWVkLFxuICAgIH0gPSBleHRyYWN0UGFyYW1ldGVycyhzY2hlbWEsIGksIGRlZmF1bHRDcmVhdG9yKTtcblxuICAgIGlmICghY3JlYXRvcikge1xuICAgICAgY29uc29sZS53YXJuKFwiU2tpcHBpbmcgdW5zdXBwb3J0ZWQgaXRlbSB0eXBlOlwiLCBpdGVtKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgdG8gZGl2IGZvciBjcmVhdGVFbGVtZW50XG4gICAgaWYgKGNyZWF0b3IgPT09IGNyZWF0ZUVsZW1lbnQgJiYgIShcInRhZ1wiIGluIGl0ZW1PcHRpb25zKSkge1xuICAgICAgaXRlbU9wdGlvbnMudGFnID0gXCJkaXZcIjtcbiAgICB9XG5cbiAgICAvLyBBZHZhbmNlIGluZGV4IGJ5IGNvbnN1bWVkIGl0ZW1zIG1pbnVzIDEgKGxvb3AgaW5jcmVtZW50IGhhbmRsZXMgdGhlICsxKVxuICAgIGkgKz0gY29uc3VtZWQgLSAxO1xuXG4gICAgLy8gUHJvY2VzcyBvcHRpb25zIHdpdGggcHJlZml4IC0gb3B0aW1pemVkIGRlY2lzaW9uIGxvZ2ljXG4gICAgY29uc3Qgc2hvdWxkQXBwbHlQcmVmaXggPVxuICAgICAgXCJwcmVmaXhcIiBpbiBpdGVtT3B0aW9ucyA/IGl0ZW1PcHRpb25zLnByZWZpeCA6IG9wdGlvbnMucHJlZml4ICE9PSBmYWxzZTtcblxuICAgIC8vIEZhc3QgcGF0aDogcHJvY2VzcyBvbmx5IHdoZW4gbmVlZGVkXG4gICAgY29uc3QgcHJvY2Vzc2VkT3B0aW9ucyA9XG4gICAgICBzaG91bGRBcHBseVByZWZpeCB8fCBpdGVtT3B0aW9ucy5yYXdDbGFzc1xuICAgICAgICA/IHByb2Nlc3NDbGFzc05hbWVzKGl0ZW1PcHRpb25zLCAhc2hvdWxkQXBwbHlQcmVmaXgpXG4gICAgICAgIDogaXRlbU9wdGlvbnM7IC8vIE5vIGNvcHkgbmVlZGVkIGlmIG5vIHByb2Nlc3NpbmdcblxuICAgIC8vIEFkZCBuYW1lIHRvIG9wdGlvbnMgaWYgbmVlZGVkXG4gICAgaWYgKFxuICAgICAgbmFtZSAmJlxuICAgICAgIShcIm5hbWVcIiBpbiBwcm9jZXNzZWRPcHRpb25zKSAmJlxuICAgICAgIShjcmVhdG9yID09PSBjcmVhdGVFbGVtZW50IHx8IChjcmVhdG9yIGFzIGFueSkuaXNFbGVtZW50KVxuICAgICkge1xuICAgICAgcHJvY2Vzc2VkT3B0aW9ucy5uYW1lID0gbmFtZTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgY29tcG9uZW50XG4gICAgY29tcG9uZW50ID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoY3JlYXRvciwgcHJvY2Vzc2VkT3B0aW9ucyk7XG4gICAgY29uc3QgZWxlbWVudCA9IGlzQ29tcG9uZW50KGNvbXBvbmVudCkgPyBjb21wb25lbnQuZWxlbWVudCA6IGNvbXBvbmVudDtcblxuICAgIGlmIChsZXZlbCA9PT0gMSkgbGF5b3V0LmVsZW1lbnQgPSBlbGVtZW50O1xuICAgIGlmIChuYW1lKSB7XG4gICAgICBsYXlvdXRbbmFtZV0gPSBjb21wb25lbnQ7XG4gICAgICBjb21wb25lbnRzLnB1c2goW25hbWUsIGNvbXBvbmVudF0pO1xuICAgIH1cblxuICAgIC8vIEFwcGVuZCB0byBET01cbiAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICBpZiAoXCJpbnNlcnRcIiBpbiBjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudC5pbnNlcnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjb21wb25lbnQuaW5zZXJ0KGZyYWdtZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50RWxlbWVudCkge1xuICAgICAgICBjb21wb25lbnQuX2NvbnRhaW5lciA9IHBhcmVudEVsZW1lbnQ7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBcIm9uSW5zZXJ0ZWRcIiBpbiBjb21wb25lbnQgJiZcbiAgICAgICAgICB0eXBlb2YgY29tcG9uZW50Lm9uSW5zZXJ0ZWQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICApIHtcbiAgICAgICAgICBjb21wb25lbnQub25JbnNlcnRlZChwYXJlbnRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEFwcGVuZCBmcmFnbWVudCB0byBwYXJlbnRcbiAgaWYgKHBhcmVudEVsZW1lbnQgJiYgZnJhZ21lbnQuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgY29uc3Qgd3JhcHBlciA9IGlzQ29tcG9uZW50KHBhcmVudEVsZW1lbnQpXG4gICAgICA/IHBhcmVudEVsZW1lbnQuZWxlbWVudFxuICAgICAgOiBwYXJlbnRFbGVtZW50O1xuICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpO1xuICB9XG5cbiAgLy8gUmVsZWFzZSBmcmFnbWVudCBiYWNrIHRvIHBvb2xcbiAgcmVsZWFzZUZyYWdtZW50KGZyYWdtZW50KTtcblxuICBsYXlvdXQuY29tcG9uZW50cyA9IGNvbXBvbmVudHM7XG4gIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgb2JqZWN0LWJhc2VkIHNjaGVtYSBkZWZpbml0aW9uc1xuICogU2ltcGxpZmllZCBhbmQgb3B0aW1pemVkIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc09iamVjdFNjaGVtYShcbiAgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgc3RyaW5nLFxuICBwYXJlbnRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsLFxuICBvcHRpb25zOiBMYXlvdXRPcHRpb25zID0ge30sXG4pOiBMYXlvdXRSZXN1bHQge1xuICBjb25zdCBsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgY29uc3QgZGVmYXVsdENyZWF0b3IgPSBvcHRpb25zLmNyZWF0b3IgfHwgY3JlYXRlRWxlbWVudDtcblxuICAvLyBIYW5kbGUgcm9vdCBlbGVtZW50IGNyZWF0aW9uXG4gIGlmICgoc2NoZW1hIGFzIGFueSkuZWxlbWVudCAmJiAhcGFyZW50RWxlbWVudCkge1xuICAgIGNvbnN0IGVsZW1lbnREZWYgPSAoc2NoZW1hIGFzIGFueSkuZWxlbWVudDtcbiAgICBjb25zdCBjcmVhdGVFbGVtZW50Rm4gPSBlbGVtZW50RGVmLmNyZWF0b3IgfHwgZGVmYXVsdENyZWF0b3I7XG5cbiAgICBjb25zdCBlbGVtZW50T3B0aW9ucyA9IGVsZW1lbnREZWYub3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBwcm9jZXNzZWRPcHRpb25zID1cbiAgICAgIG9wdGlvbnMucHJlZml4ICE9PSBmYWxzZVxuICAgICAgICA/IHByb2Nlc3NDbGFzc05hbWVzKGVsZW1lbnRPcHRpb25zKVxuICAgICAgICA6IHsgLi4uZWxlbWVudE9wdGlvbnMgfTtcblxuICAgIGNvbnN0IHJvb3RDb21wb25lbnQgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShcbiAgICAgIGNyZWF0ZUVsZW1lbnRGbixcbiAgICAgIHByb2Nlc3NlZE9wdGlvbnMsXG4gICAgKTtcbiAgICBsYXlvdXQuZWxlbWVudCA9IHJvb3RDb21wb25lbnQ7XG4gICAgaWYgKGVsZW1lbnREZWYubmFtZSkgbGF5b3V0W2VsZW1lbnREZWYubmFtZV0gPSByb290Q29tcG9uZW50O1xuXG4gICAgLy8gUHJvY2VzcyBjaGlsZHJlblxuICAgIGlmIChlbGVtZW50RGVmLmNoaWxkcmVuKSB7XG4gICAgICBjb25zdCByb290RWxlbWVudCA9IGlzQ29tcG9uZW50KHJvb3RDb21wb25lbnQpXG4gICAgICAgID8gcm9vdENvbXBvbmVudC5lbGVtZW50XG4gICAgICAgIDogcm9vdENvbXBvbmVudDtcbiAgICAgIGNvbnN0IGNoaWxkUmVzdWx0ID0gcHJvY2Vzc09iamVjdFNjaGVtYShcbiAgICAgICAgZWxlbWVudERlZi5jaGlsZHJlbixcbiAgICAgICAgcm9vdEVsZW1lbnQsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApO1xuICAgICAgT2JqZWN0LmFzc2lnbihsYXlvdXQsIGNoaWxkUmVzdWx0LmxheW91dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUxheW91dFJlc3VsdChsYXlvdXQpO1xuICB9XG5cbiAgLy8gUHJvY2VzcyBub3JtYWwgc2NoZW1hIGVsZW1lbnRzXG4gIGNvbnN0IGZyYWdtZW50ID0gcGFyZW50RWxlbWVudCA/IGNyZWF0ZUZyYWdtZW50KCkgOiBudWxsO1xuXG4gIGZvciAoY29uc3Qga2V5IGluIHNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgY29uc3QgZGVmID0gKHNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldO1xuICAgIGlmICghZGVmKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGVsZW1lbnRDcmVhdG9yID0gZGVmLmNyZWF0b3IgfHwgZGVmYXVsdENyZWF0b3I7XG4gICAgY29uc3QgZWxlbWVudE9wdGlvbnMgPSBkZWYub3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBzaG91bGRBcHBseVByZWZpeCA9XG4gICAgICBcInByZWZpeFwiIGluIGVsZW1lbnRPcHRpb25zXG4gICAgICAgID8gZWxlbWVudE9wdGlvbnMucHJlZml4XG4gICAgICAgIDogb3B0aW9ucy5wcmVmaXggIT09IGZhbHNlO1xuICAgIGNvbnN0IHByb2Nlc3NlZE9wdGlvbnMgPSBzaG91bGRBcHBseVByZWZpeFxuICAgICAgPyBwcm9jZXNzQ2xhc3NOYW1lcyhlbGVtZW50T3B0aW9ucylcbiAgICAgIDogeyAuLi5lbGVtZW50T3B0aW9ucyB9O1xuXG4gICAgaWYgKCFkZWYubmFtZSAmJiBrZXkgIT09IFwiZWxlbWVudFwiKSB7XG4gICAgICBkZWYubmFtZSA9IGtleTtcbiAgICB9XG5cbiAgICBjb25zdCBjcmVhdGVkID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoZWxlbWVudENyZWF0b3IsIHByb2Nlc3NlZE9wdGlvbnMpO1xuICAgIGxheW91dFtrZXldID0gY3JlYXRlZDtcbiAgICBpZiAoZGVmLm5hbWUgJiYgZGVmLm5hbWUgIT09IGtleSkgbGF5b3V0W2RlZi5uYW1lXSA9IGNyZWF0ZWQ7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gaXNDb21wb25lbnQoY3JlYXRlZCkgPyBjcmVhdGVkLmVsZW1lbnQgOiBjcmVhdGVkO1xuICAgIGlmIChmcmFnbWVudCkgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG5cbiAgICAvLyBQcm9jZXNzIGNoaWxkcmVuXG4gICAgaWYgKGRlZi5jaGlsZHJlbikge1xuICAgICAgY29uc3QgY2hpbGRSZXN1bHQgPSBwcm9jZXNzT2JqZWN0U2NoZW1hKGRlZi5jaGlsZHJlbiwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICBPYmplY3QuYXNzaWduKGxheW91dCwgY2hpbGRSZXN1bHQubGF5b3V0KTtcbiAgICB9XG4gIH1cblxuICAvLyBBcHBlbmQgdG8gcGFyZW50XG4gIGlmIChwYXJlbnRFbGVtZW50ICYmIGZyYWdtZW50KSB7XG4gICAgY29uc3QgcGFyZW50RG9tID0gaXNDb21wb25lbnQocGFyZW50RWxlbWVudClcbiAgICAgID8gcGFyZW50RWxlbWVudC5lbGVtZW50XG4gICAgICA6IHBhcmVudEVsZW1lbnQ7XG4gICAgcGFyZW50RG9tLmFwcGVuZENoaWxkKGZyYWdtZW50KTtcbiAgICByZWxlYXNlRnJhZ21lbnQoZnJhZ21lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZUxheW91dFJlc3VsdChsYXlvdXQpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBMQVlPVVQgUkVTVUxUIENSRUFUSU9OXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRmxhdHRlbnMgYSBuZXN0ZWQgbGF5b3V0IGludG8gYSBzaW1wbGUgb2JqZWN0IHdpdGggZWxlbWVudCBhbmQgY29tcG9uZW50IHJlZmVyZW5jZXNcbiAqL1xuZnVuY3Rpb24gZmxhdHRlbkxheW91dChsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgY29uc3QgZmxhdHRlbmVkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cbiAgaWYgKCFsYXlvdXQgfHwgdHlwZW9mIGxheW91dCAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZsYXR0ZW5lZDtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBsYXlvdXQpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGxheW91dFtrZXldO1xuICAgIGlmIChcbiAgICAgIHZhbHVlICYmXG4gICAgICB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgKHZhbHVlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHxcbiAgICAgICAgKHR5cGVvZiBTVkdFbGVtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmIHZhbHVlIGluc3RhbmNlb2YgU1ZHRWxlbWVudCkgfHxcbiAgICAgICAgaXNDb21wb25lbnQodmFsdWUpKVxuICAgICkge1xuICAgICAgZmxhdHRlbmVkW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmxhdHRlbmVkO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsYXlvdXQgcmVzdWx0IG9iamVjdCB3aXRoIHV0aWxpdHkgZnVuY3Rpb25zXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUxheW91dFJlc3VsdChsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBMYXlvdXRSZXN1bHQge1xuICBjb25zdCBmbGF0dGVuZWRDb21wb25lbnRzID0gZmxhdHRlbkxheW91dChsYXlvdXQpO1xuXG4gIHJldHVybiB7XG4gICAgbGF5b3V0LFxuICAgIGVsZW1lbnQ6IGxheW91dC5lbGVtZW50LFxuICAgIGNvbXBvbmVudDogZmxhdHRlbmVkQ29tcG9uZW50cyxcblxuICAgIGdldChuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgICAgcmV0dXJuIGxheW91dFtuYW1lXSA/PyBudWxsO1xuICAgIH0sXG5cbiAgICBnZXRBbGwoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICByZXR1cm4gZmxhdHRlbmVkQ29tcG9uZW50cztcbiAgICB9LFxuXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAgIC8vIFRyYWNrIGRlc3Ryb3llZCBjb21wb25lbnRzIHRvIGF2b2lkIGRvdWJsZS1kZXN0cm95XG4gICAgICBjb25zdCBkZXN0cm95ZWQgPSBuZXcgU2V0PGFueT4oKTtcblxuICAgICAgLy8gSGVscGVyIHRvIHNhZmVseSBkZXN0cm95IGEgY29tcG9uZW50XG4gICAgICBjb25zdCBkZXN0cm95Q29tcG9uZW50ID0gKGNvbXBvbmVudDogYW55KTogdm9pZCA9PiB7XG4gICAgICAgIGlmICghY29tcG9uZW50IHx8IGRlc3Ryb3llZC5oYXMoY29tcG9uZW50KSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFNraXAgcGxhaW4gSFRNTCBlbGVtZW50cyBhbmQgbm9uLW9iamVjdHNcbiAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IHR5cGVvZiBjb21wb25lbnQgIT09IFwib2JqZWN0XCIpXG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGl0J3MgYSBjb21wb25lbnQgd2l0aCBkZXN0cm95IG1ldGhvZFxuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBkZXN0cm95ZWQuYWRkKGNvbXBvbmVudCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5kZXN0cm95KCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gSWdub3JlIGRlc3Ryb3kgZXJyb3JzIC0gY29tcG9uZW50IG1heSBhbHJlYWR5IGJlIGNsZWFuZWQgdXBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8vIEZpcnN0IGRlc3Ryb3kgY29tcG9uZW50cyBmcm9tIHRoZSBjb21wb25lbnRzIGFycmF5IChpZiBwcmVzZW50KVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIGFsbCBuYW1lZCBjb21wb25lbnRzIGFyZSBkZXN0cm95ZWQgZXZlbiBpZiBuZXN0ZWRcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGxheW91dC5jb21wb25lbnRzKSkge1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBjb21wb25lbnRdIG9mIGxheW91dC5jb21wb25lbnRzKSB7XG4gICAgICAgICAgZGVzdHJveUNvbXBvbmVudChjb21wb25lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZW4gaXRlcmF0ZSBvdmVyIGFsbCBsYXlvdXQga2V5cyBmb3IgYW55IG1pc3NlZCBjb21wb25lbnRzXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBsYXlvdXQpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJlbGVtZW50XCIgfHwga2V5ID09PSBcImNvbXBvbmVudHNcIikgY29udGludWU7XG4gICAgICAgIGRlc3Ryb3lDb21wb25lbnQobGF5b3V0W2tleV0pO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGVhciB0aGUgY29tcG9uZW50cyBhcnJheVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGF5b3V0LmNvbXBvbmVudHMpKSB7XG4gICAgICAgIGxheW91dC5jb21wb25lbnRzLmxlbmd0aCA9IDA7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSByb290IGVsZW1lbnQgZnJvbSBET01cbiAgICAgIGlmIChsYXlvdXQuZWxlbWVudCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gaXNDb21wb25lbnQobGF5b3V0LmVsZW1lbnQpXG4gICAgICAgICAgPyBsYXlvdXQuZWxlbWVudC5lbGVtZW50XG4gICAgICAgICAgOiBsYXlvdXQuZWxlbWVudDtcbiAgICAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFyIHJlZmVyZW5jZXMgdG8gaGVscCBHQ1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbGF5b3V0KSB7XG4gICAgICAgIGRlbGV0ZSBsYXlvdXRba2V5XTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBVTklGSUVEIEVOVFJZIFBPSU5UXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ3JlYXRlcyBhIGxheW91dCBmcm9tIHZhcmlvdXMgc2NoZW1hIGZvcm1hdHNcbiAqIFVuaWZpZWQgcHJvY2Vzc29yIGZvciBhcnJheXMsIG9iamVjdHMsIEpTWCwgYW5kIEhUTUwgc3RyaW5nc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGF5b3V0KFxuICBzY2hlbWE6IGFueSxcbiAgcGFyZW50RWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbCxcbiAgb3B0aW9uczogTGF5b3V0T3B0aW9ucyA9IHt9LFxuKTogTGF5b3V0UmVzdWx0IHtcbiAgLy8gSGFuZGxlIGZ1bmN0aW9uIHNjaGVtYXNcbiAgaWYgKHR5cGVvZiBzY2hlbWEgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHNjaGVtYSA9IHNjaGVtYSgpO1xuICB9XG5cbiAgLy8gSGFuZGxlIEhUTUwgc3RyaW5nIHNjaGVtYXNcbiAgaWYgKHR5cGVvZiBzY2hlbWEgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBzY2hlbWEudHJpbSgpO1xuICAgIGNvbnN0IGZyYWdtZW50ID0gdGVtcGxhdGUuY29udGVudDtcblxuICAgIGlmIChwYXJlbnRFbGVtZW50ICYmIGZyYWdtZW50Lmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgcGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChmcmFnbWVudCk7XG4gICAgfVxuXG4gICAgY29uc3QgbGF5b3V0ID0geyBlbGVtZW50OiBmcmFnbWVudC5maXJzdEVsZW1lbnRDaGlsZCBhcyBIVE1MRWxlbWVudCB9O1xuICAgIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBKU1gtbGlrZSBzY2hlbWFzIChhcnJheSB3aXRoIGZ1bmN0aW9uLCBzdHJpbmcsIG9iamVjdCBwYXR0ZXJuKVxuICBpZiAoXG4gICAgQXJyYXkuaXNBcnJheShzY2hlbWEpICYmXG4gICAgc2NoZW1hLmxlbmd0aCA+PSAzICYmXG4gICAgdHlwZW9mIHNjaGVtYVswXSA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgdHlwZW9mIHNjaGVtYVsxXSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgIGlzT2JqZWN0KHNjaGVtYVsyXSlcbiAgKSB7XG4gICAgcmV0dXJuIHByb2Nlc3NBcnJheVNjaGVtYShzY2hlbWEsIHBhcmVudEVsZW1lbnQsIDAsIG9wdGlvbnMpO1xuICB9XG5cbiAgLy8gUm91dGUgdG8gYXBwcm9wcmlhdGUgcHJvY2Vzc29yXG4gIHJldHVybiBBcnJheS5pc0FycmF5KHNjaGVtYSlcbiAgICA/IHByb2Nlc3NBcnJheVNjaGVtYShzY2hlbWEsIHBhcmVudEVsZW1lbnQsIDAsIG9wdGlvbnMpXG4gICAgOiBwcm9jZXNzT2JqZWN0U2NoZW1hKHNjaGVtYSwgcGFyZW50RWxlbWVudCwgb3B0aW9ucyk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEVYUE9SVFNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gQ2xlYXIgZnVuY3Rpb25zIGZvciB0aGUgdW5pZmllZCBzeXN0ZW1cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckNsYXNzQ2FjaGUoKTogdm9pZCB7XG4gIGNsYXNzQ2FjaGUuY2xlYXIoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyRnJhZ21lbnRQb29sKCk6IHZvaWQge1xuICBmcmFnbWVudFBvb2wuY2xlYXIoKTtcbn1cblxuZXhwb3J0IHtcbiAgcHJvY2Vzc0NsYXNzTmFtZXMsXG4gIGlzQ29tcG9uZW50LFxuICBmbGF0dGVuTGF5b3V0LFxuICBhcHBseUxheW91dENsYXNzZXMsXG4gIGFwcGx5TGF5b3V0SXRlbUNsYXNzZXMsXG4gIGNyZWF0ZUxheW91dFJlc3VsdCxcbn07XG4iLAogICAgIi8qKlxuICogQG1vZHVsZSBjb3JlL2xheW91dC9jb25maWdcbiAqIEBkZXNjcmlwdGlvbiBFc3NlbnRpYWwgbGF5b3V0IGNvbmZpZ3VyYXRpb24gdXRpbGl0aWVzXG4gKiBDb3JlIGZ1bmN0aW9uYWxpdHkgaXMgaW50ZWdyYXRlZCBpbnRvIHNjaGVtYS50cyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gKi9cblxuLy8gQ29uZmlndXJhdGlvbiBjb25zdGFudHNcbmNvbnN0IFBSRUZJWCA9IFwibXRybFwiOyAvLyBUT0RPOiBNYWtlIHRoaXMgY29uZmlndXJhYmxlIGZyb20gbWFpbiBtdHJsIGNvbmZpZ1xuY29uc3QgUFJFRklYX1dJVEhfREFTSCA9IGAke1BSRUZJWH0tYDtcblxuLyoqXG4gKiBTaW1wbGUgRE9NIHV0aWxpdGllc1xuICovXG5mdW5jdGlvbiBhZGRDbGFzcyhlbGVtZW50OiBhbnksIGNsYXNzTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChlbGVtZW50ICYmIGNsYXNzTmFtZSAmJiBlbGVtZW50LmNsYXNzTGlzdCkge1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc0NsYXNzKGVsZW1lbnQ6IGFueSwgY2xhc3NOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGVsZW1lbnQgJiYgZWxlbWVudC5jbGFzc0xpc3QgJiYgZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gY2xlYW4gdXAgcHJldmlvdXMgbGF5b3V0IGNsYXNzZXMgZnJvbSBhbiBlbGVtZW50XG4gKiBVc2VmdWwgZm9yIGR5bmFtaWMgY2xhc3MgbWFuYWdlbWVudFxuICpcbiAqIEBwYXJhbSBlbGVtZW50IC0gRWxlbWVudCB0byBjbGVhbiBsYXlvdXQgY2xhc3NlcyBmcm9tXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhbnVwTGF5b3V0Q2xhc3NlcyhlbGVtZW50OiBhbnkpOiB2b2lkIHtcbiAgaWYgKCFlbGVtZW50IHx8ICFlbGVtZW50LmNsYXNzTGlzdCkgcmV0dXJuO1xuXG4gIC8vIEdldCBhbGwgY2xhc3NlcyBmcm9tIHRoZSBlbGVtZW50XG4gIGNvbnN0IGNsYXNzTGlzdCA9IEFycmF5LmZyb20oZWxlbWVudC5jbGFzc0xpc3QpIGFzIHN0cmluZ1tdO1xuXG4gIC8vIEZpbmQgYW5kIHJlbW92ZSBsYXlvdXQtcmVsYXRlZCBjbGFzc2VzXG4gIGNvbnN0IGxheW91dENsYXNzZXMgPSBjbGFzc0xpc3QuZmlsdGVyKFxuICAgIChjbHM6IHN0cmluZykgPT5cbiAgICAgIGNscy5zdGFydHNXaXRoKGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1gKSB8fFxuICAgICAgY2xzLmluY2x1ZGVzKGAtJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tYClcbiAgKTtcblxuICAvLyBSZW1vdmUgZWFjaCBsYXlvdXQgY2xhc3NcbiAgbGF5b3V0Q2xhc3Nlcy5mb3JFYWNoKChjbHM6IHN0cmluZykgPT4ge1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShjbHMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBsYXlvdXQgdHlwZSBmcm9tIGVsZW1lbnQgY2xhc3Nlc1xuICpcbiAqIEBwYXJhbSBlbGVtZW50IC0gRWxlbWVudCB0byBjaGVja1xuICogQHJldHVybnMgTGF5b3V0IHR5cGUgaWYgZm91bmQsIGVtcHR5IHN0cmluZyBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExheW91dFR5cGUoZWxlbWVudDogYW55KTogc3RyaW5nIHtcbiAgcmV0dXJuIGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1zdGFja2ApXG4gICAgPyBcInN0YWNrXCJcbiAgICA6IGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3dgKVxuICAgID8gXCJyb3dcIlxuICAgIDogaGFzQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLWdyaWRgKVxuICAgID8gXCJncmlkXCJcbiAgICA6IFwiXCI7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY29uZmlndXJlZCBwcmVmaXggZm9yIHRoZSBsYXlvdXQgc3lzdGVtXG4gKiBAcmV0dXJucyBDdXJyZW50IHByZWZpeCB3aXRoIGRhc2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExheW91dFByZWZpeCgpOiBzdHJpbmcge1xuICByZXR1cm4gUFJFRklYX1dJVEhfREFTSDtcbn1cblxuLyoqXG4gKiBTZXRzIGxheW91dCBjbGFzc2VzIG9uIGFuIGVsZW1lbnQgZHluYW1pY2FsbHlcbiAqIFVzZWZ1bCBmb3IgcHJvZ3JhbW1hdGljIGxheW91dCB1cGRhdGVzXG4gKlxuICogQHBhcmFtIGVsZW1lbnQgLSBUYXJnZXQgZWxlbWVudFxuICogQHBhcmFtIGxheW91dFR5cGUgLSBMYXlvdXQgdHlwZSB0byBhcHBseVxuICogQHBhcmFtIGNsYXNzZXMgLSBBZGRpdGlvbmFsIGNsYXNzZXMgdG8gYXBwbHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldExheW91dENsYXNzZXMoXG4gIGVsZW1lbnQ6IGFueSxcbiAgbGF5b3V0VHlwZTogc3RyaW5nLFxuICBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdXG4pOiB2b2lkIHtcbiAgaWYgKCFlbGVtZW50IHx8ICFsYXlvdXRUeXBlKSByZXR1cm47XG5cbiAgLy8gQ2xlYW4gdXAgZXhpc3RpbmcgbGF5b3V0IGNsYXNzZXMgZmlyc3RcbiAgY2xlYW51cExheW91dENsYXNzZXMoZWxlbWVudCk7XG5cbiAgLy8gQXBwbHkgYmFzZSBsYXlvdXQgdHlwZVxuICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tJHtsYXlvdXRUeXBlfWApO1xuXG4gIC8vIEFwcGx5IGFkZGl0aW9uYWwgY2xhc3Nlc1xuICBjbGFzc2VzLmZvckVhY2goKGNscykgPT4ge1xuICAgIGlmIChjbHMuc3RhcnRzV2l0aChcImxheW91dC0tXCIpIHx8IGNscy5zdGFydHNXaXRoKFwibGF5b3V0X19cIikpIHtcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9JHtjbHN9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGNscyk7XG4gICAgfVxuICB9KTtcbn1cbiIsCiAgICAiLyoqXG4gKiBAbW9kdWxlIGNvcmUvbGF5b3V0L2pzeFxuICogQGRlc2NyaXB0aW9uIEpTWC1saWtlIHN5bnRheCBzdXBwb3J0IGZvciBsYXlvdXQgY3JlYXRpb25cbiAqIFByb3ZpZGVzIGEgc2ltcGxlIGgoKSBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgZWxlbWVudHMgd2l0aG91dCBSZWFjdCBkZXBlbmRlbmN5XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBMYXlvdXRSZXN1bHQgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlTGF5b3V0IH0gZnJvbSBcIi4vc2NoZW1hXCI7XG5cbi8qKlxuICogRnJhZ21lbnQgc3ltYm9sIGZvciBKU1ggZnJhZ21lbnRzXG4gKi9cbmV4cG9ydCBjb25zdCBGcmFnbWVudCA9IFN5bWJvbChcIkZyYWdtZW50XCIpO1xuXG4vKipcbiAqIEpTWC1saWtlIGh5cGVyc2NyaXB0IGZ1bmN0aW9uXG4gKiBDcmVhdGVzIGVsZW1lbnRzIGluIGEgUmVhY3QtbGlrZSBzeW50YXggd2l0aG91dCBSZWFjdCBkZXBlbmRlbmN5XG4gKlxuICogQHBhcmFtIHRhZyAtIEhUTUwgdGFnIG5hbWUsIGNvbXBvbmVudCBmdW5jdGlvbiwgb3IgRnJhZ21lbnRcbiAqIEBwYXJhbSBwcm9wcyAtIEVsZW1lbnQgcHJvcGVydGllcyBhbmQgYXR0cmlidXRlc1xuICogQHBhcmFtIGNoaWxkcmVuIC0gQ2hpbGQgZWxlbWVudHNcbiAqIEByZXR1cm5zIERPTSBlbGVtZW50IG9yIGNvbXBvbmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gaChcbiAgdGFnOiBzdHJpbmcgfCBGdW5jdGlvbiB8IHR5cGVvZiBGcmFnbWVudCxcbiAgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCxcbiAgLi4uY2hpbGRyZW46IGFueVtdXG4pOiBhbnkge1xuICAvLyBIYW5kbGUgRnJhZ21lbnRcbiAgaWYgKHRhZyA9PT0gRnJhZ21lbnQpIHtcbiAgICBjb25zdCBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICBjaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgaWYgKGNoaWxkICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9XG4gICAgICAgICAgdHlwZW9mIGNoaWxkID09PSBcInN0cmluZ1wiID8gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY2hpbGQpIDogY2hpbGQ7XG4gICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmcmFnbWVudDtcbiAgfVxuXG4gIC8vIEhhbmRsZSBzdHJpbmcgdGFncyAoSFRNTCBlbGVtZW50cylcbiAgaWYgKHR5cGVvZiB0YWcgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpO1xuXG4gICAgLy8gQXBwbHkgcHJvcHNcbiAgICBpZiAocHJvcHMpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BzKSkge1xuICAgICAgICBpZiAoa2V5ID09PSBcImNsYXNzTmFtZVwiIHx8IGtleSA9PT0gXCJjbGFzc1wiKSB7XG4gICAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkuc3RhcnRzV2l0aChcIm9uXCIpICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gRXZlbnQgaGFuZGxlclxuICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGtleS5zbGljZSgyKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09IFwic3R5bGVcIiAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAvLyBTdHlsZSBvYmplY3RcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09IFwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIikge1xuICAgICAgICAgIC8vIEhUTUwgY29udGVudFxuICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gdmFsdWUuX19odG1sIHx8IFwiXCI7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIFJlZ3VsYXIgYXR0cmlidXRlXG4gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFwcGVuZCBjaGlsZHJlblxuICAgIGNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICBpZiAoY2hpbGQgIT0gbnVsbCkge1xuICAgICAgICBpZiAodHlwZW9mIGNoaWxkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjaGlsZCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgTm9kZSkge1xuICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nKGNoaWxkKSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIC8vIEhhbmRsZSBjb21wb25lbnQgZnVuY3Rpb25zXG4gIGlmICh0eXBlb2YgdGFnID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zdCBhbGxQcm9wcyA9IHByb3BzIHx8IHt9O1xuICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICBhbGxQcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgIH1cbiAgICByZXR1cm4gdGFnKGFsbFByb3BzKTtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrIHRvIGRpdlxuICByZXR1cm4gaChcImRpdlwiLCBwcm9wcywgLi4uY2hpbGRyZW4pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsYXlvdXQgdXNpbmcgSlNYLWxpa2Ugc3ludGF4XG4gKiBQcm92aWRlcyBhIGJyaWRnZSBiZXR3ZWVuIEpTWCBhbmQgdGhlIGxheW91dCBzeXN0ZW1cbiAqXG4gKiBAcGFyYW0ganN4RWxlbWVudCAtIEpTWCBlbGVtZW50IGNyZWF0ZWQgd2l0aCBoKClcbiAqIEBwYXJhbSBwYXJlbnRFbGVtZW50IC0gUGFyZW50IGVsZW1lbnQgdG8gYXR0YWNoIHRvXG4gKiBAcmV0dXJucyBMYXlvdXQgcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVKc3hMYXlvdXQoXG4gIGpzeEVsZW1lbnQ6IGFueSxcbiAgcGFyZW50RWxlbWVudD86IGFueVxuKTogTGF5b3V0UmVzdWx0IHtcbiAgLy8gQ29udmVydCBKU1ggZWxlbWVudCB0byBsYXlvdXQgc2NoZW1hXG4gIGNvbnN0IHNjaGVtYSA9IGpzeEVsZW1lbnQ7XG5cbiAgLy8gQ3JlYXRlIGxheW91dCB1c2luZyB0aGUgc3RhbmRhcmQgY3JlYXRlTGF5b3V0IGZ1bmN0aW9uXG4gIHJldHVybiBjcmVhdGVMYXlvdXQoc2NoZW1hLCBwYXJlbnRFbGVtZW50KTtcbn1cblxuLyoqXG4gKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIHNpbXBsZSBjb21wb25lbnQgZnJvbSBhIGZ1bmN0aW9uXG4gKiBVc2VmdWwgZm9yIGNyZWF0aW5nIHJldXNhYmxlIEpTWCBjb21wb25lbnRzXG4gKlxuICogQHBhcmFtIGZuIC0gQ29tcG9uZW50IGZ1bmN0aW9uXG4gKiBAcmV0dXJucyBDb21wb25lbnQgdGhhdCBjYW4gYmUgdXNlZCBpbiBKU1hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvbmVudChmbjogKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBhbnkpOiBGdW5jdGlvbiB7XG4gIHJldHVybiBmdW5jdGlvbiAocHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBhbnkge1xuICAgIHJldHVybiBmbihwcm9wcyB8fCB7fSk7XG4gIH07XG59XG5cbi8qKlxuICogVXRpbGl0eSB0byByZW5kZXIgbXVsdGlwbGUgSlNYIGVsZW1lbnRzXG4gKiBVc2VmdWwgZm9yIGNyZWF0aW5nIGxpc3RzIG9yIGNvbGxlY3Rpb25zXG4gKlxuICogQHBhcmFtIGVsZW1lbnRzIC0gQXJyYXkgb2YgSlNYIGVsZW1lbnRzXG4gKiBAcGFyYW0gcGFyZW50RWxlbWVudCAtIFBhcmVudCBlbGVtZW50IHRvIGF0dGFjaCB0b1xuICogQHJldHVybnMgQXJyYXkgb2YgbGF5b3V0IHJlc3VsdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckVsZW1lbnRzKFxuICBlbGVtZW50czogYW55W10sXG4gIHBhcmVudEVsZW1lbnQ/OiBhbnlcbik6IExheW91dFJlc3VsdFtdIHtcbiAgcmV0dXJuIGVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4gY3JlYXRlSnN4TGF5b3V0KGVsZW1lbnQsIHBhcmVudEVsZW1lbnQpKTtcbn1cblxuLyoqXG4gKiBDb21tb24gSlNYIGVsZW1lbnQgY3JlYXRvcnMgZm9yIGNvbnZlbmllbmNlXG4gKi9cbmV4cG9ydCBjb25zdCBqc3ggPSB7XG4gIGRpdjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJkaXZcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgc3BhbjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJzcGFuXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIHA6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwicFwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxuICBidXR0b246IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwiYnV0dG9uXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIGlucHV0OiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBoKFwiaW5wdXRcIiwgcHJvcHMpLFxuICBpbWc6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IGgoXCJpbWdcIiwgcHJvcHMpLFxuICBhOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcImFcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgdWw6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwidWxcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgbGk6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwibGlcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgc2VjdGlvbjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJzZWN0aW9uXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIGhlYWRlcjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJoZWFkZXJcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgZm9vdGVyOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcImZvb3RlclwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxuICBtYWluOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcIm1haW5cIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgYXJ0aWNsZTogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJhcnRpY2xlXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG59O1xuIiwKICAgICIvKipcbiAqIFZpZXdwb3J0IC0gQ29yZSB2aXJ0dWFsIHNjcm9sbGluZyBlbmdpbmVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIFZpZXdwb3J0Q29uZmlnLFxuICBWaWV3cG9ydENvbnRleHQsXG4gIFZpZXdwb3J0Q29tcG9uZW50LFxuICBJdGVtUmFuZ2UsXG4gIFZpZXdwb3J0SW5mbyxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IHBpcGUgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgd2l0aEJhc2UgfSBmcm9tIFwiLi9mZWF0dXJlcy9iYXNlXCI7XG5pbXBvcnQgeyB3aXRoVmlydHVhbCB9IGZyb20gXCIuL2ZlYXR1cmVzL3ZpcnR1YWxcIjtcbmltcG9ydCB7IHdpdGhTY3JvbGxpbmcgfSBmcm9tIFwiLi9mZWF0dXJlcy9zY3JvbGxpbmdcIjtcbmltcG9ydCB7IHdpdGhNb21lbnR1bSB9IGZyb20gXCIuL2ZlYXR1cmVzL21vbWVudHVtXCI7XG5pbXBvcnQgeyB3aXRoU2Nyb2xsYmFyIH0gZnJvbSBcIi4vZmVhdHVyZXMvc2Nyb2xsYmFyXCI7XG5pbXBvcnQgeyB3aXRoQ29sbGVjdGlvbiB9IGZyb20gXCIuL2ZlYXR1cmVzL2NvbGxlY3Rpb25cIjtcbmltcG9ydCB7IHdpdGhQbGFjZWhvbGRlcnMgfSBmcm9tIFwiLi9mZWF0dXJlcy9wbGFjZWhvbGRlcnNcIjtcbmltcG9ydCB7IHdpdGhSZW5kZXJpbmcgfSBmcm9tIFwiLi9mZWF0dXJlcy9yZW5kZXJpbmdcIjtcbmltcG9ydCB7IHdpdGhFdmVudHMgfSBmcm9tIFwiLi9mZWF0dXJlcy9ldmVudHNcIjtcblxuLy8gSW50ZXJuYWwgdmlld3BvcnQgc3RhdGVcbmludGVyZmFjZSBWaWV3cG9ydFN0YXRlIHtcbiAgc2Nyb2xsUG9zaXRpb246IG51bWJlcjtcbiAgdG90YWxJdGVtczogbnVtYmVyO1xuICBpdGVtU2l6ZTogbnVtYmVyO1xuICBjb250YWluZXJTaXplOiBudW1iZXI7XG4gIHZpcnR1YWxUb3RhbFNpemU6IG51bWJlcjtcbiAgdmlzaWJsZVJhbmdlOiBJdGVtUmFuZ2U7XG4gIGl0ZW1zQ29udGFpbmVyOiBIVE1MRWxlbWVudCB8IG51bGw7XG4gIHZlbG9jaXR5OiBudW1iZXI7XG4gIHNjcm9sbERpcmVjdGlvbjogXCJmb3J3YXJkXCIgfCBcImJhY2t3YXJkXCI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHZpZXdwb3J0LWVuaGFuY2VkIGNvbXBvbmVudCB1c2luZyBjb21wb3NpdGlvblxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBWaWV3cG9ydCBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBGdW5jdGlvbiB0aGF0IGVuaGFuY2VzIGEgY29tcG9uZW50IHdpdGggdmlld3BvcnQgY2FwYWJpbGl0aWVzXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVWaWV3cG9ydCA9IChjb25maWc6IFZpZXdwb3J0Q29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0Pihjb21wb25lbnQ6IFQpOiBUICYgVmlld3BvcnRDb21wb25lbnQgPT4ge1xuICAgIC8vIFRyYWNrIGlmIHZpZXdwb3J0IGhhcyBiZWVuIGluaXRpYWxpemVkIHRvIHByZXZlbnQgbXVsdGlwbGUgaW5pdGlhbGl6YXRpb25zXG4gICAgbGV0IGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAgIC8vIE5vIG5vcm1hbGl6YXRpb24gbmVlZGVkIC0gd2UnbGwgdXNlIHRoZSBuZXN0ZWQgc3RydWN0dXJlIGRpcmVjdGx5XG5cbiAgICAvLyBDcmVhdGUgc2hhcmVkIHZpZXdwb3J0IHN0YXRlXG4gICAgY29uc3Qgc3RhdGU6IFZpZXdwb3J0U3RhdGUgPSB7XG4gICAgICBzY3JvbGxQb3NpdGlvbjogMCxcbiAgICAgIHRvdGFsSXRlbXM6IGNvbXBvbmVudC50b3RhbEl0ZW1zIHx8IDAsXG4gICAgICBpdGVtU2l6ZTogY29uZmlnLnZpcnR1YWw/Lml0ZW1TaXplIHx8IDUwLFxuICAgICAgY29udGFpbmVyU2l6ZTogMCxcbiAgICAgIHZpcnR1YWxUb3RhbFNpemU6IDAsXG4gICAgICB2aXNpYmxlUmFuZ2U6IHsgc3RhcnQ6IDAsIGVuZDogMCB9LFxuICAgICAgaXRlbXNDb250YWluZXI6IG51bGwsXG4gICAgICB2ZWxvY2l0eTogMCxcbiAgICAgIHNjcm9sbERpcmVjdGlvbjogXCJmb3J3YXJkXCIsXG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSBiYXNlIHZpZXdwb3J0IEFQSVxuICAgIGNvbnN0IHZpZXdwb3J0QVBJID0ge1xuICAgICAgLy8gQ29yZSBBUElcbiAgICAgIGluaXRpYWxpemU6ICgpID0+IHtcbiAgICAgICAgLy8gUHJldmVudCBtdWx0aXBsZSBpbml0aWFsaXphdGlvbnNcbiAgICAgICAgaWYgKGlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaXNJbml0aWFsaXplZCA9IHRydWU7XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJbVmlld3BvcnRdIEluaXRpYWxpemluZyB3aXRoIHN0YXRlOlwiLCB7XG4gICAgICAgIC8vICAgZWxlbWVudDogISFjb21wb25lbnQuZWxlbWVudCxcbiAgICAgICAgLy8gICB0b3RhbEl0ZW1zOiBjb21wb25lbnQudG90YWxJdGVtcyxcbiAgICAgICAgLy8gICBpdGVtU2l6ZTogY29uZmlnLnZpcnR1YWw/Lml0ZW1TaXplLFxuICAgICAgICAvLyB9KTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIGNvbnRhaW5lciBzaXplXG4gICAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICAgIHN0YXRlLmNvbnRhaW5lclNpemUgPVxuICAgICAgICAgICAgY29uZmlnLnNjcm9sbGluZz8ub3JpZW50YXRpb24gPT09IFwiaG9yaXpvbnRhbFwiXG4gICAgICAgICAgICAgID8gY29tcG9uZW50LmVsZW1lbnQub2Zmc2V0V2lkdGhcbiAgICAgICAgICAgICAgOiBjb21wb25lbnQuZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG5cbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltWaWV3cG9ydF0gQ29udGFpbmVyIHNpemU6XCIsIHN0YXRlLmNvbnRhaW5lclNpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIGluaXRpYWwgdmlydHVhbCBzaXplXG4gICAgICAgIHN0YXRlLnZpcnR1YWxUb3RhbFNpemUgPSBzdGF0ZS50b3RhbEl0ZW1zICogc3RhdGUuaXRlbVNpemU7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIGluaXRpYWwgdmlzaWJsZSByYW5nZVxuICAgICAgICBzdGF0ZS52aXNpYmxlUmFuZ2UgPSBjYWxjdWxhdGVWaXNpYmxlUmFuZ2Uoc3RhdGUuc2Nyb2xsUG9zaXRpb24pO1xuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1ZpZXdwb3J0XSBJbml0aWFsIHN0YXRlOlwiLCB7XG4gICAgICAgIC8vICAgY29udGFpbmVyU2l6ZTogc3RhdGUuY29udGFpbmVyU2l6ZSxcbiAgICAgICAgLy8gICB2aXJ0dWFsVG90YWxTaXplOiBzdGF0ZS52aXJ0dWFsVG90YWxTaXplLFxuICAgICAgICAvLyAgIHZpc2libGVSYW5nZTogc3RhdGUudmlzaWJsZVJhbmdlLFxuICAgICAgICAvLyB9KTtcbiAgICAgIH0sXG5cbiAgICAgIGRlc3Ryb3k6ICgpID0+IHtcbiAgICAgICAgLy8gQ2xlYW51cCB3aWxsIGJlIGhhbmRsZWQgYnkgZmVhdHVyZXNcbiAgICAgIH0sXG5cbiAgICAgIHVwZGF0ZVZpZXdwb3J0OiAoKSA9PiB7XG4gICAgICAgIC8vIFdpbGwgYmUgaW1wbGVtZW50ZWQgYnkgcmVuZGVyaW5nIGZlYXR1cmVcbiAgICAgIH0sXG5cbiAgICAgIC8vIENoZWNrIGlmIGFscmVhZHkgaW5pdGlhbGl6ZWRcbiAgICAgIGlzSW5pdGlhbGl6ZWQ6ICgpID0+IGlzSW5pdGlhbGl6ZWQsXG5cbiAgICAgIC8vIEFsbG93IGZlYXR1cmVzIHRvIGNoZWNrIGlmIGluaXQgc2hvdWxkIHByb2NlZWRcbiAgICAgIF9zaG91bGRJbml0OiAoKSA9PiAhaXNJbml0aWFsaXplZCxcblxuICAgICAgLy8gU2Nyb2xsaW5nIEFQSSAod2lsbCBiZSBvdmVycmlkZGVuIGJ5IHNjcm9sbGluZyBmZWF0dXJlKVxuICAgICAgc2Nyb2xsVG9JbmRleDogKFxuICAgICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgICBhbGlnbm1lbnQ/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIixcbiAgICAgICkgPT4ge1xuICAgICAgICAvLyBQbGFjZWhvbGRlciAtIHdpbGwgYmUgaW1wbGVtZW50ZWQgYnkgc2Nyb2xsaW5nIGZlYXR1cmVcbiAgICAgIH0sXG5cbiAgICAgIHNjcm9sbFRvUG9zaXRpb246IChwb3NpdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgICAgIC8vIFdpbGwgYmUgaW1wbGVtZW50ZWQgYnkgc2Nyb2xsaW5nIGZlYXR1cmVcbiAgICAgIH0sXG5cbiAgICAgIGdldFNjcm9sbFBvc2l0aW9uOiAoKSA9PiBzdGF0ZS5zY3JvbGxQb3NpdGlvbixcblxuICAgICAgLy8gSW5mbyBBUElcbiAgICAgIGdldFZpc2libGVSYW5nZTogKCkgPT4gc3RhdGUudmlzaWJsZVJhbmdlLFxuXG4gICAgICBnZXRWaWV3cG9ydEluZm86ICgpOiBWaWV3cG9ydEluZm8gPT4gKHtcbiAgICAgICAgY29udGFpbmVyU2l6ZTogc3RhdGUuY29udGFpbmVyU2l6ZSxcbiAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZTogc3RhdGUudmlydHVhbFRvdGFsU2l6ZSxcbiAgICAgICAgdmlzaWJsZVJhbmdlOiBzdGF0ZS52aXNpYmxlUmFuZ2UsXG4gICAgICAgIHZpcnR1YWxTY3JvbGxQb3NpdGlvbjogc3RhdGUuc2Nyb2xsUG9zaXRpb24sXG4gICAgICB9KSxcblxuICAgICAgLy8gUmVuZGVyaW5nIEFQSVxuICAgICAgcmVuZGVySXRlbXM6ICgpID0+IHtcbiAgICAgICAgLy8gV2lsbCBiZSBpbXBsZW1lbnRlZCBieSByZW5kZXJpbmcgZmVhdHVyZVxuICAgICAgfSxcblxuICAgICAgLy8gSW50ZXJuYWwgc3RhdGUgKGZvciBmZWF0dXJlcyB0byBhY2Nlc3MpXG4gICAgICBzdGF0ZSxcbiAgICB9O1xuXG4gICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB2aXNpYmxlIHJhbmdlXG4gICAgY29uc3QgY2FsY3VsYXRlVmlzaWJsZVJhbmdlID0gKHNjcm9sbFBvczogbnVtYmVyKTogSXRlbVJhbmdlID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1TaXplID0gc3RhdGUuaXRlbVNpemU7XG4gICAgICBjb25zdCBzdGFydCA9IE1hdGguZmxvb3Ioc2Nyb2xsUG9zIC8gaXRlbVNpemUpO1xuICAgICAgY29uc3QgdmlzaWJsZUNvdW50ID0gTWF0aC5jZWlsKHN0YXRlLmNvbnRhaW5lclNpemUgLyBpdGVtU2l6ZSk7XG4gICAgICBjb25zdCBlbmQgPSBNYXRoLm1pbihzdGFydCArIHZpc2libGVDb3VudCwgc3RhdGUudG90YWxJdGVtcyAtIDEpO1xuXG4gICAgICByZXR1cm4geyBzdGFydDogTWF0aC5tYXgoMCwgc3RhcnQpLCBlbmQ6IE1hdGgubWF4KDAsIGVuZCkgfTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIHZpZXdwb3J0IEFQSSB0byBjb21wb25lbnRcbiAgICBjb25zdCBiYXNlQ29tcG9uZW50ID0ge1xuICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgdmlld3BvcnQ6IHZpZXdwb3J0QVBJLFxuICAgIH07XG5cbiAgICAvLyBCdWlsZCB0aGUgZW5oYW5jZW1lbnQgcGlwZWxpbmVcbiAgICBjb25zdCBlbmhhbmNlcnM6IEFycmF5PChjOiBhbnkpID0+IGFueT4gPSBbXTtcblxuICAgIC8vIEV2ZW50cyBzeXN0ZW0gKGFsd2F5cyBmaXJzdCAtIHByb3ZpZGVzIGNvbW11bmljYXRpb24gZm9yIG90aGVyIGZlYXR1cmVzKVxuICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgd2l0aEV2ZW50cyh7XG4gICAgICAgIGRlYnVnOiBjb25maWcuZGVidWcsXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gQmFzZSBzZXR1cCAoY3JlYXRlcyBET00gc3RydWN0dXJlKVxuICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgd2l0aEJhc2Uoe1xuICAgICAgICBjbGFzc05hbWU6IGNvbmZpZy5jbGFzc05hbWUsXG4gICAgICAgIG9yaWVudGF0aW9uOiBjb25maWcuc2Nyb2xsaW5nPy5vcmllbnRhdGlvbixcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBWaXJ0dWFsIHNjcm9sbGluZyAocmVxdWlyZWQgZm9yIG1vc3QgZmVhdHVyZXMpXG4gICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICB3aXRoVmlydHVhbCh7XG4gICAgICAgIGl0ZW1TaXplOiBjb25maWcudmlydHVhbD8uaXRlbVNpemUsXG4gICAgICAgIG92ZXJzY2FuOiBjb25maWcudmlydHVhbD8ub3ZlcnNjYW4sXG4gICAgICAgIG9yaWVudGF0aW9uOiBjb25maWcuc2Nyb2xsaW5nPy5vcmllbnRhdGlvbixcbiAgICAgICAgYXV0b0RldGVjdEl0ZW1TaXplOiBjb25maWcudmlydHVhbD8uYXV0b0RldGVjdEl0ZW1TaXplLFxuICAgICAgICBpbml0aWFsU2Nyb2xsSW5kZXg6IChjb25maWcgYXMgYW55KS5pbml0aWFsU2Nyb2xsSW5kZXgsXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gU2Nyb2xsaW5nIGJlaGF2aW9yXG4gICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICB3aXRoU2Nyb2xsaW5nKHtcbiAgICAgICAgb3JpZW50YXRpb246IGNvbmZpZy5zY3JvbGxpbmc/Lm9yaWVudGF0aW9uLFxuICAgICAgICBzZW5zaXRpdml0eTogY29uZmlnLnNjcm9sbGluZz8uc2Vuc2l0aXZpdHksXG4gICAgICAgIHNtb290aGluZzogY29uZmlnLnNjcm9sbGluZz8uYW5pbWF0aW9uLFxuICAgICAgICBzdG9wT25DbGljazogY29uZmlnLnNjcm9sbGluZz8uc3RvcE9uQ2xpY2ssXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gTW9tZW50dW0gc2Nyb2xsaW5nICh0b3VjaC9kcmFnIHN1cHBvcnQgZm9yIG1vYmlsZSlcbiAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgIHdpdGhNb21lbnR1bSh7XG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIHN0b3BPbkNsaWNrOiBjb25maWcuc2Nyb2xsaW5nPy5zdG9wT25DbGljayxcbiAgICAgICAgZGVjZWxlcmF0aW9uOiBjb25maWcuc2Nyb2xsaW5nPy5tb21lbnR1bT8uZGVjZWxlcmF0aW9uLFxuICAgICAgICBtaW5WZWxvY2l0eTogY29uZmlnLnNjcm9sbGluZz8ubW9tZW50dW0/Lm1pblZlbG9jaXR5LFxuICAgICAgICBtaW5EdXJhdGlvbjogY29uZmlnLnNjcm9sbGluZz8ubW9tZW50dW0/Lm1heER1cmF0aW9uLFxuICAgICAgICBtaW5WZWxvY2l0eVRocmVzaG9sZDogY29uZmlnLnNjcm9sbGluZz8ubW9tZW50dW0/LnZlbG9jaXR5VGhyZXNob2xkLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIFNjcm9sbGJhciAob3B0aW9uYWwpXG4gICAgaWYgKGNvbmZpZy5zY3JvbGxiYXI/LmVuYWJsZWQgIT09IGZhbHNlKSB7XG4gICAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgICAgd2l0aFNjcm9sbGJhcih7XG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBhdXRvSGlkZTogY29uZmlnLnNjcm9sbGJhcj8uYXV0b0hpZGUsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgY29sbGVjdGlvbiBpZiBjb25maWd1cmVkXG4gICAgaWYgKGNvbmZpZy5jb2xsZWN0aW9uPy5hZGFwdGVyKSB7XG4gICAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgICAgd2l0aENvbGxlY3Rpb24oe1xuICAgICAgICAgIGNvbGxlY3Rpb246IGNvbmZpZy5jb2xsZWN0aW9uLmFkYXB0ZXIsXG4gICAgICAgICAgcmFuZ2VTaXplOiBjb25maWcucGFnaW5hdGlvbj8ubGltaXQsXG4gICAgICAgICAgc3RyYXRlZ3k6IGNvbmZpZy5wYWdpbmF0aW9uPy5zdHJhdGVneSBhc1xuICAgICAgICAgICAgfCBcIm9mZnNldFwiXG4gICAgICAgICAgICB8IFwicGFnZVwiXG4gICAgICAgICAgICB8IFwiY3Vyc29yXCJcbiAgICAgICAgICAgIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHRyYW5zZm9ybTogY29uZmlnLmNvbGxlY3Rpb24/LnRyYW5zZm9ybSxcbiAgICAgICAgICBjYW5jZWxMb2FkVGhyZXNob2xkOiBjb25maWcucGVyZm9ybWFuY2U/LmNhbmNlbExvYWRUaHJlc2hvbGQsXG4gICAgICAgICAgbWF4Q29uY3VycmVudFJlcXVlc3RzOiBjb25maWcucGVyZm9ybWFuY2U/Lm1heENvbmN1cnJlbnRSZXF1ZXN0cyxcbiAgICAgICAgICBlbmFibGVSZXF1ZXN0UXVldWU6IGNvbmZpZy5wZXJmb3JtYW5jZT8uZW5hYmxlUmVxdWVzdFF1ZXVlICE9PSBmYWxzZSxcbiAgICAgICAgICBpbml0aWFsU2Nyb2xsSW5kZXg6IChjb25maWcgYXMgYW55KS5pbml0aWFsU2Nyb2xsSW5kZXgsXG4gICAgICAgICAgc2VsZWN0SWQ6IChjb25maWcgYXMgYW55KS5zZWxlY3RJZCxcbiAgICAgICAgICBhdXRvTG9hZDogKGNvbmZpZyBhcyBhbnkpLmF1dG9Mb2FkICE9PSBmYWxzZSxcbiAgICAgICAgICBhdXRvU2VsZWN0Rmlyc3Q6IChjb25maWcgYXMgYW55KS5hdXRvU2VsZWN0Rmlyc3QsXG4gICAgICAgICAgbWF4Q2FjaGVkSXRlbXM6IGNvbmZpZy5jYWNoZT8ubWF4SXRlbXMsXG4gICAgICAgICAgZXZpY3Rpb25CdWZmZXI6IGNvbmZpZy5jYWNoZT8uZXZpY3Rpb25CdWZmZXIsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBQbGFjZWhvbGRlcnMgKG9wdGlvbmFsLCByZXF1aXJlcyBjb2xsZWN0aW9uKVxuICAgIGlmIChjb25maWcuY29sbGVjdGlvbj8uYWRhcHRlciAmJiBjb25maWcucGxhY2Vob2xkZXJzPy5lbmFibGVkICE9PSBmYWxzZSkge1xuICAgICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICAgIHdpdGhQbGFjZWhvbGRlcnMoe1xuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgYW5hbHl6ZUZpcnN0TG9hZDogY29uZmlnLnBsYWNlaG9sZGVycz8uYW5hbHl6ZUZpcnN0TG9hZCA/PyB0cnVlLFxuICAgICAgICAgIG1hc2tDaGFyYWN0ZXI6IGNvbmZpZy5wbGFjZWhvbGRlcnM/Lm1hc2tDaGFyYWN0ZXIsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBSZW5kZXJpbmcgKGFsd2F5cyBsYXN0IHRvIGhhdmUgYWNjZXNzIHRvIGFsbCBmZWF0dXJlcylcbiAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgIHdpdGhSZW5kZXJpbmcoe1xuICAgICAgICB0ZW1wbGF0ZTogY29uZmlnLnRlbXBsYXRlLFxuICAgICAgICBvdmVyc2NhbjogY29uZmlnLnZpcnR1YWw/Lm92ZXJzY2FuLFxuICAgICAgICBtYWludGFpbkRvbU9yZGVyOiBjb25maWcucmVuZGVyaW5nPy5tYWludGFpbkRvbU9yZGVyLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIENvbXBvc2UgYWxsIGVuaGFuY2Vyc1xuICAgIGNvbnN0IGVuaGFuY2UgPSBwaXBlKC4uLmVuaGFuY2Vycyk7XG5cbiAgICAvLyBBcHBseSBlbmhhbmNlbWVudHNcbiAgICBjb25zdCBlbmhhbmNlZCA9IGVuaGFuY2UoYmFzZUNvbXBvbmVudCk7XG5cbiAgICAvLyBBdXRvLWluaXRpYWxpemUgaWYgZWxlbWVudCBpcyBwcm92aWRlZFxuICAgIGlmIChlbmhhbmNlZC5lbGVtZW50KSB7XG4gICAgICBlbmhhbmNlZC52aWV3cG9ydC5pbml0aWFsaXplKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVuaGFuY2VkIGFzIFQgJiBWaWV3cG9ydENvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3V0aWxzLnRzXG5cbi8qKlxuICogU2hhcmVkIHV0aWxpdGllcyBmb3Igdmlld3BvcnQgZmVhdHVyZXNcbiAqIEVsaW1pbmF0ZXMgY29kZSBkdXBsaWNhdGlvbiBhY3Jvc3MgZmVhdHVyZXNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBXcmFwcyB2aWV3cG9ydCBpbml0aWFsaXphdGlvbiB3aXRoIGZlYXR1cmUtc3BlY2lmaWMgbG9naWNcbiAqIEVsaW1pbmF0ZXMgdGhlIHJlcGVhdGVkIGluaXRpYWxpemF0aW9uIGhvb2sgcGF0dGVyblxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JhcEluaXRpYWxpemU8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50PihcbiAgY29tcG9uZW50OiBULFxuICBmZWF0dXJlSW5pdDogKCkgPT4gdm9pZCxcbik6IHZvaWQge1xuICBjb25zdCBvcmlnaW5hbEluaXRpYWxpemUgPSBjb21wb25lbnQudmlld3BvcnQuaW5pdGlhbGl6ZTtcbiAgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBpbml0aWFsaXplZCAocmV0dXJucyBmYWxzZSBpZiBhbHJlYWR5IGRvbmUpXG4gICAgY29uc3QgcmVzdWx0ID0gb3JpZ2luYWxJbml0aWFsaXplKCk7XG4gICAgLy8gT25seSBydW4gZmVhdHVyZSBpbml0IGlmIGJhc2UgaW5pdCBhY3R1YWxseSByYW4gKGRpZG4ndCByZXR1cm4gZmFsc2UpXG4gICAgaWYgKHJlc3VsdCAhPT0gZmFsc2UpIHtcbiAgICAgIGZlYXR1cmVJbml0KCk7XG4gICAgfVxuICAgIC8vIFByb3BhZ2F0ZSB0aGUgcmVzdWx0IHRocm91Z2ggdGhlIGNoYWluIHNvIG91dGVyIHdyYXBwZXJzIGtub3cgdG8gc2tpcFxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbi8qKlxuICogV3JhcHMgY29tcG9uZW50IGRlc3Ryb3kgd2l0aCBjbGVhbnVwIGxvZ2ljXG4gKiBFbGltaW5hdGVzIHRoZSByZXBlYXRlZCBkZXN0cm95IGhvb2sgcGF0dGVyblxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JhcERlc3Ryb3k8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICBjb21wb25lbnQ6IFQsXG4gIGNsZWFudXA6ICgpID0+IHZvaWQsXG4pOiB2b2lkIHtcbiAgaWYgKFwiZGVzdHJveVwiIGluIGNvbXBvbmVudCAmJiB0eXBlb2YgY29tcG9uZW50LmRlc3Ryb3kgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IGNvbXBvbmVudC5kZXN0cm95O1xuICAgIChjb21wb25lbnQgYXMgYW55KS5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgY2xlYW51cCgpO1xuICAgICAgb3JpZ2luYWxEZXN0cm95Py4oKTtcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogR2V0cyB2aWV3cG9ydCBzdGF0ZSB3aXRoIHByb3BlciB0eXBpbmdcbiAqIEVsaW1pbmF0ZXMgcmVwZWF0ZWQgKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLnN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWaWV3cG9ydFN0YXRlKGNvbXBvbmVudDogVmlld3BvcnRDb21wb25lbnQpOiBhbnkge1xuICByZXR1cm4gKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLnN0YXRlO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhbiBpdGVtIGlzIGEgcGxhY2Vob2xkZXJcbiAqIEVsaW1pbmF0ZXMgZHVwbGljYXRlZCBwbGFjZWhvbGRlciBkZXRlY3Rpb24gbG9naWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGxhY2Vob2xkZXIoaXRlbTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgaXRlbSAmJlxuICAgIHR5cGVvZiBpdGVtID09PSBcIm9iamVjdFwiICYmXG4gICAgKGl0ZW0uX3BsYWNlaG9sZGVyID09PSB0cnVlIHx8IGl0ZW1bXCJfcGxhY2Vob2xkZXJcIl0gPT09IHRydWUpIC8vIFN1cHBvcnQgYm90aCBhY2Nlc3MgcGF0dGVybnNcbiAgKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcmFuZ2Uga2V5IGZvciBkZWR1cGxpY2F0aW9uXG4gKiBVc2VkIGJ5IG11bHRpcGxlIGZlYXR1cmVzIGZvciB0cmFja2luZyByYW5nZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJhbmdlS2V5KHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7cmFuZ2Uuc3RhcnR9LSR7cmFuZ2UuZW5kfWA7XG59XG5cbi8qKlxuICogQ2xhbXBzIGEgdmFsdWUgYmV0d2VlbiBtaW4gYW5kIG1heFxuICogVXNlZCBieSBtdWx0aXBsZSBmZWF0dXJlcyBmb3IgYm91bmRhcnkgY2hlY2tpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYW1wKHZhbHVlOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLm1heChtaW4sIE1hdGgubWluKG1heCwgdmFsdWUpKTtcbn1cblxuLyoqXG4gKiBTdG9yZXMgYSBmdW5jdGlvbiByZWZlcmVuY2Ugb24gdGhlIGNvbXBvbmVudCBmb3IgbGF0ZXIgYWNjZXNzXG4gKiBFbGltaW5hdGVzIHBhdHRlcm4gbGlrZSAoY29tcG9uZW50IGFzIGFueSkuX2ZlYXR1cmVGdW5jdGlvbiA9IGZuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdG9yZUZlYXR1cmVGdW5jdGlvbjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gIGNvbXBvbmVudDogVCxcbiAgbmFtZTogc3RyaW5nLFxuICBmbjogRnVuY3Rpb24sXG4pOiB2b2lkIHtcbiAgKGNvbXBvbmVudCBhcyBhbnkpW25hbWVdID0gZm47XG59XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL2Jhc2UudHNcblxuLyoqXG4gKiBCYXNlIFZpZXdwb3J0IEZlYXR1cmUgLSBTZXRzIHVwIGNvcmUgdmlld3BvcnQgc3RydWN0dXJlXG4gKiBQcm92aWRlcyB0aGUgZm91bmRhdGlvbiBmb3Igb3RoZXIgdmlld3BvcnQgZmVhdHVyZXNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IHdyYXBJbml0aWFsaXplLCBnZXRWaWV3cG9ydFN0YXRlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBCYXNlQ29uZmlnIHtcbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xuICBvcmllbnRhdGlvbj86IFwidmVydGljYWxcIiB8IFwiaG9yaXpvbnRhbFwiO1xufVxuXG4vKipcbiAqIEJhc2UgZmVhdHVyZSBmb3Igdmlld3BvcnRcbiAqIFNldHMgdXAgdGhlIERPTSBzdHJ1Y3R1cmUgYW5kIGNvcmUgc3R5bGVzXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoQmFzZSA9IChjb25maWc6IEJhc2VDb25maWcgPSB7fSkgPT4ge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBWaWV3cG9ydENvbXBvbmVudD4oY29tcG9uZW50OiBUKTogVCA9PiB7XG4gICAgY29uc3QgeyBjbGFzc05hbWUgPSBcIm10cmwtdmlld3BvcnRcIiwgb3JpZW50YXRpb24gPSBcInZlcnRpY2FsXCIgfSA9IGNvbmZpZztcblxuICAgIC8vIFVzZSB0aGUgc2hhcmVkIHdyYXBwZXIgdXRpbGl0eVxuICAgIHdyYXBJbml0aWFsaXplKGNvbXBvbmVudCwgKCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGNvbXBvbmVudC5lbGVtZW50O1xuICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm47XG5cbiAgICAgIC8vIENyZWF0ZSB2aWV3cG9ydCBzdHJ1Y3R1cmVcbiAgICAgIGxldCB2aWV3cG9ydEVsZW1lbnQgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIFwiLm10cmwtdmlld3BvcnRcIlxuICAgICAgKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgaWYgKCF2aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LnN0eWxlLmNzc1RleHQgPSBgXG4gICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICBgO1xuXG4gICAgICAgIC8vIFNldCBvcmllbnRhdGlvblxuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1vcmllbnRhdGlvblwiLCBvcmllbnRhdGlvbik7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGl0ZW1zIGNvbnRhaW5lclxuICAgICAgICBjb25zdCBpdGVtc0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGl0ZW1zQ29udGFpbmVyLmNsYXNzTmFtZSA9IFwibXRybC12aWV3cG9ydC1pdGVtc1wiO1xuICAgICAgICBpdGVtc0NvbnRhaW5lci5zdHlsZS5jc3NUZXh0ID0gYFxuICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgYDtcblxuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYXBwZW5kQ2hpbGQoaXRlbXNDb250YWluZXIpO1xuICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKHZpZXdwb3J0RWxlbWVudCk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHZpZXdwb3J0IHN0YXRlIHdpdGggY29udGFpbmVycyB1c2luZyB1dGlsaXR5XG4gICAgICAgIGNvbnN0IHN0YXRlID0gZ2V0Vmlld3BvcnRTdGF0ZShjb21wb25lbnQpO1xuICAgICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgICBzdGF0ZS52aWV3cG9ydEVsZW1lbnQgPSB2aWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgICAgc3RhdGUuaXRlbXNDb250YWluZXIgPSBpdGVtc0NvbnRhaW5lcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0b3JlIHJlZmVyZW5jZXMgb24gY29tcG9uZW50XG4gICAgICAgIChjb21wb25lbnQgYXMgYW55KS52aWV3cG9ydEVsZW1lbnQgPSB2aWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgIChjb21wb25lbnQgYXMgYW55KS5pdGVtc0NvbnRhaW5lciA9IGl0ZW1zQ29udGFpbmVyO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2NvbnN0YW50cy50c1xuXG4vKipcbiAqIFZpZXdwb3J0IENvbnN0YW50c1xuICogQ2VudHJhbGl6ZWQgY29uc3RhbnRzIGZvciBhbGwgdmlld3BvcnQgZnVuY3Rpb25hbGl0eVxuICogQ29uc29saWRhdGVkIGZyb20gdmlld3BvcnQsIHZpZXdwb3J0L2ZlYXR1cmVzLCBhbmQgbGlzdC1tYW5hZ2VyIGNvbnN0YW50c1xuICovXG5cbmV4cG9ydCBjb25zdCBWSUVXUE9SVF9DT05TVEFOVFMgPSB7XG4gIC8vIFZpcnR1YWwgc2Nyb2xsaW5nIGRlZmF1bHRzXG4gIFZJUlRVQUxfU0NST0xMOiB7XG4gICAgREVGQVVMVF9JVEVNX1NJWkU6IDQ4LFxuICAgIE9WRVJTQ0FOX0JVRkZFUjogMixcbiAgICBTQ1JPTExfU0VOU0lUSVZJVFk6IDAuNyxcbiAgICBNQVhfVklSVFVBTF9TSVpFOiAxMDAgKiAxMDAwICogMTAwMCwgLy8gMTAwTSBwaXhlbHMgLSBtb2Rlcm4gYnJvd3NlcnMgY2FuIGhhbmRsZSB0aGlzXG4gICAgQVVUT19ERVRFQ1RfSVRFTV9TSVpFOiB0cnVlLCAvLyBFbmFibGUgYXV0b21hdGljIGl0ZW0gc2l6ZSBkZXRlY3Rpb25cbiAgfSxcblxuICAvLyBTY3JvbGxpbmcgc2V0dGluZ3NcbiAgU0NST0xMSU5HOiB7XG4gICAgT1ZFUlNDQU46IDEsIC8vIEZyb20gZmVhdHVyZXMvY29uc3RhbnRzXG4gIH0sXG5cbiAgLy8gUmVuZGVyaW5nIHNldHRpbmdzXG4gIFJFTkRFUklORzoge1xuICAgIC8vIEVsZW1lbnQgcmVjeWNsaW5nXG4gICAgREVGQVVMVF9NQVhfUE9PTF9TSVpFOiAxMDAsXG4gICAgQ0xBU1NFUzoge1xuICAgICAgSVRFTTogXCJ2aWV3cG9ydC1pdGVtXCIsXG4gICAgfSxcbiAgfSxcblxuICAvLyBMb2FkaW5nIHNldHRpbmdzXG4gIExPQURJTkc6IHtcbiAgICBDQU5DRUxfVEhSRVNIT0xEOiAyNSwgLy8gcHgvbXMgLSB2ZWxvY2l0eSBhYm92ZSB3aGljaCBsb2FkcyBjYW5jZWxcbiAgICBNQVhfQ09OQ1VSUkVOVF9SRVFVRVNUUzogMSwgLy8gUGFyYWxsZWwgcmVxdWVzdHMgYWxsb3dlZFxuICAgIERFRkFVTFRfUkFOR0VfU0laRTogMjAsIC8vIEl0ZW1zIHBlciByZXF1ZXN0XG4gICAgREVCT1VOQ0VfTE9BRElORzogMTUwLCAvLyBEZWJvdW5jZSBkZWxheSAobXMpXG4gICAgTUlOX1JBTkdFX1NJWkU6IDEwLCAvLyBNaW5pbXVtIGl0ZW1zIHBlciBsb2FkXG4gICAgTUFYX1JBTkdFX1NJWkU6IDEwMCwgLy8gTWF4aW11bSBpdGVtcyBwZXIgbG9hZFxuICAgIFJFUVVFU1RfVElNRU9VVDogNTAwMCwgLy8gUmVxdWVzdCB0aW1lb3V0IChtcylcbiAgICBSRVRSWV9BVFRFTVBUUzogMiwgLy8gRmFpbGVkIHJlcXVlc3QgcmV0cmllc1xuICAgIFJFVFJZX0RFTEFZOiAxMDAwLCAvLyBEZWxheSBiZXR3ZWVuIHJldHJpZXMgKG1zKVxuICB9LFxuXG4gIC8vIFJlcXVlc3QgcXVldWUgY29uZmlndXJhdGlvbiAoZnJvbSBmZWF0dXJlcy9jb25zdGFudHMpXG4gIFJFUVVFU1RfUVVFVUU6IHtcbiAgICBFTkFCTEVEOiB0cnVlLCAvLyBFbmFibGUgcmVxdWVzdCBxdWV1aW5nXG4gICAgTUFYX1FVRVVFX1NJWkU6IDEsIC8vIE1heCBxdWV1ZWQgcmVxdWVzdHNcbiAgICBNQVhfQUNUSVZFX1JFUVVFU1RTOiAyLCAvLyBNYXggY29uY3VycmVudCBhY3RpdmUgcmVxdWVzdHNcbiAgfSxcblxuICAvLyBQbGFjZWhvbGRlciBzZXR0aW5nc1xuICBQTEFDRUhPTERFUjoge1xuICAgIE1BU0tfQ0hBUkFDVEVSOiBcIlhcIiwgLy8gVXBkYXRlZCBmcm9tIGxpc3QtbWFuYWdlclxuICAgIENMQVNTOiBcInZpZXdwb3J0LWl0ZW0tLXBsYWNlaG9sZGVyXCIsXG4gICAgTUFYX1NBTVBMRV9TSVpFOiAyMCxcbiAgICBQTEFDRUhPTERFUl9GTEFHOiBcIl9wbGFjZWhvbGRlclwiLFxuICAgIFJBTkRPTV9MRU5HVEhfVkFSSUFOQ0U6IHRydWUsXG4gIH0sXG5cbiAgLy8gU3BlZWQgdHJhY2tpbmcgKGZyb20gbGlzdC1tYW5hZ2VyKVxuICBTUEVFRF9UUkFDS0lORzoge1xuICAgIC8vIFZlbG9jaXR5IGNhbGN1bGF0aW9uXG4gICAgREVDRUxFUkFUSU9OX0ZBQ1RPUjogMC44NSwgLy8gdmVsb2NpdHkgZGVjYXkgcGVyIGZyYW1lXG4gIH0sXG5cbiAgLy8gTW9tZW50dW0gc2V0dGluZ3NcbiAgTU9NRU5UVU06IHtcbiAgICBFTkFCTEVEOiBmYWxzZSwgLy8gRW5hYmxlIG1vbWVudHVtIGJ5IGRlZmF1bHRcbiAgICBERUNFTEVSQVRJT05fRkFDVE9SOiAwLjk1LCAvLyBIb3cgcXVpY2tseSB2ZWxvY2l0eSBkZWNyZWFzZXMgcGVyIGZyYW1lIChoaWdoZXIgPSBsb25nZXIgY29hc3QpXG4gICAgTUlOX1ZFTE9DSVRZOiAwLjEsIC8vIE1pbmltdW0gdmVsb2NpdHkgYmVmb3JlIHN0b3BwaW5nIChweC9tcylcbiAgICBNSU5fRFVSQVRJT046IDc1MCwgLy8gTWF4aW11bSBnZXN0dXJlIGR1cmF0aW9uIHRvIHRyaWdnZXIgbW9tZW50dW0gKG1zKVxuICAgIE1JTl9WRUxPQ0lUWV9USFJFU0hPTEQ6IDAuNCwgLy8gTWluaW11bSB2ZWxvY2l0eSB0byB0cmlnZ2VyIG1vbWVudHVtIChweC9tcylcbiAgICBGUkFNRV9USU1FOiAxNiwgLy8gQXNzdW1lZCBmcmFtZSB0aW1lIGZvciBjYWxjdWxhdGlvbnMgKG1zKVxuICB9LFxuXG4gIC8vIEluaXRpYWwgbG9hZCBjb25maWd1cmF0aW9uIChmcm9tIGxpc3QtbWFuYWdlcilcbiAgSU5JVElBTF9MT0FEOiB7XG4gICAgU1RSQVRFR1k6IFwicGxhY2Vob2xkZXJzXCIsIC8vIFwicGxhY2Vob2xkZXJzXCIgfCBcImRpcmVjdFwiIHwgXCJwcm9ncmVzc2l2ZVwiXG4gICAgVklFV1BPUlRfTVVMVElQTElFUjogMS41LCAvLyBsb2FkIDEuNXggdmlld3BvcnQgY2FwYWNpdHlcbiAgICBNSU5fSVRFTVM6IDEwLFxuICAgIE1BWF9JVEVNUzogMTAwLFxuICAgIFBMQUNFSE9MREVSX0NPVU5UOiAyMCwgLy8gZGVmYXVsdCBwbGFjZWhvbGRlciBjb3VudFxuICAgIFNIT1dfTE9BRElOR19TVEFURTogdHJ1ZSxcbiAgICBMT0FESU5HX0RFTEFZOiAxMDAsIC8vIG1zIC0gZGVsYXkgYmVmb3JlIHNob3dpbmcgbG9hZGluZyBzdGF0ZVxuICB9LFxuXG4gIC8vIFNlbGVjdGlvbiBzZXR0aW5nc1xuICBTRUxFQ1RJT046IHtcbiAgICBTRUxFQ1RFRF9DTEFTUzogXCJ2aWV3cG9ydC1pdGVtLS1zZWxlY3RlZFwiLFxuICB9LFxuXG4gIC8vIFNjcm9sbGJhciBzZXR0aW5ncyAoZnJvbSBsaXN0LW1hbmFnZXIpXG4gIFNDUk9MTEJBUjoge1xuICAgIC8vIENTUyBjbGFzc2VzXG4gICAgQ0xBU1NFUzoge1xuICAgICAgU0NST0xMQkFSOiBcInZpZXdwb3J0X19zY3JvbGxiYXJcIixcbiAgICAgIFNDUk9MTEJBUl9UUkFDSzogXCJ2aWV3cG9ydF9fc2Nyb2xsYmFyLXRyYWNrXCIsXG4gICAgICBTQ1JPTExCQVJfVEhVTUI6IFwidmlld3BvcnRfX3Njcm9sbGJhci10aHVtYlwiLFxuICAgICAgU0NST0xMQkFSX1ZJU0lCTEU6IFwidmlld3BvcnRfX3Njcm9sbGJhci0tdmlzaWJsZVwiLFxuICAgICAgU0NST0xMQkFSX0RSQUdHSU5HOiBcInZpZXdwb3J0X19zY3JvbGxiYXItLWRyYWdnaW5nXCIsXG4gICAgICBTQ1JPTExCQVJfVEhVTUJfRFJBR0dJTkc6IFwidmlld3BvcnRfX3Njcm9sbGJhci10aHVtYi0tZHJhZ2dpbmdcIixcbiAgICB9LFxuICB9LFxuXG4gIC8vIE9yaWVudGF0aW9uIChmcm9tIGxpc3QtbWFuYWdlcilcbiAgT1JJRU5UQVRJT046IHtcbiAgICBERUZBVUxUX09SSUVOVEFUSU9OOiBcInZlcnRpY2FsXCIsXG4gICAgREVGQVVMVF9DUk9TU19BWElTX0FMSUdOTUVOVDogXCJzdHJldGNoXCIsXG4gICAgUkVWRVJTRV9ESVJFQ1RJT046IGZhbHNlLFxuICB9LFxuXG4gIFBBR0lOQVRJT046IHtcbiAgICBERUZBVUxUX1NUUkFURUdZOiBcIm9mZnNldFwiIGFzIFwib2Zmc2V0XCIgfCBcInBhZ2VcIiB8IFwiY3Vyc29yXCIsXG4gICAgREVGQVVMVF9MSU1JVDogMjAsXG4gICAgU1RSQVRFR0lFUzoge1xuICAgICAgUEFHRTogXCJwYWdlXCIgYXMgY29uc3QsXG4gICAgICBPRkZTRVQ6IFwib2Zmc2V0XCIgYXMgY29uc3QsXG4gICAgICBDVVJTT1I6IFwiY3Vyc29yXCIgYXMgY29uc3QsXG4gICAgfSxcbiAgICBDVVJTT1JfQ0xFQU5VUF9JTlRFUlZBTDogNjAwMDAsIC8vIENsZWFuIHVwIG9sZCBjdXJzb3JzIGV2ZXJ5IG1pbnV0ZVxuICAgIE1BWF9DVVJTT1JfTUFQX1NJWkU6IDEwMDAsIC8vIE1heGltdW0gbnVtYmVyIG9mIGN1cnNvcnMgdG8ga2VlcCBpbiBtZW1vcnlcbiAgICAvLyBDdXJzb3Itc3BlY2lmaWMgdmlydHVhbCBzaXppbmdcbiAgICBDVVJTT1JfU0NST0xMX01BUkdJTl9NVUxUSVBMSUVSOiAzLCAvLyBNdWx0aXBseSByYW5nZVNpemUgYnkgdGhpcyBmb3Igc2Nyb2xsIG1hcmdpblxuICAgIENVUlNPUl9NSU5fVklSVFVBTF9TSVpFX01VTFRJUExJRVI6IDMsIC8vIE1pbmltdW0gdmlydHVhbCBzaXplIGFzIG11bHRpcGxpZXIgb2YgcmFuZ2VTaXplXG4gIH0sXG59O1xuXG4vKipcbiAqIFR5cGUgZm9yIG92ZXJyaWRpbmcgY29uc3RhbnRzIGF0IHJ1bnRpbWVcbiAqL1xuZXhwb3J0IHR5cGUgVmlld3BvcnRDb25zdGFudHMgPSB0eXBlb2YgVklFV1BPUlRfQ09OU1RBTlRTO1xuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBtZXJnZSB1c2VyIGNvbnN0YW50cyB3aXRoIGRlZmF1bHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUNvbnN0YW50cyhcbiAgdXNlckNvbnN0YW50czogUGFydGlhbDxWaWV3cG9ydENvbnN0YW50cz4gPSB7fSxcbik6IFZpZXdwb3J0Q29uc3RhbnRzIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5WSUVXUE9SVF9DT05TVEFOVFMsXG4gICAgLi4udXNlckNvbnN0YW50cyxcbiAgfTtcbn1cbiIsCiAgICAiLyoqXG4gKiBWaXJ0dWFsIEZlYXR1cmUgLSBDb3JlIHZpcnR1YWwgc2Nyb2xsaW5nIGNhbGN1bGF0aW9uc1xuICogSGFuZGxlcyB2aXNpYmxlIHJhbmdlIGNhbGN1bGF0aW9uIGFuZCB0b3RhbCB2aXJ0dWFsIHNpemUgbWFuYWdlbWVudFxuICovXG5cbmltcG9ydCB0eXBlIHsgVmlld3BvcnRDb250ZXh0LCBWaWV3cG9ydENvbXBvbmVudCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVklFV1BPUlRfQ09OU1RBTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgd3JhcEluaXRpYWxpemUsIGdldFZpZXdwb3J0U3RhdGUgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZpcnR1YWxDb25maWcge1xuICBpdGVtU2l6ZT86IG51bWJlcjtcbiAgb3ZlcnNjYW4/OiBudW1iZXI7XG4gIG9yaWVudGF0aW9uPzogXCJ2ZXJ0aWNhbFwiIHwgXCJob3Jpem9udGFsXCI7XG4gIGF1dG9EZXRlY3RJdGVtU2l6ZT86IGJvb2xlYW47XG4gIGRlYnVnPzogYm9vbGVhbjtcbiAgaW5pdGlhbFNjcm9sbEluZGV4PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFZpcnR1YWwgc2Nyb2xsaW5nIGZlYXR1cmUgZm9yIHZpZXdwb3J0XG4gKiBIYW5kbGVzIHZpc2libGUgcmFuZ2UgY2FsY3VsYXRpb25zIHdpdGggY29tcHJlc3Npb24gZm9yIGxhcmdlIGRhdGFzZXRzXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoVmlydHVhbCA9IChjb25maWc6IFZpcnR1YWxDb25maWcgPSB7fSkgPT4ge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBWaWV3cG9ydENvbXBvbmVudD4oY29tcG9uZW50OiBUKTogVCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgaXRlbVNpemUsXG4gICAgICBvdmVyc2NhbiA9IFZJRVdQT1JUX0NPTlNUQU5UUy5WSVJUVUFMX1NDUk9MTC5PVkVSU0NBTl9CVUZGRVIsXG4gICAgICBvcmllbnRhdGlvbiA9IFwidmVydGljYWxcIixcbiAgICAgIGF1dG9EZXRlY3RJdGVtU2l6ZSA9IGl0ZW1TaXplID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBWSUVXUE9SVF9DT05TVEFOVFMuVklSVFVBTF9TQ1JPTEwuQVVUT19ERVRFQ1RfSVRFTV9TSVpFXG4gICAgICAgIDogZmFsc2UsXG4gICAgICBkZWJ1ZyA9IGZhbHNlLFxuICAgICAgaW5pdGlhbFNjcm9sbEluZGV4ID0gMCxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gVXNlIHByb3ZpZGVkIGl0ZW1TaXplIG9yIGRlZmF1bHQsIGJ1dCBtYXJrIGlmIHdlIHNob3VsZCBhdXRvLWRldGVjdFxuICAgIGNvbnN0IGluaXRpYWxJdGVtU2l6ZSA9XG4gICAgICBpdGVtU2l6ZSB8fCBWSUVXUE9SVF9DT05TVEFOVFMuVklSVFVBTF9TQ1JPTEwuREVGQVVMVF9JVEVNX1NJWkU7XG5cbiAgICBjb25zdCBNQVhfVklSVFVBTF9TSVpFID0gVklFV1BPUlRfQ09OU1RBTlRTLlZJUlRVQUxfU0NST0xMLk1BWF9WSVJUVUFMX1NJWkU7XG4gICAgbGV0IHZpZXdwb3J0U3RhdGU6IGFueTtcbiAgICBsZXQgaGFzQ2FsY3VsYXRlZEl0ZW1TaXplID0gZmFsc2U7XG4gICAgbGV0IGhhc1JlY2FsY3VsYXRlZFNjcm9sbEZvckNvbXByZXNzaW9uID0gZmFsc2U7IC8vIFRyYWNrIGlmIHdlJ3ZlIHJlY2FsY3VsYXRlZCBzY3JvbGwgcG9zaXRpb24gZm9yIGNvbXByZXNzaW9uXG5cbiAgICAvLyBJbml0aWFsaXplIHVzaW5nIHNoYXJlZCB3cmFwcGVyXG4gICAgd3JhcEluaXRpYWxpemUoY29tcG9uZW50LCAoKSA9PiB7XG4gICAgICB2aWV3cG9ydFN0YXRlID0gZ2V0Vmlld3BvcnRTdGF0ZShjb21wb25lbnQpO1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlKSByZXR1cm47XG5cbiAgICAgIE9iamVjdC5hc3NpZ24odmlld3BvcnRTdGF0ZSwge1xuICAgICAgICBpdGVtU2l6ZTogaW5pdGlhbEl0ZW1TaXplLFxuICAgICAgICBvdmVyc2NhbixcbiAgICAgICAgY29udGFpbmVyU2l6ZTpcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnZpZXdwb3J0RWxlbWVudD8uW1xuICAgICAgICAgICAgb3JpZW50YXRpb24gPT09IFwiaG9yaXpvbnRhbFwiID8gXCJvZmZzZXRXaWR0aFwiIDogXCJvZmZzZXRIZWlnaHRcIlxuICAgICAgICAgIF0gfHwgNjAwLFxuICAgICAgfSk7XG5cbiAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUodmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zKTtcblxuICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBpbml0aWFsIHNjcm9sbCBpbmRleCwgY2FsY3VsYXRlIGluaXRpYWwgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAvLyBOb3RlOiBXZSBzdG9yZSB0aGUgaW5pdGlhbFNjcm9sbEluZGV4IHRvIHVzZSBkaXJlY3RseSBpbiByYW5nZSBjYWxjdWxhdGlvbnNcbiAgICAgIC8vIGJlY2F1c2Ugc2Nyb2xsIHBvc2l0aW9uIG1heSBiZSBjb21wcmVzc2VkIGZvciBsYXJnZSBsaXN0c1xuICAgICAgbGV0IGluaXRpYWxTY3JvbGxQb3NpdGlvbiA9IHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gfHwgMDtcblxuICAgICAgaWYgKGluaXRpYWxTY3JvbGxJbmRleCA+IDApIHtcbiAgICAgICAgLy8gU3RvcmUgdGhlIHRhcmdldCBpbmRleCBmb3IgdXNlIGluIHJhbmdlIGNhbGN1bGF0aW9uc1xuICAgICAgICAodmlld3BvcnRTdGF0ZSBhcyBhbnkpLnRhcmdldFNjcm9sbEluZGV4ID0gaW5pdGlhbFNjcm9sbEluZGV4O1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBzY3JvbGwgcG9zaXRpb24gKG1heSBiZSBjb21wcmVzc2VkIGZvciBsYXJnZSBsaXN0cylcbiAgICAgICAgaW5pdGlhbFNjcm9sbFBvc2l0aW9uID1cbiAgICAgICAgICBpbml0aWFsU2Nyb2xsSW5kZXggKiAodmlld3BvcnRTdGF0ZS5pdGVtU2l6ZSB8fCBpbml0aWFsSXRlbVNpemUpO1xuICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID0gaW5pdGlhbFNjcm9sbFBvc2l0aW9uO1xuXG4gICAgICAgIC8vIE5vdGlmeSBzY3JvbGxpbmcgZmVhdHVyZSB0byBzeW5jIGl0cyBsb2NhbCBzY3JvbGwgcG9zaXRpb25cbiAgICAgICAgLy8gVXNlIHNldFRpbWVvdXQgdG8gZW5zdXJlIHNjcm9sbGluZyBmZWF0dXJlIGhhcyBpbml0aWFsaXplZFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6c2Nyb2xsLXBvc2l0aW9uLXN5bmNcIiwge1xuICAgICAgICAgICAgcG9zaXRpb246IGluaXRpYWxTY3JvbGxQb3NpdGlvbixcbiAgICAgICAgICAgIHNvdXJjZTogXCJpbml0aWFsLXNjcm9sbC1pbmRleFwiLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH1cblxuICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKGluaXRpYWxTY3JvbGxQb3NpdGlvbik7XG5cbiAgICAgIC8vIEVuc3VyZSBjb250YWluZXIgc2l6ZSBpcyBtZWFzdXJlZCBhZnRlciBET00gaXMgcmVhZHlcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHVwZGF0ZUNvbnRhaW5lclNpemUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gSGVscGVyIGZ1bmN0aW9uc1xuICAgIGNvbnN0IGdldENvbXByZXNzaW9uUmF0aW8gPSAoKTogbnVtYmVyID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZT8udmlydHVhbFRvdGFsU2l6ZSkgcmV0dXJuIDE7XG4gICAgICBjb25zdCBhY3R1YWxTaXplID0gdmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zICogdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZTtcbiAgICAgIHJldHVybiBhY3R1YWxTaXplIDw9IE1BWF9WSVJUVUFMX1NJWkUgPyAxIDogTUFYX1ZJUlRVQUxfU0laRSAvIGFjdHVhbFNpemU7XG4gICAgfTtcblxuICAgIGNvbnN0IGxvZyA9IChtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBhbnkpID0+IHtcbiAgICAgIGlmIChkZWJ1ZykgY29uc29sZS5sb2coYFtWaXJ0dWFsXSAke21lc3NhZ2V9YCwgZGF0YSk7XG4gICAgfTtcblxuICAgIC8vIENhbGN1bGF0ZSB2aXNpYmxlIHJhbmdlXG4gICAgY29uc3QgY2FsY3VsYXRlVmlzaWJsZVJhbmdlID0gKFxuICAgICAgc2Nyb2xsUG9zaXRpb246IG51bWJlcixcbiAgICApOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0gPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIltWaXJ0dWFsXSBObyB2aWV3cG9ydCBzdGF0ZSwgcmV0dXJuaW5nIGVtcHR5IHJhbmdlXCIpO1xuICAgICAgICByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgY29udGFpbmVyU2l6ZSwgdG90YWxJdGVtcyB9ID0gdmlld3BvcnRTdGF0ZTtcblxuICAgICAgLy8gRWFybHkgcmV0dXJucyBmb3IgaW52YWxpZCBzdGF0ZXNcbiAgICAgIGlmIChcbiAgICAgICAgIWNvbnRhaW5lclNpemUgfHxcbiAgICAgICAgY29udGFpbmVyU2l6ZSA8PSAwIHx8XG4gICAgICAgICF0b3RhbEl0ZW1zIHx8XG4gICAgICAgIHRvdGFsSXRlbXMgPD0gMFxuICAgICAgKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgYW4gaW5pdGlhbFNjcm9sbEluZGV4LCB1c2UgaXQgdG8gY2FsY3VsYXRlIHRoZSByYW5nZVxuICAgICAgICAvLyBldmVuIHdoZW4gdG90YWxJdGVtcyBpcyAwIChub3QgeWV0IGxvYWRlZCBmcm9tIEFQSSlcbiAgICAgICAgaWYgKGluaXRpYWxTY3JvbGxJbmRleCA+IDApIHtcbiAgICAgICAgICBjb25zdCB2aXNpYmxlQ291bnQgPSBNYXRoLmNlaWwoXG4gICAgICAgICAgICAoY29udGFpbmVyU2l6ZSB8fCA2MDApIC9cbiAgICAgICAgICAgICAgKHZpZXdwb3J0U3RhdGUuaXRlbVNpemUgfHwgaW5pdGlhbEl0ZW1TaXplKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoMCwgaW5pdGlhbFNjcm9sbEluZGV4IC0gb3ZlcnNjYW4pO1xuICAgICAgICAgIGNvbnN0IGVuZCA9IGluaXRpYWxTY3JvbGxJbmRleCArIHZpc2libGVDb3VudCArIG92ZXJzY2FuO1xuICAgICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgICAgfVxuICAgICAgICBsb2coYEludmFsaWQgc3RhdGU6IGNvbnRhaW5lcj0ke2NvbnRhaW5lclNpemV9LCBpdGVtcz0ke3RvdGFsSXRlbXN9YCk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiAwLCBlbmQ6IDAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmlydHVhbFNpemUgPVxuICAgICAgICB2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemUgfHwgdG90YWxJdGVtcyAqIHZpZXdwb3J0U3RhdGUuaXRlbVNpemU7XG4gICAgICBjb25zdCB2aXNpYmxlQ291bnQgPSBNYXRoLmNlaWwoY29udGFpbmVyU2l6ZSAvIHZpZXdwb3J0U3RhdGUuaXRlbVNpemUpO1xuICAgICAgY29uc3QgY29tcHJlc3Npb25SYXRpbyA9IGdldENvbXByZXNzaW9uUmF0aW8oKTtcblxuICAgICAgbGV0IHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyO1xuXG4gICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGEgdGFyZ2V0IHNjcm9sbCBpbmRleCAoZm9yIGluaXRpYWxTY3JvbGxJbmRleCB3aXRoIGNvbXByZXNzaW9uKVxuICAgICAgY29uc3QgdGFyZ2V0U2Nyb2xsSW5kZXggPSAodmlld3BvcnRTdGF0ZSBhcyBhbnkpLnRhcmdldFNjcm9sbEluZGV4O1xuXG4gICAgICBpZiAoY29tcHJlc3Npb25SYXRpbyA8IDEpIHtcbiAgICAgICAgLy8gQ29tcHJlc3NlZCBzcGFjZSBjYWxjdWxhdGlvblxuICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgdGFyZ2V0U2Nyb2xsSW5kZXgsIHVzZSBpdCBkaXJlY3RseSBpbnN0ZWFkIG9mIGNhbGN1bGF0aW5nIGZyb20gc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyB3ZSBzaG93IHRoZSBjb3JyZWN0IGl0ZW1zIGV2ZW4gd2hlbiB2aXJ0dWFsIHNwYWNlIGlzIGNvbXByZXNzZWRcbiAgICAgICAgaWYgKHRhcmdldFNjcm9sbEluZGV4ICE9PSB1bmRlZmluZWQgJiYgdGFyZ2V0U2Nyb2xsSW5kZXggPiAwKSB7XG4gICAgICAgICAgc3RhcnQgPSBNYXRoLm1heCgwLCB0YXJnZXRTY3JvbGxJbmRleCAtIG92ZXJzY2FuKTtcbiAgICAgICAgICBlbmQgPSBNYXRoLm1pbihcbiAgICAgICAgICAgIHRvdGFsSXRlbXMgLSAxLFxuICAgICAgICAgICAgdGFyZ2V0U2Nyb2xsSW5kZXggKyB2aXNpYmxlQ291bnQgKyBvdmVyc2NhbixcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIENsZWFyIHRhcmdldFNjcm9sbEluZGV4IGFmdGVyIGZpcnN0IHVzZSBzbyBub3JtYWwgc2Nyb2xsaW5nIHdvcmtzXG4gICAgICAgICAgZGVsZXRlICh2aWV3cG9ydFN0YXRlIGFzIGFueSkudGFyZ2V0U2Nyb2xsSW5kZXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgc2Nyb2xsUmF0aW8gPSBzY3JvbGxQb3NpdGlvbiAvIHZpcnR1YWxTaXplO1xuICAgICAgICAgIGNvbnN0IGV4YWN0SW5kZXggPSBzY3JvbGxSYXRpbyAqIHRvdGFsSXRlbXM7XG4gICAgICAgICAgc3RhcnQgPSBNYXRoLmZsb29yKGV4YWN0SW5kZXgpO1xuICAgICAgICAgIGVuZCA9IE1hdGguY2VpbChleGFjdEluZGV4KSArIHZpc2libGVDb3VudDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5lYXItYm90dG9tIGhhbmRsaW5nXG4gICAgICAgIGNvbnN0IG1heFNjcm9sbCA9IHZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZTtcbiAgICAgICAgY29uc3QgZGlzdGFuY2VGcm9tQm90dG9tID0gbWF4U2Nyb2xsIC0gc2Nyb2xsUG9zaXRpb247XG5cbiAgICAgICAgaWYgKGRpc3RhbmNlRnJvbUJvdHRvbSA8PSBjb250YWluZXJTaXplICYmIGRpc3RhbmNlRnJvbUJvdHRvbSA+PSAtMSkge1xuICAgICAgICAgIGNvbnN0IGl0ZW1zQXRCb3R0b20gPSBNYXRoLmZsb29yKFxuICAgICAgICAgICAgY29udGFpbmVyU2l6ZSAvIHZpZXdwb3J0U3RhdGUuaXRlbVNpemUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBmaXJzdFZpc2libGVBdEJvdHRvbSA9IE1hdGgubWF4KDAsIHRvdGFsSXRlbXMgLSBpdGVtc0F0Qm90dG9tKTtcbiAgICAgICAgICBjb25zdCBpbnRlcnBvbGF0aW9uID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgTWF0aC5taW4oMSwgMSAtIGRpc3RhbmNlRnJvbUJvdHRvbSAvIGNvbnRhaW5lclNpemUpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBzdGFydCA9IE1hdGguZmxvb3IoXG4gICAgICAgICAgICBzdGFydCArIChmaXJzdFZpc2libGVBdEJvdHRvbSAtIHN0YXJ0KSAqIGludGVycG9sYXRpb24sXG4gICAgICAgICAgKTtcbiAgICAgICAgICBlbmQgPVxuICAgICAgICAgICAgZGlzdGFuY2VGcm9tQm90dG9tIDw9IDFcbiAgICAgICAgICAgICAgPyB0b3RhbEl0ZW1zIC0gMVxuICAgICAgICAgICAgICA6IE1hdGgubWluKHRvdGFsSXRlbXMgLSAxLCBzdGFydCArIHZpc2libGVDb3VudCArIG92ZXJzY2FuKTtcblxuICAgICAgICAgIGxvZyhcIk5lYXIgYm90dG9tIGNhbGN1bGF0aW9uOlwiLCB7XG4gICAgICAgICAgICBkaXN0YW5jZUZyb21Cb3R0b20sXG4gICAgICAgICAgICBpbnRlcnBvbGF0aW9uLFxuICAgICAgICAgICAgc3RhcnQsXG4gICAgICAgICAgICBlbmQsXG4gICAgICAgICAgICBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgICAgIHRvdGFsSXRlbXMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBvdmVyc2NhblxuICAgICAgICBzdGFydCA9IE1hdGgubWF4KDAsIHN0YXJ0IC0gb3ZlcnNjYW4pO1xuICAgICAgICBlbmQgPSBNYXRoLm1pbih0b3RhbEl0ZW1zIC0gMSwgZW5kICsgb3ZlcnNjYW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRGlyZWN0IGNhbGN1bGF0aW9uXG4gICAgICAgIHN0YXJ0ID0gTWF0aC5tYXgoXG4gICAgICAgICAgMCxcbiAgICAgICAgICBNYXRoLmZsb29yKHNjcm9sbFBvc2l0aW9uIC8gdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZSkgLSBvdmVyc2NhbixcbiAgICAgICAgKTtcbiAgICAgICAgZW5kID0gTWF0aC5taW4odG90YWxJdGVtcyAtIDEsIHN0YXJ0ICsgdmlzaWJsZUNvdW50ICsgb3ZlcnNjYW4gKiAyKTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgb3V0cHV0XG4gICAgICBpZiAoaXNOYU4oc3RhcnQpIHx8IGlzTmFOKGVuZCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIltWaXJ0dWFsXSBOYU4gaW4gcmFuZ2UgY2FsY3VsYXRpb246XCIsIHtcbiAgICAgICAgICBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgICBjb250YWluZXJTaXplLFxuICAgICAgICAgIHRvdGFsSXRlbXMsXG4gICAgICAgICAgaXRlbVNpemU6IHZpZXdwb3J0U3RhdGUuaXRlbVNpemUsXG4gICAgICAgICAgY29tcHJlc3Npb25SYXRpbyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiAwLCBlbmQ6IDAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gbG9nKGBSYW5nZTogJHtzdGFydH0tJHtlbmR9IChzY3JvbGw6ICR7c2Nyb2xsUG9zaXRpb259KWApO1xuXG4gICAgICAvLyBTdHJhdGVnaWMgbG9nIGZvciBsYXN0IHJhbmdlXG4gICAgICAvLyBpZiAoZW5kID49IHRvdGFsSXRlbXMgLSAxMCkge1xuICAgICAgLy8gICBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgICBgW1ZpcnR1YWxdIE5lYXIgZW5kIHJhbmdlOiAke3N0YXJ0fS0ke2VuZH0sIHRvdGFsSXRlbXM9JHt0b3RhbEl0ZW1zfSwgbGFzdEl0ZW1Qb3M9JHtcbiAgICAgIC8vICAgICAgIGVuZCAqIHZpZXdwb3J0U3RhdGUuaXRlbVNpemVcbiAgICAgIC8vICAgICB9cHgsIHZpcnR1YWxTaXplPSR7dmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplfXB4YFxuICAgICAgLy8gICApO1xuICAgICAgLy8gfVxuXG4gICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgfTtcblxuICAgIC8vIENhbGN1bGF0ZSBhY3R1YWwgdmlzaWJsZSByYW5nZSAod2l0aG91dCBvdmVyc2NhbiBidWZmZXIpXG4gICAgY29uc3QgY2FsY3VsYXRlQWN0dWFsVmlzaWJsZVJhbmdlID0gKHNjcm9sbFBvc2l0aW9uOiBudW1iZXIpID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSkgcmV0dXJuIHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xuXG4gICAgICBjb25zdCB7IGNvbnRhaW5lclNpemUsIHRvdGFsSXRlbXMgfSA9IHZpZXdwb3J0U3RhdGU7XG4gICAgICBpZiAoIWNvbnRhaW5lclNpemUgfHwgIXRvdGFsSXRlbXMpIHJldHVybiB7IHN0YXJ0OiAwLCBlbmQ6IDAgfTtcblxuICAgICAgY29uc3QgaXRlbVNpemUgPSB2aWV3cG9ydFN0YXRlLml0ZW1TaXplO1xuICAgICAgY29uc3QgdmlzaWJsZUNvdW50ID0gTWF0aC5jZWlsKGNvbnRhaW5lclNpemUgLyBpdGVtU2l6ZSk7XG4gICAgICBjb25zdCBjb21wcmVzc2lvblJhdGlvID0gdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplXG4gICAgICAgID8gKHRvdGFsSXRlbXMgKiBpdGVtU2l6ZSkgLyB2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemVcbiAgICAgICAgOiAxO1xuXG4gICAgICBsZXQgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXI7XG5cbiAgICAgIGlmIChjb21wcmVzc2lvblJhdGlvIDwgMSkge1xuICAgICAgICAvLyBDb21wcmVzc2VkIHNwYWNlIC0gY2FsY3VsYXRlIGJhc2VkIG9uIHNjcm9sbCByYXRpb1xuICAgICAgICBjb25zdCB2aXJ0dWFsU2l6ZSA9XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplIHx8IHRvdGFsSXRlbXMgKiBpdGVtU2l6ZTtcbiAgICAgICAgY29uc3Qgc2Nyb2xsUmF0aW8gPSBzY3JvbGxQb3NpdGlvbiAvIHZpcnR1YWxTaXplO1xuICAgICAgICBzdGFydCA9IE1hdGguZmxvb3Ioc2Nyb2xsUmF0aW8gKiB0b3RhbEl0ZW1zKTtcbiAgICAgICAgZW5kID0gTWF0aC5taW4odG90YWxJdGVtcyAtIDEsIHN0YXJ0ICsgdmlzaWJsZUNvdW50IC0gMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEaXJlY3QgY2FsY3VsYXRpb25cbiAgICAgICAgc3RhcnQgPSBNYXRoLmZsb29yKHNjcm9sbFBvc2l0aW9uIC8gaXRlbVNpemUpO1xuICAgICAgICBlbmQgPSBNYXRoLm1pbih0b3RhbEl0ZW1zIC0gMSwgc3RhcnQgKyB2aXNpYmxlQ291bnQgLSAxKTtcbiAgICAgIH1cblxuICAgICAgLy8gRW5zdXJlIHZhbGlkIHJhbmdlXG4gICAgICBzdGFydCA9IE1hdGgubWF4KDAsIHN0YXJ0KTtcbiAgICAgIGVuZCA9IE1hdGgubWF4KHN0YXJ0LCBlbmQpO1xuXG4gICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSBmdW5jdGlvbnNcbiAgICBjb25zdCB1cGRhdGVWaXNpYmxlUmFuZ2UgPSAoc2Nyb2xsUG9zaXRpb246IG51bWJlcikgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlKSByZXR1cm47XG4gICAgICB2aWV3cG9ydFN0YXRlLnZpc2libGVSYW5nZSA9IGNhbGN1bGF0ZVZpc2libGVSYW5nZShzY3JvbGxQb3NpdGlvbik7XG5cbiAgICAgIC8vIERFQlVHOiBMb2cgd2hvIGNhbGxzIHVwZGF0ZVZpc2libGVSYW5nZSB3aXRoIDAgd2hlbiBpdCBzaG91bGQgYmUgbm9uLXplcm9cblxuICAgICAgLy8gQ2FsY3VsYXRlIGFjdHVhbCB2aXNpYmxlIHJhbmdlICh3aXRob3V0IG92ZXJzY2FuKSBmb3IgVUkgZGlzcGxheVxuICAgICAgY29uc3QgYWN0dWFsVmlzaWJsZVJhbmdlID0gY2FsY3VsYXRlQWN0dWFsVmlzaWJsZVJhbmdlKHNjcm9sbFBvc2l0aW9uKTtcblxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnJhbmdlLWNoYW5nZWRcIiwge1xuICAgICAgICByYW5nZTogdmlld3BvcnRTdGF0ZS52aXNpYmxlUmFuZ2UsXG4gICAgICAgIHZpc2libGVSYW5nZTogYWN0dWFsVmlzaWJsZVJhbmdlLFxuICAgICAgICBzY3JvbGxQb3NpdGlvbixcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBVcGRhdGUgdG90YWwgdmlydHVhbCBzaXplXG4gICAgY29uc3QgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZSA9ICh0b3RhbEl0ZW1zOiBudW1iZXIpID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBvbGRTaXplID0gdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplO1xuICAgICAgdmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zID0gdG90YWxJdGVtcztcbiAgICAgIGNvbnN0IGFjdHVhbFNpemUgPSB0b3RhbEl0ZW1zICogdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZTtcblxuICAgICAgLy8gR2V0IHBhZGRpbmcgZnJvbSB0aGUgaXRlbXMgY29udGFpbmVyIGlmIGF2YWlsYWJsZVxuICAgICAgbGV0IHRvdGFsUGFkZGluZyA9IDA7XG4gICAgICBpZiAodmlld3BvcnRTdGF0ZS5pdGVtc0NvbnRhaW5lcikge1xuICAgICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoXG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5pdGVtc0NvbnRhaW5lcixcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcGFkZGluZ1RvcCA9IHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5wYWRkaW5nVG9wKSB8fCAwO1xuICAgICAgICBjb25zdCBwYWRkaW5nQm90dG9tID0gcGFyc2VGbG9hdChjb21wdXRlZFN0eWxlLnBhZGRpbmdCb3R0b20pIHx8IDA7XG4gICAgICAgIHRvdGFsUGFkZGluZyA9IHBhZGRpbmdUb3AgKyBwYWRkaW5nQm90dG9tO1xuICAgICAgfVxuXG4gICAgICAvLyBJbmNsdWRlIHBhZGRpbmcgaW4gdGhlIHZpcnR1YWwgc2l6ZVxuICAgICAgdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplID0gTWF0aC5taW4oXG4gICAgICAgIGFjdHVhbFNpemUgKyB0b3RhbFBhZGRpbmcsXG4gICAgICAgIE1BWF9WSVJUVUFMX1NJWkUsXG4gICAgICApO1xuXG4gICAgICAvLyBTdHJhdGVnaWMgbG9nIGZvciBkZWJ1Z2dpbmcgZ2FwIGlzc3VlXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtWaXJ0dWFsXSBUb3RhbCBzaXplIHVwZGF0ZTogaXRlbXM9JHt0b3RhbEl0ZW1zfSwgaXRlbVNpemU9JHt2aWV3cG9ydFN0YXRlLml0ZW1TaXplfXB4LCBwYWRkaW5nPSR7dG90YWxQYWRkaW5nfXB4LCB2aXJ0dWFsU2l6ZT0ke3ZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZX1weCAod2FzICR7b2xkU2l6ZX1weClgXG4gICAgICAvLyApO1xuXG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6dmlydHVhbC1zaXplLWNoYW5nZWRcIiwge1xuICAgICAgICB0b3RhbFZpcnR1YWxTaXplOiB2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemUsXG4gICAgICAgIHRvdGFsSXRlbXM6IHRvdGFsSXRlbXMsXG4gICAgICAgIGNvbXByZXNzaW9uUmF0aW86IGdldENvbXByZXNzaW9uUmF0aW8oKSxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBVcGRhdGUgY29udGFpbmVyIHNpemVcbiAgICBjb25zdCB1cGRhdGVDb250YWluZXJTaXplID0gKCkgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlIHx8ICF2aWV3cG9ydFN0YXRlLnZpZXdwb3J0RWxlbWVudCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBzaXplID1cbiAgICAgICAgdmlld3BvcnRTdGF0ZS52aWV3cG9ydEVsZW1lbnRbXG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5vcmllbnRhdGlvbiA9PT0gXCJob3Jpem9udGFsXCJcbiAgICAgICAgICAgID8gXCJvZmZzZXRXaWR0aFwiXG4gICAgICAgICAgICA6IFwib2Zmc2V0SGVpZ2h0XCJcbiAgICAgICAgXTtcblxuICAgICAgLy8gTG9nIHRoZSBhY3R1YWwgbWVhc3VyZW1lbnRcbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1ZpcnR1YWxdIENvbnRhaW5lciBzaXplIG1lYXN1cmVkOiAke3NpemV9cHggZnJvbSB2aWV3cG9ydCBlbGVtZW50YFxuICAgICAgLy8gKTtcblxuICAgICAgaWYgKHNpemUgIT09IHZpZXdwb3J0U3RhdGUuY29udGFpbmVyU2l6ZSkge1xuICAgICAgICB2aWV3cG9ydFN0YXRlLmNvbnRhaW5lclNpemUgPSBzaXplO1xuICAgICAgICB1cGRhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiB8fCAwKTtcbiAgICAgICAgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZSh2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMpOyAvLyBBbHNvIHVwZGF0ZSB2aXJ0dWFsIHNpemVcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OmNvbnRhaW5lci1zaXplLWNoYW5nZWRcIiwge1xuICAgICAgICAgIGNvbnRhaW5lclNpemU6IHNpemUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBPdmVycmlkZSB2aWV3cG9ydCBtZXRob2RzXG4gICAgY29tcG9uZW50LnZpZXdwb3J0LmdldFZpc2libGVSYW5nZSA9ICgpID0+XG4gICAgICB2aWV3cG9ydFN0YXRlPy52aXNpYmxlUmFuZ2UgfHxcbiAgICAgIGNhbGN1bGF0ZVZpc2libGVSYW5nZSh2aWV3cG9ydFN0YXRlPy5zY3JvbGxQb3NpdGlvbiB8fCAwKTtcblxuICAgIC8vIEV2ZW50IGxpc3RlbmVyc1xuICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6c2Nyb2xsXCIsIChkYXRhOiBhbnkpID0+XG4gICAgICB1cGRhdGVWaXNpYmxlUmFuZ2UoZGF0YS5wb3NpdGlvbiksXG4gICAgKTtcblxuICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6aXRlbXMtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICBpZiAoZGF0YS50b3RhbEl0ZW1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZShkYXRhLnRvdGFsSXRlbXMpO1xuICAgICAgICB1cGRhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZT8uc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIHRvdGFsIGl0ZW1zIGNoYW5nZXMgKGltcG9ydGFudCBmb3IgY3Vyc29yIHBhZ2luYXRpb24pXG4gICAgLy8gTm90ZTogc2V0VG90YWxJdGVtcygpIHVwZGF0ZXMgdmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zIEJFRk9SRSBlbWl0dGluZyB0aGlzIGV2ZW50LFxuICAgIC8vIHNvIHdlIGNhbid0IHJlbHkgb24gdmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zIHRvIGRldGVjdCB0aGUgZmlyc3QgdG90YWwuXG4gICAgLy8gSW5zdGVhZCB3ZSB1c2UgdGhlIGhhc1JlY2FsY3VsYXRlZFNjcm9sbEZvckNvbXByZXNzaW9uIGZsYWcuXG4gICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDp0b3RhbC1pdGVtcy1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgIGlmIChkYXRhLnRvdGFsID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgICAgLy8gRklYOiBXaGVuIHdlIGZpcnN0IHJlY2VpdmUgdG90YWxJdGVtcyB3aXRoIGluaXRpYWxTY3JvbGxJbmRleCBhbmQgY29tcHJlc3Npb24sXG4gICAgICAvLyByZWNhbGN1bGF0ZSBzY3JvbGwgcG9zaXRpb24gdG8gYWNjb3VudCBmb3IgY29tcHJlc3Npb24uXG4gICAgICAvLyBXaXRob3V0IHRoaXMsIGluaXRpYWxTY3JvbGxJbmRleCBjYWxjdWxhdGVzIHBvc2l0aW9uIGFzIGluZGV4ICogaXRlbVNpemUsXG4gICAgICAvLyBidXQgcmVuZGVyaW5nIHVzZXMgY29tcHJlc3NlZCBzcGFjZSwgY2F1c2luZyBpdGVtcyB0byBhcHBlYXIgb2ZmLXNjcmVlbi5cbiAgICAgIC8vXG4gICAgICAvLyBXZSBjaGVjayB0aGlzIEJFRk9SRSB1cGRhdGVUb3RhbFZpcnR1YWxTaXplIGJlY2F1c2Ugd2UgbmVlZCB0byByZWNhbGN1bGF0ZVxuICAgICAgLy8gc2Nyb2xsIHBvc2l0aW9uIGJhc2VkIG9uIHRoZSBuZXcgdG90YWwsIGFuZCB0aGUgZmxhZyBlbnN1cmVzIHdlIG9ubHkgZG8gdGhpcyBvbmNlLlxuICAgICAgaWYgKFxuICAgICAgICBpbml0aWFsU2Nyb2xsSW5kZXggPiAwICYmXG4gICAgICAgICFoYXNSZWNhbGN1bGF0ZWRTY3JvbGxGb3JDb21wcmVzc2lvbiAmJlxuICAgICAgICBkYXRhLnRvdGFsID4gMFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGFjdHVhbFRvdGFsU2l6ZSA9IGRhdGEudG90YWwgKiB2aWV3cG9ydFN0YXRlLml0ZW1TaXplO1xuICAgICAgICBjb25zdCBpc0NvbXByZXNzZWQgPSBhY3R1YWxUb3RhbFNpemUgPiBNQVhfVklSVFVBTF9TSVpFO1xuXG4gICAgICAgIGlmIChpc0NvbXByZXNzZWQpIHtcbiAgICAgICAgICAvLyBSZWNhbGN1bGF0ZSBzY3JvbGwgcG9zaXRpb24gdXNpbmcgY29tcHJlc3Npb24tYXdhcmUgZm9ybXVsYVxuICAgICAgICAgIC8vIFNhbWUgZm9ybXVsYSB1c2VkIGluIHNjcm9sbFRvSW5kZXhcbiAgICAgICAgICBjb25zdCByYXRpbyA9IGluaXRpYWxTY3JvbGxJbmRleCAvIGRhdGEudG90YWw7XG4gICAgICAgICAgY29uc3QgY29tcHJlc3NlZFBvc2l0aW9uID0gcmF0aW8gKiBNQVhfVklSVFVBTF9TSVpFO1xuXG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiA9IGNvbXByZXNzZWRQb3NpdGlvbjtcblxuICAgICAgICAgIC8vIE5vdGlmeSBzY3JvbGxpbmcgZmVhdHVyZSB0byBzeW5jIGl0cyBsb2NhbCBzY3JvbGwgcG9zaXRpb25cbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6c2Nyb2xsLXBvc2l0aW9uLXN5bmNcIiwge1xuICAgICAgICAgICAgcG9zaXRpb246IGNvbXByZXNzZWRQb3NpdGlvbixcbiAgICAgICAgICAgIHNvdXJjZTogXCJjb21wcmVzc2lvbi1yZWNhbGN1bGF0aW9uXCIsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBDbGVhciB0YXJnZXRTY3JvbGxJbmRleCBzaW5jZSB3ZSd2ZSBub3cgY29ycmVjdGx5IGNhbGN1bGF0ZWQgdGhlIHNjcm9sbCBwb3NpdGlvblxuICAgICAgICAgIC8vIFRoZSBub3JtYWwgY29tcHJlc3NlZCBzY3JvbGxpbmcgZm9ybXVsYSB3aWxsIG5vdyB3b3JrIGNvcnJlY3RseVxuICAgICAgICAgIGRlbGV0ZSAodmlld3BvcnRTdGF0ZSBhcyBhbnkpLnRhcmdldFNjcm9sbEluZGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFyayBhcyBkb25lIGV2ZW4gaWYgbm90IGNvbXByZXNzZWQgLSB3ZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBjaGVjayBvbmNlXG4gICAgICAgIGhhc1JlY2FsY3VsYXRlZFNjcm9sbEZvckNvbXByZXNzaW9uID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZShkYXRhLnRvdGFsKTtcbiAgICAgIHVwZGF0ZVZpc2libGVSYW5nZSh2aWV3cG9ydFN0YXRlPy5zY3JvbGxQb3NpdGlvbiB8fCAwKTtcblxuICAgICAgLy8gVHJpZ2dlciBhIHJlbmRlciB0byB1cGRhdGUgdGhlIHZpZXdcbiAgICAgIGNvbXBvbmVudC52aWV3cG9ydD8ucmVuZGVySXRlbXM/LigpO1xuICAgIH0pO1xuXG4gICAgLy8gTGlzdGVuIGZvciBjb250YWluZXIgc2l6ZSBjaGFuZ2VzIHRvIHJlY2FsY3VsYXRlIHZpcnR1YWwgc2l6ZVxuICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6Y29udGFpbmVyLXNpemUtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICBpZiAodmlld3BvcnRTdGF0ZSAmJiBkYXRhLmNvbnRhaW5lclNpemUgIT09IHZpZXdwb3J0U3RhdGUuY29udGFpbmVyU2l6ZSkge1xuICAgICAgICB2aWV3cG9ydFN0YXRlLmNvbnRhaW5lclNpemUgPSBkYXRhLmNvbnRhaW5lclNpemU7XG4gICAgICAgIC8vIFJlY2FsY3VsYXRlIHZpcnR1YWwgc2l6ZSB3aXRoIG5ldyBjb250YWluZXIgc2l6ZVxuICAgICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplKHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyk7XG4gICAgICAgIHVwZGF0ZVZpc2libGVSYW5nZSh2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uIHx8IDApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29tcG9uZW50Lm9uPy4oXCJjb2xsZWN0aW9uOnJhbmdlLWxvYWRlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGRhdGEudG90YWwgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBkYXRhLnRvdGFsICE9PSB2aWV3cG9ydFN0YXRlPy50b3RhbEl0ZW1zXG4gICAgICApIHtcbiAgICAgICAgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZShkYXRhLnRvdGFsKTtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZVZpc2libGVSYW5nZSh2aWV3cG9ydFN0YXRlPy5zY3JvbGxQb3NpdGlvbiB8fCAwKTtcbiAgICAgIGNvbXBvbmVudC52aWV3cG9ydD8ucmVuZGVySXRlbXM/LigpO1xuICAgIH0pO1xuXG4gICAgLy8gTGlzdGVuIGZvciBmaXJzdCBpdGVtcyByZW5kZXJlZCB0byBjYWxjdWxhdGUgaXRlbSBzaXplIChpZiBhdXRvLWRldGVjdGlvbiBpcyBlbmFibGVkKVxuICAgIGlmIChhdXRvRGV0ZWN0SXRlbVNpemUpIHtcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6aXRlbXMtcmVuZGVyZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIWhhc0NhbGN1bGF0ZWRJdGVtU2l6ZSAmJlxuICAgICAgICAgIGRhdGEuZWxlbWVudHM/Lmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIENhbGN1bGF0ZSBhdmVyYWdlIGl0ZW0gc2l6ZSBmcm9tIGZpcnN0IHJlbmRlcmVkIGJhdGNoXG4gICAgICAgICAgY29uc3Qgc2l6ZXM6IG51bWJlcltdID0gW107XG4gICAgICAgICAgY29uc3Qgc2l6ZVByb3BlcnR5ID1cbiAgICAgICAgICAgIG9yaWVudGF0aW9uID09PSBcImhvcml6b250YWxcIiA/IFwib2Zmc2V0V2lkdGhcIiA6IFwib2Zmc2V0SGVpZ2h0XCI7XG5cbiAgICAgICAgICBkYXRhLmVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzaXplID0gZWxlbWVudFtzaXplUHJvcGVydHldO1xuICAgICAgICAgICAgaWYgKHNpemUgPiAwKSB7XG4gICAgICAgICAgICAgIHNpemVzLnB1c2goc2l6ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoc2l6ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgYXZnU2l6ZSA9IE1hdGgucm91bmQoXG4gICAgICAgICAgICAgIHNpemVzLnJlZHVjZSgoc3VtLCBzaXplKSA9PiBzdW0gKyBzaXplLCAwKSAvIHNpemVzLmxlbmd0aCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c0l0ZW1TaXplID0gdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZTtcbiAgICAgICAgICAgIHZpZXdwb3J0U3RhdGUuaXRlbVNpemUgPSBhdmdTaXplO1xuXG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGFuIGluaXRpYWxTY3JvbGxJbmRleCwgcmVjYWxjdWxhdGUgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgICAgICAvLyBiYXNlZCBvbiB0aGUgbmV3bHkgZGV0ZWN0ZWQgaXRlbSBzaXplXG4gICAgICAgICAgICBpZiAoaW5pdGlhbFNjcm9sbEluZGV4ID4gMCAmJiBhdmdTaXplICE9PSBwcmV2aW91c0l0ZW1TaXplKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG5ld1Njcm9sbFBvc2l0aW9uID0gaW5pdGlhbFNjcm9sbEluZGV4ICogYXZnU2l6ZTtcbiAgICAgICAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiA9IG5ld1Njcm9sbFBvc2l0aW9uO1xuXG4gICAgICAgICAgICAgIC8vIE5vdGlmeSBzY3JvbGxpbmcgZmVhdHVyZSB0byBzeW5jIGl0cyBsb2NhbCBzY3JvbGwgcG9zaXRpb25cbiAgICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnNjcm9sbC1wb3NpdGlvbi1zeW5jXCIsIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogbmV3U2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgICAgICAgc291cmNlOiBcIml0ZW0tc2l6ZS1kZXRlY3RlZFwiLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmVjYWxjdWxhdGUgZXZlcnl0aGluZyB3aXRoIG5ldyBzaXplXG4gICAgICAgICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplKHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyk7XG4gICAgICAgICAgICB1cGRhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiB8fCAwKTtcblxuICAgICAgICAgICAgLy8gUmUtcmVuZGVyIHRvIGFkanVzdCBwb3NpdGlvbnNcbiAgICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydD8ucmVuZGVySXRlbXM/LigpO1xuXG4gICAgICAgICAgICAvLyBFbWl0IGV2ZW50IGZvciBzaXplIGNoYW5nZVxuICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0Oml0ZW0tc2l6ZS1kZXRlY3RlZFwiLCB7XG4gICAgICAgICAgICAgIHByZXZpb3VzU2l6ZTogaW5pdGlhbEl0ZW1TaXplLFxuICAgICAgICAgICAgICBkZXRlY3RlZFNpemU6IGF2Z1NpemUsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaGFzQ2FsY3VsYXRlZEl0ZW1TaXplID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEV4cG9zZSB2aXJ0dWFsIEFQSVxuICAgIGNvbnN0IGNvbXByZXNzaW9uUmF0aW8gPSBnZXRDb21wcmVzc2lvblJhdGlvKCk7XG4gICAgKGNvbXBvbmVudCBhcyBhbnkpLnZpcnR1YWwgPSB7XG4gICAgICBjYWxjdWxhdGVWaXNpYmxlUmFuZ2UsXG4gICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplLFxuICAgICAgZ2V0VG90YWxWaXJ0dWFsU2l6ZTogKCkgPT4gdmlld3BvcnRTdGF0ZT8udmlydHVhbFRvdGFsU2l6ZSB8fCAwLFxuICAgICAgZ2V0Q29udGFpbmVyU2l6ZTogKCkgPT4gdmlld3BvcnRTdGF0ZT8uY29udGFpbmVyU2l6ZSB8fCAwLFxuICAgICAgdXBkYXRlQ29udGFpbmVyU2l6ZTogKHNpemU6IG51bWJlcikgPT4ge1xuICAgICAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuY29udGFpbmVyU2l6ZSA9IHNpemU7XG4gICAgICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBnZXRJdGVtU2l6ZTogKCkgPT4gdmlld3BvcnRTdGF0ZT8uaXRlbVNpemUgfHwgaW5pdGlhbEl0ZW1TaXplLFxuICAgICAgY2FsY3VsYXRlSW5kZXhGcm9tUG9zaXRpb246IChwb3NpdGlvbjogbnVtYmVyKSA9PlxuICAgICAgICBNYXRoLmZsb29yKFxuICAgICAgICAgIHBvc2l0aW9uIC9cbiAgICAgICAgICAgICgodmlld3BvcnRTdGF0ZT8uaXRlbVNpemUgfHwgaW5pdGlhbEl0ZW1TaXplKSAqIGNvbXByZXNzaW9uUmF0aW8pLFxuICAgICAgICApLFxuICAgICAgY2FsY3VsYXRlUG9zaXRpb25Gb3JJbmRleDogKGluZGV4OiBudW1iZXIpID0+XG4gICAgICAgIGluZGV4ICogKHZpZXdwb3J0U3RhdGU/Lml0ZW1TaXplIHx8IGluaXRpYWxJdGVtU2l6ZSkgKiBjb21wcmVzc2lvblJhdGlvLFxuICAgIH07XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9O1xufTtcbiIsCiAgICAiLyoqXG4gKiBTY3JvbGxpbmcgRmVhdHVyZSAtIFZpcnR1YWwgc2Nyb2xsaW5nIHdpdGggaW50ZWdyYXRlZCB2ZWxvY2l0eSB0cmFja2luZ1xuICogSGFuZGxlcyB3aGVlbCBldmVudHMsIHRvdWNoL21vdXNlIGV2ZW50cywgc2Nyb2xsIHBvc2l0aW9uIG1hbmFnZW1lbnQsIHZlbG9jaXR5IG1lYXN1cmVtZW50LCBhbmQgbW9tZW50dW0gc2Nyb2xsaW5nXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBWSUVXUE9SVF9DT05TVEFOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB3cmFwSW5pdGlhbGl6ZSwgZ2V0Vmlld3BvcnRTdGF0ZSwgY2xhbXAgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNjcm9sbGluZ0NvbmZpZyB7XG4gIG9yaWVudGF0aW9uPzogXCJ2ZXJ0aWNhbFwiIHwgXCJob3Jpem9udGFsXCI7XG4gIHNlbnNpdGl2aXR5PzogbnVtYmVyO1xuICBzbW9vdGhpbmc/OiBib29sZWFuO1xuICBpZGxlVGltZW91dD86IG51bWJlcjtcbiAgLyoqIFN0b3Agc2Nyb2xsaW5nIHdoZW4gY2xpY2tpbmcgb24gdGhlIHZpZXdwb3J0IChkZWZhdWx0OiB0cnVlKSAqL1xuICBzdG9wT25DbGljaz86IGJvb2xlYW47XG59XG5cbi8vIFNwZWVkIHRyYWNrZXIgaW50ZXJmYWNlXG5pbnRlcmZhY2UgU3BlZWRUcmFja2VyIHtcbiAgdmVsb2NpdHk6IG51bWJlcjtcbiAgbGFzdFBvc2l0aW9uOiBudW1iZXI7XG4gIGxhc3RUaW1lOiBudW1iZXI7XG4gIGRpcmVjdGlvbjogXCJmb3J3YXJkXCIgfCBcImJhY2t3YXJkXCI7XG4gIHNhbXBsZXM6IEFycmF5PHsgcG9zaXRpb246IG51bWJlcjsgdGltZTogbnVtYmVyIH0+O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgc3BlZWQgdHJhY2tlclxuICovXG5jb25zdCBjcmVhdGVTcGVlZFRyYWNrZXIgPSAoKTogU3BlZWRUcmFja2VyID0+ICh7XG4gIHZlbG9jaXR5OiAwLFxuICBsYXN0UG9zaXRpb246IDAsXG4gIGxhc3RUaW1lOiBEYXRlLm5vdygpLFxuICBkaXJlY3Rpb246IFwiZm9yd2FyZFwiLFxuICBzYW1wbGVzOiBbXSxcbn0pO1xuXG4vKipcbiAqIFVwZGF0ZXMgc3BlZWQgdHJhY2tlciB3aXRoIG5ldyBwb3NpdGlvblxuICovXG5jb25zdCB1cGRhdGVTcGVlZFRyYWNrZXIgPSAoXG4gIHRyYWNrZXI6IFNwZWVkVHJhY2tlcixcbiAgbmV3UG9zaXRpb246IG51bWJlcixcbiAgcHJldmlvdXNQb3NpdGlvbjogbnVtYmVyLFxuKTogU3BlZWRUcmFja2VyID0+IHtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgdGltZURlbHRhID0gbm93IC0gdHJhY2tlci5sYXN0VGltZTtcblxuICBpZiAodGltZURlbHRhID09PSAwKSByZXR1cm4gdHJhY2tlcjtcblxuICBjb25zdCBwb3NpdGlvbkRlbHRhID0gbmV3UG9zaXRpb24gLSBwcmV2aW91c1Bvc2l0aW9uO1xuICAvLyBLZWVwIHZlbG9jaXR5IHNpZ25lZCAocG9zaXRpdmUgPSBmb3J3YXJkL2Rvd24sIG5lZ2F0aXZlID0gYmFja3dhcmQvdXApXG4gIGNvbnN0IGluc3RhbnRWZWxvY2l0eSA9IHBvc2l0aW9uRGVsdGEgLyB0aW1lRGVsdGE7XG5cbiAgLy8gQWRkIG5ldyBzYW1wbGVcbiAgY29uc3Qgc2FtcGxlcyA9IFsuLi50cmFja2VyLnNhbXBsZXMsIHsgcG9zaXRpb246IG5ld1Bvc2l0aW9uLCB0aW1lOiBub3cgfV07XG5cbiAgLy8gS2VlcCBvbmx5IHJlY2VudCBzYW1wbGVzIChsYXN0IDEwMG1zKVxuICBjb25zdCByZWNlbnRTYW1wbGVzID0gc2FtcGxlcy5maWx0ZXIoKHMpID0+IG5vdyAtIHMudGltZSA8IDEwMCk7XG5cbiAgLy8gQ2FsY3VsYXRlIGF2ZXJhZ2UgdmVsb2NpdHkgZnJvbSByZWNlbnQgc2FtcGxlcyAocHJlc2VydmluZyBzaWduL2RpcmVjdGlvbilcbiAgbGV0IGF2Z1ZlbG9jaXR5ID0gaW5zdGFudFZlbG9jaXR5O1xuICBpZiAocmVjZW50U2FtcGxlcy5sZW5ndGggPiAxKSB7XG4gICAgY29uc3Qgb2xkZXN0U2FtcGxlID0gcmVjZW50U2FtcGxlc1swXTtcbiAgICBjb25zdCB0b3RhbERpc3RhbmNlID0gbmV3UG9zaXRpb24gLSBvbGRlc3RTYW1wbGUucG9zaXRpb247IC8vIFNpZ25lZCBkaXN0YW5jZVxuICAgIGNvbnN0IHRvdGFsVGltZSA9IG5vdyAtIG9sZGVzdFNhbXBsZS50aW1lO1xuICAgIGF2Z1ZlbG9jaXR5ID0gdG90YWxUaW1lID4gMCA/IHRvdGFsRGlzdGFuY2UgLyB0b3RhbFRpbWUgOiBpbnN0YW50VmVsb2NpdHk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHZlbG9jaXR5OiBhdmdWZWxvY2l0eSxcbiAgICBsYXN0UG9zaXRpb246IG5ld1Bvc2l0aW9uLFxuICAgIGxhc3RUaW1lOiBub3csXG4gICAgZGlyZWN0aW9uOiBwb3NpdGlvbkRlbHRhID49IDAgPyBcImZvcndhcmRcIiA6IFwiYmFja3dhcmRcIixcbiAgICBzYW1wbGVzOiByZWNlbnRTYW1wbGVzLFxuICB9O1xufTtcblxuLyoqXG4gKiBTY3JvbGxpbmcgZmVhdHVyZSBmb3Igdmlld3BvcnRcbiAqIEhhbmRsZXMgd2hlZWwgZXZlbnRzLCB2ZWxvY2l0eSB0cmFja2luZywgYW5kIGlkbGUgZGV0ZWN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoU2Nyb2xsaW5nID0gKGNvbmZpZzogU2Nyb2xsaW5nQ29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KGNvbXBvbmVudDogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIG9yaWVudGF0aW9uID0gXCJ2ZXJ0aWNhbFwiLFxuICAgICAgc2Vuc2l0aXZpdHkgPSBWSUVXUE9SVF9DT05TVEFOVFMuVklSVFVBTF9TQ1JPTEwuU0NST0xMX1NFTlNJVElWSVRZLFxuICAgICAgc21vb3RoaW5nID0gZmFsc2UsXG4gICAgICBpZGxlVGltZW91dCA9IDEwMCwgLy8gRGVmYXVsdCBpZGxlIHRpbWVvdXQgaW4gbXNcbiAgICAgIHN0b3BPbkNsaWNrID0gdHJ1ZSwgLy8gU3RvcCBzY3JvbGxpbmcgb24gY2xpY2sgYnkgZGVmYXVsdFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBTdGF0ZVxuICAgIGxldCBzY3JvbGxQb3NpdGlvbiA9IDA7XG4gICAgbGV0IHRvdGFsVmlydHVhbFNpemUgPSAwO1xuICAgIGxldCBjb250YWluZXJTaXplID0gMDtcbiAgICBsZXQgaXNTY3JvbGxpbmcgPSBmYWxzZTtcbiAgICBsZXQgbGFzdFNjcm9sbFRpbWUgPSAwO1xuICAgIGxldCBzcGVlZFRyYWNrZXIgPSBjcmVhdGVTcGVlZFRyYWNrZXIoKTtcbiAgICBsZXQgaWRsZVRpbWVvdXRJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGlkbGVDaGVja0ZyYW1lOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgbGFzdElkbGVDaGVja1Bvc2l0aW9uID0gMDtcbiAgICBsZXQgaGFzRW1pdHRlZElkbGUgPSBmYWxzZTsgLy8gVHJhY2sgaWYgd2UndmUgYWxyZWFkeSBlbWl0dGVkIGlkbGVcbiAgICBsZXQgYW5jaG9yUG9zaXRpb246IG51bWJlciB8IG51bGwgPSBudWxsOyAvLyBBbmNob3IgcG9zaXRpb24gdG8gbWFpbnRhaW4gb24gY2xpY2sgKGZvciBzdG9wT25DbGljaylcbiAgICBsZXQgYW5jaG9yVGltZSA9IDA7IC8vIFRpbWVzdGFtcCB3aGVuIGFuY2hvciB3YXMgc2V0XG4gICAgbGV0IGxhc3RXaGVlbFRpbWUgPSAwOyAvLyBUaW1lc3RhbXAgb2YgbGFzdCB3aGVlbCBldmVudCAoZm9yIGRldGVjdGluZyBnYXBzKVxuICAgIGxldCBhbmNob3JJbml0aWFsRGVsdGEgPSAwOyAvLyBJbml0aWFsIHdoZWVsIGRlbHRhIHdoZW4gYW5jaG9yIHdhcyBzZXQgKHRvIGRldGVjdCBkZWNheSlcbiAgICBsZXQgYW5jaG9yTGFzdERlbHRhID0gMDsgLy8gUHJldmlvdXMgd2hlZWwgZGVsdGEgKHRvIGRldGVjdCBpbmNyZWFzaW5nIGRlbHRhID0gbmV3IHNjcm9sbClcbiAgICBsZXQgYW5jaG9yTWluRGVsdGEgPSBJbmZpbml0eTsgLy8gTWluaW11bSBkZWx0YSBzZWVuIHNpbmNlIGFuY2hvciAodG8gZGV0ZWN0IHJlYWNjZWxlcmF0aW9uKVxuICAgIGxldCBjb25zZWN1dGl2ZUluY3JlYXNlcyA9IDA7IC8vIENvdW50IG9mIGNvbnNlY3V0aXZlIGRlbHRhIGluY3JlYXNlcyAodG8gZGV0ZWN0IHN1c3RhaW5lZCBuZXcgc2Nyb2xsaW5nKVxuICAgIGxldCBzdXN0YWluZWRIaWdoQ291bnQgPSAwOyAvLyBDb3VudCBvZiBldmVudHMgd2hlcmUgZGVsdGEgaXMgc2lnbmlmaWNhbnRseSBhYm92ZSBtaW5pbXVtIChzdXN0YWluZWQgbmV3IHNjcm9sbGluZylcblxuICAgIC8vIGNvbnNvbGUubG9nKGBbU2Nyb2xsaW5nXSBJbml0aWFsIHN0YXRlIC0gcG9zaXRpb246ICR7c2Nyb2xsUG9zaXRpb259YCk7XG5cbiAgICAvLyBHZXQgdmlld3BvcnQgc3RhdGVcbiAgICBsZXQgdmlld3BvcnRTdGF0ZTogYW55O1xuXG4gICAgLy8gVXNlIHNoYXJlZCBpbml0aWFsaXphdGlvbiB3cmFwcGVyXG4gICAgd3JhcEluaXRpYWxpemUoY29tcG9uZW50LCAoKSA9PiB7XG4gICAgICB2aWV3cG9ydFN0YXRlID0gZ2V0Vmlld3BvcnRTdGF0ZShjb21wb25lbnQpO1xuXG4gICAgICAvLyBJbml0aWFsaXplIHN0YXRlIHZhbHVlc1xuICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9IHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZSB8fCAwO1xuICAgICAgICBjb250YWluZXJTaXplID0gdmlld3BvcnRTdGF0ZS5jb250YWluZXJTaXplIHx8IDA7XG4gICAgICAgIC8vIFN5bmMgc2Nyb2xsUG9zaXRpb24gZnJvbSB2aWV3cG9ydFN0YXRlIChpbXBvcnRhbnQgZm9yIGluaXRpYWxTY3JvbGxJbmRleClcbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPiAwKSB7XG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb24gPSB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgdmlydHVhbCBzaXplIGNoYW5nZXNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6dmlydHVhbC1zaXplLWNoYW5nZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltTY3JvbGxpbmddIFZpcnR1YWwgc2l6ZSBjaGFuZ2VkOlwiLCBkYXRhKTtcbiAgICAgICAgdXBkYXRlU2Nyb2xsQm91bmRzKGRhdGEudG90YWxWaXJ0dWFsU2l6ZSwgY29udGFpbmVyU2l6ZSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBzY3JvbGwgcG9zaXRpb24gY2hhbmdlcyBmcm9tIG90aGVyIGZlYXR1cmVzIChlLmcuLCB2aXJ0dWFsLnRzIGFmdGVyIGl0ZW0gc2l6ZSBkZXRlY3Rpb24pXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnNjcm9sbC1wb3NpdGlvbi1zeW5jXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGRhdGEucG9zaXRpb24gIT09IHVuZGVmaW5lZCAmJiBkYXRhLnBvc2l0aW9uICE9PSBzY3JvbGxQb3NpdGlvbikge1xuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbjtcbiAgICAgICAgICAvLyBBbHNvIHVwZGF0ZSBsb2NhbCB0cmFja2luZyB2YXJzXG4gICAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9XG4gICAgICAgICAgICB2aWV3cG9ydFN0YXRlPy52aXJ0dWFsVG90YWxTaXplIHx8IHRvdGFsVmlydHVhbFNpemU7XG4gICAgICAgICAgY29udGFpbmVyU2l6ZSA9IHZpZXdwb3J0U3RhdGU/LmNvbnRhaW5lclNpemUgfHwgY29udGFpbmVyU2l6ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgY29udGFpbmVyIHNpemUgY2hhbmdlc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpjb250YWluZXItc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGRhdGEuY29udGFpbmVyU2l6ZSkge1xuICAgICAgICAgIGNvbnRhaW5lclNpemUgPSBkYXRhLmNvbnRhaW5lclNpemU7XG4gICAgICAgICAgdXBkYXRlU2Nyb2xsQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gQXR0YWNoIHdoZWVsIGV2ZW50IGxpc3RlbmVyIHRvIHZpZXdwb3J0IGVsZW1lbnRcbiAgICAgIGNvbnN0IHZpZXdwb3J0RWxlbWVudCA9XG4gICAgICAgIHZpZXdwb3J0U3RhdGU/LnZpZXdwb3J0RWxlbWVudCB8fCAoY29tcG9uZW50IGFzIGFueSkudmlld3BvcnRFbGVtZW50O1xuICAgICAgaWYgKHZpZXdwb3J0RWxlbWVudCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW1Njcm9sbGluZ10gQXR0YWNoaW5nIHdoZWVsIGV2ZW50IHRvIHZpZXdwb3J0IGVsZW1lbnRgKTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLCBoYW5kbGVXaGVlbCwge1xuICAgICAgICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBZGQgbW91c2Vkb3duIGxpc3RlbmVyIHRvIHN0b3Agc2Nyb2xsaW5nIG9uIGNsaWNrXG4gICAgICAgIGlmIChzdG9wT25DbGljaykge1xuICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGhhbmRsZU1vdXNlRG93bik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdG9yZSByZWZlcmVuY2UgZm9yIGNsZWFudXBcbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLl9zY3JvbGxpbmdWaWV3cG9ydEVsZW1lbnQgPSB2aWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgIChjb21wb25lbnQgYXMgYW55KS5fc2Nyb2xsaW5nU3RvcE9uQ2xpY2sgPSBzdG9wT25DbGljaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgW1Njcm9sbGluZ10gTm8gdmlld3BvcnQgZWxlbWVudCBmb3VuZCBmb3Igd2hlZWwgZXZlbnRzYCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBVc2UgY2xhbXAgZnJvbSB1dGlsc1xuXG4gICAgLy8gU3RhcnQgaWRsZSBkZXRlY3Rpb25cbiAgICBjb25zdCBzdGFydElkbGVEZXRlY3Rpb24gPSAoKSA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIltTY3JvbGxpbmddIFN0YXJ0aW5nIGlkbGUgZGV0ZWN0aW9uXCIpO1xuXG4gICAgICAvLyBTdG9wIGFueSBleGlzdGluZyBpZGxlIGRldGVjdGlvbiBmaXJzdFxuICAgICAgaWYgKGlkbGVDaGVja0ZyYW1lICE9PSBudWxsKSB7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkbGVDaGVja0ZyYW1lKTtcbiAgICAgICAgaWRsZUNoZWNrRnJhbWUgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBoYXNFbWl0dGVkSWRsZSA9IGZhbHNlOyAvLyBSZXNldCBpZGxlIGVtaXNzaW9uIGZsYWdcbiAgICAgIGNvbnN0IGNoZWNrSWRsZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHNjcm9sbFBvc2l0aW9uID09PSBsYXN0SWRsZUNoZWNrUG9zaXRpb24pIHtcbiAgICAgICAgICAvLyBQb3NpdGlvbiBoYXNuJ3QgY2hhbmdlZCAtIHdlJ3JlIGlkbGVcbiAgICAgICAgICBpZiAoIWhhc0VtaXR0ZWRJZGxlICYmIChzcGVlZFRyYWNrZXIudmVsb2NpdHkgPiAwIHx8IGlzU2Nyb2xsaW5nKSkge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIFwiW1Njcm9sbGluZ10gSWRsZSBkZXRlY3RlZCAtIHBvc2l0aW9uIHN0YWJsZSwgc2V0dGluZyB2ZWxvY2l0eSB0byB6ZXJvXCJcbiAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgICBoYXNFbWl0dGVkSWRsZSA9IHRydWU7IC8vIE1hcmsgdGhhdCB3ZSd2ZSBlbWl0dGVkIGlkbGVcbiAgICAgICAgICAgIHNldFZlbG9jaXR5VG9aZXJvKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFBvc2l0aW9uIGNoYW5nZWQsIHJlc2V0IHRoZSBmbGFnXG4gICAgICAgICAgaGFzRW1pdHRlZElkbGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0SWRsZUNoZWNrUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgICAgaWRsZUNoZWNrRnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2hlY2tJZGxlKTtcbiAgICAgIH07XG4gICAgICBpZGxlQ2hlY2tGcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShjaGVja0lkbGUpO1xuICAgIH07XG5cbiAgICAvLyBTdG9wIGlkbGUgZGV0ZWN0aW9uXG4gICAgY29uc3Qgc3RvcElkbGVEZXRlY3Rpb24gPSAoKSA9PiB7XG4gICAgICBpZiAoaWRsZUNoZWNrRnJhbWUpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJbU2Nyb2xsaW5nXSBTdG9wcGluZyBpZGxlIGRldGVjdGlvblwiKTtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWRsZUNoZWNrRnJhbWUpO1xuICAgICAgICBpZGxlQ2hlY2tGcmFtZSA9IG51bGw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFNldCB2ZWxvY2l0eSB0byB6ZXJvIGFuZCBlbWl0IGlkbGUgZXZlbnRcbiAgICBjb25zdCBzZXRWZWxvY2l0eVRvWmVybyA9ICgpID0+IHtcbiAgICAgIC8vIFN0b3AgaWRsZSBkZXRlY3Rpb24gc2luY2Ugd2UncmUgbm93IGlkbGVcbiAgICAgIHN0b3BJZGxlRGV0ZWN0aW9uKCk7XG5cbiAgICAgIHNwZWVkVHJhY2tlciA9IGNyZWF0ZVNwZWVkVHJhY2tlcigpO1xuICAgICAgaXNTY3JvbGxpbmcgPSBmYWxzZTsgLy8gUmVzZXQgc2Nyb2xsaW5nIHN0YXRlXG5cbiAgICAgIC8vIEVtaXQgdmVsb2NpdHkgY2hhbmdlXG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6dmVsb2NpdHktY2hhbmdlZFwiLCB7XG4gICAgICAgIHZlbG9jaXR5OiAwLFxuICAgICAgICBkaXJlY3Rpb246IHNwZWVkVHJhY2tlci5kaXJlY3Rpb24sXG4gICAgICB9KTtcblxuICAgICAgLy8gRW1pdCBpZGxlIHN0YXRlXG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6aWRsZVwiLCB7XG4gICAgICAgIHBvc2l0aW9uOiBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgbGFzdFNjcm9sbFRpbWUsXG4gICAgICB9KTtcbiAgICB9O1xuICAgIC8vIFVwZGF0ZSBjb250YWluZXIgcG9zaXRpb25cbiAgICBjb25zdCB1cGRhdGVDb250YWluZXJQb3NpdGlvbiA9ICgpID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSB8fCAhdmlld3BvcnRTdGF0ZS5pdGVtc0NvbnRhaW5lcikgcmV0dXJuO1xuXG4gICAgICAvLyBJdGVtcyBjb250YWluZXIgZG9lc24ndCBtb3ZlIC0gaXRlbXMgaW5zaWRlIGl0IGFyZSBwb3NpdGlvbmVkXG4gICAgICAvLyBUaGlzIGlzIGhhbmRsZWQgYnkgdGhlIHJlbmRlcmluZyBmZWF0dXJlXG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSBtb3VzZWRvd24gdG8gc3RvcCBzY3JvbGxpbmcgb24gY2xpY2tcbiAgICBjb25zdCBoYW5kbGVNb3VzZURvd24gPSAoX2U6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIC8vIEFuY2hvciB0aGUgY3VycmVudCBzY3JvbGwgcG9zaXRpb24gLSBhbnkgd2hlZWwgZXZlbnRzIHdpbGwgYmUgZm9yY2VkIGJhY2sgdG8gdGhpcyBwb3NpdGlvblxuICAgICAgLy8gVGhpcyBlbGVnYW50bHkgaGFuZGxlcyBtb3VzZSB3aGVlbHMgd2l0aCBwaHlzaWNhbCBpbmVydGlhIChsaWtlIExvZ2l0ZWNoIGZyZWUtc3BpbilcbiAgICAgIGFuY2hvclBvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICBhbmNob3JUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGFuY2hvckluaXRpYWxEZWx0YSA9IDA7IC8vIFdpbGwgYmUgc2V0IGJ5IGZpcnN0IHdoZWVsIGV2ZW50XG4gICAgICBhbmNob3JMYXN0RGVsdGEgPSAwO1xuICAgICAgYW5jaG9yTWluRGVsdGEgPSBJbmZpbml0eTtcbiAgICAgIGNvbnNlY3V0aXZlSW5jcmVhc2VzID0gMDtcbiAgICAgIHN1c3RhaW5lZEhpZ2hDb3VudCA9IDA7XG5cbiAgICAgIC8vIE9ubHkgc3RvcCBpZiB3ZSdyZSBjdXJyZW50bHkgc2Nyb2xsaW5nXG4gICAgICBpZiAoaXNTY3JvbGxpbmcgfHwgc3BlZWRUcmFja2VyLnZlbG9jaXR5ID4gMCkge1xuICAgICAgICBzZXRWZWxvY2l0eVRvWmVybygpO1xuICAgICAgfVxuICAgICAgLy8gQWxzbyBzdG9wIG1vbWVudHVtIGFuaW1hdGlvbiBpZiBhY3RpdmVcbiAgICAgIGNvbnN0IG1vbWVudHVtU3RhdGUgPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkubW9tZW50dW1TdGF0ZTtcbiAgICAgIGlmIChtb21lbnR1bVN0YXRlPy5zdG9wTW9tZW50dW0pIHtcbiAgICAgICAgbW9tZW50dW1TdGF0ZS5zdG9wTW9tZW50dW0oKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIHdoZWVsIGV2ZW50XG4gICAgY29uc3QgaGFuZGxlV2hlZWwgPSAoZXZlbnQ6IFdoZWVsRXZlbnQpID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIGNvbnN0IGRlbHRhID0gb3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIiA/IGV2ZW50LmRlbHRhWSA6IGV2ZW50LmRlbHRhWDtcbiAgICAgIGNvbnN0IHNjcm9sbERlbHRhID0gZGVsdGEgKiBzZW5zaXRpdml0eTtcblxuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHRpbWVTaW5jZUxhc3RXaGVlbCA9IG5vdyAtIGxhc3RXaGVlbFRpbWU7XG4gICAgICBsYXN0V2hlZWxUaW1lID0gbm93O1xuXG4gICAgICAvLyBJZiB3ZSBoYXZlIGFuIGFuY2hvciBwb3NpdGlvbiAodXNlciBjbGlja2VkIHRvIHN0b3Agc2Nyb2xsaW5nKSxcbiAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaXMgaW50ZW50aW9uYWwgbmV3IHNjcm9sbGluZyBvciByZXNpZHVhbCB3aGVlbCBpbmVydGlhXG4gICAgICBpZiAoYW5jaG9yUG9zaXRpb24gIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgdGltZVNpbmNlQW5jaG9yID0gbm93IC0gYW5jaG9yVGltZTtcbiAgICAgICAgY29uc3Qgd2hlZWxEZWx0YU1hZ25pdHVkZSA9IE1hdGguYWJzKHNjcm9sbERlbHRhKTtcblxuICAgICAgICAvLyBUcmFjayBpbml0aWFsIGRlbHRhIHRvIGRldGVjdCB3aGVuIGluZXJ0aWEgaGFzIGRlY2F5ZWRcbiAgICAgICAgaWYgKGFuY2hvckluaXRpYWxEZWx0YSA9PT0gMCkge1xuICAgICAgICAgIGFuY2hvckluaXRpYWxEZWx0YSA9IHdoZWVsRGVsdGFNYWduaXR1ZGU7XG4gICAgICAgICAgYW5jaG9yTGFzdERlbHRhID0gd2hlZWxEZWx0YU1hZ25pdHVkZTtcbiAgICAgICAgICBhbmNob3JNaW5EZWx0YSA9IHdoZWVsRGVsdGFNYWduaXR1ZGU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmFjayBtaW5pbXVtIGRlbHRhIHRvIGRldGVjdCByZWFjY2VsZXJhdGlvbiAodXNlciBzdGFydGVkIHNjcm9sbGluZyBhZ2FpbilcbiAgICAgICAgYW5jaG9yTWluRGVsdGEgPSBNYXRoLm1pbihhbmNob3JNaW5EZWx0YSwgd2hlZWxEZWx0YU1hZ25pdHVkZSk7XG5cbiAgICAgICAgLy8gRGV0ZWN0IGlmIGRlbHRhIGlzIGluY3JlYXNpbmcgKHVzZXIgc3RhcnRlZCBuZXcgc2Nyb2xsKVxuICAgICAgICAvLyBJbmVydGlhIG9ubHkgZGVjYXlzLCBzbyBpbmNyZWFzaW5nIGRlbHRhID0gaW50ZW50aW9uYWwgbmV3IHNjcm9sbGluZ1xuICAgICAgICAvLyBCVVQ6IGZpbHRlciBvdXQgYmF0Y2hlZCBldmVudHMgd2hlcmUgZGVsdGEgaXMgfjJ4IHRoZSBsYXN0IChicm93c2VyIGJhdGNoaW5nLCBub3QgcmVhbCBpbmNyZWFzZSlcbiAgICAgICAgY29uc3QgaXNCYXRjaGVkRXZlbnQgPVxuICAgICAgICAgIHdoZWVsRGVsdGFNYWduaXR1ZGUgPiBhbmNob3JMYXN0RGVsdGEgKiAxLjggJiZcbiAgICAgICAgICB3aGVlbERlbHRhTWFnbml0dWRlIDwgYW5jaG9yTGFzdERlbHRhICogMi4yO1xuXG4gICAgICAgIC8vIFRyYWNrIGNvbnNlY3V0aXZlIGluY3JlYXNlcyAtIHN1c3RhaW5lZCBpbmNyZWFzZXMgaW5kaWNhdGUgbmV3IHNjcm9sbGluZ1xuICAgICAgICAvLyBVc2UgMSUgdGhyZXNob2xkIHRvIGNhdGNoIGdyYWR1YWwgYWNjZWxlcmF0aW9uXG4gICAgICAgIGlmICghaXNCYXRjaGVkRXZlbnQgJiYgd2hlZWxEZWx0YU1hZ25pdHVkZSA+IGFuY2hvckxhc3REZWx0YSAqIDEuMDEpIHtcbiAgICAgICAgICBjb25zZWN1dGl2ZUluY3JlYXNlcysrO1xuICAgICAgICB9IGVsc2UgaWYgKHdoZWVsRGVsdGFNYWduaXR1ZGUgPCBhbmNob3JMYXN0RGVsdGEgKiAwLjk5KSB7XG4gICAgICAgICAgLy8gRGVsdGEgZGVjcmVhc2luZyAtIHJlc2V0IGNvdW50ZXJcbiAgICAgICAgICBjb25zZWN1dGl2ZUluY3JlYXNlcyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgZGVsdGEgaXMgcm91Z2hseSB0aGUgc2FtZSAod2l0aGluIDElKSwgZG9uJ3QgY2hhbmdlIHRoZSBjb3VudGVyXG5cbiAgICAgICAgLy8gVHJhY2sgc3VzdGFpbmVkIGhpZ2ggZGVsdGEgKGRlbHRhIHNpZ25pZmljYW50bHkgYWJvdmUgbWluaW11bSBmb3IgbXVsdGlwbGUgZXZlbnRzKVxuICAgICAgICAvLyBUaGlzIGNhdGNoZXMgd2hlbiB1c2VyIHN0YXJ0cyBzY3JvbGxpbmcgYnV0IGRlbHRhIHBsYXRlYXVzIGluc3RlYWQgb2Ygc3RyaWN0bHkgaW5jcmVhc2luZ1xuICAgICAgICBpZiAoIWlzQmF0Y2hlZEV2ZW50ICYmIHdoZWVsRGVsdGFNYWduaXR1ZGUgPiBhbmNob3JNaW5EZWx0YSAqIDEuMDUpIHtcbiAgICAgICAgICBzdXN0YWluZWRIaWdoQ291bnQrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdXN0YWluZWRIaWdoQ291bnQgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVsZWFzZSBpZjogMysgY29uc2VjdXRpdmUgaW5jcmVhc2VzLCBPUiBzdXN0YWluZWQgaGlnaCBkZWx0YSwgT1Igc2lnbmlmaWNhbnQgc2luZ2xlIGluY3JlYXNlXG4gICAgICAgIGNvbnN0IHN1c3RhaW5lZEluY3JlYXNlID0gY29uc2VjdXRpdmVJbmNyZWFzZXMgPj0gMztcbiAgICAgICAgY29uc3Qgc3VzdGFpbmVkSGlnaCA9IHN1c3RhaW5lZEhpZ2hDb3VudCA+PSA1OyAvLyA1KyBldmVudHMgYXQgNSUrIGFib3ZlIG1pbmltdW1cbiAgICAgICAgY29uc3Qgc2lnbmlmaWNhbnRJbmNyZWFzZSA9XG4gICAgICAgICAgIWlzQmF0Y2hlZEV2ZW50ICYmXG4gICAgICAgICAgd2hlZWxEZWx0YU1hZ25pdHVkZSA+IGFuY2hvck1pbkRlbHRhICogMS4xNSAmJiAvLyAxNSUgaW5jcmVhc2UgZnJvbSBtaW5pbXVtXG4gICAgICAgICAgd2hlZWxEZWx0YU1hZ25pdHVkZSA+IGFuY2hvckxhc3REZWx0YSAqIDEuMDg7IC8vIGFuZCA4JSBpbmNyZWFzaW5nIGZyb20gbGFzdFxuICAgICAgICBjb25zdCBkZWx0YUluY3JlYXNpbmcgPVxuICAgICAgICAgIHN1c3RhaW5lZEluY3JlYXNlIHx8IHN1c3RhaW5lZEhpZ2ggfHwgc2lnbmlmaWNhbnRJbmNyZWFzZTtcblxuICAgICAgICAvLyBSZWxlYXNlIGFuY2hvciBpZjpcbiAgICAgICAgLy8gMS4gVGhlcmUgd2FzIGEgZ2FwIGluIHdoZWVsIGV2ZW50cyAoPiAyMDBtcykgLSB1c2VyIHN0b3BwZWQgYW5kIHN0YXJ0ZWQgbmV3IHNjcm9sbFxuICAgICAgICAvLyAyLiBEZWx0YSBpcyBpbmNyZWFzaW5nIGZyb20gbWluaW11bSAtIHVzZXIgc3RhcnRlZCBzY3JvbGxpbmcgYWdhaW4gZHVyaW5nIGluZXJ0aWFcbiAgICAgICAgLy8gMy4gRGVsdGEgaGFzIGRlY2F5ZWQgc2lnbmlmaWNhbnRseSAoPCAzMCUgb2YgaW5pdGlhbCkgLSBpbmVydGlhIGlzIHdpbmRpbmcgZG93blxuICAgICAgICAvLyA0LiBMb3cgYWJzb2x1dGUgZGVsdGEgKDwgMzApIC0gZ2VudGxlIGludGVudGlvbmFsIHNjcm9sbFxuICAgICAgICBjb25zdCBoYXNXaGVlbEdhcCA9IHRpbWVTaW5jZUxhc3RXaGVlbCA+IDIwMDtcbiAgICAgICAgY29uc3QgZGVsdGFEZWNheWVkID0gd2hlZWxEZWx0YU1hZ25pdHVkZSA8IGFuY2hvckluaXRpYWxEZWx0YSAqIDAuMztcbiAgICAgICAgY29uc3QgaXNMb3dEZWx0YSA9IHdoZWVsRGVsdGFNYWduaXR1ZGUgPCAzMDtcblxuICAgICAgICBpZiAoaGFzV2hlZWxHYXApIHtcbiAgICAgICAgICAvLyBUaW1lIGdhcCAtIHVzZXIgc3RvcHBlZCBhbmQgc3RhcnRlZCBuZXcgc2Nyb2xsXG4gICAgICAgICAgYW5jaG9yUG9zaXRpb24gPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKGRlbHRhSW5jcmVhc2luZyAmJiB0aW1lU2luY2VBbmNob3IgPiAxMDApIHtcbiAgICAgICAgICAvLyBEZWx0YSBpbmNyZWFzaW5nIC0gdXNlciBzdGFydGVkIHNjcm9sbGluZyBhZ2FpblxuICAgICAgICAgIGFuY2hvclBvc2l0aW9uID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChpc0xvd0RlbHRhKSB7XG4gICAgICAgICAgLy8gVmVyeSBsb3cgZGVsdGEgLSBnZW50bGUgaW50ZW50aW9uYWwgc2Nyb2xsXG4gICAgICAgICAgYW5jaG9yUG9zaXRpb24gPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKGRlbHRhRGVjYXllZCAmJiB0aW1lU2luY2VBbmNob3IgPiAzMDApIHtcbiAgICAgICAgICAvLyBEZWx0YSBoYXMgZGVjYXllZCBhbmQgc29tZSB0aW1lIHBhc3NlZCAtIGluZXJ0aWEgaXMgZG9uZVxuICAgICAgICAgIGFuY2hvclBvc2l0aW9uID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTdGlsbCBpbiBpbmVydGlhIHBoYXNlIC0gc3RheSBhbmNob3JlZFxuICAgICAgICAgIGlmIChzY3JvbGxQb3NpdGlvbiAhPT0gYW5jaG9yUG9zaXRpb24pIHtcbiAgICAgICAgICAgIHNjcm9sbFBvc2l0aW9uID0gYW5jaG9yUG9zaXRpb247XG4gICAgICAgICAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQucmVuZGVySXRlbXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVXBkYXRlIGxhc3QgZGVsdGEgZm9yIG5leHQgY29tcGFyaXNvblxuICAgICAgICAgIGFuY2hvckxhc3REZWx0YSA9IHdoZWVsRGVsdGFNYWduaXR1ZGU7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGxhc3QgZGVsdGEgZm9yIG5leHQgY29tcGFyaXNvblxuICAgICAgICBhbmNob3JMYXN0RGVsdGEgPSB3aGVlbERlbHRhTWFnbml0dWRlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcmV2aW91c1Bvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICBjb25zdCBtYXhTY3JvbGwgPSBNYXRoLm1heCgwLCB0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZSk7XG5cbiAgICAgIGxldCBuZXdQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uICsgc2Nyb2xsRGVsdGE7XG5cbiAgICAgIC8vIEFwcGx5IHNtb290aGluZyBpZiBlbmFibGVkXG4gICAgICBpZiAoc21vb3RoaW5nKSB7XG4gICAgICAgIGNvbnN0IHNtb290aGluZ0ZhY3RvciA9IDAuMztcbiAgICAgICAgbmV3UG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbiArIHNjcm9sbERlbHRhICogc21vb3RoaW5nRmFjdG9yO1xuICAgICAgfVxuXG4gICAgICBuZXdQb3NpdGlvbiA9IGNsYW1wKG5ld1Bvc2l0aW9uLCAwLCBtYXhTY3JvbGwpO1xuXG4gICAgICBpZiAobmV3UG9zaXRpb24gIT09IHNjcm9sbFBvc2l0aW9uKSB7XG4gICAgICAgIHNjcm9sbFBvc2l0aW9uID0gbmV3UG9zaXRpb247XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHNjcm9sbCBzdGF0ZVxuICAgICAgICBpZiAoIWlzU2Nyb2xsaW5nKSB7XG4gICAgICAgICAgaXNTY3JvbGxpbmcgPSB0cnVlO1xuICAgICAgICAgIC8vIFN0b3AgYW55IGV4aXN0aW5nIGlkbGUgZGV0ZWN0aW9uIGJlZm9yZSBzdGFydGluZyBuZXcgb25lXG4gICAgICAgICAgc3RvcElkbGVEZXRlY3Rpb24oKTtcbiAgICAgICAgICBzdGFydElkbGVEZXRlY3Rpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0U2Nyb2xsVGltZSA9IG5vdztcblxuICAgICAgICAvLyBVcGRhdGUgc3BlZWQgdHJhY2tlclxuICAgICAgICBzcGVlZFRyYWNrZXIgPSB1cGRhdGVTcGVlZFRyYWNrZXIoXG4gICAgICAgICAgc3BlZWRUcmFja2VyLFxuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgIHByZXZpb3VzUG9zaXRpb24sXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHZpZXdwb3J0IHN0YXRlXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUudmVsb2NpdHkgPSBzcGVlZFRyYWNrZXIudmVsb2NpdHk7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxEaXJlY3Rpb24gPSBzcGVlZFRyYWNrZXIuZGlyZWN0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBldmVudHNcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnNjcm9sbFwiLCB7XG4gICAgICAgICAgcG9zaXRpb246IHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgIGRpcmVjdGlvbjogc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgICAgICBwcmV2aW91c1Bvc2l0aW9uLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6dmVsb2NpdHktY2hhbmdlZFwiLCB7XG4gICAgICAgICAgdmVsb2NpdHk6IHNwZWVkVHJhY2tlci52ZWxvY2l0eSxcbiAgICAgICAgICBkaXJlY3Rpb246IHNwZWVkVHJhY2tlci5kaXJlY3Rpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgcmVuZGVyXG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTY3JvbGwgdG8gcG9zaXRpb25cbiAgICBjb25zdCBzY3JvbGxUb1Bvc2l0aW9uID0gKHBvc2l0aW9uOiBudW1iZXIsIHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgbWF4U2Nyb2xsID0gTWF0aC5tYXgoMCwgdG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuICAgICAgY29uc3QgY2xhbXBlZFBvc2l0aW9uID0gY2xhbXAocG9zaXRpb24sIDAsIG1heFNjcm9sbCk7XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGluZ10gc2Nyb2xsVG9Qb3NpdGlvbjogcG9zPSR7cG9zaXRpb259IC0+ICR7Y2xhbXBlZFBvc2l0aW9ufSwgc291cmNlPSR7c291cmNlfSwgY3VycmVudFBvcz0ke3Njcm9sbFBvc2l0aW9ufSwgdmVsb2NpdHk9JHtzcGVlZFRyYWNrZXIudmVsb2NpdHkudG9GaXhlZChcbiAgICAgIC8vICAgICAzXG4gICAgICAvLyAgICl9YFxuICAgICAgLy8gKTtcblxuICAgICAgaWYgKGNsYW1wZWRQb3NpdGlvbiAhPT0gc2Nyb2xsUG9zaXRpb24pIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgICBzY3JvbGxQb3NpdGlvbiA9IGNsYW1wZWRQb3NpdGlvbjtcblxuICAgICAgICAvLyBVcGRhdGUgc3BlZWQgdHJhY2tlciB0byBjYWxjdWxhdGUgdmVsb2NpdHlcbiAgICAgICAgc3BlZWRUcmFja2VyID0gdXBkYXRlU3BlZWRUcmFja2VyKFxuICAgICAgICAgIHNwZWVkVHJhY2tlcixcbiAgICAgICAgICBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgICBwcmV2aW91c1Bvc2l0aW9uLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFVwZGF0ZSB2aWV3cG9ydCBzdGF0ZVxuICAgICAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnZlbG9jaXR5ID0gc3BlZWRUcmFja2VyLnZlbG9jaXR5O1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsRGlyZWN0aW9uID0gc3BlZWRUcmFja2VyLmRpcmVjdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9XG4gICAgICAgICAgY2xhbXBlZFBvc2l0aW9uID4gcHJldmlvdXNQb3NpdGlvbiA/IFwiZm9yd2FyZFwiIDogXCJiYWNrd2FyZFwiO1xuXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpzY3JvbGxcIiwge1xuICAgICAgICAgIHBvc2l0aW9uOiBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgICBkaXJlY3Rpb24sXG4gICAgICAgICAgcHJldmlvdXNQb3NpdGlvbixcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEVtaXQgdmVsb2NpdHkgY2hhbmdlIGV2ZW50IHNvIGNvbGxlY3Rpb24gY2FuIHRyYWNrIGl0XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDp2ZWxvY2l0eS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgICB2ZWxvY2l0eTogc3BlZWRUcmFja2VyLnZlbG9jaXR5LFxuICAgICAgICAgIGRpcmVjdGlvbjogc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHNjcm9sbCBzdGF0ZSBhbmQgaWRsZSBkZXRlY3Rpb25cbiAgICAgICAgaWYgKCFpc1Njcm9sbGluZykge1xuICAgICAgICAgIGlzU2Nyb2xsaW5nID0gdHJ1ZTtcbiAgICAgICAgICBzdGFydElkbGVEZXRlY3Rpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0U2Nyb2xsVGltZSA9IERhdGUubm93KCk7XG5cbiAgICAgICAgLy8gVHJpZ2dlciByZW5kZXJcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnJlbmRlckl0ZW1zKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW1Njcm9sbGluZ10gUG9zaXRpb24gdW5jaGFuZ2VkOiAke3Njcm9sbFBvc2l0aW9ufWApO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW1Njcm9sbGluZ10gUG9zaXRpb24gdW5jaGFuZ2VkOiAke3Njcm9sbFBvc2l0aW9ufSwgbm90IHJlc2V0dGluZyBpZGxlIHRpbWVvdXRgXG4gICAgICAgIC8vICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFNjcm9sbCB0byBpbmRleFxuICAgIGNvbnN0IHNjcm9sbFRvSW5kZXggPSAoXG4gICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgYWxpZ25tZW50OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiA9IFwic3RhcnRcIixcbiAgICApID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGluZ10gc2Nyb2xsVG9JbmRleCBjYWxsZWQ6IGluZGV4PSR7aW5kZXh9LCBhbGlnbm1lbnQ9JHthbGlnbm1lbnR9YFxuICAgICAgLy8gKTtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSkge1xuICAgICAgICAvL2NvbnNvbGUubG9nKGBbU2Nyb2xsaW5nXSBzY3JvbGxUb0luZGV4IGFib3J0ZWQ6IG5vIHZpZXdwb3J0IHN0YXRlYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXRlbVNpemUgPSB2aWV3cG9ydFN0YXRlLml0ZW1TaXplIHx8IDUwO1xuICAgICAgY29uc3QgdG90YWxJdGVtcyA9IHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyB8fCAwO1xuICAgICAgY29uc3QgYWN0dWFsVG90YWxTaXplID0gdG90YWxJdGVtcyAqIGl0ZW1TaXplO1xuICAgICAgY29uc3QgTUFYX1ZJUlRVQUxfU0laRSA9XG4gICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5WSVJUVUFMX1NDUk9MTC5NQVhfVklSVFVBTF9TSVpFO1xuICAgICAgY29uc3QgaXNDb21wcmVzc2VkID0gYWN0dWFsVG90YWxTaXplID4gTUFYX1ZJUlRVQUxfU0laRTtcblxuICAgICAgbGV0IHRhcmdldFBvc2l0aW9uOiBudW1iZXI7XG5cbiAgICAgIGlmIChpc0NvbXByZXNzZWQpIHtcbiAgICAgICAgLy8gSW4gY29tcHJlc3NlZCBzcGFjZSwgbWFwIGluZGV4IHRvIHZpcnR1YWwgcG9zaXRpb25cbiAgICAgICAgY29uc3QgcmF0aW8gPSBpbmRleCAvIHRvdGFsSXRlbXM7XG4gICAgICAgIHRhcmdldFBvc2l0aW9uID0gcmF0aW8gKiBNYXRoLm1pbihhY3R1YWxUb3RhbFNpemUsIE1BWF9WSVJUVUFMX1NJWkUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRGlyZWN0IGNhbGN1bGF0aW9uIHdoZW4gbm90IGNvbXByZXNzZWRcbiAgICAgICAgdGFyZ2V0UG9zaXRpb24gPSBpbmRleCAqIGl0ZW1TaXplO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGp1c3QgcG9zaXRpb24gYmFzZWQgb24gYWxpZ25tZW50XG4gICAgICBzd2l0Y2ggKGFsaWdubWVudCkge1xuICAgICAgICBjYXNlIFwiY2VudGVyXCI6XG4gICAgICAgICAgdGFyZ2V0UG9zaXRpb24gLT0gY29udGFpbmVyU2l6ZSAvIDIgLSBpdGVtU2l6ZSAvIDI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICB0YXJnZXRQb3NpdGlvbiAtPSBjb250YWluZXJTaXplIC0gaXRlbVNpemU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGluZ10gVGFyZ2V0IHBvc2l0aW9uOiAke3RhcmdldFBvc2l0aW9ufSwgaXNDb21wcmVzc2VkOiAke2lzQ29tcHJlc3NlZH1gXG4gICAgICAvLyApO1xuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtTY3JvbGxpbmddIFNjcm9sbFRvSW5kZXg6IGluZGV4PSR7aW5kZXh9LCBwb3NpdGlvbj0ke3RhcmdldFBvc2l0aW9ufSwgYWxpZ25tZW50PSR7YWxpZ25tZW50fWBcbiAgICAgIC8vICk7XG5cbiAgICAgIHNjcm9sbFRvUG9zaXRpb24odGFyZ2V0UG9zaXRpb24sIFwic2Nyb2xsVG9JbmRleFwiKTtcbiAgICB9O1xuXG4gICAgLy8gU2Nyb2xsIHRvIGEgc3BlY2lmaWMgcGFnZVxuICAgIGNvbnN0IHNjcm9sbFRvUGFnZSA9IChcbiAgICAgIHBhZ2U6IG51bWJlcixcbiAgICAgIGxpbWl0OiBudW1iZXIgPSAyMCxcbiAgICAgIGFsaWdubWVudDogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIsXG4gICAgKSA9PiB7XG4gICAgICAvLyBWYWxpZGF0ZSBhbGlnbm1lbnQgcGFyYW1ldGVyXG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBhbGlnbm1lbnQgIT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgIVtcInN0YXJ0XCIsIFwiY2VudGVyXCIsIFwiZW5kXCJdLmluY2x1ZGVzKGFsaWdubWVudClcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtTY3JvbGxpbmddIEludmFsaWQgYWxpZ25tZW50IFwiJHthbGlnbm1lbnR9XCIsIHVzaW5nIFwic3RhcnRcImAsXG4gICAgICAgICk7XG4gICAgICAgIGFsaWdubWVudCA9IFwic3RhcnRcIjtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgd2UncmUgaW4gY3Vyc29yIG1vZGVcbiAgICAgIGNvbnN0IHZpZXdwb3J0Q29uZmlnID0gKGNvbXBvbmVudCBhcyBhbnkpLmNvbmZpZztcbiAgICAgIGNvbnN0IGlzQ3Vyc29yTW9kZSA9IHZpZXdwb3J0Q29uZmlnPy5wYWdpbmF0aW9uPy5zdHJhdGVneSA9PT0gXCJjdXJzb3JcIjtcblxuICAgICAgaWYgKGlzQ3Vyc29yTW9kZSkge1xuICAgICAgICAvLyBJbiBjdXJzb3IgbW9kZSwgY2hlY2sgaWYgd2UgY2FuIHNjcm9sbCB0byB0aGlzIHBhZ2VcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5jb2xsZWN0aW9uO1xuICAgICAgICBpZiAoY29sbGVjdGlvbikge1xuICAgICAgICAgIGNvbnN0IGhpZ2hlc3RMb2FkZWRQYWdlID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgIGNvbGxlY3Rpb24uZ2V0TG9hZGVkUmFuZ2VzKCkuc2l6ZSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHBhZ2UgPiBoaWdoZXN0TG9hZGVkUGFnZSArIDEpIHtcbiAgICAgICAgICAgIC8vIExpbWl0IGhvdyBtYW55IHBhZ2VzIHdlJ2xsIGxvYWQgYXQgb25jZSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSBBUEkgY2FsbHNcbiAgICAgICAgICAgIGNvbnN0IG1heFBhZ2VzVG9Mb2FkID0gMTA7IC8vIFJlYXNvbmFibGUgbGltaXRcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldFBhZ2UgPSBNYXRoLm1pbihcbiAgICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgICAgaGlnaGVzdExvYWRlZFBhZ2UgKyBtYXhQYWdlc1RvTG9hZCxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgYFtTY3JvbGxpbmddIENhbm5vdCBqdW1wIGRpcmVjdGx5IHRvIHBhZ2UgJHtwYWdlfSBpbiBjdXJzb3IgbW9kZS4gYCArXG4gICAgICAgICAgICAgICAgYFBhZ2VzIG11c3QgYmUgbG9hZGVkIHNlcXVlbnRpYWxseS4gQ3VycmVudCBoaWdoZXN0IHBhZ2U6ICR7aGlnaGVzdExvYWRlZFBhZ2V9LiBgICtcbiAgICAgICAgICAgICAgICBgV2lsbCBsb2FkIHVwIHRvIHBhZ2UgJHt0YXJnZXRQYWdlfWAsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBUcmlnZ2VyIHNlcXVlbnRpYWwgbG9hZGluZyB0byB0aGUgdGFyZ2V0IHBhZ2UgKGxpbWl0ZWQpXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRPZmZzZXQgPSAodGFyZ2V0UGFnZSAtIDEpICogbGltaXQ7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50T2Zmc2V0ID0gaGlnaGVzdExvYWRlZFBhZ2UgKiBsaW1pdDtcblxuICAgICAgICAgICAgLy8gTG9hZCBwYWdlcyBzZXF1ZW50aWFsbHkgdXAgdG8gdGhlIGxpbWl0ZWQgdGFyZ2V0XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtTY3JvbGxpbmddIEluaXRpYXRpbmcgc2VxdWVudGlhbCBsb2FkIGZyb20gcGFnZSAke1xuICAgICAgICAgICAgLy8gICAgIGhpZ2hlc3RMb2FkZWRQYWdlICsgMVxuICAgICAgICAgICAgLy8gICB9IHRvICR7dGFyZ2V0UGFnZX1gLFxuICAgICAgICAgICAgLy8gKTtcblxuICAgICAgICAgICAgLy8gU2Nyb2xsIHRvIHRoZSBsYXN0IGxvYWRlZCBwb3NpdGlvbiBmaXJzdFxuICAgICAgICAgICAgY29uc3QgbGFzdExvYWRlZEluZGV4ID0gaGlnaGVzdExvYWRlZFBhZ2UgKiBsaW1pdDtcbiAgICAgICAgICAgIHNjcm9sbFRvSW5kZXgobGFzdExvYWRlZEluZGV4LCBhbGlnbm1lbnQpO1xuXG4gICAgICAgICAgICAvLyBUaGUgY29sbGVjdGlvbiBmZWF0dXJlIHdpbGwgaGFuZGxlIHNlcXVlbnRpYWwgbG9hZGluZ1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDb252ZXJ0IHBhZ2UgdG8gaW5kZXggKHBhZ2UgMSA9IGluZGV4IDApXG4gICAgICBjb25zdCBpbmRleCA9IChwYWdlIC0gMSkgKiBsaW1pdDtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbU2Nyb2xsaW5nXSBTY3JvbGxUb1BhZ2U6IHBhZ2U9JHtwYWdlfSwgbGltaXQ9JHtsaW1pdH0sIHRhcmdldEluZGV4PSR7aW5kZXh9LCBhbGlnbm1lbnQ9JHthbGlnbm1lbnR9YFxuICAgICAgLy8gKTtcblxuICAgICAgLy8gSnVzdCBzY3JvbGwgdG8gdGhlIGluZGV4IC0gbGV0IHRoZSBub3JtYWwgcmVuZGVyaW5nIGZsb3cgaGFuZGxlIGRhdGEgbG9hZGluZyBhbmQgcGxhY2Vob2xkZXJzXG4gICAgICBzY3JvbGxUb0luZGV4KGluZGV4LCBhbGlnbm1lbnQpO1xuICAgIH07XG5cbiAgICAvLyBVcGRhdGUgc2Nyb2xsIGJvdW5kc1xuICAgIGNvbnN0IHVwZGF0ZVNjcm9sbEJvdW5kcyA9IChcbiAgICAgIG5ld1RvdGFsU2l6ZTogbnVtYmVyLFxuICAgICAgbmV3Q29udGFpbmVyU2l6ZTogbnVtYmVyLFxuICAgICkgPT4ge1xuICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9IG5ld1RvdGFsU2l6ZTtcbiAgICAgIGNvbnRhaW5lclNpemUgPSBuZXdDb250YWluZXJTaXplO1xuXG4gICAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgICB2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemUgPSBuZXdUb3RhbFNpemU7XG4gICAgICAgIHZpZXdwb3J0U3RhdGUuY29udGFpbmVyU2l6ZSA9IG5ld0NvbnRhaW5lclNpemU7XG4gICAgICB9XG5cbiAgICAgIC8vIERvbid0IGNsYW1wIHNjcm9sbCBwb3NpdGlvbiB1bnRpbCB3ZSBoYXZlIHJlYWwgZGF0YSBsb2FkZWRcbiAgICAgIC8vIFRoaXMgcHJldmVudHMgcmVzZXR0aW5nIGluaXRpYWxTY3JvbGxJbmRleCBwb3NpdGlvbiBiZWZvcmUgZGF0YSBhcnJpdmVzXG4gICAgICAvLyBDaGVjayB0b3RhbEl0ZW1zIGluc3RlYWQgb2YgdG90YWxWaXJ0dWFsU2l6ZSBzaW5jZSB2aXJ0dWFsU2l6ZSBjYW4gYmUgbm9uLXplcm8gZnJvbSBwYWRkaW5nXG4gICAgICBjb25zdCB0b3RhbEl0ZW1zID0gdmlld3BvcnRTdGF0ZT8udG90YWxJdGVtcyB8fCAwO1xuICAgICAgaWYgKHRvdGFsSXRlbXMgPD0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIENsYW1wIGN1cnJlbnQgcG9zaXRpb24gdG8gbmV3IGJvdW5kc1xuICAgICAgY29uc3QgbWF4U2Nyb2xsID0gTWF0aC5tYXgoMCwgdG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuICAgICAgaWYgKHNjcm9sbFBvc2l0aW9uID4gbWF4U2Nyb2xsKSB7XG4gICAgICAgIHNjcm9sbFRvUG9zaXRpb24obWF4U2Nyb2xsKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gRXh0ZW5kIHZpZXdwb3J0IEFQSVxuICAgIGNvbnN0IG9yaWdpbmFsU2Nyb2xsVG9JbmRleCA9IGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb0luZGV4O1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb0luZGV4ID0gKFxuICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgIGFsaWdubWVudD86IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiLFxuICAgICkgPT4ge1xuICAgICAgc2Nyb2xsVG9JbmRleChpbmRleCwgYWxpZ25tZW50KTtcbiAgICAgIG9yaWdpbmFsU2Nyb2xsVG9JbmRleD8uKGluZGV4LCBhbGlnbm1lbnQpO1xuICAgIH07XG5cbiAgICAvLyBBZGQgc2Nyb2xsVG9QYWdlIHRvIHZpZXdwb3J0IEFQSSAobmV3IG1ldGhvZCwgbm8gb3JpZ2luYWwgdG8gcHJlc2VydmUpXG4gICAgKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLnNjcm9sbFRvUGFnZSA9IChcbiAgICAgIHBhZ2U6IG51bWJlcixcbiAgICAgIGxpbWl0PzogbnVtYmVyLFxuICAgICAgYWxpZ25tZW50PzogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIsXG4gICAgKSA9PiB7XG4gICAgICBzY3JvbGxUb1BhZ2UocGFnZSwgbGltaXQsIGFsaWdubWVudCk7XG4gICAgfTtcblxuICAgIGNvbnN0IG9yaWdpbmFsU2Nyb2xsVG9Qb3NpdGlvbiA9IGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb1Bvc2l0aW9uO1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb1Bvc2l0aW9uID0gKHBvc2l0aW9uOiBudW1iZXIpID0+IHtcbiAgICAgIHNjcm9sbFRvUG9zaXRpb24ocG9zaXRpb24sIFwiYXBpXCIpO1xuICAgICAgb3JpZ2luYWxTY3JvbGxUb1Bvc2l0aW9uPy4ocG9zaXRpb24pO1xuICAgIH07XG5cbiAgICBjb25zdCBvcmlnaW5hbEdldFNjcm9sbFBvc2l0aW9uID0gY29tcG9uZW50LnZpZXdwb3J0LmdldFNjcm9sbFBvc2l0aW9uO1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5nZXRTY3JvbGxQb3NpdGlvbiA9ICgpID0+IHtcbiAgICAgIHJldHVybiBzY3JvbGxQb3NpdGlvbjtcbiAgICB9O1xuXG4gICAgLy8gQWRkIHdoZWVsIGV2ZW50IGxpc3RlbmVyIG9uIGluaXRpYWxpemF0aW9uXG4gICAgLy8gVGhpcyBibG9jayBpcyByZW1vdmVkIGFzIHBlciB0aGUgZWRpdCBoaW50LlxuXG4gICAgLy8gQ2xlYW4gdXAgb24gZGVzdHJveVxuICAgIGlmIChcImRlc3Ryb3lcIiBpbiBjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IGNvbXBvbmVudC5kZXN0cm95O1xuICAgICAgY29tcG9uZW50LmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIFJlbW92ZSBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgY29uc3Qgdmlld3BvcnRFbGVtZW50ID0gKGNvbXBvbmVudCBhcyBhbnkpLl9zY3JvbGxpbmdWaWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgIGlmICh2aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIndoZWVsXCIsIGhhbmRsZVdoZWVsKTtcbiAgICAgICAgICBpZiAoKGNvbXBvbmVudCBhcyBhbnkpLl9zY3JvbGxpbmdTdG9wT25DbGljaykge1xuICAgICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgaGFuZGxlTW91c2VEb3duKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciB0aW1lb3V0c1xuICAgICAgICBpZiAoaWRsZVRpbWVvdXRJZCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dChpZGxlVGltZW91dElkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0b3BJZGxlRGV0ZWN0aW9uKCk7XG4gICAgICAgIG9yaWdpbmFsRGVzdHJveT8uKCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEFkZCBzY3JvbGxCeSBtZXRob2RcbiAgICBjb25zdCBzY3JvbGxCeSA9IChkZWx0YTogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBwcmV2aW91c1Bvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICBjb25zdCBtYXhTY3JvbGwgPSBNYXRoLm1heCgwLCB0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZSk7XG4gICAgICBjb25zdCBuZXdQb3NpdGlvbiA9IGNsYW1wKHNjcm9sbFBvc2l0aW9uICsgZGVsdGEsIDAsIG1heFNjcm9sbCk7XG5cbiAgICAgIGlmIChuZXdQb3NpdGlvbiAhPT0gcHJldmlvdXNQb3NpdGlvbikge1xuICAgICAgICBzY3JvbGxQb3NpdGlvbiA9IG5ld1Bvc2l0aW9uO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzcGVlZCB0cmFja2VyXG4gICAgICAgIHNwZWVkVHJhY2tlciA9IHVwZGF0ZVNwZWVkVHJhY2tlcihcbiAgICAgICAgICBzcGVlZFRyYWNrZXIsXG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgcHJldmlvdXNQb3NpdGlvbixcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBVcGRhdGUgdmlld3BvcnQgc3RhdGVcbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS52ZWxvY2l0eSA9IHNwZWVkVHJhY2tlci52ZWxvY2l0eTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtaXQgc2Nyb2xsIGV2ZW50XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpzY3JvbGxcIiwge1xuICAgICAgICAgIHBvc2l0aW9uOiBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgICB2ZWxvY2l0eTogc3BlZWRUcmFja2VyLnZlbG9jaXR5LFxuICAgICAgICAgIGRpcmVjdGlvbjogc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVHJpZ2dlciByZW5kZXJcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnJlbmRlckl0ZW1zPy4oKTtcblxuICAgICAgICAvLyBTdGFydCBpZGxlIGRldGVjdGlvbiBpZiBub3Qgc2Nyb2xsaW5nXG4gICAgICAgIGlmICghaXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICBpc1Njcm9sbGluZyA9IHRydWU7XG4gICAgICAgICAgc3RhcnRJZGxlRGV0ZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFNjcm9sbFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBFeHBvc2Ugc2Nyb2xsaW5nIHN0YXRlIGZvciBvdGhlciBmZWF0dXJlc1xuICAgIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zY3JvbGxpbmdTdGF0ZSA9IHtcbiAgICAgIHNldFZlbG9jaXR5VG9aZXJvLFxuICAgIH07XG5cbiAgICAvLyBBZGQgc2Nyb2xsQnkgdG8gdmlld3BvcnQgQVBJXG4gICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5ID0gc2Nyb2xsQnk7XG4gICAgY29tcG9uZW50LnZpZXdwb3J0LmdldFZlbG9jaXR5ID0gKCkgPT4gc3BlZWRUcmFja2VyLnZlbG9jaXR5O1xuXG4gICAgLy8gRXhwb3NlIHNjcm9sbGluZyBBUElcbiAgICAoY29tcG9uZW50IGFzIGFueSkuc2Nyb2xsaW5nID0ge1xuICAgICAgaGFuZGxlV2hlZWwsXG4gICAgICBzY3JvbGxUb1Bvc2l0aW9uLFxuICAgICAgc2Nyb2xsVG9JbmRleCxcbiAgICAgIHNjcm9sbFRvUGFnZSxcbiAgICAgIHNjcm9sbEJ5LFxuICAgICAgZ2V0U2Nyb2xsUG9zaXRpb246ICgpID0+IHNjcm9sbFBvc2l0aW9uLFxuICAgICAgdXBkYXRlU2Nyb2xsQm91bmRzLFxuICAgICAgZ2V0VmVsb2NpdHk6ICgpID0+IHNwZWVkVHJhY2tlci52ZWxvY2l0eSxcbiAgICAgIGdldERpcmVjdGlvbjogKCkgPT4gc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgIGlzU2Nyb2xsaW5nOiAoKSA9PiBpc1Njcm9sbGluZyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL21vbWVudHVtLnRzXG5cbi8qKlxuICogTW9tZW50dW0gRmVhdHVyZSAtIEFkZHMgaW5lcnRpYWwgc2Nyb2xsaW5nIHRvIHZpZXdwb3J0XG4gKiBQcm92aWRlcyBzbW9vdGggZGVjZWxlcmF0aW9uIGFmdGVyIHRvdWNoL21vdXNlIGRyYWcgZ2VzdHVyZXNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29tcG9uZW50LCBWaWV3cG9ydENvbnRleHQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZJRVdQT1JUX0NPTlNUQU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuaW50ZXJmYWNlIE1vbWVudHVtQ29uZmlnIHtcbiAgZW5hYmxlZD86IGJvb2xlYW47XG4gIGRlY2VsZXJhdGlvbj86IG51bWJlcjtcbiAgbWluVmVsb2NpdHk/OiBudW1iZXI7XG4gIG1pbkR1cmF0aW9uPzogbnVtYmVyO1xuICBtaW5WZWxvY2l0eVRocmVzaG9sZD86IG51bWJlcjtcbiAgLyoqIFN0b3AgbW9tZW50dW0gd2hlbiBjbGlja2luZyBvbiB0aGUgdmlld3BvcnQgKGRlZmF1bHQ6IHRydWUpICovXG4gIHN0b3BPbkNsaWNrPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBZGRzIG1vbWVudHVtIHNjcm9sbGluZyB0byB2aWV3cG9ydFxuICovXG5leHBvcnQgY29uc3Qgd2l0aE1vbWVudHVtID0gKGNvbmZpZzogTW9tZW50dW1Db25maWcgPSB7fSkgPT4ge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBWaWV3cG9ydENvbXBvbmVudD4oY29tcG9uZW50OiBUKTogVCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgZW5hYmxlZCA9IFZJRVdQT1JUX0NPTlNUQU5UUy5NT01FTlRVTS5FTkFCTEVELFxuICAgICAgZGVjZWxlcmF0aW9uID0gVklFV1BPUlRfQ09OU1RBTlRTLk1PTUVOVFVNLkRFQ0VMRVJBVElPTl9GQUNUT1IsXG4gICAgICBtaW5WZWxvY2l0eSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5NT01FTlRVTS5NSU5fVkVMT0NJVFksXG4gICAgICBtaW5EdXJhdGlvbiA9IFZJRVdQT1JUX0NPTlNUQU5UUy5NT01FTlRVTS5NSU5fRFVSQVRJT04sXG4gICAgICBtaW5WZWxvY2l0eVRocmVzaG9sZCA9IFZJRVdQT1JUX0NPTlNUQU5UUy5NT01FTlRVTS5NSU5fVkVMT0NJVFlfVEhSRVNIT0xELFxuICAgICAgc3RvcE9uQ2xpY2sgPSB0cnVlLCAvLyBTdG9wIG1vbWVudHVtIG9uIGNsaWNrIGJ5IGRlZmF1bHRcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gQWx3YXlzIGFwcGx5IHRoZSBmZWF0dXJlLCBidXQgY2hlY2sgaXNFbmFibGVkIGF0IHJ1bnRpbWVcblxuICAgIC8vIE1vbWVudHVtIHN0YXRlXG4gICAgbGV0IG1vbWVudHVtQW5pbWF0aW9uSWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGxldCBpc1RvdWNoaW5nID0gZmFsc2U7XG4gICAgbGV0IGlzTW91c2VEcmFnZ2luZyA9IGZhbHNlO1xuICAgIGxldCBsYXN0VG91Y2hQb3NpdGlvbiA9IDA7XG4gICAgbGV0IGxhc3RNb3VzZVBvc2l0aW9uID0gMDtcbiAgICBsZXQgdG91Y2hTdGFydFRpbWUgPSAwO1xuICAgIGxldCB2aWV3cG9ydFN0YXRlOiBhbnk7XG4gICAgbGV0IHNjcm9sbGluZ1N0YXRlOiBhbnk7XG4gICAgbGV0IGlzRW5hYmxlZCA9IGVuYWJsZWQ7IC8vIFRyYWNrIGN1cnJlbnQgZW5hYmxlZCBzdGF0ZVxuXG4gICAgLy8gR2V0IHJlZmVyZW5jZXMgYWZ0ZXIgaW5pdGlhbGl6YXRpb25cbiAgICBjb25zdCBvcmlnaW5hbEluaXRpYWxpemUgPSBjb21wb25lbnQudmlld3BvcnQuaW5pdGlhbGl6ZTtcbiAgICBjb21wb25lbnQudmlld3BvcnQuaW5pdGlhbGl6ZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG9yaWdpbmFsSW5pdGlhbGl6ZSgpO1xuICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IGluaXRpYWxpemVkXG4gICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCB2aWV3cG9ydCBhbmQgc2Nyb2xsaW5nIHN0YXRlc1xuICAgICAgdmlld3BvcnRTdGF0ZSA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zdGF0ZTtcbiAgICAgIHNjcm9sbGluZ1N0YXRlID0gKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLnNjcm9sbGluZ1N0YXRlO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgLy8gU3RvcCBtb21lbnR1bSBhbmltYXRpb24gKGNhbiBiZSBjYWxsZWQgZXh0ZXJuYWxseSlcbiAgICBjb25zdCBzdG9wTW9tZW50dW0gPSAoKSA9PiB7XG4gICAgICBpZiAobW9tZW50dW1BbmltYXRpb25JZCkge1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShtb21lbnR1bUFuaW1hdGlvbklkKTtcbiAgICAgICAgbW9tZW50dW1BbmltYXRpb25JZCA9IG51bGw7XG4gICAgICAgIC8vIFJlc2V0IHZlbG9jaXR5IGluIHNjcm9sbGluZyBmZWF0dXJlXG4gICAgICAgIGlmIChzY3JvbGxpbmdTdGF0ZSkge1xuICAgICAgICAgIHNjcm9sbGluZ1N0YXRlLnNldFZlbG9jaXR5VG9aZXJvPy4oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTdGFydCBtb21lbnR1bSBhbmltYXRpb25cbiAgICBjb25zdCBzdGFydE1vbWVudHVtID0gKGluaXRpYWxWZWxvY2l0eTogbnVtYmVyKSA9PiB7XG4gICAgICAvLyBDYW5jZWwgYW55IGV4aXN0aW5nIG1vbWVudHVtXG4gICAgICBpZiAobW9tZW50dW1BbmltYXRpb25JZCkge1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShtb21lbnR1bUFuaW1hdGlvbklkKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHZlbG9jaXR5ID0gaW5pdGlhbFZlbG9jaXR5O1xuXG4gICAgICBjb25zdCBhbmltYXRlID0gKCkgPT4ge1xuICAgICAgICAvLyBBcHBseSBkZWNlbGVyYXRpb25cbiAgICAgICAgdmVsb2NpdHkgKj0gZGVjZWxlcmF0aW9uO1xuXG4gICAgICAgIC8vIFN0b3AgaWYgdmVsb2NpdHkgaXMgdG9vIHNtYWxsXG4gICAgICAgIGlmIChNYXRoLmFicyh2ZWxvY2l0eSkgPCBtaW5WZWxvY2l0eSkge1xuICAgICAgICAgIG1vbWVudHVtQW5pbWF0aW9uSWQgPSBudWxsO1xuICAgICAgICAgIC8vIFJlc2V0IHZlbG9jaXR5IGluIHNjcm9sbGluZyBmZWF0dXJlXG4gICAgICAgICAgaWYgKHNjcm9sbGluZ1N0YXRlKSB7XG4gICAgICAgICAgICBzY3JvbGxpbmdTdGF0ZS5zZXRWZWxvY2l0eVRvWmVybz8uKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBzY3JvbGwgZGVsdGEgKHZlbG9jaXR5IGlzIGluIHB4L21zLCBzbyBtdWx0aXBseSBieSBmcmFtZSB0aW1lKVxuICAgICAgICBjb25zdCBmcmFtZURlbHRhID0gdmVsb2NpdHkgKiBWSUVXUE9SVF9DT05TVEFOVFMuTU9NRU5UVU0uRlJBTUVfVElNRTtcblxuICAgICAgICAvLyBVc2Ugc2Nyb2xsaW5nIGZlYXR1cmUncyBBUEkgdG8gdXBkYXRlIHBvc2l0aW9uXG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsQnkpIHtcbiAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsQnkoZnJhbWVEZWx0YSk7XG5cbiAgICAgICAgICAvLyBDb250aW51ZSBhbmltYXRpb25cbiAgICAgICAgICBtb21lbnR1bUFuaW1hdGlvbklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIHNjcm9sbEJ5IG1ldGhvZCwgc3RvcCBtb21lbnR1bVxuICAgICAgICAgIG1vbWVudHVtQW5pbWF0aW9uSWQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBtb21lbnR1bUFuaW1hdGlvbklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpO1xuICAgIH07XG5cbiAgICAvLyBUb3VjaCBldmVudCBoYW5kbGVyc1xuICAgIGNvbnN0IGhhbmRsZVRvdWNoU3RhcnQgPSAoZTogVG91Y2hFdmVudCkgPT4ge1xuICAgICAgaXNUb3VjaGluZyA9IHRydWU7XG4gICAgICBjb25zdCB0b3VjaCA9IGUudG91Y2hlc1swXTtcbiAgICAgIGNvbnN0IG9yaWVudGF0aW9uID0gdmlld3BvcnRTdGF0ZT8ub3JpZW50YXRpb24gfHwgXCJ2ZXJ0aWNhbFwiO1xuICAgICAgbGFzdFRvdWNoUG9zaXRpb24gPVxuICAgICAgICBvcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiID8gdG91Y2guY2xpZW50WSA6IHRvdWNoLmNsaWVudFg7XG4gICAgICB0b3VjaFN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgICAgIC8vIENhbmNlbCBhbnkgb25nb2luZyBtb21lbnR1bVxuICAgICAgaWYgKG1vbWVudHVtQW5pbWF0aW9uSWQpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUobW9tZW50dW1BbmltYXRpb25JZCk7XG4gICAgICAgIG1vbWVudHVtQW5pbWF0aW9uSWQgPSBudWxsO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVUb3VjaE1vdmUgPSAoZTogVG91Y2hFdmVudCkgPT4ge1xuICAgICAgaWYgKCFpc1RvdWNoaW5nKSByZXR1cm47XG5cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTsgLy8gUHJldmVudCBuYXRpdmUgc2Nyb2xsaW5nXG5cbiAgICAgIGNvbnN0IHRvdWNoID0gZS50b3VjaGVzWzBdO1xuICAgICAgY29uc3Qgb3JpZW50YXRpb24gPSB2aWV3cG9ydFN0YXRlPy5vcmllbnRhdGlvbiB8fCBcInZlcnRpY2FsXCI7XG4gICAgICBjb25zdCBjdXJyZW50UG9zaXRpb24gPVxuICAgICAgICBvcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiID8gdG91Y2guY2xpZW50WSA6IHRvdWNoLmNsaWVudFg7XG4gICAgICBjb25zdCBkZWx0YSA9IGxhc3RUb3VjaFBvc2l0aW9uIC0gY3VycmVudFBvc2l0aW9uOyAvLyBJbnZlcnRlZCBmb3IgbmF0dXJhbCBzY3JvbGxpbmdcbiAgICAgIGxhc3RUb3VjaFBvc2l0aW9uID0gY3VycmVudFBvc2l0aW9uO1xuXG4gICAgICAvLyBVc2Ugc2Nyb2xsaW5nIGZlYXR1cmUncyBBUEkgKDE6MSB0b3VjaC10by1zY3JvbGwgZm9yIG5hdHVyYWwgZmVlbClcbiAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsQnkpIHtcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5KGRlbHRhKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlVG91Y2hFbmQgPSAoKSA9PiB7XG4gICAgICBpZiAoIWlzVG91Y2hpbmcpIHJldHVybjtcbiAgICAgIGlzVG91Y2hpbmcgPSBmYWxzZTtcblxuICAgICAgY29uc3QgdG91Y2hFbmRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHRvdWNoRHVyYXRpb24gPSB0b3VjaEVuZFRpbWUgLSB0b3VjaFN0YXJ0VGltZTtcblxuICAgICAgLy8gR2V0IGN1cnJlbnQgdmVsb2NpdHkgZnJvbSBzY3JvbGxpbmcgZmVhdHVyZVxuICAgICAgY29uc3QgdmVsb2NpdHkgPSBjb21wb25lbnQudmlld3BvcnQuZ2V0VmVsb2NpdHk/LigpIHx8IDA7XG5cbiAgICAgIC8vIE9ubHkgc3RhcnQgbW9tZW50dW0gaWYgdGhlIHRvdWNoIHdhcyBxdWljayBlbm91Z2ggYW5kIHdlIGhhdmUgdmVsb2NpdHlcbiAgICAgIGlmIChcbiAgICAgICAgdG91Y2hEdXJhdGlvbiA8IG1pbkR1cmF0aW9uICYmXG4gICAgICAgIE1hdGguYWJzKHZlbG9jaXR5KSA+IG1pblZlbG9jaXR5VGhyZXNob2xkXG4gICAgICApIHtcbiAgICAgICAgc3RhcnRNb21lbnR1bSh2ZWxvY2l0eSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSBjbGljayB0byBzdG9wIG1vbWVudHVtICh3aXRob3V0IHByZXZlbnRpbmcgc2VsZWN0aW9uKVxuICAgIGNvbnN0IGhhbmRsZUNsaWNrID0gKF9lOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBzdG9wTW9tZW50dW0oKTtcbiAgICB9O1xuXG4gICAgLy8gTW91c2UgZXZlbnQgaGFuZGxlcnMgZm9yIGRlc2t0b3BcbiAgICBjb25zdCBoYW5kbGVNb3VzZURvd24gPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgaXNNb3VzZURyYWdnaW5nID0gdHJ1ZTtcbiAgICAgIGNvbnN0IG9yaWVudGF0aW9uID0gdmlld3BvcnRTdGF0ZT8ub3JpZW50YXRpb24gfHwgXCJ2ZXJ0aWNhbFwiO1xuICAgICAgbGFzdE1vdXNlUG9zaXRpb24gPSBvcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiID8gZS5jbGllbnRZIDogZS5jbGllbnRYO1xuICAgICAgdG91Y2hTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAvLyBDYW5jZWwgYW55IG9uZ29pbmcgbW9tZW50dW1cbiAgICAgIHN0b3BNb21lbnR1bSgpO1xuXG4gICAgICAvLyBQcmV2ZW50IHRleHQgc2VsZWN0aW9uXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZU1vdXNlTW92ZSA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBpZiAoIWlzTW91c2VEcmFnZ2luZykgcmV0dXJuO1xuXG4gICAgICBjb25zdCBvcmllbnRhdGlvbiA9IHZpZXdwb3J0U3RhdGU/Lm9yaWVudGF0aW9uIHx8IFwidmVydGljYWxcIjtcbiAgICAgIGNvbnN0IGN1cnJlbnRQb3NpdGlvbiA9XG4gICAgICAgIG9yaWVudGF0aW9uID09PSBcInZlcnRpY2FsXCIgPyBlLmNsaWVudFkgOiBlLmNsaWVudFg7XG4gICAgICBjb25zdCBkZWx0YSA9IGxhc3RNb3VzZVBvc2l0aW9uIC0gY3VycmVudFBvc2l0aW9uO1xuICAgICAgbGFzdE1vdXNlUG9zaXRpb24gPSBjdXJyZW50UG9zaXRpb247XG5cbiAgICAgIC8vIFVzZSBzY3JvbGxpbmcgZmVhdHVyZSdzIEFQSSAoMToxIGRyYWctdG8tc2Nyb2xsIGZvciBuYXR1cmFsIGZlZWwpXG4gICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5KSB7XG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxCeShkZWx0YSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZU1vdXNlVXAgPSAoKSA9PiB7XG4gICAgICBpZiAoIWlzTW91c2VEcmFnZ2luZykgcmV0dXJuO1xuICAgICAgaXNNb3VzZURyYWdnaW5nID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IG1vdXNlVXBUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGRyYWdEdXJhdGlvbiA9IG1vdXNlVXBUaW1lIC0gdG91Y2hTdGFydFRpbWU7XG5cbiAgICAgIC8vIEdldCBjdXJyZW50IHZlbG9jaXR5IGZyb20gc2Nyb2xsaW5nIGZlYXR1cmVcbiAgICAgIGNvbnN0IHZlbG9jaXR5ID0gY29tcG9uZW50LnZpZXdwb3J0LmdldFZlbG9jaXR5Py4oKSB8fCAwO1xuXG4gICAgICAvLyBTdGFydCBtb21lbnR1bSBmb3IgcXVpY2sgZHJhZ3NcbiAgICAgIGlmIChcbiAgICAgICAgZHJhZ0R1cmF0aW9uIDwgbWluRHVyYXRpb24gJiZcbiAgICAgICAgTWF0aC5hYnModmVsb2NpdHkpID4gbWluVmVsb2NpdHlUaHJlc2hvbGRcbiAgICAgICkge1xuICAgICAgICBzdGFydE1vbWVudHVtKHZlbG9jaXR5KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gT3ZlcnJpZGUgaW5pdGlhbGl6ZSB0byBhZGQgZXZlbnQgbGlzdGVuZXJzXG4gICAgY29uc3Qgb3JpZ2luYWxJbml0ID0gY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemU7XG4gICAgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBvcmlnaW5hbEluaXQoKTtcbiAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBpbml0aWFsaXplZFxuICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2aWV3cG9ydEVsZW1lbnQgPVxuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkudmlld3BvcnRFbGVtZW50IHx8XG4gICAgICAgIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zdGF0ZT8udmlld3BvcnRFbGVtZW50O1xuXG4gICAgICBpZiAodmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgIC8vIFRvdWNoIGV2ZW50c1xuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgaGFuZGxlVG91Y2hTdGFydCwge1xuICAgICAgICAgIHBhc3NpdmU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCBoYW5kbGVUb3VjaE1vdmUsIHtcbiAgICAgICAgICBwYXNzaXZlOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiwgaGFuZGxlVG91Y2hFbmQsIHtcbiAgICAgICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBNb3VzZSBldmVudHMgZm9yIGRlc2t0b3AgZHJhZ2dpbmdcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgaGFuZGxlTW91c2VEb3duKTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGhhbmRsZU1vdXNlVXApO1xuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgaGFuZGxlTW91c2VVcCk7XG5cbiAgICAgICAgLy8gQWRkIGNsaWNrIGxpc3RlbmVyIHRvIHN0b3AgbW9tZW50dW0gb24gY2xpY2sgKHdpdGhvdXQgYmxvY2tpbmcgc2VsZWN0aW9uKVxuICAgICAgICBpZiAoc3RvcE9uQ2xpY2spIHtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNsaWNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0b3JlIHJlZmVyZW5jZSBmb3IgY2xlYW51cFxuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuX21vbWVudHVtVmlld3BvcnRFbGVtZW50ID0gdmlld3BvcnRFbGVtZW50O1xuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuX21vbWVudHVtU3RvcE9uQ2xpY2sgPSBzdG9wT25DbGljaztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQ2xlYW4gdXAgb24gZGVzdHJveVxuICAgIGlmIChcImRlc3Ryb3lcIiBpbiBjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IGNvbXBvbmVudC5kZXN0cm95O1xuICAgICAgY29tcG9uZW50LmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIFJlbW92ZSBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgY29uc3Qgdmlld3BvcnRFbGVtZW50ID0gKGNvbXBvbmVudCBhcyBhbnkpLl9tb21lbnR1bVZpZXdwb3J0RWxlbWVudDtcbiAgICAgICAgaWYgKHZpZXdwb3J0RWxlbWVudCkge1xuICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLCBoYW5kbGVUb3VjaFN0YXJ0KTtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCBoYW5kbGVUb3VjaE1vdmUpO1xuICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiwgaGFuZGxlVG91Y2hFbmQpO1xuICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGhhbmRsZU1vdXNlRG93bik7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgaGFuZGxlTW91c2VVcCk7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIGhhbmRsZU1vdXNlVXApO1xuICAgICAgICAgIGlmICgoY29tcG9uZW50IGFzIGFueSkuX21vbWVudHVtU3RvcE9uQ2xpY2spIHtcbiAgICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlQ2xpY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbmNlbCBtb21lbnR1bSBhbmltYXRpb25cbiAgICAgICAgc3RvcE1vbWVudHVtKCk7XG5cbiAgICAgICAgb3JpZ2luYWxEZXN0cm95KCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEV4cG9zZSBtb21lbnR1bSBzdGF0ZSBmb3Igb3RoZXIgZmVhdHVyZXNcbiAgICAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkubW9tZW50dW1TdGF0ZSA9IHtcbiAgICAgIHN0b3BNb21lbnR1bSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3Njcm9sbGJhci50c1xuXG4vKipcbiAqIFNjcm9sbGJhciBGZWF0dXJlIC0gQ3VzdG9tIHNjcm9sbGJhciBpbXBsZW1lbnRhdGlvblxuICogUHJvdmlkZXMgdmlzdWFsIHNjcm9sbCBpbmRpY2F0aW9uIGFuZCBkcmFnLXRvLXNjcm9sbCBmdW5jdGlvbmFsaXR5XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBWSUVXUE9SVF9DT05TVEFOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB3cmFwSW5pdGlhbGl6ZSwgd3JhcERlc3Ryb3ksIHN0b3JlRmVhdHVyZUZ1bmN0aW9uIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IFBSRUZJWCwgYWRkQ2xhc3MsIHJlbW92ZUNsYXNzIH0gZnJvbSBcIm10cmxcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTY3JvbGxiYXJDb25maWcge1xuICBlbmFibGVkPzogYm9vbGVhbjtcbiAgYXV0b0hpZGU/OiBib29sZWFuO1xuICB0aHVtYk1pbkhlaWdodD86IG51bWJlcjtcbiAgdGh1bWJDb2xvcj86IHN0cmluZztcbiAgdHJhY2tDb2xvcj86IHN0cmluZztcbiAgYm9yZGVyUmFkaXVzPzogbnVtYmVyO1xuICBmYWRlVGltZW91dD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY3JvbGxiYXJDb21wb25lbnQge1xuICBzY3JvbGxiYXI6IHtcbiAgICBzaG93OiAoKSA9PiB2b2lkO1xuICAgIGhpZGU6ICgpID0+IHZvaWQ7XG4gICAgdXBkYXRlQm91bmRzOiAodG90YWxWaXJ0dWFsU2l6ZTogbnVtYmVyLCBjb250YWluZXJTaXplOiBudW1iZXIpID0+IHZvaWQ7XG4gICAgdXBkYXRlUG9zaXRpb246IChzY3JvbGxQb3NpdGlvbjogbnVtYmVyKSA9PiB2b2lkO1xuICB9O1xufVxuXG4vKipcbiAqIEFkZHMgc2Nyb2xsYmFyIGZ1bmN0aW9uYWxpdHkgdG8gdmlld3BvcnQgY29tcG9uZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoU2Nyb2xsYmFyKGNvbmZpZzogU2Nyb2xsYmFyQ29uZmlnID0ge30pIHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KFxuICAgIGNvbXBvbmVudDogVFxuICApOiBUICYgU2Nyb2xsYmFyQ29tcG9uZW50ID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICAgIGF1dG9IaWRlID0gdHJ1ZSxcbiAgICAgIHRodW1iTWluSGVpZ2h0ID0gMjUsXG4gICAgICBib3JkZXJSYWRpdXMgPSA0LFxuICAgICAgZmFkZVRpbWVvdXQgPSAxMDAwLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBSZXR1cm4gbm8tb3AgaWYgZGlzYWJsZWRcbiAgICBpZiAoIWVuYWJsZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgICAgc2Nyb2xsYmFyOiB7XG4gICAgICAgICAgc2hvdzogKCkgPT4ge30sXG4gICAgICAgICAgaGlkZTogKCkgPT4ge30sXG4gICAgICAgICAgdXBkYXRlQm91bmRzOiAoKSA9PiB7fSxcbiAgICAgICAgICB1cGRhdGVQb3NpdGlvbjogKCkgPT4ge30sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFN0YXRlXG4gICAgbGV0IHZpZXdwb3J0RWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgc2Nyb2xsYmFyVHJhY2s6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHNjcm9sbGJhclRodW1iOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGxldCBpc0luaXRpYWxpemVkID0gZmFsc2U7XG4gICAgbGV0IGlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICBsZXQgZHJhZ1N0YXJ0WSA9IDA7XG4gICAgbGV0IGRyYWdTdGFydFNjcm9sbFBvc2l0aW9uID0gMDtcbiAgICBsZXQgaGlkZVRpbWVvdXQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHRvdGFsVmlydHVhbFNpemUgPSAwO1xuICAgIGxldCBjb250YWluZXJTaXplID0gMDtcbiAgICBsZXQgdGh1bWJIZWlnaHQgPSAwO1xuICAgIGxldCBhbmltYXRpb25GcmFtZUlkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgbGFzdFJlcXVlc3RlZFNjcm9sbFBvc2l0aW9uOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaXNDdXJzb3JNb2RlID0gZmFsc2U7XG4gICAgbGV0IGxvYWRlZEl0ZW1zQ291bnQgPSAwO1xuXG4gICAgLy8gQ3JlYXRlIHNjcm9sbGJhciBlbGVtZW50c1xuICAgIGNvbnN0IGNyZWF0ZVNjcm9sbGJhckVsZW1lbnRzID0gKCkgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydEVsZW1lbnQpIHJldHVybjtcblxuICAgICAgc2Nyb2xsYmFyVHJhY2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgYWRkQ2xhc3Moc2Nyb2xsYmFyVHJhY2ssIFZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVIpO1xuICAgICAgc2Nyb2xsYmFyVHJhY2suc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIHJpZ2h0OiAwO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIHotaW5kZXg6IDEwO1xuICAgICAgYDtcblxuICAgICAgc2Nyb2xsYmFyVGh1bWIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgc2Nyb2xsYmFyVGh1bWIsXG4gICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVJfVEhVTUJcbiAgICAgICk7XG5cbiAgICAgIHNjcm9sbGJhclRyYWNrLmFwcGVuZENoaWxkKHNjcm9sbGJhclRodW1iKTtcbiAgICAgIHZpZXdwb3J0RWxlbWVudC5hcHBlbmRDaGlsZChzY3JvbGxiYXJUcmFjayk7XG4gICAgfTtcblxuICAgIC8vIFNob3cvaGlkZSBmdW5jdGlvbnNcbiAgICBjb25zdCBzaG93ID0gKCkgPT4ge1xuICAgICAgaWYgKCFzY3JvbGxiYXJUcmFjayB8fCB0b3RhbFZpcnR1YWxTaXplIDw9IGNvbnRhaW5lclNpemUpIHJldHVybjtcblxuICAgICAgaWYgKGhpZGVUaW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dChoaWRlVGltZW91dCk7XG4gICAgICAgIGhpZGVUaW1lb3V0ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgYWRkQ2xhc3MoXG4gICAgICAgIHNjcm9sbGJhclRyYWNrLFxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSX1ZJU0lCTEVcbiAgICAgICk7XG5cbiAgICAgIGlmIChhdXRvSGlkZSAmJiAhaXNEcmFnZ2luZykge1xuICAgICAgICBoaWRlVGltZW91dCA9IHNldFRpbWVvdXQoaGlkZSwgZmFkZVRpbWVvdXQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoaWRlID0gKCkgPT4ge1xuICAgICAgaWYgKCFzY3JvbGxiYXJUcmFjayB8fCBpc0RyYWdnaW5nKSByZXR1cm47XG4gICAgICByZW1vdmVDbGFzcyhcbiAgICAgICAgc2Nyb2xsYmFyVHJhY2ssXG4gICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVJfVklTSUJMRVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIHNjcm9sbGJhciBib3VuZHNcbiAgICBjb25zdCB1cGRhdGVCb3VuZHMgPSAobmV3VG90YWxTaXplOiBudW1iZXIsIG5ld0NvbnRhaW5lclNpemU6IG51bWJlcikgPT4ge1xuICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9IG5ld1RvdGFsU2l6ZTtcbiAgICAgIGNvbnRhaW5lclNpemUgPSBuZXdDb250YWluZXJTaXplO1xuXG4gICAgICBpZiAoIXNjcm9sbGJhclRyYWNrIHx8ICFzY3JvbGxiYXJUaHVtYikgcmV0dXJuO1xuXG4gICAgICBjb25zdCBuZWVkc1Njcm9sbGJhciA9IHRvdGFsVmlydHVhbFNpemUgPiBjb250YWluZXJTaXplO1xuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbU2Nyb2xsYmFyXSB1cGRhdGVCb3VuZHM6IHRvdGFsU2l6ZT0ke3RvdGFsVmlydHVhbFNpemV9LCBjb250YWluZXJTaXplPSR7Y29udGFpbmVyU2l6ZX0sIG5lZWRzU2Nyb2xsYmFyPSR7bmVlZHNTY3JvbGxiYXJ9YFxuICAgICAgLy8gKTtcbiAgICAgIHNjcm9sbGJhclRyYWNrLnN0eWxlLmRpc3BsYXkgPSBuZWVkc1Njcm9sbGJhciA/IFwiYmxvY2tcIiA6IFwibm9uZVwiO1xuXG4gICAgICBpZiAobmVlZHNTY3JvbGxiYXIpIHtcbiAgICAgICAgbGV0IHNjcm9sbFJhdGlvOiBudW1iZXI7XG5cbiAgICAgICAgaWYgKGlzQ3Vyc29yTW9kZSAmJiBsb2FkZWRJdGVtc0NvdW50ID4gMCkge1xuICAgICAgICAgIC8vIEZvciBjdXJzb3IgbW9kZSwgdGh1bWIgc2l6ZSByZXByZXNlbnRzIGxvYWRlZCBjb250ZW50IHZzIGVzdGltYXRlZCB0b3RhbFxuICAgICAgICAgIC8vIElmIHdlIGRvbid0IGtub3cgdG90YWwsIHVzZSBsb2FkZWQgaXRlbXMgKiAyIGFzIGVzdGltYXRlXG4gICAgICAgICAgY29uc3QgZXN0aW1hdGVkVG90YWwgPVxuICAgICAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA+IDAgPyB0b3RhbFZpcnR1YWxTaXplIDogbG9hZGVkSXRlbXNDb3VudCAqIDI7XG4gICAgICAgICAgc2Nyb2xsUmF0aW8gPVxuICAgICAgICAgICAgY29udGFpbmVyU2l6ZSAvXG4gICAgICAgICAgICBNYXRoLm1heChlc3RpbWF0ZWRUb3RhbCwgbG9hZGVkSXRlbXNDb3VudCArIGNvbnRhaW5lclNpemUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vcm1hbCBjYWxjdWxhdGlvbiBmb3Igb2Zmc2V0L3BhZ2Ugc3RyYXRlZ2llc1xuICAgICAgICAgIHNjcm9sbFJhdGlvID0gY29udGFpbmVyU2l6ZSAvIHRvdGFsVmlydHVhbFNpemU7XG4gICAgICAgIH1cblxuICAgICAgICB0aHVtYkhlaWdodCA9IE1hdGgubWF4KHRodW1iTWluSGVpZ2h0LCBzY3JvbGxSYXRpbyAqIGNvbnRhaW5lclNpemUpO1xuICAgICAgICBzY3JvbGxiYXJUaHVtYi5zdHlsZS5oZWlnaHQgPSBgJHt0aHVtYkhlaWdodH1weGA7XG4gICAgICAgIHVwZGF0ZVBvc2l0aW9uKGNvbXBvbmVudC52aWV3cG9ydD8uZ2V0U2Nyb2xsUG9zaXRpb24oKSB8fCAwKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIHRodW1iIHBvc2l0aW9uXG4gICAgY29uc3QgdXBkYXRlUG9zaXRpb24gPSAoc2Nyb2xsUG9zOiBudW1iZXIpID0+IHtcbiAgICAgIGlmICghc2Nyb2xsYmFyVGh1bWIgfHwgIXNjcm9sbGJhclRyYWNrKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHNjcm9sbGFibGVEaXN0YW5jZSA9IHRvdGFsVmlydHVhbFNpemUgLSBjb250YWluZXJTaXplO1xuICAgICAgaWYgKHNjcm9sbGFibGVEaXN0YW5jZSA8PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gTWF0aC5taW4oXG4gICAgICAgIDEsXG4gICAgICAgIE1hdGgubWF4KDAsIHNjcm9sbFBvcyAvIHNjcm9sbGFibGVEaXN0YW5jZSlcbiAgICAgICk7XG4gICAgICBjb25zdCBtYXhUaHVtYlBvc2l0aW9uID1cbiAgICAgICAgc2Nyb2xsYmFyVHJhY2suY2xpZW50SGVpZ2h0IC0gc2Nyb2xsYmFyVGh1bWIuY2xpZW50SGVpZ2h0O1xuICAgICAgY29uc3QgdGh1bWJQb3NpdGlvbiA9IHNjcm9sbFJhdGlvICogbWF4VGh1bWJQb3NpdGlvbjtcblxuICAgICAgc2Nyb2xsYmFyVGh1bWIuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoJHt0aHVtYlBvc2l0aW9ufXB4KWA7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSB0cmFjayBjbGlja1xuICAgIGNvbnN0IGhhbmRsZVRyYWNrQ2xpY2sgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgaWYgKCFzY3JvbGxiYXJUcmFjayB8fCAhc2Nyb2xsYmFyVGh1bWIgfHwgZS50YXJnZXQgPT09IHNjcm9sbGJhclRodW1iKVxuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRyYWNrUmVjdCA9IHNjcm9sbGJhclRyYWNrLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgY2xpY2tZID0gZS5jbGllbnRZIC0gdHJhY2tSZWN0LnRvcDtcbiAgICAgIGNvbnN0IHRodW1iQ2VudGVyWSA9IGNsaWNrWSAtIHRodW1iSGVpZ2h0IC8gMjtcbiAgICAgIGNvbnN0IG1heFRodW1iUG9zaXRpb24gPSBjb250YWluZXJTaXplIC0gdGh1bWJIZWlnaHQ7XG4gICAgICBjb25zdCB0aHVtYlBvc2l0aW9uID0gTWF0aC5tYXgoXG4gICAgICAgIDAsXG4gICAgICAgIE1hdGgubWluKHRodW1iQ2VudGVyWSwgbWF4VGh1bWJQb3NpdGlvbilcbiAgICAgICk7XG4gICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IHRodW1iUG9zaXRpb24gLyBtYXhUaHVtYlBvc2l0aW9uO1xuICAgICAgY29uc3QgdGFyZ2V0U2Nyb2xsUG9zaXRpb24gPVxuICAgICAgICBzY3JvbGxSYXRpbyAqICh0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZSk7XG5cbiAgICAgIGNvbXBvbmVudC52aWV3cG9ydD8uc2Nyb2xsVG9Qb3NpdGlvbih0YXJnZXRTY3JvbGxQb3NpdGlvbik7XG4gICAgfTtcblxuICAgIC8vIE1vdXNlIGV2ZW50IGhhbmRsZXJzXG4gICAgY29uc3QgaGFuZGxlVGh1bWJNb3VzZURvd24gPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICBkcmFnU3RhcnRZID0gZS5jbGllbnRZO1xuICAgICAgZHJhZ1N0YXJ0U2Nyb2xsUG9zaXRpb24gPSBjb21wb25lbnQudmlld3BvcnQ/LmdldFNjcm9sbFBvc2l0aW9uKCkgfHwgMDtcblxuICAgICAgaWYgKHNjcm9sbGJhclRyYWNrKSB7XG4gICAgICAgIGFkZENsYXNzKFxuICAgICAgICAgIHNjcm9sbGJhclRyYWNrLFxuICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVJfRFJBR0dJTkdcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gRW1pdCBkcmFnIHN0YXJ0IGV2ZW50IHRvIG5vdGlmeSB2aWV3cG9ydFxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OmRyYWctc3RhcnRcIiwge1xuICAgICAgICBzb3VyY2U6IFwic2Nyb2xsYmFyXCIsXG4gICAgICAgIHN0YXJ0UG9zaXRpb246IGRyYWdTdGFydFNjcm9sbFBvc2l0aW9uLFxuICAgICAgfSk7XG5cbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGhhbmRsZU1vdXNlVXApO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZU1vdmUgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgaWYgKCFpc0RyYWdnaW5nIHx8ICFzY3JvbGxiYXJUcmFjayB8fCAhc2Nyb2xsYmFyVGh1bWIpIHJldHVybjtcblxuICAgICAgY29uc3QgZGVsdGFZID0gZS5jbGllbnRZIC0gZHJhZ1N0YXJ0WTtcbiAgICAgIGNvbnN0IHRyYWNrSGVpZ2h0ID0gc2Nyb2xsYmFyVHJhY2suY2xpZW50SGVpZ2h0O1xuICAgICAgY29uc3QgdGh1bWJIZWlnaHQgPSBzY3JvbGxiYXJUaHVtYi5jbGllbnRIZWlnaHQ7XG4gICAgICBjb25zdCBtYXhUaHVtYlRyYXZlbCA9IHRyYWNrSGVpZ2h0IC0gdGh1bWJIZWlnaHQ7XG5cbiAgICAgIGlmIChtYXhUaHVtYlRyYXZlbCA8PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGRlbHRhUmF0aW8gPSBkZWx0YVkgLyBtYXhUaHVtYlRyYXZlbDtcbiAgICAgIGNvbnN0IGRyYWdTdGFydFNjcm9sbFJhdGlvID1cbiAgICAgICAgZHJhZ1N0YXJ0U2Nyb2xsUG9zaXRpb24gLyAodG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuICAgICAgY29uc3QgbmV3U2Nyb2xsUmF0aW8gPSBNYXRoLm1heChcbiAgICAgICAgMCxcbiAgICAgICAgTWF0aC5taW4oMSwgZHJhZ1N0YXJ0U2Nyb2xsUmF0aW8gKyBkZWx0YVJhdGlvKVxuICAgICAgKTtcblxuICAgICAgLy8gVXBkYXRlIHRodW1iIHBvc2l0aW9uIGltbWVkaWF0ZWx5XG4gICAgICBjb25zdCB0aHVtYlBvc2l0aW9uID0gbmV3U2Nyb2xsUmF0aW8gKiBtYXhUaHVtYlRyYXZlbDtcbiAgICAgIHNjcm9sbGJhclRodW1iLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKCR7dGh1bWJQb3NpdGlvbn1weClgO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgbmV3IHNjcm9sbCBwb3NpdGlvblxuICAgICAgY29uc3QgbmV3UG9zaXRpb24gPSBuZXdTY3JvbGxSYXRpbyAqICh0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZSk7XG4gICAgICBsYXN0UmVxdWVzdGVkU2Nyb2xsUG9zaXRpb24gPSBuZXdQb3NpdGlvbjtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbU2Nyb2xsYmFyXSBNb3VzZSBtb3ZlOiBuZXdQb3M9JHtuZXdQb3NpdGlvbi50b0ZpeGVkKFxuICAgICAgLy8gICAgIDBcbiAgICAgIC8vICAgKX0sIGFuaW1hdGlvbkZyYW1lSWQ9JHthbmltYXRpb25GcmFtZUlkfWBcbiAgICAgIC8vICk7XG5cbiAgICAgIC8vIFRocm90dGxlIHZpZXdwb3J0IHVwZGF0ZXNcbiAgICAgIGlmIChhbmltYXRpb25GcmFtZUlkID09PSBudWxsICYmIGNvbXBvbmVudC52aWV3cG9ydCkge1xuICAgICAgICBhbmltYXRpb25GcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIGBbU2Nyb2xsYmFyXSBSQUYgY2FsbGJhY2s6IHNjcm9sbGluZyB0byAke2xhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbn1gXG4gICAgICAgICAgLy8gKTtcbiAgICAgICAgICBpZiAobGFzdFJlcXVlc3RlZFNjcm9sbFBvc2l0aW9uICE9PSBudWxsICYmIGNvbXBvbmVudC52aWV3cG9ydCkge1xuICAgICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbFRvUG9zaXRpb24obGFzdFJlcXVlc3RlZFNjcm9sbFBvc2l0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYW5pbWF0aW9uRnJhbWVJZCA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZVVwID0gKCkgPT4ge1xuICAgICAgLy8gY29uc29sZS5sb2coXCJbU2Nyb2xsYmFyXSBNb3VzZSB1cCAtIGVuZGluZyBkcmFnXCIpO1xuICAgICAgaXNEcmFnZ2luZyA9IGZhbHNlO1xuXG4gICAgICBpZiAoYW5pbWF0aW9uRnJhbWVJZCAhPT0gbnVsbCkge1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShhbmltYXRpb25GcmFtZUlkKTtcbiAgICAgICAgYW5pbWF0aW9uRnJhbWVJZCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChsYXN0UmVxdWVzdGVkU2Nyb2xsUG9zaXRpb24gIT09IG51bGwgJiYgY29tcG9uZW50LnZpZXdwb3J0KSB7XG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb1Bvc2l0aW9uKGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbik7XG4gICAgICAgIGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbiA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChzY3JvbGxiYXJUcmFjaykge1xuICAgICAgICByZW1vdmVDbGFzcyhcbiAgICAgICAgICBzY3JvbGxiYXJUcmFjayxcbiAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSX0RSQUdHSU5HXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVtaXQgZHJhZyBlbmQgZXZlbnRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpkcmFnLWVuZFwiLCB7XG4gICAgICAgIHNvdXJjZTogXCJzY3JvbGxiYXJcIixcbiAgICAgICAgZW5kUG9zaXRpb246IGNvbXBvbmVudC52aWV3cG9ydD8uZ2V0U2Nyb2xsUG9zaXRpb24oKSB8fCAwLFxuICAgICAgfSk7XG5cbiAgICAgIGhpZGUoKTtcblxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgaGFuZGxlTW91c2VVcCk7XG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgZnVuY3Rpb25cbiAgICBjb25zdCBpbml0aWFsaXplID0gKCkgPT4ge1xuICAgICAgaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjtcblxuICAgICAgdmlld3BvcnRFbGVtZW50ID0gY29tcG9uZW50LmVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIGAuJHtQUkVGSVh9LXZpZXdwb3J0YFxuICAgICAgKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgaWYgKCF2aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiW1Njcm9sbGJhcl0gTm8gdmlld3BvcnQgZWxlbWVudCBmb3VuZFwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgIGAuJHtQUkVGSVh9LSR7VklFV1BPUlRfQ09OU1RBTlRTLlNDUk9MTEJBUi5DTEFTU0VTLlNDUk9MTEJBUn1gXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjcmVhdGVTY3JvbGxiYXJFbGVtZW50cygpO1xuICAgICAgaXNJbml0aWFsaXplZCA9IHRydWU7XG5cbiAgICAgIGlmIChzY3JvbGxiYXJUcmFjayAmJiB2aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgc2Nyb2xsYmFyVHJhY2suYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZVRyYWNrQ2xpY2spO1xuXG4gICAgICAgIGlmIChzY3JvbGxiYXJUaHVtYikge1xuICAgICAgICAgIHNjcm9sbGJhclRodW1iLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgaGFuZGxlVGh1bWJNb3VzZURvd24pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWVudGVyXCIsIHNob3csIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgXCJtb3VzZWxlYXZlXCIsXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFpc0RyYWdnaW5nKSBoaWRlKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IHBhc3NpdmU6IHRydWUgfVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBJbml0aWFsaXplIHdpdGggY3VycmVudCB2aWV3cG9ydCBzdGF0ZVxuICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydCkge1xuICAgICAgICBjb25zdCBpbmZvID0gY29tcG9uZW50LnZpZXdwb3J0LmdldFZpZXdwb3J0SW5mbygpO1xuICAgICAgICB0b3RhbFZpcnR1YWxTaXplID0gaW5mby50b3RhbFZpcnR1YWxTaXplO1xuICAgICAgICBjb250YWluZXJTaXplID0gaW5mby5jb250YWluZXJTaXplO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluIGN1cnNvciBtb2RlXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbjtcbiAgICAgICAgY29uc3Qgdmlld3BvcnRDb25maWcgPSAoY29tcG9uZW50IGFzIGFueSkuY29uZmlnO1xuICAgICAgICBpc0N1cnNvck1vZGUgPSB2aWV3cG9ydENvbmZpZz8ucGFnaW5hdGlvbj8uc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCI7XG5cbiAgICAgICAgdXBkYXRlQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgICB1cGRhdGVQb3NpdGlvbihjb21wb25lbnQudmlld3BvcnQuZ2V0U2Nyb2xsUG9zaXRpb24oKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEV2ZW50IGxpc3RlbmVyc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpzY3JvbGxcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBpZiAoIWlzRHJhZ2dpbmcpIHtcbiAgICAgICAgICB1cGRhdGVQb3NpdGlvbihkYXRhLnBvc2l0aW9uKTtcbiAgICAgICAgICBzaG93KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnZpcnR1YWwtc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9IGRhdGEudG90YWxWaXJ0dWFsU2l6ZTtcbiAgICAgICAgdXBkYXRlQm91bmRzKGRhdGEudG90YWxWaXJ0dWFsU2l6ZSwgY29udGFpbmVyU2l6ZSk7XG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpjb250YWluZXItc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29udGFpbmVyU2l6ZSA9IGRhdGEuY29udGFpbmVyU2l6ZTtcbiAgICAgICAgdXBkYXRlQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGRhdGEuY29udGFpbmVyU2l6ZSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBpdGVtcyBsb2FkZWQgdG8gdXBkYXRlIHNjcm9sbGJhciBpbiBjdXJzb3IgbW9kZVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDppdGVtcy1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGlzQ3Vyc29yTW9kZSkge1xuICAgICAgICAgIGxvYWRlZEl0ZW1zQ291bnQgPSBkYXRhLmxvYWRlZENvdW50IHx8IDA7XG4gICAgICAgICAgdXBkYXRlQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciB0b3RhbCBpdGVtcyBjaGFuZ2VzIChpbXBvcnRhbnQgZm9yIGN1cnNvciBtb2RlKVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDp0b3RhbC1pdGVtcy1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGlzQ3Vyc29yTW9kZSAmJiBkYXRhLnRvdGFsKSB7XG4gICAgICAgICAgLy8gSW4gY3Vyc29yIG1vZGUsIHRoZSB0b3RhbCBpcyBkeW5hbWljXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgW1Njcm9sbGJhcl0gQ3Vyc29yIG1vZGU6IHVwZGF0aW5nIGJvdW5kcyBmb3IgbmV3IHRvdGFsICR7ZGF0YS50b3RhbH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICB1cGRhdGVCb3VuZHModG90YWxWaXJ0dWFsU2l6ZSwgY29udGFpbmVyU2l6ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBTdG9yZSBpbml0aWFsaXplIGZ1bmN0aW9uXG4gICAgc3RvcmVGZWF0dXJlRnVuY3Rpb24oY29tcG9uZW50LCBcIl9zY3JvbGxiYXJJbml0aWFsaXplXCIsIGluaXRpYWxpemUpO1xuXG4gICAgLy8gSG9vayBpbnRvIHZpZXdwb3J0IGluaXRpYWxpemF0aW9uXG4gICAgd3JhcEluaXRpYWxpemUoY29tcG9uZW50LCBpbml0aWFsaXplKTtcblxuICAgIC8vIENsZWFudXBcbiAgICBjb25zdCBkZXN0cm95ID0gKCkgPT4ge1xuICAgICAgaWYgKHNjcm9sbGJhclRyYWNrKSB7XG4gICAgICAgIHNjcm9sbGJhclRyYWNrLnJlbW92ZSgpO1xuICAgICAgICBzY3JvbGxiYXJUcmFjayA9IG51bGw7XG4gICAgICB9XG4gICAgICBzY3JvbGxiYXJUaHVtYiA9IG51bGw7XG4gICAgICB2aWV3cG9ydEVsZW1lbnQgPSBudWxsO1xuICAgICAgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgICBpZiAoaGlkZVRpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGhpZGVUaW1lb3V0KTtcbiAgICAgICAgaGlkZVRpbWVvdXQgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBoYW5kbGVNb3VzZVVwKTtcbiAgICB9O1xuXG4gICAgc3RvcmVGZWF0dXJlRnVuY3Rpb24oY29tcG9uZW50LCBcIl9zY3JvbGxiYXJEZXN0cm95XCIsIGRlc3Ryb3kpO1xuICAgIHdyYXBEZXN0cm95KGNvbXBvbmVudCwgZGVzdHJveSk7XG5cbiAgICAvLyBSZXR1cm4gZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIHNjcm9sbGJhcjogeyBzaG93LCBoaWRlLCB1cGRhdGVCb3VuZHMsIHVwZGF0ZVBvc2l0aW9uIH0sXG4gICAgfTtcbiAgfTtcbn1cbiIsCiAgICAiLy8gc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvY29sbGVjdGlvbi50c1xuXG4vKipcbiAqIENvbGxlY3Rpb24gRmVhdHVyZSAtIERhdGEgbWFuYWdlbWVudCBhbmQgcmFuZ2UgbG9hZGluZ1xuICogSGFuZGxlcyBjb2xsZWN0aW9uIGludGVncmF0aW9uLCBwYWdpbmF0aW9uLCBhbmQgZGF0YSBmZXRjaGluZ1xuICovXG5cbmltcG9ydCB0eXBlIHsgVmlld3BvcnRDb250ZXh0LCBWaWV3cG9ydENvbXBvbmVudCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVklFV1BPUlRfQ09OU1RBTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgd3JhcERlc3Ryb3kgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbGxlY3Rpb25Db25maWcge1xuICBjb2xsZWN0aW9uPzogYW55OyAvLyBDb2xsZWN0aW9uIGFkYXB0ZXJcbiAgcmFuZ2VTaXplPzogbnVtYmVyOyAvLyBEZWZhdWx0IHJhbmdlIHNpemUgZm9yIGxvYWRpbmdcbiAgc3RyYXRlZ3k/OiBcIm9mZnNldFwiIHwgXCJwYWdlXCIgfCBcImN1cnNvclwiOyAvLyBMb2FkaW5nIHN0cmF0ZWd5XG4gIHRyYW5zZm9ybT86IChpdGVtOiBhbnkpID0+IGFueTsgLy8gSXRlbSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvblxuICBjYW5jZWxMb2FkVGhyZXNob2xkPzogbnVtYmVyOyAvLyBWZWxvY2l0eSB0aHJlc2hvbGQgZm9yIGNhbmNlbGxpbmcgbG9hZHNcbiAgbWF4Q29uY3VycmVudFJlcXVlc3RzPzogbnVtYmVyO1xuICBlbmFibGVSZXF1ZXN0UXVldWU/OiBib29sZWFuO1xuICBtYXhRdWV1ZVNpemU/OiBudW1iZXI7XG4gIGxvYWRPbkRyYWdFbmQ/OiBib29sZWFuOyAvLyBFbmFibGUgbG9hZGluZyB3aGVuIGRyYWcgZW5kcyAoc2FmZXR5IG1lYXN1cmUpXG4gIGluaXRpYWxTY3JvbGxJbmRleD86IG51bWJlcjsgLy8gSW5pdGlhbCBzY3JvbGwgcG9zaXRpb24gKDAtYmFzZWQgaW5kZXgpXG4gIHNlbGVjdElkPzogc3RyaW5nIHwgbnVtYmVyOyAvLyBJRCBvZiBpdGVtIHRvIHNlbGVjdCBhZnRlciBpbml0aWFsIGxvYWQgY29tcGxldGVzXG4gIGF1dG9Mb2FkPzogYm9vbGVhbjsgLy8gV2hldGhlciB0byBhdXRvbWF0aWNhbGx5IGxvYWQgZGF0YSBvbiBpbml0aWFsaXphdGlvbiAoZGVmYXVsdDogdHJ1ZSlcbiAgYXV0b1NlbGVjdEZpcnN0PzogYm9vbGVhbjsgLy8gQXV0b21hdGljYWxseSBzZWxlY3QgZmlyc3QgaXRlbSBhZnRlciBpbml0aWFsIGxvYWQgKGRlZmF1bHQ6IGZhbHNlKVxuICAvKiogTWF4aW11bSBpdGVtcyB0byBrZWVwIGluIG1lbW9yeSAoZGVmYXVsdDogMTAwMCkgKi9cbiAgbWF4Q2FjaGVkSXRlbXM/OiBudW1iZXI7XG4gIC8qKiBFeHRyYSBpdGVtcyB0byBrZWVwIGFyb3VuZCB2aXNpYmxlIHJhbmdlIGR1cmluZyBldmljdGlvbiAoZGVmYXVsdDogMTUwKSAqL1xuICBldmljdGlvbkJ1ZmZlcj86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0aW9uQ29tcG9uZW50IHtcbiAgY29sbGVjdGlvbjoge1xuICAgIGxvYWRSYW5nZTogKG9mZnNldDogbnVtYmVyLCBsaW1pdDogbnVtYmVyKSA9PiBQcm9taXNlPGFueVtdPjtcbiAgICBsb2FkTWlzc2luZ1JhbmdlczogKFxuICAgICAgcmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSxcbiAgICAgIGNhbGxlcj86IHN0cmluZyxcbiAgICApID0+IFByb21pc2U8dm9pZD47XG4gICAgZ2V0TG9hZGVkUmFuZ2VzOiAoKSA9PiBTZXQ8bnVtYmVyPjtcbiAgICBnZXRQZW5kaW5nUmFuZ2VzOiAoKSA9PiBTZXQ8bnVtYmVyPjtcbiAgICBjbGVhckZhaWxlZFJhbmdlczogKCkgPT4gdm9pZDtcbiAgICByZXRyeUZhaWxlZFJhbmdlOiAocmFuZ2VJZDogbnVtYmVyKSA9PiBQcm9taXNlPGFueVtdPjtcbiAgICBzZXRUb3RhbEl0ZW1zOiAodG90YWw6IG51bWJlcikgPT4gdm9pZDtcbiAgICBnZXRUb3RhbEl0ZW1zOiAoKSA9PiBudW1iZXI7XG4gICAgLy8gQ3Vyc29yLXNwZWNpZmljIG1ldGhvZHNcbiAgICBnZXRDdXJyZW50Q3Vyc29yOiAoKSA9PiBzdHJpbmcgfCBudWxsO1xuICAgIGdldEN1cnNvckZvclBhZ2U6IChwYWdlOiBudW1iZXIpID0+IHN0cmluZyB8IG51bGw7XG4gIH07XG59XG5cbi8qKlxuICogQWRkcyBjb2xsZWN0aW9uIGZ1bmN0aW9uYWxpdHkgdG8gdmlld3BvcnQgY29tcG9uZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoQ29sbGVjdGlvbihjb25maWc6IENvbGxlY3Rpb25Db25maWcgPSB7fSkge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBWaWV3cG9ydENvbXBvbmVudD4oXG4gICAgY29tcG9uZW50OiBULFxuICApOiBUICYgQ29sbGVjdGlvbkNvbXBvbmVudCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgY29sbGVjdGlvbixcbiAgICAgIHJhbmdlU2l6ZSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5MT0FESU5HLkRFRkFVTFRfUkFOR0VfU0laRSxcbiAgICAgIHN0cmF0ZWd5ID0gXCJvZmZzZXRcIixcbiAgICAgIHRyYW5zZm9ybSxcbiAgICAgIGNhbmNlbExvYWRUaHJlc2hvbGQgPSBWSUVXUE9SVF9DT05TVEFOVFMuTE9BRElORy5DQU5DRUxfVEhSRVNIT0xELFxuICAgICAgbWF4Q29uY3VycmVudFJlcXVlc3RzID0gVklFV1BPUlRfQ09OU1RBTlRTLkxPQURJTkdcbiAgICAgICAgLk1BWF9DT05DVVJSRU5UX1JFUVVFU1RTLFxuICAgICAgZW5hYmxlUmVxdWVzdFF1ZXVlID0gVklFV1BPUlRfQ09OU1RBTlRTLlJFUVVFU1RfUVVFVUUuRU5BQkxFRCxcbiAgICAgIG1heFF1ZXVlU2l6ZSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5SRVFVRVNUX1FVRVVFLk1BWF9RVUVVRV9TSVpFLFxuICAgICAgbG9hZE9uRHJhZ0VuZCA9IHRydWUsIC8vIERlZmF1bHQgdG8gdHJ1ZSBhcyBzYWZldHkgbWVhc3VyZVxuICAgICAgaW5pdGlhbFNjcm9sbEluZGV4ID0gMCwgLy8gU3RhcnQgZnJvbSBiZWdpbm5pbmcgYnkgZGVmYXVsdFxuICAgICAgc2VsZWN0SWQsIC8vIElEIG9mIGl0ZW0gdG8gc2VsZWN0IGFmdGVyIGluaXRpYWwgbG9hZFxuICAgICAgYXV0b0xvYWQgPSB0cnVlLCAvLyBBdXRvLWxvYWQgaW5pdGlhbCBkYXRhIGJ5IGRlZmF1bHRcbiAgICAgIGF1dG9TZWxlY3RGaXJzdCA9IGZhbHNlLCAvLyBBdXRvbWF0aWNhbGx5IHNlbGVjdCBmaXJzdCBpdGVtIGFmdGVyIGluaXRpYWwgbG9hZFxuICAgICAgbWF4Q2FjaGVkSXRlbXMgPSAxMDAwLCAvLyBNYXhpbXVtIGl0ZW1zIHRvIGtlZXAgaW4gbWVtb3J5XG4gICAgICBldmljdGlvbkJ1ZmZlciA9IDE1MCwgLy8gRXh0cmEgaXRlbXMgdG8ga2VlcCBhcm91bmQgdmlzaWJsZSByYW5nZVxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBUcmFjayBpZiB3ZSd2ZSBjb21wbGV0ZWQgdGhlIGluaXRpYWwgbG9hZCBmb3IgaW5pdGlhbFNjcm9sbEluZGV4XG4gICAgLy8gVGhpcyBwcmV2ZW50cyB0aGUgdmlld3BvcnQ6cmFuZ2UtY2hhbmdlZCBsaXN0ZW5lciBmcm9tIGxvYWRpbmcgcGFnZSAxXG4gICAgbGV0IGhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQgPSBmYWxzZTtcbiAgICBjb25zdCBoYXNJbml0aWFsU2Nyb2xsSW5kZXggPSBpbml0aWFsU2Nyb2xsSW5kZXggPiAwO1xuXG4gICAgLy8gY29uc29sZS5sb2coXCJbVmlld3BvcnQgQ29sbGVjdGlvbl0gSW5pdGlhbGl6ZWQgd2l0aCBjb25maWc6XCIsIHtcbiAgICAvLyAgIHN0cmF0ZWd5LFxuICAgIC8vICAgcmFuZ2VTaXplLFxuICAgIC8vICAgaW5pdGlhbFNjcm9sbEluZGV4LFxuICAgIC8vIH0pO1xuXG4gICAgLy8gTG9hZGluZyBtYW5hZ2VyIHN0YXRlXG4gICAgaW50ZXJmYWNlIFF1ZXVlZFJlcXVlc3Qge1xuICAgICAgcmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfTtcbiAgICAgIHByaW9yaXR5OiBcImhpZ2hcIiB8IFwibm9ybWFsXCIgfCBcImxvd1wiO1xuICAgICAgdGltZXN0YW1wOiBudW1iZXI7XG4gICAgICByZXNvbHZlOiAoKSA9PiB2b2lkO1xuICAgICAgcmVqZWN0OiAoZXJyb3I6IGFueSkgPT4gdm9pZDtcbiAgICAgIGNhbGxlcj86IHN0cmluZztcbiAgICB9XG5cbiAgICAvLyBTdGF0ZSB0cmFja2luZ1xuICAgIGxldCBjdXJyZW50VmVsb2NpdHkgPSAwO1xuICAgIGxldCBhY3RpdmVMb2FkQ291bnQgPSAwO1xuICAgIGxldCBjb21wbGV0ZWRMb2FkcyA9IDA7XG4gICAgbGV0IGZhaWxlZExvYWRzID0gMDtcbiAgICBsZXQgY2FuY2VsbGVkTG9hZHMgPSAwO1xuICAgIGxldCBpc0RyYWdnaW5nID0gZmFsc2U7IC8vIFRyYWNrIGRyYWcgc3RhdGVcblxuICAgIC8vIENhY2hlIGV2aWN0aW9uIGNvbmZpZ3VyYXRpb24gKGZyb20gY29uZmlnKVxuICAgIGNvbnN0IE1BWF9DQUNIRURfSVRFTVMgPSBtYXhDYWNoZWRJdGVtcztcbiAgICBjb25zdCBFVklDVElPTl9CVUZGRVIgPSBldmljdGlvbkJ1ZmZlcjtcblxuICAgIC8vIE1lbW9yeSBkaWFnbm9zdGljc1xuICAgIGNvbnN0IGxvZ01lbW9yeVN0YXRzID0gKGNhbGxlcjogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBpdGVtQ291bnQgPSBpdGVtcy5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuICAgICAgY29uc3QgbG9hZGVkUmFuZ2VDb3VudCA9IGxvYWRlZFJhbmdlcy5zaXplO1xuICAgICAgY29uc3QgcGVuZGluZ1JhbmdlQ291bnQgPSBwZW5kaW5nUmFuZ2VzLnNpemU7XG4gICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXJDb3VudCA9IGFib3J0Q29udHJvbGxlcnMuc2l6ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRXZpY3QgaXRlbXMgZmFyIGZyb20gdGhlIGN1cnJlbnQgdmlzaWJsZSByYW5nZSB0byBwcmV2ZW50IG1lbW9yeSBibG9hdFxuICAgICAqIEtlZXBzIGl0ZW1zIHdpdGhpbiBFVklDVElPTl9CVUZGRVIgb2YgdGhlIHZpc2libGUgcmFuZ2VcbiAgICAgKi9cbiAgICBjb25zdCBldmljdERpc3RhbnRJdGVtcyA9ICh2aXNpYmxlU3RhcnQ6IG51bWJlciwgdmlzaWJsZUVuZDogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBpdGVtQ291bnQgPSBpdGVtcy5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuXG4gICAgICAvLyBPbmx5IGV2aWN0IGlmIHdlIGhhdmUgbW9yZSB0aGFuIE1BWF9DQUNIRURfSVRFTVNcbiAgICAgIGlmIChpdGVtQ291bnQgPD0gTUFYX0NBQ0hFRF9JVEVNUykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtlZXBTdGFydCA9IE1hdGgubWF4KDAsIHZpc2libGVTdGFydCAtIEVWSUNUSU9OX0JVRkZFUik7XG4gICAgICBjb25zdCBrZWVwRW5kID0gdmlzaWJsZUVuZCArIEVWSUNUSU9OX0JVRkZFUjtcblxuICAgICAgbGV0IGV2aWN0ZWRDb3VudCA9IDA7XG4gICAgICBjb25zdCByYW5nZXNUb1JlbW92ZSA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuXG4gICAgICAvLyBGaW5kIGl0ZW1zIHRvIGV2aWN0IGFuZCB0cmFjayB3aGljaCByYW5nZXMgYXJlIGFmZmVjdGVkXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpdGVtc1tpXSAhPT0gdW5kZWZpbmVkICYmIChpIDwga2VlcFN0YXJ0IHx8IGkgPiBrZWVwRW5kKSkge1xuICAgICAgICAgIGRlbGV0ZSBpdGVtc1tpXTtcbiAgICAgICAgICBldmljdGVkQ291bnQrKztcbiAgICAgICAgICAvLyBNYXJrIHRoZSByYW5nZSBjb250YWluaW5nIHRoaXMgaXRlbSBmb3IgcmVtb3ZhbCBmcm9tIGxvYWRlZFJhbmdlc1xuICAgICAgICAgIC8vIFRoaXMgZW5zdXJlcyB0aGUgcmFuZ2Ugd2lsbCBiZSByZWxvYWRlZCB3aGVuIHNjcm9sbGluZyBiYWNrXG4gICAgICAgICAgY29uc3QgYWZmZWN0ZWRSYW5nZUlkID0gTWF0aC5mbG9vcihpIC8gcmFuZ2VTaXplKTtcbiAgICAgICAgICByYW5nZXNUb1JlbW92ZS5hZGQoYWZmZWN0ZWRSYW5nZUlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBSZW1vdmUgYWxsIHJhbmdlcyB0aGF0IGhhZCBhbnkgaXRlbXMgZXZpY3RlZFxuICAgICAgLy8gVGhpcyBpcyBjcml0aWNhbDogZXZlbiBpZiBvbmx5IHBhcnQgb2YgYSByYW5nZSB3YXMgZXZpY3RlZCxcbiAgICAgIC8vIHdlIG11c3QgcmVtb3ZlIGl0IGZyb20gbG9hZGVkUmFuZ2VzIHNvIGl0IGdldHMgcmVsb2FkZWRcbiAgICAgIC8vIEFsc28gcmVtb3ZlIGZyb20gcGVuZGluZ1JhbmdlcyAtIGlmIGEgc2xvdyByZXF1ZXN0IGNvbXBsZXRlcyBmb3IgYW4gZXZpY3RlZCByYW5nZSxcbiAgICAgIC8vIHdlIGRvbid0IHdhbnQgaXQgdG8gYmxvY2sgZnV0dXJlIGxvYWRzIHdoZW4gdXNlciBzY3JvbGxzIGJhY2tcbiAgICAgIHJhbmdlc1RvUmVtb3ZlLmZvckVhY2goKHJhbmdlSWQpID0+IHtcbiAgICAgICAgbG9hZGVkUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgcGVuZGluZ1Jhbmdlcy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgIC8vIENsZWFuIHVwIGFjdGl2ZSByZXF1ZXN0cyB0cmFja2luZ1xuICAgICAgICBhY3RpdmVSZXF1ZXN0cy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgIC8vIEFsc28gYWJvcnQgYW55IGluLWZsaWdodCByZXF1ZXN0IGZvciB0aGlzIHJhbmdlIHRvIGZyZWUgdXAgbmV0d29yayByZXNvdXJjZXNcbiAgICAgICAgY29uc3QgY29udHJvbGxlciA9IGFib3J0Q29udHJvbGxlcnMuZ2V0KHJhbmdlSWQpO1xuICAgICAgICBpZiAoY29udHJvbGxlcikge1xuICAgICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICBhYm9ydENvbnRyb2xsZXJzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChldmljdGVkQ291bnQgPiAwKSB7XG4gICAgICAgIC8vIEVtaXQgZXZlbnQgZm9yIHJlbmRlcmluZyB0byBhbHNvIGNsZWFuIHVwXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJjb2xsZWN0aW9uOml0ZW1zLWV2aWN0ZWRcIiwge1xuICAgICAgICAgIGtlZXBTdGFydCxcbiAgICAgICAgICBrZWVwRW5kLFxuICAgICAgICAgIGV2aWN0ZWRDb3VudCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGFjdGl2ZUxvYWRSYW5nZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBsZXQgbG9hZFJlcXVlc3RRdWV1ZTogUXVldWVkUmVxdWVzdFtdID0gW107XG5cbiAgICAvLyBBYm9ydENvbnRyb2xsZXIgbWFwIGZvciBjYW5jZWxsaW5nIGluLWZsaWdodCByZXF1ZXN0c1xuICAgIGNvbnN0IGFib3J0Q29udHJvbGxlcnMgPSBuZXcgTWFwPG51bWJlciwgQWJvcnRDb250cm9sbGVyPigpO1xuXG4gICAgLy8gU3RhdGVcbiAgICBsZXQgaXRlbXM6IGFueVtdID0gW107XG4gICAgbGV0IHRvdGFsSXRlbXMgPSAwO1xuICAgIGxldCBsb2FkZWRSYW5nZXMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICBsZXQgcGVuZGluZ1JhbmdlcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgIGxldCBmYWlsZWRSYW5nZXMgPSBuZXcgTWFwPFxuICAgICAgbnVtYmVyLFxuICAgICAge1xuICAgICAgICBhdHRlbXB0czogbnVtYmVyO1xuICAgICAgICBsYXN0RXJyb3I6IEVycm9yO1xuICAgICAgICB0aW1lc3RhbXA6IG51bWJlcjtcbiAgICAgIH1cbiAgICA+KCk7XG4gICAgbGV0IGFjdGl2ZVJlcXVlc3RzID0gbmV3IE1hcDxudW1iZXIsIFByb21pc2U8YW55W10+PigpO1xuXG4gICAgLy8gQ3Vyc29yIHBhZ2luYXRpb24gc3RhdGVcbiAgICBsZXQgY3VycmVudEN1cnNvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGN1cnNvck1hcCA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmc+KCk7IC8vIE1hcCBwYWdlIG51bWJlciB0byBjdXJzb3JcbiAgICBsZXQgcGFnZVRvT2Zmc2V0TWFwID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTsgLy8gTWFwIHBhZ2UgdG8gYWN0dWFsIG9mZnNldFxuICAgIGxldCBoaWdoZXN0TG9hZGVkUGFnZSA9IDA7XG4gICAgbGV0IGRpc2NvdmVyZWRUb3RhbDogbnVtYmVyIHwgbnVsbCA9IG51bGw7IC8vIFRyYWNrIGRpc2NvdmVyZWQgdG90YWwgZnJvbSBBUElcbiAgICBsZXQgaGFzUmVhY2hlZEVuZCA9IGZhbHNlOyAvLyBUcmFjayBpZiB3ZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgZGF0YVxuXG4gICAgLy8gU2hhcmUgaXRlbXMgYXJyYXkgd2l0aCBjb21wb25lbnRcbiAgICBjb21wb25lbnQuaXRlbXMgPSBpdGVtcztcblxuICAgIC8qKlxuICAgICAqIEdldCBhIHVuaXF1ZSBJRCBmb3IgYSByYW5nZSBiYXNlZCBvbiBvZmZzZXQgYW5kIHRoZSBiYXNlIHJhbmdlIHNpemVcbiAgICAgKi9cbiAgICBjb25zdCBnZXRSYW5nZUlkID0gKG9mZnNldDogbnVtYmVyLCBsaW1pdDogbnVtYmVyKTogbnVtYmVyID0+IHtcbiAgICAgIC8vIEFsd2F5cyB1c2UgdGhlIGJhc2UgcmFuZ2VTaXplIGZvciBjb25zaXN0ZW50IElEc1xuICAgICAgLy8gVGhpcyBlbnN1cmVzIG1lcmdlZCByYW5nZXMgY2FuIGJlIHRyYWNrZWQgcHJvcGVybHlcbiAgICAgIHJldHVybiBNYXRoLmZsb29yKG9mZnNldCAvIHJhbmdlU2l6ZSk7XG4gICAgfTtcblxuICAgIC8vIExvYWRpbmcgbWFuYWdlciBoZWxwZXJzXG4gICAgY29uc3QgZ2V0UmFuZ2VLZXkgPSAocmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSk6IHN0cmluZyA9PiB7XG4gICAgICByZXR1cm4gYCR7cmFuZ2Uuc3RhcnR9LSR7cmFuZ2UuZW5kfWA7XG4gICAgfTtcblxuICAgIGNvbnN0IGNhbkxvYWQgPSAoKTogYm9vbGVhbiA9PiB7XG4gICAgICByZXR1cm4gY3VycmVudFZlbG9jaXR5IDw9IGNhbmNlbExvYWRUaHJlc2hvbGQ7XG4gICAgfTtcblxuICAgIGNvbnN0IHByb2Nlc3NRdWV1ZSA9ICgpID0+IHtcbiAgICAgIGlmICghZW5hYmxlUmVxdWVzdFF1ZXVlIHx8IGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIC8vIFNvcnQgcXVldWUgYnkgcHJpb3JpdHkgYW5kIHRpbWVzdGFtcFxuICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IHByaW9yaXR5T3JkZXIgPSB7IGhpZ2g6IDAsIG5vcm1hbDogMSwgbG93OiAyIH07XG4gICAgICAgIGNvbnN0IHByaW9yaXR5RGlmZiA9XG4gICAgICAgICAgcHJpb3JpdHlPcmRlclthLnByaW9yaXR5XSAtIHByaW9yaXR5T3JkZXJbYi5wcmlvcml0eV07XG4gICAgICAgIHJldHVybiBwcmlvcml0eURpZmYgIT09IDAgPyBwcmlvcml0eURpZmYgOiBhLnRpbWVzdGFtcCAtIGIudGltZXN0YW1wO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFByb2Nlc3MgcmVxdWVzdHMgdXAgdG8gY2FwYWNpdHlcbiAgICAgIHdoaWxlIChcbiAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggPiAwICYmXG4gICAgICAgIGFjdGl2ZUxvYWRDb3VudCA8IG1heENvbmN1cnJlbnRSZXF1ZXN0c1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBsb2FkUmVxdWVzdFF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIGlmIChyZXF1ZXN0KSB7XG4gICAgICAgICAgZXhlY3V0ZVF1ZXVlZExvYWQocmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgZXhlY3V0ZVF1ZXVlZExvYWQgPSAocmVxdWVzdDogUXVldWVkUmVxdWVzdCkgPT4ge1xuICAgICAgYWN0aXZlTG9hZENvdW50Kys7XG4gICAgICBhY3RpdmVMb2FkUmFuZ2VzLmFkZChnZXRSYW5nZUtleShyZXF1ZXN0LnJhbmdlKSk7XG5cbiAgICAgIC8vIENhbGwgdGhlIGFjdHVhbCBsb2FkTWlzc2luZ1JhbmdlcyBmdW5jdGlvblxuICAgICAgbG9hZE1pc3NpbmdSYW5nZXNJbnRlcm5hbChyZXF1ZXN0LnJhbmdlLCByZXF1ZXN0LmNhbGxlcilcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJlcXVlc3QucmVzb2x2ZSgpO1xuICAgICAgICAgIGNvbXBsZXRlZExvYWRzKys7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgcmVxdWVzdC5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgIGZhaWxlZExvYWRzKys7XG4gICAgICAgIH0pXG4gICAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICBhY3RpdmVMb2FkQ291bnQtLTtcbiAgICAgICAgICBhY3RpdmVMb2FkUmFuZ2VzLmRlbGV0ZShnZXRSYW5nZUtleShyZXF1ZXN0LnJhbmdlKSk7XG4gICAgICAgICAgcHJvY2Vzc1F1ZXVlKCk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm0gaXRlbXMgaWYgdHJhbnNmb3JtIGZ1bmN0aW9uIHByb3ZpZGVkXG4gICAgICovXG4gICAgY29uc3QgdHJhbnNmb3JtSXRlbXMgPSAocmF3SXRlbXM6IGFueVtdKTogYW55W10gPT4ge1xuICAgICAgaWYgKCF0cmFuc2Zvcm0pIHJldHVybiByYXdJdGVtcztcbiAgICAgIHJldHVybiByYXdJdGVtcy5tYXAodHJhbnNmb3JtKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogTG9hZCBhIHJhbmdlIG9mIGRhdGFcbiAgICAgKi9cbiAgICBjb25zdCBsb2FkUmFuZ2UgPSBhc3luYyAob2Zmc2V0OiBudW1iZXIsIGxpbWl0OiBudW1iZXIpOiBQcm9taXNlPGFueVtdPiA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBsb2FkUmFuZ2UgY2FsbGVkOiBvZmZzZXQ9JHtvZmZzZXR9LCBsaW1pdD0ke2xpbWl0fWAsXG4gICAgICAvLyApO1xuXG4gICAgICBpZiAoIWNvbGxlY3Rpb24pIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiW0NvbGxlY3Rpb25dIE5vIGNvbGxlY3Rpb24gYWRhcHRlciBjb25maWd1cmVkXCIpO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJhbmdlSWQgPSBnZXRSYW5nZUlkKG9mZnNldCwgbGltaXQpO1xuICAgICAgLy8gY29uc29sZS5sb2coYFtDb2xsZWN0aW9uXSBSYW5nZSBJRDogJHtyYW5nZUlkfWApO1xuXG4gICAgICAvLyBDaGVjayBpZiBhbHJlYWR5IGxvYWRlZFxuICAgICAgaWYgKGxvYWRlZFJhbmdlcy5oYXMocmFuZ2VJZCkpIHtcbiAgICAgICAgcmV0dXJuIGl0ZW1zLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgbGltaXQpO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiBhbHJlYWR5IHBlbmRpbmdcbiAgICAgIGlmIChwZW5kaW5nUmFuZ2VzLmhhcyhyYW5nZUlkKSkge1xuICAgICAgICBjb25zdCBleGlzdGluZ1JlcXVlc3QgPSBhY3RpdmVSZXF1ZXN0cy5nZXQocmFuZ2VJZCk7XG4gICAgICAgIGlmIChleGlzdGluZ1JlcXVlc3QpIHtcbiAgICAgICAgICByZXR1cm4gZXhpc3RpbmdSZXF1ZXN0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE1hcmsgYXMgcGVuZGluZ1xuICAgICAgcGVuZGluZ1Jhbmdlcy5hZGQocmFuZ2VJZCk7XG5cbiAgICAgIC8vIENyZWF0ZSBBYm9ydENvbnRyb2xsZXIgZm9yIHRoaXMgcmVxdWVzdFxuICAgICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgYWJvcnRDb250cm9sbGVycy5zZXQocmFuZ2VJZCwgYWJvcnRDb250cm9sbGVyKTtcblxuICAgICAgLy8gQ3JlYXRlIHJlcXVlc3QgcHJvbWlzZVxuICAgICAgY29uc3QgcmVxdWVzdFByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIENhbGwgY29sbGVjdGlvbiBhZGFwdGVyIHdpdGggYXBwcm9wcmlhdGUgcGFyYW1ldGVyc1xuICAgICAgICAgIGNvbnN0IHBhZ2UgPSBNYXRoLmZsb29yKG9mZnNldCAvIGxpbWl0KSArIDE7XG4gICAgICAgICAgbGV0IHBhcmFtczogYW55O1xuXG4gICAgICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImN1cnNvclwiKSB7XG4gICAgICAgICAgICAvLyBGb3IgY3Vyc29yIHBhZ2luYXRpb25cbiAgICAgICAgICAgIGlmIChwYWdlID09PSAxKSB7XG4gICAgICAgICAgICAgIC8vIEZpcnN0IHBhZ2UgLSBubyBjdXJzb3JcbiAgICAgICAgICAgICAgcGFyYW1zID0geyBsaW1pdCB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBjdXJzb3IgZm9yIHByZXZpb3VzIHBhZ2VcbiAgICAgICAgICAgICAgY29uc3QgcHJldlBhZ2VDdXJzb3IgPSBjdXJzb3JNYXAuZ2V0KHBhZ2UgLSAxKTtcbiAgICAgICAgICAgICAgaWYgKCFwcmV2UGFnZUN1cnNvcikge1xuICAgICAgICAgICAgICAgIC8vIENhbid0IGxvYWQgdGhpcyBwYWdlIHdpdGhvdXQgcHJldmlvdXMgY3Vyc29yXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgYFtDb2xsZWN0aW9uXSBDYW5ub3QgbG9hZCBwYWdlICR7cGFnZX0gd2l0aG91dCBjdXJzb3IgZm9yIHBhZ2UgJHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZSAtIDFcbiAgICAgICAgICAgICAgICAgIH1gLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgYFNlcXVlbnRpYWwgbG9hZGluZyByZXF1aXJlZCAtIG1pc3NpbmcgY3Vyc29yIGZvciBwYWdlICR7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2UgLSAxXG4gICAgICAgICAgICAgICAgICB9YCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHBhcmFtcyA9IHsgY3Vyc29yOiBwcmV2UGFnZUN1cnNvciwgbGltaXQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHN0cmF0ZWd5ID09PSBcInBhZ2VcIikge1xuICAgICAgICAgICAgcGFyYW1zID0geyBwYWdlLCBsaW1pdCB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBvZmZzZXQgc3RyYXRlZ3lcbiAgICAgICAgICAgIHBhcmFtcyA9IHsgb2Zmc2V0LCBsaW1pdCB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtWaWV3cG9ydCBDb2xsZWN0aW9uXSBMb2FkaW5nIHJhbmdlIG9mZnNldD0ke29mZnNldH0sIGxpbWl0PSR7bGltaXR9LCBzdHJhdGVneT0ke3N0cmF0ZWd5fSwgY2FsY3VsYXRlZCBwYWdlPSR7cGFnZX0sIHBhcmFtczpgLFxuICAgICAgICAgIC8vICAgSlNPTi5zdHJpbmdpZnkocGFyYW1zKVxuICAgICAgICAgIC8vICk7XG5cbiAgICAgICAgICAvLyBQYXNzIGFib3J0IHNpZ25hbCB0byB0aGUgYWRhcHRlciBpZiBpdCBzdXBwb3J0cyBpdFxuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY29sbGVjdGlvbi5yZWFkKHtcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEV4dHJhY3QgaXRlbXMgYW5kIHRvdGFsXG4gICAgICAgICAgY29uc3QgcmF3SXRlbXMgPSByZXNwb25zZS5kYXRhIHx8IHJlc3BvbnNlLml0ZW1zIHx8IHJlc3BvbnNlO1xuICAgICAgICAgIGNvbnN0IG1ldGEgPSByZXNwb25zZS5tZXRhIHx8IHt9O1xuXG4gICAgICAgICAgLy8gRm9yIGN1cnNvciBwYWdpbmF0aW9uLCB0cmFjayB0aGUgY3Vyc29yIChjaGVjayBib3RoIGN1cnNvciBhbmQgbmV4dEN1cnNvcilcbiAgICAgICAgICBjb25zdCByZXNwb25zZUN1cnNvciA9IG1ldGEuY3Vyc29yIHx8IG1ldGEubmV4dEN1cnNvcjtcbiAgICAgICAgICBpZiAoc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIgJiYgcmVzcG9uc2VDdXJzb3IpIHtcbiAgICAgICAgICAgIGN1cnJlbnRDdXJzb3IgPSByZXNwb25zZUN1cnNvcjtcbiAgICAgICAgICAgIGN1cnNvck1hcC5zZXQocGFnZSwgcmVzcG9uc2VDdXJzb3IpO1xuICAgICAgICAgICAgcGFnZVRvT2Zmc2V0TWFwLnNldChwYWdlLCBvZmZzZXQpO1xuICAgICAgICAgICAgaGlnaGVzdExvYWRlZFBhZ2UgPSBNYXRoLm1heChoaWdoZXN0TG9hZGVkUGFnZSwgcGFnZSk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBTdG9yZWQgY3Vyc29yIGZvciBwYWdlICR7cGFnZX06ICR7cmVzcG9uc2VDdXJzb3J9YCxcbiAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgd2UndmUgcmVhY2hlZCB0aGUgZW5kXG4gICAgICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImN1cnNvclwiICYmIG1ldGEuaGFzTmV4dCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGhhc1JlYWNoZWRFbmQgPSB0cnVlO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gUmVhY2hlZCBlbmQgb2YgY3Vyc29yIHBhZ2luYXRpb24gYXQgcGFnZSAke3BhZ2V9YCxcbiAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVXBkYXRlIGRpc2NvdmVyZWQgdG90YWwgaWYgcHJvdmlkZWRcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gbWV0YS50b3RhbDogJHttZXRhLnRvdGFsfSwgZGlzY292ZXJlZFRvdGFsIGJlZm9yZTogJHtkaXNjb3ZlcmVkVG90YWx9YCxcbiAgICAgICAgICAvLyApO1xuICAgICAgICAgIGlmIChtZXRhLnRvdGFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRpc2NvdmVyZWRUb3RhbCA9IG1ldGEudG90YWw7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGBbQ29sbGVjdGlvbl0gZGlzY292ZXJlZFRvdGFsIGFmdGVyOiAke2Rpc2NvdmVyZWRUb3RhbH1gKTtcblxuICAgICAgICAgIC8vIFRyYW5zZm9ybSBpdGVtc1xuICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkSXRlbXMgPSB0cmFuc2Zvcm1JdGVtcyhyYXdJdGVtcyk7XG5cbiAgICAgICAgICAvLyBBZGQgaXRlbXMgdG8gYXJyYXlcbiAgICAgICAgICB0cmFuc2Zvcm1lZEl0ZW1zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpdGVtc1tvZmZzZXQgKyBpbmRleF0gPSBpdGVtO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRm9yIGN1cnNvciBzdHJhdGVneSwgY2FsY3VsYXRlIGR5bmFtaWMgdG90YWwgYmFzZWQgb24gbG9hZGVkIGRhdGFcbiAgICAgICAgICAvLyBVc2UgbnVsbGlzaCBjb2FsZXNjaW5nICg/PykgaW5zdGVhZCBvZiB8fCB0byBoYW5kbGUgZGlzY292ZXJlZFRvdGFsID0gMCBjb3JyZWN0bHlcbiAgICAgICAgICBsZXQgbmV3VG90YWwgPSBkaXNjb3ZlcmVkVG90YWwgPz8gdG90YWxJdGVtcztcblxuICAgICAgICAgIC8vIENSSVRJQ0FMIEZJWDogV2hlbiBBUEkgcmV0dXJucyAwIGl0ZW1zIG9uIHBhZ2UgMSAob2Zmc2V0IDApLCB0aGUgbGlzdCBpcyBlbXB0eS5cbiAgICAgICAgICAvLyBXZSBtdXN0IHNldCB0b3RhbEl0ZW1zIHRvIDAgcmVnYXJkbGVzcyBvZiBtZXRhLnRvdGFsIGJlaW5nIHVuZGVmaW5lZC5cbiAgICAgICAgICAvLyBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgY291bnQ9ZmFsc2UgaXMgc2VudCBidXQgdGhlIGxpc3QgaXMgYWN0dWFsbHkgZW1wdHkuXG4gICAgICAgICAgaWYgKG9mZnNldCA9PT0gMCAmJiB0cmFuc2Zvcm1lZEl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gRW1wdHkgcmVzdWx0IG9uIHBhZ2UgMSAtIGZvcmNpbmcgdG90YWxJdGVtcyB0byAwYCxcbiAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgICBuZXdUb3RhbCA9IDA7XG4gICAgICAgICAgICBkaXNjb3ZlcmVkVG90YWwgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gbmV3VG90YWwgaW5pdGlhbDogJHtuZXdUb3RhbH0sIHRvdGFsSXRlbXM6ICR7dG90YWxJdGVtc30sIHN0cmF0ZWd5OiAke3N0cmF0ZWd5fWAsXG4gICAgICAgICAgLy8gKTtcblxuICAgICAgICAgIGlmIChzdHJhdGVneSA9PT0gXCJjdXJzb3JcIikge1xuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRvdGFsIGJhc2VkIG9uIGxvYWRlZCBpdGVtcyArIG1hcmdpblxuICAgICAgICAgICAgY29uc3QgbG9hZGVkSXRlbXNDb3VudCA9IGl0ZW1zLmZpbHRlcihcbiAgICAgICAgICAgICAgKGl0ZW0pID0+IGl0ZW0gIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICkubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgbWFyZ2luSXRlbXMgPSBoYXNSZWFjaGVkRW5kXG4gICAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgICA6IHJhbmdlU2l6ZSAqXG4gICAgICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlBBR0lOQVRJT04uQ1VSU09SX1NDUk9MTF9NQVJHSU5fTVVMVElQTElFUjtcbiAgICAgICAgICAgIGNvbnN0IG1pblZpcnR1YWxJdGVtcyA9XG4gICAgICAgICAgICAgIHJhbmdlU2l6ZSAqXG4gICAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QQUdJTkFUSU9OLkNVUlNPUl9NSU5fVklSVFVBTF9TSVpFX01VTFRJUExJRVI7XG5cbiAgICAgICAgICAgIC8vIER5bmFtaWMgdG90YWw6IGxvYWRlZCBpdGVtcyArIG1hcmdpbiAodW5sZXNzIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZClcbiAgICAgICAgICAgIG5ld1RvdGFsID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAgIGxvYWRlZEl0ZW1zQ291bnQgKyBtYXJnaW5JdGVtcyxcbiAgICAgICAgICAgICAgbWluVmlydHVhbEl0ZW1zLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gQ3Vyc29yIG1vZGUgdmlydHVhbCBzaXplOiBsb2FkZWQ9JHtsb2FkZWRJdGVtc0NvdW50fSwgbWFyZ2luPSR7bWFyZ2luSXRlbXN9LCB0b3RhbD0ke25ld1RvdGFsfSwgaGFzUmVhY2hlZEVuZD0ke2hhc1JlYWNoZWRFbmR9YCxcbiAgICAgICAgICAgIC8vICk7XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0b3RhbCBpZiBpdCBoYXMgZ3Jvd25cbiAgICAgICAgICAgIGlmIChuZXdUb3RhbCA+IHRvdGFsSXRlbXMpIHtcbiAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBVcGRhdGluZyBjdXJzb3IgdmlydHVhbCBzaXplIGZyb20gJHt0b3RhbEl0ZW1zfSB0byAke25ld1RvdGFsfWAsXG4gICAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgICAgIHRvdGFsSXRlbXMgPSBuZXdUb3RhbDtcbiAgICAgICAgICAgICAgc2V0VG90YWxJdGVtcyhuZXdUb3RhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZvciBvdGhlciBzdHJhdGVnaWVzLCB1c2UgZGlzY292ZXJlZCB0b3RhbCBvciBjdXJyZW50IHRvdGFsXG4gICAgICAgICAgICAvLyBVc2UgbnVsbGlzaCBjb2FsZXNjaW5nICg/PykgaW5zdGVhZCBvZiB8fCB0byBoYW5kbGUgZGlzY292ZXJlZFRvdGFsID0gMCBjb3JyZWN0bHlcbiAgICAgICAgICAgIG5ld1RvdGFsID0gZGlzY292ZXJlZFRvdGFsID8/IHRvdGFsSXRlbXM7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVXBkYXRlIHN0YXRlXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIEJlZm9yZSBzdGF0ZSB1cGRhdGU6IG5ld1RvdGFsPSR7bmV3VG90YWx9LCB0b3RhbEl0ZW1zPSR7dG90YWxJdGVtc30sIHdpbGwgdXBkYXRlOiAke25ld1RvdGFsICE9PSB0b3RhbEl0ZW1zfWAsXG4gICAgICAgICAgLy8gKTtcbiAgICAgICAgICBpZiAobmV3VG90YWwgIT09IHRvdGFsSXRlbXMpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGBbQ29sbGVjdGlvbl0gQ2FsbGluZyBzZXRUb3RhbEl0ZW1zKCR7bmV3VG90YWx9KWApO1xuICAgICAgICAgICAgdG90YWxJdGVtcyA9IG5ld1RvdGFsO1xuICAgICAgICAgICAgc2V0VG90YWxJdGVtcyhuZXdUb3RhbCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVXBkYXRlIGNvbXBvbmVudCBpdGVtcyByZWZlcmVuY2VcbiAgICAgICAgICBjb21wb25lbnQuaXRlbXMgPSBpdGVtcztcblxuICAgICAgICAgIC8vIEVtaXQgaXRlbXMgY2hhbmdlZCBldmVudFxuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDppdGVtcy1jaGFuZ2VkXCIsIHtcbiAgICAgICAgICAgIHRvdGFsSXRlbXM6IG5ld1RvdGFsLFxuICAgICAgICAgICAgbG9hZGVkQ291bnQ6IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbSAhPT0gdW5kZWZpbmVkKS5sZW5ndGgsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBVcGRhdGUgdmlld3BvcnQgc3RhdGVcbiAgICAgICAgICBjb25zdCB2aWV3cG9ydFN0YXRlID0gKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLnN0YXRlO1xuICAgICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgICAvLyBVc2UgbnVsbGlzaCBjb2FsZXNjaW5nICg/PykgaW5zdGVhZCBvZiB8fCB0byBoYW5kbGUgbmV3VG90YWwgPSAwIGNvcnJlY3RseVxuICAgICAgICAgICAgdmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zID0gbmV3VG90YWwgPz8gaXRlbXMubGVuZ3RoO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFZlcmlmeSBpdGVtcyBhcmUgYWN0dWFsbHkgc3RpbGwgaW4gdGhlIGFycmF5IGJlZm9yZSBtYXJraW5nIGFzIGxvYWRlZFxuICAgICAgICAgIC8vIFRoaXMgcHJldmVudHMgYSByYWNlIGNvbmRpdGlvbiB3aGVyZSBldmljdGlvbiBoYXBwZW5zIGR1cmluZyBhc3luYyBsb2FkOlxuICAgICAgICAgIC8vIDEuIExvYWQgc3RhcnRzIGZvciByYW5nZSBBXG4gICAgICAgICAgLy8gMi4gVXNlciBzY3JvbGxzIHRvIHJhbmdlIEJcbiAgICAgICAgICAvLyAzLiBFdmljdGlvbiByZW1vdmVzIGl0ZW1zIGZyb20gcmFuZ2UgQSBhbmQgcmVtb3ZlcyBmcm9tIGxvYWRlZFJhbmdlc1xuICAgICAgICAgIC8vIDQuIExvYWQgZm9yIHJhbmdlIEEgY29tcGxldGVzLCB3b3VsZCByZS1hZGQgdG8gbG9hZGVkUmFuZ2VzXG4gICAgICAgICAgLy8gNS4gVXNlciBzY3JvbGxzIGJhY2sgdG8gQSwgbG9hZGVkUmFuZ2VzIHNheXMgbG9hZGVkIGJ1dCBpdGVtcyBhcmUgZ29uZVxuICAgICAgICAgIGNvbnN0IGl0ZW1zQWN0dWFsbHlTdG9yZWQgPVxuICAgICAgICAgICAgdHJhbnNmb3JtZWRJdGVtcy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICB0cmFuc2Zvcm1lZEl0ZW1zLmV2ZXJ5KFxuICAgICAgICAgICAgICAoXywgaWR4KSA9PiBpdGVtc1tvZmZzZXQgKyBpZHhdICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKGl0ZW1zQWN0dWFsbHlTdG9yZWQpIHtcbiAgICAgICAgICAgIC8vIE1hcmsgYXMgbG9hZGVkIG9ubHkgaWYgaXRlbXMgYXJlIGFjdHVhbGx5IHByZXNlbnRcbiAgICAgICAgICAgIGxvYWRlZFJhbmdlcy5hZGQocmFuZ2VJZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEFsd2F5cyBjbGVhbiB1cCBwZW5kaW5nL2ZhaWxlZCBzdGF0ZVxuICAgICAgICAgIHBlbmRpbmdSYW5nZXMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICAgIGZhaWxlZFJhbmdlcy5kZWxldGUocmFuZ2VJZCk7XG5cbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gUmFuZ2UgJHtyYW5nZUlkfSBsb2FkZWQgc3VjY2Vzc2Z1bGx5IHdpdGggJHt0cmFuc2Zvcm1lZEl0ZW1zLmxlbmd0aH0gaXRlbXNgXG4gICAgICAgICAgLy8gKTtcblxuICAgICAgICAgIC8vIExvZyBtZW1vcnkgc3RhdHMgcGVyaW9kaWNhbGx5IChldmVyeSA1IGxvYWRzKVxuICAgICAgICAgIGlmIChjb21wbGV0ZWRMb2FkcyAlIDUgPT09IDApIHtcbiAgICAgICAgICAgIGxvZ01lbW9yeVN0YXRzKGBsb2FkOiR7Y29tcGxldGVkTG9hZHN9YCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRW1pdCBldmVudHNcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6cmFuZ2UtbG9hZGVkXCIsIHtcbiAgICAgICAgICAgIG9mZnNldCxcbiAgICAgICAgICAgIGxpbWl0LFxuICAgICAgICAgICAgaXRlbXM6IHRyYW5zZm9ybWVkSXRlbXMsXG4gICAgICAgICAgICB0b3RhbDogbmV3VG90YWwsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBFbWl0IGNvbGxlY3Rpb24gbG9hZGVkIGV2ZW50IHdpdGggbW9yZSBkZXRhaWxzXG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImNvbGxlY3Rpb246cmFuZ2UtbG9hZGVkXCIsIHtcbiAgICAgICAgICAgIG9mZnNldCxcbiAgICAgICAgICAgIGxpbWl0LFxuICAgICAgICAgICAgaXRlbXM6IHRyYW5zZm9ybWVkSXRlbXMsXG4gICAgICAgICAgICB0b3RhbDogbmV3VG90YWwsXG4gICAgICAgICAgICByYW5nZUlkLFxuICAgICAgICAgICAgaXRlbXNJbk1lbW9yeTogaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSB1bmRlZmluZWQpLmxlbmd0aCxcbiAgICAgICAgICAgIGN1cnNvcjogc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIgPyBjdXJyZW50Q3Vyc29yIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gVHJpZ2dlciB2aWV3cG9ydCB1cGRhdGVcbiAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQ/LnVwZGF0ZVZpZXdwb3J0Py4oKTtcblxuICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZEl0ZW1zO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIEhhbmRsZSBBYm9ydEVycm9yIGFuZCBcIkZhaWxlZCB0byBmZXRjaFwiICh3aGljaCBjYW4gb2NjdXIgb24gYWJvcnQpIGdyYWNlZnVsbHlcbiAgICAgICAgICBjb25zdCBpc0Fib3J0RXJyb3IgPVxuICAgICAgICAgICAgKGVycm9yIGFzIEVycm9yKS5uYW1lID09PSBcIkFib3J0RXJyb3JcIiB8fFxuICAgICAgICAgICAgKChlcnJvciBhcyBFcnJvcikubWVzc2FnZSA9PT0gXCJGYWlsZWQgdG8gZmV0Y2hcIiAmJlxuICAgICAgICAgICAgICBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpO1xuXG4gICAgICAgICAgaWYgKGlzQWJvcnRFcnJvcikge1xuICAgICAgICAgICAgcGVuZGluZ1Jhbmdlcy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgICAgICBjYW5jZWxsZWRMb2FkcysrO1xuICAgICAgICAgICAgLy8gRG9uJ3QgdGhyb3csIGp1c3QgcmV0dXJuIGVtcHR5IGFycmF5XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSGFuZGxlIG90aGVyIGVycm9yc1xuICAgICAgICAgIHBlbmRpbmdSYW5nZXMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICAgIGZhaWxlZExvYWRzKys7XG5cbiAgICAgICAgICBjb25zdCBhdHRlbXB0cyA9IChmYWlsZWRSYW5nZXMuZ2V0KHJhbmdlSWQpPy5hdHRlbXB0cyB8fCAwKSArIDE7XG4gICAgICAgICAgZmFpbGVkUmFuZ2VzLnNldChyYW5nZUlkLCB7XG4gICAgICAgICAgICBhdHRlbXB0cyxcbiAgICAgICAgICAgIGxhc3RFcnJvcjogZXJyb3IgYXMgRXJyb3IsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBFbWl0IGVycm9yIGV2ZW50XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnJhbmdlLWVycm9yXCIsIHtcbiAgICAgICAgICAgIG9mZnNldCxcbiAgICAgICAgICAgIGxpbWl0LFxuICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICBhdHRlbXB0cyxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGFjdGl2ZVJlcXVlc3RzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgICBhYm9ydENvbnRyb2xsZXJzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcblxuICAgICAgYWN0aXZlUmVxdWVzdHMuc2V0KHJhbmdlSWQsIHJlcXVlc3RQcm9taXNlKTtcbiAgICAgIHJldHVybiByZXF1ZXN0UHJvbWlzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogTG9hZCBtaXNzaW5nIHJhbmdlcyBmcm9tIGNvbGxlY3Rpb25cbiAgICAgKi9cbiAgICBjb25zdCBsb2FkTWlzc2luZ1Jhbmdlc0ludGVybmFsID0gYXN5bmMgKFxuICAgICAgcmFuZ2U6IHtcbiAgICAgICAgc3RhcnQ6IG51bWJlcjtcbiAgICAgICAgZW5kOiBudW1iZXI7XG4gICAgICB9LFxuICAgICAgY2FsbGVyPzogc3RyaW5nLFxuICAgICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgaWYgKCFjb2xsZWN0aW9uKSByZXR1cm47XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIGxvYWRNaXNzaW5nUmFuZ2VzSW50ZXJuYWwgLSByYW5nZTogJHtzdGFydH0tJHtlbmR9LCBzdHJhdGVneTogJHtzdHJhdGVneX1gLFxuICAgICAgLy8gKTtcblxuICAgICAgLy8gRm9yIGN1cnNvciBwYWdpbmF0aW9uLCB3ZSBuZWVkIHRvIGxvYWQgc2VxdWVudGlhbGx5XG4gICAgICBpZiAoc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRQYWdlID0gTWF0aC5mbG9vcihyYW5nZS5zdGFydCAvIHJhbmdlU2l6ZSkgKyAxO1xuICAgICAgICBjb25zdCBlbmRQYWdlID0gTWF0aC5mbG9vcihyYW5nZS5lbmQgLyByYW5nZVNpemUpICsgMTtcblxuICAgICAgICAvLyBMaW1pdCBob3cgbWFueSBwYWdlcyB3ZSdsbCBsb2FkIGF0IG9uY2VcbiAgICAgICAgY29uc3QgbWF4UGFnZXNUb0xvYWQgPSAxMDtcbiAgICAgICAgY29uc3QgY3VycmVudEhpZ2hlc3RQYWdlID0gaGlnaGVzdExvYWRlZFBhZ2UgfHwgMDtcbiAgICAgICAgY29uc3QgbGltaXRlZEVuZFBhZ2UgPSBNYXRoLm1pbihcbiAgICAgICAgICBlbmRQYWdlLFxuICAgICAgICAgIGN1cnJlbnRIaWdoZXN0UGFnZSArIG1heFBhZ2VzVG9Mb2FkLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gQ3Vyc29yIG1vZGU6IG5lZWQgdG8gbG9hZCBwYWdlcyAke3N0YXJ0UGFnZX0gdG8gJHtlbmRQYWdlfSwgbGltaXRlZCB0byAke2xpbWl0ZWRFbmRQYWdlfWAsXG4gICAgICAgIC8vICk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byBsb2FkIHBhZ2VzIHNlcXVlbnRpYWxseVxuICAgICAgICBmb3IgKGxldCBwYWdlID0gc3RhcnRQYWdlOyBwYWdlIDw9IGxpbWl0ZWRFbmRQYWdlOyBwYWdlKyspIHtcbiAgICAgICAgICBjb25zdCByYW5nZUlkID0gcGFnZSAtIDE7IC8vIENvbnZlcnQgdG8gMC1iYXNlZCByYW5nZUlkXG4gICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gcmFuZ2VJZCAqIHJhbmdlU2l6ZTtcblxuICAgICAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBiZWluZyBsb2FkZWRcbiAgICAgICAgICBpZiAocGVuZGluZ1Jhbmdlcy5oYXMocmFuZ2VJZCkpIHtcbiAgICAgICAgICAgIC8vIFJhbmdlIGFscmVhZHkgYmVpbmcgbG9hZGVkXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFsb2FkZWRSYW5nZXMuaGFzKHJhbmdlSWQpICYmICFwZW5kaW5nUmFuZ2VzLmhhcyhyYW5nZUlkKSkge1xuICAgICAgICAgICAgLy8gRm9yIGN1cnNvciBwYWdpbmF0aW9uLCB3ZSBtdXN0IGxvYWQgc2VxdWVudGlhbGx5XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGFsbCBwcmV2aW91cyBwYWdlcyBsb2FkZWRcbiAgICAgICAgICAgIGlmIChwYWdlID4gMSkge1xuICAgICAgICAgICAgICBsZXQgY2FuTG9hZCA9IHRydWU7XG4gICAgICAgICAgICAgIGZvciAobGV0IHByZXZQYWdlID0gMTsgcHJldlBhZ2UgPCBwYWdlOyBwcmV2UGFnZSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldlJhbmdlSWQgPSBwcmV2UGFnZSAtIDE7XG4gICAgICAgICAgICAgICAgaWYgKCFsb2FkZWRSYW5nZXMuaGFzKHByZXZSYW5nZUlkKSkge1xuICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gQ2Fubm90IGxvYWQgcGFnZSAke3BhZ2V9IC0gbmVlZCB0byBsb2FkIHBhZ2UgJHtwcmV2UGFnZX0gZmlyc3RgLFxuICAgICAgICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgICAgICAgIGNhbkxvYWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGxvYWQgdGhlIG1pc3NpbmcgcGFnZVxuICAgICAgICAgICAgICAgICAgaWYgKCFwZW5kaW5nUmFuZ2VzLmhhcyhwcmV2UmFuZ2VJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBsb2FkUmFuZ2UocHJldlJhbmdlSWQgKiByYW5nZVNpemUsIHJhbmdlU2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGBbQ29sbGVjdGlvbl0gRmFpbGVkIHRvIGxvYWQgcHJlcmVxdWlzaXRlIHBhZ2UgJHtwcmV2UGFnZX06YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBTdG9wIHRyeWluZyB0byBsb2FkIGZ1cnRoZXIgcGFnZXNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKCFjYW5Mb2FkKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7IC8vIFNraXAgdGhpcyBwYWdlIGZvciBub3dcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCBsb2FkUmFuZ2Uob2Zmc2V0LCByYW5nZVNpemUpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgW0NvbGxlY3Rpb25dIEZhaWxlZCB0byBsb2FkIHBhZ2UgJHtwYWdlfTpgLCBlcnJvcik7XG4gICAgICAgICAgICAgIGJyZWFrOyAvLyBTdG9wIHNlcXVlbnRpYWwgbG9hZGluZyBvbiBlcnJvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmRQYWdlID4gbGltaXRlZEVuZFBhZ2UpIHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gU3RvcHBlZCBhdCBwYWdlICR7bGltaXRlZEVuZFBhZ2V9IHRvIHByZXZlbnQgZXhjZXNzaXZlIGxvYWRpbmcgKHJlcXVlc3RlZCB1cCB0byAke2VuZFBhZ2V9KWAsXG4gICAgICAgICAgLy8gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gT3JpZ2luYWwgbG9naWMgZm9yIG9mZnNldC9wYWdlIHN0cmF0ZWdpZXNcbiAgICAgIC8vIENhbGN1bGF0ZSByYW5nZSBib3VuZGFyaWVzXG4gICAgICBjb25zdCBzdGFydFJhbmdlID0gTWF0aC5mbG9vcihyYW5nZS5zdGFydCAvIHJhbmdlU2l6ZSk7XG4gICAgICBjb25zdCBlbmRSYW5nZSA9IE1hdGguZmxvb3IocmFuZ2UuZW5kIC8gcmFuZ2VTaXplKTtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gcGFnZSBzdHJhdGVneSAtIHN0YXJ0UmFuZ2U6ICR7c3RhcnRSYW5nZX0sIGVuZFJhbmdlOiAke2VuZFJhbmdlfSwgbG9hZGVkUmFuZ2VzOiBbJHtBcnJheS5mcm9tKGxvYWRlZFJhbmdlcykuam9pbihcIiwgXCIpfV1gLFxuICAgICAgLy8gKTtcblxuICAgICAgLy8gQ29sbGVjdCByYW5nZXMgdGhhdCBuZWVkIGxvYWRpbmdcbiAgICAgIGNvbnN0IHJhbmdlc1RvTG9hZDogbnVtYmVyW10gPSBbXTtcbiAgICAgIGZvciAobGV0IHJhbmdlSWQgPSBzdGFydFJhbmdlOyByYW5nZUlkIDw9IGVuZFJhbmdlOyByYW5nZUlkKyspIHtcbiAgICAgICAgaWYgKCFsb2FkZWRSYW5nZXMuaGFzKHJhbmdlSWQpICYmICFwZW5kaW5nUmFuZ2VzLmhhcyhyYW5nZUlkKSkge1xuICAgICAgICAgIHJhbmdlc1RvTG9hZC5wdXNoKHJhbmdlSWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChyYW5nZXNUb0xvYWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIEFsbCByYW5nZXMgYXJlIGFscmVhZHkgbG9hZGVkIG9yIHBlbmRpbmdcbiAgICAgICAgLy8gQnV0IHZlcmlmeSB0aGUgZGF0YSBhY3R1YWxseSBleGlzdHMgaW4gaXRlbXMgYXJyYXkgKGRlZmVuc2l2ZSBjaGVjaylcbiAgICAgICAgZm9yIChsZXQgcmFuZ2VJZCA9IHN0YXJ0UmFuZ2U7IHJhbmdlSWQgPD0gZW5kUmFuZ2U7IHJhbmdlSWQrKykge1xuICAgICAgICAgIGlmIChsb2FkZWRSYW5nZXMuaGFzKHJhbmdlSWQpKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIHJhbmdlIGFjdHVhbGx5IGhhcyBkYXRhXG4gICAgICAgICAgICBjb25zdCByYW5nZVN0YXJ0ID0gcmFuZ2VJZCAqIHJhbmdlU2l6ZTtcbiAgICAgICAgICAgIGNvbnN0IGhhc0RhdGEgPSBpdGVtc1xuICAgICAgICAgICAgICAuc2xpY2UocmFuZ2VTdGFydCwgcmFuZ2VTdGFydCArIHJhbmdlU2l6ZSlcbiAgICAgICAgICAgICAgLnNvbWUoKGl0ZW0pID0+IGl0ZW0gIT09IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICBpZiAoIWhhc0RhdGEpIHtcbiAgICAgICAgICAgICAgLy8gUmFuZ2UgbWFya2VkIGxvYWRlZCBidXQgbm8gZGF0YSAtIGZvcmNlIHJlbG9hZFxuICAgICAgICAgICAgICBsb2FkZWRSYW5nZXMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICAgICAgICByYW5nZXNUb0xvYWQucHVzaChyYW5nZUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIHF1ZXVlZCByZXF1ZXN0cyB3ZSBzaG91bGQgcHJvY2Vzc1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcmFuZ2VzVG9Mb2FkLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIGFjdGl2ZUxvYWRDb3VudCA8IG1heENvbmN1cnJlbnRSZXF1ZXN0c1xuICAgICAgICApIHtcbiAgICAgICAgICBwcm9jZXNzUXVldWUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmFuZ2VzVG9Mb2FkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBMb2FkaW5nICR7cmFuZ2VzVG9Mb2FkLmxlbmd0aH0gcmFuZ2VzOiBbJHtyYW5nZXNUb0xvYWQuam9pbihcIiwgXCIpfV1gLFxuICAgICAgLy8gKTtcblxuICAgICAgLy8gTG9hZCByYW5nZXMgaW5kaXZpZHVhbGx5IC0gbm8gbWVyZ2luZyB0byBhdm9pZCBsb2FkaW5nIG9sZCByYW5nZXNcbiAgICAgIGNvbnN0IHByb21pc2VzID0gcmFuZ2VzVG9Mb2FkLm1hcCgocmFuZ2VJZCkgPT5cbiAgICAgICAgbG9hZFJhbmdlKHJhbmdlSWQgKiByYW5nZVNpemUsIHJhbmdlU2l6ZSksXG4gICAgICApO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHByb21pc2VzKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVmVsb2NpdHktYXdhcmUgd3JhcHBlciBmb3IgbG9hZE1pc3NpbmdSYW5nZXNcbiAgICAgKi9cbiAgICBjb25zdCBsb2FkTWlzc2luZ1JhbmdlcyA9IChcbiAgICAgIHJhbmdlOiB7XG4gICAgICAgIHN0YXJ0OiBudW1iZXI7XG4gICAgICAgIGVuZDogbnVtYmVyO1xuICAgICAgfSxcbiAgICAgIGNhbGxlcj86IHN0cmluZyxcbiAgICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJhbmdlS2V5ID0gZ2V0UmFuZ2VLZXkocmFuZ2UpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGFscmVhZHkgbG9hZGluZ1xuICAgICAgICBpZiAoYWN0aXZlTG9hZFJhbmdlcy5oYXMocmFuZ2VLZXkpKSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNraXAgaWYgZHJhZ2dpbmcgd2l0aCBsb3cgdmVsb2NpdHkgKGJ1dCBub3QgaWYgd2UncmUgaWRsZSlcbiAgICAgICAgaWYgKGlzRHJhZ2dpbmcgJiYgY3VycmVudFZlbG9jaXR5IDwgMC41ICYmIGN1cnJlbnRWZWxvY2l0eSA+IDApIHtcbiAgICAgICAgICBjYW5jZWxsZWRMb2FkcysrO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayB2ZWxvY2l0eSAtIGlmIHRvbyBoaWdoLCBjYW5jZWwgdGhlIHJlcXVlc3QgZW50aXJlbHlcbiAgICAgICAgaWYgKCFjYW5Mb2FkKCkpIHtcbiAgICAgICAgICBjYW5jZWxsZWRMb2FkcysrO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBjYXBhY2l0eVxuICAgICAgICBpZiAoYWN0aXZlTG9hZENvdW50IDwgbWF4Q29uY3VycmVudFJlcXVlc3RzKSB7XG4gICAgICAgICAgLy8gRXhlY3V0ZSBpbW1lZGlhdGVseVxuICAgICAgICAgIGV4ZWN1dGVRdWV1ZWRMb2FkKHtcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgcHJpb3JpdHk6IFwibm9ybWFsXCIsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgICAgY2FsbGVyLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGVuYWJsZVJlcXVlc3RRdWV1ZSAmJlxuICAgICAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoIDwgbWF4UXVldWVTaXplXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIFF1ZXVlIHRoZSByZXF1ZXN0XG4gICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgcHJpb3JpdHk6IFwibm9ybWFsXCIsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgICAgY2FsbGVyLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtMb2FkaW5nTWFuYWdlcl0gUXVldWVkIHJlcXVlc3QgKGF0IGNhcGFjaXR5KSwgcXVldWUgc2l6ZTogJHtsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aH1gXG4gICAgICAgICAgLy8gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBRdWV1ZSBpcyBmdWxsIC0gYnV0IGRvbid0IGRyb3AgaWRsZS9yYW5nZS1jaGFuZ2VkIHJlcXVlc3RzLCB0aGV5J3JlIGNyaXRpY2FsIVxuICAgICAgICAgIC8vIEluc3RlYWQsIGNsZWFyIG9sZCBxdWV1ZWQgcmVxdWVzdHMgYW5kIGFkZCB0aGUgbmV3IG9uZVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGNhbGxlciA9PT0gXCJ2aWV3cG9ydDppZGxlXCIgfHxcbiAgICAgICAgICAgIGNhbGxlciA9PT0gXCJ2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkXCJcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIENsZWFyIG9sZCBxdWV1ZWQgcmVxdWVzdHMgLSB0aGV5J3JlIGZvciByYW5nZXMgdXNlciBzY3JvbGxlZCBwYXN0XG4gICAgICAgICAgICBsb2FkUmVxdWVzdFF1ZXVlLmZvckVhY2goKHIpID0+IHtcbiAgICAgICAgICAgICAgY2FuY2VsbGVkTG9hZHMrKztcbiAgICAgICAgICAgICAgci5yZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoID0gMDtcbiAgICAgICAgICAgIC8vIFF1ZXVlIHRoaXMgcHJpb3JpdHkgcmVxdWVzdFxuICAgICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICAgIHByaW9yaXR5OiBcImhpZ2hcIixcbiAgICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgICAgIGNhbGxlcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBRdWV1ZSBvdmVyZmxvdyAtIHJlc29sdmUgdG8gYXZvaWQgZXJyb3JzXG4gICAgICAgICAgICBpZiAobG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggPj0gbWF4UXVldWVTaXplKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlbW92ZWQgPSBsb2FkUmVxdWVzdFF1ZXVlLnNwbGljZShcbiAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoIC0gbWF4UXVldWVTaXplLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZW1vdmVkLmZvckVhY2goKHIpID0+IHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsZWRMb2FkcysrO1xuICAgICAgICAgICAgICAgIHIucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXRyeSBhIGZhaWxlZCByYW5nZVxuICAgICAqL1xuICAgIGNvbnN0IHJldHJ5RmFpbGVkUmFuZ2UgPSBhc3luYyAocmFuZ2VJZDogbnVtYmVyKTogUHJvbWlzZTxhbnlbXT4gPT4ge1xuICAgICAgZmFpbGVkUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgIGNvbnN0IG9mZnNldCA9IHJhbmdlSWQgKiByYW5nZVNpemU7XG4gICAgICByZXR1cm4gbG9hZFJhbmdlKG9mZnNldCwgcmFuZ2VTaXplKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0IHRvdGFsIGl0ZW1zIGNvdW50XG4gICAgICovXG4gICAgY29uc3Qgc2V0VG90YWxJdGVtcyA9ICh0b3RhbDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICB0b3RhbEl0ZW1zID0gdG90YWw7XG5cbiAgICAgIC8vIFVwZGF0ZSB2aWV3cG9ydCBzdGF0ZSdzIHRvdGFsIGl0ZW1zXG4gICAgICBjb25zdCB2aWV3cG9ydFN0YXRlID0gKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLnN0YXRlO1xuICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zID0gdG90YWw7XG4gICAgICB9XG5cbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDp0b3RhbC1pdGVtcy1jaGFuZ2VkXCIsIHsgdG90YWwgfSk7XG4gICAgfTtcblxuICAgIC8vIEhvb2sgaW50byB2aWV3cG9ydCBpbml0aWFsaXphdGlvblxuICAgIGNvbnN0IG9yaWdpbmFsSW5pdGlhbGl6ZSA9IGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplO1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplID0gKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gb3JpZ2luYWxJbml0aWFsaXplKCk7XG4gICAgICAvLyBTa2lwIGlmIGFscmVhZHkgaW5pdGlhbGl6ZWRcbiAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IGluaXRpYWwgdG90YWwgaWYgcHJvdmlkZWRcbiAgICAgIGlmIChjb21wb25lbnQudG90YWxJdGVtcykge1xuICAgICAgICB0b3RhbEl0ZW1zID0gY29tcG9uZW50LnRvdGFsSXRlbXM7XG4gICAgICB9XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgZHJhZyBldmVudHNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6ZHJhZy1zdGFydFwiLCAoKSA9PiB7XG4gICAgICAgIGlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6ZHJhZy1lbmRcIiwgKCkgPT4ge1xuICAgICAgICBpc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgIC8vIFByb2Nlc3MgYW55IHF1ZXVlZCByZXF1ZXN0cyBhZnRlciBkcmFnIGVuZHMgKHNhZmV0eSBtZWFzdXJlKVxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgcGxhY2Vob2xkZXJzIGFyZSByZXBsYWNlZCBldmVuIGlmIGlkbGUgZGV0ZWN0aW9uIGZhaWxzXG4gICAgICAgIGlmIChsb2FkT25EcmFnRW5kKSB7XG4gICAgICAgICAgcHJvY2Vzc1F1ZXVlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIHJhbmdlIGNoYW5nZXNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6cmFuZ2UtY2hhbmdlZFwiLCBhc3luYyAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIC8vIERvbid0IGxvYWQgZHVyaW5nIGZhc3Qgc2Nyb2xsaW5nIC0gbG9hZE1pc3NpbmdSYW5nZXMgd2lsbCBoYW5kbGUgdmVsb2NpdHkgY2hlY2tcblxuICAgICAgICAvLyBFeHRyYWN0IHJhbmdlIGZyb20gZXZlbnQgZGF0YSAtIHZpcnR1YWwgZmVhdHVyZSBlbWl0cyB7IHJhbmdlOiB7IHN0YXJ0LCBlbmQgfSwgc2Nyb2xsUG9zaXRpb24gfVxuICAgICAgICBjb25zdCByYW5nZSA9IGRhdGEucmFuZ2UgfHwgZGF0YTtcbiAgICAgICAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSByYW5nZTtcblxuICAgICAgICAvLyBWYWxpZGF0ZSByYW5nZSBiZWZvcmUgbG9hZGluZ1xuICAgICAgICBpZiAodHlwZW9mIHN0YXJ0ICE9PSBcIm51bWJlclwiIHx8IHR5cGVvZiBlbmQgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBcIltDb2xsZWN0aW9uXSBJbnZhbGlkIHJhbmdlIGluIHZpZXdwb3J0OnJhbmdlLWNoYW5nZWQgZXZlbnQ6XCIsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCBsb2FkaW5nIHBhZ2UgMSBpZiB3ZSBoYXZlIGFuIGluaXRpYWxTY3JvbGxJbmRleCBhbmQgaGF2ZW4ndCBjb21wbGV0ZWQgaW5pdGlhbCBsb2FkIHlldFxuICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHRoZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgaW4gdmlydHVhbC50cyBmcm9tIHRyaWdnZXJpbmcgYSBwYWdlIDEgbG9hZFxuICAgICAgICAvLyBhZnRlciB3ZSd2ZSBhbHJlYWR5IHN0YXJ0ZWQgbG9hZGluZyB0aGUgY29ycmVjdCBpbml0aWFsIHBhZ2VcbiAgICAgICAgaWYgKGhhc0luaXRpYWxTY3JvbGxJbmRleCAmJiAhaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCkge1xuICAgICAgICAgIGNvbnN0IHBhZ2UxRW5kSW5kZXggPSByYW5nZVNpemUgLSAxOyAvLyBlLmcuLCAyOSBmb3IgcmFuZ2VTaXplPTMwXG4gICAgICAgICAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA8PSBwYWdlMUVuZEluZGV4KSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEgcmVxdWVzdCBmb3IgcGFnZSAxLCBza2lwIGl0XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG9hZCBtaXNzaW5nIHJhbmdlcyBpZiBuZWVkZWRcbiAgICAgICAgYXdhaXQgbG9hZE1pc3NpbmdSYW5nZXMoeyBzdGFydCwgZW5kIH0sIFwidmlld3BvcnQ6cmFuZ2UtY2hhbmdlZFwiKTtcblxuICAgICAgICAvLyBFdmljdCBkaXN0YW50IGl0ZW1zIHRvIHByZXZlbnQgbWVtb3J5IGJsb2F0XG4gICAgICAgIGV2aWN0RGlzdGFudEl0ZW1zKHN0YXJ0LCBlbmQpO1xuXG4gICAgICAgIC8vIEZvciBjdXJzb3IgbW9kZSwgY2hlY2sgaWYgd2UgbmVlZCB0byB1cGRhdGUgdmlydHVhbCBzaXplXG4gICAgICAgIGlmIChzdHJhdGVneSA9PT0gXCJjdXJzb3JcIiAmJiAhaGFzUmVhY2hlZEVuZCkge1xuICAgICAgICAgIGNvbnN0IGxvYWRlZEl0ZW1zQ291bnQgPSBpdGVtcy5maWx0ZXIoXG4gICAgICAgICAgICAoaXRlbSkgPT4gaXRlbSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICkubGVuZ3RoO1xuICAgICAgICAgIGNvbnN0IG1hcmdpbkl0ZW1zID1cbiAgICAgICAgICAgIHJhbmdlU2l6ZSAqXG4gICAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUEFHSU5BVElPTi5DVVJTT1JfU0NST0xMX01BUkdJTl9NVUxUSVBMSUVSO1xuICAgICAgICAgIGNvbnN0IG1pblZpcnR1YWxJdGVtcyA9XG4gICAgICAgICAgICByYW5nZVNpemUgKlxuICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlBBR0lOQVRJT04uQ1VSU09SX01JTl9WSVJUVUFMX1NJWkVfTVVMVElQTElFUjtcbiAgICAgICAgICBjb25zdCBkeW5hbWljVG90YWwgPSBNYXRoLm1heChcbiAgICAgICAgICAgIGxvYWRlZEl0ZW1zQ291bnQgKyBtYXJnaW5JdGVtcyxcbiAgICAgICAgICAgIG1pblZpcnR1YWxJdGVtcyxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKGR5bmFtaWNUb3RhbCAhPT0gdG90YWxJdGVtcykge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gVXBkYXRpbmcgY3Vyc29yIHZpcnR1YWwgc2l6ZSBmcm9tICR7dG90YWxJdGVtc30gdG8gJHtkeW5hbWljVG90YWx9YCxcbiAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgICBzZXRUb3RhbEl0ZW1zKGR5bmFtaWNUb3RhbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciB2ZWxvY2l0eSBjaGFuZ2VzXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnZlbG9jaXR5LWNoYW5nZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZlbG9jaXR5ID0gY3VycmVudFZlbG9jaXR5O1xuICAgICAgICBjdXJyZW50VmVsb2NpdHkgPSBNYXRoLmFicyhkYXRhLnZlbG9jaXR5IHx8IDApO1xuXG4gICAgICAgIC8vIFdoZW4gdmVsb2NpdHkgZHJvcHMgYmVsb3cgdGhyZXNob2xkLCBwcm9jZXNzIHF1ZXVlXG4gICAgICAgIGlmIChcbiAgICAgICAgICBwcmV2aW91c1ZlbG9jaXR5ID4gY2FuY2VsTG9hZFRocmVzaG9sZCAmJlxuICAgICAgICAgIGN1cnJlbnRWZWxvY2l0eSA8PSBjYW5jZWxMb2FkVGhyZXNob2xkXG4gICAgICAgICkge1xuICAgICAgICAgIHByb2Nlc3NRdWV1ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBpZGxlIHN0YXRlIHRvIHByb2Nlc3MgcXVldWVcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6aWRsZVwiLCBhc3luYyAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGN1cnJlbnRWZWxvY2l0eSA9IDA7XG5cbiAgICAgICAgLy8gUmVzZXQgZHJhZ2dpbmcgc3RhdGUgb24gaWRsZSBzaW5jZSB1c2VyIGhhcyBzdG9wcGVkIG1vdmluZ1xuICAgICAgICBpZiAoaXNEcmFnZ2luZykge1xuICAgICAgICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBjdXJyZW50IHZpc2libGUgcmFuZ2UgZnJvbSB2aWV3cG9ydFxuICAgICAgICBjb25zdCB2aWV3cG9ydFN0YXRlID0gKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLnN0YXRlO1xuICAgICAgICBjb25zdCB2aXNpYmxlUmFuZ2UgPSB2aWV3cG9ydFN0YXRlPy52aXNpYmxlUmFuZ2U7XG5cbiAgICAgICAgaWYgKHZpc2libGVSYW5nZSkge1xuICAgICAgICAgIC8vIENsZWFyIHN0YWxlIHJlcXVlc3RzIGZyb20gcXVldWUgdGhhdCBhcmUgZmFyIGZyb20gY3VycmVudCB2aXNpYmxlIHJhbmdlXG4gICAgICAgICAgY29uc3QgYnVmZmVyID0gcmFuZ2VTaXplICogMjsgLy8gQWxsb3cgc29tZSBidWZmZXJcbiAgICAgICAgICBsb2FkUmVxdWVzdFF1ZXVlID0gbG9hZFJlcXVlc3RRdWV1ZS5maWx0ZXIoKHJlcXVlc3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RFbmQgPSByZXF1ZXN0LnJhbmdlLmVuZDtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RTdGFydCA9IHJlcXVlc3QucmFuZ2Uuc3RhcnQ7XG4gICAgICAgICAgICBjb25zdCBpc1JlbGV2YW50ID1cbiAgICAgICAgICAgICAgcmVxdWVzdEVuZCA+PSB2aXNpYmxlUmFuZ2Uuc3RhcnQgLSBidWZmZXIgJiZcbiAgICAgICAgICAgICAgcmVxdWVzdFN0YXJ0IDw9IHZpc2libGVSYW5nZS5lbmQgKyBidWZmZXI7XG5cbiAgICAgICAgICAgIGlmICghaXNSZWxldmFudCkge1xuICAgICAgICAgICAgICByZXF1ZXN0LnJlc29sdmUoKTsgLy8gUmVzb2x2ZSB0byBhdm9pZCBoYW5naW5nIHByb21pc2VzXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXNSZWxldmFudDtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIExvYWQgdGhlIGN1cnJlbnQgdmlzaWJsZSByYW5nZSBpZiBuZWVkZWRcbiAgICAgICAgICBhd2FpdCBsb2FkTWlzc2luZ1Jhbmdlcyh2aXNpYmxlUmFuZ2UsIFwidmlld3BvcnQ6aWRsZVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsc28gcHJvY2VzcyBhbnkgcXVldWVkIHJlcXVlc3RzXG4gICAgICAgIHByb2Nlc3NRdWV1ZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgaXRlbSByZW1vdmFsIC0gRE9OJ1QgY2xlYXIgbG9hZGVkUmFuZ2VzIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmVsb2FkXG4gICAgICAvLyBUaGUgZGF0YSBpcyBhbHJlYWR5IHNoaWZ0ZWQgbG9jYWxseSBpbiBhcGkudHMgYW5kIHJlbmRlcmluZy50c1xuICAgICAgLy8gUmVsb2FkaW5nIHdvdWxkIGNhdXNlIHJhY2UgY29uZGl0aW9ucyBhbmQgb3ZlcndyaXRlIHRoZSBjb3JyZWN0IHRvdGFsSXRlbXNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiaXRlbTpyZW1vdmVkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtDb2xsZWN0aW9uXSBpdGVtOnJlbW92ZWQgZXZlbnQgLSBpbmRleDogJHtkYXRhLmluZGV4fWApO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW0NvbGxlY3Rpb25dIGl0ZW1zLmxlbmd0aDogJHtpdGVtcy5sZW5ndGh9YCk7XG5cbiAgICAgICAgLy8gVXBkYXRlIGRpc2NvdmVyZWRUb3RhbCB0byBtYXRjaCB0aGUgbmV3IGNvdW50XG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgc3RhbGUgZGlzY292ZXJlZFRvdGFsIGZyb20gYmVpbmcgdXNlZCBvbiBuZXh0IGxvYWRcbiAgICAgICAgaWYgKGRpc2NvdmVyZWRUb3RhbCAhPT0gbnVsbCAmJiBkaXNjb3ZlcmVkVG90YWwgPiAwKSB7XG4gICAgICAgICAgZGlzY292ZXJlZFRvdGFsID0gZGlzY292ZXJlZFRvdGFsIC0gMTtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gVXBkYXRlZCBkaXNjb3ZlcmVkVG90YWwgdG86ICR7ZGlzY292ZXJlZFRvdGFsfWAsXG4gICAgICAgICAgLy8gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5PVEU6IERvIE5PVCBkZWNyZW1lbnQgdG90YWxJdGVtcyBoZXJlIVxuICAgICAgICAvLyBhcGkudHMgYWxyZWFkeSBjYWxscyBzZXRUb3RhbEl0ZW1zKCkgYWZ0ZXIgZW1pdHRpbmcgaXRlbTpyZW1vdmUtcmVxdWVzdCxcbiAgICAgICAgLy8gd2hpY2ggcHJvcGVybHkgdXBkYXRlcyB0b3RhbEl0ZW1zLiBEZWNyZW1lbnRpbmcgaGVyZSB3b3VsZCBjYXVzZSBhIGRvdWJsZS1kZWNyZW1lbnQuXG5cbiAgICAgICAgLy8gRE9OJ1QgY2xlYXIgbG9hZGVkUmFuZ2VzIC0gd2Ugd2FudCB0byBrZWVwIHVzaW5nIHRoZSBsb2NhbCBkYXRhXG4gICAgICAgIC8vIFRoZSBkYXRhIGhhcyBiZWVuIHNoaWZ0ZWQgbG9jYWxseSBhbmQgaXMgc3RpbGwgdmFsaWRcbiAgICAgICAgLy8gQ2xlYXJpbmcgd291bGQgdHJpZ2dlciBhIHJlbG9hZCB3aGljaCBjYXVzZXMgcmFjZSBjb25kaXRpb25zXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gS2VlcGluZyBsb2FkZWRSYW5nZXMgaW50YWN0OmAsXG4gICAgICAgIC8vICAgQXJyYXkuZnJvbShsb2FkZWRSYW5nZXMpLFxuICAgICAgICAvLyApO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExvYWQgaW5pdGlhbCBkYXRhIGlmIGNvbGxlY3Rpb24gaXMgYXZhaWxhYmxlIGFuZCBhdXRvTG9hZCBpcyBlbmFibGVkXG4gICAgICBpZiAoY29sbGVjdGlvbiAmJiBhdXRvTG9hZCkge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIGFuIGluaXRpYWwgc2Nyb2xsIGluZGV4IE9SIGEgc2VsZWN0SWQsIGxvYWQgZGF0YSBmb3IgdGhhdCBwb3NpdGlvbiBkaXJlY3RseVxuICAgICAgICAvLyBEb24ndCB1c2Ugc2Nyb2xsVG9JbmRleCgpIGFzIGl0IHRyaWdnZXJzIGFuaW1hdGlvbi92ZWxvY2l0eSB0cmFja2luZ1xuICAgICAgICAvLyB2aXJ0dWFsLnRzIGhhcyBhbHJlYWR5IHNldCB0aGUgc2Nyb2xsIHBvc2l0aW9uIGFuZCBjYWxjdWxhdGVkIHRoZSB2aXNpYmxlIHJhbmdlXG4gICAgICAgIGlmIChcbiAgICAgICAgICBpbml0aWFsU2Nyb2xsSW5kZXggPiAwIHx8XG4gICAgICAgICAgKHNlbGVjdElkICE9PSB1bmRlZmluZWQgJiYgc2VsZWN0SWQgIT09IG51bGwpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIEdldCB0aGUgdmlzaWJsZSByYW5nZSB0aGF0IHdhcyBhbHJlYWR5IGNhbGN1bGF0ZWQgYnkgdmlydHVhbC50c1xuICAgICAgICAgIC8vIFdlIG1pc3NlZCB0aGUgaW5pdGlhbCB2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkIGV2ZW50IGJlY2F1c2Ugb3VyIGxpc3RlbmVyIHdhc24ndCByZWFkeSB5ZXRcbiAgICAgICAgICBjb25zdCB2aXNpYmxlUmFuZ2UgPSBjb21wb25lbnQudmlld3BvcnQ/LmdldFZpc2libGVSYW5nZT8uKCk7XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB2aXNpYmxlUmFuZ2UgJiZcbiAgICAgICAgICAgICh2aXNpYmxlUmFuZ2Uuc3RhcnQgPiAwIHx8IHZpc2libGVSYW5nZS5lbmQgPiAwKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gVXNlIHRoZSBwcmUtY2FsY3VsYXRlZCB2aXNpYmxlIHJhbmdlIGZyb20gdmlydHVhbC50c1xuICAgICAgICAgICAgbG9hZE1pc3NpbmdSYW5nZXModmlzaWJsZVJhbmdlLCBcImluaXRpYWwtcG9zaXRpb25cIilcbiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vIEVtaXQgZXZlbnQgdG8gc2VsZWN0IGl0ZW0gYWZ0ZXIgaW5pdGlhbCBsb2FkIGlmIHNlbGVjdElkIGlzIHByb3ZpZGVkXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJjb2xsZWN0aW9uOmluaXRpYWwtbG9hZC1jb21wbGV0ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdElkLFxuICAgICAgICAgICAgICAgICAgICBpbml0aWFsU2Nyb2xsSW5kZXgsXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgXCJbQ29sbGVjdGlvbl0gRmFpbGVkIHRvIGxvYWQgaW5pdGlhbCBwb3NpdGlvbiBkYXRhOlwiLFxuICAgICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBoYXNDb21wbGV0ZWRJbml0aWFsUG9zaXRpb25Mb2FkID0gdHJ1ZTsgLy8gQWxsb3cgbm9ybWFsIGxvYWRpbmcgZXZlbiBvbiBlcnJvclxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRmFsbGJhY2s6IGNhbGN1bGF0ZSByYW5nZSBmcm9tIGluaXRpYWxTY3JvbGxJbmRleFxuICAgICAgICAgICAgLy8gVGhpcyBoYW5kbGVzIGVkZ2UgY2FzZXMgd2hlcmUgdmlzaWJsZVJhbmdlIHdhc24ndCByZWFkeVxuICAgICAgICAgICAgY29uc3Qgb3ZlcnNjYW4gPSAyO1xuICAgICAgICAgICAgY29uc3QgZXN0aW1hdGVkVmlzaWJsZUNvdW50ID0gTWF0aC5jZWlsKDYwMCAvIDUwKTsgLy8gfjEyIGl0ZW1zXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IE1hdGgubWF4KDAsIGluaXRpYWxTY3JvbGxJbmRleCAtIG92ZXJzY2FuKTtcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IGluaXRpYWxTY3JvbGxJbmRleCArIGVzdGltYXRlZFZpc2libGVDb3VudCArIG92ZXJzY2FuO1xuXG4gICAgICAgICAgICBsb2FkTWlzc2luZ1Jhbmdlcyh7IHN0YXJ0LCBlbmQgfSwgXCJpbml0aWFsLXBvc2l0aW9uLWZhbGxiYWNrXCIpXG4gICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBoYXNDb21wbGV0ZWRJbml0aWFsUG9zaXRpb25Mb2FkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAvLyBFbWl0IGV2ZW50IHRvIHNlbGVjdCBpdGVtIGFmdGVyIGluaXRpYWwgbG9hZCBpZiBzZWxlY3RJZCBpcyBwcm92aWRlZFxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY29sbGVjdGlvbjppbml0aWFsLWxvYWQtY29tcGxldGVcIiwge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RJZCxcbiAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4LFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgIFwiW0NvbGxlY3Rpb25dIEZhaWxlZCB0byBsb2FkIGluaXRpYWwgcG9zaXRpb24gZGF0YSAoZmFsbGJhY2spOlwiLFxuICAgICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBoYXNDb21wbGV0ZWRJbml0aWFsUG9zaXRpb25Mb2FkID0gdHJ1ZTsgLy8gQWxsb3cgbm9ybWFsIGxvYWRpbmcgZXZlbiBvbiBlcnJvclxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm8gaW5pdGlhbCBzY3JvbGwgaW5kZXggLSBsb2FkIGZyb20gYmVnaW5uaW5nIGFzIG5vcm1hbFxuICAgICAgICBsb2FkUmFuZ2UoMCwgcmFuZ2VTaXplKVxuICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBhdXRvU2VsZWN0Rmlyc3QgLSBnZXQgZmlyc3QgaXRlbSBJRCBhbmQgZW1pdCBzZWxlY3Rpb24gZXZlbnRcbiAgICAgICAgICAgIGlmIChhdXRvU2VsZWN0Rmlyc3QgJiYgaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBjb25zdCBmaXJzdEl0ZW0gPSBpdGVtc1swXTtcbiAgICAgICAgICAgICAgY29uc3QgZmlyc3RJZCA9IGZpcnN0SXRlbT8uX2lkIHx8IGZpcnN0SXRlbT8uaWQ7XG4gICAgICAgICAgICAgIGlmIChmaXJzdElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY29sbGVjdGlvbjppbml0aWFsLWxvYWQtY29tcGxldGVcIiwge1xuICAgICAgICAgICAgICAgICAgc2VsZWN0SWQ6IGZpcnN0SWQsXG4gICAgICAgICAgICAgICAgICBpbml0aWFsU2Nyb2xsSW5kZXg6IDAsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbQ29sbGVjdGlvbl0gRmFpbGVkIHRvIGxvYWQgaW5pdGlhbCBkYXRhOlwiLCBlcnJvcik7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIC8vIEFkZCBjb2xsZWN0aW9uIEFQSSB0byB2aWV3cG9ydFxuICAgIGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uID0ge1xuICAgICAgbG9hZFJhbmdlOiAob2Zmc2V0OiBudW1iZXIsIGxpbWl0OiBudW1iZXIpID0+IGxvYWRSYW5nZShvZmZzZXQsIGxpbWl0KSxcbiAgICAgIGxvYWRNaXNzaW5nUmFuZ2VzOiAoXG4gICAgICAgIHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0sXG4gICAgICAgIGNhbGxlcj86IHN0cmluZyxcbiAgICAgICkgPT4gbG9hZE1pc3NpbmdSYW5nZXMocmFuZ2UsIGNhbGxlciB8fCBcInZpZXdwb3J0LmNvbGxlY3Rpb25cIiksXG4gICAgICBnZXRMb2FkZWRSYW5nZXM6ICgpID0+IGxvYWRlZFJhbmdlcyxcbiAgICAgIGdldFBlbmRpbmdSYW5nZXM6ICgpID0+IHBlbmRpbmdSYW5nZXMsXG4gICAgICBjbGVhckZhaWxlZFJhbmdlczogKCkgPT4gZmFpbGVkUmFuZ2VzLmNsZWFyKCksXG4gICAgICByZXRyeUZhaWxlZFJhbmdlLFxuICAgICAgc2V0VG90YWxJdGVtcyxcbiAgICAgIGdldFRvdGFsSXRlbXM6ICgpID0+IHRvdGFsSXRlbXMsXG4gICAgICAvLyBDdXJzb3Itc3BlY2lmaWMgbWV0aG9kc1xuICAgICAgZ2V0Q3VycmVudEN1cnNvcjogKCkgPT4gY3VycmVudEN1cnNvcixcbiAgICAgIGdldEN1cnNvckZvclBhZ2U6IChwYWdlOiBudW1iZXIpID0+IGN1cnNvck1hcC5nZXQocGFnZSkgfHwgbnVsbCxcbiAgICB9O1xuXG4gICAgLy8gQWRkIGNvbGxlY3Rpb24gZGF0YSBhY2Nlc3Mgd2l0aCBkaXJlY3QgYXNzaWdubWVudFxuICAgIChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uID0ge1xuICAgICAgaXRlbXMsXG4gICAgICBnZXRJdGVtczogKCkgPT4gaXRlbXMsXG4gICAgICBnZXRJdGVtOiAoaW5kZXg6IG51bWJlcikgPT4gaXRlbXNbaW5kZXhdLFxuICAgICAgbG9hZFJhbmdlLFxuICAgICAgbG9hZE1pc3NpbmdSYW5nZXM6IChcbiAgICAgICAgcmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSxcbiAgICAgICAgY2FsbGVyPzogc3RyaW5nLFxuICAgICAgKSA9PiBsb2FkTWlzc2luZ1JhbmdlcyhyYW5nZSwgY2FsbGVyIHx8IFwiY29tcG9uZW50LmNvbGxlY3Rpb25cIiksXG4gICAgICBnZXRMb2FkaW5nU3RhdHM6ICgpID0+ICh7XG4gICAgICAgIHBlbmRpbmdSZXF1ZXN0czogYWN0aXZlTG9hZENvdW50LFxuICAgICAgICBjb21wbGV0ZWRSZXF1ZXN0czogY29tcGxldGVkTG9hZHMsXG4gICAgICAgIGZhaWxlZFJlcXVlc3RzOiBmYWlsZWRMb2FkcyxcbiAgICAgICAgY2FuY2VsbGVkUmVxdWVzdHM6IGNhbmNlbGxlZExvYWRzLFxuICAgICAgICBjdXJyZW50VmVsb2NpdHksXG4gICAgICAgIGNhbkxvYWQ6IGNhbkxvYWQoKSxcbiAgICAgICAgcXVldWVkUmVxdWVzdHM6IGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoLFxuICAgICAgfSksXG4gICAgICAvLyBUb3RhbCBpdGVtcyBtYW5hZ2VtZW50XG4gICAgICBnZXRUb3RhbEl0ZW1zOiAoKSA9PiB0b3RhbEl0ZW1zLFxuICAgICAgc2V0VG90YWxJdGVtcyxcbiAgICAgIC8vIEN1cnNvciBtZXRob2RzXG4gICAgICBnZXRDdXJyZW50Q3Vyc29yOiAoKSA9PiBjdXJyZW50Q3Vyc29yLFxuICAgICAgZ2V0Q3Vyc29yRm9yUGFnZTogKHBhZ2U6IG51bWJlcikgPT4gY3Vyc29yTWFwLmdldChwYWdlKSB8fCBudWxsLFxuICAgIH07XG5cbiAgICAvLyBBbHNvIGVuc3VyZSBjb21wb25lbnQuaXRlbXMgaXMgdXBkYXRlZFxuICAgIGNvbXBvbmVudC5pdGVtcyA9IGl0ZW1zO1xuXG4gICAgLy8gQ2xlYW51cCBmdW5jdGlvbiAtIGNvbXByZWhlbnNpdmUgbWVtb3J5IGNsZWFudXBcbiAgICBjb25zdCBkZXN0cm95ID0gKCkgPT4ge1xuICAgICAgbG9nTWVtb3J5U3RhdHMoXCJkZXN0cm95OmJlZm9yZVwiKTtcblxuICAgICAgLy8gQWJvcnQgYWxsIGluLWZsaWdodCByZXF1ZXN0c1xuICAgICAgYWJvcnRDb250cm9sbGVycy5mb3JFYWNoKChjb250cm9sbGVyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gSWdub3JlIGFib3J0IGVycm9yc1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGFib3J0Q29udHJvbGxlcnMuY2xlYXIoKTtcblxuICAgICAgLy8gQ2xlYXIgYWxsIGRhdGEgc3RydWN0dXJlc1xuICAgICAgaXRlbXMubGVuZ3RoID0gMDtcbiAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoID0gMDtcbiAgICAgIGxvYWRlZFJhbmdlcy5jbGVhcigpO1xuICAgICAgcGVuZGluZ1Jhbmdlcy5jbGVhcigpO1xuICAgICAgZmFpbGVkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICBhY3RpdmVMb2FkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICBhY3RpdmVSZXF1ZXN0cy5jbGVhcigpO1xuICAgICAgY3Vyc29yTWFwLmNsZWFyKCk7XG4gICAgICBwYWdlVG9PZmZzZXRNYXAuY2xlYXIoKTtcblxuICAgICAgLy8gUmVzZXQgc3RhdGVcbiAgICAgIHRvdGFsSXRlbXMgPSAwO1xuICAgICAgY3VycmVudEN1cnNvciA9IG51bGw7XG4gICAgICBoaWdoZXN0TG9hZGVkUGFnZSA9IDA7XG4gICAgICBkaXNjb3ZlcmVkVG90YWwgPSBudWxsO1xuICAgICAgaGFzUmVhY2hlZEVuZCA9IGZhbHNlO1xuXG4gICAgICAvLyBDbGVhciBjb21wb25lbnQgcmVmZXJlbmNlXG4gICAgICBpZiAoY29tcG9uZW50Lml0ZW1zID09PSBpdGVtcykge1xuICAgICAgICBjb21wb25lbnQuaXRlbXMgPSBbXTtcbiAgICAgIH1cblxuICAgICAgbG9nTWVtb3J5U3RhdHMoXCJkZXN0cm95OmFmdGVyXCIpO1xuICAgIH07XG5cbiAgICAvLyBXaXJlIGRlc3Ryb3kgaW50byB0aGUgY29tcG9uZW50J3MgZGVzdHJveSBjaGFpblxuICAgIHdyYXBEZXN0cm95KGNvbXBvbmVudCwgZGVzdHJveSk7XG5cbiAgICAvLyBSZXR1cm4gZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIGNvbGxlY3Rpb246IHtcbiAgICAgICAgLy8gRGF0YSBhY2Nlc3MgbWV0aG9kc1xuICAgICAgICBpdGVtcyxcbiAgICAgICAgZ2V0SXRlbXM6ICgpID0+IGl0ZW1zLFxuICAgICAgICBnZXRJdGVtOiAoaW5kZXg6IG51bWJlcikgPT4gaXRlbXNbaW5kZXhdLFxuICAgICAgICAvLyBMb2FkaW5nIG1ldGhvZHNcbiAgICAgICAgbG9hZFJhbmdlLFxuICAgICAgICBsb2FkTWlzc2luZ1JhbmdlczogKFxuICAgICAgICAgIHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0sXG4gICAgICAgICAgY2FsbGVyPzogc3RyaW5nLFxuICAgICAgICApID0+IGxvYWRNaXNzaW5nUmFuZ2VzKHJhbmdlLCBjYWxsZXIgfHwgXCJyZXR1cm4uY29sbGVjdGlvblwiKSxcbiAgICAgICAgZ2V0TG9hZGVkUmFuZ2VzOiAoKSA9PiBsb2FkZWRSYW5nZXMsXG4gICAgICAgIGdldFBlbmRpbmdSYW5nZXM6ICgpID0+IHBlbmRpbmdSYW5nZXMsXG4gICAgICAgIGNsZWFyRmFpbGVkUmFuZ2VzOiAoKSA9PiBmYWlsZWRSYW5nZXMuY2xlYXIoKSxcbiAgICAgICAgcmV0cnlGYWlsZWRSYW5nZSxcbiAgICAgICAgc2V0VG90YWxJdGVtcyxcbiAgICAgICAgZ2V0VG90YWxJdGVtczogKCkgPT4gdG90YWxJdGVtcyxcbiAgICAgICAgLy8gQ3Vyc29yLXNwZWNpZmljIG1ldGhvZHNcbiAgICAgICAgZ2V0Q3VycmVudEN1cnNvcjogKCkgPT4gY3VycmVudEN1cnNvcixcbiAgICAgICAgZ2V0Q3Vyc29yRm9yUGFnZTogKHBhZ2U6IG51bWJlcikgPT4gY3Vyc29yTWFwLmdldChwYWdlKSB8fCBudWxsLFxuICAgICAgfSxcbiAgICB9O1xuICB9O1xufVxuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9wbGFjZWhvbGRlcnMudHNcblxuLyoqXG4gKiBQbGFjZWhvbGRlciBGZWF0dXJlIC0gU21hcnQgcGxhY2Vob2xkZXIgZ2VuZXJhdGlvblxuICogQW5hbHl6ZXMgZmlyc3QgbG9hZGVkIGRhdGEgdG8gZ2VuZXJhdGUgcmVhbGlzdGljIG1hc2tlZCBwbGFjZWhvbGRlcnNcbiAqIFNob3dzIHBsYWNlaG9sZGVycyB3aGlsZSBkYXRhIGlzIGxvYWRpbmdcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2xsZWN0aW9uQ29tcG9uZW50IH0gZnJvbSBcIi4vY29sbGVjdGlvblwiO1xuaW1wb3J0IHsgVklFV1BPUlRfQ09OU1RBTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHBsYWNlaG9sZGVyIGZlYXR1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGFjZWhvbGRlckNvbmZpZyB7XG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuICBhbmFseXplRmlyc3RMb2FkPzogYm9vbGVhbjtcbiAgbWFza0NoYXJhY3Rlcj86IHN0cmluZztcbiAgcmFuZG9tTGVuZ3RoVmFyaWFuY2U/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEZpZWxkIHN0cnVjdHVyZSBmb3IgcGxhY2Vob2xkZXIgZ2VuZXJhdGlvblxuICovXG5pbnRlcmZhY2UgRmllbGRTdHJ1Y3R1cmUge1xuICBtaW5MZW5ndGg6IG51bWJlcjtcbiAgbWF4TGVuZ3RoOiBudW1iZXI7XG4gIGF2Z0xlbmd0aDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYWNlaG9sZGVyQ29tcG9uZW50IHtcbiAgcGxhY2Vob2xkZXJzOiB7XG4gICAgYW5hbHl6ZURhdGFTdHJ1Y3R1cmU6IChpdGVtczogYW55W10pID0+IHZvaWQ7XG4gICAgaGFzQW5hbHl6ZWRTdHJ1Y3R1cmU6ICgpID0+IGJvb2xlYW47XG4gICAgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW06IChpbmRleDogbnVtYmVyKSA9PiBhbnk7XG4gICAgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW1zOiAocmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSkgPT4gYW55W107XG4gICAgc2hvd1BsYWNlaG9sZGVyczogKHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pID0+IHZvaWQ7XG4gICAgaXNQbGFjZWhvbGRlcjogKGl0ZW06IGFueSkgPT4gYm9vbGVhbjtcbiAgICByZXBsYWNlUGxhY2Vob2xkZXJzOiAoaXRlbXM6IGFueVtdLCBvZmZzZXQ6IG51bWJlcikgPT4gdm9pZDtcbiAgICBjbGVhcjogKCkgPT4gdm9pZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBBZGRzIHBsYWNlaG9sZGVyIGZ1bmN0aW9uYWxpdHkgdG8gdmlld3BvcnQgY29tcG9uZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoUGxhY2Vob2xkZXJzKGNvbmZpZzogUGxhY2Vob2xkZXJDb25maWcgPSB7fSkge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBDb2xsZWN0aW9uQ29tcG9uZW50PihcbiAgICBjb21wb25lbnQ6IFRcbiAgKTogVCAmIFBsYWNlaG9sZGVyQ29tcG9uZW50ID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICAgIGFuYWx5emVGaXJzdExvYWQgPSB0cnVlLFxuICAgICAgbWFza0NoYXJhY3RlciA9IFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVNLX0NIQVJBQ1RFUixcbiAgICAgIHJhbmRvbUxlbmd0aFZhcmlhbmNlID0gVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSXG4gICAgICAgIC5SQU5ET01fTEVOR1RIX1ZBUklBTkNFLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBTdGF0ZVxuICAgIGxldCBmaWVsZFN0cnVjdHVyZXM6IE1hcDxzdHJpbmcsIEZpZWxkU3RydWN0dXJlPiB8IG51bGwgPSBudWxsO1xuICAgIGxldCBoYXNBbmFseXplZCA9IGZhbHNlO1xuICAgIGxldCBwbGFjZWhvbGRlcklkQ291bnRlciA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBBbmFseXplIGRhdGEgc3RydWN0dXJlIGZyb20gZmlyc3QgbG9hZGVkIGl0ZW1zXG4gICAgICovXG4gICAgY29uc3QgYW5hbHl6ZURhdGFTdHJ1Y3R1cmUgPSAoaXRlbXM6IGFueVtdKTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWVuYWJsZWQgfHwgaGFzQW5hbHl6ZWQgfHwgIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBg8J+UjSBbUExBQ0VIT0xERVJTXSBBbmFseXppbmcgZGF0YSBzdHJ1Y3R1cmUgZnJvbSAke2l0ZW1zLmxlbmd0aH0gaXRlbXNgXG4gICAgICAvLyApO1xuXG4gICAgICBjb25zdCBzdHJ1Y3R1cmVzID0gbmV3IE1hcDxzdHJpbmcsIEZpZWxkU3RydWN0dXJlPigpO1xuICAgICAgY29uc3Qgc2FtcGxlU2l6ZSA9IE1hdGgubWluKFxuICAgICAgICBpdGVtcy5sZW5ndGgsXG4gICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVhfU0FNUExFX1NJWkVcbiAgICAgICk7XG5cbiAgICAgIC8vIEFuYWx5emUgZWFjaCBmaWVsZCBhY3Jvc3MgYWxsIHNhbXBsZSBpdGVtc1xuICAgICAgY29uc3QgZmllbGRTdGF0cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzYW1wbGVTaXplOyBpKyspIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zW2ldO1xuICAgICAgICBpZiAoIWl0ZW0gfHwgdHlwZW9mIGl0ZW0gIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuXG4gICAgICAgIE9iamVjdC5rZXlzKGl0ZW0pLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgLy8gU2tpcCBpbnRlcm5hbCBmaWVsZHNcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBmaWVsZC5zdGFydHNXaXRoKFwiX1wiKSB8fFxuICAgICAgICAgICAgZmllbGQgPT09IFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5QTEFDRUhPTERFUl9GTEFHXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBTdHJpbmcoaXRlbVtmaWVsZF0gfHwgXCJcIik7XG4gICAgICAgICAgY29uc3QgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuXG4gICAgICAgICAgaWYgKCFmaWVsZFN0YXRzLmhhcyhmaWVsZCkpIHtcbiAgICAgICAgICAgIGZpZWxkU3RhdHMuc2V0KGZpZWxkLCBbXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZpZWxkU3RhdHMuZ2V0KGZpZWxkKSEucHVzaChsZW5ndGgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FsY3VsYXRlIHN0YXRpc3RpY3MgZm9yIGVhY2ggZmllbGRcbiAgICAgIGZpZWxkU3RhdHMuZm9yRWFjaCgobGVuZ3RocywgZmllbGQpID0+IHtcbiAgICAgICAgaWYgKGxlbmd0aHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgbWluTGVuZ3RoID0gTWF0aC5taW4oLi4ubGVuZ3Rocyk7XG4gICAgICAgIGNvbnN0IG1heExlbmd0aCA9IE1hdGgubWF4KC4uLmxlbmd0aHMpO1xuICAgICAgICBjb25zdCBhdmdMZW5ndGggPSBNYXRoLnJvdW5kKFxuICAgICAgICAgIGxlbmd0aHMucmVkdWNlKChzdW0sIGxlbikgPT4gc3VtICsgbGVuLCAwKSAvIGxlbmd0aHMubGVuZ3RoXG4gICAgICAgICk7XG5cbiAgICAgICAgc3RydWN0dXJlcy5zZXQoZmllbGQsIHtcbiAgICAgICAgICBtaW5MZW5ndGgsXG4gICAgICAgICAgbWF4TGVuZ3RoLFxuICAgICAgICAgIGF2Z0xlbmd0aCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZmllbGRTdHJ1Y3R1cmVzID0gc3RydWN0dXJlcztcbiAgICAgIGhhc0FuYWx5emVkID0gdHJ1ZTtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGDinIUgW1BMQUNFSE9MREVSU10gU3RydWN0dXJlIGFuYWx5emVkOmAsXG4gICAgICAvLyAgIE9iamVjdC5mcm9tRW50cmllcyhzdHJ1Y3R1cmVzKVxuICAgICAgLy8gKTtcblxuICAgICAgLy8gRW1pdCBldmVudFxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnBsYWNlaG9sZGVycy1zdHJ1Y3R1cmUtYW5hbHl6ZWRcIiwge1xuICAgICAgICBzdHJ1Y3R1cmU6IE9iamVjdC5mcm9tRW50cmllcyhzdHJ1Y3R1cmVzKSxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBhIHNpbmdsZSBwbGFjZWhvbGRlciBpdGVtXG4gICAgICovXG4gICAgY29uc3QgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW0gPSAoaW5kZXg6IG51bWJlcik6IGFueSA9PiB7XG4gICAgICBjb25zdCBwbGFjZWhvbGRlcjogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgICAgaWQ6IGBwbGFjZWhvbGRlci0ke3BsYWNlaG9sZGVySWRDb3VudGVyKyt9YCxcbiAgICAgICAgW1ZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5QTEFDRUhPTERFUl9GTEFHXTogdHJ1ZSxcbiAgICAgICAgX2luZGV4OiBpbmRleCxcbiAgICAgIH07XG5cbiAgICAgIGlmICghZmllbGRTdHJ1Y3R1cmVzIHx8IGZpZWxkU3RydWN0dXJlcy5zaXplID09PSAwKSB7XG4gICAgICAgIC8vIE5vIHN0cnVjdHVyZSBhbmFseXplZCB5ZXQgLSByZXR1cm4gYmFzaWMgcGxhY2Vob2xkZXJcbiAgICAgICAgcGxhY2Vob2xkZXIubGFiZWwgPSBtYXNrQ2hhcmFjdGVyLnJlcGVhdCgxMCk7XG4gICAgICAgIHJldHVybiBwbGFjZWhvbGRlcjtcbiAgICAgIH1cblxuICAgICAgLy8gR2VuZXJhdGUgZmllbGRzIGJhc2VkIG9uIGFuYWx5emVkIHN0cnVjdHVyZVxuICAgICAgZmllbGRTdHJ1Y3R1cmVzLmZvckVhY2goKHN0cnVjdHVyZSwgZmllbGQpID0+IHtcbiAgICAgICAgbGV0IGxlbmd0aDogbnVtYmVyO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICByYW5kb21MZW5ndGhWYXJpYW5jZSAmJlxuICAgICAgICAgIHN0cnVjdHVyZS5taW5MZW5ndGggIT09IHN0cnVjdHVyZS5tYXhMZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gUmFuZG9tIGxlbmd0aCB3aXRoaW4gcmFuZ2VcbiAgICAgICAgICBsZW5ndGggPSBNYXRoLmZsb29yKFxuICAgICAgICAgICAgTWF0aC5yYW5kb20oKSAqIChzdHJ1Y3R1cmUubWF4TGVuZ3RoIC0gc3RydWN0dXJlLm1pbkxlbmd0aCArIDEpICtcbiAgICAgICAgICAgICAgc3RydWN0dXJlLm1pbkxlbmd0aFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVXNlIGF2ZXJhZ2UgbGVuZ3RoXG4gICAgICAgICAgbGVuZ3RoID0gc3RydWN0dXJlLmF2Z0xlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGx5IHNvbWUgdmFyaWF0aW9uIHRvIG1ha2UgaXQgbG9vayBtb3JlIG5hdHVyYWxcbiAgICAgICAgaWYgKHJhbmRvbUxlbmd0aFZhcmlhbmNlICYmIE1hdGgucmFuZG9tKCkgPCAwLjMpIHtcbiAgICAgICAgICBsZW5ndGggPSBNYXRoLm1heCgxLCBsZW5ndGggKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAzKSAtIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcGxhY2Vob2xkZXJbZmllbGRdID0gbWFza0NoYXJhY3Rlci5yZXBlYXQobGVuZ3RoKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcGxhY2Vob2xkZXI7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIG11bHRpcGxlIHBsYWNlaG9sZGVyIGl0ZW1zXG4gICAgICovXG4gICAgY29uc3QgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW1zID0gKHJhbmdlOiB7XG4gICAgICBzdGFydDogbnVtYmVyO1xuICAgICAgZW5kOiBudW1iZXI7XG4gICAgfSk6IGFueVtdID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1zOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IHJhbmdlLnN0YXJ0OyBpIDw9IHJhbmdlLmVuZDsgaSsrKSB7XG4gICAgICAgIGl0ZW1zLnB1c2goZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW0oaSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTaG93IHBsYWNlaG9sZGVycyBmb3IgYSByYW5nZVxuICAgICAqL1xuICAgIGNvbnN0IHNob3dQbGFjZWhvbGRlcnMgPSAocmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFlbmFibGVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVycyA9IGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtcyhyYW5nZSk7XG5cbiAgICAgIC8vIFVwZGF0ZSBpdGVtcyBhcnJheVxuICAgICAgaWYgKGNvbXBvbmVudC5pdGVtcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsYWNlaG9sZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gcmFuZ2Uuc3RhcnQgKyBpO1xuICAgICAgICAgIGlmICghY29tcG9uZW50Lml0ZW1zW2luZGV4XSkge1xuICAgICAgICAgICAgY29tcG9uZW50Lml0ZW1zW2luZGV4XSA9IHBsYWNlaG9sZGVyc1tpXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGDwn5SEIFtQTEFDRUhPTERFUlNdIFNob3dpbmcgJHtwbGFjZWhvbGRlcnMubGVuZ3RofSBwbGFjZWhvbGRlcnMgZm9yIHJhbmdlICR7cmFuZ2Uuc3RhcnR9LSR7cmFuZ2UuZW5kfWBcbiAgICAgICk7XG5cbiAgICAgIC8vIEVtaXQgZXZlbnRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpwbGFjZWhvbGRlcnMtc2hvd25cIiwge1xuICAgICAgICByYW5nZSxcbiAgICAgICAgY291bnQ6IHBsYWNlaG9sZGVycy5sZW5ndGgsXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYW4gaXRlbSBpcyBhIHBsYWNlaG9sZGVyXG4gICAgICovXG4gICAgY29uc3QgaXNQbGFjZWhvbGRlciA9IChpdGVtOiBhbnkpOiBib29sZWFuID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGl0ZW0gJiZcbiAgICAgICAgdHlwZW9mIGl0ZW0gPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgaXRlbVtWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuUExBQ0VIT0xERVJfRkxBR10gPT09IHRydWVcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlcGxhY2UgcGxhY2Vob2xkZXJzIHdpdGggcmVhbCBkYXRhXG4gICAgICovXG4gICAgY29uc3QgcmVwbGFjZVBsYWNlaG9sZGVycyA9IChpdGVtczogYW55W10sIG9mZnNldDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWNvbXBvbmVudC5pdGVtcykgcmV0dXJuO1xuXG4gICAgICBsZXQgcmVwbGFjZWRDb3VudCA9IDA7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBvZmZzZXQgKyBpO1xuICAgICAgICBjb25zdCBjdXJyZW50SXRlbSA9IGNvbXBvbmVudC5pdGVtc1tpbmRleF07XG5cbiAgICAgICAgaWYgKGlzUGxhY2Vob2xkZXIoY3VycmVudEl0ZW0pKSB7XG4gICAgICAgICAgY29tcG9uZW50Lml0ZW1zW2luZGV4XSA9IGl0ZW1zW2ldO1xuICAgICAgICAgIHJlcGxhY2VkQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocmVwbGFjZWRDb3VudCA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYOKcqCBbUExBQ0VIT0xERVJTXSBSZXBsYWNlZCAke3JlcGxhY2VkQ291bnR9IHBsYWNlaG9sZGVycyBhdCBvZmZzZXQgJHtvZmZzZXR9YFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEVtaXQgZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnBsYWNlaG9sZGVycy1yZXBsYWNlZFwiLCB7XG4gICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgIGNvdW50OiByZXBsYWNlZENvdW50LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIHBsYWNlaG9sZGVyIHN0YXRlXG4gICAgICovXG4gICAgY29uc3QgY2xlYXIgPSAoKTogdm9pZCA9PiB7XG4gICAgICBmaWVsZFN0cnVjdHVyZXMgPSBudWxsO1xuICAgICAgaGFzQW5hbHl6ZWQgPSBmYWxzZTtcbiAgICAgIHBsYWNlaG9sZGVySWRDb3VudGVyID0gMDtcbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBmdW5jdGlvblxuICAgIGNvbnN0IGluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgICBpZiAoIWVuYWJsZWQpIHJldHVybjtcblxuICAgICAgLy8gTGlzdGVuIGZvciBmaXJzdCBkYXRhIGxvYWQgdG8gYW5hbHl6ZSBzdHJ1Y3R1cmVcbiAgICAgIGlmIChhbmFseXplRmlyc3RMb2FkKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZVJhbmdlTG9hZGVkID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgIGlmICghaGFzQW5hbHl6ZWQgJiYgZGF0YS5pdGVtcyAmJiBkYXRhLml0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFuYWx5emVEYXRhU3RydWN0dXJlKGRhdGEuaXRlbXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJlcGxhY2UgYW55IHBsYWNlaG9sZGVycyB3aXRoIHJlYWwgZGF0YVxuICAgICAgICAgIHJlcGxhY2VQbGFjZWhvbGRlcnMoZGF0YS5pdGVtcywgZGF0YS5vZmZzZXQpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6cmFuZ2UtbG9hZGVkXCIsIGhhbmRsZVJhbmdlTG9hZGVkKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2hvdyBpbml0aWFsIHBsYWNlaG9sZGVycyBpZiBjb25maWd1cmVkXG4gICAgICBjb25zdCB0b3RhbEl0ZW1zID0gY29tcG9uZW50LmNvbGxlY3Rpb24/LmdldFRvdGFsSXRlbXMoKSB8fCAwO1xuICAgICAgaWYgKHRvdGFsSXRlbXMgPiAwKSB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxSYW5nZSA9IHtcbiAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICBlbmQ6IE1hdGgubWluKFxuICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLk1BWF9TQU1QTEVfU0laRSAtIDEsXG4gICAgICAgICAgICB0b3RhbEl0ZW1zIC0gMVxuICAgICAgICAgICksXG4gICAgICAgIH07XG4gICAgICAgIHNob3dQbGFjZWhvbGRlcnMoaW5pdGlhbFJhbmdlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQ2xlYW51cCBmdW5jdGlvblxuICAgIGNvbnN0IGRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICBjbGVhcigpO1xuICAgIH07XG5cbiAgICAvLyBTdG9yZSBmdW5jdGlvbnMgZm9yIHZpZXdwb3J0IHRvIGNhbGxcbiAgICAoY29tcG9uZW50IGFzIGFueSkuX3BsYWNlaG9sZGVyc0luaXRpYWxpemUgPSBpbml0aWFsaXplO1xuICAgIChjb21wb25lbnQgYXMgYW55KS5fcGxhY2Vob2xkZXJzRGVzdHJveSA9IGRlc3Ryb3k7XG5cbiAgICAvLyBSZXR1cm4gZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIHBsYWNlaG9sZGVyczoge1xuICAgICAgICBhbmFseXplRGF0YVN0cnVjdHVyZSxcbiAgICAgICAgaGFzQW5hbHl6ZWRTdHJ1Y3R1cmU6ICgpID0+IGhhc0FuYWx5emVkLFxuICAgICAgICBnZW5lcmF0ZVBsYWNlaG9sZGVySXRlbSxcbiAgICAgICAgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW1zLFxuICAgICAgICBzaG93UGxhY2Vob2xkZXJzLFxuICAgICAgICBpc1BsYWNlaG9sZGVyLFxuICAgICAgICByZXBsYWNlUGxhY2Vob2xkZXJzLFxuICAgICAgICBjbGVhcixcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbn1cbiIsCiAgICAiLyoqXG4gKiBSZW5kZXJpbmcgRmVhdHVyZSAtIEl0ZW0gcmVuZGVyaW5nIGFuZCBwb3NpdGlvbmluZyBmb3Igdmlld3BvcnRcbiAqIEhhbmRsZXMgRE9NIGVsZW1lbnQgY3JlYXRpb24sIHBvc2l0aW9uaW5nLCByZWN5Y2xpbmcsIGFuZCB1cGRhdGVzXG4gKi9cblxuaW1wb3J0IHsgYWRkQ2xhc3MsIHJlbW92ZUNsYXNzLCBoYXNDbGFzcyB9IGZyb20gXCJtdHJsXCI7XG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZJRVdQT1JUX0NPTlNUQU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIGlzUGxhY2Vob2xkZXIsXG4gIGdldFZpZXdwb3J0U3RhdGUsXG4gIHdyYXBJbml0aWFsaXplLFxuICB3cmFwRGVzdHJveSxcbn0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IGNyZWF0ZUxheW91dCB9IGZyb20gXCIuLi8uLi9sYXlvdXRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJpbmdDb25maWcge1xuICB0ZW1wbGF0ZT86IChcbiAgICBpdGVtOiBhbnksXG4gICAgaW5kZXg6IG51bWJlcixcbiAgKSA9PiBzdHJpbmcgfCBIVE1MRWxlbWVudCB8IGFueVtdIHwgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgb3ZlcnNjYW4/OiBudW1iZXI7XG4gIG1lYXN1cmVJdGVtcz86IGJvb2xlYW47XG4gIGVuYWJsZVJlY3ljbGluZz86IGJvb2xlYW47XG4gIG1heFBvb2xTaXplPzogbnVtYmVyO1xuICAvKipcbiAgICogTWFpbnRhaW4gRE9NIG9yZGVyIHRvIG1hdGNoIHZpc3VhbCBpbmRleCBvcmRlci5cbiAgICogRW5hYmxlcyBDU1Mgc2VsZWN0b3JzIGxpa2UgOmZpcnN0LWNoaWxkLCA6bnRoLWNoaWxkKCkgdG8gd29yayBjb3JyZWN0bHkuXG4gICAqIERlZmF1bHQ6IHRydWVcbiAgICovXG4gIG1haW50YWluRG9tT3JkZXI/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgVmlld3BvcnRTdGF0ZSB7XG4gIHNjcm9sbFBvc2l0aW9uOiBudW1iZXI7XG4gIHRvdGFsSXRlbXM6IG51bWJlcjtcbiAgaXRlbVNpemU6IG51bWJlcjtcbiAgY29udGFpbmVyU2l6ZTogbnVtYmVyO1xuICB2aXJ0dWFsVG90YWxTaXplOiBudW1iZXI7XG4gIHZpc2libGVSYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9O1xuICBpdGVtc0NvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsO1xufVxuXG4vKipcbiAqIFJlbmRlcmluZyBmZWF0dXJlIGZvciB2aWV3cG9ydFxuICovXG5leHBvcnQgY29uc3Qgd2l0aFJlbmRlcmluZyA9IChjb25maWc6IFJlbmRlcmluZ0NvbmZpZyA9IHt9KSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50Pihjb21wb25lbnQ6IFQpOiBUID0+IHtcbiAgICBjb25zdCB7XG4gICAgICB0ZW1wbGF0ZSxcbiAgICAgIG92ZXJzY2FuID0gNSxcbiAgICAgIG1lYXN1cmVJdGVtcyA9IGZhbHNlLFxuICAgICAgZW5hYmxlUmVjeWNsaW5nID0gdHJ1ZSxcbiAgICAgIG1heFBvb2xTaXplID0gVklFV1BPUlRfQ09OU1RBTlRTLlJFTkRFUklORy5ERUZBVUxUX01BWF9QT09MX1NJWkUsXG4gICAgICBtYWludGFpbkRvbU9yZGVyID0gdHJ1ZSxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gU3RhdGVcbiAgICBjb25zdCByZW5kZXJlZEVsZW1lbnRzID0gbmV3IE1hcDxudW1iZXIsIEhUTUxFbGVtZW50PigpO1xuICAgIGNvbnN0IGNvbGxlY3Rpb25JdGVtczogUmVjb3JkPG51bWJlciwgYW55PiA9IHt9O1xuICAgIGNvbnN0IGVsZW1lbnRQb29sOiBIVE1MRWxlbWVudFtdID0gW107XG4gICAgY29uc3QgcG9vbFN0YXRzID0geyBjcmVhdGVkOiAwLCByZWN5Y2xlZDogMCwgcG9vbFNpemU6IDAsIHJlbGVhc2VkOiAwIH07XG5cbiAgICAvLyBTdG9yZSBsYXlvdXQgcmVzdWx0cyBmb3IgcHJvcGVyIGNsZWFudXAgKHByZXZlbnRzIG1lbW9yeSBsZWFrKVxuICAgIGNvbnN0IGxheW91dFJlc3VsdHMgPSBuZXcgV2Vha01hcDxIVE1MRWxlbWVudCwgeyBkZXN0cm95OiAoKSA9PiB2b2lkIH0+KCk7XG5cbiAgICAvLyBSZXVzYWJsZSB0ZW1wbGF0ZSBlbGVtZW50IGZvciBIVE1MIHN0cmluZyBwYXJzaW5nIChtb3JlIGVmZmljaWVudCB0aGFuIGRpdilcbiAgICBjb25zdCB0ZW1wbGF0ZVBhcnNlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcblxuICAgIGxldCB2aWV3cG9ydFN0YXRlOiBWaWV3cG9ydFN0YXRlIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB7IHN0YXJ0OiAwLCBlbmQ6IDAgfTtcbiAgICBsZXQgbGFzdFJlbmRlclRpbWUgPSAwO1xuICAgIGxldCBpc1JlbW92aW5nSXRlbSA9IGZhbHNlO1xuXG4gICAgLy8gRWxlbWVudCBwb29sIG1hbmFnZW1lbnRcbiAgICBjb25zdCBnZXRQb29sZWRFbGVtZW50ID0gKCk6IEhUTUxFbGVtZW50ID0+IHtcbiAgICAgIGlmIChlbmFibGVSZWN5Y2xpbmcgJiYgZWxlbWVudFBvb2wubGVuZ3RoID4gMCkge1xuICAgICAgICBwb29sU3RhdHMucmVjeWNsZWQrKztcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRQb29sLnBvcCgpITtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgZWxlbWVudC5jbGFzc05hbWUgPSBcIm10cmwtdmlld3BvcnQtaXRlbVwiO1xuICAgICAgcG9vbFN0YXRzLmNyZWF0ZWQrKztcbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH07XG5cbiAgICBjb25zdCByZWxlYXNlRWxlbWVudCA9IChlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQgPT4ge1xuICAgICAgcG9vbFN0YXRzLnJlbGVhc2VkKys7XG5cbiAgICAgIC8vIENSSVRJQ0FMOiBDYWxsIGRlc3Ryb3kgb24gbGF5b3V0UmVzdWx0IHRvIGNsZWFuIHVwIGNvbXBvbmVudHMgYW5kIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgLy8gVGhpcyBmaXhlcyB0aGUgbWVtb3J5IGxlYWsgd2hlbiB1c2luZyBsYXlvdXQgdGVtcGxhdGVzXG4gICAgICBjb25zdCBsYXlvdXRSZXN1bHQgPSBsYXlvdXRSZXN1bHRzLmdldChlbGVtZW50KTtcbiAgICAgIGlmIChsYXlvdXRSZXN1bHQgJiYgdHlwZW9mIGxheW91dFJlc3VsdC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsYXlvdXRSZXN1bHQuZGVzdHJveSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gSWdub3JlIGRlc3Ryb3kgZXJyb3JzIC0gZWxlbWVudCBtYXkgYWxyZWFkeSBiZSBjbGVhbmVkIHVwXG4gICAgICAgIH1cbiAgICAgICAgbGF5b3V0UmVzdWx0cy5kZWxldGUoZWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZW5hYmxlUmVjeWNsaW5nKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIENsZWFuIGVsZW1lbnQgZm9yIHJldXNlIChubyBjbG9uaW5nIC0gcmV1c2UgdGhlIGFjdHVhbCBlbGVtZW50KVxuICAgICAgZWxlbWVudC5jbGFzc05hbWUgPSBcIm10cmwtdmlld3BvcnQtaXRlbVwiO1xuICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoXCJkYXRhLWluZGV4XCIpO1xuICAgICAgZWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gXCJcIjtcbiAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gXCJcIjtcblxuICAgICAgLy8gUmVtb3ZlIGZyb20gRE9NIGZpcnN0XG4gICAgICBpZiAoZWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIHRvIHBvb2wgaWYgbm90IGZ1bGxcbiAgICAgIGlmIChlbGVtZW50UG9vbC5sZW5ndGggPCBtYXhQb29sU2l6ZSkge1xuICAgICAgICBlbGVtZW50UG9vbC5wdXNoKGVsZW1lbnQpO1xuICAgICAgICBwb29sU3RhdHMucG9vbFNpemUgPSBlbGVtZW50UG9vbC5sZW5ndGg7XG4gICAgICB9XG4gICAgICAvLyBJZiBwb29sIGlzIGZ1bGwsIGVsZW1lbnQgaXMganVzdCBkZXJlZmVyZW5jZWQgYW5kIEdDJ2RcbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbGl6ZVxuICAgIHdyYXBJbml0aWFsaXplKGNvbXBvbmVudCwgKCkgPT4ge1xuICAgICAgdmlld3BvcnRTdGF0ZSA9IGdldFZpZXdwb3J0U3RhdGUoY29tcG9uZW50KSBhcyBWaWV3cG9ydFN0YXRlO1xuXG4gICAgICAvLyBTZXQgaW5pdGlhbCBpdGVtcyBjb250YWluZXIgaGVpZ2h0IGZyb20gY3VycmVudCB2aXJ0dWFsIHNpemVcbiAgICAgIGlmICh2aWV3cG9ydFN0YXRlPy5pdGVtc0NvbnRhaW5lciAmJiB2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemUgPiAwKSB7XG4gICAgICAgIHZpZXdwb3J0U3RhdGUuaXRlbXNDb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gYCR7dmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplfXB4YDtcbiAgICAgIH1cblxuICAgICAgLy8gTGlzdGVuIGZvciBpdGVtIHVwZGF0ZSByZXF1ZXN0cyBmcm9tIEFQSVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJpdGVtOnVwZGF0ZS1yZXF1ZXN0XCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgeyBpbmRleCwgaXRlbSwgcHJldmlvdXNJdGVtIH0gPSBkYXRhO1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgaXRlbSBpbiBjb2xsZWN0aW9uSXRlbXNcbiAgICAgICAgY29sbGVjdGlvbkl0ZW1zW2luZGV4XSA9IGl0ZW07XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpdGVtIGlzIGN1cnJlbnRseSByZW5kZXJlZFxuICAgICAgICBjb25zdCBleGlzdGluZ0VsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnRzLmdldChpbmRleCk7XG4gICAgICAgIGNvbnN0IHdhc1Zpc2libGUgPSAhIWV4aXN0aW5nRWxlbWVudDtcblxuICAgICAgICAvLyBDaGVjayBpZiBpdGVtIHdhcyBzZWxlY3RlZCBiZWZvcmUgdXBkYXRlXG4gICAgICAgIGNvbnN0IHdhc1NlbGVjdGVkID0gZXhpc3RpbmdFbGVtZW50XG4gICAgICAgICAgPyBoYXNDbGFzcyhcbiAgICAgICAgICAgICAgZXhpc3RpbmdFbGVtZW50LFxuICAgICAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuU0VMRUNUSU9OLlNFTEVDVEVEX0NMQVNTLFxuICAgICAgICAgICAgKSB8fCBoYXNDbGFzcyhleGlzdGluZ0VsZW1lbnQsIFwibXRybC12aWV3cG9ydC1pdGVtLS1zZWxlY3RlZFwiKVxuICAgICAgICAgIDogZmFsc2U7XG5cbiAgICAgICAgaWYgKGV4aXN0aW5nRWxlbWVudCAmJiBleGlzdGluZ0VsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICAgIC8vIFJlLXJlbmRlciB0aGUgaXRlbVxuICAgICAgICAgIGNvbnN0IG5ld0VsZW1lbnQgPSByZW5kZXJJdGVtKGl0ZW0sIGluZGV4KTtcblxuICAgICAgICAgIGlmIChuZXdFbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBDb3B5IHBvc2l0aW9uIHN0eWxlcyBmcm9tIGV4aXN0aW5nIGVsZW1lbnRcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obmV3RWxlbWVudC5zdHlsZSwge1xuICAgICAgICAgICAgICBwb3NpdGlvbjogZXhpc3RpbmdFbGVtZW50LnN0eWxlLnBvc2l0aW9uLFxuICAgICAgICAgICAgICB0cmFuc2Zvcm06IGV4aXN0aW5nRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0sXG4gICAgICAgICAgICAgIHdpZHRoOiBleGlzdGluZ0VsZW1lbnQuc3R5bGUud2lkdGgsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gUHJlc2VydmUgc2VsZWN0ZWQgc3RhdGVcbiAgICAgICAgICAgIGlmICh3YXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgICBhZGRDbGFzcyhuZXdFbGVtZW50LCBWSUVXUE9SVF9DT05TVEFOVFMuU0VMRUNUSU9OLlNFTEVDVEVEX0NMQVNTKTtcbiAgICAgICAgICAgICAgYWRkQ2xhc3MobmV3RWxlbWVudCwgXCJtdHJsLXZpZXdwb3J0LWl0ZW0tLXNlbGVjdGVkXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGQgdXBkYXRlIGFuaW1hdGlvbiBjbGFzcyB0byBpbm5lciBjb250ZW50IGZvciB2aXNpYmlsaXR5XG4gICAgICAgICAgICBhZGRDbGFzcyhuZXdFbGVtZW50LCBcInZpZXdwb3J0LWl0ZW0tLXVwZGF0ZWRcIik7XG4gICAgICAgICAgICAvLyBBbHNvIHRyeSB0byBhZGQgdG8gZmlyc3QgY2hpbGQgaWYgaXQgZXhpc3RzICh0aGUgYWN0dWFsIGl0ZW0gY29udGVudClcbiAgICAgICAgICAgIGNvbnN0IGlubmVySXRlbSA9IG5ld0VsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAoaW5uZXJJdGVtKSB7XG4gICAgICAgICAgICAgIGFkZENsYXNzKGlubmVySXRlbSwgXCJpdGVtLS11cGRhdGVkXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZXBsYWNlIGluIERPTVxuICAgICAgICAgICAgZXhpc3RpbmdFbGVtZW50LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKFxuICAgICAgICAgICAgICBuZXdFbGVtZW50LFxuICAgICAgICAgICAgICBleGlzdGluZ0VsZW1lbnQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5zZXQoaW5kZXgsIG5ld0VsZW1lbnQpO1xuICAgICAgICAgICAgcmVsZWFzZUVsZW1lbnQoZXhpc3RpbmdFbGVtZW50KTtcblxuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBhbmltYXRpb24gY2xhc3MgYWZ0ZXIgdHJhbnNpdGlvblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIHJlbW92ZUNsYXNzKG5ld0VsZW1lbnQsIFwidmlld3BvcnQtaXRlbS0tdXBkYXRlZFwiKTtcbiAgICAgICAgICAgICAgaWYgKGlubmVySXRlbSkge1xuICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzKGlubmVySXRlbSwgXCJpdGVtLS11cGRhdGVkXCIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCA1MDApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtaXQgY29tcGxldGlvbiBldmVudFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiaXRlbTp1cGRhdGVkXCIsIHtcbiAgICAgICAgICBpdGVtLFxuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIHByZXZpb3VzSXRlbSxcbiAgICAgICAgICB3YXNWaXNpYmxlLFxuICAgICAgICAgIHdhc1NlbGVjdGVkLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGl0ZW0gcmVtb3ZlIHJlcXVlc3RzIGZyb20gQVBJXG4gICAgICBjb21wb25lbnQub24/LihcIml0ZW06cmVtb3ZlLXJlcXVlc3RcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB7IGluZGV4LCBpdGVtIH0gPSBkYXRhO1xuICAgICAgICBpc1JlbW92aW5nSXRlbSA9IHRydWU7XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtSRU5ERVItRklYXSA9PT09PT09PT09IElURU0gUkVNT1ZFIFNUQVJUICh2NCkgPT09PT09PT09PWAsXG4gICAgICAgIC8vICk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBbUkVOREVSLUZJWF0gUmVtb3ZpbmcgaW5kZXg6ICR7aW5kZXh9YCk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBzb3VyY2Ugb2YgdHJ1dGggLSBjb2xsZWN0aW9uLml0ZW1zIGhhcyBhbHJlYWR5IGJlZW4gc3BsaWNlZCBieSBhcGkudHNcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbkl0ZW1zU291cmNlID1cbiAgICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbj8uaXRlbXMgfHxcbiAgICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuaXRlbXMgfHxcbiAgICAgICAgICBbXTtcblxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW1JFTkRFUi1GSVhdIGNvbGxlY3Rpb25JdGVtc1NvdXJjZS5sZW5ndGg6ICR7Y29sbGVjdGlvbkl0ZW1zU291cmNlLmxlbmd0aH1gLFxuICAgICAgICAvLyApO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW1JFTkRFUi1GSVhdIGNvbGxlY3Rpb25JdGVtcyBjYWNoZSBzaXplIEJFRk9SRTogJHtPYmplY3Qua2V5cyhjb2xsZWN0aW9uSXRlbXMpLmxlbmd0aH1gLFxuICAgICAgICAvLyApO1xuXG4gICAgICAgIC8vIFN0cmF0ZWd5OiBTaGlmdCBjb2xsZWN0aW9uSXRlbXMgY2FjaGUgaW5kaWNlcyBkb3duLCBidXQgdXNlIGFjdHVhbCBkYXRhXG4gICAgICAgIC8vIGZyb20gY29sbGVjdGlvbi5pdGVtcyAod2hpY2ggaGFzIGJlZW4gc3BsaWNlZCkgZm9yIHRoZSBsb2FkZWQgcmFuZ2UuXG4gICAgICAgIC8vIEZvciBpbmRpY2VzIGJleW9uZCB0aGUgbG9hZGVkIHJhbmdlLCBzaGlmdCB0aGUgY2FjaGVkIGRhdGEuXG5cbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGNvbGxlY3Rpb25JdGVtcylcbiAgICAgICAgICAubWFwKE51bWJlcilcbiAgICAgICAgICAuZmlsdGVyKChrKSA9PiAhaXNOYU4oaykpXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcblxuICAgICAgICAvLyBEZWxldGUgdGhlIHJlbW92ZWQgaW5kZXhcbiAgICAgICAgZGVsZXRlIGNvbGxlY3Rpb25JdGVtc1tpbmRleF07XG5cbiAgICAgICAgLy8gU2hpZnQgYWxsIGluZGljZXMgYWZ0ZXIgdGhlIHJlbW92ZWQgb25lIGRvd24gYnkgMVxuICAgICAgICAvLyBGb3IgaW5kaWNlcyB3aXRoaW4gdGhlIGxvYWRlZCByYW5nZSwgdXNlIGRhdGEgZnJvbSBjb2xsZWN0aW9uLml0ZW1zXG4gICAgICAgIC8vIEZvciBpbmRpY2VzIGJleW9uZCwgc2hpZnQgdGhlIGV4aXN0aW5nIGNhY2hlZCBkYXRhXG4gICAgICAgIGNvbnN0IGxvYWRlZExlbmd0aCA9IGNvbGxlY3Rpb25JdGVtc1NvdXJjZS5sZW5ndGg7XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICAgIGlmIChrZXkgPiBpbmRleCkge1xuICAgICAgICAgICAgY29uc3QgbmV3SW5kZXggPSBrZXkgLSAxO1xuICAgICAgICAgICAgLy8gSWYgbmV3SW5kZXggaXMgd2l0aGluIGxvYWRlZCBkYXRhLCB1c2Ugc291cmNlOyBvdGhlcndpc2Ugc2hpZnQgY2FjaGVcbiAgICAgICAgICAgIGlmIChuZXdJbmRleCA8IGxvYWRlZExlbmd0aCAmJiBjb2xsZWN0aW9uSXRlbXNTb3VyY2VbbmV3SW5kZXhdKSB7XG4gICAgICAgICAgICAgIGNvbGxlY3Rpb25JdGVtc1tuZXdJbmRleF0gPSBjb2xsZWN0aW9uSXRlbXNTb3VyY2VbbmV3SW5kZXhdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gU2hpZnQgY2FjaGVkIGRhdGEgZm9yIGluZGljZXMgYmV5b25kIGxvYWRlZCByYW5nZVxuICAgICAgICAgICAgICBjb2xsZWN0aW9uSXRlbXNbbmV3SW5kZXhdID0gY29sbGVjdGlvbkl0ZW1zW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgY29sbGVjdGlvbkl0ZW1zW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmluYWxLZXlzID0gT2JqZWN0LmtleXMoY29sbGVjdGlvbkl0ZW1zKVxuICAgICAgICAgIC5tYXAoTnVtYmVyKVxuICAgICAgICAgIC5maWx0ZXIoKGspID0+ICFpc05hTihrKSlcbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW1JFTkRFUi1GSVhdIGNvbGxlY3Rpb25JdGVtcyBjYWNoZSBzaXplIEFGVEVSOiAke2ZpbmFsS2V5cy5sZW5ndGh9YCxcbiAgICAgICAgLy8gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtSRU5ERVItRklYXSBjb2xsZWN0aW9uSXRlbXMga2V5czogWyR7ZmluYWxLZXlzLnNsaWNlKDAsIDEwKS5qb2luKFwiLCBcIil9JHtmaW5hbEtleXMubGVuZ3RoID4gMTAgPyBcIi4uLlwiIDogXCJcIn1dYCxcbiAgICAgICAgLy8gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtSRU5ERVItRklYXSB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXM6ICR7dmlld3BvcnRTdGF0ZT8udG90YWxJdGVtc31gLFxuICAgICAgICAvLyApO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW1JFTkRFUi1GSVhdIHZpZXdwb3J0U3RhdGUudmlzaWJsZVJhbmdlOiAke0pTT04uc3RyaW5naWZ5KHZpZXdwb3J0U3RhdGU/LnZpc2libGVSYW5nZSl9YCxcbiAgICAgICAgLy8gKTtcblxuICAgICAgICAvLyBDaGVjayBmb3IgYW55IHVuZGVmaW5lZC9udWxsIHZhbHVlcyBpbiBmaXJzdCAzMCBpdGVtc1xuICAgICAgICBjb25zdCBiYWRJbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWluKDMwLCBmaW5hbEtleXMubGVuZ3RoKTsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgayA9IGZpbmFsS2V5c1tpXTtcbiAgICAgICAgICBpZiAoIWNvbGxlY3Rpb25JdGVtc1trXSB8fCBjb2xsZWN0aW9uSXRlbXNba10uX3BsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgICBiYWRJbmRpY2VzLnB1c2goayk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSByZW5kZXJlZCBlbGVtZW50IGF0IHRoaXMgaW5kZXhcbiAgICAgICAgY29uc3QgZXhpc3RpbmdFbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50cy5nZXQoaW5kZXgpO1xuICAgICAgICBpZiAoZXhpc3RpbmdFbGVtZW50ICYmIGV4aXN0aW5nRWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgcmVsZWFzZUVsZW1lbnQoZXhpc3RpbmdFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXJlZEVsZW1lbnRzLmRlbGV0ZShpbmRleCk7XG5cbiAgICAgICAgLy8gU2hpZnQgcmVuZGVyZWQgZWxlbWVudHMgaW5kaWNlcyBkb3duXG4gICAgICAgIGNvbnN0IHJlbmRlcmVkS2V5cyA9IEFycmF5LmZyb20ocmVuZGVyZWRFbGVtZW50cy5rZXlzKCkpLnNvcnQoXG4gICAgICAgICAgKGEsIGIpID0+IGEgLSBiLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBuZXdSZW5kZXJlZEVsZW1lbnRzID0gbmV3IE1hcDxudW1iZXIsIEhUTUxFbGVtZW50PigpO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiByZW5kZXJlZEtleXMpIHtcbiAgICAgICAgICBpZiAoa2V5ID4gaW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnRzLmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgLy8gVXBkYXRlIGRhdGEtaW5kZXggYXR0cmlidXRlXG4gICAgICAgICAgICAgIGVsZW1lbnQuZGF0YXNldC5pbmRleCA9IFN0cmluZyhrZXkgLSAxKTtcbiAgICAgICAgICAgICAgbmV3UmVuZGVyZWRFbGVtZW50cy5zZXQoa2V5IC0gMSwgZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChrZXkgPCBpbmRleCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICBuZXdSZW5kZXJlZEVsZW1lbnRzLnNldChrZXksIGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZW5kZXJlZEVsZW1lbnRzLmNsZWFyKCk7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgZWxlbWVudF0gb2YgbmV3UmVuZGVyZWRFbGVtZW50cykge1xuICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2V0KGtleSwgZWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWNyZW1lbnQgdG90YWxJdGVtcyBOT1cgc28gcmVuZGVySXRlbXMoKSB1c2VzIHRoZSBjb3JyZWN0IGNvdW50XG4gICAgICAgIC8vIHNldFRvdGFsSXRlbXMoKSB3aWxsIGJlIGNhbGxlZCBsYXRlciBieSB0aGUgQVBJLCB3aGljaCB3aWxsIGVtaXRcbiAgICAgICAgLy8gdmlld3BvcnQ6dG90YWwtaXRlbXMtY2hhbmdlZCBmb3IgdmlydHVhbCBzaXplIHJlY2FsY3VsYXRpb25cbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUgJiYgdmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zID4gMCkge1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcy0tO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzZXQgdmlzaWJsZSByYW5nZSB0byBmb3JjZSByZS1yZW5kZXJcbiAgICAgICAgY3VycmVudFZpc2libGVSYW5nZSA9IHsgc3RhcnQ6IC0xLCBlbmQ6IC0xIH07XG5cbiAgICAgICAgLy8gRW1pdCBjb21wbGV0aW9uIGV2ZW50XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtOnJlbW92ZWRcIiwge1xuICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEFmdGVyIGl0ZW0gcmVtb3ZhbCwgY2xlYXIgQUxMIGxvYWRlZFJhbmdlcyBhbmQgY29sbGVjdGlvbkl0ZW1zIGNhY2hlXG4gICAgICAgIC8vIFRoaXMgZm9yY2VzIGEgY29tcGxldGUgcmVsb2FkIHdoaWNoIGlzIG1vcmUgcmVsaWFibGUgdGhhbiB0cnlpbmcgdG9cbiAgICAgICAgLy8gdHJhY2sgc2hpZnRlZCBpbmRpY2VzLiBUaGUgaXRlbXMgYXJyYXkgaGFzIGJlZW4gc3BsaWNlZCBhbmQgYWxsIGluZGljZXNcbiAgICAgICAgLy8gYXJlIG5vdyBkaWZmZXJlbnQgZnJvbSB3aGF0IGxvYWRlZFJhbmdlcyB0aGlua3MgdGhleSBhcmUuXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSk/LmNvbGxlY3Rpb247XG4gICAgICAgIGlmIChjb2xsZWN0aW9uPy5nZXRMb2FkZWRSYW5nZXMpIHtcbiAgICAgICAgICBjb25zdCBsb2FkZWRSYW5nZXMgPSBjb2xsZWN0aW9uLmdldExvYWRlZFJhbmdlcygpO1xuICAgICAgICAgIGxvYWRlZFJhbmdlcy5jbGVhcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgdGhlIGVudGlyZSBjb2xsZWN0aW9uSXRlbXMgY2FjaGUgLSBpdCdzIGFsbCBzdGFsZSBhZnRlciByZW1vdmFsXG4gICAgICAgIC8vIEtlZXAgb25seSB0aGUgaXRlbXMgd2UgYWN0dWFsbHkgaGF2ZSBpbiB0aGUgc291cmNlIGFycmF5XG4gICAgICAgIGNvbnN0IGxvYWRlZEl0ZW1zQ291bnQgPSBjb2xsZWN0aW9uSXRlbXNTb3VyY2UubGVuZ3RoO1xuICAgICAgICBjb25zdCBjYWNoZUtleXMgPSBPYmplY3Qua2V5cyhjb2xsZWN0aW9uSXRlbXMpXG4gICAgICAgICAgLm1hcChOdW1iZXIpXG4gICAgICAgICAgLmZpbHRlcigoaykgPT4gIWlzTmFOKGspKTtcbiAgICAgICAgY2FjaGVLZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgIGlmIChrZXkgPj0gbG9hZGVkSXRlbXNDb3VudCkge1xuICAgICAgICAgICAgZGVsZXRlIGNvbGxlY3Rpb25JdGVtc1trZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVHJpZ2dlciByZWxvYWQgb2YgdmlzaWJsZSByYW5nZVxuICAgICAgICBjb25zdCB2aXNpYmxlUmFuZ2UgPSBjb21wb25lbnQudmlld3BvcnQ/LmdldFZpc2libGVSYW5nZT8uKCk7XG4gICAgICAgIGlmICh2aXNpYmxlUmFuZ2UgJiYgY29sbGVjdGlvbj8ubG9hZE1pc3NpbmdSYW5nZXMpIHtcbiAgICAgICAgICBjb2xsZWN0aW9uLmxvYWRNaXNzaW5nUmFuZ2VzKFxuICAgICAgICAgICAgeyBzdGFydDogMCwgZW5kOiBNYXRoLm1heCh2aXNpYmxlUmFuZ2UuZW5kLCBsb2FkZWRJdGVtc0NvdW50KSB9LFxuICAgICAgICAgICAgXCJpdGVtLXJlbW92YWxcIixcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJpZ2dlciByZS1yZW5kZXJcbiAgICAgICAgcmVuZGVySXRlbXMoKTtcbiAgICAgICAgaXNSZW1vdmluZ0l0ZW0gPSBmYWxzZTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGl0ZW1zIGFkZCByZXF1ZXN0cyBmcm9tIEFQSVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJpdGVtczphZGQtcmVxdWVzdFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaXRlbXM6IG5ld0l0ZW1zLCBwb3NpdGlvbiwgcHJldmlvdXNDb3VudCB9ID0gZGF0YTtcblxuICAgICAgICBpZiAoIW5ld0l0ZW1zIHx8IG5ld0l0ZW1zLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIEdldCB0aGUgc291cmNlIG9mIHRydXRoIC0gY29sbGVjdGlvbi5pdGVtcyBoYXMgYWxyZWFkeSBiZWVuIG1vZGlmaWVkIGJ5IGFwaS50c1xuICAgICAgICBjb25zdCBjb2xsZWN0aW9uSXRlbXNTb3VyY2UgPVxuICAgICAgICAgIChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uPy5pdGVtcyB8fFxuICAgICAgICAgIChjb21wb25lbnQgYXMgYW55KS5pdGVtcyB8fFxuICAgICAgICAgIFtdO1xuXG4gICAgICAgIGNvbnN0IGl0ZW1zQWRkZWQgPSBuZXdJdGVtcy5sZW5ndGg7XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSBcInN0YXJ0XCIpIHtcbiAgICAgICAgICAvLyBJdGVtcyB3ZXJlIHByZXBlbmRlZCAtIHNoaWZ0IGFsbCBleGlzdGluZyBpbmRpY2VzIHVwXG4gICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGNvbGxlY3Rpb25JdGVtcylcbiAgICAgICAgICAgIC5tYXAoTnVtYmVyKVxuICAgICAgICAgICAgLmZpbHRlcigoaykgPT4gIWlzTmFOKGspKVxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGIgLSBhKTsgLy8gU29ydCBkZXNjZW5kaW5nIHRvIGF2b2lkIG92ZXJ3cml0ZXNcblxuICAgICAgICAgIC8vIFNoaWZ0IGFsbCBleGlzdGluZyBpbmRpY2VzIHVwIGJ5IHRoZSBudW1iZXIgb2YgaXRlbXMgYWRkZWRcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdJbmRleCA9IGtleSArIGl0ZW1zQWRkZWQ7XG4gICAgICAgICAgICBjb2xsZWN0aW9uSXRlbXNbbmV3SW5kZXhdID0gY29sbGVjdGlvbkl0ZW1zW2tleV07XG4gICAgICAgICAgICBkZWxldGUgY29sbGVjdGlvbkl0ZW1zW2tleV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQWRkIHRoZSBuZXcgaXRlbXMgYXQgdGhlIHN0YXJ0XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtc0FkZGVkOyBpKyspIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb25JdGVtc1tpXSA9IG5ld0l0ZW1zW2ldO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNoaWZ0IHJlbmRlcmVkIGVsZW1lbnRzIGluZGljZXMgdXBcbiAgICAgICAgICBjb25zdCByZW5kZXJlZEtleXMgPSBBcnJheS5mcm9tKHJlbmRlcmVkRWxlbWVudHMua2V5cygpKS5zb3J0KFxuICAgICAgICAgICAgKGEsIGIpID0+IGIgLSBhLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgbmV3UmVuZGVyZWRFbGVtZW50cyA9IG5ldyBNYXA8bnVtYmVyLCBIVE1MRWxlbWVudD4oKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiByZW5kZXJlZEtleXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnRzLmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgY29uc3QgbmV3SW5kZXggPSBrZXkgKyBpdGVtc0FkZGVkO1xuICAgICAgICAgICAgICBlbGVtZW50LmRhdGFzZXQuaW5kZXggPSBTdHJpbmcobmV3SW5kZXgpO1xuICAgICAgICAgICAgICBuZXdSZW5kZXJlZEVsZW1lbnRzLnNldChuZXdJbmRleCwgZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuY2xlYXIoKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGVsZW1lbnRdIG9mIG5ld1JlbmRlcmVkRWxlbWVudHMpIHtcbiAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2V0KGtleSwgZWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEl0ZW1zIHdlcmUgYXBwZW5kZWQgLSBqdXN0IGFkZCB0aGVtIGF0IHRoZSBlbmRcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zQWRkZWQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwcmV2aW91c0NvdW50ICsgaTtcbiAgICAgICAgICAgIGNvbGxlY3Rpb25JdGVtc1tpbmRleF0gPSBuZXdJdGVtc1tpXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgdG90YWxJdGVtcyBpbiB2aWV3cG9ydFN0YXRlXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zID1cbiAgICAgICAgICAgICh2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgfHwgMCkgKyBpdGVtc0FkZGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzZXQgdmlzaWJsZSByYW5nZSB0byBmb3JjZSByZS1yZW5kZXJcbiAgICAgICAgY3VycmVudFZpc2libGVSYW5nZSA9IHsgc3RhcnQ6IC0xLCBlbmQ6IC0xIH07XG5cbiAgICAgICAgLy8gQ2xlYXIgbG9hZGVkUmFuZ2VzIHRvIGVuc3VyZSBwcm9wZXIgcmVsb2FkIHRyYWNraW5nXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSk/LmNvbGxlY3Rpb247XG4gICAgICAgIGlmIChjb2xsZWN0aW9uPy5nZXRMb2FkZWRSYW5nZXMpIHtcbiAgICAgICAgICBjb25zdCBsb2FkZWRSYW5nZXMgPSBjb2xsZWN0aW9uLmdldExvYWRlZFJhbmdlcygpO1xuICAgICAgICAgIGxvYWRlZFJhbmdlcy5jbGVhcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJpZ2dlciByZS1yZW5kZXJcbiAgICAgICAgcmVuZGVySXRlbXMoKTtcblxuICAgICAgICAvLyBFbWl0IGNvbXBsZXRpb24gZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW1zOnJlbmRlci1jb21wbGV0ZVwiLCB7XG4gICAgICAgICAgaXRlbXM6IG5ld0l0ZW1zLFxuICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgIHRvdGFsOiB2aWV3cG9ydFN0YXRlPy50b3RhbEl0ZW1zIHx8IDAsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgY29sbGVjdGlvbiBpdGVtcyBldmljdGVkIC0gY2xlYW4gdXAgb3VyIGNhY2hlIHRvb1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJjb2xsZWN0aW9uOml0ZW1zLWV2aWN0ZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB7IGtlZXBTdGFydCwga2VlcEVuZCwgZXZpY3RlZENvdW50IH0gPSBkYXRhO1xuICAgICAgICBsZXQgY2xlYW5lZENvdW50ID0gMDtcblxuICAgICAgICAvLyBSZW1vdmUgZXZpY3RlZCBpdGVtcyBmcm9tIG91ciBjYWNoZVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjb2xsZWN0aW9uSXRlbXMpIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KGtleSwgMTApO1xuICAgICAgICAgIGlmIChpbmRleCA8IGtlZXBTdGFydCB8fCBpbmRleCA+IGtlZXBFbmQpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjb2xsZWN0aW9uSXRlbXNbaW5kZXhdO1xuICAgICAgICAgICAgY2xlYW5lZENvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBjb2xsZWN0aW9uIGRhdGEgbG9hZGVkXG4gICAgICBjb21wb25lbnQub24/LihcImNvbGxlY3Rpb246cmFuZ2UtbG9hZGVkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFkYXRhLml0ZW1zPy5sZW5ndGgpIHJldHVybjtcblxuICAgICAgICAvLyBBbmFseXplIGRhdGEgc3RydWN0dXJlIG9uIGZpcnN0IGxvYWRcbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJzID0gKGNvbXBvbmVudCBhcyBhbnkpLnBsYWNlaG9sZGVycztcbiAgICAgICAgaWYgKHBsYWNlaG9sZGVycyAmJiAhcGxhY2Vob2xkZXJzLmhhc0FuYWx5emVkU3RydWN0dXJlKCkpIHtcbiAgICAgICAgICBwbGFjZWhvbGRlcnMuYW5hbHl6ZURhdGFTdHJ1Y3R1cmUoZGF0YS5pdGVtcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgY29sbGVjdGlvbiBpdGVtcyBhbmQgcmVwbGFjZSBwbGFjZWhvbGRlcnNcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtSRU5ERVItRklYXSBVcGRhdGluZyBjb2xsZWN0aW9uSXRlbXMgZm9yIGluZGljZXMgJHtkYXRhLm9mZnNldH0gdG8gJHtkYXRhLm9mZnNldCArIGRhdGEuaXRlbXMubGVuZ3RoIC0gMX1gLFxuICAgICAgICAvLyApO1xuICAgICAgICBsZXQgc2tpcHBlZENvdW50ID0gMDtcbiAgICAgICAgZGF0YS5pdGVtcy5mb3JFYWNoKChpdGVtOiBhbnksIGk6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gZGF0YS5vZmZzZXQgKyBpO1xuICAgICAgICAgIGNvbnN0IG9sZEl0ZW0gPSBjb2xsZWN0aW9uSXRlbXNbaW5kZXhdO1xuICAgICAgICAgIGNvbGxlY3Rpb25JdGVtc1tpbmRleF0gPSBpdGVtO1xuXG4gICAgICAgICAgLy8gUmVwbGFjZSBwbGFjZWhvbGRlciBpbiBET00gaWYgbmVlZGVkXG4gICAgICAgICAgY29uc3Qgd2FzUGxhY2Vob2xkZXIgPSBvbGRJdGVtICYmIGlzUGxhY2Vob2xkZXIob2xkSXRlbSk7XG4gICAgICAgICAgY29uc3QgaGFzRWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuaGFzKGluZGV4KTtcbiAgICAgICAgICBpZiAod2FzUGxhY2Vob2xkZXIgJiYgaGFzRWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGluZGV4KTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgIGNvbnN0IG5ld0VsZW1lbnQgPSByZW5kZXJJdGVtKGl0ZW0sIGluZGV4KTtcbiAgICAgICAgICAgICAgaWYgKG5ld0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgcGxhY2Vob2xkZXIgY2xhc3NlcyBmcm9tIHdyYXBwZXJcbiAgICAgICAgICAgICAgICByZW1vdmVDbGFzcyhuZXdFbGVtZW50LCBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuQ0xBU1MpO1xuICAgICAgICAgICAgICAgIC8vIEFsc28gcmVtb3ZlIGZyb20gaW5uZXIgZWxlbWVudCAoZm9yIHN0cmluZyB0ZW1wbGF0ZXMpXG4gICAgICAgICAgICAgICAgaWYgKG5ld0VsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzKFxuICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuQ0xBU1MsXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEFkZCByZXBsYWNlZCBjbGFzcyBmb3IgZmFkZS1pbiBhbmltYXRpb25cbiAgICAgICAgICAgICAgICBhZGRDbGFzcyhuZXdFbGVtZW50LCBcInZpZXdwb3J0LWl0ZW0tLXJlcGxhY2VkXCIpO1xuXG4gICAgICAgICAgICAgICAgLy8gQ29weSBwb3NpdGlvbiBhbmQgcmVwbGFjZVxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obmV3RWxlbWVudC5zdHlsZSwge1xuICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGVsZW1lbnQuc3R5bGUucG9zaXRpb24sXG4gICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IGVsZW1lbnQuc3R5bGUudHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgICAgd2lkdGg6IGVsZW1lbnQuc3R5bGUud2lkdGgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5wYXJlbnROb2RlPy5yZXBsYWNlQ2hpbGQobmV3RWxlbWVudCwgZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5zZXQoaW5kZXgsIG5ld0VsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHJlbGVhc2VFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSByZXBsYWNlZCBjbGFzcyBhZnRlciBhbmltYXRpb24gY29tcGxldGVzXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICByZW1vdmVDbGFzcyhuZXdFbGVtZW50LCBcInZpZXdwb3J0LWl0ZW0tLXJlcGxhY2VkXCIpO1xuICAgICAgICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gcmVuZGVySXRlbSByZXR1cm5lZCBudWxsIC0gc3RpbGwgcmVsZWFzZSB0aGUgb2xkIGVsZW1lbnRcbiAgICAgICAgICAgICAgICByZWxlYXNlRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLmRlbGV0ZShpbmRleCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHdhc1BsYWNlaG9sZGVyICYmICFoYXNFbGVtZW50KSB7XG4gICAgICAgICAgICBza2lwcGVkQ291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElmIHdlIHNraXBwZWQgaXRlbXMgYmVjYXVzZSBubyBlbGVtZW50LCB0cmlnZ2VyIGEgcmVuZGVyIHRvIHNob3cgdGhlbVxuICAgICAgICBpZiAoc2tpcHBlZENvdW50ID4gMCAmJiB2aWV3cG9ydFN0YXRlPy52aXNpYmxlUmFuZ2UpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHZpZXdwb3J0U3RhdGUudmlzaWJsZVJhbmdlO1xuICAgICAgICAgIGNvbnN0IGxvYWRlZFN0YXJ0ID0gZGF0YS5vZmZzZXQ7XG4gICAgICAgICAgY29uc3QgbG9hZGVkRW5kID0gZGF0YS5vZmZzZXQgKyBkYXRhLml0ZW1zLmxlbmd0aCAtIDE7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgbG9hZGVkIGRhdGEgb3ZlcmxhcHMgd2l0aCB2aXNpYmxlIHJhbmdlXG4gICAgICAgICAgaWYgKGxvYWRlZFN0YXJ0IDw9IGVuZCAmJiBsb2FkZWRFbmQgPj0gc3RhcnQpIHtcbiAgICAgICAgICAgIHJlbmRlckl0ZW1zKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byByZW5kZXJcbiAgICAgICAgY29uc3QgeyB2aXNpYmxlUmFuZ2UgfSA9IHZpZXdwb3J0U3RhdGUgfHwge307XG4gICAgICAgIGlmICh2aXNpYmxlUmFuZ2UpIHtcbiAgICAgICAgICBjb25zdCByZW5kZXJTdGFydCA9IE1hdGgubWF4KDAsIHZpc2libGVSYW5nZS5zdGFydCAtIG92ZXJzY2FuKTtcbiAgICAgICAgICBjb25zdCByZW5kZXJFbmQgPSBNYXRoLm1pbihcbiAgICAgICAgICAgIHZpZXdwb3J0U3RhdGU/LnRvdGFsSXRlbXMgPz8gMCAtIDEsXG4gICAgICAgICAgICB2aXNpYmxlUmFuZ2UuZW5kICsgb3ZlcnNjYW4sXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBsb2FkZWRTdGFydCA9IGRhdGEub2Zmc2V0O1xuICAgICAgICAgIGNvbnN0IGxvYWRlZEVuZCA9IGRhdGEub2Zmc2V0ICsgZGF0YS5pdGVtcy5sZW5ndGggLSAxO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgZm9yIHBsYWNlaG9sZGVycyBpbiByYW5nZVxuICAgICAgICAgIGNvbnN0IGhhc1BsYWNlaG9sZGVyc0luUmFuZ2UgPSBBcnJheS5mcm9tKFxuICAgICAgICAgICAgeyBsZW5ndGg6IE1hdGgubWluKGxvYWRlZEVuZCwgcmVuZGVyRW5kKSAtIGxvYWRlZFN0YXJ0ICsgMSB9LFxuICAgICAgICAgICAgKF8sIGkpID0+IGNvbGxlY3Rpb25JdGVtc1tsb2FkZWRTdGFydCArIGldLFxuICAgICAgICAgICkuc29tZSgoaXRlbSkgPT4gaXRlbSAmJiBpc1BsYWNlaG9sZGVyKGl0ZW0pKTtcblxuICAgICAgICAgIGNvbnN0IG5lZWRzUmVuZGVyID1cbiAgICAgICAgICAgIChsb2FkZWRTdGFydCA8PSByZW5kZXJFbmQgJiZcbiAgICAgICAgICAgICAgbG9hZGVkRW5kID49IHJlbmRlclN0YXJ0ICYmXG4gICAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2l6ZSA8IHJlbmRlckVuZCAtIHJlbmRlclN0YXJ0ICsgMSkgfHxcbiAgICAgICAgICAgIGhhc1BsYWNlaG9sZGVyc0luUmFuZ2U7XG5cbiAgICAgICAgICBpZiAobmVlZHNSZW5kZXIpIHJlbmRlckl0ZW1zKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGV2ZW50c1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkXCIsIHJlbmRlckl0ZW1zKTtcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6c2Nyb2xsXCIsIHVwZGF0ZUl0ZW1Qb3NpdGlvbnMpO1xuXG4gICAgICAvLyBVcGRhdGUgaXRlbXMgY29udGFpbmVyIGhlaWdodCB3aGVuIHZpcnR1YWwgc2l6ZSBjaGFuZ2VzXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnZpcnR1YWwtc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHZpZXdwb3J0U3RhdGU/Lml0ZW1zQ29udGFpbmVyICYmXG4gICAgICAgICAgZGF0YS50b3RhbFZpcnR1YWxTaXplICE9PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5pdGVtc0NvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBgJHtkYXRhLnRvdGFsVmlydHVhbFNpemV9cHhgO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIFRlbXBsYXRlIGhlbHBlcnNcbiAgICBjb25zdCBnZXREZWZhdWx0VGVtcGxhdGUgPSAoKSA9PiAoaXRlbTogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAvLyBVc2UgbGF5b3V0IHN5c3RlbSBmb3IgZGVmYXVsdCB0ZW1wbGF0ZVxuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIHRhZzogXCJkaXZcIixcbiAgICAgICAgICBjbGFzczogXCJ2aWV3cG9ydC1pdGVtXCIsXG4gICAgICAgICAgdGV4dDpcbiAgICAgICAgICAgIHR5cGVvZiBpdGVtID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgID8gaXRlbS5uYW1lIHx8IGl0ZW0ubGFiZWwgfHwgaXRlbS50ZXh0IHx8IGBJdGVtICR7aW5kZXh9YFxuICAgICAgICAgICAgICA6IFN0cmluZyhpdGVtKSxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfTtcblxuICAgIC8vIFByb2Nlc3MgbGF5b3V0IHNjaGVtYSB3aXRoIGl0ZW0gZGF0YSBzdWJzdGl0dXRpb25cbiAgICBjb25zdCBwcm9jZXNzTGF5b3V0U2NoZW1hID0gKFxuICAgICAgc2NoZW1hOiBhbnksXG4gICAgICBpdGVtOiBhbnksXG4gICAgICBpbmRleDogbnVtYmVyLFxuICAgICk6IGFueSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHNjaGVtYSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAvLyBIYW5kbGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uIGxpa2Uge3tuYW1lfX0sIHt7aW5kZXh9fVxuICAgICAgICByZXR1cm4gc2NoZW1hLnJlcGxhY2UoL1xce1xceyhbXn1dKylcXH1cXH0vZywgKG1hdGNoLCBrZXkpID0+IHtcbiAgICAgICAgICBpZiAoa2V5ID09PSBcImluZGV4XCIpIHJldHVybiBTdHJpbmcoaW5kZXgpO1xuICAgICAgICAgIGlmIChrZXkgPT09IFwiaXRlbVwiKSByZXR1cm4gU3RyaW5nKGl0ZW0pO1xuXG4gICAgICAgICAgLy8gSGFuZGxlIG5lc3RlZCBwcm9wZXJ0aWVzIGxpa2Uge3t1c2VyLm5hbWV9fVxuICAgICAgICAgIGNvbnN0IHZhbHVlID0ga2V5LnNwbGl0KFwiLlwiKS5yZWR1Y2UoKG9iajogYW55LCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBvYmo/Lltwcm9wLnRyaW0oKV07XG4gICAgICAgICAgfSwgaXRlbSk7XG5cbiAgICAgICAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IFN0cmluZyh2YWx1ZSkgOiBtYXRjaDtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYSkpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS5tYXAoKGNoaWxkKSA9PiBwcm9jZXNzTGF5b3V0U2NoZW1hKGNoaWxkLCBpdGVtLCBpbmRleCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHNjaGVtYSA9PT0gXCJvYmplY3RcIiAmJiBzY2hlbWEgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgcHJvY2Vzc2VkOiBhbnkgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2NoZW1hKSkge1xuICAgICAgICAgIHByb2Nlc3NlZFtrZXldID0gcHJvY2Vzc0xheW91dFNjaGVtYSh2YWx1ZSwgaXRlbSwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9jZXNzZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzY2hlbWE7XG4gICAgfTtcblxuICAgIC8vIFBvc2l0aW9uIGNhbGN1bGF0aW9uXG4gICAgY29uc3QgY2FsY3VsYXRlSXRlbVBvc2l0aW9uID0gKFxuICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgIHNjcm9sbFBvc2l0aW9uOiBudW1iZXIsXG4gICAgICB0b3RhbEl0ZW1zOiBudW1iZXIsXG4gICAgICBpdGVtU2l6ZTogbnVtYmVyLFxuICAgICAgdmlydHVhbFRvdGFsU2l6ZTogbnVtYmVyLFxuICAgICAgY29udGFpbmVyU2l6ZTogbnVtYmVyLFxuICAgICAgdGFyZ2V0U2Nyb2xsSW5kZXg/OiBudW1iZXIsXG4gICAgKTogbnVtYmVyID0+IHtcbiAgICAgIGNvbnN0IGFjdHVhbFRvdGFsU2l6ZSA9IHRvdGFsSXRlbXMgKiBpdGVtU2l6ZTtcbiAgICAgIGNvbnN0IGlzQ29tcHJlc3NlZCA9XG4gICAgICAgIGFjdHVhbFRvdGFsU2l6ZSA+IHZpcnR1YWxUb3RhbFNpemUgJiYgdmlydHVhbFRvdGFsU2l6ZSA+IDA7XG5cbiAgICAgIC8vIElmIHdlIGhhdmUgYSB0YXJnZXRTY3JvbGxJbmRleCAoZnJvbSBpbml0aWFsU2Nyb2xsSW5kZXgpLCB1c2UgaXQgZGlyZWN0bHlcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBpdGVtcyBhcmUgcG9zaXRpb25lZCBjb3JyZWN0bHkgZXZlbiB3aXRoIGNvbXByZXNzaW9uXG4gICAgICBpZiAodGFyZ2V0U2Nyb2xsSW5kZXggIT09IHVuZGVmaW5lZCAmJiB0YXJnZXRTY3JvbGxJbmRleCA+IDApIHtcbiAgICAgICAgLy8gUG9zaXRpb24gaXRlbXMgcmVsYXRpdmUgdG8gdGhlIHRhcmdldCBpbmRleFxuICAgICAgICAvLyBUaGUgdGFyZ2V0IGluZGV4IHNob3VsZCBhcHBlYXIgYXQgdGhlIHRvcCBvZiB0aGUgdmlld3BvcnRcbiAgICAgICAgcmV0dXJuIChpbmRleCAtIHRhcmdldFNjcm9sbEluZGV4KSAqIGl0ZW1TaXplO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzQ29tcHJlc3NlZCB8fCB0b3RhbEl0ZW1zID09PSAwKSB7XG4gICAgICAgIHJldHVybiBpbmRleCAqIGl0ZW1TaXplIC0gc2Nyb2xsUG9zaXRpb247XG4gICAgICB9XG5cbiAgICAgIC8vIENvbXByZXNzZWQgc3BhY2UgaGFuZGxpbmdcbiAgICAgIGNvbnN0IG1heFNjcm9sbFBvc2l0aW9uID0gdmlydHVhbFRvdGFsU2l6ZSAtIGNvbnRhaW5lclNpemU7XG4gICAgICBjb25zdCBkaXN0YW5jZUZyb21Cb3R0b20gPSBtYXhTY3JvbGxQb3NpdGlvbiAtIHNjcm9sbFBvc2l0aW9uO1xuICAgICAgY29uc3QgbmVhckJvdHRvbVRocmVzaG9sZCA9IGNvbnRhaW5lclNpemU7XG5cbiAgICAgIGlmIChcbiAgICAgICAgZGlzdGFuY2VGcm9tQm90dG9tIDw9IG5lYXJCb3R0b21UaHJlc2hvbGQgJiZcbiAgICAgICAgZGlzdGFuY2VGcm9tQm90dG9tID49IC0xXG4gICAgICApIHtcbiAgICAgICAgLy8gTmVhciBib3R0b20gaW50ZXJwb2xhdGlvblxuICAgICAgICBjb25zdCBpdGVtc0F0Qm90dG9tID0gTWF0aC5mbG9vcihjb250YWluZXJTaXplIC8gaXRlbVNpemUpO1xuICAgICAgICBjb25zdCBmaXJzdFZpc2libGVBdEJvdHRvbSA9IE1hdGgubWF4KDAsIHRvdGFsSXRlbXMgLSBpdGVtc0F0Qm90dG9tKTtcbiAgICAgICAgY29uc3Qgc2Nyb2xsUmF0aW8gPSBzY3JvbGxQb3NpdGlvbiAvIHZpcnR1YWxUb3RhbFNpemU7XG4gICAgICAgIGNvbnN0IGV4YWN0U2Nyb2xsSW5kZXggPSBzY3JvbGxSYXRpbyAqIHRvdGFsSXRlbXM7XG4gICAgICAgIGNvbnN0IGludGVycG9sYXRpb24gPSBNYXRoLm1heChcbiAgICAgICAgICAwLFxuICAgICAgICAgIE1hdGgubWluKDEsIDEgLSBkaXN0YW5jZUZyb21Cb3R0b20gLyBuZWFyQm90dG9tVGhyZXNob2xkKSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBib3R0b21Qb3NpdGlvbiA9IChpbmRleCAtIGZpcnN0VmlzaWJsZUF0Qm90dG9tKSAqIGl0ZW1TaXplO1xuICAgICAgICBjb25zdCBub3JtYWxQb3NpdGlvbiA9IChpbmRleCAtIGV4YWN0U2Nyb2xsSW5kZXgpICogaXRlbVNpemU7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbm9ybWFsUG9zaXRpb24gKyAoYm90dG9tUG9zaXRpb24gLSBub3JtYWxQb3NpdGlvbikgKiBpbnRlcnBvbGF0aW9uXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIE5vcm1hbCBjb21wcmVzc2VkIHNjcm9sbGluZ1xuICAgICAgY29uc3Qgc2Nyb2xsUmF0aW8gPSBzY3JvbGxQb3NpdGlvbiAvIHZpcnR1YWxUb3RhbFNpemU7XG4gICAgICByZXR1cm4gKGluZGV4IC0gc2Nyb2xsUmF0aW8gKiB0b3RhbEl0ZW1zKSAqIGl0ZW1TaXplO1xuICAgIH07XG5cbiAgICAvLyBSZW5kZXIgc2luZ2xlIGl0ZW1cbiAgICBjb25zdCByZW5kZXJJdGVtID0gKGl0ZW06IGFueSwgaW5kZXg6IG51bWJlcik6IEhUTUxFbGVtZW50IHwgbnVsbCA9PiB7XG4gICAgICBjb25zdCBpdGVtVGVtcGxhdGUgPSB0ZW1wbGF0ZSB8fCBnZXREZWZhdWx0VGVtcGxhdGUoKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gaXRlbVRlbXBsYXRlKGl0ZW0sIGluZGV4KTtcbiAgICAgICAgbGV0IGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHJlc3VsdCBpcyBhIGxheW91dCBzY2hlbWEgKGFycmF5IG9yIG9iamVjdClcbiAgICAgICAgaWYgKFxuICAgICAgICAgIEFycmF5LmlzQXJyYXkocmVzdWx0KSB8fFxuICAgICAgICAgICh0eXBlb2YgcmVzdWx0ID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICByZXN1bHQgIT09IG51bGwgJiZcbiAgICAgICAgICAgICEocmVzdWx0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBQcm9jZXNzIHNjaGVtYSB0byBzdWJzdGl0dXRlIHZhcmlhYmxlc1xuICAgICAgICAgIGNvbnN0IHByb2Nlc3NlZFNjaGVtYSA9IHByb2Nlc3NMYXlvdXRTY2hlbWEocmVzdWx0LCBpdGVtLCBpbmRleCk7XG5cbiAgICAgICAgICAvLyBVc2UgbGF5b3V0IHN5c3RlbSB0byBjcmVhdGUgZWxlbWVudFxuICAgICAgICAgIGNvbnN0IGxheW91dFJlc3VsdCA9IGNyZWF0ZUxheW91dChwcm9jZXNzZWRTY2hlbWEpO1xuICAgICAgICAgIGVsZW1lbnQgPSBsYXlvdXRSZXN1bHQuZWxlbWVudDtcblxuICAgICAgICAgIC8vIElmIHRoZSBsYXlvdXQgY3JlYXRlZCBhIHdyYXBwZXIsIHVzZSBpdCBkaXJlY3RseVxuICAgICAgICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIC8vIEVsZW1lbnQgaXMgYWxyZWFkeSBjcmVhdGVkIGJ5IGxheW91dCBzeXN0ZW1cbiAgICAgICAgICAgIC8vIFN0b3JlIGxheW91dFJlc3VsdCBmb3IgY2xlYW51cCB3aGVuIGVsZW1lbnQgaXMgcmVsZWFzZWQgKHByZXZlbnRzIG1lbW9yeSBsZWFrKVxuICAgICAgICAgICAgbGF5b3V0UmVzdWx0cy5zZXQoZWxlbWVudCwgbGF5b3V0UmVzdWx0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRmFsbGJhY2sgaWYgbGF5b3V0IGRpZG4ndCBjcmVhdGUgYSBwcm9wZXIgZWxlbWVudFxuICAgICAgICAgICAgZWxlbWVudCA9IGdldFBvb2xlZEVsZW1lbnQoKTtcbiAgICAgICAgICAgIGlmIChsYXlvdXRSZXN1bHQuZWxlbWVudCkge1xuICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGxheW91dFJlc3VsdC5lbGVtZW50KTtcbiAgICAgICAgICAgICAgLy8gU3RvcmUgbGF5b3V0UmVzdWx0IG9uIHdyYXBwZXIgZWxlbWVudCBmb3IgY2xlYW51cFxuICAgICAgICAgICAgICBsYXlvdXRSZXN1bHRzLnNldChlbGVtZW50LCBsYXlvdXRSZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgLy8gUGFyc2UgSFRNTCB1c2luZyB0ZW1wbGF0ZSBlbGVtZW50IC0gb3B0aW1pemVkIHBhdGhcbiAgICAgICAgICAvLyBNb3ZlIG5vZGVzIGRpcmVjdGx5IGluc3RlYWQgb2YgY2xvbmluZyAtIG11Y2ggZmFzdGVyLCBubyBtZW1vcnkgb3ZlcmhlYWRcbiAgICAgICAgICB0ZW1wbGF0ZVBhcnNlci5pbm5lckhUTUwgPSByZXN1bHQ7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IHRlbXBsYXRlUGFyc2VyLmNvbnRlbnQ7XG5cbiAgICAgICAgICBpZiAoY29udGVudC5jaGlsZHJlbi5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIC8vIFNpbmdsZSByb290IGVsZW1lbnQgLSBtb3ZlIGRpcmVjdGx5IChmYXN0ZXIgdGhhbiBjbG9uZU5vZGUpXG4gICAgICAgICAgICBlbGVtZW50ID0gY29udGVudC5maXJzdEVsZW1lbnRDaGlsZCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGNvbnRlbnQucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgICAgICBhZGRDbGFzcyhlbGVtZW50LCBcIm10cmwtdmlld3BvcnQtaXRlbVwiKTtcbiAgICAgICAgICAgIGlmIChpc1BsYWNlaG9sZGVyKGl0ZW0pKSB7XG4gICAgICAgICAgICAgIGFkZENsYXNzKGVsZW1lbnQsIFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5DTEFTUyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE11bHRpcGxlIGNoaWxkcmVuIC0gbW92ZSBhbGwgaW50byBwb29sZWQgZWxlbWVudFxuICAgICAgICAgICAgZWxlbWVudCA9IGdldFBvb2xlZEVsZW1lbnQoKTtcbiAgICAgICAgICAgIHdoaWxlIChjb250ZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChjb250ZW50LmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAgIGVsZW1lbnQgPSBnZXRQb29sZWRFbGVtZW50KCk7XG4gICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChyZXN1bHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW1JlbmRlcmluZ10gSW52YWxpZCB0ZW1wbGF0ZSByZXN1bHQgZm9yIGl0ZW0gJHtpbmRleH1gKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBjbGFzc2VzXG4gICAgICAgIGlmICghaGFzQ2xhc3MoZWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtXCIpKVxuICAgICAgICAgIGFkZENsYXNzKGVsZW1lbnQsIFwidmlld3BvcnQtaXRlbVwiKTtcbiAgICAgICAgaWYgKGlzUGxhY2Vob2xkZXIoaXRlbSkpIHtcbiAgICAgICAgICBhZGRDbGFzcyhlbGVtZW50LCBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuQ0xBU1MpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudC5kYXRhc2V0LmluZGV4ID0gU3RyaW5nKGluZGV4KTtcblxuICAgICAgICAvLyBDb3B5IGRhdGEtaWQgZnJvbSBpdGVtIHRvIHZpZXdwb3J0IGVsZW1lbnQgZm9yIHNlbGVjdGlvbiBzdXBwb3J0XG4gICAgICAgIGNvbnN0IGl0ZW1JZCA9IGl0ZW0/Ll9pZCB8fCBpdGVtPy5pZDtcbiAgICAgICAgaWYgKGl0ZW1JZCAhPT0gdW5kZWZpbmVkICYmIGl0ZW1JZCAhPT0gbnVsbCkge1xuICAgICAgICAgIGVsZW1lbnQuZGF0YXNldC5pZCA9IFN0cmluZyhpdGVtSWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgW1JlbmRlcmluZ10gRXJyb3IgcmVuZGVyaW5nIGl0ZW0gJHtpbmRleH06YCwgZXJyb3IpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIHBvc2l0aW9uc1xuICAgIGNvbnN0IHVwZGF0ZUl0ZW1Qb3NpdGlvbnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUgfHwgcmVuZGVyZWRFbGVtZW50cy5zaXplID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgIGl0ZW1TaXplOiBpdGVtU2l6ZSxcbiAgICAgICAgdG90YWxJdGVtcyxcbiAgICAgICAgdmlydHVhbFRvdGFsU2l6ZSxcbiAgICAgICAgY29udGFpbmVyU2l6ZSxcbiAgICAgIH0gPSB2aWV3cG9ydFN0YXRlO1xuICAgICAgY29uc3QgYWN0dWFsVG90YWxTaXplID0gdG90YWxJdGVtcyAqIGl0ZW1TaXplO1xuICAgICAgY29uc3QgaXNDb21wcmVzc2VkID1cbiAgICAgICAgYWN0dWFsVG90YWxTaXplID4gdmlydHVhbFRvdGFsU2l6ZSAmJiB2aXJ0dWFsVG90YWxTaXplID4gMDtcblxuICAgICAgY29uc3Qgc29ydGVkSW5kaWNlcyA9IEFycmF5LmZyb20ocmVuZGVyZWRFbGVtZW50cy5rZXlzKCkpLnNvcnQoXG4gICAgICAgIChhLCBiKSA9PiBhIC0gYixcbiAgICAgICk7XG4gICAgICBpZiAoIXNvcnRlZEluZGljZXMubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGZpcnN0SW5kZXggPSBzb3J0ZWRJbmRpY2VzWzBdO1xuICAgICAgbGV0IGN1cnJlbnRQb3NpdGlvbiA9IDA7XG5cbiAgICAgIGlmIChpc0NvbXByZXNzZWQpIHtcbiAgICAgICAgY29uc3QgbWF4U2Nyb2xsID0gdmlydHVhbFRvdGFsU2l6ZSAtIGNvbnRhaW5lclNpemU7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlRnJvbUJvdHRvbSA9IG1heFNjcm9sbCAtIHNjcm9sbFBvc2l0aW9uO1xuXG4gICAgICAgIGlmIChkaXN0YW5jZUZyb21Cb3R0b20gPD0gY29udGFpbmVyU2l6ZSAmJiBkaXN0YW5jZUZyb21Cb3R0b20gPj0gLTEpIHtcbiAgICAgICAgICAvLyBOZWFyIGJvdHRvbSBpbnRlcnBvbGF0aW9uXG4gICAgICAgICAgY29uc3QgaXRlbXNBdEJvdHRvbSA9IE1hdGguZmxvb3IoY29udGFpbmVyU2l6ZSAvIGl0ZW1TaXplKTtcbiAgICAgICAgICBjb25zdCBmaXJzdFZpc2libGVBdEJvdHRvbSA9IE1hdGgubWF4KDAsIHRvdGFsSXRlbXMgLSBpdGVtc0F0Qm90dG9tKTtcbiAgICAgICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IHNjcm9sbFBvc2l0aW9uIC8gdmlydHVhbFRvdGFsU2l6ZTtcbiAgICAgICAgICBjb25zdCBleGFjdFNjcm9sbEluZGV4ID0gc2Nyb2xsUmF0aW8gKiB0b3RhbEl0ZW1zO1xuICAgICAgICAgIGNvbnN0IGludGVycG9sYXRpb24gPSBNYXRoLm1heChcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBNYXRoLm1pbigxLCAxIC0gZGlzdGFuY2VGcm9tQm90dG9tIC8gY29udGFpbmVyU2l6ZSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IGJvdHRvbVBvcyA9IChmaXJzdEluZGV4IC0gZmlyc3RWaXNpYmxlQXRCb3R0b20pICogaXRlbVNpemU7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsUG9zID0gKGZpcnN0SW5kZXggLSBleGFjdFNjcm9sbEluZGV4KSAqIGl0ZW1TaXplO1xuICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbiA9IG5vcm1hbFBvcyArIChib3R0b21Qb3MgLSBub3JtYWxQb3MpICogaW50ZXJwb2xhdGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IHNjcm9sbFBvc2l0aW9uIC8gdmlydHVhbFRvdGFsU2l6ZTtcbiAgICAgICAgICBjdXJyZW50UG9zaXRpb24gPSAoZmlyc3RJbmRleCAtIHNjcm9sbFJhdGlvICogdG90YWxJdGVtcykgKiBpdGVtU2l6ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudFBvc2l0aW9uID0gZmlyc3RJbmRleCAqIGl0ZW1TaXplIC0gc2Nyb2xsUG9zaXRpb247XG4gICAgICB9XG5cbiAgICAgIC8vIFBvc2l0aW9uIGVhY2ggaXRlbVxuICAgICAgc29ydGVkSW5kaWNlcy5mb3JFYWNoKChpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50cy5nZXQoaW5kZXgpO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgIGVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoJHtNYXRoLnJvdW5kKFxuICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uLFxuICAgICAgICAgICl9cHgpYDtcblxuICAgICAgICAgIC8vIFN0cmF0ZWdpYyBsb2cgZm9yIGxhc3QgaXRlbXNcbiAgICAgICAgICAvLyBpZiAoaW5kZXggPj0gdG90YWxJdGVtcyAtIDUpIHtcbiAgICAgICAgICAvLyAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgICBgW1JlbmRlcmluZ10gTGFzdCBpdGVtIHBvc2l0aW9uZWQ6IGluZGV4PSR7aW5kZXh9LCBwb3NpdGlvbj0ke01hdGgucm91bmQoXG4gICAgICAgICAgLy8gICAgICAgY3VycmVudFBvc2l0aW9uXG4gICAgICAgICAgLy8gICAgICl9cHgsIGl0ZW1TaXplPSR7aXRlbVNpemV9cHgsIHRvdGFsSXRlbXM9JHt0b3RhbEl0ZW1zfWBcbiAgICAgICAgICAvLyAgICk7XG4gICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgY3VycmVudFBvc2l0aW9uICs9IGl0ZW1TaXplO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gTWFpbiByZW5kZXIgZnVuY3Rpb25cbiAgICBjb25zdCByZW5kZXJJdGVtcyA9ICgpID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZT8uaXRlbXNDb250YWluZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7XG4gICAgICAgIHZpc2libGVSYW5nZSxcbiAgICAgICAgaXRlbXNDb250YWluZXIsXG4gICAgICAgIHRvdGFsSXRlbXMsXG4gICAgICAgIGl0ZW1TaXplLFxuICAgICAgICBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgY29udGFpbmVyU2l6ZSxcbiAgICAgICAgdmlydHVhbFRvdGFsU2l6ZSxcbiAgICAgIH0gPSB2aWV3cG9ydFN0YXRlO1xuXG4gICAgICAvLyBWYWxpZGF0ZSByYW5nZSAtIHNraXAgcmVuZGVyaW5nIGlmIG5vIGl0ZW1zIG9yIHJhbmdlIGlzIGludmFsaWRcbiAgICAgIGlmIChcbiAgICAgICAgIXZpc2libGVSYW5nZSB8fFxuICAgICAgICB0b3RhbEl0ZW1zIDw9IDAgfHxcbiAgICAgICAgdmlzaWJsZVJhbmdlLnN0YXJ0IDwgMCB8fFxuICAgICAgICB2aXNpYmxlUmFuZ2Uuc3RhcnQgPj0gdG90YWxJdGVtcyB8fFxuICAgICAgICB2aXNpYmxlUmFuZ2UuZW5kIDwgdmlzaWJsZVJhbmdlLnN0YXJ0IHx8XG4gICAgICAgIGlzTmFOKHZpc2libGVSYW5nZS5zdGFydCkgfHxcbiAgICAgICAgaXNOYU4odmlzaWJsZVJhbmdlLmVuZClcbiAgICAgICkge1xuICAgICAgICAvLyBJZiB0b3RhbEl0ZW1zIGlzIDAsIGNsZWFyIGFsbCByZW5kZXJlZCBlbGVtZW50cyB0byByZW1vdmUgc3RhbGUgcGxhY2Vob2xkZXJzXG4gICAgICAgIGlmICh0b3RhbEl0ZW1zIDw9IDAgJiYgcmVuZGVyZWRFbGVtZW50cy5zaXplID4gMCkge1xuICAgICAgICAgIEFycmF5LmZyb20ocmVuZGVyZWRFbGVtZW50cy5lbnRyaWVzKCkpLmZvckVhY2goKFtpbmRleCwgZWxlbWVudF0pID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnBhcmVudE5vZGUpIHJlbGVhc2VFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5kZWxldGUoaW5kZXgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB7IHN0YXJ0OiAtMSwgZW5kOiAtMSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgcmFuZ2UgY2hhbmdlZFxuICAgICAgaWYgKFxuICAgICAgICB2aXNpYmxlUmFuZ2Uuc3RhcnQgPT09IGN1cnJlbnRWaXNpYmxlUmFuZ2Uuc3RhcnQgJiZcbiAgICAgICAgdmlzaWJsZVJhbmdlLmVuZCA9PT0gY3VycmVudFZpc2libGVSYW5nZS5lbmQgJiZcbiAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5zaXplID4gMFxuICAgICAgKSB7XG4gICAgICAgIHVwZGF0ZUl0ZW1Qb3NpdGlvbnMoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsYXN0UmVuZGVyVGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCByZW5kZXJTdGFydCA9IE1hdGgubWF4KDAsIHZpc2libGVSYW5nZS5zdGFydCAtIG92ZXJzY2FuKTtcbiAgICAgIGNvbnN0IHJlbmRlckVuZCA9IE1hdGgubWluKHRvdGFsSXRlbXMgLSAxLCB2aXNpYmxlUmFuZ2UuZW5kICsgb3ZlcnNjYW4pO1xuXG4gICAgICAvLyBpZiAoaXNSZW1vdmluZ0l0ZW0pIHtcbiAgICAgIC8vICAgY29uc29sZS5sb2coXG4gICAgICAvLyAgICAgYFtSRU5ERVItRklYXSByZW5kZXJJdGVtcyBjYWxjOiB2aXNpYmxlUmFuZ2U9JHtKU09OLnN0cmluZ2lmeSh2aXNpYmxlUmFuZ2UpfSwgb3ZlcnNjYW49JHtvdmVyc2Nhbn0sIHRvdGFsSXRlbXM9JHt0b3RhbEl0ZW1zfWAsXG4gICAgICAvLyAgICk7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICAgIGBbUkVOREVSLUZJWF0gcmVuZGVySXRlbXMgY2FsYzogcmVuZGVyU3RhcnQ9JHtyZW5kZXJTdGFydH0sIHJlbmRlckVuZD0ke3JlbmRlckVuZH1gLFxuICAgICAgLy8gICApO1xuICAgICAgLy8gfVxuXG4gICAgICAvLyBSZW1vdmUgaXRlbXMgb3V0c2lkZSByYW5nZVxuICAgICAgQXJyYXkuZnJvbShyZW5kZXJlZEVsZW1lbnRzLmVudHJpZXMoKSlcbiAgICAgICAgLmZpbHRlcigoW2luZGV4XSkgPT4gaW5kZXggPCByZW5kZXJTdGFydCB8fCBpbmRleCA+IHJlbmRlckVuZClcbiAgICAgICAgLmZvckVhY2goKFtpbmRleCwgZWxlbWVudF0pID0+IHtcbiAgICAgICAgICBpZiAoZWxlbWVudC5wYXJlbnROb2RlKSByZWxlYXNlRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLmRlbGV0ZShpbmRleCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAvLyBHZXQgaXRlbXMgc291cmNlXG4gICAgICBjb25zdCBoYXNDb2xsZWN0aW9uSXRlbXMgPSBPYmplY3Qua2V5cyhjb2xsZWN0aW9uSXRlbXMpLmxlbmd0aCA+IDA7XG4gICAgICBjb25zdCBpdGVtcyA9IGhhc0NvbGxlY3Rpb25JdGVtc1xuICAgICAgICA/IGNvbGxlY3Rpb25JdGVtc1xuICAgICAgICA6IGNvbXBvbmVudC5pdGVtcyB8fCBbXTtcbiAgICAgIGNvbnN0IG1pc3NpbmdJdGVtczogbnVtYmVyW10gPSBbXTtcblxuICAgICAgLy8gQ29sbGVjdCBuZXcgZWxlbWVudHMgdG8gaW5zZXJ0IChpbmRleCAtPiBlbGVtZW50KVxuICAgICAgY29uc3QgbmV3RWxlbWVudHM6IEFycmF5PFtudW1iZXIsIEhUTUxFbGVtZW50XT4gPSBbXTtcblxuICAgICAgLy8gUmVuZGVyIGl0ZW1zIGluIHJhbmdlXG4gICAgICBmb3IgKGxldCBpID0gcmVuZGVyU3RhcnQ7IGkgPD0gcmVuZGVyRW5kOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPCAwIHx8IGkgPj0gdG90YWxJdGVtcyB8fCByZW5kZXJlZEVsZW1lbnRzLmhhcyhpKSkgY29udGludWU7XG5cbiAgICAgICAgbGV0IGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgICAgbWlzc2luZ0l0ZW1zLnB1c2goaSk7XG4gICAgICAgICAgLy8gR2VuZXJhdGUgcGxhY2Vob2xkZXJcbiAgICAgICAgICBjb25zdCBwbGFjZWhvbGRlcnMgPSAoY29tcG9uZW50IGFzIGFueSkucGxhY2Vob2xkZXJzO1xuICAgICAgICAgIGl0ZW0gPSBwbGFjZWhvbGRlcnM/LmdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtKGkpIHx8IHtcbiAgICAgICAgICAgIF9wbGFjZWhvbGRlcjogdHJ1ZSxcbiAgICAgICAgICAgIGluZGV4OiBpLFxuICAgICAgICAgICAgaWQ6IGBwbGFjZWhvbGRlci0ke2l9YCxcbiAgICAgICAgICAgIG5hbWU6IFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVNLX0NIQVJBQ1RFUi5yZXBlYXQoMTUpLFxuICAgICAgICAgICAgdGV4dDogVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLk1BU0tfQ0hBUkFDVEVSLnJlcGVhdCgyNSksXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLk1BU0tfQ0hBUkFDVEVSLnJlcGVhdCg0MCksXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb2xsZWN0aW9uSXRlbXNbaV0gPSBpdGVtO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHJlbmRlckl0ZW0oaXRlbSwgaSk7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgLy8gR2V0IHRhcmdldFNjcm9sbEluZGV4IGZyb20gdmlld3BvcnRTdGF0ZSBpZiBhdmFpbGFibGVcbiAgICAgICAgICBjb25zdCB0YXJnZXRTY3JvbGxJbmRleCA9ICh2aWV3cG9ydFN0YXRlIGFzIGFueSk/LnRhcmdldFNjcm9sbEluZGV4O1xuICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gY2FsY3VsYXRlSXRlbVBvc2l0aW9uKFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgICAgdG90YWxJdGVtcyxcbiAgICAgICAgICAgIGl0ZW1TaXplLFxuICAgICAgICAgICAgdmlydHVhbFRvdGFsU2l6ZSxcbiAgICAgICAgICAgIGNvbnRhaW5lclNpemUsXG4gICAgICAgICAgICB0YXJnZXRTY3JvbGxJbmRleCxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCB7XG4gICAgICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlWSgke3Bvc2l0aW9ufXB4KWAsXG4gICAgICAgICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBDb2xsZWN0IGZvciBiYXRjaCBpbnNlcnRpb24gKGlmIG1haW50YWluaW5nIG9yZGVyKSBvciBqdXN0IGFwcGVuZFxuICAgICAgICAgIGlmIChtYWludGFpbkRvbU9yZGVyKSB7XG4gICAgICAgICAgICBuZXdFbGVtZW50cy5wdXNoKFtpLCBlbGVtZW50XSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGl0ZW1zQ29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNldChpLCBlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBCYXRjaCBpbnNlcnQgbmV3IGVsZW1lbnRzIGluIGNvcnJlY3QgRE9NIG9yZGVyIChvbmx5IHdoZW4gbWFpbnRhaW5Eb21PcmRlciBpcyBlbmFibGVkKVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIENTUyBzZWxlY3RvcnMgbGlrZSA6Zmlyc3QtY2hpbGQsIDpudGgtY2hpbGQoKSB3b3JrIGNvcnJlY3RseVxuICAgICAgaWYgKG1haW50YWluRG9tT3JkZXIgJiYgbmV3RWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBTb3J0IG5ldyBlbGVtZW50cyBieSBpbmRleFxuICAgICAgICBuZXdFbGVtZW50cy5zb3J0KChbYV0sIFtiXSkgPT4gYSAtIGIpO1xuXG4gICAgICAgIC8vIEdldCBleGlzdGluZyBET00gY2hpbGRyZW4gc29ydGVkIGJ5IHRoZWlyIGRhdGEtaW5kZXhcbiAgICAgICAgY29uc3QgZXhpc3RpbmdDaGlsZHJlbiA9IEFycmF5LmZyb20oXG4gICAgICAgICAgaXRlbXNDb250YWluZXIuY2hpbGRyZW4sXG4gICAgICAgICkgYXMgSFRNTEVsZW1lbnRbXTtcblxuICAgICAgICAvLyBNZXJnZSBuZXcgZWxlbWVudHMgaW50byBjb3JyZWN0IHBvc2l0aW9uc1xuICAgICAgICBsZXQgbmV3SWR4ID0gMDtcbiAgICAgICAgbGV0IGV4aXN0aW5nSWR4ID0gMDtcblxuICAgICAgICB3aGlsZSAobmV3SWR4IDwgbmV3RWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgW25ld0luZGV4LCBuZXdFbGVtZW50XSA9IG5ld0VsZW1lbnRzW25ld0lkeF07XG5cbiAgICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBleGlzdGluZyBjaGlsZCB3aXRoIGluZGV4ID4gbmV3SW5kZXhcbiAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICBleGlzdGluZ0lkeCA8IGV4aXN0aW5nQ2hpbGRyZW4ubGVuZ3RoICYmXG4gICAgICAgICAgICBwYXJzZUludChleGlzdGluZ0NoaWxkcmVuW2V4aXN0aW5nSWR4XS5kYXRhc2V0LmluZGV4IHx8IFwiLTFcIiwgMTApIDxcbiAgICAgICAgICAgICAgbmV3SW5kZXhcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGV4aXN0aW5nSWR4Kys7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGV4aXN0aW5nSWR4IDwgZXhpc3RpbmdDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIEluc2VydCBiZWZvcmUgdGhlIGV4aXN0aW5nIGNoaWxkXG4gICAgICAgICAgICBpdGVtc0NvbnRhaW5lci5pbnNlcnRCZWZvcmUoXG4gICAgICAgICAgICAgIG5ld0VsZW1lbnQsXG4gICAgICAgICAgICAgIGV4aXN0aW5nQ2hpbGRyZW5bZXhpc3RpbmdJZHhdLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQXBwZW5kIGF0IHRoZSBlbmRcbiAgICAgICAgICAgIGl0ZW1zQ29udGFpbmVyLmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXdJZHgrKztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBSZXF1ZXN0IG1pc3NpbmcgaXRlbXNcbiAgICAgIGlmIChcbiAgICAgICAgbWlzc2luZ0l0ZW1zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uPy5sb2FkTWlzc2luZ1Jhbmdlc1xuICAgICAgKSB7XG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmxvYWRNaXNzaW5nUmFuZ2VzKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHN0YXJ0OiBNYXRoLm1pbiguLi5taXNzaW5nSXRlbXMpLFxuICAgICAgICAgICAgZW5kOiBNYXRoLm1heCguLi5taXNzaW5nSXRlbXMpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZW5kZXJpbmc6bWlzc2luZy1pdGVtc1wiLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50VmlzaWJsZVJhbmdlID0gdmlzaWJsZVJhbmdlO1xuXG4gICAgICAvLyBMb2cgRE9NIHN0YXRzIHBlcmlvZGljYWxseSAoZXZlcnkgMTAgcmVuZGVycylcbiAgICAgIGlmIChwb29sU3RhdHMuY3JlYXRlZCAlIDUwID09PSAwICYmIHBvb2xTdGF0cy5jcmVhdGVkID4gMCkge1xuICAgICAgICBsb2dET01TdGF0cyhgcmVuZGVyOiR7cG9vbFN0YXRzLmNyZWF0ZWR9YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVtaXQgaXRlbXMgcmVuZGVyZWQgZXZlbnQgd2l0aCBlbGVtZW50cyBmb3Igc2l6ZSBjYWxjdWxhdGlvblxuICAgICAgY29uc3QgcmVuZGVyZWRFbGVtZW50c0FycmF5ID0gQXJyYXkuZnJvbShyZW5kZXJlZEVsZW1lbnRzLnZhbHVlcygpKTtcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDppdGVtcy1yZW5kZXJlZFwiLCB7XG4gICAgICAgIGVsZW1lbnRzOiByZW5kZXJlZEVsZW1lbnRzQXJyYXksXG4gICAgICAgIHJhbmdlOiB2aXNpYmxlUmFuZ2UsXG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnJlbmRlcmVkXCIsIHtcbiAgICAgICAgcmFuZ2U6IHZpc2libGVSYW5nZSxcbiAgICAgICAgcmVuZGVyZWRDb3VudDogcmVuZGVyZWRFbGVtZW50cy5zaXplLFxuICAgICAgfSk7XG4gICAgICB1cGRhdGVJdGVtUG9zaXRpb25zKCk7XG5cbiAgICAgIC8vIExvYWQgZGF0YSBpZiBubyBpdGVtcyByZW5kZXJlZFxuICAgICAgaWYgKFxuICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNpemUgPT09IDAgJiZcbiAgICAgICAgdG90YWxJdGVtcyA+IDAgJiZcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uXG4gICAgICApIHtcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24ubG9hZE1pc3NpbmdSYW5nZXMoXG4gICAgICAgICAgdmlzaWJsZVJhbmdlLFxuICAgICAgICAgIFwicmVuZGVyaW5nOm5vLWl0ZW1zXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEV4dGVuZCB2aWV3cG9ydCBBUElcbiAgICBjb25zdCBvcmlnaW5hbFJlbmRlckl0ZW1zID0gY29tcG9uZW50LnZpZXdwb3J0LnJlbmRlckl0ZW1zO1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcyA9ICgpID0+IHtcbiAgICAgIHJlbmRlckl0ZW1zKCk7XG4gICAgICBvcmlnaW5hbFJlbmRlckl0ZW1zPy4oKTtcbiAgICB9O1xuXG4gICAgLy8gQ2xlYW51cFxuICAgIHdyYXBEZXN0cm95KGNvbXBvbmVudCwgKCkgPT4ge1xuICAgICAgLy8gUmVsZWFzZSBhbGwgcmVuZGVyZWQgZWxlbWVudHMgLSB1c2UgcmVsZWFzZUVsZW1lbnQgdG8gcHJvcGVybHkgZGVzdHJveSBsYXlvdXRSZXN1bHRzXG4gICAgICByZW5kZXJlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgcmVsZWFzZUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICB9KTtcbiAgICAgIHJlbmRlcmVkRWxlbWVudHMuY2xlYXIoKTtcblxuICAgICAgLy8gQ2xlYXIgZWxlbWVudCBwb29sXG4gICAgICBlbGVtZW50UG9vbC5sZW5ndGggPSAwO1xuXG4gICAgICAvLyBDbGVhciBjb2xsZWN0aW9uIGl0ZW1zIGNhY2hlIC0gdGhpcyBpcyBjcml0aWNhbCBmb3IgbWVtb3J5IVxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gY29sbGVjdGlvbkl0ZW1zKSB7XG4gICAgICAgIGRlbGV0ZSBjb2xsZWN0aW9uSXRlbXNba2V5XTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVzZXQgc3RhdGVcbiAgICAgIGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB7IHN0YXJ0OiAtMSwgZW5kOiAtMSB9O1xuICAgICAgdmlld3BvcnRTdGF0ZSA9IG51bGw7XG4gICAgICBsYXN0UmVuZGVyVGltZSA9IDA7XG5cbiAgICAgIC8vIFJlc2V0IHBvb2wgc3RhdHNcbiAgICAgIHBvb2xTdGF0cy5jcmVhdGVkID0gMDtcbiAgICAgIHBvb2xTdGF0cy5yZWN5Y2xlZCA9IDA7XG4gICAgICBwb29sU3RhdHMucG9vbFNpemUgPSAwO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL2V2ZW50cy50c1xuXG4vKipcbiAqIEV2ZW50cyBGZWF0dXJlIC0gQ2VudHJhbGl6ZWQgZXZlbnQgc3lzdGVtIGZvciB2aWV3cG9ydFxuICogUHJvdmlkZXMgZXZlbnQgZW1pc3Npb24gYW5kIHN1YnNjcmlwdGlvbiBmb3IgaW50ZXItZmVhdHVyZSBjb21tdW5pY2F0aW9uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXZlbnRzQ29uZmlnIHtcbiAgZGVidWc/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEV2ZW50cyBmZWF0dXJlIGZvciB2aWV3cG9ydFxuICogQ2VudHJhbGl6ZXMgYWxsIGV2ZW50IGhhbmRsaW5nIGZvciB2aWV3cG9ydCBmZWF0dXJlc1xuICovXG5leHBvcnQgY29uc3Qgd2l0aEV2ZW50cyA9IChjb25maWc6IEV2ZW50c0NvbmZpZyA9IHt9KSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50Pihjb21wb25lbnQ6IFQpOiBUID0+IHtcbiAgICBjb25zdCB7IGRlYnVnID0gZmFsc2UgfSA9IGNvbmZpZztcblxuICAgIC8vIEV2ZW50IGxpc3RlbmVycyBtYXBcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBuZXcgTWFwPHN0cmluZywgU2V0PEZ1bmN0aW9uPj4oKTtcblxuICAgIC8vIEVtaXQgYW4gZXZlbnRcbiAgICBjb25zdCBlbWl0ID0gKGV2ZW50OiBzdHJpbmcsIGRhdGE/OiBhbnkpID0+IHtcbiAgICAgIC8vIGlmIChkZWJ1Zykge1xuICAgICAgLy8gICBjb25zb2xlLmxvZyhgW0V2ZW50c10gRW1pdDogJHtldmVudH1gLCBkYXRhKTtcbiAgICAgIC8vIH1cblxuICAgICAgY29uc3QgZXZlbnRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZ2V0KGV2ZW50KTtcbiAgICAgIGlmIChldmVudExpc3RlbmVycykge1xuICAgICAgICBldmVudExpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsaXN0ZW5lcihkYXRhKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgW0V2ZW50c10gRXJyb3IgaW4gbGlzdGVuZXIgZm9yICR7ZXZlbnR9OmAsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTdWJzY3JpYmUgdG8gYW4gZXZlbnRcbiAgICBjb25zdCBvbiA9IChldmVudDogc3RyaW5nLCBoYW5kbGVyOiBGdW5jdGlvbik6ICgoKSA9PiB2b2lkKSA9PiB7XG4gICAgICBpZiAoIWxpc3RlbmVycy5oYXMoZXZlbnQpKSB7XG4gICAgICAgIGxpc3RlbmVycy5zZXQoZXZlbnQsIG5ldyBTZXQoKSk7XG4gICAgICB9XG5cbiAgICAgIGxpc3RlbmVycy5nZXQoZXZlbnQpIS5hZGQoaGFuZGxlcik7XG5cbiAgICAgIC8vIGlmIChkZWJ1Zykge1xuICAgICAgLy8gICBjb25zb2xlLmxvZyhgW0V2ZW50c10gU3Vic2NyaWJlZCB0bzogJHtldmVudH1gKTtcbiAgICAgIC8vIH1cblxuICAgICAgLy8gUmV0dXJuIHVuc3Vic2NyaWJlIGZ1bmN0aW9uXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb25zdCBldmVudExpc3RlbmVycyA9IGxpc3RlbmVycy5nZXQoZXZlbnQpO1xuICAgICAgICBpZiAoZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgICAgICBldmVudExpc3RlbmVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIGxpc3RlbmVycy5kZWxldGUoZXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgLy8gU3Vic2NyaWJlIHRvIGFuIGV2ZW50IG9uY2VcbiAgICBjb25zdCBvbmNlID0gKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKTogKCgpID0+IHZvaWQpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZWRIYW5kbGVyID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBoYW5kbGVyKGRhdGEpO1xuICAgICAgICBvZmYoZXZlbnQsIHdyYXBwZWRIYW5kbGVyKTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gb24oZXZlbnQsIHdyYXBwZWRIYW5kbGVyKTtcbiAgICB9O1xuXG4gICAgLy8gVW5zdWJzY3JpYmUgZnJvbSBhbiBldmVudFxuICAgIGNvbnN0IG9mZiA9IChldmVudDogc3RyaW5nLCBoYW5kbGVyOiBGdW5jdGlvbikgPT4ge1xuICAgICAgY29uc3QgZXZlbnRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZ2V0KGV2ZW50KTtcbiAgICAgIGlmIChldmVudExpc3RlbmVycykge1xuICAgICAgICBldmVudExpc3RlbmVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIGlmIChldmVudExpc3RlbmVycy5zaXplID09PSAwKSB7XG4gICAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQ2xlYXIgYWxsIGxpc3RlbmVycyBmb3IgYW4gZXZlbnRcbiAgICBjb25zdCBjbGVhciA9IChldmVudD86IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgIGxpc3RlbmVycy5kZWxldGUoZXZlbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGlzdGVuZXJzLmNsZWFyKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEFkZCBldmVudCBtZXRob2RzIHRvIGNvbXBvbmVudFxuICAgIGNvbXBvbmVudC5lbWl0ID0gZW1pdDtcbiAgICBjb21wb25lbnQub24gPSBvbjtcbiAgICBjb21wb25lbnQub25jZSA9IG9uY2U7XG4gICAgY29tcG9uZW50Lm9mZiA9IG9mZjtcblxuICAgIC8vIEFkZCBldmVudHMgQVBJIHRvIHZpZXdwb3J0XG4gICAgKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLmV2ZW50cyA9IHtcbiAgICAgIGVtaXQsXG4gICAgICBvbixcbiAgICAgIG9uY2UsXG4gICAgICBvZmYsXG4gICAgICBjbGVhcixcbiAgICAgIGdldExpc3RlbmVyQ291bnQ6IChldmVudD86IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gbGlzdGVuZXJzLmdldChldmVudCk/LnNpemUgfHwgMDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdG90YWwgPSAwO1xuICAgICAgICBsaXN0ZW5lcnMuZm9yRWFjaCgoc2V0KSA9PiAodG90YWwgKz0gc2V0LnNpemUpKTtcbiAgICAgICAgcmV0dXJuIHRvdGFsO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gQ2xlYW4gdXAgb24gZGVzdHJveVxuICAgIGlmIChcImRlc3Ryb3lcIiBpbiBjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IGNvbXBvbmVudC5kZXN0cm95O1xuICAgICAgY29tcG9uZW50LmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIGNsZWFyKCk7XG4gICAgICAgIG9yaWdpbmFsRGVzdHJveT8uKCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH07XG59O1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy92bGlzdC92bGlzdC50c1xuXG4vKipcbiAqIFZMaXN0IENvbXBvbmVudCAtIFZpcnR1YWwgTGlzdCB3aXRoIGRpcmVjdCB2aWV3cG9ydCBpbnRlZ3JhdGlvblxuICpcbiAqIEEgc2ltcGxpZmllZCB2aXJ0dWFsIGxpc3QgdGhhdCB1c2VzIHRoZSB2aWV3cG9ydCBmZWF0dXJlIGRpcmVjdGx5XG4gKiB3aXRob3V0IHRoZSBsaXN0LW1hbmFnZXIgYWJzdHJhY3Rpb24gbGF5ZXIuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWTGlzdENvbmZpZywgVkxpc3RDb21wb25lbnQsIFZMaXN0SXRlbSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8vIEltcG9ydCBtdHJsIGNvbXBvc2Ugc3lzdGVtXG5pbXBvcnQgeyBwaXBlIH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IGNyZWF0ZUJhc2UsIHdpdGhFbGVtZW50IH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IHdpdGhFdmVudHMsIHdpdGhMaWZlY3ljbGUgfSBmcm9tIFwibXRybFwiO1xuXG4vLyBJbXBvcnQgdmlld3BvcnQgZmVhdHVyZVxuaW1wb3J0IHsgd2l0aFZpZXdwb3J0IH0gZnJvbSBcIi4vZmVhdHVyZXMvdmlld3BvcnRcIjtcbmltcG9ydCB7IHdpdGhBUEkgfSBmcm9tIFwiLi9mZWF0dXJlcy9hcGlcIjtcbmltcG9ydCB7IHdpdGhTZWxlY3Rpb24gfSBmcm9tIFwiLi9mZWF0dXJlcy9zZWxlY3Rpb25cIjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFZMaXN0IGNvbXBvbmVudCB1c2luZyBkaXJlY3Qgdmlld3BvcnQgaW50ZWdyYXRpb25cbiAqXG4gKiBAcGFyYW0ge1ZMaXN0Q29uZmlnfSBjb25maWcgLSBMaXN0IGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHJldHVybnMge1ZMaXN0Q29tcG9uZW50fSBBIGZ1bGx5IGNvbmZpZ3VyZWQgdmlydHVhbCBsaXN0IGNvbXBvbmVudFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCB2bGlzdCA9IGNyZWF0ZVZMaXN0KHtcbiAqICAgY29udGFpbmVyOiAnI215LWxpc3QnLFxuICogICBjb2xsZWN0aW9uOiBteUFkYXB0ZXIsXG4gKiAgIHJhbmdlU2l6ZTogMjAsXG4gKiAgIHBhZ2luYXRpb25TdHJhdGVneTogJ3BhZ2UnLFxuICogICB0ZW1wbGF0ZTogKGl0ZW0sIGluZGV4KSA9PiBbXG4gKiAgICAgeyBjbGFzczogJ3ZpZXdwb3J0LWl0ZW0nLCBhdHRyaWJ1dGVzOiB7ICdkYXRhLWlkJzogaXRlbS5pZCB9fSxcbiAqICAgICBbeyBjbGFzczogJ3ZpZXdwb3J0LWl0ZW1fX25hbWUnLCB0ZXh0OiBpdGVtLm5hbWUgfV0sXG4gKiAgICAgW3sgY2xhc3M6ICd2aWV3cG9ydC1pdGVtX192YWx1ZScsIHRleHQ6IGl0ZW0udmFsdWUgfV1cbiAqICAgXVxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVZMaXN0ID0gPFQgZXh0ZW5kcyBWTGlzdEl0ZW0gPSBWTGlzdEl0ZW0+KFxuICBjb25maWc6IFZMaXN0Q29uZmlnPFQ+ID0ge30sXG4pOiBWTGlzdENvbXBvbmVudDxUPiA9PiB7XG4gIHRyeSB7XG4gICAgLy8gY29uc29sZS5sb2coYPCfk4sgQ3JlYXRpbmcgVkxpc3QgY29tcG9uZW50IHdpdGggZGlyZWN0IHZpZXdwb3J0IGludGVncmF0aW9uYCk7XG5cbiAgICAvLyBOb3RlOiBUcmFuc2Zvcm0gc2hvdWxkIGJlIGFwcGxpZWQgYnkgdGhlIGNvbGxlY3Rpb24gZmVhdHVyZSBpbiB2aWV3cG9ydFxuICAgIC8vIFZMaXN0IHNob3VsZCBub3QgaW50ZXJjZXB0IGNvbGxlY3Rpb24gcmVhZHMgYXMgaXQgYnlwYXNzZXMgdGhlIGxvYWRpbmcgbWFuYWdlclxuXG4gICAgLy8gQ3JlYXRlIHRoZSBjb21wb25lbnQgdGhyb3VnaCBmdW5jdGlvbmFsIGNvbXBvc2l0aW9uXG4gICAgY29uc3QgZW5oYW5jZXJzID0gW1xuICAgICAgLy8gMS4gRm91bmRhdGlvbiBsYXllclxuICAgICAgY3JlYXRlQmFzZSxcbiAgICAgIHdpdGhFdmVudHMoKSxcbiAgICAgIHdpdGhFbGVtZW50KHtcbiAgICAgICAgdGFnOiBcImRpdlwiLFxuICAgICAgICBjbGFzc05hbWU6IGNvbmZpZy5jbGFzc05hbWUgfHwgXCJtdHJsLXZsaXN0XCIsXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICByb2xlOiBcImxpc3RcIixcbiAgICAgICAgICBcImFyaWEtbGFiZWxcIjogY29uZmlnLmFyaWFMYWJlbCB8fCBcIlZpcnR1YWwgTGlzdFwiLFxuICAgICAgICB9LFxuICAgICAgfSksXG5cbiAgICAgIC8vIDIuIFZpZXdwb3J0IGludGVncmF0aW9uXG4gICAgICAvLyBQYXNzIGF1dG9TZWxlY3RGaXJzdCBmcm9tIHNlbGVjdGlvbiBjb25maWcgdG8gdmlld3BvcnQgbGV2ZWxcbiAgICAgIHdpdGhWaWV3cG9ydCh7XG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgYXV0b1NlbGVjdEZpcnN0OiBjb25maWcuc2VsZWN0aW9uPy5hdXRvU2VsZWN0Rmlyc3QsXG4gICAgICB9KSxcblxuICAgICAgLy8gMy4gQ29tcG9uZW50IGxpZmVjeWNsZVxuICAgICAgd2l0aExpZmVjeWNsZSgpLFxuXG4gICAgICAvLyA0LiBQdWJsaWMgQVBJIGxheWVyXG4gICAgICB3aXRoQVBJKGNvbmZpZyksXG4gICAgXTtcblxuICAgIC8vIDQuNS4gU2VsZWN0aW9uIGNhcGFiaWxpdGllcyAoaWYgZW5hYmxlZCkgLSBtdXN0IGJlIGFmdGVyIEFQSVxuICAgIGlmIChjb25maWcuc2VsZWN0aW9uPy5lbmFibGVkKSB7XG4gICAgICBlbmhhbmNlcnMucHVzaCh3aXRoU2VsZWN0aW9uKGNvbmZpZykpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBvbmVudCA9IHBpcGUoLi4uZW5oYW5jZXJzKSh7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBjb21wb25lbnROYW1lOiBcInZsaXN0XCIsXG4gICAgICBwcmVmaXg6IGNvbmZpZy5wcmVmaXggfHwgXCJtdHJsXCIsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29tcG9uZW50IGFzIFZMaXN0Q29tcG9uZW50PFQ+O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCLinYwgW1ZMSVNUXSBGYWlsZWQgdG8gY3JlYXRlIFZMaXN0IGNvbXBvbmVudDpcIiwgZXJyb3IpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy92bGlzdC9mZWF0dXJlcy92aWV3cG9ydC50c1xuXG4vKipcbiAqIFZpZXdwb3J0IGZlYXR1cmUgZm9yIFZMaXN0XG4gKiBJbnRlZ3JhdGVzIHRoZSBjb3JlIHZpZXdwb3J0IGZ1bmN0aW9uYWxpdHkgd2l0aCBWTGlzdCBjb21wb25lbnRcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZMaXN0Q29uZmlnLCBWTGlzdEl0ZW0gfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZVZpZXdwb3J0IH0gZnJvbSBcIi4uLy4uLy4uL2NvcmUvdmlld3BvcnRcIjtcblxuLyoqXG4gKiBBZGRzIHZpZXdwb3J0IGZ1bmN0aW9uYWxpdHkgdG8gVkxpc3RcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhWaWV3cG9ydCA9IDxUIGV4dGVuZHMgVkxpc3RJdGVtID0gVkxpc3RJdGVtPihcbiAgY29uZmlnOiBWTGlzdENvbmZpZzxUPixcbikgPT4ge1xuICByZXR1cm4gKGNvbXBvbmVudDogYW55KSA9PiB7XG4gICAgLy8gU2V0IGluaXRpYWwgaXRlbXMgaWYgcHJvdmlkZWRcbiAgICBpZiAoY29uZmlnLml0ZW1zKSB7XG4gICAgICBjb21wb25lbnQuaXRlbXMgPSBjb25maWcuaXRlbXM7XG4gICAgICBjb21wb25lbnQudG90YWxJdGVtcyA9IGNvbmZpZy5pdGVtcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gU2V0IHRlbXBsYXRlIGlmIHByb3ZpZGVkXG4gICAgaWYgKGNvbmZpZy50ZW1wbGF0ZSkge1xuICAgICAgY29tcG9uZW50LnRlbXBsYXRlID0gY29uZmlnLnRlbXBsYXRlO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSB0aGUgZWxlbWVudCBoYXMgYm90aCB2bGlzdCBhbmQgdmlld3BvcnQgY2xhc3Nlc1xuICAgIGNvbnN0IHZpZXdwb3J0Q29uZmlnID0ge1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgY2xhc3NOYW1lOiBcIm10cmwtdmlld3BvcnRcIiwgLy8gVGhpcyB3aWxsIGJlIGFkZGVkIGJ5IHZpZXdwb3J0IGJhc2UgZmVhdHVyZVxuICAgIH07XG5cbiAgICAvLyBQYXNzIFZMaXN0IGNvbmZpZyBkaXJlY3RseSB0byB2aWV3cG9ydFxuICAgIGNvbnN0IHZpZXdwb3J0RW5oYW5jZWQgPSBjcmVhdGVWaWV3cG9ydCh2aWV3cG9ydENvbmZpZyBhcyBhbnkpKGNvbXBvbmVudCk7XG5cbiAgICAvLyBIYW5kbGUgcGFyZW50IGVsZW1lbnQgaWYgcHJvdmlkZWRcbiAgICBpZiAoY29uZmlnLnBhcmVudCB8fCBjb25maWcuY29udGFpbmVyKSB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBjb25maWcucGFyZW50IHx8IGNvbmZpZy5jb250YWluZXI7XG4gICAgICBjb25zdCBlbGVtZW50ID1cbiAgICAgICAgdHlwZW9mIGNvbnRhaW5lciA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgID8gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihjb250YWluZXIpXG4gICAgICAgICAgOiBjb250YWluZXI7XG5cbiAgICAgIGlmIChlbGVtZW50ICYmIHZpZXdwb3J0RW5oYW5jZWQuZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKHZpZXdwb3J0RW5oYW5jZWQuZWxlbWVudCk7XG5cbiAgICAgICAgLy8gRW5zdXJlIHZpZXdwb3J0IGlzIGluaXRpYWxpemVkIGFmdGVyIERPTSBhdHRhY2htZW50XG4gICAgICAgIGlmICh2aWV3cG9ydEVuaGFuY2VkLnZpZXdwb3J0ICYmIHZpZXdwb3J0RW5oYW5jZWQudmlld3BvcnQuaW5pdGlhbGl6ZSkge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwi8J+TiyBbVkxpc3RdIEluaXRpYWxpemluZyB2aWV3cG9ydCBhZnRlciBET00gYXR0YWNobWVudFwiKTtcbiAgICAgICAgICB2aWV3cG9ydEVuaGFuY2VkLnZpZXdwb3J0LmluaXRpYWxpemUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2aWV3cG9ydEVuaGFuY2VkO1xuICB9O1xufTtcbiIsCiAgICAiLyoqXG4gKiBBUEkgZmVhdHVyZSBmb3IgVkxpc3RcbiAqIFByb3ZpZGVzIGEgY2xlYW4gcHVibGljIEFQSSBmb3IgdGhlIFZMaXN0IGNvbXBvbmVudFxuICovXG5cbmltcG9ydCB0eXBlIHsgVkxpc3RDb25maWcsIFZMaXN0SXRlbSwgUmVtb3ZlSXRlbU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLy8gUmUtZXhwb3J0IGZvciBjb252ZW5pZW5jZVxuZXhwb3J0IHR5cGUgeyBSZW1vdmVJdGVtT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5leHBvcnQgY29uc3Qgd2l0aEFQSSA9IDxUIGV4dGVuZHMgVkxpc3RJdGVtID0gVkxpc3RJdGVtPihcbiAgY29uZmlnOiBWTGlzdENvbmZpZzxUPixcbikgPT4ge1xuICByZXR1cm4gKGNvbXBvbmVudDogYW55KSA9PiB7XG4gICAgLy8gSW5pdGlhbGl6ZSB2aWV3cG9ydCBvbiBjcmVhdGlvblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydCAmJiBjb21wb25lbnQudmlld3BvcnQuaW5pdGlhbGl6ZSkge1xuICAgICAgICBjb21wb25lbnQudmlld3BvcnQuaW5pdGlhbGl6ZSgpO1xuICAgICAgfVxuICAgIH0sIDApO1xuXG4gICAgLy8gVHJhY2sgbG9hZGluZyBzdGF0ZVxuICAgIGxldCBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgICBsZXQgc2VsZWN0ZWRJZHMgPSBuZXcgU2V0PHN0cmluZyB8IG51bWJlcj4oKTtcblxuICAgIC8vIFRyYWNrIHBlbmRpbmcgcmVtb3ZhbHMgdG8gZmlsdGVyIG91dCBpdGVtcyBmcm9tIHN0YWxlIHNlcnZlciByZXNwb25zZXNcbiAgICAvLyBUaGlzIHByZXZlbnRzIHJhY2UgY29uZGl0aW9ucyB3aGVyZSBzZXJ2ZXIgcmV0dXJucyBvbGQgZGF0YSBiZWZvcmUgdXBkYXRlcyBhcmUgY29tbWl0dGVkXG4gICAgY29uc3QgcGVuZGluZ1JlbW92YWxzID0gbmV3IFNldDxzdHJpbmcgfCBudW1iZXI+KCk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIGNvbGxlY3Rpb24gZXZlbnRzXG4gICAgY29tcG9uZW50Lm9uPy4oXCJjb2xsZWN0aW9uOnJhbmdlLWxvYWRlZFwiLCAoKSA9PiB7XG4gICAgICBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgICB9KTtcbiAgICBjb21wb25lbnQub24/LihcImNvbGxlY3Rpb246cmFuZ2UtZmFpbGVkXCIsICgpID0+IHtcbiAgICAgIGlzTG9hZGluZyA9IGZhbHNlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcblxuICAgICAgLy8gRGF0YSBvcGVyYXRpb25zXG4gICAgICBzZXRJdGVtcyhpdGVtczogVFtdKSB7XG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24pIHtcbiAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5zZXRJdGVtcyhpdGVtcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tcG9uZW50Lml0ZW1zID0gaXRlbXM7XG4gICAgICAgICAgY29tcG9uZW50LnRvdGFsSXRlbXMgPSBpdGVtcy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW1zOnNldFwiLCB7IGl0ZW1zLCB0b3RhbDogaXRlbXMubGVuZ3RoIH0pO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBBZGQgaXRlbXMgdG8gdGhlIGNvbGxlY3Rpb24gYXQgdGhlIHN0YXJ0IG9yIGVuZFxuICAgICAgICogVXBkYXRlcyB0b3RhbEl0ZW1zIGFuZCB0cmlnZ2VycyByZS1yZW5kZXIgb2YgdmlzaWJsZSBpdGVtc1xuICAgICAgICogQHBhcmFtIG5ld0l0ZW1zIC0gQXJyYXkgb2YgaXRlbXMgdG8gYWRkXG4gICAgICAgKiBAcGFyYW0gcG9zaXRpb24gLSBXaGVyZSB0byBhZGQgaXRlbXM6IFwic3RhcnRcIiAoZGVmYXVsdCkgb3IgXCJlbmRcIlxuICAgICAgICovXG4gICAgICBhZGRJdGVtcyhuZXdJdGVtczogVFtdLCBwb3NpdGlvbjogXCJzdGFydFwiIHwgXCJlbmRcIiA9IFwic3RhcnRcIik6IHZvaWQge1xuICAgICAgICBpZiAoIW5ld0l0ZW1zIHx8IG5ld0l0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcIltWTGlzdF0gYWRkSXRlbXM6IG5vIGl0ZW1zIHByb3ZpZGVkXCIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbjtcbiAgICAgICAgY29uc3QgY3VycmVudEl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuXG4gICAgICAgIC8vIEFkZCBpdGVtcyB0byB0aGUgY29sbGVjdGlvbiBpdGVtcyBhcnJheVxuICAgICAgICBpZiAoY29sbGVjdGlvbj8uaXRlbXMpIHtcbiAgICAgICAgICBpZiAocG9zaXRpb24gPT09IFwic3RhcnRcIikge1xuICAgICAgICAgICAgLy8gUHJlcGVuZCBpdGVtcyAobmV3ZXN0IGZpcnN0KVxuICAgICAgICAgICAgY29sbGVjdGlvbi5pdGVtcy51bnNoaWZ0KC4uLm5ld0l0ZW1zKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQXBwZW5kIGl0ZW1zXG4gICAgICAgICAgICBjb2xsZWN0aW9uLml0ZW1zLnB1c2goLi4ubmV3SXRlbXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtaXQgZXZlbnQgRklSU1Qgc28gcmVuZGVyaW5nIGZlYXR1cmUgY2FuIHJlYnVpbGQgY29sbGVjdGlvbkl0ZW1zXG4gICAgICAgIC8vIEJFRk9SRSBzZXRUb3RhbEl0ZW1zIHRyaWdnZXJzIGEgcmVuZGVyXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtczphZGQtcmVxdWVzdFwiLCB7XG4gICAgICAgICAgaXRlbXM6IG5ld0l0ZW1zLFxuICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgIHByZXZpb3VzQ291bnQ6IGN1cnJlbnRJdGVtcy5sZW5ndGgsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0b3RhbEl0ZW1zIC0gdGhpcyB0cmlnZ2VycyB2aWV3cG9ydDp0b3RhbC1pdGVtcy1jaGFuZ2VkIHdoaWNoIGNhbGxzIHJlbmRlckl0ZW1zXG4gICAgICAgIGNvbnN0IGl0ZW1zQWRkZWQgPSBuZXdJdGVtcy5sZW5ndGg7XG4gICAgICAgIGlmIChjb2xsZWN0aW9uPy5nZXRUb3RhbEl0ZW1zICYmIGNvbGxlY3Rpb24/LnNldFRvdGFsSXRlbXMpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50VG90YWwgPSBjb2xsZWN0aW9uLmdldFRvdGFsSXRlbXMoKTtcbiAgICAgICAgICBjb2xsZWN0aW9uLnNldFRvdGFsSXRlbXMoY3VycmVudFRvdGFsICsgaXRlbXNBZGRlZCk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uPy5zZXRUb3RhbEl0ZW1zKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFRvdGFsID0gY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uZ2V0VG90YWxJdGVtcygpO1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLnNldFRvdGFsSXRlbXMoXG4gICAgICAgICAgICBjdXJyZW50VG90YWwgKyBpdGVtc0FkZGVkLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGNvbXBvbmVudC50b3RhbEl0ZW1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC50b3RhbEl0ZW1zID0gY29tcG9uZW50LnRvdGFsSXRlbXMgKyBpdGVtc0FkZGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtaXQgY29tcGxldGlvbiBldmVudFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiaXRlbXM6YWRkZWRcIiwge1xuICAgICAgICAgIGl0ZW1zOiBuZXdJdGVtcyxcbiAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICB0b3RhbDogdGhpcy5nZXRJdGVtQ291bnQoKSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEFkZCBhIHNpbmdsZSBpdGVtIHRvIHRoZSBjb2xsZWN0aW9uIGF0IHRoZSBzdGFydCBvciBlbmRcbiAgICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IHdyYXBzIGFkZEl0ZW1zIGZvciBzaW5nbGUgaXRlbSB1c2UgY2FzZVxuICAgICAgICogQHBhcmFtIGl0ZW0gLSBJdGVtIHRvIGFkZFxuICAgICAgICogQHBhcmFtIHBvc2l0aW9uIC0gV2hlcmUgdG8gYWRkIGl0ZW06IFwic3RhcnRcIiAoZGVmYXVsdCkgb3IgXCJlbmRcIlxuICAgICAgICovXG4gICAgICBhZGRJdGVtKGl0ZW06IFQsIHBvc2l0aW9uOiBcInN0YXJ0XCIgfCBcImVuZFwiID0gXCJzdGFydFwiKTogdm9pZCB7XG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcIltWTGlzdF0gYWRkSXRlbTogbm8gaXRlbSBwcm92aWRlZFwiKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRJdGVtcyhbaXRlbV0sIHBvc2l0aW9uKTtcbiAgICAgIH0sXG5cbiAgICAgIGdldEl0ZW1zKCk6IFRbXSB7XG4gICAgICAgIC8vIENvbGxlY3Rpb24gaXMgYWRkZWQgZGlyZWN0bHkgdG8gY29tcG9uZW50LCBub3QgdG8gdmlld3BvcnQuY29sbGVjdGlvblxuICAgICAgICBpZiAoKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24/LmdldEl0ZW1zKSB7XG4gICAgICAgICAgcmV0dXJuIChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uLmdldEl0ZW1zKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5pdGVtcyB8fCBbXTtcbiAgICAgIH0sXG5cbiAgICAgIGdldFZpc2libGVJdGVtcygpOiBUW10ge1xuICAgICAgICBjb25zdCByYW5nZSA9IGNvbXBvbmVudC52aWV3cG9ydD8uZ2V0VmlzaWJsZVJhbmdlKCkgfHwge1xuICAgICAgICAgIHN0YXJ0OiAwLFxuICAgICAgICAgIGVuZDogMCxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgICAgIHJldHVybiBpdGVtcy5zbGljZShyYW5nZS5zdGFydCwgcmFuZ2UuZW5kKTtcbiAgICAgIH0sXG5cbiAgICAgIGdldEl0ZW1Db3VudCgpOiBudW1iZXIge1xuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmdldFRvdGFsSXRlbXMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50LnRvdGFsSXRlbXMgfHwgY29tcG9uZW50Lml0ZW1zPy5sZW5ndGggfHwgMDtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IGl0ZW0gYXQgYSBzcGVjaWZpYyBpbmRleFxuICAgICAgICogQHBhcmFtIGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHJldHJpZXZlXG4gICAgICAgKiBAcmV0dXJucyBUaGUgaXRlbSBhdCB0aGUgaW5kZXgsIG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmRcbiAgICAgICAqL1xuICAgICAgZ2V0SXRlbShpbmRleDogbnVtYmVyKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICgoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbj8uZ2V0SXRlbSkge1xuICAgICAgICAgIHJldHVybiAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbi5nZXRJdGVtKGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICAgICAgcmV0dXJuIGl0ZW1zW2luZGV4XTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogVXBkYXRlIGl0ZW0gYXQgYSBzcGVjaWZpYyBpbmRleFxuICAgICAgICogQHBhcmFtIGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHVwZGF0ZVxuICAgICAgICogQHBhcmFtIGl0ZW0gLSBUaGUgbmV3IGl0ZW0gZGF0YSAoZnVsbCByZXBsYWNlbWVudClcbiAgICAgICAqL1xuICAgICAgdXBkYXRlSXRlbShpbmRleDogbnVtYmVyLCBpdGVtOiBUKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuXG4gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbVkxpc3RdIHVwZGF0ZUl0ZW06IGluZGV4ICR7aW5kZXh9IG91dCBvZiBib3VuZHNgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmV2aW91c0l0ZW0gPSBpdGVtc1tpbmRleF07XG5cbiAgICAgICAgLy8gVXBkYXRlIGluIGNvbGxlY3Rpb24gaXRlbXMgYXJyYXlcbiAgICAgICAgaWYgKChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uPy5pdGVtcykge1xuICAgICAgICAgIChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uLml0ZW1zW2luZGV4XSA9IGl0ZW07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IGV2ZW50IGZvciByZW5kZXJpbmcgZmVhdHVyZSB0byBoYW5kbGUgRE9NIHVwZGF0ZVxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiaXRlbTp1cGRhdGUtcmVxdWVzdFwiLCB7XG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgaXRlbSxcbiAgICAgICAgICBwcmV2aW91c0l0ZW0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBVcGRhdGUgaXRlbSBieSBJRFxuICAgICAgICogRmluZHMgdGhlIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb24gYnkgaXRzIElEIGFuZCB1cGRhdGVzIGl0IHdpdGggbmV3IGRhdGFcbiAgICAgICAqIFJlLXJlbmRlcnMgdGhlIGl0ZW0gaWYgY3VycmVudGx5IHZpc2libGUgaW4gdGhlIHZpZXdwb3J0XG4gICAgICAgKiBAcGFyYW0gaWQgLSBUaGUgaXRlbSBJRCB0byBmaW5kXG4gICAgICAgKiBAcGFyYW0gZGF0YSAtIFBhcnRpYWwgZGF0YSB0byBtZXJnZSB3aXRoIGV4aXN0aW5nIGl0ZW0sIG9yIGZ1bGwgaXRlbSByZXBsYWNlbWVudFxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBVcGRhdGUgb3B0aW9uc1xuICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiBpdGVtIHdhcyBmb3VuZCBhbmQgdXBkYXRlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICAgKi9cbiAgICAgIHVwZGF0ZUl0ZW1CeUlkKFxuICAgICAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgICAgICBkYXRhOiBQYXJ0aWFsPFQ+LFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgLyoqIElmIHRydWUsIHJlcGxhY2UgdGhlIGVudGlyZSBpdGVtIGluc3RlYWQgb2YgbWVyZ2luZyAoZGVmYXVsdDogZmFsc2UpICovXG4gICAgICAgICAgcmVwbGFjZT86IGJvb2xlYW47XG4gICAgICAgICAgLyoqIElmIHRydWUsIHJlLXJlbmRlciBldmVuIGlmIG5vdCB2aXNpYmxlIChkZWZhdWx0OiBmYWxzZSkgKi9cbiAgICAgICAgICBmb3JjZVJlbmRlcj86IGJvb2xlYW47XG4gICAgICAgIH0gPSB7fSxcbiAgICAgICk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB7IHJlcGxhY2UgPSBmYWxzZSB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG5cbiAgICAgICAgLy8gRmluZCB0aGUgaXRlbSBieSBJRCAoaGFuZGxlIHNwYXJzZSBhcnJheXMgZnJvbSBwYWdpbmF0aW9uKVxuICAgICAgICAvLyBDaGVjayBhbGwgcG9zc2libGUgSUQgZmllbGRzIHNpbmNlIGl0ZW1zIG1heSBoYXZlIGRpZmZlcmVudCBJRCBzdHJ1Y3R1cmVzXG4gICAgICAgIGNvbnN0IGluZGV4ID0gaXRlbXMuZmluZEluZGV4KChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoIWl0ZW0pIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAvLyBDaGVjayBhbGwgcG9zc2libGUgSUQgZmllbGRzIC0gdXNlcl9pZCBpcyBpbXBvcnRhbnQgZm9yIHByb2ZpbGUvY29udGFjdCBpdGVtc1xuICAgICAgICAgIGNvbnN0IGlkc1RvQ2hlY2sgPSBbaXRlbS5pZCwgaXRlbS5faWQsIGl0ZW0udXNlcl9pZF0uZmlsdGVyKFxuICAgICAgICAgICAgKHYpID0+IHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSBudWxsLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIGlkc1RvQ2hlY2suc29tZShcbiAgICAgICAgICAgIChpdGVtSWQpID0+IGl0ZW1JZCA9PT0gaWQgfHwgU3RyaW5nKGl0ZW1JZCkgPT09IFN0cmluZyhpZCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW1ZMaXN0XSB1cGRhdGVJdGVtQnlJZDogaXRlbSB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZGApO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZXZpb3VzSXRlbSA9IGl0ZW1zW2luZGV4XTtcblxuICAgICAgICAvLyBDcmVhdGUgdXBkYXRlZCBpdGVtIC0gZWl0aGVyIHJlcGxhY2UgZW50aXJlbHkgb3IgbWVyZ2VcbiAgICAgICAgbGV0IHVwZGF0ZWRJdGVtOiBUO1xuICAgICAgICBpZiAocmVwbGFjZSkge1xuICAgICAgICAgIHVwZGF0ZWRJdGVtID0geyAuLi5kYXRhLCBpZDogcHJldmlvdXNJdGVtLmlkID8/IGlkIH0gYXMgVDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBPbmx5IG1lcmdlIHByb3BlcnRpZXMgdGhhdCBoYXZlIGFjdHVhbCB2YWx1ZXMgKG5vdCB1bmRlZmluZWQpXG4gICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBwYXJ0aWFsIHVwZGF0ZXMgZnJvbSBvdmVyd3JpdGluZyBleGlzdGluZyBkYXRhXG4gICAgICAgICAgdXBkYXRlZEl0ZW0gPSB7IC4uLnByZXZpb3VzSXRlbSB9IGFzIFQ7XG4gICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGF0YSkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICh1cGRhdGVkSXRlbSBhcyBhbnkpW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgaW4gY29sbGVjdGlvbiBpdGVtcyBhcnJheVxuICAgICAgICBpZiAoKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24/Lml0ZW1zKSB7XG4gICAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24uaXRlbXNbaW5kZXhdID0gdXBkYXRlZEl0ZW07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IGV2ZW50IGZvciByZW5kZXJpbmcgZmVhdHVyZSB0byBoYW5kbGUgRE9NIHVwZGF0ZVxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiaXRlbTp1cGRhdGUtcmVxdWVzdFwiLCB7XG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgaXRlbTogdXBkYXRlZEl0ZW0sXG4gICAgICAgICAgcHJldmlvdXNJdGVtLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlIGl0ZW0gYXQgYSBzcGVjaWZpYyBpbmRleFxuICAgICAgICogUmVtb3ZlcyB0aGUgaXRlbSBmcm9tIHRoZSBjb2xsZWN0aW9uLCB1cGRhdGVzIHRvdGFsSXRlbXMsIGFuZCB0cmlnZ2VycyByZS1yZW5kZXJcbiAgICAgICAqIEBwYXJhbSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZW1vdmVcbiAgICAgICAqIEByZXR1cm5zIHRydWUgaWYgaXRlbSB3YXMgZm91bmQgYW5kIHJlbW92ZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAgICovXG4gICAgICByZW1vdmVJdGVtKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbjtcblxuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW1ZMaXN0XSByZW1vdmVJdGVtOiBpbmRleCAke2luZGV4fSBvdXQgb2YgYm91bmRzYCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVtb3ZlZEl0ZW0gPSBpdGVtc1tpbmRleF07XG5cbiAgICAgICAgLy8gUmVtb3ZlIGZyb20gY29sbGVjdGlvbiBpdGVtcyBhcnJheSAoY29tcG9uZW50LmNvbGxlY3Rpb24uaXRlbXMgaXMgdGhlIGFjdHVhbCBhcnJheSlcbiAgICAgICAgaWYgKChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uPy5pdGVtcykge1xuICAgICAgICAgIChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uLml0ZW1zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJTVBPUlRBTlQ6IEVtaXQgaXRlbTpyZW1vdmUtcmVxdWVzdCBGSVJTVCBzbyByZW5kZXJpbmcgZmVhdHVyZSByZWJ1aWxkcyBjb2xsZWN0aW9uSXRlbXNcbiAgICAgICAgLy8gQkVGT1JFIHNldFRvdGFsSXRlbXMgdHJpZ2dlcnMgYSByZW5kZXIgdmlhIHZpZXdwb3J0OnRvdGFsLWl0ZW1zLWNoYW5nZWRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW06cmVtb3ZlLXJlcXVlc3RcIiwge1xuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIGl0ZW06IHJlbW92ZWRJdGVtLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBVcGRhdGUgdG90YWxJdGVtcyAtIHRoaXMgd2lsbCB0cmlnZ2VyIHZpZXdwb3J0OnRvdGFsLWl0ZW1zLWNoYW5nZWQgd2hpY2ggY2FsbHMgcmVuZGVySXRlbXNcbiAgICAgICAgLy8gQnkgbm93LCBjb2xsZWN0aW9uSXRlbXMgaGFzIGJlZW4gcmVidWlsdCBieSB0aGUgaXRlbTpyZW1vdmUtcmVxdWVzdCBoYW5kbGVyXG4gICAgICAgIGlmIChjb2xsZWN0aW9uPy5nZXRUb3RhbEl0ZW1zICYmIGNvbGxlY3Rpb24/LnNldFRvdGFsSXRlbXMpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50VG90YWwgPSBjb2xsZWN0aW9uLmdldFRvdGFsSXRlbXMoKTtcbiAgICAgICAgICBjb2xsZWN0aW9uLnNldFRvdGFsSXRlbXMoTWF0aC5tYXgoMCwgY3VycmVudFRvdGFsIC0gMSkpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uY29sbGVjdGlvbj8uc2V0VG90YWxJdGVtcykge1xuICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIHZpZXdwb3J0LmNvbGxlY3Rpb24gaWYgYXZhaWxhYmxlXG4gICAgICAgICAgY29uc3QgY3VycmVudFRvdGFsID0gY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uZ2V0VG90YWxJdGVtcygpO1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLnNldFRvdGFsSXRlbXMoXG4gICAgICAgICAgICBNYXRoLm1heCgwLCBjdXJyZW50VG90YWwgLSAxKSxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIExhc3QgcmVzb3J0OiB1cGRhdGUgY29tcG9uZW50LnRvdGFsSXRlbXMgZGlyZWN0bHlcbiAgICAgICAgICBpZiAoY29tcG9uZW50LnRvdGFsSXRlbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29tcG9uZW50LnRvdGFsSXRlbXMgPSBNYXRoLm1heCgwLCBjb21wb25lbnQudG90YWxJdGVtcyAtIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBSZW1vdmUgaXRlbSBieSBJRFxuICAgICAgICogRmluZHMgdGhlIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb24gYnkgaXRzIElEIGFuZCByZW1vdmVzIGl0XG4gICAgICAgKiBVcGRhdGVzIHRvdGFsSXRlbXMgYW5kIHRyaWdnZXJzIHJlLXJlbmRlciBvZiB2aXNpYmxlIGl0ZW1zXG4gICAgICAgKiBPcHRpb25hbGx5IHRyYWNrcyBhcyBwZW5kaW5nIHJlbW92YWwgdG8gZmlsdGVyIGZyb20gZnV0dXJlIGZldGNoZXNcbiAgICAgICAqIEBwYXJhbSBpZCAtIFRoZSBpdGVtIElEIHRvIGZpbmQgYW5kIHJlbW92ZVxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBSZW1vdmUgb3B0aW9ucyAodHJhY2tQZW5kaW5nLCBwZW5kaW5nVGltZW91dClcbiAgICAgICAqIEByZXR1cm5zIHRydWUgaWYgaXRlbSB3YXMgZm91bmQgYW5kIHJlbW92ZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAgICovXG4gICAgICByZW1vdmVJdGVtQnlJZChcbiAgICAgICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICAgICAgb3B0aW9uczogUmVtb3ZlSXRlbU9wdGlvbnMgPSB7fSxcbiAgICAgICk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB7IHRyYWNrUGVuZGluZyA9IHRydWUsIHBlbmRpbmdUaW1lb3V0ID0gNTAwMCB9ID0gb3B0aW9ucztcblxuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW1ZMaXN0XSByZW1vdmVJdGVtQnlJZDogaW52YWxpZCBpZGApO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCB0byBwZW5kaW5nIHJlbW92YWxzIHRvIGZpbHRlciBmcm9tIGZ1dHVyZSBzZXJ2ZXIgcmVzcG9uc2VzXG4gICAgICAgIGlmICh0cmFja1BlbmRpbmcpIHtcbiAgICAgICAgICBwZW5kaW5nUmVtb3ZhbHMuYWRkKGlkKTtcblxuICAgICAgICAgIC8vIENsZWFyIGZyb20gcGVuZGluZyByZW1vdmFscyBhZnRlciB0aW1lb3V0IChzZXJ2ZXIgc2hvdWxkIGhhdmUgdXBkYXRlZCBieSB0aGVuKVxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgcGVuZGluZ1JlbW92YWxzLmRlbGV0ZShpZCk7XG4gICAgICAgICAgfSwgcGVuZGluZ1RpbWVvdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG5cbiAgICAgICAgLy8gRmluZCB0aGUgaXRlbSBieSBJRCAoaGFuZGxlIHNwYXJzZSBhcnJheXMgZnJvbSBwYWdpbmF0aW9uKVxuICAgICAgICAvLyBDaGVjayBhbGwgcG9zc2libGUgSUQgZmllbGRzIHNpbmNlIGl0ZW1zIG1heSBoYXZlIGRpZmZlcmVudCBJRCBzdHJ1Y3R1cmVzXG4gICAgICAgIGNvbnN0IGluZGV4ID0gaXRlbXMuZmluZEluZGV4KChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoIWl0ZW0pIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAvLyBDaGVjayBhbGwgcG9zc2libGUgSUQgZmllbGRzXG4gICAgICAgICAgY29uc3QgaWRzVG9DaGVjayA9IFtpdGVtLmlkLCBpdGVtLl9pZCwgaXRlbS51c2VyX2lkXS5maWx0ZXIoXG4gICAgICAgICAgICAodikgPT4gdiAhPT0gdW5kZWZpbmVkICYmIHYgIT09IG51bGwsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gaWRzVG9DaGVjay5zb21lKFxuICAgICAgICAgICAgKGl0ZW1JZCkgPT4gaXRlbUlkID09PSBpZCB8fCBTdHJpbmcoaXRlbUlkKSA9PT0gU3RyaW5nKGlkKSxcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlSXRlbShpbmRleCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENoZWNrIGlmIGFuIGl0ZW0gSUQgaXMgcGVuZGluZyByZW1vdmFsXG4gICAgICAgKiBAcGFyYW0gaWQgLSBUaGUgaXRlbSBJRCB0byBjaGVja1xuICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgaXRlbSBpcyBwZW5kaW5nIHJlbW92YWxcbiAgICAgICAqL1xuICAgICAgaXNQZW5kaW5nUmVtb3ZhbChpZDogc3RyaW5nIHwgbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBwZW5kaW5nUmVtb3ZhbHMuaGFzKGlkKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IGFsbCBwZW5kaW5nIHJlbW92YWwgSURzXG4gICAgICAgKiBAcmV0dXJucyBTZXQgb2YgcGVuZGluZyByZW1vdmFsIElEc1xuICAgICAgICovXG4gICAgICBnZXRQZW5kaW5nUmVtb3ZhbHMoKTogU2V0PHN0cmluZyB8IG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gbmV3IFNldChwZW5kaW5nUmVtb3ZhbHMpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDbGVhciBhIHNwZWNpZmljIHBlbmRpbmcgcmVtb3ZhbFxuICAgICAgICogQHBhcmFtIGlkIC0gVGhlIGl0ZW0gSUQgdG8gY2xlYXIgZnJvbSBwZW5kaW5nIHJlbW92YWxzXG4gICAgICAgKi9cbiAgICAgIGNsZWFyUGVuZGluZ1JlbW92YWwoaWQ6IHN0cmluZyB8IG51bWJlcik6IHZvaWQge1xuICAgICAgICBwZW5kaW5nUmVtb3ZhbHMuZGVsZXRlKGlkKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2xlYXIgYWxsIHBlbmRpbmcgcmVtb3ZhbHNcbiAgICAgICAqL1xuICAgICAgY2xlYXJBbGxQZW5kaW5nUmVtb3ZhbHMoKTogdm9pZCB7XG4gICAgICAgIHBlbmRpbmdSZW1vdmFscy5jbGVhcigpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBGaWx0ZXIgaXRlbXMgYXJyYXkgdG8gZXhjbHVkZSBwZW5kaW5nIHJlbW92YWxzXG4gICAgICAgKiBVdGlsaXR5IG1ldGhvZCBmb3IgdXNlIGluIGNvbGxlY3Rpb24gYWRhcHRlcnNcbiAgICAgICAqIEBwYXJhbSBpdGVtcyAtIEFycmF5IG9mIGl0ZW1zIHRvIGZpbHRlclxuICAgICAgICogQHJldHVybnMgRmlsdGVyZWQgYXJyYXkgd2l0aG91dCBwZW5kaW5nIHJlbW92YWwgaXRlbXNcbiAgICAgICAqL1xuICAgICAgZmlsdGVyUGVuZGluZ1JlbW92YWxzPEkgZXh0ZW5kcyB7IGlkPzogYW55OyBfaWQ/OiBhbnkgfT4oXG4gICAgICAgIGl0ZW1zOiBJW10sXG4gICAgICApOiBJW10ge1xuICAgICAgICBpZiAocGVuZGluZ1JlbW92YWxzLnNpemUgPT09IDApIHJldHVybiBpdGVtcztcblxuICAgICAgICByZXR1cm4gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgICAgY29uc3QgaWQgPSBpdGVtLl9pZCB8fCBpdGVtLmlkO1xuICAgICAgICAgIHJldHVybiAhcGVuZGluZ1JlbW92YWxzLmhhcyhpZCk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcblxuICAgICAgLy8gTG9hZGluZyBvcGVyYXRpb25zXG4gICAgICBhc3luYyBsb2FkUmFuZ2UoXG4gICAgICAgIHBhZ2U6IG51bWJlcixcbiAgICAgICAgbGltaXQ6IG51bWJlcixcbiAgICAgICAgc3RyYXRlZ3k6IHN0cmluZyA9IFwicGFnZVwiLFxuICAgICAgICBhbGlnbm1lbnQ/OiBzdHJpbmcsXG4gICAgICApIHtcbiAgICAgICAgaXNMb2FkaW5nID0gdHJ1ZTtcblxuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uKSB7XG4gICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gc3RyYXRlZ3kgPT09IFwicGFnZVwiID8gKHBhZ2UgLSAxKSAqIGxpbWl0IDogcGFnZTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24ubG9hZFJhbmdlKG9mZnNldCwgbGltaXQpO1xuICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImxvYWRcIiwgeyBwYWdlLCBsaW1pdCwgc3RyYXRlZ3kgfSk7XG5cbiAgICAgICAgICAgIC8vIFNjcm9sbCB0byB0aGUgbG9hZGVkIHJhbmdlIGlmIGFsaWdubWVudCBpcyBzcGVjaWZpZWRcbiAgICAgICAgICAgIGlmIChhbGlnbm1lbnQpIHtcbiAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBvZmZzZXQ7XG4gICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9JbmRleChpbmRleCwgYWxpZ25tZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImVycm9yXCIsIHsgZXJyb3IgfSk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvLyBEYXRhIGxvYWRpbmdcbiAgICAgIGxvYWROZXh0OiBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbVkxpc3RdIGxvYWROZXh0KClgKTtcblxuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uKSB7XG4gICAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmdldFRvdGFsSXRlbXMoKTtcbiAgICAgICAgICBjb25zdCBsb2FkZWRSYW5nZXMgPSBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5nZXRMb2FkZWRSYW5nZXMoKTtcblxuICAgICAgICAgIC8vIEZpbmQgdGhlIG5leHQgdW5sb2FkZWQgcmFuZ2VcbiAgICAgICAgICBsZXQgbmV4dE9mZnNldCA9IDA7XG4gICAgICAgICAgZm9yIChjb25zdCByYW5nZUlkIG9mIGxvYWRlZFJhbmdlcykge1xuICAgICAgICAgICAgY29uc3QgcmFuZ2VFbmQgPSAocmFuZ2VJZCArIDEpICogKGNvbmZpZy5wYWdpbmF0aW9uPy5saW1pdCB8fCAyMCk7XG4gICAgICAgICAgICBpZiAocmFuZ2VFbmQgPiBuZXh0T2Zmc2V0KSB7XG4gICAgICAgICAgICAgIG5leHRPZmZzZXQgPSByYW5nZUVuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobmV4dE9mZnNldCA8IHRvdGFsSXRlbXMpIHtcbiAgICAgICAgICAgIGF3YWl0IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmxvYWRSYW5nZShcbiAgICAgICAgICAgICAgbmV4dE9mZnNldCxcbiAgICAgICAgICAgICAgY29uZmlnLnBhZ2luYXRpb24/LmxpbWl0IHx8IDIwLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9LFxuXG4gICAgICBpc0xvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBpc0xvYWRpbmc7XG4gICAgICB9LFxuXG4gICAgICBoYXNOZXh0KCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uKSB7XG4gICAgICAgICAgY29uc3QgdG90YWwgPSBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5nZXRUb3RhbEl0ZW1zKCk7XG4gICAgICAgICAgY29uc3QgaXRlbXMgPSBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5nZXRJdGVtcygpO1xuICAgICAgICAgIHJldHVybiBpdGVtcy5sZW5ndGggPCB0b3RhbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9LFxuXG4gICAgICAvLyBOb3RlOiBTZWxlY3Rpb24gb3BlcmF0aW9ucyBhcmUgaGFuZGxlZCBieSB0aGUgd2l0aFNlbGVjdGlvbiBmZWF0dXJlXG4gICAgICAvLyBUaGVzZSBhcmUga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBidXQgZGVsZWdhdGUgdG8gc2VsZWN0aW9uIGZlYXR1cmUgaWYgYXZhaWxhYmxlXG4gICAgICBnZXRTZWxlY3RlZElkcygpOiAoc3RyaW5nIHwgbnVtYmVyKVtdIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQuZ2V0U2VsZWN0ZWRJbmRpY2VzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAvLyBVc2Ugc2VsZWN0aW9uIGZlYXR1cmUgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgICAgICAgY29uc3QgaW5kaWNlcyA9IGNvbXBvbmVudC5nZXRTZWxlY3RlZEluZGljZXMoKTtcbiAgICAgICAgICByZXR1cm4gaW5kaWNlcy5tYXAoKGlkeDogbnVtYmVyKSA9PiAoaXRlbXNbaWR4XSBhcyBhbnkpPy5pZCB8fCBpZHgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZhbGxiYWNrIHRvIGxvY2FsIHRyYWNraW5nXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHNlbGVjdGVkSWRzKTtcbiAgICAgIH0sXG5cbiAgICAgIHNlbGVjdEl0ZW0oaWQ6IHN0cmluZyB8IG51bWJlcikge1xuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5zZWxlY3RJdGVtcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gVXNlIHNlbGVjdGlvbiBmZWF0dXJlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gaXRlbXMuZmluZEluZGV4KChpdGVtOiBhbnkpID0+IGl0ZW0uaWQgPT09IGlkKTtcbiAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgY29tcG9uZW50LnNlbGVjdEl0ZW1zKFtpbmRleF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBsb2NhbCB0cmFja2luZ1xuICAgICAgICAgIHNlbGVjdGVkSWRzLmFkZChpZCk7XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInNlbGVjdGlvbjpjaGFuZ2VcIiwge1xuICAgICAgICAgICAgc2VsZWN0ZWQ6IHRoaXMuZ2V0U2VsZWN0ZWRJZHMoKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgZGVzZWxlY3RJdGVtKGlkOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQuZGVzZWxlY3RJdGVtcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gVXNlIHNlbGVjdGlvbiBmZWF0dXJlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gaXRlbXMuZmluZEluZGV4KChpdGVtOiBhbnkpID0+IGl0ZW0uaWQgPT09IGlkKTtcbiAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgY29tcG9uZW50LmRlc2VsZWN0SXRlbXMoW2luZGV4XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIGxvY2FsIHRyYWNraW5nXG4gICAgICAgICAgc2VsZWN0ZWRJZHMuZGVsZXRlKGlkKTtcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwic2VsZWN0aW9uOmNoYW5nZVwiLCB7XG4gICAgICAgICAgICBzZWxlY3RlZDogdGhpcy5nZXRTZWxlY3RlZElkcygpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBjbGVhclNlbGVjdGlvbigpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQuY2xlYXJTZWxlY3Rpb24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIFVzZSBzZWxlY3Rpb24gZmVhdHVyZSBpZiBhdmFpbGFibGVcbiAgICAgICAgICBjb21wb25lbnQuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBsb2NhbCB0cmFja2luZ1xuICAgICAgICAgIHNlbGVjdGVkSWRzLmNsZWFyKCk7XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInNlbGVjdGlvbjpjaGFuZ2VcIiwgeyBzZWxlY3RlZDogW10gfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8vIFNjcm9sbGluZyBtZXRob2RzXG4gICAgICBzY3JvbGxUb0luZGV4OiAoXG4gICAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICAgIGFsaWdubWVudDogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIsXG4gICAgICAgIGFuaW1hdGU/OiBib29sZWFuLFxuICAgICAgKSA9PiB7XG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQpIHtcbiAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9JbmRleChpbmRleCwgYWxpZ25tZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNjcm9sbCB0byBpbmRleCBhbmQgc2VsZWN0IGl0ZW0gYWZ0ZXIgZGF0YSBsb2Fkc1xuICAgICAgICogVXNlZnVsIGZvciBydW50aW1lIHNjcm9sbCtzZWxlY3Qgd2hlbiBWTGlzdCBpcyBhbHJlYWR5IGNyZWF0ZWRcbiAgICAgICAqL1xuICAgICAgc2Nyb2xsVG9JbmRleEFuZFNlbGVjdDogYXN5bmMgZnVuY3Rpb24gKFxuICAgICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgICBzZWxlY3RJZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgICAgICBhbGlnbm1lbnQ6IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiID0gXCJzdGFydFwiLFxuICAgICAgKSB7XG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQpIHtcbiAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9JbmRleChpbmRleCwgYWxpZ25tZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExpc3RlbiBmb3IgcmFuZ2UgbG9hZCB0byBjb21wbGV0ZSwgdGhlbiBzZWxlY3RcbiAgICAgICAgY29uc3Qgb25SYW5nZUxvYWRlZCA9ICgpID0+IHtcbiAgICAgICAgICBjb21wb25lbnQub2ZmPy4oXCJ2aWV3cG9ydDpyYW5nZS1sb2FkZWRcIiwgb25SYW5nZUxvYWRlZCk7XG4gICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQuc2VsZWN0QnlJZCkge1xuICAgICAgICAgICAgICBjb21wb25lbnQuc2VsZWN0QnlJZChzZWxlY3RJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpyYW5nZS1sb2FkZWRcIiwgb25SYW5nZUxvYWRlZCk7XG5cbiAgICAgICAgLy8gRmFsbGJhY2sgdGltZW91dCBpbiBjYXNlIGV2ZW50IGRvZXNuJ3QgZmlyZSAoZGF0YSBhbHJlYWR5IGxvYWRlZClcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29tcG9uZW50Lm9mZj8uKFwidmlld3BvcnQ6cmFuZ2UtbG9hZGVkXCIsIG9uUmFuZ2VMb2FkZWQpO1xuICAgICAgICAgIGlmIChjb21wb25lbnQuc2VsZWN0QnlJZCkge1xuICAgICAgICAgICAgY29tcG9uZW50LnNlbGVjdEJ5SWQoc2VsZWN0SWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgMzAwKTtcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9LFxuXG4gICAgICBzY3JvbGxUb0l0ZW06IGFzeW5jIGZ1bmN0aW9uIChcbiAgICAgICAgaXRlbUlkOiBzdHJpbmcsXG4gICAgICAgIGFsaWdubWVudDogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIsXG4gICAgICAgIGFuaW1hdGU/OiBib29sZWFuLFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgICAgICBjb25zdCBpbmRleCA9IGl0ZW1zLmZpbmRJbmRleChcbiAgICAgICAgICAoaXRlbTogYW55KSA9PiBTdHJpbmcoaXRlbS5pZCkgPT09IFN0cmluZyhpdGVtSWQpLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsVG9JbmRleChpbmRleCwgYWxpZ25tZW50LCBhbmltYXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUud2FybihgSXRlbSAke2l0ZW1JZH0gbm90IGZvdW5kYCk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH0sXG5cbiAgICAgIHNjcm9sbFRvVG9wOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjcm9sbFRvSW5kZXgoMCwgXCJzdGFydFwiKTtcbiAgICAgIH0sXG5cbiAgICAgIHNjcm9sbFRvQm90dG9tOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHRvdGFsSXRlbXMgPSB0aGlzLmdldEl0ZW1Db3VudCgpO1xuICAgICAgICBpZiAodG90YWxJdGVtcyA+IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxUb0luZGV4KHRvdGFsSXRlbXMgLSAxLCBcImVuZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9LFxuXG4gICAgICBzY3JvbGxUb1BhZ2U6IGFzeW5jIGZ1bmN0aW9uIChcbiAgICAgICAgcGFnZU51bTogbnVtYmVyLFxuICAgICAgICBhbGlnbm1lbnQ6IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiID0gXCJzdGFydFwiLFxuICAgICAgICBhbmltYXRlPzogYm9vbGVhbixcbiAgICAgICkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW1ZMaXN0XSBzY3JvbGxUb1BhZ2UoJHtwYWdlTnVtfSlgKTtcblxuICAgICAgICAvLyBHZXQgbGltaXQgZnJvbSBjb25maWcgKHJhbmdlU2l6ZSkgb3IgZGVmYXVsdFxuICAgICAgICBjb25zdCBsaW1pdCA9IGNvbmZpZy5wYWdpbmF0aW9uPy5saW1pdCB8fCAyMDtcblxuICAgICAgICAvLyBDaGVjayBpZiB3ZSdyZSBpbiBjdXJzb3IgbW9kZVxuICAgICAgICBpZiAoY29uZmlnLnBhZ2luYXRpb24/LnN0cmF0ZWd5ID09PSBcImN1cnNvclwiKSB7XG4gICAgICAgICAgLy8gSW4gY3Vyc29yIG1vZGUsIHdlIG5lZWQgdG8gaGFuZGxlIHNlcXVlbnRpYWwgbG9hZGluZ1xuICAgICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSk/LmNvbGxlY3Rpb247XG4gICAgICAgICAgaWYgKGNvbGxlY3Rpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRlZFJhbmdlcyA9IGNvbGxlY3Rpb24uZ2V0TG9hZGVkUmFuZ2VzKCk7XG4gICAgICAgICAgICBjb25zdCBoaWdoZXN0TG9hZGVkUGFnZSA9IGxvYWRlZFJhbmdlcy5zaXplO1xuXG4gICAgICAgICAgICBpZiAocGFnZU51bSA+IGhpZ2hlc3RMb2FkZWRQYWdlICsgMSkge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgYFtWTGlzdF0gQ2Fubm90IGp1bXAgdG8gcGFnZSAke3BhZ2VOdW19IGluIGN1cnNvciBtb2RlLiBgICtcbiAgICAgICAgICAgICAgICAgIGBMb2FkaW5nIHBhZ2VzIHNlcXVlbnRpYWxseSBmcm9tICR7XG4gICAgICAgICAgICAgICAgICAgIGhpZ2hlc3RMb2FkZWRQYWdlICsgMVxuICAgICAgICAgICAgICAgICAgfSB0byAke3BhZ2VOdW19YCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2Ugdmlld3BvcnQncyBzY3JvbGxUb1BhZ2UgaWYgYXZhaWxhYmxlXG4gICAgICAgIGlmICgoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSk/LnNjcm9sbFRvUGFnZSkge1xuICAgICAgICAgIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zY3JvbGxUb1BhZ2UocGFnZU51bSwgbGltaXQsIGFsaWdubWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gc2Nyb2xsVG9JbmRleFxuICAgICAgICAgIGNvbnN0IHRhcmdldEluZGV4ID0gKHBhZ2VOdW0gLSAxKSAqIGxpbWl0O1xuICAgICAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsVG9JbmRleCh0YXJnZXRJbmRleCwgYWxpZ25tZW50KTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgZ2V0U2Nyb2xsUG9zaXRpb246ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC52aWV3cG9ydD8uZ2V0U2Nyb2xsUG9zaXRpb24oKSB8fCAwO1xuICAgICAgfSxcblxuICAgICAgZ2V0Q3VycmVudEN1cnNvcjogKCkgPT4ge1xuICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpPy5jb2xsZWN0aW9uO1xuICAgICAgICByZXR1cm4gY29sbGVjdGlvbj8uZ2V0Q3VycmVudEN1cnNvcj8uKCkgfHwgbnVsbDtcbiAgICAgIH0sXG5cbiAgICAgIHNldFNjcm9sbEFuaW1hdGlvbihlbmFibGVkOiBib29sZWFuKSB7XG4gICAgICAgIC8vIFN0b3JlIGFuaW1hdGlvbiBwcmVmZXJlbmNlICh3b3VsZCBiZSB1c2VkIGJ5IHZpZXdwb3J0IHNjcm9sbGluZyBmZWF0dXJlKVxuICAgICAgICBjb21wb25lbnQuc2Nyb2xsQW5pbWF0aW9uID0gZW5hYmxlZDtcbiAgICAgIH0sXG5cbiAgICAgIC8vIFN0YXRlXG4gICAgICBnZXRTdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpdGVtczogdGhpcy5nZXRJdGVtcygpLFxuICAgICAgICAgIHRvdGFsSXRlbXM6IGNvbXBvbmVudC52aWV3cG9ydD8uY29sbGVjdGlvblxuICAgICAgICAgICAgPyBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5nZXRUb3RhbEl0ZW1zKClcbiAgICAgICAgICAgIDogY29tcG9uZW50LnRvdGFsSXRlbXMgfHwgMCxcbiAgICAgICAgICB2aXNpYmxlUmFuZ2U6IGNvbXBvbmVudC52aWV3cG9ydD8uZ2V0VmlzaWJsZVJhbmdlKCkgfHwge1xuICAgICAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgICAgICBlbmQ6IDAsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzY3JvbGxQb3NpdGlvbjogY29tcG9uZW50LnZpZXdwb3J0Py5nZXRTY3JvbGxQb3NpdGlvbigpIHx8IDAsXG4gICAgICAgICAgc2VsZWN0ZWRJZHM6IHRoaXMuZ2V0U2VsZWN0ZWRJZHMoKSxcbiAgICAgICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nKCksXG4gICAgICAgIH07XG4gICAgICB9LFxuXG4gICAgICAvLyBMaWZlY3ljbGVcbiAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmRlc3Ryb3kpIHtcbiAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIHNlbGVjdGVkSWRzLmNsZWFyKCk7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJkZXN0cm95ZWRcIik7XG4gICAgICB9LFxuICAgIH07XG4gIH07XG59O1xuIiwKICAgICIvKipcbiAqIG10cmwtYWRkb25zIExpc3QgQ29tcG9uZW50IENvbnN0YW50c1xuICpcbiAqIENvbnN0YW50cyBmb3IgdGhlIGFkZG9ucyBsaXN0IGNvbXBvbmVudC5cbiAqIE5vdGU6IEJhc2UgbXRybCBsaXN0IGZ1bmN0aW9uYWxpdHkgaXMgaGFuZGxlZCBieSBtdHJsIGNvcmUuXG4gKiBUaGVzZSBjb25zdGFudHMgYXJlIGZvciBhZGRvbnMtc3BlY2lmaWMgZmVhdHVyZXMgb25seS5cbiAqL1xuXG4vKipcbiAqIENTUyBjbGFzcyBuYW1lcyBmb3IgVkxpc3QgY29tcG9uZW50XG4gKiBGb2xsb3dpbmcgQkVNIGNvbnZlbnRpb246IGNvbXBvbmVudF9fZWxlbWVudC0tbW9kaWZpZXJcbiAqIE5vdGU6IG10cmwgcHJlZml4IGlzIGFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgY29yZSBET00gY2xhc3NlcyBzeXN0ZW1cbiAqL1xuZXhwb3J0IGNvbnN0IFZMSVNUX0NMQVNTRVMgPSB7XG4gIC8qKiBMaXN0IGVsZW1lbnQgKi9cbiAgTElTVDogXCJ2bGlzdFwiLFxuICAvKiogTGlzdCBpdGVtICovXG4gIElURU06IFwidmlld3BvcnQtaXRlbVwiLFxuICAvKiogU2VsZWN0ZWQgbGlzdCBpdGVtICovXG4gIFNFTEVDVEVEOiBcInZpZXdwb3J0LWl0ZW0tLXNlbGVjdGVkXCIsXG4gIC8qKiBFbXB0eSBzdGF0ZSAqL1xuICBFTVBUWTogXCJ2bGlzdC0tZW1wdHlcIixcbn0gYXMgY29uc3Q7XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL3NlbGVjdGlvbi50c1xuXG5pbXBvcnQgdHlwZSB7IFZMaXN0Q29uZmlnLCBWTGlzdENvbXBvbmVudCwgVkxpc3RJdGVtIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBWTElTVF9DTEFTU0VTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUFJFRklYLCBhZGRDbGFzcywgcmVtb3ZlQ2xhc3MgfSBmcm9tIFwibXRybFwiO1xuXG4vKipcbiAqIFNlbGVjdGlvbiBzdGF0ZSBpbnRlcmZhY2VcbiAqL1xuaW50ZXJmYWNlIFNlbGVjdGlvblN0YXRlIHtcbiAgc2VsZWN0ZWRJZHM6IFNldDxzdHJpbmcgfCBudW1iZXI+O1xuICBtb2RlOiBcIm5vbmVcIiB8IFwic2luZ2xlXCIgfCBcIm11bHRpcGxlXCI7XG4gIGxhc3RTZWxlY3RlZEluZGV4PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEdldCBpdGVtIElEIGZyb20gZWxlbWVudCBvciBpdGVtIGRhdGFcbiAqL1xuY29uc3QgZ2V0SXRlbUlkID0gKGl0ZW06IGFueSk6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChpdGVtPy5pZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gaXRlbS5pZDtcbiAgaWYgKGl0ZW0/Ll9pZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gaXRlbS5faWQ7XG4gIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgaXRlbSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIGl0ZW07XG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIEFkZHMgc2VsZWN0aW9uIG1hbmFnZW1lbnQgY2FwYWJpbGl0aWVzIHRvIFZMaXN0IGNvbXBvbmVudFxuICovXG5leHBvcnQgY29uc3Qgd2l0aFNlbGVjdGlvbiA9IDxUIGV4dGVuZHMgVkxpc3RJdGVtID0gVkxpc3RJdGVtPihcbiAgY29uZmlnOiBWTGlzdENvbmZpZzxUPixcbikgPT4ge1xuICByZXR1cm4gKGNvbXBvbmVudDogVkxpc3RDb21wb25lbnQ8VD4pOiBWTGlzdENvbXBvbmVudDxUPiA9PiB7XG4gICAgaWYgKCFjb25maWcuc2VsZWN0aW9uPy5lbmFibGVkIHx8IGNvbmZpZy5zZWxlY3Rpb24/Lm1vZGUgPT09IFwibm9uZVwiKSB7XG4gICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlOiBTZWxlY3Rpb25TdGF0ZSA9IHtcbiAgICAgIHNlbGVjdGVkSWRzOiBuZXcgU2V0KCksXG4gICAgICBtb2RlOiBjb25maWcuc2VsZWN0aW9uPy5tb2RlIHx8IFwic2luZ2xlXCIsXG4gICAgICBsYXN0U2VsZWN0ZWRJbmRleDogdW5kZWZpbmVkLFxuICAgIH07XG5cbiAgICBjb25zdCByZXF1aXJlTW9kaWZpZXJzID0gY29uZmlnLnNlbGVjdGlvbj8ucmVxdWlyZU1vZGlmaWVycyA/PyBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEFwcGx5IHNlbGVjdGlvbiBjbGFzcyB0byByZW5kZXJlZCBlbGVtZW50cyBtYXRjaGluZyBzZWxlY3RlZCBJRHNcbiAgICAgKi9cbiAgICBjb25zdCBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMgPSAoKSA9PiB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBjb21wb25lbnQuZWxlbWVudD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICAgYC4ke1BSRUZJWH0tdmlld3BvcnQtaXRlbXNgLFxuICAgICAgKTtcbiAgICAgIGlmICghY29udGFpbmVyKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGl0ZW1zID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICAgIGAuJHtQUkVGSVh9LXZpZXdwb3J0LWl0ZW1bZGF0YS1pZF1gLFxuICAgICAgKTtcblxuICAgICAgaXRlbXMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGVsIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBpZCA9IGVsZW1lbnQuZGF0YXNldC5pZDtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBDaGVjayBib3RoIHN0cmluZyBhbmQgbnVtYmVyIHZlcnNpb25zIG9mIHRoZSBJRFxuICAgICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPVxuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuaGFzKGlkKSB8fCBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoTnVtYmVyKGlkKSk7XG4gICAgICAgICAgaWYgKGlzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGFkZENsYXNzKGVsZW1lbnQsIFZMSVNUX0NMQVNTRVMuU0VMRUNURUQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBWTElTVF9DTEFTU0VTLlNFTEVDVEVEKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgaXRlbSBjbGljayBmb3Igc2VsZWN0aW9uXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlSXRlbUNsaWNrID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHZpZXdwb3J0SXRlbSA9IChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChcbiAgICAgICAgYC4ke1BSRUZJWH0tdmlld3BvcnQtaXRlbVtkYXRhLWluZGV4XWAsXG4gICAgICApIGFzIEhUTUxFbGVtZW50O1xuICAgICAgaWYgKCF2aWV3cG9ydEl0ZW0pIHJldHVybjtcblxuICAgICAgY29uc3QgaW5kZXggPSBwYXJzZUludCh2aWV3cG9ydEl0ZW0uZGF0YXNldC5pbmRleCB8fCBcIi0xXCIpO1xuICAgICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBlbmhhbmNlZENvbXBvbmVudCA9IGNvbXBvbmVudCBhcyBhbnk7XG4gICAgICBjb25zdCBpdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1zPy4oKTtcbiAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtcz8uW2luZGV4XTtcbiAgICAgIGlmICghaXRlbSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBpdGVtSWQgPSBnZXRJdGVtSWQoaXRlbSk7XG4gICAgICBpZiAoaXRlbUlkID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgICAgY29uc3Qgd2FzU2VsZWN0ZWQgPSBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoaXRlbUlkKTtcblxuICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IFwic2luZ2xlXCIpIHtcbiAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgaWYgKCF3YXNTZWxlY3RlZCkge1xuICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmFkZChpdGVtSWQpO1xuICAgICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ID0gaW5kZXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubW9kZSA9PT0gXCJtdWx0aXBsZVwiKSB7XG4gICAgICAgIGlmIChlLnNoaWZ0S2V5ICYmIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBzdGFydCA9IE1hdGgubWluKHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4LCBpbmRleCk7XG4gICAgICAgICAgY29uc3QgZW5kID0gTWF0aC5tYXgoc3RhdGUubGFzdFNlbGVjdGVkSW5kZXgsIGluZGV4KTtcblxuICAgICAgICAgIGlmICghZS5jdHJsS2V5ICYmICFlLm1ldGFLZXkpIHtcbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmNsZWFyKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCByYW5nZUl0ZW0gPSBpdGVtcz8uW2ldO1xuICAgICAgICAgICAgY29uc3QgcmFuZ2VJdGVtSWQgPSBnZXRJdGVtSWQocmFuZ2VJdGVtKTtcbiAgICAgICAgICAgIGlmIChyYW5nZUl0ZW1JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmFkZChyYW5nZUl0ZW1JZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGUuY3RybEtleSB8fCBlLm1ldGFLZXkpIHtcbiAgICAgICAgICBpZiAod2FzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmRlbGV0ZShpdGVtSWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5hZGQoaXRlbUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggPSBpbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAocmVxdWlyZU1vZGlmaWVycykge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmFkZChpdGVtSWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAod2FzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuZGVsZXRlKGl0ZW1JZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5hZGQoaXRlbUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggPSBpbmRleDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMoKTtcbiAgICAgIGVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRW1pdCBzZWxlY3Rpb24gY2hhbmdlIGV2ZW50XG4gICAgICovXG4gICAgY29uc3QgZW1pdFNlbGVjdGlvbkNoYW5nZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGVuaGFuY2VkQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIGFueTtcbiAgICAgIGNvbnN0IGl0ZW1zID0gZW5oYW5jZWRDb21wb25lbnQuZ2V0SXRlbXM/LigpIHx8IFtdO1xuXG4gICAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gaXRlbXMuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSBnZXRJdGVtSWQoaXRlbSk7XG4gICAgICAgIHJldHVybiBpZCAhPT0gdW5kZWZpbmVkICYmIHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhpZCk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc2VsZWN0ZWRJbmRpY2VzID0gaXRlbXMucmVkdWNlKFxuICAgICAgICAoYWNjOiBudW1iZXJbXSwgaXRlbTogYW55LCBpZHg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkID0gZ2V0SXRlbUlkKGl0ZW0pO1xuICAgICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkICYmIHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKGlkeCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sXG4gICAgICAgIFtdIGFzIG51bWJlcltdLFxuICAgICAgKTtcblxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInNlbGVjdGlvbjpjaGFuZ2VcIiwgeyBzZWxlY3RlZEl0ZW1zLCBzZWxlY3RlZEluZGljZXMgfSk7XG5cbiAgICAgIGlmIChjb25maWcuc2VsZWN0aW9uPy5vblNlbGVjdGlvbkNoYW5nZSkge1xuICAgICAgICBjb25maWcuc2VsZWN0aW9uLm9uU2VsZWN0aW9uQ2hhbmdlKHNlbGVjdGVkSXRlbXMsIHNlbGVjdGVkSW5kaWNlcyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFNldHVwOiBsaXN0ZW4gZm9yIHJlbmRlcnMgYW5kIGNsaWNrc1xuICAgIGNvbnN0IHNldHVwID0gKCkgPT4ge1xuICAgICAgLy8gQWRkIG1vZGUgY2xhc3MgdG8gY29udGFpbmVyXG4gICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgYWRkQ2xhc3MoY29tcG9uZW50LmVsZW1lbnQsIFwidmxpc3QtLXNlbGVjdGlvblwiKTtcbiAgICAgICAgYWRkQ2xhc3MoY29tcG9uZW50LmVsZW1lbnQsIGB2bGlzdC0tc2VsZWN0aW9uLSR7c3RhdGUubW9kZX1gKTtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUl0ZW1DbGljaywgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFwcGx5IHNlbGVjdGlvbiBhZnRlciBlYWNoIHJlbmRlclxuICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLm9uPy4oXG4gICAgICAgIFwidmlld3BvcnQ6aXRlbXMtcmVuZGVyZWRcIixcbiAgICAgICAgYXBwbHlTZWxlY3Rpb25Ub0VsZW1lbnRzLFxuICAgICAgKTtcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5vbj8uKFwidmlld3BvcnQ6cmVuZGVyZWRcIiwgYXBwbHlTZWxlY3Rpb25Ub0VsZW1lbnRzKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgc2VsZWN0aW9uIHdoZW4gaXRlbSBpcyByZW1vdmVkXG4gICAgICAoY29tcG9uZW50IGFzIGFueSkub24/LihcbiAgICAgICAgXCJpdGVtOnJlbW92ZWRcIixcbiAgICAgICAgKGRhdGE6IHsgaXRlbTogYW55OyBpbmRleDogbnVtYmVyIH0pID0+IHtcbiAgICAgICAgICBjb25zdCBpdGVtSWQgPSBnZXRJdGVtSWQoZGF0YS5pdGVtKTtcbiAgICAgICAgICBpZiAoaXRlbUlkICE9PSB1bmRlZmluZWQgJiYgc3RhdGUuc2VsZWN0ZWRJZHMuaGFzKGl0ZW1JZCkpIHtcbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmRlbGV0ZShpdGVtSWQpO1xuICAgICAgICAgICAgLy8gSWYgdGhlIHJlbW92ZWQgaXRlbSB3YXMgdGhlIGxhc3Qgc2VsZWN0ZWQgaW5kZXgsIGNsZWFyIGl0XG4gICAgICAgICAgICBpZiAoc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggPT09IGRhdGEuaW5kZXgpIHtcbiAgICAgICAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ID4gZGF0YS5pbmRleFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIC8vIEFkanVzdCBsYXN0U2VsZWN0ZWRJbmRleCBzaW5jZSBpdGVtcyBzaGlmdGVkIGRvd25cbiAgICAgICAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXgtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvLyBJbml0aWFsaXplIGFmdGVyIGNvbXBvbmVudCBpcyByZWFkeVxuICAgIHNldFRpbWVvdXQoc2V0dXAsIDApO1xuXG4gICAgLy8gTGlzdGVuIGZvciBpbml0aWFsIGxvYWQgY29tcGxldGUgdG8gYXV0by1zZWxlY3QgaXRlbVxuICAgIC8vIFRoaXMgbXVzdCBiZSBpbiB3aXRoU2VsZWN0aW9uIGJlY2F1c2Ugc2VsZWN0QnlJZCBpcyBkZWZpbmVkIGhlcmVcbiAgICAoY29tcG9uZW50IGFzIGFueSkub24/LihcbiAgICAgIFwiY29sbGVjdGlvbjppbml0aWFsLWxvYWQtY29tcGxldGVcIixcbiAgICAgIChkYXRhOiB7IHNlbGVjdElkOiBzdHJpbmcgfCBudW1iZXIgfSkgPT4ge1xuICAgICAgICBpZiAoZGF0YT8uc2VsZWN0SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFVzZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgdG8gZW5zdXJlIHJlbmRlcmluZyBpcyBjb21wbGV0ZVxuICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoc3RhdGUubW9kZSA9PT0gXCJzaW5nbGVcIikge1xuICAgICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuYWRkKGRhdGEuc2VsZWN0SWQpO1xuICAgICAgICAgICAgYXBwbHlTZWxlY3Rpb25Ub0VsZW1lbnRzKCk7XG4gICAgICAgICAgICBlbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIENsZWFudXAgb24gZGVzdHJveVxuICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IGNvbXBvbmVudC5kZXN0cm95O1xuICAgIGNvbXBvbmVudC5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgY29tcG9uZW50LmVsZW1lbnQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVJdGVtQ2xpY2ssIHRydWUpO1xuICAgICAgb3JpZ2luYWxEZXN0cm95Py4oKTtcbiAgICB9O1xuXG4gICAgLy8gRW5oYW5jZWQgY29tcG9uZW50IHdpdGggc2VsZWN0aW9uIEFQSVxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG5cbiAgICAgIHNlbGVjdEl0ZW1zKGluZGljZXM6IG51bWJlcltdKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gKHRoaXMgYXMgYW55KS5nZXRJdGVtcz8uKCk7XG4gICAgICAgIGlmICghaXRlbXMpIHJldHVybjtcblxuICAgICAgICBpZiAoc3RhdGUubW9kZSA9PT0gXCJzaW5nbGVcIikge1xuICAgICAgICAgIC8vIEluIHNpbmdsZSBtb2RlLCBjbGVhciBwcmV2aW91cyBzZWxlY3Rpb24gYmVmb3JlIGFkZGluZyBuZXcgb25lXG4gICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgICBpZiAoaW5kaWNlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBpbmRpY2VzID0gW2luZGljZXNbMF1dO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGluZGljZXMuZm9yRWFjaCgoaW5kZXgpID0+IHtcbiAgICAgICAgICBjb25zdCBpdGVtSWQgPSBnZXRJdGVtSWQoaXRlbXNbaW5kZXhdKTtcbiAgICAgICAgICBpZiAoaXRlbUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmFkZChpdGVtSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGluZGljZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ID0gaW5kaWNlc1tpbmRpY2VzLmxlbmd0aCAtIDFdO1xuICAgICAgICB9XG5cbiAgICAgICAgYXBwbHlTZWxlY3Rpb25Ub0VsZW1lbnRzKCk7XG4gICAgICAgIGVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICAgIH0sXG5cbiAgICAgIGRlc2VsZWN0SXRlbXMoaW5kaWNlczogbnVtYmVyW10pIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSAodGhpcyBhcyBhbnkpLmdldEl0ZW1zPy4oKTtcbiAgICAgICAgaWYgKCFpdGVtcykgcmV0dXJuO1xuXG4gICAgICAgIGluZGljZXMuZm9yRWFjaCgoaW5kZXgpID0+IHtcbiAgICAgICAgICBjb25zdCBpdGVtSWQgPSBnZXRJdGVtSWQoaXRlbXNbaW5kZXhdKTtcbiAgICAgICAgICBpZiAoaXRlbUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmRlbGV0ZShpdGVtSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXBwbHlTZWxlY3Rpb25Ub0VsZW1lbnRzKCk7XG4gICAgICAgIGVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICAgIH0sXG5cbiAgICAgIGNsZWFyU2VsZWN0aW9uKCkge1xuICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgYXBwbHlTZWxlY3Rpb25Ub0VsZW1lbnRzKCk7XG4gICAgICAgIGVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICAgIH0sXG5cbiAgICAgIGdldFNlbGVjdGVkSXRlbXMoKTogVFtdIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSAodGhpcyBhcyBhbnkpLmdldEl0ZW1zPy4oKSB8fCBbXTtcbiAgICAgICAgcmV0dXJuIGl0ZW1zLmZpbHRlcigoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgaWQgPSBnZXRJdGVtSWQoaXRlbSk7XG4gICAgICAgICAgcmV0dXJuIGlkICE9PSB1bmRlZmluZWQgJiYgc3RhdGUuc2VsZWN0ZWRJZHMuaGFzKGlkKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICBnZXRTZWxlY3RlZEluZGljZXMoKTogbnVtYmVyW10ge1xuICAgICAgICBjb25zdCBpdGVtcyA9ICh0aGlzIGFzIGFueSkuZ2V0SXRlbXM/LigpIHx8IFtdO1xuICAgICAgICByZXR1cm4gaXRlbXMucmVkdWNlKChhY2M6IG51bWJlcltdLCBpdGVtOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBpZCA9IGdldEl0ZW1JZChpdGVtKTtcbiAgICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCAmJiBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoaWQpKSB7XG4gICAgICAgICAgICBhY2MucHVzaChpbmRleCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIFtdIGFzIG51bWJlcltdKTtcbiAgICAgIH0sXG5cbiAgICAgIGlzU2VsZWN0ZWQoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9ICh0aGlzIGFzIGFueSkuZ2V0SXRlbXM/LigpO1xuICAgICAgICBjb25zdCBpdGVtSWQgPSBnZXRJdGVtSWQoaXRlbXM/LltpbmRleF0pO1xuICAgICAgICByZXR1cm4gaXRlbUlkICE9PSB1bmRlZmluZWQgJiYgc3RhdGUuc2VsZWN0ZWRJZHMuaGFzKGl0ZW1JZCk7XG4gICAgICB9LFxuXG4gICAgICBzZWxlY3RCeUlkKGlkOiBzdHJpbmcgfCBudW1iZXIsIHNpbGVudDogYm9vbGVhbiA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IFwic2luZ2xlXCIpIHtcbiAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuYWRkKGlkKTtcbiAgICAgICAgYXBwbHlTZWxlY3Rpb25Ub0VsZW1lbnRzKCk7XG4gICAgICAgIGlmICghc2lsZW50KSB7XG4gICAgICAgICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTZWxlY3QgaXRlbSBhdCBpbmRleCwgc2Nyb2xsaW5nIGFuZCB3YWl0aW5nIGZvciBkYXRhIGlmIG5lZWRlZFxuICAgICAgICogSGFuZGxlcyB2aXJ0dWFsIHNjcm9sbGluZyBieSBsb2FkaW5nIGRhdGEgYmVmb3JlIHNlbGVjdGluZ1xuICAgICAgICovXG4gICAgICBhc3luYyBzZWxlY3RBdEluZGV4KGluZGV4OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgZW5oYW5jZWRDb21wb25lbnQgPSBjb21wb25lbnQgYXMgYW55O1xuICAgICAgICBjb25zdCB0b3RhbEl0ZW1zID0gZW5oYW5jZWRDb21wb25lbnQuZ2V0SXRlbUNvdW50Py4oKSB8fCAwO1xuXG4gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdG90YWxJdGVtcykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpcnN0IHNjcm9sbCB0byB0aGUgaW5kZXggKHRyaWdnZXJzIGRhdGEgbG9hZGluZyBpZiBuZWVkZWQpXG4gICAgICAgIGlmIChlbmhhbmNlZENvbXBvbmVudC52aWV3cG9ydD8uc2Nyb2xsVG9JbmRleCkge1xuICAgICAgICAgIGVuaGFuY2VkQ29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbFRvSW5kZXgoaW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJ5IHRvIHNlbGVjdCBpbW1lZGlhdGVseSAtIHdvcmtzIGlmIGl0ZW0gaXMgYWxyZWFkeSBsb2FkZWRcbiAgICAgICAgY29uc3QgaXRlbXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRJdGVtcz8uKCkgfHwgW107XG4gICAgICAgIGlmIChpdGVtc1tpbmRleF0pIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW1zKFtpbmRleF0pO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXRlbSBub3QgbG9hZGVkIHlldCAtIHdhaXQgZm9yIGRhdGEgdG8gbG9hZCB0aGVuIHNlbGVjdFxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBsZXQgcmVzb2x2ZWQgPSBmYWxzZTtcblxuICAgICAgICAgIGNvbnN0IG9uUmFuZ2VMb2FkZWQgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzb2x2ZWQpIHJldHVybjtcbiAgICAgICAgICAgIHJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5vZmY/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBvblJhbmdlTG9hZGVkKTtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbXMoW2luZGV4XSk7XG4gICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpyYW5nZS1sb2FkZWRcIiwgb25SYW5nZUxvYWRlZCk7XG5cbiAgICAgICAgICAvLyBGYWxsYmFjayB0aW1lb3V0IGluIGNhc2UgZXZlbnQgZG9lc24ndCBmaXJlIChkYXRhIGFscmVhZHkgbG9hZGVkKVxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm47XG4gICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICBjb21wb25lbnQub2ZmPy4oXCJ2aWV3cG9ydDpyYW5nZS1sb2FkZWRcIiwgb25SYW5nZUxvYWRlZCk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW1zKFtpbmRleF0pO1xuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICB9LCAzMDApO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2VsZWN0IG5leHQgaXRlbSByZWxhdGl2ZSB0byBjdXJyZW50IHNlbGVjdGlvblxuICAgICAgICogSGFuZGxlcyB2aXJ0dWFsIHNjcm9sbGluZyBieSBsb2FkaW5nIGRhdGEgYmVmb3JlIHNlbGVjdGluZ1xuICAgICAgICovXG4gICAgICBhc3luYyBzZWxlY3ROZXh0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBlbmhhbmNlZENvbXBvbmVudCA9IGNvbXBvbmVudCBhcyBhbnk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSW5kaWNlcyA9IHRoaXMuZ2V0U2VsZWN0ZWRJbmRpY2VzKCk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkSW5kaWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAvLyBTZWxlY3QgZmlyc3QgaXRlbVxuICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdEF0SW5kZXgoMCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSBzZWxlY3RlZEluZGljZXNbMF07XG4gICAgICAgIGNvbnN0IG5leHRJbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XG4gICAgICAgIGNvbnN0IHRvdGFsSXRlbXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRJdGVtQ291bnQ/LigpIHx8IDA7XG5cbiAgICAgICAgaWYgKG5leHRJbmRleCA8IHRvdGFsSXRlbXMpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RBdEluZGV4KG5leHRJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNlbGVjdCBwcmV2aW91cyBpdGVtIHJlbGF0aXZlIHRvIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAgICAgKiBIYW5kbGVzIHZpcnR1YWwgc2Nyb2xsaW5nIGJ5IGxvYWRpbmcgZGF0YSBiZWZvcmUgc2VsZWN0aW5nXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIHNlbGVjdFByZXZpb3VzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSB0aGlzLmdldFNlbGVjdGVkSW5kaWNlcygpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZEluZGljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gc2VsZWN0ZWRJbmRpY2VzWzBdO1xuICAgICAgICBjb25zdCBwcmV2SW5kZXggPSBjdXJyZW50SW5kZXggLSAxO1xuXG4gICAgICAgIGlmIChwcmV2SW5kZXggPj0gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdEF0SW5kZXgocHJldkluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhTZWxlY3Rpb247XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL2Zvcm0vZm9ybS50c1xuXG4vKipcbiAqIEZvcm0gQ29tcG9uZW50IC0gRnVuY3Rpb25hbCBmb3JtIGJ1aWxkZXIgd2l0aCBtdHJsIGNvbXBvc2l0aW9uXG4gKlxuICogQSBmb3JtIGNvbXBvbmVudCB0aGF0IHVzZXMgdGhlIG10cmwtYWRkb25zIGxheW91dCBzeXN0ZW0gdG8gYnVpbGRcbiAqIGZvcm1zIGZyb20gc2NoZW1hIGRlZmluaXRpb25zLCB3aXRoIGJ1aWx0LWluIGRhdGEgbWFuYWdlbWVudCxcbiAqIHZhbGlkYXRpb24sIGFuZCBzdWJtaXNzaW9uIGhhbmRsaW5nLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRm9ybUNvbmZpZywgRm9ybUNvbXBvbmVudCB9IGZyb20gJy4vdHlwZXMnXG5cbi8vIEltcG9ydCBtdHJsIGNvbXBvc2Ugc3lzdGVtXG5pbXBvcnQgeyBwaXBlIH0gZnJvbSAnbXRybCdcbmltcG9ydCB7IGNyZWF0ZUJhc2UsIHdpdGhFbGVtZW50IH0gZnJvbSAnbXRybCdcbmltcG9ydCB7IHdpdGhFdmVudHMsIHdpdGhMaWZlY3ljbGUgfSBmcm9tICdtdHJsJ1xuXG4vLyBJbXBvcnQgZm9ybSBmZWF0dXJlc1xuaW1wb3J0IHtcbiAgd2l0aExheW91dCxcbiAgd2l0aEZpZWxkcyxcbiAgd2l0aERhdGEsXG4gIHdpdGhDb250cm9sbGVyLFxuICB3aXRoU3VibWl0LFxuICB3aXRoQVBJXG59IGZyb20gJy4vZmVhdHVyZXMnXG5cbi8vIEltcG9ydCBjb25maWd1cmF0aW9uXG5pbXBvcnQgeyBjcmVhdGVCYXNlQ29uZmlnLCBnZXRFbGVtZW50Q29uZmlnIH0gZnJvbSAnLi9jb25maWcnXG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBGb3JtIGNvbXBvbmVudCB1c2luZyBmdW5jdGlvbmFsIGNvbXBvc2l0aW9uXG4gKlxuICogQHBhcmFtIHtGb3JtQ29uZmlnfSBjb25maWcgLSBGb3JtIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHJldHVybnMge0Zvcm1Db21wb25lbnR9IEEgZnVsbHkgY29uZmlndXJlZCBmb3JtIGNvbXBvbmVudFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBjcmVhdGVGb3JtIH0gZnJvbSAnbXRybC1hZGRvbnMnXG4gKiBpbXBvcnQgeyBjcmVhdGVUZXh0ZmllbGQsIGNyZWF0ZVN3aXRjaCwgY3JlYXRlQ2hpcHMgfSBmcm9tICdtdHJsJ1xuICpcbiAqIGNvbnN0IGZvcm0gPSBjcmVhdGVGb3JtKHtcbiAqICAgY2xhc3M6ICdhY2NvdW50LWZvcm0nLFxuICogICBhY3Rpb246ICcvYXBpL3VzZXJzLycsXG4gKiAgIGxheW91dDogW1xuICogICAgIFsnc2VjdGlvbicsIHsgY2xhc3M6ICd1c2VyLXNlY3Rpb24nIH0sXG4gKiAgICAgICBbJ2RpdicsIHsgY2xhc3M6ICdzZWN0aW9uLXRpdGxlJywgdGV4dDogJ1VzZXInIH1dLFxuICogICAgICAgW2NyZWF0ZVRleHRmaWVsZCwgJ2luZm8udXNlcm5hbWUnLCB7IGxhYmVsOiAnVXNlcm5hbWUnIH1dLFxuICogICAgICAgW2NyZWF0ZUNoaXBzLCAnaW5mby5yb2xlJywge1xuICogICAgICAgICBsYWJlbDogJ1JvbGUnLFxuICogICAgICAgICBjaGlwczogW1xuICogICAgICAgICAgIHsgdGV4dDogJ3JlZ2lzdGVyZWQnLCB2YWx1ZTogJ3JlZ2lzdGVyZWQnIH0sXG4gKiAgICAgICAgICAgeyB0ZXh0OiAnYWRtaW4nLCB2YWx1ZTogJ2FkbWluJyB9LFxuICogICAgICAgICAgIHsgdGV4dDogJ3ByZW1pdW0nLCB2YWx1ZTogJ3ByZW1pdW0nIH1cbiAqICAgICAgICAgXVxuICogICAgICAgfV0sXG4gKiAgICAgICBbY3JlYXRlU3dpdGNoLCAnaW5mby5lbmFibGVkJywgeyBsYWJlbDogJ0VuYWJsZWQnIH1dXG4gKiAgICAgXVxuICogICBdLFxuICogICBvbjoge1xuICogICAgIGNoYW5nZTogKGRhdGEpID0+IGNvbnNvbGUubG9nKCdGb3JtIGNoYW5nZWQ6JywgZGF0YSksXG4gKiAgICAgc3VibWl0OiAoZGF0YSkgPT4gY29uc29sZS5sb2coJ0Zvcm0gc3VibWl0dGVkOicsIGRhdGEpXG4gKiAgIH1cbiAqIH0pXG4gKlxuICogLy8gQXBwZW5kIHRvIERPTVxuICogZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmb3JtLmVsZW1lbnQpXG4gKlxuICogLy8gU2V0IGRhdGFcbiAqIGZvcm0uc2V0RGF0YSh7XG4gKiAgIHVzZXJuYW1lOiAnam9obl9kb2UnLFxuICogICByb2xlOiAnYWRtaW4nLFxuICogICBlbmFibGVkOiB0cnVlXG4gKiB9KVxuICpcbiAqIC8vIEdldCBkYXRhXG4gKiBjb25zdCBkYXRhID0gZm9ybS5nZXREYXRhKClcbiAqXG4gKiAvLyBDaGVjayBpZiBtb2RpZmllZFxuICogaWYgKGZvcm0uaXNNb2RpZmllZCgpKSB7XG4gKiAgIGF3YWl0IGZvcm0uc3VibWl0KClcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlRm9ybSA9IChjb25maWc6IEZvcm1Db25maWcgPSB7fSk6IEZvcm1Db21wb25lbnQgPT4ge1xuICB0cnkge1xuICAgIC8vIFByb2Nlc3MgY29uZmlndXJhdGlvbiB3aXRoIGRlZmF1bHRzXG4gICAgY29uc3QgYmFzZUNvbmZpZyA9IGNyZWF0ZUJhc2VDb25maWcoY29uZmlnKVxuXG4gICAgLy8gQnVpbGQgdGhlIGZvcm0gdGhyb3VnaCBmdW5jdGlvbmFsIGNvbXBvc2l0aW9uXG4gICAgLy8gRWFjaCBmdW5jdGlvbiBpbiB0aGUgcGlwZSBhZGRzIHNwZWNpZmljIGNhcGFiaWxpdGllc1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IHBpcGUoXG4gICAgICAvLyAxLiBGb3VuZGF0aW9uIGxheWVyIC0gQmFzZSBjb21wb25lbnQgd2l0aCBjb25maWdcbiAgICAgIGNyZWF0ZUJhc2UsXG5cbiAgICAgIC8vIDIuIEV2ZW50IHN5c3RlbSAtIEFkZHMgb24vb2ZmL2VtaXQgbWV0aG9kc1xuICAgICAgd2l0aEV2ZW50cygpLFxuXG4gICAgICAvLyAzLiBET00gZWxlbWVudCAtIENyZWF0ZXMgdGhlIHJvb3QgY29udGFpbmVyIGVsZW1lbnRcbiAgICAgIHdpdGhFbGVtZW50KGdldEVsZW1lbnRDb25maWcoYmFzZUNvbmZpZykpLFxuXG4gICAgICAvLyA0LiBMYXlvdXQgLSBDcmVhdGVzIGZvcm0gZWxlbWVudCBhbmQgcHJvY2Vzc2VzIGxheW91dCBzY2hlbWFcbiAgICAgIHdpdGhMYXlvdXQoYmFzZUNvbmZpZyksXG5cbiAgICAgIC8vIDUuIEZpZWxkcyAtIEV4dHJhY3RzIGZpZWxkcyBmcm9tIGxheW91dCBhbmQgY3JlYXRlcyByZWdpc3RyeVxuICAgICAgd2l0aEZpZWxkcyhiYXNlQ29uZmlnKSxcblxuICAgICAgLy8gNi4gRGF0YSAtIEFkZHMgZGF0YSBtYW5hZ2VtZW50IChnZXQvc2V0LCBjaGFuZ2UgdHJhY2tpbmcpXG4gICAgICB3aXRoRGF0YShiYXNlQ29uZmlnKSxcblxuICAgICAgLy8gNy4gQ29udHJvbGxlciAtIEFkZHMgbW9kZSBtYW5hZ2VtZW50IChyZWFkL2NyZWF0ZS91cGRhdGUpXG4gICAgICB3aXRoQ29udHJvbGxlcihiYXNlQ29uZmlnKSxcblxuICAgICAgLy8gOC4gU3VibWl0IC0gQWRkcyB2YWxpZGF0aW9uIGFuZCBzdWJtaXNzaW9uIGhhbmRsaW5nXG4gICAgICB3aXRoU3VibWl0KGJhc2VDb25maWcpLFxuXG4gICAgICAvLyA5LiBMaWZlY3ljbGUgLSBBZGRzIGxpZmVjeWNsZSBtYW5hZ2VtZW50IChkZXN0cm95KVxuICAgICAgd2l0aExpZmVjeWNsZSgpLFxuXG4gICAgICAvLyAxMC4gQVBJIC0gQ3JlYXRlcyBjbGVhbiBwdWJsaWMgQVBJXG4gICAgICB3aXRoQVBJKGJhc2VDb25maWcpXG4gICAgKShiYXNlQ29uZmlnKVxuXG4gICAgLy8gQXBwZW5kIHRvIGNvbnRhaW5lciBpZiBwcm92aWRlZFxuICAgIGlmIChjb25maWcuY29udGFpbmVyICYmIGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICBjb25maWcuY29udGFpbmVyLmFwcGVuZENoaWxkKGNvbXBvbmVudC5lbGVtZW50KVxuICAgIH1cblxuICAgIHJldHVybiBjb21wb25lbnQgYXMgRm9ybUNvbXBvbmVudFxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Zvcm0gY3JlYXRpb24gZXJyb3I6JywgZXJyb3IpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGZvcm06ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlRm9ybVxuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2xheW91dC50c1xuXG4vKipcbiAqIExheW91dCBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogQnVpbGRzIHRoZSBmb3JtIHN0cnVjdHVyZSBmcm9tIGEgbGF5b3V0IHNjaGVtYSB1c2luZyBtdHJsLWFkZG9ucyBsYXlvdXQgc3lzdGVtXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlTGF5b3V0IH0gZnJvbSBcIi4uLy4uLy4uL2NvcmUvbGF5b3V0XCI7XG5pbXBvcnQgdHlwZSB7IEZvcm1Db25maWcsIEJhc2VGb3JtQ29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBGT1JNX0RFRkFVTFRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGZvcm0gZWxlbWVudFxuICovXG5jb25zdCBjcmVhdGVGb3JtRWxlbWVudCA9IChjb25maWc6IEZvcm1Db25maWcpOiBIVE1MRm9ybUVsZW1lbnQgPT4ge1xuICBjb25zdCBmb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImZvcm1cIik7XG5cbiAgaWYgKGNvbmZpZy5tZXRob2QpIHtcbiAgICBmb3JtLnNldEF0dHJpYnV0ZShcIm1ldGhvZFwiLCBjb25maWcubWV0aG9kKTtcbiAgfVxuXG4gIGlmIChjb25maWcuYWN0aW9uKSB7XG4gICAgZm9ybS5zZXRBdHRyaWJ1dGUoXCJhY3Rpb25cIiwgY29uZmlnLmFjdGlvbik7XG4gIH1cblxuICBpZiAoY29uZmlnLmF1dG9jb21wbGV0ZSkge1xuICAgIGZvcm0uc2V0QXR0cmlidXRlKFwiYXV0b2NvbXBsZXRlXCIsIGNvbmZpZy5hdXRvY29tcGxldGUpO1xuICB9XG5cbiAgLy8gUHJldmVudCBkZWZhdWx0IGZvcm0gc3VibWlzc2lvbiAtIHdlIGhhbmRsZSBpdCBwcm9ncmFtbWF0aWNhbGx5XG4gIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGZvcm07XG59O1xuXG4vKipcbiAqIFByb2Nlc3NlcyBsYXlvdXQgc2NoZW1hIGFuZCBleHRyYWN0cyBuYW1lZCBjb21wb25lbnRzXG4gKi9cbmNvbnN0IHByb2Nlc3NMYXlvdXRTY2hlbWEgPSAoXG4gIHNjaGVtYTogdW5rbm93bltdLFxuICBmb3JtOiBIVE1MRm9ybUVsZW1lbnQsXG4gIGNvbmZpZzogRm9ybUNvbmZpZyxcbik6IHsgdWk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBsYXlvdXRSZXN1bHQ6IHVua25vd24gfSA9PiB7XG4gIGlmICghc2NoZW1hIHx8ICFBcnJheS5pc0FycmF5KHNjaGVtYSkgfHwgc2NoZW1hLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB7IHVpOiB7fSwgbGF5b3V0UmVzdWx0OiBudWxsIH07XG4gIH1cblxuICAvLyBVc2UgbXRybC1hZGRvbnMgY3JlYXRlTGF5b3V0IHRvIHByb2Nlc3MgdGhlIHNjaGVtYVxuICBjb25zdCBsYXlvdXRSZXN1bHQgPSBjcmVhdGVMYXlvdXQoc2NoZW1hLCBmb3JtLCB7fSk7XG5cbiAgLy8gRXh0cmFjdCBuYW1lZCBjb21wb25lbnRzIGZyb20gbGF5b3V0IHJlc3VsdFxuICBjb25zdCB1aTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICBpZiAobGF5b3V0UmVzdWx0ICYmIHR5cGVvZiBsYXlvdXRSZXN1bHQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAvLyBUaGUgbGF5b3V0IHJlc3VsdCBjb250YWlucyBjb21wb25lbnQgcmVmZXJlbmNlc1xuICAgIGNvbnN0IHJlc3VsdCA9IGxheW91dFJlc3VsdCBhcyB7IGNvbXBvbmVudD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH07XG4gICAgaWYgKHJlc3VsdC5jb21wb25lbnQpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odWksIHJlc3VsdC5jb21wb25lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IHVpLCBsYXlvdXRSZXN1bHQgfTtcbn07XG5cbi8qKlxuICogd2l0aExheW91dCBmZWF0dXJlXG4gKiBBZGRzIGZvcm0gZWxlbWVudCBjcmVhdGlvbiBhbmQgbGF5b3V0IHByb2Nlc3NpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhMYXlvdXQgPSAoY29uZmlnOiBGb3JtQ29uZmlnKSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIEJhc2VGb3JtQ29tcG9uZW50PihcbiAgICBjb21wb25lbnQ6IFQsXG4gICk6IFQgJiB7XG4gICAgZm9ybTogSFRNTEZvcm1FbGVtZW50O1xuICAgIHVpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBsYXlvdXRSZXN1bHQ6IHVua25vd247XG4gIH0gPT4ge1xuICAgIC8vIENyZWF0ZSB0aGUgZm9ybSBlbGVtZW50XG4gICAgY29uc3QgZm9ybSA9IGNyZWF0ZUZvcm1FbGVtZW50KGNvbmZpZyk7XG5cbiAgICAvLyBBcHBlbmQgZm9ybSB0byBjb21wb25lbnQncyByb290IGVsZW1lbnRcbiAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFwcGVuZENoaWxkKGZvcm0pO1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgbGF5b3V0IHNjaGVtYSBpZiBwcm92aWRlZFxuICAgIGNvbnN0IHsgdWksIGxheW91dFJlc3VsdCB9ID0gY29uZmlnLmxheW91dFxuICAgICAgPyBwcm9jZXNzTGF5b3V0U2NoZW1hKGNvbmZpZy5sYXlvdXQsIGZvcm0sIGNvbmZpZylcbiAgICAgIDogeyB1aToge30sIGxheW91dFJlc3VsdDogbnVsbCB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIGZvcm0sXG4gICAgICB1aSxcbiAgICAgIGxheW91dFJlc3VsdCxcbiAgICB9O1xuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgd2l0aExheW91dDtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9jb25zdGFudHMudHNcblxuLyoqXG4gKiBEYXRhIHN0YXRlIGNvbnN0YW50c1xuICogVHJhY2tzIHdoZXRoZXIgZm9ybSBkYXRhIGhhcyBiZWVuIG1vZGlmaWVkIGZyb20gaW5pdGlhbCBzdGF0ZVxuICovXG5leHBvcnQgY29uc3QgREFUQV9TVEFURSA9IHtcbiAgLyoqIERhdGEgbWF0Y2hlcyBpbml0aWFsIHN0YXRlIC0gbm8gY2hhbmdlcyBtYWRlICovXG4gIFBSSVNUSU5FOiBcInByaXN0aW5lXCIsXG4gIC8qKiBEYXRhIGhhcyBiZWVuIG1vZGlmaWVkIGZyb20gaW5pdGlhbCBzdGF0ZSAqL1xuICBESVJUWTogXCJkaXJ0eVwiLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBGb3JtIGV2ZW50IGNvbnN0YW50c1xuICovXG5leHBvcnQgY29uc3QgRk9STV9FVkVOVFMgPSB7XG4gIC8qKiBGaXJlZCB3aGVuIGFueSBmaWVsZCB2YWx1ZSBjaGFuZ2VzICovXG4gIENIQU5HRTogXCJjaGFuZ2VcIixcbiAgLyoqIEZpcmVkIHdoZW4gZm9ybSBpcyBzdWJtaXR0ZWQgKi9cbiAgU1VCTUlUOiBcInN1Ym1pdFwiLFxuICAvKiogRmlyZWQgd2hlbiBkYXRhIHN0YXRlIGNoYW5nZXMgKHByaXN0aW5lIDwtPiBkaXJ0eSkgKi9cbiAgU1RBVEVfQ0hBTkdFOiBcInN0YXRlOmNoYW5nZVwiLFxuICAvKiogRmlyZWQgd2hlbiBkYXRhIGlzIHNldCBvbiB0aGUgZm9ybSAqL1xuICBEQVRBX1NFVDogXCJkYXRhOnNldFwiLFxuICAvKiogRmlyZWQgd2hlbiBkYXRhIGlzIHJldHJpZXZlZCBmcm9tIHRoZSBmb3JtICovXG4gIERBVEFfR0VUOiBcImRhdGE6Z2V0XCIsXG4gIC8qKiBGaXJlZCB3aGVuIGEgc3BlY2lmaWMgZmllbGQgY2hhbmdlcyAqL1xuICBGSUVMRF9DSEFOR0U6IFwiZmllbGQ6Y2hhbmdlXCIsXG4gIC8qKiBGaXJlZCB3aGVuIHZhbGlkYXRpb24gZmFpbHMgKi9cbiAgVkFMSURBVElPTl9FUlJPUjogXCJ2YWxpZGF0aW9uOmVycm9yXCIsXG4gIC8qKiBGaXJlZCB3aGVuIHN1Ym1pdCBzdWNjZWVkcyAqL1xuICBTVUJNSVRfU1VDQ0VTUzogXCJzdWJtaXQ6c3VjY2Vzc1wiLFxuICAvKiogRmlyZWQgd2hlbiBzdWJtaXQgZmFpbHMgKi9cbiAgU1VCTUlUX0VSUk9SOiBcInN1Ym1pdDplcnJvclwiLFxuICAvKiogRmlyZWQgd2hlbiBmb3JtIGlzIHJlc2V0IHRvIGluaXRpYWwgc3RhdGUgKi9cbiAgUkVTRVQ6IFwicmVzZXRcIixcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogRm9ybSBDU1MgY2xhc3MgbW9kaWZpZXJzXG4gKi9cbmV4cG9ydCBjb25zdCBGT1JNX0NMQVNTRVMgPSB7XG4gIC8qKiBBcHBsaWVkIHdoZW4gZGF0YSBoYXMgYmVlbiBtb2RpZmllZCAqL1xuICBNT0RJRklFRDogXCJtb2RpZmllZFwiLFxuICAvKiogQXBwbGllZCB3aGVuIGZvcm0gaXMgc3VibWl0dGluZyAqL1xuICBTVUJNSVRUSU5HOiBcInN1Ym1pdHRpbmdcIixcbiAgLyoqIEFwcGxpZWQgd2hlbiBmb3JtIGlzIGRpc2FibGVkICovXG4gIERJU0FCTEVEOiBcImRpc2FibGVkXCIsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIERlZmF1bHQgZm9ybSBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBGT1JNX0RFRkFVTFRTID0ge1xuICBwcmVmaXg6IFwibXRybFwiLFxuICBjb21wb25lbnROYW1lOiBcImZvcm1cIixcbiAgdGFnOiBcImRpdlwiLFxuICBmb3JtVGFnOiBcImZvcm1cIixcbiAgbWV0aG9kOiBcIlBPU1RcIixcbiAgYXV0b2NvbXBsZXRlOiBcIm9mZlwiLFxuICB1c2VDaGFuZ2VzOiB0cnVlLFxuICBjb250cm9sczogW1wic3VibWl0XCIsIFwiY2FuY2VsXCJdLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBGaWVsZCBuYW1lIHByZWZpeGVzIHVzZWQgZm9yIGV4dHJhY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0IEZJRUxEX1BSRUZJWEVTID0ge1xuICBJTkZPOiBcImluZm8uXCIsXG4gIEZJTEU6IFwiZmlsZS5cIixcbiAgREFUQTogXCJkYXRhLlwiLFxufSBhcyBjb25zdDtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9jb25maWcudHNcblxuaW1wb3J0IHR5cGUgeyBGb3JtQ29uZmlnLCBGb3JtU3RhdGUsIEZvcm1EYXRhIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IEZPUk1fREVGQVVMVFMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuLy8gUmUtZXhwb3J0IEZPUk1fREVGQVVMVFMgZm9yIHVzZSBpbiBvdGhlciBtb2R1bGVzXG5leHBvcnQgeyBGT1JNX0RFRkFVTFRTIH07XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgYmFzZSBjb25maWd1cmF0aW9uIHdpdGggZGVmYXVsdHMgYXBwbGllZFxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlQmFzZUNvbmZpZyA9IChjb25maWc6IEZvcm1Db25maWcgPSB7fSk6IEZvcm1Db25maWcgPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLkZPUk1fREVGQVVMVFMsXG4gICAgLi4uY29uZmlnLFxuICAgIHByZWZpeDogY29uZmlnLnByZWZpeCB8fCBGT1JNX0RFRkFVTFRTLnByZWZpeCxcbiAgICBjb21wb25lbnROYW1lOiBjb25maWcuY29tcG9uZW50TmFtZSB8fCBGT1JNX0RFRkFVTFRTLmNvbXBvbmVudE5hbWUsXG4gICAgY29udHJvbHM6XG4gICAgICBjb25maWcuY29udHJvbHMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IGNvbmZpZy5jb250cm9sc1xuICAgICAgICA6IFsuLi5GT1JNX0RFRkFVTFRTLmNvbnRyb2xzXSxcbiAgICBzeXNpbmZvOiBjb25maWcuc3lzaW5mbyB8fCBbXSxcbiAgICB2YWxpZGF0aW9uOiBjb25maWcudmFsaWRhdGlvbiB8fCBbXSxcbiAgICBvbjogY29uZmlnLm9uIHx8IHt9LFxuICB9O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBpbml0aWFsIGZvcm0gc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUluaXRpYWxTdGF0ZSA9IChjb25maWc6IEZvcm1Db25maWcpOiBGb3JtU3RhdGUgPT4ge1xuICBjb25zdCBpbml0aWFsRGF0YSA9IGNvbmZpZy5kYXRhID8geyAuLi5jb25maWcuZGF0YSB9IDoge307XG5cbiAgcmV0dXJuIHtcbiAgICBtb2RpZmllZDogZmFsc2UsXG4gICAgc3VibWl0dGluZzogZmFsc2UsXG4gICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgIGluaXRpYWxEYXRhLFxuICAgIGN1cnJlbnREYXRhOiB7IC4uLmluaXRpYWxEYXRhIH0sXG4gICAgZXJyb3JzOiB7fSxcbiAgfTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgZWxlbWVudCBjb25maWd1cmF0aW9uIGZvciB3aXRoRWxlbWVudFxuICovXG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudENvbmZpZyA9IChjb25maWc6IEZvcm1Db25maWcpID0+IHtcbiAgY29uc3QgcHJlZml4ID0gY29uZmlnLnByZWZpeCB8fCBGT1JNX0RFRkFVTFRTLnByZWZpeDtcbiAgY29uc3QgY29tcG9uZW50TmFtZSA9IGNvbmZpZy5jb21wb25lbnROYW1lIHx8IEZPUk1fREVGQVVMVFMuY29tcG9uZW50TmFtZTtcblxuICBjb25zdCBjbGFzc05hbWVzID0gW2Ake3ByZWZpeH0tJHtjb21wb25lbnROYW1lfWBdO1xuXG4gIGlmIChjb25maWcuY2xhc3MpIHtcbiAgICBjbGFzc05hbWVzLnB1c2goY29uZmlnLmNsYXNzKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdGFnOiBcImRpdlwiLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcy5qb2luKFwiIFwiKSxcbiAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICBcImRhdGEtY29tcG9uZW50XCI6IGNvbXBvbmVudE5hbWUsXG4gICAgfSxcbiAgfTtcbn07XG5cbi8qKlxuICogRXh0cmFjdHMgZmllbGQgbmFtZSBmcm9tIGEgcHJlZml4ZWQgbmFtZSAoZS5nLiwgJ2luZm8udXNlcm5hbWUnIC0+ICd1c2VybmFtZScpXG4gKi9cbmV4cG9ydCBjb25zdCBleHRyYWN0RmllbGROYW1lID0gKHByZWZpeGVkTmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgcGFydHMgPSBwcmVmaXhlZE5hbWUuc3BsaXQoXCIuXCIpO1xuICByZXR1cm4gcGFydHMubGVuZ3RoID4gMSA/IHBhcnRzLnNsaWNlKDEpLmpvaW4oXCIuXCIpIDogcHJlZml4ZWROYW1lO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBmdWxsIGZpZWxkIHBhdGggaW5jbHVkaW5nIHByZWZpeFxuICovXG5leHBvcnQgY29uc3QgZ2V0RmllbGRQYXRoID0gKG5hbWU6IHN0cmluZywgcHJlZml4OiBzdHJpbmcgPSBcImluZm9cIik6IHN0cmluZyA9PiB7XG4gIGlmIChuYW1lLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgIHJldHVybiBuYW1lO1xuICB9XG4gIHJldHVybiBgJHtwcmVmaXh9LiR7bmFtZX1gO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBuYW1lIGlzIGEgZmllbGQgbmFtZSAoc3RhcnRzIHdpdGggaW5mby4gb3IgZGF0YS4pXG4gKi9cbmV4cG9ydCBjb25zdCBpc0ZpZWxkTmFtZSA9IChuYW1lOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgcmV0dXJuIG5hbWUuc3RhcnRzV2l0aChcImluZm8uXCIpIHx8IG5hbWUuc3RhcnRzV2l0aChcImRhdGEuXCIpO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBuYW1lIGlzIGEgZmlsZSBmaWVsZCBuYW1lXG4gKi9cbmV4cG9ydCBjb25zdCBpc0ZpbGVOYW1lID0gKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gbmFtZS5zdGFydHNXaXRoKFwiZmlsZS5cIik7XG59O1xuXG4vKipcbiAqIERlZXAgY29tcGFyaXNvbiBvZiB0d28gdmFsdWVzIGZvciBjaGFuZ2UgZGV0ZWN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBpc1ZhbHVlRXF1YWwgPSAoYTogdW5rbm93biwgYjogdW5rbm93bik6IGJvb2xlYW4gPT4ge1xuICAvLyBIYW5kbGUgbnVsbC91bmRlZmluZWRcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgcmV0dXJuIGEgPT0gYjtcblxuICAvLyBIYW5kbGUgYXJyYXlzXG4gIGlmIChBcnJheS5pc0FycmF5KGEpICYmIEFycmF5LmlzQXJyYXkoYikpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGEuZXZlcnkoKHZhbCwgaWR4KSA9PiBpc1ZhbHVlRXF1YWwodmFsLCBiW2lkeF0pKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBvYmplY3RzXG4gIGlmICh0eXBlb2YgYSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgYiA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IGtleXNBID0gT2JqZWN0LmtleXMoYSBhcyBvYmplY3QpO1xuICAgIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMoYiBhcyBvYmplY3QpO1xuICAgIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBrZXlzQS5ldmVyeSgoa2V5KSA9PlxuICAgICAgaXNWYWx1ZUVxdWFsKFxuICAgICAgICAoYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSxcbiAgICAgICAgKGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0sXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvLyBIYW5kbGUgcHJpbWl0aXZlcyAod2l0aCB0eXBlIGNvZXJjaW9uIGZvciBzdHJpbmcvbnVtYmVyIGNvbXBhcmlzb24pXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcbiAgcmV0dXJuIGEgPT0gYjtcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIGZvcm0gZGF0YSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwgc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IGhhc0RhdGFDaGFuZ2VkID0gKFxuICBpbml0aWFsOiBGb3JtRGF0YSxcbiAgY3VycmVudDogRm9ybURhdGEsXG4pOiBib29sZWFuID0+IHtcbiAgY29uc3QgYWxsS2V5cyA9IG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGluaXRpYWwpLCAuLi5PYmplY3Qua2V5cyhjdXJyZW50KV0pO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIGFsbEtleXMpIHtcbiAgICBpZiAoIWlzVmFsdWVFcXVhbChpbml0aWFsW2tleV0sIGN1cnJlbnRba2V5XSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogR2V0cyBvbmx5IHRoZSBtb2RpZmllZCBmaWVsZHMgYmV0d2VlbiBpbml0aWFsIGFuZCBjdXJyZW50IGRhdGFcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE1vZGlmaWVkRmllbGRzID0gKFxuICBpbml0aWFsOiBGb3JtRGF0YSxcbiAgY3VycmVudDogRm9ybURhdGEsXG4pOiBGb3JtRGF0YSA9PiB7XG4gIGNvbnN0IG1vZGlmaWVkOiBGb3JtRGF0YSA9IHt9O1xuICBjb25zdCBhbGxLZXlzID0gbmV3IFNldChbLi4uT2JqZWN0LmtleXMoaW5pdGlhbCksIC4uLk9iamVjdC5rZXlzKGN1cnJlbnQpXSk7XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgYWxsS2V5cykge1xuICAgIGlmICghaXNWYWx1ZUVxdWFsKGluaXRpYWxba2V5XSwgY3VycmVudFtrZXldKSkge1xuICAgICAgbW9kaWZpZWRba2V5XSA9IGN1cnJlbnRba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbW9kaWZpZWQ7XG59O1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2ZpZWxkcy50c1xuXG4vKipcbiAqIEZpZWxkcyBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogRXh0cmFjdHMgZmllbGRzIGZyb20gbGF5b3V0IGFuZCBtYW5hZ2VzIHRoZSBmaWVsZCByZWdpc3RyeVxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRm9ybUNvbmZpZyxcbiAgQmFzZUZvcm1Db21wb25lbnQsXG4gIEZvcm1GaWVsZCxcbiAgRm9ybUZpZWxkUmVnaXN0cnksXG4gIEZpZWxkVmFsdWUsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgaXNGaWVsZE5hbWUsIGlzRmlsZU5hbWUsIGV4dHJhY3RGaWVsZE5hbWUgfSBmcm9tIFwiLi4vY29uZmlnXCI7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIG9iamVjdCBpcyBhIHZhbGlkIGZvcm0gZmllbGQgY29tcG9uZW50XG4gKiBBIGZvcm0gZmllbGQgbXVzdCBoYXZlIGF0IGxlYXN0IGdldFZhbHVlIG9yIHNldFZhbHVlIG1ldGhvZFxuICovXG5jb25zdCBpc0Zvcm1GaWVsZCA9IChvYmo6IHVua25vd24pOiBvYmogaXMgRm9ybUZpZWxkID0+IHtcbiAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGNhbmRpZGF0ZSA9IG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvLyBNdXN0IGhhdmUgZWxlbWVudCBwcm9wZXJ0eVxuICBpZiAoIWNhbmRpZGF0ZS5lbGVtZW50IHx8ICEoY2FuZGlkYXRlLmVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBNdXN0IGhhdmUgZ2V0VmFsdWUgb3Igc2V0VmFsdWVcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgY2FuZGlkYXRlLmdldFZhbHVlID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICB0eXBlb2YgY2FuZGlkYXRlLnNldFZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgKTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgdmFsdWUgZnJvbSBhIGZpZWxkIGNvbXBvbmVudFxuICogQWxsIG10cmwgY29tcG9uZW50cyBub3cgaGF2ZSB1bmlmaWVkIGdldFZhbHVlKCkgQVBJOlxuICogLSBUZXh0ZmllbGQ6IHJldHVybnMgc3RyaW5nXG4gKiAtIFNlbGVjdDogcmV0dXJucyBzdHJpbmcgb3Igc3RyaW5nW11cbiAqIC0gQ2hpcHM6IHJldHVybnMgc3RyaW5nW11cbiAqIC0gU3dpdGNoL0NoZWNrYm94OiByZXR1cm5zIGJvb2xlYW4gKHVwZGF0ZWQgaW4gbXRybCBjb3JlKVxuICovXG5leHBvcnQgY29uc3QgZ2V0RmllbGRWYWx1ZSA9IChmaWVsZDogRm9ybUZpZWxkKTogRmllbGRWYWx1ZSA9PiB7XG4gIGlmICh0eXBlb2YgZmllbGQuZ2V0VmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBmaWVsZC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLy8gRmFsbGJhY2s6IGNoZWNrIGZvciB2YWx1ZSBwcm9wZXJ0eVxuICBjb25zdCBmaWVsZEFueSA9IGZpZWxkIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmIChcInZhbHVlXCIgaW4gZmllbGRBbnkpIHtcbiAgICByZXR1cm4gZmllbGRBbnkudmFsdWUgYXMgRmllbGRWYWx1ZTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIG9uIGEgZmllbGQgY29tcG9uZW50XG4gKiBBbGwgbXRybCBjb21wb25lbnRzIG5vdyBoYXZlIHVuaWZpZWQgc2V0VmFsdWUoKSBBUEk6XG4gKiAtIFRleHRmaWVsZDogYWNjZXB0cyBzdHJpbmdcbiAqIC0gU2VsZWN0OiBhY2NlcHRzIHN0cmluZyBvciBzdHJpbmdbXVxuICogLSBDaGlwczogYWNjZXB0cyBzdHJpbmdbXVxuICogLSBTd2l0Y2gvQ2hlY2tib3g6IGFjY2VwdHMgYm9vbGVhbiBvciBzdHJpbmcgKFwidHJ1ZVwiL1wiZmFsc2VcIikgKHVwZGF0ZWQgaW4gbXRybCBjb3JlKVxuICpcbiAqIEZvciBzaWxlbnQgdXBkYXRlcyAobm8gY2hhbmdlIGV2ZW50cyksIHdlIHNldCBkaXJlY3RseSBvbiB0aGUgaW5wdXQgZWxlbWVudFxuICovXG5leHBvcnQgY29uc3Qgc2V0RmllbGRWYWx1ZSA9IChcbiAgZmllbGQ6IEZvcm1GaWVsZCxcbiAgdmFsdWU6IEZpZWxkVmFsdWUsXG4gIHNpbGVudDogYm9vbGVhbiA9IGZhbHNlLFxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IGZpZWxkQW55ID0gZmllbGQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgc2VsZWN0IGNvbXBvbmVudCAoaGFzIHRleHRmaWVsZCBwcm9wZXJ0eSlcbiAgLy8gU2VsZWN0IGNvbXBvbmVudHMgbXVzdCBhbHdheXMgdXNlIHNldFZhbHVlIHRvIHVwZGF0ZSBpbnRlcm5hbCBzdGF0ZVxuICBjb25zdCBpc1NlbGVjdENvbXBvbmVudCA9IFwidGV4dGZpZWxkXCIgaW4gZmllbGRBbnkgJiYgXCJtZW51XCIgaW4gZmllbGRBbnk7XG5cbiAgaWYgKHNpbGVudCAmJiAhaXNTZWxlY3RDb21wb25lbnQpIHtcbiAgICAvLyBTaWxlbnQgdXBkYXRlOiBzZXQgZGlyZWN0bHkgb24gaW5wdXQgdG8gYXZvaWQgdHJpZ2dlcmluZyBjaGFuZ2UgZXZlbnRzXG4gICAgLy8gU2tpcCB0aGlzIGZvciBzZWxlY3QgY29tcG9uZW50cyAtIHRoZXkgbmVlZCBzZXRWYWx1ZSB0byB1cGRhdGUgaW50ZXJuYWwgc3RhdGVcbiAgICBjb25zdCBpbnB1dCA9IGZpZWxkQW55LmlucHV0IGFzXG4gICAgICB8IEhUTUxJbnB1dEVsZW1lbnRcbiAgICAgIHwgSFRNTFRleHRBcmVhRWxlbWVudFxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlucHV0KSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgY2hlY2tib3gvc3dpdGNoIChoYXMgY2hlY2tlZCBwcm9wZXJ0eSlcbiAgICAgIGlmIChpbnB1dC50eXBlID09PSBcImNoZWNrYm94XCIpIHtcbiAgICAgICAgY29uc3Qgc2hvdWxkQmVDaGVja2VkID1cbiAgICAgICAgICB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gXCJ0cnVlXCIgfHwgdmFsdWUgPT09IDE7XG4gICAgICAgIGlucHV0LmNoZWNrZWQgPSBzaG91bGRCZUNoZWNrZWQ7XG4gICAgICAgIC8vIFVwZGF0ZSB2aXN1YWwgc3RhdGUgYnkgdG9nZ2xpbmcgdGhlIGNoZWNrZWQgY2xhc3NcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGZpZWxkQW55LmVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gQXJyYXkuZnJvbShlbGVtZW50LmNsYXNzTGlzdCk7XG4gICAgICAgICAgY29uc3QgYmFzZUNsYXNzID0gY2xhc3NMaXN0LmZpbmQoXG4gICAgICAgICAgICAoYykgPT4gYy5zdGFydHNXaXRoKFwibXRybC1cIikgJiYgIWMuaW5jbHVkZXMoXCItLVwiKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChiYXNlQ2xhc3MpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShgJHtiYXNlQ2xhc3N9LS1jaGVja2VkYCwgc2hvdWxkQmVDaGVja2VkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRleHQgaW5wdXQgLSBzZXQgdmFsdWUgZGlyZWN0bHlcbiAgICAgICAgaW5wdXQudmFsdWUgPSAodmFsdWUgYXMgc3RyaW5nKSA/PyBcIlwiO1xuICAgICAgICAvLyBVcGRhdGUgdmlzdWFsIHN0YXRlIC0gdG9nZ2xlIC0tZW1wdHkgY2xhc3MgYmFzZWQgb24gdmFsdWVcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGZpZWxkQW55LmVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gQXJyYXkuZnJvbShlbGVtZW50LmNsYXNzTGlzdCk7XG4gICAgICAgICAgY29uc3QgYmFzZUNsYXNzID0gY2xhc3NMaXN0LmZpbmQoXG4gICAgICAgICAgICAoYykgPT4gYy5zdGFydHNXaXRoKFwibXRybC1cIikgJiYgIWMuaW5jbHVkZXMoXCItLVwiKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChiYXNlQ2xhc3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzRW1wdHkgPSAhaW5wdXQudmFsdWU7XG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoYCR7YmFzZUNsYXNzfS0tZW1wdHlgLCBpc0VtcHR5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gRm9yIGNvbXBvbmVudHMgd2l0aG91dCBpbnB1dCAobGlrZSBjaGlwcywgc2VsZWN0KSwgZmFsbCB0aHJvdWdoIHRvIHNldFZhbHVlXG4gICAgLy8gYnV0IHN0aWxsIHVzZSBzaWxlbnQgbW9kZSBiZWhhdmlvciAobm8gZXZlbnRzIHRyaWdnZXJlZClcbiAgfVxuXG4gIC8vIE5vcm1hbCB1cGRhdGU6IHVzZSBjb21wb25lbnQncyBzZXRWYWx1ZSBtZXRob2RcbiAgaWYgKHR5cGVvZiBmaWVsZC5zZXRWYWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZmllbGQuc2V0VmFsdWUodmFsdWUpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrOiBzZXQgdmFsdWUgcHJvcGVydHkgZGlyZWN0bHlcbiAgaWYgKFwidmFsdWVcIiBpbiBmaWVsZEFueSkge1xuICAgIGZpZWxkQW55LnZhbHVlID0gdmFsdWU7XG4gIH1cbn07XG5cbi8qKlxuICogRXh0cmFjdHMgZmllbGRzIGZyb20gdGhlIFVJIGNvbXBvbmVudCByZWdpc3RyeVxuICogTG9va3MgZm9yIGNvbXBvbmVudHMgd2l0aCBuYW1lcyBzdGFydGluZyB3aXRoICdpbmZvLicgb3IgJ2RhdGEuJ1xuICovXG5jb25zdCBleHRyYWN0RmllbGRzID0gKFxuICB1aTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGNvbmZpZzogRm9ybUNvbmZpZyxcbik6IHsgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeTsgZmlsZXM6IEZvcm1GaWVsZFJlZ2lzdHJ5IH0gPT4ge1xuICBjb25zdCBmaWVsZHM6IEZvcm1GaWVsZFJlZ2lzdHJ5ID0gbmV3IE1hcCgpO1xuICBjb25zdCBmaWxlczogRm9ybUZpZWxkUmVnaXN0cnkgPSBuZXcgTWFwKCk7XG5cbiAgaWYgKCF1aSkgcmV0dXJuIHsgZmllbGRzLCBmaWxlcyB9O1xuXG4gIGZvciAoY29uc3QgW25hbWUsIGNvbXBvbmVudF0gb2YgT2JqZWN0LmVudHJpZXModWkpKSB7XG4gICAgLy8gU2tpcCBub24tZmllbGQgY29tcG9uZW50c1xuICAgIGlmICghaXNGb3JtRmllbGQoY29tcG9uZW50KSkgY29udGludWU7XG5cbiAgICBpZiAoaXNGaWVsZE5hbWUobmFtZSkpIHtcbiAgICAgIC8vIEV4dHJhY3QgZmllbGQgbmFtZSB3aXRob3V0IHByZWZpeCAoaW5mby51c2VybmFtZSAtPiB1c2VybmFtZSlcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IGV4dHJhY3RGaWVsZE5hbWUobmFtZSk7XG4gICAgICBmaWVsZHMuc2V0KGZpZWxkTmFtZSwgY29tcG9uZW50KTtcbiAgICB9IGVsc2UgaWYgKGlzRmlsZU5hbWUobmFtZSkpIHtcbiAgICAgIC8vIEV4dHJhY3QgZmlsZSBuYW1lIHdpdGhvdXQgcHJlZml4IChmaWxlLmF2YXRhciAtPiBhdmF0YXIpXG4gICAgICBjb25zdCBmaWxlTmFtZSA9IGV4dHJhY3RGaWVsZE5hbWUobmFtZSk7XG4gICAgICBmaWxlcy5zZXQoZmlsZU5hbWUsIGNvbXBvbmVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgZmllbGRzLCBmaWxlcyB9O1xufTtcblxuLyoqXG4gKiBDb21wYXJlcyB0d28gZmllbGQgdmFsdWVzIGZvciBlcXVhbGl0eVxuICogSGFuZGxlcyBhcnJheXMgKGZvciBjaGlwcy9tdWx0aS1zZWxlY3QpIGFuZCBwcmltaXRpdmUgdmFsdWVzXG4gKi9cbmNvbnN0IHZhbHVlc0VxdWFsID0gKGE6IEZpZWxkVmFsdWUsIGI6IEZpZWxkVmFsdWUpOiBib29sZWFuID0+IHtcbiAgLy8gSGFuZGxlIG51bGwvdW5kZWZpbmVkXG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICAvLyBIYW5kbGUgYXJyYXlzIChjaGlwcywgbXVsdGktc2VsZWN0KVxuICBpZiAoQXJyYXkuaXNBcnJheShhKSAmJiBBcnJheS5pc0FycmF5KGIpKSB7XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBhLmV2ZXJ5KCh2YWwsIGkpID0+IHZhbCA9PT0gYltpXSk7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIEJpbmRzIGNoYW5nZSBhbmQgaW5wdXQgZXZlbnRzIHRvIGZpZWxkc1xuICogQ2FsbHMgdGhlIHByb3ZpZGVkIGNhbGxiYWNrIHdoZW4gYW55IGZpZWxkIGNoYW5nZXNcbiAqXG4gKiBMaXN0ZW5zIHRvIGJvdGggJ2lucHV0JyAoZm9yIGltbWVkaWF0ZSBmZWVkYmFjayB3aGlsZSB0eXBpbmcpXG4gKiBhbmQgJ2NoYW5nZScgKGZvciBjb21wb25lbnRzIHRoYXQgb25seSBlbWl0IG9uIGJsdXIvc2VsZWN0aW9uKVxuICpcbiAqIERlZHVwbGljYXRlcyBldmVudHMgdG8gcHJldmVudCBkb3VibGUtZmlyaW5nIHdoZW4gYm90aCBpbnB1dCBhbmQgY2hhbmdlXG4gKiBlbWl0IGZvciB0aGUgc2FtZSB2YWx1ZSAoZS5nLiwgdGV4dGZpZWxkIGlucHV0IGZvbGxvd2VkIGJ5IGJsdXIpXG4gKi9cbi8qKlxuICogVHJhY2tzIGxhc3QgZW1pdHRlZCB2YWx1ZXMgcGVyIGZpZWxkIGZvciBkZWR1cGxpY2F0aW9uXG4gKiBFeHBvc2VkIHNvIHRoYXQgc2V0RGF0YSBjYW4gdXBkYXRlIGl0IHdoZW4gc2V0dGluZyB2YWx1ZXMgc2lsZW50bHlcbiAqL1xubGV0IGZpZWxkVmFsdWVUcmFja2VyOiBNYXA8c3RyaW5nLCBGaWVsZFZhbHVlPiB8IG51bGwgPSBudWxsO1xuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIHRyYWNrZWQgdmFsdWUgZm9yIGEgZmllbGRcbiAqIENhbGxlZCB3aGVuIHNldERhdGEgaXMgdXNlZCB3aXRoIHNpbGVudD10cnVlIHRvIGtlZXAgZGVkdXBsaWNhdGlvbiBpbiBzeW5jXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVUcmFja2VkRmllbGRWYWx1ZSA9IChcbiAgbmFtZTogc3RyaW5nLFxuICB2YWx1ZTogRmllbGRWYWx1ZSxcbik6IHZvaWQgPT4ge1xuICBpZiAoZmllbGRWYWx1ZVRyYWNrZXIpIHtcbiAgICBmaWVsZFZhbHVlVHJhY2tlci5zZXQobmFtZSwgdmFsdWUpO1xuICB9XG59O1xuXG4vKipcbiAqIFVwZGF0ZXMgYWxsIHRyYWNrZWQgZmllbGQgdmFsdWVzIGZyb20gYSBmaWVsZHMgcmVnaXN0cnlcbiAqIENhbGxlZCBhZnRlciBzaWxlbnQgc2V0RGF0YSB0byBzeW5jIGRlZHVwbGljYXRpb24gc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IHN5bmNUcmFja2VkRmllbGRWYWx1ZXMgPSAoZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeSk6IHZvaWQgPT4ge1xuICBpZiAoZmllbGRWYWx1ZVRyYWNrZXIpIHtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBmaWVsZF0gb2YgZmllbGRzKSB7XG4gICAgICBmaWVsZFZhbHVlVHJhY2tlci5zZXQobmFtZSwgZ2V0RmllbGRWYWx1ZShmaWVsZCkpO1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgYmluZEZpZWxkRXZlbnRzID0gKFxuICBmaWVsZHM6IEZvcm1GaWVsZFJlZ2lzdHJ5LFxuICBvbkZpZWxkQ2hhbmdlOiAobmFtZTogc3RyaW5nLCB2YWx1ZTogRmllbGRWYWx1ZSkgPT4gdm9pZCxcbik6IHZvaWQgPT4ge1xuICAvLyBUcmFjayBsYXN0IGVtaXR0ZWQgdmFsdWUgcGVyIGZpZWxkIHRvIGRlZHVwZSBldmVudHNcbiAgY29uc3QgbGFzdEVtaXR0ZWRWYWx1ZXMgPSBuZXcgTWFwPHN0cmluZywgRmllbGRWYWx1ZT4oKTtcblxuICAvLyBFeHBvc2UgdGhlIHRyYWNrZXIgc28gc2V0RGF0YSBjYW4gdXBkYXRlIGl0XG4gIGZpZWxkVmFsdWVUcmFja2VyID0gbGFzdEVtaXR0ZWRWYWx1ZXM7XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgZmllbGRdIG9mIGZpZWxkcykge1xuICAgIGlmICh0eXBlb2YgZmllbGQub24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIGN1cnJlbnQgdmFsdWVcbiAgICAgIGxhc3RFbWl0dGVkVmFsdWVzLnNldChuYW1lLCBnZXRGaWVsZFZhbHVlKGZpZWxkKSk7XG5cbiAgICAgIC8vIEhhbmRsZXIgdGhhdCBkZWR1cGVzIGJhc2VkIG9uIHZhbHVlXG4gICAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0RmllbGRWYWx1ZShmaWVsZCk7XG4gICAgICAgIGNvbnN0IGxhc3RWYWx1ZSA9IGxhc3RFbWl0dGVkVmFsdWVzLmdldChuYW1lKTtcblxuICAgICAgICAvLyBPbmx5IGVtaXQgaWYgdmFsdWUgYWN0dWFsbHkgY2hhbmdlZFxuICAgICAgICBpZiAoIXZhbHVlc0VxdWFsKHZhbHVlLCBsYXN0VmFsdWUpKSB7XG4gICAgICAgICAgbGFzdEVtaXR0ZWRWYWx1ZXMuc2V0KG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICBvbkZpZWxkQ2hhbmdlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gTGlzdGVuIHRvICdpbnB1dCcgZm9yIGltbWVkaWF0ZSBmZWVkYmFjayAodGV4dGZpZWxkcyBlbWl0IHRoaXMgb24gZXZlcnkga2V5c3Ryb2tlKVxuICAgICAgZmllbGQub24oXCJpbnB1dFwiLCBoYW5kbGVDaGFuZ2UpO1xuXG4gICAgICAvLyBBbHNvIGxpc3RlbiB0byAnY2hhbmdlJyBmb3IgY29tcG9uZW50cyB0aGF0IG9ubHkgZW1pdCBvbiBibHVyL3NlbGVjdGlvblxuICAgICAgLy8gKGUuZy4sIHNlbGVjdCwgY2hpcHMsIHN3aXRjaClcbiAgICAgIGZpZWxkLm9uKFwiY2hhbmdlXCIsIGhhbmRsZUNoYW5nZSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIHdpdGhGaWVsZHMgZmVhdHVyZVxuICogQWRkcyBmaWVsZCBleHRyYWN0aW9uIGFuZCByZWdpc3RyeSBtYW5hZ2VtZW50IHRvIHRoZSBmb3JtXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoRmllbGRzID0gKGNvbmZpZzogRm9ybUNvbmZpZykgPT4ge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBCYXNlRm9ybUNvbXBvbmVudD4oXG4gICAgY29tcG9uZW50OiBULFxuICApOiBUICYge1xuICAgIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnk7XG4gICAgZmlsZXM6IEZvcm1GaWVsZFJlZ2lzdHJ5O1xuICAgIGdldEZpZWxkOiAobmFtZTogc3RyaW5nKSA9PiBGb3JtRmllbGQgfCB1bmRlZmluZWQ7XG4gICAgZ2V0RmllbGROYW1lczogKCkgPT4gc3RyaW5nW107XG4gICAgaGFzRmllbGQ6IChuYW1lOiBzdHJpbmcpID0+IGJvb2xlYW47XG4gIH0gPT4ge1xuICAgIC8vIEV4dHJhY3QgZmllbGRzIGZyb20gVUkgcmVnaXN0cnlcbiAgICBjb25zdCB7IGZpZWxkcywgZmlsZXMgfSA9IGV4dHJhY3RGaWVsZHMoY29tcG9uZW50LnVpIHx8IHt9LCBjb25maWcpO1xuXG4gICAgLy8gQmluZCBjaGFuZ2UgZXZlbnRzIGlmIGNvbXBvbmVudCBoYXMgZW1pdFxuICAgIGlmIChjb21wb25lbnQuZW1pdCkge1xuICAgICAgYmluZEZpZWxkRXZlbnRzKGZpZWxkcywgKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJmaWVsZDpjaGFuZ2VcIiwgeyBuYW1lLCB2YWx1ZSB9KTtcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImNoYW5nZVwiLCB7IG5hbWUsIHZhbHVlIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIEFsc28gYmluZCBjaGFuZ2UgZXZlbnRzIHRvIGZpbGUgZmllbGRzXG4gICAgICBiaW5kRmllbGRFdmVudHMoZmlsZXMsIChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiZmlsZTpjaGFuZ2VcIiwgeyBuYW1lLCB2YWx1ZSB9KTtcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImNoYW5nZVwiLCB7IG5hbWUsIHZhbHVlIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIGZpZWxkcyxcbiAgICAgIGZpbGVzLFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBhIGZpZWxkIGNvbXBvbmVudCBieSBuYW1lXG4gICAgICAgKi9cbiAgICAgIGdldEZpZWxkKG5hbWU6IHN0cmluZyk6IEZvcm1GaWVsZCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBmaWVsZHMuZ2V0KG5hbWUpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgYWxsIGZpZWxkIG5hbWVzXG4gICAgICAgKi9cbiAgICAgIGdldEZpZWxkTmFtZXMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShmaWVsZHMua2V5cygpKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgYSBmaWVsZCBleGlzdHNcbiAgICAgICAqL1xuICAgICAgaGFzRmllbGQobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmaWVsZHMuaGFzKG5hbWUpO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgd2l0aEZpZWxkcztcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9mZWF0dXJlcy9kYXRhLnRzXG5cbi8qKlxuICogRGF0YSBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogSGFuZGxlcyBmb3JtIGRhdGEgb3BlcmF0aW9uczogZ2V0L3NldCBkYXRhLCBjaGFuZ2UgdHJhY2tpbmcsIHNuYXBzaG90c1xuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRm9ybUNvbmZpZyxcbiAgQmFzZUZvcm1Db21wb25lbnQsXG4gIEZvcm1EYXRhLFxuICBGb3JtU3RhdGUsXG4gIEZpZWxkVmFsdWUsXG4gIEZvcm1GaWVsZFJlZ2lzdHJ5LFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZUluaXRpYWxTdGF0ZSxcbiAgaGFzRGF0YUNoYW5nZWQsXG4gIGdldE1vZGlmaWVkRmllbGRzLFxufSBmcm9tIFwiLi4vY29uZmlnXCI7XG5pbXBvcnQgeyBnZXRGaWVsZFZhbHVlLCBzZXRGaWVsZFZhbHVlLCBzeW5jVHJhY2tlZEZpZWxkVmFsdWVzIH0gZnJvbSBcIi4vZmllbGRzXCI7XG5pbXBvcnQgeyBGT1JNX0VWRU5UUywgREFUQV9TVEFURSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBDb2xsZWN0cyBjdXJyZW50IHZhbHVlcyBmcm9tIGFsbCBmaWVsZHNcbiAqL1xuY29uc3QgY29sbGVjdEZpZWxkRGF0YSA9IChmaWVsZHM6IEZvcm1GaWVsZFJlZ2lzdHJ5KTogRm9ybURhdGEgPT4ge1xuICBjb25zdCBkYXRhOiBGb3JtRGF0YSA9IHt9O1xuXG4gIGZvciAoY29uc3QgW25hbWUsIGZpZWxkXSBvZiBmaWVsZHMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGdldEZpZWxkVmFsdWUoZmllbGQpO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkYXRhW25hbWVdID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59O1xuXG4vKipcbiAqIFNldHMgdmFsdWVzIG9uIGZpZWxkcyBmcm9tIGEgZGF0YSBvYmplY3RcbiAqIFN1cHBvcnRzIGRvdCBub3RhdGlvbiBmb3IgbmVzdGVkIHZhbHVlcyAoZS5nLiwgeyAndXNlci5uYW1lJzogJ0pvaG4nIH0pXG4gKi9cbmNvbnN0IHNldEZpZWxkc0RhdGEgPSAoXG4gIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnksXG4gIGRhdGE6IEZvcm1EYXRhLFxuICBzaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSxcbik6IHZvaWQgPT4ge1xuICBmb3IgKGNvbnN0IFtuYW1lLCBmaWVsZF0gb2YgZmllbGRzKSB7XG4gICAgLy8gQ2hlY2sgZm9yIGV4YWN0IG1hdGNoIGZpcnN0XG4gICAgaWYgKG5hbWUgaW4gZGF0YSkge1xuICAgICAgc2V0RmllbGRWYWx1ZShmaWVsZCwgZGF0YVtuYW1lXSwgc2lsZW50KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBuZXN0ZWQgdmFsdWUgdXNpbmcgZG90IG5vdGF0aW9uXG4gICAgLy8gZS5nLiwgZmllbGQgbmFtZSAndXNlcm5hbWUnIG1pZ2h0IGJlIGluIGRhdGEgYXMgbmVzdGVkIHsgaW5mbzogeyB1c2VybmFtZTogJ3ZhbHVlJyB9IH1cbiAgICBjb25zdCB2YWx1ZSA9IGdldE5lc3RlZFZhbHVlKGRhdGEsIG5hbWUpO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzZXRGaWVsZFZhbHVlKGZpZWxkLCB2YWx1ZSBhcyBGaWVsZFZhbHVlLCBzaWxlbnQpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBHZXRzIGEgbmVzdGVkIHZhbHVlIGZyb20gYW4gb2JqZWN0IHVzaW5nIGRvdCBub3RhdGlvblxuICovXG5jb25zdCBnZXROZXN0ZWRWYWx1ZSA9IChcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcGF0aDogc3RyaW5nLFxuKTogdW5rbm93biA9PiB7XG4gIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG4gIGxldCBjdXJyZW50OiB1bmtub3duID0gb2JqO1xuXG4gIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjdXJyZW50ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjdXJyZW50ID0gKGN1cnJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3BhcnRdO1xuICB9XG5cbiAgcmV0dXJuIGN1cnJlbnQ7XG59O1xuXG4vKipcbiAqIFNldHMgYSBuZXN0ZWQgdmFsdWUgaW4gYW4gb2JqZWN0IHVzaW5nIGRvdCBub3RhdGlvblxuICovXG5jb25zdCBzZXROZXN0ZWRWYWx1ZSA9IChcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcGF0aDogc3RyaW5nLFxuICB2YWx1ZTogdW5rbm93bixcbik6IHZvaWQgPT4ge1xuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIuXCIpO1xuICBsZXQgY3VycmVudCA9IG9iajtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTtcbiAgICBpZiAoIShwYXJ0IGluIGN1cnJlbnQpIHx8IHR5cGVvZiBjdXJyZW50W3BhcnRdICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICBjdXJyZW50W3BhcnRdID0ge307XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50W3BhcnRdIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9XG5cbiAgY3VycmVudFtwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXV0gPSB2YWx1ZTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgZmxhdCBmaWVsZCBkYXRhIHRvIG5lc3RlZCBvYmplY3Qgc3RydWN0dXJlXG4gKiBlLmcuLCB7ICd1c2VyLm5hbWUnOiAnSm9obicgfSAtPiB7IHVzZXI6IHsgbmFtZTogJ0pvaG4nIH0gfVxuICovXG5jb25zdCBmbGF0VG9OZXN0ZWQgPSAoZGF0YTogRm9ybURhdGEpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSkge1xuICAgIGlmIChrZXkuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICBzZXROZXN0ZWRWYWx1ZShyZXN1bHQsIGtleSwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIHdpdGhEYXRhIGZlYXR1cmVcbiAqIEFkZHMgZGF0YSBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcyB0byB0aGUgZm9ybVxuICovXG5leHBvcnQgY29uc3Qgd2l0aERhdGEgPSAoY29uZmlnOiBGb3JtQ29uZmlnKSA9PiB7XG4gIHJldHVybiA8XG4gICAgVCBleHRlbmRzIEJhc2VGb3JtQ29tcG9uZW50ICYge1xuICAgICAgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeTtcbiAgICAgIGVtaXQ/OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gICAgfSxcbiAgPihcbiAgICBjb21wb25lbnQ6IFQsXG4gICk6IFQgJiB7XG4gICAgc3RhdGU6IEZvcm1TdGF0ZTtcbiAgICBnZXREYXRhOiAoKSA9PiBGb3JtRGF0YTtcbiAgICBzZXREYXRhOiAoZGF0YTogRm9ybURhdGEsIHNpbGVudD86IGJvb2xlYW4pID0+IHZvaWQ7XG4gICAgZ2V0RmllbGRWYWx1ZTogKG5hbWU6IHN0cmluZykgPT4gRmllbGRWYWx1ZTtcbiAgICBzZXRGaWVsZFZhbHVlOiAobmFtZTogc3RyaW5nLCB2YWx1ZTogRmllbGRWYWx1ZSwgc2lsZW50PzogYm9vbGVhbikgPT4gdm9pZDtcbiAgICBpc01vZGlmaWVkOiAoKSA9PiBib29sZWFuO1xuICAgIGdldE1vZGlmaWVkRGF0YTogKCkgPT4gRm9ybURhdGE7XG4gICAgc25hcHNob3Q6ICgpID0+IHZvaWQ7XG4gICAgcmVzZXQ6ICgpID0+IHZvaWQ7XG4gICAgY2xlYXI6ICgpID0+IHZvaWQ7XG4gIH0gPT4ge1xuICAgIC8vIEluaXRpYWxpemUgc3RhdGVcbiAgICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUluaXRpYWxTdGF0ZShjb25maWcpO1xuXG4gICAgLy8gSWYgaW5pdGlhbCBkYXRhIHdhcyBwcm92aWRlZCwgc2V0IGl0IG9uIGZpZWxkc1xuICAgIGlmIChjb25maWcuZGF0YSAmJiBjb21wb25lbnQuZmllbGRzKSB7XG4gICAgICBzZXRGaWVsZHNEYXRhKGNvbXBvbmVudC5maWVsZHMsIGNvbmZpZy5kYXRhLCB0cnVlKTtcbiAgICAgIHN0YXRlLmN1cnJlbnREYXRhID0gY29sbGVjdEZpZWxkRGF0YShjb21wb25lbnQuZmllbGRzKTtcbiAgICAgIHN0YXRlLmluaXRpYWxEYXRhID0geyAuLi5zdGF0ZS5jdXJyZW50RGF0YSB9O1xuICAgIH1cblxuICAgIC8vIEhhbmRsZXIgZm9yIGZpZWxkL2ZpbGUgY2hhbmdlcyB0byB1cGRhdGUgc3RhdGVcbiAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoZXZlbnQ6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogRmllbGRWYWx1ZSB9KSA9PiB7XG4gICAgICBzdGF0ZS5jdXJyZW50RGF0YVtldmVudC5uYW1lXSA9IGV2ZW50LnZhbHVlO1xuICAgICAgY29uc3Qgd2FzTW9kaWZpZWQgPSBzdGF0ZS5tb2RpZmllZDtcbiAgICAgIHN0YXRlLm1vZGlmaWVkID0gaGFzRGF0YUNoYW5nZWQoc3RhdGUuaW5pdGlhbERhdGEsIHN0YXRlLmN1cnJlbnREYXRhKTtcblxuICAgICAgLy8gRW1pdCBzdGF0ZTpjaGFuZ2UgZXZlbnQgd2hlbiBtb2RpZmllZCBzdGF0ZSBjaGFuZ2VzXG4gICAgICAvLyBUaGlzIGFsbG93cyB0aGUgY29udHJvbGxlciB0byBlbmFibGUvZGlzYWJsZSBjb250cm9scyBhY2NvcmRpbmdseVxuICAgICAgaWYgKHdhc01vZGlmaWVkICE9PSBzdGF0ZS5tb2RpZmllZCkge1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLlNUQVRFX0NIQU5HRSwge1xuICAgICAgICAgIG1vZGlmaWVkOiBzdGF0ZS5tb2RpZmllZCxcbiAgICAgICAgICBzdGF0ZTogc3RhdGUubW9kaWZpZWQgPyBEQVRBX1NUQVRFLkRJUlRZIDogREFUQV9TVEFURS5QUklTVElORSxcbiAgICAgICAgICBuYW1lOiBldmVudC5uYW1lLFxuICAgICAgICAgIHZhbHVlOiBldmVudC52YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIExpc3RlbiBmb3IgZmllbGQgY2hhbmdlcyB0byB1cGRhdGUgc3RhdGVcbiAgICBpZiAoY29tcG9uZW50Lm9uKSB7XG4gICAgICBjb21wb25lbnQub24oXCJmaWVsZDpjaGFuZ2VcIiwgaGFuZGxlQ2hhbmdlKTtcbiAgICAgIC8vIEFsc28gbGlzdGVuIGZvciBmaWxlIGNoYW5nZXNcbiAgICAgIGNvbXBvbmVudC5vbihcImZpbGU6Y2hhbmdlXCIsIGhhbmRsZUNoYW5nZSk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5oYW5jZWQgPSB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBzdGF0ZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgYWxsIGZvcm0gZGF0YVxuICAgICAgICovXG4gICAgICBnZXREYXRhKCk6IEZvcm1EYXRhIHtcbiAgICAgICAgLy8gQWx3YXlzIGNvbGxlY3QgZnJlc2ggZGF0YSBmcm9tIGZpZWxkc1xuICAgICAgICBjb25zdCBkYXRhID0gY29sbGVjdEZpZWxkRGF0YShjb21wb25lbnQuZmllbGRzKTtcbiAgICAgICAgc3RhdGUuY3VycmVudERhdGEgPSBkYXRhO1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLkRBVEFfR0VULCBkYXRhKTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNldCBmb3JtIGRhdGFcbiAgICAgICAqIEBwYXJhbSBkYXRhIC0gRGF0YSBvYmplY3QgdG8gc2V0XG4gICAgICAgKiBAcGFyYW0gc2lsZW50IC0gSWYgdHJ1ZSwgZG9uJ3QgZW1pdCBjaGFuZ2UgZXZlbnRzIGFuZCB1cGRhdGUgaW5pdGlhbCBzdGF0ZVxuICAgICAgICovXG4gICAgICBzZXREYXRhKGRhdGE6IEZvcm1EYXRhLCBzaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICBzZXRGaWVsZHNEYXRhKGNvbXBvbmVudC5maWVsZHMsIGRhdGEsIHNpbGVudCk7XG4gICAgICAgIHN0YXRlLmN1cnJlbnREYXRhID0gY29sbGVjdEZpZWxkRGF0YShjb21wb25lbnQuZmllbGRzKTtcblxuICAgICAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgICAgLy8gV2hlbiBzZXR0aW5nIGRhdGEgc2lsZW50bHksIGFsc28gdXBkYXRlIGluaXRpYWwgZGF0YSBzbmFwc2hvdFxuICAgICAgICAgIC8vIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgd2hlbiBsb2FkaW5nIGRhdGEgZnJvbSBzZXJ2ZXJcbiAgICAgICAgICBzdGF0ZS5pbml0aWFsRGF0YSA9IHsgLi4uc3RhdGUuY3VycmVudERhdGEgfTtcbiAgICAgICAgICBzdGF0ZS5tb2RpZmllZCA9IGZhbHNlO1xuICAgICAgICAgIC8vIFN5bmMgdGhlIGZpZWxkIHZhbHVlIHRyYWNrZXIgZm9yIGV2ZW50IGRlZHVwbGljYXRpb25cbiAgICAgICAgICBzeW5jVHJhY2tlZEZpZWxkVmFsdWVzKGNvbXBvbmVudC5maWVsZHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuREFUQV9TRVQsIHN0YXRlLmN1cnJlbnREYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgYSBzcGVjaWZpYyBmaWVsZCdzIHZhbHVlXG4gICAgICAgKi9cbiAgICAgIGdldEZpZWxkVmFsdWUobmFtZTogc3RyaW5nKTogRmllbGRWYWx1ZSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gY29tcG9uZW50LmZpZWxkcy5nZXQobmFtZSk7XG4gICAgICAgIGlmIChmaWVsZCkge1xuICAgICAgICAgIHJldHVybiBnZXRGaWVsZFZhbHVlKGZpZWxkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdGUuY3VycmVudERhdGFbbmFtZV07XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNldCBhIHNwZWNpZmljIGZpZWxkJ3MgdmFsdWVcbiAgICAgICAqL1xuICAgICAgc2V0RmllbGRWYWx1ZShcbiAgICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgICB2YWx1ZTogRmllbGRWYWx1ZSxcbiAgICAgICAgc2lsZW50OiBib29sZWFuID0gZmFsc2UsXG4gICAgICApOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBjb21wb25lbnQuZmllbGRzLmdldChuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkKSB7XG4gICAgICAgICAgc2V0RmllbGRWYWx1ZShmaWVsZCwgdmFsdWUsIHNpbGVudCk7XG4gICAgICAgICAgc3RhdGUuY3VycmVudERhdGFbbmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICBzdGF0ZS5tb2RpZmllZCA9IGhhc0RhdGFDaGFuZ2VkKHN0YXRlLmluaXRpYWxEYXRhLCBzdGF0ZS5jdXJyZW50RGF0YSk7XG5cbiAgICAgICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5GSUVMRF9DSEFOR0UsIHsgbmFtZSwgdmFsdWUgfSk7XG4gICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLkNIQU5HRSwgeyBuYW1lLCB2YWx1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgZm9ybSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwgc3RhdGVcbiAgICAgICAqL1xuICAgICAgaXNNb2RpZmllZCgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY3VycmVudERhdGEgPSBjb2xsZWN0RmllbGREYXRhKGNvbXBvbmVudC5maWVsZHMpO1xuICAgICAgICBzdGF0ZS5tb2RpZmllZCA9IGhhc0RhdGFDaGFuZ2VkKHN0YXRlLmluaXRpYWxEYXRhLCBjdXJyZW50RGF0YSk7XG4gICAgICAgIHJldHVybiBzdGF0ZS5tb2RpZmllZDtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IG9ubHkgdGhlIGZpZWxkcyB0aGF0IGhhdmUgYmVlbiBtb2RpZmllZFxuICAgICAgICovXG4gICAgICBnZXRNb2RpZmllZERhdGEoKTogRm9ybURhdGEge1xuICAgICAgICBjb25zdCBjdXJyZW50RGF0YSA9IGNvbGxlY3RGaWVsZERhdGEoY29tcG9uZW50LmZpZWxkcyk7XG4gICAgICAgIHJldHVybiBnZXRNb2RpZmllZEZpZWxkcyhzdGF0ZS5pbml0aWFsRGF0YSwgY3VycmVudERhdGEpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBUYWtlIGEgc25hcHNob3Qgb2YgY3VycmVudCBkYXRhIGFzIHRoZSBuZXcgYmFzZWxpbmVcbiAgICAgICAqIEZ1dHVyZSBpc01vZGlmaWVkKCkgY2FsbHMgd2lsbCBjb21wYXJlIGFnYWluc3QgdGhpcyBzbmFwc2hvdFxuICAgICAgICovXG4gICAgICBzbmFwc2hvdCgpOiB2b2lkIHtcbiAgICAgICAgc3RhdGUuaW5pdGlhbERhdGEgPSB7IC4uLmNvbGxlY3RGaWVsZERhdGEoY29tcG9uZW50LmZpZWxkcykgfTtcbiAgICAgICAgc3RhdGUuY3VycmVudERhdGEgPSB7IC4uLnN0YXRlLmluaXRpYWxEYXRhIH07XG4gICAgICAgIHN0YXRlLm1vZGlmaWVkID0gZmFsc2U7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlc2V0IGZvcm0gdG8gaW5pdGlhbCBkYXRhIHN0YXRlXG4gICAgICAgKi9cbiAgICAgIHJlc2V0KCk6IHZvaWQge1xuICAgICAgICBzZXRGaWVsZHNEYXRhKGNvbXBvbmVudC5maWVsZHMsIHN0YXRlLmluaXRpYWxEYXRhLCB0cnVlKTtcbiAgICAgICAgc3RhdGUuY3VycmVudERhdGEgPSB7IC4uLnN0YXRlLmluaXRpYWxEYXRhIH07XG4gICAgICAgIHN0YXRlLm1vZGlmaWVkID0gZmFsc2U7XG4gICAgICAgIHN0YXRlLmVycm9ycyA9IHt9O1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLlJFU0VUKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2xlYXIgYWxsIGZvcm0gZmllbGRzXG4gICAgICAgKi9cbiAgICAgIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBlbXB0eURhdGE6IEZvcm1EYXRhID0ge307XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBjb21wb25lbnQuZmllbGRzLmtleXMoKSkge1xuICAgICAgICAgIGVtcHR5RGF0YVtuYW1lXSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgc2V0RmllbGRzRGF0YShjb21wb25lbnQuZmllbGRzLCBlbXB0eURhdGEsIHRydWUpO1xuICAgICAgICBzdGF0ZS5jdXJyZW50RGF0YSA9IHt9O1xuICAgICAgICBzdGF0ZS5tb2RpZmllZCA9IGhhc0RhdGFDaGFuZ2VkKHN0YXRlLmluaXRpYWxEYXRhLCBzdGF0ZS5jdXJyZW50RGF0YSk7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuUkVTRVQpO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGVuaGFuY2VkO1xuICB9O1xufTtcblxuZXhwb3J0IHsgZmxhdFRvTmVzdGVkLCBnZXROZXN0ZWRWYWx1ZSwgc2V0TmVzdGVkVmFsdWUgfTtcbmV4cG9ydCBkZWZhdWx0IHdpdGhEYXRhO1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2NvbnRyb2xsZXIudHNcblxuLyoqXG4gKiBDb250cm9sbGVyIGZlYXR1cmUgZm9yIEZvcm0gY29tcG9uZW50XG4gKiBNYW5hZ2VzIGNvbnRyb2wgYnV0dG9ucyAoc3VibWl0L2NhbmNlbCkgYmFzZWQgb24gZGF0YSBzdGF0ZSAocHJpc3RpbmUvZGlydHkpXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBGb3JtQ29uZmlnLFxuICBCYXNlRm9ybUNvbXBvbmVudCxcbiAgRm9ybVN0YXRlLFxuICBGb3JtRmllbGRSZWdpc3RyeSxcbiAgRm9ybUZpZWxkLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERBVEFfU1RBVEUsIEZPUk1fRVZFTlRTLCBGT1JNX0NMQVNTRVMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBGT1JNX0RFRkFVTFRTIH0gZnJvbSBcIi4uL2NvbmZpZ1wiO1xuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGZvcm0ncyBzdGF0ZSBDU1MgY2xhc3NcbiAqL1xuY29uc3QgdXBkYXRlU3RhdGVDbGFzcyA9IChcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gIG1vZGlmaWVkOiBib29sZWFuLFxuICBwcmVmaXg6IHN0cmluZyxcbiAgY29tcG9uZW50TmFtZTogc3RyaW5nLFxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IG1vZGlmaWVkQ2xhc3MgPSBgJHtwcmVmaXh9LSR7Y29tcG9uZW50TmFtZX0tLSR7Rk9STV9DTEFTU0VTLk1PRElGSUVEfWA7XG4gIGVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShtb2RpZmllZENsYXNzLCBtb2RpZmllZCk7XG59O1xuXG4vKipcbiAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgYWxsIGZvcm0gZmllbGRzXG4gKi9cbmNvbnN0IHNldEZpZWxkc0VuYWJsZWQgPSAoXG4gIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnksXG4gIGVuYWJsZWQ6IGJvb2xlYW4sXG4pOiB2b2lkID0+IHtcbiAgZm9yIChjb25zdCBbLCBmaWVsZF0gb2YgZmllbGRzKSB7XG4gICAgaWYgKGVuYWJsZWQgJiYgdHlwZW9mIGZpZWxkLmVuYWJsZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBmaWVsZC5lbmFibGUoKTtcbiAgICB9IGVsc2UgaWYgKCFlbmFibGVkICYmIHR5cGVvZiBmaWVsZC5kaXNhYmxlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGZpZWxkLmRpc2FibGUoKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogR2V0cyBjb250cm9sIGJ1dHRvbiBjb21wb25lbnRzIGZyb20gdGhlIFVJIHJlZ2lzdHJ5XG4gKi9cbmNvbnN0IGdldENvbnRyb2xCdXR0b25zID0gKFxuICB1aTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGNvbnRyb2xOYW1lczogc3RyaW5nW10sXG4pOiBNYXA8c3RyaW5nLCBGb3JtRmllbGQ+ID0+IHtcbiAgY29uc3QgY29udHJvbHMgPSBuZXcgTWFwPHN0cmluZywgRm9ybUZpZWxkPigpO1xuXG4gIGZvciAoY29uc3QgbmFtZSBvZiBjb250cm9sTmFtZXMpIHtcbiAgICBjb25zdCBjb250cm9sID0gdWlbbmFtZV07XG4gICAgaWYgKGNvbnRyb2wgJiYgdHlwZW9mIGNvbnRyb2wgPT09IFwib2JqZWN0XCIgJiYgXCJlbGVtZW50XCIgaW4gY29udHJvbCkge1xuICAgICAgY29udHJvbHMuc2V0KG5hbWUsIGNvbnRyb2wgYXMgRm9ybUZpZWxkKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29udHJvbHM7XG59O1xuXG4vKipcbiAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgY29udHJvbCBidXR0b25zXG4gKi9cbmNvbnN0IHNldENvbnRyb2xzRW5hYmxlZCA9IChcbiAgY29udHJvbHM6IE1hcDxzdHJpbmcsIEZvcm1GaWVsZD4sXG4gIGVuYWJsZWQ6IGJvb2xlYW4sXG4pOiB2b2lkID0+IHtcbiAgZm9yIChjb25zdCBbLCBjb250cm9sXSBvZiBjb250cm9scykge1xuICAgIGlmIChlbmFibGVkICYmIHR5cGVvZiBjb250cm9sLmVuYWJsZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb250cm9sLmVuYWJsZSgpO1xuICAgIH0gZWxzZSBpZiAoIWVuYWJsZWQgJiYgdHlwZW9mIGNvbnRyb2wuZGlzYWJsZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb250cm9sLmRpc2FibGUoKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogd2l0aENvbnRyb2xsZXIgZmVhdHVyZVxuICogQWRkcyBjb250cm9sIGJ1dHRvbiBoYW5kbGluZyBiYXNlZCBvbiBkYXRhIHN0YXRlIChwcmlzdGluZS9kaXJ0eSlcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhDb250cm9sbGVyID0gKGNvbmZpZzogRm9ybUNvbmZpZykgPT4ge1xuICByZXR1cm4gPFxuICAgIFQgZXh0ZW5kcyBCYXNlRm9ybUNvbXBvbmVudCAmIHtcbiAgICAgIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnk7XG4gICAgICBzdGF0ZTogRm9ybVN0YXRlO1xuICAgICAgZW1pdD86IChldmVudDogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gdm9pZDtcbiAgICAgIG9uPzogKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKSA9PiB2b2lkO1xuICAgIH0sXG4gID4oXG4gICAgY29tcG9uZW50OiBULFxuICApOiBUICYge1xuICAgIGNvbnRyb2xzOiBNYXA8c3RyaW5nLCBGb3JtRmllbGQ+O1xuICAgIGdldERhdGFTdGF0ZTogKCkgPT4gc3RyaW5nO1xuICAgIGVuYWJsZUNvbnRyb2xzOiAoKSA9PiB2b2lkO1xuICAgIGRpc2FibGVDb250cm9sczogKCkgPT4gdm9pZDtcbiAgICBlbmFibGVGaWVsZHM6ICgpID0+IHZvaWQ7XG4gICAgZGlzYWJsZUZpZWxkczogKCkgPT4gdm9pZDtcbiAgfSA9PiB7XG4gICAgY29uc3QgcHJlZml4ID0gY29uZmlnLnByZWZpeCB8fCBGT1JNX0RFRkFVTFRTLnByZWZpeDtcbiAgICBjb25zdCBjb21wb25lbnROYW1lID0gY29uZmlnLmNvbXBvbmVudE5hbWUgfHwgRk9STV9ERUZBVUxUUy5jb21wb25lbnROYW1lO1xuICAgIGNvbnN0IGNvbnRyb2xOYW1lcyA9IGNvbmZpZy5jb250cm9sc1xuICAgICAgPyBbLi4uY29uZmlnLmNvbnRyb2xzXVxuICAgICAgOiBbLi4uRk9STV9ERUZBVUxUUy5jb250cm9sc107XG5cbiAgICAvLyBHZXQgY29udHJvbCBidXR0b25zIGZyb20gVUlcbiAgICBjb25zdCBjb250cm9scyA9IGNvbnRyb2xOYW1lc1xuICAgICAgPyBnZXRDb250cm9sQnV0dG9ucyhjb21wb25lbnQudWkgfHwge30sIGNvbnRyb2xOYW1lcylcbiAgICAgIDogbmV3IE1hcDxzdHJpbmcsIEZvcm1GaWVsZD4oKTtcblxuICAgIC8vIEluaXRpYWxpemUgY29udHJvbHMgYXMgZGlzYWJsZWQgKHByaXN0aW5lIHN0YXRlKVxuICAgIGlmIChjb250cm9scy5zaXplID4gMCkge1xuICAgICAgc2V0Q29udHJvbHNFbmFibGVkKGNvbnRyb2xzLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5oYW5jZWQgPSB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBjb250cm9scyxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgY3VycmVudCBkYXRhIHN0YXRlIChwcmlzdGluZSBvciBkaXJ0eSlcbiAgICAgICAqL1xuICAgICAgZ2V0RGF0YVN0YXRlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuc3RhdGUubW9kaWZpZWRcbiAgICAgICAgICA/IERBVEFfU1RBVEUuRElSVFlcbiAgICAgICAgICA6IERBVEFfU1RBVEUuUFJJU1RJTkU7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEVuYWJsZSBjb250cm9sIGJ1dHRvbnNcbiAgICAgICAqL1xuICAgICAgZW5hYmxlQ29udHJvbHMoKTogdm9pZCB7XG4gICAgICAgIHNldENvbnRyb2xzRW5hYmxlZChjb250cm9scywgdHJ1ZSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIERpc2FibGUgY29udHJvbCBidXR0b25zXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVDb250cm9scygpOiB2b2lkIHtcbiAgICAgICAgc2V0Q29udHJvbHNFbmFibGVkKGNvbnRyb2xzLCBmYWxzZSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEVuYWJsZSBhbGwgZm9ybSBmaWVsZHNcbiAgICAgICAqL1xuICAgICAgZW5hYmxlRmllbGRzKCk6IHZvaWQge1xuICAgICAgICBzZXRGaWVsZHNFbmFibGVkKGNvbXBvbmVudC5maWVsZHMsIHRydWUpO1xuICAgICAgICBjb21wb25lbnQuc3RhdGUuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZSBhbGwgZm9ybSBmaWVsZHNcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZUZpZWxkcygpOiB2b2lkIHtcbiAgICAgICAgc2V0RmllbGRzRW5hYmxlZChjb21wb25lbnQuZmllbGRzLCBmYWxzZSk7XG4gICAgICAgIGNvbXBvbmVudC5zdGF0ZS5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBMaXN0ZW4gZm9yIHN0YXRlIGNoYW5nZXMgdG8gZW5hYmxlL2Rpc2FibGUgY29udHJvbHNcbiAgICBpZiAoY29uZmlnLnVzZUNoYW5nZXMgIT09IGZhbHNlICYmIGNvbXBvbmVudC5vbikge1xuICAgICAgY29tcG9uZW50Lm9uKFxuICAgICAgICBGT1JNX0VWRU5UUy5TVEFURV9DSEFOR0UsXG4gICAgICAgIChldmVudDogeyBtb2RpZmllZDogYm9vbGVhbjsgc3RhdGU6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgICAgaWYgKGV2ZW50Lm1vZGlmaWVkKSB7XG4gICAgICAgICAgICAvLyBEYXRhIGlzIGRpcnR5IC0gZW5hYmxlIGNvbnRyb2xzXG4gICAgICAgICAgICBzZXRDb250cm9sc0VuYWJsZWQoY29udHJvbHMsIHRydWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBEYXRhIGlzIHByaXN0aW5lIC0gZGlzYWJsZSBjb250cm9sc1xuICAgICAgICAgICAgc2V0Q29udHJvbHNFbmFibGVkKGNvbnRyb2xzLCBmYWxzZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVXBkYXRlIENTUyBjbGFzc1xuICAgICAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICAgICAgdXBkYXRlU3RhdGVDbGFzcyhcbiAgICAgICAgICAgICAgY29tcG9uZW50LmVsZW1lbnQsXG4gICAgICAgICAgICAgIGV2ZW50Lm1vZGlmaWVkLFxuICAgICAgICAgICAgICBwcmVmaXgsXG4gICAgICAgICAgICAgIGNvbXBvbmVudE5hbWUsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVuaGFuY2VkO1xuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgd2l0aENvbnRyb2xsZXI7XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL2Zvcm0vZmVhdHVyZXMvc3VibWl0LnRzXG5cbi8qKlxuICogU3VibWl0IGZlYXR1cmUgZm9yIEZvcm0gY29tcG9uZW50XG4gKiBIYW5kbGVzIGZvcm0gdmFsaWRhdGlvbiBhbmQgc3VibWlzc2lvblxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRm9ybUNvbmZpZyxcbiAgQmFzZUZvcm1Db21wb25lbnQsXG4gIEZvcm1EYXRhLFxuICBGb3JtU3RhdGUsXG4gIEZvcm1GaWVsZFJlZ2lzdHJ5LFxuICBGb3JtVmFsaWRhdGlvblJ1bGUsXG4gIEZvcm1WYWxpZGF0aW9uUmVzdWx0LFxuICBGb3JtU3VibWl0T3B0aW9ucyxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBGT1JNX0VWRU5UUywgRk9STV9DTEFTU0VTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIERlZmF1bHQgaGVhZGVycyBmb3IgSlNPTiByZXF1ZXN0c1xuICovXG5jb25zdCBERUZBVUxUX0hFQURFUlM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgZm9ybSBkYXRhIGFnYWluc3QgdmFsaWRhdGlvbiBydWxlc1xuICovXG5jb25zdCB2YWxpZGF0ZURhdGEgPSAoXG4gIGRhdGE6IEZvcm1EYXRhLFxuICBydWxlczogRm9ybVZhbGlkYXRpb25SdWxlW10sXG4pOiBGb3JtVmFsaWRhdGlvblJlc3VsdCA9PiB7XG4gIGNvbnN0IGVycm9yczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBsZXQgdmFsaWQgPSB0cnVlO1xuXG4gIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xuICAgIGNvbnN0IHZhbHVlID0gZGF0YVtydWxlLmZpZWxkXTtcbiAgICBjb25zdCByZXN1bHQgPSBydWxlLnZhbGlkYXRlKHZhbHVlLCBkYXRhKTtcblxuICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgZXJyb3JzW3J1bGUuZmllbGRdID0gcnVsZS5tZXNzYWdlIHx8IGAke3J1bGUuZmllbGR9IGlzIGludmFsaWRgO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlc3VsdCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIGVycm9yc1tydWxlLmZpZWxkXSA9IHJlc3VsdDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyB2YWxpZCwgZXJyb3JzIH07XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIHRoZSBhY3R1YWwgSFRUUCByZXF1ZXN0XG4gKi9cbmNvbnN0IHBlcmZvcm1SZXF1ZXN0ID0gYXN5bmMgKFxuICB1cmw6IHN0cmluZyxcbiAgZGF0YTogRm9ybURhdGEsXG4gIG9wdGlvbnM6IEZvcm1TdWJtaXRPcHRpb25zLFxuKTogUHJvbWlzZTx1bmtub3duPiA9PiB7XG4gIGNvbnN0IG1ldGhvZCA9IG9wdGlvbnMubWV0aG9kIHx8IFwiUE9TVFwiO1xuICBjb25zdCBoZWFkZXJzID0geyAuLi5ERUZBVUxUX0hFQURFUlMsIC4uLm9wdGlvbnMuaGVhZGVycyB9O1xuXG4gIGNvbnN0IGZldGNoT3B0aW9uczogUmVxdWVzdEluaXQgPSB7XG4gICAgbWV0aG9kLFxuICAgIGhlYWRlcnMsXG4gIH07XG5cbiAgLy8gQWRkIGJvZHkgZm9yIG5vbi1HRVQgcmVxdWVzdHNcbiAgaWYgKG1ldGhvZCAhPT0gXCJHRVRcIikge1xuICAgIGZldGNoT3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gIH1cblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgZmV0Y2hPcHRpb25zKTtcblxuICAvLyBQYXJzZSByZXNwb25zZVxuICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC10eXBlXCIpO1xuICBsZXQgcmVzdWx0OiB1bmtub3duO1xuXG4gIGlmIChjb250ZW50VHlwZSAmJiBjb250ZW50VHlwZS5pbmNsdWRlcyhcImFwcGxpY2F0aW9uL2pzb25cIikpIHtcbiAgICByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIEhUVFAgZXJyb3JzXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c306ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTtcbiAgICAoZXJyb3IgYXMgRXJyb3IgJiB7IHJlc3BvbnNlOiB1bmtub3duIH0pLnJlc3BvbnNlID0gcmVzdWx0O1xuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogd2l0aFN1Ym1pdCBmZWF0dXJlXG4gKiBBZGRzIHZhbGlkYXRpb24gYW5kIHN1Ym1pc3Npb24gY2FwYWJpbGl0aWVzIHRvIHRoZSBmb3JtXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoU3VibWl0ID0gKGNvbmZpZzogRm9ybUNvbmZpZykgPT4ge1xuICByZXR1cm4gPFxuICAgIFQgZXh0ZW5kcyBCYXNlRm9ybUNvbXBvbmVudCAmIHtcbiAgICAgIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnk7XG4gICAgICBzdGF0ZTogRm9ybVN0YXRlO1xuICAgICAgZ2V0RGF0YTogKCkgPT4gRm9ybURhdGE7XG4gICAgICBnZXRNb2RpZmllZERhdGE6ICgpID0+IEZvcm1EYXRhO1xuICAgICAgZGlzYWJsZUNvbnRyb2xzOiAoKSA9PiB2b2lkO1xuICAgICAgc25hcHNob3Q6ICgpID0+IHZvaWQ7XG4gICAgICBlbWl0PzogKGV2ZW50OiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiB2b2lkO1xuICAgIH0sXG4gID4oXG4gICAgY29tcG9uZW50OiBULFxuICApOiBUICYge1xuICAgIHZhbGlkYXRlOiAoKSA9PiBGb3JtVmFsaWRhdGlvblJlc3VsdDtcbiAgICBzdWJtaXQ6IChvcHRpb25zPzogRm9ybVN1Ym1pdE9wdGlvbnMpID0+IFByb21pc2U8dW5rbm93bj47XG4gICAgc2V0VmFsaWRhdGlvblJ1bGVzOiAocnVsZXM6IEZvcm1WYWxpZGF0aW9uUnVsZVtdKSA9PiB2b2lkO1xuICAgIGNsZWFyRXJyb3JzOiAoKSA9PiB2b2lkO1xuICAgIHNldEZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nLCBlcnJvcjogc3RyaW5nKSA9PiB2b2lkO1xuICAgIGdldEZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIH0gPT4ge1xuICAgIC8vIFZhbGlkYXRpb24gcnVsZXMgY2FuIGJlIHVwZGF0ZWQgYXQgcnVudGltZVxuICAgIGxldCB2YWxpZGF0aW9uUnVsZXMgPSBjb25maWcudmFsaWRhdGlvbiB8fCBbXTtcblxuICAgIGNvbnN0IGVuaGFuY2VkID0ge1xuICAgICAgLi4uY29tcG9uZW50LFxuXG4gICAgICAvKipcbiAgICAgICAqIFZhbGlkYXRlIGZvcm0gZGF0YSBhZ2FpbnN0IGNvbmZpZ3VyZWQgcnVsZXNcbiAgICAgICAqIEByZXR1cm5zIFZhbGlkYXRpb24gcmVzdWx0IHdpdGggdmFsaWQgZmxhZyBhbmQgZXJyb3JzIG9iamVjdFxuICAgICAgICovXG4gICAgICB2YWxpZGF0ZSgpOiBGb3JtVmFsaWRhdGlvblJlc3VsdCB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBjb21wb25lbnQuZ2V0RGF0YSgpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB2YWxpZGF0ZURhdGEoZGF0YSwgdmFsaWRhdGlvblJ1bGVzKTtcblxuICAgICAgICAvLyBVcGRhdGUgc3RhdGUgd2l0aCB2YWxpZGF0aW9uIGVycm9yc1xuICAgICAgICBjb21wb25lbnQuc3RhdGUuZXJyb3JzID0gcmVzdWx0LmVycm9ycztcblxuICAgICAgICAvLyBFbWl0IHZhbGlkYXRpb24gZXZlbnQgaWYgdGhlcmUgYXJlIGVycm9yc1xuICAgICAgICBpZiAoIXJlc3VsdC52YWxpZCkge1xuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuVkFMSURBVElPTl9FUlJPUiwgcmVzdWx0LmVycm9ycyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTdWJtaXQgdGhlIGZvcm1cbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgc3VibWl0IGNvbmZpZ3VyYXRpb25cbiAgICAgICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBzZXJ2ZXIgcmVzcG9uc2VcbiAgICAgICAqL1xuICAgICAgYXN5bmMgc3VibWl0KG9wdGlvbnM6IEZvcm1TdWJtaXRPcHRpb25zID0ge30pOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgLy8gUHJldmVudCBkb3VibGUgc3VibWlzc2lvblxuICAgICAgICBpZiAoY29tcG9uZW50LnN0YXRlLnN1Ym1pdHRpbmcpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRm9ybSBpcyBhbHJlYWR5IHN1Ym1pdHRpbmdcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgaWYgcmVxdWVzdGVkIChkZWZhdWx0OiB0cnVlKVxuICAgICAgICBpZiAob3B0aW9ucy52YWxpZGF0ZSAhPT0gZmFsc2UgJiYgdmFsaWRhdGlvblJ1bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uID0gdGhpcy52YWxpZGF0ZSgpO1xuICAgICAgICAgIGlmICghdmFsaWRhdGlvbi52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlZhbGlkYXRpb24gZmFpbGVkXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYXJrIGFzIHN1Ym1pdHRpbmdcbiAgICAgICAgY29tcG9uZW50LnN0YXRlLnN1Ym1pdHRpbmcgPSB0cnVlO1xuXG4gICAgICAgIC8vIEFkZCBzdWJtaXR0aW5nIGNsYXNzIHRvIGVsZW1lbnRcbiAgICAgICAgaWYgKGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlnLnByZWZpeCB8fCBcIm10cmxcIjtcbiAgICAgICAgICBjb25zdCBjb21wb25lbnROYW1lID0gY29uZmlnLmNvbXBvbmVudE5hbWUgfHwgXCJmb3JtXCI7XG4gICAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuY2xhc3NMaXN0LmFkZChcbiAgICAgICAgICAgIGAke3ByZWZpeH0tJHtjb21wb25lbnROYW1lfS0tJHtGT1JNX0NMQVNTRVMuU1VCTUlUVElOR31gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IHN1Ym1pdCBldmVudFxuICAgICAgICBjb25zdCBkYXRhID0gY29tcG9uZW50LmdldERhdGEoKTtcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5TVUJNSVQsIGRhdGEpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGV0IHJlc3VsdDogdW5rbm93bjtcblxuICAgICAgICAgIC8vIFVzZSBjdXN0b20gaGFuZGxlciBpZiBwcm92aWRlZFxuICAgICAgICAgIGlmIChvcHRpb25zLmhhbmRsZXIpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IG9wdGlvbnMuaGFuZGxlcihcbiAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgY29tcG9uZW50IGFzIHVua25vd24gYXMgaW1wb3J0KFwiLi4vdHlwZXNcIikuRm9ybUNvbXBvbmVudCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjb25maWcuYWN0aW9uKSB7XG4gICAgICAgICAgICAvLyBVc2UgZGVmYXVsdCBmZXRjaFxuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcGVyZm9ybVJlcXVlc3QoY29uZmlnLmFjdGlvbiwgZGF0YSwge1xuICAgICAgICAgICAgICBtZXRob2Q6IG9wdGlvbnMubWV0aG9kIHx8IGNvbmZpZy5tZXRob2QgfHwgXCJQT1NUXCIsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IG9wdGlvbnMuaGVhZGVycyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBObyBhY3Rpb24gVVJMLCBqdXN0IHJldHVybiB0aGUgZGF0YVxuICAgICAgICAgICAgcmVzdWx0ID0gZGF0YTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTdWNjZXNzIVxuICAgICAgICAgIGNvbXBvbmVudC5zdGF0ZS5zdWJtaXR0aW5nID0gZmFsc2U7XG4gICAgICAgICAgY29tcG9uZW50LnN0YXRlLmVycm9ycyA9IHt9O1xuXG4gICAgICAgICAgLy8gUmVtb3ZlIHN1Ym1pdHRpbmcgY2xhc3NcbiAgICAgICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZy5wcmVmaXggfHwgXCJtdHJsXCI7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnROYW1lID0gY29uZmlnLmNvbXBvbmVudE5hbWUgfHwgXCJmb3JtXCI7XG4gICAgICAgICAgICBjb21wb25lbnQuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFxuICAgICAgICAgICAgICBgJHtwcmVmaXh9LSR7Y29tcG9uZW50TmFtZX0tLSR7Rk9STV9DTEFTU0VTLlNVQk1JVFRJTkd9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVGFrZSBzbmFwc2hvdCBvZiBjdXJyZW50IGRhdGEgYXMgbmV3IGJhc2VsaW5lXG4gICAgICAgICAgLy8gVGhpcyByZXNldHMgbW9kaWZpZWQgc3RhdGUgdG8gZmFsc2UsIHdoaWNoIHdpbGwgdHJpZ2dlciBzdGF0ZTpjaGFuZ2VcbiAgICAgICAgICBjb21wb25lbnQuc25hcHNob3QoKTtcblxuICAgICAgICAgIC8vIERpc2FibGUgY29udHJvbHMgKGZvcm0gaXMgbm93IHByaXN0aW5lKVxuICAgICAgICAgIGNvbXBvbmVudC5kaXNhYmxlQ29udHJvbHMoKTtcblxuICAgICAgICAgIC8vIEVtaXQgc3VjY2VzcyBldmVudFxuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuU1VCTUlUX1NVQ0NFU1MsIHJlc3VsdCk7XG5cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIEVycm9yIVxuICAgICAgICAgIGNvbXBvbmVudC5zdGF0ZS5zdWJtaXR0aW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAvLyBSZW1vdmUgc3VibWl0dGluZyBjbGFzc1xuICAgICAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlnLnByZWZpeCB8fCBcIm10cmxcIjtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBjb25maWcuY29tcG9uZW50TmFtZSB8fCBcImZvcm1cIjtcbiAgICAgICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXG4gICAgICAgICAgICAgIGAke3ByZWZpeH0tJHtjb21wb25lbnROYW1lfS0tJHtGT1JNX0NMQVNTRVMuU1VCTUlUVElOR31gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBFbWl0IGVycm9yIGV2ZW50XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5TVUJNSVRfRVJST1IsIGVycm9yKTtcblxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNldCB2YWxpZGF0aW9uIHJ1bGVzIGF0IHJ1bnRpbWVcbiAgICAgICAqL1xuICAgICAgc2V0VmFsaWRhdGlvblJ1bGVzKHJ1bGVzOiBGb3JtVmFsaWRhdGlvblJ1bGVbXSk6IHZvaWQge1xuICAgICAgICB2YWxpZGF0aW9uUnVsZXMgPSBydWxlcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2xlYXIgYWxsIHZhbGlkYXRpb24gZXJyb3JzXG4gICAgICAgKi9cbiAgICAgIGNsZWFyRXJyb3JzKCk6IHZvaWQge1xuICAgICAgICBjb21wb25lbnQuc3RhdGUuZXJyb3JzID0ge307XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNldCBhbiBlcnJvciBmb3IgYSBzcGVjaWZpYyBmaWVsZFxuICAgICAgICovXG4gICAgICBzZXRGaWVsZEVycm9yKGZpZWxkOiBzdHJpbmcsIGVycm9yOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29tcG9uZW50LnN0YXRlLmVycm9yc1tmaWVsZF0gPSBlcnJvcjtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IHRoZSBlcnJvciBmb3IgYSBzcGVjaWZpYyBmaWVsZFxuICAgICAgICovXG4gICAgICBnZXRGaWVsZEVycm9yKGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LnN0YXRlLmVycm9yc1tmaWVsZF07XG4gICAgICB9LFxuICAgIH07XG5cbiAgICByZXR1cm4gZW5oYW5jZWQ7XG4gIH07XG59O1xuXG5leHBvcnQgeyB2YWxpZGF0ZURhdGEsIHBlcmZvcm1SZXF1ZXN0IH07XG5leHBvcnQgZGVmYXVsdCB3aXRoU3VibWl0O1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2FwaS50c1xuXG4vKipcbiAqIEFQSSBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogUHJvdmlkZXMgYSBjbGVhbiwgdW5pZmllZCBwdWJsaWMgQVBJIGZvciB0aGUgZm9ybVxuICogQWxzbyB3aXJlcyB1cCBjb250cm9sIGJ1dHRvbiBjbGljayBoYW5kbGVycyAoc3VibWl0L2NhbmNlbClcbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEZvcm1Db25maWcsXG4gIEJhc2VGb3JtQ29tcG9uZW50LFxuICBGb3JtQ29tcG9uZW50LFxuICBGb3JtRGF0YSxcbiAgRGF0YVN0YXRlLFxuICBGb3JtU3RhdGUsXG4gIEZvcm1GaWVsZCxcbiAgRm9ybUZpZWxkUmVnaXN0cnksXG4gIEZvcm1WYWxpZGF0aW9uUmVzdWx0LFxuICBGb3JtU3VibWl0T3B0aW9ucyxcbiAgRmllbGRWYWx1ZSxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBGT1JNX0VWRU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBXaXJlcyB1cCBjbGljayBoYW5kbGVycyBmb3IgY29udHJvbCBidXR0b25zIChzdWJtaXQsIGNhbmNlbClcbiAqL1xuY29uc3Qgd2lyZUNvbnRyb2xCdXR0b25zID0gKFxuICBjb250cm9sczogTWFwPHN0cmluZywgRm9ybUZpZWxkPixcbiAgYXBpOiBGb3JtQ29tcG9uZW50LFxuICBjb25maWc6IEZvcm1Db25maWcsXG4pOiB2b2lkID0+IHtcbiAgLy8gV2lyZSBzdWJtaXQgYnV0dG9uXG4gIGNvbnN0IHN1Ym1pdEJ1dHRvbiA9IGNvbnRyb2xzLmdldChcInN1Ym1pdFwiKTtcbiAgaWYgKHN1Ym1pdEJ1dHRvbj8uZWxlbWVudCkge1xuICAgIHN1Ym1pdEJ1dHRvbi5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoY29uZmlnLm9uU3VibWl0KSB7XG4gICAgICAgIC8vIFVzZSBjdXN0b20gc3VibWl0IGhhbmRsZXJcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gYXBpLmdldERhdGEoKTtcbiAgICAgICAgICBhd2FpdCBjb25maWcub25TdWJtaXQoZGF0YSwgYXBpKTtcbiAgICAgICAgICAvLyBBZnRlciBzdWNjZXNzZnVsIHN1Ym1pdCwgZGlzYWJsZSBjb250cm9scyAoZm9ybSBpcyBub3cgcHJpc3RpbmUpXG4gICAgICAgICAgYXBpLmRpc2FibGVDb250cm9scygpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGb3JtIHN1Ym1pdCBlcnJvcjpcIiwgZXJyb3IpO1xuICAgICAgICAgIC8vIE9uIGVycm9yLCBhbHNvIGRpc2FibGUgY29udHJvbHMgdG8gcHJldmVudCByZXBlYXRlZCBjbGlja3NcbiAgICAgICAgICBhcGkuZGlzYWJsZUNvbnRyb2xzKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVzZSBkZWZhdWx0IGZvcm0gc3VibWl0IChoYW5kbGVzIGRpc2FibGluZyBpbnRlcm5hbGx5KVxuICAgICAgICBhd2FpdCBhcGkuc3VibWl0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBXaXJlIGNhbmNlbCBidXR0b25cbiAgY29uc3QgY2FuY2VsQnV0dG9uID0gY29udHJvbHMuZ2V0KFwiY2FuY2VsXCIpO1xuICBpZiAoY2FuY2VsQnV0dG9uPy5lbGVtZW50KSB7XG4gICAgY2FuY2VsQnV0dG9uLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgIGlmIChjb25maWcub25DYW5jZWwpIHtcbiAgICAgICAgLy8gVXNlIGN1c3RvbSBjYW5jZWwgaGFuZGxlclxuICAgICAgICBjb25maWcub25DYW5jZWwoYXBpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERlZmF1bHQ6IHJlc2V0IGZvcm0gdG8gaW5pdGlhbCBzdGF0ZVxuICAgICAgICBhcGkucmVzZXQoKTtcbiAgICAgIH1cbiAgICAgIC8vIEFmdGVyIGNhbmNlbCwgZGlzYWJsZSBjb250cm9scyAoZm9ybSBpcyBub3cgcHJpc3RpbmUpXG4gICAgICBhcGkuZGlzYWJsZUNvbnRyb2xzKCk7XG4gICAgfSk7XG4gIH1cbn07XG5cbi8qKlxuICogRXh0ZW5kZWQgY29tcG9uZW50IGludGVyZmFjZSBiZWZvcmUgQVBJIGlzIGFwcGxpZWRcbiAqL1xuaW50ZXJmYWNlIEVuaGFuY2VkRm9ybUNvbXBvbmVudCBleHRlbmRzIEJhc2VGb3JtQ29tcG9uZW50IHtcbiAgZm9ybTogSFRNTEZvcm1FbGVtZW50O1xuICB1aTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnk7XG4gIGZpbGVzOiBGb3JtRmllbGRSZWdpc3RyeTtcbiAgc3RhdGU6IEZvcm1TdGF0ZTtcbiAgY29udHJvbHM6IE1hcDxzdHJpbmcsIEZvcm1GaWVsZD47XG5cbiAgLy8gRGF0YSBtZXRob2RzXG4gIGdldERhdGE6ICgpID0+IEZvcm1EYXRhO1xuICBzZXREYXRhOiAoZGF0YTogRm9ybURhdGEsIHNpbGVudD86IGJvb2xlYW4pID0+IHZvaWQ7XG4gIGdldEZpZWxkVmFsdWU6IChuYW1lOiBzdHJpbmcpID0+IEZpZWxkVmFsdWU7XG4gIHNldEZpZWxkVmFsdWU6IChuYW1lOiBzdHJpbmcsIHZhbHVlOiBGaWVsZFZhbHVlLCBzaWxlbnQ/OiBib29sZWFuKSA9PiB2b2lkO1xuICBpc01vZGlmaWVkOiAoKSA9PiBib29sZWFuO1xuICBnZXRNb2RpZmllZERhdGE6ICgpID0+IEZvcm1EYXRhO1xuICBzbmFwc2hvdDogKCkgPT4gdm9pZDtcbiAgcmVzZXQ6ICgpID0+IHZvaWQ7XG4gIGNsZWFyOiAoKSA9PiB2b2lkO1xuXG4gIC8vIEZpZWxkIG1ldGhvZHNcbiAgZ2V0RmllbGQ6IChuYW1lOiBzdHJpbmcpID0+IEZvcm1GaWVsZCB8IHVuZGVmaW5lZDtcbiAgZ2V0RmllbGROYW1lczogKCkgPT4gc3RyaW5nW107XG4gIGhhc0ZpZWxkOiAobmFtZTogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIC8vIENvbnRyb2xsZXIgbWV0aG9kc1xuICBnZXREYXRhU3RhdGU6ICgpID0+IERhdGFTdGF0ZTtcbiAgZW5hYmxlQ29udHJvbHM6ICgpID0+IHZvaWQ7XG4gIGRpc2FibGVDb250cm9sczogKCkgPT4gdm9pZDtcbiAgZW5hYmxlRmllbGRzOiAoKSA9PiB2b2lkO1xuICBkaXNhYmxlRmllbGRzOiAoKSA9PiB2b2lkO1xuXG4gIC8vIFN1Ym1pdCBtZXRob2RzXG4gIHZhbGlkYXRlOiAoKSA9PiBGb3JtVmFsaWRhdGlvblJlc3VsdDtcbiAgc3VibWl0OiAob3B0aW9ucz86IEZvcm1TdWJtaXRPcHRpb25zKSA9PiBQcm9taXNlPHVua25vd24+O1xuICBzZXRWYWxpZGF0aW9uUnVsZXM6IChydWxlczogaW1wb3J0KFwiLi4vdHlwZXNcIikuRm9ybVZhbGlkYXRpb25SdWxlW10pID0+IHZvaWQ7XG4gIGNsZWFyRXJyb3JzOiAoKSA9PiB2b2lkO1xuICBzZXRGaWVsZEVycm9yOiAoZmllbGQ6IHN0cmluZywgZXJyb3I6IHN0cmluZykgPT4gdm9pZDtcbiAgZ2V0RmllbGRFcnJvcjogKGZpZWxkOiBzdHJpbmcpID0+IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvLyBFdmVudCBtZXRob2RzXG4gIG9uPzogKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKSA9PiB2b2lkO1xuICBvZmY/OiAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pID0+IHZvaWQ7XG4gIGVtaXQ/OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG5cbiAgLy8gTGlmZWN5Y2xlXG4gIGxpZmVjeWNsZT86IHtcbiAgICBkZXN0cm95OiAoKSA9PiB2b2lkO1xuICB9O1xufVxuXG4vKipcbiAqIHdpdGhBUEkgZmVhdHVyZVxuICogQ3JlYXRlcyBhIGNsZWFuIHB1YmxpYyBBUEkgZm9yIHRoZSBmb3JtIGNvbXBvbmVudFxuICovXG5leHBvcnQgY29uc3Qgd2l0aEFQSSA9IChjb25maWc6IEZvcm1Db25maWcpID0+IHtcbiAgcmV0dXJuIChjb21wb25lbnQ6IEVuaGFuY2VkRm9ybUNvbXBvbmVudCk6IEZvcm1Db21wb25lbnQgPT4ge1xuICAgIC8vIFJlZ2lzdGVyIGV2ZW50IGhhbmRsZXJzIGZyb20gY29uZmlnXG4gICAgaWYgKGNvbmZpZy5vbiAmJiBjb21wb25lbnQub24pIHtcbiAgICAgIGZvciAoY29uc3QgW2V2ZW50LCBoYW5kbGVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWcub24pKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgY29tcG9uZW50Lm9uKGV2ZW50LCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgcHVibGljIEFQSVxuICAgIGNvbnN0IGFwaTogRm9ybUNvbXBvbmVudCA9IHtcbiAgICAgIC8vIENvcmUgcHJvcGVydGllc1xuICAgICAgZWxlbWVudDogY29tcG9uZW50LmVsZW1lbnQsXG4gICAgICBmb3JtOiBjb21wb25lbnQuZm9ybSxcbiAgICAgIHVpOiBjb21wb25lbnQudWksXG4gICAgICBmaWVsZHM6IGNvbXBvbmVudC5maWVsZHMsXG4gICAgICBzdGF0ZTogY29tcG9uZW50LnN0YXRlLFxuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vIERhdGEgQVBJXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgYWxsIGZvcm0gZGF0YSBhcyBhIGtleS12YWx1ZSBvYmplY3RcbiAgICAgICAqL1xuICAgICAgZ2V0RGF0YSgpOiBGb3JtRGF0YSB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuZ2V0RGF0YSgpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTZXQgZm9ybSBkYXRhIGZyb20gYSBrZXktdmFsdWUgb2JqZWN0XG4gICAgICAgKiBAcGFyYW0gZGF0YSAtIERhdGEgdG8gc2V0XG4gICAgICAgKiBAcGFyYW0gc2lsZW50IC0gSWYgdHJ1ZSwgZG9uJ3QgZW1pdCBjaGFuZ2UgZXZlbnRzXG4gICAgICAgKi9cbiAgICAgIHNldERhdGEoZGF0YTogRm9ybURhdGEsIHNpbGVudD86IGJvb2xlYW4pOiBGb3JtQ29tcG9uZW50IHtcbiAgICAgICAgY29tcG9uZW50LnNldERhdGEoZGF0YSwgc2lsZW50KTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IGEgc3BlY2lmaWMgZmllbGQncyB2YWx1ZVxuICAgICAgICogQHBhcmFtIG5hbWUgLSBGaWVsZCBuYW1lXG4gICAgICAgKi9cbiAgICAgIGdldEZpZWxkVmFsdWUobmFtZTogc3RyaW5nKTogRmllbGRWYWx1ZSB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuZ2V0RmllbGRWYWx1ZShuYW1lKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IGEgc3BlY2lmaWMgZmllbGQncyB2YWx1ZVxuICAgICAgICogQHBhcmFtIG5hbWUgLSBGaWVsZCBuYW1lXG4gICAgICAgKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBzZXRcbiAgICAgICAqIEBwYXJhbSBzaWxlbnQgLSBJZiB0cnVlLCBkb24ndCBlbWl0IGNoYW5nZSBldmVudHNcbiAgICAgICAqL1xuICAgICAgc2V0RmllbGRWYWx1ZShcbiAgICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgICB2YWx1ZTogRmllbGRWYWx1ZSxcbiAgICAgICAgc2lsZW50PzogYm9vbGVhbixcbiAgICAgICk6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQuc2V0RmllbGRWYWx1ZShuYW1lLCB2YWx1ZSwgc2lsZW50KTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IGEgZmllbGQgY29tcG9uZW50IGJ5IG5hbWVcbiAgICAgICAqIEBwYXJhbSBuYW1lIC0gRmllbGQgbmFtZVxuICAgICAgICovXG4gICAgICBnZXRGaWVsZChuYW1lOiBzdHJpbmcpOiBGb3JtRmllbGQgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LmdldEZpZWxkKG5hbWUpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgYWxsIGZpZWxkIG5hbWVzXG4gICAgICAgKi9cbiAgICAgIGdldEZpZWxkTmFtZXMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LmdldEZpZWxkTmFtZXMoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgZm9ybSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwvc25hcHNob3Qgc3RhdGVcbiAgICAgICAqL1xuICAgICAgaXNNb2RpZmllZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5pc01vZGlmaWVkKCk7XG4gICAgICB9LFxuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vIFN0YXRlIEFQSVxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IHRoZSBjdXJyZW50IGRhdGEgc3RhdGUgKHByaXN0aW5lIG9yIGRpcnR5KVxuICAgICAgICovXG4gICAgICBnZXREYXRhU3RhdGUoKTogRGF0YVN0YXRlIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5nZXREYXRhU3RhdGUoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gVmFsaWRhdGlvbiBBUElcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgICAvKipcbiAgICAgICAqIFZhbGlkYXRlIHRoZSBmb3JtIGFnYWluc3QgY29uZmlndXJlZCBydWxlc1xuICAgICAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHQgd2l0aCB2YWxpZCBmbGFnIGFuZCBlcnJvcnNcbiAgICAgICAqL1xuICAgICAgdmFsaWRhdGUoKTogRm9ybVZhbGlkYXRpb25SZXN1bHQge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LnZhbGlkYXRlKCk7XG4gICAgICB9LFxuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vIFN1Ym1pdCBBUElcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgICAvKipcbiAgICAgICAqIFN1Ym1pdCB0aGUgZm9ybVxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBzdWJtaXQgY29uZmlndXJhdGlvblxuICAgICAgICovXG4gICAgICBhc3luYyBzdWJtaXQob3B0aW9ucz86IEZvcm1TdWJtaXRPcHRpb25zKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuc3VibWl0KG9wdGlvbnMpO1xuICAgICAgfSxcblxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyBTdGF0ZSBNYW5hZ2VtZW50IEFQSVxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAgIC8qKlxuICAgICAgICogUmVzZXQgZm9ybSB0byBpbml0aWFsL3NuYXBzaG90IHN0YXRlXG4gICAgICAgKi9cbiAgICAgIHJlc2V0KCk6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQucmVzZXQoKTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2xlYXIgYWxsIGZvcm0gZmllbGRzXG4gICAgICAgKi9cbiAgICAgIGNsZWFyKCk6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQuY2xlYXIoKTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRW5hYmxlIGFsbCBmb3JtIGZpZWxkc1xuICAgICAgICovXG4gICAgICBlbmFibGUoKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5lbmFibGVGaWVsZHMoKTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZSBhbGwgZm9ybSBmaWVsZHNcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZSgpOiBGb3JtQ29tcG9uZW50IHtcbiAgICAgICAgY29tcG9uZW50LmRpc2FibGVGaWVsZHMoKTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRW5hYmxlIGNvbnRyb2wgYnV0dG9ucyAoc3VibWl0LCBjYW5jZWwsIGV0Yy4pXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZUNvbnRyb2xzKCk6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQuZW5hYmxlQ29udHJvbHMoKTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZSBjb250cm9sIGJ1dHRvbnNcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZUNvbnRyb2xzKCk6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQuZGlzYWJsZUNvbnRyb2xzKCk7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vIEV2ZW50IEFQSVxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAgIC8qKlxuICAgICAgICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyXG4gICAgICAgKiBAcGFyYW0gZXZlbnQgLSBFdmVudCBuYW1lXG4gICAgICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICAgICAqL1xuICAgICAgb24oZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pOiBGb3JtQ29tcG9uZW50IHtcbiAgICAgICAgY29tcG9uZW50Lm9uPy4oZXZlbnQsIGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXJcbiAgICAgICAqIEBwYXJhbSBldmVudCAtIEV2ZW50IG5hbWVcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICovXG4gICAgICBvZmYoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pOiBGb3JtQ29tcG9uZW50IHtcbiAgICAgICAgY29tcG9uZW50Lm9mZj8uKGV2ZW50LCBoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRW1pdCBhbiBldmVudFxuICAgICAgICogQHBhcmFtIGV2ZW50IC0gRXZlbnQgbmFtZVxuICAgICAgICogQHBhcmFtIGRhdGEgLSBFdmVudCBkYXRhXG4gICAgICAgKi9cbiAgICAgIGVtaXQoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihldmVudCwgZGF0YSk7XG4gICAgICB9LFxuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vIExpZmVjeWNsZSBBUElcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgICAvKipcbiAgICAgICAqIERlc3Ryb3kgdGhlIGZvcm0gYW5kIGNsZWFuIHVwIHJlc291cmNlc1xuICAgICAgICovXG4gICAgICBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICAvLyBDbGVhciBhbGwgZmllbGQgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIGZvciAoY29uc3QgWywgZmllbGRdIG9mIGNvbXBvbmVudC5maWVsZHMpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGZpZWxkLmRlc3Ryb3kgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgZmllbGQuZGVzdHJveSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsZWFyIGNvbnRyb2wgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIGZvciAoY29uc3QgWywgY29udHJvbF0gb2YgY29tcG9uZW50LmNvbnRyb2xzKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjb250cm9sLmRlc3Ryb3kgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgY29udHJvbC5kZXN0cm95KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FsbCBsaWZlY3ljbGUgZGVzdHJveSBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKGNvbXBvbmVudC5saWZlY3ljbGU/LmRlc3Ryb3kpIHtcbiAgICAgICAgICBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSBmb3JtIGVsZW1lbnQgZnJvbSBET01cbiAgICAgICAgaWYgKGNvbXBvbmVudC5lbGVtZW50Py5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgY29tcG9uZW50LmVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjb21wb25lbnQuZWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IGRlc3Ryb3kgZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5SRVNFVCk7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBXaXJlIHVwIGNvbnRyb2wgYnV0dG9uIGNsaWNrIGhhbmRsZXJzXG4gICAgd2lyZUNvbnRyb2xCdXR0b25zKGNvbXBvbmVudC5jb250cm9scywgYXBpLCBjb25maWcpO1xuXG4gICAgcmV0dXJuIGFwaTtcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhBUEk7XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQk8sU0FBUyxXQUFXLENBQ3pCLElBQ0EsSUFDQSxJQUNBLElBQ1E7QUFBQSxFQUNSLE9BQU8sS0FBSyxLQUFLLEtBQUssSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO0FBQUE7QUFZdkQsU0FBUyxRQUFRLENBQ3RCLElBQ0EsSUFDQSxJQUNBLElBQ1E7QUFBQSxFQUNSLE1BQU0sUUFBUyxLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUssRUFBRSxJQUFJLE1BQU8sS0FBSztBQUFBLEVBQzFELE9BQU8sUUFBUSxJQUFJLFFBQVEsTUFBTTtBQUFBO0FBVzVCLFNBQVMsa0JBQWtCLENBQ2hDLE1BQ0EsZUFDQSxPQUNjO0FBQUEsRUFDZCxNQUFNLFVBQVUsS0FBSyxJQUFJO0FBQUEsRUFDekIsSUFBSSxtQkFBbUI7QUFBQSxFQUV2QixNQUFNLFFBQXNCO0FBQUEsSUFDMUI7QUFBQSxJQUNB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O0FBQUEsUUFDbkQsV0FBVSxNQUFNLE9BQU8sT0FBTztBQUFBLFFBQzlCLE9BQU87QUFBQTtBQUFBLE1BUVQsSUFBSSxDQUFDLE9BQWUsTUFBc0I7QUFBQSxRQUN4QyxXQUFVLE9BQU8sT0FBTyxJQUFJO0FBQUE7QUFBQSxNQVU5QixPQUFPLEdBQVM7QUFBQSxRQUVkLGNBQWMsVUFBVSxXQUFVLFFBQVE7QUFBQSxVQUN4QyxJQUFJLE9BQU8sTUFBTSxZQUFZLFlBQVk7QUFBQSxZQUN2QyxNQUFNLFFBQVE7QUFBQSxVQUNoQjtBQUFBLFFBQ0Y7QUFBQSxRQUdBLGNBQWMsWUFBWSxXQUFVLFVBQVU7QUFBQSxVQUM1QyxJQUFJLE9BQU8sUUFBUSxZQUFZLFlBQVk7QUFBQSxZQUN6QyxRQUFRLFFBQVE7QUFBQSxVQUNsQjtBQUFBLFFBQ0Y7QUFBQSxRQUdBLElBQUksV0FBVSxXQUFXLFNBQVM7QUFBQSxVQUNoQyxXQUFVLFVBQVUsUUFBUTtBQUFBLFFBQzlCO0FBQUEsUUFHQSxJQUFJLFdBQVUsU0FBUyxZQUFZO0FBQUEsVUFDakMsV0FBVSxRQUFRLFdBQVcsWUFBWSxXQUFVLE9BQU87QUFBQSxRQUM1RDtBQUFBLFFBR0EsV0FBVSxPQUFPLFlBQVksS0FBSztBQUFBO0FBQUEsSUFFdEM7QUFBQSxJQUdBLG1CQUFtQixXQUFVLFVBQVUsS0FBSyxNQUFNO0FBQUEsSUFFbEQsT0FBTztBQUFBO0FBQUE7O0FSbFNKLElBQU0sYUFBYSxDQUFDLFNBQXFCLENBQUMsTUFBcUI7QUFBQSxFQUNwRSxJQUFJO0FBQUEsSUFFRixNQUFNLGFBQWEsaUJBQWlCLE1BQU07QUFBQSxJQUkxQyxNQUFNLGFBQVksbUJBRWhCLDBCQUdBLHlCQUFXLEdBR1gsMEJBQVksaUJBQWlCLFVBQVUsQ0FBQyxHQUd4QyxXQUFXLFVBQVUsR0FHckIsV0FBVyxVQUFVLEdBR3JCLFNBQVMsVUFBVSxHQUduQixlQUFlLFVBQVUsR0FHekIsV0FBVyxVQUFVLEdBR3JCLDRCQUFjLEdBR2QsU0FBUSxVQUFVLENBQ3BCLEVBQUUsVUFBVTtBQUFBLElBR1osSUFBSSxPQUFPLGFBQWEsV0FBVSxTQUFTO0FBQUEsTUFDekMsT0FBTyxVQUFVLFlBQVksV0FBVSxPQUFPO0FBQUEsSUFDaEQ7QUFBQSxJQUVBLE9BQU87QUFBQSxJQUNQLE9BQU8sT0FBTztBQUFBLElBQ2QsUUFBUSxNQUFNLHdCQUF3QixLQUFLO0FBQUEsSUFDM0MsTUFBTSxJQUFJLE1BQU0sMEJBQTJCLE1BQWdCLFNBQVM7QUFBQTtBQUFBOyIsCiAgImRlYnVnSWQiOiAiOEE1NTBBM0I2QTQ1Q0M1MTY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
|