velocious 1.0.409 → 1.0.410
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/build/src/database/table-data/table-column.d.ts.map +1 -1
- package/build/src/database/table-data/table-column.js +5 -2
- package/build/src/frontend-models/base.d.ts +15 -12
- package/build/src/frontend-models/base.d.ts.map +1 -1
- package/build/src/frontend-models/base.js +96 -27
- package/build/src/frontend-models/query.d.ts +55 -3
- package/build/src/frontend-models/query.d.ts.map +1 -1
- package/build/src/frontend-models/query.js +157 -14
- package/build/src/frontend-models/use-destroyed-event.d.ts.map +1 -1
- package/build/src/frontend-models/use-destroyed-event.js +19 -10
- package/build/src/frontend-models/use-model-class-event.d.ts +1 -1
- package/build/src/frontend-models/use-model-class-event.d.ts.map +1 -1
- package/build/src/frontend-models/use-model-class-event.js +26 -17
- package/build/src/frontend-models/use-updated-event.d.ts.map +1 -1
- package/build/src/frontend-models/use-updated-event.js +16 -7
- package/build/src/frontend-models/websocket-channel.d.ts +46 -6
- package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
- package/build/src/frontend-models/websocket-channel.js +163 -19
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts +3 -4
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts.map +1 -1
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.js +12 -8
- package/package.json +3 -3
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import * as inflection from "inflection";
|
|
3
3
|
import timeout from "awaitery/build/timeout.js";
|
|
4
4
|
import wait from "awaitery/build/wait.js";
|
|
5
|
-
import FrontendModelQuery, {
|
|
5
|
+
import FrontendModelQuery, { frontendModelEventOptionsPayload } from "./query.js";
|
|
6
6
|
import FrontendModelPreloader from "./preloader.js";
|
|
7
7
|
import { registerFrontendModel, resolveFrontendModelClass } from "./model-registry.js";
|
|
8
8
|
import { validateFrontendModelResourceCommandName, validateFrontendModelResourcePath } from "./resource-config-validation.js";
|
|
@@ -633,7 +633,7 @@ function cloneFrontendModelAttributes(value) {
|
|
|
633
633
|
*/
|
|
634
634
|
const FRONTEND_MODELS_CHANNEL_NAME = "frontend-models";
|
|
635
635
|
/**
|
|
636
|
-
* @typedef {{callback: (payload: {id: string, model: InstanceType<typeof FrontendModelBase>}) => void, projectionPayload: import("./query.js").FrontendModelProjectionPayload}} FrontendModelModelEventCallbackEntry
|
|
636
|
+
* @typedef {{callback: (payload: {id: string, model: InstanceType<typeof FrontendModelBase>}) => void, eventFilterKey: string | null, eventFilterPayload: import("./query.js").FrontendModelEventFilterPayload | null, projectionPayload: import("./query.js").FrontendModelProjectionPayload}} FrontendModelModelEventCallbackEntry
|
|
637
637
|
*/
|
|
638
638
|
/**
|
|
639
639
|
* @typedef {{callback: (payload: {id: string}) => void}} FrontendModelDestroyEventCallbackEntry
|
|
@@ -705,6 +705,11 @@ function mergeFrontendModelEventProjectionPayload(target, source) {
|
|
|
705
705
|
target.select = {};
|
|
706
706
|
mergeFrontendModelEventSelect(target.select, source.select);
|
|
707
707
|
}
|
|
708
|
+
if (source.selectsExtra) {
|
|
709
|
+
if (!target.selectsExtra)
|
|
710
|
+
target.selectsExtra = {};
|
|
711
|
+
mergeFrontendModelEventSelect(target.selectsExtra, source.selectsExtra);
|
|
712
|
+
}
|
|
708
713
|
if (source.withCount) {
|
|
709
714
|
if (!target.withCount)
|
|
710
715
|
target.withCount = [];
|
|
@@ -724,6 +729,39 @@ function mergeFrontendModelEventProjectionPayload(target, source) {
|
|
|
724
729
|
}
|
|
725
730
|
}
|
|
726
731
|
}
|
|
732
|
+
/**
|
|
733
|
+
* @param {unknown} body - Raw websocket event body.
|
|
734
|
+
* @returns {Set<string>} - Matched event filter keys delivered by the backend.
|
|
735
|
+
*/
|
|
736
|
+
function frontendModelMatchedEventFilterKeys(body) {
|
|
737
|
+
if (!body || typeof body !== "object")
|
|
738
|
+
return new Set();
|
|
739
|
+
const keys = /** @type {{matchedEventFilterKeys?: unknown}} */ (body).matchedEventFilterKeys;
|
|
740
|
+
if (!Array.isArray(keys))
|
|
741
|
+
return new Set();
|
|
742
|
+
return new Set(keys.map((key) => String(key)));
|
|
743
|
+
}
|
|
744
|
+
/**
|
|
745
|
+
* @param {FrontendModelModelEventCallbackEntry} entry - Callback entry.
|
|
746
|
+
* @param {Set<string>} matchedEventFilterKeys - Backend matched filter keys.
|
|
747
|
+
* @returns {boolean} Whether the callback should receive the event.
|
|
748
|
+
*/
|
|
749
|
+
function frontendModelEventEntryMatches(entry, matchedEventFilterKeys) {
|
|
750
|
+
if (!entry.eventFilterKey)
|
|
751
|
+
return true;
|
|
752
|
+
return matchedEventFilterKeys.has(entry.eventFilterKey);
|
|
753
|
+
}
|
|
754
|
+
/**
|
|
755
|
+
* @param {typeof FrontendModelBase} ModelClass - Event model class.
|
|
756
|
+
* @param {import("./query.js").FrontendModelEventOptions} options - Event options.
|
|
757
|
+
* @returns {void}
|
|
758
|
+
*/
|
|
759
|
+
function assertNoDestroyEventFilter(ModelClass, options) {
|
|
760
|
+
const eventOptionsPayload = frontendModelEventOptionsPayload(ModelClass, options);
|
|
761
|
+
if (!eventOptionsPayload.eventFilterKey)
|
|
762
|
+
return;
|
|
763
|
+
throw new Error("Frontend model destroy event subscriptions do not support query filters");
|
|
764
|
+
}
|
|
727
765
|
/**
|
|
728
766
|
* Per-model class singleton that multiplexes all registered onCreate /
|
|
729
767
|
* onUpdate / onDestroy callbacks — class-level + instance-level —
|
|
@@ -755,12 +793,15 @@ class FrontendModelEventSubscription {
|
|
|
755
793
|
this.subscriptionParamsKey = null;
|
|
756
794
|
}
|
|
757
795
|
/**
|
|
758
|
-
* @returns {{model: string} & import("./query.js").FrontendModelProjectionPayload} - Current websocket subscription params.
|
|
796
|
+
* @returns {{model: string, eventFilters?: import("./query.js").FrontendModelEventFilterPayloadEntry[], unfilteredEventDelivery?: boolean} & import("./query.js").FrontendModelProjectionPayload} - Current websocket subscription params.
|
|
759
797
|
*/
|
|
760
798
|
subscriptionParams() {
|
|
761
799
|
/** @type {import("./query.js").FrontendModelProjectionPayload} */
|
|
762
800
|
const projectionPayload = {};
|
|
801
|
+
/** @type {Record<string, import("./query.js").FrontendModelEventFilterPayloadEntry>} */
|
|
802
|
+
const eventFiltersByKey = {};
|
|
763
803
|
const projectionEntries = [];
|
|
804
|
+
let hasUnfilteredEventDelivery = this.classDestroyCallbacks.size > 0;
|
|
764
805
|
for (const entry of this.classCreateCallbacks)
|
|
765
806
|
projectionEntries.push(entry);
|
|
766
807
|
for (const entry of this.classUpdateCallbacks)
|
|
@@ -768,12 +809,31 @@ class FrontendModelEventSubscription {
|
|
|
768
809
|
for (const listener of this.instanceListeners.values()) {
|
|
769
810
|
for (const entry of listener.updateCallbacks)
|
|
770
811
|
projectionEntries.push(entry);
|
|
812
|
+
if (listener.destroyCallbacks.size > 0)
|
|
813
|
+
hasUnfilteredEventDelivery = true;
|
|
771
814
|
}
|
|
772
815
|
for (const entry of projectionEntries) {
|
|
773
816
|
mergeFrontendModelEventProjectionPayload(projectionPayload, entry.projectionPayload);
|
|
817
|
+
if (entry.eventFilterKey && entry.eventFilterPayload) {
|
|
818
|
+
eventFiltersByKey[entry.eventFilterKey] = {
|
|
819
|
+
...entry.eventFilterPayload,
|
|
820
|
+
key: entry.eventFilterKey
|
|
821
|
+
};
|
|
822
|
+
}
|
|
823
|
+
else {
|
|
824
|
+
hasUnfilteredEventDelivery = true;
|
|
825
|
+
}
|
|
774
826
|
}
|
|
827
|
+
const eventFilters = Object.values(eventFiltersByKey);
|
|
828
|
+
const eventFilterParams = eventFilters.length > 0
|
|
829
|
+
? {
|
|
830
|
+
eventFilters,
|
|
831
|
+
...(hasUnfilteredEventDelivery ? { unfilteredEventDelivery: true } : {})
|
|
832
|
+
}
|
|
833
|
+
: {};
|
|
775
834
|
return {
|
|
776
835
|
model: this.ModelClass.getModelName(),
|
|
836
|
+
...eventFilterParams,
|
|
777
837
|
...projectionPayload
|
|
778
838
|
};
|
|
779
839
|
}
|
|
@@ -843,6 +903,7 @@ class FrontendModelEventSubscription {
|
|
|
843
903
|
if (rawId === undefined || rawId === null)
|
|
844
904
|
return;
|
|
845
905
|
const id = String(rawId);
|
|
906
|
+
const matchedEventFilterKeys = frontendModelMatchedEventFilterKeys(body);
|
|
846
907
|
if (action === "destroy") {
|
|
847
908
|
const listener = this.instanceListeners.get(id);
|
|
848
909
|
if (listener) {
|
|
@@ -872,22 +933,27 @@ class FrontendModelEventSubscription {
|
|
|
872
933
|
const freshModel = /** @type {any} */ (this.ModelClass).instantiateFromResponse(deserializedRecord);
|
|
873
934
|
const listener = this.instanceListeners.get(id);
|
|
874
935
|
if (action === "update" && listener) {
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
936
|
+
const matchingUpdateCallbacks = Array.from(listener.updateCallbacks).filter((entry) => frontendModelEventEntryMatches(entry, matchedEventFilterKeys));
|
|
937
|
+
if (matchingUpdateCallbacks.length > 0) {
|
|
938
|
+
// Auto-merge into the registered instance so callers reading
|
|
939
|
+
// through the same handle see fresh attributes.
|
|
940
|
+
const instanceAny = /** @type {any} */ (listener.instance);
|
|
941
|
+
instanceAny.assignAttributes(freshModel.attributes());
|
|
942
|
+
instanceAny._persistedAttributes = cloneFrontendModelAttributes(listener.instance.attributes());
|
|
943
|
+
for (const entry of matchingUpdateCallbacks) {
|
|
944
|
+
try {
|
|
945
|
+
entry.callback({ id, model: listener.instance });
|
|
946
|
+
}
|
|
947
|
+
catch (error) {
|
|
948
|
+
console.error(error);
|
|
949
|
+
}
|
|
886
950
|
}
|
|
887
951
|
}
|
|
888
952
|
}
|
|
889
953
|
const classCallbacks = action === "create" ? this.classCreateCallbacks : this.classUpdateCallbacks;
|
|
890
954
|
for (const entry of classCallbacks) {
|
|
955
|
+
if (!frontendModelEventEntryMatches(entry, matchedEventFilterKeys))
|
|
956
|
+
continue;
|
|
891
957
|
try {
|
|
892
958
|
entry.callback({ id, model: freshModel });
|
|
893
959
|
}
|
|
@@ -2332,16 +2398,17 @@ export default class FrontendModelBase {
|
|
|
2332
2398
|
/**
|
|
2333
2399
|
* Class-level hook fired when any record of this model is created.
|
|
2334
2400
|
* Subscribe-time authorization only — once a subscription is
|
|
2335
|
-
* accepted,
|
|
2336
|
-
* without re-checking per-record visibility.
|
|
2401
|
+
* accepted, future `create` events for this model are delivered
|
|
2402
|
+
* without re-checking per-record visibility. Query options can still
|
|
2403
|
+
* narrow which events reach this callback.
|
|
2337
2404
|
* @this {typeof FrontendModelBase}
|
|
2338
2405
|
* @param {(payload: {id: string, model: InstanceType<typeof FrontendModelBase>}) => void} callback - Event callback.
|
|
2339
|
-
* @param {import("./query.js").
|
|
2406
|
+
* @param {import("./query.js").FrontendModelEventOptions} [options] - Event query or record projection options.
|
|
2340
2407
|
* @returns {Promise<() => void>} - Unsubscribe callback.
|
|
2341
2408
|
*/
|
|
2342
2409
|
static async onCreate(callback, options = {}) {
|
|
2343
2410
|
const sub = ensureFrontendModelEventSubscription(this);
|
|
2344
|
-
const entry = { callback,
|
|
2411
|
+
const entry = { callback, ...frontendModelEventOptionsPayload(this, options) };
|
|
2345
2412
|
sub.classCreateCallbacks.add(entry);
|
|
2346
2413
|
await sub.ensureSubscribed();
|
|
2347
2414
|
return () => {
|
|
@@ -2353,12 +2420,12 @@ export default class FrontendModelBase {
|
|
|
2353
2420
|
* Class-level hook fired when any record of this model is updated.
|
|
2354
2421
|
* @this {typeof FrontendModelBase}
|
|
2355
2422
|
* @param {(payload: {id: string, model: InstanceType<typeof FrontendModelBase>}) => void} callback - Event callback.
|
|
2356
|
-
* @param {import("./query.js").
|
|
2423
|
+
* @param {import("./query.js").FrontendModelEventOptions} [options] - Event query or record projection options.
|
|
2357
2424
|
* @returns {Promise<() => void>} - Unsubscribe callback.
|
|
2358
2425
|
*/
|
|
2359
2426
|
static async onUpdate(callback, options = {}) {
|
|
2360
2427
|
const sub = ensureFrontendModelEventSubscription(this);
|
|
2361
|
-
const entry = { callback,
|
|
2428
|
+
const entry = { callback, ...frontendModelEventOptionsPayload(this, options) };
|
|
2362
2429
|
sub.classUpdateCallbacks.add(entry);
|
|
2363
2430
|
await sub.ensureSubscribed();
|
|
2364
2431
|
return () => {
|
|
@@ -2370,10 +2437,11 @@ export default class FrontendModelBase {
|
|
|
2370
2437
|
* Class-level hook fired when any record of this model is destroyed.
|
|
2371
2438
|
* @this {typeof FrontendModelBase}
|
|
2372
2439
|
* @param {(payload: {id: string}) => void} callback - Event callback.
|
|
2373
|
-
* @param {import("./query.js").
|
|
2440
|
+
* @param {import("./query.js").FrontendModelEventOptions} [options] - Accepted for API symmetry; destroy events carry ids only.
|
|
2374
2441
|
* @returns {Promise<() => void>} - Unsubscribe callback.
|
|
2375
2442
|
*/
|
|
2376
|
-
static async onDestroy(callback,
|
|
2443
|
+
static async onDestroy(callback, options = {}) {
|
|
2444
|
+
assertNoDestroyEventFilter(this, options);
|
|
2377
2445
|
const sub = ensureFrontendModelEventSubscription(this);
|
|
2378
2446
|
const entry = { callback };
|
|
2379
2447
|
sub.classDestroyCallbacks.add(entry);
|
|
@@ -2389,7 +2457,7 @@ export default class FrontendModelBase {
|
|
|
2389
2457
|
* before the callback runs, so callers can read fresh values via
|
|
2390
2458
|
* `this.someAttr()` without re-fetching.
|
|
2391
2459
|
* @param {(payload: {id: string, model: InstanceType<typeof FrontendModelBase>}) => void} callback - Event callback.
|
|
2392
|
-
* @param {import("./query.js").
|
|
2460
|
+
* @param {import("./query.js").FrontendModelEventOptions} [options] - Event query or record projection options.
|
|
2393
2461
|
* @returns {Promise<() => void>} - Unsubscribe callback.
|
|
2394
2462
|
*/
|
|
2395
2463
|
async onUpdate(callback, options = {}) {
|
|
@@ -2397,7 +2465,7 @@ export default class FrontendModelBase {
|
|
|
2397
2465
|
const ModelClass = /** @type {typeof FrontendModelBase} */ (this.constructor);
|
|
2398
2466
|
const sub = ensureFrontendModelEventSubscription(ModelClass);
|
|
2399
2467
|
const id = String(self.id());
|
|
2400
|
-
const entry = { callback,
|
|
2468
|
+
const entry = { callback, ...frontendModelEventOptionsPayload(ModelClass, options) };
|
|
2401
2469
|
let listener = sub.instanceListeners.get(id);
|
|
2402
2470
|
if (!listener) {
|
|
2403
2471
|
listener = { instance: this, updateCallbacks: new Set(), destroyCallbacks: new Set() };
|
|
@@ -2422,12 +2490,13 @@ export default class FrontendModelBase {
|
|
|
2422
2490
|
/**
|
|
2423
2491
|
* Instance-level hook fired when THIS record is destroyed.
|
|
2424
2492
|
* @param {(payload: {id: string}) => void} callback - Event callback.
|
|
2425
|
-
* @param {import("./query.js").
|
|
2493
|
+
* @param {import("./query.js").FrontendModelEventOptions} [options] - Accepted for API symmetry; destroy events carry ids only.
|
|
2426
2494
|
* @returns {Promise<() => void>} - Unsubscribe callback.
|
|
2427
2495
|
*/
|
|
2428
|
-
async onDestroy(callback,
|
|
2496
|
+
async onDestroy(callback, options = {}) {
|
|
2429
2497
|
const self = /** @type {any} */ (this);
|
|
2430
2498
|
const ModelClass = /** @type {typeof FrontendModelBase} */ (this.constructor);
|
|
2499
|
+
assertNoDestroyEventFilter(ModelClass, options);
|
|
2431
2500
|
const sub = ensureFrontendModelEventSubscription(ModelClass);
|
|
2432
2501
|
const id = String(self.id());
|
|
2433
2502
|
const entry = { callback };
|
|
@@ -3093,4 +3162,4 @@ export default class FrontendModelBase {
|
|
|
3093
3162
|
return new Set();
|
|
3094
3163
|
}
|
|
3095
3164
|
}
|
|
3096
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mcm9udGVuZC1tb2RlbHMvYmFzZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFDeEMsT0FBTyxPQUFPLE1BQU0sMkJBQTJCLENBQUE7QUFDL0MsT0FBTyxJQUFJLE1BQU0sd0JBQXdCLENBQUE7QUFDekMsT0FBTyxrQkFBa0IsRUFBRSxFQUFDLDhCQUE4QixFQUFDLE1BQU0sWUFBWSxDQUFBO0FBQzdFLE9BQU8sc0JBQXNCLE1BQU0sZ0JBQWdCLENBQUE7QUFDbkQsT0FBTyxFQUFDLHFCQUFxQixFQUFFLHlCQUF5QixFQUFDLE1BQU0scUJBQXFCLENBQUE7QUFDcEYsT0FBTyxFQUFDLHdDQUF3QyxFQUFFLGlDQUFpQyxFQUFDLE1BQU0saUNBQWlDLENBQUE7QUFDM0gsT0FBTyxFQUFDLHNDQUFzQyxFQUFFLG9DQUFvQyxFQUFDLE1BQU0sOEJBQThCLENBQUE7QUFDekgsT0FBTyx3QkFBd0IsTUFBTSxvQ0FBb0MsQ0FBQTtBQUN6RSxPQUFPLEVBQUMsbUJBQW1CLEVBQUUsMkJBQTJCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQTtBQUMzRixPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUV4RCw2SEFBNkg7QUFDN0gsbUZBQW1GO0FBQ25GOztHQUVHO0FBQ0g7O0dBRUc7QUFDSDs7Ozs7Ozs7R0FRRztBQUNIOzs7O0dBSUc7QUFFSCwyQ0FBMkM7QUFDM0MsTUFBTSw0QkFBNEIsR0FBRyxFQUFFLENBQUE7QUFDdkMsTUFBTSw4QkFBOEIsR0FBRyxrQkFBa0IsQ0FBQTtBQUN6RCxNQUFNLDJCQUEyQixHQUFHLDBCQUEwQixDQUFBO0FBQzlELE1BQU0sdUJBQXVCLEdBQUcsc0JBQXNCLENBQUE7QUFDdEQsTUFBTSxzQkFBc0IsR0FBRyxxQkFBcUIsQ0FBQTtBQUNwRCxN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QUFDLEVBQUUsQ0FBQztZQUM5QixPQUFPLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLE9BQU8sYUFBYSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFDekYsQ0FBQztRQUVELElBQUksVUFBVSxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2pELE9BQU8sSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO1FBQ3pDLENBQUM7UUFFRCxPQUFPLElBQUksR0FBRyxFQUFFLENBQUE7SUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgKiBhcyBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcbmltcG9ydCB0aW1lb3V0IGZyb20gXCJhd2FpdGVyeS9idWlsZC90aW1lb3V0LmpzXCJcbmltcG9ydCB3YWl0IGZyb20gXCJhd2FpdGVyeS9idWlsZC93YWl0LmpzXCJcbmltcG9ydCBGcm9udGVuZE1vZGVsUXVlcnksIHtmcm9udGVuZE1vZGVsUHJvamVjdGlvblBheWxvYWR9IGZyb20gXCIuL3F1ZXJ5LmpzXCJcbmltcG9ydCBGcm9udGVuZE1vZGVsUHJlbG9hZGVyIGZyb20gXCIuL3ByZWxvYWRlci5qc1wiXG5pbXBvcnQge3JlZ2lzdGVyRnJvbnRlbmRNb2RlbCwgcmVzb2x2ZUZyb250ZW5kTW9kZWxDbGFzc30gZnJvbSBcIi4vbW9kZWwtcmVnaXN0cnkuanNcIlxuaW1wb3J0IHt2YWxpZGF0ZUZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbW1hbmROYW1lLCB2YWxpZGF0ZUZyb250ZW5kTW9kZWxSZXNvdXJjZVBhdGh9IGZyb20gXCIuL3Jlc291cmNlLWNvbmZpZy12YWxpZGF0aW9uLmpzXCJcbmltcG9ydCB7ZGVzZXJpYWxpemVGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWUsIHNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZX0gZnJvbSBcIi4vdHJhbnNwb3J0LXNlcmlhbGl6YXRpb24uanNcIlxuaW1wb3J0IFZlbG9jaW91c1dlYnNvY2tldENsaWVudCBmcm9tIFwiLi4vaHR0cC1jbGllbnQvd2Vic29ja2V0LWNsaWVudC5qc1wiXG5pbXBvcnQge2J1ZmZlck91dGdvaW5nRXZlbnQsIGRyYWluQnVmZmVyZWRPdXRnb2luZ0V2ZW50c30gZnJvbSBcIi4vb3V0Z29pbmctZXZlbnQtYnVmZmVyLmpzXCJcbmltcG9ydCB7ZGVmaW5lTW9kZWxTY29wZX0gZnJvbSBcIi4uL3V0aWxzL21vZGVsLXNjb3BlLmpzXCJcblxuLyoqIEB0eXBlZGVmIHtcImNyZWF0ZVwiIHwgXCJmaW5kXCIgfCBcImluZGV4XCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIgfCBcImF0dGFjaFwiIHwgXCJkb3dubG9hZFwiIHwgXCJ1cmxcIn0gRnJvbnRlbmRNb2RlbENvbW1hbmRUeXBlICovXG4vKiogQHR5cGVkZWYge0Zyb250ZW5kTW9kZWxDb21tYW5kVHlwZSB8IHN0cmluZ30gRnJvbnRlbmRNb2RlbFJlcXVlc3RDb21tYW5kVHlwZSAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwiaGFzT25lXCIgfCBcImhhc01hbnlcIn19IEZyb250ZW5kTW9kZWxBdHRhY2htZW50RGVmaW5pdGlvblxuICovXG4vKipcbiAqIEB0eXBlZGVmIHt7YXR0cmlidXRlcz86IHN0cmluZ1tdLCBidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzPzogc3RyaW5nW10sIGJ1aWx0SW5NZW1iZXJDb21tYW5kcz86IHN0cmluZ1tdLCBjb2xsZWN0aW9uQ29tbWFuZHM/OiBzdHJpbmdbXSwgY29tbWFuZHM/OiBzdHJpbmdbXSwgbWVtYmVyQ29tbWFuZHM/OiBzdHJpbmdbXSwgYXR0YWNobWVudHM/OiBSZWNvcmQ8c3RyaW5nLCBGcm9udGVuZE1vZGVsQXR0YWNobWVudERlZmluaXRpb24+LCBtb2RlbE5hbWU/OiBzdHJpbmcsIG5lc3RlZEF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCB7YWxsb3dEZXN0cm95PzogYm9vbGVhbiwgbGltaXQ/OiBudW1iZXJ9PiwgcHJpbWFyeUtleT86IHN0cmluZywgcmVsYXRpb25zaGlwcz86IHN0cmluZ1tdfX0gRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlnXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRnJvbnRlbmRNb2RlbFRyYW5zcG9ydENvbmZpZ1xuICogQHByb3BlcnR5IHtzdHJpbmcgfCAoKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCl9IFt1cmxdIC0gT3B0aW9uYWwgZnJvbnRlbmQtbW9kZWwgVVJMLiBUaGlzIHNob3VsZCBiZSB0aGUgc2hhcmVkIGVuZHBvaW50IChmb3IgZXhhbXBsZSBgXCIvZnJvbnRlbmQtbW9kZWxzXCJgIG9yIGBcImh0dHBzOi8vZXhhbXBsZS5jb20vZnJvbnRlbmQtbW9kZWxzXCJgKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3NoYXJlZF0gLSBEZXByZWNhdGVkIHNoYXJlZC1lbmRwb2ludCBmbGFnIHJldGFpbmVkIGZvciBjb21wYXRpYmlsaXR5LiBGcm9udGVuZC1tb2RlbCBDUlVEL2N1c3RvbSBjb21tYW5kcyB1c2UgdGhlIHNoYXJlZCBmcm9udGVuZC1tb2RlbCBBUEkgZW52ZWxvcGUgYnkgZGVmYXVsdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgKCgpID0+IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwpfSBbd2Vic29ja2V0VXJsXSAtIE9wdGlvbmFsIHdlYnNvY2tldCBVUkwuIFdoZW4gc2V0LCBWZWxvY2lvdXMgY3JlYXRlcyBhbmQgbWFuYWdlcyBpdHMgb3duIHdlYnNvY2tldCBjbGllbnQgaW50ZXJuYWxseS4gU3Vic2NyaXB0aW9ucyB1c2UgdGhlIHdlYnNvY2tldDsgQ1JVRCB1c2VzIEhUVFAgYW5kIGZhbGxzIGJhY2sgZ3JhY2VmdWxseS4gRXhhbXBsZTogYFwid3M6Ly9sb2NhbGhvc3Q6MzAwNi93ZWJzb2NrZXRcImAuXG4gKiBAcHJvcGVydHkge3twb3N0OiAocGF0aDogc3RyaW5nLCBib2R5PzogYW55LCBvcHRpb25zPzoge2hlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSkgPT4gUHJvbWlzZTx7anNvbjogKCkgPT4gYW55fT4sIHN1YnNjcmliZTogKGNoYW5uZWw6IHN0cmluZywgb3B0aW9uczoge3BhcmFtcz86IFJlY29yZDxzdHJpbmcsIGFueT59LCBjYWxsYmFjazogKHBheWxvYWQ6IGFueSkgPT4gdm9pZCkgPT4gKCgpID0+IHZvaWQpLCBzdWJzY3JpYmVBbmRXYWl0PzogKGNoYW5uZWw6IHN0cmluZywgb3B0aW9uczoge3BhcmFtcz86IFJlY29yZDxzdHJpbmcsIGFueT59LCBjYWxsYmFjazogKHBheWxvYWQ6IGFueSkgPT4gdm9pZCkgPT4gUHJvbWlzZTwoKCkgPT4gdm9pZCk+fX0gW3dlYnNvY2tldENsaWVudF0gLSBPcHRpb25hbCB3ZWJzb2NrZXQgY2xpZW50IGZvciBzaGFyZWQgZnJvbnRlbmQtbW9kZWwgQVBJIHJlcXVlc3RzIGFuZCBzdWJzY3JpcHRpb25zLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgKCgpID0+IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pfSBbcmVxdWVzdEhlYWRlcnNdIC0gRXh0cmEgSFRUUC9XUyBoZWFkZXJzIHRvIGF0dGFjaCB0byBldmVyeSBmcm9udGVuZC1tb2RlbCBBUEkgcmVxdWVzdC4gUGFzcyBhIGZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlbSBhdCByZXF1ZXN0IHRpbWUgKGZvciBleGFtcGxlIHRvIGluY2x1ZGUgdGhlIGN1cnJlbnQgbG9jYWxlKS5cbiAqIEBwcm9wZXJ0eSB7e2dldDogKCkgPT4gc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB8IFByb21pc2U8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD4sIHNldDogKHNlc3Npb25JZDogc3RyaW5nKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPiwgY2xlYXI6ICgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+fX0gW3Nlc3Npb25TdG9yZV0gLSBPcHRpb25hbCBzZXNzaW9uSWQgcGVyc2lzdGVuY2UgaG9vayBmb3J3YXJkZWQgdG8gdGhlIGludGVybmFsIGBWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnRgIHNvIFdTIHNlc3Npb25zIGNhbiBiZSByZXN1bWVkIGFjcm9zcyBwYWdlIHJlbG9hZHMgLyBhcHAgcmVzdGFydHMuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRnJvbnRlbmRNb2RlbElkbGVXYWl0QXJnc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFtxdWlldE1zXSAtIE1pbGxpc2Vjb25kcyB0aGUgdHJhbnNwb3J0IG11c3Qgc3RheSBpZGxlIGJlZm9yZSByZXNvbHZpbmcuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdIC0gVGltZW91dCBpbiBtaWxsaXNlY29uZHMuXG4gKi9cblxuLyoqIEB0eXBlIHtGcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnfSAqL1xuY29uc3QgZnJvbnRlbmRNb2RlbFRyYW5zcG9ydENvbmZpZyA9IHt9XG5jb25zdCBTSEFSRURfRlJPTlRFTkRfTU9ERUxfQVBJX1BBVEggPSBcIi9mcm9udGVuZC1tb2RlbHNcIlxuY29uc3QgUFJFTE9BREVEX1JFTEFUSU9OU0hJUFNfS0VZID0gXCJfX3ByZWxvYWRlZFJlbGF0aW9uc2hpcHNcIlxuY29uc3QgU0VMRUNURURfQVRUUklCVVRFU19LRVkgPSBcIl9fc2VsZWN0ZWRBdHRyaWJ1dGVzXCJcbmNvbnN0IEFTU09DSUFUSU9OX0NPVU5UU19LRVkgPSBcIl9fYXNzb2NpYXRpb25Db3VudHNcIlxuY29uc3QgUVVFUllfREFUQV9LRVkgPSBcIl9fcXVlcnlEYXRhXCJcbmNvbnN0IEFCSUxJVElFU19LRVkgPSBcIl9fYWJpbGl0aWVzXCJcbi8qKiBAdHlwZSB7QXJyYXk8e2NvbW1hbmROYW1lPzogc3RyaW5nLCBjb21tYW5kVHlwZTogRnJvbnRlbmRNb2RlbFJlcXVlc3RDb21tYW5kVHlwZSwgY3VzdG9tUGF0aD86IHN0cmluZywgbW9kZWxDbGFzczogdHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlLCBwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCByZXF1ZXN0SWQ6IHN0cmluZywgcmVzb2x2ZTogKHJlc3BvbnNlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB2b2lkLCByZWplY3Q6IChlcnJvcjogdW5rbm93bikgPT4gdm9pZCwgcmVzb3VyY2VQYXRoPzogc3RyaW5nIHwgbnVsbH0+fSAqL1xubGV0IHBlbmRpbmdTaGFyZWRGcm9udGVuZE1vZGVsUmVxdWVzdHMgPSBbXVxubGV0IHNoYXJlZEZyb250ZW5kTW9kZWxSZXF1ZXN0SWQgPSAwXG5sZXQgc2hhcmVkRnJvbnRlbmRNb2RlbEZsdXNoU2NoZWR1bGVkID0gZmFsc2VcbmxldCBhY3RpdmVGcm9udGVuZE1vZGVsVHJhbnNwb3J0UmVxdWVzdENvdW50ID0gMFxuLyoqIEB0eXBlIHtBcnJheTwoKSA9PiB2b2lkPn0gKi9cbmxldCBmcm9udGVuZE1vZGVsSWRsZVJlc29sdmVycyA9IFtdXG5cbi8qKiBAdHlwZSB7VmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50IHwgbnVsbH0gKi9cbmxldCBpbnRlcm5hbFdlYnNvY2tldENsaWVudCA9IG51bGxcblxuLyoqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgYWxsIHF1ZXVlZCBhbmQgYWN0aXZlIGZyb250ZW5kLW1vZGVsIHRyYW5zcG9ydCByZXF1ZXN0cyBhcmUgZG9uZS4gKi9cbmZ1bmN0aW9uIGZyb250ZW5kTW9kZWxUcmFuc3BvcnRJc0lkbGUoKSB7XG4gIHJldHVybiBhY3RpdmVGcm9udGVuZE1vZGVsVHJhbnNwb3J0UmVxdWVzdENvdW50ID09PSAwXG4gICAgJiYgcGVuZGluZ1NoYXJlZEZyb250ZW5kTW9kZWxSZXF1ZXN0cy5sZW5ndGggPT09IDBcbiAgICAmJiAhc2hhcmVkRnJvbnRlbmRNb2RlbEZsdXNoU2NoZWR1bGVkXG59XG5cbi8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbmZ1bmN0aW9uIHJlc29sdmVGcm9udGVuZE1vZGVsSWRsZVdhaXRlcnMoKSB7XG4gIGlmICghZnJvbnRlbmRNb2RlbFRyYW5zcG9ydElzSWRsZSgpKSByZXR1cm5cblxuICBjb25zdCByZXNvbHZlcnMgPSBmcm9udGVuZE1vZGVsSWRsZVJlc29sdmVyc1xuICBmcm9udGVuZE1vZGVsSWRsZVJlc29sdmVycyA9IFtdXG5cbiAgZm9yIChjb25zdCByZXNvbHZlIG9mIHJlc29sdmVycykge1xuICAgIHJlc29sdmUoKVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IG1pbGxpc2Vjb25kcyAtIFF1aWV0IHBlcmlvZCBsZW5ndGguXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgYWZ0ZXIgdGhlIHF1aWV0IHBlcmlvZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2FpdEZvckZyb250ZW5kTW9kZWxUcmFuc3BvcnRRdWlldFBlcmlvZChtaWxsaXNlY29uZHMpIHtcbiAgaWYgKG1pbGxpc2Vjb25kcyA8PSAwKSByZXR1cm5cblxuICBhd2FpdCB3YWl0KG1pbGxpc2Vjb25kcylcbn1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gcXVpZXRNcyAtIE1pbGxpc2Vjb25kcyB0aGUgdHJhbnNwb3J0IG11c3Qgc3RheSBpZGxlIGJlZm9yZSByZXNvbHZpbmcuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgd2hlbiB0cmFuc3BvcnQgc3RheXMgaWRsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2FpdEZvckZyb250ZW5kTW9kZWxUcmFuc3BvcnRJZGxlKHF1aWV0TXMgPSAwKSB7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKGZyb250ZW5kTW9kZWxUcmFuc3BvcnRJc0lkbGUoKSkge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHF1ZXVlTWljcm90YXNrKCgpID0+IHJlc29sdmUodW5kZWZpbmVkKSkpXG5cbiAgICAgIGlmIChmcm9udGVuZE1vZGVsVHJhbnNwb3J0SXNJZGxlKCkpIHtcbiAgICAgICAgYXdhaXQgd2FpdEZvckZyb250ZW5kTW9kZWxUcmFuc3BvcnRRdWlldFBlcmlvZChxdWlldE1zKVxuXG4gICAgICAgIGlmIChmcm9udGVuZE1vZGVsVHJhbnNwb3J0SXNJZGxlKCkpIHJldHVyblxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBmcm9udGVuZE1vZGVsSWRsZVJlc29sdmVycy5wdXNoKCgpID0+IHJlc29sdmUodW5kZWZpbmVkKSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBUcmFuc3BvcnQgY2FsbGJhY2suXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBDYWxsYmFjayByZXN1bHQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRyYWNrRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFJlcXVlc3QoY2FsbGJhY2spIHtcbiAgYWN0aXZlRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFJlcXVlc3RDb3VudCArPSAxXG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxuICB9IGZpbmFsbHkge1xuICAgIGFjdGl2ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRSZXF1ZXN0Q291bnQgLT0gMVxuICAgIHJlc29sdmVGcm9udGVuZE1vZGVsSWRsZVdhaXRlcnMoKVxuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgaW50ZXJuYWwgd2Vic29ja2V0IGNsaWVudCBmcm9tIHdlYnNvY2tldFVybCBjb25maWcuXG4gKiBDcmVhdGVzIHRoZSBjbGllbnQgbGF6aWx5IG9uIGZpcnN0IGNhbGwuIFJldHVybnMgbnVsbCBpZiBXZWJTb2NrZXRcbiAqIGlzIG5vdCBhdmFpbGFibGUgb3Igd2Vic29ja2V0VXJsIGlzIG5vdCBjb25maWd1cmVkLlxuICogQHJldHVybnMge1ZlbG9jaW91c1dlYnNvY2tldENsaWVudCB8IG51bGx9IFdlYnNvY2tldCBjbGllbnQgb3IgbnVsbC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUludGVybmFsV2Vic29ja2V0Q2xpZW50KCkge1xuICBpZiAoaW50ZXJuYWxXZWJzb2NrZXRDbGllbnQpIHJldHVybiBpbnRlcm5hbFdlYnNvY2tldENsaWVudFxuXG4gIGNvbnN0IHdlYnNvY2tldFVybCA9IGZyb250ZW5kTW9kZWxUcmFuc3BvcnRDb25maWcud2Vic29ja2V0VXJsXG5cbiAgaWYgKCF3ZWJzb2NrZXRVcmwpIHJldHVybiBudWxsXG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy5XZWJTb2NrZXQgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBudWxsXG5cbiAgY29uc3QgcmVzb2x2ZWRVcmwgPSB0eXBlb2Ygd2Vic29ja2V0VXJsID09PSBcImZ1bmN0aW9uXCIgPyB3ZWJzb2NrZXRVcmwoKSA6IHdlYnNvY2tldFVybFxuXG4gIGlmICghcmVzb2x2ZWRVcmwpIHJldHVybiBudWxsXG5cbiAgaW50ZXJuYWxXZWJzb2NrZXRDbGllbnQgPSBuZXcgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50KHtcbiAgICBhdXRvUmVjb25uZWN0OiB0cnVlLFxuICAgIHNlc3Npb25TdG9yZTogZnJvbnRlbmRNb2RlbFRyYW5zcG9ydENvbmZpZy5zZXNzaW9uU3RvcmUsXG4gICAgdXJsOiByZXNvbHZlZFVybFxuICB9KVxuICBpbnRlcm5hbFdlYnNvY2tldENsaWVudC5vblJlY29ubmVjdCA9IGZsdXNoQnVmZmVyZWRPdXRnb2luZ0V2ZW50c0FmdGVyUmVjb25uZWN0XG5cbiAgcmV0dXJuIGludGVybmFsV2Vic29ja2V0Q2xpZW50XG59XG5cbi8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbmFzeW5jIGZ1bmN0aW9uIGZsdXNoQnVmZmVyZWRPdXRnb2luZ0V2ZW50c0FmdGVyUmVjb25uZWN0KCkge1xuICBpZiAoIWludGVybmFsV2Vic29ja2V0Q2xpZW50KSByZXR1cm5cblxuICBjb25zdCBldmVudHMgPSBkcmFpbkJ1ZmZlcmVkT3V0Z29pbmdFdmVudHMoKVxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBldmVudHMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGludGVybmFsV2Vic29ja2V0Q2xpZW50LnBvc3QoZXZlbnRzW2luZGV4XS5jdXN0b21QYXRoLCBldmVudHNbaW5kZXhdLnBheWxvYWQpXG4gICAgfSBjYXRjaCB7XG4gICAgICBjb25zdCBzb2NrZXRPcGVuID0gaW50ZXJuYWxXZWJzb2NrZXRDbGllbnQuc29ja2V0Py5yZWFkeVN0YXRlID09PSBpbnRlcm5hbFdlYnNvY2tldENsaWVudC5zb2NrZXQ/Lk9QRU5cblxuICAgICAgaWYgKHNvY2tldE9wZW4pIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgcmVtYWluaW5nID0gaW5kZXg7IHJlbWFpbmluZyA8IGV2ZW50cy5sZW5ndGg7IHJlbWFpbmluZyArPSAxKSB7XG4gICAgICAgIGJ1ZmZlck91dGdvaW5nRXZlbnQoZXZlbnRzW3JlbWFpbmluZ10pXG4gICAgICB9XG5cbiAgICAgIHJldHVyblxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBtb2RlbENsYXNzIC0gRnJvbnRlbmQgbW9kZWwgY2xhc3MuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIERlZmF1bHQgcmVzb3VyY2UgcGF0aCBmb3IgdGhlIG1vZGVsIGNsYXNzLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0RnJvbnRlbmRNb2RlbFJlc291cmNlUGF0aChtb2RlbENsYXNzKSB7XG4gIHJldHVybiBgLyR7aW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi5wbHVyYWxpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKG1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKCkpKSl9YFxufVxuXG4vKiogRXJyb3IgcmFpc2VkIHdoZW4gcmVhZGluZyBhbiBhdHRyaWJ1dGUgdGhhdCB3YXMgbm90IHNlbGVjdGVkIGluIHF1ZXJ5IHBheWxvYWRzLiAqL1xuZXhwb3J0IGNsYXNzIEF0dHJpYnV0ZU5vdFNlbGVjdGVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lIC0gTW9kZWwgY2xhc3MgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWUgLSBBdHRyaWJ1dGUgdGhhdCB3YXMgcmVxdWVzdGVkLlxuICAgKi9cbiAgY29uc3RydWN0b3IobW9kZWxOYW1lLCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgc3VwZXIoYCR7bW9kZWxOYW1lfSMke2F0dHJpYnV0ZU5hbWV9IHdhcyBub3Qgc2VsZWN0ZWRgKVxuICAgIHRoaXMubmFtZSA9IFwiQXR0cmlidXRlTm90U2VsZWN0ZWRFcnJvclwiXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIHZhbHVlLlxuICogQHJldHVybnMge3ZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIGFueT59IC0gV2hldGhlciB2YWx1ZSBpcyBhIHBsYWluIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKVxuXG4gIHJldHVybiBwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG90eXBlID09PSBudWxsXG59XG5cbi8qKlxuICogTGlnaHR3ZWlnaHQgc2luZ3VsYXIgcmVsYXRpb25zaGlwIHN0YXRlIGhvbGRlciBmb3IgZnJvbnRlbmQgbW9kZWwgaW5zdGFuY2VzLlxuICogQHRlbXBsYXRlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9IFNcbiAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gKi9cbmV4cG9ydCBjbGFzcyBGcm9udGVuZE1vZGVsU2luZ3VsYXJSZWxhdGlvbnNoaXAge1xuICAvKipcbiAgICogQHBhcmFtIHtJbnN0YW5jZVR5cGU8Uz59IG1vZGVsIC0gUGFyZW50IG1vZGVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25zaGlwTmFtZSAtIFJlbGF0aW9uc2hpcCBuYW1lLlxuICAgKiBAcGFyYW0ge1QgfCBudWxsfSB0YXJnZXRNb2RlbENsYXNzIC0gVGFyZ2V0IG1vZGVsIGNsYXNzLlxuICAgKi9cbiAgY29uc3RydWN0b3IobW9kZWwsIHJlbGF0aW9uc2hpcE5hbWUsIHRhcmdldE1vZGVsQ2xhc3MpIHtcbiAgICB0aGlzLm1vZGVsID0gbW9kZWxcbiAgICB0aGlzLnJlbGF0aW9uc2hpcE5hbWUgPSByZWxhdGlvbnNoaXBOYW1lXG4gICAgdGhpcy50YXJnZXRNb2RlbENsYXNzID0gdGFyZ2V0TW9kZWxDbGFzc1xuICAgIHRoaXMuX3ByZWxvYWRlZCA9IGZhbHNlXG4gICAgdGhpcy5fbG9hZGVkVmFsdWUgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGxvYWRlZFZhbHVlIC0gTG9hZGVkIHJlbGF0aW9uc2hpcCB2YWx1ZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXRMb2FkZWQobG9hZGVkVmFsdWUpIHtcbiAgICB0aGlzLl9sb2FkZWRWYWx1ZSA9IGxvYWRlZFZhbHVlID09IHVuZGVmaW5lZCA/IG51bGwgOiBsb2FkZWRWYWx1ZVxuICAgIHRoaXMuX3ByZWxvYWRlZCA9IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHJlbGF0aW9uc2hpcCBpcyBwcmVsb2FkZWQuXG4gICAqL1xuICBnZXRQcmVsb2FkZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZWxvYWRlZFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHthbnl9IC0gTG9hZGVkIHJlbGF0aW9uc2hpcCB2YWx1ZS5cbiAgICovXG4gIGxvYWRlZCgpIHtcbiAgICBpZiAoIXRoaXMuX3ByZWxvYWRlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubW9kZWwuY29uc3RydWN0b3IubmFtZX0jJHt0aGlzLnJlbGF0aW9uc2hpcE5hbWV9IGhhc24ndCBiZWVuIHByZWxvYWRlZGApXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2xvYWRlZFZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbYXR0cmlidXRlc10gLSBOZXcgbW9kZWwgYXR0cmlidXRlcy5cbiAgICogQHJldHVybnMge0luc3RhbmNlVHlwZTxUPn0gLSBCdWlsdCBtb2RlbC5cbiAgICovXG4gIGJ1aWxkKGF0dHJpYnV0ZXMgPSB7fSkge1xuICAgIGlmICghdGhpcy50YXJnZXRNb2RlbENsYXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHRhcmdldCBtb2RlbCBjbGFzcyBjb25maWd1cmVkIGZvciAke3RoaXMubW9kZWwuY29uc3RydWN0b3IubmFtZX0jJHt0aGlzLnJlbGF0aW9uc2hpcE5hbWV9YClcbiAgICB9XG5cbiAgICBjb25zdCBtb2RlbCA9IC8qKiBAdHlwZSB7SW5zdGFuY2VUeXBlPFQ+fSAqLyAobmV3IHRoaXMudGFyZ2V0TW9kZWxDbGFzcyhhdHRyaWJ1dGVzKSlcblxuICAgIHRoaXMuc2V0TG9hZGVkKG1vZGVsKVxuXG4gICAgcmV0dXJuIG1vZGVsXG4gIH1cbn1cblxuLyoqXG4gKiBMaWdodHdlaWdodCBoYXMtbWFueSByZWxhdGlvbnNoaXAgc3RhdGUgaG9sZGVyIGZvciBmcm9udGVuZCBtb2RlbCBpbnN0YW5jZXMuXG4gKiBAdGVtcGxhdGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gU1xuICogQHRlbXBsYXRlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9IFRcbiAqL1xuZXhwb3J0IGNsYXNzIEZyb250ZW5kTW9kZWxIYXNNYW55UmVsYXRpb25zaGlwIHtcbiAgLyoqIEB0eXBlIHtBcnJheTxJbnN0YW5jZVR5cGU8VD4+fSAqL1xuICBfbG9hZGVkVmFsdWVcblxuICAvKipcbiAgICogQHBhcmFtIHtJbnN0YW5jZVR5cGU8Uz59IG1vZGVsIC0gUGFyZW50IG1vZGVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25zaGlwTmFtZSAtIFJlbGF0aW9uc2hpcCBuYW1lLlxuICAgKiBAcGFyYW0ge1QgfCBudWxsfSB0YXJnZXRNb2RlbENsYXNzIC0gVGFyZ2V0IG1vZGVsIGNsYXNzLlxuICAgKi9cbiAgY29uc3RydWN0b3IobW9kZWwsIHJlbGF0aW9uc2hpcE5hbWUsIHRhcmdldE1vZGVsQ2xhc3MpIHtcbiAgICB0aGlzLm1vZGVsID0gbW9kZWxcbiAgICB0aGlzLnJlbGF0aW9uc2hpcE5hbWUgPSByZWxhdGlvbnNoaXBOYW1lXG4gICAgdGhpcy50YXJnZXRNb2RlbENsYXNzID0gdGFyZ2V0TW9kZWxDbGFzc1xuICAgIHRoaXMuX3ByZWxvYWRlZCA9IGZhbHNlXG4gICAgdGhpcy5fbG9hZGVkVmFsdWUgPSBbXVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7QXJyYXk8SW5zdGFuY2VUeXBlPFQ+Pn0gbG9hZGVkVmFsdWUgLSBMb2FkZWQgcmVsYXRpb25zaGlwIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNldExvYWRlZChsb2FkZWRWYWx1ZSkge1xuICAgIHRoaXMuX2xvYWRlZFZhbHVlID0gQXJyYXkuaXNBcnJheShsb2FkZWRWYWx1ZSkgPyBsb2FkZWRWYWx1ZSA6IFtdXG4gICAgdGhpcy5fcHJlbG9hZGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgcmVsYXRpb25zaGlwIGlzIHByZWxvYWRlZC5cbiAgICovXG4gIGdldFByZWxvYWRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlbG9hZGVkXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge0FycmF5PEluc3RhbmNlVHlwZTxUPj59IC0gTG9hZGVkIHJlbGF0aW9uc2hpcCB2YWx1ZXMuXG4gICAqL1xuICBsb2FkZWQoKSB7XG4gICAgaWYgKCF0aGlzLl9wcmVsb2FkZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm1vZGVsLmNvbnN0cnVjdG9yLm5hbWV9IyR7dGhpcy5yZWxhdGlvbnNoaXBOYW1lfSBoYXNuJ3QgYmVlbiBwcmVsb2FkZWRgKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9sb2FkZWRWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7QXJyYXk8SW5zdGFuY2VUeXBlPFQ+Pn0gbW9kZWxzIC0gTW9kZWxzIHRvIGFwcGVuZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhZGRUb0xvYWRlZChtb2RlbHMpIHtcbiAgICBjb25zdCBsb2FkZWRNb2RlbHMgPSB0aGlzLmdldFByZWxvYWRlZCgpID8gdGhpcy5sb2FkZWQoKSA6IFtdXG5cbiAgICB0aGlzLnNldExvYWRlZChbLi4ubG9hZGVkTW9kZWxzLCAuLi5tb2RlbHNdKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2F0dHJpYnV0ZXNdIC0gTmV3IG1vZGVsIGF0dHJpYnV0ZXMuXG4gICAqIEByZXR1cm5zIHtJbnN0YW5jZVR5cGU8VD59IC0gQnVpbHQgbW9kZWwuXG4gICAqL1xuICBidWlsZChhdHRyaWJ1dGVzID0ge30pIHtcbiAgICBpZiAoIXRoaXMudGFyZ2V0TW9kZWxDbGFzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyB0YXJnZXQgbW9kZWwgY2xhc3MgY29uZmlndXJlZCBmb3IgJHt0aGlzLm1vZGVsLmNvbnN0cnVjdG9yLm5hbWV9IyR7dGhpcy5yZWxhdGlvbnNoaXBOYW1lfWApXG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWwgPSAvKiogQHR5cGUge0luc3RhbmNlVHlwZTxUPn0gKi8gKG5ldyB0aGlzLnRhcmdldE1vZGVsQ2xhc3MoYXR0cmlidXRlcykpXG5cbiAgICB0aGlzLmFkZFRvTG9hZGVkKFttb2RlbF0pXG5cbiAgICByZXR1cm4gbW9kZWxcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JjZS1yZWxvYWQgdGhlIHJlbGF0aW9uc2hpcC4gV2hlbiB0aGUgcGFyZW50IHJlY29yZCB3YXMgbG9hZGVkIGFzIHBhcnRcbiAgICogb2YgYSBiYXRjaCwgc2libGluZ3MgdGhhdCBoYXZlIG5vdCBwcmVsb2FkZWQgdGhpcyByZWxhdGlvbnNoaXAgZ2V0XG4gICAqIGJhdGNoZWQgaW50byBvbmUgcmVxdWVzdCB2aWEgdGhlIGNvaG9ydCBwcmVsb2FkZXIuIFRoZSBzY29wZWQgcXVlcnkgcGF0aFxuICAgKiAoYE1vZGVsLndoZXJlKC4uLikucHJlbG9hZChbbmFtZV0pLnRvQXJyYXkoKWAgZGlyZWN0bHkgZnJvbSB1c2VyIGNvZGUpXG4gICAqIGJ5cGFzc2VzIGNvaG9ydCBiYXRjaGluZyBieSBkZXNpZ24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PEluc3RhbmNlVHlwZTxUPj4+fSAtIExvYWRlZCByZWxhdGlvbnNoaXAgbW9kZWxzLlxuICAgKi9cbiAgYXN5bmMgbG9hZCgpIHtcbiAgICAvLyBSZXNldCBzbyB0aGUgY29ob3J0IHByZWxvYWRlciAob3Igc2luZ2xlLXJlY29yZCBmYWxsYmFjaykgcmVwb3B1bGF0ZXMuXG4gICAgdGhpcy5fcHJlbG9hZGVkID0gZmFsc2VcbiAgICB0aGlzLl9sb2FkZWRWYWx1ZSA9IFtdXG5cbiAgICBjb25zdCBiYXRjaGVkID0gYXdhaXQgLyoqIEB0eXBlIHthbnl9ICovICh0aGlzLm1vZGVsKS5fdHJ5Q29ob3J0UHJlbG9hZCh0aGlzLnJlbGF0aW9uc2hpcE5hbWUpXG5cbiAgICBpZiAoYmF0Y2hlZCkgcmV0dXJuIHRoaXMuX2xvYWRlZFZhbHVlXG5cbiAgICByZXR1cm4gLyoqIEB0eXBlIHtQcm9taXNlPEFycmF5PEluc3RhbmNlVHlwZTxUPj4+fSAqLyAodGhpcy5tb2RlbC5sb2FkUmVsYXRpb25zaGlwKHRoaXMucmVsYXRpb25zaGlwTmFtZSkpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8SW5zdGFuY2VUeXBlPFQ+Pj59IC0gTG9hZGVkIHJlbGF0aW9uc2hpcCBtb2RlbHMuXG4gICAqL1xuICBhc3luYyB0b0FycmF5KCkge1xuICAgIGlmICh0aGlzLmdldFByZWxvYWRlZCgpIHx8IHRoaXMuX2xvYWRlZFZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLl9sb2FkZWRWYWx1ZVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmxvYWQoKVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uc2hpcFR5cGUgLSBSZWxhdGlvbnNoaXAgdHlwZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgcmVsYXRpb25zaGlwIHR5cGUgaXMgaGFzLW1hbnkuXG4gKi9cbmZ1bmN0aW9uIHJlbGF0aW9uc2hpcFR5cGVJc0NvbGxlY3Rpb24ocmVsYXRpb25zaGlwVHlwZSkge1xuICByZXR1cm4gcmVsYXRpb25zaGlwVHlwZSA9PSBcImhhc01hbnlcIlxufVxuXG4vKipcbiAqIERvd25sb2FkZWQgZnJvbnRlbmQtbW9kZWwgYXR0YWNobWVudCBwYXlsb2FkIHdyYXBwZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBGcm9udGVuZE1vZGVsQXR0YWNobWVudERvd25sb2FkIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuaWQgLSBBdHRhY2htZW50IGlkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5maWxlbmFtZSAtIEZpbGVuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IGFyZ3MuY29udGVudFR5cGUgLSBDb250ZW50IHR5cGUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmJ5dGVTaXplIC0gRmlsZSBzaXplIGluIGJ5dGVzLlxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGFyZ3MuY29udGVudCAtIEZpbGUgY29udGVudCBieXRlcy5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSBbYXJncy51cmxdIC0gUmVzb2x2YWJsZSBhdHRhY2htZW50IFVSTC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtieXRlU2l6ZSwgY29udGVudCwgY29udGVudFR5cGUsIGZpbGVuYW1lLCBpZCwgdXJsID0gbnVsbH0pIHtcbiAgICB0aGlzLmlkVmFsdWUgPSBpZFxuICAgIHRoaXMuZmlsZW5hbWVWYWx1ZSA9IGZpbGVuYW1lXG4gICAgdGhpcy5jb250ZW50VHlwZVZhbHVlID0gY29udGVudFR5cGVcbiAgICB0aGlzLmJ5dGVTaXplVmFsdWUgPSBieXRlU2l6ZVxuICAgIHRoaXMuY29udGVudFZhbHVlID0gY29udGVudFxuICAgIHRoaXMudXJsVmFsdWUgPSB1cmxcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7bnVtYmVyfSAtIEZpbGUgc2l6ZSBpbiBieXRlcy4gKi9cbiAgYnl0ZVNpemUoKSB7IHJldHVybiB0aGlzLmJ5dGVTaXplVmFsdWUgfVxuICAvKiogQHJldHVybnMge1VpbnQ4QXJyYXl9IC0gRmlsZSBjb250ZW50IGJ5dGVzLiAqL1xuICBjb250ZW50KCkgeyByZXR1cm4gdGhpcy5jb250ZW50VmFsdWUgfVxuICAvKiogQHJldHVybnMge3N0cmluZyB8IG51bGx9IC0gQ29udGVudCB0eXBlLiAqL1xuICBjb250ZW50VHlwZSgpIHsgcmV0dXJuIHRoaXMuY29udGVudFR5cGVWYWx1ZSB9XG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAtIEZpbGVuYW1lLiAqL1xuICBmaWxlbmFtZSgpIHsgcmV0dXJuIHRoaXMuZmlsZW5hbWVWYWx1ZSB9XG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAtIEF0dGFjaG1lbnQgaWQuICovXG4gIGlkKCkgeyByZXR1cm4gdGhpcy5pZFZhbHVlIH1cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfSAtIFJlc29sdmFibGUgYXR0YWNobWVudCBVUkwuICovXG4gIHVybCgpIHsgcmV0dXJuIHRoaXMudXJsVmFsdWUgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgdmFsdWUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHZhbHVlIGxvb2tzIGxpa2UgYnl0ZSBkYXRhLlxuICovXG5mdW5jdGlvbiBmcm9udGVuZEF0dGFjaG1lbnRWYWx1ZUlzQnl0ZXModmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSB8fCB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8ICh0eXBlb2YgQnVmZmVyICE9PSBcInVuZGVmaW5lZFwiICYmIEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkpXG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyB7YXJyYXlCdWZmZXI6ICgpID0+IFByb21pc2U8QXJyYXlCdWZmZXI+fX0gLSBXaGV0aGVyIGNhbmRpZGF0ZSBzdXBwb3J0cyBhcnJheUJ1ZmZlcigpLlxuICovXG5mdW5jdGlvbiBmcm9udGVuZEF0dGFjaG1lbnRWYWx1ZVN1cHBvcnRzQXJyYXlCdWZmZXIodmFsdWUpIHtcbiAgcmV0dXJuIEJvb2xlYW4odmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiAvKiogQHR5cGUge2FueX0gKi8gKHZhbHVlKS5hcnJheUJ1ZmZlciA9PT0gXCJmdW5jdGlvblwiKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheSB8IEJ1ZmZlciB8IEFycmF5QnVmZmVyfSB2YWx1ZSAtIEJ5dGUtbGlrZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fSAtIFVpbnQ4QXJyYXkgYnl0ZXMuXG4gKi9cbmZ1bmN0aW9uIGZyb250ZW5kQXR0YWNobWVudE5vcm1hbGl6ZUJ5dGVzKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHJldHVybiB2YWx1ZVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgcmV0dXJuIG5ldyBVaW50OEFycmF5KHZhbHVlKVxuICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBCdWZmZXIuaXNCdWZmZXIoLyoqIEB0eXBlIHthbnl9ICovICh2YWx1ZSkpKSB7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KC8qKiBAdHlwZSB7QnVmZmVyfSAqLyAodmFsdWUpKVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgYXR0YWNobWVudCBieXRlcyB2YWx1ZVwiKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gYnl0ZXMgLSBCeXRlcy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQmFzZTY0IHZhbHVlLlxuICovXG5mdW5jdGlvbiBmcm9udGVuZEF0dGFjaG1lbnRCeXRlc1RvQmFzZTY0KGJ5dGVzKSB7XG4gIGlmICh0eXBlb2YgQnVmZmVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGJ5dGVzKS50b1N0cmluZyhcImJhc2U2NFwiKVxuICB9XG5cbiAgbGV0IGJpbmFyeSA9IFwiXCJcblxuICBmb3IgKGNvbnN0IGJ5dGUgb2YgYnl0ZXMpIHtcbiAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBidG9hICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgYmFzZTY0IGVuY29kZXJcIilcblxuICByZXR1cm4gYnRvYShiaW5hcnkpXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gQmFzZTY0IHZhbHVlLlxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9IC0gRGVjb2RlZCBieXRlcy5cbiAqL1xuZnVuY3Rpb24gZnJvbnRlbmRBdHRhY2htZW50QmFzZTY0VG9CeXRlcyh2YWx1ZSkge1xuICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSh2YWx1ZSwgXCJiYXNlNjRcIikpXG4gIH1cblxuICBpZiAodHlwZW9mIGF0b2IgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBiYXNlNjQgZGVjb2RlclwiKVxuXG4gIGNvbnN0IGJpbmFyeSA9IGF0b2IodmFsdWUpXG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYmluYXJ5Lmxlbmd0aClcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYmluYXJ5Lmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIGJ5dGVzW2luZGV4XSA9IGJpbmFyeS5jaGFyQ29kZUF0KGluZGV4KVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+fSAtIFdoZXRoZXIgdmFsdWUgaXMgcGxhaW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBmcm9udGVuZEF0dGFjaG1lbnRWYWx1ZUlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSlcblxuICByZXR1cm4gcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvdHlwZSA9PT0gbnVsbFxufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBQYXlsb2FkIGNhbmRpZGF0ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgcGF5bG9hZCBjb250YWlucyBhbiBhdHRhY2htZW50IHVwbG9hZCBib2R5LlxuICovXG5mdW5jdGlvbiBmcm9udGVuZE1vZGVsUGF5bG9hZENvbnRhaW5zQXR0YWNobWVudFVwbG9hZCh2YWx1ZSkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlXG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLnNvbWUoKGVudHJ5KSA9PiBmcm9udGVuZE1vZGVsUGF5bG9hZENvbnRhaW5zQXR0YWNobWVudFVwbG9hZChlbnRyeSkpXG4gIH1cblxuICBpZiAoIWZyb250ZW5kQXR0YWNobWVudFZhbHVlSXNQbGFpbk9iamVjdCh2YWx1ZSkpIHJldHVybiBmYWxzZVxuXG4gIGlmICh0eXBlb2YgdmFsdWUuY29udGVudEJhc2U2NCA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICByZXR1cm4gT2JqZWN0LnZhbHVlcyh2YWx1ZSkuc29tZSgoZW50cnkpID0+IGZyb250ZW5kTW9kZWxQYXlsb2FkQ29udGFpbnNBdHRhY2htZW50VXBsb2FkKGVudHJ5KSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGlucHV0IC0gQXR0YWNobWVudCBpbnB1dC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSAtIFRyYW5zcG9ydC1zYWZlIGF0dGFjaG1lbnQgcGF5bG9hZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplRnJvbnRlbmRBdHRhY2htZW50SW5wdXQoaW5wdXQpIHtcbiAgaWYgKGZyb250ZW5kQXR0YWNobWVudFZhbHVlSXNQbGFpbk9iamVjdChpbnB1dCkgJiYgXCJmaWxlXCIgaW4gaW5wdXQpIHtcbiAgICBjb25zdCBub3JtYWxpemVkRmlsZSA9IGF3YWl0IG5vcm1hbGl6ZUZyb250ZW5kQXR0YWNobWVudElucHV0KGlucHV0LmZpbGUpXG4gICAgY29uc3QgbWVyZ2VkID0ge1xuICAgICAgLi4ubm9ybWFsaXplZEZpbGVcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGlucHV0LmZpbGVuYW1lID09PSBcInN0cmluZ1wiICYmIGlucHV0LmZpbGVuYW1lLmxlbmd0aCA+IDApIG1lcmdlZC5maWxlbmFtZSA9IGlucHV0LmZpbGVuYW1lXG4gICAgaWYgKHR5cGVvZiBpbnB1dC5jb250ZW50VHlwZSA9PT0gXCJzdHJpbmdcIiAmJiBpbnB1dC5jb250ZW50VHlwZS5sZW5ndGggPiAwKSBtZXJnZWQuY29udGVudFR5cGUgPSBpbnB1dC5jb250ZW50VHlwZVxuXG4gICAgcmV0dXJuIG1lcmdlZFxuICB9XG5cbiAgaWYgKGZyb250ZW5kQXR0YWNobWVudFZhbHVlSXNQbGFpbk9iamVjdChpbnB1dCkpIHtcbiAgICBpZiAodHlwZW9mIGlucHV0LnBhdGggPT09IFwic3RyaW5nXCIgJiYgaW5wdXQucGF0aC5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBdHRhY2htZW50IHBhdGggaW5wdXQgaXMgbm90IHN1cHBvcnRlZCBpbiBmcm9udGVuZCBtb2RlbHNcIilcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGlucHV0LmNvbnRlbnRCYXNlNjQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnRCYXNlNjQ6IGlucHV0LmNvbnRlbnRCYXNlNjQsXG4gICAgICAgIGNvbnRlbnRUeXBlOiB0eXBlb2YgaW5wdXQuY29udGVudFR5cGUgPT09IFwic3RyaW5nXCIgJiYgaW5wdXQuY29udGVudFR5cGUubGVuZ3RoID4gMCA/IGlucHV0LmNvbnRlbnRUeXBlIDogbnVsbCxcbiAgICAgICAgZmlsZW5hbWU6IHR5cGVvZiBpbnB1dC5maWxlbmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBpbnB1dC5maWxlbmFtZS5sZW5ndGggPiAwID8gaW5wdXQuZmlsZW5hbWUgOiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZnJvbnRlbmRBdHRhY2htZW50VmFsdWVTdXBwb3J0c0FycmF5QnVmZmVyKGlucHV0KSkge1xuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgaW5wdXQuYXJyYXlCdWZmZXIoKSlcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50QmFzZTY0OiBmcm9udGVuZEF0dGFjaG1lbnRCeXRlc1RvQmFzZTY0KGJ5dGVzKSxcbiAgICAgIGNvbnRlbnRUeXBlOiB0eXBlb2YgLyoqIEB0eXBlIHthbnl9ICovIChpbnB1dCkudHlwZSA9PT0gXCJzdHJpbmdcIiAmJiAvKiogQHR5cGUge2FueX0gKi8gKGlucHV0KS50eXBlLmxlbmd0aCA+IDBcbiAgICAgICAgPyAvKiogQHR5cGUge2FueX0gKi8gKGlucHV0KS50eXBlXG4gICAgICAgIDogbnVsbCxcbiAgICAgIGZpbGVuYW1lOiB0eXBlb2YgLyoqIEB0eXBlIHthbnl9ICovIChpbnB1dCkubmFtZSA9PT0gXCJzdHJpbmdcIiAmJiAvKiogQHR5cGUge2FueX0gKi8gKGlucHV0KS5uYW1lLmxlbmd0aCA+IDBcbiAgICAgICAgPyAvKiogQHR5cGUge2FueX0gKi8gKGlucHV0KS5uYW1lXG4gICAgICAgIDogXCJhdHRhY2htZW50LmJpblwiXG4gICAgfVxuICB9XG5cbiAgaWYgKGZyb250ZW5kQXR0YWNobWVudFZhbHVlSXNCeXRlcyhpbnB1dCkpIHtcbiAgICBjb25zdCBieXRlcyA9IGZyb250ZW5kQXR0YWNobWVudE5vcm1hbGl6ZUJ5dGVzKC8qKiBAdHlwZSB7VWludDhBcnJheSB8IEJ1ZmZlciB8IEFycmF5QnVmZmVyfSAqLyAoaW5wdXQpKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnRCYXNlNjQ6IGZyb250ZW5kQXR0YWNobWVudEJ5dGVzVG9CYXNlNjQoYnl0ZXMpLFxuICAgICAgY29udGVudFR5cGU6IG51bGwsXG4gICAgICBmaWxlbmFtZTogXCJhdHRhY2htZW50LmJpblwiXG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgZnJvbnRlbmQgYXR0YWNobWVudCBpbnB1dFwiKVxufVxuXG4vKipcbiAqIEZyb250ZW5kLW1vZGVsIGF0dGFjaG1lbnQgaGVscGVyIGZvciBvbmUgYXR0YWNobWVudCBuYW1lLlxuICovXG5leHBvcnQgY2xhc3MgRnJvbnRlbmRNb2RlbEF0dGFjaG1lbnRIYW5kbGUge1xuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kTW9kZWxCYXNlfSBhcmdzLm1vZGVsIC0gTW9kZWwgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF0dGFjaG1lbnROYW1lIC0gQXR0YWNobWVudCBuYW1lLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2F0dGFjaG1lbnROYW1lLCBtb2RlbH0pIHtcbiAgICB0aGlzLm1vZGVsID0gbW9kZWxcbiAgICB0aGlzLmF0dGFjaG1lbnROYW1lID0gYXR0YWNobWVudE5hbWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3Vua25vd259IGlucHV0IC0gQXR0YWNobWVudCBpbnB1dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBhdHRhY2hlZC5cbiAgICovXG4gIGFzeW5jIGF0dGFjaChpbnB1dCkge1xuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gKi8gKHRoaXMubW9kZWwuY29uc3RydWN0b3IpXG4gICAgY29uc3Qgbm9ybWFsaXplZElucHV0ID0gYXdhaXQgbm9ybWFsaXplRnJvbnRlbmRBdHRhY2htZW50SW5wdXQoaW5wdXQpXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBNb2RlbENsYXNzLmV4ZWN1dGVDb21tYW5kKFwiYXR0YWNoXCIsIHtcbiAgICAgIGF0dGFjaG1lbnQ6IG5vcm1hbGl6ZWRJbnB1dCxcbiAgICAgIGF0dGFjaG1lbnROYW1lOiB0aGlzLmF0dGFjaG1lbnROYW1lLFxuICAgICAgaWQ6IHRoaXMubW9kZWwucHJpbWFyeUtleVZhbHVlKClcbiAgICB9KVxuXG4gICAgdGhpcy5tb2RlbC5hc3NpZ25BdHRyaWJ1dGVzKE1vZGVsQ2xhc3MuYXR0cmlidXRlc0Zyb21SZXNwb25zZShyZXNwb25zZSkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IFthdHRhY2htZW50SWRdIC0gT3B0aW9uYWwgYXR0YWNobWVudCBpZCBmb3IgaGFzLW1hbnkgYXR0YWNobWVudHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEZyb250ZW5kTW9kZWxBdHRhY2htZW50RG93bmxvYWQgfCBudWxsPn0gLSBEb3dubG9hZGVkIGF0dGFjaG1lbnQgcGF5bG9hZC5cbiAgICovXG4gIGFzeW5jIGRvd25sb2FkKGF0dGFjaG1lbnRJZCkge1xuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gKi8gKHRoaXMubW9kZWwuY29uc3RydWN0b3IpXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICBhdHRhY2htZW50TmFtZTogdGhpcy5hdHRhY2htZW50TmFtZSxcbiAgICAgIGlkOiB0aGlzLm1vZGVsLnByaW1hcnlLZXlWYWx1ZSgpXG4gICAgfVxuXG4gICAgaWYgKGF0dGFjaG1lbnRJZCkge1xuICAgICAgcGF5bG9hZC5hdHRhY2htZW50SWQgPSBhdHRhY2htZW50SWRcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IE1vZGVsQ2xhc3MuZXhlY3V0ZUNvbW1hbmQoXCJkb3dubG9hZFwiLCBwYXlsb2FkKVxuICAgIGNvbnN0IGF0dGFjaG1lbnRQYXlsb2FkID0gcmVzcG9uc2UuYXR0YWNobWVudFxuXG4gICAgaWYgKCFhdHRhY2htZW50UGF5bG9hZCB8fCB0eXBlb2YgYXR0YWNobWVudFBheWxvYWQgIT09IFwib2JqZWN0XCIpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBjb250ZW50QmFzZTY0ID0gdHlwZW9mIGF0dGFjaG1lbnRQYXlsb2FkLmNvbnRlbnRCYXNlNjQgPT09IFwic3RyaW5nXCIgPyBhdHRhY2htZW50UGF5bG9hZC5jb250ZW50QmFzZTY0IDogXCJcIlxuICAgIGNvbnN0IGNvbnRlbnQgPSBmcm9udGVuZEF0dGFjaG1lbnRCYXNlNjRUb0J5dGVzKGNvbnRlbnRCYXNlNjQpXG4gICAgY29uc3QgYnl0ZVNpemUgPSBOdW1iZXIoYXR0YWNobWVudFBheWxvYWQuYnl0ZVNpemUpXG5cbiAgICByZXR1cm4gbmV3IEZyb250ZW5kTW9kZWxBdHRhY2htZW50RG93bmxvYWQoe1xuICAgICAgYnl0ZVNpemU6IE51bWJlci5pc0Zpbml0ZShieXRlU2l6ZSkgPyBieXRlU2l6ZSA6IGNvbnRlbnQubGVuZ3RoLFxuICAgICAgY29udGVudCxcbiAgICAgIGNvbnRlbnRUeXBlOiB0eXBlb2YgYXR0YWNobWVudFBheWxvYWQuY29udGVudFR5cGUgPT09IFwic3RyaW5nXCIgJiYgYXR0YWNobWVudFBheWxvYWQuY29udGVudFR5cGUubGVuZ3RoID4gMCA/IGF0dGFjaG1lbnRQYXlsb2FkLmNvbnRlbnRUeXBlIDogbnVsbCxcbiAgICAgIGZpbGVuYW1lOiB0eXBlb2YgYXR0YWNobWVudFBheWxvYWQuZmlsZW5hbWUgPT09IFwic3RyaW5nXCIgJiYgYXR0YWNobWVudFBheWxvYWQuZmlsZW5hbWUubGVuZ3RoID4gMCA/IGF0dGFjaG1lbnRQYXlsb2FkLmZpbGVuYW1lIDogXCJhdHRhY2htZW50LmJpblwiLFxuICAgICAgaWQ6IHR5cGVvZiBhdHRhY2htZW50UGF5bG9hZC5pZCA9PT0gXCJzdHJpbmdcIiA/IGF0dGFjaG1lbnRQYXlsb2FkLmlkIDogXCJcIixcbiAgICAgIHVybDogdHlwZW9mIGF0dGFjaG1lbnRQYXlsb2FkLnVybCA9PT0gXCJzdHJpbmdcIiAmJiBhdHRhY2htZW50UGF5bG9hZC51cmwubGVuZ3RoID4gMCA/IGF0dGFjaG1lbnRQYXlsb2FkLnVybCA6IG51bGxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXR0YWNobWVudElkXSAtIE9wdGlvbmFsIGF0dGFjaG1lbnQgaWQgZm9yIGhhcy1tYW55IGF0dGFjaG1lbnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCBudWxsPn0gLSBSZXNvbHZhYmxlIGF0dGFjaG1lbnQgVVJMLlxuICAgKi9cbiAgYXN5bmMgdXJsKGF0dGFjaG1lbnRJZCkge1xuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gKi8gKHRoaXMubW9kZWwuY29uc3RydWN0b3IpXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICBhdHRhY2htZW50TmFtZTogdGhpcy5hdHRhY2htZW50TmFtZSxcbiAgICAgIGlkOiB0aGlzLm1vZGVsLnByaW1hcnlLZXlWYWx1ZSgpXG4gICAgfVxuXG4gICAgaWYgKGF0dGFjaG1lbnRJZCkge1xuICAgICAgcGF5bG9hZC5hdHRhY2htZW50SWQgPSBhdHRhY2htZW50SWRcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IE1vZGVsQ2xhc3MuZXhlY3V0ZUNvbW1hbmQoXCJ1cmxcIiwgcGF5bG9hZClcblxuICAgIGlmICh0eXBlb2YgcmVzcG9uc2UudXJsID09PSBcInN0cmluZ1wiICYmIHJlc3BvbnNlLnVybC5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UudXJsXG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIERvd25sb2FkIFVSTCBmb3IgdGhpcyBhdHRhY2htZW50IG9uIHRoZSBjb25maWd1cmVkIGJhY2tlbmQuXG4gICAqL1xuICBkb3dubG9hZFVybCgpIHtcbiAgICBjb25zdCBNb2RlbENsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9ICovICh0aGlzLm1vZGVsLmNvbnN0cnVjdG9yKVxuICAgIGNvbnN0IGNvbW1hbmROYW1lID0gTW9kZWxDbGFzcy5jb21tYW5kTmFtZShcImRvd25sb2FkXCIpXG4gICAgY29uc3QgcmVzb3VyY2VQYXRoID0gTW9kZWxDbGFzcy5yZXNvdXJjZVBhdGgoKVxuICAgIGNvbnN0IGNvbW1hbmRVcmwgPSBmcm9udGVuZE1vZGVsQ29tbWFuZFVybChyZXNvdXJjZVBhdGgsIGNvbW1hbmROYW1lKVxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgYXR0YWNobWVudE5hbWU6IHRoaXMuYXR0YWNobWVudE5hbWUsXG4gICAgICBpZDogU3RyaW5nKHRoaXMubW9kZWwucHJpbWFyeUtleVZhbHVlKCkpXG4gICAgfSlcblxuICAgIHJldHVybiBgJHtjb21tYW5kVXJsfT8ke3BhcmFtcy50b1N0cmluZygpfWBcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbH0gdmFsdWUgLSBVUkwgY2FuZGlkYXRlLlxuICogQHJldHVybnMge3N0cmluZ30gLSBOb3JtYWxpemVkIFVSTCB3aXRob3V0IHRyYWlsaW5nIHNsYXNoLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVGcm9udGVuZE1vZGVsVHJhbnNwb3J0VXJsKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVybiBcIlwiXG5cbiAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKVxuXG4gIGlmICghdHJpbW1lZC5sZW5ndGgpIHJldHVybiBcIlwiXG5cbiAgcmV0dXJuIHRyaW1tZWQucmVwbGFjZSgvXFwvKyQvLCBcIlwiKVxufVxuXG4vKipcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gUmVzb2x2ZWQgZnJvbnRlbmQtbW9kZWwgdHJhbnNwb3J0IFVSTC5cbiAqL1xuZnVuY3Rpb24gZnJvbnRlbmRNb2RlbFRyYW5zcG9ydFVybCgpIHtcbiAgY29uc3QgY29uZmlndXJlZFVybCA9IHR5cGVvZiBmcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnLnVybCA9PT0gXCJmdW5jdGlvblwiXG4gICAgPyBmcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnLnVybCgpXG4gICAgOiBmcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnLnVybFxuXG4gIHJldHVybiBub3JtYWxpemVGcm9udGVuZE1vZGVsVHJhbnNwb3J0VXJsKGNvbmZpZ3VyZWRVcmwpXG59XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSB2YWx1ZSAtIEF0dHJpYnV0ZXMgaGFzaC5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAtIENsb25lZCBhdHRyaWJ1dGVzIGhhc2guXG4gKi9cbmZ1bmN0aW9uIGNsb25lRnJvbnRlbmRNb2RlbEF0dHJpYnV0ZXModmFsdWUpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi8gKGRlc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlKHNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZSh2YWx1ZSkpKVxufVxuXG4vKipcbiAqIFNoYXJlZCBjaGFubmVsIG5hbWUgZm9yIG1vZGVsIGxpZmVjeWNsZSBldmVudHMgKFBoYXNlIDMpLlxuICogTWF0Y2hlcyB0aGUgYmFja2VuZCBgRlJPTlRFTkRfTU9ERUxTX0NIQU5ORUxfTkFNRWAuXG4gKi9cbmNvbnN0IEZST05URU5EX01PREVMU19DSEFOTkVMX05BTUUgPSBcImZyb250ZW5kLW1vZGVsc1wiXG5cbi8qKlxuICogQHR5cGVkZWYge3tjYWxsYmFjazogKHBheWxvYWQ6IHtpZDogc3RyaW5nLCBtb2RlbDogSW5zdGFuY2VUeXBlPHR5cGVvZiBGcm9udGVuZE1vZGVsQmFzZT59KSA9PiB2b2lkLCBwcm9qZWN0aW9uUGF5bG9hZDogaW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsUHJvamVjdGlvblBheWxvYWR9fSBGcm9udGVuZE1vZGVsTW9kZWxFdmVudENhbGxiYWNrRW50cnlcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7e2NhbGxiYWNrOiAocGF5bG9hZDoge2lkOiBzdHJpbmd9KSA9PiB2b2lkfX0gRnJvbnRlbmRNb2RlbERlc3Ryb3lFdmVudENhbGxiYWNrRW50cnlcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWU+fSB0YXJnZXQgLSBUYXJnZXQgcHJlbG9hZCBwYXlsb2FkLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZT59IHNvdXJjZSAtIFNvdXJjZSBwcmVsb2FkIHBheWxvYWQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gbWVyZ2VGcm9udGVuZE1vZGVsRXZlbnRQcmVsb2FkKHRhcmdldCwgc291cmNlKSB7XG4gIGZvciAoY29uc3QgW3JlbGF0aW9uc2hpcE5hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzb3VyY2UpKSB7XG4gICAgY29uc3QgZXhpc3RpbmdWYWx1ZSA9IHRhcmdldFtyZWxhdGlvbnNoaXBOYW1lXVxuXG4gICAgaWYgKHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgaWYgKGV4aXN0aW5nVmFsdWUgPT09IHVuZGVmaW5lZCkgdGFyZ2V0W3JlbGF0aW9uc2hpcE5hbWVdID0gdmFsdWVcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHRhcmdldFtyZWxhdGlvbnNoaXBOYW1lXSA9IHZhbHVlXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmICghZXhpc3RpbmdWYWx1ZSB8fCB0eXBlb2YgZXhpc3RpbmdWYWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGV4aXN0aW5nVmFsdWUpKSB7XG4gICAgICB0YXJnZXRbcmVsYXRpb25zaGlwTmFtZV0gPSB7fVxuICAgIH1cblxuICAgIG1lcmdlRnJvbnRlbmRNb2RlbEV2ZW50UHJlbG9hZChcbiAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWU+fSAqLyAodGFyZ2V0W3JlbGF0aW9uc2hpcE5hbWVdKSxcbiAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWU+fSAqLyAodmFsdWUpXG4gICAgKVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59IHRhcmdldCAtIFRhcmdldCBzZWxlY3QgbWFwLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59IHNvdXJjZSAtIFNvdXJjZSBzZWxlY3QgbWFwLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIG1lcmdlRnJvbnRlbmRNb2RlbEV2ZW50U2VsZWN0KHRhcmdldCwgc291cmNlKSB7XG4gIGZvciAoY29uc3QgW21vZGVsTmFtZSwgYXR0cmlidXRlc10gb2YgT2JqZWN0LmVudHJpZXMoc291cmNlKSkge1xuICAgIGNvbnN0IGV4aXN0aW5nQXR0cmlidXRlcyA9IHRhcmdldFttb2RlbE5hbWVdIHx8IFtdXG5cbiAgICB0YXJnZXRbbW9kZWxOYW1lXSA9IEFycmF5LmZyb20obmV3IFNldChleGlzdGluZ0F0dHJpYnV0ZXMuY29uY2F0KGF0dHJpYnV0ZXMpKSlcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7QXJyYXk8aW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsV2l0aENvdW50UGF5bG9hZEVudHJ5IHwgaW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsQWJpbGl0aWVzUGF5bG9hZEVudHJ5Pn0gdGFyZ2V0IC0gVGFyZ2V0IGFycmF5LlxuICogQHBhcmFtIHtBcnJheTxpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxXaXRoQ291bnRQYXlsb2FkRW50cnkgfCBpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxBYmlsaXRpZXNQYXlsb2FkRW50cnk+fSBzb3VyY2UgLSBTb3VyY2UgYXJyYXkuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gbWVyZ2VVbmlxdWVGcm9udGVuZE1vZGVsRXZlbnRFbnRyaWVzKHRhcmdldCwgc291cmNlKSB7XG4gIGNvbnN0IGV4aXN0aW5nS2V5cyA9IG5ldyBTZXQodGFyZ2V0Lm1hcCgoZW50cnkpID0+IEpTT04uc3RyaW5naWZ5KGVudHJ5KSkpXG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBzb3VyY2UpIHtcbiAgICBjb25zdCBrZXkgPSBKU09OLnN0cmluZ2lmeShlbnRyeSlcblxuICAgIGlmIChleGlzdGluZ0tleXMuaGFzKGtleSkpIGNvbnRpbnVlXG5cbiAgICB0YXJnZXQucHVzaChlbnRyeSlcbiAgICBleGlzdGluZ0tleXMuYWRkKGtleSlcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsUHJvamVjdGlvblBheWxvYWR9IHRhcmdldCAtIFRhcmdldCBwYXlsb2FkLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxQcm9qZWN0aW9uUGF5bG9hZH0gc291cmNlIC0gU291cmNlIHBheWxvYWQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gbWVyZ2VGcm9udGVuZE1vZGVsRXZlbnRQcm9qZWN0aW9uUGF5bG9hZCh0YXJnZXQsIHNvdXJjZSkge1xuICBpZiAoc291cmNlLnByZWxvYWQpIHtcbiAgICBpZiAoIXRhcmdldC5wcmVsb2FkKSB0YXJnZXQucHJlbG9hZCA9IHt9XG4gICAgbWVyZ2VGcm9udGVuZE1vZGVsRXZlbnRQcmVsb2FkKHRhcmdldC5wcmVsb2FkLCBzb3VyY2UucHJlbG9hZClcbiAgfVxuXG4gIGlmIChzb3VyY2Uuc2VsZWN0KSB7XG4gICAgaWYgKCF0YXJnZXQuc2VsZWN0KSB0YXJnZXQuc2VsZWN0ID0ge31cbiAgICBtZXJnZUZyb250ZW5kTW9kZWxFdmVudFNlbGVjdCh0YXJnZXQuc2VsZWN0LCBzb3VyY2Uuc2VsZWN0KVxuICB9XG5cbiAgaWYgKHNvdXJjZS53aXRoQ291bnQpIHtcbiAgICBpZiAoIXRhcmdldC53aXRoQ291bnQpIHRhcmdldC53aXRoQ291bnQgPSBbXVxuICAgIG1lcmdlVW5pcXVlRnJvbnRlbmRNb2RlbEV2ZW50RW50cmllcyh0YXJnZXQud2l0aENvdW50LCBzb3VyY2Uud2l0aENvdW50KVxuICB9XG5cbiAgaWYgKHNvdXJjZS5hYmlsaXRpZXMpIHtcbiAgICBpZiAoIXRhcmdldC5hYmlsaXRpZXMpIHRhcmdldC5hYmlsaXRpZXMgPSBbXVxuICAgIG1lcmdlVW5pcXVlRnJvbnRlbmRNb2RlbEV2ZW50RW50cmllcyh0YXJnZXQuYWJpbGl0aWVzLCBzb3VyY2UuYWJpbGl0aWVzKVxuICB9XG5cbiAgaWYgKHNvdXJjZS5xdWVyeURhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHRhcmdldFF1ZXJ5RGF0YSA9IEFycmF5LmlzQXJyYXkodGFyZ2V0LnF1ZXJ5RGF0YSkgPyB0YXJnZXQucXVlcnlEYXRhIDogW11cblxuICAgIHRhcmdldC5xdWVyeURhdGEgPSB0YXJnZXRRdWVyeURhdGFcbiAgICBjb25zdCBxdWVyeURhdGFFbnRyaWVzID0gQXJyYXkuaXNBcnJheShzb3VyY2UucXVlcnlEYXRhKSA/IHNvdXJjZS5xdWVyeURhdGEgOiBbc291cmNlLnF1ZXJ5RGF0YV1cblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgcXVlcnlEYXRhRW50cmllcykge1xuICAgICAgdGFyZ2V0UXVlcnlEYXRhLnB1c2goZW50cnkpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUGVyLW1vZGVsIGNsYXNzIHNpbmdsZXRvbiB0aGF0IG11bHRpcGxleGVzIGFsbCByZWdpc3RlcmVkIG9uQ3JlYXRlIC9cbiAqIG9uVXBkYXRlIC8gb25EZXN0cm95IGNhbGxiYWNrcyDigJQgY2xhc3MtbGV2ZWwgKyBpbnN0YW5jZS1sZXZlbCDigJRcbiAqIG92ZXIgb25lIFdlYnNvY2tldENoYW5uZWxWMiBzdWJzY3JpcHRpb24uIFN1YnNjcmlwdGlvbiBvcGVucyBvbiB0aGVcbiAqIGZpcnN0IGxpc3RlbmVyIGFuZCBjbG9zZXMgd2hlbiB0aGUgbGFzdCBvbmUgdW5zdWJzY3JpYmVzLlxuICpcbiAqIEluc3RhbmNlLWxldmVsIGxpc3RlbmVycyBhbHNvIHJlY2VpdmUgYXV0by1tZXJnZTogd2hlbiBhbiBgdXBkYXRlYFxuICogZXZlbnQgYXJyaXZlcyBmb3IgYSByZWdpc3RlcmVkIGluc3RhbmNlIGlkLCB0aGUgaW5zdGFuY2Unc1xuICogYXR0cmlidXRlcyBhcmUgdXBkYXRlZCBpbiBwbGFjZSBiZWZvcmUgdGhlIGNhbGxiYWNrIGZpcmVzLCBzb1xuICogY2FsbGVycyBjYW4gcmVhZCBmcmVzaCB2YWx1ZXMgZnJvbSB0aGUgc2FtZSBpbnN0YW5jZSBoYW5kbGUuXG4gKi9cbmNsYXNzIEZyb250ZW5kTW9kZWxFdmVudFN1YnNjcmlwdGlvbiB7XG4gIC8qKiBAcGFyYW0ge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gTW9kZWxDbGFzcyAtIEZyb250ZW5kIG1vZGVsIGNsYXNzIGZvciB0aGlzIHN1YnNjcmlwdGlvbiBidWNrZXQuICovXG4gIGNvbnN0cnVjdG9yKE1vZGVsQ2xhc3MpIHtcbiAgICB0aGlzLk1vZGVsQ2xhc3MgPSBNb2RlbENsYXNzXG4gICAgLyoqIEB0eXBlIHtTZXQ8RnJvbnRlbmRNb2RlbE1vZGVsRXZlbnRDYWxsYmFja0VudHJ5Pn0gKi9cbiAgICB0aGlzLmNsYXNzQ3JlYXRlQ2FsbGJhY2tzID0gbmV3IFNldCgpXG4gICAgLyoqIEB0eXBlIHtTZXQ8RnJvbnRlbmRNb2RlbE1vZGVsRXZlbnRDYWxsYmFja0VudHJ5Pn0gKi9cbiAgICB0aGlzLmNsYXNzVXBkYXRlQ2FsbGJhY2tzID0gbmV3IFNldCgpXG4gICAgLyoqIEB0eXBlIHtTZXQ8RnJvbnRlbmRNb2RlbERlc3Ryb3lFdmVudENhbGxiYWNrRW50cnk+fSAqL1xuICAgIHRoaXMuY2xhc3NEZXN0cm95Q2FsbGJhY2tzID0gbmV3IFNldCgpXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCB7aW5zdGFuY2U6IEluc3RhbmNlVHlwZTx0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2U+LCB1cGRhdGVDYWxsYmFja3M6IFNldDxGcm9udGVuZE1vZGVsTW9kZWxFdmVudENhbGxiYWNrRW50cnk+LCBkZXN0cm95Q2FsbGJhY2tzOiBTZXQ8RnJvbnRlbmRNb2RlbERlc3Ryb3lFdmVudENhbGxiYWNrRW50cnk+fT59ICovXG4gICAgdGhpcy5pbnN0YW5jZUxpc3RlbmVycyA9IG5ldyBNYXAoKVxuICAgIC8qKiBAdHlwZSB7YW55fSAqL1xuICAgIHRoaXMuY2hhbm5lbEhhbmRsZSA9IG51bGxcbiAgICAvKiogQHR5cGUge1Byb21pc2U8dm9pZD4gfCBudWxsfSAqL1xuICAgIHRoaXMucmVhZHlQcm9taXNlID0gbnVsbFxuICAgIC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVsbH0gKi9cbiAgICB0aGlzLnN1YnNjcmlwdGlvblBhcmFtc0tleSA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7e21vZGVsOiBzdHJpbmd9ICYgaW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsUHJvamVjdGlvblBheWxvYWR9IC0gQ3VycmVudCB3ZWJzb2NrZXQgc3Vic2NyaXB0aW9uIHBhcmFtcy5cbiAgICovXG4gIHN1YnNjcmlwdGlvblBhcmFtcygpIHtcbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFByb2plY3Rpb25QYXlsb2FkfSAqL1xuICAgIGNvbnN0IHByb2plY3Rpb25QYXlsb2FkID0ge31cbiAgICBjb25zdCBwcm9qZWN0aW9uRW50cmllcyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuY2xhc3NDcmVhdGVDYWxsYmFja3MpIHByb2plY3Rpb25FbnRyaWVzLnB1c2goZW50cnkpXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmNsYXNzVXBkYXRlQ2FsbGJhY2tzKSBwcm9qZWN0aW9uRW50cmllcy5wdXNoKGVudHJ5KVxuXG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLmluc3RhbmNlTGlzdGVuZXJzLnZhbHVlcygpKSB7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGxpc3RlbmVyLnVwZGF0ZUNhbGxiYWNrcykgcHJvamVjdGlvbkVudHJpZXMucHVzaChlbnRyeSlcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHByb2plY3Rpb25FbnRyaWVzKSB7XG4gICAgICBtZXJnZUZyb250ZW5kTW9kZWxFdmVudFByb2plY3Rpb25QYXlsb2FkKHByb2plY3Rpb25QYXlsb2FkLCBlbnRyeS5wcm9qZWN0aW9uUGF5bG9hZClcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbW9kZWw6IHRoaXMuTW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKSxcbiAgICAgIC4uLnByb2plY3Rpb25QYXlsb2FkXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmd9IC0gU3RhYmxlIGtleSBmb3IgY3VycmVudCBzdWJzY3JpcHRpb24gcGFyYW1zLiAqL1xuICBzdWJzY3JpcHRpb25QYXJhbXNKc29uKCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnN1YnNjcmlwdGlvblBhcmFtcygpKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBlbnN1cmVTdWJzY3JpYmVkKCkge1xuICAgIGNvbnN0IHBhcmFtc0pzb24gPSB0aGlzLnN1YnNjcmlwdGlvblBhcmFtc0pzb24oKVxuXG4gICAgaWYgKHRoaXMuY2hhbm5lbEhhbmRsZSAmJiAhdGhpcy5jaGFubmVsSGFuZGxlLmlzQ2xvc2VkKCkpIHtcbiAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvblBhcmFtc0tleSAhPT0gcGFyYW1zSnNvbikge1xuICAgICAgICB0aGlzLmNoYW5uZWxIYW5kbGUuY2xvc2UoKVxuICAgICAgICB0aGlzLmNoYW5uZWxIYW5kbGUgPSBudWxsXG4gICAgICAgIHRoaXMucmVhZHlQcm9taXNlID0gbnVsbFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMucmVhZHlQcm9taXNlKSBhd2FpdCB0aGlzLnJlYWR5UHJvbWlzZVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXJpYWxpemUgcGFyYWxsZWwgY2FsbHMgKGUuZy4gUHJvbWlzZS5hbGwoW29uQ3JlYXRlLCBvblVwZGF0ZSxcbiAgICAvLyBvbkRlc3Ryb3ldKSkgc28gd2Ugb3BlbiBleGFjdGx5IG9uZSBzdWJzY3JpcHRpb24gcGVyIG1vZGVsIGNsYXNzXG4gICAgLy8gaW5zdGVhZCBvZiByYWNpbmcgdGhyZWUgY29uY3VycmVudCBzdWJzY3JpYmVDaGFubmVsIGNhbGxzLlxuICAgIGlmICh0aGlzLnJlYWR5UHJvbWlzZSkge1xuICAgICAgYXdhaXQgdGhpcy5yZWFkeVByb21pc2VcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNsaWVudCA9IC8qKiBAdHlwZSB7YW55fSAqLyAoZnJvbnRlbmRNb2RlbFRyYW5zcG9ydENvbmZpZy53ZWJzb2NrZXRDbGllbnQgfHwgcmVzb2x2ZUludGVybmFsV2Vic29ja2V0Q2xpZW50KCkpXG5cbiAgICBpZiAoIWNsaWVudCB8fCB0eXBlb2YgY2xpZW50LnN1YnNjcmliZUNoYW5uZWwgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRnJvbnRlbmQgbW9kZWwgZXZlbnQgc3Vic2NyaXB0aW9ucyByZXF1aXJlIGNvbmZpZ3VyZVRyYW5zcG9ydCh7d2Vic29ja2V0VXJsfSkgb3IgY29uZmlndXJlVHJhbnNwb3J0KHt3ZWJzb2NrZXRDbGllbnR9KVwiKVxuICAgIH1cblxuICAgIHRoaXMucmVhZHlQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgY2xpZW50LmNvbm5lY3QgPT09IFwiZnVuY3Rpb25cIikgYXdhaXQgY2xpZW50LmNvbm5lY3QoKVxuXG4gICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLnN1YnNjcmlwdGlvblBhcmFtcygpXG5cbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uUGFyYW1zS2V5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zKVxuICAgICAgdGhpcy5jaGFubmVsSGFuZGxlID0gY2xpZW50LnN1YnNjcmliZUNoYW5uZWwoRlJPTlRFTkRfTU9ERUxTX0NIQU5ORUxfTkFNRSwge1xuICAgICAgICBwYXJhbXMsXG4gICAgICAgIG9uTWVzc2FnZTogKC8qKiBAdHlwZSB7YW55fSAqLyBib2R5KSA9PiB0aGlzLl9kaXNwYXRjaEV2ZW50KGJvZHkpLFxuICAgICAgICBvbkNsb3NlOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jaGFubmVsSGFuZGxlID0gbnVsbFxuICAgICAgICAgIHRoaXMucmVhZHlQcm9taXNlID0gbnVsbFxuICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uUGFyYW1zS2V5ID0gbnVsbFxuICAgICAgICAgIHRoaXMuaW5zdGFuY2VMaXN0ZW5lcnMuY2xlYXIoKVxuXG4gICAgICAgICAgY29uc3QgaGFzQ2FsbGJhY2tzID0gdGhpcy5jbGFzc0NyZWF0ZUNhbGxiYWNrcy5zaXplID4gMFxuICAgICAgICAgICAgfHwgdGhpcy5jbGFzc1VwZGF0ZUNhbGxiYWNrcy5zaXplID4gMFxuICAgICAgICAgICAgfHwgdGhpcy5jbGFzc0Rlc3Ryb3lDYWxsYmFja3Muc2l6ZSA+IDBcblxuICAgICAgICAgIGlmIChoYXNDYWxsYmFja3MgJiYgY2xpZW50LmF1dG9SZWNvbm5lY3QpIHtcbiAgICAgICAgICAgIHZvaWQgdGhpcy5lbnN1cmVTdWJzY3JpYmVkKClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBhd2FpdCB0aGlzLmNoYW5uZWxIYW5kbGUucmVhZHlcbiAgICB9KSgpXG5cbiAgICBhd2FpdCB0aGlzLnJlYWR5UHJvbWlzZVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7YW55fSBib2R5IC0gV2ViU29ja2V0IGV2ZW50IHBheWxvYWQuICovXG4gIF9kaXNwYXRjaEV2ZW50KGJvZHkpIHtcbiAgICBpZiAoIWJvZHkgfHwgdHlwZW9mIGJvZHkgIT09IFwib2JqZWN0XCIpIHJldHVyblxuXG4gICAgY29uc3QgYWN0aW9uID0gYm9keS5hY3Rpb25cbiAgICBjb25zdCByYXdJZCA9IGJvZHkuaWRcblxuICAgIGlmIChhY3Rpb24gIT09IFwiY3JlYXRlXCIgJiYgYWN0aW9uICE9PSBcInVwZGF0ZVwiICYmIGFjdGlvbiAhPT0gXCJkZXN0cm95XCIpIHJldHVyblxuICAgIGlmIChyYXdJZCA9PT0gdW5kZWZpbmVkIHx8IHJhd0lkID09PSBudWxsKSByZXR1cm5cblxuICAgIGNvbnN0IGlkID0gU3RyaW5nKHJhd0lkKVxuXG4gICAgaWYgKGFjdGlvbiA9PT0gXCJkZXN0cm95XCIpIHtcbiAgICAgIGNvbnN0IGxpc3RlbmVyID0gdGhpcy5pbnN0YW5jZUxpc3RlbmVycy5nZXQoaWQpXG5cbiAgICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGxpc3RlbmVyLmRlc3Ryb3lDYWxsYmFja3MpIHtcbiAgICAgICAgICB0cnkgeyBlbnRyeS5jYWxsYmFjayh7aWR9KSB9IGNhdGNoIChlcnJvcikgeyBjb25zb2xlLmVycm9yKGVycm9yKSB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnN0YW5jZUxpc3RlbmVycy5kZWxldGUoaWQpXG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuY2xhc3NEZXN0cm95Q2FsbGJhY2tzKSB7XG4gICAgICAgIHRyeSB7IGVudHJ5LmNhbGxiYWNrKHtpZH0pIH0gY2F0Y2ggKGVycm9yKSB7IGNvbnNvbGUuZXJyb3IoZXJyb3IpIH1cbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghYm9keS5yZWNvcmQgfHwgdHlwZW9mIGJvZHkucmVjb3JkICE9PSBcIm9iamVjdFwiKSByZXR1cm5cblxuICAgIGNvbnN0IGRlc2VyaWFsaXplZFJlY29yZCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi8gKGRlc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlKGJvZHkucmVjb3JkKSlcbiAgICBjb25zdCBmcmVzaE1vZGVsID0gLyoqIEB0eXBlIHthbnl9ICovICh0aGlzLk1vZGVsQ2xhc3MpLmluc3RhbnRpYXRlRnJvbVJlc3BvbnNlKGRlc2VyaWFsaXplZFJlY29yZClcbiAgICBjb25zdCBsaXN0ZW5lciA9IHRoaXMuaW5zdGFuY2VMaXN0ZW5lcnMuZ2V0KGlkKVxuXG4gICAgaWYgKGFjdGlvbiA9PT0gXCJ1cGRhdGVcIiAmJiBsaXN0ZW5lcikge1xuICAgICAgLy8gQXV0by1tZXJnZSBpbnRvIHRoZSByZWdpc3RlcmVkIGluc3RhbmNlIHNvIGNhbGxlcnMgcmVhZGluZ1xuICAgICAgLy8gdGhyb3VnaCB0aGUgc2FtZSBoYW5kbGUgc2VlIGZyZXNoIGF0dHJpYnV0ZXMuXG4gICAgICBjb25zdCBpbnN0YW5jZUFueSA9IC8qKiBAdHlwZSB7YW55fSAqLyAobGlzdGVuZXIuaW5zdGFuY2UpXG5cbiAgICAgIGluc3RhbmNlQW55LmFzc2lnbkF0dHJpYnV0ZXMoZnJlc2hNb2RlbC5hdHRyaWJ1dGVzKCkpXG4gICAgICBpbnN0YW5jZUFueS5fcGVyc2lzdGVkQXR0cmlidXRlcyA9IGNsb25lRnJvbnRlbmRNb2RlbEF0dHJpYnV0ZXMobGlzdGVuZXIuaW5zdGFuY2UuYXR0cmlidXRlcygpKVxuXG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGxpc3RlbmVyLnVwZGF0ZUNhbGxiYWNrcykge1xuICAgICAgICB0cnkgeyBlbnRyeS5jYWxsYmFjayh7aWQsIG1vZGVsOiBsaXN0ZW5lci5pbnN0YW5jZX0pIH0gY2F0Y2ggKGVycm9yKSB7IGNvbnNvbGUuZXJyb3IoZXJyb3IpIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjbGFzc0NhbGxiYWNrcyA9IGFjdGlvbiA9PT0gXCJjcmVhdGVcIiA/IHRoaXMuY2xhc3NDcmVhdGVDYWxsYmFja3MgOiB0aGlzLmNsYXNzVXBkYXRlQ2FsbGJhY2tzXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGNsYXNzQ2FsbGJhY2tzKSB7XG4gICAgICB0cnkgeyBlbnRyeS5jYWxsYmFjayh7aWQsIG1vZGVsOiBmcmVzaE1vZGVsfSkgfSBjYXRjaCAoZXJyb3IpIHsgY29uc29sZS5lcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgbWF5YmVUZWFyZG93bigpIHtcbiAgICBjb25zdCBoYXNBbnlMaXN0ZW5lciA9IHRoaXMuY2xhc3NDcmVhdGVDYWxsYmFja3Muc2l6ZSA+IDBcbiAgICAgIHx8IHRoaXMuY2xhc3NVcGRhdGVDYWxsYmFja3Muc2l6ZSA+IDBcbiAgICAgIHx8IHRoaXMuY2xhc3NEZXN0cm95Q2FsbGJhY2tzLnNpemUgPiAwXG4gICAgICB8fCB0aGlzLmluc3RhbmNlTGlzdGVuZXJzLnNpemUgPiAwXG5cbiAgICBpZiAoaGFzQW55TGlzdGVuZXIpIHJldHVyblxuICAgIGlmICghdGhpcy5jaGFubmVsSGFuZGxlKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICB0aGlzLmNoYW5uZWxIYW5kbGUuY2xvc2UoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICAgIH1cblxuICAgIHRoaXMuY2hhbm5lbEhhbmRsZSA9IG51bGxcbiAgICB0aGlzLnJlYWR5UHJvbWlzZSA9IG51bGxcbiAgICB0aGlzLnN1YnNjcmlwdGlvblBhcmFtc0tleSA9IG51bGxcbiAgfVxufVxuXG4vKiogQHR5cGUge1dlYWtNYXA8dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlLCBGcm9udGVuZE1vZGVsRXZlbnRTdWJzY3JpcHRpb24+fSAqL1xuY29uc3QgZnJvbnRlbmRNb2RlbEV2ZW50U3Vic2NyaXB0aW9ucyA9IG5ldyBXZWFrTWFwKClcblxuLyoqXG4gKiBAcGFyYW0ge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gTW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxFdmVudFN1YnNjcmlwdGlvbn0gLSBQZXItY2xhc3Mgc3Vic2NyaXB0aW9uIGhlbHBlci5cbiAqL1xuZnVuY3Rpb24gZW5zdXJlRnJvbnRlbmRNb2RlbEV2ZW50U3Vic2NyaXB0aW9uKE1vZGVsQ2xhc3MpIHtcbiAgbGV0IHN1YiA9IGZyb250ZW5kTW9kZWxFdmVudFN1YnNjcmlwdGlvbnMuZ2V0KE1vZGVsQ2xhc3MpXG5cbiAgaWYgKCFzdWIpIHtcbiAgICBzdWIgPSBuZXcgRnJvbnRlbmRNb2RlbEV2ZW50U3Vic2NyaXB0aW9uKE1vZGVsQ2xhc3MpXG4gICAgZnJvbnRlbmRNb2RlbEV2ZW50U3Vic2NyaXB0aW9ucy5zZXQoTW9kZWxDbGFzcywgc3ViKVxuICB9XG5cbiAgcmV0dXJuIHN1YlxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSByZXNvdXJjZVBhdGggLSBSZXNvdXJjZSBwYXRoIHByZWZpeC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kTmFtZSAtIENvbW1hbmQgcGF0aCBzZWdtZW50LlxuICogQHJldHVybnMge3N0cmluZ30gLSBGcm9udGVuZCBtb2RlbCBBUEkgVVJMLlxuICovXG5mdW5jdGlvbiBmcm9udGVuZE1vZGVsQ29tbWFuZFVybChyZXNvdXJjZVBhdGgsIGNvbW1hbmROYW1lKSB7XG4gIGNvbnN0IGNvbmZpZ3VyZWRVcmwgPSBmcm9udGVuZE1vZGVsVHJhbnNwb3J0VXJsKClcbiAgY29uc3Qgbm9ybWFsaXplZFJlc291cmNlUGF0aCA9IHJlc291cmNlUGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHJlc291cmNlUGF0aCA6IGAvJHtyZXNvdXJjZVBhdGh9YFxuXG4gIHJldHVybiBgJHtjb25maWd1cmVkVXJsfSR7bm9ybWFsaXplZFJlc291cmNlUGF0aH0vJHtjb21tYW5kTmFtZX1gXG59XG5cbi8qKlxuICogQHJldHVybnMge3N0cmluZ30gLSBTaGFyZWQgZnJvbnRlbmQtbW9kZWwgQVBJIFVSTC5cbiAqL1xuZnVuY3Rpb24gZnJvbnRlbmRNb2RlbEFwaVVybCgpIHtcbiAgcmV0dXJuIGAke2Zyb250ZW5kTW9kZWxUcmFuc3BvcnRVcmwoKX0ke1NIQVJFRF9GUk9OVEVORF9NT0RFTF9BUElfUEFUSH1gXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFJlcXVlc3QgVVJMIG9yIHBhdGguXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFdlYnNvY2tldC1zYWZlIHJlcXVlc3QgcGF0aC5cbiAqL1xuZnVuY3Rpb24gZnJvbnRlbmRNb2RlbFRyYW5zcG9ydFBhdGgodXJsKSB7XG4gIGlmICh0eXBlb2YgdXJsICE9PSBcInN0cmluZ1wiIHx8IHVybC5sZW5ndGggPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBmcm9udGVuZCBtb2RlbCB0cmFuc3BvcnQgVVJML3BhdGgsIGdvdDogJHt1cmx9YClcbiAgfVxuXG4gIGlmICh1cmwuc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICByZXR1cm4gdXJsXG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwodXJsKVxuXG4gICAgcmV0dXJuIGAke3BhcnNlZFVybC5wYXRobmFtZX0ke3BhcnNlZFVybC5zZWFyY2h9YFxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdXJsXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHJlcXVlc3RQYXlsb2FkIC0gU2hhcmVkIHJlcXVlc3QgcGF5bG9hZC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSAtIERlY29kZWQgc2hhcmVkIGZyb250ZW5kLW1vZGVsIEFQSSByZXNwb25zZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcGVyZm9ybVNoYXJlZEZyb250ZW5kTW9kZWxBcGlSZXF1ZXN0KHJlcXVlc3RQYXlsb2FkKSB7XG4gIGNvbnN0IHNlcmlhbGl6ZWRSZXF1ZXN0UGF5bG9hZCA9IHNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZShyZXF1ZXN0UGF5bG9hZClcbiAgY29uc3Qgd2Vic29ja2V0Q2xpZW50ID0gZnJvbnRlbmRNb2RlbFRyYW5zcG9ydENvbmZpZy53ZWJzb2NrZXRDbGllbnRcbiAgY29uc3QgdXJsID0gZnJvbnRlbmRNb2RlbEFwaVVybCgpXG4gIGNvbnN0IGR5bmFtaWNIZWFkZXJzID0gdHlwZW9mIGZyb250ZW5kTW9kZWxUcmFuc3BvcnRDb25maWcucmVxdWVzdEhlYWRlcnMgPT09IFwiZnVuY3Rpb25cIlxuICAgID8gKGZyb250ZW5kTW9kZWxUcmFuc3BvcnRDb25maWcucmVxdWVzdEhlYWRlcnMoKSB8fCB7fSlcbiAgICA6IChmcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnLnJlcXVlc3RIZWFkZXJzIHx8IHt9KVxuICBjb25zdCBtZXJnZWRIZWFkZXJzID0ge1wiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLCAuLi5keW5hbWljSGVhZGVyc31cblxuICBpZiAod2Vic29ja2V0Q2xpZW50KSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB3ZWJzb2NrZXRDbGllbnQucG9zdChmcm9udGVuZE1vZGVsVHJhbnNwb3J0UGF0aCh1cmwpLCBzZXJpYWxpemVkUmVxdWVzdFBheWxvYWQsIHtcbiAgICAgIGhlYWRlcnM6IG1lcmdlZEhlYWRlcnNcbiAgICB9KVxuICAgIGNvbnN0IHJlc3BvbnNlSnNvbiA9IHJlc3BvbnNlLmpzb24oKVxuXG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi8gKGRlc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlKHJlc3BvbnNlSnNvbikpXG4gIH1cblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWRSZXF1ZXN0UGF5bG9hZCksXG4gICAgY3JlZGVudGlhbHM6IFwiaW5jbHVkZVwiLFxuICAgIGhlYWRlcnM6IG1lcmdlZEhlYWRlcnMsXG4gICAgbWV0aG9kOiBcIlBPU1RcIlxuICB9KVxuXG4gIGNvbnN0IHJlc3BvbnNlVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKVxuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAvLyBTdXJmYWNlIHRoZSBiYWNrZW5kJ3MgZnJpZW5kbHkgZXJyb3JNZXNzYWdlIGVudmVsb3BlICh0aGVcbiAgICAvLyBge3N0YXR1czogXCJlcnJvclwiLCBlcnJvck1lc3NhZ2U6IFwiLi4uXCJ9YCBzaGFwZSBldmVyeSBjb250cm9sbGVyXG4gICAgLy8gc2hpcHMgb24gaXRzIDR4eC81eHggcmVzcG9uc2VzKSBpbnN0ZWFkIG9mIHRoZSBnZW5lcmljIHN0YXR1c1xuICAgIC8vIHN0cmluZy4gRmFsbCB0aHJvdWdoIHRvIHRoZSBzdGF0dXMtb25seSBtZXNzYWdlIHdoZW4gdGhlIGJvZHkgaXNcbiAgICAvLyBtaXNzaW5nLCBub24tSlNPTiwgb3IgaGFzIG5vIHVzYWJsZSBlcnJvck1lc3NhZ2UgZmllbGQuXG4gICAgY29uc3QgcmVzcG9uc2VDb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC10eXBlXCIpXG5cbiAgICBpZiAocmVzcG9uc2VDb250ZW50VHlwZSAmJiByZXNwb25zZUNvbnRlbnRUeXBlLmluY2x1ZGVzKFwiYXBwbGljYXRpb24vanNvblwiKSAmJiByZXNwb25zZVRleHQubGVuZ3RoID4gMCkge1xuICAgICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbH0gKi9cbiAgICAgIGxldCBlcnJvckJvZHlcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZXJyb3JCb2R5ID0gSlNPTi5wYXJzZShyZXNwb25zZVRleHQpXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgZXJyb3JCb2R5ID0gbnVsbFxuICAgICAgfVxuXG4gICAgICBpZiAoZXJyb3JCb2R5ICYmIHR5cGVvZiBlcnJvckJvZHkuZXJyb3JNZXNzYWdlID09PSBcInN0cmluZ1wiICYmIGVycm9yQm9keS5lcnJvck1lc3NhZ2UudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yQm9keS5lcnJvck1lc3NhZ2UudHJpbSgpKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgUmVxdWVzdCBmYWlsZWQgKCR7cmVzcG9uc2Uuc3RhdHVzfSkgZm9yIHNoYXJlZCBmcm9udGVuZCBtb2RlbCBBUElgKVxuICB9XG5cbiAgY29uc3QganNvbiA9IHJlc3BvbnNlVGV4dC5sZW5ndGggPiAwID8gSlNPTi5wYXJzZShyZXNwb25zZVRleHQpIDoge31cblxuICByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqLyAoZGVzZXJpYWxpemVGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWUoanNvbikpXG59XG5cbi8qKlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgcGVuZGluZyBzaGFyZWQgZnJvbnRlbmQtbW9kZWwgcmVxdWVzdHMgZmx1c2guXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZsdXNoUGVuZGluZ1NoYXJlZEZyb250ZW5kTW9kZWxSZXF1ZXN0cygpIHtcbiAgc2hhcmVkRnJvbnRlbmRNb2RlbEZsdXNoU2NoZWR1bGVkID0gZmFsc2VcblxuICBpZiAocGVuZGluZ1NoYXJlZEZyb250ZW5kTW9kZWxSZXF1ZXN0cy5sZW5ndGggPCAxKSB7XG4gICAgcmVzb2x2ZUZyb250ZW5kTW9kZWxJZGxlV2FpdGVycygpXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBiYXRjaGVkUmVxdWVzdHMgPSBwZW5kaW5nU2hhcmVkRnJvbnRlbmRNb2RlbFJlcXVlc3RzXG4gIHBlbmRpbmdTaGFyZWRGcm9udGVuZE1vZGVsUmVxdWVzdHMgPSBbXVxuXG4gIGNvbnN0IHVybCA9IGZyb250ZW5kTW9kZWxBcGlVcmwoKVxuICBjb25zdCByZXF1ZXN0UGF5bG9hZCA9IHtcbiAgICByZXF1ZXN0czogYmF0Y2hlZFJlcXVlc3RzLm1hcCgocmVxdWVzdCkgPT4ge1xuICAgICAgaWYgKHJlcXVlc3QuY3VzdG9tUGF0aCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbW1hbmRUeXBlOiByZXF1ZXN0LmNvbW1hbmRUeXBlLFxuICAgICAgICAgIGN1c3RvbVBhdGg6IHJlcXVlc3QuY3VzdG9tUGF0aCxcbiAgICAgICAgICBtb2RlbDogcmVxdWVzdC5tb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpLFxuICAgICAgICAgIHBheWxvYWQ6IHJlcXVlc3QucGF5bG9hZCxcbiAgICAgICAgICByZXF1ZXN0SWQ6IHJlcXVlc3QucmVxdWVzdElkXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29tbWFuZFR5cGU6IHJlcXVlc3QuY29tbWFuZFR5cGUsXG4gICAgICAgIG1vZGVsOiByZXF1ZXN0Lm1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKCksXG4gICAgICAgIHBheWxvYWQ6IHJlcXVlc3QucGF5bG9hZCxcbiAgICAgICAgcmVxdWVzdElkOiByZXF1ZXN0LnJlcXVlc3RJZFxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBhd2FpdCB0cmFja0Zyb250ZW5kTW9kZWxUcmFuc3BvcnRSZXF1ZXN0KGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgdm9pZCB1cmxcbiAgICAgIGNvbnN0IGRlY29kZWRSZXNwb25zZSA9IGF3YWl0IHBlcmZvcm1TaGFyZWRGcm9udGVuZE1vZGVsQXBpUmVxdWVzdChyZXF1ZXN0UGF5bG9hZClcbiAgICAgIGNvbnN0IHJlc3BvbnNlcyA9IEFycmF5LmlzQXJyYXkoZGVjb2RlZFJlc3BvbnNlLnJlc3BvbnNlcykgPyBkZWNvZGVkUmVzcG9uc2UucmVzcG9uc2VzIDogW11cbiAgICAgIGNvbnN0IHJlc3BvbnNlc0J5SWQgPSBuZXcgTWFwKHJlc3BvbnNlcy5tYXAoKGVudHJ5KSA9PiBbZW50cnkucmVxdWVzdElkLCBlbnRyeS5yZXNwb25zZV0pKVxuXG4gICAgICBmb3IgKGNvbnN0IHJlcXVlc3Qgb2YgYmF0Y2hlZFJlcXVlc3RzKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlUGF5bG9hZCA9IHJlc3BvbnNlc0J5SWQuZ2V0KHJlcXVlc3QucmVxdWVzdElkKVxuXG4gICAgICAgIGlmICghcmVzcG9uc2VQYXlsb2FkIHx8IHR5cGVvZiByZXNwb25zZVBheWxvYWQgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICByZXF1ZXN0LnJlamVjdChuZXcgRXJyb3IoYE1pc3NpbmcgYmF0Y2hlZCByZXNwb25zZSBmb3IgJHtyZXF1ZXN0Lm1vZGVsQ2xhc3MubmFtZX0jJHtyZXF1ZXN0LmNvbW1hbmRUeXBlfWApKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICByZXF1ZXN0LnJlc29sdmUoLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqLyAocmVzcG9uc2VQYXlsb2FkKSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZm9yIChjb25zdCByZXF1ZXN0IG9mIGJhdGNoZWRSZXF1ZXN0cykge1xuICAgICAgICByZXF1ZXN0LnJlamVjdChlcnJvcilcbiAgICAgIH1cbiAgICB9XG4gIH0pXG59XG5cbi8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbmZ1bmN0aW9uIHNjaGVkdWxlU2hhcmVkRnJvbnRlbmRNb2RlbFJlcXVlc3RGbHVzaCgpIHtcbiAgaWYgKHNoYXJlZEZyb250ZW5kTW9kZWxGbHVzaFNjaGVkdWxlZCkgcmV0dXJuXG5cbiAgc2hhcmVkRnJvbnRlbmRNb2RlbEZsdXNoU2NoZWR1bGVkID0gdHJ1ZVxuICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgdm9pZCBmbHVzaFBlbmRpbmdTaGFyZWRGcm9udGVuZE1vZGVsUmVxdWVzdHMoKVxuICB9KVxufVxuXG4vKipcbiAqIEN1c3RvbSBjb21tYW5kcyBzdGlsbCB1c2UgdGhlIHNoYXJlZCBmcm9udGVuZC1tb2RlbCBBUEkuIFRoaXMgaGVscGVyIG9ubHkgYnVpbGRzIHRoZSBiYWNrZW5kIHJvdXRlIHBhdGggdGhlIHNlcnZlciBzaG91bGQgZGlzcGF0Y2ggYWZ0ZXIgdmFsaWRhdGluZyB0aGUgc2VnbWVudHMuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNvbW1hbmROYW1lIC0gQ29tbWFuZCBwYXRoIHNlZ21lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5tb2RlbE5hbWUgLSBGcm9udGVuZCBtb2RlbCBjbGFzcyBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfSBbYXJncy5tZW1iZXJJZF0gLSBPcHRpb25hbCBtZW1iZXIgaWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5yZXNvdXJjZVBhdGggLSBSZXNvdXJjZSBwYXRoIHByZWZpeC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQ3VzdG9tIGJhY2tlbmQgcm91dGUgcGF0aC5cbiAqL1xuZnVuY3Rpb24gZnJvbnRlbmRNb2RlbEN1c3RvbUNvbW1hbmRQYXRoKHtjb21tYW5kTmFtZSwgbWVtYmVySWQsIG1vZGVsTmFtZSwgcmVzb3VyY2VQYXRofSkge1xuICBjb25zdCB2YWxpZGF0ZWRSZXNvdXJjZVBhdGggPSB2YWxpZGF0ZUZyb250ZW5kTW9kZWxSZXNvdXJjZVBhdGgoe21vZGVsTmFtZSwgcmVzb3VyY2VQYXRofSlcbiAgY29uc3QgdmFsaWRhdGVkQ29tbWFuZE5hbWUgPSB2YWxpZGF0ZUZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbW1hbmROYW1lKHtjb21tYW5kTmFtZSwgY29tbWFuZFR5cGU6IGNvbW1hbmROYW1lLCBtb2RlbE5hbWV9KVxuXG4gIGlmIChtZW1iZXJJZCA9PT0gdW5kZWZpbmVkIHx8IG1lbWJlcklkID09PSBudWxsIHx8IG1lbWJlcklkID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIGAke3ZhbGlkYXRlZFJlc291cmNlUGF0aH0vJHt2YWxpZGF0ZWRDb21tYW5kTmFtZX1gXG4gIH1cblxuICByZXR1cm4gYCR7dmFsaWRhdGVkUmVzb3VyY2VQYXRofS8ke2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcobWVtYmVySWQpKX0vJHt2YWxpZGF0ZWRDb21tYW5kTmFtZX1gXG59XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25kaXRpb25zIC0gZmluZEJ5IGNvbmRpdGlvbnMuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gLSBKU09OLW5vcm1hbGl6ZWQgY29uZGl0aW9ucy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRmluZENvbmRpdGlvbnMoY29uZGl0aW9ucykge1xuICB0cnkge1xuICAgIHJldHVybiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovIChKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNvbmRpdGlvbnMpKSlcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGZpbmRCeSBjb25kaXRpb25zIGNvdWxkIG5vdCBiZSBzZXJpYWxpemVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLCB7Y2F1c2U6IGVycm9yfSlcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gY29uZGl0aW9ucyAtIGZpbmRCeSBjb25kaXRpb25zLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGFzc2VydEZpbmRCeUNvbmRpdGlvbnNTaGFwZShjb25kaXRpb25zKSB7XG4gIGlmICghY29uZGl0aW9ucyB8fCB0eXBlb2YgY29uZGl0aW9ucyAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGNvbmRpdGlvbnMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBmaW5kQnkgZXhwZWN0cyBjb25kaXRpb25zIHRvIGJlIGEgcGxhaW4gb2JqZWN0LCBnb3Q6ICR7Y29uZGl0aW9uc31gKVxuICB9XG5cbiAgY29uc3QgY29uZGl0aW9uc1Byb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjb25kaXRpb25zKVxuXG4gIGlmIChjb25kaXRpb25zUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIGNvbmRpdGlvbnNQcm90b3R5cGUgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGZpbmRCeSBleHBlY3RzIGNvbmRpdGlvbnMgdG8gYmUgYSBwbGFpbiBvYmplY3QsIGdvdDogJHtjb25kaXRpb25zfWApXG4gIH1cblxuICBjb25zdCBzeW1ib2xLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhjb25kaXRpb25zKVxuXG4gIGlmIChzeW1ib2xLZXlzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGZpbmRCeSBkb2VzIG5vdCBzdXBwb3J0IHN5bWJvbCBjb25kaXRpb24ga2V5cyAoa2V5czogJHtzeW1ib2xLZXlzLm1hcCgoa2V5KSA9PiBrZXkudG9TdHJpbmcoKSkuam9pbihcIiwgXCIpfSlgKVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENvbmRpdGlvbiB2YWx1ZSB0byB2YWxpZGF0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlQYXRoIC0gS2V5IHBhdGggZm9yIGVycm9yIG91dHB1dC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBhc3NlcnREZWZpbmVkRmluZEJ5Q29uZGl0aW9uVmFsdWUodmFsdWUsIGtleVBhdGgpIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGZpbmRCeSBkb2VzIG5vdCBzdXBwb3J0IHVuZGVmaW5lZCBjb25kaXRpb24gdmFsdWVzIChrZXk6ICR7a2V5UGF0aH0pYClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IG5ldyBFcnJvcihgZmluZEJ5IGRvZXMgbm90IHN1cHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uIHZhbHVlcyAoa2V5OiAke2tleVBhdGh9KWApXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN5bWJvbFwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBmaW5kQnkgZG9lcyBub3Qgc3VwcG9ydCBzeW1ib2wgY29uZGl0aW9uIHZhbHVlcyAoa2V5OiAke2tleVBhdGh9KWApXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcImJpZ2ludFwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBmaW5kQnkgZG9lcyBub3Qgc3VwcG9ydCBiaWdpbnQgY29uZGl0aW9uIHZhbHVlcyAoa2V5OiAke2tleVBhdGh9KWApXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmICFOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBmaW5kQnkgZG9lcyBub3Qgc3VwcG9ydCBub24tZmluaXRlIG51bWJlciBjb25kaXRpb24gdmFsdWVzIChrZXk6ICR7a2V5UGF0aH0pYClcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHZhbHVlLmZvckVhY2goKGVudHJ5LCBpbmRleCkgPT4ge1xuICAgICAgYXNzZXJ0RGVmaW5lZEZpbmRCeUNvbmRpdGlvblZhbHVlKGVudHJ5LCBgJHtrZXlQYXRofVske2luZGV4fV1gKVxuICAgIH0pXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgb2JqZWN0VmFsdWUgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAodmFsdWUpXG4gICAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdFZhbHVlKVxuXG4gICAgaWYgKHByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBwcm90b3R5cGUgIT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZmluZEJ5IGRvZXMgbm90IHN1cHBvcnQgbm9uLXBsYWluIG9iamVjdCBjb25kaXRpb24gdmFsdWVzIChrZXk6ICR7a2V5UGF0aH0pYClcbiAgICB9XG5cbiAgICBjb25zdCBzeW1ib2xLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3RWYWx1ZSlcblxuICAgIGlmIChzeW1ib2xLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZmluZEJ5IGRvZXMgbm90IHN1cHBvcnQgc3ltYm9sIGNvbmRpdGlvbiBrZXlzIChrZXk6ICR7a2V5UGF0aH0pYClcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZU9iamVjdCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovICh2YWx1ZSlcblxuICAgIE9iamVjdC5rZXlzKHZhbHVlT2JqZWN0KS5mb3JFYWNoKChuZXN0ZWRLZXkpID0+IHtcbiAgICAgIGFzc2VydERlZmluZWRGaW5kQnlDb25kaXRpb25WYWx1ZSh2YWx1ZU9iamVjdFtuZXN0ZWRLZXldLCBgJHtrZXlQYXRofS4ke25lc3RlZEtleX1gKVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IG9yaWdpbmFsVmFsdWUgLSBPcmlnaW5hbCBjb25kaXRpb24gdmFsdWUuXG4gKiBAcGFyYW0ge3Vua25vd259IG5vcm1hbGl6ZWRWYWx1ZSAtIEpTT04tbm9ybWFsaXplZCBjb25kaXRpb24gdmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5UGF0aCAtIEtleSBwYXRoIGZvciBlcnJvciBvdXRwdXQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0RmluZEJ5Q29uZGl0aW9uU2VyaWFsaXphdGlvblByZXNlcnZlc1ZhbHVlKG9yaWdpbmFsVmFsdWUsIG5vcm1hbGl6ZWRWYWx1ZSwga2V5UGF0aCkge1xuICBpZiAob3JpZ2luYWxWYWx1ZSA9PT0gbnVsbCkge1xuICAgIGlmIChub3JtYWxpemVkVmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZmluZEJ5IGNvbmRpdGlvbiBjaGFuZ2VkIGR1cmluZyBzZXJpYWxpemF0aW9uIChrZXk6ICR7a2V5UGF0aH0pYClcbiAgICB9XG5cbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG9yaWdpbmFsVmFsdWUpKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG5vcm1hbGl6ZWRWYWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZmluZEJ5IGNvbmRpdGlvbiBjaGFuZ2VkIGR1cmluZyBzZXJpYWxpemF0aW9uIChrZXk6ICR7a2V5UGF0aH0pYClcbiAgICB9XG5cbiAgICBpZiAob3JpZ2luYWxWYWx1ZS5sZW5ndGggIT09IG5vcm1hbGl6ZWRWYWx1ZS5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZmluZEJ5IGNvbmRpdGlvbiBjaGFuZ2VkIGR1cmluZyBzZXJpYWxpemF0aW9uIChrZXk6ICR7a2V5UGF0aH0pYClcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgb3JpZ2luYWxWYWx1ZS5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGFzc2VydEZpbmRCeUNvbmRpdGlvblNlcmlhbGl6YXRpb25QcmVzZXJ2ZXNWYWx1ZShvcmlnaW5hbFZhbHVlW2luZGV4XSwgbm9ybWFsaXplZFZhbHVlW2luZGV4XSwgYCR7a2V5UGF0aH1bJHtpbmRleH1dYClcbiAgICB9XG5cbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChvcmlnaW5hbFZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIGlmICh0eXBlb2Ygbm9ybWFsaXplZFZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGZpbmRCeSBjb25kaXRpb24gY2hhbmdlZCBkdXJpbmcgc2VyaWFsaXphdGlvbiAoa2V5OiAke2tleVBhdGh9KWApXG4gICAgfVxuXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAob3JpZ2luYWxWYWx1ZSAmJiB0eXBlb2Ygb3JpZ2luYWxWYWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgIGlmICghbm9ybWFsaXplZFZhbHVlIHx8IHR5cGVvZiBub3JtYWxpemVkVmFsdWUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShub3JtYWxpemVkVmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGZpbmRCeSBjb25kaXRpb24gY2hhbmdlZCBkdXJpbmcgc2VyaWFsaXphdGlvbiAoa2V5OiAke2tleVBhdGh9KWApXG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZE9iamVjdCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChub3JtYWxpemVkVmFsdWUpXG4gICAgY29uc3Qgb3JpZ2luYWxPYmplY3QgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAob3JpZ2luYWxWYWx1ZSlcblxuICAgIE9iamVjdC5rZXlzKG9yaWdpbmFsT2JqZWN0KS5mb3JFYWNoKChuZXN0ZWRLZXkpID0+IHtcbiAgICAgIGlmICghKG5lc3RlZEtleSBpbiBub3JtYWxpemVkT2JqZWN0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGZpbmRCeSBjb25kaXRpb24ga2V5IHdhcyByZW1vdmVkIGR1cmluZyBzZXJpYWxpemF0aW9uIChrZXk6ICR7a2V5UGF0aH0uJHtuZXN0ZWRLZXl9KWApXG4gICAgICB9XG5cbiAgICAgIGFzc2VydEZpbmRCeUNvbmRpdGlvblNlcmlhbGl6YXRpb25QcmVzZXJ2ZXNWYWx1ZShvcmlnaW5hbE9iamVjdFtuZXN0ZWRLZXldLCBub3JtYWxpemVkT2JqZWN0W25lc3RlZEtleV0sIGAke2tleVBhdGh9LiR7bmVzdGVkS2V5fWApXG4gICAgfSlcblxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKG5vcm1hbGl6ZWRWYWx1ZSAhPT0gb3JpZ2luYWxWYWx1ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZmluZEJ5IGNvbmRpdGlvbiBjaGFuZ2VkIGR1cmluZyBzZXJpYWxpemF0aW9uIChrZXk6ICR7a2V5UGF0aH0pYClcbiAgfVxufVxuXG4vKiogQmFzZSBjbGFzcyBmb3IgZ2VuZXJhdGVkIGZyb250ZW5kIG1vZGVsIGNsYXNzZXMuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGcm9udGVuZE1vZGVsQmFzZSB7XG4gIC8qKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfSAqL1xuICBzdGF0aWMgbW9kZWxOYW1lXG5cbiAgLyoqIEB0eXBlIHtib29sZWFufSAtIEdsb2JhbCBhdXRvLWJhdGNoLXByZWxvYWQgdG9nZ2xlLiBBcHBzIGNhbiBvcHQgb3V0IHZpYSBGcm9udGVuZE1vZGVsQmFzZS5zZXRBdXRvbG9hZChmYWxzZSkuICovXG4gIHN0YXRpYyBfYXV0b2xvYWQgPSB0cnVlXG5cbiAgLyoqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGF1dG8tYmF0Y2gtcHJlbG9hZCBvZiByZWxhdGlvbnNoaXBzIG9uIGxhenkgYWNjZXNzIGlzIGVuYWJsZWQgZ2xvYmFsbHkuICovXG4gIHN0YXRpYyBnZXRBdXRvbG9hZCgpIHsgcmV0dXJuIEZyb250ZW5kTW9kZWxCYXNlLl9hdXRvbG9hZCB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gbmV3VmFsdWUgLSBXaGV0aGVyIGF1dG8tYmF0Y2gtcHJlbG9hZCBvZiByZWxhdGlvbnNoaXBzIGlzIGVuYWJsZWQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHNldEF1dG9sb2FkKG5ld1ZhbHVlKSB7IEZyb250ZW5kTW9kZWxCYXNlLl9hdXRvbG9hZCA9IG5ld1ZhbHVlIH1cblxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gIF9hdHRyaWJ1dGVzXG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgRnJvbnRlbmRNb2RlbEhhc01hbnlSZWxhdGlvbnNoaXA8YW55LCBhbnk+IHwgRnJvbnRlbmRNb2RlbFNpbmd1bGFyUmVsYXRpb25zaGlwPGFueSwgYW55Pj59ICovXG4gIF9yZWxhdGlvbnNoaXBzXG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgRnJvbnRlbmRNb2RlbEF0dGFjaG1lbnRIYW5kbGU+fSAqL1xuICBfYXR0YWNobWVudHNcbiAgLyoqIEB0eXBlIHtTZXQ8c3RyaW5nPiB8IG51bGx9ICovXG4gIF9zZWxlY3RlZEF0dHJpYnV0ZXNcbiAgLyoqIEB0eXBlIHtib29sZWFufSAqL1xuICBfaXNOZXdSZWNvcmRcbiAgLyoqIEB0eXBlIHtib29sZWFufSAqL1xuICBfbWFya2VkRm9yRGVzdHJ1Y3Rpb25cbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICBfcGVyc2lzdGVkQXR0cmlidXRlc1xuICAvKiogQHR5cGUge0FycmF5PEZyb250ZW5kTW9kZWxCYXNlPiB8IHVuZGVmaW5lZH0gLSBTaGFyZWQgcmVmZXJlbmNlIHRvIHNpYmxpbmcgcmVjb3JkcyBsb2FkZWQgaW4gdGhlIHNhbWUgYmF0Y2guIFVzZWQgYnkgYXV0by1iYXRjaC1wcmVsb2FkLiAqL1xuICBfbG9hZENvaG9ydFxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFthdHRyaWJ1dGVzXSAtIEluaXRpYWwgYXR0cmlidXRlcy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMgPSB7fSkge1xuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gKi8gKHRoaXMuY29uc3RydWN0b3IpXG5cbiAgICBNb2RlbENsYXNzLmVuc3VyZUdlbmVyYXRlZEF0dGFjaG1lbnRNZXRob2RzKClcbiAgICB0aGlzLl9hdHRyaWJ1dGVzID0ge31cbiAgICB0aGlzLl9yZWxhdGlvbnNoaXBzID0ge31cbiAgICB0aGlzLl9hdHRhY2htZW50cyA9IHt9XG4gICAgdGhpcy5fc2VsZWN0ZWRBdHRyaWJ1dGVzID0gbnVsbFxuICAgIHRoaXMuX2lzTmV3UmVjb3JkID0gdHJ1ZVxuICAgIHRoaXMuX21hcmtlZEZvckRlc3RydWN0aW9uID0gZmFsc2VcbiAgICB0aGlzLl9wZXJzaXN0ZWRBdHRyaWJ1dGVzID0ge31cbiAgICB0aGlzLmFzc2lnbkF0dHJpYnV0ZXMoYXR0cmlidXRlcylcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfVxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBFbnN1cmVzIGF0dGFjaG1lbnQgaGVscGVyIG1ldGhvZHMgZXhpc3Qgb24gdGhlIHByb3RvdHlwZS5cbiAgICovXG4gIHN0YXRpYyBlbnN1cmVHZW5lcmF0ZWRBdHRhY2htZW50TWV0aG9kcygpIHtcbiAgICBpZiAodGhpcy5fZ2VuZXJhdGVkQXR0YWNobWVudE1ldGhvZHMpIHJldHVyblxuXG4gICAgY29uc3QgYXR0YWNobWVudHMgPSB0aGlzLmF0dGFjaG1lbnREZWZpbml0aW9ucygpXG4gICAgY29uc3QgcHJvdG90eXBlID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqLyAodGhpcy5wcm90b3R5cGUpXG5cbiAgICBmb3IgKGNvbnN0IGF0dGFjaG1lbnROYW1lIG9mIE9iamVjdC5rZXlzKGF0dGFjaG1lbnRzKSkge1xuICAgICAgaWYgKCEoYXR0YWNobWVudE5hbWUgaW4gcHJvdG90eXBlKSkge1xuICAgICAgICBwcm90b3R5cGVbYXR0YWNobWVudE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QXR0YWNobWVudEJ5TmFtZShhdHRhY2htZW50TmFtZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2dlbmVyYXRlZEF0dGFjaG1lbnRNZXRob2RzID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd9IC0gUmVzb3VyY2UgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN0YXRpYyByZXNvdXJjZUNvbmZpZygpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZXNvdXJjZUNvbmZpZygpIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlc1wiKVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnJlYWNoYWJsZVxuICAgIHJldHVybiB7fVxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9XG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCB0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2UgfCBzdHJpbmc+fSAtIFJlbGF0aW9uc2hpcCBtb2RlbCBjbGFzc2VzIChvciBjbGFzcyBuYW1lIHN0cmluZ3MpIGtleWVkIGJ5IHJlbGF0aW9uc2hpcCBuYW1lLlxuICAgKi9cbiAgc3RhdGljIHJlbGF0aW9uc2hpcE1vZGVsQ2xhc3NlcygpIHtcbiAgICByZXR1cm4ge31cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGZyb250ZW5kIG1vZGVsIGNsYXNzIHNvIGl0IGNhbiBiZSByZXNvbHZlZCBieSBuYW1lIGluIHJlbGF0aW9uc2hpcCBsb29rdXBzLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzIHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyByZWdpc3Rlck1vZGVsKG1vZGVsQ2xhc3MpIHtcbiAgICByZWdpc3RlckZyb250ZW5kTW9kZWwobW9kZWxDbGFzcylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBjYWxsYmFjayAtIFNjb3BlIGNhbGxiYWNrLlxuICAgKiBAcmV0dXJucyB7KCguLi5hcmdzOiBhbnlbXSkgPT4gaW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5kZWZhdWx0PGFueT4pICYge3Njb3BlOiAoLi4uYXJnczogYW55W10pID0+IGltcG9ydChcIi4uL3V0aWxzL21vZGVsLXNjb3BlLmpzXCIpLk1vZGVsU2NvcGVEZXNjcmlwdG9yfX0gLSBTY29wZSBoZWxwZXIuXG4gICAqL1xuICBzdGF0aWMgZGVmaW5lU2NvcGUoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gZGVmaW5lTW9kZWxTY29wZSh7XG4gICAgICBjYWxsYmFjayxcbiAgICAgIG1vZGVsQ2xhc3M6IHRoaXMsXG4gICAgICBzdGFydFF1ZXJ5OiAoKSA9PiB0aGlzLnF1ZXJ5KClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSByZWxhdGlvbnNoaXAgbW9kZWwgY2xhc3MgdmFsdWUgdGhhdCBtYXkgYmUgYSBjbGFzcyByZWZlcmVuY2Ugb3IgYSBzdHJpbmcgbmFtZS5cbiAgICogQHBhcmFtIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2UgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSB2YWx1ZSAtIENsYXNzIG9yIGNsYXNzIG5hbWUuXG4gICAqIEByZXR1cm5zIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2UgfCBudWxsfSAtIFJlc29sdmVkIG1vZGVsIGNsYXNzLlxuICAgKi9cbiAgc3RhdGljIHJlc29sdmVNb2RlbENsYXNzKHZhbHVlKSB7XG4gICAgcmV0dXJuIHJlc29sdmVGcm9udGVuZE1vZGVsQ2xhc3ModmFsdWUpXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHt0eXBlOiBcImJlbG9uZ3NUb1wiIHwgXCJoYXNPbmVcIiB8IFwiaGFzTWFueVwiLCBhdXRvbG9hZD86IGJvb2xlYW59Pn0gLSBSZWxhdGlvbnNoaXAgZGVmaW5pdGlvbnMga2V5ZWQgYnkgcmVsYXRpb25zaGlwIG5hbWUuXG4gICAqL1xuICBzdGF0aWMgcmVsYXRpb25zaGlwRGVmaW5pdGlvbnMoKSB7XG4gICAgcmV0dXJuIHt9XG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIEZyb250ZW5kTW9kZWxBdHRhY2htZW50RGVmaW5pdGlvbj59IC0gQXR0YWNobWVudCBkZWZpbml0aW9ucyBrZXllZCBieSBhdHRhY2htZW50IG5hbWUuXG4gICAqL1xuICBzdGF0aWMgYXR0YWNobWVudERlZmluaXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlQ29uZmlnKCkuYXR0YWNobWVudHMgfHwge31cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0YWNobWVudE5hbWUgLSBBdHRhY2htZW50IG5hbWUuXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsQXR0YWNobWVudERlZmluaXRpb24gfCBudWxsfSAtIEF0dGFjaG1lbnQgZGVmaW5pdGlvbi5cbiAgICovXG4gIHN0YXRpYyBhdHRhY2htZW50RGVmaW5pdGlvbihhdHRhY2htZW50TmFtZSkge1xuICAgIHJldHVybiB0aGlzLmF0dGFjaG1lbnREZWZpbml0aW9ucygpW2F0dGFjaG1lbnROYW1lXSB8fCBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uc2hpcE5hbWUgLSBSZWxhdGlvbnNoaXAgbmFtZS5cbiAgICogQHJldHVybnMge3t0eXBlOiBcImJlbG9uZ3NUb1wiIHwgXCJoYXNPbmVcIiB8IFwiaGFzTWFueVwiLCBhdXRvbG9hZD86IGJvb2xlYW59IHwgbnVsbH0gLSBSZWxhdGlvbnNoaXAgZGVmaW5pdGlvbi5cbiAgICovXG4gIHN0YXRpYyByZWxhdGlvbnNoaXBEZWZpbml0aW9uKHJlbGF0aW9uc2hpcE5hbWUpIHtcbiAgICBjb25zdCBkZWZpbml0aW9ucyA9IHRoaXMucmVsYXRpb25zaGlwRGVmaW5pdGlvbnMoKVxuXG4gICAgcmV0dXJuIGRlZmluaXRpb25zW3JlbGF0aW9uc2hpcE5hbWVdIHx8IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25zaGlwTmFtZSAtIFJlbGF0aW9uc2hpcCBuYW1lLlxuICAgKiBAcmV0dXJucyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlIHwgbnVsbH0gLSBUYXJnZXQgcmVsYXRpb25zaGlwIG1vZGVsIGNsYXNzLlxuICAgKi9cbiAgc3RhdGljIHJlbGF0aW9uc2hpcE1vZGVsQ2xhc3MocmVsYXRpb25zaGlwTmFtZSkge1xuICAgIGNvbnN0IHJlbGF0aW9uc2hpcE1vZGVsQ2xhc3NlcyA9IHRoaXMucmVsYXRpb25zaGlwTW9kZWxDbGFzc2VzKClcbiAgICBjb25zdCB2YWx1ZSA9IHJlbGF0aW9uc2hpcE1vZGVsQ2xhc3Nlc1tyZWxhdGlvbnNoaXBOYW1lXVxuXG4gICAgcmV0dXJuIEZyb250ZW5kTW9kZWxCYXNlLnJlc29sdmVNb2RlbENsYXNzKHZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAtIEF0dHJpYnV0ZXMgaGFzaC5cbiAgICovXG4gIGF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2F0dHJpYnV0ZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoaXMgbW9kZWwgaGFzIG5vdCB5ZXQgYmVlbiBwZXJzaXN0ZWQuXG4gICAqL1xuICBpc05ld1JlY29yZCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNOZXdSZWNvcmRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoaXMgbW9kZWwgaGFzIGJlZW4gcGVyc2lzdGVkLlxuICAgKi9cbiAgaXNQZXJzaXN0ZWQoKSB7XG4gICAgcmV0dXJuICF0aGlzLmlzTmV3UmVjb3JkKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IG5ld0lzTmV3UmVjb3JkIC0gTmV3IHBlcnNpc3RlZC1zdGF0ZSBmbGFnLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNldElzTmV3UmVjb3JkKG5ld0lzTmV3UmVjb3JkKSB7XG4gICAgdGhpcy5faXNOZXdSZWNvcmQgPSBuZXdJc05ld1JlY29yZFxuICB9XG5cbiAgLyoqXG4gICAqIE1hcmtzIHRoaXMgcmVjb3JkIGZvciBkZXN0cnVjdGlvbiB3aGVuIGl0cyBwYXJlbnQgaXMgbmV4dCBzYXZlZCB0aHJvdWdoXG4gICAqIG5lc3RlZC1hdHRyaWJ1dGUgc3VwcG9ydC4gVGhlIHJlY29yZCBpcyBub3QgcmVtb3ZlZCBmcm9tIHRoZSBwYXJlbnQnc1xuICAgKiByZWxhdGlvbnNoaXAgY29sbGVjdGlvbiB1bnRpbCB0aGUgc2VydmVyIGNvbmZpcm1zIHRoZSBkZWxldGUuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIG1hcmtGb3JEZXN0cnVjdGlvbigpIHtcbiAgICB0aGlzLl9tYXJrZWRGb3JEZXN0cnVjdGlvbiA9IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoaXMgcmVjb3JkIGlzIHF1ZXVlZCBmb3IgbmVzdGVkIGRlc3RydWN0aW9uIG9uIG5leHQgcGFyZW50IHNhdmUuXG4gICAqL1xuICBtYXJrZWRGb3JEZXN0cnVjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fbWFya2VkRm9yRGVzdHJ1Y3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55W10+fSAtIENoYW5nZWQgYXR0cmlidXRlcyBhcyBgW29sZFZhbHVlLCBuZXdWYWx1ZV1gLlxuICAgKi9cbiAgY2hhbmdlcygpIHtcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueVtdPn0gKi9cbiAgICBjb25zdCBjaGFuZ2VkQXR0cmlidXRlcyA9IHt9XG4gICAgY29uc3QgYXR0cmlidXRlTmFtZXMgPSBuZXcgU2V0KFtcbiAgICAgIC4uLk9iamVjdC5rZXlzKHRoaXMuX3BlcnNpc3RlZEF0dHJpYnV0ZXMpLFxuICAgICAgLi4uT2JqZWN0LmtleXModGhpcy5fYXR0cmlidXRlcylcbiAgICBdKVxuXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIG9mIGF0dHJpYnV0ZU5hbWVzKSB7XG4gICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gdGhpcy5fcGVyc2lzdGVkQXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXVxuICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5fYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXVxuXG4gICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlKHByZXZpb3VzVmFsdWUpKSAhPT0gSlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlKGN1cnJlbnRWYWx1ZSkpKSB7XG4gICAgICAgIGNoYW5nZWRBdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdID0gW3ByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZV1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2hhbmdlZEF0dHJpYnV0ZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGFueSB0cmFja2VkIGF0dHJpYnV0ZSBoYXMgY2hhbmdlZC5cbiAgICovXG4gIGlzQ2hhbmdlZCgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5jaGFuZ2VzKCkpLmxlbmd0aCA+IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25zaGlwTmFtZSAtIFJlbGF0aW9uc2hpcCBuYW1lLlxuICAgKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbEhhc01hbnlSZWxhdGlvbnNoaXA8YW55LCBhbnk+IHwgRnJvbnRlbmRNb2RlbFNpbmd1bGFyUmVsYXRpb25zaGlwPGFueSwgYW55Pn0gLSBSZWxhdGlvbnNoaXAgc3RhdGUgb2JqZWN0LlxuICAgKi9cbiAgZ2V0UmVsYXRpb25zaGlwQnlOYW1lKHJlbGF0aW9uc2hpcE5hbWUpIHtcbiAgICBpZiAoIXRoaXMuX3JlbGF0aW9uc2hpcHNbcmVsYXRpb25zaGlwTmFtZV0pIHtcbiAgICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gKi8gKHRoaXMuY29uc3RydWN0b3IpXG4gICAgICBjb25zdCByZWxhdGlvbnNoaXBEZWZpbml0aW9uID0gTW9kZWxDbGFzcy5yZWxhdGlvbnNoaXBEZWZpbml0aW9uKHJlbGF0aW9uc2hpcE5hbWUpXG4gICAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gTW9kZWxDbGFzcy5yZWxhdGlvbnNoaXBNb2RlbENsYXNzKHJlbGF0aW9uc2hpcE5hbWUpXG5cbiAgICAgIGlmIChyZWxhdGlvbnNoaXBEZWZpbml0aW9uICYmIHJlbGF0aW9uc2hpcFR5cGVJc0NvbGxlY3Rpb24ocmVsYXRpb25zaGlwRGVmaW5pdGlvbi50eXBlKSkge1xuICAgICAgICB0aGlzLl9yZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdID0gbmV3IEZyb250ZW5kTW9kZWxIYXNNYW55UmVsYXRpb25zaGlwKHRoaXMsIHJlbGF0aW9uc2hpcE5hbWUsIHRhcmdldE1vZGVsQ2xhc3MpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9yZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdID0gbmV3IEZyb250ZW5kTW9kZWxTaW5ndWxhclJlbGF0aW9uc2hpcCh0aGlzLCByZWxhdGlvbnNoaXBOYW1lLCB0YXJnZXRNb2RlbENsYXNzKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9yZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dGFjaG1lbnROYW1lIC0gQXR0YWNobWVudCBuYW1lLlxuICAgKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbEF0dGFjaG1lbnRIYW5kbGV9IC0gQXR0YWNobWVudCBoZWxwZXIuXG4gICAqL1xuICBnZXRBdHRhY2htZW50QnlOYW1lKGF0dGFjaG1lbnROYW1lKSB7XG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSAqLyAodGhpcy5jb25zdHJ1Y3RvcilcbiAgICBjb25zdCBhdHRhY2htZW50RGVmaW5pdGlvbiA9IE1vZGVsQ2xhc3MuYXR0YWNobWVudERlZmluaXRpb24oYXR0YWNobWVudE5hbWUpXG5cbiAgICBpZiAoIWF0dGFjaG1lbnREZWZpbml0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYXR0YWNobWVudDogJHtNb2RlbENsYXNzLm5hbWV9IyR7YXR0YWNobWVudE5hbWV9YClcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2F0dGFjaG1lbnRzW2F0dGFjaG1lbnROYW1lXSkge1xuICAgICAgdGhpcy5fYXR0YWNobWVudHNbYXR0YWNobWVudE5hbWVdID0gbmV3IEZyb250ZW5kTW9kZWxBdHRhY2htZW50SGFuZGxlKHtcbiAgICAgICAgYXR0YWNobWVudE5hbWUsXG4gICAgICAgIG1vZGVsOiB0aGlzXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9hdHRhY2htZW50c1thdHRhY2htZW50TmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25zaGlwTmFtZSAtIFJlbGF0aW9uc2hpcCBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSAtIExvYWRlZCByZWxhdGlvbnNoaXAgdmFsdWUuXG4gICAqL1xuICBhc3luYyBsb2FkUmVsYXRpb25zaGlwKHJlbGF0aW9uc2hpcE5hbWUpIHtcbiAgICBjb25zdCBNb2RlbENsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9ICovICh0aGlzLmNvbnN0cnVjdG9yKVxuICAgIGNvbnN0IGlkID0gdGhpcy5wcmltYXJ5S2V5VmFsdWUoKVxuICAgIGNvbnN0IHJlbG9hZGVkTW9kZWwgPSBhd2FpdCBNb2RlbENsYXNzXG4gICAgICAucHJlbG9hZChbcmVsYXRpb25zaGlwTmFtZV0pXG4gICAgICAuZmluZChpZClcbiAgICBjb25zdCBsb2FkZWRWYWx1ZSA9IHJlbG9hZGVkTW9kZWwuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKHJlbGF0aW9uc2hpcE5hbWUpLmxvYWRlZCgpXG5cbiAgICB0aGlzLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShyZWxhdGlvbnNoaXBOYW1lKS5zZXRMb2FkZWQobG9hZGVkVmFsdWUpXG5cbiAgICByZXR1cm4gbG9hZGVkVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVsb2FkcyByZWxhdGlvbnNoaXAocykgb250byB0aGlzIGFscmVhZHktbG9hZGVkIHJlY29yZC4gQWNjZXB0cyBlaXRoZXIgYVxuICAgKiBxdWVyeSBidWlsdCB2aWEgYE1vZGVsLnByZWxvYWQoLi4uKS5zZWxlY3QoLi4uKWAgb3IgYSByYXcgcHJlbG9hZCBzcGVjXG4gICAqIChzdHJpbmcgLyBhcnJheSAvIG5lc3RlZCBvYmplY3QpLiBSZWxhdGlvbnNoaXBzIGFscmVhZHkgcHJlbG9hZGVkIHdpdGggdGhlXG4gICAqIHJlcXVpcmVkIGNvbHVtbnMgcHJlc2VudCBhcmUgbGVmdCB1bnRvdWNoZWQgdW5sZXNzIGBmb3JjZWAgaXMgc2V0LiBDYXJyaWVzXG4gICAqIHRoZSBxdWVyeSdzIHByZWxvYWQgZ3JhcGgsIHNlbGVjdCwgc2VsZWN0c0V4dHJhLCB3aXRoQ291bnQsIGFiaWxpdGllcywgYW5kXG4gICAqIHF1ZXJ5RGF0YSB3aGVuIHJlLWZldGNoaW5nLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vcXVlcnkuanNcIikuZGVmYXVsdDxhbnk+IHwgaW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvaW5kZXguanNcIikuTmVzdGVkUHJlbG9hZFJlY29yZCB8IHN0cmluZyB8IEFycmF5PHN0cmluZyB8IGltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L2luZGV4LmpzXCIpLk5lc3RlZFByZWxvYWRSZWNvcmQ+fSBxdWVyeU9yU3BlYyAtIFByZWxvYWQgc291cmNlLlxuICAgKiBAcGFyYW0ge3tmb3JjZT86IGJvb2xlYW59fSBbb3B0aW9uc10gLSBPcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHByZWxvYWRpbmcgY29tcGxldGVzLlxuICAgKi9cbiAgYXN5bmMgcHJlbG9hZChxdWVyeU9yU3BlYywgb3B0aW9ucyA9IHt9KSB7XG4gICAgYXdhaXQgRnJvbnRlbmRNb2RlbFByZWxvYWRlci5wcmVsb2FkKFt0aGlzXSwgcXVlcnlPclNwZWMsIG9wdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uc2hpcE5hbWUgLSBSZWxhdGlvbnNoaXAgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gLSBMb2FkZWQgcmVsYXRpb25zaGlwIHZhbHVlLlxuICAgKi9cbiAgYXN5bmMgcmVsYXRpb25zaGlwT3JMb2FkKHJlbGF0aW9uc2hpcE5hbWUpIHtcbiAgICBjb25zdCByZWxhdGlvbnNoaXAgPSB0aGlzLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShyZWxhdGlvbnNoaXBOYW1lKVxuXG4gICAgaWYgKHJlbGF0aW9uc2hpcC5nZXRQcmVsb2FkZWQoKSkge1xuICAgICAgcmV0dXJuIHJlbGF0aW9uc2hpcC5sb2FkZWQoKVxuICAgIH1cblxuICAgIGNvbnN0IGJhdGNoZWQgPSBhd2FpdCB0aGlzLl90cnlDb2hvcnRQcmVsb2FkKHJlbGF0aW9uc2hpcE5hbWUpXG5cbiAgICBpZiAoYmF0Y2hlZCkgcmV0dXJuIHJlbGF0aW9uc2hpcC5sb2FkZWQoKVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMubG9hZFJlbGF0aW9uc2hpcChyZWxhdGlvbnNoaXBOYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHRzIHRvIGJhdGNoLWxvYWQgYHJlbGF0aW9uc2hpcE5hbWVgIGFjcm9zcyBjb2hvcnQgc2libGluZ3MgdmlhIGFcbiAgICogc2luZ2xlIGBwcmVsb2FkKFtuYW1lXSkud2hlcmUoe3BrOiBbaWRzXX0pLnRvQXJyYXkoKWAgcmVxdWVzdCwgdGhlbiBjb3BpZXNcbiAgICogdGhlIHByZWxvYWRlZCByZWxhdGlvbnNoaXAgc3RhdGUgb250byBlYWNoIHNpYmxpbmcuIFJldHVybnMgdHJ1ZSB3aGVuIGFcbiAgICogYmF0Y2ggcmFuLCBmYWxzZSB3aGVuIGF1dG9sb2FkIGlzIG9mZiwgdGhlcmUgaXMgbm8gY29ob3J0LCBvciBubyBiYXRjaFxuICAgKiBjYW5kaWRhdGVzIHJlbWFpbi4gU2libGluZ3Mgd2hvc2UgcmVsYXRpb25zaGlwIHN0YXRlIGlzIGFscmVhZHkgc2V0XG4gICAqIChwcmVsb2FkZWQgb3IgbG9jYWxseSBtYW5pcHVsYXRlZCB2aWEgYGJ1aWxkYCAvIGBzZXRSZWxhdGlvbnNoaXBgKSBhcmVcbiAgICogc2tpcHBlZCBzbyB0aGVpciBjYWNoZWQvZWRpdGVkIHZhbHVlIGlzIHByZXNlcnZlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uc2hpcE5hbWUgLSBSZWxhdGlvbnNoaXAgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciBhIGNvaG9ydCBiYXRjaCBwcmVsb2FkIHJhbi5cbiAgICovXG4gIGFzeW5jIF90cnlDb2hvcnRQcmVsb2FkKHJlbGF0aW9uc2hpcE5hbWUpIHtcbiAgICBpZiAoIUZyb250ZW5kTW9kZWxCYXNlLmdldEF1dG9sb2FkKCkpIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSAqLyAodGhpcy5jb25zdHJ1Y3RvcilcbiAgICBjb25zdCBjb2hvcnQgPSB0aGlzLl9sb2FkQ29ob3J0XG5cbiAgICBpZiAoIWNvaG9ydCB8fCBjb2hvcnQubGVuZ3RoIDw9IDEpIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3QgZGVmaW5pdGlvbiA9IE1vZGVsQ2xhc3MucmVsYXRpb25zaGlwRGVmaW5pdGlvbihyZWxhdGlvbnNoaXBOYW1lKVxuXG4gICAgaWYgKCFkZWZpbml0aW9uKSByZXR1cm4gZmFsc2VcbiAgICBpZiAoZGVmaW5pdGlvbi5hdXRvbG9hZCA9PT0gZmFsc2UpIHJldHVybiBmYWxzZVxuXG4gICAgLyoqIEB0eXBlIHtBcnJheTxGcm9udGVuZE1vZGVsQmFzZT59ICovXG4gICAgY29uc3QgYmF0Y2ggPSBbXVxuXG4gICAgLy8gRXhhY3Qgc2FtZSBjbGFzcywgcGVyc2lzdGVkLCBubyBleGlzdGluZyBpbi1tZW1vcnkgcmVsYXRpb25zaGlwIHN0YXRlLlxuICAgIC8vIGBzZXRMb2FkZWRgIHNldHMgYF9wcmVsb2FkZWQgPSB0cnVlYCBvbiBldmVyeSBtdXRhdGlvbiBwYXRoIChwcmVsb2FkLFxuICAgIC8vIHNldFJlbGF0aW9uc2hpcCwgYnVpbGQsIGFkZFRvTG9hZGVkKSwgc28gYGdldFByZWxvYWRlZCgpYCBhbG9uZSBpcyBhXG4gICAgLy8gcmVsaWFibGUgXCJhbHJlYWR5IHRvdWNoZWRcIiBzaWduYWwgb24gdGhlIGZyb250ZW5kLlxuICAgIGZvciAoY29uc3Qgc2libGluZyBvZiBjb2hvcnQpIHtcbiAgICAgIGlmIChzaWJsaW5nLmNvbnN0cnVjdG9yICE9PSBNb2RlbENsYXNzKSBjb250aW51ZVxuICAgICAgaWYgKHNpYmxpbmcuaXNOZXdSZWNvcmQoKSkgY29udGludWVcblxuICAgICAgY29uc3Qgc2libGluZ1JlbGF0aW9uc2hpcCA9IHNpYmxpbmcuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKHJlbGF0aW9uc2hpcE5hbWUpXG5cbiAgICAgIGlmIChzaWJsaW5nUmVsYXRpb25zaGlwLmdldFByZWxvYWRlZCgpKSBjb250aW51ZVxuXG4gICAgICBiYXRjaC5wdXNoKHNpYmxpbmcpXG4gICAgfVxuXG4gICAgaWYgKGJhdGNoLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCBwcmltYXJ5S2V5ID0gTW9kZWxDbGFzcy5wcmltYXJ5S2V5KClcbiAgICBjb25zdCBiYXRjaElkcyA9IGJhdGNoLm1hcCgoc2libGluZykgPT4gc2libGluZy5wcmltYXJ5S2V5VmFsdWUoKSlcbiAgICBjb25zdCByZWxvYWRlZEJhdGNoID0gYXdhaXQgTW9kZWxDbGFzc1xuICAgICAgLnByZWxvYWQoW3JlbGF0aW9uc2hpcE5hbWVdKVxuICAgICAgLndoZXJlKHtbcHJpbWFyeUtleV06IGJhdGNoSWRzfSlcbiAgICAgIC50b0FycmF5KClcblxuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgRnJvbnRlbmRNb2RlbEJhc2U+fSAqL1xuICAgIGNvbnN0IHJlbG9hZGVkQnlJZCA9IG5ldyBNYXAoKVxuXG4gICAgZm9yIChjb25zdCByZWxvYWRlZCBvZiByZWxvYWRlZEJhdGNoKSB7XG4gICAgICByZWxvYWRlZEJ5SWQuc2V0KFN0cmluZyhyZWxvYWRlZC5wcmltYXJ5S2V5VmFsdWUoKSksIHJlbG9hZGVkKVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc2libGluZyBvZiBiYXRjaCkge1xuICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHNpYmxpbmcucHJpbWFyeUtleVZhbHVlKCkpXG4gICAgICBjb25zdCByZWxvYWRlZCA9IHJlbG9hZGVkQnlJZC5nZXQoa2V5KVxuXG4gICAgICBpZiAoIXJlbG9hZGVkKSBjb250aW51ZVxuXG4gICAgICBjb25zdCByZWxvYWRlZFZhbHVlID0gcmVsb2FkZWQuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKHJlbGF0aW9uc2hpcE5hbWUpLmxvYWRlZCgpXG5cbiAgICAgIHNpYmxpbmcuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKHJlbGF0aW9uc2hpcE5hbWUpLnNldExvYWRlZChyZWxvYWRlZFZhbHVlKVxuICAgIH1cblxuICAgIC8vIElmIHRoZSBjYWxsZXIgaXRzZWxmIHdhcyBub3QgcG9wdWxhdGVkIChyZWNvcmQgZGVsZXRlZC9maWx0ZXJlZCBiZXR3ZWVuXG4gICAgLy8gdGhlIGxpc3QgZmV0Y2ggYW5kIHRoaXMgcHJlbG9hZCByZXF1ZXN0KSwgZmFsbCBiYWNrIHRvIHBlci1yZWNvcmQgbG9hZFxuICAgIC8vIHNvIHRoZSBjYWxsZXIgZ2V0cyBhIHJlYWwgbm90LWZvdW5kIGVycm9yIGluc3RlYWQgb2YgYSBtaXNsZWFkaW5nXG4gICAgLy8gXCJoYXNuJ3QgYmVlbiBwcmVsb2FkZWRcIiB0aHJvdyBmcm9tIGxvYWRlZCgpLlxuICAgIGlmICghdGhpcy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUocmVsYXRpb25zaGlwTmFtZSkuZ2V0UHJlbG9hZGVkKCkpIHJldHVybiBmYWxzZVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25zaGlwTmFtZSAtIFJlbGF0aW9uc2hpcCBuYW1lLlxuICAgKiBAcGFyYW0ge2FueX0gcmVsYXRpb25zaGlwVmFsdWUgLSBSZWxhdGlvbnNoaXAgdmFsdWUuXG4gICAqIEByZXR1cm5zIHthbnl9IC0gQXNzaWduZWQgcmVsYXRpb25zaGlwIHZhbHVlLlxuICAgKi9cbiAgc2V0UmVsYXRpb25zaGlwKHJlbGF0aW9uc2hpcE5hbWUsIHJlbGF0aW9uc2hpcFZhbHVlKSB7XG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSAqLyAodGhpcy5jb25zdHJ1Y3RvcilcbiAgICBjb25zdCByZWxhdGlvbnNoaXBEZWZpbml0aW9uID0gTW9kZWxDbGFzcy5yZWxhdGlvbnNoaXBEZWZpbml0aW9uKHJlbGF0aW9uc2hpcE5hbWUpXG5cbiAgICBpZiAoIXJlbGF0aW9uc2hpcERlZmluaXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biByZWxhdGlvbnNoaXA6ICR7TW9kZWxDbGFzcy5uYW1lfSMke3JlbGF0aW9uc2hpcE5hbWV9YClcbiAgICB9XG5cbiAgICBpZiAocmVsYXRpb25zaGlwVHlwZUlzQ29sbGVjdGlvbihyZWxhdGlvbnNoaXBEZWZpbml0aW9uLnR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBzZXQgaGFzLW1hbnkgcmVsYXRpb25zaGlwIHdpdGggc2V0UmVsYXRpb25zaGlwKCk6ICR7TW9kZWxDbGFzcy5uYW1lfSMke3JlbGF0aW9uc2hpcE5hbWV9YClcbiAgICB9XG5cbiAgICB0aGlzLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShyZWxhdGlvbnNoaXBOYW1lKS5zZXRMb2FkZWQocmVsYXRpb25zaGlwVmFsdWUpXG5cbiAgICByZXR1cm4gcmVsYXRpb25zaGlwVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGF0dHJpYnV0ZXMgLSBBdHRyaWJ1dGVzIHRvIGFzc2lnbi5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgYXNzaWduQXR0cmlidXRlcyhhdHRyaWJ1dGVzKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gYXR0cmlidXRlcykge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoa2V5LCBhdHRyaWJ1dGVzW2tleV0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIENsZWFycyBjYWNoZWQgcmVsYXRpb25zaGlwIHN0YXRlLlxuICAgKi9cbiAgY2xlYXJSZWxhdGlvbnNoaXBDYWNoZSgpIHtcbiAgICB0aGlzLl9yZWxhdGlvbnNoaXBzID0ge31cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFByaW1hcnkga2V5IG5hbWUuXG4gICAqL1xuICBzdGF0aWMgcHJpbWFyeUtleSgpIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZUNvbmZpZygpLnByaW1hcnlLZXkgfHwgXCJpZFwiXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge251bWJlciB8IHN0cmluZ30gLSBQcmltYXJ5IGtleSB2YWx1ZS5cbiAgICovXG4gIHByaW1hcnlLZXlWYWx1ZSgpIHtcbiAgICBjb25zdCBNb2RlbENsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9ICovICh0aGlzLmNvbnN0cnVjdG9yKVxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZWFkQXR0cmlidXRlKE1vZGVsQ2xhc3MucHJpbWFyeUtleSgpKVxuXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBwcmltYXJ5IGtleSAnJHtNb2RlbENsYXNzLnByaW1hcnlLZXkoKX0nIG9uICR7TW9kZWxDbGFzcy5uYW1lfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWUgLSBBdHRyaWJ1dGUgbmFtZS5cbiAgICogQHJldHVybnMge2FueX0gLSBBdHRyaWJ1dGUgdmFsdWUuXG4gICAqL1xuICByZWFkQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBpZiAodGhpcy5fc2VsZWN0ZWRBdHRyaWJ1dGVzICYmICF0aGlzLl9zZWxlY3RlZEF0dHJpYnV0ZXMuaGFzKGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgQXR0cmlidXRlTm90U2VsZWN0ZWRFcnJvcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUsIGF0dHJpYnV0ZU5hbWUpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2F0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGFuIGF0dHJpYnV0ZSB2YWx1ZSBpcyBjdXJyZW50bHkgbG9hZGVkIG9uIHRoaXMgcmVjb3JkLiBVc2VkIGJ5IHRoZVxuICAgKiBwcmVsb2FkZXIgdG8gZGVjaWRlIHdoZXRoZXIgYSByZWxhdGlvbnNoaXAgY2FuIGJlIHNraXBwZWQgYmVjYXVzZSB0aGVcbiAgICogcmVxdWVzdGVkIGNvbHVtbnMgYXJlIGFscmVhZHkgcHJlc2VudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWUgLSBBdHRyaWJ1dGUgbmFtZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgYXR0cmlidXRlIGlzIGxvYWRlZC5cbiAgICovXG4gIGhhc0xvYWRlZEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSB7XG4gICAgaWYgKCF0aGlzLl9zZWxlY3RlZEF0dHJpYnV0ZXMpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRBdHRyaWJ1dGVzLmhhcyhhdHRyaWJ1dGVOYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgYW4gYXNzb2NpYXRpb24gY291bnQgYXR0YWNoZWQgYnkgYC53aXRoQ291bnQoLi4uKWAuIENvdW50c1xuICAgKiBsaXZlIG9uIGEgZGVkaWNhdGVkIG1hcCBzZXBhcmF0ZSBmcm9tIHRoZSByZWNvcmQncyBhdHRyaWJ1dGVzIHNvXG4gICAqIGEgdmlydHVhbCBjb3VudCBsaWtlIGB0YXNrc0NvdW50YCBjYW4ndCBzaWxlbnRseSBzaGFkb3cgYSByZWFsXG4gICAqIGNvbHVtbiBvZiB0aGUgc2FtZSBuYW1lLiBSZXR1cm5zIHRoZSBhdHRhY2hlZCB2YWx1ZSwgb3IgMCB3aGVuXG4gICAqIGAud2l0aENvdW50KC4uLilgIHdhc24ndCByZXF1ZXN0ZWQgZm9yIHRoaXMgYXR0cmlidXRlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZSAtIEF0dHJpYnV0ZSBuYW1lLCBlLmcuIGBcInRhc2tzQ291bnRcImAgb3IgYSBjdXN0b20gbmFtZSBmcm9tIGAud2l0aENvdW50KHtjdXN0b21OYW1lOiB7Li4ufX0pYC5cbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIHJlYWRDb3VudChhdHRyaWJ1dGVOYW1lKSB7XG4gICAgaWYgKCF0aGlzLl9hc3NvY2lhdGlvbkNvdW50cykgcmV0dXJuIDBcbiAgICBpZiAoIXRoaXMuX2Fzc29jaWF0aW9uQ291bnRzLmhhcyhhdHRyaWJ1dGVOYW1lKSkgcmV0dXJuIDBcblxuICAgIHJldHVybiAvKiogQHR5cGUge251bWJlcn0gKi8gKHRoaXMuX2Fzc29jaWF0aW9uQ291bnRzLmdldChhdHRyaWJ1dGVOYW1lKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBzZXR0ZXIgY2FsbGVkIGJ5IGBpbnN0YW50aWF0ZUZyb21SZXNwb25zZWAgd2hlbiBoeWRyYXRpbmdcbiAgICogYXNzb2NpYXRpb24gY291bnRzIHRoYXQgcm9kZSBhbG9uZyB3aXRoIHRoZSByZWNvcmQgcGF5bG9hZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWUgLSBBdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gQ291bnQgdmFsdWUuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX3NldEFzc29jaWF0aW9uQ291bnQoYXR0cmlidXRlTmFtZSwgdmFsdWUpIHtcbiAgICBpZiAoIXRoaXMuX2Fzc29jaWF0aW9uQ291bnRzKSB7XG4gICAgICAvKiogQHR5cGUge01hcDxzdHJpbmcsIG51bWJlcj59ICovXG4gICAgICB0aGlzLl9hc3NvY2lhdGlvbkNvdW50cyA9IG5ldyBNYXAoKVxuICAgIH1cblxuICAgIHRoaXMuX2Fzc29jaWF0aW9uQ291bnRzLnNldChhdHRyaWJ1dGVOYW1lLCB2YWx1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIGEgcGVyLXJlY29yZCBhYmlsaXR5IHJlc3VsdCBhdHRhY2hlZCBieSBgLmFiaWxpdGllcyguLi4pYC4gVGhlXG4gICAqIGJhY2tlbmQgZXZhbHVhdGVzIGVhY2ggcmVxdWVzdGVkIGFjdGlvbiBhZ2FpbnN0IHRoZSBjdXJyZW50XG4gICAqIGFiaWxpdHkgZm9yIHRoaXMgcmVjb3JkIGluc3RhbmNlIGFuZCBzaGlwcyB0aGUgcmVzdWx0IGFsb25nc2lkZVxuICAgKiB0aGUgcmVjb3JkJ3MgYXR0cmlidXRlcy4gUmV0dXJucyBgZmFsc2VgIHdoZW4gdGhlIGFjdGlvbiB3YXNuJ3RcbiAgICogcmVxdWVzdGVkIChvciB0aGUgYWJpbGl0eSBkZW5pZWQgaXQpLCBzbyBVSSBjb2RlIGNhbiBzYWZlbHkgYnJhbmNoXG4gICAqIG9uIGByZWNvcmQuY2FuKFwidXBkYXRlXCIpYCB3aXRob3V0IGZpcnN0IGNoZWNraW5nIHdoZXRoZXIgdGhlXG4gICAqIGFiaWxpdHkgd2FzIGxvYWRlZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbiAtIEFiaWxpdHkgYWN0aW9uIG5hbWUsIGUuZy4gYFwidXBkYXRlXCJgLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGNhbihhY3Rpb24pIHtcbiAgICBpZiAoIXRoaXMuX2NvbXB1dGVkQWJpbGl0aWVzKSByZXR1cm4gZmFsc2VcbiAgICBpZiAoIXRoaXMuX2NvbXB1dGVkQWJpbGl0aWVzLmhhcyhhY3Rpb24pKSByZXR1cm4gZmFsc2VcblxuICAgIHJldHVybiBCb29sZWFuKHRoaXMuX2NvbXB1dGVkQWJpbGl0aWVzLmdldChhY3Rpb24pKVxuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIHNldHRlciBjYWxsZWQgYnkgYGluc3RhbnRpYXRlRnJvbVJlc3BvbnNlYCB3aGVuIGh5ZHJhdGluZ1xuICAgKiBwZXItcmVjb3JkIGFiaWxpdHkgcmVzdWx0cyB0aGF0IHJvZGUgYWxvbmcgd2l0aCB0aGUgcmVjb3JkXG4gICAqIHBheWxvYWQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb24gLSBBYmlsaXR5IGFjdGlvbiBuYW1lLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIC0gV2hldGhlciB0aGUgY3VycmVudCBhYmlsaXR5IHBlcm1pdHMgdGhlIGFjdGlvbiBvbiB0aGlzIHJlY29yZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfc2V0Q29tcHV0ZWRBYmlsaXR5KGFjdGlvbiwgdmFsdWUpIHtcbiAgICBpZiAoIXRoaXMuX2NvbXB1dGVkQWJpbGl0aWVzKSB7XG4gICAgICAvKiogQHR5cGUge01hcDxzdHJpbmcsIGJvb2xlYW4+fSAqL1xuICAgICAgdGhpcy5fY29tcHV0ZWRBYmlsaXRpZXMgPSBuZXcgTWFwKClcbiAgICB9XG5cbiAgICB0aGlzLl9jb21wdXRlZEFiaWxpdGllcy5zZXQoYWN0aW9uLCBCb29sZWFuKHZhbHVlKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIGEgY29uc3VtZXItZGVmaW5lZCB2YWx1ZSBhdHRhY2hlZCBieSBgLnF1ZXJ5RGF0YSguLi4pYC4gU3RvcmVkXG4gICAqIG9uIGEgZGVkaWNhdGVkIG1hcCByYXRoZXIgdGhhbiBgX2F0dHJpYnV0ZXNgLCBzbyBhIHZpcnR1YWwgYWxpYXNcbiAgICogbGlrZSBgdGFza3NDb3VudGAgY2Fubm90IHNpbGVudGx5IHNoYWRvdyBhIHJlYWwgY29sdW1uIG9mIHRoZSBzYW1lXG4gICAqIG5hbWUuIFJldHVybnMgYG51bGxgIHdoZW4gbm8gcmVnaXN0ZXJlZCBmbiBwcm9kdWNlZCB0aGF0IGFsaWFzIGZvclxuICAgKiB0aGlzIHJlY29yZCAoZS5nLiBubyBjaGlsZCByb3dzIG1hdGNoZWQgdGhlIGFnZ3JlZ2F0ZSkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gcXVlcnlEYXRhIGFsaWFzIG5hbWUuXG4gICAqIEByZXR1cm5zIHt1bmtub3dufVxuICAgKi9cbiAgcXVlcnlEYXRhKG5hbWUpIHtcbiAgICBpZiAoIXRoaXMuX3F1ZXJ5RGF0YVZhbHVlcykgcmV0dXJuIG51bGxcbiAgICBpZiAoIXRoaXMuX3F1ZXJ5RGF0YVZhbHVlcy5oYXMobmFtZSkpIHJldHVybiBudWxsXG5cbiAgICByZXR1cm4gdGhpcy5fcXVlcnlEYXRhVmFsdWVzLmdldChuYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIHNldHRlciB1c2VkIGJ5IGBpbnN0YW50aWF0ZUZyb21SZXNwb25zZWAgd2hlbiBoeWRyYXRpbmdcbiAgICogcXVlcnlEYXRhIHZhbHVlcyB0aGF0IHJvZGUgYWxvbmcgd2l0aCB0aGUgcmVjb3JkIHBheWxvYWQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gcXVlcnlEYXRhIGFsaWFzIG5hbWUuXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBBdHRhY2hlZCB2YWx1ZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfc2V0UXVlcnlEYXRhKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKCF0aGlzLl9xdWVyeURhdGFWYWx1ZXMpIHtcbiAgICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgdW5rbm93bj59ICovXG4gICAgICB0aGlzLl9xdWVyeURhdGFWYWx1ZXMgPSBuZXcgTWFwKClcbiAgICB9XG5cbiAgICB0aGlzLl9xdWVyeURhdGFWYWx1ZXMuc2V0KG5hbWUsIHZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lIC0gQXR0cmlidXRlIG5hbWUuXG4gICAqIEBwYXJhbSB7YW55fSBuZXdWYWx1ZSAtIE5ldyB2YWx1ZS5cbiAgICogQHJldHVybnMge2FueX0gLSBBc3NpZ25lZCB2YWx1ZS5cbiAgICovXG4gIHNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBuZXdWYWx1ZSkge1xuICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSB0aGlzLl9hdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdXG5cbiAgICB0aGlzLl9hdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdID0gbmV3VmFsdWVcblxuICAgIGlmICh0aGlzLl9zZWxlY3RlZEF0dHJpYnV0ZXMpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkQXR0cmlidXRlcy5hZGQoYXR0cmlidXRlTmFtZSlcbiAgICB9XG5cbiAgICAvLyBPbmx5IGludmFsaWRhdGUgcmVsYXRpb25zaGlwIGNhY2hlIGVudHJpZXMgd2hvc2UgZm9yZWlnbiBrZXkgbWF0Y2hlcyB0aGUgY2hhbmdlZCBhdHRyaWJ1dGUuXG4gICAgLy8gQmxhbmtldC1jbGVhcmluZyBhbGwgcmVsYXRpb25zaGlwcyBvbiBhbnkgYXR0cmlidXRlIGNoYW5nZSBkZXN0cm95cyBuZXN0ZWQtc2F2ZSBzdGF0ZVxuICAgIC8vIGFuZCBwcmVsb2FkZWQgY2hpbGRyZW4gdGhlIGNhbGxlciBuZXZlciBhc2tlZCB0byBpbnZhbGlkYXRlLlxuICAgIGlmICghT2JqZWN0LmlzKHByZXZpb3VzVmFsdWUsIG5ld1ZhbHVlKSkge1xuICAgICAgdGhpcy5faW52YWxpZGF0ZVJlbGF0aW9uc2hpcHNGb3JBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSlcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3VmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZhbGlkYXRlcyBhbnkgY2FjaGVkIGJlbG9uZ3NUbyByZWxhdGlvbnNoaXAgd2hvc2UgZm9yZWlnbiBrZXkgbWF0Y2hlcyB0aGVcbiAgICogY2hhbmdlZCBhdHRyaWJ1dGUuIEhhc01hbnkgLyBoYXNPbmUgcmVsYXRpb25zaGlwcyBhcmUgbGVmdCB1bnRvdWNoZWQgYmVjYXVzZVxuICAgKiB0aGVpciBmb3JlaWduIGtleSBsaXZlcyBvbiB0aGUgY2hpbGQsIG5vdCBvbiB0aGlzIG1vZGVsLCBhbmQgYmxhbmtldC1jbGVhcmluZ1xuICAgKiB0aGVtIHdvdWxkIGRlc3Ryb3kgbmVzdGVkLXNhdmUgc3RhdGUgYW5kIHByZWxvYWRlZCBjaGlsZHJlbiB0aGUgY2FsbGVyIG5ldmVyXG4gICAqIGFza2VkIHRvIGludmFsaWRhdGUuXG4gICAqXG4gICAqIEZvcmVpZ24ga2V5cyBhcmUgaW5mZXJyZWQgd2hlbiBub3QgZGVjbGFyZWQ6IGZvciBiZWxvbmdzVG8gYHByb2plY3RJZGAgaXNcbiAgICogaW5mZXJyZWQgZnJvbSByZWxhdGlvbnNoaXAgbmFtZSBgcHJvamVjdGAuIEV4cGxpY2l0IGBmb3JlaWduS2V5YCBvbiB0aGVcbiAgICogcmVsYXRpb25zaGlwIGRlZmluaXRpb24gdGFrZXMgcHJlY2VkZW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWUgLSBBdHRyaWJ1dGUgbmFtZSB0aGF0IGNoYW5nZWQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX2ludmFsaWRhdGVSZWxhdGlvbnNoaXBzRm9yQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBpZiAoIXRoaXMuX3JlbGF0aW9uc2hpcHMgfHwgT2JqZWN0LmtleXModGhpcy5fcmVsYXRpb25zaGlwcykubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gKi8gKHRoaXMuY29uc3RydWN0b3IpXG4gICAgY29uc3QgZGVmaW5pdGlvbnMgPSB0eXBlb2YgTW9kZWxDbGFzcy5yZWxhdGlvbnNoaXBEZWZpbml0aW9ucyA9PT0gXCJmdW5jdGlvblwiID8gTW9kZWxDbGFzcy5yZWxhdGlvbnNoaXBEZWZpbml0aW9ucygpIDoge31cblxuICAgIGZvciAoY29uc3QgcmVsYXRpb25zaGlwTmFtZSBvZiBPYmplY3Qua2V5cyh0aGlzLl9yZWxhdGlvbnNoaXBzKSkge1xuICAgICAgY29uc3QgZGVmaW5pdGlvbiA9IC8qKiBAdHlwZSB7YW55fSAqLyAoZGVmaW5pdGlvbnNbcmVsYXRpb25zaGlwTmFtZV0pXG5cbiAgICAgIGlmICghZGVmaW5pdGlvbiB8fCBkZWZpbml0aW9uLnR5cGUgIT09IFwiYmVsb25nc1RvXCIpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IGZvcmVpZ25LZXkgPSBkZWZpbml0aW9uLmZvcmVpZ25LZXkgfHwgYCR7cmVsYXRpb25zaGlwTmFtZX1JZGBcblxuICAgICAgaWYgKGZvcmVpZ25LZXkgPT09IGF0dHJpYnV0ZU5hbWUpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3JlbGF0aW9uc2hpcHNbcmVsYXRpb25zaGlwTmFtZV1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBEZXJpdmVkIHJlc291cmNlIHBhdGguXG4gICAqL1xuICBzdGF0aWMgcmVzb3VyY2VQYXRoKCkge1xuICAgIHJldHVybiB2YWxpZGF0ZUZyb250ZW5kTW9kZWxSZXNvdXJjZVBhdGgoe1xuICAgICAgbW9kZWxOYW1lOiB0aGlzLmdldE1vZGVsTmFtZSgpLFxuICAgICAgcmVzb3VyY2VQYXRoOiBkZWZhdWx0RnJvbnRlbmRNb2RlbFJlc291cmNlUGF0aCh0aGlzKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHBhcmFtIHtGcm9udGVuZE1vZGVsQ29tbWFuZFR5cGV9IGNvbW1hbmRUeXBlIC0gQ29tbWFuZCB0eXBlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFJlc29sdmVkIGNvbW1hbmQgbmFtZS5cbiAgICovXG4gIHN0YXRpYyBjb21tYW5kTmFtZShjb21tYW5kVHlwZSkge1xuICAgIGNvbnN0IHJlc291cmNlQ29uZmlnID0gdGhpcy5yZXNvdXJjZUNvbmZpZygpXG4gICAgY29uc3QgYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kcyA9IHJlc291cmNlQ29uZmlnLmJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHMgfHwgW11cbiAgICBjb25zdCBidWlsdEluTWVtYmVyQ29tbWFuZHMgPSByZXNvdXJjZUNvbmZpZy5idWlsdEluTWVtYmVyQ29tbWFuZHMgfHwgW11cbiAgICBjb25zdCBjb21tYW5kcyA9IHJlc291cmNlQ29uZmlnLmNvbW1hbmRzIHx8IFtdXG4gICAgY29uc3QgaXNFeHBvc2VkID0gYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kcy5pbmNsdWRlcyhjb21tYW5kVHlwZSkgfHwgYnVpbHRJbk1lbWJlckNvbW1hbmRzLmluY2x1ZGVzKGNvbW1hbmRUeXBlKSB8fCBjb21tYW5kcy5pbmNsdWRlcyhjb21tYW5kVHlwZSlcbiAgICBjb25zdCBjb21tYW5kTmFtZSA9IGlzRXhwb3NlZCA/IGluZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZShjb21tYW5kVHlwZSkpIDogY29tbWFuZFR5cGVcblxuICAgIHJldHVybiB2YWxpZGF0ZUZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbW1hbmROYW1lKHtcbiAgICAgIGNvbW1hbmROYW1lLFxuICAgICAgY29tbWFuZFR5cGUsXG4gICAgICBtb2RlbE5hbWU6IHRoaXMuZ2V0TW9kZWxOYW1lKClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9XG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBDb21tYW5kIGFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59IC0gQ29tbWFuZCBwYXlsb2FkLlxuICAgKi9cbiAgc3RhdGljIG5vcm1hbGl6ZUN1c3RvbUNvbW1hbmRQYXlsb2FkQXJndW1lbnRzKGFyZ3MpIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHJldHVybiB7fVxuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgcGF5bG9hZCA9IGFyZ3NbMF1cbiAgICAgIGlmIChwYXlsb2FkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgcGF5bG9hZCAhPT0gXCJvYmplY3RcIiB8fCBwYXlsb2FkID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB7YXJnMTogcGF5bG9hZH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi8gKHBheWxvYWQpXG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmcgfCBhbnlbXT59ICovXG4gICAgY29uc3QgcGF5bG9hZCA9IHt9XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYXJncy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIHBheWxvYWRbYGFyZyR7aW5kZXggKyAxfWBdID0gYXJnc1tpbmRleF1cbiAgICB9XG5cbiAgICByZXR1cm4gcGF5bG9hZFxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG1vZGVsIG5hbWUsIHByZWZlcnJpbmcgYW4gZXhwbGljaXQgYHN0YXRpYyBtb2RlbE5hbWVgIGRlY2xhcmF0aW9uXG4gICAqIG92ZXIgdGhlIEphdmFTY3JpcHQgY2xhc3MgYC5uYW1lYCBwcm9wZXJ0eS4gVGhpcyBhbGxvd3MgbWluaWZpZWQgYnVpbGRzIHRvXG4gICAqIHByZXNlcnZlIGNvcnJlY3QgbW9kZWwgbmFtZXMgd2l0aG91dCByZWx5aW5nIG9uIGBrZWVwX2NsYXNzbmFtZXNgLlxuICAgKiBAdGhpcyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBtb2RlbCBuYW1lLlxuICAgKi9cbiAgc3RhdGljIGdldE1vZGVsTmFtZSgpIHtcbiAgICBjb25zdCByZXNvdXJjZUNvbmZpZyA9IHR5cGVvZiB0aGlzLnJlc291cmNlQ29uZmlnID09PSBcImZ1bmN0aW9uXCIgPyB0aGlzLnJlc291cmNlQ29uZmlnKCkgOiBudWxsXG4gICAgY29uc3QgbW9kZWxOYW1lID0gcmVzb3VyY2VDb25maWc/Lm1vZGVsTmFtZVxuXG4gICAgcmV0dXJuICh0eXBlb2YgbW9kZWxOYW1lID09PSBcInN0cmluZ1wiICYmIG1vZGVsTmFtZS5sZW5ndGggPiAwKSA/IG1vZGVsTmFtZSA6IHRoaXMubmFtZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRNb2RlbFRyYW5zcG9ydENvbmZpZ30gY29uZmlnIC0gRnJvbnRlbmQgbW9kZWwgdHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24uXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHN0YXRpYyBjb25maWd1cmVUcmFuc3BvcnQoY29uZmlnKSB7XG4gICAgaWYgKCFjb25maWcgfHwgdHlwZW9mIGNvbmZpZyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIFwidXJsXCIpKSB7XG4gICAgICBmcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnLnVybCA9IGNvbmZpZy51cmxcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgXCJzaGFyZWRcIikpIHtcbiAgICAgIGZyb250ZW5kTW9kZWxUcmFuc3BvcnRDb25maWcuc2hhcmVkID0gY29uZmlnLnNoYXJlZFxuICAgIH1cblxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBcIndlYnNvY2tldENsaWVudFwiKSkge1xuICAgICAgZnJvbnRlbmRNb2RlbFRyYW5zcG9ydENvbmZpZy53ZWJzb2NrZXRDbGllbnQgPSBjb25maWcud2Vic29ja2V0Q2xpZW50XG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIFwid2Vic29ja2V0VXJsXCIpKSB7XG4gICAgICBmcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnLndlYnNvY2tldFVybCA9IGNvbmZpZy53ZWJzb2NrZXRVcmxcbiAgICAgIC8vIFJlc2V0IGNhY2hlZCBpbnRlcm5hbCBjbGllbnQgc28gdGhlIG5ldyBVUkwgdGFrZXMgZWZmZWN0IG9uIG5leHQgc3Vic2NyaWJlXG4gICAgICBpbnRlcm5hbFdlYnNvY2tldENsaWVudCA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgXCJyZXF1ZXN0SGVhZGVyc1wiKSkge1xuICAgICAgZnJvbnRlbmRNb2RlbFRyYW5zcG9ydENvbmZpZy5yZXF1ZXN0SGVhZGVycyA9IGNvbmZpZy5yZXF1ZXN0SGVhZGVyc1xuICAgIH1cblxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBcInNlc3Npb25TdG9yZVwiKSkge1xuICAgICAgZnJvbnRlbmRNb2RlbFRyYW5zcG9ydENvbmZpZy5zZXNzaW9uU3RvcmUgPSBjb25maWcuc2Vzc2lvblN0b3JlXG4gICAgICAvLyBSZXNldCBjYWNoZWQgaW50ZXJuYWwgY2xpZW50IHNvIHRoZSBuZXcgc2Vzc2lvblN0b3JlIGlzIHBpY2tlZCB1cC5cbiAgICAgIGludGVybmFsV2Vic29ja2V0Q2xpZW50ID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb25uZWN0IHRoZSBpbnRlcm5hbCBXZWJTb2NrZXQgYW5kIGVuYWJsZSBhdXRvLXJlY29ubmVjdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb25uZWN0ZWQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgY29ubmVjdFdlYnNvY2tldCgpIHtcbiAgICBjb25zdCBjbGllbnQgPSByZXNvbHZlSW50ZXJuYWxXZWJzb2NrZXRDbGllbnQoKVxuXG4gICAgaWYgKCFjbGllbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImNvbm5lY3RXZWJzb2NrZXQgcmVxdWlyZXMgY29uZmlndXJlVHJhbnNwb3J0KHt3ZWJzb2NrZXRVcmx9KVwiKVxuICAgIH1cblxuICAgIGF3YWl0IGNsaWVudC5jb25uZWN0KClcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNjb25uZWN0IHRoZSBpbnRlcm5hbCBXZWJTb2NrZXQgYW5kIGRpc2FibGUgYXV0by1yZWNvbm5lY3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY2xvc2VkLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGRpc2Nvbm5lY3RXZWJzb2NrZXQoKSB7XG4gICAgaWYgKCFpbnRlcm5hbFdlYnNvY2tldENsaWVudCkgcmV0dXJuXG5cbiAgICBhd2FpdCBpbnRlcm5hbFdlYnNvY2tldENsaWVudC5kaXNjb25uZWN0QW5kU3RvcFJlY29ubmVjdCgpXG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgdW50aWwgcXVldWVkIGFuZCBhY3RpdmUgZnJvbnRlbmQtbW9kZWwgdHJhbnNwb3J0IHJlcXVlc3RzIGZpbmlzaC5cbiAgICogQHBhcmFtIHtGcm9udGVuZE1vZGVsSWRsZVdhaXRBcmdzfSBbYXJnc10gLSBXYWl0IG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gdHJhbnNwb3J0IGlzIGlkbGUuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgd2FpdEZvcklkbGUoYXJncyA9IHt9KSB7XG4gICAgY29uc3Qge3F1aWV0TXMgPSAwLCB0aW1lb3V0OiB0aW1lb3V0TXMgPSA1MDAwLCAuLi5yZXN0QXJnc30gPSBhcmdzXG4gICAgY29uc3QgcmVzdEFyZ0tleXMgPSBPYmplY3Qua2V5cyhyZXN0QXJncylcblxuICAgIGlmIChyZXN0QXJnS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gd2FpdEZvcklkbGUgYXJnczogJHtyZXN0QXJnS2V5cy5qb2luKFwiLCBcIil9YClcbiAgICB9XG5cbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShxdWlldE1zKSB8fCBxdWlldE1zIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCB3YWl0Rm9ySWRsZSBxdWlldE1zIHRvIGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlciwgZ290OiAke3F1aWV0TXN9YClcbiAgICB9XG5cbiAgICBhd2FpdCB0aW1lb3V0KFxuICAgICAge3RpbWVvdXQ6IHRpbWVvdXRNcywgZXJyb3JNZXNzYWdlOiBcIlRpbWVkIG91dCB3YWl0aW5nIGZvciBmcm9udGVuZCBtb2RlbCB0cmFuc3BvcnQgdG8gYmVjb21lIGlkbGVcIn0sXG4gICAgICBhc3luYyAoKSA9PiBhd2FpdCB3YWl0Rm9yRnJvbnRlbmRNb2RlbFRyYW5zcG9ydElkbGUocXVpZXRNcylcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBXZWJTb2NrZXQgY29ubmVjdGlvbiBzdGF0ZS5cbiAgICogQHJldHVybnMge3tkaXNjb25uZWN0ZWRTaW5jZTogbnVtYmVyIHwgbnVsbCwgaGFzQ2xpZW50OiBib29sZWFuLCBpc09wZW46IGJvb2xlYW4sIGxpc3RlbmVyQ291bnQ6IG51bWJlcn19IC0gU25hcHNob3Qgb2YgdGhlIG1hbmFnZWQgd2Vic29ja2V0IGNvbm5lY3Rpb24gc3RhdGUuXG4gICAqL1xuICBzdGF0aWMgd2Vic29ja2V0U3RhdGUoKSB7XG4gICAgaWYgKCFpbnRlcm5hbFdlYnNvY2tldENsaWVudCkge1xuICAgICAgcmV0dXJuIHtkaXNjb25uZWN0ZWRTaW5jZTogbnVsbCwgaGFzQ2xpZW50OiBmYWxzZSwgaXNPcGVuOiBmYWxzZSwgbGlzdGVuZXJDb3VudDogMH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uaW50ZXJuYWxXZWJzb2NrZXRDbGllbnQuc3RhdGUoKSxcbiAgICAgIGhhc0NsaWVudDogdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgcmF3IFdlYlNvY2tldCB3aXRob3V0IGRpc2FibGluZyBhdXRvLXJlY29ubmVjdC4gVXNlZCBieSB0ZXN0cyB0b1xuICAgKiBzaW11bGF0ZSBhbiB1bmV4cGVjdGVkIG5ldHdvcmsgZHJvcCBhbmQgdmVyaWZ5IHJlY29ubmVjdGlvbiBiZWhhdmlvci5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiB0aGUgc29ja2V0IGhhcyBjbG9zZWQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZHJvcFdlYnNvY2tldCgpIHtcbiAgICBpZiAoIWludGVybmFsV2Vic29ja2V0Q2xpZW50KSByZXR1cm5cblxuICAgIGF3YWl0IGludGVybmFsV2Vic29ja2V0Q2xpZW50LmRyb3BDb25uZWN0aW9uKClcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGdsb2JhbCBtZXRhZGF0YSBvbiB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24uIFNlbnQgdG8gdGhlIHNlcnZlciBpbW1lZGlhdGVseVxuICAgKiBvdmVyIFdlYlNvY2tldCBhbmQgZXhwb3NlZCB0byBXZWJTb2NrZXQtYm9ybmUgcmVxdWVzdHMgYXMgcmVxdWVzdCBtZXRhZGF0YS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIE1ldGFkYXRhIGtleS5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIC0gTWV0YWRhdGEgdmFsdWUgKG51bGwgdG8gY2xlYXIpLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBzZXRXZWJzb2NrZXRNZXRhZGF0YShrZXksIHZhbHVlKSB7XG4gICAgY29uc3QgY2xpZW50ID0gLyoqIEB0eXBlIHthbnl9ICovIChmcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnLndlYnNvY2tldENsaWVudCB8fCByZXNvbHZlSW50ZXJuYWxXZWJzb2NrZXRDbGllbnQoKSlcblxuICAgIGlmICghY2xpZW50IHx8IHR5cGVvZiBjbGllbnQuc2V0TWV0YWRhdGEgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuXG5cbiAgICBjbGllbnQuc2V0TWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyBhIG1hbmFnZWQgY29ubmVjdGlvbiB0aGF0IGF1dG8tb3BlbnMsIGF1dG8tY2xvc2VzLCBhbmRcbiAgICogYXV0by1yZWNvbm5lY3RzIGJhc2VkIG9uIGBzaG91bGRDb25uZWN0KClgIGFuZCBgcGFyYW1zKClgLlxuICAgKiBDYWxsIGBoYW5kbGUuc3luYygpYCB3aGVuZXZlciB0aGUgaW5wdXRzIHRoYXQgZHJpdmUgdGhvc2VcbiAgICogZnVuY3Rpb25zIGNoYW5nZSAoZS5nLiBjdXJyZW50LXVzZXIgc2lnbi1pbi9vdXQpLiBUaGUgaGFuZGxlXG4gICAqIHJldHJpZXMgd2hlbiB0aGUgV1MgY2xpZW50IGlzbid0IHJlYWR5IGFuZCByZW9wZW5zIG9uIGNsb3NlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29ubmVjdGlvblR5cGUgLSBDb25uZWN0aW9uIGNsYXNzIG5hbWUgcmVnaXN0ZXJlZCBvbiB0aGUgc2VydmVyLlxuICAgKiBAcGFyYW0ge3tzaG91bGRDb25uZWN0OiAoKSA9PiBib29sZWFuLCBwYXJhbXM6ICgpID0+IFJlY29yZDxzdHJpbmcsIGFueT4sIG9uTWVzc2FnZT86IChib2R5OiBhbnkpID0+IHZvaWR9fSBvcHRpb25zIC0gQ29ubmVjdGlvbiBsaWZlY3ljbGUgYW5kIHBheWxvYWQgY2FsbGJhY2tzLlxuICAgKiBAcmV0dXJucyB7e3N5bmM6ICgpID0+IHZvaWQsIGNsb3NlOiAoKSA9PiB2b2lkfX0gLSBIYW5kbGUgdXNlZCB0byByZXN5bmMgb3IgY2xvc2UgdGhlIG1hbmFnZWQgY29ubmVjdGlvbi5cbiAgICovXG4gIHN0YXRpYyBvcGVuTWFuYWdlZENvbm5lY3Rpb24oY29ubmVjdGlvblR5cGUsIG9wdGlvbnMpIHtcbiAgICAvKiogQHR5cGUge2FueX0gKi9cbiAgICBsZXQgY29ubmVjdGlvbiA9IG51bGxcbiAgICBsZXQgY2xvc2VkID0gZmFsc2VcbiAgICAvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbH0gKi9cbiAgICBsZXQgcmV0cnlUaW1lciA9IG51bGxcbiAgICBsZXQgbGFzdFBhcmFtc0pzb24gPSBcIlwiXG5cbiAgICBjb25zdCBzeW5jID0gKCkgPT4ge1xuICAgICAgaWYgKGNsb3NlZCkgcmV0dXJuXG5cbiAgICAgIGlmICghb3B0aW9ucy5zaG91bGRDb25uZWN0KCkpIHtcbiAgICAgICAgaWYgKGNvbm5lY3Rpb24gJiYgIWNvbm5lY3Rpb24uaXNDbG9zZWQoKSkgY29ubmVjdGlvbi5jbG9zZSgpXG4gICAgICAgIGNvbm5lY3Rpb24gPSBudWxsXG4gICAgICAgIGxhc3RQYXJhbXNKc29uID0gXCJcIlxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV4dFBhcmFtcyA9IG9wdGlvbnMucGFyYW1zKClcbiAgICAgIGNvbnN0IG5leHRQYXJhbXNKc29uID0gSlNPTi5zdHJpbmdpZnkobmV4dFBhcmFtcylcblxuICAgICAgLy8gQWxyZWFkeSBjb25uZWN0ZWQgd2l0aCBzYW1lIHBhcmFtcyDigJQgbm90aGluZyB0byBkby5cbiAgICAgIGlmIChjb25uZWN0aW9uICYmICFjb25uZWN0aW9uLmlzQ2xvc2VkKCkgJiYgbmV4dFBhcmFtc0pzb24gPT09IGxhc3RQYXJhbXNKc29uKSByZXR1cm5cblxuICAgICAgLy8gQ29ubmVjdGVkIGJ1dCBwYXJhbXMgY2hhbmdlZCDigJQgc2VuZCB1cGRhdGUgbWVzc2FnZS5cbiAgICAgIC8vIEd1YXJkIHdpdGggdHJ5L2NhdGNoOiB0aGUgY29ubmVjdGlvbiBoYW5kbGUgc3RheXMgbGl2ZSBkdXJpbmdcbiAgICAgIC8vIHJlY29ubmVjdCBidXQgdGhlIHVuZGVybHlpbmcgc29ja2V0IG1heSBiZSBjbG9zZWQuXG4gICAgICBpZiAoY29ubmVjdGlvbiAmJiAhY29ubmVjdGlvbi5pc0Nsb3NlZCgpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29ubmVjdGlvbi5zZW5kTWVzc2FnZShuZXh0UGFyYW1zKVxuICAgICAgICAgIGxhc3RQYXJhbXNKc29uID0gbmV4dFBhcmFtc0pzb25cbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgY29ubmVjdGlvbiA9IG51bGxcbiAgICAgICAgICBsYXN0UGFyYW1zSnNvbiA9IFwiXCJcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBXUyBjbGllbnQgbm90IHJlYWR5IOKAlCByZXRyeS4gQ2hlY2sgdGhlIGFjdHVhbCBjbGllbnQgKHdoaWNoXG4gICAgICAvLyBtYXkgYmUgYW4gaW5qZWN0ZWQgd2Vic29ja2V0Q2xpZW50KSBpbnN0ZWFkIG9mIHdlYnNvY2tldFN0YXRlKClcbiAgICAgIC8vIHdoaWNoIG9ubHkgcmVmbGVjdHMgdGhlIGludGVybmFsIGNsaWVudC5cbiAgICAgIGNvbnN0IGNsaWVudCA9IC8qKiBAdHlwZSB7YW55fSAqLyAoZnJvbnRlbmRNb2RlbFRyYW5zcG9ydENvbmZpZy53ZWJzb2NrZXRDbGllbnQgfHwgcmVzb2x2ZUludGVybmFsV2Vic29ja2V0Q2xpZW50KCkpXG5cbiAgICAgIGlmICghY2xpZW50IHx8ICFjbGllbnQuaXNPcGVuKCkpIHtcbiAgICAgICAgaWYgKHJldHJ5VGltZXIgPT09IG51bGwpIHtcbiAgICAgICAgICByZXRyeVRpbWVyID0gZ2xvYmFsVGhpcy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHJldHJ5VGltZXIgPSBudWxsXG4gICAgICAgICAgICBzeW5jKClcbiAgICAgICAgICB9LCAyNTApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGxhc3RQYXJhbXNKc29uID0gbmV4dFBhcmFtc0pzb25cbiAgICAgIGNvbm5lY3Rpb24gPSBGcm9udGVuZE1vZGVsQmFzZS5vcGVuV2Vic29ja2V0Q29ubmVjdGlvbihjb25uZWN0aW9uVHlwZSwge1xuICAgICAgICBwYXJhbXM6IG5leHRQYXJhbXMsXG4gICAgICAgIG9uTWVzc2FnZTogb3B0aW9ucy5vbk1lc3NhZ2UsXG4gICAgICAgIG9uQ2xvc2U6ICgpID0+IHtcbiAgICAgICAgICBpZiAoY29ubmVjdGlvbj8uaXNDbG9zZWQoKSkge1xuICAgICAgICAgICAgY29ubmVjdGlvbiA9IG51bGxcbiAgICAgICAgICAgIGxhc3RQYXJhbXNKc29uID0gXCJcIlxuICAgICAgICAgICAgc3luYygpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IGNsb3NlID0gKCkgPT4ge1xuICAgICAgY2xvc2VkID0gdHJ1ZVxuICAgICAgaWYgKHJldHJ5VGltZXIgIT09IG51bGwpIGdsb2JhbFRoaXMuY2xlYXJUaW1lb3V0KHJldHJ5VGltZXIpXG4gICAgICBpZiAoY29ubmVjdGlvbiAmJiAhY29ubmVjdGlvbi5pc0Nsb3NlZCgpKSBjb25uZWN0aW9uLmNsb3NlKClcbiAgICAgIGNvbm5lY3Rpb24gPSBudWxsXG4gICAgfVxuXG4gICAgc3luYygpXG5cbiAgICByZXR1cm4ge3N5bmMsIGNsb3NlfVxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGEgMToxIGBXZWJzb2NrZXRDb25uZWN0aW9uYCBvZiB0aGUgZ2l2ZW4gdHlwZS4gVGhpblxuICAgKiBjb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCB0aGUgaW50ZXJuYWwgV1MgY2xpZW50J3NcbiAgICogYG9wZW5Db25uZWN0aW9uYC4gQXBwcyB1c2UgdGhpcyBmb3IgcGVyLXNlc3Npb24gc3RhdGUvbWVzc2FnaW5nXG4gICAqIHRoYXQgZG9lc24ndCBmaXQgdGhlIHB1Yi9zdWIgQ2hhbm5lbCBtb2RlbCAobG9jYWxlLCBwcmVzZW5jZSkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb25uZWN0aW9uVHlwZSAtIE5hbWUgdGhlIHNlcnZlciByZWdpc3RlcmVkIHRoZSBjbGFzcyB1bmRlci5cbiAgICogQHBhcmFtIHt7cGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55Piwgb25Db25uZWN0PzogKCkgPT4gdm9pZCwgb25NZXNzYWdlPzogKGJvZHk6IGFueSkgPT4gdm9pZCwgb25EaXNjb25uZWN0PzogKCkgPT4gdm9pZCwgb25SZXN1bWU/OiAoKSA9PiB2b2lkLCBvbkNsb3NlPzogKHJlYXNvbjogc3RyaW5nKSA9PiB2b2lkfX0gW29wdGlvbnNdIC0gQ29ubmVjdGlvbiBvcHRpb25zIGFuZCBldmVudCBoYW5kbGVycy5cbiAgICogQHJldHVybnMge2FueX0gLSBWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnRDb25uZWN0aW9uIGhhbmRsZSAodHlwZWQgbG9vc2VseSB0byBhdm9pZCBhIGNyb3NzLW1vZHVsZSBpbXBvcnQgY3ljbGUpLlxuICAgKi9cbiAgc3RhdGljIG9wZW5XZWJzb2NrZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25UeXBlLCBvcHRpb25zKSB7XG4gICAgY29uc3QgY2xpZW50ID0gLyoqIEB0eXBlIHthbnl9ICovIChmcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnLndlYnNvY2tldENsaWVudCB8fCByZXNvbHZlSW50ZXJuYWxXZWJzb2NrZXRDbGllbnQoKSlcblxuICAgIGlmICghY2xpZW50IHx8IHR5cGVvZiBjbGllbnQub3BlbkNvbm5lY3Rpb24gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwib3BlbldlYnNvY2tldENvbm5lY3Rpb24gcmVxdWlyZXMgY29uZmlndXJlVHJhbnNwb3J0KHt3ZWJzb2NrZXRVcmx9KVwiKVxuICAgIH1cblxuICAgIHJldHVybiBjbGllbnQub3BlbkNvbm5lY3Rpb24oY29ubmVjdGlvblR5cGUsIG9wdGlvbnMgfHwge30pXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byBhIHB1Yi9zdWIgYFdlYnNvY2tldENoYW5uZWxgLiBUaGluIHdyYXBwZXIgYXJvdW5kXG4gICAqIHRoZSBpbnRlcm5hbCBjbGllbnQncyBgc3Vic2NyaWJlQ2hhbm5lbGAuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsVHlwZSAtIENoYW5uZWwgY2xhc3MgbmFtZSByZWdpc3RlcmVkIG9uIHRoZSBzZXJ2ZXIuXG4gICAqIEBwYXJhbSB7e3BhcmFtcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIG9uTWVzc2FnZT86IChib2R5OiBhbnkpID0+IHZvaWQsIG9uRGlzY29ubmVjdD86ICgpID0+IHZvaWQsIG9uUmVzdW1lPzogKCkgPT4gdm9pZCwgb25DbG9zZT86IChyZWFzb246IHN0cmluZykgPT4gdm9pZH19IFtvcHRpb25zXSAtIENoYW5uZWwgc3Vic2NyaXB0aW9uIG9wdGlvbnMgYW5kIGV2ZW50IGhhbmRsZXJzLlxuICAgKiBAcmV0dXJucyB7YW55fSAtIFdlYnNvY2tldCBjaGFubmVsIGhhbmRsZSBmcm9tIHRoZSBjb25maWd1cmVkIGNsaWVudC5cbiAgICovXG4gIHN0YXRpYyBzdWJzY3JpYmVXZWJzb2NrZXRDaGFubmVsKGNoYW5uZWxUeXBlLCBvcHRpb25zKSB7XG4gICAgY29uc3QgY2xpZW50ID0gLyoqIEB0eXBlIHthbnl9ICovIChmcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnLndlYnNvY2tldENsaWVudCB8fCByZXNvbHZlSW50ZXJuYWxXZWJzb2NrZXRDbGllbnQoKSlcblxuICAgIGlmICghY2xpZW50IHx8IHR5cGVvZiBjbGllbnQuc3Vic2NyaWJlQ2hhbm5lbCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdWJzY3JpYmVXZWJzb2NrZXRDaGFubmVsIHJlcXVpcmVzIGNvbmZpZ3VyZVRyYW5zcG9ydCh7d2Vic29ja2V0VXJsfSlcIilcbiAgICB9XG5cbiAgICByZXR1cm4gY2xpZW50LnN1YnNjcmliZUNoYW5uZWwoY2hhbm5lbFR5cGUsIG9wdGlvbnMgfHwge30pXG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbHMgV2ViU29ja2V0IGxpZmVjeWNsZSBob29rcyBvbiBnbG9iYWxUaGlzIGZvciBzeXN0ZW0gdGVzdCBhY2Nlc3MuXG4gICAqIFRlc3RzIGNhbiBjYWxsIGBnbG9iYWxUaGlzLl9fdmVsb2Npb3VzX3dlYnNvY2tldF9ob29rcy5jb25uZWN0KClgIGV0Yy5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgaW5zdGFsbFdlYnNvY2tldFRlc3RIb29rcygpIHtcbiAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09IFwidW5kZWZpbmVkXCIpIHJldHVyblxuXG4gICAgLyoqIEB0eXBlIHthbnl9ICovIChnbG9iYWxUaGlzKS5fX3ZlbG9jaW91c193ZWJzb2NrZXRfaG9va3MgPSB7XG4gICAgICBjb25uZWN0OiAoKSA9PiB0aGlzLmNvbm5lY3RXZWJzb2NrZXQoKSxcbiAgICAgIGRpc2Nvbm5lY3Q6ICgpID0+IHRoaXMuZGlzY29ubmVjdFdlYnNvY2tldCgpLFxuICAgICAgZHJvcDogKCkgPT4gdGhpcy5kcm9wV2Vic29ja2V0KCksXG4gICAgICBzdGF0ZTogKCkgPT4gdGhpcy53ZWJzb2NrZXRTdGF0ZSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9XG4gICAqIEBwYXJhbSB7b2JqZWN0fSByZXNwb25zZSAtIFJlc3BvbnNlIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAtIEF0dHJpYnV0ZXMgZnJvbSBwYXlsb2FkLlxuICAgKi9cbiAgc3RhdGljIGF0dHJpYnV0ZXNGcm9tUmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgICBjb25zdCBtb2RlbERhdGEgPSB0aGlzLm1vZGVsRGF0YUZyb21SZXNwb25zZShyZXNwb25zZSlcblxuICAgIHJldHVybiBtb2RlbERhdGEuYXR0cmlidXRlc1xuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9XG4gICAqIEBwYXJhbSB7b2JqZWN0fSByZXNwb25zZSAtIFJlc3BvbnNlIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHt7YWJpbGl0aWVzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiwgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgYW55PiwgYXNzb2NpYXRpb25Db3VudHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4sIHF1ZXJ5RGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHByZWxvYWRlZFJlbGF0aW9uc2hpcHM6IFJlY29yZDxzdHJpbmcsIGFueT4sIHNlbGVjdGVkQXR0cmlidXRlczogU2V0PHN0cmluZz59fSAtIEF0dHJpYnV0ZXMsIHByZWxvYWRlZCByZWxhdGlvbnNoaXBzLCBhc3NvY2lhdGlvbiBjb3VudHMsIHF1ZXJ5RGF0YSwgYWJpbGl0aWVzLCBhbmQgdGhlIHNlbGVjdGVkLWF0dHJpYnV0ZXMgc2V0LlxuICAgKi9cbiAgc3RhdGljIG1vZGVsRGF0YUZyb21SZXNwb25zZShyZXNwb25zZSkge1xuICAgIGlmICghcmVzcG9uc2UgfHwgdHlwZW9mIHJlc3BvbnNlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG9iamVjdCByZXNwb25zZSBidXQgZ290OiAke3Jlc3BvbnNlfWApXG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2VPYmplY3QgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovIChyZXNwb25zZSlcblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICBsZXQgbW9kZWxEYXRhXG5cbiAgICBpZiAocmVzcG9uc2VPYmplY3QubW9kZWwgJiYgdHlwZW9mIHJlc3BvbnNlT2JqZWN0Lm1vZGVsID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBtb2RlbERhdGEgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovIChyZXNwb25zZU9iamVjdC5tb2RlbClcbiAgICB9IGVsc2UgaWYgKHJlc3BvbnNlT2JqZWN0LmF0dHJpYnV0ZXMgJiYgdHlwZW9mIHJlc3BvbnNlT2JqZWN0LmF0dHJpYnV0ZXMgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIG1vZGVsRGF0YSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi8gKHJlc3BvbnNlT2JqZWN0LmF0dHJpYnV0ZXMpXG4gICAgfSBlbHNlIHtcbiAgICAgIG1vZGVsRGF0YSA9IHJlc3BvbnNlT2JqZWN0XG4gICAgfVxuXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHsuLi5tb2RlbERhdGF9XG4gICAgY29uc3QgcHJlbG9hZGVkUmVsYXRpb25zaGlwcyA9IGlzUGxhaW5PYmplY3QoYXR0cmlidXRlc1tQUkVMT0FERURfUkVMQVRJT05TSElQU19LRVldKVxuICAgICAgPyAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovIChhdHRyaWJ1dGVzW1BSRUxPQURFRF9SRUxBVElPTlNISVBTX0tFWV0pXG4gICAgICA6IHt9XG4gICAgY29uc3QgYXNzb2NpYXRpb25Db3VudHMgPSBpc1BsYWluT2JqZWN0KGF0dHJpYnV0ZXNbQVNTT0NJQVRJT05fQ09VTlRTX0tFWV0pXG4gICAgICA/IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgbnVtYmVyPn0gKi8gKGF0dHJpYnV0ZXNbQVNTT0NJQVRJT05fQ09VTlRTX0tFWV0pXG4gICAgICA6IHt9XG4gICAgY29uc3QgcXVlcnlEYXRhID0gaXNQbGFpbk9iamVjdChhdHRyaWJ1dGVzW1FVRVJZX0RBVEFfS0VZXSlcbiAgICAgID8gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKGF0dHJpYnV0ZXNbUVVFUllfREFUQV9LRVldKVxuICAgICAgOiB7fVxuICAgIGNvbnN0IGFiaWxpdGllcyA9IGlzUGxhaW5PYmplY3QoYXR0cmlidXRlc1tBQklMSVRJRVNfS0VZXSlcbiAgICAgID8gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBib29sZWFuPn0gKi8gKGF0dHJpYnV0ZXNbQUJJTElUSUVTX0tFWV0pXG4gICAgICA6IHt9XG4gICAgY29uc3Qgc2VsZWN0ZWRBdHRyaWJ1dGVzRnJvbVBheWxvYWQgPSBBcnJheS5pc0FycmF5KGF0dHJpYnV0ZXNbU0VMRUNURURfQVRUUklCVVRFU19LRVldKVxuICAgICAgPyBuZXcgU2V0KC8qKiBAdHlwZSB7c3RyaW5nW119ICovIChhdHRyaWJ1dGVzW1NFTEVDVEVEX0FUVFJJQlVURVNfS0VZXSkuZmlsdGVyKChhdHRyaWJ1dGVOYW1lKSA9PiB0eXBlb2YgYXR0cmlidXRlTmFtZSA9PT0gXCJzdHJpbmdcIikpXG4gICAgICA6IG51bGxcblxuICAgIGRlbGV0ZSBhdHRyaWJ1dGVzW1BSRUxPQURFRF9SRUxBVElPTlNISVBTX0tFWV1cbiAgICBkZWxldGUgYXR0cmlidXRlc1tTRUxFQ1RFRF9BVFRSSUJVVEVTX0tFWV1cbiAgICBkZWxldGUgYXR0cmlidXRlc1tBU1NPQ0lBVElPTl9DT1VOVFNfS0VZXVxuICAgIGRlbGV0ZSBhdHRyaWJ1dGVzW1FVRVJZX0RBVEFfS0VZXVxuICAgIGRlbGV0ZSBhdHRyaWJ1dGVzW0FCSUxJVElFU19LRVldXG5cbiAgICBjb25zdCBzZWxlY3RlZEF0dHJpYnV0ZXMgPSBzZWxlY3RlZEF0dHJpYnV0ZXNGcm9tUGF5bG9hZCB8fCBuZXcgU2V0KE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpKVxuXG4gICAgcmV0dXJuIHthYmlsaXRpZXMsIGF0dHJpYnV0ZXMsIGFzc29jaWF0aW9uQ291bnRzLCBxdWVyeURhdGEsIHByZWxvYWRlZFJlbGF0aW9uc2hpcHMsIHNlbGVjdGVkQXR0cmlidXRlc31cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfVxuICAgKiBAcGFyYW0ge0Zyb250ZW5kTW9kZWxCYXNlfSBtb2RlbCAtIE1vZGVsIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHByZWxvYWRlZFJlbGF0aW9uc2hpcHMgLSBQcmVsb2FkZWQgcmVsYXRpb25zaGlwIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIGFwcGx5UHJlbG9hZGVkUmVsYXRpb25zaGlwcyhtb2RlbCwgcHJlbG9hZGVkUmVsYXRpb25zaGlwcykge1xuICAgIGZvciAoY29uc3QgW3JlbGF0aW9uc2hpcE5hbWUsIHJlbGF0aW9uc2hpcFBheWxvYWRdIG9mIE9iamVjdC5lbnRyaWVzKHByZWxvYWRlZFJlbGF0aW9uc2hpcHMpKSB7XG4gICAgICBjb25zdCByZWxhdGlvbnNoaXAgPSBtb2RlbC5nZXRSZWxhdGlvbnNoaXBCeU5hbWUocmVsYXRpb25zaGlwTmFtZSlcbiAgICAgIGNvbnN0IHRhcmdldE1vZGVsQ2xhc3MgPSB0aGlzLnJlbGF0aW9uc2hpcE1vZGVsQ2xhc3MocmVsYXRpb25zaGlwTmFtZSlcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVsYXRpb25zaGlwUGF5bG9hZCkpIHtcbiAgICAgICAgcmVsYXRpb25zaGlwLnNldExvYWRlZChyZWxhdGlvbnNoaXBQYXlsb2FkLm1hcCgoZW50cnkpID0+IHRoaXMuaW5zdGFudGlhdGVSZWxhdGlvbnNoaXBWYWx1ZShlbnRyeSwgdGFyZ2V0TW9kZWxDbGFzcykpKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICByZWxhdGlvbnNoaXAuc2V0TG9hZGVkKHRoaXMuaW5zdGFudGlhdGVSZWxhdGlvbnNoaXBWYWx1ZShyZWxhdGlvbnNoaXBQYXlsb2FkLCB0YXJnZXRNb2RlbENsYXNzKSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHBhcmFtIHthbnl9IHJlbGF0aW9uc2hpcFBheWxvYWQgLSBSZWxhdGlvbnNoaXAgcGF5bG9hZCB2YWx1ZS5cbiAgICogQHBhcmFtIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2UgfCBudWxsfSB0YXJnZXRNb2RlbENsYXNzIC0gVGFyZ2V0IG1vZGVsIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7YW55fSAtIEluc3RhbnRpYXRlZCByZWxhdGlvbnNoaXAgdmFsdWUuXG4gICAqL1xuICBzdGF0aWMgaW5zdGFudGlhdGVSZWxhdGlvbnNoaXBWYWx1ZShyZWxhdGlvbnNoaXBQYXlsb2FkLCB0YXJnZXRNb2RlbENsYXNzKSB7XG4gICAgaWYgKCF0YXJnZXRNb2RlbENsYXNzKSByZXR1cm4gcmVsYXRpb25zaGlwUGF5bG9hZFxuXG4gICAgaWYgKCFyZWxhdGlvbnNoaXBQYXlsb2FkIHx8IHR5cGVvZiByZWxhdGlvbnNoaXBQYXlsb2FkICE9PSBcIm9iamVjdFwiKSByZXR1cm4gcmVsYXRpb25zaGlwUGF5bG9hZFxuXG4gICAgcmV0dXJuIHRhcmdldE1vZGVsQ2xhc3MuaW5zdGFudGlhdGVGcm9tUmVzcG9uc2UocmVsYXRpb25zaGlwUGF5bG9hZClcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gVFxuICAgKiBAdGhpcyB7VH1cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgSW5zdGFuY2VUeXBlPFQ+fSByZXNwb25zZSAtIFJlc3BvbnNlIHBheWxvYWQsIG9yIGFuIGFscmVhZHktaHlkcmF0ZWQgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICogQHJldHVybnMge0luc3RhbmNlVHlwZTxUPn0gLSBOZXcgbW9kZWwgaW5zdGFuY2UsIG9yIHRoZSBzYW1lIGluc3RhbmNlIHVuY2hhbmdlZCBpZiBpdCB3YXMgYWxyZWFkeSBoeWRyYXRlZC5cbiAgICovXG4gIHN0YXRpYyBpbnN0YW50aWF0ZUZyb21SZXNwb25zZShyZXNwb25zZSkge1xuICAgIC8vIElkZW1wb3RlbnQ6IGlmIGEgY2FsbGVyIGhhbmRzIHVzIGFuIGFscmVhZHktaHlkcmF0ZWQgaW5zdGFuY2Ugb2YgdGhpc1xuICAgIC8vIGNsYXNzIChub3cgY29tbW9uIGJlY2F1c2UgdGhlIHNoYXJlZCBmcm9udGVuZC1tb2RlbCBBUEkgYXV0by1zZXJpYWxpemVzXG4gICAgLy8gYmFja2VuZCBgUmVjb3JkYCBpbnN0YW5jZXMgcmV0dXJuZWQgZnJvbSBjdXN0b20gY29tbWFuZHMgYW5kIHRoZVxuICAgIC8vIHRyYW5zcG9ydCBkZXNlcmlhbGl6ZXIgaHlkcmF0ZXMgdGhlbSBpbnRvIG1vZGVscyBiZWZvcmUgdGhlIGNhbGwgc2l0ZVxuICAgIC8vIHNlZXMgdGhlIHJlc3BvbnNlKSwgcmV0dXJuIGl0IGFzLWlzLiBXaXRob3V0IHRoaXMsIGNvZGUgdGhhdCBoYXNcbiAgICAvLyBoaXN0b3JpY2FsbHkgd3JhcHBlZCBjdXN0b20tY29tbWFuZCByZXNwb25zZXMgaW5cbiAgICAvLyBgTW9kZWwuaW5zdGFudGlhdGVGcm9tUmVzcG9uc2UocmVzcG9uc2UuZmllbGQpYCB3b3VsZCBzcHJlYWQgdGhlIGxpdmVcbiAgICAvLyBtb2RlbCBpbnN0YW5jZSBpbnRvIGEgbmV3IGNvbnN0cnVjdG9yIGNhbGwgYW5kIHByb2R1Y2UgYSBicm9rZW4gbW9kZWxcbiAgICAvLyB3aXRoIGludGVybmFsIHN0YXRlIGtleXMgcHJvbW90ZWQgdG8gYXR0cmlidXRlcy5cbiAgICBpZiAocmVzcG9uc2UgaW5zdGFuY2VvZiB0aGlzKSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtJbnN0YW5jZVR5cGU8VD59ICovIChyZXNwb25zZSlcbiAgICB9XG5cbiAgICBjb25zdCBtb2RlbERhdGEgPSB0aGlzLm1vZGVsRGF0YUZyb21SZXNwb25zZShyZXNwb25zZSlcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gbW9kZWxEYXRhLmF0dHJpYnV0ZXNcbiAgICBjb25zdCBwcmVsb2FkZWRSZWxhdGlvbnNoaXBzID0gbW9kZWxEYXRhLnByZWxvYWRlZFJlbGF0aW9uc2hpcHNcbiAgICBjb25zdCBhc3NvY2lhdGlvbkNvdW50cyA9IG1vZGVsRGF0YS5hc3NvY2lhdGlvbkNvdW50c1xuICAgIGNvbnN0IHF1ZXJ5RGF0YSA9IG1vZGVsRGF0YS5xdWVyeURhdGFcbiAgICBjb25zdCBhYmlsaXRpZXMgPSBtb2RlbERhdGEuYWJpbGl0aWVzXG4gICAgY29uc3Qgc2VsZWN0ZWRBdHRyaWJ1dGVzID0gbW9kZWxEYXRhLnNlbGVjdGVkQXR0cmlidXRlc1xuICAgIGNvbnN0IG1vZGVsID0gLyoqIEB0eXBlIHtJbnN0YW5jZVR5cGU8VD59ICovIChuZXcgdGhpcyhhdHRyaWJ1dGVzKSlcbiAgICBtb2RlbC5fc2VsZWN0ZWRBdHRyaWJ1dGVzID0gc2VsZWN0ZWRBdHRyaWJ1dGVzID8gbmV3IFNldChzZWxlY3RlZEF0dHJpYnV0ZXMpIDogbnVsbFxuXG4gICAgdGhpcy5hcHBseVByZWxvYWRlZFJlbGF0aW9uc2hpcHMobW9kZWwsIHByZWxvYWRlZFJlbGF0aW9uc2hpcHMpXG5cbiAgICBmb3IgKGNvbnN0IFthdHRyaWJ1dGVOYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXNzb2NpYXRpb25Db3VudHMgfHwge30pKSB7XG4gICAgICBtb2RlbC5fc2V0QXNzb2NpYXRpb25Db3VudChhdHRyaWJ1dGVOYW1lLCBOdW1iZXIodmFsdWUpIHx8IDApXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHF1ZXJ5RGF0YSB8fCB7fSkpIHtcbiAgICAgIG1vZGVsLl9zZXRRdWVyeURhdGEobmFtZSwgdmFsdWUpXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbYWN0aW9uLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYWJpbGl0aWVzIHx8IHt9KSkge1xuICAgICAgbW9kZWwuX3NldENvbXB1dGVkQWJpbGl0eShhY3Rpb24sIEJvb2xlYW4odmFsdWUpKVxuICAgIH1cblxuICAgIG1vZGVsLnNldElzTmV3UmVjb3JkKGZhbHNlKVxuICAgIG1vZGVsLl9wZXJzaXN0ZWRBdHRyaWJ1dGVzID0gY2xvbmVGcm9udGVuZE1vZGVsQXR0cmlidXRlcyhtb2RlbC5hdHRyaWJ1dGVzKCkpXG5cbiAgICByZXR1cm4gbW9kZWxcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gVFxuICAgKiBAdGhpcyB7VH1cbiAgICogQHBhcmFtIHtudW1iZXIgfCBzdHJpbmd9IGlkIC0gUmVjb3JkIGlkZW50aWZpZXIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEluc3RhbmNlVHlwZTxUPj59IC0gUmVzb2x2ZWQgbW9kZWwuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZmluZChpZCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnF1ZXJ5KCkuZmluZChpZClcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gVFxuICAgKiBAdGhpcyB7VH1cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25kaXRpb25zIC0gQXR0cmlidXRlIG1hdGNoIGNvbmRpdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEluc3RhbmNlVHlwZTxUPiB8IG51bGw+fSAtIEZvdW5kIG1vZGVsIG9yIG51bGwuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZmluZEJ5KGNvbmRpdGlvbnMpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5xdWVyeSgpLmZpbmRCeShjb25kaXRpb25zKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmRpdGlvbnMgLSBBdHRyaWJ1dGUgbWF0Y2ggY29uZGl0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8SW5zdGFuY2VUeXBlPFQ+Pn0gLSBGb3VuZCBtb2RlbC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBmaW5kQnlPckZhaWwoY29uZGl0aW9ucykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnF1ZXJ5KCkuZmluZEJ5T3JGYWlsKGNvbmRpdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9IFRcbiAgICogQHRoaXMge1R9XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEluc3RhbmNlVHlwZTxUPltdPn0gLSBMb2FkZWQgbW9kZWwgaW5zdGFuY2VzLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHRvQXJyYXkoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucXVlcnkoKS50b0FycmF5KClcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gVFxuICAgKiBAdGhpcyB7VH1cbiAgICogQHJldHVybnMge1Byb21pc2U8SW5zdGFuY2VUeXBlPFQ+W10+fSAtIExvYWRlZCBtb2RlbCBpbnN0YW5jZXMuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgbG9hZCgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5xdWVyeSgpLmxvYWQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbFF1ZXJ5PFQ+fSAtIFF1ZXJ5IGJ1aWxkZXIuXG4gICAqL1xuICBzdGF0aWMgYWxsKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5KClcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gVFxuICAgKiBAdGhpcyB7VH1cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25kaXRpb25zIC0gUm9vdC1tb2RlbCB3aGVyZSBjb25kaXRpb25zLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5kZWZhdWx0PFQ+fSAtIFF1ZXJ5IHdpdGggd2hlcmUgY29uZGl0aW9ucy5cbiAgICovXG4gIHN0YXRpYyB3aGVyZShjb25kaXRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnkoKS53aGVyZShjb25kaXRpb25zKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT4gfCBBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gam9pbnMgLSBSZWxhdGlvbnNoaXAgZGVzY3JpcHRvciBqb2lucy5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vcXVlcnkuanNcIikuZGVmYXVsdDxUPn0gLSBRdWVyeSB3aXRoIGpvaW5zLlxuICAgKi9cbiAgc3RhdGljIGpvaW5zKGpvaW5zKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnkoKS5qb2lucyhqb2lucylcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gVFxuICAgKiBAdGhpcyB7VH1cbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gTWF4aW11bSBudW1iZXIgb2YgcmVjb3Jkcy5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vcXVlcnkuanNcIikuZGVmYXVsdDxUPn0gLSBRdWVyeSB3aXRoIGxpbWl0LlxuICAgKi9cbiAgc3RhdGljIGxpbWl0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnkoKS5saW1pdCh2YWx1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gVFxuICAgKiBAdGhpcyB7VH1cbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gTnVtYmVyIG9mIHJlY29yZHMgdG8gc2tpcC5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vcXVlcnkuanNcIikuZGVmYXVsdDxUPn0gLSBRdWVyeSB3aXRoIG9mZnNldC5cbiAgICovXG4gIHN0YXRpYyBvZmZzZXQodmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeSgpLm9mZnNldCh2YWx1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gVFxuICAgKiBAdGhpcyB7VH1cbiAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2VOdW1iZXIgLSAxLWJhc2VkIHBhZ2UgbnVtYmVyLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5kZWZhdWx0PFQ+fSAtIFF1ZXJ5IHdpdGggcGFnZSBhcHBsaWVkLlxuICAgKi9cbiAgc3RhdGljIHBhZ2UocGFnZU51bWJlcikge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5KCkucGFnZShwYWdlTnVtYmVyKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBOdW1iZXIgb2YgcmVjb3JkcyBwZXIgcGFnZS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vcXVlcnkuanNcIikuZGVmYXVsdDxUPn0gLSBRdWVyeSB3aXRoIHBhZ2Ugc2l6ZS5cbiAgICovXG4gIHN0YXRpYyBwZXJQYWdlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnkoKS5wZXJQYWdlKHZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSAtIE51bWJlciBvZiBsb2FkZWQgbW9kZWwgaW5zdGFuY2VzLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGNvdW50KCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnF1ZXJ5KCkuY291bnQoKVxuICB9XG5cbiAgLyoqXG4gICAqIENsYXNzLWxldmVsIGhvb2sgZmlyZWQgd2hlbiBhbnkgcmVjb3JkIG9mIHRoaXMgbW9kZWwgaXMgY3JlYXRlZC5cbiAgICogU3Vic2NyaWJlLXRpbWUgYXV0aG9yaXphdGlvbiBvbmx5IOKAlCBvbmNlIGEgc3Vic2NyaXB0aW9uIGlzXG4gICAqIGFjY2VwdGVkLCBldmVyeSBmdXR1cmUgYGNyZWF0ZWAgZXZlbnQgZm9yIHRoaXMgbW9kZWwgaXMgZGVsaXZlcmVkXG4gICAqIHdpdGhvdXQgcmUtY2hlY2tpbmcgcGVyLXJlY29yZCB2aXNpYmlsaXR5LlxuICAgKiBAdGhpcyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfVxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiB7aWQ6IHN0cmluZywgbW9kZWw6IEluc3RhbmNlVHlwZTx0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2U+fSkgPT4gdm9pZH0gY2FsbGJhY2sgLSBFdmVudCBjYWxsYmFjay5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxQcm9qZWN0aW9uT3B0aW9uc30gW29wdGlvbnNdIC0gRXZlbnQgcmVjb3JkIHByb2plY3Rpb24gb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8KCkgPT4gdm9pZD59IC0gVW5zdWJzY3JpYmUgY2FsbGJhY2suXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgb25DcmVhdGUoY2FsbGJhY2ssIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHN1YiA9IGVuc3VyZUZyb250ZW5kTW9kZWxFdmVudFN1YnNjcmlwdGlvbih0aGlzKVxuICAgIGNvbnN0IGVudHJ5ID0ge2NhbGxiYWNrLCBwcm9qZWN0aW9uUGF5bG9hZDogZnJvbnRlbmRNb2RlbFByb2plY3Rpb25QYXlsb2FkKHRoaXMsIG9wdGlvbnMpfVxuXG4gICAgc3ViLmNsYXNzQ3JlYXRlQ2FsbGJhY2tzLmFkZChlbnRyeSlcbiAgICBhd2FpdCBzdWIuZW5zdXJlU3Vic2NyaWJlZCgpXG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgc3ViLmNsYXNzQ3JlYXRlQ2FsbGJhY2tzLmRlbGV0ZShlbnRyeSlcbiAgICAgIHN1Yi5tYXliZVRlYXJkb3duKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xhc3MtbGV2ZWwgaG9vayBmaXJlZCB3aGVuIGFueSByZWNvcmQgb2YgdGhpcyBtb2RlbCBpcyB1cGRhdGVkLlxuICAgKiBAdGhpcyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfVxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiB7aWQ6IHN0cmluZywgbW9kZWw6IEluc3RhbmNlVHlwZTx0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2U+fSkgPT4gdm9pZH0gY2FsbGJhY2sgLSBFdmVudCBjYWxsYmFjay5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxQcm9qZWN0aW9uT3B0aW9uc30gW29wdGlvbnNdIC0gRXZlbnQgcmVjb3JkIHByb2plY3Rpb24gb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8KCkgPT4gdm9pZD59IC0gVW5zdWJzY3JpYmUgY2FsbGJhY2suXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgb25VcGRhdGUoY2FsbGJhY2ssIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHN1YiA9IGVuc3VyZUZyb250ZW5kTW9kZWxFdmVudFN1YnNjcmlwdGlvbih0aGlzKVxuICAgIGNvbnN0IGVudHJ5ID0ge2NhbGxiYWNrLCBwcm9qZWN0aW9uUGF5bG9hZDogZnJvbnRlbmRNb2RlbFByb2plY3Rpb25QYXlsb2FkKHRoaXMsIG9wdGlvbnMpfVxuXG4gICAgc3ViLmNsYXNzVXBkYXRlQ2FsbGJhY2tzLmFkZChlbnRyeSlcbiAgICBhd2FpdCBzdWIuZW5zdXJlU3Vic2NyaWJlZCgpXG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgc3ViLmNsYXNzVXBkYXRlQ2FsbGJhY2tzLmRlbGV0ZShlbnRyeSlcbiAgICAgIHN1Yi5tYXliZVRlYXJkb3duKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xhc3MtbGV2ZWwgaG9vayBmaXJlZCB3aGVuIGFueSByZWNvcmQgb2YgdGhpcyBtb2RlbCBpcyBkZXN0cm95ZWQuXG4gICAqIEB0aGlzIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9XG4gICAqIEBwYXJhbSB7KHBheWxvYWQ6IHtpZDogc3RyaW5nfSkgPT4gdm9pZH0gY2FsbGJhY2sgLSBFdmVudCBjYWxsYmFjay5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxQcm9qZWN0aW9uT3B0aW9uc30gW19vcHRpb25zXSAtIEFjY2VwdGVkIGZvciBBUEkgc3ltbWV0cnk7IGRlc3Ryb3kgZXZlbnRzIGNhcnJ5IGlkcyBvbmx5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTwoKSA9PiB2b2lkPn0gLSBVbnN1YnNjcmliZSBjYWxsYmFjay5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBvbkRlc3Ryb3koY2FsbGJhY2ssIF9vcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBzdWIgPSBlbnN1cmVGcm9udGVuZE1vZGVsRXZlbnRTdWJzY3JpcHRpb24odGhpcylcbiAgICBjb25zdCBlbnRyeSA9IHtjYWxsYmFja31cblxuICAgIHN1Yi5jbGFzc0Rlc3Ryb3lDYWxsYmFja3MuYWRkKGVudHJ5KVxuICAgIGF3YWl0IHN1Yi5lbnN1cmVTdWJzY3JpYmVkKClcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBzdWIuY2xhc3NEZXN0cm95Q2FsbGJhY2tzLmRlbGV0ZShlbnRyeSlcbiAgICAgIHN1Yi5tYXliZVRlYXJkb3duKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFuY2UtbGV2ZWwgaG9vayBmaXJlZCB3aGVuIFRISVMgcmVjb3JkIGlzIHVwZGF0ZWQuIFRoZVxuICAgKiBpbnN0YW5jZSdzIGF0dHJpYnV0ZXMgYXJlIGF1dG8tbWVyZ2VkIHdpdGggdGhlIGJyb2FkY2FzdCBwYXlsb2FkXG4gICAqIGJlZm9yZSB0aGUgY2FsbGJhY2sgcnVucywgc28gY2FsbGVycyBjYW4gcmVhZCBmcmVzaCB2YWx1ZXMgdmlhXG4gICAqIGB0aGlzLnNvbWVBdHRyKClgIHdpdGhvdXQgcmUtZmV0Y2hpbmcuXG4gICAqIEBwYXJhbSB7KHBheWxvYWQ6IHtpZDogc3RyaW5nLCBtb2RlbDogSW5zdGFuY2VUeXBlPHR5cGVvZiBGcm9udGVuZE1vZGVsQmFzZT59KSA9PiB2b2lkfSBjYWxsYmFjayAtIEV2ZW50IGNhbGxiYWNrLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFByb2plY3Rpb25PcHRpb25zfSBbb3B0aW9uc10gLSBFdmVudCByZWNvcmQgcHJvamVjdGlvbiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTwoKSA9PiB2b2lkPn0gLSBVbnN1YnNjcmliZSBjYWxsYmFjay5cbiAgICovXG4gIGFzeW5jIG9uVXBkYXRlKGNhbGxiYWNrLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBzZWxmID0gLyoqIEB0eXBlIHthbnl9ICovICh0aGlzKVxuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gKi8gKHRoaXMuY29uc3RydWN0b3IpXG4gICAgY29uc3Qgc3ViID0gZW5zdXJlRnJvbnRlbmRNb2RlbEV2ZW50U3Vic2NyaXB0aW9uKE1vZGVsQ2xhc3MpXG4gICAgY29uc3QgaWQgPSBTdHJpbmcoc2VsZi5pZCgpKVxuICAgIGNvbnN0IGVudHJ5ID0ge2NhbGxiYWNrLCBwcm9qZWN0aW9uUGF5bG9hZDogZnJvbnRlbmRNb2RlbFByb2plY3Rpb25QYXlsb2FkKE1vZGVsQ2xhc3MsIG9wdGlvbnMpfVxuICAgIGxldCBsaXN0ZW5lciA9IHN1Yi5pbnN0YW5jZUxpc3RlbmVycy5nZXQoaWQpXG5cbiAgICBpZiAoIWxpc3RlbmVyKSB7XG4gICAgICBsaXN0ZW5lciA9IHtpbnN0YW5jZTogdGhpcywgdXBkYXRlQ2FsbGJhY2tzOiBuZXcgU2V0KCksIGRlc3Ryb3lDYWxsYmFja3M6IG5ldyBTZXQoKX1cbiAgICAgIHN1Yi5pbnN0YW5jZUxpc3RlbmVycy5zZXQoaWQsIGxpc3RlbmVyKVxuICAgIH0gZWxzZSB7XG4gICAgICBsaXN0ZW5lci5pbnN0YW5jZSA9IHRoaXNcbiAgICB9XG5cbiAgICBsaXN0ZW5lci51cGRhdGVDYWxsYmFja3MuYWRkKGVudHJ5KVxuICAgIGF3YWl0IHN1Yi5lbnN1cmVTdWJzY3JpYmVkKClcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gc3ViLmluc3RhbmNlTGlzdGVuZXJzLmdldChpZClcblxuICAgICAgaWYgKCFjdXJyZW50KSByZXR1cm5cbiAgICAgIGN1cnJlbnQudXBkYXRlQ2FsbGJhY2tzLmRlbGV0ZShlbnRyeSlcblxuICAgICAgaWYgKGN1cnJlbnQudXBkYXRlQ2FsbGJhY2tzLnNpemUgPT09IDAgJiYgY3VycmVudC5kZXN0cm95Q2FsbGJhY2tzLnNpemUgPT09IDApIHtcbiAgICAgICAgc3ViLmluc3RhbmNlTGlzdGVuZXJzLmRlbGV0ZShpZClcbiAgICAgIH1cbiAgICAgIHN1Yi5tYXliZVRlYXJkb3duKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFuY2UtbGV2ZWwgaG9vayBmaXJlZCB3aGVuIFRISVMgcmVjb3JkIGlzIGRlc3Ryb3llZC5cbiAgICogQHBhcmFtIHsocGF5bG9hZDoge2lkOiBzdHJpbmd9KSA9PiB2b2lkfSBjYWxsYmFjayAtIEV2ZW50IGNhbGxiYWNrLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFByb2plY3Rpb25PcHRpb25zfSBbX29wdGlvbnNdIC0gQWNjZXB0ZWQgZm9yIEFQSSBzeW1tZXRyeTsgZGVzdHJveSBldmVudHMgY2FycnkgaWRzIG9ubHkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPCgpID0+IHZvaWQ+fSAtIFVuc3Vic2NyaWJlIGNhbGxiYWNrLlxuICAgKi9cbiAgYXN5bmMgb25EZXN0cm95KGNhbGxiYWNrLCBfb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qgc2VsZiA9IC8qKiBAdHlwZSB7YW55fSAqLyAodGhpcylcbiAgICBjb25zdCBNb2RlbENsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9ICovICh0aGlzLmNvbnN0cnVjdG9yKVxuICAgIGNvbnN0IHN1YiA9IGVuc3VyZUZyb250ZW5kTW9kZWxFdmVudFN1YnNjcmlwdGlvbihNb2RlbENsYXNzKVxuICAgIGNvbnN0IGlkID0gU3RyaW5nKHNlbGYuaWQoKSlcbiAgICBjb25zdCBlbnRyeSA9IHtjYWxsYmFja31cbiAgICBsZXQgbGlzdGVuZXIgPSBzdWIuaW5zdGFuY2VMaXN0ZW5lcnMuZ2V0KGlkKVxuXG4gICAgaWYgKCFsaXN0ZW5lcikge1xuICAgICAgbGlzdGVuZXIgPSB7aW5zdGFuY2U6IHRoaXMsIHVwZGF0ZUNhbGxiYWNrczogbmV3IFNldCgpLCBkZXN0cm95Q2FsbGJhY2tzOiBuZXcgU2V0KCl9XG4gICAgICBzdWIuaW5zdGFuY2VMaXN0ZW5lcnMuc2V0KGlkLCBsaXN0ZW5lcilcbiAgICB9IGVsc2Uge1xuICAgICAgbGlzdGVuZXIuaW5zdGFuY2UgPSB0aGlzXG4gICAgfVxuXG4gICAgbGlzdGVuZXIuZGVzdHJveUNhbGxiYWNrcy5hZGQoZW50cnkpXG4gICAgYXdhaXQgc3ViLmVuc3VyZVN1YnNjcmliZWQoKVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBzdWIuaW5zdGFuY2VMaXN0ZW5lcnMuZ2V0KGlkKVxuXG4gICAgICBpZiAoIWN1cnJlbnQpIHJldHVyblxuICAgICAgY3VycmVudC5kZXN0cm95Q2FsbGJhY2tzLmRlbGV0ZShlbnRyeSlcblxuICAgICAgaWYgKGN1cnJlbnQudXBkYXRlQ2FsbGJhY2tzLnNpemUgPT09IDAgJiYgY3VycmVudC5kZXN0cm95Q2FsbGJhY2tzLnNpemUgPT09IDApIHtcbiAgICAgICAgc3ViLmluc3RhbmNlTGlzdGVuZXJzLmRlbGV0ZShpZClcbiAgICAgIH1cbiAgICAgIHN1Yi5tYXliZVRlYXJkb3duKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9IFRcbiAgICogQHRoaXMge1R9XG4gICAqIEBwYXJhbSB7Li4uKHN0cmluZyB8IHN0cmluZ1tdIHwgUmVjb3JkPHN0cmluZywgYW55PiB8IEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+KX0gY29sdW1ucyAtIFBsdWNrIGRlZmluaXRpb24ocykuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueVtdPn0gLSBQbHVja2VkIHZhbHVlcy5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBwbHVjayguLi5jb2x1bW5zKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucXVlcnkoKS5wbHVjayguLi5jb2x1bW5zKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRoIC0gUmVsYXRpb25zaGlwIHBhdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW4gLSBDb2x1bW4gb3IgYXR0cmlidXRlIG5hbWUuXG4gICAqIEBwYXJhbSB7XCJlcVwiIHwgXCJsaWtlXCIgfCBcIm5vdEVxXCIgfCBcImd0XCIgfCBcImd0ZXFcIiB8IFwibHRcIiB8IFwibHRlcVwiIHwgXCI+XCIgfCBcIj49XCIgfCBcIjxcIiB8IFwiPD1cIn0gb3BlcmF0b3IgLSBTZWFyY2ggb3BlcmF0b3IuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFNlYXJjaCB2YWx1ZS5cbiAgICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxRdWVyeTxUPn0gLSBRdWVyeSBidWlsZGVyIHdpdGggc2VhcmNoIGZpbHRlci5cbiAgICovXG4gIHN0YXRpYyBzZWFyY2gocGF0aCwgY29sdW1uLCBvcGVyYXRvciwgdmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeSgpLnNlYXJjaChwYXRoLCBjb2x1bW4sIG9wZXJhdG9yLCB2YWx1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gVFxuICAgKiBAdGhpcyB7VH1cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBwYXJhbXMgLSBSYW5zYWNrLXN0eWxlIHBhcmFtcyBoYXNoLlxuICAgKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbFF1ZXJ5PFQ+fSAtIFF1ZXJ5IGJ1aWxkZXIgd2l0aCBSYW5zYWNrIGZpbHRlcnMgYXBwbGllZC5cbiAgICovXG4gIHN0YXRpYyByYW5zYWNrKHBhcmFtcykge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5KCkucmFuc2FjayhwYXJhbXMpXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9IFRcbiAgICogQHRoaXMge1R9XG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgc3RyaW5nW10gfCBbc3RyaW5nLCBzdHJpbmddIHwgQXJyYXk8W3N0cmluZywgc3RyaW5nXT4gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgQXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj59IHNvcnQgLSBTb3J0IGRlZmluaXRpb24ocykuXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsUXVlcnk8VD59IC0gUXVlcnkgYnVpbGRlciB3aXRoIHNvcnQgZGVmaW5pdGlvbnMuXG4gICAqL1xuICBzdGF0aWMgc29ydChzb3J0KSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnkoKS5zb3J0KHNvcnQpXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9IFRcbiAgICogQHRoaXMge1R9XG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgc3RyaW5nW10gfCBbc3RyaW5nLCBzdHJpbmddIHwgQXJyYXk8W3N0cmluZywgc3RyaW5nXT4gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgQXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj59IHNvcnQgLSBTb3J0IGRlZmluaXRpb24ocykuXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsUXVlcnk8VD59IC0gUXVlcnkgYnVpbGRlciB3aXRoIHNvcnQgZGVmaW5pdGlvbnMuXG4gICAqL1xuICBzdGF0aWMgb3JkZXIoc29ydCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5KCkub3JkZXIoc29ydClcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gVFxuICAgKiBAdGhpcyB7VH1cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIGFueT4gfCBBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gZ3JvdXAgLSBHcm91cCBkZWZpbml0aW9uKHMpLlxuICAgKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbFF1ZXJ5PFQ+fSAtIFF1ZXJ5IGJ1aWxkZXIgd2l0aCBncm91cCBkZWZpbml0aW9ucy5cbiAgICovXG4gIHN0YXRpYyBncm91cChncm91cCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5KCkuZ3JvdXAoZ3JvdXApXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9IFRcbiAgICogQHRoaXMge1R9XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ZhbHVlXSAtIFdoZXRoZXIgdG8gcmVxdWVzdCBkaXN0aW5jdCByb3dzLlxuICAgKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbFF1ZXJ5PFQ+fSAtIFF1ZXJ5IGJ1aWxkZXIgd2l0aCBkaXN0aW5jdCBmbGFnLlxuICAgKi9cbiAgc3RhdGljIGRpc3RpbmN0KHZhbHVlID0gdHJ1ZSkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5KCkuZGlzdGluY3QodmFsdWUpXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9IFRcbiAgICogQHRoaXMge1R9XG4gICAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsUXVlcnk8VD59IC0gUXVlcnkgYnVpbGRlci5cbiAgICovXG4gIHN0YXRpYyBxdWVyeSgpIHtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtGcm9udGVuZE1vZGVsUXVlcnk8VD59ICovIChuZXcgRnJvbnRlbmRNb2RlbFF1ZXJ5KHttb2RlbENsYXNzOiB0aGlzfSkpXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9IFRcbiAgICogQHRoaXMge1R9XG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvaW5kZXguanNcIikuTmVzdGVkUHJlbG9hZFJlY29yZCB8IHN0cmluZyB8IEFycmF5PHN0cmluZyB8IGltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L2luZGV4LmpzXCIpLk5lc3RlZFByZWxvYWRSZWNvcmQ+fSBwcmVsb2FkIC0gUHJlbG9hZCBncmFwaC5cbiAgICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxRdWVyeTxUPn0gLSBRdWVyeSB3aXRoIHByZWxvYWQuXG4gICAqL1xuICBzdGF0aWMgcHJlbG9hZChwcmVsb2FkKSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7RnJvbnRlbmRNb2RlbFF1ZXJ5PFQ+fSAqLyAodGhpcy5xdWVyeSgpLnByZWxvYWQocHJlbG9hZCkpXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9IFRcbiAgICogQHRoaXMge1R9XG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10gfCBzdHJpbmc+fSBzZWxlY3QgLSBNb2RlbC1hd2FyZSBhdHRyaWJ1dGUgc2VsZWN0IG1hcC5cbiAgICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxRdWVyeTxUPn0gLSBRdWVyeSB3aXRoIHNlbGVjdGVkIGF0dHJpYnV0ZXMuXG4gICAqL1xuICBzdGF0aWMgc2VsZWN0KHNlbGVjdCkge1xuICAgIHJldHVybiAvKiogQHR5cGUge0Zyb250ZW5kTW9kZWxRdWVyeTxUPn0gKi8gKHRoaXMucXVlcnkoKS5zZWxlY3Qoc2VsZWN0KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gVFxuICAgKiBAdGhpcyB7VH1cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXSB8IHN0cmluZz4gfCBzdHJpbmcgfCBzdHJpbmdbXX0gc2VsZWN0IC0gRXh0cmEgYXR0cmlidXRlcyB0byBsb2FkIGluIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0cywga2V5ZWQgYnkgbW9kZWwgbmFtZSBvciByb290LW1vZGVsIHNob3J0aGFuZC5cbiAgICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxRdWVyeTxUPn0gLSBRdWVyeSB3aXRoIGV4dHJhIHNlbGVjdGVkIGF0dHJpYnV0ZXMuXG4gICAqL1xuICBzdGF0aWMgc2VsZWN0c0V4dHJhKHNlbGVjdCkge1xuICAgIHJldHVybiAvKiogQHR5cGUge0Zyb250ZW5kTW9kZWxRdWVyeTxUPn0gKi8gKHRoaXMucXVlcnkoKS5zZWxlY3RzRXh0cmEoc2VsZWN0KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gVFxuICAgKiBAdGhpcyB7VH1cbiAgICogQHJldHVybnMge1Byb21pc2U8SW5zdGFuY2VUeXBlPFQ+IHwgbnVsbD59IC0gRmlyc3QgbW9kZWwgb3IgbnVsbC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBmaXJzdCgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5xdWVyeSgpLmZpcnN0KClcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gVFxuICAgKiBAdGhpcyB7VH1cbiAgICogQHJldHVybnMge1Byb21pc2U8SW5zdGFuY2VUeXBlPFQ+IHwgbnVsbD59IC0gTGFzdCBtb2RlbCBvciBudWxsLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGxhc3QoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucXVlcnkoKS5sYXN0KClcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gVFxuICAgKiBAdGhpcyB7VH1cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25kaXRpb25zIC0gQXR0cmlidXRlIG1hdGNoIGNvbmRpdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEluc3RhbmNlVHlwZTxUPj59IC0gRXhpc3Rpbmcgb3IgaW5pdGlhbGl6ZWQgbW9kZWwuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZmluZE9ySW5pdGlhbGl6ZUJ5KGNvbmRpdGlvbnMpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5xdWVyeSgpLmZpbmRPckluaXRpYWxpemVCeShjb25kaXRpb25zKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmRpdGlvbnMgLSBBdHRyaWJ1dGUgbWF0Y2ggY29uZGl0aW9ucy5cbiAgICogQHBhcmFtIHsobW9kZWw6IEluc3RhbmNlVHlwZTxUPikgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWR9IFtjYWxsYmFja10gLSBPcHRpb25hbCBjYWxsYmFjayBiZWZvcmUgc2F2ZSB3aGVuIGNyZWF0ZWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEluc3RhbmNlVHlwZTxUPj59IC0gRXhpc3Rpbmcgb3IgbmV3bHkgY3JlYXRlZCBtb2RlbC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBmaW5kT3JDcmVhdGVCeShjb25kaXRpb25zLCBjYWxsYmFjaykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnF1ZXJ5KCkuZmluZE9yQ3JlYXRlQnkoY29uZGl0aW9ucywgY2FsbGJhY2spXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9IFRcbiAgICogQHRoaXMge1R9XG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2F0dHJpYnV0ZXNdIC0gSW5pdGlhbCBhdHRyaWJ1dGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxJbnN0YW5jZVR5cGU8VD4+fSAtIFBlcnNpc3RlZCBtb2RlbC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBjcmVhdGUoYXR0cmlidXRlcyA9IHt9KSB7XG4gICAgY29uc3QgbW9kZWwgPSAvKiogQHR5cGUge0luc3RhbmNlVHlwZTxUPn0gKi8gKG5ldyB0aGlzKGF0dHJpYnV0ZXMpKVxuXG4gICAgYXdhaXQgbW9kZWwuc2F2ZSgpXG5cbiAgICByZXR1cm4gbW9kZWxcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmRpdGlvbnMgLSBmaW5kQnkgY29uZGl0aW9ucy5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgYXNzZXJ0RmluZEJ5Q29uZGl0aW9ucyhjb25kaXRpb25zKSB7XG4gICAgYXNzZXJ0RmluZEJ5Q29uZGl0aW9uc1NoYXBlKGNvbmRpdGlvbnMpXG4gICAgY29uc3Qgbm9ybWFsaXplZENvbmRpdGlvbnMgPSBub3JtYWxpemVGaW5kQ29uZGl0aW9ucyhjb25kaXRpb25zKVxuXG4gICAgT2JqZWN0LmtleXMoY29uZGl0aW9ucykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBhc3NlcnREZWZpbmVkRmluZEJ5Q29uZGl0aW9uVmFsdWUoY29uZGl0aW9uc1trZXldLCBrZXkpXG4gICAgICBhc3NlcnRGaW5kQnlDb25kaXRpb25TZXJpYWxpemF0aW9uUHJlc2VydmVzVmFsdWUoY29uZGl0aW9uc1trZXldLCBub3JtYWxpemVkQ29uZGl0aW9uc1trZXldLCBrZXkpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfVxuICAgKiBAcGFyYW0ge0Zyb250ZW5kTW9kZWxCYXNlfSBtb2RlbCAtIENhbmRpZGF0ZSBtb2RlbC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25kaXRpb25zIC0gTWF0Y2ggY29uZGl0aW9ucy5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgbW9kZWwgbWF0Y2hlcyBhbGwgY29uZGl0aW9ucy5cbiAgICovXG4gIHN0YXRpYyBtYXRjaGVzRmluZEJ5Q29uZGl0aW9ucyhtb2RlbCwgY29uZGl0aW9ucykge1xuICAgIGNvbnN0IG1vZGVsQXR0cmlidXRlcyA9IG1vZGVsLmF0dHJpYnV0ZXMoKVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29uZGl0aW9ucykpIHtcbiAgICAgIGNvbnN0IGV4cGVjdGVkVmFsdWUgPSBjb25kaXRpb25zW2tleV1cbiAgICAgIGNvbnN0IGFjdHVhbFZhbHVlID0gbW9kZWxBdHRyaWJ1dGVzW2tleV1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXhwZWN0ZWRWYWx1ZSkpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYWN0dWFsVmFsdWUpKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmZpbmRCeUNvbmRpdGlvblZhbHVlTWF0Y2hlcyhhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghZXhwZWN0ZWRWYWx1ZS5zb21lKChlbnRyeSkgPT4gdGhpcy5maW5kQnlDb25kaXRpb25WYWx1ZU1hdGNoZXMoYWN0dWFsVmFsdWUsIGVudHJ5KSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghdGhpcy5maW5kQnlDb25kaXRpb25WYWx1ZU1hdGNoZXMoYWN0dWFsVmFsdWUsIGV4cGVjdGVkVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHBhcmFtIHt1bmtub3dufSBhY3R1YWxWYWx1ZSAtIEFjdHVhbCBtb2RlbCB2YWx1ZS5cbiAgICogQHBhcmFtIHt1bmtub3dufSBleHBlY3RlZFZhbHVlIC0gRXhwZWN0ZWQgZmluZCBjb25kaXRpb24gdmFsdWUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdmFsdWVzIG1hdGNoLlxuICAgKi9cbiAgc3RhdGljIGZpbmRCeUNvbmRpdGlvblZhbHVlTWF0Y2hlcyhhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSkge1xuICAgIGlmIChleHBlY3RlZFZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gYWN0dWFsVmFsdWUgPT09IG51bGxcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShleHBlY3RlZFZhbHVlKSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFjdHVhbFZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgaWYgKGFjdHVhbFZhbHVlLmxlbmd0aCAhPT0gZXhwZWN0ZWRWYWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBleHBlY3RlZFZhbHVlLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICBpZiAoIXRoaXMuZmluZEJ5Q29uZGl0aW9uVmFsdWVNYXRjaGVzKGFjdHVhbFZhbHVlW2luZGV4XSwgZXhwZWN0ZWRWYWx1ZVtpbmRleF0pKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBpZiAoZXhwZWN0ZWRWYWx1ZSAmJiB0eXBlb2YgZXhwZWN0ZWRWYWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgaWYgKCFhY3R1YWxWYWx1ZSB8fCB0eXBlb2YgYWN0dWFsVmFsdWUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShhY3R1YWxWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFjdHVhbE9iamVjdCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChhY3R1YWxWYWx1ZSlcbiAgICAgIGNvbnN0IGV4cGVjdGVkT2JqZWN0ID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKGV4cGVjdGVkVmFsdWUpXG4gICAgICBjb25zdCBhY3R1YWxLZXlzID0gT2JqZWN0LmtleXMoYWN0dWFsT2JqZWN0KVxuICAgICAgY29uc3QgZXhwZWN0ZWRLZXlzID0gT2JqZWN0LmtleXMoZXhwZWN0ZWRPYmplY3QpXG5cbiAgICAgIGlmIChhY3R1YWxLZXlzLmxlbmd0aCAhPT0gZXhwZWN0ZWRLZXlzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgZXhwZWN0ZWRLZXlzKSB7XG4gICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFjdHVhbE9iamVjdCwga2V5KSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmZpbmRCeUNvbmRpdGlvblZhbHVlTWF0Y2hlcyhhY3R1YWxPYmplY3Rba2V5XSwgZXhwZWN0ZWRPYmplY3Rba2V5XSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGlmIChhY3R1YWxWYWx1ZSA9PT0gZXhwZWN0ZWRWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5maW5kQnlQcmltaXRpdmVWYWx1ZXNNYXRjaChhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfVxuICAgKiBAcGFyYW0ge3Vua25vd259IGFjdHVhbFZhbHVlIC0gQWN0dWFsIG1vZGVsIHZhbHVlLlxuICAgKiBAcGFyYW0ge3Vua25vd259IGV4cGVjdGVkVmFsdWUgLSBFeHBlY3RlZCBmaW5kIGNvbmRpdGlvbiB2YWx1ZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBwcmltaXRpdmUgdmFsdWVzIG1hdGNoIGFmdGVyIHNhZmUgY29lcmNpb24uXG4gICAqL1xuICBzdGF0aWMgZmluZEJ5UHJpbWl0aXZlVmFsdWVzTWF0Y2goYWN0dWFsVmFsdWUsIGV4cGVjdGVkVmFsdWUpIHtcbiAgICBpZiAoYWN0dWFsVmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmIHR5cGVvZiBleHBlY3RlZFZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gYWN0dWFsVmFsdWUudG9JU09TdHJpbmcoKSA9PT0gZXhwZWN0ZWRWYWx1ZVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgYWN0dWFsVmFsdWUgPT09IFwic3RyaW5nXCIgJiYgZXhwZWN0ZWRWYWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIHJldHVybiBhY3R1YWxWYWx1ZSA9PT0gZXhwZWN0ZWRWYWx1ZS50b0lTT1N0cmluZygpXG4gICAgfVxuXG4gICAgaWYgKGFjdHVhbFZhbHVlIGluc3RhbmNlb2YgRGF0ZSAmJiBleHBlY3RlZFZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgcmV0dXJuIGFjdHVhbFZhbHVlLnRvSVNPU3RyaW5nKCkgPT09IGV4cGVjdGVkVmFsdWUudG9JU09TdHJpbmcoKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgYWN0dWFsVmFsdWUgPT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIGV4cGVjdGVkVmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbmRCeU51bWVyaWNTdHJpbmdNYXRjaGVzTnVtYmVyKGV4cGVjdGVkVmFsdWUsIGFjdHVhbFZhbHVlKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgYWN0dWFsVmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIGV4cGVjdGVkVmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbmRCeU51bWVyaWNTdHJpbmdNYXRjaGVzTnVtYmVyKGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBudW1lcmljU3RyaW5nIC0gTnVtZXJpYyBzdHJpbmcgdmFsdWUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBleHBlY3RlZE51bWJlciAtIE51bWJlciB2YWx1ZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB2YWx1ZXMgcmVwcmVzZW50IHRoZSBzYW1lIG51bWJlci5cbiAgICovXG4gIHN0YXRpYyBmaW5kQnlOdW1lcmljU3RyaW5nTWF0Y2hlc051bWJlcihudW1lcmljU3RyaW5nLCBleHBlY3RlZE51bWJlcikge1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKGV4cGVjdGVkTnVtYmVyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKCEvXi0/XFxkKyg/OlxcLlxcZCspPyQvLnRlc3QobnVtZXJpY1N0cmluZykpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiBOdW1iZXIobnVtZXJpY1N0cmluZykgPT09IGV4cGVjdGVkTnVtYmVyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbbmV3QXR0cmlidXRlc10gLSBOZXcgdmFsdWVzIHRvIGFzc2lnbiBiZWZvcmUgdXBkYXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx0aGlzPn0gLSBVcGRhdGVkIG1vZGVsLlxuICAgKi9cbiAgYXN5bmMgdXBkYXRlKG5ld0F0dHJpYnV0ZXMgPSB7fSkge1xuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gKi8gKHRoaXMuY29uc3RydWN0b3IpXG4gICAgY29uc3QgYXR0YWNobWVudERlZmluaXRpb25zID0gTW9kZWxDbGFzcy5hdHRhY2htZW50RGVmaW5pdGlvbnMoKVxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICBjb25zdCByZWd1bGFyQXR0cmlidXRlcyA9IHt9XG4gICAgLyoqIEB0eXBlIHtBcnJheTx7YXR0YWNobWVudE5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd259Pn0gKi9cbiAgICBjb25zdCBwZW5kaW5nQXR0YWNobWVudHMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBbYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG5ld0F0dHJpYnV0ZXMpKSB7XG4gICAgICBpZiAoYXR0YWNobWVudERlZmluaXRpb25zW2F0dHJpYnV0ZU5hbWVdKSB7XG4gICAgICAgIGlmIChhdHRyaWJ1dGVWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGF0dHJpYnV0ZVZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgcGVuZGluZ0F0dGFjaG1lbnRzLnB1c2goe2F0dGFjaG1lbnROYW1lOiBhdHRyaWJ1dGVOYW1lLCB2YWx1ZTogYXR0cmlidXRlVmFsdWV9KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWd1bGFyQXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSA9IGF0dHJpYnV0ZVZhbHVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKHJlZ3VsYXJBdHRyaWJ1dGVzKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmFzc2lnbkF0dHJpYnV0ZXMocmVndWxhckF0dHJpYnV0ZXMpXG4gICAgICBjb25zdCBjaGFuZ2VkQXR0cmlidXRlcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5jaGFuZ2VzKCkpLm1hcCgoW2F0dHJpYnV0ZU5hbWUsIFssIGN1cnJlbnRWYWx1ZV1dKSA9PiBbYXR0cmlidXRlTmFtZSwgY3VycmVudFZhbHVlXSlcbiAgICAgIClcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBNb2RlbENsYXNzLmV4ZWN1dGVDb21tYW5kKFwidXBkYXRlXCIsIHtcbiAgICAgICAgYXR0cmlidXRlczogY2hhbmdlZEF0dHJpYnV0ZXMsXG4gICAgICAgIGlkOiB0aGlzLnByaW1hcnlLZXlWYWx1ZSgpXG4gICAgICB9KVxuXG4gICAgICB0aGlzLmFzc2lnbkF0dHJpYnV0ZXMoTW9kZWxDbGFzcy5hdHRyaWJ1dGVzRnJvbVJlc3BvbnNlKHJlc3BvbnNlKSlcbiAgICAgIHRoaXMuc2V0SXNOZXdSZWNvcmQoZmFsc2UpXG4gICAgICB0aGlzLl9wZXJzaXN0ZWRBdHRyaWJ1dGVzID0gY2xvbmVGcm9udGVuZE1vZGVsQXR0cmlidXRlcyh0aGlzLmF0dHJpYnV0ZXMoKSlcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHBlbmRpbmdBdHRhY2htZW50IG9mIHBlbmRpbmdBdHRhY2htZW50cykge1xuICAgICAgYXdhaXQgdGhpcy5nZXRBdHRhY2htZW50QnlOYW1lKHBlbmRpbmdBdHRhY2htZW50LmF0dGFjaG1lbnROYW1lKS5hdHRhY2gocGVuZGluZ0F0dGFjaG1lbnQudmFsdWUpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3Vua25vd259IGF0dGFjaG1lbnRJbnB1dCAtIEF0dGFjaG1lbnQgaW5wdXQgb3IgbmFtZWQgYXR0YWNobWVudCBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGF0dGFjaGVkLlxuICAgKi9cbiAgYXN5bmMgYXR0YWNoKGF0dGFjaG1lbnRJbnB1dCkge1xuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gKi8gKHRoaXMuY29uc3RydWN0b3IpXG4gICAgY29uc3QgYXR0YWNobWVudERlZmluaXRpb25zID0gTW9kZWxDbGFzcy5hdHRhY2htZW50RGVmaW5pdGlvbnMoKVxuICAgIGNvbnN0IGF0dGFjaG1lbnROYW1lcyA9IE9iamVjdC5rZXlzKGF0dGFjaG1lbnREZWZpbml0aW9ucylcbiAgICBsZXQgYXR0YWNobWVudE5hbWUgPSBhdHRhY2htZW50TmFtZXNbMF1cbiAgICBsZXQgYWN0dWFsQXR0YWNobWVudElucHV0ID0gYXR0YWNobWVudElucHV0XG5cbiAgICBpZiAoZnJvbnRlbmRBdHRhY2htZW50VmFsdWVJc1BsYWluT2JqZWN0KGF0dGFjaG1lbnRJbnB1dCkpIHtcbiAgICAgIGlmIChcImZpbGVcIiBpbiBhdHRhY2htZW50SW5wdXQgJiYgYXR0YWNobWVudERlZmluaXRpb25zLmZpbGUpIHtcbiAgICAgICAgYXR0YWNobWVudE5hbWUgPSBcImZpbGVcIlxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZU5hbWUgb2YgYXR0YWNobWVudE5hbWVzKSB7XG4gICAgICAgIGlmIChjYW5kaWRhdGVOYW1lIGluIGF0dGFjaG1lbnRJbnB1dCkge1xuICAgICAgICAgIGF0dGFjaG1lbnROYW1lID0gY2FuZGlkYXRlTmFtZVxuICAgICAgICAgIGFjdHVhbEF0dGFjaG1lbnRJbnB1dCA9IGF0dGFjaG1lbnRJbnB1dFtjYW5kaWRhdGVOYW1lXVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWF0dGFjaG1lbnROYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGF0dGFjaG1lbnQgZGVmaW5pdGlvbnMgb24gJHtNb2RlbENsYXNzLm5hbWV9YClcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmdldEF0dGFjaG1lbnRCeU5hbWUoYXR0YWNobWVudE5hbWUpLmF0dGFjaChhY3R1YWxBdHRhY2htZW50SW5wdXQpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8dGhpcz59IC0gU2F2ZWQgbW9kZWwuXG4gICAqL1xuICBhc3luYyBzYXZlKCkge1xuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gKi8gKHRoaXMuY29uc3RydWN0b3IpXG4gICAgY29uc3QgaXNOZXcgPSB0aGlzLmlzTmV3UmVjb3JkKClcbiAgICBjb25zdCBjb21tYW5kVHlwZSA9IGlzTmV3ID8gXCJjcmVhdGVcIiA6IFwidXBkYXRlXCJcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIC8vIEZvciBjcmVhdGVzLCBzZW5kIGFsbCBhc3NpZ25lZCBhdHRyaWJ1dGVzIOKAlCB0aGUgdXNlci1zZXQgaGFzaCB0eXBpY2FsbHlcbiAgICAgIC8vIG9ubHkgY29udGFpbnMgd3JpdGFibGUgZmllbGRzLiBGb3IgdXBkYXRlcywgc2VuZCBvbmx5IGNoYW5nZWRcbiAgICAgIC8vIGF0dHJpYnV0ZXMgc28gc2VydmVyLXNpZGUgc3RyaWN0IHBlcm1pdHMgZG9uJ3QgcmVqZWN0IGZyYW1ld29yay1tYW5hZ2VkXG4gICAgICAvLyBmaWVsZHMgbGlrZSBgaWRgL2BjcmVhdGVkQXRgL2B1cGRhdGVkQXRgIHRoYXQgdGhlIHJlc291cmNlIG5ldmVyIGxpc3RzLlxuICAgICAgYXR0cmlidXRlczogaXNOZXcgPyB0aGlzLmF0dHJpYnV0ZXMoKSA6IHRoaXMuX2NoYW5nZWRBdHRyaWJ1dGVzRm9yU2F2ZSgpXG4gICAgfVxuXG4gICAgaWYgKCFpc05ldykge1xuICAgICAgcGF5bG9hZC5pZCA9IHRoaXMucHJpbWFyeUtleVZhbHVlKClcbiAgICB9XG5cbiAgICBjb25zdCBuZXN0ZWRBdHRyaWJ1dGVzID0gdGhpcy5fYnVpbGROZXN0ZWRBdHRyaWJ1dGVzUGF5bG9hZCgpXG5cbiAgICBpZiAobmVzdGVkQXR0cmlidXRlcyAmJiBPYmplY3Qua2V5cyhuZXN0ZWRBdHRyaWJ1dGVzKS5sZW5ndGggPiAwKSB7XG4gICAgICBwYXlsb2FkLm5lc3RlZEF0dHJpYnV0ZXMgPSBuZXN0ZWRBdHRyaWJ1dGVzXG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBNb2RlbENsYXNzLmV4ZWN1dGVDb21tYW5kKGNvbW1hbmRUeXBlLCBwYXlsb2FkKVxuXG4gICAgdGhpcy5hc3NpZ25BdHRyaWJ1dGVzKE1vZGVsQ2xhc3MuYXR0cmlidXRlc0Zyb21SZXNwb25zZShyZXNwb25zZSkpXG4gICAgdGhpcy5zZXRJc05ld1JlY29yZChmYWxzZSlcbiAgICB0aGlzLl9wZXJzaXN0ZWRBdHRyaWJ1dGVzID0gY2xvbmVGcm9udGVuZE1vZGVsQXR0cmlidXRlcyh0aGlzLmF0dHJpYnV0ZXMoKSlcblxuICAgIHRoaXMuX3JlY29uY2lsZU5lc3RlZEF0dHJpYnV0ZXNGcm9tUmVzcG9uc2UocmVzcG9uc2UpXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN1YnNldCBvZiBgX2F0dHJpYnV0ZXNgIHdob3NlIHZhbHVlIGhhcyBkaXZlcmdlZCBmcm9tXG4gICAqIGBfcGVyc2lzdGVkQXR0cmlidXRlc2AuIFVzZWQgYnkgYHNhdmUoKWAgb24gdGhlIHVwZGF0ZSBwYXRoIHNvIHRoZSBzZXJ2ZXJcbiAgICogcmVjZWl2ZXMgb25seSB0aGUgZmllbGRzIHRoZSBjYWxsZXIgYWN0dWFsbHkgY2hhbmdlZCDigJQgYXZvaWRpbmcgc3RyaWN0XG4gICAqIHBlcm1pdCByZWplY3Rpb25zIG9uIGZyYW1ld29yay1tYW5hZ2VkIGZpZWxkcyBsaWtlIGBpZGAsIGBjcmVhdGVkQXRgLFxuICAgKiBgdXBkYXRlZEF0YCB0aGF0IHRoZSByZXNvdXJjZSBuZXZlciBsaXN0cyBpbiBgcGVybWl0dGVkUGFyYW1zYC5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59IC0gQ2hhbmdlZCBhdHRyaWJ1dGVzIGhhc2guXG4gICAqL1xuICBfY2hhbmdlZEF0dHJpYnV0ZXNGb3JTYXZlKCkge1xuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICBjb25zdCBjaGFuZ2VkQXR0cmlidXRlcyA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IFthdHRyaWJ1dGVOYW1lLCBbLCBjdXJyZW50VmFsdWVdXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmNoYW5nZXMoKSkpIHtcbiAgICAgIGNoYW5nZWRBdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdID0gY3VycmVudFZhbHVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGNoYW5nZWRBdHRyaWJ1dGVzXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBkZXN0cm95ZWQgb24gYmFja2VuZC5cbiAgICovXG4gIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSAqLyAodGhpcy5jb25zdHJ1Y3RvcilcblxuICAgIGF3YWl0IE1vZGVsQ2xhc3MuZXhlY3V0ZUNvbW1hbmQoXCJkZXN0cm95XCIsIHtcbiAgICAgIGlkOiB0aGlzLnByaW1hcnlLZXlWYWx1ZSgpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWxrcyByZWxhdGlvbnNoaXBzIGRlY2xhcmVkIGluIHRoaXMgcmVzb3VyY2UncyBgbmVzdGVkQXR0cmlidXRlc2AgY29uZmlnXG4gICAqIGFuZCBidWlsZHMgdGhlIHBlci1yZWxhdGlvbnNoaXAgcGF5bG9hZCBvZiBkaXJ0eSBjaGlsZHJlbiBmb3IgYSBwYXJlbnQgc2F2ZS5cbiAgICpcbiAgICogSW5jbHVkZWQgY2hpbGRyZW46XG4gICAqICAgLSBuZXcgcmVjb3JkcyAoaXNOZXdSZWNvcmQoKSkg4oaSIGNyZWF0ZSBlbnRyeSB3aXRoIGF0dHJpYnV0ZXNcbiAgICogICAtIHJlY29yZHMgbWFya2VkIGZvciBkZXN0cnVjdGlvbiAobWFya2VkRm9yRGVzdHJ1Y3Rpb24oKSkg4oaSIGRlc3Ryb3kgZW50cnlcbiAgICogICAtIHJlY29yZHMgd2l0aCBjaGFuZ2VkIGF0dHJpYnV0ZXMgKGlzQ2hhbmdlZCgpKSDihpIgdXBkYXRlIGVudHJ5IHdpdGggYXR0cmlidXRlc1xuICAgKiAgIC0gcmVjb3JkcyB3aXRoIGRpcnR5IGRlc2NlbmRhbnRzIGluIHRoZWlyIG93biBuZXN0ZWRBdHRyaWJ1dGVzIOKGkiByZWN1cnNlXG4gICAqXG4gICAqIExvYWRlZCBidXQgdW50b3VjaGVkIHJlY29yZHMgYXJlIG9taXR0ZWQgc28gbmVzdGVkIHNhdmUgcHJlc2VydmVzIFJhaWxzLXN0eWxlXG4gICAqIFwiY2hpbGRyZW4gbm90IHJlZmVyZW5jZWQgaW4gcGF5bG9hZCBhcmUgbGVmdCBhbG9uZVwiIHNlbWFudGljcy5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+Pn0gLSBQZXItcmVsYXRpb25zaGlwIGxpc3Qgb2YgbmVzdGVkLWF0dHJpYnV0ZSBlbnRyaWVzLlxuICAgKi9cbiAgX2J1aWxkTmVzdGVkQXR0cmlidXRlc1BheWxvYWQoKSB7XG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSAqLyAodGhpcy5jb25zdHJ1Y3RvcilcbiAgICBjb25zdCByZXNvdXJjZUNvbmZpZyA9IHR5cGVvZiBNb2RlbENsYXNzLnJlc291cmNlQ29uZmlnID09PSBcImZ1bmN0aW9uXCIgPyBNb2RlbENsYXNzLnJlc291cmNlQ29uZmlnKCkgOiBudWxsXG4gICAgY29uc3QgbmVzdGVkQXR0cmlidXRlc0NvbmZpZyA9IHJlc291cmNlQ29uZmlnPy5uZXN0ZWRBdHRyaWJ1dGVzXG5cbiAgICBpZiAoIW5lc3RlZEF0dHJpYnV0ZXNDb25maWcpIHJldHVybiB7fVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pj59ICovXG4gICAgY29uc3QgcGF5bG9hZCA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgb2YgT2JqZWN0LmtleXMobmVzdGVkQXR0cmlidXRlc0NvbmZpZykpIHtcbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IHRoaXMuX3JlbGF0aW9uc2hpcHNbcmVsYXRpb25zaGlwTmFtZV1cblxuICAgICAgaWYgKCFyZWxhdGlvbnNoaXAgfHwgIShyZWxhdGlvbnNoaXAgaW5zdGFuY2VvZiBGcm9udGVuZE1vZGVsSGFzTWFueVJlbGF0aW9uc2hpcCkpIGNvbnRpbnVlXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVsYXRpb25zaGlwLl9sb2FkZWRWYWx1ZSkgfHwgcmVsYXRpb25zaGlwLl9sb2FkZWRWYWx1ZS5sZW5ndGggPT09IDApIGNvbnRpbnVlXG5cbiAgICAgIC8qKiBAdHlwZSB7QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj59ICovXG4gICAgICBjb25zdCBlbnRyaWVzID0gW11cblxuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiByZWxhdGlvbnNoaXAuX2xvYWRlZFZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkRW50cnkgPSBjaGlsZC5fbmVzdGVkQXR0cmlidXRlc0VudHJ5Rm9yUGFyZW50U2F2ZSgpXG5cbiAgICAgICAgaWYgKGNoaWxkRW50cnkpIGVudHJpZXMucHVzaChjaGlsZEVudHJ5KVxuICAgICAgfVxuXG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHBheWxvYWRbcmVsYXRpb25zaGlwTmFtZV0gPSBlbnRyaWVzXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBheWxvYWRcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIHBheWxvYWQgZW50cnkgZm9yIHRoaXMgY2hpbGQgd2hlbiB3YWxrZWQgYnkgYSBwYXJlbnQnc1xuICAgKiBgX2J1aWxkTmVzdGVkQXR0cmlidXRlc1BheWxvYWRgLiBSZXR1cm5zIGBudWxsYCB3aGVuIHRoZSBjaGlsZCBoYXMgbm9cbiAgICogZGlydHkgc3RhdGUgYW5kIG5vIGRpcnR5IGRlc2NlbmRhbnRzLCBzbyB0aGUgcGFyZW50IGNhbiBvbWl0IGl0LlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55PiB8IG51bGx9IC0gTmVzdGVkLWF0dHJpYnV0ZSBlbnRyeSBvciBudWxsIGlmIGNsZWFuLlxuICAgKi9cbiAgX25lc3RlZEF0dHJpYnV0ZXNFbnRyeUZvclBhcmVudFNhdmUoKSB7XG4gICAgaWYgKHRoaXMubWFya2VkRm9yRGVzdHJ1Y3Rpb24oKSkge1xuICAgICAgaWYgKHRoaXMuaXNOZXdSZWNvcmQoKSkgcmV0dXJuIG51bGxcbiAgICAgIHJldHVybiB7aWQ6IHRoaXMucHJpbWFyeUtleVZhbHVlKCksIF9kZXN0cm95OiB0cnVlfVxuICAgIH1cblxuICAgIGNvbnN0IG5lc3RlZEF0dHJpYnV0ZXMgPSB0aGlzLl9idWlsZE5lc3RlZEF0dHJpYnV0ZXNQYXlsb2FkKClcbiAgICBjb25zdCBoYXNOZXN0ZWREaXJ0eSA9IE9iamVjdC5rZXlzKG5lc3RlZEF0dHJpYnV0ZXMpLmxlbmd0aCA+IDBcblxuICAgIGlmICh0aGlzLmlzTmV3UmVjb3JkKCkpIHtcbiAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICAgIGNvbnN0IGVudHJ5ID0ge2F0dHJpYnV0ZXM6IHRoaXMuYXR0cmlidXRlcygpfVxuXG4gICAgICBpZiAoaGFzTmVzdGVkRGlydHkpIGVudHJ5Lm5lc3RlZEF0dHJpYnV0ZXMgPSBuZXN0ZWRBdHRyaWJ1dGVzXG5cbiAgICAgIHJldHVybiBlbnRyeVxuICAgIH1cblxuICAgIGlmICghdGhpcy5pc0NoYW5nZWQoKSAmJiAhaGFzTmVzdGVkRGlydHkpIHJldHVybiBudWxsXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgY29uc3QgZW50cnkgPSB7aWQ6IHRoaXMucHJpbWFyeUtleVZhbHVlKCl9XG5cbiAgICBpZiAodGhpcy5pc0NoYW5nZWQoKSkgZW50cnkuYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcygpXG4gICAgaWYgKGhhc05lc3RlZERpcnR5KSBlbnRyeS5uZXN0ZWRBdHRyaWJ1dGVzID0gbmVzdGVkQXR0cmlidXRlc1xuXG4gICAgcmV0dXJuIGVudHJ5XG4gIH1cblxuICAvKipcbiAgICogQWZ0ZXIgYSBwYXJlbnQgc2F2ZSB3aXRoIGBuZXN0ZWRBdHRyaWJ1dGVzYCwgdGhlIHNlcnZlciByZXNwb25zZSBpbmNsdWRlc1xuICAgKiBwcmVsb2FkZWQgdmVyc2lvbnMgb2YgdGhlIGFmZmVjdGVkIHJlbGF0aW9uc2hpcHMuIFRoaXMgcmVwbGFjZXMgdGhlIGxvY2FsXG4gICAqIGBfbG9hZGVkVmFsdWVgIGZvciBlYWNoIG5lc3RlZC13cml0YWJsZSByZWxhdGlvbnNoaXAgd2l0aCB0aGUgc2VydmVyJ3NcbiAgICogYXV0aG9yaXRhdGl2ZSBzZXQsIHNvIGRlc3Ryb3llZCBjaGlsZHJlbiBhcmUgZHJvcHBlZCBhbmQgbmV3bHktY3JlYXRlZFxuICAgKiBjaGlsZHJlbiBnZXQgdGhlaXIgc2VydmVyLWFzc2lnbmVkIGlkcyArIHBlcnNpc3RlZCBzdGF0ZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSByZXNwb25zZSAtIENvbW1hbmQgcmVzcG9uc2UgcGF5bG9hZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfcmVjb25jaWxlTmVzdGVkQXR0cmlidXRlc0Zyb21SZXNwb25zZShyZXNwb25zZSkge1xuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gKi8gKHRoaXMuY29uc3RydWN0b3IpXG4gICAgY29uc3QgcmVzb3VyY2VDb25maWcgPSB0eXBlb2YgTW9kZWxDbGFzcy5yZXNvdXJjZUNvbmZpZyA9PT0gXCJmdW5jdGlvblwiID8gTW9kZWxDbGFzcy5yZXNvdXJjZUNvbmZpZygpIDogbnVsbFxuICAgIGNvbnN0IG5lc3RlZEF0dHJpYnV0ZXNDb25maWcgPSByZXNvdXJjZUNvbmZpZz8ubmVzdGVkQXR0cmlidXRlc1xuXG4gICAgaWYgKCFuZXN0ZWRBdHRyaWJ1dGVzQ29uZmlnKSByZXR1cm5cblxuICAgIGNvbnN0IG1vZGVsRGF0YSA9IE1vZGVsQ2xhc3MubW9kZWxEYXRhRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgIGNvbnN0IHByZWxvYWRlZFJlbGF0aW9uc2hpcHMgPSBtb2RlbERhdGEucHJlbG9hZGVkUmVsYXRpb25zaGlwc1xuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgIGNvbnN0IHJlbGV2YW50UHJlbG9hZHMgPSB7fVxuXG4gICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBOYW1lIG9mIE9iamVjdC5rZXlzKG5lc3RlZEF0dHJpYnV0ZXNDb25maWcpKSB7XG4gICAgICBpZiAocmVsYXRpb25zaGlwTmFtZSBpbiBwcmVsb2FkZWRSZWxhdGlvbnNoaXBzKSB7XG4gICAgICAgIHJlbGV2YW50UHJlbG9hZHNbcmVsYXRpb25zaGlwTmFtZV0gPSBwcmVsb2FkZWRSZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKHJlbGV2YW50UHJlbG9hZHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIE1vZGVsQ2xhc3MuYXBwbHlQcmVsb2FkZWRSZWxhdGlvbnNoaXBzKHRoaXMsIHJlbGV2YW50UHJlbG9hZHMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9XG4gICAqIEBwYXJhbSB7RnJvbnRlbmRNb2RlbENvbW1hbmRUeXBlfSBjb21tYW5kVHlwZSAtIENvbW1hbmQgdHlwZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBwYXlsb2FkIC0gQ29tbWFuZCBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gLSBQYXJzZWQgSlNPTiByZXNwb25zZS5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBleGVjdXRlQ29tbWFuZChjb21tYW5kVHlwZSwgcGF5bG9hZCkge1xuICAgIGNvbnN0IGNvbW1hbmROYW1lID0gdGhpcy5jb21tYW5kTmFtZShjb21tYW5kVHlwZSlcbiAgICBjb25zdCBzZXJpYWxpemVkUGF5bG9hZCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi8gKHNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZShwYXlsb2FkKSlcbiAgICBjb25zdCByZXNvdXJjZVBhdGggPSB0aGlzLnJlc291cmNlUGF0aCgpXG4gICAgY29uc3QgY29udGFpbnNBdHRhY2htZW50VXBsb2FkID0gZnJvbnRlbmRNb2RlbFBheWxvYWRDb250YWluc0F0dGFjaG1lbnRVcGxvYWQoc2VyaWFsaXplZFBheWxvYWQpXG4gICAgY29uc3QgdXNlU2hhcmVkVHJhbnNwb3J0ID0gIWNvbnRhaW5zQXR0YWNobWVudFVwbG9hZFxuICAgIGNvbnN0IHVybCA9IHVzZVNoYXJlZFRyYW5zcG9ydCA/IGZyb250ZW5kTW9kZWxBcGlVcmwoKSA6IGZyb250ZW5kTW9kZWxDb21tYW5kVXJsKHJlc291cmNlUGF0aCB8fCBcIlwiLCBjb21tYW5kTmFtZSlcblxuICAgIGlmICh1c2VTaGFyZWRUcmFuc3BvcnQpIHtcbiAgICAgIGNvbnN0IGJhdGNoUmVzcG9uc2UgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHBlbmRpbmdTaGFyZWRGcm9udGVuZE1vZGVsUmVxdWVzdHMucHVzaCh7XG4gICAgICAgICAgY29tbWFuZE5hbWUsXG4gICAgICAgICAgY29tbWFuZFR5cGUsXG4gICAgICAgICAgbW9kZWxDbGFzczogdGhpcyxcbiAgICAgICAgICBwYXlsb2FkOiBzZXJpYWxpemVkUGF5bG9hZCxcbiAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgcmVxdWVzdElkOiBgJHsrK3NoYXJlZEZyb250ZW5kTW9kZWxSZXF1ZXN0SWR9YCxcbiAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgIHJlc291cmNlUGF0aFxuICAgICAgICB9KVxuXG4gICAgICAgIHNjaGVkdWxlU2hhcmVkRnJvbnRlbmRNb2RlbFJlcXVlc3RGbHVzaCgpXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBkZWNvZGVkQmF0Y2hSZXNwb25zZSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi8gKGJhdGNoUmVzcG9uc2UpXG5cbiAgICAgIHRoaXMudGhyb3dPbkVycm9yRnJvbnRlbmRNb2RlbFJlc3BvbnNlKHtcbiAgICAgICAgY29tbWFuZFR5cGUsXG4gICAgICAgIHJlc3BvbnNlOiBkZWNvZGVkQmF0Y2hSZXNwb25zZVxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIGRlY29kZWRCYXRjaFJlc3BvbnNlXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRyYWNrRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFJlcXVlc3QoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZGlyZWN0UmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZFBheWxvYWQpLFxuICAgICAgICBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICB9LFxuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiXG4gICAgICB9KVxuXG4gICAgICBpZiAoIWRpcmVjdFJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVxdWVzdCBmYWlsZWQgKCR7ZGlyZWN0UmVzcG9uc2Uuc3RhdHVzfSkgZm9yICR7dGhpcy5uYW1lfSMke2NvbW1hbmRUeXBlfWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRpcmVjdFJlc3BvbnNlVGV4dCA9IGF3YWl0IGRpcmVjdFJlc3BvbnNlLnRleHQoKVxuICAgICAgY29uc3QgZGlyZWN0SnNvbiA9IGRpcmVjdFJlc3BvbnNlVGV4dC5sZW5ndGggPiAwID8gSlNPTi5wYXJzZShkaXJlY3RSZXNwb25zZVRleHQpIDoge31cbiAgICAgIGNvbnN0IGRlY29kZWREaXJlY3RSZXNwb25zZSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi8gKGRlc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlKGRpcmVjdEpzb24pKVxuXG4gICAgICB0aGlzLnRocm93T25FcnJvckZyb250ZW5kTW9kZWxSZXNwb25zZSh7XG4gICAgICAgIGNvbW1hbmRUeXBlLFxuICAgICAgICByZXNwb25zZTogZGVjb2RlZERpcmVjdFJlc3BvbnNlXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gZGVjb2RlZERpcmVjdFJlc3BvbnNlXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfVxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIENvbW1hbmQgYXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jb21tYW5kTmFtZSAtIFJhdyBjb21tYW5kIHBhdGggc2VnbWVudC5cbiAgICogQHBhcmFtIHtGcm9udGVuZE1vZGVsUmVxdWVzdENvbW1hbmRUeXBlfSBhcmdzLmNvbW1hbmRUeXBlIC0gTG9naWNhbCBjb21tYW5kIHR5cGUgZm9yIGVycm9yIGhhbmRsaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlciB8IG51bGx9IFthcmdzLm1lbWJlcklkXSAtIE9wdGlvbmFsIG1lbWJlciBpZCBmb3IgbWVtYmVyLXNjb3BlZCBjb21tYW5kcy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBhcmdzLnBheWxvYWQgLSBSZXF1ZXN0IHBheWxvYWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnJlc291cmNlUGF0aCAtIERpcmVjdCByZXNvdXJjZSBwYXRoLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gLSBEZWNvZGVkIHJlc3BvbnNlIHBheWxvYWQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZXhlY3V0ZUN1c3RvbUNvbW1hbmQoe2NvbW1hbmROYW1lLCBjb21tYW5kVHlwZSwgbWVtYmVySWQgPSBudWxsLCBwYXlsb2FkLCByZXNvdXJjZVBhdGh9KSB7XG4gICAgY29uc3Qgc2VyaWFsaXplZFBheWxvYWQgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovIChzZXJpYWxpemVGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWUocGF5bG9hZCkpXG4gICAgY29uc3QgY3VzdG9tUGF0aCA9IGZyb250ZW5kTW9kZWxDdXN0b21Db21tYW5kUGF0aCh7XG4gICAgICBjb21tYW5kTmFtZSxcbiAgICAgIG1lbWJlcklkLFxuICAgICAgbW9kZWxOYW1lOiB0aGlzLmdldE1vZGVsTmFtZSgpLFxuICAgICAgcmVzb3VyY2VQYXRoXG4gICAgfSlcblxuICAgIGNvbnN0IGJhdGNoUmVzcG9uc2UgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBwZW5kaW5nU2hhcmVkRnJvbnRlbmRNb2RlbFJlcXVlc3RzLnB1c2goe1xuICAgICAgICBjb21tYW5kVHlwZSxcbiAgICAgICAgY3VzdG9tUGF0aCxcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcyxcbiAgICAgICAgcGF5bG9hZDogc2VyaWFsaXplZFBheWxvYWQsXG4gICAgICAgIHJlamVjdCxcbiAgICAgICAgcmVxdWVzdElkOiBgJHsrK3NoYXJlZEZyb250ZW5kTW9kZWxSZXF1ZXN0SWR9YCxcbiAgICAgICAgcmVzb2x2ZVxuICAgICAgfSlcblxuICAgICAgc2NoZWR1bGVTaGFyZWRGcm9udGVuZE1vZGVsUmVxdWVzdEZsdXNoKClcbiAgICB9KVxuXG4gICAgY29uc3QgZGVjb2RlZEJhdGNoUmVzcG9uc2UgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovIChiYXRjaFJlc3BvbnNlKVxuXG4gICAgdGhpcy50aHJvd09uRXJyb3JGcm9udGVuZE1vZGVsUmVzcG9uc2Uoe1xuICAgICAgY29tbWFuZFR5cGUsXG4gICAgICByZXNwb25zZTogZGVjb2RlZEJhdGNoUmVzcG9uc2VcbiAgICB9KVxuXG4gICAgcmV0dXJuIGRlY29kZWRCYXRjaFJlc3BvbnNlXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRNb2RlbFJlcXVlc3RDb21tYW5kVHlwZX0gYXJncy5jb21tYW5kVHlwZSAtIENvbW1hbmQgdHlwZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBhcmdzLnJlc3BvbnNlIC0gRGVjb2RlZCByZXNwb25zZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgdGhyb3dPbkVycm9yRnJvbnRlbmRNb2RlbFJlc3BvbnNlKHtjb21tYW5kVHlwZSwgcmVzcG9uc2V9KSB7XG4gICAgaWYgKHJlc3BvbnNlPy5zdGF0dXMgIT09IFwiZXJyb3JcIikgcmV0dXJuXG5cbiAgICBjb25zdCByZXNwb25zZUtleXMgPSBPYmplY3Qua2V5cyhyZXNwb25zZSlcbiAgICBjb25zdCBoYXNPbmx5U3RhdHVzID0gcmVzcG9uc2VLZXlzLmxlbmd0aCA9PT0gMSAmJiByZXNwb25zZUtleXNbMF0gPT09IFwic3RhdHVzXCJcbiAgICBjb25zdCBoYXNFcnJvck1lc3NhZ2UgPSB0eXBlb2YgcmVzcG9uc2UuZXJyb3JNZXNzYWdlID09PSBcInN0cmluZ1wiICYmIHJlc3BvbnNlLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXG4gICAgY29uc3QgaGFzRXJyb3JFbnZlbG9wZUtleXMgPSBCb29sZWFuKFxuICAgICAgcmVzcG9uc2UuY29kZSAhPT0gdW5kZWZpbmVkXG4gICAgICB8fCByZXNwb25zZS5lcnJvciAhPT0gdW5kZWZpbmVkXG4gICAgICB8fCByZXNwb25zZS5lcnJvcnMgIT09IHVuZGVmaW5lZFxuICAgICAgfHwgcmVzcG9uc2UubWVzc2FnZSAhPT0gdW5kZWZpbmVkXG4gICAgKVxuICAgIGNvbnN0IG5vblN0YXR1c0tleXMgPSByZXNwb25zZUtleXMuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gXCJzdGF0dXNcIilcbiAgICBjb25zdCBjb25maWd1cmVkQXR0cmlidXRlTmFtZXMgPSB0aGlzLmNvbmZpZ3VyZWRGcm9udGVuZE1vZGVsQXR0cmlidXRlTmFtZXMoKVxuICAgIGNvbnN0IGxvb2tzTGlrZVJhd01vZGVsUGF5bG9hZCA9IG5vblN0YXR1c0tleXMubGVuZ3RoID4gMFxuICAgICAgJiYgbm9uU3RhdHVzS2V5cy5ldmVyeSgoa2V5KSA9PiBjb25maWd1cmVkQXR0cmlidXRlTmFtZXMuaGFzKGtleSkpXG5cbiAgICBpZiAoIWhhc0Vycm9yTWVzc2FnZSAmJiAhaGFzT25seVN0YXR1cyAmJiAhaGFzRXJyb3JFbnZlbG9wZUtleXMgJiYgbG9va3NMaWtlUmF3TW9kZWxQYXlsb2FkKSByZXR1cm5cblxuICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGhhc0Vycm9yTWVzc2FnZVxuICAgICAgPyByZXNwb25zZS5lcnJvck1lc3NhZ2VcbiAgICAgIDogYFJlcXVlc3QgZmFpbGVkIGZvciAke3RoaXMubmFtZX0jJHtjb21tYW5kVHlwZX1gXG5cbiAgICBjb25zdCBlcnJvciA9IC8qKiBAdHlwZSB7RXJyb3IgJiB7dmVsb2Npb3VzPzogUmVjb3JkPHN0cmluZywgYW55PiwgZXJyb3JUeXBlPzogc3RyaW5nLCB2YWxpZGF0aW9uRXJyb3JzPzogUmVjb3JkPHN0cmluZywgYW55Pn19ICovIChuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKSlcbiAgICBpZiAocmVzcG9uc2UudmVsb2Npb3VzICYmIHR5cGVvZiByZXNwb25zZS52ZWxvY2lvdXMgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGVycm9yLnZlbG9jaW91cyA9IHJlc3BvbnNlLnZlbG9jaW91c1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJlc3BvbnNlLmVycm9yVHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgZXJyb3IuZXJyb3JUeXBlID0gcmVzcG9uc2UuZXJyb3JUeXBlXG4gICAgfVxuICAgIGlmIChyZXNwb25zZS52YWxpZGF0aW9uRXJyb3JzICYmIHR5cGVvZiByZXNwb25zZS52YWxpZGF0aW9uRXJyb3JzID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBlcnJvci52YWxpZGF0aW9uRXJyb3JzID0gcmVzcG9uc2UudmFsaWRhdGlvbkVycm9yc1xuICAgIH1cbiAgICB0aHJvdyBlcnJvclxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9XG4gICAqIEByZXR1cm5zIHtTZXQ8c3RyaW5nPn0gLSBDb25maWd1cmVkIGZyb250ZW5kIG1vZGVsIGF0dHJpYnV0ZSBuYW1lcy5cbiAgICovXG4gIHN0YXRpYyBjb25maWd1cmVkRnJvbnRlbmRNb2RlbEF0dHJpYnV0ZU5hbWVzKCkge1xuICAgIGNvbnN0IHJlc291cmNlQ29uZmlnID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqLyAodGhpcy5yZXNvdXJjZUNvbmZpZygpKVxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSByZXNvdXJjZUNvbmZpZy5hdHRyaWJ1dGVzXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShhdHRyaWJ1dGVzKSkge1xuICAgICAgcmV0dXJuIG5ldyBTZXQoYXR0cmlidXRlcy5maWx0ZXIoKGF0dHJpYnV0ZU5hbWUpID0+IHR5cGVvZiBhdHRyaWJ1dGVOYW1lID09PSBcInN0cmluZ1wiKSlcbiAgICB9XG5cbiAgICBpZiAoYXR0cmlidXRlcyAmJiB0eXBlb2YgYXR0cmlidXRlcyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIG5ldyBTZXQoT2JqZWN0LmtleXMoYXR0cmlidXRlcykpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBTZXQoKVxuICB9XG59XG4iXX0=
|
|
3165
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mcm9udGVuZC1tb2RlbHMvYmFzZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFDeEMsT0FBTyxPQUFPLE1BQU0sMkJBQTJCLENBQUE7QUFDL0MsT0FBTyxJQUFJLE1BQU0sd0JBQXdCLENBQUE7QUFDekMsT0FBTyxrQkFBa0IsRUFBRSxFQUFDLGdDQUFnQyxFQUFDLE1BQU0sWUFBWSxDQUFBO0FBQy9FLE9BQU8sc0JBQXNCLE1BQU0sZ0JBQWdCLENBQUE7QUFDbkQsT0FBTyxFQUFDLHFCQUFxQixFQUFFLHlCQUF5QixFQUFDLE1BQU0scUJBQXFCLENBQUE7QUFDcEYsT0FBTyxFQUFDLHdDQUF3QyxFQUFFLGlDQUFpQyxFQUFDLE1BQU0saUNBQWlDLENBQUE7QUFDM0gsT0FBTyxFQUFDLHNDQUFzQyxFQUFFLG9DQUFvQyxFQUFDLE1BQU0sOEJBQThCLENBQUE7QUFDekgsT0FBTyx3QkFBd0IsTUFBTSxvQ0FBb0MsQ0FBQTtBQUN6RSxPQUFPLEVBQUMsbUJBQW1CLEVBQUUsMkJBQTJCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQTtBQUMzRixPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUV4RCw2SEFBNkg7QUFDN0gsbUZBQW1GO0FBQ25GOztHQUVHO0FBQ0g7O0dBRUc7QUFDSDs7Ozs7Ozs7R0FRRztBQUNIOzs7O0dBSUc7QUFFSCwyQ0FBMkM7QUFDM0MsTUFBTSw0QkFBNEIsR0FBRyxFQUFFLENBQUE7QUFDdkMsTUFBTSw4QkFBOEIsR0FBRyxrQkFBa0IsQ0FBQTtBQUN6RCxNQUFNLDJCQUEyQixHQUFHLDBCQUEwQixDQUFBO0FBQzlELE1BQU0sdUJBQXVCLEdBQUcsc0JBQXNCLENBQUE7QUFDdEQsTUFBTSxzQkFBc0IsR0FBRyxxQkFBcUIsQ0FBQTtBQUNwRCxN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LEtBQUssQ0FBQTtJQUNiLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMscUNBQXFDO1FBQzFDLE1BQU0sY0FBYyxHQUFHLGtDQUFrQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUE7UUFDakYsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLFVBQVUsQ0FBQTtRQUU1QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUM5QixPQUFPLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLE9BQU8sYUFBYSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFDekYsQ0FBQztRQUVELElBQUksVUFBVSxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2pELE9BQU8sSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO1FBQ3pDLENBQUM7UUFFRCxPQUFPLElBQUksR0FBRyxFQUFFLENBQUE7SUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgKiBhcyBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcbmltcG9ydCB0aW1lb3V0IGZyb20gXCJhd2FpdGVyeS9idWlsZC90aW1lb3V0LmpzXCJcbmltcG9ydCB3YWl0IGZyb20gXCJhd2FpdGVyeS9idWlsZC93YWl0LmpzXCJcbmltcG9ydCBGcm9udGVuZE1vZGVsUXVlcnksIHtmcm9udGVuZE1vZGVsRXZlbnRPcHRpb25zUGF5bG9hZH0gZnJvbSBcIi4vcXVlcnkuanNcIlxuaW1wb3J0IEZyb250ZW5kTW9kZWxQcmVsb2FkZXIgZnJvbSBcIi4vcHJlbG9hZGVyLmpzXCJcbmltcG9ydCB7cmVnaXN0ZXJGcm9udGVuZE1vZGVsLCByZXNvbHZlRnJvbnRlbmRNb2RlbENsYXNzfSBmcm9tIFwiLi9tb2RlbC1yZWdpc3RyeS5qc1wiXG5pbXBvcnQge3ZhbGlkYXRlRnJvbnRlbmRNb2RlbFJlc291cmNlQ29tbWFuZE5hbWUsIHZhbGlkYXRlRnJvbnRlbmRNb2RlbFJlc291cmNlUGF0aH0gZnJvbSBcIi4vcmVzb3VyY2UtY29uZmlnLXZhbGlkYXRpb24uanNcIlxuaW1wb3J0IHtkZXNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZSwgc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlfSBmcm9tIFwiLi90cmFuc3BvcnQtc2VyaWFsaXphdGlvbi5qc1wiXG5pbXBvcnQgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50IGZyb20gXCIuLi9odHRwLWNsaWVudC93ZWJzb2NrZXQtY2xpZW50LmpzXCJcbmltcG9ydCB7YnVmZmVyT3V0Z29pbmdFdmVudCwgZHJhaW5CdWZmZXJlZE91dGdvaW5nRXZlbnRzfSBmcm9tIFwiLi9vdXRnb2luZy1ldmVudC1idWZmZXIuanNcIlxuaW1wb3J0IHtkZWZpbmVNb2RlbFNjb3BlfSBmcm9tIFwiLi4vdXRpbHMvbW9kZWwtc2NvcGUuanNcIlxuXG4vKiogQHR5cGVkZWYge1wiY3JlYXRlXCIgfCBcImZpbmRcIiB8IFwiaW5kZXhcIiB8IFwidXBkYXRlXCIgfCBcImRlc3Ryb3lcIiB8IFwiYXR0YWNoXCIgfCBcImRvd25sb2FkXCIgfCBcInVybFwifSBGcm9udGVuZE1vZGVsQ29tbWFuZFR5cGUgKi9cbi8qKiBAdHlwZWRlZiB7RnJvbnRlbmRNb2RlbENvbW1hbmRUeXBlIHwgc3RyaW5nfSBGcm9udGVuZE1vZGVsUmVxdWVzdENvbW1hbmRUeXBlICovXG4vKipcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJoYXNPbmVcIiB8IFwiaGFzTWFueVwifX0gRnJvbnRlbmRNb2RlbEF0dGFjaG1lbnREZWZpbml0aW9uXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge3thdHRyaWJ1dGVzPzogc3RyaW5nW10sIGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHM/OiBzdHJpbmdbXSwgYnVpbHRJbk1lbWJlckNvbW1hbmRzPzogc3RyaW5nW10sIGNvbGxlY3Rpb25Db21tYW5kcz86IHN0cmluZ1tdLCBjb21tYW5kcz86IHN0cmluZ1tdLCBtZW1iZXJDb21tYW5kcz86IHN0cmluZ1tdLCBhdHRhY2htZW50cz86IFJlY29yZDxzdHJpbmcsIEZyb250ZW5kTW9kZWxBdHRhY2htZW50RGVmaW5pdGlvbj4sIG1vZGVsTmFtZT86IHN0cmluZywgbmVzdGVkQXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHthbGxvd0Rlc3Ryb3k/OiBib29sZWFuLCBsaW1pdD86IG51bWJlcn0+LCBwcmltYXJ5S2V5Pzogc3RyaW5nLCByZWxhdGlvbnNoaXBzPzogc3RyaW5nW119fSBGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWdcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnXG4gKiBAcHJvcGVydHkge3N0cmluZyB8ICgoKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsKX0gW3VybF0gLSBPcHRpb25hbCBmcm9udGVuZC1tb2RlbCBVUkwuIFRoaXMgc2hvdWxkIGJlIHRoZSBzaGFyZWQgZW5kcG9pbnQgKGZvciBleGFtcGxlIGBcIi9mcm9udGVuZC1tb2RlbHNcImAgb3IgYFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9mcm9udGVuZC1tb2RlbHNcImApLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2hhcmVkXSAtIERlcHJlY2F0ZWQgc2hhcmVkLWVuZHBvaW50IGZsYWcgcmV0YWluZWQgZm9yIGNvbXBhdGliaWxpdHkuIEZyb250ZW5kLW1vZGVsIENSVUQvY3VzdG9tIGNvbW1hbmRzIHVzZSB0aGUgc2hhcmVkIGZyb250ZW5kLW1vZGVsIEFQSSBlbnZlbG9wZSBieSBkZWZhdWx0LlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCAoKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCl9IFt3ZWJzb2NrZXRVcmxdIC0gT3B0aW9uYWwgd2Vic29ja2V0IFVSTC4gV2hlbiBzZXQsIFZlbG9jaW91cyBjcmVhdGVzIGFuZCBtYW5hZ2VzIGl0cyBvd24gd2Vic29ja2V0IGNsaWVudCBpbnRlcm5hbGx5LiBTdWJzY3JpcHRpb25zIHVzZSB0aGUgd2Vic29ja2V0OyBDUlVEIHVzZXMgSFRUUCBhbmQgZmFsbHMgYmFjayBncmFjZWZ1bGx5LiBFeGFtcGxlOiBgXCJ3czovL2xvY2FsaG9zdDozMDA2L3dlYnNvY2tldFwiYC5cbiAqIEBwcm9wZXJ0eSB7e3Bvc3Q6IChwYXRoOiBzdHJpbmcsIGJvZHk/OiBhbnksIG9wdGlvbnM/OiB7aGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz59KSA9PiBQcm9taXNlPHtqc29uOiAoKSA9PiBhbnl9Piwgc3Vic2NyaWJlOiAoY2hhbm5lbDogc3RyaW5nLCBvcHRpb25zOiB7cGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55Pn0sIGNhbGxiYWNrOiAocGF5bG9hZDogYW55KSA9PiB2b2lkKSA9PiAoKCkgPT4gdm9pZCksIHN1YnNjcmliZUFuZFdhaXQ/OiAoY2hhbm5lbDogc3RyaW5nLCBvcHRpb25zOiB7cGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55Pn0sIGNhbGxiYWNrOiAocGF5bG9hZDogYW55KSA9PiB2b2lkKSA9PiBQcm9taXNlPCgoKSA9PiB2b2lkKT59fSBbd2Vic29ja2V0Q2xpZW50XSAtIE9wdGlvbmFsIHdlYnNvY2tldCBjbGllbnQgZm9yIHNoYXJlZCBmcm9udGVuZC1tb2RlbCBBUEkgcmVxdWVzdHMgYW5kIHN1YnNjcmlwdGlvbnMuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIHN0cmluZz4gfCAoKCkgPT4gUmVjb3JkPHN0cmluZywgc3RyaW5nPil9IFtyZXF1ZXN0SGVhZGVyc10gLSBFeHRyYSBIVFRQL1dTIGhlYWRlcnMgdG8gYXR0YWNoIHRvIGV2ZXJ5IGZyb250ZW5kLW1vZGVsIEFQSSByZXF1ZXN0LiBQYXNzIGEgZnVuY3Rpb24gdG8gY29tcHV0ZSB0aGVtIGF0IHJlcXVlc3QgdGltZSAoZm9yIGV4YW1wbGUgdG8gaW5jbHVkZSB0aGUgY3VycmVudCBsb2NhbGUpLlxuICogQHByb3BlcnR5IHt7Z2V0OiAoKSA9PiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPiwgc2V0OiAoc2Vzc2lvbklkOiBzdHJpbmcpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+LCBjbGVhcjogKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD59fSBbc2Vzc2lvblN0b3JlXSAtIE9wdGlvbmFsIHNlc3Npb25JZCBwZXJzaXN0ZW5jZSBob29rIGZvcndhcmRlZCB0byB0aGUgaW50ZXJuYWwgYFZlbG9jaW91c1dlYnNvY2tldENsaWVudGAgc28gV1Mgc2Vzc2lvbnMgY2FuIGJlIHJlc3VtZWQgYWNyb3NzIHBhZ2UgcmVsb2FkcyAvIGFwcCByZXN0YXJ0cy5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGcm9udGVuZE1vZGVsSWRsZVdhaXRBcmdzXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3F1aWV0TXNdIC0gTWlsbGlzZWNvbmRzIHRoZSB0cmFuc3BvcnQgbXVzdCBzdGF5IGlkbGUgYmVmb3JlIHJlc29sdmluZy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF0gLSBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcy5cbiAqL1xuXG4vKiogQHR5cGUge0Zyb250ZW5kTW9kZWxUcmFuc3BvcnRDb25maWd9ICovXG5jb25zdCBmcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnID0ge31cbmNvbnN0IFNIQVJFRF9GUk9OVEVORF9NT0RFTF9BUElfUEFUSCA9IFwiL2Zyb250ZW5kLW1vZGVsc1wiXG5jb25zdCBQUkVMT0FERURfUkVMQVRJT05TSElQU19LRVkgPSBcIl9fcHJlbG9hZGVkUmVsYXRpb25zaGlwc1wiXG5jb25zdCBTRUxFQ1RFRF9BVFRSSUJVVEVTX0tFWSA9IFwiX19zZWxlY3RlZEF0dHJpYnV0ZXNcIlxuY29uc3QgQVNTT0NJQVRJT05fQ09VTlRTX0tFWSA9IFwiX19hc3NvY2lhdGlvbkNvdW50c1wiXG5jb25zdCBRVUVSWV9EQVRBX0tFWSA9IFwiX19xdWVyeURhdGFcIlxuY29uc3QgQUJJTElUSUVTX0tFWSA9IFwiX19hYmlsaXRpZXNcIlxuLyoqIEB0eXBlIHtBcnJheTx7Y29tbWFuZE5hbWU/OiBzdHJpbmcsIGNvbW1hbmRUeXBlOiBGcm9udGVuZE1vZGVsUmVxdWVzdENvbW1hbmRUeXBlLCBjdXN0b21QYXRoPzogc3RyaW5nLCBtb2RlbENsYXNzOiB0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2UsIHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIGFueT4sIHJlcXVlc3RJZDogc3RyaW5nLCByZXNvbHZlOiAocmVzcG9uc2U6IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHZvaWQsIHJlamVjdDogKGVycm9yOiB1bmtub3duKSA9PiB2b2lkLCByZXNvdXJjZVBhdGg/OiBzdHJpbmcgfCBudWxsfT59ICovXG5sZXQgcGVuZGluZ1NoYXJlZEZyb250ZW5kTW9kZWxSZXF1ZXN0cyA9IFtdXG5sZXQgc2hhcmVkRnJvbnRlbmRNb2RlbFJlcXVlc3RJZCA9IDBcbmxldCBzaGFyZWRGcm9udGVuZE1vZGVsRmx1c2hTY2hlZHVsZWQgPSBmYWxzZVxubGV0IGFjdGl2ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRSZXF1ZXN0Q291bnQgPSAwXG4vKiogQHR5cGUge0FycmF5PCgpID0+IHZvaWQ+fSAqL1xubGV0IGZyb250ZW5kTW9kZWxJZGxlUmVzb2x2ZXJzID0gW11cblxuLyoqIEB0eXBlIHtWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnQgfCBudWxsfSAqL1xubGV0IGludGVybmFsV2Vic29ja2V0Q2xpZW50ID0gbnVsbFxuXG4vKiogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBhbGwgcXVldWVkIGFuZCBhY3RpdmUgZnJvbnRlbmQtbW9kZWwgdHJhbnNwb3J0IHJlcXVlc3RzIGFyZSBkb25lLiAqL1xuZnVuY3Rpb24gZnJvbnRlbmRNb2RlbFRyYW5zcG9ydElzSWRsZSgpIHtcbiAgcmV0dXJuIGFjdGl2ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRSZXF1ZXN0Q291bnQgPT09IDBcbiAgICAmJiBwZW5kaW5nU2hhcmVkRnJvbnRlbmRNb2RlbFJlcXVlc3RzLmxlbmd0aCA9PT0gMFxuICAgICYmICFzaGFyZWRGcm9udGVuZE1vZGVsRmx1c2hTY2hlZHVsZWRcbn1cblxuLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuZnVuY3Rpb24gcmVzb2x2ZUZyb250ZW5kTW9kZWxJZGxlV2FpdGVycygpIHtcbiAgaWYgKCFmcm9udGVuZE1vZGVsVHJhbnNwb3J0SXNJZGxlKCkpIHJldHVyblxuXG4gIGNvbnN0IHJlc29sdmVycyA9IGZyb250ZW5kTW9kZWxJZGxlUmVzb2x2ZXJzXG4gIGZyb250ZW5kTW9kZWxJZGxlUmVzb2x2ZXJzID0gW11cblxuICBmb3IgKGNvbnN0IHJlc29sdmUgb2YgcmVzb2x2ZXJzKSB7XG4gICAgcmVzb2x2ZSgpXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gbWlsbGlzZWNvbmRzIC0gUXVpZXQgcGVyaW9kIGxlbmd0aC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBhZnRlciB0aGUgcXVpZXQgcGVyaW9kLlxuICovXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFF1aWV0UGVyaW9kKG1pbGxpc2Vjb25kcykge1xuICBpZiAobWlsbGlzZWNvbmRzIDw9IDApIHJldHVyblxuXG4gIGF3YWl0IHdhaXQobWlsbGlzZWNvbmRzKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBxdWlldE1zIC0gTWlsbGlzZWNvbmRzIHRoZSB0cmFuc3BvcnQgbXVzdCBzdGF5IGlkbGUgYmVmb3JlIHJlc29sdmluZy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyB3aGVuIHRyYW5zcG9ydCBzdGF5cyBpZGxlLlxuICovXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yRnJvbnRlbmRNb2RlbFRyYW5zcG9ydElkbGUocXVpZXRNcyA9IDApIHtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAoZnJvbnRlbmRNb2RlbFRyYW5zcG9ydElzSWRsZSgpKSB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gcXVldWVNaWNyb3Rhc2soKCkgPT4gcmVzb2x2ZSh1bmRlZmluZWQpKSlcblxuICAgICAgaWYgKGZyb250ZW5kTW9kZWxUcmFuc3BvcnRJc0lkbGUoKSkge1xuICAgICAgICBhd2FpdCB3YWl0Rm9yRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFF1aWV0UGVyaW9kKHF1aWV0TXMpXG5cbiAgICAgICAgaWYgKGZyb250ZW5kTW9kZWxUcmFuc3BvcnRJc0lkbGUoKSkgcmV0dXJuXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGZyb250ZW5kTW9kZWxJZGxlUmVzb2x2ZXJzLnB1c2goKCkgPT4gcmVzb2x2ZSh1bmRlZmluZWQpKVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFQ+fSBjYWxsYmFjayAtIFRyYW5zcG9ydCBjYWxsYmFjay5cbiAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIENhbGxiYWNrIHJlc3VsdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdHJhY2tGcm9udGVuZE1vZGVsVHJhbnNwb3J0UmVxdWVzdChjYWxsYmFjaykge1xuICBhY3RpdmVGcm9udGVuZE1vZGVsVHJhbnNwb3J0UmVxdWVzdENvdW50ICs9IDFcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBjYWxsYmFjaygpXG4gIH0gZmluYWxseSB7XG4gICAgYWN0aXZlRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFJlcXVlc3RDb3VudCAtPSAxXG4gICAgcmVzb2x2ZUZyb250ZW5kTW9kZWxJZGxlV2FpdGVycygpXG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBpbnRlcm5hbCB3ZWJzb2NrZXQgY2xpZW50IGZyb20gd2Vic29ja2V0VXJsIGNvbmZpZy5cbiAqIENyZWF0ZXMgdGhlIGNsaWVudCBsYXppbHkgb24gZmlyc3QgY2FsbC4gUmV0dXJucyBudWxsIGlmIFdlYlNvY2tldFxuICogaXMgbm90IGF2YWlsYWJsZSBvciB3ZWJzb2NrZXRVcmwgaXMgbm90IGNvbmZpZ3VyZWQuXG4gKiBAcmV0dXJucyB7VmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50IHwgbnVsbH0gV2Vic29ja2V0IGNsaWVudCBvciBudWxsLlxuICovXG5mdW5jdGlvbiByZXNvbHZlSW50ZXJuYWxXZWJzb2NrZXRDbGllbnQoKSB7XG4gIGlmIChpbnRlcm5hbFdlYnNvY2tldENsaWVudCkgcmV0dXJuIGludGVybmFsV2Vic29ja2V0Q2xpZW50XG5cbiAgY29uc3Qgd2Vic29ja2V0VXJsID0gZnJvbnRlbmRNb2RlbFRyYW5zcG9ydENvbmZpZy53ZWJzb2NrZXRVcmxcblxuICBpZiAoIXdlYnNvY2tldFVybCkgcmV0dXJuIG51bGxcbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLldlYlNvY2tldCA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIG51bGxcblxuICBjb25zdCByZXNvbHZlZFVybCA9IHR5cGVvZiB3ZWJzb2NrZXRVcmwgPT09IFwiZnVuY3Rpb25cIiA/IHdlYnNvY2tldFVybCgpIDogd2Vic29ja2V0VXJsXG5cbiAgaWYgKCFyZXNvbHZlZFVybCkgcmV0dXJuIG51bGxcblxuICBpbnRlcm5hbFdlYnNvY2tldENsaWVudCA9IG5ldyBWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnQoe1xuICAgIGF1dG9SZWNvbm5lY3Q6IHRydWUsXG4gICAgc2Vzc2lvblN0b3JlOiBmcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnLnNlc3Npb25TdG9yZSxcbiAgICB1cmw6IHJlc29sdmVkVXJsXG4gIH0pXG4gIGludGVybmFsV2Vic29ja2V0Q2xpZW50Lm9uUmVjb25uZWN0ID0gZmx1c2hCdWZmZXJlZE91dGdvaW5nRXZlbnRzQWZ0ZXJSZWNvbm5lY3RcblxuICByZXR1cm4gaW50ZXJuYWxXZWJzb2NrZXRDbGllbnRcbn1cblxuLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuYXN5bmMgZnVuY3Rpb24gZmx1c2hCdWZmZXJlZE91dGdvaW5nRXZlbnRzQWZ0ZXJSZWNvbm5lY3QoKSB7XG4gIGlmICghaW50ZXJuYWxXZWJzb2NrZXRDbGllbnQpIHJldHVyblxuXG4gIGNvbnN0IGV2ZW50cyA9IGRyYWluQnVmZmVyZWRPdXRnb2luZ0V2ZW50cygpXG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGV2ZW50cy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgaW50ZXJuYWxXZWJzb2NrZXRDbGllbnQucG9zdChldmVudHNbaW5kZXhdLmN1c3RvbVBhdGgsIGV2ZW50c1tpbmRleF0ucGF5bG9hZClcbiAgICB9IGNhdGNoIHtcbiAgICAgIGNvbnN0IHNvY2tldE9wZW4gPSBpbnRlcm5hbFdlYnNvY2tldENsaWVudC5zb2NrZXQ/LnJlYWR5U3RhdGUgPT09IGludGVybmFsV2Vic29ja2V0Q2xpZW50LnNvY2tldD8uT1BFTlxuXG4gICAgICBpZiAoc29ja2V0T3Blbikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCByZW1haW5pbmcgPSBpbmRleDsgcmVtYWluaW5nIDwgZXZlbnRzLmxlbmd0aDsgcmVtYWluaW5nICs9IDEpIHtcbiAgICAgICAgYnVmZmVyT3V0Z29pbmdFdmVudChldmVudHNbcmVtYWluaW5nXSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9IG1vZGVsQ2xhc3MgLSBGcm9udGVuZCBtb2RlbCBjbGFzcy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gRGVmYXVsdCByZXNvdXJjZSBwYXRoIGZvciB0aGUgbW9kZWwgY2xhc3MuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRGcm9udGVuZE1vZGVsUmVzb3VyY2VQYXRoKG1vZGVsQ2xhc3MpIHtcbiAgcmV0dXJuIGAvJHtpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnBsdXJhbGl6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUobW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKSkpKX1gXG59XG5cbi8qKiBFcnJvciByYWlzZWQgd2hlbiByZWFkaW5nIGFuIGF0dHJpYnV0ZSB0aGF0IHdhcyBub3Qgc2VsZWN0ZWQgaW4gcXVlcnkgcGF5bG9hZHMuICovXG5leHBvcnQgY2xhc3MgQXR0cmlidXRlTm90U2VsZWN0ZWRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWUgLSBNb2RlbCBjbGFzcyBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZSAtIEF0dHJpYnV0ZSB0aGF0IHdhcyByZXF1ZXN0ZWQuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihtb2RlbE5hbWUsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBzdXBlcihgJHttb2RlbE5hbWV9IyR7YXR0cmlidXRlTmFtZX0gd2FzIG5vdCBzZWxlY3RlZGApXG4gICAgdGhpcy5uYW1lID0gXCJBdHRyaWJ1dGVOb3RTZWxlY3RlZEVycm9yXCJcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgdmFsdWUuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgUmVjb3JkPHN0cmluZywgYW55Pn0gLSBXaGV0aGVyIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gZmFsc2VcblxuICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpXG5cbiAgcmV0dXJuIHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBwcm90b3R5cGUgPT09IG51bGxcbn1cblxuLyoqXG4gKiBMaWdodHdlaWdodCBzaW5ndWxhciByZWxhdGlvbnNoaXAgc3RhdGUgaG9sZGVyIGZvciBmcm9udGVuZCBtb2RlbCBpbnN0YW5jZXMuXG4gKiBAdGVtcGxhdGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gU1xuICogQHRlbXBsYXRlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9IFRcbiAqL1xuZXhwb3J0IGNsYXNzIEZyb250ZW5kTW9kZWxTaW5ndWxhclJlbGF0aW9uc2hpcCB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge0luc3RhbmNlVHlwZTxTPn0gbW9kZWwgLSBQYXJlbnQgbW9kZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbnNoaXBOYW1lIC0gUmVsYXRpb25zaGlwIG5hbWUuXG4gICAqIEBwYXJhbSB7VCB8IG51bGx9IHRhcmdldE1vZGVsQ2xhc3MgLSBUYXJnZXQgbW9kZWwgY2xhc3MuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihtb2RlbCwgcmVsYXRpb25zaGlwTmFtZSwgdGFyZ2V0TW9kZWxDbGFzcykge1xuICAgIHRoaXMubW9kZWwgPSBtb2RlbFxuICAgIHRoaXMucmVsYXRpb25zaGlwTmFtZSA9IHJlbGF0aW9uc2hpcE5hbWVcbiAgICB0aGlzLnRhcmdldE1vZGVsQ2xhc3MgPSB0YXJnZXRNb2RlbENsYXNzXG4gICAgdGhpcy5fcHJlbG9hZGVkID0gZmFsc2VcbiAgICB0aGlzLl9sb2FkZWRWYWx1ZSA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gbG9hZGVkVmFsdWUgLSBMb2FkZWQgcmVsYXRpb25zaGlwIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNldExvYWRlZChsb2FkZWRWYWx1ZSkge1xuICAgIHRoaXMuX2xvYWRlZFZhbHVlID0gbG9hZGVkVmFsdWUgPT0gdW5kZWZpbmVkID8gbnVsbCA6IGxvYWRlZFZhbHVlXG4gICAgdGhpcy5fcHJlbG9hZGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgcmVsYXRpb25zaGlwIGlzIHByZWxvYWRlZC5cbiAgICovXG4gIGdldFByZWxvYWRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlbG9hZGVkXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2FueX0gLSBMb2FkZWQgcmVsYXRpb25zaGlwIHZhbHVlLlxuICAgKi9cbiAgbG9hZGVkKCkge1xuICAgIGlmICghdGhpcy5fcHJlbG9hZGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5tb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfSMke3RoaXMucmVsYXRpb25zaGlwTmFtZX0gaGFzbid0IGJlZW4gcHJlbG9hZGVkYClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fbG9hZGVkVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFthdHRyaWJ1dGVzXSAtIE5ldyBtb2RlbCBhdHRyaWJ1dGVzLlxuICAgKiBAcmV0dXJucyB7SW5zdGFuY2VUeXBlPFQ+fSAtIEJ1aWx0IG1vZGVsLlxuICAgKi9cbiAgYnVpbGQoYXR0cmlidXRlcyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLnRhcmdldE1vZGVsQ2xhc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gdGFyZ2V0IG1vZGVsIGNsYXNzIGNvbmZpZ3VyZWQgZm9yICR7dGhpcy5tb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfSMke3RoaXMucmVsYXRpb25zaGlwTmFtZX1gKVxuICAgIH1cblxuICAgIGNvbnN0IG1vZGVsID0gLyoqIEB0eXBlIHtJbnN0YW5jZVR5cGU8VD59ICovIChuZXcgdGhpcy50YXJnZXRNb2RlbENsYXNzKGF0dHJpYnV0ZXMpKVxuXG4gICAgdGhpcy5zZXRMb2FkZWQobW9kZWwpXG5cbiAgICByZXR1cm4gbW9kZWxcbiAgfVxufVxuXG4vKipcbiAqIExpZ2h0d2VpZ2h0IGhhcy1tYW55IHJlbGF0aW9uc2hpcCBzdGF0ZSBob2xkZXIgZm9yIGZyb250ZW5kIG1vZGVsIGluc3RhbmNlcy5cbiAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBTXG4gKiBAdGVtcGxhdGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gVFxuICovXG5leHBvcnQgY2xhc3MgRnJvbnRlbmRNb2RlbEhhc01hbnlSZWxhdGlvbnNoaXAge1xuICAvKiogQHR5cGUge0FycmF5PEluc3RhbmNlVHlwZTxUPj59ICovXG4gIF9sb2FkZWRWYWx1ZVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0luc3RhbmNlVHlwZTxTPn0gbW9kZWwgLSBQYXJlbnQgbW9kZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbnNoaXBOYW1lIC0gUmVsYXRpb25zaGlwIG5hbWUuXG4gICAqIEBwYXJhbSB7VCB8IG51bGx9IHRhcmdldE1vZGVsQ2xhc3MgLSBUYXJnZXQgbW9kZWwgY2xhc3MuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihtb2RlbCwgcmVsYXRpb25zaGlwTmFtZSwgdGFyZ2V0TW9kZWxDbGFzcykge1xuICAgIHRoaXMubW9kZWwgPSBtb2RlbFxuICAgIHRoaXMucmVsYXRpb25zaGlwTmFtZSA9IHJlbGF0aW9uc2hpcE5hbWVcbiAgICB0aGlzLnRhcmdldE1vZGVsQ2xhc3MgPSB0YXJnZXRNb2RlbENsYXNzXG4gICAgdGhpcy5fcHJlbG9hZGVkID0gZmFsc2VcbiAgICB0aGlzLl9sb2FkZWRWYWx1ZSA9IFtdXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtBcnJheTxJbnN0YW5jZVR5cGU8VD4+fSBsb2FkZWRWYWx1ZSAtIExvYWRlZCByZWxhdGlvbnNoaXAgdmFsdWUuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0TG9hZGVkKGxvYWRlZFZhbHVlKSB7XG4gICAgdGhpcy5fbG9hZGVkVmFsdWUgPSBBcnJheS5pc0FycmF5KGxvYWRlZFZhbHVlKSA/IGxvYWRlZFZhbHVlIDogW11cbiAgICB0aGlzLl9wcmVsb2FkZWQgPSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciByZWxhdGlvbnNoaXAgaXMgcHJlbG9hZGVkLlxuICAgKi9cbiAgZ2V0UHJlbG9hZGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9wcmVsb2FkZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7QXJyYXk8SW5zdGFuY2VUeXBlPFQ+Pn0gLSBMb2FkZWQgcmVsYXRpb25zaGlwIHZhbHVlcy5cbiAgICovXG4gIGxvYWRlZCgpIHtcbiAgICBpZiAoIXRoaXMuX3ByZWxvYWRlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubW9kZWwuY29uc3RydWN0b3IubmFtZX0jJHt0aGlzLnJlbGF0aW9uc2hpcE5hbWV9IGhhc24ndCBiZWVuIHByZWxvYWRlZGApXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2xvYWRlZFZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtBcnJheTxJbnN0YW5jZVR5cGU8VD4+fSBtb2RlbHMgLSBNb2RlbHMgdG8gYXBwZW5kLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFkZFRvTG9hZGVkKG1vZGVscykge1xuICAgIGNvbnN0IGxvYWRlZE1vZGVscyA9IHRoaXMuZ2V0UHJlbG9hZGVkKCkgPyB0aGlzLmxvYWRlZCgpIDogW11cblxuICAgIHRoaXMuc2V0TG9hZGVkKFsuLi5sb2FkZWRNb2RlbHMsIC4uLm1vZGVsc10pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbYXR0cmlidXRlc10gLSBOZXcgbW9kZWwgYXR0cmlidXRlcy5cbiAgICogQHJldHVybnMge0luc3RhbmNlVHlwZTxUPn0gLSBCdWlsdCBtb2RlbC5cbiAgICovXG4gIGJ1aWxkKGF0dHJpYnV0ZXMgPSB7fSkge1xuICAgIGlmICghdGhpcy50YXJnZXRNb2RlbENsYXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHRhcmdldCBtb2RlbCBjbGFzcyBjb25maWd1cmVkIGZvciAke3RoaXMubW9kZWwuY29uc3RydWN0b3IubmFtZX0jJHt0aGlzLnJlbGF0aW9uc2hpcE5hbWV9YClcbiAgICB9XG5cbiAgICBjb25zdCBtb2RlbCA9IC8qKiBAdHlwZSB7SW5zdGFuY2VUeXBlPFQ+fSAqLyAobmV3IHRoaXMudGFyZ2V0TW9kZWxDbGFzcyhhdHRyaWJ1dGVzKSlcblxuICAgIHRoaXMuYWRkVG9Mb2FkZWQoW21vZGVsXSlcblxuICAgIHJldHVybiBtb2RlbFxuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNlLXJlbG9hZCB0aGUgcmVsYXRpb25zaGlwLiBXaGVuIHRoZSBwYXJlbnQgcmVjb3JkIHdhcyBsb2FkZWQgYXMgcGFydFxuICAgKiBvZiBhIGJhdGNoLCBzaWJsaW5ncyB0aGF0IGhhdmUgbm90IHByZWxvYWRlZCB0aGlzIHJlbGF0aW9uc2hpcCBnZXRcbiAgICogYmF0Y2hlZCBpbnRvIG9uZSByZXF1ZXN0IHZpYSB0aGUgY29ob3J0IHByZWxvYWRlci4gVGhlIHNjb3BlZCBxdWVyeSBwYXRoXG4gICAqIChgTW9kZWwud2hlcmUoLi4uKS5wcmVsb2FkKFtuYW1lXSkudG9BcnJheSgpYCBkaXJlY3RseSBmcm9tIHVzZXIgY29kZSlcbiAgICogYnlwYXNzZXMgY29ob3J0IGJhdGNoaW5nIGJ5IGRlc2lnbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8SW5zdGFuY2VUeXBlPFQ+Pj59IC0gTG9hZGVkIHJlbGF0aW9uc2hpcCBtb2RlbHMuXG4gICAqL1xuICBhc3luYyBsb2FkKCkge1xuICAgIC8vIFJlc2V0IHNvIHRoZSBjb2hvcnQgcHJlbG9hZGVyIChvciBzaW5nbGUtcmVjb3JkIGZhbGxiYWNrKSByZXBvcHVsYXRlcy5cbiAgICB0aGlzLl9wcmVsb2FkZWQgPSBmYWxzZVxuICAgIHRoaXMuX2xvYWRlZFZhbHVlID0gW11cblxuICAgIGNvbnN0IGJhdGNoZWQgPSBhd2FpdCAvKiogQHR5cGUge2FueX0gKi8gKHRoaXMubW9kZWwpLl90cnlDb2hvcnRQcmVsb2FkKHRoaXMucmVsYXRpb25zaGlwTmFtZSlcblxuICAgIGlmIChiYXRjaGVkKSByZXR1cm4gdGhpcy5fbG9hZGVkVmFsdWVcblxuICAgIHJldHVybiAvKiogQHR5cGUge1Byb21pc2U8QXJyYXk8SW5zdGFuY2VUeXBlPFQ+Pj59ICovICh0aGlzLm1vZGVsLmxvYWRSZWxhdGlvbnNoaXAodGhpcy5yZWxhdGlvbnNoaXBOYW1lKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxJbnN0YW5jZVR5cGU8VD4+Pn0gLSBMb2FkZWQgcmVsYXRpb25zaGlwIG1vZGVscy5cbiAgICovXG4gIGFzeW5jIHRvQXJyYXkoKSB7XG4gICAgaWYgKHRoaXMuZ2V0UHJlbG9hZGVkKCkgfHwgdGhpcy5fbG9hZGVkVmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2xvYWRlZFZhbHVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMubG9hZCgpXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25zaGlwVHlwZSAtIFJlbGF0aW9uc2hpcCB0eXBlLlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciByZWxhdGlvbnNoaXAgdHlwZSBpcyBoYXMtbWFueS5cbiAqL1xuZnVuY3Rpb24gcmVsYXRpb25zaGlwVHlwZUlzQ29sbGVjdGlvbihyZWxhdGlvbnNoaXBUeXBlKSB7XG4gIHJldHVybiByZWxhdGlvbnNoaXBUeXBlID09IFwiaGFzTWFueVwiXG59XG5cbi8qKlxuICogRG93bmxvYWRlZCBmcm9udGVuZC1tb2RlbCBhdHRhY2htZW50IHBheWxvYWQgd3JhcHBlci5cbiAqL1xuZXhwb3J0IGNsYXNzIEZyb250ZW5kTW9kZWxBdHRhY2htZW50RG93bmxvYWQge1xuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5pZCAtIEF0dGFjaG1lbnQgaWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmZpbGVuYW1lIC0gRmlsZW5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbH0gYXJncy5jb250ZW50VHlwZSAtIENvbnRlbnQgdHlwZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuYnl0ZVNpemUgLSBGaWxlIHNpemUgaW4gYnl0ZXMuXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0gYXJncy5jb250ZW50IC0gRmlsZSBjb250ZW50IGJ5dGVzLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IFthcmdzLnVybF0gLSBSZXNvbHZhYmxlIGF0dGFjaG1lbnQgVVJMLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2J5dGVTaXplLCBjb250ZW50LCBjb250ZW50VHlwZSwgZmlsZW5hbWUsIGlkLCB1cmwgPSBudWxsfSkge1xuICAgIHRoaXMuaWRWYWx1ZSA9IGlkXG4gICAgdGhpcy5maWxlbmFtZVZhbHVlID0gZmlsZW5hbWVcbiAgICB0aGlzLmNvbnRlbnRUeXBlVmFsdWUgPSBjb250ZW50VHlwZVxuICAgIHRoaXMuYnl0ZVNpemVWYWx1ZSA9IGJ5dGVTaXplXG4gICAgdGhpcy5jb250ZW50VmFsdWUgPSBjb250ZW50XG4gICAgdGhpcy51cmxWYWx1ZSA9IHVybFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtudW1iZXJ9IC0gRmlsZSBzaXplIGluIGJ5dGVzLiAqL1xuICBieXRlU2l6ZSgpIHsgcmV0dXJuIHRoaXMuYnl0ZVNpemVWYWx1ZSB9XG4gIC8qKiBAcmV0dXJucyB7VWludDhBcnJheX0gLSBGaWxlIGNvbnRlbnQgYnl0ZXMuICovXG4gIGNvbnRlbnQoKSB7IHJldHVybiB0aGlzLmNvbnRlbnRWYWx1ZSB9XG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH0gLSBDb250ZW50IHR5cGUuICovXG4gIGNvbnRlbnRUeXBlKCkgeyByZXR1cm4gdGhpcy5jb250ZW50VHlwZVZhbHVlIH1cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmd9IC0gRmlsZW5hbWUuICovXG4gIGZpbGVuYW1lKCkgeyByZXR1cm4gdGhpcy5maWxlbmFtZVZhbHVlIH1cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmd9IC0gQXR0YWNobWVudCBpZC4gKi9cbiAgaWQoKSB7IHJldHVybiB0aGlzLmlkVmFsdWUgfVxuICAvKiogQHJldHVybnMge3N0cmluZyB8IG51bGx9IC0gUmVzb2x2YWJsZSBhdHRhY2htZW50IFVSTC4gKi9cbiAgdXJsKCkgeyByZXR1cm4gdGhpcy51cmxWYWx1ZSB9XG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdmFsdWUgbG9va3MgbGlrZSBieXRlIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIGZyb250ZW5kQXR0YWNobWVudFZhbHVlSXNCeXRlcyh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5IHx8IHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgKHR5cGVvZiBCdWZmZXIgIT09IFwidW5kZWZpbmVkXCIgJiYgQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIHZhbHVlLlxuICogQHJldHVybnMge3ZhbHVlIGlzIHthcnJheUJ1ZmZlcjogKCkgPT4gUHJvbWlzZTxBcnJheUJ1ZmZlcj59fSAtIFdoZXRoZXIgY2FuZGlkYXRlIHN1cHBvcnRzIGFycmF5QnVmZmVyKCkuXG4gKi9cbmZ1bmN0aW9uIGZyb250ZW5kQXR0YWNobWVudFZhbHVlU3VwcG9ydHNBcnJheUJ1ZmZlcih2YWx1ZSkge1xuICByZXR1cm4gQm9vbGVhbih2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIC8qKiBAdHlwZSB7YW55fSAqLyAodmFsdWUpLmFycmF5QnVmZmVyID09PSBcImZ1bmN0aW9uXCIpXG59XG5cbi8qKlxuICogQHBhcmFtIHtVaW50OEFycmF5IHwgQnVmZmVyIHwgQXJyYXlCdWZmZXJ9IHZhbHVlIC0gQnl0ZS1saWtlIHZhbHVlLlxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9IC0gVWludDhBcnJheSBieXRlcy5cbiAqL1xuZnVuY3Rpb24gZnJvbnRlbmRBdHRhY2htZW50Tm9ybWFsaXplQnl0ZXModmFsdWUpIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSkgcmV0dXJuIHZhbHVlXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodmFsdWUpXG4gIGlmICh0eXBlb2YgQnVmZmVyICE9PSBcInVuZGVmaW5lZFwiICYmIEJ1ZmZlci5pc0J1ZmZlcigvKiogQHR5cGUge2FueX0gKi8gKHZhbHVlKSkpIHtcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoLyoqIEB0eXBlIHtCdWZmZXJ9ICovICh2YWx1ZSkpXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBhdHRhY2htZW50IGJ5dGVzIHZhbHVlXCIpXG59XG5cbi8qKlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBieXRlcyAtIEJ5dGVzLlxuICogQHJldHVybnMge3N0cmluZ30gLSBCYXNlNjQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGZyb250ZW5kQXR0YWNobWVudEJ5dGVzVG9CYXNlNjQoYnl0ZXMpIHtcbiAgaWYgKHR5cGVvZiBCdWZmZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oYnl0ZXMpLnRvU3RyaW5nKFwiYmFzZTY0XCIpXG4gIH1cblxuICBsZXQgYmluYXJ5ID0gXCJcIlxuXG4gIGZvciAoY29uc3QgYnl0ZSBvZiBieXRlcykge1xuICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGUpXG4gIH1cblxuICBpZiAodHlwZW9mIGJ0b2EgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBiYXNlNjQgZW5jb2RlclwiKVxuXG4gIHJldHVybiBidG9hKGJpbmFyeSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBCYXNlNjQgdmFsdWUuXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX0gLSBEZWNvZGVkIGJ5dGVzLlxuICovXG5mdW5jdGlvbiBmcm9udGVuZEF0dGFjaG1lbnRCYXNlNjRUb0J5dGVzKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgQnVmZmVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHZhbHVlLCBcImJhc2U2NFwiKSlcbiAgfVxuXG4gIGlmICh0eXBlb2YgYXRvYiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGJhc2U2NCBkZWNvZGVyXCIpXG5cbiAgY29uc3QgYmluYXJ5ID0gYXRvYih2YWx1ZSlcbiAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShiaW5hcnkubGVuZ3RoKVxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBiaW5hcnkubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgYnl0ZXNbaW5kZXhdID0gYmluYXJ5LmNoYXJDb2RlQXQoaW5kZXgpXG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIHZhbHVlLlxuICogQHJldHVybnMge3ZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIGFueT59IC0gV2hldGhlciB2YWx1ZSBpcyBwbGFpbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGZyb250ZW5kQXR0YWNobWVudFZhbHVlSXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKVxuXG4gIHJldHVybiBwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG90eXBlID09PSBudWxsXG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFBheWxvYWQgY2FuZGlkYXRlLlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBwYXlsb2FkIGNvbnRhaW5zIGFuIGF0dGFjaG1lbnQgdXBsb2FkIGJvZHkuXG4gKi9cbmZ1bmN0aW9uIGZyb250ZW5kTW9kZWxQYXlsb2FkQ29udGFpbnNBdHRhY2htZW50VXBsb2FkKHZhbHVlKSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2VcblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUuc29tZSgoZW50cnkpID0+IGZyb250ZW5kTW9kZWxQYXlsb2FkQ29udGFpbnNBdHRhY2htZW50VXBsb2FkKGVudHJ5KSlcbiAgfVxuXG4gIGlmICghZnJvbnRlbmRBdHRhY2htZW50VmFsdWVJc1BsYWluT2JqZWN0KHZhbHVlKSkgcmV0dXJuIGZhbHNlXG5cbiAgaWYgKHR5cGVvZiB2YWx1ZS5jb250ZW50QmFzZTY0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHJldHVybiBPYmplY3QudmFsdWVzKHZhbHVlKS5zb21lKChlbnRyeSkgPT4gZnJvbnRlbmRNb2RlbFBheWxvYWRDb250YWluc0F0dGFjaG1lbnRVcGxvYWQoZW50cnkpKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gaW5wdXQgLSBBdHRhY2htZW50IGlucHV0LlxuICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IC0gVHJhbnNwb3J0LXNhZmUgYXR0YWNobWVudCBwYXlsb2FkLlxuICovXG5hc3luYyBmdW5jdGlvbiBub3JtYWxpemVGcm9udGVuZEF0dGFjaG1lbnRJbnB1dChpbnB1dCkge1xuICBpZiAoZnJvbnRlbmRBdHRhY2htZW50VmFsdWVJc1BsYWluT2JqZWN0KGlucHV0KSAmJiBcImZpbGVcIiBpbiBpbnB1dCkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWxlID0gYXdhaXQgbm9ybWFsaXplRnJvbnRlbmRBdHRhY2htZW50SW5wdXQoaW5wdXQuZmlsZSlcbiAgICBjb25zdCBtZXJnZWQgPSB7XG4gICAgICAuLi5ub3JtYWxpemVkRmlsZVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5wdXQuZmlsZW5hbWUgPT09IFwic3RyaW5nXCIgJiYgaW5wdXQuZmlsZW5hbWUubGVuZ3RoID4gMCkgbWVyZ2VkLmZpbGVuYW1lID0gaW5wdXQuZmlsZW5hbWVcbiAgICBpZiAodHlwZW9mIGlucHV0LmNvbnRlbnRUeXBlID09PSBcInN0cmluZ1wiICYmIGlucHV0LmNvbnRlbnRUeXBlLmxlbmd0aCA+IDApIG1lcmdlZC5jb250ZW50VHlwZSA9IGlucHV0LmNvbnRlbnRUeXBlXG5cbiAgICByZXR1cm4gbWVyZ2VkXG4gIH1cblxuICBpZiAoZnJvbnRlbmRBdHRhY2htZW50VmFsdWVJc1BsYWluT2JqZWN0KGlucHV0KSkge1xuICAgIGlmICh0eXBlb2YgaW5wdXQucGF0aCA9PT0gXCJzdHJpbmdcIiAmJiBpbnB1dC5wYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkF0dGFjaG1lbnQgcGF0aCBpbnB1dCBpcyBub3Qgc3VwcG9ydGVkIGluIGZyb250ZW5kIG1vZGVsc1wiKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5wdXQuY29udGVudEJhc2U2NCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudEJhc2U2NDogaW5wdXQuY29udGVudEJhc2U2NCxcbiAgICAgICAgY29udGVudFR5cGU6IHR5cGVvZiBpbnB1dC5jb250ZW50VHlwZSA9PT0gXCJzdHJpbmdcIiAmJiBpbnB1dC5jb250ZW50VHlwZS5sZW5ndGggPiAwID8gaW5wdXQuY29udGVudFR5cGUgOiBudWxsLFxuICAgICAgICBmaWxlbmFtZTogdHlwZW9mIGlucHV0LmZpbGVuYW1lID09PSBcInN0cmluZ1wiICYmIGlucHV0LmZpbGVuYW1lLmxlbmd0aCA+IDAgPyBpbnB1dC5maWxlbmFtZSA6IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChmcm9udGVuZEF0dGFjaG1lbnRWYWx1ZVN1cHBvcnRzQXJyYXlCdWZmZXIoaW5wdXQpKSB7XG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShhd2FpdCBpbnB1dC5hcnJheUJ1ZmZlcigpKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnRCYXNlNjQ6IGZyb250ZW5kQXR0YWNobWVudEJ5dGVzVG9CYXNlNjQoYnl0ZXMpLFxuICAgICAgY29udGVudFR5cGU6IHR5cGVvZiAvKiogQHR5cGUge2FueX0gKi8gKGlucHV0KS50eXBlID09PSBcInN0cmluZ1wiICYmIC8qKiBAdHlwZSB7YW55fSAqLyAoaW5wdXQpLnR5cGUubGVuZ3RoID4gMFxuICAgICAgICA/IC8qKiBAdHlwZSB7YW55fSAqLyAoaW5wdXQpLnR5cGVcbiAgICAgICAgOiBudWxsLFxuICAgICAgZmlsZW5hbWU6IHR5cGVvZiAvKiogQHR5cGUge2FueX0gKi8gKGlucHV0KS5uYW1lID09PSBcInN0cmluZ1wiICYmIC8qKiBAdHlwZSB7YW55fSAqLyAoaW5wdXQpLm5hbWUubGVuZ3RoID4gMFxuICAgICAgICA/IC8qKiBAdHlwZSB7YW55fSAqLyAoaW5wdXQpLm5hbWVcbiAgICAgICAgOiBcImF0dGFjaG1lbnQuYmluXCJcbiAgICB9XG4gIH1cblxuICBpZiAoZnJvbnRlbmRBdHRhY2htZW50VmFsdWVJc0J5dGVzKGlucHV0KSkge1xuICAgIGNvbnN0IGJ5dGVzID0gZnJvbnRlbmRBdHRhY2htZW50Tm9ybWFsaXplQnl0ZXMoLyoqIEB0eXBlIHtVaW50OEFycmF5IHwgQnVmZmVyIHwgQXJyYXlCdWZmZXJ9ICovIChpbnB1dCkpXG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudEJhc2U2NDogZnJvbnRlbmRBdHRhY2htZW50Qnl0ZXNUb0Jhc2U2NChieXRlcyksXG4gICAgICBjb250ZW50VHlwZTogbnVsbCxcbiAgICAgIGZpbGVuYW1lOiBcImF0dGFjaG1lbnQuYmluXCJcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBmcm9udGVuZCBhdHRhY2htZW50IGlucHV0XCIpXG59XG5cbi8qKlxuICogRnJvbnRlbmQtbW9kZWwgYXR0YWNobWVudCBoZWxwZXIgZm9yIG9uZSBhdHRhY2htZW50IG5hbWUuXG4gKi9cbmV4cG9ydCBjbGFzcyBGcm9udGVuZE1vZGVsQXR0YWNobWVudEhhbmRsZSB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRNb2RlbEJhc2V9IGFyZ3MubW9kZWwgLSBNb2RlbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXR0YWNobWVudE5hbWUgLSBBdHRhY2htZW50IG5hbWUuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7YXR0YWNobWVudE5hbWUsIG1vZGVsfSkge1xuICAgIHRoaXMubW9kZWwgPSBtb2RlbFxuICAgIHRoaXMuYXR0YWNobWVudE5hbWUgPSBhdHRhY2htZW50TmFtZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gaW5wdXQgLSBBdHRhY2htZW50IGlucHV0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGF0dGFjaGVkLlxuICAgKi9cbiAgYXN5bmMgYXR0YWNoKGlucHV0KSB7XG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSAqLyAodGhpcy5tb2RlbC5jb25zdHJ1Y3RvcilcbiAgICBjb25zdCBub3JtYWxpemVkSW5wdXQgPSBhd2FpdCBub3JtYWxpemVGcm9udGVuZEF0dGFjaG1lbnRJbnB1dChpbnB1dClcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IE1vZGVsQ2xhc3MuZXhlY3V0ZUNvbW1hbmQoXCJhdHRhY2hcIiwge1xuICAgICAgYXR0YWNobWVudDogbm9ybWFsaXplZElucHV0LFxuICAgICAgYXR0YWNobWVudE5hbWU6IHRoaXMuYXR0YWNobWVudE5hbWUsXG4gICAgICBpZDogdGhpcy5tb2RlbC5wcmltYXJ5S2V5VmFsdWUoKVxuICAgIH0pXG5cbiAgICB0aGlzLm1vZGVsLmFzc2lnbkF0dHJpYnV0ZXMoTW9kZWxDbGFzcy5hdHRyaWJ1dGVzRnJvbVJlc3BvbnNlKHJlc3BvbnNlKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2F0dGFjaG1lbnRJZF0gLSBPcHRpb25hbCBhdHRhY2htZW50IGlkIGZvciBoYXMtbWFueSBhdHRhY2htZW50cy5cbiAgICogQHJldHVybnMge1Byb21pc2U8RnJvbnRlbmRNb2RlbEF0dGFjaG1lbnREb3dubG9hZCB8IG51bGw+fSAtIERvd25sb2FkZWQgYXR0YWNobWVudCBwYXlsb2FkLlxuICAgKi9cbiAgYXN5bmMgZG93bmxvYWQoYXR0YWNobWVudElkKSB7XG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSAqLyAodGhpcy5tb2RlbC5jb25zdHJ1Y3RvcilcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIGF0dGFjaG1lbnROYW1lOiB0aGlzLmF0dGFjaG1lbnROYW1lLFxuICAgICAgaWQ6IHRoaXMubW9kZWwucHJpbWFyeUtleVZhbHVlKClcbiAgICB9XG5cbiAgICBpZiAoYXR0YWNobWVudElkKSB7XG4gICAgICBwYXlsb2FkLmF0dGFjaG1lbnRJZCA9IGF0dGFjaG1lbnRJZFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgTW9kZWxDbGFzcy5leGVjdXRlQ29tbWFuZChcImRvd25sb2FkXCIsIHBheWxvYWQpXG4gICAgY29uc3QgYXR0YWNobWVudFBheWxvYWQgPSByZXNwb25zZS5hdHRhY2htZW50XG5cbiAgICBpZiAoIWF0dGFjaG1lbnRQYXlsb2FkIHx8IHR5cGVvZiBhdHRhY2htZW50UGF5bG9hZCAhPT0gXCJvYmplY3RcIikgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IGNvbnRlbnRCYXNlNjQgPSB0eXBlb2YgYXR0YWNobWVudFBheWxvYWQuY29udGVudEJhc2U2NCA9PT0gXCJzdHJpbmdcIiA/IGF0dGFjaG1lbnRQYXlsb2FkLmNvbnRlbnRCYXNlNjQgOiBcIlwiXG4gICAgY29uc3QgY29udGVudCA9IGZyb250ZW5kQXR0YWNobWVudEJhc2U2NFRvQnl0ZXMoY29udGVudEJhc2U2NClcbiAgICBjb25zdCBieXRlU2l6ZSA9IE51bWJlcihhdHRhY2htZW50UGF5bG9hZC5ieXRlU2l6ZSlcblxuICAgIHJldHVybiBuZXcgRnJvbnRlbmRNb2RlbEF0dGFjaG1lbnREb3dubG9hZCh7XG4gICAgICBieXRlU2l6ZTogTnVtYmVyLmlzRmluaXRlKGJ5dGVTaXplKSA/IGJ5dGVTaXplIDogY29udGVudC5sZW5ndGgsXG4gICAgICBjb250ZW50LFxuICAgICAgY29udGVudFR5cGU6IHR5cGVvZiBhdHRhY2htZW50UGF5bG9hZC5jb250ZW50VHlwZSA9PT0gXCJzdHJpbmdcIiAmJiBhdHRhY2htZW50UGF5bG9hZC5jb250ZW50VHlwZS5sZW5ndGggPiAwID8gYXR0YWNobWVudFBheWxvYWQuY29udGVudFR5cGUgOiBudWxsLFxuICAgICAgZmlsZW5hbWU6IHR5cGVvZiBhdHRhY2htZW50UGF5bG9hZC5maWxlbmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBhdHRhY2htZW50UGF5bG9hZC5maWxlbmFtZS5sZW5ndGggPiAwID8gYXR0YWNobWVudFBheWxvYWQuZmlsZW5hbWUgOiBcImF0dGFjaG1lbnQuYmluXCIsXG4gICAgICBpZDogdHlwZW9mIGF0dGFjaG1lbnRQYXlsb2FkLmlkID09PSBcInN0cmluZ1wiID8gYXR0YWNobWVudFBheWxvYWQuaWQgOiBcIlwiLFxuICAgICAgdXJsOiB0eXBlb2YgYXR0YWNobWVudFBheWxvYWQudXJsID09PSBcInN0cmluZ1wiICYmIGF0dGFjaG1lbnRQYXlsb2FkLnVybC5sZW5ndGggPiAwID8gYXR0YWNobWVudFBheWxvYWQudXJsIDogbnVsbFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IFthdHRhY2htZW50SWRdIC0gT3B0aW9uYWwgYXR0YWNobWVudCBpZCBmb3IgaGFzLW1hbnkgYXR0YWNobWVudHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IG51bGw+fSAtIFJlc29sdmFibGUgYXR0YWNobWVudCBVUkwuXG4gICAqL1xuICBhc3luYyB1cmwoYXR0YWNobWVudElkKSB7XG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSAqLyAodGhpcy5tb2RlbC5jb25zdHJ1Y3RvcilcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIGF0dGFjaG1lbnROYW1lOiB0aGlzLmF0dGFjaG1lbnROYW1lLFxuICAgICAgaWQ6IHRoaXMubW9kZWwucHJpbWFyeUtleVZhbHVlKClcbiAgICB9XG5cbiAgICBpZiAoYXR0YWNobWVudElkKSB7XG4gICAgICBwYXlsb2FkLmF0dGFjaG1lbnRJZCA9IGF0dGFjaG1lbnRJZFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgTW9kZWxDbGFzcy5leGVjdXRlQ29tbWFuZChcInVybFwiLCBwYXlsb2FkKVxuXG4gICAgaWYgKHR5cGVvZiByZXNwb25zZS51cmwgPT09IFwic3RyaW5nXCIgJiYgcmVzcG9uc2UudXJsLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiByZXNwb25zZS51cmxcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gRG93bmxvYWQgVVJMIGZvciB0aGlzIGF0dGFjaG1lbnQgb24gdGhlIGNvbmZpZ3VyZWQgYmFja2VuZC5cbiAgICovXG4gIGRvd25sb2FkVXJsKCkge1xuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gKi8gKHRoaXMubW9kZWwuY29uc3RydWN0b3IpXG4gICAgY29uc3QgY29tbWFuZE5hbWUgPSBNb2RlbENsYXNzLmNvbW1hbmROYW1lKFwiZG93bmxvYWRcIilcbiAgICBjb25zdCByZXNvdXJjZVBhdGggPSBNb2RlbENsYXNzLnJlc291cmNlUGF0aCgpXG4gICAgY29uc3QgY29tbWFuZFVybCA9IGZyb250ZW5kTW9kZWxDb21tYW5kVXJsKHJlc291cmNlUGF0aCwgY29tbWFuZE5hbWUpXG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgICBhdHRhY2htZW50TmFtZTogdGhpcy5hdHRhY2htZW50TmFtZSxcbiAgICAgIGlkOiBTdHJpbmcodGhpcy5tb2RlbC5wcmltYXJ5S2V5VmFsdWUoKSlcbiAgICB9KVxuXG4gICAgcmV0dXJuIGAke2NvbW1hbmRVcmx9PyR7cGFyYW1zLnRvU3RyaW5nKCl9YFxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsfSB2YWx1ZSAtIFVSTCBjYW5kaWRhdGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIE5vcm1hbGl6ZWQgVVJMIHdpdGhvdXQgdHJhaWxpbmcgc2xhc2guXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRVcmwodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIFwiXCJcblxuICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXG5cbiAgaWYgKCF0cmltbWVkLmxlbmd0aCkgcmV0dXJuIFwiXCJcblxuICByZXR1cm4gdHJpbW1lZC5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpXG59XG5cbi8qKlxuICogQHJldHVybnMge3N0cmluZ30gLSBSZXNvbHZlZCBmcm9udGVuZC1tb2RlbCB0cmFuc3BvcnQgVVJMLlxuICovXG5mdW5jdGlvbiBmcm9udGVuZE1vZGVsVHJhbnNwb3J0VXJsKCkge1xuICBjb25zdCBjb25maWd1cmVkVXJsID0gdHlwZW9mIGZyb250ZW5kTW9kZWxUcmFuc3BvcnRDb25maWcudXJsID09PSBcImZ1bmN0aW9uXCJcbiAgICA/IGZyb250ZW5kTW9kZWxUcmFuc3BvcnRDb25maWcudXJsKClcbiAgICA6IGZyb250ZW5kTW9kZWxUcmFuc3BvcnRDb25maWcudXJsXG5cbiAgcmV0dXJuIG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRVcmwoY29uZmlndXJlZFVybClcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHZhbHVlIC0gQXR0cmlidXRlcyBoYXNoLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59IC0gQ2xvbmVkIGF0dHJpYnV0ZXMgaGFzaC5cbiAqL1xuZnVuY3Rpb24gY2xvbmVGcm9udGVuZE1vZGVsQXR0cmlidXRlcyh2YWx1ZSkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqLyAoZGVzZXJpYWxpemVGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWUoc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlKHZhbHVlKSkpXG59XG5cbi8qKlxuICogU2hhcmVkIGNoYW5uZWwgbmFtZSBmb3IgbW9kZWwgbGlmZWN5Y2xlIGV2ZW50cyAoUGhhc2UgMykuXG4gKiBNYXRjaGVzIHRoZSBiYWNrZW5kIGBGUk9OVEVORF9NT0RFTFNfQ0hBTk5FTF9OQU1FYC5cbiAqL1xuY29uc3QgRlJPTlRFTkRfTU9ERUxTX0NIQU5ORUxfTkFNRSA9IFwiZnJvbnRlbmQtbW9kZWxzXCJcblxuLyoqXG4gKiBAdHlwZWRlZiB7e2NhbGxiYWNrOiAocGF5bG9hZDoge2lkOiBzdHJpbmcsIG1vZGVsOiBJbnN0YW5jZVR5cGU8dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlPn0pID0+IHZvaWQsIGV2ZW50RmlsdGVyS2V5OiBzdHJpbmcgfCBudWxsLCBldmVudEZpbHRlclBheWxvYWQ6IGltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbEV2ZW50RmlsdGVyUGF5bG9hZCB8IG51bGwsIHByb2plY3Rpb25QYXlsb2FkOiBpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxQcm9qZWN0aW9uUGF5bG9hZH19IEZyb250ZW5kTW9kZWxNb2RlbEV2ZW50Q2FsbGJhY2tFbnRyeVxuICovXG4vKipcbiAqIEB0eXBlZGVmIHt7Y2FsbGJhY2s6IChwYXlsb2FkOiB7aWQ6IHN0cmluZ30pID0+IHZvaWR9fSBGcm9udGVuZE1vZGVsRGVzdHJveUV2ZW50Q2FsbGJhY2tFbnRyeVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZT59IHRhcmdldCAtIFRhcmdldCBwcmVsb2FkIHBheWxvYWQuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlPn0gc291cmNlIC0gU291cmNlIHByZWxvYWQgcGF5bG9hZC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBtZXJnZUZyb250ZW5kTW9kZWxFdmVudFByZWxvYWQodGFyZ2V0LCBzb3VyY2UpIHtcbiAgZm9yIChjb25zdCBbcmVsYXRpb25zaGlwTmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNvdXJjZSkpIHtcbiAgICBjb25zdCBleGlzdGluZ1ZhbHVlID0gdGFyZ2V0W3JlbGF0aW9uc2hpcE5hbWVdXG5cbiAgICBpZiAodmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICBpZiAoZXhpc3RpbmdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB0YXJnZXRbcmVsYXRpb25zaGlwTmFtZV0gPSB2YWx1ZVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgdGFyZ2V0W3JlbGF0aW9uc2hpcE5hbWVdID0gdmFsdWVcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKCFleGlzdGluZ1ZhbHVlIHx8IHR5cGVvZiBleGlzdGluZ1ZhbHVlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZXhpc3RpbmdWYWx1ZSkpIHtcbiAgICAgIHRhcmdldFtyZWxhdGlvbnNoaXBOYW1lXSA9IHt9XG4gICAgfVxuXG4gICAgbWVyZ2VGcm9udGVuZE1vZGVsRXZlbnRQcmVsb2FkKFxuICAgICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZT59ICovICh0YXJnZXRbcmVsYXRpb25zaGlwTmFtZV0pLFxuICAgICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZT59ICovICh2YWx1ZSlcbiAgICApXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gdGFyZ2V0IC0gVGFyZ2V0IHNlbGVjdCBtYXAuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gc291cmNlIC0gU291cmNlIHNlbGVjdCBtYXAuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gbWVyZ2VGcm9udGVuZE1vZGVsRXZlbnRTZWxlY3QodGFyZ2V0LCBzb3VyY2UpIHtcbiAgZm9yIChjb25zdCBbbW9kZWxOYW1lLCBhdHRyaWJ1dGVzXSBvZiBPYmplY3QuZW50cmllcyhzb3VyY2UpKSB7XG4gICAgY29uc3QgZXhpc3RpbmdBdHRyaWJ1dGVzID0gdGFyZ2V0W21vZGVsTmFtZV0gfHwgW11cblxuICAgIHRhcmdldFttb2RlbE5hbWVdID0gQXJyYXkuZnJvbShuZXcgU2V0KGV4aXN0aW5nQXR0cmlidXRlcy5jb25jYXQoYXR0cmlidXRlcykpKVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtBcnJheTxpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxXaXRoQ291bnRQYXlsb2FkRW50cnkgfCBpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxBYmlsaXRpZXNQYXlsb2FkRW50cnk+fSB0YXJnZXQgLSBUYXJnZXQgYXJyYXkuXG4gKiBAcGFyYW0ge0FycmF5PGltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFdpdGhDb3VudFBheWxvYWRFbnRyeSB8IGltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbEFiaWxpdGllc1BheWxvYWRFbnRyeT59IHNvdXJjZSAtIFNvdXJjZSBhcnJheS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBtZXJnZVVuaXF1ZUZyb250ZW5kTW9kZWxFdmVudEVudHJpZXModGFyZ2V0LCBzb3VyY2UpIHtcbiAgY29uc3QgZXhpc3RpbmdLZXlzID0gbmV3IFNldCh0YXJnZXQubWFwKChlbnRyeSkgPT4gSlNPTi5zdHJpbmdpZnkoZW50cnkpKSlcblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHNvdXJjZSkge1xuICAgIGNvbnN0IGtleSA9IEpTT04uc3RyaW5naWZ5KGVudHJ5KVxuXG4gICAgaWYgKGV4aXN0aW5nS2V5cy5oYXMoa2V5KSkgY29udGludWVcblxuICAgIHRhcmdldC5wdXNoKGVudHJ5KVxuICAgIGV4aXN0aW5nS2V5cy5hZGQoa2V5KVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxQcm9qZWN0aW9uUGF5bG9hZH0gdGFyZ2V0IC0gVGFyZ2V0IHBheWxvYWQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFByb2plY3Rpb25QYXlsb2FkfSBzb3VyY2UgLSBTb3VyY2UgcGF5bG9hZC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBtZXJnZUZyb250ZW5kTW9kZWxFdmVudFByb2plY3Rpb25QYXlsb2FkKHRhcmdldCwgc291cmNlKSB7XG4gIGlmIChzb3VyY2UucHJlbG9hZCkge1xuICAgIGlmICghdGFyZ2V0LnByZWxvYWQpIHRhcmdldC5wcmVsb2FkID0ge31cbiAgICBtZXJnZUZyb250ZW5kTW9kZWxFdmVudFByZWxvYWQodGFyZ2V0LnByZWxvYWQsIHNvdXJjZS5wcmVsb2FkKVxuICB9XG5cbiAgaWYgKHNvdXJjZS5zZWxlY3QpIHtcbiAgICBpZiAoIXRhcmdldC5zZWxlY3QpIHRhcmdldC5zZWxlY3QgPSB7fVxuICAgIG1lcmdlRnJvbnRlbmRNb2RlbEV2ZW50U2VsZWN0KHRhcmdldC5zZWxlY3QsIHNvdXJjZS5zZWxlY3QpXG4gIH1cblxuICBpZiAoc291cmNlLnNlbGVjdHNFeHRyYSkge1xuICAgIGlmICghdGFyZ2V0LnNlbGVjdHNFeHRyYSkgdGFyZ2V0LnNlbGVjdHNFeHRyYSA9IHt9XG4gICAgbWVyZ2VGcm9udGVuZE1vZGVsRXZlbnRTZWxlY3QodGFyZ2V0LnNlbGVjdHNFeHRyYSwgc291cmNlLnNlbGVjdHNFeHRyYSlcbiAgfVxuXG4gIGlmIChzb3VyY2Uud2l0aENvdW50KSB7XG4gICAgaWYgKCF0YXJnZXQud2l0aENvdW50KSB0YXJnZXQud2l0aENvdW50ID0gW11cbiAgICBtZXJnZVVuaXF1ZUZyb250ZW5kTW9kZWxFdmVudEVudHJpZXModGFyZ2V0LndpdGhDb3VudCwgc291cmNlLndpdGhDb3VudClcbiAgfVxuXG4gIGlmIChzb3VyY2UuYWJpbGl0aWVzKSB7XG4gICAgaWYgKCF0YXJnZXQuYWJpbGl0aWVzKSB0YXJnZXQuYWJpbGl0aWVzID0gW11cbiAgICBtZXJnZVVuaXF1ZUZyb250ZW5kTW9kZWxFdmVudEVudHJpZXModGFyZ2V0LmFiaWxpdGllcywgc291cmNlLmFiaWxpdGllcylcbiAgfVxuXG4gIGlmIChzb3VyY2UucXVlcnlEYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCB0YXJnZXRRdWVyeURhdGEgPSBBcnJheS5pc0FycmF5KHRhcmdldC5xdWVyeURhdGEpID8gdGFyZ2V0LnF1ZXJ5RGF0YSA6IFtdXG5cbiAgICB0YXJnZXQucXVlcnlEYXRhID0gdGFyZ2V0UXVlcnlEYXRhXG4gICAgY29uc3QgcXVlcnlEYXRhRW50cmllcyA9IEFycmF5LmlzQXJyYXkoc291cmNlLnF1ZXJ5RGF0YSkgPyBzb3VyY2UucXVlcnlEYXRhIDogW3NvdXJjZS5xdWVyeURhdGFdXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHF1ZXJ5RGF0YUVudHJpZXMpIHtcbiAgICAgIHRhcmdldFF1ZXJ5RGF0YS5wdXNoKGVudHJ5KVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYm9keSAtIFJhdyB3ZWJzb2NrZXQgZXZlbnQgYm9keS5cbiAqIEByZXR1cm5zIHtTZXQ8c3RyaW5nPn0gLSBNYXRjaGVkIGV2ZW50IGZpbHRlciBrZXlzIGRlbGl2ZXJlZCBieSB0aGUgYmFja2VuZC5cbiAqL1xuZnVuY3Rpb24gZnJvbnRlbmRNb2RlbE1hdGNoZWRFdmVudEZpbHRlcktleXMoYm9keSkge1xuICBpZiAoIWJvZHkgfHwgdHlwZW9mIGJvZHkgIT09IFwib2JqZWN0XCIpIHJldHVybiBuZXcgU2V0KClcblxuICBjb25zdCBrZXlzID0gLyoqIEB0eXBlIHt7bWF0Y2hlZEV2ZW50RmlsdGVyS2V5cz86IHVua25vd259fSAqLyAoYm9keSkubWF0Y2hlZEV2ZW50RmlsdGVyS2V5c1xuXG4gIGlmICghQXJyYXkuaXNBcnJheShrZXlzKSkgcmV0dXJuIG5ldyBTZXQoKVxuXG4gIHJldHVybiBuZXcgU2V0KGtleXMubWFwKChrZXkpID0+IFN0cmluZyhrZXkpKSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0Zyb250ZW5kTW9kZWxNb2RlbEV2ZW50Q2FsbGJhY2tFbnRyeX0gZW50cnkgLSBDYWxsYmFjayBlbnRyeS5cbiAqIEBwYXJhbSB7U2V0PHN0cmluZz59IG1hdGNoZWRFdmVudEZpbHRlcktleXMgLSBCYWNrZW5kIG1hdGNoZWQgZmlsdGVyIGtleXMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgY2FsbGJhY2sgc2hvdWxkIHJlY2VpdmUgdGhlIGV2ZW50LlxuICovXG5mdW5jdGlvbiBmcm9udGVuZE1vZGVsRXZlbnRFbnRyeU1hdGNoZXMoZW50cnksIG1hdGNoZWRFdmVudEZpbHRlcktleXMpIHtcbiAgaWYgKCFlbnRyeS5ldmVudEZpbHRlcktleSkgcmV0dXJuIHRydWVcblxuICByZXR1cm4gbWF0Y2hlZEV2ZW50RmlsdGVyS2V5cy5oYXMoZW50cnkuZXZlbnRGaWx0ZXJLZXkpXG59XG5cbi8qKlxuICogQHBhcmFtIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9IE1vZGVsQ2xhc3MgLSBFdmVudCBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsRXZlbnRPcHRpb25zfSBvcHRpb25zIC0gRXZlbnQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBhc3NlcnROb0Rlc3Ryb3lFdmVudEZpbHRlcihNb2RlbENsYXNzLCBvcHRpb25zKSB7XG4gIGNvbnN0IGV2ZW50T3B0aW9uc1BheWxvYWQgPSBmcm9udGVuZE1vZGVsRXZlbnRPcHRpb25zUGF5bG9hZChNb2RlbENsYXNzLCBvcHRpb25zKVxuXG4gIGlmICghZXZlbnRPcHRpb25zUGF5bG9hZC5ldmVudEZpbHRlcktleSkgcmV0dXJuXG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiRnJvbnRlbmQgbW9kZWwgZGVzdHJveSBldmVudCBzdWJzY3JpcHRpb25zIGRvIG5vdCBzdXBwb3J0IHF1ZXJ5IGZpbHRlcnNcIilcbn1cblxuLyoqXG4gKiBQZXItbW9kZWwgY2xhc3Mgc2luZ2xldG9uIHRoYXQgbXVsdGlwbGV4ZXMgYWxsIHJlZ2lzdGVyZWQgb25DcmVhdGUgL1xuICogb25VcGRhdGUgLyBvbkRlc3Ryb3kgY2FsbGJhY2tzIOKAlCBjbGFzcy1sZXZlbCArIGluc3RhbmNlLWxldmVsIOKAlFxuICogb3ZlciBvbmUgV2Vic29ja2V0Q2hhbm5lbFYyIHN1YnNjcmlwdGlvbi4gU3Vic2NyaXB0aW9uIG9wZW5zIG9uIHRoZVxuICogZmlyc3QgbGlzdGVuZXIgYW5kIGNsb3NlcyB3aGVuIHRoZSBsYXN0IG9uZSB1bnN1YnNjcmliZXMuXG4gKlxuICogSW5zdGFuY2UtbGV2ZWwgbGlzdGVuZXJzIGFsc28gcmVjZWl2ZSBhdXRvLW1lcmdlOiB3aGVuIGFuIGB1cGRhdGVgXG4gKiBldmVudCBhcnJpdmVzIGZvciBhIHJlZ2lzdGVyZWQgaW5zdGFuY2UgaWQsIHRoZSBpbnN0YW5jZSdzXG4gKiBhdHRyaWJ1dGVzIGFyZSB1cGRhdGVkIGluIHBsYWNlIGJlZm9yZSB0aGUgY2FsbGJhY2sgZmlyZXMsIHNvXG4gKiBjYWxsZXJzIGNhbiByZWFkIGZyZXNoIHZhbHVlcyBmcm9tIHRoZSBzYW1lIGluc3RhbmNlIGhhbmRsZS5cbiAqL1xuY2xhc3MgRnJvbnRlbmRNb2RlbEV2ZW50U3Vic2NyaXB0aW9uIHtcbiAgLyoqIEBwYXJhbSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBNb2RlbENsYXNzIC0gRnJvbnRlbmQgbW9kZWwgY2xhc3MgZm9yIHRoaXMgc3Vic2NyaXB0aW9uIGJ1Y2tldC4gKi9cbiAgY29uc3RydWN0b3IoTW9kZWxDbGFzcykge1xuICAgIHRoaXMuTW9kZWxDbGFzcyA9IE1vZGVsQ2xhc3NcbiAgICAvKiogQHR5cGUge1NldDxGcm9udGVuZE1vZGVsTW9kZWxFdmVudENhbGxiYWNrRW50cnk+fSAqL1xuICAgIHRoaXMuY2xhc3NDcmVhdGVDYWxsYmFja3MgPSBuZXcgU2V0KClcbiAgICAvKiogQHR5cGUge1NldDxGcm9udGVuZE1vZGVsTW9kZWxFdmVudENhbGxiYWNrRW50cnk+fSAqL1xuICAgIHRoaXMuY2xhc3NVcGRhdGVDYWxsYmFja3MgPSBuZXcgU2V0KClcbiAgICAvKiogQHR5cGUge1NldDxGcm9udGVuZE1vZGVsRGVzdHJveUV2ZW50Q2FsbGJhY2tFbnRyeT59ICovXG4gICAgdGhpcy5jbGFzc0Rlc3Ryb3lDYWxsYmFja3MgPSBuZXcgU2V0KClcbiAgICAvKiogQHR5cGUge01hcDxzdHJpbmcsIHtpbnN0YW5jZTogSW5zdGFuY2VUeXBlPHR5cGVvZiBGcm9udGVuZE1vZGVsQmFzZT4sIHVwZGF0ZUNhbGxiYWNrczogU2V0PEZyb250ZW5kTW9kZWxNb2RlbEV2ZW50Q2FsbGJhY2tFbnRyeT4sIGRlc3Ryb3lDYWxsYmFja3M6IFNldDxGcm9udGVuZE1vZGVsRGVzdHJveUV2ZW50Q2FsbGJhY2tFbnRyeT59Pn0gKi9cbiAgICB0aGlzLmluc3RhbmNlTGlzdGVuZXJzID0gbmV3IE1hcCgpXG4gICAgLyoqIEB0eXBlIHthbnl9ICovXG4gICAgdGhpcy5jaGFubmVsSGFuZGxlID0gbnVsbFxuICAgIC8qKiBAdHlwZSB7UHJvbWlzZTx2b2lkPiB8IG51bGx9ICovXG4gICAgdGhpcy5yZWFkeVByb21pc2UgPSBudWxsXG4gICAgLyoqIEB0eXBlIHtzdHJpbmcgfCBudWxsfSAqL1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uUGFyYW1zS2V5ID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHt7bW9kZWw6IHN0cmluZywgZXZlbnRGaWx0ZXJzPzogaW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsRXZlbnRGaWx0ZXJQYXlsb2FkRW50cnlbXSwgdW5maWx0ZXJlZEV2ZW50RGVsaXZlcnk/OiBib29sZWFufSAmIGltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFByb2plY3Rpb25QYXlsb2FkfSAtIEN1cnJlbnQgd2Vic29ja2V0IHN1YnNjcmlwdGlvbiBwYXJhbXMuXG4gICAqL1xuICBzdWJzY3JpcHRpb25QYXJhbXMoKSB7XG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxQcm9qZWN0aW9uUGF5bG9hZH0gKi9cbiAgICBjb25zdCBwcm9qZWN0aW9uUGF5bG9hZCA9IHt9XG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxFdmVudEZpbHRlclBheWxvYWRFbnRyeT59ICovXG4gICAgY29uc3QgZXZlbnRGaWx0ZXJzQnlLZXkgPSB7fVxuICAgIGNvbnN0IHByb2plY3Rpb25FbnRyaWVzID0gW11cbiAgICBsZXQgaGFzVW5maWx0ZXJlZEV2ZW50RGVsaXZlcnkgPSB0aGlzLmNsYXNzRGVzdHJveUNhbGxiYWNrcy5zaXplID4gMFxuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmNsYXNzQ3JlYXRlQ2FsbGJhY2tzKSBwcm9qZWN0aW9uRW50cmllcy5wdXNoKGVudHJ5KVxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgdGhpcy5jbGFzc1VwZGF0ZUNhbGxiYWNrcykgcHJvamVjdGlvbkVudHJpZXMucHVzaChlbnRyeSlcblxuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5pbnN0YW5jZUxpc3RlbmVycy52YWx1ZXMoKSkge1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBsaXN0ZW5lci51cGRhdGVDYWxsYmFja3MpIHByb2plY3Rpb25FbnRyaWVzLnB1c2goZW50cnkpXG4gICAgICBpZiAobGlzdGVuZXIuZGVzdHJveUNhbGxiYWNrcy5zaXplID4gMCkgaGFzVW5maWx0ZXJlZEV2ZW50RGVsaXZlcnkgPSB0cnVlXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBwcm9qZWN0aW9uRW50cmllcykge1xuICAgICAgbWVyZ2VGcm9udGVuZE1vZGVsRXZlbnRQcm9qZWN0aW9uUGF5bG9hZChwcm9qZWN0aW9uUGF5bG9hZCwgZW50cnkucHJvamVjdGlvblBheWxvYWQpXG5cbiAgICAgIGlmIChlbnRyeS5ldmVudEZpbHRlcktleSAmJiBlbnRyeS5ldmVudEZpbHRlclBheWxvYWQpIHtcbiAgICAgICAgZXZlbnRGaWx0ZXJzQnlLZXlbZW50cnkuZXZlbnRGaWx0ZXJLZXldID0ge1xuICAgICAgICAgIC4uLmVudHJ5LmV2ZW50RmlsdGVyUGF5bG9hZCxcbiAgICAgICAgICBrZXk6IGVudHJ5LmV2ZW50RmlsdGVyS2V5XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhhc1VuZmlsdGVyZWRFdmVudERlbGl2ZXJ5ID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGV2ZW50RmlsdGVycyA9IE9iamVjdC52YWx1ZXMoZXZlbnRGaWx0ZXJzQnlLZXkpXG4gICAgY29uc3QgZXZlbnRGaWx0ZXJQYXJhbXMgPSBldmVudEZpbHRlcnMubGVuZ3RoID4gMFxuICAgICAgPyB7XG4gICAgICAgICAgZXZlbnRGaWx0ZXJzLFxuICAgICAgICAgIC4uLihoYXNVbmZpbHRlcmVkRXZlbnREZWxpdmVyeSA/IHt1bmZpbHRlcmVkRXZlbnREZWxpdmVyeTogdHJ1ZX0gOiB7fSlcbiAgICAgICAgfVxuICAgICAgOiB7fVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZGVsOiB0aGlzLk1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKCksXG4gICAgICAuLi5ldmVudEZpbHRlclBhcmFtcyxcbiAgICAgIC4uLnByb2plY3Rpb25QYXlsb2FkXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmd9IC0gU3RhYmxlIGtleSBmb3IgY3VycmVudCBzdWJzY3JpcHRpb24gcGFyYW1zLiAqL1xuICBzdWJzY3JpcHRpb25QYXJhbXNKc29uKCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnN1YnNjcmlwdGlvblBhcmFtcygpKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBlbnN1cmVTdWJzY3JpYmVkKCkge1xuICAgIGNvbnN0IHBhcmFtc0pzb24gPSB0aGlzLnN1YnNjcmlwdGlvblBhcmFtc0pzb24oKVxuXG4gICAgaWYgKHRoaXMuY2hhbm5lbEhhbmRsZSAmJiAhdGhpcy5jaGFubmVsSGFuZGxlLmlzQ2xvc2VkKCkpIHtcbiAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvblBhcmFtc0tleSAhPT0gcGFyYW1zSnNvbikge1xuICAgICAgICB0aGlzLmNoYW5uZWxIYW5kbGUuY2xvc2UoKVxuICAgICAgICB0aGlzLmNoYW5uZWxIYW5kbGUgPSBudWxsXG4gICAgICAgIHRoaXMucmVhZHlQcm9taXNlID0gbnVsbFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMucmVhZHlQcm9taXNlKSBhd2FpdCB0aGlzLnJlYWR5UHJvbWlzZVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXJpYWxpemUgcGFyYWxsZWwgY2FsbHMgKGUuZy4gUHJvbWlzZS5hbGwoW29uQ3JlYXRlLCBvblVwZGF0ZSxcbiAgICAvLyBvbkRlc3Ryb3ldKSkgc28gd2Ugb3BlbiBleGFjdGx5IG9uZSBzdWJzY3JpcHRpb24gcGVyIG1vZGVsIGNsYXNzXG4gICAgLy8gaW5zdGVhZCBvZiByYWNpbmcgdGhyZWUgY29uY3VycmVudCBzdWJzY3JpYmVDaGFubmVsIGNhbGxzLlxuICAgIGlmICh0aGlzLnJlYWR5UHJvbWlzZSkge1xuICAgICAgYXdhaXQgdGhpcy5yZWFkeVByb21pc2VcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNsaWVudCA9IC8qKiBAdHlwZSB7YW55fSAqLyAoZnJvbnRlbmRNb2RlbFRyYW5zcG9ydENvbmZpZy53ZWJzb2NrZXRDbGllbnQgfHwgcmVzb2x2ZUludGVybmFsV2Vic29ja2V0Q2xpZW50KCkpXG5cbiAgICBpZiAoIWNsaWVudCB8fCB0eXBlb2YgY2xpZW50LnN1YnNjcmliZUNoYW5uZWwgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRnJvbnRlbmQgbW9kZWwgZXZlbnQgc3Vic2NyaXB0aW9ucyByZXF1aXJlIGNvbmZpZ3VyZVRyYW5zcG9ydCh7d2Vic29ja2V0VXJsfSkgb3IgY29uZmlndXJlVHJhbnNwb3J0KHt3ZWJzb2NrZXRDbGllbnR9KVwiKVxuICAgIH1cblxuICAgIHRoaXMucmVhZHlQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgY2xpZW50LmNvbm5lY3QgPT09IFwiZnVuY3Rpb25cIikgYXdhaXQgY2xpZW50LmNvbm5lY3QoKVxuXG4gICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLnN1YnNjcmlwdGlvblBhcmFtcygpXG5cbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uUGFyYW1zS2V5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zKVxuICAgICAgdGhpcy5jaGFubmVsSGFuZGxlID0gY2xpZW50LnN1YnNjcmliZUNoYW5uZWwoRlJPTlRFTkRfTU9ERUxTX0NIQU5ORUxfTkFNRSwge1xuICAgICAgICBwYXJhbXMsXG4gICAgICAgIG9uTWVzc2FnZTogKC8qKiBAdHlwZSB7YW55fSAqLyBib2R5KSA9PiB0aGlzLl9kaXNwYXRjaEV2ZW50KGJvZHkpLFxuICAgICAgICBvbkNsb3NlOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jaGFubmVsSGFuZGxlID0gbnVsbFxuICAgICAgICAgIHRoaXMucmVhZHlQcm9taXNlID0gbnVsbFxuICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uUGFyYW1zS2V5ID0gbnVsbFxuICAgICAgICAgIHRoaXMuaW5zdGFuY2VMaXN0ZW5lcnMuY2xlYXIoKVxuXG4gICAgICAgICAgY29uc3QgaGFzQ2FsbGJhY2tzID0gdGhpcy5jbGFzc0NyZWF0ZUNhbGxiYWNrcy5zaXplID4gMFxuICAgICAgICAgICAgfHwgdGhpcy5jbGFzc1VwZGF0ZUNhbGxiYWNrcy5zaXplID4gMFxuICAgICAgICAgICAgfHwgdGhpcy5jbGFzc0Rlc3Ryb3lDYWxsYmFja3Muc2l6ZSA+IDBcblxuICAgICAgICAgIGlmIChoYXNDYWxsYmFja3MgJiYgY2xpZW50LmF1dG9SZWNvbm5lY3QpIHtcbiAgICAgICAgICAgIHZvaWQgdGhpcy5lbnN1cmVTdWJzY3JpYmVkKClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBhd2FpdCB0aGlzLmNoYW5uZWxIYW5kbGUucmVhZHlcbiAgICB9KSgpXG5cbiAgICBhd2FpdCB0aGlzLnJlYWR5UHJvbWlzZVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7YW55fSBib2R5IC0gV2ViU29ja2V0IGV2ZW50IHBheWxvYWQuICovXG4gIF9kaXNwYXRjaEV2ZW50KGJvZHkpIHtcbiAgICBpZiAoIWJvZHkgfHwgdHlwZW9mIGJvZHkgIT09IFwib2JqZWN0XCIpIHJldHVyblxuXG4gICAgY29uc3QgYWN0aW9uID0gYm9keS5hY3Rpb25cbiAgICBjb25zdCByYXdJZCA9IGJvZHkuaWRcblxuICAgIGlmIChhY3Rpb24gIT09IFwiY3JlYXRlXCIgJiYgYWN0aW9uICE9PSBcInVwZGF0ZVwiICYmIGFjdGlvbiAhPT0gXCJkZXN0cm95XCIpIHJldHVyblxuICAgIGlmIChyYXdJZCA9PT0gdW5kZWZpbmVkIHx8IHJhd0lkID09PSBudWxsKSByZXR1cm5cblxuICAgIGNvbnN0IGlkID0gU3RyaW5nKHJhd0lkKVxuICAgIGNvbnN0IG1hdGNoZWRFdmVudEZpbHRlcktleXMgPSBmcm9udGVuZE1vZGVsTWF0Y2hlZEV2ZW50RmlsdGVyS2V5cyhib2R5KVxuXG4gICAgaWYgKGFjdGlvbiA9PT0gXCJkZXN0cm95XCIpIHtcbiAgICAgIGNvbnN0IGxpc3RlbmVyID0gdGhpcy5pbnN0YW5jZUxpc3RlbmVycy5nZXQoaWQpXG5cbiAgICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGxpc3RlbmVyLmRlc3Ryb3lDYWxsYmFja3MpIHtcbiAgICAgICAgICB0cnkgeyBlbnRyeS5jYWxsYmFjayh7aWR9KSB9IGNhdGNoIChlcnJvcikgeyBjb25zb2xlLmVycm9yKGVycm9yKSB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnN0YW5jZUxpc3RlbmVycy5kZWxldGUoaWQpXG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuY2xhc3NEZXN0cm95Q2FsbGJhY2tzKSB7XG4gICAgICAgIHRyeSB7IGVudHJ5LmNhbGxiYWNrKHtpZH0pIH0gY2F0Y2ggKGVycm9yKSB7IGNvbnNvbGUuZXJyb3IoZXJyb3IpIH1cbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghYm9keS5yZWNvcmQgfHwgdHlwZW9mIGJvZHkucmVjb3JkICE9PSBcIm9iamVjdFwiKSByZXR1cm5cblxuICAgIGNvbnN0IGRlc2VyaWFsaXplZFJlY29yZCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi8gKGRlc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlKGJvZHkucmVjb3JkKSlcbiAgICBjb25zdCBmcmVzaE1vZGVsID0gLyoqIEB0eXBlIHthbnl9ICovICh0aGlzLk1vZGVsQ2xhc3MpLmluc3RhbnRpYXRlRnJvbVJlc3BvbnNlKGRlc2VyaWFsaXplZFJlY29yZClcbiAgICBjb25zdCBsaXN0ZW5lciA9IHRoaXMuaW5zdGFuY2VMaXN0ZW5lcnMuZ2V0KGlkKVxuXG4gICAgaWYgKGFjdGlvbiA9PT0gXCJ1cGRhdGVcIiAmJiBsaXN0ZW5lcikge1xuICAgICAgY29uc3QgbWF0Y2hpbmdVcGRhdGVDYWxsYmFja3MgPSBBcnJheS5mcm9tKGxpc3RlbmVyLnVwZGF0ZUNhbGxiYWNrcykuZmlsdGVyKChlbnRyeSkgPT5cbiAgICAgICAgZnJvbnRlbmRNb2RlbEV2ZW50RW50cnlNYXRjaGVzKGVudHJ5LCBtYXRjaGVkRXZlbnRGaWx0ZXJLZXlzKVxuICAgICAgKVxuXG4gICAgICBpZiAobWF0Y2hpbmdVcGRhdGVDYWxsYmFja3MubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBBdXRvLW1lcmdlIGludG8gdGhlIHJlZ2lzdGVyZWQgaW5zdGFuY2Ugc28gY2FsbGVycyByZWFkaW5nXG4gICAgICAgIC8vIHRocm91Z2ggdGhlIHNhbWUgaGFuZGxlIHNlZSBmcmVzaCBhdHRyaWJ1dGVzLlxuICAgICAgICBjb25zdCBpbnN0YW5jZUFueSA9IC8qKiBAdHlwZSB7YW55fSAqLyAobGlzdGVuZXIuaW5zdGFuY2UpXG5cbiAgICAgICAgaW5zdGFuY2VBbnkuYXNzaWduQXR0cmlidXRlcyhmcmVzaE1vZGVsLmF0dHJpYnV0ZXMoKSlcbiAgICAgICAgaW5zdGFuY2VBbnkuX3BlcnNpc3RlZEF0dHJpYnV0ZXMgPSBjbG9uZUZyb250ZW5kTW9kZWxBdHRyaWJ1dGVzKGxpc3RlbmVyLmluc3RhbmNlLmF0dHJpYnV0ZXMoKSlcblxuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIG1hdGNoaW5nVXBkYXRlQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgdHJ5IHsgZW50cnkuY2FsbGJhY2soe2lkLCBtb2RlbDogbGlzdGVuZXIuaW5zdGFuY2V9KSB9IGNhdGNoIChlcnJvcikgeyBjb25zb2xlLmVycm9yKGVycm9yKSB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjbGFzc0NhbGxiYWNrcyA9IGFjdGlvbiA9PT0gXCJjcmVhdGVcIiA/IHRoaXMuY2xhc3NDcmVhdGVDYWxsYmFja3MgOiB0aGlzLmNsYXNzVXBkYXRlQ2FsbGJhY2tzXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGNsYXNzQ2FsbGJhY2tzKSB7XG4gICAgICBpZiAoIWZyb250ZW5kTW9kZWxFdmVudEVudHJ5TWF0Y2hlcyhlbnRyeSwgbWF0Y2hlZEV2ZW50RmlsdGVyS2V5cykpIGNvbnRpbnVlXG5cbiAgICAgIHRyeSB7IGVudHJ5LmNhbGxiYWNrKHtpZCwgbW9kZWw6IGZyZXNoTW9kZWx9KSB9IGNhdGNoIChlcnJvcikgeyBjb25zb2xlLmVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBtYXliZVRlYXJkb3duKCkge1xuICAgIGNvbnN0IGhhc0FueUxpc3RlbmVyID0gdGhpcy5jbGFzc0NyZWF0ZUNhbGxiYWNrcy5zaXplID4gMFxuICAgICAgfHwgdGhpcy5jbGFzc1VwZGF0ZUNhbGxiYWNrcy5zaXplID4gMFxuICAgICAgfHwgdGhpcy5jbGFzc0Rlc3Ryb3lDYWxsYmFja3Muc2l6ZSA+IDBcbiAgICAgIHx8IHRoaXMuaW5zdGFuY2VMaXN0ZW5lcnMuc2l6ZSA+IDBcblxuICAgIGlmIChoYXNBbnlMaXN0ZW5lcikgcmV0dXJuXG4gICAgaWYgKCF0aGlzLmNoYW5uZWxIYW5kbGUpIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuY2hhbm5lbEhhbmRsZS5jbG9zZSgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpXG4gICAgfVxuXG4gICAgdGhpcy5jaGFubmVsSGFuZGxlID0gbnVsbFxuICAgIHRoaXMucmVhZHlQcm9taXNlID0gbnVsbFxuICAgIHRoaXMuc3Vic2NyaXB0aW9uUGFyYW1zS2V5ID0gbnVsbFxuICB9XG59XG5cbi8qKiBAdHlwZSB7V2Vha01hcDx0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2UsIEZyb250ZW5kTW9kZWxFdmVudFN1YnNjcmlwdGlvbj59ICovXG5jb25zdCBmcm9udGVuZE1vZGVsRXZlbnRTdWJzY3JpcHRpb25zID0gbmV3IFdlYWtNYXAoKVxuXG4vKipcbiAqIEBwYXJhbSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBNb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MuXG4gKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbEV2ZW50U3Vic2NyaXB0aW9ufSAtIFBlci1jbGFzcyBzdWJzY3JpcHRpb24gaGVscGVyLlxuICovXG5mdW5jdGlvbiBlbnN1cmVGcm9udGVuZE1vZGVsRXZlbnRTdWJzY3JpcHRpb24oTW9kZWxDbGFzcykge1xuICBsZXQgc3ViID0gZnJvbnRlbmRNb2RlbEV2ZW50U3Vic2NyaXB0aW9ucy5nZXQoTW9kZWxDbGFzcylcblxuICBpZiAoIXN1Yikge1xuICAgIHN1YiA9IG5ldyBGcm9udGVuZE1vZGVsRXZlbnRTdWJzY3JpcHRpb24oTW9kZWxDbGFzcylcbiAgICBmcm9udGVuZE1vZGVsRXZlbnRTdWJzY3JpcHRpb25zLnNldChNb2RlbENsYXNzLCBzdWIpXG4gIH1cblxuICByZXR1cm4gc3ViXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlc291cmNlUGF0aCAtIFJlc291cmNlIHBhdGggcHJlZml4LlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbW1hbmROYW1lIC0gQ29tbWFuZCBwYXRoIHNlZ21lbnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIEZyb250ZW5kIG1vZGVsIEFQSSBVUkwuXG4gKi9cbmZ1bmN0aW9uIGZyb250ZW5kTW9kZWxDb21tYW5kVXJsKHJlc291cmNlUGF0aCwgY29tbWFuZE5hbWUpIHtcbiAgY29uc3QgY29uZmlndXJlZFVybCA9IGZyb250ZW5kTW9kZWxUcmFuc3BvcnRVcmwoKVxuICBjb25zdCBub3JtYWxpemVkUmVzb3VyY2VQYXRoID0gcmVzb3VyY2VQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gcmVzb3VyY2VQYXRoIDogYC8ke3Jlc291cmNlUGF0aH1gXG5cbiAgcmV0dXJuIGAke2NvbmZpZ3VyZWRVcmx9JHtub3JtYWxpemVkUmVzb3VyY2VQYXRofS8ke2NvbW1hbmROYW1lfWBcbn1cblxuLyoqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFNoYXJlZCBmcm9udGVuZC1tb2RlbCBBUEkgVVJMLlxuICovXG5mdW5jdGlvbiBmcm9udGVuZE1vZGVsQXBpVXJsKCkge1xuICByZXR1cm4gYCR7ZnJvbnRlbmRNb2RlbFRyYW5zcG9ydFVybCgpfSR7U0hBUkVEX0ZST05URU5EX01PREVMX0FQSV9QQVRIfWBcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gUmVxdWVzdCBVUkwgb3IgcGF0aC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gV2Vic29ja2V0LXNhZmUgcmVxdWVzdCBwYXRoLlxuICovXG5mdW5jdGlvbiBmcm9udGVuZE1vZGVsVHJhbnNwb3J0UGF0aCh1cmwpIHtcbiAgaWYgKHR5cGVvZiB1cmwgIT09IFwic3RyaW5nXCIgfHwgdXJsLmxlbmd0aCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGZyb250ZW5kIG1vZGVsIHRyYW5zcG9ydCBVUkwvcGF0aCwgZ290OiAke3VybH1gKVxuICB9XG5cbiAgaWYgKHVybC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgIHJldHVybiB1cmxcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTCh1cmwpXG5cbiAgICByZXR1cm4gYCR7cGFyc2VkVXJsLnBhdGhuYW1lfSR7cGFyc2VkVXJsLnNlYXJjaH1gXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1cmxcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gcmVxdWVzdFBheWxvYWQgLSBTaGFyZWQgcmVxdWVzdCBwYXlsb2FkLlxuICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IC0gRGVjb2RlZCBzaGFyZWQgZnJvbnRlbmQtbW9kZWwgQVBJIHJlc3BvbnNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBwZXJmb3JtU2hhcmVkRnJvbnRlbmRNb2RlbEFwaVJlcXVlc3QocmVxdWVzdFBheWxvYWQpIHtcbiAgY29uc3Qgc2VyaWFsaXplZFJlcXVlc3RQYXlsb2FkID0gc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlKHJlcXVlc3RQYXlsb2FkKVxuICBjb25zdCB3ZWJzb2NrZXRDbGllbnQgPSBmcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnLndlYnNvY2tldENsaWVudFxuICBjb25zdCB1cmwgPSBmcm9udGVuZE1vZGVsQXBpVXJsKClcbiAgY29uc3QgZHluYW1pY0hlYWRlcnMgPSB0eXBlb2YgZnJvbnRlbmRNb2RlbFRyYW5zcG9ydENvbmZpZy5yZXF1ZXN0SGVhZGVycyA9PT0gXCJmdW5jdGlvblwiXG4gICAgPyAoZnJvbnRlbmRNb2RlbFRyYW5zcG9ydENvbmZpZy5yZXF1ZXN0SGVhZGVycygpIHx8IHt9KVxuICAgIDogKGZyb250ZW5kTW9kZWxUcmFuc3BvcnRDb25maWcucmVxdWVzdEhlYWRlcnMgfHwge30pXG4gIGNvbnN0IG1lcmdlZEhlYWRlcnMgPSB7XCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsIC4uLmR5bmFtaWNIZWFkZXJzfVxuXG4gIGlmICh3ZWJzb2NrZXRDbGllbnQpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHdlYnNvY2tldENsaWVudC5wb3N0KGZyb250ZW5kTW9kZWxUcmFuc3BvcnRQYXRoKHVybCksIHNlcmlhbGl6ZWRSZXF1ZXN0UGF5bG9hZCwge1xuICAgICAgaGVhZGVyczogbWVyZ2VkSGVhZGVyc1xuICAgIH0pXG4gICAgY29uc3QgcmVzcG9uc2VKc29uID0gcmVzcG9uc2UuanNvbigpXG5cbiAgICByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqLyAoZGVzZXJpYWxpemVGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWUocmVzcG9uc2VKc29uKSlcbiAgfVxuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZFJlcXVlc3RQYXlsb2FkKSxcbiAgICBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIsXG4gICAgaGVhZGVyczogbWVyZ2VkSGVhZGVycyxcbiAgICBtZXRob2Q6IFwiUE9TVFwiXG4gIH0pXG5cbiAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpXG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIC8vIFN1cmZhY2UgdGhlIGJhY2tlbmQncyBmcmllbmRseSBlcnJvck1lc3NhZ2UgZW52ZWxvcGUgKHRoZVxuICAgIC8vIGB7c3RhdHVzOiBcImVycm9yXCIsIGVycm9yTWVzc2FnZTogXCIuLi5cIn1gIHNoYXBlIGV2ZXJ5IGNvbnRyb2xsZXJcbiAgICAvLyBzaGlwcyBvbiBpdHMgNHh4LzV4eCByZXNwb25zZXMpIGluc3RlYWQgb2YgdGhlIGdlbmVyaWMgc3RhdHVzXG4gICAgLy8gc3RyaW5nLiBGYWxsIHRocm91Z2ggdG8gdGhlIHN0YXR1cy1vbmx5IG1lc3NhZ2Ugd2hlbiB0aGUgYm9keSBpc1xuICAgIC8vIG1pc3NpbmcsIG5vbi1KU09OLCBvciBoYXMgbm8gdXNhYmxlIGVycm9yTWVzc2FnZSBmaWVsZC5cbiAgICBjb25zdCByZXNwb25zZUNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIilcblxuICAgIGlmIChyZXNwb25zZUNvbnRlbnRUeXBlICYmIHJlc3BvbnNlQ29udGVudFR5cGUuaW5jbHVkZXMoXCJhcHBsaWNhdGlvbi9qc29uXCIpICYmIHJlc3BvbnNlVGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsfSAqL1xuICAgICAgbGV0IGVycm9yQm9keVxuXG4gICAgICB0cnkge1xuICAgICAgICBlcnJvckJvZHkgPSBKU09OLnBhcnNlKHJlc3BvbnNlVGV4dClcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBlcnJvckJvZHkgPSBudWxsXG4gICAgICB9XG5cbiAgICAgIGlmIChlcnJvckJvZHkgJiYgdHlwZW9mIGVycm9yQm9keS5lcnJvck1lc3NhZ2UgPT09IFwic3RyaW5nXCIgJiYgZXJyb3JCb2R5LmVycm9yTWVzc2FnZS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JCb2R5LmVycm9yTWVzc2FnZS50cmltKCkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBSZXF1ZXN0IGZhaWxlZCAoJHtyZXNwb25zZS5zdGF0dXN9KSBmb3Igc2hhcmVkIGZyb250ZW5kIG1vZGVsIEFQSWApXG4gIH1cblxuICBjb25zdCBqc29uID0gcmVzcG9uc2VUZXh0Lmxlbmd0aCA+IDAgPyBKU09OLnBhcnNlKHJlc3BvbnNlVGV4dCkgOiB7fVxuXG4gIHJldHVybiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovIChkZXNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZShqc29uKSlcbn1cblxuLyoqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciBwZW5kaW5nIHNoYXJlZCBmcm9udGVuZC1tb2RlbCByZXF1ZXN0cyBmbHVzaC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmx1c2hQZW5kaW5nU2hhcmVkRnJvbnRlbmRNb2RlbFJlcXVlc3RzKCkge1xuICBzaGFyZWRGcm9udGVuZE1vZGVsRmx1c2hTY2hlZHVsZWQgPSBmYWxzZVxuXG4gIGlmIChwZW5kaW5nU2hhcmVkRnJvbnRlbmRNb2RlbFJlcXVlc3RzLmxlbmd0aCA8IDEpIHtcbiAgICByZXNvbHZlRnJvbnRlbmRNb2RlbElkbGVXYWl0ZXJzKClcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IGJhdGNoZWRSZXF1ZXN0cyA9IHBlbmRpbmdTaGFyZWRGcm9udGVuZE1vZGVsUmVxdWVzdHNcbiAgcGVuZGluZ1NoYXJlZEZyb250ZW5kTW9kZWxSZXF1ZXN0cyA9IFtdXG5cbiAgY29uc3QgdXJsID0gZnJvbnRlbmRNb2RlbEFwaVVybCgpXG4gIGNvbnN0IHJlcXVlc3RQYXlsb2FkID0ge1xuICAgIHJlcXVlc3RzOiBiYXRjaGVkUmVxdWVzdHMubWFwKChyZXF1ZXN0KSA9PiB7XG4gICAgICBpZiAocmVxdWVzdC5jdXN0b21QYXRoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29tbWFuZFR5cGU6IHJlcXVlc3QuY29tbWFuZFR5cGUsXG4gICAgICAgICAgY3VzdG9tUGF0aDogcmVxdWVzdC5jdXN0b21QYXRoLFxuICAgICAgICAgIG1vZGVsOiByZXF1ZXN0Lm1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKCksXG4gICAgICAgICAgcGF5bG9hZDogcmVxdWVzdC5wYXlsb2FkLFxuICAgICAgICAgIHJlcXVlc3RJZDogcmVxdWVzdC5yZXF1ZXN0SWRcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kVHlwZTogcmVxdWVzdC5jb21tYW5kVHlwZSxcbiAgICAgICAgbW9kZWw6IHJlcXVlc3QubW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKSxcbiAgICAgICAgcGF5bG9hZDogcmVxdWVzdC5wYXlsb2FkLFxuICAgICAgICByZXF1ZXN0SWQ6IHJlcXVlc3QucmVxdWVzdElkXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGF3YWl0IHRyYWNrRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFJlcXVlc3QoYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICB2b2lkIHVybFxuICAgICAgY29uc3QgZGVjb2RlZFJlc3BvbnNlID0gYXdhaXQgcGVyZm9ybVNoYXJlZEZyb250ZW5kTW9kZWxBcGlSZXF1ZXN0KHJlcXVlc3RQYXlsb2FkKVxuICAgICAgY29uc3QgcmVzcG9uc2VzID0gQXJyYXkuaXNBcnJheShkZWNvZGVkUmVzcG9uc2UucmVzcG9uc2VzKSA/IGRlY29kZWRSZXNwb25zZS5yZXNwb25zZXMgOiBbXVxuICAgICAgY29uc3QgcmVzcG9uc2VzQnlJZCA9IG5ldyBNYXAocmVzcG9uc2VzLm1hcCgoZW50cnkpID0+IFtlbnRyeS5yZXF1ZXN0SWQsIGVudHJ5LnJlc3BvbnNlXSkpXG5cbiAgICAgIGZvciAoY29uc3QgcmVxdWVzdCBvZiBiYXRjaGVkUmVxdWVzdHMpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VQYXlsb2FkID0gcmVzcG9uc2VzQnlJZC5nZXQocmVxdWVzdC5yZXF1ZXN0SWQpXG5cbiAgICAgICAgaWYgKCFyZXNwb25zZVBheWxvYWQgfHwgdHlwZW9mIHJlc3BvbnNlUGF5bG9hZCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIHJlcXVlc3QucmVqZWN0KG5ldyBFcnJvcihgTWlzc2luZyBiYXRjaGVkIHJlc3BvbnNlIGZvciAke3JlcXVlc3QubW9kZWxDbGFzcy5uYW1lfSMke3JlcXVlc3QuY29tbWFuZFR5cGV9YCkpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIHJlcXVlc3QucmVzb2x2ZSgvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovIChyZXNwb25zZVBheWxvYWQpKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBmb3IgKGNvbnN0IHJlcXVlc3Qgb2YgYmF0Y2hlZFJlcXVlc3RzKSB7XG4gICAgICAgIHJlcXVlc3QucmVqZWN0KGVycm9yKVxuICAgICAgfVxuICAgIH1cbiAgfSlcbn1cblxuLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuZnVuY3Rpb24gc2NoZWR1bGVTaGFyZWRGcm9udGVuZE1vZGVsUmVxdWVzdEZsdXNoKCkge1xuICBpZiAoc2hhcmVkRnJvbnRlbmRNb2RlbEZsdXNoU2NoZWR1bGVkKSByZXR1cm5cblxuICBzaGFyZWRGcm9udGVuZE1vZGVsRmx1c2hTY2hlZHVsZWQgPSB0cnVlXG4gIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICB2b2lkIGZsdXNoUGVuZGluZ1NoYXJlZEZyb250ZW5kTW9kZWxSZXF1ZXN0cygpXG4gIH0pXG59XG5cbi8qKlxuICogQ3VzdG9tIGNvbW1hbmRzIHN0aWxsIHVzZSB0aGUgc2hhcmVkIGZyb250ZW5kLW1vZGVsIEFQSS4gVGhpcyBoZWxwZXIgb25seSBidWlsZHMgdGhlIGJhY2tlbmQgcm91dGUgcGF0aCB0aGUgc2VydmVyIHNob3VsZCBkaXNwYXRjaCBhZnRlciB2YWxpZGF0aW5nIHRoZSBzZWdtZW50cy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY29tbWFuZE5hbWUgLSBDb21tYW5kIHBhdGggc2VnbWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm1vZGVsTmFtZSAtIEZyb250ZW5kIG1vZGVsIGNsYXNzIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWR9IFthcmdzLm1lbWJlcklkXSAtIE9wdGlvbmFsIG1lbWJlciBpZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnJlc291cmNlUGF0aCAtIFJlc291cmNlIHBhdGggcHJlZml4LlxuICogQHJldHVybnMge3N0cmluZ30gLSBDdXN0b20gYmFja2VuZCByb3V0ZSBwYXRoLlxuICovXG5mdW5jdGlvbiBmcm9udGVuZE1vZGVsQ3VzdG9tQ29tbWFuZFBhdGgoe2NvbW1hbmROYW1lLCBtZW1iZXJJZCwgbW9kZWxOYW1lLCByZXNvdXJjZVBhdGh9KSB7XG4gIGNvbnN0IHZhbGlkYXRlZFJlc291cmNlUGF0aCA9IHZhbGlkYXRlRnJvbnRlbmRNb2RlbFJlc291cmNlUGF0aCh7bW9kZWxOYW1lLCByZXNvdXJjZVBhdGh9KVxuICBjb25zdCB2YWxpZGF0ZWRDb21tYW5kTmFtZSA9IHZhbGlkYXRlRnJvbnRlbmRNb2RlbFJlc291cmNlQ29tbWFuZE5hbWUoe2NvbW1hbmROYW1lLCBjb21tYW5kVHlwZTogY29tbWFuZE5hbWUsIG1vZGVsTmFtZX0pXG5cbiAgaWYgKG1lbWJlcklkID09PSB1bmRlZmluZWQgfHwgbWVtYmVySWQgPT09IG51bGwgfHwgbWVtYmVySWQgPT09IFwiXCIpIHtcbiAgICByZXR1cm4gYCR7dmFsaWRhdGVkUmVzb3VyY2VQYXRofS8ke3ZhbGlkYXRlZENvbW1hbmROYW1lfWBcbiAgfVxuXG4gIHJldHVybiBgJHt2YWxpZGF0ZWRSZXNvdXJjZVBhdGh9LyR7ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhtZW1iZXJJZCkpfS8ke3ZhbGlkYXRlZENvbW1hbmROYW1lfWBcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmRpdGlvbnMgLSBmaW5kQnkgY29uZGl0aW9ucy5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAtIEpTT04tbm9ybWFsaXplZCBjb25kaXRpb25zLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVGaW5kQ29uZGl0aW9ucyhjb25kaXRpb25zKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi8gKEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoY29uZGl0aW9ucykpKVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgZmluZEJ5IGNvbmRpdGlvbnMgY291bGQgbm90IGJlIHNlcmlhbGl6ZWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsIHtjYXVzZTogZXJyb3J9KVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBjb25kaXRpb25zIC0gZmluZEJ5IGNvbmRpdGlvbnMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0RmluZEJ5Q29uZGl0aW9uc1NoYXBlKGNvbmRpdGlvbnMpIHtcbiAgaWYgKCFjb25kaXRpb25zIHx8IHR5cGVvZiBjb25kaXRpb25zICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoY29uZGl0aW9ucykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGZpbmRCeSBleHBlY3RzIGNvbmRpdGlvbnMgdG8gYmUgYSBwbGFpbiBvYmplY3QsIGdvdDogJHtjb25kaXRpb25zfWApXG4gIH1cblxuICBjb25zdCBjb25kaXRpb25zUHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNvbmRpdGlvbnMpXG5cbiAgaWYgKGNvbmRpdGlvbnNQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUgJiYgY29uZGl0aW9uc1Byb3RvdHlwZSAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZmluZEJ5IGV4cGVjdHMgY29uZGl0aW9ucyB0byBiZSBhIHBsYWluIG9iamVjdCwgZ290OiAke2NvbmRpdGlvbnN9YClcbiAgfVxuXG4gIGNvbnN0IHN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGNvbmRpdGlvbnMpXG5cbiAgaWYgKHN5bWJvbEtleXMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZmluZEJ5IGRvZXMgbm90IHN1cHBvcnQgc3ltYm9sIGNvbmRpdGlvbiBrZXlzIChrZXlzOiAke3N5bWJvbEtleXMubWFwKChrZXkpID0+IGtleS50b1N0cmluZygpKS5qb2luKFwiLCBcIil9KWApXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ29uZGl0aW9uIHZhbHVlIHRvIHZhbGlkYXRlLlxuICogQHBhcmFtIHtzdHJpbmd9IGtleVBhdGggLSBLZXkgcGF0aCBmb3IgZXJyb3Igb3V0cHV0LlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGFzc2VydERlZmluZWRGaW5kQnlDb25kaXRpb25WYWx1ZSh2YWx1ZSwga2V5UGF0aCkge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZmluZEJ5IGRvZXMgbm90IHN1cHBvcnQgdW5kZWZpbmVkIGNvbmRpdGlvbiB2YWx1ZXMgKGtleTogJHtrZXlQYXRofSlgKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBmaW5kQnkgZG9lcyBub3Qgc3VwcG9ydCBmdW5jdGlvbiBjb25kaXRpb24gdmFsdWVzIChrZXk6ICR7a2V5UGF0aH0pYClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3ltYm9sXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGZpbmRCeSBkb2VzIG5vdCBzdXBwb3J0IHN5bWJvbCBjb25kaXRpb24gdmFsdWVzIChrZXk6ICR7a2V5UGF0aH0pYClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYmlnaW50XCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGZpbmRCeSBkb2VzIG5vdCBzdXBwb3J0IGJpZ2ludCBjb25kaXRpb24gdmFsdWVzIChrZXk6ICR7a2V5UGF0aH0pYClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGZpbmRCeSBkb2VzIG5vdCBzdXBwb3J0IG5vbi1maW5pdGUgbnVtYmVyIGNvbmRpdGlvbiB2YWx1ZXMgKGtleTogJHtrZXlQYXRofSlgKVxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgdmFsdWUuZm9yRWFjaCgoZW50cnksIGluZGV4KSA9PiB7XG4gICAgICBhc3NlcnREZWZpbmVkRmluZEJ5Q29uZGl0aW9uVmFsdWUoZW50cnksIGAke2tleVBhdGh9WyR7aW5kZXh9XWApXG4gICAgfSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBvYmplY3RWYWx1ZSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovICh2YWx1ZSlcbiAgICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0VmFsdWUpXG5cbiAgICBpZiAocHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIHByb3RvdHlwZSAhPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBmaW5kQnkgZG9lcyBub3Qgc3VwcG9ydCBub24tcGxhaW4gb2JqZWN0IGNvbmRpdGlvbiB2YWx1ZXMgKGtleTogJHtrZXlQYXRofSlgKVxuICAgIH1cblxuICAgIGNvbnN0IHN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdFZhbHVlKVxuXG4gICAgaWYgKHN5bWJvbEtleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBmaW5kQnkgZG9lcyBub3Qgc3VwcG9ydCBzeW1ib2wgY29uZGl0aW9uIGtleXMgKGtleTogJHtrZXlQYXRofSlgKVxuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlT2JqZWN0ID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHZhbHVlKVxuXG4gICAgT2JqZWN0LmtleXModmFsdWVPYmplY3QpLmZvckVhY2goKG5lc3RlZEtleSkgPT4ge1xuICAgICAgYXNzZXJ0RGVmaW5lZEZpbmRCeUNvbmRpdGlvblZhbHVlKHZhbHVlT2JqZWN0W25lc3RlZEtleV0sIGAke2tleVBhdGh9LiR7bmVzdGVkS2V5fWApXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gb3JpZ2luYWxWYWx1ZSAtIE9yaWdpbmFsIGNvbmRpdGlvbiB2YWx1ZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gbm9ybWFsaXplZFZhbHVlIC0gSlNPTi1ub3JtYWxpemVkIGNvbmRpdGlvbiB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlQYXRoIC0gS2V5IHBhdGggZm9yIGVycm9yIG91dHB1dC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBhc3NlcnRGaW5kQnlDb25kaXRpb25TZXJpYWxpemF0aW9uUHJlc2VydmVzVmFsdWUob3JpZ2luYWxWYWx1ZSwgbm9ybWFsaXplZFZhbHVlLCBrZXlQYXRoKSB7XG4gIGlmIChvcmlnaW5hbFZhbHVlID09PSBudWxsKSB7XG4gICAgaWYgKG5vcm1hbGl6ZWRWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBmaW5kQnkgY29uZGl0aW9uIGNoYW5nZWQgZHVyaW5nIHNlcmlhbGl6YXRpb24gKGtleTogJHtrZXlQYXRofSlgKVxuICAgIH1cblxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkob3JpZ2luYWxWYWx1ZSkpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobm9ybWFsaXplZFZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBmaW5kQnkgY29uZGl0aW9uIGNoYW5nZWQgZHVyaW5nIHNlcmlhbGl6YXRpb24gKGtleTogJHtrZXlQYXRofSlgKVxuICAgIH1cblxuICAgIGlmIChvcmlnaW5hbFZhbHVlLmxlbmd0aCAhPT0gbm9ybWFsaXplZFZhbHVlLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBmaW5kQnkgY29uZGl0aW9uIGNoYW5nZWQgZHVyaW5nIHNlcmlhbGl6YXRpb24gKGtleTogJHtrZXlQYXRofSlgKVxuICAgIH1cblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBvcmlnaW5hbFZhbHVlLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgYXNzZXJ0RmluZEJ5Q29uZGl0aW9uU2VyaWFsaXphdGlvblByZXNlcnZlc1ZhbHVlKG9yaWdpbmFsVmFsdWVbaW5kZXhdLCBub3JtYWxpemVkVmFsdWVbaW5kZXhdLCBgJHtrZXlQYXRofVske2luZGV4fV1gKVxuICAgIH1cblxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKG9yaWdpbmFsVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgaWYgKHR5cGVvZiBub3JtYWxpemVkVmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZmluZEJ5IGNvbmRpdGlvbiBjaGFuZ2VkIGR1cmluZyBzZXJpYWxpemF0aW9uIChrZXk6ICR7a2V5UGF0aH0pYClcbiAgICB9XG5cbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChvcmlnaW5hbFZhbHVlICYmIHR5cGVvZiBvcmlnaW5hbFZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgaWYgKCFub3JtYWxpemVkVmFsdWUgfHwgdHlwZW9mIG5vcm1hbGl6ZWRWYWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KG5vcm1hbGl6ZWRWYWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZmluZEJ5IGNvbmRpdGlvbiBjaGFuZ2VkIGR1cmluZyBzZXJpYWxpemF0aW9uIChrZXk6ICR7a2V5UGF0aH0pYClcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVkT2JqZWN0ID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKG5vcm1hbGl6ZWRWYWx1ZSlcbiAgICBjb25zdCBvcmlnaW5hbE9iamVjdCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChvcmlnaW5hbFZhbHVlKVxuXG4gICAgT2JqZWN0LmtleXMob3JpZ2luYWxPYmplY3QpLmZvckVhY2goKG5lc3RlZEtleSkgPT4ge1xuICAgICAgaWYgKCEobmVzdGVkS2V5IGluIG5vcm1hbGl6ZWRPYmplY3QpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgZmluZEJ5IGNvbmRpdGlvbiBrZXkgd2FzIHJlbW92ZWQgZHVyaW5nIHNlcmlhbGl6YXRpb24gKGtleTogJHtrZXlQYXRofS4ke25lc3RlZEtleX0pYClcbiAgICAgIH1cblxuICAgICAgYXNzZXJ0RmluZEJ5Q29uZGl0aW9uU2VyaWFsaXphdGlvblByZXNlcnZlc1ZhbHVlKG9yaWdpbmFsT2JqZWN0W25lc3RlZEtleV0sIG5vcm1hbGl6ZWRPYmplY3RbbmVzdGVkS2V5XSwgYCR7a2V5UGF0aH0uJHtuZXN0ZWRLZXl9YClcbiAgICB9KVxuXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAobm9ybWFsaXplZFZhbHVlICE9PSBvcmlnaW5hbFZhbHVlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBmaW5kQnkgY29uZGl0aW9uIGNoYW5nZWQgZHVyaW5nIHNlcmlhbGl6YXRpb24gKGtleTogJHtrZXlQYXRofSlgKVxuICB9XG59XG5cbi8qKiBCYXNlIGNsYXNzIGZvciBnZW5lcmF0ZWQgZnJvbnRlbmQgbW9kZWwgY2xhc3Nlcy4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZyb250ZW5kTW9kZWxCYXNlIHtcbiAgLyoqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovXG4gIHN0YXRpYyBtb2RlbE5hbWVcblxuICAvKiogQHR5cGUge2Jvb2xlYW59IC0gR2xvYmFsIGF1dG8tYmF0Y2gtcHJlbG9hZCB0b2dnbGUuIEFwcHMgY2FuIG9wdCBvdXQgdmlhIEZyb250ZW5kTW9kZWxCYXNlLnNldEF1dG9sb2FkKGZhbHNlKS4gKi9cbiAgc3RhdGljIF9hdXRvbG9hZCA9IHRydWVcblxuICAvKiogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgYXV0by1iYXRjaC1wcmVsb2FkIG9mIHJlbGF0aW9uc2hpcHMgb24gbGF6eSBhY2Nlc3MgaXMgZW5hYmxlZCBnbG9iYWxseS4gKi9cbiAgc3RhdGljIGdldEF1dG9sb2FkKCkgeyByZXR1cm4gRnJvbnRlbmRNb2RlbEJhc2UuX2F1dG9sb2FkIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtib29sZWFufSBuZXdWYWx1ZSAtIFdoZXRoZXIgYXV0by1iYXRjaC1wcmVsb2FkIG9mIHJlbGF0aW9uc2hpcHMgaXMgZW5hYmxlZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgc2V0QXV0b2xvYWQobmV3VmFsdWUpIHsgRnJvbnRlbmRNb2RlbEJhc2UuX2F1dG9sb2FkID0gbmV3VmFsdWUgfVxuXG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgX2F0dHJpYnV0ZXNcbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBGcm9udGVuZE1vZGVsSGFzTWFueVJlbGF0aW9uc2hpcDxhbnksIGFueT4gfCBGcm9udGVuZE1vZGVsU2luZ3VsYXJSZWxhdGlvbnNoaXA8YW55LCBhbnk+Pn0gKi9cbiAgX3JlbGF0aW9uc2hpcHNcbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBGcm9udGVuZE1vZGVsQXR0YWNobWVudEhhbmRsZT59ICovXG4gIF9hdHRhY2htZW50c1xuICAvKiogQHR5cGUge1NldDxzdHJpbmc+IHwgbnVsbH0gKi9cbiAgX3NlbGVjdGVkQXR0cmlidXRlc1xuICAvKiogQHR5cGUge2Jvb2xlYW59ICovXG4gIF9pc05ld1JlY29yZFxuICAvKiogQHR5cGUge2Jvb2xlYW59ICovXG4gIF9tYXJrZWRGb3JEZXN0cnVjdGlvblxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gIF9wZXJzaXN0ZWRBdHRyaWJ1dGVzXG4gIC8qKiBAdHlwZSB7QXJyYXk8RnJvbnRlbmRNb2RlbEJhc2U+IHwgdW5kZWZpbmVkfSAtIFNoYXJlZCByZWZlcmVuY2UgdG8gc2libGluZyByZWNvcmRzIGxvYWRlZCBpbiB0aGUgc2FtZSBiYXRjaC4gVXNlZCBieSBhdXRvLWJhdGNoLXByZWxvYWQuICovXG4gIF9sb2FkQ29ob3J0XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2F0dHJpYnV0ZXNdIC0gSW5pdGlhbCBhdHRyaWJ1dGVzLlxuICAgKi9cbiAgY29uc3RydWN0b3IoYXR0cmlidXRlcyA9IHt9KSB7XG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSAqLyAodGhpcy5jb25zdHJ1Y3RvcilcblxuICAgIE1vZGVsQ2xhc3MuZW5zdXJlR2VuZXJhdGVkQXR0YWNobWVudE1ldGhvZHMoKVxuICAgIHRoaXMuX2F0dHJpYnV0ZXMgPSB7fVxuICAgIHRoaXMuX3JlbGF0aW9uc2hpcHMgPSB7fVxuICAgIHRoaXMuX2F0dGFjaG1lbnRzID0ge31cbiAgICB0aGlzLl9zZWxlY3RlZEF0dHJpYnV0ZXMgPSBudWxsXG4gICAgdGhpcy5faXNOZXdSZWNvcmQgPSB0cnVlXG4gICAgdGhpcy5fbWFya2VkRm9yRGVzdHJ1Y3Rpb24gPSBmYWxzZVxuICAgIHRoaXMuX3BlcnNpc3RlZEF0dHJpYnV0ZXMgPSB7fVxuICAgIHRoaXMuYXNzaWduQXR0cmlidXRlcyhhdHRyaWJ1dGVzKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9XG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIEVuc3VyZXMgYXR0YWNobWVudCBoZWxwZXIgbWV0aG9kcyBleGlzdCBvbiB0aGUgcHJvdG90eXBlLlxuICAgKi9cbiAgc3RhdGljIGVuc3VyZUdlbmVyYXRlZEF0dGFjaG1lbnRNZXRob2RzKCkge1xuICAgIGlmICh0aGlzLl9nZW5lcmF0ZWRBdHRhY2htZW50TWV0aG9kcykgcmV0dXJuXG5cbiAgICBjb25zdCBhdHRhY2htZW50cyA9IHRoaXMuYXR0YWNobWVudERlZmluaXRpb25zKClcbiAgICBjb25zdCBwcm90b3R5cGUgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovICh0aGlzLnByb3RvdHlwZSlcblxuICAgIGZvciAoY29uc3QgYXR0YWNobWVudE5hbWUgb2YgT2JqZWN0LmtleXMoYXR0YWNobWVudHMpKSB7XG4gICAgICBpZiAoIShhdHRhY2htZW50TmFtZSBpbiBwcm90b3R5cGUpKSB7XG4gICAgICAgIHByb3RvdHlwZVthdHRhY2htZW50TmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRBdHRhY2htZW50QnlOYW1lKGF0dGFjaG1lbnROYW1lKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fZ2VuZXJhdGVkQXR0YWNobWVudE1ldGhvZHMgPSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ30gLSBSZXNvdXJjZSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgc3RhdGljIHJlc291cmNlQ29uZmlnKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInJlc291cmNlQ29uZmlnKCkgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzXCIpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVucmVhY2hhYmxlXG4gICAgcmV0dXJuIHt9XG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHR5cGVvZiBGcm9udGVuZE1vZGVsQmFzZSB8IHN0cmluZz59IC0gUmVsYXRpb25zaGlwIG1vZGVsIGNsYXNzZXMgKG9yIGNsYXNzIG5hbWUgc3RyaW5ncykga2V5ZWQgYnkgcmVsYXRpb25zaGlwIG5hbWUuXG4gICAqL1xuICBzdGF0aWMgcmVsYXRpb25zaGlwTW9kZWxDbGFzc2VzKCkge1xuICAgIHJldHVybiB7fVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgZnJvbnRlbmQgbW9kZWwgY2xhc3Mgc28gaXQgY2FuIGJlIHJlc29sdmVkIGJ5IG5hbWUgaW4gcmVsYXRpb25zaGlwIGxvb2t1cHMuXG4gICAqIEBwYXJhbSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyTW9kZWwobW9kZWxDbGFzcykge1xuICAgIHJlZ2lzdGVyRnJvbnRlbmRNb2RlbChtb2RlbENsYXNzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IGNhbGxiYWNrIC0gU2NvcGUgY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHsoKC4uLmFyZ3M6IGFueVtdKSA9PiBpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLmRlZmF1bHQ8YW55PikgJiB7c2NvcGU6ICguLi5hcmdzOiBhbnlbXSkgPT4gaW1wb3J0KFwiLi4vdXRpbHMvbW9kZWwtc2NvcGUuanNcIikuTW9kZWxTY29wZURlc2NyaXB0b3J9fSAtIFNjb3BlIGhlbHBlci5cbiAgICovXG4gIHN0YXRpYyBkZWZpbmVTY29wZShjYWxsYmFjaykge1xuICAgIHJldHVybiBkZWZpbmVNb2RlbFNjb3BlKHtcbiAgICAgIGNhbGxiYWNrLFxuICAgICAgbW9kZWxDbGFzczogdGhpcyxcbiAgICAgIHN0YXJ0UXVlcnk6ICgpID0+IHRoaXMucXVlcnkoKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIHJlbGF0aW9uc2hpcCBtb2RlbCBjbGFzcyB2YWx1ZSB0aGF0IG1heSBiZSBhIGNsYXNzIHJlZmVyZW5jZSBvciBhIHN0cmluZyBuYW1lLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZSB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IHZhbHVlIC0gQ2xhc3Mgb3IgY2xhc3MgbmFtZS5cbiAgICogQHJldHVybnMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZSB8IG51bGx9IC0gUmVzb2x2ZWQgbW9kZWwgY2xhc3MuXG4gICAqL1xuICBzdGF0aWMgcmVzb2x2ZU1vZGVsQ2xhc3ModmFsdWUpIHtcbiAgICByZXR1cm4gcmVzb2x2ZUZyb250ZW5kTW9kZWxDbGFzcyh2YWx1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfVxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywge3R5cGU6IFwiYmVsb25nc1RvXCIgfCBcImhhc09uZVwiIHwgXCJoYXNNYW55XCIsIGF1dG9sb2FkPzogYm9vbGVhbn0+fSAtIFJlbGF0aW9uc2hpcCBkZWZpbml0aW9ucyBrZXllZCBieSByZWxhdGlvbnNoaXAgbmFtZS5cbiAgICovXG4gIHN0YXRpYyByZWxhdGlvbnNoaXBEZWZpbml0aW9ucygpIHtcbiAgICByZXR1cm4ge31cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfVxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgRnJvbnRlbmRNb2RlbEF0dGFjaG1lbnREZWZpbml0aW9uPn0gLSBBdHRhY2htZW50IGRlZmluaXRpb25zIGtleWVkIGJ5IGF0dGFjaG1lbnQgbmFtZS5cbiAgICovXG4gIHN0YXRpYyBhdHRhY2htZW50RGVmaW5pdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2VDb25maWcoKS5hdHRhY2htZW50cyB8fCB7fVxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRhY2htZW50TmFtZSAtIEF0dGFjaG1lbnQgbmFtZS5cbiAgICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxBdHRhY2htZW50RGVmaW5pdGlvbiB8IG51bGx9IC0gQXR0YWNobWVudCBkZWZpbml0aW9uLlxuICAgKi9cbiAgc3RhdGljIGF0dGFjaG1lbnREZWZpbml0aW9uKGF0dGFjaG1lbnROYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuYXR0YWNobWVudERlZmluaXRpb25zKClbYXR0YWNobWVudE5hbWVdIHx8IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25zaGlwTmFtZSAtIFJlbGF0aW9uc2hpcCBuYW1lLlxuICAgKiBAcmV0dXJucyB7e3R5cGU6IFwiYmVsb25nc1RvXCIgfCBcImhhc09uZVwiIHwgXCJoYXNNYW55XCIsIGF1dG9sb2FkPzogYm9vbGVhbn0gfCBudWxsfSAtIFJlbGF0aW9uc2hpcCBkZWZpbml0aW9uLlxuICAgKi9cbiAgc3RhdGljIHJlbGF0aW9uc2hpcERlZmluaXRpb24ocmVsYXRpb25zaGlwTmFtZSkge1xuICAgIGNvbnN0IGRlZmluaXRpb25zID0gdGhpcy5yZWxhdGlvbnNoaXBEZWZpbml0aW9ucygpXG5cbiAgICByZXR1cm4gZGVmaW5pdGlvbnNbcmVsYXRpb25zaGlwTmFtZV0gfHwgbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9XG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbnNoaXBOYW1lIC0gUmVsYXRpb25zaGlwIG5hbWUuXG4gICAqIEByZXR1cm5zIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2UgfCBudWxsfSAtIFRhcmdldCByZWxhdGlvbnNoaXAgbW9kZWwgY2xhc3MuXG4gICAqL1xuICBzdGF0aWMgcmVsYXRpb25zaGlwTW9kZWxDbGFzcyhyZWxhdGlvbnNoaXBOYW1lKSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwTW9kZWxDbGFzc2VzID0gdGhpcy5yZWxhdGlvbnNoaXBNb2RlbENsYXNzZXMoKVxuICAgIGNvbnN0IHZhbHVlID0gcmVsYXRpb25zaGlwTW9kZWxDbGFzc2VzW3JlbGF0aW9uc2hpcE5hbWVdXG5cbiAgICByZXR1cm4gRnJvbnRlbmRNb2RlbEJhc2UucmVzb2x2ZU1vZGVsQ2xhc3ModmFsdWUpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59IC0gQXR0cmlidXRlcyBoYXNoLlxuICAgKi9cbiAgYXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fYXR0cmlidXRlc1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhpcyBtb2RlbCBoYXMgbm90IHlldCBiZWVuIHBlcnNpc3RlZC5cbiAgICovXG4gIGlzTmV3UmVjb3JkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc05ld1JlY29yZFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhpcyBtb2RlbCBoYXMgYmVlbiBwZXJzaXN0ZWQuXG4gICAqL1xuICBpc1BlcnNpc3RlZCgpIHtcbiAgICByZXR1cm4gIXRoaXMuaXNOZXdSZWNvcmQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gbmV3SXNOZXdSZWNvcmQgLSBOZXcgcGVyc2lzdGVkLXN0YXRlIGZsYWcuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0SXNOZXdSZWNvcmQobmV3SXNOZXdSZWNvcmQpIHtcbiAgICB0aGlzLl9pc05ld1JlY29yZCA9IG5ld0lzTmV3UmVjb3JkXG4gIH1cblxuICAvKipcbiAgICogTWFya3MgdGhpcyByZWNvcmQgZm9yIGRlc3RydWN0aW9uIHdoZW4gaXRzIHBhcmVudCBpcyBuZXh0IHNhdmVkIHRocm91Z2hcbiAgICogbmVzdGVkLWF0dHJpYnV0ZSBzdXBwb3J0LiBUaGUgcmVjb3JkIGlzIG5vdCByZW1vdmVkIGZyb20gdGhlIHBhcmVudCdzXG4gICAqIHJlbGF0aW9uc2hpcCBjb2xsZWN0aW9uIHVudGlsIHRoZSBzZXJ2ZXIgY29uZmlybXMgdGhlIGRlbGV0ZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgbWFya0ZvckRlc3RydWN0aW9uKCkge1xuICAgIHRoaXMuX21hcmtlZEZvckRlc3RydWN0aW9uID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhpcyByZWNvcmQgaXMgcXVldWVkIGZvciBuZXN0ZWQgZGVzdHJ1Y3Rpb24gb24gbmV4dCBwYXJlbnQgc2F2ZS5cbiAgICovXG4gIG1hcmtlZEZvckRlc3RydWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9tYXJrZWRGb3JEZXN0cnVjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBhbnlbXT59IC0gQ2hhbmdlZCBhdHRyaWJ1dGVzIGFzIGBbb2xkVmFsdWUsIG5ld1ZhbHVlXWAuXG4gICAqL1xuICBjaGFuZ2VzKCkge1xuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55W10+fSAqL1xuICAgIGNvbnN0IGNoYW5nZWRBdHRyaWJ1dGVzID0ge31cbiAgICBjb25zdCBhdHRyaWJ1dGVOYW1lcyA9IG5ldyBTZXQoW1xuICAgICAgLi4uT2JqZWN0LmtleXModGhpcy5fcGVyc2lzdGVkQXR0cmlidXRlcyksXG4gICAgICAuLi5PYmplY3Qua2V5cyh0aGlzLl9hdHRyaWJ1dGVzKVxuICAgIF0pXG5cbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgb2YgYXR0cmlidXRlTmFtZXMpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSB0aGlzLl9wZXJzaXN0ZWRBdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdXG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLl9hdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdXG5cbiAgICAgIGlmIChKU09OLnN0cmluZ2lmeShzZXJpYWxpemVGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWUocHJldmlvdXNWYWx1ZSkpICE9PSBKU09OLnN0cmluZ2lmeShzZXJpYWxpemVGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWUoY3VycmVudFZhbHVlKSkpIHtcbiAgICAgICAgY2hhbmdlZEF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0gPSBbcHJldmlvdXNWYWx1ZSwgY3VycmVudFZhbHVlXVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjaGFuZ2VkQXR0cmlidXRlc1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgYW55IHRyYWNrZWQgYXR0cmlidXRlIGhhcyBjaGFuZ2VkLlxuICAgKi9cbiAgaXNDaGFuZ2VkKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmNoYW5nZXMoKSkubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbnNoaXBOYW1lIC0gUmVsYXRpb25zaGlwIG5hbWUuXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsSGFzTWFueVJlbGF0aW9uc2hpcDxhbnksIGFueT4gfCBGcm9udGVuZE1vZGVsU2luZ3VsYXJSZWxhdGlvbnNoaXA8YW55LCBhbnk+fSAtIFJlbGF0aW9uc2hpcCBzdGF0ZSBvYmplY3QuXG4gICAqL1xuICBnZXRSZWxhdGlvbnNoaXBCeU5hbWUocmVsYXRpb25zaGlwTmFtZSkge1xuICAgIGlmICghdGhpcy5fcmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXSkge1xuICAgICAgY29uc3QgTW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSAqLyAodGhpcy5jb25zdHJ1Y3RvcilcbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcERlZmluaXRpb24gPSBNb2RlbENsYXNzLnJlbGF0aW9uc2hpcERlZmluaXRpb24ocmVsYXRpb25zaGlwTmFtZSlcbiAgICAgIGNvbnN0IHRhcmdldE1vZGVsQ2xhc3MgPSBNb2RlbENsYXNzLnJlbGF0aW9uc2hpcE1vZGVsQ2xhc3MocmVsYXRpb25zaGlwTmFtZSlcblxuICAgICAgaWYgKHJlbGF0aW9uc2hpcERlZmluaXRpb24gJiYgcmVsYXRpb25zaGlwVHlwZUlzQ29sbGVjdGlvbihyZWxhdGlvbnNoaXBEZWZpbml0aW9uLnR5cGUpKSB7XG4gICAgICAgIHRoaXMuX3JlbGF0aW9uc2hpcHNbcmVsYXRpb25zaGlwTmFtZV0gPSBuZXcgRnJvbnRlbmRNb2RlbEhhc01hbnlSZWxhdGlvbnNoaXAodGhpcywgcmVsYXRpb25zaGlwTmFtZSwgdGFyZ2V0TW9kZWxDbGFzcylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3JlbGF0aW9uc2hpcHNbcmVsYXRpb25zaGlwTmFtZV0gPSBuZXcgRnJvbnRlbmRNb2RlbFNpbmd1bGFyUmVsYXRpb25zaGlwKHRoaXMsIHJlbGF0aW9uc2hpcE5hbWUsIHRhcmdldE1vZGVsQ2xhc3MpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3JlbGF0aW9uc2hpcHNbcmVsYXRpb25zaGlwTmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0YWNobWVudE5hbWUgLSBBdHRhY2htZW50IG5hbWUuXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsQXR0YWNobWVudEhhbmRsZX0gLSBBdHRhY2htZW50IGhlbHBlci5cbiAgICovXG4gIGdldEF0dGFjaG1lbnRCeU5hbWUoYXR0YWNobWVudE5hbWUpIHtcbiAgICBjb25zdCBNb2RlbENsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9ICovICh0aGlzLmNvbnN0cnVjdG9yKVxuICAgIGNvbnN0IGF0dGFjaG1lbnREZWZpbml0aW9uID0gTW9kZWxDbGFzcy5hdHRhY2htZW50RGVmaW5pdGlvbihhdHRhY2htZW50TmFtZSlcblxuICAgIGlmICghYXR0YWNobWVudERlZmluaXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhdHRhY2htZW50OiAke01vZGVsQ2xhc3MubmFtZX0jJHthdHRhY2htZW50TmFtZX1gKVxuICAgIH1cblxuICAgIGlmICghdGhpcy5fYXR0YWNobWVudHNbYXR0YWNobWVudE5hbWVdKSB7XG4gICAgICB0aGlzLl9hdHRhY2htZW50c1thdHRhY2htZW50TmFtZV0gPSBuZXcgRnJvbnRlbmRNb2RlbEF0dGFjaG1lbnRIYW5kbGUoe1xuICAgICAgICBhdHRhY2htZW50TmFtZSxcbiAgICAgICAgbW9kZWw6IHRoaXNcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2F0dGFjaG1lbnRzW2F0dGFjaG1lbnROYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbnNoaXBOYW1lIC0gUmVsYXRpb25zaGlwIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IC0gTG9hZGVkIHJlbGF0aW9uc2hpcCB2YWx1ZS5cbiAgICovXG4gIGFzeW5jIGxvYWRSZWxhdGlvbnNoaXAocmVsYXRpb25zaGlwTmFtZSkge1xuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gKi8gKHRoaXMuY29uc3RydWN0b3IpXG4gICAgY29uc3QgaWQgPSB0aGlzLnByaW1hcnlLZXlWYWx1ZSgpXG4gICAgY29uc3QgcmVsb2FkZWRNb2RlbCA9IGF3YWl0IE1vZGVsQ2xhc3NcbiAgICAgIC5wcmVsb2FkKFtyZWxhdGlvbnNoaXBOYW1lXSlcbiAgICAgIC5maW5kKGlkKVxuICAgIGNvbnN0IGxvYWRlZFZhbHVlID0gcmVsb2FkZWRNb2RlbC5nZXRSZWxhdGlvbnNoaXBCeU5hbWUocmVsYXRpb25zaGlwTmFtZSkubG9hZGVkKClcblxuICAgIHRoaXMuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKHJlbGF0aW9uc2hpcE5hbWUpLnNldExvYWRlZChsb2FkZWRWYWx1ZSlcblxuICAgIHJldHVybiBsb2FkZWRWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFByZWxvYWRzIHJlbGF0aW9uc2hpcChzKSBvbnRvIHRoaXMgYWxyZWFkeS1sb2FkZWQgcmVjb3JkLiBBY2NlcHRzIGVpdGhlciBhXG4gICAqIHF1ZXJ5IGJ1aWx0IHZpYSBgTW9kZWwucHJlbG9hZCguLi4pLnNlbGVjdCguLi4pYCBvciBhIHJhdyBwcmVsb2FkIHNwZWNcbiAgICogKHN0cmluZyAvIGFycmF5IC8gbmVzdGVkIG9iamVjdCkuIFJlbGF0aW9uc2hpcHMgYWxyZWFkeSBwcmVsb2FkZWQgd2l0aCB0aGVcbiAgICogcmVxdWlyZWQgY29sdW1ucyBwcmVzZW50IGFyZSBsZWZ0IHVudG91Y2hlZCB1bmxlc3MgYGZvcmNlYCBpcyBzZXQuIENhcnJpZXNcbiAgICogdGhlIHF1ZXJ5J3MgcHJlbG9hZCBncmFwaCwgc2VsZWN0LCBzZWxlY3RzRXh0cmEsIHdpdGhDb3VudCwgYWJpbGl0aWVzLCBhbmRcbiAgICogcXVlcnlEYXRhIHdoZW4gcmUtZmV0Y2hpbmcuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5kZWZhdWx0PGFueT4gfCBpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9pbmRleC5qc1wiKS5OZXN0ZWRQcmVsb2FkUmVjb3JkIHwgc3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgaW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvaW5kZXguanNcIikuTmVzdGVkUHJlbG9hZFJlY29yZD59IHF1ZXJ5T3JTcGVjIC0gUHJlbG9hZCBzb3VyY2UuXG4gICAqIEBwYXJhbSB7e2ZvcmNlPzogYm9vbGVhbn19IFtvcHRpb25zXSAtIE9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gcHJlbG9hZGluZyBjb21wbGV0ZXMuXG4gICAqL1xuICBhc3luYyBwcmVsb2FkKHF1ZXJ5T3JTcGVjLCBvcHRpb25zID0ge30pIHtcbiAgICBhd2FpdCBGcm9udGVuZE1vZGVsUHJlbG9hZGVyLnByZWxvYWQoW3RoaXNdLCBxdWVyeU9yU3BlYywgb3B0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25zaGlwTmFtZSAtIFJlbGF0aW9uc2hpcCBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSAtIExvYWRlZCByZWxhdGlvbnNoaXAgdmFsdWUuXG4gICAqL1xuICBhc3luYyByZWxhdGlvbnNoaXBPckxvYWQocmVsYXRpb25zaGlwTmFtZSkge1xuICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IHRoaXMuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKHJlbGF0aW9uc2hpcE5hbWUpXG5cbiAgICBpZiAocmVsYXRpb25zaGlwLmdldFByZWxvYWRlZCgpKSB7XG4gICAgICByZXR1cm4gcmVsYXRpb25zaGlwLmxvYWRlZCgpXG4gICAgfVxuXG4gICAgY29uc3QgYmF0Y2hlZCA9IGF3YWl0IHRoaXMuX3RyeUNvaG9ydFByZWxvYWQocmVsYXRpb25zaGlwTmFtZSlcblxuICAgIGlmIChiYXRjaGVkKSByZXR1cm4gcmVsYXRpb25zaGlwLmxvYWRlZCgpXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5sb2FkUmVsYXRpb25zaGlwKHJlbGF0aW9uc2hpcE5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdHMgdG8gYmF0Y2gtbG9hZCBgcmVsYXRpb25zaGlwTmFtZWAgYWNyb3NzIGNvaG9ydCBzaWJsaW5ncyB2aWEgYVxuICAgKiBzaW5nbGUgYHByZWxvYWQoW25hbWVdKS53aGVyZSh7cGs6IFtpZHNdfSkudG9BcnJheSgpYCByZXF1ZXN0LCB0aGVuIGNvcGllc1xuICAgKiB0aGUgcHJlbG9hZGVkIHJlbGF0aW9uc2hpcCBzdGF0ZSBvbnRvIGVhY2ggc2libGluZy4gUmV0dXJucyB0cnVlIHdoZW4gYVxuICAgKiBiYXRjaCByYW4sIGZhbHNlIHdoZW4gYXV0b2xvYWQgaXMgb2ZmLCB0aGVyZSBpcyBubyBjb2hvcnQsIG9yIG5vIGJhdGNoXG4gICAqIGNhbmRpZGF0ZXMgcmVtYWluLiBTaWJsaW5ncyB3aG9zZSByZWxhdGlvbnNoaXAgc3RhdGUgaXMgYWxyZWFkeSBzZXRcbiAgICogKHByZWxvYWRlZCBvciBsb2NhbGx5IG1hbmlwdWxhdGVkIHZpYSBgYnVpbGRgIC8gYHNldFJlbGF0aW9uc2hpcGApIGFyZVxuICAgKiBza2lwcGVkIHNvIHRoZWlyIGNhY2hlZC9lZGl0ZWQgdmFsdWUgaXMgcHJlc2VydmVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25zaGlwTmFtZSAtIFJlbGF0aW9uc2hpcCBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIGEgY29ob3J0IGJhdGNoIHByZWxvYWQgcmFuLlxuICAgKi9cbiAgYXN5bmMgX3RyeUNvaG9ydFByZWxvYWQocmVsYXRpb25zaGlwTmFtZSkge1xuICAgIGlmICghRnJvbnRlbmRNb2RlbEJhc2UuZ2V0QXV0b2xvYWQoKSkgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCBNb2RlbENsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9ICovICh0aGlzLmNvbnN0cnVjdG9yKVxuICAgIGNvbnN0IGNvaG9ydCA9IHRoaXMuX2xvYWRDb2hvcnRcblxuICAgIGlmICghY29ob3J0IHx8IGNvaG9ydC5sZW5ndGggPD0gMSkgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCBkZWZpbml0aW9uID0gTW9kZWxDbGFzcy5yZWxhdGlvbnNoaXBEZWZpbml0aW9uKHJlbGF0aW9uc2hpcE5hbWUpXG5cbiAgICBpZiAoIWRlZmluaXRpb24pIHJldHVybiBmYWxzZVxuICAgIGlmIChkZWZpbml0aW9uLmF1dG9sb2FkID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlXG5cbiAgICAvKiogQHR5cGUge0FycmF5PEZyb250ZW5kTW9kZWxCYXNlPn0gKi9cbiAgICBjb25zdCBiYXRjaCA9IFtdXG5cbiAgICAvLyBFeGFjdCBzYW1lIGNsYXNzLCBwZXJzaXN0ZWQsIG5vIGV4aXN0aW5nIGluLW1lbW9yeSByZWxhdGlvbnNoaXAgc3RhdGUuXG4gICAgLy8gYHNldExvYWRlZGAgc2V0cyBgX3ByZWxvYWRlZCA9IHRydWVgIG9uIGV2ZXJ5IG11dGF0aW9uIHBhdGggKHByZWxvYWQsXG4gICAgLy8gc2V0UmVsYXRpb25zaGlwLCBidWlsZCwgYWRkVG9Mb2FkZWQpLCBzbyBgZ2V0UHJlbG9hZGVkKClgIGFsb25lIGlzIGFcbiAgICAvLyByZWxpYWJsZSBcImFscmVhZHkgdG91Y2hlZFwiIHNpZ25hbCBvbiB0aGUgZnJvbnRlbmQuXG4gICAgZm9yIChjb25zdCBzaWJsaW5nIG9mIGNvaG9ydCkge1xuICAgICAgaWYgKHNpYmxpbmcuY29uc3RydWN0b3IgIT09IE1vZGVsQ2xhc3MpIGNvbnRpbnVlXG4gICAgICBpZiAoc2libGluZy5pc05ld1JlY29yZCgpKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBzaWJsaW5nUmVsYXRpb25zaGlwID0gc2libGluZy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUocmVsYXRpb25zaGlwTmFtZSlcblxuICAgICAgaWYgKHNpYmxpbmdSZWxhdGlvbnNoaXAuZ2V0UHJlbG9hZGVkKCkpIGNvbnRpbnVlXG5cbiAgICAgIGJhdGNoLnB1c2goc2libGluZylcbiAgICB9XG5cbiAgICBpZiAoYmF0Y2gubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IHByaW1hcnlLZXkgPSBNb2RlbENsYXNzLnByaW1hcnlLZXkoKVxuICAgIGNvbnN0IGJhdGNoSWRzID0gYmF0Y2gubWFwKChzaWJsaW5nKSA9PiBzaWJsaW5nLnByaW1hcnlLZXlWYWx1ZSgpKVxuICAgIGNvbnN0IHJlbG9hZGVkQmF0Y2ggPSBhd2FpdCBNb2RlbENsYXNzXG4gICAgICAucHJlbG9hZChbcmVsYXRpb25zaGlwTmFtZV0pXG4gICAgICAud2hlcmUoe1twcmltYXJ5S2V5XTogYmF0Y2hJZHN9KVxuICAgICAgLnRvQXJyYXkoKVxuXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBGcm9udGVuZE1vZGVsQmFzZT59ICovXG4gICAgY29uc3QgcmVsb2FkZWRCeUlkID0gbmV3IE1hcCgpXG5cbiAgICBmb3IgKGNvbnN0IHJlbG9hZGVkIG9mIHJlbG9hZGVkQmF0Y2gpIHtcbiAgICAgIHJlbG9hZGVkQnlJZC5zZXQoU3RyaW5nKHJlbG9hZGVkLnByaW1hcnlLZXlWYWx1ZSgpKSwgcmVsb2FkZWQpXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzaWJsaW5nIG9mIGJhdGNoKSB7XG4gICAgICBjb25zdCBrZXkgPSBTdHJpbmcoc2libGluZy5wcmltYXJ5S2V5VmFsdWUoKSlcbiAgICAgIGNvbnN0IHJlbG9hZGVkID0gcmVsb2FkZWRCeUlkLmdldChrZXkpXG5cbiAgICAgIGlmICghcmVsb2FkZWQpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHJlbG9hZGVkVmFsdWUgPSByZWxvYWRlZC5nZXRSZWxhdGlvbnNoaXBCeU5hbWUocmVsYXRpb25zaGlwTmFtZSkubG9hZGVkKClcblxuICAgICAgc2libGluZy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUocmVsYXRpb25zaGlwTmFtZSkuc2V0TG9hZGVkKHJlbG9hZGVkVmFsdWUpXG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGNhbGxlciBpdHNlbGYgd2FzIG5vdCBwb3B1bGF0ZWQgKHJlY29yZCBkZWxldGVkL2ZpbHRlcmVkIGJldHdlZW5cbiAgICAvLyB0aGUgbGlzdCBmZXRjaCBhbmQgdGhpcyBwcmVsb2FkIHJlcXVlc3QpLCBmYWxsIGJhY2sgdG8gcGVyLXJlY29yZCBsb2FkXG4gICAgLy8gc28gdGhlIGNhbGxlciBnZXRzIGEgcmVhbCBub3QtZm91bmQgZXJyb3IgaW5zdGVhZCBvZiBhIG1pc2xlYWRpbmdcbiAgICAvLyBcImhhc24ndCBiZWVuIHByZWxvYWRlZFwiIHRocm93IGZyb20gbG9hZGVkKCkuXG4gICAgaWYgKCF0aGlzLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShyZWxhdGlvbnNoaXBOYW1lKS5nZXRQcmVsb2FkZWQoKSkgcmV0dXJuIGZhbHNlXG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbnNoaXBOYW1lIC0gUmVsYXRpb25zaGlwIG5hbWUuXG4gICAqIEBwYXJhbSB7YW55fSByZWxhdGlvbnNoaXBWYWx1ZSAtIFJlbGF0aW9uc2hpcCB2YWx1ZS5cbiAgICogQHJldHVybnMge2FueX0gLSBBc3NpZ25lZCByZWxhdGlvbnNoaXAgdmFsdWUuXG4gICAqL1xuICBzZXRSZWxhdGlvbnNoaXAocmVsYXRpb25zaGlwTmFtZSwgcmVsYXRpb25zaGlwVmFsdWUpIHtcbiAgICBjb25zdCBNb2RlbENsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9ICovICh0aGlzLmNvbnN0cnVjdG9yKVxuICAgIGNvbnN0IHJlbGF0aW9uc2hpcERlZmluaXRpb24gPSBNb2RlbENsYXNzLnJlbGF0aW9uc2hpcERlZmluaXRpb24ocmVsYXRpb25zaGlwTmFtZSlcblxuICAgIGlmICghcmVsYXRpb25zaGlwRGVmaW5pdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHJlbGF0aW9uc2hpcDogJHtNb2RlbENsYXNzLm5hbWV9IyR7cmVsYXRpb25zaGlwTmFtZX1gKVxuICAgIH1cblxuICAgIGlmIChyZWxhdGlvbnNoaXBUeXBlSXNDb2xsZWN0aW9uKHJlbGF0aW9uc2hpcERlZmluaXRpb24udHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHNldCBoYXMtbWFueSByZWxhdGlvbnNoaXAgd2l0aCBzZXRSZWxhdGlvbnNoaXAoKTogJHtNb2RlbENsYXNzLm5hbWV9IyR7cmVsYXRpb25zaGlwTmFtZX1gKVxuICAgIH1cblxuICAgIHRoaXMuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKHJlbGF0aW9uc2hpcE5hbWUpLnNldExvYWRlZChyZWxhdGlvbnNoaXBWYWx1ZSlcblxuICAgIHJldHVybiByZWxhdGlvbnNoaXBWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gYXR0cmlidXRlcyAtIEF0dHJpYnV0ZXMgdG8gYXNzaWduLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBhc3NpZ25BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZShrZXksIGF0dHJpYnV0ZXNba2V5XSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3ZvaWR9IC0gQ2xlYXJzIGNhY2hlZCByZWxhdGlvbnNoaXAgc3RhdGUuXG4gICAqL1xuICBjbGVhclJlbGF0aW9uc2hpcENhY2hlKCkge1xuICAgIHRoaXMuX3JlbGF0aW9uc2hpcHMgPSB7fVxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gUHJpbWFyeSBrZXkgbmFtZS5cbiAgICovXG4gIHN0YXRpYyBwcmltYXJ5S2V5KCkge1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlQ29uZmlnKCkucHJpbWFyeUtleSB8fCBcImlkXCJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7bnVtYmVyIHwgc3RyaW5nfSAtIFByaW1hcnkga2V5IHZhbHVlLlxuICAgKi9cbiAgcHJpbWFyeUtleVZhbHVlKCkge1xuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gKi8gKHRoaXMuY29uc3RydWN0b3IpXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlYWRBdHRyaWJ1dGUoTW9kZWxDbGFzcy5wcmltYXJ5S2V5KCkpXG5cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHByaW1hcnkga2V5ICcke01vZGVsQ2xhc3MucHJpbWFyeUtleSgpfScgb24gJHtNb2RlbENsYXNzLm5hbWV9YClcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZSAtIEF0dHJpYnV0ZSBuYW1lLlxuICAgKiBAcmV0dXJucyB7YW55fSAtIEF0dHJpYnV0ZSB2YWx1ZS5cbiAgICovXG4gIHJlYWRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkge1xuICAgIGlmICh0aGlzLl9zZWxlY3RlZEF0dHJpYnV0ZXMgJiYgIXRoaXMuX3NlbGVjdGVkQXR0cmlidXRlcy5oYXMoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBBdHRyaWJ1dGVOb3RTZWxlY3RlZEVycm9yKHRoaXMuY29uc3RydWN0b3IubmFtZSwgYXR0cmlidXRlTmFtZSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYW4gYXR0cmlidXRlIHZhbHVlIGlzIGN1cnJlbnRseSBsb2FkZWQgb24gdGhpcyByZWNvcmQuIFVzZWQgYnkgdGhlXG4gICAqIHByZWxvYWRlciB0byBkZWNpZGUgd2hldGhlciBhIHJlbGF0aW9uc2hpcCBjYW4gYmUgc2tpcHBlZCBiZWNhdXNlIHRoZVxuICAgKiByZXF1ZXN0ZWQgY29sdW1ucyBhcmUgYWxyZWFkeSBwcmVzZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZSAtIEF0dHJpYnV0ZSBuYW1lLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBhdHRyaWJ1dGUgaXMgbG9hZGVkLlxuICAgKi9cbiAgaGFzTG9hZGVkQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBpZiAoIXRoaXMuX3NlbGVjdGVkQXR0cmlidXRlcykgcmV0dXJuIHRydWVcblxuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZEF0dHJpYnV0ZXMuaGFzKGF0dHJpYnV0ZU5hbWUpXG4gIH1cblxuICAvKipcbiAgICogUmVhZCBhbiBhc3NvY2lhdGlvbiBjb3VudCBhdHRhY2hlZCBieSBgLndpdGhDb3VudCguLi4pYC4gQ291bnRzXG4gICAqIGxpdmUgb24gYSBkZWRpY2F0ZWQgbWFwIHNlcGFyYXRlIGZyb20gdGhlIHJlY29yZCdzIGF0dHJpYnV0ZXMgc29cbiAgICogYSB2aXJ0dWFsIGNvdW50IGxpa2UgYHRhc2tzQ291bnRgIGNhbid0IHNpbGVudGx5IHNoYWRvdyBhIHJlYWxcbiAgICogY29sdW1uIG9mIHRoZSBzYW1lIG5hbWUuIFJldHVybnMgdGhlIGF0dGFjaGVkIHZhbHVlLCBvciAwIHdoZW5cbiAgICogYC53aXRoQ291bnQoLi4uKWAgd2Fzbid0IHJlcXVlc3RlZCBmb3IgdGhpcyBhdHRyaWJ1dGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lIC0gQXR0cmlidXRlIG5hbWUsIGUuZy4gYFwidGFza3NDb3VudFwiYCBvciBhIGN1c3RvbSBuYW1lIGZyb20gYC53aXRoQ291bnQoe2N1c3RvbU5hbWU6IHsuLi59fSlgLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgcmVhZENvdW50KGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBpZiAoIXRoaXMuX2Fzc29jaWF0aW9uQ291bnRzKSByZXR1cm4gMFxuICAgIGlmICghdGhpcy5fYXNzb2NpYXRpb25Db3VudHMuaGFzKGF0dHJpYnV0ZU5hbWUpKSByZXR1cm4gMFxuXG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAodGhpcy5fYXNzb2NpYXRpb25Db3VudHMuZ2V0KGF0dHJpYnV0ZU5hbWUpKVxuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIHNldHRlciBjYWxsZWQgYnkgYGluc3RhbnRpYXRlRnJvbVJlc3BvbnNlYCB3aGVuIGh5ZHJhdGluZ1xuICAgKiBhc3NvY2lhdGlvbiBjb3VudHMgdGhhdCByb2RlIGFsb25nIHdpdGggdGhlIHJlY29yZCBwYXlsb2FkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZSAtIEF0dHJpYnV0ZSBuYW1lLlxuICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBDb3VudCB2YWx1ZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfc2V0QXNzb2NpYXRpb25Db3VudChhdHRyaWJ1dGVOYW1lLCB2YWx1ZSkge1xuICAgIGlmICghdGhpcy5fYXNzb2NpYXRpb25Db3VudHMpIHtcbiAgICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgbnVtYmVyPn0gKi9cbiAgICAgIHRoaXMuX2Fzc29jaWF0aW9uQ291bnRzID0gbmV3IE1hcCgpXG4gICAgfVxuXG4gICAgdGhpcy5fYXNzb2NpYXRpb25Db3VudHMuc2V0KGF0dHJpYnV0ZU5hbWUsIHZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgYSBwZXItcmVjb3JkIGFiaWxpdHkgcmVzdWx0IGF0dGFjaGVkIGJ5IGAuYWJpbGl0aWVzKC4uLilgLiBUaGVcbiAgICogYmFja2VuZCBldmFsdWF0ZXMgZWFjaCByZXF1ZXN0ZWQgYWN0aW9uIGFnYWluc3QgdGhlIGN1cnJlbnRcbiAgICogYWJpbGl0eSBmb3IgdGhpcyByZWNvcmQgaW5zdGFuY2UgYW5kIHNoaXBzIHRoZSByZXN1bHQgYWxvbmdzaWRlXG4gICAqIHRoZSByZWNvcmQncyBhdHRyaWJ1dGVzLiBSZXR1cm5zIGBmYWxzZWAgd2hlbiB0aGUgYWN0aW9uIHdhc24ndFxuICAgKiByZXF1ZXN0ZWQgKG9yIHRoZSBhYmlsaXR5IGRlbmllZCBpdCksIHNvIFVJIGNvZGUgY2FuIHNhZmVseSBicmFuY2hcbiAgICogb24gYHJlY29yZC5jYW4oXCJ1cGRhdGVcIilgIHdpdGhvdXQgZmlyc3QgY2hlY2tpbmcgd2hldGhlciB0aGVcbiAgICogYWJpbGl0eSB3YXMgbG9hZGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uIC0gQWJpbGl0eSBhY3Rpb24gbmFtZSwgZS5nLiBgXCJ1cGRhdGVcImAuXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgY2FuKGFjdGlvbikge1xuICAgIGlmICghdGhpcy5fY29tcHV0ZWRBYmlsaXRpZXMpIHJldHVybiBmYWxzZVxuICAgIGlmICghdGhpcy5fY29tcHV0ZWRBYmlsaXRpZXMuaGFzKGFjdGlvbikpIHJldHVybiBmYWxzZVxuXG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5fY29tcHV0ZWRBYmlsaXRpZXMuZ2V0KGFjdGlvbikpXG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgc2V0dGVyIGNhbGxlZCBieSBgaW5zdGFudGlhdGVGcm9tUmVzcG9uc2VgIHdoZW4gaHlkcmF0aW5nXG4gICAqIHBlci1yZWNvcmQgYWJpbGl0eSByZXN1bHRzIHRoYXQgcm9kZSBhbG9uZyB3aXRoIHRoZSByZWNvcmRcbiAgICogcGF5bG9hZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbiAtIEFiaWxpdHkgYWN0aW9uIG5hbWUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgLSBXaGV0aGVyIHRoZSBjdXJyZW50IGFiaWxpdHkgcGVybWl0cyB0aGUgYWN0aW9uIG9uIHRoaXMgcmVjb3JkLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9zZXRDb21wdXRlZEFiaWxpdHkoYWN0aW9uLCB2YWx1ZSkge1xuICAgIGlmICghdGhpcy5fY29tcHV0ZWRBYmlsaXRpZXMpIHtcbiAgICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgYm9vbGVhbj59ICovXG4gICAgICB0aGlzLl9jb21wdXRlZEFiaWxpdGllcyA9IG5ldyBNYXAoKVxuICAgIH1cblxuICAgIHRoaXMuX2NvbXB1dGVkQWJpbGl0aWVzLnNldChhY3Rpb24sIEJvb2xlYW4odmFsdWUpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgYSBjb25zdW1lci1kZWZpbmVkIHZhbHVlIGF0dGFjaGVkIGJ5IGAucXVlcnlEYXRhKC4uLilgLiBTdG9yZWRcbiAgICogb24gYSBkZWRpY2F0ZWQgbWFwIHJhdGhlciB0aGFuIGBfYXR0cmlidXRlc2AsIHNvIGEgdmlydHVhbCBhbGlhc1xuICAgKiBsaWtlIGB0YXNrc0NvdW50YCBjYW5ub3Qgc2lsZW50bHkgc2hhZG93IGEgcmVhbCBjb2x1bW4gb2YgdGhlIHNhbWVcbiAgICogbmFtZS4gUmV0dXJucyBgbnVsbGAgd2hlbiBubyByZWdpc3RlcmVkIGZuIHByb2R1Y2VkIHRoYXQgYWxpYXMgZm9yXG4gICAqIHRoaXMgcmVjb3JkIChlLmcuIG5vIGNoaWxkIHJvd3MgbWF0Y2hlZCB0aGUgYWdncmVnYXRlKS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBxdWVyeURhdGEgYWxpYXMgbmFtZS5cbiAgICogQHJldHVybnMge3Vua25vd259XG4gICAqL1xuICBxdWVyeURhdGEobmFtZSkge1xuICAgIGlmICghdGhpcy5fcXVlcnlEYXRhVmFsdWVzKSByZXR1cm4gbnVsbFxuICAgIGlmICghdGhpcy5fcXVlcnlEYXRhVmFsdWVzLmhhcyhuYW1lKSkgcmV0dXJuIG51bGxcblxuICAgIHJldHVybiB0aGlzLl9xdWVyeURhdGFWYWx1ZXMuZ2V0KG5hbWUpXG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgc2V0dGVyIHVzZWQgYnkgYGluc3RhbnRpYXRlRnJvbVJlc3BvbnNlYCB3aGVuIGh5ZHJhdGluZ1xuICAgKiBxdWVyeURhdGEgdmFsdWVzIHRoYXQgcm9kZSBhbG9uZyB3aXRoIHRoZSByZWNvcmQgcGF5bG9hZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBxdWVyeURhdGEgYWxpYXMgbmFtZS5cbiAgICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIEF0dGFjaGVkIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9zZXRRdWVyeURhdGEobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAoIXRoaXMuX3F1ZXJ5RGF0YVZhbHVlcykge1xuICAgICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCB1bmtub3duPn0gKi9cbiAgICAgIHRoaXMuX3F1ZXJ5RGF0YVZhbHVlcyA9IG5ldyBNYXAoKVxuICAgIH1cblxuICAgIHRoaXMuX3F1ZXJ5RGF0YVZhbHVlcy5zZXQobmFtZSwgdmFsdWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWUgLSBBdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHthbnl9IG5ld1ZhbHVlIC0gTmV3IHZhbHVlLlxuICAgKiBAcmV0dXJucyB7YW55fSAtIEFzc2lnbmVkIHZhbHVlLlxuICAgKi9cbiAgc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIG5ld1ZhbHVlKSB7XG4gICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IHRoaXMuX2F0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV1cblxuICAgIHRoaXMuX2F0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0gPSBuZXdWYWx1ZVxuXG4gICAgaWYgKHRoaXMuX3NlbGVjdGVkQXR0cmlidXRlcykge1xuICAgICAgdGhpcy5fc2VsZWN0ZWRBdHRyaWJ1dGVzLmFkZChhdHRyaWJ1dGVOYW1lKVxuICAgIH1cblxuICAgIC8vIE9ubHkgaW52YWxpZGF0ZSByZWxhdGlvbnNoaXAgY2FjaGUgZW50cmllcyB3aG9zZSBmb3JlaWduIGtleSBtYXRjaGVzIHRoZSBjaGFuZ2VkIGF0dHJpYnV0ZS5cbiAgICAvLyBCbGFua2V0LWNsZWFyaW5nIGFsbCByZWxhdGlvbnNoaXBzIG9uIGFueSBhdHRyaWJ1dGUgY2hhbmdlIGRlc3Ryb3lzIG5lc3RlZC1zYXZlIHN0YXRlXG4gICAgLy8gYW5kIHByZWxvYWRlZCBjaGlsZHJlbiB0aGUgY2FsbGVyIG5ldmVyIGFza2VkIHRvIGludmFsaWRhdGUuXG4gICAgaWYgKCFPYmplY3QuaXMocHJldmlvdXNWYWx1ZSwgbmV3VmFsdWUpKSB7XG4gICAgICB0aGlzLl9pbnZhbGlkYXRlUmVsYXRpb25zaGlwc0ZvckF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKVxuICAgIH1cblxuICAgIHJldHVybiBuZXdWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEludmFsaWRhdGVzIGFueSBjYWNoZWQgYmVsb25nc1RvIHJlbGF0aW9uc2hpcCB3aG9zZSBmb3JlaWduIGtleSBtYXRjaGVzIHRoZVxuICAgKiBjaGFuZ2VkIGF0dHJpYnV0ZS4gSGFzTWFueSAvIGhhc09uZSByZWxhdGlvbnNoaXBzIGFyZSBsZWZ0IHVudG91Y2hlZCBiZWNhdXNlXG4gICAqIHRoZWlyIGZvcmVpZ24ga2V5IGxpdmVzIG9uIHRoZSBjaGlsZCwgbm90IG9uIHRoaXMgbW9kZWwsIGFuZCBibGFua2V0LWNsZWFyaW5nXG4gICAqIHRoZW0gd291bGQgZGVzdHJveSBuZXN0ZWQtc2F2ZSBzdGF0ZSBhbmQgcHJlbG9hZGVkIGNoaWxkcmVuIHRoZSBjYWxsZXIgbmV2ZXJcbiAgICogYXNrZWQgdG8gaW52YWxpZGF0ZS5cbiAgICpcbiAgICogRm9yZWlnbiBrZXlzIGFyZSBpbmZlcnJlZCB3aGVuIG5vdCBkZWNsYXJlZDogZm9yIGJlbG9uZ3NUbyBgcHJvamVjdElkYCBpc1xuICAgKiBpbmZlcnJlZCBmcm9tIHJlbGF0aW9uc2hpcCBuYW1lIGBwcm9qZWN0YC4gRXhwbGljaXQgYGZvcmVpZ25LZXlgIG9uIHRoZVxuICAgKiByZWxhdGlvbnNoaXAgZGVmaW5pdGlvbiB0YWtlcyBwcmVjZWRlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZSAtIEF0dHJpYnV0ZSBuYW1lIHRoYXQgY2hhbmdlZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfaW52YWxpZGF0ZVJlbGF0aW9uc2hpcHNGb3JBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkge1xuICAgIGlmICghdGhpcy5fcmVsYXRpb25zaGlwcyB8fCBPYmplY3Qua2V5cyh0aGlzLl9yZWxhdGlvbnNoaXBzKS5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSAqLyAodGhpcy5jb25zdHJ1Y3RvcilcbiAgICBjb25zdCBkZWZpbml0aW9ucyA9IHR5cGVvZiBNb2RlbENsYXNzLnJlbGF0aW9uc2hpcERlZmluaXRpb25zID09PSBcImZ1bmN0aW9uXCIgPyBNb2RlbENsYXNzLnJlbGF0aW9uc2hpcERlZmluaXRpb25zKCkgOiB7fVxuXG4gICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBOYW1lIG9mIE9iamVjdC5rZXlzKHRoaXMuX3JlbGF0aW9uc2hpcHMpKSB7XG4gICAgICBjb25zdCBkZWZpbml0aW9uID0gLyoqIEB0eXBlIHthbnl9ICovIChkZWZpbml0aW9uc1tyZWxhdGlvbnNoaXBOYW1lXSlcblxuICAgICAgaWYgKCFkZWZpbml0aW9uIHx8IGRlZmluaXRpb24udHlwZSAhPT0gXCJiZWxvbmdzVG9cIikgY29udGludWVcblxuICAgICAgY29uc3QgZm9yZWlnbktleSA9IGRlZmluaXRpb24uZm9yZWlnbktleSB8fCBgJHtyZWxhdGlvbnNoaXBOYW1lfUlkYFxuXG4gICAgICBpZiAoZm9yZWlnbktleSA9PT0gYXR0cmlidXRlTmFtZSkge1xuICAgICAgICBkZWxldGUgdGhpcy5fcmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIERlcml2ZWQgcmVzb3VyY2UgcGF0aC5cbiAgICovXG4gIHN0YXRpYyByZXNvdXJjZVBhdGgoKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRlRnJvbnRlbmRNb2RlbFJlc291cmNlUGF0aCh7XG4gICAgICBtb2RlbE5hbWU6IHRoaXMuZ2V0TW9kZWxOYW1lKCksXG4gICAgICByZXNvdXJjZVBhdGg6IGRlZmF1bHRGcm9udGVuZE1vZGVsUmVzb3VyY2VQYXRoKHRoaXMpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfVxuICAgKiBAcGFyYW0ge0Zyb250ZW5kTW9kZWxDb21tYW5kVHlwZX0gY29tbWFuZFR5cGUgLSBDb21tYW5kIHR5cGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gUmVzb2x2ZWQgY29tbWFuZCBuYW1lLlxuICAgKi9cbiAgc3RhdGljIGNvbW1hbmROYW1lKGNvbW1hbmRUeXBlKSB7XG4gICAgY29uc3QgcmVzb3VyY2VDb25maWcgPSB0aGlzLnJlc291cmNlQ29uZmlnKClcbiAgICBjb25zdCBidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzID0gcmVzb3VyY2VDb25maWcuYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kcyB8fCBbXVxuICAgIGNvbnN0IGJ1aWx0SW5NZW1iZXJDb21tYW5kcyA9IHJlc291cmNlQ29uZmlnLmJ1aWx0SW5NZW1iZXJDb21tYW5kcyB8fCBbXVxuICAgIGNvbnN0IGNvbW1hbmRzID0gcmVzb3VyY2VDb25maWcuY29tbWFuZHMgfHwgW11cbiAgICBjb25zdCBpc0V4cG9zZWQgPSBidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzLmluY2x1ZGVzKGNvbW1hbmRUeXBlKSB8fCBidWlsdEluTWVtYmVyQ29tbWFuZHMuaW5jbHVkZXMoY29tbWFuZFR5cGUpIHx8IGNvbW1hbmRzLmluY2x1ZGVzKGNvbW1hbmRUeXBlKVxuICAgIGNvbnN0IGNvbW1hbmROYW1lID0gaXNFeHBvc2VkID8gaW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKGNvbW1hbmRUeXBlKSkgOiBjb21tYW5kVHlwZVxuXG4gICAgcmV0dXJuIHZhbGlkYXRlRnJvbnRlbmRNb2RlbFJlc291cmNlQ29tbWFuZE5hbWUoe1xuICAgICAgY29tbWFuZE5hbWUsXG4gICAgICBjb21tYW5kVHlwZSxcbiAgICAgIG1vZGVsTmFtZTogdGhpcy5nZXRNb2RlbE5hbWUoKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIENvbW1hbmQgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gLSBDb21tYW5kIHBheWxvYWQuXG4gICAqL1xuICBzdGF0aWMgbm9ybWFsaXplQ3VzdG9tQ29tbWFuZFBheWxvYWRBcmd1bWVudHMoYXJncykge1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHt9XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0gYXJnc1swXVxuICAgICAgaWYgKHBheWxvYWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkICE9PSBcIm9iamVjdFwiIHx8IHBheWxvYWQgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHthcmcxOiBwYXlsb2FkfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqLyAocGF5bG9hZClcbiAgICB9XG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIG51bWJlciB8IHN0cmluZyB8IGFueVtdPn0gKi9cbiAgICBjb25zdCBwYXlsb2FkID0ge31cblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhcmdzLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgcGF5bG9hZFtgYXJnJHtpbmRleCArIDF9YF0gPSBhcmdzW2luZGV4XVxuICAgIH1cblxuICAgIHJldHVybiBwYXlsb2FkXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbW9kZWwgbmFtZSwgcHJlZmVycmluZyBhbiBleHBsaWNpdCBgc3RhdGljIG1vZGVsTmFtZWAgZGVjbGFyYXRpb25cbiAgICogb3ZlciB0aGUgSmF2YVNjcmlwdCBjbGFzcyBgLm5hbWVgIHByb3BlcnR5LiBUaGlzIGFsbG93cyBtaW5pZmllZCBidWlsZHMgdG9cbiAgICogcHJlc2VydmUgY29ycmVjdCBtb2RlbCBuYW1lcyB3aXRob3V0IHJlbHlpbmcgb24gYGtlZXBfY2xhc3NuYW1lc2AuXG4gICAqIEB0aGlzIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIG1vZGVsIG5hbWUuXG4gICAqL1xuICBzdGF0aWMgZ2V0TW9kZWxOYW1lKCkge1xuICAgIGNvbnN0IHJlc291cmNlQ29uZmlnID0gdHlwZW9mIHRoaXMucmVzb3VyY2VDb25maWcgPT09IFwiZnVuY3Rpb25cIiA/IHRoaXMucmVzb3VyY2VDb25maWcoKSA6IG51bGxcbiAgICBjb25zdCBtb2RlbE5hbWUgPSByZXNvdXJjZUNvbmZpZz8ubW9kZWxOYW1lXG5cbiAgICByZXR1cm4gKHR5cGVvZiBtb2RlbE5hbWUgPT09IFwic3RyaW5nXCIgJiYgbW9kZWxOYW1lLmxlbmd0aCA+IDApID8gbW9kZWxOYW1lIDogdGhpcy5uYW1lXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnfSBjb25maWcgLSBGcm9udGVuZCBtb2RlbCB0cmFuc3BvcnQgY29uZmlndXJhdGlvbi5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc3RhdGljIGNvbmZpZ3VyZVRyYW5zcG9ydChjb25maWcpIHtcbiAgICBpZiAoIWNvbmZpZyB8fCB0eXBlb2YgY29uZmlnICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgXCJ1cmxcIikpIHtcbiAgICAgIGZyb250ZW5kTW9kZWxUcmFuc3BvcnRDb25maWcudXJsID0gY29uZmlnLnVybFxuICAgIH1cblxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBcInNoYXJlZFwiKSkge1xuICAgICAgZnJvbnRlbmRNb2RlbFRyYW5zcG9ydENvbmZpZy5zaGFyZWQgPSBjb25maWcuc2hhcmVkXG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIFwid2Vic29ja2V0Q2xpZW50XCIpKSB7XG4gICAgICBmcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnLndlYnNvY2tldENsaWVudCA9IGNvbmZpZy53ZWJzb2NrZXRDbGllbnRcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgXCJ3ZWJzb2NrZXRVcmxcIikpIHtcbiAgICAgIGZyb250ZW5kTW9kZWxUcmFuc3BvcnRDb25maWcud2Vic29ja2V0VXJsID0gY29uZmlnLndlYnNvY2tldFVybFxuICAgICAgLy8gUmVzZXQgY2FjaGVkIGludGVybmFsIGNsaWVudCBzbyB0aGUgbmV3IFVSTCB0YWtlcyBlZmZlY3Qgb24gbmV4dCBzdWJzY3JpYmVcbiAgICAgIGludGVybmFsV2Vic29ja2V0Q2xpZW50ID0gbnVsbFxuICAgIH1cblxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBcInJlcXVlc3RIZWFkZXJzXCIpKSB7XG4gICAgICBmcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnLnJlcXVlc3RIZWFkZXJzID0gY29uZmlnLnJlcXVlc3RIZWFkZXJzXG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIFwic2Vzc2lvblN0b3JlXCIpKSB7XG4gICAgICBmcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnLnNlc3Npb25TdG9yZSA9IGNvbmZpZy5zZXNzaW9uU3RvcmVcbiAgICAgIC8vIFJlc2V0IGNhY2hlZCBpbnRlcm5hbCBjbGllbnQgc28gdGhlIG5ldyBzZXNzaW9uU3RvcmUgaXMgcGlja2VkIHVwLlxuICAgICAgaW50ZXJuYWxXZWJzb2NrZXRDbGllbnQgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbm5lY3QgdGhlIGludGVybmFsIFdlYlNvY2tldCBhbmQgZW5hYmxlIGF1dG8tcmVjb25uZWN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbm5lY3RlZC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBjb25uZWN0V2Vic29ja2V0KCkge1xuICAgIGNvbnN0IGNsaWVudCA9IHJlc29sdmVJbnRlcm5hbFdlYnNvY2tldENsaWVudCgpXG5cbiAgICBpZiAoIWNsaWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY29ubmVjdFdlYnNvY2tldCByZXF1aXJlcyBjb25maWd1cmVUcmFuc3BvcnQoe3dlYnNvY2tldFVybH0pXCIpXG4gICAgfVxuXG4gICAgYXdhaXQgY2xpZW50LmNvbm5lY3QoKVxuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3QgdGhlIGludGVybmFsIFdlYlNvY2tldCBhbmQgZGlzYWJsZSBhdXRvLXJlY29ubmVjdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjbG9zZWQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZGlzY29ubmVjdFdlYnNvY2tldCgpIHtcbiAgICBpZiAoIWludGVybmFsV2Vic29ja2V0Q2xpZW50KSByZXR1cm5cblxuICAgIGF3YWl0IGludGVybmFsV2Vic29ja2V0Q2xpZW50LmRpc2Nvbm5lY3RBbmRTdG9wUmVjb25uZWN0KClcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyB1bnRpbCBxdWV1ZWQgYW5kIGFjdGl2ZSBmcm9udGVuZC1tb2RlbCB0cmFuc3BvcnQgcmVxdWVzdHMgZmluaXNoLlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kTW9kZWxJZGxlV2FpdEFyZ3N9IFthcmdzXSAtIFdhaXQgb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiB0cmFuc3BvcnQgaXMgaWRsZS5cbiAgICovXG4gIHN0YXRpYyBhc3luYyB3YWl0Rm9ySWRsZShhcmdzID0ge30pIHtcbiAgICBjb25zdCB7cXVpZXRNcyA9IDAsIHRpbWVvdXQ6IHRpbWVvdXRNcyA9IDUwMDAsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcbiAgICBjb25zdCByZXN0QXJnS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKVxuXG4gICAgaWYgKHJlc3RBcmdLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biB3YWl0Rm9ySWRsZSBhcmdzOiAke3Jlc3RBcmdLZXlzLmpvaW4oXCIsIFwiKX1gKVxuICAgIH1cblxuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHF1aWV0TXMpIHx8IHF1aWV0TXMgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHdhaXRGb3JJZGxlIHF1aWV0TXMgdG8gYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLCBnb3Q6ICR7cXVpZXRNc31gKVxuICAgIH1cblxuICAgIGF3YWl0IHRpbWVvdXQoXG4gICAgICB7dGltZW91dDogdGltZW91dE1zLCBlcnJvck1lc3NhZ2U6IFwiVGltZWQgb3V0IHdhaXRpbmcgZm9yIGZyb250ZW5kIG1vZGVsIHRyYW5zcG9ydCB0byBiZWNvbWUgaWRsZVwifSxcbiAgICAgIGFzeW5jICgpID0+IGF3YWl0IHdhaXRGb3JGcm9udGVuZE1vZGVsVHJhbnNwb3J0SWRsZShxdWlldE1zKVxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IFdlYlNvY2tldCBjb25uZWN0aW9uIHN0YXRlLlxuICAgKiBAcmV0dXJucyB7e2Rpc2Nvbm5lY3RlZFNpbmNlOiBudW1iZXIgfCBudWxsLCBoYXNDbGllbnQ6IGJvb2xlYW4sIGlzT3BlbjogYm9vbGVhbiwgbGlzdGVuZXJDb3VudDogbnVtYmVyfX0gLSBTbmFwc2hvdCBvZiB0aGUgbWFuYWdlZCB3ZWJzb2NrZXQgY29ubmVjdGlvbiBzdGF0ZS5cbiAgICovXG4gIHN0YXRpYyB3ZWJzb2NrZXRTdGF0ZSgpIHtcbiAgICBpZiAoIWludGVybmFsV2Vic29ja2V0Q2xpZW50KSB7XG4gICAgICByZXR1cm4ge2Rpc2Nvbm5lY3RlZFNpbmNlOiBudWxsLCBoYXNDbGllbnQ6IGZhbHNlLCBpc09wZW46IGZhbHNlLCBsaXN0ZW5lckNvdW50OiAwfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5pbnRlcm5hbFdlYnNvY2tldENsaWVudC5zdGF0ZSgpLFxuICAgICAgaGFzQ2xpZW50OiB0cnVlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSByYXcgV2ViU29ja2V0IHdpdGhvdXQgZGlzYWJsaW5nIGF1dG8tcmVjb25uZWN0LiBVc2VkIGJ5IHRlc3RzIHRvXG4gICAqIHNpbXVsYXRlIGFuIHVuZXhwZWN0ZWQgbmV0d29yayBkcm9wIGFuZCB2ZXJpZnkgcmVjb25uZWN0aW9uIGJlaGF2aW9yLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHRoZSBzb2NrZXQgaGFzIGNsb3NlZC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBkcm9wV2Vic29ja2V0KCkge1xuICAgIGlmICghaW50ZXJuYWxXZWJzb2NrZXRDbGllbnQpIHJldHVyblxuXG4gICAgYXdhaXQgaW50ZXJuYWxXZWJzb2NrZXRDbGllbnQuZHJvcENvbm5lY3Rpb24oKVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgZ2xvYmFsIG1ldGFkYXRhIG9uIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbi4gU2VudCB0byB0aGUgc2VydmVyIGltbWVkaWF0ZWx5XG4gICAqIG92ZXIgV2ViU29ja2V0IGFuZCBleHBvc2VkIHRvIFdlYlNvY2tldC1ib3JuZSByZXF1ZXN0cyBhcyByZXF1ZXN0IG1ldGFkYXRhLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gTWV0YWRhdGEga2V5LlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBNZXRhZGF0YSB2YWx1ZSAobnVsbCB0byBjbGVhcikuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHNldFdlYnNvY2tldE1ldGFkYXRhKGtleSwgdmFsdWUpIHtcbiAgICBjb25zdCBjbGllbnQgPSAvKiogQHR5cGUge2FueX0gKi8gKGZyb250ZW5kTW9kZWxUcmFuc3BvcnRDb25maWcud2Vic29ja2V0Q2xpZW50IHx8IHJlc29sdmVJbnRlcm5hbFdlYnNvY2tldENsaWVudCgpKVxuXG4gICAgaWYgKCFjbGllbnQgfHwgdHlwZW9mIGNsaWVudC5zZXRNZXRhZGF0YSAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm5cblxuICAgIGNsaWVudC5zZXRNZXRhZGF0YShrZXksIHZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGEgbWFuYWdlZCBjb25uZWN0aW9uIHRoYXQgYXV0by1vcGVucywgYXV0by1jbG9zZXMsIGFuZFxuICAgKiBhdXRvLXJlY29ubmVjdHMgYmFzZWQgb24gYHNob3VsZENvbm5lY3QoKWAgYW5kIGBwYXJhbXMoKWAuXG4gICAqIENhbGwgYGhhbmRsZS5zeW5jKClgIHdoZW5ldmVyIHRoZSBpbnB1dHMgdGhhdCBkcml2ZSB0aG9zZVxuICAgKiBmdW5jdGlvbnMgY2hhbmdlIChlLmcuIGN1cnJlbnQtdXNlciBzaWduLWluL291dCkuIFRoZSBoYW5kbGVcbiAgICogcmV0cmllcyB3aGVuIHRoZSBXUyBjbGllbnQgaXNuJ3QgcmVhZHkgYW5kIHJlb3BlbnMgb24gY2xvc2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb25uZWN0aW9uVHlwZSAtIENvbm5lY3Rpb24gY2xhc3MgbmFtZSByZWdpc3RlcmVkIG9uIHRoZSBzZXJ2ZXIuXG4gICAqIEBwYXJhbSB7e3Nob3VsZENvbm5lY3Q6ICgpID0+IGJvb2xlYW4sIHBhcmFtczogKCkgPT4gUmVjb3JkPHN0cmluZywgYW55Piwgb25NZXNzYWdlPzogKGJvZHk6IGFueSkgPT4gdm9pZH19IG9wdGlvbnMgLSBDb25uZWN0aW9uIGxpZmVjeWNsZSBhbmQgcGF5bG9hZCBjYWxsYmFja3MuXG4gICAqIEByZXR1cm5zIHt7c3luYzogKCkgPT4gdm9pZCwgY2xvc2U6ICgpID0+IHZvaWR9fSAtIEhhbmRsZSB1c2VkIHRvIHJlc3luYyBvciBjbG9zZSB0aGUgbWFuYWdlZCBjb25uZWN0aW9uLlxuICAgKi9cbiAgc3RhdGljIG9wZW5NYW5hZ2VkQ29ubmVjdGlvbihjb25uZWN0aW9uVHlwZSwgb3B0aW9ucykge1xuICAgIC8qKiBAdHlwZSB7YW55fSAqL1xuICAgIGxldCBjb25uZWN0aW9uID0gbnVsbFxuICAgIGxldCBjbG9zZWQgPSBmYWxzZVxuICAgIC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsfSAqL1xuICAgIGxldCByZXRyeVRpbWVyID0gbnVsbFxuICAgIGxldCBsYXN0UGFyYW1zSnNvbiA9IFwiXCJcblxuICAgIGNvbnN0IHN5bmMgPSAoKSA9PiB7XG4gICAgICBpZiAoY2xvc2VkKSByZXR1cm5cblxuICAgICAgaWYgKCFvcHRpb25zLnNob3VsZENvbm5lY3QoKSkge1xuICAgICAgICBpZiAoY29ubmVjdGlvbiAmJiAhY29ubmVjdGlvbi5pc0Nsb3NlZCgpKSBjb25uZWN0aW9uLmNsb3NlKClcbiAgICAgICAgY29ubmVjdGlvbiA9IG51bGxcbiAgICAgICAgbGFzdFBhcmFtc0pzb24gPSBcIlwiXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXh0UGFyYW1zID0gb3B0aW9ucy5wYXJhbXMoKVxuICAgICAgY29uc3QgbmV4dFBhcmFtc0pzb24gPSBKU09OLnN0cmluZ2lmeShuZXh0UGFyYW1zKVxuXG4gICAgICAvLyBBbHJlYWR5IGNvbm5lY3RlZCB3aXRoIHNhbWUgcGFyYW1zIOKAlCBub3RoaW5nIHRvIGRvLlxuICAgICAgaWYgKGNvbm5lY3Rpb24gJiYgIWNvbm5lY3Rpb24uaXNDbG9zZWQoKSAmJiBuZXh0UGFyYW1zSnNvbiA9PT0gbGFzdFBhcmFtc0pzb24pIHJldHVyblxuXG4gICAgICAvLyBDb25uZWN0ZWQgYnV0IHBhcmFtcyBjaGFuZ2VkIOKAlCBzZW5kIHVwZGF0ZSBtZXNzYWdlLlxuICAgICAgLy8gR3VhcmQgd2l0aCB0cnkvY2F0Y2g6IHRoZSBjb25uZWN0aW9uIGhhbmRsZSBzdGF5cyBsaXZlIGR1cmluZ1xuICAgICAgLy8gcmVjb25uZWN0IGJ1dCB0aGUgdW5kZXJseWluZyBzb2NrZXQgbWF5IGJlIGNsb3NlZC5cbiAgICAgIGlmIChjb25uZWN0aW9uICYmICFjb25uZWN0aW9uLmlzQ2xvc2VkKCkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25uZWN0aW9uLnNlbmRNZXNzYWdlKG5leHRQYXJhbXMpXG4gICAgICAgICAgbGFzdFBhcmFtc0pzb24gPSBuZXh0UGFyYW1zSnNvblxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBjb25uZWN0aW9uID0gbnVsbFxuICAgICAgICAgIGxhc3RQYXJhbXNKc29uID0gXCJcIlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFdTIGNsaWVudCBub3QgcmVhZHkg4oCUIHJldHJ5LiBDaGVjayB0aGUgYWN0dWFsIGNsaWVudCAod2hpY2hcbiAgICAgIC8vIG1heSBiZSBhbiBpbmplY3RlZCB3ZWJzb2NrZXRDbGllbnQpIGluc3RlYWQgb2Ygd2Vic29ja2V0U3RhdGUoKVxuICAgICAgLy8gd2hpY2ggb25seSByZWZsZWN0cyB0aGUgaW50ZXJuYWwgY2xpZW50LlxuICAgICAgY29uc3QgY2xpZW50ID0gLyoqIEB0eXBlIHthbnl9ICovIChmcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnLndlYnNvY2tldENsaWVudCB8fCByZXNvbHZlSW50ZXJuYWxXZWJzb2NrZXRDbGllbnQoKSlcblxuICAgICAgaWYgKCFjbGllbnQgfHwgIWNsaWVudC5pc09wZW4oKSkge1xuICAgICAgICBpZiAocmV0cnlUaW1lciA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHJ5VGltZXIgPSBnbG9iYWxUaGlzLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgcmV0cnlUaW1lciA9IG51bGxcbiAgICAgICAgICAgIHN5bmMoKVxuICAgICAgICAgIH0sIDI1MClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgbGFzdFBhcmFtc0pzb24gPSBuZXh0UGFyYW1zSnNvblxuICAgICAgY29ubmVjdGlvbiA9IEZyb250ZW5kTW9kZWxCYXNlLm9wZW5XZWJzb2NrZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25UeXBlLCB7XG4gICAgICAgIHBhcmFtczogbmV4dFBhcmFtcyxcbiAgICAgICAgb25NZXNzYWdlOiBvcHRpb25zLm9uTWVzc2FnZSxcbiAgICAgICAgb25DbG9zZTogKCkgPT4ge1xuICAgICAgICAgIGlmIChjb25uZWN0aW9uPy5pc0Nsb3NlZCgpKSB7XG4gICAgICAgICAgICBjb25uZWN0aW9uID0gbnVsbFxuICAgICAgICAgICAgbGFzdFBhcmFtc0pzb24gPSBcIlwiXG4gICAgICAgICAgICBzeW5jKClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3QgY2xvc2UgPSAoKSA9PiB7XG4gICAgICBjbG9zZWQgPSB0cnVlXG4gICAgICBpZiAocmV0cnlUaW1lciAhPT0gbnVsbCkgZ2xvYmFsVGhpcy5jbGVhclRpbWVvdXQocmV0cnlUaW1lcilcbiAgICAgIGlmIChjb25uZWN0aW9uICYmICFjb25uZWN0aW9uLmlzQ2xvc2VkKCkpIGNvbm5lY3Rpb24uY2xvc2UoKVxuICAgICAgY29ubmVjdGlvbiA9IG51bGxcbiAgICB9XG5cbiAgICBzeW5jKClcblxuICAgIHJldHVybiB7c3luYywgY2xvc2V9XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgYSAxOjEgYFdlYnNvY2tldENvbm5lY3Rpb25gIG9mIHRoZSBnaXZlbiB0eXBlLiBUaGluXG4gICAqIGNvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIHRoZSBpbnRlcm5hbCBXUyBjbGllbnQnc1xuICAgKiBgb3BlbkNvbm5lY3Rpb25gLiBBcHBzIHVzZSB0aGlzIGZvciBwZXItc2Vzc2lvbiBzdGF0ZS9tZXNzYWdpbmdcbiAgICogdGhhdCBkb2Vzbid0IGZpdCB0aGUgcHViL3N1YiBDaGFubmVsIG1vZGVsIChsb2NhbGUsIHByZXNlbmNlKS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbm5lY3Rpb25UeXBlIC0gTmFtZSB0aGUgc2VydmVyIHJlZ2lzdGVyZWQgdGhlIGNsYXNzIHVuZGVyLlxuICAgKiBAcGFyYW0ge3twYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBvbkNvbm5lY3Q/OiAoKSA9PiB2b2lkLCBvbk1lc3NhZ2U/OiAoYm9keTogYW55KSA9PiB2b2lkLCBvbkRpc2Nvbm5lY3Q/OiAoKSA9PiB2b2lkLCBvblJlc3VtZT86ICgpID0+IHZvaWQsIG9uQ2xvc2U/OiAocmVhc29uOiBzdHJpbmcpID0+IHZvaWR9fSBbb3B0aW9uc10gLSBDb25uZWN0aW9uIG9wdGlvbnMgYW5kIGV2ZW50IGhhbmRsZXJzLlxuICAgKiBAcmV0dXJucyB7YW55fSAtIFZlbG9jaW91c1dlYnNvY2tldENsaWVudENvbm5lY3Rpb24gaGFuZGxlICh0eXBlZCBsb29zZWx5IHRvIGF2b2lkIGEgY3Jvc3MtbW9kdWxlIGltcG9ydCBjeWNsZSkuXG4gICAqL1xuICBzdGF0aWMgb3BlbldlYnNvY2tldENvbm5lY3Rpb24oY29ubmVjdGlvblR5cGUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBjbGllbnQgPSAvKiogQHR5cGUge2FueX0gKi8gKGZyb250ZW5kTW9kZWxUcmFuc3BvcnRDb25maWcud2Vic29ja2V0Q2xpZW50IHx8IHJlc29sdmVJbnRlcm5hbFdlYnNvY2tldENsaWVudCgpKVxuXG4gICAgaWYgKCFjbGllbnQgfHwgdHlwZW9mIGNsaWVudC5vcGVuQ29ubmVjdGlvbiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJvcGVuV2Vic29ja2V0Q29ubmVjdGlvbiByZXF1aXJlcyBjb25maWd1cmVUcmFuc3BvcnQoe3dlYnNvY2tldFVybH0pXCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIGNsaWVudC5vcGVuQ29ubmVjdGlvbihjb25uZWN0aW9uVHlwZSwgb3B0aW9ucyB8fCB7fSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIHRvIGEgcHViL3N1YiBgV2Vic29ja2V0Q2hhbm5lbGAuIFRoaW4gd3JhcHBlciBhcm91bmRcbiAgICogdGhlIGludGVybmFsIGNsaWVudCdzIGBzdWJzY3JpYmVDaGFubmVsYC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWxUeXBlIC0gQ2hhbm5lbCBjbGFzcyBuYW1lIHJlZ2lzdGVyZWQgb24gdGhlIHNlcnZlci5cbiAgICogQHBhcmFtIHt7cGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55Piwgb25NZXNzYWdlPzogKGJvZHk6IGFueSkgPT4gdm9pZCwgb25EaXNjb25uZWN0PzogKCkgPT4gdm9pZCwgb25SZXN1bWU/OiAoKSA9PiB2b2lkLCBvbkNsb3NlPzogKHJlYXNvbjogc3RyaW5nKSA9PiB2b2lkfX0gW29wdGlvbnNdIC0gQ2hhbm5lbCBzdWJzY3JpcHRpb24gb3B0aW9ucyBhbmQgZXZlbnQgaGFuZGxlcnMuXG4gICAqIEByZXR1cm5zIHthbnl9IC0gV2Vic29ja2V0IGNoYW5uZWwgaGFuZGxlIGZyb20gdGhlIGNvbmZpZ3VyZWQgY2xpZW50LlxuICAgKi9cbiAgc3RhdGljIHN1YnNjcmliZVdlYnNvY2tldENoYW5uZWwoY2hhbm5lbFR5cGUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBjbGllbnQgPSAvKiogQHR5cGUge2FueX0gKi8gKGZyb250ZW5kTW9kZWxUcmFuc3BvcnRDb25maWcud2Vic29ja2V0Q2xpZW50IHx8IHJlc29sdmVJbnRlcm5hbFdlYnNvY2tldENsaWVudCgpKVxuXG4gICAgaWYgKCFjbGllbnQgfHwgdHlwZW9mIGNsaWVudC5zdWJzY3JpYmVDaGFubmVsICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInN1YnNjcmliZVdlYnNvY2tldENoYW5uZWwgcmVxdWlyZXMgY29uZmlndXJlVHJhbnNwb3J0KHt3ZWJzb2NrZXRVcmx9KVwiKVxuICAgIH1cblxuICAgIHJldHVybiBjbGllbnQuc3Vic2NyaWJlQ2hhbm5lbChjaGFubmVsVHlwZSwgb3B0aW9ucyB8fCB7fSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxscyBXZWJTb2NrZXQgbGlmZWN5Y2xlIGhvb2tzIG9uIGdsb2JhbFRoaXMgZm9yIHN5c3RlbSB0ZXN0IGFjY2Vzcy5cbiAgICogVGVzdHMgY2FuIGNhbGwgYGdsb2JhbFRoaXMuX192ZWxvY2lvdXNfd2Vic29ja2V0X2hvb2tzLmNvbm5lY3QoKWAgZXRjLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBpbnN0YWxsV2Vic29ja2V0VGVzdEhvb2tzKCkge1xuICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuXG5cbiAgICAvKiogQHR5cGUge2FueX0gKi8gKGdsb2JhbFRoaXMpLl9fdmVsb2Npb3VzX3dlYnNvY2tldF9ob29rcyA9IHtcbiAgICAgIGNvbm5lY3Q6ICgpID0+IHRoaXMuY29ubmVjdFdlYnNvY2tldCgpLFxuICAgICAgZGlzY29ubmVjdDogKCkgPT4gdGhpcy5kaXNjb25uZWN0V2Vic29ja2V0KCksXG4gICAgICBkcm9wOiAoKSA9PiB0aGlzLmRyb3BXZWJzb2NrZXQoKSxcbiAgICAgIHN0YXRlOiAoKSA9PiB0aGlzLndlYnNvY2tldFN0YXRlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHBhcmFtIHtvYmplY3R9IHJlc3BvbnNlIC0gUmVzcG9uc2UgcGF5bG9hZC5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59IC0gQXR0cmlidXRlcyBmcm9tIHBheWxvYWQuXG4gICAqL1xuICBzdGF0aWMgYXR0cmlidXRlc0Zyb21SZXNwb25zZShyZXNwb25zZSkge1xuICAgIGNvbnN0IG1vZGVsRGF0YSA9IHRoaXMubW9kZWxEYXRhRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuXG4gICAgcmV0dXJuIG1vZGVsRGF0YS5hdHRyaWJ1dGVzXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHBhcmFtIHtvYmplY3R9IHJlc3BvbnNlIC0gUmVzcG9uc2UgcGF5bG9hZC5cbiAgICogQHJldHVybnMge3thYmlsaXRpZXM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+LCBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBhc3NvY2lhdGlvbkNvdW50czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiwgcXVlcnlEYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgcHJlbG9hZGVkUmVsYXRpb25zaGlwczogUmVjb3JkPHN0cmluZywgYW55Piwgc2VsZWN0ZWRBdHRyaWJ1dGVzOiBTZXQ8c3RyaW5nPn19IC0gQXR0cmlidXRlcywgcHJlbG9hZGVkIHJlbGF0aW9uc2hpcHMsIGFzc29jaWF0aW9uIGNvdW50cywgcXVlcnlEYXRhLCBhYmlsaXRpZXMsIGFuZCB0aGUgc2VsZWN0ZWQtYXR0cmlidXRlcyBzZXQuXG4gICAqL1xuICBzdGF0aWMgbW9kZWxEYXRhRnJvbVJlc3BvbnNlKHJlc3BvbnNlKSB7XG4gICAgaWYgKCFyZXNwb25zZSB8fCB0eXBlb2YgcmVzcG9uc2UgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgb2JqZWN0IHJlc3BvbnNlIGJ1dCBnb3Q6ICR7cmVzcG9uc2V9YClcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZU9iamVjdCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi8gKHJlc3BvbnNlKVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgIGxldCBtb2RlbERhdGFcblxuICAgIGlmIChyZXNwb25zZU9iamVjdC5tb2RlbCAmJiB0eXBlb2YgcmVzcG9uc2VPYmplY3QubW9kZWwgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIG1vZGVsRGF0YSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi8gKHJlc3BvbnNlT2JqZWN0Lm1vZGVsKVxuICAgIH0gZWxzZSBpZiAocmVzcG9uc2VPYmplY3QuYXR0cmlidXRlcyAmJiB0eXBlb2YgcmVzcG9uc2VPYmplY3QuYXR0cmlidXRlcyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgbW9kZWxEYXRhID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqLyAocmVzcG9uc2VPYmplY3QuYXR0cmlidXRlcylcbiAgICB9IGVsc2Uge1xuICAgICAgbW9kZWxEYXRhID0gcmVzcG9uc2VPYmplY3RcbiAgICB9XG5cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gey4uLm1vZGVsRGF0YX1cbiAgICBjb25zdCBwcmVsb2FkZWRSZWxhdGlvbnNoaXBzID0gaXNQbGFpbk9iamVjdChhdHRyaWJ1dGVzW1BSRUxPQURFRF9SRUxBVElPTlNISVBTX0tFWV0pXG4gICAgICA/IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi8gKGF0dHJpYnV0ZXNbUFJFTE9BREVEX1JFTEFUSU9OU0hJUFNfS0VZXSlcbiAgICAgIDoge31cbiAgICBjb25zdCBhc3NvY2lhdGlvbkNvdW50cyA9IGlzUGxhaW5PYmplY3QoYXR0cmlidXRlc1tBU1NPQ0lBVElPTl9DT1VOVFNfS0VZXSlcbiAgICAgID8gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXI+fSAqLyAoYXR0cmlidXRlc1tBU1NPQ0lBVElPTl9DT1VOVFNfS0VZXSlcbiAgICAgIDoge31cbiAgICBjb25zdCBxdWVyeURhdGEgPSBpc1BsYWluT2JqZWN0KGF0dHJpYnV0ZXNbUVVFUllfREFUQV9LRVldKVxuICAgICAgPyAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAoYXR0cmlidXRlc1tRVUVSWV9EQVRBX0tFWV0pXG4gICAgICA6IHt9XG4gICAgY29uc3QgYWJpbGl0aWVzID0gaXNQbGFpbk9iamVjdChhdHRyaWJ1dGVzW0FCSUxJVElFU19LRVldKVxuICAgICAgPyAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGJvb2xlYW4+fSAqLyAoYXR0cmlidXRlc1tBQklMSVRJRVNfS0VZXSlcbiAgICAgIDoge31cbiAgICBjb25zdCBzZWxlY3RlZEF0dHJpYnV0ZXNGcm9tUGF5bG9hZCA9IEFycmF5LmlzQXJyYXkoYXR0cmlidXRlc1tTRUxFQ1RFRF9BVFRSSUJVVEVTX0tFWV0pXG4gICAgICA/IG5ldyBTZXQoLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi8gKGF0dHJpYnV0ZXNbU0VMRUNURURfQVRUUklCVVRFU19LRVldKS5maWx0ZXIoKGF0dHJpYnV0ZU5hbWUpID0+IHR5cGVvZiBhdHRyaWJ1dGVOYW1lID09PSBcInN0cmluZ1wiKSlcbiAgICAgIDogbnVsbFxuXG4gICAgZGVsZXRlIGF0dHJpYnV0ZXNbUFJFTE9BREVEX1JFTEFUSU9OU0hJUFNfS0VZXVxuICAgIGRlbGV0ZSBhdHRyaWJ1dGVzW1NFTEVDVEVEX0FUVFJJQlVURVNfS0VZXVxuICAgIGRlbGV0ZSBhdHRyaWJ1dGVzW0FTU09DSUFUSU9OX0NPVU5UU19LRVldXG4gICAgZGVsZXRlIGF0dHJpYnV0ZXNbUVVFUllfREFUQV9LRVldXG4gICAgZGVsZXRlIGF0dHJpYnV0ZXNbQUJJTElUSUVTX0tFWV1cblxuICAgIGNvbnN0IHNlbGVjdGVkQXR0cmlidXRlcyA9IHNlbGVjdGVkQXR0cmlidXRlc0Zyb21QYXlsb2FkIHx8IG5ldyBTZXQoT2JqZWN0LmtleXMoYXR0cmlidXRlcykpXG5cbiAgICByZXR1cm4ge2FiaWxpdGllcywgYXR0cmlidXRlcywgYXNzb2NpYXRpb25Db3VudHMsIHF1ZXJ5RGF0YSwgcHJlbG9hZGVkUmVsYXRpb25zaGlwcywgc2VsZWN0ZWRBdHRyaWJ1dGVzfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9XG4gICAqIEBwYXJhbSB7RnJvbnRlbmRNb2RlbEJhc2V9IG1vZGVsIC0gTW9kZWwgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gcHJlbG9hZGVkUmVsYXRpb25zaGlwcyAtIFByZWxvYWRlZCByZWxhdGlvbnNoaXAgcGF5bG9hZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgYXBwbHlQcmVsb2FkZWRSZWxhdGlvbnNoaXBzKG1vZGVsLCBwcmVsb2FkZWRSZWxhdGlvbnNoaXBzKSB7XG4gICAgZm9yIChjb25zdCBbcmVsYXRpb25zaGlwTmFtZSwgcmVsYXRpb25zaGlwUGF5bG9hZF0gb2YgT2JqZWN0LmVudHJpZXMocHJlbG9hZGVkUmVsYXRpb25zaGlwcykpIHtcbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IG1vZGVsLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShyZWxhdGlvbnNoaXBOYW1lKVxuICAgICAgY29uc3QgdGFyZ2V0TW9kZWxDbGFzcyA9IHRoaXMucmVsYXRpb25zaGlwTW9kZWxDbGFzcyhyZWxhdGlvbnNoaXBOYW1lKVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZWxhdGlvbnNoaXBQYXlsb2FkKSkge1xuICAgICAgICByZWxhdGlvbnNoaXAuc2V0TG9hZGVkKHJlbGF0aW9uc2hpcFBheWxvYWQubWFwKChlbnRyeSkgPT4gdGhpcy5pbnN0YW50aWF0ZVJlbGF0aW9uc2hpcFZhbHVlKGVudHJ5LCB0YXJnZXRNb2RlbENsYXNzKSkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHJlbGF0aW9uc2hpcC5zZXRMb2FkZWQodGhpcy5pbnN0YW50aWF0ZVJlbGF0aW9uc2hpcFZhbHVlKHJlbGF0aW9uc2hpcFBheWxvYWQsIHRhcmdldE1vZGVsQ2xhc3MpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfVxuICAgKiBAcGFyYW0ge2FueX0gcmVsYXRpb25zaGlwUGF5bG9hZCAtIFJlbGF0aW9uc2hpcCBwYXlsb2FkIHZhbHVlLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZSB8IG51bGx9IHRhcmdldE1vZGVsQ2xhc3MgLSBUYXJnZXQgbW9kZWwgY2xhc3MuXG4gICAqIEByZXR1cm5zIHthbnl9IC0gSW5zdGFudGlhdGVkIHJlbGF0aW9uc2hpcCB2YWx1ZS5cbiAgICovXG4gIHN0YXRpYyBpbnN0YW50aWF0ZVJlbGF0aW9uc2hpcFZhbHVlKHJlbGF0aW9uc2hpcFBheWxvYWQsIHRhcmdldE1vZGVsQ2xhc3MpIHtcbiAgICBpZiAoIXRhcmdldE1vZGVsQ2xhc3MpIHJldHVybiByZWxhdGlvbnNoaXBQYXlsb2FkXG5cbiAgICBpZiAoIXJlbGF0aW9uc2hpcFBheWxvYWQgfHwgdHlwZW9mIHJlbGF0aW9uc2hpcFBheWxvYWQgIT09IFwib2JqZWN0XCIpIHJldHVybiByZWxhdGlvbnNoaXBQYXlsb2FkXG5cbiAgICByZXR1cm4gdGFyZ2V0TW9kZWxDbGFzcy5pbnN0YW50aWF0ZUZyb21SZXNwb25zZShyZWxhdGlvbnNoaXBQYXlsb2FkKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT4gfCBJbnN0YW5jZVR5cGU8VD59IHJlc3BvbnNlIC0gUmVzcG9uc2UgcGF5bG9hZCwgb3IgYW4gYWxyZWFkeS1oeWRyYXRlZCBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7SW5zdGFuY2VUeXBlPFQ+fSAtIE5ldyBtb2RlbCBpbnN0YW5jZSwgb3IgdGhlIHNhbWUgaW5zdGFuY2UgdW5jaGFuZ2VkIGlmIGl0IHdhcyBhbHJlYWR5IGh5ZHJhdGVkLlxuICAgKi9cbiAgc3RhdGljIGluc3RhbnRpYXRlRnJvbVJlc3BvbnNlKHJlc3BvbnNlKSB7XG4gICAgLy8gSWRlbXBvdGVudDogaWYgYSBjYWxsZXIgaGFuZHMgdXMgYW4gYWxyZWFkeS1oeWRyYXRlZCBpbnN0YW5jZSBvZiB0aGlzXG4gICAgLy8gY2xhc3MgKG5vdyBjb21tb24gYmVjYXVzZSB0aGUgc2hhcmVkIGZyb250ZW5kLW1vZGVsIEFQSSBhdXRvLXNlcmlhbGl6ZXNcbiAgICAvLyBiYWNrZW5kIGBSZWNvcmRgIGluc3RhbmNlcyByZXR1cm5lZCBmcm9tIGN1c3RvbSBjb21tYW5kcyBhbmQgdGhlXG4gICAgLy8gdHJhbnNwb3J0IGRlc2VyaWFsaXplciBoeWRyYXRlcyB0aGVtIGludG8gbW9kZWxzIGJlZm9yZSB0aGUgY2FsbCBzaXRlXG4gICAgLy8gc2VlcyB0aGUgcmVzcG9uc2UpLCByZXR1cm4gaXQgYXMtaXMuIFdpdGhvdXQgdGhpcywgY29kZSB0aGF0IGhhc1xuICAgIC8vIGhpc3RvcmljYWxseSB3cmFwcGVkIGN1c3RvbS1jb21tYW5kIHJlc3BvbnNlcyBpblxuICAgIC8vIGBNb2RlbC5pbnN0YW50aWF0ZUZyb21SZXNwb25zZShyZXNwb25zZS5maWVsZClgIHdvdWxkIHNwcmVhZCB0aGUgbGl2ZVxuICAgIC8vIG1vZGVsIGluc3RhbmNlIGludG8gYSBuZXcgY29uc3RydWN0b3IgY2FsbCBhbmQgcHJvZHVjZSBhIGJyb2tlbiBtb2RlbFxuICAgIC8vIHdpdGggaW50ZXJuYWwgc3RhdGUga2V5cyBwcm9tb3RlZCB0byBhdHRyaWJ1dGVzLlxuICAgIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIHRoaXMpIHtcbiAgICAgIHJldHVybiAvKiogQHR5cGUge0luc3RhbmNlVHlwZTxUPn0gKi8gKHJlc3BvbnNlKVxuICAgIH1cblxuICAgIGNvbnN0IG1vZGVsRGF0YSA9IHRoaXMubW9kZWxEYXRhRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBtb2RlbERhdGEuYXR0cmlidXRlc1xuICAgIGNvbnN0IHByZWxvYWRlZFJlbGF0aW9uc2hpcHMgPSBtb2RlbERhdGEucHJlbG9hZGVkUmVsYXRpb25zaGlwc1xuICAgIGNvbnN0IGFzc29jaWF0aW9uQ291bnRzID0gbW9kZWxEYXRhLmFzc29jaWF0aW9uQ291bnRzXG4gICAgY29uc3QgcXVlcnlEYXRhID0gbW9kZWxEYXRhLnF1ZXJ5RGF0YVxuICAgIGNvbnN0IGFiaWxpdGllcyA9IG1vZGVsRGF0YS5hYmlsaXRpZXNcbiAgICBjb25zdCBzZWxlY3RlZEF0dHJpYnV0ZXMgPSBtb2RlbERhdGEuc2VsZWN0ZWRBdHRyaWJ1dGVzXG4gICAgY29uc3QgbW9kZWwgPSAvKiogQHR5cGUge0luc3RhbmNlVHlwZTxUPn0gKi8gKG5ldyB0aGlzKGF0dHJpYnV0ZXMpKVxuICAgIG1vZGVsLl9zZWxlY3RlZEF0dHJpYnV0ZXMgPSBzZWxlY3RlZEF0dHJpYnV0ZXMgPyBuZXcgU2V0KHNlbGVjdGVkQXR0cmlidXRlcykgOiBudWxsXG5cbiAgICB0aGlzLmFwcGx5UHJlbG9hZGVkUmVsYXRpb25zaGlwcyhtb2RlbCwgcHJlbG9hZGVkUmVsYXRpb25zaGlwcylcblxuICAgIGZvciAoY29uc3QgW2F0dHJpYnV0ZU5hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhc3NvY2lhdGlvbkNvdW50cyB8fCB7fSkpIHtcbiAgICAgIG1vZGVsLl9zZXRBc3NvY2lhdGlvbkNvdW50KGF0dHJpYnV0ZU5hbWUsIE51bWJlcih2YWx1ZSkgfHwgMClcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocXVlcnlEYXRhIHx8IHt9KSkge1xuICAgICAgbW9kZWwuX3NldFF1ZXJ5RGF0YShuYW1lLCB2YWx1ZSlcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFthY3Rpb24sIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhYmlsaXRpZXMgfHwge30pKSB7XG4gICAgICBtb2RlbC5fc2V0Q29tcHV0ZWRBYmlsaXR5KGFjdGlvbiwgQm9vbGVhbih2YWx1ZSkpXG4gICAgfVxuXG4gICAgbW9kZWwuc2V0SXNOZXdSZWNvcmQoZmFsc2UpXG4gICAgbW9kZWwuX3BlcnNpc3RlZEF0dHJpYnV0ZXMgPSBjbG9uZUZyb250ZW5kTW9kZWxBdHRyaWJ1dGVzKG1vZGVsLmF0dHJpYnV0ZXMoKSlcblxuICAgIHJldHVybiBtb2RlbFxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcGFyYW0ge251bWJlciB8IHN0cmluZ30gaWQgLSBSZWNvcmQgaWRlbnRpZmllci5cbiAgICogQHJldHVybnMge1Byb21pc2U8SW5zdGFuY2VUeXBlPFQ+Pn0gLSBSZXNvbHZlZCBtb2RlbC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBmaW5kKGlkKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucXVlcnkoKS5maW5kKGlkKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmRpdGlvbnMgLSBBdHRyaWJ1dGUgbWF0Y2ggY29uZGl0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8SW5zdGFuY2VUeXBlPFQ+IHwgbnVsbD59IC0gRm91bmQgbW9kZWwgb3IgbnVsbC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBmaW5kQnkoY29uZGl0aW9ucykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnF1ZXJ5KCkuZmluZEJ5KGNvbmRpdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9IFRcbiAgICogQHRoaXMge1R9XG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gY29uZGl0aW9ucyAtIEF0dHJpYnV0ZSBtYXRjaCBjb25kaXRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxJbnN0YW5jZVR5cGU8VD4+fSAtIEZvdW5kIG1vZGVsLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGZpbmRCeU9yRmFpbChjb25kaXRpb25zKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucXVlcnkoKS5maW5kQnlPckZhaWwoY29uZGl0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gVFxuICAgKiBAdGhpcyB7VH1cbiAgICogQHJldHVybnMge1Byb21pc2U8SW5zdGFuY2VUeXBlPFQ+W10+fSAtIExvYWRlZCBtb2RlbCBpbnN0YW5jZXMuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgdG9BcnJheSgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5xdWVyeSgpLnRvQXJyYXkoKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxJbnN0YW5jZVR5cGU8VD5bXT59IC0gTG9hZGVkIG1vZGVsIGluc3RhbmNlcy5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBsb2FkKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnF1ZXJ5KCkubG9hZCgpXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9IFRcbiAgICogQHRoaXMge1R9XG4gICAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsUXVlcnk8VD59IC0gUXVlcnkgYnVpbGRlci5cbiAgICovXG4gIHN0YXRpYyBhbGwoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnkoKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmRpdGlvbnMgLSBSb290LW1vZGVsIHdoZXJlIGNvbmRpdGlvbnMuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLmRlZmF1bHQ8VD59IC0gUXVlcnkgd2l0aCB3aGVyZSBjb25kaXRpb25zLlxuICAgKi9cbiAgc3RhdGljIHdoZXJlKGNvbmRpdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeSgpLndoZXJlKGNvbmRpdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9IFRcbiAgICogQHRoaXMge1R9XG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55PiB8IEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+fSBqb2lucyAtIFJlbGF0aW9uc2hpcCBkZXNjcmlwdG9yIGpvaW5zLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5kZWZhdWx0PFQ+fSAtIFF1ZXJ5IHdpdGggam9pbnMuXG4gICAqL1xuICBzdGF0aWMgam9pbnMoam9pbnMpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeSgpLmpvaW5zKGpvaW5zKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBNYXhpbXVtIG51bWJlciBvZiByZWNvcmRzLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5kZWZhdWx0PFQ+fSAtIFF1ZXJ5IHdpdGggbGltaXQuXG4gICAqL1xuICBzdGF0aWMgbGltaXQodmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeSgpLmxpbWl0KHZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBOdW1iZXIgb2YgcmVjb3JkcyB0byBza2lwLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5kZWZhdWx0PFQ+fSAtIFF1ZXJ5IHdpdGggb2Zmc2V0LlxuICAgKi9cbiAgc3RhdGljIG9mZnNldCh2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5KCkub2Zmc2V0KHZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZU51bWJlciAtIDEtYmFzZWQgcGFnZSBudW1iZXIuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLmRlZmF1bHQ8VD59IC0gUXVlcnkgd2l0aCBwYWdlIGFwcGxpZWQuXG4gICAqL1xuICBzdGF0aWMgcGFnZShwYWdlTnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnkoKS5wYWdlKHBhZ2VOdW1iZXIpXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9IFRcbiAgICogQHRoaXMge1R9XG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIE51bWJlciBvZiByZWNvcmRzIHBlciBwYWdlLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5kZWZhdWx0PFQ+fSAtIFF1ZXJ5IHdpdGggcGFnZSBzaXplLlxuICAgKi9cbiAgc3RhdGljIHBlclBhZ2UodmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeSgpLnBlclBhZ2UodmFsdWUpXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9IFRcbiAgICogQHRoaXMge1R9XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IC0gTnVtYmVyIG9mIGxvYWRlZCBtb2RlbCBpbnN0YW5jZXMuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgY291bnQoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucXVlcnkoKS5jb3VudCgpXG4gIH1cblxuICAvKipcbiAgICogQ2xhc3MtbGV2ZWwgaG9vayBmaXJlZCB3aGVuIGFueSByZWNvcmQgb2YgdGhpcyBtb2RlbCBpcyBjcmVhdGVkLlxuICAgKiBTdWJzY3JpYmUtdGltZSBhdXRob3JpemF0aW9uIG9ubHkg4oCUIG9uY2UgYSBzdWJzY3JpcHRpb24gaXNcbiAgICogYWNjZXB0ZWQsIGZ1dHVyZSBgY3JlYXRlYCBldmVudHMgZm9yIHRoaXMgbW9kZWwgYXJlIGRlbGl2ZXJlZFxuICAgKiB3aXRob3V0IHJlLWNoZWNraW5nIHBlci1yZWNvcmQgdmlzaWJpbGl0eS4gUXVlcnkgb3B0aW9ucyBjYW4gc3RpbGxcbiAgICogbmFycm93IHdoaWNoIGV2ZW50cyByZWFjaCB0aGlzIGNhbGxiYWNrLlxuICAgKiBAdGhpcyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfVxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiB7aWQ6IHN0cmluZywgbW9kZWw6IEluc3RhbmNlVHlwZTx0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2U+fSkgPT4gdm9pZH0gY2FsbGJhY2sgLSBFdmVudCBjYWxsYmFjay5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxFdmVudE9wdGlvbnN9IFtvcHRpb25zXSAtIEV2ZW50IHF1ZXJ5IG9yIHJlY29yZCBwcm9qZWN0aW9uIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPCgpID0+IHZvaWQ+fSAtIFVuc3Vic2NyaWJlIGNhbGxiYWNrLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIG9uQ3JlYXRlKGNhbGxiYWNrLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBzdWIgPSBlbnN1cmVGcm9udGVuZE1vZGVsRXZlbnRTdWJzY3JpcHRpb24odGhpcylcbiAgICBjb25zdCBlbnRyeSA9IHtjYWxsYmFjaywgLi4uZnJvbnRlbmRNb2RlbEV2ZW50T3B0aW9uc1BheWxvYWQodGhpcywgb3B0aW9ucyl9XG5cbiAgICBzdWIuY2xhc3NDcmVhdGVDYWxsYmFja3MuYWRkKGVudHJ5KVxuICAgIGF3YWl0IHN1Yi5lbnN1cmVTdWJzY3JpYmVkKClcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBzdWIuY2xhc3NDcmVhdGVDYWxsYmFja3MuZGVsZXRlKGVudHJ5KVxuICAgICAgc3ViLm1heWJlVGVhcmRvd24oKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGFzcy1sZXZlbCBob29rIGZpcmVkIHdoZW4gYW55IHJlY29yZCBvZiB0aGlzIG1vZGVsIGlzIHVwZGF0ZWQuXG4gICAqIEB0aGlzIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9XG4gICAqIEBwYXJhbSB7KHBheWxvYWQ6IHtpZDogc3RyaW5nLCBtb2RlbDogSW5zdGFuY2VUeXBlPHR5cGVvZiBGcm9udGVuZE1vZGVsQmFzZT59KSA9PiB2b2lkfSBjYWxsYmFjayAtIEV2ZW50IGNhbGxiYWNrLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbEV2ZW50T3B0aW9uc30gW29wdGlvbnNdIC0gRXZlbnQgcXVlcnkgb3IgcmVjb3JkIHByb2plY3Rpb24gb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8KCkgPT4gdm9pZD59IC0gVW5zdWJzY3JpYmUgY2FsbGJhY2suXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgb25VcGRhdGUoY2FsbGJhY2ssIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHN1YiA9IGVuc3VyZUZyb250ZW5kTW9kZWxFdmVudFN1YnNjcmlwdGlvbih0aGlzKVxuICAgIGNvbnN0IGVudHJ5ID0ge2NhbGxiYWNrLCAuLi5mcm9udGVuZE1vZGVsRXZlbnRPcHRpb25zUGF5bG9hZCh0aGlzLCBvcHRpb25zKX1cblxuICAgIHN1Yi5jbGFzc1VwZGF0ZUNhbGxiYWNrcy5hZGQoZW50cnkpXG4gICAgYXdhaXQgc3ViLmVuc3VyZVN1YnNjcmliZWQoKVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHN1Yi5jbGFzc1VwZGF0ZUNhbGxiYWNrcy5kZWxldGUoZW50cnkpXG4gICAgICBzdWIubWF5YmVUZWFyZG93bigpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsYXNzLWxldmVsIGhvb2sgZmlyZWQgd2hlbiBhbnkgcmVjb3JkIG9mIHRoaXMgbW9kZWwgaXMgZGVzdHJveWVkLlxuICAgKiBAdGhpcyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfVxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiB7aWQ6IHN0cmluZ30pID0+IHZvaWR9IGNhbGxiYWNrIC0gRXZlbnQgY2FsbGJhY2suXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsRXZlbnRPcHRpb25zfSBbb3B0aW9uc10gLSBBY2NlcHRlZCBmb3IgQVBJIHN5bW1ldHJ5OyBkZXN0cm95IGV2ZW50cyBjYXJyeSBpZHMgb25seS5cbiAgICogQHJldHVybnMge1Byb21pc2U8KCkgPT4gdm9pZD59IC0gVW5zdWJzY3JpYmUgY2FsbGJhY2suXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgb25EZXN0cm95KGNhbGxiYWNrLCBvcHRpb25zID0ge30pIHtcbiAgICBhc3NlcnROb0Rlc3Ryb3lFdmVudEZpbHRlcih0aGlzLCBvcHRpb25zKVxuXG4gICAgY29uc3Qgc3ViID0gZW5zdXJlRnJvbnRlbmRNb2RlbEV2ZW50U3Vic2NyaXB0aW9uKHRoaXMpXG4gICAgY29uc3QgZW50cnkgPSB7Y2FsbGJhY2t9XG5cbiAgICBzdWIuY2xhc3NEZXN0cm95Q2FsbGJhY2tzLmFkZChlbnRyeSlcbiAgICBhd2FpdCBzdWIuZW5zdXJlU3Vic2NyaWJlZCgpXG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgc3ViLmNsYXNzRGVzdHJveUNhbGxiYWNrcy5kZWxldGUoZW50cnkpXG4gICAgICBzdWIubWF5YmVUZWFyZG93bigpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbmNlLWxldmVsIGhvb2sgZmlyZWQgd2hlbiBUSElTIHJlY29yZCBpcyB1cGRhdGVkLiBUaGVcbiAgICogaW5zdGFuY2UncyBhdHRyaWJ1dGVzIGFyZSBhdXRvLW1lcmdlZCB3aXRoIHRoZSBicm9hZGNhc3QgcGF5bG9hZFxuICAgKiBiZWZvcmUgdGhlIGNhbGxiYWNrIHJ1bnMsIHNvIGNhbGxlcnMgY2FuIHJlYWQgZnJlc2ggdmFsdWVzIHZpYVxuICAgKiBgdGhpcy5zb21lQXR0cigpYCB3aXRob3V0IHJlLWZldGNoaW5nLlxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiB7aWQ6IHN0cmluZywgbW9kZWw6IEluc3RhbmNlVHlwZTx0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2U+fSkgPT4gdm9pZH0gY2FsbGJhY2sgLSBFdmVudCBjYWxsYmFjay5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxFdmVudE9wdGlvbnN9IFtvcHRpb25zXSAtIEV2ZW50IHF1ZXJ5IG9yIHJlY29yZCBwcm9qZWN0aW9uIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPCgpID0+IHZvaWQ+fSAtIFVuc3Vic2NyaWJlIGNhbGxiYWNrLlxuICAgKi9cbiAgYXN5bmMgb25VcGRhdGUoY2FsbGJhY2ssIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHNlbGYgPSAvKiogQHR5cGUge2FueX0gKi8gKHRoaXMpXG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSAqLyAodGhpcy5jb25zdHJ1Y3RvcilcbiAgICBjb25zdCBzdWIgPSBlbnN1cmVGcm9udGVuZE1vZGVsRXZlbnRTdWJzY3JpcHRpb24oTW9kZWxDbGFzcylcbiAgICBjb25zdCBpZCA9IFN0cmluZyhzZWxmLmlkKCkpXG4gICAgY29uc3QgZW50cnkgPSB7Y2FsbGJhY2ssIC4uLmZyb250ZW5kTW9kZWxFdmVudE9wdGlvbnNQYXlsb2FkKE1vZGVsQ2xhc3MsIG9wdGlvbnMpfVxuICAgIGxldCBsaXN0ZW5lciA9IHN1Yi5pbnN0YW5jZUxpc3RlbmVycy5nZXQoaWQpXG5cbiAgICBpZiAoIWxpc3RlbmVyKSB7XG4gICAgICBsaXN0ZW5lciA9IHtpbnN0YW5jZTogdGhpcywgdXBkYXRlQ2FsbGJhY2tzOiBuZXcgU2V0KCksIGRlc3Ryb3lDYWxsYmFja3M6IG5ldyBTZXQoKX1cbiAgICAgIHN1Yi5pbnN0YW5jZUxpc3RlbmVycy5zZXQoaWQsIGxpc3RlbmVyKVxuICAgIH0gZWxzZSB7XG4gICAgICBsaXN0ZW5lci5pbnN0YW5jZSA9IHRoaXNcbiAgICB9XG5cbiAgICBsaXN0ZW5lci51cGRhdGVDYWxsYmFja3MuYWRkKGVudHJ5KVxuICAgIGF3YWl0IHN1Yi5lbnN1cmVTdWJzY3JpYmVkKClcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gc3ViLmluc3RhbmNlTGlzdGVuZXJzLmdldChpZClcblxuICAgICAgaWYgKCFjdXJyZW50KSByZXR1cm5cbiAgICAgIGN1cnJlbnQudXBkYXRlQ2FsbGJhY2tzLmRlbGV0ZShlbnRyeSlcblxuICAgICAgaWYgKGN1cnJlbnQudXBkYXRlQ2FsbGJhY2tzLnNpemUgPT09IDAgJiYgY3VycmVudC5kZXN0cm95Q2FsbGJhY2tzLnNpemUgPT09IDApIHtcbiAgICAgICAgc3ViLmluc3RhbmNlTGlzdGVuZXJzLmRlbGV0ZShpZClcbiAgICAgIH1cbiAgICAgIHN1Yi5tYXliZVRlYXJkb3duKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFuY2UtbGV2ZWwgaG9vayBmaXJlZCB3aGVuIFRISVMgcmVjb3JkIGlzIGRlc3Ryb3llZC5cbiAgICogQHBhcmFtIHsocGF5bG9hZDoge2lkOiBzdHJpbmd9KSA9PiB2b2lkfSBjYWxsYmFjayAtIEV2ZW50IGNhbGxiYWNrLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbEV2ZW50T3B0aW9uc30gW29wdGlvbnNdIC0gQWNjZXB0ZWQgZm9yIEFQSSBzeW1tZXRyeTsgZGVzdHJveSBldmVudHMgY2FycnkgaWRzIG9ubHkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPCgpID0+IHZvaWQ+fSAtIFVuc3Vic2NyaWJlIGNhbGxiYWNrLlxuICAgKi9cbiAgYXN5bmMgb25EZXN0cm95KGNhbGxiYWNrLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBzZWxmID0gLyoqIEB0eXBlIHthbnl9ICovICh0aGlzKVxuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gKi8gKHRoaXMuY29uc3RydWN0b3IpXG5cbiAgICBhc3NlcnROb0Rlc3Ryb3lFdmVudEZpbHRlcihNb2RlbENsYXNzLCBvcHRpb25zKVxuXG4gICAgY29uc3Qgc3ViID0gZW5zdXJlRnJvbnRlbmRNb2RlbEV2ZW50U3Vic2NyaXB0aW9uKE1vZGVsQ2xhc3MpXG4gICAgY29uc3QgaWQgPSBTdHJpbmcoc2VsZi5pZCgpKVxuICAgIGNvbnN0IGVudHJ5ID0ge2NhbGxiYWNrfVxuICAgIGxldCBsaXN0ZW5lciA9IHN1Yi5pbnN0YW5jZUxpc3RlbmVycy5nZXQoaWQpXG5cbiAgICBpZiAoIWxpc3RlbmVyKSB7XG4gICAgICBsaXN0ZW5lciA9IHtpbnN0YW5jZTogdGhpcywgdXBkYXRlQ2FsbGJhY2tzOiBuZXcgU2V0KCksIGRlc3Ryb3lDYWxsYmFja3M6IG5ldyBTZXQoKX1cbiAgICAgIHN1Yi5pbnN0YW5jZUxpc3RlbmVycy5zZXQoaWQsIGxpc3RlbmVyKVxuICAgIH0gZWxzZSB7XG4gICAgICBsaXN0ZW5lci5pbnN0YW5jZSA9IHRoaXNcbiAgICB9XG5cbiAgICBsaXN0ZW5lci5kZXN0cm95Q2FsbGJhY2tzLmFkZChlbnRyeSlcbiAgICBhd2FpdCBzdWIuZW5zdXJlU3Vic2NyaWJlZCgpXG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudCA9IHN1Yi5pbnN0YW5jZUxpc3RlbmVycy5nZXQoaWQpXG5cbiAgICAgIGlmICghY3VycmVudCkgcmV0dXJuXG4gICAgICBjdXJyZW50LmRlc3Ryb3lDYWxsYmFja3MuZGVsZXRlKGVudHJ5KVxuXG4gICAgICBpZiAoY3VycmVudC51cGRhdGVDYWxsYmFja3Muc2l6ZSA9PT0gMCAmJiBjdXJyZW50LmRlc3Ryb3lDYWxsYmFja3Muc2l6ZSA9PT0gMCkge1xuICAgICAgICBzdWIuaW5zdGFuY2VMaXN0ZW5lcnMuZGVsZXRlKGlkKVxuICAgICAgfVxuICAgICAgc3ViLm1heWJlVGVhcmRvd24oKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gVFxuICAgKiBAdGhpcyB7VH1cbiAgICogQHBhcmFtIHsuLi4oc3RyaW5nIHwgc3RyaW5nW10gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgQXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4pfSBjb2x1bW5zIC0gUGx1Y2sgZGVmaW5pdGlvbihzKS5cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55W10+fSAtIFBsdWNrZWQgdmFsdWVzLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHBsdWNrKC4uLmNvbHVtbnMpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5xdWVyeSgpLnBsdWNrKC4uLmNvbHVtbnMpXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9IFRcbiAgICogQHRoaXMge1R9XG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGggLSBSZWxhdGlvbnNoaXAgcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbHVtbiAtIENvbHVtbiBvciBhdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHtcImVxXCIgfCBcImxpa2VcIiB8IFwibm90RXFcIiB8IFwiZ3RcIiB8IFwiZ3RlcVwiIHwgXCJsdFwiIHwgXCJsdGVxXCIgfCBcIj5cIiB8IFwiPj1cIiB8IFwiPFwiIHwgXCI8PVwifSBvcGVyYXRvciAtIFNlYXJjaCBvcGVyYXRvci5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIC0gU2VhcmNoIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbFF1ZXJ5PFQ+fSAtIFF1ZXJ5IGJ1aWxkZXIgd2l0aCBzZWFyY2ggZmlsdGVyLlxuICAgKi9cbiAgc3RhdGljIHNlYXJjaChwYXRoLCBjb2x1bW4sIG9wZXJhdG9yLCB2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5KCkuc2VhcmNoKHBhdGgsIGNvbHVtbiwgb3BlcmF0b3IsIHZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHBhcmFtcyAtIFJhbnNhY2stc3R5bGUgcGFyYW1zIGhhc2guXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsUXVlcnk8VD59IC0gUXVlcnkgYnVpbGRlciB3aXRoIFJhbnNhY2sgZmlsdGVycyBhcHBsaWVkLlxuICAgKi9cbiAgc3RhdGljIHJhbnNhY2socGFyYW1zKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnkoKS5yYW5zYWNrKHBhcmFtcylcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gVFxuICAgKiBAdGhpcyB7VH1cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXSB8IFtzdHJpbmcsIHN0cmluZ10gfCBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiB8IFJlY29yZDxzdHJpbmcsIGFueT4gfCBBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gc29ydCAtIFNvcnQgZGVmaW5pdGlvbihzKS5cbiAgICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxRdWVyeTxUPn0gLSBRdWVyeSBidWlsZGVyIHdpdGggc29ydCBkZWZpbml0aW9ucy5cbiAgICovXG4gIHN0YXRpYyBzb3J0KHNvcnQpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeSgpLnNvcnQoc29ydClcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gVFxuICAgKiBAdGhpcyB7VH1cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXSB8IFtzdHJpbmcsIHN0cmluZ10gfCBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiB8IFJlY29yZDxzdHJpbmcsIGFueT4gfCBBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gc29ydCAtIFNvcnQgZGVmaW5pdGlvbihzKS5cbiAgICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxRdWVyeTxUPn0gLSBRdWVyeSBidWlsZGVyIHdpdGggc29ydCBkZWZpbml0aW9ucy5cbiAgICovXG4gIHN0YXRpYyBvcmRlcihzb3J0KSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnkoKS5vcmRlcihzb3J0KVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHN0cmluZ1tdIHwgUmVjb3JkPHN0cmluZywgYW55PiB8IEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+fSBncm91cCAtIEdyb3VwIGRlZmluaXRpb24ocykuXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsUXVlcnk8VD59IC0gUXVlcnkgYnVpbGRlciB3aXRoIGdyb3VwIGRlZmluaXRpb25zLlxuICAgKi9cbiAgc3RhdGljIGdyb3VwKGdyb3VwKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnkoKS5ncm91cChncm91cClcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gVFxuICAgKiBAdGhpcyB7VH1cbiAgICogQHBhcmFtIHtib29sZWFufSBbdmFsdWVdIC0gV2hldGhlciB0byByZXF1ZXN0IGRpc3RpbmN0IHJvd3MuXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsUXVlcnk8VD59IC0gUXVlcnkgYnVpbGRlciB3aXRoIGRpc3RpbmN0IGZsYWcuXG4gICAqL1xuICBzdGF0aWMgZGlzdGluY3QodmFsdWUgPSB0cnVlKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnkoKS5kaXN0aW5jdCh2YWx1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gVFxuICAgKiBAdGhpcyB7VH1cbiAgICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxRdWVyeTxUPn0gLSBRdWVyeSBidWlsZGVyLlxuICAgKi9cbiAgc3RhdGljIHF1ZXJ5KCkge1xuICAgIHJldHVybiAvKiogQHR5cGUge0Zyb250ZW5kTW9kZWxRdWVyeTxUPn0gKi8gKG5ldyBGcm9udGVuZE1vZGVsUXVlcnkoe21vZGVsQ2xhc3M6IHRoaXN9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gVFxuICAgKiBAdGhpcyB7VH1cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9pbmRleC5qc1wiKS5OZXN0ZWRQcmVsb2FkUmVjb3JkIHwgc3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgaW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvaW5kZXguanNcIikuTmVzdGVkUHJlbG9hZFJlY29yZD59IHByZWxvYWQgLSBQcmVsb2FkIGdyYXBoLlxuICAgKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbFF1ZXJ5PFQ+fSAtIFF1ZXJ5IHdpdGggcHJlbG9hZC5cbiAgICovXG4gIHN0YXRpYyBwcmVsb2FkKHByZWxvYWQpIHtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtGcm9udGVuZE1vZGVsUXVlcnk8VD59ICovICh0aGlzLnF1ZXJ5KCkucHJlbG9hZChwcmVsb2FkKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gVFxuICAgKiBAdGhpcyB7VH1cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXSB8IHN0cmluZz59IHNlbGVjdCAtIE1vZGVsLWF3YXJlIGF0dHJpYnV0ZSBzZWxlY3QgbWFwLlxuICAgKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbFF1ZXJ5PFQ+fSAtIFF1ZXJ5IHdpdGggc2VsZWN0ZWQgYXR0cmlidXRlcy5cbiAgICovXG4gIHN0YXRpYyBzZWxlY3Qoc2VsZWN0KSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7RnJvbnRlbmRNb2RlbFF1ZXJ5PFQ+fSAqLyAodGhpcy5xdWVyeSgpLnNlbGVjdChzZWxlY3QpKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdIHwgc3RyaW5nPiB8IHN0cmluZyB8IHN0cmluZ1tdfSBzZWxlY3QgLSBFeHRyYSBhdHRyaWJ1dGVzIHRvIGxvYWQgaW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHRzLCBrZXllZCBieSBtb2RlbCBuYW1lIG9yIHJvb3QtbW9kZWwgc2hvcnRoYW5kLlxuICAgKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbFF1ZXJ5PFQ+fSAtIFF1ZXJ5IHdpdGggZXh0cmEgc2VsZWN0ZWQgYXR0cmlidXRlcy5cbiAgICovXG4gIHN0YXRpYyBzZWxlY3RzRXh0cmEoc2VsZWN0KSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7RnJvbnRlbmRNb2RlbFF1ZXJ5PFQ+fSAqLyAodGhpcy5xdWVyeSgpLnNlbGVjdHNFeHRyYShzZWxlY3QpKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxJbnN0YW5jZVR5cGU8VD4gfCBudWxsPn0gLSBGaXJzdCBtb2RlbCBvciBudWxsLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGZpcnN0KCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnF1ZXJ5KCkuZmlyc3QoKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxJbnN0YW5jZVR5cGU8VD4gfCBudWxsPn0gLSBMYXN0IG1vZGVsIG9yIG51bGwuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgbGFzdCgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5xdWVyeSgpLmxhc3QoKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmRpdGlvbnMgLSBBdHRyaWJ1dGUgbWF0Y2ggY29uZGl0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8SW5zdGFuY2VUeXBlPFQ+Pn0gLSBFeGlzdGluZyBvciBpbml0aWFsaXplZCBtb2RlbC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBmaW5kT3JJbml0aWFsaXplQnkoY29uZGl0aW9ucykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnF1ZXJ5KCkuZmluZE9ySW5pdGlhbGl6ZUJ5KGNvbmRpdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9IFRcbiAgICogQHRoaXMge1R9XG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gY29uZGl0aW9ucyAtIEF0dHJpYnV0ZSBtYXRjaCBjb25kaXRpb25zLlxuICAgKiBAcGFyYW0geyhtb2RlbDogSW5zdGFuY2VUeXBlPFQ+KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZH0gW2NhbGxiYWNrXSAtIE9wdGlvbmFsIGNhbGxiYWNrIGJlZm9yZSBzYXZlIHdoZW4gY3JlYXRlZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8SW5zdGFuY2VUeXBlPFQ+Pn0gLSBFeGlzdGluZyBvciBuZXdseSBjcmVhdGVkIG1vZGVsLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGZpbmRPckNyZWF0ZUJ5KGNvbmRpdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucXVlcnkoKS5maW5kT3JDcmVhdGVCeShjb25kaXRpb25zLCBjYWxsYmFjaylcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gVFxuICAgKiBAdGhpcyB7VH1cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbYXR0cmlidXRlc10gLSBJbml0aWFsIGF0dHJpYnV0ZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEluc3RhbmNlVHlwZTxUPj59IC0gUGVyc2lzdGVkIG1vZGVsLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGNyZWF0ZShhdHRyaWJ1dGVzID0ge30pIHtcbiAgICBjb25zdCBtb2RlbCA9IC8qKiBAdHlwZSB7SW5zdGFuY2VUeXBlPFQ+fSAqLyAobmV3IHRoaXMoYXR0cmlidXRlcykpXG5cbiAgICBhd2FpdCBtb2RlbC5zYXZlKClcblxuICAgIHJldHVybiBtb2RlbFxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9XG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gY29uZGl0aW9ucyAtIGZpbmRCeSBjb25kaXRpb25zLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBhc3NlcnRGaW5kQnlDb25kaXRpb25zKGNvbmRpdGlvbnMpIHtcbiAgICBhc3NlcnRGaW5kQnlDb25kaXRpb25zU2hhcGUoY29uZGl0aW9ucylcbiAgICBjb25zdCBub3JtYWxpemVkQ29uZGl0aW9ucyA9IG5vcm1hbGl6ZUZpbmRDb25kaXRpb25zKGNvbmRpdGlvbnMpXG5cbiAgICBPYmplY3Qua2V5cyhjb25kaXRpb25zKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGFzc2VydERlZmluZWRGaW5kQnlDb25kaXRpb25WYWx1ZShjb25kaXRpb25zW2tleV0sIGtleSlcbiAgICAgIGFzc2VydEZpbmRCeUNvbmRpdGlvblNlcmlhbGl6YXRpb25QcmVzZXJ2ZXNWYWx1ZShjb25kaXRpb25zW2tleV0sIG5vcm1hbGl6ZWRDb25kaXRpb25zW2tleV0sIGtleSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9XG4gICAqIEBwYXJhbSB7RnJvbnRlbmRNb2RlbEJhc2V9IG1vZGVsIC0gQ2FuZGlkYXRlIG1vZGVsLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmRpdGlvbnMgLSBNYXRjaCBjb25kaXRpb25zLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBtb2RlbCBtYXRjaGVzIGFsbCBjb25kaXRpb25zLlxuICAgKi9cbiAgc3RhdGljIG1hdGNoZXNGaW5kQnlDb25kaXRpb25zKG1vZGVsLCBjb25kaXRpb25zKSB7XG4gICAgY29uc3QgbW9kZWxBdHRyaWJ1dGVzID0gbW9kZWwuYXR0cmlidXRlcygpXG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjb25kaXRpb25zKSkge1xuICAgICAgY29uc3QgZXhwZWN0ZWRWYWx1ZSA9IGNvbmRpdGlvbnNba2V5XVxuICAgICAgY29uc3QgYWN0dWFsVmFsdWUgPSBtb2RlbEF0dHJpYnV0ZXNba2V5XVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShleHBlY3RlZFZhbHVlKSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhY3R1YWxWYWx1ZSkpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuZmluZEJ5Q29uZGl0aW9uVmFsdWVNYXRjaGVzKGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCFleHBlY3RlZFZhbHVlLnNvbWUoKGVudHJ5KSA9PiB0aGlzLmZpbmRCeUNvbmRpdGlvblZhbHVlTWF0Y2hlcyhhY3R1YWxWYWx1ZSwgZW50cnkpKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLmZpbmRCeUNvbmRpdGlvblZhbHVlTWF0Y2hlcyhhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfVxuICAgKiBAcGFyYW0ge3Vua25vd259IGFjdHVhbFZhbHVlIC0gQWN0dWFsIG1vZGVsIHZhbHVlLlxuICAgKiBAcGFyYW0ge3Vua25vd259IGV4cGVjdGVkVmFsdWUgLSBFeHBlY3RlZCBmaW5kIGNvbmRpdGlvbiB2YWx1ZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB2YWx1ZXMgbWF0Y2guXG4gICAqL1xuICBzdGF0aWMgZmluZEJ5Q29uZGl0aW9uVmFsdWVNYXRjaGVzKGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKSB7XG4gICAgaWYgKGV4cGVjdGVkVmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBhY3R1YWxWYWx1ZSA9PT0gbnVsbFxuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGV4cGVjdGVkVmFsdWUpKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYWN0dWFsVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICBpZiAoYWN0dWFsVmFsdWUubGVuZ3RoICE9PSBleHBlY3RlZFZhbHVlLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGV4cGVjdGVkVmFsdWUubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgIGlmICghdGhpcy5maW5kQnlDb25kaXRpb25WYWx1ZU1hdGNoZXMoYWN0dWFsVmFsdWVbaW5kZXhdLCBleHBlY3RlZFZhbHVlW2luZGV4XSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGlmIChleHBlY3RlZFZhbHVlICYmIHR5cGVvZiBleHBlY3RlZFZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBpZiAoIWFjdHVhbFZhbHVlIHx8IHR5cGVvZiBhY3R1YWxWYWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGFjdHVhbFZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgY29uc3QgYWN0dWFsT2JqZWN0ID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKGFjdHVhbFZhbHVlKVxuICAgICAgY29uc3QgZXhwZWN0ZWRPYmplY3QgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAoZXhwZWN0ZWRWYWx1ZSlcbiAgICAgIGNvbnN0IGFjdHVhbEtleXMgPSBPYmplY3Qua2V5cyhhY3R1YWxPYmplY3QpXG4gICAgICBjb25zdCBleHBlY3RlZEtleXMgPSBPYmplY3Qua2V5cyhleHBlY3RlZE9iamVjdClcblxuICAgICAgaWYgKGFjdHVhbEtleXMubGVuZ3RoICE9PSBleHBlY3RlZEtleXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBleHBlY3RlZEtleXMpIHtcbiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYWN0dWFsT2JqZWN0LCBrZXkpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZmluZEJ5Q29uZGl0aW9uVmFsdWVNYXRjaGVzKGFjdHVhbE9iamVjdFtrZXldLCBleHBlY3RlZE9iamVjdFtrZXldKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgaWYgKGFjdHVhbFZhbHVlID09PSBleHBlY3RlZFZhbHVlKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmZpbmRCeVByaW1pdGl2ZVZhbHVlc01hdGNoKGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9XG4gICAqIEBwYXJhbSB7dW5rbm93bn0gYWN0dWFsVmFsdWUgLSBBY3R1YWwgbW9kZWwgdmFsdWUuXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gZXhwZWN0ZWRWYWx1ZSAtIEV4cGVjdGVkIGZpbmQgY29uZGl0aW9uIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHByaW1pdGl2ZSB2YWx1ZXMgbWF0Y2ggYWZ0ZXIgc2FmZSBjb2VyY2lvbi5cbiAgICovXG4gIHN0YXRpYyBmaW5kQnlQcmltaXRpdmVWYWx1ZXNNYXRjaChhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSkge1xuICAgIGlmIChhY3R1YWxWYWx1ZSBpbnN0YW5jZW9mIERhdGUgJiYgdHlwZW9mIGV4cGVjdGVkVmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBhY3R1YWxWYWx1ZS50b0lTT1N0cmluZygpID09PSBleHBlY3RlZFZhbHVlXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBhY3R1YWxWYWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiBleHBlY3RlZFZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgcmV0dXJuIGFjdHVhbFZhbHVlID09PSBleHBlY3RlZFZhbHVlLnRvSVNPU3RyaW5nKClcbiAgICB9XG5cbiAgICBpZiAoYWN0dWFsVmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmIGV4cGVjdGVkVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICByZXR1cm4gYWN0dWFsVmFsdWUudG9JU09TdHJpbmcoKSA9PT0gZXhwZWN0ZWRWYWx1ZS50b0lTT1N0cmluZygpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBhY3R1YWxWYWx1ZSA9PT0gXCJudW1iZXJcIiAmJiB0eXBlb2YgZXhwZWN0ZWRWYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHRoaXMuZmluZEJ5TnVtZXJpY1N0cmluZ01hdGNoZXNOdW1iZXIoZXhwZWN0ZWRWYWx1ZSwgYWN0dWFsVmFsdWUpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBhY3R1YWxWYWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgZXhwZWN0ZWRWYWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgcmV0dXJuIHRoaXMuZmluZEJ5TnVtZXJpY1N0cmluZ01hdGNoZXNOdW1iZXIoYWN0dWFsVmFsdWUsIGV4cGVjdGVkVmFsdWUpXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHBhcmFtIHtzdHJpbmd9IG51bWVyaWNTdHJpbmcgLSBOdW1lcmljIHN0cmluZyB2YWx1ZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGV4cGVjdGVkTnVtYmVyIC0gTnVtYmVyIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHZhbHVlcyByZXByZXNlbnQgdGhlIHNhbWUgbnVtYmVyLlxuICAgKi9cbiAgc3RhdGljIGZpbmRCeU51bWVyaWNTdHJpbmdNYXRjaGVzTnVtYmVyKG51bWVyaWNTdHJpbmcsIGV4cGVjdGVkTnVtYmVyKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoZXhwZWN0ZWROdW1iZXIpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoIS9eLT9cXGQrKD86XFwuXFxkKyk/JC8udGVzdChudW1lcmljU3RyaW5nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIE51bWJlcihudW1lcmljU3RyaW5nKSA9PT0gZXhwZWN0ZWROdW1iZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtuZXdBdHRyaWJ1dGVzXSAtIE5ldyB2YWx1ZXMgdG8gYXNzaWduIGJlZm9yZSB1cGRhdGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHRoaXM+fSAtIFVwZGF0ZWQgbW9kZWwuXG4gICAqL1xuICBhc3luYyB1cGRhdGUobmV3QXR0cmlidXRlcyA9IHt9KSB7XG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSAqLyAodGhpcy5jb25zdHJ1Y3RvcilcbiAgICBjb25zdCBhdHRhY2htZW50RGVmaW5pdGlvbnMgPSBNb2RlbENsYXNzLmF0dGFjaG1lbnREZWZpbml0aW9ucygpXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgIGNvbnN0IHJlZ3VsYXJBdHRyaWJ1dGVzID0ge31cbiAgICAvKiogQHR5cGUge0FycmF5PHthdHRhY2htZW50TmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bn0+fSAqL1xuICAgIGNvbnN0IHBlbmRpbmdBdHRhY2htZW50cyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IFthdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobmV3QXR0cmlidXRlcykpIHtcbiAgICAgIGlmIChhdHRhY2htZW50RGVmaW5pdGlvbnNbYXR0cmlidXRlTmFtZV0pIHtcbiAgICAgICAgaWYgKGF0dHJpYnV0ZVZhbHVlICE9PSB1bmRlZmluZWQgJiYgYXR0cmlidXRlVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICBwZW5kaW5nQXR0YWNobWVudHMucHVzaCh7YXR0YWNobWVudE5hbWU6IGF0dHJpYnV0ZU5hbWUsIHZhbHVlOiBhdHRyaWJ1dGVWYWx1ZX0pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlZ3VsYXJBdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdID0gYXR0cmlidXRlVmFsdWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXMocmVndWxhckF0dHJpYnV0ZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuYXNzaWduQXR0cmlidXRlcyhyZWd1bGFyQXR0cmlidXRlcylcbiAgICAgIGNvbnN0IGNoYW5nZWRBdHRyaWJ1dGVzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLmNoYW5nZXMoKSkubWFwKChbYXR0cmlidXRlTmFtZSwgWywgY3VycmVudFZhbHVlXV0pID0+IFthdHRyaWJ1dGVOYW1lLCBjdXJyZW50VmFsdWVdKVxuICAgICAgKVxuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IE1vZGVsQ2xhc3MuZXhlY3V0ZUNvbW1hbmQoXCJ1cGRhdGVcIiwge1xuICAgICAgICBhdHRyaWJ1dGVzOiBjaGFuZ2VkQXR0cmlidXRlcyxcbiAgICAgICAgaWQ6IHRoaXMucHJpbWFyeUtleVZhbHVlKClcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMuYXNzaWduQXR0cmlidXRlcyhNb2RlbENsYXNzLmF0dHJpYnV0ZXNGcm9tUmVzcG9uc2UocmVzcG9uc2UpKVxuICAgICAgdGhpcy5zZXRJc05ld1JlY29yZChmYWxzZSlcbiAgICAgIHRoaXMuX3BlcnNpc3RlZEF0dHJpYnV0ZXMgPSBjbG9uZUZyb250ZW5kTW9kZWxBdHRyaWJ1dGVzKHRoaXMuYXR0cmlidXRlcygpKVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgcGVuZGluZ0F0dGFjaG1lbnQgb2YgcGVuZGluZ0F0dGFjaG1lbnRzKSB7XG4gICAgICBhd2FpdCB0aGlzLmdldEF0dGFjaG1lbnRCeU5hbWUocGVuZGluZ0F0dGFjaG1lbnQuYXR0YWNobWVudE5hbWUpLmF0dGFjaChwZW5kaW5nQXR0YWNobWVudC52YWx1ZSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gYXR0YWNobWVudElucHV0IC0gQXR0YWNobWVudCBpbnB1dCBvciBuYW1lZCBhdHRhY2htZW50IHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gYXR0YWNoZWQuXG4gICAqL1xuICBhc3luYyBhdHRhY2goYXR0YWNobWVudElucHV0KSB7XG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSAqLyAodGhpcy5jb25zdHJ1Y3RvcilcbiAgICBjb25zdCBhdHRhY2htZW50RGVmaW5pdGlvbnMgPSBNb2RlbENsYXNzLmF0dGFjaG1lbnREZWZpbml0aW9ucygpXG4gICAgY29uc3QgYXR0YWNobWVudE5hbWVzID0gT2JqZWN0LmtleXMoYXR0YWNobWVudERlZmluaXRpb25zKVxuICAgIGxldCBhdHRhY2htZW50TmFtZSA9IGF0dGFjaG1lbnROYW1lc1swXVxuICAgIGxldCBhY3R1YWxBdHRhY2htZW50SW5wdXQgPSBhdHRhY2htZW50SW5wdXRcblxuICAgIGlmIChmcm9udGVuZEF0dGFjaG1lbnRWYWx1ZUlzUGxhaW5PYmplY3QoYXR0YWNobWVudElucHV0KSkge1xuICAgICAgaWYgKFwiZmlsZVwiIGluIGF0dGFjaG1lbnRJbnB1dCAmJiBhdHRhY2htZW50RGVmaW5pdGlvbnMuZmlsZSkge1xuICAgICAgICBhdHRhY2htZW50TmFtZSA9IFwiZmlsZVwiXG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgY2FuZGlkYXRlTmFtZSBvZiBhdHRhY2htZW50TmFtZXMpIHtcbiAgICAgICAgaWYgKGNhbmRpZGF0ZU5hbWUgaW4gYXR0YWNobWVudElucHV0KSB7XG4gICAgICAgICAgYXR0YWNobWVudE5hbWUgPSBjYW5kaWRhdGVOYW1lXG4gICAgICAgICAgYWN0dWFsQXR0YWNobWVudElucHV0ID0gYXR0YWNobWVudElucHV0W2NhbmRpZGF0ZU5hbWVdXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghYXR0YWNobWVudE5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gYXR0YWNobWVudCBkZWZpbml0aW9ucyBvbiAke01vZGVsQ2xhc3MubmFtZX1gKVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuZ2V0QXR0YWNobWVudEJ5TmFtZShhdHRhY2htZW50TmFtZSkuYXR0YWNoKGFjdHVhbEF0dGFjaG1lbnRJbnB1dClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx0aGlzPn0gLSBTYXZlZCBtb2RlbC5cbiAgICovXG4gIGFzeW5jIHNhdmUoKSB7XG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSAqLyAodGhpcy5jb25zdHJ1Y3RvcilcbiAgICBjb25zdCBpc05ldyA9IHRoaXMuaXNOZXdSZWNvcmQoKVxuICAgIGNvbnN0IGNvbW1hbmRUeXBlID0gaXNOZXcgPyBcImNyZWF0ZVwiIDogXCJ1cGRhdGVcIlxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgLy8gRm9yIGNyZWF0ZXMsIHNlbmQgYWxsIGFzc2lnbmVkIGF0dHJpYnV0ZXMg4oCUIHRoZSB1c2VyLXNldCBoYXNoIHR5cGljYWxseVxuICAgICAgLy8gb25seSBjb250YWlucyB3cml0YWJsZSBmaWVsZHMuIEZvciB1cGRhdGVzLCBzZW5kIG9ubHkgY2hhbmdlZFxuICAgICAgLy8gYXR0cmlidXRlcyBzbyBzZXJ2ZXItc2lkZSBzdHJpY3QgcGVybWl0cyBkb24ndCByZWplY3QgZnJhbWV3b3JrLW1hbmFnZWRcbiAgICAgIC8vIGZpZWxkcyBsaWtlIGBpZGAvYGNyZWF0ZWRBdGAvYHVwZGF0ZWRBdGAgdGhhdCB0aGUgcmVzb3VyY2UgbmV2ZXIgbGlzdHMuXG4gICAgICBhdHRyaWJ1dGVzOiBpc05ldyA/IHRoaXMuYXR0cmlidXRlcygpIDogdGhpcy5fY2hhbmdlZEF0dHJpYnV0ZXNGb3JTYXZlKClcbiAgICB9XG5cbiAgICBpZiAoIWlzTmV3KSB7XG4gICAgICBwYXlsb2FkLmlkID0gdGhpcy5wcmltYXJ5S2V5VmFsdWUoKVxuICAgIH1cblxuICAgIGNvbnN0IG5lc3RlZEF0dHJpYnV0ZXMgPSB0aGlzLl9idWlsZE5lc3RlZEF0dHJpYnV0ZXNQYXlsb2FkKClcblxuICAgIGlmIChuZXN0ZWRBdHRyaWJ1dGVzICYmIE9iamVjdC5rZXlzKG5lc3RlZEF0dHJpYnV0ZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHBheWxvYWQubmVzdGVkQXR0cmlidXRlcyA9IG5lc3RlZEF0dHJpYnV0ZXNcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IE1vZGVsQ2xhc3MuZXhlY3V0ZUNvbW1hbmQoY29tbWFuZFR5cGUsIHBheWxvYWQpXG5cbiAgICB0aGlzLmFzc2lnbkF0dHJpYnV0ZXMoTW9kZWxDbGFzcy5hdHRyaWJ1dGVzRnJvbVJlc3BvbnNlKHJlc3BvbnNlKSlcbiAgICB0aGlzLnNldElzTmV3UmVjb3JkKGZhbHNlKVxuICAgIHRoaXMuX3BlcnNpc3RlZEF0dHJpYnV0ZXMgPSBjbG9uZUZyb250ZW5kTW9kZWxBdHRyaWJ1dGVzKHRoaXMuYXR0cmlidXRlcygpKVxuXG4gICAgdGhpcy5fcmVjb25jaWxlTmVzdGVkQXR0cmlidXRlc0Zyb21SZXNwb25zZShyZXNwb25zZSlcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc3Vic2V0IG9mIGBfYXR0cmlidXRlc2Agd2hvc2UgdmFsdWUgaGFzIGRpdmVyZ2VkIGZyb21cbiAgICogYF9wZXJzaXN0ZWRBdHRyaWJ1dGVzYC4gVXNlZCBieSBgc2F2ZSgpYCBvbiB0aGUgdXBkYXRlIHBhdGggc28gdGhlIHNlcnZlclxuICAgKiByZWNlaXZlcyBvbmx5IHRoZSBmaWVsZHMgdGhlIGNhbGxlciBhY3R1YWxseSBjaGFuZ2VkIOKAlCBhdm9pZGluZyBzdHJpY3RcbiAgICogcGVybWl0IHJlamVjdGlvbnMgb24gZnJhbWV3b3JrLW1hbmFnZWQgZmllbGRzIGxpa2UgYGlkYCwgYGNyZWF0ZWRBdGAsXG4gICAqIGB1cGRhdGVkQXRgIHRoYXQgdGhlIHJlc291cmNlIG5ldmVyIGxpc3RzIGluIGBwZXJtaXR0ZWRQYXJhbXNgLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gLSBDaGFuZ2VkIGF0dHJpYnV0ZXMgaGFzaC5cbiAgICovXG4gIF9jaGFuZ2VkQXR0cmlidXRlc0ZvclNhdmUoKSB7XG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgIGNvbnN0IGNoYW5nZWRBdHRyaWJ1dGVzID0ge31cblxuICAgIGZvciAoY29uc3QgW2F0dHJpYnV0ZU5hbWUsIFssIGN1cnJlbnRWYWx1ZV1dIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuY2hhbmdlcygpKSkge1xuICAgICAgY2hhbmdlZEF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0gPSBjdXJyZW50VmFsdWVcbiAgICB9XG5cbiAgICByZXR1cm4gY2hhbmdlZEF0dHJpYnV0ZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGRlc3Ryb3llZCBvbiBiYWNrZW5kLlxuICAgKi9cbiAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICBjb25zdCBNb2RlbENsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9ICovICh0aGlzLmNvbnN0cnVjdG9yKVxuXG4gICAgYXdhaXQgTW9kZWxDbGFzcy5leGVjdXRlQ29tbWFuZChcImRlc3Ryb3lcIiwge1xuICAgICAgaWQ6IHRoaXMucHJpbWFyeUtleVZhbHVlKClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFdhbGtzIHJlbGF0aW9uc2hpcHMgZGVjbGFyZWQgaW4gdGhpcyByZXNvdXJjZSdzIGBuZXN0ZWRBdHRyaWJ1dGVzYCBjb25maWdcbiAgICogYW5kIGJ1aWxkcyB0aGUgcGVyLXJlbGF0aW9uc2hpcCBwYXlsb2FkIG9mIGRpcnR5IGNoaWxkcmVuIGZvciBhIHBhcmVudCBzYXZlLlxuICAgKlxuICAgKiBJbmNsdWRlZCBjaGlsZHJlbjpcbiAgICogICAtIG5ldyByZWNvcmRzIChpc05ld1JlY29yZCgpKSDihpIgY3JlYXRlIGVudHJ5IHdpdGggYXR0cmlidXRlc1xuICAgKiAgIC0gcmVjb3JkcyBtYXJrZWQgZm9yIGRlc3RydWN0aW9uIChtYXJrZWRGb3JEZXN0cnVjdGlvbigpKSDihpIgZGVzdHJveSBlbnRyeVxuICAgKiAgIC0gcmVjb3JkcyB3aXRoIGNoYW5nZWQgYXR0cmlidXRlcyAoaXNDaGFuZ2VkKCkpIOKGkiB1cGRhdGUgZW50cnkgd2l0aCBhdHRyaWJ1dGVzXG4gICAqICAgLSByZWNvcmRzIHdpdGggZGlydHkgZGVzY2VuZGFudHMgaW4gdGhlaXIgb3duIG5lc3RlZEF0dHJpYnV0ZXMg4oaSIHJlY3Vyc2VcbiAgICpcbiAgICogTG9hZGVkIGJ1dCB1bnRvdWNoZWQgcmVjb3JkcyBhcmUgb21pdHRlZCBzbyBuZXN0ZWQgc2F2ZSBwcmVzZXJ2ZXMgUmFpbHMtc3R5bGVcbiAgICogXCJjaGlsZHJlbiBub3QgcmVmZXJlbmNlZCBpbiBwYXlsb2FkIGFyZSBsZWZ0IGFsb25lXCIgc2VtYW50aWNzLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgQXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+fSAtIFBlci1yZWxhdGlvbnNoaXAgbGlzdCBvZiBuZXN0ZWQtYXR0cmlidXRlIGVudHJpZXMuXG4gICAqL1xuICBfYnVpbGROZXN0ZWRBdHRyaWJ1dGVzUGF5bG9hZCgpIHtcbiAgICBjb25zdCBNb2RlbENsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9ICovICh0aGlzLmNvbnN0cnVjdG9yKVxuICAgIGNvbnN0IHJlc291cmNlQ29uZmlnID0gdHlwZW9mIE1vZGVsQ2xhc3MucmVzb3VyY2VDb25maWcgPT09IFwiZnVuY3Rpb25cIiA/IE1vZGVsQ2xhc3MucmVzb3VyY2VDb25maWcoKSA6IG51bGxcbiAgICBjb25zdCBuZXN0ZWRBdHRyaWJ1dGVzQ29uZmlnID0gcmVzb3VyY2VDb25maWc/Lm5lc3RlZEF0dHJpYnV0ZXNcblxuICAgIGlmICghbmVzdGVkQXR0cmlidXRlc0NvbmZpZykgcmV0dXJuIHt9XG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+Pn0gKi9cbiAgICBjb25zdCBwYXlsb2FkID0ge31cblxuICAgIGZvciAoY29uc3QgcmVsYXRpb25zaGlwTmFtZSBvZiBPYmplY3Qua2V5cyhuZXN0ZWRBdHRyaWJ1dGVzQ29uZmlnKSkge1xuICAgICAgY29uc3QgcmVsYXRpb25zaGlwID0gdGhpcy5fcmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXVxuXG4gICAgICBpZiAoIXJlbGF0aW9uc2hpcCB8fCAhKHJlbGF0aW9uc2hpcCBpbnN0YW5jZW9mIEZyb250ZW5kTW9kZWxIYXNNYW55UmVsYXRpb25zaGlwKSkgY29udGludWVcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShyZWxhdGlvbnNoaXAuX2xvYWRlZFZhbHVlKSB8fCByZWxhdGlvbnNoaXAuX2xvYWRlZFZhbHVlLmxlbmd0aCA9PT0gMCkgY29udGludWVcblxuICAgICAgLyoqIEB0eXBlIHtBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gKi9cbiAgICAgIGNvbnN0IGVudHJpZXMgPSBbXVxuXG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHJlbGF0aW9uc2hpcC5fbG9hZGVkVmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2hpbGRFbnRyeSA9IGNoaWxkLl9uZXN0ZWRBdHRyaWJ1dGVzRW50cnlGb3JQYXJlbnRTYXZlKClcblxuICAgICAgICBpZiAoY2hpbGRFbnRyeSkgZW50cmllcy5wdXNoKGNoaWxkRW50cnkpXG4gICAgICB9XG5cbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcGF5bG9hZFtyZWxhdGlvbnNoaXBOYW1lXSA9IGVudHJpZXNcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGF5bG9hZFxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgcGF5bG9hZCBlbnRyeSBmb3IgdGhpcyBjaGlsZCB3aGVuIHdhbGtlZCBieSBhIHBhcmVudCdzXG4gICAqIGBfYnVpbGROZXN0ZWRBdHRyaWJ1dGVzUGF5bG9hZGAuIFJldHVybnMgYG51bGxgIHdoZW4gdGhlIGNoaWxkIGhhcyBub1xuICAgKiBkaXJ0eSBzdGF0ZSBhbmQgbm8gZGlydHkgZGVzY2VuZGFudHMsIHNvIHRoZSBwYXJlbnQgY2FuIG9taXQgaXQuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbH0gLSBOZXN0ZWQtYXR0cmlidXRlIGVudHJ5IG9yIG51bGwgaWYgY2xlYW4uXG4gICAqL1xuICBfbmVzdGVkQXR0cmlidXRlc0VudHJ5Rm9yUGFyZW50U2F2ZSgpIHtcbiAgICBpZiAodGhpcy5tYXJrZWRGb3JEZXN0cnVjdGlvbigpKSB7XG4gICAgICBpZiAodGhpcy5pc05ld1JlY29yZCgpKSByZXR1cm4gbnVsbFxuICAgICAgcmV0dXJuIHtpZDogdGhpcy5wcmltYXJ5S2V5VmFsdWUoKSwgX2Rlc3Ryb3k6IHRydWV9XG4gICAgfVxuXG4gICAgY29uc3QgbmVzdGVkQXR0cmlidXRlcyA9IHRoaXMuX2J1aWxkTmVzdGVkQXR0cmlidXRlc1BheWxvYWQoKVxuICAgIGNvbnN0IGhhc05lc3RlZERpcnR5ID0gT2JqZWN0LmtleXMobmVzdGVkQXR0cmlidXRlcykubGVuZ3RoID4gMFxuXG4gICAgaWYgKHRoaXMuaXNOZXdSZWNvcmQoKSkge1xuICAgICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgICAgY29uc3QgZW50cnkgPSB7YXR0cmlidXRlczogdGhpcy5hdHRyaWJ1dGVzKCl9XG5cbiAgICAgIGlmIChoYXNOZXN0ZWREaXJ0eSkgZW50cnkubmVzdGVkQXR0cmlidXRlcyA9IG5lc3RlZEF0dHJpYnV0ZXNcblxuICAgICAgcmV0dXJuIGVudHJ5XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzQ2hhbmdlZCgpICYmICFoYXNOZXN0ZWREaXJ0eSkgcmV0dXJuIG51bGxcblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICBjb25zdCBlbnRyeSA9IHtpZDogdGhpcy5wcmltYXJ5S2V5VmFsdWUoKX1cblxuICAgIGlmICh0aGlzLmlzQ2hhbmdlZCgpKSBlbnRyeS5hdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzKClcbiAgICBpZiAoaGFzTmVzdGVkRGlydHkpIGVudHJ5Lm5lc3RlZEF0dHJpYnV0ZXMgPSBuZXN0ZWRBdHRyaWJ1dGVzXG5cbiAgICByZXR1cm4gZW50cnlcbiAgfVxuXG4gIC8qKlxuICAgKiBBZnRlciBhIHBhcmVudCBzYXZlIHdpdGggYG5lc3RlZEF0dHJpYnV0ZXNgLCB0aGUgc2VydmVyIHJlc3BvbnNlIGluY2x1ZGVzXG4gICAqIHByZWxvYWRlZCB2ZXJzaW9ucyBvZiB0aGUgYWZmZWN0ZWQgcmVsYXRpb25zaGlwcy4gVGhpcyByZXBsYWNlcyB0aGUgbG9jYWxcbiAgICogYF9sb2FkZWRWYWx1ZWAgZm9yIGVhY2ggbmVzdGVkLXdyaXRhYmxlIHJlbGF0aW9uc2hpcCB3aXRoIHRoZSBzZXJ2ZXInc1xuICAgKiBhdXRob3JpdGF0aXZlIHNldCwgc28gZGVzdHJveWVkIGNoaWxkcmVuIGFyZSBkcm9wcGVkIGFuZCBuZXdseS1jcmVhdGVkXG4gICAqIGNoaWxkcmVuIGdldCB0aGVpciBzZXJ2ZXItYXNzaWduZWQgaWRzICsgcGVyc2lzdGVkIHN0YXRlLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHJlc3BvbnNlIC0gQ29tbWFuZCByZXNwb25zZSBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9yZWNvbmNpbGVOZXN0ZWRBdHRyaWJ1dGVzRnJvbVJlc3BvbnNlKHJlc3BvbnNlKSB7XG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSAqLyAodGhpcy5jb25zdHJ1Y3RvcilcbiAgICBjb25zdCByZXNvdXJjZUNvbmZpZyA9IHR5cGVvZiBNb2RlbENsYXNzLnJlc291cmNlQ29uZmlnID09PSBcImZ1bmN0aW9uXCIgPyBNb2RlbENsYXNzLnJlc291cmNlQ29uZmlnKCkgOiBudWxsXG4gICAgY29uc3QgbmVzdGVkQXR0cmlidXRlc0NvbmZpZyA9IHJlc291cmNlQ29uZmlnPy5uZXN0ZWRBdHRyaWJ1dGVzXG5cbiAgICBpZiAoIW5lc3RlZEF0dHJpYnV0ZXNDb25maWcpIHJldHVyblxuXG4gICAgY29uc3QgbW9kZWxEYXRhID0gTW9kZWxDbGFzcy5tb2RlbERhdGFGcm9tUmVzcG9uc2UocmVzcG9uc2UpXG4gICAgY29uc3QgcHJlbG9hZGVkUmVsYXRpb25zaGlwcyA9IG1vZGVsRGF0YS5wcmVsb2FkZWRSZWxhdGlvbnNoaXBzXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgY29uc3QgcmVsZXZhbnRQcmVsb2FkcyA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgb2YgT2JqZWN0LmtleXMobmVzdGVkQXR0cmlidXRlc0NvbmZpZykpIHtcbiAgICAgIGlmIChyZWxhdGlvbnNoaXBOYW1lIGluIHByZWxvYWRlZFJlbGF0aW9uc2hpcHMpIHtcbiAgICAgICAgcmVsZXZhbnRQcmVsb2Fkc1tyZWxhdGlvbnNoaXBOYW1lXSA9IHByZWxvYWRlZFJlbGF0aW9uc2hpcHNbcmVsYXRpb25zaGlwTmFtZV1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXMocmVsZXZhbnRQcmVsb2FkcykubGVuZ3RoID4gMCkge1xuICAgICAgTW9kZWxDbGFzcy5hcHBseVByZWxvYWRlZFJlbGF0aW9uc2hpcHModGhpcywgcmVsZXZhbnRQcmVsb2FkcylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHBhcmFtIHtGcm9udGVuZE1vZGVsQ29tbWFuZFR5cGV9IGNvbW1hbmRUeXBlIC0gQ29tbWFuZCB0eXBlLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHBheWxvYWQgLSBDb21tYW5kIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSAtIFBhcnNlZCBKU09OIHJlc3BvbnNlLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGV4ZWN1dGVDb21tYW5kKGNvbW1hbmRUeXBlLCBwYXlsb2FkKSB7XG4gICAgY29uc3QgY29tbWFuZE5hbWUgPSB0aGlzLmNvbW1hbmROYW1lKGNvbW1hbmRUeXBlKVxuICAgIGNvbnN0IHNlcmlhbGl6ZWRQYXlsb2FkID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqLyAoc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlKHBheWxvYWQpKVxuICAgIGNvbnN0IHJlc291cmNlUGF0aCA9IHRoaXMucmVzb3VyY2VQYXRoKClcbiAgICBjb25zdCBjb250YWluc0F0dGFjaG1lbnRVcGxvYWQgPSBmcm9udGVuZE1vZGVsUGF5bG9hZENvbnRhaW5zQXR0YWNobWVudFVwbG9hZChzZXJpYWxpemVkUGF5bG9hZClcbiAgICBjb25zdCB1c2VTaGFyZWRUcmFuc3BvcnQgPSAhY29udGFpbnNBdHRhY2htZW50VXBsb2FkXG4gICAgY29uc3QgdXJsID0gdXNlU2hhcmVkVHJhbnNwb3J0ID8gZnJvbnRlbmRNb2RlbEFwaVVybCgpIDogZnJvbnRlbmRNb2RlbENvbW1hbmRVcmwocmVzb3VyY2VQYXRoIHx8IFwiXCIsIGNvbW1hbmROYW1lKVxuXG4gICAgaWYgKHVzZVNoYXJlZFRyYW5zcG9ydCkge1xuICAgICAgY29uc3QgYmF0Y2hSZXNwb25zZSA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgcGVuZGluZ1NoYXJlZEZyb250ZW5kTW9kZWxSZXF1ZXN0cy5wdXNoKHtcbiAgICAgICAgICBjb21tYW5kTmFtZSxcbiAgICAgICAgICBjb21tYW5kVHlwZSxcbiAgICAgICAgICBtb2RlbENsYXNzOiB0aGlzLFxuICAgICAgICAgIHBheWxvYWQ6IHNlcmlhbGl6ZWRQYXlsb2FkLFxuICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICByZXF1ZXN0SWQ6IGAkeysrc2hhcmVkRnJvbnRlbmRNb2RlbFJlcXVlc3RJZH1gLFxuICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgcmVzb3VyY2VQYXRoXG4gICAgICAgIH0pXG5cbiAgICAgICAgc2NoZWR1bGVTaGFyZWRGcm9udGVuZE1vZGVsUmVxdWVzdEZsdXNoKClcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IGRlY29kZWRCYXRjaFJlc3BvbnNlID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqLyAoYmF0Y2hSZXNwb25zZSlcblxuICAgICAgdGhpcy50aHJvd09uRXJyb3JGcm9udGVuZE1vZGVsUmVzcG9uc2Uoe1xuICAgICAgICBjb21tYW5kVHlwZSxcbiAgICAgICAgcmVzcG9uc2U6IGRlY29kZWRCYXRjaFJlc3BvbnNlXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gZGVjb2RlZEJhdGNoUmVzcG9uc2VcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdHJhY2tGcm9udGVuZE1vZGVsVHJhbnNwb3J0UmVxdWVzdChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBkaXJlY3RSZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShzZXJpYWxpemVkUGF5bG9hZCksXG4gICAgICAgIGNyZWRlbnRpYWxzOiBcImluY2x1ZGVcIixcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgIH0sXG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCJcbiAgICAgIH0pXG5cbiAgICAgIGlmICghZGlyZWN0UmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZXF1ZXN0IGZhaWxlZCAoJHtkaXJlY3RSZXNwb25zZS5zdGF0dXN9KSBmb3IgJHt0aGlzLm5hbWV9IyR7Y29tbWFuZFR5cGV9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGlyZWN0UmVzcG9uc2VUZXh0ID0gYXdhaXQgZGlyZWN0UmVzcG9uc2UudGV4dCgpXG4gICAgICBjb25zdCBkaXJlY3RKc29uID0gZGlyZWN0UmVzcG9uc2VUZXh0Lmxlbmd0aCA+IDAgPyBKU09OLnBhcnNlKGRpcmVjdFJlc3BvbnNlVGV4dCkgOiB7fVxuICAgICAgY29uc3QgZGVjb2RlZERpcmVjdFJlc3BvbnNlID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqLyAoZGVzZXJpYWxpemVGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWUoZGlyZWN0SnNvbikpXG5cbiAgICAgIHRoaXMudGhyb3dPbkVycm9yRnJvbnRlbmRNb2RlbFJlc3BvbnNlKHtcbiAgICAgICAgY29tbWFuZFR5cGUsXG4gICAgICAgIHJlc3BvbnNlOiBkZWNvZGVkRGlyZWN0UmVzcG9uc2VcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBkZWNvZGVkRGlyZWN0UmVzcG9uc2VcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQ29tbWFuZCBhcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNvbW1hbmROYW1lIC0gUmF3IGNvbW1hbmQgcGF0aCBzZWdtZW50LlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kTW9kZWxSZXF1ZXN0Q29tbWFuZFR5cGV9IGFyZ3MuY29tbWFuZFR5cGUgLSBMb2dpY2FsIGNvbW1hbmQgdHlwZSBmb3IgZXJyb3IgaGFuZGxpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyIHwgbnVsbH0gW2FyZ3MubWVtYmVySWRdIC0gT3B0aW9uYWwgbWVtYmVyIGlkIGZvciBtZW1iZXItc2NvcGVkIGNvbW1hbmRzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGFyZ3MucGF5bG9hZCAtIFJlcXVlc3QgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucmVzb3VyY2VQYXRoIC0gRGlyZWN0IHJlc291cmNlIHBhdGguXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSAtIERlY29kZWQgcmVzcG9uc2UgcGF5bG9hZC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBleGVjdXRlQ3VzdG9tQ29tbWFuZCh7Y29tbWFuZE5hbWUsIGNvbW1hbmRUeXBlLCBtZW1iZXJJZCA9IG51bGwsIHBheWxvYWQsIHJlc291cmNlUGF0aH0pIHtcbiAgICBjb25zdCBzZXJpYWxpemVkUGF5bG9hZCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi8gKHNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZShwYXlsb2FkKSlcbiAgICBjb25zdCBjdXN0b21QYXRoID0gZnJvbnRlbmRNb2RlbEN1c3RvbUNvbW1hbmRQYXRoKHtcbiAgICAgIGNvbW1hbmROYW1lLFxuICAgICAgbWVtYmVySWQsXG4gICAgICBtb2RlbE5hbWU6IHRoaXMuZ2V0TW9kZWxOYW1lKCksXG4gICAgICByZXNvdXJjZVBhdGhcbiAgICB9KVxuXG4gICAgY29uc3QgYmF0Y2hSZXNwb25zZSA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHBlbmRpbmdTaGFyZWRGcm9udGVuZE1vZGVsUmVxdWVzdHMucHVzaCh7XG4gICAgICAgIGNvbW1hbmRUeXBlLFxuICAgICAgICBjdXN0b21QYXRoLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLFxuICAgICAgICBwYXlsb2FkOiBzZXJpYWxpemVkUGF5bG9hZCxcbiAgICAgICAgcmVqZWN0LFxuICAgICAgICByZXF1ZXN0SWQ6IGAkeysrc2hhcmVkRnJvbnRlbmRNb2RlbFJlcXVlc3RJZH1gLFxuICAgICAgICByZXNvbHZlXG4gICAgICB9KVxuXG4gICAgICBzY2hlZHVsZVNoYXJlZEZyb250ZW5kTW9kZWxSZXF1ZXN0Rmx1c2goKVxuICAgIH0pXG5cbiAgICBjb25zdCBkZWNvZGVkQmF0Y2hSZXNwb25zZSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi8gKGJhdGNoUmVzcG9uc2UpXG5cbiAgICB0aGlzLnRocm93T25FcnJvckZyb250ZW5kTW9kZWxSZXNwb25zZSh7XG4gICAgICBjb21tYW5kVHlwZSxcbiAgICAgIHJlc3BvbnNlOiBkZWNvZGVkQmF0Y2hSZXNwb25zZVxuICAgIH0pXG5cbiAgICByZXR1cm4gZGVjb2RlZEJhdGNoUmVzcG9uc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfVxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtGcm9udGVuZE1vZGVsUmVxdWVzdENvbW1hbmRUeXBlfSBhcmdzLmNvbW1hbmRUeXBlIC0gQ29tbWFuZCB0eXBlLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGFyZ3MucmVzcG9uc2UgLSBEZWNvZGVkIHJlc3BvbnNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyB0aHJvd09uRXJyb3JGcm9udGVuZE1vZGVsUmVzcG9uc2Uoe2NvbW1hbmRUeXBlLCByZXNwb25zZX0pIHtcbiAgICBpZiAocmVzcG9uc2U/LnN0YXR1cyAhPT0gXCJlcnJvclwiKSByZXR1cm5cblxuICAgIGNvbnN0IHJlc3BvbnNlS2V5cyA9IE9iamVjdC5rZXlzKHJlc3BvbnNlKVxuICAgIGNvbnN0IGhhc09ubHlTdGF0dXMgPSByZXNwb25zZUtleXMubGVuZ3RoID09PSAxICYmIHJlc3BvbnNlS2V5c1swXSA9PT0gXCJzdGF0dXNcIlxuICAgIGNvbnN0IGhhc0Vycm9yTWVzc2FnZSA9IHR5cGVvZiByZXNwb25zZS5lcnJvck1lc3NhZ2UgPT09IFwic3RyaW5nXCIgJiYgcmVzcG9uc2UuZXJyb3JNZXNzYWdlLmxlbmd0aCA+IDBcbiAgICBjb25zdCBoYXNFcnJvckVudmVsb3BlS2V5cyA9IEJvb2xlYW4oXG4gICAgICByZXNwb25zZS5jb2RlICE9PSB1bmRlZmluZWRcbiAgICAgIHx8IHJlc3BvbnNlLmVycm9yICE9PSB1bmRlZmluZWRcbiAgICAgIHx8IHJlc3BvbnNlLmVycm9ycyAhPT0gdW5kZWZpbmVkXG4gICAgICB8fCByZXNwb25zZS5tZXNzYWdlICE9PSB1bmRlZmluZWRcbiAgICApXG4gICAgY29uc3Qgbm9uU3RhdHVzS2V5cyA9IHJlc3BvbnNlS2V5cy5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSBcInN0YXR1c1wiKVxuICAgIGNvbnN0IGNvbmZpZ3VyZWRBdHRyaWJ1dGVOYW1lcyA9IHRoaXMuY29uZmlndXJlZEZyb250ZW5kTW9kZWxBdHRyaWJ1dGVOYW1lcygpXG4gICAgY29uc3QgbG9va3NMaWtlUmF3TW9kZWxQYXlsb2FkID0gbm9uU3RhdHVzS2V5cy5sZW5ndGggPiAwXG4gICAgICAmJiBub25TdGF0dXNLZXlzLmV2ZXJ5KChrZXkpID0+IGNvbmZpZ3VyZWRBdHRyaWJ1dGVOYW1lcy5oYXMoa2V5KSlcblxuICAgIGlmICghaGFzRXJyb3JNZXNzYWdlICYmICFoYXNPbmx5U3RhdHVzICYmICFoYXNFcnJvckVudmVsb3BlS2V5cyAmJiBsb29rc0xpa2VSYXdNb2RlbFBheWxvYWQpIHJldHVyblxuXG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gaGFzRXJyb3JNZXNzYWdlXG4gICAgICA/IHJlc3BvbnNlLmVycm9yTWVzc2FnZVxuICAgICAgOiBgUmVxdWVzdCBmYWlsZWQgZm9yICR7dGhpcy5uYW1lfSMke2NvbW1hbmRUeXBlfWBcblxuICAgIGNvbnN0IGVycm9yID0gLyoqIEB0eXBlIHtFcnJvciAmIHt2ZWxvY2lvdXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBlcnJvclR5cGU/OiBzdHJpbmcsIHZhbGlkYXRpb25FcnJvcnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+fX0gKi8gKG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpKVxuICAgIGlmIChyZXNwb25zZS52ZWxvY2lvdXMgJiYgdHlwZW9mIHJlc3BvbnNlLnZlbG9jaW91cyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgZXJyb3IudmVsb2Npb3VzID0gcmVzcG9uc2UudmVsb2Npb3VzXG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVzcG9uc2UuZXJyb3JUeXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBlcnJvci5lcnJvclR5cGUgPSByZXNwb25zZS5lcnJvclR5cGVcbiAgICB9XG4gICAgaWYgKHJlc3BvbnNlLnZhbGlkYXRpb25FcnJvcnMgJiYgdHlwZW9mIHJlc3BvbnNlLnZhbGlkYXRpb25FcnJvcnMgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGVycm9yLnZhbGlkYXRpb25FcnJvcnMgPSByZXNwb25zZS52YWxpZGF0aW9uRXJyb3JzXG4gICAgfVxuICAgIHRocm93IGVycm9yXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHJldHVybnMge1NldDxzdHJpbmc+fSAtIENvbmZpZ3VyZWQgZnJvbnRlbmQgbW9kZWwgYXR0cmlidXRlIG5hbWVzLlxuICAgKi9cbiAgc3RhdGljIGNvbmZpZ3VyZWRGcm9udGVuZE1vZGVsQXR0cmlidXRlTmFtZXMoKSB7XG4gICAgY29uc3QgcmVzb3VyY2VDb25maWcgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovICh0aGlzLnJlc291cmNlQ29uZmlnKCkpXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHJlc291cmNlQ29uZmlnLmF0dHJpYnV0ZXNcblxuICAgIGlmIChBcnJheS5pc0FycmF5KGF0dHJpYnV0ZXMpKSB7XG4gICAgICByZXR1cm4gbmV3IFNldChhdHRyaWJ1dGVzLmZpbHRlcigoYXR0cmlidXRlTmFtZSkgPT4gdHlwZW9mIGF0dHJpYnV0ZU5hbWUgPT09IFwic3RyaW5nXCIpKVxuICAgIH1cblxuICAgIGlmIChhdHRyaWJ1dGVzICYmIHR5cGVvZiBhdHRyaWJ1dGVzID09PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gbmV3IFNldChPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKSlcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFNldCgpXG4gIH1cbn1cbiJdfQ==
|