@myop/sdk 0.4.0-beta.5 → 0.4.0-beta.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -0
- package/dist/bundled-declarations.d.ts +87 -4
- package/dist/cjs/{_IframeSDK.ac4c28cf.js → _IframeSDK.49662e01.js} +97 -18
- package/dist/cjs/_IframeSDK.49662e01.js.map +7 -0
- package/dist/cjs/_IframeSDK.d4a97876.min.js +1 -0
- package/dist/cjs/_MyopHelpers.12acc780.min.js +1 -0
- package/dist/cjs/{_MyopHelpers.efed13e4.js → _MyopHelpers.2c449e7a.js} +78 -15
- package/dist/cjs/_MyopHelpers.2c449e7a.js.map +7 -0
- package/dist/cjs/_WebComponentSDK.1addf28b.min.js +1 -0
- package/dist/cjs/{_WebComponentSDK.4085389a.js → _WebComponentSDK.d5f9105b.js} +97 -18
- package/dist/cjs/_WebComponentSDK.d5f9105b.js.map +7 -0
- package/dist/cjs/_hostSDK.6dab59cb.min.js +1 -0
- package/dist/cjs/{_hostSDK.46b85afc.js → _hostSDK.8cf37510.js} +97 -18
- package/dist/cjs/_hostSDK.8cf37510.js.map +7 -0
- package/dist/cjs/myop_sdk.js +14 -14
- package/dist/cjs/myop_sdk.js.map +1 -1
- package/dist/cjs/myop_sdk.min.js +1 -1
- package/dist/cjs-bundled/myop_sdk.bundled.js +107 -21
- package/dist/cjs-bundled/myop_sdk.bundled.js.map +3 -3
- package/dist/cjs-bundled/myop_sdk.bundled.min.js +1 -1
- package/dist/module/Iframe/index.js +98 -19
- package/dist/module/Iframe/index.js.map +2 -2
- package/dist/module/SDK.js +107 -21
- package/dist/module/SDK.js.map +3 -3
- package/dist/module/common/index.d.ts +5 -0
- package/dist/module/common/index.js +1 -1
- package/dist/module/common/index.js.map +2 -2
- package/dist/module/embeddedSDK.js +1 -1
- package/dist/module/helpers/CloudRepository.d.ts +36 -1
- package/dist/module/helpers/cloudRepositoryHelpers.d.ts +42 -2
- package/dist/module/helpers/index.js +77 -16
- package/dist/module/helpers/index.js.map +2 -2
- package/dist/module/host/components/IMyopComponent.d.ts +3 -0
- package/dist/module/host/embeddedSDK.js +1 -1
- package/dist/module/host/hostSDK.d.ts +1 -1
- package/dist/module/host/index.js +98 -19
- package/dist/module/host/index.js.map +2 -2
- package/dist/module/webcomponent/index.js +98 -19
- package/dist/module/webcomponent/index.js.map +2 -2
- package/package.json +1 -1
- package/dist/cjs/_IframeSDK.47f37ec9.min.js +0 -1
- package/dist/cjs/_IframeSDK.ac4c28cf.js.map +0 -7
- package/dist/cjs/_MyopHelpers.91004b19.min.js +0 -1
- package/dist/cjs/_MyopHelpers.efed13e4.js.map +0 -7
- package/dist/cjs/_WebComponentSDK.4085389a.js.map +0 -7
- package/dist/cjs/_WebComponentSDK.4ca43f0a.min.js +0 -1
- package/dist/cjs/_hostSDK.0443afcd.min.js +0 -1
- package/dist/cjs/_hostSDK.46b85afc.js.map +0 -7
|
@@ -60,7 +60,7 @@ var MyopSDK = (() => {
|
|
|
60
60
|
var myop_sdk_version_default;
|
|
61
61
|
var init_myop_sdk_version = __esm({
|
|
62
62
|
"version:myop-sdk-version"() {
|
|
63
|
-
myop_sdk_version_default = "0.4.0-beta.
|
|
63
|
+
myop_sdk_version_default = "0.4.0-beta.6";
|
|
64
64
|
}
|
|
65
65
|
});
|
|
66
66
|
|
|
@@ -831,6 +831,10 @@ var MyopSDK = (() => {
|
|
|
831
831
|
}
|
|
832
832
|
});
|
|
833
833
|
}
|
|
834
|
+
get uiTags() {
|
|
835
|
+
var _a2;
|
|
836
|
+
return ((_a2 = this.componentDefinition) == null ? void 0 : _a2.uiTags) || [];
|
|
837
|
+
}
|
|
834
838
|
get markedForDisposed() {
|
|
835
839
|
return this._markedForDisposed;
|
|
836
840
|
}
|
|
@@ -2254,7 +2258,7 @@ var MyopSDK = (() => {
|
|
|
2254
2258
|
});
|
|
2255
2259
|
|
|
2256
2260
|
// src/host/loaders/iframeLoader.ts
|
|
2257
|
-
var addQueryParam, MyopIframeLoader;
|
|
2261
|
+
var addQueryParam, showsSamePage, MyopIframeLoader;
|
|
2258
2262
|
var init_iframeLoader = __esm({
|
|
2259
2263
|
"src/host/loaders/iframeLoader.ts"() {
|
|
2260
2264
|
"use strict";
|
|
@@ -2267,6 +2271,21 @@ var MyopSDK = (() => {
|
|
|
2267
2271
|
urlObj.searchParams.append(param, value);
|
|
2268
2272
|
return urlObj.toString();
|
|
2269
2273
|
};
|
|
2274
|
+
showsSamePage = (frame, url) => {
|
|
2275
|
+
const current = frame.getAttribute("src");
|
|
2276
|
+
if (!current || !url) return false;
|
|
2277
|
+
const norm = (u) => {
|
|
2278
|
+
const x = new URL(u, document.baseURI);
|
|
2279
|
+
x.hash = "";
|
|
2280
|
+
if (x.pathname.length > 1) x.pathname = x.pathname.replace(/\/$/, "");
|
|
2281
|
+
return x.href;
|
|
2282
|
+
};
|
|
2283
|
+
try {
|
|
2284
|
+
return norm(current) === norm(url);
|
|
2285
|
+
} catch (e) {
|
|
2286
|
+
return false;
|
|
2287
|
+
}
|
|
2288
|
+
};
|
|
2270
2289
|
MyopIframeLoader = class extends BaseMyopLoader {
|
|
2271
2290
|
constructor() {
|
|
2272
2291
|
super(...arguments);
|
|
@@ -2276,9 +2295,10 @@ var MyopSDK = (() => {
|
|
|
2276
2295
|
let IframeElement;
|
|
2277
2296
|
const typedLoaderConfig = skin.loader;
|
|
2278
2297
|
if ((container == null ? void 0 : container.nodeName) === "IFRAME") {
|
|
2279
|
-
console.log("needs to load into an exsisting Iframe...", typedLoaderConfig.url, container);
|
|
2280
2298
|
IframeElement = container;
|
|
2281
|
-
IframeElement
|
|
2299
|
+
if (!showsSamePage(IframeElement, typedLoaderConfig.url)) {
|
|
2300
|
+
IframeElement.src = typedLoaderConfig.url;
|
|
2301
|
+
}
|
|
2282
2302
|
} else {
|
|
2283
2303
|
const uniqId = uuidv4();
|
|
2284
2304
|
const domId = "myop-comp-".concat(uniqId);
|
|
@@ -2614,7 +2634,10 @@ var MyopSDK = (() => {
|
|
|
2614
2634
|
loader: config.consume_variant[0].loader
|
|
2615
2635
|
}
|
|
2616
2636
|
],
|
|
2617
|
-
defaultSkin: 0
|
|
2637
|
+
defaultSkin: 0,
|
|
2638
|
+
// Only `ui:` tags ever reach the client; the server filters, absent = none.
|
|
2639
|
+
// @ts-ignore
|
|
2640
|
+
uiTags: Array.isArray(config.uiTags) ? config.uiTags : []
|
|
2618
2641
|
},
|
|
2619
2642
|
name: config.name
|
|
2620
2643
|
};
|
|
@@ -2656,7 +2679,7 @@ var MyopSDK = (() => {
|
|
|
2656
2679
|
* Opt-in delivery settings, set by myop.delivery(). Off means: this file behaves
|
|
2657
2680
|
* EXACTLY as it did before — same host, same URL, same everything.
|
|
2658
2681
|
*/
|
|
2659
|
-
__publicField(this, "_delivery", { minify: false, host: null, cache: false });
|
|
2682
|
+
__publicField(this, "_delivery", { minify: false, host: null, cache: false, flow: false });
|
|
2660
2683
|
/**
|
|
2661
2684
|
* What actually happened, for myop.delivery.stats(). `fellBack` is the number that
|
|
2662
2685
|
* matters: it is how you find out the lane is unhealthy without waiting for a
|
|
@@ -2691,6 +2714,9 @@ var MyopSDK = (() => {
|
|
|
2691
2714
|
*/
|
|
2692
2715
|
__publicField(this, "_localServes", /* @__PURE__ */ new Map());
|
|
2693
2716
|
__publicField(this, "_flushBound", false);
|
|
2717
|
+
// ============ V1 Methods (Legacy) ============
|
|
2718
|
+
/** ids seeded by hydrateV1Component whose first use has not been counted yet */
|
|
2719
|
+
__publicField(this, "_hydratedV1", /* @__PURE__ */ new Set());
|
|
2694
2720
|
}
|
|
2695
2721
|
static get Main() {
|
|
2696
2722
|
const globalMain = getGlobalMain();
|
|
@@ -2726,32 +2752,46 @@ var MyopSDK = (() => {
|
|
|
2726
2752
|
* Deliberately mutates THIS instance rather than constructing a new repository:
|
|
2727
2753
|
* CloudRepository.Main is a global singleton shared across bundles (see getGlobalMain),
|
|
2728
2754
|
* so a second instance would be ignored by every component already using the first.
|
|
2755
|
+
*
|
|
2756
|
+
* @internal
|
|
2729
2757
|
*/
|
|
2730
2758
|
setDelivery(opts = {}) {
|
|
2731
2759
|
if (opts.minify !== void 0) this._delivery.minify = !!opts.minify;
|
|
2732
2760
|
if (opts.host !== void 0) this._delivery.host = opts.host;
|
|
2733
2761
|
if (opts.cache !== void 0) this._delivery.cache = !!opts.cache;
|
|
2762
|
+
if (opts.flow !== void 0) this._delivery.flow = !!opts.flow;
|
|
2734
2763
|
}
|
|
2764
|
+
/** @internal */
|
|
2735
2765
|
deliveryStats() {
|
|
2736
2766
|
var _a2;
|
|
2737
2767
|
return __spreadProps(__spreadValues({}, this._deliveryStats), {
|
|
2738
2768
|
host: (_a2 = this._delivery.host) != null ? _a2 : _CloudRepository.DEFAULT_HOST,
|
|
2739
2769
|
minify: this._delivery.minify,
|
|
2740
|
-
cache: this._delivery.cache
|
|
2770
|
+
cache: this._delivery.cache,
|
|
2771
|
+
flow: this._delivery.flow
|
|
2741
2772
|
});
|
|
2742
2773
|
}
|
|
2743
2774
|
/**
|
|
2744
2775
|
* Forget what this browser holds, so the next load asks the server.
|
|
2745
2776
|
* `refresh()` with no ids drops everything; the counterpart to the window for the case
|
|
2746
2777
|
* where a change has to be visible on THIS load — right after someone publishes.
|
|
2778
|
+
*
|
|
2779
|
+
* @internal
|
|
2747
2780
|
*/
|
|
2748
2781
|
async refreshDelivery() {
|
|
2749
2782
|
await deliveryStore.clear();
|
|
2750
2783
|
}
|
|
2751
|
-
|
|
2752
|
-
|
|
2784
|
+
/**
|
|
2785
|
+
* `source: 'h'` = the view was served from a config the page's SERVER embedded
|
|
2786
|
+
* (hydrateV1Component), not from this browser's cache window. Reported as a 4th batch
|
|
2787
|
+
* field (`id:env:n:h`) so our usage data can tell server-rendered views apart; a server
|
|
2788
|
+
* that predates it reads the first three fields and counts the view all the same.
|
|
2789
|
+
*/
|
|
2790
|
+
noteLocalServe(componentId, env, source) {
|
|
2791
|
+
const key = source ? "".concat(componentId, ":").concat(source) : componentId;
|
|
2792
|
+
const cur = this._localServes.get(key);
|
|
2753
2793
|
if (cur) cur.count++;
|
|
2754
|
-
else this._localServes.set(
|
|
2794
|
+
else this._localServes.set(key, { id: componentId, env, count: 1, source });
|
|
2755
2795
|
this.bindFlush();
|
|
2756
2796
|
}
|
|
2757
2797
|
/** Report on page-hide, which is the only event that reliably fires on mobile. */
|
|
@@ -2771,7 +2811,7 @@ var MyopSDK = (() => {
|
|
|
2771
2811
|
*/
|
|
2772
2812
|
flushLocalServes() {
|
|
2773
2813
|
if (!this._localServes.size) return;
|
|
2774
|
-
const batch = [...this._localServes.entries()].map(([
|
|
2814
|
+
const batch = [...this._localServes.entries()].map(([, v]) => "".concat(v.id, ":").concat(v.env, ":").concat(v.count).concat(v.source ? ":" + v.source : "")).join(",");
|
|
2775
2815
|
this._localServes.clear();
|
|
2776
2816
|
try {
|
|
2777
2817
|
const url = "".concat(this.deliveryHost(), "/clientUsage?b=").concat(encodeURIComponent(batch));
|
|
@@ -2820,7 +2860,7 @@ var MyopSDK = (() => {
|
|
|
2820
2860
|
/**
|
|
2821
2861
|
* Enable static mode for self-hosted component registries.
|
|
2822
2862
|
* In static mode, URLs are constructed as file paths instead of query params:
|
|
2823
|
-
*
|
|
2863
|
+
* `${baseUrl}/components/${componentId}/${env}.json`
|
|
2824
2864
|
*/
|
|
2825
2865
|
enableStaticMode() {
|
|
2826
2866
|
this._staticMode = true;
|
|
@@ -3029,6 +3069,14 @@ var MyopSDK = (() => {
|
|
|
3029
3069
|
const { cacheKey } = this.resolveParams(componentId, env, preview);
|
|
3030
3070
|
return ((_a2 = this.variants[cacheKey]) == null ? void 0 : _a2.resolved) || null;
|
|
3031
3071
|
}
|
|
3072
|
+
/**
|
|
3073
|
+
* The `ui:` tags of an already-resolved component (`[]` if it has none or is not
|
|
3074
|
+
* resolved yet). Synchronous, no request: tags arrive with the component itself.
|
|
3075
|
+
*/
|
|
3076
|
+
getComponentTags(componentId, env, preview) {
|
|
3077
|
+
var _a2, _b;
|
|
3078
|
+
return ((_b = (_a2 = this.getResolvedConfig(componentId, env, preview)) == null ? void 0 : _a2.type) == null ? void 0 : _b.uiTags) || [];
|
|
3079
|
+
}
|
|
3032
3080
|
/**
|
|
3033
3081
|
* Resolve which (env, preview) pair — and therefore which cache key — a call
|
|
3034
3082
|
* for `componentId` refers to.
|
|
@@ -3073,7 +3121,27 @@ var MyopSDK = (() => {
|
|
|
3073
3121
|
this.variants[cacheKey] = promise;
|
|
3074
3122
|
this.preloadedComponents[componentId] = { env: resolvedEnv, preview: usePreview };
|
|
3075
3123
|
}
|
|
3076
|
-
|
|
3124
|
+
/**
|
|
3125
|
+
* Seed a v1 component's config, so `fetchComponentV1(componentId)` answers from memory
|
|
3126
|
+
* with no request. The v1 counterpart of {@link hydrateComponent}.
|
|
3127
|
+
*
|
|
3128
|
+
* `flow` is what `GET /flow?id=<componentId>&auto=true` returns: either the whole body
|
|
3129
|
+
* (`{item: {...}}`) or its `item`. Typical use is a server that fetched it (with
|
|
3130
|
+
* `&prefetch=1`, so the fetch is not counted as a view) and embedded it in the page.
|
|
3131
|
+
*
|
|
3132
|
+
* The view IS counted: the first time the seeded config is used, it is reported through
|
|
3133
|
+
* /clientUsage (flagged `:h`, recorded as deliveryPath 'hydrated'), so hydrating never makes
|
|
3134
|
+
* usage disappear and server-rendered views stay distinguishable.
|
|
3135
|
+
*/
|
|
3136
|
+
hydrateV1Component(componentId, flow) {
|
|
3137
|
+
var _a2, _b;
|
|
3138
|
+
const item = (_a2 = flow == null ? void 0 : flow.item) != null ? _a2 : flow;
|
|
3139
|
+
if (!((_b = item == null ? void 0 : item.components) == null ? void 0 : _b.length)) {
|
|
3140
|
+
throw new Error("hydrateV1Component(".concat(componentId, "): not a /flow?auto=true response"));
|
|
3141
|
+
}
|
|
3142
|
+
this.userFlows[componentId] = Promise.resolve(item);
|
|
3143
|
+
this._hydratedV1.add(componentId);
|
|
3144
|
+
}
|
|
3077
3145
|
/**
|
|
3078
3146
|
* Fetch a v1 component from a flow
|
|
3079
3147
|
*/
|
|
@@ -3087,13 +3155,15 @@ var MyopSDK = (() => {
|
|
|
3087
3155
|
}
|
|
3088
3156
|
}
|
|
3089
3157
|
async fetchAutoFlow(componentId) {
|
|
3158
|
+
if (this._hydratedV1.delete(componentId)) {
|
|
3159
|
+
this.noteLocalServe(componentId, "v1_auto_flow", "h");
|
|
3160
|
+
}
|
|
3090
3161
|
if (!this.userFlows[componentId]) {
|
|
3091
3162
|
this.userFlows[componentId] = new Promise(
|
|
3092
3163
|
async (resolve, reject) => {
|
|
3093
3164
|
try {
|
|
3094
|
-
const
|
|
3095
|
-
|
|
3096
|
-
);
|
|
3165
|
+
const path = "/flow?id=".concat(componentId, "&auto=true");
|
|
3166
|
+
const res = this._delivery.flow && this._delivery.host ? await this.deliveryFetch(path) : await fetch("".concat(this._baseUrl).concat(path));
|
|
3097
3167
|
const json = await res.json();
|
|
3098
3168
|
resolve(json.item);
|
|
3099
3169
|
} catch (e) {
|
|
@@ -3142,7 +3212,7 @@ var MyopSDK = (() => {
|
|
|
3142
3212
|
});
|
|
3143
3213
|
|
|
3144
3214
|
// src/helpers/cloudRepositoryHelpers.ts
|
|
3145
|
-
var _cloudRepository, getCloudRepository, isPreloaded, getPreloadedParams, enableLocalDev, setCloudRepositoryUrl, enableSelfHosted, DELIVERY_HOST, delivery, deliveryRefresh, deliveryStats, deliveryOff, setCloudRepository, setEnvironment, getResolvedConfig, preloadComponents, hydrateComponents;
|
|
3215
|
+
var _cloudRepository, getCloudRepository, isPreloaded, getPreloadedParams, enableLocalDev, setCloudRepositoryUrl, enableSelfHosted, DELIVERY_HOST, delivery, deliveryRefresh, deliveryStats, deliveryOff, setCloudRepository, setEnvironment, getResolvedConfig, getComponentTags, preloadComponents, hydrateComponents, hydrateV1Components;
|
|
3146
3216
|
var init_cloudRepositoryHelpers = __esm({
|
|
3147
3217
|
"src/helpers/cloudRepositoryHelpers.ts"() {
|
|
3148
3218
|
"use strict";
|
|
@@ -3170,11 +3240,12 @@ var MyopSDK = (() => {
|
|
|
3170
3240
|
};
|
|
3171
3241
|
DELIVERY_HOST = "https://delivery.myop.dev";
|
|
3172
3242
|
delivery = (opts = {}) => {
|
|
3173
|
-
var _a2, _b;
|
|
3174
|
-
const wantsLane = opts.minify !== false || opts.cache === true;
|
|
3243
|
+
var _a2, _b, _c;
|
|
3244
|
+
const wantsLane = opts.minify !== false || opts.cache === true || opts.flow === true;
|
|
3175
3245
|
_cloudRepository.setDelivery({
|
|
3176
3246
|
minify: (_a2 = opts.minify) != null ? _a2 : false,
|
|
3177
3247
|
cache: (_b = opts.cache) != null ? _b : false,
|
|
3248
|
+
flow: (_c = opts.flow) != null ? _c : false,
|
|
3178
3249
|
host: opts.host !== void 0 ? opts.host : wantsLane ? DELIVERY_HOST : null
|
|
3179
3250
|
});
|
|
3180
3251
|
return deliveryStats();
|
|
@@ -3185,7 +3256,7 @@ var MyopSDK = (() => {
|
|
|
3185
3256
|
};
|
|
3186
3257
|
deliveryStats = () => _cloudRepository.deliveryStats();
|
|
3187
3258
|
deliveryOff = () => {
|
|
3188
|
-
_cloudRepository.setDelivery({ minify: false, cache: false, host: null });
|
|
3259
|
+
_cloudRepository.setDelivery({ minify: false, cache: false, flow: false, host: null });
|
|
3189
3260
|
return deliveryStats();
|
|
3190
3261
|
};
|
|
3191
3262
|
setCloudRepository = (repository) => {
|
|
@@ -3197,6 +3268,9 @@ var MyopSDK = (() => {
|
|
|
3197
3268
|
getResolvedConfig = (componentId, env, preview) => {
|
|
3198
3269
|
return _cloudRepository.getResolvedConfig(componentId, env, preview);
|
|
3199
3270
|
};
|
|
3271
|
+
getComponentTags = (componentId, env, preview) => {
|
|
3272
|
+
return _cloudRepository.getComponentTags(componentId, env, preview);
|
|
3273
|
+
};
|
|
3200
3274
|
preloadComponents = async (ids, env, preview) => {
|
|
3201
3275
|
return Promise.allSettled(
|
|
3202
3276
|
ids.map((id) => _cloudRepository.fetchComponentV2(id, env, preview))
|
|
@@ -3207,6 +3281,11 @@ var MyopSDK = (() => {
|
|
|
3207
3281
|
_cloudRepository.hydrateComponent(id, config, env, preview);
|
|
3208
3282
|
}
|
|
3209
3283
|
};
|
|
3284
|
+
hydrateV1Components = (flows) => {
|
|
3285
|
+
for (const [id, flow] of Object.entries(flows)) {
|
|
3286
|
+
_cloudRepository.hydrateV1Component(id, flow);
|
|
3287
|
+
}
|
|
3288
|
+
};
|
|
3210
3289
|
}
|
|
3211
3290
|
});
|
|
3212
3291
|
|
|
@@ -4333,9 +4412,11 @@ var MyopSDK = (() => {
|
|
|
4333
4412
|
enableSelfHosted: () => enableSelfHosted,
|
|
4334
4413
|
exec: () => exec,
|
|
4335
4414
|
getCloudRepository: () => getCloudRepository,
|
|
4415
|
+
getComponentTags: () => getComponentTags,
|
|
4336
4416
|
getPreloadedParams: () => getPreloadedParams,
|
|
4337
4417
|
getResolvedConfig: () => getResolvedConfig,
|
|
4338
4418
|
hydrateComponents: () => hydrateComponents,
|
|
4419
|
+
hydrateV1Components: () => hydrateV1Components,
|
|
4339
4420
|
isPreloaded: () => isPreloaded,
|
|
4340
4421
|
preloadComponents: () => preloadComponents,
|
|
4341
4422
|
removeClass: () => removeClass,
|
|
@@ -4797,6 +4878,9 @@ var MyopSDK = (() => {
|
|
|
4797
4878
|
api.refresh = deliveryRefresh;
|
|
4798
4879
|
window.myop.delivery = api;
|
|
4799
4880
|
}
|
|
4881
|
+
if (window.myop && !window.myop.hydrateV1) {
|
|
4882
|
+
window.myop.hydrateV1 = hydrateV1Components;
|
|
4883
|
+
}
|
|
4800
4884
|
hostSDK = window.myop.hostSDK;
|
|
4801
4885
|
defineDynamicImport("hostSDK", hostSDK);
|
|
4802
4886
|
}
|
|
@@ -5383,9 +5467,11 @@ var MyopSDK = (() => {
|
|
|
5383
5467
|
enableSelfHosted: () => enableSelfHosted,
|
|
5384
5468
|
exec: () => exec,
|
|
5385
5469
|
getCloudRepository: () => getCloudRepository,
|
|
5470
|
+
getComponentTags: () => getComponentTags,
|
|
5386
5471
|
getPreloadedParams: () => getPreloadedParams,
|
|
5387
5472
|
getResolvedConfig: () => getResolvedConfig,
|
|
5388
5473
|
hydrateComponents: () => hydrateComponents,
|
|
5474
|
+
hydrateV1Components: () => hydrateV1Components,
|
|
5389
5475
|
isPreloaded: () => isPreloaded,
|
|
5390
5476
|
preloadComponents: () => preloadComponents,
|
|
5391
5477
|
removeClass: () => removeClass,
|
|
@@ -5511,4 +5597,4 @@ var MyopSDK = (() => {
|
|
|
5511
5597
|
}
|
|
5512
5598
|
return __toCommonJS(SDK_exports);
|
|
5513
5599
|
})();
|
|
5514
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydC50cyIsICJ2ZXJzaW9uOm15b3Atc2RrLXZlcnNpb24iLCAiLi4vLi4vc3JjL2NvbW1vbi9NeW9wTWVzc2FnZXMudHMiLCAiLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9CYXNlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQmluZENsaWNrTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ2hhbmdlVGV4dE1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9DdXN0b21SZWZNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9BZGRFdmVudExpc3RlbmVyTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvU2V0QXR0cmlidXRlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvR2V0RWxlbWVudFZhbHVlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvU2V0SW5uZXJIdG1sLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9Jbml0TWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9HZXRBdHRyaWJ1dGVNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9FeGVjdXRlQ29tcG9uZW50TWV0aG9kLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ2xlYW51cE1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL0Rpc3Bvc2VNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvSU15b3BDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL2NvbW1vbi9NeW9wRWxlbWVudFJlZi50cyIsICIuLi8uLi9zcmMvY29tbW9uL2Jhc2VNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvY29tbW9uL0Jhc2VNeW9wU0RLLnRzIiwgIi4uLy4uL3NyYy9jb21tb24vaW5kZXgudHMiLCAiLi4vLi4vc3JjL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2xvZ01lc3NhZ2VzLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcFJlZkNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvaG9zdC9jb21wb25lbnRzL215b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50Q29yZS50cyIsICIuLi8uLi9zcmMvaG9zdC9jb21wb25lbnRzL215b3BJZnJhbWVDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL2hvc3QvbG9hZGVycy9JTXlvcExvYWRlci50cyIsICIuLi8uLi9zcmMvaG9zdC9sb2FkZXJzL2lmcmFtZUxvYWRlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L2NvbnN0cy50cyIsICIuLi8uLi9zcmMvaG9zdC9jb21wb25lbnRzL215b3BXZWJjb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL2hvc3QvbG9hZGVycy93ZWJjb21wb25lbnRMb2FkZXIudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvZGVsaXZlcnlTdG9yZS50cyIsICIuLi8uLi9zcmMvaGVscGVycy9DbG91ZFJlcG9zaXRvcnkudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvY2xvdWRSZXBvc2l0b3J5SGVscGVycy50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL2NvbnN0cy50cyIsICIuLi8uLi9zcmMvY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L3NoYWRvd1Jvb3RSZWYudHMiLCAiLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvc2V0SW5uZXJIdG1sSGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L1dlYkNvbXBvbmVudFNESy50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L2luZGV4LnRzIiwgIi4uLy4uL3NyYy9ob3N0L2VtYmVkZGVkU0RLLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvSFRNTENvbXBvbmVudExvYWRlci50cyIsICIuLi8uLi9zcmMvaGVscGVycy9hcHBseVN0eWxlc2hlZXQudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvaWZyYW1lU2tpblVybFRva2VuaXplci50cyIsICIuLi8uLi9zcmMvaGVscGVycy9jbGFzc0xpc3QudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvY29uZmlnQnVpbGRlci50cyIsICIuLi8uLi9zcmMvaGVscGVycy9leGVjLnRzIiwgIi4uLy4uL3NyYy9oZWxwZXJzL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9ob3N0L215b3BPdmVycmlkZS50cyIsICIuLi8uLi9zcmMvaG9zdC9ob3N0U0RLLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvYmluZE9uQ2xpY2tIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2NoYW5nZVRleHRIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL3NldEF0dHJpYnV0ZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL2NvbW1vbi91dGlscy9kb21PYnNlcnZlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9TZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9HZXRFbGVtZW50VmFsdWVIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2dldEF0dHJpYnV0ZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvU2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL3NldElubmVySHRtbEhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL0lmcmFtZS9JZnJhbWVTREsudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL015b3BNZXNzYWdlcy50cyIsICIuLi8uLi9zcmMvaGVscGVycy9NeW9wSGVscGVycy50cyIsICIuLi8uLi9zcmMvU0RLLnRzIiwgIi4uLy4uL3NyYy9keW5hbWljSW1wb3J0L2xvYWRfX2ZlZGVyYXRpb25fXy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IGNvbnN0IF9fZmVkZXJhdGlvbl9fID0gXCJfX2ZlZGVyYXRpb25fX1wiXG5leHBvcnQgY29uc3Qgb25Mb2FkS2V5ID0gXCJvbkxvYWRcIlxuZXhwb3J0IGNvbnN0IG1vZHVsZUluc3RhbmNlS2V5ID0gXCJtb2R1bGVJbnN0YW5jZVwiXG5cbmV4cG9ydCBjb25zdCBkZWZpbmVEeW5hbWljSW1wb3J0ID0gKGdsb2JhbE5hbWU6IHN0cmluZywgbW9kdWxlOiBhbnkpID0+IHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKHdpbmRvd1tfX2ZlZGVyYXRpb25fX10gJiYgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXSAmJiB3aW5kb3dbX19mZWRlcmF0aW9uX19dW2dsb2JhbE5hbWVdW29uTG9hZEtleV0pIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB3aW5kb3dbX19mZWRlcmF0aW9uX19dW2dsb2JhbE5hbWVdW29uTG9hZEtleV0oe1tnbG9iYWxOYW1lXTogbW9kdWxlfSlcbiAgICB9IGVsc2Uge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdfX2ZlZGVyYXRpb25fXyBsb2FkZXIgbm90IGRlZmluZWQgZm9yIG1vZHVsZScsIG1vZHVsZSk7XG4gICAgfVxufSIsICJleHBvcnQgZGVmYXVsdCAnMC40LjAtYmV0YS41JzsiLCAidHlwZSBTdHJpbmdXaXRoQXV0b2NvbXBsZXRlPFQ+ID0gVCB8IChzdHJpbmcgJiBSZWNvcmQ8bmV2ZXIsIG5ldmVyPik7XG5cbmV4cG9ydCB0eXBlIE15b3BNZXNzYWdlS2V5ID0gU3RyaW5nV2l0aEF1dG9jb21wbGV0ZTxrZXlvZiB0eXBlb2YgTXlvcE1lc3NhZ2VzIHwga2V5b2YgdHlwZW9mIE15b3BNZXNzYWdlcy5Jbj47XG5cbmV4cG9ydCBjb25zdCBNeW9wTWVzc2FnZXMgPSB7XG4gICAgLy9ob3N0IHRvIGNvbXBvbmVudFxuICAgICdJbml0UmVxdWVzdCc6ICdJbml0UmVxdWVzdCcsXG4gICAgJ0luaXRSZXNwb25zZSc6ICdJbml0UmVzcG9uc2UnLFxuICAgICdJbml0TWVzc2FnZSc6ICdJbml0TWVzc2FnZScsXG4gICAgJ0Rpc3Bvc2VNZXNzYWdlJzogJ0Rpc3Bvc2VNZXNzYWdlJyxcblxuICAgICdDaGFuZ2VUZXh0TWVzc2FnZSc6ICdDaGFuZ2VUZXh0TWVzc2FnZScsXG4gICAgJ0JpbmRDbGlja01lc3NhZ2UnOiAnQmluZENsaWNrTWVzc2FnZScsXG4gICAgJ0RldGVjdE15b3BSZWZzTWVzc2FnZSc6ICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnLFxuXG4gICAgJ0V4ZWN1dGVTY3JpcHRNZXNzYWdlJzogJ0V4ZWN1dGVTY3JpcHRNZXNzYWdlJyxcblxuICAgICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZSc6ICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZScsXG4gICAgJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnOiAnU2V0QXR0cmlidXRlTWVzc2FnZScsXG5cbiAgICAnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSc6ICdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJyxcbiAgICAnRW52ZWxvcGVkTWVzc2FnZSc6ICdFbnZlbG9wZWRNZXNzYWdlJyxcblxuICAgICdHZXRFbGVtZW50VmFsdWVNZXNzYWdlJzogJ0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnLFxuICAgICdHZXRBdHRyaWJ1dGVNZXNzYWdlJzogJ0dldEF0dHJpYnV0ZU1lc3NhZ2UnLFxuXG4gICAgJ1NldElubmVySHRtbCc6ICdTZXRJbm5lckh0bWwnLFxuXG4gICAgLy9jb21wb25lbnQgbWVzc2FnZXNcbiAgICAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCc6ICdFeGVjdXRlQ29tcG9uZW50TWV0aG9kJyxcbiAgICAnU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnOiAnU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnLFxuICAgICdTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnOiAnU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJyxcblxuICAgICdDbGVhbnVwTWVzc2FnZSc6ICdDbGVhbnVwTWVzc2FnZScsXG5cbiAgICAvLyBleHRlcm5hbCB0byBob3N0IDpcbiAgICBJbjoge1xuICAgICAgICAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnOiAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnLFxuICAgICAgICAnQ2xpY2tSZXBsYXlNZXNzYWdlJzogJ0NsaWNrUmVwbGF5TWVzc2FnZScsXG4gICAgICAgICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJzogJ0V4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UnLFxuXG4gICAgICAgICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJzogJ0V2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UnLFxuICAgICAgICAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSc6ICdFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlJyxcblxuICAgICAgICBcIkdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2VcIjogXCJHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlXCIsXG4gICAgICAgICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSc6ICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZScsXG4gICAgICAgICdFbnZlbG9wZWRNZXNzYWdlJzogJ0VudmVsb3BlZE1lc3NhZ2UnLFxuXG4gICAgICAgICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc6ICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZScsXG4gICAgICAgICdDbGVhbnVwUmVwbGF5TWVzc2FnZSc6ICdDbGVhbnVwUmVwbGF5TWVzc2FnZScsXG4gICAgICAgICdSZXNpemVPYnNlcnZlck1lc3NhZ2UnOiAnUmVzaXplT2JzZXJ2ZXJNZXNzYWdlJ1xuICAgIH1cbn1cbiIsICIvL1RPRE8gOiByZXVzZSBmcm9tIG9uZSBwbGFjZS5cbi8vIG5lZWRzIHRvIGJlIHVzZWQgaW4gbXlvcC1zZGssIG15b3AtZGFzaGJhb3JkLCBteW9wLXNlcnZlciwgbXlvcC1jbGkgLi5cblxuZXhwb3J0IGNvbnN0IHV1aWR2NCA9ICgpID0+IHtcbiAgICByZXR1cm4gXCIxMDAwMDAwMC0xMDAwLTQwMDAtODAwMC0xMDAwMDAwMDAwMDBcIi5yZXBsYWNlKC9bMDE4XS9nLCBjID0+XG4gICAgICAgICgrYyBeIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMSkpWzBdICYgMTUgPj4gK2MgLyA0KS50b1N0cmluZygxNilcbiAgICApO1xufVxuXG4vLyBDb252ZXJ0IFVVSUQgc3RyaW5nIHRvIGJ5dGVzXG5leHBvcnQgY29uc3QgdXVpZFRvQnl0ZXMgPSAodXVpZDogc3RyaW5nKTogVWludDhBcnJheSA9PiB7XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShcbiAgICAgICAgdXVpZC5yZXBsYWNlKC8tL2csICcnKS5tYXRjaCgvLnsxLDJ9L2cpIS5tYXAoYnl0ZSA9PiBwYXJzZUludChieXRlLCAxNikpXG4gICAgKTtcbn07XG5cbi8vIENvbnZlcnQgYnl0ZXMgdG8gVVVJRCBzdHJpbmdcbmV4cG9ydCBjb25zdCBieXRlc1RvVXVpZCA9IChieXRlczogVWludDhBcnJheSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgaGV4ID0gWy4uLmJ5dGVzXS5tYXAoYiA9PiBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKTtcbiAgICByZXR1cm4gW1xuICAgICAgICBoZXguc2xpY2UoMCwgOCksXG4gICAgICAgIGhleC5zbGljZSg4LCAxMiksXG4gICAgICAgIGhleC5zbGljZSgxMiwgMTYpLFxuICAgICAgICBoZXguc2xpY2UoMTYsIDIwKSxcbiAgICAgICAgaGV4LnNsaWNlKDIwKVxuICAgIF0uam9pbignLScpO1xufTtcblxuLy8gQmFzZTY0IFVSTC1zYWZlIGVuY29kZVxuZXhwb3J0IGNvbnN0IGJhc2U2NFVybEVuY29kZSA9IChieXRlczogVWludDhBcnJheSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgYmFzZTY0ID0gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmJ5dGVzKSk7XG4gICAgcmV0dXJuIGJhc2U2NC5yZXBsYWNlKC9cXCsvZywgJy0nKS5yZXBsYWNlKC9cXC8vZywgJ18nKS5yZXBsYWNlKC89KyQvLCAnJyk7XG59O1xuXG4vLyBCYXNlNjQgVVJMLXNhZmUgZGVjb2RlXG5leHBvcnQgY29uc3QgYmFzZTY0VXJsRGVjb2RlID0gKHN0cjogc3RyaW5nKTogVWludDhBcnJheSA9PiB7XG4gICAgbGV0IGJhc2U2NCA9IHN0ci5yZXBsYWNlKC8tL2csICcrJykucmVwbGFjZSgvXy9nLCAnLycpO1xuICAgIHdoaWxlIChiYXNlNjQubGVuZ3RoICUgNCkgYmFzZTY0ICs9ICc9JztcbiAgICBjb25zdCBiaW5hcnkgPSBhdG9iKGJhc2U2NCk7XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShiaW5hcnksIGNoYXIgPT4gY2hhci5jaGFyQ29kZUF0KDApKTtcbn07XG5cbi8vIENvbXByZXNzIGFuIGFycmF5IG9mIFVVSURzIGludG8gYSBzaG9ydCBVUkwtc2FmZSBzdHJpbmdcbmV4cG9ydCBjb25zdCBjb21wcmVzc1VVSURzID0gKHV1aWRzOiBzdHJpbmdbXSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgYWxsQnl0ZXMgPSB1dWlkcy5mbGF0TWFwKHV1aWQgPT4gQXJyYXkuZnJvbSh1dWlkVG9CeXRlcyh1dWlkKSkpO1xuICAgIHJldHVybiBiYXNlNjRVcmxFbmNvZGUobmV3IFVpbnQ4QXJyYXkoYWxsQnl0ZXMpKTtcbn07XG5cbi8vIERlY29tcHJlc3MgZnJvbSBVUkwtc2FmZSBzdHJpbmcgYmFjayB0byBhbiBhcnJheSBvZiBVVUlEc1xuZXhwb3J0IGNvbnN0IGRlY29tcHJlc3NVVUlEcyA9IChlbmNvZGVkOiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XG4gICAgY29uc3QgYnl0ZXMgPSBiYXNlNjRVcmxEZWNvZGUoZW5jb2RlZCk7XG4gICAgaWYgKGJ5dGVzLmxlbmd0aCAlIDE2ICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaW5wdXQgbGVuZ3RoJyk7XG5cbiAgICBjb25zdCB1dWlkczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAxNikge1xuICAgICAgICB1dWlkcy5wdXNoKGJ5dGVzVG9VdWlkKGJ5dGVzLnNsaWNlKGksIGkgKyAxNikpKTtcbiAgICB9XG4gICAgcmV0dXJuIHV1aWRzO1xufTtcbiIsICJleHBvcnQgKiBmcm9tICcuL3V1aWQudHMnXG5cbmV4cG9ydCBjb25zdCB3YWl0ID0gKG1zOiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vaG9zdFwiO1xuaW1wb3J0IHtJUmVmQ29uZmlnfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBNZXNzYWdlRGlyZWN0aW9uIHtcbiAgICBzdGF0aWMgZG93biA9ICdkb3duJyBhcyBjb25zdFxuICAgIHN0YXRpYyB1cCA9ICd1cCcgYXMgY29uc3Rcbn1cblxuZXhwb3J0IHR5cGUgTWVzc2FnZURpcmVjdGlvbk9wdGlvbiA9ICd1cCcgfCAnZG93bic7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcE1lc3NhZ2U8VCA9IGFueT4ge1xuICAgIGlkID0gdXVpZHY0KClcblxuICAgIHN0YXRpYyBjcmVhdGU8VCwgVSBleHRlbmRzIG5ldyAoLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFU+KSA9PiBUID0gdHlwZW9mIHRoaXM+KFxuICAgICAgICB0aGlzOiBVLFxuICAgICAgICAuLi5hcmdzOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8VT5cbiAgICApOiBJbnN0YW5jZVR5cGU8dHlwZW9mIHRoaXM+IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gbmV3IHRoaXMoLi4uYXJncyk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ21lZXNhZ2UgaWQgY3JlYXRlZCcsIHRoaXMuaWQsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO1xuICAgIH1cblxuICAgIG15b3AgPSB0cnVlXG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXkgfCBzdHJpbmc7XG5cbiAgICBjb250ZW50PzogVFxuXG4gICAgLy8gVE9ETyA6IGNhbnQgYmUgb3B0aW9uYWwgXG4gICAgc291cmNlPzogc3RyaW5nXG4gICAgZGVzdGluYXRpb24/OiBzdHJpbmdcblxuICAgIHJvdXRlPzogc3RyaW5nW11cblxuICAgIHJlZj86IFJlZlxuXG4gICAgZGlyZWN0aW9uPzogTWVzc2FnZURpcmVjdGlvbk9wdGlvblxuXG4gICAgY2xlYW5hYmxlOiBib29sZWFuID0gZmFsc2VcblxuICAgIGlzVHlwZW9mKG1zZzogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBtc2cubWVzc2FnZVR5cGUgPT09IHRoaXMubWVzc2FnZVR5cGVcbiAgICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNeW9wRWxlbWVudE1lc3NhZ2U8VCA9IGFueT4gZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8VD4ge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZikge1xuICAgICAgICBzdXBlcigpXG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEJpbmRNZXNzYWdlPFQgPSBhbnksIFIgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2UgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcblxuICAgIHB1YmxpYyBhYnN0cmFjdCByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5O1xuXG4gICAgcHVibGljIGhhbmRsZXJVbmlxdWVJZCA9IHV1aWR2NCgpXG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgaGFuZGxlcjogKG1lc3NhZ2U6IFIpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlZiB7XG4gICAgcHVibGljIG15b3AgPSB0cnVlO1xuXG4gICAgcHVibGljIF9fbm9uUHJveGllZD86IFJlZjtcblxuICAgIHN0YXRpYyBjcmVhdGUoc2VsZWN0b3I6IHN0cmluZywgcmVmQ29uZmlnPzogSVJlZkNvbmZpZywgY29tcG9uZW50PzogSU15b3BDb21wb25lbnQpIHtcbiAgICAgICAgbGV0IF9yZWZDb25maWcgPSByZWZDb25maWc7XG4gICAgICAgIGlmICghX3JlZkNvbmZpZykge1xuICAgICAgICAgICAgX3JlZkNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBpZDogJycsXG4gICAgICAgICAgICAgICAgbmFtZTogJycsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yVHlwZTogJ2lkLWF0dHJpYnV0ZScsXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgICAgICAgICAgICAgIGJlaGF2aW9yOiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjb2RlJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gYXMgSVJlZkNvbmZpZ1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVmKF9yZWZDb25maWcsIGNvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZkNvbmZpZzogSVJlZkNvbmZpZywgcHVibGljIGNvbXBvbmVudD86IElNeW9wQ29tcG9uZW50KSB7XG4gICAgICAgIHRoaXMuX19ub25Qcm94aWVkID0ge1xuICAgICAgICAgICAgLi4udGhpcyxcbiAgICAgICAgICAgIGNvbXBvbmVudDogbnVsbCAvLyBpbiBvcmRlciB0byBiZSBzZXJpYWxpemFibGVcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0NsaWNrUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEJpbmRDbGlja01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgQ2xpY2tSZXBsYXlNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdCaW5kQ2xpY2tNZXNzYWdlJztcbiAgICBjbGVhbmFibGUgPSB0cnVlO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBoYW5kbGVyOiAobWVzc2FnZTogQ2xpY2tSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENsaWNrUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dE1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8c3RyaW5nPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9ICdDaGFuZ2VUZXh0TWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIHRleHQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSB0ZXh0XG4gICAgfVxufSIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJ1xuXG5jb25zdCBmdW5jdGlvbkJvZHlSZWdleCA9IC8oPzpmdW5jdGlvblxccypcXHcqXFxzKlxcKFteKV0qXFwpXFxzKlxceyhbXFxzXFxTXSo/KVxcfXwoXFwoW14pXSpcXClcXHMqPT5cXHMqXFx7KFtcXHNcXFNdKj8pXFx9KSlcXHMqJC87XG5jb25zdCBleHByZXNzaW9uQm9keVJlZ2V4ID0gL1xcKFxccypbXildK1xccypcXClcXHMqPT5cXHMqKC4rKS87XG5cbmV4cG9ydCBjb25zdCBzdHJpcEZ1bmN0aW9uID0gKGNvbnRlbnQ6IHN0cmluZykgPT4ge1xuICAgIGxldCBtYXRjaCA9IGNvbnRlbnQubWF0Y2goZnVuY3Rpb25Cb2R5UmVnZXgpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4gbWF0Y2hbMV0gfHwgbWF0Y2hbM107XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IG1hdGNoID0gY29udGVudC5tYXRjaChleHByZXNzaW9uQm9keVJlZ2V4KTtcbiAgICAgICAgaWYgKG1hdGNoKVxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdLnRyaW0oKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIHNjcmlwdElucHV0cyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuXG59IHwge307XG5cbmV4cG9ydCB0eXBlIHNjcmlwdFZhcnM8VD4gPSB7XG4gICAgc2VuZDogKGRhdGE6IFQpID0+IHZvaWQ7XG4gICAgLy8gY29tcGxldGVTdHJlYW06ICgpID0+IHZvaWQ7XG4gICAgcm9vdFJlZjogUm9vdFJlZjtcbiAgICBtYWtlU2VyaWFsaXphYmxlOiB0eXBlb2YgbWFrZVNlcmlhbGl6YWJsZVxufVxuXG5leHBvcnQgdHlwZSBleHRlbmRlZFNjcmlwdFZhcnM8VCwgST4gPSB7XG4gICAgW0sgaW4ga2V5b2YgSV06IElbS107XG59ICYgc2NyaXB0VmFyczxUPlxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdE1lc3NhZ2U8VCA9IGFueSwgSSBleHRlbmRzIHNjcmlwdElucHV0cyA9IGFueT4gZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8c3RyaW5nLCBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+PiB7XG5cbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbiAgICBtZXNzYWdlVHlwZSA9ICdFeGVjdXRlU2NyaXB0TWVzc2FnZSc7XG4gICAgc2NyaXB0OiBzdHJpbmcgPSAnJ1xuXG4gICAgc3RhdGljIHJlcGxpZXJLZXkgPSAnc2VuZCc7XG4gICAgc3RhdGljIGNvbXBsZXRlU3RyZWFtS2V5ID0gJ2NvbXBsZXRlU3RyZWFtJztcblxuICAgIGNvbnN0cnVjdG9yKHNjcmlwdDogKHZhcnM6IGV4dGVuZGVkU2NyaXB0VmFyczxULCBJPikgPT4gVCwgaGFuZGxlcjogKG1lc3NhZ2U6IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VD4pID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgfSwgcHVibGljIHNjcmlwdElucHV0cz86IEkpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgICAgIHRoaXMuc2NyaXB0ID0gc2NyaXB0LnRvU3RyaW5nKCk7XG5cbiAgICAgICAgLy9UT0RPOiBjYW4gYmUgcmVtb3ZlXG4gICAgICAgIHRoaXMuY29udGVudCA9IHNjcmlwdC50b1N0cmluZygpXG4gICAgICAgIHRoaXMuY29udGVudCA9IHN0cmlwRnVuY3Rpb24odGhpcy5jb250ZW50KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPFQ+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIGNvbnRlbnQ6IFQpIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgICBFeGVjdXRlU2NyaXB0TWVzc2FnZSxcbiAgICBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlLFxuICAgIGV4dGVuZGVkU2NyaXB0VmFycyxcbiAgICBzY3JpcHRJbnB1dHMsIHN0cmlwRnVuY3Rpb25cbn0gZnJvbSBcIi4vRXhlY3V0ZVNjcmlwdE1lc3NhZ2UudHNcIjtcblxuZXhwb3J0IHR5cGUgY3VzdG9tUmVmU2NyaXB0SW5wdXRzID0ge1xuICAgIGVsZW1lbnRJZDogc3RyaW5nLFxuICAgIHJlZj86IEhUTUxFbGVtZW50LFxuICAgIF9zY3JpcHQ/OiBzdHJpbmcsXG4gICAgX19zY3JpcHRJbnB1dHM/OiBPYmplY3Rcbn07XG5cbmV4cG9ydCBjbGFzcyBDdXN0b21SZWZNZXNzYWdlPFQgPSBhbnksIEkgZXh0ZW5kcyBzY3JpcHRJbnB1dHMgPSBjdXN0b21SZWZTY3JpcHRJbnB1dHM+IGV4dGVuZHMgRXhlY3V0ZVNjcmlwdE1lc3NhZ2U8VCwgSSAmIGN1c3RvbVJlZlNjcmlwdElucHV0cz4ge1xuXG4gICAgY29uc3RydWN0b3Ioc2NyaXB0OiAodmFyczogZXh0ZW5kZWRTY3JpcHRWYXJzPFQsIEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHM+KSA9PiBULFxuICAgICAgICAgICAgICAgIHB1YmxpYyBzY3JpcHRJbnB1dHM6IEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHMsXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogKG1lc3NhZ2U6IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VD4pID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgfSkge1xuXG4gICAgICAgIC8vbW9jayB2YXJzXG4gICAgICAgIC8vIGxldCByb290UmVmLCBlbGVtZW50SWQsIF9zY3JpcHQsIF9fc2NyaXB0SW5wdXRzO1xuICAgICAgICBzdXBlcigoe3Jvb3RSZWYsIGVsZW1lbnRJZCwgX3NjcmlwdCwgX19zY3JpcHRJbnB1dHN9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWZzID0gKHJvb3RSZWYuc2hhZG93Um9vdCB8fCByb290UmVmLmNvbnRhaW5lcikucXVlcnlTZWxlY3RvckFsbChgWyR7J215b3AtaWQnfT0nJHtlbGVtZW50SWR9J11gKTtcbiAgICAgICAgICAgIGlmIChyZWZzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vICBjb25zdCByZWYgPSByZWZzWzBdO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgZXhwb3NpbmcgXCJyZWZzXCIgYW5kIG5vdCBvbmx5IFwicmVmXCJcbiAgICAgICAgICAgICAgICAvL2ZvciBjYXNlcyB3aGVyZSB0aGUgUmVmIGhhcyBtdWx0aXBsYXRlIGltcGxlbWVudGF0aW9uc1xuXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIF9fc2NyaXB0SW5wdXRzLnJlZiA9IHJlZnNbMF07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkeW5hbWljRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oYHJldHVybiAoJHtfc2NyaXB0fSkoLi4uYXJndW1lbnRzKWApO1xuICAgICAgICAgICAgICAgIHJldHVybiBkeW5hbWljRnVuY3Rpb24oX19zY3JpcHRJbnB1dHMpO1xuXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIC8vcmV0dXJuIEZ1bmN0aW9uKCdyZWYnLCAncm9vdFJlZicsIC4uLk9iamVjdC5rZXlzKF9fc2NyaXB0SW5wdXRzKSwgX3NjcmlwdCEpKHJlZiwgcm9vdFJlZiwgLi4uT2JqZWN0LnZhbHVlcyhfX3NjcmlwdElucHV0cykpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbCBhcyBUO1xuICAgICAgICB9LCBoYW5kbGVyKTtcblxuICAgICAgICB0aGlzLnNjcmlwdElucHV0cyA9IHtcbiAgICAgICAgICAgIC4uLnNjcmlwdElucHV0cyxcbiAgICAgICAgICAgIC8vX3NjcmlwdDogc3RyaXBGdW5jdGlvbihzY3JpcHQudG9TdHJpbmcoKSksXG4gICAgICAgICAgICBfc2NyaXB0OiBzY3JpcHQudG9TdHJpbmcoKVxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXJpYWxpemFibGUsIFNlcmlhbGl6YWJsZVNrZWxldG9ufSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U8VCBleHRlbmRzIGtleW9mIEhUTUxFbGVtZW50RXZlbnRNYXAgPSBrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwPiBleHRlbmRzIE15b3BCaW5kTWVzc2FnZSB7XG5cbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbiAgICBtZXNzYWdlVHlwZSA9ICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZSc7XG4gICAgY2xlYW5hYmxlID0gdHJ1ZTtcbiAgICBzZXJpYWxpemFibGVTa2VsZXRvbjogU2VyaWFsaXphYmxlU2tlbGV0b248SFRNTEVsZW1lbnRFdmVudE1hcFtUXT4gPSBmYWxzZSAvLyB7fSAvLyBlbXB0eVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBwdWJsaWMgdHlwZTogVCwgcHVibGljIGhhbmRsZXI6IChtZXNzYWdlOiBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpXG4gICAgfVxuXG4gICAgd2l0aFNlcmlhbGl6YWJsZVNrZWxldG9uKHNlcmlhbGl6YWJsZVNrZWxldG9uOiBTZXJpYWxpemFibGVTa2VsZXRvbjxIVE1MRWxlbWVudEV2ZW50TWFwW1RdPikge1xuICAgICAgICB0aGlzLnNlcmlhbGl6YWJsZVNrZWxldG9uID0gc2VyaWFsaXphYmxlU2tlbGV0b247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIGU6IFNlcmlhbGl6YWJsZTxFdmVudD4pIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0ge1xuICAgICAgICAgICAgZVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBSZWYsfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG5cbmV4cG9ydCBjbGFzcyBTZXRBdHRyaWJ1dGVNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcblxuICAgIG1lc3NhZ2VUeXBlID0gJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBwdWJsaWMgbmFtZTogc3RyaW5nLCBwdWJsaWMgdmFsdWU6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NlcmlhbGl6YWJsZX0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIGhhbmRsZXI6IChtZXNzYWdlOiBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgRm9ybURhdGFFbnRyeSA9IHtcbiAgICBpZD86IHN0cmluZyxcbiAgICBuYW1lPzogc3RyaW5nLFxuICAgIHZhbHVlPzogSW5wdXRFbGVtZW50VmFsdWUsXG4gICAgcmVxdWlyZWQ/OiBib29sZWFuLFxuICAgIHZhbGlkaXR5PzogU2VyaWFsaXphYmxlPFZhbGlkaXR5U3RhdGU+LFxuICAgIG15b3BJZD86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBJbnB1dEVsZW1lbnRGb3JtVmFsdWUgPSB7XG4gICAgZm9ybURhdGE/OiB7IFtrZXk6IHN0cmluZ106IEZvcm1EYXRhRW50cnkgfVxuICAgIHVubWFwcGVkRGF0YT86IEZvcm1EYXRhRW50cnlbXVxufTtcblxuZXhwb3J0IHR5cGUgSW5wdXRFbGVtZW50VmFsdWUgPSBzdHJpbmcgfCBJbnB1dEVsZW1lbnRGb3JtVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkXG5cbmV4cG9ydCBjbGFzcyBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZW50OiBJbnB1dEVsZW1lbnRWYWx1ZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cblxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRJbm5lckh0bWwgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8c3RyaW5nPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRJbm5lckh0bWwnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBpbm5lckh0bWw6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBpbm5lckh0bWxcbiAgICB9XG59IiwgImltcG9ydCB7IEJhc2VNeW9wTWVzc2FnZSB9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbi8vIHNlbnQgYnkgaG9zdCB0byBjb21wb25lbnRzLCBjb250YWlucyB0aGllciBpZCBcbmV4cG9ydCBjbGFzcyBJbml0TWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTx7IGlkOiBzdHJpbmcgfT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0luaXRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSB7IGlkIH1cbiAgICB9XG5cbiAgICBpc1R5cGVvZihtc2c6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuXG4vLyBjb21wb25lbnQgbm90aWZ5IGhvc3QgdGhlIGl0IHdhcyBpbml0YXRlZCBcbmV4cG9ydCBjbGFzcyBJbml0UmVzcG9uc2UgZXh0ZW5kcyBJbml0TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnSW5pdFJlc3BvbnNlJztcbn1cblxuLy8gY29tcG9uZW50IGFzayB0byBob3N0IHRvIGdldCBpbml0YXRlZCBcbmV4cG9ydCBjbGFzcyBJbml0UmVxdWVzdCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnSW5pdFJlcXVlc3QnO1xufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50Q29uZmlnLCBJUmVmQ29uZmlnfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0L2hvc3RTREsudHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZkNvbmZpZzogSVJlZkNvbmZpZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgbmVzdGVkQ29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvcHRpb25zOiBsb2FkZXJPcHRpb25zLFxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IChtZXNzYWdlOiBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSkgPT4gdm9pZCxcbiAgICApIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG5cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIE5lc3RlZFJlZiA9IHtcbiAgICByZWZOYW1lOiBzdHJpbmcsXG4gICAgY29tcG9uZW50RGVmaW5pdGlvbklkOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIG5lc3RlZFJlZnM6IE5lc3RlZFJlZltdLCBwdWJsaWMgZmFpbGVkPzogYm9vbGVhbikge1xuICAgICAgICBzdXBlcihyZXBsYXlUb0hhbmRsZXIpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIEVudmVsb3BlZE1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0VudmVsb3BlZE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGRlc3RpbmF0aW9uOiBzdHJpbmcsIHB1YmxpYyBtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICBjb25zdCBpbm5lckVudmVsb3BlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBFbnZlbG9wZWRNZXNzYWdlKTtcbiAgICAgICAgdGhpcy5yb3V0ZSA9IFtkZXN0aW5hdGlvbiwgLi4uaW5uZXJFbnZlbG9wZWRNZXNzYWdlLnJvdXRlID8gaW5uZXJFbnZlbG9wZWRNZXNzYWdlLnJvdXRlIDogW11dO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge0lFbGVtZW50UmVmfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8YW55LCBEZXRlY3RlZE15b3BSZWZzTWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0RldGVjdE15b3BSZWZzTWVzc2FnZSdcbiAgICByZXBseU1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5O1xufVxuXG5leHBvcnQgY2xhc3MgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2U8SUVsZW1lbnRSZWZbXT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcjogc3RyaW5nLCBteW9wRWxlbWVudFJlZnM6IElFbGVtZW50UmVmW10pIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBteW9wRWxlbWVudFJlZnM7XG4gICAgfVxuXG4gICAgaXNUeXBlb2YobXNnOiBCYXNlTXlvcE1lc3NhZ2U8YW55Pik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEdldEF0dHJpYnV0ZU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnR2V0QXR0cmlidXRlTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIHB1YmxpYyBuYW1lOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRlbnQ6IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vaG9zdFwiO1xuXG50eXBlIE1ldGhvZE5hbWVzPFQ+ID0ge1xuICAgIC8vIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgPyBLIDogbmV2ZXI7XG4gICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyAoKSA9PiB2b2lkID8gSyA6IG5ldmVyO1xufVtrZXlvZiBUXTtcblxuLy8gRGVmaW5lIGEgdHlwZSB0aGF0IGFsbG93cyBvbmx5IHN0cmluZ3MgY29ycmVzcG9uZGluZyB0byB0aGUgbWV0aG9kIG5hbWVzIG9mIFRcbnR5cGUgTWV0aG9kU3RyaW5nPFQ+ID0gTWV0aG9kTmFtZXM8VD4gZXh0ZW5kcyBpbmZlciBNID8gTSBleHRlbmRzIHN0cmluZyA/IE0gOiBuZXZlciA6IG5ldmVyO1xuXG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdFeGVjdXRlQ29tcG9uZW50TWV0aG9kJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXRob2Q6IE1ldGhvZFN0cmluZzxJTXlvcENvbXBvbmVudD4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJztcbn1cblxuZXhwb3J0IGNsYXNzIE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG59IiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0NsZWFudXBSZXBsYXlNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgQ2xlYW51cE1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgQ2xlYW51cFJlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0NsZWFudXBNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjbGVhbnVwRm9yTWVzc2FnZUlkOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBDbGVhbnVwUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGVhbnVwUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY3VzdG9tQ2xlYW51cDogYm9vbGVhbikge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIERpc3Bvc2VNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdEaXNwb3NlTWVzc2FnZSc7XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBjbGVhbmFibGUgPSB0cnVlO1xuICAgIG1lc3NhZ2VUeXBlID0gJ1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSc7XG59XG5cbmV4cG9ydCBjbGFzcyBSZXNpemVPYnNlcnZlck1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSc7XG59IiwgImV4cG9ydCAqIGZyb20gJy4vQmFzZU1lc3NhZ2UnO1xuXG4vL3VzZXIncyBtZXNzYWdlc1xuZXhwb3J0ICogZnJvbSAnLi9CaW5kQ2xpY2tNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ2hhbmdlVGV4dE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9FeGVjdXRlU2NyaXB0TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0N1c3RvbVJlZk1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9BZGRFdmVudExpc3RlbmVyTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL1NldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9HZXRFbGVtZW50VmFsdWVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vU2V0SW5uZXJIdG1sJztcblxuLy9zeXN0ZW0gbWVzc2FnZXNcbmV4cG9ydCAqIGZyb20gJy4vSW5pdE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRW52ZWxvcGVkTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0RldGVjdE15b3BSZWZzTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAgJy4vR2V0QXR0cmlidXRlTWVzc2FnZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50TWVzc2FnZXMvRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCc7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudE1lc3NhZ2VzL1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ2xlYW51cE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9EaXNwb3NlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudE1lc3NhZ2VzL1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSc7IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXksIE15b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIERpc3Bvc2VNZXNzYWdlLCBFeGVjdXRlQ29tcG9uZW50TWV0aG9kLCBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIENsZWFudXBNZXNzYWdlLCBDbGVhbnVwUmVwbGF5TWVzc2FnZSxcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZcbn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtIb3N0U0RLLCBsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuXG4vKipcbiAqIFJlc3VsdCByZXR1cm5lZCBieSBvYnNlcnZlQXV0b1NpemUgY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRvU2l6ZVJlc3VsdCB7XG4gICAgLyoqIEN1cnJlbnQgd2lkdGggKGZyb20gY29udGVudCkgKi9cbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIC8qKiBDdXJyZW50IGhlaWdodCAoZnJvbSBjb250ZW50KSAqL1xuICAgIGhlaWdodDogbnVtYmVyO1xuICAgIC8qKiBXaGV0aGVyIHdpZHRoIGlzIGJlaW5nIGF1dG8tc2l6ZWQgKi9cbiAgICBhdXRvU2l6aW5nV2lkdGg6IGJvb2xlYW47XG4gICAgLyoqIFdoZXRoZXIgaGVpZ2h0IGlzIGJlaW5nIGF1dG8tc2l6ZWQgKi9cbiAgICBhdXRvU2l6aW5nSGVpZ2h0OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIG9ic2VydmVBdXRvU2l6ZSBtZXRob2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRvU2l6ZU9wdGlvbnMge1xuICAgIC8qKiBDYWxsYmFjayBjYWxsZWQgd2l0aCBzaXplIGluZm8gd2hlbmV2ZXIgc2l6ZSBjaGFuZ2VzICovXG4gICAgb25TaXplQ2hhbmdlPzogKHJlc3VsdDogQXV0b1NpemVSZXN1bHQpID0+IHZvaWQ7XG4gICAgLyoqIE1pbmltdW0gd2lkdGggY29uc3RyYWludCAqL1xuICAgIG1pbldpZHRoPzogbnVtYmVyIHwgc3RyaW5nO1xuICAgIC8qKiBNYXhpbXVtIHdpZHRoIGNvbnN0cmFpbnQgKi9cbiAgICBtYXhXaWR0aD86IG51bWJlciB8IHN0cmluZztcbiAgICAvKiogTWluaW11bSBoZWlnaHQgY29uc3RyYWludCAqL1xuICAgIG1pbkhlaWdodD86IG51bWJlciB8IHN0cmluZztcbiAgICAvKiogTWF4aW11bSBoZWlnaHQgY29uc3RyYWludCAqL1xuICAgIG1heEhlaWdodD86IG51bWJlciB8IHN0cmluZztcbiAgICAvKiogRXhwbGljaXQgd2lkdGggc2V0IGJ5IGhvc3QgLSBpZiBkZWZpbmVkLCBkb24ndCBhdXRvLXNpemUgd2lkdGggKi9cbiAgICBleHBsaWNpdFdpZHRoPzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIC8qKiBFeHBsaWNpdCBoZWlnaHQgc2V0IGJ5IGhvc3QgLSBpZiBkZWZpbmVkLCBkb24ndCBhdXRvLXNpemUgaGVpZ2h0ICovXG4gICAgZXhwbGljaXRIZWlnaHQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgLyoqIEZvcmNlIGF1dG8tc2l6ZSBldmVuIGlmIGNvbnRhaW5lciBoYXMgZGltZW5zaW9ucyAqL1xuICAgIGZvcmNlQXV0b1NpemU/OiBib29sZWFuO1xuICAgIC8qKiBNaW4gaGVpZ2h0IHVzZWQgYnkgbG9hZGVyIHRvIGRldGVjdCBjb2xsYXBzZSAoZGVmYXVsdDogNTApICovXG4gICAgbG9hZGVyTWluSGVpZ2h0PzogbnVtYmVyO1xufVxuXG4vL1RPRE8gOiBjaGFuZ2UgSU15b3BDb21wb25lbnQgdG8gcmVmIHNwZWNpZmljIGltcGxcbnR5cGUgUmVmVHlwZXMgPSB7XG4gICAgW2tleTogc3RyaW5nXTogSU15b3BDb21wb25lbnQgfCBSZWZcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU15b3BDb21wb25lbnQ8UCA9IGFueSwgUiA9IGFueT4ge1xuXG4gICAgaWQ6IHN0cmluZztcblxuICAgIGlzSW5pdGlhdGVkOiBib29sZWFuO1xuXG4gICAgbWFya2VkRm9yRGlzcG9zZWQ6IGJvb2xlYW47XG5cbiAgICBzZXRJbml0aWF0ZWQ6ICgpID0+IHZvaWRcblxuICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG5cbiAgICBjb250YWluZXI6IEhUTUxFbGVtZW50XG5cbiAgICAvL3JlZiBjb21wb25lbnRzIGNhbiBiZSBlbGVtZW50LWxlc3NcbiAgICBlbGVtZW50PzogSFRNTEVsZW1lbnRcblxuICAgIHNlbmQ6IChtc2c6IEJhc2VNeW9wTWVzc2FnZSkgPT4gQ2xlYW51cEhhbmRsZXJcblxuICAgIGJpbmQobWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5LCBoYW5kbGVyOiAoKSA9PiBib29sZWFuKTogdm9pZDtcblxuICAgIGJpbmQ8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4obWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5LCBoYW5kbGVyOiAobWVzc2FnZTogVCkgPT4gYm9vbGVhbik6IHZvaWQ7XG5cbiAgICAvLyBib29sZWFuIHJldHVybmVkIHZhbHVlID0gaGFuZGxlZCBvciBub3RcbiAgICBvbk1lc3NhZ2VSZWNlaXZlZDogKG1zZzogQmFzZU15b3BNZXNzYWdlKSA9PiBib29sZWFuXG5cbiAgICBpbml0aWF0ZWQ6ICgpID0+IFByb21pc2U8YW55PjtcblxuICAgIGRpc3Bvc2U6ICgpID0+IHZvaWRcblxuICAgIGhpZGUoKTogdm9pZDtcblxuICAgIHNob3coKTogdm9pZDtcblxuICAgIGluc3BlY3QoKTogdm9pZDtcblxuICAgIC8qKlxuICAgICAqIE9ic2VydmVzIHRoZSBpZnJhbWUgY29udGVudCBzaXplIGFuZCBhdXRvbWF0aWNhbGx5IHN5bmNzIGl0IHRvIHRoZSBpZnJhbWUgZWxlbWVudC5cbiAgICAgKiBPbmx5IGF2YWlsYWJsZSBmb3IgaWZyYW1lLWJhc2VkIGNvbXBvbmVudHMuIFVzZXMgZGlyZWN0IGNvbnRlbnREb2N1bWVudCBhY2Nlc3MuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgaW5jbHVkaW5nIHNpemUgY2hhbmdlIGNhbGxiYWNrIGFuZCBtaW4vbWF4IGNvbnN0cmFpbnRzXG4gICAgICogQHJldHVybnMgQ2xlYW51cCBmdW5jdGlvbiB0byBzdG9wIG9ic2VydmluZ1xuICAgICAqL1xuICAgIG9ic2VydmVBdXRvU2l6ZT86IChvcHRpb25zPzogQXV0b1NpemVPcHRpb25zKSA9PiBDbGVhbnVwSGFuZGxlcjtcblxuICAgIC8qKlxuICAgICAqIFBhcnNlZCBteW9wOnNpemUgbWV0YSB0YWcgZnJvbSB0aGUgY29tcG9uZW50IEhUTUwuXG4gICAgICogU2V0IGJ5IEhUTUxDb21wb25lbnRMb2FkZXIgYmVmb3JlIGlmcmFtZSBjcmVhdGlvbi5cbiAgICAgKiBVc2VkIGJ5IHRoZSBSZWFjdCBob3N0IHRvIGRldGVybWluZSBzaXppbmcgbW9kZSAoZmlsbCB2cyBjb250ZW50KS5cbiAgICAgKi9cbiAgICBzaXplTWV0YT86IHsgd2lkdGg/OiBzdHJpbmcgfCBudW1iZXI7IGhlaWdodD86IHN0cmluZyB8IG51bWJlcjsgbWluV2lkdGg/OiBudW1iZXI7IG1heFdpZHRoPzogbnVtYmVyOyBtaW5IZWlnaHQ/OiBudW1iZXI7IG1heEhlaWdodD86IG51bWJlciB9IHwgbnVsbDtcblxuICAgIHBhcmVudD86IElNeW9wQ29tcG9uZW50O1xuXG4gICAgcHJvcHM6IFBcblxuICAgIHJlZnM6IFJcbn1cblxuZnVuY3Rpb24gaXNJbmhlcml0RnJvbShvYmo6IGFueSwgYmFzZUNsYXNzOiBhbnkpIHtcbiAgICBpZiAoIW9iaikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTtcblxuICAgIGlmICghcHJvdG8pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChwcm90by5jb25zdHJ1Y3Rvci5uYW1lID09PSBiYXNlQ2xhc3MubmFtZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGlzSW5oZXJpdEZyb20ocHJvdG8sIGJhc2VDbGFzcyk7XG59XG5cbi8vIFRPRE8gOiBtb3ZlIDogXG50eXBlIG1lc3NhZ2VIYW5kbGVyPFQ+ID0gKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW47XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcENvbXBvbmVudDxQID0gYW55LCBSIGV4dGVuZHMgUmVmVHlwZXMgPSBSZWZUeXBlcz4gaW1wbGVtZW50cyBJTXlvcENvbXBvbmVudDxQPiB7XG4gICAgaWQ6IHN0cmluZyA9ICcnXG5cbiAgICBtZXNzYWdlSGFuZGxlcnM6IFJlY29yZDxzdHJpbmcsIG1lc3NhZ2VIYW5kbGVyPGFueT5bXT4gPSB7fTtcblxuICAgIGVsZW1lbnQ/OiBIVE1MRWxlbWVudFxuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgcHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaWQgPSBvcHRpb25zPy5pZCB8fCBIb3N0U0RLLkluc3RhbmNlKCkuYXNzaWduSWQoY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBvcHRpb25zPy50aW1lb3V0ID8gb3B0aW9ucz8udGltZW91dCA6IDUgKiAxMDAwO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0luaXRpYXRlZCAmJiB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0ICYmICF0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QoYHRpbWVvdXRfJHt0aW1lb3V0fSAke3RoaXMuaWR9YCk7XG5cbiAgICAgICAgICAgICAgICAvLyBBIFRJTUVELU9VVCBDT01QT05FTlQgTVVTVCBVTlJFR0lTVEVSIElUU0VMRiAtLSBOT0JPRFkgRUxTRSBDQU4uXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvLyBob3N0U0RLLmxvYWRDb21wb25lbnQgcmVqZWN0cyB3aXRoIHRoaXMgc2FtZSBlcnJvciwgc28gdGhlIGNhbGxlciBuZXZlclxuICAgICAgICAgICAgICAgIC8vIHJlY2VpdmVzIHRoZSBjb21wb25lbnQgYW5kIGhhcyBubyBoYW5kbGUgdG8gZGlzcG9zZS4gV2l0aG91dCB0aGlzIHRoZVxuICAgICAgICAgICAgICAgIC8vIGhvc3Qga2VlcHMgaXQgaW4gYGNvbXBvbmVudHNgIEFORCBgY29tcG9uZW50czJpbml0YCBmb3IgdGhlIGxpZmUgb2YgdGhlXG4gICAgICAgICAgICAgICAgLy8gcGFnZSwgYW5kIHRoYXQgY29zdCBjb21wb3VuZHM6IGBjb21wb25lbnRzMmluaXRgIGlzIHdhbGtlZCBvbiBldmVyeVxuICAgICAgICAgICAgICAgIC8vIEluaXRSZXF1ZXN0LCBgaXNUcnVzdGVkU291cmNlYCB3YWxrcyBib3RoIGFycmF5cyBvbiBldmVyeSBtZXNzYWdlLCBhbmQgYVxuICAgICAgICAgICAgICAgIC8vIFVJIHRoYXQgcmV0cmllcyAtLSBhIHJlZWwgcGlja2VyLCBhIGRpYWxvZyByZW9wZW5lZCBwZXIgdGVtcGxhdGUgLS0gYWRkc1xuICAgICAgICAgICAgICAgIC8vIGEgZGVhZCBlbnRyeSBlYWNoIGF0dGVtcHQuXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvLyBkaXNwb3NlKCkgaXMgdGhlIGNvaGVyZW50IGVuZCBzdGF0ZTogaXQgdW5yZWdpc3RlcnMgdGhyb3VnaCB0aGUgaG9zdCdzXG4gICAgICAgICAgICAgICAgLy8gJ29uRGlzcG9zZScgaGFuZGxlciBhbmQgZHJvcHMgdGhlIGZyYW1lIHRoYXQgbmV2ZXIgYW5zd2VyZWQuXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRpbWVvdXQpO1xuXG4gICAgICAgIC8vIFRPRE8gOiBhdXRvIGluc3BlY3QsIGNvbnRyb2wgZnJvbSBjb25maWdcbiAgICAgICAgdGhpcy5pbml0aWF0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGlmICh3aW5kb3cubXlvcC5ob3N0U0RLLmluc3BlY3RlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5zcGVjdCgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9tYXJrZWRGb3JEaXNwb3NlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgZ2V0IG1hcmtlZEZvckRpc3Bvc2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFya2VkRm9yRGlzcG9zZWQ7XG4gICAgfVxuXG4gICAgc2V0IG1hcmtlZEZvckRpc3Bvc2VkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uOiBUaGUgY29tcG9uZW50IGlzIGFscmVhZHkgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZGlzcG9zZWQuIERpc3Bvc2Ugb3BlcmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgYWdhaW4gdW50aWwgdGhlIGN1cnJlbnQgZGlzcG9zYWwgcHJvY2VzcyBpcyBjb21wbGV0ZS4nKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX21hcmtlZEZvckRpc3Bvc2VkID0gdmFsdWU7XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgaGlkZSgpOiB2b2lkO1xuXG4gICAgYWJzdHJhY3Qgc2hvdygpOiB2b2lkO1xuXG4gICAgYWJzdHJhY3QgaW5zcGVjdCgpOiBDbGVhbnVwSGFuZGxlcjtcblxuICAgIC8vVE9ETzogdXNlIGJpbmRXaGVuIHdpdGggcmV0dXJuIHRydWUgcHJlZGljYXRlIC4uLlxuICAgIGJpbmQgPSA8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4obWVzc2FnZVR5cGU6IHN0cmluZywgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0pIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXSA9IFtdXG4gICAgICAgIH1cblxuICAgICAgICAvLyBoYW5kbGUgZHVwbGljYXRlIHJlZ2lzdHJhdGlvblxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXS5pbmNsdWRlcyhoYW5kbGVyKSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdLnB1c2goaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBiaW5kV2hlbiA9IDxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPihtZXNzYWdlVHlwZTogc3RyaW5nLCBwcmVkaWNhdGU6IChtZXNzYWdlOiBUKSA9PiBib29sZWFuLCBoYW5kbGVyOiAobWVzc2FnZTogVCkgPT4gdm9pZCk6IENsZWFudXBIYW5kbGVyID0+IHtcbiAgICAgICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhblxcJ3QgdXNlIGNvbXBvbmVudC5iaW5kV2hlbiB3aXRob3V0IGFuIGhhbmRsZXInKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0gPSBbXVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV07XG5cbiAgICAgICAgY29uc3QgcHJlZGljYXRlV3JhcHBlZEhhbmRsZXIgPSAoZTogVCkgPT4ge1xuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZShlKSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIoZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy9UT0RPIDogaGFuZGxlIGR1cGxpY2F0ZSByZWdpc3RyYXRpb24gP1xuICAgICAgICBoYW5kbGVycy5wdXNoKHByZWRpY2F0ZVdyYXBwZWRIYW5kbGVyKTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBoYW5kbGVycy5pbmRleE9mKHByZWRpY2F0ZVdyYXBwZWRIYW5kbGVyKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdvbk1lc3NhZ2VSZWNlaXZlZCcsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYsIGluY29tZU1lc3NhZ2UsIHRoaXMpO1xuICAgICAgICAvL1RPRE8gOiBoYW5kZWwgc3BlY2lhbCBldmV0cyA/IGxpa2UgaW5pdFJlcyA/XG4gICAgICAgIGlmIChpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCkge1xuICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gKGluY29tZU1lc3NhZ2UgYXMgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCk7XG5cbiAgICAgICAgICAgIC8va2VlcGluZyB0aGlzLm1ldGhvZCgpIHNvIHRoYXQgY29udGV4dCB3aWxsIHNhdmVkXG4gICAgICAgICAgICBpZiAoKHRoaXMgYXMgYW55KVt0eXBlZE1lc3NhZ2UubWV0aG9kXSkge1xuICAgICAgICAgICAgICAgICh0aGlzIGFzIGFueSlbdHlwZWRNZXNzYWdlLm1ldGhvZF0odHlwZWRNZXNzYWdlLmNvbnRlbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgbWV0aG9kIG5vdCBmb3VuZCAke3R5cGVkTWVzc2FnZS5tZXRob2R9IG9uIGNvbXBvbmVudGAsIHRoaXMpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyc1tpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlXTtcbiAgICAgICAgaWYgKGhhbmRsZXJzICYmIGhhbmRsZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGhhbmRsZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgaGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVkID0gaGFuZGxlZCB8fCBoYW5kbGVyKGluY29tZU1lc3NhZ2UpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL1RPRE8gOiBjb25zb2xlIG9ubHkgd2hlbiBkZWJ1ZyBjb25maWdcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ25vIGhhbmRsZXJzIGZvdW5kIGZvciAnLCBpbmNvbWVNZXNzYWdlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzZXRJbml0aWF0ZWQgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNJbml0aWF0ZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmICh0aGlzLl93aGVuSW5pdGlhdGVkUmVzb2x2ZSlcbiAgICAgICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgaXNJbml0aWF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIF93aGVuSW5pdGlhdGVkUmVzb2x2ZT86ICh2YWx1ZT86IGFueSkgPT4gYW55O1xuICAgIF93aGVuSW5pdGlhdGVkUmVqZWN0PzogKHZhbHVlPzogYW55KSA9PiBhbnk7XG5cbiAgICBfd2hlbkluaXRpYXRlZDogUHJvbWlzZTxhbnk+ID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QgPSByZWplY3Q7XG4gICAgfSk7XG5cbiAgICBpbml0aWF0ZWQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl93aGVuSW5pdGlhdGVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2VuZENsZWFudXBNZXNzYWdlKG1lc3NhZ2U6IENsZWFudXBNZXNzYWdlKTogdm9pZCB7XG4gICAgICAgIG1lc3NhZ2Uuc291cmNlID0gdGhpcy5pZDtcbiAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IHRoaXMuaWQ7XG4gICAgICAgIG1lc3NhZ2UuZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi5kb3duO1xuXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5iaW5kV2hlbihtZXNzYWdlLnJlcGx5TWVzc2FnZUtleSwgKG1zZzogTXlvcEJpbmRSZXBsYXlNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbXNnLnJlcGxheVRvSGFuZGxlciA9PT0gbWVzc2FnZS5oYW5kbGVyVW5pcXVlSWRcbiAgICAgICAgfSwgKG06IENsZWFudXBSZXBsYXlNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICBtZXNzYWdlLmhhbmRsZXIobSk7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBoYW5kbGVyID0gbWVzc2FnZS5oYW5kbGVyO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGRlbGV0ZSBtZXNzYWdlLmhhbmRsZXJcblxuICAgICAgICB0aGlzLnNlbmQobWVzc2FnZSk7XG5cbiAgICAgICAgbWVzc2FnZS5oYW5kbGVyID0gaGFuZGxlcjtcbiAgICB9XG5cbiAgICBzZW5kKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IENsZWFudXBIYW5kbGVyIHtcbiAgICAgICAgLy9tZXNzYWdlcyB0aGF0IGV4ZXRyYWN0ZWQgZnJvbSBlbnZlbG9wZSBhbHJlYWR5IGhhdmUgc291cmNlIGluIHRoZW1cbiAgICAgICAgaWYgKCFtZXNzYWdlLnNvdXJjZSlcbiAgICAgICAgICAgIG1lc3NhZ2Uuc291cmNlID0gdGhpcy5pZDtcblxuICAgICAgICBpZiAoIW1lc3NhZ2UuZGVzdGluYXRpb24pXG4gICAgICAgICAgICBtZXNzYWdlLmRlc3RpbmF0aW9uID0gdGhpcy5pZDtcblxuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24uZG93bjtcblxuICAgICAgICBsZXQgY2xlYW51cEhhbmRsZXI7XG4gICAgICAgIC8vIFRPRE8gOiBmaXggaGVhdnkgb3AuLlxuICAgICAgICAvLyAgaWYgKGlzSW5oZXJpdEZyb20obWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlKSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmIChtZXNzYWdlLmhhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IChtZXNzYWdlIGFzIE15b3BCaW5kTWVzc2FnZSk7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlciA9IHRoaXMuYmluZFdoZW4odHlwZWRNZXNzYWdlLnJlcGx5TWVzc2FnZUtleSwgKG1zZzogTXlvcEJpbmRSZXBsYXlNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1zZy5yZXBsYXlUb0hhbmRsZXIgPT09IHR5cGVkTWVzc2FnZS5oYW5kbGVyVW5pcXVlSWRcbiAgICAgICAgICAgIH0sIHR5cGVkTWVzc2FnZS5oYW5kbGVyKTtcblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZGVsZXRlIG1lc3NhZ2UuaGFuZGxlclxuICAgICAgICB9XG5cbiAgICAgICAgLy9UT0RPOiB0aGluayBhYm91dCB0aGF0XG4gICAgICAgIGlmIChtZXNzYWdlLnJlZikge1xuICAgICAgICAgICAgLy8gc2VyaWFsaXphYmxlXG4gICAgICAgICAgICBtZXNzYWdlLnJlZiA9IG1lc3NhZ2UucmVmLl9fbm9uUHJveGllZCB8fCBtZXNzYWdlLnJlZjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXNzYWdlLmNsZWFuYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRDbGVhbnVwTWVzc2FnZShuZXcgQ2xlYW51cE1lc3NhZ2UobWVzc2FnZS5pZCwgKHJlcGxheSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBsb2cgcmVwbGF5P1xuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgIGlmIChjbGVhbnVwSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogUnVucyB0aGUgJ29uRGlzcG9zZScgaGFuZGxlcnMgb25jZS4gaG9zdFNESyByZWdpc3RlcnMgdGhlIG9uZSB0aGF0IHVucmVnaXN0ZXJzXG4gICAgICogIHRoaXMgY29tcG9uZW50LCBzbyBpdCBoYXMgdG8gcnVuIG9uIEVWRVJZIGRpc3Bvc2UgcGF0aCwgaW5pdGlhdGVkIG9yIG5vdC4gKi9cbiAgICBwcml2YXRlIHJ1bkRpc3Bvc2VIYW5kbGVycygpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb25EaXNwb3NlSGFuZGxlcnMgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyc1snb25EaXNwb3NlJ107XG4gICAgICAgIGlmIChvbkRpc3Bvc2VIYW5kbGVycykge1xuICAgICAgICAgICAgb25EaXNwb3NlSGFuZGxlcnMuZm9yRWFjaChkaXNwb3NlSGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogc2VuZCBudWxsIG9yIGZpeCB0aGUgdHlwZSA/XG4gICAgICAgICAgICAgICAgZGlzcG9zZUhhbmRsZXIobnVsbCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXJrZWRGb3JEaXNwb3NlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhdGVkKSB7XG4gICAgICAgICAgICAvLyBBIENPTVBPTkVOVCBUSEFUIE5FVkVSIElOSVRJQVRFRCBTVElMTCBIQVMgVE8gQkUgVU5SRUdJU1RFUkVELlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFRoaXMgdXNlZCB0byBgcmV0dXJuYCBoZXJlLCB3aGljaCBsZWFrZWQ6IGhvc3RTREsgdHJhY2tzIGV2ZXJ5IGNvbXBvbmVudCBieVxuICAgICAgICAgICAgLy8gYmluZGluZyBhbiAnb25EaXNwb3NlJyBoYW5kbGVyIHRoYXQgcmVtb3ZlcyBpdCBmcm9tIGBjb21wb25lbnRzYCBhbmRcbiAgICAgICAgICAgIC8vIGBjb21wb25lbnRzMmluaXRgLCBhbmQgdGhvc2UgaGFuZGxlcnMgbGl2ZSBiZWxvdyB0aGlzIGxpbmUuIFNvIGEgY29tcG9uZW50XG4gICAgICAgICAgICAvLyB0aGF0IHRpbWVkIG91dCBhbmQgd2FzIHRoZW4gZGlzcG9zZWQgaGFkIGl0cyBpZnJhbWUgcHVsbGVkIGZyb20gdGhlIERPTVxuICAgICAgICAgICAgLy8gKG15b3BJZnJhbWVDb21wb25lbnQuZGlzcG9zZSBkb2VzIHRoYXQgYWZ0ZXIgc3VwZXIuZGlzcG9zZSkgd2hpbGUgc3RheWluZyBpblxuICAgICAgICAgICAgLy8gYm90aCBob3N0IGFycmF5cyBmb3JldmVyLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFRoYXQgaXMgbm90IGEgc2xvdyBsZWFrLCBpdCBjb21wb3VuZHM6IGBjb21wb25lbnRzMmluaXRgIGlzIHdhbGtlZCBvbiBldmVyeVxuICAgICAgICAgICAgLy8gSW5pdFJlcXVlc3QgYW5kIGBpc1RydXN0ZWRTb3VyY2VgIHdhbGtzIGJvdGggYXJyYXlzIG9uIGV2ZXJ5IG1lc3NhZ2UsIHNvIGVhY2hcbiAgICAgICAgICAgIC8vIGRlYWQgZW50cnkgY29zdHMgYSBgc2VuZCgpYCBpbnRvIGEgcmVtb3ZlZCBmcmFtZSBvbiBldmVyeSBmdXR1cmUgaGFuZHNoYWtlLlxuICAgICAgICAgICAgLy8gUmUtb3BlbmluZyBhIGRpYWxvZyB0aGF0IG1vdW50cyBjb21wb25lbnRzIC0tIFBpYy1UaW1lJ3MgcmVlbCBwaWNrZXIgLS0gYWRkc1xuICAgICAgICAgICAgLy8gb25lIGRlYWQgZW50cnkgcGVyIGF0dGVtcHQuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gT25seSB0aGUgRGlzcG9zZU1lc3NhZ2UgaXMgZ2VudWluZWx5IGNvbmRpdGlvbmFsOiB0aGVyZSBpcyBubyBsaXZlIGZyYW1lIHRvXG4gICAgICAgICAgICAvLyB0ZWxsLiBFdmVyeXRoaW5nIGVsc2UgbXVzdCBydW4uXG4gICAgICAgICAgICB0aGlzLnJ1bkRpc3Bvc2VIYW5kbGVycygpO1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnMgPSB7fTtcbiAgICAgICAgICAgIHRoaXMuaWQgKz0gJ19kaXNwb3NlZCc7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coJ2Rpc3Bvc2luZyBjb21wb25lbnQnLCB0aGlzLmlkKTtcblxuICAgICAgICAvLyAvL1RPRE8gOiBpbXBsZW1lbnQgZGlzcG9zZSBmbG93XG4gICAgICAgIC8vIE9iamVjdC5rZXlzKHRoaXMucmVmcykuZm9yRWFjaChyZWZLZXk9PntcbiAgICAgICAgLy8gICAgIHRoaXMucmVmc1tyZWZLZXldLmRpc3Bvc2UoKTtcbiAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgLy9UT0RPIDogY2hlY2sgaWYgdGhlcmUgaXMgYW55IHRpbWUgZm9yIHRoZSBvXG4gICAgICAgIC8vIHRoZXIgc2lkZSB0byBwcm9jY2VzcyB0byBtZXNzYWdlIGJlZm9yZSBkaWUgP1xuICAgICAgICAvL25vdGlmeSB0aGUgb3RoZXIgc2lkZSBTREtcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBEaXNwb3NlTWVzc2FnZSgpKVxuXG4gICAgICAgIHRoaXMucnVuRGlzcG9zZUhhbmRsZXJzKCk7XG5cbiAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLmNvbnRhaW5lcik7XG4gICAgICAgIC8vdGhpcy5jb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzID0ge31cbiAgICAgICAgdGhpcy5pZCArPSAnX2Rpc3Bvc2VkJztcbiAgICAgICAgdGhpcy5pc0luaXRpYXRlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByb3BzOiBQID0ge30gYXMgdW5rbm93biBhcyBQO1xuICAgIHJlZnM6IFIgPSB7fSBhcyB1bmtub3duIGFzIFI7XG59XG4iLCAiZXhwb3J0IGludGVyZmFjZSBJRWxlbWVudFJlZiB7XG4gICAgbXlvcElkPzogc3RyaW5nXG4gICAgaHRtbFRhZ05hbWU6IHN0cmluZ1xuICAgIEJvdW5kaW5nUmVjdD86IERPTVJlY3RcbiAgICBvZmZzZXRUb3A/OiBudW1iZXJcbiAgICBvZmZzZXRMZWZ0PzogbnVtYmVyXG5cbiAgICB0eXBlOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFhQYXRoRWxlbWVudFJlZiBpbXBsZW1lbnRzIElFbGVtZW50UmVmIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgeFBhdGg6IHN0cmluZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgaHRtbFRhZ05hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgQm91bmRpbmdSZWN0PzogRE9NUmVjdCxcbiAgICAgICAgICAgICAgICBwdWJsaWMgb2Zmc2V0VG9wPzogbnVtYmVyLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvZmZzZXRMZWZ0PzogbnVtYmVyKSB7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IHN0cmluZyA9ICdYUGF0aEVsZW1lbnRSZWYnXG59XG5cbmV4cG9ydCBjbGFzcyBNeW9wRWxlbWVudFJlZiBpbXBsZW1lbnRzIElFbGVtZW50UmVmIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbXlvcElkOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIGh0bWxUYWdOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIEJvdW5kaW5nUmVjdD86IERPTVJlY3QsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldFRvcD86IG51bWJlcixcbiAgICAgICAgICAgICAgICBwdWJsaWMgb2Zmc2V0TGVmdD86IG51bWJlcikge1xuXG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IHN0cmluZyA9ICdNeW9wRWxlbWVudFJlZidcbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyfSBmcm9tIFwiLi9pbmRleC50c1wiO1xuXG5leHBvcnQgdHlwZSBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCA9IENsZWFudXBIYW5kbGVyIHwgUHJvbWlzZTxDbGVhbnVwSGFuZGxlcj4gfCBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcblxuZXhwb3J0IGNvbnN0IHJ1bkV4ZWN1dG9yQ2xlYW51cCA9IGFzeW5jICh0YXNrOiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCkgPT4ge1xuICAgIGlmICh0eXBlb2YgdGFzayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBJdCdzIGEgZnVuY3Rpb24sIGNhbGwgaXRcbiAgICAgICAgdGFzaygpO1xuICAgIH0gZWxzZSBpZiAodGFzayBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgLy8gSXQncyBhIFByb21pc2UsIGF3YWl0IGl0XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRhc2s7XG5cbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSByZXN1bHQgaXMgYSBmdW5jdGlvbiwgY2FsbCBpdFxuICAgICAgICAgICAgcmVzdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgdGFzayBpcyB2b2lkLCBkbyBub3RoaW5nXG59XG5cbnR5cGUgSU1lc3NhZ2VFeGVjdXRvcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPiA9IChtZXNzYWdlOiBUKSA9PiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cDtcblxuaW50ZXJmYWNlIElNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG5cbiAgICBleGVjdXRvcjogSU1lc3NhZ2VFeGVjdXRvcjxUPjtcblxuICAgIG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2UgPSBhbnk+IGltcGxlbWVudHMgSU1lc3NhZ2VIYW5kbGVyPFQ+IHtcblxuICAgIC8vVE9ETyA6IGFkZCBkaXNwb3NlIG1ldGhvZFxuXG4gICAgY29uc3RydWN0b3IocHVibGljIG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkKSB7XG5cbiAgICB9XG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXlcbiAgICBhYnN0cmFjdCBleGVjdXRvcjogSU1lc3NhZ2VFeGVjdXRvcjxUPjtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VDb250ZXh0TWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSA9IGFueSwgRSA9IGFueT4gZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8VD4ge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZCwgcHVibGljIGNvbnRleHQ/OiBFKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2VUb0hvc3QpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBydW5FeGVjdXRvckNsZWFudXB9IGZyb20gXCIuL2luZGV4LnRzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vYmFzZU1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSwgQ2xlYW51cE1lc3NhZ2UsIENsZWFudXBSZXBsYXlNZXNzYWdlLCBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBFbnZlbG9wZWRNZXNzYWdlLFxuICAgIEluaXRNZXNzYWdlLFxuICAgIEluaXRSZXNwb25zZSxcbiAgICBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIE15b3BCaW5kTWVzc2FnZSxcbiAgICBNeW9wQmluZFJlcGxheU1lc3NhZ2Vcbn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBIb3N0ZWRDb21wb25lbnQ8VCA9IGFueT4ge1xuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB7XG4gICAgICAgIC8vZGVidWdnZXI7XG4gICAgfVxuXG4gICAgLy9vbk1lc3NhZ2VSZWNlaXZlZDogKG1zZzogSU15b3BNZXNzYWdlKSA9PiB2b2lkO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGlkOiBzdHJpbmcsIHB1YmxpYyBjb250ZXh0PzogVCkge1xuXG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNeW9wU0RLIHtcbiAgICBpbml0OiAoKSA9PiB2b2lkO1xuXG4gICAgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWRcblxuICAgIHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlTWVzc2FnZUhhbmRsZXJbXTtcblxuICAgIGhhbmRsZUluY29tZU1lc3NhZ2VzOiAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB2b2lkXG5cbiAgICBjb21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ+O1xufVxuXG4vLyBjb25zdCBsb2NhbEhvc3RIYW5kbGVkTWVzc2FnZXMgPSBbXG4vLyAgICAgTXlvcE1lc3NhZ2VzLkluaXRSZXF1ZXN0LFxuLy8gICAgIE15b3BNZXNzYWdlcy5Jbml0UmVzcG9uc2UsXG4vLyAgICAgLy9NeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSxcbi8vIF1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNeW9wU0RLIGltcGxlbWVudHMgSU15b3BTREsge1xuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQ7XG5cbiAgICBhYnN0cmFjdCBzdXBwb3J0ZWRIYW5kbGVyczogQmFzZU1lc3NhZ2VIYW5kbGVyW107XG5cbiAgICBtZXNzYWdlVG9IYW5kbGVBZnRlckluaXQ6IEJhc2VNeW9wTWVzc2FnZVtdID0gW107XG5cbiAgICBjb21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ+ID0ge307XG5cbiAgICBhbHdheXNQYXNzRW52ZWxvcGVzVG9Ib3N0OiBib29sZWFuID0gZmFsc2VcblxuICAgIG1lc3NhZ2VDbGVhbnVwQ2FjaGU6IFJlY29yZDxzdHJpbmcsIENsZWFudXBIYW5kbGVyIHwgUHJvbWlzZTxDbGVhbnVwSGFuZGxlcj4+IHwgUHJvbWlzZTx2b2lkPiA9IHt9O1xuXG4gICAgaGFuZGxlSW5jb21lTWVzc2FnZXMoZXZlbnQ6IGFueSkge1xuICAgICAgICBjb25zdCBldmVudENvbnRlbnQgPSBldmVudC5kYXRhID8gZXZlbnQuZGF0YSA6IGV2ZW50LmRldGFpbDtcblxuICAgICAgICBpZiAoIWV2ZW50Q29udGVudCB8fCAhZXZlbnRDb250ZW50Lm15b3ApIHtcbiAgICAgICAgICAgIC8vIG5vdCBteW9wIG1hcmtlZCBldmVudCBcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlID0gZXZlbnRDb250ZW50IGFzIEJhc2VNeW9wTWVzc2FnZTtcblxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZGlyZWN0aW9uICE9PSBNZXNzYWdlRGlyZWN0aW9uLmRvd24pIHtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdtZXNzYWdlIGRyb3BwZWQgaW4gYmFzZVNESywgZGlyZWN0aW9uIHdhcyAnLCBldmVudC5kYXRhLmRpcmVjdGlvbilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIChsb2NhbEhvc3RIYW5kbGVkTWVzc2FnZXMuaW5jbHVkZXMobWVzc2FnZS5tZXNzYWdlVHlwZSkpIHtcbiAgICAgICAgICAgIC8vICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vICAgICAvL1RPRE8gOiBmaXggZGlyZWN0aW9uID8gbWVzc2FnZSB3aWxsIG5vdCBwcm9jY2VzcyBvdGhlcndpc2VcbiAgICAgICAgICAgIC8vICAgICB3aW5kb3cubXlvcC5ob3N0U0RLLnNlbmQobWVzc2FnZSlcbiAgICAgICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRGlzcG9zZU1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogc2hvdWxkIG5vdCBiZSBvcHRpb25hbCwgZml4IGFuZCByZW1vdmUgJ2lmJ1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmRlc3RpbmF0aW9uKVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jb21wb25lbnRzW21lc3NhZ2UuZGVzdGluYXRpb25dXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBXZSBnb3Qgb3VyIGlkIGZyb20gb3VyIGhvc3RTREtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBTREsgbWF5IHNlcnZlIG1vcmUgdGhhbiAxIGNvbXBvbmVudCAuLiB0aGluayBhYm91dCB0aGF0XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbXBvbmVudElkID0gKG1lc3NhZ2UgYXMgSW5pdE1lc3NhZ2UpLmNvbnRlbnQuaWQ7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wb25lbnRzW25ld0NvbXBvbmVudElkXSkge1xuICAgICAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgICAgICAgICAvL3Rocm93IG5ldyBFcnJvcihcInJlY2hpdmVkIGluaXQgbWVzc2FnZSBmb3IgYW4gZXhzaXNpbmcgY29tcG9uZW50LlwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzW25ld0NvbXBvbmVudElkXSA9IG5ldyBIb3N0ZWRDb21wb25lbnQobmV3Q29tcG9uZW50SWQpXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBJbml0UmVzcG9uc2UobmV3Q29tcG9uZW50SWQpKTtcblxuICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBpcyBpdCB0cnVlIHRvIG5vdCBwYXNzIGZ1cnRoZXIgKCB0byB0aGUgY29tcG9uZW50IClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGZvciBzYW1lIEhvc3RTREsgY2FzZXNcbiAgICAgICAgICAgIC8vIHdoZW4gYm90aCBSZWZDb21wb25lbnQgYW5kIHJlYWxDb21wb25lbnQgaG9zdGVkIGluIHRoZSBzYW1lIEhvc3RTREtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudmVsb3BlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBFbnZlbG9wZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbm5lck1lc3NhZ2UgPSBlbnZlbG9wZWRNZXNzYWdlLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGlubmVyTWVzc2FnZTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFsd2F5c1Bhc3NFbnZlbG9wZXNUb0hvc3QgfHwgdGhpcy5jb21wb25lbnRzW21lc3NhZ2UuZGVzdGluYXRpb24hXSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uQ29tcG9uZW50ID0gbXlvcC5ob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IGlubmVyTWVzc2FnZS5kZXN0aW5hdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvbkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25Db21wb25lbnQuc2VuZChpbm5lck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnZlbG9wZWREZXN0aW5hdGlvbkNvbXBvbmVudCA9IG15b3AuaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSBlbnZlbG9wZWRNZXNzYWdlLmRlc3RpbmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVudmVsb3BlZERlc3RpbmF0aW9uQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZWREZXN0aW5hdGlvbkNvbXBvbmVudC5zZW5kKGlubmVyTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZihtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSl7XG4gICAgICAgICAgICAvLyAgICAgY29uc3QgdHlwZWRNZXNzYWdlIDogQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSA9IG1lc3NhZ2UgYXMgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZTtcbiAgICAgICAgICAgIC8vIC8vICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUpIHtcblxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuQ2xlYW51cE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gbWVzc2FnZSBhcyBDbGVhbnVwTWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW51cCA9IHRoaXMubWVzc2FnZUNsZWFudXBDYWNoZVt0eXBlZE1lc3NhZ2UuY2xlYW51cEZvck1lc3NhZ2VJZF07XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW51cE1lc3NhZ2UgPSBuZXcgQ2xlYW51cFJlcGxheU1lc3NhZ2UoISFjbGVhbnVwKTtcbiAgICAgICAgICAgICAgICAgICAgY2xlYW51cE1lc3NhZ2UuZGVzdGluYXRpb24gPSBtZXNzYWdlLmRlc3RpbmF0aW9uO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghIWNsZWFudXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm1lc3NhZ2VDbGVhbnVwQ2FjaGVbdHlwZWRNZXNzYWdlLmNsZWFudXBGb3JNZXNzYWdlSWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVuRXhlY3V0b3JDbGVhbnVwKGNsZWFudXApLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChjbGVhbnVwTWVzc2FnZSwgdHlwZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBoYW5kZWwgZXJyb3I/XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KGNsZWFudXBNZXNzYWdlLCB0eXBlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgYWN0aW9uSGFuZGxlckZvdW5kID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnN1cHBvcnRlZEhhbmRsZXJzLmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyLm1lc3NhZ2VUeXBlID09PSBtZXNzYWdlLm1lc3NhZ2VUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25IYW5kbGVyRm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW51cCA9IGhhbmRsZXIuZXhlY3V0b3IobWVzc2FnZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmNsZWFuYWJsZSAmJiBjbGVhbnVwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlQ2xlYW51cENhY2hlW21lc3NhZ2UuaWRdID0gY2xlYW51cDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsZWFudXAgJiYgIW1lc3NhZ2UuY2xlYW5hYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDbGVhbnVwIGhhbmRsZXIgZ2VuZXJhdGVkIGZvciBub24tY2xlYW5hYmxlIG1lc3NhZ2UuIFxubWVzc2FnZVR5cGUgLSAke21lc3NhZ2UubWVzc2FnZVR5cGV9LCBoYW5kbGVyIGV4ZWN1dG9yIHdhcyAtICR7aGFuZGxlci5leGVjdXRvcn1cblxuUGxlYXNlIHJldmlldyB0aGUgbWVzc2FnZSBkZWZpbml0aW9uIG9iamVjdCAmIG1lc3NhZ2UgaGFuZGxlci5cblRvIGVuc3VyZSBjbGVhbnVwIHByb3Blcmx5IHNldCAnY2xlYW5hYmxlJyB0cnVlIGF0IG1lc3NhZ2UgZGVmaW5pdGlvbiBhbmQgcmV0dXJuIElNZXNzYWdlRXhlY3V0b3JDbGVhbnVwIGZyb20geW91ciBoYW5kbGVycy5gKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNsZWFudXAgJiYgbWVzc2FnZS5jbGVhbmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNsZWFudXAgaGFuZGxlciBnZW5lcmF0ZWQgZm9yIGEgY2xlYW5hYmxlIG1lc3NhZ2UuIFxubWVzc2FnZVR5cGUgLSAke21lc3NhZ2UubWVzc2FnZVR5cGV9LCBoYW5kbGVyIGV4ZWN1dG9yIHdhcyAtICR7aGFuZGxlci5leGVjdXRvcn1cblxuUGxlYXNlIHJldmlldyB0aGUgbWVzc2FnZSBkZWZpbml0aW9uIG9iamVjdCAmIG1lc3NhZ2UgaGFuZGxlci5cblRvIGVuc3VyZSBjbGVhbnVwIHByb3Blcmx5IHNldCAnY2xlYW5hYmxlJyB0cnVlIGF0IG1lc3NhZ2UgZGVmaW5pdGlvbiBhbmQgcmV0dXJuIElNZXNzYWdlRXhlY3V0b3JDbGVhbnVwIGZyb20geW91ciBoYW5kbGVycy5gKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIGlmICghYWN0aW9uSGFuZGxlckZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHByaW50IHdpdGggZGVidWcgY29uZmlnIG9ubHlcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbm8gbWVzc2FnZSBoYW5kbGVyIHdhcyBmb3VuZCBmb3IgJywgbWVzc2FnZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd1bnN1cHBvcnRlZCBtZXNzYWdlIHR5cGUnKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgaW5pdDogKCkgPT4gdm9pZDtcbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi9NeW9wTWVzc2FnZXNcIjtcblxuZXhwb3J0ICogZnJvbSAnLi9NeW9wRWxlbWVudFJlZic7XG5leHBvcnQgKiBmcm9tICcuL2Jhc2VNZXNzYWdlSGFuZGxlcic7XG5leHBvcnQgKiBmcm9tICcuL0Jhc2VNeW9wU0RLJztcblxuZXhwb3J0IHR5cGUgQ2xlYW51cEhhbmRsZXIgPSAoKSA9PiB2b2lkXG5cbmV4cG9ydCB0eXBlIERpY3Rpb25hcnk8VD4gPSB7IFtrZXk6IHN0cmluZ106IFQ7IH07XG5cbi8vZXhwb3J0IHR5cGUgU2tpbkxvYWRlclR5cGUgPSAnSWZyYW1lTG9hZGVyJyB8ICdXZWJDb21wb25lbnRMb2FkZXInIHwgJ0hUTUxMb2FkZXInIHwgc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgU2tpbkxvYWRlcnMgPSB7XG4gICAgXCJJZnJhbWVMb2FkZXJcIjogXCJJZnJhbWVMb2FkZXJcIixcbiAgICBcIldlYkNvbXBvbmVudExvYWRlclwiOiBcIldlYkNvbXBvbmVudExvYWRlclwiLFxuICAgIFwiSFRNTExvYWRlclwiOiBcIkhUTUxMb2FkZXJcIixcbiAgICBcIk1pbmltaXplZExvYWRlclwiOiBcIk1pbmltaXplZExvYWRlclwiXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgU2tpbkxvYWRlclR5cGUgPSBrZXlvZiB0eXBlb2YgU2tpbkxvYWRlcnM7XG5cbmV4cG9ydCB0eXBlIFByb3BUeXBlID0gJ2FueScgfCAnc3RyaW5nJyB8ICdudW1iZXInIHwgc3RyaW5nOyAvLyBUT0RPIDogPFxuZXhwb3J0IHR5cGUgUmVmU2VsZWN0b3JUeXBlID0gJ2lkLWF0dHJpYnV0ZScgfCAnY3NzLXNlbGVjdG9yJyB8ICd4cGF0aCcgfCBzdHJpbmc7XG5cbmV4cG9ydCBjb25zdCBMb2FkZXJGcmFtZXdvcmtzID0ge1xuICAgIFwicmVhY3RcIjogXCJyZWFjdFwiLFxuICAgIFwidnVlXCI6IFwidnVlXCIsXG4gICAgXCJhbmd1bGFyXCI6IFwiYW5ndWxhclwiLFxufSBhcyBjb25zdFxuZXhwb3J0IHR5cGUgTG9hZGVyRnJhbWV3b3JrVHlwZSA9IGtleW9mIHR5cGVvZiBMb2FkZXJGcmFtZXdvcmtzO1xuXG5leHBvcnQgaW50ZXJmYWNlIElXZWJDb21wb25lbnRMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJXZWJDb21wb25lbnRMb2FkZXJcIjtcbiAgICB1cmw6IHN0cmluZyxcbiAgICB0YWc6IHN0cmluZyxcbiAgICBmcmFtZXdvcms/OiBMb2FkZXJGcmFtZXdvcmtUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUlmcmFtZUxvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIklmcmFtZUxvYWRlclwiO1xuICAgIHVybDogc3RyaW5nXG4gICAgYXV0b0hlaWdodDogYm9vbGVhblxuICAgIGhlaWdodD86IHN0cmluZ1xuICAgIHdpZHRoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBTaGFkb3dSb290TW9kZVR5cGUgPSB7XG4gICAgXCJvcGVuXCI6IFwib3BlblwiLFxuICAgIFwiY2xvc2VkXCI6IFwiY2xvc2VkXCIsXG4gICAgXCJub25lXCI6IFwibm9uZVwiLFxuICAgIFwibG9jYWxGcmFtZVwiOiBcImxvY2FsRnJhbWVcIlxufSBhcyBjb25zdDtcblxuXG5leHBvcnQgaW50ZXJmYWNlIElIVE1MTG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiSFRNTExvYWRlclwiO1xuICAgIEhUTUw6IHN0cmluZztcbiAgICAvL1RPRE86IHJlbmFtZShyb290TW9kZS9jdXN0b21FbGVtZW50TW9kZSkgKyBkYiBtaWdyYXRpb25cbiAgICBzaGFkb3dSb290TW9kZT86IGtleW9mIHR5cGVvZiBTaGFkb3dSb290TW9kZVR5cGU7XG4gICAgYXV0b0hlaWdodD86IGJvb2xlYW47XG4gICAgaGVpZ2h0Pzogc3RyaW5nO1xuICAgIHdpZHRoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gdHJ1ZSwgYW4gaW5saW5lLUhUTUwgKGxvY2FsRnJhbWUpIGNvbXBvbmVudCBpcyByZW5kZXJlZCBpbiBhIHNhbmRib3hlZCxcbiAgICAgKiBjcm9zcy1vcmlnaW4gaWZyYW1lIHdpdGggTk8gYWNjZXNzIHRvIHRoZSBob3N0IGRvY3VtZW50ICh1bnRydXN0ZWQgY29kZSkuXG4gICAgICogVGhlIGhvc3QgcmVuZGVyIHBvbGljeSBjYW4gYWxzbyBmb3JjZSB0aGlzIHJlZ2FyZGxlc3Mgb2YgdGhlIGNvbmZpZyB2YWx1ZS5cbiAgICAgKi9cbiAgICBpc29sYXRpb24/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEhvdyBhIGNvbXBvbmVudCBpcyByZW5kZXJlZCBvbiB0aGUgaG9zdCBwYWdlLCBpbiBhc2NlbmRpbmcgaXNvbGF0aW9uOlxuICogIC0gJ3dlYkNvbXBvbmVudCcgICBcdTIwMTQgY3VzdG9tIGVsZW1lbnQgb24gdGhlIGhvc3QgZG9jdW1lbnQgKG1vc3QgcHJpdmlsZWdlZClcbiAqICAtICdpZnJhbWUnICAgICAgICAgXHUyMDE0IHNhbWUtb3JpZ2luIGlubGluZS1IVE1MIGlmcmFtZSAodG9kYXkncyBkZWZhdWx0KVxuICogIC0gJ2lzb2xhdGVkSWZyYW1lJyBcdTIwMTQgc2FuZGJveGVkLCBjcm9zcy1vcmlnaW4gaWZyYW1lICh1bnRydXN0ZWQgY29kZSlcbiAqL1xuZXhwb3J0IHR5cGUgUmVuZGVyTW9kZSA9ICd3ZWJDb21wb25lbnQnIHwgJ2lmcmFtZScgfCAnaXNvbGF0ZWRJZnJhbWUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlclBvbGljeUNvbnRleHQge1xuICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnO1xuICAgIHNraW46IElTa2luQ29uZmlnO1xuICAgIC8qKiBXaGF0IHRoZSBjb21wb25lbnQgYXNrZWQgZm9yIChtYXJrZXIgXHUyMUQyICd3ZWJDb21wb25lbnQnLCBjb25maWcuaXNvbGF0aW9uIFx1MjFEMiAnaXNvbGF0ZWRJZnJhbWUnKS4gKi9cbiAgICByZXF1ZXN0ZWRNb2RlOiBSZW5kZXJNb2RlO1xuICAgIC8qKiBXaGV0aGVyIHRoZSBIVE1MIGNhcnJpZXMgdGhlIGA8IS0tIG15b3Atd2ViLWNvbXBvbmVudCAtLT5gIG1hcmtlci4gKi9cbiAgICBpc1dlYkNvbXBvbmVudDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBIb3N0LXN1cHBsaWVkIGdhdGUgZGVjaWRpbmcgaG93IChvciB3aGV0aGVyKSBhIGNvbXBvbmVudCByZW5kZXJzLiBSZXR1cm4gYVxuICogUmVuZGVyTW9kZSB0byB1c2UsIG9yIGBmYWxzZWAgdG8gYmxvY2sgcmVuZGVyaW5nIGVudGlyZWx5LlxuICovXG5leHBvcnQgdHlwZSBSZW5kZXJQb2xpY3kgPVxuICAgIChjdHg6IFJlbmRlclBvbGljeUNvbnRleHQpID0+IFJlbmRlck1vZGUgfCBmYWxzZSB8IFByb21pc2U8UmVuZGVyTW9kZSB8IGZhbHNlPjtcblxuLy9mb3IgaW50ZXJuYWwgZGFzaGJvYXJkIHVzYWdlXG5leHBvcnQgaW50ZXJmYWNlIElNaW5pbWl6ZWRMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJNaW5pbWl6ZWRMb2FkZXJcIjtcbn1cblxuaW50ZXJmYWNlIERhc2hib2FyZE9iamVjdCB7XG4gICAgX3RlbXBfY2xpZW50X2lkPzogc3RyaW5nLFxufVxuXG50eXBlIEV4dGVuZDxULCBVPiA9IFQgJiBVO1xuXG50eXBlIEV4dGVuZFJlY3Vyc2l2ZWx5PFQsIEU+ID0ge1xuICAgIFtLIGluIGtleW9mIEVdOiBFW0tdO1xufSAmIHtcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIG9iamVjdFxuICAgICAgICA/IEV4dGVuZFJlY3Vyc2l2ZWx5PFRbS10sIEU+XG4gICAgICAgIDogVFtLXTtcbn07XG5cbmV4cG9ydCB0eXBlIElEYXNoYm9hcmQ8VD4gPSBFeHRlbmRSZWN1cnNpdmVseTxULCBEYXNoYm9hcmRPYmplY3Q+O1xuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBTa2luTG9hZGVyVHlwZVxuXG4gICAgW2tleTogc3RyaW5nXTogYW55OyAvLyBBbGxvd3MgYW55IGFkZGl0aW9uYWwgcHJvcGVydGllc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lSZWxlYXNlTWV0YWRhdGEge1xuICAgIGVudmlyb25tZW50SWQ6IHN0cmluZztcbiAgICBlbnZpcm9ubWVudElkZW50aWZpZXI6IHN0cmluZztcbiAgICByZWxlYXNlZE9uPzogc3RyaW5nO1xuICAgIHJlbGVhc2VkQnk/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSVZhcmlhbnRDb25maWcgZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgbG9hZGVyOiBJU2tpbkxvYWRlckNvbmZpZ1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmc7XG5cbiAgICByZWxlYXNlcz86IHYyX0lSZWxlYXNlTWV0YWRhdGFbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIGxvYWRlcjogSVNraW5Mb2FkZXJDb25maWdcbiAgICBjcmVhdGVkQnk/OiBzdHJpbmdcbiAgICBjcmVhdGVkT24/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JU2tpbkNvbmZpZyBleHRlbmRzIElTa2luQ29uZmlnIHtcbiAgICBjb21wb25lbnRJZDogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1lc3NhZ2VQcm9wQ29uZmlnIGV4dGVuZHMgSVByb3BDb25maWcge1xuICAgIHR5cGU6IFByb3BUeXBlXG4gICAgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJpbmRNZXNzYWdlUHJvcENvbmZpZyBleHRlbmRzIElQcm9wQ29uZmlnIHtcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxufVxuXG5leHBvcnQgY29uc3QgUHJvcE1lc3NhZ2VNb2RlcyA9IHtcbiAgICBcImlucHV0XCI6IFwiaW5wdXRcIixcbiAgICBcIm91dHB1dFwiOiBcIm91dHB1dFwiXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMgPSB7XG4gICAgXCJtZXNzYWdlXCI6IFwibWVzc2FnZVwiLFxuICAgIFwiY29kZVwiOiBcImNvZGVcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcE1lc3NhZ2VCZWhhdmlvclBhcmFtIHtcbiAgICB2YWx1ZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIFByb3BDb25maWdCZWhhdmlvclR5cGVzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BDb2RlQmVoYXZpb3IgZXh0ZW5kcyBJUHJvcEJlaGF2aW9yIHtcbiAgICB0eXBlOiBcImNvZGVcIlxuICAgIHJlbWFwPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BNZXNzYWdlQmVoYXZpb3IgZXh0ZW5kcyBJUHJvcEJlaGF2aW9yIHtcbiAgICB0eXBlOiBcIm1lc3NhZ2VcIlxuICAgIG1lc3NhZ2U6IE15b3BNZXNzYWdlS2V5XG4gICAgcmVmOiBzdHJpbmcsIC8vVE9ETyBtYWtlIGl0IGlkXG4gICAgcGFyYW1zOiBJUHJvcE1lc3NhZ2VCZWhhdmlvclBhcmFtW11cbiAgICBtb2RlOiBrZXlvZiB0eXBlb2YgUHJvcE1lc3NhZ2VNb2Rlc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIHR5cGU6IFByb3BUeXBlXG4gICAgYmVoYXZpb3I6IElQcm9wQmVoYXZpb3Jcbn1cblxuXG5leHBvcnQgY2xhc3MgUmVmQmVoYXZpb3JUeXBlIHtcbiAgICBzdGF0aWMgY29kZSA9ICdjb2RlJyBhcyBjb25zdFxuICAgIHN0YXRpYyBjb21wb25lbnQgPSAnY29tcG9uZW50JyBhcyBjb25zdFxufVxuXG5leHBvcnQgdHlwZSBJUmVmQmVoYXZpb3JUeXBlID0gJ2NvZGUnIHwgJ2NvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlZkJlaGF2aW9yIHtcbiAgICB0eXBlOiBJUmVmQmVoYXZpb3JUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudFJlZkJlaGF2aW9yIGV4dGVuZHMgSVJlZkJlaGF2aW9yIHtcbiAgICB0eXBlOiAnY29tcG9uZW50J1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmdcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogUHJvcGVydHkgaW5zdGFuY2UgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy5cbiAgICAgKi9cbiAgICBpbnN0YW5jZTogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvZGVSZWZCZWhhdmlvciBleHRlbmRzIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogJ2NvZGUnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlZkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBzZWxlY3RvclR5cGU6IFJlZlNlbGVjdG9yVHlwZVxuICAgIHNlbGVjdG9yOiBzdHJpbmdcbiAgICBiZWhhdmlvcjogSVJlZkJlaGF2aW9yXG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBzZWdtZW50IHJ1bGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZVNlZ21lbnRSdWxlIHtcbiAgICBwcm9wZXJ0eTogc3RyaW5nO1xuICAgIG9wZXJhdG9yOiBzdHJpbmc7XG4gICAgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBFeHBlcmllbmNlIEEvQiBzcGxpdCB2ZXJzaW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VBQlNwbGl0VmVyc2lvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBwZXJjZW50YWdlOiBudW1iZXI7XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBBL0Igc3BsaXQgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlQUJTcGxpdCB7XG4gICAgdmVyc2lvbnM6IElFeHBlcmllbmNlQUJTcGxpdFZlcnNpb25bXTtcbn1cblxuLyoqXG4gKiBFeHBlcmllbmNlIHNlZ21lbnQgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlU2VnbWVudCB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBydWxlczogSUV4cGVyaWVuY2VTZWdtZW50UnVsZVtdO1xuICAgIHVzZUFiOiBib29sZWFuO1xuICAgIGNvbXBvbmVudFZhcmlhbnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcbiAgICBhYlNwbGl0PzogSUV4cGVyaWVuY2VBQlNwbGl0O1xuICAgIHN0aWNreVByb3BlcnRpZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBFeHBlcmllbmNlIGRlZmluaXRpb24gY29uZmlnICh2MilcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZURlZmluaXRpb25Db25maWcgZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgLyoqIFNlbGVjdGVkIGNvbXBvbmVudCBJRHMgKi9cbiAgICBjb21wb25lbnRzOiBzdHJpbmdbXTtcbiAgICAvKiogU2VnbWVudCBjb25maWd1cmF0aW9ucyAqL1xuICAgIHNlZ21lbnRzOiBJRXhwZXJpZW5jZVNlZ21lbnRbXTtcbiAgICAvKiogRmFsbGJhY2sgdmFyaWFudCBwZXIgY29tcG9uZW50ICovXG4gICAgZmFsbGJhY2s6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgLyoqIFRhZ3MgKi9cbiAgICB0YWdzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICAvLyBwcm9wczogUmVjb3JkPHN0cmluZywgSVByb3BDb25maWc+IC8vaWQgLSB0eXBlXG4gICAgLy8gcmVmczogUmVjb3JkPHN0cmluZywgSVJlZkNvbmZpZz4sXG4gICAgLy8gc2tpbnM6IFJlY29yZDxzdHJpbmcsIElTa2luQ29uZmlnPlxuICAgIHByb3BzOiBJUHJvcENvbmZpZ1tdLFxuICAgIHJlZnM6IElSZWZDb25maWdbXSxcbiAgICBza2luczogSVNraW5Db25maWdbXSxcbiAgICBkZWZhdWx0U2tpbjogbnVtYmVyO1xuXG4gICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgdGhhdFxuICAgIC8vcmVzb2x2ZWREZWZpbml0aW9ucz86IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnW11cbiAgICAvL1RPRE8gOiBtb3ZlIHRvIGJhc2UgY2xhc3MgKCBJU3RvcmFibGVJdGVtIG9yIHNvLi4uKVxuXG4gICAgY3JlYXRlZE9uPzogc3RyaW5nXG4gICAgY3JlYXRlZEJ5Pzogc3RyaW5nXG4gICAgdXBkYXRlZEJ5Pzogc3RyaW5nXG59XG5cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JQmFzZU15b3BPYmplY3Qge1xuICAgIGlkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSU15b3BTdG9yZWRPYmplY3QgZXh0ZW5kcyB2Ml9JQmFzZU15b3BPYmplY3Qge1xuICAgIHVwZGF0ZWRPbj86IHN0cmluZ1xuICAgIHVwZGF0ZWRCeT86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudEFjY2VzcyB7XG4gICAgdmlzaWJpbGl0eTogJ3ByaXZhdGUnIHwgJ3VubGlzdGVkJyB8ICdwdWJsaWMnO1xuICAgIHVubGlzdGVkPzoge1xuICAgICAgICBzbHVnOiBzdHJpbmc7XG4gICAgfTtcbiAgICBtYXJrZXRwbGFjZT86IHtcbiAgICAgICAgc3RhdHVzOiAnZHJhZnQnIHwgJ3N1Ym1pdHRlZCcgfCAnY2xhaW1lZCcgfCAnY2xvc2VkJztcbiAgICAgICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAgICAgY29udGFjdEVtYWlsOiBzdHJpbmc7XG4gICAgICAgIGRlYWRsaW5lOiBzdHJpbmc7XG4gICAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyBleHRlbmRzIHYyX0lNeW9wU3RvcmVkT2JqZWN0IHtcbiAgICB2YXJpYW50c19pZHM6IHN0cmluZ1tdLFxuICAgIERUT3M6IHYyX0lEVE9bXSxcbiAgICB0YWdzOiBzdHJpbmdbXSxcbiAgICBhY2Nlc3M/OiBDb21wb25lbnRBY2Nlc3MsXG5cbiAgICAvL1xuICAgIHZhcmlhbnRzX25hbWVzOiBzdHJpbmdbXSxcbiAgICB2YXJpYW50c19kYXRhOiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgaWQ6IHN0cmluZ1xuICAgICAgICBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICAgICAgICB1cGRhdGVkT24/OiBzdHJpbmdcbiAgICAgICAgdXBkYXRlZEJ5Pzogc3RyaW5nXG4gICAgICAgIGhhc19yZWxlYXNlcz86IGJvb2xlYW5cbiAgICB9W10sXG5cbiAgICBwcmV2aWV3X3ZhcmlhbnQ6IHYyX0lWYXJpYW50Q29uZmlnO1xuICAgIGV4dHJhPzoge1xuICAgICAgICBmaXJzdFZhcmlhbnQ6IHYyX0lWYXJpYW50Q29uZmlnOyAvL3doZW4gbmV3IGNvbXBvbmVudCBjcmVhdGVzIGF0IHRoZSBjbGllbnRcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSURUTyBleHRlbmRzIHYyX0lNeW9wU3RvcmVkT2JqZWN0IHtcbiAgICBkYXRhOiBvYmplY3RcbiAgICBtZXRob2ROYW1lOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2tpbkluc3RhbmNlQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLFxuICAgIC8vc2tpbnM6IElTa2luSW5zdGFuY2VDb25maWdbXVxufVxuXG5leHBvcnQgY29uc3QgU2VnbWVudFR5cGUgPSB7XG4gICAgXCJGdW5jdGlvblJlc3VsdFwiOiBcIkZ1bmN0aW9uUmVzdWx0XCIsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50SW5zdGFuY2Uge1xuICAgIHNlZ21lbnRJZDogc3RyaW5nO1xuICAgIHNraW5TZWxlY3RvcjogSVNraW5TZWxlY3RvckNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50RGVmaW5pdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgU2VnbWVudFR5cGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRnVuY3Rpb25SZXN1bHRzU2VnbWVudCBleHRlbmRzIElTZWdtZW50RGVmaW5pdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0eXBlOiB0eXBlb2YgU2VnbWVudFR5cGUuRnVuY3Rpb25SZXN1bHRcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgZnVuY3Rpb246IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgU2tpblNlbGVjdG9yVHlwZXMgPSB7XG4gICAgXCJTZWdtZW50ZWRcIjogXCJTZWdtZW50ZWRcIixcbiAgICBcIkRlZGljYXRlZFwiOiBcIkRlZGljYXRlZFwiLFxuXG4gICAgLyoqXG4gICAgICogVGhpcyBTZWxlY3RvciBUeXBlIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGJ1dCB3aWxsIGJlIGFkZGVkIGluIGEgZnV0dXJlIHJlbGVhc2UuXG4gICAgICogUGxlYXNlIGNoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciB1cGRhdGVzLlxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBcIkRlZmF1bHRcIjogXCJEZWZhdWx0XCJcbn0gYXMgY29uc3Q7XG5cblxuLyoqXG4gKiBUaGlzIFNraW4gQ29uZmlnIFR5cGUgaXMgbm90IHlldCBzdXBwb3J0ZWQgYnV0IHdpbGwgYmUgYWRkZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAqIFBsZWFzZSBjaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdXBkYXRlcy5cbiAqXG4gKiBAdHlwZSB7SURlZmF1bHRTa2luQ29uZmlnfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElEZWZhdWx0U2tpbkNvbmZpZyBleHRlbmRzIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcy5EZWZhdWx0LFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50ZWRTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZTogdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLlNlZ21lbnRlZCxcbiAgICBzZWdtZW50czogSVNlZ21lbnRJbnN0YW5jZVtdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURlZGljYXRlZFNraW5Db25maWcgZXh0ZW5kcyBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkLFxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBza2lufSBpbnN0ZWFkLlxuICAgICAqIFByb3BlcnR5IHNraW5zIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuXG4gICAgICogUGxlYXNlIHVwZGF0ZSB5b3VyIGNvZGUgdG8gdXNlIHtAbGluayBza2lufSBmb3IgYmV0dGVyIGNvbXBhdGliaWxpdHkuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHNraW5zPzogSVNraW5JbnN0YW5jZUNvbmZpZ1tdIC8vIGRlcHJlY2F0ZWRcbiAgICBza2luOiBJU2tpbkluc3RhbmNlQ29uZmlnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmc7XG5cbiAgICAvL1RPRE8gOlxuICAgIC8vIFJlZklEID8gdG8gc3VwcG9ydCBtb3JlIHRoYW4gMSBjb21wb25lbnQgZnJvbSB0aGUgc2FtZSB0eXBlIGluIGNvbXBvc2l0ZXMgP1xuXG4gICAgLy9UT0RPIDogcmVtb3ZlXG4gICAgY29tcG9uZW50TmFtZTogc3RyaW5nOyAvLyA8PCBjaGVja1xuXG4gICAgc2tpblNlbGVjdG9yOiBJU2tpblNlbGVjdG9yQ29uZmlnXG5cbiAgICAvLyBzdG9yaW5nIHRoZSBuZXN0ZWQgY29uZmlnIGZvciByZWYgY29tcG9uZW50c1xuICAgIG5lc3RlZENvbXBvbmVudHM/OiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWdbXVxuXG4gICAgLy9vbmx5IG9uIEdFVD9cbiAgICAvL1RPRE8gOiB0aGluayBhYm91dCB0aGF0XG4gICAgcmVzb2x2ZWRFeHBlcmllbmNlcz86IElFeHBlcmllbmNlW11cbiAgICAvLyB3aWxsIGluY2x1ZGUgaW5zdGFuY2UgYW5kIGRlZiBjb25maWcgaW4gb3JkZXIgdG8gcmVuZGVyIGluIHByb2R1Y3Rpb25cbiAgICByZXNvbHZlZE5lc3RlZENvbXBvbmVudHM/OiBJQ29tcG9uZW50Q29uZmlnW11cbn1cblxuZXhwb3J0IGNvbnN0IEV4cGVyaWVuY2VUeXBlcyA9IHtcbiAgICBcIlNlZ21lbnRcIjogXCJTZWdtZW50XCIsXG4gICAgXCJQcm9tb1wiOiBcIlByb21vXCIsXG4gICAgXCJBQlwiOiBcIkFCXCJcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2Uge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgdHlwZToga2V5b2YgdHlwZW9mIEV4cGVyaWVuY2VUeXBlc1xuICAgIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdXG4gICAgLy9zdGlja2luZXNzRmFjdG9yXG4gICAgLy9FbmREYXRlXG59XG5cbi8vIGV4cG9ydCBpbnRlcmZhY2UgSUFCRXhwZXJpZW5jZUdyb3VwIHtcbi8vICAgICBpZDogc3RyaW5nXG4vLyAgICAgbmFtZTogc3RyaW5nXG4vLyAgICAgcGVyY2VudGFnZTogbnVtYmVyXG4vLyB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFCRXhwZXJpZW5jZSBleHRlbmRzIElFeHBlcmllbmNlIHtcbiAgICB0eXBlOiB0eXBlb2YgRXhwZXJpZW5jZVR5cGVzLkFCXG4gICAgLy8gZ3JvdXBzOiBJQUJFeHBlcmllbmNlR3JvdXBbXVxuICAgIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdXG4gICAgcGVyY2VudGFnZTogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURhdGVSYW5nZSB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIHN0YXJ0OiBEYXRlXG4gICAgZW5kOiBEYXRlXG4gICAgdGltZXpvbmU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50RXhwZXJpZW5jZSBleHRlbmRzIElFeHBlcmllbmNlIHtcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgRXhwZXJpZW5jZVR5cGVzXG4gICAgc2VnbWVudDogSVNlZ21lbnREZWZpbml0aW9uXG4gICAgZGF0ZVJhbmdlPzogSURhdGVSYW5nZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyRmxvd0RlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgY29tcG9uZW50czogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnW107XG4gICAgb3JpZ2luczogc3RyaW5nW10sXG4gICAgZXhwZXJpZW5jZXM6IElFeHBlcmllbmNlW11cbiAgICBicmFuY2g/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50Q29uZmlnIHtcbiAgICBpbnN0YW5jZTogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnXG4gICAgdHlwZTogSUNvbXBvbmVudERlZmluaXRpb25Db25maWdcblxuICAgIC8vIFRPRE8gOiB2ZXJpZnkgdW5pcXVlbmVzcyAoZGFzaGJvYXJkICYgc2VydmVyKVxuICAgIG5hbWU6IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgSUJyYW5jaGFibGUge1xuICAgIGJyYW5jaD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyRmxvdyBleHRlbmRzIE9taXQ8SVVzZXJGbG93RGVmaW5pdGlvbiwgJ2NvbXBvbmVudHMnPiwgSUJyYW5jaGFibGUge1xuICAgIGNvbXBvbmVudHM6IElDb21wb25lbnRDb25maWdbXVxufVxuXG5leHBvcnQgY2xhc3MgUm9vdFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHB1YmxpYyBzaGFkb3dSb290PzogU2hhZG93Um9vdCkge1xuXG4gICAgfVxuXG4gICAgZ2V0Um9vdERpdiA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnNoYWRvd1Jvb3QgfHwgdGhpcy5jb250YWluZXIpLnF1ZXJ5U2VsZWN0b3IoJ2RpdicpXG4gICAgfVxuXG4gICAgZ2V0Um9vdCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnNoYWRvd1Jvb3QgfHwgdGhpcy5jb250YWluZXIpO1xuICAgIH1cbn1cbiIsICJleHBvcnQgdHlwZSBTZXJpYWxpemFibGU8VD4gPVxuICAgIFQgZXh0ZW5kcyBGdW5jdGlvbiA/IG5ldmVyIDogLy8gRXhjbHVkZSBmdW5jdGlvbnNcbiAgICAgICAgVCBleHRlbmRzIEFycmF5PGluZmVyIFU+ID8gU2VyaWFsaXphYmxlPFU+W10gOiAvLyBIYW5kbGUgYXJyYXlzXG4gICAgICAgICAgICBUIGV4dGVuZHMgb2JqZWN0ID8ge1xuICAgICAgICAgICAgICAgIFtLIGluIGtleW9mIFQgYXMgVFtLXSBleHRlbmRzIEZ1bmN0aW9uID8gbmV2ZXIgOiBLXTogU2VyaWFsaXphYmxlPFRbS10+XG4gICAgICAgICAgICB9IDogVDsgLy8gSGFuZGxlIG9iamVjdHNcblxuY29uc3QgaXNQcmltaXRpdmUgPSAodmFsdWUpID0+IHtcbiAgICByZXR1cm4gdmFsdWUgIT09IE9iamVjdCh2YWx1ZSk7XG59XG5cbmNvbnN0IGlzRnVuY3Rpb24gPSAodmFsdWUpID0+IHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgY29uc3QgY29udGFpbnNQcmltaXRpdmVzT25seSA9IChvYmopID0+IHtcbiAgICBpZiAoaXNQcmltaXRpdmUob2JqKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNGdW5jdGlvbihvYmopKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNoZWNrIGlmIGl0J3MgYSBuZXN0ZWQgb2JqZWN0XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5zUHJpbWl0aXZlc09ubHkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzUHJpbWl0aXZlKHZhbHVlKSkge1xuICAgICAgICAgICAgY29udGludWU7IC8vIEl0J3MgYSBwcmltaXRpdmUsIHNvIHdlIGNhbiBza2lwIGl0XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIEZvdW5kIGEgbm9uLXByaW1pdGl2ZSB2YWx1ZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7IC8vIEFsbCB2YWx1ZXMgYXJlIHByaW1pdGl2ZXMgb3IgbmVzdGVkIG9iamVjdHMgd2l0aCBwcmltaXRpdmVzXG59XG5cbi8vIGN1cnJlbnRseSBzdXBwb3J0IHJvb3QgbGV2ZWwgb25seVxuLy8ge3g6IDEsIHkgOiAnYScsIHogOiAoKT0+ey4uLn0sIGlubmVyIDogeyB4OiAxICwgeSA6ICdhJ30gfVxuLy8ge3g6IDEsIHkgOiAnYSd9XG4vL2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvR2xvc3NhcnkvRmFsc3lcbmV4cG9ydCB0eXBlIFNlcmlhbGl6YWJsZVNrZWxldG9uPFQ+ID0gUGFydGlhbDxSZWNvcmQ8a2V5b2YgVCwgYm9vbGVhbiB8IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4+Pj4gfCBib29sZWFuO1xuXG5leHBvcnQgY29uc3QgbWFrZVNlcmlhbGl6YWJsZSA9IDxUPihcbiAgICBvYmo6IFQsXG4gICAgc2tlbGV0b246IFNlcmlhbGl6YWJsZVNrZWxldG9uPFQ+ID0ge30sXG4gICAgaW5jbHVkZUZhbHN5S2V5czogYm9vbGVhbiA9IHRydWUsIC8vIFRPRE8gOiB1c2UgdGhhdCBhcmdcbiAgICBzZWVuOiBXZWFrTWFwPG9iamVjdCwgU2VyaWFsaXphYmxlPGFueT4+ID0gbmV3IFdlYWtNYXAoKVxuKTogU2VyaWFsaXphYmxlPFQ+ID0+IHtcblxuICAgIGlmIChpc1ByaW1pdGl2ZShvYmopKSB7XG4gICAgICAgIHJldHVybiBvYmogYXMgU2VyaWFsaXphYmxlPFQ+OyAvLyBEaXJlY3RseSByZXR1cm4gcHJpbWl0aXZlIHZhbHVlc1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgaWYgKHNlZW4uaGFzKG9iaikpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWVuLmdldChvYmopITsgLy8gUmV0dXJuIHRoZSBhbHJlYWR5IHByb2Nlc3NlZCBvYmplY3RcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSBhcnJheSBzZXJpYWxpemF0aW9uXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6YWJsZUFycmF5OiBTZXJpYWxpemFibGU8YW55PltdID0gW107XG4gICAgICAgIHNlZW4uc2V0KG9iaiwgc2VyaWFsaXphYmxlQXJyYXkpOyAvLyBTdG9yZSB0aGUgYXJyYXkgaW4gc2VlblxuXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBvYmoubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gb2JqW2luZGV4XTtcbiAgICAgICAgICAgIHNlcmlhbGl6YWJsZUFycmF5W2luZGV4XSA9IG1ha2VTZXJpYWxpemFibGUoZWxlbWVudCwgc2tlbGV0b24sIGluY2x1ZGVGYWxzeUtleXMsIHNlZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemFibGVBcnJheSBhcyBTZXJpYWxpemFibGU8VD47XG4gICAgfVxuXG4gICAgaWYgKG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBDaGVjayBmb3IgY3ljbGljIHJlZmVyZW5jZXNcbiAgICAgICAgaWYgKHNlZW4uaGFzKG9iaikpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWVuLmdldChvYmopITsgLy8gUmV0dXJuIHRoZSBhbHJlYWR5IHByb2Nlc3NlZCBvYmplY3RcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXJpYWxpemFibGVPYmplY3Q6IFBhcnRpYWw8U2VyaWFsaXphYmxlPFQ+PiA9IHt9O1xuICAgICAgICBzZWVuLnNldChvYmosIHNlcmlhbGl6YWJsZU9iamVjdCk7IC8vIFN0b3JlIHRoZSBvYmplY3QgaW4gc2VlblxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGtleSBpcyBpbiB0aGUgc2tlbGV0b24gYW5kIGlmIGl0J3MgYSB2YWxpZCBrZXkgdG8gc2VyaWFsaXplXG5cbiAgICAgICAgICAgIGNvbnN0IGtleUluU2tlbGV0b24gPSB0eXBlb2Ygc2tlbGV0b24gPT0gXCJib29sZWFuXCIgPyBza2VsZXRvbiA6IHNrZWxldG9uW2tleV07XG5cbiAgICAgICAgICAgIGlmIChrZXlJblNrZWxldG9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleUluU2tlbGV0b24gPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNrZWxldG9uIGluZGljYXRlcyB0byBzZXJpYWxpemUgdGhpcyBrZXlcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVGYWxzeUtleXMgPyBvYmpba2V5XSAhPT0gdW5kZWZpbmVkIDogb2JqW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6YWJsZU9iamVjdFtrZXldID0gbWFrZVNlcmlhbGl6YWJsZShvYmpba2V5XSwgdHJ1ZSwgaW5jbHVkZUZhbHN5S2V5cywgc2Vlbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBrZXlJblNrZWxldG9uID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2tlbGV0b24gaW5kaWNhdGVzIG5lc3RlZCBrZXlzIHRvIHNlcmlhbGl6ZVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6YWJsZU9iamVjdFtrZXldID0gbWFrZVNlcmlhbGl6YWJsZShvYmpba2V5XSwga2V5SW5Ta2VsZXRvbiwgaW5jbHVkZUZhbHN5S2V5cywgc2Vlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemFibGVPYmplY3QgYXMgU2VyaWFsaXphYmxlPFQ+O1xuICAgIH1cblxuICAgIHJldHVybiB7fSBhcyBhbnk7IC8vIFJldHVybiBhbiBlbXB0eSBvYmplY3QgZm9yIG90aGVyIGNhc2VzXG59XG4iLCAiZXhwb3J0IGNvbnN0IEVycm9ycyA9IHtcbiAgICBub3RTZXJpYWxpemFibGVSZWZDYWxsOiAocHJvcCwgYXJnKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXG5UaGUgaW5wdXQgcHJvdmlkZWQgdG8gJyR7cHJvcC50b1N0cmluZygpfScgaXMgbm90IHNlcmlhbGl6YWJsZS4gU2VyaWFsaXphdGlvbiBpcyByZXF1aXJlZCB0byBlbnN1cmUgdGhhdCB0aGUgZGF0YSBjYW4gYmUgc2FmZWx5IHRyYW5zZmVycmVkIHRvIHRoZSBza2luIGltcGxlbWVudGF0aW9uLiBcblRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgZGF0YSBhcmUgY29uc2lkZXJlZCBub24tc2VyaWFsaXphYmxlIGFuZCBjYW5ub3QgYmUgcHJvY2Vzc2VkOlxuXG4tIEZ1bmN0aW9uc1xuLSBET00gZWxlbWVudHNcbi0gQ2xhc3MgaW5zdGFuY2VzXG4tIENpcmN1bGFyIHJlZmVyZW5jZXNcbi0gU3ltYm9sc1xuLSBCaWdJbnQgdmFsdWVzXG5cbkluIHRoZSBmb2xsb3dpbmcgZXhlY3V0aW9uIHdlIGRldGVjdGVkIDpcbn5+fn5+fn5+XG4ke2FyZ30gXG5+fn5+fn5+flxuYXMgbm90IHNlcmlhbGl6YWJsZS5cblxuVG8gcmVzb2x2ZSB0aGlzIGlzc3VlLCBwbGVhc2UgZW5zdXJlIHRoYXQgYWxsIGlucHV0cyBwYXNzZWQgdG8gJyR7cHJvcC50b1N0cmluZygpfScgYXJlIGluIGEgc2VyaWFsaXphYmxlIGZvcm1hdC5cblRoaXMgdHlwaWNhbGx5IGluY2x1ZGVzIHByaW1pdGl2ZSB0eXBlcyAoc3RyaW5ncywgbnVtYmVycywgYm9vbGVhbnMpLCBhcnJheXMsIGFuZCBwbGFpbiBvYmplY3RzLiBcbklmIHlvdSBuZWVkIHRvIGluY2x1ZGUgY29tcGxleCBkYXRhIHR5cGVzLCBjb25zaWRlciBjb252ZXJ0aW5nIHRoZW0gdG8gYSBzZXJpYWxpemFibGUgc3RydWN0dXJlIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gdGhlIGZ1bmN0aW9uLlxuT3IgdXNlIE15b3AgbWVzc2FnZSB0aGF0IHN1cHBvcnQgaXQ6IEN1c3RvbVJlZk1lc3NhZ2UsIEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlIG9yIEV4ZWN1dGVTY3JpcHRNZXNzYWdlLlxuXG5TdWdnZXN0ZWQgRml4OlxuMS4gUmVtb3ZlIG9yIHJlcGxhY2Ugbm9uLXNlcmlhbGl6YWJsZSB2YWx1ZXMgZnJvbSB5b3VyIGlucHV0LlxuMi4gSWYgdXNpbmcgb2JqZWN0cywgZW5zdXJlIHRoZXkgZG8gbm90IGNvbnRhaW4gYW55IGZ1bmN0aW9ucyBvciBjaXJjdWxhciByZWZlcmVuY2VzLlxuMy4gQ29udmVydCBhbnkgY2xhc3MgaW5zdGFuY2VzIHRvIHBsYWluIG9iamVjdHMgb3IgSlNPTi1jb21wYXRpYmxlIGZvcm1hdHMuXG40LiBVc2UgZGVkaWNhdGVkIE15b3AgbWVzc2FnZS5cblxuRm9yIG1vcmUgZGV0YWlscyBvbiBzZXJpYWxpemF0aW9uIGFuZCBNeW9wIG1lc3NhZ2UgZXhhbXBsZXMsIHJlZmVyIHRvIGh0dHBzOi8vZG9jcy5teW9wLmRldlxcLlxuXG5gKTtcbiAgICB9XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wQ29tcG9uZW50LCBJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBFeGVjdXRlQ29tcG9uZW50TWV0aG9kfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7SUNvbXBvbmVudERlZmluaXRpb25Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7RW52ZWxvcGVkTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzL0VudmVsb3BlZE1lc3NhZ2VcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcblxuZXhwb3J0IGNsYXNzIE15b3BSZWZDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHB1YmxpYyBwYXJlbnQ6IElNeW9wQ29tcG9uZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICAvL1RPRE8gOiBjaGVjayBwYXJlbnRDb21wb25lbnQuY29udGFpbmVyLi4uXG4gICAgICAgIHN1cGVyKGNvbXBvbmVudERlZmluaXRpb24sIHBhcmVudC5jb250YWluZXIsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIC8vdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKGFyZ3VtZW50cy5jYWxsZWUubmFtZSkpO1xuICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ2hpZGUnKSk7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdzaG93JykpO1xuICAgIH1cblxuICAgIGluc3BlY3QoKSB7XG4gICAgICAgIC8vVE9ETyA6IHN1cHBvcnQgcmVhbCBjbGVhbnVwXG4gICAgICAgIC8vY29uc29sZS5sb2coJ3JlZiBpbnNwZWN0IGNhbGxlZCwgY3JlYXRpbmcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCBpbnNwZWN0JywgZG9jdW1lbnQubG9jYXRpb24uaHJlZiwgdGhpcy5pZCk7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ2luc3BlY3QnKSk7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0QmFzZWRPbkRvY3VtZW50RWxlbWVudCgpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ3NldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQnKSk7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ3NldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQnKSk7XG4gICAgfVxuXG4gICAgb25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIGlmIChpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnKSB7XG4gICAgICAgIC8vICBkZWJ1Z2dlcjtcbiAgICAgICAgLy8gICAgIHRoaXMuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpO1xuICAgICAgICAvLyAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIC8vIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLm9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2UpO1xuICAgIH1cblxuXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygncmVmIG1lc3NhZ2Ugc2VuZGluZyAnLCBtZXNzYWdlKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBjb25zdCBoYW5kbGVyID0gbWVzc2FnZS5oYW5kbGVyXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlKTtcblxuICAgICAgICAvLyB0aGlzLmlkIHdpbGwgYmUgYXZhaWxhYmxlIG9uIHRoZSBuZXN0ZWQgY29tcG9uZW50XG4gICAgICAgIHRoaXMucGFyZW50LnNlbmQobmV3IEVudmVsb3BlZE1lc3NhZ2UodGhpcy5pZCwgbWVzc2FnZSkpO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbWVzc2FnZS5oYW5kbGVyID0gaGFuZGxlclxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfTtcblxuICAgIGRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzSW5pdGlhdGVkKVxuICAgICAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdkaXNwb3NlJykpO1xuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7QXV0b1NpemVPcHRpb25zLCBCYXNlTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtzZXREZWJ1Z1N0eWxlfSBmcm9tIFwiLi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNES1wiO1xuXG4vKipcbiAqIENvbXBvbmVudCB3cmFwcGVyIGZvciBNeW9wIFdlYiBDb21wb25lbnRzIHRoYXQgYXJlIGV4dHJhY3RlZCBmcm9tIEhUTUxcbiAqIGFuZCBydW4gZGlyZWN0bHkgb24gdGhlIGhvc3QgZG9jdW1lbnQgKG5vdCBpbiBhbiBpZnJhbWUpLlxuICpcbiAqIFRoZXNlIGNvbXBvbmVudHMgdXNlIHRoZSBuYXRpdmUgV2ViIENvbXBvbmVudHMgQVBJIChDdXN0b20gRWxlbWVudHMgKyBTaGFkb3cgRE9NKVxuICogYW5kIGNvbW11bmljYXRlIHZpYSBkaXJlY3QgbWV0aG9kIGNhbGxzIGFuZCBDdXN0b21FdmVudHMgaW5zdGVhZCBvZiBwb3N0TWVzc2FnZS5cbiAqL1xuZXhwb3J0IGNsYXNzIE15b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG4gICAgcHJpdmF0ZSBjdGFDbGVhbnVwPzogKCkgPT4gdm9pZDtcbiAgICBwcml2YXRlIF9jdGFIYW5kbGVyPzogKGFjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKSA9PiB2b2lkO1xuICAgIHByaXZhdGUgX2N0YVF1ZXVlOiBBcnJheTx7YWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd259PiA9IFtdO1xuXG4gICAgLy8gQSBzaW5nbGUgJ215b3AtY3RhJyBsaXN0ZW5lciwgYXR0YWNoZWQgYXQgY29uc3RydWN0aW9uIHNvIENUQXMgYSBjb21wb25lbnRcbiAgICAvLyBkaXNwYXRjaGVzIGR1cmluZyBpdHMgZmlyc3QgaW5pdFdpdGhEYXRhKCkgcmVuZGVyIFx1MjAxNCBiZWZvcmUgdGhlIGhvc3QgYXR0YWNoZXNcbiAgICAvLyBhIGhhbmRsZXIgXHUyMDE0IGFyZSBidWZmZXJlZCAoYW5kIGZsdXNoZWQgb24gc2V0Q3RhSGFuZGxlciksIG1hdGNoaW5nIHRoZSBpZnJhbWVcbiAgICAvLyBwYXRoJ3MgcHJlLWhhbmRsZXIgQ1RBIHF1ZXVlLlxuICAgIHByaXZhdGUgX2N0YUxpc3RlbmVyID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGRldGFpbCA9IChlIGFzIEN1c3RvbUV2ZW50KS5kZXRhaWw7XG4gICAgICAgIGlmICghZGV0YWlsPy5hY3Rpb24pIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuX2N0YUhhbmRsZXIgJiYgIXRoaXMubWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2N0YUhhbmRsZXIoZGV0YWlsLmFjdGlvbiwgZGV0YWlsLnBheWxvYWQpO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl9jdGFIYW5kbGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9jdGFRdWV1ZS5wdXNoKHsgYWN0aW9uOiBkZXRhaWwuYWN0aW9uLCBwYXlsb2FkOiBkZXRhaWwucGF5bG9hZCB9KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgICAgIHNraW46IElTa2luQ29uZmlnLFxuICAgICAgICBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgICAgICAgcHJpdmF0ZSBjdXN0b21FbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICAgICAgcHJpdmF0ZSB0YWdOYW1lOiBzdHJpbmcsXG4gICAgICAgIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGNvbXBvbmVudERlZmluaXRpb24sIGNvbnRhaW5lciwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGN1c3RvbUVsZW1lbnQ7XG5cbiAgICAgICAgLy8gTGlzdGVuIEJFRk9SRSBhbnkgaW5pdFdpdGhEYXRhIHJlbmRlciBzbyBpbml0LXRpbWUgQ1RBcyBhcmVuJ3QgbG9zdC5cbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ215b3AtY3RhJywgdGhpcy5fY3RhTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLmN0YUNsZWFudXAgPSAoKSA9PiB0aGlzLmN1c3RvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbXlvcC1jdGEnLCB0aGlzLl9jdGFMaXN0ZW5lcik7XG5cbiAgICAgICAgLy8gV2ViIGNvbXBvbmVudHMgYXJlIGluaXRpYXRlZCBpbW1lZGlhdGVseSAobm8gcG9zdE1lc3NhZ2UgaGFuZHNoYWtlIG5lZWRlZClcbiAgICAgICAgdGhpcy5zZXRJbml0aWF0ZWQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9hdXRvU2l6ZU9wdGlvbnM/OiBBdXRvU2l6ZU9wdGlvbnM7XG5cbiAgICAvKipcbiAgICAgKiBEYXRhLW91dCBmb3Igc2l6ZSBcdTIwMTQgdGhlIGV4dHJhY3RlZCBjb3VudGVycGFydCBvZiB0aGUgaWZyYW1lIGltcGxlbWVudGF0aW9uLlxuICAgICAqXG4gICAgICogVEhJUyBFWElTVEVEIE9OTFkgT04gTXlvcElmcmFtZUNvbXBvbmVudCwgYW5kIHRoYXQgd2FzIGludmlzaWJsZSBmb3IgYXMgbG9uZyBhc1xuICAgICAqIG1pbmlmaWNhdGlvbiB3YXMgc2VuZGluZyBldmVyeSB2MiBjb21wb25lbnQgZG93biB0aGUgaWZyYW1lIHBhdGguIFJlc3RvcmluZyB2MlxuICAgICAqIGRldGVjdGlvbiBtb3ZlcyB0aGVtIHRvIHRoaXMgY2xhc3MsIGFuZCBgQG15b3AvcmVhY3RgIGRyaXZlcyBib3RoIHRocm91Z2ggb25lXG4gICAgICogd3JhcHBlcjogaW4gY29udGVudCBtb2RlIGl0IGhpZGVzIGl0cyBsb2FkZXIgZnJvbSB0aGUgRklSU1Qgb25TaXplQ2hhbmdlLCBzbyBhXG4gICAgICogY29tcG9uZW50IHdob3NlIGNsYXNzIGhhcyBubyBvYnNlcnZlQXV0b1NpemUgbGVhdmVzIGEgUmVhY3QgaG9zdCBvbiBhIGxvYWRlclxuICAgICAqIGZvcmV2ZXIuIFBpYy1UaW1lJ3Mgc2l6ZU1ldGEgaXMgd2lkdGg6MTAwJSB3aXRoIG5vIGhlaWdodCwgd2hpY2ggaXMgZXhhY3RseSBjb250ZW50XG4gICAgICogbW9kZS4gQ2F1Z2h0IGJ5IHYyLWRhdGEtY29udHJhY3QgRDggKEFQSSBwYXJpdHkpLlxuICAgICAqXG4gICAgICogSXQgUkVQT1JUUyByYXRoZXIgdGhhbiBpbXBvc2VzLiBBbiBpZnJhbWUgaGFzIG5vIGludHJpbnNpYyBzaXplIGFuZCBtdXN0IGJlXG4gICAgICogbWVhc3VyZWQgaW5zaWRlIGFuZCB0aGVuIHNldCBmcm9tIG91dHNpZGU7IGEgY3VzdG9tIGVsZW1lbnQgc2l6ZXMgaXRzZWxmIGZyb20gaXRzXG4gICAgICogb3duIGNvbnRlbnQsIHNvIHRoZSBob25lc3QgdGhpbmcgaXMgdG8gbWVhc3VyZSBpdCBhbmQgdGVsbCB0aGUgaG9zdCwgYW5kIGxldCB0aGVcbiAgICAgKiBob3N0IGRlY2lkZS4gUmVhY3QgdGhlbiB1c2VzIHdpZHRoOjEwMCUgYW5kIHRoZSBtZWFzdXJlZCBoZWlnaHQuXG4gICAgICpcbiAgICAgKiBUaGUgb25lIHRoaW5nIGl0IGRvZXMgaW1wb3NlIGlzIGBkaXNwbGF5OiBibG9ja2Agd2hlbiB0aGUgZWxlbWVudCBjb21wdXRlcyB0b1xuICAgICAqIGBpbmxpbmVgLCB3aGljaCBpcyB0aGUgZGVmYXVsdCBmb3IgYSBjdXN0b20gZWxlbWVudCBhbmQgbWVhc3VyZXMgYXMgemVybyBoZWlnaHQgbm9cbiAgICAgKiBtYXR0ZXIgd2hhdCBpdCBjb250YWlucy4gVGhlIGlmcmFtZSBwYXRoIGZvcmNlcyB3aWR0aDoxMDAlIGZvciB0aGUgc2FtZSByZWFzb24gXHUyMDE0XG4gICAgICogd2l0aG91dCBpdCB0aGUgZmlyc3QgbWVhc3VyZW1lbnQgaXMgMCBhbmQgdGhlIGhvc3Qgc2l6ZXMgdGhlIGNvbXBvbmVudCB0byBub3RoaW5nLlxuICAgICAqL1xuICAgIG9ic2VydmVBdXRvU2l6ZSA9IChvcHRpb25zPzogQXV0b1NpemVPcHRpb25zKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgICAgICB0aGlzLl9hdXRvU2l6ZU9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBlbCA9IHRoaXMuY3VzdG9tRWxlbWVudDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGdldENvbXB1dGVkU3R5bGUoZWwpLmRpc3BsYXkgPT09ICdpbmxpbmUnKSBlbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgfSBjYXRjaCB7IC8qIGRldGFjaGVkIG9yIG5vIGxheW91dCB5ZXQ7IHRoZSBvYnNlcnZlciB3aWxsIHJlcG9ydCBvbmNlIGl0IGhhcyBvbmUgKi8gfVxuXG4gICAgICAgIGNvbnN0IHBhcnNlID0gKHY6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2ID09PSAnbnVtYmVyJykgcmV0dXJuIHY7XG4gICAgICAgICAgICBjb25zdCBuID0gcGFyc2VGbG9hdCh2KTtcbiAgICAgICAgICAgIHJldHVybiBpc05hTihuKSA/IHVuZGVmaW5lZCA6IG47XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGNsYW1wID0gKHY6IG51bWJlciwgbWluPzogbnVtYmVyLCBtYXg/OiBudW1iZXIpID0+XG4gICAgICAgICAgICBtaW4gIT09IHVuZGVmaW5lZCAmJiB2IDwgbWluID8gbWluIDogKG1heCAhPT0gdW5kZWZpbmVkICYmIHYgPiBtYXggPyBtYXggOiB2KTtcblxuICAgICAgICBjb25zdCByZXBvcnQgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5fYXV0b1NpemVPcHRpb25zO1xuICAgICAgICAgICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgY29uc3QgYXV0b0hlaWdodCA9IG9wdHM/LmV4cGxpY2l0SGVpZ2h0ID09PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBvcHRzPy5vblNpemVDaGFuZ2U/Lih7XG4gICAgICAgICAgICAgICAgd2lkdGg6IHJlY3Qud2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBhdXRvSGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgID8gY2xhbXAocmVjdC5oZWlnaHQsIHBhcnNlKG9wdHM/Lm1pbkhlaWdodCksIHBhcnNlKG9wdHM/Lm1heEhlaWdodCkpXG4gICAgICAgICAgICAgICAgICAgIDogcmVjdC5oZWlnaHQsXG4gICAgICAgICAgICAgICAgYXV0b1NpemluZ1dpZHRoOiBmYWxzZSwgICAvLyBhIHdlYiBjb21wb25lbnQgZmlsbHMgaXRzIGNvbnRhaW5lcidzIHdpZHRoXG4gICAgICAgICAgICAgICAgYXV0b1NpemluZ0hlaWdodDogYXV0b0hlaWdodCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBybzogUmVzaXplT2JzZXJ2ZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBybyA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiByZXBvcnQoKSk7XG4gICAgICAgICAgICByby5vYnNlcnZlKGVsKTtcbiAgICAgICAgfSBjYXRjaCB7IC8qIG5vIFJlc2l6ZU9ic2VydmVyOiB0aGUgb25lLXNob3QgcmVwb3J0IGJlbG93IHN0aWxsIHVuYmxvY2tzIHRoZSBob3N0ICovIH1cblxuICAgICAgICAvLyBGaXJlIG9uY2UgaW1tZWRpYXRlbHkuIEhvc3RzIGdhdGUgdGhlaXIgbG9hZGVyIG9uIHRoZSBGSVJTVCBtZWFzdXJlbWVudCwgc28gYVxuICAgICAgICAvLyBjb21wb25lbnQgdGhhdCBuZXZlciByZXNpemVzIG11c3Qgc3RpbGwgcHJvZHVjZSBvbmUuXG4gICAgICAgIHJlcG9ydCgpO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7IHJvPy5kaXNjb25uZWN0KCk7IHRoaXMuX2F1dG9TaXplT3B0aW9ucyA9IHVuZGVmaW5lZDsgfTtcbiAgICB9XG5cbiAgICBjbGVhbnVwSW5zcGVjdDogQ2xlYW51cEhhbmRsZXIgPSAoKSA9PiB7fTtcblxuICAgIGluc3BlY3QoKSB7XG4gICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QgPSBzZXREZWJ1Z1N0eWxlKHRoaXMuaWQsICdNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50JywgMCwgdGhpcy5jb250YWluZXIsIHRoaXMuY3VzdG9tRWxlbWVudCwgdGhpcy5jb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xlYW51cEluc3BlY3Q7XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCc7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICd1bnNldCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2FsbCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS53aWR0aCA9ICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIGNvbXBvbmVudCB3aXRoIGRhdGEgYnkgY2FsbGluZyBteW9wX2luaXRfaW50ZXJmYWNlIGRpcmVjdGx5XG4gICAgICovXG4gICAgaW5pdFdpdGhEYXRhKGRhdGE6IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5jdXN0b21FbGVtZW50IGFzIGFueSkubXlvcF9pbml0X2ludGVyZmFjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgKHRoaXMuY3VzdG9tRWxlbWVudCBhcyBhbnkpLm15b3BfaW5pdF9pbnRlcmZhY2UoZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY3VycmVudCBkYXRhIGZyb20gdGhlIGNvbXBvbmVudFxuICAgICAqL1xuICAgIGdldERhdGEoKTogdW5rbm93biB7XG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuY3VzdG9tRWxlbWVudCBhcyBhbnkpLm15b3BfaW5pdF9pbnRlcmZhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy5jdXN0b21FbGVtZW50IGFzIGFueSkubXlvcF9pbml0X2ludGVyZmFjZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IENUQSBoYW5kbGVyIC0gdW5pZmllZCBBUEkgd2l0aCBpZnJhbWUgY29tcG9uZW50cy5cbiAgICAgKiBDYWxsZWQgdmlhIHByb3BzLm15b3BfY3RhX2hhbmRsZXIgPSBoYW5kbGVyXG4gICAgICovXG4gICAgc2V0Q3RhSGFuZGxlcihoYW5kbGVyOiAoYWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24pID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgLy8gVGhlICdteW9wLWN0YScgbGlzdGVuZXIgaXMgYXR0YWNoZWQgaW4gdGhlIGNvbnN0cnVjdG9yLCBzbyB3ZSBvbmx5IHNldCB0aGVcbiAgICAgICAgLy8gaGFuZGxlciBhbmQgZmx1c2ggYW55dGhpbmcgdGhlIGNvbXBvbmVudCBlbWl0dGVkIGJlZm9yZSBub3cgKGUuZy4gZHVyaW5nIHRoZVxuICAgICAgICAvLyBmaXJzdCBpbml0V2l0aERhdGEgcmVuZGVyKS5cbiAgICAgICAgdGhpcy5fY3RhSGFuZGxlciA9IGhhbmRsZXI7XG5cbiAgICAgICAgaWYgKHRoaXMuX2N0YVF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXVlID0gWy4uLnRoaXMuX2N0YVF1ZXVlXTtcbiAgICAgICAgICAgIHRoaXMuX2N0YVF1ZXVlID0gW107XG4gICAgICAgICAgICBxdWV1ZS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5tYXJrZWRGb3JEaXNwb3NlZCkge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyKGl0ZW0uYWN0aW9uLCBpdGVtLnBheWxvYWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBtZXNzYWdlLWJhc2VkIGNvbXBvbmVudHMuXG4gICAgICogV2ViIGNvbXBvbmVudHMgZG9uJ3QgdXNlIHBvc3RNZXNzYWdlLCBzbyB0aGlzIGlzIGEgbm8tb3AgZm9yIG1vc3QgbWVzc2FnZXMuXG4gICAgICovXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2U8YW55PikgPT4ge1xuICAgICAgICAvLyBXZWIgY29tcG9uZW50cyBkb24ndCB1c2UgdGhlIHBvc3RNZXNzYWdlIHN5c3RlbVxuICAgICAgICAvLyBJbnN0ZWFkLCBpbnRlcmFjdCBkaXJlY3RseSB2aWEgcHJvcHMubXlvcF9pbml0X2ludGVyZmFjZSBhbmQgcHJvcHMubXlvcF9jdGFfaGFuZGxlclxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZSk7XG5cbiAgICAgICAgLy8gTG9nIGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnW015b3BFeHRyYWN0ZWRXZWJDb21wb25lbnRdIHNlbmQoKSBjYWxsZWQgLSB3ZWIgY29tcG9uZW50cyB1c2UgZGlyZWN0IEFQSSBpbnN0ZWFkJywgbWVzc2FnZSk7XG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH1cblxuICAgIGRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmN0YUNsZWFudXApIHtcbiAgICAgICAgICAgIHRoaXMuY3RhQ2xlYW51cCgpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnBhcmVudE5vZGU/LnJlbW92ZUNoaWxkKHRoaXMuY3VzdG9tRWxlbWVudCk7XG4gICAgfVxufVxuIiwgIi8vdHlwZSBBQ29uc3RydWN0b3JUeXBlT2Y8VD4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBDdXN0b21SZWZNZXNzYWdlLCBSZWZ9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0ICogYXMgbWVzc2FnZXMgZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIENsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50Q29uZmlnLFxuICAgIHR5cGUgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSUNvbXBvbmVudFJlZkJlaGF2aW9yLCBJSFRNTExvYWRlckNvbmZpZywgSVByb3BDb2RlQmVoYXZpb3IsXG4gICAgSVByb3BDb25maWcsIElTa2luQ29uZmlnLCBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcyxcbiAgICBSZWZCZWhhdmlvclR5cGUsIFNoYWRvd1Jvb3RNb2RlVHlwZSwgU2tpbkxvYWRlcnMsIFNraW5Mb2FkZXJUeXBlXG59IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7Y29udGFpbnNQcmltaXRpdmVzT25seX0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uXCI7XG5pbXBvcnQge0Vycm9yc30gZnJvbSBcIi4vbG9nTWVzc2FnZXNcIjtcbmltcG9ydCB7TXlvcFJlZkNvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9teW9wUmVmQ29tcG9uZW50XCI7XG5pbXBvcnQge015b3BFeHRyYWN0ZWRXZWJDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvbXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudFwiO1xuaW1wb3J0IHtNeW9wSWZyYW1lQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL215b3BJZnJhbWVDb21wb25lbnRcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4vaG9zdFNES1wiO1xuXG50eXBlIGNvbXBvbmVudERlZmluaXRpb25Qcm9wcyA9IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnWydwcm9wcyddXG5cbmNvbnN0IGNyZWF0ZURlYnVnVGl0bGUgPSAodGV4dDogc3RyaW5nLCB0b3A6IG51bWJlciwgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZzogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcpID0+IHtcbiAgICBjb25zdCB0aXRsZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIHRpdGxlRWwudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgIHRpdGxlRWwuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgIHRpdGxlRWwuc3R5bGUucGFkZGluZyA9ICcwIDVweCc7XG4gICAgdGl0bGVFbC5zdHlsZS5mb250U2l6ZSA9ICcxNHB4JztcbiAgICB0aXRsZUVsLnN0eWxlWyd0b3AnXSA9ICcwJztcbiAgICB0aXRsZUVsLnN0eWxlLnRvcCA9IGAke3RvcH1weGA7XG4gICAgLy90aXRsZUVsLnN0eWxlLmxlZnQgPSAnNTAlJztcbiAgICB0aXRsZUVsLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVYKC01MCUpJztcbiAgICB0aXRsZUVsLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgIHRpdGxlRWwuaHJlZiA9IGBodHRwczovL2Rhc2hib2FyZC5teW9wLmRldi9kYXNoYm9hcmQvY29tcG9uZW50LyR7Y29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5pZH1gXG5cbiAgICByZXR1cm4gdGl0bGVFbDtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXREZWJ1Z1N0eWxlID0gKGlkOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRFbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb25Db25maWc6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG4pOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgLy8jMDA3QkZGIChibHVlKSBvciAjRkY1NzIyIChvcmFuZ2UpXG4gICAgLy8jNENBRjUwIChncmVlbikgb3IgI0ZGQzEwNyAoYW1iZXIpXG4gICAgLy8gY29uc3QgdG9wVGV4dCA9IGNyZWF0ZURlYnVnVGl0bGUoYCR7aWR9IDogJHt0eXBlfWAsIHRvcCwgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyk7XG4gICAgY29uc3QgdG9wVGV4dCA9IGNyZWF0ZURlYnVnVGl0bGUoYCR7Y29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5uYW1lfSA6ICR7dHlwZX1gLCB0b3AsIGNvbXBvbmVudERlZmluaXRpb25Db25maWcpO1xuICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUodG9wVGV4dCwgY29tcG9uZW50RWxlbWVudCk7XG4gICAgY29tcG9uZW50RWxlbWVudC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICMwMDdCRkYnO1xuICAgIGNvbXBvbmVudEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb21wb25lbnRFbGVtZW50LnN0eWxlLmJvcmRlciA9ICd1bnNldCc7XG4gICAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZCh0b3BUZXh0KTtcbiAgICB9XG59XG5cbmNvbnN0IHJlcG9ydEVycm9yID0gKHByb3BDb25maWc6IElQcm9wQ29uZmlnLCBwcm9wTmFtZTogc3RyaW5nLCBjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50PGFueSwgYW55PikgPT4ge1xuICAgIGlmICghcHJvcENvbmZpZykge1xuXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAvLyB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXJyb3I6IFVuZGVmaW5lZCBQcm9wXFxuXFxuYCArXG4gICAgICAgICAgICBgSXQgbG9va3MgbGlrZSB5b3UndmUgdHJpZWQgdG8gdXNlIGEgcHJvcCB0aGF0IGhhc24ndCBiZWVuIGRlZmluZWQuXFxuYCArXG4gICAgICAgICAgICBgUGxlYXNlIGNoZWNrIHRoZSBwcm9wIG5hbWUgZm9yIGFueSB0eXBvcyBvciBlbnN1cmUgdGhhdCBpdCBpcyBwcm9wZXJseSBkZWZpbmVkIGluIHRoZSBjb21wb25lbnQncyBwcm9wIGxpc3QuXFxuXFxuYCArXG4gICAgICAgICAgICBgUHJvcCBOYW1lOiAke3Byb3BOYW1lfVxcbmAgK1xuICAgICAgICAgICAgYENvbXBvbmVudDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lfSwgSUQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9XFxuXFxuYCArXG4gICAgICAgICAgICBgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSBjb21wb25lbnQgcGFnZSBodHRwczovL2Rhc2hib2FyZC5teW9wLmRldi9kYXNoYm9hcmQvY29tcG9uZW50LyR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9IG9yIGNvbnN1bHQgdGhlIGRldmVsb3BlciBndWlkZS5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxufVxuXG5jb25zdCByZXBvcnRVbnN1cHBvcnRlZCA9IChwcm9wQ29uZmlnOiBJUHJvcENvbmZpZywgcHJvcE5hbWU6IHN0cmluZywgY29tcG9uZW50OiBJTXlvcENvbXBvbmVudDxhbnksIGFueT4pID0+IHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgRXJyb3I6IENvZGUgUHJvcCBOb3QgU3VwcG9ydGVkXFxuXFxuYCArXG4gICAgICAgIGBDdXJyZW50bHksIGNvZGUgcHJvcHMgYXJlIG9ubHkgc3VwcG9ydGVkIGluIGxvY2FsIGZyYW1lIGNvbXBvbmVudHMuXFxuYCArXG4gICAgICAgIGBcdTI2QTBcdUZFMEYgVGhpcyBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MgZmVhdHVyZSBcdTIwMTQgY29kZSBwcm9wcyB3aWxsIGJlIHN1cHBvcnRlZCBpbiB1cGNvbWluZyB2ZXJzaW9ucy5cXG5cXG5gICtcbiAgICAgICAgYEluIHRoZSBtZWFudGltZSwgeW91IGNhbiB1c2UgbWVzc2FnZSBwcm9wcy5cXG5cXG5gICtcbiAgICAgICAgYFByb3AgTmFtZTogJHtwcm9wTmFtZX1cXG5gICtcbiAgICAgICAgYENvbXBvbmVudDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lfSwgSUQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9XFxuXFxuYCArXG4gICAgICAgIGBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gdGhlIGNvbXBvbmVudCBwYWdlIGh0dHBzOi8vZGFzaGJvYXJkLm15b3AuZGV2L2Rhc2hib2FyZC9jb21wb25lbnQvJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH0gb3IgY29uc3VsdCB0aGUgZGV2ZWxvcGVyIGd1aWRlLmBcbiAgICApO1xufVxuXG5leHBvcnQgY29uc3QgY29ubmVjdFByb3BzID0gPFQgZXh0ZW5kcyBjb21wb25lbnREZWZpbml0aW9uUHJvcHM+KGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIHByb3BzQ29uZmlnOiBJUHJvcENvbmZpZ1tdLCBzZWxlY3RlZFNraW46IElTa2luQ29uZmlnKSA9PiB7XG5cbiAgICBjb25zdCBwcm9wc01hcCA9IHByb3BzQ29uZmlnLnJlZHVjZSgocHJldmlvdXNWYWx1ZSwgY3VycmVudFZhbHVlKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5wcmV2aW91c1ZhbHVlLFxuICAgICAgICAgICAgW2N1cnJlbnRWYWx1ZS5uYW1lXTogey4uLmN1cnJlbnRWYWx1ZX1cbiAgICAgICAgfVxuICAgIH0sIHt9KTtcblxuICAgIGNvbnN0IHByb3BzSGFuZGxlciA9IHtcbiAgICAgICAgZ2V0OiAoXzogSU15b3BDb21wb25lbnQsIHByb3A6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgcHJvcENvbmZpZyA9IHByb3BzTWFwW3Byb3BdO1xuXG4gICAgICAgICAgICBpZiAocmVwb3J0RXJyb3IocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IudHlwZSA9PT0gUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZSkge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBleHRyYWN0ZWQgd2ViIGNvbXBvbmVudHMgRklSU1RcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BOYW1lID0gdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2luaXRfaW50ZXJmYWNlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBnZXRzL3NldHMgZGF0YSAobWF0Y2hlcyBpZnJhbWUgYmVoYXZpb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGRhdGE/OiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50LmdldERhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmluaXRXaXRoRGF0YShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBGb3IgbXlvcF9jdGFfaGFuZGxlciwgcmV0dXJuIHVuZGVmaW5lZCAoaXQncyB3cml0ZS1vbmx5KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIElzb2xhdGVkIGlmcmFtZTogbm8gc2FtZS1vcmlnaW4gYWNjZXNzIFx1MjAxNCB1c2UgdGhlIHBvc3RNZXNzYWdlIGJyaWRnZVxuICAgICAgICAgICAgICAgIC8vIChzYW1lIG1ldGhvZCBzdXJmYWNlIGFzIHRoZSBleHRyYWN0ZWQtV0MgYnJhbmNoIGFib3ZlKS5cbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgTXlvcElmcmFtZUNvbXBvbmVudCAmJiBjb21wb25lbnQuaXNvbGF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHR5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3A7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ215b3BfaW5pdF9pbnRlcmZhY2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGRhdGE/OiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGNvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmluaXRXaXRoRGF0YShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gbXlvcF9jdGFfaGFuZGxlciBpcyB3cml0ZS1vbmx5XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gRm9yIGlmcmFtZSAobG9jYWxGcmFtZSkgY29tcG9uZW50c1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGUgPT09IFNraW5Mb2FkZXJzLkhUTUxMb2FkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRMb2FkZXIgPSBzZWxlY3RlZFNraW4ubG9hZGVyIGFzIElIVE1MTG9hZGVyQ29uZmlnO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRMb2FkZXIuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5sb2NhbEZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50LmVsZW1lbnQuY29udGVudFdpbmRvd1t0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVwb3J0VW5zdXBwb3J0ZWQocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLm1vZGUgPT09ICdvdXRwdXQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VQYXJhbXM6IGFueVtdID0gW107XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHR1cm4gaXQgaW50byBjb25maWdcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goUmVmLmNyZWF0ZShwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKC4uLnByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZUN0b3IgPSBtZXNzYWdlc1twcm9wQ29uZmlnLmJlaGF2aW9yLm1lc3NhZ2VdO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBtZXNzYWdlQ3RvciguLi5tZXNzYWdlUGFyYW1zKSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH0sXG4gICAgICAgIHNldDogKF86IElNeW9wQ29tcG9uZW50LCBwcm9wOiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IHByb3BDb25maWcgPSBwcm9wc01hcFtwcm9wXTtcblxuICAgICAgICAgICAgaWYgKHJlcG9ydEVycm9yKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGUgPT09IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgZXh0cmFjdGVkIHdlYiBjb21wb25lbnRzIEZJUlNUIChiZWZvcmUgbG9jYWxGcmFtZSBjaGVjaylcbiAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIGV4dHJhY3RlZCB3ZWIgY29tcG9uZW50cyBtYXkgaGF2ZSBzaGFkb3dSb290TW9kZTogbG9jYWxGcmFtZSBpbiB0aGVpciBjb25maWdcbiAgICAgICAgICAgICAgICAvLyBidXQgdGhleSBydW4gZGlyZWN0bHkgb24gdGhlIGhvc3QgZG9jdW1lbnQsIG5vdCBpbiBhbiBpZnJhbWVcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BOYW1lID0gdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2N0YV9oYW5kbGVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNldEN0YUhhbmRsZXIodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2luaXRfaW50ZXJmYWNlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmluaXRXaXRoRGF0YSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIElzb2xhdGVkIGlmcmFtZTogcm91dGUgdmlhIHRoZSBwb3N0TWVzc2FnZSBicmlkZ2UgKG5vIHNhbWUtb3JpZ2luIGFjY2VzcykuXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIE15b3BJZnJhbWVDb21wb25lbnQgJiYgY29tcG9uZW50Lmlzb2xhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSB0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2N0YV9oYW5kbGVyJykgeyBjb21wb25lbnQuc2V0Q3RhSGFuZGxlcih2YWx1ZSk7IHJldHVybiB0cnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ215b3BfaW5pdF9pbnRlcmZhY2UnKSB7IGNvbXBvbmVudC5pbml0V2l0aERhdGEodmFsdWUpOyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEZvciBpZnJhbWUgKGxvY2FsRnJhbWUpIGNvbXBvbmVudHNcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRTa2luLmxvYWRlci50eXBlID09PSBTa2luTG9hZGVycy5IVE1MTG9hZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTG9hZGVyID0gc2VsZWN0ZWRTa2luLmxvYWRlciBhcyBJSFRNTExvYWRlckNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVkTG9hZGVyLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudFdpbmRvdyA9IChjb21wb25lbnQuZWxlbWVudCBhcyBIVE1MSUZyYW1lRWxlbWVudCkuY29udGVudFdpbmRvdyBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHR5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3A7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgcmVhbCBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50V2luZG93W3Byb3BOYW1lXSA9IHZhbHVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGbHVzaCBDVEEgcXVldWUgaWYgdGhpcyBpcyBteW9wX2N0YV9oYW5kbGVyIGFuZCBxdWV1ZSBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ215b3BfY3RhX2hhbmRsZXInICYmIGNvbnRlbnRXaW5kb3cuX19teW9wX2N0YV9xdWV1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXVlID0gY29udGVudFdpbmRvdy5fX215b3BfY3RhX3F1ZXVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRXaW5kb3cuX19teW9wX2N0YV9xdWV1ZSA9IG51bGw7IC8vIENsZWFyIHRvIHByZXZlbnQgZG91YmxlLWZsdXNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUuZm9yRWFjaCgoaXRlbToge2FjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiBhbnl9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgaWYgY29tcG9uZW50IHdhcyBkaXNwb3NlZCBkdXJpbmcgZmx1c2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5tYXJrZWRGb3JEaXNwb3NlZCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZShpdGVtLmFjdGlvbiwgaXRlbS5wYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlcG9ydFVuc3VwcG9ydGVkKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL2lmKHByb3BDb25maWcuYmVoYXZpb3IgPT09IFByb3BDb25maWdCZWhhdmlvclR5cGVzLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcubW9kZSA9PT0gJ2lucHV0Jykge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBzdXBwb3J0IG11bHRpIGJlaGF2aW9yc1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGUgPT09ICdtZXNzYWdlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZVBhcmFtczogYW55W10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHR1cm4gaXQgaW50byBjb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaChSZWYuY3JlYXRlKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKC4uLnByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZUN0b3IgPSBtZXNzYWdlc1twcm9wQ29uZmlnLmJlaGF2aW9yLm1lc3NhZ2VdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IG1lc3NhZ2VDdG9yKC4uLm1lc3NhZ2VQYXJhbXMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yOiBVbnN1cHBvcnRlZCBCZWhhdmlvclxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBUaGUgJ2JlaGF2aW9yJyBmaWVsZCBwcm92aWRlZCBpcyBub3Qgc3VwcG9ydGVkLlxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBQcm9wIE5hbWU6ICR7cHJvcH1cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQmVoYXZpb3IgRmllbGQ6ICR7cHJvcENvbmZpZy5iZWhhdmlvci50eXBlfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBDaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdmFsaWQgYmVoYXZpb3Igb3B0aW9ucy5gXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29tcG9uZW50LnByb3BzID0ge307XG4gICAgY29tcG9uZW50LnByb3BzID0gbmV3IFByb3h5KGNvbXBvbmVudC5wcm9wcywgcHJvcHNIYW5kbGVyKTtcblxuICAgIHJldHVybiBjb21wb25lbnQgYXMgKE9taXQ8SU15b3BDb21wb25lbnQsICdwcm9wcyc+ICYge1xuICAgICAgICBwcm9wczogcHJvcFR5cGVzPFQ+XG4gICAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlZlByb3h5ID0gKHRhcmdldDogUmVmLCBjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50KSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh0YXJnZXQsIHtcbiAgICAgICAgZ2V0KHRhcmdldCwgcHJvcCkge1xuXG4gICAgICAgICAgICAvLyBpZiAocHJvcCA9PT0gJ19fbm9uUHJveGllZCcpIHtcbiAgICAgICAgICAgIC8vICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAodGFyZ2V0W3Byb3BdKSB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbcHJvcF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IGdldHRlckZ1bmN0aW9uID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXJncy5mb3JFYWNoKGFyZyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRhaW5zUHJpbWl0aXZlc09ubHkoYXJnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9ycy5ub3RTZXJpYWxpemFibGVSZWZDYWxsKHByb3AsIGFyZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgQ3VzdG9tUmVmTWVzc2FnZSgoe3JlZiwgcHJvcE5hbWUsIGZ1bmN0aW9uQXJncywgbWFrZVNlcmlhbGl6YWJsZX0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZWZbcHJvcE5hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFrZVNlcmlhbGl6YWJsZShyZWZbcHJvcE5hbWVdKC4uLmZ1bmN0aW9uQXJncyksIHRydWUpIC8vIEludm9rZSB0aGUgZnVuY3Rpb24gYW5kIHJldHVybiBpdHMgcmVzdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFrZVNlcmlhbGl6YWJsZSh2YWx1ZSwgdHJ1ZSk7IC8vIFJldHVybiB0aGUgcHJvcGVydHkgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogdHVybiBpdCB0byBjb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SWQ6IHRhcmdldC5yZWZDb25maWcuc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWU6IHByb3AsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25BcmdzOiBhcmdzXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKG1zZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobXNnLmNvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvL1RPRE86IHdlIGNhbiBpbXBsZW1lbnQgdGhpbmdzIGxpa2UgYXV0byBzZXJpYWxpemF0aW9uIGFuZCBiaW5kaW5nIGZ1bmN0aW9ucyBoZXJlXG4gICAgICAgICAgICAvL2dldHRlckZ1bmN0aW9uLnRlc3QgPSAnMTIzJztcblxuICAgICAgICAgICAgcmV0dXJuIGdldHRlckZ1bmN0aW9uO1xuXG4gICAgICAgICAgICAvL3JldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3ApO1xuICAgICAgICB9LFxuICAgICAgICBzZXQodGFyZ2V0LCBwcm9wOiBzdHJpbmcsIHZhbHVlKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgQ3VzdG9tUmVmTWVzc2FnZSgoe3JlZiwgcHJvcE5hbWUsIHByb3BWYWx1ZX0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZilcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZltwcm9wTmFtZV0gPSBwcm9wVmFsdWU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZDogdGFyZ2V0LnJlZkNvbmZpZy5zZWxlY3RvcixcbiAgICAgICAgICAgICAgICAgICAgcHJvcFZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWU6IHByb3BcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChtc2cpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogbG9nP1xuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVSZWZDb21wb25lbnQgPSBhc3luYyA8VCBleHRlbmRzIElNeW9wQ29tcG9uZW50ID0gSU15b3BDb21wb25lbnQ+KHJlZjogUmVmLCBjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGNvbXBvbmVudHM6IElNeW9wQ29tcG9uZW50W10sIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKTogUHJvbWlzZTxUPiA9PiB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gcmVmLmNvbXBvbmVudDtcbiAgICBpZiAoIWNvbXBvbmVudClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW50IGNyZWF0ZVJlZkNvbXBvbmVudCB3aXRoIGRldGFjaGVkIHJlZicpO1xuXG4gICAgLy9jb25zb2xlLmxvZygnY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCcsIHJlZiwgY29tcG9uZW50Q29uZmlnKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IG5ldyBNeW9wUmVmQ29tcG9uZW50KGNvbXBvbmVudENvbmZpZy50eXBlLCBjb21wb25lbnQsIG9wdGlvbnMpO1xuICAgICAgICBjb21wb25lbnRzLnB1c2gocmVmQ29tcG9uZW50KTtcblxuICAgICAgICAvLyBBIEZBSUxFRCBSRUYgTVVTVCBOT1QgS0VFUCBJVFMgUExBQ0VIT0xERVIuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoZSBwbGFjZWhvbGRlciBpcyByZWdpc3RlcmVkIGFib3ZlLCBiZWZvcmUgd2Uga25vdyB3aGV0aGVyIHRoZSBmcmFtZSBjYW5cbiAgICAgICAgLy8gYWN0dWFsbHkgY3JlYXRlIHRoZSBjb21wb25lbnQsIGFuZCBib3RoIGZhaWx1cmUgcGF0aHMgYmVsb3cgdXNlZCB0byByZWplY3RcbiAgICAgICAgLy8gd2l0aG91dCByZW1vdmluZyBpdC4gVGhlIGNhbGxlciBnZXRzIGEgcmVqZWN0aW9uIGFuZCBubyBoYW5kbGUsIHNvIG5vYm9keSBlbHNlXG4gICAgICAgIC8vIGNhbiBjbGVhbiBpdCB1cCBlaXRoZXIgLS0gZXhhY3RseSB0aGUgc2hhcGUgb2YgdGhlIHRpbWVvdXQgbGVhayBpblxuICAgICAgICAvLyBCYXNlTXlvcENvbXBvbmVudC4gSXQgaXMgcGVybWFuZW50IGFuZCBpdCBjb21wb3VuZHM6IGV2ZXJ5IHJldHJ5IG9mIGEgcmVmIHRoYXRcbiAgICAgICAgLy8gY2Fubm90IGJlIGNyZWF0ZWQgKGEgc2VsZWN0b3IgdGhhdCBtYXRjaGVzIG5vdGhpbmcsIGEgZnJhbWUgdGhhdCBuZXZlciBhbnN3ZXJzKVxuICAgICAgICAvLyBhZGRzIGFub3RoZXIgZGVhZCBlbnRyeSB0byB0aGUgYXJyYXkgdGhhdCBpc1RydXN0ZWRTb3VyY2Ugd2Fsa3Mgb24gZXZlcnlcbiAgICAgICAgLy8gbWVzc2FnZS4gQ2F1Z2h0IGJ5IHRlc3QvY29tcG9zaXRlLXJlZi5lMmUubWpzIGNhc2UgUjMuXG4gICAgICAgIGNvbnN0IHVucmVnaXN0ZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhdCA9IGNvbXBvbmVudHMuaW5kZXhPZihyZWZDb21wb25lbnQpO1xuICAgICAgICAgICAgaWYgKGF0ICE9PSAtMSkgY29tcG9uZW50cy5zcGxpY2UoYXQsIDEpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vZm9yIGNhc2VzIHdoZXJlIHJlZiBjb21wb25lbnRzIGRlZmluZSBpbiB0aGUgY29tcG9uZW50IGNvbmZpZ1xuICAgICAgICAvLyB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSByb290IGNvbXBvbmVudCB0aGUgYmUgaW5pdGlhdGVkIGJlZm9yZSBpbnRlcmFjdGluZyB3aXRoIGl0XG4gICAgICAgIGF3YWl0IGNvbXBvbmVudC5pbml0aWF0ZWQoKTtcblxuXG4gICAgICAgIC8vVE9ETyA6XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIC8vcmVqZWN0KCd0aW1lb3V0PycpO1xuICAgICAgICAgICAgdW5yZWdpc3RlcigpO1xuICAgICAgICAgICAgcmVqZWN0KCd0aW1lb3V0Jyk7XG4gICAgICAgIH0sIDUwMDApO1xuXG4gICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlKHJlZi5yZWZDb25maWcsXG4gICAgICAgICAgICBjb21wb25lbnRDb25maWcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4ub3B0aW9ucyA/IG9wdGlvbnMgOiB7fSxcbiAgICAgICAgICAgICAgICBpZDogcmVmQ29tcG9uZW50LmlkLFxuICAgICAgICAgICAgICAgIF9oYXNQYXJlbnQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhc3luYyAobWVzc2FnZSkgPT4ge1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY2hlY2sgaWYgdGltZW91dCBhbHJlYWR5IHBhc3NlZFxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmZhaWxlZCkge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOlxuICAgICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSBmYWlsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGltcGxlbWVudGF0aW9uQ29tcG9uZW50ID0gY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PSByZWZDb21wb25lbnQuaWQpO1xuXG4gICAgICAgICAgICAgICAgLy9zYW1lIG1lbW9yeSBlbnYsIHNhbWUgSG9zdFNES1xuICAgICAgICAgICAgICAgIGlmIChpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCAmJiBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCAhPT0gcmVmQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRIRSBQTEFDRUhPTERFUiBJUyBSRURVTkRBTlQgSEVSRSwgU08gRFJPUCBJVC5cbiAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBicmFuY2ggbWVhbnMgdGhlIGZyYW1lIG1vdW50ZWQgaW50byBPVVIgcmVnaXN0cnkgcmF0aGVyIHRoYW5cbiAgICAgICAgICAgICAgICAgICAgLy8gaXRzIG93biAtLSB0aGUgc2FtZS13aW5kb3cgY2FzZSB0aGUgd2ViY29tcG9uZW50IGhhbmRsZXIgY2FsbHNcbiAgICAgICAgICAgICAgICAgICAgLy8gXCJzYW1lIG1lbW9yeSB3aGVuIHVzaW5nIHdlYmNvbXBvbmVudFwiLiBCb3RoIHRoZSBwbGFjZWhvbGRlciBhbmQgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlYWwgY29tcG9uZW50IHdlcmUgdGhlbiByZWdpc3RlcmVkIHVuZGVyIHRoZSBTQU1FIGlkLCBhbmQgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHBsYWNlaG9sZGVyIHdhcyBsZWZ0IGJlaGluZCAodGhlIGBUT0RPIDogY2xlYW4gcmVmQ29tcG9uZW50ID9gIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCB0byBzaXQgaGVyZSkuIFR3byBlbnRyaWVzLCBvbmUgaWQsIG9uZSBvZiB0aGVtIGRlYWQuXG4gICAgICAgICAgICAgICAgICAgIHVucmVnaXN0ZXIoKTtcblxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gaW1wbGVtZW50YXRpb25Db21wb25lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoaW1wbGVtZW50YXRpb25Db21wb25lbnQgYXMgdW5rbm93biBhcyBUKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGBmaW5kYCBDQU4gQ09NRSBCQUNLIEVNUFRZLCBBTkQgdW5kZWZpbmVkICE9PSByZWZDb21wb25lbnQgSVMgVFJVRS5cbiAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgLy8gV2l0aG91dCB0aGUgZ3VhcmQgYWJvdmUsIHRoYXQgcmVzb2x2ZWQgdGhlIGNhbGxlcidzIHByb21pc2Ugd2l0aFxuICAgICAgICAgICAgICAgICAgICAvLyBgdW5kZWZpbmVkYDogbm8gZXJyb3IsIG5vIGNvbXBvbmVudCwgYW5kIHRoZSBwbGFjZWhvbGRlciBsZWZ0IGluXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWdpc3RyeS4gUmVwcm9kdWNlZCBieSBjcmVhdGluZyBhIHJlZiBmcm9tIGEgd2ViIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAvLyBwYXJlbnQgKGNvbXBvc2l0ZS1yZWYgY2FzZSBSNSksIHdoZXJlIHRoZSByZWFsIGNvbXBvbmVudCBpcyBwdXNoZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gaW50byBhIHJlZ2lzdHJ5IHRoZSBjYXB0dXJlZCBhcnJheSBubyBsb25nZXIgcmVmbGVjdHMuIEZhbGxpbmdcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3VnaCB0byB0aGUgcGxhY2Vob2xkZXIgZ2l2ZXMgdGhlIGNhbGxlciBhIHVzYWJsZSBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBzaWxlbmNlLlxuICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQuc2V0SW5pdGlhdGVkKClcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSA9IHJlZkNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBoZXJlID5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiB3aGF0IGFib3V0IHJlYXB0ZXJzID8hIGR5bmFtaWMgPyFcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBleHNpc3RpbmdSZWZDb21wb25lbnQgPSBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdIGFzIE15b3BSZWZDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgLy8gaWYgKGV4c2lzdGluZ1JlZkNvbXBvbmVudC5pZCAmJiBleHNpc3RpbmdSZWZDb21wb25lbnQucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSBbY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSwgcmVmQ29tcG9uZW50XTtcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSkpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXS5wdXNoKHJlZkNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSA9IHJlZkNvbXBvbmVudDsgLy9ob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IHJlZkNvbXBvbmVudC5pZCkhO1xuICAgICAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGluIHdlYmNvbXBvbmVudCBjYXNlIHRoZSBzYW1lIGlkIHdpbGwgYWxyZWRheSBiZSBoZXJlLCB3aGljaCBpcyBnb29kICFcbiAgICAgICAgICAgICAgICAvLyBuYW1lOlxuICAgICAgICAgICAgICAgIC8vICAgICBpZFxuICAgICAgICAgICAgICAgIC8vICAgICBjb21wb25lbnREZWZpbml0aW9uSWRcblxuICAgICAgICAgICAgICAgIC8vIGZvciBpbm5lciBjb21wb25lbnRzIGluc2lkZSByZWYgY29tcG9uZW50IDpcbiAgICAgICAgICAgICAgICBtZXNzYWdlLm5lc3RlZFJlZnMuZm9yRWFjaChuZXN0ZWRSZWZDb25maWcgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnREZWZpbml0aW9uID0gY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLnJlc29sdmVkTmVzdGVkQ29tcG9uZW50cyEuZmluZChjID0+IGMudHlwZS5pZCA9PT0gbmVzdGVkUmVmQ29uZmlnLmNvbXBvbmVudERlZmluaXRpb25JZCkhLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc3QgbmVzdGVkQ29tcG9uZW50RGVmaW5pdGlvbiA9IGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnM/LmZpbmQoZGVmID0+IGRlZi5pZCA9PT0gbmVzdGVkUmVmQ29uZmlnLmNvbXBvbmVudERlZmluaXRpb25JZCkhO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCByZWZDb25maWcgPSBjb21wb25lbnRDb25maWcudHlwZS5yZWZzLmZpbmQociA9PiByLm5hbWUgPT09IG5lc3RlZFJlZkNvbmZpZy5yZWZOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKCFyZWZDb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRocm93IG5ldyBFcnJvcignbm8gcmVmQ29uZmlnIGZvdW5kIGZvciBuZXN0ZWQgcmVmJyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudCA9IG5ldyBNeW9wUmVmQ29tcG9uZW50KG5lc3RlZENvbXBvbmVudERlZmluaXRpb24sIHJlZkNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgICAgIG5lc3RlZENvbXBvbmVudC5zZXRJbml0aWF0ZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50LnJlZnNbbmVzdGVkUmVmQ29uZmlnLnJlZk5hbWVdID0gbmVzdGVkQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2gobmVzdGVkQ29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29ubmVjdFJlZnMocmVmQ29tcG9uZW50LCBjb21wb25lbnRDb25maWcsIGNvbXBvbmVudHMsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6dXNlIGNvbmZpZyBjaGVjayBmb3IgYXV0by1oaWdodCBhbmQgY29udmVydCB0eXBlIHByb3Blcmx5XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKTtcblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlZkNvbXBvbmVudCBhcyB1bmtub3duIGFzIFQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRocm93IGVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IGNvbm5lY3RSZWZzID0gYXN5bmMgKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgY29tcG9uZW50czogSU15b3BDb21wb25lbnRbXSwgd2l0aG91dFJlZkNvbXBvbmVudHM6IGJvb2xlYW4gPSBmYWxzZSkgPT4ge1xuXG4gICAgaWYgKCFjb21wb25lbnQucmVmcylcbiAgICAgICAgY29tcG9uZW50LnJlZnMgPSB7fTtcblxuICAgIGNvbnN0IHdhaXRGb3IgPSBPYmplY3QudmFsdWVzKGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlZnMpLm1hcChyZWYgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlZi5iZWhhdmlvci50eXBlID09IFJlZkJlaGF2aW9yVHlwZS5jb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQucmVmc1tyZWYubmFtZV0gPVxuXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRSZWZDb21wb25lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudC5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBjaGFuZ2UgdG8gZ2V0IGl0IGZyb20gdGhlIGZsb3dcbiAgICAgICAgICAgICAgICBsZXQgcmVmQ29tcG9uZW50SWQgPSAocmVmLmJlaGF2aW9yIGFzIElDb21wb25lbnRSZWZCZWhhdmlvcikuY29tcG9uZW50SWQ7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWZDb21wb25lbnRJZClcbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50SWQgPSAocmVmLmJlaGF2aW9yIGFzIElDb21wb25lbnRSZWZCZWhhdmlvcikuaW5zdGFuY2UuY29tcG9uZW50SWRcblxuICAgICAgICAgICAgICAgIC8vIGlmICghY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVzb2x2ZWREZWZpbml0aW9ucykge1xuICAgICAgICAgICAgICAgIC8vICAgICByZWplY3QobmV3IEVycm9yKCdjb21wb25lbnRDb25maWcgcHJvdmlkZWQgd2l0aG91dCByZXNvbHZlZERlZmluaXRpb25zIGNoZWNrIHRoZSBjb25maWcgb2JqZWN0JykpO1xuICAgICAgICAgICAgICAgIC8vICAgICAvL3Rocm93IG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgcmVzb2x2ZWREZWZpbml0aW9ucyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAvLyBjb25zdCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVzb2x2ZWREZWZpbml0aW9ucyEuZmluZChjb21wZGVmID0+IGNvbXBkZWYuaWQgPT09IHJlZkNvbXBvbmVudElkKSE7XG4gICAgICAgICAgICAgICAgLy8gLy9jb25zdCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gYXdhaXQgZ2V0Q29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyhjb21wb25lbnRJbnN0YW5jZUNvbmZpZy5jb21wb25lbnRJZCk7XG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvLyBpZiAoIWNvbXBvbmVudERlZmluaXRpb25Db25maWcpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmVqZWN0KG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgcmVzb2x2ZWREZWZpbml0aW9ucyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgICAgIC8vVE9ETzogaWYgd2UgaGF2ZSB0aGUgc2FtZSBjb21wb25lbnQgbW9yZSB0aGFuIG9uY2Ugd2Ugd2lsbCBuZWVkIGluc3RhbmNlIGlkIGhlcmUgLi4uXG4gICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50Q29uZmlnID0gY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLnJlc29sdmVkTmVzdGVkQ29tcG9uZW50cz8uZmluZChuZXN0ZWRDb21wb25lbnQgPT4gbmVzdGVkQ29tcG9uZW50LnR5cGUuaWQgPT09IHJlZkNvbXBvbmVudElkKTtcblxuICAgICAgICAgICAgICAgIGlmICghbmVzdGVkQ29tcG9uZW50Q29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgbmVzdGVkQ29tcG9uZW50Q29uZmlnIGNoZWNrIHRoZSBjb25maWcgb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL2NvbnN0IGNvbXBvbmVudEluc3RhbmNlQ29uZmlnID0gY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLm5lc3RlZENvbXBvbmVudHM/LmZpbmQoY29tcG9uZW50SW5zdGFjZSA9PiBjb21wb25lbnRJbnN0YWNlLmNvbXBvbmVudElkID09PSBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnLmlkKTtcbiAgICAgICAgICAgICAgICAvLyBpZighY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyl7XG4gICAgICAgICAgICAgICAgLy8gICAgIHRocm93IG5ldyBFcnJvcignVE9ETyBUT0RPIFRPRE8gJyk7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOnRoaW5rIGFib3V0IHRoYXQgOlxuICAgICAgICAgICAgICAgIC8vICAgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5yZXNvbHZlZERlZmluaXRpb25zID0gY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVzb2x2ZWREZWZpbml0aW9ucztcbiAgICAgICAgICAgICAgICAvLyAgIGNvbnN0IG5lc3RlZENvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICBpbnN0YW5jZTogbmVzdGVkQ29tcG9uZW50Q29uZmlnLmluc3RhbmNlISxcbiAgICAgICAgICAgICAgICAvLyAgICAgICB0eXBlOiBuZXN0ZWRDb21wb25lbnRDb25maWcudHlwZSxcbiAgICAgICAgICAgICAgICAvLyAgICAgICBuYW1lOiBuZXN0ZWRDb21wb25lbnRDb25maWcubmFtZVxuICAgICAgICAgICAgICAgIC8vICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgX3JlZiA9IFJlZi5jcmVhdGUoJycsIHJlZiwgY29tcG9uZW50KTtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ25lc3RlZCAhISBjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudCA9IGF3YWl0IGNyZWF0ZVJlZkNvbXBvbmVudChfcmVmLCBuZXN0ZWRDb21wb25lbnRDb25maWchLCBjb21wb25lbnRzKVxuICAgICAgICAgICAgICAgICAgICAvL1RET08gOiBwdXQgdGhhdCByZWYgY29tcG9uZW50IHNvbWV3aGVyZT9cblxuICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnJlZnNbcmVmLm5hbWVdID0gbmVzdGVkQ29tcG9uZW50O1xuXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbm9uUHJveGllZCA9IFJlZi5jcmVhdGUoJycsIHJlZiwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnJlZnNbcmVmLm5hbWVdID0gY3JlYXRlUmVmUHJveHkoX19ub25Qcm94aWVkLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvL2FsZXJ0KCc/JylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfSlcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh3YWl0Rm9yKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vZGVidWdnZXJcbiAgICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbn1cblxuZXhwb3J0IHR5cGUgcHJvcFR5cGVzPFQgZXh0ZW5kcyBjb21wb25lbnREZWZpbml0aW9uUHJvcHM+ID0ge1xuICAgIFtQcm9wZXJ0eSBpbiBrZXlvZiBUXTpcbiAgICBUW1Byb3BlcnR5XSBleHRlbmRzIHsgbW9kZTogJ2lucHV0JyB9ID9cbiAgICAgICAgVFtQcm9wZXJ0eV1bJ3R5cGUnXSA6XG4gICAgICAgIFByb21pc2U8VFtQcm9wZXJ0eV1bJ3R5cGUnXT5cbn1cblxuZXhwb3J0IGNvbnN0IGV4ZWMgPSBhc3luYyAoZ2V0dGVyOiBhbnkpID0+IHtcbiAgICByZXR1cm4gYXdhaXQgZ2V0dGVyKClcbn1cblxuZXhwb3J0IGNvbnN0IGFjdEFzID0gPFQ+KHJlZjogUmVmKSA9PiB7XG4gICAgcmV0dXJuIHJlZiBhcyB1bmtub3duIGFzIEZ1bmN0aW9uaWZ5UmVmPFQ+XG59XG5cbmV4cG9ydCB0eXBlIEZ1bmN0aW9uaWZ5UmVmPFQgPSBhbnk+ID0ge1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGluZmVyIEEpID0+IGluZmVyIFIgLy8gSWYgaXQncyBhIGZ1bmN0aW9uXG4gICAgICAgID8gKC4uLmFyZ3M6IEEpID0+IFByb21pc2U8Uj4gLy8gQ29udmVydCBpdCB0byBhIHByb21pc2VkIGZ1bmN0aW9uXG4gICAgICAgIDogVFtLXVxufTtcbiIsICJpbXBvcnQge0F1dG9TaXplT3B0aW9ucywgQmFzZU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBFeGVjdXRlQ29tcG9uZW50TWV0aG9kLFxuICAgIEV4ZWN1dGVTY3JpcHRNZXNzYWdlLCBNZXNzYWdlRGlyZWN0aW9uLCBTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2Vcbn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7c2V0RGVidWdTdHlsZX0gZnJvbSBcIi4uL2NvbXBvbmVudENvcmVcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlcy50c1wiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuXG5leHBvcnQgY2xhc3MgTXlvcElmcmFtZUNvbXBvbmVudCBleHRlbmRzIEJhc2VNeW9wQ29tcG9uZW50IHtcblxuICAgIHByaXZhdGUgX2F1dG9TaXplQ2xlYW51cD86IENsZWFudXBIYW5kbGVyO1xuICAgIHByaXZhdGUgX2F1dG9TaXplT3B0aW9ucz86IEF1dG9TaXplT3B0aW9ucztcbiAgICBwcml2YXRlIF9hdXRvU2l6ZVVwZGF0ZT86ICgpID0+IHZvaWQ7XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgSXNvbGF0aW9uIChzYW5kYm94ZWQgY3Jvc3Mtb3JpZ2luIGZyYW1lKSBcdTIwMTQgcG9zdE1lc3NhZ2UgYnJpZGdlLCBob3N0IHNpZGUgXHUyNTAwXHUyNTAwXG4gICAgcHVibGljIGlzb2xhdGVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfbGFzdERhdGE/OiB1bmtub3duOyAgICAgICAgICAgICAgIC8vIGNhY2hlZCBsYXN0LXNlbnQgZGF0YSAoc3luYyBnZXREYXRhKVxuICAgIHByaXZhdGUgX2N0YUhhbmRsZXI/OiAoYWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24pID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSBfY3RhUXVldWU6IEFycmF5PHsgYWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24gfT4gPSBbXTtcbiAgICBwcml2YXRlIF9pc29Nc2dIYW5kbGVyPzogKGU6IE1lc3NhZ2VFdmVudCkgPT4gdm9pZDtcbiAgICBwcml2YXRlIF9pc29TaXplT3B0cz86IEF1dG9TaXplT3B0aW9ucztcbiAgICBwcml2YXRlIF9pc29BdXRvU2l6ZSA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBicmlkZ2Ugc2l6aW5nIG9ubHkgd2hlbiBhdXRvLXNpemUgaXMgb25cbiAgICBwcml2YXRlIF9pc29MYXN0U2l6ZT86IHsgaGVpZ2h0OiBudW1iZXIsIHdpZHRoPzogbnVtYmVyIH07ICAvLyBsYXN0IHJlcG9ydGVkIHNpemUgKGZvciB0aGUgZW5hYmxlIHJhY2UpXG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwcml2YXRlIElmcmFtZUVsZW1lbnQ6IEhUTUxJRnJhbWVFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICBzdXBlcihjb21wb25lbnRDb25maWcsIGNvbnRhaW5lciwgb3B0aW9ucylcblxuICAgICAgICB0aGlzLmVsZW1lbnQgPSB0aGlzLklmcmFtZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMuX2xhc3REYXRhID0gb3B0aW9ucz8uZGF0YTtcbiAgICAgICAgLy8gdGhpcy5JZnJhbWVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAvLyAgICAgaWYgKHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QpXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdChgSWZyYW1lRWxlbWVudCBlcnJvcmApO1xuICAgICAgICAvLyB9KTtcbiAgICB9XG5cbiAgICBzaXplTWV0YT86IHsgd2lkdGg/OiBzdHJpbmcgfCBudW1iZXI7IGhlaWdodD86IHN0cmluZyB8IG51bWJlcjsgbWluV2lkdGg/OiBudW1iZXI7IG1heFdpZHRoPzogbnVtYmVyOyBtaW5IZWlnaHQ/OiBudW1iZXI7IG1heEhlaWdodD86IG51bWJlciB9IHwgbnVsbDtcblxuICAgIC8vIFx1MjUwMFx1MjUwMCBJc29sYXRpb24gYnJpZGdlIChob3N0IHNpZGUpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8qKiBBdHRhY2ggdGhlIGhvc3Qtc2lkZSBwb3N0TWVzc2FnZSBsaXN0ZW5lciBmb3IgYSBzYW5kYm94ZWQgZnJhbWUuICovXG4gICAgZW5hYmxlSXNvbGF0aW9uKCkge1xuICAgICAgICB0aGlzLmlzb2xhdGVkID0gdHJ1ZTtcbiAgICAgICAgLy8gSXNvbGF0ZWQgZnJhbWVzIGRvbid0IHJ1biB0aGUgSWZyYW1lU0RLIGhhbmRzaGFrZSAobm8gc2FtZS1vcmlnaW4gaW5pdCksXG4gICAgICAgIC8vIHNvIG1hcmsgaW5pdGlhdGVkIGltbWVkaWF0ZWx5IFx1MjAxNCBsaWtlIHRoZSBleHRyYWN0ZWQgd2ViIGNvbXBvbmVudCBkb2VzLlxuICAgICAgICB0aGlzLnNldEluaXRpYXRlZCgpO1xuICAgICAgICB0aGlzLl9pc29Nc2dIYW5kbGVyID0gKGU6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGUuc291cmNlICE9PSB0aGlzLklmcmFtZUVsZW1lbnQuY29udGVudFdpbmRvdykgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgZDogYW55ID0gZS5kYXRhO1xuICAgICAgICAgICAgaWYgKCFkIHx8IGQuX19teW9wICE9PSB0cnVlKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoZC50eXBlID09PSAnbXlvcDpjdGEnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2N0YUhhbmRsZXIgJiYgIXRoaXMubWFya2VkRm9yRGlzcG9zZWQpIHRoaXMuX2N0YUhhbmRsZXIoZC5hY3Rpb24sIGQucGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMuX2N0YUhhbmRsZXIpIHRoaXMuX2N0YVF1ZXVlLnB1c2goeyBhY3Rpb246IGQuYWN0aW9uLCBwYXlsb2FkOiBkLnBheWxvYWQgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGQudHlwZSA9PT0gJ215b3A6c2l6ZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hcHBseUlzb1NpemUoZC5oZWlnaHQsIGQud2lkdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuX2lzb01zZ0hhbmRsZXIpO1xuICAgIH1cblxuICAgIC8qKiBEYXRhLWluIFx1MjAxNCB1bmlmaWVkIHdpdGggdGhlIGV4dHJhY3RlZC1XQyBBUEkuIFBvc3RzIGluaXQgb3ZlciB0aGUgYnJpZGdlLiAqL1xuICAgIGluaXRXaXRoRGF0YShkYXRhOiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2xhc3REYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50Py5jb250ZW50V2luZG93Py5wb3N0TWVzc2FnZSh7IF9fbXlvcDogdHJ1ZSwgdHlwZTogJ215b3A6aW5pdCcsIGRhdGEgfSwgJyonKTtcbiAgICB9XG5cbiAgICAvKiogRGF0YS1pbiBnZXR0ZXIgXHUyMDE0IHJldHVybnMgdGhlIGxhc3QgZGF0YSB0aGUgaG9zdCBzZW50IChjYWNoZWQsIHN5bmNocm9ub3VzKS4gKi9cbiAgICBnZXREYXRhKCk6IHVua25vd24ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdERhdGE7XG4gICAgfVxuXG4gICAgLyoqIERhdGEtb3V0IFx1MjAxNCB1bmlmaWVkIHdpdGggdGhlIGV4dHJhY3RlZC1XQyBBUEkuIEZsdXNoZXMgQ1RBcyBxdWV1ZWQgcHJlLWhhbmRsZXIuICovXG4gICAgc2V0Q3RhSGFuZGxlcihoYW5kbGVyOiAoYWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24pID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY3RhSGFuZGxlciA9IGhhbmRsZXI7XG4gICAgICAgIGlmICh0aGlzLl9jdGFRdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBxdWV1ZSA9IFsuLi50aGlzLl9jdGFRdWV1ZV07XG4gICAgICAgICAgICB0aGlzLl9jdGFRdWV1ZSA9IFtdO1xuICAgICAgICAgICAgcXVldWUuZm9yRWFjaChpdGVtID0+IHsgaWYgKCF0aGlzLm1hcmtlZEZvckRpc3Bvc2VkKSBoYW5kbGVyKGl0ZW0uYWN0aW9uLCBpdGVtLnBheWxvYWQpOyB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2FwcGx5SXNvU2l6ZShoZWlnaHQ6IG51bWJlciwgd2lkdGg/OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCFoZWlnaHQgfHwgTnVtYmVyLmlzTmFOKGhlaWdodCkpIHJldHVybjtcbiAgICAgICAgLy8gQWx3YXlzIHJlbWVtYmVyIHRoZSBsYXRlc3QgcmVwb3J0ZWQgc2l6ZSBzbyBpdCBjYW4gYmUgYXBwbGllZCBpZi93aGVuXG4gICAgICAgIC8vIGF1dG8tc2l6aW5nIGlzIGVuYWJsZWQgYWZ0ZXIgdGhlIGZpcnN0IG1lc3NhZ2UgYXJyaXZlcy5cbiAgICAgICAgdGhpcy5faXNvTGFzdFNpemUgPSB7IGhlaWdodCwgd2lkdGggfTtcbiAgICAgICAgLy8gUmVzcGVjdCBhdXRvU2l6ZTpmYWxzZSBcdTIwMTQgdGhlIGhvc3Qgb3ducyBkaW1lbnNpb25zLCBzbyBkb24ndCB0b3VjaCB0aGVtLlxuICAgICAgICBpZiAoIXRoaXMuX2lzb0F1dG9TaXplKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLl9pc29TaXplT3B0cztcbiAgICAgICAgY29uc3QgdG9OdW0gPSAodjogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+XG4gICAgICAgICAgICB2ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiAodHlwZW9mIHYgPT09ICdudW1iZXInID8gdiA6IChpc05hTihwYXJzZUZsb2F0KHYpKSA/IHVuZGVmaW5lZCA6IHBhcnNlRmxvYXQodikpKTtcbiAgICAgICAgY29uc3QgbWluID0gdG9OdW0ob3B0cz8ubWluSGVpZ2h0KSwgbWF4ID0gdG9OdW0ob3B0cz8ubWF4SGVpZ2h0KTtcbiAgICAgICAgbGV0IGggPSBoZWlnaHQ7XG4gICAgICAgIGlmIChtaW4gIT09IHVuZGVmaW5lZCAmJiBoIDwgbWluKSBoID0gbWluO1xuICAgICAgICBpZiAobWF4ICE9PSB1bmRlZmluZWQgJiYgaCA+IG1heCkgaCA9IG1heDtcbiAgICAgICAgLy8gVHJhbnNpdGlvbiBmcm9tIGFic29sdXRlIG92ZXJsYXkgdG8gZG9jdW1lbnQgZmxvdyBhdCB0aGUgbWVhc3VyZWQgaGVpZ2h0LlxuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaW5zZXQgPSAnYXV0byc7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBoICsgJ3B4JztcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgICBvcHRzPy5vblNpemVDaGFuZ2U/Lih7IHdpZHRoOiB3aWR0aCA/PyB0aGlzLklmcmFtZUVsZW1lbnQuY2xpZW50V2lkdGgsIGhlaWdodDogaCwgYXV0b1NpemluZ1dpZHRoOiBmYWxzZSwgYXV0b1NpemluZ0hlaWdodDogdHJ1ZSB9IGFzIGFueSk7XG4gICAgfVxuXG4gICAgY2xlYW51cEluc3BlY3Q/OiBDbGVhbnVwSGFuZGxlcjtcblxuICAgIGluc3BlY3QoKSB7XG4gICAgICAgIC8vIFRPRE8gOiB1c2UgYmV0dGVyIGNoZWNrIGZvciBpbnNwZWN0IG1vZGVcbiAgICAgICAgaWYgKHRoaXMuY2xlYW51cEluc3BlY3QpIHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2luc3BlY3QgY2FsbCBtb3JlIHRoYW4gb25jZScpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xlYW51cEluc3BlY3RcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ID0gc2V0RGVidWdTdHlsZSh0aGlzLmlkLCAnTXlvcElmcmFtZUNvbXBvbmVudCcsIDEwLCB0aGlzLmNvbnRhaW5lciwgdGhpcy5JZnJhbWVFbGVtZW50LCB0aGlzLmNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCEoKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICB9XG5cbiAgICBzaG93KCkge1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcxJztcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3Vuc2V0J1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhbGwnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICAgIH0sIChyZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtyZXQuY29udGVudH1weGA7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgb2JzZXJ2ZVNpemVCYXNlZE9uRG9jdW1lbnRFbGVtZW50ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKHtzZW5kfSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qge2hlaWdodCwgd2lkdGh9ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qge2hlaWdodCwgd2lkdGh9ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIHNlbmQoe2hlaWdodCwgd2lkdGh9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5KTtcblxuICAgICAgICAgICAgcmV0dXJuIHtoZWlnaHQsIHdpZHRofVxuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHtyZXQuY29udGVudC53aWR0aH1weGA7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7cmV0LmNvbnRlbnQuaGVpZ2h0fXB4YDtcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPYnNlcnZlcyB0aGUgaWZyYW1lIGNvbnRlbnQgc2l6ZSBhbmQgYXV0b21hdGljYWxseSBzeW5jcyBpdCB0byB0aGUgaWZyYW1lIGVsZW1lbnQuXG4gICAgICogVXNlcyBkaXJlY3QgY29udGVudERvY3VtZW50IGFjY2VzcyAoc2FtZS1vcmlnaW4gb25seSkgZm9yIGFjY3VyYXRlIG1lYXN1cmVtZW50cy5cbiAgICAgKlxuICAgICAqIFJlZW50cmFudDogd2hlbiBjYWxsZWQgYWdhaW4gd2hpbGUgb2JzZXJ2ZXJzIGFscmVhZHkgZXhpc3QsIHVwZGF0ZXMgb3B0aW9ucyBhbmRcbiAgICAgKiByZS1ldmFsdWF0ZXMgc2l6aW5nIHdpdGhvdXQgcmVjcmVhdGluZyBvYnNlcnZlcnMuIENsZWFudXAgKyByZS1jYWxsIChlLmcuIFJlYWN0XG4gICAgICogcmUtcmVuZGVyKSBjcmVhdGVzIGZyZXNoIG9ic2VydmVycyBzaW5jZSBjbGVhbnVwIGNsZWFycyB0aGUgZXhpc3Rpbmcgb25lcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGluY2x1ZGluZyBzaXplIGNoYW5nZSBjYWxsYmFjayBhbmQgbWluL21heCBjb25zdHJhaW50c1xuICAgICAqIEByZXR1cm5zIENsZWFudXAgZnVuY3Rpb24gdG8gc3RvcCBvYnNlcnZpbmdcbiAgICAgKi9cbiAgICBvYnNlcnZlQXV0b1NpemUgPSAob3B0aW9ucz86IEF1dG9TaXplT3B0aW9ucyk6IENsZWFudXBIYW5kbGVyID0+IHtcbiAgICAgICAgLy8gU3RvcmUgb3B0aW9ucyBzbyB1cGRhdGVTaXplIGFsd2F5cyByZWFkcyB0aGUgbGF0ZXN0XG4gICAgICAgIHRoaXMuX2F1dG9TaXplT3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICAgICAgLy8gSXNvbGF0ZWQgZnJhbWVzIGNhbid0IGJlIG1lYXN1cmVkIGNyb3NzLW9yaWdpbiBcdTIwMTQgc2l6aW5nIGlzIGRyaXZlbiBieVxuICAgICAgICAvLyAnbXlvcDpzaXplJyBwb3N0TWVzc2FnZXMgZnJvbSB0aGUgYnJpZGdlIChzZWUgX2FwcGx5SXNvU2l6ZSkuXG4gICAgICAgIGlmICh0aGlzLmlzb2xhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9pc29TaXplT3B0cyA9IG9wdGlvbnM7XG4gICAgICAgICAgICB0aGlzLl9pc29BdXRvU2l6ZSA9IHRydWU7XG4gICAgICAgICAgICAvLyBBcHBseSB0aGUgbW9zdCByZWNlbnQgYnJpZGdlLXJlcG9ydGVkIHNpemUgKGl0IG1heSBoYXZlIGFycml2ZWQgYmVmb3JlXG4gICAgICAgICAgICAvLyBhdXRvLXNpemluZyB3YXMgdHVybmVkIG9uKS5cbiAgICAgICAgICAgIGlmICh0aGlzLl9pc29MYXN0U2l6ZSkgdGhpcy5fYXBwbHlJc29TaXplKHRoaXMuX2lzb0xhc3RTaXplLmhlaWdodCwgdGhpcy5faXNvTGFzdFNpemUud2lkdGgpO1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHsgdGhpcy5faXNvQXV0b1NpemUgPSBmYWxzZTsgdGhpcy5faXNvU2l6ZU9wdHMgPSB1bmRlZmluZWQ7IH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBvYnNlcnZlcnMgYWxyZWFkeSBleGlzdCwgcmUtZXZhbHVhdGUgd2l0aCBuZXcgb3B0aW9ucyBhbmQgcmV1c2UgdGhlbVxuICAgICAgICBpZiAodGhpcy5fYXV0b1NpemVDbGVhbnVwICYmIHRoaXMuX2F1dG9TaXplVXBkYXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9hdXRvU2l6ZVVwZGF0ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2F1dG9TaXplQ2xlYW51cDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlmcmFtZSA9IHRoaXMuSWZyYW1lRWxlbWVudDtcbiAgICAgICAgY29uc3QgZG9jID0gaWZyYW1lLmNvbnRlbnREb2N1bWVudDtcblxuICAgICAgICBpZiAoIWRvYykge1xuICAgICAgICAgICAgLy8gQ3Jvc3Mtb3JpZ2luICh2MSBjb21wb25lbnRzIG9uIHRoZSBjdXN0b21lcidzIGRvbWFpbik6IG1lYXN1cmUgaW5zaWRlIHRoZSBmcmFtZS5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9ic2VydmVIZWlnaHRWaWFCcmlkZ2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNsYW1wID0gKHZhbHVlOiBudW1iZXIsIG1pbj86IG51bWJlciwgbWF4PzogbnVtYmVyKTogbnVtYmVyID0+IHtcbiAgICAgICAgICAgIGlmIChtaW4gIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA8IG1pbikgcmV0dXJuIG1pbjtcbiAgICAgICAgICAgIGlmIChtYXggIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+IG1heCkgcmV0dXJuIG1heDtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBQYXJzZSBDU1Mgc2l6ZSB2YWx1ZXMgdG8gbnVtYmVyc1xuICAgICAgICBjb25zdCBwYXJzZVNpemUgPSAodmFsdWU6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRmxvYXQodmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIGlzTmFOKHBhcnNlZCkgPyB1bmRlZmluZWQgOiBwYXJzZWQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgdXBkYXRlU2l6ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50O1xuICAgICAgICAgICAgaWYgKCFjb250ZW50RG9jKSByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLl9hdXRvU2l6ZU9wdGlvbnM7XG5cbiAgICAgICAgICAgIGNvbnN0IG1pbldpZHRoID0gcGFyc2VTaXplKG9wdHM/Lm1pbldpZHRoKTtcbiAgICAgICAgICAgIGNvbnN0IG1heFdpZHRoID0gcGFyc2VTaXplKG9wdHM/Lm1heFdpZHRoKTtcbiAgICAgICAgICAgIGNvbnN0IG1pbkhlaWdodCA9IHBhcnNlU2l6ZShvcHRzPy5taW5IZWlnaHQpO1xuICAgICAgICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gcGFyc2VTaXplKG9wdHM/Lm1heEhlaWdodCk7XG4gICAgICAgICAgICBjb25zdCBsb2FkZXJNaW5IZWlnaHQgPSBvcHRzPy5sb2FkZXJNaW5IZWlnaHQgPz8gNTA7XG5cbiAgICAgICAgICAgIC8vIFJlc29sdmUgZXhwbGljaXQgZGltZW5zaW9uczogaG9zdCBvcHRpb25zIFx1MjE5MiBzaXplTWV0YSBmaWxsIG1vZGUgXHUyMTkyIHdpZHRoIGRlZmF1bHRzIHRvIFwiMTAwJVwiXG4gICAgICAgICAgICAvLyBXaWR0aCBkZWZhdWx0cyB0byBcIjEwMCVcIiAoYmxvY2sgZWxlbWVudCBiZWhhdmlvcikgdG8gcHJldmVudCB0aGUgc2hyaW5rLXRvLTAgbWVhc3VyZW1lbnQgYnVnLlxuICAgICAgICAgICAgLy8gSGVpZ2h0IGhhcyBubyBkZWZhdWx0IHNvIGl0IGF1dG8tc2l6ZXMgdG8gY29udGVudC5cbiAgICAgICAgICAgIC8vIE9ubHkgc2l6ZU1ldGEgXCIxMDAlXCIgKGZpbGwgbW9kZSkgaXMgdHJlYXRlZCBhcyBleHBsaWNpdCBhbmQgZGlzYWJsZXMgYXV0by1zaXppbmcuXG4gICAgICAgICAgICAvLyBQaXhlbCBzaXplTWV0YSB2YWx1ZXMgKGUuZy4sIGhlaWdodDogMjAwKSBhcmUgaW5pdGlhbCBoaW50cywgTk9UIGV4cGxpY2l0IGNvbnN0cmFpbnRzLlxuICAgICAgICAgICAgY29uc3Qgc2l6ZU1ldGFGaWxsV2lkdGggPSB0aGlzLnNpemVNZXRhPy53aWR0aCA9PT0gXCIxMDAlXCIgPyBcIjEwMCVcIiA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IHNpemVNZXRhRmlsbEhlaWdodCA9IHRoaXMuc2l6ZU1ldGE/LmhlaWdodCA9PT0gXCIxMDAlXCIgPyBcIjEwMCVcIiA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkRXhwbGljaXRXaWR0aCA9IG9wdHM/LmV4cGxpY2l0V2lkdGggPz8gc2l6ZU1ldGFGaWxsV2lkdGggPz8gXCIxMDAlXCI7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZEV4cGxpY2l0SGVpZ2h0ID0gb3B0cz8uZXhwbGljaXRIZWlnaHQgPz8gc2l6ZU1ldGFGaWxsSGVpZ2h0O1xuICAgICAgICAgICAgY29uc3QgaGFzRXhwbGljaXRXaWR0aCA9IHJlc29sdmVkRXhwbGljaXRXaWR0aCAhPT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgaGFzRXhwbGljaXRIZWlnaHQgPSByZXNvbHZlZEV4cGxpY2l0SGVpZ2h0ICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIC8vIERldGVjdCBjb2xsYXBzZWQgZGltZW5zaW9ucyBmcm9tIGNvbnRhaW5lciAodGhpcy5jb250YWluZXIpXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJSZWN0ID0gdGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBjb25zdCBjb2xsYXBzZWRXaWR0aCA9IGNvbnRhaW5lclJlY3Qud2lkdGggPT09IDA7XG4gICAgICAgICAgICAvLyBDb25zaWRlciBjb2xsYXBzZWQgaWYgaGVpZ2h0IGlzIDAgT1IgZXF1YWxzIHRoZSBsb2FkZXIgbWluSGVpZ2h0XG4gICAgICAgICAgICBjb25zdCBjb2xsYXBzZWRIZWlnaHQgPSBjb250YWluZXJSZWN0LmhlaWdodCA9PT0gMCB8fCBjb250YWluZXJSZWN0LmhlaWdodCA9PT0gbG9hZGVyTWluSGVpZ2h0O1xuXG4gICAgICAgICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggZGltZW5zaW9ucyB0byBhdXRvLXNpemU6XG4gICAgICAgICAgICAvLyAtIElmIGZvcmNlQXV0b1NpemUgaXMgdHJ1ZSwgYXV0by1zaXplIHVubGVzcyBleHBsaWNpdCBkaW1lbnNpb24gaXMgc2V0XG4gICAgICAgICAgICAvLyAtIE90aGVyd2lzZSwgYXV0by1zaXplIG9ubHkgaWYgY29sbGFwc2VkXG4gICAgICAgICAgICBjb25zdCBzaG91bGRBdXRvV2lkdGggPSBvcHRzPy5mb3JjZUF1dG9TaXplXG4gICAgICAgICAgICAgICAgPyAhaGFzRXhwbGljaXRXaWR0aFxuICAgICAgICAgICAgICAgIDogKGNvbGxhcHNlZFdpZHRoICYmICFoYXNFeHBsaWNpdFdpZHRoKTtcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZEF1dG9IZWlnaHQgPSBvcHRzPy5mb3JjZUF1dG9TaXplXG4gICAgICAgICAgICAgICAgPyAhaGFzRXhwbGljaXRIZWlnaHRcbiAgICAgICAgICAgICAgICA6IChjb2xsYXBzZWRIZWlnaHQgJiYgIWhhc0V4cGxpY2l0SGVpZ2h0KTtcblxuICAgICAgICAgICAgLy8gSWYgbm90aGluZyBuZWVkcyBhdXRvLXNpemluZywgYXBwbHkgZXhwbGljaXQvcGVyY2VudGFnZSBkaW1lbnNpb25zXG4gICAgICAgICAgICBpZiAoIXNob3VsZEF1dG9XaWR0aCAmJiAhc2hvdWxkQXV0b0hlaWdodCkge1xuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS53aWR0aCA9IHR5cGVvZiByZXNvbHZlZEV4cGxpY2l0V2lkdGggPT09ICdudW1iZXInID8gYCR7cmVzb2x2ZWRFeHBsaWNpdFdpZHRofXB4YCA6ICcxMDAlJztcbiAgICAgICAgICAgICAgICBpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gdHlwZW9mIHJlc29sdmVkRXhwbGljaXRIZWlnaHQgPT09ICdudW1iZXInID8gYCR7cmVzb2x2ZWRFeHBsaWNpdEhlaWdodH1weGAgOiAnMTAwJSc7XG5cbiAgICAgICAgICAgICAgICBvcHRzPy5vblNpemVDaGFuZ2U/Lih7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiB0eXBlb2YgcmVzb2x2ZWRFeHBsaWNpdFdpZHRoID09PSAnbnVtYmVyJyA/IHJlc29sdmVkRXhwbGljaXRXaWR0aCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiB0eXBlb2YgcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCA9PT0gJ251bWJlcicgPyByZXNvbHZlZEV4cGxpY2l0SGVpZ2h0IDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBhdXRvU2l6aW5nV2lkdGg6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBhdXRvU2l6aW5nSGVpZ2h0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIERpc2FibGUgQ1NTIHRyYW5zaXRpb25zIG9uIGlmcmFtZSBhbmQgY29udGFpbmVyIGZvciB0aGUgZW50aXJlXG4gICAgICAgICAgICAvLyBtZWFzdXJlbWVudCArIGhlaWdodC1zZXR0aW5nIGN5Y2xlLiBIb3N0IGFwcHMgbWF5IHNldCBgdHJhbnNpdGlvbjogYWxsYFxuICAgICAgICAgICAgLy8gd2hpY2ggd291bGQgYW5pbWF0ZSB0aGUgMHB4IGNvbGxhcHNlIGFuZCBmaW5hbCBoZWlnaHQgY2hhbmdlLCBjYXVzaW5nXG4gICAgICAgICAgICAvLyB2aXNpYmxlIGp1bXBzIGR1cmluZyBzY3JvbGwuXG4gICAgICAgICAgICBjb25zdCBwcmV2VHJhbnNpdGlvbiA9IGlmcmFtZS5zdHlsZS50cmFuc2l0aW9uO1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jb250YWluZXI7XG4gICAgICAgICAgICBjb25zdCBwcmV2Q29udGFpbmVyVHJhbnNpdGlvbiA9IGNvbnRhaW5lci5zdHlsZS50cmFuc2l0aW9uO1xuICAgICAgICAgICAgaWZyYW1lLnN0eWxlLnRyYW5zaXRpb24gPSAnbm9uZSc7XG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUudHJhbnNpdGlvbiA9ICdub25lJztcblxuICAgICAgICAgICAgLy8gUXVpY2sgcHJlLWNoZWNrOiByZWFkIHNjcm9sbEhlaWdodC9XaWR0aCBCRUZPUkUgY29sbGFwc2luZyB0aGUgaWZyYW1lLlxuICAgICAgICAgICAgLy8gSWYgY29udGVudCBvbmx5IGdyZXcgKHNjcm9sbEhlaWdodCA+IGlmcmFtZSBoZWlnaHQpLCB3ZSBjYW4gc2tpcCB0aGVcbiAgICAgICAgICAgIC8vIDBweCBjb2xsYXBzZSBcdTIwMTQgc2Nyb2xsSGVpZ2h0IG5hdHVyYWxseSBleHBhbmRzIGJleW9uZCB0aGUgaWZyYW1lLlxuICAgICAgICAgICAgY29uc3QgY3VycmVudElmcmFtZUhlaWdodCA9IGlmcmFtZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50SWZyYW1lV2lkdGggPSBpZnJhbWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgICAgICBjb25zdCBwcmVTY3JvbGxIZWlnaHQgPSBNYXRoLmNlaWwoTWF0aC5tYXgoY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0LCBjb250ZW50RG9jLmJvZHkuc2Nyb2xsSGVpZ2h0LCBjb250ZW50RG9jLmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KSk7XG4gICAgICAgICAgICBjb25zdCBwcmVTY3JvbGxXaWR0aCA9IE1hdGguY2VpbChNYXRoLm1heChjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxXaWR0aCwgY29udGVudERvYy5ib2R5LnNjcm9sbFdpZHRoLCBjb250ZW50RG9jLmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpKTtcblxuICAgICAgICAgICAgbGV0IGNvbnRlbnRXaWR0aCA9IHByZVNjcm9sbFdpZHRoO1xuICAgICAgICAgICAgbGV0IGNvbnRlbnRIZWlnaHQgPSBwcmVTY3JvbGxIZWlnaHQ7XG5cbiAgICAgICAgICAgIGNvbnN0IGhlaWdodEdyZXcgPSBzaG91bGRBdXRvSGVpZ2h0ICYmIHByZVNjcm9sbEhlaWdodCA+IGN1cnJlbnRJZnJhbWVIZWlnaHQgKyAxO1xuICAgICAgICAgICAgY29uc3Qgd2lkdGhHcmV3ID0gc2hvdWxkQXV0b1dpZHRoICYmIHByZVNjcm9sbFdpZHRoID4gY3VycmVudElmcmFtZVdpZHRoICsgMTtcblxuICAgICAgICAgICAgLy8gRm9yIG5vbi1ncm93IGNhc2VzIChzaHJpbmsgb3Igbm8tY2hhbmdlKSwgd2UgbXVzdCBjb2xsYXBzZSB0byAwcHggdG9cbiAgICAgICAgICAgIC8vIG1lYXN1cmUgdGhlIHRydWUgY29udGVudCBoZWlnaHQuIHNjcm9sbEhlaWdodCBjYW4gbmV2ZXIgZGVjcmVhc2UgYmVsb3dcbiAgICAgICAgICAgIC8vIHRoZSBpZnJhbWUncyBjbGllbnRIZWlnaHQsIHNvIHNocmluayBpcyB1bmRldGVjdGFibGUgd2l0aG91dCBjb2xsYXBzaW5nLlxuICAgICAgICAgICAgLy8gV2l0aCB0cmFuc2l0aW9ucyBkaXNhYmxlZCArIGNvbnRhaW5lciBtaW4taGVpZ2h0IGhlbGQsIHRoZSBjb2xsYXBzZVxuICAgICAgICAgICAgLy8gaXMgaW52aXNpYmxlIChubyBsYXlvdXQgc2hpZnQsIG5vIGFuaW1hdGlvbikuXG4gICAgICAgICAgICBjb25zdCBuZWVkc0hlaWdodENvbGxhcHNlID0gc2hvdWxkQXV0b0hlaWdodCAmJiAhaGVpZ2h0R3JldztcbiAgICAgICAgICAgIGNvbnN0IG5lZWRzV2lkdGhDb2xsYXBzZSA9IHNob3VsZEF1dG9XaWR0aCAmJiAhd2lkdGhHcmV3O1xuXG4gICAgICAgICAgICBpZiAobmVlZHNIZWlnaHRDb2xsYXBzZSB8fCBuZWVkc1dpZHRoQ29sbGFwc2UpIHtcbiAgICAgICAgICAgICAgICAvLyBIb2xkIHRoZSBjb250YWluZXIncyBtaW4taGVpZ2h0L3dpZHRoIGR1cmluZyBtZWFzdXJlbWVudCB0byBwcmV2ZW50XG4gICAgICAgICAgICAgICAgLy8gbGF5b3V0IHNoaWZ0IChlbGVtZW50cyBiZWxvdyB0aGUgaWZyYW1lIHdvbid0IGp1bXApLlxuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZNaW5IZWlnaHQgPSBjb250YWluZXIuc3R5bGUubWluSGVpZ2h0O1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZNaW5XaWR0aCA9IGNvbnRhaW5lci5zdHlsZS5taW5XaWR0aDtcbiAgICAgICAgICAgICAgICBpZiAobmVlZHNIZWlnaHRDb2xsYXBzZSkgY29udGFpbmVyLnN0eWxlLm1pbkhlaWdodCA9IGAke2N1cnJlbnRJZnJhbWVIZWlnaHR9cHhgO1xuICAgICAgICAgICAgICAgIGlmIChuZWVkc1dpZHRoQ29sbGFwc2UpIGNvbnRhaW5lci5zdHlsZS5taW5XaWR0aCA9IGAke2N1cnJlbnRJZnJhbWVXaWR0aH1weGA7XG5cbiAgICAgICAgICAgICAgICBpZiAobmVlZHNIZWlnaHRDb2xsYXBzZSkgaWZyYW1lLnN0eWxlLmhlaWdodCA9ICcwcHgnO1xuICAgICAgICAgICAgICAgIGlmIChuZWVkc1dpZHRoQ29sbGFwc2UpIGlmcmFtZS5zdHlsZS53aWR0aCA9ICcwcHgnO1xuXG4gICAgICAgICAgICAgICAgY29udGVudFdpZHRoID0gTWF0aC5jZWlsKE1hdGgubWF4KGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoLCBjb250ZW50RG9jLmJvZHkuc2Nyb2xsV2lkdGgsIGNvbnRlbnREb2MuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCkpO1xuICAgICAgICAgICAgICAgIGNvbnRlbnRIZWlnaHQgPSBNYXRoLmNlaWwoTWF0aC5tYXgoY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0LCBjb250ZW50RG9jLmJvZHkuc2Nyb2xsSGVpZ2h0LCBjb250ZW50RG9jLmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KSk7XG5cbiAgICAgICAgICAgICAgICAvLyBGYWxsYmFjazogaWYgY29sbGFwc2luZyB0byAwcHggZ2F2ZSBhIG5lYXItemVybyBtZWFzdXJlbWVudCwgdGhlIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgIC8vIGxpa2VseSBoYXMgYGhlaWdodDogMTAwJWAgY2hhaW5zIChodG1sID4gYm9keSA+IC5hcHAtY29udGFpbmVyKSB0aGF0IGNhc2NhZGVkXG4gICAgICAgICAgICAgICAgLy8gdGhlIGNvbGxhcHNlIGludG8gYWxsIGNoaWxkcmVuLiBSZXRyeSB3aXRoIGEgbnVjbGVhciBvdmVycmlkZSB0aGF0IGZvcmNlcyBhbGxcbiAgICAgICAgICAgICAgICAvLyBlbGVtZW50cyB0byBpbnRyaW5zaWMgc2l6aW5nLiBUaGlzIGlzIG9ubHkgYSBmYWxsYmFjayBiZWNhdXNlIHRoZSBvdmVycmlkZVxuICAgICAgICAgICAgICAgIC8vIGJyZWFrcyBleHBsaWNpdCBwaXhlbCBoZWlnaHRzIChlLmcuIDhweCBpbmRpY2F0b3IgZG90cyBcdTIxOTIgMHB4KS5cbiAgICAgICAgICAgICAgICBjb25zdCBuZWVkc051Y2xlYXJIZWlnaHQgPSBuZWVkc0hlaWdodENvbGxhcHNlICYmIGNvbnRlbnRIZWlnaHQgPCAyO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5lZWRzTnVjbGVhcldpZHRoID0gbmVlZHNXaWR0aENvbGxhcHNlICYmIGNvbnRlbnRXaWR0aCA8IDI7XG4gICAgICAgICAgICAgICAgaWYgKG5lZWRzTnVjbGVhckhlaWdodCB8fCBuZWVkc051Y2xlYXJXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWFzdXJlU3R5bGUgPSBjb250ZW50RG9jLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgICAgICAgICAgIG1lYXN1cmVTdHlsZS5pZCA9ICdfX215b3BfbWVhc3VyZSc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmVlZHNOdWNsZWFySGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBydWxlcy5wdXNoKCdoZWlnaHQ6IGF1dG8gIWltcG9ydGFudCcsICdtaW4taGVpZ2h0OiAwICFpbXBvcnRhbnQnLCAnbWF4LWhlaWdodDogbm9uZSAhaW1wb3J0YW50Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRzTnVjbGVhcldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBydWxlcy5wdXNoKCd3aWR0aDogYXV0byAhaW1wb3J0YW50JywgJ21pbi13aWR0aDogMCAhaW1wb3J0YW50JywgJ21heC13aWR0aDogbm9uZSAhaW1wb3J0YW50Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVN0eWxlLnRleHRDb250ZW50ID0gYCosICo6OmJlZm9yZSwgKjo6YWZ0ZXIgeyAke3J1bGVzLmpvaW4oJzsgJyl9OyBmbGV4LWJhc2lzOiBhdXRvICFpbXBvcnRhbnQ7IGZsZXgtZ3JvdzogMCAhaW1wb3J0YW50OyB9YDtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudERvYy5oZWFkLmFwcGVuZENoaWxkKG1lYXN1cmVTdHlsZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29udGVudFdpZHRoID0gTWF0aC5jZWlsKE1hdGgubWF4KGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoLCBjb250ZW50RG9jLmJvZHkuc2Nyb2xsV2lkdGgsIGNvbnRlbnREb2MuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCkpO1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50SGVpZ2h0ID0gTWF0aC5jZWlsKE1hdGgubWF4KGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCwgY29udGVudERvYy5ib2R5LnNjcm9sbEhlaWdodCwgY29udGVudERvYy5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCkpO1xuXG4gICAgICAgICAgICAgICAgICAgIG1lYXN1cmVTdHlsZS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIGNvbnRhaW5lciBjb25zdHJhaW50cyBpbW1lZGlhdGVseSAoc2FtZSBmcmFtZSwgYmVmb3JlIHBhaW50KVxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5taW5IZWlnaHQgPSBwcmV2TWluSGVpZ2h0O1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5taW5XaWR0aCA9IHByZXZNaW5XaWR0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBjbGFtcChjb250ZW50V2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSBjbGFtcChjb250ZW50SGVpZ2h0LCBtaW5IZWlnaHQsIG1heEhlaWdodCk7XG5cbiAgICAgICAgICAgIC8vIFNldCBhdXRvLXNpemVkIGRpbWVuc2lvbnMgdG8gbWVhc3VyZWQgdmFsdWVzLCBub24tYXV0byB0byBleHBsaWNpdC8xMDAlXG4gICAgICAgICAgICBpZiAoc2hvdWxkQXV0b1dpZHRoKSB7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZnJhbWUuc3R5bGUud2lkdGggPSB0eXBlb2YgcmVzb2x2ZWRFeHBsaWNpdFdpZHRoID09PSAnbnVtYmVyJyA/IGAke3Jlc29sdmVkRXhwbGljaXRXaWR0aH1weGAgOiAnMTAwJSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2hvdWxkQXV0b0hlaWdodCkge1xuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gdHlwZW9mIHJlc29sdmVkRXhwbGljaXRIZWlnaHQgPT09ICdudW1iZXInID8gYCR7cmVzb2x2ZWRFeHBsaWNpdEhlaWdodH1weGAgOiAnMTAwJSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZvcmNlIHJlZmxvdyBzbyB0aGUgZmluYWwgZGltZW5zaW9ucyBhcmUgYXBwbGllZCB3aXRob3V0IHRyYW5zaXRpb24sXG4gICAgICAgICAgICAvLyB0aGVuIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHRyYW5zaXRpb25zLlxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuICAgICAgICAgICAgaWZyYW1lLm9mZnNldEhlaWdodDtcbiAgICAgICAgICAgIGlmcmFtZS5zdHlsZS50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUudHJhbnNpdGlvbiA9IHByZXZDb250YWluZXJUcmFuc2l0aW9uO1xuXG4gICAgICAgICAgICAvLyBEb24ndCBmb3JjZSBvdmVyZmxvdyBcdTIwMTQgbGV0IHRoZSBjb21wb25lbnQvcGFyZW50IGNvbnRyb2wgc2Nyb2xsaW5nLlxuICAgICAgICAgICAgLy8gT25seSBzZXQgb3ZlcmZsb3c6IGF1dG8gd2hlbiBjb250ZW50IGV4Y2VlZHMgbWF4IGNvbnN0cmFpbnRzLlxuICAgICAgICAgICAgY29uc3QgaXNXaWR0aENvbnN0cmFpbmVkID0gc2hvdWxkQXV0b1dpZHRoICYmIG1heFdpZHRoICE9PSB1bmRlZmluZWQgJiYgY29udGVudFdpZHRoID4gbWF4V2lkdGg7XG4gICAgICAgICAgICBjb25zdCBpc0hlaWdodENvbnN0cmFpbmVkID0gc2hvdWxkQXV0b0hlaWdodCAmJiBtYXhIZWlnaHQgIT09IHVuZGVmaW5lZCAmJiBjb250ZW50SGVpZ2h0ID4gbWF4SGVpZ2h0O1xuICAgICAgICAgICAgY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3dYID0gaXNXaWR0aENvbnN0cmFpbmVkID8gJ2F1dG8nIDogJyc7XG4gICAgICAgICAgICBjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zdHlsZS5vdmVyZmxvd1kgPSBpc0hlaWdodENvbnN0cmFpbmVkID8gJ2F1dG8nIDogJyc7XG5cbiAgICAgICAgICAgIG9wdHM/Lm9uU2l6ZUNoYW5nZT8uKHtcbiAgICAgICAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICAgICAgYXV0b1NpemluZ1dpZHRoOiBzaG91bGRBdXRvV2lkdGgsXG4gICAgICAgICAgICAgICAgYXV0b1NpemluZ0hlaWdodDogc2hvdWxkQXV0b0hlaWdodFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gSW5pdGlhbCBzaXplIChydW4gc3luY2hyb25vdXNseSwgbm90IGRlYm91bmNlZClcbiAgICAgICAgdXBkYXRlU2l6ZSgpO1xuXG4gICAgICAgIC8vIFN0b3JlIHVwZGF0ZVNpemUgZm9yIHJlZW50cmFudCBjYWxsc1xuICAgICAgICB0aGlzLl9hdXRvU2l6ZVVwZGF0ZSA9IHVwZGF0ZVNpemU7XG5cbiAgICAgICAgLy8gRGVib3VuY2Ugb2JzZXJ2ZXIgY2FsbGJhY2tzIHZpYSByQUYgXHUyMDE0IGF0IG1vc3Qgb25lIHVwZGF0ZVNpemUgcGVyIGZyYW1lLlxuICAgICAgICAvLyBQcmV2ZW50cyBsYXlvdXQgdGhyYXNoaW5nIGZyb20gaGlnaC1mcmVxdWVuY3kgbXV0YXRpb25zIChlLmcuIENTUyBhbmltYXRpb25zKS5cbiAgICAgICAgbGV0IHJhZklkOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHNjaGVkdWxlVXBkYXRlID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJhZklkICE9PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgICAgIHJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICByYWZJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB1cGRhdGVTaXplKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBPYnNlcnZlIGZvciBjaGFuZ2VzXG4gICAgICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHNjaGVkdWxlVXBkYXRlKCkpO1xuICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGRvYy5ib2R5KTtcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShkb2MuZG9jdW1lbnRFbGVtZW50KTtcblxuICAgICAgICAvLyBNdXRhdGlvbk9ic2VydmVyIGNhdGNoZXMgRE9NIGNvbnRlbnQgY2hhbmdlcyAoZS5nLiByZW1vdmluZyBsaXN0IGl0ZW1zLCB0b2dnbGluZyB2aWV3cylcbiAgICAgICAgLy8gdGhhdCBkb24ndCB0cmlnZ2VyIFJlc2l6ZU9ic2VydmVyIGJlY2F1c2UgdGhlIGJvZHkgYm94LXNpemUgc3RheXMgdGhlIHNhbWVcbiAgICAgICAgLy8gKGJvZHkgZmlsbHMgaWZyYW1lLCBpZnJhbWUgaGFzbid0IHNocnVuayB5ZXQpLlxuICAgICAgICAvLyBgYXR0cmlidXRlczogdHJ1ZWAgY2F0Y2hlcyBDU1MgY2xhc3Mvc3R5bGUgY2hhbmdlcyAoZS5nLiBkaXNwbGF5Om5vbmUgdG9nZ2xpbmcgdmlld3MpLlxuICAgICAgICBjb25zdCBtdXRhdGlvbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gc2NoZWR1bGVVcGRhdGUoKSk7XG4gICAgICAgIG11dGF0aW9uT2JzZXJ2ZXIub2JzZXJ2ZShkb2MuYm9keSwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUsIGNoYXJhY3RlckRhdGE6IHRydWUsIGF0dHJpYnV0ZXM6IHRydWUgfSk7XG5cbiAgICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgICAgIHJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIG11dGF0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgaWYgKHJhZklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShyYWZJZCk7XG4gICAgICAgICAgICAgICAgcmFmSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9hdXRvU2l6ZVVwZGF0ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuX2F1dG9TaXplQ2xlYW51cCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fYXV0b1NpemVDbGVhbnVwID0gY2xlYW51cDtcbiAgICAgICAgcmV0dXJuIGNsZWFudXA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYnJpZGdlU2l6ZUNsZWFudXA/OiBDbGVhbnVwSGFuZGxlcjtcblxuICAgIC8qKlxuICAgICAqIEF1dG8taGVpZ2h0IGZvciBhIGZyYW1lIHRoZSBob3N0IGNhbid0IHJlYWQgKGNyb3NzLW9yaWdpbikuIFJ1bnMgYWZ0ZXIgdGhlIElmcmFtZVNES1xuICAgICAqIGhhbmRzaGFrZTogdGhlIGZyYW1lIHJlcG9ydHMgYm9keSByZXNpemVzIGFuZCB0aGUgaG9zdCByZS1yZWFkcyB0aGUgc2Nyb2xsIGhlaWdodC5cbiAgICAgKi9cbiAgICBvYnNlcnZlSGVpZ2h0VmlhQnJpZGdlID0gKCk6IENsZWFudXBIYW5kbGVyID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2JyaWRnZVNpemVDbGVhbnVwKSByZXR1cm4gdGhpcy5fYnJpZGdlU2l6ZUNsZWFudXA7XG5cbiAgICAgICAgbGV0IG9ic2VydmVyQ2xlYW51cDogQ2xlYW51cEhhbmRsZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBzdG9wcGVkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgICAgICBzdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIG9ic2VydmVyQ2xlYW51cD8uKCk7XG4gICAgICAgICAgICB0aGlzLl9icmlkZ2VTaXplQ2xlYW51cCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fYnJpZGdlU2l6ZUNsZWFudXAgPSBjbGVhbnVwO1xuXG4gICAgICAgIHRoaXMuaW5pdGlhdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBpZiAoc3RvcHBlZCB8fCB0aGlzLm1hcmtlZEZvckRpc3Bvc2VkKSByZXR1cm47XG4gICAgICAgICAgICAvLyBMZWF2ZSB0aGUgYWJzb2x1dGUgMTAwJSBvdmVybGF5IGFuZCB0YWtlIHBhcnQgaW4gdGhlIGNvbnRhaW5lcidzIGxheW91dC5cbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaW5zZXQgPSAnYXV0byc7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICAgICAgICB0aGlzLnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKTtcbiAgICAgICAgICAgIG9ic2VydmVyQ2xlYW51cCA9IHRoaXMuc2VuZChuZXcgU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlKCkpO1xuICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgLy8gTm90IGZhdGFsOiB0aGUgY29tcG9uZW50IHN0aWxsIHJlbmRlcnMsIGl0IGp1c3QgbmV2ZXIgZ2V0cyBhIGhlaWdodCBhbmQgc2l0c1xuICAgICAgICAgICAgLy8gYXQgdGhlIGlmcmFtZSBkZWZhdWx0LiBXaXRob3V0IHRoaXMgbGluZSB0aGF0IGlzIGNvbXBsZXRlbHkgaW52aXNpYmxlIC0tXG4gICAgICAgICAgICAvLyBub3RoaW5nIHRocm93cywgbm90aGluZyBsb2dzLCBhbmQgdGhlIG9ubHkgc3ltcHRvbSBpcyBhIDE1MHB4IGZyYW1lLiBBXG4gICAgICAgICAgICAvLyBzaWxlbnQgc2l6aW5nIGZhaWx1cmUgb2YgZXhhY3RseSB0aGlzIHNoYXBlIGlzIHdoYXQgbWFkZSB0aGUgaW5pdCByYWNlXG4gICAgICAgICAgICAvLyAoMjAyNi0xMC0xNywgc2VlIElOSVQtSEFORFNIQUtFLm1kKSB0YWtlIGZvdXIgZGF5cyB0byBmaW5kOiBpbml0aWF0ZWQoKVxuICAgICAgICAgICAgLy8gcmVqZWN0ZWQsIHRoaXMgY2F0Y2ggc3dhbGxvd2VkIGl0LCBhbmQgYXV0by1oZWlnaHQgc2ltcGx5IG5ldmVyIGhhcHBlbmVkLlxuICAgICAgICAgICAgY29uc29sZS53YXJuKGBbTXlvcElmcmFtZUNvbXBvbmVudF0gYXV0by1oZWlnaHQgc2tpcHBlZCBmb3IgJHt0aGlzLmlkfTogJHtlfWApO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gY2xlYW51cDtcbiAgICB9XG5cbiAgICBzZXRTaXplQmFzZWRPbkRvY3VtZW50RWxlbWVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIHJldHVybiB7aGVpZ2h0LCB3aWR0aH1cbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7cmV0LmNvbnRlbnQud2lkdGh9cHhgO1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3JldC5jb250ZW50LmhlaWdodH1weGA7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vIHJldHVybiB3aW5kb3cuZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQgKyAncHgnO1xuXG5cbiAgICAgICAgICAgIC8vVE9ETzogZml4IHRoYXQgaGFjaywga2VlcCB0aGUgZnVuY3Rpb24gaW4gcmlnaHQgZm9ybWF0IHdoaWxlIG1pbmlmaWVkIDooXG4gICAgICAgICAgICBjb25zdCBub09wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRvIGVuc3VyZSBpdCdzIG5vdCBvcHRpbWl6ZWQgYXdheSwgeW91IGNhbiBjYWxsIGl0IGF0IGxlYXN0IG9uY2VcbiAgICAgICAgICAgIGxldCB4ID0gbm9PcCgpO1xuICAgICAgICAgICAgeCsrO1xuICAgICAgICAgICAgeC0tO1xuXG4gICAgICAgICAgICAvL3JldHVybiBgJHt3aW5kb3cuZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHR9cHhgO1xuXG4gICAgICAgICAgICAvL1RPRE8gOiBjaGVjayB0aGF0ICsxID9cbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heChNYXRoLm1heChcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQpXG4gICAgICAgICAgICAgICAgLCB3aW5kb3cuZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQpICsgeCArICdweCdcblxuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gcmV0LmNvbnRlbnQ7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIGxldCBtZXNzYWdlXyA9IHsuLi5tZXNzYWdlfSBhcyBCYXNlTXlvcE1lc3NhZ2U7XG4gICAgICAgIC8vVE9ETyA6ID8hPyEgc2hvdWxkIGl0IGJlIGhlcmUgP1xuICAgICAgICBpZiAobWVzc2FnZV8ubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5FeGVjdXRlQ29tcG9uZW50TWV0aG9kKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSAobWVzc2FnZV8gYXMgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZClcbiAgICAgICAgICAgIHRoaXNbdHlwZWRNZXNzYWdlLm1ldGhvZF0oKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL1RPRE8gOiBmaXggdGhhdCBoYWNrIDooXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9jb25zdCBoYW5kbGVyID0gbWVzc2FnZS5oYW5kbGVyXG5cbiAgICAgICAgbWVzc2FnZV8uZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi5kb3duO1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZV8pO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQ/LmNvbnRlbnRXaW5kb3c/LnBvc3RNZXNzYWdlKG1lc3NhZ2VfLCAnKicpO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9tZXNzYWdlLmhhbmRsZXIgPSBoYW5kbGVyXG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH07XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGluY29tZU1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbi5NdXRhdGlvbk9ic2VydmVyTWVzc2FnZVxuICAgICAgICAgICAgfHwgaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluLlJlc2l6ZU9ic2VydmVyTWVzc2FnZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyXG4gICAgICAgICAgICAvL3RoaXMuc2V0SGVpZ2h0QmFzZWRPbkRvY3VtZW50RWxlbWVudCgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VwZXIub25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5fYnJpZGdlU2l6ZUNsZWFudXA/LigpO1xuICAgICAgICBpZiAodGhpcy5fYXV0b1NpemVDbGVhbnVwKSB7XG4gICAgICAgICAgICB0aGlzLl9hdXRvU2l6ZUNsZWFudXAoKTtcbiAgICAgICAgICAgIHRoaXMuX2F1dG9TaXplQ2xlYW51cCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5faXNvTXNnSGFuZGxlcikge1xuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9pc29Nc2dIYW5kbGVyKTtcbiAgICAgICAgICAgIHRoaXMuX2lzb01zZ0hhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2xlYW51cEluc3BlY3QpXG4gICAgICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0KCk7XG5cbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICAvLyBPcHRpb25hbC1jaGFpbmVkOiBkaXNwb3NlIG5vdyBhbHNvIHJ1bnMgZm9yIGNvbXBvbmVudHMgdGhhdCBuZXZlciBpbml0aWF0ZWQsIGFuZFxuICAgICAgICAvLyBmb3IgdGhvc2UgdGhlIGZyYW1lIG1heSBhbHJlYWR5IGJlIGdvbmUgLS0gdGhlIGRpYWxvZyB0aGF0IGNvbnRhaW5lZCBpdCB3YXMgdG9yblxuICAgICAgICAvLyBkb3duLCBvciBpdCB3YXMgbmV2ZXIgYXR0YWNoZWQuIEEgdGhyb3cgaGVyZSB3b3VsZCBhYm9ydCB0aGUgcmVzdCBvZiB0aGUgY2xlYW51cC5cbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnBhcmVudE5vZGU/LnJlbW92ZUNoaWxkKHRoaXMuSWZyYW1lRWxlbWVudCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZywgU2tpbkxvYWRlclR5cGV9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuZXhwb3J0IGludGVyZmFjZSBJTXlvcExvYWRlciB7XG4gICAgdHlwZTogU2tpbkxvYWRlclR5cGU7XG4gICAgbG9hZDogKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IFByb21pc2U8SU15b3BDb21wb25lbnQ+O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BMb2FkZXIgaW1wbGVtZW50cyBJTXlvcExvYWRlciB7XG4gICAgYWJzdHJhY3QgdHlwZTogU2tpbkxvYWRlclR5cGU7XG4gICAgYWJzdHJhY3QgbG9hZDogKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IFByb21pc2U8SU15b3BDb21wb25lbnQ+O1xuXG4gICAgYXBwZW5kQ2hpbGQgPSAoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgZWxlbWVudDogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zLCkgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8ucmVsYXRpdmUpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlbGF0aXZlLmRpcmVjdGlvbiA9PT0gJ2JlZm9yZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmluc2VydEJlZm9yZShlbGVtZW50LCBvcHRpb25zLnJlbGF0aXZlLmNoaWxkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVsYXRpdmUuZGlyZWN0aW9uID09PSAnYWZ0ZXInKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBvcHRpb25zLnJlbGF0aXZlLmNoaWxkPy5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmluc2VydEJlZm9yZShlbGVtZW50LCBuZXh0U2libGluZyA/IG5leHRTaWJsaW5nIDogbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcElmcmFtZUNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcExvYWRlcn0gZnJvbSBcIi4vSU15b3BMb2FkZXJcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcbmltcG9ydCB7SUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElJZnJhbWVMb2FkZXJDb25maWcsIElTa2luQ29uZmlnLCBTa2luTG9hZGVyc30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuXG5jb25zdCBhZGRRdWVyeVBhcmFtID0gKHVybDogc3RyaW5nLCBwYXJhbTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgLy8gQ3JlYXRlIGEgVVJMIG9iamVjdFxuICAgIGNvbnN0IHVybE9iaiA9IG5ldyBVUkwodXJsKTtcblxuICAgIC8vIEFkZCB0aGUgcXVlcnkgcGFyYW1ldGVyXG4gICAgdXJsT2JqLnNlYXJjaFBhcmFtcy5hcHBlbmQocGFyYW0sIHZhbHVlKTtcblxuICAgIC8vIFJldHVybiB0aGUgdXBkYXRlZCBVUkxcbiAgICByZXR1cm4gdXJsT2JqLnRvU3RyaW5nKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBNeW9wSWZyYW1lTG9hZGVyIGV4dGVuZHMgQmFzZU15b3BMb2FkZXIge1xuICAgIHR5cGUgPSBTa2luTG9hZGVycy5JZnJhbWVMb2FkZXJcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBsb2FkID0gYXN5bmMgKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcbiAgICAgICAgbGV0IElmcmFtZUVsZW1lbnQ6IEhUTUxJRnJhbWVFbGVtZW50O1xuXG4gICAgICAgIGNvbnN0IHR5cGVkTG9hZGVyQ29uZmlnID0gKHNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpO1xuXG4gICAgICAgIGlmIChjb250YWluZXI/Lm5vZGVOYW1lID09PSBcIklGUkFNRVwiKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnbmVlZHMgdG8gbG9hZCBpbnRvIGFuIGV4c2lzdGluZyBJZnJhbWUuLi4nLCB0eXBlZExvYWRlckNvbmZpZy51cmwsIGNvbnRhaW5lcik7XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSAoY29udGFpbmVyIGFzIEhUTUxJRnJhbWVFbGVtZW50KVxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zcmMgPSB0eXBlZExvYWRlckNvbmZpZy51cmxcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXFJZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgY29uc3QgZG9tSWQgPSBgbXlvcC1jb21wLSR7dW5pcUlkfWBcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgICAgICAvLyBTZXQgYWxsIHN0eWxlcyBCRUZPUkUgYXBwZW5kaW5nIHRvIHByZXZlbnQgZmxhc2ggYXQgd3JvbmcgcG9zaXRpb25cbiAgICAgICAgICAgIGNvbnN0IGlmcmFtZVN0eWxlcyA9IGBcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICAgICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgaW5zZXQ6IDA7XG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAke3R5cGVkTG9hZGVyQ29uZmlnLmF1dG9IZWlnaHQgfHwgIXR5cGVkTG9hZGVyQ29uZmlnLmhlaWdodCA/ICcxMDAlJyA6IHR5cGVkTG9hZGVyQ29uZmlnLmhlaWdodH07XG4gICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgICAgICAgb3BhY2l0eTogJHtvcHRpb25zPy5oaWRkZW4gPyAnMCcgOiAnMSd9O1xuICAgICAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiAke29wdGlvbnM/LmhpZGRlbiA/ICdub25lJyA6ICdhbGwnfTtcbiAgICAgICAgICAgIGA7XG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnN0eWxlLmNzc1RleHQgPSBpZnJhbWVTdHlsZXM7XG5cbiAgICAgICAgICAgIC8vIFNldCBlbGVtZW50IGF0dHJpYnV0ZXMgaWYgcHJvdmlkZWRcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5lbGVtZW50QXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuZWxlbWVudEF0dHJpYnV0ZXMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgJycpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCBTdHJpbmcodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpbiBvcmRlciB0byBoYW5kbGUgaXNzdWUgdG8gbG9hZCBpZnJhbWUgaW5zaWRlIGFuIGlmcmFtZSB3aXRoIHRoZSBzYW1lIHVybFxuICAgICAgICAgICAgbGV0IHVybDJsb2FkID0gKHNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpLnVybDtcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5faGFzUGFyZW50KVxuICAgICAgICAgICAgICAgIHVybDJsb2FkID0gYWRkUXVlcnlQYXJhbSh1cmwybG9hZCwgXCJfbXlvcC1jb21wXCIsIHVuaXFJZCk7XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3JjID0gdXJsMmxvYWQ7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiBkbyBpdCBvbmx5IHdpdGggZmxhZyA/XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBJZnJhbWVFbGVtZW50LCBvcHRpb25zKSBhcyBIVE1MSUZyYW1lRWxlbWVudDtcbiAgICAgICAgICAgIC8vICAgSWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRvbUlkKSBhcyBIVE1MSUZyYW1lRWxlbWVudDtcbiAgICAgICAgICAgIC8vTk8gOiBJZnJhbWVFbGVtZW50ID0gY29udGFpbmVyLmxhc3RFbGVtZW50Q2hpbGQgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgTXlvcElmcmFtZUNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIGBhdXRvSGVpZ2h0YCBpbiB0aGUgdjEgY29uZmlnIHVzZWQgdG8gb25seSBzZXQgaGVpZ2h0OjEwMCUgb24gYW4gYWJzb2x1dGUgZnJhbWUsIHNvIGluIGFuXG4gICAgICAgIC8vIHVuc2l6ZWQgY29udGFpbmVyIHRoZSBmcmFtZSBzdGF5ZWQgYXQgdGhlIDE1MHB4IENTUyBkZWZhdWx0LlxuICAgICAgICBpZiAodHlwZWRMb2FkZXJDb25maWcuYXV0b0hlaWdodCAmJiBvcHRpb25zPy5hdXRvU2l6ZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5vYnNlcnZlSGVpZ2h0VmlhQnJpZGdlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgbXlvcFdlYmNvbXBvbmVudENvbnN0cyA9IHtcbiAgICB3ZWJjb21wb25lbnRfbWVzc2FnZV9rZXk6ICdteW9wX3dlYmNvbXBvbmVudF9tZXNzYWdlJ1xufVxuIiwgImltcG9ydCB7bXlvcFdlYmNvbXBvbmVudENvbnN0c30gZnJvbSBcIi4uLy4uL3dlYmNvbXBvbmVudC9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7c2V0RGVidWdTdHlsZX0gZnJvbSBcIi4uL2NvbXBvbmVudENvcmVcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcblxuZXhwb3J0IGNsYXNzIE15b3BXZWJDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwcml2YXRlIGN1c3RvbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICBzdXBlcihjb21wb25lbnREZWZpbml0aW9uLCBjb250YWluZXIgLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gY3VzdG9tRWxlbWVudDtcbiAgICB9XG5cbiAgICBjbGVhbnVwSW5zcGVjdDogQ2xlYW51cEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgfVxuXG4gICAgaW5zcGVjdCgpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHNldERlYnVnU3R5bGUodGhpcy5pZCwgJ015b3BXZWJDb21wb25lbnQnLCAwLCB0aGlzLmNvbnRhaW5lciwgdGhpcy5jdXN0b21FbGVtZW50LCB0aGlzLmNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGVhbnVwSW5zcGVjdDtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS53aWR0aCA9ICcwJ1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAndW5zZXQnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2FsbCdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLndpZHRoID0gJyc7XG4gICAgfVxuXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2U8YW55PikgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZV8gPSB7Li4ubWVzc2FnZX0gYXMgQmFzZU15b3BNZXNzYWdlO1xuXG4gICAgICAgIC8vVE9ETyA6IGNhbiBiZSBkb25lIHdpdGhvdXQgY2xvbmluZz9cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL2NvbnN0IGhhbmRsZXIgPSBtZXNzYWdlXy5oYW5kbGVyXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlXyk7XG5cbiAgICAgICAgY29uc3QgbXNnID0gbmV3IEN1c3RvbUV2ZW50PEJhc2VNeW9wTWVzc2FnZT4obXlvcFdlYmNvbXBvbmVudENvbnN0cy53ZWJjb21wb25lbnRfbWVzc2FnZV9rZXksIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRldGFpbDogbWVzc2FnZV8sXG4gICAgICAgICAgICAvLyBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgLy8gY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAvLyBjb21wb3NlZDogdHJ1ZVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vdGhpcy5jb250YWluZXIuZGlzcGF0Y2hFdmVudChtc2cpXG5cbiAgICAgICAgLy9zZW5kaW5nIGRhdGEgZnJvbSBob3N0IHRvIHRoZSBjb21wb25lbnRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5kaXNwYXRjaEV2ZW50KG1zZylcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLmN1c3RvbUVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuY2hpbGRyZW5bMF0uZGlzcGF0Y2hFdmVudChtc2cpXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciB3aGlsZSB0cnlpbmcgdG8gZGlzcGF0Y2hFdmVudCcsIGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL21lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfVxuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQodGhpcy5jdXN0b21FbGVtZW50KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wV2ViQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wV2ViY29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuaW1wb3J0IHt1dWlkdjQsIHdhaXR9IGZyb20gXCIuLi8uLi91dGlscy91dGlscy50c1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWcsIElXZWJDb21wb25lbnRMb2FkZXJDb25maWcsIFNraW5Mb2FkZXJzfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmNvbnN0IHNlZW46IFJlY29yZDxzdHJpbmcsIFByb21pc2U8dm9pZD4+ID0ge307XG5cbmV4cG9ydCBjbGFzcyBXZWJjb21wb25lbnRMb2FkZXIgZXh0ZW5kcyBCYXNlTXlvcExvYWRlciB7XG5cbiAgICB0eXBlID0gU2tpbkxvYWRlcnMuV2ViQ29tcG9uZW50TG9hZGVyXG5cbiAgICBsb2FkID0gYXN5bmMgKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcblxuICAgICAgICBjb25zdCBsb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSVdlYkNvbXBvbmVudExvYWRlckNvbmZpZyk7XG5cbiAgICAgICAgaWYgKCFzZWVuW2xvYWRlckNvbmZpZy51cmxdKSB7XG4gICAgICAgICAgICAvLyBhd2FpdCBpbXBvcnQoIC8qIEB2aXRlLWlnbm9yZSAqLyB3ZWJDb21wb25lbnRMb2FkVXJsKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdtb2R1bGUgbG9hZGVkJyk7XG4gICAgICAgICAgICBzZWVuW2xvYWRlckNvbmZpZy51cmxdID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdlYkNvbXBvbmVudExvYWRVcmwgPSBsb2FkZXJDb25maWcudXJsXG4gICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICAgICAgc2NyaXB0LnR5cGUgPSAnbW9kdWxlJztcbiAgICAgICAgICAgICAgICBzY3JpcHQuc3JjID0gd2ViQ29tcG9uZW50TG9hZFVybDtcbiAgICAgICAgICAgICAgICBzY3JpcHQub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ01vZHVsZSBhbHJlZGF5IGxvYWRlZCBvciBpbiBsb2FkaW5nIHByb2Nlc3MnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHNlZW5bbG9hZGVyQ29uZmlnLnVybF07XG5cbiAgICAgICAgLy9UT0RPIDogYWRkIHJldHJ5IG1lY2hhbmlzbSBpbiBmYWlsIGNhc2UuXG5cbiAgICAgICAgLy9UT0RPIDogZml4IHRoYXQgaGFjaywgc2hvdWxkIGZpeCB0aGUgcmFjZSBjb25kaXRpb24gZm9yIGxvYWRlZCBtb2R1bGVzXG4gICAgICAgIGF3YWl0IHdhaXQoMSk7XG5cbiAgICAgICAgbGV0IGRvbUlkID0gYG15b3AtY29tcC0ke3V1aWR2NCgpfWBcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobG9hZGVyQ29uZmlnLnRhZyk7XG5cbiAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAvL2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICBlbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgKGNvbnRhaW5lci5pZC5zdGFydHNXaXRoKCdteW9wLWNvbXAtJykpIHtcbiAgICAgICAgLy8gICAgIC8vIGluIHBsYWNlIHJlcGxhY2VtZW50XG4gICAgICAgIC8vICAgICBjb250YWluZXIucmVwbGFjZVdpdGgoZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAvL2NvbnRhaW5lciA9IGVsZW1lbnQucGFyZW50RWxlbWVudCE7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICBpZihvcHRpb25zPy5fZW52aXJvbm1lbnQpe1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZWxlbWVudC5fbXlvcEVudmlyb25tZW50ID0gb3B0aW9ucz8uX2Vudmlyb25tZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgICAvL2VsZW1lbnQuaW5uZXJIVE1MID0gYDwke2xvYWRlckNvbmZpZy50YWd9IC8+YDtcbiAgICAgICAgcmV0dXJuIG5ldyBNeW9wV2ViQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgfVxuXG59XG4iLCAiLyoqXG4gKiBUaGUgY2xpZW50IHdpbmRvdzogd2hhdCBhIHJldHVybmluZyB2aXNpdG9yIGRvZXMgTk9UIGFzayBmb3IuXG4gKlxuICogQSBjb21wb25lbnQgdGhlIGJyb3dzZXIgYWxyZWFkeSBob2xkcywgc3RpbGwgaW5zaWRlIGl0cyBmcmVzaG5lc3Mgd2luZG93LCBpcyByZW5kZXJlZFxuICogd2l0aCBubyBuZXR3b3JrIGF0IGFsbC4gT25jZSB0aGUgd2luZG93IGVuZHMgdGhlIGJyb3dzZXIgZG9lcyBub3QgcmUtZG93bmxvYWQgaXQgZWl0aGVyXG4gKiBcdTIwMTQgaXQgc2VuZHMgYmFjayB0aGUgdmVyc2lvbiBpdCBob2xkcyBhbmQgaXMgdXN1YWxseSB0b2xkIFwidW5jaGFuZ2VkXCIgaW4gYSBmZXcgaHVuZHJlZFxuICogYnl0ZXMuXG4gKlxuICogVEhFIFdJTkRPVyBJUyBUSEUgU0VSVkVSJ1MsIE5PVCBPVVJTLiBJdCBjb21lcyBmcm9tIHRoZSByZXNwb25zZTogYHMtbWF4YWdlYCBpcyB0aGVcbiAqIGZyZXNobmVzcyB0aGUgc2VydmVyIHByb21pc2VkLCBhbmQgYEFnZWAgaXMgaG93IG11Y2ggb2YgaXQgYSBDRE4gYWxyZWFkeSBzcGVudCBiZWZvcmVcbiAqIHRoZSBieXRlcyByZWFjaGVkIHVzLiBUaGUgd2luZG93IHdlIG1heSBrZWVwIGlzIHRoZXJlZm9yZSBgcy1tYXhhZ2UgLSBBZ2VgLCBuZXZlclxuICogYHMtbWF4YWdlYCBcdTIwMTQgb3RoZXJ3aXNlIGEgY29weSB0aGF0IHNhdCBhdCB0aGUgZWRnZSBmb3IgNTUgb2YgaXRzIDYwIHNlY29uZHMgd291bGQgYmVcbiAqIGhlbGQgZm9yIGFub3RoZXIgNjAgaGVyZSwgYW5kIGEgcHVibGlzaCB3b3VsZCB0YWtlIHR3aWNlIGFzIGxvbmcgdG8gYmUgc2VlbiBhcyBwcm9taXNlZC5cbiAqIFRoaXMgaXMgdGhlIHNpbmdsZSBlYXNpZXN0IHRoaW5nIHRvIGdldCB3cm9uZyBpbiBhIGNsaWVudCBjYWNoZSwgYW5kIGl0IGlzIGludmlzaWJsZSBpblxuICogdGVzdGluZyBiZWNhdXNlIGl0IG9ubHkgc2hvd3MgdXAgYXMgXCJzb21ldGltZXMgc3RhbGVcIi5cbiAqXG4gKiBJbmRleGVkREIsIG5vdCBsb2NhbFN0b3JhZ2U6IGNvbXBvbmVudHMgcnVuIHRvIGh1bmRyZWRzIG9mIEtCLCBsb2NhbFN0b3JhZ2UgY2FwcyBhcm91bmRcbiAqIDUgTUIgYW5kIGJsb2NrcyB0aGUgbWFpbiB0aHJlYWQuIEV2ZXJ5IHBhdGggZGVncmFkZXMgdG8gdGhlIG5ldHdvcmsgXHUyMDE0IGEgYnJvd3NlciBpblxuICogcHJpdmF0ZSBtb2RlLCB3aXRoIHN0b3JhZ2UgZGlzYWJsZWQgb3Igb3ZlciBxdW90YSwgbXVzdCByZW5kZXIgdGhlIHBhZ2UsIG5vdCBmYWlsIGl0LlxuICovXG5cbmNvbnN0IERCX05BTUUgPSAnbXlvcC1kZWxpdmVyeSc7XG5jb25zdCBTVE9SRSA9ICdjb21wb25lbnRzJztcbmNvbnN0IERCX1ZFUlNJT04gPSAxO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JlZEVudHJ5IHtcbiAgICBrZXk6IHN0cmluZztcbiAgICAvKiogdGhlIHJlc29sdmVkIGNvbXBvbmVudCBjb25maWcsIGV4YWN0bHkgYXMgdGhlIG5ldHdvcmsgcGF0aCBwcm9kdWNlcyBpdCAqL1xuICAgIGNvbmZpZzogYW55O1xuICAgIC8qKiB0aGUgc2VydmVyJ3MgdmVyc2lvbiB0b2tlbiBmb3IgdGhlc2UgYnl0ZXM6IGA8cmV2Pn48b3B0PmAgKi9cbiAgICB0YWc6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIHdoZW4gdGhpcyBicm93c2VyIHN0b3JlZCBpdCAqL1xuICAgIHN0b3JlZEF0OiBudW1iZXI7XG4gICAgLyoqIGhvdyBsb25nIGl0IG1heSBiZSB1c2VkIHdpdGhvdXQgYXNraW5nLCBpbiBtcyAoYWxyZWFkeSBBZ2UtYWRqdXN0ZWQpICovXG4gICAgd2luZG93TXM6IG51bWJlcjtcbiAgICAvKiogd2hpY2ggaG9zdCBwcm9kdWNlZCBpdCBcdTIwMTQgYSBrZXkgZnJvbSBhbm90aGVyIGhvc3QgaXMgbmV2ZXIgcmV1c2VkICovXG4gICAgaG9zdDogc3RyaW5nO1xuICAgIC8qKiB3aXJlIHNpemUgb2YgdGhlIHJlc3BvbnNlIGl0IGNhbWUgZnJvbSwgc28gc3RhdHMgY2FuIHNheSB3aGF0IHRoZSB3aW5kb3cgc2F2ZWQgKi9cbiAgICBieXRlcz86IG51bWJlcjtcbn1cblxubGV0IGRiUHJvbWlzZTogUHJvbWlzZTxJREJEYXRhYmFzZSB8IG51bGw+IHwgbnVsbCA9IG51bGw7XG5cbmZ1bmN0aW9uIG9wZW5EYigpOiBQcm9taXNlPElEQkRhdGFiYXNlIHwgbnVsbD4ge1xuICAgIGlmIChkYlByb21pc2UpIHJldHVybiBkYlByb21pc2U7XG4gICAgZGJQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5kZXhlZERCID09PSAndW5kZWZpbmVkJykgcmV0dXJuIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICBjb25zdCByZXEgPSBpbmRleGVkREIub3BlbihEQl9OQU1FLCBEQl9WRVJTSU9OKTtcbiAgICAgICAgICAgIHJlcS5vbnVwZ3JhZGVuZWVkZWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGIgPSByZXEucmVzdWx0O1xuICAgICAgICAgICAgICAgIGlmICghZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhTVE9SRSkpIGRiLmNyZWF0ZU9iamVjdFN0b3JlKFNUT1JFLCB7IGtleVBhdGg6ICdrZXknIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlcS5vbnN1Y2Nlc3MgPSAoKSA9PiByZXNvbHZlKHJlcS5yZXN1bHQpO1xuICAgICAgICAgICAgcmVxLm9uZXJyb3IgPSAoKSA9PiByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgLy8gQSBibG9ja2VkIHVwZ3JhZGUgbXVzdCBub3QgaGFuZyB0aGUgcGFnZSBsb2FkLlxuICAgICAgICAgICAgcmVxLm9uYmxvY2tlZCA9ICgpID0+IHJlc29sdmUobnVsbCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkYlByb21pc2U7XG59XG5cbmZ1bmN0aW9uIHR4PFQ+KG1vZGU6IElEQlRyYW5zYWN0aW9uTW9kZSwgZm46IChzdG9yZTogSURCT2JqZWN0U3RvcmUpID0+IElEQlJlcXVlc3QpOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gICAgcmV0dXJuIG9wZW5EYigpLnRoZW4oZGIgPT4gbmV3IFByb21pc2U8VCB8IG51bGw+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGlmICghZGIpIHJldHVybiByZXNvbHZlKG51bGwpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdCA9IGRiLnRyYW5zYWN0aW9uKFNUT1JFLCBtb2RlKTtcbiAgICAgICAgICAgIGNvbnN0IHJlcSA9IGZuKHQub2JqZWN0U3RvcmUoU1RPUkUpKTtcbiAgICAgICAgICAgIHJlcS5vbnN1Y2Nlc3MgPSAoKSA9PiByZXNvbHZlKHJlcS5yZXN1bHQgYXMgVCk7XG4gICAgICAgICAgICByZXEub25lcnJvciA9ICgpID0+IHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICB0Lm9uYWJvcnQgPSAoKSA9PiByZXNvbHZlKG51bGwpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgIH1cbiAgICB9KSk7XG59XG5cbi8qKlxuICogQSBTWU5DSFJPTk9VUyBzaGFkb3cgb2Ygd2hhdCB3ZSBob2xkLCBmb3IgY29kZSB0aGF0IHJ1bnMgYmVmb3JlIEluZGV4ZWREQiBjYW4gYW5zd2VyLlxuICpcbiAqIFRoZSBwYWdlJ3MgSFRNTCBjYW4gc3RhcnQgdGhlIGNvbXBvbmVudCByZXF1ZXN0IHdoaWxlIHRoZSBKUyBidW5kbGUgaXMgc3RpbGwgZG93bmxvYWRpbmdcbiAqIFx1MjAxNCBidXQgb25seSBpZiBpdCBrbm93cywgYXQgcGFyc2UgdGltZSwgd2hldGhlciBhIHJlcXVlc3QgaXMgbmVlZGVkIGF0IGFsbCBhbmQgd2hpY2ggb25lLlxuICogSW5kZXhlZERCIGlzIGFzeW5jLCBzbyBhbiBpbmxpbmUgc2NyaXB0IGNhbm5vdCBhc2sgaXQuIGxvY2FsU3RvcmFnZSBjYW4gYmUgcmVhZFxuICogc3luY2hyb25vdXNseSwgc28gZWFjaCBlbnRyeSBtaXJyb3JzIHR3byB0aW55IGZhY3RzIGhlcmU6IHRoZSB2ZXJzaW9uIHRhZyBhbmQgd2hlbiB0aGVcbiAqIHdpbmRvdyBlbmRzLiBOb3RoaW5nIGVsc2UgXHUyMDE0IHRoZSBjb21wb25lbnQgaXRzZWxmIHN0YXlzIGluIEluZGV4ZWREQiB3aGVyZSBpdCBiZWxvbmdzLlxuICpcbiAqIFdpdGhvdXQgdGhpcyB0aGUgcHJlbG9hZCBoaW50IGlzIGFjdGl2ZWx5IGhhcm1mdWw6IGl0IGRvd25sb2FkcyB0aGUgd2hvbGUgY29tcG9uZW50XG4gKiBldmVyeSB0aW1lLCBpbmNsdWRpbmcgb24gdGhlIHZpc2l0cyB3aGVyZSB0aGUgc3RvcmVkIGNvcHkgd2FzIGdvaW5nIHRvIGFuc3dlciBmb3IgZnJlZS5cbiAqIE1lYXN1cmVkIG9uIG15b3AuZGV2IGJlZm9yZSBpdCBleGlzdGVkIFx1MjAxNCA5OCBLQiBmZXRjaGVkLCB0aGVuIGRpc2NhcmRlZCwgb24gZXZlcnkgcmVsb2FkLlxuICovXG5jb25zdCBISU5UX1BSRUZJWCA9ICdteW9wLmQuJztcblxuZnVuY3Rpb24gd3JpdGVIaW50KGtleTogc3RyaW5nLCB0YWc6IHN0cmluZyB8IG51bGwsIGV4cGlyZXNBdDogbnVtYmVyKSB7XG4gICAgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oSElOVF9QUkVGSVggKyBrZXksIEpTT04uc3RyaW5naWZ5KHsgdDogdGFnLCBlOiBleHBpcmVzQXQgfSkpOyB9XG4gICAgY2F0Y2ggeyAvKiBwcml2YXRlIG1vZGUsIHF1b3RhLCBkaXNhYmxlZCBcdTIwMTQgdGhlIGhpbnQgaXMgYW4gb3B0aW1pc2F0aW9uLCBuZXZlciBhIHJlcXVpcmVtZW50ICovIH1cbn1cblxuZnVuY3Rpb24gY2xlYXJIaW50KGtleTogc3RyaW5nKSB7XG4gICAgdHJ5IHsgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oSElOVF9QUkVGSVggKyBrZXkpOyB9IGNhdGNoIHsgLyogYXMgYWJvdmUgKi8gfVxufVxuXG4vKiogQSBtZW1vcnkgbGF5ZXIgaW4gZnJvbnQgb2Ygc3RvcmFnZTogYSBzZWNvbmQgY29tcG9uZW50IG9uIHRoZSBzYW1lIHBhZ2UgbXVzdCBub3Qgd2FpdCBvbiBJTy4gKi9cbmNvbnN0IG1lbW9yeSA9IG5ldyBNYXA8c3RyaW5nLCBTdG9yZWRFbnRyeT4oKTtcblxuZXhwb3J0IGNvbnN0IGRlbGl2ZXJ5U3RvcmUgPSB7XG4gICAga2V5KGhvc3Q6IHN0cmluZywgY29tcG9uZW50SWQ6IHN0cmluZywgZW52OiBzdHJpbmcsIHByZXZpZXc6IGJvb2xlYW4sIG9wdDogc3RyaW5nKSB7XG4gICAgICAgIC8vIFRoZSBIT1NUIGlzIHBhcnQgb2YgdGhlIGtleS4gVHdvIHN0YWNrcyBjYW4gc2VydmUgdGhlIHNhbWUgY29tcG9uZW50IHdpdGhcbiAgICAgICAgLy8gZGlmZmVyZW50IGZyZXNobmVzcywgYW5kIGVudHJpZXMgZnJvbSBvbmUgbXVzdCBuZXZlciBiZSByZWFkIGFzIHRoZSBvdGhlcidzLlxuICAgICAgICByZXR1cm4gYCR7aG9zdH18JHtjb21wb25lbnRJZH18JHtlbnZ9fCR7cHJldmlldyA/ICdwcmV2aWV3JyA6ICdsaXZlJ318JHtvcHQgfHwgJ3Jhdyd9YDtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxTdG9yZWRFbnRyeSB8IG51bGw+IHtcbiAgICAgICAgY29uc3QgbSA9IG1lbW9yeS5nZXQoa2V5KTtcbiAgICAgICAgaWYgKG0pIHJldHVybiBtO1xuICAgICAgICBjb25zdCBlID0gYXdhaXQgdHg8U3RvcmVkRW50cnk+KCdyZWFkb25seScsIHMgPT4gcy5nZXQoa2V5KSk7XG4gICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICBtZW1vcnkuc2V0KGtleSwgZSk7XG4gICAgICAgICAgICAvLyBTRUxGLUhFQUwuIFRoZSB0d28gc3RvcmVzIGNhbiBkaXNhZ3JlZTogYW4gZW50cnkgd3JpdHRlbiBiZWZvcmUgdGhlIGhpbnRcbiAgICAgICAgICAgIC8vIGV4aXN0ZWQsIGEgYnJvd3NlciB0aGF0IGV2aWN0ZWQgbG9jYWxTdG9yYWdlIGJ1dCBub3QgSW5kZXhlZERCLCBhIHVzZXIgd2hvXG4gICAgICAgICAgICAvLyBjbGVhcmVkIG9uZS4gQSBtaXNzaW5nIGhpbnQgbWFrZXMgdGhlIHByZWxvYWQgZmFsbCBiYWNrIHRvIHRoZSBGVUxMIGNvbXBvbmVudFxuICAgICAgICAgICAgLy8gd2hpbGUgdGhlIFNESywgd2hpY2ggY2FuIHNlZSBJbmRleGVkREIsIG9ubHkgd2FudHMgdGhlIHZlcnNpb24gY2hlY2sgLS0gdHdvXG4gICAgICAgICAgICAvLyByZXF1ZXN0cyB3aGVyZSB0aGVyZSBzaG91bGQgYmUgb25lLiBTZWVuIGluIHRoZSB3aWxkIG9uIHRoZSBmaXJzdCBsb2FkIGFmdGVyXG4gICAgICAgICAgICAvLyB0aGUgaGludCBzaGlwcGVkLiBSZXdyaXRpbmcgaXQgaGVyZSBjb3N0cyBub3RoaW5nIGFuZCBjbG9zZXMgdGhlIGdhcCBmb3IgZ29vZC5cbiAgICAgICAgICAgIHdyaXRlSGludChrZXksIGUudGFnLCBlLnN0b3JlZEF0ICsgZS53aW5kb3dNcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgfSxcblxuICAgIGFzeW5jIHB1dChlbnRyeTogU3RvcmVkRW50cnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbWVtb3J5LnNldChlbnRyeS5rZXksIGVudHJ5KTtcbiAgICAgICAgd3JpdGVIaW50KGVudHJ5LmtleSwgZW50cnkudGFnLCBlbnRyeS5zdG9yZWRBdCArIGVudHJ5LndpbmRvd01zKTtcbiAgICAgICAgYXdhaXQgdHgoJ3JlYWR3cml0ZScsIHMgPT4gcy5wdXQoZW50cnkpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZHJvcChrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBtZW1vcnkuZGVsZXRlKGtleSk7XG4gICAgICAgIGNsZWFySGludChrZXkpO1xuICAgICAgICBhd2FpdCB0eCgncmVhZHdyaXRlJywgcyA9PiBzLmRlbGV0ZShrZXkpKTtcbiAgICB9LFxuXG4gICAgLyoqIFN0aWxsIHVzYWJsZSB3aXRob3V0IGFza2luZyB0aGUgc2VydmVyPyAqL1xuICAgIGZyZXNoKGU6IFN0b3JlZEVudHJ5IHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISFlICYmIChEYXRlLm5vdygpIC0gZS5zdG9yZWRBdCkgPCBlLndpbmRvd01zO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgd2luZG93IHRoaXMgcmVzcG9uc2UgbGljZW5zZXM6IHRoZSBzZXJ2ZXIncyBmcmVzaG5lc3MgbWludXMgd2hhdCBhIENETiBhbHJlYWR5XG4gICAgICogc3BlbnQuIFJldHVybnMgMCB3aGVuIHRoZSBzZXJ2ZXIgc2FpZCBub3RoaW5nIGFib3V0IGNhY2hpbmcsIHdoaWNoIG1lYW5zIFwiZG8gbm90XG4gICAgICogaG9sZCB0aGlzXCIgXHUyMDE0IHRoZSBzYWZlIHJlYWRpbmcsIGFuZCB3aGF0IHByb2R1Y3Rpb24gc2VuZHMgdG9kYXkuXG4gICAgICovXG4gICAgd2luZG93RnJvbShoZWFkZXJzOiBIZWFkZXJzKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgY2MgPSBoZWFkZXJzLmdldCgnY2FjaGUtY29udHJvbCcpIHx8ICcnO1xuICAgICAgICBpZiAoL25vLXN0b3JlfG5vLWNhY2hlL2kudGVzdChjYykpIHJldHVybiAwO1xuICAgICAgICBjb25zdCBtID0gL3MtbWF4YWdlXFxzKj1cXHMqKFxcZCspL2kuZXhlYyhjYykgfHwgL21heC1hZ2VcXHMqPVxccyooXFxkKykvaS5leGVjKGNjKTtcbiAgICAgICAgaWYgKCFtKSByZXR1cm4gMDtcbiAgICAgICAgY29uc3QgdG90YWwgPSBOdW1iZXIobVsxXSk7XG4gICAgICAgIGNvbnN0IGFnZSA9IE51bWJlcihoZWFkZXJzLmdldCgnYWdlJykgfHwgMCk7XG4gICAgICAgIHJldHVybiBNYXRoLm1heCgwLCAodG90YWwgLSAoaXNOYU4oYWdlKSA/IDAgOiBhZ2UpKSkgKiAxMDAwO1xuICAgIH0sXG5cbiAgICAvKiogRm9yIHRlc3RzIGFuZCBmb3IgYHJlZnJlc2goKWA6IGZvcmdldCBldmVyeXRoaW5nIHRoaXMgYnJvd3NlciBob2xkcy4gKi9cbiAgICBhc3luYyBjbGVhcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbWVtb3J5LmNsZWFyKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gbG9jYWxTdG9yYWdlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgayA9IGxvY2FsU3RvcmFnZS5rZXkoaSk7XG4gICAgICAgICAgICAgICAgaWYgKGsgJiYgay5zdGFydHNXaXRoKEhJTlRfUFJFRklYKSkgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggeyAvKiBub3RoaW5nIHRvIGNsZWFuIHVwIGlmIGl0IHdhcyBuZXZlciB3cml0YWJsZSAqLyB9XG4gICAgICAgIGF3YWl0IHR4KCdyZWFkd3JpdGUnLCBzID0+IHMuY2xlYXIoKSk7XG4gICAgfSxcbn07XG4iLCAiaW1wb3J0IHtcbiAgICBJQ29tcG9uZW50Q29uZmlnLFxuICAgIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZyxcbiAgICBJRGVkaWNhdGVkU2tpbkNvbmZpZyxcbiAgICBJUHJvcENvbmZpZyxcbiAgICBJU2tpbkNvbmZpZyxcbiAgICBJVXNlckZsb3csXG4gICAgUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMsXG4gICAgdjJfSVZhcmlhbnRDb25maWdcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHsgZGVsaXZlcnlTdG9yZSB9IGZyb20gXCIuL2RlbGl2ZXJ5U3RvcmVcIjtcblxuY29uc3QgY29udmVydFYyVmFyaWFudFRvQ29tcG9uZW50Q29uZmlnID0gKGNvbmZpZzogdjJfSVZhcmlhbnRDb25maWcpOiBJQ29tcG9uZW50Q29uZmlnID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbnN0YW5jZToge1xuICAgICAgICAgICAgaWQ6ICdhdXRvJyxcbiAgICAgICAgICAgIGNvbXBvbmVudElkOiBjb25maWcuY29tcG9uZW50SWQsXG4gICAgICAgICAgICBjb21wb25lbnROYW1lOiBjb25maWcubmFtZSxcblxuICAgICAgICAgICAgc2tpblNlbGVjdG9yOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0RlZGljYXRlZCcsXG4gICAgICAgICAgICAgICAgc2tpbjoge1xuICAgICAgICAgICAgICAgICAgICBpZDogJ3NraW5fYXV0b192Ml9jb252ZXJ0ZWQnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZ1xuXG4gICAgICAgIH0gYXMgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBpZDogY29uZmlnLmlkLFxuICAgICAgICAgICAgbmFtZTogY29uZmlnLm5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogY29uZmlnLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgcHJvcHM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnaW5fYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbXlvcF9pbml0X2ludGVyZmFjZScsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhbnknLFxuICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBhcyBJUHJvcENvbmZpZyxcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdvdXRfYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbXlvcF9jdGFfaGFuZGxlcicsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhbnknLFxuICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBhcyBJUHJvcENvbmZpZ1xuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHJlZnM6IFtdLFxuICAgICAgICAgICAgc2tpbnM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnc2tpbl9hdXRvX3YyX2NvbnZlcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdhdXRvX3YyX2NvbnZlcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogaGFuZGxlIGVtcHR5IDpcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBsb2FkZXI6IGNvbmZpZy5jb25zdW1lX3ZhcmlhbnRbMF0ubG9hZGVyXG4gICAgICAgICAgICAgICAgfSBhcyBJU2tpbkNvbmZpZ1xuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGRlZmF1bHRTa2luOiAwXG4gICAgICAgIH0gYXMgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgICAgIG5hbWU6IGNvbmZpZy5uYW1lXG4gICAgfSBhcyBJQ29tcG9uZW50Q29uZmlnO1xufTtcblxuLyoqXG4gKiBDbG91ZFJlcG9zaXRvcnkgLSBVbmlmaWVkIGNsb3VkIGRhdGEgYWNjZXNzIGxheWVyIGZvciBNeW9wIGNvbXBvbmVudHNcbiAqXG4gKiBTdXBwb3J0cyBib3RoIHYyIChkZWZhdWx0KSBhbmQgdjEgbW9kZXM6XG4gKiAtIHYyOiBVc2VzIC9jb25zdW1lIGVuZHBvaW50IGZvciBmZXRjaGluZyB2YXJpYW50c1xuICogLSB2MTogVXNlcyAvZmxvdyBlbmRwb2ludCBmb3IgZmV0Y2hpbmcgdXNlciBmbG93c1xuICovXG4vLyBVc2UgYSBnbG9iYWwgc2luZ2xldG9uIHRvIGVuc3VyZSBvbmx5IG9uZSBDbG91ZFJlcG9zaXRvcnkuTWFpbiBleGlzdHNcbi8vIGV2ZW4gd2hlbiB0aGUgbW9kdWxlIGlzIGxvYWRlZCBtdWx0aXBsZSB0aW1lcyBieSBkaWZmZXJlbnQgYnVuZGxlcnNcbmNvbnN0IEdMT0JBTF9LRVkgPSAnX19NWU9QX0NMT1VEX1JFUE9TSVRPUllfTUFJTl9fJztcblxuY29uc3QgZ2V0R2xvYmFsTWFpbiA9ICgpOiBDbG91ZFJlcG9zaXRvcnkgfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gKHdpbmRvdyBhcyBhbnkpW0dMT0JBTF9LRVldO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiAoZ2xvYmFsVGhpcyBhcyBhbnkpW0dMT0JBTF9LRVldO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuY29uc3Qgc2V0R2xvYmFsTWFpbiA9IChpbnN0YW5jZTogQ2xvdWRSZXBvc2l0b3J5KSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICh3aW5kb3cgYXMgYW55KVtHTE9CQUxfS0VZXSA9IGluc3RhbmNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIChnbG9iYWxUaGlzIGFzIGFueSlbR0xPQkFMX0tFWV0gPSBpbnN0YW5jZTtcbiAgICB9XG59O1xuXG5leHBvcnQgY2xhc3MgQ2xvdWRSZXBvc2l0b3J5IHtcbiAgICBwcml2YXRlIHN0YXRpYyBfbWFpbjogQ2xvdWRSZXBvc2l0b3J5IHwgbnVsbCA9IG51bGw7XG5cbiAgICBzdGF0aWMgZ2V0IE1haW4oKTogQ2xvdWRSZXBvc2l0b3J5IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgYSBnbG9iYWwgaW5zdGFuY2UgYWxyZWFkeSBleGlzdHMgKGZyb20gYW5vdGhlciBidW5kbGUpXG4gICAgICAgIGNvbnN0IGdsb2JhbE1haW4gPSBnZXRHbG9iYWxNYWluKCk7XG4gICAgICAgIGlmIChnbG9iYWxNYWluKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2xvYmFsTWFpbjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSBuZXcgaW5zdGFuY2UgaWYgbmVlZGVkXG4gICAgICAgIGlmICghQ2xvdWRSZXBvc2l0b3J5Ll9tYWluKSB7XG4gICAgICAgICAgICBDbG91ZFJlcG9zaXRvcnkuX21haW4gPSBuZXcgQ2xvdWRSZXBvc2l0b3J5KCk7XG4gICAgICAgICAgICBzZXRHbG9iYWxNYWluKENsb3VkUmVwb3NpdG9yeS5fbWFpbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENsb3VkUmVwb3NpdG9yeS5fbWFpbjtcbiAgICB9XG5cbiAgICAvLyB2MiBjYWNoZSAtIGtleWVkIGJ5IGNvbXBvbmVudElkOmVudjpwcmV2aWV3fGxpdmVcbiAgICAvLyBFYWNoIFByb21pc2UgaXMgdGFnZ2VkIHdpdGggYSBgcmVzb2x2ZWRgIHByb3BlcnR5IGFmdGVyIHNldHRsaW5nIChzZWUgZmV0Y2hDb21wb25lbnRWMikuXG4gICAgcHJpdmF0ZSB2YXJpYW50czogUmVjb3JkPHN0cmluZywgUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnPiAmIHsgcmVzb2x2ZWQ/OiBJQ29tcG9uZW50Q29uZmlnIH0+ID0ge307XG5cbiAgICAvLyBUcmFjayB3aGljaCBjb21wb25lbnRzIHdlcmUgcHJlbG9hZGVkIGFuZCB3aXRoIHdoYXQgcGFyYW1zXG4gICAgLy8gS2V5OiBjb21wb25lbnRJZCwgVmFsdWU6IHsgZW52LCBwcmV2aWV3IH1cbiAgICBwcml2YXRlIHByZWxvYWRlZENvbXBvbmVudHM6IFJlY29yZDxzdHJpbmcsIHsgZW52OiBzdHJpbmc7IHByZXZpZXc6IGJvb2xlYW4gfT4gPSB7fTtcblxuICAgIC8vIHYxIGNhY2hlXG4gICAgcHJpdmF0ZSB1c2VyRmxvd3M6IFJlY29yZDxzdHJpbmcsIFByb21pc2U8SVVzZXJGbG93Pj4gPSB7fTtcblxuICAgIHByaXZhdGUgX2RlZmF1bHRFbnYgPSAncHJvZHVjdGlvbic7XG4gICAgcHJpdmF0ZSBfZW52RXhwbGljaXRseVNldCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX3N0YXRpY01vZGUgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9xdWVyeVBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfYmFzZVVybCA9ICdodHRwczovL2Nsb3VkLm15b3AuZGV2Jykge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhvdyBiaWcgdGhlIGNvbXBvbmVudCB3ZSBhcmUgTk9UIHJlLWRvd25sb2FkaW5nIGlzLiBEZWxpYmVyYXRlbHkgbWVhc3VyZWQgZnJvbSB3aGF0XG4gICAgICogd2UgaG9sZCByYXRoZXIgdGhhbiBmcm9tIENvbnRlbnQtTGVuZ3RoOiBvbmNlIGEgcmVzcG9uc2UgaXMgY29tcHJlc3NlZCB0aGUgaGVhZGVyIGlzXG4gICAgICogbm90IHJlYWRhYmxlIGNyb3NzLW9yaWdpbiwgc28gcmVhZGluZyBpdCB0aGVyZSByZXBvcnRlZCAwIGV2ZXJ5IHNpbmdsZSB0aW1lLlxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIHNpemVPZkhlbGQoZTogYW55KTogbnVtYmVyIHtcbiAgICAgICAgdHJ5IHsgcmV0dXJuIChlPy5jb25maWc/LnR5cGU/LnNraW5zPy5bMF0/LmxvYWRlcj8uSFRNTCB8fCAnJykubGVuZ3RoOyB9IGNhdGNoIHsgcmV0dXJuIDA7IH1cbiAgICB9XG5cbiAgICAvKiogVGhlIGhvc3QgZXZlcnkgcmVxdWVzdCBnb2VzIHRvIHVubGVzcyBkZWxpdmVyeSgpIG1vdmVkIGl0LiBOZXZlciBjaGFuZ2VzLiAqL1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfSE9TVCA9ICdodHRwczovL2Nsb3VkLm15b3AuZGV2JztcblxuICAgIC8qKlxuICAgICAqIE9wdC1pbiBkZWxpdmVyeSBzZXR0aW5ncywgc2V0IGJ5IG15b3AuZGVsaXZlcnkoKS4gT2ZmIG1lYW5zOiB0aGlzIGZpbGUgYmVoYXZlc1xuICAgICAqIEVYQUNUTFkgYXMgaXQgZGlkIGJlZm9yZSBcdTIwMTQgc2FtZSBob3N0LCBzYW1lIFVSTCwgc2FtZSBldmVyeXRoaW5nLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2RlbGl2ZXJ5OiB7IG1pbmlmeTogYm9vbGVhbjsgaG9zdDogc3RyaW5nIHwgbnVsbDsgY2FjaGU6IGJvb2xlYW4gfSA9XG4gICAgICAgIHsgbWluaWZ5OiBmYWxzZSwgaG9zdDogbnVsbCwgY2FjaGU6IGZhbHNlIH07XG5cbiAgICAvKipcbiAgICAgKiBXaGF0IGFjdHVhbGx5IGhhcHBlbmVkLCBmb3IgbXlvcC5kZWxpdmVyeS5zdGF0cygpLiBgZmVsbEJhY2tgIGlzIHRoZSBudW1iZXIgdGhhdFxuICAgICAqIG1hdHRlcnM6IGl0IGlzIGhvdyB5b3UgZmluZCBvdXQgdGhlIGxhbmUgaXMgdW5oZWFsdGh5IHdpdGhvdXQgd2FpdGluZyBmb3IgYVxuICAgICAqIGJ1ZyByZXBvcnQsIGJlY2F1c2UgYSBmYWxsYmFjayBpcyBJTlZJU0lCTEUgdG8gdGhlIHBhZ2UgKGl0IHN0aWxsIHJlbmRlcnMpLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2RlbGl2ZXJ5U3RhdHMgPSB7XG4gICAgICAgIHJlcXVlc3RzOiAwLCB2aWFEZWxpdmVyeTogMCwgZmVsbEJhY2s6IDAsIGxhc3RFcnJvcjogbnVsbCBhcyBzdHJpbmcgfCBudWxsLFxuICAgICAgICAvKiogd2hlcmUgdGhlIGxhc3QgbG9hZHMgd2VyZSBhbnN3ZXJlZCBmcm9tIFx1MjAxNCB0aGUgbnVtYmVyIHRoZSBjbGllbnQgd2luZG93IGV4aXN0cyB0byBtb3ZlICovXG4gICAgICAgIGZyb21NZW1vcnk6IDAsIGZyb21TdG9yYWdlOiAwLCBmcm9tTmV0d29yazogMCxcbiAgICAgICAgLyoqIHJlLWNoZWNrcyBhZnRlciB0aGUgd2luZG93IGVuZGVkLCBhbmQgaG93IG1hbnkgd2VyZSBhbnN3ZXJlZCBcIm5vdGhpbmcgY2hhbmdlZFwiICovXG4gICAgICAgIHJldmFsaWRhdGlvbnM6IDAsIHVuY2hhbmdlZDogMCwgYnl0ZXNTYXZlZDogMCxcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVHVybiBvbiB0aGUgb3B0LWluIGRlbGl2ZXJ5IHBhdGguXG4gICAgICpcbiAgICAgKiBPcHRpbmcgaW4gSVMgY2hvb3NpbmcgdGhlIGRlbGl2ZXJ5IHN0YWNrOiB0aGlzIHBvaW50cyAvY29uc3VtZSBhdCBgaG9zdGAgKGEgc2Vjb25kLFxuICAgICAqIGNvbXBsZXRlIHN0YWNrIHJlYWRpbmcgdGhlIHNhbWUgZGF0YSkgYW5kIGFza3MgZm9yIHRoZSBtaW5pZmllZCBhcnRpZmFjdC4gTGVhdmUgdGhpc1xuICAgICAqIHVuY2FsbGVkIGFuZCBub3RoaW5nIGFib3V0IHRoZSBTREsgY2hhbmdlcy5cbiAgICAgKlxuICAgICAqIERlbGliZXJhdGVseSBtdXRhdGVzIFRISVMgaW5zdGFuY2UgcmF0aGVyIHRoYW4gY29uc3RydWN0aW5nIGEgbmV3IHJlcG9zaXRvcnk6XG4gICAgICogQ2xvdWRSZXBvc2l0b3J5Lk1haW4gaXMgYSBnbG9iYWwgc2luZ2xldG9uIHNoYXJlZCBhY3Jvc3MgYnVuZGxlcyAoc2VlIGdldEdsb2JhbE1haW4pLFxuICAgICAqIHNvIGEgc2Vjb25kIGluc3RhbmNlIHdvdWxkIGJlIGlnbm9yZWQgYnkgZXZlcnkgY29tcG9uZW50IGFscmVhZHkgdXNpbmcgdGhlIGZpcnN0LlxuICAgICAqL1xuICAgIHNldERlbGl2ZXJ5KG9wdHM6IHsgbWluaWZ5PzogYm9vbGVhbjsgaG9zdD86IHN0cmluZyB8IG51bGw7IGNhY2hlPzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICAgICAgaWYgKG9wdHMubWluaWZ5ICE9PSB1bmRlZmluZWQpIHRoaXMuX2RlbGl2ZXJ5Lm1pbmlmeSA9ICEhb3B0cy5taW5pZnk7XG4gICAgICAgIGlmIChvcHRzLmhvc3QgIT09IHVuZGVmaW5lZCkgdGhpcy5fZGVsaXZlcnkuaG9zdCA9IG9wdHMuaG9zdDtcbiAgICAgICAgaWYgKG9wdHMuY2FjaGUgIT09IHVuZGVmaW5lZCkgdGhpcy5fZGVsaXZlcnkuY2FjaGUgPSAhIW9wdHMuY2FjaGU7XG4gICAgfVxuXG4gICAgZGVsaXZlcnlTdGF0cygpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4udGhpcy5fZGVsaXZlcnlTdGF0cywgaG9zdDogdGhpcy5fZGVsaXZlcnkuaG9zdCA/PyBDbG91ZFJlcG9zaXRvcnkuREVGQVVMVF9IT1NULFxuICAgICAgICAgICAgICAgICBtaW5pZnk6IHRoaXMuX2RlbGl2ZXJ5Lm1pbmlmeSwgY2FjaGU6IHRoaXMuX2RlbGl2ZXJ5LmNhY2hlIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9yZ2V0IHdoYXQgdGhpcyBicm93c2VyIGhvbGRzLCBzbyB0aGUgbmV4dCBsb2FkIGFza3MgdGhlIHNlcnZlci5cbiAgICAgKiBgcmVmcmVzaCgpYCB3aXRoIG5vIGlkcyBkcm9wcyBldmVyeXRoaW5nOyB0aGUgY291bnRlcnBhcnQgdG8gdGhlIHdpbmRvdyBmb3IgdGhlIGNhc2VcbiAgICAgKiB3aGVyZSBhIGNoYW5nZSBoYXMgdG8gYmUgdmlzaWJsZSBvbiBUSElTIGxvYWQgXHUyMDE0IHJpZ2h0IGFmdGVyIHNvbWVvbmUgcHVibGlzaGVzLlxuICAgICAqL1xuICAgIGFzeW5jIHJlZnJlc2hEZWxpdmVyeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgZGVsaXZlcnlTdG9yZS5jbGVhcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvY2FsIHNlcnZlcyB3YWl0aW5nIHRvIGJlIHJlcG9ydGVkOiBjb21wb25lbnRJZCAtPiB7ZW52LCBjb3VudH0uXG4gICAgICpcbiAgICAgKiBUSEUgTUVBU1VSRU1FTlQgUFJPQkxFTSBUSElTIFNPTFZFUy4gVGhlIGJldHRlciB0aGlzIGNhY2hlIHdvcmtzLCB0aGUgbW9yZSB1c2FnZVxuICAgICAqIHZhbmlzaGVzOiBhIHZpc2l0b3IgaW5zaWRlIHRoZWlyIGZyZXNobmVzcyB3aW5kb3cgcmVuZGVycyB0aGUgcGFnZSB3aXRoIG5vIHJlcXVlc3QsXG4gICAgICogc28gbmVpdGhlciB0aGUgc2VydmVyIG5vciB0aGUgQ0ROIGNhbiBzZWUgdGhlbS4gTGVmdCBhbG9uZSwgYSBzdWNjZXNzZnVsIHJvbGxvdXRcbiAgICAgKiBsb29rcyBpbiB0aGUgbGVkZ2VyIGV4YWN0bHkgbGlrZSBjdXN0b21lcnMgbGVhdmluZy5cbiAgICAgKlxuICAgICAqIFNvIGxvY2FsIHNlcnZlcyBhcmUgY291bnRlZCBoZXJlIGFuZCByZXBvcnRlZCBhZnRlcndhcmRzLCBiYXRjaGVkLCBvbiBhIHBhdGggdGhhdFxuICAgICAqIG5ldmVyIGJsb2NrcyByZW5kZXJpbmc6IGZsdXNoZWQgd2hlbiB0aGUgcGFnZSBpcyBoaWRkZW4gKGtlZXBhbGl2ZSwgc28gaXQgc3Vydml2ZXNcbiAgICAgKiB0aGUgdGFiIGNsb3NpbmcpIGFuZCBvcHBvcnR1bmlzdGljYWxseSB3aGVuZXZlciB0aGUgU0RLIGlzIHRhbGtpbmcgdG8gdGhlIHNlcnZlclxuICAgICAqIGFueXdheS4gTm90aGluZyBpcyBzZW50IHdoaWxlIHRoZSBwYWdlIGlzIGxvYWRpbmcsIHdoaWNoIGlzIHRoZSBwb2ludCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIHByaXZhdGUgX2xvY2FsU2VydmVzID0gbmV3IE1hcDxzdHJpbmcsIHtlbnY6IHN0cmluZzsgY291bnQ6IG51bWJlcn0+KCk7XG4gICAgcHJpdmF0ZSBfZmx1c2hCb3VuZCA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBub3RlTG9jYWxTZXJ2ZShjb21wb25lbnRJZDogc3RyaW5nLCBlbnY6IHN0cmluZykge1xuICAgICAgICBjb25zdCBjdXIgPSB0aGlzLl9sb2NhbFNlcnZlcy5nZXQoY29tcG9uZW50SWQpO1xuICAgICAgICBpZiAoY3VyKSBjdXIuY291bnQrKztcbiAgICAgICAgZWxzZSB0aGlzLl9sb2NhbFNlcnZlcy5zZXQoY29tcG9uZW50SWQsIHtlbnYsIGNvdW50OiAxfSk7XG4gICAgICAgIHRoaXMuYmluZEZsdXNoKCk7XG4gICAgfVxuXG4gICAgLyoqIFJlcG9ydCBvbiBwYWdlLWhpZGUsIHdoaWNoIGlzIHRoZSBvbmx5IGV2ZW50IHRoYXQgcmVsaWFibHkgZmlyZXMgb24gbW9iaWxlLiAqL1xuICAgIHByaXZhdGUgYmluZEZsdXNoKCkge1xuICAgICAgICBpZiAodGhpcy5fZmx1c2hCb3VuZCB8fCB0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgICAgIHRoaXMuX2ZsdXNoQm91bmQgPSB0cnVlO1xuICAgICAgICBjb25zdCBvbkhpZGUgPSAoKSA9PiB7IGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICdoaWRkZW4nKSB0aGlzLmZsdXNoTG9jYWxTZXJ2ZXMoKTsgfTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIG9uSGlkZSk7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwYWdlaGlkZScsICgpID0+IHRoaXMuZmx1c2hMb2NhbFNlcnZlcygpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZW5kIHdoYXQgd2UgaGF2ZS4gYGtlZXBhbGl2ZWAgaXMgd2hhdCBtYWtlcyB0aGlzIHdvcmsgYXQgcGFnZS1oaWRlOiB0aGUgcmVxdWVzdFxuICAgICAqIG91dGxpdmVzIHRoZSBkb2N1bWVudC4gRmFpbHVyZSBpcyBpZ25vcmVkIFx1MjAxNCBhIGxvc3QgdXNhZ2UgcmVwb3J0IG11c3QgbmV2ZXIgYmVcbiAgICAgKiB2aXNpYmxlIHRvIGEgdmlzaXRvciwgYW5kIHRoZSBuZXh0IHBhZ2UgbG9hZCB3aWxsIHJlcG9ydCBpdHMgb3duLlxuICAgICAqL1xuICAgIGZsdXNoTG9jYWxTZXJ2ZXMoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5fbG9jYWxTZXJ2ZXMuc2l6ZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBiYXRjaCA9IFsuLi50aGlzLl9sb2NhbFNlcnZlcy5lbnRyaWVzKCldXG4gICAgICAgICAgICAubWFwKChbaWQsIHZdKSA9PiBgJHtpZH06JHt2LmVudn06JHt2LmNvdW50fWApLmpvaW4oJywnKTtcbiAgICAgICAgdGhpcy5fbG9jYWxTZXJ2ZXMuY2xlYXIoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZGVsaXZlcnlIb3N0KCl9L2NsaWVudFVzYWdlP2I9JHtlbmNvZGVVUklDb21wb25lbnQoYmF0Y2gpfWA7XG4gICAgICAgICAgICBmZXRjaCh1cmwsIHtrZWVwYWxpdmU6IHRydWUsIG1vZGU6ICdjb3JzJywgY3JlZGVudGlhbHM6ICdvbWl0J30pLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgfSBjYXRjaCB7IC8qIG5ldmVyIHRoZSB2aXNpdG9yJ3MgcHJvYmxlbSAqLyB9XG4gICAgfVxuXG4gICAgLyoqIFdoZXJlIC9jb25zdW1lIHNob3VsZCBiZSBmZXRjaGVkIGZyb20gcmlnaHQgbm93LiAqL1xuICAgIHByaXZhdGUgZGVsaXZlcnlIb3N0KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxpdmVyeS5ob3N0IHx8IHRoaXMuX2Jhc2VVcmw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggYSBkZWxpdmVyeSBVUkwgd2l0aCBPTkUgZmFsbGJhY2sgdG8gdGhlIGRlZmF1bHQgaG9zdC5cbiAgICAgKlxuICAgICAqIFRoZSBmYWxsYmFjayBpcyB0aGUga2lsbCBzd2l0Y2g6IGJyZWFrIG9yIGRpc2FibGUgdGhlIGxhbmUgYW5kIGV2ZXJ5IGNsaWVudCBkcmlmdHNcbiAgICAgKiBiYWNrIHRvIGNsb3VkLm15b3AuZGV2IG9uIGl0cyBvd24sIHdpdGggbm8gY3VzdG9tZXIgZGVwbG95LiBJdCBtdXN0IHRoZXJlZm9yZSBiZVxuICAgICAqIGdlbnVpbmVseSBzaWxlbnQgdG8gdGhlIHBhZ2UgYW5kIGdlbnVpbmVseSBMT1VEIGluIHN0YXRzKCkgXHUyMDE0IGEgZmFsbGJhY2sgdGhhdCBub2JvZHlcbiAgICAgKiBjb3VudHMgaXMgYW4gb3V0YWdlIG5vYm9keSBub3RpY2VzLlxuICAgICAqXG4gICAgICogT25seSB0cmFuc3BvcnQgZmFpbHVyZXMgYW5kIDV4eCBmYWxsIGJhY2suIEEgNDA0IGlzIGFuIGFuc3dlcjogdGhlIGNvbXBvbmVudCByZWFsbHlcbiAgICAgKiBpcyBtaXNzaW5nLCBhbmQgcmV0cnlpbmcgZWxzZXdoZXJlIHdvdWxkIG9ubHkgaGlkZSBpdC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGRlbGl2ZXJ5RmV0Y2gocGF0aDogc3RyaW5nKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgICAgICAvLyBXZSBhcmUgYWJvdXQgdG8gdXNlIHRoZSBuZXR3b3JrIGFueXdheTogYSBnb29kIG1vbWVudCB0byBoYW5kIG92ZXIgd2hhdGV2ZXIgdGhlXG4gICAgICAgIC8vIHdpbmRvdyBzZXJ2ZWQgb2ZmbGluZSwgcmF0aGVyIHRoYW4gd2FpdGluZyBmb3IgdGhlIHBhZ2UgdG8gYmUgY2xvc2VkLlxuICAgICAgICBpZiAodGhpcy5fbG9jYWxTZXJ2ZXMuc2l6ZSkgdGhpcy5mbHVzaExvY2FsU2VydmVzKCk7XG4gICAgICAgIGNvbnN0IGhvc3QgPSB0aGlzLmRlbGl2ZXJ5SG9zdCgpO1xuICAgICAgICBjb25zdCBwcmltYXJ5ID0gYCR7aG9zdH0ke3BhdGh9YDtcbiAgICAgICAgdGhpcy5fZGVsaXZlcnlTdGF0cy5yZXF1ZXN0cysrO1xuICAgICAgICBjb25zdCB1c2luZ0xhbmUgPSBob3N0ICE9PSB0aGlzLl9iYXNlVXJsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2gocHJpbWFyeSk7XG4gICAgICAgICAgICBpZiAocmVzLm9rIHx8IHJlcy5zdGF0dXMgPCA1MDAgfHwgIXVzaW5nTGFuZSkge1xuICAgICAgICAgICAgICAgIGlmICh1c2luZ0xhbmUgJiYgcmVzLm9rKSB0aGlzLl9kZWxpdmVyeVN0YXRzLnZpYURlbGl2ZXJ5Kys7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2RlbGl2ZXJ5U3RhdHMubGFzdEVycm9yID0gYEhUVFAgJHtyZXMuc3RhdHVzfSBmcm9tICR7aG9zdH1gO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGlmICghdXNpbmdMYW5lKSB0aHJvdyBlO1xuICAgICAgICAgICAgdGhpcy5fZGVsaXZlcnlTdGF0cy5sYXN0RXJyb3IgPSBTdHJpbmcoZT8ubWVzc2FnZSA/PyBlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kZWxpdmVyeVN0YXRzLmZlbGxCYWNrKys7XG4gICAgICAgIGNvbnNvbGUud2FybihgW215b3BdIGRlbGl2ZXJ5IGhvc3QgZmFpbGVkICgke3RoaXMuX2RlbGl2ZXJ5U3RhdHMubGFzdEVycm9yfSkgXHUyMDE0IGZhbGxpbmcgYmFjayB0byAke3RoaXMuX2Jhc2VVcmx9YCk7XG4gICAgICAgIHJldHVybiBhd2FpdCBmZXRjaChgJHt0aGlzLl9iYXNlVXJsfSR7cGF0aH1gKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGUgc3RhdGljIG1vZGUgZm9yIHNlbGYtaG9zdGVkIGNvbXBvbmVudCByZWdpc3RyaWVzLlxuICAgICAqIEluIHN0YXRpYyBtb2RlLCBVUkxzIGFyZSBjb25zdHJ1Y3RlZCBhcyBmaWxlIHBhdGhzIGluc3RlYWQgb2YgcXVlcnkgcGFyYW1zOlxuICAgICAqICAgJHtiYXNlVXJsfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9LyR7ZW52fS5qc29uXG4gICAgICovXG4gICAgZW5hYmxlU3RhdGljTW9kZSgpIHtcbiAgICAgICAgdGhpcy5fc3RhdGljTW9kZSA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHF1ZXJ5IHBhcmFtZXRlcnMgdG8gYXBwZW5kIHRvIGFsbCBmZXRjaCBVUkxzIChlLmcuIGZvciBDRE4gY2FjaGUgYnVzdGluZykuXG4gICAgICogRXhhbXBsZTogYHNldFF1ZXJ5UGFyYW1zKHsgbGFzdHVwZGF0ZTogJzExMTEyMDI2JyB9KWBcbiAgICAgKi9cbiAgICBzZXRRdWVyeVBhcmFtcyhwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHtcbiAgICAgICAgdGhpcy5fcXVlcnlQYXJhbXMgPSBwYXJhbXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBkZWZhdWx0IGVudmlyb25tZW50IGZvciB0aGlzIENsb3VkUmVwb3NpdG9yeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHNldEVudmlyb25tZW50KGVudjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRFbnYgPSBlbnY7XG4gICAgICAgIHRoaXMuX2VudkV4cGxpY2l0bHlTZXQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCBkZWZhdWx0IGVudmlyb25tZW50XG4gICAgICovXG4gICAgZ2V0RGVmYXVsdEVudmlyb25tZW50KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0RW52O1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PSBWMiBNZXRob2RzIChEZWZhdWx0KSA9PT09PT09PT09PT1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgY29tcG9uZW50IGlzIGFscmVhZHkgY2FjaGVkL3ByZWxvYWRlZCAodjIpXG4gICAgICogSWYgZW52IGFuZCBwcmV2aWV3IGFyZSBub3QgcHJvdmlkZWQsIGNoZWNrcyBpZiBBTlkgdmVyc2lvbiBpcyBwcmVsb2FkZWRcbiAgICAgKi9cbiAgICBpc1ByZWxvYWRlZChjb21wb25lbnRJZDogc3RyaW5nLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIElmIHNwZWNpZmljIGVudi9wcmV2aWV3IHJlcXVlc3RlZCwgY2hlY2sgZXhhY3QgbWF0Y2hcbiAgICAgICAgaWYgKGVudiAhPT0gdW5kZWZpbmVkIHx8IHByZXZpZXcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBgJHtjb21wb25lbnRJZH06JHtlbnYgfHwgdGhpcy5fZGVmYXVsdEVudn06JHtwcmV2aWV3ID8gJ3ByZXZpZXcnIDogJ2xpdmUnfWA7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVLZXkgaW4gdGhpcy52YXJpYW50cztcbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlcndpc2UgY2hlY2sgaWYgYW55IHZlcnNpb24gd2FzIHByZWxvYWRlZFxuICAgICAgICByZXR1cm4gY29tcG9uZW50SWQgaW4gdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcHJlbG9hZGVkIHBhcmFtcyBmb3IgYSBjb21wb25lbnQgKGlmIHByZWxvYWRlZClcbiAgICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBub3QgcHJlbG9hZGVkXG4gICAgICovXG4gICAgZ2V0UHJlbG9hZGVkUGFyYW1zKGNvbXBvbmVudElkOiBzdHJpbmcpOiB7IGVudjogc3RyaW5nOyBwcmV2aWV3OiBib29sZWFuIH0gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIGEgY29tcG9uZW50IGNvbmZpZzogZmV0Y2ggaXQgb25jZSwgdGhlbiBzZXJ2ZSBpdCBmcm9tIHRoaXNcbiAgICAgKiByZXBvc2l0b3J5J3MgY2FjaGUuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHRoZSBuYW1lIHRvIHVzZS4gYGZldGNoQ29tcG9uZW50VjJgIGlzIHRoZSBzYW1lIG1ldGhvZCB1bmRlciBpdHNcbiAgICAgKiB2ZXJzaW9uZWQgbmFtZSBhbmQgc3RheXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgXHUyMDE0IG5vdGUgdGhhdCB0aGVcbiAgICAgKiB1bnZlcnNpb25lZCBgZmV0Y2hDb21wb25lbnRgIGlzIGEgKmRlcHJlY2F0ZWQgdjEqIEFQSSBhbmQgaXMgTk9UIHRoaXMuXG4gICAgICpcbiAgICAgKiBDb21wbGV0ZXMgdGhlIHRyaW8gd2l0aCB7QGxpbmsgZ2V0UmVzb2x2ZWRDb25maWd9IChzeW5jaHJvbm91cyByZWFkIG9mIGFuXG4gICAgICogYWxyZWFkeS1yZXNvbHZlZCBjb25maWcpIGFuZCB7QGxpbmsgaHlkcmF0ZUNvbXBvbmVudH0gKHNlZWQgb25lIHlvdVxuICAgICAqIGFscmVhZHkgaG9sZCkuXG4gICAgICpcbiAgICAgKiBQcmVmZXIgdGhlIG1vZHVsZS1sZXZlbCBgcHJlbG9hZENvbXBvbmVudHMoW2lkXSlgIGluIGFwcCBjb2RlOyByZWFjaCBmb3JcbiAgICAgKiB0aGlzIHdoZW4geW91IG5lZWQgYW4gaXNvbGF0ZWQgcmVwb3NpdG9yeSBpbnN0YW5jZSB3aG9zZSBjYWNoZSBsaWZldGltZVxuICAgICAqIHlvdSBjb250cm9sIFx1MjAxNCBhIHNlcnZlciB3aXRoIGl0cyBvd24gVFRMLCBmb3IgZXhhbXBsZS5cbiAgICAgKi9cbiAgICBhc3luYyByZXNvbHZlQ29tcG9uZW50KGNvbXBvbmVudElkOiBzdHJpbmcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBQcm9taXNlPElDb21wb25lbnRDb25maWc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hDb21wb25lbnRWMihjb21wb25lbnRJZCwgZW52LCBwcmV2aWV3KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhIHYyIGNvbXBvbmVudCBjb25maWdcbiAgICAgKiBJZiBlbnYvcHJldmlldyBub3Qgc3BlY2lmaWVkIGFuZCBjb21wb25lbnQgd2FzIHByZWxvYWRlZCwgdXNlcyBwcmVsb2FkZWQgcGFyYW1zXG4gICAgICpcbiAgICAgKiBAc2VlIHJlc29sdmVDb21wb25lbnQgXHUyMDE0IHRoZSB1bnZlcnNpb25lZCBuYW1lIGZvciB0aGlzIG1ldGhvZFxuICAgICAqL1xuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50VjIoY29tcG9uZW50SWQ6IHN0cmluZywgZW52aXJvbm1lbnRJZGVudGlmaWVyPzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IFByb21pc2U8SUNvbXBvbmVudENvbmZpZz4ge1xuICAgICAgICBjb25zdCB7IGVudiwgdXNlUHJldmlldywgY2FjaGVLZXkgfSA9IHRoaXMucmVzb2x2ZVBhcmFtcyhjb21wb25lbnRJZCwgZW52aXJvbm1lbnRJZGVudGlmaWVyLCBwcmV2aWV3KTtcblxuICAgICAgICBjb25zb2xlLmxvZygnW0Nsb3VkUmVwb3NpdG9yeV0gZmV0Y2hDb21wb25lbnRWMicsIHtcbiAgICAgICAgICAgIGNvbXBvbmVudElkOiBjb21wb25lbnRJZC5zbGljZSgwLCA4KSArICcuLi4nLFxuICAgICAgICAgICAgZW52LFxuICAgICAgICAgICAgdXNlUHJldmlldyxcbiAgICAgICAgICAgIGNhY2hlS2V5LFxuICAgICAgICAgICAgY2FjaGVkOiBjYWNoZUtleSBpbiB0aGlzLnZhcmlhbnRzXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghdGhpcy52YXJpYW50c1tjYWNoZUtleV0pIHtcbiAgICAgICAgICAgIC8vIFRyYWNrIHRoaXMgYXMgcHJlbG9hZGVkIChmaXJzdCBmZXRjaCBjb3VudHMgYXMgcHJlbG9hZClcbiAgICAgICAgICAgIGlmICghdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXSkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJlbG9hZGVkQ29tcG9uZW50c1tjb21wb25lbnRJZF0gPSB7IGVudiwgcHJldmlldzogdXNlUHJldmlldyB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICAgICAgdGhpcy52YXJpYW50c1tjYWNoZUtleV0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RhdGljTW9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSB1c2VQcmV2aWV3ID8gJ3ByZXZpZXcnIDogZW52O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IGAke3RoaXMuX2Jhc2VVcmx9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vJHtmaWxlfS5qc29uYDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXModGhpcy5fcXVlcnlQYXJhbXMpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHFzKSB1cmwgKz0gYD8ke3FzfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IGAvY29uc3VtZT9pZD0ke2NvbXBvbmVudElkfSZlbnY9JHtlbnZ9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlUHJldmlldykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJyZwcmV2aWV3PXRydWUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHByZXZpZXcgaXMgbmV2ZXIgbWluaWZpZWQ6IHRoZSBhcnRpZmFjdCBpcyBidWlsdCBmcm9tIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbGVhc2VkIHZhcmlhbnQsIGFuZCBhbiBhdXRob3IgbXVzdCBzZWUgdGhlaXIgb3duIGVkaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2RlbGl2ZXJ5Lm1pbmlmeSAmJiAhdXNlUHJldmlldykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJyZvcHQ9bWluJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0tLS0gdGhlIGNsaWVudCB3aW5kb3cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBwcmV2aWV3IGlzIG5ldmVyIGhlbGQ6IGFuIGF1dGhvciBoYXMgdG8gc2VlIHRoZWlyIG93biBlZGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FjaGVhYmxlID0gdGhpcy5fZGVsaXZlcnkuY2FjaGUgJiYgIXRoaXMuX3N0YXRpY01vZGUgJiYgIXVzZVByZXZpZXc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdG9yZUtleSA9IGNhY2hlYWJsZSA/IGRlbGl2ZXJ5U3RvcmUua2V5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsaXZlcnlIb3N0KCksIGNvbXBvbmVudElkLCBlbnYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlUHJldmlldywgdGhpcy5fZGVsaXZlcnkubWluaWZ5ID8gJ21pbicgOiAncmF3JykgOiAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZWxkID0gY2FjaGVhYmxlID8gYXdhaXQgZGVsaXZlcnlTdG9yZS5nZXQoc3RvcmVLZXkpIDogbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlbGQgJiYgZGVsaXZlcnlTdG9yZS5mcmVzaChoZWxkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2lkZSB0aGUgd2luZG93OiBubyByZXF1ZXN0IGF0IGFsbC4gQ291bnRlZCBsb2NhbGx5IGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcG9ydGVkIGxhdGVyLCBvciB0aGlzIHZpc2l0IGlzIGludmlzaWJsZSB0byB0aGUgbGVkZ2VyLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlbGl2ZXJ5U3RhdHMuZnJvbVN0b3JhZ2UrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGVMb2NhbFNlcnZlKGNvbXBvbmVudElkLCBlbnYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XSBhcyBhbnkpLnJlc29sdmVkID0gaGVsZC5jb25maWc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShoZWxkLmNvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGVsZCAmJiBoZWxkLnRhZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB3aW5kb3cgZW5kZWQuIFNlbmQgYmFjayB0aGUgdmVyc2lvbiB3ZSBob2xkIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtZG93bmxvYWRpbmc6IHRoZSBhbnN3ZXIgaXMgdXN1YWxseSBhIGZldyBodW5kcmVkIGJ5dGVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IHRoZSBgaWRzPWAvYGhhdmU9YCByb3V0ZSBhbmQgTk9UIElmLU5vbmUtTWF0Y2g6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSByZXF1ZXN0IGhlYWRlciB0cmlnZ2VycyBhIENPUlMgcHJlZmxpZ2h0LCB0aGVyZSBpcyBubyBPUFRJT05TXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcm91dGUsIGFuZCBpdCBmYWlscyBpbiBhIGJyb3dzZXIgd2hpbGUgd29ya2luZyBwZXJmZWN0bHkgaW4gY3VybC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdmFsaWRhdG9yIHRyYXZlbHMgaW4gdGhlIHF1ZXJ5IHN0cmluZywgc28gaXQgaXMgYSBwbGFpbiBHRVQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tVcmwgPSBgL2NvbnN1bWU/aWRzPSR7Y29tcG9uZW50SWR9JmVudj0ke2Vudn1gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuX2RlbGl2ZXJ5Lm1pbmlmeSA/ICcmb3B0PW1pbicgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJmhhdmU9JHtlbmNvZGVVUklDb21wb25lbnQoaGVsZC50YWcpfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVsaXZlcnlTdGF0cy5yZXZhbGlkYXRpb25zKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2sgPSBhd2FpdCB0aGlzLmRlbGl2ZXJ5RmV0Y2goY2hlY2tVcmwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2sub2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCBjaGVjay5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGJvZHkudW5jaGFuZ2VkIHx8IFtdKS5pbmNsdWRlcyhjb21wb25lbnRJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWxpdmVyeVN0YXRzLnVuY2hhbmdlZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlbGl2ZXJ5U3RhdHMuYnl0ZXNTYXZlZCArPSBDbG91ZFJlcG9zaXRvcnkuc2l6ZU9mSGVsZChoZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxkLnN0b3JlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxkLndpbmRvd01zID0gZGVsaXZlcnlTdG9yZS53aW5kb3dGcm9tKGNoZWNrLmhlYWRlcnMpIHx8IGhlbGQud2luZG93TXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGVsaXZlcnlTdG9yZS5wdXQoaGVsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMudmFyaWFudHNbY2FjaGVLZXldIGFzIGFueSkucmVzb2x2ZWQgPSBoZWxkLmNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGhlbGQuY29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCBjaGFuZ2VkLiBUaGUgYW5zd2VyIGFscmVhZHkgY2FycmllcyB0aGUgbmV3IGJ5dGVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IChib2R5Lml0ZW1zIHx8IFtdKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2ZnID0gY29udmVydFYyVmFyaWFudFRvQ29tcG9uZW50Q29uZmlnKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlbGl2ZXJ5U3RhdHMuZnJvbU5ldHdvcmsrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBkZWxpdmVyeVN0b3JlLnB1dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogc3RvcmVLZXksIGNvbmZpZzogY2ZnLCB0YWc6IGl0ZW0udGFnIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dNczogZGVsaXZlcnlTdG9yZS53aW5kb3dGcm9tKGNoZWNrLmhlYWRlcnMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0OiB0aGlzLmRlbGl2ZXJ5SG9zdCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgYW55KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy52YXJpYW50c1tjYWNoZUtleV0gYXMgYW55KS5yZXNvbHZlZCA9IGNmZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNmZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgZmFpbGVkIHJlLWNoZWNrIG11c3Qgbm90IGZhaWwgdGhlIHBhZ2U6IGZhbGwgdGhyb3VnaCB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb3JkaW5hcnkgZmV0Y2ggYmVsb3cuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSB0aGlzLl9zdGF0aWNNb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCBmZXRjaCh1cmwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhd2FpdCB0aGlzLmRlbGl2ZXJ5RmV0Y2godXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgY29tcG9uZW50IFwiJHtjb21wb25lbnRJZH1cIiAoJHtyZXMuc3RhdHVzfSR7dGhpcy5fc3RhdGljTW9kZSA/IGAgZnJvbSAke3VybH1gIDogJyd9KWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhbnQgPSBqc29uLml0ZW07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENvbXBvbmVudCBcIiR7Y29tcG9uZW50SWR9XCIgbm90IGZvdW5kYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YXJpYW50LmNvbnN1bWVfdmFyaWFudCB8fCAhdmFyaWFudC5jb25zdW1lX3ZhcmlhbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ29tcG9uZW50IFwiJHtjb21wb25lbnRJZH1cIiBoYXMgbm8gaW1wbGVtZW50YXRpb24gZm9yIGVudmlyb25tZW50IFwiJHtlbnZ9XCJgKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRDb25maWcgPSBjb252ZXJ0VjJWYXJpYW50VG9Db21wb25lbnRDb25maWcodmFyaWFudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWxpdmVyeVN0YXRzLmZyb21OZXR3b3JrKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSG9sZCBpdCBmb3IgZXhhY3RseSBhcyBsb25nIGFzIHRoZSBzZXJ2ZXIgc2FpZCwgbWludXMgd2hhdCBhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0ROIGFscmVhZHkgc3BlbnQgKGRlbGl2ZXJ5U3RvcmUud2luZG93RnJvbSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGVsaXZlcnlTdG9yZS5wdXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHN0b3JlS2V5LCBjb25maWc6IGNvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnOiAodmFyaWFudCBhcyBhbnkpLnRhZyB8fCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93TXM6IGRlbGl2ZXJ5U3RvcmUud2luZG93RnJvbShyZXMuaGVhZGVycyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3Q6IHRoaXMuZGVsaXZlcnlIb3N0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBhbnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGFnIHRoZSBQcm9taXNlIHNvIGdldFJlc29sdmVkQ29uZmlnIGNhbiByZWFkIGl0IHN5bmNocm9ub3VzbHlcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XSBhcyBhbnkpLnJlc29sdmVkID0gY29tcG9uZW50Q29uZmlnO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjb21wb25lbnRDb25maWcpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgY2FjaGVkIHJlamVjdGVkIHByb21pc2Ugc28gdGhlIG5leHQgY2FsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZXMgYSBmcmVzaCByZXF1ZXN0IChlLmcuIGFmdGVyIG5ldHdvcmsgcmVjb3ZlcnkpXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy52YXJpYW50c1tjYWNoZUtleV07XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudmFyaWFudHNbY2FjaGVLZXldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN5bmNocm9ub3VzIHZlcnNpb24gb2YgZmV0Y2hDb21wb25lbnRWMiBcdTIwMTQgcmV0dXJucyB0aGUgY29uZmlnIG9ubHkgaWZcbiAgICAgKiB0aGUgZmV0Y2ggYWxyZWFkeSBjb21wbGV0ZWQsIG51bGwgb3RoZXJ3aXNlLlxuICAgICAqXG4gICAgICogVXNlcyB0aGUgc2FtZSBgdGhpcy52YXJpYW50c2AgY2FjaGUgdGhhdCBmZXRjaENvbXBvbmVudFYyL3ByZWxvYWRDb21wb25lbnRzXG4gICAgICogcG9wdWxhdGUuIEVhY2ggY2FjaGVkIFByb21pc2UgaXMgdGFnZ2VkIHdpdGggYSBgLnJlc29sdmVkYCBwcm9wZXJ0eSB3aGVuXG4gICAgICogaXQgc2V0dGxlcyBcdTIwMTQgdGhpcyBtZXRob2QganVzdCByZWFkcyB0aGF0IHByb3BlcnR5LiBObyBzZXBhcmF0ZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIFdoeSB0aGlzIGV4aXN0czogUmVhY3QgTmF0aXZlIG5lZWRzIHRoZSBjb25maWcgYXQgcmVuZGVyIHRpbWUgdG8gZW1iZWQgaXRcbiAgICAgKiBpbiB0aGUgV2ViVmlldyBIVE1MIChjYW4ndCBhd2FpdCBpbiB1c2VTdGF0ZSkuIElmIHByZWxvYWRDb21wb25lbnRzIHJhblxuICAgICAqIGVhcmxpZXIgYW5kIHRoZSBmZXRjaCBjb21wbGV0ZWQsIHRoaXMgcmV0dXJucyB0aGUgcmVzdWx0IHN5bmNocm9ub3VzbHksXG4gICAgICogc2tpcHBpbmcgdGhlIFdFQlZJRVdfUkVBRFkgXHUyMTkyIGZldGNoIFx1MjE5MiBpbmplY3Qgcm91bmQgdHJpcCBlbnRpcmVseS5cbiAgICAgKi9cbiAgICBnZXRSZXNvbHZlZENvbmZpZyhjb21wb25lbnRJZDogc3RyaW5nLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogSUNvbXBvbmVudENvbmZpZyB8IG51bGwge1xuICAgICAgICBjb25zdCB7IGNhY2hlS2V5IH0gPSB0aGlzLnJlc29sdmVQYXJhbXMoY29tcG9uZW50SWQsIGVudiwgcHJldmlldyk7XG4gICAgICAgIHJldHVybiB0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XT8ucmVzb2x2ZWQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIHdoaWNoIChlbnYsIHByZXZpZXcpIHBhaXIgXHUyMDE0IGFuZCB0aGVyZWZvcmUgd2hpY2ggY2FjaGUga2V5IFx1MjAxNCBhIGNhbGxcbiAgICAgKiBmb3IgYGNvbXBvbmVudElkYCByZWZlcnMgdG8uXG4gICAgICpcbiAgICAgKiBTaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciBmZXRjaENvbXBvbmVudFYyLCBnZXRSZXNvbHZlZENvbmZpZyBhbmRcbiAgICAgKiBoeWRyYXRlQ29tcG9uZW50LCBzbyBhIGh5ZHJhdGVkIGNvbmZpZyBhbHdheXMgbGFuZHMgb24gdGhlIGtleSBhIGxhdGVyXG4gICAgICogZmV0Y2ggd2lsbCBsb29rIHVuZGVyLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVzb2x2ZVBhcmFtcyhjb21wb25lbnRJZDogc3RyaW5nLCBlbnZpcm9ubWVudElkZW50aWZpZXI/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKSB7XG4gICAgICAgIC8vIElmIG5vIGV4cGxpY2l0IGVudi9wcmV2aWV3IGFuZCBjb21wb25lbnQgd2FzIHByZWxvYWRlZCwgdXNlIHByZWxvYWRlZCBwYXJhbXNcbiAgICAgICAgY29uc3QgcHJlbG9hZGVkID0gdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXTtcbiAgICAgICAgY29uc3QgaGFzRXhwbGljaXRQYXJhbXMgPSBlbnZpcm9ubWVudElkZW50aWZpZXIgIT09IHVuZGVmaW5lZCB8fCBwcmV2aWV3ICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IGVudjogc3RyaW5nO1xuICAgICAgICBsZXQgdXNlUHJldmlldzogYm9vbGVhbjtcblxuICAgICAgICBpZiAoIWhhc0V4cGxpY2l0UGFyYW1zICYmIHByZWxvYWRlZCkge1xuICAgICAgICAgICAgLy8gVXNlIHByZWxvYWRlZCBwYXJhbXNcbiAgICAgICAgICAgIGVudiA9IHByZWxvYWRlZC5lbnY7XG4gICAgICAgICAgICB1c2VQcmV2aWV3ID0gcHJlbG9hZGVkLnByZXZpZXc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBVc2UgcHJvdmlkZWQgcGFyYW1zIG9yIGRlZmF1bHRzXG4gICAgICAgICAgICBlbnYgPSBlbnZpcm9ubWVudElkZW50aWZpZXIgfHwgdGhpcy5fZGVmYXVsdEVudjtcbiAgICAgICAgICAgIC8vIElmIHByZXZpZXcgZXhwbGljaXRseSB0cnVlIFx1MjE5MiB0cnVlXG4gICAgICAgICAgICAvLyBJZiBwcmV2aWV3IGV4cGxpY2l0bHkgZmFsc2UgXHUyMTkyIGZhbHNlXG4gICAgICAgICAgICAvLyBJZiBwcmV2aWV3IHVuZGVmaW5lZDogZW52IHdhcyBzcGVjaWZpZWQgKHZpYSBwYXJhbSBvciBzZXRFbnZpcm9ubWVudCkgXHUyMTkyIGZhbHNlLCBvdGhlcndpc2UgXHUyMTkyIHRydWVcbiAgICAgICAgICAgIGNvbnN0IGhhc0VmZmVjdGl2ZUVudiA9IGVudmlyb25tZW50SWRlbnRpZmllciB8fCB0aGlzLl9lbnZFeHBsaWNpdGx5U2V0O1xuICAgICAgICAgICAgdXNlUHJldmlldyA9IHByZXZpZXcgPT09IHRydWUgPyB0cnVlIDogKHByZXZpZXcgPT09IGZhbHNlID8gZmFsc2UgOiAhaGFzRWZmZWN0aXZlRW52KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGVudiwgdXNlUHJldmlldywgY2FjaGVLZXk6IGAke2NvbXBvbmVudElkfToke2Vudn06JHt1c2VQcmV2aWV3ID8gJ3ByZXZpZXcnIDogJ2xpdmUnfWAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWVkIGFuIGFscmVhZHktcmVzb2x2ZWQgY29tcG9uZW50IGNvbmZpZyBpbnRvIHRoZSBjYWNoZSwgd2l0aG91dCBhbnlcbiAgICAgKiBuZXR3b3JrIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBUaGUgY291bnRlcnBhcnQgdG8ge0BsaW5rIGZldGNoQ29tcG9uZW50VjJ9OiB1c2UgaXQgd2hlbiB0aGUgY29uZmlnIHdhc1xuICAgICAqIHJlc29sdmVkIHNvbWV3aGVyZSBlbHNlIFx1MjAxNCBtb3N0IG9mdGVuIG9uIGEgc2VydmVyLCB0aGVuIGVtYmVkZGVkIGluIHRoZVxuICAgICAqIHBhZ2UgXHUyMDE0IHNvIHRoZSBicm93c2VyIGNhbiByZW5kZXIgdGhlIGNvbXBvbmVudCB3aXRoIG5vIHJvdW5kIHRyaXAuXG4gICAgICpcbiAgICAgKiBBZnRlciBoeWRyYXRpbmcsIGBmZXRjaENvbXBvbmVudFYyYCwgYGdldFJlc29sdmVkQ29uZmlnYCBhbmQgYGlzUHJlbG9hZGVkYFxuICAgICAqIGFsbCBhbnN3ZXIgZm9yIHRoaXMgY29tcG9uZW50IGZyb20gbWVtb3J5LlxuICAgICAqXG4gICAgICogUGFzcyB0aGUgc2FtZSBgZW52YCAvIGBwcmV2aWV3YCB0aGUgY29uZmlnIHdhcyByZXNvbHZlZCB3aXRoOyB0aGUgZGVmYXVsdHNcbiAgICAgKiBtYXRjaCB3aGF0IGEgcGxhaW4gYGZldGNoQ29tcG9uZW50VjIoY29tcG9uZW50SWQpYCB3b3VsZCBoYXZlIHVzZWQuXG4gICAgICovXG4gICAgaHlkcmF0ZUNvbXBvbmVudChjb21wb25lbnRJZDogc3RyaW5nLCBjb25maWc6IElDb21wb25lbnRDb25maWcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyBlbnY6IHJlc29sdmVkRW52LCB1c2VQcmV2aWV3LCBjYWNoZUtleSB9ID0gdGhpcy5yZXNvbHZlUGFyYW1zKGNvbXBvbmVudElkLCBlbnYsIHByZXZpZXcpO1xuXG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoY29uZmlnKSBhcyBQcm9taXNlPElDb21wb25lbnRDb25maWc+ICYgeyByZXNvbHZlZD86IElDb21wb25lbnRDb25maWcgfTtcbiAgICAgICAgLy8gVGFnIGl0IHRoZSBzYW1lIHdheSBmZXRjaENvbXBvbmVudFYyIGRvZXMsIHNvIGdldFJlc29sdmVkQ29uZmlnIGNhblxuICAgICAgICAvLyByZWFkIGl0IHN5bmNocm9ub3VzbHkuXG4gICAgICAgIHByb21pc2UucmVzb2x2ZWQgPSBjb25maWc7XG5cbiAgICAgICAgdGhpcy52YXJpYW50c1tjYWNoZUtleV0gPSBwcm9taXNlO1xuICAgICAgICB0aGlzLnByZWxvYWRlZENvbXBvbmVudHNbY29tcG9uZW50SWRdID0geyBlbnY6IHJlc29sdmVkRW52LCBwcmV2aWV3OiB1c2VQcmV2aWV3IH07XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09IFYxIE1ldGhvZHMgKExlZ2FjeSkgPT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhIHYxIGNvbXBvbmVudCBmcm9tIGEgZmxvd1xuICAgICAqL1xuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50VjEoY29tcG9uZW50SWQ6IHN0cmluZywgZmxvd0lkPzogc3RyaW5nKSB7XG4gICAgICAgIGlmIChmbG93SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCB0aGlzLmZldGNoRmxvdyhmbG93SWQpO1xuICAgICAgICAgICAgcmV0dXJuIGZsb3cuY29tcG9uZW50cy5maW5kKGMgPT4gYy50eXBlLmlkID09PSBjb21wb25lbnRJZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBmbG93ID0gYXdhaXQgdGhpcy5mZXRjaEF1dG9GbG93KGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgIHJldHVybiBmbG93LmNvbXBvbmVudHNbMF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBmZXRjaEF1dG9GbG93KGNvbXBvbmVudElkOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF0pIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLl9iYXNlVXJsfS9mbG93P2lkPSR7Y29tcG9uZW50SWR9JmF1dG89dHJ1ZWBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoanNvbi5pdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdO1xuICAgIH1cblxuICAgIGFzeW5jIGZldGNoRmxvdyhmbG93SWQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMudXNlckZsb3dzW2Zsb3dJZF0pIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnVzZXJGbG93c1tmbG93SWRdID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5fYmFzZVVybH0vZmxvdz9pZD0ke2Zsb3dJZH0mcmVzb2x2ZT1jb21wb25lbnRzYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShqc29uLml0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy51c2VyRmxvd3NbZmxvd0lkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51c2VyRmxvd3NbZmxvd0lkXTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT0gQmFja3dhcmQgQ29tcGF0aWJpbGl0eSA9PT09PT09PT09PT1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBmZXRjaENvbXBvbmVudFYyIG9yIGZldGNoQ29tcG9uZW50VjEgZXhwbGljaXRseVxuICAgICAqIERlZmF1bHRzIHRvIHYxIGJlaGF2aW9yIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgY29kZVxuICAgICAqL1xuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50KGNvbXBvbmVudElkOiBzdHJpbmcsIGZsb3dJZD86IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaENvbXBvbmVudFYxKGNvbXBvbmVudElkLCBmbG93SWQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgQ2xvdWRSZXBvc2l0b3J5IGluc3RlYWRcbiAqL1xuZXhwb3J0IGNvbnN0IHYyX0Nsb3VkUmVwb3NpdG9yeSA9IENsb3VkUmVwb3NpdG9yeTtcbiIsICJpbXBvcnQgeyBDbG91ZFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9DbG91ZFJlcG9zaXRvcnlcIjtcbmltcG9ydCB7IElDb21wb25lbnRDb25maWcgfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmxldCBfY2xvdWRSZXBvc2l0b3J5ID0gQ2xvdWRSZXBvc2l0b3J5Lk1haW47XG5cbmV4cG9ydCBjb25zdCBnZXRDbG91ZFJlcG9zaXRvcnkgPSAoKSA9PiBfY2xvdWRSZXBvc2l0b3J5O1xuXG5leHBvcnQgY29uc3QgaXNQcmVsb2FkZWQgPSAoY29tcG9uZW50SWQ6IHN0cmluZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IGJvb2xlYW4gPT4ge1xuICAgIHJldHVybiBfY2xvdWRSZXBvc2l0b3J5LmlzUHJlbG9hZGVkKGNvbXBvbmVudElkLCBlbnYsIHByZXZpZXcpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFByZWxvYWRlZFBhcmFtcyA9IChjb21wb25lbnRJZDogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIF9jbG91ZFJlcG9zaXRvcnkuZ2V0UHJlbG9hZGVkUGFyYW1zKGNvbXBvbmVudElkKTtcbn07XG5cbmV4cG9ydCBjb25zdCBlbmFibGVMb2NhbERldiA9ICgpID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5ID0gbmV3IENsb3VkUmVwb3NpdG9yeShcImh0dHA6Ly9sb2NhbGhvc3Q6OTI5MlwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRDbG91ZFJlcG9zaXRvcnlVcmwgPSAodXJsOiBzdHJpbmcpID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5ID0gbmV3IENsb3VkUmVwb3NpdG9yeSh1cmwpO1xufTtcblxuLyoqXG4gKiBDb25maWd1cmUgdGhlIFNESyB0byBmZXRjaCBjb21wb25lbnRzIGZyb20gYSBzZWxmLWhvc3RlZCBzdGF0aWMgcmVnaXN0cnkgKFMzLCBDRE4sIGV0Yy4pXG4gKiBpbnN0ZWFkIG9mIHRoZSBNeW9wIGNsb3VkLiBDb21wb25lbnRzIGFyZSBzZXJ2ZWQgYXMgc3RhdGljIEpTT04gZmlsZXM6XG4gKiAgIGAke2NkblVybH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS8ke2Vudmlyb25tZW50fS5qc29uYFxuICovXG5leHBvcnQgY29uc3QgZW5hYmxlU2VsZkhvc3RlZCA9IChjZG5Vcmw6IHN0cmluZywgcXVlcnlQYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeSA9IG5ldyBDbG91ZFJlcG9zaXRvcnkoY2RuVXJsKTtcbiAgICBfY2xvdWRSZXBvc2l0b3J5LmVuYWJsZVN0YXRpY01vZGUoKTtcbiAgICBpZiAocXVlcnlQYXJhbXMpIHtcbiAgICAgICAgX2Nsb3VkUmVwb3NpdG9yeS5zZXRRdWVyeVBhcmFtcyhxdWVyeVBhcmFtcyk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBUSEUgT1BULUlOLiBPbmUgY2FsbCwgYW5kIG5vdGhpbmcgY2hhbmdlcyBmb3IgYW55b25lIHdobyBkb2VzIG5vdCBtYWtlIGl0LlxuICpcbiAqICAgbXlvcC5kZWxpdmVyeSh7IG1pbmlmeTogdHJ1ZSB9KTtcbiAqXG4gKiBPcHRpbmcgaW4gSVMgY2hvb3NpbmcgdGhlIGRlbGl2ZXJ5IGxhbmU6IGEgc2Vjb25kLCBjb21wbGV0ZSBNeW9wIHN0YWNrIChpdHMgb3duIHNlcnZlclxuICogYW5kIENETikgcmVhZGluZyB0aGUgc2FtZSBjb21wb25lbnQgZGF0YS4gU28gdGhpcyBjYWxsIGRvZXMgdHdvIHRoaW5ncyBhdCBvbmNlIFx1MjAxNCBpdFxuICogcG9pbnRzIGAvY29uc3VtZWAgYXQgdGhhdCBzdGFjayBhbmQgYXNrcyBpdCBmb3IgdGhlIG1pbmlmaWVkIGFydGlmYWN0IFx1MjAxNCB3aGljaCBpcyB3aHlcbiAqIHR1cm5pbmcgdGhlIGZlYXR1cmUgb2ZmIGlzIGEgY29uZmlnIHZhbHVlIG9uIG91ciBzaWRlIG9yIG9uZSBsaW5lIG9uIHlvdXJzLCBhbmQgbmV2ZXJcbiAqIGEgRE5TIGNoYW5nZS5cbiAqXG4gKiBTYWZldHkgcHJvcGVydGllcywgYWxsIGRlbGliZXJhdGU6XG4gKiAgIC0gSWYgdGhlIGxhbmUgZmFpbHMgKHRyYW5zcG9ydCBlcnJvciBvciA1eHgpLCB0aGUgU0RLIHJldHJpZXMgT05DRSBhZ2FpbnN0XG4gKiAgICAgY2xvdWQubXlvcC5kZXYgYW5kIHRoZSBwYWdlIHJlbmRlcnMgYW55d2F5LiBgZGVsaXZlcnkuc3RhdHMoKS5mZWxsQmFja2AgY291bnRzIGl0LlxuICogICAtIGBjYWNoZTogdHJ1ZWAgYWRkcyB0aGUgY2xpZW50IHdpbmRvdzogYSBjb21wb25lbnQgdGhpcyBicm93c2VyIGFscmVhZHkgaG9sZHMsIHN0aWxsXG4gKiAgICAgaW5zaWRlIHRoZSBmcmVzaG5lc3MgdGhlIHNlcnZlciBwcm9taXNlZCwgaXMgcmVuZGVyZWQgd2l0aCBOTyByZXF1ZXN0LiBPbmNlIHRoZVxuICogICAgIHdpbmRvdyBlbmRzIHRoZSBicm93c2VyIHNlbmRzIGJhY2sgdGhlIHZlcnNpb24gaXQgaG9sZHMgaW5zdGVhZCBvZiByZS1kb3dubG9hZGluZy5cbiAqICAgLSBBIHByZXZpZXcgaXMgbmV2ZXIgbWluaWZpZWQgYW5kIG5ldmVyIGNhY2hlZC5cbiAqICAgLSBPbmx5IC9jb25zdW1lIG1vdmVzLiBFdmVyeXRoaW5nIGVsc2Uga2VlcHMgdGhlIGhvc3QgaXQgaGFzIHRvZGF5LlxuICogICAtIEFza2luZyBmb3IgYG1pbmlmeWAgZG9lcyBub3QgZm9yY2UgaXQ6IHRoZSBzZXJ2ZXIgZGVjaWRlcyBwZXIgY29tcG9uZW50LCBhbmQgYVxuICogICAgIGNvbXBvbmVudCB0aGF0IGlzIG5vdCBlbmFibGVkIGlzIHNlcnZlZCByYXcsIHdoaWNoIGlzIG5vdCBhbiBlcnJvci5cbiAqXG4gKiBgaG9zdGAgaXMgZm9yIHVzIChhIHN0YWdpbmcgbGFuZSwgYSBsb2NhbCBzZXJ2ZXIpOyBsZWF2ZSBpdCBvdXQuXG4gKi9cbmV4cG9ydCBjb25zdCBERUxJVkVSWV9IT1NUID0gJ2h0dHBzOi8vZGVsaXZlcnkubXlvcC5kZXYnO1xuXG5leHBvcnQgY29uc3QgZGVsaXZlcnkgPSAob3B0czogeyBtaW5pZnk/OiBib29sZWFuOyBjYWNoZT86IGJvb2xlYW47IGhvc3Q/OiBzdHJpbmcgfCBudWxsIH0gPSB7fSkgPT4ge1xuICAgIGNvbnN0IHdhbnRzTGFuZSA9IG9wdHMubWluaWZ5ICE9PSBmYWxzZSB8fCBvcHRzLmNhY2hlID09PSB0cnVlO1xuICAgIF9jbG91ZFJlcG9zaXRvcnkuc2V0RGVsaXZlcnkoe1xuICAgICAgICBtaW5pZnk6IG9wdHMubWluaWZ5ID8/IGZhbHNlLFxuICAgICAgICBjYWNoZTogb3B0cy5jYWNoZSA/PyBmYWxzZSxcbiAgICAgICAgaG9zdDogb3B0cy5ob3N0ICE9PSB1bmRlZmluZWQgPyBvcHRzLmhvc3QgOiAod2FudHNMYW5lID8gREVMSVZFUllfSE9TVCA6IG51bGwpLFxuICAgIH0pO1xuICAgIHJldHVybiBkZWxpdmVyeVN0YXRzKCk7XG59O1xuXG4vKipcbiAqIEZvcmdldCB3aGF0IHRoaXMgYnJvd3NlciBob2xkcywgc28gdGhlIG5leHQgbG9hZCBhc2tzIHRoZSBzZXJ2ZXIuIFVzZSBpdCB3aGVuIGEgY2hhbmdlXG4gKiBoYXMgdG8gYmUgdmlzaWJsZSBvbiBUSElTIGxvYWQgXHUyMDE0IHJpZ2h0IGFmdGVyIHNvbWVvbmUgcHVibGlzaGVzIFx1MjAxNCByYXRoZXIgdGhhbiB3aXRoaW4gdGhlXG4gKiBmcmVzaG5lc3Mgd2luZG93LlxuICovXG5leHBvcnQgY29uc3QgZGVsaXZlcnlSZWZyZXNoID0gYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IF9jbG91ZFJlcG9zaXRvcnkucmVmcmVzaERlbGl2ZXJ5KCk7XG4gICAgcmV0dXJuIGRlbGl2ZXJ5U3RhdHMoKTtcbn07XG5cbi8qKlxuICogV2hhdCBhbnN3ZXJlZCB0aGUgbGFzdCByZXF1ZXN0cywgYW5kIFx1MjAxNCB0aGUgbnVtYmVyIHdvcnRoIHdhdGNoaW5nIFx1MjAxNCBob3cgbWFueSB0aW1lcyB0aGVcbiAqIFNESyBoYWQgdG8gZmFsbCBiYWNrIHRvIHRoZSBkZWZhdWx0IGhvc3QgYmVjYXVzZSB0aGUgbGFuZSBkaWQgbm90IGFuc3dlci5cbiAqL1xuZXhwb3J0IGNvbnN0IGRlbGl2ZXJ5U3RhdHMgPSAoKSA9PiBfY2xvdWRSZXBvc2l0b3J5LmRlbGl2ZXJ5U3RhdHMoKTtcblxuLyoqIFVuZG8gZGVsaXZlcnkoKTogYmFjayB0byB0aGUgZGVmYXVsdCBob3N0IGFuZCByYXcgYnl0ZXMsIHdpdGggbm8gcmVsb2FkLiAqL1xuZXhwb3J0IGNvbnN0IGRlbGl2ZXJ5T2ZmID0gKCkgPT4ge1xuICAgIF9jbG91ZFJlcG9zaXRvcnkuc2V0RGVsaXZlcnkoeyBtaW5pZnk6IGZhbHNlLCBjYWNoZTogZmFsc2UsIGhvc3Q6IG51bGwgfSk7XG4gICAgcmV0dXJuIGRlbGl2ZXJ5U3RhdHMoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRDbG91ZFJlcG9zaXRvcnkgPSAocmVwb3NpdG9yeTogQ2xvdWRSZXBvc2l0b3J5KSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeSA9IHJlcG9zaXRvcnk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0RW52aXJvbm1lbnQgPSAoZW52OiBzdHJpbmcpID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5LnNldEVudmlyb25tZW50KGVudik7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVzb2x2ZWRDb25maWcgPSAoY29tcG9uZW50SWQ6IHN0cmluZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbikgPT4ge1xuICAgIHJldHVybiBfY2xvdWRSZXBvc2l0b3J5LmdldFJlc29sdmVkQ29uZmlnKGNvbXBvbmVudElkLCBlbnYsIHByZXZpZXcpO1xufTtcblxuZXhwb3J0IGNvbnN0IHByZWxvYWRDb21wb25lbnRzID0gYXN5bmMgKGlkczogc3RyaW5nW10sIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pID0+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgICBpZHMubWFwKChpZCkgPT4gX2Nsb3VkUmVwb3NpdG9yeS5mZXRjaENvbXBvbmVudFYyKGlkLCBlbnYsIHByZXZpZXcpKSxcbiAgICApO1xufTtcblxuLyoqXG4gKiBTZWVkIGFscmVhZHktcmVzb2x2ZWQgY29tcG9uZW50IGNvbmZpZ3MgaW50byB0aGUgU0RLIGNhY2hlLCB3aXRoIG5vIG5ldHdvcmtcbiAqIHJlcXVlc3QuIFRoZSBjb3VudGVycGFydCB0byB7QGxpbmsgcHJlbG9hZENvbXBvbmVudHN9LlxuICpcbiAqIFVzZSBpdCB3aGVuIHRoZSBjb25maWdzIHdlcmUgcmVzb2x2ZWQgc29tZXdoZXJlIGVsc2UgXHUyMDE0IHR5cGljYWxseSBvbiBhIHNlcnZlclxuICogYW5kIGVtYmVkZGVkIGluIHRoZSBwYWdlIFx1MjAxNCBzbyB0aGUgY29tcG9uZW50IHJlbmRlcnMgd2l0aCB6ZXJvIHJvdW5kIHRyaXBzOlxuICpcbiAqIGBgYHRzXG4gKiAvLyBzZXJ2ZXI6IGNvbnN0IGNvbmZpZ3MgPSB7IFtpZF06IGF3YWl0IG5ldyBDbG91ZFJlcG9zaXRvcnkoKS5mZXRjaENvbXBvbmVudFYyKGlkKSB9XG4gKiAvLyBjbGllbnQ6XG4gKiBoeWRyYXRlQ29tcG9uZW50cyhjb25maWdzKTtcbiAqIC8vIDxNeW9wQ29tcG9uZW50IGNvbXBvbmVudElkPXtpZH0gLz4gbm93IHJlbmRlcnMgd2l0aG91dCBmZXRjaGluZ1xuICogYGBgXG4gKlxuICogUGFzcyB0aGUgc2FtZSBgZW52YCAvIGBwcmV2aWV3YCB0aGUgY29uZmlncyB3ZXJlIHJlc29sdmVkIHdpdGg7IHRoZSBkZWZhdWx0c1xuICogbWF0Y2ggd2hhdCBhIHBsYWluIGBwcmVsb2FkQ29tcG9uZW50cyhbaWRdKWAgd291bGQgaGF2ZSB1c2VkLlxuICovXG5leHBvcnQgY29uc3QgaHlkcmF0ZUNvbXBvbmVudHMgPSAoXG4gICAgY29uZmlnczogUmVjb3JkPHN0cmluZywgSUNvbXBvbmVudENvbmZpZz4sXG4gICAgZW52Pzogc3RyaW5nLFxuICAgIHByZXZpZXc/OiBib29sZWFuLFxuKSA9PiB7XG4gICAgZm9yIChjb25zdCBbaWQsIGNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlncykpIHtcbiAgICAgICAgX2Nsb3VkUmVwb3NpdG9yeS5oeWRyYXRlQ29tcG9uZW50KGlkLCBjb25maWcsIGVudiwgcHJldmlldyk7XG4gICAgfVxufTtcbiIsICJpbXBvcnQge0Jhc2VDb250ZXh0TWVzc2FnZUhhbmRsZXIsIEhvc3RlZENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCB0eXBlIE1lc3NhZ2VUb0hvc3QgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB2b2lkXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSA9IGFueT4gZXh0ZW5kcyBCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyPFQsIFJlY29yZDxzdHJpbmcsIEhvc3RlZENvbXBvbmVudDxTaGFkb3dSb290UmVmPj4+IHtcblxuICAgIGFic3RyYWN0IG1lc3NhZ2VUeXBlOiBzdHJpbmdcblxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2VUb0hvc3Q6IGFueSwgcHVibGljIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIEhvc3RlZENvbXBvbmVudDxTaGFkb3dSb290UmVmPj4pIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZVRvSG9zdCk7XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgaW5uZXJFeGVjdXRvcjogKGV2ZW50OiBULCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB2b2lkO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IFQpID0+IHtcbiAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgaWYgKGV2ZW50LmRlc3RpbmF0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IGV2ZW50LmRlc3RpbmF0aW9uO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dFtkZXN0aW5hdGlvbl0uY29udGV4dCkge1xuXG4gICAgICAgICAgICAgICAgLy8gcGF0Y2ggdGhlIHNvdXJjZSBpZCwgdGhpbmsgYWJvdXQgdGhhdCA/XG4gICAgICAgICAgICAgICAgY29uc3QgX21lc3NhZ2VUb0hvc3QgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3Qoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4ubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZXZlbnQuZGVzdGluYXRpb24gPyBldmVudC5kZXN0aW5hdGlvbiA6IGV2ZW50LnNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uOiBldmVudC5zb3VyY2UgPyBldmVudC5zb3VyY2UgOiBldmVudC5kZXN0aW5hdGlvblxuICAgICAgICAgICAgICAgICAgICB9IGFzIEJhc2VNeW9wTWVzc2FnZSwgcmVwbGF5VG8pXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5uZXJFeGVjdXRvcihldmVudCwgdGhpcy5jb250ZXh0W2Rlc3RpbmF0aW9uXS5jb250ZXh0LCBfbWVzc2FnZVRvSG9zdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IG15b3BBdHRyaWJ1dGVzID0ge1xuICAgIGlkOiAnbXlvcC1pZCdcbn1cbiIsICJpbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzLnRzXCI7XG5pbXBvcnQge1JlZn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjb25zdCBnZXRFbGVtZW50c0J5UmVmID0gKHJlZjogUmVmLCBlbDogUGFyZW50Tm9kZSkgPT4ge1xuICAgIHJldHVybiBlbC5xdWVyeVNlbGVjdG9yQWxsKGBbJHtteW9wQXR0cmlidXRlcy5pZH09JyR7cmVmLnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0Rmlyc3RFbGVtZW50QnlSZWYgPSAocmVmOiBSZWYsIGVsOiBQYXJlbnROb2RlKSA9PiB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBnZXRFbGVtZW50c0J5UmVmKHJlZiwgZWwpO1xuICAgIGlmIChlbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRzLml0ZW0oMCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufSIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmluZENsaWNrTWVzc2FnZSwgQ2xpY2tSZXBsYXlNZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBCaW5kT25DbGlja0hhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8QmluZENsaWNrTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQmluZENsaWNrTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEJpbmRDbGlja01lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KVxuICAgICAgICBjb25zdCBjbGVhbnVwVGFza3M6IGFueVtdID0gW107XG5cbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgQ2xpY2tSZXBsYXlNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCkpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpO1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4gdGFzaygpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7TXlvcEVsZW1lbnRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dEhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8TXlvcEVsZW1lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DaGFuZ2VUZXh0TWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IE15b3BFbGVtZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS50ZXh0Q29udGVudCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY2xhc3MgU2hhZG93Um9vdFJlZiBleHRlbmRzIFJvb3RSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwdWJsaWMgc2hhZG93Um9vdDogU2hhZG93Um9vdCkge1xuICAgICAgICBzdXBlcihjb250YWluZXIsIHNoYWRvd1Jvb3QpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BFbGVtZW50UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlLCBEZXRlY3RNeW9wUmVmc01lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPERldGVjdE15b3BSZWZzTWVzc2FnZT4ge1xuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IERldGVjdE15b3BSZWZzTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuXG4gICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgIGNvbnN0IGFsbE15b3BJdGVtcyA9IHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKGBbJHtteW9wQXR0cmlidXRlcy5pZH1dYCk7XG5cbiAgICAgICAgbGV0IG15b3BSZWZzOiBNeW9wRWxlbWVudFJlZltdID0gW107XG5cbiAgICAgICAgYWxsTXlvcEl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiB0YWtlIHRoYXQgYmFjayB0byB0aGUgZGFzaGJvYXJkP1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhpdGVtLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcblxuICAgICAgICAgICAgY29uc3QgbXlvcElkID0gaXRlbS5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuXG4gICAgICAgICAgICBpZiAobXlvcElkKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnd2MgcmVjdCcsICBpdGVtLnBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIG15b3BSZWZzLnB1c2gobmV3IE15b3BFbGVtZW50UmVmKG15b3BJZCwgaXRlbS50YWdOYW1lLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBpdGVtLm9mZnNldFRvcCwgaXRlbS5vZmZzZXRMZWZ0KSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IERldGVjdGVkTXlvcFJlZnNNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbXlvcFJlZnMpKVxuICAgIH07XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5EZXRlY3RNeW9wUmVmc01lc3NhZ2U7XG5cblxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXRBdHRyaWJ1dGVNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3Mgc2V0QXR0cmlidXRlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxTZXRBdHRyaWJ1dGVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRBdHRyaWJ1dGVNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogU2V0QXR0cmlidXRlTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5zZXRBdHRyaWJ1dGUoZXZlbnQubmFtZSwgZXZlbnQudmFsdWUpXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSxcbiAgICBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlLFxufSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuZXhwb3J0IGNsYXNzIEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5BZGRFdmVudExpc3RlbmVyTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG5cbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgY29uc3QgY2xlYW51cFRhc2tzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBpbiBmYWN0IHdoZW4gcnVubmluZyBpbiBXZWJDb21wb25lbnQgd2UgY2FuIHRyYW5zZmVyIHRoZSBvcmlnaW5hbCBlXG4gICAgICAgICAgICAgICAgLy8gY3VycmVudGx5IHVzaW5nIG1ha2VTZXJpYWxpemFibGUgZm9yIG5lc3RlZCBjYXNlcywgdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCAgbWFrZVNlcmlhbGl6YWJsZShlLCBldmVudC5zZXJpYWxpemFibGVTa2VsZXRvbikpKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcihldmVudC50eXBlLCBoYW5kbGVyKTtcblxuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudC50eXBlLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHRhc2soKSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7SG9zdFNES30gZnJvbSBcIi4uLy4uL2hvc3QvaG9zdFNES1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi8uLi9ob3N0XCI7XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuXG4gICAgICAgIGNvbnN0IGNyZWF0ZVJlZiA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vY29uc3QgYWxsSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtldmVudC5yZWY/LnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xuICAgICAgICAgICAgY29uc3QgYWxsSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtldmVudC5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcblxuICAgICAgICAgICAgaWYgKGFsbEl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvc3RTREsgPSBIb3N0U0RLLkluc3RhbmNlKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IGV2ZW50Lm9wdGlvbnMuaWQpITtcbiAgICAgICAgICAgICAgICBpZiAocmVmQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vLy8+Pj4+XG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vICBjb25zb2xlLmxvZyhgZmFpbGVkIHRvIGZpbmQgJHtldmVudC5vcHRpb25zLmlkfSBpbiBtZW0gc2NvcGVgLCBob3N0U0RLKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy93ZSBoYXZlIHRoZSByZWYgY29tcG9uZW50IGluIG91ciBIb3N0U0RLIChzYW1lIG1lbW9yeSB3aGVuIHVzaW5nIHdlYmNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAvLyAgcmVmQ29tcG9uZW50LnBhcmVudCA9IGltcGxlbWVudGF0aW9uQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIC8vZGVsZXRlIHRoZSByZWYgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBob3N0U0RLLmNvbXBvbmVudHMuaW5kZXhPZihyZWZDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgaG9zdFNESy5jb21wb25lbnRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2NyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQgcmVtb3ZlZCB0ZW1wIHJlZiBjb21wb25lbnQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkIHVzaW5nIHRlbXAgcmVmIGNvbXBvbmVudCcpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGltcGxlbWVudGF0aW9uQ29tcG9uZW50ID0gYXdhaXQgaG9zdFNESy5sb2FkQ29tcG9uZW50KGV2ZW50Lm5lc3RlZENvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMuaXRlbSgwKSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQub3B0aW9ucylcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IG5vIG5lZWQgdGhpcywgcGFzcyBvcHRpb25zIGZyb20gcGFyZW50XG4gICAgICAgICAgICAgICAgLy9pbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5pZCA9IGV2ZW50LnByZWRlZmluZWRJZDtcbiAgICAgICAgICAgICAgICAvL3JlZkNvbXBvbmVudC5pZCArPSAnLic7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBub3QgcmVhbGx5IG5lZWRlZCA/XG4gICAgICAgICAgICAgICAgLy8gYXdhaXQgaW1wbGVtZW50YXRpb25Db21wb25lbnQuaW5pdGlhdGVkKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRSZWZDb25maWc6IGFueVtdID0gW107XG5cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhpbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5yZWZzKS5mb3JFYWNoKHJlZk5hbWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVmID0gaW1wbGVtZW50YXRpb25Db21wb25lbnQucmVmc1tyZWZOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgcmVmID0gcmVmLl9fbm9uUHJveGllZCB8fCByZWY7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFJlZkNvbmZpZy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb25JZDogKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbmVzdGVkUmVmQ29uZmlnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIC0gRE9NIGVsZW1lbnQgbm90IGZvdW5kJylcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgW10sIHRydWUpKTtcblxuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY3JlYXRlUmVmKCkudGhlbigpXG4gICAgICAgIC8vcmV0dXJuaW5nIHVuZGVmaW5lZCBzbyBpdCB3b24ndCBhY3QgYXMgYSBjbGVhbnVwXG4gICAgfVxufVxuIiwgImltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtSb290UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmV4cG9ydCBjb25zdCBFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSwgcmVwbGllcjogKGRhdGE6IGFueSkgPT4gdm9pZCwgcm9vdFJlZjogUm9vdFJlZikgPT4ge1xuICAgIGNvbnN0IF9fc2NyaXB0SW5wdXRzID0gZXZlbnQuc2NyaXB0SW5wdXRzID8gZXZlbnQuc2NyaXB0SW5wdXRzIDoge31cbiAgICBfX3NjcmlwdElucHV0cy5tYWtlU2VyaWFsaXphYmxlID0gbWFrZVNlcmlhbGl6YWJsZTtcblxuICAgIF9fc2NyaXB0SW5wdXRzLnNlbmQgPSByZXBsaWVyO1xuICAgIF9fc2NyaXB0SW5wdXRzLnJvb3RSZWYgPSByb290UmVmO1xuICAgIF9fc2NyaXB0SW5wdXRzLl9fc2NyaXB0SW5wdXRzID0gX19zY3JpcHRJbnB1dHM7XG5cbiAgICBjb25zdCBkeW5hbWljRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oYHJldHVybiAoJHtldmVudC5zY3JpcHR9KSguLi5hcmd1bWVudHMpYCk7XG4gICAgY29uc3QgcmV0ID0gZHluYW1pY0Z1bmN0aW9uKF9fc2NyaXB0SW5wdXRzKTtcblxuICAgIC8vIGNvbnN0IGR5bmFtaWNGdW5jdGlvbiA9IEZ1bmN0aW9uKCdzZW5kJywgJ3Jvb3RSZWYnLCdfX3NjcmlwdElucHV0cycsIC4uLk9iamVjdC5rZXlzKF9fc2NyaXB0SW5wdXRzKSwgZXZlbnQuY29udGVudCA/IGV2ZW50LmNvbnRlbnQgOiAnJylcbiAgICAvL2NvbnN0IHJldCA9IGR5bmFtaWNGdW5jdGlvbihyZXBsaWVyLCByb290UmVmLCBfX3NjcmlwdElucHV0cywgLi4uT2JqZWN0LnZhbHVlcyhfX3NjcmlwdElucHV0cykpO1xuICAgIHJlcGxpZXIocmV0KTtcbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZi50c1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50c1wiO1xuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdEhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8RXhlY3V0ZVNjcmlwdE1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5FeGVjdXRlU2NyaXB0TWVzc2FnZVxuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcbiAgICAgICAgY29uc3QgcmVwbGllciA9IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBkYXRhKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgRXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcihldmVudCwgcmVwbGllciwgc2hhZG93Um9vdFJlZik7XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlLCBGb3JtRGF0YUVudHJ5LCBHZXRFbGVtZW50VmFsdWVNZXNzYWdlLCBJbnB1dEVsZW1lbnRWYWx1ZSx9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzLnRzXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5jb25zdCBnZXRJbnB1dFZhbHVlID0gKGVsZW1lbnQpOiBJbnB1dEVsZW1lbnRWYWx1ZSA9PiB7XG4gICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBmb3JtXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0ZPUk0nKSB7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBkYXRhT2JqZWN0OiBJbnB1dEVsZW1lbnRWYWx1ZSA9IHtcbiAgICAgICAgICAgIGZvcm1EYXRhOiB7fSxcbiAgICAgICAgICAgIHVubWFwcGVkRGF0YTogW11cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBNYW51YWxseSBhZGQgZWxlbWVudHMgd2l0aG91dCBuYW1lc1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEnKTtcbiAgICAgICAgbGV0IGF1dG9OYW1lSW5kZXhlciA9IC0xO1xuXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXlvcElkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnbmFtZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gYF8keygrK2F1dG9OYW1lSW5kZXhlcil9YFxuXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZURhdGE6IEZvcm1EYXRhRW50cnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBnZXRJbnB1dFZhbHVlKGVsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZWxlbWVudC5yZXF1aXJlZCxcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRpdHk6IG1ha2VTZXJpYWxpemFibGUoZWxlbWVudC52YWxpZGl0eSwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgIG15b3BJZCxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XS52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2goZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRhdGFPYmplY3Q7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWxlbWVudC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmNoZWNrZWQgPyBlbGVtZW50LnZhbHVlIDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgaW5wdXQgYW5kIHRleHRhcmVhIGVsZW1lbnRzXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJyB8fCBlbGVtZW50LnRhZ05hbWUgPT09ICdURVhUQVJFQScpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNlbGVjdCBlbGVtZW50cyAoZHJvcGRvd25zKVxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdTRUxFQ1QnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBlZGl0YWJsZSBkaXZzIChjb250ZW50RWRpdGFibGUpXG4gICAgaWYgKGVsZW1lbnQuaXNDb250ZW50RWRpdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuaW5uZXJUZXh0IHx8IGVsZW1lbnQudGV4dENvbnRlbnQ7XG4gICAgfVxuXG4gICAgLy8gSWYgaXQncyBhbiB1bnN1cHBvcnRlZCBlbGVtZW50IHR5cGVcbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGNsYXNzIEdldEVsZW1lbnRWYWx1ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8R2V0RWxlbWVudFZhbHVlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuR2V0RWxlbWVudFZhbHVlTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UoZ2V0SW5wdXRWYWx1ZShpdGVtKSksIGV2ZW50KTtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldElubmVySHRtbH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge015b3BFbGVtZW50TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIFNldElubmVySHRtbEhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8U2V0SW5uZXJIdG1sPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRJbm5lckh0bWw7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBNeW9wRWxlbWVudE1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0uaW5uZXJIVE1MID0gZXZlbnQuY29udGVudDtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIFRoZSBXZWJjb21wb25lbnQgU0RLIGlzIHRhaWxvcmVkIGZvciB1c2luZyBNeW9wIGNvbXBvbmVudHMgcGFja2FnZWQgYXMgc2VwYXJhdGUgYnVuZGxlcyBhbmQgZXhwb3NlZCBhcyB3ZWIgY29tcG9uZW50cy48YnIvPlxuICogRGV2ZWxvcGVycyBpbXBvcnRpbmcgdGhpcyBTREsgY2FuIGxldmVyYWdlIEFQSXMgYW5kIHV0aWxpdGllcyBzcGVjaWZpY2FsbHkgY3JhZnRlZCB0byBzdXBwb3J0IHRoZSBsaWZlY3ljbGUgbWFuYWdlbWVudCBhbmQgY29tbXVuaWNhdGlvbiBwYXR0ZXJucyByZXF1aXJlZCBmb3Igd2ViIGNvbXBvbmVudHMgd2l0aGluIHRoZSBNeW9wIGFyY2hpdGVjdHVyZS48YnIvPlxuICogVGhpcyBTREsgcHJvbW90ZXMgcmV1c2FiaWxpdHkgYW5kIGVuY2Fwc3VsYXRpb24sIGVuYWJsaW5nIGRldmVsb3BlcnMgdG8gYnVpbGQgbW9kdWxhciwgc2VsZi1jb250YWluZWQgY29tcG9uZW50cyB0aGF0IGNhbiBiZSBzZWFtbGVzc2x5IGludGVncmF0ZWQgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbidzIERPTSBzdHJ1Y3R1cmUuXG4gKlxuICpcbiAqIE9uY2UgbG9hZGVkIHRoZSBgUm9vdFNES2AsIHlvdSBjYW4gbG9hZCB0aGUgYElmcmFtZVNES2BcbiAqIGBgYGpzXG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICogb3JcbiAqIGBgYHRzXG4gKiBpbXBvcnQge2dldFdlYmNvbXBvbmVudE1vZHVsZX0gZnJvbSAnQG15b3Avc2RrJztcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IGdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICogb3JcbiAqIGBgYHRzXG4gKiBpbXBvcnQge1dlYkNvbXBvbmVudFNES30gZnJvbSAnQG15b3Avc2RrL3dlYmNvbXBvbmVudCc7XG4gKiBgYGBcbiAqXG4gKi9cbmltcG9ydCB7QmFzZU15b3BTREt9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wV2ViY29tcG9uZW50Q29uc3RzfSBmcm9tIFwiLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge0JpbmRPbkNsaWNrSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlclwiO1xuaW1wb3J0IHtDaGFuZ2VUZXh0SGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2NoYW5nZVRleHRIYW5kbGVyXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7RGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgSW5pdE1lc3NhZ2UsXG4gICAgSW5pdFJlcXVlc3QsXG4gICAgTWVzc2FnZURpcmVjdGlvbixcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtzZXRBdHRyaWJ1dGVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvc2V0QXR0cmlidXRlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtBZGRFdmVudExpc3RlbmVySGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50c1wiO1xuaW1wb3J0IHtHZXRFbGVtZW50VmFsdWVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvR2V0RWxlbWVudFZhbHVlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTZXRJbm5lckh0bWxIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvc2V0SW5uZXJIdG1sSGFuZGxlci50c1wiO1xuXG4vKipcbiAqIFRoZSBXZWJjb21wb25lbnQgU0RLIGlzIHRhaWxvcmVkIGZvciB1c2luZyBNeW9wIGNvbXBvbmVudHMgcGFja2FnZWQgYXMgc2VwYXJhdGUgYnVuZGxlcyBhbmQgZXhwb3NlZCBhcyB3ZWIgY29tcG9uZW50cy48YnIvPlxuICogRGV2ZWxvcGVycyBpbXBvcnRpbmcgdGhpcyBTREsgY2FuIGxldmVyYWdlIEFQSXMgYW5kIHV0aWxpdGllcyBzcGVjaWZpY2FsbHkgY3JhZnRlZCB0byBzdXBwb3J0IHRoZSBsaWZlY3ljbGUgbWFuYWdlbWVudCBhbmQgY29tbXVuaWNhdGlvbiBwYXR0ZXJucyByZXF1aXJlZCBmb3Igd2ViIGNvbXBvbmVudHMgd2l0aGluIHRoZSBNeW9wIGFyY2hpdGVjdHVyZS48YnIvPlxuICogVGhpcyBTREsgcHJvbW90ZXMgcmV1c2FiaWxpdHkgYW5kIGVuY2Fwc3VsYXRpb24sIGVuYWJsaW5nIGRldmVsb3BlcnMgdG8gYnVpbGQgbW9kdWxhciwgc2VsZi1jb250YWluZWQgY29tcG9uZW50cyB0aGF0IGNhbiBiZSBzZWFtbGVzc2x5IGludGVncmF0ZWQgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbidzIERPTSBzdHJ1Y3R1cmUuXG4gKlxuICpcbiAqIE9uY2UgbG9hZGVkIHRoZSBgUm9vdCBTREtgLCB5b3UgY2FuIGxvYWQgdGhlIGBJZnJhbWVTREtgXG4gKiBgYGBqc1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqIG9yXG4gKiBgYGB0c1xuICogaW1wb3J0IHtnZXRXZWJjb21wb25lbnRNb2R1bGV9IGZyb20gJ0BteW9wL3Nkayc7XG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCBnZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJDb21wb25lbnRTREsgZXh0ZW5kcyBCYXNlTXlvcFNESyB7XG5cbiAgICBhbHdheXNQYXNzRW52ZWxvcGVzVG9Ib3N0ID0gdHJ1ZTtcblxuICAgIC8vd2hlbiBuZXcgd2ViIGNvbXBvbmVudCBjcmVhdGVkLlxuICAgIGNvbm5lY3RlZENhbGxiYWNrID0gKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHNoYWRvdzogU2hhZG93Um9vdCkgPT4ge1xuICAgICAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihteW9wV2ViY29tcG9uZW50Q29uc3RzLndlYmNvbXBvbmVudF9tZXNzYWdlX2tleSwgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50Q29udGVudCA9IGUuZGF0YSA/IGUuZGF0YSA6IGUuZGV0YWlsO1xuICAgICAgICAgICAgaWYgKCFldmVudENvbnRlbnQgfHwgIWV2ZW50Q29udGVudC5teW9wKSB7XG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZWN2aWVkIHdlYmNvbXBvbmVudF9tZXNzYWdlIHdpdGggd3JvbmcgdHlwZScpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBldmVudENvbnRlbnQgYXMgQmFzZU15b3BNZXNzYWdlO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogc2VuZCBjb250YWluZXIgLyBjb21wb2VubnQgaWRlbnRpZmllciBmb3IgbXVsdGlsIGNvbXBvbmVudHMgc3VwcG9ydFxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlSW5jb21lTWVzc2FnZXMoZSlcblxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdDb21wb25lbnRJZCA9IChtZXNzYWdlIGFzIEluaXRNZXNzYWdlKS5jb250ZW50LmlkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNbbmV3Q29tcG9uZW50SWRdLmNvbnRleHQgPSBuZXcgU2hhZG93Um9vdFJlZihjb250YWluZXIsIHNoYWRvdylcblxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnN1cHBvcnRlZEhhbmRsZXJzLmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBoYW5kbGVyLmNvbnRleHQgPSB0aGlzLnNoYWRvd1Jvb3RzO1xuICAgICAgICAgICAgICAgICAgICAvLyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgLy9UT0RPIDogZml4IHRoYXQgaGFjay4gcmFjZSBjb25kaXRpb24gd2l0aCBob3N0LmxvYWQgd2hlbiBtb2R1bGUgbG9hZGVkXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBJbml0UmVxdWVzdCgpKVxuICAgICAgICB9LCAxKVxuICAgIH1cblxuICAgIG1lc3NhZ2VUb0hvc3QgPSAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4ge1xuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24udXBcbiAgICAgICAgLy9tZXNzYWdlLnJlcGxheVRvSGFuZGxlciA9IHJlcGxheVRvPy5oYW5kbGVyVW5pcXVlSWQ7XG5cbiAgICAgICAgaWYgKCFtZXNzYWdlLnJlcGxheVRvSGFuZGxlciAmJiByZXBsYXlUbz8uaGFuZGxlclVuaXF1ZUlkKVxuICAgICAgICAgICAgbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgPSByZXBsYXlUby5oYW5kbGVyVW5pcXVlSWRcblxuICAgICAgICB3aW5kb3cubXlvcC5ob3N0U0RLLnNlbmQobWVzc2FnZSlcbiAgICB9XG5cbiAgICBzdXBwb3J0ZWRIYW5kbGVyczogQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyW10gPSBbXG4gICAgICAgIG5ldyBDaGFuZ2VUZXh0SGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBTZXRJbm5lckh0bWxIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEJpbmRPbkNsaWNrSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IHNldEF0dHJpYnV0ZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgRXhlY3V0ZVNjcmlwdEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgR2V0RWxlbWVudFZhbHVlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIC8vXG4gICAgICAgIG5ldyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cylcbiAgICBdO1xuXG4gICAgcHVibGljIGluaXQgPSAoKSA9PiB7XG4gICAgICAgIC8vdGhpcy5teUNvbXBvbmVudElkXG4gICAgICAgIC8vdGhpcy5oYW5kbGVJbmNvbWVNZXNzYWdlc1xuICAgIH1cbn1cblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnV2ViQ29tcG9uZW50U0RLJywgV2ViQ29tcG9uZW50U0RLKTtcbiIsICJleHBvcnQgKiBmcm9tIFwiLi9XZWJDb21wb25lbnRTREtcIjtcbiIsICIvKipcbiAqIEVtYmVkZGVkIFNESyBDb250ZW50IE1vZHVsZVxuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSBlbWJlZGRlZCBTREsgY29udGVudCBmb3IgbnBtIHBhY2thZ2UgdXNlcnMuXG4gKiBUaGUgYWN0dWFsIGNvbnRlbnQgaXMgZ2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUgYnkgc2NyaXB0cy9idWlsZC1lbWJlZGRlZC1zZGsuanNcbiAqXG4gKiBGb3IgZGV2ZWxvcG1lbnQsIHRoaXMgZmlsZSBleHBvcnRzIHBsYWNlaG9sZGVycy5cbiAqIEFmdGVyIGJ1aWxkLCB0aGUgZGlzdC9tb2R1bGUvZW1iZWRkZWRTREsuanMgd2lsbCBjb250YWluIHRoZSBhY3R1YWwgU0RLIGNvbnRlbnQuXG4gKlxuICogVXNhZ2UgaW4gSFRNTENvbXBvbmVudExvYWRlcjpcbiAqIC0gSWYgSEFTX0VNQkVEREVEX1NESyBpcyB0cnVlLCBpbmplY3QgU0RLIGlubGluZTogPHNjcmlwdD4ke0VNQkVEREVEX1NES19DT05URU5UfTwvc2NyaXB0PlxuICogLSBJZiBIQVNfRU1CRURERURfU0RLIGlzIGZhbHNlLCBmYWxsIGJhY2sgdG8gQ0ROOiA8c2NyaXB0IHNyYz1cIiR7dXJsfVwiPjwvc2NyaXB0PlxuICovXG5cbi8qKlxuICogVGhlIGVtYmVkZGVkIFNESyBjb250ZW50IGFzIGEgbWluaWZpZWQgSmF2YVNjcmlwdCBzdHJpbmcuXG4gKiBUaGlzIHBsYWNlaG9sZGVyIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBhY3R1YWwgY29udGVudCBpbiB0aGUgYnVpbGQgb3V0cHV0LlxuICovXG5leHBvcnQgY29uc3QgRU1CRURERURfU0RLX0NPTlRFTlQ6IHN0cmluZyA9ICcnO1xuXG4vKipcbiAqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIGVtYmVkZGVkIFNESyBjb250ZW50IGlzIGF2YWlsYWJsZS5cbiAqIFRoaXMgaXMgZmFsc2UgaW4gZGV2ZWxvcG1lbnQsIHRydWUgaW4gdGhlIGJ1aWx0IG1vZHVsZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEhBU19FTUJFRERFRF9TREs6IGJvb2xlYW4gPSBmYWxzZTtcbiIsICJpbXBvcnQge015b3BXZWJDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BXZWJjb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcExvYWRlcn0gZnJvbSBcIi4vSU15b3BMb2FkZXJcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHMudHNcIjtcbmltcG9ydCB7XG4gICAgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSUhUTUxMb2FkZXJDb25maWcsXG4gICAgSVNraW5Db25maWcsIFNoYWRvd1Jvb3RNb2RlVHlwZSxcbiAgICBTa2luTG9hZGVycyxcbiAgICBSZW5kZXJNb2RlLCBSZW5kZXJQb2xpY3lcbn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtXZWJDb21wb25lbnRTREt9IGZyb20gXCIuLi8uLi93ZWJjb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcElmcmFtZUNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudC50c1wiO1xuaW1wb3J0IHtFTUJFRERFRF9TREtfQ09OVEVOVCwgSEFTX0VNQkVEREVEX1NES30gZnJvbSBcIi4uL2VtYmVkZGVkU0RLLnRzXCI7XG4vL2ltcG9ydCB7Z2V0V2ViY29tcG9uZW50TW9kdWxlfSBmcm9tIFwiLi4vLi4vU0RLLnRzXCI7XG5cbmNvbnN0IE1ZT1BfV0VCX0NPTVBPTkVOVF9NQVJLRVIgPSAnPCEtLSBteW9wLXdlYi1jb21wb25lbnQgLS0+JztcbmNvbnN0IE1ZT1BfV0VCX0NPTVBPTkVOVF9TQ1JJUFRfSUQgPSAnbXlvcC13ZWItY29tcG9uZW50JztcblxuLy8gVHJhY2sgZXh0cmFjdGVkIHdlYiBjb21wb25lbnQgc2NyaXB0cyB0byBwcmV2ZW50IGRvdWJsZSByZWdpc3RyYXRpb24uXG4vLyBNYXBzIHNjcmlwdElkIC0+IHRoZSB0YWcgbmFtZSB0aGF0IHNjcmlwdCByZWdpc3RlcmVkLiBUaGUgdGFnIE1VU1QgYmUgcmVtZW1iZXJlZCBwZXJcbi8vIHNjcmlwdDogd2luZG93Ll9fTVlPUF9UQUdfTkFNRV9fIGlzIGEgc2luZ2xlIGdsb2JhbCBzbG90IHRoYXQgZXZlcnkgZXh0cmFjdGVkIGNvbXBvbmVudFxuLy8gb3ZlcndyaXRlcywgc28gb24gYSByZS1tb3VudCAoc2NyaXB0IHNraXBwZWQpIGl0IGhvbGRzIHdoaWNoZXZlciBjb21wb25lbnQgcmFuIGxhc3QuXG5jb25zdCBleHRyYWN0ZWRXZWJDb21wb25lbnRTY3JpcHRzOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xuXG5jb25zdCBzZWVuOiBzdHJpbmdbXSA9IFtdO1xubGV0IHNkaztcbmNvbnN0IGdldEluaXRpYXRlZFNkayA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXNkaykge1xuICAgICAgICAvL2NvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gYXdhaXQgZ2V0V2ViY29tcG9uZW50TW9kdWxlKClcbiAgICAgICAgc2RrID0gbmV3IFdlYkNvbXBvbmVudFNESygpO1xuICAgICAgICBzZGsuaW5pdCgpO1xuICAgIH1cbiAgICByZXR1cm4gc2RrO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVIVE1MRWxlbWVudENvbnN0cnVjdG9yKGh0bWxTdHJpbmc6IHN0cmluZywgU2hhZG93Um9vdE1vZGU/OiBrZXlvZiB0eXBlb2YgU2hhZG93Um9vdE1vZGVUeXBlKTogbmV3ICgpID0+IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG5cbiAgICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgICAgICBjb25zdCBtb2RlID0gU2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5vcGVuID8gJ29wZW4nIDogJ2Nsb3NlZCc7XG4gICAgICAgICAgICBjb25zdCBzaGFkb3cgPSB0aGlzLmF0dGFjaFNoYWRvdyh7bW9kZX0pO1xuICAgICAgICAgICAgZ2V0SW5pdGlhdGVkU2RrKCkudGhlbigoc2RrKSA9PiB7XG4gICAgICAgICAgICAgICAgc2RrLmNvbm5lY3RlZENhbGxiYWNrKHRoaXMsIHNoYWRvdyk7XG4gICAgICAgICAgICAgICAgc2hhZG93LmlubmVySFRNTCA9IGh0bWxTdHJpbmdcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5jb25zdCBjcmVhdGVDdXN0b21XZWJDb21wb25lbnQgPSAoY29tcG9uZW50TmFtZTogc3RyaW5nLCBodG1sOiBzdHJpbmcsIFNoYWRvd1Jvb3RNb2RlPzoga2V5b2YgdHlwZW9mIFNoYWRvd1Jvb3RNb2RlVHlwZSkgPT4ge1xuICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZShjb21wb25lbnROYW1lLCBjcmVhdGVIVE1MRWxlbWVudENvbnN0cnVjdG9yKGh0bWwsIFNoYWRvd1Jvb3RNb2RlKSk7XG4gICAgY29uc29sZS5sb2coYGRlZmluZSgnJHtjb21wb25lbnROYW1lfScpIHdhcyBjYWxsZWQsIHdlYiBjb21wb25lbnQgcmVhZHkgdG8gdXNlYCk7XG59XG5cbmNvbnN0IHRvV2ViQ29tcG9uZW50TmFtZSA9IChzdHIpID0+IHtcbiAgICByZXR1cm4gc3RyXG4gICAgICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAnJDEtJDInKSAvLyBBZGQgaHlwaGVuIGJlZm9yZSB1cHBlcmNhc2UgbGV0dGVyc1xuICAgICAgICAucmVwbGFjZSgvKFxcZCspL2csICctJDEnKSAvLyBBZGQgaHlwaGVuIGJlZm9yZSBkaWdpdHNcbiAgICAgICAgLnRvTG93ZXJDYXNlKCk7IC8vIENvbnZlcnQgdG8gbG93ZXJjYXNlXG59XG5cbmNvbnN0IHRvQ3VzdG9tRWxlbWVudE5hbWUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgbmFtZSA9IHRvV2ViQ29tcG9uZW50TmFtZShuYW1lKTtcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlKC9fL2csICctJyk7XG59XG5cbmxldCBwYXJzZXI6IERPTVBhcnNlcjsgLy8gPSBuZXcgRE9NUGFyc2VyKCk7XG5cbmV4cG9ydCBjbGFzcyBIVE1MQ29tcG9uZW50TG9hZGVyIGV4dGVuZHMgQmFzZU15b3BMb2FkZXIge1xuXG4gICAgdHlwZSA9IFNraW5Mb2FkZXJzLkhUTUxMb2FkZXJcblxuICAgIC8qKlxuICAgICAqIERldGVjdCBpZiBIVE1MIGlzIGEgTXlvcCBXZWIgQ29tcG9uZW50LlxuICAgICAqXG4gICAgICogVEhFIE1BUktFUiBDT01NRU5UIEFMT05FIElTIE5PVCBBIFNBRkUgU0lHTkFMLCBCRUNBVVNFIE1JTklGSUVSUyBERUxFVEUgQ09NTUVOVFMuXG4gICAgICpcbiAgICAgKiBUaGlzIHVzZWQgdG8gYmUgYHN0YXJ0c1dpdGgoTVlPUF9XRUJfQ09NUE9ORU5UX01BUktFUilgIGFuZCBub3RoaW5nIGVsc2UuIFRoZVxuICAgICAqIGRlbGl2ZXJ5IGxhbmUgbWluaWZpZXMgd2l0aCBgcmVtb3ZlQ29tbWVudHM6IHRydWVgIChteW9wLXNlcnZlciBkZXJpdmUudHMgTUlOX0NGRyksXG4gICAgICogc28gdGhlIHN0b3JlZCBgbWluYCBhcnRpZmFjdCBvZiBldmVyeSB2MiB3ZWIgY29tcG9uZW50IGxvc2VzIGl0cyBsZWFkaW5nXG4gICAgICogYDwhLS0gbXlvcC13ZWItY29tcG9uZW50IC0tPmAuIERldGVjdGlvbiB0aGVuIHJldHVybmVkIGZhbHNlLCB0aGUgY29tcG9uZW50IGZlbGxcbiAgICAgKiBiYWNrIHRvIHBsYWluIGlmcmFtZSByZW5kZXJpbmcsIGFuZCB0aGUgd2hvbGUgYXV0aG9yZWQgZG9jdW1lbnQgd2FzIHNob3duIC0tXG4gICAgICogaW5jbHVkaW5nIHRoZSB2MiBhdXRob3Jpbmcgd3JhcHBlciwgc28gUGljLVRpbWUncyBwcm9kdWN0aW9uIGRhc2hib2FyZCBkaXNwbGF5ZWQgdGhlXG4gICAgICogcHJldmlldyBjaHJvbWUgKFwiV2ViIENvbXBvbmVudCB2MlwiLCBhIHRhZy1uYW1lIGJhZGdlIHJlYWRpbmcgYGxvYWRpbmcuLi5gLCBTSVpFIC9cbiAgICAgKiBPVkVSRkxPVyAvIEJHIGNvbnRyb2xzKSBpbnN0ZWFkIG9mIHRoZWlyIGNvbXBvbmVudC4gUmVwb3J0ZWQgMjAyNi0xMC0xODsgdGhlIHNlcnZlZFxuICAgICAqIEhUTUwgbWVhc3VyZWQgMzI4LDA3MSBieXRlcyBhZ2FpbnN0IDk1MSwxMzAgYXQgb3JpZ2luLCB3aXRoIHplcm8gYDwhLS1gIGxlZnQgaW4gaXQuXG4gICAgICpcbiAgICAgKiBUaGUgc2NyaXB0IGlkIGlzIHRoZSBzaWduYWwgdGhhdCBzdXJ2aXZlcywgYW5kIGl0IGlzIHRoZSBvbmUgYGV4dHJhY3RXZWJDb21wb25lbnRTY3JpcHRgXG4gICAgICogYWxyZWFkeSBkZXBlbmRzIG9uOiBpZiB0aGF0IGVsZW1lbnQgaXMgcHJlc2VudCwgZXh0cmFjdGlvbiB3b3Jrcywgc28gZGV0ZWN0aW9uXG4gICAgICogc2hvdWxkIGFncmVlLiBDaGVja2VkIHdpdGggYSByZWdleCByYXRoZXIgdGhhbiBET01QYXJzZXIgLS0gdGhpcyBydW5zIGZvciBldmVyeVxuICAgICAqIEhUTUwgY29tcG9uZW50LCBhbmQgcGFyc2luZyBhIDMwMCBLQiBkb2N1bWVudCB0byBhbnN3ZXIgYSB5ZXMvbm8gcXVlc3Rpb24gaXMgbm90XG4gICAgICogd29ydGggaXQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBpc015b3BXZWJDb21wb25lbnQoaHRtbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChodG1sLnRyaW1TdGFydCgpLnN0YXJ0c1dpdGgoTVlPUF9XRUJfQ09NUE9ORU5UX01BUktFUikpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChgPHNjcmlwdFtePl0qXFxcXHNpZD1bXCInXT8ke01ZT1BfV0VCX0NPTVBPTkVOVF9TQ1JJUFRfSUR9W1wiJ1xcXFxzPl1gLCAnaScpLnRlc3QoaHRtbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBob3cgdGhpcyBjb21wb25lbnQgc2hvdWxkIHJlbmRlciwgYXBwbHlpbmcgdGhlIGhvc3QgcmVuZGVyIHBvbGljeS5cbiAgICAgKiBQcmVjZWRlbmNlOiBvcHRpb25zLnJlbmRlclBvbGljeSAocGVyLWNhbGwpIGZ1bGx5IHJlcGxhY2VzIHRoZSBnbG9iYWxcbiAgICAgKiBob3N0U0RLLnNldFJlbmRlclBvbGljeSBcdTIwMTQgc28gYW4gYXBwIGNhbiByZXN0cmljdCBnbG9iYWxseSBhbmQgYWxsb3cgc3BlY2lmaWNzLlxuICAgICAqIFdpdGggbm8gcG9saWN5IHNldCwgYmVoYXZpb3IgaXMgdW5jaGFuZ2VkIGZyb20gYmVmb3JlIChtYXJrZXIgXHUyMUQyIHdlYiBjb21wb25lbnQpLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVJlbmRlck1vZGUoXG4gICAgICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgICAgICBza2luOiBJU2tpbkNvbmZpZyxcbiAgICAgICAgbG9hZGVyQ29uZmlnOiBJSFRNTExvYWRlckNvbmZpZyxcbiAgICAgICAgaXNXZWJDb21wb25lbnQ6IGJvb2xlYW4sXG4gICAgICAgIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zLFxuICAgICk6IFByb21pc2U8eyBtb2RlOiBSZW5kZXJNb2RlIHwgZmFsc2U7IGlzb2xhdGU6IGJvb2xlYW4gfT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ZWRNb2RlOiBSZW5kZXJNb2RlID0gaXNXZWJDb21wb25lbnRcbiAgICAgICAgICAgID8gJ3dlYkNvbXBvbmVudCdcbiAgICAgICAgICAgIDogKChsb2FkZXJDb25maWcuaXNvbGF0aW9uIHx8IG9wdGlvbnM/Lmlzb2xhdGlvbikgPyAnaXNvbGF0ZWRJZnJhbWUnIDogJ2lmcmFtZScpO1xuXG4gICAgICAgIC8vIHBlci1jYWxsIHBvbGljeSB3aW5zOyBlbHNlIGdsb2JhbCBwb2xpY3kgb24gdGhlIGhvc3QgU0RLIHNpbmdsZXRvbi5cbiAgICAgICAgY29uc3QgcG9saWN5OiBSZW5kZXJQb2xpY3kgfCB1bmRlZmluZWQgPVxuICAgICAgICAgICAgb3B0aW9ucz8ucmVuZGVyUG9saWN5ID8/ICh3aW5kb3cgYXMgYW55KT8ubXlvcD8uaG9zdFNESz8uZ2V0UmVuZGVyUG9saWN5Py4oKTtcblxuICAgICAgICBjb25zdCBtb2RlOiBSZW5kZXJNb2RlIHwgZmFsc2UgPSBwb2xpY3lcbiAgICAgICAgICAgID8gYXdhaXQgcG9saWN5KHsgY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgcmVxdWVzdGVkTW9kZSwgaXNXZWJDb21wb25lbnQgfSlcbiAgICAgICAgICAgIDogcmVxdWVzdGVkTW9kZTtcblxuICAgICAgICByZXR1cm4geyBtb2RlLCBpc29sYXRlOiBtb2RlID09PSAnaXNvbGF0ZWRJZnJhbWUnIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGluLWZyYW1lIGJyaWRnZSBmb3IgaXNvbGF0ZWQgY29tcG9uZW50cy4gUnVucyBpbnNpZGUgdGhlIHNhbmRib3hlZFxuICAgICAqIChvcGFxdWUtb3JpZ2luKSBpZnJhbWUsIHRyYW5zbGF0aW5nIHRoZSBzYW1lIGF1dGhvci1mYWNpbmcgY29udHJhY3QgdG8vZnJvbVxuICAgICAqIHBvc3RNZXNzYWdlIHNpbmNlIHRoZSBob3N0IGhhcyBubyBzYW1lLW9yaWdpbiBhY2Nlc3M6XG4gICAgICogICBcdTIwMjIgZGF0YS1pbiA6IHBhcmVudCBwb3N0cyB7dHlwZTonbXlvcDppbml0J30gXHUyMTkyIGNhbGxzIHdpbmRvdy5teW9wX2luaXRfaW50ZXJmYWNlXG4gICAgICogICAgICAgICAgICAgICAocGx1cyBhIGJha2VkIGluaXRpYWwgdmFsdWUgZm9yIHRoZSBmaXJzdCByZW5kZXIpXG4gICAgICogICBcdTIwMjIgZGF0YS1vdXQ6IHdpbmRvdy5teW9wX2N0YV9oYW5kbGVyIFx1MjE5MiBwYXJlbnQucG9zdE1lc3NhZ2Uoe3R5cGU6J215b3A6Y3RhJ30pXG4gICAgICogICBcdTIwMjIgcmVzaXplICA6IFJlc2l6ZU9ic2VydmVyIFx1MjE5MiBwYXJlbnQucG9zdE1lc3NhZ2Uoe3R5cGU6J215b3A6c2l6ZSd9KVxuICAgICAqXG4gICAgICogVE9ETyhkZXYtZXh0ZW5zaW9uKTogdGhlIGlzb2xhdGVkIHBhdGggZGVsaWJlcmF0ZWx5IHNraXBzIHRoZSBzYW1lLW9yaWdpblxuICAgICAqIGRhdGFTY3JpcHQsIHNvIGl0IG5ldmVyIHBvc3RzIHRoZSBgTVlPUF9QUkVJTkpFQ1RFRF9JTklUYCBtZXNzYWdlIHRoZSBNeW9wIGRldlxuICAgICAqIGV4dGVuc2lvbiBsaXN0ZW5zIGZvciB0byBsb2cgdGhlIElOSVRJQUwgcmVuZGVyIChgaW5pdCpgKS4gTGF0ZXIgaW5pdCB1cGRhdGVzIGFuZFxuICAgICAqIGFsbCBDVEFzIGFyZSBzdGlsbCB0cmFja2VkICh0aGUgZXh0ZW5zaW9uIHdyYXBzIGBjb21wLnByb3BzYCwgd2hpY2ggb3VyIGlzb2xhdGVkXG4gICAgICogY29ubmVjdFByb3BzIGJyYW5jaCByb3V0ZXMgdGhyb3VnaCksIHNvIG9ubHkgdGhlIGZpcnN0LXJlbmRlciBwYXlsb2FkIGlzIG1pc3NpbmdcbiAgICAgKiBmcm9tIHRoZSBleHRlbnNpb24ncyBhY3Rpdml0eSBsb2cgZm9yIGlzb2xhdGVkIGNvbXBvbmVudHMuIENsb3NpbmcgdGhpcyB3b3VsZCBiZSBhXG4gICAgICogfjEtbGluZSBgcGFyZW50LnBvc3RNZXNzYWdlKHt0eXBlOidNWU9QX1BSRUlOSkVDVEVEX0lOSVQnLCBwYXlsb2FkOntkYXRhfX0pYCBpbnNpZGVcbiAgICAgKiBmbHVzaEluaXRpYWwoKSBiZWxvdyBcdTIwMTQgaW50ZW50aW9uYWxseSBOT1QgZG9uZSBmb3Igbm93IHRvIGF2b2lkIGFkZGluZyBleHRlbnNpb24tb25seVxuICAgICAqIHRyYWZmaWMgdG8gdGhlIGNvbXBvbmVudCBydW50aW1lLiBXZWIgY29tcG9uZW50cyBoYXZlIHRoZSBzYW1lIGluaXRpYWwtaW5pdCBnYXBcbiAgICAgKiAoaW5pdFdpdGhEYXRhIGlzIGNhbGxlZCBvbiB0aGUgZWxlbWVudCwgbm90IHZpYSBjb21wLnByb3BzKSBhbmQgaXQgcHJlZGF0ZXMgdGhpcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGJ1aWxkSXNvbGF0aW9uQnJpZGdlKGluaXRpYWxEYXRhTGl0ZXJhbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGA8c2NyaXB0PlxuICAgICAgICAgICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgX19pbml0aWFsID0gJHtpbml0aWFsRGF0YUxpdGVyYWx9O1xuICAgICAgICAgICAgICAgIHZhciBfX3BlbmRpbmc7XG4gICAgICAgICAgICAgICAgLy8gZGF0YS1vdXQgKGN0YSlcbiAgICAgICAgICAgICAgICB3aW5kb3cubXlvcF9jdGFfaGFuZGxlciA9IGZ1bmN0aW9uIChhY3Rpb24sIHBheWxvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgcGFyZW50LnBvc3RNZXNzYWdlKHsgX19teW9wOiB0cnVlLCB0eXBlOiAnbXlvcDpjdGEnLCBhY3Rpb246IGFjdGlvbiwgcGF5bG9hZDogcGF5bG9hZCB9LCAnKicpOyB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gY2FsbEluaXQoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5teW9wX2luaXRfaW50ZXJmYWNlID09PSAnZnVuY3Rpb24nKSB7IHdpbmRvdy5teW9wX2luaXRfaW50ZXJmYWNlKGRhdGEpOyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGRhdGEtaW4gKGluaXQgdXBkYXRlcylcbiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkID0gZS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWQgfHwgZC5fX215b3AgIT09IHRydWUpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGQudHlwZSA9PT0gJ215b3A6aW5pdCcpIHsgaWYgKCFjYWxsSW5pdChkLmRhdGEpKSBfX3BlbmRpbmcgPSBkLmRhdGE7IH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyBmaXJzdCByZW5kZXI6IHVzZSBhIHBlbmRpbmcgdXBkYXRlIGlmIG9uZSBhcnJpdmVkLCBlbHNlIHRoZSBiYWtlZCBpbml0aWFsIGRhdGFcbiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gZmx1c2hJbml0aWFsKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IChfX3BlbmRpbmcgIT09IHVuZGVmaW5lZCkgPyBfX3BlbmRpbmcgOiBfX2luaXRpYWw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxJbml0KGRhdGEpKSB7IF9fcGVuZGluZyA9IHVuZGVmaW5lZDsgX19pbml0aWFsID0gdW5kZWZpbmVkOyB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZsdXNoSW5pdGlhbCk7XG4gICAgICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgICAgICAvLyByZXNpemUgKHJlcG9ydCBjb250ZW50IHNpemUpXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gY29udGVudEhlaWdodCgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTWVhc3VyZSB0aGUgQk9EWSAoY29udGVudCBib3gpLiBkb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0IGluY2x1ZGVzXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpZnJhbWUgdmlld3BvcnQgXHUyMDE0IHdoaWNoIHdlJ3JlIGRyaXZpbmcgXHUyMDE0IHNvIGl0IHdvdWxkIHJlcG9ydCB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBmcmFtZSBoZWlnaHQsIG5vdCB0aGUgY29udGVudCwgYW5kIG5ldmVyIHNocmluay5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgICAgICAgICAgICAgICBpZiAoYikgcmV0dXJuIE1hdGgubWF4KGIuc2Nyb2xsSGVpZ2h0LCBiLm9mZnNldEhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBwb3N0U2l6ZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19teW9wOiB0cnVlLCB0eXBlOiAnbXlvcDpzaXplJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGNvbnRlbnRIZWlnaHQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAnKicpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBPYnNlcnZlIHRoZSBCT0RZIChyZWZsb3dzIHdpdGggY29udGVudCkgXHUyMDE0IG5vdCBkb2N1bWVudEVsZW1lbnQsIHdob3NlIGJveCBpc1xuICAgICAgICAgICAgICAgIC8vIHRoZSBpZnJhbWUgdmlld3BvcnQgYW5kIHdvdWxkIGZlZWQgYmFjayBpbnRvIGEgcmVzaXplIGxvb3AuIEEgTXV0YXRpb25PYnNlcnZlclxuICAgICAgICAgICAgICAgIC8vIGNhdGNoZXMgY29udGVudCBzd2FwcyAoZS5nLiBpbm5lckhUTUwgcmUtcmVuZGVyKSB0aGF0IGRvbid0IGNoYW5nZSBib2R5J3MgYm94LlxuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuUmVzaXplT2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgdmFyIF9fcm8gPSBuZXcgUmVzaXplT2JzZXJ2ZXIocG9zdFNpemUpOyBpZiAoZG9jdW1lbnQuYm9keSkgX19yby5vYnNlcnZlKGRvY3VtZW50LmJvZHkpOyB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAod2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIgJiYgZG9jdW1lbnQuYm9keSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkgeyBuZXcgTXV0YXRpb25PYnNlcnZlcihwb3N0U2l6ZSkub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSwgYXR0cmlidXRlczogdHJ1ZSwgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTsgfSBjYXRjaCAoZSkge31cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBwb3N0U2l6ZSk7XG4gICAgICAgICAgICAgICAgcG9zdFNpemUoKTtcbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgIDwvc2NyaXB0PmA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdCB0aGUgd2ViIGNvbXBvbmVudCBzY3JpcHQgY29udGVudCBmcm9tIEhUTUxcbiAgICAgKi9cbiAgICBwcml2YXRlIGV4dHJhY3RXZWJDb21wb25lbnRTY3JpcHQoaHRtbDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgY29uc3QgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhodG1sLCAndGV4dC9odG1sJyk7XG4gICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvYy5nZXRFbGVtZW50QnlJZChNWU9QX1dFQl9DT01QT05FTlRfU0NSSVBUX0lEKTtcbiAgICAgICAgcmV0dXJuIHNjcmlwdD8udGV4dENvbnRlbnQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIHRoZSB3ZWIgY29tcG9uZW50IHNjcmlwdCBvbiB0aGUgaG9zdCBkb2N1bWVudC5cbiAgICAgKiBSZXR1cm5zIHRoZSBjdXN0b20gZWxlbWVudCB0YWcgbmFtZSB0aGlzIHNjcmlwdCByZWdpc3RlcmVkLlxuICAgICAqL1xuICAgIHByaXZhdGUgZXhlY3V0ZVdlYkNvbXBvbmVudFNjcmlwdChzY3JpcHRDb250ZW50OiBzdHJpbmcsIHNjcmlwdElkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICAvLyBDaGVjayBpZiBhbHJlYWR5IGV4ZWN1dGVkIChieSBzY3JpcHQgY29udGVudCBoYXNoKVxuICAgICAgICBjb25zdCBjYWNoZWRUYWdOYW1lID0gZXh0cmFjdGVkV2ViQ29tcG9uZW50U2NyaXB0cy5nZXQoc2NyaXB0SWQpO1xuICAgICAgICBpZiAoY2FjaGVkVGFnTmFtZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFtNeW9wV2ViQ29tcG9uZW50XSBTY3JpcHQgYWxyZWFkeSBleGVjdXRlZCBmb3IgJHtzY3JpcHRJZH0sIHJldXNpbmcgPCR7Y2FjaGVkVGFnTmFtZX0+YCk7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkVGFnTmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICBzY3JpcHQudGV4dENvbnRlbnQgPSBzY3JpcHRDb250ZW50O1xuICAgICAgICBzY3JpcHQuaWQgPSBgbXlvcC1leHRyYWN0ZWQtJHtzY3JpcHRJZH1gO1xuICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgZ2xvYmFsIGltbWVkaWF0ZWx5OiB0aGUgbmV4dCBleHRyYWN0ZWQgc2NyaXB0IHRvIHJ1biB3aWxsIG92ZXJ3cml0ZSBpdC5cbiAgICAgICAgY29uc3QgdGFnTmFtZSA9ICh3aW5kb3cgYXMgYW55KS5fX01ZT1BfVEFHX05BTUVfXztcbiAgICAgICAgaWYgKHRhZ05hbWUpIHtcbiAgICAgICAgICAgIGV4dHJhY3RlZFdlYkNvbXBvbmVudFNjcmlwdHMuc2V0KHNjcmlwdElkLCB0YWdOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgW015b3BXZWJDb21wb25lbnRdIEV4ZWN1dGVkIHdlYiBjb21wb25lbnQgc2NyaXB0OiAke3NjcmlwdElkfSAtPiA8JHt0YWdOYW1lfT5gKTtcbiAgICAgICAgcmV0dXJuIHRhZ05hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCBhIE15b3AgV2ViIENvbXBvbmVudCAoZXh0cmFjdGVkIGFuZCBydW4gb24gaG9zdCBkb2N1bWVudClcbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGxvYWRFeHRyYWN0ZWRXZWJDb21wb25lbnQoXG4gICAgICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgICAgICBza2luOiBJU2tpbkNvbmZpZyxcbiAgICAgICAgY29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgICAgICAgaHRtbDogc3RyaW5nLFxuICAgICAgICBvcHRpb25zPzogbG9hZGVyT3B0aW9uc1xuICAgICk6IFByb21pc2U8TXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudD4ge1xuICAgICAgICBjb25zdCBzY3JpcHRDb250ZW50ID0gdGhpcy5leHRyYWN0V2ViQ29tcG9uZW50U2NyaXB0KGh0bWwpO1xuXG4gICAgICAgIGlmICghc2NyaXB0Q29udGVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbTXlvcFdlYkNvbXBvbmVudF0gTm8gPHNjcmlwdCBpZD1cIm15b3Atd2ViLWNvbXBvbmVudFwiPiBmb3VuZCBpbiBIVE1MJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2UgY29tcG9uZW50IGRlZmluaXRpb24gaWQgYXMgc2NyaXB0IGlkZW50aWZpZXIgZm9yIGRlZHVwbGljYXRpb25cbiAgICAgICAgY29uc3Qgc2NyaXB0SWQgPSBgJHtjb21wb25lbnREZWZpbml0aW9uLmlkfS0ke3NraW4uaWR9YDtcblxuICAgICAgICAvLyBFeGVjdXRlIHRoZSBzY3JpcHQgb24gdGhlIGhvc3QgZG9jdW1lbnQsIG9yIHJldXNlIHRoZSB0YWcgaXQgcmVnaXN0ZXJlZCBlYXJsaWVyLlxuICAgICAgICAvLyBOZXZlciByZS1yZWFkIHdpbmRvdy5fX01ZT1BfVEFHX05BTUVfXyBoZXJlOiBvbiBhIHJlLW1vdW50IHRoZSBzY3JpcHQgaXMgc2tpcHBlZCBhbmRcbiAgICAgICAgLy8gdGhlIGdsb2JhbCBzdGlsbCBwb2ludHMgYXQgd2hpY2hldmVyIGNvbXBvbmVudCdzIHNjcmlwdCByYW4gbGFzdCwgd2hpY2ggd291bGQgYnVpbGRcbiAgICAgICAgLy8gdGhpcyBjb250YWluZXIncyBlbGVtZW50IGZyb20gYW5vdGhlciBjb21wb25lbnQncyB0YWcuXG4gICAgICAgIGNvbnN0IHRhZ05hbWUgPSB0aGlzLmV4ZWN1dGVXZWJDb21wb25lbnRTY3JpcHQoc2NyaXB0Q29udGVudCwgc2NyaXB0SWQpO1xuXG4gICAgICAgIGlmICghdGFnTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbTXlvcFdlYkNvbXBvbmVudF0gU2NyaXB0IGRpZCBub3Qgc2V0IHdpbmRvdy5fX01ZT1BfVEFHX05BTUVfXycpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBjdXN0b20gZWxlbWVudFxuICAgICAgICBjb25zdCBkb21JZCA9IGBteW9wLWNvbXAtJHt1dWlkdjQoKX1gO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTtcbiAgICAgICAgZWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgIGlmIChvcHRpb25zPy5oaWRkZW4pIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciBjb250YWluZXIgaWYgbmVlZGVkXG4gICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENPTlNUUlVDVCBCRUZPUkUgQVBQRU5ESU5HLiBBcHBlbmRpbmcgaXMgd2hhdCBjb25uZWN0cyB0aGUgZWxlbWVudCBhbmQgZmlyZXMgaXRzXG4gICAgICAgIC8vIGNvbm5lY3RlZENhbGxiYWNrLCBhbmQgdGhlIHdyYXBwZXIncyBjb25zdHJ1Y3RvciBpcyB3aGVyZSB0aGUgc2luZ2xlICdteW9wLWN0YSdcbiAgICAgICAgLy8gbGlzdGVuZXIgaXMgYXR0YWNoZWQuIFdpdGggdGhlIGFwcGVuZCBmaXJzdCwgYW55IENUQSBhIGNvbXBvbmVudCBlbWl0cyBmcm9tXG4gICAgICAgIC8vIGNvbm5lY3RlZENhbGxiYWNrIC0tIGEgc2VhcmNoIGJveCBhbm5vdW5jaW5nIGl0cyBpbml0aWFsIHN0YXRlLCBhIHdpZGdldFxuICAgICAgICAvLyByZXBvcnRpbmcgYSBkZWZhdWx0IHNlbGVjdGlvbiAtLSB3YXMgZGlzcGF0Y2hlZCBiZWZvcmUgYW55dGhpbmcgd2FzIGxpc3RlbmluZ1xuICAgICAgICAvLyBhbmQgc2lsZW50bHkgbG9zdC4gVGhlIHdyYXBwZXIgb25seSBuZWVkcyB0aGUgZWxlbWVudCByZWZlcmVuY2UsIG5vdCBhIGNvbm5lY3RlZFxuICAgICAgICAvLyBlbGVtZW50LCBzbyBjb25zdHJ1Y3RpbmcgZmlyc3QgY29zdHMgbm90aGluZyBhbmQgbWFrZXMgdGhlIGJ1ZmZlciBjb3ZlciB0aGVcbiAgICAgICAgLy8gd2hvbGUgZmlyc3QgcmVuZGVyIHJhdGhlciB0aGFuIG9ubHkgdGhlIGluaXRXaXRoRGF0YSBwYXJ0IG9mIGl0LlxuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudChcbiAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb24sXG4gICAgICAgICAgICBza2luLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgIHRhZ05hbWUsXG4gICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgd2l0aCBkYXRhIGlmIHByb3ZpZGVkLiBgbnVsbGAgaXMgbm90IGRhdGEgLS0gc2VlIHRoZSBkYXRhIHNjcmlwdFxuICAgICAgICAvLyBndWFyZCBpbiB0aGUgSFRNTCBwYXRoIGZvciB3aHkgY2FsbGluZyBhbiBpbml0IGludGVyZmFjZSB3aXRoIG51bGwgaXMgd29yc2VcbiAgICAgICAgLy8gdGhhbiBub3QgY2FsbGluZyBpdC5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmRhdGEgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zPy5kYXRhICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuaW5pdFdpdGhEYXRhKG9wdGlvbnMuZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyhgW015b3BXZWJDb21wb25lbnRdIExvYWRlZCA8JHt0YWdOYW1lfT4gaW50byBjb250YWluZXJgKTtcblxuICAgICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cblxuICAgIGxvYWQgPSBhc3luYyAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4ge1xuXG4gICAgICAgIGNvbnN0IGxvYWRlckNvbmZpZyA9IChza2luLmxvYWRlciBhcyBJSFRNTExvYWRlckNvbmZpZyk7XG5cbiAgICAgICAgY29uc3QgaXNXQyA9IHRoaXMuaXNNeW9wV2ViQ29tcG9uZW50KGxvYWRlckNvbmZpZy5IVE1MKTtcbiAgICAgICAgY29uc3QgeyBtb2RlLCBpc29sYXRlIH0gPSBhd2FpdCB0aGlzLnJlc29sdmVSZW5kZXJNb2RlKGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGxvYWRlckNvbmZpZywgaXNXQywgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKG1vZGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtNeW9wXSBSZW5kZXJpbmcgYmxvY2tlZCBieSByZW5kZXIgcG9saWN5IGZvciBjb21wb25lbnQgXCIke2NvbXBvbmVudERlZmluaXRpb24uaWR9XCJgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1dDKSB7XG4gICAgICAgICAgICAvLyBXZWItY29tcG9uZW50IEhUTUwgb25seSBzdXBwb3J0cyB0aGUgd2ViLWNvbXBvbmVudCBjb250cmFjdDsgYSBwb2xpY3kgdGhhdFxuICAgICAgICAgICAgLy8gZGVuaWVzIGl0IGhhcyBubyBpZnJhbWUgZmFsbGJhY2sgKHNlZSBwbGFuIFx1MDBBNzMuMykgXHUyMDE0IGJsb2NrIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAvLyBzaWxlbnRseSByZW5kZXIgYnJva2VuLiBVbnRydXN0ZWQgY29udHJpYnV0b3JzIG11c3Qgc2hpcCBpZnJhbWUgY29tcG9uZW50cy5cbiAgICAgICAgICAgIGlmIChtb2RlICE9PSAnd2ViQ29tcG9uZW50Jykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW015b3BdIFdlYi1jb21wb25lbnQgcmVuZGVyaW5nIGRlbmllZCBieSByZW5kZXIgcG9saWN5IGZvciBjb21wb25lbnQgXCIke2NvbXBvbmVudERlZmluaXRpb24uaWR9XCJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRFeHRyYWN0ZWRXZWJDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBsb2FkZXJDb25maWcuSFRNTCwgb3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZG9tSWQgPSBgbXlvcC1jb21wLSR7dXVpZHY0KCl9YFxuICAgICAgICBsZXQgZWxlbWVudDtcblxuICAgICAgICBpZiAobG9hZGVyQ29uZmlnLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgY29uc3QgdW5pcUlkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICBjb25zdCBkb21JZCA9IGBteW9wLWNvbXAtJHt1bmlxSWR9YFxuXG4gICAgICAgICAgICBsZXQgSWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgICAgICAvLyBGdWxsIGlzb2xhdGlvbjogYSBzYW5kYm94IFdJVEhPVVQgYWxsb3ctc2FtZS1vcmlnaW4gZ2l2ZXMgdGhlIGZyYW1lIGFuXG4gICAgICAgICAgICAvLyBvcGFxdWUgb3JpZ2luIFx1MjAxNCBubyBob3N0IERPTS9jb29raWVzL3BhcmVudCBhY2Nlc3MuIE11c3QgYmUgc2V0IGJlZm9yZVxuICAgICAgICAgICAgLy8gdGhlIGZyYW1lIG5hdmlnYXRlcyAoaS5lLiBiZWZvcmUgc3JjZG9jIC8gYXBwZW5kKS5cbiAgICAgICAgICAgIGlmIChpc29sYXRlKSB7XG4gICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3NhbmRib3gnLCAnYWxsb3ctc2NyaXB0cyBhbGxvdy1mb3JtcyBhbGxvdy1wb3B1cHMnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2V0IGFsbCBzdHlsZXMgQkVGT1JFIGFwcGVuZGluZyB0byBwcmV2ZW50IGZsYXNoIGF0IHdyb25nIHBvc2l0aW9uXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnN0eWxlLmNzc1RleHQgPSBgXG4gICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgICAgIGluc2V0OiAwO1xuICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgICAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICAgICAgICAgIG9wYWNpdHk6ICR7b3B0aW9ucz8uaGlkZGVuID8gJzAnIDogJzEnfTtcbiAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6ICR7b3B0aW9ucz8uaGlkZGVuID8gJ25vbmUnIDogJ2FsbCd9O1xuICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuXG4gICAgICAgICAgICAvLyBXcml0ZSBjb250ZW50IGludG8gdGhlIGlmcmFtZS4gQW4gaXNvbGF0ZWQgKHNhbmRib3hlZCwgb3BhcXVlLW9yaWdpbikgZnJhbWVcbiAgICAgICAgICAgIC8vIGNhbid0IGJlIGRvYy53cml0ZSgpJ24gZnJvbSB0aGUgaG9zdCwgc28gYWNjdW11bGF0ZSB0aGUgbWFya3VwIGFuZCBzZXQgaXQgdmlhXG4gICAgICAgICAgICAvLyBzcmNkb2Mgb24gY2xvc2UoKS4gTm9uLWlzb2xhdGVkIGZyYW1lcyBrZWVwIHRoZSBzYW1lLW9yaWdpbiBkb2Mud3JpdGUgcGF0aC5cbiAgICAgICAgICAgIGNvbnN0IF9fc3JjUGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBjb25zdCBkb2M6IHsgb3BlbigpOiB2b2lkOyB3cml0ZWxuKHM6IHN0cmluZyk6IHZvaWQ7IGNsb3NlKCk6IHZvaWQgfSA9IGlzb2xhdGVcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgb3BlbigpIHt9LFxuICAgICAgICAgICAgICAgICAgICB3cml0ZWxuKHM6IHN0cmluZykgeyBfX3NyY1BhcnRzLnB1c2gocyk7IH0sXG4gICAgICAgICAgICAgICAgICAgIGNsb3NlKCkgeyBJZnJhbWVFbGVtZW50LnNyY2RvYyA9IF9fc3JjUGFydHMuam9pbignXFxuJyk7IH0sXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGQgPSBJZnJhbWVFbGVtZW50LmNvbnRlbnREb2N1bWVudCB8fCBJZnJhbWVFbGVtZW50LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGQub3BlbigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgICAgICAgICB9KSgpO1xuXG5cbiAgICAgICAgICAgIC8vIFBhcnNlIG15b3A6c2l6ZSBtZXRhIHRhZyBiZWZvcmUgaWZyYW1lIGNyZWF0aW9uIChzYW1lIERPTVBhcnNlciBwYXNzIHBhdHRlcm4gYXMgbXlvcF9wcmV2aWV3IHJlbW92YWwpLlxuICAgICAgICAgICAgLy8gVGhpcyBsZXRzIHRoZSBSZWFjdCBob3N0IGRldGVybWluZSBzaXppbmcgbW9kZSAoZmlsbCB2cyBjb250ZW50KSBmcm9tIHRoZSBzdGFydC5cbiAgICAgICAgICAgIGxldCBwYXJzZWRTaXplTWV0YTogeyB3aWR0aD86IHN0cmluZyB8IG51bWJlcjsgaGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyOyBtaW5XaWR0aD86IG51bWJlcjsgbWF4V2lkdGg/OiBudW1iZXI7IG1pbkhlaWdodD86IG51bWJlcjsgbWF4SGVpZ2h0PzogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCBfcHJlUGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9wcmVEb2MgPSBfcHJlUGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNpemVNZXRhID0gX3ByZURvYy5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJteW9wOnNpemVcIl0nKTtcbiAgICAgICAgICAgICAgICBpZiAoc2l6ZU1ldGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgcGFyc2VkU2l6ZU1ldGEgPSBKU09OLnBhcnNlKHNpemVNZXRhLmdldEF0dHJpYnV0ZSgnY29udGVudCcpIHx8ICd7fScpOyB9IGNhdGNoIHt9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgSFRNTDJSZW5kZXIgPSBsb2FkZXJDb25maWcuSFRNTDtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/Ll9pbnNwZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgLy9pbmplY3QgaW5zcGVjdGlvbiBzY3JpcHQgZm9yIHByb3BzIGRldGVjdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBfZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuXG4gICAgICAgICAgICAgICAgLy8gVE9ETyA6IHBhcnQgb2YgQUkgY29tcG9uZW50cywgdGhpbmsgYWJvdXQgdGhhdCwgZG9jdW1lbnQgaXQuXG4gICAgICAgICAgICAgICAgY29uc3QgbXlvcF9wcmV2aWV3X3NjcmlwdCA9IF9kb2MuZ2V0RWxlbWVudEJ5SWQoJ215b3BfcHJldmlldycpO1xuICAgICAgICAgICAgICAgIG15b3BfcHJldmlld19zY3JpcHQ/LnJlbW92ZUF0dHJpYnV0ZSgndHlwZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gUGFyc2UgdGhlIGluamVjdGVkIEhUTUwgc3RyaW5nIGludG8gYSBub2RlXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcCA9IF9kb2MuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCk7XG4gICAgICAgICAgICAgICAgdGVtcC5ib2R5LmlubmVySFRNTCA9IGA8c2NyaXB0PlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmVmb3JlS2V5c1dpbmRvdyA9IG5ldyBTZXQoT2JqZWN0LmtleXMod2luZG93KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcFN0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZUtleXNXaW5kb3csXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gdGVtcC5ib2R5LmZpcnN0Q2hpbGQ7XG5cbiAgICAgICAgICAgICAgICBpZiAobm9kZSAmJiBfZG9jLmhlYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgX2RvYy5oZWFkLmluc2VydEJlZm9yZShfZG9jLmltcG9ydE5vZGUobm9kZSwgdHJ1ZSksIF9kb2MuaGVhZC5maXJzdENoaWxkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBQcmVwZW5kIERPQ1RZUEU6IGRvY3VtZW50RWxlbWVudC5vdXRlckhUTUwgcmV0dXJucyBvbmx5IDxodG1sPi4uLjwvaHRtbD5cbiAgICAgICAgICAgICAgICAvLyBhbmQgZHJvcHMgdGhlIGRvY3R5cGUsIHdoaWNoIHdvdWxkIHB1dCB0aGUgaWZyYW1lIGluIHF1aXJrcyBtb2RlLlxuICAgICAgICAgICAgICAgIC8vIFF1aXJrcyBtb2RlIGJyZWFrcyBhdXRvLXNpemluZyBiZWNhdXNlIDxib2R5PiBzdHJldGNoZXMgdG8gdGhlIGlmcmFtZVxuICAgICAgICAgICAgICAgIC8vIHZpZXdwb3J0IGluc3RlYWQgb2Ygc2hyaW5raW5nIHRvIGNvbnRlbnQsIHNvIFJlc2l6ZU9ic2VydmVyIG9uIGJvZHlcbiAgICAgICAgICAgICAgICAvLyBuZXZlciBmaXJlcyB3aGVuIGNvbnRlbnQgcmVmbG93cyAoZS5nLiBhZnRlciBmb250IHN3YXApLlxuICAgICAgICAgICAgICAgIEhUTUwyUmVuZGVyID0gJzwhRE9DVFlQRSBodG1sPicgKyBfZG9jLmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnM/LmRhdGEgIT09IHVuZGVmaW5lZCkge1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPOiBpbXByb3ZlIGJ5IGRvIGl0IG9uIHRoZSBzZXJ2ZSBvbmNlXG5cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgbXlvcF9wcmV2aWV3IHNjcmlwdCB3aGVuIG5vdCBpbiBpbnNwZWN0aW9uIG1vZGVcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgX2RvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcobG9hZGVyQ29uZmlnLkhUTUwsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBteW9wX3ByZXZpZXdfc2NyaXB0ID0gX2RvYy5nZXRFbGVtZW50QnlJZCgnbXlvcF9wcmV2aWV3Jyk7XG5cbiAgICAgICAgICAgICAgICBpZiAobXlvcF9wcmV2aWV3X3NjcmlwdCkge1xuICAgICAgICAgICAgICAgICAgICBteW9wX3ByZXZpZXdfc2NyaXB0LnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBTZWUgbm90ZSBhYm92ZTogcHJlcGVuZCBET0NUWVBFIHRvIGtlZXAgdGhlIGlmcmFtZSBpbiBzdGFuZGFyZHMgbW9kZS5cbiAgICAgICAgICAgICAgICAgICAgSFRNTDJSZW5kZXIgPSAnPCFET0NUWVBFIGh0bWw+JyArIF9kb2MuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluamVjdCBob3N0LXByb3ZpZGVkIENTUyBiZWZvcmUgdGhlIGlmcmFtZSBpcyB3cml0dGVuIHNvIHN0eWxlcyBhcmVcbiAgICAgICAgICAgIC8vIHByZXNlbnQgb24gZmlyc3QgcGFpbnQgKG5vIEZPVUMpLiBBcHBlbmRlZCBsYXN0IGluIDxoZWFkPiBzbyBpdCB3aW5zXG4gICAgICAgICAgICAvLyBvdmVyIHRoZSBjb21wb25lbnQncyBvd24gc3R5bGVzIHZpYSBub3JtYWwgY2FzY2FkZSBvcmRlci5cbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5pbmplY3RDc3MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgX2RvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoSFRNTDJSZW5kZXIsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZVRhZyA9IF9kb2MuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICAgICAgICBzdHlsZVRhZy5zZXRBdHRyaWJ1dGUoJ2RhdGEtbXlvcC1pbmplY3RlZCcsICd0cnVlJyk7XG4gICAgICAgICAgICAgICAgLy8gPHN0eWxlPiBpcyBhbiBIVE1MIHJhdy10ZXh0IGVsZW1lbnQ6IHRoZSBzZXJpYWxpemVyIGJlbG93IHdyaXRlcyBpdHNcbiAgICAgICAgICAgICAgICAvLyBjb250ZW50cyBMSVRFUkFMTFksIHdpdGhvdXQgZXNjYXBpbmcuIENTUyBjb250YWluaW5nIFwiPC9zdHlsZT5cIiB3b3VsZFxuICAgICAgICAgICAgICAgIC8vIHRoZXJlZm9yZSBjbG9zZSB0aGUgdGFnIGFuZCBpbmplY3QgbGl2ZSBtYXJrdXAgaW50byB0aGUgaWZyYW1lLCB3aGljaFxuICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGVzIHNhbWUtb3JpZ2luIHdpdGggdGhpcyBwYWdlLiBOZXV0cmFsaXplIHRoZSBzZXF1ZW5jZSBcdTIwMTQgbm8gcmVhbFxuICAgICAgICAgICAgICAgIC8vIHN0eWxlc2hlZXQgY29udGFpbnMgaXQuIChTYW1lIGNsYXNzIG9mIGJ1ZyBhcyB0aGUgPC9zY3JpcHQ+IGVzY2FwZSBpblxuICAgICAgICAgICAgICAgIC8vIHRoZSBkYXRhIHBheWxvYWQgYmVsb3cuKVxuICAgICAgICAgICAgICAgIHN0eWxlVGFnLnRleHRDb250ZW50ID0gb3B0aW9ucy5pbmplY3RDc3MucmVwbGFjZSgvPFxccypcXC9cXHMqc3R5bGUvZ2ksICc8XFxcXC9zdHlsZScpO1xuICAgICAgICAgICAgICAgIChfZG9jLmhlYWQgfHwgX2RvYy5kb2N1bWVudEVsZW1lbnQpLmFwcGVuZENoaWxkKHN0eWxlVGFnKTtcbiAgICAgICAgICAgICAgICAvLyBTZWUgbm90ZSBhYm92ZTogcHJlcGVuZCBET0NUWVBFIHRvIGtlZXAgdGhlIGlmcmFtZSBpbiBzdGFuZGFyZHMgbW9kZS5cbiAgICAgICAgICAgICAgICBIVE1MMlJlbmRlciA9ICc8IURPQ1RZUEUgaHRtbD4nICsgX2RvYy5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MO1xuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGRvYy53cml0ZWxuKEhUTUwyUmVuZGVyKTtcblxuICAgICAgICAgICAgLy8gd2luZG93Ll9fZmVkZXJhdGlvbl9fID1cbiAgICAgICAgICAgIC8vICAgICB7IC4uLndpbmRvdy5fX2ZlZGVyYXRpb25fXyxcbiAgICAgICAgICAgIC8vICAgICAgICAgLy9UT0RPIDogZ2V0IGZyb20gRU5WIGF0IGJ1aWxkIHRpbWUsXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vIGluamVjdCB2YWx1ZSB0byBtb2R1bGUgYXQgYnVpbGQgdGltZVxuICAgICAgICAgICAgLy8gICAgICAgICAvLyB0b2RheSB3ZSBkb2luZyBzbyBqdXN0IGZvciB0aGUgQ0pTIHZlcnNpb25cbiAgICAgICAgICAgIC8vICAgICAgICAgX19wdWJsaWNfcGF0aF9fIDonaHR0cHM6Ly9jZG4ubXlvcC5kZXYvc2RrL25leHQnXG4gICAgICAgICAgICAvLyAgICAgICAgICwuLi4ke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICB3aW5kb3cuX19mZWRlcmF0aW9uX18pXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gICAgIH07XG5cbiAgICAgICAgICAgIC8vIEZvciBucG0gcGFja2FnZSB1c2VycyB3aXRoIGJ1bmRsZXJzIChWaXRlL1dlYnBhY2spLCBpbmplY3QgU0RLIGlubGluZVxuICAgICAgICAgICAgLy8gRm9yIENETiB1c2VycyAoc2NyaXB0IHRhZyksIHVzZSBDRE4gVVJMXG4gICAgICAgICAgICBjb25zdCBzZGtTY3JpcHQgPSBIQVNfRU1CRURERURfU0RLXG4gICAgICAgICAgICAgICAgPyBgPHNjcmlwdD4ke0VNQkVEREVEX1NES19DT05URU5UfTwvc2NyaXB0PmBcbiAgICAgICAgICAgICAgICA6IGA8c2NyaXB0IHNyYz1cIiR7d2luZG93Lm15b3AuX19ST09UX1NES19QVUJMSUNfVVJMX199XCI+PC9zY3JpcHQ+YDtcblxuICAgICAgICAgICAgLy8gRGlmZmVyZW50IGluaXQgc2NyaXB0IGZvciBlbWJlZGRlZCB2cyBDRE4gU0RLXG4gICAgICAgICAgICAvLyAtIEVtYmVkZGVkIChidW5kbGVkIElJRkUpOiB1c2VzIE15b3BTREsuZ2V0SWZyYW1lTW9kdWxlKCkgd2hpY2ggcmV0dXJucyBtb2R1bGUgZGlyZWN0bHlcbiAgICAgICAgICAgIC8vIC0gQ0ROIChkeW5hbWljIGxvYWRpbmcpOiB1c2VzIHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0SWZyYW1lTW9kdWxlKCkgd2hpY2ggd3JhcHMgd2l0aCAuZ2V0KClcbiAgICAgICAgICAgIGNvbnN0IGluaXRTY3JpcHQgPSBIQVNfRU1CRURERURfU0RLXG4gICAgICAgICAgICAgICAgPyBgPHNjcmlwdD5cbiAgICAgICAgICAgICAgICAgICBjb25zdCBfX215b3BfaW5pdCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlmcmFtZU1vZHVsZSA9IGF3YWl0IE15b3BTREsuZ2V0SWZyYW1lTW9kdWxlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJZnJhbWVTREsgPSBpZnJhbWVNb2R1bGUuSWZyYW1lU0RLO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2RrID0gbmV3IElmcmFtZVNESygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2RrLmluaXQoKTtcbiAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgX19teW9wX2luaXQoKS50aGVuKCk7XG4gICAgICAgICAgICAgICAgPC9zY3JpcHQ+YFxuICAgICAgICAgICAgICAgIDogYDxzY3JpcHQ+XG4gICAgICAgICAgICAgICAgICAgd2luZG93Ll9fZmVkZXJhdGlvbl9fLl9fcHVibGljX3BhdGhfXyA9IHdpbmRvdy5fX2ZlZGVyYXRpb25fXy5fX3B1YmxpY19wYXRoX187XG4gICAgICAgICAgICAgICAgICAgY29uc3QgX19teW9wX2luaXQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldElmcmFtZU1vZHVsZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNkayA9IG5ldyBJZnJhbWVTREsoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNkay5pbml0KCk7XG4gICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgIF9fbXlvcF9pbml0KCkudGhlbigpO1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG5cbiAgICAgICAgICAgIC8vIElzb2xhdGVkIGZyYW1lcyB1c2UgdGhlIHBvc3RNZXNzYWdlIGJyaWRnZSBpbnN0ZWFkIG9mIHRoZSBzYW1lLW9yaWdpblxuICAgICAgICAgICAgLy8gSWZyYW1lU0RLICsgZGF0YS1pbmplY3Rpb24gc2NyaXB0cyAod2hpY2ggcmVseSBvbiBob3N0XHUyMTk0ZnJhbWUgYWNjZXNzKS5cbiAgICAgICAgICAgIGlmICghaXNvbGF0ZSkge1xuICAgICAgICAgICAgICAgIGRvYy53cml0ZWxuKGAke3Nka1NjcmlwdH0ke2luaXRTY3JpcHR9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluamVjdCBkYXRhIHNjcmlwdCBpZiBkYXRhIG9wdGlvbiBpcyBwcm92aWRlZC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBgbnVsbGAgQ09VTlRTIEFTIE5PIERBVEEsIE5PVCBBUyBEQVRBLiBUaGUgY2hlY2sgdXNlZCB0byBiZSBgIT09IHVuZGVmaW5lZGAsXG4gICAgICAgICAgICAvLyBhbmQgYG51bGwgIT09IHVuZGVmaW5lZGAgaXMgdHJ1ZSAtLSBzbyBhIGhvc3QgdGhhdCBwYXNzZXMgYGRhdGE6IG51bGxgICh0aGVcbiAgICAgICAgICAgIC8vIG5hdHVyYWwgd2F5IHRvIHNheSBcIm5vdGhpbmcgdG8gc2VuZCB5ZXRcIikgZ290IHRoZSB3aG9sZSBkYXRhIHNjcmlwdCBpbmplY3RlZFxuICAgICAgICAgICAgLy8gYW5kIHRoZSBjb21wb25lbnQncyBvd24gYG15b3BfaW5pdF9pbnRlcmZhY2VgIGludm9rZWQgd2l0aCBudWxsLiBBIGNvbXBvbmVudFxuICAgICAgICAgICAgLy8gdGhhdCB2YWxpZGF0ZXMgaXRzIGlucHV0IHRoZW4gcmVqZWN0cyBpdCwgd2hpY2ggaXMgd2hlcmUgUGljLVRpbWUncyBjb25zb2xlXG4gICAgICAgICAgICAvLyBlcnJvciBgbXlvcF9pbml0X2ludGVyZmFjZTogSW52YWxpZCBjb25maWcgcHJvdmlkZWQuYCBjYW1lIGZyb206IG1lYXN1cmVkIG9uXG4gICAgICAgICAgICAvLyB0aGVpciBwYWdlIDIwMjYtMTAtMTgsIEFMTCAxMyBjb21wb25lbnRzIGFyZSBtb3VudGVkIHdpdGggYGRhdGE6IG51bGxgLCBzb1xuICAgICAgICAgICAgLy8gZXZlcnkgb25lIG9mIHRoZW0gcGFpZCBmb3IgYW4gaW5qZWN0ZWQgc2NyaXB0IGFuZCBhIG1lYW5pbmdsZXNzIGluaXQgY2FsbC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBJbml0aWFsaXNpbmcgYSBjb21wb25lbnQgd2l0aCBudWxsIGNhbiBuZXZlciB0ZWxsIGl0IGFueXRoaW5nIHRoYXQgb21pdHRpbmdcbiAgICAgICAgICAgIC8vIHRoZSBjYWxsIGRvZXMgbm90LCBzbyB0aGUgdHdvIGFyZSBub3cgdHJlYXRlZCB0aGUgc2FtZS5cbiAgICAgICAgICAgIGlmICghaXNvbGF0ZSAmJiBvcHRpb25zPy5kYXRhICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucz8uZGF0YSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIFNldHVwIENUQSBxdWV1ZSAtIGNhcHR1cmVzIGFueSBDVEFzIGVtaXR0ZWQgZHVyaW5nIGluaXQgYmVmb3JlIGhvc3QgcmVnaXN0ZXJzIGhhbmRsZXJcbiAgICAgICAgICAgICAgICBjb25zdCBjdGFRdWV1ZVNjcmlwdCA9IGA8c2NyaXB0PlxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19teW9wX2N0YV9xdWV1ZSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcF9jdGFfaGFuZGxlciA9IGZ1bmN0aW9uKGFjdGlvbiwgcGF5bG9hZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9jdGFfcXVldWUucHVzaCh7YWN0aW9uOiBhY3Rpb24sIHBheWxvYWQ6IHBheWxvYWR9KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICA8L3NjcmlwdD5gO1xuXG4gICAgICAgICAgICAgICAgLy8gRXNjYXBlIGRhdGEgZm9yIHNhZmUgZW1iZWRkaW5nIGluIHNjcmlwdCB0YWdcbiAgICAgICAgICAgICAgICAvLyBKU09OLnN0cmluZ2lmeSBkb2Vzbid0IGVzY2FwZSA8L3NjcmlwdD4gd2hpY2ggY291bGQgYnJlYWsgSFRNTCBwYXJzaW5nXG4gICAgICAgICAgICAgICAgY29uc3QgZXNjYXBlZERhdGEgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLmRhdGEpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC88XFwvc2NyaXB0L2dpLCAnXFxcXHUwMDNjL3NjcmlwdCcpO1xuXG4gICAgICAgICAgICAgICAgLy8gU2VsZi1jb250YWluZWQgZGF0YSBpbmplY3Rpb24gc2NyaXB0IHRoYXQ6XG4gICAgICAgICAgICAgICAgLy8gMS4gQ2FsbHMgbXlvcF9pbml0X2ludGVyZmFjZSBpbW1lZGlhdGVseSBpZiBhbHJlYWR5IGRlZmluZWRcbiAgICAgICAgICAgICAgICAvLyAyLiBXYXRjaGVzIGZvciBsYXRlLWRlZmluZWQgbXlvcF9pbml0X2ludGVyZmFjZSB2aWEgZGVmaW5lUHJvcGVydHlcbiAgICAgICAgICAgICAgICAvLyAzLiBDbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIChyZW1vdmVzIHNjcmlwdCB0YWcgYW5kIHdpbmRvdyBkYXRhKVxuICAgICAgICAgICAgICAgIC8vIDQuIFBvc3RzIG1lc3NhZ2UgdG8gcGFyZW50IGZvciBleHRlbnNpb24gdHJhY2tpbmcgKHByZS1pbmplY3RlZCBpbml0KilcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhU2NyaXB0ID0gYDxzY3JpcHQgaWQ9XCJfX215b3BfaW5pdF9kYXRhX3NjcmlwdFwiPlxuICAgICAgICAgICAgICAgICAgICAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9ICR7ZXNjYXBlZERhdGF9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNjcmlwdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ19fbXlvcF9pbml0X2RhdGFfc2NyaXB0Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWxsSW5pdEludGVyZmFjZSA9IGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgYXMgcHJlLWluamVjdGVkIGRhdGEgY2FsbCBmb3IgZXh0ZW5zaW9uIHRyYWNraW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9pbml0X3ByZWluamVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbihkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19teW9wX2luaXRfcHJlaW5qZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydFRpbWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RpZnkgZXh0ZW5zaW9uIHZpYSBwb3N0TWVzc2FnZSAoaW5pdCogPSBwcmUtaW5qZWN0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnTVlPUF9QUkVJTkpFQ1RFRF9JTklUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgJyonKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYW51cDogcmVtb3ZlIHNjcmlwdCB0YWcgYW5kIHN0b3JlZCBkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjcmlwdEVsICYmIHNjcmlwdEVsLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0RWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzY3JpcHRFbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB3aW5kb3cuX19teW9wX2luaXRfZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93Lm15b3BfaW5pdF9pbnRlcmZhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGdW5jdGlvbiBhbHJlYWR5IGV4aXN0cyAtIGNhbGwgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsSW5pdEludGVyZmFjZSh3aW5kb3cubXlvcF9pbml0X2ludGVyZmFjZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZ1bmN0aW9uIG5vdCB5ZXQgZGVmaW5lZCAtIHN0b3JlIGRhdGEgYW5kIHdhdGNoIGZvciBkZWZpbml0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9pbml0X2RhdGEgPSBkYXRhO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9vcmlnaW5hbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnbXlvcF9pbml0X2ludGVyZmFjZScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3JpZ2luYWwgPSBmbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuX19teW9wX2luaXRfZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0b3JlZERhdGEgPSB3aW5kb3cuX19teW9wX2luaXRfZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgd2luZG93Ll9fbXlvcF9pbml0X2RhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbEluaXRJbnRlcmZhY2UoZm4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9vcmlnaW5hbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG4gICAgICAgICAgICAgICAgZG9jLndyaXRlbG4oY3RhUXVldWVTY3JpcHQgKyBkYXRhU2NyaXB0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSXNvbGF0ZWQgZnJhbWVzOiBpbmplY3QgdGhlIHBvc3RNZXNzYWdlIGJyaWRnZSAoaW5pdCBpbiAvIGN0YSBvdXQgLyBzaXplIG91dCkuXG4gICAgICAgICAgICBpZiAoaXNvbGF0ZSkge1xuICAgICAgICAgICAgICAgIC8vIFNhbWUgcnVsZSBhcyB0aGUgbm9uLWlzb2xhdGVkIHBhdGggYWJvdmU6IG51bGwgaXMgbm8gZGF0YS5cbiAgICAgICAgICAgICAgICBjb25zdCBlc2NhcGVkRGF0YSA9IG9wdGlvbnM/LmRhdGEgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zPy5kYXRhICE9PSBudWxsXG4gICAgICAgICAgICAgICAgICAgID8gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5kYXRhKS5yZXBsYWNlKC88XFwvc2NyaXB0L2dpLCAnXFxcXHUwMDNjL3NjcmlwdCcpXG4gICAgICAgICAgICAgICAgICAgIDogJ3VuZGVmaW5lZCc7XG4gICAgICAgICAgICAgICAgZG9jLndyaXRlbG4odGhpcy5idWlsZElzb2xhdGlvbkJyaWRnZShlc2NhcGVkRGF0YSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkb2MuY2xvc2UoKTtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGNvbnRyb2wgZnJvbSBkYXNoYm9hcmRcbiAgICAgICAgICAgIC8vICAoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZykuYXV0b0hlaWdodCA9IHRydWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbXAgPSBuZXcgTXlvcElmcmFtZUNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICAvLyBJc29sYXRlZDogd2lyZSB0aGUgaG9zdCBzaWRlIG9mIHRoZSBwb3N0TWVzc2FnZSBicmlkZ2UgKGN0YSBpbiwgc2l6ZSBpbiwgaW5pdCBvdXQpLlxuICAgICAgICAgICAgaWYgKGlzb2xhdGUpIGNvbXAuZW5hYmxlSXNvbGF0aW9uKCk7XG5cbiAgICAgICAgICAgIC8vIFN0b3JlIHBhcnNlZCBzaXplTWV0YSBvbiB0aGUgY29tcG9uZW50IHNvIHRoZSBSZWFjdCBob3N0IGNhbiByZWFkIGl0XG4gICAgICAgICAgICBjb21wLnNpemVNZXRhID0gcGFyc2VkU2l6ZU1ldGE7XG5cbiAgICAgICAgICAgIC8vIEF1dG8tc2l6ZTogb2JzZXJ2ZSBjb250ZW50IHNpemUgYW5kIHN5bmMgdG8gaWZyYW1lIGRpbWVuc2lvbnMuXG4gICAgICAgICAgICAvLyBUaGlzIHdvcmtzIGZvciBhbGwgaG9zdHMgKHZhbmlsbGEgU0RLLCBSZWFjdCwgVnVlLCBBbmd1bGFyKS5cbiAgICAgICAgICAgIC8vIElmIGEgZnJhbWV3b3JrIGhvc3QgKGUuZy4gQG15b3AvcmVhY3QpIGFsc28gY2FsbHMgb2JzZXJ2ZUF1dG9TaXplKCksXG4gICAgICAgICAgICAvLyBpdCBjbGVhbmx5IHJlcGxhY2VzIHRoZXNlIG9ic2VydmVycyB2aWEgX2F1dG9TaXplQ2xlYW51cCB0cmFja2luZy5cbiAgICAgICAgICAgIGNvbXAuaW5pdGlhdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmF1dG9TaXplID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBObyBhdXRvLXNpemluZy4gSWZyYW1lIHN0YXlzIHBvc2l0aW9uOmFic29sdXRlIGZpbGxpbmcgY29udGFpbmVyLlxuICAgICAgICAgICAgICAgICAgICAvLyBIb3N0IGlzIGZ1bGx5IHJlc3BvbnNpYmxlIGZvciBjb250YWluZXIgZGltZW5zaW9ucyAoZS5nLiBSZWFjdCBOYXRpdmUgV2ViVmlldykuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHNob3duID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29tcC5vYnNlcnZlQXV0b1NpemUoe1xuICAgICAgICAgICAgICAgICAgICBmb3JjZUF1dG9TaXplOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBvblNpemVDaGFuZ2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNob3cgYWZ0ZXIgZmlyc3QgbWVhc3VyZW1lbnQgY29tcGxldGVzIChub3QgYmVmb3JlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBpZnJhbWUgdHJhbnNpdGlvbnMgZnJvbSBhYnNvbHV0ZSBvdmVybGF5IHRvIGRvY3VtZW50IGZsb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IHRoZSBtZWFzdXJlZCBoZWlnaHQsIHByZXZlbnRpbmcgZmxhc2ggYXQgd3Jvbmcgc2l6ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hvd24gJiYgIW9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3duID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLnNob3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAvLyBjb21wLnByb3BzLl9nbG9iYWwgPSBjb21wLmVsZW1lbnQuY29udGVudFdpbmRvdztcbiAgICAgICAgICAgIHJldHVybiBjb21wO1xuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobG9hZGVyQ29uZmlnLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubm9uZSkge1xuICAgICAgICAgICAgLy8gcGFyc2VyID0gcGFyc2VyID8gcGFyc2VyIDogbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgLy8gY29uc3QgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgICAgLy8gZWxlbWVudCA9IGRvYy5ib2R5LmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAvL2VsZW1lbnQuc2V0QXR0cmlidXRlKCdpZCcsIGRvbUlkKTtcblxuICAgICAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgICAgICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gbG9hZGVyQ29uZmlnLkhUTUw7Ly8udHJpbSgpO1xuICAgICAgICAgICAgZWxlbWVudCA9IHRlbXBsYXRlLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cbiAgICAgICAgICAgIC8vICAgY29uc3QgZmlyc3RFbGVtZW50ID0gdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgICAgIC8vICAgY29uc3QgeiA9IGZpcnN0RWxlbWVudCA/IGZpcnN0RWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgOiBudWxsO1xuICAgICAgICAgICAgLy8gICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vICAgY29uc29sZS5sb2codGVtcGxhdGUsIGZpcnN0RWxlbWVudCwgeilcbiAgICAgICAgICAgIC8vICAgZWxlbWVudCA9IGZpcnN0RWxlbWVudFxuXG4gICAgICAgICAgICAvLyBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0Ym9keScpO1xuICAgICAgICAgICAgLy8gZGVidWdnZXI7XG4gICAgICAgICAgICAvLyBjb250YWluZXIuaW5uZXJIVE1MID0gbG9hZGVyQ29uZmlnLkhUTUw7XG4gICAgICAgICAgICAvLyBlbGVtZW50ID0gY29udGFpbmVyLmZpcnN0RWxlbWVudENoaWxkO1xuXG4gICAgICAgICAgICBnZXRJbml0aWF0ZWRTZGsoKS50aGVuKChzZGspID0+IHtcbiAgICAgICAgICAgICAgICBzZGsuY29ubmVjdGVkQ2FsbGJhY2soZWxlbWVudCwgZWxlbWVudCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY3VzdG9tRWxlbWVudE5hbWUgPSB0b0N1c3RvbUVsZW1lbnROYW1lKGNvbXBvbmVudERlZmluaXRpb24ubmFtZSArIHNraW4uaWQpO1xuXG4gICAgICAgICAgICAvL1RPRE8gOiBzdXBwb3J0IHJlZGVmaW5lICFcbiAgICAgICAgICAgIGlmICghc2Vlbi5pbmNsdWRlcyhjdXN0b21FbGVtZW50TmFtZSkpIHtcbiAgICAgICAgICAgICAgICBjcmVhdGVDdXN0b21XZWJDb21wb25lbnQoY3VzdG9tRWxlbWVudE5hbWUsIGxvYWRlckNvbmZpZy5IVE1MLCBsb2FkZXJDb25maWcuc2hhZG93Um9vdE1vZGUpO1xuICAgICAgICAgICAgICAgIHNlZW4ucHVzaChjdXN0b21FbGVtZW50TmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChjdXN0b21FbGVtZW50TmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAvL2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICBlbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgKGNvbnRhaW5lci5pZC5zdGFydHNXaXRoKCdteW9wLWNvbXAtJykpIHtcbiAgICAgICAgLy8gICAgIC8vIGluIHBsYWNlIHJlcGxhY2VtZW50XG4gICAgICAgIC8vICAgICBjb250YWluZXIucmVwbGFjZVdpdGgoZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAvL2NvbnRhaW5lciA9IGVsZW1lbnQucGFyZW50RWxlbWVudCE7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy9lbGVtZW50LmlubmVySFRNTCA9IGA8JHtjdXN0b21FbGVtZW50TmFtZX0gLz5gO1xuICAgICAgICByZXR1cm4gbmV3IE15b3BXZWJDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgKiBhcyBDU1MgZnJvbSBcImNzc3R5cGVcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi9ob3N0XCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzLnRzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlfSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcblxuLy8gaWdub3JpbmcgZG9jdW1lbnRhdGlvblxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ1NTUHJvcGVydGllcyBleHRlbmRzIENTUy5Qcm9wZXJ0aWVzPHN0cmluZyB8IG51bWJlcj4ge1xufVxuXG5leHBvcnQgdHlwZSBTdHlsZXNoZWV0RGVmaW5pdGlvbiA9IHsgW2tleTogc3RyaW5nXTogQ1NTUHJvcGVydGllcyB9O1xuXG5leHBvcnQgY29uc3QgYXBwbHlTdHlsZXNoZWV0ID0gKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIHN0eWxlc2hlZXQ6IFN0eWxlc2hlZXREZWZpbml0aW9uLCBjc3M/OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB0YWdJZCA9IGBteW9wLWNzcy0ke3V1aWR2NCgpfWA7XG4gICAgY29tcG9uZW50LnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7cm9vdFJlZiwgX3N0eWxlc2hlZXQsIF90YWdJZCwgX2Nzc30pID0+IHtcbiAgICAgICAgY29uc3Qgc3R5bGVUYWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICBzdHlsZVRhZy50eXBlID0gJ3RleHQvY3NzJztcblxuICAgICAgICAvLyBCdWlsZCB0aGUgQ1NTIHN0cmluZyBmcm9tIHRoZSBzdHlsZXMgb2JqZWN0XG4gICAgICAgIGxldCBjc3NTdHJpbmcgPSBfY3NzO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc2VsZWN0b3IgaW4gX3N0eWxlc2hlZXQpIHtcbiAgICAgICAgICAgIGNzc1N0cmluZyArPSBgJHtzZWxlY3Rvcn0geyBgO1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IF9zdHlsZXNoZWV0W3NlbGVjdG9yXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gcHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIGNzc1N0cmluZyArPSBgJHtwcm9wZXJ0eX06ICR7cHJvcGVydGllc1twcm9wZXJ0eV19OyBgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3NzU3RyaW5nICs9ICd9ICc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdGhlIENTUyBzdHJpbmcgYXMgdGhlIGNvbnRlbnQgb2YgdGhlIDxzdHlsZT4gZWxlbWVudFxuICAgICAgICBzdHlsZVRhZy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3NTdHJpbmcpKTtcbiAgICAgICAgc3R5bGVUYWcuaWQgPSBfdGFnSWQ7XG4gICAgICAgIC8vIEFwcGVuZCB0aGUgPHN0eWxlPiBlbGVtZW50XG4gICAgICAgIChyb290UmVmLnNoYWRvd1Jvb3QgfHwgcm9vdFJlZi5jb250YWluZXIpLmFwcGVuZENoaWxkKHN0eWxlVGFnKTtcblxuICAgIH0sICgpID0+IHtcbiAgICB9LCB7XG4gICAgICAgIF9zdHlsZXNoZWV0OiBzdHlsZXNoZWV0LFxuICAgICAgICBfY3NzIDogY3NzID8gY3NzIDogJycsXG4gICAgICAgIF90YWdJZDogdGFnSWRcbiAgICB9KSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKHtyb290UmVmLCBfdGFnSWR9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gKHJvb3RSZWYuc2hhZG93Um9vdCB8fCBkb2N1bWVudCkuZ2V0RWxlbWVudEJ5SWQoX3RhZ0lkKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICB9LCB7XG4gICAgICAgICAgICBfdGFnSWQ6IHRhZ0lkXG4gICAgICAgIH0pKVxuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGFwcGx5U3R5bGVzaGVldExpbmsgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgbGluazogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgdGFnSWQgPSBgbXlvcC1jc3MtJHt1dWlkdjQoKX1gO1xuICAgIGNvbXBvbmVudC5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3Jvb3RSZWYsIF90YWdJZCwgX2xpbmt9KSA9PiB7XG4gICAgICAgIGNvbnN0IGxpbmtFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICBsaW5rRWxlbWVudC5pZCA9IF90YWdJZDtcbiAgICAgICAgbGlua0VsZW1lbnQucmVsID0gJ3N0eWxlc2hlZXQnO1xuICAgICAgICBsaW5rRWxlbWVudC5ocmVmID0gX2xpbms7XG4gICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGlua0VsZW1lbnQpO1xuXG4gICAgICAgIC8vIEFwcGVuZCB0aGUgPHN0eWxlPiBlbGVtZW50XG4gICAgICAgIChyb290UmVmLnNoYWRvd1Jvb3QgfHwgcm9vdFJlZi5jb250YWluZXIpLmFwcGVuZENoaWxkKGxpbmtFbGVtZW50KTtcbiAgICB9LCAoKSA9PiB7XG4gICAgfSwge1xuICAgICAgICBfbGluayA6IGxpbmssXG4gICAgICAgIF90YWdJZDogdGFnSWRcbiAgICB9KSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKHtyb290UmVmLCBfdGFnSWR9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gKHJvb3RSZWYuc2hhZG93Um9vdCB8fCBkb2N1bWVudCkuZ2V0RWxlbWVudEJ5SWQoX3RhZ0lkKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICB9LCB7XG4gICAgICAgICAgICBfdGFnSWQ6IHRhZ0lkXG4gICAgICAgIH0pKVxuICAgIH1cbn1cbiIsICJpbXBvcnQge0lJZnJhbWVMb2FkZXJDb25maWcsIElTa2luQ29uZmlnfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCB0eXBlIFRva2VuTWFwID0gUmVjb3JkPHN0cmluZywgc3RyaW5nfCBudW1iZXI+XG5cbmNvbnN0IHJlcGxhY2VUb2tlbnMgPSAoaW5wdXQ6IHN0cmluZywgdG9rZW5NYXA6IFRva2VuTWFwKTogc3RyaW5nID0+IHtcbiAgICAvLyBDcmVhdGUgYSByZWdleCBwYXR0ZXJuIGZyb20gdGhlIGtleXMgb2YgdGhlIHRva2VuTWFwXG4gICAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAoT2JqZWN0LmtleXModG9rZW5NYXApLmpvaW4oJ3wnKSwgJ2cnKTtcblxuICAgIC8vIFJlcGxhY2UgdG9rZW5zIGluIHRoZSBpbnB1dCBzdHJpbmcgdXNpbmcgdGhlIHJlZ2V4XG4gICAgcmV0dXJuIGlucHV0LnJlcGxhY2UocGF0dGVybiwgKG1hdGNoZWQpID0+IHtcbiAgICAgICAgLy8gUmV0dXJuIHRoZSByZXBsYWNlbWVudCB2YWx1ZSBmcm9tIHRoZSB0b2tlbk1hcFxuICAgICAgICByZXR1cm4gKHRva2VuTWFwW21hdGNoZWRdIHx8IG1hdGNoZWQpLnRvU3RyaW5nKCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVJZnJhbWVTa2luQnlUb2tlbml6ZXIgPSAoc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZywgdG9rZW5NYXA6IFRva2VuTWFwKSA9PiB7XG4gICAgY29uc3QgdHlwZWRTa2luQ29uZmlnID0gKHNlbGVjdGVkU2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZylcbiAgICBpZiAodHlwZWRTa2luQ29uZmlnLnR5cGUgIT09ICdJZnJhbWVMb2FkZXInKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaWZyYW1lU2tpblVybFRva2VuaXplciByZWNlaXZlZCBza2luIHdpdGggbG9hZGVyIHR5cGUgXCIke3R5cGVkU2tpbkNvbmZpZy50eXBlfVwiLCBjdXJyZW50bHkgb25seSBcIklmcmFtZUxvYWRlclwiIGlzIHN1cHBvcnRlZGApXG4gICAgfVxuXG4gICAgc2VsZWN0ZWRTa2luLmxvYWRlciA9IHtcbiAgICAgICAgLi4uc2VsZWN0ZWRTa2luLmxvYWRlclxuICAgIH1cblxuICAgIHNlbGVjdGVkU2tpbi5sb2FkZXIudXJsID0gcmVwbGFjZVRva2VucyhzZWxlY3RlZFNraW4ubG9hZGVyLnVybCwgdG9rZW5NYXApO1xuXG4gICAgcmV0dXJuIHNlbGVjdGVkU2tpbjtcbn1cblxuZXhwb3J0IGNvbnN0IGNoYW5nZVNraW5VcmxCeVRva2VuaXplciA9ICh0b2tlbk1hcDogVG9rZW5NYXApID0+IHtcbiAgICByZXR1cm4gYXN5bmMgKHNlbGVjdGVkU2tpbjogSVNraW5Db25maWcpID0+IHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUlmcmFtZVNraW5CeVRva2VuaXplcihzZWxlY3RlZFNraW4sIHRva2VuTWFwKTtcbiAgICB9XG59IiwgImltcG9ydCB7Q3VzdG9tUmVmTWVzc2FnZX0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vaG9zdFwiO1xuXG4vLyBjb25zdCBzcGFjZSA9ICcgJztcbi8vIGV4cG9ydCBjb25zdCBnZXRDbGFzc2VzID0gYXN5bmMgKGNvbm5lY3RlZFJlZjogUmVmKTogUHJvbWlzZTxzdHJpbmdbXT4gPT4gKGF3YWl0IGV4ZWMoYWN0QXM8SFRNTERpdkVsZW1lbnQ+KGNvbm5lY3RlZFJlZikuY2xhc3NMaXN0KSkudmFsdWUuc3BsaXQoc3BhY2UpO1xuLy8gZXhwb3J0IGNvbnN0IGFkZENsYXNzID0gYXN5bmMgKGNvbm5lY3RlZFJlZjogUmVmLCBjbGFzc05hbWU6IHN0cmluZykgPT4ge1xuLy8gICAgIGNvbnN0IGNsYXNzZXMgPSBhd2FpdCBnZXRDbGFzc2VzKGNvbm5lY3RlZFJlZik7XG4vLyAgICAgY2xhc3Nlcy5pbmNsdWRlcyhjbGFzc05hbWUpIHx8IGNsYXNzZXMucHVzaChjbGFzc05hbWUpO1xuLy8gICAgIC8vIEB0cy1pZ25vcmVcbi8vICAgICBjb25uZWN0ZWRSZWYuY2xhc3NMaXN0ID0gY2xhc3Nlcy5qb2luKHNwYWNlKTtcbi8vIH1cbi8vIGV4cG9ydCBjb25zdCByZW1vdmVDbGFzcyA9IGFzeW5jIChjb25uZWN0ZWRSZWY6IFJlZiwgY2xhc3NOYW1lOiBzdHJpbmcsKSA9PiB7XG4vLyAgICAgbGV0IGNsYXNzZXMgPSBhd2FpdCBnZXRDbGFzc2VzKGNvbm5lY3RlZFJlZik7XG4vLyAgICAgLy8gQHRzLWlnbm9yZVxuLy8gICAgIGNvbm5lY3RlZFJlZi5jbGFzc0xpc3QgPSBjbGFzc2VzLmZpbHRlcihjID0+IGMgIT09IGNsYXNzTmFtZSkuam9pbihzcGFjZSk7XG4vLyB9XG4vL1xuLy9cblxuZXhwb3J0IGNvbnN0IGFkZENsYXNzID0gKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIGNsYXNzTmFtZTogc3RyaW5nLCBteW9wSWQ6IHN0cmluZykgPT4ge1xuICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDdXN0b21SZWZNZXNzYWdlKCh7cmVmLCBfY2xhc3NOYW1lfSkgPT4ge1xuICAgICAgICByZWY/LmNsYXNzTGlzdC5hZGQoX2NsYXNzTmFtZSk7XG4gICAgfSwge1xuICAgICAgICBlbGVtZW50SWQ6IG15b3BJZCxcbiAgICAgICAgX2NsYXNzTmFtZTogY2xhc3NOYW1lXG4gICAgfSkpO1xufVxuXG5leHBvcnQgY29uc3QgcmVtb3ZlQ2xhc3MgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgY2xhc3NOYW1lOiBzdHJpbmcsIG15b3BJZDogc3RyaW5nKSA9PiB7XG4gICAgY29tcG9uZW50LnNlbmQobmV3IEN1c3RvbVJlZk1lc3NhZ2UoKHtyZWYsIF9jbGFzc05hbWV9KSA9PiB7XG4gICAgICAgIHJlZj8uY2xhc3NMaXN0LnJlbW92ZShfY2xhc3NOYW1lKTtcbiAgICB9LCB7XG4gICAgICAgIGVsZW1lbnRJZDogbXlvcElkLFxuICAgICAgICBfY2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgICB9KSk7XG59IiwgImltcG9ydCB7XG4gICAgSUNvbXBvbmVudENvbmZpZyxcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJQ29tcG9uZW50SW5zdGFuY2VDb25maWcsIElIVE1MTG9hZGVyQ29uZmlnLCBJUmVmQ29uZmlnLFxuICAgIElTa2luTG9hZGVyQ29uZmlnLFxuICAgIElTa2luU2VsZWN0b3JDb25maWcsXG4gICAgSURlZGljYXRlZFNraW5Db25maWcsIElTa2luQ29uZmlnXG59IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vdXRpbHMvdXRpbHMudHNcIjtcblxuZXhwb3J0IGNsYXNzIFNraW5Db25maWcgaW1wbGVtZW50cyBJU2tpbkNvbmZpZyB7XG4gICAgX3J1blRpbWVJbnN0YW5jZUlkID0gJ3J1bnRpbWUtaW5zdGFuY2UtaWQtJyArIHV1aWR2NCgpO1xuICAgIF9ydW5UaW1lSWQgPSAncnVudGltZS1pZC0nICsgdXVpZHY0KCk7XG4gICAgX3J1blRpbWVOYW1lID0gJ3J1bnRpbWUtbmFtZS0nICsgdXVpZHY0KCk7XG5cbiAgICBzdGF0aWMgY3JlYXRlID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFNraW5Db25maWcoKTtcbiAgICB9XG5cbiAgICBpZCA9IHRoaXMuX3J1blRpbWVJZDtcbiAgICBuYW1lID0gdGhpcy5fcnVuVGltZU5hbWU7XG4gICAgZGVzY3JpcHRpb24gPSAnJztcbiAgICBsb2FkZXIgPSBudWxsIGFzIHVua25vd24gYXMgSVNraW5Mb2FkZXJDb25maWc7XG5cbiAgICB3aXRoTG9hZGVyID0gKGxvYWRlcjogSVNraW5Mb2FkZXJDb25maWcpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkZXIgPSBsb2FkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhIVE1MTG9hZGVyID0gKGxvYWRlcjogT21pdDxJSFRNTExvYWRlckNvbmZpZywgJ3R5cGUnPikgPT4ge1xuICAgICAgICBsb2FkZXIudHlwZSA9ICdIVE1MTG9hZGVyJztcbiAgICAgICAgdGhpcy5sb2FkZXIgPSBsb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGJ1aWxkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wb25lbnRDb25maWcgaW1wbGVtZW50cyBJQ29tcG9uZW50Q29uZmlnIHtcbiAgICBfcnVuVGltZUluc3RhbmNlSWQgPSAncnVudGltZS1pbnN0YW5jZS1pZC0nICsgdXVpZHY0KCk7XG4gICAgX3J1blRpbWVJZCA9ICdydW50aW1lLWlkLScgKyB1dWlkdjQoKTtcbiAgICBfcnVuVGltZU5hbWUgPSAncnVudGltZS1uYW1lLScgKyB1dWlkdjQoKTtcblxuICAgIHN0YXRpYyBjcmVhdGUgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50Q29uZmlnKCk7XG4gICAgfVxuXG4gICAgaW5zdGFuY2UgPSB7XG4gICAgICAgIGlkOiB0aGlzLl9ydW5UaW1lSW5zdGFuY2VJZCxcbiAgICAgICAgY29tcG9uZW50SWQ6IHRoaXMuX3J1blRpbWVJZCxcbiAgICAgICAgY29tcG9uZW50TmFtZTogdGhpcy5fcnVuVGltZU5hbWUsXG4gICAgICAgIHNraW5TZWxlY3RvcjogbnVsbCBhcyB1bmtub3duIGFzIElTa2luU2VsZWN0b3JDb25maWdcbiAgICB9IGFzIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZztcblxuICAgIG5hbWUgPSB0aGlzLl9ydW5UaW1lTmFtZVxuICAgIHR5cGUgPSB7XG4gICAgICAgIGlkOiB0aGlzLl9ydW5UaW1lSWQsXG4gICAgICAgIG5hbWU6IHRoaXMuX3J1blRpbWVOYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgIHByb3BzOiBbXSxcbiAgICAgICAgcmVmczogW10sXG4gICAgICAgIHNraW5zOiBbXSxcbiAgICAgICAgZGVmYXVsdFNraW46IDBcbiAgICB9IGFzIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG5cbiAgICB3aXRoSW5zdGFuY2UgPSAoaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZykgPT4ge1xuICAgICAgICB0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhUeXBlID0gKHR5cGU6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhOYW1lID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB3aXRoRGVmYXVsdFNraW4gPSAoZGVmYXVsdFNraW46IElTa2luQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMudHlwZS5za2lucy5wdXNoKGRlZmF1bHRTa2luKTtcbiAgICAgICAgdGhpcy50eXBlLmRlZmF1bHRTa2luID0gdGhpcy50eXBlLnNraW5zLmxlbmd0aCAtIDE7XG4gICAgICAgIHRoaXMuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0ge1xuICAgICAgICAgICAgdHlwZTogJ0RlZGljYXRlZCcsXG4gICAgICAgICAgICBza2luOiB7XG4gICAgICAgICAgICAgICAgaWQ6IGRlZmF1bHRTa2luLmlkXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gYXMgSURlZGljYXRlZFNraW5Db25maWdcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB3aXRoUmVmID0gKHJlZjogSVJlZkNvbmZpZykgPT4ge1xuICAgICAgICB0aGlzLnR5cGUucmVmcy5wdXNoKHJlZik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhCYXNpY1JlZiA9IChyZWZTZWxlY3Rvcjogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0Jhc2ljUmVmID0ge1xuICAgICAgICAgICAgaWQ6ICcnLFxuICAgICAgICAgICAgbmFtZTogcmVmU2VsZWN0b3IsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgICAgICBzZWxlY3RvclR5cGU6ICdpZC1hdHRyaWJ1dGUnLFxuICAgICAgICAgICAgc2VsZWN0b3I6IHJlZlNlbGVjdG9yLFxuICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnY29kZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBJUmVmQ29uZmlnXG5cbiAgICAgICAgdGhpcy50eXBlLnJlZnMucHVzaChuZXdCYXNpY1JlZik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGJ1aWxkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzKSlcbiAgICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IGV4ZWMgPSBhc3luYyAoZ2V0dGVyOiBhbnkpID0+IHtcbiAgICByZXR1cm4gYXdhaXQgZ2V0dGVyKClcbn1cbiIsICJleHBvcnQgKiBmcm9tIFwiLi9hcHBseVN0eWxlc2hlZXRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2lmcmFtZVNraW5VcmxUb2tlbml6ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NsYXNzTGlzdFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uZmlnQnVpbGRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vQ2xvdWRSZXBvc2l0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9leGVjXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jbG91ZFJlcG9zaXRvcnlIZWxwZXJzXCI7IiwgImltcG9ydCB7ZGVjb21wcmVzc1VVSURzfSBmcm9tIFwiLi4vdXRpbHMvdXVpZC50c1wiO1xuaW1wb3J0IHtDbG91ZFJlcG9zaXRvcnl9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQge1xuICAgIEV4cGVyaWVuY2VUeXBlcyxcbiAgICBJQ29tcG9uZW50Q29uZmlnLCBJRGVkaWNhdGVkU2tpbkNvbmZpZyxcbiAgICBJU2VnbWVudGVkU2tpbkNvbmZpZyxcbiAgICBJU2VnbWVudEV4cGVyaWVuY2UsIElTa2luSW5zdGFuY2VDb25maWcsXG4gICAgU2tpblNlbGVjdG9yVHlwZXNcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY29uc3QgY2hlY2tNeW9wT3ZlcnJpZGUgPSBhc3luYyAoY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnKTogUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnIHwgbnVsbD4gPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIC8vVE9ETzogc3VwcG9ydCBkaXNhYmxpbmcgdGhlIG1lY2hhbmlzbVxuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh1cmwuc2VhcmNoKTtcbiAgICAgICAgY29uc3QgbXlvcE92ZXJyaWRlID0gcGFyYW1zLmdldCgnbXlvcE92ZXJyaWRlJyk7XG4gICAgICAgIGlmIChteW9wT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IFtzb3VyY2UsIC4uLnV1aWRzXSA9IGRlY29tcHJlc3NVVUlEcyhteW9wT3ZlcnJpZGUpO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NvbXBvbmVudCc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2NvbXBvbmVudElkLCBza2luSWRdID0gdXVpZHM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFRvT3ZlcnJpZGUgPSBhd2FpdCBDbG91ZFJlcG9zaXRvcnkuTWFpbi5mZXRjaENvbXBvbmVudChjb21wb25lbnRJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2RvOiBjaGVjayBmZXRjaEF1dG9GbG93LiBMb29rcyBsaWtlIG9ubHkgb25lIHNraW4gaXMgcmV0dXJuZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNraW4gPSBjb21wb25lbnRUb092ZXJyaWRlLnR5cGUuc2tpbnMuZmluZChza2luID0+IHNraW4uaWQgPT09IHNraW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2tpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvZG86IGZvciBub3cganVzdCBzZXQgc2tpbiBpZC4gQ2hlY2sgdGhlIGNsb3VkIGltcGxlbWVudGF0aW9uXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3RvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2luOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogc2tpbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgSVNraW5JbnN0YW5jZUNvbmZpZ1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRUb092ZXJyaWRlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLy8gICAgY2FzZSAnZmxvdyc6IHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0IDoge1xuICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IFtmbG93SWQsIGV4cGVyaW1lbnRJZF0gPSB1dWlkcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2Zsb3dJZCwgZXhwZXJpbWVudElkXSA9IGRlY29tcHJlc3NVVUlEcyhteW9wT3ZlcnJpZGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG93ID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hGbG93KGZsb3dJZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFRvT3ZlcnJpZGUgPSBmbG93LmNvbXBvbmVudHMuZmluZChjID0+IGMudHlwZS5pZCA9PT0gY29tcG9uZW50Q29uZmlnLnR5cGUuaWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yLnR5cGUgPT09IFNraW5TZWxlY3RvclR5cGVzLlNlZ21lbnRlZCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2UucmVzb2x2ZWRFeHBlcmllbmNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZEV4cGVyaWVuY2UgPSBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnJlc29sdmVkRXhwZXJpZW5jZXMuZmluZChlID0+IGUuaWQgPT09IGV4cGVyaW1lbnRJZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkRXhwZXJpZW5jZT8udHlwZSA9PT0gRXhwZXJpZW5jZVR5cGVzLlNlZ21lbnQpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRSZXNvbHZlZEV4cGVyaWVuY2UgPSByZXNvbHZlZEV4cGVyaWVuY2UgYXMgSVNlZ21lbnRFeHBlcmllbmNlXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkU2tpblNlbGVjdG9yID0gY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IgYXMgSVNlZ21lbnRlZFNraW5Db25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0eXBlZFNraW5TZWxlY3Rvci5zZWdtZW50cy5maW5kKHMgPT4gcy5zZWdtZW50SWQgPT09IHR5cGVkUmVzb2x2ZWRFeHBlcmllbmNlLnNlZ21lbnQuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3RvciA9IHNlZ21lbnQ/LnNraW5TZWxlY3RvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50VG9PdmVycmlkZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59IiwgIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBUaGUgSG9zdCBTREsgaXMgZGVzaWduZWQgZm9yIGludGVncmF0aW9uIHdpdGhpbiB0aGUgaG9zdCBhcHBsaWNhdGlvbiB0aGF0IHNlcnZlcyBhcyB0aGUgY29udGFpbmVyIGZvciBNeW9wICBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIEl0IHByb3ZpZGVzIGVzc2VudGlhbCBmdW5jdGlvbmFsaXRpZXMgYW5kIEFQSXMgZm9yIHJlZ2lzdGVyaW5nLCBtYW5hZ2luZywgYW5kIGNvbW11bmljYXRpbmcgd2l0aCBNeW9wIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogVGhpcyBTREsgZW5hYmxlcyBzZWFtbGVzcyBlbWJlZGRpbmcgb2YgaW5kZXBlbmRlbnRseSBkZXZlbG9wZWQgY29tcG9uZW50cyBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uLCBlbnN1cmluZyBzbW9vdGggaW50ZXJvcGVyYWJpbGl0eSBhbmQgY29uc2lzdGVudCB1c2VyIGV4cGVyaWVuY2UgYWNyb3NzIHZhcmlvdXMgTXlvcCBjb21wb25lbnQgaW1wbGVtZW50YXRpb25zLlxuICovXG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcbmltcG9ydCB7SU15b3BMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvSU15b3BMb2FkZXJcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgRW52ZWxvcGVkTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCxcbiAgICBJbml0TWVzc2FnZSxcbiAgICBJbml0UmVzcG9uc2UsIE1lc3NhZ2VEaXJlY3Rpb24sIFJlZlxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7TXlvcElmcmFtZUxvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy9pZnJhbWVMb2FkZXJcIjtcbmltcG9ydCB7V2ViY29tcG9uZW50TG9hZGVyfSBmcm9tIFwiLi9sb2FkZXJzL3dlYmNvbXBvbmVudExvYWRlclwiO1xuaW1wb3J0IHtSZW5kZXJQb2xpY3l9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB0eXBlIHtJZnJhbWVTREt9IGZyb20gXCIuLi9JZnJhbWVcIjtcbmltcG9ydCB7Y29ubmVjdFByb3BzLCBjb25uZWN0UmVmcywgY3JlYXRlUmVmQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRDb3JlXCI7XG5pbXBvcnQge1xuICAgIEV4cGVyaWVuY2VUeXBlcyxcbiAgICBJQ29tcG9uZW50Q29uZmlnLFxuICAgIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElEZWRpY2F0ZWRTa2luQ29uZmlnLCBJRXhwZXJpZW5jZSwgSUZ1bmN0aW9uUmVzdWx0c1NlZ21lbnQsIElTZWdtZW50ZWRTa2luQ29uZmlnLCBJU2VnbWVudEV4cGVyaWVuY2UsXG4gICAgSVNraW5Db25maWcsIElTa2luU2VsZWN0b3JDb25maWcsIFNraW5TZWxlY3RvclR5cGVzLFxuXG5cbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuLy8gQHRzLWlnbm9yZSBoYW5kbGVkIGJ5IGN1c3RvbSBlc2J1aWxkIHBsdWdpblxuaW1wb3J0IHZlcnNpb24gZnJvbSBcIm15b3Atc2RrLXZlcnNpb25cIjtcbmltcG9ydCB7ZGVsaXZlcnksIGRlbGl2ZXJ5T2ZmLCBkZWxpdmVyeVJlZnJlc2gsIGRlbGl2ZXJ5U3RhdHN9IGZyb20gXCIuLi9oZWxwZXJzL2Nsb3VkUmVwb3NpdG9yeUhlbHBlcnNcIjtcbmltcG9ydCB7SFRNTENvbXBvbmVudExvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy9IVE1MQ29tcG9uZW50TG9hZGVyXCI7XG5pbXBvcnQge2NoZWNrTXlvcE92ZXJyaWRlfSBmcm9tIFwiLi9teW9wT3ZlcnJpZGUudHNcIjtcblxuaW50ZXJmYWNlIGNvbXBvbmVudExvYWRlckNyZWF0b3Ige1xuICAgIG5ldyhsb2FkZXJzOiBJTXlvcExvYWRlcltdKTogYW55O1xufVxuXG4vLyBjb25zdCBnZXRDb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gYXN5bmMgKGlkOiBzdHJpbmcpID0+IHtcbi8vICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgaHR0cDovL2xvY2FsaG9zdDozMDAwL2NvbXBvbmVudD9pZD0ke2lkfWApO1xuLy8gICAgIGNvbnN0IGNvbXBvbmVudERlZjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcgPSAoYXdhaXQgcmVzLmpzb24oKSkuaXRlbTtcbi8vICAgICByZXR1cm4gY29tcG9uZW50RGVmXG4vLyB9XG5cbi8vY29uc3QgX19ST09UX1NES19QVUJMSUNfVVJMX18gPSAnaHR0cHM6Ly9kZmRsazJwMW0xODd2LmNsb3VkZnJvbnQubmV0L215b3Bfc2RrLm1pbi5qcydcbmNvbnN0IF9fUk9PVF9TREtfUFVCTElDX1VSTF9fID0gJ2h0dHBzOi8vY2RuLm15b3AuZGV2L3Nkay9uZXh0L215b3Bfc2RrLm1pbi5qcydcblxuLyoqXG4gKiBUaGUgSG9zdCBTREsgaXMgZGVzaWduZWQgZm9yIGludGVncmF0aW9uIHdpdGhpbiB0aGUgaG9zdCBhcHBsaWNhdGlvbiB0aGF0IHNlcnZlcyBhcyB0aGUgY29udGFpbmVyIGZvciBNeW9wICBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIEl0IHByb3ZpZGVzIGVzc2VudGlhbCBmdW5jdGlvbmFsaXRpZXMgYW5kIEFQSXMgZm9yIHJlZ2lzdGVyaW5nLCBtYW5hZ2luZywgYW5kIGNvbW11bmljYXRpbmcgd2l0aCBNeW9wIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogVGhpcyBTREsgZW5hYmxlcyBzZWFtbGVzcyBlbWJlZGRpbmcgb2YgaW5kZXBlbmRlbnRseSBkZXZlbG9wZWQgY29tcG9uZW50cyBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uLCBlbnN1cmluZyBzbW9vdGggaW50ZXJvcGVyYWJpbGl0eSBhbmQgY29uc2lzdGVudCB1c2VyIGV4cGVyaWVuY2UgYWNyb3NzIHZhcmlvdXMgTXlvcCBjb21wb25lbnQgaW1wbGVtZW50YXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgSG9zdFNESyB7XG4gICAgc3RhdGljIEluc3RhbmNlID0gKCkgPT4gd2luZG93Lm15b3AuaG9zdFNESztcblxuICAgIGNvbXBvbmVudHMyaW5pdDogSU15b3BDb21wb25lbnRbXSA9IFtdO1xuICAgIGNvbXBvbmVudHM6IElNeW9wQ29tcG9uZW50W10gPSBbXTtcbiAgICBjb21wb25lbnRzTG9hZGVyczogSU15b3BMb2FkZXJbXSA9IFtdO1xuXG4gICAgLy8gR2xvYmFsIHJlbmRlciBwb2xpY3kgKGFsbG93L2RlbnkvbW9kZSBnYXRlKS4gQSBwZXItY2FsbCBvcHRpb25zLnJlbmRlclBvbGljeVxuICAgIC8vIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGlzIFx1MjAxNCBzZWUgSFRNTENvbXBvbmVudExvYWRlci5yZXNvbHZlUmVuZGVyTW9kZS5cbiAgICBwcml2YXRlIF9yZW5kZXJQb2xpY3k/OiBSZW5kZXJQb2xpY3k7XG4gICAgcHVibGljIHNldFJlbmRlclBvbGljeSA9IChwb2xpY3k/OiBSZW5kZXJQb2xpY3kpID0+IHsgdGhpcy5fcmVuZGVyUG9saWN5ID0gcG9saWN5OyB9O1xuICAgIHB1YmxpYyBnZXRSZW5kZXJQb2xpY3kgPSAoKTogUmVuZGVyUG9saWN5IHwgdW5kZWZpbmVkID0+IHRoaXMuX3JlbmRlclBvbGljeTtcblxuICAgIHB1YmxpYyBpbml0aWF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyB2ZXJzaW9uID0gdmVyc2lvbjtcblxuICAgIHR5cGUySW5zdGFuY2VDb3VudDogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIHB1YmxpYyBhc3NpZ25JZCA9IChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZykgPT4ge1xuICAgICAgICBpZiAoIXRoaXMudHlwZTJJbnN0YW5jZUNvdW50W2NvbXBvbmVudERlZmluaXRpb24uaWRdKSB7XG4gICAgICAgICAgICB0aGlzLnR5cGUySW5zdGFuY2VDb3VudFtjb21wb25lbnREZWZpbml0aW9uLmlkXSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke2NvbXBvbmVudERlZmluaXRpb24uaWR9XyR7Kyt0aGlzLnR5cGUySW5zdGFuY2VDb3VudFtjb21wb25lbnREZWZpbml0aW9uLmlkXX1gO1xuICAgIH1cblxuICAgIC8vVE9ETyA6IGZpeCB0aGUgaW5zcGVjdCBpbXBsZW1lbnRhdGlvbiBpbnNpZGUgcmVmQ29tcG9uZW50XG4gICAgLy90aGVuIGluc3BlY3RlZCBtYXliZSBjYW4gYmUgZHJvcHBlZFxuICAgIHByaXZhdGUgaW5zcGVjdGVkID0gZmFsc2U7XG4gICAgcHVibGljIGluc3BlY3QgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmluc3BlY3RlZClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0aGlzLmluc3BlY3RlZCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzLmZvckVhY2goY29tcG9uZW50ID0+IHtcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQuaW5zcGVjdCkge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbnNwZWN0KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBBIGNvbXBvbmVudCdzIG9yaWdpbiBpcyB3aGF0ZXZlciBpdHMgaWZyYW1lIFVSTCBpcywgc28gYW4gb3JpZ2luIGFsbG93bGlzdCBjYW4ndCB3b3JrIGhlcmUuXG4gICAgLy8gSW5zdGVhZCBvbmx5IGZyYW1lcyB0aGlzIFNESyBjcmVhdGVkIChvciBhZG9wdGVkKSBtYXkgdGFsayB0byBpdC4gYHNlbmQoKWAgZGlzcGF0Y2hlc1xuICAgIC8vIHN5bnRoZXRpYyBldmVudHMsIHdoaWNoIGhhdmUgbm8gc291cmNlLlxuICAgIHByaXZhdGUgaXNUcnVzdGVkU291cmNlID0gKHNvdXJjZTogTWVzc2FnZUV2ZW50U291cmNlIHwgbnVsbCkgPT4ge1xuICAgICAgICBpZiAoIXNvdXJjZSB8fCBzb3VyY2UgPT09IHdpbmRvdykgcmV0dXJuIHRydWU7XG4gICAgICAgIGNvbnN0IGlzT3duRnJhbWUgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGNvbXBvbmVudC5lbGVtZW50IGFzIEhUTUxJRnJhbWVFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ/Lm5vZGVOYW1lID09PSAnSUZSQU1FJyAmJiBlbGVtZW50LmNvbnRlbnRXaW5kb3cgPT09IHNvdXJjZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50cy5zb21lKGlzT3duRnJhbWUpIHx8IHRoaXMuY29tcG9uZW50czJpbml0LnNvbWUoaXNPd25GcmFtZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbmNvbWluZ01lc3NhZ2VIYW5kbGVyID0gKGV2ZW50OiBNZXNzYWdlRXZlbnQ8QmFzZU15b3BNZXNzYWdlPikgPT4ge1xuICAgICAgICBpZiAoIWV2ZW50LmRhdGE/Lm15b3ApIHJldHVybjtcblxuICAgICAgICBpZiAoIXRoaXMuaXNUcnVzdGVkU291cmNlKGV2ZW50LnNvdXJjZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5kYXRhLm15b3ApIHtcbiAgICAgICAgICAgIGlmIChldmVudC5kYXRhLmRpcmVjdGlvbiAhPT0gTWVzc2FnZURpcmVjdGlvbi51cCAmJiBldmVudC5kYXRhLm1lc3NhZ2VUeXBlICE9PSBNeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ21lc3NhZ2UgZHJvcHBlZCBpbiBob3N0c2RrLCBkaXJlY3Rpb24gd2FzICcsIGV2ZW50LmRhdGEuZGlyZWN0aW9uKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZXZlbnQgb24gaG9zdCBzaWRlIFwiLCBldmVudCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG15b3BNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UgPSBldmVudC5kYXRhO1xuXG4gICAgICAgICAgICBpZiAobXlvcE1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbml0UmVxdWVzdCkge1xuICAgICAgICAgICAgICAgIC8vIEFOU1dFUiBUSEUgRlJBTUUgVEhBVCBBU0tFRCwgTk9UIEVWRVJZIFBFTkRJTkcgQ09NUE9ORU5ULlxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gYGV2ZW50LnNvdXJjZWAgbmFtZXMgdGhlIGFza2luZyBmcmFtZSwgYW5kIGlnbm9yaW5nIGl0IG1hZGUgdGhlIGFuc3dlciBhXG4gICAgICAgICAgICAgICAgLy8gYnJvYWRjYXN0OiBuIGNvbXBvbmVudHMgZWFjaCBhbm5vdW5jZSBvbmNlLCBhbmQgZWFjaCBhbm5vdW5jZSByZS1zZW50XG4gICAgICAgICAgICAgICAgLy8gSW5pdE1lc3NhZ2UgdG8gYWxsIG4gcGVuZGluZywgc28gYSBwYWdlIHBhaWQgbl4yIHBvc3RNZXNzYWdlcyBkdXJpbmcgdGhlXG4gICAgICAgICAgICAgICAgLy8gZXhhY3Qgd2luZG93IGl0IHdhcyBidXNpZXN0IGJvb3RpbmcgZnJhbWVzLiBNZWFzdXJlZCBvbiBhIDEyLWNvbXBvbmVudFxuICAgICAgICAgICAgICAgIC8vIHBhZ2UgKFBpYy1UaW1lJ3Mgc2hhcGUpOiAxNDQgSW5pdE1lc3NhZ2VzIHdoZXJlIDEyIHdlcmUgbmVlZGVkLlxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gKEEgZnJhbWUtc2lkZSByZXRyeSBsb29wIGJyaWVmbHkgZXhpc3RlZCBoZXJlIHRvbzsgaXQgd2FzIHJlbW92ZWQgYXNcbiAgICAgICAgICAgICAgICAvLyBkZWFkIHdlaWdodCBvbmNlIGZpeCAxIGxhbmRlZC4gVGFyZ2V0aW5nIG1lYW5zIGEgcmVwZWF0IGFubm91bmNlLCBmcm9tXG4gICAgICAgICAgICAgICAgLy8gYW55IGZ1dHVyZSBzb3VyY2UsIGNvc3RzIG9uZSBtZXNzYWdlIHJhdGhlciB0aGFuIG4uKVxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gRkFMTCBCQUNLIFRPIFRIRSBCUk9BRENBU1Qgd2hlbiB0aGUgc291cmNlIGNhbm5vdCBiZSBtYXRjaGVkIHRvIGEgZnJhbWUuXG4gICAgICAgICAgICAgICAgLy8gYHNlbmQoKWAgZGlzcGF0Y2hlcyBzeW50aGV0aWMgZXZlbnRzLCB3aGljaCBjYXJyeSBubyBzb3VyY2UsIGFuZCBhIHdlYlxuICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudCdzIEluaXRSZXF1ZXN0IGNvbWVzIGZyb20gYHdpbmRvd2AgaXRzZWxmIC0tIG5laXRoZXIgaGFzIGFcbiAgICAgICAgICAgICAgICAvLyBjb250ZW50V2luZG93IHRvIG1hdGNoLCBhbmQgYm90aCBtdXN0IGtlZXAgd29ya2luZyBleGFjdGx5IGFzIGJlZm9yZS5cbiAgICAgICAgICAgICAgICBjb25zdCBmcm9tQXNraW5nRnJhbWUgPSB0aGlzLmNvbXBvbmVudHMyaW5pdC5maWx0ZXIoY29tcG9uZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGNvbXBvbmVudC5lbGVtZW50IGFzIEhUTUxJRnJhbWVFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudD8ubm9kZU5hbWUgPT09ICdJRlJBTUUnICYmIGVsZW1lbnQuY29udGVudFdpbmRvdyA9PT0gZXZlbnQuc291cmNlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldHMgPSBmcm9tQXNraW5nRnJhbWUubGVuZ3RoID8gZnJvbUFza2luZ0ZyYW1lIDogdGhpcy5jb21wb25lbnRzMmluaXQ7XG4gICAgICAgICAgICAgICAgdGFyZ2V0cy5mb3JFYWNoKGNvbXBvbmVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBJbml0TWVzc2FnZShjb21wb25lbnQuaWQpKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG15b3BNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdFJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gY29tcG9uZW50cyAyIGluaXRcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQgPSB0aGlzLmNvbXBvbmVudHMyaW5pdC5maWx0ZXIoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCAhPT0gKG15b3BNZXNzYWdlIGFzIEluaXRSZXNwb25zZSkuY29udGVudC5pZClcblxuICAgICAgICAgICAgICAgIGNvbnN0IGluaXRpYXRlZENvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IChteW9wTWVzc2FnZSBhcyBJbml0UmVzcG9uc2UpLmNvbnRlbnQ/LmlkKTtcbiAgICAgICAgICAgICAgICBpbml0aWF0ZWRDb21wb25lbnQ/LnNldEluaXRpYXRlZCgpXG4gICAgICAgICAgICAgICAgLy9pbml0aWF0ZWRDb21wb25lbnQ/LnBhcmVudD8uc2V0SW5pdGlhdGVkKCk7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyA6IGlzIGl0IHRydWUgdG8gbm90IHBhc3MgZnVydGhlciAoIHRvIHRoZSBjb21wb25lbnQgKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG15b3BNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gbXlvcE1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IHR5cGVkTWVzc2FnZS5kZXN0aW5hdGlvbik7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVmQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZE1lc3NhZ2UuZGlyZWN0aW9uID09PSBNZXNzYWdlRGlyZWN0aW9uLmRvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZE1lc3NhZ2UubWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gRXhlY3V0ZUNvbXBvbmVudE1ldGhvZC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50Lm9uTWVzc2FnZVJlY2VpdmVkKHR5cGVkTWVzc2FnZS5tZXNzYWdlKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVkTWVzc2FnZS5tZXNzYWdlLnJvdXRlID0gdHlwZWRNZXNzYWdlLnJvdXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5zZW5kKHR5cGVkTWVzc2FnZS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzLmZpbmQoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCA9PT0gdHlwZWRNZXNzYWdlLm1lc3NhZ2UuZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5uZXJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyQ29tcG9uZW50LnNlbmQodHlwZWRNZXNzYWdlLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIDogbG9nID9cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgLy9jb21wb25lbnQucmVmcy5ib2R5Lm9uTWVzc2FnZVJlY2VpdmVkKG15b3BNZXNzYWdlLm1lc3NhZ2UpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSBteW9wTWVzc2FnZS5kZXN0aW5hdGlvbik7XG5cbiAgICAgICAgICAgIGlmICghY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgLy9ubyBpbiBtZW0gY29tcG9uZW50XG4gICAgICAgICAgICAgICAgLy9wYXNzIHRvIHBhcmVudCBIb3N0U0RLIHRvIHRyeSBwcm9jZXNzIHRoZXJlXG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5teW9wLklmcmFtZVNESykge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcC5JZnJhbWVTREsubWVzc2FnZVRvSG9zdChteW9wTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQub25NZXNzYWdlUmVjZWl2ZWQobXlvcE1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL25vdCBwcm9jZXNzZWQgaW4gb25NZXNzYWdlUmVjZWl2ZWRcbiAgICAgICAgICAgICAgICAgICAgLy9wYXNzIHRvIHBhcmVudCBIb3N0U0RLIHRvIHRyeSBwcm9jZXNzIHRoZXJlXG4gICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cubXlvcC5JZnJhbWVTREspXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcC5JZnJhbWVTREsubWVzc2FnZVRvSG9zdChteW9wTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZXZlbnQuc291cmNlLnBvc3RNZXNzYWdlKFxuICAgICAgICAvLyAgICAgXCJoaSB0aGVyZSB5b3Vyc2VsZiEgIHRoZSBzZWNyZXQgcmVzcG9uc2UgXCIgKyBcImlzOiByaGVlZWVldCFcIixcbiAgICAgICAgLy8gICAgIGV2ZW50Lm9yaWdpbixcbiAgICAgICAgLy8gICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBzeW50aGV0aWNFdmVudCA9IG5ldyBNZXNzYWdlRXZlbnQ8QmFzZU15b3BNZXNzYWdlPignJyxcbiAgICAgICAgICAgIHtkYXRhOiBtZXNzYWdlfVxuICAgICAgICApXG5cbiAgICAgICAgdGhpcy5pbmNvbWluZ01lc3NhZ2VIYW5kbGVyKHN5bnRoZXRpY0V2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdCA9IChjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycz86IGNvbXBvbmVudExvYWRlckNyZWF0b3JbXSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pbml0aWF0ZWQpIHtcbiAgICAgICAgICAgIC8vIGdldEhvc3RNb2R1bGUoKSBhbHJlYWR5IGluaXRpYXRlcyB0aGUgU0RLLCBhbmQgdGhlIFJFQURNRSB0ZWxscyBob3N0cyB0byBjYWxsIGluaXQoKVxuICAgICAgICAgICAgLy8gYWZ0ZXIgaXQuIE9ubHkgbWVyZ2UgY3VzdG9tIGxvYWRlcnM7IHRoZSBtZXNzYWdlIGxpc3RlbmVyIGlzIGFscmVhZHkgYXR0YWNoZWQuXG4gICAgICAgICAgICBpZiAoY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyTG9hZGVycyhjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXNpY0xvYWRlcnMgPSBbXG4gICAgICAgICAgICBuZXcgTXlvcElmcmFtZUxvYWRlcigpLFxuICAgICAgICAgICAgbmV3IFdlYmNvbXBvbmVudExvYWRlcigpLFxuICAgICAgICAgICAgbmV3IEhUTUxDb21wb25lbnRMb2FkZXIoKVxuICAgICAgICBdO1xuXG4gICAgICAgIHRoaXMuY29tcG9uZW50c0xvYWRlcnMgPSBbXG4gICAgICAgICAgICAuLi5iYXNpY0xvYWRlcnNcbiAgICAgICAgXTtcblxuICAgICAgICBpZiAoY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnMpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyTG9hZGVycyhjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbmNvbW1pbmcgbWVzc2FnZXMgZnJvbSBJRnJhbWVzXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgXCJtZXNzYWdlXCIsXG4gICAgICAgICAgICB0aGlzLmluY29taW5nTWVzc2FnZUhhbmRsZXIsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zb2xlLmxvZygnbXlvcCBob3N0U0RLIGluaXRpYXRlZCcsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICB0aGlzLmluaXRpYXRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVnaXN0ZXJMb2FkZXJzID0gKGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3JzOiBjb21wb25lbnRMb2FkZXJDcmVhdG9yW10pID0+IHtcbiAgICAgICAgY29uc3QgbG9hZGVyQnlUeXBlOiBSZWNvcmQ8c3RyaW5nLCBJTXlvcExvYWRlcj4gPSB7fTtcblxuICAgICAgICBjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycy5mb3JFYWNoKGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3IgPT4ge1xuICAgICAgICAgICAgY29uc3QgY3VzdG9tTG9hZGVyID0gbmV3IGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3IodGhpcy5jb21wb25lbnRzTG9hZGVycyk7XG4gICAgICAgICAgICBsb2FkZXJCeVR5cGVbY3VzdG9tTG9hZGVyLnR5cGVdID0gY3VzdG9tTG9hZGVyO1xuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuY29tcG9uZW50c0xvYWRlcnMuZm9yRWFjaChsb2FkZXIgPT4ge1xuICAgICAgICAgICAgaWYgKCFsb2FkZXJCeVR5cGVbbG9hZGVyLnR5cGVdKVxuICAgICAgICAgICAgICAgIGxvYWRlckJ5VHlwZVtsb2FkZXIudHlwZV0gPSBsb2FkZXI7XG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzTG9hZGVycyA9IE9iamVjdC52YWx1ZXMobG9hZGVyQnlUeXBlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRTa2luSWRCeVNraW5TZWxlY3RvciA9IGFzeW5jIChza2luU2VsZWN0b3I6IElTa2luU2VsZWN0b3JDb25maWcsIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdID0gW10sIGhvb2tzPzogbG9hZGVySG9va3MpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgICBhc3luYyBmdW5jdGlvbiBhc3luY0ZpbmQ8VD4oXG4gICAgICAgICAgICBhcnJheTogVFtdLFxuICAgICAgICAgICAgcHJlZGljYXRlOiAoaXRlbTogVCkgPT4gUHJvbWlzZTxib29sZWFuPlxuICAgICAgICApOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBhcnJheSkge1xuICAgICAgICAgICAgICAgIGlmIChhd2FpdCBwcmVkaWNhdGUoaXRlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gUmV0dXJuIHVuZGVmaW5lZCBpZiBubyBtYXRjaCBpcyBmb3VuZFxuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChza2luU2VsZWN0b3IudHlwZSkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY2FzZSBcIkRlZGljYXRlZFNraW5cIiA6IC8vYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgY2FzZSBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQ6IHtcbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRTa2luSWQgPSAoc2tpblNlbGVjdG9yIGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnKS5za2luPy5pZFxuICAgICAgICAgICAgICAgICAgICB8fCAoc2tpblNlbGVjdG9yIGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnKS5za2lucyFbMF0uaWQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRTa2luSWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNraW5TZWxlY3RvclR5cGVzLlNlZ21lbnRlZDoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkU2tpblNlbGVjdG9yID0gKHNraW5TZWxlY3RvciBhcyBJU2VnbWVudGVkU2tpbkNvbmZpZylcbiAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gYXdhaXQgYXN5bmNGaW5kKHR5cGVkU2tpblNlbGVjdG9yLnNlZ21lbnRzLCBhc3luYyBzZWdtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQuc2VnbWVudElkID09PSAnRGVmYXVsdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhwZXJpZW5jZSA9IGV4cGVyaWVuY2VzLmZpbmQoZXhwZXJpZW5jZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZXJpZW5jZS50eXBlID09PSBFeHBlcmllbmNlVHlwZXMuU2VnbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXhwZXJpZW5jZSBhcyBJU2VnbWVudEV4cGVyaWVuY2UpLnNlZ21lbnQuaWQgPT09IHNlZ21lbnQuc2VnbWVudElkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghZXhwZXJpZW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZXhwZXJpZW5jZSBub3QgZm91bmRcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZEV4cGVyaWVuY2UgPSBleHBlcmllbmNlIGFzIElTZWdtZW50RXhwZXJpZW5jZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRTZWdtZW50ID0gKHR5cGVkRXhwZXJpZW5jZS5zZWdtZW50IGFzIElGdW5jdGlvblJlc3VsdHNTZWdtZW50KVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRGdW5jdGlvbiA9IChob29rcyA/IGhvb2tzIDoge30pW3R5cGVkU2VnbWVudC5mdW5jdGlvbl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50RnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBzZWdtZW50RnVuY3Rpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBzZWdtZW50SWQ6JHtzZWdtZW50LnNlZ21lbnRJZH0sICR7dHlwZWRTZWdtZW50LmZ1bmN0aW9ufSBmdW5jdGlvbiBub3QgcHJvdmlkZWQgIWApXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2VnbWVudClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNraW5JZEJ5U2tpblNlbGVjdG9yKHNlZ21lbnQuc2tpblNlbGVjdG9yLCBleHBlcmllbmNlcyk7XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJycgLy9UT0RPXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBydW5Ta2luU2VsZWN0b3IgPSBhc3luYyAoY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBob29rcz86IGxvYWRlckhvb2tzKSA9PiB7XG4gICAgICAgIGNvbnN0IHNraW5JZCA9IGF3YWl0IHRoaXMuX2dldFNraW5JZEJ5U2tpblNlbGVjdG9yKGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5za2luU2VsZWN0b3IsIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZEV4cGVyaWVuY2VzLCBob29rcyk7XG4gICAgICAgIHJldHVybiBjb21wb25lbnRDb25maWcudHlwZS5za2lucy5maW5kKHNraW4gPT4gc2tpbi5pZCA9PT0gc2tpbklkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZGVySG9va3M/OiBsb2FkZXJIb29rcztcblxuICAgIHB1YmxpYyBsb2FkQ29tcG9uZW50ID0gYXN5bmMgPFQgZXh0ZW5kcyBJTXlvcENvbXBvbmVudCA9IElNeW9wQ29tcG9uZW50Pihjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50IHwgUmVmLCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucyk6XG4gICAgICAgIFByb21pc2U8VD4gPT4ge1xuXG4gICAgICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm8gY29udGFpbmVyIHdhcyBmb3VuZCBmb3IgdGhpcyBjb21wb25lbnQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG92ZXJyaWRkZW5Db25maWcgPSBhd2FpdCBjaGVja015b3BPdmVycmlkZShjb21wb25lbnRDb25maWcpO1xuICAgICAgICBpZiAob3ZlcnJpZGRlbkNvbmZpZykge1xuICAgICAgICAgICAgLy9UT0RPIDogbG9nXG4gICAgICAgICAgICBjb21wb25lbnRDb25maWcgPSBvdmVycmlkZGVuQ29uZmlnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gLy8gQHRzLWlnbm9yZVxuICAgICAgICAvLyBpZiAoIWNvbnRhaW5lci5fX25vblByb3hpZWQpIHtcbiAgICAgICAgLy8gICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IChjb250YWluZXIgYXMgdW5rbm93biBhcyBNeW9wUmVmQ29tcG9uZW50KTtcbiAgICAgICAgLy8gICAgIC8vaWYgd2UgZ290IGxvYWRDb21wb25lbnQgb3ZlciBNeW9wUmVmQ29tcG9uZW50XG4gICAgICAgIC8vICAgICBpZiAocmVmQ29tcG9uZW50LmlkICYmIHJlZkNvbXBvbmVudC5wYXJlbnQpIHtcbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gdGhpcy5sb2FkQ29tcG9uZW50KGNvbXBvbmVudENvbmZpZywgcmVmQ29tcG9uZW50LnJlZiwgb3B0aW9ucyk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgLy8gbGV0IHJvb3RDb21wb25lbnQ6IElNeW9wQ29tcG9uZW50ID0gcmVmQ29tcG9uZW50O1xuICAgICAgICAvLyAgICAgICAgIC8vIHdoaWxlKCFyb290Q29tcG9uZW50LmVsZW1lbnQgJiYgcm9vdENvbXBvbmVudC5wYXJlbnQpe1xuICAgICAgICAvLyAgICAgICAgIC8vICAgICByb290Q29tcG9uZW50ID0gcm9vdENvbXBvbmVudC5wYXJlbnRcbiAgICAgICAgLy8gICAgICAgICAvLyB9XG4gICAgICAgIC8vICAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICAvLyByb290Q29tcG9uZW50LmVsZW1lbnRcbiAgICAgICAgLy8gICAgICAgICAvLyAvL3doYXQgbm93ID9cbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGNvbnN0IGhvb2tzID0gey4uLih0aGlzLmxvYWRlckhvb2tzID8/IHt9KSwgLi4uKG9wdGlvbnM/Lmhvb2tzID8/IHt9KX07XG5cbiAgICAgICAgY29uc3QgcmVmID0gY29udGFpbmVyIGFzIFJlZjtcbiAgICAgICAgaWYgKHJlZi5teW9wKSB7XG4gICAgICAgICAgICBpZiAocmVmLmNvbXBvbmVudCkge1xuXG4gICAgICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnID0gey4uLmNvbXBvbmVudENvbmZpZ307XG4gICAgICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnLmluc3RhbmNlID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5jb21wb25lbnRDb25maWcuaW5zdGFuY2VcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRTa2luID0gYXdhaXQgdGhpcy5ydW5Ta2luU2VsZWN0b3IoY29tcG9uZW50Q29uZmlnLCBob29rcykhXG4gICAgICAgICAgICAgICAgaWYgKCFzZWxlY3RlZFNraW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicnVuU2tpblNlbGVjdG9yIGZhaWxlZCB0byBjaG9vc2Ugc2tpbiwgY2hlY2sgdGhlIHByb3ZpZGVkIGNvbmZpZ1wiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucz8uaG9va3M/LmFmdGVyU2tpblNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkU2tpbiA9IGF3YWl0IG9wdGlvbnMuaG9va3MuYWZ0ZXJTa2luU2VsZWN0ZWQoey4uLnNlbGVjdGVkU2tpbn0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgc2tpbjogc2VsZWN0ZWRTa2luXG4gICAgICAgICAgICAgICAgICAgIC8vICBza2luczogW3NlbGVjdGVkU2tpbl1cbiAgICAgICAgICAgICAgICB9IGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnXG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gey4uLm9wdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zLmhvb2tzXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gYXdhaXQgY3JlYXRlUmVmQ29tcG9uZW50PFQ+KHJlZiwgY29tcG9uZW50Q29uZmlnLCB0aGlzLmNvbXBvbmVudHMsIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY29ubmVjdCByZWZzIGFuZCBwcm9wcyBpbnNvZGUgY3JlYXRlUmVmQ29tcG9uZW50LCBlbHNld2hlcmUgaXRzIG5vdCByZWFsbHkgPFQ+XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZkNvbXBvbmVudDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdsb2FkIGNvbXBvbmVudCBnb3QgYSBkZXRhY2hlZCByZWYuJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lciBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAvKipcbiAgICAgICAgICpcbiAgICAgICAgICogY2hvb3NlIHNraW4gb24gcnVudGltZSAuLi5cbiAgICAgICAgICogICAgICAgIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5za2luU2VsZWN0b3IudHlwZVxuICAgICAgICAgKi9cblxuICAgICAgICBsZXQgc2VsZWN0ZWRTa2luID0gYXdhaXQgdGhpcy5ydW5Ta2luU2VsZWN0b3IoY29tcG9uZW50Q29uZmlnLCBob29rcykhXG5cbiAgICAgICAgaWYgKCFzZWxlY3RlZFNraW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJ1blNraW5TZWxlY3RvciBmYWlsZWQgdG8gY2hvb3NlIHNraW4sIGNoZWNrIHRoZSBwcm92aWRlZCBjb25maWdcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uaG9va3M/LmFmdGVyU2tpblNlbGVjdGVkKSB7XG4gICAgICAgICAgICBzZWxlY3RlZFNraW4gPSBhd2FpdCBvcHRpb25zLmhvb2tzLmFmdGVyU2tpblNlbGVjdGVkKHsuLi5zZWxlY3RlZFNraW59KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wb25lbnRMb2FkZXIgPSB0aGlzLmNvbXBvbmVudHNMb2FkZXJzLmZpbmQobG9hZGVyID0+IGxvYWRlci50eXBlID09PSBzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGUpO1xuXG4gICAgICAgIGlmICghY29tcG9uZW50TG9hZGVyKSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbm8gbG9hZGVyIFwiJHtzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGV9XCIgd2FzIGZvdW5kIGZvciBjb21wb25lbnRgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vZm9yIGxvYWRlZCB3ZWJjb21wb25lbnQgbW9kdWxlcyB0byBmb2xsb3dpbmcgbGluZSBjcmVhdGVzIGEgcmFjZSBjb25kaXRpb24gd2l0aCB0aGUgaW5pdCBtZXNzYWdlIGZsb3dcbiAgICAgICAgbGV0IGNvbXBvbmVudCA9IGF3YWl0IGNvbXBvbmVudExvYWRlci5sb2FkKGNvbXBvbmVudENvbmZpZy50eXBlLCBzZWxlY3RlZFNraW4sIGNvbnRhaW5lciwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gVE9ETyA6IHdoZW4gdGhpcyBpcyBub3QgdHJ1ZSA/XG4gICAgICAgIGlmICghY29tcG9uZW50LmlzSW5pdGlhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMyaW5pdC5wdXNoKGNvbXBvbmVudClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbXBvbmVudC5iaW5kKCdvbkRpc3Bvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjb21wb25lbnQgZGlzcG9zZScsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudHMuZmlsdGVyKGMgPT4gYyAhPT0gY29tcG9uZW50KVxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQgPSB0aGlzLmNvbXBvbmVudHMyaW5pdC5maWx0ZXIoYyA9PiBjICE9PSBjb21wb25lbnQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuXG4gICAgICAgIC8vIERPIE5PVCBXQUlUIFRPIEJFIEFTS0VEIC0tIEJVVCBPTkxZIE9OQ0UgRlVMTFkgUkVHSVNURVJFRC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhlIGNvbXBvbmVudCBhbm5vdW5jZXMgaXRzZWxmIGFzIHNvb24gYXMgaXQgYm9vdHMsIGFuZCB3ZSBhbnN3ZXIgYnkgbG9va2luZyBpdFxuICAgICAgICAvLyB1cC4gQnV0IGl0IG9ubHkgbGFuZHMgaW4gb3VyIGxpc3RzIEhFUkUsIGFmdGVyIHRoZSBhd2FpdCBhYm92ZSwgd2hpY2ggdGhlXG4gICAgICAgIC8vIGNvbW1lbnQgb24gdGhhdCBsaW5lIGFscmVhZHkgY2FsbHMgYSByYWNlOiBhIGNvbXBvbmVudCB0aGF0IGJvb3RlZCBpbnNpZGUgdGhlXG4gICAgICAgIC8vIGF3YWl0IGFubm91bmNlZCBpbnRvIGFuIGVtcHR5IGxpc3QsIGl0cyBJbml0UmVxdWVzdCB3YXMgZHJvcHBlZCwgYW5kIG5vdGhpbmdcbiAgICAgICAgLy8gZXZlciBzZW50IHRoZSBJbml0TWVzc2FnZSBpdCB3YXMgYmxvY2tlZCBvbiAtLSBpbml0aWF0ZWQoKSB0aGVuIHJlamVjdGVkIHdpdGhcbiAgICAgICAgLy8gdGltZW91dF88bXM+LiBNaW5pZmljYXRpb24gbWFkZSB0aGF0IGNvbW1vbiBieSBib290aW5nIGZyYW1lcyBzb29uZXIuIFJlcG9ydGVkXG4gICAgICAgIC8vIGJ5IFBpYy1UaW1lIDIwMjYtMTAtMTcuIFNlbmRpbmcgaGVyZSBjbG9zZXMgdGhlIG9yZGVyaW5nIGhvbGUgaW5zdGVhZCBvZiBob3BpbmdcbiAgICAgICAgLy8gdG8gc3Vydml2ZSBpdC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVEhJUyBNVVNUIENPTUUgQUZURVIgYGNvbXBvbmVudHMucHVzaGAsIE5PVCBCRUZPUkUgSVQuIFRoZSB0d28gY29tcG9uZW50IGNsYXNzZXNcbiAgICAgICAgLy8gZG8gbm90IHNoYXJlIGEgdHJhbnNwb3J0OiBhbiBpZnJhbWUgaXMgbWVzc2FnZWQgd2l0aCBwb3N0TWVzc2FnZSwgd2hpY2ggaXNcbiAgICAgICAgLy8gYXN5bmMsIHNvIHJlZ2lzdHJhdGlvbiBhbHdheXMgd29uIHRoZSByYWNlIGJ5IGx1Y2suIEEgd2ViIGNvbXBvbmVudCBpcyBtZXNzYWdlZFxuICAgICAgICAvLyB3aXRoIGEgU1lOQ0hST05PVVMgY3VzdG9tRWxlbWVudC5kaXNwYXRjaEV2ZW50LCBzbyBpdCByZWdpc3RlcnMgYW5kIHJlcGxpZXMgd2l0aFxuICAgICAgICAvLyBJbml0UmVzcG9uc2UgKmluc2lkZSogdGhpcyBjYWxsIC0tIGFuZCB0aGUgSW5pdFJlc3BvbnNlIGhhbmRsZXIgcmVzb2x2ZXMgdGhlXG4gICAgICAgIC8vIGNvbXBvbmVudCBvdXQgb2YgYHRoaXMuY29tcG9uZW50c2AuIFNlbmRpbmcgd2hpbGUgdGhhdCBhcnJheSB3YXMgc3RpbGwgbWlzc2luZ1xuICAgICAgICAvLyB0aGUgY29tcG9uZW50IG1lYW50IHRoZSBsb29rdXAgZm91bmQgbm90aGluZywgc2V0SW5pdGlhdGVkKCkgbmV2ZXIgcmFuLCBhbmRcbiAgICAgICAgLy8gc2luY2UgY29tcG9uZW50czJpbml0IGhhZCBhbHJlYWR5IGJlZW4gZmlsdGVyZWQgdGhlIGNvbXBvbmVudCBjb3VsZCBuZXZlciBiZVxuICAgICAgICAvLyByZWNvdmVyZWQ6IGV2ZXJ5IHdlYiBjb21wb25lbnQgaHVuZyB1bnRpbCB0aW1lb3V0LiBDYXVnaHQgYnlcbiAgICAgICAgLy8gdGVzdC9pbml0LXdlYmNvbXBvbmVudC5lMmUubWpzLlxuICAgICAgICAvL1xuICAgICAgICAvLyBBIGZyYW1lIHRoYXQgaGFzIG5vdCBib290ZWQgeWV0IGhhcyBhIG51bGwgY29udGVudFdpbmRvdywgc28gYHNlbmRgIGlzIGEgbm8tb3BcbiAgICAgICAgLy8gKGl0IGlzIG9wdGlvbmFsLWNoYWluZWQpIGFuZCB0aGF0IGNvbXBvbmVudCdzIG93biBJbml0UmVxdWVzdCBpcyBhbnN3ZXJlZFxuICAgICAgICAvLyBub3JtYWxseSAtLSB3ZSBhcmUgcmVnaXN0ZXJlZCBieSB0aGVuLlxuICAgICAgICBpZiAoIWNvbXBvbmVudC5pc0luaXRpYXRlZCkge1xuICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IEluaXRNZXNzYWdlKGNvbXBvbmVudC5pZCkpXG4gICAgICAgIH1cblxuICAgICAgICAvLyB0cnVlIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMuY29ubmVjdFByb3BzICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgLy9UT0RPIDogbWFrZSB0eXBlIGZpZWxkIGNvbmRpdGlvbmFsIHR5cGUgaW5mZXIgXCJzdHJpbmdcIiA+IHN0cmluZywgXCJudW1iZXJcIiA+IG51bWJlciwgZXRjLi4uXG4gICAgICAgICAgICBjb21wb25lbnQgPSBjb25uZWN0UHJvcHMoY29tcG9uZW50LCBjb21wb25lbnRDb25maWcudHlwZS5wcm9wcywgc2VsZWN0ZWRTa2luKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvL1RPRE8gOiBtYWtlIG9wdGlvbmFsP1xuICAgICAgICAgICAgLy9UT0RPIDogZml4IGlzc3VlcyB3aXRoIHRpbWVvdXQgYW5kIHdyb25nIHJlZiBuYW1lcyBmcm9tIGNvbmZpZyB2cyBjdXJyZW50IHNraW5cbiAgICAgICAgICAgIGF3YWl0IGNvbm5lY3RSZWZzKGNvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnLCB0aGlzLmNvbXBvbmVudHMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIFRPT0QgOiB0aHJvdyA/XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvcHRpb25zPy5za2lwSW5pdClcbiAgICAgICAgICAgIGF3YWl0IGNvbXBvbmVudC5pbml0aWF0ZWQoKTtcblxuICAgICAgICByZXR1cm4gY29tcG9uZW50IGFzIFQ7XG4gICAgfVxuXG4gICAgcHVibGljIG5hdmlnYXRlID0gYXN5bmMgPFQgZXh0ZW5kcyBJTXlvcENvbXBvbmVudCA9IElNeW9wQ29tcG9uZW50Pihjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBuZXdDb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIG9wdGlvbnM/OiBuYXZpZ2F0aW9uT3B0aW9ucykgPT4ge1xuICAgICAgICBpZiAoY29tcG9uZW50LnBhcmVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOYXZpZ2F0aW5nIG9uIHJlbW90ZSByZWYgY29tcG9uZW50cyBpcyBub3QgaW1wbGVtZW50ZWQgeWV0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2NvbXBvbmVudC5tYXJrZWRGb3JEaXNwb3NlZCA9IHRydWU7XG5cbiAgICAgICAgLy8gaWYgKG9wdGlvbnM/LmlucGxhY2UpIHtcbiAgICAgICAgLy8gICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICAvLyAgICAgICAgIGxldCBuZXdDb21wb25lbnQgPSBhd2FpdCB0aGlzLmxvYWRDb21wb25lbnQ8VD4obmV3Q29tcG9uZW50Q29uZmlnLCBjb21wb25lbnQuZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAgICAgYXdhaXQgbmV3Q29tcG9uZW50LmluaXRpYXRlZCgpO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgIGlmIChvcHRpb25zLmluaXQpXG4gICAgICAgIC8vICAgICAgICAgICAgIGF3YWl0IG9wdGlvbnMuaW5pdChuZXdDb21wb25lbnQpO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgIHJldHVybiBuZXdDb21wb25lbnQ7XG4gICAgICAgIC8vICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgICAgIHRocm93IG5ldyBFcnJvcignLi4uJylcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5zdGFnZWQpIHtcbiAgICAgICAgICAgIC8vY29uc3Qgc2VsZWN0ZWRTa2luID0gdGhpcy5ydW5Ta2luU2VsZWN0b3IobmV3Q29tcG9uZW50Q29uZmlnKVxuICAgICAgICAgICAgbGV0IG5ld0NvbXBvbmVudCA9IGF3YWl0IHRoaXMubG9hZENvbXBvbmVudDxUPihuZXdDb21wb25lbnRDb25maWcsIGNvbXBvbmVudC5jb250YWluZXIsIHtcbiAgICAgICAgICAgICAgICBoaWRkZW46IHRydWUsXG4gICAgICAgICAgICAgICAgcmVsYXRpdmU6IHtkaXJlY3Rpb246ICdhZnRlcicsIGNoaWxkOiBjb21wb25lbnQuZWxlbWVudCF9LFxuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5pbml0KVxuICAgICAgICAgICAgICAgIGF3YWl0IG9wdGlvbnMuaW5pdChuZXdDb21wb25lbnQpO1xuXG4gICAgICAgICAgICBuZXdDb21wb25lbnQuc2hvdygpO1xuICAgICAgICAgICAgY29tcG9uZW50LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBuZXdDb21wb25lbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0U2libGluZyA9IGNvbXBvbmVudC5lbGVtZW50IS5uZXh0U2libGluZztcblxuICAgICAgICAgICAgY29tcG9uZW50LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRDb21wb25lbnQ8VD4obmV3Q29tcG9uZW50Q29uZmlnLCBjb21wb25lbnQuY29udGFpbmVyLCB7XG4gICAgICAgICAgICAgICAgcmVsYXRpdmU6IHtcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBcImJlZm9yZVwiLFxuICAgICAgICAgICAgICAgICAgICBjaGlsZDogbmV4dFNpYmxpbmcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgbmF2aWdhdGlvbk9wdGlvbnMgPSB7XG4gICAgc3RhZ2VkPzogYm9vbGVhbixcbiAgICAvL2lucGxhY2U/OiBib29sZWFuLFxuICAgIGluaXQ/OiAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCkgPT4gUHJvbWlzZTx2b2lkPlxuICAgIHNraXBJbml0PzogYm9vbGVhblxufSAmIGxvYWRlck9wdGlvbnNcblxudHlwZSByZWxhdGl2ZUxvYWRDb25maWdEaXJlY3Rpb24gPSAnYmVmb3JlJyB8ICdhZnRlcic7XG5cblxuZXhwb3J0IHR5cGUgbG9hZGVySG9va3MgPSB7XG4gICAgYWZ0ZXJTa2luU2VsZWN0ZWQ/OiAoc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZykgPT4gUHJvbWlzZTxJU2tpbkNvbmZpZz5cbn0gJlxuICAgIC8vIHNlZ21lbnRhdGlvbiBob29rc1xuICAgICh7IFtrZXk6IHN0cmluZ106ICgpID0+IFByb21pc2U8Ym9vbGVhbj4gfCBib29sZWFuIH0gfCB7fSlcblxuLy9UT0RPOiBzdXBwb3J0IHNlcmlhbGl6YWJsZSB2ZXJzaW9uIG9mIHRoYXQgb2JqZWN0XG5leHBvcnQgaW50ZXJmYWNlIHJlbGF0aXZlTG9hZENvbmZpZyB7XG4gICAgLy9JZiB0aGlzIGlzIG51bGwsIHRoZW4gbmV3Tm9kZSBpcyBpbnNlcnRlZCBhdCB0aGUgZW5kIG9mIG5vZGUncyBjaGlsZCBub2Rlcy5cbiAgICAvL2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Ob2RlL2luc2VydEJlZm9yZVxuICAgIGNoaWxkOiBDaGlsZE5vZGUgfCBudWxsXG4gICAgZGlyZWN0aW9uOiByZWxhdGl2ZUxvYWRDb25maWdEaXJlY3Rpb25cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRW52aXJvbm1lbnQge1xuICAgIFtrZXk6IHN0cmluZ106IGFueVxufVxuXG50eXBlIEVsZW1lbnRBdHRyaWJ1dGVzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCB1bmRlZmluZWQgfCBudWxsO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBsb2FkZXJPcHRpb25zIHtcbiAgICBpZD86IHN0cmluZ1xuICAgIGhpZGRlbj86IGJvb2xlYW5cbiAgICBjb25uZWN0UHJvcHM/OiBib29sZWFuXG4gICAgdGltZW91dD86IG51bWJlclxuICAgIHNraXBJbml0PzogYm9vbGVhblxuICAgIHJlbGF0aXZlPzogcmVsYXRpdmVMb2FkQ29uZmlnXG4gICAgaG9va3M/OiBsb2FkZXJIb29rc1xuICAgIGVsZW1lbnRBdHRyaWJ1dGVzPzogRWxlbWVudEF0dHJpYnV0ZXNcbiAgICBfZW52aXJvbm1lbnQ/OiBJRW52aXJvbm1lbnRcbiAgICBfaGFzUGFyZW50PzogYm9vbGVhblxuICAgIF9pbnNwZWN0aW9uPzogYm9vbGVhblxuICAgIGRhdGE/OiBhbnlcbiAgICAvKipcbiAgICAgKiBSYXcgQ1NTIGluamVjdGVkIGludG8gdGhlIGNvbXBvbmVudCdzIGlmcmFtZSA8aGVhZD4gYmVmb3JlIGZpcnN0IHBhaW50LlxuICAgICAqIEFwcGVuZGVkIGxhc3Qgc28gaXQgb3ZlcnJpZGVzIHRoZSBjb21wb25lbnQncyBvd24gc3R5bGVzIHZpYSBjYXNjYWRlIG9yZGVyLlxuICAgICAqIFVzZWZ1bCBmb3IgdGhlbWluZyB2MiAoSFRNTCkgY29tcG9uZW50cyBcdTIwMTQgY29sb3JzLCBmb250cywgc3BhY2luZywgZXRjLlxuICAgICAqL1xuICAgIGluamVjdENzcz86IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIENvbnRyb2wgaWZyYW1lIGF1dG8tc2l6aW5nIGJlaGF2aW9yLlxuICAgICAqIC0gdHJ1ZSAoZGVmYXVsdCk6IGlmcmFtZSBhdXRvLXNpemVzIHRvIGNvbnRlbnQgaGVpZ2h0LCB3aWR0aCBmaWxscyBwYXJlbnQuXG4gICAgICogLSBmYWxzZTogbm8gc2l6aW5nIGxvZ2ljIHJ1bnMuIE5vIG9ic2VydmVycywgbm8gbWVhc3VyZW1lbnRzLCBubyBzdHlsZSBjaGFuZ2VzLlxuICAgICAqICAgVGhlIGlmcmFtZSBzdGF5cyBhdCBwb3NpdGlvbjphYnNvbHV0ZSBmaWxsaW5nIHRoZSBjb250YWluZXIuXG4gICAgICogICBUaGUgaG9zdCBpcyBmdWxseSByZXNwb25zaWJsZSBmb3IgY29udGFpbmVyIGRpbWVuc2lvbnMuXG4gICAgICovXG4gICAgYXV0b1NpemU/OiBib29sZWFuXG5cbiAgICAvKipcbiAgICAgKiBQZXItY2FsbCByZW5kZXIgcG9saWN5LiBUYWtlcyBwcmVjZWRlbmNlIG92ZXIgaG9zdFNESy5zZXRSZW5kZXJQb2xpY3kgXHUyMDE0IGxldHMgYW5cbiAgICAgKiBhcHAgcmVzdHJpY3QgZ2xvYmFsbHkgYW5kIGFsbG93IChvciBmdXJ0aGVyIHJlc3RyaWN0KSBzcGVjaWZpYyBsb2FkQ29tcG9uZW50IGNhbGxzLlxuICAgICAqL1xuICAgIHJlbmRlclBvbGljeT86IFJlbmRlclBvbGljeVxuXG4gICAgLyoqXG4gICAgICogRm9yY2UgZnVsbCBpc29sYXRpb24gZm9yIGFuIGlubGluZS1IVE1MIChsb2NhbEZyYW1lKSBjb21wb25lbnQ6IHNhbmRib3hlZCxcbiAgICAgKiBjcm9zcy1vcmlnaW4gaWZyYW1lIHdpdGggbm8gaG9zdC1kb2N1bWVudCBhY2Nlc3MuIEEgcmVuZGVyIHBvbGljeSByZXR1cm5pbmdcbiAgICAgKiAnaXNvbGF0ZWRJZnJhbWUnIGhhcyB0aGUgc2FtZSBlZmZlY3QuXG4gICAgICovXG4gICAgaXNvbGF0aW9uPzogYm9vbGVhblxufVxuXG5pZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHdpbmRvdy5teW9wID0ge1xuICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfX1xuICAgIH07XG59XG5cbmlmICghd2luZG93Lm15b3AuaG9zdFNESykge1xuICAgIGNvbnN0IF9ob3N0U0RLID0gbmV3IEhvc3RTREsoKTtcbiAgICAvL1RPRE86IGVuYWJsZSBsYXp5IGluaXQ/XG4gICAgX2hvc3RTREsuaW5pdCgpO1xuXG4gICAgaWYgKCF3aW5kb3cubXlvcCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHdpbmRvdy5teW9wID0ge1xuICAgICAgICAgICAgX19ST09UX1NES19QVUJMSUNfVVJMX19cbiAgICAgICAgfTtcbiAgICB9XG4gICAgd2luZG93Lm15b3AuaG9zdFNESyA9IF9ob3N0U0RLO1xufVxuXG4vLyBUaGUgb3B0LWluLCByZWFjaGFibGUgd2l0aCBubyBpbXBvcnQgYW5kIG5vIGJ1aWxkIGNoYW5nZSBvbiB0aGUgaG9zdCBwYWdlOlxuLy9cbi8vICAgbXlvcC5kZWxpdmVyeSh7IG1pbmlmeTogdHJ1ZSwgY2FjaGU6IHRydWUgfSk7ICAgLy8gbGFuZSArIHRoZSBjbGllbnQgd2luZG93XG4vLyAgIG15b3AuZGVsaXZlcnkuc3RhdHMoKTsgICAgICAgICAgICAgICAgLy8gd2hhdCBhbnN3ZXJlZCwgYW5kIGhvdyBvZnRlbiBpdCBmZWxsIGJhY2tcbi8vICAgbXlvcC5kZWxpdmVyeS5vZmYoKTsgICAgICAgICAgICAgICAgICAvLyBiYWNrIHRvIHRvZGF5J3MgaG9zdCwgbm8gcmVsb2FkXG4vL1xuLy8gQXR0YWNoZWQgaGVyZSByYXRoZXIgdGhhbiBleHBvcnRlZCBvbmx5IGFzIGEgbW9kdWxlIGZ1bmN0aW9uIGJlY2F1c2UgdGhlIGhvc3QgYXBwIHRoYXRcbi8vIG9wdHMgaW4gaXMgb2Z0ZW4gbG9hZGluZyB0aGUgU0RLIGZyb20gYSBzY3JpcHQgdGFnLCB3aGVyZSBgaW1wb3J0YCBpcyBub3QgYXZhaWxhYmxlLlxuaWYgKHdpbmRvdy5teW9wICYmICEod2luZG93Lm15b3AgYXMgYW55KS5kZWxpdmVyeSkge1xuICAgIGNvbnN0IGFwaTogYW55ID0gKG9wdHM/OiB7bWluaWZ5PzogYm9vbGVhbjsgaG9zdD86IHN0cmluZyB8IG51bGx9KSA9PiBkZWxpdmVyeShvcHRzKTtcbiAgICBhcGkuc3RhdHMgPSBkZWxpdmVyeVN0YXRzO1xuICAgIGFwaS5vZmYgPSBkZWxpdmVyeU9mZjtcbiAgICBhcGkucmVmcmVzaCA9IGRlbGl2ZXJ5UmVmcmVzaDtcbiAgICAod2luZG93Lm15b3AgYXMgYW55KS5kZWxpdmVyeSA9IGFwaTtcbn1cblxuLy8gQHRzLWlnbm9yZVxuZXhwb3J0IGNvbnN0IGhvc3RTREs6IEhvc3RTREsgPSB3aW5kb3cubXlvcC5ob3N0U0RLO1xuXG5kZWZpbmVEeW5hbWljSW1wb3J0KCdob3N0U0RLJywgaG9zdFNESyk7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICAgICAgbXlvcDoge1xuICAgICAgICAgICAgX19ST09UX1NES19QVUJMSUNfVVJMX186IHN0cmluZyxcbiAgICAgICAgICAgIGhvc3RTREs6IEhvc3RTREssXG4gICAgICAgICAgICBJZnJhbWVTREs6IEluc3RhbmNlVHlwZTx0eXBlb2YgSWZyYW1lU0RLPlxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXIsIElFbGVtZW50UmVmLCBNeW9wRWxlbWVudFJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtEZXRlY3RlZE15b3BSZWZzTWVzc2FnZSwgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcblxuZXhwb3J0IGNsYXNzIERldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8RGV0ZWN0TXlvcFJlZnNNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5EZXRlY3RNeW9wUmVmc01lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChtZXNzYWdlOiBEZXRlY3RNeW9wUmVmc01lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgYWxsTXlvcEl0ZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9XWApO1xuICAgICAgICAvL2NvbnN0IGFsbE15b3BJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYCpgKTtcblxuICAgICAgICBsZXQgbXlvcFJlZnM6IElFbGVtZW50UmVmW10gPSBbXTtcblxuICAgICAgICAvL2xldCBjb3VudGVyczogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuXG4gICAgICAgIGFsbE15b3BJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuXG4gICAgICAgICAgICBjb25zdCBteW9wSWQgPSBpdGVtLmdldEF0dHJpYnV0ZShteW9wQXR0cmlidXRlcy5pZCk7XG4gICAgICAgICAgICBpZiAobXlvcElkKSB7XG4gICAgICAgICAgICAgICAgbXlvcFJlZnMucHVzaChuZXcgTXlvcEVsZW1lbnRSZWYobXlvcElkLCBpdGVtLnRhZ05hbWUsIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpKVxuICAgICAgICAgICAgfSAvL2Vsc2Uge1xuICAgICAgICAgICAgLy8gICAgIGlmICghY291bnRlcnNbaXRlbS50YWdOYW1lXSkge1xuICAgICAgICAgICAgLy8gICAgICAgICBjb3VudGVyc1tpdGVtLnRhZ05hbWVdID0gMDtcbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyAgICAgY291bnRlcnNbaXRlbS50YWdOYW1lXSA9IGNvdW50ZXJzW2l0ZW0udGFnTmFtZV0gKyAxO1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vICAgICBteW9wUmVmcy5wdXNoKG5ldyBYUGF0aEVsZW1lbnRSZWYoYCR7aXRlbS50YWdOYW1lfSgke2NvdW50ZXJzW2l0ZW0udGFnTmFtZV19KWAsIGl0ZW0udGFnTmFtZSwgaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSkpXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBEZXRlY3RlZE15b3BSZWZzTWVzc2FnZShtZXNzYWdlLmhhbmRsZXJVbmlxdWVJZCwgbXlvcFJlZnMpKVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0JpbmRDbGlja01lc3NhZ2UsIENsaWNrUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIEJpbmRPbkNsaWNrSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxCaW5kQ2xpY2tNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5CaW5kQ2xpY2tNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEJpbmRDbGlja01lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cFRhc2tzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBDbGlja1JlcGxheU1lc3NhZ2UoKSwgZXZlbnQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKTtcblxuICAgICAgICAgICAgY29uc3QgY2xlYW5VcFRhc2sgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MucHVzaChjbGVhblVwVGFzayk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vY2xlYW4gdXBcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4gdGFzaygpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBNeW9wTWVzc2FnZXMgfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtDaGFuZ2VUZXh0TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBDaGFuZ2VUZXh0SGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxDaGFuZ2VUZXh0TWVzc2FnZT4ge1xuICBcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DaGFuZ2VUZXh0TWVzc2FnZTtcbiAgICBcbiAgICBleGVjdXRvciA9IChldmVudDogQ2hhbmdlVGV4dE1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaXRlbS50ZXh0Q29udGVudCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZSwgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlciwgUm9vdFJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50c1wiO1xuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdEhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8RXhlY3V0ZVNjcmlwdE1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5FeGVjdXRlU2NyaXB0TWVzc2FnZVxuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcGxpZXIgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBkYXRhKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgRXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcihldmVudCwgcmVwbGllciwgbmV3IFJvb3RSZWYoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7QWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UsIEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8QWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAobWVzc2FnZTogQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UpID0+IHtcblxuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYobWVzc2FnZS5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgY29uc3QgY2xlYW51cFRhc2tzOiBhbnlbXSA9IFtdO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuXG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICAvL1RPRE86IHRoaW5rIGFib3V0IHRoYXQgcmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlKG1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkLCBtYWtlU2VyaWFsaXphYmxlKGUsIG1lc3NhZ2Uuc2VyaWFsaXphYmxlU2tlbGV0b24pKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKG1lc3NhZ2UudHlwZSwgaGFuZGxlcilcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIobWVzc2FnZS50eXBlLCBoYW5kbGVyKVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLmZvckVhY2godGFzayA9PiB7XG4gICAgICAgICAgICAgICAgdGFzaygpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2V0QXR0cmlidXRlTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBzZXRBdHRyaWJ1dGVIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFNldEF0dHJpYnV0ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldEF0dHJpYnV0ZU1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogU2V0QXR0cmlidXRlTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLnNldEF0dHJpYnV0ZShldmVudC5uYW1lLCBldmVudC52YWx1ZSlcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtIb3N0U0RLfSBmcm9tIFwiLi4vLi4vaG9zdC9ob3N0U0RLXCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50c1wiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2hvc3RcIjtcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBjcmVhdGVSZWYgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvL1RPRE8gOiB1c2UgcmVmIGhlbHBlciBoZXJlXG4gICAgICAgICAgICBjb25zdCBhbGxJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KGBbJHtteW9wQXR0cmlidXRlcy5pZH09JyR7ZXZlbnQucmVmQ29uZmlnLnNlbGVjdG9yfSddYCk7XG4gICAgICAgICAgICBpZiAoYWxsSXRlbXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaG9zdFNESyA9IEhvc3RTREsuSW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBhd2FpdCBob3N0U0RLLmxvYWRDb21wb25lbnQoZXZlbnQubmVzdGVkQ29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgICAgICBhbGxJdGVtcy5pdGVtKDApLFxuICAgICAgICAgICAgICAgICAgICBldmVudC5vcHRpb25zKVxuXG4gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCBpdCB0byBwYXNzIHRoZSBhc3NpZ25lZCBpZHNcbiAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRSZWZDb25maWc6IGFueVtdID0gW107XG5cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhyZWZDb21wb25lbnQucmVmcykuZm9yRWFjaChyZWZOYW1lID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZiA9IHJlZkNvbXBvbmVudC5yZWZzW3JlZk5hbWVdO1xuICAgICAgICAgICAgICAgICAgICByZWYgPSByZWYuX19ub25Qcm94aWVkIHx8IHJlZjtcblxuICAgICAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkUmVmQ29uZmlnLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZk5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbklkOiAocmVmIGFzIElNeW9wQ29tcG9uZW50KS5jb21wb25lbnREZWZpbml0aW9uLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBuZXN0ZWRSZWZDb25maWcpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIgLSBET00gZWxlbWVudCBub3QgZm91bmQnKVxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBbXSwgdHJ1ZSkpO1xuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY3JlYXRlUmVmKCkudGhlbigpO1xuICAgICAgICAvL3JldHVybmluZyB1bmRlZmluZWQgc28gaXQgd29uJ3QgYWN0IGFzIGEgY2xlYW51cFxuICAgIH1cbn1cbiIsICIvLyBAdHMtbm9jaGVja1xuZXhwb3J0IGNvbnN0IG9ic2VydmVET00gPSAob2JqOiBIVE1MRWxlbWVudCB8IG51bGwsIGNhbGxiYWNrOiAobXV0YXRpb25SZWNvcmRzPzogTXV0YXRpb25SZWNvcmRbXSkgPT4gdm9pZCkgPT4ge1xuICAgIGlmICghb2JqKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCduJyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IE11dGF0aW9uT2JzZXJ2ZXIgPSB3aW5kb3cuTXV0YXRpb25PYnNlcnZlciB8fCB3aW5kb3cuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcblxuICAgIGlmICghb2JqIHx8IG9iai5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuO1xuXG4gICAgaWYgKE11dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgICAgLy8gZGVmaW5lIGEgbmV3IG9ic2VydmVyXG4gICAgICAgIGNvbnN0IG11dGF0aW9uT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihjYWxsYmFjaylcbiAgICAgICAgLy8gaGF2ZSB0aGUgb2JzZXJ2ZXIgb2JzZXJ2ZSBmb3IgY2hhbmdlcyBpbiBjaGlsZHJlblxuICAgICAgICBjb25zdCBjb25maWcgPSB7YXR0cmlidXRlczogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlfTtcbiAgICAgICAgbXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKG9iaiwgY29uZmlnKVxuICAgICAgICByZXR1cm4gbXV0YXRpb25PYnNlcnZlclxuICAgIH1cblxuICAgIC8vIGJyb3dzZXIgc3VwcG9ydCBmYWxsYmFja1xuICAgIGVsc2UgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKCdET01Ob2RlSW5zZXJ0ZWQnLCBjYWxsYmFjaywgZmFsc2UpXG4gICAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKCdET01Ob2RlUmVtb3ZlZCcsIGNhbGxiYWNrLCBmYWxzZSlcbiAgICB9XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZSwgTXV0YXRpb25PYnNlcnZlck1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7b2JzZXJ2ZURPTX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9kb21PYnNlcnZlclwiO1xuXG5leHBvcnQgY2xhc3MgU2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8RXhlY3V0ZVNjcmlwdE1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZVxuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGlmIChldmVudC5zb3VyY2UpIHtcbiAgICAgICAgICAgIG9ic2VydmVET00oZG9jdW1lbnQuYm9keSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UoKVxuICAgICAgICAgICAgICAgICAgICAvLyAgbmV3IEVudmVsb3BlZE1lc3NhZ2UoZXZlbnQuc291cmNlISwgbmV3IE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlKCkpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UsIEZvcm1EYXRhRW50cnksIEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UsIElucHV0RWxlbWVudFZhbHVlLH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmNvbnN0IGdldElucHV0VmFsdWUgPSAoZWxlbWVudCk6IElucHV0RWxlbWVudFZhbHVlID0+IHtcbiAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGZvcm1cbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGRhdGFPYmplY3Q6IElucHV0RWxlbWVudFZhbHVlID0ge1xuICAgICAgICAgICAgZm9ybURhdGE6IHt9LFxuICAgICAgICAgICAgdW5tYXBwZWREYXRhOiBbXVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIE1hbnVhbGx5IGFkZCBlbGVtZW50cyB3aXRob3V0IG5hbWVzXG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpO1xuICAgICAgICBsZXQgYXV0b05hbWVJbmRleGVyID0gLTE7XG5cbiAgICAgICAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBteW9wSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShteW9wQXR0cmlidXRlcy5pZCk7XG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBgXyR7KCsrYXV0b05hbWVJbmRleGVyKX1gXG5cbiAgICAgICAgICAgICAgICBjb25zdCBub2RlRGF0YTogRm9ybURhdGFFbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGdldElucHV0VmFsdWUoZWxlbWVudCksXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBlbGVtZW50LnJlcXVpcmVkLFxuICAgICAgICAgICAgICAgICAgICB2YWxpZGl0eTogbWFrZVNlcmlhbGl6YWJsZShlbGVtZW50LnZhbGlkaXR5LCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgICAgbXlvcElkLFxuICAgICAgICAgICAgICAgIH07XG5cblxuICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldIHx8ICFkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldLnZhbHVlIHx8IG5vZGVEYXRhLnZhbHVlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gaWYgKCFrZXkpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGlmIChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2goZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSk7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRhdGFPYmplY3Q7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWxlbWVudC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmNoZWNrZWQgPyBlbGVtZW50LnZhbHVlIDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgaW5wdXQgYW5kIHRleHRhcmVhIGVsZW1lbnRzXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJyB8fCBlbGVtZW50LnRhZ05hbWUgPT09ICdURVhUQVJFQScpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNlbGVjdCBlbGVtZW50cyAoZHJvcGRvd25zKVxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdTRUxFQ1QnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBlZGl0YWJsZSBkaXZzIChjb250ZW50RWRpdGFibGUpXG4gICAgaWYgKGVsZW1lbnQuaXNDb250ZW50RWRpdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuaW5uZXJUZXh0IHx8IGVsZW1lbnQudGV4dENvbnRlbnQ7XG4gICAgfVxuXG4gICAgLy8gSWYgaXQncyBhbiB1bnN1cHBvcnRlZCBlbGVtZW50IHR5cGVcbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGNsYXNzIEdldEVsZW1lbnRWYWx1ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8R2V0RWxlbWVudFZhbHVlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuR2V0RWxlbWVudFZhbHVlTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBHZXRFbGVtZW50VmFsdWVNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZShcbiAgICAgICAgICAgICAgICBnZXRJbnB1dFZhbHVlKGl0ZW0pXG4gICAgICAgICAgICApLCBldmVudCk7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7R2V0QXR0cmlidXRlTWVzc2FnZSwgR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge2dldEZpcnN0RWxlbWVudEJ5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBHZXRBdHRyaWJ1dGVIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEdldEF0dHJpYnV0ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkdldEF0dHJpYnV0ZU1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogR2V0QXR0cmlidXRlTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtID0gZ2V0Rmlyc3RFbGVtZW50QnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudClcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZShpdGVtLmdldEF0dHJpYnV0ZShldmVudC5uYW1lKSksIGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSwgU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlfSBmcm9tICcuLi8uLi9tZXNzYWdlcydcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuZXhwb3J0IGNsYXNzIFNldFJlc2l6ZU9ic2VydmVySGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2VcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcbiAgICAgICAgICAgIC8vVE9ETyA6IHBhc3MgdGhlIGhlaWdodFxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBSZXNpemVPYnNlcnZlck1lc3NhZ2UoKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHkpO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KClcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIFNldElubmVySHRtbEhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8U2V0SW5uZXJIdG1sPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRJbm5lckh0bWw7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogU2V0SW5uZXJIdG1sKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGl0ZW0uaW5uZXJIVE1MID0gZXZlbnQuY29udGVudDtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIFRoZSBJZnJhbWUgU0RLIGlzIGludGVuZGVkIGZvciBzY2VuYXJpb3Mgd2hlcmUgZGV2ZWxvcGVycyB3aXNoIHRvIGltcGxlbWVudCBNeW9wIGNvbXBvbmVudHMgYXMgc2VwYXJhdGUgd2ViIGFwcGxpY2F0aW9ucyBob3N0ZWQgd2l0aGluIGlmcmFtZXMuPGJyLz48YnIvPlxuICogQnkgaW1wb3J0aW5nIHRoZSBJZnJhbWUgU0RLLCBkZXZlbG9wZXJzIGdhaW4gYWNjZXNzIHRvIHRvb2xzIGFuZCB1dGlsaXRpZXMgbmVjZXNzYXJ5IGZvciBoYW5kbGluZyBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIGhvc3QgYXBwbGljYXRpb24gYW5kIHRoZSBlbWJlZGRlZCBpZnJhbWUtYmFzZWQgTXlvcCBjb21wb25lbnRzPGJyLz48YnIvPlxuICogVGhpcyBTREsgZmFjaWxpdGF0ZXMgc2VjdXJlIGlzb2xhdGlvbiwgYWxsb3dpbmcgY29tcG9uZW50cyB0byBmdW5jdGlvbiBpbmRlcGVuZGVudGx5IHdoaWxlIHN0aWxsIGJlbmVmaXRpbmcgZnJvbSB0aGUgb3ZlcmFsbCBzdHJ1Y3R1cmUgYW5kIG1hbmFnZW1lbnQgY2FwYWJpbGl0aWVzIHByb3ZpZGVkIGJ5IHRoZSBob3N0IGFwcGxpY2F0aW9uLjxici8+PGJyLz5cbiAqXG4gT25jZSBsb2FkZWQgdGhlIGBSb290U0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuIGBgYGpzXG4gY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRJZnJhbWVNb2R1bGUoKSk7XG4gYGBgXG4gb3JcbiBgYGB0c1xuIGltcG9ydCB7Z2V0SWZyYW1lTW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IGdldElmcmFtZU1vZHVsZSgpKTtcbiBgYGBcbiBvclxuIGBgYHRzXG4gaW1wb3J0IHtJZnJhbWVTREt9IGZyb20gJ0BteW9wL3Nkay9pZnJhbWUnO1xuIGBgYFxuICpcbiAqL1xuaW1wb3J0IHtCYXNlTXlvcFNES30gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtCaW5kT25DbGlja0hhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9iaW5kT25DbGlja0hhbmRsZXJcIjtcbmltcG9ydCB7Q2hhbmdlVGV4dEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlclwiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0SGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyXCI7XG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcbmltcG9ydCB7QWRkRXZlbnRMaXN0ZW5lckhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlclwiO1xuaW1wb3J0IHtzZXRBdHRyaWJ1dGVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvc2V0QXR0cmlidXRlSGFuZGxlclwiO1xuaW1wb3J0IHtcbiAgICBJbml0UmVxdWVzdCxcbiAgICBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIE15b3BCaW5kTWVzc2FnZSxcbiAgICBNeW9wQmluZFJlcGxheU1lc3NhZ2Vcbn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7U2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9TZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlclwiO1xuaW1wb3J0IHtHZXRFbGVtZW50VmFsdWVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvR2V0RWxlbWVudFZhbHVlSGFuZGxlci50c1wiO1xuLy8gQHRzLWlnbm9yZSBoYW5kbGVkIGJ5IGN1c3RvbSBlc2J1aWxkIHBsdWdpblxuaW1wb3J0IHZlcnNpb24gZnJvbSBcIm15b3Atc2RrLXZlcnNpb25cIjtcbmltcG9ydCB7R2V0QXR0cmlidXRlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2dldEF0dHJpYnV0ZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvU2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NldElubmVySHRtbEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRJbm5lckh0bWxIYW5kbGVyLnRzXCI7XG5cbi8qKlxuIFRoZSBJZnJhbWUgU0RLIGlzIGludGVuZGVkIGZvciBzY2VuYXJpb3Mgd2hlcmUgZGV2ZWxvcGVycyB3aXNoIHRvIGltcGxlbWVudCBNeW9wIGNvbXBvbmVudHMgYXMgc2VwYXJhdGUgd2ViIGFwcGxpY2F0aW9ucyBob3N0ZWQgd2l0aGluIGlmcmFtZXMuPGJyLz48YnIvPlxuIEJ5IGltcG9ydGluZyB0aGUgSWZyYW1lIFNESywgZGV2ZWxvcGVycyBnYWluIGFjY2VzcyB0byB0b29scyBhbmQgdXRpbGl0aWVzIG5lY2Vzc2FyeSBmb3IgaGFuZGxpbmcgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBob3N0IGFwcGxpY2F0aW9uIGFuZCB0aGUgZW1iZWRkZWQgaWZyYW1lLWJhc2VkIE15b3AgY29tcG9uZW50czxici8+PGJyLz5cbiBUaGlzIFNESyBmYWNpbGl0YXRlcyBzZWN1cmUgaXNvbGF0aW9uLCBhbGxvd2luZyBjb21wb25lbnRzIHRvIGZ1bmN0aW9uIGluZGVwZW5kZW50bHkgd2hpbGUgc3RpbGwgYmVuZWZpdGluZyBmcm9tIHRoZSBvdmVyYWxsIHN0cnVjdHVyZSBhbmQgbWFuYWdlbWVudCBjYXBhYmlsaXRpZXMgcHJvdmlkZWQgYnkgdGhlIGhvc3QgYXBwbGljYXRpb24uPGJyLz48YnIvPlxuXG4gT25jZSBsb2FkZWQgdGhlIGBSb290U0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuIGBgYGpzXG4gY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRJZnJhbWVNb2R1bGUoKSk7XG4gYGBgXG4gb3JcbiBgYGB0c1xuIGltcG9ydCB7Z2V0SWZyYW1lTW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IGdldElmcmFtZU1vZHVsZSgpKTtcbiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIElmcmFtZVNESyBleHRlbmRzIEJhc2VNeW9wU0RLIHtcblxuICAgIHB1YmxpYyB2ZXJzaW9uID0gdmVyc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmICghd2luZG93Lm15b3ApIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHdpbmRvdy5teW9wID0ge31cbiAgICAgICAgfVxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHdpbmRvdy5teW9wLklmcmFtZVNESyA9IHRoaXM7XG4gICAgfVxuXG4gICAgbWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGlmICghbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgJiYgcmVwbGF5VG8/LmhhbmRsZXJVbmlxdWVJZClcbiAgICAgICAgICAgIG1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyID0gcmVwbGF5VG8uaGFuZGxlclVuaXF1ZUlkXG5cbiAgICAgICAgY29uc3QgY29tcG9uZW50SWRzID0gT2JqZWN0LmtleXModGhpcy5jb21wb25lbnRzKTtcblxuICAgICAgICBpZiAoIW1lc3NhZ2UuZGVzdGluYXRpb24pIHtcbiAgICAgICAgICAgIGlmIChyZXBsYXlUbz8ucm91dGUpIHtcbiAgICAgICAgICAgICAgICAvLyB0YWtpbmcgdGhlIGZpcnN0IGNvbXBvbmVudCB0aGF0IGluaXRpYXRlZCB0aGF0IGN5Y2xlXG4gICAgICAgICAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IHJlcGxheVRvLnJvdXRlW3JlcGxheVRvLnJvdXRlLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmRlc3RpbmF0aW9uID0gY29tcG9uZW50SWRzWzBdXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtZXNzYWdlLnNvdXJjZSlcbiAgICAgICAgICAgIG1lc3NhZ2Uuc291cmNlID0gY29tcG9uZW50SWRzWzBdO1xuXG4gICAgICAgIG1lc3NhZ2UuZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi51cDtcblxuICAgICAgICAvLyBgaG9zdFdpbmRvd2AsIG5vdCBgd2luZG93LnBhcmVudGAgLS0gc2VlIHRoZSBmaWVsZCdzIGNvbW1lbnQuIEZvciBhIGNvbXBvbmVudFxuICAgICAgICAvLyBtb3VudGVkIGludG8gYW5vdGhlciBjb21wb25lbnQncyBkb2N1bWVudCB0aGUgcGFyZW50IGlzIGFuIGludGVybWVkaWF0ZSBmcmFtZVxuICAgICAgICAvLyB0aGF0IGRyb3BzIGNoaWxkIG1lc3NhZ2VzLCBzbyBhbiBJbml0UmVzcG9uc2Ugc2VudCB0aGVyZSBuZXZlciByZWFjaGVzIHRoZSBob3N0XG4gICAgICAgIC8vIGFuZCB0aGUgY29tcG9uZW50IHN0YXlzIHBlbmRpbmcgdW50aWwgaXQgdGltZXMgb3V0LlxuICAgICAgICAodGhpcy5ob3N0V2luZG93ID8/IHdpbmRvdy5wYXJlbnQpPy5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAuLi5tZXNzYWdlXG4gICAgICAgIH0sICcqJyk7XG4gICAgfVxuXG4gICAgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VNZXNzYWdlSGFuZGxlcltdID0gW1xuICAgICAgICBuZXcgQ2hhbmdlVGV4dEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IFNldElubmVySHRtbEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IEJpbmRPbkNsaWNrSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgRXhlY3V0ZVNjcmlwdEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBzZXRBdHRyaWJ1dGVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBTZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgU2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBHZXRBdHRyaWJ1dGVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG5cbiAgICAgICAgLy9jb21wb3NpdGUgc3VwcG9ydCBtZXNzYWdlcyA6XG4gICAgICAgIG5ldyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpXG4gICAgXTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB3aW5kb3cgdGhpcyBmcmFtZSBhbnN3ZXJzIHRvLiBEZWZhdWx0cyB0byB0aGUgcGFyZW50LCB3aGljaCBpcyBjb3JyZWN0IGZvciBhXG4gICAgICogY29tcG9uZW50IG1vdW50ZWQgZGlyZWN0bHkgYnkgdGhlIHBhZ2UncyBvd24gaG9zdC5cbiAgICAgKlxuICAgICAqIElUIElTIE5PVCBBTFdBWVMgVEhFIFBBUkVOVC4gQSBob3N0IGNhbiBtb3VudCBhIGNvbXBvbmVudCBpbnRvIGEgY29udGFpbmVyIHRoYXRcbiAgICAgKiBsaXZlcyBpbnNpZGUgQU5PVEhFUiBjb21wb25lbnQncyBkb2N1bWVudCAtLSBQaWMtVGltZSdzIHJlZWwgdGVtcGxhdGVzIGFyZSBtb3VudGVkXG4gICAgICogYnkgdGhlIHRvcC1sZXZlbCBob3N0IGludG8gYCNyZWVsU2xvdGAgaW5zaWRlIHRoZSByZWVsIGRpYWxvZydzIGZyYW1lLiBUaGUgcmVhbCBob3N0XG4gICAgICogaXMgdGhlbiBhIEdSQU5EcGFyZW50LCBhbmQgYHdpbmRvdy5wYXJlbnRgIGlzIGEgZnJhbWUgdGhhdCBrbm93cyBub3RoaW5nIGFib3V0IHRoaXNcbiAgICAgKiBjb21wb25lbnQ6IGl0cyBuZXN0ZWQgaG9zdFNESyBoYXMgbm8gZW50cnkgZm9yIGl0IGFuZCBpdHMgSWZyYW1lU0RLIGRyb3BzIG1lc3NhZ2VzXG4gICAgICogZnJvbSBhIGNoaWxkLiBSZXBsaWVzIHNlbnQgdG8gdGhlIHBhcmVudCBhcmUgc2ltcGx5IGxvc3QuXG4gICAgICpcbiAgICAgKiBTbyB3ZSBhZG9wdCB3aG9ldmVyIGFjdHVhbGx5IHRhbGtzIHRvIHVzLCB0aGUgZmlyc3QgdGltZSBhbiBhbmNlc3RvciBkb2VzLlxuICAgICAqL1xuICAgIHByaXZhdGUgaG9zdFdpbmRvdzogV2luZG93IHwgbnVsbCA9IHdpbmRvdy5wYXJlbnQ7XG5cbiAgICAvKipcbiAgICAgKiBDb21tYW5kcyAoaW5jbHVkaW5nIEV4ZWN1dGVTY3JpcHQpIG11c3QgY29tZSBmcm9tIGEgd2luZG93IHRoaXMgZnJhbWUgaXMgYWN0dWFsbHlcbiAgICAgKiBuZXN0ZWQgaW5zaWRlIC0tIG5ldmVyIGZyb20gYW4gb3BlbmVyIG9yIGEgc2libGluZyB0aGF0IG1lcmVseSBob2xkcyBhIHJlZmVyZW5jZS5cbiAgICAgKlxuICAgICAqIFRISVMgVVNFRCBUTyBDT01QQVJFIEFHQUlOU1QgYHdpbmRvdy5wYXJlbnRgIEFMT05FLCBhbmQgdGhhdCB3YXMgYSByZWdyZXNzaW9uIElcbiAgICAgKiBzaGlwcGVkIGluIDAuNC4wLWJldGE6IGl0IHNpbGVudGx5IGRyb3BwZWQgdGhlIGhvc3QncyBJbml0TWVzc2FnZSBmb3IgYW55IGNvbXBvbmVudFxuICAgICAqIG1vdW50ZWQgY3Jvc3MtZG9jdW1lbnQsIGJlY2F1c2UgdGhlIGhvc3QgaXMgYSBncmFuZHBhcmVudCB0aGVyZS4gVGhlIGZyYW1lIHRoZW5cbiAgICAgKiBhbm5vdW5jZWQgZm9yIGl0cyBmdWxsIDEwcyBidWRnZXQgaW50byBhIHBhcmVudCB0aGF0IG5ldmVyIGFuc3dlcnMgYW5kIHJlamVjdGVkIHdpdGhcbiAgICAgKiB0aW1lb3V0XzEwMDAwIGhhdmluZyByZWdpc3RlcmVkIG5vdGhpbmcuIFJlcHJvZHVjZWQgbGl2ZSBvbiBQaWMtVGltZSdzIFFBIHBhZ2VcbiAgICAgKiAyMDI2LTEwLTE3OiAxNSBJbml0UmVxdWVzdHMsIDAgSW5pdFJlc3BvbnNlcywgYElmcmFtZVNESy5jb21wb25lbnRzYCBlbXB0eS5cbiAgICAgKiAwLjMuMzYgaGFkIG5vIGd1YXJkIGF0IGFsbCwgd2hpY2ggaXMgd2h5IGl0IHdvcmtlZC5cbiAgICAgKlxuICAgICAqIFdhbGtpbmcgdGhlIGFuY2VzdG9yIGNoYWluIGtlZXBzIHRoZSBzZWN1cml0eSBwcm9wZXJ0eSAtLSBhbiBvcGVuZXIgb3IgYSBzaWJsaW5nIGlzXG4gICAgICogbm90IGFuIGFuY2VzdG9yIC0tIHdoaWxlIGFsbG93aW5nIGEgaG9zdCBhbnkgbnVtYmVyIG9mIGZyYW1lcyB1cC4gVGhlIHdhbGsgaXNcbiAgICAgKiBib3VuZGVkLCBhbmQgcmVhZGluZyBgLnBhcmVudGAgYWNyb3NzIG9yaWdpbnMgaXMgYWxsb3dlZCAob25seSB0aGUgcmVmZXJlbmNlIGlzXG4gICAgICogY29tcGFyZWQsIG5ldmVyIHRvdWNoZWQpLlxuICAgICAqL1xuICAgIHByaXZhdGUgaXNGcm9tSG9zdENoYWluID0gKHNvdXJjZTogTWVzc2FnZUV2ZW50U291cmNlIHwgbnVsbCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBpZiAoIXNvdXJjZSkgcmV0dXJuIHRydWU7ICAgICAgICAgICAgIC8vIHN5bnRoZXRpYyBkaXNwYXRjaCBjYXJyaWVzIG5vIHNvdXJjZVxuICAgICAgICBpZiAoc291cmNlID09PSB3aW5kb3cpIHJldHVybiB0cnVlO1xuXG4gICAgICAgIGxldCBjdXJyZW50OiBXaW5kb3cgPSB3aW5kb3c7XG4gICAgICAgIGZvciAobGV0IGRlcHRoID0gMDsgZGVwdGggPCAzMjsgZGVwdGgrKykge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gY3VycmVudC5wYXJlbnQ7XG4gICAgICAgICAgICBpZiAoIXBhcmVudCB8fCBwYXJlbnQgPT09IGN1cnJlbnQpIHJldHVybiBmYWxzZTsgICAvLyByZWFjaGVkIHRoZSB0b3BcbiAgICAgICAgICAgIGlmIChzb3VyY2UgPT09IHBhcmVudCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBjdXJyZW50ID0gcGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdCA9ICgpID0+IHtcbiAgICAgICAgd2luZG93Lm9ubWVzc2FnZSA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNGcm9tSG9zdENoYWluKGV2ZW50LnNvdXJjZSkpIHJldHVybjtcblxuICAgICAgICAgICAgLy8gQURPUFQgT05MWSBPTiBJbml0TWVzc2FnZSwgTk9UIE9OIEFOWSBBTkNFU1RPUiBNRVNTQUdFLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIEluaXRNZXNzYWdlIGlzIHRoZSBvbmUgbWVzc2FnZSB0aGF0IGVzdGFibGlzaGVzIHdobyBvd25zIHRoaXMgY29tcG9uZW50LCBzb1xuICAgICAgICAgICAgLy8gaXQgaXMgdGhlIG9ubHkgc2FmZSBzaWduYWwuIEFkb3B0aW5nIG9uIGFueSBhY2NlcHRlZCBtZXNzYWdlIGxldCBhblxuICAgICAgICAgICAgLy8gaW50ZXJtZWRpYXRlIGFuY2VzdG9yIC0tIHRoZSByZWVsIGRpYWxvZywgd2hpY2ggaXMgaXRzZWxmIGEgY29tcG9uZW50IGFuZFxuICAgICAgICAgICAgLy8gbWF5IGxlZ2l0aW1hdGVseSBwb3N0IHRvIGl0cyBvd24gc3VidHJlZSAtLSBiZWNvbWUgYGhvc3RXaW5kb3dgIGFuZCBzaWxlbnRseVxuICAgICAgICAgICAgLy8gdGFrZSBvdmVyIHRoZSByZXBseSBjaGFubmVsLCBwdXR0aW5nIHVzIGJhY2sgdG8gSW5pdFJlc3BvbnNlcyBnb2luZyB0byBhXG4gICAgICAgICAgICAvLyBmcmFtZSB0aGF0IGRyb3BzIHRoZW0uXG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlXG4gICAgICAgICAgICAgICAgJiYgZXZlbnQuc291cmNlICE9PSB3aW5kb3dcbiAgICAgICAgICAgICAgICAmJiBldmVudC5kYXRhPy5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0V2luZG93ID0gZXZlbnQuc291cmNlIGFzIFdpbmRvdztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5oYW5kbGVJbmNvbWVNZXNzYWdlcyhldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBJbml0UmVxdWVzdCgpKTtcbiAgICB9XG5cbn1cblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnSWZyYW1lU0RLJywgSWZyYW1lU0RLKTtcbiIsICJpbXBvcnQgKiBhcyBhbGwgZnJvbSAnLi9pbmRleCdcbmltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuXG5jb25zdCBNeW9wTWVzc2FnZXMgPSB7XG4gICAgLi4uYWxsXG59XG5cbmRlZmluZUR5bmFtaWNJbXBvcnQoJ015b3BNZXNzYWdlcycsIE15b3BNZXNzYWdlcyk7XG4iLCAiaW1wb3J0IHtkZWZpbmVEeW5hbWljSW1wb3J0fSBmcm9tIFwiLi4vZHluYW1pY0ltcG9ydC9kZWZpbmVEeW5hbWljSW1wb3J0LnRzXCI7XG5pbXBvcnQgKiBhcyBNeW9wSGVscGVycyBmcm9tIFwiLi9pbmRleC50c1wiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9pbmRleC50c1wiO1xuXG5kZWZpbmVEeW5hbWljSW1wb3J0KCdNeW9wSGVscGVycycsIE15b3BIZWxwZXJzKTtcbiIsICJpbXBvcnQgJy4vZHluYW1pY0ltcG9ydC9sb2FkX19mZWRlcmF0aW9uX18nO1xuLy8gQHRzLWlnbm9yZSBoYW5kbGVkIGJ5IGN1c3RvbSBlc2J1aWxkIHBsdWdpblxuaW1wb3J0IHZlcnNpb24gZnJvbSBcIm15b3Atc2RrLXZlcnNpb25cIjtcblxuY29uc29sZS5sb2coJ215b3Agcm9vdCBzZGsgLSBsb2FkZWQnLCBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW4pO1xuXG4vLyBUT0RPIDogcmVhZCB2YWx1ZSBmcm9tIHdpbmRvd1snX19mZWRlcmF0aW9uX18nXSA/XG4vL2NvbnN0IF9fUk9PVF9TREtfUFVCTElDX1VSTF9fID0gJ2h0dHBzOi8vZGZkbGsycDFtMTg3di5jbG91ZGZyb250Lm5ldC9teW9wX3Nkay5taW4uanMnXG5jb25zdCBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXyA9ICdodHRwczovL2Nkbi5teW9wLmRldi9zZGsvbmV4dC9teW9wX3Nkay5taW4uanMnXG5cbmNvbnN0IGdldEhvc3RNb2R1bGUgPSAoKSA9PiBpbXBvcnQoJy4vaG9zdC9ob3N0U0RLJylcbmNvbnN0IGdldElmcmFtZU1vZHVsZSA9ICgpID0+IGltcG9ydCgnLi9JZnJhbWUvSWZyYW1lU0RLJylcbmNvbnN0IGdldFdlYmNvbXBvbmVudE1vZHVsZSA9ICgpID0+IGltcG9ydCgnLi93ZWJjb21wb25lbnQvV2ViQ29tcG9uZW50U0RLJylcbmNvbnN0IGdldE15b3BNZXNzYWdlcyA9ICgpID0+IGltcG9ydCgnLi9tZXNzYWdlcy9NeW9wTWVzc2FnZXMnKVxuY29uc3QgZ2V0TXlvcEhlbHBlcnMgPSAoKSA9PiBpbXBvcnQoJy4vaGVscGVycy9NeW9wSGVscGVycycpXG5cbi8vIFRoZSBzcGxpdCBidWlsZCAoZGlzdC9janMpIHJlc29sdmVzIGVhY2ggaW1wb3J0IHRvIGEgZmVkZXJhdGlvbiBzdHViIHdob3NlIGBnZXQoKWAgbG9hZHMgdGhlXG4vLyBjaHVuay4gVGhlIHNpbmdsZS1maWxlIGJ1aWxkIChkaXN0L2Nqcy1idW5kbGVkKSBpbmxpbmVzIHRoZSByZWFsIG1vZHVsZSwgd2hpY2ggaGFzIG5vIGBnZXRgLlxuY29uc3QgZXhwb3NlR2xvYmFsbHkgPSAoaW1wb3J0RnVuY3Rpb246ICgpID0+IFByb21pc2U8YW55PikgPT4ge1xuICAgIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1vZCA9IGF3YWl0IGltcG9ydEZ1bmN0aW9uKCk7XG4gICAgICAgIHJldHVybiB0eXBlb2YgbW9kLmdldCA9PT0gJ2Z1bmN0aW9uJyA/IG1vZC5nZXQoKSA6IG1vZDtcbiAgICB9XG59XG5cbi8vIEZvciBzY3JpcHQvZ2xvYmFsIHVzYWdlIDpcbmNvbnN0IHJvb3RTREsgPSB7XG4gICAgdmVyc2lvbiA6IHZlcnNpb24sXG4gICAgZ2V0SG9zdE1vZHVsZTogZXhwb3NlR2xvYmFsbHkoZ2V0SG9zdE1vZHVsZSksXG4gICAgZ2V0SWZyYW1lTW9kdWxlOiBleHBvc2VHbG9iYWxseShnZXRJZnJhbWVNb2R1bGUpLFxuICAgIGdldFdlYmNvbXBvbmVudE1vZHVsZTogZXhwb3NlR2xvYmFsbHkoZ2V0V2ViY29tcG9uZW50TW9kdWxlKSxcbiAgICBnZXRNeW9wTWVzc2FnZXM6IGV4cG9zZUdsb2JhbGx5KGdldE15b3BNZXNzYWdlcyksXG4gICAgZ2V0TXlvcEhlbHBlcnM6IGV4cG9zZUdsb2JhbGx5KGdldE15b3BIZWxwZXJzKVxufTtcblxuLy8gQHRzLWlnbm9yZVxuaWYgKCF3aW5kb3cubXlvcCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3aW5kb3cubXlvcCA9IHtcbiAgICAgICAgX19ST09UX1NES19QVUJMSUNfVVJMX19cbiAgICB9XG59XG5cbi8vIEB0cy1pZ25vcmVcbmlmICghd2luZG93Lm15b3Aucm9vdFNESykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3aW5kb3cubXlvcCA9IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByb290U0RLLFxuICAgICAgICAuLi53aW5kb3cubXlvcFxuICAgIH07XG59IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKFwibXlvcCByb290IGhvc3QgbG9hZGVkIG1vcmUgdGhhbiBvbmNlLlwiKTtcbn1cblxuLy8gRm9yIGJ1bmRsZXJzIHVzYWdlIDpcbmNvbnN0IHNka01vZHVsZSA9IHtcbiAgICBnZXRIb3N0TW9kdWxlLFxuICAgIGdldElmcmFtZU1vZHVsZSxcbiAgICBnZXRXZWJjb21wb25lbnRNb2R1bGUsXG4gICAgZ2V0TXlvcE1lc3NhZ2VzLFxuICAgIGdldE15b3BIZWxwZXJzXG59XG5leHBvcnQgdHlwZSByb290U0RLVHlwZSA9IHR5cGVvZiBzZGtNb2R1bGU7XG5cbmV4cG9ydCB7XG4gICAgZ2V0SG9zdE1vZHVsZSxcbiAgICBnZXRJZnJhbWVNb2R1bGUsXG4gICAgZ2V0V2ViY29tcG9uZW50TW9kdWxlLFxuICAgIGdldE15b3BNZXNzYWdlcyxcbiAgICBnZXRNeW9wSGVscGVyc1xufVxuXG4vLyBkZWNsYXJlIGdsb2JhbCB7XG4vLyAgICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4vLyAgICAgICAgIG15b3A6IHtcbi8vICAgICAgICAgICAgIHJvb3RTREs6IHR5cGVvZiByb290U0RLXG4vLyAgICAgICAgIH1cbi8vICAgICB9XG4vLyB9XG4iLCAiLy8gQHRzLW5vY2hlY2tcbmltcG9ydCB7bW9kdWxlSW5zdGFuY2VLZXksIG9uTG9hZEtleX0gZnJvbSBcIi4vZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuXG5pZiAoIXdpbmRvd1snX19mZWRlcmF0aW9uX18nXSkge1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IHNjcmlwdFNyYyA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQ/LnNyYztcbiAgICBjb25zdCBfX3B1YmxpY19hdXRvX3BhdGhfXyA9IHNjcmlwdFNyYyA/IHNjcmlwdFNyYy5zcGxpdCgnLycpLnNsaWNlKDAsIC0xKS5qb2luKCcvJykgOiAnJztcblxuICAgIHdpbmRvd1snX19mZWRlcmF0aW9uX18nXSA9IHtcbiAgICAgICAgX19wdWJsaWNfYXV0b19wYXRoX18sXG4gICAgICAgIF9fdXNlX3B1YmxpY19hdXRvX3BhdGhfXzogdHJ1ZSxcbiAgICAgICAgX19wdWJsaWNfcGF0aF9fOiB1bmRlZmluZWQsXG4gICAgICAgIF9fbG9hZGluZ190aW1lb3V0X18gOiA1ICogMTAwMFxuICAgIH07XG59IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKCdfX2ZlZGVyYXRpb25fXyBsb2FkZWQgbW9yZSB0aGFuIG9uY2UuJyk7XG59XG5cbndpbmRvd1snX19mZWRlcmF0aW9uX18nXVsnbG9hZF9fZmVkZXJhdGlvbl9fJ10gPSAoc2NyaXB0RmlsZVBhdGgsIG1vZHVsZU5hbWUsIG9uTG9hZCkgPT4ge1xuXG4gICAgaWYgKCF3aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ11bbW9kdWxlTmFtZV0pIHtcbiAgICAgICAgbGV0IHNjcmlwdFRhZztcblxuICAgICAgICAvLyBDYWxsZXJzIHRoYXQgYXJyaXZlIHdoaWxlIHRoZSBjaHVuayBpcyBzdGlsbCBsb2FkaW5nIHdhaXQgaGVyZS4gV2l0aG91dCB0aGlzIHF1ZXVlIGFcbiAgICAgICAgLy8gc2Vjb25kIGNvbmN1cnJlbnQgZ2V0WE1vZHVsZSgpIHJlc29sdmVkIHdpdGggYHVuZGVmaW5lZGAgKHRoZSBpbnN0YW5jZSBpcyBub3Qgc2V0IHlldCkuXG4gICAgICAgIGNvbnN0IHBlbmRpbmcgPSBbb25Mb2FkXTtcblxuICAgICAgICB3aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ11bbW9kdWxlTmFtZV0gPSB7cGVuZGluZ307XG4gICAgICAgIHdpbmRvd1snX19mZWRlcmF0aW9uX18nXVttb2R1bGVOYW1lXVtvbkxvYWRLZXldID0gKG1vZHVsZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHNjcmlwdFRhZykge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQucmVtb3ZlQ2hpbGQoc2NyaXB0VGFnKTtcbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBjaGVjayB0aGF0OlxuICAgICAgICAgICAgICAgIHNjcmlwdFRhZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ3NjcmlwdCByZW1vdmVkLi4uICcpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKG1vZHVsZSk7XG5cbiAgICAgICAgICAgIHdpbmRvd1snX19mZWRlcmF0aW9uX18nXVttb2R1bGVOYW1lXVttb2R1bGVJbnN0YW5jZUtleV0gPSBtb2R1bGU7XG4gICAgICAgICAgICBwZW5kaW5nLnNwbGljZSgwKS5mb3JFYWNoKChjYikgPT4gY2IobW9kdWxlKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2FkU2NyaXB0ID0gKHNyYykgPT4ge1xuICAgICAgICAgICAgc2NyaXB0VGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICBzY3JpcHRUYWcudHlwZSA9ICdtb2R1bGUnO1xuICAgICAgICAgICAgc2NyaXB0VGFnLnNyYyA9IHNyYztcbiAgICAgICAgICAgIHNjcmlwdFRhZy5hc3luYyA9IHRydWU7XG5cbiAgICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIENETiBpZiB0aGUgc2NyaXB0IGZhaWxzIHRvIGxvYWQgKGUuZy4gY2FjaGluZyBwcm94aWVzIGxpa2UgTGl0ZVNwZWVkXG4gICAgICAgICAgICAvLyByZWxvY2F0ZSB0aGUgcm9vdCBTREsgYnV0IGRvbid0IGhhdmUgdGhlIGNodW5rIGZpbGVzKVxuICAgICAgICAgICAgc2NyaXB0VGFnLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2RuQmFzZSA9IHdpbmRvdy5teW9wPy5fX1JPT1RfU0RLX1BVQkxJQ19VUkxfXz8uc3BsaXQoJy8nKS5zbGljZSgwLCAtMSkuam9pbignLycpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNodW5rRmlsZU5hbWUgPSBzcmMuc3BsaXQoJy8nKS5wb3AoKTtcbiAgICAgICAgICAgICAgICBpZiAoY2RuQmFzZSAmJiAhc3JjLnN0YXJ0c1dpdGgoY2RuQmFzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBbbXlvcF0gY2h1bmsgbG9hZCBmYWlsZWQgZnJvbSAke3NyY30sIHJldHJ5aW5nIGZyb20gQ0ROYCk7XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQucmVtb3ZlQ2hpbGQoc2NyaXB0VGFnKTtcbiAgICAgICAgICAgICAgICAgICAgbG9hZFNjcmlwdChgJHtjZG5CYXNlfS8ke2NodW5rRmlsZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHRUYWcpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGxvYWRTY3JpcHQoc2NyaXB0RmlsZVBhdGgpO1xuXG4gICAgICAgIC8vIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlua1wiKTtcbiAgICAgICAgLy8gbGluay50eXBlID0gXCJ0ZXh0L2Nzc1wiO1xuICAgICAgICAvLyBsaW5rLnJlbCA9IFwic3R5bGVzaGVldFwiO1xuICAgICAgICAvLyBsaW5rLmhyZWYgPSBmaWxlTmFtZS5yZXBsYWNlKCcuanMnLCAnLmNzcycpO1xuICAgICAgICAvLyBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB3aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ11bbW9kdWxlTmFtZV07XG4gICAgICAgIGlmIChlbnRyeVttb2R1bGVJbnN0YW5jZUtleV0pIHtcbiAgICAgICAgICAgIG9uTG9hZChlbnRyeVttb2R1bGVJbnN0YW5jZUtleV0pO1xuICAgICAgICB9IGVsc2UgaWYgKGVudHJ5LnBlbmRpbmcpIHtcbiAgICAgICAgICAgIGVudHJ5LnBlbmRpbmcucHVzaChvbkxvYWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYF9fZmVkZXJhdGlvbl9fIG1vZHVsZSAke21vZHVsZU5hbWV9IGFscmVhZHkgbG9hZGVkLmApXG4gICAgICAgICAgICBvbkxvYWQoZW50cnlbbW9kdWxlSW5zdGFuY2VLZXldKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE1BQWEsZ0JBQ0EsV0FDQSxtQkFFQTtBQUpiO0FBQUE7QUFBQTtBQUFPLE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0sWUFBWTtBQUNsQixNQUFNLG9CQUFvQjtBQUUxQixNQUFNLHNCQUFzQixDQUFDLFlBQW9CLFdBQWdCO0FBRXBFLFlBQUksT0FBTyxjQUFjLEtBQUssT0FBTyxjQUFjLEVBQUUsVUFBVSxLQUFLLE9BQU8sY0FBYyxFQUFFLFVBQVUsRUFBRSxTQUFTLEdBQUc7QUFFL0csaUJBQU8sY0FBYyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsRUFBQyxDQUFDLFVBQVUsR0FBRyxPQUFNLENBQUM7QUFBQSxRQUN4RSxPQUFPO0FBQUEsUUFFUDtBQUFBLE1BQ0o7QUFBQTtBQUFBOzs7QUNaQSxNQUFPO0FBQVA7QUFBQTtBQUFBLE1BQU8sMkJBQVE7QUFBQTtBQUFBOzs7QUNBZixNQUlhO0FBSmI7QUFBQTtBQUFBO0FBSU8sTUFBTSxlQUFlO0FBQUE7QUFBQSxRQUV4QixlQUFlO0FBQUEsUUFDZixnQkFBZ0I7QUFBQSxRQUNoQixlQUFlO0FBQUEsUUFDZixrQkFBa0I7QUFBQSxRQUVsQixxQkFBcUI7QUFBQSxRQUNyQixvQkFBb0I7QUFBQSxRQUNwQix5QkFBeUI7QUFBQSxRQUV6Qix3QkFBd0I7QUFBQSxRQUV4QiwyQkFB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QUFDSCxnQkFBUSxJQUFJLHlCQUF5QixtQkFBVSxtQkFBa0I7QUFDakUsZUFBTyxNQUFNLGlCQUFpQixDQUFDO0FBQUEsTUFDbkM7QUFBQSxJQUNKO0FBQUEsRUFDSjs7O0FEaEZBO0FBRUEsVUFBUSxJQUFJLDBCQUEwQixTQUFTLFNBQVMsTUFBTTtBQUk5RCxNQUFNQywyQkFBMEI7QUFFaEMsTUFBTSxnQkFBZ0IsTUFBTTtBQUM1QixNQUFNLGtCQUFrQixNQUFNO0FBQzlCLE1BQU0sd0JBQXdCLE1BQU07QUFDcEMsTUFBTSxrQkFBa0IsTUFBTTtBQUM5QixNQUFNLGlCQUFpQixNQUFNO0FBSTdCLE1BQU0saUJBQWlCLENBQUMsbUJBQXVDO0FBQzNELFdBQU8sWUFBWTtBQUNmLFlBQU0sTUFBTSxNQUFNLGVBQWU7QUFDakMsYUFBTyxPQUFPLElBQUksUUFBUSxhQUFhLElBQUksSUFBSSxJQUFJO0FBQUEsSUFDdkQ7QUFBQSxFQUNKO0FBR0EsTUFBTSxVQUFVO0FBQUEsSUFDWixTQUFVO0FBQUEsSUFDVixlQUFlLGVBQWUsYUFBYTtBQUFBLElBQzNDLGlCQUFpQixlQUFlLGVBQWU7QUFBQSxJQUMvQyx1QkFBdUIsZUFBZSxxQkFBcUI7QUFBQSxJQUMzRCxpQkFBaUIsZUFBZSxlQUFlO0FBQUEsSUFDL0MsZ0JBQWdCLGVBQWUsY0FBYztBQUFBLEVBQ2pEO0FBR0EsTUFBSSxDQUFDLE9BQU8sTUFBTTtBQUVkLFdBQU8sT0FBTztBQUFBLE1BQ1YseUJBQUFBO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFHQSxNQUFJLENBQUMsT0FBTyxLQUFLLFNBQVM7QUFFdEIsV0FBTyxPQUFPO0FBQUE7QUFBQSxNQUVWO0FBQUEsT0FDRyxPQUFPO0FBQUEsRUFFbEIsT0FBTztBQUNILFlBQVEsSUFBSSx1Q0FBdUM7QUFBQSxFQUN2RDsiLAogICJuYW1lcyI6IFsiUmVwbGF5TWVzc2FnZUtleSIsICJtYXRjaCIsICJzY3JpcHRJbnB1dHMiLCAic2NyaXB0SW5wdXRzIiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgInNlZW4iLCAiX2EiLCAidGFyZ2V0IiwgIm1ha2VTZXJpYWxpemFibGUiLCAiX2EiLCAiaGVpZ2h0IiwgIndpZHRoIiwgIl9hIiwgIl9hIiwgIl9hIiwgIl9hIiwgImUiLCAiX2EiLCAiaW5pdF9jb25zdHMiLCAiaW5pdF9jb25zdHMiLCAiaW5pdF9jb25zdHMiLCAiaW5pdF9jb25zdHMiLCAiaG9zdFNESyIsICJpbml0X2V4ZWN1dGVTY3JpcHRIYW5kbGVyIiwgImluaXRfY29uc3RzIiwgImVsZW1lbnQiLCAiaW5pdF9leGVjdXRlU2NyaXB0SGFuZGxlciIsICJzZGsiLCAic2VlbiIsICJkb21JZCIsICJfYSIsICJpbml0X2hlbHBlcnMiLCAiaW5pdF9oZWxwZXJzIiwgInNraW4iLCAiX2EiLCAiY29tcG9uZW50IiwgInNlZ21lbnQiLCAiZXhwZXJpZW5jZSIsICJzZWxlY3RlZFNraW4iLCAiRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciIsICJpbml0X0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIiLCAiaW5pdF9jb25zdHMiLCAiQmluZE9uQ2xpY2tIYW5kbGVyIiwgImluaXRfYmluZE9uQ2xpY2tIYW5kbGVyIiwgIkNoYW5nZVRleHRIYW5kbGVyIiwgImluaXRfY2hhbmdlVGV4dEhhbmRsZXIiLCAiRXhlY3V0ZVNjcmlwdEhhbmRsZXIiLCAiaW5pdF9leGVjdXRlU2NyaXB0SGFuZGxlciIsICJBZGRFdmVudExpc3RlbmVySGFuZGxlciIsICJpbml0X2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIiwgInNldEF0dHJpYnV0ZUhhbmRsZXIiLCAiaW5pdF9zZXRBdHRyaWJ1dGVIYW5kbGVyIiwgIkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIiwgImluaXRfQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIiLCAiaW5pdF9jb25zdHMiLCAiaG9zdFNESyIsICJNdXRhdGlvbk9ic2VydmVyIiwgImdldElucHV0VmFsdWUiLCAiR2V0RWxlbWVudFZhbHVlSGFuZGxlciIsICJpbml0X0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIiLCAiaW5pdF9jb25zdHMiLCAiZWxlbWVudCIsICJTZXRJbm5lckh0bWxIYW5kbGVyIiwgImluaXRfc2V0SW5uZXJIdG1sSGFuZGxlciIsICJpbml0X0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIiLCAiaW5pdF9iaW5kT25DbGlja0hhbmRsZXIiLCAiaW5pdF9jaGFuZ2VUZXh0SGFuZGxlciIsICJpbml0X2V4ZWN1dGVTY3JpcHRIYW5kbGVyIiwgImluaXRfYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIiLCAiaW5pdF9zZXRBdHRyaWJ1dGVIYW5kbGVyIiwgImluaXRfQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIiLCAiaW5pdF9HZXRFbGVtZW50VmFsdWVIYW5kbGVyIiwgImluaXRfc2V0SW5uZXJIdG1sSGFuZGxlciIsICJfYSIsICJDaGFuZ2VUZXh0SGFuZGxlciIsICJTZXRJbm5lckh0bWxIYW5kbGVyIiwgIkJpbmRPbkNsaWNrSGFuZGxlciIsICJEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIiwgIkV4ZWN1dGVTY3JpcHRIYW5kbGVyIiwgIkFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIiwgInNldEF0dHJpYnV0ZUhhbmRsZXIiLCAiR2V0RWxlbWVudFZhbHVlSGFuZGxlciIsICJDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciIsICJNeW9wTWVzc2FnZXMiLCAiaW5pdF9NeW9wTWVzc2FnZXMiLCAiaW5pdF9oZWxwZXJzIiwgIl9hIiwgIl9fUk9PVF9TREtfUFVCTElDX1VSTF9fIl0KfQo=
|
|
5600
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydC50cyIsICJ2ZXJzaW9uOm15b3Atc2RrLXZlcnNpb24iLCAiLi4vLi4vc3JjL2NvbW1vbi9NeW9wTWVzc2FnZXMudHMiLCAiLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9CYXNlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQmluZENsaWNrTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ2hhbmdlVGV4dE1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9DdXN0b21SZWZNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9BZGRFdmVudExpc3RlbmVyTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvU2V0QXR0cmlidXRlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvR2V0RWxlbWVudFZhbHVlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvU2V0SW5uZXJIdG1sLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9Jbml0TWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9HZXRBdHRyaWJ1dGVNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9FeGVjdXRlQ29tcG9uZW50TWV0aG9kLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ2xlYW51cE1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL0Rpc3Bvc2VNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvSU15b3BDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL2NvbW1vbi9NeW9wRWxlbWVudFJlZi50cyIsICIuLi8uLi9zcmMvY29tbW9uL2Jhc2VNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvY29tbW9uL0Jhc2VNeW9wU0RLLnRzIiwgIi4uLy4uL3NyYy9jb21tb24vaW5kZXgudHMiLCAiLi4vLi4vc3JjL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2xvZ01lc3NhZ2VzLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcFJlZkNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvaG9zdC9jb21wb25lbnRzL215b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50Q29yZS50cyIsICIuLi8uLi9zcmMvaG9zdC9jb21wb25lbnRzL215b3BJZnJhbWVDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL2hvc3QvbG9hZGVycy9JTXlvcExvYWRlci50cyIsICIuLi8uLi9zcmMvaG9zdC9sb2FkZXJzL2lmcmFtZUxvYWRlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L2NvbnN0cy50cyIsICIuLi8uLi9zcmMvaG9zdC9jb21wb25lbnRzL215b3BXZWJjb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL2hvc3QvbG9hZGVycy93ZWJjb21wb25lbnRMb2FkZXIudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvZGVsaXZlcnlTdG9yZS50cyIsICIuLi8uLi9zcmMvaGVscGVycy9DbG91ZFJlcG9zaXRvcnkudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvY2xvdWRSZXBvc2l0b3J5SGVscGVycy50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL2NvbnN0cy50cyIsICIuLi8uLi9zcmMvY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L3NoYWRvd1Jvb3RSZWYudHMiLCAiLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvc2V0SW5uZXJIdG1sSGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L1dlYkNvbXBvbmVudFNESy50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L2luZGV4LnRzIiwgIi4uLy4uL3NyYy9ob3N0L2VtYmVkZGVkU0RLLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvSFRNTENvbXBvbmVudExvYWRlci50cyIsICIuLi8uLi9zcmMvaGVscGVycy9hcHBseVN0eWxlc2hlZXQudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvaWZyYW1lU2tpblVybFRva2VuaXplci50cyIsICIuLi8uLi9zcmMvaGVscGVycy9jbGFzc0xpc3QudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvY29uZmlnQnVpbGRlci50cyIsICIuLi8uLi9zcmMvaGVscGVycy9leGVjLnRzIiwgIi4uLy4uL3NyYy9oZWxwZXJzL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9ob3N0L215b3BPdmVycmlkZS50cyIsICIuLi8uLi9zcmMvaG9zdC9ob3N0U0RLLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvYmluZE9uQ2xpY2tIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2NoYW5nZVRleHRIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL3NldEF0dHJpYnV0ZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL2NvbW1vbi91dGlscy9kb21PYnNlcnZlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9TZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9HZXRFbGVtZW50VmFsdWVIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2dldEF0dHJpYnV0ZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvU2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL3NldElubmVySHRtbEhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL0lmcmFtZS9JZnJhbWVTREsudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL015b3BNZXNzYWdlcy50cyIsICIuLi8uLi9zcmMvaGVscGVycy9NeW9wSGVscGVycy50cyIsICIuLi8uLi9zcmMvU0RLLnRzIiwgIi4uLy4uL3NyYy9keW5hbWljSW1wb3J0L2xvYWRfX2ZlZGVyYXRpb25fXy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IGNvbnN0IF9fZmVkZXJhdGlvbl9fID0gXCJfX2ZlZGVyYXRpb25fX1wiXG5leHBvcnQgY29uc3Qgb25Mb2FkS2V5ID0gXCJvbkxvYWRcIlxuZXhwb3J0IGNvbnN0IG1vZHVsZUluc3RhbmNlS2V5ID0gXCJtb2R1bGVJbnN0YW5jZVwiXG5cbmV4cG9ydCBjb25zdCBkZWZpbmVEeW5hbWljSW1wb3J0ID0gKGdsb2JhbE5hbWU6IHN0cmluZywgbW9kdWxlOiBhbnkpID0+IHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKHdpbmRvd1tfX2ZlZGVyYXRpb25fX10gJiYgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXSAmJiB3aW5kb3dbX19mZWRlcmF0aW9uX19dW2dsb2JhbE5hbWVdW29uTG9hZEtleV0pIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB3aW5kb3dbX19mZWRlcmF0aW9uX19dW2dsb2JhbE5hbWVdW29uTG9hZEtleV0oe1tnbG9iYWxOYW1lXTogbW9kdWxlfSlcbiAgICB9IGVsc2Uge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdfX2ZlZGVyYXRpb25fXyBsb2FkZXIgbm90IGRlZmluZWQgZm9yIG1vZHVsZScsIG1vZHVsZSk7XG4gICAgfVxufSIsICJleHBvcnQgZGVmYXVsdCAnMC40LjAtYmV0YS42JzsiLCAidHlwZSBTdHJpbmdXaXRoQXV0b2NvbXBsZXRlPFQ+ID0gVCB8IChzdHJpbmcgJiBSZWNvcmQ8bmV2ZXIsIG5ldmVyPik7XG5cbmV4cG9ydCB0eXBlIE15b3BNZXNzYWdlS2V5ID0gU3RyaW5nV2l0aEF1dG9jb21wbGV0ZTxrZXlvZiB0eXBlb2YgTXlvcE1lc3NhZ2VzIHwga2V5b2YgdHlwZW9mIE15b3BNZXNzYWdlcy5Jbj47XG5cbmV4cG9ydCBjb25zdCBNeW9wTWVzc2FnZXMgPSB7XG4gICAgLy9ob3N0IHRvIGNvbXBvbmVudFxuICAgICdJbml0UmVxdWVzdCc6ICdJbml0UmVxdWVzdCcsXG4gICAgJ0luaXRSZXNwb25zZSc6ICdJbml0UmVzcG9uc2UnLFxuICAgICdJbml0TWVzc2FnZSc6ICdJbml0TWVzc2FnZScsXG4gICAgJ0Rpc3Bvc2VNZXNzYWdlJzogJ0Rpc3Bvc2VNZXNzYWdlJyxcblxuICAgICdDaGFuZ2VUZXh0TWVzc2FnZSc6ICdDaGFuZ2VUZXh0TWVzc2FnZScsXG4gICAgJ0JpbmRDbGlja01lc3NhZ2UnOiAnQmluZENsaWNrTWVzc2FnZScsXG4gICAgJ0RldGVjdE15b3BSZWZzTWVzc2FnZSc6ICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnLFxuXG4gICAgJ0V4ZWN1dGVTY3JpcHRNZXNzYWdlJzogJ0V4ZWN1dGVTY3JpcHRNZXNzYWdlJyxcblxuICAgICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZSc6ICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZScsXG4gICAgJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnOiAnU2V0QXR0cmlidXRlTWVzc2FnZScsXG5cbiAgICAnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSc6ICdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJyxcbiAgICAnRW52ZWxvcGVkTWVzc2FnZSc6ICdFbnZlbG9wZWRNZXNzYWdlJyxcblxuICAgICdHZXRFbGVtZW50VmFsdWVNZXNzYWdlJzogJ0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnLFxuICAgICdHZXRBdHRyaWJ1dGVNZXNzYWdlJzogJ0dldEF0dHJpYnV0ZU1lc3NhZ2UnLFxuXG4gICAgJ1NldElubmVySHRtbCc6ICdTZXRJbm5lckh0bWwnLFxuXG4gICAgLy9jb21wb25lbnQgbWVzc2FnZXNcbiAgICAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCc6ICdFeGVjdXRlQ29tcG9uZW50TWV0aG9kJyxcbiAgICAnU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnOiAnU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnLFxuICAgICdTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnOiAnU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJyxcblxuICAgICdDbGVhbnVwTWVzc2FnZSc6ICdDbGVhbnVwTWVzc2FnZScsXG5cbiAgICAvLyBleHRlcm5hbCB0byBob3N0IDpcbiAgICBJbjoge1xuICAgICAgICAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnOiAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnLFxuICAgICAgICAnQ2xpY2tSZXBsYXlNZXNzYWdlJzogJ0NsaWNrUmVwbGF5TWVzc2FnZScsXG4gICAgICAgICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJzogJ0V4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UnLFxuXG4gICAgICAgICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJzogJ0V2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UnLFxuICAgICAgICAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSc6ICdFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlJyxcblxuICAgICAgICBcIkdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2VcIjogXCJHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlXCIsXG4gICAgICAgICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSc6ICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZScsXG4gICAgICAgICdFbnZlbG9wZWRNZXNzYWdlJzogJ0VudmVsb3BlZE1lc3NhZ2UnLFxuXG4gICAgICAgICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc6ICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZScsXG4gICAgICAgICdDbGVhbnVwUmVwbGF5TWVzc2FnZSc6ICdDbGVhbnVwUmVwbGF5TWVzc2FnZScsXG4gICAgICAgICdSZXNpemVPYnNlcnZlck1lc3NhZ2UnOiAnUmVzaXplT2JzZXJ2ZXJNZXNzYWdlJ1xuICAgIH1cbn1cbiIsICIvL1RPRE8gOiByZXVzZSBmcm9tIG9uZSBwbGFjZS5cbi8vIG5lZWRzIHRvIGJlIHVzZWQgaW4gbXlvcC1zZGssIG15b3AtZGFzaGJhb3JkLCBteW9wLXNlcnZlciwgbXlvcC1jbGkgLi5cblxuZXhwb3J0IGNvbnN0IHV1aWR2NCA9ICgpID0+IHtcbiAgICByZXR1cm4gXCIxMDAwMDAwMC0xMDAwLTQwMDAtODAwMC0xMDAwMDAwMDAwMDBcIi5yZXBsYWNlKC9bMDE4XS9nLCBjID0+XG4gICAgICAgICgrYyBeIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMSkpWzBdICYgMTUgPj4gK2MgLyA0KS50b1N0cmluZygxNilcbiAgICApO1xufVxuXG4vLyBDb252ZXJ0IFVVSUQgc3RyaW5nIHRvIGJ5dGVzXG5leHBvcnQgY29uc3QgdXVpZFRvQnl0ZXMgPSAodXVpZDogc3RyaW5nKTogVWludDhBcnJheSA9PiB7XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShcbiAgICAgICAgdXVpZC5yZXBsYWNlKC8tL2csICcnKS5tYXRjaCgvLnsxLDJ9L2cpIS5tYXAoYnl0ZSA9PiBwYXJzZUludChieXRlLCAxNikpXG4gICAgKTtcbn07XG5cbi8vIENvbnZlcnQgYnl0ZXMgdG8gVVVJRCBzdHJpbmdcbmV4cG9ydCBjb25zdCBieXRlc1RvVXVpZCA9IChieXRlczogVWludDhBcnJheSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgaGV4ID0gWy4uLmJ5dGVzXS5tYXAoYiA9PiBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKTtcbiAgICByZXR1cm4gW1xuICAgICAgICBoZXguc2xpY2UoMCwgOCksXG4gICAgICAgIGhleC5zbGljZSg4LCAxMiksXG4gICAgICAgIGhleC5zbGljZSgxMiwgMTYpLFxuICAgICAgICBoZXguc2xpY2UoMTYsIDIwKSxcbiAgICAgICAgaGV4LnNsaWNlKDIwKVxuICAgIF0uam9pbignLScpO1xufTtcblxuLy8gQmFzZTY0IFVSTC1zYWZlIGVuY29kZVxuZXhwb3J0IGNvbnN0IGJhc2U2NFVybEVuY29kZSA9IChieXRlczogVWludDhBcnJheSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgYmFzZTY0ID0gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmJ5dGVzKSk7XG4gICAgcmV0dXJuIGJhc2U2NC5yZXBsYWNlKC9cXCsvZywgJy0nKS5yZXBsYWNlKC9cXC8vZywgJ18nKS5yZXBsYWNlKC89KyQvLCAnJyk7XG59O1xuXG4vLyBCYXNlNjQgVVJMLXNhZmUgZGVjb2RlXG5leHBvcnQgY29uc3QgYmFzZTY0VXJsRGVjb2RlID0gKHN0cjogc3RyaW5nKTogVWludDhBcnJheSA9PiB7XG4gICAgbGV0IGJhc2U2NCA9IHN0ci5yZXBsYWNlKC8tL2csICcrJykucmVwbGFjZSgvXy9nLCAnLycpO1xuICAgIHdoaWxlIChiYXNlNjQubGVuZ3RoICUgNCkgYmFzZTY0ICs9ICc9JztcbiAgICBjb25zdCBiaW5hcnkgPSBhdG9iKGJhc2U2NCk7XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShiaW5hcnksIGNoYXIgPT4gY2hhci5jaGFyQ29kZUF0KDApKTtcbn07XG5cbi8vIENvbXByZXNzIGFuIGFycmF5IG9mIFVVSURzIGludG8gYSBzaG9ydCBVUkwtc2FmZSBzdHJpbmdcbmV4cG9ydCBjb25zdCBjb21wcmVzc1VVSURzID0gKHV1aWRzOiBzdHJpbmdbXSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgYWxsQnl0ZXMgPSB1dWlkcy5mbGF0TWFwKHV1aWQgPT4gQXJyYXkuZnJvbSh1dWlkVG9CeXRlcyh1dWlkKSkpO1xuICAgIHJldHVybiBiYXNlNjRVcmxFbmNvZGUobmV3IFVpbnQ4QXJyYXkoYWxsQnl0ZXMpKTtcbn07XG5cbi8vIERlY29tcHJlc3MgZnJvbSBVUkwtc2FmZSBzdHJpbmcgYmFjayB0byBhbiBhcnJheSBvZiBVVUlEc1xuZXhwb3J0IGNvbnN0IGRlY29tcHJlc3NVVUlEcyA9IChlbmNvZGVkOiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XG4gICAgY29uc3QgYnl0ZXMgPSBiYXNlNjRVcmxEZWNvZGUoZW5jb2RlZCk7XG4gICAgaWYgKGJ5dGVzLmxlbmd0aCAlIDE2ICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaW5wdXQgbGVuZ3RoJyk7XG5cbiAgICBjb25zdCB1dWlkczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAxNikge1xuICAgICAgICB1dWlkcy5wdXNoKGJ5dGVzVG9VdWlkKGJ5dGVzLnNsaWNlKGksIGkgKyAxNikpKTtcbiAgICB9XG4gICAgcmV0dXJuIHV1aWRzO1xufTtcbiIsICJleHBvcnQgKiBmcm9tICcuL3V1aWQudHMnXG5cbmV4cG9ydCBjb25zdCB3YWl0ID0gKG1zOiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vaG9zdFwiO1xuaW1wb3J0IHtJUmVmQ29uZmlnfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBNZXNzYWdlRGlyZWN0aW9uIHtcbiAgICBzdGF0aWMgZG93biA9ICdkb3duJyBhcyBjb25zdFxuICAgIHN0YXRpYyB1cCA9ICd1cCcgYXMgY29uc3Rcbn1cblxuZXhwb3J0IHR5cGUgTWVzc2FnZURpcmVjdGlvbk9wdGlvbiA9ICd1cCcgfCAnZG93bic7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcE1lc3NhZ2U8VCA9IGFueT4ge1xuICAgIGlkID0gdXVpZHY0KClcblxuICAgIHN0YXRpYyBjcmVhdGU8VCwgVSBleHRlbmRzIG5ldyAoLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFU+KSA9PiBUID0gdHlwZW9mIHRoaXM+KFxuICAgICAgICB0aGlzOiBVLFxuICAgICAgICAuLi5hcmdzOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8VT5cbiAgICApOiBJbnN0YW5jZVR5cGU8dHlwZW9mIHRoaXM+IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gbmV3IHRoaXMoLi4uYXJncyk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ21lZXNhZ2UgaWQgY3JlYXRlZCcsIHRoaXMuaWQsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO1xuICAgIH1cblxuICAgIG15b3AgPSB0cnVlXG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXkgfCBzdHJpbmc7XG5cbiAgICBjb250ZW50PzogVFxuXG4gICAgLy8gVE9ETyA6IGNhbnQgYmUgb3B0aW9uYWwgXG4gICAgc291cmNlPzogc3RyaW5nXG4gICAgZGVzdGluYXRpb24/OiBzdHJpbmdcblxuICAgIHJvdXRlPzogc3RyaW5nW11cblxuICAgIHJlZj86IFJlZlxuXG4gICAgZGlyZWN0aW9uPzogTWVzc2FnZURpcmVjdGlvbk9wdGlvblxuXG4gICAgY2xlYW5hYmxlOiBib29sZWFuID0gZmFsc2VcblxuICAgIGlzVHlwZW9mKG1zZzogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBtc2cubWVzc2FnZVR5cGUgPT09IHRoaXMubWVzc2FnZVR5cGVcbiAgICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNeW9wRWxlbWVudE1lc3NhZ2U8VCA9IGFueT4gZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8VD4ge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZikge1xuICAgICAgICBzdXBlcigpXG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEJpbmRNZXNzYWdlPFQgPSBhbnksIFIgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2UgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcblxuICAgIHB1YmxpYyBhYnN0cmFjdCByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5O1xuXG4gICAgcHVibGljIGhhbmRsZXJVbmlxdWVJZCA9IHV1aWR2NCgpXG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgaGFuZGxlcjogKG1lc3NhZ2U6IFIpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlZiB7XG4gICAgcHVibGljIG15b3AgPSB0cnVlO1xuXG4gICAgcHVibGljIF9fbm9uUHJveGllZD86IFJlZjtcblxuICAgIHN0YXRpYyBjcmVhdGUoc2VsZWN0b3I6IHN0cmluZywgcmVmQ29uZmlnPzogSVJlZkNvbmZpZywgY29tcG9uZW50PzogSU15b3BDb21wb25lbnQpIHtcbiAgICAgICAgbGV0IF9yZWZDb25maWcgPSByZWZDb25maWc7XG4gICAgICAgIGlmICghX3JlZkNvbmZpZykge1xuICAgICAgICAgICAgX3JlZkNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBpZDogJycsXG4gICAgICAgICAgICAgICAgbmFtZTogJycsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yVHlwZTogJ2lkLWF0dHJpYnV0ZScsXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgICAgICAgICAgICAgIGJlaGF2aW9yOiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjb2RlJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gYXMgSVJlZkNvbmZpZ1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVmKF9yZWZDb25maWcsIGNvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZkNvbmZpZzogSVJlZkNvbmZpZywgcHVibGljIGNvbXBvbmVudD86IElNeW9wQ29tcG9uZW50KSB7XG4gICAgICAgIHRoaXMuX19ub25Qcm94aWVkID0ge1xuICAgICAgICAgICAgLi4udGhpcyxcbiAgICAgICAgICAgIGNvbXBvbmVudDogbnVsbCAvLyBpbiBvcmRlciB0byBiZSBzZXJpYWxpemFibGVcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0NsaWNrUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEJpbmRDbGlja01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgQ2xpY2tSZXBsYXlNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdCaW5kQ2xpY2tNZXNzYWdlJztcbiAgICBjbGVhbmFibGUgPSB0cnVlO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBoYW5kbGVyOiAobWVzc2FnZTogQ2xpY2tSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENsaWNrUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dE1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8c3RyaW5nPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9ICdDaGFuZ2VUZXh0TWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIHRleHQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSB0ZXh0XG4gICAgfVxufSIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJ1xuXG5jb25zdCBmdW5jdGlvbkJvZHlSZWdleCA9IC8oPzpmdW5jdGlvblxccypcXHcqXFxzKlxcKFteKV0qXFwpXFxzKlxceyhbXFxzXFxTXSo/KVxcfXwoXFwoW14pXSpcXClcXHMqPT5cXHMqXFx7KFtcXHNcXFNdKj8pXFx9KSlcXHMqJC87XG5jb25zdCBleHByZXNzaW9uQm9keVJlZ2V4ID0gL1xcKFxccypbXildK1xccypcXClcXHMqPT5cXHMqKC4rKS87XG5cbmV4cG9ydCBjb25zdCBzdHJpcEZ1bmN0aW9uID0gKGNvbnRlbnQ6IHN0cmluZykgPT4ge1xuICAgIGxldCBtYXRjaCA9IGNvbnRlbnQubWF0Y2goZnVuY3Rpb25Cb2R5UmVnZXgpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4gbWF0Y2hbMV0gfHwgbWF0Y2hbM107XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IG1hdGNoID0gY29udGVudC5tYXRjaChleHByZXNzaW9uQm9keVJlZ2V4KTtcbiAgICAgICAgaWYgKG1hdGNoKVxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdLnRyaW0oKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIHNjcmlwdElucHV0cyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuXG59IHwge307XG5cbmV4cG9ydCB0eXBlIHNjcmlwdFZhcnM8VD4gPSB7XG4gICAgc2VuZDogKGRhdGE6IFQpID0+IHZvaWQ7XG4gICAgLy8gY29tcGxldGVTdHJlYW06ICgpID0+IHZvaWQ7XG4gICAgcm9vdFJlZjogUm9vdFJlZjtcbiAgICBtYWtlU2VyaWFsaXphYmxlOiB0eXBlb2YgbWFrZVNlcmlhbGl6YWJsZVxufVxuXG5leHBvcnQgdHlwZSBleHRlbmRlZFNjcmlwdFZhcnM8VCwgST4gPSB7XG4gICAgW0sgaW4ga2V5b2YgSV06IElbS107XG59ICYgc2NyaXB0VmFyczxUPlxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdE1lc3NhZ2U8VCA9IGFueSwgSSBleHRlbmRzIHNjcmlwdElucHV0cyA9IGFueT4gZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8c3RyaW5nLCBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+PiB7XG5cbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbiAgICBtZXNzYWdlVHlwZSA9ICdFeGVjdXRlU2NyaXB0TWVzc2FnZSc7XG4gICAgc2NyaXB0OiBzdHJpbmcgPSAnJ1xuXG4gICAgc3RhdGljIHJlcGxpZXJLZXkgPSAnc2VuZCc7XG4gICAgc3RhdGljIGNvbXBsZXRlU3RyZWFtS2V5ID0gJ2NvbXBsZXRlU3RyZWFtJztcblxuICAgIGNvbnN0cnVjdG9yKHNjcmlwdDogKHZhcnM6IGV4dGVuZGVkU2NyaXB0VmFyczxULCBJPikgPT4gVCwgaGFuZGxlcjogKG1lc3NhZ2U6IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VD4pID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgfSwgcHVibGljIHNjcmlwdElucHV0cz86IEkpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgICAgIHRoaXMuc2NyaXB0ID0gc2NyaXB0LnRvU3RyaW5nKCk7XG5cbiAgICAgICAgLy9UT0RPOiBjYW4gYmUgcmVtb3ZlXG4gICAgICAgIHRoaXMuY29udGVudCA9IHNjcmlwdC50b1N0cmluZygpXG4gICAgICAgIHRoaXMuY29udGVudCA9IHN0cmlwRnVuY3Rpb24odGhpcy5jb250ZW50KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPFQ+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIGNvbnRlbnQ6IFQpIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgICBFeGVjdXRlU2NyaXB0TWVzc2FnZSxcbiAgICBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlLFxuICAgIGV4dGVuZGVkU2NyaXB0VmFycyxcbiAgICBzY3JpcHRJbnB1dHMsIHN0cmlwRnVuY3Rpb25cbn0gZnJvbSBcIi4vRXhlY3V0ZVNjcmlwdE1lc3NhZ2UudHNcIjtcblxuZXhwb3J0IHR5cGUgY3VzdG9tUmVmU2NyaXB0SW5wdXRzID0ge1xuICAgIGVsZW1lbnRJZDogc3RyaW5nLFxuICAgIHJlZj86IEhUTUxFbGVtZW50LFxuICAgIF9zY3JpcHQ/OiBzdHJpbmcsXG4gICAgX19zY3JpcHRJbnB1dHM/OiBPYmplY3Rcbn07XG5cbmV4cG9ydCBjbGFzcyBDdXN0b21SZWZNZXNzYWdlPFQgPSBhbnksIEkgZXh0ZW5kcyBzY3JpcHRJbnB1dHMgPSBjdXN0b21SZWZTY3JpcHRJbnB1dHM+IGV4dGVuZHMgRXhlY3V0ZVNjcmlwdE1lc3NhZ2U8VCwgSSAmIGN1c3RvbVJlZlNjcmlwdElucHV0cz4ge1xuXG4gICAgY29uc3RydWN0b3Ioc2NyaXB0OiAodmFyczogZXh0ZW5kZWRTY3JpcHRWYXJzPFQsIEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHM+KSA9PiBULFxuICAgICAgICAgICAgICAgIHB1YmxpYyBzY3JpcHRJbnB1dHM6IEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHMsXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogKG1lc3NhZ2U6IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VD4pID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgfSkge1xuXG4gICAgICAgIC8vbW9jayB2YXJzXG4gICAgICAgIC8vIGxldCByb290UmVmLCBlbGVtZW50SWQsIF9zY3JpcHQsIF9fc2NyaXB0SW5wdXRzO1xuICAgICAgICBzdXBlcigoe3Jvb3RSZWYsIGVsZW1lbnRJZCwgX3NjcmlwdCwgX19zY3JpcHRJbnB1dHN9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWZzID0gKHJvb3RSZWYuc2hhZG93Um9vdCB8fCByb290UmVmLmNvbnRhaW5lcikucXVlcnlTZWxlY3RvckFsbChgWyR7J215b3AtaWQnfT0nJHtlbGVtZW50SWR9J11gKTtcbiAgICAgICAgICAgIGlmIChyZWZzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vICBjb25zdCByZWYgPSByZWZzWzBdO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgZXhwb3NpbmcgXCJyZWZzXCIgYW5kIG5vdCBvbmx5IFwicmVmXCJcbiAgICAgICAgICAgICAgICAvL2ZvciBjYXNlcyB3aGVyZSB0aGUgUmVmIGhhcyBtdWx0aXBsYXRlIGltcGxlbWVudGF0aW9uc1xuXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIF9fc2NyaXB0SW5wdXRzLnJlZiA9IHJlZnNbMF07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkeW5hbWljRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oYHJldHVybiAoJHtfc2NyaXB0fSkoLi4uYXJndW1lbnRzKWApO1xuICAgICAgICAgICAgICAgIHJldHVybiBkeW5hbWljRnVuY3Rpb24oX19zY3JpcHRJbnB1dHMpO1xuXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIC8vcmV0dXJuIEZ1bmN0aW9uKCdyZWYnLCAncm9vdFJlZicsIC4uLk9iamVjdC5rZXlzKF9fc2NyaXB0SW5wdXRzKSwgX3NjcmlwdCEpKHJlZiwgcm9vdFJlZiwgLi4uT2JqZWN0LnZhbHVlcyhfX3NjcmlwdElucHV0cykpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbCBhcyBUO1xuICAgICAgICB9LCBoYW5kbGVyKTtcblxuICAgICAgICB0aGlzLnNjcmlwdElucHV0cyA9IHtcbiAgICAgICAgICAgIC4uLnNjcmlwdElucHV0cyxcbiAgICAgICAgICAgIC8vX3NjcmlwdDogc3RyaXBGdW5jdGlvbihzY3JpcHQudG9TdHJpbmcoKSksXG4gICAgICAgICAgICBfc2NyaXB0OiBzY3JpcHQudG9TdHJpbmcoKVxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXJpYWxpemFibGUsIFNlcmlhbGl6YWJsZVNrZWxldG9ufSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U8VCBleHRlbmRzIGtleW9mIEhUTUxFbGVtZW50RXZlbnRNYXAgPSBrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwPiBleHRlbmRzIE15b3BCaW5kTWVzc2FnZSB7XG5cbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbiAgICBtZXNzYWdlVHlwZSA9ICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZSc7XG4gICAgY2xlYW5hYmxlID0gdHJ1ZTtcbiAgICBzZXJpYWxpemFibGVTa2VsZXRvbjogU2VyaWFsaXphYmxlU2tlbGV0b248SFRNTEVsZW1lbnRFdmVudE1hcFtUXT4gPSBmYWxzZSAvLyB7fSAvLyBlbXB0eVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBwdWJsaWMgdHlwZTogVCwgcHVibGljIGhhbmRsZXI6IChtZXNzYWdlOiBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpXG4gICAgfVxuXG4gICAgd2l0aFNlcmlhbGl6YWJsZVNrZWxldG9uKHNlcmlhbGl6YWJsZVNrZWxldG9uOiBTZXJpYWxpemFibGVTa2VsZXRvbjxIVE1MRWxlbWVudEV2ZW50TWFwW1RdPikge1xuICAgICAgICB0aGlzLnNlcmlhbGl6YWJsZVNrZWxldG9uID0gc2VyaWFsaXphYmxlU2tlbGV0b247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIGU6IFNlcmlhbGl6YWJsZTxFdmVudD4pIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0ge1xuICAgICAgICAgICAgZVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBSZWYsfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG5cbmV4cG9ydCBjbGFzcyBTZXRBdHRyaWJ1dGVNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcblxuICAgIG1lc3NhZ2VUeXBlID0gJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBwdWJsaWMgbmFtZTogc3RyaW5nLCBwdWJsaWMgdmFsdWU6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NlcmlhbGl6YWJsZX0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIGhhbmRsZXI6IChtZXNzYWdlOiBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgRm9ybURhdGFFbnRyeSA9IHtcbiAgICBpZD86IHN0cmluZyxcbiAgICBuYW1lPzogc3RyaW5nLFxuICAgIHZhbHVlPzogSW5wdXRFbGVtZW50VmFsdWUsXG4gICAgcmVxdWlyZWQ/OiBib29sZWFuLFxuICAgIHZhbGlkaXR5PzogU2VyaWFsaXphYmxlPFZhbGlkaXR5U3RhdGU+LFxuICAgIG15b3BJZD86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBJbnB1dEVsZW1lbnRGb3JtVmFsdWUgPSB7XG4gICAgZm9ybURhdGE/OiB7IFtrZXk6IHN0cmluZ106IEZvcm1EYXRhRW50cnkgfVxuICAgIHVubWFwcGVkRGF0YT86IEZvcm1EYXRhRW50cnlbXVxufTtcblxuZXhwb3J0IHR5cGUgSW5wdXRFbGVtZW50VmFsdWUgPSBzdHJpbmcgfCBJbnB1dEVsZW1lbnRGb3JtVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkXG5cbmV4cG9ydCBjbGFzcyBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZW50OiBJbnB1dEVsZW1lbnRWYWx1ZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cblxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRJbm5lckh0bWwgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8c3RyaW5nPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRJbm5lckh0bWwnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBpbm5lckh0bWw6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBpbm5lckh0bWxcbiAgICB9XG59IiwgImltcG9ydCB7IEJhc2VNeW9wTWVzc2FnZSB9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbi8vIHNlbnQgYnkgaG9zdCB0byBjb21wb25lbnRzLCBjb250YWlucyB0aGllciBpZCBcbmV4cG9ydCBjbGFzcyBJbml0TWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTx7IGlkOiBzdHJpbmcgfT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0luaXRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSB7IGlkIH1cbiAgICB9XG5cbiAgICBpc1R5cGVvZihtc2c6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuXG4vLyBjb21wb25lbnQgbm90aWZ5IGhvc3QgdGhlIGl0IHdhcyBpbml0YXRlZCBcbmV4cG9ydCBjbGFzcyBJbml0UmVzcG9uc2UgZXh0ZW5kcyBJbml0TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnSW5pdFJlc3BvbnNlJztcbn1cblxuLy8gY29tcG9uZW50IGFzayB0byBob3N0IHRvIGdldCBpbml0YXRlZCBcbmV4cG9ydCBjbGFzcyBJbml0UmVxdWVzdCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnSW5pdFJlcXVlc3QnO1xufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50Q29uZmlnLCBJUmVmQ29uZmlnfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0L2hvc3RTREsudHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZkNvbmZpZzogSVJlZkNvbmZpZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgbmVzdGVkQ29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvcHRpb25zOiBsb2FkZXJPcHRpb25zLFxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IChtZXNzYWdlOiBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSkgPT4gdm9pZCxcbiAgICApIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG5cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIE5lc3RlZFJlZiA9IHtcbiAgICByZWZOYW1lOiBzdHJpbmcsXG4gICAgY29tcG9uZW50RGVmaW5pdGlvbklkOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIG5lc3RlZFJlZnM6IE5lc3RlZFJlZltdLCBwdWJsaWMgZmFpbGVkPzogYm9vbGVhbikge1xuICAgICAgICBzdXBlcihyZXBsYXlUb0hhbmRsZXIpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIEVudmVsb3BlZE1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0VudmVsb3BlZE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGRlc3RpbmF0aW9uOiBzdHJpbmcsIHB1YmxpYyBtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICBjb25zdCBpbm5lckVudmVsb3BlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBFbnZlbG9wZWRNZXNzYWdlKTtcbiAgICAgICAgdGhpcy5yb3V0ZSA9IFtkZXN0aW5hdGlvbiwgLi4uaW5uZXJFbnZlbG9wZWRNZXNzYWdlLnJvdXRlID8gaW5uZXJFbnZlbG9wZWRNZXNzYWdlLnJvdXRlIDogW11dO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge0lFbGVtZW50UmVmfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8YW55LCBEZXRlY3RlZE15b3BSZWZzTWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0RldGVjdE15b3BSZWZzTWVzc2FnZSdcbiAgICByZXBseU1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5O1xufVxuXG5leHBvcnQgY2xhc3MgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2U8SUVsZW1lbnRSZWZbXT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcjogc3RyaW5nLCBteW9wRWxlbWVudFJlZnM6IElFbGVtZW50UmVmW10pIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBteW9wRWxlbWVudFJlZnM7XG4gICAgfVxuXG4gICAgaXNUeXBlb2YobXNnOiBCYXNlTXlvcE1lc3NhZ2U8YW55Pik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEdldEF0dHJpYnV0ZU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnR2V0QXR0cmlidXRlTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIHB1YmxpYyBuYW1lOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRlbnQ6IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vaG9zdFwiO1xuXG50eXBlIE1ldGhvZE5hbWVzPFQ+ID0ge1xuICAgIC8vIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgPyBLIDogbmV2ZXI7XG4gICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyAoKSA9PiB2b2lkID8gSyA6IG5ldmVyO1xufVtrZXlvZiBUXTtcblxuLy8gRGVmaW5lIGEgdHlwZSB0aGF0IGFsbG93cyBvbmx5IHN0cmluZ3MgY29ycmVzcG9uZGluZyB0byB0aGUgbWV0aG9kIG5hbWVzIG9mIFRcbnR5cGUgTWV0aG9kU3RyaW5nPFQ+ID0gTWV0aG9kTmFtZXM8VD4gZXh0ZW5kcyBpbmZlciBNID8gTSBleHRlbmRzIHN0cmluZyA/IE0gOiBuZXZlciA6IG5ldmVyO1xuXG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdFeGVjdXRlQ29tcG9uZW50TWV0aG9kJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXRob2Q6IE1ldGhvZFN0cmluZzxJTXlvcENvbXBvbmVudD4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJztcbn1cblxuZXhwb3J0IGNsYXNzIE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG59IiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0NsZWFudXBSZXBsYXlNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgQ2xlYW51cE1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgQ2xlYW51cFJlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0NsZWFudXBNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjbGVhbnVwRm9yTWVzc2FnZUlkOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBDbGVhbnVwUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGVhbnVwUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY3VzdG9tQ2xlYW51cDogYm9vbGVhbikge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIERpc3Bvc2VNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdEaXNwb3NlTWVzc2FnZSc7XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBjbGVhbmFibGUgPSB0cnVlO1xuICAgIG1lc3NhZ2VUeXBlID0gJ1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSc7XG59XG5cbmV4cG9ydCBjbGFzcyBSZXNpemVPYnNlcnZlck1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSc7XG59IiwgImV4cG9ydCAqIGZyb20gJy4vQmFzZU1lc3NhZ2UnO1xuXG4vL3VzZXIncyBtZXNzYWdlc1xuZXhwb3J0ICogZnJvbSAnLi9CaW5kQ2xpY2tNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ2hhbmdlVGV4dE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9FeGVjdXRlU2NyaXB0TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0N1c3RvbVJlZk1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9BZGRFdmVudExpc3RlbmVyTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL1NldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9HZXRFbGVtZW50VmFsdWVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vU2V0SW5uZXJIdG1sJztcblxuLy9zeXN0ZW0gbWVzc2FnZXNcbmV4cG9ydCAqIGZyb20gJy4vSW5pdE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRW52ZWxvcGVkTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0RldGVjdE15b3BSZWZzTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAgJy4vR2V0QXR0cmlidXRlTWVzc2FnZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50TWVzc2FnZXMvRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCc7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudE1lc3NhZ2VzL1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ2xlYW51cE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9EaXNwb3NlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudE1lc3NhZ2VzL1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSc7IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXksIE15b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIERpc3Bvc2VNZXNzYWdlLCBFeGVjdXRlQ29tcG9uZW50TWV0aG9kLCBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIENsZWFudXBNZXNzYWdlLCBDbGVhbnVwUmVwbGF5TWVzc2FnZSxcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZcbn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtIb3N0U0RLLCBsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuXG4vKipcbiAqIFJlc3VsdCByZXR1cm5lZCBieSBvYnNlcnZlQXV0b1NpemUgY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRvU2l6ZVJlc3VsdCB7XG4gICAgLyoqIEN1cnJlbnQgd2lkdGggKGZyb20gY29udGVudCkgKi9cbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIC8qKiBDdXJyZW50IGhlaWdodCAoZnJvbSBjb250ZW50KSAqL1xuICAgIGhlaWdodDogbnVtYmVyO1xuICAgIC8qKiBXaGV0aGVyIHdpZHRoIGlzIGJlaW5nIGF1dG8tc2l6ZWQgKi9cbiAgICBhdXRvU2l6aW5nV2lkdGg6IGJvb2xlYW47XG4gICAgLyoqIFdoZXRoZXIgaGVpZ2h0IGlzIGJlaW5nIGF1dG8tc2l6ZWQgKi9cbiAgICBhdXRvU2l6aW5nSGVpZ2h0OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIG9ic2VydmVBdXRvU2l6ZSBtZXRob2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRvU2l6ZU9wdGlvbnMge1xuICAgIC8qKiBDYWxsYmFjayBjYWxsZWQgd2l0aCBzaXplIGluZm8gd2hlbmV2ZXIgc2l6ZSBjaGFuZ2VzICovXG4gICAgb25TaXplQ2hhbmdlPzogKHJlc3VsdDogQXV0b1NpemVSZXN1bHQpID0+IHZvaWQ7XG4gICAgLyoqIE1pbmltdW0gd2lkdGggY29uc3RyYWludCAqL1xuICAgIG1pbldpZHRoPzogbnVtYmVyIHwgc3RyaW5nO1xuICAgIC8qKiBNYXhpbXVtIHdpZHRoIGNvbnN0cmFpbnQgKi9cbiAgICBtYXhXaWR0aD86IG51bWJlciB8IHN0cmluZztcbiAgICAvKiogTWluaW11bSBoZWlnaHQgY29uc3RyYWludCAqL1xuICAgIG1pbkhlaWdodD86IG51bWJlciB8IHN0cmluZztcbiAgICAvKiogTWF4aW11bSBoZWlnaHQgY29uc3RyYWludCAqL1xuICAgIG1heEhlaWdodD86IG51bWJlciB8IHN0cmluZztcbiAgICAvKiogRXhwbGljaXQgd2lkdGggc2V0IGJ5IGhvc3QgLSBpZiBkZWZpbmVkLCBkb24ndCBhdXRvLXNpemUgd2lkdGggKi9cbiAgICBleHBsaWNpdFdpZHRoPzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIC8qKiBFeHBsaWNpdCBoZWlnaHQgc2V0IGJ5IGhvc3QgLSBpZiBkZWZpbmVkLCBkb24ndCBhdXRvLXNpemUgaGVpZ2h0ICovXG4gICAgZXhwbGljaXRIZWlnaHQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgLyoqIEZvcmNlIGF1dG8tc2l6ZSBldmVuIGlmIGNvbnRhaW5lciBoYXMgZGltZW5zaW9ucyAqL1xuICAgIGZvcmNlQXV0b1NpemU/OiBib29sZWFuO1xuICAgIC8qKiBNaW4gaGVpZ2h0IHVzZWQgYnkgbG9hZGVyIHRvIGRldGVjdCBjb2xsYXBzZSAoZGVmYXVsdDogNTApICovXG4gICAgbG9hZGVyTWluSGVpZ2h0PzogbnVtYmVyO1xufVxuXG4vL1RPRE8gOiBjaGFuZ2UgSU15b3BDb21wb25lbnQgdG8gcmVmIHNwZWNpZmljIGltcGxcbnR5cGUgUmVmVHlwZXMgPSB7XG4gICAgW2tleTogc3RyaW5nXTogSU15b3BDb21wb25lbnQgfCBSZWZcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU15b3BDb21wb25lbnQ8UCA9IGFueSwgUiA9IGFueT4ge1xuXG4gICAgaWQ6IHN0cmluZztcblxuICAgIGlzSW5pdGlhdGVkOiBib29sZWFuO1xuXG4gICAgbWFya2VkRm9yRGlzcG9zZWQ6IGJvb2xlYW47XG5cbiAgICBzZXRJbml0aWF0ZWQ6ICgpID0+IHZvaWRcblxuICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG5cbiAgICAvKiogUnVudGltZSB0YWdzOiBvbmx5IHRhZ3MgbmFtZWQgYHVpOi4uLmAgKGUuZy4gYHVpOmJldGFgKS4gYFtdYCB3aGVuIHRoZXJlIGFyZSBub25lLiAqL1xuICAgIHJlYWRvbmx5IHVpVGFnczogc3RyaW5nW11cblxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnRcblxuICAgIC8vcmVmIGNvbXBvbmVudHMgY2FuIGJlIGVsZW1lbnQtbGVzc1xuICAgIGVsZW1lbnQ/OiBIVE1MRWxlbWVudFxuXG4gICAgc2VuZDogKG1zZzogQmFzZU15b3BNZXNzYWdlKSA9PiBDbGVhbnVwSGFuZGxlclxuXG4gICAgYmluZChtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXksIGhhbmRsZXI6ICgpID0+IGJvb2xlYW4pOiB2b2lkO1xuXG4gICAgYmluZDxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPihtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXksIGhhbmRsZXI6IChtZXNzYWdlOiBUKSA9PiBib29sZWFuKTogdm9pZDtcblxuICAgIC8vIGJvb2xlYW4gcmV0dXJuZWQgdmFsdWUgPSBoYW5kbGVkIG9yIG5vdFxuICAgIG9uTWVzc2FnZVJlY2VpdmVkOiAobXNnOiBCYXNlTXlvcE1lc3NhZ2UpID0+IGJvb2xlYW5cblxuICAgIGluaXRpYXRlZDogKCkgPT4gUHJvbWlzZTxhbnk+O1xuXG4gICAgZGlzcG9zZTogKCkgPT4gdm9pZFxuXG4gICAgaGlkZSgpOiB2b2lkO1xuXG4gICAgc2hvdygpOiB2b2lkO1xuXG4gICAgaW5zcGVjdCgpOiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogT2JzZXJ2ZXMgdGhlIGlmcmFtZSBjb250ZW50IHNpemUgYW5kIGF1dG9tYXRpY2FsbHkgc3luY3MgaXQgdG8gdGhlIGlmcmFtZSBlbGVtZW50LlxuICAgICAqIE9ubHkgYXZhaWxhYmxlIGZvciBpZnJhbWUtYmFzZWQgY29tcG9uZW50cy4gVXNlcyBkaXJlY3QgY29udGVudERvY3VtZW50IGFjY2Vzcy5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgc2l6ZSBjaGFuZ2UgY2FsbGJhY2sgYW5kIG1pbi9tYXggY29uc3RyYWludHNcbiAgICAgKiBAcmV0dXJucyBDbGVhbnVwIGZ1bmN0aW9uIHRvIHN0b3Agb2JzZXJ2aW5nXG4gICAgICovXG4gICAgb2JzZXJ2ZUF1dG9TaXplPzogKG9wdGlvbnM/OiBBdXRvU2l6ZU9wdGlvbnMpID0+IENsZWFudXBIYW5kbGVyO1xuXG4gICAgLyoqXG4gICAgICogUGFyc2VkIG15b3A6c2l6ZSBtZXRhIHRhZyBmcm9tIHRoZSBjb21wb25lbnQgSFRNTC5cbiAgICAgKiBTZXQgYnkgSFRNTENvbXBvbmVudExvYWRlciBiZWZvcmUgaWZyYW1lIGNyZWF0aW9uLlxuICAgICAqIFVzZWQgYnkgdGhlIFJlYWN0IGhvc3QgdG8gZGV0ZXJtaW5lIHNpemluZyBtb2RlIChmaWxsIHZzIGNvbnRlbnQpLlxuICAgICAqL1xuICAgIHNpemVNZXRhPzogeyB3aWR0aD86IHN0cmluZyB8IG51bWJlcjsgaGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyOyBtaW5XaWR0aD86IG51bWJlcjsgbWF4V2lkdGg/OiBudW1iZXI7IG1pbkhlaWdodD86IG51bWJlcjsgbWF4SGVpZ2h0PzogbnVtYmVyIH0gfCBudWxsO1xuXG4gICAgcGFyZW50PzogSU15b3BDb21wb25lbnQ7XG5cbiAgICBwcm9wczogUFxuXG4gICAgcmVmczogUlxufVxuXG5mdW5jdGlvbiBpc0luaGVyaXRGcm9tKG9iajogYW55LCBiYXNlQ2xhc3M6IGFueSkge1xuICAgIGlmICghb2JqKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuXG4gICAgaWYgKCFwcm90bykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHByb3RvLmNvbnN0cnVjdG9yLm5hbWUgPT09IGJhc2VDbGFzcy5uYW1lKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gaXNJbmhlcml0RnJvbShwcm90bywgYmFzZUNsYXNzKTtcbn1cblxuLy8gVE9ETyA6IG1vdmUgOiBcbnR5cGUgbWVzc2FnZUhhbmRsZXI8VD4gPSAobWVzc2FnZTogVCkgPT4gYm9vbGVhbjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNeW9wQ29tcG9uZW50PFAgPSBhbnksIFIgZXh0ZW5kcyBSZWZUeXBlcyA9IFJlZlR5cGVzPiBpbXBsZW1lbnRzIElNeW9wQ29tcG9uZW50PFA+IHtcbiAgICBpZDogc3RyaW5nID0gJydcblxuICAgIG1lc3NhZ2VIYW5kbGVyczogUmVjb3JkPHN0cmluZywgbWVzc2FnZUhhbmRsZXI8YW55PltdPiA9IHt9O1xuXG4gICAgZWxlbWVudD86IEhUTUxFbGVtZW50XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pZCA9IG9wdGlvbnM/LmlkIHx8IEhvc3RTREsuSW5zdGFuY2UoKS5hc3NpZ25JZChjb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IG9wdGlvbnM/LnRpbWVvdXQgPyBvcHRpb25zPy50aW1lb3V0IDogNSAqIDEwMDA7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhdGVkICYmIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QgJiYgIXRoaXMuX21hcmtlZEZvckRpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdChgdGltZW91dF8ke3RpbWVvdXR9ICR7dGhpcy5pZH1gKTtcblxuICAgICAgICAgICAgICAgIC8vIEEgVElNRUQtT1VUIENPTVBPTkVOVCBNVVNUIFVOUkVHSVNURVIgSVRTRUxGIC0tIE5PQk9EWSBFTFNFIENBTi5cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIGhvc3RTREsubG9hZENvbXBvbmVudCByZWplY3RzIHdpdGggdGhpcyBzYW1lIGVycm9yLCBzbyB0aGUgY2FsbGVyIG5ldmVyXG4gICAgICAgICAgICAgICAgLy8gcmVjZWl2ZXMgdGhlIGNvbXBvbmVudCBhbmQgaGFzIG5vIGhhbmRsZSB0byBkaXNwb3NlLiBXaXRob3V0IHRoaXMgdGhlXG4gICAgICAgICAgICAgICAgLy8gaG9zdCBrZWVwcyBpdCBpbiBgY29tcG9uZW50c2AgQU5EIGBjb21wb25lbnRzMmluaXRgIGZvciB0aGUgbGlmZSBvZiB0aGVcbiAgICAgICAgICAgICAgICAvLyBwYWdlLCBhbmQgdGhhdCBjb3N0IGNvbXBvdW5kczogYGNvbXBvbmVudHMyaW5pdGAgaXMgd2Fsa2VkIG9uIGV2ZXJ5XG4gICAgICAgICAgICAgICAgLy8gSW5pdFJlcXVlc3QsIGBpc1RydXN0ZWRTb3VyY2VgIHdhbGtzIGJvdGggYXJyYXlzIG9uIGV2ZXJ5IG1lc3NhZ2UsIGFuZCBhXG4gICAgICAgICAgICAgICAgLy8gVUkgdGhhdCByZXRyaWVzIC0tIGEgcmVlbCBwaWNrZXIsIGEgZGlhbG9nIHJlb3BlbmVkIHBlciB0ZW1wbGF0ZSAtLSBhZGRzXG4gICAgICAgICAgICAgICAgLy8gYSBkZWFkIGVudHJ5IGVhY2ggYXR0ZW1wdC5cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIGRpc3Bvc2UoKSBpcyB0aGUgY29oZXJlbnQgZW5kIHN0YXRlOiBpdCB1bnJlZ2lzdGVycyB0aHJvdWdoIHRoZSBob3N0J3NcbiAgICAgICAgICAgICAgICAvLyAnb25EaXNwb3NlJyBoYW5kbGVyIGFuZCBkcm9wcyB0aGUgZnJhbWUgdGhhdCBuZXZlciBhbnN3ZXJlZC5cbiAgICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGltZW91dCk7XG5cbiAgICAgICAgLy8gVE9ETyA6IGF1dG8gaW5zcGVjdCwgY29udHJvbCBmcm9tIGNvbmZpZ1xuICAgICAgICB0aGlzLmluaXRpYXRlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaWYgKHdpbmRvdy5teW9wLmhvc3RTREsuaW5zcGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnNwZWN0KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0IHVpVGFncygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudERlZmluaXRpb24/LnVpVGFncyB8fCBbXTtcbiAgICB9XG5cbiAgICBfbWFya2VkRm9yRGlzcG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGdldCBtYXJrZWRGb3JEaXNwb3NlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcmtlZEZvckRpc3Bvc2VkO1xuICAgIH1cblxuICAgIHNldCBtYXJrZWRGb3JEaXNwb3NlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fbWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbjogVGhlIGNvbXBvbmVudCBpcyBhbHJlYWR5IGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGRpc3Bvc2VkLiBEaXNwb3NlIG9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIGFnYWluIHVudGlsIHRoZSBjdXJyZW50IGRpc3Bvc2FsIHByb2Nlc3MgaXMgY29tcGxldGUuJylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGhpZGUoKTogdm9pZDtcblxuICAgIGFic3RyYWN0IHNob3coKTogdm9pZDtcblxuICAgIGFic3RyYWN0IGluc3BlY3QoKTogQ2xlYW51cEhhbmRsZXI7XG5cbiAgICAvL1RPRE86IHVzZSBiaW5kV2hlbiB3aXRoIHJldHVybiB0cnVlIHByZWRpY2F0ZSAuLi5cbiAgICBiaW5kID0gPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+KG1lc3NhZ2VUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBUKSA9PiBib29sZWFuKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0gPSBbXVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGFuZGxlIGR1cGxpY2F0ZSByZWdpc3RyYXRpb25cbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0uaW5jbHVkZXMoaGFuZGxlcikpIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXS5wdXNoKGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYmluZFdoZW4gPSA8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4obWVzc2FnZVR5cGU6IHN0cmluZywgcHJlZGljYXRlOiAobWVzc2FnZTogVCkgPT4gYm9vbGVhbiwgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IHZvaWQpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5cXCd0IHVzZSBjb21wb25lbnQuYmluZFdoZW4gd2l0aG91dCBhbiBoYW5kbGVyJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdID0gW11cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdO1xuXG4gICAgICAgIGNvbnN0IHByZWRpY2F0ZVdyYXBwZWRIYW5kbGVyID0gKGU6IFQpID0+IHtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoZSkpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyKGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vVE9ETyA6IGhhbmRsZSBkdXBsaWNhdGUgcmVnaXN0cmF0aW9uID9cbiAgICAgICAgaGFuZGxlcnMucHVzaChwcmVkaWNhdGVXcmFwcGVkSGFuZGxlcik7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGFuZGxlcnMuaW5kZXhPZihwcmVkaWNhdGVXcmFwcGVkSGFuZGxlcik7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnb25NZXNzYWdlUmVjZWl2ZWQnLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLCBpbmNvbWVNZXNzYWdlLCB0aGlzKTtcbiAgICAgICAgLy9UT0RPIDogaGFuZGVsIHNwZWNpYWwgZXZldHMgPyBsaWtlIGluaXRSZXMgP1xuICAgICAgICBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVDb21wb25lbnRNZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IChpbmNvbWVNZXNzYWdlIGFzIEV4ZWN1dGVDb21wb25lbnRNZXRob2QpO1xuXG4gICAgICAgICAgICAvL2tlZXBpbmcgdGhpcy5tZXRob2QoKSBzbyB0aGF0IGNvbnRleHQgd2lsbCBzYXZlZFxuICAgICAgICAgICAgaWYgKCh0aGlzIGFzIGFueSlbdHlwZWRNZXNzYWdlLm1ldGhvZF0pIHtcbiAgICAgICAgICAgICAgICAodGhpcyBhcyBhbnkpW3R5cGVkTWVzc2FnZS5tZXRob2RdKHR5cGVkTWVzc2FnZS5jb250ZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYG1ldGhvZCBub3QgZm91bmQgJHt0eXBlZE1lc3NhZ2UubWV0aG9kfSBvbiBjb21wb25lbnRgLCB0aGlzKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZV07XG4gICAgICAgIGlmIChoYW5kbGVycyAmJiBoYW5kbGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBoYW5kbGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGhhbmRsZXJzLmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlZCA9IGhhbmRsZWQgfHwgaGFuZGxlcihpbmNvbWVNZXNzYWdlKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9UT0RPIDogY29uc29sZSBvbmx5IHdoZW4gZGVidWcgY29uZmlnXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdubyBoYW5kbGVycyBmb3VuZCBmb3IgJywgaW5jb21lTWVzc2FnZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2V0SW5pdGlhdGVkID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmlzSW5pdGlhdGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUpXG4gICAgICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIGlzSW5pdGlhdGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBfd2hlbkluaXRpYXRlZFJlc29sdmU/OiAodmFsdWU/OiBhbnkpID0+IGFueTtcbiAgICBfd2hlbkluaXRpYXRlZFJlamVjdD86ICh2YWx1ZT86IGFueSkgPT4gYW55O1xuXG4gICAgX3doZW5Jbml0aWF0ZWQ6IFByb21pc2U8YW55PiA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuXG4gICAgaW5pdGlhdGVkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2hlbkluaXRpYXRlZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbmRDbGVhbnVwTWVzc2FnZShtZXNzYWdlOiBDbGVhbnVwTWVzc2FnZSk6IHZvaWQge1xuICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IHRoaXMuaWQ7XG4gICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSB0aGlzLmlkO1xuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24uZG93bjtcblxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuYmluZFdoZW4obWVzc2FnZS5yZXBseU1lc3NhZ2VLZXksIChtc2c6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG1zZy5yZXBsYXlUb0hhbmRsZXIgPT09IG1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkXG4gICAgICAgIH0sIChtOiBDbGVhbnVwUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZS5oYW5kbGVyKG0pO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlcjtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBkZWxldGUgbWVzc2FnZS5oYW5kbGVyXG5cbiAgICAgICAgdGhpcy5zZW5kKG1lc3NhZ2UpO1xuXG4gICAgICAgIG1lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXI7XG4gICAgfVxuXG4gICAgc2VuZChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBDbGVhbnVwSGFuZGxlciB7XG4gICAgICAgIC8vbWVzc2FnZXMgdGhhdCBleGV0cmFjdGVkIGZyb20gZW52ZWxvcGUgYWxyZWFkeSBoYXZlIHNvdXJjZSBpbiB0aGVtXG4gICAgICAgIGlmICghbWVzc2FnZS5zb3VyY2UpXG4gICAgICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IHRoaXMuaWQ7XG5cbiAgICAgICAgaWYgKCFtZXNzYWdlLmRlc3RpbmF0aW9uKVxuICAgICAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IHRoaXMuaWQ7XG5cbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLmRvd247XG5cbiAgICAgICAgbGV0IGNsZWFudXBIYW5kbGVyO1xuICAgICAgICAvLyBUT0RPIDogZml4IGhlYXZ5IG9wLi5cbiAgICAgICAgLy8gIGlmIChpc0luaGVyaXRGcm9tKG1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZSkpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAobWVzc2FnZS5oYW5kbGVyKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBNeW9wQmluZE1lc3NhZ2UpO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIgPSB0aGlzLmJpbmRXaGVuKHR5cGVkTWVzc2FnZS5yZXBseU1lc3NhZ2VLZXksIChtc2c6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBtc2cucmVwbGF5VG9IYW5kbGVyID09PSB0eXBlZE1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkXG4gICAgICAgICAgICB9LCB0eXBlZE1lc3NhZ2UuaGFuZGxlcik7XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRlbGV0ZSBtZXNzYWdlLmhhbmRsZXJcbiAgICAgICAgfVxuXG4gICAgICAgIC8vVE9ETzogdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICBpZiAobWVzc2FnZS5yZWYpIHtcbiAgICAgICAgICAgIC8vIHNlcmlhbGl6YWJsZVxuICAgICAgICAgICAgbWVzc2FnZS5yZWYgPSBtZXNzYWdlLnJlZi5fX25vblByb3hpZWQgfHwgbWVzc2FnZS5yZWY7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWVzc2FnZS5jbGVhbmFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kQ2xlYW51cE1lc3NhZ2UobmV3IENsZWFudXBNZXNzYWdlKG1lc3NhZ2UuaWQsIChyZXBsYXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogbG9nIHJlcGxheT9cbiAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2xlYW51cEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFJ1bnMgdGhlICdvbkRpc3Bvc2UnIGhhbmRsZXJzIG9uY2UuIGhvc3RTREsgcmVnaXN0ZXJzIHRoZSBvbmUgdGhhdCB1bnJlZ2lzdGVyc1xuICAgICAqICB0aGlzIGNvbXBvbmVudCwgc28gaXQgaGFzIHRvIHJ1biBvbiBFVkVSWSBkaXNwb3NlIHBhdGgsIGluaXRpYXRlZCBvciBub3QuICovXG4gICAgcHJpdmF0ZSBydW5EaXNwb3NlSGFuZGxlcnMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9uRGlzcG9zZUhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbJ29uRGlzcG9zZSddO1xuICAgICAgICBpZiAob25EaXNwb3NlSGFuZGxlcnMpIHtcbiAgICAgICAgICAgIG9uRGlzcG9zZUhhbmRsZXJzLmZvckVhY2goZGlzcG9zZUhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNlbmQgbnVsbCBvciBmaXggdGhlIHR5cGUgP1xuICAgICAgICAgICAgICAgIGRpc3Bvc2VIYW5kbGVyKG51bGwpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFya2VkRm9yRGlzcG9zZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmICghdGhpcy5pc0luaXRpYXRlZCkge1xuICAgICAgICAgICAgLy8gQSBDT01QT05FTlQgVEhBVCBORVZFUiBJTklUSUFURUQgU1RJTEwgSEFTIFRPIEJFIFVOUkVHSVNURVJFRC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBUaGlzIHVzZWQgdG8gYHJldHVybmAgaGVyZSwgd2hpY2ggbGVha2VkOiBob3N0U0RLIHRyYWNrcyBldmVyeSBjb21wb25lbnQgYnlcbiAgICAgICAgICAgIC8vIGJpbmRpbmcgYW4gJ29uRGlzcG9zZScgaGFuZGxlciB0aGF0IHJlbW92ZXMgaXQgZnJvbSBgY29tcG9uZW50c2AgYW5kXG4gICAgICAgICAgICAvLyBgY29tcG9uZW50czJpbml0YCwgYW5kIHRob3NlIGhhbmRsZXJzIGxpdmUgYmVsb3cgdGhpcyBsaW5lLiBTbyBhIGNvbXBvbmVudFxuICAgICAgICAgICAgLy8gdGhhdCB0aW1lZCBvdXQgYW5kIHdhcyB0aGVuIGRpc3Bvc2VkIGhhZCBpdHMgaWZyYW1lIHB1bGxlZCBmcm9tIHRoZSBET01cbiAgICAgICAgICAgIC8vIChteW9wSWZyYW1lQ29tcG9uZW50LmRpc3Bvc2UgZG9lcyB0aGF0IGFmdGVyIHN1cGVyLmRpc3Bvc2UpIHdoaWxlIHN0YXlpbmcgaW5cbiAgICAgICAgICAgIC8vIGJvdGggaG9zdCBhcnJheXMgZm9yZXZlci5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBUaGF0IGlzIG5vdCBhIHNsb3cgbGVhaywgaXQgY29tcG91bmRzOiBgY29tcG9uZW50czJpbml0YCBpcyB3YWxrZWQgb24gZXZlcnlcbiAgICAgICAgICAgIC8vIEluaXRSZXF1ZXN0IGFuZCBgaXNUcnVzdGVkU291cmNlYCB3YWxrcyBib3RoIGFycmF5cyBvbiBldmVyeSBtZXNzYWdlLCBzbyBlYWNoXG4gICAgICAgICAgICAvLyBkZWFkIGVudHJ5IGNvc3RzIGEgYHNlbmQoKWAgaW50byBhIHJlbW92ZWQgZnJhbWUgb24gZXZlcnkgZnV0dXJlIGhhbmRzaGFrZS5cbiAgICAgICAgICAgIC8vIFJlLW9wZW5pbmcgYSBkaWFsb2cgdGhhdCBtb3VudHMgY29tcG9uZW50cyAtLSBQaWMtVGltZSdzIHJlZWwgcGlja2VyIC0tIGFkZHNcbiAgICAgICAgICAgIC8vIG9uZSBkZWFkIGVudHJ5IHBlciBhdHRlbXB0LlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIE9ubHkgdGhlIERpc3Bvc2VNZXNzYWdlIGlzIGdlbnVpbmVseSBjb25kaXRpb25hbDogdGhlcmUgaXMgbm8gbGl2ZSBmcmFtZSB0b1xuICAgICAgICAgICAgLy8gdGVsbC4gRXZlcnl0aGluZyBlbHNlIG11c3QgcnVuLlxuICAgICAgICAgICAgdGhpcy5ydW5EaXNwb3NlSGFuZGxlcnMoKTtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzID0ge307XG4gICAgICAgICAgICB0aGlzLmlkICs9ICdfZGlzcG9zZWQnO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKCdkaXNwb3NpbmcgY29tcG9uZW50JywgdGhpcy5pZCk7XG5cbiAgICAgICAgLy8gLy9UT0RPIDogaW1wbGVtZW50IGRpc3Bvc2UgZmxvd1xuICAgICAgICAvLyBPYmplY3Qua2V5cyh0aGlzLnJlZnMpLmZvckVhY2gocmVmS2V5PT57XG4gICAgICAgIC8vICAgICB0aGlzLnJlZnNbcmVmS2V5XS5kaXNwb3NlKCk7XG4gICAgICAgIC8vIH0pO1xuXG4gICAgICAgIC8vVE9ETyA6IGNoZWNrIGlmIHRoZXJlIGlzIGFueSB0aW1lIGZvciB0aGUgb1xuICAgICAgICAvLyB0aGVyIHNpZGUgdG8gcHJvY2Nlc3MgdG8gbWVzc2FnZSBiZWZvcmUgZGllID9cbiAgICAgICAgLy9ub3RpZnkgdGhlIG90aGVyIHNpZGUgU0RLXG4gICAgICAgIHRoaXMuc2VuZChuZXcgRGlzcG9zZU1lc3NhZ2UoKSlcblxuICAgICAgICB0aGlzLnJ1bkRpc3Bvc2VIYW5kbGVycygpO1xuXG4gICAgICAgIC8vY29uc29sZS5sb2codGhpcy5jb250YWluZXIpO1xuICAgICAgICAvL3RoaXMuY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVycyA9IHt9XG4gICAgICAgIHRoaXMuaWQgKz0gJ19kaXNwb3NlZCc7XG4gICAgICAgIHRoaXMuaXNJbml0aWF0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm9wczogUCA9IHt9IGFzIHVua25vd24gYXMgUDtcbiAgICByZWZzOiBSID0ge30gYXMgdW5rbm93biBhcyBSO1xufVxuIiwgImV4cG9ydCBpbnRlcmZhY2UgSUVsZW1lbnRSZWYge1xuICAgIG15b3BJZD86IHN0cmluZ1xuICAgIGh0bWxUYWdOYW1lOiBzdHJpbmdcbiAgICBCb3VuZGluZ1JlY3Q/OiBET01SZWN0XG4gICAgb2Zmc2V0VG9wPzogbnVtYmVyXG4gICAgb2Zmc2V0TGVmdD86IG51bWJlclxuXG4gICAgdHlwZTogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBYUGF0aEVsZW1lbnRSZWYgaW1wbGVtZW50cyBJRWxlbWVudFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHhQYXRoOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIGh0bWxUYWdOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIEJvdW5kaW5nUmVjdD86IERPTVJlY3QsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldFRvcD86IG51bWJlcixcbiAgICAgICAgICAgICAgICBwdWJsaWMgb2Zmc2V0TGVmdD86IG51bWJlcikge1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnWFBhdGhFbGVtZW50UmVmJ1xufVxuXG5leHBvcnQgY2xhc3MgTXlvcEVsZW1lbnRSZWYgaW1wbGVtZW50cyBJRWxlbWVudFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIG15b3BJZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBodG1sVGFnTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBCb3VuZGluZ1JlY3Q/OiBET01SZWN0LFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvZmZzZXRUb3A/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldExlZnQ/OiBudW1iZXIpIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnTXlvcEVsZW1lbnRSZWYnXG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlcn0gZnJvbSBcIi4vaW5kZXgudHNcIjtcblxuZXhwb3J0IHR5cGUgSU1lc3NhZ2VFeGVjdXRvckNsZWFudXAgPSBDbGVhbnVwSGFuZGxlciB8IFByb21pc2U8Q2xlYW51cEhhbmRsZXI+IHwgUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbmV4cG9ydCBjb25zdCBydW5FeGVjdXRvckNsZWFudXAgPSBhc3luYyAodGFzazogSU1lc3NhZ2VFeGVjdXRvckNsZWFudXApID0+IHtcbiAgICBpZiAodHlwZW9mIHRhc2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gSXQncyBhIGZ1bmN0aW9uLCBjYWxsIGl0XG4gICAgICAgIHRhc2soKTtcbiAgICB9IGVsc2UgaWYgKHRhc2sgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIC8vIEl0J3MgYSBQcm9taXNlLCBhd2FpdCBpdFxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0YXNrO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIGEgZnVuY3Rpb24sIGNhbGwgaXRcbiAgICAgICAgICAgIHJlc3VsdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIElmIHRhc2sgaXMgdm9pZCwgZG8gbm90aGluZ1xufVxuXG50eXBlIElNZXNzYWdlRXhlY3V0b3I8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4gPSAobWVzc2FnZTogVCkgPT4gSU1lc3NhZ2VFeGVjdXRvckNsZWFudXA7XG5cbmludGVyZmFjZSBJTWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxuXG4gICAgZXhlY3V0b3I6IElNZXNzYWdlRXhlY3V0b3I8VD47XG5cbiAgICBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlID0gYW55PiBpbXBsZW1lbnRzIElNZXNzYWdlSGFuZGxlcjxUPiB7XG5cbiAgICAvL1RPRE8gOiBhZGQgZGlzcG9zZSBtZXRob2RcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZCkge1xuXG4gICAgfVxuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG4gICAgYWJzdHJhY3QgZXhlY3V0b3I6IElNZXNzYWdlRXhlY3V0b3I8VD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2UgPSBhbnksIEUgPSBhbnk+IGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQsIHB1YmxpYyBjb250ZXh0PzogRSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlVG9Ib3N0KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgcnVuRXhlY3V0b3JDbGVhbnVwfSBmcm9tIFwiLi9pbmRleC50c1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL2Jhc2VNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsIENsZWFudXBNZXNzYWdlLCBDbGVhbnVwUmVwbGF5TWVzc2FnZSwgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgRW52ZWxvcGVkTWVzc2FnZSxcbiAgICBJbml0TWVzc2FnZSxcbiAgICBJbml0UmVzcG9uc2UsXG4gICAgTWVzc2FnZURpcmVjdGlvbixcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgY2xhc3MgSG9zdGVkQ29tcG9uZW50PFQgPSBhbnk+IHtcbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4ge1xuICAgICAgICAvL2RlYnVnZ2VyO1xuICAgIH1cblxuICAgIC8vb25NZXNzYWdlUmVjZWl2ZWQ6IChtc2c6IElNeW9wTWVzc2FnZSkgPT4gdm9pZDtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBpZDogc3RyaW5nLCBwdWJsaWMgY29udGV4dD86IFQpIHtcblxuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTXlvcFNESyB7XG4gICAgaW5pdDogKCkgPT4gdm9pZDtcblxuICAgIG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkXG5cbiAgICBzdXBwb3J0ZWRIYW5kbGVyczogQmFzZU1lc3NhZ2VIYW5kbGVyW107XG5cbiAgICBoYW5kbGVJbmNvbWVNZXNzYWdlczogKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4gdm9pZFxuXG4gICAgY29tcG9uZW50czogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50Pjtcbn1cblxuLy8gY29uc3QgbG9jYWxIb3N0SGFuZGxlZE1lc3NhZ2VzID0gW1xuLy8gICAgIE15b3BNZXNzYWdlcy5Jbml0UmVxdWVzdCxcbi8vICAgICBNeW9wTWVzc2FnZXMuSW5pdFJlc3BvbnNlLFxuLy8gICAgIC8vTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UsXG4vLyBdXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcFNESyBpbXBsZW1lbnRzIElNeW9wU0RLIHtcblxuICAgIGFic3RyYWN0IG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkO1xuXG4gICAgYWJzdHJhY3Qgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VNZXNzYWdlSGFuZGxlcltdO1xuXG4gICAgbWVzc2FnZVRvSGFuZGxlQWZ0ZXJJbml0OiBCYXNlTXlvcE1lc3NhZ2VbXSA9IFtdO1xuXG4gICAgY29tcG9uZW50czogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PiA9IHt9O1xuXG4gICAgYWx3YXlzUGFzc0VudmVsb3Blc1RvSG9zdDogYm9vbGVhbiA9IGZhbHNlXG5cbiAgICBtZXNzYWdlQ2xlYW51cENhY2hlOiBSZWNvcmQ8c3RyaW5nLCBDbGVhbnVwSGFuZGxlciB8IFByb21pc2U8Q2xlYW51cEhhbmRsZXI+PiB8IFByb21pc2U8dm9pZD4gPSB7fTtcblxuICAgIGhhbmRsZUluY29tZU1lc3NhZ2VzKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgY29uc3QgZXZlbnRDb250ZW50ID0gZXZlbnQuZGF0YSA/IGV2ZW50LmRhdGEgOiBldmVudC5kZXRhaWw7XG5cbiAgICAgICAgaWYgKCFldmVudENvbnRlbnQgfHwgIWV2ZW50Q29udGVudC5teW9wKSB7XG4gICAgICAgICAgICAvLyBub3QgbXlvcCBtYXJrZWQgZXZlbnQgXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGV2ZW50Q29udGVudCBhcyBCYXNlTXlvcE1lc3NhZ2U7XG5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlLmRpcmVjdGlvbiAhPT0gTWVzc2FnZURpcmVjdGlvbi5kb3duKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbWVzc2FnZSBkcm9wcGVkIGluIGJhc2VTREssIGRpcmVjdGlvbiB3YXMgJywgZXZlbnQuZGF0YS5kaXJlY3Rpb24pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiAobG9jYWxIb3N0SGFuZGxlZE1lc3NhZ2VzLmluY2x1ZGVzKG1lc3NhZ2UubWVzc2FnZVR5cGUpKSB7XG4gICAgICAgICAgICAvLyAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICAvLyAgICAgLy9UT0RPIDogZml4IGRpcmVjdGlvbiA/IG1lc3NhZ2Ugd2lsbCBub3QgcHJvY2Nlc3Mgb3RoZXJ3aXNlXG4gICAgICAgICAgICAvLyAgICAgd2luZG93Lm15b3AuaG9zdFNESy5zZW5kKG1lc3NhZ2UpXG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkRpc3Bvc2VNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNob3VsZCBub3QgYmUgb3B0aW9uYWwsIGZpeCBhbmQgcmVtb3ZlICdpZidcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5kZXN0aW5hdGlvbilcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29tcG9uZW50c1ttZXNzYWdlLmRlc3RpbmF0aW9uXVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gV2UgZ290IG91ciBpZCBmcm9tIG91ciBob3N0U0RLXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogU0RLIG1heSBzZXJ2ZSBtb3JlIHRoYW4gMSBjb21wb25lbnQgLi4gdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDb21wb25lbnRJZCA9IChtZXNzYWdlIGFzIEluaXRNZXNzYWdlKS5jb250ZW50LmlkO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICAgICAgLy90aHJvdyBuZXcgRXJyb3IoXCJyZWNoaXZlZCBpbml0IG1lc3NhZ2UgZm9yIGFuIGV4c2lzaW5nIGNvbXBvbmVudC5cIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0gPSBuZXcgSG9zdGVkQ29tcG9uZW50KG5ld0NvbXBvbmVudElkKVxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgSW5pdFJlc3BvbnNlKG5ld0NvbXBvbmVudElkKSk7XG5cbiAgICAgICAgICAgICAgICAvLyBUT0RPIDogaXMgaXQgdHJ1ZSB0byBub3QgcGFzcyBmdXJ0aGVyICggdG8gdGhlIGNvbXBvbmVudCApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBmb3Igc2FtZSBIb3N0U0RLIGNhc2VzXG4gICAgICAgICAgICAvLyB3aGVuIGJvdGggUmVmQ29tcG9uZW50IGFuZCByZWFsQ29tcG9uZW50IGhvc3RlZCBpbiB0aGUgc2FtZSBIb3N0U0RLXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnZlbG9wZWRNZXNzYWdlID0gKG1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5uZXJNZXNzYWdlID0gZW52ZWxvcGVkTWVzc2FnZS5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBpbm5lck1lc3NhZ2U7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hbHdheXNQYXNzRW52ZWxvcGVzVG9Ib3N0IHx8IHRoaXMuY29tcG9uZW50c1ttZXNzYWdlLmRlc3RpbmF0aW9uIV0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbkNvbXBvbmVudCA9IG15b3AuaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSBpbm5lck1lc3NhZ2UuZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdGluYXRpb25Db21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uQ29tcG9uZW50LnNlbmQoaW5uZXJNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW52ZWxvcGVkRGVzdGluYXRpb25Db21wb25lbnQgPSBteW9wLmhvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gZW52ZWxvcGVkTWVzc2FnZS5kZXN0aW5hdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnZlbG9wZWREZXN0aW5hdGlvbkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGVkRGVzdGluYXRpb25Db21wb25lbnQuc2VuZChpbm5lck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2Upe1xuICAgICAgICAgICAgLy8gICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA6IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgPSBtZXNzYWdlIGFzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U7XG4gICAgICAgICAgICAvLyAvLyAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkNsZWFudXBNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IG1lc3NhZ2UgYXMgQ2xlYW51cE1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSB0aGlzLm1lc3NhZ2VDbGVhbnVwQ2FjaGVbdHlwZWRNZXNzYWdlLmNsZWFudXBGb3JNZXNzYWdlSWRdO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXBNZXNzYWdlID0gbmV3IENsZWFudXBSZXBsYXlNZXNzYWdlKCEhY2xlYW51cCk7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFudXBNZXNzYWdlLmRlc3RpbmF0aW9uID0gbWVzc2FnZS5kZXN0aW5hdGlvbjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoISFjbGVhbnVwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5tZXNzYWdlQ2xlYW51cENhY2hlW3R5cGVkTWVzc2FnZS5jbGVhbnVwRm9yTWVzc2FnZUlkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkV4ZWN1dG9yQ2xlYW51cChjbGVhbnVwKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QoY2xlYW51cE1lc3NhZ2UsIHR5cGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogaGFuZGVsIGVycm9yP1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChjbGVhbnVwTWVzc2FnZSwgdHlwZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGFjdGlvbkhhbmRsZXJGb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zdXBwb3J0ZWRIYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlci5tZXNzYWdlVHlwZSA9PT0gbWVzc2FnZS5tZXNzYWdlVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uSGFuZGxlckZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSBoYW5kbGVyLmV4ZWN1dG9yKG1lc3NhZ2UpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5jbGVhbmFibGUgJiYgY2xlYW51cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUNsZWFudXBDYWNoZVttZXNzYWdlLmlkXSA9IGNsZWFudXA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGVhbnVwICYmICFtZXNzYWdlLmNsZWFuYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2xlYW51cCBoYW5kbGVyIGdlbmVyYXRlZCBmb3Igbm9uLWNsZWFuYWJsZSBtZXNzYWdlLiBcbm1lc3NhZ2VUeXBlIC0gJHttZXNzYWdlLm1lc3NhZ2VUeXBlfSwgaGFuZGxlciBleGVjdXRvciB3YXMgLSAke2hhbmRsZXIuZXhlY3V0b3J9XG5cblBsZWFzZSByZXZpZXcgdGhlIG1lc3NhZ2UgZGVmaW5pdGlvbiBvYmplY3QgJiBtZXNzYWdlIGhhbmRsZXIuXG5UbyBlbnN1cmUgY2xlYW51cCBwcm9wZXJseSBzZXQgJ2NsZWFuYWJsZScgdHJ1ZSBhdCBtZXNzYWdlIGRlZmluaXRpb24gYW5kIHJldHVybiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCBmcm9tIHlvdXIgaGFuZGxlcnMuYClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjbGVhbnVwICYmIG1lc3NhZ2UuY2xlYW5hYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjbGVhbnVwIGhhbmRsZXIgZ2VuZXJhdGVkIGZvciBhIGNsZWFuYWJsZSBtZXNzYWdlLiBcbm1lc3NhZ2VUeXBlIC0gJHttZXNzYWdlLm1lc3NhZ2VUeXBlfSwgaGFuZGxlciBleGVjdXRvciB3YXMgLSAke2hhbmRsZXIuZXhlY3V0b3J9XG5cblBsZWFzZSByZXZpZXcgdGhlIG1lc3NhZ2UgZGVmaW5pdGlvbiBvYmplY3QgJiBtZXNzYWdlIGhhbmRsZXIuXG5UbyBlbnN1cmUgY2xlYW51cCBwcm9wZXJseSBzZXQgJ2NsZWFuYWJsZScgdHJ1ZSBhdCBtZXNzYWdlIGRlZmluaXRpb24gYW5kIHJldHVybiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCBmcm9tIHlvdXIgaGFuZGxlcnMuYClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBpZiAoIWFjdGlvbkhhbmRsZXJGb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBwcmludCB3aXRoIGRlYnVnIGNvbmZpZyBvbmx5XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ25vIG1lc3NhZ2UgaGFuZGxlciB3YXMgZm91bmQgZm9yICcsIG1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndW5zdXBwb3J0ZWQgbWVzc2FnZSB0eXBlJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFic3RyYWN0IGluaXQ6ICgpID0+IHZvaWQ7XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5cbmV4cG9ydCAqIGZyb20gJy4vTXlvcEVsZW1lbnRSZWYnO1xuZXhwb3J0ICogZnJvbSAnLi9iYXNlTWVzc2FnZUhhbmRsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9CYXNlTXlvcFNESyc7XG5cbmV4cG9ydCB0eXBlIENsZWFudXBIYW5kbGVyID0gKCkgPT4gdm9pZFxuXG5leHBvcnQgdHlwZSBEaWN0aW9uYXJ5PFQ+ID0geyBba2V5OiBzdHJpbmddOiBUOyB9O1xuXG4vL2V4cG9ydCB0eXBlIFNraW5Mb2FkZXJUeXBlID0gJ0lmcmFtZUxvYWRlcicgfCAnV2ViQ29tcG9uZW50TG9hZGVyJyB8ICdIVE1MTG9hZGVyJyB8IHN0cmluZztcblxuZXhwb3J0IGNvbnN0IFNraW5Mb2FkZXJzID0ge1xuICAgIFwiSWZyYW1lTG9hZGVyXCI6IFwiSWZyYW1lTG9hZGVyXCIsXG4gICAgXCJXZWJDb21wb25lbnRMb2FkZXJcIjogXCJXZWJDb21wb25lbnRMb2FkZXJcIixcbiAgICBcIkhUTUxMb2FkZXJcIjogXCJIVE1MTG9hZGVyXCIsXG4gICAgXCJNaW5pbWl6ZWRMb2FkZXJcIjogXCJNaW5pbWl6ZWRMb2FkZXJcIlxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFNraW5Mb2FkZXJUeXBlID0ga2V5b2YgdHlwZW9mIFNraW5Mb2FkZXJzO1xuXG5leHBvcnQgdHlwZSBQcm9wVHlwZSA9ICdhbnknIHwgJ3N0cmluZycgfCAnbnVtYmVyJyB8IHN0cmluZzsgLy8gVE9ETyA6IDxcbmV4cG9ydCB0eXBlIFJlZlNlbGVjdG9yVHlwZSA9ICdpZC1hdHRyaWJ1dGUnIHwgJ2Nzcy1zZWxlY3RvcicgfCAneHBhdGgnIHwgc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgTG9hZGVyRnJhbWV3b3JrcyA9IHtcbiAgICBcInJlYWN0XCI6IFwicmVhY3RcIixcbiAgICBcInZ1ZVwiOiBcInZ1ZVwiLFxuICAgIFwiYW5ndWxhclwiOiBcImFuZ3VsYXJcIixcbn0gYXMgY29uc3RcbmV4cG9ydCB0eXBlIExvYWRlckZyYW1ld29ya1R5cGUgPSBrZXlvZiB0eXBlb2YgTG9hZGVyRnJhbWV3b3JrcztcblxuZXhwb3J0IGludGVyZmFjZSBJV2ViQ29tcG9uZW50TG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiV2ViQ29tcG9uZW50TG9hZGVyXCI7XG4gICAgdXJsOiBzdHJpbmcsXG4gICAgdGFnOiBzdHJpbmcsXG4gICAgZnJhbWV3b3JrPzogTG9hZGVyRnJhbWV3b3JrVHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElJZnJhbWVMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJJZnJhbWVMb2FkZXJcIjtcbiAgICB1cmw6IHN0cmluZ1xuICAgIGF1dG9IZWlnaHQ6IGJvb2xlYW5cbiAgICBoZWlnaHQ/OiBzdHJpbmdcbiAgICB3aWR0aD86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgU2hhZG93Um9vdE1vZGVUeXBlID0ge1xuICAgIFwib3BlblwiOiBcIm9wZW5cIixcbiAgICBcImNsb3NlZFwiOiBcImNsb3NlZFwiLFxuICAgIFwibm9uZVwiOiBcIm5vbmVcIixcbiAgICBcImxvY2FsRnJhbWVcIjogXCJsb2NhbEZyYW1lXCJcbn0gYXMgY29uc3Q7XG5cblxuZXhwb3J0IGludGVyZmFjZSBJSFRNTExvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIkhUTUxMb2FkZXJcIjtcbiAgICBIVE1MOiBzdHJpbmc7XG4gICAgLy9UT0RPOiByZW5hbWUocm9vdE1vZGUvY3VzdG9tRWxlbWVudE1vZGUpICsgZGIgbWlncmF0aW9uXG4gICAgc2hhZG93Um9vdE1vZGU/OiBrZXlvZiB0eXBlb2YgU2hhZG93Um9vdE1vZGVUeXBlO1xuICAgIGF1dG9IZWlnaHQ/OiBib29sZWFuO1xuICAgIGhlaWdodD86IHN0cmluZztcbiAgICB3aWR0aD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIGFuIGlubGluZS1IVE1MIChsb2NhbEZyYW1lKSBjb21wb25lbnQgaXMgcmVuZGVyZWQgaW4gYSBzYW5kYm94ZWQsXG4gICAgICogY3Jvc3Mtb3JpZ2luIGlmcmFtZSB3aXRoIE5PIGFjY2VzcyB0byB0aGUgaG9zdCBkb2N1bWVudCAodW50cnVzdGVkIGNvZGUpLlxuICAgICAqIFRoZSBob3N0IHJlbmRlciBwb2xpY3kgY2FuIGFsc28gZm9yY2UgdGhpcyByZWdhcmRsZXNzIG9mIHRoZSBjb25maWcgdmFsdWUuXG4gICAgICovXG4gICAgaXNvbGF0aW9uPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBIb3cgYSBjb21wb25lbnQgaXMgcmVuZGVyZWQgb24gdGhlIGhvc3QgcGFnZSwgaW4gYXNjZW5kaW5nIGlzb2xhdGlvbjpcbiAqICAtICd3ZWJDb21wb25lbnQnICAgXHUyMDE0IGN1c3RvbSBlbGVtZW50IG9uIHRoZSBob3N0IGRvY3VtZW50IChtb3N0IHByaXZpbGVnZWQpXG4gKiAgLSAnaWZyYW1lJyAgICAgICAgIFx1MjAxNCBzYW1lLW9yaWdpbiBpbmxpbmUtSFRNTCBpZnJhbWUgKHRvZGF5J3MgZGVmYXVsdClcbiAqICAtICdpc29sYXRlZElmcmFtZScgXHUyMDE0IHNhbmRib3hlZCwgY3Jvc3Mtb3JpZ2luIGlmcmFtZSAodW50cnVzdGVkIGNvZGUpXG4gKi9cbmV4cG9ydCB0eXBlIFJlbmRlck1vZGUgPSAnd2ViQ29tcG9uZW50JyB8ICdpZnJhbWUnIHwgJ2lzb2xhdGVkSWZyYW1lJztcblxuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJQb2xpY3lDb250ZXh0IHtcbiAgICBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZztcbiAgICBza2luOiBJU2tpbkNvbmZpZztcbiAgICAvKiogV2hhdCB0aGUgY29tcG9uZW50IGFza2VkIGZvciAobWFya2VyIFx1MjFEMiAnd2ViQ29tcG9uZW50JywgY29uZmlnLmlzb2xhdGlvbiBcdTIxRDIgJ2lzb2xhdGVkSWZyYW1lJykuICovXG4gICAgcmVxdWVzdGVkTW9kZTogUmVuZGVyTW9kZTtcbiAgICAvKiogV2hldGhlciB0aGUgSFRNTCBjYXJyaWVzIHRoZSBgPCEtLSBteW9wLXdlYi1jb21wb25lbnQgLS0+YCBtYXJrZXIuICovXG4gICAgaXNXZWJDb21wb25lbnQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogSG9zdC1zdXBwbGllZCBnYXRlIGRlY2lkaW5nIGhvdyAob3Igd2hldGhlcikgYSBjb21wb25lbnQgcmVuZGVycy4gUmV0dXJuIGFcbiAqIFJlbmRlck1vZGUgdG8gdXNlLCBvciBgZmFsc2VgIHRvIGJsb2NrIHJlbmRlcmluZyBlbnRpcmVseS5cbiAqL1xuZXhwb3J0IHR5cGUgUmVuZGVyUG9saWN5ID1cbiAgICAoY3R4OiBSZW5kZXJQb2xpY3lDb250ZXh0KSA9PiBSZW5kZXJNb2RlIHwgZmFsc2UgfCBQcm9taXNlPFJlbmRlck1vZGUgfCBmYWxzZT47XG5cbi8vZm9yIGludGVybmFsIGRhc2hib2FyZCB1c2FnZVxuZXhwb3J0IGludGVyZmFjZSBJTWluaW1pemVkTG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiTWluaW1pemVkTG9hZGVyXCI7XG59XG5cbmludGVyZmFjZSBEYXNoYm9hcmRPYmplY3Qge1xuICAgIF90ZW1wX2NsaWVudF9pZD86IHN0cmluZyxcbn1cblxudHlwZSBFeHRlbmQ8VCwgVT4gPSBUICYgVTtcblxudHlwZSBFeHRlbmRSZWN1cnNpdmVseTxULCBFPiA9IHtcbiAgICBbSyBpbiBrZXlvZiBFXTogRVtLXTtcbn0gJiB7XG4gICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBvYmplY3RcbiAgICAgICAgPyBFeHRlbmRSZWN1cnNpdmVseTxUW0tdLCBFPlxuICAgICAgICA6IFRbS107XG59O1xuXG5leHBvcnQgdHlwZSBJRGFzaGJvYXJkPFQ+ID0gRXh0ZW5kUmVjdXJzaXZlbHk8VCwgRGFzaGJvYXJkT2JqZWN0PjtcblxuZXhwb3J0IGludGVyZmFjZSBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogU2tpbkxvYWRlclR5cGVcblxuICAgIFtrZXk6IHN0cmluZ106IGFueTsgLy8gQWxsb3dzIGFueSBhZGRpdGlvbmFsIHByb3BlcnRpZXNcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JUmVsZWFzZU1ldGFkYXRhIHtcbiAgICBlbnZpcm9ubWVudElkOiBzdHJpbmc7XG4gICAgZW52aXJvbm1lbnRJZGVudGlmaWVyOiBzdHJpbmc7XG4gICAgcmVsZWFzZWRPbj86IHN0cmluZztcbiAgICByZWxlYXNlZEJ5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lWYXJpYW50Q29uZmlnIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIGxvYWRlcjogSVNraW5Mb2FkZXJDb25maWdcbiAgICBjb21wb25lbnRJZDogc3RyaW5nO1xuXG4gICAgcmVsZWFzZXM/OiB2Ml9JUmVsZWFzZU1ldGFkYXRhW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2tpbkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBsb2FkZXI6IElTa2luTG9hZGVyQ29uZmlnXG4gICAgY3JlYXRlZEJ5Pzogc3RyaW5nXG4gICAgY3JlYXRlZE9uPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSVNraW5Db25maWcgZXh0ZW5kcyBJU2tpbkNvbmZpZyB7XG4gICAgY29tcG9uZW50SWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNZXNzYWdlUHJvcENvbmZpZyBleHRlbmRzIElQcm9wQ29uZmlnIHtcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCaW5kTWVzc2FnZVByb3BDb25maWcgZXh0ZW5kcyBJUHJvcENvbmZpZyB7XG4gICAgdHlwZTogUHJvcFR5cGVcbiAgICBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXlcbn1cblxuZXhwb3J0IGNvbnN0IFByb3BNZXNzYWdlTW9kZXMgPSB7XG4gICAgXCJpbnB1dFwiOiBcImlucHV0XCIsXG4gICAgXCJvdXRwdXRcIjogXCJvdXRwdXRcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFByb3BDb25maWdCZWhhdmlvclR5cGVzID0ge1xuICAgIFwibWVzc2FnZVwiOiBcIm1lc3NhZ2VcIixcbiAgICBcImNvZGVcIjogXCJjb2RlXCJcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BNZXNzYWdlQmVoYXZpb3JQYXJhbSB7XG4gICAgdmFsdWU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQmVoYXZpb3Ige1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQ29kZUJlaGF2aW9yIGV4dGVuZHMgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZTogXCJjb2RlXCJcbiAgICByZW1hcD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wTWVzc2FnZUJlaGF2aW9yIGV4dGVuZHMgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZTogXCJtZXNzYWdlXCJcbiAgICBtZXNzYWdlOiBNeW9wTWVzc2FnZUtleVxuICAgIHJlZjogc3RyaW5nLCAvL1RPRE8gbWFrZSBpdCBpZFxuICAgIHBhcmFtczogSVByb3BNZXNzYWdlQmVoYXZpb3JQYXJhbVtdXG4gICAgbW9kZToga2V5b2YgdHlwZW9mIFByb3BNZXNzYWdlTW9kZXNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcENvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIGJlaGF2aW9yOiBJUHJvcEJlaGF2aW9yXG59XG5cblxuZXhwb3J0IGNsYXNzIFJlZkJlaGF2aW9yVHlwZSB7XG4gICAgc3RhdGljIGNvZGUgPSAnY29kZScgYXMgY29uc3RcbiAgICBzdGF0aWMgY29tcG9uZW50ID0gJ2NvbXBvbmVudCcgYXMgY29uc3Rcbn1cblxuZXhwb3J0IHR5cGUgSVJlZkJlaGF2aW9yVHlwZSA9ICdjb2RlJyB8ICdjb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogSVJlZkJlaGF2aW9yVHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRSZWZCZWhhdmlvciBleHRlbmRzIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogJ2NvbXBvbmVudCdcbiAgICBjb21wb25lbnRJZDogc3RyaW5nXG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIFByb3BlcnR5IGluc3RhbmNlIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuXG4gICAgICovXG4gICAgaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb2RlUmVmQmVoYXZpb3IgZXh0ZW5kcyBJUmVmQmVoYXZpb3Ige1xuICAgIHR5cGU6ICdjb2RlJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElSZWZDb25maWcge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgc2VsZWN0b3JUeXBlOiBSZWZTZWxlY3RvclR5cGVcbiAgICBzZWxlY3Rvcjogc3RyaW5nXG4gICAgYmVoYXZpb3I6IElSZWZCZWhhdmlvclxufVxuXG4vKipcbiAqIEV4cGVyaWVuY2Ugc2VnbWVudCBydWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VTZWdtZW50UnVsZSB7XG4gICAgcHJvcGVydHk6IHN0cmluZztcbiAgICBvcGVyYXRvcjogc3RyaW5nO1xuICAgIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBBL0Igc3BsaXQgdmVyc2lvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlQUJTcGxpdFZlcnNpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgcGVyY2VudGFnZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEV4cGVyaWVuY2UgQS9CIHNwbGl0IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZUFCU3BsaXQge1xuICAgIHZlcnNpb25zOiBJRXhwZXJpZW5jZUFCU3BsaXRWZXJzaW9uW107XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBzZWdtZW50IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZVNlZ21lbnQge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcnVsZXM6IElFeHBlcmllbmNlU2VnbWVudFJ1bGVbXTtcbiAgICB1c2VBYjogYm9vbGVhbjtcbiAgICBjb21wb25lbnRWYXJpYW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG4gICAgYWJTcGxpdD86IElFeHBlcmllbmNlQUJTcGxpdDtcbiAgICBzdGlja3lQcm9wZXJ0aWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBkZWZpbml0aW9uIGNvbmZpZyAodjIpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VEZWZpbml0aW9uQ29uZmlnIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIC8qKiBTZWxlY3RlZCBjb21wb25lbnQgSURzICovXG4gICAgY29tcG9uZW50czogc3RyaW5nW107XG4gICAgLyoqIFNlZ21lbnQgY29uZmlndXJhdGlvbnMgKi9cbiAgICBzZWdtZW50czogSUV4cGVyaWVuY2VTZWdtZW50W107XG4gICAgLyoqIEZhbGxiYWNrIHZhcmlhbnQgcGVyIGNvbXBvbmVudCAqL1xuICAgIGZhbGxiYWNrOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIC8qKiBUYWdzICovXG4gICAgdGFnczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgLyoqXG4gICAgICogVGhlIGNvbXBvbmVudCdzIHJ1bnRpbWUgdGFnczogb25seSB0YWdzIG5hbWVkIGB1aTouLi5gIChlLmcuIGB1aTpiZXRhYCksIGFzIHNldCBpbiB0aGVcbiAgICAgKiBkYXNoYm9hcmQuIEV2ZXJ5IG90aGVyIHRhZyBzdGF5cyBwcml2YXRlIG9uIHRoZSBzZXJ2ZXIuIEVtcHR5IHdoZW4gdGhlcmUgYXJlIG5vbmUuXG4gICAgICovXG4gICAgdWlUYWdzPzogc3RyaW5nW10sXG4gICAgLy8gcHJvcHM6IFJlY29yZDxzdHJpbmcsIElQcm9wQ29uZmlnPiAvL2lkIC0gdHlwZVxuICAgIC8vIHJlZnM6IFJlY29yZDxzdHJpbmcsIElSZWZDb25maWc+LFxuICAgIC8vIHNraW5zOiBSZWNvcmQ8c3RyaW5nLCBJU2tpbkNvbmZpZz5cbiAgICBwcm9wczogSVByb3BDb25maWdbXSxcbiAgICByZWZzOiBJUmVmQ29uZmlnW10sXG4gICAgc2tpbnM6IElTa2luQ29uZmlnW10sXG4gICAgZGVmYXVsdFNraW46IG51bWJlcjtcblxuICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IHRoYXRcbiAgICAvL3Jlc29sdmVkRGVmaW5pdGlvbnM/OiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1tdXG4gICAgLy9UT0RPIDogbW92ZSB0byBiYXNlIGNsYXNzICggSVN0b3JhYmxlSXRlbSBvciBzby4uLilcblxuICAgIGNyZWF0ZWRPbj86IHN0cmluZ1xuICAgIGNyZWF0ZWRCeT86IHN0cmluZ1xuICAgIHVwZGF0ZWRCeT86IHN0cmluZ1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSUJhc2VNeW9wT2JqZWN0IHtcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lNeW9wU3RvcmVkT2JqZWN0IGV4dGVuZHMgdjJfSUJhc2VNeW9wT2JqZWN0IHtcbiAgICB1cGRhdGVkT24/OiBzdHJpbmdcbiAgICB1cGRhdGVkQnk/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRBY2Nlc3Mge1xuICAgIHZpc2liaWxpdHk6ICdwcml2YXRlJyB8ICd1bmxpc3RlZCcgfCAncHVibGljJztcbiAgICB1bmxpc3RlZD86IHtcbiAgICAgICAgc2x1Zzogc3RyaW5nO1xuICAgIH07XG4gICAgbWFya2V0cGxhY2U/OiB7XG4gICAgICAgIHN0YXR1czogJ2RyYWZ0JyB8ICdzdWJtaXR0ZWQnIHwgJ2NsYWltZWQnIHwgJ2Nsb3NlZCc7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICAgIGNvbnRhY3RFbWFpbDogc3RyaW5nO1xuICAgICAgICBkZWFkbGluZTogc3RyaW5nO1xuICAgIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSUNvbXBvbmVudERlZmluaXRpb25Db25maWcgZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgdmFyaWFudHNfaWRzOiBzdHJpbmdbXSxcbiAgICBEVE9zOiB2Ml9JRFRPW10sXG4gICAgdGFnczogc3RyaW5nW10sXG4gICAgYWNjZXNzPzogQ29tcG9uZW50QWNjZXNzLFxuXG4gICAgLy9cbiAgICB2YXJpYW50c19uYW1lczogc3RyaW5nW10sXG4gICAgdmFyaWFudHNfZGF0YToge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGlkOiBzdHJpbmdcbiAgICAgICAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgICAgICAgdXBkYXRlZE9uPzogc3RyaW5nXG4gICAgICAgIHVwZGF0ZWRCeT86IHN0cmluZ1xuICAgICAgICBoYXNfcmVsZWFzZXM/OiBib29sZWFuXG4gICAgfVtdLFxuXG4gICAgcHJldmlld192YXJpYW50OiB2Ml9JVmFyaWFudENvbmZpZztcbiAgICBleHRyYT86IHtcbiAgICAgICAgZmlyc3RWYXJpYW50OiB2Ml9JVmFyaWFudENvbmZpZzsgLy93aGVuIG5ldyBjb21wb25lbnQgY3JlYXRlcyBhdCB0aGUgY2xpZW50XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lEVE8gZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgZGF0YTogb2JqZWN0XG4gICAgbWV0aG9kTmFtZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5JbnN0YW5jZUNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcyxcbiAgICAvL3NraW5zOiBJU2tpbkluc3RhbmNlQ29uZmlnW11cbn1cblxuZXhwb3J0IGNvbnN0IFNlZ21lbnRUeXBlID0ge1xuICAgIFwiRnVuY3Rpb25SZXN1bHRcIjogXCJGdW5jdGlvblJlc3VsdFwiLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudEluc3RhbmNlIHtcbiAgICBzZWdtZW50SWQ6IHN0cmluZztcbiAgICBza2luU2VsZWN0b3I6IElTa2luU2VsZWN0b3JDb25maWdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudERlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIFNlZ21lbnRUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZ1bmN0aW9uUmVzdWx0c1NlZ21lbnQgZXh0ZW5kcyBJU2VnbWVudERlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZTogdHlwZW9mIFNlZ21lbnRUeXBlLkZ1bmN0aW9uUmVzdWx0XG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIGZ1bmN0aW9uOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IFNraW5TZWxlY3RvclR5cGVzID0ge1xuICAgIFwiU2VnbWVudGVkXCI6IFwiU2VnbWVudGVkXCIsXG4gICAgXCJEZWRpY2F0ZWRcIjogXCJEZWRpY2F0ZWRcIixcblxuICAgIC8qKlxuICAgICAqIFRoaXMgU2VsZWN0b3IgVHlwZSBpcyBub3QgeWV0IHN1cHBvcnRlZCBidXQgd2lsbCBiZSBhZGRlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICAgICAqIFBsZWFzZSBjaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdXBkYXRlcy5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgXCJEZWZhdWx0XCI6IFwiRGVmYXVsdFwiXG59IGFzIGNvbnN0O1xuXG5cbi8qKlxuICogVGhpcyBTa2luIENvbmZpZyBUeXBlIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGJ1dCB3aWxsIGJlIGFkZGVkIGluIGEgZnV0dXJlIHJlbGVhc2UuXG4gKiBQbGVhc2UgY2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIHVwZGF0ZXMuXG4gKlxuICogQHR5cGUge0lEZWZhdWx0U2tpbkNvbmZpZ31cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRGVmYXVsdFNraW5Db25maWcgZXh0ZW5kcyBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMuRGVmYXVsdCxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudGVkU2tpbkNvbmZpZyBleHRlbmRzIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcy5TZWdtZW50ZWQsXG4gICAgc2VnbWVudHM6IElTZWdtZW50SW5zdGFuY2VbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEZWRpY2F0ZWRTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZTogdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZCxcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2tpbn0gaW5zdGVhZC5cbiAgICAgKiBQcm9wZXJ0eSBza2lucyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLlxuICAgICAqIFBsZWFzZSB1cGRhdGUgeW91ciBjb2RlIHRvIHVzZSB7QGxpbmsgc2tpbn0gZm9yIGJldHRlciBjb21wYXRpYmlsaXR5LlxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBza2lucz86IElTa2luSW5zdGFuY2VDb25maWdbXSAvLyBkZXByZWNhdGVkXG4gICAgc2tpbjogSVNraW5JbnN0YW5jZUNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBjb21wb25lbnRJZDogc3RyaW5nO1xuXG4gICAgLy9UT0RPIDpcbiAgICAvLyBSZWZJRCA/IHRvIHN1cHBvcnQgbW9yZSB0aGFuIDEgY29tcG9uZW50IGZyb20gdGhlIHNhbWUgdHlwZSBpbiBjb21wb3NpdGVzID9cblxuICAgIC8vVE9ETyA6IHJlbW92ZVxuICAgIGNvbXBvbmVudE5hbWU6IHN0cmluZzsgLy8gPDwgY2hlY2tcblxuICAgIHNraW5TZWxlY3RvcjogSVNraW5TZWxlY3RvckNvbmZpZ1xuXG4gICAgLy8gc3RvcmluZyB0aGUgbmVzdGVkIGNvbmZpZyBmb3IgcmVmIGNvbXBvbmVudHNcbiAgICBuZXN0ZWRDb21wb25lbnRzPzogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnW11cblxuICAgIC8vb25seSBvbiBHRVQ/XG4gICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgdGhhdFxuICAgIHJlc29sdmVkRXhwZXJpZW5jZXM/OiBJRXhwZXJpZW5jZVtdXG4gICAgLy8gd2lsbCBpbmNsdWRlIGluc3RhbmNlIGFuZCBkZWYgY29uZmlnIGluIG9yZGVyIHRvIHJlbmRlciBpbiBwcm9kdWN0aW9uXG4gICAgcmVzb2x2ZWROZXN0ZWRDb21wb25lbnRzPzogSUNvbXBvbmVudENvbmZpZ1tdXG59XG5cbmV4cG9ydCBjb25zdCBFeHBlcmllbmNlVHlwZXMgPSB7XG4gICAgXCJTZWdtZW50XCI6IFwiU2VnbWVudFwiLFxuICAgIFwiUHJvbW9cIjogXCJQcm9tb1wiLFxuICAgIFwiQUJcIjogXCJBQlwiXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBFeHBlcmllbmNlVHlwZXNcbiAgICBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXVxuICAgIC8vc3RpY2tpbmVzc0ZhY3RvclxuICAgIC8vRW5kRGF0ZVxufVxuXG4vLyBleHBvcnQgaW50ZXJmYWNlIElBQkV4cGVyaWVuY2VHcm91cCB7XG4vLyAgICAgaWQ6IHN0cmluZ1xuLy8gICAgIG5hbWU6IHN0cmluZ1xuLy8gICAgIHBlcmNlbnRhZ2U6IG51bWJlclxuLy8gfVxuXG5leHBvcnQgaW50ZXJmYWNlIElBQkV4cGVyaWVuY2UgZXh0ZW5kcyBJRXhwZXJpZW5jZSB7XG4gICAgdHlwZTogdHlwZW9mIEV4cGVyaWVuY2VUeXBlcy5BQlxuICAgIC8vIGdyb3VwczogSUFCRXhwZXJpZW5jZUdyb3VwW11cbiAgICBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXVxuICAgIHBlcmNlbnRhZ2U6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEYXRlUmFuZ2Uge1xuICAgIGlkOiBzdHJpbmdcbiAgICBzdGFydDogRGF0ZVxuICAgIGVuZDogRGF0ZVxuICAgIHRpbWV6b25lOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudEV4cGVyaWVuY2UgZXh0ZW5kcyBJRXhwZXJpZW5jZSB7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIEV4cGVyaWVuY2VUeXBlc1xuICAgIHNlZ21lbnQ6IElTZWdtZW50RGVmaW5pdGlvblxuICAgIGRhdGVSYW5nZT86IElEYXRlUmFuZ2Vcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVXNlckZsb3dEZWZpbml0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGNvbXBvbmVudHM6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1tdO1xuICAgIG9yaWdpbnM6IHN0cmluZ1tdLFxuICAgIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdXG4gICAgYnJhbmNoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudENvbmZpZyB7XG4gICAgaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1xuICAgIHR5cGU6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG5cbiAgICAvLyBUT0RPIDogdmVyaWZ5IHVuaXF1ZW5lc3MgKGRhc2hib2FyZCAmIHNlcnZlcilcbiAgICBuYW1lOiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIElCcmFuY2hhYmxlIHtcbiAgICBicmFuY2g/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVXNlckZsb3cgZXh0ZW5kcyBPbWl0PElVc2VyRmxvd0RlZmluaXRpb24sICdjb21wb25lbnRzJz4sIElCcmFuY2hhYmxlIHtcbiAgICBjb21wb25lbnRzOiBJQ29tcG9uZW50Q29uZmlnW11cbn1cblxuZXhwb3J0IGNsYXNzIFJvb3RSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwdWJsaWMgc2hhZG93Um9vdD86IFNoYWRvd1Jvb3QpIHtcblxuICAgIH1cblxuICAgIGdldFJvb3REaXYgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiAodGhpcy5zaGFkb3dSb290IHx8IHRoaXMuY29udGFpbmVyKS5xdWVyeVNlbGVjdG9yKCdkaXYnKVxuICAgIH1cblxuICAgIGdldFJvb3QgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiAodGhpcy5zaGFkb3dSb290IHx8IHRoaXMuY29udGFpbmVyKTtcbiAgICB9XG59XG4iLCAiZXhwb3J0IHR5cGUgU2VyaWFsaXphYmxlPFQ+ID1cbiAgICBUIGV4dGVuZHMgRnVuY3Rpb24gPyBuZXZlciA6IC8vIEV4Y2x1ZGUgZnVuY3Rpb25zXG4gICAgICAgIFQgZXh0ZW5kcyBBcnJheTxpbmZlciBVPiA/IFNlcmlhbGl6YWJsZTxVPltdIDogLy8gSGFuZGxlIGFycmF5c1xuICAgICAgICAgICAgVCBleHRlbmRzIG9iamVjdCA/IHtcbiAgICAgICAgICAgICAgICBbSyBpbiBrZXlvZiBUIGFzIFRbS10gZXh0ZW5kcyBGdW5jdGlvbiA/IG5ldmVyIDogS106IFNlcmlhbGl6YWJsZTxUW0tdPlxuICAgICAgICAgICAgfSA6IFQ7IC8vIEhhbmRsZSBvYmplY3RzXG5cbmNvbnN0IGlzUHJpbWl0aXZlID0gKHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBPYmplY3QodmFsdWUpO1xufVxuXG5jb25zdCBpc0Z1bmN0aW9uID0gKHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZXhwb3J0IGNvbnN0IGNvbnRhaW5zUHJpbWl0aXZlc09ubHkgPSAob2JqKSA9PiB7XG4gICAgaWYgKGlzUHJpbWl0aXZlKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGlzRnVuY3Rpb24ob2JqKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBjaGVjayBpZiBpdCdzIGEgbmVzdGVkIG9iamVjdFxuICAgICAgICAgICAgaWYgKCFjb250YWluc1ByaW1pdGl2ZXNPbmx5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc1ByaW1pdGl2ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBJdCdzIGEgcHJpbWl0aXZlLCBzbyB3ZSBjYW4gc2tpcCBpdFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBGb3VuZCBhIG5vbi1wcmltaXRpdmUgdmFsdWVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlOyAvLyBBbGwgdmFsdWVzIGFyZSBwcmltaXRpdmVzIG9yIG5lc3RlZCBvYmplY3RzIHdpdGggcHJpbWl0aXZlc1xufVxuXG4vLyBjdXJyZW50bHkgc3VwcG9ydCByb290IGxldmVsIG9ubHlcbi8vIHt4OiAxLCB5IDogJ2EnLCB6IDogKCk9PnsuLi59LCBpbm5lciA6IHsgeDogMSAsIHkgOiAnYSd9IH1cbi8vIHt4OiAxLCB5IDogJ2EnfVxuLy9odHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0dsb3NzYXJ5L0ZhbHN5XG5leHBvcnQgdHlwZSBTZXJpYWxpemFibGVTa2VsZXRvbjxUPiA9IFBhcnRpYWw8UmVjb3JkPGtleW9mIFQsIGJvb2xlYW4gfCBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+Pj4+IHwgYm9vbGVhbjtcblxuZXhwb3J0IGNvbnN0IG1ha2VTZXJpYWxpemFibGUgPSA8VD4oXG4gICAgb2JqOiBULFxuICAgIHNrZWxldG9uOiBTZXJpYWxpemFibGVTa2VsZXRvbjxUPiA9IHt9LFxuICAgIGluY2x1ZGVGYWxzeUtleXM6IGJvb2xlYW4gPSB0cnVlLCAvLyBUT0RPIDogdXNlIHRoYXQgYXJnXG4gICAgc2VlbjogV2Vha01hcDxvYmplY3QsIFNlcmlhbGl6YWJsZTxhbnk+PiA9IG5ldyBXZWFrTWFwKClcbik6IFNlcmlhbGl6YWJsZTxUPiA9PiB7XG5cbiAgICBpZiAoaXNQcmltaXRpdmUob2JqKSkge1xuICAgICAgICByZXR1cm4gb2JqIGFzIFNlcmlhbGl6YWJsZTxUPjsgLy8gRGlyZWN0bHkgcmV0dXJuIHByaW1pdGl2ZSB2YWx1ZXNcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgIGlmIChzZWVuLmhhcyhvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gc2Vlbi5nZXQob2JqKSE7IC8vIFJldHVybiB0aGUgYWxyZWFkeSBwcm9jZXNzZWQgb2JqZWN0XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgYXJyYXkgc2VyaWFsaXphdGlvblxuICAgICAgICBjb25zdCBzZXJpYWxpemFibGVBcnJheTogU2VyaWFsaXphYmxlPGFueT5bXSA9IFtdO1xuICAgICAgICBzZWVuLnNldChvYmosIHNlcmlhbGl6YWJsZUFycmF5KTsgLy8gU3RvcmUgdGhlIGFycmF5IGluIHNlZW5cblxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgb2JqLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IG9ialtpbmRleF07XG4gICAgICAgICAgICBzZXJpYWxpemFibGVBcnJheVtpbmRleF0gPSBtYWtlU2VyaWFsaXphYmxlKGVsZW1lbnQsIHNrZWxldG9uLCBpbmNsdWRlRmFsc3lLZXlzLCBzZWVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXphYmxlQXJyYXkgYXMgU2VyaWFsaXphYmxlPFQ+O1xuICAgIH1cblxuICAgIGlmIChvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGN5Y2xpYyByZWZlcmVuY2VzXG4gICAgICAgIGlmIChzZWVuLmhhcyhvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gc2Vlbi5nZXQob2JqKSE7IC8vIFJldHVybiB0aGUgYWxyZWFkeSBwcm9jZXNzZWQgb2JqZWN0XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VyaWFsaXphYmxlT2JqZWN0OiBQYXJ0aWFsPFNlcmlhbGl6YWJsZTxUPj4gPSB7fTtcbiAgICAgICAgc2Vlbi5zZXQob2JqLCBzZXJpYWxpemFibGVPYmplY3QpOyAvLyBTdG9yZSB0aGUgb2JqZWN0IGluIHNlZW5cblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBrZXkgaXMgaW4gdGhlIHNrZWxldG9uIGFuZCBpZiBpdCdzIGEgdmFsaWQga2V5IHRvIHNlcmlhbGl6ZVxuXG4gICAgICAgICAgICBjb25zdCBrZXlJblNrZWxldG9uID0gdHlwZW9mIHNrZWxldG9uID09IFwiYm9vbGVhblwiID8gc2tlbGV0b24gOiBza2VsZXRvbltrZXldO1xuXG4gICAgICAgICAgICBpZiAoa2V5SW5Ta2VsZXRvbikge1xuICAgICAgICAgICAgICAgIGlmIChrZXlJblNrZWxldG9uID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBza2VsZXRvbiBpbmRpY2F0ZXMgdG8gc2VyaWFsaXplIHRoaXMga2V5XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlRmFsc3lLZXlzID8gb2JqW2tleV0gIT09IHVuZGVmaW5lZCA6IG9ialtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemFibGVPYmplY3Rba2V5XSA9IG1ha2VTZXJpYWxpemFibGUob2JqW2tleV0sIHRydWUsIGluY2x1ZGVGYWxzeUtleXMsIHNlZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Yga2V5SW5Ta2VsZXRvbiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNrZWxldG9uIGluZGljYXRlcyBuZXN0ZWQga2V5cyB0byBzZXJpYWxpemVcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemFibGVPYmplY3Rba2V5XSA9IG1ha2VTZXJpYWxpemFibGUob2JqW2tleV0sIGtleUluU2tlbGV0b24sIGluY2x1ZGVGYWxzeUtleXMsIHNlZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXphYmxlT2JqZWN0IGFzIFNlcmlhbGl6YWJsZTxUPjtcbiAgICB9XG5cbiAgICByZXR1cm4ge30gYXMgYW55OyAvLyBSZXR1cm4gYW4gZW1wdHkgb2JqZWN0IGZvciBvdGhlciBjYXNlc1xufVxuIiwgImV4cG9ydCBjb25zdCBFcnJvcnMgPSB7XG4gICAgbm90U2VyaWFsaXphYmxlUmVmQ2FsbDogKHByb3AsIGFyZykgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxuVGhlIGlucHV0IHByb3ZpZGVkIHRvICcke3Byb3AudG9TdHJpbmcoKX0nIGlzIG5vdCBzZXJpYWxpemFibGUuIFNlcmlhbGl6YXRpb24gaXMgcmVxdWlyZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGRhdGEgY2FuIGJlIHNhZmVseSB0cmFuc2ZlcnJlZCB0byB0aGUgc2tpbiBpbXBsZW1lbnRhdGlvbi4gXG5UaGUgZm9sbG93aW5nIHR5cGVzIG9mIGRhdGEgYXJlIGNvbnNpZGVyZWQgbm9uLXNlcmlhbGl6YWJsZSBhbmQgY2Fubm90IGJlIHByb2Nlc3NlZDpcblxuLSBGdW5jdGlvbnNcbi0gRE9NIGVsZW1lbnRzXG4tIENsYXNzIGluc3RhbmNlc1xuLSBDaXJjdWxhciByZWZlcmVuY2VzXG4tIFN5bWJvbHNcbi0gQmlnSW50IHZhbHVlc1xuXG5JbiB0aGUgZm9sbG93aW5nIGV4ZWN1dGlvbiB3ZSBkZXRlY3RlZCA6XG5+fn5+fn5+flxuJHthcmd9IFxufn5+fn5+fn5cbmFzIG5vdCBzZXJpYWxpemFibGUuXG5cblRvIHJlc29sdmUgdGhpcyBpc3N1ZSwgcGxlYXNlIGVuc3VyZSB0aGF0IGFsbCBpbnB1dHMgcGFzc2VkIHRvICcke3Byb3AudG9TdHJpbmcoKX0nIGFyZSBpbiBhIHNlcmlhbGl6YWJsZSBmb3JtYXQuXG5UaGlzIHR5cGljYWxseSBpbmNsdWRlcyBwcmltaXRpdmUgdHlwZXMgKHN0cmluZ3MsIG51bWJlcnMsIGJvb2xlYW5zKSwgYXJyYXlzLCBhbmQgcGxhaW4gb2JqZWN0cy4gXG5JZiB5b3UgbmVlZCB0byBpbmNsdWRlIGNvbXBsZXggZGF0YSB0eXBlcywgY29uc2lkZXIgY29udmVydGluZyB0aGVtIHRvIGEgc2VyaWFsaXphYmxlIHN0cnVjdHVyZSBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHRoZSBmdW5jdGlvbi5cbk9yIHVzZSBNeW9wIG1lc3NhZ2UgdGhhdCBzdXBwb3J0IGl0OiBDdXN0b21SZWZNZXNzYWdlLCBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSBvciBFeGVjdXRlU2NyaXB0TWVzc2FnZS5cblxuU3VnZ2VzdGVkIEZpeDpcbjEuIFJlbW92ZSBvciByZXBsYWNlIG5vbi1zZXJpYWxpemFibGUgdmFsdWVzIGZyb20geW91ciBpbnB1dC5cbjIuIElmIHVzaW5nIG9iamVjdHMsIGVuc3VyZSB0aGV5IGRvIG5vdCBjb250YWluIGFueSBmdW5jdGlvbnMgb3IgY2lyY3VsYXIgcmVmZXJlbmNlcy5cbjMuIENvbnZlcnQgYW55IGNsYXNzIGluc3RhbmNlcyB0byBwbGFpbiBvYmplY3RzIG9yIEpTT04tY29tcGF0aWJsZSBmb3JtYXRzLlxuNC4gVXNlIGRlZGljYXRlZCBNeW9wIG1lc3NhZ2UuXG5cbkZvciBtb3JlIGRldGFpbHMgb24gc2VyaWFsaXphdGlvbiBhbmQgTXlvcCBtZXNzYWdlIGV4YW1wbGVzLCByZWZlciB0byBodHRwczovL2RvY3MubXlvcC5kZXZcXC5cblxuYCk7XG4gICAgfVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcENvbXBvbmVudCwgSU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0VudmVsb3BlZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlcy9FbnZlbG9wZWRNZXNzYWdlXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBNeW9wUmVmQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBwdWJsaWMgcGFyZW50OiBJTXlvcENvbXBvbmVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgLy9UT0RPIDogY2hlY2sgcGFyZW50Q29tcG9uZW50LmNvbnRhaW5lci4uLlxuICAgICAgICBzdXBlcihjb21wb25lbnREZWZpbml0aW9uLCBwYXJlbnQuY29udGFpbmVyLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICAvL3RoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZChhcmd1bWVudHMuY2FsbGVlLm5hbWUpKTtcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdoaWRlJykpO1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnc2hvdycpKTtcbiAgICB9XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICAvL1RPRE8gOiBzdXBwb3J0IHJlYWwgY2xlYW51cFxuICAgICAgICAvL2NvbnNvbGUubG9nKCdyZWYgaW5zcGVjdCBjYWxsZWQsIGNyZWF0aW5nIEV4ZWN1dGVDb21wb25lbnRNZXRob2QgaW5zcGVjdCcsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYsIHRoaXMuaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdpbnNwZWN0JykpO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQoKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdzZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50JykpO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdzZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0JykpO1xuICAgIH1cblxuICAgIG9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gJ011dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJykge1xuICAgICAgICAvLyAgZGVidWdnZXI7XG4gICAgICAgIC8vICAgICB0aGlzLnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKTtcbiAgICAgICAgLy8gICAgIHJldHVybiB0cnVlO1xuICAgICAgICAvLyB9XG4gICAgICAgIHJldHVybiBzdXBlci5vbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlKTtcbiAgICB9XG5cblxuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ3JlZiBtZXNzYWdlIHNlbmRpbmcgJywgbWVzc2FnZSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlclxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZSk7XG5cbiAgICAgICAgLy8gdGhpcy5pZCB3aWxsIGJlIGF2YWlsYWJsZSBvbiB0aGUgbmVzdGVkIGNvbXBvbmVudFxuICAgICAgICB0aGlzLnBhcmVudC5zZW5kKG5ldyBFbnZlbG9wZWRNZXNzYWdlKHRoaXMuaWQsIG1lc3NhZ2UpKTtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG1lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH07XG5cbiAgICBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc0luaXRpYXRlZClcbiAgICAgICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnZGlzcG9zZScpKTtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0F1dG9TaXplT3B0aW9ucywgQmFzZU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7c2V0RGVidWdTdHlsZX0gZnJvbSBcIi4uL2NvbXBvbmVudENvcmVcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcblxuLyoqXG4gKiBDb21wb25lbnQgd3JhcHBlciBmb3IgTXlvcCBXZWIgQ29tcG9uZW50cyB0aGF0IGFyZSBleHRyYWN0ZWQgZnJvbSBIVE1MXG4gKiBhbmQgcnVuIGRpcmVjdGx5IG9uIHRoZSBob3N0IGRvY3VtZW50IChub3QgaW4gYW4gaWZyYW1lKS5cbiAqXG4gKiBUaGVzZSBjb21wb25lbnRzIHVzZSB0aGUgbmF0aXZlIFdlYiBDb21wb25lbnRzIEFQSSAoQ3VzdG9tIEVsZW1lbnRzICsgU2hhZG93IERPTSlcbiAqIGFuZCBjb21tdW5pY2F0ZSB2aWEgZGlyZWN0IG1ldGhvZCBjYWxscyBhbmQgQ3VzdG9tRXZlbnRzIGluc3RlYWQgb2YgcG9zdE1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuICAgIHByaXZhdGUgY3RhQ2xlYW51cD86ICgpID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSBfY3RhSGFuZGxlcj86IChhY3Rpb246IHN0cmluZywgcGF5bG9hZDogdW5rbm93bikgPT4gdm9pZDtcbiAgICBwcml2YXRlIF9jdGFRdWV1ZTogQXJyYXk8e2FjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3dufT4gPSBbXTtcblxuICAgIC8vIEEgc2luZ2xlICdteW9wLWN0YScgbGlzdGVuZXIsIGF0dGFjaGVkIGF0IGNvbnN0cnVjdGlvbiBzbyBDVEFzIGEgY29tcG9uZW50XG4gICAgLy8gZGlzcGF0Y2hlcyBkdXJpbmcgaXRzIGZpcnN0IGluaXRXaXRoRGF0YSgpIHJlbmRlciBcdTIwMTQgYmVmb3JlIHRoZSBob3N0IGF0dGFjaGVzXG4gICAgLy8gYSBoYW5kbGVyIFx1MjAxNCBhcmUgYnVmZmVyZWQgKGFuZCBmbHVzaGVkIG9uIHNldEN0YUhhbmRsZXIpLCBtYXRjaGluZyB0aGUgaWZyYW1lXG4gICAgLy8gcGF0aCdzIHByZS1oYW5kbGVyIENUQSBxdWV1ZS5cbiAgICBwcml2YXRlIF9jdGFMaXN0ZW5lciA9IChlOiBFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBkZXRhaWwgPSAoZSBhcyBDdXN0b21FdmVudCkuZGV0YWlsO1xuICAgICAgICBpZiAoIWRldGFpbD8uYWN0aW9uKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLl9jdGFIYW5kbGVyICYmICF0aGlzLm1hcmtlZEZvckRpc3Bvc2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9jdGFIYW5kbGVyKGRldGFpbC5hY3Rpb24sIGRldGFpbC5wYXlsb2FkKTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5fY3RhSGFuZGxlcikge1xuICAgICAgICAgICAgdGhpcy5fY3RhUXVldWUucHVzaCh7IGFjdGlvbjogZGV0YWlsLmFjdGlvbiwgcGF5bG9hZDogZGV0YWlsLnBheWxvYWQgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgICAgICBza2luOiBJU2tpbkNvbmZpZyxcbiAgICAgICAgcHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgICAgIHByaXZhdGUgY3VzdG9tRWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgICAgIHByaXZhdGUgdGFnTmFtZTogc3RyaW5nLFxuICAgICAgICBvcHRpb25zPzogbG9hZGVyT3B0aW9uc1xuICAgICkge1xuICAgICAgICBzdXBlcihjb21wb25lbnREZWZpbml0aW9uLCBjb250YWluZXIsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBjdXN0b21FbGVtZW50O1xuXG4gICAgICAgIC8vIExpc3RlbiBCRUZPUkUgYW55IGluaXRXaXRoRGF0YSByZW5kZXIgc28gaW5pdC10aW1lIENUQXMgYXJlbid0IGxvc3QuXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdteW9wLWN0YScsIHRoaXMuX2N0YUxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy5jdGFDbGVhbnVwID0gKCkgPT4gdGhpcy5jdXN0b21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ215b3AtY3RhJywgdGhpcy5fY3RhTGlzdGVuZXIpO1xuXG4gICAgICAgIC8vIFdlYiBjb21wb25lbnRzIGFyZSBpbml0aWF0ZWQgaW1tZWRpYXRlbHkgKG5vIHBvc3RNZXNzYWdlIGhhbmRzaGFrZSBuZWVkZWQpXG4gICAgICAgIHRoaXMuc2V0SW5pdGlhdGVkKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYXV0b1NpemVPcHRpb25zPzogQXV0b1NpemVPcHRpb25zO1xuXG4gICAgLyoqXG4gICAgICogRGF0YS1vdXQgZm9yIHNpemUgXHUyMDE0IHRoZSBleHRyYWN0ZWQgY291bnRlcnBhcnQgb2YgdGhlIGlmcmFtZSBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKlxuICAgICAqIFRISVMgRVhJU1RFRCBPTkxZIE9OIE15b3BJZnJhbWVDb21wb25lbnQsIGFuZCB0aGF0IHdhcyBpbnZpc2libGUgZm9yIGFzIGxvbmcgYXNcbiAgICAgKiBtaW5pZmljYXRpb24gd2FzIHNlbmRpbmcgZXZlcnkgdjIgY29tcG9uZW50IGRvd24gdGhlIGlmcmFtZSBwYXRoLiBSZXN0b3JpbmcgdjJcbiAgICAgKiBkZXRlY3Rpb24gbW92ZXMgdGhlbSB0byB0aGlzIGNsYXNzLCBhbmQgYEBteW9wL3JlYWN0YCBkcml2ZXMgYm90aCB0aHJvdWdoIG9uZVxuICAgICAqIHdyYXBwZXI6IGluIGNvbnRlbnQgbW9kZSBpdCBoaWRlcyBpdHMgbG9hZGVyIGZyb20gdGhlIEZJUlNUIG9uU2l6ZUNoYW5nZSwgc28gYVxuICAgICAqIGNvbXBvbmVudCB3aG9zZSBjbGFzcyBoYXMgbm8gb2JzZXJ2ZUF1dG9TaXplIGxlYXZlcyBhIFJlYWN0IGhvc3Qgb24gYSBsb2FkZXJcbiAgICAgKiBmb3JldmVyLiBQaWMtVGltZSdzIHNpemVNZXRhIGlzIHdpZHRoOjEwMCUgd2l0aCBubyBoZWlnaHQsIHdoaWNoIGlzIGV4YWN0bHkgY29udGVudFxuICAgICAqIG1vZGUuIENhdWdodCBieSB2Mi1kYXRhLWNvbnRyYWN0IEQ4IChBUEkgcGFyaXR5KS5cbiAgICAgKlxuICAgICAqIEl0IFJFUE9SVFMgcmF0aGVyIHRoYW4gaW1wb3Nlcy4gQW4gaWZyYW1lIGhhcyBubyBpbnRyaW5zaWMgc2l6ZSBhbmQgbXVzdCBiZVxuICAgICAqIG1lYXN1cmVkIGluc2lkZSBhbmQgdGhlbiBzZXQgZnJvbSBvdXRzaWRlOyBhIGN1c3RvbSBlbGVtZW50IHNpemVzIGl0c2VsZiBmcm9tIGl0c1xuICAgICAqIG93biBjb250ZW50LCBzbyB0aGUgaG9uZXN0IHRoaW5nIGlzIHRvIG1lYXN1cmUgaXQgYW5kIHRlbGwgdGhlIGhvc3QsIGFuZCBsZXQgdGhlXG4gICAgICogaG9zdCBkZWNpZGUuIFJlYWN0IHRoZW4gdXNlcyB3aWR0aDoxMDAlIGFuZCB0aGUgbWVhc3VyZWQgaGVpZ2h0LlxuICAgICAqXG4gICAgICogVGhlIG9uZSB0aGluZyBpdCBkb2VzIGltcG9zZSBpcyBgZGlzcGxheTogYmxvY2tgIHdoZW4gdGhlIGVsZW1lbnQgY29tcHV0ZXMgdG9cbiAgICAgKiBgaW5saW5lYCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQgZm9yIGEgY3VzdG9tIGVsZW1lbnQgYW5kIG1lYXN1cmVzIGFzIHplcm8gaGVpZ2h0IG5vXG4gICAgICogbWF0dGVyIHdoYXQgaXQgY29udGFpbnMuIFRoZSBpZnJhbWUgcGF0aCBmb3JjZXMgd2lkdGg6MTAwJSBmb3IgdGhlIHNhbWUgcmVhc29uIFx1MjAxNFxuICAgICAqIHdpdGhvdXQgaXQgdGhlIGZpcnN0IG1lYXN1cmVtZW50IGlzIDAgYW5kIHRoZSBob3N0IHNpemVzIHRoZSBjb21wb25lbnQgdG8gbm90aGluZy5cbiAgICAgKi9cbiAgICBvYnNlcnZlQXV0b1NpemUgPSAob3B0aW9ucz86IEF1dG9TaXplT3B0aW9ucyk6IENsZWFudXBIYW5kbGVyID0+IHtcbiAgICAgICAgdGhpcy5fYXV0b1NpemVPcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLmN1c3RvbUVsZW1lbnQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChnZXRDb21wdXRlZFN0eWxlKGVsKS5kaXNwbGF5ID09PSAnaW5saW5lJykgZWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIH0gY2F0Y2ggeyAvKiBkZXRhY2hlZCBvciBubyBsYXlvdXQgeWV0OyB0aGUgb2JzZXJ2ZXIgd2lsbCByZXBvcnQgb25jZSBpdCBoYXMgb25lICovIH1cblxuICAgICAgICBjb25zdCBwYXJzZSA9ICh2OiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ251bWJlcicpIHJldHVybiB2O1xuICAgICAgICAgICAgY29uc3QgbiA9IHBhcnNlRmxvYXQodik7XG4gICAgICAgICAgICByZXR1cm4gaXNOYU4obikgPyB1bmRlZmluZWQgOiBuO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBjbGFtcCA9ICh2OiBudW1iZXIsIG1pbj86IG51bWJlciwgbWF4PzogbnVtYmVyKSA9PlxuICAgICAgICAgICAgbWluICE9PSB1bmRlZmluZWQgJiYgdiA8IG1pbiA/IG1pbiA6IChtYXggIT09IHVuZGVmaW5lZCAmJiB2ID4gbWF4ID8gbWF4IDogdik7XG5cbiAgICAgICAgY29uc3QgcmVwb3J0ID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMuX2F1dG9TaXplT3B0aW9ucztcbiAgICAgICAgICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IGF1dG9IZWlnaHQgPSBvcHRzPy5leHBsaWNpdEhlaWdodCA9PT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgb3B0cz8ub25TaXplQ2hhbmdlPy4oe1xuICAgICAgICAgICAgICAgIHdpZHRoOiByZWN0LndpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodDogYXV0b0hlaWdodFxuICAgICAgICAgICAgICAgICAgICA/IGNsYW1wKHJlY3QuaGVpZ2h0LCBwYXJzZShvcHRzPy5taW5IZWlnaHQpLCBwYXJzZShvcHRzPy5tYXhIZWlnaHQpKVxuICAgICAgICAgICAgICAgICAgICA6IHJlY3QuaGVpZ2h0LFxuICAgICAgICAgICAgICAgIGF1dG9TaXppbmdXaWR0aDogZmFsc2UsICAgLy8gYSB3ZWIgY29tcG9uZW50IGZpbGxzIGl0cyBjb250YWluZXIncyB3aWR0aFxuICAgICAgICAgICAgICAgIGF1dG9TaXppbmdIZWlnaHQ6IGF1dG9IZWlnaHQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgcm86IFJlc2l6ZU9ic2VydmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcm8gPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gcmVwb3J0KCkpO1xuICAgICAgICAgICAgcm8ub2JzZXJ2ZShlbCk7XG4gICAgICAgIH0gY2F0Y2ggeyAvKiBubyBSZXNpemVPYnNlcnZlcjogdGhlIG9uZS1zaG90IHJlcG9ydCBiZWxvdyBzdGlsbCB1bmJsb2NrcyB0aGUgaG9zdCAqLyB9XG5cbiAgICAgICAgLy8gRmlyZSBvbmNlIGltbWVkaWF0ZWx5LiBIb3N0cyBnYXRlIHRoZWlyIGxvYWRlciBvbiB0aGUgRklSU1QgbWVhc3VyZW1lbnQsIHNvIGFcbiAgICAgICAgLy8gY29tcG9uZW50IHRoYXQgbmV2ZXIgcmVzaXplcyBtdXN0IHN0aWxsIHByb2R1Y2Ugb25lLlxuICAgICAgICByZXBvcnQoKTtcblxuICAgICAgICByZXR1cm4gKCkgPT4geyBybz8uZGlzY29ubmVjdCgpOyB0aGlzLl9hdXRvU2l6ZU9wdGlvbnMgPSB1bmRlZmluZWQ7IH07XG4gICAgfVxuXG4gICAgY2xlYW51cEluc3BlY3Q6IENsZWFudXBIYW5kbGVyID0gKCkgPT4ge307XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ID0gc2V0RGVidWdTdHlsZSh0aGlzLmlkLCAnTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudCcsIDAsIHRoaXMuY29udGFpbmVyLCB0aGlzLmN1c3RvbUVsZW1lbnQsIHRoaXMuY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzLmNsZWFudXBJbnNwZWN0O1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLndpZHRoID0gJzAnO1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAndW5zZXQnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhbGwnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLmhlaWdodCA9ICcnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUud2lkdGggPSAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHRoZSBjb21wb25lbnQgd2l0aCBkYXRhIGJ5IGNhbGxpbmcgbXlvcF9pbml0X2ludGVyZmFjZSBkaXJlY3RseVxuICAgICAqL1xuICAgIGluaXRXaXRoRGF0YShkYXRhOiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuY3VzdG9tRWxlbWVudCBhcyBhbnkpLm15b3BfaW5pdF9pbnRlcmZhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICh0aGlzLmN1c3RvbUVsZW1lbnQgYXMgYW55KS5teW9wX2luaXRfaW50ZXJmYWNlKGRhdGEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGN1cnJlbnQgZGF0YSBmcm9tIHRoZSBjb21wb25lbnRcbiAgICAgKi9cbiAgICBnZXREYXRhKCk6IHVua25vd24ge1xuICAgICAgICBpZiAodHlwZW9mICh0aGlzLmN1c3RvbUVsZW1lbnQgYXMgYW55KS5teW9wX2luaXRfaW50ZXJmYWNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuY3VzdG9tRWxlbWVudCBhcyBhbnkpLm15b3BfaW5pdF9pbnRlcmZhY2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBDVEEgaGFuZGxlciAtIHVuaWZpZWQgQVBJIHdpdGggaWZyYW1lIGNvbXBvbmVudHMuXG4gICAgICogQ2FsbGVkIHZpYSBwcm9wcy5teW9wX2N0YV9oYW5kbGVyID0gaGFuZGxlclxuICAgICAqL1xuICAgIHNldEN0YUhhbmRsZXIoaGFuZGxlcjogKGFjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIC8vIFRoZSAnbXlvcC1jdGEnIGxpc3RlbmVyIGlzIGF0dGFjaGVkIGluIHRoZSBjb25zdHJ1Y3Rvciwgc28gd2Ugb25seSBzZXQgdGhlXG4gICAgICAgIC8vIGhhbmRsZXIgYW5kIGZsdXNoIGFueXRoaW5nIHRoZSBjb21wb25lbnQgZW1pdHRlZCBiZWZvcmUgbm93IChlLmcuIGR1cmluZyB0aGVcbiAgICAgICAgLy8gZmlyc3QgaW5pdFdpdGhEYXRhIHJlbmRlcikuXG4gICAgICAgIHRoaXMuX2N0YUhhbmRsZXIgPSBoYW5kbGVyO1xuXG4gICAgICAgIGlmICh0aGlzLl9jdGFRdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBxdWV1ZSA9IFsuLi50aGlzLl9jdGFRdWV1ZV07XG4gICAgICAgICAgICB0aGlzLl9jdGFRdWV1ZSA9IFtdO1xuICAgICAgICAgICAgcXVldWUuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcihpdGVtLmFjdGlvbiwgaXRlbS5wYXlsb2FkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvciBjb21wYXRpYmlsaXR5IHdpdGggbWVzc2FnZS1iYXNlZCBjb21wb25lbnRzLlxuICAgICAqIFdlYiBjb21wb25lbnRzIGRvbid0IHVzZSBwb3N0TWVzc2FnZSwgc28gdGhpcyBpcyBhIG5vLW9wIGZvciBtb3N0IG1lc3NhZ2VzLlxuICAgICAqL1xuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlPGFueT4pID0+IHtcbiAgICAgICAgLy8gV2ViIGNvbXBvbmVudHMgZG9uJ3QgdXNlIHRoZSBwb3N0TWVzc2FnZSBzeXN0ZW1cbiAgICAgICAgLy8gSW5zdGVhZCwgaW50ZXJhY3QgZGlyZWN0bHkgdmlhIHByb3BzLm15b3BfaW5pdF9pbnRlcmZhY2UgYW5kIHByb3BzLm15b3BfY3RhX2hhbmRsZXJcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSBzdXBlci5zZW5kKG1lc3NhZ2UpO1xuXG4gICAgICAgIC8vIExvZyBmb3IgZGVidWdnaW5nXG4gICAgICAgIGNvbnNvbGUuZGVidWcoJ1tNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50XSBzZW5kKCkgY2FsbGVkIC0gd2ViIGNvbXBvbmVudHMgdXNlIGRpcmVjdCBBUEkgaW5zdGVhZCcsIG1lc3NhZ2UpO1xuXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9XG5cbiAgICBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jdGFDbGVhbnVwKSB7XG4gICAgICAgICAgICB0aGlzLmN0YUNsZWFudXAoKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZCh0aGlzLmN1c3RvbUVsZW1lbnQpO1xuICAgIH1cbn1cbiIsICIvL3R5cGUgQUNvbnN0cnVjdG9yVHlwZU9mPFQ+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgQ3VzdG9tUmVmTWVzc2FnZSwgUmVmfSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCAqIGFzIG1lc3NhZ2VzIGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudENvbmZpZyxcbiAgICB0eXBlIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElDb21wb25lbnRSZWZCZWhhdmlvciwgSUhUTUxMb2FkZXJDb25maWcsIElQcm9wQ29kZUJlaGF2aW9yLFxuICAgIElQcm9wQ29uZmlnLCBJU2tpbkNvbmZpZywgUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMsXG4gICAgUmVmQmVoYXZpb3JUeXBlLCBTaGFkb3dSb290TW9kZVR5cGUsIFNraW5Mb2FkZXJzLCBTa2luTG9hZGVyVHlwZVxufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge2NvbnRhaW5zUHJpbWl0aXZlc09ubHl9IGZyb20gXCIuLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvblwiO1xuaW1wb3J0IHtFcnJvcnN9IGZyb20gXCIuL2xvZ01lc3NhZ2VzXCI7XG5pbXBvcnQge015b3BSZWZDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvbXlvcFJlZkNvbXBvbmVudFwiO1xuaW1wb3J0IHtNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL215b3BFeHRyYWN0ZWRXZWJDb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcElmcmFtZUNvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9teW9wSWZyYW1lQ29tcG9uZW50XCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuL2hvc3RTREtcIjtcblxudHlwZSBjb21wb25lbnREZWZpbml0aW9uUHJvcHMgPSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1sncHJvcHMnXVxuXG5jb25zdCBjcmVhdGVEZWJ1Z1RpdGxlID0gKHRleHQ6IHN0cmluZywgdG9wOiBudW1iZXIsIGNvbXBvbmVudERlZmluaXRpb25Db25maWc6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSA9PiB7XG4gICAgY29uc3QgdGl0bGVFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICB0aXRsZUVsLnRleHRDb250ZW50ID0gdGV4dDtcbiAgICB0aXRsZUVsLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB0aXRsZUVsLnN0eWxlLnBhZGRpbmcgPSAnMCA1cHgnO1xuICAgIHRpdGxlRWwuc3R5bGUuZm9udFNpemUgPSAnMTRweCc7XG4gICAgdGl0bGVFbC5zdHlsZVsndG9wJ10gPSAnMCc7XG4gICAgdGl0bGVFbC5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xuICAgIC8vdGl0bGVFbC5zdHlsZS5sZWZ0ID0gJzUwJSc7XG4gICAgdGl0bGVFbC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWCgtNTAlKSc7XG4gICAgdGl0bGVFbC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICB0aXRsZUVsLmhyZWYgPSBgaHR0cHM6Ly9kYXNoYm9hcmQubXlvcC5kZXYvZGFzaGJvYXJkL2NvbXBvbmVudC8ke2NvbXBvbmVudERlZmluaXRpb25Db25maWcuaWR9YFxuXG4gICAgcmV0dXJuIHRpdGxlRWw7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0RGVidWdTdHlsZSA9IChpZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgIC8vIzAwN0JGRiAoYmx1ZSkgb3IgI0ZGNTcyMiAob3JhbmdlKVxuICAgIC8vIzRDQUY1MCAoZ3JlZW4pIG9yICNGRkMxMDcgKGFtYmVyKVxuICAgIC8vIGNvbnN0IHRvcFRleHQgPSBjcmVhdGVEZWJ1Z1RpdGxlKGAke2lkfSA6ICR7dHlwZX1gLCB0b3AsIGNvbXBvbmVudERlZmluaXRpb25Db25maWcpO1xuICAgIGNvbnN0IHRvcFRleHQgPSBjcmVhdGVEZWJ1Z1RpdGxlKGAke2NvbXBvbmVudERlZmluaXRpb25Db25maWcubmFtZX0gOiAke3R5cGV9YCwgdG9wLCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKTtcbiAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKHRvcFRleHQsIGNvbXBvbmVudEVsZW1lbnQpO1xuICAgIGNvbXBvbmVudEVsZW1lbnQuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjMDA3QkZGJztcbiAgICBjb21wb25lbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29tcG9uZW50RWxlbWVudC5zdHlsZS5ib3JkZXIgPSAndW5zZXQnO1xuICAgICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQodG9wVGV4dCk7XG4gICAgfVxufVxuXG5jb25zdCByZXBvcnRFcnJvciA9IChwcm9wQ29uZmlnOiBJUHJvcENvbmZpZywgcHJvcE5hbWU6IHN0cmluZywgY29tcG9uZW50OiBJTXlvcENvbXBvbmVudDxhbnksIGFueT4pID0+IHtcbiAgICBpZiAoIXByb3BDb25maWcpIHtcblxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgLy8gdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEVycm9yOiBVbmRlZmluZWQgUHJvcFxcblxcbmAgK1xuICAgICAgICAgICAgYEl0IGxvb2tzIGxpa2UgeW91J3ZlIHRyaWVkIHRvIHVzZSBhIHByb3AgdGhhdCBoYXNuJ3QgYmVlbiBkZWZpbmVkLlxcbmAgK1xuICAgICAgICAgICAgYFBsZWFzZSBjaGVjayB0aGUgcHJvcCBuYW1lIGZvciBhbnkgdHlwb3Mgb3IgZW5zdXJlIHRoYXQgaXQgaXMgcHJvcGVybHkgZGVmaW5lZCBpbiB0aGUgY29tcG9uZW50J3MgcHJvcCBsaXN0LlxcblxcbmAgK1xuICAgICAgICAgICAgYFByb3AgTmFtZTogJHtwcm9wTmFtZX1cXG5gICtcbiAgICAgICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICAgICAgYEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlciB0byB0aGUgY29tcG9uZW50IHBhZ2UgaHR0cHM6Ly9kYXNoYm9hcmQubXlvcC5kZXYvZGFzaGJvYXJkL2NvbXBvbmVudC8ke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfSBvciBjb25zdWx0IHRoZSBkZXZlbG9wZXIgZ3VpZGUuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2Vcbn1cblxuY29uc3QgcmVwb3J0VW5zdXBwb3J0ZWQgPSAocHJvcENvbmZpZzogSVByb3BDb25maWcsIHByb3BOYW1lOiBzdHJpbmcsIGNvbXBvbmVudDogSU15b3BDb21wb25lbnQ8YW55LCBhbnk+KSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYEVycm9yOiBDb2RlIFByb3AgTm90IFN1cHBvcnRlZFxcblxcbmAgK1xuICAgICAgICBgQ3VycmVudGx5LCBjb2RlIHByb3BzIGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBsb2NhbCBmcmFtZSBjb21wb25lbnRzLlxcbmAgK1xuICAgICAgICBgXHUyNkEwXHVGRTBGIFRoaXMgaXMgYSB3b3JrIGluIHByb2dyZXNzIGZlYXR1cmUgXHUyMDE0IGNvZGUgcHJvcHMgd2lsbCBiZSBzdXBwb3J0ZWQgaW4gdXBjb21pbmcgdmVyc2lvbnMuXFxuXFxuYCArXG4gICAgICAgIGBJbiB0aGUgbWVhbnRpbWUsIHlvdSBjYW4gdXNlIG1lc3NhZ2UgcHJvcHMuXFxuXFxuYCArXG4gICAgICAgIGBQcm9wIE5hbWU6ICR7cHJvcE5hbWV9XFxuYCArXG4gICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICBgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSBjb21wb25lbnQgcGFnZSBodHRwczovL2Rhc2hib2FyZC5teW9wLmRldi9kYXNoYm9hcmQvY29tcG9uZW50LyR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9IG9yIGNvbnN1bHQgdGhlIGRldmVsb3BlciBndWlkZS5gXG4gICAgKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbm5lY3RQcm9wcyA9IDxUIGV4dGVuZHMgY29tcG9uZW50RGVmaW5pdGlvblByb3BzPihjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBwcm9wc0NvbmZpZzogSVByb3BDb25maWdbXSwgc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZykgPT4ge1xuXG4gICAgY29uc3QgcHJvcHNNYXAgPSBwcm9wc0NvbmZpZy5yZWR1Y2UoKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucHJldmlvdXNWYWx1ZSxcbiAgICAgICAgICAgIFtjdXJyZW50VmFsdWUubmFtZV06IHsuLi5jdXJyZW50VmFsdWV9XG4gICAgICAgIH1cbiAgICB9LCB7fSk7XG5cbiAgICBjb25zdCBwcm9wc0hhbmRsZXIgPSB7XG4gICAgICAgIGdldDogKF86IElNeW9wQ29tcG9uZW50LCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IHByb3BDb25maWcgPSBwcm9wc01hcFtwcm9wXTtcblxuICAgICAgICAgICAgaWYgKHJlcG9ydEVycm9yKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGUgPT09IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgZXh0cmFjdGVkIHdlYiBjb21wb25lbnRzIEZJUlNUXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIE15b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHR5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3A7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9pbml0X2ludGVyZmFjZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiBhIGZ1bmN0aW9uIHRoYXQgZ2V0cy9zZXRzIGRhdGEgKG1hdGNoZXMgaWZyYW1lIGJlaGF2aW9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkYXRhPzogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbml0V2l0aERhdGEoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIG15b3BfY3RhX2hhbmRsZXIsIHJldHVybiB1bmRlZmluZWQgKGl0J3Mgd3JpdGUtb25seSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBJc29sYXRlZCBpZnJhbWU6IG5vIHNhbWUtb3JpZ2luIGFjY2VzcyBcdTIwMTQgdXNlIHRoZSBwb3N0TWVzc2FnZSBicmlkZ2VcbiAgICAgICAgICAgICAgICAvLyAoc2FtZSBtZXRob2Qgc3VyZmFjZSBhcyB0aGUgZXh0cmFjdGVkLVdDIGJyYW5jaCBhYm92ZSkuXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIE15b3BJZnJhbWVDb21wb25lbnQgJiYgY29tcG9uZW50Lmlzb2xhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSB0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2luaXRfaW50ZXJmYWNlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkYXRhPzogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHJldHVybiBjb21wb25lbnQuZ2V0RGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbml0V2l0aERhdGEoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIG15b3BfY3RhX2hhbmRsZXIgaXMgd3JpdGUtb25seVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEZvciBpZnJhbWUgKGxvY2FsRnJhbWUpIGNvbXBvbmVudHNcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRTa2luLmxvYWRlci50eXBlID09PSBTa2luTG9hZGVycy5IVE1MTG9hZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTG9hZGVyID0gc2VsZWN0ZWRTa2luLmxvYWRlciBhcyBJSFRNTExvYWRlckNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVkTG9hZGVyLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5lbGVtZW50LmNvbnRlbnRXaW5kb3dbdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcF1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlcG9ydFVuc3VwcG9ydGVkKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJvcENvbmZpZy5tb2RlID09PSAnb3V0cHV0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlUGFyYW1zOiBhbnlbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiB0dXJuIGl0IGludG8gY29uZmlnXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKFJlZi5jcmVhdGUocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCguLi5wcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VDdG9yID0gbWVzc2FnZXNbcHJvcENvbmZpZy5iZWhhdmlvci5tZXNzYWdlXTtcblxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgbWVzc2FnZUN0b3IoLi4ubWVzc2FnZVBhcmFtcykpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9LFxuICAgICAgICBzZXQ6IChfOiBJTXlvcENvbXBvbmVudCwgcHJvcDogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBwcm9wQ29uZmlnID0gcHJvcHNNYXBbcHJvcF07XG5cbiAgICAgICAgICAgIGlmIChyZXBvcnRFcnJvcihwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci50eXBlID09PSBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5jb2RlKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGV4dHJhY3RlZCB3ZWIgY29tcG9uZW50cyBGSVJTVCAoYmVmb3JlIGxvY2FsRnJhbWUgY2hlY2spXG4gICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBleHRyYWN0ZWQgd2ViIGNvbXBvbmVudHMgbWF5IGhhdmUgc2hhZG93Um9vdE1vZGU6IGxvY2FsRnJhbWUgaW4gdGhlaXIgY29uZmlnXG4gICAgICAgICAgICAgICAgLy8gYnV0IHRoZXkgcnVuIGRpcmVjdGx5IG9uIHRoZSBob3N0IGRvY3VtZW50LCBub3QgaW4gYW4gaWZyYW1lXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIE15b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHR5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3A7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9jdGFfaGFuZGxlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZXRDdGFIYW5kbGVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9pbml0X2ludGVyZmFjZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbml0V2l0aERhdGEodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBJc29sYXRlZCBpZnJhbWU6IHJvdXRlIHZpYSB0aGUgcG9zdE1lc3NhZ2UgYnJpZGdlIChubyBzYW1lLW9yaWdpbiBhY2Nlc3MpLlxuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBNeW9wSWZyYW1lQ29tcG9uZW50ICYmIGNvbXBvbmVudC5pc29sYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BOYW1lID0gdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9jdGFfaGFuZGxlcicpIHsgY29tcG9uZW50LnNldEN0YUhhbmRsZXIodmFsdWUpOyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2luaXRfaW50ZXJmYWNlJykgeyBjb21wb25lbnQuaW5pdFdpdGhEYXRhKHZhbHVlKTsgcmV0dXJuIHRydWU7IH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBGb3IgaWZyYW1lIChsb2NhbEZyYW1lKSBjb21wb25lbnRzXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkU2tpbi5sb2FkZXIudHlwZSA9PT0gU2tpbkxvYWRlcnMuSFRNTExvYWRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZExvYWRlciA9IHNlbGVjdGVkU2tpbi5sb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWc7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZExvYWRlci5zaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLmxvY2FsRnJhbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRXaW5kb3cgPSAoY29tcG9uZW50LmVsZW1lbnQgYXMgSFRNTElGcmFtZUVsZW1lbnQpLmNvbnRlbnRXaW5kb3cgYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSB0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHJlYWwgaGFuZGxlclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFdpbmRvd1twcm9wTmFtZV0gPSB2YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmx1c2ggQ1RBIHF1ZXVlIGlmIHRoaXMgaXMgbXlvcF9jdGFfaGFuZGxlciBhbmQgcXVldWUgZXhpc3RzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2N0YV9oYW5kbGVyJyAmJiBjb250ZW50V2luZG93Ll9fbXlvcF9jdGFfcXVldWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWV1ZSA9IGNvbnRlbnRXaW5kb3cuX19teW9wX2N0YV9xdWV1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50V2luZG93Ll9fbXlvcF9jdGFfcXVldWUgPSBudWxsOyAvLyBDbGVhciB0byBwcmV2ZW50IGRvdWJsZS1mbHVzaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLmZvckVhY2goKGl0ZW06IHthY3Rpb246IHN0cmluZywgcGF5bG9hZDogYW55fSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGlmIGNvbXBvbmVudCB3YXMgZGlzcG9zZWQgZHVyaW5nIGZsdXNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQubWFya2VkRm9yRGlzcG9zZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUoaXRlbS5hY3Rpb24sIGl0ZW0ucGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXBvcnRVbnN1cHBvcnRlZChwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9pZihwcm9wQ29uZmlnLmJlaGF2aW9yID09PSBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5tZXNzYWdlKVxuICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLm1vZGUgPT09ICdpbnB1dCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogc3VwcG9ydCBtdWx0aSBiZWhhdmlvcnNcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci50eXBlID09PSAnbWVzc2FnZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VQYXJhbXM6IGFueVtdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiB0dXJuIGl0IGludG8gY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goUmVmLmNyZWF0ZShwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCguLi5wcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VDdG9yID0gbWVzc2FnZXNbcHJvcENvbmZpZy5iZWhhdmlvci5tZXNzYWdlXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBtZXNzYWdlQ3RvciguLi5tZXNzYWdlUGFyYW1zKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvcjogVW5zdXBwb3J0ZWQgQmVoYXZpb3JcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGhlICdiZWhhdmlvcicgZmllbGQgcHJvdmlkZWQgaXMgbm90IHN1cHBvcnRlZC5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQ29tcG9uZW50OiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLm5hbWV9LCBJRDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH1cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgUHJvcCBOYW1lOiAke3Byb3B9XFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEJlaGF2aW9yIEZpZWxkOiAke3Byb3BDb25maWcuYmVoYXZpb3IudHlwZX1cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQ2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIHZhbGlkIGJlaGF2aW9yIG9wdGlvbnMuYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBvbmVudC5wcm9wcyA9IHt9O1xuICAgIGNvbXBvbmVudC5wcm9wcyA9IG5ldyBQcm94eShjb21wb25lbnQucHJvcHMsIHByb3BzSGFuZGxlcik7XG5cbiAgICByZXR1cm4gY29tcG9uZW50IGFzIChPbWl0PElNeW9wQ29tcG9uZW50LCAncHJvcHMnPiAmIHtcbiAgICAgICAgcHJvcHM6IHByb3BUeXBlczxUPlxuICAgIH0pXG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVSZWZQcm94eSA9ICh0YXJnZXQ6IFJlZiwgY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCkgPT4ge1xuICAgIHJldHVybiBuZXcgUHJveHkodGFyZ2V0LCB7XG4gICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHtcblxuICAgICAgICAgICAgLy8gaWYgKHByb3AgPT09ICdfX25vblByb3hpZWQnKSB7XG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaWYgKHRhcmdldFtwcm9wXSkge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0W3Byb3BdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBnZXR0ZXJGdW5jdGlvbiA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MuZm9yRWFjaChhcmcgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250YWluc1ByaW1pdGl2ZXNPbmx5KGFyZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcnMubm90U2VyaWFsaXphYmxlUmVmQ2FsbChwcm9wLCBhcmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IEN1c3RvbVJlZk1lc3NhZ2UoKHtyZWYsIHByb3BOYW1lLCBmdW5jdGlvbkFyZ3MsIG1ha2VTZXJpYWxpemFibGV9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmVmW3Byb3BOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VTZXJpYWxpemFibGUocmVmW3Byb3BOYW1lXSguLi5mdW5jdGlvbkFyZ3MpLCB0cnVlKSAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIGFuZCByZXR1cm4gaXRzIHJlc3VsdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VTZXJpYWxpemFibGUodmFsdWUsIHRydWUpOyAvLyBSZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHR1cm4gaXQgdG8gY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElkOiB0YXJnZXQucmVmQ29uZmlnLnNlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BOYW1lOiBwcm9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJnczogYXJnc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIChtc2cpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG1zZy5jb250ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy9UT0RPOiB3ZSBjYW4gaW1wbGVtZW50IHRoaW5ncyBsaWtlIGF1dG8gc2VyaWFsaXphdGlvbiBhbmQgYmluZGluZyBmdW5jdGlvbnMgaGVyZVxuICAgICAgICAgICAgLy9nZXR0ZXJGdW5jdGlvbi50ZXN0ID0gJzEyMyc7XG5cbiAgICAgICAgICAgIHJldHVybiBnZXR0ZXJGdW5jdGlvbjtcblxuICAgICAgICAgICAgLy9yZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHRhcmdldCwgcHJvcDogc3RyaW5nLCB2YWx1ZSkge1xuICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IEN1c3RvbVJlZk1lc3NhZ2UoKHtyZWYsIHByb3BOYW1lLCBwcm9wVmFsdWV9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWYpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZbcHJvcE5hbWVdID0gcHJvcFZhbHVlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBmaXggdGhhdFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50SWQ6IHRhcmdldC5yZWZDb25maWcuc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgIHByb3BWYWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lOiBwcm9wXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAobXNnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGxvZz9cbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlUmVmQ29tcG9uZW50ID0gYXN5bmMgPFQgZXh0ZW5kcyBJTXlvcENvbXBvbmVudCA9IElNeW9wQ29tcG9uZW50PihyZWY6IFJlZiwgY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBjb21wb25lbnRzOiBJTXlvcENvbXBvbmVudFtdLCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucyk6IFByb21pc2U8VD4gPT4ge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IHJlZi5jb21wb25lbnQ7XG4gICAgaWYgKCFjb21wb25lbnQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FudCBjcmVhdGVSZWZDb21wb25lbnQgd2l0aCBkZXRhY2hlZCByZWYnKTtcblxuICAgIC8vY29uc29sZS5sb2coJ2NyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQnLCByZWYsIGNvbXBvbmVudENvbmZpZyk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBuZXcgTXlvcFJlZkNvbXBvbmVudChjb21wb25lbnRDb25maWcudHlwZSwgY29tcG9uZW50LCBvcHRpb25zKTtcbiAgICAgICAgY29tcG9uZW50cy5wdXNoKHJlZkNvbXBvbmVudCk7XG5cbiAgICAgICAgLy8gQSBGQUlMRUQgUkVGIE1VU1QgTk9UIEtFRVAgSVRTIFBMQUNFSE9MREVSLlxuICAgICAgICAvL1xuICAgICAgICAvLyBUaGUgcGxhY2Vob2xkZXIgaXMgcmVnaXN0ZXJlZCBhYm92ZSwgYmVmb3JlIHdlIGtub3cgd2hldGhlciB0aGUgZnJhbWUgY2FuXG4gICAgICAgIC8vIGFjdHVhbGx5IGNyZWF0ZSB0aGUgY29tcG9uZW50LCBhbmQgYm90aCBmYWlsdXJlIHBhdGhzIGJlbG93IHVzZWQgdG8gcmVqZWN0XG4gICAgICAgIC8vIHdpdGhvdXQgcmVtb3ZpbmcgaXQuIFRoZSBjYWxsZXIgZ2V0cyBhIHJlamVjdGlvbiBhbmQgbm8gaGFuZGxlLCBzbyBub2JvZHkgZWxzZVxuICAgICAgICAvLyBjYW4gY2xlYW4gaXQgdXAgZWl0aGVyIC0tIGV4YWN0bHkgdGhlIHNoYXBlIG9mIHRoZSB0aW1lb3V0IGxlYWsgaW5cbiAgICAgICAgLy8gQmFzZU15b3BDb21wb25lbnQuIEl0IGlzIHBlcm1hbmVudCBhbmQgaXQgY29tcG91bmRzOiBldmVyeSByZXRyeSBvZiBhIHJlZiB0aGF0XG4gICAgICAgIC8vIGNhbm5vdCBiZSBjcmVhdGVkIChhIHNlbGVjdG9yIHRoYXQgbWF0Y2hlcyBub3RoaW5nLCBhIGZyYW1lIHRoYXQgbmV2ZXIgYW5zd2VycylcbiAgICAgICAgLy8gYWRkcyBhbm90aGVyIGRlYWQgZW50cnkgdG8gdGhlIGFycmF5IHRoYXQgaXNUcnVzdGVkU291cmNlIHdhbGtzIG9uIGV2ZXJ5XG4gICAgICAgIC8vIG1lc3NhZ2UuIENhdWdodCBieSB0ZXN0L2NvbXBvc2l0ZS1yZWYuZTJlLm1qcyBjYXNlIFIzLlxuICAgICAgICBjb25zdCB1bnJlZ2lzdGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYXQgPSBjb21wb25lbnRzLmluZGV4T2YocmVmQ29tcG9uZW50KTtcbiAgICAgICAgICAgIGlmIChhdCAhPT0gLTEpIGNvbXBvbmVudHMuc3BsaWNlKGF0LCAxKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvL2ZvciBjYXNlcyB3aGVyZSByZWYgY29tcG9uZW50cyBkZWZpbmUgaW4gdGhlIGNvbXBvbmVudCBjb25maWdcbiAgICAgICAgLy8gd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgcm9vdCBjb21wb25lbnQgdGhlIGJlIGluaXRpYXRlZCBiZWZvcmUgaW50ZXJhY3Rpbmcgd2l0aCBpdFxuICAgICAgICBhd2FpdCBjb21wb25lbnQuaW5pdGlhdGVkKCk7XG5cblxuICAgICAgICAvL1RPRE8gOlxuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAvL3JlamVjdCgndGltZW91dD8nKTtcbiAgICAgICAgICAgIHVucmVnaXN0ZXIoKTtcbiAgICAgICAgICAgIHJlamVjdCgndGltZW91dCcpO1xuICAgICAgICB9LCA1MDAwKTtcblxuICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZShyZWYucmVmQ29uZmlnLFxuICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMgPyBvcHRpb25zIDoge30sXG4gICAgICAgICAgICAgICAgaWQ6IHJlZkNvbXBvbmVudC5pZCxcbiAgICAgICAgICAgICAgICBfaGFzUGFyZW50OiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXN5bmMgKG1lc3NhZ2UpID0+IHtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNoZWNrIGlmIHRpbWVvdXQgYWxyZWFkeSBwYXNzZWRcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5mYWlsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDpcbiAgICAgICAgICAgICAgICAgICAgdW5yZWdpc3RlcigpO1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgZmFpbGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCA9IGNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT0gcmVmQ29tcG9uZW50LmlkKTtcblxuICAgICAgICAgICAgICAgIC8vc2FtZSBtZW1vcnkgZW52LCBzYW1lIEhvc3RTREtcbiAgICAgICAgICAgICAgICBpZiAoaW1wbGVtZW50YXRpb25Db21wb25lbnQgJiYgaW1wbGVtZW50YXRpb25Db21wb25lbnQgIT09IHJlZkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUSEUgUExBQ0VIT0xERVIgSVMgUkVEVU5EQU5UIEhFUkUsIFNPIERST1AgSVQuXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgYnJhbmNoIG1lYW5zIHRoZSBmcmFtZSBtb3VudGVkIGludG8gT1VSIHJlZ2lzdHJ5IHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgICAgICAgIC8vIGl0cyBvd24gLS0gdGhlIHNhbWUtd2luZG93IGNhc2UgdGhlIHdlYmNvbXBvbmVudCBoYW5kbGVyIGNhbGxzXG4gICAgICAgICAgICAgICAgICAgIC8vIFwic2FtZSBtZW1vcnkgd2hlbiB1c2luZyB3ZWJjb21wb25lbnRcIi4gQm90aCB0aGUgcGxhY2Vob2xkZXIgYW5kIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyByZWFsIGNvbXBvbmVudCB3ZXJlIHRoZW4gcmVnaXN0ZXJlZCB1bmRlciB0aGUgU0FNRSBpZCwgYW5kIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBwbGFjZWhvbGRlciB3YXMgbGVmdCBiZWhpbmQgKHRoZSBgVE9ETyA6IGNsZWFuIHJlZkNvbXBvbmVudCA/YCB0aGF0XG4gICAgICAgICAgICAgICAgICAgIC8vIHVzZWQgdG8gc2l0IGhlcmUpLiBUd28gZW50cmllcywgb25lIGlkLCBvbmUgb2YgdGhlbSBkZWFkLlxuICAgICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSA9IGltcGxlbWVudGF0aW9uQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGltcGxlbWVudGF0aW9uQ29tcG9uZW50IGFzIHVua25vd24gYXMgVCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBgZmluZGAgQ0FOIENPTUUgQkFDSyBFTVBUWSwgQU5EIHVuZGVmaW5lZCAhPT0gcmVmQ29tcG9uZW50IElTIFRSVUUuXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhlIGd1YXJkIGFib3ZlLCB0aGF0IHJlc29sdmVkIHRoZSBjYWxsZXIncyBwcm9taXNlIHdpdGhcbiAgICAgICAgICAgICAgICAgICAgLy8gYHVuZGVmaW5lZGA6IG5vIGVycm9yLCBubyBjb21wb25lbnQsIGFuZCB0aGUgcGxhY2Vob2xkZXIgbGVmdCBpblxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVnaXN0cnkuIFJlcHJvZHVjZWQgYnkgY3JlYXRpbmcgYSByZWYgZnJvbSBhIHdlYiBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50IChjb21wb3NpdGUtcmVmIGNhc2UgUjUpLCB3aGVyZSB0aGUgcmVhbCBjb21wb25lbnQgaXMgcHVzaGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIGludG8gYSByZWdpc3RyeSB0aGUgY2FwdHVyZWQgYXJyYXkgbm8gbG9uZ2VyIHJlZmxlY3RzLiBGYWxsaW5nXG4gICAgICAgICAgICAgICAgICAgIC8vIHRocm91Z2ggdG8gdGhlIHBsYWNlaG9sZGVyIGdpdmVzIHRoZSBjYWxsZXIgYSB1c2FibGUgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2Ygc2lsZW5jZS5cbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50LnNldEluaXRpYXRlZCgpXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSByZWZDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogaGVyZSA+XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogd2hhdCBhYm91dCByZWFwdGVycyA/ISBkeW5hbWljID8hXG4gICAgICAgICAgICAgICAgLy8gY29uc3QgZXhzaXN0aW5nUmVmQ29tcG9uZW50ID0gY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSBhcyBNeW9wUmVmQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIC8vIGlmIChleHNpc3RpbmdSZWZDb21wb25lbnQuaWQgJiYgZXhzaXN0aW5nUmVmQ29tcG9uZW50LnBhcmVudCkge1xuICAgICAgICAgICAgICAgIC8vICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gW2NvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0sIHJlZkNvbXBvbmVudF07XG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0pKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0ucHVzaChyZWZDb21wb25lbnQpXG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSByZWZDb21wb25lbnQ7IC8vaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSByZWZDb21wb25lbnQuaWQpITtcbiAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBpbiB3ZWJjb21wb25lbnQgY2FzZSB0aGUgc2FtZSBpZCB3aWxsIGFscmVkYXkgYmUgaGVyZSwgd2hpY2ggaXMgZ29vZCAhXG4gICAgICAgICAgICAgICAgLy8gbmFtZTpcbiAgICAgICAgICAgICAgICAvLyAgICAgaWRcbiAgICAgICAgICAgICAgICAvLyAgICAgY29tcG9uZW50RGVmaW5pdGlvbklkXG5cbiAgICAgICAgICAgICAgICAvLyBmb3IgaW5uZXIgY29tcG9uZW50cyBpbnNpZGUgcmVmIGNvbXBvbmVudCA6XG4gICAgICAgICAgICAgICAgbWVzc2FnZS5uZXN0ZWRSZWZzLmZvckVhY2gobmVzdGVkUmVmQ29uZmlnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50RGVmaW5pdGlvbiA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZE5lc3RlZENvbXBvbmVudHMhLmZpbmQoYyA9PiBjLnR5cGUuaWQgPT09IG5lc3RlZFJlZkNvbmZpZy5jb21wb25lbnREZWZpbml0aW9uSWQpIS50eXBlO1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnN0IG5lc3RlZENvbXBvbmVudERlZmluaXRpb24gPSBjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zPy5maW5kKGRlZiA9PiBkZWYuaWQgPT09IG5lc3RlZFJlZkNvbmZpZy5jb21wb25lbnREZWZpbml0aW9uSWQpITtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc3QgcmVmQ29uZmlnID0gY29tcG9uZW50Q29uZmlnLnR5cGUucmVmcy5maW5kKHIgPT4gci5uYW1lID09PSBuZXN0ZWRSZWZDb25maWcucmVmTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmICghcmVmQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIHJlZkNvbmZpZyBmb3VuZCBmb3IgbmVzdGVkIHJlZicpO1xuICAgICAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnQgPSBuZXcgTXlvcFJlZkNvbXBvbmVudChuZXN0ZWRDb21wb25lbnREZWZpbml0aW9uLCByZWZDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgICAgICBuZXN0ZWRDb21wb25lbnQuc2V0SW5pdGlhdGVkKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5yZWZzW25lc3RlZFJlZkNvbmZpZy5yZWZOYW1lXSA9IG5lc3RlZENvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5wdXNoKG5lc3RlZENvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3RSZWZzKHJlZkNvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnLCBjb21wb25lbnRzLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOnVzZSBjb25maWcgY2hlY2sgZm9yIGF1dG8taGlnaHQgYW5kIGNvbnZlcnQgdHlwZSBwcm9wZXJseVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZWZDb21wb25lbnQgYXMgdW5rbm93biBhcyBUKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vZGVidWdnZXJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdyBlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgIH0pXG59XG5cbmV4cG9ydCBjb25zdCBjb25uZWN0UmVmcyA9IGFzeW5jIChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGNvbXBvbmVudHM6IElNeW9wQ29tcG9uZW50W10sIHdpdGhvdXRSZWZDb21wb25lbnRzOiBib29sZWFuID0gZmFsc2UpID0+IHtcblxuICAgIGlmICghY29tcG9uZW50LnJlZnMpXG4gICAgICAgIGNvbXBvbmVudC5yZWZzID0ge307XG5cbiAgICBjb25zdCB3YWl0Rm9yID0gT2JqZWN0LnZhbHVlcyhjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZWZzKS5tYXAocmVmID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGlmIChyZWYuYmVoYXZpb3IudHlwZSA9PSBSZWZCZWhhdmlvclR5cGUuY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gY29tcG9uZW50LnJlZnNbcmVmLm5hbWVdID1cblxuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0UmVmQ29tcG9uZW50cykge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY2hhbmdlIHRvIGdldCBpdCBmcm9tIHRoZSBmbG93XG4gICAgICAgICAgICAgICAgbGV0IHJlZkNvbXBvbmVudElkID0gKHJlZi5iZWhhdmlvciBhcyBJQ29tcG9uZW50UmVmQmVoYXZpb3IpLmNvbXBvbmVudElkO1xuICAgICAgICAgICAgICAgIGlmICghcmVmQ29tcG9uZW50SWQpXG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudElkID0gKHJlZi5iZWhhdmlvciBhcyBJQ29tcG9uZW50UmVmQmVoYXZpb3IpLmluc3RhbmNlLmNvbXBvbmVudElkXG5cbiAgICAgICAgICAgICAgICAvLyBpZiAoIWNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmVqZWN0KG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgcmVzb2x2ZWREZWZpbml0aW9ucyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgLy90aHJvdyBuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IHJlc29sdmVkRGVmaW5pdGlvbnMgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgLy8gY29uc3QgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnMhLmZpbmQoY29tcGRlZiA9PiBjb21wZGVmLmlkID09PSByZWZDb21wb25lbnRJZCkhO1xuICAgICAgICAgICAgICAgIC8vIC8vY29uc3QgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGF3YWl0IGdldENvbXBvbmVudERlZmluaXRpb25Db25maWcoY29tcG9uZW50SW5zdGFuY2VDb25maWcuY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gaWYgKCFjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJlamVjdChuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IHJlc29sdmVkRGVmaW5pdGlvbnMgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKSk7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE86IGlmIHdlIGhhdmUgdGhlIHNhbWUgY29tcG9uZW50IG1vcmUgdGhhbiBvbmNlIHdlIHdpbGwgbmVlZCBpbnN0YW5jZSBpZCBoZXJlIC4uLlxuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudENvbmZpZyA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZE5lc3RlZENvbXBvbmVudHM/LmZpbmQobmVzdGVkQ29tcG9uZW50ID0+IG5lc3RlZENvbXBvbmVudC50eXBlLmlkID09PSByZWZDb21wb25lbnRJZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIW5lc3RlZENvbXBvbmVudENvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IG5lc3RlZENvbXBvbmVudENvbmZpZyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9jb25zdCBjb21wb25lbnRJbnN0YW5jZUNvbmZpZyA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5uZXN0ZWRDb21wb25lbnRzPy5maW5kKGNvbXBvbmVudEluc3RhY2UgPT4gY29tcG9uZW50SW5zdGFjZS5jb21wb25lbnRJZCA9PT0gY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5pZCk7XG4gICAgICAgICAgICAgICAgLy8gaWYoIWNvbXBvbmVudERlZmluaXRpb25Db25maWcpe1xuICAgICAgICAgICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RPRE8gVE9ETyBUT0RPICcpO1xuICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDp0aGluayBhYm91dCB0aGF0IDpcbiAgICAgICAgICAgICAgICAvLyAgIGNvbXBvbmVudERlZmluaXRpb25Db25maWcucmVzb2x2ZWREZWZpbml0aW9ucyA9IGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnM7XG4gICAgICAgICAgICAgICAgLy8gICBjb25zdCBuZXN0ZWRDb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgaW5zdGFuY2U6IG5lc3RlZENvbXBvbmVudENvbmZpZy5pbnN0YW5jZSEsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgdHlwZTogbmVzdGVkQ29tcG9uZW50Q29uZmlnLnR5cGUsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgbmFtZTogbmVzdGVkQ29tcG9uZW50Q29uZmlnLm5hbWVcbiAgICAgICAgICAgICAgICAvLyAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IF9yZWYgPSBSZWYuY3JlYXRlKCcnLCByZWYsIGNvbXBvbmVudCk7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCduZXN0ZWQgISEgY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCcpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnQgPSBhd2FpdCBjcmVhdGVSZWZDb21wb25lbnQoX3JlZiwgbmVzdGVkQ29tcG9uZW50Q29uZmlnISwgY29tcG9uZW50cylcbiAgICAgICAgICAgICAgICAgICAgLy9URE9PIDogcHV0IHRoYXQgcmVmIGNvbXBvbmVudCBzb21ld2hlcmU/XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5uYW1lXSA9IG5lc3RlZENvbXBvbmVudDtcblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBfX25vblByb3hpZWQgPSBSZWYuY3JlYXRlKCcnLCByZWYsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5uYW1lXSA9IGNyZWF0ZVJlZlByb3h5KF9fbm9uUHJveGllZCwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9hbGVydCgnPycpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH0pXG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwod2FpdEZvcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvL2RlYnVnZ2VyXG4gICAgICAgIHRocm93IGU7XG4gICAgfVxuXG59XG5cbmV4cG9ydCB0eXBlIHByb3BUeXBlczxUIGV4dGVuZHMgY29tcG9uZW50RGVmaW5pdGlvblByb3BzPiA9IHtcbiAgICBbUHJvcGVydHkgaW4ga2V5b2YgVF06XG4gICAgVFtQcm9wZXJ0eV0gZXh0ZW5kcyB7IG1vZGU6ICdpbnB1dCcgfSA/XG4gICAgICAgIFRbUHJvcGVydHldWyd0eXBlJ10gOlxuICAgICAgICBQcm9taXNlPFRbUHJvcGVydHldWyd0eXBlJ10+XG59XG5cbmV4cG9ydCBjb25zdCBleGVjID0gYXN5bmMgKGdldHRlcjogYW55KSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGdldHRlcigpXG59XG5cbmV4cG9ydCBjb25zdCBhY3RBcyA9IDxUPihyZWY6IFJlZikgPT4ge1xuICAgIHJldHVybiByZWYgYXMgdW5rbm93biBhcyBGdW5jdGlvbmlmeVJlZjxUPlxufVxuXG5leHBvcnQgdHlwZSBGdW5jdGlvbmlmeVJlZjxUID0gYW55PiA9IHtcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBpbmZlciBBKSA9PiBpbmZlciBSIC8vIElmIGl0J3MgYSBmdW5jdGlvblxuICAgICAgICA/ICguLi5hcmdzOiBBKSA9PiBQcm9taXNlPFI+IC8vIENvbnZlcnQgaXQgdG8gYSBwcm9taXNlZCBmdW5jdGlvblxuICAgICAgICA6IFRbS11cbn07XG4iLCAiaW1wb3J0IHtBdXRvU2l6ZU9wdGlvbnMsIEJhc2VNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCxcbiAgICBFeGVjdXRlU2NyaXB0TWVzc2FnZSwgTWVzc2FnZURpcmVjdGlvbiwgU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlXG59IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge3NldERlYnVnU3R5bGV9IGZyb20gXCIuLi9jb21wb25lbnRDb3JlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXMudHNcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcblxuZXhwb3J0IGNsYXNzIE15b3BJZnJhbWVDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG5cbiAgICBwcml2YXRlIF9hdXRvU2l6ZUNsZWFudXA/OiBDbGVhbnVwSGFuZGxlcjtcbiAgICBwcml2YXRlIF9hdXRvU2l6ZU9wdGlvbnM/OiBBdXRvU2l6ZU9wdGlvbnM7XG4gICAgcHJpdmF0ZSBfYXV0b1NpemVVcGRhdGU/OiAoKSA9PiB2b2lkO1xuXG4gICAgLy8gXHUyNTAwXHUyNTAwIElzb2xhdGlvbiAoc2FuZGJveGVkIGNyb3NzLW9yaWdpbiBmcmFtZSkgXHUyMDE0IHBvc3RNZXNzYWdlIGJyaWRnZSwgaG9zdCBzaWRlIFx1MjUwMFx1MjUwMFxuICAgIHB1YmxpYyBpc29sYXRlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2xhc3REYXRhPzogdW5rbm93bjsgICAgICAgICAgICAgICAvLyBjYWNoZWQgbGFzdC1zZW50IGRhdGEgKHN5bmMgZ2V0RGF0YSlcbiAgICBwcml2YXRlIF9jdGFIYW5kbGVyPzogKGFjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKSA9PiB2b2lkO1xuICAgIHByaXZhdGUgX2N0YVF1ZXVlOiBBcnJheTx7IGFjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duIH0+ID0gW107XG4gICAgcHJpdmF0ZSBfaXNvTXNnSGFuZGxlcj86IChlOiBNZXNzYWdlRXZlbnQpID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSBfaXNvU2l6ZU9wdHM/OiBBdXRvU2l6ZU9wdGlvbnM7XG4gICAgcHJpdmF0ZSBfaXNvQXV0b1NpemUgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnJpZGdlIHNpemluZyBvbmx5IHdoZW4gYXV0by1zaXplIGlzIG9uXG4gICAgcHJpdmF0ZSBfaXNvTGFzdFNpemU/OiB7IGhlaWdodDogbnVtYmVyLCB3aWR0aD86IG51bWJlciB9OyAgLy8gbGFzdCByZXBvcnRlZCBzaXplIChmb3IgdGhlIGVuYWJsZSByYWNlKVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHJpdmF0ZSBJZnJhbWVFbGVtZW50OiBIVE1MSUZyYW1lRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoY29tcG9uZW50Q29uZmlnLCBjb250YWluZXIsIG9wdGlvbnMpXG5cbiAgICAgICAgdGhpcy5lbGVtZW50ID0gdGhpcy5JZnJhbWVFbGVtZW50O1xuICAgICAgICB0aGlzLl9sYXN0RGF0YSA9IG9wdGlvbnM/LmRhdGE7XG4gICAgICAgIC8vIHRoaXMuSWZyYW1lRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0KVxuICAgICAgICAvLyAgICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QoYElmcmFtZUVsZW1lbnQgZXJyb3JgKTtcbiAgICAgICAgLy8gfSk7XG4gICAgfVxuXG4gICAgc2l6ZU1ldGE/OiB7IHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyOyBoZWlnaHQ/OiBzdHJpbmcgfCBudW1iZXI7IG1pbldpZHRoPzogbnVtYmVyOyBtYXhXaWR0aD86IG51bWJlcjsgbWluSGVpZ2h0PzogbnVtYmVyOyBtYXhIZWlnaHQ/OiBudW1iZXIgfSB8IG51bGw7XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgSXNvbGF0aW9uIGJyaWRnZSAoaG9zdCBzaWRlKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAvKiogQXR0YWNoIHRoZSBob3N0LXNpZGUgcG9zdE1lc3NhZ2UgbGlzdGVuZXIgZm9yIGEgc2FuZGJveGVkIGZyYW1lLiAqL1xuICAgIGVuYWJsZUlzb2xhdGlvbigpIHtcbiAgICAgICAgdGhpcy5pc29sYXRlZCA9IHRydWU7XG4gICAgICAgIC8vIElzb2xhdGVkIGZyYW1lcyBkb24ndCBydW4gdGhlIElmcmFtZVNESyBoYW5kc2hha2UgKG5vIHNhbWUtb3JpZ2luIGluaXQpLFxuICAgICAgICAvLyBzbyBtYXJrIGluaXRpYXRlZCBpbW1lZGlhdGVseSBcdTIwMTQgbGlrZSB0aGUgZXh0cmFjdGVkIHdlYiBjb21wb25lbnQgZG9lcy5cbiAgICAgICAgdGhpcy5zZXRJbml0aWF0ZWQoKTtcbiAgICAgICAgdGhpcy5faXNvTXNnSGFuZGxlciA9IChlOiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChlLnNvdXJjZSAhPT0gdGhpcy5JZnJhbWVFbGVtZW50LmNvbnRlbnRXaW5kb3cpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGQ6IGFueSA9IGUuZGF0YTtcbiAgICAgICAgICAgIGlmICghZCB8fCBkLl9fbXlvcCAhPT0gdHJ1ZSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKGQudHlwZSA9PT0gJ215b3A6Y3RhJykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jdGFIYW5kbGVyICYmICF0aGlzLm1hcmtlZEZvckRpc3Bvc2VkKSB0aGlzLl9jdGFIYW5kbGVyKGQuYWN0aW9uLCBkLnBheWxvYWQpO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLl9jdGFIYW5kbGVyKSB0aGlzLl9jdGFRdWV1ZS5wdXNoKHsgYWN0aW9uOiBkLmFjdGlvbiwgcGF5bG9hZDogZC5wYXlsb2FkIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkLnR5cGUgPT09ICdteW9wOnNpemUnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYXBwbHlJc29TaXplKGQuaGVpZ2h0LCBkLndpZHRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9pc29Nc2dIYW5kbGVyKTtcbiAgICB9XG5cbiAgICAvKiogRGF0YS1pbiBcdTIwMTQgdW5pZmllZCB3aXRoIHRoZSBleHRyYWN0ZWQtV0MgQVBJLiBQb3N0cyBpbml0IG92ZXIgdGhlIGJyaWRnZS4gKi9cbiAgICBpbml0V2l0aERhdGEoZGF0YTogdW5rbm93bik6IHZvaWQge1xuICAgICAgICB0aGlzLl9sYXN0RGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudD8uY29udGVudFdpbmRvdz8ucG9zdE1lc3NhZ2UoeyBfX215b3A6IHRydWUsIHR5cGU6ICdteW9wOmluaXQnLCBkYXRhIH0sICcqJyk7XG4gICAgfVxuXG4gICAgLyoqIERhdGEtaW4gZ2V0dGVyIFx1MjAxNCByZXR1cm5zIHRoZSBsYXN0IGRhdGEgdGhlIGhvc3Qgc2VudCAoY2FjaGVkLCBzeW5jaHJvbm91cykuICovXG4gICAgZ2V0RGF0YSgpOiB1bmtub3duIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3REYXRhO1xuICAgIH1cblxuICAgIC8qKiBEYXRhLW91dCBcdTIwMTQgdW5pZmllZCB3aXRoIHRoZSBleHRyYWN0ZWQtV0MgQVBJLiBGbHVzaGVzIENUQXMgcXVldWVkIHByZS1oYW5kbGVyLiAqL1xuICAgIHNldEN0YUhhbmRsZXIoaGFuZGxlcjogKGFjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2N0YUhhbmRsZXIgPSBoYW5kbGVyO1xuICAgICAgICBpZiAodGhpcy5fY3RhUXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgcXVldWUgPSBbLi4udGhpcy5fY3RhUXVldWVdO1xuICAgICAgICAgICAgdGhpcy5fY3RhUXVldWUgPSBbXTtcbiAgICAgICAgICAgIHF1ZXVlLmZvckVhY2goaXRlbSA9PiB7IGlmICghdGhpcy5tYXJrZWRGb3JEaXNwb3NlZCkgaGFuZGxlcihpdGVtLmFjdGlvbiwgaXRlbS5wYXlsb2FkKTsgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9hcHBseUlzb1NpemUoaGVpZ2h0OiBudW1iZXIsIHdpZHRoPzogbnVtYmVyKSB7XG4gICAgICAgIGlmICghaGVpZ2h0IHx8IE51bWJlci5pc05hTihoZWlnaHQpKSByZXR1cm47XG4gICAgICAgIC8vIEFsd2F5cyByZW1lbWJlciB0aGUgbGF0ZXN0IHJlcG9ydGVkIHNpemUgc28gaXQgY2FuIGJlIGFwcGxpZWQgaWYvd2hlblxuICAgICAgICAvLyBhdXRvLXNpemluZyBpcyBlbmFibGVkIGFmdGVyIHRoZSBmaXJzdCBtZXNzYWdlIGFycml2ZXMuXG4gICAgICAgIHRoaXMuX2lzb0xhc3RTaXplID0geyBoZWlnaHQsIHdpZHRoIH07XG4gICAgICAgIC8vIFJlc3BlY3QgYXV0b1NpemU6ZmFsc2UgXHUyMDE0IHRoZSBob3N0IG93bnMgZGltZW5zaW9ucywgc28gZG9uJ3QgdG91Y2ggdGhlbS5cbiAgICAgICAgaWYgKCF0aGlzLl9pc29BdXRvU2l6ZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5faXNvU2l6ZU9wdHM7XG4gICAgICAgIGNvbnN0IHRvTnVtID0gKHY6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCA9PlxuICAgICAgICAgICAgdiA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogKHR5cGVvZiB2ID09PSAnbnVtYmVyJyA/IHYgOiAoaXNOYU4ocGFyc2VGbG9hdCh2KSkgPyB1bmRlZmluZWQgOiBwYXJzZUZsb2F0KHYpKSk7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRvTnVtKG9wdHM/Lm1pbkhlaWdodCksIG1heCA9IHRvTnVtKG9wdHM/Lm1heEhlaWdodCk7XG4gICAgICAgIGxldCBoID0gaGVpZ2h0O1xuICAgICAgICBpZiAobWluICE9PSB1bmRlZmluZWQgJiYgaCA8IG1pbikgaCA9IG1pbjtcbiAgICAgICAgaWYgKG1heCAhPT0gdW5kZWZpbmVkICYmIGggPiBtYXgpIGggPSBtYXg7XG4gICAgICAgIC8vIFRyYW5zaXRpb24gZnJvbSBhYnNvbHV0ZSBvdmVybGF5IHRvIGRvY3VtZW50IGZsb3cgYXQgdGhlIG1lYXN1cmVkIGhlaWdodC5cbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmluc2V0ID0gJ2F1dG8nO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gaCArICdweCc7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgICAgb3B0cz8ub25TaXplQ2hhbmdlPy4oeyB3aWR0aDogd2lkdGggPz8gdGhpcy5JZnJhbWVFbGVtZW50LmNsaWVudFdpZHRoLCBoZWlnaHQ6IGgsIGF1dG9TaXppbmdXaWR0aDogZmFsc2UsIGF1dG9TaXppbmdIZWlnaHQ6IHRydWUgfSBhcyBhbnkpO1xuICAgIH1cblxuICAgIGNsZWFudXBJbnNwZWN0PzogQ2xlYW51cEhhbmRsZXI7XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICAvLyBUT0RPIDogdXNlIGJldHRlciBjaGVjayBmb3IgaW5zcGVjdCBtb2RlXG4gICAgICAgIGlmICh0aGlzLmNsZWFudXBJbnNwZWN0KSB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdpbnNwZWN0IGNhbGwgbW9yZSB0aGFuIG9uY2UnKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsZWFudXBJbnNwZWN0XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHNldERlYnVnU3R5bGUodGhpcy5pZCwgJ015b3BJZnJhbWVDb21wb25lbnQnLCAxMCwgdGhpcy5jb250YWluZXIsIHRoaXMuSWZyYW1lRWxlbWVudCwgdGhpcy5jb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QhKCk7XG4gICAgICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICd1bnNldCdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYWxsJ1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7cmV0LmNvbnRlbnR9cHhgO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIG9ic2VydmVTaXplQmFzZWRPbkRvY3VtZW50RWxlbWVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7c2VuZH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBzZW5kKHtoZWlnaHQsIHdpZHRofSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcbiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7aGVpZ2h0LCB3aWR0aH1cbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7cmV0LmNvbnRlbnQud2lkdGh9cHhgO1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3JldC5jb250ZW50LmhlaWdodH1weGA7XG4gICAgICAgIH0pKTtcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT2JzZXJ2ZXMgdGhlIGlmcmFtZSBjb250ZW50IHNpemUgYW5kIGF1dG9tYXRpY2FsbHkgc3luY3MgaXQgdG8gdGhlIGlmcmFtZSBlbGVtZW50LlxuICAgICAqIFVzZXMgZGlyZWN0IGNvbnRlbnREb2N1bWVudCBhY2Nlc3MgKHNhbWUtb3JpZ2luIG9ubHkpIGZvciBhY2N1cmF0ZSBtZWFzdXJlbWVudHMuXG4gICAgICpcbiAgICAgKiBSZWVudHJhbnQ6IHdoZW4gY2FsbGVkIGFnYWluIHdoaWxlIG9ic2VydmVycyBhbHJlYWR5IGV4aXN0LCB1cGRhdGVzIG9wdGlvbnMgYW5kXG4gICAgICogcmUtZXZhbHVhdGVzIHNpemluZyB3aXRob3V0IHJlY3JlYXRpbmcgb2JzZXJ2ZXJzLiBDbGVhbnVwICsgcmUtY2FsbCAoZS5nLiBSZWFjdFxuICAgICAqIHJlLXJlbmRlcikgY3JlYXRlcyBmcmVzaCBvYnNlcnZlcnMgc2luY2UgY2xlYW51cCBjbGVhcnMgdGhlIGV4aXN0aW5nIG9uZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgc2l6ZSBjaGFuZ2UgY2FsbGJhY2sgYW5kIG1pbi9tYXggY29uc3RyYWludHNcbiAgICAgKiBAcmV0dXJucyBDbGVhbnVwIGZ1bmN0aW9uIHRvIHN0b3Agb2JzZXJ2aW5nXG4gICAgICovXG4gICAgb2JzZXJ2ZUF1dG9TaXplID0gKG9wdGlvbnM/OiBBdXRvU2l6ZU9wdGlvbnMpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIC8vIFN0b3JlIG9wdGlvbnMgc28gdXBkYXRlU2l6ZSBhbHdheXMgcmVhZHMgdGhlIGxhdGVzdFxuICAgICAgICB0aGlzLl9hdXRvU2l6ZU9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgICAgIC8vIElzb2xhdGVkIGZyYW1lcyBjYW4ndCBiZSBtZWFzdXJlZCBjcm9zcy1vcmlnaW4gXHUyMDE0IHNpemluZyBpcyBkcml2ZW4gYnlcbiAgICAgICAgLy8gJ215b3A6c2l6ZScgcG9zdE1lc3NhZ2VzIGZyb20gdGhlIGJyaWRnZSAoc2VlIF9hcHBseUlzb1NpemUpLlxuICAgICAgICBpZiAodGhpcy5pc29sYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNvU2l6ZU9wdHMgPSBvcHRpb25zO1xuICAgICAgICAgICAgdGhpcy5faXNvQXV0b1NpemUgPSB0cnVlO1xuICAgICAgICAgICAgLy8gQXBwbHkgdGhlIG1vc3QgcmVjZW50IGJyaWRnZS1yZXBvcnRlZCBzaXplIChpdCBtYXkgaGF2ZSBhcnJpdmVkIGJlZm9yZVxuICAgICAgICAgICAgLy8gYXV0by1zaXppbmcgd2FzIHR1cm5lZCBvbikuXG4gICAgICAgICAgICBpZiAodGhpcy5faXNvTGFzdFNpemUpIHRoaXMuX2FwcGx5SXNvU2l6ZSh0aGlzLl9pc29MYXN0U2l6ZS5oZWlnaHQsIHRoaXMuX2lzb0xhc3RTaXplLndpZHRoKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7IHRoaXMuX2lzb0F1dG9TaXplID0gZmFsc2U7IHRoaXMuX2lzb1NpemVPcHRzID0gdW5kZWZpbmVkOyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgb2JzZXJ2ZXJzIGFscmVhZHkgZXhpc3QsIHJlLWV2YWx1YXRlIHdpdGggbmV3IG9wdGlvbnMgYW5kIHJldXNlIHRoZW1cbiAgICAgICAgaWYgKHRoaXMuX2F1dG9TaXplQ2xlYW51cCAmJiB0aGlzLl9hdXRvU2l6ZVVwZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5fYXV0b1NpemVVcGRhdGUoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdXRvU2l6ZUNsZWFudXA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpZnJhbWUgPSB0aGlzLklmcmFtZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGRvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQ7XG5cbiAgICAgICAgaWYgKCFkb2MpIHtcbiAgICAgICAgICAgIC8vIENyb3NzLW9yaWdpbiAodjEgY29tcG9uZW50cyBvbiB0aGUgY3VzdG9tZXIncyBkb21haW4pOiBtZWFzdXJlIGluc2lkZSB0aGUgZnJhbWUuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vYnNlcnZlSGVpZ2h0VmlhQnJpZGdlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbGFtcCA9ICh2YWx1ZTogbnVtYmVyLCBtaW4/OiBudW1iZXIsIG1heD86IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgICAgICAgICBpZiAobWluICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgPCBtaW4pIHJldHVybiBtaW47XG4gICAgICAgICAgICBpZiAobWF4ICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgPiBtYXgpIHJldHVybiBtYXg7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUGFyc2UgQ1NTIHNpemUgdmFsdWVzIHRvIG51bWJlcnNcbiAgICAgICAgY29uc3QgcGFyc2VTaXplID0gKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBpc05hTihwYXJzZWQpID8gdW5kZWZpbmVkIDogcGFyc2VkO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHVwZGF0ZVNpemUgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50RG9jID0gaWZyYW1lLmNvbnRlbnREb2N1bWVudDtcbiAgICAgICAgICAgIGlmICghY29udGVudERvYykgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5fYXV0b1NpemVPcHRpb25zO1xuXG4gICAgICAgICAgICBjb25zdCBtaW5XaWR0aCA9IHBhcnNlU2l6ZShvcHRzPy5taW5XaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBtYXhXaWR0aCA9IHBhcnNlU2l6ZShvcHRzPy5tYXhXaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBtaW5IZWlnaHQgPSBwYXJzZVNpemUob3B0cz8ubWluSGVpZ2h0KTtcbiAgICAgICAgICAgIGNvbnN0IG1heEhlaWdodCA9IHBhcnNlU2l6ZShvcHRzPy5tYXhIZWlnaHQpO1xuICAgICAgICAgICAgY29uc3QgbG9hZGVyTWluSGVpZ2h0ID0gb3B0cz8ubG9hZGVyTWluSGVpZ2h0ID8/IDUwO1xuXG4gICAgICAgICAgICAvLyBSZXNvbHZlIGV4cGxpY2l0IGRpbWVuc2lvbnM6IGhvc3Qgb3B0aW9ucyBcdTIxOTIgc2l6ZU1ldGEgZmlsbCBtb2RlIFx1MjE5MiB3aWR0aCBkZWZhdWx0cyB0byBcIjEwMCVcIlxuICAgICAgICAgICAgLy8gV2lkdGggZGVmYXVsdHMgdG8gXCIxMDAlXCIgKGJsb2NrIGVsZW1lbnQgYmVoYXZpb3IpIHRvIHByZXZlbnQgdGhlIHNocmluay10by0wIG1lYXN1cmVtZW50IGJ1Zy5cbiAgICAgICAgICAgIC8vIEhlaWdodCBoYXMgbm8gZGVmYXVsdCBzbyBpdCBhdXRvLXNpemVzIHRvIGNvbnRlbnQuXG4gICAgICAgICAgICAvLyBPbmx5IHNpemVNZXRhIFwiMTAwJVwiIChmaWxsIG1vZGUpIGlzIHRyZWF0ZWQgYXMgZXhwbGljaXQgYW5kIGRpc2FibGVzIGF1dG8tc2l6aW5nLlxuICAgICAgICAgICAgLy8gUGl4ZWwgc2l6ZU1ldGEgdmFsdWVzIChlLmcuLCBoZWlnaHQ6IDIwMCkgYXJlIGluaXRpYWwgaGludHMsIE5PVCBleHBsaWNpdCBjb25zdHJhaW50cy5cbiAgICAgICAgICAgIGNvbnN0IHNpemVNZXRhRmlsbFdpZHRoID0gdGhpcy5zaXplTWV0YT8ud2lkdGggPT09IFwiMTAwJVwiID8gXCIxMDAlXCIgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBzaXplTWV0YUZpbGxIZWlnaHQgPSB0aGlzLnNpemVNZXRhPy5oZWlnaHQgPT09IFwiMTAwJVwiID8gXCIxMDAlXCIgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZEV4cGxpY2l0V2lkdGggPSBvcHRzPy5leHBsaWNpdFdpZHRoID8/IHNpemVNZXRhRmlsbFdpZHRoID8/IFwiMTAwJVwiO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCA9IG9wdHM/LmV4cGxpY2l0SGVpZ2h0ID8/IHNpemVNZXRhRmlsbEhlaWdodDtcbiAgICAgICAgICAgIGNvbnN0IGhhc0V4cGxpY2l0V2lkdGggPSByZXNvbHZlZEV4cGxpY2l0V2lkdGggIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGhhc0V4cGxpY2l0SGVpZ2h0ID0gcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAvLyBEZXRlY3QgY29sbGFwc2VkIGRpbWVuc2lvbnMgZnJvbSBjb250YWluZXIgKHRoaXMuY29udGFpbmVyKVxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgY29uc3QgY29sbGFwc2VkV2lkdGggPSBjb250YWluZXJSZWN0LndpZHRoID09PSAwO1xuICAgICAgICAgICAgLy8gQ29uc2lkZXIgY29sbGFwc2VkIGlmIGhlaWdodCBpcyAwIE9SIGVxdWFscyB0aGUgbG9hZGVyIG1pbkhlaWdodFxuICAgICAgICAgICAgY29uc3QgY29sbGFwc2VkSGVpZ2h0ID0gY29udGFpbmVyUmVjdC5oZWlnaHQgPT09IDAgfHwgY29udGFpbmVyUmVjdC5oZWlnaHQgPT09IGxvYWRlck1pbkhlaWdodDtcblxuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIGRpbWVuc2lvbnMgdG8gYXV0by1zaXplOlxuICAgICAgICAgICAgLy8gLSBJZiBmb3JjZUF1dG9TaXplIGlzIHRydWUsIGF1dG8tc2l6ZSB1bmxlc3MgZXhwbGljaXQgZGltZW5zaW9uIGlzIHNldFxuICAgICAgICAgICAgLy8gLSBPdGhlcndpc2UsIGF1dG8tc2l6ZSBvbmx5IGlmIGNvbGxhcHNlZFxuICAgICAgICAgICAgY29uc3Qgc2hvdWxkQXV0b1dpZHRoID0gb3B0cz8uZm9yY2VBdXRvU2l6ZVxuICAgICAgICAgICAgICAgID8gIWhhc0V4cGxpY2l0V2lkdGhcbiAgICAgICAgICAgICAgICA6IChjb2xsYXBzZWRXaWR0aCAmJiAhaGFzRXhwbGljaXRXaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBzaG91bGRBdXRvSGVpZ2h0ID0gb3B0cz8uZm9yY2VBdXRvU2l6ZVxuICAgICAgICAgICAgICAgID8gIWhhc0V4cGxpY2l0SGVpZ2h0XG4gICAgICAgICAgICAgICAgOiAoY29sbGFwc2VkSGVpZ2h0ICYmICFoYXNFeHBsaWNpdEhlaWdodCk7XG5cbiAgICAgICAgICAgIC8vIElmIG5vdGhpbmcgbmVlZHMgYXV0by1zaXppbmcsIGFwcGx5IGV4cGxpY2l0L3BlcmNlbnRhZ2UgZGltZW5zaW9uc1xuICAgICAgICAgICAgaWYgKCFzaG91bGRBdXRvV2lkdGggJiYgIXNob3VsZEF1dG9IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBpZnJhbWUuc3R5bGUud2lkdGggPSB0eXBlb2YgcmVzb2x2ZWRFeHBsaWNpdFdpZHRoID09PSAnbnVtYmVyJyA/IGAke3Jlc29sdmVkRXhwbGljaXRXaWR0aH1weGAgOiAnMTAwJSc7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLmhlaWdodCA9IHR5cGVvZiByZXNvbHZlZEV4cGxpY2l0SGVpZ2h0ID09PSAnbnVtYmVyJyA/IGAke3Jlc29sdmVkRXhwbGljaXRIZWlnaHR9cHhgIDogJzEwMCUnO1xuXG4gICAgICAgICAgICAgICAgb3B0cz8ub25TaXplQ2hhbmdlPy4oe1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogdHlwZW9mIHJlc29sdmVkRXhwbGljaXRXaWR0aCA9PT0gJ251bWJlcicgPyByZXNvbHZlZEV4cGxpY2l0V2lkdGggOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogdHlwZW9mIHJlc29sdmVkRXhwbGljaXRIZWlnaHQgPT09ICdudW1iZXInID8gcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgYXV0b1NpemluZ1dpZHRoOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgYXV0b1NpemluZ0hlaWdodDogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEaXNhYmxlIENTUyB0cmFuc2l0aW9ucyBvbiBpZnJhbWUgYW5kIGNvbnRhaW5lciBmb3IgdGhlIGVudGlyZVxuICAgICAgICAgICAgLy8gbWVhc3VyZW1lbnQgKyBoZWlnaHQtc2V0dGluZyBjeWNsZS4gSG9zdCBhcHBzIG1heSBzZXQgYHRyYW5zaXRpb246IGFsbGBcbiAgICAgICAgICAgIC8vIHdoaWNoIHdvdWxkIGFuaW1hdGUgdGhlIDBweCBjb2xsYXBzZSBhbmQgZmluYWwgaGVpZ2h0IGNoYW5nZSwgY2F1c2luZ1xuICAgICAgICAgICAgLy8gdmlzaWJsZSBqdW1wcyBkdXJpbmcgc2Nyb2xsLlxuICAgICAgICAgICAgY29uc3QgcHJldlRyYW5zaXRpb24gPSBpZnJhbWUuc3R5bGUudHJhbnNpdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyO1xuICAgICAgICAgICAgY29uc3QgcHJldkNvbnRhaW5lclRyYW5zaXRpb24gPSBjb250YWluZXIuc3R5bGUudHJhbnNpdGlvbjtcbiAgICAgICAgICAgIGlmcmFtZS5zdHlsZS50cmFuc2l0aW9uID0gJ25vbmUnO1xuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnRyYW5zaXRpb24gPSAnbm9uZSc7XG5cbiAgICAgICAgICAgIC8vIFF1aWNrIHByZS1jaGVjazogcmVhZCBzY3JvbGxIZWlnaHQvV2lkdGggQkVGT1JFIGNvbGxhcHNpbmcgdGhlIGlmcmFtZS5cbiAgICAgICAgICAgIC8vIElmIGNvbnRlbnQgb25seSBncmV3IChzY3JvbGxIZWlnaHQgPiBpZnJhbWUgaGVpZ2h0KSwgd2UgY2FuIHNraXAgdGhlXG4gICAgICAgICAgICAvLyAwcHggY29sbGFwc2UgXHUyMDE0IHNjcm9sbEhlaWdodCBuYXR1cmFsbHkgZXhwYW5kcyBiZXlvbmQgdGhlIGlmcmFtZS5cbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJZnJhbWVIZWlnaHQgPSBpZnJhbWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgICAgICAgICAgY29uc3QgY3VycmVudElmcmFtZVdpZHRoID0gaWZyYW1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICAgICAgY29uc3QgcHJlU2Nyb2xsSGVpZ2h0ID0gTWF0aC5jZWlsKE1hdGgubWF4KGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCwgY29udGVudERvYy5ib2R5LnNjcm9sbEhlaWdodCwgY29udGVudERvYy5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCkpO1xuICAgICAgICAgICAgY29uc3QgcHJlU2Nyb2xsV2lkdGggPSBNYXRoLmNlaWwoTWF0aC5tYXgoY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGgsIGNvbnRlbnREb2MuYm9keS5zY3JvbGxXaWR0aCwgY29udGVudERvYy5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKSk7XG5cbiAgICAgICAgICAgIGxldCBjb250ZW50V2lkdGggPSBwcmVTY3JvbGxXaWR0aDtcbiAgICAgICAgICAgIGxldCBjb250ZW50SGVpZ2h0ID0gcHJlU2Nyb2xsSGVpZ2h0O1xuXG4gICAgICAgICAgICBjb25zdCBoZWlnaHRHcmV3ID0gc2hvdWxkQXV0b0hlaWdodCAmJiBwcmVTY3JvbGxIZWlnaHQgPiBjdXJyZW50SWZyYW1lSGVpZ2h0ICsgMTtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoR3JldyA9IHNob3VsZEF1dG9XaWR0aCAmJiBwcmVTY3JvbGxXaWR0aCA+IGN1cnJlbnRJZnJhbWVXaWR0aCArIDE7XG5cbiAgICAgICAgICAgIC8vIEZvciBub24tZ3JvdyBjYXNlcyAoc2hyaW5rIG9yIG5vLWNoYW5nZSksIHdlIG11c3QgY29sbGFwc2UgdG8gMHB4IHRvXG4gICAgICAgICAgICAvLyBtZWFzdXJlIHRoZSB0cnVlIGNvbnRlbnQgaGVpZ2h0LiBzY3JvbGxIZWlnaHQgY2FuIG5ldmVyIGRlY3JlYXNlIGJlbG93XG4gICAgICAgICAgICAvLyB0aGUgaWZyYW1lJ3MgY2xpZW50SGVpZ2h0LCBzbyBzaHJpbmsgaXMgdW5kZXRlY3RhYmxlIHdpdGhvdXQgY29sbGFwc2luZy5cbiAgICAgICAgICAgIC8vIFdpdGggdHJhbnNpdGlvbnMgZGlzYWJsZWQgKyBjb250YWluZXIgbWluLWhlaWdodCBoZWxkLCB0aGUgY29sbGFwc2VcbiAgICAgICAgICAgIC8vIGlzIGludmlzaWJsZSAobm8gbGF5b3V0IHNoaWZ0LCBubyBhbmltYXRpb24pLlxuICAgICAgICAgICAgY29uc3QgbmVlZHNIZWlnaHRDb2xsYXBzZSA9IHNob3VsZEF1dG9IZWlnaHQgJiYgIWhlaWdodEdyZXc7XG4gICAgICAgICAgICBjb25zdCBuZWVkc1dpZHRoQ29sbGFwc2UgPSBzaG91bGRBdXRvV2lkdGggJiYgIXdpZHRoR3JldztcblxuICAgICAgICAgICAgaWYgKG5lZWRzSGVpZ2h0Q29sbGFwc2UgfHwgbmVlZHNXaWR0aENvbGxhcHNlKSB7XG4gICAgICAgICAgICAgICAgLy8gSG9sZCB0aGUgY29udGFpbmVyJ3MgbWluLWhlaWdodC93aWR0aCBkdXJpbmcgbWVhc3VyZW1lbnQgdG8gcHJldmVudFxuICAgICAgICAgICAgICAgIC8vIGxheW91dCBzaGlmdCAoZWxlbWVudHMgYmVsb3cgdGhlIGlmcmFtZSB3b24ndCBqdW1wKS5cbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2TWluSGVpZ2h0ID0gY29udGFpbmVyLnN0eWxlLm1pbkhlaWdodDtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2TWluV2lkdGggPSBjb250YWluZXIuc3R5bGUubWluV2lkdGg7XG4gICAgICAgICAgICAgICAgaWYgKG5lZWRzSGVpZ2h0Q29sbGFwc2UpIGNvbnRhaW5lci5zdHlsZS5taW5IZWlnaHQgPSBgJHtjdXJyZW50SWZyYW1lSGVpZ2h0fXB4YDtcbiAgICAgICAgICAgICAgICBpZiAobmVlZHNXaWR0aENvbGxhcHNlKSBjb250YWluZXIuc3R5bGUubWluV2lkdGggPSBgJHtjdXJyZW50SWZyYW1lV2lkdGh9cHhgO1xuXG4gICAgICAgICAgICAgICAgaWYgKG5lZWRzSGVpZ2h0Q29sbGFwc2UpIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSAnMHB4JztcbiAgICAgICAgICAgICAgICBpZiAobmVlZHNXaWR0aENvbGxhcHNlKSBpZnJhbWUuc3R5bGUud2lkdGggPSAnMHB4JztcblxuICAgICAgICAgICAgICAgIGNvbnRlbnRXaWR0aCA9IE1hdGguY2VpbChNYXRoLm1heChjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxXaWR0aCwgY29udGVudERvYy5ib2R5LnNjcm9sbFdpZHRoLCBjb250ZW50RG9jLmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpKTtcbiAgICAgICAgICAgICAgICBjb250ZW50SGVpZ2h0ID0gTWF0aC5jZWlsKE1hdGgubWF4KGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCwgY29udGVudERvYy5ib2R5LnNjcm9sbEhlaWdodCwgY29udGVudERvYy5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCkpO1xuXG4gICAgICAgICAgICAgICAgLy8gRmFsbGJhY2s6IGlmIGNvbGxhcHNpbmcgdG8gMHB4IGdhdmUgYSBuZWFyLXplcm8gbWVhc3VyZW1lbnQsIHRoZSBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAvLyBsaWtlbHkgaGFzIGBoZWlnaHQ6IDEwMCVgIGNoYWlucyAoaHRtbCA+IGJvZHkgPiAuYXBwLWNvbnRhaW5lcikgdGhhdCBjYXNjYWRlZFxuICAgICAgICAgICAgICAgIC8vIHRoZSBjb2xsYXBzZSBpbnRvIGFsbCBjaGlsZHJlbi4gUmV0cnkgd2l0aCBhIG51Y2xlYXIgb3ZlcnJpZGUgdGhhdCBmb3JjZXMgYWxsXG4gICAgICAgICAgICAgICAgLy8gZWxlbWVudHMgdG8gaW50cmluc2ljIHNpemluZy4gVGhpcyBpcyBvbmx5IGEgZmFsbGJhY2sgYmVjYXVzZSB0aGUgb3ZlcnJpZGVcbiAgICAgICAgICAgICAgICAvLyBicmVha3MgZXhwbGljaXQgcGl4ZWwgaGVpZ2h0cyAoZS5nLiA4cHggaW5kaWNhdG9yIGRvdHMgXHUyMTkyIDBweCkuXG4gICAgICAgICAgICAgICAgY29uc3QgbmVlZHNOdWNsZWFySGVpZ2h0ID0gbmVlZHNIZWlnaHRDb2xsYXBzZSAmJiBjb250ZW50SGVpZ2h0IDwgMjtcbiAgICAgICAgICAgICAgICBjb25zdCBuZWVkc051Y2xlYXJXaWR0aCA9IG5lZWRzV2lkdGhDb2xsYXBzZSAmJiBjb250ZW50V2lkdGggPCAyO1xuICAgICAgICAgICAgICAgIGlmIChuZWVkc051Y2xlYXJIZWlnaHQgfHwgbmVlZHNOdWNsZWFyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVhc3VyZVN0eWxlID0gY29udGVudERvYy5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICAgICAgICAgICAgICBtZWFzdXJlU3R5bGUuaWQgPSAnX19teW9wX21lYXN1cmUnO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBydWxlczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRzTnVjbGVhckhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXMucHVzaCgnaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQnLCAnbWluLWhlaWdodDogMCAhaW1wb3J0YW50JywgJ21heC1oZWlnaHQ6IG5vbmUgIWltcG9ydGFudCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZWVkc051Y2xlYXJXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXMucHVzaCgnd2lkdGg6IGF1dG8gIWltcG9ydGFudCcsICdtaW4td2lkdGg6IDAgIWltcG9ydGFudCcsICdtYXgtd2lkdGg6IG5vbmUgIWltcG9ydGFudCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lYXN1cmVTdHlsZS50ZXh0Q29udGVudCA9IGAqLCAqOjpiZWZvcmUsICo6OmFmdGVyIHsgJHtydWxlcy5qb2luKCc7ICcpfTsgZmxleC1iYXNpczogYXV0byAhaW1wb3J0YW50OyBmbGV4LWdyb3c6IDAgIWltcG9ydGFudDsgfWA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnREb2MuaGVhZC5hcHBlbmRDaGlsZChtZWFzdXJlU3R5bGUpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRXaWR0aCA9IE1hdGguY2VpbChNYXRoLm1heChjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxXaWR0aCwgY29udGVudERvYy5ib2R5LnNjcm9sbFdpZHRoLCBjb250ZW50RG9jLmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEhlaWdodCA9IE1hdGguY2VpbChNYXRoLm1heChjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQsIGNvbnRlbnREb2MuYm9keS5zY3JvbGxIZWlnaHQsIGNvbnRlbnREb2MuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpKTtcblxuICAgICAgICAgICAgICAgICAgICBtZWFzdXJlU3R5bGUucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUmVzdG9yZSBjb250YWluZXIgY29uc3RyYWludHMgaW1tZWRpYXRlbHkgKHNhbWUgZnJhbWUsIGJlZm9yZSBwYWludClcbiAgICAgICAgICAgICAgICBjb250YWluZXIuc3R5bGUubWluSGVpZ2h0ID0gcHJldk1pbkhlaWdodDtcbiAgICAgICAgICAgICAgICBjb250YWluZXIuc3R5bGUubWluV2lkdGggPSBwcmV2TWluV2lkdGg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gY2xhbXAoY29udGVudFdpZHRoLCBtaW5XaWR0aCwgbWF4V2lkdGgpO1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gY2xhbXAoY29udGVudEhlaWdodCwgbWluSGVpZ2h0LCBtYXhIZWlnaHQpO1xuXG4gICAgICAgICAgICAvLyBTZXQgYXV0by1zaXplZCBkaW1lbnNpb25zIHRvIG1lYXN1cmVkIHZhbHVlcywgbm9uLWF1dG8gdG8gZXhwbGljaXQvMTAwJVxuICAgICAgICAgICAgaWYgKHNob3VsZEF1dG9XaWR0aCkge1xuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLndpZHRoID0gdHlwZW9mIHJlc29sdmVkRXhwbGljaXRXaWR0aCA9PT0gJ251bWJlcicgPyBgJHtyZXNvbHZlZEV4cGxpY2l0V2lkdGh9cHhgIDogJzEwMCUnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNob3VsZEF1dG9IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLmhlaWdodCA9IHR5cGVvZiByZXNvbHZlZEV4cGxpY2l0SGVpZ2h0ID09PSAnbnVtYmVyJyA/IGAke3Jlc29sdmVkRXhwbGljaXRIZWlnaHR9cHhgIDogJzEwMCUnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGb3JjZSByZWZsb3cgc28gdGhlIGZpbmFsIGRpbWVuc2lvbnMgYXJlIGFwcGxpZWQgd2l0aG91dCB0cmFuc2l0aW9uLFxuICAgICAgICAgICAgLy8gdGhlbiByZXN0b3JlIHRoZSBvcmlnaW5hbCB0cmFuc2l0aW9ucy5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgIGlmcmFtZS5vZmZzZXRIZWlnaHQ7XG4gICAgICAgICAgICBpZnJhbWUuc3R5bGUudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnRyYW5zaXRpb24gPSBwcmV2Q29udGFpbmVyVHJhbnNpdGlvbjtcblxuICAgICAgICAgICAgLy8gRG9uJ3QgZm9yY2Ugb3ZlcmZsb3cgXHUyMDE0IGxldCB0aGUgY29tcG9uZW50L3BhcmVudCBjb250cm9sIHNjcm9sbGluZy5cbiAgICAgICAgICAgIC8vIE9ubHkgc2V0IG92ZXJmbG93OiBhdXRvIHdoZW4gY29udGVudCBleGNlZWRzIG1heCBjb25zdHJhaW50cy5cbiAgICAgICAgICAgIGNvbnN0IGlzV2lkdGhDb25zdHJhaW5lZCA9IHNob3VsZEF1dG9XaWR0aCAmJiBtYXhXaWR0aCAhPT0gdW5kZWZpbmVkICYmIGNvbnRlbnRXaWR0aCA+IG1heFdpZHRoO1xuICAgICAgICAgICAgY29uc3QgaXNIZWlnaHRDb25zdHJhaW5lZCA9IHNob3VsZEF1dG9IZWlnaHQgJiYgbWF4SGVpZ2h0ICE9PSB1bmRlZmluZWQgJiYgY29udGVudEhlaWdodCA+IG1heEhlaWdodDtcbiAgICAgICAgICAgIGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93WCA9IGlzV2lkdGhDb25zdHJhaW5lZCA/ICdhdXRvJyA6ICcnO1xuICAgICAgICAgICAgY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3dZID0gaXNIZWlnaHRDb25zdHJhaW5lZCA/ICdhdXRvJyA6ICcnO1xuXG4gICAgICAgICAgICBvcHRzPy5vblNpemVDaGFuZ2U/Lih7XG4gICAgICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICAgIGF1dG9TaXppbmdXaWR0aDogc2hvdWxkQXV0b1dpZHRoLFxuICAgICAgICAgICAgICAgIGF1dG9TaXppbmdIZWlnaHQ6IHNob3VsZEF1dG9IZWlnaHRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEluaXRpYWwgc2l6ZSAocnVuIHN5bmNocm9ub3VzbHksIG5vdCBkZWJvdW5jZWQpXG4gICAgICAgIHVwZGF0ZVNpemUoKTtcblxuICAgICAgICAvLyBTdG9yZSB1cGRhdGVTaXplIGZvciByZWVudHJhbnQgY2FsbHNcbiAgICAgICAgdGhpcy5fYXV0b1NpemVVcGRhdGUgPSB1cGRhdGVTaXplO1xuXG4gICAgICAgIC8vIERlYm91bmNlIG9ic2VydmVyIGNhbGxiYWNrcyB2aWEgckFGIFx1MjAxNCBhdCBtb3N0IG9uZSB1cGRhdGVTaXplIHBlciBmcmFtZS5cbiAgICAgICAgLy8gUHJldmVudHMgbGF5b3V0IHRocmFzaGluZyBmcm9tIGhpZ2gtZnJlcXVlbmN5IG11dGF0aW9ucyAoZS5nLiBDU1MgYW5pbWF0aW9ucykuXG4gICAgICAgIGxldCByYWZJZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBzY2hlZHVsZVVwZGF0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChyYWZJZCAhPT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgICAgICByYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmFmSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdXBkYXRlU2l6ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gT2JzZXJ2ZSBmb3IgY2hhbmdlc1xuICAgICAgICBjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiBzY2hlZHVsZVVwZGF0ZSgpKTtcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShkb2MuYm9keSk7XG4gICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZG9jLmRvY3VtZW50RWxlbWVudCk7XG5cbiAgICAgICAgLy8gTXV0YXRpb25PYnNlcnZlciBjYXRjaGVzIERPTSBjb250ZW50IGNoYW5nZXMgKGUuZy4gcmVtb3ZpbmcgbGlzdCBpdGVtcywgdG9nZ2xpbmcgdmlld3MpXG4gICAgICAgIC8vIHRoYXQgZG9uJ3QgdHJpZ2dlciBSZXNpemVPYnNlcnZlciBiZWNhdXNlIHRoZSBib2R5IGJveC1zaXplIHN0YXlzIHRoZSBzYW1lXG4gICAgICAgIC8vIChib2R5IGZpbGxzIGlmcmFtZSwgaWZyYW1lIGhhc24ndCBzaHJ1bmsgeWV0KS5cbiAgICAgICAgLy8gYGF0dHJpYnV0ZXM6IHRydWVgIGNhdGNoZXMgQ1NTIGNsYXNzL3N0eWxlIGNoYW5nZXMgKGUuZy4gZGlzcGxheTpub25lIHRvZ2dsaW5nIHZpZXdzKS5cbiAgICAgICAgY29uc3QgbXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHNjaGVkdWxlVXBkYXRlKCkpO1xuICAgICAgICBtdXRhdGlvbk9ic2VydmVyLm9ic2VydmUoZG9jLmJvZHksIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlLCBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xuXG4gICAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICBtdXRhdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIGlmIChyYWZJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmSWQpO1xuICAgICAgICAgICAgICAgIHJhZklkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fYXV0b1NpemVVcGRhdGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLl9hdXRvU2l6ZUNsZWFudXAgPSB1bmRlZmluZWQ7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2F1dG9TaXplQ2xlYW51cCA9IGNsZWFudXA7XG4gICAgICAgIHJldHVybiBjbGVhbnVwO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2JyaWRnZVNpemVDbGVhbnVwPzogQ2xlYW51cEhhbmRsZXI7XG5cbiAgICAvKipcbiAgICAgKiBBdXRvLWhlaWdodCBmb3IgYSBmcmFtZSB0aGUgaG9zdCBjYW4ndCByZWFkIChjcm9zcy1vcmlnaW4pLiBSdW5zIGFmdGVyIHRoZSBJZnJhbWVTREtcbiAgICAgKiBoYW5kc2hha2U6IHRoZSBmcmFtZSByZXBvcnRzIGJvZHkgcmVzaXplcyBhbmQgdGhlIGhvc3QgcmUtcmVhZHMgdGhlIHNjcm9sbCBoZWlnaHQuXG4gICAgICovXG4gICAgb2JzZXJ2ZUhlaWdodFZpYUJyaWRnZSA9ICgpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9icmlkZ2VTaXplQ2xlYW51cCkgcmV0dXJuIHRoaXMuX2JyaWRnZVNpemVDbGVhbnVwO1xuXG4gICAgICAgIGxldCBvYnNlcnZlckNsZWFudXA6IENsZWFudXBIYW5kbGVyIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICAgICAgc3RvcHBlZCA9IHRydWU7XG4gICAgICAgICAgICBvYnNlcnZlckNsZWFudXA/LigpO1xuICAgICAgICAgICAgdGhpcy5fYnJpZGdlU2l6ZUNsZWFudXAgPSB1bmRlZmluZWQ7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2JyaWRnZVNpemVDbGVhbnVwID0gY2xlYW51cDtcblxuICAgICAgICB0aGlzLmluaXRpYXRlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHN0b3BwZWQgfHwgdGhpcy5tYXJrZWRGb3JEaXNwb3NlZCkgcmV0dXJuO1xuICAgICAgICAgICAgLy8gTGVhdmUgdGhlIGFic29sdXRlIDEwMCUgb3ZlcmxheSBhbmQgdGFrZSBwYXJ0IGluIHRoZSBjb250YWluZXIncyBsYXlvdXQuXG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmluc2V0ID0gJ2F1dG8nO1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG4gICAgICAgICAgICBvYnNlcnZlckNsZWFudXAgPSB0aGlzLnNlbmQobmV3IFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSgpKTtcbiAgICAgICAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgIC8vIE5vdCBmYXRhbDogdGhlIGNvbXBvbmVudCBzdGlsbCByZW5kZXJzLCBpdCBqdXN0IG5ldmVyIGdldHMgYSBoZWlnaHQgYW5kIHNpdHNcbiAgICAgICAgICAgIC8vIGF0IHRoZSBpZnJhbWUgZGVmYXVsdC4gV2l0aG91dCB0aGlzIGxpbmUgdGhhdCBpcyBjb21wbGV0ZWx5IGludmlzaWJsZSAtLVxuICAgICAgICAgICAgLy8gbm90aGluZyB0aHJvd3MsIG5vdGhpbmcgbG9ncywgYW5kIHRoZSBvbmx5IHN5bXB0b20gaXMgYSAxNTBweCBmcmFtZS4gQVxuICAgICAgICAgICAgLy8gc2lsZW50IHNpemluZyBmYWlsdXJlIG9mIGV4YWN0bHkgdGhpcyBzaGFwZSBpcyB3aGF0IG1hZGUgdGhlIGluaXQgcmFjZVxuICAgICAgICAgICAgLy8gKDIwMjYtMTAtMTcsIHNlZSBJTklULUhBTkRTSEFLRS5tZCkgdGFrZSBmb3VyIGRheXMgdG8gZmluZDogaW5pdGlhdGVkKClcbiAgICAgICAgICAgIC8vIHJlamVjdGVkLCB0aGlzIGNhdGNoIHN3YWxsb3dlZCBpdCwgYW5kIGF1dG8taGVpZ2h0IHNpbXBseSBuZXZlciBoYXBwZW5lZC5cbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgW015b3BJZnJhbWVDb21wb25lbnRdIGF1dG8taGVpZ2h0IHNraXBwZWQgZm9yICR7dGhpcy5pZH06ICR7ZX1gKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXA7XG4gICAgfVxuXG4gICAgc2V0U2l6ZUJhc2VkT25Eb2N1bWVudEVsZW1lbnQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7aGVpZ2h0LCB3aWR0aH0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICByZXR1cm4ge2hlaWdodCwgd2lkdGh9XG4gICAgICAgIH0sIChyZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3JldC5jb250ZW50LndpZHRofXB4YDtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtyZXQuY29udGVudC5oZWlnaHR9cHhgO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAvLyByZXR1cm4gd2luZG93LmRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0ICsgJ3B4JztcblxuXG4gICAgICAgICAgICAvL1RPRE86IGZpeCB0aGF0IGhhY2ssIGtlZXAgdGhlIGZ1bmN0aW9uIGluIHJpZ2h0IGZvcm1hdCB3aGlsZSBtaW5pZmllZCA6KFxuICAgICAgICAgICAgY29uc3Qgbm9PcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBObyBvcGVyYXRpb24gcGVyZm9ybWVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUbyBlbnN1cmUgaXQncyBub3Qgb3B0aW1pemVkIGF3YXksIHlvdSBjYW4gY2FsbCBpdCBhdCBsZWFzdCBvbmNlXG4gICAgICAgICAgICBsZXQgeCA9IG5vT3AoKTtcbiAgICAgICAgICAgIHgrKztcbiAgICAgICAgICAgIHgtLTtcblxuICAgICAgICAgICAgLy9yZXR1cm4gYCR7d2luZG93LmRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0fXB4YDtcblxuICAgICAgICAgICAgLy9UT0RPIDogY2hlY2sgdGhhdCArMSA/XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoTWF0aC5tYXgoXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0KVxuICAgICAgICAgICAgICAgICwgd2luZG93LmRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0KSArIHggKyAncHgnXG5cbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IHJldC5jb250ZW50O1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZV8gPSB7Li4ubWVzc2FnZX0gYXMgQmFzZU15b3BNZXNzYWdlO1xuICAgICAgICAvL1RPRE8gOiA/IT8hIHNob3VsZCBpdCBiZSBoZXJlID9cbiAgICAgICAgaWYgKG1lc3NhZ2VfLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCkge1xuICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gKG1lc3NhZ2VfIGFzIEV4ZWN1dGVDb21wb25lbnRNZXRob2QpXG4gICAgICAgICAgICB0aGlzW3R5cGVkTWVzc2FnZS5tZXRob2RdKCk7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9UT0RPIDogZml4IHRoYXQgaGFjayA6KFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlclxuXG4gICAgICAgIG1lc3NhZ2VfLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24uZG93bjtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSBzdXBlci5zZW5kKG1lc3NhZ2VfKTtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50Py5jb250ZW50V2luZG93Py5wb3N0TWVzc2FnZShtZXNzYWdlXywgJyonKTtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vbWVzc2FnZS5oYW5kbGVyID0gaGFuZGxlclxuXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9O1xuXG4gICAgb25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW4uTXV0YXRpb25PYnNlcnZlck1lc3NhZ2VcbiAgICAgICAgICAgIHx8IGluY29tZU1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbi5SZXNpemVPYnNlcnZlck1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpO1xuICAgICAgICAgICAgLy9kZWJ1Z2dlclxuICAgICAgICAgICAgLy90aGlzLnNldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLm9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuX2JyaWRnZVNpemVDbGVhbnVwPy4oKTtcbiAgICAgICAgaWYgKHRoaXMuX2F1dG9TaXplQ2xlYW51cCkge1xuICAgICAgICAgICAgdGhpcy5fYXV0b1NpemVDbGVhbnVwKCk7XG4gICAgICAgICAgICB0aGlzLl9hdXRvU2l6ZUNsZWFudXAgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2lzb01zZ0hhbmRsZXIpIHtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5faXNvTXNnSGFuZGxlcik7XG4gICAgICAgICAgICB0aGlzLl9pc29Nc2dIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNsZWFudXBJbnNwZWN0KVxuICAgICAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCgpO1xuXG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgLy8gT3B0aW9uYWwtY2hhaW5lZDogZGlzcG9zZSBub3cgYWxzbyBydW5zIGZvciBjb21wb25lbnRzIHRoYXQgbmV2ZXIgaW5pdGlhdGVkLCBhbmRcbiAgICAgICAgLy8gZm9yIHRob3NlIHRoZSBmcmFtZSBtYXkgYWxyZWFkeSBiZSBnb25lIC0tIHRoZSBkaWFsb2cgdGhhdCBjb250YWluZWQgaXQgd2FzIHRvcm5cbiAgICAgICAgLy8gZG93biwgb3IgaXQgd2FzIG5ldmVyIGF0dGFjaGVkLiBBIHRocm93IGhlcmUgd291bGQgYWJvcnQgdGhlIHJlc3Qgb2YgdGhlIGNsZWFudXAuXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZCh0aGlzLklmcmFtZUVsZW1lbnQpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNES1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWcsIFNraW5Mb2FkZXJUeXBlfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU15b3BMb2FkZXIge1xuICAgIHR5cGU6IFNraW5Mb2FkZXJUeXBlO1xuICAgIGxvYWQ6IChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiBQcm9taXNlPElNeW9wQ29tcG9uZW50Pjtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNeW9wTG9hZGVyIGltcGxlbWVudHMgSU15b3BMb2FkZXIge1xuICAgIGFic3RyYWN0IHR5cGU6IFNraW5Mb2FkZXJUeXBlO1xuICAgIGFic3RyYWN0IGxvYWQ6IChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiBQcm9taXNlPElNeW9wQ29tcG9uZW50PjtcblxuICAgIGFwcGVuZENoaWxkID0gKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucywpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnJlbGF0aXZlKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yZWxhdGl2ZS5kaXJlY3Rpb24gPT09ICdiZWZvcmUnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoZWxlbWVudCwgb3B0aW9ucy5yZWxhdGl2ZS5jaGlsZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlbGF0aXZlLmRpcmVjdGlvbiA9PT0gJ2FmdGVyJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRTaWJsaW5nID0gb3B0aW9ucy5yZWxhdGl2ZS5jaGlsZD8ubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoZWxlbWVudCwgbmV4dFNpYmxpbmcgPyBuZXh0U2libGluZyA6IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BJZnJhbWVDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BJZnJhbWVDb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BMb2FkZXJ9IGZyb20gXCIuL0lNeW9wTG9hZGVyXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJSWZyYW1lTG9hZGVyQ29uZmlnLCBJU2tpbkNvbmZpZywgU2tpbkxvYWRlcnN9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuY29uc3QgYWRkUXVlcnlQYXJhbSA9ICh1cmw6IHN0cmluZywgcGFyYW06IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4ge1xuICAgIC8vIENyZWF0ZSBhIFVSTCBvYmplY3RcbiAgICBjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybCk7XG5cbiAgICAvLyBBZGQgdGhlIHF1ZXJ5IHBhcmFtZXRlclxuICAgIHVybE9iai5zZWFyY2hQYXJhbXMuYXBwZW5kKHBhcmFtLCB2YWx1ZSk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHVwZGF0ZWQgVVJMXG4gICAgcmV0dXJuIHVybE9iai50b1N0cmluZygpO1xufVxuXG4vKipcbiAqIERvZXMgYGZyYW1lYCBhbHJlYWR5IHBvaW50IGF0IGB1cmxgPyBDb21wYXJlZCBhcyBhYnNvbHV0ZSBVUkxzLCBpZ25vcmluZyB0aGUgZnJhZ21lbnQgYW5kXG4gKiBhIHRyYWlsaW5nIHNsYXNoIG9uIHRoZSBwYXRoOiBgL3BhZ2VgIGFuZCBgL3BhZ2UvYCBhcmUgdGhlIHNhbWUgZG9jdW1lbnQgKGEgc2l0ZSB0aGF0XG4gKiBwcmVmZXJzIG9uZSAzMDFzIHRoZSBvdGhlciksIGFuZCB0aGUgc2VydmVyIG1heSBoYW5kIG91dCBlaXRoZXIgZm9ybSAtLSBzZWUgdGhlXG4gKiB0cmFpbGluZy1zbGFzaCBmaXggaW4gbXlvcC1zZXJ2ZXIncyB2MVVybE5vcm1hbGl6ZS50cy4gQW4gZW1wdHkgYHNyY2AgaXMgbmV2ZXIgYSBtYXRjaC5cbiAqL1xuY29uc3Qgc2hvd3NTYW1lUGFnZSA9IChmcmFtZTogSFRNTElGcmFtZUVsZW1lbnQsIHVybDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgY29uc3QgY3VycmVudCA9IGZyYW1lLmdldEF0dHJpYnV0ZSgnc3JjJyk7XG4gICAgaWYgKCFjdXJyZW50IHx8ICF1cmwpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBub3JtID0gKHU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCB4ID0gbmV3IFVSTCh1LCBkb2N1bWVudC5iYXNlVVJJKTtcbiAgICAgICAgeC5oYXNoID0gJyc7XG4gICAgICAgIGlmICh4LnBhdGhuYW1lLmxlbmd0aCA+IDEpIHgucGF0aG5hbWUgPSB4LnBhdGhuYW1lLnJlcGxhY2UoL1xcLyQvLCAnJyk7XG4gICAgICAgIHJldHVybiB4LmhyZWY7XG4gICAgfTtcbiAgICB0cnkgeyByZXR1cm4gbm9ybShjdXJyZW50KSA9PT0gbm9ybSh1cmwpOyB9IGNhdGNoIHsgcmV0dXJuIGZhbHNlOyB9XG59O1xuXG5leHBvcnQgY2xhc3MgTXlvcElmcmFtZUxvYWRlciBleHRlbmRzIEJhc2VNeW9wTG9hZGVyIHtcbiAgICB0eXBlID0gU2tpbkxvYWRlcnMuSWZyYW1lTG9hZGVyXG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbG9hZCA9IGFzeW5jIChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiB7XG4gICAgICAgIGxldCBJZnJhbWVFbGVtZW50OiBIVE1MSUZyYW1lRWxlbWVudDtcblxuICAgICAgICBjb25zdCB0eXBlZExvYWRlckNvbmZpZyA9IChza2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKTtcblxuICAgICAgICBpZiAoY29udGFpbmVyPy5ub2RlTmFtZSA9PT0gXCJJRlJBTUVcIikge1xuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IChjb250YWluZXIgYXMgSFRNTElGcmFtZUVsZW1lbnQpXG5cbiAgICAgICAgICAgIC8vIEFET1BUIEEgRlJBTUUgVEhBVCBJUyBBTFJFQURZIFNIT1dJTkcgVEhJUyBQQUdFIC0tIERPIE5PVCBSRUxPQUQgSVQuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gQXNzaWduaW5nIGBzcmNgIGFsd2F5cyBuYXZpZ2F0ZXMsIGV2ZW4gdG8gdGhlIGlkZW50aWNhbCBVUkwuIFNvIGEgZnJhbWUgdGhlXG4gICAgICAgICAgICAvLyBzZXJ2ZXIgcmVuZGVyZWQgaW50byB0aGUgSFRNTCAtLSB3aGljaCBzdGFydGVkIGxvYWRpbmcgaW4gdGhlIGZpcnN0IGJ5dGVzLFxuICAgICAgICAgICAgLy8gbG9uZyBiZWZvcmUgYW55IHNjcmlwdCByYW4gLS0gd2FzIHRocm93biBhd2F5IGFuZCBsb2FkZWQgYSBzZWNvbmQgdGltZSB0aGVcbiAgICAgICAgICAgIC8vIG1vbWVudCB0aGUgU0RLIHRvb2sgaXQgb3Zlci4gVGhhdCBpcyB0aGUgd2hvbGUgZ2FpbiBvZiBzZXJ2ZXItcmVuZGVyaW5nIHRoZVxuICAgICAgICAgICAgLy8gaWZyYW1lIChcdTIyMTI2OCUgdG8gXHUyMjEyODAlIGluIHRoZSAyMDI2LTEwLTExIGxhYiwgSDgpLCBsb3N0LlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFRoZSBoYW5kc2hha2UgZG9lcyBub3QgbmVlZCBhIGZyZXNoIGxvYWQ6IHRoZSBob3N0IHNlbmRzIEluaXRNZXNzYWdlIHdoZW4gaXRcbiAgICAgICAgICAgIC8vIHJlZ2lzdGVycyB0aGUgY29tcG9uZW50LCBhbmQgYSBmcmFtZSB0aGF0IGJvb3RlZCBlYXJsaWVyIGFuc3dlcnMgaXQ7IGEgZnJhbWVcbiAgICAgICAgICAgIC8vIHRoYXQgYm9vdHMgbGF0ZXIgYW5ub3VuY2VzIGl0c2VsZiBhbmQgaXMgYW5zd2VyZWQgdGhlbi5cbiAgICAgICAgICAgIGlmICghc2hvd3NTYW1lUGFnZShJZnJhbWVFbGVtZW50LCB0eXBlZExvYWRlckNvbmZpZy51cmwpKSB7XG4gICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zcmMgPSB0eXBlZExvYWRlckNvbmZpZy51cmxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXFJZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgY29uc3QgZG9tSWQgPSBgbXlvcC1jb21wLSR7dW5pcUlkfWBcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgICAgICAvLyBTZXQgYWxsIHN0eWxlcyBCRUZPUkUgYXBwZW5kaW5nIHRvIHByZXZlbnQgZmxhc2ggYXQgd3JvbmcgcG9zaXRpb25cbiAgICAgICAgICAgIGNvbnN0IGlmcmFtZVN0eWxlcyA9IGBcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICAgICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgaW5zZXQ6IDA7XG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAke3R5cGVkTG9hZGVyQ29uZmlnLmF1dG9IZWlnaHQgfHwgIXR5cGVkTG9hZGVyQ29uZmlnLmhlaWdodCA/ICcxMDAlJyA6IHR5cGVkTG9hZGVyQ29uZmlnLmhlaWdodH07XG4gICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgICAgICAgb3BhY2l0eTogJHtvcHRpb25zPy5oaWRkZW4gPyAnMCcgOiAnMSd9O1xuICAgICAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiAke29wdGlvbnM/LmhpZGRlbiA/ICdub25lJyA6ICdhbGwnfTtcbiAgICAgICAgICAgIGA7XG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnN0eWxlLmNzc1RleHQgPSBpZnJhbWVTdHlsZXM7XG5cbiAgICAgICAgICAgIC8vIFNldCBlbGVtZW50IGF0dHJpYnV0ZXMgaWYgcHJvdmlkZWRcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5lbGVtZW50QXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuZWxlbWVudEF0dHJpYnV0ZXMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgJycpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCBTdHJpbmcodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpbiBvcmRlciB0byBoYW5kbGUgaXNzdWUgdG8gbG9hZCBpZnJhbWUgaW5zaWRlIGFuIGlmcmFtZSB3aXRoIHRoZSBzYW1lIHVybFxuICAgICAgICAgICAgbGV0IHVybDJsb2FkID0gKHNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpLnVybDtcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5faGFzUGFyZW50KVxuICAgICAgICAgICAgICAgIHVybDJsb2FkID0gYWRkUXVlcnlQYXJhbSh1cmwybG9hZCwgXCJfbXlvcC1jb21wXCIsIHVuaXFJZCk7XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3JjID0gdXJsMmxvYWQ7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiBkbyBpdCBvbmx5IHdpdGggZmxhZyA/XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBJZnJhbWVFbGVtZW50LCBvcHRpb25zKSBhcyBIVE1MSUZyYW1lRWxlbWVudDtcbiAgICAgICAgICAgIC8vICAgSWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRvbUlkKSBhcyBIVE1MSUZyYW1lRWxlbWVudDtcbiAgICAgICAgICAgIC8vTk8gOiBJZnJhbWVFbGVtZW50ID0gY29udGFpbmVyLmxhc3RFbGVtZW50Q2hpbGQgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgTXlvcElmcmFtZUNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIGBhdXRvSGVpZ2h0YCBpbiB0aGUgdjEgY29uZmlnIHVzZWQgdG8gb25seSBzZXQgaGVpZ2h0OjEwMCUgb24gYW4gYWJzb2x1dGUgZnJhbWUsIHNvIGluIGFuXG4gICAgICAgIC8vIHVuc2l6ZWQgY29udGFpbmVyIHRoZSBmcmFtZSBzdGF5ZWQgYXQgdGhlIDE1MHB4IENTUyBkZWZhdWx0LlxuICAgICAgICBpZiAodHlwZWRMb2FkZXJDb25maWcuYXV0b0hlaWdodCAmJiBvcHRpb25zPy5hdXRvU2l6ZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5vYnNlcnZlSGVpZ2h0VmlhQnJpZGdlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgbXlvcFdlYmNvbXBvbmVudENvbnN0cyA9IHtcbiAgICB3ZWJjb21wb25lbnRfbWVzc2FnZV9rZXk6ICdteW9wX3dlYmNvbXBvbmVudF9tZXNzYWdlJ1xufVxuIiwgImltcG9ydCB7bXlvcFdlYmNvbXBvbmVudENvbnN0c30gZnJvbSBcIi4uLy4uL3dlYmNvbXBvbmVudC9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7c2V0RGVidWdTdHlsZX0gZnJvbSBcIi4uL2NvbXBvbmVudENvcmVcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcblxuZXhwb3J0IGNsYXNzIE15b3BXZWJDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwcml2YXRlIGN1c3RvbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICBzdXBlcihjb21wb25lbnREZWZpbml0aW9uLCBjb250YWluZXIgLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gY3VzdG9tRWxlbWVudDtcbiAgICB9XG5cbiAgICBjbGVhbnVwSW5zcGVjdDogQ2xlYW51cEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgfVxuXG4gICAgaW5zcGVjdCgpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHNldERlYnVnU3R5bGUodGhpcy5pZCwgJ015b3BXZWJDb21wb25lbnQnLCAwLCB0aGlzLmNvbnRhaW5lciwgdGhpcy5jdXN0b21FbGVtZW50LCB0aGlzLmNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGVhbnVwSW5zcGVjdDtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS53aWR0aCA9ICcwJ1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAndW5zZXQnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2FsbCdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLndpZHRoID0gJyc7XG4gICAgfVxuXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2U8YW55PikgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZV8gPSB7Li4ubWVzc2FnZX0gYXMgQmFzZU15b3BNZXNzYWdlO1xuXG4gICAgICAgIC8vVE9ETyA6IGNhbiBiZSBkb25lIHdpdGhvdXQgY2xvbmluZz9cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL2NvbnN0IGhhbmRsZXIgPSBtZXNzYWdlXy5oYW5kbGVyXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlXyk7XG5cbiAgICAgICAgY29uc3QgbXNnID0gbmV3IEN1c3RvbUV2ZW50PEJhc2VNeW9wTWVzc2FnZT4obXlvcFdlYmNvbXBvbmVudENvbnN0cy53ZWJjb21wb25lbnRfbWVzc2FnZV9rZXksIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRldGFpbDogbWVzc2FnZV8sXG4gICAgICAgICAgICAvLyBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgLy8gY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAvLyBjb21wb3NlZDogdHJ1ZVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vdGhpcy5jb250YWluZXIuZGlzcGF0Y2hFdmVudChtc2cpXG5cbiAgICAgICAgLy9zZW5kaW5nIGRhdGEgZnJvbSBob3N0IHRvIHRoZSBjb21wb25lbnRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5kaXNwYXRjaEV2ZW50KG1zZylcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLmN1c3RvbUVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuY2hpbGRyZW5bMF0uZGlzcGF0Y2hFdmVudChtc2cpXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciB3aGlsZSB0cnlpbmcgdG8gZGlzcGF0Y2hFdmVudCcsIGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL21lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfVxuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQodGhpcy5jdXN0b21FbGVtZW50KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wV2ViQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wV2ViY29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuaW1wb3J0IHt1dWlkdjQsIHdhaXR9IGZyb20gXCIuLi8uLi91dGlscy91dGlscy50c1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWcsIElXZWJDb21wb25lbnRMb2FkZXJDb25maWcsIFNraW5Mb2FkZXJzfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmNvbnN0IHNlZW46IFJlY29yZDxzdHJpbmcsIFByb21pc2U8dm9pZD4+ID0ge307XG5cbmV4cG9ydCBjbGFzcyBXZWJjb21wb25lbnRMb2FkZXIgZXh0ZW5kcyBCYXNlTXlvcExvYWRlciB7XG5cbiAgICB0eXBlID0gU2tpbkxvYWRlcnMuV2ViQ29tcG9uZW50TG9hZGVyXG5cbiAgICBsb2FkID0gYXN5bmMgKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcblxuICAgICAgICBjb25zdCBsb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSVdlYkNvbXBvbmVudExvYWRlckNvbmZpZyk7XG5cbiAgICAgICAgaWYgKCFzZWVuW2xvYWRlckNvbmZpZy51cmxdKSB7XG4gICAgICAgICAgICAvLyBhd2FpdCBpbXBvcnQoIC8qIEB2aXRlLWlnbm9yZSAqLyB3ZWJDb21wb25lbnRMb2FkVXJsKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdtb2R1bGUgbG9hZGVkJyk7XG4gICAgICAgICAgICBzZWVuW2xvYWRlckNvbmZpZy51cmxdID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdlYkNvbXBvbmVudExvYWRVcmwgPSBsb2FkZXJDb25maWcudXJsXG4gICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICAgICAgc2NyaXB0LnR5cGUgPSAnbW9kdWxlJztcbiAgICAgICAgICAgICAgICBzY3JpcHQuc3JjID0gd2ViQ29tcG9uZW50TG9hZFVybDtcbiAgICAgICAgICAgICAgICBzY3JpcHQub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ01vZHVsZSBhbHJlZGF5IGxvYWRlZCBvciBpbiBsb2FkaW5nIHByb2Nlc3MnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHNlZW5bbG9hZGVyQ29uZmlnLnVybF07XG5cbiAgICAgICAgLy9UT0RPIDogYWRkIHJldHJ5IG1lY2hhbmlzbSBpbiBmYWlsIGNhc2UuXG5cbiAgICAgICAgLy9UT0RPIDogZml4IHRoYXQgaGFjaywgc2hvdWxkIGZpeCB0aGUgcmFjZSBjb25kaXRpb24gZm9yIGxvYWRlZCBtb2R1bGVzXG4gICAgICAgIGF3YWl0IHdhaXQoMSk7XG5cbiAgICAgICAgbGV0IGRvbUlkID0gYG15b3AtY29tcC0ke3V1aWR2NCgpfWBcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobG9hZGVyQ29uZmlnLnRhZyk7XG5cbiAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAvL2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICBlbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgKGNvbnRhaW5lci5pZC5zdGFydHNXaXRoKCdteW9wLWNvbXAtJykpIHtcbiAgICAgICAgLy8gICAgIC8vIGluIHBsYWNlIHJlcGxhY2VtZW50XG4gICAgICAgIC8vICAgICBjb250YWluZXIucmVwbGFjZVdpdGgoZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAvL2NvbnRhaW5lciA9IGVsZW1lbnQucGFyZW50RWxlbWVudCE7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICBpZihvcHRpb25zPy5fZW52aXJvbm1lbnQpe1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZWxlbWVudC5fbXlvcEVudmlyb25tZW50ID0gb3B0aW9ucz8uX2Vudmlyb25tZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgICAvL2VsZW1lbnQuaW5uZXJIVE1MID0gYDwke2xvYWRlckNvbmZpZy50YWd9IC8+YDtcbiAgICAgICAgcmV0dXJuIG5ldyBNeW9wV2ViQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgfVxuXG59XG4iLCAiLyoqXG4gKiBUaGUgY2xpZW50IHdpbmRvdzogd2hhdCBhIHJldHVybmluZyB2aXNpdG9yIGRvZXMgTk9UIGFzayBmb3IuXG4gKlxuICogQSBjb21wb25lbnQgdGhlIGJyb3dzZXIgYWxyZWFkeSBob2xkcywgc3RpbGwgaW5zaWRlIGl0cyBmcmVzaG5lc3Mgd2luZG93LCBpcyByZW5kZXJlZFxuICogd2l0aCBubyBuZXR3b3JrIGF0IGFsbC4gT25jZSB0aGUgd2luZG93IGVuZHMgdGhlIGJyb3dzZXIgZG9lcyBub3QgcmUtZG93bmxvYWQgaXQgZWl0aGVyXG4gKiBcdTIwMTQgaXQgc2VuZHMgYmFjayB0aGUgdmVyc2lvbiBpdCBob2xkcyBhbmQgaXMgdXN1YWxseSB0b2xkIFwidW5jaGFuZ2VkXCIgaW4gYSBmZXcgaHVuZHJlZFxuICogYnl0ZXMuXG4gKlxuICogVEhFIFdJTkRPVyBJUyBUSEUgU0VSVkVSJ1MsIE5PVCBPVVJTLiBJdCBjb21lcyBmcm9tIHRoZSByZXNwb25zZTogYHMtbWF4YWdlYCBpcyB0aGVcbiAqIGZyZXNobmVzcyB0aGUgc2VydmVyIHByb21pc2VkLCBhbmQgYEFnZWAgaXMgaG93IG11Y2ggb2YgaXQgYSBDRE4gYWxyZWFkeSBzcGVudCBiZWZvcmVcbiAqIHRoZSBieXRlcyByZWFjaGVkIHVzLiBUaGUgd2luZG93IHdlIG1heSBrZWVwIGlzIHRoZXJlZm9yZSBgcy1tYXhhZ2UgLSBBZ2VgLCBuZXZlclxuICogYHMtbWF4YWdlYCBcdTIwMTQgb3RoZXJ3aXNlIGEgY29weSB0aGF0IHNhdCBhdCB0aGUgZWRnZSBmb3IgNTUgb2YgaXRzIDYwIHNlY29uZHMgd291bGQgYmVcbiAqIGhlbGQgZm9yIGFub3RoZXIgNjAgaGVyZSwgYW5kIGEgcHVibGlzaCB3b3VsZCB0YWtlIHR3aWNlIGFzIGxvbmcgdG8gYmUgc2VlbiBhcyBwcm9taXNlZC5cbiAqIFRoaXMgaXMgdGhlIHNpbmdsZSBlYXNpZXN0IHRoaW5nIHRvIGdldCB3cm9uZyBpbiBhIGNsaWVudCBjYWNoZSwgYW5kIGl0IGlzIGludmlzaWJsZSBpblxuICogdGVzdGluZyBiZWNhdXNlIGl0IG9ubHkgc2hvd3MgdXAgYXMgXCJzb21ldGltZXMgc3RhbGVcIi5cbiAqXG4gKiBJbmRleGVkREIsIG5vdCBsb2NhbFN0b3JhZ2U6IGNvbXBvbmVudHMgcnVuIHRvIGh1bmRyZWRzIG9mIEtCLCBsb2NhbFN0b3JhZ2UgY2FwcyBhcm91bmRcbiAqIDUgTUIgYW5kIGJsb2NrcyB0aGUgbWFpbiB0aHJlYWQuIEV2ZXJ5IHBhdGggZGVncmFkZXMgdG8gdGhlIG5ldHdvcmsgXHUyMDE0IGEgYnJvd3NlciBpblxuICogcHJpdmF0ZSBtb2RlLCB3aXRoIHN0b3JhZ2UgZGlzYWJsZWQgb3Igb3ZlciBxdW90YSwgbXVzdCByZW5kZXIgdGhlIHBhZ2UsIG5vdCBmYWlsIGl0LlxuICovXG5cbmNvbnN0IERCX05BTUUgPSAnbXlvcC1kZWxpdmVyeSc7XG5jb25zdCBTVE9SRSA9ICdjb21wb25lbnRzJztcbmNvbnN0IERCX1ZFUlNJT04gPSAxO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JlZEVudHJ5IHtcbiAgICBrZXk6IHN0cmluZztcbiAgICAvKiogdGhlIHJlc29sdmVkIGNvbXBvbmVudCBjb25maWcsIGV4YWN0bHkgYXMgdGhlIG5ldHdvcmsgcGF0aCBwcm9kdWNlcyBpdCAqL1xuICAgIGNvbmZpZzogYW55O1xuICAgIC8qKiB0aGUgc2VydmVyJ3MgdmVyc2lvbiB0b2tlbiBmb3IgdGhlc2UgYnl0ZXM6IGA8cmV2Pn48b3B0PmAgKi9cbiAgICB0YWc6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIHdoZW4gdGhpcyBicm93c2VyIHN0b3JlZCBpdCAqL1xuICAgIHN0b3JlZEF0OiBudW1iZXI7XG4gICAgLyoqIGhvdyBsb25nIGl0IG1heSBiZSB1c2VkIHdpdGhvdXQgYXNraW5nLCBpbiBtcyAoYWxyZWFkeSBBZ2UtYWRqdXN0ZWQpICovXG4gICAgd2luZG93TXM6IG51bWJlcjtcbiAgICAvKiogd2hpY2ggaG9zdCBwcm9kdWNlZCBpdCBcdTIwMTQgYSBrZXkgZnJvbSBhbm90aGVyIGhvc3QgaXMgbmV2ZXIgcmV1c2VkICovXG4gICAgaG9zdDogc3RyaW5nO1xuICAgIC8qKiB3aXJlIHNpemUgb2YgdGhlIHJlc3BvbnNlIGl0IGNhbWUgZnJvbSwgc28gc3RhdHMgY2FuIHNheSB3aGF0IHRoZSB3aW5kb3cgc2F2ZWQgKi9cbiAgICBieXRlcz86IG51bWJlcjtcbn1cblxubGV0IGRiUHJvbWlzZTogUHJvbWlzZTxJREJEYXRhYmFzZSB8IG51bGw+IHwgbnVsbCA9IG51bGw7XG5cbmZ1bmN0aW9uIG9wZW5EYigpOiBQcm9taXNlPElEQkRhdGFiYXNlIHwgbnVsbD4ge1xuICAgIGlmIChkYlByb21pc2UpIHJldHVybiBkYlByb21pc2U7XG4gICAgZGJQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5kZXhlZERCID09PSAndW5kZWZpbmVkJykgcmV0dXJuIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICBjb25zdCByZXEgPSBpbmRleGVkREIub3BlbihEQl9OQU1FLCBEQl9WRVJTSU9OKTtcbiAgICAgICAgICAgIHJlcS5vbnVwZ3JhZGVuZWVkZWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGIgPSByZXEucmVzdWx0O1xuICAgICAgICAgICAgICAgIGlmICghZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhTVE9SRSkpIGRiLmNyZWF0ZU9iamVjdFN0b3JlKFNUT1JFLCB7IGtleVBhdGg6ICdrZXknIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlcS5vbnN1Y2Nlc3MgPSAoKSA9PiByZXNvbHZlKHJlcS5yZXN1bHQpO1xuICAgICAgICAgICAgcmVxLm9uZXJyb3IgPSAoKSA9PiByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgLy8gQSBibG9ja2VkIHVwZ3JhZGUgbXVzdCBub3QgaGFuZyB0aGUgcGFnZSBsb2FkLlxuICAgICAgICAgICAgcmVxLm9uYmxvY2tlZCA9ICgpID0+IHJlc29sdmUobnVsbCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkYlByb21pc2U7XG59XG5cbmZ1bmN0aW9uIHR4PFQ+KG1vZGU6IElEQlRyYW5zYWN0aW9uTW9kZSwgZm46IChzdG9yZTogSURCT2JqZWN0U3RvcmUpID0+IElEQlJlcXVlc3QpOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gICAgcmV0dXJuIG9wZW5EYigpLnRoZW4oZGIgPT4gbmV3IFByb21pc2U8VCB8IG51bGw+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGlmICghZGIpIHJldHVybiByZXNvbHZlKG51bGwpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdCA9IGRiLnRyYW5zYWN0aW9uKFNUT1JFLCBtb2RlKTtcbiAgICAgICAgICAgIGNvbnN0IHJlcSA9IGZuKHQub2JqZWN0U3RvcmUoU1RPUkUpKTtcbiAgICAgICAgICAgIHJlcS5vbnN1Y2Nlc3MgPSAoKSA9PiByZXNvbHZlKHJlcS5yZXN1bHQgYXMgVCk7XG4gICAgICAgICAgICByZXEub25lcnJvciA9ICgpID0+IHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICB0Lm9uYWJvcnQgPSAoKSA9PiByZXNvbHZlKG51bGwpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgIH1cbiAgICB9KSk7XG59XG5cbi8qKlxuICogQSBTWU5DSFJPTk9VUyBzaGFkb3cgb2Ygd2hhdCB3ZSBob2xkLCBmb3IgY29kZSB0aGF0IHJ1bnMgYmVmb3JlIEluZGV4ZWREQiBjYW4gYW5zd2VyLlxuICpcbiAqIFRoZSBwYWdlJ3MgSFRNTCBjYW4gc3RhcnQgdGhlIGNvbXBvbmVudCByZXF1ZXN0IHdoaWxlIHRoZSBKUyBidW5kbGUgaXMgc3RpbGwgZG93bmxvYWRpbmdcbiAqIFx1MjAxNCBidXQgb25seSBpZiBpdCBrbm93cywgYXQgcGFyc2UgdGltZSwgd2hldGhlciBhIHJlcXVlc3QgaXMgbmVlZGVkIGF0IGFsbCBhbmQgd2hpY2ggb25lLlxuICogSW5kZXhlZERCIGlzIGFzeW5jLCBzbyBhbiBpbmxpbmUgc2NyaXB0IGNhbm5vdCBhc2sgaXQuIGxvY2FsU3RvcmFnZSBjYW4gYmUgcmVhZFxuICogc3luY2hyb25vdXNseSwgc28gZWFjaCBlbnRyeSBtaXJyb3JzIHR3byB0aW55IGZhY3RzIGhlcmU6IHRoZSB2ZXJzaW9uIHRhZyBhbmQgd2hlbiB0aGVcbiAqIHdpbmRvdyBlbmRzLiBOb3RoaW5nIGVsc2UgXHUyMDE0IHRoZSBjb21wb25lbnQgaXRzZWxmIHN0YXlzIGluIEluZGV4ZWREQiB3aGVyZSBpdCBiZWxvbmdzLlxuICpcbiAqIFdpdGhvdXQgdGhpcyB0aGUgcHJlbG9hZCBoaW50IGlzIGFjdGl2ZWx5IGhhcm1mdWw6IGl0IGRvd25sb2FkcyB0aGUgd2hvbGUgY29tcG9uZW50XG4gKiBldmVyeSB0aW1lLCBpbmNsdWRpbmcgb24gdGhlIHZpc2l0cyB3aGVyZSB0aGUgc3RvcmVkIGNvcHkgd2FzIGdvaW5nIHRvIGFuc3dlciBmb3IgZnJlZS5cbiAqIE1lYXN1cmVkIG9uIG15b3AuZGV2IGJlZm9yZSBpdCBleGlzdGVkIFx1MjAxNCA5OCBLQiBmZXRjaGVkLCB0aGVuIGRpc2NhcmRlZCwgb24gZXZlcnkgcmVsb2FkLlxuICovXG5jb25zdCBISU5UX1BSRUZJWCA9ICdteW9wLmQuJztcblxuZnVuY3Rpb24gd3JpdGVIaW50KGtleTogc3RyaW5nLCB0YWc6IHN0cmluZyB8IG51bGwsIGV4cGlyZXNBdDogbnVtYmVyKSB7XG4gICAgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oSElOVF9QUkVGSVggKyBrZXksIEpTT04uc3RyaW5naWZ5KHsgdDogdGFnLCBlOiBleHBpcmVzQXQgfSkpOyB9XG4gICAgY2F0Y2ggeyAvKiBwcml2YXRlIG1vZGUsIHF1b3RhLCBkaXNhYmxlZCBcdTIwMTQgdGhlIGhpbnQgaXMgYW4gb3B0aW1pc2F0aW9uLCBuZXZlciBhIHJlcXVpcmVtZW50ICovIH1cbn1cblxuZnVuY3Rpb24gY2xlYXJIaW50KGtleTogc3RyaW5nKSB7XG4gICAgdHJ5IHsgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oSElOVF9QUkVGSVggKyBrZXkpOyB9IGNhdGNoIHsgLyogYXMgYWJvdmUgKi8gfVxufVxuXG4vKiogQSBtZW1vcnkgbGF5ZXIgaW4gZnJvbnQgb2Ygc3RvcmFnZTogYSBzZWNvbmQgY29tcG9uZW50IG9uIHRoZSBzYW1lIHBhZ2UgbXVzdCBub3Qgd2FpdCBvbiBJTy4gKi9cbmNvbnN0IG1lbW9yeSA9IG5ldyBNYXA8c3RyaW5nLCBTdG9yZWRFbnRyeT4oKTtcblxuZXhwb3J0IGNvbnN0IGRlbGl2ZXJ5U3RvcmUgPSB7XG4gICAga2V5KGhvc3Q6IHN0cmluZywgY29tcG9uZW50SWQ6IHN0cmluZywgZW52OiBzdHJpbmcsIHByZXZpZXc6IGJvb2xlYW4sIG9wdDogc3RyaW5nKSB7XG4gICAgICAgIC8vIFRoZSBIT1NUIGlzIHBhcnQgb2YgdGhlIGtleS4gVHdvIHN0YWNrcyBjYW4gc2VydmUgdGhlIHNhbWUgY29tcG9uZW50IHdpdGhcbiAgICAgICAgLy8gZGlmZmVyZW50IGZyZXNobmVzcywgYW5kIGVudHJpZXMgZnJvbSBvbmUgbXVzdCBuZXZlciBiZSByZWFkIGFzIHRoZSBvdGhlcidzLlxuICAgICAgICByZXR1cm4gYCR7aG9zdH18JHtjb21wb25lbnRJZH18JHtlbnZ9fCR7cHJldmlldyA/ICdwcmV2aWV3JyA6ICdsaXZlJ318JHtvcHQgfHwgJ3Jhdyd9YDtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxTdG9yZWRFbnRyeSB8IG51bGw+IHtcbiAgICAgICAgY29uc3QgbSA9IG1lbW9yeS5nZXQoa2V5KTtcbiAgICAgICAgaWYgKG0pIHJldHVybiBtO1xuICAgICAgICBjb25zdCBlID0gYXdhaXQgdHg8U3RvcmVkRW50cnk+KCdyZWFkb25seScsIHMgPT4gcy5nZXQoa2V5KSk7XG4gICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICBtZW1vcnkuc2V0KGtleSwgZSk7XG4gICAgICAgICAgICAvLyBTRUxGLUhFQUwuIFRoZSB0d28gc3RvcmVzIGNhbiBkaXNhZ3JlZTogYW4gZW50cnkgd3JpdHRlbiBiZWZvcmUgdGhlIGhpbnRcbiAgICAgICAgICAgIC8vIGV4aXN0ZWQsIGEgYnJvd3NlciB0aGF0IGV2aWN0ZWQgbG9jYWxTdG9yYWdlIGJ1dCBub3QgSW5kZXhlZERCLCBhIHVzZXIgd2hvXG4gICAgICAgICAgICAvLyBjbGVhcmVkIG9uZS4gQSBtaXNzaW5nIGhpbnQgbWFrZXMgdGhlIHByZWxvYWQgZmFsbCBiYWNrIHRvIHRoZSBGVUxMIGNvbXBvbmVudFxuICAgICAgICAgICAgLy8gd2hpbGUgdGhlIFNESywgd2hpY2ggY2FuIHNlZSBJbmRleGVkREIsIG9ubHkgd2FudHMgdGhlIHZlcnNpb24gY2hlY2sgLS0gdHdvXG4gICAgICAgICAgICAvLyByZXF1ZXN0cyB3aGVyZSB0aGVyZSBzaG91bGQgYmUgb25lLiBTZWVuIGluIHRoZSB3aWxkIG9uIHRoZSBmaXJzdCBsb2FkIGFmdGVyXG4gICAgICAgICAgICAvLyB0aGUgaGludCBzaGlwcGVkLiBSZXdyaXRpbmcgaXQgaGVyZSBjb3N0cyBub3RoaW5nIGFuZCBjbG9zZXMgdGhlIGdhcCBmb3IgZ29vZC5cbiAgICAgICAgICAgIHdyaXRlSGludChrZXksIGUudGFnLCBlLnN0b3JlZEF0ICsgZS53aW5kb3dNcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgfSxcblxuICAgIGFzeW5jIHB1dChlbnRyeTogU3RvcmVkRW50cnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbWVtb3J5LnNldChlbnRyeS5rZXksIGVudHJ5KTtcbiAgICAgICAgd3JpdGVIaW50KGVudHJ5LmtleSwgZW50cnkudGFnLCBlbnRyeS5zdG9yZWRBdCArIGVudHJ5LndpbmRvd01zKTtcbiAgICAgICAgYXdhaXQgdHgoJ3JlYWR3cml0ZScsIHMgPT4gcy5wdXQoZW50cnkpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZHJvcChrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBtZW1vcnkuZGVsZXRlKGtleSk7XG4gICAgICAgIGNsZWFySGludChrZXkpO1xuICAgICAgICBhd2FpdCB0eCgncmVhZHdyaXRlJywgcyA9PiBzLmRlbGV0ZShrZXkpKTtcbiAgICB9LFxuXG4gICAgLyoqIFN0aWxsIHVzYWJsZSB3aXRob3V0IGFza2luZyB0aGUgc2VydmVyPyAqL1xuICAgIGZyZXNoKGU6IFN0b3JlZEVudHJ5IHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISFlICYmIChEYXRlLm5vdygpIC0gZS5zdG9yZWRBdCkgPCBlLndpbmRvd01zO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgd2luZG93IHRoaXMgcmVzcG9uc2UgbGljZW5zZXM6IHRoZSBzZXJ2ZXIncyBmcmVzaG5lc3MgbWludXMgd2hhdCBhIENETiBhbHJlYWR5XG4gICAgICogc3BlbnQuIFJldHVybnMgMCB3aGVuIHRoZSBzZXJ2ZXIgc2FpZCBub3RoaW5nIGFib3V0IGNhY2hpbmcsIHdoaWNoIG1lYW5zIFwiZG8gbm90XG4gICAgICogaG9sZCB0aGlzXCIgXHUyMDE0IHRoZSBzYWZlIHJlYWRpbmcsIGFuZCB3aGF0IHByb2R1Y3Rpb24gc2VuZHMgdG9kYXkuXG4gICAgICovXG4gICAgd2luZG93RnJvbShoZWFkZXJzOiBIZWFkZXJzKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgY2MgPSBoZWFkZXJzLmdldCgnY2FjaGUtY29udHJvbCcpIHx8ICcnO1xuICAgICAgICBpZiAoL25vLXN0b3JlfG5vLWNhY2hlL2kudGVzdChjYykpIHJldHVybiAwO1xuICAgICAgICBjb25zdCBtID0gL3MtbWF4YWdlXFxzKj1cXHMqKFxcZCspL2kuZXhlYyhjYykgfHwgL21heC1hZ2VcXHMqPVxccyooXFxkKykvaS5leGVjKGNjKTtcbiAgICAgICAgaWYgKCFtKSByZXR1cm4gMDtcbiAgICAgICAgY29uc3QgdG90YWwgPSBOdW1iZXIobVsxXSk7XG4gICAgICAgIGNvbnN0IGFnZSA9IE51bWJlcihoZWFkZXJzLmdldCgnYWdlJykgfHwgMCk7XG4gICAgICAgIHJldHVybiBNYXRoLm1heCgwLCAodG90YWwgLSAoaXNOYU4oYWdlKSA/IDAgOiBhZ2UpKSkgKiAxMDAwO1xuICAgIH0sXG5cbiAgICAvKiogRm9yIHRlc3RzIGFuZCBmb3IgYHJlZnJlc2goKWA6IGZvcmdldCBldmVyeXRoaW5nIHRoaXMgYnJvd3NlciBob2xkcy4gKi9cbiAgICBhc3luYyBjbGVhcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbWVtb3J5LmNsZWFyKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gbG9jYWxTdG9yYWdlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgayA9IGxvY2FsU3RvcmFnZS5rZXkoaSk7XG4gICAgICAgICAgICAgICAgaWYgKGsgJiYgay5zdGFydHNXaXRoKEhJTlRfUFJFRklYKSkgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggeyAvKiBub3RoaW5nIHRvIGNsZWFuIHVwIGlmIGl0IHdhcyBuZXZlciB3cml0YWJsZSAqLyB9XG4gICAgICAgIGF3YWl0IHR4KCdyZWFkd3JpdGUnLCBzID0+IHMuY2xlYXIoKSk7XG4gICAgfSxcbn07XG4iLCAiaW1wb3J0IHtcbiAgICBJQ29tcG9uZW50Q29uZmlnLFxuICAgIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZyxcbiAgICBJRGVkaWNhdGVkU2tpbkNvbmZpZyxcbiAgICBJUHJvcENvbmZpZyxcbiAgICBJU2tpbkNvbmZpZyxcbiAgICBJVXNlckZsb3csXG4gICAgUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMsXG4gICAgdjJfSVZhcmlhbnRDb25maWdcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHsgZGVsaXZlcnlTdG9yZSB9IGZyb20gXCIuL2RlbGl2ZXJ5U3RvcmVcIjtcblxuY29uc3QgY29udmVydFYyVmFyaWFudFRvQ29tcG9uZW50Q29uZmlnID0gKGNvbmZpZzogdjJfSVZhcmlhbnRDb25maWcpOiBJQ29tcG9uZW50Q29uZmlnID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbnN0YW5jZToge1xuICAgICAgICAgICAgaWQ6ICdhdXRvJyxcbiAgICAgICAgICAgIGNvbXBvbmVudElkOiBjb25maWcuY29tcG9uZW50SWQsXG4gICAgICAgICAgICBjb21wb25lbnROYW1lOiBjb25maWcubmFtZSxcblxuICAgICAgICAgICAgc2tpblNlbGVjdG9yOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0RlZGljYXRlZCcsXG4gICAgICAgICAgICAgICAgc2tpbjoge1xuICAgICAgICAgICAgICAgICAgICBpZDogJ3NraW5fYXV0b192Ml9jb252ZXJ0ZWQnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZ1xuXG4gICAgICAgIH0gYXMgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBpZDogY29uZmlnLmlkLFxuICAgICAgICAgICAgbmFtZTogY29uZmlnLm5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogY29uZmlnLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgcHJvcHM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnaW5fYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbXlvcF9pbml0X2ludGVyZmFjZScsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhbnknLFxuICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBhcyBJUHJvcENvbmZpZyxcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdvdXRfYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbXlvcF9jdGFfaGFuZGxlcicsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhbnknLFxuICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBhcyBJUHJvcENvbmZpZ1xuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHJlZnM6IFtdLFxuICAgICAgICAgICAgc2tpbnM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnc2tpbl9hdXRvX3YyX2NvbnZlcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdhdXRvX3YyX2NvbnZlcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogaGFuZGxlIGVtcHR5IDpcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBsb2FkZXI6IGNvbmZpZy5jb25zdW1lX3ZhcmlhbnRbMF0ubG9hZGVyXG4gICAgICAgICAgICAgICAgfSBhcyBJU2tpbkNvbmZpZ1xuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGRlZmF1bHRTa2luOiAwLFxuICAgICAgICAgICAgLy8gT25seSBgdWk6YCB0YWdzIGV2ZXIgcmVhY2ggdGhlIGNsaWVudDsgdGhlIHNlcnZlciBmaWx0ZXJzLCBhYnNlbnQgPSBub25lLlxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdWlUYWdzOiBBcnJheS5pc0FycmF5KGNvbmZpZy51aVRhZ3MpID8gY29uZmlnLnVpVGFncyA6IFtdXG4gICAgICAgIH0gYXMgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgICAgIG5hbWU6IGNvbmZpZy5uYW1lXG4gICAgfSBhcyBJQ29tcG9uZW50Q29uZmlnO1xufTtcblxuLyoqXG4gKiBDbG91ZFJlcG9zaXRvcnkgLSBVbmlmaWVkIGNsb3VkIGRhdGEgYWNjZXNzIGxheWVyIGZvciBNeW9wIGNvbXBvbmVudHNcbiAqXG4gKiBTdXBwb3J0cyBib3RoIHYyIChkZWZhdWx0KSBhbmQgdjEgbW9kZXM6XG4gKiAtIHYyOiBVc2VzIC9jb25zdW1lIGVuZHBvaW50IGZvciBmZXRjaGluZyB2YXJpYW50c1xuICogLSB2MTogVXNlcyAvZmxvdyBlbmRwb2ludCBmb3IgZmV0Y2hpbmcgdXNlciBmbG93c1xuICovXG4vLyBVc2UgYSBnbG9iYWwgc2luZ2xldG9uIHRvIGVuc3VyZSBvbmx5IG9uZSBDbG91ZFJlcG9zaXRvcnkuTWFpbiBleGlzdHNcbi8vIGV2ZW4gd2hlbiB0aGUgbW9kdWxlIGlzIGxvYWRlZCBtdWx0aXBsZSB0aW1lcyBieSBkaWZmZXJlbnQgYnVuZGxlcnNcbmNvbnN0IEdMT0JBTF9LRVkgPSAnX19NWU9QX0NMT1VEX1JFUE9TSVRPUllfTUFJTl9fJztcblxuY29uc3QgZ2V0R2xvYmFsTWFpbiA9ICgpOiBDbG91ZFJlcG9zaXRvcnkgfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gKHdpbmRvdyBhcyBhbnkpW0dMT0JBTF9LRVldO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiAoZ2xvYmFsVGhpcyBhcyBhbnkpW0dMT0JBTF9LRVldO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuY29uc3Qgc2V0R2xvYmFsTWFpbiA9IChpbnN0YW5jZTogQ2xvdWRSZXBvc2l0b3J5KSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICh3aW5kb3cgYXMgYW55KVtHTE9CQUxfS0VZXSA9IGluc3RhbmNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIChnbG9iYWxUaGlzIGFzIGFueSlbR0xPQkFMX0tFWV0gPSBpbnN0YW5jZTtcbiAgICB9XG59O1xuXG5leHBvcnQgY2xhc3MgQ2xvdWRSZXBvc2l0b3J5IHtcbiAgICBwcml2YXRlIHN0YXRpYyBfbWFpbjogQ2xvdWRSZXBvc2l0b3J5IHwgbnVsbCA9IG51bGw7XG5cbiAgICBzdGF0aWMgZ2V0IE1haW4oKTogQ2xvdWRSZXBvc2l0b3J5IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgYSBnbG9iYWwgaW5zdGFuY2UgYWxyZWFkeSBleGlzdHMgKGZyb20gYW5vdGhlciBidW5kbGUpXG4gICAgICAgIGNvbnN0IGdsb2JhbE1haW4gPSBnZXRHbG9iYWxNYWluKCk7XG4gICAgICAgIGlmIChnbG9iYWxNYWluKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2xvYmFsTWFpbjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSBuZXcgaW5zdGFuY2UgaWYgbmVlZGVkXG4gICAgICAgIGlmICghQ2xvdWRSZXBvc2l0b3J5Ll9tYWluKSB7XG4gICAgICAgICAgICBDbG91ZFJlcG9zaXRvcnkuX21haW4gPSBuZXcgQ2xvdWRSZXBvc2l0b3J5KCk7XG4gICAgICAgICAgICBzZXRHbG9iYWxNYWluKENsb3VkUmVwb3NpdG9yeS5fbWFpbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENsb3VkUmVwb3NpdG9yeS5fbWFpbjtcbiAgICB9XG5cbiAgICAvLyB2MiBjYWNoZSAtIGtleWVkIGJ5IGNvbXBvbmVudElkOmVudjpwcmV2aWV3fGxpdmVcbiAgICAvLyBFYWNoIFByb21pc2UgaXMgdGFnZ2VkIHdpdGggYSBgcmVzb2x2ZWRgIHByb3BlcnR5IGFmdGVyIHNldHRsaW5nIChzZWUgZmV0Y2hDb21wb25lbnRWMikuXG4gICAgcHJpdmF0ZSB2YXJpYW50czogUmVjb3JkPHN0cmluZywgUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnPiAmIHsgcmVzb2x2ZWQ/OiBJQ29tcG9uZW50Q29uZmlnIH0+ID0ge307XG5cbiAgICAvLyBUcmFjayB3aGljaCBjb21wb25lbnRzIHdlcmUgcHJlbG9hZGVkIGFuZCB3aXRoIHdoYXQgcGFyYW1zXG4gICAgLy8gS2V5OiBjb21wb25lbnRJZCwgVmFsdWU6IHsgZW52LCBwcmV2aWV3IH1cbiAgICBwcml2YXRlIHByZWxvYWRlZENvbXBvbmVudHM6IFJlY29yZDxzdHJpbmcsIHsgZW52OiBzdHJpbmc7IHByZXZpZXc6IGJvb2xlYW4gfT4gPSB7fTtcblxuICAgIC8vIHYxIGNhY2hlXG4gICAgcHJpdmF0ZSB1c2VyRmxvd3M6IFJlY29yZDxzdHJpbmcsIFByb21pc2U8SVVzZXJGbG93Pj4gPSB7fTtcblxuICAgIHByaXZhdGUgX2RlZmF1bHRFbnYgPSAncHJvZHVjdGlvbic7XG4gICAgcHJpdmF0ZSBfZW52RXhwbGljaXRseVNldCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX3N0YXRpY01vZGUgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9xdWVyeVBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfYmFzZVVybCA9ICdodHRwczovL2Nsb3VkLm15b3AuZGV2Jykge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhvdyBiaWcgdGhlIGNvbXBvbmVudCB3ZSBhcmUgTk9UIHJlLWRvd25sb2FkaW5nIGlzLiBEZWxpYmVyYXRlbHkgbWVhc3VyZWQgZnJvbSB3aGF0XG4gICAgICogd2UgaG9sZCByYXRoZXIgdGhhbiBmcm9tIENvbnRlbnQtTGVuZ3RoOiBvbmNlIGEgcmVzcG9uc2UgaXMgY29tcHJlc3NlZCB0aGUgaGVhZGVyIGlzXG4gICAgICogbm90IHJlYWRhYmxlIGNyb3NzLW9yaWdpbiwgc28gcmVhZGluZyBpdCB0aGVyZSByZXBvcnRlZCAwIGV2ZXJ5IHNpbmdsZSB0aW1lLlxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIHNpemVPZkhlbGQoZTogYW55KTogbnVtYmVyIHtcbiAgICAgICAgdHJ5IHsgcmV0dXJuIChlPy5jb25maWc/LnR5cGU/LnNraW5zPy5bMF0/LmxvYWRlcj8uSFRNTCB8fCAnJykubGVuZ3RoOyB9IGNhdGNoIHsgcmV0dXJuIDA7IH1cbiAgICB9XG5cbiAgICAvKiogVGhlIGhvc3QgZXZlcnkgcmVxdWVzdCBnb2VzIHRvIHVubGVzcyBkZWxpdmVyeSgpIG1vdmVkIGl0LiBOZXZlciBjaGFuZ2VzLiAqL1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfSE9TVCA9ICdodHRwczovL2Nsb3VkLm15b3AuZGV2JztcblxuICAgIC8qKlxuICAgICAqIE9wdC1pbiBkZWxpdmVyeSBzZXR0aW5ncywgc2V0IGJ5IG15b3AuZGVsaXZlcnkoKS4gT2ZmIG1lYW5zOiB0aGlzIGZpbGUgYmVoYXZlc1xuICAgICAqIEVYQUNUTFkgYXMgaXQgZGlkIGJlZm9yZSBcdTIwMTQgc2FtZSBob3N0LCBzYW1lIFVSTCwgc2FtZSBldmVyeXRoaW5nLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2RlbGl2ZXJ5OiB7IG1pbmlmeTogYm9vbGVhbjsgaG9zdDogc3RyaW5nIHwgbnVsbDsgY2FjaGU6IGJvb2xlYW47IGZsb3c6IGJvb2xlYW4gfSA9XG4gICAgICAgIHsgbWluaWZ5OiBmYWxzZSwgaG9zdDogbnVsbCwgY2FjaGU6IGZhbHNlLCBmbG93OiBmYWxzZSB9O1xuXG4gICAgLyoqXG4gICAgICogV2hhdCBhY3R1YWxseSBoYXBwZW5lZCwgZm9yIG15b3AuZGVsaXZlcnkuc3RhdHMoKS4gYGZlbGxCYWNrYCBpcyB0aGUgbnVtYmVyIHRoYXRcbiAgICAgKiBtYXR0ZXJzOiBpdCBpcyBob3cgeW91IGZpbmQgb3V0IHRoZSBsYW5lIGlzIHVuaGVhbHRoeSB3aXRob3V0IHdhaXRpbmcgZm9yIGFcbiAgICAgKiBidWcgcmVwb3J0LCBiZWNhdXNlIGEgZmFsbGJhY2sgaXMgSU5WSVNJQkxFIHRvIHRoZSBwYWdlIChpdCBzdGlsbCByZW5kZXJzKS5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9kZWxpdmVyeVN0YXRzID0ge1xuICAgICAgICByZXF1ZXN0czogMCwgdmlhRGVsaXZlcnk6IDAsIGZlbGxCYWNrOiAwLCBsYXN0RXJyb3I6IG51bGwgYXMgc3RyaW5nIHwgbnVsbCxcbiAgICAgICAgLyoqIHdoZXJlIHRoZSBsYXN0IGxvYWRzIHdlcmUgYW5zd2VyZWQgZnJvbSBcdTIwMTQgdGhlIG51bWJlciB0aGUgY2xpZW50IHdpbmRvdyBleGlzdHMgdG8gbW92ZSAqL1xuICAgICAgICBmcm9tTWVtb3J5OiAwLCBmcm9tU3RvcmFnZTogMCwgZnJvbU5ldHdvcms6IDAsXG4gICAgICAgIC8qKiByZS1jaGVja3MgYWZ0ZXIgdGhlIHdpbmRvdyBlbmRlZCwgYW5kIGhvdyBtYW55IHdlcmUgYW5zd2VyZWQgXCJub3RoaW5nIGNoYW5nZWRcIiAqL1xuICAgICAgICByZXZhbGlkYXRpb25zOiAwLCB1bmNoYW5nZWQ6IDAsIGJ5dGVzU2F2ZWQ6IDAsXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFR1cm4gb24gdGhlIG9wdC1pbiBkZWxpdmVyeSBwYXRoLlxuICAgICAqXG4gICAgICogT3B0aW5nIGluIElTIGNob29zaW5nIHRoZSBkZWxpdmVyeSBzdGFjazogdGhpcyBwb2ludHMgL2NvbnN1bWUgYXQgYGhvc3RgIChhIHNlY29uZCxcbiAgICAgKiBjb21wbGV0ZSBzdGFjayByZWFkaW5nIHRoZSBzYW1lIGRhdGEpIGFuZCBhc2tzIGZvciB0aGUgbWluaWZpZWQgYXJ0aWZhY3QuIExlYXZlIHRoaXNcbiAgICAgKiB1bmNhbGxlZCBhbmQgbm90aGluZyBhYm91dCB0aGUgU0RLIGNoYW5nZXMuXG4gICAgICpcbiAgICAgKiBEZWxpYmVyYXRlbHkgbXV0YXRlcyBUSElTIGluc3RhbmNlIHJhdGhlciB0aGFuIGNvbnN0cnVjdGluZyBhIG5ldyByZXBvc2l0b3J5OlxuICAgICAqIENsb3VkUmVwb3NpdG9yeS5NYWluIGlzIGEgZ2xvYmFsIHNpbmdsZXRvbiBzaGFyZWQgYWNyb3NzIGJ1bmRsZXMgKHNlZSBnZXRHbG9iYWxNYWluKSxcbiAgICAgKiBzbyBhIHNlY29uZCBpbnN0YW5jZSB3b3VsZCBiZSBpZ25vcmVkIGJ5IGV2ZXJ5IGNvbXBvbmVudCBhbHJlYWR5IHVzaW5nIHRoZSBmaXJzdC5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHNldERlbGl2ZXJ5KG9wdHM6IHsgbWluaWZ5PzogYm9vbGVhbjsgaG9zdD86IHN0cmluZyB8IG51bGw7IGNhY2hlPzogYm9vbGVhbjsgZmxvdz86IGJvb2xlYW4gfSA9IHt9KSB7XG4gICAgICAgIGlmIChvcHRzLm1pbmlmeSAhPT0gdW5kZWZpbmVkKSB0aGlzLl9kZWxpdmVyeS5taW5pZnkgPSAhIW9wdHMubWluaWZ5O1xuICAgICAgICBpZiAob3B0cy5ob3N0ICE9PSB1bmRlZmluZWQpIHRoaXMuX2RlbGl2ZXJ5Lmhvc3QgPSBvcHRzLmhvc3Q7XG4gICAgICAgIGlmIChvcHRzLmNhY2hlICE9PSB1bmRlZmluZWQpIHRoaXMuX2RlbGl2ZXJ5LmNhY2hlID0gISFvcHRzLmNhY2hlO1xuICAgICAgICBpZiAob3B0cy5mbG93ICE9PSB1bmRlZmluZWQpIHRoaXMuX2RlbGl2ZXJ5LmZsb3cgPSAhIW9wdHMuZmxvdztcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgZGVsaXZlcnlTdGF0cygpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4udGhpcy5fZGVsaXZlcnlTdGF0cywgaG9zdDogdGhpcy5fZGVsaXZlcnkuaG9zdCA/PyBDbG91ZFJlcG9zaXRvcnkuREVGQVVMVF9IT1NULFxuICAgICAgICAgICAgICAgICBtaW5pZnk6IHRoaXMuX2RlbGl2ZXJ5Lm1pbmlmeSwgY2FjaGU6IHRoaXMuX2RlbGl2ZXJ5LmNhY2hlLCBmbG93OiB0aGlzLl9kZWxpdmVyeS5mbG93IH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9yZ2V0IHdoYXQgdGhpcyBicm93c2VyIGhvbGRzLCBzbyB0aGUgbmV4dCBsb2FkIGFza3MgdGhlIHNlcnZlci5cbiAgICAgKiBgcmVmcmVzaCgpYCB3aXRoIG5vIGlkcyBkcm9wcyBldmVyeXRoaW5nOyB0aGUgY291bnRlcnBhcnQgdG8gdGhlIHdpbmRvdyBmb3IgdGhlIGNhc2VcbiAgICAgKiB3aGVyZSBhIGNoYW5nZSBoYXMgdG8gYmUgdmlzaWJsZSBvbiBUSElTIGxvYWQgXHUyMDE0IHJpZ2h0IGFmdGVyIHNvbWVvbmUgcHVibGlzaGVzLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgcmVmcmVzaERlbGl2ZXJ5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCBkZWxpdmVyeVN0b3JlLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9jYWwgc2VydmVzIHdhaXRpbmcgdG8gYmUgcmVwb3J0ZWQ6IGNvbXBvbmVudElkIC0+IHtlbnYsIGNvdW50fS5cbiAgICAgKlxuICAgICAqIFRIRSBNRUFTVVJFTUVOVCBQUk9CTEVNIFRISVMgU09MVkVTLiBUaGUgYmV0dGVyIHRoaXMgY2FjaGUgd29ya3MsIHRoZSBtb3JlIHVzYWdlXG4gICAgICogdmFuaXNoZXM6IGEgdmlzaXRvciBpbnNpZGUgdGhlaXIgZnJlc2huZXNzIHdpbmRvdyByZW5kZXJzIHRoZSBwYWdlIHdpdGggbm8gcmVxdWVzdCxcbiAgICAgKiBzbyBuZWl0aGVyIHRoZSBzZXJ2ZXIgbm9yIHRoZSBDRE4gY2FuIHNlZSB0aGVtLiBMZWZ0IGFsb25lLCBhIHN1Y2Nlc3NmdWwgcm9sbG91dFxuICAgICAqIGxvb2tzIGluIHRoZSBsZWRnZXIgZXhhY3RseSBsaWtlIGN1c3RvbWVycyBsZWF2aW5nLlxuICAgICAqXG4gICAgICogU28gbG9jYWwgc2VydmVzIGFyZSBjb3VudGVkIGhlcmUgYW5kIHJlcG9ydGVkIGFmdGVyd2FyZHMsIGJhdGNoZWQsIG9uIGEgcGF0aCB0aGF0XG4gICAgICogbmV2ZXIgYmxvY2tzIHJlbmRlcmluZzogZmx1c2hlZCB3aGVuIHRoZSBwYWdlIGlzIGhpZGRlbiAoa2VlcGFsaXZlLCBzbyBpdCBzdXJ2aXZlc1xuICAgICAqIHRoZSB0YWIgY2xvc2luZykgYW5kIG9wcG9ydHVuaXN0aWNhbGx5IHdoZW5ldmVyIHRoZSBTREsgaXMgdGFsa2luZyB0byB0aGUgc2VydmVyXG4gICAgICogYW55d2F5LiBOb3RoaW5nIGlzIHNlbnQgd2hpbGUgdGhlIHBhZ2UgaXMgbG9hZGluZywgd2hpY2ggaXMgdGhlIHBvaW50IG9mIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfbG9jYWxTZXJ2ZXMgPSBuZXcgTWFwPHN0cmluZywge2lkOiBzdHJpbmc7IGVudjogc3RyaW5nOyBjb3VudDogbnVtYmVyOyBzb3VyY2U/OiAnaCd9PigpO1xuICAgIHByaXZhdGUgX2ZsdXNoQm91bmQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIGBzb3VyY2U6ICdoJ2AgPSB0aGUgdmlldyB3YXMgc2VydmVkIGZyb20gYSBjb25maWcgdGhlIHBhZ2UncyBTRVJWRVIgZW1iZWRkZWRcbiAgICAgKiAoaHlkcmF0ZVYxQ29tcG9uZW50KSwgbm90IGZyb20gdGhpcyBicm93c2VyJ3MgY2FjaGUgd2luZG93LiBSZXBvcnRlZCBhcyBhIDR0aCBiYXRjaFxuICAgICAqIGZpZWxkIChgaWQ6ZW52Om46aGApIHNvIG91ciB1c2FnZSBkYXRhIGNhbiB0ZWxsIHNlcnZlci1yZW5kZXJlZCB2aWV3cyBhcGFydDsgYSBzZXJ2ZXJcbiAgICAgKiB0aGF0IHByZWRhdGVzIGl0IHJlYWRzIHRoZSBmaXJzdCB0aHJlZSBmaWVsZHMgYW5kIGNvdW50cyB0aGUgdmlldyBhbGwgdGhlIHNhbWUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBub3RlTG9jYWxTZXJ2ZShjb21wb25lbnRJZDogc3RyaW5nLCBlbnY6IHN0cmluZywgc291cmNlPzogJ2gnKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHNvdXJjZSA/IGAke2NvbXBvbmVudElkfToke3NvdXJjZX1gIDogY29tcG9uZW50SWQ7XG4gICAgICAgIGNvbnN0IGN1ciA9IHRoaXMuX2xvY2FsU2VydmVzLmdldChrZXkpO1xuICAgICAgICBpZiAoY3VyKSBjdXIuY291bnQrKztcbiAgICAgICAgZWxzZSB0aGlzLl9sb2NhbFNlcnZlcy5zZXQoa2V5LCB7aWQ6IGNvbXBvbmVudElkLCBlbnYsIGNvdW50OiAxLCBzb3VyY2V9KTtcbiAgICAgICAgdGhpcy5iaW5kRmx1c2goKTtcbiAgICB9XG5cbiAgICAvKiogUmVwb3J0IG9uIHBhZ2UtaGlkZSwgd2hpY2ggaXMgdGhlIG9ubHkgZXZlbnQgdGhhdCByZWxpYWJseSBmaXJlcyBvbiBtb2JpbGUuICovXG4gICAgcHJpdmF0ZSBiaW5kRmx1c2goKSB7XG4gICAgICAgIGlmICh0aGlzLl9mbHVzaEJvdW5kIHx8IHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICAgICAgdGhpcy5fZmx1c2hCb3VuZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IG9uSGlkZSA9ICgpID0+IHsgaWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ2hpZGRlbicpIHRoaXMuZmx1c2hMb2NhbFNlcnZlcygpOyB9O1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgb25IaWRlKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BhZ2VoaWRlJywgKCkgPT4gdGhpcy5mbHVzaExvY2FsU2VydmVzKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbmQgd2hhdCB3ZSBoYXZlLiBga2VlcGFsaXZlYCBpcyB3aGF0IG1ha2VzIHRoaXMgd29yayBhdCBwYWdlLWhpZGU6IHRoZSByZXF1ZXN0XG4gICAgICogb3V0bGl2ZXMgdGhlIGRvY3VtZW50LiBGYWlsdXJlIGlzIGlnbm9yZWQgXHUyMDE0IGEgbG9zdCB1c2FnZSByZXBvcnQgbXVzdCBuZXZlciBiZVxuICAgICAqIHZpc2libGUgdG8gYSB2aXNpdG9yLCBhbmQgdGhlIG5leHQgcGFnZSBsb2FkIHdpbGwgcmVwb3J0IGl0cyBvd24uXG4gICAgICovXG4gICAgZmx1c2hMb2NhbFNlcnZlcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLl9sb2NhbFNlcnZlcy5zaXplKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGJhdGNoID0gWy4uLnRoaXMuX2xvY2FsU2VydmVzLmVudHJpZXMoKV1cbiAgICAgICAgICAgIC5tYXAoKFssIHZdKSA9PiBgJHt2LmlkfToke3YuZW52fToke3YuY291bnR9JHt2LnNvdXJjZSA/ICc6JyArIHYuc291cmNlIDogJyd9YCkuam9pbignLCcpO1xuICAgICAgICB0aGlzLl9sb2NhbFNlcnZlcy5jbGVhcigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5kZWxpdmVyeUhvc3QoKX0vY2xpZW50VXNhZ2U/Yj0ke2VuY29kZVVSSUNvbXBvbmVudChiYXRjaCl9YDtcbiAgICAgICAgICAgIGZldGNoKHVybCwge2tlZXBhbGl2ZTogdHJ1ZSwgbW9kZTogJ2NvcnMnLCBjcmVkZW50aWFsczogJ29taXQnfSkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICB9IGNhdGNoIHsgLyogbmV2ZXIgdGhlIHZpc2l0b3IncyBwcm9ibGVtICovIH1cbiAgICB9XG5cbiAgICAvKiogV2hlcmUgL2NvbnN1bWUgc2hvdWxkIGJlIGZldGNoZWQgZnJvbSByaWdodCBub3cuICovXG4gICAgcHJpdmF0ZSBkZWxpdmVyeUhvc3QoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGl2ZXJ5Lmhvc3QgfHwgdGhpcy5fYmFzZVVybDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhIGRlbGl2ZXJ5IFVSTCB3aXRoIE9ORSBmYWxsYmFjayB0byB0aGUgZGVmYXVsdCBob3N0LlxuICAgICAqXG4gICAgICogVGhlIGZhbGxiYWNrIGlzIHRoZSBraWxsIHN3aXRjaDogYnJlYWsgb3IgZGlzYWJsZSB0aGUgbGFuZSBhbmQgZXZlcnkgY2xpZW50IGRyaWZ0c1xuICAgICAqIGJhY2sgdG8gY2xvdWQubXlvcC5kZXYgb24gaXRzIG93biwgd2l0aCBubyBjdXN0b21lciBkZXBsb3kuIEl0IG11c3QgdGhlcmVmb3JlIGJlXG4gICAgICogZ2VudWluZWx5IHNpbGVudCB0byB0aGUgcGFnZSBhbmQgZ2VudWluZWx5IExPVUQgaW4gc3RhdHMoKSBcdTIwMTQgYSBmYWxsYmFjayB0aGF0IG5vYm9keVxuICAgICAqIGNvdW50cyBpcyBhbiBvdXRhZ2Ugbm9ib2R5IG5vdGljZXMuXG4gICAgICpcbiAgICAgKiBPbmx5IHRyYW5zcG9ydCBmYWlsdXJlcyBhbmQgNXh4IGZhbGwgYmFjay4gQSA0MDQgaXMgYW4gYW5zd2VyOiB0aGUgY29tcG9uZW50IHJlYWxseVxuICAgICAqIGlzIG1pc3NpbmcsIGFuZCByZXRyeWluZyBlbHNld2hlcmUgd291bGQgb25seSBoaWRlIGl0LlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgZGVsaXZlcnlGZXRjaChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgICAgIC8vIFdlIGFyZSBhYm91dCB0byB1c2UgdGhlIG5ldHdvcmsgYW55d2F5OiBhIGdvb2QgbW9tZW50IHRvIGhhbmQgb3ZlciB3aGF0ZXZlciB0aGVcbiAgICAgICAgLy8gd2luZG93IHNlcnZlZCBvZmZsaW5lLCByYXRoZXIgdGhhbiB3YWl0aW5nIGZvciB0aGUgcGFnZSB0byBiZSBjbG9zZWQuXG4gICAgICAgIGlmICh0aGlzLl9sb2NhbFNlcnZlcy5zaXplKSB0aGlzLmZsdXNoTG9jYWxTZXJ2ZXMoKTtcbiAgICAgICAgY29uc3QgaG9zdCA9IHRoaXMuZGVsaXZlcnlIb3N0KCk7XG4gICAgICAgIGNvbnN0IHByaW1hcnkgPSBgJHtob3N0fSR7cGF0aH1gO1xuICAgICAgICB0aGlzLl9kZWxpdmVyeVN0YXRzLnJlcXVlc3RzKys7XG4gICAgICAgIGNvbnN0IHVzaW5nTGFuZSA9IGhvc3QgIT09IHRoaXMuX2Jhc2VVcmw7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChwcmltYXJ5KTtcbiAgICAgICAgICAgIGlmIChyZXMub2sgfHwgcmVzLnN0YXR1cyA8IDUwMCB8fCAhdXNpbmdMYW5lKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVzaW5nTGFuZSAmJiByZXMub2spIHRoaXMuX2RlbGl2ZXJ5U3RhdHMudmlhRGVsaXZlcnkrKztcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZGVsaXZlcnlTdGF0cy5sYXN0RXJyb3IgPSBgSFRUUCAke3Jlcy5zdGF0dXN9IGZyb20gJHtob3N0fWA7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgaWYgKCF1c2luZ0xhbmUpIHRocm93IGU7XG4gICAgICAgICAgICB0aGlzLl9kZWxpdmVyeVN0YXRzLmxhc3RFcnJvciA9IFN0cmluZyhlPy5tZXNzYWdlID8/IGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RlbGl2ZXJ5U3RhdHMuZmVsbEJhY2srKztcbiAgICAgICAgY29uc29sZS53YXJuKGBbbXlvcF0gZGVsaXZlcnkgaG9zdCBmYWlsZWQgKCR7dGhpcy5fZGVsaXZlcnlTdGF0cy5sYXN0RXJyb3J9KSBcdTIwMTQgZmFsbGluZyBiYWNrIHRvICR7dGhpcy5fYmFzZVVybH1gKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZldGNoKGAke3RoaXMuX2Jhc2VVcmx9JHtwYXRofWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZSBzdGF0aWMgbW9kZSBmb3Igc2VsZi1ob3N0ZWQgY29tcG9uZW50IHJlZ2lzdHJpZXMuXG4gICAgICogSW4gc3RhdGljIG1vZGUsIFVSTHMgYXJlIGNvbnN0cnVjdGVkIGFzIGZpbGUgcGF0aHMgaW5zdGVhZCBvZiBxdWVyeSBwYXJhbXM6XG4gICAgICogYCR7YmFzZVVybH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS8ke2Vudn0uanNvbmBcbiAgICAgKi9cbiAgICBlbmFibGVTdGF0aWNNb2RlKCkge1xuICAgICAgICB0aGlzLl9zdGF0aWNNb2RlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgcXVlcnkgcGFyYW1ldGVycyB0byBhcHBlbmQgdG8gYWxsIGZldGNoIFVSTHMgKGUuZy4gZm9yIENETiBjYWNoZSBidXN0aW5nKS5cbiAgICAgKiBFeGFtcGxlOiBgc2V0UXVlcnlQYXJhbXMoeyBsYXN0dXBkYXRlOiAnMTExMTIwMjYnIH0pYFxuICAgICAqL1xuICAgIHNldFF1ZXJ5UGFyYW1zKHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xuICAgICAgICB0aGlzLl9xdWVyeVBhcmFtcyA9IHBhcmFtcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGRlZmF1bHQgZW52aXJvbm1lbnQgZm9yIHRoaXMgQ2xvdWRSZXBvc2l0b3J5IGluc3RhbmNlXG4gICAgICovXG4gICAgc2V0RW52aXJvbm1lbnQoZW52OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdEVudiA9IGVudjtcbiAgICAgICAgdGhpcy5fZW52RXhwbGljaXRseVNldCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IGRlZmF1bHQgZW52aXJvbm1lbnRcbiAgICAgKi9cbiAgICBnZXREZWZhdWx0RW52aXJvbm1lbnQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRFbnY7XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09IFYyIE1ldGhvZHMgKERlZmF1bHQpID09PT09PT09PT09PVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSBjb21wb25lbnQgaXMgYWxyZWFkeSBjYWNoZWQvcHJlbG9hZGVkICh2MilcbiAgICAgKiBJZiBlbnYgYW5kIHByZXZpZXcgYXJlIG5vdCBwcm92aWRlZCwgY2hlY2tzIGlmIEFOWSB2ZXJzaW9uIGlzIHByZWxvYWRlZFxuICAgICAqL1xuICAgIGlzUHJlbG9hZGVkKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgICAgLy8gSWYgc3BlY2lmaWMgZW52L3ByZXZpZXcgcmVxdWVzdGVkLCBjaGVjayBleGFjdCBtYXRjaFxuICAgICAgICBpZiAoZW52ICE9PSB1bmRlZmluZWQgfHwgcHJldmlldyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBjYWNoZUtleSA9IGAke2NvbXBvbmVudElkfToke2VudiB8fCB0aGlzLl9kZWZhdWx0RW52fToke3ByZXZpZXcgPyAncHJldmlldycgOiAnbGl2ZSd9YDtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZUtleSBpbiB0aGlzLnZhcmlhbnRzO1xuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyd2lzZSBjaGVjayBpZiBhbnkgdmVyc2lvbiB3YXMgcHJlbG9hZGVkXG4gICAgICAgIHJldHVybiBjb21wb25lbnRJZCBpbiB0aGlzLnByZWxvYWRlZENvbXBvbmVudHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBwcmVsb2FkZWQgcGFyYW1zIGZvciBhIGNvbXBvbmVudCAoaWYgcHJlbG9hZGVkKVxuICAgICAqIFJldHVybnMgdW5kZWZpbmVkIGlmIG5vdCBwcmVsb2FkZWRcbiAgICAgKi9cbiAgICBnZXRQcmVsb2FkZWRQYXJhbXMoY29tcG9uZW50SWQ6IHN0cmluZyk6IHsgZW52OiBzdHJpbmc7IHByZXZpZXc6IGJvb2xlYW4gfSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZWxvYWRlZENvbXBvbmVudHNbY29tcG9uZW50SWRdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmUgYSBjb21wb25lbnQgY29uZmlnOiBmZXRjaCBpdCBvbmNlLCB0aGVuIHNlcnZlIGl0IGZyb20gdGhpc1xuICAgICAqIHJlcG9zaXRvcnkncyBjYWNoZS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdGhlIG5hbWUgdG8gdXNlLiBgZmV0Y2hDb21wb25lbnRWMmAgaXMgdGhlIHNhbWUgbWV0aG9kIHVuZGVyIGl0c1xuICAgICAqIHZlcnNpb25lZCBuYW1lIGFuZCBzdGF5cyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBcdTIwMTQgbm90ZSB0aGF0IHRoZVxuICAgICAqIHVudmVyc2lvbmVkIGBmZXRjaENvbXBvbmVudGAgaXMgYSAqZGVwcmVjYXRlZCB2MSogQVBJIGFuZCBpcyBOT1QgdGhpcy5cbiAgICAgKlxuICAgICAqIENvbXBsZXRlcyB0aGUgdHJpbyB3aXRoIHtAbGluayBnZXRSZXNvbHZlZENvbmZpZ30gKHN5bmNocm9ub3VzIHJlYWQgb2YgYW5cbiAgICAgKiBhbHJlYWR5LXJlc29sdmVkIGNvbmZpZykgYW5kIHtAbGluayBoeWRyYXRlQ29tcG9uZW50fSAoc2VlZCBvbmUgeW91XG4gICAgICogYWxyZWFkeSBob2xkKS5cbiAgICAgKlxuICAgICAqIFByZWZlciB0aGUgbW9kdWxlLWxldmVsIGBwcmVsb2FkQ29tcG9uZW50cyhbaWRdKWAgaW4gYXBwIGNvZGU7IHJlYWNoIGZvclxuICAgICAqIHRoaXMgd2hlbiB5b3UgbmVlZCBhbiBpc29sYXRlZCByZXBvc2l0b3J5IGluc3RhbmNlIHdob3NlIGNhY2hlIGxpZmV0aW1lXG4gICAgICogeW91IGNvbnRyb2wgXHUyMDE0IGEgc2VydmVyIHdpdGggaXRzIG93biBUVEwsIGZvciBleGFtcGxlLlxuICAgICAqL1xuICAgIGFzeW5jIHJlc29sdmVDb21wb25lbnQoY29tcG9uZW50SWQ6IHN0cmluZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IFByb21pc2U8SUNvbXBvbmVudENvbmZpZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaENvbXBvbmVudFYyKGNvbXBvbmVudElkLCBlbnYsIHByZXZpZXcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoIGEgdjIgY29tcG9uZW50IGNvbmZpZ1xuICAgICAqIElmIGVudi9wcmV2aWV3IG5vdCBzcGVjaWZpZWQgYW5kIGNvbXBvbmVudCB3YXMgcHJlbG9hZGVkLCB1c2VzIHByZWxvYWRlZCBwYXJhbXNcbiAgICAgKlxuICAgICAqIEBzZWUgcmVzb2x2ZUNvbXBvbmVudCBcdTIwMTQgdGhlIHVudmVyc2lvbmVkIG5hbWUgZm9yIHRoaXMgbWV0aG9kXG4gICAgICovXG4gICAgYXN5bmMgZmV0Y2hDb21wb25lbnRWMihjb21wb25lbnRJZDogc3RyaW5nLCBlbnZpcm9ubWVudElkZW50aWZpZXI/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnPiB7XG4gICAgICAgIGNvbnN0IHsgZW52LCB1c2VQcmV2aWV3LCBjYWNoZUtleSB9ID0gdGhpcy5yZXNvbHZlUGFyYW1zKGNvbXBvbmVudElkLCBlbnZpcm9ubWVudElkZW50aWZpZXIsIHByZXZpZXcpO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCdbQ2xvdWRSZXBvc2l0b3J5XSBmZXRjaENvbXBvbmVudFYyJywge1xuICAgICAgICAgICAgY29tcG9uZW50SWQ6IGNvbXBvbmVudElkLnNsaWNlKDAsIDgpICsgJy4uLicsXG4gICAgICAgICAgICBlbnYsXG4gICAgICAgICAgICB1c2VQcmV2aWV3LFxuICAgICAgICAgICAgY2FjaGVLZXksXG4gICAgICAgICAgICBjYWNoZWQ6IGNhY2hlS2V5IGluIHRoaXMudmFyaWFudHNcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XSkge1xuICAgICAgICAgICAgLy8gVHJhY2sgdGhpcyBhcyBwcmVsb2FkZWQgKGZpcnN0IGZldGNoIGNvdW50cyBhcyBwcmVsb2FkKVxuICAgICAgICAgICAgaWYgKCF0aGlzLnByZWxvYWRlZENvbXBvbmVudHNbY29tcG9uZW50SWRdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXSA9IHsgZW52LCBwcmV2aWV3OiB1c2VQcmV2aWV3IH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XSA9IG5ldyBQcm9taXNlKFxuICAgICAgICAgICAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmw6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0aWNNb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IHVzZVByZXZpZXcgPyAncHJldmlldycgOiBlbnY7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gYCR7dGhpcy5fYmFzZVVybH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS8ke2ZpbGV9Lmpzb25gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHFzID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh0aGlzLl9xdWVyeVBhcmFtcykudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocXMpIHVybCArPSBgPyR7cXN9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gYC9jb25zdW1lP2lkPSR7Y29tcG9uZW50SWR9JmVudj0ke2Vudn1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VQcmV2aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAnJnByZXZpZXc9dHJ1ZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgcHJldmlldyBpcyBuZXZlciBtaW5pZmllZDogdGhlIGFydGlmYWN0IGlzIGJ1aWx0IGZyb20gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVsZWFzZWQgdmFyaWFudCwgYW5kIGFuIGF1dGhvciBtdXN0IHNlZSB0aGVpciBvd24gZWRpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fZGVsaXZlcnkubWluaWZ5ICYmICF1c2VQcmV2aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAnJm9wdD1taW4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gLS0tLSB0aGUgY2xpZW50IHdpbmRvdyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHByZXZpZXcgaXMgbmV2ZXIgaGVsZDogYW4gYXV0aG9yIGhhcyB0byBzZWUgdGhlaXIgb3duIGVkaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWNoZWFibGUgPSB0aGlzLl9kZWxpdmVyeS5jYWNoZSAmJiAhdGhpcy5fc3RhdGljTW9kZSAmJiAhdXNlUHJldmlldztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0b3JlS2V5ID0gY2FjaGVhYmxlID8gZGVsaXZlcnlTdG9yZS5rZXkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxpdmVyeUhvc3QoKSwgY29tcG9uZW50SWQsIGVudixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VQcmV2aWV3LCB0aGlzLl9kZWxpdmVyeS5taW5pZnkgPyAnbWluJyA6ICdyYXcnKSA6ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhlbGQgPSBjYWNoZWFibGUgPyBhd2FpdCBkZWxpdmVyeVN0b3JlLmdldChzdG9yZUtleSkgOiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGVsZCAmJiBkZWxpdmVyeVN0b3JlLmZyZXNoKGhlbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5zaWRlIHRoZSB3aW5kb3c6IG5vIHJlcXVlc3QgYXQgYWxsLiBDb3VudGVkIGxvY2FsbHkgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwb3J0ZWQgbGF0ZXIsIG9yIHRoaXMgdmlzaXQgaXMgaW52aXNpYmxlIHRvIHRoZSBsZWRnZXIuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVsaXZlcnlTdGF0cy5mcm9tU3RvcmFnZSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90ZUxvY2FsU2VydmUoY29tcG9uZW50SWQsIGVudik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMudmFyaWFudHNbY2FjaGVLZXldIGFzIGFueSkucmVzb2x2ZWQgPSBoZWxkLmNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGhlbGQuY29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWxkICYmIGhlbGQudGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHdpbmRvdyBlbmRlZC4gU2VuZCBiYWNrIHRoZSB2ZXJzaW9uIHdlIGhvbGQgcmF0aGVyIHRoYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1kb3dubG9hZGluZzogdGhlIGFuc3dlciBpcyB1c3VhbGx5IGEgZmV3IGh1bmRyZWQgYnl0ZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWxpYmVyYXRlbHkgdGhlIGBpZHM9YC9gaGF2ZT1gIHJvdXRlIGFuZCBOT1QgSWYtTm9uZS1NYXRjaDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIHJlcXVlc3QgaGVhZGVyIHRyaWdnZXJzIGEgQ09SUyBwcmVmbGlnaHQsIHRoZXJlIGlzIG5vIE9QVElPTlNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByb3V0ZSwgYW5kIGl0IGZhaWxzIGluIGEgYnJvd3NlciB3aGlsZSB3b3JraW5nIHBlcmZlY3RseSBpbiBjdXJsLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB2YWxpZGF0b3IgdHJhdmVscyBpbiB0aGUgcXVlcnkgc3RyaW5nLCBzbyBpdCBpcyBhIHBsYWluIEdFVC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgdWlUYWdzYCByaWRlIGluc2lkZSB0aGUgaGVsZCBjb25maWcuIEEgdGFnIGVkaXQgZG9lcyBub3QgYnVtcCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXYgKHRoZSBzZXJ2ZXIgcGF0Y2hlcyB0aGUgY29tcG9uZW50IGRvYyBpbiBwbGFjZSksIHNvIHRoZSBsYW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwZW5kcyBhIGhhc2ggb2YgdWlUYWdzIHRvIGB0YWdgIChkZWxpdmVyeS9sYW5lIGxvZ2ljL3VpVGFncy50c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVpVGFnc0tleSk6IGEgdGFnLW9ubHkgZWRpdCBpcyBhbnN3ZXJlZCBcImNoYW5nZWRcIiwgd2l0aCB0aGUgbmV3IHRhZ3MuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tVcmwgPSBgL2NvbnN1bWU/aWRzPSR7Y29tcG9uZW50SWR9JmVudj0ke2Vudn1gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuX2RlbGl2ZXJ5Lm1pbmlmeSA/ICcmb3B0PW1pbicgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJmhhdmU9JHtlbmNvZGVVUklDb21wb25lbnQoaGVsZC50YWcpfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVsaXZlcnlTdGF0cy5yZXZhbGlkYXRpb25zKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2sgPSBhd2FpdCB0aGlzLmRlbGl2ZXJ5RmV0Y2goY2hlY2tVcmwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2sub2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCBjaGVjay5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGJvZHkudW5jaGFuZ2VkIHx8IFtdKS5pbmNsdWRlcyhjb21wb25lbnRJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWxpdmVyeVN0YXRzLnVuY2hhbmdlZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlbGl2ZXJ5U3RhdHMuYnl0ZXNTYXZlZCArPSBDbG91ZFJlcG9zaXRvcnkuc2l6ZU9mSGVsZChoZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxkLnN0b3JlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxkLndpbmRvd01zID0gZGVsaXZlcnlTdG9yZS53aW5kb3dGcm9tKGNoZWNrLmhlYWRlcnMpIHx8IGhlbGQud2luZG93TXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGVsaXZlcnlTdG9yZS5wdXQoaGVsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMudmFyaWFudHNbY2FjaGVLZXldIGFzIGFueSkucmVzb2x2ZWQgPSBoZWxkLmNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGhlbGQuY29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCBjaGFuZ2VkLiBUaGUgYW5zd2VyIGFscmVhZHkgY2FycmllcyB0aGUgbmV3IGJ5dGVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IChib2R5Lml0ZW1zIHx8IFtdKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2ZnID0gY29udmVydFYyVmFyaWFudFRvQ29tcG9uZW50Q29uZmlnKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlbGl2ZXJ5U3RhdHMuZnJvbU5ldHdvcmsrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBkZWxpdmVyeVN0b3JlLnB1dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogc3RvcmVLZXksIGNvbmZpZzogY2ZnLCB0YWc6IGl0ZW0udGFnIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dNczogZGVsaXZlcnlTdG9yZS53aW5kb3dGcm9tKGNoZWNrLmhlYWRlcnMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0OiB0aGlzLmRlbGl2ZXJ5SG9zdCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgYW55KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy52YXJpYW50c1tjYWNoZUtleV0gYXMgYW55KS5yZXNvbHZlZCA9IGNmZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNmZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgZmFpbGVkIHJlLWNoZWNrIG11c3Qgbm90IGZhaWwgdGhlIHBhZ2U6IGZhbGwgdGhyb3VnaCB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb3JkaW5hcnkgZmV0Y2ggYmVsb3cuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSB0aGlzLl9zdGF0aWNNb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCBmZXRjaCh1cmwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhd2FpdCB0aGlzLmRlbGl2ZXJ5RmV0Y2godXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgY29tcG9uZW50IFwiJHtjb21wb25lbnRJZH1cIiAoJHtyZXMuc3RhdHVzfSR7dGhpcy5fc3RhdGljTW9kZSA/IGAgZnJvbSAke3VybH1gIDogJyd9KWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhbnQgPSBqc29uLml0ZW07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENvbXBvbmVudCBcIiR7Y29tcG9uZW50SWR9XCIgbm90IGZvdW5kYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YXJpYW50LmNvbnN1bWVfdmFyaWFudCB8fCAhdmFyaWFudC5jb25zdW1lX3ZhcmlhbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ29tcG9uZW50IFwiJHtjb21wb25lbnRJZH1cIiBoYXMgbm8gaW1wbGVtZW50YXRpb24gZm9yIGVudmlyb25tZW50IFwiJHtlbnZ9XCJgKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRDb25maWcgPSBjb252ZXJ0VjJWYXJpYW50VG9Db21wb25lbnRDb25maWcodmFyaWFudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWxpdmVyeVN0YXRzLmZyb21OZXR3b3JrKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSG9sZCBpdCBmb3IgZXhhY3RseSBhcyBsb25nIGFzIHRoZSBzZXJ2ZXIgc2FpZCwgbWludXMgd2hhdCBhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0ROIGFscmVhZHkgc3BlbnQgKGRlbGl2ZXJ5U3RvcmUud2luZG93RnJvbSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGVsaXZlcnlTdG9yZS5wdXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHN0b3JlS2V5LCBjb25maWc6IGNvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnOiAodmFyaWFudCBhcyBhbnkpLnRhZyB8fCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93TXM6IGRlbGl2ZXJ5U3RvcmUud2luZG93RnJvbShyZXMuaGVhZGVycyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3Q6IHRoaXMuZGVsaXZlcnlIb3N0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBhbnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGFnIHRoZSBQcm9taXNlIHNvIGdldFJlc29sdmVkQ29uZmlnIGNhbiByZWFkIGl0IHN5bmNocm9ub3VzbHlcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XSBhcyBhbnkpLnJlc29sdmVkID0gY29tcG9uZW50Q29uZmlnO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjb21wb25lbnRDb25maWcpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgY2FjaGVkIHJlamVjdGVkIHByb21pc2Ugc28gdGhlIG5leHQgY2FsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZXMgYSBmcmVzaCByZXF1ZXN0IChlLmcuIGFmdGVyIG5ldHdvcmsgcmVjb3ZlcnkpXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy52YXJpYW50c1tjYWNoZUtleV07XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudmFyaWFudHNbY2FjaGVLZXldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN5bmNocm9ub3VzIHZlcnNpb24gb2YgZmV0Y2hDb21wb25lbnRWMiBcdTIwMTQgcmV0dXJucyB0aGUgY29uZmlnIG9ubHkgaWZcbiAgICAgKiB0aGUgZmV0Y2ggYWxyZWFkeSBjb21wbGV0ZWQsIG51bGwgb3RoZXJ3aXNlLlxuICAgICAqXG4gICAgICogVXNlcyB0aGUgc2FtZSBgdGhpcy52YXJpYW50c2AgY2FjaGUgdGhhdCBmZXRjaENvbXBvbmVudFYyL3ByZWxvYWRDb21wb25lbnRzXG4gICAgICogcG9wdWxhdGUuIEVhY2ggY2FjaGVkIFByb21pc2UgaXMgdGFnZ2VkIHdpdGggYSBgLnJlc29sdmVkYCBwcm9wZXJ0eSB3aGVuXG4gICAgICogaXQgc2V0dGxlcyBcdTIwMTQgdGhpcyBtZXRob2QganVzdCByZWFkcyB0aGF0IHByb3BlcnR5LiBObyBzZXBhcmF0ZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIFdoeSB0aGlzIGV4aXN0czogUmVhY3QgTmF0aXZlIG5lZWRzIHRoZSBjb25maWcgYXQgcmVuZGVyIHRpbWUgdG8gZW1iZWQgaXRcbiAgICAgKiBpbiB0aGUgV2ViVmlldyBIVE1MIChjYW4ndCBhd2FpdCBpbiB1c2VTdGF0ZSkuIElmIHByZWxvYWRDb21wb25lbnRzIHJhblxuICAgICAqIGVhcmxpZXIgYW5kIHRoZSBmZXRjaCBjb21wbGV0ZWQsIHRoaXMgcmV0dXJucyB0aGUgcmVzdWx0IHN5bmNocm9ub3VzbHksXG4gICAgICogc2tpcHBpbmcgdGhlIFdFQlZJRVdfUkVBRFkgXHUyMTkyIGZldGNoIFx1MjE5MiBpbmplY3Qgcm91bmQgdHJpcCBlbnRpcmVseS5cbiAgICAgKi9cbiAgICBnZXRSZXNvbHZlZENvbmZpZyhjb21wb25lbnRJZDogc3RyaW5nLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogSUNvbXBvbmVudENvbmZpZyB8IG51bGwge1xuICAgICAgICBjb25zdCB7IGNhY2hlS2V5IH0gPSB0aGlzLnJlc29sdmVQYXJhbXMoY29tcG9uZW50SWQsIGVudiwgcHJldmlldyk7XG4gICAgICAgIHJldHVybiB0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XT8ucmVzb2x2ZWQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYHVpOmAgdGFncyBvZiBhbiBhbHJlYWR5LXJlc29sdmVkIGNvbXBvbmVudCAoYFtdYCBpZiBpdCBoYXMgbm9uZSBvciBpcyBub3RcbiAgICAgKiByZXNvbHZlZCB5ZXQpLiBTeW5jaHJvbm91cywgbm8gcmVxdWVzdDogdGFncyBhcnJpdmUgd2l0aCB0aGUgY29tcG9uZW50IGl0c2VsZi5cbiAgICAgKi9cbiAgICBnZXRDb21wb25lbnRUYWdzKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlc29sdmVkQ29uZmlnKGNvbXBvbmVudElkLCBlbnYsIHByZXZpZXcpPy50eXBlPy51aVRhZ3MgfHwgW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSB3aGljaCAoZW52LCBwcmV2aWV3KSBwYWlyIFx1MjAxNCBhbmQgdGhlcmVmb3JlIHdoaWNoIGNhY2hlIGtleSBcdTIwMTQgYSBjYWxsXG4gICAgICogZm9yIGBjb21wb25lbnRJZGAgcmVmZXJzIHRvLlxuICAgICAqXG4gICAgICogU2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgZmV0Y2hDb21wb25lbnRWMiwgZ2V0UmVzb2x2ZWRDb25maWcgYW5kXG4gICAgICogaHlkcmF0ZUNvbXBvbmVudCwgc28gYSBoeWRyYXRlZCBjb25maWcgYWx3YXlzIGxhbmRzIG9uIHRoZSBrZXkgYSBsYXRlclxuICAgICAqIGZldGNoIHdpbGwgbG9vayB1bmRlci5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlc29sdmVQYXJhbXMoY29tcG9uZW50SWQ6IHN0cmluZywgZW52aXJvbm1lbnRJZGVudGlmaWVyPzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbikge1xuICAgICAgICAvLyBJZiBubyBleHBsaWNpdCBlbnYvcHJldmlldyBhbmQgY29tcG9uZW50IHdhcyBwcmVsb2FkZWQsIHVzZSBwcmVsb2FkZWQgcGFyYW1zXG4gICAgICAgIGNvbnN0IHByZWxvYWRlZCA9IHRoaXMucHJlbG9hZGVkQ29tcG9uZW50c1tjb21wb25lbnRJZF07XG4gICAgICAgIGNvbnN0IGhhc0V4cGxpY2l0UGFyYW1zID0gZW52aXJvbm1lbnRJZGVudGlmaWVyICE9PSB1bmRlZmluZWQgfHwgcHJldmlldyAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBlbnY6IHN0cmluZztcbiAgICAgICAgbGV0IHVzZVByZXZpZXc6IGJvb2xlYW47XG5cbiAgICAgICAgaWYgKCFoYXNFeHBsaWNpdFBhcmFtcyAmJiBwcmVsb2FkZWQpIHtcbiAgICAgICAgICAgIC8vIFVzZSBwcmVsb2FkZWQgcGFyYW1zXG4gICAgICAgICAgICBlbnYgPSBwcmVsb2FkZWQuZW52O1xuICAgICAgICAgICAgdXNlUHJldmlldyA9IHByZWxvYWRlZC5wcmV2aWV3O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVXNlIHByb3ZpZGVkIHBhcmFtcyBvciBkZWZhdWx0c1xuICAgICAgICAgICAgZW52ID0gZW52aXJvbm1lbnRJZGVudGlmaWVyIHx8IHRoaXMuX2RlZmF1bHRFbnY7XG4gICAgICAgICAgICAvLyBJZiBwcmV2aWV3IGV4cGxpY2l0bHkgdHJ1ZSBcdTIxOTIgdHJ1ZVxuICAgICAgICAgICAgLy8gSWYgcHJldmlldyBleHBsaWNpdGx5IGZhbHNlIFx1MjE5MiBmYWxzZVxuICAgICAgICAgICAgLy8gSWYgcHJldmlldyB1bmRlZmluZWQ6IGVudiB3YXMgc3BlY2lmaWVkICh2aWEgcGFyYW0gb3Igc2V0RW52aXJvbm1lbnQpIFx1MjE5MiBmYWxzZSwgb3RoZXJ3aXNlIFx1MjE5MiB0cnVlXG4gICAgICAgICAgICBjb25zdCBoYXNFZmZlY3RpdmVFbnYgPSBlbnZpcm9ubWVudElkZW50aWZpZXIgfHwgdGhpcy5fZW52RXhwbGljaXRseVNldDtcbiAgICAgICAgICAgIHVzZVByZXZpZXcgPSBwcmV2aWV3ID09PSB0cnVlID8gdHJ1ZSA6IChwcmV2aWV3ID09PSBmYWxzZSA/IGZhbHNlIDogIWhhc0VmZmVjdGl2ZUVudik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBlbnYsIHVzZVByZXZpZXcsIGNhY2hlS2V5OiBgJHtjb21wb25lbnRJZH06JHtlbnZ9OiR7dXNlUHJldmlldyA/ICdwcmV2aWV3JyA6ICdsaXZlJ31gIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VlZCBhbiBhbHJlYWR5LXJlc29sdmVkIGNvbXBvbmVudCBjb25maWcgaW50byB0aGUgY2FjaGUsIHdpdGhvdXQgYW55XG4gICAgICogbmV0d29yayByZXF1ZXN0LlxuICAgICAqXG4gICAgICogVGhlIGNvdW50ZXJwYXJ0IHRvIHtAbGluayBmZXRjaENvbXBvbmVudFYyfTogdXNlIGl0IHdoZW4gdGhlIGNvbmZpZyB3YXNcbiAgICAgKiByZXNvbHZlZCBzb21ld2hlcmUgZWxzZSBcdTIwMTQgbW9zdCBvZnRlbiBvbiBhIHNlcnZlciwgdGhlbiBlbWJlZGRlZCBpbiB0aGVcbiAgICAgKiBwYWdlIFx1MjAxNCBzbyB0aGUgYnJvd3NlciBjYW4gcmVuZGVyIHRoZSBjb21wb25lbnQgd2l0aCBubyByb3VuZCB0cmlwLlxuICAgICAqXG4gICAgICogQWZ0ZXIgaHlkcmF0aW5nLCBgZmV0Y2hDb21wb25lbnRWMmAsIGBnZXRSZXNvbHZlZENvbmZpZ2AgYW5kIGBpc1ByZWxvYWRlZGBcbiAgICAgKiBhbGwgYW5zd2VyIGZvciB0aGlzIGNvbXBvbmVudCBmcm9tIG1lbW9yeS5cbiAgICAgKlxuICAgICAqIFBhc3MgdGhlIHNhbWUgYGVudmAgLyBgcHJldmlld2AgdGhlIGNvbmZpZyB3YXMgcmVzb2x2ZWQgd2l0aDsgdGhlIGRlZmF1bHRzXG4gICAgICogbWF0Y2ggd2hhdCBhIHBsYWluIGBmZXRjaENvbXBvbmVudFYyKGNvbXBvbmVudElkKWAgd291bGQgaGF2ZSB1c2VkLlxuICAgICAqL1xuICAgIGh5ZHJhdGVDb21wb25lbnQoY29tcG9uZW50SWQ6IHN0cmluZywgY29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgZW52OiByZXNvbHZlZEVudiwgdXNlUHJldmlldywgY2FjaGVLZXkgfSA9IHRoaXMucmVzb2x2ZVBhcmFtcyhjb21wb25lbnRJZCwgZW52LCBwcmV2aWV3KTtcblxuICAgICAgICBjb25zdCBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZykgYXMgUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnPiAmIHsgcmVzb2x2ZWQ/OiBJQ29tcG9uZW50Q29uZmlnIH07XG4gICAgICAgIC8vIFRhZyBpdCB0aGUgc2FtZSB3YXkgZmV0Y2hDb21wb25lbnRWMiBkb2VzLCBzbyBnZXRSZXNvbHZlZENvbmZpZyBjYW5cbiAgICAgICAgLy8gcmVhZCBpdCBzeW5jaHJvbm91c2x5LlxuICAgICAgICBwcm9taXNlLnJlc29sdmVkID0gY29uZmlnO1xuXG4gICAgICAgIHRoaXMudmFyaWFudHNbY2FjaGVLZXldID0gcHJvbWlzZTtcbiAgICAgICAgdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXSA9IHsgZW52OiByZXNvbHZlZEVudiwgcHJldmlldzogdXNlUHJldmlldyB9O1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PSBWMSBNZXRob2RzIChMZWdhY3kpID09PT09PT09PT09PVxuXG4gICAgLyoqIGlkcyBzZWVkZWQgYnkgaHlkcmF0ZVYxQ29tcG9uZW50IHdob3NlIGZpcnN0IHVzZSBoYXMgbm90IGJlZW4gY291bnRlZCB5ZXQgKi9cbiAgICBwcml2YXRlIF9oeWRyYXRlZFYxID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICAvKipcbiAgICAgKiBTZWVkIGEgdjEgY29tcG9uZW50J3MgY29uZmlnLCBzbyBgZmV0Y2hDb21wb25lbnRWMShjb21wb25lbnRJZClgIGFuc3dlcnMgZnJvbSBtZW1vcnlcbiAgICAgKiB3aXRoIG5vIHJlcXVlc3QuIFRoZSB2MSBjb3VudGVycGFydCBvZiB7QGxpbmsgaHlkcmF0ZUNvbXBvbmVudH0uXG4gICAgICpcbiAgICAgKiBgZmxvd2AgaXMgd2hhdCBgR0VUIC9mbG93P2lkPTxjb21wb25lbnRJZD4mYXV0bz10cnVlYCByZXR1cm5zOiBlaXRoZXIgdGhlIHdob2xlIGJvZHlcbiAgICAgKiAoYHtpdGVtOiB7Li4ufX1gKSBvciBpdHMgYGl0ZW1gLiBUeXBpY2FsIHVzZSBpcyBhIHNlcnZlciB0aGF0IGZldGNoZWQgaXQgKHdpdGhcbiAgICAgKiBgJnByZWZldGNoPTFgLCBzbyB0aGUgZmV0Y2ggaXMgbm90IGNvdW50ZWQgYXMgYSB2aWV3KSBhbmQgZW1iZWRkZWQgaXQgaW4gdGhlIHBhZ2UuXG4gICAgICpcbiAgICAgKiBUaGUgdmlldyBJUyBjb3VudGVkOiB0aGUgZmlyc3QgdGltZSB0aGUgc2VlZGVkIGNvbmZpZyBpcyB1c2VkLCBpdCBpcyByZXBvcnRlZCB0aHJvdWdoXG4gICAgICogL2NsaWVudFVzYWdlIChmbGFnZ2VkIGA6aGAsIHJlY29yZGVkIGFzIGRlbGl2ZXJ5UGF0aCAnaHlkcmF0ZWQnKSwgc28gaHlkcmF0aW5nIG5ldmVyIG1ha2VzXG4gICAgICogdXNhZ2UgZGlzYXBwZWFyIGFuZCBzZXJ2ZXItcmVuZGVyZWQgdmlld3Mgc3RheSBkaXN0aW5ndWlzaGFibGUuXG4gICAgICovXG4gICAgaHlkcmF0ZVYxQ29tcG9uZW50KGNvbXBvbmVudElkOiBzdHJpbmcsIGZsb3c6IElVc2VyRmxvdyB8IHsgaXRlbTogSVVzZXJGbG93IH0pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IChmbG93IGFzIGFueSk/Lml0ZW0gPz8gZmxvdztcbiAgICAgICAgaWYgKCFpdGVtPy5jb21wb25lbnRzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaHlkcmF0ZVYxQ29tcG9uZW50KCR7Y29tcG9uZW50SWR9KTogbm90IGEgL2Zsb3c/YXV0bz10cnVlIHJlc3BvbnNlYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdID0gUHJvbWlzZS5yZXNvbHZlKGl0ZW0gYXMgSVVzZXJGbG93KTtcbiAgICAgICAgdGhpcy5faHlkcmF0ZWRWMS5hZGQoY29tcG9uZW50SWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoIGEgdjEgY29tcG9uZW50IGZyb20gYSBmbG93XG4gICAgICovXG4gICAgYXN5bmMgZmV0Y2hDb21wb25lbnRWMShjb21wb25lbnRJZDogc3RyaW5nLCBmbG93SWQ/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGZsb3dJZCkge1xuICAgICAgICAgICAgY29uc3QgZmxvdyA9IGF3YWl0IHRoaXMuZmV0Y2hGbG93KGZsb3dJZCk7XG4gICAgICAgICAgICByZXR1cm4gZmxvdy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLnR5cGUuaWQgPT09IGNvbXBvbmVudElkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCB0aGlzLmZldGNoQXV0b0Zsb3coY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgcmV0dXJuIGZsb3cuY29tcG9uZW50c1swXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGZldGNoQXV0b0Zsb3coY29tcG9uZW50SWQ6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5faHlkcmF0ZWRWMS5kZWxldGUoY29tcG9uZW50SWQpKSB7XG4gICAgICAgICAgICB0aGlzLm5vdGVMb2NhbFNlcnZlKGNvbXBvbmVudElkLCAndjFfYXV0b19mbG93JywgJ2gnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXSA9IG5ldyBQcm9taXNlKFxuICAgICAgICAgICAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5KHtmbG93OiB0cnVlfSkgbW92ZXMgdjEgY29uZmlncyB0byB0aGUgbGFuZSwgd2l0aCB0aGUgc2FtZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25lLXNob3QgZmFsbGJhY2sgdG8gY2xvdWQubXlvcC5kZXYgYXMgL2NvbnN1bWUuIE9mZjogdW5jaGFuZ2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IGAvZmxvdz9pZD0ke2NvbXBvbmVudElkfSZhdXRvPXRydWVgO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gdGhpcy5fZGVsaXZlcnkuZmxvdyAmJiB0aGlzLl9kZWxpdmVyeS5ob3N0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCB0aGlzLmRlbGl2ZXJ5RmV0Y2gocGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGF3YWl0IGZldGNoKGAke3RoaXMuX2Jhc2VVcmx9JHtwYXRofWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGpzb24uaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXTtcbiAgICB9XG5cbiAgICBhc3luYyBmZXRjaEZsb3coZmxvd0lkOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVzZXJGbG93c1tmbG93SWRdKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICAgICAgdGhpcy51c2VyRmxvd3NbZmxvd0lkXSA9IG5ldyBQcm9taXNlKFxuICAgICAgICAgICAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3RoaXMuX2Jhc2VVcmx9L2Zsb3c/aWQ9JHtmbG93SWR9JnJlc29sdmU9Y29tcG9uZW50c2BcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoanNvbi5pdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudXNlckZsb3dzW2Zsb3dJZF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudXNlckZsb3dzW2Zsb3dJZF07XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09IEJhY2t3YXJkIENvbXBhdGliaWxpdHkgPT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgZmV0Y2hDb21wb25lbnRWMiBvciBmZXRjaENvbXBvbmVudFYxIGV4cGxpY2l0bHlcbiAgICAgKiBEZWZhdWx0cyB0byB2MSBiZWhhdmlvciBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGNvZGVcbiAgICAgKi9cbiAgICBhc3luYyBmZXRjaENvbXBvbmVudChjb21wb25lbnRJZDogc3RyaW5nLCBmbG93SWQ/OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hDb21wb25lbnRWMShjb21wb25lbnRJZCwgZmxvd0lkKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIENsb3VkUmVwb3NpdG9yeSBpbnN0ZWFkXG4gKi9cbmV4cG9ydCBjb25zdCB2Ml9DbG91ZFJlcG9zaXRvcnkgPSBDbG91ZFJlcG9zaXRvcnk7XG4iLCAiaW1wb3J0IHsgQ2xvdWRSZXBvc2l0b3J5IH0gZnJvbSBcIi4vQ2xvdWRSZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBJQ29tcG9uZW50Q29uZmlnIH0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5sZXQgX2Nsb3VkUmVwb3NpdG9yeSA9IENsb3VkUmVwb3NpdG9yeS5NYWluO1xuXG5leHBvcnQgY29uc3QgZ2V0Q2xvdWRSZXBvc2l0b3J5ID0gKCkgPT4gX2Nsb3VkUmVwb3NpdG9yeTtcblxuZXhwb3J0IGNvbnN0IGlzUHJlbG9hZGVkID0gKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gX2Nsb3VkUmVwb3NpdG9yeS5pc1ByZWxvYWRlZChjb21wb25lbnRJZCwgZW52LCBwcmV2aWV3KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQcmVsb2FkZWRQYXJhbXMgPSAoY29tcG9uZW50SWQ6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBfY2xvdWRSZXBvc2l0b3J5LmdldFByZWxvYWRlZFBhcmFtcyhjb21wb25lbnRJZCk7XG59O1xuXG5leHBvcnQgY29uc3QgZW5hYmxlTG9jYWxEZXYgPSAoKSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeSA9IG5ldyBDbG91ZFJlcG9zaXRvcnkoXCJodHRwOi8vbG9jYWxob3N0OjkyOTJcIik7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0Q2xvdWRSZXBvc2l0b3J5VXJsID0gKHVybDogc3RyaW5nKSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeSA9IG5ldyBDbG91ZFJlcG9zaXRvcnkodXJsKTtcbn07XG5cbi8qKlxuICogQ29uZmlndXJlIHRoZSBTREsgdG8gZmV0Y2ggY29tcG9uZW50cyBmcm9tIGEgc2VsZi1ob3N0ZWQgc3RhdGljIHJlZ2lzdHJ5IChTMywgQ0ROLCBldGMuKVxuICogaW5zdGVhZCBvZiB0aGUgTXlvcCBjbG91ZC4gQ29tcG9uZW50cyBhcmUgc2VydmVkIGFzIHN0YXRpYyBKU09OIGZpbGVzOlxuICogICBgJHtjZG5Vcmx9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vJHtlbnZpcm9ubWVudH0uanNvbmBcbiAqL1xuZXhwb3J0IGNvbnN0IGVuYWJsZVNlbGZIb3N0ZWQgPSAoY2RuVXJsOiBzdHJpbmcsIHF1ZXJ5UGFyYW1zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPikgPT4ge1xuICAgIF9jbG91ZFJlcG9zaXRvcnkgPSBuZXcgQ2xvdWRSZXBvc2l0b3J5KGNkblVybCk7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeS5lbmFibGVTdGF0aWNNb2RlKCk7XG4gICAgaWYgKHF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgIF9jbG91ZFJlcG9zaXRvcnkuc2V0UXVlcnlQYXJhbXMocXVlcnlQYXJhbXMpO1xuICAgIH1cbn07XG5cbi8qKlxuICogVEhFIE9QVC1JTi4gT25lIGNhbGwsIGFuZCBub3RoaW5nIGNoYW5nZXMgZm9yIGFueW9uZSB3aG8gZG9lcyBub3QgbWFrZSBpdC5cbiAqXG4gKiAgIG15b3AuZGVsaXZlcnkoeyBtaW5pZnk6IHRydWUgfSk7XG4gKlxuICogT3B0aW5nIGluIElTIGNob29zaW5nIHRoZSBkZWxpdmVyeSBsYW5lOiBhIHNlY29uZCwgY29tcGxldGUgTXlvcCBzdGFjayAoaXRzIG93biBzZXJ2ZXJcbiAqIGFuZCBDRE4pIHJlYWRpbmcgdGhlIHNhbWUgY29tcG9uZW50IGRhdGEuIFNvIHRoaXMgY2FsbCBkb2VzIHR3byB0aGluZ3MgYXQgb25jZSBcdTIwMTQgaXRcbiAqIHBvaW50cyBgL2NvbnN1bWVgIGF0IHRoYXQgc3RhY2sgYW5kIGFza3MgaXQgZm9yIHRoZSBtaW5pZmllZCBhcnRpZmFjdCBcdTIwMTQgd2hpY2ggaXMgd2h5XG4gKiB0dXJuaW5nIHRoZSBmZWF0dXJlIG9mZiBpcyBhIGNvbmZpZyB2YWx1ZSBvbiBvdXIgc2lkZSBvciBvbmUgbGluZSBvbiB5b3VycywgYW5kIG5ldmVyXG4gKiBhIEROUyBjaGFuZ2UuXG4gKlxuICogU2FmZXR5IHByb3BlcnRpZXMsIGFsbCBkZWxpYmVyYXRlOlxuICogICAtIElmIHRoZSBsYW5lIGZhaWxzICh0cmFuc3BvcnQgZXJyb3Igb3IgNXh4KSwgdGhlIFNESyByZXRyaWVzIE9OQ0UgYWdhaW5zdFxuICogICAgIGNsb3VkLm15b3AuZGV2IGFuZCB0aGUgcGFnZSByZW5kZXJzIGFueXdheS4gYGRlbGl2ZXJ5LnN0YXRzKCkuZmVsbEJhY2tgIGNvdW50cyBpdC5cbiAqICAgLSBgY2FjaGU6IHRydWVgIGFkZHMgdGhlIGNsaWVudCB3aW5kb3c6IGEgY29tcG9uZW50IHRoaXMgYnJvd3NlciBhbHJlYWR5IGhvbGRzLCBzdGlsbFxuICogICAgIGluc2lkZSB0aGUgZnJlc2huZXNzIHRoZSBzZXJ2ZXIgcHJvbWlzZWQsIGlzIHJlbmRlcmVkIHdpdGggTk8gcmVxdWVzdC4gT25jZSB0aGVcbiAqICAgICB3aW5kb3cgZW5kcyB0aGUgYnJvd3NlciBzZW5kcyBiYWNrIHRoZSB2ZXJzaW9uIGl0IGhvbGRzIGluc3RlYWQgb2YgcmUtZG93bmxvYWRpbmcuXG4gKiAgIC0gQSBwcmV2aWV3IGlzIG5ldmVyIG1pbmlmaWVkIGFuZCBuZXZlciBjYWNoZWQuXG4gKiAgIC0gT25seSAvY29uc3VtZSBtb3Zlcy4gRXZlcnl0aGluZyBlbHNlIGtlZXBzIHRoZSBob3N0IGl0IGhhcyB0b2RheSAtLSB1bmxlc3NcbiAqICAgICBgZmxvdzogdHJ1ZWAsIHdoaWNoIGFsc28gbW92ZXMgdjEgY29tcG9uZW50IGNvbmZpZ3MgKGAvZmxvdz9hdXRvPXRydWVgKSwgd2l0aCB0aGVcbiAqICAgICBzYW1lIGZhbGxiYWNrLlxuICogICAtIEFza2luZyBmb3IgYG1pbmlmeWAgZG9lcyBub3QgZm9yY2UgaXQ6IHRoZSBzZXJ2ZXIgZGVjaWRlcyBwZXIgY29tcG9uZW50LCBhbmQgYVxuICogICAgIGNvbXBvbmVudCB0aGF0IGlzIG5vdCBlbmFibGVkIGlzIHNlcnZlZCByYXcsIHdoaWNoIGlzIG5vdCBhbiBlcnJvci5cbiAqXG4gKiBgaG9zdGAgaXMgZm9yIHVzIChhIHN0YWdpbmcgbGFuZSwgYSBsb2NhbCBzZXJ2ZXIpOyBsZWF2ZSBpdCBvdXQuXG4gKlxuICogQGludGVybmFsIERlbGl2ZXJ5IGxhbmU6IGtlcHQgb3V0IG9mIHRoZSBwdWJsaWMgQVBJIHJlZmVyZW5jZSB1bnRpbCBpdCBpcyByZWxlYXNlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IERFTElWRVJZX0hPU1QgPSAnaHR0cHM6Ly9kZWxpdmVyeS5teW9wLmRldic7XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCBkZWxpdmVyeSA9IChvcHRzOiB7IG1pbmlmeT86IGJvb2xlYW47IGNhY2hlPzogYm9vbGVhbjsgZmxvdz86IGJvb2xlYW47IGhvc3Q/OiBzdHJpbmcgfCBudWxsIH0gPSB7fSkgPT4ge1xuICAgIGNvbnN0IHdhbnRzTGFuZSA9IG9wdHMubWluaWZ5ICE9PSBmYWxzZSB8fCBvcHRzLmNhY2hlID09PSB0cnVlIHx8IG9wdHMuZmxvdyA9PT0gdHJ1ZTtcbiAgICBfY2xvdWRSZXBvc2l0b3J5LnNldERlbGl2ZXJ5KHtcbiAgICAgICAgbWluaWZ5OiBvcHRzLm1pbmlmeSA/PyBmYWxzZSxcbiAgICAgICAgY2FjaGU6IG9wdHMuY2FjaGUgPz8gZmFsc2UsXG4gICAgICAgIGZsb3c6IG9wdHMuZmxvdyA/PyBmYWxzZSxcbiAgICAgICAgaG9zdDogb3B0cy5ob3N0ICE9PSB1bmRlZmluZWQgPyBvcHRzLmhvc3QgOiAod2FudHNMYW5lID8gREVMSVZFUllfSE9TVCA6IG51bGwpLFxuICAgIH0pO1xuICAgIHJldHVybiBkZWxpdmVyeVN0YXRzKCk7XG59O1xuXG4vKipcbiAqIEZvcmdldCB3aGF0IHRoaXMgYnJvd3NlciBob2xkcywgc28gdGhlIG5leHQgbG9hZCBhc2tzIHRoZSBzZXJ2ZXIuIFVzZSBpdCB3aGVuIGEgY2hhbmdlXG4gKiBoYXMgdG8gYmUgdmlzaWJsZSBvbiBUSElTIGxvYWQgXHUyMDE0IHJpZ2h0IGFmdGVyIHNvbWVvbmUgcHVibGlzaGVzIFx1MjAxNCByYXRoZXIgdGhhbiB3aXRoaW4gdGhlXG4gKiBmcmVzaG5lc3Mgd2luZG93LlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZGVsaXZlcnlSZWZyZXNoID0gYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IF9jbG91ZFJlcG9zaXRvcnkucmVmcmVzaERlbGl2ZXJ5KCk7XG4gICAgcmV0dXJuIGRlbGl2ZXJ5U3RhdHMoKTtcbn07XG5cbi8qKlxuICogV2hhdCBhbnN3ZXJlZCB0aGUgbGFzdCByZXF1ZXN0cywgYW5kIFx1MjAxNCB0aGUgbnVtYmVyIHdvcnRoIHdhdGNoaW5nIFx1MjAxNCBob3cgbWFueSB0aW1lcyB0aGVcbiAqIFNESyBoYWQgdG8gZmFsbCBiYWNrIHRvIHRoZSBkZWZhdWx0IGhvc3QgYmVjYXVzZSB0aGUgbGFuZSBkaWQgbm90IGFuc3dlci5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGRlbGl2ZXJ5U3RhdHMgPSAoKSA9PiBfY2xvdWRSZXBvc2l0b3J5LmRlbGl2ZXJ5U3RhdHMoKTtcblxuLyoqIFVuZG8gZGVsaXZlcnkoKTogYmFjayB0byB0aGUgZGVmYXVsdCBob3N0IGFuZCByYXcgYnl0ZXMsIHdpdGggbm8gcmVsb2FkLiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCBkZWxpdmVyeU9mZiA9ICgpID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5LnNldERlbGl2ZXJ5KHsgbWluaWZ5OiBmYWxzZSwgY2FjaGU6IGZhbHNlLCBmbG93OiBmYWxzZSwgaG9zdDogbnVsbCB9KTtcbiAgICByZXR1cm4gZGVsaXZlcnlTdGF0cygpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldENsb3VkUmVwb3NpdG9yeSA9IChyZXBvc2l0b3J5OiBDbG91ZFJlcG9zaXRvcnkpID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5ID0gcmVwb3NpdG9yeTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRFbnZpcm9ubWVudCA9IChlbnY6IHN0cmluZykgPT4ge1xuICAgIF9jbG91ZFJlcG9zaXRvcnkuc2V0RW52aXJvbm1lbnQoZW52KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZXNvbHZlZENvbmZpZyA9IChjb21wb25lbnRJZDogc3RyaW5nLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKSA9PiB7XG4gICAgcmV0dXJuIF9jbG91ZFJlcG9zaXRvcnkuZ2V0UmVzb2x2ZWRDb25maWcoY29tcG9uZW50SWQsIGVudiwgcHJldmlldyk7XG59O1xuXG4vKipcbiAqIFRoZSBydW50aW1lIHRhZ3Mgb2YgYSBsb2FkZWQvcHJlbG9hZGVkIGNvbXBvbmVudDogb25seSB0YWdzIG5hbWVkIGB1aTouLi5gIChlLmcuXG4gKiBgdWk6YmV0YWApLiBSZXR1cm5zIGBbXWAgd2hlbiBpdCBoYXMgbm9uZSBvciBoYXMgbm90IGJlZW4gZmV0Y2hlZCB5ZXQuXG4gKlxuICogYGBgdHNcbiAqIGF3YWl0IHByZWxvYWRDb21wb25lbnRzKFtpZF0pO1xuICogZ2V0Q29tcG9uZW50VGFncyhpZCk7IC8vIFsndWk6YmV0YSddXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGdldENvbXBvbmVudFRhZ3MgPSAoY29tcG9uZW50SWQ6IHN0cmluZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IHN0cmluZ1tdID0+IHtcbiAgICByZXR1cm4gX2Nsb3VkUmVwb3NpdG9yeS5nZXRDb21wb25lbnRUYWdzKGNvbXBvbmVudElkLCBlbnYsIHByZXZpZXcpO1xufTtcblxuZXhwb3J0IGNvbnN0IHByZWxvYWRDb21wb25lbnRzID0gYXN5bmMgKGlkczogc3RyaW5nW10sIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pID0+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgICBpZHMubWFwKChpZCkgPT4gX2Nsb3VkUmVwb3NpdG9yeS5mZXRjaENvbXBvbmVudFYyKGlkLCBlbnYsIHByZXZpZXcpKSxcbiAgICApO1xufTtcblxuLyoqXG4gKiBTZWVkIGFscmVhZHktcmVzb2x2ZWQgY29tcG9uZW50IGNvbmZpZ3MgaW50byB0aGUgU0RLIGNhY2hlLCB3aXRoIG5vIG5ldHdvcmtcbiAqIHJlcXVlc3QuIFRoZSBjb3VudGVycGFydCB0byB7QGxpbmsgcHJlbG9hZENvbXBvbmVudHN9LlxuICpcbiAqIFVzZSBpdCB3aGVuIHRoZSBjb25maWdzIHdlcmUgcmVzb2x2ZWQgc29tZXdoZXJlIGVsc2UgXHUyMDE0IHR5cGljYWxseSBvbiBhIHNlcnZlclxuICogYW5kIGVtYmVkZGVkIGluIHRoZSBwYWdlIFx1MjAxNCBzbyB0aGUgY29tcG9uZW50IHJlbmRlcnMgd2l0aCB6ZXJvIHJvdW5kIHRyaXBzOlxuICpcbiAqIGBgYHRzXG4gKiAvLyBzZXJ2ZXI6IGNvbnN0IGNvbmZpZ3MgPSB7IFtpZF06IGF3YWl0IG5ldyBDbG91ZFJlcG9zaXRvcnkoKS5mZXRjaENvbXBvbmVudFYyKGlkKSB9XG4gKiAvLyBjbGllbnQ6XG4gKiBoeWRyYXRlQ29tcG9uZW50cyhjb25maWdzKTtcbiAqIC8vIDxNeW9wQ29tcG9uZW50IGNvbXBvbmVudElkPXtpZH0gLz4gbm93IHJlbmRlcnMgd2l0aG91dCBmZXRjaGluZ1xuICogYGBgXG4gKlxuICogUGFzcyB0aGUgc2FtZSBgZW52YCAvIGBwcmV2aWV3YCB0aGUgY29uZmlncyB3ZXJlIHJlc29sdmVkIHdpdGg7IHRoZSBkZWZhdWx0c1xuICogbWF0Y2ggd2hhdCBhIHBsYWluIGBwcmVsb2FkQ29tcG9uZW50cyhbaWRdKWAgd291bGQgaGF2ZSB1c2VkLlxuICovXG5leHBvcnQgY29uc3QgaHlkcmF0ZUNvbXBvbmVudHMgPSAoXG4gICAgY29uZmlnczogUmVjb3JkPHN0cmluZywgSUNvbXBvbmVudENvbmZpZz4sXG4gICAgZW52Pzogc3RyaW5nLFxuICAgIHByZXZpZXc/OiBib29sZWFuLFxuKSA9PiB7XG4gICAgZm9yIChjb25zdCBbaWQsIGNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlncykpIHtcbiAgICAgICAgX2Nsb3VkUmVwb3NpdG9yeS5oeWRyYXRlQ29tcG9uZW50KGlkLCBjb25maWcsIGVudiwgcHJldmlldyk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBUaGUgdjEgKGlmcmFtZSBjb21wb25lbnQpIGNvdW50ZXJwYXJ0IG9mIHtAbGluayBoeWRyYXRlQ29tcG9uZW50c306IHNlZWQgY29uZmlncyB0aGF0IGFcbiAqIHNlcnZlciBhbHJlYWR5IGZldGNoZWQsIHNvIGBsb2FkQ29tcG9uZW50YCBuZWVkcyBubyBgL2Zsb3dgIHJlcXVlc3QgYXQgYWxsLlxuICpcbiAqIGBgYHRzXG4gKiAvLyBzZXJ2ZXIgKGNhY2hlIGl0IH42MCBzOyBgcHJlZmV0Y2g9MWAga2VlcHMgdGhpcyBmZXRjaCBvdXQgb2YgdGhlIHZpZXcgY291bnQsIGBmb3JgIHNheXMgd2hpY2hcbiAqIC8vIHBhZ2UgaXQgaXMgZm9yLCBzbyB0aGUgcHJlZmV0Y2ggaXMgYXR0cmlidXRlZCB0byB5b3VyIHNpdGUgXHUyMDE0IGl0cyBxdWVyeSBzdHJpbmcgaXMgbm90IHN0b3JlZCk6XG4gKiBjb25zdCBmbG93ID0gYXdhaXQgKGF3YWl0IGZldGNoKGBodHRwczovL2Nsb3VkLm15b3AuZGV2L2Zsb3c/aWQ9JHtpZH0mYXV0bz10cnVlJnByZWZldGNoPTEmZm9yPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhZ2VVcmwpfWApKS5qc29uKCk7XG4gKiAvLyBlbWJlZCBKU09OLnN0cmluZ2lmeShmbG93KSBpbiB0aGUgcGFnZSwgdGhlbiBvbiB0aGUgY2xpZW50OlxuICogaHlkcmF0ZVYxQ29tcG9uZW50cyh7IFtpZF06IGZsb3cgfSk7XG4gKiBjb25zdCBjZmcgPSBhd2FpdCBDbG91ZFJlcG9zaXRvcnkuTWFpbi5mZXRjaENvbXBvbmVudFYxKGlkKTsgICAvLyBubyByZXF1ZXN0XG4gKiBgYGBcbiAqXG4gKiBFYWNoIHNlZWRlZCBjb25maWcgaXMgY291bnRlZCBhcyBhIHZpZXcgdGhlIGZpcnN0IHRpbWUgaXQgaXMgdXNlZCAodmlhIC9jbGllbnRVc2FnZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBoeWRyYXRlVjFDb21wb25lbnRzID0gKGZsb3dzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB7XG4gICAgZm9yIChjb25zdCBbaWQsIGZsb3ddIG9mIE9iamVjdC5lbnRyaWVzKGZsb3dzKSkge1xuICAgICAgICBfY2xvdWRSZXBvc2l0b3J5Lmh5ZHJhdGVWMUNvbXBvbmVudChpZCwgZmxvdyk7XG4gICAgfVxufTtcbiIsICJpbXBvcnQge0Jhc2VDb250ZXh0TWVzc2FnZUhhbmRsZXIsIEhvc3RlZENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCB0eXBlIE1lc3NhZ2VUb0hvc3QgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB2b2lkXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSA9IGFueT4gZXh0ZW5kcyBCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyPFQsIFJlY29yZDxzdHJpbmcsIEhvc3RlZENvbXBvbmVudDxTaGFkb3dSb290UmVmPj4+IHtcblxuICAgIGFic3RyYWN0IG1lc3NhZ2VUeXBlOiBzdHJpbmdcblxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2VUb0hvc3Q6IGFueSwgcHVibGljIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIEhvc3RlZENvbXBvbmVudDxTaGFkb3dSb290UmVmPj4pIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZVRvSG9zdCk7XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgaW5uZXJFeGVjdXRvcjogKGV2ZW50OiBULCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB2b2lkO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IFQpID0+IHtcbiAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgaWYgKGV2ZW50LmRlc3RpbmF0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IGV2ZW50LmRlc3RpbmF0aW9uO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dFtkZXN0aW5hdGlvbl0uY29udGV4dCkge1xuXG4gICAgICAgICAgICAgICAgLy8gcGF0Y2ggdGhlIHNvdXJjZSBpZCwgdGhpbmsgYWJvdXQgdGhhdCA/XG4gICAgICAgICAgICAgICAgY29uc3QgX21lc3NhZ2VUb0hvc3QgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3Qoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4ubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZXZlbnQuZGVzdGluYXRpb24gPyBldmVudC5kZXN0aW5hdGlvbiA6IGV2ZW50LnNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uOiBldmVudC5zb3VyY2UgPyBldmVudC5zb3VyY2UgOiBldmVudC5kZXN0aW5hdGlvblxuICAgICAgICAgICAgICAgICAgICB9IGFzIEJhc2VNeW9wTWVzc2FnZSwgcmVwbGF5VG8pXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5uZXJFeGVjdXRvcihldmVudCwgdGhpcy5jb250ZXh0W2Rlc3RpbmF0aW9uXS5jb250ZXh0LCBfbWVzc2FnZVRvSG9zdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IG15b3BBdHRyaWJ1dGVzID0ge1xuICAgIGlkOiAnbXlvcC1pZCdcbn1cbiIsICJpbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzLnRzXCI7XG5pbXBvcnQge1JlZn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjb25zdCBnZXRFbGVtZW50c0J5UmVmID0gKHJlZjogUmVmLCBlbDogUGFyZW50Tm9kZSkgPT4ge1xuICAgIHJldHVybiBlbC5xdWVyeVNlbGVjdG9yQWxsKGBbJHtteW9wQXR0cmlidXRlcy5pZH09JyR7cmVmLnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0Rmlyc3RFbGVtZW50QnlSZWYgPSAocmVmOiBSZWYsIGVsOiBQYXJlbnROb2RlKSA9PiB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBnZXRFbGVtZW50c0J5UmVmKHJlZiwgZWwpO1xuICAgIGlmIChlbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRzLml0ZW0oMCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufSIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmluZENsaWNrTWVzc2FnZSwgQ2xpY2tSZXBsYXlNZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBCaW5kT25DbGlja0hhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8QmluZENsaWNrTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQmluZENsaWNrTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEJpbmRDbGlja01lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KVxuICAgICAgICBjb25zdCBjbGVhbnVwVGFza3M6IGFueVtdID0gW107XG5cbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgQ2xpY2tSZXBsYXlNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCkpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpO1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4gdGFzaygpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7TXlvcEVsZW1lbnRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dEhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8TXlvcEVsZW1lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DaGFuZ2VUZXh0TWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IE15b3BFbGVtZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS50ZXh0Q29udGVudCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY2xhc3MgU2hhZG93Um9vdFJlZiBleHRlbmRzIFJvb3RSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwdWJsaWMgc2hhZG93Um9vdDogU2hhZG93Um9vdCkge1xuICAgICAgICBzdXBlcihjb250YWluZXIsIHNoYWRvd1Jvb3QpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BFbGVtZW50UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlLCBEZXRlY3RNeW9wUmVmc01lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPERldGVjdE15b3BSZWZzTWVzc2FnZT4ge1xuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IERldGVjdE15b3BSZWZzTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuXG4gICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgIGNvbnN0IGFsbE15b3BJdGVtcyA9IHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKGBbJHtteW9wQXR0cmlidXRlcy5pZH1dYCk7XG5cbiAgICAgICAgbGV0IG15b3BSZWZzOiBNeW9wRWxlbWVudFJlZltdID0gW107XG5cbiAgICAgICAgYWxsTXlvcEl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiB0YWtlIHRoYXQgYmFjayB0byB0aGUgZGFzaGJvYXJkP1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhpdGVtLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcblxuICAgICAgICAgICAgY29uc3QgbXlvcElkID0gaXRlbS5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuXG4gICAgICAgICAgICBpZiAobXlvcElkKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnd2MgcmVjdCcsICBpdGVtLnBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIG15b3BSZWZzLnB1c2gobmV3IE15b3BFbGVtZW50UmVmKG15b3BJZCwgaXRlbS50YWdOYW1lLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBpdGVtLm9mZnNldFRvcCwgaXRlbS5vZmZzZXRMZWZ0KSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IERldGVjdGVkTXlvcFJlZnNNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbXlvcFJlZnMpKVxuICAgIH07XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5EZXRlY3RNeW9wUmVmc01lc3NhZ2U7XG5cblxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXRBdHRyaWJ1dGVNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3Mgc2V0QXR0cmlidXRlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxTZXRBdHRyaWJ1dGVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRBdHRyaWJ1dGVNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogU2V0QXR0cmlidXRlTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5zZXRBdHRyaWJ1dGUoZXZlbnQubmFtZSwgZXZlbnQudmFsdWUpXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSxcbiAgICBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlLFxufSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuZXhwb3J0IGNsYXNzIEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5BZGRFdmVudExpc3RlbmVyTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG5cbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgY29uc3QgY2xlYW51cFRhc2tzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBpbiBmYWN0IHdoZW4gcnVubmluZyBpbiBXZWJDb21wb25lbnQgd2UgY2FuIHRyYW5zZmVyIHRoZSBvcmlnaW5hbCBlXG4gICAgICAgICAgICAgICAgLy8gY3VycmVudGx5IHVzaW5nIG1ha2VTZXJpYWxpemFibGUgZm9yIG5lc3RlZCBjYXNlcywgdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCAgbWFrZVNlcmlhbGl6YWJsZShlLCBldmVudC5zZXJpYWxpemFibGVTa2VsZXRvbikpKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcihldmVudC50eXBlLCBoYW5kbGVyKTtcblxuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudC50eXBlLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHRhc2soKSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7SG9zdFNES30gZnJvbSBcIi4uLy4uL2hvc3QvaG9zdFNES1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi8uLi9ob3N0XCI7XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuXG4gICAgICAgIGNvbnN0IGNyZWF0ZVJlZiA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vY29uc3QgYWxsSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtldmVudC5yZWY/LnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xuICAgICAgICAgICAgY29uc3QgYWxsSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtldmVudC5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcblxuICAgICAgICAgICAgaWYgKGFsbEl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvc3RTREsgPSBIb3N0U0RLLkluc3RhbmNlKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IGV2ZW50Lm9wdGlvbnMuaWQpITtcbiAgICAgICAgICAgICAgICBpZiAocmVmQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vLy8+Pj4+XG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vICBjb25zb2xlLmxvZyhgZmFpbGVkIHRvIGZpbmQgJHtldmVudC5vcHRpb25zLmlkfSBpbiBtZW0gc2NvcGVgLCBob3N0U0RLKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy93ZSBoYXZlIHRoZSByZWYgY29tcG9uZW50IGluIG91ciBIb3N0U0RLIChzYW1lIG1lbW9yeSB3aGVuIHVzaW5nIHdlYmNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAvLyAgcmVmQ29tcG9uZW50LnBhcmVudCA9IGltcGxlbWVudGF0aW9uQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIC8vZGVsZXRlIHRoZSByZWYgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBob3N0U0RLLmNvbXBvbmVudHMuaW5kZXhPZihyZWZDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgaG9zdFNESy5jb21wb25lbnRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2NyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQgcmVtb3ZlZCB0ZW1wIHJlZiBjb21wb25lbnQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkIHVzaW5nIHRlbXAgcmVmIGNvbXBvbmVudCcpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGltcGxlbWVudGF0aW9uQ29tcG9uZW50ID0gYXdhaXQgaG9zdFNESy5sb2FkQ29tcG9uZW50KGV2ZW50Lm5lc3RlZENvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMuaXRlbSgwKSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQub3B0aW9ucylcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IG5vIG5lZWQgdGhpcywgcGFzcyBvcHRpb25zIGZyb20gcGFyZW50XG4gICAgICAgICAgICAgICAgLy9pbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5pZCA9IGV2ZW50LnByZWRlZmluZWRJZDtcbiAgICAgICAgICAgICAgICAvL3JlZkNvbXBvbmVudC5pZCArPSAnLic7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBub3QgcmVhbGx5IG5lZWRlZCA/XG4gICAgICAgICAgICAgICAgLy8gYXdhaXQgaW1wbGVtZW50YXRpb25Db21wb25lbnQuaW5pdGlhdGVkKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRSZWZDb25maWc6IGFueVtdID0gW107XG5cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhpbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5yZWZzKS5mb3JFYWNoKHJlZk5hbWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVmID0gaW1wbGVtZW50YXRpb25Db21wb25lbnQucmVmc1tyZWZOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgcmVmID0gcmVmLl9fbm9uUHJveGllZCB8fCByZWY7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFJlZkNvbmZpZy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb25JZDogKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbmVzdGVkUmVmQ29uZmlnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIC0gRE9NIGVsZW1lbnQgbm90IGZvdW5kJylcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgW10sIHRydWUpKTtcblxuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY3JlYXRlUmVmKCkudGhlbigpXG4gICAgICAgIC8vcmV0dXJuaW5nIHVuZGVmaW5lZCBzbyBpdCB3b24ndCBhY3QgYXMgYSBjbGVhbnVwXG4gICAgfVxufVxuIiwgImltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtSb290UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmV4cG9ydCBjb25zdCBFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSwgcmVwbGllcjogKGRhdGE6IGFueSkgPT4gdm9pZCwgcm9vdFJlZjogUm9vdFJlZikgPT4ge1xuICAgIGNvbnN0IF9fc2NyaXB0SW5wdXRzID0gZXZlbnQuc2NyaXB0SW5wdXRzID8gZXZlbnQuc2NyaXB0SW5wdXRzIDoge31cbiAgICBfX3NjcmlwdElucHV0cy5tYWtlU2VyaWFsaXphYmxlID0gbWFrZVNlcmlhbGl6YWJsZTtcblxuICAgIF9fc2NyaXB0SW5wdXRzLnNlbmQgPSByZXBsaWVyO1xuICAgIF9fc2NyaXB0SW5wdXRzLnJvb3RSZWYgPSByb290UmVmO1xuICAgIF9fc2NyaXB0SW5wdXRzLl9fc2NyaXB0SW5wdXRzID0gX19zY3JpcHRJbnB1dHM7XG5cbiAgICBjb25zdCBkeW5hbWljRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oYHJldHVybiAoJHtldmVudC5zY3JpcHR9KSguLi5hcmd1bWVudHMpYCk7XG4gICAgY29uc3QgcmV0ID0gZHluYW1pY0Z1bmN0aW9uKF9fc2NyaXB0SW5wdXRzKTtcblxuICAgIC8vIGNvbnN0IGR5bmFtaWNGdW5jdGlvbiA9IEZ1bmN0aW9uKCdzZW5kJywgJ3Jvb3RSZWYnLCdfX3NjcmlwdElucHV0cycsIC4uLk9iamVjdC5rZXlzKF9fc2NyaXB0SW5wdXRzKSwgZXZlbnQuY29udGVudCA/IGV2ZW50LmNvbnRlbnQgOiAnJylcbiAgICAvL2NvbnN0IHJldCA9IGR5bmFtaWNGdW5jdGlvbihyZXBsaWVyLCByb290UmVmLCBfX3NjcmlwdElucHV0cywgLi4uT2JqZWN0LnZhbHVlcyhfX3NjcmlwdElucHV0cykpO1xuICAgIHJlcGxpZXIocmV0KTtcbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZi50c1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50c1wiO1xuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdEhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8RXhlY3V0ZVNjcmlwdE1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5FeGVjdXRlU2NyaXB0TWVzc2FnZVxuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcbiAgICAgICAgY29uc3QgcmVwbGllciA9IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBkYXRhKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgRXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcihldmVudCwgcmVwbGllciwgc2hhZG93Um9vdFJlZik7XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlLCBGb3JtRGF0YUVudHJ5LCBHZXRFbGVtZW50VmFsdWVNZXNzYWdlLCBJbnB1dEVsZW1lbnRWYWx1ZSx9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzLnRzXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5jb25zdCBnZXRJbnB1dFZhbHVlID0gKGVsZW1lbnQpOiBJbnB1dEVsZW1lbnRWYWx1ZSA9PiB7XG4gICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBmb3JtXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0ZPUk0nKSB7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBkYXRhT2JqZWN0OiBJbnB1dEVsZW1lbnRWYWx1ZSA9IHtcbiAgICAgICAgICAgIGZvcm1EYXRhOiB7fSxcbiAgICAgICAgICAgIHVubWFwcGVkRGF0YTogW11cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBNYW51YWxseSBhZGQgZWxlbWVudHMgd2l0aG91dCBuYW1lc1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEnKTtcbiAgICAgICAgbGV0IGF1dG9OYW1lSW5kZXhlciA9IC0xO1xuXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXlvcElkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnbmFtZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gYF8keygrK2F1dG9OYW1lSW5kZXhlcil9YFxuXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZURhdGE6IEZvcm1EYXRhRW50cnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBnZXRJbnB1dFZhbHVlKGVsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZWxlbWVudC5yZXF1aXJlZCxcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRpdHk6IG1ha2VTZXJpYWxpemFibGUoZWxlbWVudC52YWxpZGl0eSwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgIG15b3BJZCxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XS52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2goZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRhdGFPYmplY3Q7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWxlbWVudC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmNoZWNrZWQgPyBlbGVtZW50LnZhbHVlIDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgaW5wdXQgYW5kIHRleHRhcmVhIGVsZW1lbnRzXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJyB8fCBlbGVtZW50LnRhZ05hbWUgPT09ICdURVhUQVJFQScpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNlbGVjdCBlbGVtZW50cyAoZHJvcGRvd25zKVxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdTRUxFQ1QnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBlZGl0YWJsZSBkaXZzIChjb250ZW50RWRpdGFibGUpXG4gICAgaWYgKGVsZW1lbnQuaXNDb250ZW50RWRpdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuaW5uZXJUZXh0IHx8IGVsZW1lbnQudGV4dENvbnRlbnQ7XG4gICAgfVxuXG4gICAgLy8gSWYgaXQncyBhbiB1bnN1cHBvcnRlZCBlbGVtZW50IHR5cGVcbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGNsYXNzIEdldEVsZW1lbnRWYWx1ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8R2V0RWxlbWVudFZhbHVlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuR2V0RWxlbWVudFZhbHVlTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UoZ2V0SW5wdXRWYWx1ZShpdGVtKSksIGV2ZW50KTtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldElubmVySHRtbH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge015b3BFbGVtZW50TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIFNldElubmVySHRtbEhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8U2V0SW5uZXJIdG1sPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRJbm5lckh0bWw7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBNeW9wRWxlbWVudE1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0uaW5uZXJIVE1MID0gZXZlbnQuY29udGVudDtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIFRoZSBXZWJjb21wb25lbnQgU0RLIGlzIHRhaWxvcmVkIGZvciB1c2luZyBNeW9wIGNvbXBvbmVudHMgcGFja2FnZWQgYXMgc2VwYXJhdGUgYnVuZGxlcyBhbmQgZXhwb3NlZCBhcyB3ZWIgY29tcG9uZW50cy48YnIvPlxuICogRGV2ZWxvcGVycyBpbXBvcnRpbmcgdGhpcyBTREsgY2FuIGxldmVyYWdlIEFQSXMgYW5kIHV0aWxpdGllcyBzcGVjaWZpY2FsbHkgY3JhZnRlZCB0byBzdXBwb3J0IHRoZSBsaWZlY3ljbGUgbWFuYWdlbWVudCBhbmQgY29tbXVuaWNhdGlvbiBwYXR0ZXJucyByZXF1aXJlZCBmb3Igd2ViIGNvbXBvbmVudHMgd2l0aGluIHRoZSBNeW9wIGFyY2hpdGVjdHVyZS48YnIvPlxuICogVGhpcyBTREsgcHJvbW90ZXMgcmV1c2FiaWxpdHkgYW5kIGVuY2Fwc3VsYXRpb24sIGVuYWJsaW5nIGRldmVsb3BlcnMgdG8gYnVpbGQgbW9kdWxhciwgc2VsZi1jb250YWluZWQgY29tcG9uZW50cyB0aGF0IGNhbiBiZSBzZWFtbGVzc2x5IGludGVncmF0ZWQgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbidzIERPTSBzdHJ1Y3R1cmUuXG4gKlxuICpcbiAqIE9uY2UgbG9hZGVkIHRoZSBgUm9vdFNES2AsIHlvdSBjYW4gbG9hZCB0aGUgYElmcmFtZVNES2BcbiAqIGBgYGpzXG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICogb3JcbiAqIGBgYHRzXG4gKiBpbXBvcnQge2dldFdlYmNvbXBvbmVudE1vZHVsZX0gZnJvbSAnQG15b3Avc2RrJztcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IGdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICogb3JcbiAqIGBgYHRzXG4gKiBpbXBvcnQge1dlYkNvbXBvbmVudFNES30gZnJvbSAnQG15b3Avc2RrL3dlYmNvbXBvbmVudCc7XG4gKiBgYGBcbiAqXG4gKi9cbmltcG9ydCB7QmFzZU15b3BTREt9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wV2ViY29tcG9uZW50Q29uc3RzfSBmcm9tIFwiLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge0JpbmRPbkNsaWNrSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlclwiO1xuaW1wb3J0IHtDaGFuZ2VUZXh0SGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2NoYW5nZVRleHRIYW5kbGVyXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7RGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgSW5pdE1lc3NhZ2UsXG4gICAgSW5pdFJlcXVlc3QsXG4gICAgTWVzc2FnZURpcmVjdGlvbixcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtzZXRBdHRyaWJ1dGVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvc2V0QXR0cmlidXRlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtBZGRFdmVudExpc3RlbmVySGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50c1wiO1xuaW1wb3J0IHtHZXRFbGVtZW50VmFsdWVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvR2V0RWxlbWVudFZhbHVlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTZXRJbm5lckh0bWxIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvc2V0SW5uZXJIdG1sSGFuZGxlci50c1wiO1xuXG4vKipcbiAqIFRoZSBXZWJjb21wb25lbnQgU0RLIGlzIHRhaWxvcmVkIGZvciB1c2luZyBNeW9wIGNvbXBvbmVudHMgcGFja2FnZWQgYXMgc2VwYXJhdGUgYnVuZGxlcyBhbmQgZXhwb3NlZCBhcyB3ZWIgY29tcG9uZW50cy48YnIvPlxuICogRGV2ZWxvcGVycyBpbXBvcnRpbmcgdGhpcyBTREsgY2FuIGxldmVyYWdlIEFQSXMgYW5kIHV0aWxpdGllcyBzcGVjaWZpY2FsbHkgY3JhZnRlZCB0byBzdXBwb3J0IHRoZSBsaWZlY3ljbGUgbWFuYWdlbWVudCBhbmQgY29tbXVuaWNhdGlvbiBwYXR0ZXJucyByZXF1aXJlZCBmb3Igd2ViIGNvbXBvbmVudHMgd2l0aGluIHRoZSBNeW9wIGFyY2hpdGVjdHVyZS48YnIvPlxuICogVGhpcyBTREsgcHJvbW90ZXMgcmV1c2FiaWxpdHkgYW5kIGVuY2Fwc3VsYXRpb24sIGVuYWJsaW5nIGRldmVsb3BlcnMgdG8gYnVpbGQgbW9kdWxhciwgc2VsZi1jb250YWluZWQgY29tcG9uZW50cyB0aGF0IGNhbiBiZSBzZWFtbGVzc2x5IGludGVncmF0ZWQgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbidzIERPTSBzdHJ1Y3R1cmUuXG4gKlxuICpcbiAqIE9uY2UgbG9hZGVkIHRoZSBgUm9vdCBTREtgLCB5b3UgY2FuIGxvYWQgdGhlIGBJZnJhbWVTREtgXG4gKiBgYGBqc1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqIG9yXG4gKiBgYGB0c1xuICogaW1wb3J0IHtnZXRXZWJjb21wb25lbnRNb2R1bGV9IGZyb20gJ0BteW9wL3Nkayc7XG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCBnZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJDb21wb25lbnRTREsgZXh0ZW5kcyBCYXNlTXlvcFNESyB7XG5cbiAgICBhbHdheXNQYXNzRW52ZWxvcGVzVG9Ib3N0ID0gdHJ1ZTtcblxuICAgIC8vd2hlbiBuZXcgd2ViIGNvbXBvbmVudCBjcmVhdGVkLlxuICAgIGNvbm5lY3RlZENhbGxiYWNrID0gKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHNoYWRvdzogU2hhZG93Um9vdCkgPT4ge1xuICAgICAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihteW9wV2ViY29tcG9uZW50Q29uc3RzLndlYmNvbXBvbmVudF9tZXNzYWdlX2tleSwgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50Q29udGVudCA9IGUuZGF0YSA/IGUuZGF0YSA6IGUuZGV0YWlsO1xuICAgICAgICAgICAgaWYgKCFldmVudENvbnRlbnQgfHwgIWV2ZW50Q29udGVudC5teW9wKSB7XG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZWN2aWVkIHdlYmNvbXBvbmVudF9tZXNzYWdlIHdpdGggd3JvbmcgdHlwZScpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBldmVudENvbnRlbnQgYXMgQmFzZU15b3BNZXNzYWdlO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogc2VuZCBjb250YWluZXIgLyBjb21wb2VubnQgaWRlbnRpZmllciBmb3IgbXVsdGlsIGNvbXBvbmVudHMgc3VwcG9ydFxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlSW5jb21lTWVzc2FnZXMoZSlcblxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdDb21wb25lbnRJZCA9IChtZXNzYWdlIGFzIEluaXRNZXNzYWdlKS5jb250ZW50LmlkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNbbmV3Q29tcG9uZW50SWRdLmNvbnRleHQgPSBuZXcgU2hhZG93Um9vdFJlZihjb250YWluZXIsIHNoYWRvdylcblxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnN1cHBvcnRlZEhhbmRsZXJzLmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBoYW5kbGVyLmNvbnRleHQgPSB0aGlzLnNoYWRvd1Jvb3RzO1xuICAgICAgICAgICAgICAgICAgICAvLyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgLy9UT0RPIDogZml4IHRoYXQgaGFjay4gcmFjZSBjb25kaXRpb24gd2l0aCBob3N0LmxvYWQgd2hlbiBtb2R1bGUgbG9hZGVkXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBJbml0UmVxdWVzdCgpKVxuICAgICAgICB9LCAxKVxuICAgIH1cblxuICAgIG1lc3NhZ2VUb0hvc3QgPSAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4ge1xuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24udXBcbiAgICAgICAgLy9tZXNzYWdlLnJlcGxheVRvSGFuZGxlciA9IHJlcGxheVRvPy5oYW5kbGVyVW5pcXVlSWQ7XG5cbiAgICAgICAgaWYgKCFtZXNzYWdlLnJlcGxheVRvSGFuZGxlciAmJiByZXBsYXlUbz8uaGFuZGxlclVuaXF1ZUlkKVxuICAgICAgICAgICAgbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgPSByZXBsYXlUby5oYW5kbGVyVW5pcXVlSWRcblxuICAgICAgICB3aW5kb3cubXlvcC5ob3N0U0RLLnNlbmQobWVzc2FnZSlcbiAgICB9XG5cbiAgICBzdXBwb3J0ZWRIYW5kbGVyczogQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyW10gPSBbXG4gICAgICAgIG5ldyBDaGFuZ2VUZXh0SGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBTZXRJbm5lckh0bWxIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEJpbmRPbkNsaWNrSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IHNldEF0dHJpYnV0ZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgRXhlY3V0ZVNjcmlwdEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgR2V0RWxlbWVudFZhbHVlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIC8vXG4gICAgICAgIG5ldyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cylcbiAgICBdO1xuXG4gICAgcHVibGljIGluaXQgPSAoKSA9PiB7XG4gICAgICAgIC8vdGhpcy5teUNvbXBvbmVudElkXG4gICAgICAgIC8vdGhpcy5oYW5kbGVJbmNvbWVNZXNzYWdlc1xuICAgIH1cbn1cblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnV2ViQ29tcG9uZW50U0RLJywgV2ViQ29tcG9uZW50U0RLKTtcbiIsICJleHBvcnQgKiBmcm9tIFwiLi9XZWJDb21wb25lbnRTREtcIjtcbiIsICIvKipcbiAqIEVtYmVkZGVkIFNESyBDb250ZW50IE1vZHVsZVxuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSBlbWJlZGRlZCBTREsgY29udGVudCBmb3IgbnBtIHBhY2thZ2UgdXNlcnMuXG4gKiBUaGUgYWN0dWFsIGNvbnRlbnQgaXMgZ2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUgYnkgc2NyaXB0cy9idWlsZC1lbWJlZGRlZC1zZGsuanNcbiAqXG4gKiBGb3IgZGV2ZWxvcG1lbnQsIHRoaXMgZmlsZSBleHBvcnRzIHBsYWNlaG9sZGVycy5cbiAqIEFmdGVyIGJ1aWxkLCB0aGUgZGlzdC9tb2R1bGUvZW1iZWRkZWRTREsuanMgd2lsbCBjb250YWluIHRoZSBhY3R1YWwgU0RLIGNvbnRlbnQuXG4gKlxuICogVXNhZ2UgaW4gSFRNTENvbXBvbmVudExvYWRlcjpcbiAqIC0gSWYgSEFTX0VNQkVEREVEX1NESyBpcyB0cnVlLCBpbmplY3QgU0RLIGlubGluZTogPHNjcmlwdD4ke0VNQkVEREVEX1NES19DT05URU5UfTwvc2NyaXB0PlxuICogLSBJZiBIQVNfRU1CRURERURfU0RLIGlzIGZhbHNlLCBmYWxsIGJhY2sgdG8gQ0ROOiA8c2NyaXB0IHNyYz1cIiR7dXJsfVwiPjwvc2NyaXB0PlxuICovXG5cbi8qKlxuICogVGhlIGVtYmVkZGVkIFNESyBjb250ZW50IGFzIGEgbWluaWZpZWQgSmF2YVNjcmlwdCBzdHJpbmcuXG4gKiBUaGlzIHBsYWNlaG9sZGVyIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBhY3R1YWwgY29udGVudCBpbiB0aGUgYnVpbGQgb3V0cHV0LlxuICovXG5leHBvcnQgY29uc3QgRU1CRURERURfU0RLX0NPTlRFTlQ6IHN0cmluZyA9ICcnO1xuXG4vKipcbiAqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIGVtYmVkZGVkIFNESyBjb250ZW50IGlzIGF2YWlsYWJsZS5cbiAqIFRoaXMgaXMgZmFsc2UgaW4gZGV2ZWxvcG1lbnQsIHRydWUgaW4gdGhlIGJ1aWx0IG1vZHVsZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEhBU19FTUJFRERFRF9TREs6IGJvb2xlYW4gPSBmYWxzZTtcbiIsICJpbXBvcnQge015b3BXZWJDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BXZWJjb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcExvYWRlcn0gZnJvbSBcIi4vSU15b3BMb2FkZXJcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHMudHNcIjtcbmltcG9ydCB7XG4gICAgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSUhUTUxMb2FkZXJDb25maWcsXG4gICAgSVNraW5Db25maWcsIFNoYWRvd1Jvb3RNb2RlVHlwZSxcbiAgICBTa2luTG9hZGVycyxcbiAgICBSZW5kZXJNb2RlLCBSZW5kZXJQb2xpY3lcbn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtXZWJDb21wb25lbnRTREt9IGZyb20gXCIuLi8uLi93ZWJjb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcElmcmFtZUNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudC50c1wiO1xuaW1wb3J0IHtFTUJFRERFRF9TREtfQ09OVEVOVCwgSEFTX0VNQkVEREVEX1NES30gZnJvbSBcIi4uL2VtYmVkZGVkU0RLLnRzXCI7XG4vL2ltcG9ydCB7Z2V0V2ViY29tcG9uZW50TW9kdWxlfSBmcm9tIFwiLi4vLi4vU0RLLnRzXCI7XG5cbmNvbnN0IE1ZT1BfV0VCX0NPTVBPTkVOVF9NQVJLRVIgPSAnPCEtLSBteW9wLXdlYi1jb21wb25lbnQgLS0+JztcbmNvbnN0IE1ZT1BfV0VCX0NPTVBPTkVOVF9TQ1JJUFRfSUQgPSAnbXlvcC13ZWItY29tcG9uZW50JztcblxuLy8gVHJhY2sgZXh0cmFjdGVkIHdlYiBjb21wb25lbnQgc2NyaXB0cyB0byBwcmV2ZW50IGRvdWJsZSByZWdpc3RyYXRpb24uXG4vLyBNYXBzIHNjcmlwdElkIC0+IHRoZSB0YWcgbmFtZSB0aGF0IHNjcmlwdCByZWdpc3RlcmVkLiBUaGUgdGFnIE1VU1QgYmUgcmVtZW1iZXJlZCBwZXJcbi8vIHNjcmlwdDogd2luZG93Ll9fTVlPUF9UQUdfTkFNRV9fIGlzIGEgc2luZ2xlIGdsb2JhbCBzbG90IHRoYXQgZXZlcnkgZXh0cmFjdGVkIGNvbXBvbmVudFxuLy8gb3ZlcndyaXRlcywgc28gb24gYSByZS1tb3VudCAoc2NyaXB0IHNraXBwZWQpIGl0IGhvbGRzIHdoaWNoZXZlciBjb21wb25lbnQgcmFuIGxhc3QuXG5jb25zdCBleHRyYWN0ZWRXZWJDb21wb25lbnRTY3JpcHRzOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xuXG5jb25zdCBzZWVuOiBzdHJpbmdbXSA9IFtdO1xubGV0IHNkaztcbmNvbnN0IGdldEluaXRpYXRlZFNkayA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXNkaykge1xuICAgICAgICAvL2NvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gYXdhaXQgZ2V0V2ViY29tcG9uZW50TW9kdWxlKClcbiAgICAgICAgc2RrID0gbmV3IFdlYkNvbXBvbmVudFNESygpO1xuICAgICAgICBzZGsuaW5pdCgpO1xuICAgIH1cbiAgICByZXR1cm4gc2RrO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVIVE1MRWxlbWVudENvbnN0cnVjdG9yKGh0bWxTdHJpbmc6IHN0cmluZywgU2hhZG93Um9vdE1vZGU/OiBrZXlvZiB0eXBlb2YgU2hhZG93Um9vdE1vZGVUeXBlKTogbmV3ICgpID0+IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG5cbiAgICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgICAgICBjb25zdCBtb2RlID0gU2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5vcGVuID8gJ29wZW4nIDogJ2Nsb3NlZCc7XG4gICAgICAgICAgICBjb25zdCBzaGFkb3cgPSB0aGlzLmF0dGFjaFNoYWRvdyh7bW9kZX0pO1xuICAgICAgICAgICAgZ2V0SW5pdGlhdGVkU2RrKCkudGhlbigoc2RrKSA9PiB7XG4gICAgICAgICAgICAgICAgc2RrLmNvbm5lY3RlZENhbGxiYWNrKHRoaXMsIHNoYWRvdyk7XG4gICAgICAgICAgICAgICAgc2hhZG93LmlubmVySFRNTCA9IGh0bWxTdHJpbmdcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5jb25zdCBjcmVhdGVDdXN0b21XZWJDb21wb25lbnQgPSAoY29tcG9uZW50TmFtZTogc3RyaW5nLCBodG1sOiBzdHJpbmcsIFNoYWRvd1Jvb3RNb2RlPzoga2V5b2YgdHlwZW9mIFNoYWRvd1Jvb3RNb2RlVHlwZSkgPT4ge1xuICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZShjb21wb25lbnROYW1lLCBjcmVhdGVIVE1MRWxlbWVudENvbnN0cnVjdG9yKGh0bWwsIFNoYWRvd1Jvb3RNb2RlKSk7XG4gICAgY29uc29sZS5sb2coYGRlZmluZSgnJHtjb21wb25lbnROYW1lfScpIHdhcyBjYWxsZWQsIHdlYiBjb21wb25lbnQgcmVhZHkgdG8gdXNlYCk7XG59XG5cbmNvbnN0IHRvV2ViQ29tcG9uZW50TmFtZSA9IChzdHIpID0+IHtcbiAgICByZXR1cm4gc3RyXG4gICAgICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAnJDEtJDInKSAvLyBBZGQgaHlwaGVuIGJlZm9yZSB1cHBlcmNhc2UgbGV0dGVyc1xuICAgICAgICAucmVwbGFjZSgvKFxcZCspL2csICctJDEnKSAvLyBBZGQgaHlwaGVuIGJlZm9yZSBkaWdpdHNcbiAgICAgICAgLnRvTG93ZXJDYXNlKCk7IC8vIENvbnZlcnQgdG8gbG93ZXJjYXNlXG59XG5cbmNvbnN0IHRvQ3VzdG9tRWxlbWVudE5hbWUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgbmFtZSA9IHRvV2ViQ29tcG9uZW50TmFtZShuYW1lKTtcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlKC9fL2csICctJyk7XG59XG5cbmxldCBwYXJzZXI6IERPTVBhcnNlcjsgLy8gPSBuZXcgRE9NUGFyc2VyKCk7XG5cbmV4cG9ydCBjbGFzcyBIVE1MQ29tcG9uZW50TG9hZGVyIGV4dGVuZHMgQmFzZU15b3BMb2FkZXIge1xuXG4gICAgdHlwZSA9IFNraW5Mb2FkZXJzLkhUTUxMb2FkZXJcblxuICAgIC8qKlxuICAgICAqIERldGVjdCBpZiBIVE1MIGlzIGEgTXlvcCBXZWIgQ29tcG9uZW50LlxuICAgICAqXG4gICAgICogVEhFIE1BUktFUiBDT01NRU5UIEFMT05FIElTIE5PVCBBIFNBRkUgU0lHTkFMLCBCRUNBVVNFIE1JTklGSUVSUyBERUxFVEUgQ09NTUVOVFMuXG4gICAgICpcbiAgICAgKiBUaGlzIHVzZWQgdG8gYmUgYHN0YXJ0c1dpdGgoTVlPUF9XRUJfQ09NUE9ORU5UX01BUktFUilgIGFuZCBub3RoaW5nIGVsc2UuIFRoZVxuICAgICAqIGRlbGl2ZXJ5IGxhbmUgbWluaWZpZXMgd2l0aCBgcmVtb3ZlQ29tbWVudHM6IHRydWVgIChteW9wLXNlcnZlciBkZXJpdmUudHMgTUlOX0NGRyksXG4gICAgICogc28gdGhlIHN0b3JlZCBgbWluYCBhcnRpZmFjdCBvZiBldmVyeSB2MiB3ZWIgY29tcG9uZW50IGxvc2VzIGl0cyBsZWFkaW5nXG4gICAgICogYDwhLS0gbXlvcC13ZWItY29tcG9uZW50IC0tPmAuIERldGVjdGlvbiB0aGVuIHJldHVybmVkIGZhbHNlLCB0aGUgY29tcG9uZW50IGZlbGxcbiAgICAgKiBiYWNrIHRvIHBsYWluIGlmcmFtZSByZW5kZXJpbmcsIGFuZCB0aGUgd2hvbGUgYXV0aG9yZWQgZG9jdW1lbnQgd2FzIHNob3duIC0tXG4gICAgICogaW5jbHVkaW5nIHRoZSB2MiBhdXRob3Jpbmcgd3JhcHBlciwgc28gUGljLVRpbWUncyBwcm9kdWN0aW9uIGRhc2hib2FyZCBkaXNwbGF5ZWQgdGhlXG4gICAgICogcHJldmlldyBjaHJvbWUgKFwiV2ViIENvbXBvbmVudCB2MlwiLCBhIHRhZy1uYW1lIGJhZGdlIHJlYWRpbmcgYGxvYWRpbmcuLi5gLCBTSVpFIC9cbiAgICAgKiBPVkVSRkxPVyAvIEJHIGNvbnRyb2xzKSBpbnN0ZWFkIG9mIHRoZWlyIGNvbXBvbmVudC4gUmVwb3J0ZWQgMjAyNi0xMC0xODsgdGhlIHNlcnZlZFxuICAgICAqIEhUTUwgbWVhc3VyZWQgMzI4LDA3MSBieXRlcyBhZ2FpbnN0IDk1MSwxMzAgYXQgb3JpZ2luLCB3aXRoIHplcm8gYDwhLS1gIGxlZnQgaW4gaXQuXG4gICAgICpcbiAgICAgKiBUaGUgc2NyaXB0IGlkIGlzIHRoZSBzaWduYWwgdGhhdCBzdXJ2aXZlcywgYW5kIGl0IGlzIHRoZSBvbmUgYGV4dHJhY3RXZWJDb21wb25lbnRTY3JpcHRgXG4gICAgICogYWxyZWFkeSBkZXBlbmRzIG9uOiBpZiB0aGF0IGVsZW1lbnQgaXMgcHJlc2VudCwgZXh0cmFjdGlvbiB3b3Jrcywgc28gZGV0ZWN0aW9uXG4gICAgICogc2hvdWxkIGFncmVlLiBDaGVja2VkIHdpdGggYSByZWdleCByYXRoZXIgdGhhbiBET01QYXJzZXIgLS0gdGhpcyBydW5zIGZvciBldmVyeVxuICAgICAqIEhUTUwgY29tcG9uZW50LCBhbmQgcGFyc2luZyBhIDMwMCBLQiBkb2N1bWVudCB0byBhbnN3ZXIgYSB5ZXMvbm8gcXVlc3Rpb24gaXMgbm90XG4gICAgICogd29ydGggaXQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBpc015b3BXZWJDb21wb25lbnQoaHRtbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChodG1sLnRyaW1TdGFydCgpLnN0YXJ0c1dpdGgoTVlPUF9XRUJfQ09NUE9ORU5UX01BUktFUikpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChgPHNjcmlwdFtePl0qXFxcXHNpZD1bXCInXT8ke01ZT1BfV0VCX0NPTVBPTkVOVF9TQ1JJUFRfSUR9W1wiJ1xcXFxzPl1gLCAnaScpLnRlc3QoaHRtbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBob3cgdGhpcyBjb21wb25lbnQgc2hvdWxkIHJlbmRlciwgYXBwbHlpbmcgdGhlIGhvc3QgcmVuZGVyIHBvbGljeS5cbiAgICAgKiBQcmVjZWRlbmNlOiBvcHRpb25zLnJlbmRlclBvbGljeSAocGVyLWNhbGwpIGZ1bGx5IHJlcGxhY2VzIHRoZSBnbG9iYWxcbiAgICAgKiBob3N0U0RLLnNldFJlbmRlclBvbGljeSBcdTIwMTQgc28gYW4gYXBwIGNhbiByZXN0cmljdCBnbG9iYWxseSBhbmQgYWxsb3cgc3BlY2lmaWNzLlxuICAgICAqIFdpdGggbm8gcG9saWN5IHNldCwgYmVoYXZpb3IgaXMgdW5jaGFuZ2VkIGZyb20gYmVmb3JlIChtYXJrZXIgXHUyMUQyIHdlYiBjb21wb25lbnQpLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVJlbmRlck1vZGUoXG4gICAgICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgICAgICBza2luOiBJU2tpbkNvbmZpZyxcbiAgICAgICAgbG9hZGVyQ29uZmlnOiBJSFRNTExvYWRlckNvbmZpZyxcbiAgICAgICAgaXNXZWJDb21wb25lbnQ6IGJvb2xlYW4sXG4gICAgICAgIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zLFxuICAgICk6IFByb21pc2U8eyBtb2RlOiBSZW5kZXJNb2RlIHwgZmFsc2U7IGlzb2xhdGU6IGJvb2xlYW4gfT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ZWRNb2RlOiBSZW5kZXJNb2RlID0gaXNXZWJDb21wb25lbnRcbiAgICAgICAgICAgID8gJ3dlYkNvbXBvbmVudCdcbiAgICAgICAgICAgIDogKChsb2FkZXJDb25maWcuaXNvbGF0aW9uIHx8IG9wdGlvbnM/Lmlzb2xhdGlvbikgPyAnaXNvbGF0ZWRJZnJhbWUnIDogJ2lmcmFtZScpO1xuXG4gICAgICAgIC8vIHBlci1jYWxsIHBvbGljeSB3aW5zOyBlbHNlIGdsb2JhbCBwb2xpY3kgb24gdGhlIGhvc3QgU0RLIHNpbmdsZXRvbi5cbiAgICAgICAgY29uc3QgcG9saWN5OiBSZW5kZXJQb2xpY3kgfCB1bmRlZmluZWQgPVxuICAgICAgICAgICAgb3B0aW9ucz8ucmVuZGVyUG9saWN5ID8/ICh3aW5kb3cgYXMgYW55KT8ubXlvcD8uaG9zdFNESz8uZ2V0UmVuZGVyUG9saWN5Py4oKTtcblxuICAgICAgICBjb25zdCBtb2RlOiBSZW5kZXJNb2RlIHwgZmFsc2UgPSBwb2xpY3lcbiAgICAgICAgICAgID8gYXdhaXQgcG9saWN5KHsgY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgcmVxdWVzdGVkTW9kZSwgaXNXZWJDb21wb25lbnQgfSlcbiAgICAgICAgICAgIDogcmVxdWVzdGVkTW9kZTtcblxuICAgICAgICByZXR1cm4geyBtb2RlLCBpc29sYXRlOiBtb2RlID09PSAnaXNvbGF0ZWRJZnJhbWUnIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGluLWZyYW1lIGJyaWRnZSBmb3IgaXNvbGF0ZWQgY29tcG9uZW50cy4gUnVucyBpbnNpZGUgdGhlIHNhbmRib3hlZFxuICAgICAqIChvcGFxdWUtb3JpZ2luKSBpZnJhbWUsIHRyYW5zbGF0aW5nIHRoZSBzYW1lIGF1dGhvci1mYWNpbmcgY29udHJhY3QgdG8vZnJvbVxuICAgICAqIHBvc3RNZXNzYWdlIHNpbmNlIHRoZSBob3N0IGhhcyBubyBzYW1lLW9yaWdpbiBhY2Nlc3M6XG4gICAgICogICBcdTIwMjIgZGF0YS1pbiA6IHBhcmVudCBwb3N0cyB7dHlwZTonbXlvcDppbml0J30gXHUyMTkyIGNhbGxzIHdpbmRvdy5teW9wX2luaXRfaW50ZXJmYWNlXG4gICAgICogICAgICAgICAgICAgICAocGx1cyBhIGJha2VkIGluaXRpYWwgdmFsdWUgZm9yIHRoZSBmaXJzdCByZW5kZXIpXG4gICAgICogICBcdTIwMjIgZGF0YS1vdXQ6IHdpbmRvdy5teW9wX2N0YV9oYW5kbGVyIFx1MjE5MiBwYXJlbnQucG9zdE1lc3NhZ2Uoe3R5cGU6J215b3A6Y3RhJ30pXG4gICAgICogICBcdTIwMjIgcmVzaXplICA6IFJlc2l6ZU9ic2VydmVyIFx1MjE5MiBwYXJlbnQucG9zdE1lc3NhZ2Uoe3R5cGU6J215b3A6c2l6ZSd9KVxuICAgICAqXG4gICAgICogVE9ETyhkZXYtZXh0ZW5zaW9uKTogdGhlIGlzb2xhdGVkIHBhdGggZGVsaWJlcmF0ZWx5IHNraXBzIHRoZSBzYW1lLW9yaWdpblxuICAgICAqIGRhdGFTY3JpcHQsIHNvIGl0IG5ldmVyIHBvc3RzIHRoZSBgTVlPUF9QUkVJTkpFQ1RFRF9JTklUYCBtZXNzYWdlIHRoZSBNeW9wIGRldlxuICAgICAqIGV4dGVuc2lvbiBsaXN0ZW5zIGZvciB0byBsb2cgdGhlIElOSVRJQUwgcmVuZGVyIChgaW5pdCpgKS4gTGF0ZXIgaW5pdCB1cGRhdGVzIGFuZFxuICAgICAqIGFsbCBDVEFzIGFyZSBzdGlsbCB0cmFja2VkICh0aGUgZXh0ZW5zaW9uIHdyYXBzIGBjb21wLnByb3BzYCwgd2hpY2ggb3VyIGlzb2xhdGVkXG4gICAgICogY29ubmVjdFByb3BzIGJyYW5jaCByb3V0ZXMgdGhyb3VnaCksIHNvIG9ubHkgdGhlIGZpcnN0LXJlbmRlciBwYXlsb2FkIGlzIG1pc3NpbmdcbiAgICAgKiBmcm9tIHRoZSBleHRlbnNpb24ncyBhY3Rpdml0eSBsb2cgZm9yIGlzb2xhdGVkIGNvbXBvbmVudHMuIENsb3NpbmcgdGhpcyB3b3VsZCBiZSBhXG4gICAgICogfjEtbGluZSBgcGFyZW50LnBvc3RNZXNzYWdlKHt0eXBlOidNWU9QX1BSRUlOSkVDVEVEX0lOSVQnLCBwYXlsb2FkOntkYXRhfX0pYCBpbnNpZGVcbiAgICAgKiBmbHVzaEluaXRpYWwoKSBiZWxvdyBcdTIwMTQgaW50ZW50aW9uYWxseSBOT1QgZG9uZSBmb3Igbm93IHRvIGF2b2lkIGFkZGluZyBleHRlbnNpb24tb25seVxuICAgICAqIHRyYWZmaWMgdG8gdGhlIGNvbXBvbmVudCBydW50aW1lLiBXZWIgY29tcG9uZW50cyBoYXZlIHRoZSBzYW1lIGluaXRpYWwtaW5pdCBnYXBcbiAgICAgKiAoaW5pdFdpdGhEYXRhIGlzIGNhbGxlZCBvbiB0aGUgZWxlbWVudCwgbm90IHZpYSBjb21wLnByb3BzKSBhbmQgaXQgcHJlZGF0ZXMgdGhpcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGJ1aWxkSXNvbGF0aW9uQnJpZGdlKGluaXRpYWxEYXRhTGl0ZXJhbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGA8c2NyaXB0PlxuICAgICAgICAgICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgX19pbml0aWFsID0gJHtpbml0aWFsRGF0YUxpdGVyYWx9O1xuICAgICAgICAgICAgICAgIHZhciBfX3BlbmRpbmc7XG4gICAgICAgICAgICAgICAgLy8gZGF0YS1vdXQgKGN0YSlcbiAgICAgICAgICAgICAgICB3aW5kb3cubXlvcF9jdGFfaGFuZGxlciA9IGZ1bmN0aW9uIChhY3Rpb24sIHBheWxvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgcGFyZW50LnBvc3RNZXNzYWdlKHsgX19teW9wOiB0cnVlLCB0eXBlOiAnbXlvcDpjdGEnLCBhY3Rpb246IGFjdGlvbiwgcGF5bG9hZDogcGF5bG9hZCB9LCAnKicpOyB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gY2FsbEluaXQoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5teW9wX2luaXRfaW50ZXJmYWNlID09PSAnZnVuY3Rpb24nKSB7IHdpbmRvdy5teW9wX2luaXRfaW50ZXJmYWNlKGRhdGEpOyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGRhdGEtaW4gKGluaXQgdXBkYXRlcylcbiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkID0gZS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWQgfHwgZC5fX215b3AgIT09IHRydWUpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGQudHlwZSA9PT0gJ215b3A6aW5pdCcpIHsgaWYgKCFjYWxsSW5pdChkLmRhdGEpKSBfX3BlbmRpbmcgPSBkLmRhdGE7IH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyBmaXJzdCByZW5kZXI6IHVzZSBhIHBlbmRpbmcgdXBkYXRlIGlmIG9uZSBhcnJpdmVkLCBlbHNlIHRoZSBiYWtlZCBpbml0aWFsIGRhdGFcbiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gZmx1c2hJbml0aWFsKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IChfX3BlbmRpbmcgIT09IHVuZGVmaW5lZCkgPyBfX3BlbmRpbmcgOiBfX2luaXRpYWw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxJbml0KGRhdGEpKSB7IF9fcGVuZGluZyA9IHVuZGVmaW5lZDsgX19pbml0aWFsID0gdW5kZWZpbmVkOyB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZsdXNoSW5pdGlhbCk7XG4gICAgICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgICAgICAvLyByZXNpemUgKHJlcG9ydCBjb250ZW50IHNpemUpXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gY29udGVudEhlaWdodCgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTWVhc3VyZSB0aGUgQk9EWSAoY29udGVudCBib3gpLiBkb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0IGluY2x1ZGVzXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpZnJhbWUgdmlld3BvcnQgXHUyMDE0IHdoaWNoIHdlJ3JlIGRyaXZpbmcgXHUyMDE0IHNvIGl0IHdvdWxkIHJlcG9ydCB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBmcmFtZSBoZWlnaHQsIG5vdCB0aGUgY29udGVudCwgYW5kIG5ldmVyIHNocmluay5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgICAgICAgICAgICAgICBpZiAoYikgcmV0dXJuIE1hdGgubWF4KGIuc2Nyb2xsSGVpZ2h0LCBiLm9mZnNldEhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBwb3N0U2l6ZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19teW9wOiB0cnVlLCB0eXBlOiAnbXlvcDpzaXplJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGNvbnRlbnRIZWlnaHQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAnKicpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBPYnNlcnZlIHRoZSBCT0RZIChyZWZsb3dzIHdpdGggY29udGVudCkgXHUyMDE0IG5vdCBkb2N1bWVudEVsZW1lbnQsIHdob3NlIGJveCBpc1xuICAgICAgICAgICAgICAgIC8vIHRoZSBpZnJhbWUgdmlld3BvcnQgYW5kIHdvdWxkIGZlZWQgYmFjayBpbnRvIGEgcmVzaXplIGxvb3AuIEEgTXV0YXRpb25PYnNlcnZlclxuICAgICAgICAgICAgICAgIC8vIGNhdGNoZXMgY29udGVudCBzd2FwcyAoZS5nLiBpbm5lckhUTUwgcmUtcmVuZGVyKSB0aGF0IGRvbid0IGNoYW5nZSBib2R5J3MgYm94LlxuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuUmVzaXplT2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgdmFyIF9fcm8gPSBuZXcgUmVzaXplT2JzZXJ2ZXIocG9zdFNpemUpOyBpZiAoZG9jdW1lbnQuYm9keSkgX19yby5vYnNlcnZlKGRvY3VtZW50LmJvZHkpOyB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAod2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIgJiYgZG9jdW1lbnQuYm9keSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkgeyBuZXcgTXV0YXRpb25PYnNlcnZlcihwb3N0U2l6ZSkub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSwgYXR0cmlidXRlczogdHJ1ZSwgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTsgfSBjYXRjaCAoZSkge31cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBwb3N0U2l6ZSk7XG4gICAgICAgICAgICAgICAgcG9zdFNpemUoKTtcbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgIDwvc2NyaXB0PmA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdCB0aGUgd2ViIGNvbXBvbmVudCBzY3JpcHQgY29udGVudCBmcm9tIEhUTUxcbiAgICAgKi9cbiAgICBwcml2YXRlIGV4dHJhY3RXZWJDb21wb25lbnRTY3JpcHQoaHRtbDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgY29uc3QgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhodG1sLCAndGV4dC9odG1sJyk7XG4gICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvYy5nZXRFbGVtZW50QnlJZChNWU9QX1dFQl9DT01QT05FTlRfU0NSSVBUX0lEKTtcbiAgICAgICAgcmV0dXJuIHNjcmlwdD8udGV4dENvbnRlbnQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIHRoZSB3ZWIgY29tcG9uZW50IHNjcmlwdCBvbiB0aGUgaG9zdCBkb2N1bWVudC5cbiAgICAgKiBSZXR1cm5zIHRoZSBjdXN0b20gZWxlbWVudCB0YWcgbmFtZSB0aGlzIHNjcmlwdCByZWdpc3RlcmVkLlxuICAgICAqL1xuICAgIHByaXZhdGUgZXhlY3V0ZVdlYkNvbXBvbmVudFNjcmlwdChzY3JpcHRDb250ZW50OiBzdHJpbmcsIHNjcmlwdElkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICAvLyBDaGVjayBpZiBhbHJlYWR5IGV4ZWN1dGVkIChieSBzY3JpcHQgY29udGVudCBoYXNoKVxuICAgICAgICBjb25zdCBjYWNoZWRUYWdOYW1lID0gZXh0cmFjdGVkV2ViQ29tcG9uZW50U2NyaXB0cy5nZXQoc2NyaXB0SWQpO1xuICAgICAgICBpZiAoY2FjaGVkVGFnTmFtZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFtNeW9wV2ViQ29tcG9uZW50XSBTY3JpcHQgYWxyZWFkeSBleGVjdXRlZCBmb3IgJHtzY3JpcHRJZH0sIHJldXNpbmcgPCR7Y2FjaGVkVGFnTmFtZX0+YCk7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkVGFnTmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICBzY3JpcHQudGV4dENvbnRlbnQgPSBzY3JpcHRDb250ZW50O1xuICAgICAgICBzY3JpcHQuaWQgPSBgbXlvcC1leHRyYWN0ZWQtJHtzY3JpcHRJZH1gO1xuICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgZ2xvYmFsIGltbWVkaWF0ZWx5OiB0aGUgbmV4dCBleHRyYWN0ZWQgc2NyaXB0IHRvIHJ1biB3aWxsIG92ZXJ3cml0ZSBpdC5cbiAgICAgICAgY29uc3QgdGFnTmFtZSA9ICh3aW5kb3cgYXMgYW55KS5fX01ZT1BfVEFHX05BTUVfXztcbiAgICAgICAgaWYgKHRhZ05hbWUpIHtcbiAgICAgICAgICAgIGV4dHJhY3RlZFdlYkNvbXBvbmVudFNjcmlwdHMuc2V0KHNjcmlwdElkLCB0YWdOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgW015b3BXZWJDb21wb25lbnRdIEV4ZWN1dGVkIHdlYiBjb21wb25lbnQgc2NyaXB0OiAke3NjcmlwdElkfSAtPiA8JHt0YWdOYW1lfT5gKTtcbiAgICAgICAgcmV0dXJuIHRhZ05hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCBhIE15b3AgV2ViIENvbXBvbmVudCAoZXh0cmFjdGVkIGFuZCBydW4gb24gaG9zdCBkb2N1bWVudClcbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGxvYWRFeHRyYWN0ZWRXZWJDb21wb25lbnQoXG4gICAgICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgICAgICBza2luOiBJU2tpbkNvbmZpZyxcbiAgICAgICAgY29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgICAgICAgaHRtbDogc3RyaW5nLFxuICAgICAgICBvcHRpb25zPzogbG9hZGVyT3B0aW9uc1xuICAgICk6IFByb21pc2U8TXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudD4ge1xuICAgICAgICBjb25zdCBzY3JpcHRDb250ZW50ID0gdGhpcy5leHRyYWN0V2ViQ29tcG9uZW50U2NyaXB0KGh0bWwpO1xuXG4gICAgICAgIGlmICghc2NyaXB0Q29udGVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbTXlvcFdlYkNvbXBvbmVudF0gTm8gPHNjcmlwdCBpZD1cIm15b3Atd2ViLWNvbXBvbmVudFwiPiBmb3VuZCBpbiBIVE1MJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2UgY29tcG9uZW50IGRlZmluaXRpb24gaWQgYXMgc2NyaXB0IGlkZW50aWZpZXIgZm9yIGRlZHVwbGljYXRpb25cbiAgICAgICAgY29uc3Qgc2NyaXB0SWQgPSBgJHtjb21wb25lbnREZWZpbml0aW9uLmlkfS0ke3NraW4uaWR9YDtcblxuICAgICAgICAvLyBFeGVjdXRlIHRoZSBzY3JpcHQgb24gdGhlIGhvc3QgZG9jdW1lbnQsIG9yIHJldXNlIHRoZSB0YWcgaXQgcmVnaXN0ZXJlZCBlYXJsaWVyLlxuICAgICAgICAvLyBOZXZlciByZS1yZWFkIHdpbmRvdy5fX01ZT1BfVEFHX05BTUVfXyBoZXJlOiBvbiBhIHJlLW1vdW50IHRoZSBzY3JpcHQgaXMgc2tpcHBlZCBhbmRcbiAgICAgICAgLy8gdGhlIGdsb2JhbCBzdGlsbCBwb2ludHMgYXQgd2hpY2hldmVyIGNvbXBvbmVudCdzIHNjcmlwdCByYW4gbGFzdCwgd2hpY2ggd291bGQgYnVpbGRcbiAgICAgICAgLy8gdGhpcyBjb250YWluZXIncyBlbGVtZW50IGZyb20gYW5vdGhlciBjb21wb25lbnQncyB0YWcuXG4gICAgICAgIGNvbnN0IHRhZ05hbWUgPSB0aGlzLmV4ZWN1dGVXZWJDb21wb25lbnRTY3JpcHQoc2NyaXB0Q29udGVudCwgc2NyaXB0SWQpO1xuXG4gICAgICAgIGlmICghdGFnTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbTXlvcFdlYkNvbXBvbmVudF0gU2NyaXB0IGRpZCBub3Qgc2V0IHdpbmRvdy5fX01ZT1BfVEFHX05BTUVfXycpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBjdXN0b20gZWxlbWVudFxuICAgICAgICBjb25zdCBkb21JZCA9IGBteW9wLWNvbXAtJHt1dWlkdjQoKX1gO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTtcbiAgICAgICAgZWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgIGlmIChvcHRpb25zPy5oaWRkZW4pIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciBjb250YWluZXIgaWYgbmVlZGVkXG4gICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENPTlNUUlVDVCBCRUZPUkUgQVBQRU5ESU5HLiBBcHBlbmRpbmcgaXMgd2hhdCBjb25uZWN0cyB0aGUgZWxlbWVudCBhbmQgZmlyZXMgaXRzXG4gICAgICAgIC8vIGNvbm5lY3RlZENhbGxiYWNrLCBhbmQgdGhlIHdyYXBwZXIncyBjb25zdHJ1Y3RvciBpcyB3aGVyZSB0aGUgc2luZ2xlICdteW9wLWN0YSdcbiAgICAgICAgLy8gbGlzdGVuZXIgaXMgYXR0YWNoZWQuIFdpdGggdGhlIGFwcGVuZCBmaXJzdCwgYW55IENUQSBhIGNvbXBvbmVudCBlbWl0cyBmcm9tXG4gICAgICAgIC8vIGNvbm5lY3RlZENhbGxiYWNrIC0tIGEgc2VhcmNoIGJveCBhbm5vdW5jaW5nIGl0cyBpbml0aWFsIHN0YXRlLCBhIHdpZGdldFxuICAgICAgICAvLyByZXBvcnRpbmcgYSBkZWZhdWx0IHNlbGVjdGlvbiAtLSB3YXMgZGlzcGF0Y2hlZCBiZWZvcmUgYW55dGhpbmcgd2FzIGxpc3RlbmluZ1xuICAgICAgICAvLyBhbmQgc2lsZW50bHkgbG9zdC4gVGhlIHdyYXBwZXIgb25seSBuZWVkcyB0aGUgZWxlbWVudCByZWZlcmVuY2UsIG5vdCBhIGNvbm5lY3RlZFxuICAgICAgICAvLyBlbGVtZW50LCBzbyBjb25zdHJ1Y3RpbmcgZmlyc3QgY29zdHMgbm90aGluZyBhbmQgbWFrZXMgdGhlIGJ1ZmZlciBjb3ZlciB0aGVcbiAgICAgICAgLy8gd2hvbGUgZmlyc3QgcmVuZGVyIHJhdGhlciB0aGFuIG9ubHkgdGhlIGluaXRXaXRoRGF0YSBwYXJ0IG9mIGl0LlxuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudChcbiAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb24sXG4gICAgICAgICAgICBza2luLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgIHRhZ05hbWUsXG4gICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgd2l0aCBkYXRhIGlmIHByb3ZpZGVkLiBgbnVsbGAgaXMgbm90IGRhdGEgLS0gc2VlIHRoZSBkYXRhIHNjcmlwdFxuICAgICAgICAvLyBndWFyZCBpbiB0aGUgSFRNTCBwYXRoIGZvciB3aHkgY2FsbGluZyBhbiBpbml0IGludGVyZmFjZSB3aXRoIG51bGwgaXMgd29yc2VcbiAgICAgICAgLy8gdGhhbiBub3QgY2FsbGluZyBpdC5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmRhdGEgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zPy5kYXRhICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuaW5pdFdpdGhEYXRhKG9wdGlvbnMuZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyhgW015b3BXZWJDb21wb25lbnRdIExvYWRlZCA8JHt0YWdOYW1lfT4gaW50byBjb250YWluZXJgKTtcblxuICAgICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cblxuICAgIGxvYWQgPSBhc3luYyAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4ge1xuXG4gICAgICAgIGNvbnN0IGxvYWRlckNvbmZpZyA9IChza2luLmxvYWRlciBhcyBJSFRNTExvYWRlckNvbmZpZyk7XG5cbiAgICAgICAgY29uc3QgaXNXQyA9IHRoaXMuaXNNeW9wV2ViQ29tcG9uZW50KGxvYWRlckNvbmZpZy5IVE1MKTtcbiAgICAgICAgY29uc3QgeyBtb2RlLCBpc29sYXRlIH0gPSBhd2FpdCB0aGlzLnJlc29sdmVSZW5kZXJNb2RlKGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGxvYWRlckNvbmZpZywgaXNXQywgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKG1vZGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtNeW9wXSBSZW5kZXJpbmcgYmxvY2tlZCBieSByZW5kZXIgcG9saWN5IGZvciBjb21wb25lbnQgXCIke2NvbXBvbmVudERlZmluaXRpb24uaWR9XCJgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1dDKSB7XG4gICAgICAgICAgICAvLyBXZWItY29tcG9uZW50IEhUTUwgb25seSBzdXBwb3J0cyB0aGUgd2ViLWNvbXBvbmVudCBjb250cmFjdDsgYSBwb2xpY3kgdGhhdFxuICAgICAgICAgICAgLy8gZGVuaWVzIGl0IGhhcyBubyBpZnJhbWUgZmFsbGJhY2sgKHNlZSBwbGFuIFx1MDBBNzMuMykgXHUyMDE0IGJsb2NrIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAvLyBzaWxlbnRseSByZW5kZXIgYnJva2VuLiBVbnRydXN0ZWQgY29udHJpYnV0b3JzIG11c3Qgc2hpcCBpZnJhbWUgY29tcG9uZW50cy5cbiAgICAgICAgICAgIGlmIChtb2RlICE9PSAnd2ViQ29tcG9uZW50Jykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW015b3BdIFdlYi1jb21wb25lbnQgcmVuZGVyaW5nIGRlbmllZCBieSByZW5kZXIgcG9saWN5IGZvciBjb21wb25lbnQgXCIke2NvbXBvbmVudERlZmluaXRpb24uaWR9XCJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRFeHRyYWN0ZWRXZWJDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBsb2FkZXJDb25maWcuSFRNTCwgb3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZG9tSWQgPSBgbXlvcC1jb21wLSR7dXVpZHY0KCl9YFxuICAgICAgICBsZXQgZWxlbWVudDtcblxuICAgICAgICBpZiAobG9hZGVyQ29uZmlnLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgY29uc3QgdW5pcUlkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICBjb25zdCBkb21JZCA9IGBteW9wLWNvbXAtJHt1bmlxSWR9YFxuXG4gICAgICAgICAgICBsZXQgSWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgICAgICAvLyBGdWxsIGlzb2xhdGlvbjogYSBzYW5kYm94IFdJVEhPVVQgYWxsb3ctc2FtZS1vcmlnaW4gZ2l2ZXMgdGhlIGZyYW1lIGFuXG4gICAgICAgICAgICAvLyBvcGFxdWUgb3JpZ2luIFx1MjAxNCBubyBob3N0IERPTS9jb29raWVzL3BhcmVudCBhY2Nlc3MuIE11c3QgYmUgc2V0IGJlZm9yZVxuICAgICAgICAgICAgLy8gdGhlIGZyYW1lIG5hdmlnYXRlcyAoaS5lLiBiZWZvcmUgc3JjZG9jIC8gYXBwZW5kKS5cbiAgICAgICAgICAgIGlmIChpc29sYXRlKSB7XG4gICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3NhbmRib3gnLCAnYWxsb3ctc2NyaXB0cyBhbGxvdy1mb3JtcyBhbGxvdy1wb3B1cHMnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2V0IGFsbCBzdHlsZXMgQkVGT1JFIGFwcGVuZGluZyB0byBwcmV2ZW50IGZsYXNoIGF0IHdyb25nIHBvc2l0aW9uXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnN0eWxlLmNzc1RleHQgPSBgXG4gICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgICAgIGluc2V0OiAwO1xuICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgICAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICAgICAgICAgIG9wYWNpdHk6ICR7b3B0aW9ucz8uaGlkZGVuID8gJzAnIDogJzEnfTtcbiAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6ICR7b3B0aW9ucz8uaGlkZGVuID8gJ25vbmUnIDogJ2FsbCd9O1xuICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuXG4gICAgICAgICAgICAvLyBXcml0ZSBjb250ZW50IGludG8gdGhlIGlmcmFtZS4gQW4gaXNvbGF0ZWQgKHNhbmRib3hlZCwgb3BhcXVlLW9yaWdpbikgZnJhbWVcbiAgICAgICAgICAgIC8vIGNhbid0IGJlIGRvYy53cml0ZSgpJ24gZnJvbSB0aGUgaG9zdCwgc28gYWNjdW11bGF0ZSB0aGUgbWFya3VwIGFuZCBzZXQgaXQgdmlhXG4gICAgICAgICAgICAvLyBzcmNkb2Mgb24gY2xvc2UoKS4gTm9uLWlzb2xhdGVkIGZyYW1lcyBrZWVwIHRoZSBzYW1lLW9yaWdpbiBkb2Mud3JpdGUgcGF0aC5cbiAgICAgICAgICAgIGNvbnN0IF9fc3JjUGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBjb25zdCBkb2M6IHsgb3BlbigpOiB2b2lkOyB3cml0ZWxuKHM6IHN0cmluZyk6IHZvaWQ7IGNsb3NlKCk6IHZvaWQgfSA9IGlzb2xhdGVcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgb3BlbigpIHt9LFxuICAgICAgICAgICAgICAgICAgICB3cml0ZWxuKHM6IHN0cmluZykgeyBfX3NyY1BhcnRzLnB1c2gocyk7IH0sXG4gICAgICAgICAgICAgICAgICAgIGNsb3NlKCkgeyBJZnJhbWVFbGVtZW50LnNyY2RvYyA9IF9fc3JjUGFydHMuam9pbignXFxuJyk7IH0sXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGQgPSBJZnJhbWVFbGVtZW50LmNvbnRlbnREb2N1bWVudCB8fCBJZnJhbWVFbGVtZW50LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGQub3BlbigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgICAgICAgICB9KSgpO1xuXG5cbiAgICAgICAgICAgIC8vIFBhcnNlIG15b3A6c2l6ZSBtZXRhIHRhZyBiZWZvcmUgaWZyYW1lIGNyZWF0aW9uIChzYW1lIERPTVBhcnNlciBwYXNzIHBhdHRlcm4gYXMgbXlvcF9wcmV2aWV3IHJlbW92YWwpLlxuICAgICAgICAgICAgLy8gVGhpcyBsZXRzIHRoZSBSZWFjdCBob3N0IGRldGVybWluZSBzaXppbmcgbW9kZSAoZmlsbCB2cyBjb250ZW50KSBmcm9tIHRoZSBzdGFydC5cbiAgICAgICAgICAgIGxldCBwYXJzZWRTaXplTWV0YTogeyB3aWR0aD86IHN0cmluZyB8IG51bWJlcjsgaGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyOyBtaW5XaWR0aD86IG51bWJlcjsgbWF4V2lkdGg/OiBudW1iZXI7IG1pbkhlaWdodD86IG51bWJlcjsgbWF4SGVpZ2h0PzogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCBfcHJlUGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9wcmVEb2MgPSBfcHJlUGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNpemVNZXRhID0gX3ByZURvYy5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJteW9wOnNpemVcIl0nKTtcbiAgICAgICAgICAgICAgICBpZiAoc2l6ZU1ldGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgcGFyc2VkU2l6ZU1ldGEgPSBKU09OLnBhcnNlKHNpemVNZXRhLmdldEF0dHJpYnV0ZSgnY29udGVudCcpIHx8ICd7fScpOyB9IGNhdGNoIHt9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgSFRNTDJSZW5kZXIgPSBsb2FkZXJDb25maWcuSFRNTDtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/Ll9pbnNwZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgLy9pbmplY3QgaW5zcGVjdGlvbiBzY3JpcHQgZm9yIHByb3BzIGRldGVjdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBfZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuXG4gICAgICAgICAgICAgICAgLy8gVE9ETyA6IHBhcnQgb2YgQUkgY29tcG9uZW50cywgdGhpbmsgYWJvdXQgdGhhdCwgZG9jdW1lbnQgaXQuXG4gICAgICAgICAgICAgICAgY29uc3QgbXlvcF9wcmV2aWV3X3NjcmlwdCA9IF9kb2MuZ2V0RWxlbWVudEJ5SWQoJ215b3BfcHJldmlldycpO1xuICAgICAgICAgICAgICAgIG15b3BfcHJldmlld19zY3JpcHQ/LnJlbW92ZUF0dHJpYnV0ZSgndHlwZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gUGFyc2UgdGhlIGluamVjdGVkIEhUTUwgc3RyaW5nIGludG8gYSBub2RlXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcCA9IF9kb2MuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCk7XG4gICAgICAgICAgICAgICAgdGVtcC5ib2R5LmlubmVySFRNTCA9IGA8c2NyaXB0PlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmVmb3JlS2V5c1dpbmRvdyA9IG5ldyBTZXQoT2JqZWN0LmtleXMod2luZG93KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcFN0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZUtleXNXaW5kb3csXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gdGVtcC5ib2R5LmZpcnN0Q2hpbGQ7XG5cbiAgICAgICAgICAgICAgICBpZiAobm9kZSAmJiBfZG9jLmhlYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgX2RvYy5oZWFkLmluc2VydEJlZm9yZShfZG9jLmltcG9ydE5vZGUobm9kZSwgdHJ1ZSksIF9kb2MuaGVhZC5maXJzdENoaWxkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBQcmVwZW5kIERPQ1RZUEU6IGRvY3VtZW50RWxlbWVudC5vdXRlckhUTUwgcmV0dXJucyBvbmx5IDxodG1sPi4uLjwvaHRtbD5cbiAgICAgICAgICAgICAgICAvLyBhbmQgZHJvcHMgdGhlIGRvY3R5cGUsIHdoaWNoIHdvdWxkIHB1dCB0aGUgaWZyYW1lIGluIHF1aXJrcyBtb2RlLlxuICAgICAgICAgICAgICAgIC8vIFF1aXJrcyBtb2RlIGJyZWFrcyBhdXRvLXNpemluZyBiZWNhdXNlIDxib2R5PiBzdHJldGNoZXMgdG8gdGhlIGlmcmFtZVxuICAgICAgICAgICAgICAgIC8vIHZpZXdwb3J0IGluc3RlYWQgb2Ygc2hyaW5raW5nIHRvIGNvbnRlbnQsIHNvIFJlc2l6ZU9ic2VydmVyIG9uIGJvZHlcbiAgICAgICAgICAgICAgICAvLyBuZXZlciBmaXJlcyB3aGVuIGNvbnRlbnQgcmVmbG93cyAoZS5nLiBhZnRlciBmb250IHN3YXApLlxuICAgICAgICAgICAgICAgIEhUTUwyUmVuZGVyID0gJzwhRE9DVFlQRSBodG1sPicgKyBfZG9jLmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnM/LmRhdGEgIT09IHVuZGVmaW5lZCkge1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPOiBpbXByb3ZlIGJ5IGRvIGl0IG9uIHRoZSBzZXJ2ZSBvbmNlXG5cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgbXlvcF9wcmV2aWV3IHNjcmlwdCB3aGVuIG5vdCBpbiBpbnNwZWN0aW9uIG1vZGVcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgX2RvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcobG9hZGVyQ29uZmlnLkhUTUwsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBteW9wX3ByZXZpZXdfc2NyaXB0ID0gX2RvYy5nZXRFbGVtZW50QnlJZCgnbXlvcF9wcmV2aWV3Jyk7XG5cbiAgICAgICAgICAgICAgICBpZiAobXlvcF9wcmV2aWV3X3NjcmlwdCkge1xuICAgICAgICAgICAgICAgICAgICBteW9wX3ByZXZpZXdfc2NyaXB0LnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBTZWUgbm90ZSBhYm92ZTogcHJlcGVuZCBET0NUWVBFIHRvIGtlZXAgdGhlIGlmcmFtZSBpbiBzdGFuZGFyZHMgbW9kZS5cbiAgICAgICAgICAgICAgICAgICAgSFRNTDJSZW5kZXIgPSAnPCFET0NUWVBFIGh0bWw+JyArIF9kb2MuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluamVjdCBob3N0LXByb3ZpZGVkIENTUyBiZWZvcmUgdGhlIGlmcmFtZSBpcyB3cml0dGVuIHNvIHN0eWxlcyBhcmVcbiAgICAgICAgICAgIC8vIHByZXNlbnQgb24gZmlyc3QgcGFpbnQgKG5vIEZPVUMpLiBBcHBlbmRlZCBsYXN0IGluIDxoZWFkPiBzbyBpdCB3aW5zXG4gICAgICAgICAgICAvLyBvdmVyIHRoZSBjb21wb25lbnQncyBvd24gc3R5bGVzIHZpYSBub3JtYWwgY2FzY2FkZSBvcmRlci5cbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5pbmplY3RDc3MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgX2RvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoSFRNTDJSZW5kZXIsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZVRhZyA9IF9kb2MuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICAgICAgICBzdHlsZVRhZy5zZXRBdHRyaWJ1dGUoJ2RhdGEtbXlvcC1pbmplY3RlZCcsICd0cnVlJyk7XG4gICAgICAgICAgICAgICAgLy8gPHN0eWxlPiBpcyBhbiBIVE1MIHJhdy10ZXh0IGVsZW1lbnQ6IHRoZSBzZXJpYWxpemVyIGJlbG93IHdyaXRlcyBpdHNcbiAgICAgICAgICAgICAgICAvLyBjb250ZW50cyBMSVRFUkFMTFksIHdpdGhvdXQgZXNjYXBpbmcuIENTUyBjb250YWluaW5nIFwiPC9zdHlsZT5cIiB3b3VsZFxuICAgICAgICAgICAgICAgIC8vIHRoZXJlZm9yZSBjbG9zZSB0aGUgdGFnIGFuZCBpbmplY3QgbGl2ZSBtYXJrdXAgaW50byB0aGUgaWZyYW1lLCB3aGljaFxuICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGVzIHNhbWUtb3JpZ2luIHdpdGggdGhpcyBwYWdlLiBOZXV0cmFsaXplIHRoZSBzZXF1ZW5jZSBcdTIwMTQgbm8gcmVhbFxuICAgICAgICAgICAgICAgIC8vIHN0eWxlc2hlZXQgY29udGFpbnMgaXQuIChTYW1lIGNsYXNzIG9mIGJ1ZyBhcyB0aGUgPC9zY3JpcHQ+IGVzY2FwZSBpblxuICAgICAgICAgICAgICAgIC8vIHRoZSBkYXRhIHBheWxvYWQgYmVsb3cuKVxuICAgICAgICAgICAgICAgIHN0eWxlVGFnLnRleHRDb250ZW50ID0gb3B0aW9ucy5pbmplY3RDc3MucmVwbGFjZSgvPFxccypcXC9cXHMqc3R5bGUvZ2ksICc8XFxcXC9zdHlsZScpO1xuICAgICAgICAgICAgICAgIChfZG9jLmhlYWQgfHwgX2RvYy5kb2N1bWVudEVsZW1lbnQpLmFwcGVuZENoaWxkKHN0eWxlVGFnKTtcbiAgICAgICAgICAgICAgICAvLyBTZWUgbm90ZSBhYm92ZTogcHJlcGVuZCBET0NUWVBFIHRvIGtlZXAgdGhlIGlmcmFtZSBpbiBzdGFuZGFyZHMgbW9kZS5cbiAgICAgICAgICAgICAgICBIVE1MMlJlbmRlciA9ICc8IURPQ1RZUEUgaHRtbD4nICsgX2RvYy5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MO1xuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGRvYy53cml0ZWxuKEhUTUwyUmVuZGVyKTtcblxuICAgICAgICAgICAgLy8gd2luZG93Ll9fZmVkZXJhdGlvbl9fID1cbiAgICAgICAgICAgIC8vICAgICB7IC4uLndpbmRvdy5fX2ZlZGVyYXRpb25fXyxcbiAgICAgICAgICAgIC8vICAgICAgICAgLy9UT0RPIDogZ2V0IGZyb20gRU5WIGF0IGJ1aWxkIHRpbWUsXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vIGluamVjdCB2YWx1ZSB0byBtb2R1bGUgYXQgYnVpbGQgdGltZVxuICAgICAgICAgICAgLy8gICAgICAgICAvLyB0b2RheSB3ZSBkb2luZyBzbyBqdXN0IGZvciB0aGUgQ0pTIHZlcnNpb25cbiAgICAgICAgICAgIC8vICAgICAgICAgX19wdWJsaWNfcGF0aF9fIDonaHR0cHM6Ly9jZG4ubXlvcC5kZXYvc2RrL25leHQnXG4gICAgICAgICAgICAvLyAgICAgICAgICwuLi4ke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICB3aW5kb3cuX19mZWRlcmF0aW9uX18pXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gICAgIH07XG5cbiAgICAgICAgICAgIC8vIEZvciBucG0gcGFja2FnZSB1c2VycyB3aXRoIGJ1bmRsZXJzIChWaXRlL1dlYnBhY2spLCBpbmplY3QgU0RLIGlubGluZVxuICAgICAgICAgICAgLy8gRm9yIENETiB1c2VycyAoc2NyaXB0IHRhZyksIHVzZSBDRE4gVVJMXG4gICAgICAgICAgICBjb25zdCBzZGtTY3JpcHQgPSBIQVNfRU1CRURERURfU0RLXG4gICAgICAgICAgICAgICAgPyBgPHNjcmlwdD4ke0VNQkVEREVEX1NES19DT05URU5UfTwvc2NyaXB0PmBcbiAgICAgICAgICAgICAgICA6IGA8c2NyaXB0IHNyYz1cIiR7d2luZG93Lm15b3AuX19ST09UX1NES19QVUJMSUNfVVJMX199XCI+PC9zY3JpcHQ+YDtcblxuICAgICAgICAgICAgLy8gRGlmZmVyZW50IGluaXQgc2NyaXB0IGZvciBlbWJlZGRlZCB2cyBDRE4gU0RLXG4gICAgICAgICAgICAvLyAtIEVtYmVkZGVkIChidW5kbGVkIElJRkUpOiB1c2VzIE15b3BTREsuZ2V0SWZyYW1lTW9kdWxlKCkgd2hpY2ggcmV0dXJucyBtb2R1bGUgZGlyZWN0bHlcbiAgICAgICAgICAgIC8vIC0gQ0ROIChkeW5hbWljIGxvYWRpbmcpOiB1c2VzIHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0SWZyYW1lTW9kdWxlKCkgd2hpY2ggd3JhcHMgd2l0aCAuZ2V0KClcbiAgICAgICAgICAgIGNvbnN0IGluaXRTY3JpcHQgPSBIQVNfRU1CRURERURfU0RLXG4gICAgICAgICAgICAgICAgPyBgPHNjcmlwdD5cbiAgICAgICAgICAgICAgICAgICBjb25zdCBfX215b3BfaW5pdCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlmcmFtZU1vZHVsZSA9IGF3YWl0IE15b3BTREsuZ2V0SWZyYW1lTW9kdWxlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJZnJhbWVTREsgPSBpZnJhbWVNb2R1bGUuSWZyYW1lU0RLO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2RrID0gbmV3IElmcmFtZVNESygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2RrLmluaXQoKTtcbiAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgX19teW9wX2luaXQoKS50aGVuKCk7XG4gICAgICAgICAgICAgICAgPC9zY3JpcHQ+YFxuICAgICAgICAgICAgICAgIDogYDxzY3JpcHQ+XG4gICAgICAgICAgICAgICAgICAgd2luZG93Ll9fZmVkZXJhdGlvbl9fLl9fcHVibGljX3BhdGhfXyA9IHdpbmRvdy5fX2ZlZGVyYXRpb25fXy5fX3B1YmxpY19wYXRoX187XG4gICAgICAgICAgICAgICAgICAgY29uc3QgX19teW9wX2luaXQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldElmcmFtZU1vZHVsZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNkayA9IG5ldyBJZnJhbWVTREsoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNkay5pbml0KCk7XG4gICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgIF9fbXlvcF9pbml0KCkudGhlbigpO1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG5cbiAgICAgICAgICAgIC8vIElzb2xhdGVkIGZyYW1lcyB1c2UgdGhlIHBvc3RNZXNzYWdlIGJyaWRnZSBpbnN0ZWFkIG9mIHRoZSBzYW1lLW9yaWdpblxuICAgICAgICAgICAgLy8gSWZyYW1lU0RLICsgZGF0YS1pbmplY3Rpb24gc2NyaXB0cyAod2hpY2ggcmVseSBvbiBob3N0XHUyMTk0ZnJhbWUgYWNjZXNzKS5cbiAgICAgICAgICAgIGlmICghaXNvbGF0ZSkge1xuICAgICAgICAgICAgICAgIGRvYy53cml0ZWxuKGAke3Nka1NjcmlwdH0ke2luaXRTY3JpcHR9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluamVjdCBkYXRhIHNjcmlwdCBpZiBkYXRhIG9wdGlvbiBpcyBwcm92aWRlZC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBgbnVsbGAgQ09VTlRTIEFTIE5PIERBVEEsIE5PVCBBUyBEQVRBLiBUaGUgY2hlY2sgdXNlZCB0byBiZSBgIT09IHVuZGVmaW5lZGAsXG4gICAgICAgICAgICAvLyBhbmQgYG51bGwgIT09IHVuZGVmaW5lZGAgaXMgdHJ1ZSAtLSBzbyBhIGhvc3QgdGhhdCBwYXNzZXMgYGRhdGE6IG51bGxgICh0aGVcbiAgICAgICAgICAgIC8vIG5hdHVyYWwgd2F5IHRvIHNheSBcIm5vdGhpbmcgdG8gc2VuZCB5ZXRcIikgZ290IHRoZSB3aG9sZSBkYXRhIHNjcmlwdCBpbmplY3RlZFxuICAgICAgICAgICAgLy8gYW5kIHRoZSBjb21wb25lbnQncyBvd24gYG15b3BfaW5pdF9pbnRlcmZhY2VgIGludm9rZWQgd2l0aCBudWxsLiBBIGNvbXBvbmVudFxuICAgICAgICAgICAgLy8gdGhhdCB2YWxpZGF0ZXMgaXRzIGlucHV0IHRoZW4gcmVqZWN0cyBpdCwgd2hpY2ggaXMgd2hlcmUgUGljLVRpbWUncyBjb25zb2xlXG4gICAgICAgICAgICAvLyBlcnJvciBgbXlvcF9pbml0X2ludGVyZmFjZTogSW52YWxpZCBjb25maWcgcHJvdmlkZWQuYCBjYW1lIGZyb206IG1lYXN1cmVkIG9uXG4gICAgICAgICAgICAvLyB0aGVpciBwYWdlIDIwMjYtMTAtMTgsIEFMTCAxMyBjb21wb25lbnRzIGFyZSBtb3VudGVkIHdpdGggYGRhdGE6IG51bGxgLCBzb1xuICAgICAgICAgICAgLy8gZXZlcnkgb25lIG9mIHRoZW0gcGFpZCBmb3IgYW4gaW5qZWN0ZWQgc2NyaXB0IGFuZCBhIG1lYW5pbmdsZXNzIGluaXQgY2FsbC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBJbml0aWFsaXNpbmcgYSBjb21wb25lbnQgd2l0aCBudWxsIGNhbiBuZXZlciB0ZWxsIGl0IGFueXRoaW5nIHRoYXQgb21pdHRpbmdcbiAgICAgICAgICAgIC8vIHRoZSBjYWxsIGRvZXMgbm90LCBzbyB0aGUgdHdvIGFyZSBub3cgdHJlYXRlZCB0aGUgc2FtZS5cbiAgICAgICAgICAgIGlmICghaXNvbGF0ZSAmJiBvcHRpb25zPy5kYXRhICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucz8uZGF0YSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIFNldHVwIENUQSBxdWV1ZSAtIGNhcHR1cmVzIGFueSBDVEFzIGVtaXR0ZWQgZHVyaW5nIGluaXQgYmVmb3JlIGhvc3QgcmVnaXN0ZXJzIGhhbmRsZXJcbiAgICAgICAgICAgICAgICBjb25zdCBjdGFRdWV1ZVNjcmlwdCA9IGA8c2NyaXB0PlxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19teW9wX2N0YV9xdWV1ZSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcF9jdGFfaGFuZGxlciA9IGZ1bmN0aW9uKGFjdGlvbiwgcGF5bG9hZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9jdGFfcXVldWUucHVzaCh7YWN0aW9uOiBhY3Rpb24sIHBheWxvYWQ6IHBheWxvYWR9KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICA8L3NjcmlwdD5gO1xuXG4gICAgICAgICAgICAgICAgLy8gRXNjYXBlIGRhdGEgZm9yIHNhZmUgZW1iZWRkaW5nIGluIHNjcmlwdCB0YWdcbiAgICAgICAgICAgICAgICAvLyBKU09OLnN0cmluZ2lmeSBkb2Vzbid0IGVzY2FwZSA8L3NjcmlwdD4gd2hpY2ggY291bGQgYnJlYWsgSFRNTCBwYXJzaW5nXG4gICAgICAgICAgICAgICAgY29uc3QgZXNjYXBlZERhdGEgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLmRhdGEpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC88XFwvc2NyaXB0L2dpLCAnXFxcXHUwMDNjL3NjcmlwdCcpO1xuXG4gICAgICAgICAgICAgICAgLy8gU2VsZi1jb250YWluZWQgZGF0YSBpbmplY3Rpb24gc2NyaXB0IHRoYXQ6XG4gICAgICAgICAgICAgICAgLy8gMS4gQ2FsbHMgbXlvcF9pbml0X2ludGVyZmFjZSBpbW1lZGlhdGVseSBpZiBhbHJlYWR5IGRlZmluZWRcbiAgICAgICAgICAgICAgICAvLyAyLiBXYXRjaGVzIGZvciBsYXRlLWRlZmluZWQgbXlvcF9pbml0X2ludGVyZmFjZSB2aWEgZGVmaW5lUHJvcGVydHlcbiAgICAgICAgICAgICAgICAvLyAzLiBDbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIChyZW1vdmVzIHNjcmlwdCB0YWcgYW5kIHdpbmRvdyBkYXRhKVxuICAgICAgICAgICAgICAgIC8vIDQuIFBvc3RzIG1lc3NhZ2UgdG8gcGFyZW50IGZvciBleHRlbnNpb24gdHJhY2tpbmcgKHByZS1pbmplY3RlZCBpbml0KilcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhU2NyaXB0ID0gYDxzY3JpcHQgaWQ9XCJfX215b3BfaW5pdF9kYXRhX3NjcmlwdFwiPlxuICAgICAgICAgICAgICAgICAgICAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9ICR7ZXNjYXBlZERhdGF9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNjcmlwdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ19fbXlvcF9pbml0X2RhdGFfc2NyaXB0Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWxsSW5pdEludGVyZmFjZSA9IGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgYXMgcHJlLWluamVjdGVkIGRhdGEgY2FsbCBmb3IgZXh0ZW5zaW9uIHRyYWNraW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9pbml0X3ByZWluamVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbihkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19teW9wX2luaXRfcHJlaW5qZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydFRpbWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RpZnkgZXh0ZW5zaW9uIHZpYSBwb3N0TWVzc2FnZSAoaW5pdCogPSBwcmUtaW5qZWN0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnTVlPUF9QUkVJTkpFQ1RFRF9JTklUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgJyonKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYW51cDogcmVtb3ZlIHNjcmlwdCB0YWcgYW5kIHN0b3JlZCBkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjcmlwdEVsICYmIHNjcmlwdEVsLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0RWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzY3JpcHRFbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB3aW5kb3cuX19teW9wX2luaXRfZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93Lm15b3BfaW5pdF9pbnRlcmZhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGdW5jdGlvbiBhbHJlYWR5IGV4aXN0cyAtIGNhbGwgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsSW5pdEludGVyZmFjZSh3aW5kb3cubXlvcF9pbml0X2ludGVyZmFjZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZ1bmN0aW9uIG5vdCB5ZXQgZGVmaW5lZCAtIHN0b3JlIGRhdGEgYW5kIHdhdGNoIGZvciBkZWZpbml0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9pbml0X2RhdGEgPSBkYXRhO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9vcmlnaW5hbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnbXlvcF9pbml0X2ludGVyZmFjZScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3JpZ2luYWwgPSBmbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuX19teW9wX2luaXRfZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0b3JlZERhdGEgPSB3aW5kb3cuX19teW9wX2luaXRfZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgd2luZG93Ll9fbXlvcF9pbml0X2RhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbEluaXRJbnRlcmZhY2UoZm4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9vcmlnaW5hbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG4gICAgICAgICAgICAgICAgZG9jLndyaXRlbG4oY3RhUXVldWVTY3JpcHQgKyBkYXRhU2NyaXB0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSXNvbGF0ZWQgZnJhbWVzOiBpbmplY3QgdGhlIHBvc3RNZXNzYWdlIGJyaWRnZSAoaW5pdCBpbiAvIGN0YSBvdXQgLyBzaXplIG91dCkuXG4gICAgICAgICAgICBpZiAoaXNvbGF0ZSkge1xuICAgICAgICAgICAgICAgIC8vIFNhbWUgcnVsZSBhcyB0aGUgbm9uLWlzb2xhdGVkIHBhdGggYWJvdmU6IG51bGwgaXMgbm8gZGF0YS5cbiAgICAgICAgICAgICAgICBjb25zdCBlc2NhcGVkRGF0YSA9IG9wdGlvbnM/LmRhdGEgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zPy5kYXRhICE9PSBudWxsXG4gICAgICAgICAgICAgICAgICAgID8gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5kYXRhKS5yZXBsYWNlKC88XFwvc2NyaXB0L2dpLCAnXFxcXHUwMDNjL3NjcmlwdCcpXG4gICAgICAgICAgICAgICAgICAgIDogJ3VuZGVmaW5lZCc7XG4gICAgICAgICAgICAgICAgZG9jLndyaXRlbG4odGhpcy5idWlsZElzb2xhdGlvbkJyaWRnZShlc2NhcGVkRGF0YSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkb2MuY2xvc2UoKTtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGNvbnRyb2wgZnJvbSBkYXNoYm9hcmRcbiAgICAgICAgICAgIC8vICAoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZykuYXV0b0hlaWdodCA9IHRydWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbXAgPSBuZXcgTXlvcElmcmFtZUNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICAvLyBJc29sYXRlZDogd2lyZSB0aGUgaG9zdCBzaWRlIG9mIHRoZSBwb3N0TWVzc2FnZSBicmlkZ2UgKGN0YSBpbiwgc2l6ZSBpbiwgaW5pdCBvdXQpLlxuICAgICAgICAgICAgaWYgKGlzb2xhdGUpIGNvbXAuZW5hYmxlSXNvbGF0aW9uKCk7XG5cbiAgICAgICAgICAgIC8vIFN0b3JlIHBhcnNlZCBzaXplTWV0YSBvbiB0aGUgY29tcG9uZW50IHNvIHRoZSBSZWFjdCBob3N0IGNhbiByZWFkIGl0XG4gICAgICAgICAgICBjb21wLnNpemVNZXRhID0gcGFyc2VkU2l6ZU1ldGE7XG5cbiAgICAgICAgICAgIC8vIEF1dG8tc2l6ZTogb2JzZXJ2ZSBjb250ZW50IHNpemUgYW5kIHN5bmMgdG8gaWZyYW1lIGRpbWVuc2lvbnMuXG4gICAgICAgICAgICAvLyBUaGlzIHdvcmtzIGZvciBhbGwgaG9zdHMgKHZhbmlsbGEgU0RLLCBSZWFjdCwgVnVlLCBBbmd1bGFyKS5cbiAgICAgICAgICAgIC8vIElmIGEgZnJhbWV3b3JrIGhvc3QgKGUuZy4gQG15b3AvcmVhY3QpIGFsc28gY2FsbHMgb2JzZXJ2ZUF1dG9TaXplKCksXG4gICAgICAgICAgICAvLyBpdCBjbGVhbmx5IHJlcGxhY2VzIHRoZXNlIG9ic2VydmVycyB2aWEgX2F1dG9TaXplQ2xlYW51cCB0cmFja2luZy5cbiAgICAgICAgICAgIGNvbXAuaW5pdGlhdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmF1dG9TaXplID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBObyBhdXRvLXNpemluZy4gSWZyYW1lIHN0YXlzIHBvc2l0aW9uOmFic29sdXRlIGZpbGxpbmcgY29udGFpbmVyLlxuICAgICAgICAgICAgICAgICAgICAvLyBIb3N0IGlzIGZ1bGx5IHJlc3BvbnNpYmxlIGZvciBjb250YWluZXIgZGltZW5zaW9ucyAoZS5nLiBSZWFjdCBOYXRpdmUgV2ViVmlldykuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHNob3duID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29tcC5vYnNlcnZlQXV0b1NpemUoe1xuICAgICAgICAgICAgICAgICAgICBmb3JjZUF1dG9TaXplOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBvblNpemVDaGFuZ2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNob3cgYWZ0ZXIgZmlyc3QgbWVhc3VyZW1lbnQgY29tcGxldGVzIChub3QgYmVmb3JlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBpZnJhbWUgdHJhbnNpdGlvbnMgZnJvbSBhYnNvbHV0ZSBvdmVybGF5IHRvIGRvY3VtZW50IGZsb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IHRoZSBtZWFzdXJlZCBoZWlnaHQsIHByZXZlbnRpbmcgZmxhc2ggYXQgd3Jvbmcgc2l6ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hvd24gJiYgIW9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3duID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLnNob3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAvLyBjb21wLnByb3BzLl9nbG9iYWwgPSBjb21wLmVsZW1lbnQuY29udGVudFdpbmRvdztcbiAgICAgICAgICAgIHJldHVybiBjb21wO1xuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobG9hZGVyQ29uZmlnLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubm9uZSkge1xuICAgICAgICAgICAgLy8gcGFyc2VyID0gcGFyc2VyID8gcGFyc2VyIDogbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgLy8gY29uc3QgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgICAgLy8gZWxlbWVudCA9IGRvYy5ib2R5LmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAvL2VsZW1lbnQuc2V0QXR0cmlidXRlKCdpZCcsIGRvbUlkKTtcblxuICAgICAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgICAgICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gbG9hZGVyQ29uZmlnLkhUTUw7Ly8udHJpbSgpO1xuICAgICAgICAgICAgZWxlbWVudCA9IHRlbXBsYXRlLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cbiAgICAgICAgICAgIC8vICAgY29uc3QgZmlyc3RFbGVtZW50ID0gdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgICAgIC8vICAgY29uc3QgeiA9IGZpcnN0RWxlbWVudCA/IGZpcnN0RWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgOiBudWxsO1xuICAgICAgICAgICAgLy8gICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vICAgY29uc29sZS5sb2codGVtcGxhdGUsIGZpcnN0RWxlbWVudCwgeilcbiAgICAgICAgICAgIC8vICAgZWxlbWVudCA9IGZpcnN0RWxlbWVudFxuXG4gICAgICAgICAgICAvLyBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0Ym9keScpO1xuICAgICAgICAgICAgLy8gZGVidWdnZXI7XG4gICAgICAgICAgICAvLyBjb250YWluZXIuaW5uZXJIVE1MID0gbG9hZGVyQ29uZmlnLkhUTUw7XG4gICAgICAgICAgICAvLyBlbGVtZW50ID0gY29udGFpbmVyLmZpcnN0RWxlbWVudENoaWxkO1xuXG4gICAgICAgICAgICBnZXRJbml0aWF0ZWRTZGsoKS50aGVuKChzZGspID0+IHtcbiAgICAgICAgICAgICAgICBzZGsuY29ubmVjdGVkQ2FsbGJhY2soZWxlbWVudCwgZWxlbWVudCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY3VzdG9tRWxlbWVudE5hbWUgPSB0b0N1c3RvbUVsZW1lbnROYW1lKGNvbXBvbmVudERlZmluaXRpb24ubmFtZSArIHNraW4uaWQpO1xuXG4gICAgICAgICAgICAvL1RPRE8gOiBzdXBwb3J0IHJlZGVmaW5lICFcbiAgICAgICAgICAgIGlmICghc2Vlbi5pbmNsdWRlcyhjdXN0b21FbGVtZW50TmFtZSkpIHtcbiAgICAgICAgICAgICAgICBjcmVhdGVDdXN0b21XZWJDb21wb25lbnQoY3VzdG9tRWxlbWVudE5hbWUsIGxvYWRlckNvbmZpZy5IVE1MLCBsb2FkZXJDb25maWcuc2hhZG93Um9vdE1vZGUpO1xuICAgICAgICAgICAgICAgIHNlZW4ucHVzaChjdXN0b21FbGVtZW50TmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChjdXN0b21FbGVtZW50TmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAvL2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICBlbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgKGNvbnRhaW5lci5pZC5zdGFydHNXaXRoKCdteW9wLWNvbXAtJykpIHtcbiAgICAgICAgLy8gICAgIC8vIGluIHBsYWNlIHJlcGxhY2VtZW50XG4gICAgICAgIC8vICAgICBjb250YWluZXIucmVwbGFjZVdpdGgoZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAvL2NvbnRhaW5lciA9IGVsZW1lbnQucGFyZW50RWxlbWVudCE7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy9lbGVtZW50LmlubmVySFRNTCA9IGA8JHtjdXN0b21FbGVtZW50TmFtZX0gLz5gO1xuICAgICAgICByZXR1cm4gbmV3IE15b3BXZWJDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgKiBhcyBDU1MgZnJvbSBcImNzc3R5cGVcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi9ob3N0XCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzLnRzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlfSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcblxuLy8gaWdub3JpbmcgZG9jdW1lbnRhdGlvblxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ1NTUHJvcGVydGllcyBleHRlbmRzIENTUy5Qcm9wZXJ0aWVzPHN0cmluZyB8IG51bWJlcj4ge1xufVxuXG5leHBvcnQgdHlwZSBTdHlsZXNoZWV0RGVmaW5pdGlvbiA9IHsgW2tleTogc3RyaW5nXTogQ1NTUHJvcGVydGllcyB9O1xuXG5leHBvcnQgY29uc3QgYXBwbHlTdHlsZXNoZWV0ID0gKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIHN0eWxlc2hlZXQ6IFN0eWxlc2hlZXREZWZpbml0aW9uLCBjc3M/OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB0YWdJZCA9IGBteW9wLWNzcy0ke3V1aWR2NCgpfWA7XG4gICAgY29tcG9uZW50LnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7cm9vdFJlZiwgX3N0eWxlc2hlZXQsIF90YWdJZCwgX2Nzc30pID0+IHtcbiAgICAgICAgY29uc3Qgc3R5bGVUYWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICBzdHlsZVRhZy50eXBlID0gJ3RleHQvY3NzJztcblxuICAgICAgICAvLyBCdWlsZCB0aGUgQ1NTIHN0cmluZyBmcm9tIHRoZSBzdHlsZXMgb2JqZWN0XG4gICAgICAgIGxldCBjc3NTdHJpbmcgPSBfY3NzO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc2VsZWN0b3IgaW4gX3N0eWxlc2hlZXQpIHtcbiAgICAgICAgICAgIGNzc1N0cmluZyArPSBgJHtzZWxlY3Rvcn0geyBgO1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IF9zdHlsZXNoZWV0W3NlbGVjdG9yXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gcHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIGNzc1N0cmluZyArPSBgJHtwcm9wZXJ0eX06ICR7cHJvcGVydGllc1twcm9wZXJ0eV19OyBgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3NzU3RyaW5nICs9ICd9ICc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdGhlIENTUyBzdHJpbmcgYXMgdGhlIGNvbnRlbnQgb2YgdGhlIDxzdHlsZT4gZWxlbWVudFxuICAgICAgICBzdHlsZVRhZy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3NTdHJpbmcpKTtcbiAgICAgICAgc3R5bGVUYWcuaWQgPSBfdGFnSWQ7XG4gICAgICAgIC8vIEFwcGVuZCB0aGUgPHN0eWxlPiBlbGVtZW50XG4gICAgICAgIChyb290UmVmLnNoYWRvd1Jvb3QgfHwgcm9vdFJlZi5jb250YWluZXIpLmFwcGVuZENoaWxkKHN0eWxlVGFnKTtcblxuICAgIH0sICgpID0+IHtcbiAgICB9LCB7XG4gICAgICAgIF9zdHlsZXNoZWV0OiBzdHlsZXNoZWV0LFxuICAgICAgICBfY3NzIDogY3NzID8gY3NzIDogJycsXG4gICAgICAgIF90YWdJZDogdGFnSWRcbiAgICB9KSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKHtyb290UmVmLCBfdGFnSWR9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gKHJvb3RSZWYuc2hhZG93Um9vdCB8fCBkb2N1bWVudCkuZ2V0RWxlbWVudEJ5SWQoX3RhZ0lkKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICB9LCB7XG4gICAgICAgICAgICBfdGFnSWQ6IHRhZ0lkXG4gICAgICAgIH0pKVxuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGFwcGx5U3R5bGVzaGVldExpbmsgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgbGluazogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgdGFnSWQgPSBgbXlvcC1jc3MtJHt1dWlkdjQoKX1gO1xuICAgIGNvbXBvbmVudC5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3Jvb3RSZWYsIF90YWdJZCwgX2xpbmt9KSA9PiB7XG4gICAgICAgIGNvbnN0IGxpbmtFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICBsaW5rRWxlbWVudC5pZCA9IF90YWdJZDtcbiAgICAgICAgbGlua0VsZW1lbnQucmVsID0gJ3N0eWxlc2hlZXQnO1xuICAgICAgICBsaW5rRWxlbWVudC5ocmVmID0gX2xpbms7XG4gICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGlua0VsZW1lbnQpO1xuXG4gICAgICAgIC8vIEFwcGVuZCB0aGUgPHN0eWxlPiBlbGVtZW50XG4gICAgICAgIChyb290UmVmLnNoYWRvd1Jvb3QgfHwgcm9vdFJlZi5jb250YWluZXIpLmFwcGVuZENoaWxkKGxpbmtFbGVtZW50KTtcbiAgICB9LCAoKSA9PiB7XG4gICAgfSwge1xuICAgICAgICBfbGluayA6IGxpbmssXG4gICAgICAgIF90YWdJZDogdGFnSWRcbiAgICB9KSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKHtyb290UmVmLCBfdGFnSWR9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gKHJvb3RSZWYuc2hhZG93Um9vdCB8fCBkb2N1bWVudCkuZ2V0RWxlbWVudEJ5SWQoX3RhZ0lkKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICB9LCB7XG4gICAgICAgICAgICBfdGFnSWQ6IHRhZ0lkXG4gICAgICAgIH0pKVxuICAgIH1cbn1cbiIsICJpbXBvcnQge0lJZnJhbWVMb2FkZXJDb25maWcsIElTa2luQ29uZmlnfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCB0eXBlIFRva2VuTWFwID0gUmVjb3JkPHN0cmluZywgc3RyaW5nfCBudW1iZXI+XG5cbmNvbnN0IHJlcGxhY2VUb2tlbnMgPSAoaW5wdXQ6IHN0cmluZywgdG9rZW5NYXA6IFRva2VuTWFwKTogc3RyaW5nID0+IHtcbiAgICAvLyBDcmVhdGUgYSByZWdleCBwYXR0ZXJuIGZyb20gdGhlIGtleXMgb2YgdGhlIHRva2VuTWFwXG4gICAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAoT2JqZWN0LmtleXModG9rZW5NYXApLmpvaW4oJ3wnKSwgJ2cnKTtcblxuICAgIC8vIFJlcGxhY2UgdG9rZW5zIGluIHRoZSBpbnB1dCBzdHJpbmcgdXNpbmcgdGhlIHJlZ2V4XG4gICAgcmV0dXJuIGlucHV0LnJlcGxhY2UocGF0dGVybiwgKG1hdGNoZWQpID0+IHtcbiAgICAgICAgLy8gUmV0dXJuIHRoZSByZXBsYWNlbWVudCB2YWx1ZSBmcm9tIHRoZSB0b2tlbk1hcFxuICAgICAgICByZXR1cm4gKHRva2VuTWFwW21hdGNoZWRdIHx8IG1hdGNoZWQpLnRvU3RyaW5nKCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVJZnJhbWVTa2luQnlUb2tlbml6ZXIgPSAoc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZywgdG9rZW5NYXA6IFRva2VuTWFwKSA9PiB7XG4gICAgY29uc3QgdHlwZWRTa2luQ29uZmlnID0gKHNlbGVjdGVkU2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZylcbiAgICBpZiAodHlwZWRTa2luQ29uZmlnLnR5cGUgIT09ICdJZnJhbWVMb2FkZXInKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaWZyYW1lU2tpblVybFRva2VuaXplciByZWNlaXZlZCBza2luIHdpdGggbG9hZGVyIHR5cGUgXCIke3R5cGVkU2tpbkNvbmZpZy50eXBlfVwiLCBjdXJyZW50bHkgb25seSBcIklmcmFtZUxvYWRlclwiIGlzIHN1cHBvcnRlZGApXG4gICAgfVxuXG4gICAgc2VsZWN0ZWRTa2luLmxvYWRlciA9IHtcbiAgICAgICAgLi4uc2VsZWN0ZWRTa2luLmxvYWRlclxuICAgIH1cblxuICAgIHNlbGVjdGVkU2tpbi5sb2FkZXIudXJsID0gcmVwbGFjZVRva2VucyhzZWxlY3RlZFNraW4ubG9hZGVyLnVybCwgdG9rZW5NYXApO1xuXG4gICAgcmV0dXJuIHNlbGVjdGVkU2tpbjtcbn1cblxuZXhwb3J0IGNvbnN0IGNoYW5nZVNraW5VcmxCeVRva2VuaXplciA9ICh0b2tlbk1hcDogVG9rZW5NYXApID0+IHtcbiAgICByZXR1cm4gYXN5bmMgKHNlbGVjdGVkU2tpbjogSVNraW5Db25maWcpID0+IHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUlmcmFtZVNraW5CeVRva2VuaXplcihzZWxlY3RlZFNraW4sIHRva2VuTWFwKTtcbiAgICB9XG59IiwgImltcG9ydCB7Q3VzdG9tUmVmTWVzc2FnZX0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vaG9zdFwiO1xuXG4vLyBjb25zdCBzcGFjZSA9ICcgJztcbi8vIGV4cG9ydCBjb25zdCBnZXRDbGFzc2VzID0gYXN5bmMgKGNvbm5lY3RlZFJlZjogUmVmKTogUHJvbWlzZTxzdHJpbmdbXT4gPT4gKGF3YWl0IGV4ZWMoYWN0QXM8SFRNTERpdkVsZW1lbnQ+KGNvbm5lY3RlZFJlZikuY2xhc3NMaXN0KSkudmFsdWUuc3BsaXQoc3BhY2UpO1xuLy8gZXhwb3J0IGNvbnN0IGFkZENsYXNzID0gYXN5bmMgKGNvbm5lY3RlZFJlZjogUmVmLCBjbGFzc05hbWU6IHN0cmluZykgPT4ge1xuLy8gICAgIGNvbnN0IGNsYXNzZXMgPSBhd2FpdCBnZXRDbGFzc2VzKGNvbm5lY3RlZFJlZik7XG4vLyAgICAgY2xhc3Nlcy5pbmNsdWRlcyhjbGFzc05hbWUpIHx8IGNsYXNzZXMucHVzaChjbGFzc05hbWUpO1xuLy8gICAgIC8vIEB0cy1pZ25vcmVcbi8vICAgICBjb25uZWN0ZWRSZWYuY2xhc3NMaXN0ID0gY2xhc3Nlcy5qb2luKHNwYWNlKTtcbi8vIH1cbi8vIGV4cG9ydCBjb25zdCByZW1vdmVDbGFzcyA9IGFzeW5jIChjb25uZWN0ZWRSZWY6IFJlZiwgY2xhc3NOYW1lOiBzdHJpbmcsKSA9PiB7XG4vLyAgICAgbGV0IGNsYXNzZXMgPSBhd2FpdCBnZXRDbGFzc2VzKGNvbm5lY3RlZFJlZik7XG4vLyAgICAgLy8gQHRzLWlnbm9yZVxuLy8gICAgIGNvbm5lY3RlZFJlZi5jbGFzc0xpc3QgPSBjbGFzc2VzLmZpbHRlcihjID0+IGMgIT09IGNsYXNzTmFtZSkuam9pbihzcGFjZSk7XG4vLyB9XG4vL1xuLy9cblxuZXhwb3J0IGNvbnN0IGFkZENsYXNzID0gKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIGNsYXNzTmFtZTogc3RyaW5nLCBteW9wSWQ6IHN0cmluZykgPT4ge1xuICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDdXN0b21SZWZNZXNzYWdlKCh7cmVmLCBfY2xhc3NOYW1lfSkgPT4ge1xuICAgICAgICByZWY/LmNsYXNzTGlzdC5hZGQoX2NsYXNzTmFtZSk7XG4gICAgfSwge1xuICAgICAgICBlbGVtZW50SWQ6IG15b3BJZCxcbiAgICAgICAgX2NsYXNzTmFtZTogY2xhc3NOYW1lXG4gICAgfSkpO1xufVxuXG5leHBvcnQgY29uc3QgcmVtb3ZlQ2xhc3MgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgY2xhc3NOYW1lOiBzdHJpbmcsIG15b3BJZDogc3RyaW5nKSA9PiB7XG4gICAgY29tcG9uZW50LnNlbmQobmV3IEN1c3RvbVJlZk1lc3NhZ2UoKHtyZWYsIF9jbGFzc05hbWV9KSA9PiB7XG4gICAgICAgIHJlZj8uY2xhc3NMaXN0LnJlbW92ZShfY2xhc3NOYW1lKTtcbiAgICB9LCB7XG4gICAgICAgIGVsZW1lbnRJZDogbXlvcElkLFxuICAgICAgICBfY2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgICB9KSk7XG59IiwgImltcG9ydCB7XG4gICAgSUNvbXBvbmVudENvbmZpZyxcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJQ29tcG9uZW50SW5zdGFuY2VDb25maWcsIElIVE1MTG9hZGVyQ29uZmlnLCBJUmVmQ29uZmlnLFxuICAgIElTa2luTG9hZGVyQ29uZmlnLFxuICAgIElTa2luU2VsZWN0b3JDb25maWcsXG4gICAgSURlZGljYXRlZFNraW5Db25maWcsIElTa2luQ29uZmlnXG59IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vdXRpbHMvdXRpbHMudHNcIjtcblxuZXhwb3J0IGNsYXNzIFNraW5Db25maWcgaW1wbGVtZW50cyBJU2tpbkNvbmZpZyB7XG4gICAgX3J1blRpbWVJbnN0YW5jZUlkID0gJ3J1bnRpbWUtaW5zdGFuY2UtaWQtJyArIHV1aWR2NCgpO1xuICAgIF9ydW5UaW1lSWQgPSAncnVudGltZS1pZC0nICsgdXVpZHY0KCk7XG4gICAgX3J1blRpbWVOYW1lID0gJ3J1bnRpbWUtbmFtZS0nICsgdXVpZHY0KCk7XG5cbiAgICBzdGF0aWMgY3JlYXRlID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFNraW5Db25maWcoKTtcbiAgICB9XG5cbiAgICBpZCA9IHRoaXMuX3J1blRpbWVJZDtcbiAgICBuYW1lID0gdGhpcy5fcnVuVGltZU5hbWU7XG4gICAgZGVzY3JpcHRpb24gPSAnJztcbiAgICBsb2FkZXIgPSBudWxsIGFzIHVua25vd24gYXMgSVNraW5Mb2FkZXJDb25maWc7XG5cbiAgICB3aXRoTG9hZGVyID0gKGxvYWRlcjogSVNraW5Mb2FkZXJDb25maWcpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkZXIgPSBsb2FkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhIVE1MTG9hZGVyID0gKGxvYWRlcjogT21pdDxJSFRNTExvYWRlckNvbmZpZywgJ3R5cGUnPikgPT4ge1xuICAgICAgICBsb2FkZXIudHlwZSA9ICdIVE1MTG9hZGVyJztcbiAgICAgICAgdGhpcy5sb2FkZXIgPSBsb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGJ1aWxkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wb25lbnRDb25maWcgaW1wbGVtZW50cyBJQ29tcG9uZW50Q29uZmlnIHtcbiAgICBfcnVuVGltZUluc3RhbmNlSWQgPSAncnVudGltZS1pbnN0YW5jZS1pZC0nICsgdXVpZHY0KCk7XG4gICAgX3J1blRpbWVJZCA9ICdydW50aW1lLWlkLScgKyB1dWlkdjQoKTtcbiAgICBfcnVuVGltZU5hbWUgPSAncnVudGltZS1uYW1lLScgKyB1dWlkdjQoKTtcblxuICAgIHN0YXRpYyBjcmVhdGUgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50Q29uZmlnKCk7XG4gICAgfVxuXG4gICAgaW5zdGFuY2UgPSB7XG4gICAgICAgIGlkOiB0aGlzLl9ydW5UaW1lSW5zdGFuY2VJZCxcbiAgICAgICAgY29tcG9uZW50SWQ6IHRoaXMuX3J1blRpbWVJZCxcbiAgICAgICAgY29tcG9uZW50TmFtZTogdGhpcy5fcnVuVGltZU5hbWUsXG4gICAgICAgIHNraW5TZWxlY3RvcjogbnVsbCBhcyB1bmtub3duIGFzIElTa2luU2VsZWN0b3JDb25maWdcbiAgICB9IGFzIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZztcblxuICAgIG5hbWUgPSB0aGlzLl9ydW5UaW1lTmFtZVxuICAgIHR5cGUgPSB7XG4gICAgICAgIGlkOiB0aGlzLl9ydW5UaW1lSWQsXG4gICAgICAgIG5hbWU6IHRoaXMuX3J1blRpbWVOYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgIHByb3BzOiBbXSxcbiAgICAgICAgcmVmczogW10sXG4gICAgICAgIHNraW5zOiBbXSxcbiAgICAgICAgZGVmYXVsdFNraW46IDBcbiAgICB9IGFzIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG5cbiAgICB3aXRoSW5zdGFuY2UgPSAoaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZykgPT4ge1xuICAgICAgICB0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhUeXBlID0gKHR5cGU6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhOYW1lID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB3aXRoRGVmYXVsdFNraW4gPSAoZGVmYXVsdFNraW46IElTa2luQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMudHlwZS5za2lucy5wdXNoKGRlZmF1bHRTa2luKTtcbiAgICAgICAgdGhpcy50eXBlLmRlZmF1bHRTa2luID0gdGhpcy50eXBlLnNraW5zLmxlbmd0aCAtIDE7XG4gICAgICAgIHRoaXMuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0ge1xuICAgICAgICAgICAgdHlwZTogJ0RlZGljYXRlZCcsXG4gICAgICAgICAgICBza2luOiB7XG4gICAgICAgICAgICAgICAgaWQ6IGRlZmF1bHRTa2luLmlkXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gYXMgSURlZGljYXRlZFNraW5Db25maWdcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB3aXRoUmVmID0gKHJlZjogSVJlZkNvbmZpZykgPT4ge1xuICAgICAgICB0aGlzLnR5cGUucmVmcy5wdXNoKHJlZik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhCYXNpY1JlZiA9IChyZWZTZWxlY3Rvcjogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0Jhc2ljUmVmID0ge1xuICAgICAgICAgICAgaWQ6ICcnLFxuICAgICAgICAgICAgbmFtZTogcmVmU2VsZWN0b3IsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgICAgICBzZWxlY3RvclR5cGU6ICdpZC1hdHRyaWJ1dGUnLFxuICAgICAgICAgICAgc2VsZWN0b3I6IHJlZlNlbGVjdG9yLFxuICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnY29kZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBJUmVmQ29uZmlnXG5cbiAgICAgICAgdGhpcy50eXBlLnJlZnMucHVzaChuZXdCYXNpY1JlZik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGJ1aWxkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzKSlcbiAgICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IGV4ZWMgPSBhc3luYyAoZ2V0dGVyOiBhbnkpID0+IHtcbiAgICByZXR1cm4gYXdhaXQgZ2V0dGVyKClcbn1cbiIsICJleHBvcnQgKiBmcm9tIFwiLi9hcHBseVN0eWxlc2hlZXRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2lmcmFtZVNraW5VcmxUb2tlbml6ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NsYXNzTGlzdFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uZmlnQnVpbGRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vQ2xvdWRSZXBvc2l0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9leGVjXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jbG91ZFJlcG9zaXRvcnlIZWxwZXJzXCI7IiwgImltcG9ydCB7ZGVjb21wcmVzc1VVSURzfSBmcm9tIFwiLi4vdXRpbHMvdXVpZC50c1wiO1xuaW1wb3J0IHtDbG91ZFJlcG9zaXRvcnl9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQge1xuICAgIEV4cGVyaWVuY2VUeXBlcyxcbiAgICBJQ29tcG9uZW50Q29uZmlnLCBJRGVkaWNhdGVkU2tpbkNvbmZpZyxcbiAgICBJU2VnbWVudGVkU2tpbkNvbmZpZyxcbiAgICBJU2VnbWVudEV4cGVyaWVuY2UsIElTa2luSW5zdGFuY2VDb25maWcsXG4gICAgU2tpblNlbGVjdG9yVHlwZXNcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY29uc3QgY2hlY2tNeW9wT3ZlcnJpZGUgPSBhc3luYyAoY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnKTogUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnIHwgbnVsbD4gPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIC8vVE9ETzogc3VwcG9ydCBkaXNhYmxpbmcgdGhlIG1lY2hhbmlzbVxuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh1cmwuc2VhcmNoKTtcbiAgICAgICAgY29uc3QgbXlvcE92ZXJyaWRlID0gcGFyYW1zLmdldCgnbXlvcE92ZXJyaWRlJyk7XG4gICAgICAgIGlmIChteW9wT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IFtzb3VyY2UsIC4uLnV1aWRzXSA9IGRlY29tcHJlc3NVVUlEcyhteW9wT3ZlcnJpZGUpO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NvbXBvbmVudCc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2NvbXBvbmVudElkLCBza2luSWRdID0gdXVpZHM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFRvT3ZlcnJpZGUgPSBhd2FpdCBDbG91ZFJlcG9zaXRvcnkuTWFpbi5mZXRjaENvbXBvbmVudChjb21wb25lbnRJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2RvOiBjaGVjayBmZXRjaEF1dG9GbG93LiBMb29rcyBsaWtlIG9ubHkgb25lIHNraW4gaXMgcmV0dXJuZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNraW4gPSBjb21wb25lbnRUb092ZXJyaWRlLnR5cGUuc2tpbnMuZmluZChza2luID0+IHNraW4uaWQgPT09IHNraW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2tpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvZG86IGZvciBub3cganVzdCBzZXQgc2tpbiBpZC4gQ2hlY2sgdGhlIGNsb3VkIGltcGxlbWVudGF0aW9uXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3RvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2luOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogc2tpbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgSVNraW5JbnN0YW5jZUNvbmZpZ1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRUb092ZXJyaWRlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLy8gICAgY2FzZSAnZmxvdyc6IHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0IDoge1xuICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IFtmbG93SWQsIGV4cGVyaW1lbnRJZF0gPSB1dWlkcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2Zsb3dJZCwgZXhwZXJpbWVudElkXSA9IGRlY29tcHJlc3NVVUlEcyhteW9wT3ZlcnJpZGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG93ID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hGbG93KGZsb3dJZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFRvT3ZlcnJpZGUgPSBmbG93LmNvbXBvbmVudHMuZmluZChjID0+IGMudHlwZS5pZCA9PT0gY29tcG9uZW50Q29uZmlnLnR5cGUuaWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yLnR5cGUgPT09IFNraW5TZWxlY3RvclR5cGVzLlNlZ21lbnRlZCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2UucmVzb2x2ZWRFeHBlcmllbmNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZEV4cGVyaWVuY2UgPSBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnJlc29sdmVkRXhwZXJpZW5jZXMuZmluZChlID0+IGUuaWQgPT09IGV4cGVyaW1lbnRJZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkRXhwZXJpZW5jZT8udHlwZSA9PT0gRXhwZXJpZW5jZVR5cGVzLlNlZ21lbnQpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRSZXNvbHZlZEV4cGVyaWVuY2UgPSByZXNvbHZlZEV4cGVyaWVuY2UgYXMgSVNlZ21lbnRFeHBlcmllbmNlXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkU2tpblNlbGVjdG9yID0gY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IgYXMgSVNlZ21lbnRlZFNraW5Db25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0eXBlZFNraW5TZWxlY3Rvci5zZWdtZW50cy5maW5kKHMgPT4gcy5zZWdtZW50SWQgPT09IHR5cGVkUmVzb2x2ZWRFeHBlcmllbmNlLnNlZ21lbnQuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3RvciA9IHNlZ21lbnQ/LnNraW5TZWxlY3RvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50VG9PdmVycmlkZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59IiwgIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBUaGUgSG9zdCBTREsgaXMgZGVzaWduZWQgZm9yIGludGVncmF0aW9uIHdpdGhpbiB0aGUgaG9zdCBhcHBsaWNhdGlvbiB0aGF0IHNlcnZlcyBhcyB0aGUgY29udGFpbmVyIGZvciBNeW9wICBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIEl0IHByb3ZpZGVzIGVzc2VudGlhbCBmdW5jdGlvbmFsaXRpZXMgYW5kIEFQSXMgZm9yIHJlZ2lzdGVyaW5nLCBtYW5hZ2luZywgYW5kIGNvbW11bmljYXRpbmcgd2l0aCBNeW9wIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogVGhpcyBTREsgZW5hYmxlcyBzZWFtbGVzcyBlbWJlZGRpbmcgb2YgaW5kZXBlbmRlbnRseSBkZXZlbG9wZWQgY29tcG9uZW50cyBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uLCBlbnN1cmluZyBzbW9vdGggaW50ZXJvcGVyYWJpbGl0eSBhbmQgY29uc2lzdGVudCB1c2VyIGV4cGVyaWVuY2UgYWNyb3NzIHZhcmlvdXMgTXlvcCBjb21wb25lbnQgaW1wbGVtZW50YXRpb25zLlxuICovXG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcbmltcG9ydCB7SU15b3BMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvSU15b3BMb2FkZXJcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgRW52ZWxvcGVkTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCxcbiAgICBJbml0TWVzc2FnZSxcbiAgICBJbml0UmVzcG9uc2UsIE1lc3NhZ2VEaXJlY3Rpb24sIFJlZlxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7TXlvcElmcmFtZUxvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy9pZnJhbWVMb2FkZXJcIjtcbmltcG9ydCB7V2ViY29tcG9uZW50TG9hZGVyfSBmcm9tIFwiLi9sb2FkZXJzL3dlYmNvbXBvbmVudExvYWRlclwiO1xuaW1wb3J0IHtSZW5kZXJQb2xpY3l9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB0eXBlIHtJZnJhbWVTREt9IGZyb20gXCIuLi9JZnJhbWVcIjtcbmltcG9ydCB7Y29ubmVjdFByb3BzLCBjb25uZWN0UmVmcywgY3JlYXRlUmVmQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRDb3JlXCI7XG5pbXBvcnQge1xuICAgIEV4cGVyaWVuY2VUeXBlcyxcbiAgICBJQ29tcG9uZW50Q29uZmlnLFxuICAgIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElEZWRpY2F0ZWRTa2luQ29uZmlnLCBJRXhwZXJpZW5jZSwgSUZ1bmN0aW9uUmVzdWx0c1NlZ21lbnQsIElTZWdtZW50ZWRTa2luQ29uZmlnLCBJU2VnbWVudEV4cGVyaWVuY2UsXG4gICAgSVNraW5Db25maWcsIElTa2luU2VsZWN0b3JDb25maWcsIFNraW5TZWxlY3RvclR5cGVzLFxuXG5cbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuLy8gQHRzLWlnbm9yZSBoYW5kbGVkIGJ5IGN1c3RvbSBlc2J1aWxkIHBsdWdpblxuaW1wb3J0IHZlcnNpb24gZnJvbSBcIm15b3Atc2RrLXZlcnNpb25cIjtcbmltcG9ydCB7ZGVsaXZlcnksIGRlbGl2ZXJ5T2ZmLCBkZWxpdmVyeVJlZnJlc2gsIGRlbGl2ZXJ5U3RhdHMsIGh5ZHJhdGVWMUNvbXBvbmVudHN9IGZyb20gXCIuLi9oZWxwZXJzL2Nsb3VkUmVwb3NpdG9yeUhlbHBlcnNcIjtcbmltcG9ydCB7SFRNTENvbXBvbmVudExvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy9IVE1MQ29tcG9uZW50TG9hZGVyXCI7XG5pbXBvcnQge2NoZWNrTXlvcE92ZXJyaWRlfSBmcm9tIFwiLi9teW9wT3ZlcnJpZGUudHNcIjtcblxuaW50ZXJmYWNlIGNvbXBvbmVudExvYWRlckNyZWF0b3Ige1xuICAgIG5ldyhsb2FkZXJzOiBJTXlvcExvYWRlcltdKTogYW55O1xufVxuXG4vLyBjb25zdCBnZXRDb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gYXN5bmMgKGlkOiBzdHJpbmcpID0+IHtcbi8vICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgaHR0cDovL2xvY2FsaG9zdDozMDAwL2NvbXBvbmVudD9pZD0ke2lkfWApO1xuLy8gICAgIGNvbnN0IGNvbXBvbmVudERlZjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcgPSAoYXdhaXQgcmVzLmpzb24oKSkuaXRlbTtcbi8vICAgICByZXR1cm4gY29tcG9uZW50RGVmXG4vLyB9XG5cbi8vY29uc3QgX19ST09UX1NES19QVUJMSUNfVVJMX18gPSAnaHR0cHM6Ly9kZmRsazJwMW0xODd2LmNsb3VkZnJvbnQubmV0L215b3Bfc2RrLm1pbi5qcydcbmNvbnN0IF9fUk9PVF9TREtfUFVCTElDX1VSTF9fID0gJ2h0dHBzOi8vY2RuLm15b3AuZGV2L3Nkay9uZXh0L215b3Bfc2RrLm1pbi5qcydcblxuLyoqXG4gKiBUaGUgSG9zdCBTREsgaXMgZGVzaWduZWQgZm9yIGludGVncmF0aW9uIHdpdGhpbiB0aGUgaG9zdCBhcHBsaWNhdGlvbiB0aGF0IHNlcnZlcyBhcyB0aGUgY29udGFpbmVyIGZvciBNeW9wICBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIEl0IHByb3ZpZGVzIGVzc2VudGlhbCBmdW5jdGlvbmFsaXRpZXMgYW5kIEFQSXMgZm9yIHJlZ2lzdGVyaW5nLCBtYW5hZ2luZywgYW5kIGNvbW11bmljYXRpbmcgd2l0aCBNeW9wIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogVGhpcyBTREsgZW5hYmxlcyBzZWFtbGVzcyBlbWJlZGRpbmcgb2YgaW5kZXBlbmRlbnRseSBkZXZlbG9wZWQgY29tcG9uZW50cyBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uLCBlbnN1cmluZyBzbW9vdGggaW50ZXJvcGVyYWJpbGl0eSBhbmQgY29uc2lzdGVudCB1c2VyIGV4cGVyaWVuY2UgYWNyb3NzIHZhcmlvdXMgTXlvcCBjb21wb25lbnQgaW1wbGVtZW50YXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgSG9zdFNESyB7XG4gICAgc3RhdGljIEluc3RhbmNlID0gKCkgPT4gd2luZG93Lm15b3AuaG9zdFNESztcblxuICAgIGNvbXBvbmVudHMyaW5pdDogSU15b3BDb21wb25lbnRbXSA9IFtdO1xuICAgIGNvbXBvbmVudHM6IElNeW9wQ29tcG9uZW50W10gPSBbXTtcbiAgICBjb21wb25lbnRzTG9hZGVyczogSU15b3BMb2FkZXJbXSA9IFtdO1xuXG4gICAgLy8gR2xvYmFsIHJlbmRlciBwb2xpY3kgKGFsbG93L2RlbnkvbW9kZSBnYXRlKS4gQSBwZXItY2FsbCBvcHRpb25zLnJlbmRlclBvbGljeVxuICAgIC8vIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGlzIFx1MjAxNCBzZWUgSFRNTENvbXBvbmVudExvYWRlci5yZXNvbHZlUmVuZGVyTW9kZS5cbiAgICBwcml2YXRlIF9yZW5kZXJQb2xpY3k/OiBSZW5kZXJQb2xpY3k7XG4gICAgcHVibGljIHNldFJlbmRlclBvbGljeSA9IChwb2xpY3k/OiBSZW5kZXJQb2xpY3kpID0+IHsgdGhpcy5fcmVuZGVyUG9saWN5ID0gcG9saWN5OyB9O1xuICAgIHB1YmxpYyBnZXRSZW5kZXJQb2xpY3kgPSAoKTogUmVuZGVyUG9saWN5IHwgdW5kZWZpbmVkID0+IHRoaXMuX3JlbmRlclBvbGljeTtcblxuICAgIHB1YmxpYyBpbml0aWF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyB2ZXJzaW9uID0gdmVyc2lvbjtcblxuICAgIHR5cGUySW5zdGFuY2VDb3VudDogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIHB1YmxpYyBhc3NpZ25JZCA9IChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZykgPT4ge1xuICAgICAgICBpZiAoIXRoaXMudHlwZTJJbnN0YW5jZUNvdW50W2NvbXBvbmVudERlZmluaXRpb24uaWRdKSB7XG4gICAgICAgICAgICB0aGlzLnR5cGUySW5zdGFuY2VDb3VudFtjb21wb25lbnREZWZpbml0aW9uLmlkXSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke2NvbXBvbmVudERlZmluaXRpb24uaWR9XyR7Kyt0aGlzLnR5cGUySW5zdGFuY2VDb3VudFtjb21wb25lbnREZWZpbml0aW9uLmlkXX1gO1xuICAgIH1cblxuICAgIC8vVE9ETyA6IGZpeCB0aGUgaW5zcGVjdCBpbXBsZW1lbnRhdGlvbiBpbnNpZGUgcmVmQ29tcG9uZW50XG4gICAgLy90aGVuIGluc3BlY3RlZCBtYXliZSBjYW4gYmUgZHJvcHBlZFxuICAgIHByaXZhdGUgaW5zcGVjdGVkID0gZmFsc2U7XG4gICAgcHVibGljIGluc3BlY3QgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmluc3BlY3RlZClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0aGlzLmluc3BlY3RlZCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzLmZvckVhY2goY29tcG9uZW50ID0+IHtcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQuaW5zcGVjdCkge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbnNwZWN0KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBBIGNvbXBvbmVudCdzIG9yaWdpbiBpcyB3aGF0ZXZlciBpdHMgaWZyYW1lIFVSTCBpcywgc28gYW4gb3JpZ2luIGFsbG93bGlzdCBjYW4ndCB3b3JrIGhlcmUuXG4gICAgLy8gSW5zdGVhZCBvbmx5IGZyYW1lcyB0aGlzIFNESyBjcmVhdGVkIChvciBhZG9wdGVkKSBtYXkgdGFsayB0byBpdC4gYHNlbmQoKWAgZGlzcGF0Y2hlc1xuICAgIC8vIHN5bnRoZXRpYyBldmVudHMsIHdoaWNoIGhhdmUgbm8gc291cmNlLlxuICAgIHByaXZhdGUgaXNUcnVzdGVkU291cmNlID0gKHNvdXJjZTogTWVzc2FnZUV2ZW50U291cmNlIHwgbnVsbCkgPT4ge1xuICAgICAgICBpZiAoIXNvdXJjZSB8fCBzb3VyY2UgPT09IHdpbmRvdykgcmV0dXJuIHRydWU7XG4gICAgICAgIGNvbnN0IGlzT3duRnJhbWUgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGNvbXBvbmVudC5lbGVtZW50IGFzIEhUTUxJRnJhbWVFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ/Lm5vZGVOYW1lID09PSAnSUZSQU1FJyAmJiBlbGVtZW50LmNvbnRlbnRXaW5kb3cgPT09IHNvdXJjZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50cy5zb21lKGlzT3duRnJhbWUpIHx8IHRoaXMuY29tcG9uZW50czJpbml0LnNvbWUoaXNPd25GcmFtZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbmNvbWluZ01lc3NhZ2VIYW5kbGVyID0gKGV2ZW50OiBNZXNzYWdlRXZlbnQ8QmFzZU15b3BNZXNzYWdlPikgPT4ge1xuICAgICAgICBpZiAoIWV2ZW50LmRhdGE/Lm15b3ApIHJldHVybjtcblxuICAgICAgICBpZiAoIXRoaXMuaXNUcnVzdGVkU291cmNlKGV2ZW50LnNvdXJjZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5kYXRhLm15b3ApIHtcbiAgICAgICAgICAgIGlmIChldmVudC5kYXRhLmRpcmVjdGlvbiAhPT0gTWVzc2FnZURpcmVjdGlvbi51cCAmJiBldmVudC5kYXRhLm1lc3NhZ2VUeXBlICE9PSBNeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ21lc3NhZ2UgZHJvcHBlZCBpbiBob3N0c2RrLCBkaXJlY3Rpb24gd2FzICcsIGV2ZW50LmRhdGEuZGlyZWN0aW9uKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZXZlbnQgb24gaG9zdCBzaWRlIFwiLCBldmVudCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG15b3BNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UgPSBldmVudC5kYXRhO1xuXG4gICAgICAgICAgICBpZiAobXlvcE1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbml0UmVxdWVzdCkge1xuICAgICAgICAgICAgICAgIC8vIEFOU1dFUiBUSEUgRlJBTUUgVEhBVCBBU0tFRCwgTk9UIEVWRVJZIFBFTkRJTkcgQ09NUE9ORU5ULlxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gYGV2ZW50LnNvdXJjZWAgbmFtZXMgdGhlIGFza2luZyBmcmFtZSwgYW5kIGlnbm9yaW5nIGl0IG1hZGUgdGhlIGFuc3dlciBhXG4gICAgICAgICAgICAgICAgLy8gYnJvYWRjYXN0OiBuIGNvbXBvbmVudHMgZWFjaCBhbm5vdW5jZSBvbmNlLCBhbmQgZWFjaCBhbm5vdW5jZSByZS1zZW50XG4gICAgICAgICAgICAgICAgLy8gSW5pdE1lc3NhZ2UgdG8gYWxsIG4gcGVuZGluZywgc28gYSBwYWdlIHBhaWQgbl4yIHBvc3RNZXNzYWdlcyBkdXJpbmcgdGhlXG4gICAgICAgICAgICAgICAgLy8gZXhhY3Qgd2luZG93IGl0IHdhcyBidXNpZXN0IGJvb3RpbmcgZnJhbWVzLiBNZWFzdXJlZCBvbiBhIDEyLWNvbXBvbmVudFxuICAgICAgICAgICAgICAgIC8vIHBhZ2UgKFBpYy1UaW1lJ3Mgc2hhcGUpOiAxNDQgSW5pdE1lc3NhZ2VzIHdoZXJlIDEyIHdlcmUgbmVlZGVkLlxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gKEEgZnJhbWUtc2lkZSByZXRyeSBsb29wIGJyaWVmbHkgZXhpc3RlZCBoZXJlIHRvbzsgaXQgd2FzIHJlbW92ZWQgYXNcbiAgICAgICAgICAgICAgICAvLyBkZWFkIHdlaWdodCBvbmNlIGZpeCAxIGxhbmRlZC4gVGFyZ2V0aW5nIG1lYW5zIGEgcmVwZWF0IGFubm91bmNlLCBmcm9tXG4gICAgICAgICAgICAgICAgLy8gYW55IGZ1dHVyZSBzb3VyY2UsIGNvc3RzIG9uZSBtZXNzYWdlIHJhdGhlciB0aGFuIG4uKVxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gRkFMTCBCQUNLIFRPIFRIRSBCUk9BRENBU1Qgd2hlbiB0aGUgc291cmNlIGNhbm5vdCBiZSBtYXRjaGVkIHRvIGEgZnJhbWUuXG4gICAgICAgICAgICAgICAgLy8gYHNlbmQoKWAgZGlzcGF0Y2hlcyBzeW50aGV0aWMgZXZlbnRzLCB3aGljaCBjYXJyeSBubyBzb3VyY2UsIGFuZCBhIHdlYlxuICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudCdzIEluaXRSZXF1ZXN0IGNvbWVzIGZyb20gYHdpbmRvd2AgaXRzZWxmIC0tIG5laXRoZXIgaGFzIGFcbiAgICAgICAgICAgICAgICAvLyBjb250ZW50V2luZG93IHRvIG1hdGNoLCBhbmQgYm90aCBtdXN0IGtlZXAgd29ya2luZyBleGFjdGx5IGFzIGJlZm9yZS5cbiAgICAgICAgICAgICAgICBjb25zdCBmcm9tQXNraW5nRnJhbWUgPSB0aGlzLmNvbXBvbmVudHMyaW5pdC5maWx0ZXIoY29tcG9uZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGNvbXBvbmVudC5lbGVtZW50IGFzIEhUTUxJRnJhbWVFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudD8ubm9kZU5hbWUgPT09ICdJRlJBTUUnICYmIGVsZW1lbnQuY29udGVudFdpbmRvdyA9PT0gZXZlbnQuc291cmNlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldHMgPSBmcm9tQXNraW5nRnJhbWUubGVuZ3RoID8gZnJvbUFza2luZ0ZyYW1lIDogdGhpcy5jb21wb25lbnRzMmluaXQ7XG4gICAgICAgICAgICAgICAgdGFyZ2V0cy5mb3JFYWNoKGNvbXBvbmVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBJbml0TWVzc2FnZShjb21wb25lbnQuaWQpKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG15b3BNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdFJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gY29tcG9uZW50cyAyIGluaXRcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQgPSB0aGlzLmNvbXBvbmVudHMyaW5pdC5maWx0ZXIoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCAhPT0gKG15b3BNZXNzYWdlIGFzIEluaXRSZXNwb25zZSkuY29udGVudC5pZClcblxuICAgICAgICAgICAgICAgIGNvbnN0IGluaXRpYXRlZENvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IChteW9wTWVzc2FnZSBhcyBJbml0UmVzcG9uc2UpLmNvbnRlbnQ/LmlkKTtcbiAgICAgICAgICAgICAgICBpbml0aWF0ZWRDb21wb25lbnQ/LnNldEluaXRpYXRlZCgpXG4gICAgICAgICAgICAgICAgLy9pbml0aWF0ZWRDb21wb25lbnQ/LnBhcmVudD8uc2V0SW5pdGlhdGVkKCk7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyA6IGlzIGl0IHRydWUgdG8gbm90IHBhc3MgZnVydGhlciAoIHRvIHRoZSBjb21wb25lbnQgKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG15b3BNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gbXlvcE1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IHR5cGVkTWVzc2FnZS5kZXN0aW5hdGlvbik7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVmQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZE1lc3NhZ2UuZGlyZWN0aW9uID09PSBNZXNzYWdlRGlyZWN0aW9uLmRvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZE1lc3NhZ2UubWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gRXhlY3V0ZUNvbXBvbmVudE1ldGhvZC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50Lm9uTWVzc2FnZVJlY2VpdmVkKHR5cGVkTWVzc2FnZS5tZXNzYWdlKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVkTWVzc2FnZS5tZXNzYWdlLnJvdXRlID0gdHlwZWRNZXNzYWdlLnJvdXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5zZW5kKHR5cGVkTWVzc2FnZS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzLmZpbmQoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCA9PT0gdHlwZWRNZXNzYWdlLm1lc3NhZ2UuZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5uZXJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyQ29tcG9uZW50LnNlbmQodHlwZWRNZXNzYWdlLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIDogbG9nID9cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgLy9jb21wb25lbnQucmVmcy5ib2R5Lm9uTWVzc2FnZVJlY2VpdmVkKG15b3BNZXNzYWdlLm1lc3NhZ2UpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSBteW9wTWVzc2FnZS5kZXN0aW5hdGlvbik7XG5cbiAgICAgICAgICAgIGlmICghY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgLy9ubyBpbiBtZW0gY29tcG9uZW50XG4gICAgICAgICAgICAgICAgLy9wYXNzIHRvIHBhcmVudCBIb3N0U0RLIHRvIHRyeSBwcm9jZXNzIHRoZXJlXG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5teW9wLklmcmFtZVNESykge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcC5JZnJhbWVTREsubWVzc2FnZVRvSG9zdChteW9wTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQub25NZXNzYWdlUmVjZWl2ZWQobXlvcE1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL25vdCBwcm9jZXNzZWQgaW4gb25NZXNzYWdlUmVjZWl2ZWRcbiAgICAgICAgICAgICAgICAgICAgLy9wYXNzIHRvIHBhcmVudCBIb3N0U0RLIHRvIHRyeSBwcm9jZXNzIHRoZXJlXG4gICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cubXlvcC5JZnJhbWVTREspXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcC5JZnJhbWVTREsubWVzc2FnZVRvSG9zdChteW9wTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZXZlbnQuc291cmNlLnBvc3RNZXNzYWdlKFxuICAgICAgICAvLyAgICAgXCJoaSB0aGVyZSB5b3Vyc2VsZiEgIHRoZSBzZWNyZXQgcmVzcG9uc2UgXCIgKyBcImlzOiByaGVlZWVldCFcIixcbiAgICAgICAgLy8gICAgIGV2ZW50Lm9yaWdpbixcbiAgICAgICAgLy8gICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBzeW50aGV0aWNFdmVudCA9IG5ldyBNZXNzYWdlRXZlbnQ8QmFzZU15b3BNZXNzYWdlPignJyxcbiAgICAgICAgICAgIHtkYXRhOiBtZXNzYWdlfVxuICAgICAgICApXG5cbiAgICAgICAgdGhpcy5pbmNvbWluZ01lc3NhZ2VIYW5kbGVyKHN5bnRoZXRpY0V2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdCA9IChjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycz86IGNvbXBvbmVudExvYWRlckNyZWF0b3JbXSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pbml0aWF0ZWQpIHtcbiAgICAgICAgICAgIC8vIGdldEhvc3RNb2R1bGUoKSBhbHJlYWR5IGluaXRpYXRlcyB0aGUgU0RLLCBhbmQgdGhlIFJFQURNRSB0ZWxscyBob3N0cyB0byBjYWxsIGluaXQoKVxuICAgICAgICAgICAgLy8gYWZ0ZXIgaXQuIE9ubHkgbWVyZ2UgY3VzdG9tIGxvYWRlcnM7IHRoZSBtZXNzYWdlIGxpc3RlbmVyIGlzIGFscmVhZHkgYXR0YWNoZWQuXG4gICAgICAgICAgICBpZiAoY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyTG9hZGVycyhjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXNpY0xvYWRlcnMgPSBbXG4gICAgICAgICAgICBuZXcgTXlvcElmcmFtZUxvYWRlcigpLFxuICAgICAgICAgICAgbmV3IFdlYmNvbXBvbmVudExvYWRlcigpLFxuICAgICAgICAgICAgbmV3IEhUTUxDb21wb25lbnRMb2FkZXIoKVxuICAgICAgICBdO1xuXG4gICAgICAgIHRoaXMuY29tcG9uZW50c0xvYWRlcnMgPSBbXG4gICAgICAgICAgICAuLi5iYXNpY0xvYWRlcnNcbiAgICAgICAgXTtcblxuICAgICAgICBpZiAoY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnMpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyTG9hZGVycyhjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbmNvbW1pbmcgbWVzc2FnZXMgZnJvbSBJRnJhbWVzXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgXCJtZXNzYWdlXCIsXG4gICAgICAgICAgICB0aGlzLmluY29taW5nTWVzc2FnZUhhbmRsZXIsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zb2xlLmxvZygnbXlvcCBob3N0U0RLIGluaXRpYXRlZCcsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICB0aGlzLmluaXRpYXRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVnaXN0ZXJMb2FkZXJzID0gKGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3JzOiBjb21wb25lbnRMb2FkZXJDcmVhdG9yW10pID0+IHtcbiAgICAgICAgY29uc3QgbG9hZGVyQnlUeXBlOiBSZWNvcmQ8c3RyaW5nLCBJTXlvcExvYWRlcj4gPSB7fTtcblxuICAgICAgICBjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycy5mb3JFYWNoKGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3IgPT4ge1xuICAgICAgICAgICAgY29uc3QgY3VzdG9tTG9hZGVyID0gbmV3IGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3IodGhpcy5jb21wb25lbnRzTG9hZGVycyk7XG4gICAgICAgICAgICBsb2FkZXJCeVR5cGVbY3VzdG9tTG9hZGVyLnR5cGVdID0gY3VzdG9tTG9hZGVyO1xuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuY29tcG9uZW50c0xvYWRlcnMuZm9yRWFjaChsb2FkZXIgPT4ge1xuICAgICAgICAgICAgaWYgKCFsb2FkZXJCeVR5cGVbbG9hZGVyLnR5cGVdKVxuICAgICAgICAgICAgICAgIGxvYWRlckJ5VHlwZVtsb2FkZXIudHlwZV0gPSBsb2FkZXI7XG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzTG9hZGVycyA9IE9iamVjdC52YWx1ZXMobG9hZGVyQnlUeXBlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRTa2luSWRCeVNraW5TZWxlY3RvciA9IGFzeW5jIChza2luU2VsZWN0b3I6IElTa2luU2VsZWN0b3JDb25maWcsIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdID0gW10sIGhvb2tzPzogbG9hZGVySG9va3MpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgICBhc3luYyBmdW5jdGlvbiBhc3luY0ZpbmQ8VD4oXG4gICAgICAgICAgICBhcnJheTogVFtdLFxuICAgICAgICAgICAgcHJlZGljYXRlOiAoaXRlbTogVCkgPT4gUHJvbWlzZTxib29sZWFuPlxuICAgICAgICApOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBhcnJheSkge1xuICAgICAgICAgICAgICAgIGlmIChhd2FpdCBwcmVkaWNhdGUoaXRlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gUmV0dXJuIHVuZGVmaW5lZCBpZiBubyBtYXRjaCBpcyBmb3VuZFxuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChza2luU2VsZWN0b3IudHlwZSkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY2FzZSBcIkRlZGljYXRlZFNraW5cIiA6IC8vYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgY2FzZSBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQ6IHtcbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRTa2luSWQgPSAoc2tpblNlbGVjdG9yIGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnKS5za2luPy5pZFxuICAgICAgICAgICAgICAgICAgICB8fCAoc2tpblNlbGVjdG9yIGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnKS5za2lucyFbMF0uaWQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRTa2luSWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNraW5TZWxlY3RvclR5cGVzLlNlZ21lbnRlZDoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkU2tpblNlbGVjdG9yID0gKHNraW5TZWxlY3RvciBhcyBJU2VnbWVudGVkU2tpbkNvbmZpZylcbiAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gYXdhaXQgYXN5bmNGaW5kKHR5cGVkU2tpblNlbGVjdG9yLnNlZ21lbnRzLCBhc3luYyBzZWdtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQuc2VnbWVudElkID09PSAnRGVmYXVsdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhwZXJpZW5jZSA9IGV4cGVyaWVuY2VzLmZpbmQoZXhwZXJpZW5jZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZXJpZW5jZS50eXBlID09PSBFeHBlcmllbmNlVHlwZXMuU2VnbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXhwZXJpZW5jZSBhcyBJU2VnbWVudEV4cGVyaWVuY2UpLnNlZ21lbnQuaWQgPT09IHNlZ21lbnQuc2VnbWVudElkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghZXhwZXJpZW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZXhwZXJpZW5jZSBub3QgZm91bmRcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZEV4cGVyaWVuY2UgPSBleHBlcmllbmNlIGFzIElTZWdtZW50RXhwZXJpZW5jZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRTZWdtZW50ID0gKHR5cGVkRXhwZXJpZW5jZS5zZWdtZW50IGFzIElGdW5jdGlvblJlc3VsdHNTZWdtZW50KVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRGdW5jdGlvbiA9IChob29rcyA/IGhvb2tzIDoge30pW3R5cGVkU2VnbWVudC5mdW5jdGlvbl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50RnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBzZWdtZW50RnVuY3Rpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBzZWdtZW50SWQ6JHtzZWdtZW50LnNlZ21lbnRJZH0sICR7dHlwZWRTZWdtZW50LmZ1bmN0aW9ufSBmdW5jdGlvbiBub3QgcHJvdmlkZWQgIWApXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2VnbWVudClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNraW5JZEJ5U2tpblNlbGVjdG9yKHNlZ21lbnQuc2tpblNlbGVjdG9yLCBleHBlcmllbmNlcyk7XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJycgLy9UT0RPXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBydW5Ta2luU2VsZWN0b3IgPSBhc3luYyAoY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBob29rcz86IGxvYWRlckhvb2tzKSA9PiB7XG4gICAgICAgIGNvbnN0IHNraW5JZCA9IGF3YWl0IHRoaXMuX2dldFNraW5JZEJ5U2tpblNlbGVjdG9yKGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5za2luU2VsZWN0b3IsIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZEV4cGVyaWVuY2VzLCBob29rcyk7XG4gICAgICAgIHJldHVybiBjb21wb25lbnRDb25maWcudHlwZS5za2lucy5maW5kKHNraW4gPT4gc2tpbi5pZCA9PT0gc2tpbklkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZGVySG9va3M/OiBsb2FkZXJIb29rcztcblxuICAgIHB1YmxpYyBsb2FkQ29tcG9uZW50ID0gYXN5bmMgPFQgZXh0ZW5kcyBJTXlvcENvbXBvbmVudCA9IElNeW9wQ29tcG9uZW50Pihjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50IHwgUmVmLCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucyk6XG4gICAgICAgIFByb21pc2U8VD4gPT4ge1xuXG4gICAgICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm8gY29udGFpbmVyIHdhcyBmb3VuZCBmb3IgdGhpcyBjb21wb25lbnQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG92ZXJyaWRkZW5Db25maWcgPSBhd2FpdCBjaGVja015b3BPdmVycmlkZShjb21wb25lbnRDb25maWcpO1xuICAgICAgICBpZiAob3ZlcnJpZGRlbkNvbmZpZykge1xuICAgICAgICAgICAgLy9UT0RPIDogbG9nXG4gICAgICAgICAgICBjb21wb25lbnRDb25maWcgPSBvdmVycmlkZGVuQ29uZmlnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gLy8gQHRzLWlnbm9yZVxuICAgICAgICAvLyBpZiAoIWNvbnRhaW5lci5fX25vblByb3hpZWQpIHtcbiAgICAgICAgLy8gICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IChjb250YWluZXIgYXMgdW5rbm93biBhcyBNeW9wUmVmQ29tcG9uZW50KTtcbiAgICAgICAgLy8gICAgIC8vaWYgd2UgZ290IGxvYWRDb21wb25lbnQgb3ZlciBNeW9wUmVmQ29tcG9uZW50XG4gICAgICAgIC8vICAgICBpZiAocmVmQ29tcG9uZW50LmlkICYmIHJlZkNvbXBvbmVudC5wYXJlbnQpIHtcbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gdGhpcy5sb2FkQ29tcG9uZW50KGNvbXBvbmVudENvbmZpZywgcmVmQ29tcG9uZW50LnJlZiwgb3B0aW9ucyk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgLy8gbGV0IHJvb3RDb21wb25lbnQ6IElNeW9wQ29tcG9uZW50ID0gcmVmQ29tcG9uZW50O1xuICAgICAgICAvLyAgICAgICAgIC8vIHdoaWxlKCFyb290Q29tcG9uZW50LmVsZW1lbnQgJiYgcm9vdENvbXBvbmVudC5wYXJlbnQpe1xuICAgICAgICAvLyAgICAgICAgIC8vICAgICByb290Q29tcG9uZW50ID0gcm9vdENvbXBvbmVudC5wYXJlbnRcbiAgICAgICAgLy8gICAgICAgICAvLyB9XG4gICAgICAgIC8vICAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICAvLyByb290Q29tcG9uZW50LmVsZW1lbnRcbiAgICAgICAgLy8gICAgICAgICAvLyAvL3doYXQgbm93ID9cbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGNvbnN0IGhvb2tzID0gey4uLih0aGlzLmxvYWRlckhvb2tzID8/IHt9KSwgLi4uKG9wdGlvbnM/Lmhvb2tzID8/IHt9KX07XG5cbiAgICAgICAgY29uc3QgcmVmID0gY29udGFpbmVyIGFzIFJlZjtcbiAgICAgICAgaWYgKHJlZi5teW9wKSB7XG4gICAgICAgICAgICBpZiAocmVmLmNvbXBvbmVudCkge1xuXG4gICAgICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnID0gey4uLmNvbXBvbmVudENvbmZpZ307XG4gICAgICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnLmluc3RhbmNlID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5jb21wb25lbnRDb25maWcuaW5zdGFuY2VcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRTa2luID0gYXdhaXQgdGhpcy5ydW5Ta2luU2VsZWN0b3IoY29tcG9uZW50Q29uZmlnLCBob29rcykhXG4gICAgICAgICAgICAgICAgaWYgKCFzZWxlY3RlZFNraW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicnVuU2tpblNlbGVjdG9yIGZhaWxlZCB0byBjaG9vc2Ugc2tpbiwgY2hlY2sgdGhlIHByb3ZpZGVkIGNvbmZpZ1wiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucz8uaG9va3M/LmFmdGVyU2tpblNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkU2tpbiA9IGF3YWl0IG9wdGlvbnMuaG9va3MuYWZ0ZXJTa2luU2VsZWN0ZWQoey4uLnNlbGVjdGVkU2tpbn0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgc2tpbjogc2VsZWN0ZWRTa2luXG4gICAgICAgICAgICAgICAgICAgIC8vICBza2luczogW3NlbGVjdGVkU2tpbl1cbiAgICAgICAgICAgICAgICB9IGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnXG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gey4uLm9wdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zLmhvb2tzXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gYXdhaXQgY3JlYXRlUmVmQ29tcG9uZW50PFQ+KHJlZiwgY29tcG9uZW50Q29uZmlnLCB0aGlzLmNvbXBvbmVudHMsIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY29ubmVjdCByZWZzIGFuZCBwcm9wcyBpbnNvZGUgY3JlYXRlUmVmQ29tcG9uZW50LCBlbHNld2hlcmUgaXRzIG5vdCByZWFsbHkgPFQ+XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZkNvbXBvbmVudDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdsb2FkIGNvbXBvbmVudCBnb3QgYSBkZXRhY2hlZCByZWYuJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lciBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAvKipcbiAgICAgICAgICpcbiAgICAgICAgICogY2hvb3NlIHNraW4gb24gcnVudGltZSAuLi5cbiAgICAgICAgICogICAgICAgIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5za2luU2VsZWN0b3IudHlwZVxuICAgICAgICAgKi9cblxuICAgICAgICBsZXQgc2VsZWN0ZWRTa2luID0gYXdhaXQgdGhpcy5ydW5Ta2luU2VsZWN0b3IoY29tcG9uZW50Q29uZmlnLCBob29rcykhXG5cbiAgICAgICAgaWYgKCFzZWxlY3RlZFNraW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJ1blNraW5TZWxlY3RvciBmYWlsZWQgdG8gY2hvb3NlIHNraW4sIGNoZWNrIHRoZSBwcm92aWRlZCBjb25maWdcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uaG9va3M/LmFmdGVyU2tpblNlbGVjdGVkKSB7XG4gICAgICAgICAgICBzZWxlY3RlZFNraW4gPSBhd2FpdCBvcHRpb25zLmhvb2tzLmFmdGVyU2tpblNlbGVjdGVkKHsuLi5zZWxlY3RlZFNraW59KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wb25lbnRMb2FkZXIgPSB0aGlzLmNvbXBvbmVudHNMb2FkZXJzLmZpbmQobG9hZGVyID0+IGxvYWRlci50eXBlID09PSBzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGUpO1xuXG4gICAgICAgIGlmICghY29tcG9uZW50TG9hZGVyKSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbm8gbG9hZGVyIFwiJHtzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGV9XCIgd2FzIGZvdW5kIGZvciBjb21wb25lbnRgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vZm9yIGxvYWRlZCB3ZWJjb21wb25lbnQgbW9kdWxlcyB0byBmb2xsb3dpbmcgbGluZSBjcmVhdGVzIGEgcmFjZSBjb25kaXRpb24gd2l0aCB0aGUgaW5pdCBtZXNzYWdlIGZsb3dcbiAgICAgICAgbGV0IGNvbXBvbmVudCA9IGF3YWl0IGNvbXBvbmVudExvYWRlci5sb2FkKGNvbXBvbmVudENvbmZpZy50eXBlLCBzZWxlY3RlZFNraW4sIGNvbnRhaW5lciwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gVE9ETyA6IHdoZW4gdGhpcyBpcyBub3QgdHJ1ZSA/XG4gICAgICAgIGlmICghY29tcG9uZW50LmlzSW5pdGlhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMyaW5pdC5wdXNoKGNvbXBvbmVudClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbXBvbmVudC5iaW5kKCdvbkRpc3Bvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjb21wb25lbnQgZGlzcG9zZScsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudHMuZmlsdGVyKGMgPT4gYyAhPT0gY29tcG9uZW50KVxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQgPSB0aGlzLmNvbXBvbmVudHMyaW5pdC5maWx0ZXIoYyA9PiBjICE9PSBjb21wb25lbnQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuXG4gICAgICAgIC8vIERPIE5PVCBXQUlUIFRPIEJFIEFTS0VEIC0tIEJVVCBPTkxZIE9OQ0UgRlVMTFkgUkVHSVNURVJFRC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhlIGNvbXBvbmVudCBhbm5vdW5jZXMgaXRzZWxmIGFzIHNvb24gYXMgaXQgYm9vdHMsIGFuZCB3ZSBhbnN3ZXIgYnkgbG9va2luZyBpdFxuICAgICAgICAvLyB1cC4gQnV0IGl0IG9ubHkgbGFuZHMgaW4gb3VyIGxpc3RzIEhFUkUsIGFmdGVyIHRoZSBhd2FpdCBhYm92ZSwgd2hpY2ggdGhlXG4gICAgICAgIC8vIGNvbW1lbnQgb24gdGhhdCBsaW5lIGFscmVhZHkgY2FsbHMgYSByYWNlOiBhIGNvbXBvbmVudCB0aGF0IGJvb3RlZCBpbnNpZGUgdGhlXG4gICAgICAgIC8vIGF3YWl0IGFubm91bmNlZCBpbnRvIGFuIGVtcHR5IGxpc3QsIGl0cyBJbml0UmVxdWVzdCB3YXMgZHJvcHBlZCwgYW5kIG5vdGhpbmdcbiAgICAgICAgLy8gZXZlciBzZW50IHRoZSBJbml0TWVzc2FnZSBpdCB3YXMgYmxvY2tlZCBvbiAtLSBpbml0aWF0ZWQoKSB0aGVuIHJlamVjdGVkIHdpdGhcbiAgICAgICAgLy8gdGltZW91dF88bXM+LiBNaW5pZmljYXRpb24gbWFkZSB0aGF0IGNvbW1vbiBieSBib290aW5nIGZyYW1lcyBzb29uZXIuIFJlcG9ydGVkXG4gICAgICAgIC8vIGJ5IFBpYy1UaW1lIDIwMjYtMTAtMTcuIFNlbmRpbmcgaGVyZSBjbG9zZXMgdGhlIG9yZGVyaW5nIGhvbGUgaW5zdGVhZCBvZiBob3BpbmdcbiAgICAgICAgLy8gdG8gc3Vydml2ZSBpdC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVEhJUyBNVVNUIENPTUUgQUZURVIgYGNvbXBvbmVudHMucHVzaGAsIE5PVCBCRUZPUkUgSVQuIFRoZSB0d28gY29tcG9uZW50IGNsYXNzZXNcbiAgICAgICAgLy8gZG8gbm90IHNoYXJlIGEgdHJhbnNwb3J0OiBhbiBpZnJhbWUgaXMgbWVzc2FnZWQgd2l0aCBwb3N0TWVzc2FnZSwgd2hpY2ggaXNcbiAgICAgICAgLy8gYXN5bmMsIHNvIHJlZ2lzdHJhdGlvbiBhbHdheXMgd29uIHRoZSByYWNlIGJ5IGx1Y2suIEEgd2ViIGNvbXBvbmVudCBpcyBtZXNzYWdlZFxuICAgICAgICAvLyB3aXRoIGEgU1lOQ0hST05PVVMgY3VzdG9tRWxlbWVudC5kaXNwYXRjaEV2ZW50LCBzbyBpdCByZWdpc3RlcnMgYW5kIHJlcGxpZXMgd2l0aFxuICAgICAgICAvLyBJbml0UmVzcG9uc2UgKmluc2lkZSogdGhpcyBjYWxsIC0tIGFuZCB0aGUgSW5pdFJlc3BvbnNlIGhhbmRsZXIgcmVzb2x2ZXMgdGhlXG4gICAgICAgIC8vIGNvbXBvbmVudCBvdXQgb2YgYHRoaXMuY29tcG9uZW50c2AuIFNlbmRpbmcgd2hpbGUgdGhhdCBhcnJheSB3YXMgc3RpbGwgbWlzc2luZ1xuICAgICAgICAvLyB0aGUgY29tcG9uZW50IG1lYW50IHRoZSBsb29rdXAgZm91bmQgbm90aGluZywgc2V0SW5pdGlhdGVkKCkgbmV2ZXIgcmFuLCBhbmRcbiAgICAgICAgLy8gc2luY2UgY29tcG9uZW50czJpbml0IGhhZCBhbHJlYWR5IGJlZW4gZmlsdGVyZWQgdGhlIGNvbXBvbmVudCBjb3VsZCBuZXZlciBiZVxuICAgICAgICAvLyByZWNvdmVyZWQ6IGV2ZXJ5IHdlYiBjb21wb25lbnQgaHVuZyB1bnRpbCB0aW1lb3V0LiBDYXVnaHQgYnlcbiAgICAgICAgLy8gdGVzdC9pbml0LXdlYmNvbXBvbmVudC5lMmUubWpzLlxuICAgICAgICAvL1xuICAgICAgICAvLyBBIGZyYW1lIHRoYXQgaGFzIG5vdCBib290ZWQgeWV0IGhhcyBhIG51bGwgY29udGVudFdpbmRvdywgc28gYHNlbmRgIGlzIGEgbm8tb3BcbiAgICAgICAgLy8gKGl0IGlzIG9wdGlvbmFsLWNoYWluZWQpIGFuZCB0aGF0IGNvbXBvbmVudCdzIG93biBJbml0UmVxdWVzdCBpcyBhbnN3ZXJlZFxuICAgICAgICAvLyBub3JtYWxseSAtLSB3ZSBhcmUgcmVnaXN0ZXJlZCBieSB0aGVuLlxuICAgICAgICBpZiAoIWNvbXBvbmVudC5pc0luaXRpYXRlZCkge1xuICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IEluaXRNZXNzYWdlKGNvbXBvbmVudC5pZCkpXG4gICAgICAgIH1cblxuICAgICAgICAvLyB0cnVlIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMuY29ubmVjdFByb3BzICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgLy9UT0RPIDogbWFrZSB0eXBlIGZpZWxkIGNvbmRpdGlvbmFsIHR5cGUgaW5mZXIgXCJzdHJpbmdcIiA+IHN0cmluZywgXCJudW1iZXJcIiA+IG51bWJlciwgZXRjLi4uXG4gICAgICAgICAgICBjb21wb25lbnQgPSBjb25uZWN0UHJvcHMoY29tcG9uZW50LCBjb21wb25lbnRDb25maWcudHlwZS5wcm9wcywgc2VsZWN0ZWRTa2luKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvL1RPRE8gOiBtYWtlIG9wdGlvbmFsP1xuICAgICAgICAgICAgLy9UT0RPIDogZml4IGlzc3VlcyB3aXRoIHRpbWVvdXQgYW5kIHdyb25nIHJlZiBuYW1lcyBmcm9tIGNvbmZpZyB2cyBjdXJyZW50IHNraW5cbiAgICAgICAgICAgIGF3YWl0IGNvbm5lY3RSZWZzKGNvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnLCB0aGlzLmNvbXBvbmVudHMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIFRPT0QgOiB0aHJvdyA/XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvcHRpb25zPy5za2lwSW5pdClcbiAgICAgICAgICAgIGF3YWl0IGNvbXBvbmVudC5pbml0aWF0ZWQoKTtcblxuICAgICAgICByZXR1cm4gY29tcG9uZW50IGFzIFQ7XG4gICAgfVxuXG4gICAgcHVibGljIG5hdmlnYXRlID0gYXN5bmMgPFQgZXh0ZW5kcyBJTXlvcENvbXBvbmVudCA9IElNeW9wQ29tcG9uZW50Pihjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBuZXdDb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIG9wdGlvbnM/OiBuYXZpZ2F0aW9uT3B0aW9ucykgPT4ge1xuICAgICAgICBpZiAoY29tcG9uZW50LnBhcmVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOYXZpZ2F0aW5nIG9uIHJlbW90ZSByZWYgY29tcG9uZW50cyBpcyBub3QgaW1wbGVtZW50ZWQgeWV0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2NvbXBvbmVudC5tYXJrZWRGb3JEaXNwb3NlZCA9IHRydWU7XG5cbiAgICAgICAgLy8gaWYgKG9wdGlvbnM/LmlucGxhY2UpIHtcbiAgICAgICAgLy8gICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICAvLyAgICAgICAgIGxldCBuZXdDb21wb25lbnQgPSBhd2FpdCB0aGlzLmxvYWRDb21wb25lbnQ8VD4obmV3Q29tcG9uZW50Q29uZmlnLCBjb21wb25lbnQuZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAgICAgYXdhaXQgbmV3Q29tcG9uZW50LmluaXRpYXRlZCgpO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgIGlmIChvcHRpb25zLmluaXQpXG4gICAgICAgIC8vICAgICAgICAgICAgIGF3YWl0IG9wdGlvbnMuaW5pdChuZXdDb21wb25lbnQpO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgIHJldHVybiBuZXdDb21wb25lbnQ7XG4gICAgICAgIC8vICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgICAgIHRocm93IG5ldyBFcnJvcignLi4uJylcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5zdGFnZWQpIHtcbiAgICAgICAgICAgIC8vY29uc3Qgc2VsZWN0ZWRTa2luID0gdGhpcy5ydW5Ta2luU2VsZWN0b3IobmV3Q29tcG9uZW50Q29uZmlnKVxuICAgICAgICAgICAgbGV0IG5ld0NvbXBvbmVudCA9IGF3YWl0IHRoaXMubG9hZENvbXBvbmVudDxUPihuZXdDb21wb25lbnRDb25maWcsIGNvbXBvbmVudC5jb250YWluZXIsIHtcbiAgICAgICAgICAgICAgICBoaWRkZW46IHRydWUsXG4gICAgICAgICAgICAgICAgcmVsYXRpdmU6IHtkaXJlY3Rpb246ICdhZnRlcicsIGNoaWxkOiBjb21wb25lbnQuZWxlbWVudCF9LFxuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5pbml0KVxuICAgICAgICAgICAgICAgIGF3YWl0IG9wdGlvbnMuaW5pdChuZXdDb21wb25lbnQpO1xuXG4gICAgICAgICAgICBuZXdDb21wb25lbnQuc2hvdygpO1xuICAgICAgICAgICAgY29tcG9uZW50LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBuZXdDb21wb25lbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0U2libGluZyA9IGNvbXBvbmVudC5lbGVtZW50IS5uZXh0U2libGluZztcblxuICAgICAgICAgICAgY29tcG9uZW50LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRDb21wb25lbnQ8VD4obmV3Q29tcG9uZW50Q29uZmlnLCBjb21wb25lbnQuY29udGFpbmVyLCB7XG4gICAgICAgICAgICAgICAgcmVsYXRpdmU6IHtcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBcImJlZm9yZVwiLFxuICAgICAgICAgICAgICAgICAgICBjaGlsZDogbmV4dFNpYmxpbmcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgbmF2aWdhdGlvbk9wdGlvbnMgPSB7XG4gICAgc3RhZ2VkPzogYm9vbGVhbixcbiAgICAvL2lucGxhY2U/OiBib29sZWFuLFxuICAgIGluaXQ/OiAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCkgPT4gUHJvbWlzZTx2b2lkPlxuICAgIHNraXBJbml0PzogYm9vbGVhblxufSAmIGxvYWRlck9wdGlvbnNcblxudHlwZSByZWxhdGl2ZUxvYWRDb25maWdEaXJlY3Rpb24gPSAnYmVmb3JlJyB8ICdhZnRlcic7XG5cblxuZXhwb3J0IHR5cGUgbG9hZGVySG9va3MgPSB7XG4gICAgYWZ0ZXJTa2luU2VsZWN0ZWQ/OiAoc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZykgPT4gUHJvbWlzZTxJU2tpbkNvbmZpZz5cbn0gJlxuICAgIC8vIHNlZ21lbnRhdGlvbiBob29rc1xuICAgICh7IFtrZXk6IHN0cmluZ106ICgpID0+IFByb21pc2U8Ym9vbGVhbj4gfCBib29sZWFuIH0gfCB7fSlcblxuLy9UT0RPOiBzdXBwb3J0IHNlcmlhbGl6YWJsZSB2ZXJzaW9uIG9mIHRoYXQgb2JqZWN0XG5leHBvcnQgaW50ZXJmYWNlIHJlbGF0aXZlTG9hZENvbmZpZyB7XG4gICAgLy9JZiB0aGlzIGlzIG51bGwsIHRoZW4gbmV3Tm9kZSBpcyBpbnNlcnRlZCBhdCB0aGUgZW5kIG9mIG5vZGUncyBjaGlsZCBub2Rlcy5cbiAgICAvL2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Ob2RlL2luc2VydEJlZm9yZVxuICAgIGNoaWxkOiBDaGlsZE5vZGUgfCBudWxsXG4gICAgZGlyZWN0aW9uOiByZWxhdGl2ZUxvYWRDb25maWdEaXJlY3Rpb25cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRW52aXJvbm1lbnQge1xuICAgIFtrZXk6IHN0cmluZ106IGFueVxufVxuXG50eXBlIEVsZW1lbnRBdHRyaWJ1dGVzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCB1bmRlZmluZWQgfCBudWxsO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBsb2FkZXJPcHRpb25zIHtcbiAgICBpZD86IHN0cmluZ1xuICAgIGhpZGRlbj86IGJvb2xlYW5cbiAgICBjb25uZWN0UHJvcHM/OiBib29sZWFuXG4gICAgdGltZW91dD86IG51bWJlclxuICAgIHNraXBJbml0PzogYm9vbGVhblxuICAgIHJlbGF0aXZlPzogcmVsYXRpdmVMb2FkQ29uZmlnXG4gICAgaG9va3M/OiBsb2FkZXJIb29rc1xuICAgIGVsZW1lbnRBdHRyaWJ1dGVzPzogRWxlbWVudEF0dHJpYnV0ZXNcbiAgICBfZW52aXJvbm1lbnQ/OiBJRW52aXJvbm1lbnRcbiAgICBfaGFzUGFyZW50PzogYm9vbGVhblxuICAgIF9pbnNwZWN0aW9uPzogYm9vbGVhblxuICAgIGRhdGE/OiBhbnlcbiAgICAvKipcbiAgICAgKiBSYXcgQ1NTIGluamVjdGVkIGludG8gdGhlIGNvbXBvbmVudCdzIGlmcmFtZSBgPGhlYWQ+YCBiZWZvcmUgZmlyc3QgcGFpbnQuXG4gICAgICogQXBwZW5kZWQgbGFzdCBzbyBpdCBvdmVycmlkZXMgdGhlIGNvbXBvbmVudCdzIG93biBzdHlsZXMgdmlhIGNhc2NhZGUgb3JkZXIuXG4gICAgICogVXNlZnVsIGZvciB0aGVtaW5nIHYyIChIVE1MKSBjb21wb25lbnRzIFx1MjAxNCBjb2xvcnMsIGZvbnRzLCBzcGFjaW5nLCBldGMuXG4gICAgICovXG4gICAgaW5qZWN0Q3NzPzogc3RyaW5nXG4gICAgLyoqXG4gICAgICogQ29udHJvbCBpZnJhbWUgYXV0by1zaXppbmcgYmVoYXZpb3IuXG4gICAgICogLSB0cnVlIChkZWZhdWx0KTogaWZyYW1lIGF1dG8tc2l6ZXMgdG8gY29udGVudCBoZWlnaHQsIHdpZHRoIGZpbGxzIHBhcmVudC5cbiAgICAgKiAtIGZhbHNlOiBubyBzaXppbmcgbG9naWMgcnVucy4gTm8gb2JzZXJ2ZXJzLCBubyBtZWFzdXJlbWVudHMsIG5vIHN0eWxlIGNoYW5nZXMuXG4gICAgICogICBUaGUgaWZyYW1lIHN0YXlzIGF0IHBvc2l0aW9uOmFic29sdXRlIGZpbGxpbmcgdGhlIGNvbnRhaW5lci5cbiAgICAgKiAgIFRoZSBob3N0IGlzIGZ1bGx5IHJlc3BvbnNpYmxlIGZvciBjb250YWluZXIgZGltZW5zaW9ucy5cbiAgICAgKi9cbiAgICBhdXRvU2l6ZT86IGJvb2xlYW5cblxuICAgIC8qKlxuICAgICAqIFBlci1jYWxsIHJlbmRlciBwb2xpY3kuIFRha2VzIHByZWNlZGVuY2Ugb3ZlciBob3N0U0RLLnNldFJlbmRlclBvbGljeSBcdTIwMTQgbGV0cyBhblxuICAgICAqIGFwcCByZXN0cmljdCBnbG9iYWxseSBhbmQgYWxsb3cgKG9yIGZ1cnRoZXIgcmVzdHJpY3QpIHNwZWNpZmljIGxvYWRDb21wb25lbnQgY2FsbHMuXG4gICAgICovXG4gICAgcmVuZGVyUG9saWN5PzogUmVuZGVyUG9saWN5XG5cbiAgICAvKipcbiAgICAgKiBGb3JjZSBmdWxsIGlzb2xhdGlvbiBmb3IgYW4gaW5saW5lLUhUTUwgKGxvY2FsRnJhbWUpIGNvbXBvbmVudDogc2FuZGJveGVkLFxuICAgICAqIGNyb3NzLW9yaWdpbiBpZnJhbWUgd2l0aCBubyBob3N0LWRvY3VtZW50IGFjY2Vzcy4gQSByZW5kZXIgcG9saWN5IHJldHVybmluZ1xuICAgICAqICdpc29sYXRlZElmcmFtZScgaGFzIHRoZSBzYW1lIGVmZmVjdC5cbiAgICAgKi9cbiAgICBpc29sYXRpb24/OiBib29sZWFuXG59XG5cbmlmICghd2luZG93Lm15b3ApIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd2luZG93Lm15b3AgPSB7XG4gICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fXG4gICAgfTtcbn1cblxuaWYgKCF3aW5kb3cubXlvcC5ob3N0U0RLKSB7XG4gICAgY29uc3QgX2hvc3RTREsgPSBuZXcgSG9zdFNESygpO1xuICAgIC8vVE9ETzogZW5hYmxlIGxhenkgaW5pdD9cbiAgICBfaG9zdFNESy5pbml0KCk7XG5cbiAgICBpZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93Lm15b3AgPSB7XG4gICAgICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfX1xuICAgICAgICB9O1xuICAgIH1cbiAgICB3aW5kb3cubXlvcC5ob3N0U0RLID0gX2hvc3RTREs7XG59XG5cbi8vIFRoZSBvcHQtaW4sIHJlYWNoYWJsZSB3aXRoIG5vIGltcG9ydCBhbmQgbm8gYnVpbGQgY2hhbmdlIG9uIHRoZSBob3N0IHBhZ2U6XG4vL1xuLy8gICBteW9wLmRlbGl2ZXJ5KHsgbWluaWZ5OiB0cnVlLCBjYWNoZTogdHJ1ZSB9KTsgICAvLyBsYW5lICsgdGhlIGNsaWVudCB3aW5kb3dcbi8vICAgbXlvcC5kZWxpdmVyeS5zdGF0cygpOyAgICAgICAgICAgICAgICAvLyB3aGF0IGFuc3dlcmVkLCBhbmQgaG93IG9mdGVuIGl0IGZlbGwgYmFja1xuLy8gICBteW9wLmRlbGl2ZXJ5Lm9mZigpOyAgICAgICAgICAgICAgICAgIC8vIGJhY2sgdG8gdG9kYXkncyBob3N0LCBubyByZWxvYWRcbi8vXG4vLyBBdHRhY2hlZCBoZXJlIHJhdGhlciB0aGFuIGV4cG9ydGVkIG9ubHkgYXMgYSBtb2R1bGUgZnVuY3Rpb24gYmVjYXVzZSB0aGUgaG9zdCBhcHAgdGhhdFxuLy8gb3B0cyBpbiBpcyBvZnRlbiBsb2FkaW5nIHRoZSBTREsgZnJvbSBhIHNjcmlwdCB0YWcsIHdoZXJlIGBpbXBvcnRgIGlzIG5vdCBhdmFpbGFibGUuXG5pZiAod2luZG93Lm15b3AgJiYgISh3aW5kb3cubXlvcCBhcyBhbnkpLmRlbGl2ZXJ5KSB7XG4gICAgY29uc3QgYXBpOiBhbnkgPSAob3B0cz86IHttaW5pZnk/OiBib29sZWFuOyBjYWNoZT86IGJvb2xlYW47IGZsb3c/OiBib29sZWFuOyBob3N0Pzogc3RyaW5nIHwgbnVsbH0pID0+IGRlbGl2ZXJ5KG9wdHMpO1xuICAgIGFwaS5zdGF0cyA9IGRlbGl2ZXJ5U3RhdHM7XG4gICAgYXBpLm9mZiA9IGRlbGl2ZXJ5T2ZmO1xuICAgIGFwaS5yZWZyZXNoID0gZGVsaXZlcnlSZWZyZXNoO1xuICAgICh3aW5kb3cubXlvcCBhcyBhbnkpLmRlbGl2ZXJ5ID0gYXBpO1xufVxuXG4vLyBTYW1lIHJlYXNvbjogYSB2MSBob3N0IHRoYXQgcmVuZGVyZWQgdGhlIGlmcmFtZSBvbiBpdHMgc2VydmVyIHNlZWRzIHRoZSBjb25maWcgaXQgZmV0Y2hlZFxuLy8gdGhlcmUsIGZyb20gYSBwbGFpbiA8c2NyaXB0PjogIG15b3AuaHlkcmF0ZVYxKHsgW2NvbXBvbmVudElkXTogZmxvd0pzb24gfSk7XG5pZiAod2luZG93Lm15b3AgJiYgISh3aW5kb3cubXlvcCBhcyBhbnkpLmh5ZHJhdGVWMSkge1xuICAgICh3aW5kb3cubXlvcCBhcyBhbnkpLmh5ZHJhdGVWMSA9IGh5ZHJhdGVWMUNvbXBvbmVudHM7XG59XG5cbi8vIEB0cy1pZ25vcmVcbmV4cG9ydCBjb25zdCBob3N0U0RLOiBIb3N0U0RLID0gd2luZG93Lm15b3AuaG9zdFNESztcblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnaG9zdFNESycsIGhvc3RTREspO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgICAgIG15b3A6IHtcbiAgICAgICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fOiBzdHJpbmcsXG4gICAgICAgICAgICBob3N0U0RLOiBIb3N0U0RLLFxuICAgICAgICAgICAgSWZyYW1lU0RLOiBJbnN0YW5jZVR5cGU8dHlwZW9mIElmcmFtZVNESz5cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyLCBJRWxlbWVudFJlZiwgTXlvcEVsZW1lbnRSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7RGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UsIERldGVjdE15b3BSZWZzTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPERldGVjdE15b3BSZWZzTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRGV0ZWN0TXlvcFJlZnNNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAobWVzc2FnZTogRGV0ZWN0TXlvcFJlZnNNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsbE15b3BJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYFske215b3BBdHRyaWJ1dGVzLmlkfV1gKTtcbiAgICAgICAgLy9jb25zdCBhbGxNeW9wSXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAqYCk7XG5cbiAgICAgICAgbGV0IG15b3BSZWZzOiBJRWxlbWVudFJlZltdID0gW107XG5cbiAgICAgICAgLy9sZXQgY291bnRlcnM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcblxuICAgICAgICBhbGxNeW9wSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcblxuICAgICAgICAgICAgY29uc3QgbXlvcElkID0gaXRlbS5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuICAgICAgICAgICAgaWYgKG15b3BJZCkge1xuICAgICAgICAgICAgICAgIG15b3BSZWZzLnB1c2gobmV3IE15b3BFbGVtZW50UmVmKG15b3BJZCwgaXRlbS50YWdOYW1lLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSlcbiAgICAgICAgICAgIH0gLy9lbHNlIHtcbiAgICAgICAgICAgIC8vICAgICBpZiAoIWNvdW50ZXJzW2l0ZW0udGFnTmFtZV0pIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgY291bnRlcnNbaXRlbS50YWdOYW1lXSA9IDA7XG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gICAgIGNvdW50ZXJzW2l0ZW0udGFnTmFtZV0gPSBjb3VudGVyc1tpdGVtLnRhZ05hbWVdICsgMTtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAgICAgbXlvcFJlZnMucHVzaChuZXcgWFBhdGhFbGVtZW50UmVmKGAke2l0ZW0udGFnTmFtZX0oJHtjb3VudGVyc1tpdGVtLnRhZ05hbWVdfSlgLCBpdGVtLnRhZ05hbWUsIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpKVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UobWVzc2FnZS5oYW5kbGVyVW5pcXVlSWQsIG15b3BSZWZzKSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtCaW5kQ2xpY2tNZXNzYWdlLCBDbGlja1JlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBCaW5kT25DbGlja0hhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8QmluZENsaWNrTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQmluZENsaWNrTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBCaW5kQ2xpY2tNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogKCgpID0+IHZvaWQpW10gPSBbXTtcblxuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgQ2xpY2tSZXBsYXlNZXNzYWdlKCksIGV2ZW50KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcik7XG5cbiAgICAgICAgICAgIGNvbnN0IGNsZWFuVXBUYXNrID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goY2xlYW5VcFRhc2spO1xuICAgICAgICB9KTtcblxuICAgICAgICAvL2NsZWFuIHVwXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHRhc2soKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgTXlvcE1lc3NhZ2VzIH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7Q2hhbmdlVGV4dE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dEhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8Q2hhbmdlVGV4dE1lc3NhZ2U+IHtcbiAgXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQ2hhbmdlVGV4dE1lc3NhZ2U7XG4gICAgXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IENoYW5nZVRleHRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGl0ZW0udGV4dENvbnRlbnQgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXIsIFJvb3RSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHNcIjtcblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEV4ZWN1dGVTY3JpcHRNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRXhlY3V0ZVNjcmlwdE1lc3NhZ2VcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCByZXBsaWVyID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgZGF0YSkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIEV4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3IoZXZlbnQsIHJlcGxpZXIsIG5ldyBSb290UmVmKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0FkZEV2ZW50TGlzdGVuZXJNZXNzYWdlLCBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5BZGRFdmVudExpc3RlbmVyTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKG1lc3NhZ2U6IEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlKSA9PiB7XG5cbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKG1lc3NhZ2UucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogYW55W10gPSBbXTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcblxuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy9UT0RPOiB0aGluayBhYm91dCB0aGF0IHJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZShtZXNzYWdlLmhhbmRsZXJVbmlxdWVJZCwgbWFrZVNlcmlhbGl6YWJsZShlLCBtZXNzYWdlLnNlcmlhbGl6YWJsZVNrZWxldG9uKSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcihtZXNzYWdlLnR5cGUsIGhhbmRsZXIpXG4gICAgICAgICAgICBjbGVhbnVwVGFza3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVFdmVudExpc3RlbmVyKG1lc3NhZ2UudHlwZSwgaGFuZGxlcilcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4ge1xuICAgICAgICAgICAgICAgIHRhc2soKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldEF0dHJpYnV0ZU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3Mgc2V0QXR0cmlidXRlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxTZXRBdHRyaWJ1dGVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRBdHRyaWJ1dGVNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IFNldEF0dHJpYnV0ZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5zZXRBdHRyaWJ1dGUoZXZlbnQubmFtZSwgZXZlbnQudmFsdWUpXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7SG9zdFNES30gZnJvbSBcIi4uLy4uL2hvc3QvaG9zdFNES1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UudHNcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi8uLi9ob3N0XCI7XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgY3JlYXRlUmVmID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy9UT0RPIDogdXNlIHJlZiBoZWxwZXIgaGVyZVxuICAgICAgICAgICAgY29uc3QgYWxsSXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke2V2ZW50LnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xuICAgICAgICAgICAgaWYgKGFsbEl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvc3RTREsgPSBIb3N0U0RLLkluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gYXdhaXQgaG9zdFNESy5sb2FkQ29tcG9uZW50KGV2ZW50Lm5lc3RlZENvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMuaXRlbSgwKSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQub3B0aW9ucylcblxuICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgaXQgdG8gcGFzcyB0aGUgYXNzaWduZWQgaWRzXG4gICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkUmVmQ29uZmlnOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocmVmQ29tcG9uZW50LnJlZnMpLmZvckVhY2gocmVmTmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWYgPSByZWZDb21wb25lbnQucmVmc1tyZWZOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgcmVmID0gcmVmLl9fbm9uUHJveGllZCB8fCByZWY7XG5cbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFJlZkNvbmZpZy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb25JZDogKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbmVzdGVkUmVmQ29uZmlnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIC0gRE9NIGVsZW1lbnQgbm90IGZvdW5kJylcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgW10sIHRydWUpKTtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNyZWF0ZVJlZigpLnRoZW4oKTtcbiAgICAgICAgLy9yZXR1cm5pbmcgdW5kZWZpbmVkIHNvIGl0IHdvbid0IGFjdCBhcyBhIGNsZWFudXBcbiAgICB9XG59XG4iLCAiLy8gQHRzLW5vY2hlY2tcbmV4cG9ydCBjb25zdCBvYnNlcnZlRE9NID0gKG9iajogSFRNTEVsZW1lbnQgfCBudWxsLCBjYWxsYmFjazogKG11dGF0aW9uUmVjb3Jkcz86IE11dGF0aW9uUmVjb3JkW10pID0+IHZvaWQpID0+IHtcbiAgICBpZiAoIW9iaikge1xuICAgICAgICBjb25zb2xlLmxvZygnbicpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBNdXRhdGlvbk9ic2VydmVyID0gd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIgfHwgd2luZG93LldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG5cbiAgICBpZiAoIW9iaiB8fCBvYmoubm9kZVR5cGUgIT09IDEpIHJldHVybjtcblxuICAgIGlmIChNdXRhdGlvbk9ic2VydmVyKSB7XG4gICAgICAgIC8vIGRlZmluZSBhIG5ldyBvYnNlcnZlclxuICAgICAgICBjb25zdCBtdXRhdGlvbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spXG4gICAgICAgIC8vIGhhdmUgdGhlIG9ic2VydmVyIG9ic2VydmUgZm9yIGNoYW5nZXMgaW4gY2hpbGRyZW5cbiAgICAgICAgY29uc3QgY29uZmlnID0ge2F0dHJpYnV0ZXM6IHRydWUsIGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZX07XG4gICAgICAgIG11dGF0aW9uT2JzZXJ2ZXIub2JzZXJ2ZShvYmosIGNvbmZpZylcbiAgICAgICAgcmV0dXJuIG11dGF0aW9uT2JzZXJ2ZXJcbiAgICB9XG5cbiAgICAvLyBicm93c2VyIHN1cHBvcnQgZmFsbGJhY2tcbiAgICBlbHNlIGlmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcignRE9NTm9kZUluc2VydGVkJywgY2FsbGJhY2ssIGZhbHNlKVxuICAgICAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcignRE9NTm9kZVJlbW92ZWQnLCBjYWxsYmFjaywgZmFsc2UpXG4gICAgfVxufSIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge29ic2VydmVET019IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvZG9tT2JzZXJ2ZXJcIjtcblxuZXhwb3J0IGNsYXNzIFNldE11dGF0aW9uT2JzZXJ2ZXJIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEV4ZWN1dGVTY3JpcHRNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2VcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQuc291cmNlKSB7XG4gICAgICAgICAgICBvYnNlcnZlRE9NKGRvY3VtZW50LmJvZHksICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlKClcbiAgICAgICAgICAgICAgICAgICAgLy8gIG5ldyBFbnZlbG9wZWRNZXNzYWdlKGV2ZW50LnNvdXJjZSEsIG5ldyBNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSgpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlLCBGb3JtRGF0YUVudHJ5LCBHZXRFbGVtZW50VmFsdWVNZXNzYWdlLCBJbnB1dEVsZW1lbnRWYWx1ZSx9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5jb25zdCBnZXRJbnB1dFZhbHVlID0gKGVsZW1lbnQpOiBJbnB1dEVsZW1lbnRWYWx1ZSA9PiB7XG4gICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBmb3JtXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0ZPUk0nKSB7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBkYXRhT2JqZWN0OiBJbnB1dEVsZW1lbnRWYWx1ZSA9IHtcbiAgICAgICAgICAgIGZvcm1EYXRhOiB7fSxcbiAgICAgICAgICAgIHVubWFwcGVkRGF0YTogW11cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBNYW51YWxseSBhZGQgZWxlbWVudHMgd2l0aG91dCBuYW1lc1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEnKTtcbiAgICAgICAgbGV0IGF1dG9OYW1lSW5kZXhlciA9IC0xO1xuXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXlvcElkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnbmFtZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gYF8keygrK2F1dG9OYW1lSW5kZXhlcil9YFxuXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZURhdGE6IEZvcm1EYXRhRW50cnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBnZXRJbnB1dFZhbHVlKGVsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZWxlbWVudC5yZXF1aXJlZCxcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRpdHk6IG1ha2VTZXJpYWxpemFibGUoZWxlbWVudC52YWxpZGl0eSwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgIG15b3BJZCxcbiAgICAgICAgICAgICAgICB9O1xuXG5cbiAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgICAgICAgICBpZighZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSB8fCAhZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XS52YWx1ZSB8fCBub2RlRGF0YS52YWx1ZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIGlmICgha2V5KSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pO1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkYXRhT2JqZWN0O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBjaGVja2JveCBvciByYWRpbyBidXR0b25cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsZW1lbnQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5jaGVja2VkID8gZWxlbWVudC52YWx1ZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGlucHV0IGFuZCB0ZXh0YXJlYSBlbGVtZW50c1xuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdJTlBVVCcgfHwgZWxlbWVudC50YWdOYW1lID09PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzZWxlY3QgZWxlbWVudHMgKGRyb3Bkb3ducylcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnU0VMRUNUJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZWRpdGFibGUgZGl2cyAoY29udGVudEVkaXRhYmxlKVxuICAgIGlmIChlbGVtZW50LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmlubmVyVGV4dCB8fCBlbGVtZW50LnRleHRDb250ZW50O1xuICAgIH1cblxuICAgIC8vIElmIGl0J3MgYW4gdW5zdXBwb3J0ZWQgZWxlbWVudCB0eXBlXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogR2V0RWxlbWVudFZhbHVlTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgZ2V0SW5wdXRWYWx1ZShpdGVtKVxuICAgICAgICAgICAgKSwgZXZlbnQpO1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0dldEF0dHJpYnV0ZU1lc3NhZ2UsIEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRGaXJzdEVsZW1lbnRCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgR2V0QXR0cmlidXRlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxHZXRBdHRyaWJ1dGVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5HZXRBdHRyaWJ1dGVNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEdldEF0dHJpYnV0ZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbSA9IGdldEZpcnN0RWxlbWVudEJ5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpXG4gICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UoaXRlbS5nZXRBdHRyaWJ1dGUoZXZlbnQubmFtZSkpLCBldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtSZXNpemVPYnNlcnZlck1lc3NhZ2UsIFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZX0gZnJvbSAnLi4vLi4vbWVzc2FnZXMnXG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRSZXNpemVPYnNlcnZlckhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8U2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlXG5cbiAgICBleGVjdXRvciA9IChldmVudDogU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7XG4gICAgICAgICAgICAvL1RPRE8gOiBwYXNzIHRoZSBoZWlnaHRcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgUmVzaXplT2JzZXJ2ZXJNZXNzYWdlKCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5KTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldElubmVySHRtbH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRJbm5lckh0bWxIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFNldElubmVySHRtbD4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0SW5uZXJIdG1sO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IFNldElubmVySHRtbCkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpdGVtLmlubmVySFRNTCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBUaGUgSWZyYW1lIFNESyBpcyBpbnRlbmRlZCBmb3Igc2NlbmFyaW9zIHdoZXJlIGRldmVsb3BlcnMgd2lzaCB0byBpbXBsZW1lbnQgTXlvcCBjb21wb25lbnRzIGFzIHNlcGFyYXRlIHdlYiBhcHBsaWNhdGlvbnMgaG9zdGVkIHdpdGhpbiBpZnJhbWVzLjxici8+PGJyLz5cbiAqIEJ5IGltcG9ydGluZyB0aGUgSWZyYW1lIFNESywgZGV2ZWxvcGVycyBnYWluIGFjY2VzcyB0byB0b29scyBhbmQgdXRpbGl0aWVzIG5lY2Vzc2FyeSBmb3IgaGFuZGxpbmcgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBob3N0IGFwcGxpY2F0aW9uIGFuZCB0aGUgZW1iZWRkZWQgaWZyYW1lLWJhc2VkIE15b3AgY29tcG9uZW50czxici8+PGJyLz5cbiAqIFRoaXMgU0RLIGZhY2lsaXRhdGVzIHNlY3VyZSBpc29sYXRpb24sIGFsbG93aW5nIGNvbXBvbmVudHMgdG8gZnVuY3Rpb24gaW5kZXBlbmRlbnRseSB3aGlsZSBzdGlsbCBiZW5lZml0aW5nIGZyb20gdGhlIG92ZXJhbGwgc3RydWN0dXJlIGFuZCBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcyBwcm92aWRlZCBieSB0aGUgaG9zdCBhcHBsaWNhdGlvbi48YnIvPjxici8+XG4gKlxuIE9uY2UgbG9hZGVkIHRoZSBgUm9vdFNES2AsIHlvdSBjYW4gbG9hZCB0aGUgYElmcmFtZVNES2BcbiBgYGBqc1xuIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0SWZyYW1lTW9kdWxlKCkpO1xuIGBgYFxuIG9yXG4gYGBgdHNcbiBpbXBvcnQge2dldElmcmFtZU1vZHVsZX0gZnJvbSAnQG15b3Avc2RrJztcbiBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCBnZXRJZnJhbWVNb2R1bGUoKSk7XG4gYGBgXG4gb3JcbiBgYGB0c1xuIGltcG9ydCB7SWZyYW1lU0RLfSBmcm9tICdAbXlvcC9zZGsvaWZyYW1lJztcbiBgYGBcbiAqXG4gKi9cbmltcG9ydCB7QmFzZU15b3BTREt9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7QmluZE9uQ2xpY2tIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvYmluZE9uQ2xpY2tIYW5kbGVyXCI7XG5pbXBvcnQge0NoYW5nZVRleHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvY2hhbmdlVGV4dEhhbmRsZXJcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlclwiO1xuaW1wb3J0IHtkZWZpbmVEeW5hbWljSW1wb3J0fSBmcm9tIFwiLi4vZHluYW1pY0ltcG9ydC9kZWZpbmVEeW5hbWljSW1wb3J0XCI7XG5pbXBvcnQge0FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXJcIjtcbmltcG9ydCB7c2V0QXR0cmlidXRlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldEF0dHJpYnV0ZUhhbmRsZXJcIjtcbmltcG9ydCB7XG4gICAgSW5pdFJlcXVlc3QsXG4gICAgTWVzc2FnZURpcmVjdGlvbixcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1NldE11dGF0aW9uT2JzZXJ2ZXJIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvU2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXJcIjtcbmltcG9ydCB7R2V0RWxlbWVudFZhbHVlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHNcIjtcbi8vIEB0cy1pZ25vcmUgaGFuZGxlZCBieSBjdXN0b20gZXNidWlsZCBwbHVnaW5cbmltcG9ydCB2ZXJzaW9uIGZyb20gXCJteW9wLXNkay12ZXJzaW9uXCI7XG5pbXBvcnQge0dldEF0dHJpYnV0ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9nZXRBdHRyaWJ1dGVIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NldFJlc2l6ZU9ic2VydmVySGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL1NldFJlc2l6ZU9ic2VydmVySGFuZGxlci50c1wiO1xuaW1wb3J0IHtTZXRJbm5lckh0bWxIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvc2V0SW5uZXJIdG1sSGFuZGxlci50c1wiO1xuXG4vKipcbiBUaGUgSWZyYW1lIFNESyBpcyBpbnRlbmRlZCBmb3Igc2NlbmFyaW9zIHdoZXJlIGRldmVsb3BlcnMgd2lzaCB0byBpbXBsZW1lbnQgTXlvcCBjb21wb25lbnRzIGFzIHNlcGFyYXRlIHdlYiBhcHBsaWNhdGlvbnMgaG9zdGVkIHdpdGhpbiBpZnJhbWVzLjxici8+PGJyLz5cbiBCeSBpbXBvcnRpbmcgdGhlIElmcmFtZSBTREssIGRldmVsb3BlcnMgZ2FpbiBhY2Nlc3MgdG8gdG9vbHMgYW5kIHV0aWxpdGllcyBuZWNlc3NhcnkgZm9yIGhhbmRsaW5nIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgaG9zdCBhcHBsaWNhdGlvbiBhbmQgdGhlIGVtYmVkZGVkIGlmcmFtZS1iYXNlZCBNeW9wIGNvbXBvbmVudHM8YnIvPjxici8+XG4gVGhpcyBTREsgZmFjaWxpdGF0ZXMgc2VjdXJlIGlzb2xhdGlvbiwgYWxsb3dpbmcgY29tcG9uZW50cyB0byBmdW5jdGlvbiBpbmRlcGVuZGVudGx5IHdoaWxlIHN0aWxsIGJlbmVmaXRpbmcgZnJvbSB0aGUgb3ZlcmFsbCBzdHJ1Y3R1cmUgYW5kIG1hbmFnZW1lbnQgY2FwYWJpbGl0aWVzIHByb3ZpZGVkIGJ5IHRoZSBob3N0IGFwcGxpY2F0aW9uLjxici8+PGJyLz5cblxuIE9uY2UgbG9hZGVkIHRoZSBgUm9vdFNES2AsIHlvdSBjYW4gbG9hZCB0aGUgYElmcmFtZVNES2BcbiBgYGBqc1xuIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0SWZyYW1lTW9kdWxlKCkpO1xuIGBgYFxuIG9yXG4gYGBgdHNcbiBpbXBvcnQge2dldElmcmFtZU1vZHVsZX0gZnJvbSAnQG15b3Avc2RrJztcbiBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCBnZXRJZnJhbWVNb2R1bGUoKSk7XG4gYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBJZnJhbWVTREsgZXh0ZW5kcyBCYXNlTXlvcFNESyB7XG5cbiAgICBwdWJsaWMgdmVyc2lvbiA9IHZlcnNpb247XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB3aW5kb3cubXlvcCA9IHt9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB3aW5kb3cubXlvcC5JZnJhbWVTREsgPSB0aGlzO1xuICAgIH1cblxuICAgIG1lc3NhZ2VUb0hvc3QgPSAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4ge1xuICAgICAgICBpZiAoIW1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyICYmIHJlcGxheVRvPy5oYW5kbGVyVW5pcXVlSWQpXG4gICAgICAgICAgICBtZXNzYWdlLnJlcGxheVRvSGFuZGxlciA9IHJlcGxheVRvLmhhbmRsZXJVbmlxdWVJZFxuXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudElkcyA9IE9iamVjdC5rZXlzKHRoaXMuY29tcG9uZW50cyk7XG5cbiAgICAgICAgaWYgKCFtZXNzYWdlLmRlc3RpbmF0aW9uKSB7XG4gICAgICAgICAgICBpZiAocmVwbGF5VG8/LnJvdXRlKSB7XG4gICAgICAgICAgICAgICAgLy8gdGFraW5nIHRoZSBmaXJzdCBjb21wb25lbnQgdGhhdCBpbml0aWF0ZWQgdGhhdCBjeWNsZVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSByZXBsYXlUby5yb3V0ZVtyZXBsYXlUby5yb3V0ZS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IGNvbXBvbmVudElkc1swXVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghbWVzc2FnZS5zb3VyY2UpXG4gICAgICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IGNvbXBvbmVudElkc1swXTtcblxuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24udXA7XG5cbiAgICAgICAgLy8gYGhvc3RXaW5kb3dgLCBub3QgYHdpbmRvdy5wYXJlbnRgIC0tIHNlZSB0aGUgZmllbGQncyBjb21tZW50LiBGb3IgYSBjb21wb25lbnRcbiAgICAgICAgLy8gbW91bnRlZCBpbnRvIGFub3RoZXIgY29tcG9uZW50J3MgZG9jdW1lbnQgdGhlIHBhcmVudCBpcyBhbiBpbnRlcm1lZGlhdGUgZnJhbWVcbiAgICAgICAgLy8gdGhhdCBkcm9wcyBjaGlsZCBtZXNzYWdlcywgc28gYW4gSW5pdFJlc3BvbnNlIHNlbnQgdGhlcmUgbmV2ZXIgcmVhY2hlcyB0aGUgaG9zdFxuICAgICAgICAvLyBhbmQgdGhlIGNvbXBvbmVudCBzdGF5cyBwZW5kaW5nIHVudGlsIGl0IHRpbWVzIG91dC5cbiAgICAgICAgKHRoaXMuaG9zdFdpbmRvdyA/PyB3aW5kb3cucGFyZW50KT8ucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgLi4ubWVzc2FnZVxuICAgICAgICB9LCAnKicpO1xuICAgIH1cblxuICAgIHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlTWVzc2FnZUhhbmRsZXJbXSA9IFtcbiAgICAgICAgbmV3IENoYW5nZVRleHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBTZXRJbm5lckh0bWxIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBCaW5kT25DbGlja0hhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IERldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IEV4ZWN1dGVTY3JpcHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBBZGRFdmVudExpc3RlbmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgc2V0QXR0cmlidXRlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgR2V0RWxlbWVudFZhbHVlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgU2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IFNldFJlc2l6ZU9ic2VydmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgR2V0QXR0cmlidXRlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuXG4gICAgICAgIC8vY29tcG9zaXRlIHN1cHBvcnQgbWVzc2FnZXMgOlxuICAgICAgICBuZXcgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KVxuICAgIF07XG5cbiAgICAvKipcbiAgICAgKiBUaGUgd2luZG93IHRoaXMgZnJhbWUgYW5zd2VycyB0by4gRGVmYXVsdHMgdG8gdGhlIHBhcmVudCwgd2hpY2ggaXMgY29ycmVjdCBmb3IgYVxuICAgICAqIGNvbXBvbmVudCBtb3VudGVkIGRpcmVjdGx5IGJ5IHRoZSBwYWdlJ3Mgb3duIGhvc3QuXG4gICAgICpcbiAgICAgKiBJVCBJUyBOT1QgQUxXQVlTIFRIRSBQQVJFTlQuIEEgaG9zdCBjYW4gbW91bnQgYSBjb21wb25lbnQgaW50byBhIGNvbnRhaW5lciB0aGF0XG4gICAgICogbGl2ZXMgaW5zaWRlIEFOT1RIRVIgY29tcG9uZW50J3MgZG9jdW1lbnQgLS0gUGljLVRpbWUncyByZWVsIHRlbXBsYXRlcyBhcmUgbW91bnRlZFxuICAgICAqIGJ5IHRoZSB0b3AtbGV2ZWwgaG9zdCBpbnRvIGAjcmVlbFNsb3RgIGluc2lkZSB0aGUgcmVlbCBkaWFsb2cncyBmcmFtZS4gVGhlIHJlYWwgaG9zdFxuICAgICAqIGlzIHRoZW4gYSBHUkFORHBhcmVudCwgYW5kIGB3aW5kb3cucGFyZW50YCBpcyBhIGZyYW1lIHRoYXQga25vd3Mgbm90aGluZyBhYm91dCB0aGlzXG4gICAgICogY29tcG9uZW50OiBpdHMgbmVzdGVkIGhvc3RTREsgaGFzIG5vIGVudHJ5IGZvciBpdCBhbmQgaXRzIElmcmFtZVNESyBkcm9wcyBtZXNzYWdlc1xuICAgICAqIGZyb20gYSBjaGlsZC4gUmVwbGllcyBzZW50IHRvIHRoZSBwYXJlbnQgYXJlIHNpbXBseSBsb3N0LlxuICAgICAqXG4gICAgICogU28gd2UgYWRvcHQgd2hvZXZlciBhY3R1YWxseSB0YWxrcyB0byB1cywgdGhlIGZpcnN0IHRpbWUgYW4gYW5jZXN0b3IgZG9lcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGhvc3RXaW5kb3c6IFdpbmRvdyB8IG51bGwgPSB3aW5kb3cucGFyZW50O1xuXG4gICAgLyoqXG4gICAgICogQ29tbWFuZHMgKGluY2x1ZGluZyBFeGVjdXRlU2NyaXB0KSBtdXN0IGNvbWUgZnJvbSBhIHdpbmRvdyB0aGlzIGZyYW1lIGlzIGFjdHVhbGx5XG4gICAgICogbmVzdGVkIGluc2lkZSAtLSBuZXZlciBmcm9tIGFuIG9wZW5lciBvciBhIHNpYmxpbmcgdGhhdCBtZXJlbHkgaG9sZHMgYSByZWZlcmVuY2UuXG4gICAgICpcbiAgICAgKiBUSElTIFVTRUQgVE8gQ09NUEFSRSBBR0FJTlNUIGB3aW5kb3cucGFyZW50YCBBTE9ORSwgYW5kIHRoYXQgd2FzIGEgcmVncmVzc2lvbiBJXG4gICAgICogc2hpcHBlZCBpbiAwLjQuMC1iZXRhOiBpdCBzaWxlbnRseSBkcm9wcGVkIHRoZSBob3N0J3MgSW5pdE1lc3NhZ2UgZm9yIGFueSBjb21wb25lbnRcbiAgICAgKiBtb3VudGVkIGNyb3NzLWRvY3VtZW50LCBiZWNhdXNlIHRoZSBob3N0IGlzIGEgZ3JhbmRwYXJlbnQgdGhlcmUuIFRoZSBmcmFtZSB0aGVuXG4gICAgICogYW5ub3VuY2VkIGZvciBpdHMgZnVsbCAxMHMgYnVkZ2V0IGludG8gYSBwYXJlbnQgdGhhdCBuZXZlciBhbnN3ZXJzIGFuZCByZWplY3RlZCB3aXRoXG4gICAgICogdGltZW91dF8xMDAwMCBoYXZpbmcgcmVnaXN0ZXJlZCBub3RoaW5nLiBSZXByb2R1Y2VkIGxpdmUgb24gUGljLVRpbWUncyBRQSBwYWdlXG4gICAgICogMjAyNi0xMC0xNzogMTUgSW5pdFJlcXVlc3RzLCAwIEluaXRSZXNwb25zZXMsIGBJZnJhbWVTREsuY29tcG9uZW50c2AgZW1wdHkuXG4gICAgICogMC4zLjM2IGhhZCBubyBndWFyZCBhdCBhbGwsIHdoaWNoIGlzIHdoeSBpdCB3b3JrZWQuXG4gICAgICpcbiAgICAgKiBXYWxraW5nIHRoZSBhbmNlc3RvciBjaGFpbiBrZWVwcyB0aGUgc2VjdXJpdHkgcHJvcGVydHkgLS0gYW4gb3BlbmVyIG9yIGEgc2libGluZyBpc1xuICAgICAqIG5vdCBhbiBhbmNlc3RvciAtLSB3aGlsZSBhbGxvd2luZyBhIGhvc3QgYW55IG51bWJlciBvZiBmcmFtZXMgdXAuIFRoZSB3YWxrIGlzXG4gICAgICogYm91bmRlZCwgYW5kIHJlYWRpbmcgYC5wYXJlbnRgIGFjcm9zcyBvcmlnaW5zIGlzIGFsbG93ZWQgKG9ubHkgdGhlIHJlZmVyZW5jZSBpc1xuICAgICAqIGNvbXBhcmVkLCBuZXZlciB0b3VjaGVkKS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlzRnJvbUhvc3RDaGFpbiA9IChzb3VyY2U6IE1lc3NhZ2VFdmVudFNvdXJjZSB8IG51bGwpOiBib29sZWFuID0+IHtcbiAgICAgICAgaWYgKCFzb3VyY2UpIHJldHVybiB0cnVlOyAgICAgICAgICAgICAvLyBzeW50aGV0aWMgZGlzcGF0Y2ggY2FycmllcyBubyBzb3VyY2VcbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gd2luZG93KSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICBsZXQgY3VycmVudDogV2luZG93ID0gd2luZG93O1xuICAgICAgICBmb3IgKGxldCBkZXB0aCA9IDA7IGRlcHRoIDwgMzI7IGRlcHRoKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IGN1cnJlbnQucGFyZW50O1xuICAgICAgICAgICAgaWYgKCFwYXJlbnQgfHwgcGFyZW50ID09PSBjdXJyZW50KSByZXR1cm4gZmFsc2U7ICAgLy8gcmVhY2hlZCB0aGUgdG9wXG4gICAgICAgICAgICBpZiAoc291cmNlID09PSBwYXJlbnQpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgY3VycmVudCA9IHBhcmVudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGluaXQgPSAoKSA9PiB7XG4gICAgICAgIHdpbmRvdy5vbm1lc3NhZ2UgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzRnJvbUhvc3RDaGFpbihldmVudC5zb3VyY2UpKSByZXR1cm47XG5cbiAgICAgICAgICAgIC8vIEFET1BUIE9OTFkgT04gSW5pdE1lc3NhZ2UsIE5PVCBPTiBBTlkgQU5DRVNUT1IgTUVTU0FHRS5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBJbml0TWVzc2FnZSBpcyB0aGUgb25lIG1lc3NhZ2UgdGhhdCBlc3RhYmxpc2hlcyB3aG8gb3ducyB0aGlzIGNvbXBvbmVudCwgc29cbiAgICAgICAgICAgIC8vIGl0IGlzIHRoZSBvbmx5IHNhZmUgc2lnbmFsLiBBZG9wdGluZyBvbiBhbnkgYWNjZXB0ZWQgbWVzc2FnZSBsZXQgYW5cbiAgICAgICAgICAgIC8vIGludGVybWVkaWF0ZSBhbmNlc3RvciAtLSB0aGUgcmVlbCBkaWFsb2csIHdoaWNoIGlzIGl0c2VsZiBhIGNvbXBvbmVudCBhbmRcbiAgICAgICAgICAgIC8vIG1heSBsZWdpdGltYXRlbHkgcG9zdCB0byBpdHMgb3duIHN1YnRyZWUgLS0gYmVjb21lIGBob3N0V2luZG93YCBhbmQgc2lsZW50bHlcbiAgICAgICAgICAgIC8vIHRha2Ugb3ZlciB0aGUgcmVwbHkgY2hhbm5lbCwgcHV0dGluZyB1cyBiYWNrIHRvIEluaXRSZXNwb25zZXMgZ29pbmcgdG8gYVxuICAgICAgICAgICAgLy8gZnJhbWUgdGhhdCBkcm9wcyB0aGVtLlxuICAgICAgICAgICAgaWYgKGV2ZW50LnNvdXJjZVxuICAgICAgICAgICAgICAgICYmIGV2ZW50LnNvdXJjZSAhPT0gd2luZG93XG4gICAgICAgICAgICAgICAgJiYgZXZlbnQuZGF0YT8ubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbml0TWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaG9zdFdpbmRvdyA9IGV2ZW50LnNvdXJjZSBhcyBXaW5kb3c7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaGFuZGxlSW5jb21lTWVzc2FnZXMoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgSW5pdFJlcXVlc3QoKSk7XG4gICAgfVxuXG59XG5cbmRlZmluZUR5bmFtaWNJbXBvcnQoJ0lmcmFtZVNESycsIElmcmFtZVNESyk7XG4iLCAiaW1wb3J0ICogYXMgYWxsIGZyb20gJy4vaW5kZXgnXG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcblxuY29uc3QgTXlvcE1lc3NhZ2VzID0ge1xuICAgIC4uLmFsbFxufVxuXG5kZWZpbmVEeW5hbWljSW1wb3J0KCdNeW9wTWVzc2FnZXMnLCBNeW9wTWVzc2FnZXMpO1xuIiwgImltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydC50c1wiO1xuaW1wb3J0ICogYXMgTXlvcEhlbHBlcnMgZnJvbSBcIi4vaW5kZXgudHNcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vaW5kZXgudHNcIjtcblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnTXlvcEhlbHBlcnMnLCBNeW9wSGVscGVycyk7XG4iLCAiaW1wb3J0ICcuL2R5bmFtaWNJbXBvcnQvbG9hZF9fZmVkZXJhdGlvbl9fJztcbi8vIEB0cy1pZ25vcmUgaGFuZGxlZCBieSBjdXN0b20gZXNidWlsZCBwbHVnaW5cbmltcG9ydCB2ZXJzaW9uIGZyb20gXCJteW9wLXNkay12ZXJzaW9uXCI7XG5cbmNvbnNvbGUubG9nKCdteW9wIHJvb3Qgc2RrIC0gbG9hZGVkJywgZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luKTtcblxuLy8gVE9ETyA6IHJlYWQgdmFsdWUgZnJvbSB3aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ10gP1xuLy9jb25zdCBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXyA9ICdodHRwczovL2RmZGxrMnAxbTE4N3YuY2xvdWRmcm9udC5uZXQvbXlvcF9zZGsubWluLmpzJ1xuY29uc3QgX19ST09UX1NES19QVUJMSUNfVVJMX18gPSAnaHR0cHM6Ly9jZG4ubXlvcC5kZXYvc2RrL25leHQvbXlvcF9zZGsubWluLmpzJ1xuXG5jb25zdCBnZXRIb3N0TW9kdWxlID0gKCkgPT4gaW1wb3J0KCcuL2hvc3QvaG9zdFNESycpXG5jb25zdCBnZXRJZnJhbWVNb2R1bGUgPSAoKSA9PiBpbXBvcnQoJy4vSWZyYW1lL0lmcmFtZVNESycpXG5jb25zdCBnZXRXZWJjb21wb25lbnRNb2R1bGUgPSAoKSA9PiBpbXBvcnQoJy4vd2ViY29tcG9uZW50L1dlYkNvbXBvbmVudFNESycpXG5jb25zdCBnZXRNeW9wTWVzc2FnZXMgPSAoKSA9PiBpbXBvcnQoJy4vbWVzc2FnZXMvTXlvcE1lc3NhZ2VzJylcbmNvbnN0IGdldE15b3BIZWxwZXJzID0gKCkgPT4gaW1wb3J0KCcuL2hlbHBlcnMvTXlvcEhlbHBlcnMnKVxuXG4vLyBUaGUgc3BsaXQgYnVpbGQgKGRpc3QvY2pzKSByZXNvbHZlcyBlYWNoIGltcG9ydCB0byBhIGZlZGVyYXRpb24gc3R1YiB3aG9zZSBgZ2V0KClgIGxvYWRzIHRoZVxuLy8gY2h1bmsuIFRoZSBzaW5nbGUtZmlsZSBidWlsZCAoZGlzdC9janMtYnVuZGxlZCkgaW5saW5lcyB0aGUgcmVhbCBtb2R1bGUsIHdoaWNoIGhhcyBubyBgZ2V0YC5cbmNvbnN0IGV4cG9zZUdsb2JhbGx5ID0gKGltcG9ydEZ1bmN0aW9uOiAoKSA9PiBQcm9taXNlPGFueT4pID0+IHtcbiAgICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnRGdW5jdGlvbigpO1xuICAgICAgICByZXR1cm4gdHlwZW9mIG1vZC5nZXQgPT09ICdmdW5jdGlvbicgPyBtb2QuZ2V0KCkgOiBtb2Q7XG4gICAgfVxufVxuXG4vLyBGb3Igc2NyaXB0L2dsb2JhbCB1c2FnZSA6XG5jb25zdCByb290U0RLID0ge1xuICAgIHZlcnNpb24gOiB2ZXJzaW9uLFxuICAgIGdldEhvc3RNb2R1bGU6IGV4cG9zZUdsb2JhbGx5KGdldEhvc3RNb2R1bGUpLFxuICAgIGdldElmcmFtZU1vZHVsZTogZXhwb3NlR2xvYmFsbHkoZ2V0SWZyYW1lTW9kdWxlKSxcbiAgICBnZXRXZWJjb21wb25lbnRNb2R1bGU6IGV4cG9zZUdsb2JhbGx5KGdldFdlYmNvbXBvbmVudE1vZHVsZSksXG4gICAgZ2V0TXlvcE1lc3NhZ2VzOiBleHBvc2VHbG9iYWxseShnZXRNeW9wTWVzc2FnZXMpLFxuICAgIGdldE15b3BIZWxwZXJzOiBleHBvc2VHbG9iYWxseShnZXRNeW9wSGVscGVycylcbn07XG5cbi8vIEB0cy1pZ25vcmVcbmlmICghd2luZG93Lm15b3ApIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd2luZG93Lm15b3AgPSB7XG4gICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fXG4gICAgfVxufVxuXG4vLyBAdHMtaWdub3JlXG5pZiAoIXdpbmRvdy5teW9wLnJvb3RTREspIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd2luZG93Lm15b3AgPSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcm9vdFNESyxcbiAgICAgICAgLi4ud2luZG93Lm15b3BcbiAgICB9O1xufSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyhcIm15b3Agcm9vdCBob3N0IGxvYWRlZCBtb3JlIHRoYW4gb25jZS5cIik7XG59XG5cbi8vIEZvciBidW5kbGVycyB1c2FnZSA6XG5jb25zdCBzZGtNb2R1bGUgPSB7XG4gICAgZ2V0SG9zdE1vZHVsZSxcbiAgICBnZXRJZnJhbWVNb2R1bGUsXG4gICAgZ2V0V2ViY29tcG9uZW50TW9kdWxlLFxuICAgIGdldE15b3BNZXNzYWdlcyxcbiAgICBnZXRNeW9wSGVscGVyc1xufVxuZXhwb3J0IHR5cGUgcm9vdFNES1R5cGUgPSB0eXBlb2Ygc2RrTW9kdWxlO1xuXG5leHBvcnQge1xuICAgIGdldEhvc3RNb2R1bGUsXG4gICAgZ2V0SWZyYW1lTW9kdWxlLFxuICAgIGdldFdlYmNvbXBvbmVudE1vZHVsZSxcbiAgICBnZXRNeW9wTWVzc2FnZXMsXG4gICAgZ2V0TXlvcEhlbHBlcnNcbn1cblxuLy8gZGVjbGFyZSBnbG9iYWwge1xuLy8gICAgIGludGVyZmFjZSBXaW5kb3cge1xuLy8gICAgICAgICBteW9wOiB7XG4vLyAgICAgICAgICAgICByb290U0RLOiB0eXBlb2Ygcm9vdFNES1xuLy8gICAgICAgICB9XG4vLyAgICAgfVxuLy8gfVxuIiwgIi8vIEB0cy1ub2NoZWNrXG5pbXBvcnQge21vZHVsZUluc3RhbmNlS2V5LCBvbkxvYWRLZXl9IGZyb20gXCIuL2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcblxuaWYgKCF3aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ10pIHtcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCBzY3JpcHRTcmMgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0Py5zcmM7XG4gICAgY29uc3QgX19wdWJsaWNfYXV0b19wYXRoX18gPSBzY3JpcHRTcmMgPyBzY3JpcHRTcmMuc3BsaXQoJy8nKS5zbGljZSgwLCAtMSkuam9pbignLycpIDogJyc7XG5cbiAgICB3aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ10gPSB7XG4gICAgICAgIF9fcHVibGljX2F1dG9fcGF0aF9fLFxuICAgICAgICBfX3VzZV9wdWJsaWNfYXV0b19wYXRoX186IHRydWUsXG4gICAgICAgIF9fcHVibGljX3BhdGhfXzogdW5kZWZpbmVkLFxuICAgICAgICBfX2xvYWRpbmdfdGltZW91dF9fIDogNSAqIDEwMDBcbiAgICB9O1xufSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZygnX19mZWRlcmF0aW9uX18gbG9hZGVkIG1vcmUgdGhhbiBvbmNlLicpO1xufVxuXG53aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ11bJ2xvYWRfX2ZlZGVyYXRpb25fXyddID0gKHNjcmlwdEZpbGVQYXRoLCBtb2R1bGVOYW1lLCBvbkxvYWQpID0+IHtcblxuICAgIGlmICghd2luZG93WydfX2ZlZGVyYXRpb25fXyddW21vZHVsZU5hbWVdKSB7XG4gICAgICAgIGxldCBzY3JpcHRUYWc7XG5cbiAgICAgICAgLy8gQ2FsbGVycyB0aGF0IGFycml2ZSB3aGlsZSB0aGUgY2h1bmsgaXMgc3RpbGwgbG9hZGluZyB3YWl0IGhlcmUuIFdpdGhvdXQgdGhpcyBxdWV1ZSBhXG4gICAgICAgIC8vIHNlY29uZCBjb25jdXJyZW50IGdldFhNb2R1bGUoKSByZXNvbHZlZCB3aXRoIGB1bmRlZmluZWRgICh0aGUgaW5zdGFuY2UgaXMgbm90IHNldCB5ZXQpLlxuICAgICAgICBjb25zdCBwZW5kaW5nID0gW29uTG9hZF07XG5cbiAgICAgICAgd2luZG93WydfX2ZlZGVyYXRpb25fXyddW21vZHVsZU5hbWVdID0ge3BlbmRpbmd9O1xuICAgICAgICB3aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ11bbW9kdWxlTmFtZV1bb25Mb2FkS2V5XSA9IChtb2R1bGUpID0+IHtcbiAgICAgICAgICAgIGlmIChzY3JpcHRUYWcpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5oZWFkLnJlbW92ZUNoaWxkKHNjcmlwdFRhZyk7XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY2hlY2sgdGhhdDpcbiAgICAgICAgICAgICAgICBzY3JpcHRUYWcgPSBudWxsO1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdzY3JpcHQgcmVtb3ZlZC4uLiAnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhtb2R1bGUpO1xuXG4gICAgICAgICAgICB3aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ11bbW9kdWxlTmFtZV1bbW9kdWxlSW5zdGFuY2VLZXldID0gbW9kdWxlO1xuICAgICAgICAgICAgcGVuZGluZy5zcGxpY2UoMCkuZm9yRWFjaCgoY2IpID0+IGNiKG1vZHVsZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG9hZFNjcmlwdCA9IChzcmMpID0+IHtcbiAgICAgICAgICAgIHNjcmlwdFRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICAgICAgc2NyaXB0VGFnLnR5cGUgPSAnbW9kdWxlJztcbiAgICAgICAgICAgIHNjcmlwdFRhZy5zcmMgPSBzcmM7XG4gICAgICAgICAgICBzY3JpcHRUYWcuYXN5bmMgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBGYWxsYmFjayB0byBDRE4gaWYgdGhlIHNjcmlwdCBmYWlscyB0byBsb2FkIChlLmcuIGNhY2hpbmcgcHJveGllcyBsaWtlIExpdGVTcGVlZFxuICAgICAgICAgICAgLy8gcmVsb2NhdGUgdGhlIHJvb3QgU0RLIGJ1dCBkb24ndCBoYXZlIHRoZSBjaHVuayBmaWxlcylcbiAgICAgICAgICAgIHNjcmlwdFRhZy5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNkbkJhc2UgPSB3aW5kb3cubXlvcD8uX19ST09UX1NES19QVUJMSUNfVVJMX18/LnNwbGl0KCcvJykuc2xpY2UoMCwgLTEpLmpvaW4oJy8nKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjaHVua0ZpbGVOYW1lID0gc3JjLnNwbGl0KCcvJykucG9wKCk7XG4gICAgICAgICAgICAgICAgaWYgKGNkbkJhc2UgJiYgIXNyYy5zdGFydHNXaXRoKGNkbkJhc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgW215b3BdIGNodW5rIGxvYWQgZmFpbGVkIGZyb20gJHtzcmN9LCByZXRyeWluZyBmcm9tIENETmApO1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5oZWFkLnJlbW92ZUNoaWxkKHNjcmlwdFRhZyk7XG4gICAgICAgICAgICAgICAgICAgIGxvYWRTY3JpcHQoYCR7Y2RuQmFzZX0vJHtjaHVua0ZpbGVOYW1lfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0VGFnKTtcbiAgICAgICAgfTtcblxuICAgICAgICBsb2FkU2NyaXB0KHNjcmlwdEZpbGVQYXRoKTtcblxuICAgICAgICAvLyBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpbmtcIik7XG4gICAgICAgIC8vIGxpbmsudHlwZSA9IFwidGV4dC9jc3NcIjtcbiAgICAgICAgLy8gbGluay5yZWwgPSBcInN0eWxlc2hlZXRcIjtcbiAgICAgICAgLy8gbGluay5ocmVmID0gZmlsZU5hbWUucmVwbGFjZSgnLmpzJywgJy5jc3MnKTtcbiAgICAgICAgLy8gZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gd2luZG93WydfX2ZlZGVyYXRpb25fXyddW21vZHVsZU5hbWVdO1xuICAgICAgICBpZiAoZW50cnlbbW9kdWxlSW5zdGFuY2VLZXldKSB7XG4gICAgICAgICAgICBvbkxvYWQoZW50cnlbbW9kdWxlSW5zdGFuY2VLZXldKTtcbiAgICAgICAgfSBlbHNlIGlmIChlbnRyeS5wZW5kaW5nKSB7XG4gICAgICAgICAgICBlbnRyeS5wZW5kaW5nLnB1c2gob25Mb2FkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBfX2ZlZGVyYXRpb25fXyBtb2R1bGUgJHttb2R1bGVOYW1lfSBhbHJlYWR5IGxvYWRlZC5gKVxuICAgICAgICAgICAgb25Mb2FkKGVudHJ5W21vZHVsZUluc3RhbmNlS2V5XSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxNQUFhLGdCQUNBLFdBQ0EsbUJBRUE7QUFKYjtBQUFBO0FB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QyxtQkFBdUM7QUFDM0QsV0FBTyxZQUFZO0FBQ2YsWUFBTSxNQUFNLE1BQU0sZUFBZTtBQUNqQyxhQUFPLE9BQU8sSUFBSSxRQUFRLGFBQWEsSUFBSSxJQUFJLElBQUk7QUFBQSxJQUN2RDtBQUFBLEVBQ0o7QUFHQSxNQUFNLFVBQVU7QUFBQSxJQUNaLFNBQVU7QUFBQSxJQUNWLGVBQWUsZUFBZSxhQUFhO0FBQUEsSUFDM0MsaUJBQWlCLGVBQWUsZUFBZTtBQUFBLElBQy9DLHVCQUF1QixlQUFlLHFCQUFxQjtBQUFBLElBQzNELGlCQUFpQixlQUFlLGVBQWU7QUFBQSxJQUMvQyxnQkFBZ0IsZUFBZSxjQUFjO0FBQUEsRUFDakQ7QUFHQSxNQUFJLENBQUMsT0FBTyxNQUFNO0FBRWQsV0FBTyxPQUFPO0FBQUEsTUFDVix5QkFBQUE7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUdBLE1BQUksQ0FBQyxPQUFPLEtBQUssU0FBUztBQUV0QixXQUFPLE9BQU87QUFBQTtBQUFBLE1BRVY7QUFBQSxPQUNHLE9BQU87QUFBQSxFQUVsQixPQUFPO0FBQ0gsWUFBUSxJQUFJLHVDQUF1QztBQUFBLEVBQ3ZEOyIsCiAgIm5hbWVzIjogWyJSZXBsYXlNZXNzYWdlS2V5IiwgIm1hdGNoIiwgInNjcmlwdElucHV0cyIsICJzY3JpcHRJbnB1dHMiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiX2EiLCAic2VlbiIsICJfYSIsICJ0YXJnZXQiLCAibWFrZVNlcmlhbGl6YWJsZSIsICJfYSIsICJoZWlnaHQiLCAid2lkdGgiLCAiX2EiLCAiX2EiLCAiX2EiLCAiX2EiLCAiZSIsICJfYSIsICJpbml0X2NvbnN0cyIsICJpbml0X2NvbnN0cyIsICJpbml0X2NvbnN0cyIsICJpbml0X2NvbnN0cyIsICJob3N0U0RLIiwgImluaXRfZXhlY3V0ZVNjcmlwdEhhbmRsZXIiLCAiaW5pdF9jb25zdHMiLCAiZWxlbWVudCIsICJpbml0X2V4ZWN1dGVTY3JpcHRIYW5kbGVyIiwgInNkayIsICJzZWVuIiwgImRvbUlkIiwgIl9hIiwgImluaXRfaGVscGVycyIsICJpbml0X2hlbHBlcnMiLCAic2tpbiIsICJfYSIsICJjb21wb25lbnQiLCAic2VnbWVudCIsICJleHBlcmllbmNlIiwgInNlbGVjdGVkU2tpbiIsICJEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIiwgImluaXRfRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciIsICJpbml0X2NvbnN0cyIsICJCaW5kT25DbGlja0hhbmRsZXIiLCAiaW5pdF9iaW5kT25DbGlja0hhbmRsZXIiLCAiQ2hhbmdlVGV4dEhhbmRsZXIiLCAiaW5pdF9jaGFuZ2VUZXh0SGFuZGxlciIsICJFeGVjdXRlU2NyaXB0SGFuZGxlciIsICJpbml0X2V4ZWN1dGVTY3JpcHRIYW5kbGVyIiwgIkFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIiwgImluaXRfYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIiLCAic2V0QXR0cmlidXRlSGFuZGxlciIsICJpbml0X3NldEF0dHJpYnV0ZUhhbmRsZXIiLCAiQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIiLCAiaW5pdF9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciIsICJpbml0X2NvbnN0cyIsICJob3N0U0RLIiwgIk11dGF0aW9uT2JzZXJ2ZXIiLCAiZ2V0SW5wdXRWYWx1ZSIsICJHZXRFbGVtZW50VmFsdWVIYW5kbGVyIiwgImluaXRfR2V0RWxlbWVudFZhbHVlSGFuZGxlciIsICJpbml0X2NvbnN0cyIsICJlbGVtZW50IiwgIlNldElubmVySHRtbEhhbmRsZXIiLCAiaW5pdF9zZXRJbm5lckh0bWxIYW5kbGVyIiwgImluaXRfRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciIsICJpbml0X2JpbmRPbkNsaWNrSGFuZGxlciIsICJpbml0X2NoYW5nZVRleHRIYW5kbGVyIiwgImluaXRfZXhlY3V0ZVNjcmlwdEhhbmRsZXIiLCAiaW5pdF9hZGRFdmVudExpc3RlbmVySGFuZGxlciIsICJpbml0X3NldEF0dHJpYnV0ZUhhbmRsZXIiLCAiaW5pdF9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciIsICJpbml0X0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIiLCAiaW5pdF9zZXRJbm5lckh0bWxIYW5kbGVyIiwgIl9hIiwgIkNoYW5nZVRleHRIYW5kbGVyIiwgIlNldElubmVySHRtbEhhbmRsZXIiLCAiQmluZE9uQ2xpY2tIYW5kbGVyIiwgIkRldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIiLCAiRXhlY3V0ZVNjcmlwdEhhbmRsZXIiLCAiQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIiLCAic2V0QXR0cmlidXRlSGFuZGxlciIsICJHZXRFbGVtZW50VmFsdWVIYW5kbGVyIiwgIkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIiwgIk15b3BNZXNzYWdlcyIsICJpbml0X015b3BNZXNzYWdlcyIsICJpbml0X2hlbHBlcnMiLCAiX2EiLCAiX19ST09UX1NES19QVUJMSUNfVVJMX18iXQp9Cg==
|