cdk-nextjs 0.7.5 → 0.7.6
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/.jsii +37 -37
- package/docs/adapter-runtime.md +1 -1
- package/docs/harness-coverage.md +9 -8
- package/lib/adapter/adapter.mjs +220 -149
- package/lib/adapter/aws-cache-store.d.ts +28 -4
- package/lib/adapter/aws-cache-store.js +52 -21
- package/lib/adapter/aws-cache-store.test.js +36 -1
- package/lib/adapter/build-outputs.js +23 -1
- package/lib/adapter/build-outputs.test.js +18 -1
- package/lib/adapter/cache-handler.d.ts +4 -3
- package/lib/adapter/cache-handler.js +1 -1
- package/lib/adapter/cache-handler.mjs +131 -61
- package/lib/adapter/cache-handler.test.js +31 -1
- package/lib/adapter/cache-utils.d.ts +68 -2
- package/lib/adapter/cache-utils.js +108 -2
- package/lib/adapter/cache-utils.test.js +45 -1
- package/lib/adapter/init-cache.d.ts +1 -1
- package/lib/adapter/init-cache.js +60 -37
- package/lib/adapter/init-cache.test.js +55 -2
- package/lib/adapter/local-file-cache-handler.d.ts +2 -2
- package/lib/adapter/local-file-cache-handler.js +4 -5
- package/lib/adapter/s3-cache-handler.d.ts +23 -7
- package/lib/adapter/s3-cache-handler.js +63 -27
- package/lib/adapter/s3-cache-handler.test.js +168 -1
- package/lib/adapter/use-cache-default-handler.mjs +32 -9
- package/lib/adapter/use-cache-remote-handler.js +2 -3
- package/lib/adapter/use-cache-remote-handler.mjs +81 -61
- package/lib/nextjs-api.js +1 -1
- package/lib/nextjs-build/nextjs-build.d.ts +0 -7
- package/lib/nextjs-build/nextjs-build.js +4 -11
- package/lib/nextjs-build/nextjs-build.test.js +4 -3
- package/lib/nextjs-cache.js +1 -1
- package/lib/nextjs-compute/nextjs-containers.js +1 -1
- package/lib/nextjs-compute/nextjs-functions.js +1 -1
- package/lib/nextjs-distribution.js +1 -1
- package/lib/nextjs-post-deploy.js +1 -1
- package/lib/nextjs-static-assets.js +1 -1
- package/lib/root-constructs/nextjs-base-construct.js +1 -1
- package/lib/root-constructs/nextjs-global-containers.js +1 -1
- package/lib/root-constructs/nextjs-global-functions.js +1 -1
- package/lib/root-constructs/nextjs-regional-containers.js +1 -1
- package/lib/root-constructs/nextjs-regional-functions.js +1 -1
- package/lib/runtime/image.d.ts +19 -0
- package/lib/runtime/image.js +28 -2
- package/lib/runtime/image.test.js +43 -1
- package/lib/runtime/lambda.mjs +14 -3
- package/lib/runtime/server.mjs +14 -3
- package/lib/utils/deployment-build-id.d.ts +11 -0
- package/lib/utils/deployment-build-id.js +15 -0
- package/package.json +3 -3
- package/scripts/e2e-harness/README.md +1 -1
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CacheBucket = exports.TrackedTagMarkers = exports.DEFAULT_MAX_TRACKED_TAGS = exports.MAX_REVALIDATION_LOG_GAP_MS = exports.DEFAULT_TAG_RESYNC_MS = exports.REVALIDATION_LOG_LOOKBACK_MS = exports.RevalidationLog = exports.REVALIDATION_LOG_MAX_PAGES = exports.REVALIDATION_LOG_TTL_MS = exports.TagMarkerTable = exports.DEFAULT_TAG_REFRESH_MS = exports.BATCH_GET_MAX_KEYS = exports.USE_CACHE_KEY_PREFIX = void 0;
|
|
3
|
+
exports.CacheBucket = exports.TrackedTagMarkers = exports.DEFAULT_MAX_TRACKED_TAGS = exports.MAX_REVALIDATION_LOG_GAP_MS = exports.DEFAULT_TAG_RESYNC_MS = exports.REVALIDATION_LOG_LOOKBACK_MS = exports.RevalidationLog = exports.REVALIDATION_LOG_MAX_PAGES = exports.REVALIDATION_LOG_TTL_MS = exports.TagMarkerTable = exports.MAX_TAG_BYTES = exports.MAX_SORT_KEY_BYTES = exports.DEFAULT_TAG_REFRESH_MS = exports.BATCH_GET_MAX_KEYS = exports.USE_CACHE_KEY_PREFIX = void 0;
|
|
4
4
|
exports.resolveAwsCacheConfig = resolveAwsCacheConfig;
|
|
5
5
|
exports.buildS3Key = buildS3Key;
|
|
6
|
+
exports.s3ObjectKey = s3ObjectKey;
|
|
6
7
|
exports.useCacheS3Key = useCacheS3Key;
|
|
7
8
|
exports.markerState = markerState;
|
|
8
9
|
exports.markerClock = markerClock;
|
|
9
10
|
exports.markerFor = markerFor;
|
|
10
11
|
exports.applyMarker = applyMarker;
|
|
11
12
|
exports.markerUpdate = markerUpdate;
|
|
13
|
+
exports.hashedTag = hashedTag;
|
|
14
|
+
exports.sortKeyTag = sortKeyTag;
|
|
12
15
|
exports.mergeMarkers = mergeMarkers;
|
|
13
16
|
/*
|
|
14
17
|
The S3 / DynamoDB plumbing shared by every cdk-nextjs cache handler: the
|
|
@@ -24,6 +27,7 @@ exports.mergeMarkers = mergeMarkers;
|
|
|
24
27
|
const node_path_1 = require("node:path");
|
|
25
28
|
const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
|
|
26
29
|
const client_s3_1 = require("@aws-sdk/client-s3");
|
|
30
|
+
const cache_utils_1 = require("./cache-utils");
|
|
27
31
|
/** The configuration from the environment. */
|
|
28
32
|
function resolveAwsCacheConfig() {
|
|
29
33
|
return {
|
|
@@ -41,14 +45,11 @@ function resolveAwsCacheConfig() {
|
|
|
41
45
|
* which is what keeps it disjoint from {@link useCacheS3Key}.
|
|
42
46
|
*/
|
|
43
47
|
function buildS3Key(buildId, cacheKey) {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
cleanCacheKey = cacheKey.slice(1);
|
|
50
|
-
}
|
|
51
|
-
return (0, node_path_1.join)(buildId, `${cleanCacheKey}.json`);
|
|
48
|
+
return (0, node_path_1.join)(buildId, (0, cache_utils_1.cacheKeyFileName)(cacheKey));
|
|
49
|
+
}
|
|
50
|
+
/** `{buildId}/` + {@link cacheObjectName}: the S3 object an entry is stored in. */
|
|
51
|
+
function s3ObjectKey(buildId, cacheKey) {
|
|
52
|
+
return (0, node_path_1.join)(buildId, (0, cache_utils_1.cacheObjectName)(cacheKey));
|
|
52
53
|
}
|
|
53
54
|
/**
|
|
54
55
|
* The folder under the build prefix that `'use cache'` entries are stored in.
|
|
@@ -61,8 +62,9 @@ exports.USE_CACHE_KEY_PREFIX = "_use-cache";
|
|
|
61
62
|
* Hashed because a `'use cache'` key is the serialized arguments of the call and
|
|
62
63
|
* has no length limit, where an S3 key stops at 1024 bytes. The `.entry` suffix
|
|
63
64
|
* rather than `.json` is what makes a collision with the incremental cache
|
|
64
|
-
* impossible rather than unlikely: every
|
|
65
|
-
* `.json`, including one for a route that happens to be named
|
|
65
|
+
* impossible rather than unlikely: every object {@link s3ObjectKey} names ends
|
|
66
|
+
* in `.json` or `.long`, including one for a route that happens to be named
|
|
67
|
+
* `/_use-cache/…`.
|
|
66
68
|
* Still under the build prefix, so post-deploy pruning drops them with the build.
|
|
67
69
|
*/
|
|
68
70
|
function useCacheS3Key(buildId, keyHash) {
|
|
@@ -162,9 +164,33 @@ exports.BATCH_GET_MAX_KEYS = 100;
|
|
|
162
164
|
* revalidation log, the reads scale with instances instead of requests or tags.
|
|
163
165
|
*/
|
|
164
166
|
exports.DEFAULT_TAG_REFRESH_MS = 1000;
|
|
167
|
+
/** DynamoDB's limit on a sort key, in UTF-8 bytes. */
|
|
168
|
+
exports.MAX_SORT_KEY_BYTES = 1024;
|
|
169
|
+
/**
|
|
170
|
+
* `#<sha256(tag)>`, standing in for a tag in a sort key it would push past
|
|
171
|
+
* {@link MAX_SORT_KEY_BYTES}. Next.js caps the tags an app names, but not an
|
|
172
|
+
* implicit `_N_T_/…` tag, which is as long as its path, and a rejected write
|
|
173
|
+
* left `revalidatePath` on a long path recorded nowhere.
|
|
174
|
+
*/
|
|
175
|
+
function hashedTag(tag) {
|
|
176
|
+
return `#${(0, cache_utils_1.sha256Hex)(tag)}`;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* The longest tag a sort key spells out; past it, {@link sortKeyTag} hashes
|
|
180
|
+
* it. One cap for every row the tag is in, so a row's writer and reader agree
|
|
181
|
+
* without each working out what else shares its key. It leaves room for the
|
|
182
|
+
* most any row puts beside the tag: a mapping row's `#<buildId>/#<sha256>`,
|
|
183
|
+
* with the build ID capped at `MAX_BUILD_ID_BYTES`.
|
|
184
|
+
*/
|
|
185
|
+
exports.MAX_TAG_BYTES = 768;
|
|
186
|
+
/** `tag` as a sort key spells it: itself, or {@link hashedTag} past {@link MAX_TAG_BYTES}. */
|
|
187
|
+
function sortKeyTag(tag) {
|
|
188
|
+
return Buffer.byteLength(tag) <= exports.MAX_TAG_BYTES ? tag : hashedTag(tag);
|
|
189
|
+
}
|
|
165
190
|
/**
|
|
166
191
|
* The bare-tag marker rows of the revalidation table (`pk = buildId`,
|
|
167
|
-
* `sk = tag
|
|
192
|
+
* `sk = tag`, or {@link hashedTag} past {@link MAX_TAG_BYTES}), which record when a tag
|
|
193
|
+
* was last revalidated and how.
|
|
168
194
|
*
|
|
169
195
|
* The table also holds the incremental cache's `tag#s3Key` mapping rows, which
|
|
170
196
|
* are its own business and stay in `S3CacheHandler`: only the markers mean the
|
|
@@ -192,7 +218,7 @@ class TagMarkerTable {
|
|
|
192
218
|
TableName: this.tableName,
|
|
193
219
|
Key: {
|
|
194
220
|
pk: { S: this.buildId },
|
|
195
|
-
sk: { S: tag },
|
|
221
|
+
sk: { S: sortKeyTag(tag) },
|
|
196
222
|
},
|
|
197
223
|
...markerUpdate(now, durations),
|
|
198
224
|
ReturnValues: "ALL_NEW",
|
|
@@ -211,9 +237,11 @@ class TagMarkerTable {
|
|
|
211
237
|
const unique = Array.from(new Set(tags));
|
|
212
238
|
const markers = new Map();
|
|
213
239
|
for (let i = 0; i < unique.length; i += exports.BATCH_GET_MAX_KEYS) {
|
|
214
|
-
|
|
240
|
+
// A hashed sort key names no tag, so each row is matched back by key.
|
|
241
|
+
const tagBySk = new Map(unique
|
|
215
242
|
.slice(i, i + exports.BATCH_GET_MAX_KEYS)
|
|
216
|
-
.map((tag) => (
|
|
243
|
+
.map((tag) => [sortKeyTag(tag), tag]));
|
|
244
|
+
let keys = Array.from(tagBySk.keys(), (sk) => ({ pk: { S: buildId }, sk: { S: sk } }));
|
|
217
245
|
// `UnprocessedKeys` is DynamoDB declining part of the batch under load;
|
|
218
246
|
// a marker left unread is a revalidation missed, so it is asked again.
|
|
219
247
|
for (let attempt = 0; keys?.length && attempt < 3; attempt++) {
|
|
@@ -226,7 +254,7 @@ class TagMarkerTable {
|
|
|
226
254
|
},
|
|
227
255
|
}));
|
|
228
256
|
for (const item of response.Responses?.[tableName] ?? []) {
|
|
229
|
-
const tag = item.sk?.S;
|
|
257
|
+
const tag = tagBySk.get(item.sk?.S ?? "");
|
|
230
258
|
if (tag !== undefined) {
|
|
231
259
|
markers.set(tag, markerOf(item));
|
|
232
260
|
}
|
|
@@ -257,7 +285,8 @@ const LOG_SK_DIGITS = 15;
|
|
|
257
285
|
/**
|
|
258
286
|
* The revalidation log: one row per tag revalidation (`pk = <buildId>#log`,
|
|
259
287
|
* `sk = <Date.now(), zero-padded>#<tag>`), which expires after
|
|
260
|
-
* {@link REVALIDATION_LOG_TTL_MS}.
|
|
288
|
+
* {@link REVALIDATION_LOG_TTL_MS}. A tag past {@link MAX_TAG_BYTES} is
|
|
289
|
+
* {@link hashedTag} there, and spelled out in the row's `longTag` instead.
|
|
261
290
|
*
|
|
262
291
|
* The marker rows stay the source of truth. The log exists so an instance
|
|
263
292
|
* can ask "what was revalidated since I last looked?" in one `Query`, instead
|
|
@@ -288,11 +317,13 @@ class RevalidationLog {
|
|
|
288
317
|
* to {@link LOG_PUT_ATTEMPTS} times.
|
|
289
318
|
*/
|
|
290
319
|
async put(tag, at, marker) {
|
|
320
|
+
const skTag = sortKeyTag(tag);
|
|
291
321
|
for (let attempt = 1;; attempt++) {
|
|
292
322
|
const item = {
|
|
293
323
|
pk: { S: this.pk },
|
|
294
|
-
sk: { S: `${logSkPrefix(at)}#${
|
|
324
|
+
sk: { S: `${logSkPrefix(at)}#${skTag}` },
|
|
295
325
|
ttl: { N: String(Math.ceil((at + exports.REVALIDATION_LOG_TTL_MS) / 1000)) },
|
|
326
|
+
...(skTag !== tag && { longTag: { S: tag } }),
|
|
296
327
|
};
|
|
297
328
|
for (const field of MARKER_FIELDS) {
|
|
298
329
|
const value = marker[field];
|
|
@@ -337,7 +368,7 @@ class RevalidationLog {
|
|
|
337
368
|
":pk": { S: this.pk },
|
|
338
369
|
":since": { S: logSkPrefix(Math.max(0, since)) },
|
|
339
370
|
},
|
|
340
|
-
ProjectionExpression: "sk, revalidatedAt, staleAt, expiredAt",
|
|
371
|
+
ProjectionExpression: "sk, longTag, revalidatedAt, staleAt, expiredAt",
|
|
341
372
|
ExclusiveStartKey: startKey,
|
|
342
373
|
}));
|
|
343
374
|
for (const item of response.Items ?? []) {
|
|
@@ -350,7 +381,7 @@ class RevalidationLog {
|
|
|
350
381
|
rows.push({
|
|
351
382
|
sk,
|
|
352
383
|
at: Number(sk.slice(0, LOG_SK_DIGITS)),
|
|
353
|
-
tag: sk.slice(LOG_SK_DIGITS + 1),
|
|
384
|
+
tag: item.longTag?.S ?? sk.slice(LOG_SK_DIGITS + 1),
|
|
354
385
|
marker: markerOf(item),
|
|
355
386
|
});
|
|
356
387
|
}
|
|
@@ -1001,4 +1032,4 @@ class CacheBucket {
|
|
|
1001
1032
|
}
|
|
1002
1033
|
}
|
|
1003
1034
|
exports.CacheBucket = CacheBucket;
|
|
1004
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWNhY2hlLXN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FkYXB0ZXIvYXdzLWNhY2hlLXN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQThDQSxzREFPQztBQVNELGdDQVFDO0FBa0JELHNDQUVDO0FBcUNELGtDQWdCQztBQVdELGtDQUVDO0FBV0QsOEJBV0M7QUFRRCxrQ0FXQztBQUdELG9DQWVDO0FBdzVCRCxvQ0FvQkM7QUFub0NEOzs7Ozs7Ozs7RUFTRTtBQUNGLHNEQUFzRDtBQUN0RCx5Q0FBaUM7QUFDakMsOERBU2tDO0FBQ2xDLGtEQUs0QjtBQWtCNUIsOENBQThDO0FBQzlDLFNBQWdCLHFCQUFxQjtJQUNuQyxPQUFPO1FBQ0wsVUFBVSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLElBQUksRUFBRTtRQUMxRCxTQUFTLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQ0FBa0MsSUFBSSxFQUFFO1FBQy9ELE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxXQUFXO1FBQzdDLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixJQUFJLEVBQUU7S0FDL0MsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixVQUFVLENBQUMsT0FBZSxFQUFFLFFBQWdCO0lBQzFELElBQUksYUFBYSxHQUFHLFFBQVEsQ0FBQztJQUM3QixJQUFJLFFBQVEsS0FBSyxHQUFHLElBQUksUUFBUSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ3hDLGFBQWEsR0FBRyxPQUFPLENBQUM7SUFDMUIsQ0FBQztTQUFNLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3BDLGFBQWEsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFDRCxPQUFPLElBQUEsZ0JBQUksRUFBQyxP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RUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUM1RCxDQUFDO1lBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDbkIsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztZQUNELE9BQU8sTUFBTSxRQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxLQUFLLFlBQVkscUJBQVMsRUFBRSxDQUFDO2dCQUMvQixPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDO1lBQ0QsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVELDhDQUE4QztJQUM5QyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQVcsRUFBRSxJQUFZO1FBQ3JDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3BCLElBQUksNEJBQWdCLENBQUM7WUFDbkIsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQ3ZCLEdBQUcsRUFBRSxHQUFHO1lBQ1IsSUFBSSxFQUFFLElBQUk7WUFDVixXQUFXLEVBQUUsaUNBQWlDO1NBQy9DLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBdkNELGtDQXVDQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gIFRoZSBTMyAvIER5bmFtb0RCIHBsdW1iaW5nIHNoYXJlZCBieSBldmVyeSBjZGstbmV4dGpzIGNhY2hlIGhhbmRsZXI6IHRoZVxuICBpbmNyZW1lbnRhbCBgY2FjaGVIYW5kbGVyYCAoYFMzQ2FjaGVIYW5kbGVyYCkgYW5kIHRoZSBgY2FjaGVIYW5kbGVyc2AgZm9yXG4gIGAndXNlIGNhY2hlJ2AgLyBgJ3VzZSBjYWNoZTogcmVtb3RlJ2AuXG5cbiAgV2hhdCBsaXZlcyBoZXJlIGlzIHdoYXQgaGFzIHRvIGFncmVlIGJldHdlZW4gdGhlbSAtIHdoZXJlIHRoZSBjb25maWd1cmF0aW9uXG4gIGNvbWVzIGZyb20sIGhvdyBhIGNhY2hlIGtleSBiZWNvbWVzIGFuIFMzIGtleSwgYW5kIHdoYXQgYSB0YWcncyBtYXJrZXIgcm93IGluXG4gIHRoZSByZXZhbGlkYXRpb24gdGFibGUgbG9va3MgbGlrZSBhbmQgbWVhbnMuIEEgYHJldmFsaWRhdGVUYWdgIHJlYWNoZXMgYm90aFxuICBraW5kcyBvZiBoYW5kbGVyLCBhbmQgdGhleSBtdXN0IHJlYWQgZWFjaCBvdGhlcidzIG1hcmtlcnMgdGhlIHNhbWUgd2F5LlxuKi9cbi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7XG4gIEF0dHJpYnV0ZVZhbHVlLFxuICBCYXRjaEdldEl0ZW1Db21tYW5kLFxuICBCYXRjaEdldEl0ZW1Db21tYW5kT3V0cHV0LFxuICBEeW5hbW9EQkNsaWVudCxcbiAgUHV0SXRlbUNvbW1hbmQsXG4gIFF1ZXJ5Q29tbWFuZCxcbiAgUXVlcnlDb21tYW5kT3V0cHV0LFxuICBVcGRhdGVJdGVtQ29tbWFuZCxcbn0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1keW5hbW9kYlwiO1xuaW1wb3J0IHtcbiAgR2V0T2JqZWN0Q29tbWFuZCxcbiAgTm9TdWNoS2V5LFxuICBQdXRPYmplY3RDb21tYW5kLFxuICBTM0NsaWVudCxcbn0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1zM1wiO1xuXG4vKipcbiAqIFdoZXJlIHRoZSBjYWNoZSBsaXZlcywgYXMgdGhlIGNvbnN0cnVjdHMgcGFzcyBpdCB0byB0aGUgY29tcHV0ZSB0aHJvdWdoIHRoZVxuICogZW52aXJvbm1lbnQgKGBOZXh0anNGdW5jdGlvbnNgLCBgTmV4dGpzQ29udGFpbmVyc2ApLiBFbXB0eSBzdHJpbmdzIGZvciB3aGF0IGlzXG4gKiBub3QgY29uZmlndXJlZCwgd2hpY2ggZWFjaCBoYW5kbGVyIHJlYWRzIGFzIFwidGhhdCBsYXllciBpcyBkaXNhYmxlZFwiLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF3c0NhY2hlQ29uZmlnIHtcbiAgLyoqIGBDREtfTkVYVEpTX0NBQ0hFX0JVQ0tFVF9OQU1FYC4gKi9cbiAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAvKiogYENES19ORVhUSlNfUkVWQUxJREFUSU9OX1RBQkxFX05BTUVgLiAqL1xuICB0YWJsZU5hbWU6IHN0cmluZztcbiAgLyoqIGBBV1NfUkVHSU9OYCwgYHVzLWVhc3QtMWAgd2hlbiB1bnNldC4gKi9cbiAgcmVnaW9uOiBzdHJpbmc7XG4gIC8qKiBgQ0RLX05FWFRKU19CVUlMRF9JRGA6IGV2ZXJ5IFMzIGtleSBhbmQgZXZlcnkgbWFya2VyIHJvdyBpcyBzY29wZWQgdG8gaXQuICovXG4gIGJ1aWxkSWQ6IHN0cmluZztcbn1cblxuLyoqIFRoZSBjb25maWd1cmF0aW9uIGZyb20gdGhlIGVudmlyb25tZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVBd3NDYWNoZUNvbmZpZygpOiBBd3NDYWNoZUNvbmZpZyB7XG4gIHJldHVybiB7XG4gICAgYnVja2V0TmFtZTogcHJvY2Vzcy5lbnYuQ0RLX05FWFRKU19DQUNIRV9CVUNLRVRfTkFNRSB8fCBcIlwiLFxuICAgIHRhYmxlTmFtZTogcHJvY2Vzcy5lbnYuQ0RLX05FWFRKU19SRVZBTElEQVRJT05fVEFCTEVfTkFNRSB8fCBcIlwiLFxuICAgIHJlZ2lvbjogcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTiB8fCBcInVzLWVhc3QtMVwiLFxuICAgIGJ1aWxkSWQ6IHByb2Nlc3MuZW52LkNES19ORVhUSlNfQlVJTERfSUQgfHwgXCJcIixcbiAgfTtcbn1cblxuLyoqXG4gKiBge2J1aWxkSWR9L3tjYWNoZUtleX0uanNvbmAsIHRoZSBpbmNyZW1lbnRhbCBjYWNoZSdzIGtleSBjb252ZW50aW9uLlxuICpcbiAqIFRoZSByb290IHBhdGggYmVjb21lcyBgaW5kZXhgLCBhbmQgYSBsZWFkaW5nIHNsYXNoIGlzIGRyb3BwZWQgc28gdGhlcmUgaXMgbm9cbiAqIGVtcHR5IGZvbGRlciB1bmRlciB0aGUgYnVpbGQgcHJlZml4LiBFdmVyeXRoaW5nIHRoaXMgcmV0dXJucyBlbmRzIGluIGAuanNvbmAsXG4gKiB3aGljaCBpcyB3aGF0IGtlZXBzIGl0IGRpc2pvaW50IGZyb20ge0BsaW5rIHVzZUNhY2hlUzNLZXl9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTM0tleShidWlsZElkOiBzdHJpbmcsIGNhY2hlS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgY2xlYW5DYWNoZUtleSA9IGNhY2hlS2V5O1xuICBpZiAoY2FjaGVLZXkgPT09IFwiL1wiIHx8IGNhY2hlS2V5ID09PSBcIlwiKSB7XG4gICAgY2xlYW5DYWNoZUtleSA9IFwiaW5kZXhcIjtcbiAgfSBlbHNlIGlmIChjYWNoZUtleS5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgIGNsZWFuQ2FjaGVLZXkgPSBjYWNoZUtleS5zbGljZSgxKTtcbiAgfVxuICByZXR1cm4gam9pbihidWlsZElkLCBgJHtjbGVhbkNhY2hlS2V5fS5qc29uYCk7XG59XG5cbi8qKlxuICogVGhlIGZvbGRlciB1bmRlciB0aGUgYnVpbGQgcHJlZml4IHRoYXQgYCd1c2UgY2FjaGUnYCBlbnRyaWVzIGFyZSBzdG9yZWQgaW4uXG4gKiBAc2VlIHVzZUNhY2hlUzNLZXlcbiAqL1xuZXhwb3J0IGNvbnN0IFVTRV9DQUNIRV9LRVlfUFJFRklYID0gXCJfdXNlLWNhY2hlXCI7XG5cbi8qKlxuICogYHtidWlsZElkfS9fdXNlLWNhY2hlL3toYXNofS5lbnRyeWAsIHdoZXJlIGEgYGNhY2hlSGFuZGxlcnNgIGVudHJ5IGlzIHN0b3JlZC5cbiAqXG4gKiBIYXNoZWQgYmVjYXVzZSBhIGAndXNlIGNhY2hlJ2Aga2V5IGlzIHRoZSBzZXJpYWxpemVkIGFyZ3VtZW50cyBvZiB0aGUgY2FsbCBhbmRcbiAqIGhhcyBubyBsZW5ndGggbGltaXQsIHdoZXJlIGFuIFMzIGtleSBzdG9wcyBhdCAxMDI0IGJ5dGVzLiBUaGUgYC5lbnRyeWAgc3VmZml4XG4gKiByYXRoZXIgdGhhbiBgLmpzb25gIGlzIHdoYXQgbWFrZXMgYSBjb2xsaXNpb24gd2l0aCB0aGUgaW5jcmVtZW50YWwgY2FjaGVcbiAqIGltcG9zc2libGUgcmF0aGVyIHRoYW4gdW5saWtlbHk6IGV2ZXJ5IGtleSB7QGxpbmsgYnVpbGRTM0tleX0gd3JpdGVzIGVuZHMgaW5cbiAqIGAuanNvbmAsIGluY2x1ZGluZyBvbmUgZm9yIGEgcm91dGUgdGhhdCBoYXBwZW5zIHRvIGJlIG5hbWVkIGAvX3VzZS1jYWNoZS/igKZgLlxuICogU3RpbGwgdW5kZXIgdGhlIGJ1aWxkIHByZWZpeCwgc28gcG9zdC1kZXBsb3kgcHJ1bmluZyBkcm9wcyB0aGVtIHdpdGggdGhlIGJ1aWxkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQ2FjaGVTM0tleShidWlsZElkOiBzdHJpbmcsIGtleUhhc2g6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBqb2luKGJ1aWxkSWQsIFVTRV9DQUNIRV9LRVlfUFJFRklYLCBgJHtrZXlIYXNofS5lbnRyeWApO1xufVxuXG4vKipcbiAqIFRoZSBgZHVyYXRpb25zYCBOZXh0LmpzIDE2IHBhc3NlcyBhIHRhZyByZXZhbGlkYXRpb24gZm9yIGEgcHJvZmlsZTpcbiAqIGByZXZhbGlkYXRlVGFnKFwicG9zdHNcIiwgXCJtYXhcIilgIGFycml2ZXMgYXMgYHsgZXhwaXJlOiA8dGhlIHByb2ZpbGUncyBleHBpcmU+IH1gLlxuICogQWJzZW50IGZvciBgdXBkYXRlVGFnYCBhbmQgYSBiYXJlIGByZXZhbGlkYXRlVGFnYCwgd2hpY2ggZXhwaXJlIGltbWVkaWF0ZWx5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldmFsaWRhdGVEdXJhdGlvbnMge1xuICBleHBpcmU/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQSB0YWcncyBtYXJrZXIgcm93LCBhcyB0aW1lc3RhbXBzIGluIG1pbGxpc2Vjb25kcy4gV3JpdHRlbiBieVxuICoge0BsaW5rIG1hcmtlclVwZGF0ZX07IGVhY2ggZmllbGQgaXMgYWJzZW50IHVudGlsIGEgcmV2YWxpZGF0aW9uIG9mIHRoYXQgc2hhcGVcbiAqIGhhcyBoYXBwZW5lZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYWdNYXJrZXIge1xuICAvKiogRXhwaXJlZCBvdXRyaWdodDogYHVwZGF0ZVRhZ2AsIG9yIGByZXZhbGlkYXRlVGFnYCB3aXRoIG5vIHByb2ZpbGUuICovXG4gIHJldmFsaWRhdGVkQXQ/OiBudW1iZXI7XG4gIC8qKiBTdGFsZSBmcm9tIGhlcmU6IGByZXZhbGlkYXRlVGFnKHRhZywgcHJvZmlsZSlgLiAqL1xuICBzdGFsZUF0PzogbnVtYmVyO1xuICAvKiogV2hlbiB0aGUgcHJvZmlsZSdzIGBleHBpcmVgIHJ1bnMgb3V0LCB3aGljaCBtYXkgYmUgaW4gdGhlIGZ1dHVyZS4gKi9cbiAgZXhwaXJlZEF0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFdoYXQgdGhlIHRhZyBtYXJrZXJzIHNheSBhYm91dCBhbiBlbnRyeTogdW50b3VjaGVkLCBzZXJ2ZWQgc3RhbGUgd2hpbGUgYVxuICogYmFja2dyb3VuZCByZW5kZXIgcmVwbGFjZXMgaXQsIG9yIGV4cGlyZWQgYW5kIHJlLXJlbmRlcmVkIGJlZm9yZSBhbnN3ZXJpbmcuXG4gKi9cbmV4cG9ydCB0eXBlIFJldmFsaWRhdGlvblN0YXRlID0gXCJmcmVzaFwiIHwgXCJzdGFsZVwiIHwgXCJleHBpcmVkXCI7XG5cbi8qKlxuICogV2hhdCBgbWFya2VyYCBtZWFucyBmb3IgYW4gZW50cnkgY3JlYXRlZCBhdCBgY3JlYXRlZEF0YCwgYXQgYG5vd2AuXG4gKlxuICogYGV4cGlyZWRBdGAgaW4gdGhlIGZ1dHVyZSBpcyBhIHByb2ZpbGUncyBgZXhwaXJlYCB0aGF0IGhhcyBub3QgY29tZSB5ZXQsXG4gKiBjb21wYXJlZCB0aGUgd2F5IE5leHQuanMncyBgYXJlVGFnc0V4cGlyZWRgIGRvZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrZXJTdGF0ZShcbiAgbWFya2VyOiBUYWdNYXJrZXIsXG4gIGNyZWF0ZWRBdDogbnVtYmVyLFxuICBub3c6IG51bWJlcixcbik6IFJldmFsaWRhdGlvblN0YXRlIHtcbiAgY29uc3QgeyByZXZhbGlkYXRlZEF0LCBleHBpcmVkQXQsIHN0YWxlQXQgfSA9IG1hcmtlcjtcbiAgaWYgKFxuICAgIChyZXZhbGlkYXRlZEF0ICE9PSB1bmRlZmluZWQgJiYgcmV2YWxpZGF0ZWRBdCA+IGNyZWF0ZWRBdCkgfHxcbiAgICAoZXhwaXJlZEF0ICE9PSB1bmRlZmluZWQgJiYgZXhwaXJlZEF0IDw9IG5vdyAmJiBleHBpcmVkQXQgPiBjcmVhdGVkQXQpXG4gICkge1xuICAgIHJldHVybiBcImV4cGlyZWRcIjtcbiAgfVxuICBpZiAoc3RhbGVBdCAhPT0gdW5kZWZpbmVkICYmIHN0YWxlQXQgPiBjcmVhdGVkQXQpIHtcbiAgICByZXR1cm4gXCJzdGFsZVwiO1xuICB9XG4gIHJldHVybiBcImZyZXNoXCI7XG59XG5cbi8qKlxuICogVGhlIGNsb2NrIGV2ZXJ5IHRhZyBtYXJrZXIgaXMgc3RhbXBlZCB3aXRoLCBhbmQgZXZlcnkgZW50cnkgdGltZXN0YW1wIGl0IGlzXG4gKiBjb21wYXJlZCBhZ2FpbnN0OiB0aGUgb25lIE5leHQuanMgc3RhbXBzIGBDYWNoZUVudHJ5LnRpbWVzdGFtcGAgd2l0aFxuICogKGBwZXJmb3JtYW5jZS50aW1lT3JpZ2luICsgcGVyZm9ybWFuY2Uubm93KClgLCBpbiBgdXNlLWNhY2hlLXdyYXBwZXIuanNgIGFuZFxuICogdGhlIGRlZmF1bHQgaGFuZGxlciksIHJhdGhlciB0aGFuIGBEYXRlLm5vdygpYC4gQm90aCBoYW5kbGVycyB3cml0ZSB0aGUgc2FtZVxuICogbWFya2VyIHJvd3MsIHNvIGJvdGggaGF2ZSB0byB1c2UgaXQ6IHR3byBjbG9ja3Mgb24gb25lIHJvdyBsZXQgdGhlIGxhc3Qgd3JpdGVyXG4gKiBkZWNpZGUgd2hpY2ggY2xvY2sgdGhlIG90aGVycyBjb21wYXJlIGFnYWluc3QsIGFuZCB0aGV5IGRyaWZ0IGFwYXJ0IGZvciBhc1xuICogbG9uZyBhcyBhIExhbWJkYSBzYW5kYm94IG9yIEZhcmdhdGUgdGFzayBsaXZlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtlckNsb2NrKCk6IG51bWJlciB7XG4gIHJldHVybiBwZXJmb3JtYW5jZS50aW1lT3JpZ2luICsgcGVyZm9ybWFuY2Uubm93KCk7XG59XG5cbi8qKlxuICogVGhlIG1hcmtlciBmaWVsZHMgYSB0YWcgcmV2YWxpZGF0ZWQgYXQgYG5vd2Agc2V0cy5cbiAqXG4gKiBXaXRob3V0IGBkdXJhdGlvbnNgIC0gYHVwZGF0ZVRhZ2AsIG9yIGByZXZhbGlkYXRlVGFnYCB3aXRoIG5vIHByb2ZpbGUgLSB0aGVcbiAqIHRhZydzIGVudHJpZXMgZXhwaXJlIGltbWVkaWF0ZWx5IChgcmV2YWxpZGF0ZWRBdGApLiBXaXRoIHRoZW0gdGhlIGVudHJpZXMgZ29cbiAqIHN0YWxlIG5vdyBhbmQgZXhwaXJlIGFmdGVyIHRoZSBwcm9maWxlJ3MgYGV4cGlyZWAsIHRoZSBzYW1lIHBhaXIgb2ZcbiAqIHRpbWVzdGFtcHMgTmV4dC5qcydzIGBGaWxlU3lzdGVtQ2FjaGUucmV2YWxpZGF0ZVRhZ2AgcmVjb3Jkcy4gQSBwcm9maWxlIHdpdGhcbiAqIG5vIGBleHBpcmVgIHNldHMgb25seSBgc3RhbGVBdGAsIGFuZCB3aGF0ZXZlciBgZXhwaXJlZEF0YCB0aGUgdGFnIGhhZCBzdGF5cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtlckZvcihcbiAgbm93OiBudW1iZXIsXG4gIGR1cmF0aW9uczogUmV2YWxpZGF0ZUR1cmF0aW9ucyB8IHVuZGVmaW5lZCxcbik6IFRhZ01hcmtlciB7XG4gIGlmICghZHVyYXRpb25zKSB7XG4gICAgcmV0dXJuIHsgcmV2YWxpZGF0ZWRBdDogbm93IH07XG4gIH1cbiAgaWYgKGR1cmF0aW9ucy5leHBpcmUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB7IHN0YWxlQXQ6IG5vdyB9O1xuICB9XG4gIHJldHVybiB7IHN0YWxlQXQ6IG5vdywgZXhwaXJlZEF0OiBub3cgKyBkdXJhdGlvbnMuZXhwaXJlICogMTAwMCB9O1xufVxuXG5jb25zdCBNQVJLRVJfRklFTERTID0gW1wicmV2YWxpZGF0ZWRBdFwiLCBcInN0YWxlQXRcIiwgXCJleHBpcmVkQXRcIl0gYXMgY29uc3Q7XG5cbi8qKlxuICogYGV4aXN0aW5nYCB3aXRoIHRoZSBmaWVsZHMgYHVwZGF0ZWAgc2V0cywgYXMgYSB7QGxpbmsgbWFya2VyVXBkYXRlfSBsZWF2ZXNcbiAqIHRoZSByb3c6IGEgZmllbGQgYHVwZGF0ZWAgZG9lcyBub3Qgc2V0IGtlZXBzIGl0cyB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TWFya2VyKFxuICBleGlzdGluZzogVGFnTWFya2VyIHwgdW5kZWZpbmVkLFxuICB1cGRhdGU6IFRhZ01hcmtlcixcbik6IFRhZ01hcmtlciB7XG4gIGNvbnN0IG1hcmtlciA9IHsgLi4uZXhpc3RpbmcgfTtcbiAgZm9yIChjb25zdCBmaWVsZCBvZiBNQVJLRVJfRklFTERTKSB7XG4gICAgaWYgKHVwZGF0ZVtmaWVsZF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgbWFya2VyW2ZpZWxkXSA9IHVwZGF0ZVtmaWVsZF07XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXJrZXI7XG59XG5cbi8qKiBUaGUgbWFya2VyLXJvdyB1cGRhdGUgdGhhdCBzZXRzIHtAbGluayBtYXJrZXJGb3J9J3MgZmllbGRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtlclVwZGF0ZShcbiAgbm93OiBudW1iZXIsXG4gIGR1cmF0aW9uczogUmV2YWxpZGF0ZUR1cmF0aW9ucyB8IHVuZGVmaW5lZCxcbik6IFBpY2s8XG4gIENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgVXBkYXRlSXRlbUNvbW1hbmQ+WzBdLFxuICBcIlVwZGF0ZUV4cHJlc3Npb25cIiB8IFwiRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlc1wiXG4+IHtcbiAgY29uc3QgbWFya2VyID0gbWFya2VyRm9yKG5vdywgZHVyYXRpb25zKTtcbiAgY29uc3QgZmllbGRzID0gTUFSS0VSX0ZJRUxEUy5maWx0ZXIoKGZpZWxkKSA9PiBtYXJrZXJbZmllbGRdICE9PSB1bmRlZmluZWQpO1xuICByZXR1cm4ge1xuICAgIFVwZGF0ZUV4cHJlc3Npb246IGBTRVQgJHtmaWVsZHMubWFwKChmaWVsZCkgPT4gYCR7ZmllbGR9ID0gOiR7ZmllbGR9YCkuam9pbihcIiwgXCIpfWAsXG4gICAgRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgZmllbGRzLm1hcCgoZmllbGQpID0+IFtgOiR7ZmllbGR9YCwgeyBOOiBTdHJpbmcobWFya2VyW2ZpZWxkXSkgfV0pLFxuICAgICksXG4gIH07XG59XG5cbi8qKiBBIER5bmFtb0RCIG51bWJlciBhdHRyaWJ1dGUgYXMgYSBudW1iZXIsIG9yIGB1bmRlZmluZWRgIHdoZW4gYWJzZW50LiAqL1xuZnVuY3Rpb24gbnVtYmVyQXR0cmlidXRlKFxuICB2YWx1ZTogQXR0cmlidXRlVmFsdWUgfCB1bmRlZmluZWQsXG4pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdmFsdWU/Lk4gPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IE51bWJlcih2YWx1ZS5OKTtcbn1cblxuLyoqIFRoZSBtYXJrZXIgZmllbGRzIG9mIGEgbWFya2VyIG9yIGxvZyByb3cuICovXG5mdW5jdGlvbiBtYXJrZXJPZihpdGVtOiBSZWNvcmQ8c3RyaW5nLCBBdHRyaWJ1dGVWYWx1ZT4pOiBUYWdNYXJrZXIge1xuICByZXR1cm4ge1xuICAgIHJldmFsaWRhdGVkQXQ6IG51bWJlckF0dHJpYnV0ZShpdGVtLnJldmFsaWRhdGVkQXQpLFxuICAgIHN0YWxlQXQ6IG51bWJlckF0dHJpYnV0ZShpdGVtLnN0YWxlQXQpLFxuICAgIGV4cGlyZWRBdDogbnVtYmVyQXR0cmlidXRlKGl0ZW0uZXhwaXJlZEF0KSxcbiAgfTtcbn1cblxuLyoqIER5bmFtb0RCJ3MgY2FwIG9uIGtleXMgaW4gb25lIGBCYXRjaEdldEl0ZW1gLiAqL1xuZXhwb3J0IGNvbnN0IEJBVENIX0dFVF9NQVhfS0VZUyA9IDEwMDtcblxuLyoqXG4gKiBIb3cgb2Z0ZW4sIGF0IG1vc3QsIGFuIGluc3RhbmNlIGNhdGNoZXMgdXAgb24gcmV2YWxpZGF0aW9ucyBvdGhlciBpbnN0YW5jZXNcbiAqIHJhbiwgdW5sZXNzIGBDREtfTkVYVEpTX1RBR19SRUZSRVNIX01TYCBzYXlzIG90aGVyd2lzZTogdGhlIHN0YWxlbmVzcyB3aW5kb3dcbiAqIGZvciBhIGByZXZhbGlkYXRlVGFnYCBydW4gZWxzZXdoZXJlLiBFdmVyeSBjYWNoZSBoaXQgY2hlY2tzIGl0cyB0YWdzJ1xuICogbWFya2VycywgYW5kIGV2ZXJ5IG1hcmtlciBvZiBhIGRlcGxveW1lbnQgc2hhcmVzIG9uZSBwYXJ0aXRpb24ga2V5LCBzb1xuICogcmVhZGluZyB0aGVtIHBlciByZXF1ZXN0IGNhcHBlZCBhIHJvdXRlJ3MgY2FjaGUgaGl0cyBhdCB0aGUgcGFydGl0aW9uJ3MgcmVhZFxuICogdGhyb3VnaHB1dCAofjEsOTAwIHJlcS9zIG9uIE5leHRqc1JlZ2lvbmFsRnVuY3Rpb25zKS4gT25jZSBhIHNlY29uZCwgZnJvbSB0aGVcbiAqIHJldmFsaWRhdGlvbiBsb2csIHRoZSByZWFkcyBzY2FsZSB3aXRoIGluc3RhbmNlcyBpbnN0ZWFkIG9mIHJlcXVlc3RzIG9yIHRhZ3MuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RBR19SRUZSRVNIX01TID0gMTAwMDtcblxuLyoqXG4gKiBUaGUgYmFyZS10YWcgbWFya2VyIHJvd3Mgb2YgdGhlIHJldmFsaWRhdGlvbiB0YWJsZSAoYHBrID0gYnVpbGRJZGAsXG4gKiBgc2sgPSB0YWdgKSwgd2hpY2ggcmVjb3JkIHdoZW4gYSB0YWcgd2FzIGxhc3QgcmV2YWxpZGF0ZWQgYW5kIGhvdy5cbiAqXG4gKiBUaGUgdGFibGUgYWxzbyBob2xkcyB0aGUgaW5jcmVtZW50YWwgY2FjaGUncyBgdGFnI3MzS2V5YCBtYXBwaW5nIHJvd3MsIHdoaWNoXG4gKiBhcmUgaXRzIG93biBidXNpbmVzcyBhbmQgc3RheSBpbiBgUzNDYWNoZUhhbmRsZXJgOiBvbmx5IHRoZSBtYXJrZXJzIG1lYW4gdGhlXG4gKiBzYW1lIHRoaW5nIHRvIGV2ZXJ5IGhhbmRsZXIuIFdoYXQgYW4gaW5zdGFuY2Uga2VlcHMgb2YgdGhlbSBiZXR3ZWVuIHJlYWRzIGlzXG4gKiB7QGxpbmsgVHJhY2tlZFRhZ01hcmtlcnN9LlxuICovXG5leHBvcnQgY2xhc3MgVGFnTWFya2VyVGFibGUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudDogRHluYW1vREJDbGllbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJ1aWxkSWQ6IHN0cmluZyxcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgYHRhZ2AncyByZXZhbGlkYXRpb24gYXQgYG5vd2AuIFNlZSB7QGxpbmsgbWFya2VyVXBkYXRlfS5cbiAgICpcbiAgICogUmV0dXJucyB0aGUgcm93IGFzIHRoaXMgd3JpdGUgbGVmdCBpdCwgc28gdGhlIGluc3RhbmNlIHRoYXQgd3JvdGUgaXQgY2FuXG4gICAqIHRyYWNrIGl0IHJhdGhlciB0aGFuIHJlYWQgaXQgYmFjazogcmVhZHMgYXJlIGV2ZW50dWFsbHkgY29uc2lzdGVudCwgYW5kIGFcbiAgICogcmVhZC1iYWNrIHJhY2luZyByZXBsaWNhdGlvbiBjb3VsZCByZXR1cm4gdGhlIG1hcmtlciBmcm9tIGJlZm9yZSB0aGUgd3JpdGUuXG4gICAqL1xuICBhc3luYyB3cml0ZShcbiAgICB0YWc6IHN0cmluZyxcbiAgICBub3c6IG51bWJlcixcbiAgICBkdXJhdGlvbnM6IFJldmFsaWRhdGVEdXJhdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8VGFnTWFya2VyIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKFxuICAgICAgbmV3IFVwZGF0ZUl0ZW1Db21tYW5kKHtcbiAgICAgICAgVGFibGVOYW1lOiB0aGlzLnRhYmxlTmFtZSxcbiAgICAgICAgS2V5OiB7XG4gICAgICAgICAgcGs6IHsgUzogdGhpcy5idWlsZElkIH0sXG4gICAgICAgICAgc2s6IHsgUzogdGFnIH0sXG4gICAgICAgIH0sXG4gICAgICAgIC4uLm1hcmtlclVwZGF0ZShub3csIGR1cmF0aW9ucyksXG4gICAgICAgIFJldHVyblZhbHVlczogXCJBTExfTkVXXCIsXG4gICAgICB9KSxcbiAgICApO1xuICAgIHJldHVybiByZXNwb25zZT8uQXR0cmlidXRlcyA/IG1hcmtlck9mKHJlc3BvbnNlLkF0dHJpYnV0ZXMpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtYXJrZXIgcm93cyBmb3IgYHRhZ3NgIHRoYXQgZXhpc3QsIGJ5IHRhZywgaW4gb25lIGBCYXRjaEdldEl0ZW1gIHBlclxuICAgKiB7QGxpbmsgQkFUQ0hfR0VUX01BWF9LRVlTfSB0YWdzIHJhdGhlciB0aGFuIGEgYEdldEl0ZW1gIGVhY2g6IGEgcGFnZVxuICAgKiBjYXJyaWVzIGl0cyB3aG9sZSBpbXBsaWNpdCBgX05fVF8v4oCmYCBjaGFpbiBwbHVzIHRoZSBhcHAncyBvd24gdGFncywgYVxuICAgKiBwYWdlIHdpdGggYSBmZXcgZmV0Y2hlcyBjaGVja3MgZWFjaCBvZiB0aGVtIHRvbywgYW5kIGV2ZXJ5IG9uZSBpcyBvbiB0aGVcbiAgICogcmVxdWVzdCBwYXRoLiBBIHRhZyB3aXRoIG5vIHJvdyBpcyBhYnNlbnQgZnJvbSB0aGUgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgcmVhZCh0YWdzOiBzdHJpbmdbXSk6IFByb21pc2U8TWFwPHN0cmluZywgVGFnTWFya2VyPj4ge1xuICAgIGNvbnN0IHsgdGFibGVOYW1lLCBidWlsZElkIH0gPSB0aGlzO1xuICAgIGNvbnN0IHVuaXF1ZSA9IEFycmF5LmZyb20obmV3IFNldCh0YWdzKSk7XG4gICAgY29uc3QgbWFya2VycyA9IG5ldyBNYXA8c3RyaW5nLCBUYWdNYXJrZXI+KCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVuaXF1ZS5sZW5ndGg7IGkgKz0gQkFUQ0hfR0VUX01BWF9LRVlTKSB7XG4gICAgICBsZXQga2V5czogUmVjb3JkPHN0cmluZywgQXR0cmlidXRlVmFsdWU+W10gfCB1bmRlZmluZWQgPSB1bmlxdWVcbiAgICAgICAgLnNsaWNlKGksIGkgKyBCQVRDSF9HRVRfTUFYX0tFWVMpXG4gICAgICAgIC5tYXAoKHRhZykgPT4gKHsgcGs6IHsgUzogYnVpbGRJZCB9LCBzazogeyBTOiB0YWcgfSB9KSk7XG4gICAgICAvLyBgVW5wcm9jZXNzZWRLZXlzYCBpcyBEeW5hbW9EQiBkZWNsaW5pbmcgcGFydCBvZiB0aGUgYmF0Y2ggdW5kZXIgbG9hZDtcbiAgICAgIC8vIGEgbWFya2VyIGxlZnQgdW5yZWFkIGlzIGEgcmV2YWxpZGF0aW9uIG1pc3NlZCwgc28gaXQgaXMgYXNrZWQgYWdhaW4uXG4gICAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsga2V5cz8ubGVuZ3RoICYmIGF0dGVtcHQgPCAzOyBhdHRlbXB0KyspIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2U6IEJhdGNoR2V0SXRlbUNvbW1hbmRPdXRwdXQgPSBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKFxuICAgICAgICAgIG5ldyBCYXRjaEdldEl0ZW1Db21tYW5kKHtcbiAgICAgICAgICAgIFJlcXVlc3RJdGVtczoge1xuICAgICAgICAgICAgICBbdGFibGVOYW1lXToge1xuICAgICAgICAgICAgICAgIEtleXM6IGtleXMsXG4gICAgICAgICAgICAgICAgUHJvamVjdGlvbkV4cHJlc3Npb246IFwic2ssIHJldmFsaWRhdGVkQXQsIHN0YWxlQXQsIGV4cGlyZWRBdFwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHJlc3BvbnNlLlJlc3BvbnNlcz8uW3RhYmxlTmFtZV0gPz8gW10pIHtcbiAgICAgICAgICBjb25zdCB0YWcgPSBpdGVtLnNrPy5TO1xuICAgICAgICAgIGlmICh0YWcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbWFya2Vycy5zZXQodGFnLCBtYXJrZXJPZihpdGVtKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGtleXMgPSByZXNwb25zZS5VbnByb2Nlc3NlZEtleXM/Llt0YWJsZU5hbWVdPy5LZXlzO1xuICAgICAgfVxuICAgICAgaWYgKGtleXM/Lmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYER5bmFtb0RCIGxlZnQgJHtrZXlzLmxlbmd0aH0gdGFnIG1hcmtlcnMgdW5yZWFkIGFmdGVyIHJldHJ5aW5nYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hcmtlcnM7XG4gIH1cbn1cblxuLyoqXG4gKiBIb3cgbG9uZyBhIHJldmFsaWRhdGlvbiBsb2cgcm93IGlzIGtlcHQgKGB0dGxgLCBlcG9jaCBzZWNvbmRzKS4gRHluYW1vREIgbmV2ZXJcbiAqIGRlbGV0ZXMgYW4gaXRlbSBiZWZvcmUgaXRzIFRUTCwgb25seSBzb21lIHRpbWUgYWZ0ZXIsIHNvIGEgcmVhZGVyIHRoYXQgbGFzdFxuICogcXVlcmllZCBsZXNzIHRoYW4gdGhpcyBsb25nIGFnbyAobGVzcyBhIG1hcmdpbiBmb3Igd3JpdGVycycgY2xvY2tzKSBpcyBzdXJlXG4gKiB0byBmaW5kIGV2ZXJ5IHJvdyBpdCBoYXMgbm90IHNlZW4geWV0LlxuICovXG5leHBvcnQgY29uc3QgUkVWQUxJREFUSU9OX0xPR19UVExfTVMgPSAxNSAqIDYwICogMTAwMDtcblxuLyoqIFRoZSBtb3N0IGBRdWVyeWAgcGFnZXMgb25lIHtAbGluayBSZXZhbGlkYXRpb25Mb2cucXVlcnl9IHJlYWRzLiAqL1xuZXhwb3J0IGNvbnN0IFJFVkFMSURBVElPTl9MT0dfTUFYX1BBR0VTID0gNTtcblxuLyoqIEhvdyBtYW55IHNvcnQga2V5cyB7QGxpbmsgUmV2YWxpZGF0aW9uTG9nLnB1dH0gdHJpZXMgYmVmb3JlIGdpdmluZyB1cC4gKi9cbmNvbnN0IExPR19QVVRfQVRURU1QVFMgPSA1O1xuXG4vKiogRGlnaXRzIGEgbG9nIHJvdydzIHRpbWVzdGFtcCBpcyB6ZXJvLXBhZGRlZCB0bywgc28gc29ydCBrZXlzIHNvcnQgYnkgdGltZS4gKi9cbmNvbnN0IExPR19TS19ESUdJVFMgPSAxNTtcblxuLyoqIEEgcmV2YWxpZGF0aW9uIHJlYWQgYmFjayBmcm9tIHRoZSBsb2cuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldmFsaWRhdGlvbkxvZ1JvdyB7XG4gIC8qKiBUaGUgcm93J3Mgc29ydCBrZXk6IHVuaXF1ZSBwZXIgcmV2YWxpZGF0aW9uIG9mIGEgdGFnLiAqL1xuICBzazogc3RyaW5nO1xuICAvKiogV2hlbiBpdCB3YXMgd3JpdHRlbiwgb24gdGhlIHdyaXRlcidzIGBEYXRlLm5vdygpYC4gKi9cbiAgYXQ6IG51bWJlcjtcbiAgdGFnOiBzdHJpbmc7XG4gIC8qKiBUaGUgbWFya2VyIGZpZWxkcyB0aGUgcmV2YWxpZGF0aW9uIHNldCwgYXMge0BsaW5rIG1hcmtlckZvcn0gcmV0dXJucyB0aGVtLiAqL1xuICBtYXJrZXI6IFRhZ01hcmtlcjtcbn1cblxuLyoqXG4gKiBUaGUgcmV2YWxpZGF0aW9uIGxvZzogb25lIHJvdyBwZXIgdGFnIHJldmFsaWRhdGlvbiAoYHBrID0gPGJ1aWxkSWQ+I2xvZ2AsXG4gKiBgc2sgPSA8RGF0ZS5ub3coKSwgemVyby1wYWRkZWQ+Izx0YWc+YCksIHdoaWNoIGV4cGlyZXMgYWZ0ZXJcbiAqIHtAbGluayBSRVZBTElEQVRJT05fTE9HX1RUTF9NU30uXG4gKlxuICogVGhlIG1hcmtlciByb3dzIHN0YXkgdGhlIHNvdXJjZSBvZiB0cnV0aC4gVGhlIGxvZyBleGlzdHMgc28gYW4gaW5zdGFuY2VcbiAqIGNhbiBhc2sgXCJ3aGF0IHdhcyByZXZhbGlkYXRlZCBzaW5jZSBJIGxhc3QgbG9va2VkP1wiIGluIG9uZSBgUXVlcnlgLCBpbnN0ZWFkXG4gKiBvZiByZS1yZWFkaW5nIGV2ZXJ5IHRhZyBpdCB0cmFja3MgdG8gZmluZCBvdXQgdGhhdCBhbG1vc3Qgbm9uZSBjaGFuZ2VkLiBFdmVyeVxuICogbWFya2VyIHJvdyBvZiBhIGRlcGxveW1lbnQgc2hhcmVzIG9uZSBwYXJ0aXRpb24sIGFuZCB0aG9zZSByZS1yZWFkcyBmcm9tIGFcbiAqIGhhbmRmdWwgb2YgYnVzeSBpbnN0YW5jZXMgd2VyZSBlbm91Z2ggdG8gdGhyb3R0bGUgaXQuXG4gKlxuICogVGhlIHNvcnQga2V5J3MgdGltZXN0YW1wIGlzIHRoZSB3cml0ZXIncyB3YWxsIGNsb2NrIChgRGF0ZS5ub3coKWApLCBub3QgdGhlXG4gKiBwZXJmb3JtYW5jZSBjbG9jayAoe0BsaW5rIG1hcmtlckNsb2NrfSkgdGhlIG1hcmtlciB2YWx1ZXMgYXJlIHN0YW1wZWQgd2l0aCBieSBib3RoXG4gKiBoYW5kbGVyczogaXQgb25seSBvcmRlcnMgcm93cyBmb3IgcmVhZGVycycgY3Vyc29ycywgd2hpY2ggYXJlIG9uIHRoZWlyIG93blxuICogd2FsbCBjbG9ja3MsIGFuZCBpcyBuZXZlciBjb21wYXJlZCB3aXRoIGFuIGVudHJ5J3MgdGltZXN0YW1wLlxuICovXG5leHBvcnQgY2xhc3MgUmV2YWxpZGF0aW9uTG9nIHtcbiAgcHJpdmF0ZSByZWFkb25seSBwazogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBEeW5hbW9EQkNsaWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGJ1aWxkSWQ6IHN0cmluZyxcbiAgKSB7XG4gICAgdGhpcy5wayA9IGAke2J1aWxkSWR9I2xvZ2A7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkIHRoYXQgYHRhZ2Agd2FzIHJldmFsaWRhdGVkIGF0IGBhdGAgKGBEYXRlLm5vdygpYCksIHNldHRpbmcgYG1hcmtlcmAuXG4gICAqXG4gICAqIFR3byByZXZhbGlkYXRpb25zIG9mIGB0YWdgIGluIHRoZSBzYW1lIG1pbGxpc2Vjb25kIHdvdWxkIHNoYXJlIGEgc29ydCBrZXksXG4gICAqIGFuZCB0aGUgc2Vjb25kIHdvdWxkIG92ZXJ3cml0ZSB0aGUgZmlyc3QuIFNvIHRoZSByb3cgaXMgb25seSB3cml0dGVuIHdoZXJlXG4gICAqIGl0cyBrZXkgaXMgZnJlZSwgYW5kIG9uIGEgY29sbGlzaW9uIGl0IG1vdmVzIHRvIHRoZSBuZXh0IG1pbGxpc2Vjb25kLCB1cFxuICAgKiB0byB7QGxpbmsgTE9HX1BVVF9BVFRFTVBUU30gdGltZXMuXG4gICAqL1xuICBhc3luYyBwdXQodGFnOiBzdHJpbmcsIGF0OiBudW1iZXIsIG1hcmtlcjogVGFnTWFya2VyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IDsgYXR0ZW1wdCsrKSB7XG4gICAgICBjb25zdCBpdGVtOiBSZWNvcmQ8c3RyaW5nLCBBdHRyaWJ1dGVWYWx1ZT4gPSB7XG4gICAgICAgIHBrOiB7IFM6IHRoaXMucGsgfSxcbiAgICAgICAgc2s6IHsgUzogYCR7bG9nU2tQcmVmaXgoYXQpfSMke3RhZ31gIH0sXG4gICAgICAgIHR0bDogeyBOOiBTdHJpbmcoTWF0aC5jZWlsKChhdCArIFJFVkFMSURBVElPTl9MT0dfVFRMX01TKSAvIDEwMDApKSB9LFxuICAgICAgfTtcbiAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgTUFSS0VSX0ZJRUxEUykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG1hcmtlcltmaWVsZF07XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaXRlbVtmaWVsZF0gPSB7IE46IFN0cmluZyh2YWx1ZSkgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jbGllbnQuc2VuZChcbiAgICAgICAgICBuZXcgUHV0SXRlbUNvbW1hbmQoe1xuICAgICAgICAgICAgVGFibGVOYW1lOiB0aGlzLnRhYmxlTmFtZSxcbiAgICAgICAgICAgIEl0ZW06IGl0ZW0sXG4gICAgICAgICAgICBDb25kaXRpb25FeHByZXNzaW9uOiBcImF0dHJpYnV0ZV9ub3RfZXhpc3RzKHNrKVwiLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8ubmFtZSAhPT1cbiAgICAgICAgICAgIFwiQ29uZGl0aW9uYWxDaGVja0ZhaWxlZEV4Y2VwdGlvblwiIHx8XG4gICAgICAgICAgYXR0ZW1wdCA+PSBMT0dfUFVUX0FUVEVNUFRTXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGF0ID0gTWF0aC5mbG9vcihhdCkgKyAxO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcm93cyB3cml0dGVuIGF0IG9yIGFmdGVyIGBzaW5jZWAgKGBEYXRlLm5vdygpYCksIG9sZGVzdCBmaXJzdC5cbiAgICogYHRydW5jYXRlZGAgd2hlbiB0aGVyZSB3ZXJlIG1vcmUgdGhhbiB7QGxpbmsgUkVWQUxJREFUSU9OX0xPR19NQVhfUEFHRVN9XG4gICAqIHBhZ2VzIG9mIHRoZW0sIGFuZCBgcm93c2AgaXMgb25seSB0aGUgc3RhcnQuXG4gICAqXG4gICAqIEV2ZW50dWFsbHkgY29uc2lzdGVudDogYSByb3cgd3JpdHRlbiBhIG1vbWVudCBhZ28gbWF5IG5vdCBzaG93IHlldCwgd2hpY2hcbiAgICogaXMgd2hhdCB0aGUgcmVhZGVyJ3MgbG9va2JhY2sgaXMgZm9yLlxuICAgKi9cbiAgYXN5bmMgcXVlcnkoXG4gICAgc2luY2U6IG51bWJlcixcbiAgKTogUHJvbWlzZTx7IHJvd3M6IFJldmFsaWRhdGlvbkxvZ1Jvd1tdOyB0cnVuY2F0ZWQ6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IHJvd3M6IFJldmFsaWRhdGlvbkxvZ1Jvd1tdID0gW107XG4gICAgbGV0IHN0YXJ0S2V5OiBSZWNvcmQ8c3RyaW5nLCBBdHRyaWJ1dGVWYWx1ZT4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChsZXQgcGFnZSA9IDA7IHBhZ2UgPCBSRVZBTElEQVRJT05fTE9HX01BWF9QQUdFUzsgcGFnZSsrKSB7XG4gICAgICBjb25zdCByZXNwb25zZTogUXVlcnlDb21tYW5kT3V0cHV0ID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZChcbiAgICAgICAgbmV3IFF1ZXJ5Q29tbWFuZCh7XG4gICAgICAgICAgVGFibGVOYW1lOiB0aGlzLnRhYmxlTmFtZSxcbiAgICAgICAgICBLZXlDb25kaXRpb25FeHByZXNzaW9uOiBcInBrID0gOnBrIEFORCBzayA+PSA6c2luY2VcIixcbiAgICAgICAgICBFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzOiB7XG4gICAgICAgICAgICBcIjpwa1wiOiB7IFM6IHRoaXMucGsgfSxcbiAgICAgICAgICAgIFwiOnNpbmNlXCI6IHsgUzogbG9nU2tQcmVmaXgoTWF0aC5tYXgoMCwgc2luY2UpKSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgUHJvamVjdGlvbkV4cHJlc3Npb246IFwic2ssIHJldmFsaWRhdGVkQXQsIHN0YWxlQXQsIGV4cGlyZWRBdFwiLFxuICAgICAgICAgIEV4Y2x1c2l2ZVN0YXJ0S2V5OiBzdGFydEtleSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHJlc3BvbnNlLkl0ZW1zID8/IFtdKSB7XG4gICAgICAgIGNvbnN0IHNrID0gaXRlbS5zaz8uUztcbiAgICAgICAgLy8gYDxkaWdpdHM+Izx0YWc+YDogdGhlIHRhZyBpcyBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaXhlZC13aWR0aFxuICAgICAgICAvLyB0aW1lc3RhbXAsIGAjYHMgaW5jbHVkZWQuXG4gICAgICAgIGlmIChzayA9PT0gdW5kZWZpbmVkIHx8IHNrW0xPR19TS19ESUdJVFNdICE9PSBcIiNcIikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJvd3MucHVzaCh7XG4gICAgICAgICAgc2ssXG4gICAgICAgICAgYXQ6IE51bWJlcihzay5zbGljZSgwLCBMT0dfU0tfRElHSVRTKSksXG4gICAgICAgICAgdGFnOiBzay5zbGljZShMT0dfU0tfRElHSVRTICsgMSksXG4gICAgICAgICAgbWFya2VyOiBtYXJrZXJPZihpdGVtKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBzdGFydEtleSA9IHJlc3BvbnNlLkxhc3RFdmFsdWF0ZWRLZXk7XG4gICAgICBpZiAoIXN0YXJ0S2V5KSB7XG4gICAgICAgIHJldHVybiB7IHJvd3MsIHRydW5jYXRlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgcm93cywgdHJ1bmNhdGVkOiB0cnVlIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gbG9nU2tQcmVmaXgoYXQ6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBTdHJpbmcoTWF0aC5mbG9vcihhdCkpLnBhZFN0YXJ0KExPR19TS19ESUdJVFMsIFwiMFwiKTtcbn1cblxuLyoqXG4gKiBIb3cgZmFyIGJlaGluZCB0aGUgbGFzdCBxdWVyeSdzIHN0YXJ0IHRoZSBuZXh0IG9uZSBzdGFydHMgcmVhZGluZyB0aGUgbG9nOlxuICogdGhlIHJvb20gZm9yIHRoZSBgUXVlcnlgIGJlaW5nIGV2ZW50dWFsbHkgY29uc2lzdGVudCBhbmQgZm9yIHdyaXRlcnMnIGNsb2Nrc1xuICogcnVubmluZyBiZWhpbmQgdGhlIHJlYWRlcidzLiBSb3dzIGluc2lkZSBpdCBhcmUgcmVhZCBhZ2FpbiwgYW5kIGRyb3BwZWQgYXNcbiAqIGFscmVhZHkgYXBwbGllZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFVkFMSURBVElPTl9MT0dfTE9PS0JBQ0tfTVMgPSA1MDAwO1xuXG4vKipcbiAqIFRoZSBsb25nZXN0IHtAbGluayBUcmFja2VkVGFnTWFya2Vyc30gdHJ1c3RzIHRoZSBsb2cgYWxvbmUgZm9yIGEgdGFnIGJlZm9yZVxuICogcmVhZGluZyBpdHMgbWFya2VyIHJvdyBhZ2Fpbi4gVGhlIGxvZyBpcyB0aGUgZmFzdCBwYXRoLCBidXQgdGhlIG1hcmtlciByb3dzXG4gKiBhcmUgdGhlIHNvdXJjZSBvZiB0cnV0aDogYSBsb2cgcm93IHdob3NlIHdyaXRlIGZhaWxlZCB3b3VsZCBvdGhlcndpc2UgYmVcbiAqIG1pc3NlZCBmb3IgYXMgbG9uZyBhcyB0aGUgdGFnIHN0YXlzIHRyYWNrZWQuXG4gKlxuICogUm9sbGluZywgbm90IGFsbCBhdCBvbmNlOiBlYWNoIHJlZnJlc2ggcmUtcmVhZHMgYXQgbW9zdFxuICoge0BsaW5rIEJBVENIX0dFVF9NQVhfS0VZU30gb2YgdGhlIHRhZ3MgZHVlLCBvbGRlc3QgZmlyc3QuIFJlLXJlYWRpbmcgdGhlbSBhbGxcbiAqIHRvZ2V0aGVyIGNvc3QgfjUwMCBSQ1UgYXQgMTAwMCB0YWdzIC0gYSBmbGVldCBzdGFydGVkIGJ5IG9uZSBsb2FkIHRlc3QgZGlkIGl0XG4gKiBpbiB0aGUgc2FtZSBtaW51dGUsIDEyLDgwMCBSQ1UsIGFuZCB0aHJvdHRsZWQgLSBhbmQgd291bGQgYmUgfjUsMDAwIFJDVSBhdFxuICoge0BsaW5rIERFRkFVTFRfTUFYX1RSQUNLRURfVEFHU30sIHBhc3Qgd2hhdCB0aGUgb25lIHBhcnRpdGlvbiBzZXJ2ZXMgaW4gYVxuICogc2Vjb25kLiBTcHJlYWQgb3V0LCAxMCwwMDAgdHJhY2tlZCB0YWdzIGNvc3QgfjggUkNVIGEgc2Vjb25kIHBlciBpbnN0YW5jZS5cbiAqXG4gKiBFYWNoIHRhZyBpcyBkdWUgYXQgYSByYW5kb20gNzUtMTAwJSBvZiB0aGlzIGFmdGVyIGl0IHdhcyBsYXN0IHJlYWQsIHNvIHRhZ3NcbiAqIGZpcnN0IHJlYWQgdG9nZXRoZXIgLSBhbiBpbnN0YW5jZSB3YXJtaW5nIHVwIC0gZG8gbm90IGFsbCBjb21lIGR1ZSB0b2dldGhlclxuICogYWdhaW4gZXZlcnkgaW50ZXJ2YWw6IHRoZSBsb2FkIHRlc3QgdGhhdCBtZWFzdXJlZCB0aGUgcm9sbGluZyByZS1yZWFkIHNhd1xuICogaXRzIHdhcm0tdXAncyByZWFkcyByZXR1cm4gYXMgYSAzMC0zNiBSQ1UvcyBidW1wIHRlbiBtaW51dGVzIGxhdGVyLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9UQUdfUkVTWU5DX01TID0gMTAgKiA2MCAqIDEwMDA7XG5cbi8qKiBUaGUgZnJhY3Rpb24gb2Yge0BsaW5rIERFRkFVTFRfVEFHX1JFU1lOQ19NU30gYSB0YWcgbWF5IGNvbWUgZHVlIGVhcmx5IGJ5LiAqL1xuY29uc3QgVEFHX1JFU1lOQ19KSVRURVIgPSAwLjI1O1xuXG4vKipcbiAqIEhvdyBsb25nIHNpbmNlIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgbG9nIHF1ZXJ5IHRoZSBsb2cgY2FuIHN0aWxsIGJlIHRydXN0ZWQgdG9cbiAqIGhvbGQgZXZlcnkgcm93IG5vdCByZWFkIHlldDogaXRzIFRUTCBsZXNzIGEgbWFyZ2luIGZvciB3cml0ZXJzJyBjbG9ja3MuIFBhc3RcbiAqIGl0IC0gYSBMYW1iZGEgZnJvemVuIGJldHdlZW4gaW52b2NhdGlvbnMsIGEgcnVuIG9mIGZhaWxlZCBxdWVyaWVzIC0gdGhlXG4gKiB0cmFja2VkIG1hcmtlcnMgYXJlIGZvcmdvdHRlbiwgdG8gYmUgcmVhZCBhZ2FpbiBhcyB0aGV5IGFyZSBuZWVkZWQsIGFuZCB0aGVcbiAqIGxvZyBpcyBmb2xsb3dlZCBmcm9tIHRoZXJlLlxuICovXG5leHBvcnQgY29uc3QgTUFYX1JFVkFMSURBVElPTl9MT0dfR0FQX01TID1cbiAgUkVWQUxJREFUSU9OX0xPR19UVExfTVMgLSA1ICogNjAgKiAxMDAwO1xuXG4vKipcbiAqIFRoZSBtb3N0IHRhZ3Mgb25lIGluc3RhbmNlIHRyYWNrcy4gUGFzdCBpdCB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBpc1xuICogZm9yZ290dGVuLCB3aGljaCBjb3N0cyBhIHJlYWQgdGhlIG5leHQgdGltZSBpdCBpcyBuZWVkZWQ6IGFuIHVudHJhY2tlZCB0YWdcbiAqIGlzIHJlYWQgYmVmb3JlIGl0IGlzIHRydXN0ZWQuXG4gKlxuICogQSB0cmFja2VkIHRhZyBjb3N0cyBtZW1vcnkgKH4yIE1CIGF0IHRoaXMgYm91bmQpIGFuZCBpdHMgc2hhcmUgb2YgdGhlIHJvbGxpbmdcbiAqIHJlLXJlYWQsIG5vdCBhIHJlYWQgZXZlcnkgcmVmcmVzaCwgc28gdGhlIGJvdW5kIGlzIHNldCBieSBob3cgbWFueSB0YWdzIGFuXG4gKiBpbnN0YW5jZSByZWFsbHkgdXNlcy4gRXZlcnkgcGF0aCBpcyBhIHRhZyBvZiBpdHMgb3duIChgX05fVF8vPHBhdGg+YCksIGFuZCBhdFxuICogMTAwMCBhbiBhcHAgb2YgMTAwMCB0YWdnZWQgcGFnZXMga2VwdCBldmljdGluZyB3aGF0IGl0IHdhcyBhYm91dCB0byBuZWVkOlxuICogaGFsZiBpdHMgcmVxdWVzdHMgcmUtcmVhZCBhIG1hcmtlci5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTUFYX1RSQUNLRURfVEFHUyA9IDEwXzAwMDtcblxuLyoqXG4gKiBUaGUgcmV2YWxpZGF0aW9uIHRhYmxlJ3MgbWFya2VyIHJvd3MgYW5kIGl0cyBsb2csIHdoaWNoIGFyZSBvbmx5IGV2ZXIgdXNlZFxuICogdG9nZXRoZXIsIG9yIG5laXRoZXIgZm9yIHRhZ3MgbG9jYWwgdG8gdGhpcyBwcm9jZXNzLlxuICovXG5leHBvcnQgdHlwZSBUYWdUYWJsZSA9XG4gIHwgeyBtYXJrZXJzOiBUYWdNYXJrZXJUYWJsZTsgbG9nOiBSZXZhbGlkYXRpb25Mb2cgfVxuICB8IHsgbWFya2Vycz86IHVuZGVmaW5lZDsgbG9nPzogdW5kZWZpbmVkIH07XG5cbi8qKiBIb3cge0BsaW5rIFRyYWNrZWRUYWdNYXJrZXJzfSBpcyBidWlsdC4gKi9cbmV4cG9ydCB0eXBlIFRyYWNrZWRUYWdNYXJrZXJzT3B0aW9ucyA9IFRhZ1RhYmxlICYge1xuICAvKipcbiAgICogSG93IG9mdGVuLCBhdCBtb3N0LCB7QGxpbmsgVHJhY2tlZFRhZ01hcmtlcnMucmVmcmVzaH0gcmVhZHMgYW55dGhpbmcuXG4gICAqIEBkZWZhdWx0IERFRkFVTFRfVEFHX1JFRlJFU0hfTVNcbiAgICovXG4gIHJlZnJlc2hJbnRlcnZhbE1zPzogbnVtYmVyO1xuICBtYXhUcmFja2VkVGFncz86IG51bWJlcjtcbiAgLyoqIEBzZWUgREVGQVVMVF9UQUdfUkVTWU5DX01TICovXG4gIHJlc3luY0ludGVydmFsTXM/OiBudW1iZXI7XG4gIC8qKiBUaGUgd2FsbCBjbG9jayB0aGUgbG9nJ3MgY3Vyc29yIGFuZCB0aGUgaW50ZXJ2YWxzIGFyZSBrZXB0IG9uLiAqL1xuICBjbG9jaz86ICgpID0+IG51bWJlcjtcbiAgLyoqIGBNYXRoLnJhbmRvbWAsIGZvciB3aGVuIGVhY2ggdGFnJ3MgcmUtcmVhZCBjb21lcyBkdWUuICovXG4gIHJhbmRvbT86ICgpID0+IG51bWJlcjtcbiAgZGVidWc/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xufTtcblxuLyoqXG4gKiBPbmUgaW5zdGFuY2UncyBjb3B5IG9mIHRoZSBtYXJrZXIgcm93cyBvZiB0aGUgdGFncyBpdCBoYXMgbmVlZGVkLCBrZXB0XG4gKiBjdXJyZW50IHRocm91Z2ggdGhlIHtAbGluayBSZXZhbGlkYXRpb25Mb2d9OiB0aGUgcHJvY2VzcydzIG9uZSB0YWcgbWFuaWZlc3RcbiAqIChgc2hhcmVkVGFnTWFuaWZlc3RgKSwgZm9yIHRoZSBgJ3VzZSBjYWNoZSdgIGhhbmRsZXJzIGFuZCB0aGUgaW5jcmVtZW50YWxcbiAqIGNhY2hlIGFsaWtlLlxuICpcbiAqIE5leHQuanMncyBidWlsdC1pbiBgJ3VzZSBjYWNoZSdgIGhhbmRsZXIga2VlcHMgdGFncyBpbiBhIG1vZHVsZS1sZXZlbCBtYXBcbiAqIChgdGFncy1tYW5pZmVzdC5leHRlcm5hbC5qc2ApIHRoYXQgb25seSBpdHMgb3duIGB1cGRhdGVUYWdzYCB3cml0ZXMsIGFuZCBpdHNcbiAqIGByZWZyZXNoVGFnc2AgaXMgYSBuby1vcCwgc28gYSBgcmV2YWxpZGF0ZVRhZ2Agb24gb25lIGluc3RhbmNlIG5ldmVyIHJlYWNoZXNcbiAqIHRoZSBvdGhlcnM6IHRoZXkga2VlcCBzZXJ2aW5nIHRoZSByZXZhbGlkYXRlZCBlbnRyeSwgaW5jbHVkaW5nIGluc2lkZSBwYWdlc1xuICogdGhhdCBhcmUgYmVpbmcgcmUtcmVuZGVyZWQgKmJlY2F1c2UqIG9mIHRoYXQgcmV2YWxpZGF0aW9uLiBUaGVcbiAqIGBjYWNoZUhhbmRsZXJzYCBpbnRlcmZhY2UncyBhbnN3ZXIgaXMgYHJlZnJlc2hUYWdzYCwgXCJjYWxsZWQgYmVmb3JlIHN0YXJ0aW5nXG4gKiBhIG5ldyByZXF1ZXN0IOKApiB0byByZWZyZXNoIHRoZSBsb2NhbCB0YWdzIG1hbmlmZXN0XCIsIGFuZCB0aGlzIGlzIHRoYXRcbiAqIG1hbmlmZXN0LCBiYWNrZWQgYnkgdGhlIHNhbWUgbWFya2VyIHJvd3MgdGhlIGluY3JlbWVudGFsIGNhY2hlJ3NcbiAqIGByZXZhbGlkYXRlVGFnYCB3cml0ZXMgKGBwayA9IGJ1aWxkSWRgLCBgc2sgPSB0YWdgKS5cbiAqXG4gKiBUaGUgY29zdCBpcyBib3VuZGVkIHBlciBpbnN0YW5jZSwgbm90IHBlciByZXF1ZXN0OlxuICogLSB7QGxpbmsgZW5zdXJlfSByZWFkcyBhIHRhZydzIG1hcmtlciB0aGUgZmlyc3QgdGltZSBpdCBpcyBuZWVkZWQgYW5kIG5vdFxuICogICBhZ2FpbiB1bnRpbCBpdCBpcyBldmljdGVkLCBzbyBhIHRhZyBjb3N0cyBvbmUgcmVhZCBwZXIgaW5zdGFuY2UsIG5vdCBvbmVcbiAqICAgcGVyIHJlcXVlc3QuXG4gKiAtIHtAbGluayByZWZyZXNofSwgYXQgbW9zdCBvbmNlIHBlciBgcmVmcmVzaEludGVydmFsTXNgLCBzZW5kcyBvbmUgYFF1ZXJ5YFxuICogICBmb3IgdGhlIGxvZyByb3dzIHdyaXR0ZW4gc2luY2UgdGhlIGxhc3Qgb25lLCBhbmQgYXBwbGllcyB0aG9zZSBvZiB0YWdzXG4gKiAgIHRoaXMgaW5zdGFuY2UgdHJhY2tzLiBDb25jdXJyZW50IGNhbGxlcnMgc2hhcmUgaXQuIEFsb25nc2lkZSwgaXQgcmUtcmVhZHNcbiAqICAgdGhlIG1hcmtlcnMgb2YgdXAgdG8ge0BsaW5rIEJBVENIX0dFVF9NQVhfS0VZU30gdGFncyBub3QgcmVhZCBmb3JcbiAqICAge0BsaW5rIERFRkFVTFRfVEFHX1JFU1lOQ19NU30sIGluIG9uZSBgQmF0Y2hHZXRJdGVtYC5cbiAqIEEgcmV2YWxpZGF0aW9uIG9uIGFub3RoZXIgaW5zdGFuY2UgaXMgdGhlcmVmb3JlIHNlZW4gd2l0aGluXG4gKiBgcmVmcmVzaEludGVydmFsTXNgIChwbHVzIHRoZSBxdWVyeSBpdHNlbGYpLiBUaGUgaW5zdGFuY2UgdGhhdCByYW4gaXQgYXBwbGllc1xuICogaXQgaXRzZWxmLCBhdCBvbmNlLCB3aXRoIHtAbGluayBzZXR9LlxuICovXG5leHBvcnQgY2xhc3MgVHJhY2tlZFRhZ01hcmtlcnMge1xuICBwcml2YXRlIHJlYWRvbmx5IG1hcmtlcnM6IFRhZ01hcmtlclRhYmxlIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZzogUmV2YWxpZGF0aW9uTG9nIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZnJlc2hJbnRlcnZhbE1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4VHJhY2tlZFRhZ3M6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSByZXN5bmNJbnRlcnZhbE1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xvY2s6ICgpID0+IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSByYW5kb206ICgpID0+IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWJ1ZzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgLyoqIEJ5IHRhZywgbGVhc3QgcmVjZW50bHkgdXNlZCBmaXJzdC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSB0YWdzID0gbmV3IE1hcDxzdHJpbmcsIFRhZ01hcmtlcj4oKTtcbiAgLyoqXG4gICAqIFdoZW4gZWFjaCB0cmFja2VkIHRhZydzIG1hcmtlciBpcyBkdWUgdG8gYmUgcmVhZCBhZ2FpbjogYSByYW5kb20gNzUtMTAwJVxuICAgKiBvZiBgcmVzeW5jSW50ZXJ2YWxNc2AgYWZ0ZXIgaXQgd2FzIGxhc3Qga25vd24gZnJvbSB0aGUgdGFibGUgLSByZWFkLFxuICAgKiB3cml0dGVuIGhlcmUsIG9yIG5ldy4gSW4gdGhlIG9yZGVyIHRoZXkgYmVjYW1lIGtub3duLCBsZWFzdCByZWNlbnQgZmlyc3QuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGR1ZUF0ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZWFkaW5nID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+KCk7XG4gIC8qKlxuICAgKiBMb2cgcm93cyBmb3IgdGFncyB3aG9zZSBmaXJzdCByZWFkIGlzIGluIGZsaWdodCwgbWVyZ2VkIGJ5IHRhZzogdGhlIHJlYWRcbiAgICogbWF5IGhhdmUgYmVlbiBhbnN3ZXJlZCBiZWZvcmUgdGhlIHJldmFsaWRhdGlvbiwgc28gdGhleSBhcmUgYXBwbGllZCB0byBpdHNcbiAgICogcmVzdWx0IHJhdGhlciB0aGFuIGRyb3BwZWQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHBlbmRpbmdSb3dzID0gbmV3IE1hcDxzdHJpbmcsIFRhZ01hcmtlcj4oKTtcbiAgLyoqIFRyYWNrZWQgdGFncyB3aG9zZSByZWFkIGZhaWxlZCwgZm9yIHRoZSBuZXh0IHJlZnJlc2ggdG8gcmVhZCBhZ2Fpbi4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSB1bnJlYWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBsYXN0UmVmcmVzaCA9IC1JbmZpbml0eTtcbiAgcHJpdmF0ZSByZWZyZXNoaW5nOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogV2hlcmUgdGhlIG5leHQgbG9nIHF1ZXJ5IHN0YXJ0cyAoYGNsb2NrKClgKTogdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBvbmUnc1xuICAgKiBzdGFydCwgbGVzcyB7QGxpbmsgUkVWQUxJREFUSU9OX0xPR19MT09LQkFDS19NU30uXG4gICAqL1xuICBwcml2YXRlIGN1cnNvcjogbnVtYmVyO1xuICAvKiogV2hlbiB0aGUgbGFzdCBzdWNjZXNzZnVsIGxvZyBxdWVyeSBzdGFydGVkLCBvciB0aGUgbG9nIHdhcyBmaXJzdCByZWFkLiAqL1xuICBwcml2YXRlIGxhc3RMb2dSZWFkOiBudW1iZXI7XG4gIC8qKiBMb2cgcm93cyBhdCBvciBhZnRlciB0aGUgY3Vyc29yIGFscmVhZHkgYXBwbGllZCwgYnkgc29ydCBrZXkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwbGllZCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIC8qKiB7QGxpbmsgdXBkYXRlfXMgb2YgdGhlIGN1cnJlbnQgdHVybiwgYnkgdGhlaXIgYXJndW1lbnRzLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0aW5nID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8Ym9vbGVhbj4+KCk7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogVHJhY2tlZFRhZ01hcmtlcnNPcHRpb25zKSB7XG4gICAgdGhpcy5tYXJrZXJzID0gb3B0aW9ucy5tYXJrZXJzO1xuICAgIHRoaXMubG9nID0gb3B0aW9ucy5sb2c7XG4gICAgdGhpcy5yZWZyZXNoSW50ZXJ2YWxNcyA9XG4gICAgICBvcHRpb25zLnJlZnJlc2hJbnRlcnZhbE1zID8/IERFRkFVTFRfVEFHX1JFRlJFU0hfTVM7XG4gICAgdGhpcy5tYXhUcmFja2VkVGFncyA9IG9wdGlvbnMubWF4VHJhY2tlZFRhZ3MgPz8gREVGQVVMVF9NQVhfVFJBQ0tFRF9UQUdTO1xuICAgIHRoaXMucmVzeW5jSW50ZXJ2YWxNcyA9IG9wdGlvbnMucmVzeW5jSW50ZXJ2YWxNcyA/PyBERUZBVUxUX1RBR19SRVNZTkNfTVM7XG4gICAgLy8gTG9va2VkIHVwIG9uIGVhY2ggY2FsbCByYXRoZXIgdGhhbiBib3VuZCBoZXJlLCBzbyBhIHRlc3QncyBgRGF0ZS5ub3dgXG4gICAgLy8gc3B5IGFwcGxpZXMuXG4gICAgdGhpcy5jbG9jayA9IG9wdGlvbnMuY2xvY2sgPz8gKCgpID0+IERhdGUubm93KCkpO1xuICAgIHRoaXMucmFuZG9tID0gb3B0aW9ucy5yYW5kb20gPz8gTWF0aC5yYW5kb207XG4gICAgdGhpcy5kZWJ1ZyA9IG9wdGlvbnMuZGVidWcgPz8gKCgpID0+IHt9KTtcbiAgICAvLyBOb3RoaW5nIGlzIHRyYWNrZWQgeWV0LCBzbyBub3RoaW5nIGJlZm9yZSB0aGlzIGNhbiBiZSBtaXNzZWQ6IGV2ZXJ5IHRhZ1xuICAgIC8vIGlzIHJlYWQgZnJvbSBpdHMgbWFya2VyIHRoZSBmaXJzdCB0aW1lIGl0IGlzIG5lZWRlZC5cbiAgICBjb25zdCBhdCA9IHRoaXMuY2xvY2soKTtcbiAgICB0aGlzLmN1cnNvciA9IGF0IC0gUkVWQUxJREFUSU9OX0xPR19MT09LQkFDS19NUztcbiAgICB0aGlzLmxhc3RMb2dSZWFkID0gYXQ7XG4gIH1cblxuICAvKiogYHRhZ2AncyBtYXJrZXIgYXMgdGhpcyBpbnN0YW5jZSBrbm93cyBpdCwgaWYgaXQgdHJhY2tzIGB0YWdgLiAqL1xuICBnZXQodGFnOiBzdHJpbmcpOiBUYWdNYXJrZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnRhZ3MuZ2V0KHRhZyk7XG4gIH1cblxuICAvKipcbiAgICogVHJhY2sgYHRhZ2Agd2l0aCBgbWFya2VyYDogd2hhdCB0aGlzIGluc3RhbmNlIGp1c3Qgd3JvdGUsIHdoaWNoIGl0IGtub3dzXG4gICAqIHdpdGhvdXQgcmVhZGluZyBpdCBiYWNrLlxuICAgKi9cbiAgc2V0KHRhZzogc3RyaW5nLCBtYXJrZXI6IFRhZ01hcmtlcik6IHZvaWQge1xuICAgIHRoaXMucmVtZW1iZXIodGFnLCBtYXJrZXIpO1xuICAgIHRoaXMua25vd24odGFnLCB0aGlzLmNsb2NrKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vdGUgYSB1c2Ugb2YgYHRhZ3NgOiB0aG9zZSBvZiBhbiBlbnRyeSB0aGlzIGluc3RhbmNlIGp1c3Qgc3RvcmVkLlxuICAgKlxuICAgKiBXaXRoIHRoZSB0YWJsZSwgYSB0YWcgbm90IHRyYWNrZWQgeWV0IGlzIGxlZnQgdW50cmFja2VkLCB0byBiZSByZWFkIGJ5XG4gICAqIHtAbGluayBlbnN1cmV9IHRoZSBmaXJzdCB0aW1lIGFuIGVudHJ5IG5lZWRzIGl0LiBOb3RoaW5nIHJldmFsaWRhdGVkIGJlZm9yZVxuICAgKiB0aGUgbmV3IGVudHJ5IHdhcyBjcmVhdGVkIGFwcGxpZXMgdG8gKml0KiwgYnV0IHRyYWNraW5nIGlzIHBlciB0YWcsIG5vdCBwZXJcbiAgICogZW50cnk6IHRyYWNraW5nIHRoZSB0YWcgd2l0aCBhbiBlbXB0eSBtYXJrZXIgd291bGQgYWxzbyB2b3VjaCBmb3IgZXZlcnlcbiAgICogb2xkZXIgZW50cnkgdGhhdCBjYXJyaWVzIGl0IC0gb25lIGFub3RoZXIgaW5zdGFuY2Ugc3RvcmVkIGluIFMzLCBvciBvbmVcbiAgICogdGhpcyBpbnN0YW5jZSBrZXB0IGluIG1lbW9yeSBhY3Jvc3MgYSB7QGxpbmsgZm9yZ2V0fSAtIGFuZCBhIHJldmFsaWRhdGlvblxuICAgKiBmcm9tIGJlZm9yZSB0aGUgbG9nJ3MgY3Vyc29yIHdvdWxkIGdvIHVuc2VlbiB1bnRpbCB0aGUgcm9sbGluZyByZS1yZWFkLlxuICAgKlxuICAgKiBXaXRob3V0IHRoZSB0YWJsZSBldmVyeSByZXZhbGlkYXRpb24gaXMgdGhpcyBwcm9jZXNzJ3Mgb3duLCBhcHBsaWVkIHdpdGhcbiAgICoge0BsaW5rIHNldH0sIHNvIGEgdGFnIGlzIHRyYWNrZWQgYXQgb25jZS5cbiAgICovXG4gIHRyYWNrKHRhZ3M6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1hcmtlcnMpIHtcbiAgICAgIHRoaXMudHJhY2tVbnJlYWQodGFncyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgdGFnIG9mIHRhZ3MpIHtcbiAgICAgIHRoaXMudG91Y2godGFnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJhY2sgYHRhZ3NgIGFzIHRoZXkgYXJlIGtub3duIG5vdywgd2l0aG91dCByZWFkaW5nIHRoZW0sIHdpdGggYW4gZW1wdHlcbiAgICogbWFya2VyIGZvciBhbnkgbm90IHRyYWNrZWQgeWV0LlxuICAgKi9cbiAgcHJpdmF0ZSB0cmFja1VucmVhZCh0YWdzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGNvbnN0IGF0ID0gdGhpcy5jbG9jaygpO1xuICAgIGZvciAoY29uc3QgdGFnIG9mIHRhZ3MpIHtcbiAgICAgIGlmICghdGhpcy50YWdzLmhhcyh0YWcpKSB7XG4gICAgICAgIHRoaXMua25vd24odGFnLCBhdCk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlbWVtYmVyKHRhZywgdGhpcy50YWdzLmdldCh0YWcpID8/IHt9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVhZCB0aGUgbWFya2VycyBvZiB3aGljaGV2ZXIgb2YgYHRhZ3NgIHRoaXMgaW5zdGFuY2UgZG9lcyBub3QgdHJhY2sgeWV0LlxuICAgKiBOZWVkZWQgYmVmb3JlIGp1ZGdpbmcgYW4gZW50cnkgdGhpcyBpbnN0YW5jZSBkaWQgbm90IGNyZWF0ZSwgc2luY2UgaXRzXG4gICAqIHRhZ3MgbWF5IGhhdmUgYmVlbiByZXZhbGlkYXRlZCBhdCBhbnkgdGltZSBiZWZvcmUuXG4gICAqL1xuICBhc3luYyBlbnN1cmUodGFnczogcmVhZG9ubHkgc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMubWFya2Vycykge1xuICAgICAgdGhpcy50cmFja1VucmVhZCh0YWdzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgd2FpdHM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGNvbnN0IHVucmVhZDogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHRhZyBvZiBuZXcgU2V0KHRhZ3MpKSB7XG4gICAgICBjb25zdCBpbkZsaWdodCA9IHRoaXMucmVhZGluZy5nZXQodGFnKTtcbiAgICAgIGlmIChpbkZsaWdodCkge1xuICAgICAgICB3YWl0cy5wdXNoKGluRmxpZ2h0KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy50YWdzLmhhcyh0YWcpKSB7XG4gICAgICAgIHRoaXMudG91Y2godGFnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVucmVhZC5wdXNoKHRhZyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh1bnJlYWQubGVuZ3RoID4gMCkge1xuICAgICAgLy8gYHJlYWRJbnRvYCBuZXZlciByZWplY3RzOiBhIGZhaWxlZCByZWFkIGxlYXZlcyB0aGUgdGFncyB0cmFja2VkLlxuICAgICAgY29uc3QgcmVhZCA9IHRoaXMucmVhZEludG8odW5yZWFkKS50aGVuKCgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB0YWcgb2YgdW5yZWFkKSB7XG4gICAgICAgICAgdGhpcy5yZWFkaW5nLmRlbGV0ZSh0YWcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGZvciAoY29uc3QgdGFnIG9mIHVucmVhZCkge1xuICAgICAgICB0aGlzLnJlYWRpbmcuc2V0KHRhZywgcmVhZCk7XG4gICAgICB9XG4gICAgICB3YWl0cy5wdXNoKHJlYWQpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbCh3YWl0cyk7XG4gIH1cblxuICAvKipcbiAgICogQ2F0Y2ggdXAgb24gcmV2YWxpZGF0aW9ucyBvdGhlciBpbnN0YW5jZXMgcmFuLCBhdCBtb3N0IG9uY2UgcGVyXG4gICAqIGByZWZyZXNoSW50ZXJ2YWxNc2AuIFNlZSB7QGxpbmsgVHJhY2tlZFRhZ01hcmtlcnN9IGZvciB0aGUgY29zdC5cbiAgICovXG4gIGFzeW5jIHJlZnJlc2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2c7XG4gICAgaWYgKCFsb2cpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMucmVmcmVzaGluZykge1xuICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaGluZztcbiAgICB9XG4gICAgY29uc3QgYXQgPSB0aGlzLmNsb2NrKCk7XG4gICAgaWYgKGF0IC0gdGhpcy5sYXN0UmVmcmVzaCA8IHRoaXMucmVmcmVzaEludGVydmFsTXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sYXN0UmVmcmVzaCA9IGF0O1xuICAgIC8vIFdoYXRldmVyIGdldHMgdHJhY2tlZCBiZWZvcmUgdGhlIG5leHQgcmVmcmVzaCBpcyByZWFkIGZyb20gaXRzIG1hcmtlcixcbiAgICAvLyBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGNhdGNoIHVwIG9uIHlldC5cbiAgICBpZiAodGhpcy50YWdzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZWZyZXNoaW5nID0gdGhpcy5zeW5jKGF0LCBsb2cpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgdGhpcy5yZWZyZXNoaW5nID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLnJlZnJlc2hpbmc7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkIGEgcmV2YWxpZGF0aW9uIG9mIGB0YWdzYDogaGVyZSBhdCBvbmNlLCBhbmQgaW4gdGhlIHJldmFsaWRhdGlvblxuICAgKiB0YWJsZSBmb3IgZXZlcnkgb3RoZXIgaW5zdGFuY2UgLSB0aGUgbWFya2VyIHJvdyBwbHVzIGEgbG9nIHJvdyBwZXIgdGFnLlxuICAgKlxuICAgKiBOZXh0LmpzIGNhbGxzIGByZXZhbGlkYXRlVGFnYCBvbiB0aGUgaW5jcmVtZW50YWwgY2FjaGUgYW5kIGB1cGRhdGVUYWdzYCBvblxuICAgKiBldmVyeSBkaXN0aW5jdCBgY2FjaGVIYW5kbGVyc2AgZW50cnksIGFsbCBpbiBvbmUgc3luY2hyb25vdXMgbG9vcFxuICAgKiAoYHJldmFsaWRhdGlvbi11dGlsc2ApLCBhbmQgYWxsIG9mIHRoZW0gc2hhcmUgdGhpcyBtYW5pZmVzdC4gU28gYW5cbiAgICogaWRlbnRpY2FsIGNhbGwgaW4gdGhlIHNhbWUgdHVybiBqb2lucyB0aGUgZmlyc3QgaW5zdGVhZCBvZiB3cml0aW5nIHRoZVxuICAgKiByb3dzIGFnYWluLiBPbmUgaW4gYSBsYXRlciB0dXJuIGlzIGEgcmV2YWxpZGF0aW9uIG9mIGl0cyBvd24sIGV2ZW4gd2hpbGVcbiAgICogdGhlIGZpcnN0IG9uZSdzIHdyaXRlcyBhcmUgaW4gZmxpZ2h0LCBhbmQgZ2V0cyBpdHMgb3duLCBsYXRlciwgbWFya2VyLlxuICAgKiBOZXZlciByZWplY3RzOiByZXNvbHZlcyBgZmFsc2VgIHdoZW4gYSByb3cgZmFpbGVkIHRvIHdyaXRlICh0aGUgZXJyb3IgaXNcbiAgICogbG9nZ2VkKSwgc28gb3RoZXIgaW5zdGFuY2VzIG1heSBub3Qgc2VlIGl0LlxuICAgKi9cbiAgYXN5bmMgdXBkYXRlKFxuICAgIHRhZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICAgIGR1cmF0aW9uczogUmV2YWxpZGF0ZUR1cmF0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkoW3RhZ3MsIGR1cmF0aW9ucyA/PyBudWxsXSk7XG4gICAgY29uc3QgaW5GbGlnaHQgPSB0aGlzLnVwZGF0aW5nLmdldChrZXkpO1xuICAgIGlmIChpbkZsaWdodCkge1xuICAgICAgcmV0dXJuIGluRmxpZ2h0O1xuICAgIH1cbiAgICBjb25zdCB1cGRhdGUgPSB0aGlzLndyaXRlKHRhZ3MsIGR1cmF0aW9ucyk7XG4gICAgdGhpcy51cGRhdGluZy5zZXQoa2V5LCB1cGRhdGUpO1xuICAgIC8vIEZvcmdvdHRlbiBhcyBzb29uIGFzIHRoZSBjdXJyZW50IHR1cm4ncyBjYWxscyBoYXZlIGJlZW4gbWFkZS5cbiAgICB2b2lkIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gdGhpcy51cGRhdGluZy5kZWxldGUoa2V5KSk7XG4gICAgcmV0dXJuIHVwZGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IHRoZSB0cmFja2VkIG1hcmtlcnMgc2F5IGFib3V0IGFuIGVudHJ5IGNhcnJ5aW5nIGB0YWdzYCwgY3JlYXRlZCBhdFxuICAgKiBgY3JlYXRlZEF0YDogdGhlIG1vc3Qgc2V2ZXJlIGFuc3dlciBvZiBhbnkgb2YgdGhlbS5cbiAgICovXG4gIHN0YXRlKHRhZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBjcmVhdGVkQXQ6IG51bWJlcik6IFJldmFsaWRhdGlvblN0YXRlIHtcbiAgICAvLyBgbWFya2VyQ2xvY2soKWAsIG5vdCBgRGF0ZS5ub3coKWAsIGhlcmUgYW5kIHdoZXJldmVyIGEgbWFya2VyIGlzIHN0YW1wZWQ6XG4gICAgLy8gYGNyZWF0ZWRBdGAgaXMgb24gTmV4dC5qcydzIGNsb2NrLCBhbmQgYSBtYXJrZXIgb24gdGhlIHdhbGwgY2xvY2sgd291bGQgYmVcbiAgICAvLyBjb21wYXJlZCBhY3Jvc3MgdGhlIHR3bywgc28gYW4gZW50cnkgcmVnZW5lcmF0ZWQganVzdCBhZnRlciBhXG4gICAgLy8gcmV2YWxpZGF0aW9uIGNvdWxkIHN0aWxsIHJlYWQgYXMgb2xkZXIgdGhhbiBpdCB3aGVyZXZlciB0aGV5IGRyaWZ0LlxuICAgIGNvbnN0IGF0ID0gbWFya2VyQ2xvY2soKTtcbiAgICBsZXQgc3RhdGU6IFJldmFsaWRhdGlvblN0YXRlID0gXCJmcmVzaFwiO1xuICAgIGZvciAoY29uc3QgdGFnIG9mIHRhZ3MpIHtcbiAgICAgIGNvbnN0IG1hcmtlciA9IHRoaXMuZ2V0KHRhZyk7XG4gICAgICBpZiAoIW1hcmtlcikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhZ1N0YXRlID0gbWFya2VyU3RhdGUobWFya2VyLCBjcmVhdGVkQXQsIGF0KTtcbiAgICAgIGlmICh0YWdTdGF0ZSA9PT0gXCJleHBpcmVkXCIpIHtcbiAgICAgICAgcmV0dXJuIFwiZXhwaXJlZFwiO1xuICAgICAgfVxuICAgICAgaWYgKHRhZ1N0YXRlID09PSBcInN0YWxlXCIpIHtcbiAgICAgICAgc3RhdGUgPSBcInN0YWxlXCI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBgZ2V0RXhwaXJhdGlvbmAncyBhbnN3ZXI6IHRoZSBsYXRlc3QgdGltZSBhbnkgb2YgYHRhZ3NgIGV4cGlyZWQsIGAwYCBpZlxuICAgKiBub25lIGhhcy4gT25seSBleHBpcmF0aW9ucyBhbHJlYWR5IHBhc3QgY291bnQgLSBhIHByb2ZpbGUncyBmdXR1cmVcbiAgICogYGV4cGlyZWAgaXMgbm90IGFuIGV4cGlyYXRpb24geWV0IC0gYW5kIGEgc3RhbGUgbWFyayBkb2VzIG5vdCwgbWF0Y2hpbmdcbiAgICogTmV4dC5qcydzIGRlZmF1bHQgaGFuZGxlciwgd2hpY2ggcmVhZHMgb25seSBgZXhwaXJlZGAgZm9yIGltcGxpY2l0IHRhZ3MuXG4gICAqL1xuICBleHBpcmF0aW9uKHRhZ3M6IHJlYWRvbmx5IHN0cmluZ1tdKTogbnVtYmVyIHtcbiAgICBjb25zdCBhdCA9IG1hcmtlckNsb2NrKCk7XG4gICAgbGV0IGxhdGVzdCA9IDA7XG4gICAgZm9yIChjb25zdCB0YWcgb2YgdGFncykge1xuICAgICAgY29uc3QgbWFya2VyID0gdGhpcy5nZXQodGFnKTtcbiAgICAgIGlmICghbWFya2VyKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKG1hcmtlci5yZXZhbGlkYXRlZEF0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGF0ZXN0ID0gTWF0aC5tYXgobGF0ZXN0LCBtYXJrZXIucmV2YWxpZGF0ZWRBdCk7XG4gICAgICB9XG4gICAgICBpZiAobWFya2VyLmV4cGlyZWRBdCAhPT0gdW5kZWZpbmVkICYmIG1hcmtlci5leHBpcmVkQXQgPD0gYXQpIHtcbiAgICAgICAgbGF0ZXN0ID0gTWF0aC5tYXgobGF0ZXN0LCBtYXJrZXIuZXhwaXJlZEF0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxhdGVzdDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd3JpdGUoXG4gICAgdGFnczogcmVhZG9ubHkgc3RyaW5nW10sXG4gICAgZHVyYXRpb25zOiBSZXZhbGlkYXRlRHVyYXRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBhdCA9IG1hcmtlckNsb2NrKCk7XG4gICAgY29uc3QgbWFya2VyID0gbWFya2VyRm9yKGF0LCBkdXJhdGlvbnMpO1xuICAgIGZvciAoY29uc3QgdGFnIG9mIHRhZ3MpIHtcbiAgICAgIHRoaXMuc2V0KHRhZywgYXBwbHlNYXJrZXIodGhpcy5nZXQodGFnKSwgbWFya2VyKSk7XG4gICAgfVxuICAgIGNvbnN0IHsgbWFya2VycywgbG9nIH0gPSB0aGlzO1xuICAgIGlmICghbWFya2VycyB8fCAhbG9nKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3Qgd3JpdGVzOiBbc3RyaW5nLCBQcm9taXNlPHVua25vd24+XVtdID0gW107XG4gICAgZm9yIChjb25zdCB0YWcgb2YgbmV3IFNldCh0YWdzKSkge1xuICAgICAgd3JpdGVzLnB1c2goW1xuICAgICAgICBcIkVycm9yIHdyaXRpbmcgdGFnIHJldmFsaWRhdGlvbiBtYXJrZXI6XCIsXG4gICAgICAgIC8vIFRoZSByb3cgYXMgaXQgaXMgbm93LCB3aGljaCBjYXJyaWVzIGFueSBlYXJsaWVyIGByZXZhbGlkYXRlZEF0YFxuICAgICAgICAvLyBhbm90aGVyIGluc3RhbmNlIHdyb3RlOiB0cmFja2luZyBvbmx5IHdoYXQgdGhpcyBjYWxsIHNldCB3b3VsZFxuICAgICAgICAvLyBoaWRlIHRoYXQgb25lIHVudGlsIHRoZSByb2xsaW5nIHJlLXJlYWQsIGFuZCBhbiBlbnRyeSBvbGRlciB0aGFuIGl0XG4gICAgICAgIC8vIHdvdWxkIHJlYWQgYXMgbWVyZWx5IHN0YWxlLlxuICAgICAgICBtYXJrZXJzLndyaXRlKHRhZywgYXQsIGR1cmF0aW9ucykudGhlbigocm93KSA9PiB7XG4gICAgICAgICAgaWYgKHJvdykge1xuICAgICAgICAgICAgdGhpcy5zZXQodGFnLCBtZXJnZU1hcmtlcnModGhpcy5nZXQodGFnKSwgcm93KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgIF0pO1xuICAgICAgd3JpdGVzLnB1c2goW1xuICAgICAgICBcIkVycm9yIHdyaXRpbmcgdGFnIHJldmFsaWRhdGlvbiBsb2cgcm93OlwiLFxuICAgICAgICB0aGlzLnB1dExvZ1Jvdyhsb2csIHRhZywgbWFya2VyKSxcbiAgICAgIF0pO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHdyaXRlcy5tYXAoKFssIHdyaXRlXSkgPT4gd3JpdGUpKTtcbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCwgaSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIikge1xuICAgICAgICBjb25zb2xlLmVycm9yKHdyaXRlc1tpXVswXSwgcmVzdWx0LnJlYXNvbik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdHMuZXZlcnkoKHJlc3VsdCkgPT4gcmVzdWx0LnN0YXR1cyA9PT0gXCJmdWxmaWxsZWRcIik7XG4gIH1cblxuICAvKipcbiAgICogUHV0IGB0YWdgJ3MgbG9nIHJvdywgc3RhbXBlZCBvbiB0aGUgd2FsbCBjbG9jayAodGhlIG1hcmtlciB2YWx1ZXMgYXJlIG9uXG4gICAqIE5leHQuanMnczogc2VlIHtAbGluayBSZXZhbGlkYXRpb25Mb2d9KS5cbiAgICpcbiAgICogUmVhZGVycyBvbmx5IGxvb2sge0BsaW5rIFJFVkFMSURBVElPTl9MT0dfTE9PS0JBQ0tfTVN9IGJlaGluZCB0aGVpciBsYXN0XG4gICAqIHF1ZXJ5LCBzbyBhIHJvdyB0aGF0IHNob3dzIHVwIG11Y2ggbGF0ZXIgdGhhbiBpdHMgdGltZXN0YW1wIC0gYSBzbG93XG4gICAqIGNvbm5lY3Rpb24sIHJldHJpZXMgdW5kZXIgdGhyb3R0bGluZyAtIGlzIGJlaGluZCBldmVyeSBjdXJzb3IgYW5kIG5ldmVyXG4gICAqIHJlYWQuIEEgc2xvdyBwdXQgaXMgdGhlcmVmb3JlIG1hZGUgYWdhaW4gdW5kZXIgYSBmcmVzaCB0aW1lc3RhbXAsIHdoaWNoXG4gICAqIHJlYWRlcnMgd2lsbCBzZWU7IG9uZSBzbG93IHR3aWNlIGlzIHJlcG9ydGVkIGFzIGEgZmFpbHVyZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHV0TG9nUm93KFxuICAgIGxvZzogUmV2YWxpZGF0aW9uTG9nLFxuICAgIHRhZzogc3RyaW5nLFxuICAgIG1hcmtlcjogVGFnTWFya2VyLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IDI7IGF0dGVtcHQrKykge1xuICAgICAgY29uc3QgYXQgPSB0aGlzLmNsb2NrKCk7XG4gICAgICBhd2FpdCBsb2cucHV0KHRhZywgYXQsIG1hcmtlcik7XG4gICAgICBpZiAodGhpcy5jbG9jaygpIC0gYXQgPD0gTUFYX0xPR19QVVRfTVMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIHJldmFsaWRhdGlvbiBsb2cgcm93IGZvciAke3RhZ30gdG9vayBsb25nZXIgdGhhbiByZWFkZXJzIGxvb2sgYmFja2AsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmUgcmVmcmVzaCBzdGFydGVkIGF0IGBhdGA6IHRoZSBsb2cgcm93cyBzaW5jZSB0aGUgY3Vyc29yLCBhbmQgdGhlIG5leHRcbiAgICogc2xpY2Ugb2YgdGhlIHJvbGxpbmcgcmUtcmVhZC5cbiAgICpcbiAgICogQSBmYWlsZWQgcXVlcnkgY2hhbmdlcyBub3RoaW5nIGJ1dCB0aGUgbG9nOiB0aGUgdGFncyBzdGF5IHRyYWNrZWQgYXMgdGhleVxuICAgKiB3ZXJlLCBhbmQgdGhlIG5leHQgcmVmcmVzaCBhc2tzIGFnYWluIGZyb20gdGhlIHNhbWUgY3Vyc29yLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzeW5jKGF0OiBudW1iZXIsIGxvZzogUmV2YWxpZGF0aW9uTG9nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGF0IC0gdGhpcy5sYXN0TG9nUmVhZCA+IE1BWF9SRVZBTElEQVRJT05fTE9HX0dBUF9NUykge1xuICAgICAgdGhpcy5mb3JnZXQoXG4gICAgICAgIGF0LFxuICAgICAgICBcInRoZSByZXZhbGlkYXRpb24gbG9nIG1heSBub3QgY292ZXIgdGhlIGdhcCBzaW5jZSBpdCB3YXMgbGFzdCByZWFkXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBbcmVzdWx0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGxvZy5xdWVyeSh0aGlzLmN1cnNvcikuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciByZWFkaW5nIHRhZyByZXZhbGlkYXRpb24gbG9nOlwiLCBlcnJvcik7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9KSxcbiAgICAgIHRoaXMucmVhZEludG8odGhpcy5kdWUoYXQpKSxcbiAgICBdKTtcbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocmVzdWx0LnRydW5jYXRlZCkge1xuICAgICAgdGhpcy5mb3JnZXQoXG4gICAgICAgIGF0LFxuICAgICAgICBcInRoZSByZXZhbGlkYXRpb24gbG9nIGhhcyBtb3JlIHJvd3MgdGhhbiBvbmUgcXVlcnkgcmVhZHNcIixcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBhcHBsaWVkID0gMDtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByZXN1bHQucm93cykge1xuICAgICAgaWYgKHRoaXMuYXBwbGllZC5oYXMocm93LnNrKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1hcmtlciA9IHRoaXMudGFncy5nZXQocm93LnRhZyk7XG4gICAgICBpZiAobWFya2VyKSB7XG4gICAgICAgIC8vIGBzZXRgIG9uIGEga2V5IGFscmVhZHkgdGhlcmUga2VlcHMgaXRzIHBsYWNlIGluIHRoZSBMUlUgb3JkZXI6IGJlaW5nXG4gICAgICAgIC8vIHJldmFsaWRhdGVkIGVsc2V3aGVyZSBpcyBub3QgYSB1c2UuXG4gICAgICAgIHRoaXMudGFncy5zZXQocm93LnRhZywgbWVyZ2VNYXJrZXJzKG1hcmtlciwgcm93Lm1hcmtlcikpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnJlYWRpbmcuaGFzKHJvdy50YWcpKSB7XG4gICAgICAgIHRoaXMucGVuZGluZ1Jvd3Muc2V0KFxuICAgICAgICAgIHJvdy50YWcsXG4gICAgICAgICAgbWVyZ2VNYXJrZXJzKHRoaXMucGVuZGluZ1Jvd3MuZ2V0KHJvdy50YWcpLCByb3cubWFya2VyKSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEEgdGFnIHRoaXMgaW5zdGFuY2UgZG9lcyBub3QgdHJhY2sgaXMgcmVhZCBmcm9tIGl0cyBtYXJrZXIgd2hlbiBpdFxuICAgICAgICAvLyBpcyBuZXh0IG5lZWRlZCAtIGJ1dCBub3QgeWV0IG1hcmtlZCBhcHBsaWVkLCBiZWNhdXNlIHRoYXQgcmVhZCBtYXlcbiAgICAgICAgLy8gbWlzcyB0aGlzIHZlcnkgcmV2YWxpZGF0aW9uOiB0aGUgd3JpdGVyIHB1dHMgdGhlIGxvZyByb3cgYW5kIHRoZVxuICAgICAgICAvLyBtYXJrZXIgYXQgdGhlIHNhbWUgdGltZSwgYW5kIHRoZSByZWFkIGlzIGFuIGV2ZW50dWFsbHkgY29uc2lzdGVudFxuICAgICAgICAvLyBgQmF0Y2hHZXRJdGVtYCB0aGF0IGNhbiBsYW5kIG1pbGxpc2Vjb25kcyBhZnRlciB0aGUgcm93IHNob3dlZCBoZXJlLlxuICAgICAgICAvLyBNYXJrZWQgYXBwbGllZCwgdGhlIHJvdyB3YXMgc2tpcHBlZCBieSBldmVyeSBxdWVyeSB0aGUgbG9va2JhY2tcbiAgICAgICAgLy8gcmV0dXJuZWQgaXQgdG8sIGFuZCB0aGUgcHJlLXJldmFsaWRhdGlvbiBtYXJrZXIgc3Rvb2QgdW50aWwgdGhlXG4gICAgICAgIC8vIHJvbGxpbmcgcmUtcmVhZC4gTGVmdCB1bm1hcmtlZCwgdGhlIG5leHQgcmVmcmVzaCBhcHBsaWVzIGl0IHRvXG4gICAgICAgIC8vIHdoYXRldmVyIHRoYXQgcmVhZCBmb3VuZDsgaXQgY29zdHMgbm8gcmVhZCwgb25seSB0aGUgcm93IGJlaW5nXG4gICAgICAgIC8vIGxvb2tlZCBhdCBhZ2FpbiB3aGlsZSBpdCBpcyBpbnNpZGUgdGhlIGxvb2tiYWNrLlxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYXBwbGllZC5zZXQocm93LnNrLCByb3cuYXQpO1xuICAgICAgYXBwbGllZCsrO1xuICAgIH1cbiAgICB0aGlzLmxhc3RMb2dSZWFkID0gYXQ7XG4gICAgdGhpcy5hZHZhbmNlKGF0IC0gUkVWQUxJREFUSU9OX0xPR19MT09LQkFDS19NUyk7XG4gICAgdGhpcy5kZWJ1ZyhcbiAgICAgIGByZWFkICR7cmVzdWx0LnJvd3MubGVuZ3RofSByZXZhbGlkYXRpb24gbG9nIHJvd3MgKCR7YXBwbGllZH0gYXBwbGllZClgLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRhZ3MgdG8gcmVhZCBvbiB0aGlzIHJlZnJlc2gsIGF0IG1vc3Qgb25lIGBCYXRjaEdldEl0ZW1gJ3Mgd29ydGg6XG4gICAqIHRob3NlIHdob3NlIHJlYWQgZmFpbGVkLCB0aGVuIHRob3NlIHdob3NlIHJlLXJlYWQgaGFzIGNvbWUgZHVlLCBpbiB0aGVcbiAgICogb3JkZXIgdGhleSB3ZXJlIGxhc3QgcmVhZC5cbiAgICovXG4gIHByaXZhdGUgZHVlKGF0OiBudW1iZXIpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZHVlOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgdGFnIG9mIHRoaXMudW5yZWFkKSB7XG4gICAgICBpZiAoZHVlLmxlbmd0aCA+PSBCQVRDSF9HRVRfTUFYX0tFWVMpIHJldHVybiBkdWU7XG4gICAgICBkdWUucHVzaCh0YWcpO1xuICAgIH1cbiAgICAvLyBLbm93biBpbiB0aW1lIG9yZGVyLCBhbmQgZWFjaCBkdWUgYXQgbW9zdCBgaml0dGVyYCBlYXJsaWVyIHRoYW4gdGhlXG4gICAgLy8gdGFncyBhZnRlciBpdDogcGFzdCBhIHRhZyBkdWUgbW9yZSB0aGFuIHRoYXQgZnJvbSBub3csIG5vbmUgaXMgZHVlLlxuICAgIGNvbnN0IGppdHRlciA9IHRoaXMucmVzeW5jSW50ZXJ2YWxNcyAqIFRBR19SRVNZTkNfSklUVEVSO1xuICAgIGZvciAoY29uc3QgW3RhZywgZHVlQXRdIG9mIHRoaXMuZHVlQXQpIHtcbiAgICAgIGlmIChkdWUubGVuZ3RoID49IEJBVENIX0dFVF9NQVhfS0VZUyB8fCBkdWVBdCAtIGppdHRlciA+IGF0KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGR1ZUF0IDw9IGF0ICYmICF0aGlzLnVucmVhZC5oYXModGFnKSkge1xuICAgICAgICBkdWUucHVzaCh0YWcpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcmdldCBldmVyeSB0cmFja2VkIG1hcmtlciwgYW5kIGZvbGxvdyB0aGUgbG9nIGZyb20gYGF0YDogd2hhdCBpcyBuZWVkZWRcbiAgICogbmV4dCBpcyByZWFkIGZyb20gaXRzIG1hcmtlciBhcyBpdCBpcyBuZWVkZWQsIHNwcmVhZCBvdmVyIHRoZSByZXF1ZXN0c1xuICAgKiB0aGF0IG5lZWQgaXQsIHJhdGhlciB0aGFuIGV2ZXJ5IHRyYWNrZWQgdGFnIHJlLXJlYWQgYXQgb25jZS5cbiAgICovXG4gIHByaXZhdGUgZm9yZ2V0KGF0OiBudW1iZXIsIHdoeTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kZWJ1ZyhgZm9yZ2V0dGluZyAke3RoaXMudGFncy5zaXplfSB0cmFja2VkIHRhZ3M6ICR7d2h5fWApO1xuICAgIHRoaXMudGFncy5jbGVhcigpO1xuICAgIHRoaXMuZHVlQXQuY2xlYXIoKTtcbiAgICB0aGlzLnVucmVhZC5jbGVhcigpO1xuICAgIHRoaXMuYXBwbGllZC5jbGVhcigpO1xuICAgIHRoaXMuY3Vyc29yID0gYXQgLSBSRVZBTElEQVRJT05fTE9HX0xPT0tCQUNLX01TO1xuICAgIHRoaXMubGFzdExvZ1JlYWQgPSBhdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIHRoZSBjdXJzb3IgZm9yd2FyZCB0byBgY3Vyc29yYCwgZm9yZ2V0dGluZyBhcHBsaWVkIHJvd3MgYmVmb3JlIGl0OlxuICAgKiBubyBxdWVyeSByZXR1cm5zIHRoZW0gYWdhaW4uXG4gICAqL1xuICBwcml2YXRlIGFkdmFuY2UoY3Vyc29yOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoY3Vyc29yIDw9IHRoaXMuY3Vyc29yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY3Vyc29yID0gY3Vyc29yO1xuICAgIGZvciAoY29uc3QgW3NrLCBhdF0gb2YgdGhpcy5hcHBsaWVkKSB7XG4gICAgICBpZiAoYXQgPCBjdXJzb3IpIHtcbiAgICAgICAgdGhpcy5hcHBsaWVkLmRlbGV0ZShzayk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgYHRhZ3NgIGZyb20gdGhlIHRhYmxlLCBhbmQgcmVwb3J0IHdoZXRoZXIgdGhhdCB3b3JrZWQuIEEgcmVhZCB0aGF0XG4gICAqIGZhaWxzIGxlYXZlcyB0aGVtIHRyYWNrZWQgYXMgdGhleSB3ZXJlLCBhbmQgdGhlIG5leHQgcmVmcmVzaCByZWFkcyB0aGVtXG4gICAqIGFnYWluOiB0aGUgc2FtZSBcImFzc3VtZSB0aGUgZW50cnkgaXMgdmFsaWRcIiB0aGUgaW5jcmVtZW50YWwgY2FjaGUgaGFzXG4gICAqIGFsd2F5cyBhbnN3ZXJlZCB3aXRoLCByYXRoZXIgdGhhbiBhIHJlYWQgb24gZXZlcnkgcmVxdWVzdCB3aGlsZSBEeW5hbW9EQlxuICAgKiBpcyB1bmF2YWlsYWJsZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVhZEludG8odGFnczogc3RyaW5nW10pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGFncy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBhdCA9IHRoaXMuY2xvY2soKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVhZCA9IGF3YWl0IHRoaXMubWFya2VycyEucmVhZCh0YWdzKTtcbiAgICAgIGZvciAoY29uc3QgdGFnIG9mIHRhZ3MpIHtcbiAgICAgICAgdGhpcy51bnJlYWQuZGVsZXRlKHRhZyk7XG4gICAgICAgIHRoaXMucmVtZW1iZXIoXG4gICAgICAgICAgdGFnLFxuICAgICAgICAgIG1lcmdlTWFya2VycyhcbiAgICAgICAgICAgIG1lcmdlTWFya2Vycyh0aGlzLnRhZ3MuZ2V0KHRhZyksIHJlYWQuZ2V0KHRhZykpLFxuICAgICAgICAgICAgdGhpcy50YWtlUGVuZGluZ1Jvd3ModGFnKSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmtub3duKHRhZywgYXQpO1xuICAgICAgfVxuICAgICAgdGhpcy5kZWJ1ZyhgcmVhZCAke3RhZ3MubGVuZ3RofSB0YWcgbWFya2VycyAoJHtyZWFkLnNpemV9IHNldClgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgcmVhZGluZyB0YWcgbWFya2VyczpcIiwgZXJyb3IpO1xuICAgICAgdGhpcy50cmFja1VucmVhZCh0YWdzKTtcbiAgICAgIGZvciAoY29uc3QgdGFnIG9mIHRhZ3MpIHtcbiAgICAgICAgdGhpcy51bnJlYWQuYWRkKHRhZyk7XG4gICAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnRha2VQZW5kaW5nUm93cyh0YWcpO1xuICAgICAgICBpZiAocGVuZGluZykge1xuICAgICAgICAgIHRoaXMucmVtZW1iZXIodGFnLCBtZXJnZU1hcmtlcnModGhpcy50YWdzLmdldCh0YWcpLCBwZW5kaW5nKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRha2VQZW5kaW5nUm93cyh0YWc6IHN0cmluZyk6IFRhZ01hcmtlciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZ1Jvd3MuZ2V0KHRhZyk7XG4gICAgdGhpcy5wZW5kaW5nUm93cy5kZWxldGUodGFnKTtcbiAgICByZXR1cm4gcGVuZGluZztcbiAgfVxuXG4gIC8qKiBSZWNvcmQgdGhhdCBgdGFnYCdzIG1hcmtlciB3YXMga25vd24gZnJvbSB0aGUgdGFibGUgYXQgYGF0YC4gKi9cbiAgcHJpdmF0ZSBrbm93bih0YWc6IHN0cmluZywgYXQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZHVlQXQuZGVsZXRlKHRhZyk7XG4gICAgdGhpcy5kdWVBdC5zZXQoXG4gICAgICB0YWcsXG4gICAgICBhdCArIHRoaXMucmVzeW5jSW50ZXJ2YWxNcyAqICgxIC0gVEFHX1JFU1lOQ19KSVRURVIgKiB0aGlzLnJhbmRvbSgpKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1lbWJlcih0YWc6IHN0cmluZywgbWFya2VyOiBUYWdNYXJrZXIpOiB2b2lkIHtcbiAgICB0aGlzLnRhZ3MuZGVsZXRlKHRhZyk7XG4gICAgdGhpcy50YWdzLnNldCh0YWcsIG1hcmtlcik7XG4gICAgZm9yIChjb25zdCBvbGRlc3Qgb2YgdGhpcy50YWdzLmtleXMoKSkge1xuICAgICAgaWYgKHRoaXMudGFncy5zaXplIDw9IHRoaXMubWF4VHJhY2tlZFRhZ3MpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB0aGlzLnRhZ3MuZGVsZXRlKG9sZGVzdCk7XG4gICAgICB0aGlzLmR1ZUF0LmRlbGV0ZShvbGRlc3QpO1xuICAgICAgdGhpcy51bnJlYWQuZGVsZXRlKG9sZGVzdCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0b3VjaCh0YWc6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG1hcmtlciA9IHRoaXMudGFncy5nZXQodGFnKTtcbiAgICBpZiAobWFya2VyKSB7XG4gICAgICB0aGlzLnJlbWVtYmVyKHRhZywgbWFya2VyKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgbG9uZ2VzdCBhIGxvZyByb3cncyBwdXQgbWF5IHRha2UgYW5kIHN0aWxsIGJlIHNlZW4gYnkgZXZlcnkgcmVhZGVyOiBoYWxmXG4gKiB0aGUgbG9va2JhY2ssIGxlYXZpbmcgdGhlIHJlc3QgZm9yIHdyaXRlcnMnIGNsb2NrcyBhbmQgZXZlbnR1YWxseSBjb25zaXN0ZW50XG4gKiBxdWVyaWVzLlxuICovXG5jb25zdCBNQVhfTE9HX1BVVF9NUyA9IFJFVkFMSURBVElPTl9MT0dfTE9PS0JBQ0tfTVMgLyAyO1xuXG4vKipcbiAqIEEgbWFya2VyIGFzIHJlYWQgZnJvbSB0aGUgdGFibGUgb3IgdGhlIGxvZywga2VlcGluZyB3aGF0ZXZlciB0aGlzIGluc3RhbmNlXG4gKiBhbHJlYWR5IGtub3dzIHRoYXQgdGhlIHJlYWQgZG9lcyBub3Qgc2hvdyB5ZXQ6IHJlYWRzIGFyZSBldmVudHVhbGx5XG4gKiBjb25zaXN0ZW50LCBhbmQgYSByZWFkIHN0cmFpZ2h0IGFmdGVyIHRoaXMgaW5zdGFuY2UncyBvd24gcmV2YWxpZGF0aW9uIGNvdWxkXG4gKiBvdGhlcndpc2UgdGFrZSBpdCBiYWNrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VNYXJrZXJzKFxuICBsb2NhbDogVGFnTWFya2VyIHwgdW5kZWZpbmVkLFxuICByZW1vdGU6IFRhZ01hcmtlciB8IHVuZGVmaW5lZCxcbik6IFRhZ01hcmtlciB7XG4gIGlmICghbG9jYWwpIHtcbiAgICByZXR1cm4gcmVtb3RlID8/IHt9O1xuICB9XG4gIGlmICghcmVtb3RlKSB7XG4gICAgcmV0dXJuIGxvY2FsO1xuICB9XG4gIC8vIGBleHBpcmVkQXRgIGlzIHdyaXR0ZW4gd2l0aCBgc3RhbGVBdGAsIHNvIGl0IGJlbG9uZ3MgdG8gd2hpY2hldmVyIGlzXG4gIC8vIG5ld2VyIC0gdW5sZXNzIHRoYXQgcmV2YWxpZGF0aW9uJ3MgcHJvZmlsZSBoYWQgbm8gYGV4cGlyZWAgYW5kIGxlZnQgaXQuXG4gIGNvbnN0IFtvbGRlciwgbmV3ZXJdID1cbiAgICAobG9jYWwuc3RhbGVBdCA/PyAtMSkgPiAocmVtb3RlLnN0YWxlQXQgPz8gLTEpXG4gICAgICA/IFtyZW1vdGUsIGxvY2FsXVxuICAgICAgOiBbbG9jYWwsIHJlbW90ZV07XG4gIHJldHVybiB7XG4gICAgLi4uYXBwbHlNYXJrZXIob2xkZXIsIG5ld2VyKSxcbiAgICByZXZhbGlkYXRlZEF0OiBtYXhEZWZpbmVkKGxvY2FsLnJldmFsaWRhdGVkQXQsIHJlbW90ZS5yZXZhbGlkYXRlZEF0KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gbWF4RGVmaW5lZChhOiBudW1iZXIgfCB1bmRlZmluZWQsIGI6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICBpZiAoYSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gYjtcbiAgaWYgKGIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGE7XG4gIHJldHVybiBNYXRoLm1heChhLCBiKTtcbn1cblxuLyoqXG4gKiBUaGUgY2FjaGUgYnVja2V0LCBhcyB0aGUgaGFuZGxlcnMgdXNlIGl0OiB3aG9sZSBvYmplY3RzIHJlYWQgYW5kIHdyaXR0ZW4gYXNcbiAqIFVURi04IHRleHQgdW5kZXIgdGhlIGtleXMgYWJvdmUuXG4gKi9cbmV4cG9ydCBjbGFzcyBDYWNoZUJ1Y2tldCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBTM0NsaWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJ1Y2tldE5hbWU6IHN0cmluZyxcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBUaGUgYm9keSBvZiB0aGUgb2JqZWN0IGF0IGBrZXlgLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGlzIG5vbmUgKGBOb1N1Y2hLZXlgLCBvciBhblxuICAgKiBlbXB0eSByZXNwb25zZSBib2R5KS4gQW55IG90aGVyIGVycm9yIGlzIHRocm93bjogdGhlIGhhbmRsZXJzIGRpc2FncmVlIG9uXG4gICAqIHdoZXRoZXIgb25lIGlzIHdvcnRoIGxvZ2dpbmcuXG4gICAqL1xuICBhc3luYyBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LnNlbmQoXG4gICAgICAgIG5ldyBHZXRPYmplY3RDb21tYW5kKHsgQnVja2V0OiB0aGlzLmJ1Y2tldE5hbWUsIEtleToga2V5IH0pLFxuICAgICAgKTtcbiAgICAgIGlmICghcmVzcG9uc2UuQm9keSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3BvbnNlLkJvZHkudHJhbnNmb3JtVG9TdHJpbmcoXCJ1dGYtOFwiKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9TdWNoS2V5KSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKiogV3JpdGUgYGJvZHlgIGFzIGEgSlNPTiBvYmplY3QgYXQgYGtleWAuICovXG4gIGFzeW5jIHB1dEpzb24oa2V5OiBzdHJpbmcsIGJvZHk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY2xpZW50LnNlbmQoXG4gICAgICBuZXcgUHV0T2JqZWN0Q29tbWFuZCh7XG4gICAgICAgIEJ1Y2tldDogdGhpcy5idWNrZXROYW1lLFxuICAgICAgICBLZXk6IGtleSxcbiAgICAgICAgQm9keTogYm9keSxcbiAgICAgICAgQ29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFwiLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxufVxuIl19
|
|
1035
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWNhY2hlLXN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FkYXB0ZXIvYXdzLWNhY2hlLXN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQStDQSxzREFPQztBQVNELGdDQUVDO0FBR0Qsa0NBRUM7QUFtQkQsc0NBRUM7QUFxQ0Qsa0NBZ0JDO0FBV0Qsa0NBRUM7QUFXRCw4QkFXQztBQVFELGtDQVdDO0FBR0Qsb0NBZUM7QUF5Q0QsOEJBRUM7QUFZRCxnQ0FFQztBQXM0QkQsb0NBb0JDO0FBM3FDRDs7Ozs7Ozs7O0VBU0U7QUFDRixzREFBc0Q7QUFDdEQseUNBQWlDO0FBQ2pDLDhEQVNrQztBQUNsQyxrREFLNEI7QUFDNUIsK0NBQTZFO0FBa0I3RSw4Q0FBOEM7QUFDOUMsU0FBZ0IscUJBQXFCO0lBQ25DLE9BQU87UUFDTCxVQUFVLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsSUFBSSxFQUFFO1FBQzFELFNBQVMsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxJQUFJLEVBQUU7UUFDL0QsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLFdBQVc7UUFDN0MsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLElBQUksRUFBRTtLQUMvQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLFVBQVUsQ0FBQyxPQUFlLEVBQUUsUUFBZ0I7SUFDMUQsT0FBTyxJQUFBLGdCQUFJLEVBQUMsT0FBTyxFQUFFLElBQUEsOEJBQWdCLEVBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBRUQsbUZBQW1GO0FBQ25GLFNBQWdCLFdBQVcsQ0FBQyxPQUFlLEVBQUUsUUFBZ0I7SUFDM0QsT0FBTyxJQUFBLGdCQUFJLEVBQUMsT0FBTyxFQUFFLElBQUEsNkJBQWUsRUFBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBQ2xELENB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Q0FBQztRQUN4RCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksS0FBSyxZQUFZLHFCQUFTLEVBQUUsQ0FBQztnQkFDL0IsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztZQUNELE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRCw4Q0FBOEM7SUFDOUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFXLEVBQUUsSUFBWTtRQUNyQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNwQixJQUFJLDRCQUFnQixDQUFDO1lBQ25CLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVTtZQUN2QixHQUFHLEVBQUUsR0FBRztZQUNSLElBQUksRUFBRSxJQUFJO1lBQ1YsV0FBVyxFQUFFLGlDQUFpQztTQUMvQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXZDRCxrQ0F1Q0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICBUaGUgUzMgLyBEeW5hbW9EQiBwbHVtYmluZyBzaGFyZWQgYnkgZXZlcnkgY2RrLW5leHRqcyBjYWNoZSBoYW5kbGVyOiB0aGVcbiAgaW5jcmVtZW50YWwgYGNhY2hlSGFuZGxlcmAgKGBTM0NhY2hlSGFuZGxlcmApIGFuZCB0aGUgYGNhY2hlSGFuZGxlcnNgIGZvclxuICBgJ3VzZSBjYWNoZSdgIC8gYCd1c2UgY2FjaGU6IHJlbW90ZSdgLlxuXG4gIFdoYXQgbGl2ZXMgaGVyZSBpcyB3aGF0IGhhcyB0byBhZ3JlZSBiZXR3ZWVuIHRoZW0gLSB3aGVyZSB0aGUgY29uZmlndXJhdGlvblxuICBjb21lcyBmcm9tLCBob3cgYSBjYWNoZSBrZXkgYmVjb21lcyBhbiBTMyBrZXksIGFuZCB3aGF0IGEgdGFnJ3MgbWFya2VyIHJvdyBpblxuICB0aGUgcmV2YWxpZGF0aW9uIHRhYmxlIGxvb2tzIGxpa2UgYW5kIG1lYW5zLiBBIGByZXZhbGlkYXRlVGFnYCByZWFjaGVzIGJvdGhcbiAga2luZHMgb2YgaGFuZGxlciwgYW5kIHRoZXkgbXVzdCByZWFkIGVhY2ggb3RoZXIncyBtYXJrZXJzIHRoZSBzYW1lIHdheS5cbiovXG4vKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQge1xuICBBdHRyaWJ1dGVWYWx1ZSxcbiAgQmF0Y2hHZXRJdGVtQ29tbWFuZCxcbiAgQmF0Y2hHZXRJdGVtQ29tbWFuZE91dHB1dCxcbiAgRHluYW1vREJDbGllbnQsXG4gIFB1dEl0ZW1Db21tYW5kLFxuICBRdWVyeUNvbW1hbmQsXG4gIFF1ZXJ5Q29tbWFuZE91dHB1dCxcbiAgVXBkYXRlSXRlbUNvbW1hbmQsXG59IGZyb20gXCJAYXdzLXNkay9jbGllbnQtZHluYW1vZGJcIjtcbmltcG9ydCB7XG4gIEdldE9iamVjdENvbW1hbmQsXG4gIE5vU3VjaEtleSxcbiAgUHV0T2JqZWN0Q29tbWFuZCxcbiAgUzNDbGllbnQsXG59IGZyb20gXCJAYXdzLXNkay9jbGllbnQtczNcIjtcbmltcG9ydCB7IGNhY2hlS2V5RmlsZU5hbWUsIGNhY2hlT2JqZWN0TmFtZSwgc2hhMjU2SGV4IH0gZnJvbSBcIi4vY2FjaGUtdXRpbHNcIjtcblxuLyoqXG4gKiBXaGVyZSB0aGUgY2FjaGUgbGl2ZXMsIGFzIHRoZSBjb25zdHJ1Y3RzIHBhc3MgaXQgdG8gdGhlIGNvbXB1dGUgdGhyb3VnaCB0aGVcbiAqIGVudmlyb25tZW50IChgTmV4dGpzRnVuY3Rpb25zYCwgYE5leHRqc0NvbnRhaW5lcnNgKS4gRW1wdHkgc3RyaW5ncyBmb3Igd2hhdCBpc1xuICogbm90IGNvbmZpZ3VyZWQsIHdoaWNoIGVhY2ggaGFuZGxlciByZWFkcyBhcyBcInRoYXQgbGF5ZXIgaXMgZGlzYWJsZWRcIi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBd3NDYWNoZUNvbmZpZyB7XG4gIC8qKiBgQ0RLX05FWFRKU19DQUNIRV9CVUNLRVRfTkFNRWAuICovXG4gIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgLyoqIGBDREtfTkVYVEpTX1JFVkFMSURBVElPTl9UQUJMRV9OQU1FYC4gKi9cbiAgdGFibGVOYW1lOiBzdHJpbmc7XG4gIC8qKiBgQVdTX1JFR0lPTmAsIGB1cy1lYXN0LTFgIHdoZW4gdW5zZXQuICovXG4gIHJlZ2lvbjogc3RyaW5nO1xuICAvKiogYENES19ORVhUSlNfQlVJTERfSURgOiBldmVyeSBTMyBrZXkgYW5kIGV2ZXJ5IG1hcmtlciByb3cgaXMgc2NvcGVkIHRvIGl0LiAqL1xuICBidWlsZElkOiBzdHJpbmc7XG59XG5cbi8qKiBUaGUgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBlbnZpcm9ubWVudC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQXdzQ2FjaGVDb25maWcoKTogQXdzQ2FjaGVDb25maWcge1xuICByZXR1cm4ge1xuICAgIGJ1Y2tldE5hbWU6IHByb2Nlc3MuZW52LkNES19ORVhUSlNfQ0FDSEVfQlVDS0VUX05BTUUgfHwgXCJcIixcbiAgICB0YWJsZU5hbWU6IHByb2Nlc3MuZW52LkNES19ORVhUSlNfUkVWQUxJREFUSU9OX1RBQkxFX05BTUUgfHwgXCJcIixcbiAgICByZWdpb246IHByb2Nlc3MuZW52LkFXU19SRUdJT04gfHwgXCJ1cy1lYXN0LTFcIixcbiAgICBidWlsZElkOiBwcm9jZXNzLmVudi5DREtfTkVYVEpTX0JVSUxEX0lEIHx8IFwiXCIsXG4gIH07XG59XG5cbi8qKlxuICogYHtidWlsZElkfS97Y2FjaGVLZXl9Lmpzb25gLCB0aGUgaW5jcmVtZW50YWwgY2FjaGUncyBrZXkgY29udmVudGlvbi5cbiAqXG4gKiBUaGUgcm9vdCBwYXRoIGJlY29tZXMgYGluZGV4YCwgYW5kIGEgbGVhZGluZyBzbGFzaCBpcyBkcm9wcGVkIHNvIHRoZXJlIGlzIG5vXG4gKiBlbXB0eSBmb2xkZXIgdW5kZXIgdGhlIGJ1aWxkIHByZWZpeC4gRXZlcnl0aGluZyB0aGlzIHJldHVybnMgZW5kcyBpbiBgLmpzb25gLFxuICogd2hpY2ggaXMgd2hhdCBrZWVwcyBpdCBkaXNqb2ludCBmcm9tIHtAbGluayB1c2VDYWNoZVMzS2V5fS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUzNLZXkoYnVpbGRJZDogc3RyaW5nLCBjYWNoZUtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGpvaW4oYnVpbGRJZCwgY2FjaGVLZXlGaWxlTmFtZShjYWNoZUtleSkpO1xufVxuXG4vKiogYHtidWlsZElkfS9gICsge0BsaW5rIGNhY2hlT2JqZWN0TmFtZX06IHRoZSBTMyBvYmplY3QgYW4gZW50cnkgaXMgc3RvcmVkIGluLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHMzT2JqZWN0S2V5KGJ1aWxkSWQ6IHN0cmluZywgY2FjaGVLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBqb2luKGJ1aWxkSWQsIGNhY2hlT2JqZWN0TmFtZShjYWNoZUtleSkpO1xufVxuXG4vKipcbiAqIFRoZSBmb2xkZXIgdW5kZXIgdGhlIGJ1aWxkIHByZWZpeCB0aGF0IGAndXNlIGNhY2hlJ2AgZW50cmllcyBhcmUgc3RvcmVkIGluLlxuICogQHNlZSB1c2VDYWNoZVMzS2V5XG4gKi9cbmV4cG9ydCBjb25zdCBVU0VfQ0FDSEVfS0VZX1BSRUZJWCA9IFwiX3VzZS1jYWNoZVwiO1xuXG4vKipcbiAqIGB7YnVpbGRJZH0vX3VzZS1jYWNoZS97aGFzaH0uZW50cnlgLCB3aGVyZSBhIGBjYWNoZUhhbmRsZXJzYCBlbnRyeSBpcyBzdG9yZWQuXG4gKlxuICogSGFzaGVkIGJlY2F1c2UgYSBgJ3VzZSBjYWNoZSdgIGtleSBpcyB0aGUgc2VyaWFsaXplZCBhcmd1bWVudHMgb2YgdGhlIGNhbGwgYW5kXG4gKiBoYXMgbm8gbGVuZ3RoIGxpbWl0LCB3aGVyZSBhbiBTMyBrZXkgc3RvcHMgYXQgMTAyNCBieXRlcy4gVGhlIGAuZW50cnlgIHN1ZmZpeFxuICogcmF0aGVyIHRoYW4gYC5qc29uYCBpcyB3aGF0IG1ha2VzIGEgY29sbGlzaW9uIHdpdGggdGhlIGluY3JlbWVudGFsIGNhY2hlXG4gKiBpbXBvc3NpYmxlIHJhdGhlciB0aGFuIHVubGlrZWx5OiBldmVyeSBvYmplY3Qge0BsaW5rIHMzT2JqZWN0S2V5fSBuYW1lcyBlbmRzXG4gKiBpbiBgLmpzb25gIG9yIGAubG9uZ2AsIGluY2x1ZGluZyBvbmUgZm9yIGEgcm91dGUgdGhhdCBoYXBwZW5zIHRvIGJlIG5hbWVkXG4gKiBgL191c2UtY2FjaGUv4oCmYC5cbiAqIFN0aWxsIHVuZGVyIHRoZSBidWlsZCBwcmVmaXgsIHNvIHBvc3QtZGVwbG95IHBydW5pbmcgZHJvcHMgdGhlbSB3aXRoIHRoZSBidWlsZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUNhY2hlUzNLZXkoYnVpbGRJZDogc3RyaW5nLCBrZXlIYXNoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gam9pbihidWlsZElkLCBVU0VfQ0FDSEVfS0VZX1BSRUZJWCwgYCR7a2V5SGFzaH0uZW50cnlgKTtcbn1cblxuLyoqXG4gKiBUaGUgYGR1cmF0aW9uc2AgTmV4dC5qcyAxNiBwYXNzZXMgYSB0YWcgcmV2YWxpZGF0aW9uIGZvciBhIHByb2ZpbGU6XG4gKiBgcmV2YWxpZGF0ZVRhZyhcInBvc3RzXCIsIFwibWF4XCIpYCBhcnJpdmVzIGFzIGB7IGV4cGlyZTogPHRoZSBwcm9maWxlJ3MgZXhwaXJlPiB9YC5cbiAqIEFic2VudCBmb3IgYHVwZGF0ZVRhZ2AgYW5kIGEgYmFyZSBgcmV2YWxpZGF0ZVRhZ2AsIHdoaWNoIGV4cGlyZSBpbW1lZGlhdGVseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXZhbGlkYXRlRHVyYXRpb25zIHtcbiAgZXhwaXJlPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEEgdGFnJ3MgbWFya2VyIHJvdywgYXMgdGltZXN0YW1wcyBpbiBtaWxsaXNlY29uZHMuIFdyaXR0ZW4gYnlcbiAqIHtAbGluayBtYXJrZXJVcGRhdGV9OyBlYWNoIGZpZWxkIGlzIGFic2VudCB1bnRpbCBhIHJldmFsaWRhdGlvbiBvZiB0aGF0IHNoYXBlXG4gKiBoYXMgaGFwcGVuZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFnTWFya2VyIHtcbiAgLyoqIEV4cGlyZWQgb3V0cmlnaHQ6IGB1cGRhdGVUYWdgLCBvciBgcmV2YWxpZGF0ZVRhZ2Agd2l0aCBubyBwcm9maWxlLiAqL1xuICByZXZhbGlkYXRlZEF0PzogbnVtYmVyO1xuICAvKiogU3RhbGUgZnJvbSBoZXJlOiBgcmV2YWxpZGF0ZVRhZyh0YWcsIHByb2ZpbGUpYC4gKi9cbiAgc3RhbGVBdD86IG51bWJlcjtcbiAgLyoqIFdoZW4gdGhlIHByb2ZpbGUncyBgZXhwaXJlYCBydW5zIG91dCwgd2hpY2ggbWF5IGJlIGluIHRoZSBmdXR1cmUuICovXG4gIGV4cGlyZWRBdD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBXaGF0IHRoZSB0YWcgbWFya2VycyBzYXkgYWJvdXQgYW4gZW50cnk6IHVudG91Y2hlZCwgc2VydmVkIHN0YWxlIHdoaWxlIGFcbiAqIGJhY2tncm91bmQgcmVuZGVyIHJlcGxhY2VzIGl0LCBvciBleHBpcmVkIGFuZCByZS1yZW5kZXJlZCBiZWZvcmUgYW5zd2VyaW5nLlxuICovXG5leHBvcnQgdHlwZSBSZXZhbGlkYXRpb25TdGF0ZSA9IFwiZnJlc2hcIiB8IFwic3RhbGVcIiB8IFwiZXhwaXJlZFwiO1xuXG4vKipcbiAqIFdoYXQgYG1hcmtlcmAgbWVhbnMgZm9yIGFuIGVudHJ5IGNyZWF0ZWQgYXQgYGNyZWF0ZWRBdGAsIGF0IGBub3dgLlxuICpcbiAqIGBleHBpcmVkQXRgIGluIHRoZSBmdXR1cmUgaXMgYSBwcm9maWxlJ3MgYGV4cGlyZWAgdGhhdCBoYXMgbm90IGNvbWUgeWV0LFxuICogY29tcGFyZWQgdGhlIHdheSBOZXh0LmpzJ3MgYGFyZVRhZ3NFeHBpcmVkYCBkb2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFya2VyU3RhdGUoXG4gIG1hcmtlcjogVGFnTWFya2VyLFxuICBjcmVhdGVkQXQ6IG51bWJlcixcbiAgbm93OiBudW1iZXIsXG4pOiBSZXZhbGlkYXRpb25TdGF0ZSB7XG4gIGNvbnN0IHsgcmV2YWxpZGF0ZWRBdCwgZXhwaXJlZEF0LCBzdGFsZUF0IH0gPSBtYXJrZXI7XG4gIGlmIChcbiAgICAocmV2YWxpZGF0ZWRBdCAhPT0gdW5kZWZpbmVkICYmIHJldmFsaWRhdGVkQXQgPiBjcmVhdGVkQXQpIHx8XG4gICAgKGV4cGlyZWRBdCAhPT0gdW5kZWZpbmVkICYmIGV4cGlyZWRBdCA8PSBub3cgJiYgZXhwaXJlZEF0ID4gY3JlYXRlZEF0KVxuICApIHtcbiAgICByZXR1cm4gXCJleHBpcmVkXCI7XG4gIH1cbiAgaWYgKHN0YWxlQXQgIT09IHVuZGVmaW5lZCAmJiBzdGFsZUF0ID4gY3JlYXRlZEF0KSB7XG4gICAgcmV0dXJuIFwic3RhbGVcIjtcbiAgfVxuICByZXR1cm4gXCJmcmVzaFwiO1xufVxuXG4vKipcbiAqIFRoZSBjbG9jayBldmVyeSB0YWcgbWFya2VyIGlzIHN0YW1wZWQgd2l0aCwgYW5kIGV2ZXJ5IGVudHJ5IHRpbWVzdGFtcCBpdCBpc1xuICogY29tcGFyZWQgYWdhaW5zdDogdGhlIG9uZSBOZXh0LmpzIHN0YW1wcyBgQ2FjaGVFbnRyeS50aW1lc3RhbXBgIHdpdGhcbiAqIChgcGVyZm9ybWFuY2UudGltZU9yaWdpbiArIHBlcmZvcm1hbmNlLm5vdygpYCwgaW4gYHVzZS1jYWNoZS13cmFwcGVyLmpzYCBhbmRcbiAqIHRoZSBkZWZhdWx0IGhhbmRsZXIpLCByYXRoZXIgdGhhbiBgRGF0ZS5ub3coKWAuIEJvdGggaGFuZGxlcnMgd3JpdGUgdGhlIHNhbWVcbiAqIG1hcmtlciByb3dzLCBzbyBib3RoIGhhdmUgdG8gdXNlIGl0OiB0d28gY2xvY2tzIG9uIG9uZSByb3cgbGV0IHRoZSBsYXN0IHdyaXRlclxuICogZGVjaWRlIHdoaWNoIGNsb2NrIHRoZSBvdGhlcnMgY29tcGFyZSBhZ2FpbnN0LCBhbmQgdGhleSBkcmlmdCBhcGFydCBmb3IgYXNcbiAqIGxvbmcgYXMgYSBMYW1iZGEgc2FuZGJveCBvciBGYXJnYXRlIHRhc2sgbGl2ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrZXJDbG9jaygpOiBudW1iZXIge1xuICByZXR1cm4gcGVyZm9ybWFuY2UudGltZU9yaWdpbiArIHBlcmZvcm1hbmNlLm5vdygpO1xufVxuXG4vKipcbiAqIFRoZSBtYXJrZXIgZmllbGRzIGEgdGFnIHJldmFsaWRhdGVkIGF0IGBub3dgIHNldHMuXG4gKlxuICogV2l0aG91dCBgZHVyYXRpb25zYCAtIGB1cGRhdGVUYWdgLCBvciBgcmV2YWxpZGF0ZVRhZ2Agd2l0aCBubyBwcm9maWxlIC0gdGhlXG4gKiB0YWcncyBlbnRyaWVzIGV4cGlyZSBpbW1lZGlhdGVseSAoYHJldmFsaWRhdGVkQXRgKS4gV2l0aCB0aGVtIHRoZSBlbnRyaWVzIGdvXG4gKiBzdGFsZSBub3cgYW5kIGV4cGlyZSBhZnRlciB0aGUgcHJvZmlsZSdzIGBleHBpcmVgLCB0aGUgc2FtZSBwYWlyIG9mXG4gKiB0aW1lc3RhbXBzIE5leHQuanMncyBgRmlsZVN5c3RlbUNhY2hlLnJldmFsaWRhdGVUYWdgIHJlY29yZHMuIEEgcHJvZmlsZSB3aXRoXG4gKiBubyBgZXhwaXJlYCBzZXRzIG9ubHkgYHN0YWxlQXRgLCBhbmQgd2hhdGV2ZXIgYGV4cGlyZWRBdGAgdGhlIHRhZyBoYWQgc3RheXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrZXJGb3IoXG4gIG5vdzogbnVtYmVyLFxuICBkdXJhdGlvbnM6IFJldmFsaWRhdGVEdXJhdGlvbnMgfCB1bmRlZmluZWQsXG4pOiBUYWdNYXJrZXIge1xuICBpZiAoIWR1cmF0aW9ucykge1xuICAgIHJldHVybiB7IHJldmFsaWRhdGVkQXQ6IG5vdyB9O1xuICB9XG4gIGlmIChkdXJhdGlvbnMuZXhwaXJlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4geyBzdGFsZUF0OiBub3cgfTtcbiAgfVxuICByZXR1cm4geyBzdGFsZUF0OiBub3csIGV4cGlyZWRBdDogbm93ICsgZHVyYXRpb25zLmV4cGlyZSAqIDEwMDAgfTtcbn1cblxuY29uc3QgTUFSS0VSX0ZJRUxEUyA9IFtcInJldmFsaWRhdGVkQXRcIiwgXCJzdGFsZUF0XCIsIFwiZXhwaXJlZEF0XCJdIGFzIGNvbnN0O1xuXG4vKipcbiAqIGBleGlzdGluZ2Agd2l0aCB0aGUgZmllbGRzIGB1cGRhdGVgIHNldHMsIGFzIGEge0BsaW5rIG1hcmtlclVwZGF0ZX0gbGVhdmVzXG4gKiB0aGUgcm93OiBhIGZpZWxkIGB1cGRhdGVgIGRvZXMgbm90IHNldCBrZWVwcyBpdHMgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU1hcmtlcihcbiAgZXhpc3Rpbmc6IFRhZ01hcmtlciB8IHVuZGVmaW5lZCxcbiAgdXBkYXRlOiBUYWdNYXJrZXIsXG4pOiBUYWdNYXJrZXIge1xuICBjb25zdCBtYXJrZXIgPSB7IC4uLmV4aXN0aW5nIH07XG4gIGZvciAoY29uc3QgZmllbGQgb2YgTUFSS0VSX0ZJRUxEUykge1xuICAgIGlmICh1cGRhdGVbZmllbGRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1hcmtlcltmaWVsZF0gPSB1cGRhdGVbZmllbGRdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWFya2VyO1xufVxuXG4vKiogVGhlIG1hcmtlci1yb3cgdXBkYXRlIHRoYXQgc2V0cyB7QGxpbmsgbWFya2VyRm9yfSdzIGZpZWxkcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrZXJVcGRhdGUoXG4gIG5vdzogbnVtYmVyLFxuICBkdXJhdGlvbnM6IFJldmFsaWRhdGVEdXJhdGlvbnMgfCB1bmRlZmluZWQsXG4pOiBQaWNrPFxuICBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8dHlwZW9mIFVwZGF0ZUl0ZW1Db21tYW5kPlswXSxcbiAgXCJVcGRhdGVFeHByZXNzaW9uXCIgfCBcIkV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXNcIlxuPiB7XG4gIGNvbnN0IG1hcmtlciA9IG1hcmtlckZvcihub3csIGR1cmF0aW9ucyk7XG4gIGNvbnN0IGZpZWxkcyA9IE1BUktFUl9GSUVMRFMuZmlsdGVyKChmaWVsZCkgPT4gbWFya2VyW2ZpZWxkXSAhPT0gdW5kZWZpbmVkKTtcbiAgcmV0dXJuIHtcbiAgICBVcGRhdGVFeHByZXNzaW9uOiBgU0VUICR7ZmllbGRzLm1hcCgoZmllbGQpID0+IGAke2ZpZWxkfSA9IDoke2ZpZWxkfWApLmpvaW4oXCIsIFwiKX1gLFxuICAgIEV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXM6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIGZpZWxkcy5tYXAoKGZpZWxkKSA9PiBbYDoke2ZpZWxkfWAsIHsgTjogU3RyaW5nKG1hcmtlcltmaWVsZF0pIH1dKSxcbiAgICApLFxuICB9O1xufVxuXG4vKiogQSBEeW5hbW9EQiBudW1iZXIgYXR0cmlidXRlIGFzIGEgbnVtYmVyLCBvciBgdW5kZWZpbmVkYCB3aGVuIGFic2VudC4gKi9cbmZ1bmN0aW9uIG51bWJlckF0dHJpYnV0ZShcbiAgdmFsdWU6IEF0dHJpYnV0ZVZhbHVlIHwgdW5kZWZpbmVkLFxuKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHZhbHVlPy5OID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBOdW1iZXIodmFsdWUuTik7XG59XG5cbi8qKiBUaGUgbWFya2VyIGZpZWxkcyBvZiBhIG1hcmtlciBvciBsb2cgcm93LiAqL1xuZnVuY3Rpb24gbWFya2VyT2YoaXRlbTogUmVjb3JkPHN0cmluZywgQXR0cmlidXRlVmFsdWU+KTogVGFnTWFya2VyIHtcbiAgcmV0dXJuIHtcbiAgICByZXZhbGlkYXRlZEF0OiBudW1iZXJBdHRyaWJ1dGUoaXRlbS5yZXZhbGlkYXRlZEF0KSxcbiAgICBzdGFsZUF0OiBudW1iZXJBdHRyaWJ1dGUoaXRlbS5zdGFsZUF0KSxcbiAgICBleHBpcmVkQXQ6IG51bWJlckF0dHJpYnV0ZShpdGVtLmV4cGlyZWRBdCksXG4gIH07XG59XG5cbi8qKiBEeW5hbW9EQidzIGNhcCBvbiBrZXlzIGluIG9uZSBgQmF0Y2hHZXRJdGVtYC4gKi9cbmV4cG9ydCBjb25zdCBCQVRDSF9HRVRfTUFYX0tFWVMgPSAxMDA7XG5cbi8qKlxuICogSG93IG9mdGVuLCBhdCBtb3N0LCBhbiBpbnN0YW5jZSBjYXRjaGVzIHVwIG9uIHJldmFsaWRhdGlvbnMgb3RoZXIgaW5zdGFuY2VzXG4gKiByYW4sIHVubGVzcyBgQ0RLX05FWFRKU19UQUdfUkVGUkVTSF9NU2Agc2F5cyBvdGhlcndpc2U6IHRoZSBzdGFsZW5lc3Mgd2luZG93XG4gKiBmb3IgYSBgcmV2YWxpZGF0ZVRhZ2AgcnVuIGVsc2V3aGVyZS4gRXZlcnkgY2FjaGUgaGl0IGNoZWNrcyBpdHMgdGFncydcbiAqIG1hcmtlcnMsIGFuZCBldmVyeSBtYXJrZXIgb2YgYSBkZXBsb3ltZW50IHNoYXJlcyBvbmUgcGFydGl0aW9uIGtleSwgc29cbiAqIHJlYWRpbmcgdGhlbSBwZXIgcmVxdWVzdCBjYXBwZWQgYSByb3V0ZSdzIGNhY2hlIGhpdHMgYXQgdGhlIHBhcnRpdGlvbidzIHJlYWRcbiAqIHRocm91Z2hwdXQgKH4xLDkwMCByZXEvcyBvbiBOZXh0anNSZWdpb25hbEZ1bmN0aW9ucykuIE9uY2UgYSBzZWNvbmQsIGZyb20gdGhlXG4gKiByZXZhbGlkYXRpb24gbG9nLCB0aGUgcmVhZHMgc2NhbGUgd2l0aCBpbnN0YW5jZXMgaW5zdGVhZCBvZiByZXF1ZXN0cyBvciB0YWdzLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9UQUdfUkVGUkVTSF9NUyA9IDEwMDA7XG5cbi8qKiBEeW5hbW9EQidzIGxpbWl0IG9uIGEgc29ydCBrZXksIGluIFVURi04IGJ5dGVzLiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9TT1JUX0tFWV9CWVRFUyA9IDEwMjQ7XG5cbi8qKlxuICogYCM8c2hhMjU2KHRhZyk+YCwgc3RhbmRpbmcgaW4gZm9yIGEgdGFnIGluIGEgc29ydCBrZXkgaXQgd291bGQgcHVzaCBwYXN0XG4gKiB7QGxpbmsgTUFYX1NPUlRfS0VZX0JZVEVTfS4gTmV4dC5qcyBjYXBzIHRoZSB0YWdzIGFuIGFwcCBuYW1lcywgYnV0IG5vdCBhblxuICogaW1wbGljaXQgYF9OX1RfL+KApmAgdGFnLCB3aGljaCBpcyBhcyBsb25nIGFzIGl0cyBwYXRoLCBhbmQgYSByZWplY3RlZCB3cml0ZVxuICogbGVmdCBgcmV2YWxpZGF0ZVBhdGhgIG9uIGEgbG9uZyBwYXRoIHJlY29yZGVkIG5vd2hlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoZWRUYWcodGFnOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCMke3NoYTI1NkhleCh0YWcpfWA7XG59XG5cbi8qKlxuICogVGhlIGxvbmdlc3QgdGFnIGEgc29ydCBrZXkgc3BlbGxzIG91dDsgcGFzdCBpdCwge0BsaW5rIHNvcnRLZXlUYWd9IGhhc2hlc1xuICogaXQuIE9uZSBjYXAgZm9yIGV2ZXJ5IHJvdyB0aGUgdGFnIGlzIGluLCBzbyBhIHJvdydzIHdyaXRlciBhbmQgcmVhZGVyIGFncmVlXG4gKiB3aXRob3V0IGVhY2ggd29ya2luZyBvdXQgd2hhdCBlbHNlIHNoYXJlcyBpdHMga2V5LiBJdCBsZWF2ZXMgcm9vbSBmb3IgdGhlXG4gKiBtb3N0IGFueSByb3cgcHV0cyBiZXNpZGUgdGhlIHRhZzogYSBtYXBwaW5nIHJvdydzIGAjPGJ1aWxkSWQ+LyM8c2hhMjU2PmAsXG4gKiB3aXRoIHRoZSBidWlsZCBJRCBjYXBwZWQgYXQgYE1BWF9CVUlMRF9JRF9CWVRFU2AuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfVEFHX0JZVEVTID0gNzY4O1xuXG4vKiogYHRhZ2AgYXMgYSBzb3J0IGtleSBzcGVsbHMgaXQ6IGl0c2VsZiwgb3Ige0BsaW5rIGhhc2hlZFRhZ30gcGFzdCB7QGxpbmsgTUFYX1RBR19CWVRFU30uICovXG5leHBvcnQgZnVuY3Rpb24gc29ydEtleVRhZyh0YWc6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBCdWZmZXIuYnl0ZUxlbmd0aCh0YWcpIDw9IE1BWF9UQUdfQllURVMgPyB0YWcgOiBoYXNoZWRUYWcodGFnKTtcbn1cblxuLyoqXG4gKiBUaGUgYmFyZS10YWcgbWFya2VyIHJvd3Mgb2YgdGhlIHJldmFsaWRhdGlvbiB0YWJsZSAoYHBrID0gYnVpbGRJZGAsXG4gKiBgc2sgPSB0YWdgLCBvciB7QGxpbmsgaGFzaGVkVGFnfSBwYXN0IHtAbGluayBNQVhfVEFHX0JZVEVTfSksIHdoaWNoIHJlY29yZCB3aGVuIGEgdGFnXG4gKiB3YXMgbGFzdCByZXZhbGlkYXRlZCBhbmQgaG93LlxuICpcbiAqIFRoZSB0YWJsZSBhbHNvIGhvbGRzIHRoZSBpbmNyZW1lbnRhbCBjYWNoZSdzIGB0YWcjczNLZXlgIG1hcHBpbmcgcm93cywgd2hpY2hcbiAqIGFyZSBpdHMgb3duIGJ1c2luZXNzIGFuZCBzdGF5IGluIGBTM0NhY2hlSGFuZGxlcmA6IG9ubHkgdGhlIG1hcmtlcnMgbWVhbiB0aGVcbiAqIHNhbWUgdGhpbmcgdG8gZXZlcnkgaGFuZGxlci4gV2hhdCBhbiBpbnN0YW5jZSBrZWVwcyBvZiB0aGVtIGJldHdlZW4gcmVhZHMgaXNcbiAqIHtAbGluayBUcmFja2VkVGFnTWFya2Vyc30uXG4gKi9cbmV4cG9ydCBjbGFzcyBUYWdNYXJrZXJUYWJsZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBEeW5hbW9EQkNsaWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYnVpbGRJZDogc3RyaW5nLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIFJlY29yZCBgdGFnYCdzIHJldmFsaWRhdGlvbiBhdCBgbm93YC4gU2VlIHtAbGluayBtYXJrZXJVcGRhdGV9LlxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSByb3cgYXMgdGhpcyB3cml0ZSBsZWZ0IGl0LCBzbyB0aGUgaW5zdGFuY2UgdGhhdCB3cm90ZSBpdCBjYW5cbiAgICogdHJhY2sgaXQgcmF0aGVyIHRoYW4gcmVhZCBpdCBiYWNrOiByZWFkcyBhcmUgZXZlbnR1YWxseSBjb25zaXN0ZW50LCBhbmQgYVxuICAgKiByZWFkLWJhY2sgcmFjaW5nIHJlcGxpY2F0aW9uIGNvdWxkIHJldHVybiB0aGUgbWFya2VyIGZyb20gYmVmb3JlIHRoZSB3cml0ZS5cbiAgICovXG4gIGFzeW5jIHdyaXRlKFxuICAgIHRhZzogc3RyaW5nLFxuICAgIG5vdzogbnVtYmVyLFxuICAgIGR1cmF0aW9uczogUmV2YWxpZGF0ZUR1cmF0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxUYWdNYXJrZXIgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LnNlbmQoXG4gICAgICBuZXcgVXBkYXRlSXRlbUNvbW1hbmQoe1xuICAgICAgICBUYWJsZU5hbWU6IHRoaXMudGFibGVOYW1lLFxuICAgICAgICBLZXk6IHtcbiAgICAgICAgICBwazogeyBTOiB0aGlzLmJ1aWxkSWQgfSxcbiAgICAgICAgICBzazogeyBTOiBzb3J0S2V5VGFnKHRhZykgfSxcbiAgICAgICAgfSxcbiAgICAgICAgLi4ubWFya2VyVXBkYXRlKG5vdywgZHVyYXRpb25zKSxcbiAgICAgICAgUmV0dXJuVmFsdWVzOiBcIkFMTF9ORVdcIixcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3BvbnNlPy5BdHRyaWJ1dGVzID8gbWFya2VyT2YocmVzcG9uc2UuQXR0cmlidXRlcykgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG1hcmtlciByb3dzIGZvciBgdGFnc2AgdGhhdCBleGlzdCwgYnkgdGFnLCBpbiBvbmUgYEJhdGNoR2V0SXRlbWAgcGVyXG4gICAqIHtAbGluayBCQVRDSF9HRVRfTUFYX0tFWVN9IHRhZ3MgcmF0aGVyIHRoYW4gYSBgR2V0SXRlbWAgZWFjaDogYSBwYWdlXG4gICAqIGNhcnJpZXMgaXRzIHdob2xlIGltcGxpY2l0IGBfTl9UXy/igKZgIGNoYWluIHBsdXMgdGhlIGFwcCdzIG93biB0YWdzLCBhXG4gICAqIHBhZ2Ugd2l0aCBhIGZldyBmZXRjaGVzIGNoZWNrcyBlYWNoIG9mIHRoZW0gdG9vLCBhbmQgZXZlcnkgb25lIGlzIG9uIHRoZVxuICAgKiByZXF1ZXN0IHBhdGguIEEgdGFnIHdpdGggbm8gcm93IGlzIGFic2VudCBmcm9tIHRoZSByZXN1bHQuXG4gICAqL1xuICBhc3luYyByZWFkKHRhZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBUYWdNYXJrZXI+PiB7XG4gICAgY29uc3QgeyB0YWJsZU5hbWUsIGJ1aWxkSWQgfSA9IHRoaXM7XG4gICAgY29uc3QgdW5pcXVlID0gQXJyYXkuZnJvbShuZXcgU2V0KHRhZ3MpKTtcbiAgICBjb25zdCBtYXJrZXJzID0gbmV3IE1hcDxzdHJpbmcsIFRhZ01hcmtlcj4oKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdW5pcXVlLmxlbmd0aDsgaSArPSBCQVRDSF9HRVRfTUFYX0tFWVMpIHtcbiAgICAgIC8vIEEgaGFzaGVkIHNvcnQga2V5IG5hbWVzIG5vIHRhZywgc28gZWFjaCByb3cgaXMgbWF0Y2hlZCBiYWNrIGJ5IGtleS5cbiAgICAgIGNvbnN0IHRhZ0J5U2sgPSBuZXcgTWFwKFxuICAgICAgICB1bmlxdWVcbiAgICAgICAgICAuc2xpY2UoaSwgaSArIEJBVENIX0dFVF9NQVhfS0VZUylcbiAgICAgICAgICAubWFwKCh0YWcpID0+IFtzb3J0S2V5VGFnKHRhZyksIHRhZ10pLFxuICAgICAgKTtcbiAgICAgIGxldCBrZXlzOiBSZWNvcmQ8c3RyaW5nLCBBdHRyaWJ1dGVWYWx1ZT5bXSB8IHVuZGVmaW5lZCA9IEFycmF5LmZyb20oXG4gICAgICAgIHRhZ0J5U2sua2V5cygpLFxuICAgICAgICAoc2spID0+ICh7IHBrOiB7IFM6IGJ1aWxkSWQgfSwgc2s6IHsgUzogc2sgfSB9KSxcbiAgICAgICk7XG4gICAgICAvLyBgVW5wcm9jZXNzZWRLZXlzYCBpcyBEeW5hbW9EQiBkZWNsaW5pbmcgcGFydCBvZiB0aGUgYmF0Y2ggdW5kZXIgbG9hZDtcbiAgICAgIC8vIGEgbWFya2VyIGxlZnQgdW5yZWFkIGlzIGEgcmV2YWxpZGF0aW9uIG1pc3NlZCwgc28gaXQgaXMgYXNrZWQgYWdhaW4uXG4gICAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsga2V5cz8ubGVuZ3RoICYmIGF0dGVtcHQgPCAzOyBhdHRlbXB0KyspIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2U6IEJhdGNoR2V0SXRlbUNvbW1hbmRPdXRwdXQgPSBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKFxuICAgICAgICAgIG5ldyBCYXRjaEdldEl0ZW1Db21tYW5kKHtcbiAgICAgICAgICAgIFJlcXVlc3RJdGVtczoge1xuICAgICAgICAgICAgICBbdGFibGVOYW1lXToge1xuICAgICAgICAgICAgICAgIEtleXM6IGtleXMsXG4gICAgICAgICAgICAgICAgUHJvamVjdGlvbkV4cHJlc3Npb246IFwic2ssIHJldmFsaWRhdGVkQXQsIHN0YWxlQXQsIGV4cGlyZWRBdFwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHJlc3BvbnNlLlJlc3BvbnNlcz8uW3RhYmxlTmFtZV0gPz8gW10pIHtcbiAgICAgICAgICBjb25zdCB0YWcgPSB0YWdCeVNrLmdldChpdGVtLnNrPy5TID8/IFwiXCIpO1xuICAgICAgICAgIGlmICh0YWcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbWFya2Vycy5zZXQodGFnLCBtYXJrZXJPZihpdGVtKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGtleXMgPSByZXNwb25zZS5VbnByb2Nlc3NlZEtleXM/Llt0YWJsZU5hbWVdPy5LZXlzO1xuICAgICAgfVxuICAgICAgaWYgKGtleXM/Lmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYER5bmFtb0RCIGxlZnQgJHtrZXlzLmxlbmd0aH0gdGFnIG1hcmtlcnMgdW5yZWFkIGFmdGVyIHJldHJ5aW5nYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hcmtlcnM7XG4gIH1cbn1cblxuLyoqXG4gKiBIb3cgbG9uZyBhIHJldmFsaWRhdGlvbiBsb2cgcm93IGlzIGtlcHQgKGB0dGxgLCBlcG9jaCBzZWNvbmRzKS4gRHluYW1vREIgbmV2ZXJcbiAqIGRlbGV0ZXMgYW4gaXRlbSBiZWZvcmUgaXRzIFRUTCwgb25seSBzb21lIHRpbWUgYWZ0ZXIsIHNvIGEgcmVhZGVyIHRoYXQgbGFzdFxuICogcXVlcmllZCBsZXNzIHRoYW4gdGhpcyBsb25nIGFnbyAobGVzcyBhIG1hcmdpbiBmb3Igd3JpdGVycycgY2xvY2tzKSBpcyBzdXJlXG4gKiB0byBmaW5kIGV2ZXJ5IHJvdyBpdCBoYXMgbm90IHNlZW4geWV0LlxuICovXG5leHBvcnQgY29uc3QgUkVWQUxJREFUSU9OX0xPR19UVExfTVMgPSAxNSAqIDYwICogMTAwMDtcblxuLyoqIFRoZSBtb3N0IGBRdWVyeWAgcGFnZXMgb25lIHtAbGluayBSZXZhbGlkYXRpb25Mb2cucXVlcnl9IHJlYWRzLiAqL1xuZXhwb3J0IGNvbnN0IFJFVkFMSURBVElPTl9MT0dfTUFYX1BBR0VTID0gNTtcblxuLyoqIEhvdyBtYW55IHNvcnQga2V5cyB7QGxpbmsgUmV2YWxpZGF0aW9uTG9nLnB1dH0gdHJpZXMgYmVmb3JlIGdpdmluZyB1cC4gKi9cbmNvbnN0IExPR19QVVRfQVRURU1QVFMgPSA1O1xuXG4vKiogRGlnaXRzIGEgbG9nIHJvdydzIHRpbWVzdGFtcCBpcyB6ZXJvLXBhZGRlZCB0bywgc28gc29ydCBrZXlzIHNvcnQgYnkgdGltZS4gKi9cbmNvbnN0IExPR19TS19ESUdJVFMgPSAxNTtcblxuLyoqIEEgcmV2YWxpZGF0aW9uIHJlYWQgYmFjayBmcm9tIHRoZSBsb2cuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldmFsaWRhdGlvbkxvZ1JvdyB7XG4gIC8qKiBUaGUgcm93J3Mgc29ydCBrZXk6IHVuaXF1ZSBwZXIgcmV2YWxpZGF0aW9uIG9mIGEgdGFnLiAqL1xuICBzazogc3RyaW5nO1xuICAvKiogV2hlbiBpdCB3YXMgd3JpdHRlbiwgb24gdGhlIHdyaXRlcidzIGBEYXRlLm5vdygpYC4gKi9cbiAgYXQ6IG51bWJlcjtcbiAgdGFnOiBzdHJpbmc7XG4gIC8qKiBUaGUgbWFya2VyIGZpZWxkcyB0aGUgcmV2YWxpZGF0aW9uIHNldCwgYXMge0BsaW5rIG1hcmtlckZvcn0gcmV0dXJucyB0aGVtLiAqL1xuICBtYXJrZXI6IFRhZ01hcmtlcjtcbn1cblxuLyoqXG4gKiBUaGUgcmV2YWxpZGF0aW9uIGxvZzogb25lIHJvdyBwZXIgdGFnIHJldmFsaWRhdGlvbiAoYHBrID0gPGJ1aWxkSWQ+I2xvZ2AsXG4gKiBgc2sgPSA8RGF0ZS5ub3coKSwgemVyby1wYWRkZWQ+Izx0YWc+YCksIHdoaWNoIGV4cGlyZXMgYWZ0ZXJcbiAqIHtAbGluayBSRVZBTElEQVRJT05fTE9HX1RUTF9NU30uIEEgdGFnIHBhc3Qge0BsaW5rIE1BWF9UQUdfQllURVN9IGlzXG4gKiB7QGxpbmsgaGFzaGVkVGFnfSB0aGVyZSwgYW5kIHNwZWxsZWQgb3V0IGluIHRoZSByb3cncyBgbG9uZ1RhZ2AgaW5zdGVhZC5cbiAqXG4gKiBUaGUgbWFya2VyIHJvd3Mgc3RheSB0aGUgc291cmNlIG9mIHRydXRoLiBUaGUgbG9nIGV4aXN0cyBzbyBhbiBpbnN0YW5jZVxuICogY2FuIGFzayBcIndoYXQgd2FzIHJldmFsaWRhdGVkIHNpbmNlIEkgbGFzdCBsb29rZWQ/XCIgaW4gb25lIGBRdWVyeWAsIGluc3RlYWRcbiAqIG9mIHJlLXJlYWRpbmcgZXZlcnkgdGFnIGl0IHRyYWNrcyB0byBmaW5kIG91dCB0aGF0IGFsbW9zdCBub25lIGNoYW5nZWQuIEV2ZXJ5XG4gKiBtYXJrZXIgcm93IG9mIGEgZGVwbG95bWVudCBzaGFyZXMgb25lIHBhcnRpdGlvbiwgYW5kIHRob3NlIHJlLXJlYWRzIGZyb20gYVxuICogaGFuZGZ1bCBvZiBidXN5IGluc3RhbmNlcyB3ZXJlIGVub3VnaCB0byB0aHJvdHRsZSBpdC5cbiAqXG4gKiBUaGUgc29ydCBrZXkncyB0aW1lc3RhbXAgaXMgdGhlIHdyaXRlcidzIHdhbGwgY2xvY2sgKGBEYXRlLm5vdygpYCksIG5vdCB0aGVcbiAqIHBlcmZvcm1hbmNlIGNsb2NrICh7QGxpbmsgbWFya2VyQ2xvY2t9KSB0aGUgbWFya2VyIHZhbHVlcyBhcmUgc3RhbXBlZCB3aXRoIGJ5IGJvdGhcbiAqIGhhbmRsZXJzOiBpdCBvbmx5IG9yZGVycyByb3dzIGZvciByZWFkZXJzJyBjdXJzb3JzLCB3aGljaCBhcmUgb24gdGhlaXIgb3duXG4gKiB3YWxsIGNsb2NrcywgYW5kIGlzIG5ldmVyIGNvbXBhcmVkIHdpdGggYW4gZW50cnkncyB0aW1lc3RhbXAuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXZhbGlkYXRpb25Mb2cge1xuICBwcml2YXRlIHJlYWRvbmx5IHBrOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IER5bmFtb0RCQ2xpZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgYnVpbGRJZDogc3RyaW5nLFxuICApIHtcbiAgICB0aGlzLnBrID0gYCR7YnVpbGRJZH0jbG9nYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgdGhhdCBgdGFnYCB3YXMgcmV2YWxpZGF0ZWQgYXQgYGF0YCAoYERhdGUubm93KClgKSwgc2V0dGluZyBgbWFya2VyYC5cbiAgICpcbiAgICogVHdvIHJldmFsaWRhdGlvbnMgb2YgYHRhZ2AgaW4gdGhlIHNhbWUgbWlsbGlzZWNvbmQgd291bGQgc2hhcmUgYSBzb3J0IGtleSxcbiAgICogYW5kIHRoZSBzZWNvbmQgd291bGQgb3ZlcndyaXRlIHRoZSBmaXJzdC4gU28gdGhlIHJvdyBpcyBvbmx5IHdyaXR0ZW4gd2hlcmVcbiAgICogaXRzIGtleSBpcyBmcmVlLCBhbmQgb24gYSBjb2xsaXNpb24gaXQgbW92ZXMgdG8gdGhlIG5leHQgbWlsbGlzZWNvbmQsIHVwXG4gICAqIHRvIHtAbGluayBMT0dfUFVUX0FUVEVNUFRTfSB0aW1lcy5cbiAgICovXG4gIGFzeW5jIHB1dCh0YWc6IHN0cmluZywgYXQ6IG51bWJlciwgbWFya2VyOiBUYWdNYXJrZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBza1RhZyA9IHNvcnRLZXlUYWcodGFnKTtcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgOyBhdHRlbXB0KyspIHtcbiAgICAgIGNvbnN0IGl0ZW06IFJlY29yZDxzdHJpbmcsIEF0dHJpYnV0ZVZhbHVlPiA9IHtcbiAgICAgICAgcGs6IHsgUzogdGhpcy5wayB9LFxuICAgICAgICBzazogeyBTOiBgJHtsb2dTa1ByZWZpeChhdCl9IyR7c2tUYWd9YCB9LFxuICAgICAgICB0dGw6IHsgTjogU3RyaW5nKE1hdGguY2VpbCgoYXQgKyBSRVZBTElEQVRJT05fTE9HX1RUTF9NUykgLyAxMDAwKSkgfSxcbiAgICAgICAgLi4uKHNrVGFnICE9PSB0YWcgJiYgeyBsb25nVGFnOiB7IFM6IHRhZyB9IH0pLFxuICAgICAgfTtcbiAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgTUFSS0VSX0ZJRUxEUykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG1hcmtlcltmaWVsZF07XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaXRlbVtmaWVsZF0gPSB7IE46IFN0cmluZyh2YWx1ZSkgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jbGllbnQuc2VuZChcbiAgICAgICAgICBuZXcgUHV0SXRlbUNvbW1hbmQoe1xuICAgICAgICAgICAgVGFibGVOYW1lOiB0aGlzLnRhYmxlTmFtZSxcbiAgICAgICAgICAgIEl0ZW06IGl0ZW0sXG4gICAgICAgICAgICBDb25kaXRpb25FeHByZXNzaW9uOiBcImF0dHJpYnV0ZV9ub3RfZXhpc3RzKHNrKVwiLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8ubmFtZSAhPT1cbiAgICAgICAgICAgIFwiQ29uZGl0aW9uYWxDaGVja0ZhaWxlZEV4Y2VwdGlvblwiIHx8XG4gICAgICAgICAgYXR0ZW1wdCA+PSBMT0dfUFVUX0FUVEVNUFRTXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGF0ID0gTWF0aC5mbG9vcihhdCkgKyAxO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcm93cyB3cml0dGVuIGF0IG9yIGFmdGVyIGBzaW5jZWAgKGBEYXRlLm5vdygpYCksIG9sZGVzdCBmaXJzdC5cbiAgICogYHRydW5jYXRlZGAgd2hlbiB0aGVyZSB3ZXJlIG1vcmUgdGhhbiB7QGxpbmsgUkVWQUxJREFUSU9OX0xPR19NQVhfUEFHRVN9XG4gICAqIHBhZ2VzIG9mIHRoZW0sIGFuZCBgcm93c2AgaXMgb25seSB0aGUgc3RhcnQuXG4gICAqXG4gICAqIEV2ZW50dWFsbHkgY29uc2lzdGVudDogYSByb3cgd3JpdHRlbiBhIG1vbWVudCBhZ28gbWF5IG5vdCBzaG93IHlldCwgd2hpY2hcbiAgICogaXMgd2hhdCB0aGUgcmVhZGVyJ3MgbG9va2JhY2sgaXMgZm9yLlxuICAgKi9cbiAgYXN5bmMgcXVlcnkoXG4gICAgc2luY2U6IG51bWJlcixcbiAgKTogUHJvbWlzZTx7IHJvd3M6IFJldmFsaWRhdGlvbkxvZ1Jvd1tdOyB0cnVuY2F0ZWQ6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IHJvd3M6IFJldmFsaWRhdGlvbkxvZ1Jvd1tdID0gW107XG4gICAgbGV0IHN0YXJ0S2V5OiBSZWNvcmQ8c3RyaW5nLCBBdHRyaWJ1dGVWYWx1ZT4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChsZXQgcGFnZSA9IDA7IHBhZ2UgPCBSRVZBTElEQVRJT05fTE9HX01BWF9QQUdFUzsgcGFnZSsrKSB7XG4gICAgICBjb25zdCByZXNwb25zZTogUXVlcnlDb21tYW5kT3V0cHV0ID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZChcbiAgICAgICAgbmV3IFF1ZXJ5Q29tbWFuZCh7XG4gICAgICAgICAgVGFibGVOYW1lOiB0aGlzLnRhYmxlTmFtZSxcbiAgICAgICAgICBLZXlDb25kaXRpb25FeHByZXNzaW9uOiBcInBrID0gOnBrIEFORCBzayA+PSA6c2luY2VcIixcbiAgICAgICAgICBFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzOiB7XG4gICAgICAgICAgICBcIjpwa1wiOiB7IFM6IHRoaXMucGsgfSxcbiAgICAgICAgICAgIFwiOnNpbmNlXCI6IHsgUzogbG9nU2tQcmVmaXgoTWF0aC5tYXgoMCwgc2luY2UpKSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgUHJvamVjdGlvbkV4cHJlc3Npb246XG4gICAgICAgICAgICBcInNrLCBsb25nVGFnLCByZXZhbGlkYXRlZEF0LCBzdGFsZUF0LCBleHBpcmVkQXRcIixcbiAgICAgICAgICBFeGNsdXNpdmVTdGFydEtleTogc3RhcnRLZXksXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiByZXNwb25zZS5JdGVtcyA/PyBbXSkge1xuICAgICAgICBjb25zdCBzayA9IGl0ZW0uc2s/LlM7XG4gICAgICAgIC8vIGA8ZGlnaXRzPiM8dGFnPmA6IHRoZSB0YWcgaXMgZXZlcnl0aGluZyBhZnRlciB0aGUgZml4ZWQtd2lkdGhcbiAgICAgICAgLy8gdGltZXN0YW1wLCBgI2BzIGluY2x1ZGVkLlxuICAgICAgICBpZiAoc2sgPT09IHVuZGVmaW5lZCB8fCBza1tMT0dfU0tfRElHSVRTXSAhPT0gXCIjXCIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByb3dzLnB1c2goe1xuICAgICAgICAgIHNrLFxuICAgICAgICAgIGF0OiBOdW1iZXIoc2suc2xpY2UoMCwgTE9HX1NLX0RJR0lUUykpLFxuICAgICAgICAgIHRhZzogaXRlbS5sb25nVGFnPy5TID8/IHNrLnNsaWNlKExPR19TS19ESUdJVFMgKyAxKSxcbiAgICAgICAgICBtYXJrZXI6IG1hcmtlck9mKGl0ZW0pLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHN0YXJ0S2V5ID0gcmVzcG9uc2UuTGFzdEV2YWx1YXRlZEtleTtcbiAgICAgIGlmICghc3RhcnRLZXkpIHtcbiAgICAgICAgcmV0dXJuIHsgcm93cywgdHJ1bmNhdGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyByb3dzLCB0cnVuY2F0ZWQ6IHRydWUgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBsb2dTa1ByZWZpeChhdDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIFN0cmluZyhNYXRoLmZsb29yKGF0KSkucGFkU3RhcnQoTE9HX1NLX0RJR0lUUywgXCIwXCIpO1xufVxuXG4vKipcbiAqIEhvdyBmYXIgYmVoaW5kIHRoZSBsYXN0IHF1ZXJ5J3Mgc3RhcnQgdGhlIG5leHQgb25lIHN0YXJ0cyByZWFkaW5nIHRoZSBsb2c6XG4gKiB0aGUgcm9vbSBmb3IgdGhlIGBRdWVyeWAgYmVpbmcgZXZlbnR1YWxseSBjb25zaXN0ZW50IGFuZCBmb3Igd3JpdGVycycgY2xvY2tzXG4gKiBydW5uaW5nIGJlaGluZCB0aGUgcmVhZGVyJ3MuIFJvd3MgaW5zaWRlIGl0IGFyZSByZWFkIGFnYWluLCBhbmQgZHJvcHBlZCBhc1xuICogYWxyZWFkeSBhcHBsaWVkLlxuICovXG5leHBvcnQgY29uc3QgUkVWQUxJREFUSU9OX0xPR19MT09LQkFDS19NUyA9IDUwMDA7XG5cbi8qKlxuICogVGhlIGxvbmdlc3Qge0BsaW5rIFRyYWNrZWRUYWdNYXJrZXJzfSB0cnVzdHMgdGhlIGxvZyBhbG9uZSBmb3IgYSB0YWcgYmVmb3JlXG4gKiByZWFkaW5nIGl0cyBtYXJrZXIgcm93IGFnYWluLiBUaGUgbG9nIGlzIHRoZSBmYXN0IHBhdGgsIGJ1dCB0aGUgbWFya2VyIHJvd3NcbiAqIGFyZSB0aGUgc291cmNlIG9mIHRydXRoOiBhIGxvZyByb3cgd2hvc2Ugd3JpdGUgZmFpbGVkIHdvdWxkIG90aGVyd2lzZSBiZVxuICogbWlzc2VkIGZvciBhcyBsb25nIGFzIHRoZSB0YWcgc3RheXMgdHJhY2tlZC5cbiAqXG4gKiBSb2xsaW5nLCBub3QgYWxsIGF0IG9uY2U6IGVhY2ggcmVmcmVzaCByZS1yZWFkcyBhdCBtb3N0XG4gKiB7QGxpbmsgQkFUQ0hfR0VUX01BWF9LRVlTfSBvZiB0aGUgdGFncyBkdWUsIG9sZGVzdCBmaXJzdC4gUmUtcmVhZGluZyB0aGVtIGFsbFxuICogdG9nZXRoZXIgY29zdCB+NTAwIFJDVSBhdCAxMDAwIHRhZ3MgLSBhIGZsZWV0IHN0YXJ0ZWQgYnkgb25lIGxvYWQgdGVzdCBkaWQgaXRcbiAqIGluIHRoZSBzYW1lIG1pbnV0ZSwgMTIsODAwIFJDVSwgYW5kIHRocm90dGxlZCAtIGFuZCB3b3VsZCBiZSB+NSwwMDAgUkNVIGF0XG4gKiB7QGxpbmsgREVGQVVMVF9NQVhfVFJBQ0tFRF9UQUdTfSwgcGFzdCB3aGF0IHRoZSBvbmUgcGFydGl0aW9uIHNlcnZlcyBpbiBhXG4gKiBzZWNvbmQuIFNwcmVhZCBvdXQsIDEwLDAwMCB0cmFja2VkIHRhZ3MgY29zdCB+OCBSQ1UgYSBzZWNvbmQgcGVyIGluc3RhbmNlLlxuICpcbiAqIEVhY2ggdGFnIGlzIGR1ZSBhdCBhIHJhbmRvbSA3NS0xMDAlIG9mIHRoaXMgYWZ0ZXIgaXQgd2FzIGxhc3QgcmVhZCwgc28gdGFnc1xuICogZmlyc3QgcmVhZCB0b2dldGhlciAtIGFuIGluc3RhbmNlIHdhcm1pbmcgdXAgLSBkbyBub3QgYWxsIGNvbWUgZHVlIHRvZ2V0aGVyXG4gKiBhZ2FpbiBldmVyeSBpbnRlcnZhbDogdGhlIGxvYWQgdGVzdCB0aGF0IG1lYXN1cmVkIHRoZSByb2xsaW5nIHJlLXJlYWQgc2F3XG4gKiBpdHMgd2FybS11cCdzIHJlYWRzIHJldHVybiBhcyBhIDMwLTM2IFJDVS9zIGJ1bXAgdGVuIG1pbnV0ZXMgbGF0ZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RBR19SRVNZTkNfTVMgPSAxMCAqIDYwICogMTAwMDtcblxuLyoqIFRoZSBmcmFjdGlvbiBvZiB7QGxpbmsgREVGQVVMVF9UQUdfUkVTWU5DX01TfSBhIHRhZyBtYXkgY29tZSBkdWUgZWFybHkgYnkuICovXG5jb25zdCBUQUdfUkVTWU5DX0pJVFRFUiA9IDAuMjU7XG5cbi8qKlxuICogSG93IGxvbmcgc2luY2UgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBsb2cgcXVlcnkgdGhlIGxvZyBjYW4gc3RpbGwgYmUgdHJ1c3RlZCB0b1xuICogaG9sZCBldmVyeSByb3cgbm90IHJlYWQgeWV0OiBpdHMgVFRMIGxlc3MgYSBtYXJnaW4gZm9yIHdyaXRlcnMnIGNsb2Nrcy4gUGFzdFxuICogaXQgLSBhIExhbWJkYSBmcm96ZW4gYmV0d2VlbiBpbnZvY2F0aW9ucywgYSBydW4gb2YgZmFpbGVkIHF1ZXJpZXMgLSB0aGVcbiAqIHRyYWNrZWQgbWFya2VycyBhcmUgZm9yZ290dGVuLCB0byBiZSByZWFkIGFnYWluIGFzIHRoZXkgYXJlIG5lZWRlZCwgYW5kIHRoZVxuICogbG9nIGlzIGZvbGxvd2VkIGZyb20gdGhlcmUuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfUkVWQUxJREFUSU9OX0xPR19HQVBfTVMgPVxuICBSRVZBTElEQVRJT05fTE9HX1RUTF9NUyAtIDUgKiA2MCAqIDEwMDA7XG5cbi8qKlxuICogVGhlIG1vc3QgdGFncyBvbmUgaW5zdGFuY2UgdHJhY2tzLiBQYXN0IGl0IHRoZSBsZWFzdCByZWNlbnRseSB1c2VkIGlzXG4gKiBmb3Jnb3R0ZW4sIHdoaWNoIGNvc3RzIGEgcmVhZCB0aGUgbmV4dCB0aW1lIGl0IGlzIG5lZWRlZDogYW4gdW50cmFja2VkIHRhZ1xuICogaXMgcmVhZCBiZWZvcmUgaXQgaXMgdHJ1c3RlZC5cbiAqXG4gKiBBIHRyYWNrZWQgdGFnIGNvc3RzIG1lbW9yeSAofjIgTUIgYXQgdGhpcyBib3VuZCkgYW5kIGl0cyBzaGFyZSBvZiB0aGUgcm9sbGluZ1xuICogcmUtcmVhZCwgbm90IGEgcmVhZCBldmVyeSByZWZyZXNoLCBzbyB0aGUgYm91bmQgaXMgc2V0IGJ5IGhvdyBtYW55IHRhZ3MgYW5cbiAqIGluc3RhbmNlIHJlYWxseSB1c2VzLiBFdmVyeSBwYXRoIGlzIGEgdGFnIG9mIGl0cyBvd24gKGBfTl9UXy88cGF0aD5gKSwgYW5kIGF0XG4gKiAxMDAwIGFuIGFwcCBvZiAxMDAwIHRhZ2dlZCBwYWdlcyBrZXB0IGV2aWN0aW5nIHdoYXQgaXQgd2FzIGFib3V0IHRvIG5lZWQ6XG4gKiBoYWxmIGl0cyByZXF1ZXN0cyByZS1yZWFkIGEgbWFya2VyLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NQVhfVFJBQ0tFRF9UQUdTID0gMTBfMDAwO1xuXG4vKipcbiAqIFRoZSByZXZhbGlkYXRpb24gdGFibGUncyBtYXJrZXIgcm93cyBhbmQgaXRzIGxvZywgd2hpY2ggYXJlIG9ubHkgZXZlciB1c2VkXG4gKiB0b2dldGhlciwgb3IgbmVpdGhlciBmb3IgdGFncyBsb2NhbCB0byB0aGlzIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCB0eXBlIFRhZ1RhYmxlID1cbiAgfCB7IG1hcmtlcnM6IFRhZ01hcmtlclRhYmxlOyBsb2c6IFJldmFsaWRhdGlvbkxvZyB9XG4gIHwgeyBtYXJrZXJzPzogdW5kZWZpbmVkOyBsb2c/OiB1bmRlZmluZWQgfTtcblxuLyoqIEhvdyB7QGxpbmsgVHJhY2tlZFRhZ01hcmtlcnN9IGlzIGJ1aWx0LiAqL1xuZXhwb3J0IHR5cGUgVHJhY2tlZFRhZ01hcmtlcnNPcHRpb25zID0gVGFnVGFibGUgJiB7XG4gIC8qKlxuICAgKiBIb3cgb2Z0ZW4sIGF0IG1vc3QsIHtAbGluayBUcmFja2VkVGFnTWFya2Vycy5yZWZyZXNofSByZWFkcyBhbnl0aGluZy5cbiAgICogQGRlZmF1bHQgREVGQVVMVF9UQUdfUkVGUkVTSF9NU1xuICAgKi9cbiAgcmVmcmVzaEludGVydmFsTXM/OiBudW1iZXI7XG4gIG1heFRyYWNrZWRUYWdzPzogbnVtYmVyO1xuICAvKiogQHNlZSBERUZBVUxUX1RBR19SRVNZTkNfTVMgKi9cbiAgcmVzeW5jSW50ZXJ2YWxNcz86IG51bWJlcjtcbiAgLyoqIFRoZSB3YWxsIGNsb2NrIHRoZSBsb2cncyBjdXJzb3IgYW5kIHRoZSBpbnRlcnZhbHMgYXJlIGtlcHQgb24uICovXG4gIGNsb2NrPzogKCkgPT4gbnVtYmVyO1xuICAvKiogYE1hdGgucmFuZG9tYCwgZm9yIHdoZW4gZWFjaCB0YWcncyByZS1yZWFkIGNvbWVzIGR1ZS4gKi9cbiAgcmFuZG9tPzogKCkgPT4gbnVtYmVyO1xuICBkZWJ1Zz86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG59O1xuXG4vKipcbiAqIE9uZSBpbnN0YW5jZSdzIGNvcHkgb2YgdGhlIG1hcmtlciByb3dzIG9mIHRoZSB0YWdzIGl0IGhhcyBuZWVkZWQsIGtlcHRcbiAqIGN1cnJlbnQgdGhyb3VnaCB0aGUge0BsaW5rIFJldmFsaWRhdGlvbkxvZ306IHRoZSBwcm9jZXNzJ3Mgb25lIHRhZyBtYW5pZmVzdFxuICogKGBzaGFyZWRUYWdNYW5pZmVzdGApLCBmb3IgdGhlIGAndXNlIGNhY2hlJ2AgaGFuZGxlcnMgYW5kIHRoZSBpbmNyZW1lbnRhbFxuICogY2FjaGUgYWxpa2UuXG4gKlxuICogTmV4dC5qcydzIGJ1aWx0LWluIGAndXNlIGNhY2hlJ2AgaGFuZGxlciBrZWVwcyB0YWdzIGluIGEgbW9kdWxlLWxldmVsIG1hcFxuICogKGB0YWdzLW1hbmlmZXN0LmV4dGVybmFsLmpzYCkgdGhhdCBvbmx5IGl0cyBvd24gYHVwZGF0ZVRhZ3NgIHdyaXRlcywgYW5kIGl0c1xuICogYHJlZnJlc2hUYWdzYCBpcyBhIG5vLW9wLCBzbyBhIGByZXZhbGlkYXRlVGFnYCBvbiBvbmUgaW5zdGFuY2UgbmV2ZXIgcmVhY2hlc1xuICogdGhlIG90aGVyczogdGhleSBrZWVwIHNlcnZpbmcgdGhlIHJldmFsaWRhdGVkIGVudHJ5LCBpbmNsdWRpbmcgaW5zaWRlIHBhZ2VzXG4gKiB0aGF0IGFyZSBiZWluZyByZS1yZW5kZXJlZCAqYmVjYXVzZSogb2YgdGhhdCByZXZhbGlkYXRpb24uIFRoZVxuICogYGNhY2hlSGFuZGxlcnNgIGludGVyZmFjZSdzIGFuc3dlciBpcyBgcmVmcmVzaFRhZ3NgLCBcImNhbGxlZCBiZWZvcmUgc3RhcnRpbmdcbiAqIGEgbmV3IHJlcXVlc3Qg4oCmIHRvIHJlZnJlc2ggdGhlIGxvY2FsIHRhZ3MgbWFuaWZlc3RcIiwgYW5kIHRoaXMgaXMgdGhhdFxuICogbWFuaWZlc3QsIGJhY2tlZCBieSB0aGUgc2FtZSBtYXJrZXIgcm93cyB0aGUgaW5jcmVtZW50YWwgY2FjaGUnc1xuICogYHJldmFsaWRhdGVUYWdgIHdyaXRlcyAoYHBrID0gYnVpbGRJZGAsIGBzayA9IHRhZ2ApLlxuICpcbiAqIFRoZSBjb3N0IGlzIGJvdW5kZWQgcGVyIGluc3RhbmNlLCBub3QgcGVyIHJlcXVlc3Q6XG4gKiAtIHtAbGluayBlbnN1cmV9IHJlYWRzIGEgdGFnJ3MgbWFya2VyIHRoZSBmaXJzdCB0aW1lIGl0IGlzIG5lZWRlZCBhbmQgbm90XG4gKiAgIGFnYWluIHVudGlsIGl0IGlzIGV2aWN0ZWQsIHNvIGEgdGFnIGNvc3RzIG9uZSByZWFkIHBlciBpbnN0YW5jZSwgbm90IG9uZVxuICogICBwZXIgcmVxdWVzdC5cbiAqIC0ge0BsaW5rIHJlZnJlc2h9LCBhdCBtb3N0IG9uY2UgcGVyIGByZWZyZXNoSW50ZXJ2YWxNc2AsIHNlbmRzIG9uZSBgUXVlcnlgXG4gKiAgIGZvciB0aGUgbG9nIHJvd3Mgd3JpdHRlbiBzaW5jZSB0aGUgbGFzdCBvbmUsIGFuZCBhcHBsaWVzIHRob3NlIG9mIHRhZ3NcbiAqICAgdGhpcyBpbnN0YW5jZSB0cmFja3MuIENvbmN1cnJlbnQgY2FsbGVycyBzaGFyZSBpdC4gQWxvbmdzaWRlLCBpdCByZS1yZWFkc1xuICogICB0aGUgbWFya2VycyBvZiB1cCB0byB7QGxpbmsgQkFUQ0hfR0VUX01BWF9LRVlTfSB0YWdzIG5vdCByZWFkIGZvclxuICogICB7QGxpbmsgREVGQVVMVF9UQUdfUkVTWU5DX01TfSwgaW4gb25lIGBCYXRjaEdldEl0ZW1gLlxuICogQSByZXZhbGlkYXRpb24gb24gYW5vdGhlciBpbnN0YW5jZSBpcyB0aGVyZWZvcmUgc2VlbiB3aXRoaW5cbiAqIGByZWZyZXNoSW50ZXJ2YWxNc2AgKHBsdXMgdGhlIHF1ZXJ5IGl0c2VsZikuIFRoZSBpbnN0YW5jZSB0aGF0IHJhbiBpdCBhcHBsaWVzXG4gKiBpdCBpdHNlbGYsIGF0IG9uY2UsIHdpdGgge0BsaW5rIHNldH0uXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFja2VkVGFnTWFya2VycyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWFya2VyczogVGFnTWFya2VyVGFibGUgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nOiBSZXZhbGlkYXRpb25Mb2cgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVmcmVzaEludGVydmFsTXM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhUcmFja2VkVGFnczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc3luY0ludGVydmFsTXM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBjbG9jazogKCkgPT4gbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHJhbmRvbTogKCkgPT4gbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlYnVnOiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICAvKiogQnkgdGFnLCBsZWFzdCByZWNlbnRseSB1c2VkIGZpcnN0LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHRhZ3MgPSBuZXcgTWFwPHN0cmluZywgVGFnTWFya2VyPigpO1xuICAvKipcbiAgICogV2hlbiBlYWNoIHRyYWNrZWQgdGFnJ3MgbWFya2VyIGlzIGR1ZSB0byBiZSByZWFkIGFnYWluOiBhIHJhbmRvbSA3NS0xMDAlXG4gICAqIG9mIGByZXN5bmNJbnRlcnZhbE1zYCBhZnRlciBpdCB3YXMgbGFzdCBrbm93biBmcm9tIHRoZSB0YWJsZSAtIHJlYWQsXG4gICAqIHdyaXR0ZW4gaGVyZSwgb3IgbmV3LiBJbiB0aGUgb3JkZXIgdGhleSBiZWNhbWUga25vd24sIGxlYXN0IHJlY2VudCBmaXJzdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZHVlQXQgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlYWRpbmcgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx2b2lkPj4oKTtcbiAgLyoqXG4gICAqIExvZyByb3dzIGZvciB0YWdzIHdob3NlIGZpcnN0IHJlYWQgaXMgaW4gZmxpZ2h0LCBtZXJnZWQgYnkgdGFnOiB0aGUgcmVhZFxuICAgKiBtYXkgaGF2ZSBiZWVuIGFuc3dlcmVkIGJlZm9yZSB0aGUgcmV2YWxpZGF0aW9uLCBzbyB0aGV5IGFyZSBhcHBsaWVkIHRvIGl0c1xuICAgKiByZXN1bHQgcmF0aGVyIHRoYW4gZHJvcHBlZC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZ1Jvd3MgPSBuZXcgTWFwPHN0cmluZywgVGFnTWFya2VyPigpO1xuICAvKiogVHJhY2tlZCB0YWdzIHdob3NlIHJlYWQgZmFpbGVkLCBmb3IgdGhlIG5leHQgcmVmcmVzaCB0byByZWFkIGFnYWluLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHVucmVhZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIGxhc3RSZWZyZXNoID0gLUluZmluaXR5O1xuICBwcml2YXRlIHJlZnJlc2hpbmc6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBXaGVyZSB0aGUgbmV4dCBsb2cgcXVlcnkgc3RhcnRzIChgY2xvY2soKWApOiB0aGUgbGFzdCBzdWNjZXNzZnVsIG9uZSdzXG4gICAqIHN0YXJ0LCBsZXNzIHtAbGluayBSRVZBTElEQVRJT05fTE9HX0xPT0tCQUNLX01TfS5cbiAgICovXG4gIHByaXZhdGUgY3Vyc29yOiBudW1iZXI7XG4gIC8qKiBXaGVuIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgbG9nIHF1ZXJ5IHN0YXJ0ZWQsIG9yIHRoZSBsb2cgd2FzIGZpcnN0IHJlYWQuICovXG4gIHByaXZhdGUgbGFzdExvZ1JlYWQ6IG51bWJlcjtcbiAgLyoqIExvZyByb3dzIGF0IG9yIGFmdGVyIHRoZSBjdXJzb3IgYWxyZWFkeSBhcHBsaWVkLCBieSBzb3J0IGtleS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBhcHBsaWVkID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgLyoqIHtAbGluayB1cGRhdGV9cyBvZiB0aGUgY3VycmVudCB0dXJuLCBieSB0aGVpciBhcmd1bWVudHMuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRpbmcgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxib29sZWFuPj4oKTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBUcmFja2VkVGFnTWFya2Vyc09wdGlvbnMpIHtcbiAgICB0aGlzLm1hcmtlcnMgPSBvcHRpb25zLm1hcmtlcnM7XG4gICAgdGhpcy5sb2cgPSBvcHRpb25zLmxvZztcbiAgICB0aGlzLnJlZnJlc2hJbnRlcnZhbE1zID1cbiAgICAgIG9wdGlvbnMucmVmcmVzaEludGVydmFsTXMgPz8gREVGQVVMVF9UQUdfUkVGUkVTSF9NUztcbiAgICB0aGlzLm1heFRyYWNrZWRUYWdzID0gb3B0aW9ucy5tYXhUcmFja2VkVGFncyA/PyBERUZBVUxUX01BWF9UUkFDS0VEX1RBR1M7XG4gICAgdGhpcy5yZXN5bmNJbnRlcnZhbE1zID0gb3B0aW9ucy5yZXN5bmNJbnRlcnZhbE1zID8/IERFRkFVTFRfVEFHX1JFU1lOQ19NUztcbiAgICAvLyBMb29rZWQgdXAgb24gZWFjaCBjYWxsIHJhdGhlciB0aGFuIGJvdW5kIGhlcmUsIHNvIGEgdGVzdCdzIGBEYXRlLm5vd2BcbiAgICAvLyBzcHkgYXBwbGllcy5cbiAgICB0aGlzLmNsb2NrID0gb3B0aW9ucy5jbG9jayA/PyAoKCkgPT4gRGF0ZS5ub3coKSk7XG4gICAgdGhpcy5yYW5kb20gPSBvcHRpb25zLnJhbmRvbSA/PyBNYXRoLnJhbmRvbTtcbiAgICB0aGlzLmRlYnVnID0gb3B0aW9ucy5kZWJ1ZyA/PyAoKCkgPT4ge30pO1xuICAgIC8vIE5vdGhpbmcgaXMgdHJhY2tlZCB5ZXQsIHNvIG5vdGhpbmcgYmVmb3JlIHRoaXMgY2FuIGJlIG1pc3NlZDogZXZlcnkgdGFnXG4gICAgLy8gaXMgcmVhZCBmcm9tIGl0cyBtYXJrZXIgdGhlIGZpcnN0IHRpbWUgaXQgaXMgbmVlZGVkLlxuICAgIGNvbnN0IGF0ID0gdGhpcy5jbG9jaygpO1xuICAgIHRoaXMuY3Vyc29yID0gYXQgLSBSRVZBTElEQVRJT05fTE9HX0xPT0tCQUNLX01TO1xuICAgIHRoaXMubGFzdExvZ1JlYWQgPSBhdDtcbiAgfVxuXG4gIC8qKiBgdGFnYCdzIG1hcmtlciBhcyB0aGlzIGluc3RhbmNlIGtub3dzIGl0LCBpZiBpdCB0cmFja3MgYHRhZ2AuICovXG4gIGdldCh0YWc6IHN0cmluZyk6IFRhZ01hcmtlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudGFncy5nZXQodGFnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFjayBgdGFnYCB3aXRoIGBtYXJrZXJgOiB3aGF0IHRoaXMgaW5zdGFuY2UganVzdCB3cm90ZSwgd2hpY2ggaXQga25vd3NcbiAgICogd2l0aG91dCByZWFkaW5nIGl0IGJhY2suXG4gICAqL1xuICBzZXQodGFnOiBzdHJpbmcsIG1hcmtlcjogVGFnTWFya2VyKTogdm9pZCB7XG4gICAgdGhpcy5yZW1lbWJlcih0YWcsIG1hcmtlcik7XG4gICAgdGhpcy5rbm93bih0YWcsIHRoaXMuY2xvY2soKSk7XG4gIH1cblxuICAvKipcbiAgICogTm90ZSBhIHVzZSBvZiBgdGFnc2A6IHRob3NlIG9mIGFuIGVudHJ5IHRoaXMgaW5zdGFuY2UganVzdCBzdG9yZWQuXG4gICAqXG4gICAqIFdpdGggdGhlIHRhYmxlLCBhIHRhZyBub3QgdHJhY2tlZCB5ZXQgaXMgbGVmdCB1bnRyYWNrZWQsIHRvIGJlIHJlYWQgYnlcbiAgICoge0BsaW5rIGVuc3VyZX0gdGhlIGZpcnN0IHRpbWUgYW4gZW50cnkgbmVlZHMgaXQuIE5vdGhpbmcgcmV2YWxpZGF0ZWQgYmVmb3JlXG4gICAqIHRoZSBuZXcgZW50cnkgd2FzIGNyZWF0ZWQgYXBwbGllcyB0byAqaXQqLCBidXQgdHJhY2tpbmcgaXMgcGVyIHRhZywgbm90IHBlclxuICAgKiBlbnRyeTogdHJhY2tpbmcgdGhlIHRhZyB3aXRoIGFuIGVtcHR5IG1hcmtlciB3b3VsZCBhbHNvIHZvdWNoIGZvciBldmVyeVxuICAgKiBvbGRlciBlbnRyeSB0aGF0IGNhcnJpZXMgaXQgLSBvbmUgYW5vdGhlciBpbnN0YW5jZSBzdG9yZWQgaW4gUzMsIG9yIG9uZVxuICAgKiB0aGlzIGluc3RhbmNlIGtlcHQgaW4gbWVtb3J5IGFjcm9zcyBhIHtAbGluayBmb3JnZXR9IC0gYW5kIGEgcmV2YWxpZGF0aW9uXG4gICAqIGZyb20gYmVmb3JlIHRoZSBsb2cncyBjdXJzb3Igd291bGQgZ28gdW5zZWVuIHVudGlsIHRoZSByb2xsaW5nIHJlLXJlYWQuXG4gICAqXG4gICAqIFdpdGhvdXQgdGhlIHRhYmxlIGV2ZXJ5IHJldmFsaWRhdGlvbiBpcyB0aGlzIHByb2Nlc3MncyBvd24sIGFwcGxpZWQgd2l0aFxuICAgKiB7QGxpbmsgc2V0fSwgc28gYSB0YWcgaXMgdHJhY2tlZCBhdCBvbmNlLlxuICAgKi9cbiAgdHJhY2sodGFnczogcmVhZG9ubHkgc3RyaW5nW10pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubWFya2Vycykge1xuICAgICAgdGhpcy50cmFja1VucmVhZCh0YWdzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCB0YWcgb2YgdGFncykge1xuICAgICAgdGhpcy50b3VjaCh0YWcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFjayBgdGFnc2AgYXMgdGhleSBhcmUga25vd24gbm93LCB3aXRob3V0IHJlYWRpbmcgdGhlbSwgd2l0aCBhbiBlbXB0eVxuICAgKiBtYXJrZXIgZm9yIGFueSBub3QgdHJhY2tlZCB5ZXQuXG4gICAqL1xuICBwcml2YXRlIHRyYWNrVW5yZWFkKHRhZ3M6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgY29uc3QgYXQgPSB0aGlzLmNsb2NrKCk7XG4gICAgZm9yIChjb25zdCB0YWcgb2YgdGFncykge1xuICAgICAgaWYgKCF0aGlzLnRhZ3MuaGFzKHRhZykpIHtcbiAgICAgICAgdGhpcy5rbm93bih0YWcsIGF0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVtZW1iZXIodGFnLCB0aGlzLnRhZ3MuZ2V0KHRhZykgPz8ge30pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRoZSBtYXJrZXJzIG9mIHdoaWNoZXZlciBvZiBgdGFnc2AgdGhpcyBpbnN0YW5jZSBkb2VzIG5vdCB0cmFjayB5ZXQuXG4gICAqIE5lZWRlZCBiZWZvcmUganVkZ2luZyBhbiBlbnRyeSB0aGlzIGluc3RhbmNlIGRpZCBub3QgY3JlYXRlLCBzaW5jZSBpdHNcbiAgICogdGFncyBtYXkgaGF2ZSBiZWVuIHJldmFsaWRhdGVkIGF0IGFueSB0aW1lIGJlZm9yZS5cbiAgICovXG4gIGFzeW5jIGVuc3VyZSh0YWdzOiByZWFkb25seSBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5tYXJrZXJzKSB7XG4gICAgICB0aGlzLnRyYWNrVW5yZWFkKHRhZ3MpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB3YWl0czogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgY29uc3QgdW5yZWFkOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgdGFnIG9mIG5ldyBTZXQodGFncykpIHtcbiAgICAgIGNvbnN0IGluRmxpZ2h0ID0gdGhpcy5yZWFkaW5nLmdldCh0YWcpO1xuICAgICAgaWYgKGluRmxpZ2h0KSB7XG4gICAgICAgIHdhaXRzLnB1c2goaW5GbGlnaHQpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnRhZ3MuaGFzKHRhZykpIHtcbiAgICAgICAgdGhpcy50b3VjaCh0YWcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdW5yZWFkLnB1c2godGFnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHVucmVhZC5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBgcmVhZEludG9gIG5ldmVyIHJlamVjdHM6IGEgZmFpbGVkIHJlYWQgbGVhdmVzIHRoZSB0YWdzIHRyYWNrZWQuXG4gICAgICBjb25zdCByZWFkID0gdGhpcy5yZWFkSW50byh1bnJlYWQpLnRoZW4oKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiB1bnJlYWQpIHtcbiAgICAgICAgICB0aGlzLnJlYWRpbmcuZGVsZXRlKHRhZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCB0YWcgb2YgdW5yZWFkKSB7XG4gICAgICAgIHRoaXMucmVhZGluZy5zZXQodGFnLCByZWFkKTtcbiAgICAgIH1cbiAgICAgIHdhaXRzLnB1c2gocmVhZCk7XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHdhaXRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXRjaCB1cCBvbiByZXZhbGlkYXRpb25zIG90aGVyIGluc3RhbmNlcyByYW4sIGF0IG1vc3Qgb25jZSBwZXJcbiAgICogYHJlZnJlc2hJbnRlcnZhbE1zYC4gU2VlIHtAbGluayBUcmFja2VkVGFnTWFya2Vyc30gZm9yIHRoZSBjb3N0LlxuICAgKi9cbiAgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZztcbiAgICBpZiAoIWxvZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZWZyZXNoaW5nKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWZyZXNoaW5nO1xuICAgIH1cbiAgICBjb25zdCBhdCA9IHRoaXMuY2xvY2soKTtcbiAgICBpZiAoYXQgLSB0aGlzLmxhc3RSZWZyZXNoIDwgdGhpcy5yZWZyZXNoSW50ZXJ2YWxNcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmxhc3RSZWZyZXNoID0gYXQ7XG4gICAgLy8gV2hhdGV2ZXIgZ2V0cyB0cmFja2VkIGJlZm9yZSB0aGUgbmV4dCByZWZyZXNoIGlzIHJlYWQgZnJvbSBpdHMgbWFya2VyLFxuICAgIC8vIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gY2F0Y2ggdXAgb24geWV0LlxuICAgIGlmICh0aGlzLnRhZ3Muc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlZnJlc2hpbmcgPSB0aGlzLnN5bmMoYXQsIGxvZykuZmluYWxseSgoKSA9PiB7XG4gICAgICB0aGlzLnJlZnJlc2hpbmcgPSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMucmVmcmVzaGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgYSByZXZhbGlkYXRpb24gb2YgYHRhZ3NgOiBoZXJlIGF0IG9uY2UsIGFuZCBpbiB0aGUgcmV2YWxpZGF0aW9uXG4gICAqIHRhYmxlIGZvciBldmVyeSBvdGhlciBpbnN0YW5jZSAtIHRoZSBtYXJrZXIgcm93IHBsdXMgYSBsb2cgcm93IHBlciB0YWcuXG4gICAqXG4gICAqIE5leHQuanMgY2FsbHMgYHJldmFsaWRhdGVUYWdgIG9uIHRoZSBpbmNyZW1lbnRhbCBjYWNoZSBhbmQgYHVwZGF0ZVRhZ3NgIG9uXG4gICAqIGV2ZXJ5IGRpc3RpbmN0IGBjYWNoZUhhbmRsZXJzYCBlbnRyeSwgYWxsIGluIG9uZSBzeW5jaHJvbm91cyBsb29wXG4gICAqIChgcmV2YWxpZGF0aW9uLXV0aWxzYCksIGFuZCBhbGwgb2YgdGhlbSBzaGFyZSB0aGlzIG1hbmlmZXN0LiBTbyBhblxuICAgKiBpZGVudGljYWwgY2FsbCBpbiB0aGUgc2FtZSB0dXJuIGpvaW5zIHRoZSBmaXJzdCBpbnN0ZWFkIG9mIHdyaXRpbmcgdGhlXG4gICAqIHJvd3MgYWdhaW4uIE9uZSBpbiBhIGxhdGVyIHR1cm4gaXMgYSByZXZhbGlkYXRpb24gb2YgaXRzIG93biwgZXZlbiB3aGlsZVxuICAgKiB0aGUgZmlyc3Qgb25lJ3Mgd3JpdGVzIGFyZSBpbiBmbGlnaHQsIGFuZCBnZXRzIGl0cyBvd24sIGxhdGVyLCBtYXJrZXIuXG4gICAqIE5ldmVyIHJlamVjdHM6IHJlc29sdmVzIGBmYWxzZWAgd2hlbiBhIHJvdyBmYWlsZWQgdG8gd3JpdGUgKHRoZSBlcnJvciBpc1xuICAgKiBsb2dnZWQpLCBzbyBvdGhlciBpbnN0YW5jZXMgbWF5IG5vdCBzZWUgaXQuXG4gICAqL1xuICBhc3luYyB1cGRhdGUoXG4gICAgdGFnczogcmVhZG9ubHkgc3RyaW5nW10sXG4gICAgZHVyYXRpb25zOiBSZXZhbGlkYXRlRHVyYXRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBrZXkgPSBKU09OLnN0cmluZ2lmeShbdGFncywgZHVyYXRpb25zID8/IG51bGxdKTtcbiAgICBjb25zdCBpbkZsaWdodCA9IHRoaXMudXBkYXRpbmcuZ2V0KGtleSk7XG4gICAgaWYgKGluRmxpZ2h0KSB7XG4gICAgICByZXR1cm4gaW5GbGlnaHQ7XG4gICAgfVxuICAgIGNvbnN0IHVwZGF0ZSA9IHRoaXMud3JpdGUodGFncywgZHVyYXRpb25zKTtcbiAgICB0aGlzLnVwZGF0aW5nLnNldChrZXksIHVwZGF0ZSk7XG4gICAgLy8gRm9yZ290dGVuIGFzIHNvb24gYXMgdGhlIGN1cnJlbnQgdHVybidzIGNhbGxzIGhhdmUgYmVlbiBtYWRlLlxuICAgIHZvaWQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB0aGlzLnVwZGF0aW5nLmRlbGV0ZShrZXkpKTtcbiAgICByZXR1cm4gdXBkYXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoYXQgdGhlIHRyYWNrZWQgbWFya2VycyBzYXkgYWJvdXQgYW4gZW50cnkgY2FycnlpbmcgYHRhZ3NgLCBjcmVhdGVkIGF0XG4gICAqIGBjcmVhdGVkQXRgOiB0aGUgbW9zdCBzZXZlcmUgYW5zd2VyIG9mIGFueSBvZiB0aGVtLlxuICAgKi9cbiAgc3RhdGUodGFnczogcmVhZG9ubHkgc3RyaW5nW10sIGNyZWF0ZWRBdDogbnVtYmVyKTogUmV2YWxpZGF0aW9uU3RhdGUge1xuICAgIC8vIGBtYXJrZXJDbG9jaygpYCwgbm90IGBEYXRlLm5vdygpYCwgaGVyZSBhbmQgd2hlcmV2ZXIgYSBtYXJrZXIgaXMgc3RhbXBlZDpcbiAgICAvLyBgY3JlYXRlZEF0YCBpcyBvbiBOZXh0LmpzJ3MgY2xvY2ssIGFuZCBhIG1hcmtlciBvbiB0aGUgd2FsbCBjbG9jayB3b3VsZCBiZVxuICAgIC8vIGNvbXBhcmVkIGFjcm9zcyB0aGUgdHdvLCBzbyBhbiBlbnRyeSByZWdlbmVyYXRlZCBqdXN0IGFmdGVyIGFcbiAgICAvLyByZXZhbGlkYXRpb24gY291bGQgc3RpbGwgcmVhZCBhcyBvbGRlciB0aGFuIGl0IHdoZXJldmVyIHRoZXkgZHJpZnQuXG4gICAgY29uc3QgYXQgPSBtYXJrZXJDbG9jaygpO1xuICAgIGxldCBzdGF0ZTogUmV2YWxpZGF0aW9uU3RhdGUgPSBcImZyZXNoXCI7XG4gICAgZm9yIChjb25zdCB0YWcgb2YgdGFncykge1xuICAgICAgY29uc3QgbWFya2VyID0gdGhpcy5nZXQodGFnKTtcbiAgICAgIGlmICghbWFya2VyKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdGFnU3RhdGUgPSBtYXJrZXJTdGF0ZShtYXJrZXIsIGNyZWF0ZWRBdCwgYXQpO1xuICAgICAgaWYgKHRhZ1N0YXRlID09PSBcImV4cGlyZWRcIikge1xuICAgICAgICByZXR1cm4gXCJleHBpcmVkXCI7XG4gICAgICB9XG4gICAgICBpZiAodGFnU3RhdGUgPT09IFwic3RhbGVcIikge1xuICAgICAgICBzdGF0ZSA9IFwic3RhbGVcIjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIGBnZXRFeHBpcmF0aW9uYCdzIGFuc3dlcjogdGhlIGxhdGVzdCB0aW1lIGFueSBvZiBgdGFnc2AgZXhwaXJlZCwgYDBgIGlmXG4gICAqIG5vbmUgaGFzLiBPbmx5IGV4cGlyYXRpb25zIGFscmVhZHkgcGFzdCBjb3VudCAtIGEgcHJvZmlsZSdzIGZ1dHVyZVxuICAgKiBgZXhwaXJlYCBpcyBub3QgYW4gZXhwaXJhdGlvbiB5ZXQgLSBhbmQgYSBzdGFsZSBtYXJrIGRvZXMgbm90LCBtYXRjaGluZ1xuICAgKiBOZXh0LmpzJ3MgZGVmYXVsdCBoYW5kbGVyLCB3aGljaCByZWFkcyBvbmx5IGBleHBpcmVkYCBmb3IgaW1wbGljaXQgdGFncy5cbiAgICovXG4gIGV4cGlyYXRpb24odGFnczogcmVhZG9ubHkgc3RyaW5nW10pOiBudW1iZXIge1xuICAgIGNvbnN0IGF0ID0gbWFya2VyQ2xvY2soKTtcbiAgICBsZXQgbGF0ZXN0ID0gMDtcbiAgICBmb3IgKGNvbnN0IHRhZyBvZiB0YWdzKSB7XG4gICAgICBjb25zdCBtYXJrZXIgPSB0aGlzLmdldCh0YWcpO1xuICAgICAgaWYgKCFtYXJrZXIpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAobWFya2VyLnJldmFsaWRhdGVkQXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsYXRlc3QgPSBNYXRoLm1heChsYXRlc3QsIG1hcmtlci5yZXZhbGlkYXRlZEF0KTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXJrZXIuZXhwaXJlZEF0ICE9PSB1bmRlZmluZWQgJiYgbWFya2VyLmV4cGlyZWRBdCA8PSBhdCkge1xuICAgICAgICBsYXRlc3QgPSBNYXRoLm1heChsYXRlc3QsIG1hcmtlci5leHBpcmVkQXQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGF0ZXN0O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3cml0ZShcbiAgICB0YWdzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgICBkdXJhdGlvbnM6IFJldmFsaWRhdGVEdXJhdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGF0ID0gbWFya2VyQ2xvY2soKTtcbiAgICBjb25zdCBtYXJrZXIgPSBtYXJrZXJGb3IoYXQsIGR1cmF0aW9ucyk7XG4gICAgZm9yIChjb25zdCB0YWcgb2YgdGFncykge1xuICAgICAgdGhpcy5zZXQodGFnLCBhcHBseU1hcmtlcih0aGlzLmdldCh0YWcpLCBtYXJrZXIpKTtcbiAgICB9XG4gICAgY29uc3QgeyBtYXJrZXJzLCBsb2cgfSA9IHRoaXM7XG4gICAgaWYgKCFtYXJrZXJzIHx8ICFsb2cpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCB3cml0ZXM6IFtzdHJpbmcsIFByb21pc2U8dW5rbm93bj5dW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHRhZyBvZiBuZXcgU2V0KHRhZ3MpKSB7XG4gICAgICB3cml0ZXMucHVzaChbXG4gICAgICAgIFwiRXJyb3Igd3JpdGluZyB0YWcgcmV2YWxpZGF0aW9uIG1hcmtlcjpcIixcbiAgICAgICAgLy8gVGhlIHJvdyBhcyBpdCBpcyBub3csIHdoaWNoIGNhcnJpZXMgYW55IGVhcmxpZXIgYHJldmFsaWRhdGVkQXRgXG4gICAgICAgIC8vIGFub3RoZXIgaW5zdGFuY2Ugd3JvdGU6IHRyYWNraW5nIG9ubHkgd2hhdCB0aGlzIGNhbGwgc2V0IHdvdWxkXG4gICAgICAgIC8vIGhpZGUgdGhhdCBvbmUgdW50aWwgdGhlIHJvbGxpbmcgcmUtcmVhZCwgYW5kIGFuIGVudHJ5IG9sZGVyIHRoYW4gaXRcbiAgICAgICAgLy8gd291bGQgcmVhZCBhcyBtZXJlbHkgc3RhbGUuXG4gICAgICAgIG1hcmtlcnMud3JpdGUodGFnLCBhdCwgZHVyYXRpb25zKS50aGVuKChyb3cpID0+IHtcbiAgICAgICAgICBpZiAocm93KSB7XG4gICAgICAgICAgICB0aGlzLnNldCh0YWcsIG1lcmdlTWFya2Vycyh0aGlzLmdldCh0YWcpLCByb3cpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgXSk7XG4gICAgICB3cml0ZXMucHVzaChbXG4gICAgICAgIFwiRXJyb3Igd3JpdGluZyB0YWcgcmV2YWxpZGF0aW9uIGxvZyByb3c6XCIsXG4gICAgICAgIHRoaXMucHV0TG9nUm93KGxvZywgdGFnLCBtYXJrZXIpLFxuICAgICAgXSk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQod3JpdGVzLm1hcCgoWywgd3JpdGVdKSA9PiB3cml0ZSkpO1xuICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0LCBpKSA9PiB7XG4gICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3Iod3JpdGVzW2ldWzBdLCByZXN1bHQucmVhc29uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0cy5ldmVyeSgocmVzdWx0KSA9PiByZXN1bHQuc3RhdHVzID09PSBcImZ1bGZpbGxlZFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdXQgYHRhZ2AncyBsb2cgcm93LCBzdGFtcGVkIG9uIHRoZSB3YWxsIGNsb2NrICh0aGUgbWFya2VyIHZhbHVlcyBhcmUgb25cbiAgICogTmV4dC5qcydzOiBzZWUge0BsaW5rIFJldmFsaWRhdGlvbkxvZ30pLlxuICAgKlxuICAgKiBSZWFkZXJzIG9ubHkgbG9vayB7QGxpbmsgUkVWQUxJREFUSU9OX0xPR19MT09LQkFDS19NU30gYmVoaW5kIHRoZWlyIGxhc3RcbiAgICogcXVlcnksIHNvIGEgcm93IHRoYXQgc2hvd3MgdXAgbXVjaCBsYXRlciB0aGFuIGl0cyB0aW1lc3RhbXAgLSBhIHNsb3dcbiAgICogY29ubmVjdGlvbiwgcmV0cmllcyB1bmRlciB0aHJvdHRsaW5nIC0gaXMgYmVoaW5kIGV2ZXJ5IGN1cnNvciBhbmQgbmV2ZXJcbiAgICogcmVhZC4gQSBzbG93IHB1dCBpcyB0aGVyZWZvcmUgbWFkZSBhZ2FpbiB1bmRlciBhIGZyZXNoIHRpbWVzdGFtcCwgd2hpY2hcbiAgICogcmVhZGVycyB3aWxsIHNlZTsgb25lIHNsb3cgdHdpY2UgaXMgcmVwb3J0ZWQgYXMgYSBmYWlsdXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwdXRMb2dSb3coXG4gICAgbG9nOiBSZXZhbGlkYXRpb25Mb2csXG4gICAgdGFnOiBzdHJpbmcsXG4gICAgbWFya2VyOiBUYWdNYXJrZXIsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwgMjsgYXR0ZW1wdCsrKSB7XG4gICAgICBjb25zdCBhdCA9IHRoaXMuY2xvY2soKTtcbiAgICAgIGF3YWl0IGxvZy5wdXQodGFnLCBhdCwgbWFya2VyKTtcbiAgICAgIGlmICh0aGlzLmNsb2NrKCkgLSBhdCA8PSBNQVhfTE9HX1BVVF9NUykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGUgcmV2YWxpZGF0aW9uIGxvZyByb3cgZm9yICR7dGFnfSB0b29rIGxvbmdlciB0aGFuIHJlYWRlcnMgbG9vayBiYWNrYCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE9uZSByZWZyZXNoIHN0YXJ0ZWQgYXQgYGF0YDogdGhlIGxvZyByb3dzIHNpbmNlIHRoZSBjdXJzb3IsIGFuZCB0aGUgbmV4dFxuICAgKiBzbGljZSBvZiB0aGUgcm9sbGluZyByZS1yZWFkLlxuICAgKlxuICAgKiBBIGZhaWxlZCBxdWVyeSBjaGFuZ2VzIG5vdGhpbmcgYnV0IHRoZSBsb2c6IHRoZSB0YWdzIHN0YXkgdHJhY2tlZCBhcyB0aGV5XG4gICAqIHdlcmUsIGFuZCB0aGUgbmV4dCByZWZyZXNoIGFza3MgYWdhaW4gZnJvbSB0aGUgc2FtZSBjdXJzb3IuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHN5bmMoYXQ6IG51bWJlciwgbG9nOiBSZXZhbGlkYXRpb25Mb2cpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoYXQgLSB0aGlzLmxhc3RMb2dSZWFkID4gTUFYX1JFVkFMSURBVElPTl9MT0dfR0FQX01TKSB7XG4gICAgICB0aGlzLmZvcmdldChcbiAgICAgICAgYXQsXG4gICAgICAgIFwidGhlIHJldmFsaWRhdGlvbiBsb2cgbWF5IG5vdCBjb3ZlciB0aGUgZ2FwIHNpbmNlIGl0IHdhcyBsYXN0IHJlYWRcIixcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IFtyZXN1bHRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgbG9nLnF1ZXJ5KHRoaXMuY3Vyc29yKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHJlYWRpbmcgdGFnIHJldmFsaWRhdGlvbiBsb2c6XCIsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0pLFxuICAgICAgdGhpcy5yZWFkSW50byh0aGlzLmR1ZShhdCkpLFxuICAgIF0pO1xuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChyZXN1bHQudHJ1bmNhdGVkKSB7XG4gICAgICB0aGlzLmZvcmdldChcbiAgICAgICAgYXQsXG4gICAgICAgIFwidGhlIHJldmFsaWRhdGlvbiBsb2cgaGFzIG1vcmUgcm93cyB0aGFuIG9uZSBxdWVyeSByZWFkc1wiLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGFwcGxpZWQgPSAwO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHJlc3VsdC5yb3dzKSB7XG4gICAgICBpZiAodGhpcy5hcHBsaWVkLmhhcyhyb3cuc2spKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgbWFya2VyID0gdGhpcy50YWdzLmdldChyb3cudGFnKTtcbiAgICAgIGlmIChtYXJrZXIpIHtcbiAgICAgICAgLy8gYHNldGAgb24gYSBrZXkgYWxyZWFkeSB0aGVyZSBrZWVwcyBpdHMgcGxhY2UgaW4gdGhlIExSVSBvcmRlcjogYmVpbmdcbiAgICAgICAgLy8gcmV2YWxpZGF0ZWQgZWxzZXdoZXJlIGlzIG5vdCBhIHVzZS5cbiAgICAgICAgdGhpcy50YWdzLnNldChyb3cudGFnLCBtZXJnZU1hcmtlcnMobWFya2VyLCByb3cubWFya2VyKSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucmVhZGluZy5oYXMocm93LnRhZykpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nUm93cy5zZXQoXG4gICAgICAgICAgcm93LnRhZyxcbiAgICAgICAgICBtZXJnZU1hcmtlcnModGhpcy5wZW5kaW5nUm93cy5nZXQocm93LnRhZyksIHJvdy5tYXJrZXIpLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQSB0YWcgdGhpcyBpbnN0YW5jZSBkb2VzIG5vdCB0cmFjayBpcyByZWFkIGZyb20gaXRzIG1hcmtlciB3aGVuIGl0XG4gICAgICAgIC8vIGlzIG5leHQgbmVlZGVkIC0gYnV0IG5vdCB5ZXQgbWFya2VkIGFwcGxpZWQsIGJlY2F1c2UgdGhhdCByZWFkIG1heVxuICAgICAgICAvLyBtaXNzIHRoaXMgdmVyeSByZXZhbGlkYXRpb246IHRoZSB3cml0ZXIgcHV0cyB0aGUgbG9nIHJvdyBhbmQgdGhlXG4gICAgICAgIC8vIG1hcmtlciBhdCB0aGUgc2FtZSB0aW1lLCBhbmQgdGhlIHJlYWQgaXMgYW4gZXZlbnR1YWxseSBjb25zaXN0ZW50XG4gICAgICAgIC8vIGBCYXRjaEdldEl0ZW1gIHRoYXQgY2FuIGxhbmQgbWlsbGlzZWNvbmRzIGFmdGVyIHRoZSByb3cgc2hvd2VkIGhlcmUuXG4gICAgICAgIC8vIE1hcmtlZCBhcHBsaWVkLCB0aGUgcm93IHdhcyBza2lwcGVkIGJ5IGV2ZXJ5IHF1ZXJ5IHRoZSBsb29rYmFja1xuICAgICAgICAvLyByZXR1cm5lZCBpdCB0bywgYW5kIHRoZSBwcmUtcmV2YWxpZGF0aW9uIG1hcmtlciBzdG9vZCB1bnRpbCB0aGVcbiAgICAgICAgLy8gcm9sbGluZyByZS1yZWFkLiBMZWZ0IHVubWFya2VkLCB0aGUgbmV4dCByZWZyZXNoIGFwcGxpZXMgaXQgdG9cbiAgICAgICAgLy8gd2hhdGV2ZXIgdGhhdCByZWFkIGZvdW5kOyBpdCBjb3N0cyBubyByZWFkLCBvbmx5IHRoZSByb3cgYmVpbmdcbiAgICAgICAgLy8gbG9va2VkIGF0IGFnYWluIHdoaWxlIGl0IGlzIGluc2lkZSB0aGUgbG9va2JhY2suXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5hcHBsaWVkLnNldChyb3cuc2ssIHJvdy5hdCk7XG4gICAgICBhcHBsaWVkKys7XG4gICAgfVxuICAgIHRoaXMubGFzdExvZ1JlYWQgPSBhdDtcbiAgICB0aGlzLmFkdmFuY2UoYXQgLSBSRVZBTElEQVRJT05fTE9HX0xPT0tCQUNLX01TKTtcbiAgICB0aGlzLmRlYnVnKFxuICAgICAgYHJlYWQgJHtyZXN1bHQucm93cy5sZW5ndGh9IHJldmFsaWRhdGlvbiBsb2cgcm93cyAoJHthcHBsaWVkfSBhcHBsaWVkKWAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGFncyB0byByZWFkIG9uIHRoaXMgcmVmcmVzaCwgYXQgbW9zdCBvbmUgYEJhdGNoR2V0SXRlbWAncyB3b3J0aDpcbiAgICogdGhvc2Ugd2hvc2UgcmVhZCBmYWlsZWQsIHRoZW4gdGhvc2Ugd2hvc2UgcmUtcmVhZCBoYXMgY29tZSBkdWUsIGluIHRoZVxuICAgKiBvcmRlciB0aGV5IHdlcmUgbGFzdCByZWFkLlxuICAgKi9cbiAgcHJpdmF0ZSBkdWUoYXQ6IG51bWJlcik6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBkdWU6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCB0YWcgb2YgdGhpcy51bnJlYWQpIHtcbiAgICAgIGlmIChkdWUubGVuZ3RoID49IEJBVENIX0dFVF9NQVhfS0VZUykgcmV0dXJuIGR1ZTtcbiAgICAgIGR1ZS5wdXNoKHRhZyk7XG4gICAgfVxuICAgIC8vIEtub3duIGluIHRpbWUgb3JkZXIsIGFuZCBlYWNoIGR1ZSBhdCBtb3N0IGBqaXR0ZXJgIGVhcmxpZXIgdGhhbiB0aGVcbiAgICAvLyB0YWdzIGFmdGVyIGl0OiBwYXN0IGEgdGFnIGR1ZSBtb3JlIHRoYW4gdGhhdCBmcm9tIG5vdywgbm9uZSBpcyBkdWUuXG4gICAgY29uc3Qgaml0dGVyID0gdGhpcy5yZXN5bmNJbnRlcnZhbE1zICogVEFHX1JFU1lOQ19KSVRURVI7XG4gICAgZm9yIChjb25zdCBbdGFnLCBkdWVBdF0gb2YgdGhpcy5kdWVBdCkge1xuICAgICAgaWYgKGR1ZS5sZW5ndGggPj0gQkFUQ0hfR0VUX01BWF9LRVlTIHx8IGR1ZUF0IC0gaml0dGVyID4gYXQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoZHVlQXQgPD0gYXQgJiYgIXRoaXMudW5yZWFkLmhhcyh0YWcpKSB7XG4gICAgICAgIGR1ZS5wdXNoKHRhZyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkdWU7XG4gIH1cblxuICAvKipcbiAgICogRm9yZ2V0IGV2ZXJ5IHRyYWNrZWQgbWFya2VyLCBhbmQgZm9sbG93IHRoZSBsb2cgZnJvbSBgYXRgOiB3aGF0IGlzIG5lZWRlZFxuICAgKiBuZXh0IGlzIHJlYWQgZnJvbSBpdHMgbWFya2VyIGFzIGl0IGlzIG5lZWRlZCwgc3ByZWFkIG92ZXIgdGhlIHJlcXVlc3RzXG4gICAqIHRoYXQgbmVlZCBpdCwgcmF0aGVyIHRoYW4gZXZlcnkgdHJhY2tlZCB0YWcgcmUtcmVhZCBhdCBvbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSBmb3JnZXQoYXQ6IG51bWJlciwgd2h5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRlYnVnKGBmb3JnZXR0aW5nICR7dGhpcy50YWdzLnNpemV9IHRyYWNrZWQgdGFnczogJHt3aHl9YCk7XG4gICAgdGhpcy50YWdzLmNsZWFyKCk7XG4gICAgdGhpcy5kdWVBdC5jbGVhcigpO1xuICAgIHRoaXMudW5yZWFkLmNsZWFyKCk7XG4gICAgdGhpcy5hcHBsaWVkLmNsZWFyKCk7XG4gICAgdGhpcy5jdXJzb3IgPSBhdCAtIFJFVkFMSURBVElPTl9MT0dfTE9PS0JBQ0tfTVM7XG4gICAgdGhpcy5sYXN0TG9nUmVhZCA9IGF0O1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgdGhlIGN1cnNvciBmb3J3YXJkIHRvIGBjdXJzb3JgLCBmb3JnZXR0aW5nIGFwcGxpZWQgcm93cyBiZWZvcmUgaXQ6XG4gICAqIG5vIHF1ZXJ5IHJldHVybnMgdGhlbSBhZ2Fpbi5cbiAgICovXG4gIHByaXZhdGUgYWR2YW5jZShjdXJzb3I6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChjdXJzb3IgPD0gdGhpcy5jdXJzb3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jdXJzb3IgPSBjdXJzb3I7XG4gICAgZm9yIChjb25zdCBbc2ssIGF0XSBvZiB0aGlzLmFwcGxpZWQpIHtcbiAgICAgIGlmIChhdCA8IGN1cnNvcikge1xuICAgICAgICB0aGlzLmFwcGxpZWQuZGVsZXRlKHNrKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBgdGFnc2AgZnJvbSB0aGUgdGFibGUsIGFuZCByZXBvcnQgd2hldGhlciB0aGF0IHdvcmtlZC4gQSByZWFkIHRoYXRcbiAgICogZmFpbHMgbGVhdmVzIHRoZW0gdHJhY2tlZCBhcyB0aGV5IHdlcmUsIGFuZCB0aGUgbmV4dCByZWZyZXNoIHJlYWRzIHRoZW1cbiAgICogYWdhaW46IHRoZSBzYW1lIFwiYXNzdW1lIHRoZSBlbnRyeSBpcyB2YWxpZFwiIHRoZSBpbmNyZW1lbnRhbCBjYWNoZSBoYXNcbiAgICogYWx3YXlzIGFuc3dlcmVkIHdpdGgsIHJhdGhlciB0aGFuIGEgcmVhZCBvbiBldmVyeSByZXF1ZXN0IHdoaWxlIER5bmFtb0RCXG4gICAqIGlzIHVuYXZhaWxhYmxlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWFkSW50byh0YWdzOiBzdHJpbmdbXSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICh0YWdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGF0ID0gdGhpcy5jbG9jaygpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWFkID0gYXdhaXQgdGhpcy5tYXJrZXJzIS5yZWFkKHRhZ3MpO1xuICAgICAgZm9yIChjb25zdCB0YWcgb2YgdGFncykge1xuICAgICAgICB0aGlzLnVucmVhZC5kZWxldGUodGFnKTtcbiAgICAgICAgdGhpcy5yZW1lbWJlcihcbiAgICAgICAgICB0YWcsXG4gICAgICAgICAgbWVyZ2VNYXJrZXJzKFxuICAgICAgICAgICAgbWVyZ2VNYXJrZXJzKHRoaXMudGFncy5nZXQodGFnKSwgcmVhZC5nZXQodGFnKSksXG4gICAgICAgICAgICB0aGlzLnRha2VQZW5kaW5nUm93cyh0YWcpLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMua25vd24odGFnLCBhdCk7XG4gICAgICB9XG4gICAgICB0aGlzLmRlYnVnKGByZWFkICR7dGFncy5sZW5ndGh9IHRhZyBtYXJrZXJzICgke3JlYWQuc2l6ZX0gc2V0KWApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciByZWFkaW5nIHRhZyBtYXJrZXJzOlwiLCBlcnJvcik7XG4gICAgICB0aGlzLnRyYWNrVW5yZWFkKHRhZ3MpO1xuICAgICAgZm9yIChjb25zdCB0YWcgb2YgdGFncykge1xuICAgICAgICB0aGlzLnVucmVhZC5hZGQodGFnKTtcbiAgICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMudGFrZVBlbmRpbmdSb3dzKHRhZyk7XG4gICAgICAgIGlmIChwZW5kaW5nKSB7XG4gICAgICAgICAgdGhpcy5yZW1lbWJlcih0YWcsIG1lcmdlTWFya2Vycyh0aGlzLnRhZ3MuZ2V0KHRhZyksIHBlbmRpbmcpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdGFrZVBlbmRpbmdSb3dzKHRhZzogc3RyaW5nKTogVGFnTWFya2VyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nUm93cy5nZXQodGFnKTtcbiAgICB0aGlzLnBlbmRpbmdSb3dzLmRlbGV0ZSh0YWcpO1xuICAgIHJldHVybiBwZW5kaW5nO1xuICB9XG5cbiAgLyoqIFJlY29yZCB0aGF0IGB0YWdgJ3MgbWFya2VyIHdhcyBrbm93biBmcm9tIHRoZSB0YWJsZSBhdCBgYXRgLiAqL1xuICBwcml2YXRlIGtub3duKHRhZzogc3RyaW5nLCBhdDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5kdWVBdC5kZWxldGUodGFnKTtcbiAgICB0aGlzLmR1ZUF0LnNldChcbiAgICAgIHRhZyxcbiAgICAgIGF0ICsgdGhpcy5yZXN5bmNJbnRlcnZhbE1zICogKDEgLSBUQUdfUkVTWU5DX0pJVFRFUiAqIHRoaXMucmFuZG9tKCkpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlbWVtYmVyKHRhZzogc3RyaW5nLCBtYXJrZXI6IFRhZ01hcmtlcik6IHZvaWQge1xuICAgIHRoaXMudGFncy5kZWxldGUodGFnKTtcbiAgICB0aGlzLnRhZ3Muc2V0KHRhZywgbWFya2VyKTtcbiAgICBmb3IgKGNvbnN0IG9sZGVzdCBvZiB0aGlzLnRhZ3Mua2V5cygpKSB7XG4gICAgICBpZiAodGhpcy50YWdzLnNpemUgPD0gdGhpcy5tYXhUcmFja2VkVGFncykge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHRoaXMudGFncy5kZWxldGUob2xkZXN0KTtcbiAgICAgIHRoaXMuZHVlQXQuZGVsZXRlKG9sZGVzdCk7XG4gICAgICB0aGlzLnVucmVhZC5kZWxldGUob2xkZXN0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRvdWNoKHRhZzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbWFya2VyID0gdGhpcy50YWdzLmdldCh0YWcpO1xuICAgIGlmIChtYXJrZXIpIHtcbiAgICAgIHRoaXMucmVtZW1iZXIodGFnLCBtYXJrZXIpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoZSBsb25nZXN0IGEgbG9nIHJvdydzIHB1dCBtYXkgdGFrZSBhbmQgc3RpbGwgYmUgc2VlbiBieSBldmVyeSByZWFkZXI6IGhhbGZcbiAqIHRoZSBsb29rYmFjaywgbGVhdmluZyB0aGUgcmVzdCBmb3Igd3JpdGVycycgY2xvY2tzIGFuZCBldmVudHVhbGx5IGNvbnNpc3RlbnRcbiAqIHF1ZXJpZXMuXG4gKi9cbmNvbnN0IE1BWF9MT0dfUFVUX01TID0gUkVWQUxJREFUSU9OX0xPR19MT09LQkFDS19NUyAvIDI7XG5cbi8qKlxuICogQSBtYXJrZXIgYXMgcmVhZCBmcm9tIHRoZSB0YWJsZSBvciB0aGUgbG9nLCBrZWVwaW5nIHdoYXRldmVyIHRoaXMgaW5zdGFuY2VcbiAqIGFscmVhZHkga25vd3MgdGhhdCB0aGUgcmVhZCBkb2VzIG5vdCBzaG93IHlldDogcmVhZHMgYXJlIGV2ZW50dWFsbHlcbiAqIGNvbnNpc3RlbnQsIGFuZCBhIHJlYWQgc3RyYWlnaHQgYWZ0ZXIgdGhpcyBpbnN0YW5jZSdzIG93biByZXZhbGlkYXRpb24gY291bGRcbiAqIG90aGVyd2lzZSB0YWtlIGl0IGJhY2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZU1hcmtlcnMoXG4gIGxvY2FsOiBUYWdNYXJrZXIgfCB1bmRlZmluZWQsXG4gIHJlbW90ZTogVGFnTWFya2VyIHwgdW5kZWZpbmVkLFxuKTogVGFnTWFya2VyIHtcbiAgaWYgKCFsb2NhbCkge1xuICAgIHJldHVybiByZW1vdGUgPz8ge307XG4gIH1cbiAgaWYgKCFyZW1vdGUpIHtcbiAgICByZXR1cm4gbG9jYWw7XG4gIH1cbiAgLy8gYGV4cGlyZWRBdGAgaXMgd3JpdHRlbiB3aXRoIGBzdGFsZUF0YCwgc28gaXQgYmVsb25ncyB0byB3aGljaGV2ZXIgaXNcbiAgLy8gbmV3ZXIgLSB1bmxlc3MgdGhhdCByZXZhbGlkYXRpb24ncyBwcm9maWxlIGhhZCBubyBgZXhwaXJlYCBhbmQgbGVmdCBpdC5cbiAgY29uc3QgW29sZGVyLCBuZXdlcl0gPVxuICAgIChsb2NhbC5zdGFsZUF0ID8/IC0xKSA+IChyZW1vdGUuc3RhbGVBdCA/PyAtMSlcbiAgICAgID8gW3JlbW90ZSwgbG9jYWxdXG4gICAgICA6IFtsb2NhbCwgcmVtb3RlXTtcbiAgcmV0dXJuIHtcbiAgICAuLi5hcHBseU1hcmtlcihvbGRlciwgbmV3ZXIpLFxuICAgIHJldmFsaWRhdGVkQXQ6IG1heERlZmluZWQobG9jYWwucmV2YWxpZGF0ZWRBdCwgcmVtb3RlLnJldmFsaWRhdGVkQXQpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBtYXhEZWZpbmVkKGE6IG51bWJlciB8IHVuZGVmaW5lZCwgYjogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gIGlmIChhID09PSB1bmRlZmluZWQpIHJldHVybiBiO1xuICBpZiAoYiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gYTtcbiAgcmV0dXJuIE1hdGgubWF4KGEsIGIpO1xufVxuXG4vKipcbiAqIFRoZSBjYWNoZSBidWNrZXQsIGFzIHRoZSBoYW5kbGVycyB1c2UgaXQ6IHdob2xlIG9iamVjdHMgcmVhZCBhbmQgd3JpdHRlbiBhc1xuICogVVRGLTggdGV4dCB1bmRlciB0aGUga2V5cyBhYm92ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIENhY2hlQnVja2V0IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IFMzQ2xpZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYnVja2V0TmFtZTogc3RyaW5nLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIFRoZSBib2R5IG9mIHRoZSBvYmplY3QgYXQgYGtleWAsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm9uZSAoYE5vU3VjaEtleWAsIG9yIGFuXG4gICAqIGVtcHR5IHJlc3BvbnNlIGJvZHkpLiBBbnkgb3RoZXIgZXJyb3IgaXMgdGhyb3duOiB0aGUgaGFuZGxlcnMgZGlzYWdyZWUgb25cbiAgICogd2hldGhlciBvbmUgaXMgd29ydGggbG9nZ2luZy5cbiAgICovXG4gIGFzeW5jIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZChcbiAgICAgICAgbmV3IEdldE9iamVjdENvbW1hbmQoeyBCdWNrZXQ6IHRoaXMuYnVja2V0TmFtZSwgS2V5OiBrZXkgfSksXG4gICAgICApO1xuICAgICAgaWYgKCFyZXNwb25zZS5Cb2R5KSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXdhaXQgcmVzcG9uc2UuQm9keS50cmFuc2Zvcm1Ub1N0cmluZyhcInV0Zi04XCIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb1N1Y2hLZXkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBXcml0ZSBgYm9keWAgYXMgYSBKU09OIG9iamVjdCBhdCBga2V5YC4gKi9cbiAgYXN5bmMgcHV0SnNvbihrZXk6IHN0cmluZywgYm9keTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jbGllbnQuc2VuZChcbiAgICAgIG5ldyBQdXRPYmplY3RDb21tYW5kKHtcbiAgICAgICAgQnVja2V0OiB0aGlzLmJ1Y2tldE5hbWUsXG4gICAgICAgIEtleToga2V5LFxuICAgICAgICBCb2R5OiBib2R5LFxuICAgICAgICBDb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XCIsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG59XG4iXX0=
|